@maestro_io/maestro-web-sdk 5.1.2 → 5.2.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 (158) hide show
  1. package/dist/1.maestro-web-sdk.esm.js +1 -1
  2. package/dist/1.maestro-web-sdk.esm.js.map +1 -1
  3. package/dist/10.maestro-web-sdk.esm.js +1 -1
  4. package/dist/10.maestro-web-sdk.esm.js.map +1 -1
  5. package/dist/11.maestro-web-sdk.esm.js +1 -1
  6. package/dist/11.maestro-web-sdk.esm.js.map +1 -1
  7. package/dist/12.maestro-web-sdk.esm.js +1 -1
  8. package/dist/12.maestro-web-sdk.esm.js.map +1 -1
  9. package/dist/13.maestro-web-sdk.esm.js +1 -1
  10. package/dist/13.maestro-web-sdk.esm.js.map +1 -1
  11. package/dist/14.maestro-web-sdk.esm.js +1 -1
  12. package/dist/14.maestro-web-sdk.esm.js.map +1 -1
  13. package/dist/15.maestro-web-sdk.esm.js +1 -1
  14. package/dist/15.maestro-web-sdk.esm.js.map +1 -1
  15. package/dist/16.maestro-web-sdk.esm.js +1 -1
  16. package/dist/16.maestro-web-sdk.esm.js.map +1 -1
  17. package/dist/17.maestro-web-sdk.esm.js +1 -1
  18. package/dist/17.maestro-web-sdk.esm.js.map +1 -1
  19. package/dist/18.maestro-web-sdk.esm.js +1 -1
  20. package/dist/18.maestro-web-sdk.esm.js.map +1 -1
  21. package/dist/19.maestro-web-sdk.esm.js +1 -1
  22. package/dist/19.maestro-web-sdk.esm.js.map +1 -1
  23. package/dist/2.maestro-web-sdk.esm.js +1 -1
  24. package/dist/20.maestro-web-sdk.esm.js +1 -1
  25. package/dist/20.maestro-web-sdk.esm.js.map +1 -1
  26. package/dist/21.maestro-web-sdk.esm.js +1 -1
  27. package/dist/21.maestro-web-sdk.esm.js.map +1 -1
  28. package/dist/22.maestro-web-sdk.esm.js +1 -1
  29. package/dist/22.maestro-web-sdk.esm.js.map +1 -1
  30. package/dist/23.maestro-web-sdk.esm.js +1 -1
  31. package/dist/23.maestro-web-sdk.esm.js.map +1 -1
  32. package/dist/24.maestro-web-sdk.esm.js +1 -1
  33. package/dist/24.maestro-web-sdk.esm.js.map +1 -1
  34. package/dist/25.maestro-web-sdk.esm.js +1 -1
  35. package/dist/25.maestro-web-sdk.esm.js.map +1 -1
  36. package/dist/26.maestro-web-sdk.esm.js +1 -1
  37. package/dist/26.maestro-web-sdk.esm.js.map +1 -1
  38. package/dist/27.maestro-web-sdk.esm.js +1 -1
  39. package/dist/27.maestro-web-sdk.esm.js.map +1 -1
  40. package/dist/28.maestro-web-sdk.esm.js +1 -1
  41. package/dist/28.maestro-web-sdk.esm.js.map +1 -1
  42. package/dist/29.maestro-web-sdk.esm.js +1 -1
  43. package/dist/29.maestro-web-sdk.esm.js.map +1 -1
  44. package/dist/3.maestro-web-sdk.esm.js +1 -1
  45. package/dist/3.maestro-web-sdk.esm.js.map +1 -1
  46. package/dist/30.maestro-web-sdk.esm.js +1 -1
  47. package/dist/30.maestro-web-sdk.esm.js.map +1 -1
  48. package/dist/31.maestro-web-sdk.esm.js +1 -1
  49. package/dist/31.maestro-web-sdk.esm.js.map +1 -1
  50. package/dist/32.maestro-web-sdk.esm.js +1 -1
  51. package/dist/32.maestro-web-sdk.esm.js.map +1 -1
  52. package/dist/33.maestro-web-sdk.esm.js +1 -1
  53. package/dist/33.maestro-web-sdk.esm.js.map +1 -1
  54. package/dist/34.maestro-web-sdk.esm.js +1 -1
  55. package/dist/34.maestro-web-sdk.esm.js.map +1 -1
  56. package/dist/35.maestro-web-sdk.esm.js +1 -1
  57. package/dist/35.maestro-web-sdk.esm.js.map +1 -1
  58. package/dist/36.maestro-web-sdk.esm.js +1 -1
  59. package/dist/36.maestro-web-sdk.esm.js.map +1 -1
  60. package/dist/37.maestro-web-sdk.esm.js +1 -1
  61. package/dist/37.maestro-web-sdk.esm.js.map +1 -1
  62. package/dist/38.maestro-web-sdk.esm.js +1 -1
  63. package/dist/38.maestro-web-sdk.esm.js.map +1 -1
  64. package/dist/39.maestro-web-sdk.esm.js +2 -0
  65. package/dist/39.maestro-web-sdk.esm.js.map +1 -0
  66. package/dist/4.maestro-web-sdk.esm.js +1 -1
  67. package/dist/4.maestro-web-sdk.esm.js.map +1 -1
  68. package/dist/40.maestro-web-sdk.esm.js +2 -0
  69. package/dist/40.maestro-web-sdk.esm.js.map +1 -0
  70. package/dist/5.maestro-web-sdk.esm.js +1 -1
  71. package/dist/5.maestro-web-sdk.esm.js.map +1 -1
  72. package/dist/6.maestro-web-sdk.esm.js +1 -1
  73. package/dist/6.maestro-web-sdk.esm.js.map +1 -1
  74. package/dist/7.maestro-web-sdk.esm.js +1 -1
  75. package/dist/7.maestro-web-sdk.esm.js.map +1 -1
  76. package/dist/8.maestro-web-sdk.esm.js +1 -1
  77. package/dist/8.maestro-web-sdk.esm.js.map +1 -1
  78. package/dist/9.maestro-web-sdk.esm.js +1 -1
  79. package/dist/9.maestro-web-sdk.esm.js.map +1 -1
  80. package/dist/index.d.ts +4 -1
  81. package/dist/maestro-web-sdk.esm.js +3 -3
  82. package/dist/maestro-web-sdk.esm.js.map +1 -1
  83. package/dist/maestro-web-sdk.umd.js +3 -3
  84. package/dist/maestro-web-sdk.umd.js.map +1 -1
  85. package/dist/package.json +1 -1
  86. package/dist/src/components/atoms/SvgIcon/AddIcon.d.ts +3 -0
  87. package/dist/src/components/atoms/SvgIcon/AddIcon.js +6 -0
  88. package/dist/src/components/atoms/SvgIcon/Icon.js +2 -0
  89. package/dist/src/components/core/PanelManager/PanelManager.js +5 -3
  90. package/dist/src/components/molecules/NetworkDialog/NetworkDialog.d.ts +11 -0
  91. package/dist/src/components/molecules/NetworkDialog/NetworkDialog.js +34 -0
  92. package/dist/src/components/molecules/NetworkDialog/index.d.ts +2 -0
  93. package/dist/src/components/molecules/NetworkDialog/index.js +2 -0
  94. package/dist/src/components/molecules/NetworkError/NetworkError.d.ts +104 -0
  95. package/dist/src/components/molecules/NetworkError/NetworkError.js +26 -0
  96. package/dist/src/components/molecules/NetworkError/index.d.ts +2 -0
  97. package/dist/src/components/molecules/NetworkError/index.js +2 -0
  98. package/dist/src/components/molecules/PanelNavButton/PanelNavButton.d.ts +1 -0
  99. package/dist/src/components/molecules/PanelNavButton/PanelNavButton.js +16 -7
  100. package/dist/src/components/organisms/PanelNavigation/PanelNavigation.d.ts +1 -0
  101. package/dist/src/components/organisms/PanelNavigation/PanelNavigation.js +11 -7
  102. package/dist/src/development/MaestroEventDelegate.js +1 -0
  103. package/dist/src/helpers/site.d.ts +1 -0
  104. package/dist/src/helpers/site.js +6 -0
  105. package/dist/src/helpers/siteConfig.d.ts +1 -0
  106. package/dist/src/helpers/siteConfig.js +5 -0
  107. package/dist/src/models/IPanel.d.ts +1 -1
  108. package/dist/src/models/IPanel.js +1 -1
  109. package/dist/src/modules/espn/bets/view/BetsView.js +1 -1
  110. package/dist/src/modules/espn/components/TabLoadError/TabLoadError.d.ts +96 -0
  111. package/dist/src/modules/espn/components/TabLoadError/TabLoadError.js +14 -0
  112. package/dist/src/modules/espn/components/TabLoadError/index.d.ts +2 -0
  113. package/dist/src/modules/espn/components/TabLoadError/index.js +2 -0
  114. package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/TournamentOverflowQR.d.ts +5 -5
  115. package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/TournamentOverflowQR.js +7 -73
  116. package/dist/src/modules/espn/fantasy/services/FantasyService.js +1 -1
  117. package/dist/src/modules/espn/fantasy/view/FantasyItemView.js +1 -1
  118. package/dist/src/modules/espn/fantasy/view/FantasyView.js +1 -1
  119. package/dist/src/modules/espn/key-plays/view/KeyPlayErrorStateView.js +1 -1
  120. package/dist/src/modules/espn/shop/view/ShopView.js +1 -1
  121. package/dist/src/modules/espn/stats/view/StatsView.js +1 -1
  122. package/dist/src/modules/fox/components/TabLoadError/TabLoadError.d.ts +96 -0
  123. package/dist/src/modules/fox/components/TabLoadError/TabLoadError.js +19 -0
  124. package/dist/src/modules/fox/components/TabLoadError/index.d.ts +2 -0
  125. package/dist/src/modules/fox/components/TabLoadError/index.js +2 -0
  126. package/dist/src/modules/fox/multi-view/interfaces/IMultiViewViewModel.d.ts +3 -0
  127. package/dist/src/modules/fox/multi-view/interfaces/IMultiViewViewModel.js +1 -0
  128. package/dist/src/modules/fox/multi-view/services/MultiViewService.d.ts +99 -0
  129. package/dist/src/modules/fox/multi-view/services/MultiViewService.js +94 -0
  130. package/dist/src/modules/fox/multi-view/types.d.ts +29 -43
  131. package/dist/src/modules/fox/multi-view/types.js +79 -82
  132. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/CuratedMultiviews.d.ts +8 -0
  133. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/CuratedMultiviews.js +91 -0
  134. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/index.d.ts +2 -0
  135. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/index.js +2 -0
  136. package/dist/src/modules/fox/multi-view/view/FoxMultiView.d.ts +1 -0
  137. package/dist/src/modules/fox/multi-view/view/FoxMultiView.js +62 -2
  138. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/CustomMultiviewStreamsCard.d.ts +122 -0
  139. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/CustomMultiviewStreamsCard.js +51 -0
  140. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/index.d.ts +2 -0
  141. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/index.js +2 -0
  142. package/dist/src/modules/fox/multi-view/view/components/LayoutSelector/LayoutSelector.d.ts +1 -1
  143. package/dist/src/modules/fox/multi-view/view/components/LayoutSelector/LayoutSelector.js +11 -14
  144. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/CuratedMultiviewCard.d.ts +101 -0
  145. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/CuratedMultiviewCard.js +21 -0
  146. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/index.d.ts +2 -0
  147. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/index.js +2 -0
  148. package/dist/src/modules/fox/multi-view/view-model/MultiViewViewModel.d.ts +63 -0
  149. package/dist/src/modules/fox/multi-view/view-model/MultiViewViewModel.js +328 -0
  150. package/dist/src/modules/fox/multi-view/view-model/index.d.ts +1 -0
  151. package/dist/src/modules/fox/multi-view/view-model/index.js +1 -0
  152. package/dist/src/services/NetworkManager/NetworkManager.js +1 -1
  153. package/dist/src/services/NetworkManager/errors.d.ts +3 -1
  154. package/dist/src/services/NetworkManager/errors.js +15 -1
  155. package/dist/src/services/StaticService/StaticService.js +1 -0
  156. package/dist/src/view-models/MaestroEventViewModel.d.ts +2 -0
  157. package/dist/src/view-models/MaestroEventViewModel.js +17 -1
  158. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[9],{102:function(e,t,a){"use strict";a.d(t,"a",(function(){return i})),a.d(t,"b",(function(){return s}));const i=e=>e.toLowerCase().trim().replace(/[\s\W-]+/g,"-").replace(/^-+|-+$/g,"");function s(e){let t=0;for(let a=0;a<e.length;a++){t=(t<<5)-t+e.charCodeAt(a),t&=t}return t}},118:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));const i=(e,t,a)=>{try{const i=new URL(e);return i.searchParams.set("w",t.toString()),i.searchParams.set("h",a.toString()),i.toString()}catch(t){return console.warn("Malformed URL:",e,t),e}}},237:function(e,t,a){"use strict";a.r(t),a.d(t,"StatsViewModel",(function(){return f}));var i=a(3),s=a(33);const o={entities:{teams:{9:{id:"9",uid:"s:40~l:59~t:9",slug:"new-york-liberty",location:"New York",name:"Liberty",abbreviation:"NY",displayName:"New York Liberty",shortDisplayName:"Liberty",color:"86cebc",alternateColor:"000000",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/ny.png",statistics:[{$key:"fieldGoalPct",value:45.8,displayValue:"45.8",displayName:"Field Goal %"},{$key:"threePointFieldGoalPct",value:34.7,displayValue:"34.7",displayName:"Three Point %"}],homeAway:"away",record:"11-4",displayOrder:1},11:{id:"11",uid:"s:40~l:59~t:11",slug:"phoenix-mercury",location:"Phoenix",name:"Mercury",abbreviation:"PHX",displayName:"Phoenix Mercury",shortDisplayName:"Mercury",color:"3c286e",alternateColor:"e56020",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/phx.png",statistics:[{$key:"fieldGoalPct",value:43.1,displayValue:"43.1",displayName:"Field Goal %"},{$key:"threePointFieldGoalPct",value:34.8,displayValue:"34.8",displayName:"Three Point %"}],homeAway:"home",record:"12-4",displayOrder:2},14:{id:"14",uid:"s:40~l:59~t:14",abbreviation:"SEA",displayName:"Seattle Storm",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/sea.png"},17:{id:"17",uid:"s:40~l:59~t:17",abbreviation:"LV",displayName:"Las Vegas Aces",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/lv.png"},18:{id:"18",uid:"s:40~l:59~t:18",abbreviation:"CONN",displayName:"Connecticut Sun",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/conn.png"},19:{id:"19",uid:"s:40~l:59~t:19",abbreviation:"CHI",displayName:"Chicago Sky",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/chi.png"},20:{id:"20",uid:"s:40~l:59~t:20",abbreviation:"ATL",displayName:"Atlanta Dream",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/atl.png"},129689:{id:"129689",uid:"s:40~l:59~t:129689",abbreviation:"GS",displayName:"Golden State Valkyries",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/gs.png"},130:{id:"121245",uid:"s:20~l:28~t:12",abbreviation:"KC",displayName:"Kansas City Chiefs",shortDisplayName:"Kansas City",color:"e31837",alternateColor:"ffcb05",logo:"https://a.espncdn.com/i/teamlogos/nfl/500/kc.png",homeAway:"home"},164:{id:"11232",uid:"s:20~l:28~t:12",abbreviation:"KC",displayName:"Kansas City Chiefs",shortDisplayName:"Kansas City",color:"e31837",alternateColor:"ffcb05",logo:"https://a.espncdn.com/i/teamlogos/nfl/500/kc.png",homeAway:"away"}},athletes:{2529137:{id:"2529137",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},4700818:{id:"2529137",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},4837356:{id:"2529137156425",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},5037871:{id:"252913653447",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},4873138:{id:"25275349137",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},2529140:{id:"2529147630",uid:"s:40~l:59~a:2529140",guid:"908608e9-31d4-62f2-dfe2-9fee9024e7e2",displayName:"Alyssa Thomas",shortName:"A. Thomas",jersey:"25",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529140.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529140/alyssa-thomas",text:"Player Card"}],position:{abbreviation:"F"}},2998928:{id:"29989212758",uid:"s:40~l:59~a:2998928",guid:"4d83d500-2f40-c89e-4f85-62927c5abbeb",displayName:"Breanna Stewart",shortName:"B. Stewart",jersey:"30",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2998928.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2998928/breanna-stewart",text:"Player Card"}],position:{abbreviation:"F"}},2999101:{id:"2999112756501",uid:"s:40~l:59~a:2999101",guid:"d5154a93-4a46-71af-8b55-f69328b84b54",displayName:"Jonquel Jones",shortName:"J. Jones",jersey:"35",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2999101.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2999101/jonquel-jones",text:"Player Card"}],position:{abbreviation:"C"}},4281929:{id:"428191234729",uid:"s:40~l:59~a:4281929",guid:"d4c403bb-a2c8-ed6b-aeaa-c290d8afea9b",displayName:"Satou Sabally",shortName:"S. Sabally",jersey:"0",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/4281929.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/4281929/satou-sabally",text:"Player Card"}],position:{abbreviation:"F"}}}},leaders:[{displayName:"Points",name:"pointsPerGame",home:{team:{$key:"11"},athlete:{$key:"4281929",statistics:[{displayValue:"19.1",abbreviation:"PTS"},{displayValue:"39.3",abbreviation:"FG%"},{displayValue:"81.9",abbreviation:"FT%"}]}},away:{team:{$key:"9"},athlete:{$key:"2998928",statistics:[{displayValue:"20.7",abbreviation:"PTS"},{displayValue:"52.0",abbreviation:"FG%"},{displayValue:"81.6",abbreviation:"FT%"}]}}},{displayName:"Assists",name:"assistsPerGame",home:{team:{$key:"11"},athlete:{$key:"2529140",statistics:[{displayValue:"9.3",abbreviation:"AST"},{displayValue:"3.2",abbreviation:"TO"},{displayValue:"30.3",abbreviation:"MIN"}]}},away:{team:{$key:"9"},athlete:{$key:"2529137",statistics:[{displayValue:"6.5",abbreviation:"AST"},{displayValue:"2.1",abbreviation:"TO"},{displayValue:"28.3",abbreviation:"MIN"}]}}},{displayName:"Rebounds",name:"reboundsPerGame",home:{team:{$key:"11"},athlete:{$key:"4281929",statistics:[{displayValue:"8.0",abbreviation:"REB"},{displayValue:"6.5",abbreviation:"DR"},{displayValue:"1.5",abbreviation:"OR"}]}},away:{team:{$key:"9"},athlete:{$key:"2999101",statistics:[{displayValue:"9.6",abbreviation:"REB"},{displayValue:"7.7",abbreviation:"DR"},{displayValue:"1.9",abbreviation:"OR"}]}}}],header:{teams:[{$key:"11",linescores:[{displayValue:"28"},{displayValue:"33"},{displayValue:"27"},{displayValue:"18"},{displayValue:"106"}]},{$key:"9",linescores:[{displayValue:"19"},{displayValue:"24"},{displayValue:"27"},{displayValue:"21"},{displayValue:"91"}]}],linescoresHeader:["1","2","3","4","T"]},predictor:{header:"Matchup Predictor",imageUrl:"https://platform.espnqa.com/lrd/matchuppredictor/401736212",homeTeam:{team:{$key:"11"},gameProjection:"31.8"},awayTeam:{team:{$key:"9"},gameProjection:"68.2"}},winProbability:{imageUrl:"https://platform.espnqa.com/lrd/winprobability/401736212/401736212576",homeTeam:{team:{$key:"11"},winPercentage:"100"},awayTeam:{team:{$key:"9"},winPercentage:"0"}},previousGames:[{displayOrder:2,team:{$key:"11"},events:[{team:{$key:"17",homeAway:"home"},score:"76-70",gameResult:"W"},{team:{$key:"18",homeAway:"home"},score:"83-75",gameResult:"W"},{team:{$key:"9",homeAway:"home"},score:"89-81",gameResult:"W"},{team:{$key:"19",homeAway:"home"},score:"107-86",gameResult:"W"},{team:{$key:"9",homeAway:"away"},score:"106-91",gameResult:"W"}]},{displayOrder:1,team:{$key:"9"},events:[{team:{$key:"20",homeAway:"away"},score:"86-81",gameResult:"W"},{team:{$key:"11",homeAway:"away"},score:"89-81",gameResult:"L"},{team:{$key:"14",homeAway:"home"},score:"89-79",gameResult:"L"},{team:{$key:"129689",homeAway:"home"},score:"81-78",gameResult:"W"},{team:{$key:"11",homeAway:"home"},score:"106-91",gameResult:"L"}]}],gameState:"in",promotion:{title:"Serving Sports Fans. Anytime.",description:"Open the ESPN app on a mobile device to checkout more stats!",logo:"https://www.espn.com/redesign/assets/img/ictv/logo_qr/1x/logo_qr_espn.png",qrCode:"https://stitcher.espn.com/qr-code/.png?url=sportscenter%3A%2F%2Fx-callback-url%2FshowGame%3FsportName%3Dbasketball%26leagueAbbrev%3Dwnba%26gameId%3D401736212&width=200&height=200",backgroundImage:"https://www.espn.com/redesign/assets/img/ictv/bkg_qr_espn.jpg"},activeAthletes:{displayText:"Active Athletes",teams:[{team:{$key:"130"},athletes:[{$key:"4700818",statLine:"16.6 PTS, 5.2 REB"},{$key:"4837356",statLine:"4.1 AST, 2.2 TO"}]},{team:{$key:"164"},athletes:[{$key:"5037871",statLine:"19.4 PTS, 4.0 AST"},{$key:"4873138",statLine:"7.2 REB, 2.1 OR"}]}]},drives:[{id:"drive-1",team:{$key:"9"},description:"4 PLAYS, 41 YARDS, 2:15",plays:[{id:"play-1",clock:{displayValue:"8:21"},period:{number:1},type:{text:"Shotgun"},text:"I.Pacheco left tackle to PHI 20 for 24 yards (M.Epps).",start:{downDistanceText:"2nd & 5 at PHI 44"}},{id:"play-2",clock:{displayValue:"9:33"},period:{number:1},type:{text:"Shotgun"},text:"P.Mahomes pass short middle to T.Kelce to KC 48 for 20 yards (T.Edwards).",start:{downDistanceText:"1st & 10 @ KC 25"}},{id:"play-3",clock:{displayValue:"10:09"},period:{number:1},type:{text:"Shotgun"},text:"I.Pacheco up the middle to KC 28 for 3 yards (J.Hargrave).",start:{downDistanceText:"1st & 10 @ KC 25"}},{id:"play-4",clock:{displayValue:"11:15"},period:{number:1},type:{text:"Shotgun"},text:"P.Mahomes pass complete short right to T.Kelce to KC 35 for 10 yards (J.Bradberry).",start:{downDistanceText:"2nd & 10 at KC 25"}}]}],meta:{gp_topic:"gp-basketball-wnba-401736212",picker_topic:"picker-basketball-wnba",gameState:"in"}},l=e=>e&&"object"==typeof e&&"$key"in e&&"value"in e&&"displayValue"in e&&"displayName"in e,r=e=>Array.isArray(e)&&e.every(e=>(e=>e&&"object"==typeof e&&"stats"in e&&Array.isArray(e.stats))(e));var n=a(34),d=a(8),c=a(4);function u(e,t,a){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var m=class{constructor(e){u(this,"networkManager",void 0),u(this,"overrideUrl",null),this.networkManager=new n.b({externalBaseURL:e.getStatsAPIBaseURL()})}async getStatsByUrl(e){return this.networkManager.externalApiRequest({endpoint:this.getSyncEndpoint(e),method:n.a.GET,params:{},headers:{}})}pollStatsByUrl(e,t,a,i){return this.networkManager.pollExternalApiRequest({endpoint:this.getSyncEndpoint(e),interval:t,method:n.a.GET,params:{},headers:{},onData:a,onError:i})}getSyncEndpoint(e){if(this.overrideUrl)return console.log("[StatsService] Using overrideUrl:",this.overrideUrl),this.overrideUrl;const{leagueId:t,mainId:a}=this.getIdsFromPageConfig();return`/${t}/${a}/en/us/${this.formatTimeCodeForAPI(e)}`}getIdsFromPageConfig(){const e=d.default.getPageConfig();if(!e)throw new Error("Page config is null or undefined");const t=e.page.metadata,a=null==t?void 0:t.external_field_1,i=null==t?void 0:t.external_field_5;if(!a||!i){const e=Object.keys(t||{}).join(", ");throw new Error("Missing eventId or leagueId in page config metadata. Cannot build sync URL. Required fields: external_field_1 (eventId), external_field_5 (leagueId). Available fields: "+e)}const{leagueId:s,fauxcastId:o}=this.parseLeagueData(i),l=o||a;if(!l.trim()||!s.trim())throw new Error("MainId or leagueId is empty string in page config metadata");return{eventId:a,leagueId:s,mainId:l}}parseLeagueData(e){try{const t=JSON.parse(e);if(!t.leagueId)throw new Error("leagueId not found in parsed JSON");return{leagueId:t.leagueId,fauxcastId:t.fauxcastId}}catch(t){const a=new Error("Failed to parse leagueId from external_field_5. Raw value: "+e);throw Object(c.a)(a,{rawValue:e,parseError:t}),a}}formatTimeCodeForAPI(e){if(!e||0===e)return"latest";if("number"!=typeof e||isNaN(e)||!isFinite(e))return console.warn('Invalid timecode provided, using "latest":',e),"latest";try{const t=new Date(e);if(isNaN(t.getTime()))return console.warn('Invalid date from timecode, using "latest":',e),"latest";const a=Date.now();if(a-e<0)return"latest";return t.toISOString().replace(/\.\d{3}Z$/,"Z")}catch(t){return Object(c.a)(t,{timeCode:e}),console.warn('Error formatting timecode, using "latest":',e,t),"latest"}}};const h=e=>{var t,a;if(!e)return{plays:"0",yards:"0",time:""};const i=e.split(", ");return{plays:(null===(t=i[0])||void 0===t?void 0:t.split(" ")[0])||"0",yards:(null===(a=i[1])||void 0===a?void 0:a.split(" ")[0])||"0",time:i[2]||""}},p=e=>{var t;if(null==e||null===(t=e.period)||void 0===t||!t.number)return"";const a=(e=>{const t=e%100;if(t>=11&&t<=13)return"th";switch(e%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}})(e.period.number);return`(${e.clock.displayValue} - ${e.period.number}${a}) (${e.type.text}) ${e.text}`};var y=a(118),v=a(102);function g(e,t,a){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const b={activeAthletes:"activeAthletes",driveSummary:"drives",gameLeaders:"leaders",headerTeam:"header",matchPredictor:"predictor",playerSeasonStats:"playerStats",promotion:"promotion",recentGames:"previousGames",scoringSummary:"scoringSummary",teamStats:"entities",winProbability:"winProbability",careerMatchup:"careerMatchup",penalties:"penaltySummary"};class f extends s.a{constructor(e,t,a,s={}){super(),g(this,"isDataLoading",new i.a(!0)),g(this,"hasEverSuccessfullyLoaded",new i.a(!1)),g(this,"eventId",void 0),g(this,"statsItems",new i.a([])),g(this,"errorState",new i.a("none")),g(this,"currentGameState",new i.a("")),g(this,"statsService",void 0),g(this,"analyticsService",void 0),g(this,"useMockData",!1),g(this,"lastResponseHash",null),g(this,"currentPlayerTimeCode",null),g(this,"timecodePollingTask",null),g(this,"smartPollingTimeout",null),g(this,"timecodePollingState",{isActive:!1,currentUrl:null,lastUpdateTime:0}),g(this,"onEngage",e=>{this.analyticsService.panelClick({type:"espnStats",name:"stats_item_clicked",metadata:{card:[b[e]],game_state:[this.currentGameState.value]}})}),this.eventId=e,this.useMockData=s.useMockData||!1,this.statsService=new m(t),this.analyticsService=a}setDataToPanel(e){if("overrideUrl"in e){const t=e.overrideUrl;"string"==typeof t&&t.length>0&&(console.log("[StatsViewModel] Setting overrideUrl:",t),this.statsService.overrideUrl=t)}}async init(){if(this.useMockData)await this.fetchMockData();else{const e=this.getCurrentTimeCode();this.onUpdatePlayerTimeCode(e),this.analyticsService.panelView("espnStats")}}getCurrentTimeCode(){try{const e=d.default.getMaestroEventViewModel();if(e&&"function"==typeof e.getPlayerTimeCode)return e.getPlayerTimeCode()}catch(e){Object(c.a)(e,{context:"StatsViewModel.getCurrentTimeCode"}),console.warn("Could not get current timecode from MaestroEventViewModel:",e)}return null}cleanup(){this.stopTimecodePolling(),this.clearSmartPollingTimeout(),this.resetTimecodePollingState()}onUpdatePlayerTimeCode(e){if(this.currentPlayerTimeCode=e,!this.useMockData)try{this.performSmartPolling(e)}catch(e){Object(c.a)(e,{context:"StatsViewModel.onUpdatePlayerTimeCode"}),console.error("Error handling player timecode update:",e),this.handleTimecodeError("Error handling player timecode update",e)}}clearTabLoadFailure(){this.errorState.value="none";const e=this.getCurrentTimeCode();this.onUpdatePlayerTimeCode(e)}async performSmartPolling(e){this.clearSmartPollingTimeout(),this.stopTimecodePolling();try{const t=await this.statsService.getStatsByUrl(e);if(!t)throw new Error("API returned undefined or null response");this.processPolledData(t),this.smartPollingTimeout=window.setTimeout(()=>{this.startTimecodePolling(e),this.smartPollingTimeout=null},1e3)}catch(t){Object(c.a)(t,{context:"StatsViewModel.performSmartPolling"}),console.error("Error during smart polling immediate call:",t),this.handleTimecodeError("Error during smart polling immediate call",t),this.stopTimecodePolling(),this.startTimecodePolling(e)}}handleTimecodeError(e,t){var a;const i={context:e,errorType:(null==t||null===(a=t.constructor)||void 0===a?void 0:a.name)||"Unknown",errorMessage:t instanceof Error?t.message:String(t),timestamp:(new Date).toISOString(),currentTimecode:this.currentPlayerTimeCode,hasExistingData:this.statsItems.value.length>0,lastResponseHash:this.lastResponseHash,url:this.timecodePollingState.currentUrl};console.error(e+":",i),this.hasEverSuccessfullyLoaded.value||(this.errorState.value="tabLoadFailure")}clearSmartPollingTimeout(){this.smartPollingTimeout&&(clearTimeout(this.smartPollingTimeout),this.smartPollingTimeout=null)}resetTimecodePollingState(){this.timecodePollingState={isActive:!1,currentUrl:null,lastUpdateTime:0}}startTimecodePolling(e){this.stopTimecodePolling();try{this.timecodePollingTask=this.statsService.pollStatsByUrl(e,1e4,e=>{this.processPolledData(e)},e=>{console.error("Timecode polling error:",e),this.handleTimecodeError("Timecode polling error",e)}),this.timecodePollingState.isActive=!0}catch(e){Object(c.a)(e,{context:"StatsViewModel.startTimecodePolling"}),console.error("Error setting up timecode-based Stats polling:",e),this.handleTimecodeError("Error setting up timecode-based Stats polling",e)}}stopTimecodePolling(){this.timecodePollingTask&&(this.timecodePollingTask.stop(),this.timecodePollingTask=null),this.timecodePollingState.isActive=!1}async fetchMockData(){this.processData(o),this.hasEverSuccessfullyLoaded.value=!0,this.isDataLoading.value=!1}processPolledData(e){const t=JSON.stringify(e),a=Object(v.b)(t);this.hasEverSuccessfullyLoaded.value&&a===this.lastResponseHash||(this.lastResponseHash=a,this.hasEverSuccessfullyLoaded.value=!0,this.errorState.value="none",this.processData(e),"post"===e.gameState&&this.stopTimecodePolling())}processData(e){const t=[],a=this.parseHeaderTeams(e);a&&t.push(a);const i=this.parseMatchPredictor(e);i&&t.push(i);const s=this.parseCareerMatchup(e);s&&t.push(s);const o=this.parsePlayerSeasonStats(e);o&&t.push(o);const l=this.parseScoringSummary(e);l&&t.push(l);const r=this.parseWinProbability(e);r&&t.push(r);const n=this.parseTeamSeasonStatistics(e)||this.parseTeamsStatistics(e);n&&t.push(n);const d=this.parseDriveSummary(e);d.length>0&&t.push(...d);const c=this.parsePenalties(e);c&&t.push(c);const u=this.parseActiveAthletes(e);u&&t.push(u);const m=this.parseGameLeaders(e);m&&t.push(m);const h=this.parseRecentGames(e);h&&t.push(h);const p=this.parsePromotion(e);p&&t.push(p),this.statsItems.value=t,this.currentGameState.value=e.gameState}parseDriveSummary(e){var t;const a=null===(t=e.entities)||void 0===t?void 0:t.teams,i=e.drives;if(!a||!i||0===i.length)return[];const s=[];for(const e of i){var o;if(null==e||null===(o=e.team)||void 0===o||!o.$key)continue;const t=[...e.plays||[]].reverse(),i=t[t.length-1]||null;let l="";i&&(l=p(i));const{plays:r,time:n,yards:d}=h(e.description||""),c=a[e.team.$key];c&&s.push({id:e.id,lastPlayMarquee:l,plays:t,playsQuantity:r,team:c,time:n,type:"driveSummary",yards:d})}return s}parseTeamsStatistics(e){var t;const a=null===(t=e.entities)||void 0===t?void 0:t.teams;if(!a)return null;const i=Object.values(a).find(e=>"away"===e.homeAway),s=Object.values(a).find(e=>"home"===e.homeAway);if(!i||!s)return null;if(!i.statistics||!s.statistics)return null;const o=[];for(let e=0;e<i.statistics.length;e++){const t=i.statistics[e],a=s.statistics[e];l(t)&&l(a)&&o.push({awayTeamDisplayValue:(null==t?void 0:t.displayValue)||"0",displayName:t.displayName||"",homeTeamDisplayValue:(null==a?void 0:a.displayValue)||"0",awayTeamValue:(null==t?void 0:t.value)||0,homeTeamValue:(null==a?void 0:a.value)||0})}return o.length?{type:"teamStats",title:"Team Stats",awayTeam:{logo:i.logo,displayName:i.displayName||"",color:i.color||"",abbreviation:i.abbreviation||""},homeTeam:{logo:s.logo,displayName:s.displayName||"",color:s.color||"",abbreviation:s.abbreviation||""},statistics:o}:null}parseTeamSeasonStatistics(e){var t,a,i,s,o;const l=(null===(t=e.entities)||void 0===t?void 0:t.teams)||{};if(!(Object.keys(l).length&&e.statTeams&&e.statTeams.title&&null!==(a=e.statTeams.sections)&&void 0!==a&&a.length&&null!==(i=e.statTeams.teams)&&void 0!==i&&i.length))return null;const n=null===(s=e.statTeams.teams[0])||void 0===s?void 0:s.$key,d=null===(o=e.statTeams.teams[1])||void 0===o?void 0:o.$key;if(!n||!d)return null;const c=l[n],u=l[d];if(!u||!c)return null;const m={};return e.statTeams.sections.forEach(e=>{if(e.$key&&e.title){const i=[];if(r(u.statistics)&&r(c.statistics)){var t,a;const s=u.statistics.find(t=>t.$key===e.$key),o=c.statistics.find(t=>t.$key===e.$key);if(s&&o&&null!==(t=o.stats)&&void 0!==t&&t.length&&null!==(a=s.stats)&&void 0!==a&&a.length){for(let e=0;e<o.stats.length;e++){const t=o.stats[e],a=s.stats[e];i.push({awayTeamDisplayValue:(null==t?void 0:t.displayValue)||"0",displayName:t.displayName||"",homeTeamDisplayValue:(null==a?void 0:a.displayValue)||"0",awayTeamValue:null!=t&&t.displayValue?Number(t.displayValue):0,homeTeamValue:null!=a&&a.displayValue?Number(a.displayValue):0})}m[e.$key]={title:e.title,entries:i}}}}}),{type:"teamStats",title:e.statTeams.title,awayTeam:{abbreviation:c.abbreviation,displayName:c.displayName||"",color:c.color||"",logo:c.logo},homeTeam:{abbreviation:u.abbreviation,displayName:u.displayName||"",color:u.color||"",logo:u.logo},tabbedStatistics:m}}parseMatchPredictor(e){var t;const a=null===(t=e.entities)||void 0===t?void 0:t.teams,i=e.predictor;if(!(a&&i&&i.homeTeam&&i.awayTeam))return null;const s=a[i.homeTeam.team.$key],o=a[i.awayTeam.team.$key];if(!s||!o)return null;const l=parseFloat(i.homeTeam.gameProjection),r=parseFloat(i.awayTeam.gameProjection);return{type:"matchPredictor",header:i.header,imageUrl:i.imageUrl,awayTeam:{percentage:r,abbreviation:o.abbreviation,logo:o.logo,displayName:o.displayName||""},homeTeam:{percentage:l,abbreviation:s.abbreviation,logo:s.logo,displayName:s.displayName||""}}}parsePromotion(e){const t=e.promotion;return t?{type:"promotion",title:t.title||"",description:t.description||"",logo:t.logo||"",qrCode:t.qrCode||"",backgroundImage:t.backgroundImage||""}:null}parseCareerMatchup(e){var t;const a=e.careerMatchup,i=null===(t=e.entities)||void 0===t?void 0:t.athletes;if(!a||!a.sections)return null;const s=e=>{if("string"==typeof e)return e;if(e&&"object"==typeof e){const t=e.displayName;if("string"==typeof t)return t}return""},o=a.sections.filter(e=>!!e).map(e=>({items:(e.items||[]).filter(e=>!!e).map(e=>{var t;const a=null===(t=e.athlete)||void 0===t?void 0:t.$key,o=i&&a?i[a]:void 0,l=s(e.status),r="On Deck"===l;return{status:l,type:s(e.type)||"",displayName:s(e.displayName)||"",athlete:o,isHighlighted:r}}),statistics:(e.statistics||[]).filter(e=>!!e).map(e=>({abbreviation:e.abbreviation||"",displayValue:e.displayValue||""}))}));return{type:"careerMatchup",title:a.title||"",sections:o}}parseHeaderTeams(e){return this.parseHeaderTeamsFromTeamHeader(e)||this.parseHeaderTeamsFromHeader(e)}parseHeaderTeamsFromHeader(e){var t,a;const i=(null===(t=e.header)||void 0===t?void 0:t.teams)||[];return 0===i.length?null:this.buildHeaderTeamsItem({response:e,headerTeams:i,linescoresHeader:(null===(a=e.header)||void 0===a?void 0:a.linescoresHeader)||[],linescoresRowHeader:void 0,isLiveFromHeaderSource:!1})}parseHeaderTeamsFromTeamHeader(e){var t,a,i,s,o,l,r,n;const d=(null===(t=e.header)||void 0===t?void 0:t.teams)||[],c=(null===(a=e.teamHeader)||void 0===a?void 0:a.teams)||[];if(0===c.length)return null;const u=c.some(e=>Array.isArray(e.linescores)&&e.linescores.length>0),m=((null===(i=e.teamHeader)||void 0===i||null===(s=i.linescoresHeader)||void 0===s?void 0:s.length)||0)>0;if(!u&&!m&&d.length>0)return null;const h="teamLogo"===(null===(o=e.teamHeader)||void 0===o||null===(l=o.style)||void 0===l||null===(r=l.linescores)||void 0===r?void 0:r.rowHeader)?"teamLogo":void 0;return this.buildHeaderTeamsItem({response:e,headerTeams:c,linescoresHeader:(null===(n=e.teamHeader)||void 0===n?void 0:n.linescoresHeader)||[],linescoresRowHeader:h,isLiveFromHeaderSource:u||m})}buildHeaderTeamsItem(e){var t;const{response:a,headerTeams:i,linescoresHeader:s,linescoresRowHeader:o,isLiveFromHeaderSource:r}=e,n=null===(t=a.entities)||void 0===t?void 0:t.teams;if(!n||0===i.length)return null;const d=i.find(e=>{const t=n[e.$key];return t&&"home"===t.homeAway}),c=i.find(e=>{const t=n[e.$key];return t&&"away"===t.homeAway}),u=i[0],m=i[1],h=d||m,p=c||u;if(!h||!p)return null;const y=n[h.$key],v=n[p.$key];if(!y||!v)return null;const g=[],b=new Set,f=v.statistics||[],w=y.statistics||[],k=f.filter(l),T=w.filter(l);[...k,...T].forEach(e=>{b.add(e.$key)}),b.forEach(e=>{const t=k.find(t=>t.$key===e),a=T.find(t=>t.$key===e);t&&a&&g.push({displayName:(null==t?void 0:t.displayName)||(null==a?void 0:a.displayName)||"",awayTeamValue:(null==t?void 0:t.value)||0,homeTeamValue:(null==a?void 0:a.value)||0,awayTeamDisplayValue:(null==t?void 0:t.displayValue)||"0",homeTeamDisplayValue:(null==a?void 0:a.displayValue)||"0"})});const S=e=>e.linescores&&e.linescores.length>0?e.linescores.map(e=>e.displayValue):"string"==typeof e.score&&e.score.length>0?[e.score]:[],P=e=>{if(Array.isArray(e.details)&&e.details.filter(Boolean).length>0)return e.details.filter(Boolean)},N=P(p),$=P(h);let A=s,V=S(p),C=S(h);if(A.length>0&&(V.length>0||C.length>0)&&"teamLogo"===o){const e=A.slice(-3);if((e.includes("R")||e.includes("H")||e.includes("E"))&&A.length>12){const e=3,t=A.length-e,a=9;if(t>a){const e=t-a;A=A.slice(e),V=V.slice(e),C=C.slice(e)}}}return{type:"headerTeam",linescoresHeader:A,linescoresRowHeader:o,isLive:"in"===a.gameState||"post"===a.gameState||r,statistics:g,awayTeam:{abbreviation:v.abbreviation,color:v.color,id:v.id,linescores:V,logo:v.logo,name:v.name,record:v.record,...N?{details:N}:{}},homeTeam:{abbreviation:y.abbreviation,color:y.color,id:y.id,linescores:C,logo:y.logo,name:y.name,record:y.record,...$?{details:$}:{}}}}parseRecentGames(e){var t,a,i;const s=null===(t=e.entities)||void 0===t?void 0:t.teams,o=e.previousGames;if(!s||!o||0===o.length)return null;const l=o.find(e=>1===(null==e?void 0:e.displayOrder)),r=o.find(e=>2===(null==e?void 0:e.displayOrder));if(!l||!r)return null;if(!l.events||!r.events)return null;if(null===(a=l.team)||void 0===a||!a.$key||null===(i=r.team)||void 0===i||!i.$key)return null;const n=s[l.team.$key],d=s[r.team.$key];if(!n||!d)return null;return{type:"recentGames",awayTeam:{events:[...l.events].reverse().filter(e=>{var t;return null==e||null===(t=e.team)||void 0===t?void 0:t.$key}).map(e=>{const t=s[e.team.$key];return{gameResult:e.gameResult,homeAway:e.team.homeAway,score:e.score,teamLogo:null==t?void 0:t.logo}}),logo:n.logo,name:n.shortDisplayName},homeTeam:{events:[...r.events].reverse().filter(e=>{var t;return null==e||null===(t=e.team)||void 0===t?void 0:t.$key}).map(e=>{const t=s[e.team.$key];return{gameResult:e.gameResult,homeAway:e.team.homeAway,score:e.score,teamLogo:null==t?void 0:t.logo}}),logo:d.logo,name:d.shortDisplayName}}}parseWinProbability(e){var t;const a=e.winProbability;if(!a||!a.homeTeam||!a.awayTeam)return null;const i=null===(t=e.entities)||void 0===t?void 0:t.teams;if(!i)return null;const s=i[a.homeTeam.team.$key],o=i[a.awayTeam.team.$key];return s&&o?{type:"winProbability",chartImageUrl:a.imageUrl,awayTeam:{id:o.id,abbreviation:o.abbreviation,logo:o.logo,winPercentage:a.awayTeam.winPercentage},homeTeam:{id:s.id,abbreviation:s.abbreviation,logo:s.logo,winPercentage:a.homeTeam.winPercentage}}:null}parseGameLeaders(e){var t,a;if(null===(t=e.entities)||void 0===t||!t.athletes||null===(a=e.entities)||void 0===a||!a.teams)return null;const i=e.leaders,s="pre"===e.gameState;if(!i||0===i.length)return null;const o=[];for(const t of i){var l,r,n,d,c,u;if(!t.away||!t.home)continue;if(null===(l=t.away)||void 0===l||null===(r=l.athlete)||void 0===r||!r.$key||null===(n=t.home)||void 0===n||null===(d=n.athlete)||void 0===d||!d.$key)continue;const a=e.entities.athletes[t.away.athlete.$key],i=e.entities.athletes[t.home.athlete.$key];if(!a||!i)continue;const s=t.away.athlete.statistics||[],m=t.home.athlete.statistics||[],h={displayName:t.displayName,awayAthlete:{id:a.id,displayName:a.displayName,headshot:a.headshot?Object(y.a)(a.headshot,256,144):"",position:(null===(c=a.position)||void 0===c?void 0:c.abbreviation)||"-",shortName:a.shortName,jersey:a.jersey,statistics:s},homeAthlete:{id:i.id,displayName:i.displayName,headshot:i.headshot?Object(y.a)(i.headshot,256,144):"",position:(null===(u=i.position)||void 0===u?void 0:u.abbreviation)||"-",shortName:i.shortName,jersey:i.jersey,statistics:m}};o.push(h)}return o.length?{type:"gameLeaders",items:o,displayText:s?"Season Leaders":"Game Leaders"}:null}parseActiveAthletes(e){var t;const a=e.activeAthletes,{awayTeam:i,homeTeam:s}=this.getActiveAthletesTeamInfo(e),o=[];if(null===(t=e.entities)||void 0===t||!t.athletes||!a||-1===i.index||-1===s.index)return null;for(let t=0;t<a.teams[i.index].athletes.length;t++){var l,r;const n=a.teams[i.index].athletes[t],d=a.teams[s.index].athletes[t];if(null==n||!n.$key||null==d||!d.$key)continue;const c=e.entities.athletes[n.$key],u=e.entities.athletes[d.$key];if(!c||!u)continue;const m=[],h=[],p=n.statLine||"",v=d.statLine||"";p.trim().split(",").forEach((e,t)=>{const[a,i]=e.trim().split(" "),s=v.trim().split(",")[t];if(!s)return;const[o,l]=s.trim().split(" ");m.push({displayValue:a||"0",abbreviation:i||"-",value:parseFloat(a)||0}),h.push({displayValue:o||"0",abbreviation:l||"-",value:parseFloat(o)||0})}),o.push({awayAthlete:{id:c.id,displayName:c.displayName,headshot:c.headshot?Object(y.a)(c.headshot,256,144):"",position:(null===(l=c.position)||void 0===l?void 0:l.abbreviation)||"-",shortName:c.shortName,jersey:c.jersey,statistics:m,minifiedStatistics:n.statLine},homeAthlete:{id:u.id,displayName:u.displayName,headshot:u.headshot?Object(y.a)(u.headshot,256,144):"",position:(null===(r=u.position)||void 0===r?void 0:r.abbreviation)||"-",shortName:u.shortName,jersey:u.jersey,statistics:h,minifiedStatistics:d.statLine}})}return o.length?{type:"activeAthletes",awayTeam:i,homeTeam:s,athletes:o,displayText:a.displayText}:null}getActiveAthletesTeamInfo(e){var t,a;const i=(null===(t=e.activeAthletes)||void 0===t?void 0:t.teams)||[];let s={index:-1,id:"",logo:"",name:"-"},o={index:-1,id:"",logo:"",name:"-"};const l=null===(a=e.entities)||void 0===a?void 0:a.teams;if(!l)return{awayTeam:s,homeTeam:o};for(let e=0;e<i.length;e++){const t=l[i[e].team.$key];t&&("away"===t.homeAway?s={index:e,id:t.id,logo:t.logo,name:t.name||"-"}:"home"===t.homeAway&&(o={index:e,id:t.id,logo:t.logo,name:t.name||"-"}))}return{awayTeam:s,homeTeam:o}}parseScoringSummary(e){var t,a;const i=e.scoringSummary;if(!i||!i.sections)return null;const s=null===(t=e.entities)||void 0===t?void 0:t.teams,o=null===(a=e.entities)||void 0===a?void 0:a.athletes;if((e=>e&&"object"==typeof e&&"title"in e&&"sections"in e&&e.sections&&Array.isArray(e.sections)&&e.sections.some(e=>e&&"items"in e&&Array.isArray(e.items)&&e.items.some(e=>e&&("text"in e||"shortText"in e||"header"in e))))(i)){const e=[];for(const t of i.sections){var l;if(!t.title||null===(l=t.items)||void 0===l||!l.length)continue;const a=[];for(const e of t.items){var r,n,d;if(null==e||null===(r=e.team)||void 0===r||!r.$key||null==e||null===(n=e.athlete)||void 0===n||!n.$key)continue;const t=null==s?void 0:s[e.team.$key],i=null==o?void 0:o[e.athlete.$key],l="#"+((null==i?void 0:i.jersey)||""),c=(null==i?void 0:i.shortName)||"";if(!t||!i)continue;const u=[];l&&u.push({featured:!1,title:l}),c&&u.push({featured:!0,title:c}),a.push({teamLogo:(null==t?void 0:t.logo)||"",teamName:null==t?void 0:t.abbreviation,headshot:null!=i&&i.headshot?Object(y.a)(i.headshot,200,144):void 0,athleteShortName:(null==i?void 0:i.shortName)||"",athleteJersey:(null==i?void 0:i.jersey)||"",athletePosition:(null==i||null===(d=i.position)||void 0===d?void 0:d.abbreviation)||"",text:(null==e?void 0:e.text)||"",shortText:u,header:((null==e?void 0:e.header)||[]).map((e,t)=>{var a,i;return{featured:null!==(a=e.featured)&&void 0!==a&&a,title:`${null!==(i=e.title)&&void 0!==i?i:""}${0===t?",":""}`}})})}a.length>0&&e.push({title:t.title,items:a})}return 0===e.length?null:{type:"scoringSummary",tag:"mlb",title:i.title||"Scoring Summary",sections:e}}if((e=>e&&"object"==typeof e&&"title"in e&&"sections"in e&&e.sections&&Array.isArray(e.sections)&&e.sections.every(e=>e&&"title"in e&&"items"in e&&Array.isArray(e.items)&&e.items.every(e=>e&&"clock"in e&&"title"in e&&"team"in e&&"athlete"in e)))(i)){const e=i,t=[];for(const a of e.sections||[]){const e=[];for(const t of a.items||[]){var c,u,m,h;if(null==t||null===(c=t.team)||void 0===c||!c.$key||null==t||null===(u=t.athlete)||void 0===u||!u.$key||null==t||!t.title)continue;const a=t.team&&t.team.$key?null==s?void 0:s[t.team.$key]:void 0,i=(null===(m=t.athlete)||void 0===m?void 0:m.$key)||"",l=null==o?void 0:o[i],r=t.title||"",[n,...d]=r.split(" ");let p="",v="";d.length>0&&(p=d[d.length-1],v=d.slice(0,-1).join(" "));const g=[];t.clock&&g.push({featured:!0,title:t.clock}),null!=a&&a.abbreviation&&g.push({featured:!1,title:a.abbreviation});const b=[];n&&b.push({featured:!1,title:n}),v&&b.push({featured:!0,title:v}),p&&b.push({featured:!1,title:p}),e.push({teamLogo:(null==a?void 0:a.logo)||"",teamName:(null==a?void 0:a.abbreviation)||"",header:g,text:(null==t?void 0:t.description)||"",shortText:b,headshot:null!=l&&l.headshot?Object(y.a)(l.headshot,200,144):void 0,athleteShortName:v,athletePosition:(null==l||null===(h=l.position)||void 0===h?void 0:h.abbreviation)||"",athleteJersey:n})}e.length>0&&t.push({title:(null==a?void 0:a.title)||"",items:e})}return 0===t.length?null:{type:"scoringSummary",tag:"hockey",title:e.title||"Scoring Summary",sections:t}}return null}parsePenalties(e){var t,a;const i=e.penaltySummary;if(!i||!i.sections)return null;const s=null===(t=e.entities)||void 0===t?void 0:t.teams,o=null===(a=e.entities)||void 0===a?void 0:a.athletes,l=i.sections.map(e=>{const t=e.items.filter(e=>{var t,a;return(null==e||null===(t=e.team)||void 0===t?void 0:t.$key)&&(null==e||null===(a=e.athlete)||void 0===a?void 0:a.$key)}).map(e=>{var t;const a=null==s?void 0:s[e.team.$key],i=null==o?void 0:o[e.athlete.$key],[l,...r]=e.title.split(" "),n=(null!=r?r:[]).join(" ")||"",d=[];return l&&d.push({featured:!1,title:l}),n&&d.push({featured:!0,title:n}),{teamLogo:(null==a?void 0:a.logo)||"",teamName:(null==a?void 0:a.abbreviation)||"",header:[{title:e.clock||"",featured:!1}],text:e.description||"",shortText:d,headshot:null!=i&&i.headshot?Object(y.a)(i.headshot,200,144):void 0,athleteShortName:r.join(" "),athletePosition:(null==i||null===(t=i.position)||void 0===t?void 0:t.abbreviation)||"",athleteJersey:l||""}});return{title:e.title,items:t}});return!l.length||l.every(e=>0===e.items.length)?null:{type:"penalties",tag:"penalties",title:i.title,sections:l}}parsePlayerSeasonStats(e){var t,a,i;const s=e.playerStats,o=null===(t=e.entities)||void 0===t?void 0:t.teams,l=null===(a=e.entities)||void 0===a?void 0:a.athletes;if(null==s||null===(i=s.teams)||void 0===i||!i.length||!o)return null;const r=[];for(const e of s.teams){if(!e.$key)continue;const t=o[e.$key];if(!t)continue;const a=[];for(const t of e.sections||[]){var n;if(!t.title||null===(n=t.items)||void 0===n||!n.length)continue;const e=[];for(const a of t.items){var d,c,u,m,h;if(!a.title)continue;const t=null===(d=a.athlete)||void 0===d?void 0:d.$key,i=t?null==l?void 0:l[t]:void 0,s=(null===(c=a.athlete)||void 0===c?void 0:c.statistics)||[],o=s.find(e=>e.featured);e.push({title:a.title,headshot:null!=i&&i.headshot?Object(y.a)(i.headshot,256,144):"",position:(null==i||null===(u=i.position)||void 0===u?void 0:u.abbreviation)||"",jersey:(null==i?void 0:i.jersey)||"",featuredStat:o?{displayValue:o.displayValue||"",label:o.label||""}:null,statistics:s.filter(e=>!e.featured).map(e=>({displayValue:e.displayValue||"",label:e.label||""})),playerStatus:null!=a&&a.status?{displayName:null!==(m=a.status.displayName)&&void 0!==m?m:"",type:null!==(h=a.status.type)&&void 0!==h?h:""}:null})}e.length>0&&a.push({title:t.title,items:e})}a.length>0&&r.push({teamKey:e.$key,shortDisplayName:t.shortDisplayName||t.displayName||"",color:t.color||"",sections:a})}return 0===r.length?null:{type:"playerSeasonStats",teams:r}}}t.default=f}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[9],{105:function(e,t,n){"use strict";var l=n(32);t.a=l.a},210:function(e,t,n){"use strict";var l=n(6),a=n.n(l),r=n(7),i=n.n(r)()(a.a);i.push([e.i,".hello-world-view {\n text-align: center;\n background: transparent;\n margin-top: 60px;\n}\n\n.hello-world-view[data-has-unlisted='false'] {\n padding: 191px 80px 0 80px;\n}\n\n.hello-world-view .hello-world-image {\n margin-bottom: 32px;\n}\n\n.hello-world-view .title {\n font-weight: 700;\n font-size: 48px;\n line-height: 56px;\n font-family: var(--sdk-font-headline);\n color: var(--sdk-text100);\n text-align: center;\n}\n\n.hello-world-view .subtitle {\n font-weight: 400;\n font-size: 27px;\n line-height: 36px;\n text-align: center;\n margin: 10px 0 16px 0;\n font-family: var(--sdk-font-title);\n color: var(--sdk-text100);\n}\n\n.hello-world-view .unsupported-panels {\n position: relative;\n}\n\n.hello-world-view .unsupported-text {\n font-family: var(--sdk-font-body);\n font-size: 21px;\n line-height: 26px;\n text-align: center;\n color: var(--sdk-text200);\n margin: 0;\n}\n\n.hello-world-view .unsupported-list {\n list-style: none;\n padding: 0;\n margin: 0;\n margin-top: 24px;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.hello-world-view .unsupported-list li {\n padding: 8px 0;\n color: var(--sdk-text100);\n text-align: left;\n}\n\n.hello-world-view .unsupported-list .panel-icon {\n vertical-align: middle;\n display: inline-block;\n margin-right: 8px;\n border-radius: 50%;\n background-color: var(--sdk-surface5);\n width: 40px;\n height: 40px;\n color: var(--sdk-text200);\n position: relative;\n}\n\n.hello-world-view .unsupported-list .panel-icon > svg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.hello-world-view .unsupported-list .panel-title {\n vertical-align: middle;\n display: inline-block;\n color: var(--sdk-text200);\n}\n","",{version:3,sources:["webpack://./src/modules/maestro/hello-world/HelloWorldView.styles.css"],names:[],mappings:"AAAA;EACE,kBAAkB;EAClB,uBAAuB;EACvB,gBAAgB;AAClB;;AAEA;EACE,0BAA0B;AAC5B;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,iBAAiB;EACjB,qCAAqC;EACrC,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,iBAAiB;EACjB,kBAAkB;EAClB,qBAAqB;EACrB,kCAAkC;EAClC,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,iCAAiC;EACjC,eAAe;EACf,iBAAiB;EACjB,kBAAkB;EAClB,yBAAyB;EACzB,SAAS;AACX;;AAEA;EACE,gBAAgB;EAChB,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,kBAAkB;EAClB,SAAS;EACT,2BAA2B;AAC7B;;AAEA;EACE,cAAc;EACd,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;EAClB,qCAAqC;EACrC,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,gCAAgC;AAClC;;AAEA;EACE,sBAAsB;EACtB,qBAAqB;EACrB,yBAAyB;AAC3B",sourcesContent:[".hello-world-view {\n text-align: center;\n background: transparent;\n margin-top: 60px;\n}\n\n.hello-world-view[data-has-unlisted='false'] {\n padding: 191px 80px 0 80px;\n}\n\n.hello-world-view .hello-world-image {\n margin-bottom: 32px;\n}\n\n.hello-world-view .title {\n font-weight: 700;\n font-size: 48px;\n line-height: 56px;\n font-family: var(--sdk-font-headline);\n color: var(--sdk-text100);\n text-align: center;\n}\n\n.hello-world-view .subtitle {\n font-weight: 400;\n font-size: 27px;\n line-height: 36px;\n text-align: center;\n margin: 10px 0 16px 0;\n font-family: var(--sdk-font-title);\n color: var(--sdk-text100);\n}\n\n.hello-world-view .unsupported-panels {\n position: relative;\n}\n\n.hello-world-view .unsupported-text {\n font-family: var(--sdk-font-body);\n font-size: 21px;\n line-height: 26px;\n text-align: center;\n color: var(--sdk-text200);\n margin: 0;\n}\n\n.hello-world-view .unsupported-list {\n list-style: none;\n padding: 0;\n margin: 0;\n margin-top: 24px;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.hello-world-view .unsupported-list li {\n padding: 8px 0;\n color: var(--sdk-text100);\n text-align: left;\n}\n\n.hello-world-view .unsupported-list .panel-icon {\n vertical-align: middle;\n display: inline-block;\n margin-right: 8px;\n border-radius: 50%;\n background-color: var(--sdk-surface5);\n width: 40px;\n height: 40px;\n color: var(--sdk-text200);\n position: relative;\n}\n\n.hello-world-view .unsupported-list .panel-icon > svg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.hello-world-view .unsupported-list .panel-title {\n vertical-align: middle;\n display: inline-block;\n color: var(--sdk-text200);\n}\n"],sourceRoot:""}]),t.a=i},245:function(e,t,n){"use strict";n.r(t);var l=n(0),a=n.n(l),r=n(5),i=n.n(r),o=n(210),s={insert:"head",singleton:!1},A=(i()(o.a,s),o.a.locals,n(8));var d=()=>a.a.createElement("div",{className:"hello-world-image"},a.a.createElement("svg",{width:"376",height:"236",viewBox:"0 0 376 236",fill:"none",xmlns:"http://www.w3.org/2000/svg"},a.a.createElement("path",{d:"M255.234 212.541H232.178V235.597H255.234V212.541ZM116.898 235.597H139.954V212.541H116.898V235.597ZM197.594 108.789H220.65V154.901H197.594V108.789ZM174.538 154.901H151.482V108.789H174.538V154.901ZM255.234 91.4965H243.706V79.9685H232.178V68.4404H214.886V45.3843H203.358V68.4404H168.774V45.3843H157.246V68.4404H139.954V79.9685H128.426V91.4965H116.898V131.845H93.8414V143.373H116.898V183.721H139.954V212.541H168.774V183.721H203.358V212.541H232.178V183.721H255.234V143.373H278.29V131.845H255.234V91.4965ZM278.29 131.845H289.818V68.4404H278.29V131.845ZM82.3134 131.845H93.8414V68.4404H82.3134V131.845Z",fill:"#2D2D2D"}),a.a.createElement("path",{d:"M262.396 50.3333L246.908 65.8205H262.396V80.7546H346.469V5.53113H262.396V50.3333Z",fill:"#101113",stroke:"#2D2D2D",strokeWidth:"6.63736"}),a.a.createElement("path",{d:"M278.746 57.5037V29.5141H286.311V39.9156H295.616V29.5141H303.18V57.5037H295.616V46.1944H286.311V57.5037H278.746ZM308.634 57.5037V29.5141H316.199V57.5037H308.634ZM323.408 48.1612L321.593 29.5141H331.011L329.195 48.1612H323.408ZM322.387 57.5037V51.0737H330.216V57.5037H322.387Z",fill:"#2D2D2D"}),a.a.createElement("rect",{x:"61.0623",y:"56.4176",width:"8.84982",height:"8.84982",transform:"rotate(-90 61.0623 56.4176)",fill:"#2D2D2D"}),a.a.createElement("rect",{x:"50",y:"42.0366",width:"8.84982",height:"8.84982",transform:"rotate(-90 50 42.0366)",fill:"#2D2D2D"}),a.a.createElement("rect",{x:"69.9121",y:"47.5674",width:"8.84982",height:"8.84982",transform:"rotate(-90 69.9121 47.5674)",fill:"#2D2D2D"}),a.a.createElement("g",{filter:"url(#filter0_d_193_43290)"},a.a.createElement("rect",{width:"8",height:"12",transform:"matrix(4.37114e-08 1 1 -4.37114e-08 82 67)",fill:"#21EFA3"})),a.a.createElement("rect",{x:"58.8499",y:"33.1868",width:"8.84982",height:"8.84982",transform:"rotate(-90 58.8499 33.1868)",fill:"#2D2D2D"}),a.a.createElement("rect",{x:"78.762",y:"47.5677",width:"8.84982",height:"8.84982",transform:"rotate(-90 78.762 47.5677)",fill:"#2D2D2D"}),a.a.createElement("rect",{x:"67.6997",y:"33.1868",width:"8.84982",height:"8.84982",transform:"rotate(-90 67.6997 33.1868)",fill:"#2D2D2D"}),a.a.createElement("rect",{x:"256.865",y:"8.84982",width:"8.84982",height:"8.84982",transform:"rotate(-90 256.865 8.84982)",fill:"#101113"}),a.a.createElement("rect",{x:"343.15",y:"8.84982",width:"8.84982",height:"8.84982",transform:"rotate(-90 343.15 8.84982)",fill:"#101113"}),a.a.createElement("rect",{x:"343.15",y:"86.2857",width:"8.84982",height:"8.84982",transform:"rotate(-90 343.15 86.2857)",fill:"#101113"}),a.a.createElement("rect",{x:"256.865",y:"86.2857",width:"8.84982",height:"8.84982",transform:"rotate(-90 256.865 86.2857)",fill:"#101113"}),a.a.createElement("defs",null,a.a.createElement("filter",{id:"filter0_d_193_43290",x:"64",y:"50",width:"48",height:"44",filterUnits:"userSpaceOnUse",colorInterpolationFilters:"sRGB"},a.a.createElement("feFlood",{floodOpacity:"0",result:"BackgroundImageFix"}),a.a.createElement("feColorMatrix",{in:"SourceAlpha",type:"matrix",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",result:"hardAlpha"}),a.a.createElement("feMorphology",{radius:"3",operator:"dilate",in:"SourceAlpha",result:"effect1_dropShadow_193_43290"}),a.a.createElement("feOffset",{dy:"1"}),a.a.createElement("feGaussianBlur",{stdDeviation:"7.5"}),a.a.createElement("feComposite",{in2:"hardAlpha",operator:"out"}),a.a.createElement("feColorMatrix",{type:"matrix",values:"0 0 0 0 0.129412 0 0 0 0 0.937255 0 0 0 0 0.639216 0 0 0 0.25 0"}),a.a.createElement("feBlend",{mode:"normal",in2:"BackgroundImageFix",result:"effect1_dropShadow_193_43290"}),a.a.createElement("feBlend",{mode:"normal",in:"SourceGraphic",in2:"effect1_dropShadow_193_43290",result:"shape"}))))),p=n(105);const c={chat:"Chat",shopifyBlockPanel:"Shopify"};class h extends l.Component{constructor(e){super(e);const t=A.default.getMaestroEventViewModel().panelManagerViewModel;this.state={unlistedPanels:t.getUnlistedPanels()}}render(){const{unlistedPanels:e}=this.state;return a.a.createElement("div",{className:"hello-world-view","data-has-unlisted":e.length>0},a.a.createElement(d,null),a.a.createElement("div",{className:"title"},"HELLO, WORLD!"),a.a.createElement("p",{className:"T20 subtitle"},"Panel component has been",a.a.createElement("br",null),"installed correctly."),e.length>0&&a.a.createElement("div",{className:"unsupported-panels"},a.a.createElement("p",{className:"T10 unsupported-text"},"However, some panels currently active on this",a.a.createElement("br",null),"channel aren't supported on this device:"),a.a.createElement("ul",{className:"unsupported-list"},e.filter(e=>e.type in c).map(e=>a.a.createElement("li",{key:e.type,className:"T10"},a.a.createElement("div",{className:"panel-icon"},a.a.createElement(p.a,{iconName:e.type,width:24,height:24})),a.a.createElement("div",{className:"panel-title"},c[e.type]))))))}}var E=h;t.default=E}}]);
2
2
  //# sourceMappingURL=9.maestro-web-sdk.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///./src/helpers/strings.ts","webpack:///./src/helpers/url.ts","webpack:///./src/modules/espn/stats/mocks.ts","webpack:///./src/modules/espn/stats/interfaces/IStats.ts","webpack:///./src/modules/espn/stats/services/StatsService.ts","webpack:///./src/modules/espn/stats/utils/driveSummaryUtils.ts","webpack:///./src/modules/espn/stats/view-model/StatsViewModel.ts"],"names":["slugify","str","toLowerCase","trim","replace","stringHashCode","hash","i","length","charCodeAt","setImageDimensions","url","width","height","urlObj","URL","searchParams","set","toString","err","console","warn","MOCK_STATS_API_PRE_GAME_RESPONSE","entities","teams","id","uid","slug","location","name","abbreviation","displayName","shortDisplayName","color","alternateColor","logo","statistics","$key","value","displayValue","homeAway","record","displayOrder","athletes","guid","shortName","jersey","headshot","links","rel","href","text","position","leaders","home","team","athlete","away","header","linescores","linescoresHeader","predictor","imageUrl","homeTeam","gameProjection","awayTeam","winProbability","winPercentage","previousGames","events","score","gameResult","gameState","promotion","title","description","qrCode","backgroundImage","activeAthletes","displayText","statLine","drives","plays","clock","period","number","type","start","downDistanceText","meta","gp_topic","picker_topic","isTeamStatistic","data","isTabbedStatisticsArray","Array","isArray","every","item","stats","isTabbedStatistics","StatsService","constructor","delegate","_defineProperty","this","networkManager","NetworkManager","externalBaseURL","getStatsAPIBaseURL","timeCode","externalApiRequest","endpoint","getSyncEndpoint","method","HttpMethod","GET","params","headers","pollStatsByUrl","interval","onData","onError","pollExternalApiRequest","overrideUrl","log","leagueId","mainId","getIdsFromPageConfig","formatTimeCodeForAPI","pageConfig","SDK","getPageConfig","Error","metadata","page","eventId","external_field_1","leagueField","external_field_5","availableFields","Object","keys","join","fauxcastId","parseLeagueData","parsed","JSON","parse","parseError","error","captureException","rawValue","isNaN","isFinite","date","Date","getTime","now","toISOString","parseDriveDescription","_parts$","_parts$2","yards","time","parts","split","formatLastPlayMarquee","lastPlay","_lastPlay$period","ordinalSuffix","lastTwoDigits","getOrdinalSuffix","STATS_ITEM_TYPE_CARD_MAP","driveSummary","gameLeaders","headerTeam","matchPredictor","playerSeasonStats","recentGames","scoringSummary","teamStats","careerMatchup","penalties","StatsViewModel","ViewModel","analyticsService","options","super","Observable","isActive","currentUrl","lastUpdateTime","panelClick","card","game_state","currentGameState","useMockData","statsService","setDataToPanel","panelData","fetchMockData","currentTimeCode","getCurrentTimeCode","onUpdatePlayerTimeCode","panelView","maestroEventViewModel","getMaestroEventViewModel","getPlayerTimeCode","context","cleanup","stopTimecodePolling","clearSmartPollingTimeout","resetTimecodePollingState","playerTimeCode","currentPlayerTimeCode","performSmartPolling","handleTimecodeError","clearTabLoadFailure","errorState","immediateStats","getStatsByUrl","processPolledData","smartPollingTimeout","window","setTimeout","startTimecodePolling","_error$constructor","errorDetails","errorType","errorMessage","message","String","timestamp","currentTimecode","hasExistingData","statsItems","lastResponseHash","timecodePollingState","hasEverSuccessfullyLoaded","clearTimeout","timecodePollingTask","stop","processData","isDataLoading","responseString","stringify","currentHash","parseHeaderTeams","push","parseMatchPredictor","parseCareerMatchup","parsePlayerSeasonStats","parseScoringSummary","parseWinProbability","parseTeamSeasonStatistics","parseTeamsStatistics","parseDriveSummary","parsePenalties","parseActiveAthletes","parseGameLeaders","parseRecentGames","parsePromotion","_data$entities","result","drive","_drive$team","reverse","lastPlayMarquee","playsQuantity","_data$entities2","values","find","awayStat","homeStat","awayTeamDisplayValue","homeTeamDisplayValue","awayTeamValue","homeTeamValue","_data$entities3","_data$statTeams$secti","_data$statTeams$teams","_data$statTeams$teams2","_data$statTeams$teams3","statTeams","sections","awayTeamKey","homeTeamKey","tabbedStatistics","forEach","section","sectionKeyStatistics","_awaySectionStats$sta","_homeSectionStats$sta","homeSectionStats","st","awaySectionStats","Number","entries","_data$entities4","homePercentage","parseFloat","awayPercentage","percentage","response","_response$entities","toText","maybeDisplayName","filter","map","items","_item$athlete","athleteKey","undefined","statusText","status","isHighlighted","stat","parseHeaderTeamsFromTeamHeader","parseHeaderTeamsFromHeader","_response$header","_response$header2","headerTeams","buildHeaderTeamsItem","linescoresRowHeader","isLiveFromHeaderSource","_response$header3","_response$teamHeader","_response$teamHeader2","_response$teamHeader3","_response$teamHeader4","_response$teamHeader5","_response$teamHeader6","_response$teamHeader7","teamHeaderTeams","teamHeader","teamHeaderHasLinescores","some","t","teamHeaderHasLinescoresHeader","style","rowHeader","_response$entities2","rawLinescoresHeader","homeTeamHeader","awayTeamHeader","fallbackAwayTeamHeader","fallbackHomeTeamHeader","resolvedHomeTeamHeader","resolvedAwayTeamHeader","statisticsSet","Set","rawAwayStats","rawHomeStats","awayStatistics","homeStatistics","add","statKey","buildLinescores","l","maybeDetails","details","Boolean","awayDetails","homeDetails","awayTeamLinescores","homeTeamLinescores","lastThreeHeaders","slice","includes","statsCount","inningsCount","maxInningsToShow","inningsToRemove","isLive","_response$entities3","_awayTeamPreviousGame","_homeTeamPreviousGame","awayTeamPreviousGame","game","homeTeamPreviousGame","event","_event$team","eventTeam","teamLogo","_event$team2","_response$entities4","chartImageUrl","_response$entities5","_response$entities6","isPre","leader","_leader$away","_leader$away$athlete","_leader$home","_leader$home$athlete","_awayAthlete$position","_homeAthlete$position","awayAthlete","homeAthlete","awayAthleteStatistics","homeAthleteStatistics","_response$entities7","getActiveAthletesTeamInfo","index","_awayAthleteInfo$posi","_homeAthleteInfo$posi","awayAthleteInfo","homeAthleteInfo","awayStatLine","homeStatLine","awayDisplayValue","awayAbbreviation","homeStats","homeDisplayValue","homeAbbreviation","minifiedStatistics","_data$activeAthletes","_data$entities5","entitiesTeams","_data$entities6","_data$entities7","isMlbScoringSummary","_section$items","_item$team","_item$athlete2","_athlete$position","athleteNumber","athleteName","textParts","featured","teamName","athleteShortName","athleteJersey","athletePosition","shortText","h","_h$featured","_h$title","tag","isHockeyScoringSummary","hockeySummary","_item$team2","_item$athlete3","_item$athlete4","_athlete$position2","atheleteKey","itemTitle","athleteNameWithAssists","athleteAssists","_data$entities8","_data$entities9","penaltySummary","_item$team3","_item$athlete5","_athlete$position3","athleteDisplayName","s","_data$entities0","_data$entities1","_playerStats$teams","playerStats","parsedTeams","playerStatsTeam","_section$items2","_item$athlete6","_item$athlete7","_athlete$position4","_item$status$displayN","_item$status$type","featuredStat","label","playerStatus","teamKey"],"mappings":"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","file":"9.maestro-web-sdk.esm.js","sourcesContent":["export const slugify = (str: string) =>\n str\n .toLowerCase()\n .trim()\n .replace(/[\\s\\W-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\nexport function stringHashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","export const setImageDimensions = (\n url: string,\n width: number,\n height: number\n) => {\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.set('w', width.toString());\n urlObj.searchParams.set('h', height.toString());\n return urlObj.toString();\n } catch (err) {\n console.warn('Malformed URL:', url, err);\n return url; // Return the original URL if it cannot be parsed\n }\n};\n","import { StatsApiResponse } from './interfaces/IStats';\n\nexport const MOCK_STATS_API_PRE_GAME_RESPONSE: StatsApiResponse = {\n entities: {\n teams: {\n '9': {\n id: '9',\n uid: 's:40~l:59~t:9',\n slug: 'new-york-liberty',\n location: 'New York',\n name: 'Liberty',\n abbreviation: 'NY',\n displayName: 'New York Liberty',\n shortDisplayName: 'Liberty',\n color: '86cebc',\n alternateColor: '000000',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/ny.png',\n statistics: [\n {\n $key: 'fieldGoalPct',\n value: 45.8,\n displayValue: '45.8',\n displayName: 'Field Goal %',\n },\n {\n $key: 'threePointFieldGoalPct',\n value: 34.7,\n displayValue: '34.7',\n displayName: 'Three Point %',\n },\n ],\n homeAway: 'away',\n record: '11-4',\n displayOrder: 1,\n },\n '11': {\n id: '11',\n uid: 's:40~l:59~t:11',\n slug: 'phoenix-mercury',\n location: 'Phoenix',\n name: 'Mercury',\n abbreviation: 'PHX',\n displayName: 'Phoenix Mercury',\n shortDisplayName: 'Mercury',\n color: '3c286e',\n alternateColor: 'e56020',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/phx.png',\n statistics: [\n {\n $key: 'fieldGoalPct',\n value: 43.1,\n displayValue: '43.1',\n displayName: 'Field Goal %',\n },\n {\n $key: 'threePointFieldGoalPct',\n value: 34.8,\n displayValue: '34.8',\n displayName: 'Three Point %',\n },\n ],\n homeAway: 'home',\n record: '12-4',\n displayOrder: 2,\n },\n '14': {\n id: '14',\n uid: 's:40~l:59~t:14',\n abbreviation: 'SEA',\n displayName: 'Seattle Storm',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/sea.png',\n },\n '17': {\n id: '17',\n uid: 's:40~l:59~t:17',\n abbreviation: 'LV',\n displayName: 'Las Vegas Aces',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/lv.png',\n },\n '18': {\n id: '18',\n uid: 's:40~l:59~t:18',\n abbreviation: 'CONN',\n displayName: 'Connecticut Sun',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/conn.png',\n },\n '19': {\n id: '19',\n uid: 's:40~l:59~t:19',\n abbreviation: 'CHI',\n displayName: 'Chicago Sky',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/chi.png',\n },\n '20': {\n id: '20',\n uid: 's:40~l:59~t:20',\n abbreviation: 'ATL',\n displayName: 'Atlanta Dream',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/atl.png',\n },\n '129689': {\n id: '129689',\n uid: 's:40~l:59~t:129689',\n abbreviation: 'GS',\n displayName: 'Golden State Valkyries',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/gs.png',\n },\n '130': {\n id: '121245',\n uid: 's:20~l:28~t:12',\n abbreviation: 'KC',\n displayName: 'Kansas City Chiefs',\n shortDisplayName: 'Kansas City',\n color: 'e31837',\n alternateColor: 'ffcb05',\n logo: 'https://a.espncdn.com/i/teamlogos/nfl/500/kc.png',\n homeAway: 'home',\n },\n '164': {\n id: '11232',\n uid: 's:20~l:28~t:12',\n abbreviation: 'KC',\n displayName: 'Kansas City Chiefs',\n shortDisplayName: 'Kansas City',\n color: 'e31837',\n alternateColor: 'ffcb05',\n logo: 'https://a.espncdn.com/i/teamlogos/nfl/500/kc.png',\n homeAway: 'away',\n },\n },\n athletes: {\n '2529137': {\n id: '2529137',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '4700818': {\n id: '2529137',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '4837356': {\n id: '2529137156425',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '5037871': {\n id: '252913653447',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '4873138': {\n id: '25275349137',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '2529140': {\n id: '2529147630',\n uid: 's:40~l:59~a:2529140',\n guid: '908608e9-31d4-62f2-dfe2-9fee9024e7e2',\n displayName: 'Alyssa Thomas',\n shortName: 'A. Thomas',\n jersey: '25',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529140.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529140/alyssa-thomas',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'F',\n },\n },\n '2998928': {\n id: '29989212758',\n uid: 's:40~l:59~a:2998928',\n guid: '4d83d500-2f40-c89e-4f85-62927c5abbeb',\n displayName: 'Breanna Stewart',\n shortName: 'B. Stewart',\n jersey: '30',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2998928.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2998928/breanna-stewart',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'F',\n },\n },\n '2999101': {\n id: '2999112756501',\n uid: 's:40~l:59~a:2999101',\n guid: 'd5154a93-4a46-71af-8b55-f69328b84b54',\n displayName: 'Jonquel Jones',\n shortName: 'J. Jones',\n jersey: '35',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2999101.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2999101/jonquel-jones',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'C',\n },\n },\n '4281929': {\n id: '428191234729',\n uid: 's:40~l:59~a:4281929',\n guid: 'd4c403bb-a2c8-ed6b-aeaa-c290d8afea9b',\n displayName: 'Satou Sabally',\n shortName: 'S. Sabally',\n jersey: '0',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/4281929.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/4281929/satou-sabally',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'F',\n },\n },\n },\n },\n leaders: [\n {\n displayName: 'Points',\n name: 'pointsPerGame',\n home: {\n team: {\n $key: '11',\n },\n athlete: {\n $key: '4281929',\n statistics: [\n {\n displayValue: '19.1',\n abbreviation: 'PTS',\n },\n {\n displayValue: '39.3',\n abbreviation: 'FG%',\n },\n {\n displayValue: '81.9',\n abbreviation: 'FT%',\n },\n ],\n },\n },\n away: {\n team: {\n $key: '9',\n },\n athlete: {\n $key: '2998928',\n statistics: [\n {\n displayValue: '20.7',\n abbreviation: 'PTS',\n },\n {\n displayValue: '52.0',\n abbreviation: 'FG%',\n },\n {\n displayValue: '81.6',\n abbreviation: 'FT%',\n },\n ],\n },\n },\n },\n {\n displayName: 'Assists',\n name: 'assistsPerGame',\n home: {\n team: {\n $key: '11',\n },\n athlete: {\n $key: '2529140',\n statistics: [\n {\n displayValue: '9.3',\n abbreviation: 'AST',\n },\n {\n displayValue: '3.2',\n abbreviation: 'TO',\n },\n {\n displayValue: '30.3',\n abbreviation: 'MIN',\n },\n ],\n },\n },\n away: {\n team: {\n $key: '9',\n },\n athlete: {\n $key: '2529137',\n statistics: [\n {\n displayValue: '6.5',\n abbreviation: 'AST',\n },\n {\n displayValue: '2.1',\n abbreviation: 'TO',\n },\n {\n displayValue: '28.3',\n abbreviation: 'MIN',\n },\n ],\n },\n },\n },\n {\n displayName: 'Rebounds',\n name: 'reboundsPerGame',\n home: {\n team: {\n $key: '11',\n },\n athlete: {\n $key: '4281929',\n statistics: [\n {\n displayValue: '8.0',\n abbreviation: 'REB',\n },\n {\n displayValue: '6.5',\n abbreviation: 'DR',\n },\n {\n displayValue: '1.5',\n abbreviation: 'OR',\n },\n ],\n },\n },\n away: {\n team: {\n $key: '9',\n },\n athlete: {\n $key: '2999101',\n statistics: [\n {\n displayValue: '9.6',\n abbreviation: 'REB',\n },\n {\n displayValue: '7.7',\n abbreviation: 'DR',\n },\n {\n displayValue: '1.9',\n abbreviation: 'OR',\n },\n ],\n },\n },\n },\n ],\n header: {\n teams: [\n {\n $key: '11',\n linescores: [\n {\n displayValue: '28',\n },\n {\n displayValue: '33',\n },\n {\n displayValue: '27',\n },\n {\n displayValue: '18',\n },\n {\n displayValue: '106',\n },\n ],\n },\n {\n $key: '9',\n linescores: [\n {\n displayValue: '19',\n },\n {\n displayValue: '24',\n },\n {\n displayValue: '27',\n },\n {\n displayValue: '21',\n },\n {\n displayValue: '91',\n },\n ],\n },\n ],\n linescoresHeader: ['1', '2', '3', '4', 'T'],\n },\n predictor: {\n header: 'Matchup Predictor',\n imageUrl: 'https://platform.espnqa.com/lrd/matchuppredictor/401736212',\n homeTeam: {\n team: {\n $key: '11',\n },\n gameProjection: '31.8',\n },\n awayTeam: {\n team: {\n $key: '9',\n },\n gameProjection: '68.2',\n },\n },\n winProbability: {\n imageUrl:\n 'https://platform.espnqa.com/lrd/winprobability/401736212/401736212576',\n homeTeam: {\n team: {\n $key: '11',\n },\n winPercentage: '100',\n },\n awayTeam: {\n team: {\n $key: '9',\n },\n winPercentage: '0',\n },\n },\n previousGames: [\n {\n displayOrder: 2,\n team: {\n $key: '11',\n },\n events: [\n {\n team: {\n $key: '17',\n homeAway: 'home',\n },\n score: '76-70',\n gameResult: 'W',\n },\n {\n team: {\n $key: '18',\n homeAway: 'home',\n },\n score: '83-75',\n gameResult: 'W',\n },\n {\n team: {\n $key: '9',\n homeAway: 'home',\n },\n score: '89-81',\n gameResult: 'W',\n },\n {\n team: {\n $key: '19',\n homeAway: 'home',\n },\n score: '107-86',\n gameResult: 'W',\n },\n {\n team: {\n $key: '9',\n homeAway: 'away',\n },\n score: '106-91',\n gameResult: 'W',\n },\n ],\n },\n {\n displayOrder: 1,\n team: {\n $key: '9',\n },\n events: [\n {\n team: {\n $key: '20',\n homeAway: 'away',\n },\n score: '86-81',\n gameResult: 'W',\n },\n {\n team: {\n $key: '11',\n homeAway: 'away',\n },\n score: '89-81',\n gameResult: 'L',\n },\n {\n team: {\n $key: '14',\n homeAway: 'home',\n },\n score: '89-79',\n gameResult: 'L',\n },\n {\n team: {\n $key: '129689',\n homeAway: 'home',\n },\n score: '81-78',\n gameResult: 'W',\n },\n {\n team: {\n $key: '11',\n homeAway: 'home',\n },\n score: '106-91',\n gameResult: 'L',\n },\n ],\n },\n ],\n gameState: 'in',\n promotion: {\n title: 'Serving Sports Fans. Anytime.',\n description: 'Open the ESPN app on a mobile device to checkout more stats!',\n logo:\n 'https://www.espn.com/redesign/assets/img/ictv/logo_qr/1x/logo_qr_espn.png',\n qrCode:\n 'https://stitcher.espn.com/qr-code/.png?url=sportscenter%3A%2F%2Fx-callback-url%2FshowGame%3FsportName%3Dbasketball%26leagueAbbrev%3Dwnba%26gameId%3D401736212&width=200&height=200',\n backgroundImage:\n 'https://www.espn.com/redesign/assets/img/ictv/bkg_qr_espn.jpg',\n },\n activeAthletes: {\n displayText: 'Active Athletes',\n teams: [\n {\n team: {\n $key: '130',\n },\n athletes: [\n {\n $key: '4700818',\n statLine: '16.6 PTS, 5.2 REB',\n },\n {\n $key: '4837356',\n statLine: '4.1 AST, 2.2 TO',\n },\n ],\n },\n {\n team: {\n $key: '164',\n },\n athletes: [\n {\n $key: '5037871',\n statLine: '19.4 PTS, 4.0 AST',\n },\n {\n $key: '4873138',\n statLine: '7.2 REB, 2.1 OR',\n },\n ],\n },\n ],\n },\n drives: [\n {\n id: 'drive-1',\n team: {\n $key: '9',\n },\n description: '4 PLAYS, 41 YARDS, 2:15',\n plays: [\n {\n id: 'play-1',\n clock: {\n displayValue: '8:21',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text: 'I.Pacheco left tackle to PHI 20 for 24 yards (M.Epps).',\n start: {\n downDistanceText: '2nd & 5 at PHI 44',\n },\n },\n {\n id: 'play-2',\n clock: {\n displayValue: '9:33',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text:\n 'P.Mahomes pass short middle to T.Kelce to KC 48 for 20 yards (T.Edwards).',\n start: {\n downDistanceText: '1st & 10 @ KC 25',\n },\n },\n {\n id: 'play-3',\n clock: {\n displayValue: '10:09',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text: 'I.Pacheco up the middle to KC 28 for 3 yards (J.Hargrave).',\n start: {\n downDistanceText: '1st & 10 @ KC 25',\n },\n },\n {\n id: 'play-4',\n clock: {\n displayValue: '11:15',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text:\n 'P.Mahomes pass complete short right to T.Kelce to KC 35 for 10 yards (J.Bradberry).',\n start: {\n downDistanceText: '2nd & 10 at KC 25',\n },\n },\n ],\n },\n ],\n meta: {\n gp_topic: 'gp-basketball-wnba-401736212',\n picker_topic: 'picker-basketball-wnba',\n gameState: 'in',\n },\n};\n","export interface TeamStatistic {\n $key: string;\n value: number;\n displayValue: string;\n displayName: string;\n}\n\nexport const isTeamStatistic = (data: any): data is TeamStatistic => {\n return (\n data &&\n typeof data === 'object' &&\n '$key' in data &&\n 'value' in data &&\n 'displayValue' in data &&\n 'displayName' in data\n );\n};\n\nexport const isTabbedStatistics = (data: any): data is TeamTabbedStatistics => {\n return (\n data &&\n typeof data === 'object' &&\n 'stats' in data &&\n Array.isArray(data.stats)\n );\n};\n\nexport const isTabbedStatisticsArray = (\n data: any\n): data is TeamTabbedStatistics[] => {\n return Array.isArray(data) && data.every((item) => isTabbedStatistics(item));\n};\n\nexport const isHockeyScoringSummary = (\n data: any\n): data is RawScoringSummary => {\n return (\n data &&\n typeof data === 'object' &&\n 'title' in data &&\n 'sections' in data &&\n data.sections &&\n Array.isArray(data.sections) &&\n data.sections.every(\n (section: any) =>\n section &&\n 'title' in section &&\n 'items' in section &&\n Array.isArray(section.items) &&\n section.items.every(\n (item: any) =>\n item &&\n 'clock' in item &&\n 'title' in item &&\n 'team' in item &&\n 'athlete' in item\n )\n )\n );\n};\n\nexport const isMlbScoringSummary = (data: any): data is RawScoringSummary => {\n return (\n data &&\n typeof data === 'object' &&\n 'title' in data &&\n 'sections' in data &&\n data.sections &&\n Array.isArray(data.sections) &&\n data.sections.some(\n (section: any) =>\n section &&\n 'items' in section &&\n Array.isArray(section.items) &&\n section.items.some(\n (item: any) =>\n item && ('text' in item || 'shortText' in item || 'header' in item)\n )\n )\n );\n};\n\nexport interface TeamTabbedStatistics {\n $key?: string;\n stats?: {\n abbreviation?: string;\n displayName?: string;\n displayValue?: string;\n name?: string;\n }[];\n}\n\nexport interface Team {\n id: string;\n uid: string;\n slug?: string;\n location?: string;\n name?: string;\n abbreviation: string;\n displayName: string;\n shortDisplayName?: string;\n color?: string;\n alternateColor?: string;\n logo?: string;\n statistics?: TeamStatistic[] | TeamTabbedStatistics[];\n homeAway?: string;\n record?: string;\n displayOrder?: number;\n}\n\ninterface AthleteLink {\n rel: string[];\n href: string;\n text: string;\n}\n\ninterface AthletePosition {\n name?: string;\n displayName?: string;\n abbreviation: string;\n}\n\nexport interface Athlete {\n id: string;\n uid: string;\n guid: string;\n displayName: string;\n shortName: string;\n jersey: string;\n headshot?: string;\n links?: AthleteLink[];\n position?: AthletePosition;\n statistics?: {\n $key: string;\n value?: number;\n displayValue: string;\n }[];\n}\n\nexport interface EntityMap<T> {\n [id: string]: T;\n}\n\nexport interface LeaderStatistic {\n displayValue: string;\n abbreviation: string;\n}\n\ninterface LeaderAthlete {\n $key: string;\n statistics?: LeaderStatistic[];\n}\n\ninterface LeaderTeam {\n team: {\n $key: string;\n };\n athlete: LeaderAthlete;\n}\n\nexport interface Leader {\n displayName: string;\n name: string;\n home?: LeaderTeam;\n away?: LeaderTeam;\n}\n\ninterface LineScore {\n displayValue: string;\n}\n\ninterface HeaderTeam {\n $key: string;\n score?: string;\n linescores?: LineScore[];\n}\n\nexport interface Header {\n teams: HeaderTeam[];\n linescoresHeader?: string[];\n}\n\ninterface TeamHeaderTeam {\n $key: string;\n details?: string[];\n linescores?: LineScore[];\n}\n\nexport interface TeamHeader {\n teams: TeamHeaderTeam[];\n linescoresHeader?: string[];\n style?: {\n linescores?: {\n rowHeader?: string;\n };\n };\n}\n\nexport interface PredictorTeam {\n team: {\n $key: string;\n };\n gameProjection: string;\n teamChanceLoss?: string;\n}\n\nexport interface Predictor {\n header: string;\n imageUrl: string;\n homeTeam: PredictorTeam;\n awayTeam: PredictorTeam;\n}\n\nexport interface WinProbabilityTeam {\n team: {\n $key: string;\n };\n winPercentage: string;\n}\n\nexport interface WinProbability {\n imageUrl: string;\n homeTeam: WinProbabilityTeam;\n awayTeam: WinProbabilityTeam;\n}\n\ninterface ActiveAthletesTeam {\n team: {\n $key: string;\n };\n athletes: {\n $key: string;\n statLine: string;\n }[];\n}\n\nexport interface ActiveAthletes {\n displayText: string;\n teams: ActiveAthletesTeam[];\n}\n\nexport interface Meta {\n gp_topic: string;\n picker_topic: string;\n lastUpdatedAt?: string;\n firstPlayWallClock?: string;\n lastPlayWallClock?: string;\n gameState: string;\n syncUrl?: string;\n}\n\nexport interface StatsPromotion {\n backgroundImage?: string;\n description?: string;\n logoPng?: string;\n logo?: string;\n qrCode?: string;\n title?: string;\n}\n\n// Drive Summary interfaces\nexport interface DrivePlay {\n id: string;\n clock: {\n displayValue: string;\n };\n period: {\n number: number;\n };\n type: {\n text: string;\n };\n text: string;\n start: {\n downDistanceText: string;\n };\n}\n\nexport interface Drive {\n id: string;\n team: {\n $key: string;\n };\n description: string;\n plays: DrivePlay[];\n}\n\nexport interface StatsTeam {\n title?: string;\n teams?: {\n $key?: string;\n }[];\n sections?: {\n $key?: string;\n title?: string;\n }[];\n}\n\n// Player Stats interfaces (Pre-Game Season Stats)\nexport interface PlayerStatsAthleteStatistic {\n displayValue?: string;\n label?: string;\n featured?: boolean;\n}\n\nexport interface PlayerStatsAthlete {\n $key?: string;\n statistics?: PlayerStatsAthleteStatistic[];\n}\n\nexport interface PlayerStatsAthleteStatus {\n displayName?: string;\n type?: string;\n}\n\nexport interface PlayerStatsItem {\n title?: string;\n athlete?: PlayerStatsAthlete;\n status?: PlayerStatsAthleteStatus;\n}\n\nexport interface PlayerStatsSection {\n title?: string;\n items?: PlayerStatsItem[];\n}\n\nexport interface PlayerStatsTeam {\n $key?: string;\n sections?: PlayerStatsSection[];\n}\n\nexport interface PlayerStats {\n teams?: PlayerStatsTeam[];\n}\n\nexport interface CareerMatchupStatistic {\n displayValue?: string;\n abbreviation?: string;\n}\n\ntype TextLike =\n | string\n | {\n type?: string;\n displayName?: string;\n };\n\nexport interface CareerMatchupItem {\n status?: TextLike;\n type?: TextLike;\n displayName?: TextLike;\n athlete?: {\n $key?: string;\n };\n}\n\nexport interface CareerMatchupSection {\n items?: CareerMatchupItem[];\n statistics?: CareerMatchupStatistic[];\n}\n\nexport interface CareerMatchup {\n title?: string;\n sections?: CareerMatchupSection[];\n}\n\n// Scoring Summary interfaces - raw API response types\n// These interfaces represent the API response format before transformation\nexport interface RawScoringSummaryItem {\n team?: {\n $key?: string;\n };\n athlete?: {\n $key?: string;\n };\n clock?: string;\n title?: string;\n description?: string;\n header?: {\n title?: string;\n featured?: boolean;\n }[];\n text?: string;\n shortText?: string;\n}\n\nexport interface RawScoringSummarySection {\n title?: string;\n items?: RawScoringSummaryItem[];\n}\n\nexport interface RawScoringSummary {\n title?: string;\n sections?: RawScoringSummarySection[];\n}\n\nexport interface StatsApiResponse {\n entities: {\n teams: EntityMap<Team>;\n athletes?: EntityMap<Athlete>;\n };\n leaders?: Leader[];\n header?: Header;\n teamHeader?: TeamHeader;\n predictor?: Predictor;\n winProbability?: WinProbability;\n gameState: string;\n activeAthletes?: ActiveAthletes;\n meta: Meta;\n promotion?: StatsPromotion;\n drives?: Drive[];\n statTeams?: StatsTeam;\n previousGames?: {\n displayOrder: number;\n team: {\n $key: string;\n };\n events: {\n team: {\n $key: string;\n homeAway: string;\n };\n score: string;\n gameResult: string;\n }[];\n }[];\n scoringSummary?: RawScoringSummary;\n penaltySummary?: {\n title: string;\n sections: {\n title: string;\n items: {\n team: {\n $key: string;\n };\n athlete: {\n $key: string;\n };\n clock: string;\n title: string;\n description: string;\n }[];\n }[];\n };\n playerStats?: PlayerStats;\n careerMatchup?: CareerMatchup;\n}\n","import NetworkManager, {\n HttpMethod,\n} from '../../../../services/NetworkManager/NetworkManager';\nimport { StatsApiResponse } from '../interfaces/IStats';\nimport IMaestroEventDelegate from '@/interfaces/IMaestroEventDelegate';\nimport SDK from '../../../..';\nimport { captureException } from '@/sentry';\n\n/**\n * Service for handling stats-related API calls\n */\nclass StatsService {\n public networkManager: NetworkManager;\n public overrideUrl: string | null = null;\n\n constructor(delegate: IMaestroEventDelegate) {\n this.networkManager = new NetworkManager({\n externalBaseURL: delegate.getStatsAPIBaseURL(),\n });\n }\n\n /**\n * Get stats using a full sync URL (for timecode support)\n *\n * @param timeCode - The timecode in milliseconds, or null for 'latest'\n * @returns Promise with the stats data\n */\n async getStatsByUrl(timeCode: number | null): Promise<StatsApiResponse> {\n return this.networkManager.externalApiRequest({\n endpoint: this.getSyncEndpoint(timeCode),\n method: HttpMethod.GET,\n params: {},\n headers: {},\n });\n }\n\n /**\n * Start polling using a full sync URL (for timecode support)\n *\n * @param timeCode - The timecode in milliseconds, or null for 'latest'\n * @param interval - The polling interval in milliseconds\n * @param onData - Callback for successful data fetch\n * @param onError - Callback for errors\n * @returns Object with a stop function to stop polling\n */\n pollStatsByUrl(\n timeCode: number | null,\n interval: number,\n onData: (data: StatsApiResponse) => void,\n onError?: (error: Error) => void\n ): { stop: () => void } {\n return this.networkManager.pollExternalApiRequest({\n endpoint: this.getSyncEndpoint(timeCode),\n interval,\n method: HttpMethod.GET,\n params: {},\n headers: {},\n onData,\n onError,\n });\n }\n\n /**\n * Build sync URL for timecode-based stats fetching\n * @param timeCode - The timecode in milliseconds, or null for 'latest'\n * @returns Complete sync URL for the fauxcast stats endpoint\n */\n private getSyncEndpoint(timeCode: number | null): string {\n if (this.overrideUrl) {\n console.log('[StatsService] Using overrideUrl:', this.overrideUrl);\n return this.overrideUrl;\n }\n\n const { leagueId, mainId } = this.getIdsFromPageConfig();\n const formattedTimeCode = this.formatTimeCodeForAPI(timeCode);\n\n return `/${leagueId}/${mainId}/en/us/${formattedTimeCode}`;\n }\n\n /**\n * Extract event, league, and main IDs from page config metadata\n * @returns Object containing eventId, leagueId, and mainId\n */\n private getIdsFromPageConfig(): {\n eventId: string;\n leagueId: string;\n mainId: string;\n } {\n const pageConfig = SDK.getPageConfig();\n if (!pageConfig) {\n throw new Error('Page config is null or undefined');\n }\n\n const metadata = pageConfig.page.metadata;\n const eventId = metadata?.external_field_1;\n const leagueField = metadata?.external_field_5;\n\n if (!eventId || !leagueField) {\n const availableFields = Object.keys(metadata || {}).join(', ');\n throw new Error(\n 'Missing eventId or leagueId in page config metadata. Cannot build sync URL. ' +\n `Required fields: external_field_1 (eventId), external_field_5 (leagueId). ` +\n `Available fields: ${availableFields}`\n );\n }\n\n const { leagueId, fauxcastId } = this.parseLeagueData(leagueField);\n const mainId = fauxcastId || eventId;\n\n if (!mainId.trim() || !leagueId.trim()) {\n throw new Error(\n 'MainId or leagueId is empty string in page config metadata'\n );\n }\n\n return { eventId, leagueId, mainId };\n }\n\n /**\n * Parse league data from external_field_5 JSON string\n * @param leagueField - JSON string containing leagueId and optional fauxcastId\n * @returns Parsed league data\n */\n private parseLeagueData(\n leagueField: string\n ): {\n leagueId: string;\n fauxcastId?: string;\n } {\n try {\n const parsed = JSON.parse(leagueField);\n\n if (!parsed.leagueId) {\n throw new Error('leagueId not found in parsed JSON');\n }\n\n return { leagueId: parsed.leagueId, fauxcastId: parsed.fauxcastId };\n } catch (parseError) {\n const error = new Error(\n `Failed to parse leagueId from external_field_5. Raw value: ${leagueField}`\n );\n captureException(error, { rawValue: leagueField, parseError });\n throw error;\n }\n }\n\n /**\n * Format timecode for API consumption\n * @param timeCode - Timecode in milliseconds or null\n * @returns ISO date string, \"pre.json\" for pre-game, or \"latest\" for post-game\n */\n private formatTimeCodeForAPI(timeCode: number | null): string {\n if (!timeCode || timeCode === 0) {\n return 'latest';\n }\n\n if (\n typeof timeCode !== 'number' ||\n isNaN(timeCode) ||\n !isFinite(timeCode)\n ) {\n console.warn('Invalid timecode provided, using \"latest\":', timeCode);\n return 'latest';\n }\n\n try {\n const date = new Date(timeCode);\n\n if (isNaN(date.getTime())) {\n console.warn('Invalid date from timecode, using \"latest\":', timeCode);\n return 'latest';\n }\n\n // For future timecodes, use \"latest\" since we can't fetch future data\n const now = Date.now();\n const timeDiff = now - timeCode;\n if (timeDiff < 0) {\n return 'latest';\n }\n\n // Return ISO date string without milliseconds to match API format\n const isoString = date.toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n return isoString;\n } catch (error) {\n captureException(error as Error, { timeCode });\n console.warn(\n 'Error formatting timecode, using \"latest\":',\n timeCode,\n error\n );\n return 'latest';\n }\n }\n}\n\nexport default StatsService;\n","import { DrivePlay } from '../interfaces/IStats';\n\n/**\n * Get ordinal suffix for a number (1st, 2nd, 3rd, 4th, etc.)\n */\nexport const getOrdinalSuffix = (number: number): string => {\n const lastTwoDigits = number % 100;\n if (lastTwoDigits >= 11 && lastTwoDigits <= 13) {\n return 'th';\n }\n\n const lastDigit = number % 10;\n switch (lastDigit) {\n case 1:\n return 'st';\n case 2:\n return 'nd';\n case 3:\n return 'rd';\n default:\n return 'th';\n }\n};\n\n/**\n * Parse drive description to get individual components\n * Format: \"11 PLAYS, 61 YARDS, 5:43\"\n */\nexport const parseDriveDescription = (description: string) => {\n if (!description) {\n return {\n plays: '0',\n yards: '0',\n time: '',\n };\n }\n\n const parts = description.split(', ');\n\n const plays = parts[0]?.split(' ')[0] || '0';\n const yards = parts[1]?.split(' ')[0] || '0';\n const time = parts[2] || '';\n\n return { plays, yards, time };\n};\n\n/**\n * Format the marquee text for the last play\n */\nexport const formatLastPlayMarquee = (lastPlay: DrivePlay): string => {\n if (!lastPlay?.period?.number) {\n return '';\n }\n const ordinalSuffix = getOrdinalSuffix(lastPlay.period.number);\n return `(${lastPlay.clock.displayValue} - ${lastPlay.period.number}${ordinalSuffix}) (${lastPlay.type.text}) ${lastPlay.text}`;\n};\n","import { Observable } from '../../../../helpers/Observable';\nimport { ViewModel } from '../../../../view-models/ViewModel';\nimport { MOCK_STATS_API_PRE_GAME_RESPONSE } from '../mocks';\nimport {\n Athlete,\n CareerMatchupStatistic,\n DrivePlay,\n isTabbedStatisticsArray,\n isTeamStatistic,\n isHockeyScoringSummary,\n isMlbScoringSummary,\n RawScoringSummary,\n StatsApiResponse,\n Team,\n TeamStatistic,\n} from '../interfaces/IStats';\nimport { AthletesStatisticsItem } from '../view/components/AthletesStatistics/AthletesStatistics';\nimport StatsService from '../services/StatsService';\nimport IMaestroEventDelegate from '@/interfaces/IMaestroEventDelegate';\n\nimport {\n formatLastPlayMarquee,\n parseDriveDescription,\n} from '../utils/driveSummaryUtils';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\nimport { setImageDimensions } from '@/helpers/url';\nimport SDK from '@/index';\nimport { captureException } from '@/sentry';\nimport { stringHashCode } from '@/helpers/strings';\n\nconst STATS_ERROR_STATE = {\n NONE: 'none',\n TAB_LOAD_FAILURE: 'tabLoadFailure',\n} as const;\nexport type StatsErrorState = typeof STATS_ERROR_STATE[keyof typeof STATS_ERROR_STATE];\n\ninterface TimecodePollingState {\n isActive: boolean;\n currentUrl: string | null;\n lastUpdateTime: number;\n}\n\n// Constants for configuration\nconst DEFAULT_POLLING_INTERVAL = 10000; // 10 seconds\nconst SMART_POLLING_DELAY = 1000; // 1 second delay after smart polling immediate call\n\ntype GetTeamInfoResponse = {\n awayTeam: {\n index: number;\n id: string;\n logo?: string;\n name: string;\n };\n homeTeam: {\n index: number;\n id: string;\n logo?: string;\n name: string;\n };\n};\n\nexport type HeaderTeamStatItem = {\n type: 'headerTeam';\n isLive: boolean;\n linescoresHeader: string[];\n linescoresRowHeader?: 'teamLogo' | 'teamName';\n statistics?: {\n displayName: string;\n homeTeamValue: number;\n awayTeamValue: number;\n awayTeamDisplayValue: string;\n homeTeamDisplayValue: string;\n }[];\n homeTeam: Pick<\n Team,\n 'color' | 'id' | 'logo' | 'name' | 'abbreviation' | 'record'\n > & {\n linescores: string[];\n details?: string[];\n };\n awayTeam: Pick<\n Team,\n 'color' | 'id' | 'logo' | 'name' | 'abbreviation' | 'record'\n > & {\n linescores: string[];\n details?: string[];\n };\n};\n\ntype HeaderLikeTeam = {\n $key: string;\n score?: string;\n linescores?: { displayValue: string }[];\n details?: string[];\n};\n\ntype RecentGamesPreviousGame = {\n score: string;\n gameResult: string;\n teamLogo?: string;\n homeAway: string;\n};\n\ntype RecentGamesTeam = {\n logo?: string;\n name?: string;\n events: RecentGamesPreviousGame[];\n};\n\nexport type RecentGamesStatsItem = {\n type: 'recentGames';\n awayTeam: RecentGamesTeam;\n homeTeam: RecentGamesTeam;\n};\n\nexport type WinProbabilityStatsItem = {\n type: 'winProbability';\n chartImageUrl: string;\n awayTeam: Pick<Team, 'id' | 'abbreviation' | 'logo'> & {\n winPercentage: string;\n };\n homeTeam: Pick<Team, 'id' | 'abbreviation' | 'logo'> & {\n winPercentage: string;\n };\n};\n\nexport type GameLeadersStatsItem = {\n type: 'gameLeaders';\n displayText: string;\n items: AthletesStatisticsItem[];\n};\n\nexport type ActiveAthletesItem = {\n type: 'activeAthletes';\n displayText: string;\n awayTeam: Pick<Team, 'id' | 'logo' | 'name'>;\n homeTeam: Pick<Team, 'id' | 'logo' | 'name'>;\n athletes: AthletesStatisticsItem[];\n};\n\nexport type StatsPromotionItem = {\n type: 'promotion';\n title: string;\n description: string;\n logo: string;\n qrCode: string;\n backgroundImage: string;\n};\n\nexport type StatsMatchPredictorItem = {\n type: 'matchPredictor';\n header: string;\n imageUrl: string;\n awayTeam: Pick<Team, 'abbreviation' | 'logo' | 'displayName'> & {\n percentage: number;\n };\n homeTeam: Pick<Team, 'abbreviation' | 'logo' | 'displayName'> & {\n percentage: number;\n };\n};\n\nexport type TeamStatsStatistics = {\n displayName: string;\n awayTeamDisplayValue: string;\n homeTeamDisplayValue: string;\n awayTeamValue: number;\n homeTeamValue: number;\n};\n\nexport type TeamStatsItem = {\n type: 'teamStats';\n awayTeam: Pick<Team, 'logo' | 'displayName' | 'color' | 'abbreviation'>;\n homeTeam: Pick<Team, 'logo' | 'displayName' | 'color' | 'abbreviation'>;\n statistics?: TeamStatsStatistics[];\n tabbedStatistics?: Record<\n string,\n {\n title: string;\n entries: TeamStatsStatistics[];\n }\n >;\n title: string;\n};\n\nexport type DriveSummaryItem = {\n type: 'driveSummary';\n id: string;\n team: Pick<Team, 'logo' | 'displayName'>;\n playsQuantity: string;\n yards: string;\n time: string;\n lastPlayMarquee: string;\n plays: DrivePlay[];\n};\n\nexport type IScoreItem = {\n teamLogo?: string;\n teamName?: string;\n athletePosition?: string;\n athleteNumber?: string;\n athleteName?: string;\n athleteAssists?: string;\n athleteThumbnail?: string;\n description: string;\n clock: string;\n};\n\nexport type IScoreSection = {\n title: string;\n scores: IScoreItem[];\n};\n\nexport type ScoringSummarySectionTeam = {\n teamLogo: string;\n teamName: string;\n header: Array<{ featured: boolean; title: string }>;\n text: string;\n shortText: Array<{ featured: boolean; title: string }>;\n headshot?: string;\n athleteShortName?: string;\n athletePosition?: string;\n athleteJersey?: string;\n};\n\nexport type ScoringSummarySection = {\n title: string;\n items: ScoringSummarySectionTeam[];\n};\n\nexport type ScoringSummaryItem = {\n type: 'scoringSummary';\n tag: string;\n title: string;\n sections: ScoringSummarySection[];\n};\n\nexport type PenaltiesItem = {\n type: 'penalties';\n tag: string;\n title: string;\n sections: ScoringSummarySection[];\n};\n\nexport type PlayerSeasonStatsPlayerItem = {\n title: string;\n headshot: string;\n position: string;\n jersey: string;\n featuredStat: { displayValue: string; label: string } | null;\n statistics: Array<{ displayValue: string; label: string }>;\n playerStatus: { displayName: string; type: string } | null;\n};\n\nexport type PlayerSeasonStatsSection = {\n title: string;\n items: PlayerSeasonStatsPlayerItem[];\n};\n\nexport type PlayerSeasonStatsTeam = {\n teamKey: string;\n shortDisplayName: string;\n color: string;\n sections: PlayerSeasonStatsSection[];\n};\n\nexport type PlayerSeasonStatsItem = {\n type: 'playerSeasonStats';\n teams: PlayerSeasonStatsTeam[];\n};\n\nexport interface CareerMatchupViewItem {\n status?: string; // e.g. \"On Deck\"\n isHighlighted?: boolean; // True if status usually indicates warning/attention like \"On Deck\"\n type: string; // e.g. \"batter\" or \"pitcher\"\n displayName: string; // e.g. \"At-Bat\"\n athlete?: Athlete;\n}\n\nexport interface CareerMatchupViewSection {\n items: CareerMatchupViewItem[];\n statistics: CareerMatchupStatistic[];\n}\n\nexport type CareerMatchupStatsItem = {\n type: 'careerMatchup';\n title: string;\n sections: CareerMatchupViewSection[];\n};\n\nexport type StatsItem =\n | HeaderTeamStatItem\n | RecentGamesStatsItem\n | WinProbabilityStatsItem\n | GameLeadersStatsItem\n | ActiveAthletesItem\n | StatsPromotionItem\n | StatsMatchPredictorItem\n | TeamStatsItem\n | DriveSummaryItem\n | ScoringSummaryItem\n | PenaltiesItem\n | PlayerSeasonStatsItem\n | CareerMatchupStatsItem;\n\n// The interval for polling stats data (in milliseconds)\nconst STATS_ITEM_TYPE_CARD_MAP: Record<\n StatsItem['type'],\n keyof StatsApiResponse\n> = {\n activeAthletes: 'activeAthletes',\n driveSummary: 'drives',\n gameLeaders: 'leaders',\n headerTeam: 'header',\n matchPredictor: 'predictor',\n playerSeasonStats: 'playerStats',\n promotion: 'promotion',\n recentGames: 'previousGames',\n scoringSummary: 'scoringSummary',\n teamStats: 'entities',\n winProbability: 'winProbability',\n careerMatchup: 'careerMatchup',\n penalties: 'penaltySummary',\n};\n\nexport class StatsViewModel extends ViewModel {\n isDataLoading = new Observable<boolean>(true);\n hasEverSuccessfullyLoaded = new Observable<boolean>(false);\n eventId: string;\n statsItems = new Observable<StatsItem[]>([]);\n errorState = new Observable<StatsErrorState>('none');\n currentGameState = new Observable<string>('');\n statsService: StatsService;\n analyticsService: AnalyticsService;\n\n // Properties\n private useMockData: boolean = false;\n private lastResponseHash: number | null = null;\n\n // Enhanced timecode-related properties\n private currentPlayerTimeCode: number | null = null;\n private timecodePollingTask: { stop: () => void } | null = null;\n private smartPollingTimeout: number | null = null;\n private timecodePollingState: TimecodePollingState = {\n isActive: false,\n currentUrl: null,\n lastUpdateTime: 0,\n };\n\n constructor(\n eventId: string,\n delegate: IMaestroEventDelegate,\n analyticsService: AnalyticsService,\n options: {\n useMockData?: boolean;\n } = {}\n ) {\n super();\n this.eventId = eventId;\n this.useMockData = options.useMockData || false;\n this.statsService = new StatsService(delegate);\n this.analyticsService = analyticsService;\n }\n\n /**\n * Sets panel-specific data configuration\n * @param panelData - Object containing panel configuration\n */\n setDataToPanel(panelData: Record<string, any>): void {\n if ('overrideUrl' in panelData) {\n const overrideUrl = panelData.overrideUrl;\n if (typeof overrideUrl === 'string' && overrideUrl.length > 0) {\n console.log('[StatsViewModel] Setting overrideUrl:', overrideUrl);\n this.statsService.overrideUrl = overrideUrl;\n }\n }\n }\n\n /**\n * Initialize the ViewModel and start data fetching\n */\n async init(): Promise<void> {\n if (this.useMockData) {\n await this.fetchMockData();\n } else {\n // Get the current timecode from MaestroEventViewModel instead of defaulting to null\n // This ensures we don't override the current timecode when switching tabs\n const currentTimeCode = this.getCurrentTimeCode();\n this.onUpdatePlayerTimeCode(currentTimeCode);\n this.analyticsService.panelView('espnStats');\n }\n }\n\n /**\n * Get the current timecode from the MaestroEventViewModel\n * This prevents the stats panel from always defaulting to real-time data\n */\n private getCurrentTimeCode(): number | null {\n try {\n // Access the MaestroEventViewModel through the imported SDK to get current timecode\n const maestroEventViewModel = SDK.getMaestroEventViewModel();\n if (\n maestroEventViewModel &&\n typeof maestroEventViewModel.getPlayerTimeCode === 'function'\n ) {\n return maestroEventViewModel.getPlayerTimeCode();\n }\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.getCurrentTimeCode',\n });\n\n console.warn(\n 'Could not get current timecode from MaestroEventViewModel:',\n error\n );\n }\n\n // Fallback to null (real-time) if we can't get the current timecode\n return null;\n }\n\n onEngage = (type: StatsItem['type']): void => {\n this.analyticsService.panelClick({\n type: 'espnStats',\n name: 'stats_item_clicked',\n metadata: {\n card: [STATS_ITEM_TYPE_CARD_MAP[type]],\n game_state: [this.currentGameState.value],\n },\n });\n };\n\n /**\n * Clean up resources when the ViewModel is no longer needed\n */\n cleanup(): void {\n this.stopTimecodePolling();\n this.clearSmartPollingTimeout();\n this.resetTimecodePollingState();\n }\n\n /**\n * Handle player timecode updates with enhanced logging and validation\n *\n * @param playerTimeCode - The timecode in milliseconds, or null for live\n */\n onUpdatePlayerTimeCode(playerTimeCode: number | null): void {\n this.currentPlayerTimeCode = playerTimeCode;\n\n if (this.useMockData) {\n return;\n }\n\n try {\n this.performSmartPolling(playerTimeCode);\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.onUpdatePlayerTimeCode',\n });\n\n console.error('Error handling player timecode update:', error);\n\n this.handleTimecodeError('Error handling player timecode update', error);\n }\n }\n\n clearTabLoadFailure() {\n this.errorState.value = 'none';\n const currentTimeCode = this.getCurrentTimeCode();\n this.onUpdatePlayerTimeCode(currentTimeCode);\n }\n\n /**\n * Implement smart polling strategy: immediate API call + delayed polling resumption\n *\n * @param playerTimeCode - The timecode in milliseconds, or null\n */\n private async performSmartPolling(\n playerTimeCode: number | null\n ): Promise<void> {\n this.clearSmartPollingTimeout();\n this.stopTimecodePolling();\n\n try {\n const immediateStats = await this.statsService.getStatsByUrl(\n playerTimeCode\n );\n\n if (!immediateStats) {\n throw new Error('API returned undefined or null response');\n }\n\n this.processPolledData(immediateStats);\n\n this.smartPollingTimeout = window.setTimeout(() => {\n this.startTimecodePolling(playerTimeCode);\n this.smartPollingTimeout = null;\n }, SMART_POLLING_DELAY);\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.performSmartPolling',\n });\n\n console.error('Error during smart polling immediate call:', error);\n\n this.handleTimecodeError(\n 'Error during smart polling immediate call',\n error\n );\n\n this.stopTimecodePolling();\n this.startTimecodePolling(playerTimeCode);\n }\n }\n\n /**\n * Enhanced error handling for timecode-related operations\n *\n * @param context - Description of where the error occurred\n * @param error - The error that occurred\n */\n private handleTimecodeError(context: string, error: unknown): void {\n const errorDetails = {\n context,\n errorType: error?.constructor?.name || 'Unknown',\n errorMessage: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n currentTimecode: this.currentPlayerTimeCode,\n hasExistingData: this.statsItems.value.length > 0,\n lastResponseHash: this.lastResponseHash,\n url: this.timecodePollingState.currentUrl,\n };\n\n console.error(`${context}:`, errorDetails);\n\n if (!this.hasEverSuccessfullyLoaded.value) {\n this.errorState.value = 'tabLoadFailure';\n }\n }\n\n /**\n * Clear any pending smart polling timeout\n */\n private clearSmartPollingTimeout(): void {\n if (this.smartPollingTimeout) {\n clearTimeout(this.smartPollingTimeout);\n this.smartPollingTimeout = null;\n }\n }\n\n /**\n * Reset timecode polling state\n */\n private resetTimecodePollingState(): void {\n this.timecodePollingState = {\n isActive: false,\n currentUrl: null,\n lastUpdateTime: 0,\n };\n }\n\n /**\n * Start timecode-based polling with enhanced logging\n *\n * @param playerTimeCode - The timecode in milliseconds, or null\n */\n private startTimecodePolling(playerTimeCode: number | null): void {\n this.stopTimecodePolling();\n try {\n this.timecodePollingTask = this.statsService.pollStatsByUrl(\n playerTimeCode,\n DEFAULT_POLLING_INTERVAL,\n (data) => {\n this.processPolledData(data);\n },\n (error) => {\n console.error('Timecode polling error:', error);\n\n this.handleTimecodeError('Timecode polling error', error);\n }\n );\n\n this.timecodePollingState.isActive = true;\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.startTimecodePolling',\n });\n\n console.error('Error setting up timecode-based Stats polling:', error);\n\n this.handleTimecodeError(\n 'Error setting up timecode-based Stats polling',\n error\n );\n }\n }\n\n /**\n * Stop timecode-based polling with enhanced logging\n */\n private stopTimecodePolling(): void {\n if (this.timecodePollingTask) {\n this.timecodePollingTask.stop();\n this.timecodePollingTask = null;\n }\n\n this.timecodePollingState.isActive = false;\n }\n\n /**\n * Fetch mock data for testing\n */\n private async fetchMockData(): Promise<void> {\n this.processData(MOCK_STATS_API_PRE_GAME_RESPONSE);\n this.hasEverSuccessfullyLoaded.value = true;\n this.isDataLoading.value = false;\n }\n\n /**\n * Process polled data with hash comparison to avoid unnecessary re-renders\n * Enhanced with comprehensive logging to show data changes\n *\n * @param data - The stats data received from the API\n */\n private processPolledData(data: StatsApiResponse): void {\n const responseString = JSON.stringify(data);\n const currentHash = stringHashCode(responseString);\n\n if (\n this.hasEverSuccessfullyLoaded.value &&\n currentHash === this.lastResponseHash\n ) {\n return;\n }\n\n this.lastResponseHash = currentHash;\n\n this.hasEverSuccessfullyLoaded.value = true;\n this.errorState.value = 'none';\n\n this.processData(data);\n\n if (data.gameState === 'post') {\n this.stopTimecodePolling();\n }\n }\n\n private processData(data: StatsApiResponse) {\n const statsItems: StatsItem[] = [];\n\n const headerTeam = this.parseHeaderTeams(data);\n if (headerTeam) {\n statsItems.push(headerTeam);\n }\n\n const matchPredictor = this.parseMatchPredictor(data);\n if (matchPredictor) {\n statsItems.push(matchPredictor);\n }\n\n const careerMatchup = this.parseCareerMatchup(data);\n if (careerMatchup) {\n statsItems.push(careerMatchup);\n }\n\n const playerSeasonStats = this.parsePlayerSeasonStats(data);\n if (playerSeasonStats) {\n statsItems.push(playerSeasonStats);\n }\n\n const scoringSummary = this.parseScoringSummary(data);\n if (scoringSummary) {\n statsItems.push(scoringSummary);\n }\n\n const winProbability = this.parseWinProbability(data);\n if (winProbability) {\n statsItems.push(winProbability);\n }\n\n // Team Stats (prefer season stats when available; fallback to game stats)\n const teamStats =\n this.parseTeamSeasonStatistics(data) || this.parseTeamsStatistics(data);\n if (teamStats) {\n statsItems.push(teamStats);\n }\n\n const driveSummary = this.parseDriveSummary(data);\n if (driveSummary.length > 0) {\n statsItems.push(...driveSummary);\n }\n\n const penalties = this.parsePenalties(data);\n if (penalties) {\n statsItems.push(penalties);\n }\n\n const activeAthletes = this.parseActiveAthletes(data);\n if (activeAthletes) {\n statsItems.push(activeAthletes);\n }\n\n const gameLeaders = this.parseGameLeaders(data);\n if (gameLeaders) {\n statsItems.push(gameLeaders);\n }\n\n const recentGames = this.parseRecentGames(data);\n if (recentGames) {\n statsItems.push(recentGames);\n }\n\n const promotion = this.parsePromotion(data);\n if (promotion) {\n statsItems.push(promotion);\n }\n\n // Update the stats items observable\n this.statsItems.value = statsItems;\n this.currentGameState.value = data.gameState;\n }\n\n private parseDriveSummary(data: StatsApiResponse): DriveSummaryItem[] {\n const teams = data.entities?.teams;\n const drives = data.drives;\n\n if (!teams || !drives || drives.length === 0) {\n return [];\n }\n\n const result: DriveSummaryItem[] = [];\n for (const drive of drives) {\n if (!drive?.team?.$key) {\n continue;\n }\n\n const plays = [...(drive.plays || [])].reverse();\n const lastPlay = plays[plays.length - 1] || null;\n let lastPlayMarquee = '';\n\n if (lastPlay) {\n lastPlayMarquee = formatLastPlayMarquee(lastPlay);\n }\n\n const { plays: playsQuantity, time, yards } = parseDriveDescription(\n drive.description || ''\n );\n\n const team = teams[drive.team.$key];\n\n if (!team) {\n continue;\n }\n\n result.push({\n id: drive.id,\n lastPlayMarquee,\n plays,\n playsQuantity,\n team,\n time,\n type: 'driveSummary',\n yards,\n });\n }\n\n return result;\n }\n\n private parseTeamsStatistics(data: StatsApiResponse): TeamStatsItem | null {\n const teams = data.entities?.teams;\n\n if (!teams) {\n return null;\n }\n\n const awayTeam = Object.values(teams).find(\n (team) => team.homeAway === 'away'\n );\n\n const homeTeam = Object.values(teams).find(\n (team) => team.homeAway === 'home'\n );\n\n if (!awayTeam || !homeTeam) {\n return null;\n }\n\n // Ensure both teams have statistics\n if (!awayTeam.statistics || !homeTeam.statistics) {\n return null;\n }\n\n const statistics: TeamStatsItem['statistics'] = [];\n for (let i = 0; i < awayTeam.statistics.length; i++) {\n const awayStat = awayTeam.statistics[i];\n const homeStat = homeTeam.statistics[i];\n\n if (isTeamStatistic(awayStat) && isTeamStatistic(homeStat)) {\n statistics.push({\n awayTeamDisplayValue: awayStat?.displayValue || '0',\n displayName: awayStat.displayName || '',\n homeTeamDisplayValue: homeStat?.displayValue || '0',\n awayTeamValue: awayStat?.value || 0,\n homeTeamValue: homeStat?.value || 0,\n });\n }\n }\n\n if (!statistics.length) {\n return null;\n }\n\n return {\n type: 'teamStats',\n title: 'Team Stats',\n awayTeam: {\n logo: awayTeam.logo,\n displayName: awayTeam.displayName || '',\n color: awayTeam.color || '',\n abbreviation: awayTeam.abbreviation || '',\n },\n homeTeam: {\n logo: homeTeam.logo,\n displayName: homeTeam.displayName || '',\n color: homeTeam.color || '',\n abbreviation: homeTeam.abbreviation || '',\n },\n statistics,\n };\n }\n\n private parseTeamSeasonStatistics(\n data: StatsApiResponse\n ): TeamStatsItem | null {\n const teams = data.entities?.teams || {};\n\n if (\n !Object.keys(teams).length ||\n !data.statTeams ||\n !data.statTeams.title ||\n !data.statTeams.sections?.length ||\n !data.statTeams.teams?.length\n ) {\n return null;\n }\n\n const awayTeamKey = data.statTeams.teams[0]?.$key;\n const homeTeamKey = data.statTeams.teams[1]?.$key;\n if (!awayTeamKey || !homeTeamKey) {\n return null;\n }\n const awayTeam = teams[awayTeamKey];\n const homeTeam = teams[homeTeamKey];\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n const tabbedStatistics: Record<\n string,\n {\n title: string;\n entries: TeamStatsStatistics[];\n }\n > = {};\n data.statTeams.sections.forEach((section) => {\n if (!!section.$key && !!section.title) {\n const sectionKeyStatistics: TeamStatsItem['statistics'] = [];\n if (\n isTabbedStatisticsArray(homeTeam.statistics) &&\n isTabbedStatisticsArray(awayTeam.statistics)\n ) {\n const homeSectionStats = homeTeam.statistics.find(\n (st) => st.$key === section.$key\n );\n const awaySectionStats = awayTeam.statistics.find(\n (st) => st.$key === section.$key\n );\n\n if (\n homeSectionStats &&\n awaySectionStats &&\n awaySectionStats.stats?.length &&\n homeSectionStats.stats?.length\n ) {\n for (let i = 0; i < awaySectionStats.stats.length; i++) {\n const awayStat = awaySectionStats.stats[i];\n const homeStat = homeSectionStats.stats[i];\n\n sectionKeyStatistics.push({\n awayTeamDisplayValue: awayStat?.displayValue || '0',\n displayName: awayStat.displayName || '',\n homeTeamDisplayValue: homeStat?.displayValue || '0',\n awayTeamValue: awayStat?.displayValue\n ? Number(awayStat.displayValue)\n : 0,\n homeTeamValue: homeStat?.displayValue\n ? Number(homeStat.displayValue)\n : 0,\n });\n }\n tabbedStatistics[section.$key] = {\n title: section.title,\n entries: sectionKeyStatistics,\n };\n }\n }\n }\n });\n\n return {\n type: 'teamStats',\n title: data.statTeams.title,\n awayTeam: {\n abbreviation: awayTeam.abbreviation,\n displayName: awayTeam.displayName || '',\n color: awayTeam.color || '',\n logo: awayTeam.logo,\n },\n homeTeam: {\n abbreviation: homeTeam.abbreviation,\n displayName: homeTeam.displayName || '',\n color: homeTeam.color || '',\n logo: homeTeam.logo,\n },\n tabbedStatistics,\n };\n }\n\n private parseMatchPredictor(\n data: StatsApiResponse\n ): StatsMatchPredictorItem | null {\n const teams = data.entities?.teams;\n const predictor = data.predictor;\n\n if (!teams || !predictor || !predictor.homeTeam || !predictor.awayTeam) {\n return null;\n }\n\n // Get team data\n const homeTeam = teams[predictor.homeTeam.team.$key];\n const awayTeam = teams[predictor.awayTeam.team.$key];\n\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n // Parse percentages\n const homePercentage = parseFloat(predictor.homeTeam.gameProjection);\n const awayPercentage = parseFloat(predictor.awayTeam.gameProjection);\n\n return {\n type: 'matchPredictor',\n header: predictor.header,\n imageUrl: predictor.imageUrl,\n awayTeam: {\n percentage: awayPercentage,\n abbreviation: awayTeam.abbreviation,\n logo: awayTeam.logo,\n displayName: awayTeam.displayName || '',\n },\n homeTeam: {\n percentage: homePercentage,\n abbreviation: homeTeam.abbreviation,\n logo: homeTeam.logo,\n displayName: homeTeam.displayName || '',\n },\n };\n }\n\n private parsePromotion(\n response: StatsApiResponse\n ): StatsPromotionItem | null {\n const promotion = response.promotion;\n\n if (!promotion) {\n return null;\n }\n\n return {\n type: 'promotion',\n title: promotion.title || '',\n description: promotion.description || '',\n logo: promotion.logo || '',\n qrCode: promotion.qrCode || '',\n backgroundImage: promotion.backgroundImage || '',\n };\n }\n\n private parseCareerMatchup(\n response: StatsApiResponse\n ): CareerMatchupStatsItem | null {\n const careerMatchup = response.careerMatchup;\n const athletes = response.entities?.athletes;\n\n if (!careerMatchup || !careerMatchup.sections) {\n return null;\n }\n\n const toText = (value: unknown): string => {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const maybeDisplayName = (value as { displayName?: unknown })\n .displayName;\n if (typeof maybeDisplayName === 'string') return maybeDisplayName;\n }\n return '';\n };\n\n const sections = careerMatchup.sections\n .filter((section) => !!section)\n .map((section) => {\n const items = (section.items || [])\n .filter((item) => !!item)\n .map((item) => {\n const athleteKey = item.athlete?.$key;\n const athlete =\n athletes && athleteKey ? athletes[athleteKey] : undefined;\n // Determine if this item should be highlighted (e.g. warning color)\n // This abstraction allows the View to be sport-agnostic.\n // Currently only \"On Deck\" in MLB triggers this.\n const statusText = toText(item.status);\n const isHighlighted = statusText === 'On Deck';\n\n return {\n status: statusText,\n type: toText(item.type) || '',\n displayName: toText(item.displayName) || '',\n athlete,\n isHighlighted,\n };\n });\n\n const statistics = (section.statistics || [])\n .filter((stat) => !!stat)\n .map((stat) => ({\n abbreviation: stat.abbreviation || '',\n displayValue: stat.displayValue || '',\n }));\n\n return {\n items,\n statistics,\n };\n });\n\n return {\n type: 'careerMatchup',\n title: careerMatchup.title || '',\n sections,\n };\n }\n\n private parseHeaderTeams(\n response: StatsApiResponse\n ): HeaderTeamStatItem | null {\n return (\n this.parseHeaderTeamsFromTeamHeader(response) ||\n this.parseHeaderTeamsFromHeader(response)\n );\n }\n\n private parseHeaderTeamsFromHeader(\n response: StatsApiResponse\n ): HeaderTeamStatItem | null {\n const headerTeams: HeaderLikeTeam[] =\n ((response.header?.teams as unknown) as HeaderLikeTeam[] | undefined) ||\n [];\n\n if (headerTeams.length === 0) {\n return null;\n }\n\n return this.buildHeaderTeamsItem({\n response,\n headerTeams,\n linescoresHeader: response.header?.linescoresHeader || [],\n linescoresRowHeader: undefined,\n isLiveFromHeaderSource: false,\n });\n }\n\n private parseHeaderTeamsFromTeamHeader(\n response: StatsApiResponse\n ): HeaderTeamStatItem | null {\n const headerTeams: HeaderLikeTeam[] =\n ((response.header?.teams as unknown) as HeaderLikeTeam[] | undefined) ||\n [];\n const teamHeaderTeams: HeaderLikeTeam[] =\n ((response.teamHeader?.teams as unknown) as\n | HeaderLikeTeam[]\n | undefined) || [];\n\n if (teamHeaderTeams.length === 0) {\n return null;\n }\n\n const teamHeaderHasLinescores = teamHeaderTeams.some(\n (t) => Array.isArray(t.linescores) && t.linescores.length > 0\n );\n const teamHeaderHasLinescoresHeader =\n (response.teamHeader?.linescoresHeader?.length || 0) > 0;\n\n if (\n !teamHeaderHasLinescores &&\n !teamHeaderHasLinescoresHeader &&\n headerTeams.length > 0\n ) {\n return null;\n }\n\n const linescoresRowHeader =\n response.teamHeader?.style?.linescores?.rowHeader === 'teamLogo'\n ? 'teamLogo'\n : undefined;\n\n return this.buildHeaderTeamsItem({\n response,\n headerTeams: teamHeaderTeams,\n linescoresHeader: response.teamHeader?.linescoresHeader || [],\n linescoresRowHeader,\n isLiveFromHeaderSource:\n teamHeaderHasLinescores || teamHeaderHasLinescoresHeader,\n });\n }\n\n private buildHeaderTeamsItem(params: {\n response: StatsApiResponse;\n headerTeams: HeaderLikeTeam[];\n linescoresHeader: string[];\n linescoresRowHeader?: 'teamLogo' | 'teamName';\n isLiveFromHeaderSource: boolean;\n }): HeaderTeamStatItem | null {\n const {\n response,\n headerTeams,\n linescoresHeader: rawLinescoresHeader,\n linescoresRowHeader,\n isLiveFromHeaderSource,\n } = params;\n\n const teams = response.entities?.teams;\n if (!teams || headerTeams.length === 0) {\n return null;\n }\n\n const homeTeamHeader = headerTeams.find((t) => {\n const team = teams[t.$key];\n return team && team.homeAway === 'home';\n });\n\n const awayTeamHeader = headerTeams.find((t) => {\n const team = teams[t.$key];\n return team && team.homeAway === 'away';\n });\n\n // If home/away isn't provided, fall back to list order.\n const fallbackAwayTeamHeader = headerTeams[0];\n const fallbackHomeTeamHeader = headerTeams[1];\n\n const resolvedHomeTeamHeader = homeTeamHeader || fallbackHomeTeamHeader;\n const resolvedAwayTeamHeader = awayTeamHeader || fallbackAwayTeamHeader;\n\n if (!resolvedHomeTeamHeader || !resolvedAwayTeamHeader) {\n return null;\n }\n\n const homeTeam = teams[resolvedHomeTeamHeader.$key];\n const awayTeam = teams[resolvedAwayTeamHeader.$key];\n\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n const statistics: {\n displayName: string;\n homeTeamValue: number;\n awayTeamValue: number;\n awayTeamDisplayValue: string;\n homeTeamDisplayValue: string;\n }[] = [];\n\n const statisticsSet = new Set<string>();\n const rawAwayStats = awayTeam.statistics || [];\n const rawHomeStats = homeTeam.statistics || [];\n const awayStatistics = (rawAwayStats as TeamStatistic[]).filter(\n isTeamStatistic\n );\n const homeStatistics = (rawHomeStats as TeamStatistic[]).filter(\n isTeamStatistic\n );\n\n [...awayStatistics, ...homeStatistics].forEach((st) => {\n statisticsSet.add(st.$key);\n });\n\n // Ensure all statistics from both teams are included\n statisticsSet.forEach((statKey) => {\n const awayStat = awayStatistics.find((st) => st.$key === statKey);\n const homeStat = homeStatistics.find((st) => st.$key === statKey);\n\n if (!awayStat || !homeStat) {\n return;\n }\n\n statistics.push({\n displayName: awayStat?.displayName || homeStat?.displayName || '',\n awayTeamValue: awayStat?.value || 0,\n homeTeamValue: homeStat?.value || 0,\n awayTeamDisplayValue: awayStat?.displayValue || '0',\n homeTeamDisplayValue: homeStat?.displayValue || '0',\n });\n });\n\n const buildLinescores = (t: HeaderLikeTeam): string[] => {\n if (t.linescores && t.linescores.length > 0) {\n return t.linescores.map((l) => l.displayValue);\n }\n if (typeof t.score === 'string' && t.score.length > 0) {\n return [t.score];\n }\n return [];\n };\n\n const maybeDetails = (t: HeaderLikeTeam): string[] | undefined => {\n if (Array.isArray(t.details) && t.details.filter(Boolean).length > 0) {\n return t.details.filter(Boolean);\n }\n return undefined;\n };\n\n const awayDetails = maybeDetails(resolvedAwayTeamHeader);\n const homeDetails = maybeDetails(resolvedHomeTeamHeader);\n\n let linescoresHeader = rawLinescoresHeader;\n let awayTeamLinescores = buildLinescores(resolvedAwayTeamHeader);\n let homeTeamLinescores = buildLinescores(resolvedHomeTeamHeader);\n\n // If more than 9 innings are present, show only the last 9 innings plus R, H, E\n const hasLinescoresAndHeader =\n linescoresHeader.length > 0 &&\n (awayTeamLinescores.length > 0 || homeTeamLinescores.length > 0);\n\n if (hasLinescoresAndHeader && linescoresRowHeader === 'teamLogo') {\n const lastThreeHeaders = linescoresHeader.slice(-3);\n const isMlbFormat =\n lastThreeHeaders.includes('R') ||\n lastThreeHeaders.includes('H') ||\n lastThreeHeaders.includes('E');\n\n if (isMlbFormat && linescoresHeader.length > 12) {\n // More than 9 innings + 3 stats (R, H, E)\n const statsCount = 3; // R, H, E\n const inningsCount = linescoresHeader.length - statsCount;\n const maxInningsToShow = 9;\n\n if (inningsCount > maxInningsToShow) {\n const inningsToRemove = inningsCount - maxInningsToShow;\n\n // Slice header to keep last 9 innings + stats (R, H, E)\n linescoresHeader = linescoresHeader.slice(inningsToRemove);\n\n // Apply same slicing to team linescores\n awayTeamLinescores = awayTeamLinescores.slice(inningsToRemove);\n homeTeamLinescores = homeTeamLinescores.slice(inningsToRemove);\n }\n }\n }\n\n const isLive =\n response.gameState === 'in' ||\n response.gameState === 'post' ||\n isLiveFromHeaderSource;\n\n return {\n type: 'headerTeam',\n linescoresHeader,\n linescoresRowHeader,\n isLive,\n statistics,\n awayTeam: {\n abbreviation: awayTeam.abbreviation,\n color: awayTeam.color,\n id: awayTeam.id,\n linescores: awayTeamLinescores,\n logo: awayTeam.logo,\n name: awayTeam.name,\n record: awayTeam.record,\n ...(awayDetails ? { details: awayDetails } : {}),\n },\n homeTeam: {\n abbreviation: homeTeam.abbreviation,\n color: homeTeam.color,\n id: homeTeam.id,\n linescores: homeTeamLinescores,\n logo: homeTeam.logo,\n name: homeTeam.name,\n record: homeTeam.record,\n ...(homeDetails ? { details: homeDetails } : {}),\n },\n };\n }\n\n private parseRecentGames(\n response: StatsApiResponse\n ): RecentGamesStatsItem | null {\n const teams = response.entities?.teams;\n const previousGames = response.previousGames;\n\n if (!teams || !previousGames || previousGames.length === 0) {\n return null;\n }\n\n const awayTeamPreviousGame = previousGames.find(\n (game) => game?.displayOrder === 1\n );\n\n const homeTeamPreviousGame = previousGames.find(\n (game) => game?.displayOrder === 2\n );\n\n if (!awayTeamPreviousGame || !homeTeamPreviousGame) {\n return null;\n }\n\n if (!awayTeamPreviousGame.events || !homeTeamPreviousGame.events) {\n return null;\n }\n\n if (!awayTeamPreviousGame.team?.$key || !homeTeamPreviousGame.team?.$key) {\n return null;\n }\n\n const awayTeam = teams[awayTeamPreviousGame.team.$key];\n const homeTeam = teams[homeTeamPreviousGame.team.$key];\n\n if (!awayTeam || !homeTeam) {\n return null;\n }\n\n const previousGame: RecentGamesStatsItem = {\n type: 'recentGames',\n awayTeam: {\n events: [...awayTeamPreviousGame.events]\n .reverse()\n .filter((event) => event?.team?.$key)\n .map((event) => {\n const eventTeam = teams[event.team.$key];\n\n return {\n gameResult: event.gameResult,\n homeAway: event.team.homeAway,\n score: event.score,\n teamLogo: eventTeam?.logo,\n };\n }),\n logo: awayTeam.logo,\n name: awayTeam.shortDisplayName,\n },\n homeTeam: {\n events: [...homeTeamPreviousGame.events]\n .reverse()\n .filter((event) => event?.team?.$key)\n .map((event) => {\n const eventTeam = teams[event.team.$key];\n\n return {\n gameResult: event.gameResult,\n homeAway: event.team.homeAway,\n score: event.score,\n teamLogo: eventTeam?.logo,\n };\n }),\n logo: homeTeam.logo,\n name: homeTeam.shortDisplayName,\n },\n };\n\n return previousGame;\n }\n\n private parseWinProbability(\n response: StatsApiResponse\n ): WinProbabilityStatsItem | null {\n const winProbability = response.winProbability;\n if (\n !winProbability ||\n !winProbability.homeTeam ||\n !winProbability.awayTeam\n ) {\n return null;\n }\n\n const teams = response.entities?.teams;\n if (!teams) {\n return null;\n }\n\n const homeTeam = teams[winProbability.homeTeam.team.$key];\n const awayTeam = teams[winProbability.awayTeam.team.$key];\n\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n return {\n type: 'winProbability',\n chartImageUrl: winProbability.imageUrl,\n awayTeam: {\n id: awayTeam.id,\n abbreviation: awayTeam.abbreviation,\n logo: awayTeam.logo,\n winPercentage: winProbability.awayTeam.winPercentage,\n },\n homeTeam: {\n id: homeTeam.id,\n abbreviation: homeTeam.abbreviation,\n logo: homeTeam.logo,\n winPercentage: winProbability.homeTeam.winPercentage,\n },\n };\n }\n\n private parseGameLeaders(\n response: StatsApiResponse\n ): GameLeadersStatsItem | null {\n if (!response.entities?.athletes || !response.entities?.teams) {\n return null;\n }\n\n const leaders = response.leaders;\n const isPre = response.gameState === 'pre';\n if (!leaders || leaders.length === 0) {\n return null;\n }\n\n const items: GameLeadersStatsItem['items'] = [];\n for (const leader of leaders) {\n if (!leader.away || !leader.home) {\n continue;\n }\n\n if (!leader.away?.athlete?.$key || !leader.home?.athlete?.$key) {\n continue;\n }\n\n const awayAthlete = response.entities.athletes[leader.away.athlete.$key];\n const homeAthlete = response.entities.athletes[leader.home.athlete.$key];\n\n if (!awayAthlete || !homeAthlete) {\n continue;\n }\n\n const awayAthleteStatistics = leader.away.athlete.statistics || [];\n const homeAthleteStatistics = leader.home.athlete.statistics || [];\n\n const value: GameLeadersStatsItem['items'][number] = {\n displayName: leader.displayName,\n awayAthlete: {\n id: awayAthlete.id,\n displayName: awayAthlete.displayName,\n headshot: awayAthlete.headshot\n ? setImageDimensions(awayAthlete.headshot, 256, 144)\n : '',\n position: awayAthlete.position?.abbreviation || '-',\n shortName: awayAthlete.shortName,\n jersey: awayAthlete.jersey,\n statistics: awayAthleteStatistics,\n },\n homeAthlete: {\n id: homeAthlete.id,\n displayName: homeAthlete.displayName,\n headshot: homeAthlete.headshot\n ? setImageDimensions(homeAthlete.headshot, 256, 144)\n : '',\n position: homeAthlete.position?.abbreviation || '-',\n shortName: homeAthlete.shortName,\n jersey: homeAthlete.jersey,\n statistics: homeAthleteStatistics,\n },\n };\n\n items.push(value);\n }\n\n if (!items.length) {\n return null;\n }\n\n return {\n type: 'gameLeaders',\n items,\n displayText: isPre ? 'Season Leaders' : 'Game Leaders',\n };\n }\n\n private parseActiveAthletes(\n response: StatsApiResponse\n ): ActiveAthletesItem | null {\n const activeAthletes = response.activeAthletes;\n const { awayTeam, homeTeam } = this.getActiveAthletesTeamInfo(response);\n const athletes: ActiveAthletesItem['athletes'] = [];\n\n if (\n !response.entities?.athletes ||\n !activeAthletes ||\n awayTeam.index === -1 ||\n homeTeam.index === -1\n ) {\n return null;\n }\n\n for (\n let i = 0;\n i < activeAthletes.teams[awayTeam.index].athletes.length;\n i++\n ) {\n const awayAthlete = activeAthletes.teams[awayTeam.index].athletes[i];\n const homeAthlete = activeAthletes.teams[homeTeam.index].athletes[i];\n\n if (!awayAthlete?.$key || !homeAthlete?.$key) {\n continue;\n }\n\n const awayAthleteInfo = response.entities.athletes[awayAthlete.$key];\n const homeAthleteInfo = response.entities.athletes[homeAthlete.$key];\n\n if (!awayAthleteInfo || !homeAthleteInfo) {\n continue;\n }\n\n const awayAthleteStatistics: {\n displayValue: string;\n abbreviation: string;\n value: number;\n }[] = [];\n const homeAthleteStatistics: {\n displayValue: string;\n abbreviation: string;\n value: number;\n }[] = [];\n\n const awayStatLine = awayAthlete.statLine || '';\n const homeStatLine = homeAthlete.statLine || '';\n\n awayStatLine\n .trim()\n .split(',')\n .forEach((st, index) => {\n const [awayDisplayValue, awayAbbreviation] = st.trim().split(' ');\n const homeStats = homeStatLine.trim().split(',')[index];\n\n if (!homeStats) {\n return;\n }\n\n const [homeDisplayValue, homeAbbreviation] = homeStats\n .trim()\n .split(' ');\n\n awayAthleteStatistics.push({\n displayValue: awayDisplayValue || '0',\n abbreviation: awayAbbreviation || '-',\n value: parseFloat(awayDisplayValue) || 0,\n });\n\n homeAthleteStatistics.push({\n displayValue: homeDisplayValue || '0',\n abbreviation: homeAbbreviation || '-',\n value: parseFloat(homeDisplayValue) || 0,\n });\n });\n\n athletes.push({\n awayAthlete: {\n id: awayAthleteInfo.id,\n displayName: awayAthleteInfo.displayName,\n headshot: awayAthleteInfo.headshot\n ? setImageDimensions(awayAthleteInfo.headshot, 256, 144)\n : '',\n position: awayAthleteInfo.position?.abbreviation || '-',\n shortName: awayAthleteInfo.shortName,\n jersey: awayAthleteInfo.jersey,\n statistics: awayAthleteStatistics,\n minifiedStatistics: awayAthlete.statLine,\n },\n homeAthlete: {\n id: homeAthleteInfo.id,\n displayName: homeAthleteInfo.displayName,\n headshot: homeAthleteInfo.headshot\n ? setImageDimensions(homeAthleteInfo.headshot, 256, 144)\n : '',\n position: homeAthleteInfo.position?.abbreviation || '-',\n shortName: homeAthleteInfo.shortName,\n jersey: homeAthleteInfo.jersey,\n statistics: homeAthleteStatistics,\n minifiedStatistics: homeAthlete.statLine,\n },\n });\n }\n\n if (!athletes.length) {\n return null;\n }\n\n return {\n type: 'activeAthletes',\n awayTeam,\n homeTeam,\n athletes,\n displayText: activeAthletes.displayText,\n };\n }\n\n private getActiveAthletesTeamInfo(\n data: StatsApiResponse\n ): GetTeamInfoResponse {\n const teams = data.activeAthletes?.teams || [];\n let awayTeam: GetTeamInfoResponse['awayTeam'] = {\n index: -1,\n id: '',\n logo: '',\n name: '-',\n };\n let homeTeam: GetTeamInfoResponse['homeTeam'] = {\n index: -1,\n id: '',\n logo: '',\n name: '-',\n };\n\n const entitiesTeams = data.entities?.teams;\n if (!entitiesTeams) {\n return { awayTeam, homeTeam };\n }\n\n for (let i = 0; i < teams.length; i++) {\n const teamInfo = teams[i];\n const team = entitiesTeams[teamInfo.team.$key];\n\n if (!team) {\n continue;\n }\n\n if (team.homeAway === 'away') {\n awayTeam = {\n index: i,\n id: team.id,\n logo: team.logo,\n name: team.name || '-',\n };\n } else if (team.homeAway === 'home') {\n homeTeam = {\n index: i,\n id: team.id,\n logo: team.logo,\n name: team.name || '-',\n };\n }\n }\n\n return { awayTeam, homeTeam };\n }\n\n private parseScoringSummary(\n data: StatsApiResponse\n ): ScoringSummaryItem | null {\n const scoringSummary = data.scoringSummary;\n if (!scoringSummary || !scoringSummary.sections) {\n return null;\n }\n\n const teams = data.entities?.teams;\n const athletes = data.entities?.athletes;\n\n // Handle MLB Scoring Summary\n if (isMlbScoringSummary(scoringSummary)) {\n const sections: ScoringSummarySection[] = [];\n\n for (const section of scoringSummary.sections) {\n if (!section.title || !section.items?.length) {\n continue;\n }\n const items: ScoringSummarySectionTeam[] = [];\n for (const item of section.items) {\n if (!item?.team?.$key || !item?.athlete?.$key) {\n continue;\n }\n const team = teams?.[item.team.$key];\n const athlete = athletes?.[item.athlete.$key];\n const athleteNumber = `#${athlete?.jersey || ''}`;\n const athleteName = athlete?.shortName || '';\n\n if (!team || !athlete) {\n continue;\n }\n\n const textParts: Array<{ featured: boolean; title: string }> = [];\n if (athleteNumber) {\n textParts.push({\n featured: false,\n title: athleteNumber,\n });\n }\n if (athleteName) {\n textParts.push({\n featured: true,\n title: athleteName,\n });\n }\n\n items.push({\n teamLogo: team?.logo || '',\n teamName: team?.abbreviation,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 200, 144)\n : undefined,\n athleteShortName: athlete?.shortName || '',\n athleteJersey: athlete?.jersey || '',\n athletePosition: athlete?.position?.abbreviation || '',\n text: item?.text || '',\n shortText: textParts,\n header: (item?.header || []).map((h, index) => ({\n featured: h.featured ?? false,\n title: `${h.title ?? ''}${index === 0 ? ',' : ''}`,\n })),\n });\n }\n if (items.length > 0) {\n sections.push({\n title: section.title,\n items,\n });\n }\n }\n\n if (sections.length === 0) {\n return null;\n }\n return {\n type: 'scoringSummary',\n tag: 'mlb',\n title: scoringSummary.title || 'Scoring Summary',\n sections,\n };\n }\n // Handle Hockey Scoring Summary - transform to unified format\n else if (isHockeyScoringSummary(scoringSummary)) {\n const hockeySummary = scoringSummary as RawScoringSummary;\n const sections: ScoringSummarySection[] = [];\n\n for (const section of hockeySummary.sections || []) {\n const items: ScoringSummarySectionTeam[] = [];\n\n for (const item of section.items || []) {\n if (!item?.team?.$key || !item?.athlete?.$key || !item?.title) {\n continue;\n }\n\n const team =\n item.team && item.team.$key ? teams?.[item.team.$key] : undefined;\n const atheleteKey = item.athlete?.$key || '';\n const athlete = athletes?.[atheleteKey];\n const itemTitle = item.title || '';\n const [athleteNumber, ...athleteNameWithAssists] = itemTitle.split(\n ' '\n );\n let athleteAssists = '';\n let athleteName = '';\n if (athleteNameWithAssists.length > 0) {\n athleteAssists =\n athleteNameWithAssists[athleteNameWithAssists.length - 1];\n athleteName = athleteNameWithAssists.slice(0, -1).join(' ');\n }\n\n const header: Array<{ featured: boolean; title: string }> = [];\n if (item.clock) {\n header.push({ featured: true, title: item.clock });\n }\n if (team?.abbreviation) {\n header.push({ featured: false, title: team.abbreviation });\n }\n\n const textParts: Array<{ featured: boolean; title: string }> = [];\n if (athleteNumber) {\n textParts.push({ featured: false, title: athleteNumber });\n }\n if (athleteName) {\n textParts.push({ featured: true, title: athleteName });\n }\n if (athleteAssists) {\n textParts.push({ featured: false, title: athleteAssists });\n }\n\n items.push({\n teamLogo: team?.logo || '',\n teamName: team?.abbreviation || '',\n header,\n text: item?.description || '',\n shortText: textParts,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 200, 144)\n : undefined,\n athleteShortName: athleteName,\n athletePosition: athlete?.position?.abbreviation || '',\n athleteJersey: athleteNumber,\n });\n }\n\n if (items.length > 0) {\n sections.push({\n title: section?.title || '',\n items,\n });\n }\n }\n\n if (sections.length === 0) {\n return null;\n }\n\n return {\n type: 'scoringSummary',\n tag: 'hockey',\n title: hockeySummary.title || 'Scoring Summary',\n sections,\n };\n }\n\n return null;\n }\n\n private parsePenalties(data: StatsApiResponse): PenaltiesItem | null {\n const penalties = data.penaltySummary;\n if (!penalties || !penalties.sections) {\n return null;\n }\n\n const teams = data.entities?.teams;\n const athletes = data.entities?.athletes;\n\n const sections = penalties.sections.map(\n (section): ScoringSummarySection => {\n const items = section.items\n .filter((item) => item?.team?.$key && item?.athlete?.$key)\n .map(\n (item): ScoringSummarySectionTeam => {\n const team = teams?.[item.team.$key];\n const athlete = athletes?.[item.athlete.$key];\n const [athleteNumber, ...athleteName] = item.title.split(' ');\n const athleteDisplayName = (athleteName ?? []).join(' ') || '';\n\n const textParts: Array<{ featured: boolean; title: string }> = [];\n if (athleteNumber) {\n textParts.push({\n featured: false,\n title: athleteNumber,\n });\n }\n if (athleteDisplayName) {\n textParts.push({\n featured: true,\n title: athleteDisplayName,\n });\n }\n\n return {\n teamLogo: team?.logo || '',\n teamName: team?.abbreviation || '',\n header: [{ title: item.clock || '', featured: false }],\n text: item.description || '',\n shortText: textParts,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 200, 144)\n : undefined,\n athleteShortName: athleteName.join(' '),\n athletePosition: athlete?.position?.abbreviation || '',\n athleteJersey: athleteNumber || '',\n };\n }\n );\n\n return {\n title: section.title,\n items,\n };\n }\n );\n\n if (!sections.length || sections.every((s) => s.items.length === 0)) {\n return null;\n }\n\n return {\n type: 'penalties',\n tag: 'penalties',\n title: penalties.title,\n sections,\n };\n }\n\n private parsePlayerSeasonStats(\n data: StatsApiResponse\n ): PlayerSeasonStatsItem | null {\n const playerStats = data.playerStats;\n const teams = data.entities?.teams;\n const athletes = data.entities?.athletes;\n\n if (!playerStats?.teams?.length || !teams) {\n return null;\n }\n\n const parsedTeams: PlayerSeasonStatsTeam[] = [];\n\n for (const playerStatsTeam of playerStats.teams) {\n if (!playerStatsTeam.$key) {\n continue;\n }\n\n const team = teams[playerStatsTeam.$key];\n if (!team) {\n continue;\n }\n\n const sections: PlayerSeasonStatsSection[] = [];\n\n for (const section of playerStatsTeam.sections || []) {\n if (!section.title || !section.items?.length) {\n continue;\n }\n\n const items: PlayerSeasonStatsPlayerItem[] = [];\n\n for (const item of section.items) {\n if (!item.title) {\n continue;\n }\n\n const athleteKey = item.athlete?.$key;\n const athlete: Athlete | undefined = athleteKey\n ? athletes?.[athleteKey]\n : undefined;\n\n const statistics = item.athlete?.statistics || [];\n const featuredStat = statistics.find((s) => s.featured);\n\n items.push({\n title: item.title,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 256, 144)\n : '',\n position: athlete?.position?.abbreviation || '',\n jersey: athlete?.jersey || '',\n featuredStat: featuredStat\n ? {\n displayValue: featuredStat.displayValue || '',\n label: featuredStat.label || '',\n }\n : null,\n statistics: statistics\n .filter((s) => !s.featured)\n .map((s) => ({\n displayValue: s.displayValue || '',\n label: s.label || '',\n })),\n playerStatus: item?.status\n ? {\n displayName: item.status.displayName ?? '',\n type: item.status.type ?? '',\n }\n : null,\n });\n }\n\n if (items.length > 0) {\n sections.push({\n title: section.title,\n items,\n });\n }\n }\n\n if (sections.length > 0) {\n parsedTeams.push({\n teamKey: playerStatsTeam.$key,\n shortDisplayName: team.shortDisplayName || team.displayName || '',\n color: team.color || '',\n sections,\n });\n }\n }\n\n if (parsedTeams.length === 0) {\n return null;\n }\n\n return {\n type: 'playerSeasonStats',\n teams: parsedTeams,\n };\n }\n}\n\nexport default StatsViewModel;\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/index.ts","webpack:///./src/modules/maestro/hello-world/HelloWorldView.styles.css","webpack:///./src/modules/maestro/hello-world/HelloWorldView.styles.css?6c30","webpack:///./src/modules/maestro/hello-world/HelloWorldImage.tsx","webpack:///./src/modules/maestro/hello-world/HelloWorldView.tsx","webpack:///./src/modules/maestro/hello-world/index.ts"],"names":["Icon","___CSS_LOADER_EXPORT___","push","module","i","options","locals","HelloWorldImage","React","createElement","className","width","height","viewBox","fill","xmlns","d","stroke","strokeWidth","x","y","transform","filter","id","filterUnits","colorInterpolationFilters","floodOpacity","result","in","type","values","radius","operator","dy","stdDeviation","in2","mode","PANEL_TYPE_NAME_MAP","chat","shopifyBlockPanel","HelloWorldView","Component","constructor","props","super","vm","SDK","getMaestroEventViewModel","panelManagerViewModel","this","state","unlistedPanels","getUnlistedPanels","render","data-has-unlisted","length","p","map","panel","key","iconName"],"mappings":"0FAAA,YAEeA,MAAI,G,iCCFnB,2BAGIC,EAHJ,MAG8B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,EAAI,gwDAAiwD,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,yEAAyE,MAAQ,GAAG,SAAW,wvBAAwvB,eAAiB,CAAC,iwDAAiwD,WAAa,MAE76I,O,qFCJXC,EAAU,CAEd,OAAiB,OACjB,WAAoB,G,GAEP,IAAI,IAASA,GAIX,IAAQC,O,MCsJRC,MAhKSA,IAEpBC,IAAAC,cAAA,OAAKC,UAAU,qBACbF,IAAAC,cAAA,OACEE,MAAM,MACNC,OAAO,MACPC,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAENP,IAAAC,cAAA,QACEO,EAAE,slBACFF,KAAK,YAEPN,IAAAC,cAAA,QACEO,EAAE,oFACFF,KAAK,UACLG,OAAO,UACPC,YAAY,YAEdV,IAAAC,cAAA,QACEO,EAAE,sRACFF,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,UACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,8BACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,KACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,yBACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,UACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,8BACVP,KAAK,YAEPN,IAAAC,cAAA,KAAGa,OAAO,6BACRd,IAAAC,cAAA,QACEE,MAAM,IACNC,OAAO,KACPS,UAAU,6CACVP,KAAK,aAGTN,IAAAC,cAAA,QACEU,EAAE,UACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,8BACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,SACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,6BACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,UACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,8BACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,UACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,8BACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,SACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,6BACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,SACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,6BACVP,KAAK,YAEPN,IAAAC,cAAA,QACEU,EAAE,UACFC,EAAE,UACFT,MAAM,UACNC,OAAO,UACPS,UAAU,8BACVP,KAAK,YAEPN,IAAAC,cAAA,YACED,IAAAC,cAAA,UACEc,GAAG,sBACHJ,EAAE,KACFC,EAAE,KACFT,MAAM,KACNC,OAAO,KACPY,YAAY,iBACZC,0BAA0B,QAE1BjB,IAAAC,cAAA,WAASiB,aAAa,IAAIC,OAAO,uBACjCnB,IAAAC,cAAA,iBACEmB,GAAG,cACHC,KAAK,SACLC,OAAO,4CACPH,OAAO,cAETnB,IAAAC,cAAA,gBACEsB,OAAO,IACPC,SAAS,SACTJ,GAAG,cACHD,OAAO,iCAETnB,IAAAC,cAAA,YAAUwB,GAAG,MACbzB,IAAAC,cAAA,kBAAgByB,aAAa,QAC7B1B,IAAAC,cAAA,eAAa0B,IAAI,YAAYH,SAAS,QACtCxB,IAAAC,cAAA,iBACEoB,KAAK,SACLC,OAAO,oEAETtB,IAAAC,cAAA,WACE2B,KAAK,SACLD,IAAI,qBACJR,OAAO,iCAETnB,IAAAC,cAAA,WACE2B,KAAK,SACLR,GAAG,gBACHO,IAAI,+BACJR,OAAO,c,SC9IrB,MAAMU,EAAsB,CAC1BC,KAAM,OACNC,kBAAmB,WAGrB,MAAMC,UAAuBC,YAC3BC,YAAYC,GACVC,MAAMD,GACN,MAAME,EAAKC,UAAIC,2BAA2BC,sBAC1CC,KAAKC,MAAQ,CACXC,eAAgBN,EAAGO,qBAIvBC,SACE,MAAM,eAAEF,GAAmBF,KAAKC,MAEhC,OACE1C,IAAAC,cAAA,OACEC,UAAU,mBACV4C,oBAAmBH,EAAeI,OAAS,GAE3C/C,IAAAC,cAACF,EAAe,MAChBC,IAAAC,cAAA,OAAKC,UAAU,SAAQ,iBACvBF,IAAAC,cAAA,KAAGC,UAAU,gBAAe,2BAE1BF,IAAAC,cAAA,WAAM,wBAIP0C,EAAeI,OAAS,GACvB/C,IAAAC,cAAA,OAAKC,UAAU,sBACbF,IAAAC,cAAA,KAAGC,UAAU,wBAAuB,gDAElCF,IAAAC,cAAA,WACC,4CAEHD,IAAAC,cAAA,MAAIC,UAAU,oBACXyC,EACE7B,OAAQkC,GAAMA,EAAE3B,QAAQQ,GACxBoB,IAAKC,GACJlD,IAAAC,cAAA,MAAIkD,IAAKD,EAAM7B,KAAMnB,UAAU,OAC7BF,IAAAC,cAAA,OAAKC,UAAU,cACbF,IAAAC,cAACT,IAAI,CAAC4D,SAAUF,EAAM7B,KAAMlB,MAAO,GAAIC,OAAQ,MAEjDJ,IAAAC,cAAA,OAAKC,UAAU,eAEX2B,EACEqB,EAAM7B,aAcjBW,QCvEAA","file":"9.maestro-web-sdk.esm.js","sourcesContent":["import Icon from './Icon';\n\nexport default Icon;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".hello-world-view {\\n text-align: center;\\n background: transparent;\\n margin-top: 60px;\\n}\\n\\n.hello-world-view[data-has-unlisted='false'] {\\n padding: 191px 80px 0 80px;\\n}\\n\\n.hello-world-view .hello-world-image {\\n margin-bottom: 32px;\\n}\\n\\n.hello-world-view .title {\\n font-weight: 700;\\n font-size: 48px;\\n line-height: 56px;\\n font-family: var(--sdk-font-headline);\\n color: var(--sdk-text100);\\n text-align: center;\\n}\\n\\n.hello-world-view .subtitle {\\n font-weight: 400;\\n font-size: 27px;\\n line-height: 36px;\\n text-align: center;\\n margin: 10px 0 16px 0;\\n font-family: var(--sdk-font-title);\\n color: var(--sdk-text100);\\n}\\n\\n.hello-world-view .unsupported-panels {\\n position: relative;\\n}\\n\\n.hello-world-view .unsupported-text {\\n font-family: var(--sdk-font-body);\\n font-size: 21px;\\n line-height: 26px;\\n text-align: center;\\n color: var(--sdk-text200);\\n margin: 0;\\n}\\n\\n.hello-world-view .unsupported-list {\\n list-style: none;\\n padding: 0;\\n margin: 0;\\n margin-top: 24px;\\n position: absolute;\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n\\n.hello-world-view .unsupported-list li {\\n padding: 8px 0;\\n color: var(--sdk-text100);\\n text-align: left;\\n}\\n\\n.hello-world-view .unsupported-list .panel-icon {\\n vertical-align: middle;\\n display: inline-block;\\n margin-right: 8px;\\n border-radius: 50%;\\n background-color: var(--sdk-surface5);\\n width: 40px;\\n height: 40px;\\n color: var(--sdk-text200);\\n position: relative;\\n}\\n\\n.hello-world-view .unsupported-list .panel-icon > svg {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n}\\n\\n.hello-world-view .unsupported-list .panel-title {\\n vertical-align: middle;\\n display: inline-block;\\n color: var(--sdk-text200);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/modules/maestro/hello-world/HelloWorldView.styles.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;EAClB,uBAAuB;EACvB,gBAAgB;AAClB;;AAEA;EACE,0BAA0B;AAC5B;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,iBAAiB;EACjB,qCAAqC;EACrC,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,iBAAiB;EACjB,kBAAkB;EAClB,qBAAqB;EACrB,kCAAkC;EAClC,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,iCAAiC;EACjC,eAAe;EACf,iBAAiB;EACjB,kBAAkB;EAClB,yBAAyB;EACzB,SAAS;AACX;;AAEA;EACE,gBAAgB;EAChB,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,kBAAkB;EAClB,SAAS;EACT,2BAA2B;AAC7B;;AAEA;EACE,cAAc;EACd,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;EAClB,qCAAqC;EACrC,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,gCAAgC;AAClC;;AAEA;EACE,sBAAsB;EACtB,qBAAqB;EACrB,yBAAyB;AAC3B\",\"sourcesContent\":[\".hello-world-view {\\n text-align: center;\\n background: transparent;\\n margin-top: 60px;\\n}\\n\\n.hello-world-view[data-has-unlisted='false'] {\\n padding: 191px 80px 0 80px;\\n}\\n\\n.hello-world-view .hello-world-image {\\n margin-bottom: 32px;\\n}\\n\\n.hello-world-view .title {\\n font-weight: 700;\\n font-size: 48px;\\n line-height: 56px;\\n font-family: var(--sdk-font-headline);\\n color: var(--sdk-text100);\\n text-align: center;\\n}\\n\\n.hello-world-view .subtitle {\\n font-weight: 400;\\n font-size: 27px;\\n line-height: 36px;\\n text-align: center;\\n margin: 10px 0 16px 0;\\n font-family: var(--sdk-font-title);\\n color: var(--sdk-text100);\\n}\\n\\n.hello-world-view .unsupported-panels {\\n position: relative;\\n}\\n\\n.hello-world-view .unsupported-text {\\n font-family: var(--sdk-font-body);\\n font-size: 21px;\\n line-height: 26px;\\n text-align: center;\\n color: var(--sdk-text200);\\n margin: 0;\\n}\\n\\n.hello-world-view .unsupported-list {\\n list-style: none;\\n padding: 0;\\n margin: 0;\\n margin-top: 24px;\\n position: absolute;\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n\\n.hello-world-view .unsupported-list li {\\n padding: 8px 0;\\n color: var(--sdk-text100);\\n text-align: left;\\n}\\n\\n.hello-world-view .unsupported-list .panel-icon {\\n vertical-align: middle;\\n display: inline-block;\\n margin-right: 8px;\\n border-radius: 50%;\\n background-color: var(--sdk-surface5);\\n width: 40px;\\n height: 40px;\\n color: var(--sdk-text200);\\n position: relative;\\n}\\n\\n.hello-world-view .unsupported-list .panel-icon > svg {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n}\\n\\n.hello-world-view .unsupported-list .panel-title {\\n vertical-align: middle;\\n display: inline-block;\\n color: var(--sdk-text200);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js??ref--6-1!./HelloWorldView.styles.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import React from 'react';\n\nconst HelloWorldImage = () => {\n return (\n <div className=\"hello-world-image\">\n <svg\n width=\"376\"\n height=\"236\"\n viewBox=\"0 0 376 236\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M255.234 212.541H232.178V235.597H255.234V212.541ZM116.898 235.597H139.954V212.541H116.898V235.597ZM197.594 108.789H220.65V154.901H197.594V108.789ZM174.538 154.901H151.482V108.789H174.538V154.901ZM255.234 91.4965H243.706V79.9685H232.178V68.4404H214.886V45.3843H203.358V68.4404H168.774V45.3843H157.246V68.4404H139.954V79.9685H128.426V91.4965H116.898V131.845H93.8414V143.373H116.898V183.721H139.954V212.541H168.774V183.721H203.358V212.541H232.178V183.721H255.234V143.373H278.29V131.845H255.234V91.4965ZM278.29 131.845H289.818V68.4404H278.29V131.845ZM82.3134 131.845H93.8414V68.4404H82.3134V131.845Z\"\n fill=\"#2D2D2D\"\n />\n <path\n d=\"M262.396 50.3333L246.908 65.8205H262.396V80.7546H346.469V5.53113H262.396V50.3333Z\"\n fill=\"#101113\"\n stroke=\"#2D2D2D\"\n strokeWidth=\"6.63736\"\n />\n <path\n d=\"M278.746 57.5037V29.5141H286.311V39.9156H295.616V29.5141H303.18V57.5037H295.616V46.1944H286.311V57.5037H278.746ZM308.634 57.5037V29.5141H316.199V57.5037H308.634ZM323.408 48.1612L321.593 29.5141H331.011L329.195 48.1612H323.408ZM322.387 57.5037V51.0737H330.216V57.5037H322.387Z\"\n fill=\"#2D2D2D\"\n />\n <rect\n x=\"61.0623\"\n y=\"56.4176\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 61.0623 56.4176)\"\n fill=\"#2D2D2D\"\n />\n <rect\n x=\"50\"\n y=\"42.0366\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 50 42.0366)\"\n fill=\"#2D2D2D\"\n />\n <rect\n x=\"69.9121\"\n y=\"47.5674\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 69.9121 47.5674)\"\n fill=\"#2D2D2D\"\n />\n <g filter=\"url(#filter0_d_193_43290)\">\n <rect\n width=\"8\"\n height=\"12\"\n transform=\"matrix(4.37114e-08 1 1 -4.37114e-08 82 67)\"\n fill=\"#21EFA3\"\n />\n </g>\n <rect\n x=\"58.8499\"\n y=\"33.1868\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 58.8499 33.1868)\"\n fill=\"#2D2D2D\"\n />\n <rect\n x=\"78.762\"\n y=\"47.5677\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 78.762 47.5677)\"\n fill=\"#2D2D2D\"\n />\n <rect\n x=\"67.6997\"\n y=\"33.1868\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 67.6997 33.1868)\"\n fill=\"#2D2D2D\"\n />\n <rect\n x=\"256.865\"\n y=\"8.84982\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 256.865 8.84982)\"\n fill=\"#101113\"\n />\n <rect\n x=\"343.15\"\n y=\"8.84982\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 343.15 8.84982)\"\n fill=\"#101113\"\n />\n <rect\n x=\"343.15\"\n y=\"86.2857\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 343.15 86.2857)\"\n fill=\"#101113\"\n />\n <rect\n x=\"256.865\"\n y=\"86.2857\"\n width=\"8.84982\"\n height=\"8.84982\"\n transform=\"rotate(-90 256.865 86.2857)\"\n fill=\"#101113\"\n />\n <defs>\n <filter\n id=\"filter0_d_193_43290\"\n x=\"64\"\n y=\"50\"\n width=\"48\"\n height=\"44\"\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\"\n />\n <feMorphology\n radius=\"3\"\n operator=\"dilate\"\n in=\"SourceAlpha\"\n result=\"effect1_dropShadow_193_43290\"\n />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"7.5\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.129412 0 0 0 0 0.937255 0 0 0 0 0.639216 0 0 0 0.25 0\"\n />\n <feBlend\n mode=\"normal\"\n in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_193_43290\"\n />\n <feBlend\n mode=\"normal\"\n in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_193_43290\"\n result=\"shape\"\n />\n </filter>\n </defs>\n </svg>\n </div>\n );\n};\n\nexport default HelloWorldImage;\n","import React, { Component } from 'react';\nimport './HelloWorldView.styles.css';\nimport SDK from '@/index';\nimport { PanelInfo } from '@/view-models/PanelManagerViewModel';\nimport HelloWorldImage from './HelloWorldImage';\nimport Icon from '@/components/atoms/SvgIcon';\n\ntype State = {\n unlistedPanels: PanelInfo[];\n};\n\nconst PANEL_TYPE_NAME_MAP = {\n chat: 'Chat',\n shopifyBlockPanel: 'Shopify',\n} as const;\n\nclass HelloWorldView extends Component<{}, State> {\n constructor(props: {}) {\n super(props);\n const vm = SDK.getMaestroEventViewModel().panelManagerViewModel;\n this.state = {\n unlistedPanels: vm.getUnlistedPanels(),\n };\n }\n\n render() {\n const { unlistedPanels } = this.state;\n\n return (\n <div\n className=\"hello-world-view\"\n data-has-unlisted={unlistedPanels.length > 0}\n >\n <HelloWorldImage />\n <div className=\"title\">HELLO, WORLD!</div>\n <p className=\"T20 subtitle\">\n Panel component has been\n <br />\n installed correctly.\n </p>\n\n {unlistedPanels.length > 0 && (\n <div className=\"unsupported-panels\">\n <p className=\"T10 unsupported-text\">\n However, some panels currently active on this\n <br />\n {\"channel aren't supported on this device:\"}\n </p>\n <ul className=\"unsupported-list\">\n {unlistedPanels\n .filter((p) => p.type in PANEL_TYPE_NAME_MAP)\n .map((panel) => (\n <li key={panel.type} className=\"T10\">\n <div className=\"panel-icon\">\n <Icon iconName={panel.type} width={24} height={24} />\n </div>\n <div className=\"panel-title\">\n {\n PANEL_TYPE_NAME_MAP[\n panel.type as keyof typeof PANEL_TYPE_NAME_MAP\n ]\n }\n </div>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default HelloWorldView;\n","import HelloWorldView from './HelloWorldView';\n\nexport default HelloWorldView;\n"],"sourceRoot":""}
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  // ../../../@/modules/espn/fantasy/types
8
8
  // ../../../@/modules/espn/shop/types
9
9
  // ../../../@/modules/maestro/builder/view-model/BuilderPanelViewModel
10
+ // ../../../@/modules/fox/multi-view/interfaces/IMultiViewViewModel
10
11
  // ../../../@/models/ITheme
11
12
  // ../../../@/helpers/Observable
12
13
 
@@ -350,6 +351,7 @@ declare module '@maestro_io/maestro-web-sdk/view-models/MaestroEventViewModel' {
350
351
  import { IFantasyViewModel } from '@/modules/espn/fantasy/types';
351
352
  import { IShopViewModel } from '@/modules/espn/shop/types';
352
353
  import { BuilderPanelViewModel } from '@/modules/maestro/builder/view-model/BuilderPanelViewModel';
354
+ import { IMultiViewViewModel } from '@/modules/fox/multi-view/interfaces/IMultiViewViewModel';
353
355
  export class MaestroEventViewModel extends ViewModel implements IMaestroEvent {
354
356
  delegate: IMaestroEventDelegate;
355
357
  keyPlaysViewModel: IKeyPlaysViewModel | null;
@@ -358,6 +360,7 @@ declare module '@maestro_io/maestro-web-sdk/view-models/MaestroEventViewModel' {
358
360
  statsViewModel: IStatsViewModel | null;
359
361
  shopViewModel: IShopViewModel | null;
360
362
  builderPanelViewModel: BuilderPanelViewModel | null;
363
+ multiViewViewModel: IMultiViewViewModel | null;
361
364
  panelManagerViewModel: PanelManagerViewModel;
362
365
  navigation: SpatialNavigation;
363
366
  constructor(eventId: string | undefined, pageId: string | undefined, delegate: IMaestroEventDelegate, analyticsService: AnalyticsService);
@@ -560,7 +563,7 @@ declare module '@maestro_io/maestro-web-sdk/models/IPanel' {
560
563
  readonly ESPN_SHOP: "espnShop";
561
564
  readonly HELLO_WORLD: "helloWorld";
562
565
  readonly FOX_KEY_PLAYS: "foxKeyPlays";
563
- readonly FOX_MULTI_VIEW: "foxMultiview";
566
+ readonly FOX_MULTI_VIEW: "foxMultiView";
564
567
  readonly FOX_STATS: "foxStats";
565
568
  readonly BUILDER_BLOCK_PANEL: "builderBlockPanel";
566
569
  };