{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/index.cjs","../../src/players/index.ts","../../src/utils.ts","../../src/patterns.ts","../../src/sdk/hlsAdPlayer.ts","../../src/players/HlsPlayer.tsx","../../src/sdk/pal.ts","../../src/utils/mqttConfig.ts","../../src/utils/mqttClient.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/utils/browserCompat.ts","../../src/player/Scte35Parser.ts","../../src/player/Scte35CueManager.ts","../../src/player/AdConfigManager.ts","../../src/player/AdTimingService.ts","../../src/player/PlaceholderLayer.ts","../../src/player/HlsEngine.ts","../../src/player/PlayerControls.ts"],"names":["__create","Object","create","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","__getProtoOf","getOwnPropertyNames","getPrototypeOf","__export","target","all","name","__defProp","get","enumerable","from","key","__hasOwnProp","call","to","except","desc","mod","__toESM","isNodeMode","__copyProps","__esModule","value","__toCommonJS","players_exports","default","players_default","exports","import_react","require","lazy","reactLazy","IS_BROWSER","window","document","IS_GLOBAL","globalThis","IS_IOS","test","navigator","userAgent","IS_SAFARI","HLS_EXTENSIONS","HLS_PATHS","DASH_EXTENSIONS","AUDIO_EXTENSIONS","canPlay","hls","url","dash","video","VIDEO_EXTENSIONS","audio","file","originalMutedState","licenseKey","options","import_hls","MAX_VAST_WRAPPER_DEPTH","createHlsAdPlayer","contentVideo","adPlaying","listeners","Map","mainHlsInstance","adVideoElement","adHls","adContainerEl","podAds","sessionId","destroyed","pendingTimeouts","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","error","console","warn","currentLevel","bitrate","level","generateSessionId","Math","Date","now","random","toString","substr","fireTrackingPixels","urls","length","forEach","trackingUrl","includes","img","Image","src","log","getMainStreamQuality","levels","autoLevel","loadLevel","width","height","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","scoredFiles","map","widthDiff","abs","heightDiff","resolutionDiff","fileBitrate","bitrateDiff","score","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","type","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","createEmptyTrackingUrls","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","scope","trackingUrls","querySelectorAll","el","textContent","trim","push","getAttribute","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","split","duration","parseInt","mediaFileElements","mf","index","bitrateAttr","bitrateValue","ad","id","parseAdElement","fetchVastXml","vastTagUrl","credentials","requestVast","creds","fetch","mode","headers","referrerPolicy","response","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","fetchAndParsePod","adElements","ads","resolved","aSeq","bSeq","aVal","Number","isFinite","MAX_SAFE_INTEGER","bVal","createAdVideoElement","createElement","style","position","left","top","objectFit","backgroundColor","playsInline","muted","volume","setupAdEventListeners","currentAd","addEventListener","progress","currentTime","handleAdComplete","setAdPlayingFlag","isPlaying","podIndex","advanceToNextPodAd","e","handleAdError","ended","dataset","stormcloudAdPlaying","resetQuartileTracking","preserveImpression","loadCurrentAdMedia","isHlsAd","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","play","catch","ERROR","_event","data","fatal","canPlayType","load","total","display","pointerEvents","continueLiveStreamDuringAds","paused","initialize","container","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","preloaded","Promise","reject","preloadedAds","has","delete","resolve","contentVolume","originalVolume","max","min","stop","previousMutedState","visibility","opacity","timeoutId","clearTimeout","remove","removeChild","clear","preloadingAds","isAdPlaying","resize","listener","Set","add","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","existing","goog","pal","timeout","setTimeout","script","async","setAttribute","onload","onerror","consentSettings","allowStorage","sendAdTouch","head","getOrCreateNonceLoader","ConsentSettings","NonceLoader","createPalNonceManager","currentNonce","currentNonceManager","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","URL","searchParams","base","replace","sep","encodeURIComponent","sendPlaybackStart","sendPlaybackEnd","sendAdClick","reset","brokerPort","mqttConfig","buildPlayerTopic","client","status","initMQTTClient","DEFAULT_MQTT_CONFIG","enabled","brokerAddress","username","password","topicPrefix","qos","isMQTTEnabled","buildMQTTBrokerUrl","channel","import_mqtt","LOG","clientId","slice","mqtt","connect","keepalive","clean","reconnectPeriod","connectTimeout","queueQoSZero","err","info","message","publishMQTT","topic","ensureMQTTClient","publish","JSON","stringify","AIRY_DEFAULT_CONTENT_URL","AIRY_WEBOS_APP_ID","AIRY_TIZEN_APP_ID","AIRY_ROKU_APP_ID","AIRY_APP_NAME","CTV_SESSION_STORAGE_KEY","PLAYER_ID_STORAGE_KEY","LG_TEST_APP_ID","_lgTestDeviceId","getLgTestDeviceId","isLgWebOS","getDefaultAppId","AIRY_ANDROID_APP_ID","ua","DEVICE_ID_STORAGE_KEYS","resolveVastEnvironmentSignals","isCtv","platformLat","lg","deviceId","bridgeSignals","readStoredDeviceId","limitAdTracking","platformDevice","deviceIdType","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","appId","getOrCreateCtvSessionId","deviceTypeHint","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","ANDROID_ID_TYPES","resolveNativeDeviceId","readNativeBridgeSignals","readPlatformNativeDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","readPersistentId","writePersistentId","createUuid","readCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","parts","cookie","part","entry","decodeURIComponent","writeCookie","bytes","crypto","randomUUID","Uint8Array","getRandomValues","seed","floor","performanceNow","i","hex","padStart","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","contentUrl","readBridgeValue","appName","readBridgeBoolean","result","normalized","normalizeBoolean","localStorage","getItem","cachedBrowserId","buildAnalyticsContext","config","context","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","webosMatch","match","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","hostname","origin","path","pathname","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","TextEncoder","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","getBrowserID","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","publishTracking","body","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","values","params","String","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","prototype","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","hasOwnProperty","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","initializePolyfills","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","getValue","ctx","correlator","trimmed","generateCorrelator","buf","Uint32Array","expandInlineMacroPlaceholders","baseUrl","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","trimEnd","_match","val","applyVastMacros","expandedUrl","replaceCorrelatorFallback","streamCorrelator","pod","podMinDurationMs","round","podMaxDurationMs","podMaxAds","requestUrl","pageUrl","staleKeys","existingUrl","consent","gdpr","gdprConsent","usPrivacy","adTest","correlatorRegex","timeoutMs","signals","tasks","tcfApi","__tcfapi","tcData","success","settled","eventStatus","gdprApplies","tcString","listenerId","uspApi","__uspapi","uspString","getWebKitVersion","getPlatform","userAgentData","detectBrowser","version","majorVersion","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","getChromeVersion","webkitVersion","getBrowserConfigOverrides","browser","overrides","allowNativeHls","logBrowserInfo","debug","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","offset","matchedPackets","packetStart","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","pid","programNumber","descriptorsIdentifyScte35","end","descriptorStart","descriptorEnd","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","elementaryPid","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","segmentationUpidLength","durationTicks","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorDataEnd","descriptorMarker","parseScte35SegmentationDescriptor","outOfNetwork","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","cancel","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","ID","scteValue","isStrongScte35CueKey","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","lastHeartbeatTime","defaultPodMaxAds","defaultPodMaxDurationMs","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","isVmapEnabled","apiVastTagUrl","json","ima","vast","cue_tones","number_ads","apiNumberAds","fetchAndParseVmap","vmapUrl","vmapXml","parseVmapToBreaks","adBreakNodes","doc","VMAP_NS","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","aStart","bStart","seconds","resolveBreakStartMs","timeOffset","hms","hh","mm","ss","ms","hours","minutes","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","maxDurationMs","maxAds","minDurationMs","beginNewAdPod","resolvePodParams","breakDurationMs","podExactDuration","generatePodVastUrl","podParams","adPlayer","palNonce","envSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","initializeTracking","heartbeatInterval","setInterval","sendHeartbeatIfNeeded","destroyTracking","clearInterval","AdTimingService","adRequestWatchdogToken","adFailsafeToken","temporaryFailureCooldownMs","globalLastGamRequestTime","ensureAdStoppedByTimer","adStopTimerId","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalMinGamIntervalMs","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","onAdStopTimerFired","scheduleAdStartIn","delayMs","cueKey","clearAdStartTimer","adStartTimerId","onAdStartTimerFired","resolveScteBreakStartWallClockMs","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","globalNoFillCooldownUntil","recordGamNoFill","exponent","backoff","pow","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","HlsEngine","cueManager","timing","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","setupHls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","some","details","live","onManifestParsed","minSegmentsBeforePlay","LEVEL_LOADED","_evt","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","FRAG_PARSING_METADATA","id3Tags","samples","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","activatePendingCuesForFragment","hasPendingAdBreak","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","onFatalDestroy","payloadData","getLiveSyncPosition","liveSyncPosition","getAdAudioVolume","toggleMute","newMutedState","restoreVolume","toggleFullscreen","fullscreenElement","requestFullscreen"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/players/index.ts\nvar players_exports = {};\n__export(players_exports, {\n  default: () => players_default\n});\nmodule.exports = __toCommonJS(players_exports);\n\n// src/utils.ts\nvar import_react = require(\"react\");\nvar lazy = import_react.lazy;\nvar IS_BROWSER = typeof window !== \"undefined\" && window.document;\nvar IS_GLOBAL = typeof globalThis !== \"undefined\" && globalThis.window && globalThis.window.document;\nvar IS_IOS = IS_BROWSER && /iPad|iPhone|iPod/.test(navigator.userAgent);\nvar IS_SAFARI = IS_BROWSER && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n  hls: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n  },\n  dash: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return DASH_EXTENSIONS.test(url);\n  },\n  video: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url);\n  },\n  audio: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return AUDIO_EXTENSIONS.test(url);\n  },\n  file: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n  }\n};\n\n// src/players/HlsPlayer.tsx\nvar import_react2 = require(\"react\");\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nfunction createHlsAdPlayer(contentVideo, options) {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = /* @__PURE__ */ new Map();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n  let adVideoElement;\n  let adHls;\n  let adContainerEl;\n  let currentAd;\n  let podAds = [];\n  let podIndex = 0;\n  let sessionId;\n  const preloadedAds = /* @__PURE__ */ new Map();\n  const preloadingAds = /* @__PURE__ */ new Map();\n  let destroyed = false;\n  let pendingTimeouts = [];\n  let trackingFired = {\n    impression: false,\n    start: false,\n    firstQuartile: false,\n    midpoint: false,\n    thirdQuartile: false,\n    complete: false\n  };\n  function emit(event, payload) {\n    const set = listeners.get(event);\n    if (!set) return;\n    for (const fn of Array.from(set)) {\n      try {\n        fn(payload);\n      } catch (error) {\n        console.warn(\n          `[HlsAdPlayer] Error in event listener for ${event}:`,\n          error\n        );\n      }\n    }\n  }\n  function generateSessionId() {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n  function fireTrackingPixels(urls) {\n    if (!urls || urls.length === 0) return;\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n        }\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}license_key=${licenseKey}`;\n        }\n        const img = new Image(1, 1);\n        img.src = trackingUrl;\n        console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n      } catch (error) {\n        console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n      }\n    });\n  }\n  function getMainStreamQuality() {\n    if (!mainHlsInstance || !mainHlsInstance.levels) {\n      return null;\n    }\n    const currentLevel = mainHlsInstance.currentLevel;\n    if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n      const autoLevel = mainHlsInstance.loadLevel;\n      if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n        const level2 = mainHlsInstance.levels[autoLevel];\n        return {\n          width: level2.width || 1920,\n          height: level2.height || 1080,\n          bitrate: level2.bitrate || 5e6\n        };\n      }\n      return null;\n    }\n    const level = mainHlsInstance.levels[currentLevel];\n    return {\n      width: level.width || 1920,\n      height: level.height || 1080,\n      bitrate: level.bitrate || 5e6\n    };\n  }\n  function selectBestMediaFile(mediaFiles) {\n    if (mediaFiles.length === 0) {\n      throw new Error(\"No media files available\");\n    }\n    const firstFile = mediaFiles[0];\n    if (!firstFile) {\n      throw new Error(\"No media files available\");\n    }\n    if (mediaFiles.length === 1) {\n      return firstFile;\n    }\n    const mainQuality = getMainStreamQuality();\n    if (!mainQuality) {\n      console.log(\n        \"[HlsAdPlayer] No main stream quality info, using first media file\"\n      );\n      return firstFile;\n    }\n    console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n    const scoredFiles = mediaFiles.map((file) => {\n      const widthDiff = Math.abs(file.width - mainQuality.width);\n      const heightDiff = Math.abs(file.height - mainQuality.height);\n      const resolutionDiff = widthDiff + heightDiff;\n      const fileBitrate = (file.bitrate || 5e3) * 1e3;\n      const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n      const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n      return { file, score, resolutionDiff, bitrateDiff };\n    });\n    scoredFiles.sort((a, b) => a.score - b.score);\n    const bestMatch = scoredFiles[0];\n    if (!bestMatch) {\n      console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n      return firstFile;\n    }\n    console.log(\"[HlsAdPlayer] Selected media file:\", {\n      url: bestMatch.file.url,\n      resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n      bitrate: bestMatch.file.bitrate,\n      score: bestMatch.score,\n      resolutionDiff: bestMatch.resolutionDiff,\n      bitrateDiff: bestMatch.bitrateDiff\n    });\n    return bestMatch.file;\n  }\n  function isHlsMediaFile(mediaFile) {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n  }\n  function isProgressiveMediaFile(mediaFile) {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n  }\n  function createEmptyTrackingUrls() {\n    return {\n      impression: [],\n      start: [],\n      firstQuartile: [],\n      midpoint: [],\n      thirdQuartile: [],\n      complete: [],\n      mute: [],\n      unmute: [],\n      pause: [],\n      resume: [],\n      fullscreen: [],\n      exitFullscreen: [],\n      skip: [],\n      error: []\n    };\n  }\n  function extractTrackingUrls(scope) {\n    const trackingUrls = createEmptyTrackingUrls();\n    scope.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n    scope.querySelectorAll(\"Tracking\").forEach((el) => {\n      const event = el.getAttribute(\"event\");\n      const url = el.textContent?.trim();\n      if (event && url) {\n        const eventKey = event;\n        if (trackingUrls[eventKey]) {\n          trackingUrls[eventKey].push(url);\n        }\n      }\n    });\n    scope.querySelectorAll(\"Error\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.error.push(url);\n    });\n    return trackingUrls;\n  }\n  function mergeTrackingUrls(target, source) {\n    Object.keys(target).forEach((key) => {\n      if (source[key] && source[key].length > 0) {\n        target[key] = target[key].concat(source[key]);\n      }\n    });\n    return target;\n  }\n  function parseVastXml(xmlString) {\n    try {\n      const parser = new DOMParser();\n      const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n      const parserError = xmlDoc.querySelector(\"parsererror\");\n      if (parserError) {\n        console.error(\n          \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n          parserError.textContent\n        );\n        return { type: \"empty\" };\n      }\n      const adElement = xmlDoc.querySelector(\"Ad\");\n      if (!adElement) {\n        console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n        return { type: \"empty\" };\n      }\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n      const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n      const wrapperUri = xmlDoc.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n      if (wrapperUri) {\n        console.log(\n          `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n        );\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough\n        };\n      }\n      const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n      const durationText = xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n      const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      console.log(\n        `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n      );\n      mediaFileElements.forEach((mf, index) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n        const mediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: void 0\n        };\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n        mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\n      });\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n        }\n        return { type: \"empty\" };\n      }\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough\n        }\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n      return { type: \"empty\" };\n    }\n  }\n  function parseAdElement(adElement) {\n    try {\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n      const clickThrough = adElement.querySelector(\"ClickThrough\")?.textContent?.trim();\n      const wrapperUri = adElement.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n      if (wrapperUri) {\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough\n        };\n      }\n      const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n      const durationText = adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n      const mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      mediaFileElements.forEach((mf) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n        if (!url) return;\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n        const mediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n        };\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\n      });\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n        }\n        return { type: \"empty\" };\n      }\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough\n        }\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n      return { type: \"empty\" };\n    }\n  }\n  async function fetchVastXml(vastTagUrl, credentials = \"include\") {\n    const requestVast = (creds) => fetch(vastTagUrl, {\n      mode: \"cors\",\n      credentials: creds,\n      headers: {\n        \"Accept\": \"application/xml, text/xml, */*\"\n      },\n      referrerPolicy: \"no-referrer-when-downgrade\"\n    });\n    let response;\n    try {\n      response = await requestVast(credentials);\n    } catch (error) {\n      if (credentials !== \"omit\") {\n        console.warn(\n          `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n          error\n        );\n        response = await requestVast(\"omit\");\n      } else {\n        throw error;\n      }\n    }\n    if (!response.ok) {\n      throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n    }\n    return response.text();\n  }\n  async function fetchAndParseVastAd(vastTagUrl, depth = 0, accumulatedTracking = createEmptyTrackingUrls()) {\n    const vastXml = await fetchVastXml(\n      vastTagUrl,\n      depth === 0 ? \"include\" : \"omit\"\n    );\n    console.log(\"[HlsAdPlayer] VAST XML received\");\n    console.log(\n      \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n      vastXml.substring(0, 2e3)\n    );\n    const parsed = parseVastXml(vastXml);\n    if (parsed.type === \"empty\") {\n      return null;\n    }\n    if (parsed.type === \"wrapper\") {\n      if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n        console.warn(\n          `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n        );\n        return null;\n      }\n      mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n      return fetchAndParseVastAd(\n        parsed.vastAdTagUri,\n        depth + 1,\n        accumulatedTracking\n      );\n    }\n    mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n    return parsed.ad;\n  }\n  async function fetchAndParsePod(vastTagUrl) {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] Pod VAST XML received\");\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\n      return [];\n    }\n    adElements.sort((a, b) => {\n      const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n      const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n      const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n      const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n      return aVal - bVal;\n    });\n    const ads = [];\n    for (const adElement of adElements) {\n      const parsed = parseAdElement(adElement);\n      if (parsed.type === \"inline\") {\n        ads.push(parsed.ad);\n      } else if (parsed.type === \"wrapper\") {\n        try {\n          const resolved = await fetchAndParseVastAd(\n            parsed.vastAdTagUri,\n            1,\n            parsed.trackingUrls\n          );\n          if (resolved) {\n            ads.push(resolved);\n          }\n        } catch (error) {\n          console.warn(\n            \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n            error\n          );\n        }\n      }\n    }\n    console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n    return ads;\n  }\n  function createAdVideoElement() {\n    const video = document.createElement(\"video\");\n    video.style.position = \"absolute\";\n    video.style.left = \"0\";\n    video.style.top = \"0\";\n    video.style.width = \"100%\";\n    video.style.height = \"100%\";\n    video.style.objectFit = \"contain\";\n    video.style.backgroundColor = \"#000\";\n    video.playsInline = true;\n    video.muted = false;\n    video.volume = 1;\n    console.log(\n      `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n    );\n    return video;\n  }\n  function setupAdEventListeners() {\n    if (!adVideoElement || !currentAd) return;\n    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\n      const progress = adVideoElement.currentTime / currentAd.duration;\n      if (progress >= 0.25 && !trackingFired.firstQuartile) {\n        trackingFired.firstQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n      }\n      if (progress >= 0.5 && !trackingFired.midpoint) {\n        trackingFired.midpoint = true;\n        fireTrackingPixels(currentAd.trackingUrls.midpoint);\n      }\n      if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n        trackingFired.thirdQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n      }\n    });\n    adVideoElement.addEventListener(\"playing\", () => {\n      if (!currentAd || trackingFired.start) return;\n      trackingFired.start = true;\n      fireTrackingPixels(currentAd.trackingUrls.start);\n      console.log(\"[HlsAdPlayer] Ad started playing\");\n    });\n    adVideoElement.addEventListener(\"ended\", () => {\n      if (!currentAd || trackingFired.complete) return;\n      trackingFired.complete = true;\n      fireTrackingPixels(currentAd.trackingUrls.complete);\n      console.log(\"[HlsAdPlayer] Ad completed\");\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n      handleAdComplete();\n    });\n    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n      handleAdError();\n    });\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\n  }\n  function setAdPlayingFlag(isPlaying) {\n    if (isPlaying) {\n      contentVideo.dataset.stormcloudAdPlaying = \"true\";\n    } else {\n      delete contentVideo.dataset.stormcloudAdPlaying;\n    }\n  }\n  function resetQuartileTracking(preserveImpression) {\n    trackingFired = {\n      impression: preserveImpression ? trackingFired.impression : false,\n      start: false,\n      firstQuartile: false,\n      midpoint: false,\n      thirdQuartile: false,\n      complete: false\n    };\n  }\n  function loadCurrentAdMedia() {\n    if (!adVideoElement || !currentAd) {\n      throw new Error(\"No ad video element or ad to load\");\n    }\n    const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n    if (!mediaFile) {\n      throw new Error(\"No media file available for ad\");\n    }\n    const isHlsAd = isHlsMediaFile(mediaFile);\n    console.log(\n      `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n    );\n    if (isHlsAd && import_hls.default.isSupported()) {\n      if (adHls) {\n        adHls.destroy();\n      }\n      adHls = new import_hls.default({\n        enableWorker: true,\n        lowLatencyMode: false\n      });\n      adHls.loadSource(mediaFile.url);\n      adHls.attachMedia(adVideoElement);\n      adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n        console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n        adVideoElement.play().catch((error) => {\n          console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n          handleAdError();\n        });\n      });\n      adHls.on(import_hls.default.Events.ERROR, (_event, data) => {\n        console.error(\"[HlsAdPlayer] HLS error:\", data);\n        if (data.fatal) {\n          handleAdError();\n        }\n      });\n    } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n        handleAdError();\n      });\n    } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.load();\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n        handleAdError();\n      });\n    } else {\n      throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n    }\n  }\n  function advanceToNextPodAd() {\n    if (podIndex >= podAds.length - 1) {\n      return false;\n    }\n    podIndex++;\n    currentAd = podAds[podIndex];\n    resetQuartileTracking(false);\n    if (currentAd) {\n      fireTrackingPixels(currentAd.trackingUrls.impression);\n      trackingFired.impression = true;\n      console.log(\n        `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n      );\n    }\n    try {\n      loadCurrentAdMedia();\n      emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n      return true;\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n      return false;\n    }\n  }\n  function handleAdComplete() {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    if (options?.continueLiveStreamDuringAds) {\n      if (contentVideo.paused) {\n        console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n        contentVideo.play().catch(() => {\n        });\n      } else {\n        console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n      }\n    }\n    emit(\"content_resume\");\n  }\n  function handleAdError() {\n    console.log(\"[HlsAdPlayer] Handling ad error\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    emit(\"ad_error\");\n  }\n  return {\n    initialize() {\n      console.log(\"[HlsAdPlayer] Initializing\");\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"30\";\n        container.style.backgroundColor = \"#000\";\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n    },\n    async requestAds(vastTagUrl) {\n      console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n      if (adPlaying) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n        );\n        return Promise.reject(new Error(\"Ad already playing\"));\n      }\n      try {\n        sessionId = generateSessionId();\n        let ads = [];\n        if (preloadedAds.has(vastTagUrl)) {\n          const preloaded = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          if (preloaded) {\n            ads = [preloaded];\n          }\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ads = await fetchAndParsePod(vastTagUrl);\n        }\n        if (!ads.length) {\n          console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n          emit(\"ad_error\");\n          return Promise.reject(new Error(\"No ads available from VAST response\"));\n        }\n        podAds = ads;\n        podIndex = 0;\n        currentAd = ads[0];\n        console.log(\n          `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n        );\n        if (currentAd) {\n          fireTrackingPixels(currentAd.trackingUrls.impression);\n          trackingFired.impression = true;\n        }\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n        emit(\"ad_error\");\n        return Promise.reject(error);\n      }\n    },\n    async play() {\n      if (!currentAd) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n        );\n        return Promise.reject(new Error(\"No ad loaded\"));\n      }\n      console.log(\"[HlsAdPlayer] Starting ad playback\");\n      try {\n        if (!adVideoElement) {\n          adVideoElement = createAdVideoElement();\n          adContainerEl?.appendChild(adVideoElement);\n          setupAdEventListeners();\n        }\n        resetQuartileTracking(true);\n        const contentVolume = contentVideo.volume;\n        originalVolume = Math.max(\n          0,\n          Math.min(1, contentVolume || originalVolume)\n        );\n        if (!options?.continueLiveStreamDuringAds) {\n          contentVideo.pause();\n          console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n        } else {\n          console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n        }\n        console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n        contentVideo.muted = true;\n        adPlaying = true;\n        setAdPlayingFlag(true);\n        if (adVideoElement) {\n          adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n          adVideoElement.muted = originalMutedState;\n          console.log(\n            `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n          );\n        }\n        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n        emit(\"content_pause\");\n        loadCurrentAdMedia();\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n        handleAdError();\n        return Promise.reject(error);\n      }\n    },\n    pause() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n      try {\n        if (adVideoElement && !adVideoElement.paused) {\n          adVideoElement.pause();\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n      }\n    },\n    resume() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n      try {\n        if (adVideoElement && adVideoElement.paused) {\n          adVideoElement.play().catch(() => {\n          });\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n      }\n    },\n    async stop() {\n      console.log(\"[HlsAdPlayer] Stopping ad\");\n      adPlaying = false;\n      setAdPlayingFlag(false);\n      const previousMutedState = contentVideo.muted;\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      console.log(\n        `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n      );\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      contentVideo.style.visibility = \"visible\";\n      contentVideo.style.opacity = \"1\";\n      if (options?.continueLiveStreamDuringAds) {\n        if (contentVideo.paused) {\n          console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n          contentVideo.play().catch(() => {\n          });\n        }\n      }\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n      currentAd = void 0;\n      podAds = [];\n      podIndex = 0;\n    },\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\n      for (const timeoutId of pendingTimeouts) {\n        clearTimeout(timeoutId);\n      }\n      pendingTimeouts = [];\n      adPlaying = false;\n      setAdPlayingFlag(false);\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = void 0;\n      }\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n      adContainerEl = void 0;\n      currentAd = void 0;\n      podAds = [];\n      podIndex = 0;\n      listeners.clear();\n      preloadedAds.clear();\n      preloadingAds.clear();\n    },\n    isAdPlaying() {\n      return adPlaying;\n    },\n    resize(width, height) {\n      console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n      if (adContainerEl) {\n        adContainerEl.style.width = `${width}px`;\n        adContainerEl.style.height = `${height}px`;\n      }\n      if (adVideoElement) {\n        adVideoElement.style.width = `${width}px`;\n        adVideoElement.style.height = `${height}px`;\n      }\n    },\n    on(event, listener) {\n      if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n      listeners.get(event).add(listener);\n    },\n    off(event, listener) {\n      listeners.get(event)?.delete(listener);\n    },\n    updateOriginalMutedState(muted, volume) {\n      const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n      console.log(\n        `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n      );\n      originalMutedState = muted;\n      originalVolume = nextVolume;\n    },\n    getOriginalMutedState() {\n      return originalMutedState;\n    },\n    getOriginalVolume() {\n      return originalVolume;\n    },\n    setAdVolume(volume) {\n      if (adVideoElement && adPlaying) {\n        const clamped = Math.max(0, Math.min(1, volume));\n        adVideoElement.volume = clamped;\n        adVideoElement.muted = clamped === 0;\n      }\n    },\n    getAdVolume() {\n      if (adVideoElement && adPlaying) {\n        return adVideoElement.volume;\n      }\n      return 1;\n    },\n    showPlaceholder() {\n      contentVideo.style.opacity = \"0\";\n      contentVideo.style.visibility = \"hidden\";\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"10\";\n        container.style.backgroundColor = \"#000\";\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n      if (adContainerEl) {\n        adContainerEl.style.display = \"flex\";\n        adContainerEl.style.pointerEvents = \"auto\";\n      }\n    },\n    hidePlaceholder() {\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      if (!adPlaying) {\n        contentVideo.style.visibility = \"visible\";\n        contentVideo.style.opacity = \"1\";\n      }\n    },\n    getLoadedAdDuration() {\n      return currentAd?.duration;\n    },\n    getLoadedAdId() {\n      return currentAd?.id;\n    },\n    getPodAdCount() {\n      return podAds.length;\n    },\n    getPodTotalDurationMs() {\n      return podAds.reduce(\n        (total, ad) => total + (ad.duration > 0 ? ad.duration * 1e3 : 0),\n        0\n      );\n    }\n  };\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n  if (typeof window !== \"undefined\" && window.goog?.pal) {\n    return Promise.resolve();\n  }\n  if (_palLoadPromise) return _palLoadPromise;\n  _palLoadPromise = new Promise((resolve, reject) => {\n    const existing = document.querySelector(\n      'script[data-pal=\"true\"]'\n    );\n    if (existing) {\n      if (window.goog?.pal) {\n        resolve();\n        return;\n      }\n      const timeout = setTimeout(\n        () => reject(new Error(\"PAL SDK load timeout\")),\n        1e4\n      );\n      existing.addEventListener(\"load\", () => {\n        clearTimeout(timeout);\n        resolve();\n      });\n      existing.addEventListener(\"error\", () => {\n        clearTimeout(timeout);\n        reject(new Error(\"PAL SDK load failed\"));\n      });\n      return;\n    }\n    const script = document.createElement(\"script\");\n    script.src = PAL_SDK_URL;\n    script.async = true;\n    script.setAttribute(\"data-pal\", \"true\");\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n    document.head.appendChild(script);\n  });\n  return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n  if (_nonceLoader) return _nonceLoader;\n  const goog = window.goog;\n  const consentSettings = new goog.pal.ConsentSettings();\n  consentSettings.allowStorage = true;\n  _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n  return _nonceLoader;\n}\nfunction createPalNonceManager() {\n  let currentNonce = \"\";\n  let currentNonceManager;\n  return {\n    async generateNonce(options = {}) {\n      try {\n        await loadPalSdk();\n        const loader = getOrCreateNonceLoader();\n        const goog = window.goog;\n        const request = new goog.pal.NonceRequest();\n        request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n        request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n        request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n        request.continuousPlayback = options.continuousPlayback ?? true;\n        request.descriptionUrl = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.videoWidth = options.videoWidth || 640;\n        request.videoHeight = options.videoHeight || 480;\n        if (options.ppid) request.ppid = options.ppid;\n        if (options.sessionId) request.sessionId = options.sessionId;\n        console.log(\"[PAL] NonceRequest before generateNonce:\", {\n          adWillAutoPlay: request.adWillAutoPlay,\n          adWillPlayMuted: request.adWillPlayMuted,\n          playerVolume: request.playerVolume,\n          continuousPlayback: request.continuousPlayback,\n          descriptionUrl: request.descriptionUrl,\n          iconsSupported: request.iconsSupported,\n          playerType: request.playerType,\n          playerVersion: request.playerVersion,\n          supportedApiFrameworks: request.supportedApiFrameworks,\n          url: request.url,\n          videoWidth: request.videoWidth,\n          videoHeight: request.videoHeight,\n          ppid: request.ppid,\n          sessionId: request.sessionId\n        });\n        const manager = await loader.loadNonceManager(request);\n        currentNonceManager = manager;\n        currentNonce = manager.getNonce();\n        console.log(\"[PAL] Nonce generated successfully\");\n        return currentNonce;\n      } catch (error) {\n        console.warn(\"[PAL] Failed to generate nonce:\", error);\n        currentNonce = \"\";\n        currentNonceManager = void 0;\n        return \"\";\n      }\n    },\n    getCurrentNonce() {\n      return currentNonce;\n    },\n    injectNonce(vastTagUrl) {\n      if (!currentNonce || !vastTagUrl) return vastTagUrl;\n      try {\n        const url = new URL(vastTagUrl);\n        url.searchParams.delete(\"paln\");\n        url.searchParams.set(\"givn\", currentNonce);\n        return url.toString();\n      } catch {\n        let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n        const sep = base.includes(\"?\") ? \"&\" : \"?\";\n        return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n      }\n    },\n    sendPlaybackStart() {\n      try {\n        currentNonceManager?.sendPlaybackStart();\n      } catch {\n      }\n    },\n    sendPlaybackEnd() {\n      try {\n        currentNonceManager?.sendPlaybackEnd();\n      } catch {\n      }\n    },\n    sendAdClick() {\n      try {\n        currentNonceManager?.sendAdClick();\n      } catch {\n      }\n    },\n    sendAdTouch(event) {\n      try {\n        currentNonceManager?.sendAdTouch(event);\n      } catch {\n      }\n    },\n    reset() {\n      currentNonce = \"\";\n      currentNonceManager = void 0;\n    }\n  };\n}\n\n// src/utils/mqttConfig.ts\nvar DEFAULT_MQTT_CONFIG = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1\n};\nvar mqttConfig = { ...DEFAULT_MQTT_CONFIG };\nfunction isMQTTEnabled() {\n  return mqttConfig.enabled;\n}\nfunction buildMQTTBrokerUrl() {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\nfunction buildPlayerTopic(licenseKey, channel) {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n\n// src/utils/mqttClient.ts\nvar import_mqtt = __toESM(require(\"mqtt\"), 1);\nvar LOG = \"[StormcloudVideoPlayer][MQTT]\";\nvar client = null;\nvar status = \"disconnected\";\nfunction initMQTTClient() {\n  if (client || !isMQTTEnabled()) return;\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n  try {\n    client = import_mqtt.default.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5e3,\n      connectTimeout: 1e4,\n      queueQoSZero: false\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting\\u2026`);\n  });\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\nfunction ensureMQTTClient() {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\nfunction publishMQTT(topic, payload) {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n  ensureMQTTClient();\n  if (!client) {\n    return false;\n  }\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nvar AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nvar AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nvar AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nvar AIRY_APP_NAME = \"AiryTV Movies & TV\";\nvar AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar LG_TEST_APP_ID = \"com.hulu.plus\";\nvar LG_TEST_APP_NAME = \"Hulu\";\nvar LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\nvar _lgTestDeviceId;\nfunction getLgTestDeviceId() {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\nfunction isLgWebOS() {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\nfunction getDefaultAppId() {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\nvar DEVICE_ID_STORAGE_KEYS = [\n  \"rdid\",\n  \"ifa\",\n  \"advertisingId\",\n  \"advertising_id\",\n  \"deviceAdvertisingId\",\n  \"aaid\",\n  \"adid\",\n  \"rida\",\n  \"tifa\",\n  \"lgudid\"\n];\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction resolveVastEnvironmentSignals(isCtv) {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const lg = isCtv && isLgWebOS();\n  const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId || (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : void 0);\n  const deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType() || (lg ? \"lgudid\" : void 0);\n  const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n  const limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl: bridgeSignals.contentUrl || readStoredString(\"contentUrl\") || (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId: bridgeSignals.appId || readStoredString(\"appId\") || readStoredString(\"msid\") || (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName: bridgeSignals.appName || readStoredString(\"appName\") || readStoredString(\"an\") || (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...deviceId ? { deviceId } : {},\n      ...deviceIdType ? { deviceIdType } : {},\n      ...limitAdTracking != null ? { limitAdTracking } : {},\n      deviceTypeHint: 5\n    };\n  }\n  return {\n    isCtv: false,\n    ...deviceId ? { deviceId } : {},\n    ...deviceIdType ? { deviceIdType } : {},\n    ...limitAdTracking != null ? { limitAdTracking } : {}\n  };\n}\nfunction inferDeviceIdType() {\n  if (typeof navigator === \"undefined\") {\n    return void 0;\n  }\n  const ua = navigator.userAgent;\n  if (/Roku/i.test(ua)) return \"rida\";\n  if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n  if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n  if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n  if (/Android|Google TV/i.test(ua)) return \"aaid\";\n  if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n  return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n  if (!tagType || !runtimeType) return false;\n  const tag = tagType.toLowerCase();\n  const runtime = runtimeType.toLowerCase();\n  if (tag === runtime) return true;\n  return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\nfunction resolveNativeDeviceId() {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n    return void 0;\n  }\n  return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n  if (typeof window === \"undefined\") {\n    return void 0;\n  }\n  const existing = readPersistentId(storageKey);\n  if (existing) {\n    writePersistentId(storageKey, existing);\n    return existing;\n  }\n  const id = createUuid();\n  writePersistentId(storageKey, id);\n  return id;\n}\nfunction getOrCreateCtvSessionId() {\n  const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n    return existing;\n  }\n  const sessionId = createUuid();\n  writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n  return sessionId;\n}\nfunction readPersistentId(storageKey) {\n  return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n  try {\n    window.localStorage?.setItem(storageKey, value);\n  } catch {\n  }\n  writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n  if (typeof document === \"undefined\") {\n    return void 0;\n  }\n  try {\n    const prefix = encodeURIComponent(name) + \"=\";\n    const parts = document.cookie ? document.cookie.split(\";\") : [];\n    for (const part of parts) {\n      const entry = part.trim();\n      if (entry.startsWith(prefix)) {\n        return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n      }\n    }\n  } catch {\n  }\n  return void 0;\n}\nfunction writeCookie(name, value) {\n  if (typeof document === \"undefined\") {\n    return;\n  }\n  try {\n    document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n  } catch {\n  }\n}\nfunction createUuid() {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n  const bytes = new Uint8Array(16);\n  if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n    crypto.getRandomValues(bytes);\n  } else {\n    let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n    for (let i = 0; i < 16; i++) {\n      seed = seed * 1103515245 + 12345 & 2147483647;\n      bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n    }\n  }\n  bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n  bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n  let hex = \"\";\n  for (let i = 0; i < 16; i++) {\n    hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n  }\n  return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n  try {\n    if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n      return performance.now();\n    }\n  } catch {\n  }\n  return 0;\n}\nfunction readPlatformNativeDeviceId() {\n  if (typeof window === \"undefined\") return {};\n  try {\n    const adinfo = window.webapis?.adinfo;\n    if (adinfo) {\n      const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n      if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n        const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n        return {\n          deviceId: tifa,\n          deviceIdType: \"tifa\",\n          ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n        };\n      }\n    }\n  } catch {\n  }\n  try {\n    const webOSDev = window.webOSDev;\n    if (webOSDev) {\n      const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n      if (typeof lgudid === \"string\" && lgudid) {\n        if (isZeroedAdId(lgudid)) {\n          return { deviceIdType: \"lgudid\", limitAdTracking: true };\n        }\n        if (!isMacroPlaceholder(lgudid)) {\n          return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n        }\n      }\n    }\n  } catch {\n  }\n  try {\n    const roku = window.Roku;\n    if (roku) {\n      const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n      if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n        return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n      }\n    }\n  } catch {\n  }\n  return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n  \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n  \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n  const t = value.trim();\n  return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n  return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n  const candidates = [\n    window.__STORMCLOUD_CTV_AD_INFO__,\n    window.__STORMCLOUD_CTV__,\n    window.stormcloudCtv,\n    window.AiryTV,\n    window.Android,\n    window.webOS,\n    window.tizen,\n    window.amazon\n  ].filter(Boolean);\n  for (const source of candidates) {\n    const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n    const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n    const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n    const deviceId = readBridgeValue(source, [\n      \"rdid\",\n      \"ifa\",\n      \"advertisingId\",\n      \"adId\",\n      \"deviceId\",\n      \"lgudid\",\n      \"LGUDID\",\n      \"tifa\",\n      \"rida\",\n      \"afai\",\n      \"aaid\"\n    ]) || void 0;\n    if (!contentUrl && !deviceId && !appId && !appName) continue;\n    const deviceIdType = readBridgeValue(source, [\n      \"idtype\",\n      \"deviceIdType\",\n      \"advertisingIdType\",\n      \"idType\"\n    ]) || inferDeviceIdType();\n    const limitAdTracking = readBridgeBoolean(source, [\n      \"is_lat\",\n      \"limitAdTracking\",\n      \"limitedAdTracking\",\n      \"lat\"\n    ]);\n    return {\n      ...contentUrl ? { contentUrl } : {},\n      ...appId ? { appId } : {},\n      ...appName ? { appName } : {},\n      ...deviceId ? { deviceId } : {},\n      ...deviceId && deviceIdType ? { deviceIdType } : {},\n      ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n    };\n  }\n  return {};\n}\nfunction readBridgeValue(source, keys) {\n  for (const key of keys) {\n    const value = source?.[key];\n    if (typeof value === \"string\" && value) {\n      return value;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = value.call(source);\n        if (typeof result === \"string\" && result) {\n          return result;\n        }\n      } catch {\n      }\n    }\n  }\n  return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n  for (const key of keys) {\n    const value = source?.[key];\n    const normalized = normalizeBoolean(value);\n    if (normalized != null) {\n      return normalized;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = normalizeBoolean(value.call(source));\n        if (result != null) {\n          return result;\n        }\n      } catch {\n      }\n    }\n  }\n  return void 0;\n}\nfunction readStoredDeviceId() {\n  for (const key of DEVICE_ID_STORAGE_KEYS) {\n    const value = readStoredString(key);\n    if (value) {\n      return value;\n    }\n  }\n  return void 0;\n}\nfunction readStoredString(key) {\n  if (typeof window === \"undefined\") {\n    return void 0;\n  }\n  try {\n    const value = window.localStorage?.getItem(key);\n    return value || void 0;\n  } catch {\n    return void 0;\n  }\n}\nfunction readStoredLimitAdTracking() {\n  return normalizeBoolean(\n    readStoredString(\"limitAdTracking\") || readStoredString(\"limitedAdTracking\") || readStoredString(\"is_lat\")\n  );\n}\nfunction normalizeBoolean(value) {\n  if (typeof value === \"boolean\") {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    return value === 1;\n  }\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase();\n    if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n      return true;\n    }\n    if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n      return false;\n    }\n  }\n  return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n  const context = {};\n  if (config.debugAdTiming) {\n    context.debugAdTiming = true;\n  }\n  if (config.isLiveStream !== void 0) {\n    context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n  }\n  return context;\n}\nfunction getClientInfo() {\n  const ua = navigator.userAgent;\n  const platform = navigator.platform;\n  const vendor = navigator.vendor || \"\";\n  const maxTouchPoints = navigator.maxTouchPoints || 0;\n  const memory = navigator.deviceMemory || null;\n  const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n  const screenInfo = {\n    width: screen?.width,\n    height: screen?.height,\n    availWidth: screen?.availWidth,\n    availHeight: screen?.availHeight,\n    orientation: screen?.orientation?.type || \"\",\n    pixelDepth: screen?.pixelDepth\n  };\n  let deviceType = \"desktop\";\n  let brand = \"Unknown\";\n  let os = \"Unknown\";\n  let model = \"\";\n  let isSmartTV = false;\n  let isAndroid = false;\n  let isWebView = false;\n  let isWebApp = false;\n  if (ua.includes(\"Web0S\")) {\n    brand = \"LG\";\n    os = \"webOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n    model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n  } else if (ua.includes(\"Tizen\")) {\n    brand = \"Samsung\";\n    os = \"Tizen\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n    const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n    model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n  } else if (ua.includes(\"Philips\")) {\n    brand = \"Philips\";\n    os = \"Saphi\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n    brand = \"Sharp\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n    brand = \"Sony\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n    brand = \"LG\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n    brand = \"Roku\";\n    os = \"Roku OS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"AppleTV\")) {\n    brand = \"Apple\";\n    os = \"tvOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  }\n  if (ua.includes(\"Android\")) {\n    isAndroid = true;\n    os = \"Android\";\n    deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n    if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n      deviceType = \"tv\";\n      isSmartTV = true;\n      brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n    }\n    const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n    if (androidModelMatch && androidModelMatch[1]) {\n      model = androidModelMatch[1];\n    }\n  }\n  if (/iPad|iPhone|iPod/.test(ua)) {\n    os = \"iOS\";\n    deviceType = \"mobile\";\n    brand = \"Apple\";\n    if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n      deviceType = \"tablet\";\n    }\n  }\n  if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n    if (ua.includes(\"Windows\")) {\n      os = \"Windows\";\n      deviceType = \"desktop\";\n    } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n      os = \"macOS\";\n      deviceType = \"desktop\";\n      if (maxTouchPoints > 1) deviceType = \"tablet\";\n    } else if (ua.includes(\"Linux\")) {\n      os = \"Linux\";\n      deviceType = \"desktop\";\n    }\n  }\n  if (brand === \"Unknown\") {\n    if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n    if (vendor.includes(\"Apple\")) brand = \"Apple\";\n    if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n  }\n  isWebView = /wv|WebView|Linux; U;/.test(ua);\n  if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n    isWebView = true;\n  }\n  isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n  return {\n    brand,\n    os,\n    model: model || ua.substring(0, 50) + \"...\",\n    deviceType,\n    isSmartTV,\n    isAndroid,\n    isWebView,\n    isWebApp,\n    domain: window.location.hostname,\n    origin: window.location.origin,\n    path: window.location.pathname,\n    userAgent: ua,\n    vendor,\n    platform,\n    screen: screenInfo,\n    hardwareConcurrency,\n    deviceMemory: memory,\n    maxTouchPoints,\n    language: navigator.language,\n    languages: navigator.languages?.join(\",\") || \"\",\n    cookieEnabled: navigator.cookieEnabled,\n    doNotTrack: navigator.doNotTrack || \"\",\n    referrer: document.referrer,\n    visibilityState: document.visibilityState\n  };\n}\nasync function sha256Hex(input) {\n  if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n    try {\n      await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n      let encodedData;\n      if (typeof TextEncoder !== \"undefined\") {\n        encodedData = new TextEncoder().encode(input);\n      } else {\n        const utf8 = unescape(encodeURIComponent(input));\n        const buffer = new Uint8Array(utf8.length);\n        for (let i = 0; i < utf8.length; i++) {\n          buffer[i] = utf8.charCodeAt(i);\n        }\n        encodedData = buffer;\n      }\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n      return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n    } catch {\n      console.warn(\n        \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n      );\n    }\n  }\n  let hash = 0;\n  for (let i = 0; i < input.length; i++) {\n    const char = input.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash;\n  }\n  const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n  const timestamp = Date.now().toString(16).padStart(12, \"0\");\n  const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n  return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n  const nativeDeviceId = resolveNativeDeviceId();\n  if (nativeDeviceId) {\n    return `device:${nativeDeviceId}`;\n  }\n  const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n  if (persistedId) {\n    return `persisted:${persistedId}`;\n  }\n  return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n  if (cachedBrowserId) {\n    return cachedBrowserId;\n  }\n  cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n  return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n  return Boolean(isMQTTEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n  const clientInfo = getClientInfo();\n  const debugAdTiming = !!context.debugAdTiming;\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n  }\n  const playerId = await getBrowserID(clientInfo);\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n  }\n  const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n  return {\n    player_id: playerId,\n    device_type: clientInfo.deviceType,\n    os: clientInfo.os.toLowerCase(),\n    ad_loaded: flags.adLoaded ?? false,\n    ad_detect: flags.adDetect ?? false,\n    capture_at: captureAt,\n    ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n  };\n}\nfunction publishTracking(licenseKey, channel, body) {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      adLoaded: false,\n      adDetect: false\n    });\n    publishTracking(licenseKey, \"metrics\", {\n      events: [metricEvent]\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n      error\n    );\n  }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adDetect: true,\n      captureAt: adDetectInfo.timestamp\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n      error\n    );\n  }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adLoaded: true,\n      captureAt: adLoadedInfo.timestamp\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n      error\n    );\n  }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      captureAt: adImpressionInfo.timestamp\n    });\n    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(licenseKey, \"impressions\", {\n      events: [\n        {\n          player_id: metricEvent.player_id,\n          ad_played_count: 1,\n          ad_url: adImpressionInfo.adUrl,\n          capture_at: adImpressionInfo.timestamp\n        }\n      ]\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n      error\n    );\n  }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const heartbeatData = await buildPlayerMetricEvent(context, flags);\n    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n  } catch (error) {\n    console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n  }\n}\n\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n  if (typeof URLSearchParams !== \"undefined\") {\n    return;\n  }\n  class URLSearchParamsPolyfill {\n    constructor(init) {\n      this.params = /* @__PURE__ */ new Map();\n      if (typeof init === \"string\") {\n        this.parseQueryString(init);\n      } else if (init instanceof URLSearchParamsPolyfill) {\n        init.forEach((value, key) => {\n          this.append(key, value);\n        });\n      }\n    }\n    parseQueryString(query) {\n      const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n      if (!cleanQuery) return;\n      cleanQuery.split(\"&\").forEach((param) => {\n        const [key, value] = param.split(\"=\");\n        if (key) {\n          const decodedKey = this.safeDecodeURIComponent(key);\n          const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n          this.append(decodedKey, decodedValue);\n        }\n      });\n    }\n    safeDecodeURIComponent(str) {\n      try {\n        return decodeURIComponent(str.replace(/\\+/g, \" \"));\n      } catch (e) {\n        return str;\n      }\n    }\n    append(name, value) {\n      const values = this.params.get(name) || [];\n      values.push(String(value));\n      this.params.set(name, values);\n    }\n    delete(name) {\n      this.params.delete(name);\n    }\n    get(name) {\n      const values = this.params.get(name);\n      return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n    }\n    getAll(name) {\n      return this.params.get(name) || [];\n    }\n    has(name) {\n      return this.params.has(name);\n    }\n    set(name, value) {\n      this.params.set(name, [String(value)]);\n    }\n    forEach(callback) {\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          callback(value, key, this);\n        });\n      });\n    }\n    toString() {\n      const parts = [];\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n        });\n      });\n      return parts.join(\"&\");\n    }\n  }\n  window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n  if (typeof TextEncoder !== \"undefined\") {\n    return;\n  }\n  class TextEncoderPolyfill {\n    constructor() {\n      this.encoding = \"utf-8\";\n    }\n    encode(str) {\n      const utf8 = [];\n      for (let i = 0; i < str.length; i++) {\n        let charcode = str.charCodeAt(i);\n        if (charcode < 128) {\n          utf8.push(charcode);\n        } else if (charcode < 2048) {\n          utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n        } else if (charcode < 55296 || charcode >= 57344) {\n          utf8.push(\n            224 | charcode >> 12,\n            128 | charcode >> 6 & 63,\n            128 | charcode & 63\n          );\n        } else {\n          i++;\n          charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n          utf8.push(\n            240 | charcode >> 18,\n            128 | charcode >> 12 & 63,\n            128 | charcode >> 6 & 63,\n            128 | charcode & 63\n          );\n        }\n      }\n      return new Uint8Array(utf8);\n    }\n  }\n  window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n  if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n    Promise.prototype.finally = function(callback) {\n      const constructor = this.constructor;\n      return this.then(\n        (value) => constructor.resolve(callback()).then(() => value),\n        (reason) => constructor.resolve(callback()).then(() => {\n          throw reason;\n        })\n      );\n    };\n  }\n}\nfunction polyfillObjectAssign() {\n  if (typeof Object.assign !== \"function\") {\n    Object.assign = function(target, ...sources) {\n      if (target == null) {\n        throw new TypeError(\"Cannot convert undefined or null to object\");\n      }\n      const to = Object(target);\n      for (let i = 0; i < sources.length; i++) {\n        const nextSource = sources[i];\n        if (nextSource != null) {\n          for (const nextKey in nextSource) {\n            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n              to[nextKey] = nextSource[nextKey];\n            }\n          }\n        }\n      }\n      return to;\n    };\n  }\n}\nfunction polyfillArrayFrom() {\n  if (!Array.from) {\n    Array.from = function(arrayLike, mapFn, thisArg) {\n      const items = Object(arrayLike);\n      if (arrayLike == null) {\n        throw new TypeError(\"Array.from requires an array-like object\");\n      }\n      const len = items.length >>> 0;\n      const result = new Array(len);\n      for (let i = 0; i < len; i++) {\n        if (mapFn) {\n          result[i] = mapFn.call(thisArg, items[i], i);\n        } else {\n          result[i] = items[i];\n        }\n      }\n      return result;\n    };\n  }\n}\nfunction polyfillStringStartsWith() {\n  if (!String.prototype.startsWith) {\n    String.prototype.startsWith = function(search, pos) {\n      pos = !pos || pos < 0 ? 0 : +pos;\n      return this.substring(pos, pos + search.length) === search;\n    };\n  }\n}\nfunction polyfillStringEndsWith() {\n  if (!String.prototype.endsWith) {\n    String.prototype.endsWith = function(search, length) {\n      if (length === void 0 || length > this.length) {\n        length = this.length;\n      }\n      return this.substring(length - search.length, length) === search;\n    };\n  }\n}\nfunction polyfillStringIncludes() {\n  if (!String.prototype.includes) {\n    String.prototype.includes = function(search, start) {\n      if (typeof start !== \"number\") {\n        start = 0;\n      }\n      if (start + search.length > this.length) {\n        return false;\n      }\n      return this.indexOf(search, start) !== -1;\n    };\n  }\n}\nfunction initializePolyfills() {\n  polyfillObjectAssign();\n  polyfillArrayFrom();\n  polyfillStringStartsWith();\n  polyfillStringEndsWith();\n  polyfillStringIncludes();\n  polyfillURLSearchParams();\n  polyfillTextEncoder();\n  polyfillPromiseFinally();\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n  \"description_url\",\n  \"tfcd\",\n  \"npa\",\n  \"min_ad_duration\",\n  \"max_ad_duration\",\n  \"unviewed_position_start\",\n  \"impl\",\n  \"vad_type\",\n  \"gdpr\",\n  \"gdpr_consent\",\n  \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n  { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n  { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n  { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n  { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n  { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder2(value) {\n  if (value == null) return true;\n  const trimmed = value.trim();\n  if (!trimmed) return true;\n  if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n  return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n  if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n    try {\n      const buf = new Uint32Array(2);\n      crypto.getRandomValues(buf);\n      const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n      if (value > 0) {\n        return String(value);\n      }\n    } catch {\n    }\n  }\n  return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n  let url = baseUrl;\n  for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n    const value = getValue(ctx);\n    if (value != null && value !== \"\") {\n      url = url.replace(pattern, encodeURIComponent(value));\n    }\n  }\n  return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n  const runtimeId = ctx.deviceId?.trim();\n  const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n  const tagRdid = params.get(\"rdid\");\n  const tagType = params.get(\"idtype\");\n  const tagLat = params.get(\"is_lat\");\n  const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n  if (runtimeId) {\n    params.set(\"rdid\", runtimeId);\n    params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n    params.set(\"is_lat\", latValue ?? (isMacroPlaceholder2(tagLat) ? \"0\" : tagLat));\n    return;\n  }\n  const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));\n  const tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));\n  if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n    params.delete(\"rdid\");\n    params.delete(\"idtype\");\n    params.delete(\"is_lat\");\n    return;\n  }\n  if (tagRdidValid) {\n    if (isMacroPlaceholder2(tagType) && runtimeType) {\n      params.set(\"idtype\", runtimeType);\n    }\n    if (isMacroPlaceholder2(tagLat)) {\n      params.set(\"is_lat\", latValue ?? \"0\");\n    }\n    return;\n  }\n  params.delete(\"rdid\");\n  params.delete(\"idtype\");\n  params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n  const toDelete = [];\n  params.forEach((_value, key) => {\n    if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n      toDelete.push(key);\n    }\n  });\n  if (appName && appName.includes(\"&\")) {\n    for (const suffix of appName.split(\"&\").slice(1)) {\n      const trimmed = suffix.trimStart();\n      if (!trimmed) continue;\n      toDelete.push(suffix, ` ${trimmed}`, trimmed);\n    }\n  }\n  for (const key of new Set(toDelete)) {\n    if (key) params.delete(key);\n  }\n}\nfunction normalizeVastTagUrl(raw) {\n  if (!raw) return raw;\n  try {\n    const url = new URL(raw);\n    const anValue = url.searchParams.get(\"an\");\n    if (anValue !== null) {\n      const orphanFragments = [];\n      url.searchParams.forEach((_value, key) => {\n        if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n          orphanFragments.push(key.trim());\n        }\n      });\n      if (orphanFragments.length > 0) {\n        const reconstructed = [anValue.trimEnd(), ...orphanFragments].filter(Boolean).join(\" & \");\n        url.searchParams.forEach((_value, key) => {\n          if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n            url.searchParams.delete(key);\n          }\n        });\n        url.searchParams.set(\"an\", reconstructed);\n        return url.toString().replace(\n          /([?&]an=)([^&]*)/,\n          (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n        );\n      }\n    }\n    removeBrokenAppNameOrphans(url.searchParams);\n    return url.toString();\n  } catch {\n    return raw;\n  }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n  const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n  let url;\n  try {\n    url = new URL(normalizeVastTagUrl(expandedUrl));\n  } catch {\n    return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n  }\n  const params = url.searchParams;\n  removeBrokenAppNameOrphans(params, ctx.appName);\n  params.set(\"correlator\", ctx.correlator);\n  params.set(\"scor\", ctx.streamCorrelator);\n  if (ctx.isCtv) {\n    for (const key of CTV_UNSUPPORTED_PARAMS) {\n      params.delete(key);\n    }\n  }\n  if (ctx.pod != null) {\n    params.set(\"pod\", String(ctx.pod));\n  }\n  params.delete(\"ppos\");\n  params.delete(\"lip\");\n  if (ctx.podMinDurationMs != null) {\n    params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n  }\n  if (ctx.podMaxDurationMs != null) {\n    params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n  }\n  if (ctx.podMaxAds != null) {\n    params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n  }\n  const requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\n    const existingUrl = params.get(\"url\") || \"\";\n    if (EXAMPLE_COM_URL.test(existingUrl)) {\n      params.delete(\"url\");\n      params.delete(\"description_url\");\n    }\n  }\n  if (ctx.adWillPlayMuted != null) {\n    params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n  }\n  if (ctx.adWillAutoPlay != null) {\n    params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n  }\n  if (ctx.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\n  }\n  if (ctx.sessionId) {\n    params.set(\"sid\", ctx.sessionId);\n  }\n  if (ctx.deviceTypeHint != null) {\n    params.set(\"dth\", String(ctx.deviceTypeHint));\n  } else if (ctx.isCtv) {\n    params.set(\"dth\", \"5\");\n  }\n  applyDeviceIdentityParams(params, ctx);\n  if (!ctx.isCtv) {\n    const consent = ctx.consent;\n    if (consent?.gdpr != null) {\n      params.set(\"gdpr\", consent.gdpr);\n    }\n    if (consent?.gdprConsent != null) {\n      params.set(\"gdpr_consent\", consent.gdprConsent);\n    }\n    if (consent?.usPrivacy != null) {\n      params.set(\"us_privacy\", consent.usPrivacy);\n    }\n  }\n  if (ctx.adTest) {\n    params.set(\"adtest\", \"on\");\n  }\n  const staleKeys = [];\n  params.forEach((value, key) => {\n    if (isMacroPlaceholder2(value)) {\n      staleKeys.push(key);\n    }\n  });\n  for (const key of staleKeys) {\n    params.delete(key);\n  }\n  removeBrokenAppNameOrphans(params, ctx.appName);\n  return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n  const correlatorRegex = /([?&])correlator=([^&]*)/;\n  if (correlatorRegex.test(baseUrl)) {\n    return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n  }\n  const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n  return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n  const signals = {};\n  if (typeof window === \"undefined\") {\n    return Promise.resolve(signals);\n  }\n  const tasks = [];\n  const tcfApi = window.__tcfapi;\n  if (typeof tcfApi === \"function\") {\n    tasks.push(\n      new Promise((resolve) => {\n        let settled = false;\n        try {\n          tcfApi(\"addEventListener\", 2, (tcData, success) => {\n            if (settled) return;\n            if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n              settled = true;\n              signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n              if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n                signals.gdprConsent = tcData.tcString;\n              }\n              try {\n                tcfApi(\"removeEventListener\", 2, () => {\n                }, tcData.listenerId);\n              } catch {\n              }\n              resolve();\n            }\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(() => {\n          if (!settled) {\n            settled = true;\n            resolve();\n          }\n        }, timeoutMs);\n      })\n    );\n  }\n  const uspApi = window.__uspapi;\n  if (typeof uspApi === \"function\") {\n    tasks.push(\n      new Promise((resolve) => {\n        try {\n          uspApi(\"getUSPData\", 1, (data, success) => {\n            if (success && typeof data?.uspString === \"string\" && data.uspString) {\n              signals.usPrivacy = data.uspString;\n            }\n            resolve();\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(resolve, timeoutMs);\n      })\n    );\n  }\n  if (tasks.length === 0) {\n    return Promise.resolve(signals);\n  }\n  return Promise.all(tasks).then(() => signals);\n}\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n  const match = ua.match(/Chrome\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n  const match = ua.match(/AppleWebKit\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n  if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n    return navigator.userAgentData.platform;\n  }\n  const ua = navigator.userAgent;\n  if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n    return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n  }\n  if (/Win/i.test(ua)) {\n    return \"Win32\";\n  }\n  if (/Linux/i.test(ua)) {\n    return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n  }\n  if (/CrOS/i.test(ua)) {\n    return \"CrOS\";\n  }\n  return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n  const ua = navigator.userAgent;\n  const platform = getPlatform();\n  let name = \"Unknown\";\n  let version = \"0\";\n  let majorVersion = 0;\n  let isSmartTV = false;\n  let isLegacyTV = false;\n  let supportsModernJS = true;\n  let webOSVersion;\n  let tizenVersion;\n  let chromeVersionNum;\n  const chromeVersion = getChromeVersion(ua);\n  const webkitVersion = getWebKitVersion(ua);\n  chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n  if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n    name = \"LG WebOS\";\n    isSmartTV = true;\n    let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n    if (!match || !match[1]) {\n      match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n    }\n    if (match && match[1]) {\n      version = match[1];\n      const parts = version.split(\".\");\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      webOSVersion = majorVersion;\n    } else if (chromeVersion > 0) {\n      if (chromeVersion >= 79) {\n        webOSVersion = 6;\n        version = \"6.0\";\n        majorVersion = 6;\n      } else if (chromeVersion >= 68) {\n        webOSVersion = 5;\n        version = \"5.0\";\n        majorVersion = 5;\n      } else if (chromeVersion >= 53) {\n        webOSVersion = 4;\n        version = \"4.0\";\n        majorVersion = 4;\n      } else if (chromeVersion >= 38) {\n        webOSVersion = 3;\n        version = \"3.0\";\n        majorVersion = 3;\n      } else {\n        webOSVersion = 2;\n        version = \"2.0\";\n        majorVersion = 2;\n      }\n    } else {\n      version = \"Unknown\";\n      webOSVersion = void 0;\n    }\n    isLegacyTV = webOSVersion !== void 0 && webOSVersion < 3;\n  } else if (/Tizen/i.test(ua)) {\n    name = \"Samsung Tizen\";\n    isSmartTV = true;\n    const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n    version = match && match[1] ? match[1] : \"Unknown\";\n    if (version !== \"Unknown\") {\n      const parts = version.split(\".\");\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      tizenVersion = majorVersion;\n    }\n    isLegacyTV = tizenVersion !== void 0 && tizenVersion < 3;\n  } else if (/SMART-TV|SmartTV/i.test(ua)) {\n    name = \"Smart TV\";\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else if (/NetCast/i.test(ua)) {\n    name = \"LG NetCast\";\n    isSmartTV = true;\n    isLegacyTV = true;\n  } else if (/BRAVIA/i.test(ua)) {\n    name = \"Sony BRAVIA\";\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else {\n    if (chromeVersion > 0) {\n      name = \"Chrome\";\n      version = chromeVersion.toString();\n      majorVersion = chromeVersion;\n      if (chromeVersion < 50) {\n        supportsModernJS = false;\n      }\n    }\n    if (webkitVersion > 0 && webkitVersion < 600) {\n      supportsModernJS = false;\n    }\n  }\n  if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n    supportsModernJS = false;\n  }\n  if (typeof URLSearchParams === \"undefined\") {\n    supportsModernJS = false;\n  }\n  return {\n    name,\n    version,\n    majorVersion,\n    isSmartTV,\n    isLegacyTV,\n    platform,\n    supportsModernJS,\n    webOSVersion,\n    tizenVersion,\n    chromeVersion: chromeVersionNum\n  };\n}\nfunction getBrowserConfigOverrides() {\n  const browser = detectBrowser();\n  const overrides = {};\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = true;\n  }\n  return overrides;\n}\nfunction logBrowserInfo(debug = false) {\n  if (!debug) return;\n  const browser = detectBrowser();\n  console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n    browser: `${browser.name} ${browser.version}`,\n    platform: browser.platform,\n    isSmartTV: browser.isSmartTV,\n    isLegacyTV: browser.isLegacyTV,\n    supportsModernJS: browser.supportsModernJS,\n    ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n    ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n    ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n    userAgent: navigator.userAgent\n  });\n}\n\n// src/player/Scte35Parser.ts\nfunction parseCueOutDuration(value) {\n  const num = parseFloat(value.trim());\n  if (!Number.isNaN(num)) return num;\n  const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (match && match[1] != null) {\n    const dStr = match[1];\n    const d = parseFloat(dStr);\n    return Number.isNaN(d) ? void 0 : d;\n  }\n  return void 0;\n}\nfunction parseCueOutCont(value) {\n  const res = {};\n  const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n  const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (elapsedMatch && elapsedMatch[1] != null) {\n    const e = parseFloat(elapsedMatch[1]);\n    if (!Number.isNaN(e)) res.elapsed = e;\n  }\n  if (durationMatch && durationMatch[1] != null) {\n    const d = parseFloat(durationMatch[1]);\n    if (!Number.isNaN(d)) res.duration = d;\n  }\n  if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n    const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n    if (slashMatch && slashMatch[1] && slashMatch[2]) {\n      const elapsed = parseFloat(slashMatch[1]);\n      const duration = parseFloat(slashMatch[2]);\n      if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n      if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n    }\n  }\n  if (\"elapsed\" in res || \"duration\" in res) return res;\n  return void 0;\n}\nfunction parseAttributeList(value) {\n  const attrs = {};\n  const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n  let match;\n  while ((match = regex.exec(value)) !== null) {\n    const key = match[1] ?? \"\";\n    let rawVal = match[3] ?? match[4] ?? \"\";\n    if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n      rawVal = rawVal.slice(1, -1);\n    }\n    if (key) {\n      attrs[key] = rawVal;\n    }\n  }\n  return attrs;\n}\nfunction toNumber(val) {\n  if (val == null) return void 0;\n  const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n  return Number.isNaN(n) ? void 0 : n;\n}\nfunction isManifestBasedMarker(marker) {\n  const raw = marker.raw;\n  if (!raw) return false;\n  if (raw.tag) {\n    const tag = String(raw.tag);\n    return tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-CUE-IN\") || tag.includes(\"EXT-X-DATERANGE\");\n  }\n  if (raw.id3) return false;\n  if (raw.splice_command_type) return false;\n  return false;\n}\nfunction decodeId3ValueToText(value) {\n  try {\n    if (typeof value === \"string\") return value;\n    const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n    const text = decoder.decode(value);\n    if (text && /[\\x20-\\x7E]/.test(text)) return text;\n    let out = \"\";\n    for (let i = 0; i < value.length; i++)\n      out += String.fromCharCode(value[i]);\n    return out;\n  } catch {\n    return void 0;\n  }\n}\nfunction getFragmentStartSeconds(frag) {\n  const candidates = [frag?.start, frag?.startPTS];\n  for (const candidate of candidates) {\n    if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n      return candidate;\n    }\n  }\n  return void 0;\n}\nfunction parseScte35FromId3(tag) {\n  const text = decodeId3ValueToText(tag.value);\n  if (!text) return void 0;\n  const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n  if (cueOutMatch) {\n    const arg = (cueOutMatch[1] ?? \"\").trim();\n    const dur = parseCueOutDuration(arg);\n    const marker = {\n      type: \"start\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      ...dur !== void 0 ? { durationSeconds: dur } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n  if (cueOutContMatch) {\n    const arg = (cueOutContMatch[1] ?? \"\").trim();\n    const cont = parseCueOutCont(arg);\n    const marker = {\n      type: \"progress\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n  if (cueInMatch) {\n    const marker = {\n      type: \"end\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n  if (daterangeMatch) {\n    const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n    const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n    const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n    const klass = String(attrs[\"CLASS\"] ?? \"\");\n    const duration = toNumber(attrs[\"DURATION\"]);\n    if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n      const marker = {\n        type: \"start\",\n        ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n        ...duration !== void 0 ? { durationSeconds: duration } : {},\n        raw: { id3: text, attrs }\n      };\n      return marker;\n    }\n    if (hasScteIn) {\n      const marker = {\n        type: \"end\",\n        ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n        raw: { id3: text, attrs }\n      };\n      return marker;\n    }\n  }\n  if (/SCTE35-OUT/i.test(text)) {\n    const marker = {\n      type: \"start\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  if (/SCTE35-IN/i.test(text)) {\n    const marker = {\n      type: \"end\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  if (tag.value instanceof Uint8Array) {\n    const bin = parseScte35Binary(tag.value);\n    if (bin) return bin;\n  }\n  return void 0;\n}\nfunction normalizeFragmentPayload(payload) {\n  if (payload instanceof Uint8Array) {\n    return payload;\n  }\n  if (payload instanceof ArrayBuffer) {\n    return new Uint8Array(payload);\n  }\n  if (ArrayBuffer.isView(payload)) {\n    const view = payload;\n    return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n  }\n  return void 0;\n}\nfunction detectTsPacketFormat(data) {\n  const packetSizes = [188, 192, 204];\n  for (const packetSize of packetSizes) {\n    const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n    for (let offset = 0; offset < packetSize; offset++) {\n      let matchedPackets = 0;\n      for (let packetStart = offset; packetStart + tsPayloadOffset < data.length && matchedPackets < 5; packetStart += packetSize) {\n        if (data[packetStart + tsPayloadOffset] !== 71) {\n          break;\n        }\n        matchedPackets++;\n      }\n      if (matchedPackets >= 2) {\n        return { offset, packetSize, tsPayloadOffset };\n      }\n    }\n  }\n  return void 0;\n}\nfunction getPsiSectionStart(payload, payloadUnitStart) {\n  if (!payloadUnitStart) {\n    return void 0;\n  }\n  const pointerField = payload[0];\n  if (pointerField == null) {\n    return void 0;\n  }\n  const sectionStart = 1 + pointerField;\n  return sectionStart < payload.length ? sectionStart : void 0;\n}\nfunction getPsiSectionLength(data, offset) {\n  return ((data[offset + 1] ?? 0) & 15) << 8 | (data[offset + 2] ?? 0);\n}\nfunction parsePatSection(payload, payloadUnitStart, pmtPids) {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 8 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0) {\n    return;\n  }\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n    const programNumber = (payload[offset] ?? 0) << 8 | (payload[offset + 1] ?? 0);\n    const pid = ((payload[offset + 2] ?? 0) & 31) << 8 | (payload[offset + 3] ?? 0);\n    if (programNumber !== 0) {\n      pmtPids.add(pid);\n    }\n  }\n}\nfunction descriptorsIdentifyScte35(data, start, end) {\n  let offset = start;\n  while (offset + 2 <= end) {\n    const tag = data[offset] ?? 0;\n    const length = data[offset + 1] ?? 0;\n    const descriptorStart = offset + 2;\n    const descriptorEnd = descriptorStart + length;\n    if (descriptorEnd > end) {\n      return false;\n    }\n    const registration = length >= 4 ? String.fromCharCode(\n      data[descriptorStart] ?? 0,\n      data[descriptorStart + 1] ?? 0,\n      data[descriptorStart + 2] ?? 0,\n      data[descriptorStart + 3] ?? 0\n    ) : \"\";\n    if (tag === 138 || registration === \"CUEI\" || registration === \"SCTE\") {\n      return true;\n    }\n    offset = descriptorEnd;\n  }\n  return false;\n}\nfunction parsePmtSection(payload, payloadUnitStart, tsScte35Pids) {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 12 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 2) {\n    return;\n  }\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  const programInfoLength = ((payload[sectionStart + 10] ?? 0) & 15) << 8 | (payload[sectionStart + 11] ?? 0);\n  let offset = sectionStart + 12 + programInfoLength;\n  while (offset + 5 <= sectionEnd - 4) {\n    const streamType = payload[offset] ?? 0;\n    const elementaryPid = ((payload[offset + 1] ?? 0) & 31) << 8 | (payload[offset + 2] ?? 0);\n    const esInfoLength = ((payload[offset + 3] ?? 0) & 15) << 8 | (payload[offset + 4] ?? 0);\n    const descriptorStart = offset + 5;\n    const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n    if (streamType === 134 || streamType === 6 && descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd)) {\n      tsScte35Pids.add(elementaryPid);\n    }\n    offset = descriptorStart + esInfoLength;\n  }\n}\nfunction hasProcessedTsScte35Section(section, processedSections) {\n  let checksum = 0;\n  for (let i = 0; i < section.length; i++) {\n    checksum = checksum * 31 + (section[i] ?? 0) >>> 0;\n  }\n  const key = `${section.length}:${checksum}`;\n  if (processedSections.has(key)) {\n    return true;\n  }\n  processedSections.add(key);\n  if (processedSections.size > 200) {\n    const firstKey = processedSections.values().next().value;\n    if (firstKey) {\n      processedSections.delete(firstKey);\n    }\n  }\n  return false;\n}\nfunction addScte35SectionMarker(section, markers, processedSections) {\n  if (section[0] !== 252 || hasProcessedTsScte35Section(section, processedSections)) {\n    return;\n  }\n  const marker = parseScte35Binary(section);\n  if (!marker) {\n    return;\n  }\n  marker.raw = {\n    ...typeof marker.raw === \"object\" && marker.raw ? marker.raw : {},\n    source: \"ts-packet\"\n  };\n  markers.push(marker);\n}\nfunction appendScte35Bytes(pid, bytes, assemblers, markers, processedSections) {\n  const assembler = assemblers.get(pid);\n  if (!assembler) {\n    return;\n  }\n  for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n    assembler.bytes.push(bytes[i] ?? 0);\n  }\n  if (assembler.bytes.length >= assembler.expectedLength) {\n    assemblers.delete(pid);\n    addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n  }\n}\nfunction collectScte35SectionsFromPayload(pid, payload, payloadUnitStart, assemblers, markers, processedSections) {\n  if (payload.length === 0) {\n    return;\n  }\n  let offset = 0;\n  if (payloadUnitStart) {\n    const pointerField = payload[0] ?? 0;\n    const previousAssembler = assemblers.get(pid);\n    if (previousAssembler && pointerField > 0) {\n      appendScte35Bytes(\n        pid,\n        payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n        assemblers,\n        markers,\n        processedSections\n      );\n    }\n    assemblers.delete(pid);\n    offset = 1 + pointerField;\n  } else {\n    appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n    return;\n  }\n  while (offset + 3 <= payload.length) {\n    const tableId = payload[offset];\n    if (tableId == null || tableId === 255) {\n      return;\n    }\n    const sectionLength = getPsiSectionLength(payload, offset);\n    const totalLength = 3 + sectionLength;\n    if (sectionLength <= 0 || totalLength <= 3) {\n      return;\n    }\n    if (offset + totalLength <= payload.length) {\n      addScte35SectionMarker(\n        payload.subarray(offset, offset + totalLength),\n        markers,\n        processedSections\n      );\n      offset += totalLength;\n    } else {\n      assemblers.set(pid, {\n        bytes: Array.from(payload.subarray(offset)),\n        expectedLength: totalLength\n      });\n      return;\n    }\n  }\n}\nfunction parseScte35FromTsPackets(data, tsScte35Pids, pmtPids, processedSections) {\n  const packetInfo = detectTsPacketFormat(data);\n  if (!packetInfo) {\n    return [];\n  }\n  const markers = [];\n  const sectionAssemblers = /* @__PURE__ */ new Map();\n  for (let packetStart = packetInfo.offset; packetStart + packetInfo.packetSize <= data.length; packetStart += packetInfo.packetSize) {\n    const tsStart = packetStart + packetInfo.tsPayloadOffset;\n    if (data[tsStart] !== 71) {\n      continue;\n    }\n    const secondByte = data[tsStart + 1];\n    const thirdByte = data[tsStart + 2];\n    const fourthByte = data[tsStart + 3];\n    if (secondByte == null || thirdByte == null || fourthByte == null || (secondByte & 128) !== 0) {\n      continue;\n    }\n    const payloadUnitStart = (secondByte & 64) !== 0;\n    const pid = (secondByte & 31) << 8 | thirdByte;\n    const adaptationFieldControl = fourthByte >> 4 & 3;\n    const hasPayload = adaptationFieldControl === 1 || adaptationFieldControl === 3;\n    if (!hasPayload) {\n      continue;\n    }\n    let payloadStart = tsStart + 4;\n    if (adaptationFieldControl === 3) {\n      const adaptationLength = data[payloadStart];\n      if (adaptationLength == null) {\n        continue;\n      }\n      payloadStart += 1 + adaptationLength;\n    }\n    const payloadEnd = Math.min(tsStart + 188, data.length);\n    if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n      continue;\n    }\n    const payload = data.subarray(payloadStart, payloadEnd);\n    if (pid === 0) {\n      parsePatSection(payload, payloadUnitStart, pmtPids);\n    } else if (pmtPids.has(pid)) {\n      parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n    } else if (tsScte35Pids.has(pid)) {\n      collectScte35SectionsFromPayload(\n        pid,\n        payload,\n        payloadUnitStart,\n        sectionAssemblers,\n        markers,\n        processedSections\n      );\n    }\n  }\n  return markers;\n}\nvar BitReader = class {\n  constructor(buf) {\n    this.buf = buf;\n    this.bytePos = 0;\n    this.bitPos = 0;\n  }\n  readBits(numBits) {\n    let result = 0;\n    while (numBits > 0) {\n      if (this.bytePos >= this.buf.length) return result;\n      const remainingInByte = 8 - this.bitPos;\n      const toRead = Math.min(numBits, remainingInByte);\n      const currentByte = this.buf[this.bytePos];\n      const shift = remainingInByte - toRead;\n      const mask = (1 << toRead) - 1 & 255;\n      const bits = currentByte >> shift & mask;\n      result = result << toRead | bits;\n      this.bitPos += toRead;\n      if (this.bitPos >= 8) {\n        this.bitPos = 0;\n        this.bytePos += 1;\n      }\n      numBits -= toRead;\n    }\n    return result >>> 0;\n  }\n  skipBits(n) {\n    this.readBits(n);\n  }\n  get bytePosition() {\n    return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n  }\n};\nfunction readSpliceTime(r, ptsAdjustmentTicks) {\n  const timeSpecifiedFlag = r.readBits(1) === 1;\n  if (!timeSpecifiedFlag) {\n    r.readBits(7);\n    return void 0;\n  }\n  r.readBits(6);\n  const high = r.readBits(1);\n  const low = r.readBits(32);\n  const ptsTicks = (high * 4294967296 + low + ptsAdjustmentTicks) % 8589934592;\n  return ptsTicks / 9e4;\n}\nfunction markerTypeFromSegmentationTypeId(segmentationTypeId) {\n  switch (segmentationTypeId) {\n    case 16:\n    case 34:\n    case 48:\n    case 50:\n    case 52:\n    case 54:\n      return \"start\";\n    case 17:\n    case 35:\n    case 49:\n    case 51:\n    case 53:\n    case 55:\n      return \"end\";\n    default:\n      return void 0;\n  }\n}\nfunction parseScte35SegmentationDescriptor(descriptor) {\n  if (descriptor.length < 11) {\n    return void 0;\n  }\n  const identifier = String.fromCharCode(\n    descriptor[0] ?? 0,\n    descriptor[1] ?? 0,\n    descriptor[2] ?? 0,\n    descriptor[3] ?? 0\n  );\n  if (identifier !== \"CUEI\") {\n    return void 0;\n  }\n  const segmentationEventId = (descriptor[4] ?? 0) * 16777216 + ((descriptor[5] ?? 0) << 16) + ((descriptor[6] ?? 0) << 8) + (descriptor[7] ?? 0);\n  const cancelIndicator = ((descriptor[8] ?? 0) & 128) !== 0;\n  if (cancelIndicator) {\n    return void 0;\n  }\n  const flags = descriptor[9] ?? 0;\n  const programSegmentationFlag = (flags & 128) !== 0;\n  const segmentationDurationFlag = (flags & 64) !== 0;\n  let offset = 10;\n  if (!programSegmentationFlag) {\n    const componentCount = descriptor[offset] ?? 0;\n    offset += 1 + componentCount * 6;\n    if (offset > descriptor.length) {\n      return void 0;\n    }\n  }\n  let durationSeconds = void 0;\n  if (segmentationDurationFlag) {\n    if (offset + 5 > descriptor.length) {\n      return void 0;\n    }\n    const durationTicks = (descriptor[offset] ?? 0) * 4294967296 + (descriptor[offset + 1] ?? 0) * 16777216 + ((descriptor[offset + 2] ?? 0) << 16) + ((descriptor[offset + 3] ?? 0) << 8) + (descriptor[offset + 4] ?? 0);\n    durationSeconds = durationTicks / 9e4;\n    offset += 5;\n  }\n  if (offset + 2 > descriptor.length) {\n    return void 0;\n  }\n  offset += 1;\n  const segmentationUpidLength = descriptor[offset] ?? 0;\n  offset += 1 + segmentationUpidLength;\n  if (offset >= descriptor.length) {\n    return void 0;\n  }\n  const segmentationTypeId = descriptor[offset] ?? 0;\n  const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n  if (!markerType) {\n    return void 0;\n  }\n  return {\n    type: markerType,\n    ...durationSeconds !== void 0 ? { durationSeconds } : {},\n    segmentationEventId\n  };\n}\nfunction parseScte35SegmentationDescriptors(data, offset) {\n  if (offset + 2 > data.length) {\n    return void 0;\n  }\n  const descriptorLoopLength = (data[offset] ?? 0) << 8 | (data[offset + 1] ?? 0);\n  let descriptorOffset = offset + 2;\n  const descriptorEnd = Math.min(\n    data.length,\n    descriptorOffset + descriptorLoopLength\n  );\n  while (descriptorOffset + 2 <= descriptorEnd) {\n    const descriptorTag = data[descriptorOffset] ?? 0;\n    const descriptorLength = data[descriptorOffset + 1] ?? 0;\n    const descriptorDataStart = descriptorOffset + 2;\n    const descriptorDataEnd = descriptorDataStart + descriptorLength;\n    if (descriptorDataEnd > descriptorEnd) {\n      return void 0;\n    }\n    if (descriptorTag === 2) {\n      const descriptorMarker = parseScte35SegmentationDescriptor(\n        data.subarray(descriptorDataStart, descriptorDataEnd)\n      );\n      if (descriptorMarker) {\n        return descriptorMarker;\n      }\n    }\n    descriptorOffset = descriptorDataEnd;\n  }\n  return void 0;\n}\nfunction parseScte35Binary(data) {\n  const r = new BitReader(data);\n  const tableId = r.readBits(8);\n  if (tableId !== 252) return void 0;\n  r.readBits(1);\n  r.readBits(1);\n  r.readBits(2);\n  const sectionLength = r.readBits(12);\n  if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n    return void 0;\n  }\n  r.readBits(8);\n  r.readBits(1);\n  r.readBits(6);\n  const ptsAdjHigh = r.readBits(1);\n  const ptsAdjLow = r.readBits(32);\n  const ptsAdjustmentTicks = ptsAdjHigh * 4294967296 + ptsAdjLow;\n  r.readBits(8);\n  r.readBits(12);\n  const spliceCommandLength = r.readBits(12);\n  const spliceCommandType = r.readBits(8);\n  let markerType;\n  let durationSeconds = void 0;\n  let ptsSeconds = void 0;\n  let spliceEventId = void 0;\n  const commandBodyStart = r.bytePosition;\n  if (spliceCommandType === 5) {\n    spliceEventId = r.readBits(32);\n    const cancel = r.readBits(1) === 1;\n    r.readBits(7);\n    if (cancel) return void 0;\n    const outOfNetwork = r.readBits(1) === 1;\n    const programSpliceFlag = r.readBits(1) === 1;\n    const durationFlag = r.readBits(1) === 1;\n    const spliceImmediateFlag = r.readBits(1) === 1;\n    r.readBits(4);\n    markerType = outOfNetwork ? \"start\" : \"end\";\n    if (programSpliceFlag && !spliceImmediateFlag) {\n      ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n    } else if (!programSpliceFlag) {\n      const componentCount = r.readBits(8);\n      for (let i = 0; i < componentCount; i++) {\n        r.readBits(8);\n        if (!spliceImmediateFlag) {\n          const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n          if (ptsSeconds === void 0) {\n            ptsSeconds = componentPtsSeconds;\n          }\n        }\n      }\n    }\n    if (durationFlag) {\n      r.readBits(6);\n      r.readBits(1);\n      const high = r.readBits(1);\n      const low = r.readBits(32);\n      const durationTicks = high * 4294967296 + low;\n      durationSeconds = durationTicks / 9e4;\n    }\n    r.readBits(16);\n    r.readBits(8);\n    r.readBits(8);\n  } else if (spliceCommandType === 6) {\n    ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n  } else {\n    return void 0;\n  }\n  const expectedDescriptorOffset = spliceCommandLength === 4095 ? r.bytePosition : commandBodyStart + spliceCommandLength;\n  const descriptorMarker = parseScte35SegmentationDescriptors(\n    data,\n    expectedDescriptorOffset\n  );\n  if (descriptorMarker) {\n    markerType = descriptorMarker.type;\n    if (durationSeconds === void 0) {\n      durationSeconds = descriptorMarker.durationSeconds;\n    }\n  }\n  if (!markerType) {\n    return void 0;\n  }\n  const marker = {\n    type: markerType,\n    ...ptsSeconds !== void 0 ? { ptsSeconds } : {},\n    ...durationSeconds !== void 0 ? { durationSeconds } : {},\n    raw: {\n      splice_command_type: spliceCommandType,\n      ...spliceEventId !== void 0 ? { splice_event_id: spliceEventId } : {},\n      ...descriptorMarker?.segmentationEventId !== void 0 ? { segmentation_event_id: descriptorMarker.segmentationEventId } : {}\n    }\n  };\n  return marker;\n}\n\n// src/player/Scte35CueManager.ts\nvar Scte35CueManager = class {\n  constructor(debug, callbacks) {\n    this.pendingScte35Cues = /* @__PURE__ */ new Map();\n    this.recentScte35CueKeys = /* @__PURE__ */ new Map();\n    this.recentScte35CueLimit = 200;\n    this.tsScte35Pids = /* @__PURE__ */ new Set();\n    this.pmtPids = /* @__PURE__ */ new Set();\n    this.processedTsScte35Sections = /* @__PURE__ */ new Set();\n    this.debug = debug;\n    this.callbacks = callbacks;\n  }\n  get pendingScte35CueKey() {\n    return this.pendingScte35CueKeyValue;\n  }\n  set pendingScte35CueKey(value) {\n    this.pendingScte35CueKeyValue = value;\n  }\n  get activeScte35BreakKey() {\n    return this.activeScte35BreakKeyValue;\n  }\n  set activeScte35BreakKey(value) {\n    this.activeScte35BreakKeyValue = value;\n  }\n  get scheduledScte35BreakKey() {\n    return this.scheduledScte35BreakKeyValue;\n  }\n  set scheduledScte35BreakKey(value) {\n    this.scheduledScte35BreakKeyValue = value;\n  }\n  createScte35CueContext(source, readiness, frag) {\n    const context = { source, readiness };\n    if (typeof frag?.sn === \"number\") {\n      context.fragmentSn = frag.sn;\n    }\n    const fragmentStartSec = getFragmentStartSeconds(frag);\n    if (fragmentStartSec !== void 0) {\n      context.fragmentStartSeconds = fragmentStartSec;\n    }\n    return context;\n  }\n  onScte35Cue(marker, context) {\n    const cue = this.createScte35Cue(marker, context);\n    const pendingKey = this.getPendingScte35CueKey(cue);\n    if (context.readiness === \"early\") {\n      this.pendingScte35Cues.set(pendingKey, cue);\n      this.trimRecentScte35CueMaps();\n      if (marker.type === \"start\") {\n        this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n      }\n      return;\n    }\n    if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n          key: cue.key,\n          activeScte35BreakKey: this.activeScte35BreakKeyValue,\n          inAdBreak: this.callbacks.isInAdBreak(),\n          source: cue.source\n        });\n      }\n      return;\n    }\n    if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n          key: cue.key,\n          source: cue.source\n        });\n      }\n      return;\n    }\n    this.pendingScte35Cues.delete(pendingKey);\n    this.markScte35CueHandled(cue);\n    this.callbacks.onPlaybackCue(marker, cue.key);\n  }\n  activatePendingScte35CuesForFragment(frag) {\n    const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : void 0;\n    if (fragmentSn === void 0) {\n      return;\n    }\n    const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n      ([, cue]) => cue.fragmentSn === fragmentSn\n    );\n    matchingCues.forEach(([pendingKey, cue]) => {\n      this.pendingScte35Cues.delete(pendingKey);\n      const context = {\n        source: cue.source,\n        readiness: \"playback\"\n      };\n      context.fragmentSn = fragmentSn;\n      const fragmentStartSec = cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n      if (fragmentStartSec !== void 0) {\n        context.fragmentStartSeconds = fragmentStartSec;\n      }\n      this.onScte35Cue(cue.marker, context);\n    });\n  }\n  createScte35Cue(marker, context) {\n    const cue = {\n      marker,\n      source: context.source,\n      readiness: context.readiness,\n      key: this.getScte35CueKey(marker, context)\n    };\n    if (context.fragmentSn !== void 0) {\n      cue.fragmentSn = context.fragmentSn;\n    }\n    if (context.fragmentStartSeconds !== void 0) {\n      cue.fragmentStartSeconds = context.fragmentStartSeconds;\n    }\n    return cue;\n  }\n  getScte35CueKey(marker, context) {\n    const raw = this.getScte35MarkerRaw(marker);\n    const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n    if (spliceEventId) {\n      return `splice:${spliceEventId}`;\n    }\n    const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n    if (segmentationEventId) {\n      return `segmentation:${segmentationEventId}`;\n    }\n    const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n    if (daterangeId) {\n      return `daterange:${daterangeId}`;\n    }\n    const scteValue = this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) || this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n    if (scteValue) {\n      return `daterange-scte:${scteValue}`;\n    }\n    if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n      return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n    }\n    if (context.fragmentSn !== void 0) {\n      return `fragment:${context.fragmentSn}`;\n    }\n    return `${context.source}:wallclock:${Math.floor(Date.now() / 1e3)}`;\n  }\n  getPendingScte35CueKey(cue) {\n    return `${cue.marker.type}:${cue.key}:${cue.fragmentSn !== void 0 ? cue.fragmentSn : \"unknown\"}`;\n  }\n  getScte35MarkerRaw(marker) {\n    return typeof marker.raw === \"object\" && marker.raw !== null ? marker.raw : {};\n  }\n  toIdentityString(value) {\n    if (typeof value === \"number\" && Number.isFinite(value)) {\n      return String(value);\n    }\n    if (typeof value === \"string\" && value.trim().length > 0) {\n      return value.trim();\n    }\n    return void 0;\n  }\n  isStrongScte35CueKey(key) {\n    return !!(key && (key.startsWith(\"splice:\") || key.startsWith(\"segmentation:\") || key.startsWith(\"daterange:\") || key.startsWith(\"daterange-scte:\")));\n  }\n  hasRecentlyHandledScte35Cue(cue) {\n    if (this.activeScte35BreakKeyValue === cue.key || this.scheduledScte35BreakKeyValue === cue.key) {\n      return true;\n    }\n    const recentKey = `${cue.marker.type}:${cue.key}`;\n    return this.recentScte35CueKeys.has(recentKey);\n  }\n  markScte35CueHandled(cue) {\n    this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n    this.trimRecentScte35CueMaps();\n  }\n  trimRecentScte35CueMaps() {\n    while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n      const firstKey = this.recentScte35CueKeys.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.recentScte35CueKeys.delete(firstKey);\n    }\n    while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n      const firstKey = this.pendingScte35Cues.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.pendingScte35Cues.delete(firstKey);\n    }\n  }\n  shouldAcceptScte35EndCue(cue) {\n    if (!this.callbacks.isInAdBreak()) {\n      return false;\n    }\n    if (this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) && this.isStrongScte35CueKey(cue.key) && this.activeScte35BreakKeyValue !== cue.key) {\n      return false;\n    }\n    return true;\n  }\n};\n\n// src/player/AdConfigManager.ts\nvar AdConfigManager = class {\n  constructor(config, video) {\n    this.vmapBreaks = [];\n    this.consumedVmapBreakIds = /* @__PURE__ */ new Set();\n    this.streamCorrelator = generateCorrelator();\n    this.viewCorrelator = generateCorrelator();\n    this.consentSignals = {};\n    this.podCounter = 0;\n    this.podAssignedByPrefetch = false;\n    this.lastHeartbeatTime = 0;\n    this.defaultPodMaxAds = 6;\n    this.defaultPodMaxDurationMs = 12e4;\n    this.config = config;\n    this.video = video;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  isVmapEnabled() {\n    return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n  }\n  async fetchAdConfiguration() {\n    if (this.isVmapEnabled()) {\n      await this.fetchAndParseVmap(this.config.vmapUrl);\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n      }\n      return;\n    }\n    const vastMode = this.config.vastMode || \"default\";\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n    }\n    if (vastMode === \"adstorm\") {\n      if (!this.config.licenseKey) {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n          );\n        }\n        return;\n      }\n      const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n      this.apiVastTagUrl = vastEndpoint;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n          vastEndpoint\n        );\n      }\n      return;\n    }\n    if (this.config.vastTagUrl) {\n      this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n      return;\n    }\n    const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n    if (this.debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n        apiUrl\n      );\n    }\n    const headers = {};\n    if (this.config.licenseKey) {\n      headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n    }\n    const response = await fetch(apiUrl, { headers });\n    if (!response.ok) {\n      if (this.debug) {\n        console.warn(\n          `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n        );\n      }\n      return;\n    }\n    const data = await response.json();\n    const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n    if (imaPayload) {\n      let decodedPayload = imaPayload;\n      try {\n        decodedPayload = decodeURIComponent(imaPayload);\n      } catch {\n        console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n      }\n      console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n      this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n    } else {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n        );\n      }\n    }\n    const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n    if (numberAds != null && numberAds > 0) {\n      this.apiNumberAds = numberAds;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n          this.apiNumberAds\n        );\n      }\n    }\n  }\n  async fetchAndParseVmap(vmapUrl) {\n    if (!vmapUrl.trim()) {\n      return;\n    }\n    try {\n      const response = await fetch(vmapUrl);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch VMAP (${response.status})`);\n      }\n      const vmapXml = await response.text();\n      this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n          vmapUrl\n        );\n      }\n    } catch (error) {\n      this.vmapBreaks = [];\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n      }\n    }\n  }\n  parseVmapToBreaks(vmapXml) {\n    if (typeof DOMParser === \"undefined\") {\n      return [];\n    }\n    const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n      }\n      return [];\n    }\n    const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n    let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(\n        doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n      );\n    }\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n        (el) => el.localName === \"AdBreak\"\n      );\n    }\n    const parsed = [];\n    adBreakNodes.forEach((node, index) => {\n      const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n      const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n      if (startTimeMs == null) {\n        return;\n      }\n      let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n      if (!adTagNode) {\n        adTagNode = node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") ?? void 0;\n      }\n      const adTagUrl = (adTagNode?.textContent || \"\").trim();\n      if (!adTagUrl) {\n        return;\n      }\n      const breakId = node.getAttribute(\"breakId\") || `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n      parsed.push({\n        id: breakId,\n        startTimeMs,\n        vastTagUrl: adTagUrl\n      });\n    });\n    parsed.sort((a, b) => {\n      const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n      const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n      return aStart - bStart;\n    });\n    return parsed;\n  }\n  parseVmapTimeOffsetToMs(timeOffset) {\n    if (!timeOffset) {\n      return void 0;\n    }\n    const normalized = timeOffset.trim().toLowerCase();\n    if (normalized === \"start\") {\n      return 0;\n    }\n    if (normalized === \"end\") {\n      return -1;\n    }\n    const hms = timeOffset.match(\n      /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n    );\n    if (hms) {\n      const [, hh, mm, ss, ms = \"0\"] = hms;\n      const hours = Number(hh);\n      const minutes = Number(mm);\n      const seconds = Number(ss);\n      const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n      return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;\n    }\n    const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n    if (percent) {\n      const ratio = Number(percent[1]) / 100;\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1e3 * ratio);\n      }\n      return void 0;\n    }\n    return void 0;\n  }\n  getAdBreakKey(adBreak) {\n    if (adBreak.id) {\n      return adBreak.id;\n    }\n    return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n  }\n  resolveBreakStartMs(adBreak) {\n    if (adBreak.startTimeMs >= 0) {\n      return adBreak.startTimeMs;\n    }\n    if (adBreak.startTimeMs === -1) {\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1e3);\n      }\n    }\n    return void 0;\n  }\n  findCurrentOrNextBreak(nowMs) {\n    const schedule = this.vmapBreaks;\n    let candidate;\n    const tol = this.config.driftToleranceMs ?? 1e3;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))) {\n        candidate = b;\n      }\n    }\n    return candidate;\n  }\n  findBreakForTime(nowMs) {\n    const schedule = this.vmapBreaks;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (b.durationMs) {\n        const end = breakStartMs + b.durationMs;\n        if (nowMs >= breakStartMs && nowMs < end) {\n          return b;\n        }\n        continue;\n      }\n      if (nowMs >= breakStartMs) {\n        return b;\n      }\n    }\n    return void 0;\n  }\n  selectVastTagsForBreak(b) {\n    if (!b || !b.vastTagUrl) return void 0;\n    if (b.vastTagUrl.includes(\",\")) {\n      return b.vastTagUrl.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n    }\n    return [b.vastTagUrl];\n  }\n  beginNewAdPod() {\n    this.podCounter++;\n  }\n  resolvePodParams(breakDurationMs) {\n    const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0 ? this.config.podMaxDurationMs : this.defaultPodMaxDurationMs;\n    const maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;\n    const minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n    return { maxAds, minDurationMs, maxDurationMs };\n  }\n  generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {\n    const adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;\n    const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n    const urlWithMacros = applyVastMacros(baseUrl, {\n      correlator: this.viewCorrelator,\n      streamCorrelator: this.streamCorrelator,\n      pod: this.podCounter > 0 ? this.podCounter : void 0,\n      podMaxAds: podParams.maxAds,\n      podMinDurationMs: podParams.minDurationMs,\n      podMaxDurationMs: podParams.maxDurationMs,\n      isCtv: envSignals.isCtv,\n      contentUrl: envSignals.contentUrl,\n      pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? window.location.href : void 0,\n      adWillPlayMuted,\n      adWillAutoPlay: !!this.config.autoplay,\n      appId: envSignals.appId,\n      appName: envSignals.appName,\n      sessionId: envSignals.sessionId,\n      deviceId: envSignals.deviceId,\n      deviceIdType: envSignals.deviceIdType,\n      limitAdTracking: envSignals.limitAdTracking,\n      deviceTypeHint: envSignals.deviceTypeHint,\n      adTest: this.config.adTest,\n      consent: this.consentSignals\n    });\n    const finalUrl = palNonce.injectNonce(urlWithMacros);\n    console.log(\n      `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n      finalUrl\n    );\n    return finalUrl;\n  }\n  // --- Tracking ---\n  initializeTracking() {\n    sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).then(() => {\n      this.heartbeatInterval = window.setInterval(() => {\n        this.sendHeartbeatIfNeeded();\n      }, 5e3);\n    }).catch((error) => {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n          error\n        );\n      }\n      this.heartbeatInterval = window.setInterval(() => {\n        this.sendHeartbeatIfNeeded();\n      }, 5e3);\n    });\n  }\n  sendHeartbeatIfNeeded() {\n    const now = Date.now();\n    if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {\n      this.lastHeartbeatTime = now;\n      sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n            error\n          );\n        }\n      });\n    }\n  }\n  destroyTracking() {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = void 0;\n    }\n  }\n};\n\n// src/player/AdTimingService.ts\nvar AdTimingService = class {\n  constructor(config, video, callbacks) {\n    this.adRequestWatchdogToken = null;\n    this.adFailsafeToken = null;\n    this.ptsDriftEmaMs = 0;\n    this.adBreakPlayedDurationMs = 0;\n    this.adBreakEpoch = 0;\n    this.adRequestTokenCounter = 0;\n    this.activeAdRequestToken = null;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.totalAdRequestsInBreak = 0;\n    this.maxTotalAdRequestsPerBreak = 10;\n    this.lastAdRequestTime = 0;\n    this.consecutiveFailures = 0;\n    this.maxConsecutiveFailures = 5;\n    this.minAdRequestIntervalMs = 3e3;\n    this.backoffBaseMs = 1e3;\n    this.maxBackoffMs = 15e3;\n    this.defaultMinRemainingMsToStartAd = 4e3;\n    this.failedVastUrls = /* @__PURE__ */ new Set();\n    this.temporaryFailureUrls = /* @__PURE__ */ new Map();\n    this.temporaryFailureCooldownMs = 3e4;\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillThreshold = 3;\n    this.globalNoFillCooldownUntil = 0;\n    this.globalNoFillBackoffBaseMs = 5e3;\n    this.globalNoFillBackoffMaxMs = 6e4;\n    this.globalLastGamRequestTime = 0;\n    this.globalMinGamIntervalMs = 3e3;\n    this.config = config;\n    this.video = video;\n    this.callbacks = callbacks;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  // --- Ad stop timer ---\n  scheduleAdStopCountdown(remainingMs) {\n    this.clearAdStopTimer();\n    const ms = Math.max(0, Math.floor(remainingMs));\n    if (ms === 0) {\n      this.ensureAdStoppedByTimer();\n      return;\n    }\n    this.adStopTimerId = window.setTimeout(() => {\n      this.ensureAdStoppedByTimer();\n    }, ms);\n  }\n  clearAdStopTimer() {\n    if (this.adStopTimerId != null) {\n      clearTimeout(this.adStopTimerId);\n      this.adStopTimerId = void 0;\n    }\n  }\n  ensureAdStoppedByTimer() {\n    this.adStopTimerId = void 0;\n    this.callbacks.onAdStopTimerFired();\n  }\n  // --- Ad start timer ---\n  scheduleAdStartIn(delayMs, marker = { type: \"start\" }, cueKey) {\n    this.clearAdStartTimer();\n    const ms = Math.max(0, Math.floor(delayMs));\n    if (ms === 0) {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n      return;\n    }\n    this.adStartTimerId = window.setTimeout(() => {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n    }, ms);\n  }\n  clearAdStartTimer() {\n    if (this.adStartTimerId != null) {\n      clearTimeout(this.adStartTimerId);\n      this.adStartTimerId = void 0;\n    }\n  }\n  // --- PTS drift ---\n  updatePtsDrift(ptsSecondsSample) {\n    const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n    if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n    const alpha = 0.1;\n    this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n  }\n  resolveScteBreakStartWallClockMs(marker) {\n    const nowWallClockMs = Date.now();\n    if (typeof marker.ptsSeconds !== \"number\") {\n      return nowWallClockMs;\n    }\n    const nowMs = this.video.currentTime * 1e3;\n    const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n    const deltaMs = marker.ptsSeconds * 1e3 - estimatedCurrentPtsMs;\n    if (!Number.isFinite(deltaMs)) {\n      return nowWallClockMs;\n    }\n    return nowWallClockMs + Math.floor(deltaMs);\n  }\n  // --- Duration boundary ---\n  setAdBreakDurationBoundary(durationMs) {\n    this.expectedAdBreakDurationMs = durationMs;\n    if (durationMs != null && this.currentAdBreakStartWallClockMs != null) {\n      this.scteAdBreakEndWallClockMs = this.currentAdBreakStartWallClockMs + durationMs;\n    } else {\n      this.scteAdBreakEndWallClockMs = void 0;\n    }\n  }\n  scheduleAdStopAtBreakBoundary() {\n    if (this.expectedAdBreakDurationMs == null) {\n      return;\n    }\n    this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n  }\n  // --- Duration budget ---\n  getWallClockRemainingAdMs() {\n    const endWallClockMs = this.getAdBreakEndWallClockMs();\n    if (endWallClockMs != null) {\n      return Math.max(0, endWallClockMs - Date.now());\n    }\n    return 0;\n  }\n  getAdBreakEndWallClockMs() {\n    if (this.scteAdBreakEndWallClockMs != null) {\n      return this.scteAdBreakEndWallClockMs;\n    }\n    if (this.expectedAdBreakDurationMs == null || this.currentAdBreakStartWallClockMs == null) {\n      return void 0;\n    }\n    return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n  }\n  getDurationBudgetRemainingMs() {\n    if (this.expectedAdBreakDurationMs == null) {\n      return 0;\n    }\n    return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n  }\n  getLoadedAdDurationMs(adController) {\n    const durationSec = adController.getLoadedAdDuration?.();\n    if (durationSec == null || durationSec <= 0) {\n      return 0;\n    }\n    return Math.round(durationSec * 1e3);\n  }\n  adFitsRemainingBudget(durationMs) {\n    if (durationMs <= 0) {\n      return true;\n    }\n    return durationMs <= this.getDurationBudgetRemainingMs();\n  }\n  logAdDurationDecision(accepted, durationMs, adController) {\n    if (!this.debug) {\n      return;\n    }\n    const remainingBudget = this.getDurationBudgetRemainingMs();\n    const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n    if (accepted) {\n      console.log(\n        `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n      );\n    } else {\n      console.log(\n        `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms \\u2014 requesting another ad`\n      );\n    }\n  }\n  recordPlayedAdDuration(adController) {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    if (durationMs <= 0) {\n      return;\n    }\n    this.adBreakPlayedDurationMs += durationMs;\n    if (this.debug) {\n      console.log(\n        `[AD-DURATION] Played ${durationMs}ms \\u2014 total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n      );\n    }\n  }\n  ensureLoadedAdFitsBudget(adController) {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    const fits = this.adFitsRemainingBudget(durationMs);\n    this.logAdDurationDecision(fits, durationMs, adController);\n    return fits;\n  }\n  rejectLoadedAdForDuration(adController) {\n    try {\n      adController.destroy();\n    } catch {\n    }\n  }\n  markAdStarted() {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n    this.totalAdRequestsInBreak++;\n    this.lastAdRequestTime = Date.now();\n  }\n  notePodAdStarted() {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n  }\n  getRemainingAdMs() {\n    const wallClockRemaining = this.getWallClockRemainingAdMs();\n    const budgetRemaining = this.getDurationBudgetRemainingMs();\n    if (this.expectedAdBreakDurationMs == null) {\n      return wallClockRemaining;\n    }\n    return Math.min(wallClockRemaining, budgetRemaining);\n  }\n  getMinRemainingMsToStartAd() {\n    const configured = this.config.minRemainingMsToStartAd;\n    if (typeof configured === \"number\" && configured >= 0) {\n      return configured;\n    }\n    return this.defaultMinRemainingMsToStartAd;\n  }\n  hasTimeToStartAnotherAd() {\n    const minRemaining = this.getMinRemainingMsToStartAd();\n    return this.getWallClockRemainingAdMs() > minRemaining && this.getDurationBudgetRemainingMs() > minRemaining;\n  }\n  // --- Circuit breaker ---\n  isTemporaryAdError(error) {\n    const message = error?.message?.toLowerCase() || \"\";\n    if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n      return true;\n    }\n    if (message.includes(\"timeout\")) {\n      return true;\n    }\n    if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n      return true;\n    }\n    if (message.includes(\"ad playback error\")) {\n      return true;\n    }\n    return false;\n  }\n  isUrlInCooldown(vastTagUrl) {\n    const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n    if (failureTime == null) {\n      return false;\n    }\n    const elapsed = Date.now() - failureTime;\n    if (elapsed >= this.temporaryFailureCooldownMs) {\n      this.temporaryFailureUrls.delete(vastTagUrl);\n      return false;\n    }\n    return true;\n  }\n  cleanupTemporaryFailures() {\n    const now = Date.now();\n    for (const [url, timestamp] of this.temporaryFailureUrls) {\n      if (now - timestamp >= this.temporaryFailureCooldownMs) {\n        this.temporaryFailureUrls.delete(url);\n      }\n    }\n  }\n  isGamInCooldown() {\n    return Date.now() < this.globalNoFillCooldownUntil;\n  }\n  recordGamNoFill() {\n    this.globalConsecutiveNoFills++;\n    if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n      const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n      const backoff = Math.min(\n        this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n        this.globalNoFillBackoffMaxMs\n      );\n      this.globalNoFillCooldownUntil = Date.now() + backoff;\n      if (this.debug) {\n        console.log(\n          `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n        );\n      }\n    }\n  }\n  resetGamNoFillCounter() {\n    if (this.globalConsecutiveNoFills > 0 && this.debug) {\n      console.log(\n        `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n      );\n    }\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillCooldownUntil = 0;\n  }\n  async enforceGlobalRateLimit() {\n    const now = Date.now();\n    const elapsed = now - this.globalLastGamRequestTime;\n    if (elapsed < this.globalMinGamIntervalMs) {\n      const waitMs = this.globalMinGamIntervalMs - elapsed;\n      if (this.debug) {\n        console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, waitMs));\n    }\n    this.globalLastGamRequestTime = Date.now();\n  }\n  // --- Watchdog ---\n  startAdRequestWatchdog(token) {\n    this.clearAdRequestWatchdog();\n    const timeoutMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n    this.adRequestWatchdogToken = token;\n    this.adRequestWatchdogId = window.setTimeout(() => {\n      if (this.adRequestWatchdogToken !== token) {\n        return;\n      }\n      this.adRequestWatchdogId = void 0;\n      this.adRequestWatchdogToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n      this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n      this.callbacks.onWatchdogTimeout();\n    }, timeoutMs);\n    this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n  }\n  clearAdRequestWatchdog() {\n    if (this.adRequestWatchdogId != null) {\n      clearTimeout(this.adRequestWatchdogId);\n      this.adRequestWatchdogId = void 0;\n    }\n    if (this.adRequestWatchdogToken != null) {\n      this.logAdState(\"ad_request_watchdog_cleared\", {\n        token: this.adRequestWatchdogToken\n      });\n      this.adRequestWatchdogToken = null;\n    }\n  }\n  // --- Failsafe ---\n  startAdFailsafeTimer(token) {\n    this.clearAdFailsafeTimer();\n    const failsafeMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n    this.adFailsafeToken = token;\n    this.adFailsafeTimerId = window.setTimeout(() => {\n      if (this.adFailsafeToken !== token) {\n        return;\n      }\n      this.adFailsafeTimerId = void 0;\n      this.adFailsafeToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n      this.logAdState(\"ad_failsafe_triggered\", {\n        token,\n        failsafeMs,\n        videoPaused: this.video.paused\n      });\n      this.callbacks.onFailsafeTimeout();\n    }, failsafeMs);\n    this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n  }\n  clearAdFailsafeTimer() {\n    if (this.adFailsafeTimerId != null) {\n      clearTimeout(this.adFailsafeTimerId);\n      this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n      this.adFailsafeTimerId = void 0;\n    }\n    this.adFailsafeToken = null;\n  }\n  logAdState(event, extra = {}, adPlayer, inAdBreak, showAds) {\n    if (!this.debug) {\n      return;\n    }\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\n      activeAdRequestToken: this.activeAdRequestToken,\n      ...extra\n    });\n  }\n  // --- Reset for ad break end ---\n  resetForBreakEnd() {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdRequestWatchdog();\n    this.clearAdFailsafeTimer();\n    this.activeAdRequestToken = null;\n    this.expectedAdBreakDurationMs = void 0;\n    this.currentAdBreakStartWallClockMs = void 0;\n    this.scteAdBreakEndWallClockMs = void 0;\n    this.adBreakPlayedDurationMs = 0;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.consecutiveFailures = 0;\n    this.globalConsecutiveNoFills = 0;\n    this.adBreakEpoch++;\n  }\n  destroy() {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdFailsafeTimer();\n    this.clearAdRequestWatchdog();\n  }\n};\n\n// src/player/PlaceholderLayer.ts\nvar PlaceholderLayer = class {\n  constructor(video, debug) {\n    this.video = video;\n    this.debug = debug;\n  }\n  ensureContainer() {\n    if (this.container) {\n      return;\n    }\n    const el = document.createElement(\"div\");\n    el.style.position = \"absolute\";\n    el.style.left = \"0\";\n    el.style.top = \"0\";\n    el.style.right = \"0\";\n    el.style.bottom = \"0\";\n    el.style.display = \"none\";\n    el.style.alignItems = \"center\";\n    el.style.justifyContent = \"center\";\n    el.style.pointerEvents = \"none\";\n    el.style.zIndex = \"5\";\n    el.style.backgroundColor = \"#000\";\n    el.style.transition = \"opacity 0.3s ease-in-out\";\n    el.style.opacity = \"0\";\n    if (!this.video.parentElement) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n      }\n      return;\n    }\n    this.video.parentElement.appendChild(el);\n    this.container = el;\n  }\n  show() {\n    this.ensureContainer();\n    if (!this.container) {\n      return;\n    }\n    if (!this.video.muted) {\n      this.video.muted = true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n      }\n    }\n    const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n    if (wasHidden) {\n      this.container.style.transition = \"none\";\n    } else {\n      this.container.style.transition = \"opacity 0.3s ease-in-out\";\n    }\n    this.container.style.backgroundColor = \"#000\";\n    this.container.style.display = \"flex\";\n    this.container.offsetHeight;\n    this.container.style.opacity = \"1\";\n    this.container.style.pointerEvents = \"auto\";\n    if (wasHidden) {\n      requestAnimationFrame(() => {\n        if (this.container) {\n          this.container.style.transition = \"opacity 0.3s ease-in-out\";\n        }\n      });\n    }\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n    }\n  }\n  hide() {\n    if (!this.container) {\n      return;\n    }\n    this.container.style.opacity = \"0\";\n    setTimeout(() => {\n      if (this.container) {\n        this.container.style.display = \"none\";\n        this.container.style.pointerEvents = \"none\";\n        this.container.style.backgroundColor = \"#000\";\n      }\n    }, 300);\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n    }\n  }\n  destroy() {\n    if (this.container) {\n      if (this.container.parentElement) {\n        this.container.parentElement.removeChild(this.container);\n      }\n      this.container = void 0;\n    }\n  }\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\nvar HlsEngine = class {\n  constructor(config, video, cueManager, timing, callbacks) {\n    this.isLiveStream = false;\n    this.nativeHlsMode = false;\n    this.videoSrcProtection = null;\n    this.bufferedSegmentsCount = 0;\n    this.shouldAutoplayAfterBuffering = false;\n    this.hasInitialBufferCompleted = false;\n    this.config = config;\n    this.video = video;\n    this.cueManager = cueManager;\n    this.timing = timing;\n    this.callbacks = callbacks;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  shouldUseNativeHls(getStreamType) {\n    const streamType = getStreamType();\n    if (streamType === \"other\") {\n      return true;\n    }\n    const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n    return !!(this.config.allowNativeHls && canNative);\n  }\n  async setupNativeHls() {\n    this.nativeHlsMode = true;\n    this.videoSrcProtection = this.config.src;\n    this.video.src = this.config.src;\n    this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n    if (this.debug) {\n      const adBehavior = this.isLiveStream ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n      console.log(\n        \"[StormcloudVideoPlayer] Using native HLS playback:\",\n        {\n          isLive: this.isLiveStream,\n          allowNativeHls: this.config.allowNativeHls,\n          adBehavior\n        }\n      );\n    }\n    if (this.config.autoplay) {\n      await this.video.play()?.catch(() => {\n      });\n    }\n  }\n  setupHls() {\n    this.hls = new import_hls2.default({\n      enableWorker: true,\n      backBufferLength: 30,\n      liveDurationInfinity: true,\n      lowLatencyMode: !!this.config.lowLatencyMode,\n      maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1,\n      ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1e3 * 1e3,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\n      startPosition: -1\n    });\n    this.hls.on(import_hls2.default.Events.MEDIA_ATTACHED, () => {\n      this.hls?.loadSource(this.config.src);\n    });\n    this.hls.on(import_hls2.default.Events.MANIFEST_PARSED, async (_, _data) => {\n      this.isLiveStream = this.config.isLiveStream ?? (this.hls?.levels?.some(\n        (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n      ) ?? false);\n      await this.callbacks.onManifestParsed(this.isLiveStream);\n      this.bufferedSegmentsCount = 0;\n      this.hasInitialBufferCompleted = false;\n      this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Waiting for\",\n          minSegments,\n          \"segments to buffer before playback\"\n        );\n      }\n      if (minSegments === 0 || !this.config.autoplay) {\n        this.hasInitialBufferCompleted = true;\n        if (this.config.autoplay) {\n          await this.video.play()?.catch(() => {\n          });\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\n      if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n        return;\n      }\n      const details = data?.details;\n      if (!details || !details.fragments || details.fragments.length === 0) {\n        return;\n      }\n      const fragmentsToScan = Math.min(5, details.fragments.length);\n      for (let i = 0; i < fragmentsToScan; i++) {\n        const frag = details.fragments[i];\n        const tagList = frag?.tagList;\n        if (!Array.isArray(tagList)) continue;\n        for (const entry of tagList) {\n          let tag = \"\";\n          let value = \"\";\n          if (Array.isArray(entry)) {\n            tag = String(entry[0] ?? \"\");\n            value = String(entry[1] ?? \"\");\n          } else if (typeof entry === \"string\") {\n            const idx = entry.indexOf(\":\");\n            if (idx >= 0) {\n              tag = entry.substring(0, idx);\n              value = entry.substring(idx + 1);\n            } else {\n              tag = entry;\n            }\n          }\n          if (!tag) continue;\n          if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n            const attrs = tag.includes(\"EXT-X-DATERANGE\") ? parseAttributeList(value) : {};\n            const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") || \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n            if (hasScteOut) {\n              const durationSeconds = parseCueOutDuration(value);\n              const marker = {\n                type: \"start\",\n                ...durationSeconds !== void 0 ? { durationSeconds } : {},\n                raw: { tag, value, earlyDetection: true }\n              };\n              if (this.debug) {\n                console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n              }\n              this.callbacks.onScte35Cue(marker, {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag)\n              });\n              return;\n            }\n          }\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_BUFFERED, async (_evt, _data) => {\n      if (this.hasInitialBufferCompleted) {\n        return;\n      }\n      this.bufferedSegmentsCount++;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n        );\n      }\n      if (this.bufferedSegmentsCount >= minSegments) {\n        this.hasInitialBufferCompleted = true;\n        if (this.shouldAutoplayAfterBuffering) {\n          if (this.debug) {\n            console.log(\n              `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n            );\n          }\n          await this.video.play()?.catch((err) => {\n            if (this.debug) {\n              console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n            }\n          });\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n      const id3Tags = (data?.samples || []).map((s) => ({\n        key: \"ID3\",\n        value: s?.data,\n        ptsSeconds: s?.pts\n      }));\n      id3Tags.forEach((tag) => this.onId3Tag(tag));\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_LOADED, (_evt, data) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_DECRYPTED, (_evt, data) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_CHANGED, (_evt, data) => {\n      const frag = data?.frag;\n      const tagList = frag?.tagList;\n      if (!Array.isArray(tagList)) {\n        this.callbacks.activatePendingCuesForFragment(frag);\n        return;\n      }\n      for (const entry of tagList) {\n        let tag = \"\";\n        let value = \"\";\n        if (Array.isArray(entry)) {\n          tag = String(entry[0] ?? \"\");\n          value = String(entry[1] ?? \"\");\n        } else if (typeof entry === \"string\") {\n          const idx = entry.indexOf(\":\");\n          if (idx >= 0) {\n            tag = entry.substring(0, idx);\n            value = entry.substring(idx + 1);\n          } else {\n            tag = entry;\n            value = \"\";\n          }\n        }\n        if (!tag) continue;\n        if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n          const prog = parseCueOutCont(value);\n          const marker = {\n            type: \"progress\",\n            ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n            ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n            raw: { tag, value }\n          };\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n          });\n        } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n          const durationSeconds = parseCueOutDuration(value);\n          const marker = {\n            type: \"start\",\n            ...durationSeconds !== void 0 ? { durationSeconds } : {},\n            raw: { tag, value }\n          };\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n          });\n        } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n          this.callbacks.onScte35Cue(\n            { type: \"end\", raw: { tag, value } },\n            {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n            }\n          );\n        } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n          const attrs = parseAttributeList(value);\n          const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n          const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n          const klass = String(attrs[\"CLASS\"] ?? \"\");\n          const duration = toNumber(attrs[\"DURATION\"]);\n          if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n            const marker = {\n              type: \"start\",\n              ...duration !== void 0 ? { durationSeconds: duration } : {},\n              raw: { tag, value, attrs }\n            };\n            this.callbacks.onScte35Cue(marker, {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n            });\n          }\n          if (hasScteIn) {\n            this.callbacks.onScte35Cue(\n              { type: \"end\", raw: { tag, value, attrs } },\n              {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n              }\n            );\n          }\n        }\n      }\n      this.callbacks.activatePendingCuesForFragment(frag);\n    });\n    this.hls.on(import_hls2.default.Events.ERROR, (_evt, data) => {\n      if (data?.fatal) {\n        switch (data.type) {\n          case import_hls2.default.ErrorTypes.NETWORK_ERROR:\n            this.hls?.startLoad();\n            break;\n          case import_hls2.default.ErrorTypes.MEDIA_ERROR:\n            this.hls?.recoverMediaError();\n            break;\n          default:\n            this.callbacks.onFatalDestroy();\n            break;\n        }\n      }\n    });\n    this.hls.attachMedia(this.video);\n  }\n  onId3Tag(tag) {\n    if (typeof tag.ptsSeconds === \"number\") {\n      this.timing.updatePtsDrift(tag.ptsSeconds);\n    }\n    const marker = parseScte35FromId3(tag);\n    if (marker) {\n      this.callbacks.onScte35Cue(marker, {\n        source: \"id3\",\n        readiness: \"playback\"\n      });\n    }\n  }\n  processFragmentScte35Payload(payloadData, fragmentSn, fragmentStartSeconds) {\n    const payload = normalizeFragmentPayload(payloadData);\n    if (!payload) {\n      return;\n    }\n    const markers = parseScte35FromTsPackets(\n      payload,\n      this.cueManager.tsScte35Pids,\n      this.cueManager.pmtPids,\n      this.cueManager.processedTsScte35Sections\n    );\n    markers.forEach((marker) => {\n      const context = {\n        source: \"ts\",\n        readiness: \"early\"\n      };\n      if (fragmentSn !== void 0) {\n        context.fragmentSn = fragmentSn;\n      }\n      if (fragmentStartSeconds !== void 0) {\n        context.fragmentStartSeconds = fragmentStartSeconds;\n      }\n      this.callbacks.onScte35Cue(marker, context);\n    });\n  }\n  getLiveSyncPosition() {\n    const pos = this.hls?.liveSyncPosition;\n    return typeof pos === \"number\" && Number.isFinite(pos) ? pos : void 0;\n  }\n  destroy() {\n    this.hls?.destroy();\n    this.hls = void 0;\n  }\n};\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n  return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\nfunction toggleMute(video, adPlayer, debug) {\n  if (adPlayer.isAdPlaying()) {\n    const newMutedState = !adPlayer.getOriginalMutedState();\n    const restoreVolume = adPlayer.getOriginalVolume() || 1;\n    adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n    adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n        newMutedState\n      );\n    }\n  } else {\n    video.muted = !video.muted;\n    adPlayer.updateOriginalMutedState(video.muted, video.volume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n    }\n  }\n}\nfunction toggleFullscreen(video, debug) {\n  return new Promise((resolve, reject) => {\n    if (!document.fullscreenElement) {\n      const container = video.parentElement;\n      if (!container) {\n        reject(new Error(\"No parent container found for fullscreen\"));\n        return;\n      }\n      container.requestFullscreen().then(() => {\n        if (debug) {\n          console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n        }\n        resolve();\n      }).catch((err) => {\n        if (debug) {\n          console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n        }\n        reject(err);\n      });\n    } else {\n      document.exitFullscreen().then(() => {\n        if (debug) {\n          console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n        }\n        resolve();\n      }).catch((err) => {\n        if (debug) {\n          console.error(\n            \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n            err\n          );\n        }\n        reject(err);\n      });\n    }\n  });\n}\nfunction isMuted(video, adPlayer) {\n  if (adPlayer.isAdPlaying()) {\n    return adPlayer.getOriginalMutedState();\n  }\n  return video.muted;\n}\nfunction setMuted(video, adPlayer, muted, debug) {\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying && muted === video.muted) {\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n        { muted }\n      );\n    }\n    return;\n  }\n  video.muted = muted;\n  if (adPlaying) {\n    adPlayer.updateOriginalMutedState(muted, video.volume);\n    adPlayer.setAdVolume(muted ? 0 : 1);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n        muted\n      });\n    }\n    return;\n  }\n  adPlayer.updateOriginalMutedState(muted, video.volume);\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n  }\n}\nfunction setVolume(video, adPlayer, volume, debug) {\n  const clampedVolume = Math.max(0, Math.min(1, volume));\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying) {\n    adPlayer.setAdVolume(clampedVolume);\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n        volume: clampedVolume\n      });\n    }\n  } else {\n    video.volume = clampedVolume;\n    video.muted = clampedVolume === 0;\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n    }\n  }\n}\nfunction getVolume(video, adPlayer) {\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying) {\n    return adPlayer.getAdVolume();\n  }\n  return video.volume;\n}\nfunction isFullscreen() {\n  return !!document.fullscreenElement;\n}\nfunction resizePlayer(video, adPlayer, debug) {\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] Resizing player\");\n  }\n  if (adPlayer && adPlayer.isAdPlaying()) {\n    const width = video.clientWidth || 640;\n    const height = video.clientHeight || 480;\n    if (debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n      );\n    }\n    adPlayer.resize(width, height);\n  }\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n  constructor(host, timing, adConfig, cueManager, placeholder) {\n    this.inAdBreak = false;\n    this.showAds = false;\n    this.isShowingPlaceholder = false;\n    this.adDetectSentForCurrentBreak = false;\n    this.continuousFetchingActive = false;\n    this.continuousFetchLoopRunning = false;\n    this.adRequestQueue = [];\n    this.adPodQueue = [];\n    this.maxPlaceholderDurationMs = 5e3;\n    this.pendingAdBreak = null;\n    this.host = host;\n    this.timing = timing;\n    this.adConfig = adConfig;\n    this.cueManager = cueManager;\n    this.placeholder = placeholder;\n  }\n  get debug() {\n    return !!this.host.config.debugAdTiming;\n  }\n  get analyticsContext() {\n    return buildAnalyticsContext(this.host.config);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  IMA event listeners\n  // ───────────────────────────────────────────────────────────────\n  /**\n   * Produces the next pod ad-request URL for the current break. Every request\n   * (initial and continuous-fetch top-up) carries pod macros (pmad/pmnd/pmxd,\n   * no ppos); pmxd tracks the remaining break time so top-up pods only ask for\n   * what still fits.\n   */\n  nextAdRequestUrl(baseVastUrl) {\n    const remaining = Math.min(\n      this.timing.getWallClockRemainingAdMs(),\n      this.timing.getDurationBudgetRemainingMs()\n    );\n    const breakDurationMs = remaining > 0 ? remaining : void 0;\n    return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n  }\n  attachImaEventListeners() {\n    const adPlayer = this.host.getAdPlayer();\n    adPlayer.on(\"pod_ad_started\", (payload) => {\n      this.timing.notePodAdStarted();\n      if (this.debug) {\n        console.log(\n          `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n        );\n      }\n    });\n    adPlayer.on(\"all_ads_completed\", () => {\n      sendAdImpressionTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n      const remaining = this.timing.getRemainingAdMs();\n      this.timing.consecutiveFailures = 0;\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n          this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n        );\n      }\n      if (this.inAdBreak) {\n        if (this.timing.hasTimeToStartAnotherAd()) {\n          this.tryNextAvailableAdWithRateLimit();\n        } else {\n          this.handleAdPodComplete();\n        }\n      }\n    });\n    adPlayer.on(\"ad_error\", (errorPayload) => {\n      let errorMessage = \"Ad playback failed\";\n      if (errorPayload) {\n        const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n        const vastErrorCode = errorPayload.vastErrorCode;\n        const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n        const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n        errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n        if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n          errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n        }\n        if (cause) {\n          const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n          errorMessage += `. Caused by: ${causeMessage}`;\n        }\n      }\n      console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n      this.handleAdFailure();\n    });\n    adPlayer.on(\"content_pause\", () => {\n      this.timing.clearAdFailsafeTimer();\n      this.timing.clearAdRequestWatchdog();\n      this.timing.activeAdRequestToken = null;\n      this.showAds = true;\n      this.timing.resetGamNoFillCounter();\n      if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n        this.timing.scheduleAdStopAtBreakBoundary();\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n        }\n      }\n      this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n      if (this.isShowingPlaceholder) {\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n        }\n        this.host.getAdPlayer().hidePlaceholder();\n        this.isShowingPlaceholder = false;\n      }\n    });\n    adPlayer.on(\"content_resume\", () => {\n      sendAdImpressionTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      if (!this.host.video.muted) {\n        this.host.video.muted = true;\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n        }\n      }\n      this.timing.clearAdFailsafeTimer();\n      this.timing.clearAdRequestWatchdog();\n      this.timing.activeAdRequestToken = null;\n      this.showAds = false;\n      if (!this.inAdBreak) {\n        return;\n      }\n      this.timing.consecutiveFailures = 0;\n      this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n      const remaining = this.timing.getRemainingAdMs();\n      if (this.debug) {\n        console.log(\n          `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n          this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n        );\n      }\n      if (this.timing.hasTimeToStartAnotherAd()) {\n        this.tryNextAvailableAdWithRateLimit();\n      } else {\n        this.handleAdPodComplete();\n      }\n    });\n  }\n  recreateAdController() {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n    }\n    const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n    const adPlayer = this.host.getAdPlayer();\n    if (shouldShowPlaceholder && adPlayer) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n      }\n      this.placeholder.show();\n      adPlayer.showPlaceholder();\n      this.isShowingPlaceholder = true;\n    }\n    const preservedMutedState = adPlayer.getOriginalMutedState();\n    const preservedVolumeState = adPlayer.getOriginalVolume();\n    if (adPlayer) {\n      try {\n        adPlayer.destroy();\n        this.host.video.muted = true;\n      } catch (error) {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n        }\n      }\n    }\n    const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n    const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n    this.host.setAdPlayer(newAdPlayer);\n    newAdPlayer.initialize();\n    newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n    this.attachImaEventListeners();\n    if (shouldShowPlaceholder) {\n      this.placeholder.show();\n      newAdPlayer.showPlaceholder();\n      this.isShowingPlaceholder = true;\n    }\n  }\n  clearPendingAdBreak() {\n    if (this.prefetchTimerId != null) {\n      clearTimeout(this.prefetchTimerId);\n      this.prefetchTimerId = void 0;\n    }\n    this.pendingAdBreak = null;\n    this.cueManager.pendingScte35CueKey = void 0;\n    this.adConfig.podAssignedByPrefetch = false;\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad break start\n  // ───────────────────────────────────────────────────────────────\n  async handleAdStart(_marker) {\n    const scheduled = this.adConfig.findCurrentOrNextBreak(\n      this.host.video.currentTime * 1e3\n    );\n    if (scheduled) {\n      this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n    }\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n    let baseVastUrl;\n    if (tags && tags.length > 0 && tags[0]) {\n      baseVastUrl = tags[0];\n    } else if (this.adConfig.apiVastTagUrl) {\n      baseVastUrl = this.adConfig.apiVastTagUrl;\n    } else {\n      this.clearPendingAdBreak();\n      return;\n    }\n    const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n    if (this.debug) {\n      const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n      console.log(\n        `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n      );\n    }\n    this.timing.failedVastUrls.clear();\n    this.timing.temporaryFailureUrls.clear();\n    this.timing.consecutiveFailures = 0;\n    this.continuousFetchingActive = true;\n    this.isShowingPlaceholder = false;\n    this.timing.totalAdRequestsInBreak = 0;\n    if (this.adConfig.podAssignedByPrefetch) {\n      this.adConfig.podAssignedByPrefetch = false;\n    } else {\n      this.adConfig.beginNewAdPod();\n    }\n    const currentMuted = this.host.video.muted;\n    const currentVolume = this.host.video.volume;\n    this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n    this.inAdBreak = true;\n    this.timing.adBreakPlayedDurationMs = 0;\n    this.timing.currentAdIndex = 0;\n    this.timing.totalAdsInBreak = 0;\n    this.adPodQueue = [];\n    this.showAds = false;\n    if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n      this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n    }\n    const podPlayed = await this.startOptimizedPod(\n      baseVastUrl,\n      adBreakDurationMs,\n      currentMuted,\n      currentVolume\n    );\n    if (!podPlayed) {\n      if (this.debug) {\n        console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n      }\n      this.continuousFetchingActive = true;\n      this.startContinuousFetching(baseVastUrl);\n      await this.tryNextAvailableAdWithRateLimit();\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Optimized pod (single multi-ad request)\n  // ───────────────────────────────────────────────────────────────\n  async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n    let podUrl;\n    if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n      podUrl = this.pendingAdBreak.vastUrls[0];\n      this.clearPendingAdBreak();\n    } else {\n      podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n    }\n    if (!podUrl) {\n      return false;\n    }\n    this.continuousFetchingActive = false;\n    this.recreateAdController();\n    const adPlayer = this.host.getAdPlayer();\n    const requestToken = ++this.timing.adRequestTokenCounter;\n    this.timing.activeAdRequestToken = requestToken;\n    this.timing.startAdRequestWatchdog(requestToken);\n    try {\n      await this.timing.enforceGlobalRateLimit();\n      this.timing.lastAdRequestTime = Date.now();\n      await adPlayer.requestAds(podUrl);\n      this.timing.clearAdRequestWatchdog();\n      if (this.timing.activeAdRequestToken !== requestToken) {\n        return true;\n      }\n      const podCount = adPlayer.getPodAdCount?.() ?? 1;\n      if (podCount < 1) {\n        return false;\n      }\n      if (this.debug) {\n        console.log(\n          podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n        );\n      }\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      this.timing.startAdFailsafeTimer(requestToken);\n      await adPlayer.play();\n      this.timing.markAdStarted();\n      if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n        this.timing.scheduleAdStopAtBreakBoundary();\n      }\n      adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n      this.timing.consecutiveFailures = 0;\n      this.continuousFetchingActive = true;\n      this.startContinuousFetching(baseVastUrl);\n      return true;\n    } catch (error) {\n      this.timing.clearAdRequestWatchdog();\n      this.timing.clearAdFailsafeTimer();\n      if (this.timing.activeAdRequestToken === requestToken) {\n        this.timing.activeAdRequestToken = null;\n      }\n      if (this.debug) {\n        console.warn(\"[POD] Optimized pod request/play failed:\", error);\n      }\n      if (this.timing.isTemporaryAdError(error)) {\n        this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n      }\n      this.continuousFetchingActive = true;\n      this.recreateAdController();\n      return false;\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Continuous fetching\n  // ───────────────────────────────────────────────────────────────\n  startContinuousFetching(baseVastUrl) {\n    if (!this.continuousFetchingActive) {\n      return;\n    }\n    if (this.continuousFetchLoopRunning) {\n      if (this.debug) {\n        console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n      }\n      return;\n    }\n    if (this.debug) {\n      console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n    }\n    this.continuousFetchLoopRunning = true;\n    this.continuousFetchLoop(baseVastUrl);\n  }\n  async continuousFetchLoop(baseVastUrl) {\n    const epoch = this.timing.adBreakEpoch;\n    while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n      const remaining = Math.min(\n        this.timing.getWallClockRemainingAdMs(),\n        this.timing.getDurationBudgetRemainingMs()\n      );\n      if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n        }\n        break;\n      }\n      if (this.timing.isGamInCooldown()) {\n        if (this.debug) {\n          console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n        }\n        break;\n      }\n      if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n        }\n        break;\n      }\n      if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n        }\n        break;\n      }\n      const maxQueueSize = 5;\n      if (this.adRequestQueue.length >= maxQueueSize) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n        }\n        await new Promise((resolve) => setTimeout(resolve, 1e3));\n        continue;\n      }\n      const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n      if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n        await new Promise((resolve) => setTimeout(resolve, 500));\n        continue;\n      }\n      if (this.debug) {\n        const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n        console.log(\n          `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n          { queuedUrls: queuedUrlsPreview }\n        );\n      }\n      this.adRequestQueue.push(newAdUrl);\n      const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n      await new Promise((resolve) => setTimeout(resolve, generationDelay));\n    }\n    this.continuousFetchLoopRunning = false;\n    if (this.debug) {\n      console.log(\n        `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n        this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n      );\n    }\n  }\n  stopContinuousFetching() {\n    this.continuousFetchingActive = false;\n    this.continuousFetchLoopRunning = false;\n    this.placeholder.hide();\n    if (this.debug) {\n      console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad iteration\n  // ───────────────────────────────────────────────────────────────\n  async tryNextAvailableAdWithRateLimit() {\n    if (!this.inAdBreak) {\n      return;\n    }\n    const epoch = this.timing.adBreakEpoch;\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n    const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n    const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n    const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n    if (timeSinceLastRequest < effectiveMinInterval) {\n      const waitTime = effectiveMinInterval - timeSinceLastRequest;\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, waitTime));\n    }\n    if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n      return;\n    }\n    return this.tryNextAvailableAd(0);\n  }\n  async tryNextAvailableAd(retryCount = 0) {\n    if (!this.inAdBreak) {\n      return;\n    }\n    const remaining = this.timing.getRemainingAdMs();\n    if (!this.timing.hasTimeToStartAnotherAd()) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) {\n        console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    this.timing.cleanupTemporaryFailures();\n    while (this.adRequestQueue.length > 0) {\n      const nextAdUrl = this.adRequestQueue.shift();\n      if (!nextAdUrl) continue;\n      if (this.timing.failedVastUrls.has(nextAdUrl)) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n        continue;\n      }\n      if (this.timing.isUrlInCooldown(nextAdUrl)) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n        continue;\n      }\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n      }\n      try {\n        await this.playSingleAd(nextAdUrl);\n        this.timing.consecutiveFailures = 0;\n      } catch (error) {\n        const errorMessage = error.message;\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n        if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n          await this.tryNextAvailableAdWithRateLimit();\n          return;\n        }\n        if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n          this.timing.consecutiveFailures++;\n        }\n        await this.tryNextAvailableAdWithRateLimit();\n      }\n      return;\n    }\n    const maxRetries = 3;\n    if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, 500));\n      await this.tryNextAvailableAd(retryCount + 1);\n      return;\n    }\n    if (!this.isShowingPlaceholder && remaining > 1e3) {\n      this.showPlaceholderAndWaitForAds();\n    } else {\n      if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n      this.handleAdPodComplete();\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Single ad playback\n  // ───────────────────────────────────────────────────────────────\n  async playSingleAd(vastTagUrl) {\n    const adPlayer = this.host.getAdPlayer();\n    if (adPlayer.isAdPlaying()) return;\n    if (this.timing.failedVastUrls.has(vastTagUrl)) {\n      if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n      throw new Error(\"VAST URL permanently failed\");\n    }\n    if (this.timing.isUrlInCooldown(vastTagUrl)) {\n      if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n      throw new Error(\"VAST URL in cooldown after no-fill\");\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n      throw new Error(\"Too many consecutive failures\");\n    }\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n      throw new Error(\"GAM in cooldown\");\n    }\n    this.recreateAdController();\n    const requestToken = ++this.timing.adRequestTokenCounter;\n    this.timing.activeAdRequestToken = requestToken;\n    this.timing.startAdRequestWatchdog(requestToken);\n    try {\n      await this.timing.enforceGlobalRateLimit();\n      this.timing.lastAdRequestTime = Date.now();\n      const ap = this.host.getAdPlayer();\n      await ap.requestAds(vastTagUrl);\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      this.timing.clearAdRequestWatchdog();\n      if (this.timing.activeAdRequestToken !== requestToken) return;\n      if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n        this.timing.rejectLoadedAdForDuration(ap);\n        this.recreateAdController();\n        throw new Error(\"ad_duration_exceeds_budget\");\n      }\n      try {\n        this.timing.startAdFailsafeTimer(requestToken);\n        await ap.play();\n        this.timing.markAdStarted();\n        if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n          this.timing.scheduleAdStopAtBreakBoundary();\n        }\n        ap.setAdVolume(getAdAudioVolume(ap));\n        this.timing.consecutiveFailures = 0;\n        this.timing.temporaryFailureUrls.delete(vastTagUrl);\n      } catch (playError) {\n        if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n        if (this.timing.isTemporaryAdError(playError)) {\n          this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n          if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n        } else {\n          this.timing.failedVastUrls.add(vastTagUrl);\n          if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n        }\n        this.timing.clearAdFailsafeTimer();\n        if (this.timing.activeAdRequestToken === requestToken) {\n          this.timing.activeAdRequestToken = null;\n        }\n        throw playError;\n      }\n    } catch (error) {\n      const errorMessage = error?.message || \"\";\n      if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n      if (this.timing.isTemporaryAdError(error)) {\n        this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n        if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n      } else {\n        this.timing.failedVastUrls.add(vastTagUrl);\n        if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n      }\n      this.timing.clearAdRequestWatchdog();\n      this.timing.clearAdFailsafeTimer();\n      if (this.timing.activeAdRequestToken === requestToken) {\n        this.timing.activeAdRequestToken = null;\n      }\n      throw error;\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Placeholder wait\n  // ───────────────────────────────────────────────────────────────\n  async showPlaceholderAndWaitForAds() {\n    const remaining = this.timing.getRemainingAdMs();\n    const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n      this.handleAdPodComplete();\n      return;\n    }\n    if (waitTime < 1e3) {\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.debug) {\n      console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n    }\n    this.isShowingPlaceholder = true;\n    this.host.getAdPlayer().showPlaceholder();\n    const checkInterval = 300;\n    const maxChecks = Math.floor(waitTime / checkInterval);\n    for (let i = 0; i < maxChecks; i++) {\n      await new Promise((resolve) => setTimeout(resolve, checkInterval));\n      if (!this.inAdBreak) return;\n      if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n        break;\n      }\n      if (!this.timing.hasTimeToStartAnotherAd()) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n        break;\n      }\n      while (this.adRequestQueue.length > 0) {\n        if (!this.timing.hasTimeToStartAnotherAd()) break;\n        const nextAdUrl = this.adRequestQueue.shift();\n        if (!nextAdUrl) continue;\n        if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n        if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n        this.isShowingPlaceholder = false;\n        this.host.getAdPlayer().hidePlaceholder();\n        try {\n          await this.playSingleAd(nextAdUrl);\n          this.timing.consecutiveFailures = 0;\n        } catch (error) {\n          const errorMessage = error.message;\n          if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n            await this.tryNextAvailableAdWithRateLimit();\n            return;\n          }\n          if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n            this.timing.consecutiveFailures++;\n          }\n          await this.tryNextAvailableAdWithRateLimit();\n        }\n        return;\n      }\n    }\n    if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n    this.isShowingPlaceholder = false;\n    this.host.getAdPlayer().hidePlaceholder();\n    this.handleAdPodComplete();\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad break completion\n  // ───────────────────────────────────────────────────────────────\n  handleAdPodComplete() {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n    }\n    this.timing.resetForBreakEnd();\n    this.stopContinuousFetching();\n    this.clearPendingAdBreak();\n    if (this.isShowingPlaceholder) {\n      this.host.getAdPlayer().hidePlaceholder();\n      this.isShowingPlaceholder = false;\n    }\n    this.adRequestQueue = [];\n    this.inAdBreak = false;\n    this.adDetectSentForCurrentBreak = false;\n    this.cueManager.activeScte35BreakKey = void 0;\n    this.cueManager.scheduledScte35BreakKey = void 0;\n    this.adPodQueue = [];\n    this.showAds = false;\n    this.host.getAdPlayer().stop().catch(() => {\n    });\n    const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n    const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n    if (this.host.video.muted !== restoredMuted) {\n      this.host.video.muted = restoredMuted;\n    }\n    if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n      this.host.video.volume = restoredVolume;\n    }\n    if (this.host.shouldContinueLiveStreamDuringAds()) {\n      const liveSyncPos = this.host.getLiveSyncPosition();\n      if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n        if (this.debug) {\n          console.log(\n            `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n          );\n        }\n        this.host.video.currentTime = liveSyncPos;\n      }\n      if (this.host.video.paused) {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video paused in live mode after ads, resuming playback\");\n        this.host.video.play()?.catch(() => {\n        });\n      } else {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video already playing in live mode after ads\");\n      }\n    } else if (this.host.video.paused) {\n      this.host.video.play()?.catch(() => {\n      });\n    }\n  }\n  handleAdFailure() {\n    this.timing.consecutiveFailures++;\n    this.timing.recordGamNoFill();\n    const remaining = this.timing.getRemainingAdMs();\n    if (this.debug) {\n      console.log(\n        `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n        this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n      );\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.hasTimeToStartAnotherAd()) {\n      this.tryNextAvailableAdWithRateLimit();\n    } else {\n      if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n      this.handleAdPodComplete();\n    }\n  }\n};\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n  constructor(config) {\n    this.attached = false;\n    this.palPlaybackStarted = false;\n    initializePolyfills();\n    const browserOverrides = getBrowserConfigOverrides();\n    this.config = { ...browserOverrides, ...config };\n    this.video = config.videoElement;\n    logBrowserInfo(config.debugAdTiming);\n    this.adPlayer = this.createAdPlayer(false);\n    this.palNonce = createPalNonceManager();\n    this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n      onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n        this.startAdPrefetch(marker, fragmentSn, cueKey);\n      },\n      onPlaybackCue: (marker, cueKey) => {\n        this.onScte35Marker(marker, cueKey);\n      },\n      isInAdBreak: () => this.adBreak.inAdBreak\n    });\n    this.adConfig = new AdConfigManager(this.config, this.video);\n    this.timing = new AdTimingService(this.config, this.video, {\n      onAdStopTimerFired: () => this.onAdStopTimerFired(),\n      onAdStartTimerFired: (marker, cueKey) => {\n        this.startScte35AdBreak(\n          marker,\n          cueKey,\n          marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.timing.expectedAdBreakDurationMs\n        );\n      },\n      onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n      onFailsafeTimeout: () => this.adBreak.handleAdFailure()\n    });\n    this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n    this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n      onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n      onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n      activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n      onFatalDestroy: () => this.destroy(),\n      isInAdBreak: () => this.adBreak.inAdBreak,\n      hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null\n    });\n    this.adBreak = new AdBreakOrchestrator(\n      {\n        config: this.config,\n        video: this.video,\n        getAdPlayer: () => this.adPlayer,\n        setAdPlayer: (p) => {\n          this.adPlayer = p;\n        },\n        createAdPlayer: (c) => this.createAdPlayer(c),\n        shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n        getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n        generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs)\n      },\n      this.timing,\n      this.adConfig,\n      this.cueManager,\n      this.placeholder\n    );\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  createAdPlayer(continueLiveStreamDuringAds) {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n    }\n    return createHlsAdPlayer(this.video, {\n      continueLiveStreamDuringAds,\n      ...this.config.licenseKey ? { licenseKey: this.config.licenseKey } : {},\n      ...this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}\n    });\n  }\n  generatePodVastUrl(baseUrl, breakDurationMs) {\n    const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n    return this.adConfig.generatePodVastUrl(\n      baseUrl,\n      podParams,\n      this.adPlayer,\n      this.palNonce,\n      this.adBreak.inAdBreak\n    );\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Lifecycle\n  // ───────────────────────────────────────────────────────────────\n  async load() {\n    if (!this.attached) {\n      this.attach();\n    }\n    try {\n      await this.adConfig.fetchAdConfiguration();\n    } catch (error) {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n          error\n        );\n      }\n    }\n    this.palNonce.generateNonce({\n      videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n      videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n      adWillAutoPlay: !!this.config.autoplay,\n      adWillPlayMuted: true,\n      playerVolume: 0,\n      continuousPlayback: this.config.lowLatencyMode ?? false\n    }).catch(() => {\n    });\n    fetchConsentSignals().then((signals) => {\n      this.adConfig.consentSignals = signals;\n    }).catch(() => {\n    });\n    this.adConfig.initializeTracking();\n    if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n      await this.hlsEngine.setupNativeHls();\n      const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n          isLive: this.hlsEngine.isLiveStream,\n          continueLiveStreamDuringAds\n        });\n      }\n      this.adPlayer.destroy();\n      this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n      this.adPlayer.initialize();\n      return;\n    }\n    this.hlsEngine.setupHls();\n  }\n  async onManifestParsed(isLive) {\n    if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {\n      const prerollKey = \"synthetic-vod-preroll\";\n      if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n        this.adConfig.vmapBreaks = [\n          { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl }\n        ];\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n          );\n        }\n      }\n    }\n    if (this.debug) {\n      const adBehavior = this.shouldContinueLiveStreamDuringAds() ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n      console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n        isLive,\n        allowNativeHls: this.config.allowNativeHls,\n        adBehavior\n      });\n    }\n    this.adPlayer.destroy();\n    this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n    this.adPlayer.initialize();\n  }\n  attach() {\n    if (this.attached) return;\n    this.attached = true;\n    this.video.autoplay = !!this.config.autoplay;\n    this.video.muted = !!this.config.muted;\n    this.adPlayer.initialize();\n    this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n    this.adBreak.attachImaEventListeners();\n    this.video.addEventListener(\"play\", () => {\n      if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n        this.palPlaybackStarted = true;\n        this.palNonce.sendPlaybackStart();\n      }\n    });\n    this.endedHandler = () => {\n      if (this.palPlaybackStarted) {\n        this.palPlaybackStarted = false;\n        this.palNonce.sendPlaybackEnd();\n      }\n      this.onVideoEnded();\n    };\n    this.video.addEventListener(\"ended\", this.endedHandler);\n    this.video.addEventListener(\"mousedown\", (e) => {\n      this.palNonce.sendAdTouch(e);\n    });\n    this.video.addEventListener(\"touchstart\", (e) => {\n      this.palNonce.sendAdTouch(e);\n    });\n    this.timeUpdateHandler = () => {\n      this.onTimeUpdate(this.video.currentTime);\n    };\n    this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n    this.emptiedHandler = () => {\n      if (this.hlsEngine.nativeHlsMode && this.hlsEngine.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n            this.hlsEngine.videoSrcProtection\n          );\n        }\n        const currentTime = this.video.currentTime;\n        const wasPaused = this.video.paused;\n        this.video.src = this.hlsEngine.videoSrcProtection;\n        this.video.currentTime = currentTime;\n        if (!wasPaused) {\n          this.video.play().catch(() => {\n          });\n        }\n      }\n    };\n    this.video.addEventListener(\"emptied\", this.emptiedHandler);\n  }\n  shouldContinueLiveStreamDuringAds() {\n    if (this.hlsEngine.isLiveStream) {\n      return true;\n    }\n    const duration = this.video.duration;\n    if (!Number.isFinite(duration) || duration === Infinity) {\n      return true;\n    }\n    return false;\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  SCTE-35 marker orchestration\n  // ───────────────────────────────────────────────────────────────\n  onScte35Marker(marker, cueKey) {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n        type: marker.type,\n        ptsSeconds: marker.ptsSeconds,\n        durationSeconds: marker.durationSeconds,\n        currentTime: this.video.currentTime,\n        raw: marker.raw,\n        hasPendingAdBreak: !!this.adBreak.pendingAdBreak\n      });\n    }\n    if (marker.type === \"start\") {\n      if (this.adBreak.inAdBreak) {\n        if (marker.durationSeconds != null) {\n          const newDurationMs = marker.durationSeconds * 1e3;\n          if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n            this.timing.setAdBreakDurationBoundary(newDurationMs);\n            this.timing.scheduleAdStopAtBreakBoundary();\n            if (this.debug) {\n              console.log(\n                `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n              );\n            }\n          }\n        }\n        return;\n      }\n      if (!this.adBreak.adDetectSentForCurrentBreak) {\n        this.adBreak.adDetectSentForCurrentBreak = true;\n        const detectPayload = {};\n        if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n        if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n        sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n        });\n      }\n      const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n      const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.adBreak.pendingAdBreak?.marker.durationSeconds != null ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1e3 : void 0;\n      const isManifest = isManifestBasedMarker(marker);\n      const forceImmediate = this.config.immediateManifestAds ?? true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n          isManifestMarker: isManifest,\n          forceImmediate,\n          hasPts: typeof marker.ptsSeconds === \"number\",\n          hasPrefetchedAds\n        });\n      }\n      if (isManifest && forceImmediate) {\n        if (this.debug) {\n          console.log(\n            `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n          );\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      } else if (typeof marker.ptsSeconds === \"number\") {\n        const tol = this.config.driftToleranceMs ?? 1e3;\n        const nowMs = this.video.currentTime * 1e3;\n        const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n        const deltaMs = Math.floor(marker.ptsSeconds * 1e3 - estCurrentPtsMs);\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n            nowMs,\n            estCurrentPtsMs,\n            markerPtsMs: marker.ptsSeconds * 1e3,\n            deltaMs,\n            tolerance: tol\n          });\n        }\n        if (deltaMs > tol) {\n          if (this.debug) {\n            console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n          }\n          this.timing.expectedAdBreakDurationMs = durationMs;\n          this.cueManager.scheduledScte35BreakKey = cueKey;\n          this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n        } else {\n          if (this.debug) {\n            console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n          }\n          this.timing.clearAdStartTimer();\n          this.startScte35AdBreak(marker, cueKey, durationMs);\n        }\n      } else {\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      }\n      return;\n    }\n    if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n      if (marker.durationSeconds != null) {\n        this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1e3);\n      }\n      this.timing.scheduleAdStopAtBreakBoundary();\n      if (!this.adPlayer.isAdPlaying() && this.timing.activeAdRequestToken === null && this.adBreak.adRequestQueue.length > 0 && this.timing.hasTimeToStartAnotherAd()) {\n        this.adBreak.tryNextAvailableAdWithRateLimit();\n      }\n      return;\n    }\n    if (marker.type === \"end\") {\n      if (!this.video.muted) {\n        this.video.muted = true;\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n        }\n      }\n      const remaining = this.timing.getRemainingAdMs();\n      const adPlaying = this.adPlayer.isAdPlaying();\n      const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n          remaining,\n          adPlaying,\n          hasQueuedAds,\n          activeAdRequest: this.timing.activeAdRequestToken !== null\n        });\n      }\n      this.timing.scteAdBreakEndWallClockMs = Date.now();\n      this.timing.clearAdStartTimer();\n      this.timing.clearAdStopTimer();\n      if (adPlaying) {\n        this.adPlayer.stop().catch(() => {\n        });\n      }\n      this.adBreak.handleAdPodComplete();\n      return;\n    }\n  }\n  startScte35AdBreak(marker, cueKey, durationMs) {\n    this.adBreak.inAdBreak = true;\n    this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n    this.cueManager.scheduledScte35BreakKey = void 0;\n    this.timing.currentAdBreakStartWallClockMs = this.timing.resolveScteBreakStartWallClockMs(marker);\n    this.timing.setAdBreakDurationBoundary(durationMs);\n    this.adBreak.handleAdStart(marker);\n    this.timing.scheduleAdStopAtBreakBoundary();\n  }\n  onAdStopTimerFired() {\n    if (!this.adBreak.inAdBreak) return;\n    const adPlaying = this.adPlayer.isAdPlaying();\n    const checkIntervalMs = Math.max(\n      250,\n      Math.floor(this.config.adBreakCheckIntervalMs ?? 1e3)\n    );\n    const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n    const maxExtensionMs = typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0 ? maxExtensionMsConfig : 0;\n    const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n    const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n    const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n    if (shouldExtendAdBreak) {\n      this.timing.scheduleAdStopCountdown(checkIntervalMs);\n      return;\n    }\n    if (this.debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n      );\n    }\n    if (adPlaying) {\n      this.adPlayer.stop().catch(() => {\n      });\n    }\n    this.adBreak.handleAdPodComplete();\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad prefetch\n  // ───────────────────────────────────────────────────────────────\n  startAdPrefetch(marker, fragmentSn, cueKey) {\n    if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n    const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1e3);\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n    let baseVastUrl;\n    if (tags && tags.length > 0 && tags[0]) {\n      baseVastUrl = tags[0];\n    } else if (this.adConfig.apiVastTagUrl) {\n      baseVastUrl = this.adConfig.apiVastTagUrl;\n    } else {\n      if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n      return;\n    }\n    this.adConfig.beginNewAdPod();\n    this.adConfig.podAssignedByPrefetch = true;\n    const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n    const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n    this.adBreak.pendingAdBreak = {\n      marker,\n      ...fragmentSn !== void 0 ? { detectedAtFragmentSn: fragmentSn } : {},\n      vastUrls: generatedUrls,\n      isFetching: false,\n      fetchStartTime: Date.now()\n    };\n    this.cueManager.pendingScte35CueKey = cueKey;\n    this.adBreak.adDetectSentForCurrentBreak = true;\n    const detectPayload = {};\n    if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n    if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n    if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;\n    sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n    });\n    if (this.debug) {\n      console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n      console.log(`[PREFETCH] Pre-generated pod request URL`);\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  VMAP time-based ad breaks\n  // ───────────────────────────────────────────────────────────────\n  onTimeUpdate(currentTimeSec) {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const nowMs = currentTimeSec * 1e3;\n    const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n    if (breakToPlay) {\n      void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  onVideoEnded() {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n    const postroll = this.adConfig.vmapBreaks.find(\n      (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n    );\n    if (postroll) {\n      void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  async handleVmapAdBreak(adBreak, nowMs) {\n    const key = this.adConfig.getAdBreakKey(adBreak);\n    if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n    const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n    if (breakStartMs == null) return;\n    const durationMs = adBreak.durationMs ?? 0;\n    const endMs = breakStartMs + durationMs;\n    const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n    if (inWindow) {\n      this.adConfig.consumedVmapBreakIds.add(key);\n      const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n      if (!tags || tags.length === 0) return;\n      const first = tags[0];\n      const rest = tags.slice(1);\n      this.adBreak.adPodQueue = rest;\n      this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n      this.adBreak.showAds = true;\n      this.adBreak.inAdBreak = true;\n      this.timing.currentAdBreakStartWallClockMs = Date.now();\n      try {\n        await this.adBreak.playSingleAd(first);\n      } catch (error) {\n        this.adBreak.adPodQueue = [];\n        this.adBreak.inAdBreak = false;\n        this.adBreak.showAds = false;\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n        }\n      }\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Public API\n  // ───────────────────────────────────────────────────────────────\n  getCurrentAdIndex() {\n    return this.timing.currentAdIndex;\n  }\n  getTotalAdsInBreak() {\n    return this.timing.totalAdsInBreak;\n  }\n  getAdRemainingMs() {\n    return this.timing.getRemainingAdMs();\n  }\n  isAdPlaying() {\n    return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n  }\n  isShowingAds() {\n    return this.adBreak.showAds;\n  }\n  getStreamType() {\n    const url = this.config.src.toLowerCase();\n    if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n      return \"hls\";\n    }\n    return \"other\";\n  }\n  shouldShowNativeControls() {\n    const streamType = this.getStreamType();\n    if (streamType === \"other\") {\n      return !(this.config.showCustomControls ?? false);\n    }\n    return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n  }\n  isLive() {\n    return this.hlsEngine.isLiveStream;\n  }\n  get videoElement() {\n    return this.video;\n  }\n  toggleMute() {\n    toggleMute(this.video, this.adPlayer, this.debug);\n  }\n  toggleFullscreen() {\n    return toggleFullscreen(this.video, this.debug);\n  }\n  isMuted() {\n    return isMuted(this.video, this.adPlayer);\n  }\n  setMuted(muted) {\n    setMuted(this.video, this.adPlayer, muted, this.debug);\n  }\n  setVolume(volume) {\n    setVolume(this.video, this.adPlayer, volume, this.debug);\n  }\n  getVolume() {\n    return getVolume(this.video, this.adPlayer);\n  }\n  isFullscreen() {\n    return isFullscreen();\n  }\n  resize() {\n    resizePlayer(this.video, this.adPlayer, this.debug);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Destroy\n  // ───────────────────────────────────────────────────────────────\n  destroy() {\n    this.adBreak.stopContinuousFetching();\n    this.timing.destroy();\n    this.adBreak.clearPendingAdBreak();\n    this.placeholder.destroy();\n    if (this.timeUpdateHandler) {\n      this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n      delete this.timeUpdateHandler;\n    }\n    if (this.endedHandler) {\n      this.video.removeEventListener(\"ended\", this.endedHandler);\n      delete this.endedHandler;\n    }\n    if (this.emptiedHandler) {\n      this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n      delete this.emptiedHandler;\n    }\n    this.adConfig.destroyTracking();\n    this.hlsEngine.destroy();\n    this.adPlayer?.destroy();\n    if (this.palPlaybackStarted) {\n      this.palPlaybackStarted = false;\n      this.palNonce.sendPlaybackEnd();\n    }\n    this.palNonce.reset();\n    this.adBreak.adRequestQueue = [];\n    this.timing.consecutiveFailures = 0;\n  }\n};\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer = class extends import_react2.Component {\n  constructor() {\n    super(...arguments);\n    this.player = null;\n    this.mounted = false;\n    this.load = async () => {\n      if (!this.props.videoElement || !this.props.src) return;\n      try {\n        if (this.player) {\n          this.player.destroy();\n          this.player = null;\n        }\n        const config = {\n          src: this.props.src,\n          videoElement: this.props.videoElement\n        };\n        if (this.props.autoplay !== void 0)\n          config.autoplay = this.props.autoplay;\n        if (this.props.muted !== void 0) config.muted = this.props.muted;\n        if (this.props.lowLatencyMode !== void 0)\n          config.lowLatencyMode = this.props.lowLatencyMode;\n        if (this.props.allowNativeHls !== void 0)\n          config.allowNativeHls = this.props.allowNativeHls;\n        if (this.props.isLiveStream !== void 0)\n          config.isLiveStream = this.props.isLiveStream;\n        if (this.props.driftToleranceMs !== void 0)\n          config.driftToleranceMs = this.props.driftToleranceMs;\n        if (this.props.immediateManifestAds !== void 0)\n          config.immediateManifestAds = this.props.immediateManifestAds;\n        if (this.props.debugAdTiming !== void 0)\n          config.debugAdTiming = this.props.debugAdTiming;\n        if (this.props.showCustomControls !== void 0)\n          config.showCustomControls = this.props.showCustomControls;\n        if (this.props.onVolumeToggle !== void 0)\n          config.onVolumeToggle = this.props.onVolumeToggle;\n        if (this.props.onFullscreenToggle !== void 0)\n          config.onFullscreenToggle = this.props.onFullscreenToggle;\n        if (this.props.onControlClick !== void 0)\n          config.onControlClick = this.props.onControlClick;\n        if (this.props.licenseKey !== void 0)\n          config.licenseKey = this.props.licenseKey;\n        if (this.props.adFailsafeTimeoutMs !== void 0)\n          config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n        if (this.props.minSegmentsBeforePlay !== void 0)\n          config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n        if (this.props.ctvAdRequest !== void 0)\n          config.ctvAdRequest = this.props.ctvAdRequest;\n        this.player = new StormcloudVideoPlayer(config);\n        this.props.onMount?.(this);\n        await this.player.load();\n        if (this.mounted) {\n          this.props.onReady?.();\n        }\n      } catch (error) {\n        if (this.mounted) {\n          this.props.onError?.(error);\n        }\n      }\n    };\n    this.play = () => {\n      if (this.props.videoElement) {\n        const video = this.props.videoElement;\n        const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n        if (hasValidSource) {\n          video.play()?.catch((error) => {\n            console.error(\"[HlsPlayer] Failed to play:\", error);\n            this.props.onError?.(error);\n          });\n          this.props.onPlay?.();\n        } else {\n          console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n        }\n      }\n    };\n    this.pause = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.pause();\n        this.props.onPause?.();\n      }\n    };\n    this.stop = () => {\n      this.pause();\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = 0;\n      }\n    };\n    this.seekTo = (seconds, keepPlaying) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = seconds;\n        if (!keepPlaying) {\n          this.pause();\n        }\n      }\n    };\n    this.setVolume = (volume) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n      }\n    };\n    this.mute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = true;\n      }\n    };\n    this.unmute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = false;\n      }\n    };\n    this.setPlaybackRate = (rate) => {\n      if (this.props.videoElement && rate > 0) {\n        this.props.videoElement.playbackRate = rate;\n      }\n    };\n    this.getDuration = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n        return this.props.videoElement.duration;\n      }\n      return null;\n    };\n    this.getCurrentTime = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n        return this.props.videoElement.currentTime;\n      }\n      return null;\n    };\n    this.getSecondsLoaded = () => {\n      if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n        return this.props.videoElement.buffered.end(\n          this.props.videoElement.buffered.length - 1\n        );\n      }\n      return null;\n    };\n    this.getInternalPlayer = (key = \"player\") => {\n      if (key === \"player\") return this.player;\n      if (key === \"video\") return this.props.videoElement;\n      if (key === \"hls\" && this.player) return this.player.hls;\n      return null;\n    };\n  }\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n  componentDidUpdate(prevProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n  render() {\n    return null;\n  }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n\n// src/players/FilePlayer.tsx\nvar import_react3 = require(\"react\");\nvar FilePlayer = class extends import_react3.Component {\n  constructor() {\n    super(...arguments);\n    this.mounted = false;\n    this.ready = false;\n    this.load = () => {\n      if (!this.props.videoElement || !this.props.src) return;\n      const video = this.props.videoElement;\n      const handleLoadedMetadata = () => {\n        if (this.mounted && !this.ready) {\n          this.ready = true;\n          this.props.onReady?.();\n        }\n      };\n      const handlePlay = () => {\n        if (this.mounted) {\n          this.props.onPlay?.();\n        }\n      };\n      const handlePause = () => {\n        if (this.mounted) {\n          this.props.onPause?.();\n        }\n      };\n      const handleEnded = () => {\n        if (this.mounted) {\n          this.props.onEnded?.();\n        }\n      };\n      const handleError = (error) => {\n        if (this.mounted) {\n          this.props.onError?.(error);\n        }\n      };\n      const handleLoadedData = () => {\n        if (this.mounted) {\n          this.props.onLoaded?.();\n        }\n      };\n      video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n      video.addEventListener(\"play\", handlePlay);\n      video.addEventListener(\"pause\", handlePause);\n      video.addEventListener(\"ended\", handleEnded);\n      video.addEventListener(\"error\", handleError);\n      video.addEventListener(\"loadeddata\", handleLoadedData);\n      video.src = this.props.src;\n      if (this.props.autoplay !== void 0) video.autoplay = this.props.autoplay;\n      if (this.props.muted !== void 0) video.muted = this.props.muted;\n      if (this.props.loop !== void 0) video.loop = this.props.loop;\n      if (this.props.controls !== void 0) video.controls = this.props.controls;\n      if (this.props.playsInline !== void 0)\n        video.playsInline = this.props.playsInline;\n      if (this.props.preload !== void 0)\n        video.preload = this.props.preload;\n      if (this.props.poster !== void 0) video.poster = this.props.poster;\n      this.props.onMount?.(this);\n      return () => {\n        video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n        video.removeEventListener(\"play\", handlePlay);\n        video.removeEventListener(\"pause\", handlePause);\n        video.removeEventListener(\"ended\", handleEnded);\n        video.removeEventListener(\"error\", handleError);\n        video.removeEventListener(\"loadeddata\", handleLoadedData);\n      };\n    };\n    this.play = () => {\n      if (this.props.videoElement) {\n        const video = this.props.videoElement;\n        const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n        if (hasValidSource) {\n          video.play()?.catch((error) => {\n            console.error(\"[FilePlayer] Failed to play:\", error);\n            this.props.onError?.(error);\n          });\n        } else {\n          console.warn(\"[FilePlayer] Cannot play: video has no valid source\");\n        }\n      }\n    };\n    this.pause = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.pause();\n      }\n    };\n    this.stop = () => {\n      this.pause();\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = 0;\n      }\n    };\n    this.seekTo = (seconds, keepPlaying) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = seconds;\n        if (!keepPlaying) {\n          this.pause();\n        }\n      }\n    };\n    this.setVolume = (volume) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n      }\n    };\n    this.mute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = true;\n      }\n    };\n    this.unmute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = false;\n      }\n    };\n    this.setPlaybackRate = (rate) => {\n      if (this.props.videoElement && rate > 0) {\n        this.props.videoElement.playbackRate = rate;\n      }\n    };\n    this.setLoop = (loop) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.loop = loop;\n      }\n    };\n    this.getDuration = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n        return this.props.videoElement.duration;\n      }\n      return null;\n    };\n    this.getCurrentTime = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n        return this.props.videoElement.currentTime;\n      }\n      return null;\n    };\n    this.getSecondsLoaded = () => {\n      if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n        return this.props.videoElement.buffered.end(\n          this.props.videoElement.buffered.length - 1\n        );\n      }\n      return null;\n    };\n    this.getInternalPlayer = (key = \"player\") => {\n      if (key === \"video\") return this.props.videoElement;\n      return null;\n    };\n    this.enablePIP = async () => {\n      if (this.props.videoElement && \"requestPictureInPicture\" in this.props.videoElement) {\n        try {\n          await this.props.videoElement.requestPictureInPicture();\n        } catch (error) {\n          console.warn(\"Picture-in-Picture failed:\", error);\n        }\n      }\n    };\n    this.disablePIP = async () => {\n      if (document.pictureInPictureElement) {\n        try {\n          await document.exitPictureInPicture();\n        } catch (error) {\n          console.warn(\"Exit Picture-in-Picture failed:\", error);\n        }\n      }\n    };\n  }\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n  componentWillUnmount() {\n    this.mounted = false;\n  }\n  componentDidUpdate(prevProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n  render() {\n    return null;\n  }\n};\nFilePlayer.displayName = \"FilePlayer\";\nFilePlayer.canPlay = canPlay.file;\n\n// src/players/index.ts\nvar players = [\n  {\n    key: \"hls\",\n    name: \"HLS Player\",\n    canPlay: canPlay.hls,\n    lazyPlayer: lazy(() => Promise.resolve({ default: HlsPlayer }))\n  },\n  {\n    key: \"file\",\n    name: \"File Player\",\n    canPlay: canPlay.file,\n    canEnablePIP: (url) => {\n      return canPlay.file(url) && (document.pictureInPictureEnabled || typeof document.webkitSupportsPresentationMode === \"function\");\n    },\n    lazyPlayer: lazy(() => Promise.resolve({ default: FilePlayer }))\n  }\n];\nvar players_default = players;\n","import { lazy } from \"../utils\";\nimport { canPlay } from \"../patterns\";\nimport HlsPlayer from \"./HlsPlayer\";\nimport FilePlayer from \"./FilePlayer\";\n\nexport interface PlayerConfig {\n  key: string;\n  name: string;\n  canPlay: (url: string) => boolean;\n  canEnablePIP?: (url: string) => boolean;\n  lazyPlayer?: any;\n}\n\nconst players: PlayerConfig[] = [\n  {\n    key: \"hls\",\n    name: \"HLS Player\",\n    canPlay: canPlay.hls,\n    lazyPlayer: lazy(() => Promise.resolve({ default: HlsPlayer })),\n  },\n  {\n    key: \"file\",\n    name: \"File Player\",\n    canPlay: canPlay.file,\n    canEnablePIP: (url: string) => {\n      return (\n        canPlay.file(url) &&\n        (document.pictureInPictureEnabled ||\n          typeof (document as any).webkitSupportsPresentationMode ===\n            \"function\")\n      );\n    },\n    lazyPlayer: lazy(() => Promise.resolve({ default: FilePlayer })),\n  },\n];\n\nexport default players;\n","import { lazy as reactLazy } from \"react\";\n\nexport const lazy = reactLazy;\n\nexport const omit = <T extends Record<string, any>, K extends keyof T>(\n  object: T,\n  keys: K[]\n): Omit<T, K> => {\n  const result = { ...object };\n  keys.forEach((key) => {\n    delete result[key];\n  });\n  return result;\n};\n\nexport const isMediaStream = (url: any): url is MediaStream => {\n  return (\n    typeof window !== \"undefined\" &&\n    window.MediaStream &&\n    url instanceof window.MediaStream\n  );\n};\n\nexport const supportsWebKitPresentationMode = (): boolean => {\n  if (typeof window === \"undefined\") return false;\n  const video = document.createElement(\"video\");\n  return \"webkitSupportsPresentationMode\" in video;\n};\n\nexport const randomString = (): string => {\n  return Math.random().toString(36).substr(2, 9);\n};\n\nexport const parseQuery = (url: string): Record<string, string> => {\n  const query: Record<string, string> = {};\n  const queryString = url.split(\"?\")[1] || \"\";\n\n  if (!queryString) return query;\n\n  const manualParse = (qs: string) => {\n    qs.split(\"&\").forEach((param) => {\n      const [key, value] = param.split(\"=\");\n      if (key) {\n        try {\n          query[decodeURIComponent(key)] = value\n            ? decodeURIComponent(value.replace(/\\+/g, \" \"))\n            : \"\";\n        } catch (e) {\n          query[key] = value || \"\";\n        }\n      }\n    });\n  };\n\n  if (typeof URLSearchParams !== \"undefined\") {\n    try {\n      const params = new URLSearchParams(queryString);\n      params.forEach((value, key) => {\n        query[key] = value;\n      });\n      return query;\n    } catch (e) {\n      manualParse(queryString);\n    }\n  } else {\n    manualParse(queryString);\n  }\n\n  return query;\n};\n\nexport const merge = <T extends Record<string, any>>(\n  target: T,\n  ...sources: Partial<T>[]\n): T => {\n  if (!sources.length) return target;\n  const source = sources.shift();\n\n  if (isObject(target) && isObject(source)) {\n    for (const key in source) {\n      if (isObject(source[key])) {\n        if (!target[key]) Object.assign(target, { [key]: {} });\n        merge(target[key] as any, source[key] as any);\n      } else {\n        Object.assign(target, { [key]: source[key] });\n      }\n    }\n  }\n\n  return merge(target, ...sources);\n};\n\nconst isObject = (item: any): item is Record<string, any> => {\n  return item && typeof item === \"object\" && !Array.isArray(item);\n};\n\nexport const IS_BROWSER = typeof window !== \"undefined\" && window.document;\nexport const IS_GLOBAL =\n  typeof globalThis !== \"undefined\" &&\n  globalThis.window &&\n  globalThis.window.document;\nexport const IS_IOS =\n  IS_BROWSER && /iPad|iPhone|iPod/.test(navigator.userAgent);\nexport const IS_SAFARI =\n  IS_BROWSER && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const SUPPORTS_HLS = (): boolean => {\n  if (!IS_BROWSER) return false;\n  const video = document.createElement(\"video\");\n  return Boolean(video.canPlayType(\"application/vnd.apple.mpegurl\"));\n};\n\nexport const SUPPORTS_DASH = (): boolean => {\n  if (!IS_BROWSER) return false;\n  const video = document.createElement(\"video\");\n  return Boolean(video.canPlayType(\"application/dash+xml\"));\n};\n","export const HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nexport const HLS_PATHS = /\\/hls\\//i;\nexport const DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nexport const VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nexport const AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\n\nexport const canPlay = {\n  hls: (url: string): boolean => {\n    if (!url || typeof url !== \"string\") return false;\n    return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n  },\n\n  dash: (url: string): boolean => {\n    if (!url || typeof url !== \"string\") return false;\n    return DASH_EXTENSIONS.test(url);\n  },\n\n  video: (url: string): boolean => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url);\n  },\n\n  audio: (url: string): boolean => {\n    if (!url || typeof url !== \"string\") return false;\n    return AUDIO_EXTENSIONS.test(url);\n  },\n\n  file: (url: string): boolean => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n  },\n};\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\n\ninterface VastMediaFile {\n  url: string;\n  type: string;\n  width: number;\n  height: number;\n  bitrate?: number | undefined;\n}\n\ninterface VastTrackingUrls {\n  impression: string[];\n  start: string[];\n  firstQuartile: string[];\n  midpoint: string[];\n  thirdQuartile: string[];\n  complete: string[];\n  mute: string[];\n  unmute: string[];\n  pause: string[];\n  resume: string[];\n  fullscreen: string[];\n  exitFullscreen: string[];\n  skip: string[];\n  error: string[];\n}\n\ninterface VastAd {\n  id: string;\n  title: string;\n  duration: number;\n  mediaFiles: VastMediaFile[];\n  trackingUrls: VastTrackingUrls;\n  clickThrough?: string | undefined;\n}\n\ntype VastParseResult =\n  | { type: \"inline\"; ad: VastAd }\n  | {\n      type: \"wrapper\";\n      vastAdTagUri: string;\n      trackingUrls: VastTrackingUrls;\n      clickThrough?: string | undefined;\n    }\n  | { type: \"empty\" };\n\nconst MAX_VAST_WRAPPER_DEPTH = 5;\n\nexport function createHlsAdPlayer(\n  contentVideo: HTMLVideoElement,\n  options?: {\n    continueLiveStreamDuringAds?: boolean;\n    licenseKey?: string;\n    mainHlsInstance?: Hls;\n  }\n): AdController {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = new Map<string, Set<(payload?: any) => void>>();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n\n  let adVideoElement: HTMLVideoElement | undefined;\n  let adHls: Hls | undefined;\n  let adContainerEl: HTMLDivElement | undefined;\n  let currentAd: VastAd | undefined;\n  let podAds: VastAd[] = [];\n  let podIndex = 0;\n  let sessionId: string | undefined;\n  const preloadedAds = new Map<string, VastAd>();\n  const preloadingAds = new Map<string, Promise<void>>();\n  let destroyed = false;\n  let pendingTimeouts: number[] = [];\n\n  let trackingFired = {\n    impression: false,\n    start: false,\n    firstQuartile: false,\n    midpoint: false,\n    thirdQuartile: false,\n    complete: false,\n  };\n\n  function emit(event: string, payload?: any): void {\n    const set = listeners.get(event);\n    if (!set) return;\n    for (const fn of Array.from(set)) {\n      try {\n        fn(payload);\n      } catch (error) {\n        console.warn(\n          `[HlsAdPlayer] Error in event listener for ${event}:`,\n          error\n        );\n      }\n    }\n  }\n\n  function generateSessionId(): string {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  function fireTrackingPixels(urls: string[]): void {\n    if (!urls || urls.length === 0) return;\n\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }session_id=${sessionId}`;\n        }\n\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }license_key=${licenseKey}`;\n        }\n\n        const img = new Image(1, 1);\n        img.src = trackingUrl;\n        console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n      } catch (error) {\n        console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n      }\n    });\n  }\n\n  function getMainStreamQuality(): {\n    width: number;\n    height: number;\n    bitrate: number;\n  } | null {\n    if (!mainHlsInstance || !mainHlsInstance.levels) {\n      return null;\n    }\n\n    const currentLevel = mainHlsInstance.currentLevel;\n    if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n      const autoLevel = mainHlsInstance.loadLevel;\n      if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n        const level = mainHlsInstance.levels[autoLevel];\n        return {\n          width: level.width || 1920,\n          height: level.height || 1080,\n          bitrate: level.bitrate || 5000000,\n        };\n      }\n      return null;\n    }\n\n    const level = mainHlsInstance.levels[currentLevel];\n    return {\n      width: level.width || 1920,\n      height: level.height || 1080,\n      bitrate: level.bitrate || 5000000,\n    };\n  }\n\n  function selectBestMediaFile(mediaFiles: VastMediaFile[]): VastMediaFile {\n    if (mediaFiles.length === 0) {\n      throw new Error(\"No media files available\");\n    }\n\n    const firstFile = mediaFiles[0];\n    if (!firstFile) {\n      throw new Error(\"No media files available\");\n    }\n\n    if (mediaFiles.length === 1) {\n      return firstFile;\n    }\n\n    const mainQuality = getMainStreamQuality();\n    if (!mainQuality) {\n      console.log(\n        \"[HlsAdPlayer] No main stream quality info, using first media file\"\n      );\n      return firstFile;\n    }\n\n    console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n\n    const scoredFiles = mediaFiles.map((file) => {\n      const widthDiff = Math.abs(file.width - mainQuality.width);\n      const heightDiff = Math.abs(file.height - mainQuality.height);\n      const resolutionDiff = widthDiff + heightDiff;\n\n      const fileBitrate = (file.bitrate || 5000) * 1000;\n      const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n\n      const score = resolutionDiff * 2 + bitrateDiff / 1000;\n\n      return { file, score, resolutionDiff, bitrateDiff };\n    });\n\n    scoredFiles.sort((a, b) => a.score - b.score);\n\n    const bestMatch = scoredFiles[0];\n    if (!bestMatch) {\n      console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n      return firstFile;\n    }\n\n    console.log(\"[HlsAdPlayer] Selected media file:\", {\n      url: bestMatch.file.url,\n      resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n      bitrate: bestMatch.file.bitrate,\n      score: bestMatch.score,\n      resolutionDiff: bestMatch.resolutionDiff,\n      bitrateDiff: bestMatch.bitrateDiff,\n    });\n\n    return bestMatch.file;\n  }\n\n  function isHlsMediaFile(mediaFile: VastMediaFile): boolean {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return (\n      type === \"application/x-mpegurl\" ||\n      type === \"application/vnd.apple.mpegurl\" ||\n      type.includes(\"mpegurl\") ||\n      url.includes(\".m3u8\")\n    );\n  }\n\n  function isProgressiveMediaFile(mediaFile: VastMediaFile): boolean {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return (\n      type.startsWith(\"video/\") ||\n      url.endsWith(\".mp4\") ||\n      url.includes(\".mp4?\")\n    );\n  }\n\n  function createEmptyTrackingUrls(): VastTrackingUrls {\n    return {\n      impression: [],\n      start: [],\n      firstQuartile: [],\n      midpoint: [],\n      thirdQuartile: [],\n      complete: [],\n      mute: [],\n      unmute: [],\n      pause: [],\n      resume: [],\n      fullscreen: [],\n      exitFullscreen: [],\n      skip: [],\n      error: [],\n    };\n  }\n\n  function extractTrackingUrls(scope: Document | Element): VastTrackingUrls {\n    const trackingUrls = createEmptyTrackingUrls();\n\n    scope.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n\n    scope.querySelectorAll(\"Tracking\").forEach((el) => {\n      const event = el.getAttribute(\"event\");\n      const url = el.textContent?.trim();\n      if (event && url) {\n        const eventKey = event as keyof VastTrackingUrls;\n        if (trackingUrls[eventKey]) {\n          trackingUrls[eventKey].push(url);\n        }\n      }\n    });\n\n    scope.querySelectorAll(\"Error\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.error.push(url);\n    });\n\n    return trackingUrls;\n  }\n\n  function mergeTrackingUrls(\n    target: VastTrackingUrls,\n    source: VastTrackingUrls\n  ): VastTrackingUrls {\n    (Object.keys(target) as Array<keyof VastTrackingUrls>).forEach((key) => {\n      if (source[key] && source[key].length > 0) {\n        target[key] = target[key].concat(source[key]);\n      }\n    });\n    return target;\n  }\n\n  function parseVastXml(xmlString: string): VastParseResult {\n    try {\n      const parser = new DOMParser();\n      const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n      const parserError = xmlDoc.querySelector(\"parsererror\");\n      if (parserError) {\n        console.error(\n          \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n          parserError.textContent\n        );\n        return { type: \"empty\" };\n      }\n\n      const adElement = xmlDoc.querySelector(\"Ad\");\n      if (!adElement) {\n        console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n        return { type: \"empty\" };\n      }\n\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n      const clickThrough = xmlDoc\n        .querySelector(\"ClickThrough\")\n        ?.textContent?.trim();\n\n      const wrapperUri = xmlDoc\n        .querySelector(\"VASTAdTagURI\")\n        ?.textContent?.trim();\n      if (wrapperUri) {\n        console.log(\n          `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n        );\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough,\n        };\n      }\n\n      const isNoAdAvailable =\n        adId === \"empty\" ||\n        title.toLowerCase().includes(\"no ad available\") ||\n        title.toLowerCase() === \"no ad available\";\n\n      const durationText =\n        xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration =\n        parseInt(durationParts[0] || \"0\", 10) * 3600 +\n        parseInt(durationParts[1] || \"0\", 10) * 60 +\n        parseInt(durationParts[2] || \"0\", 10);\n\n      const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\n      console.log(\n        `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n      );\n\n      mediaFileElements.forEach((mf, index) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n\n        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n\n        const mediaFile: VastMediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: undefined,\n        };\n\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr\n          ? parseInt(bitrateAttr, 10)\n          : undefined;\n        mediaFile.bitrate =\n          bitrateValue && bitrateValue > 0 ? bitrateValue : undefined;\n\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\n      });\n\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n        }\n        return { type: \"empty\" };\n      }\n\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough,\n        },\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n      return { type: \"empty\" };\n    }\n  }\n\n  function parseAdElement(adElement: Element): VastParseResult {\n    try {\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n      const clickThrough = adElement\n        .querySelector(\"ClickThrough\")\n        ?.textContent?.trim();\n\n      const wrapperUri = adElement\n        .querySelector(\"VASTAdTagURI\")\n        ?.textContent?.trim();\n      if (wrapperUri) {\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough,\n        };\n      }\n\n      const isNoAdAvailable =\n        adId === \"empty\" ||\n        title.toLowerCase().includes(\"no ad available\") ||\n        title.toLowerCase() === \"no ad available\";\n\n      const durationText =\n        adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration =\n        parseInt(durationParts[0] || \"0\", 10) * 3600 +\n        parseInt(durationParts[1] || \"0\", 10) * 60 +\n        parseInt(durationParts[2] || \"0\", 10);\n\n      const mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\n      mediaFileElements.forEach((mf) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n\n        if (!url) return;\n\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : undefined;\n\n        const mediaFile: VastMediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n        };\n\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\n      });\n\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n        }\n        return { type: \"empty\" };\n      }\n\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough,\n        },\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n      return { type: \"empty\" };\n    }\n  }\n\n  async function fetchVastXml(\n    vastTagUrl: string,\n    credentials: RequestCredentials = \"include\"\n  ): Promise<string> {\n    const requestVast = (creds: RequestCredentials) =>\n      fetch(vastTagUrl, {\n        mode: \"cors\",\n        credentials: creds,\n        headers: {\n          \"Accept\": \"application/xml, text/xml, */*\",\n        },\n        referrerPolicy: \"no-referrer-when-downgrade\",\n      });\n\n    let response: Response;\n    try {\n      response = await requestVast(credentials);\n    } catch (error) {\n      if (credentials !== \"omit\") {\n        console.warn(\n          `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n          error\n        );\n        response = await requestVast(\"omit\");\n      } else {\n        throw error;\n      }\n    }\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n    }\n    return response.text();\n  }\n\n  async function fetchAndParseVastAd(\n    vastTagUrl: string,\n    depth = 0,\n    accumulatedTracking: VastTrackingUrls = createEmptyTrackingUrls()\n  ): Promise<VastAd | null> {\n    const vastXml = await fetchVastXml(\n      vastTagUrl,\n      depth === 0 ? \"include\" : \"omit\"\n    );\n    console.log(\"[HlsAdPlayer] VAST XML received\");\n    console.log(\n      \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n      vastXml.substring(0, 2000)\n    );\n\n    const parsed = parseVastXml(vastXml);\n\n    if (parsed.type === \"empty\") {\n      return null;\n    }\n\n    if (parsed.type === \"wrapper\") {\n      if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n        console.warn(\n          `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n        );\n        return null;\n      }\n\n      mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n      return fetchAndParseVastAd(\n        parsed.vastAdTagUri,\n        depth + 1,\n        accumulatedTracking\n      );\n    }\n\n    mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n    return parsed.ad;\n  }\n\n  async function fetchAndParsePod(vastTagUrl: string): Promise<VastAd[]> {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] Pod VAST XML received\");\n\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\n      return [];\n    }\n\n    adElements.sort((a, b) => {\n      const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n      const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n      const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n      const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n      return aVal - bVal;\n    });\n\n    const ads: VastAd[] = [];\n    for (const adElement of adElements) {\n      const parsed = parseAdElement(adElement);\n\n      if (parsed.type === \"inline\") {\n        ads.push(parsed.ad);\n      } else if (parsed.type === \"wrapper\") {\n        try {\n          const resolved = await fetchAndParseVastAd(\n            parsed.vastAdTagUri,\n            1,\n            parsed.trackingUrls\n          );\n          if (resolved) {\n            ads.push(resolved);\n          }\n        } catch (error) {\n          console.warn(\n            \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n            error\n          );\n        }\n      }\n    }\n\n    console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n    return ads;\n  }\n\n  function createAdVideoElement(): HTMLVideoElement {\n    const video = document.createElement(\"video\");\n    video.style.position = \"absolute\";\n    video.style.left = \"0\";\n    video.style.top = \"0\";\n    video.style.width = \"100%\";\n    video.style.height = \"100%\";\n    video.style.objectFit = \"contain\";\n    video.style.backgroundColor = \"#000\";\n    video.playsInline = true;\n    video.muted = false;\n\n    video.volume = 1.0;\n    console.log(\n      `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n    );\n\n    return video;\n  }\n\n  function setupAdEventListeners(): void {\n    if (!adVideoElement || !currentAd) return;\n\n    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\n\n      const progress = adVideoElement.currentTime / currentAd.duration;\n\n      if (progress >= 0.25 && !trackingFired.firstQuartile) {\n        trackingFired.firstQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n      }\n\n      if (progress >= 0.5 && !trackingFired.midpoint) {\n        trackingFired.midpoint = true;\n        fireTrackingPixels(currentAd.trackingUrls.midpoint);\n      }\n\n      if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n        trackingFired.thirdQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n      }\n    });\n\n    adVideoElement.addEventListener(\"playing\", () => {\n      if (!currentAd || trackingFired.start) return;\n      trackingFired.start = true;\n      fireTrackingPixels(currentAd.trackingUrls.start);\n      console.log(\"[HlsAdPlayer] Ad started playing\");\n    });\n\n    adVideoElement.addEventListener(\"ended\", () => {\n      if (!currentAd || trackingFired.complete) return;\n      trackingFired.complete = true;\n      fireTrackingPixels(currentAd.trackingUrls.complete);\n      console.log(\"[HlsAdPlayer] Ad completed\");\n\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n\n      handleAdComplete();\n    });\n\n    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n\n      handleAdError();\n    });\n\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement!.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement!.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement!.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\n  }\n\n  function setAdPlayingFlag(isPlaying: boolean): void {\n    if (isPlaying) {\n      contentVideo.dataset.stormcloudAdPlaying = \"true\";\n    } else {\n      delete contentVideo.dataset.stormcloudAdPlaying;\n    }\n  }\n\n  function resetQuartileTracking(preserveImpression: boolean): void {\n    trackingFired = {\n      impression: preserveImpression ? trackingFired.impression : false,\n      start: false,\n      firstQuartile: false,\n      midpoint: false,\n      thirdQuartile: false,\n      complete: false,\n    };\n  }\n\n  function loadCurrentAdMedia(): void {\n    if (!adVideoElement || !currentAd) {\n      throw new Error(\"No ad video element or ad to load\");\n    }\n\n    const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n    if (!mediaFile) {\n      throw new Error(\"No media file available for ad\");\n    }\n\n    const isHlsAd = isHlsMediaFile(mediaFile);\n    console.log(\n      `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n    );\n\n    if (isHlsAd && Hls.isSupported()) {\n      if (adHls) {\n        adHls.destroy();\n      }\n\n      adHls = new Hls({\n        enableWorker: true,\n        lowLatencyMode: false,\n      });\n\n      adHls.loadSource(mediaFile.url);\n      adHls.attachMedia(adVideoElement);\n\n      adHls.on(Hls.Events.MANIFEST_PARSED, () => {\n        console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n        adVideoElement!.play().catch((error) => {\n          console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n          handleAdError();\n        });\n      });\n\n      adHls.on(Hls.Events.ERROR, (_event, data) => {\n        console.error(\"[HlsAdPlayer] HLS error:\", data);\n        if (data.fatal) {\n          handleAdError();\n        }\n      });\n    } else if (\n      isHlsAd &&\n      adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")\n    ) {\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n        handleAdError();\n      });\n    } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.load();\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n        handleAdError();\n      });\n    } else {\n      throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n    }\n  }\n\n  function advanceToNextPodAd(): boolean {\n    if (podIndex >= podAds.length - 1) {\n      return false;\n    }\n\n    podIndex++;\n    currentAd = podAds[podIndex];\n    resetQuartileTracking(false);\n\n    if (currentAd) {\n      fireTrackingPixels(currentAd.trackingUrls.impression);\n      trackingFired.impression = true;\n      console.log(\n        `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n      );\n    }\n\n    try {\n      loadCurrentAdMedia();\n      emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n      return true;\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n      return false;\n    }\n  }\n\n  function handleAdComplete(): void {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    \n    if (options?.continueLiveStreamDuringAds) {\n      if (contentVideo.paused) {\n        console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n        contentVideo.play().catch(() => {});\n      } else {\n        console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n      }\n    }\n\n    emit(\"content_resume\");\n  }\n\n  function handleAdError(): void {\n    console.log(\"[HlsAdPlayer] Handling ad error\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n\n    emit(\"ad_error\");\n  }\n\n  return {\n    initialize() {\n      console.log(\"[HlsAdPlayer] Initializing\");\n\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"30\";\n        container.style.backgroundColor = \"#000\";\n\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n    },\n\n    async requestAds(vastTagUrl: string) {\n      console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n\n      if (adPlaying) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n        );\n        return Promise.reject(new Error(\"Ad already playing\"));\n      }\n\n      try {\n        sessionId = generateSessionId();\n        let ads: VastAd[] = [];\n\n        if (preloadedAds.has(vastTagUrl)) {\n          const preloaded = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          if (preloaded) {\n            ads = [preloaded];\n          }\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ads = await fetchAndParsePod(vastTagUrl);\n        }\n\n        if (!ads.length) {\n          console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n          emit(\"ad_error\");\n          return Promise.reject(new Error(\"No ads available from VAST response\"));\n        }\n\n        podAds = ads;\n        podIndex = 0;\n        currentAd = ads[0];\n        console.log(\n          `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n        );\n\n        if (currentAd) {\n          fireTrackingPixels(currentAd.trackingUrls.impression);\n          trackingFired.impression = true;\n        }\n\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n        emit(\"ad_error\");\n        return Promise.reject(error);\n      }\n    },\n    async play() {\n      if (!currentAd) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n        );\n        return Promise.reject(new Error(\"No ad loaded\"));\n      }\n\n      console.log(\"[HlsAdPlayer] Starting ad playback\");\n\n      try {\n        if (!adVideoElement) {\n          adVideoElement = createAdVideoElement();\n          adContainerEl?.appendChild(adVideoElement);\n          setupAdEventListeners();\n        }\n\n        resetQuartileTracking(true);\n\n        const contentVolume = contentVideo.volume;\n        originalVolume = Math.max(\n          0,\n          Math.min(1, contentVolume || originalVolume)\n        );\n\n        if (!options?.continueLiveStreamDuringAds) {\n          contentVideo.pause();\n          console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n        } else {\n          console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n        }\n\n        console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n        contentVideo.muted = true;\n        adPlaying = true;\n        setAdPlayingFlag(true);\n\n        if (adVideoElement) {\n          adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n          adVideoElement.muted = originalMutedState;\n          console.log(\n            `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n          );\n        }\n\n        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n\n        emit(\"content_pause\");\n\n        loadCurrentAdMedia();\n\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n        handleAdError();\n        return Promise.reject(error);\n      }\n    },\n    pause() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n\n      try {\n        if (adVideoElement && !adVideoElement.paused) {\n          adVideoElement.pause();\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n      }\n    },\n    resume() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n\n      try {\n        if (adVideoElement && adVideoElement.paused) {\n          adVideoElement.play().catch(() => {});\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n      }\n    },\n    async stop() {\n      console.log(\"[HlsAdPlayer] Stopping ad\");\n      adPlaying = false;\n      setAdPlayingFlag(false);\n\n      const previousMutedState = contentVideo.muted;\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      console.log(\n        `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n      );\n\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n\n      contentVideo.style.visibility = \"visible\";\n      contentVideo.style.opacity = \"1\";\n\n      if (options?.continueLiveStreamDuringAds) {\n        if (contentVideo.paused) {\n          console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n          contentVideo.play().catch(() => {});\n        }\n      }\n\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n\n      currentAd = undefined;\n      podAds = [];\n      podIndex = 0;\n    },\n\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\n      \n      for (const timeoutId of pendingTimeouts) {\n        clearTimeout(timeoutId);\n      }\n      pendingTimeouts = [];\n      \n      adPlaying = false;\n      setAdPlayingFlag(false);\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = undefined;\n      }\n\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n\n      adContainerEl = undefined;\n      currentAd = undefined;\n      podAds = [];\n      podIndex = 0;\n      listeners.clear();\n      preloadedAds.clear();\n      preloadingAds.clear();\n    },\n\n    isAdPlaying() {\n      return adPlaying;\n    },\n\n    resize(width: number, height: number) {\n      console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n\n      if (adContainerEl) {\n        adContainerEl.style.width = `${width}px`;\n        adContainerEl.style.height = `${height}px`;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.style.width = `${width}px`;\n        adVideoElement.style.height = `${height}px`;\n      }\n    },\n\n    on(event: string, listener: (payload?: any) => void) {\n      if (!listeners.has(event)) listeners.set(event, new Set());\n      listeners.get(event)!.add(listener);\n    },\n\n    off(event: string, listener: (payload?: any) => void) {\n      listeners.get(event)?.delete(listener);\n    },\n\n    updateOriginalMutedState(muted: boolean, volume?: number) {\n      const nextVolume =\n        typeof volume === \"number\" && !Number.isNaN(volume)\n          ? Math.max(0, Math.min(1, volume))\n          : originalVolume;\n      console.log(\n        `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n      );\n      originalMutedState = muted;\n      originalVolume = nextVolume;\n    },\n\n    getOriginalMutedState() {\n      return originalMutedState;\n    },\n    getOriginalVolume() {\n      return originalVolume;\n    },\n\n    setAdVolume(volume: number) {\n      if (adVideoElement && adPlaying) {\n        const clamped = Math.max(0, Math.min(1, volume));\n        adVideoElement.volume = clamped;\n        adVideoElement.muted = clamped === 0;\n      }\n    },\n\n    getAdVolume(): number {\n      if (adVideoElement && adPlaying) {\n        return adVideoElement.volume;\n      }\n      return 1;\n    },\n    showPlaceholder() {\n      contentVideo.style.opacity = \"0\";\n      contentVideo.style.visibility = \"hidden\";\n      \n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"10\";\n        container.style.backgroundColor = \"#000\";\n\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n\n      if (adContainerEl) {\n        adContainerEl.style.display = \"flex\";\n        adContainerEl.style.pointerEvents = \"auto\";\n      }\n    },\n    hidePlaceholder() {\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      \n      if (!adPlaying) {\n        contentVideo.style.visibility = \"visible\";\n        contentVideo.style.opacity = \"1\";\n      }\n    },\n    getLoadedAdDuration() {\n      return currentAd?.duration;\n    },\n    getLoadedAdId() {\n      return currentAd?.id;\n    },\n    getPodAdCount() {\n      return podAds.length;\n    },\n    getPodTotalDurationMs() {\n      return podAds.reduce(\n        (total, ad) => total + (ad.duration > 0 ? ad.duration * 1000 : 0),\n        0\n      );\n    },\n  };\n}\n","import { Component } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport { canPlay } from \"../patterns\";\n\nexport interface HlsPlayerProps extends StormcloudVideoPlayerConfig {\n  onMount?: (player: any) => void;\n  onReady?: () => void;\n  onPlay?: () => void;\n  onPause?: () => void;\n  onEnded?: () => void;\n  onLoaded?: () => void;\n  onError?: (error: any) => void;\n}\n\nexport default class HlsPlayer extends Component<HlsPlayerProps> {\n  static displayName = \"HlsPlayer\";\n\n  static canPlay = canPlay.hls;\n\n  private player: StormcloudVideoPlayer | null = null;\n  private mounted = false;\n\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n\n  componentDidUpdate(prevProps: HlsPlayerProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n\n  load = async () => {\n    if (!this.props.videoElement || !this.props.src) return;\n\n    try {\n      if (this.player) {\n        this.player.destroy();\n        this.player = null;\n      }\n\n      const config: StormcloudVideoPlayerConfig = {\n        src: this.props.src,\n        videoElement: this.props.videoElement,\n      };\n\n      if (this.props.autoplay !== undefined)\n        config.autoplay = this.props.autoplay;\n      if (this.props.muted !== undefined) config.muted = this.props.muted;\n      if (this.props.lowLatencyMode !== undefined)\n        config.lowLatencyMode = this.props.lowLatencyMode;\n      if (this.props.allowNativeHls !== undefined)\n        config.allowNativeHls = this.props.allowNativeHls;\n      if (this.props.isLiveStream !== undefined)\n        config.isLiveStream = this.props.isLiveStream;\n      if (this.props.driftToleranceMs !== undefined)\n        config.driftToleranceMs = this.props.driftToleranceMs;\n      if (this.props.immediateManifestAds !== undefined)\n        config.immediateManifestAds = this.props.immediateManifestAds;\n      if (this.props.debugAdTiming !== undefined)\n        config.debugAdTiming = this.props.debugAdTiming;\n      if (this.props.showCustomControls !== undefined)\n        config.showCustomControls = this.props.showCustomControls;\n      if (this.props.onVolumeToggle !== undefined)\n        config.onVolumeToggle = this.props.onVolumeToggle;\n      if (this.props.onFullscreenToggle !== undefined)\n        config.onFullscreenToggle = this.props.onFullscreenToggle;\n      if (this.props.onControlClick !== undefined)\n        config.onControlClick = this.props.onControlClick;\n      if (this.props.licenseKey !== undefined)\n        config.licenseKey = this.props.licenseKey;\n      if (this.props.adFailsafeTimeoutMs !== undefined)\n        config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n      if (this.props.minSegmentsBeforePlay !== undefined)\n        config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n      if (this.props.ctvAdRequest !== undefined)\n        config.ctvAdRequest = this.props.ctvAdRequest;\n\n      this.player = new StormcloudVideoPlayer(config);\n\n      this.props.onMount?.(this);\n\n      await this.player.load();\n\n      if (this.mounted) {\n        this.props.onReady?.();\n      }\n    } catch (error) {\n      if (this.mounted) {\n        this.props.onError?.(error);\n      }\n    }\n  };\n\n  play = () => {\n    if (this.props.videoElement) {\n      const video = this.props.videoElement;\n      const hasValidSource =\n        video.src ||\n        (video.currentSrc && video.currentSrc !== \"\") ||\n        video.readyState >= 1;\n\n      if (hasValidSource) {\n        video.play()?.catch((error) => {\n          console.error(\"[HlsPlayer] Failed to play:\", error);\n          this.props.onError?.(error);\n        });\n        this.props.onPlay?.();\n      } else {\n        console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n      }\n    }\n  };\n\n  pause = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.pause();\n      this.props.onPause?.();\n    }\n  };\n\n  stop = () => {\n    this.pause();\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = 0;\n    }\n  };\n\n  seekTo = (seconds: number, keepPlaying?: boolean) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = seconds;\n      if (!keepPlaying) {\n        this.pause();\n      }\n    }\n  };\n\n  setVolume = (volume: number) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n    }\n  };\n\n  mute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = true;\n    }\n  };\n\n  unmute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = false;\n    }\n  };\n\n  setPlaybackRate = (rate: number) => {\n    if (this.props.videoElement && rate > 0) {\n      this.props.videoElement.playbackRate = rate;\n    }\n  };\n\n  getDuration = (): number | null => {\n    if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n      return this.props.videoElement.duration;\n    }\n    return null;\n  };\n\n  getCurrentTime = (): number | null => {\n    if (\n      this.props.videoElement &&\n      isFinite(this.props.videoElement.currentTime)\n    ) {\n      return this.props.videoElement.currentTime;\n    }\n    return null;\n  };\n\n  getSecondsLoaded = (): number | null => {\n    if (\n      this.props.videoElement &&\n      this.props.videoElement.buffered.length > 0\n    ) {\n      return this.props.videoElement.buffered.end(\n        this.props.videoElement.buffered.length - 1\n      );\n    }\n    return null;\n  };\n\n  getInternalPlayer = (key = \"player\") => {\n    if (key === \"player\") return this.player;\n    if (key === \"video\") return this.props.videoElement;\n    if (key === \"hls\" && this.player) return (this.player as any).hls;\n    return null;\n  };\n\n  render() {\n    return null;\n  }\n}\n","declare global {\n  interface Window {\n    goog?: any;\n  }\n}\n\nconst PAL_SDK_URL =\n  \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\n\nlet _nonceLoader: any | undefined;\nlet _palLoadPromise: Promise<void> | undefined;\n\nfunction loadPalSdk(): Promise<void> {\n  if (typeof window !== \"undefined\" && window.goog?.pal) {\n    return Promise.resolve();\n  }\n\n  if (_palLoadPromise) return _palLoadPromise;\n\n  _palLoadPromise = new Promise<void>((resolve, reject) => {\n    const existing = document.querySelector(\n      'script[data-pal=\"true\"]'\n    ) as HTMLScriptElement | null;\n\n    if (existing) {\n      if (window.goog?.pal) {\n        resolve();\n        return;\n      }\n      const timeout = setTimeout(\n        () => reject(new Error(\"PAL SDK load timeout\")),\n        10000\n      );\n      existing.addEventListener(\"load\", () => {\n        clearTimeout(timeout);\n        resolve();\n      });\n      existing.addEventListener(\"error\", () => {\n        clearTimeout(timeout);\n        reject(new Error(\"PAL SDK load failed\"));\n      });\n      return;\n    }\n\n    const script = document.createElement(\"script\");\n    script.src = PAL_SDK_URL;\n    script.async = true;\n    script.setAttribute(\"data-pal\", \"true\");\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n    document.head.appendChild(script);\n  });\n\n  return _palLoadPromise;\n}\n\nfunction getOrCreateNonceLoader(): any {\n  if (_nonceLoader) return _nonceLoader;\n  const goog = window.goog;\n  const consentSettings = new goog.pal.ConsentSettings();\n  consentSettings.allowStorage = true;\n  _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n  return _nonceLoader;\n}\n\nexport interface PalNonceOptions {\n  videoWidth?: number;\n  videoHeight?: number;\n  descriptionUrl?: string;\n  ppid?: string;\n  sessionId?: string;\n  adWillAutoPlay?: boolean;\n  adWillPlayMuted?: boolean;\n  playerVolume?: number;\n  continuousPlayback?: boolean;\n}\n\nexport interface PalNonceManager {\n  generateNonce(options?: PalNonceOptions): Promise<string>;\n\n  getCurrentNonce(): string;\n\n  injectNonce(vastTagUrl: string): string;\n\n  sendPlaybackStart(): void;\n\n  sendPlaybackEnd(): void;\n\n  sendAdClick(): void;\n\n  sendAdTouch(event: MouseEvent | TouchEvent): void;\n\n  reset(): void;\n}\n\nexport function createPalNonceManager(): PalNonceManager {\n  let currentNonce = \"\";\n  let currentNonceManager: any | undefined;\n\n  return {\n    async generateNonce(options: PalNonceOptions = {}): Promise<string> {\n      try {\n        await loadPalSdk();\n\n        const loader = getOrCreateNonceLoader();\n        const goog = window.goog;\n\n        const request = new goog.pal.NonceRequest();\n        request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n        request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n        request.playerVolume =\n          options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n        request.continuousPlayback = options.continuousPlayback ?? true;\n        request.descriptionUrl =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.videoWidth = options.videoWidth || 640;\n        request.videoHeight = options.videoHeight || 480;\n\n        if (options.ppid) request.ppid = options.ppid;\n        if (options.sessionId) request.sessionId = options.sessionId;\n\n        console.log(\"[PAL] NonceRequest before generateNonce:\", {\n          adWillAutoPlay: request.adWillAutoPlay,\n          adWillPlayMuted: request.adWillPlayMuted,\n          playerVolume: request.playerVolume,\n          continuousPlayback: request.continuousPlayback,\n          descriptionUrl: request.descriptionUrl,\n          iconsSupported: request.iconsSupported,\n          playerType: request.playerType,\n          playerVersion: request.playerVersion,\n          supportedApiFrameworks: request.supportedApiFrameworks,\n          url: request.url,\n          videoWidth: request.videoWidth,\n          videoHeight: request.videoHeight,\n          ppid: request.ppid,\n          sessionId: request.sessionId,\n        });\n\n        const manager = await loader.loadNonceManager(request);\n        currentNonceManager = manager;\n        currentNonce = manager.getNonce() as string;\n\n        console.log(\"[PAL] Nonce generated successfully\");\n        return currentNonce;\n      } catch (error) {\n        console.warn(\"[PAL] Failed to generate nonce:\", error);\n        currentNonce = \"\";\n        currentNonceManager = undefined;\n        return \"\";\n      }\n    },\n\n    getCurrentNonce(): string {\n      return currentNonce;\n    },\n\n    injectNonce(vastTagUrl: string): string {\n      if (!currentNonce || !vastTagUrl) return vastTagUrl;\n\n      try {\n        const url = new URL(vastTagUrl);\n        url.searchParams.delete(\"paln\");\n        url.searchParams.set(\"givn\", currentNonce);\n        return url.toString();\n      } catch {\n        let base = vastTagUrl\n          .replace(/([?&])paln=[^&]*/g, \"\")\n          .replace(/[?&]$/, \"\");\n        const sep = base.includes(\"?\") ? \"&\" : \"?\";\n        return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n      }\n    },\n\n    sendPlaybackStart(): void {\n      try {\n        currentNonceManager?.sendPlaybackStart();\n      } catch {}\n    },\n\n    sendPlaybackEnd(): void {\n      try {\n        currentNonceManager?.sendPlaybackEnd();\n      } catch {}\n    },\n\n    sendAdClick(): void {\n      try {\n        currentNonceManager?.sendAdClick();\n      } catch {}\n    },\n\n    sendAdTouch(event: MouseEvent | TouchEvent): void {\n      try {\n        currentNonceManager?.sendAdTouch(event);\n      } catch {}\n    },\n\n    reset(): void {\n      currentNonce = \"\";\n      currentNonceManager = undefined;\n    },\n  };\n}\n","export const MQTT_CA_CERT_FILE = \"src/certs/emqxsl-ca.crt\";\n\nexport type MQTTConfig = {\n  enabled: boolean;\n  brokerAddress: string;\n  brokerPort: number;\n  wsPort: number;\n  username: string;\n  password: string;\n  topicPrefix: string;\n  qos: 0 | 1 | 2;\n  brokerUrl?: string;\n};\n\nexport const DEFAULT_MQTT_CONFIG: MQTTConfig = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1,\n};\n\nexport const mqttConfig: MQTTConfig = { ...DEFAULT_MQTT_CONFIG };\n\nexport function applyMQTTConfig(overrides: Partial<MQTTConfig>): void {\n  Object.assign(mqttConfig, overrides);\n}\n\nexport function isMQTTEnabled(): boolean {\n  return mqttConfig.enabled;\n}\n\nexport function buildMQTTBrokerUrl(): string {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\n\nexport function buildPlayerTopic(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\"\n): string {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n","import mqtt from \"mqtt\";\nimport type { MqttClient } from \"mqtt\";\nimport {\n  applyMQTTConfig,\n  buildMQTTBrokerUrl,\n  isMQTTEnabled,\n  mqttConfig,\n} from \"./mqttConfig\";\nimport type { MQTTConfig } from \"./mqttConfig\";\n\nconst LOG = \"[StormcloudVideoPlayer][MQTT]\";\n\nexport type MQTTStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nlet client: MqttClient | null = null;\nlet status: MQTTStatus = \"disconnected\";\n\nexport function getMQTTStatus(): MQTTStatus {\n  return status;\n}\n\nexport function isMQTTConnected(): boolean {\n  return status === \"connected\" && client !== null && client.connected;\n}\n\nexport function isMQTTConfigured(): boolean {\n  return isMQTTEnabled();\n}\n\nexport function configureMQTT(overrides: Partial<MQTTConfig>): void {\n  applyMQTTConfig(overrides);\n  disconnectMQTT();\n}\n\nexport function initMQTTClient(): void {\n  if (client || !isMQTTEnabled()) return;\n\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n\n  try {\n    client = mqtt.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5000,\n      connectTimeout: 10_000,\n      queueQoSZero: false,\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting…`);\n  });\n\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\n\nexport function ensureMQTTClient(): void {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\n\nexport function publishMQTT(\n  topic: string,\n  payload: Record<string, unknown>\n): boolean {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n\n  ensureMQTTClient();\n\n  if (!client) {\n    return false;\n  }\n\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\nexport function disconnectMQTT(): void {\n  if (client) {\n    client.end(true);\n    client = null;\n    status = \"disconnected\";\n  }\n}\n","export interface VastEnvironmentSignals {\n  isCtv: boolean;\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  sessionId?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n  deviceTypeHint?: number;\n}\n\nconst AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nconst AIRY_WEBOS_APP_ID    = \"com.freeairytv.webos\";\nconst AIRY_TIZEN_APP_ID    = \"com.freeairytv.samsung\";\nconst AIRY_ROKU_APP_ID     = \"com.freeairytv.roku\";\nconst AIRY_APP_NAME = \"AiryTV Movies & TV\";\nconst AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst LG_TEST_APP_ID      = \"com.hulu.plus\";\nconst LG_TEST_APP_NAME    = \"Hulu\";\nconst LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\n\nlet _lgTestDeviceId: string | undefined;\nfunction getLgTestDeviceId(): string {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\n\nfunction isLgWebOS(): boolean {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\n\nfunction getDefaultAppId(): string {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua))                       return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua))                                return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\n\nconst DEVICE_ID_STORAGE_KEYS = [\n  \"rdid\",\n  \"ifa\",\n  \"advertisingId\",\n  \"advertising_id\",\n  \"deviceAdvertisingId\",\n  \"aaid\",\n  \"adid\",\n  \"rida\",\n  \"tifa\",\n  \"lgudid\",\n];\n\nconst ANDROID_ID_TYPES = new Set([\"aaid\", \"adid\"]);\n\nexport function resolveVastEnvironmentSignals(isCtv: boolean): VastEnvironmentSignals {\n  const bridgeSignals  = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const lg = isCtv && isLgWebOS();\n\n  const deviceId =\n    bridgeSignals.deviceId  ||\n    readStoredDeviceId()    ||\n    platformDevice.deviceId ||\n    (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : undefined);\n  const deviceIdType =\n    bridgeSignals.deviceIdType  ||\n    readStoredString(\"deviceIdType\") ||\n    readStoredString(\"idtype\") ||\n    platformDevice.deviceIdType ||\n    inferDeviceIdType() ||\n    (lg ? \"lgudid\" : undefined);\n  const platformLat = bridgeSignals.deviceId\n    ? bridgeSignals.limitAdTracking\n    : platformDevice.limitAdTracking;\n  const limitAdTracking =\n    deviceId != null\n      ? platformLat ?? readStoredLimitAdTracking() ?? false\n      : undefined;\n\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl:\n        bridgeSignals.contentUrl ||\n        readStoredString(\"contentUrl\") ||\n        (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId:\n        bridgeSignals.appId ||\n        readStoredString(\"appId\") ||\n        readStoredString(\"msid\") ||\n        (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName:\n        bridgeSignals.appName ||\n        readStoredString(\"appName\") ||\n        readStoredString(\"an\") ||\n        (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceIdType ? { deviceIdType } : {}),\n      ...(limitAdTracking != null ? { limitAdTracking } : {}),\n      deviceTypeHint: 5,\n    };\n  }\n\n  return {\n    isCtv: false,\n    ...(deviceId ? { deviceId } : {}),\n    ...(deviceIdType ? { deviceIdType } : {}),\n    ...(limitAdTracking != null ? { limitAdTracking } : {}),\n  };\n}\n\nexport function inferDeviceIdType(): string | undefined {\n  if (typeof navigator === \"undefined\") {\n    return undefined;\n  }\n\n  const ua = navigator.userAgent;\n  if (/Roku/i.test(ua)) return \"rida\";\n  if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n  if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n  if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n  if (/Android|Google TV/i.test(ua)) return \"aaid\";\n  if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n  return undefined;\n}\n\nexport function isEquivalentDeviceIdType(\n  tagType: string | undefined,\n  runtimeType: string | undefined\n): boolean {\n  if (!tagType || !runtimeType) return false;\n  const tag = tagType.toLowerCase();\n  const runtime = runtimeType.toLowerCase();\n  if (tag === runtime) return true;\n  return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\n\nexport function resolveNativeDeviceId(): string | undefined {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const deviceId =\n    bridgeSignals.deviceId ||\n    readStoredDeviceId() ||\n    platformDevice.deviceId;\n\n  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n    return undefined;\n  }\n\n  return deviceId;\n}\n\nexport function getOrCreateStoredUuid(storageKey: string): string | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  const existing = readPersistentId(storageKey);\n  if (existing) {\n    writePersistentId(storageKey, existing);\n    return existing;\n  }\n\n  const id = createUuid();\n  writePersistentId(storageKey, id);\n  return id;\n}\n\nfunction getOrCreateCtvSessionId(): string {\n  const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n    return existing;\n  }\n\n  const sessionId = createUuid();\n  writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n  return sessionId;\n}\n\nfunction readPersistentId(storageKey: string): string | undefined {\n  return readStoredString(storageKey) || readCookie(storageKey);\n}\n\nfunction writePersistentId(storageKey: string, value: string): void {\n  try {\n    window.localStorage?.setItem(storageKey, value);\n  } catch {}\n  writeCookie(storageKey, value);\n}\n\nconst PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5; // ~5 years\n\nfunction readCookie(name: string): string | undefined {\n  if (typeof document === \"undefined\") {\n    return undefined;\n  }\n\n  try {\n    const prefix = encodeURIComponent(name) + \"=\";\n    const parts = document.cookie ? document.cookie.split(\";\") : [];\n    for (const part of parts) {\n      const entry = part.trim();\n      if (entry.startsWith(prefix)) {\n        return decodeURIComponent(entry.slice(prefix.length)) || undefined;\n      }\n    }\n  } catch {}\n\n  return undefined;\n}\n\nfunction writeCookie(name: string, value: string): void {\n  if (typeof document === \"undefined\") {\n    return;\n  }\n\n  try {\n    document.cookie =\n      encodeURIComponent(name) +\n      \"=\" +\n      encodeURIComponent(value) +\n      \";path=/;max-age=\" +\n      PERSISTENT_ID_COOKIE_MAX_AGE +\n      \";SameSite=Lax\";\n  } catch {}\n}\n\nfunction createUuid(): string {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n\n  const bytes = new Uint8Array(16);\n  if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n    crypto.getRandomValues(bytes);\n  } else {\n    let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n    for (let i = 0; i < 16; i++) {\n      seed = (seed * 1103515245 + 12345) & 0x7fffffff;\n      bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 0xff;\n    }\n  }\n\n  bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n  bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n\n  let hex = \"\";\n  for (let i = 0; i < 16; i++) {\n    hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n  }\n\n  return (\n    hex.slice(0, 8) +\n    \"-\" +\n    hex.slice(8, 12) +\n    \"-\" +\n    hex.slice(12, 16) +\n    \"-\" +\n    hex.slice(16, 20) +\n    \"-\" +\n    hex.slice(20, 32)\n  );\n}\n\nfunction performanceNow(): number {\n  try {\n    if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n      return performance.now();\n    }\n  } catch {}\n  return 0;\n}\n\nfunction readPlatformNativeDeviceId(): {\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") return {};\n\n  try {\n    const adinfo = (window as any).webapis?.adinfo;\n    if (adinfo) {\n      const tifa: unknown =\n        typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n      if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n        const lat: unknown =\n          typeof adinfo.isLATEnabled === \"function\"\n            ? adinfo.isLATEnabled()\n            : undefined;\n        return {\n          deviceId: tifa,\n          deviceIdType: \"tifa\",\n          ...(typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}),\n        };\n      }\n    }\n  } catch {}\n\n  try {\n    const webOSDev = (window as any).webOSDev;\n    if (webOSDev) {\n      const lgudid: unknown =\n        typeof webOSDev.LGUDID === \"function\"\n          ? webOSDev.LGUDID()\n          : webOSDev.lgudid ?? webOSDev.LGUDID;\n      if (typeof lgudid === \"string\" && lgudid) {\n        if (isZeroedAdId(lgudid)) {\n          return { deviceIdType: \"lgudid\", limitAdTracking: true };\n        }\n        if (!isMacroPlaceholder(lgudid)) {\n          return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n        }\n      }\n    }\n  } catch {}\n\n  try {\n    const roku = (window as any).Roku;\n    if (roku) {\n      const rida: unknown =\n        typeof roku.getPublisherUniqueId === \"function\"\n          ? roku.getPublisherUniqueId()\n          : roku.rida;\n      if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n        return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n      }\n    }\n  } catch {}\n\n  return {};\n}\n\nconst ZEROED_AD_ID_PATTERNS: ReadonlySet<string> = new Set([\n  \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n  \"00000000-0000-0000-0000-000000000000\",\n]);\n\nfunction isMacroPlaceholder(value: string): boolean {\n  const t = value.trim();\n  return !t ||\n    /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) ||\n    /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) ||\n    ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\n\nfunction isZeroedAdId(value: string): boolean {\n  return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\n\nfunction readNativeBridgeSignals(): {\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n\n  const candidates = [\n    (window as any).__STORMCLOUD_CTV_AD_INFO__,\n    (window as any).__STORMCLOUD_CTV__,\n    (window as any).stormcloudCtv,\n    (window as any).AiryTV,\n    (window as any).Android,\n    (window as any).webOS,\n    (window as any).tizen,\n    (window as any).amazon,\n  ].filter(Boolean);\n\n  for (const source of candidates) {\n    const contentUrl =\n      readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) ||\n      undefined;\n    const appId =\n      readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) ||\n      undefined;\n    const appName =\n      readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || undefined;\n    const deviceId =\n      readBridgeValue(source, [\n        \"rdid\",\n        \"ifa\",\n        \"advertisingId\",\n        \"adId\",\n        \"deviceId\",\n        \"lgudid\",\n        \"LGUDID\",\n        \"tifa\",\n        \"rida\",\n        \"afai\",\n        \"aaid\",\n      ]) || undefined;\n\n    if (!contentUrl && !deviceId && !appId && !appName) continue;\n\n    const deviceIdType =\n      readBridgeValue(source, [\n        \"idtype\",\n        \"deviceIdType\",\n        \"advertisingIdType\",\n        \"idType\",\n      ]) || inferDeviceIdType();\n    const limitAdTracking = readBridgeBoolean(source, [\n      \"is_lat\",\n      \"limitAdTracking\",\n      \"limitedAdTracking\",\n      \"lat\",\n    ]);\n\n    return {\n      ...(contentUrl ? { contentUrl } : {}),\n      ...(appId ? { appId } : {}),\n      ...(appName ? { appName } : {}),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n      ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n    };\n  }\n\n  return {};\n}\n\nfunction readBridgeValue(source: any, keys: string[]): string | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    if (typeof value === \"string\" && value) {\n      return value;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = value.call(source);\n        if (typeof result === \"string\" && result) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readBridgeBoolean(source: any, keys: string[]): boolean | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    const normalized = normalizeBoolean(value);\n    if (normalized != null) {\n      return normalized;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = normalizeBoolean(value.call(source));\n        if (result != null) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredDeviceId(): string | undefined {\n  for (const key of DEVICE_ID_STORAGE_KEYS) {\n    const value = readStoredString(key);\n    if (value) {\n      return value;\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredString(key: string): string | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  try {\n    const value = window.localStorage?.getItem(key);\n    return value || undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction readStoredLimitAdTracking(): boolean | undefined {\n  return normalizeBoolean(\n    readStoredString(\"limitAdTracking\") ||\n      readStoredString(\"limitedAdTracking\") ||\n      readStoredString(\"is_lat\")\n  );\n}\n\nfunction normalizeBoolean(value: unknown): boolean | undefined {\n  if (typeof value === \"boolean\") {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    return value === 1;\n  }\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase();\n    if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n      return true;\n    }\n    if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n      return false;\n    }\n  }\n  return undefined;\n}\n","import type {\n  ClientInfo,\n  AdDetectInfo,\n  AdLoadedInfo,\n  AdImpressionInfo,\n  PlayerAnalyticsContext,\n  StormcloudVideoPlayerConfig,\n} from \"../types\";\n\nimport { buildPlayerTopic, isMQTTEnabled } from \"./mqttConfig\";\nimport { ensureMQTTClient, publishMQTT } from \"./mqttClient\";\nimport {\n  getOrCreateStoredUuid,\n  PLAYER_ID_STORAGE_KEY,\n  resolveNativeDeviceId,\n} from \"./vastEnvironmentSignals\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function buildAnalyticsContext(\n  config: Pick<StormcloudVideoPlayerConfig, \"debugAdTiming\" | \"isLiveStream\">\n): PlayerAnalyticsContext {\n  const context: PlayerAnalyticsContext = {};\n  if (config.debugAdTiming) {\n    context.debugAdTiming = true;\n  }\n  if (config.isLiveStream !== undefined) {\n    context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n  }\n  return context;\n}\n\nexport function getClientInfo(): ClientInfo {\n  const ua = navigator.userAgent;\n  const platform = navigator.platform;\n  const vendor = navigator.vendor || \"\";\n  const maxTouchPoints = navigator.maxTouchPoints || 0;\n  const memory = (navigator as any).deviceMemory || null;\n  const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n  const screenInfo = {\n    width: screen?.width,\n    height: screen?.height,\n    availWidth: screen?.availWidth,\n    availHeight: screen?.availHeight,\n    orientation: (screen?.orientation as any)?.type || \"\",\n    pixelDepth: screen?.pixelDepth,\n  };\n\n  let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\n  let brand = \"Unknown\";\n  let os = \"Unknown\";\n  let model = \"\";\n  let isSmartTV = false;\n  let isAndroid = false;\n  let isWebView = false;\n  let isWebApp = false;\n\n  if (ua.includes(\"Web0S\")) {\n    brand = \"LG\";\n    os = \"webOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n    model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n  } else if (ua.includes(\"Tizen\")) {\n    brand = \"Samsung\";\n    os = \"Tizen\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n    const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n    model = tizenMatch\n      ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n      : \"Tizen TV\";\n  } else if (ua.includes(\"Philips\")) {\n    brand = \"Philips\";\n    os = \"Saphi\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n    brand = \"Sharp\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (\n    ua.includes(\"Android\") &&\n    (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n  ) {\n    brand = \"Sony\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (\n    ua.includes(\"Android\") &&\n    (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n  ) {\n    brand = \"LG\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n    brand = \"Roku\";\n    os = \"Roku OS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"AppleTV\")) {\n    brand = \"Apple\";\n    os = \"tvOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  }\n\n  if (ua.includes(\"Android\")) {\n    isAndroid = true;\n    os = \"Android\";\n    deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n    if (\n      ua.includes(\"Android\") &&\n      (maxTouchPoints === 0 ||\n        ua.includes(\"Google TV\") ||\n        ua.includes(\"XiaoMi\"))\n    ) {\n      deviceType = \"tv\";\n      isSmartTV = true;\n      brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n    }\n\n    const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n    if (androidModelMatch && androidModelMatch[1]) {\n      model = androidModelMatch[1];\n    }\n  }\n\n  if (/iPad|iPhone|iPod/.test(ua)) {\n    os = \"iOS\";\n    deviceType = \"mobile\";\n    brand = \"Apple\";\n    if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n      deviceType = \"tablet\";\n    }\n  }\n\n  if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n    if (ua.includes(\"Windows\")) {\n      os = \"Windows\";\n      deviceType = \"desktop\";\n    } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n      os = \"macOS\";\n      deviceType = \"desktop\";\n      if (maxTouchPoints > 1) deviceType = \"tablet\";\n    } else if (ua.includes(\"Linux\")) {\n      os = \"Linux\";\n      deviceType = \"desktop\";\n    }\n  }\n\n  if (brand === \"Unknown\") {\n    if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n    if (vendor.includes(\"Apple\")) brand = \"Apple\";\n    if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n  }\n\n  isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n  if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n    isWebView = true;\n  }\n\n  isWebApp =\n    window.matchMedia(\"(display-mode: standalone)\").matches ||\n    (window.navigator as any).standalone === true ||\n    window.screen?.orientation?.angle !== undefined;\n\n  return {\n    brand,\n    os,\n    model: model || ua.substring(0, 50) + \"...\",\n    deviceType,\n    isSmartTV,\n    isAndroid,\n    isWebView,\n    isWebApp,\n    domain: window.location.hostname,\n    origin: window.location.origin,\n    path: window.location.pathname,\n    userAgent: ua,\n    vendor,\n    platform,\n    screen: screenInfo,\n    hardwareConcurrency,\n    deviceMemory: memory,\n    maxTouchPoints,\n    language: navigator.language,\n    languages: navigator.languages?.join(\",\") || \"\",\n    cookieEnabled: navigator.cookieEnabled,\n    doNotTrack: navigator.doNotTrack || \"\",\n    referrer: document.referrer,\n    visibilityState: document.visibilityState,\n  };\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n  if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n    try {\n      await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n      let encodedData: BufferSource;\n      if (typeof TextEncoder !== \"undefined\") {\n        encodedData = new TextEncoder().encode(input);\n      } else {\n        const utf8 = unescape(encodeURIComponent(input));\n        const buffer = new Uint8Array(utf8.length);\n        for (let i = 0; i < utf8.length; i++) {\n          buffer[i] = utf8.charCodeAt(i);\n        }\n        encodedData = buffer;\n      }\n\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n      return Array.from(new Uint8Array(hashBuffer))\n        .map((b) => b.toString(16).padStart(2, \"0\"))\n        .join(\"\");\n    } catch {\n      console.warn(\n        \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n      );\n    }\n  }\n\n  let hash = 0;\n  for (let i = 0; i < input.length; i++) {\n    const char = input.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash;\n  }\n\n  const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n  const timestamp = Date.now().toString(16).padStart(12, \"0\");\n  const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n\n  return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\n\nfunction resolvePlayerIdentitySeed(clientInfo: ClientInfo): string {\n  const nativeDeviceId = resolveNativeDeviceId();\n  if (nativeDeviceId) {\n    return `device:${nativeDeviceId}`;\n  }\n\n  const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n  if (persistedId) {\n    return `persisted:${persistedId}`;\n  }\n\n  return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n  if (cachedBrowserId) {\n    return cachedBrowserId;\n  }\n\n  cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n  return cachedBrowserId;\n}\n\ntype PlayerMetricFlags = {\n  adLoaded?: boolean;\n  adDetect?: boolean;\n  captureAt?: string;\n};\n\nfunction canPublish(licenseKey: string | undefined): licenseKey is string {\n  return Boolean(isMQTTEnabled() && licenseKey);\n}\n\nasync function buildPlayerMetricEvent(\n  context: PlayerAnalyticsContext = {},\n  flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n  const clientInfo = getClientInfo();\n\n  const debugAdTiming = !!context.debugAdTiming;\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n  }\n\n  const playerId = await getBrowserID(clientInfo);\n\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n  }\n\n  const captureAt = flags.captureAt ?? new Date().toISOString();\n\n  return {\n    player_id: playerId,\n    device_type: clientInfo.deviceType,\n    os: clientInfo.os.toLowerCase(),\n    ad_loaded: flags.adLoaded ?? false,\n    ad_detect: flags.adDetect ?? false,\n    capture_at: captureAt,\n    ...(context.inputStreamType\n      ? { input_stream_type: context.inputStreamType }\n      : {}),\n  };\n}\n\nfunction publishTracking(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\",\n  body: Record<string, unknown>\n): void {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\n\nexport async function sendInitialTracking(\n  licenseKey?: string,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      adLoaded: false,\n      adDetect: false,\n    });\n\n    publishTracking(licenseKey, \"metrics\", {\n      events: [metricEvent],\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdDetectTracking(\n  licenseKey: string | undefined,\n  adDetectInfo: AdDetectInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adDetect: true,\n      captureAt: adDetectInfo.timestamp,\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdLoadedTracking(\n  licenseKey: string | undefined,\n  adLoadedInfo: AdLoadedInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adLoaded: true,\n      captureAt: adLoadedInfo.timestamp,\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdImpressionTracking(\n  licenseKey: string | undefined,\n  adImpressionInfo: AdImpressionInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      captureAt: adImpressionInfo.timestamp,\n    });\n\n    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(licenseKey, \"impressions\", {\n      events: [\n        {\n          player_id: metricEvent.player_id,\n          ad_played_count: 1,\n          ad_url: adImpressionInfo.adUrl,\n          capture_at: adImpressionInfo.timestamp,\n        },\n      ],\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendHeartbeat(\n  licenseKey?: string,\n  context: PlayerAnalyticsContext = {},\n  flags: PlayerMetricFlags = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const heartbeatData = await buildPlayerMetricEvent(context, flags);\n    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n  } catch (error) {\n    console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n  }\n}\n","export function polyfillURLSearchParams(): void {\n  if (typeof URLSearchParams !== 'undefined') {\n    return;\n  }\n\n  class URLSearchParamsPolyfill {\n    private params: Map<string, string[]>;\n\n    constructor(init?: string | URLSearchParamsPolyfill) {\n      this.params = new Map();\n\n      if (typeof init === 'string') {\n        this.parseQueryString(init);\n      } else if (init instanceof URLSearchParamsPolyfill) {\n        init.forEach((value, key) => {\n          this.append(key, value);\n        });\n      }\n    }\n\n    private parseQueryString(query: string): void {\n      const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n      if (!cleanQuery) return;\n\n      cleanQuery.split('&').forEach((param) => {\n        const [key, value] = param.split('=');\n        if (key) {\n          const decodedKey = this.safeDecodeURIComponent(key);\n          const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n          this.append(decodedKey, decodedValue);\n        }\n      });\n    }\n\n    private safeDecodeURIComponent(str: string): string {\n      try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n      } catch (e) {\n        return str;\n      }\n    }\n\n    append(name: string, value: string): void {\n      const values = this.params.get(name) || [];\n      values.push(String(value));\n      this.params.set(name, values);\n    }\n\n    delete(name: string): void {\n      this.params.delete(name);\n    }\n\n    get(name: string): string | null {\n      const values = this.params.get(name);\n      return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n    }\n\n    getAll(name: string): string[] {\n      return this.params.get(name) || [];\n    }\n\n    has(name: string): boolean {\n      return this.params.has(name);\n    }\n\n    set(name: string, value: string): void {\n      this.params.set(name, [String(value)]);\n    }\n\n    forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          callback(value, key, this);\n        });\n      });\n    }\n\n    toString(): string {\n      const parts: string[] = [];\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n        });\n      });\n      return parts.join('&');\n    }\n  }\n\n  // @ts-ignore\n  window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n  if (typeof TextEncoder !== 'undefined') {\n    return;\n  }\n\n  class TextEncoderPolyfill {\n    encoding = 'utf-8';\n\n    encode(str: string): Uint8Array {\n      const utf8: number[] = [];\n      for (let i = 0; i < str.length; i++) {\n        let charcode = str.charCodeAt(i);\n        if (charcode < 0x80) {\n          utf8.push(charcode);\n        } else if (charcode < 0x800) {\n          utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n        } else if (charcode < 0xd800 || charcode >= 0xe000) {\n          utf8.push(\n            0xe0 | (charcode >> 12),\n            0x80 | ((charcode >> 6) & 0x3f),\n            0x80 | (charcode & 0x3f)\n          );\n        } else {\n          i++;\n          charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n          utf8.push(\n            0xf0 | (charcode >> 18),\n            0x80 | ((charcode >> 12) & 0x3f),\n            0x80 | ((charcode >> 6) & 0x3f),\n            0x80 | (charcode & 0x3f)\n          );\n        }\n      }\n      return new Uint8Array(utf8);\n    }\n  }\n\n  // @ts-ignore\n  window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n  if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n    Promise.prototype.finally = function (callback: () => void) {\n      const constructor = this.constructor as PromiseConstructor;\n      return this.then(\n        (value) => constructor.resolve(callback()).then(() => value),\n        (reason) =>\n          constructor.resolve(callback()).then(() => {\n            throw reason;\n          })\n      );\n    };\n  }\n}\n\nexport function polyfillObjectAssign(): void {\n  if (typeof Object.assign !== 'function') {\n    Object.assign = function (target: any, ...sources: any[]) {\n      if (target == null) {\n        throw new TypeError('Cannot convert undefined or null to object');\n      }\n\n      const to = Object(target);\n\n      for (let i = 0; i < sources.length; i++) {\n        const nextSource = sources[i];\n\n        if (nextSource != null) {\n          for (const nextKey in nextSource) {\n            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n              to[nextKey] = nextSource[nextKey];\n            }\n          }\n        }\n      }\n\n      return to;\n    };\n  }\n}\n\nexport function polyfillArrayFrom(): void {\n  if (!Array.from) {\n    Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n      const items = Object(arrayLike);\n      if (arrayLike == null) {\n        throw new TypeError('Array.from requires an array-like object');\n      }\n\n      const len = items.length >>> 0;\n      const result = new Array(len);\n\n      for (let i = 0; i < len; i++) {\n        if (mapFn) {\n          result[i] = mapFn.call(thisArg, items[i], i);\n        } else {\n          result[i] = items[i];\n        }\n      }\n\n      return result;\n    };\n  }\n}\n\nexport function polyfillStringStartsWith(): void {\n  if (!String.prototype.startsWith) {\n    String.prototype.startsWith = function (search: string, pos?: number) {\n      pos = !pos || pos < 0 ? 0 : +pos;\n      return this.substring(pos, pos + search.length) === search;\n    };\n  }\n}\n\nexport function polyfillStringEndsWith(): void {\n  if (!String.prototype.endsWith) {\n    String.prototype.endsWith = function (search: string, length?: number) {\n      if (length === undefined || length > this.length) {\n        length = this.length;\n      }\n      return this.substring(length - search.length, length) === search;\n    };\n  }\n}\n\nexport function polyfillStringIncludes(): void {\n  if (!String.prototype.includes) {\n    String.prototype.includes = function (search: string, start?: number) {\n      if (typeof start !== 'number') {\n        start = 0;\n      }\n      if (start + search.length > this.length) {\n        return false;\n      }\n      return this.indexOf(search, start) !== -1;\n    };\n  }\n}\n\nexport function initializePolyfills(): void {\n  polyfillObjectAssign();\n  polyfillArrayFrom();\n  polyfillStringStartsWith();\n  polyfillStringEndsWith();\n  polyfillStringIncludes();\n  polyfillURLSearchParams();\n  polyfillTextEncoder();\n  polyfillPromiseFinally();\n}\n\n","import {\n  inferDeviceIdType,\n  isEquivalentDeviceIdType,\n} from \"./vastEnvironmentSignals\";\n\nexport interface VastConsentSignals {\n  gdpr?: string | undefined;\n  gdprConsent?: string | undefined;\n  usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n  correlator: string;\n  streamCorrelator: string;\n  pod?: number | undefined;\n  podMaxAds?: number | undefined;\n  podMinDurationMs?: number | undefined;\n  podMaxDurationMs?: number | undefined;\n  isCtv?: boolean | undefined;\n  contentUrl?: string | undefined;\n  pageUrl?: string | undefined;\n  adWillPlayMuted?: boolean | undefined;\n  adWillAutoPlay?: boolean | undefined;\n  appId?: string | undefined;\n  appName?: string | undefined;\n  sessionId?: string | undefined;\n  deviceId?: string | undefined;\n  deviceIdType?: string | undefined;\n  limitAdTracking?: boolean | undefined;\n  deviceTypeHint?: number | undefined;\n  adTest?: boolean | undefined;\n  consent?: VastConsentSignals | undefined;\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nconst INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nconst EXAMPLE_COM_URL = /example\\.com/i;\nconst CTV_UNSUPPORTED_PARAMS = [\n  \"description_url\",\n  \"tfcd\",\n  \"npa\",\n  \"min_ad_duration\",\n  \"max_ad_duration\",\n  \"unviewed_position_start\",\n  \"impl\",\n  \"vad_type\",\n  \"gdpr\",\n  \"gdpr_consent\",\n  \"us_privacy\",\n];\n\nconst INLINE_DEVICE_MACRO_REPLACEMENTS: Array<{\n  pattern: RegExp;\n  getValue: (ctx: VastMacroContext) => string | undefined;\n}> = [\n  { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) =>\n      ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n  { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) =>\n      ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n  { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n  { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n  { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator },\n];\n\nexport function isMacroPlaceholder(value: string | null | undefined): boolean {\n  if (value == null) return true;\n  const trimmed = value.trim();\n  if (!trimmed) return true;\n  if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n  return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\n\nexport function generateCorrelator(): string {\n  if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n    try {\n      const buf = new Uint32Array(2);\n      crypto.getRandomValues(buf);\n      const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n      if (value > 0) {\n        return String(value);\n      }\n    } catch {\n    }\n  }\n  return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nfunction expandInlineMacroPlaceholders(baseUrl: string, ctx: VastMacroContext): string {\n  let url = baseUrl;\n  for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n    const value = getValue(ctx);\n    if (value != null && value !== \"\") {\n      url = url.replace(pattern, encodeURIComponent(value));\n    }\n  }\n  return url;\n}\n\nfunction applyDeviceIdentityParams(\n  params: URLSearchParams,\n  ctx: VastMacroContext\n): void {\n  const runtimeId = ctx.deviceId?.trim();\n  const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n  const tagRdid = params.get(\"rdid\");\n  const tagType = params.get(\"idtype\");\n  const tagLat = params.get(\"is_lat\");\n  const latValue =\n    ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined;\n\n  if (runtimeId) {\n    params.set(\"rdid\", runtimeId);\n    params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n    params.set(\"is_lat\", latValue ?? (isMacroPlaceholder(tagLat) ? \"0\" : tagLat!));\n    return;\n  }\n\n  const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));\n  const tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));\n\n  if (\n    tagRdidValid &&\n    tagTypeValid &&\n    runtimeType &&\n    !isEquivalentDeviceIdType(tagType!, runtimeType)\n  ) {\n    params.delete(\"rdid\");\n    params.delete(\"idtype\");\n    params.delete(\"is_lat\");\n    return;\n  }\n\n  if (tagRdidValid) {\n    if (isMacroPlaceholder(tagType) && runtimeType) {\n      params.set(\"idtype\", runtimeType);\n    }\n    if (isMacroPlaceholder(tagLat)) {\n      params.set(\"is_lat\", latValue ?? \"0\");\n    }\n    return;\n  }\n\n  params.delete(\"rdid\");\n  params.delete(\"idtype\");\n  params.delete(\"is_lat\");\n}\n\nfunction removeBrokenAppNameOrphans(\n  params: URLSearchParams,\n  appName?: string\n): void {\n  const toDelete: string[] = [];\n\n  params.forEach((_value, key) => {\n    if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n      toDelete.push(key);\n    }\n  });\n\n  if (appName && appName.includes(\"&\")) {\n    for (const suffix of appName.split(\"&\").slice(1)) {\n      const trimmed = suffix.trimStart();\n      if (!trimmed) continue;\n      toDelete.push(suffix, ` ${trimmed}`, trimmed);\n    }\n  }\n\n  for (const key of new Set(toDelete)) {\n    if (key) params.delete(key);\n  }\n}\n\nexport function normalizeVastTagUrl(raw: string): string {\n  if (!raw) return raw;\n\n  try {\n    const url = new URL(raw);\n\n    const anValue = url.searchParams.get(\"an\");\n    if (anValue !== null) {\n      const orphanFragments: string[] = [];\n      url.searchParams.forEach((_value, key) => {\n        if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n          orphanFragments.push(key.trim());\n        }\n      });\n      if (orphanFragments.length > 0) {\n        const reconstructed = [anValue.trimEnd(), ...orphanFragments]\n          .filter(Boolean)\n          .join(\" & \");\n\n        url.searchParams.forEach((_value, key) => {\n          if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n            url.searchParams.delete(key);\n          }\n        });\n        url.searchParams.set(\"an\", reconstructed);\n\n        return url.toString().replace(\n          /([?&]an=)([^&]*)/,\n          (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n        );\n      }\n    }\n\n    removeBrokenAppNameOrphans(url.searchParams);\n    return url.toString();\n  } catch {\n    return raw;\n  }\n}\n\nexport function applyVastMacros(\n  baseUrl: string,\n  ctx: VastMacroContext\n): string {\n  const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n  let url: URL;\n  try {\n    url = new URL(normalizeVastTagUrl(expandedUrl));\n  } catch {\n    return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n  }\n\n  const params = url.searchParams;\n\n  removeBrokenAppNameOrphans(params, ctx.appName);\n\n  params.set(\"correlator\", ctx.correlator);\n  params.set(\"scor\", ctx.streamCorrelator);\n  if (ctx.isCtv) {\n    for (const key of CTV_UNSUPPORTED_PARAMS) {\n      params.delete(key);\n    }\n  }\n\n  if (ctx.pod != null) {\n    params.set(\"pod\", String(ctx.pod));\n  }\n\n  params.delete(\"ppos\");\n  params.delete(\"lip\");\n  if (ctx.podMinDurationMs != null) {\n    params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n  }\n  if (ctx.podMaxDurationMs != null) {\n    params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n  }\n  if (ctx.podMaxAds != null) {\n    params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n  }\n\n  const requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\n    const existingUrl = params.get(\"url\") || \"\";\n    if (EXAMPLE_COM_URL.test(existingUrl)) {\n      params.delete(\"url\");\n      params.delete(\"description_url\");\n    }\n  }\n\n  if (ctx.adWillPlayMuted != null) {\n    params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n  }\n  if (ctx.adWillAutoPlay != null) {\n    params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n  }\n\n  if (ctx.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\n  }\n  if (ctx.sessionId) {\n    params.set(\"sid\", ctx.sessionId);\n  }\n  if (ctx.deviceTypeHint != null) {\n    params.set(\"dth\", String(ctx.deviceTypeHint));\n  } else if (ctx.isCtv) {\n    params.set(\"dth\", \"5\");\n  }\n\n  applyDeviceIdentityParams(params, ctx);\n\n  if (!ctx.isCtv) {\n    const consent = ctx.consent;\n    if (consent?.gdpr != null) {\n      params.set(\"gdpr\", consent.gdpr);\n    }\n    if (consent?.gdprConsent != null) {\n      params.set(\"gdpr_consent\", consent.gdprConsent);\n    }\n    if (consent?.usPrivacy != null) {\n      params.set(\"us_privacy\", consent.usPrivacy);\n    }\n  }\n\n  if (ctx.adTest) {\n    params.set(\"adtest\", \"on\");\n  }\n\n  const staleKeys: string[] = [];\n  params.forEach((value, key) => {\n    if (isMacroPlaceholder(value)) {\n      staleKeys.push(key);\n    }\n  });\n  for (const key of staleKeys) {\n    params.delete(key);\n  }\n\n  removeBrokenAppNameOrphans(params, ctx.appName);\n\n  return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n  const correlatorRegex = /([?&])correlator=([^&]*)/;\n  if (correlatorRegex.test(baseUrl)) {\n    return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n  }\n  const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n  return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n  timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n  const signals: VastConsentSignals = {};\n  if (typeof window === \"undefined\") {\n    return Promise.resolve(signals);\n  }\n\n  const tasks: Promise<void>[] = [];\n\n  const tcfApi = (window as any).__tcfapi;\n  if (typeof tcfApi === \"function\") {\n    tasks.push(\n      new Promise<void>((resolve) => {\n        let settled = false;\n        try {\n          tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n            if (settled) return;\n            if (\n              success &&\n              tcData &&\n              (tcData.eventStatus === \"tcloaded\" ||\n                tcData.eventStatus === \"useractioncomplete\")\n            ) {\n              settled = true;\n              signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n              if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n                signals.gdprConsent = tcData.tcString;\n              }\n              try {\n                tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n              } catch {}\n              resolve();\n            }\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(() => {\n          if (!settled) {\n            settled = true;\n            resolve();\n          }\n        }, timeoutMs);\n      })\n    );\n  }\n\n  const uspApi = (window as any).__uspapi;\n  if (typeof uspApi === \"function\") {\n    tasks.push(\n      new Promise<void>((resolve) => {\n        try {\n          uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n            if (success && typeof data?.uspString === \"string\" && data.uspString) {\n              signals.usPrivacy = data.uspString;\n            }\n            resolve();\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(resolve, timeoutMs);\n      })\n    );\n  }\n\n  if (tasks.length === 0) {\n    return Promise.resolve(signals);\n  }\n\n  return Promise.all(tasks).then(() => signals);\n}\n","interface NavigatorUAData {\n  platform?: string;\n  brands?: Array<{ brand: string; version: string }>;\n  mobile?: boolean;\n}\n\ndeclare global {\n  interface Navigator {\n    userAgentData?: NavigatorUAData;\n  }\n}\n\nexport interface BrowserInfo {\n  name: string;\n  version: string;\n  majorVersion: number;\n  isSmartTV: boolean;\n  isLegacyTV: boolean;\n  platform: string;\n  supportsModernJS: boolean;\n  webOSVersion?: number | undefined;\n  tizenVersion?: number | undefined;\n  chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n  const match = ua.match(/Chrome\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n  const match = ua.match(/AppleWebKit\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n  if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n    return navigator.userAgentData.platform;\n  }\n\n  const ua = navigator.userAgent;\n  if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n    return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n  }\n  if (/Win/i.test(ua)) {\n    return 'Win32';\n  }\n  if (/Linux/i.test(ua)) {\n    return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n  }\n  if (/CrOS/i.test(ua)) {\n    return 'CrOS';\n  }\n\n  // eslint-disable-next-line deprecation/deprecation\n  return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n  const ua = navigator.userAgent;\n  const platform = getPlatform();\n\n  let name = 'Unknown';\n  let version = '0';\n  let majorVersion = 0;\n  let isSmartTV = false;\n  let isLegacyTV = false;\n  let supportsModernJS = true;\n  let webOSVersion: number | undefined;\n  let tizenVersion: number | undefined;\n  let chromeVersionNum: number | undefined;\n\n  const chromeVersion = getChromeVersion(ua);\n  const webkitVersion = getWebKitVersion(ua);\n  chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n  if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n    name = 'LG WebOS';\n    isSmartTV = true;\n\n    let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n\n    if (!match || !match[1]) {\n      match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n    }\n\n    if (match && match[1]) {\n      version = match[1];\n      const parts = version.split('.');\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      webOSVersion = majorVersion;\n    } else if (chromeVersion > 0) {\n      if (chromeVersion >= 79) {\n        webOSVersion = 6;\n        version = '6.0';\n        majorVersion = 6;\n      } else if (chromeVersion >= 68) {\n        webOSVersion = 5;\n        version = '5.0';\n        majorVersion = 5;\n      } else if (chromeVersion >= 53) {\n        webOSVersion = 4;\n        version = '4.0';\n        majorVersion = 4;\n      } else if (chromeVersion >= 38) {\n        webOSVersion = 3;\n        version = '3.0';\n        majorVersion = 3;\n      } else {\n        webOSVersion = 2;\n        version = '2.0';\n        majorVersion = 2;\n      }\n    } else {\n      version = 'Unknown';\n      webOSVersion = undefined;\n    }\n\n    isLegacyTV = webOSVersion !== undefined && webOSVersion < 3;\n  } else if (/Tizen/i.test(ua)) {\n    name = 'Samsung Tizen';\n    isSmartTV = true;\n    const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n    version = match && match[1] ? match[1] : 'Unknown';\n    if (version !== 'Unknown') {\n      const parts = version.split('.');\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      tizenVersion = majorVersion;\n    }\n\n    isLegacyTV = tizenVersion !== undefined && tizenVersion < 3;\n  } else if (/SMART-TV|SmartTV/i.test(ua)) {\n    name = 'Smart TV';\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else if (/NetCast/i.test(ua)) {\n    name = 'LG NetCast';\n    isSmartTV = true;\n    isLegacyTV = true;\n  } else if (/BRAVIA/i.test(ua)) {\n    name = 'Sony BRAVIA';\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else {\n    if (chromeVersion > 0) {\n      name = 'Chrome';\n      version = chromeVersion.toString();\n      majorVersion = chromeVersion;\n\n      if (chromeVersion < 50) {\n        supportsModernJS = false;\n      }\n    }\n\n    if (webkitVersion > 0 && webkitVersion < 600) {\n      supportsModernJS = false;\n    }\n  }\n\n  if (typeof Promise === 'undefined' ||\n      typeof Map === 'undefined' ||\n      typeof Set === 'undefined') {\n    supportsModernJS = false;\n  }\n\n  if (typeof URLSearchParams === 'undefined') {\n    supportsModernJS = false;\n  }\n\n  return {\n    name,\n    version,\n    majorVersion,\n    isSmartTV,\n    isLegacyTV,\n    platform,\n    supportsModernJS,\n    webOSVersion,\n    tizenVersion,\n    chromeVersion: chromeVersionNum,\n  };\n}\n\nexport function getBrowserConfigOverrides(): {\n  allowNativeHls?: boolean;\n} {\n  const browser = detectBrowser();\n  const overrides: { allowNativeHls?: boolean } = {};\n\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = true;\n  }\n\n  return overrides;\n}\n\nexport function supportsModernJS(): boolean {\n  try {\n    return (\n      typeof Promise !== 'undefined' &&\n      typeof Map !== 'undefined' &&\n      typeof Set !== 'undefined' &&\n      typeof Array.from !== 'undefined' &&\n      typeof Object.assign !== 'undefined' &&\n      typeof Array.prototype.forEach !== 'undefined' &&\n      typeof String.prototype.includes !== 'undefined'\n    );\n  } catch (e) {\n    return false;\n  }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n  if (!debug) return;\n\n  const browser = detectBrowser();\n\n  console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n    browser: `${browser.name} ${browser.version}`,\n    platform: browser.platform,\n    isSmartTV: browser.isSmartTV,\n    isLegacyTV: browser.isLegacyTV,\n    supportsModernJS: browser.supportsModernJS,\n    ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n    ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n    ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n    userAgent: navigator.userAgent,\n  });\n}\n\nexport function supportsFeature(feature: string): boolean {\n  switch (feature) {\n    case 'urlsearchparams':\n      return typeof URLSearchParams !== 'undefined';\n    case 'textencoder':\n      return typeof TextEncoder !== 'undefined';\n    case 'promises':\n      return typeof Promise !== 'undefined';\n    case 'fetch':\n      return typeof fetch !== 'undefined';\n    case 'crypto':\n      return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n    default:\n      return false;\n  }\n}\n","import type { Scte35Marker, Id3TagInfo } from \"../types\";\n\nexport function parseCueOutDuration(value: string): number | undefined {\n  const num = parseFloat(value.trim());\n  if (!Number.isNaN(num)) return num;\n  const match =\n    value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) ||\n    value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (match && match[1] != null) {\n    const dStr = match[1];\n    const d = parseFloat(dStr);\n    return Number.isNaN(d) ? undefined : d;\n  }\n  return undefined;\n}\n\nexport function parseCueOutCont(\n  value: string\n): { elapsed?: number; duration?: number } | undefined {\n  const res: { elapsed?: number; duration?: number } = {};\n\n  const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n  const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (elapsedMatch && elapsedMatch[1] != null) {\n    const e = parseFloat(elapsedMatch[1]);\n    if (!Number.isNaN(e)) res.elapsed = e;\n  }\n  if (durationMatch && durationMatch[1] != null) {\n    const d = parseFloat(durationMatch[1]);\n    if (!Number.isNaN(d)) res.duration = d;\n  }\n\n  if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n    const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n    if (slashMatch && slashMatch[1] && slashMatch[2]) {\n      const elapsed = parseFloat(slashMatch[1]);\n      const duration = parseFloat(slashMatch[2]);\n      if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n      if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n    }\n  }\n\n  if (\"elapsed\" in res || \"duration\" in res) return res;\n  return undefined;\n}\n\nexport function parseAttributeList(value: string): Record<string, string> {\n  const attrs: Record<string, string> = {};\n  const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n  let match: RegExpExecArray | null;\n  while ((match = regex.exec(value)) !== null) {\n    const key: string = (match[1] ?? \"\") as string;\n    let rawVal: string = (match[3] ?? match[4] ?? \"\") as string;\n    if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n      rawVal = rawVal.slice(1, -1);\n    }\n    if (key) {\n      attrs[key] = rawVal;\n    }\n  }\n  return attrs;\n}\n\nexport function toNumber(val: unknown): number | undefined {\n  if (val == null) return undefined;\n  const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n  return Number.isNaN(n) ? undefined : n;\n}\n\nexport function isManifestBasedMarker(marker: Scte35Marker): boolean {\n  const raw = marker.raw as any;\n  if (!raw) return false;\n\n  if (raw.tag) {\n    const tag = String(raw.tag);\n    return (\n      tag.includes(\"EXT-X-CUE-OUT\") ||\n      tag.includes(\"EXT-X-CUE-IN\") ||\n      tag.includes(\"EXT-X-DATERANGE\")\n    );\n  }\n\n  if (raw.id3) return false;\n\n  if (raw.splice_command_type) return false;\n\n  return false;\n}\n\nexport function decodeId3ValueToText(value: string | Uint8Array): string | undefined {\n  try {\n    if (typeof value === \"string\") return value;\n    const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n    const text = decoder.decode(value);\n    if (text && /[\\x20-\\x7E]/.test(text)) return text;\n    let out = \"\";\n    for (let i = 0; i < value.length; i++)\n      out += String.fromCharCode(value[i]!);\n    return out;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function getFragmentStartSeconds(frag: any): number | undefined {\n  const candidates = [frag?.start, frag?.startPTS];\n  for (const candidate of candidates) {\n    if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n      return candidate;\n    }\n  }\n  return undefined;\n}\n\nexport function parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n  const text = decodeId3ValueToText(tag.value);\n  if (!text) return undefined;\n\n  const cueOutMatch =\n    text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) ||\n    text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n  if (cueOutMatch) {\n    const arg = (cueOutMatch[1] ?? \"\").trim();\n    const dur = parseCueOutDuration(arg);\n    const marker: Scte35Marker = {\n      type: \"start\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      ...(dur !== undefined ? { durationSeconds: dur } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n  if (cueOutContMatch) {\n    const arg = (cueOutContMatch[1] ?? \"\").trim();\n    const cont = parseCueOutCont(arg);\n    const marker: Scte35Marker = {\n      type: \"progress\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      ...(cont?.duration !== undefined\n        ? { durationSeconds: cont.duration }\n        : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n  if (cueInMatch) {\n    const marker: Scte35Marker = {\n      type: \"end\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n  if (daterangeMatch) {\n    const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n    const hasScteOut =\n      \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n    const hasScteIn =\n      \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n    const klass = String(attrs[\"CLASS\"] ?? \"\");\n    const duration = toNumber(attrs[\"DURATION\"]);\n    if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n      const marker: Scte35Marker = {\n        type: \"start\",\n        ...(tag.ptsSeconds !== undefined\n          ? { ptsSeconds: tag.ptsSeconds }\n          : {}),\n        ...(duration !== undefined ? { durationSeconds: duration } : {}),\n        raw: { id3: text, attrs },\n      } as Scte35Marker;\n      return marker;\n    }\n    if (hasScteIn) {\n      const marker: Scte35Marker = {\n        type: \"end\",\n        ...(tag.ptsSeconds !== undefined\n          ? { ptsSeconds: tag.ptsSeconds }\n          : {}),\n        raw: { id3: text, attrs },\n      } as Scte35Marker;\n      return marker;\n    }\n  }\n\n  if (/SCTE35-OUT/i.test(text)) {\n    const marker: Scte35Marker = {\n      type: \"start\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n  if (/SCTE35-IN/i.test(text)) {\n    const marker: Scte35Marker = {\n      type: \"end\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  if (tag.value instanceof Uint8Array) {\n    const bin = parseScte35Binary(tag.value);\n    if (bin) return bin;\n  }\n\n  return undefined;\n}\n\nexport function normalizeFragmentPayload(payload: unknown): Uint8Array | undefined {\n  if (payload instanceof Uint8Array) {\n    return payload;\n  }\n  if (payload instanceof ArrayBuffer) {\n    return new Uint8Array(payload);\n  }\n  if (ArrayBuffer.isView(payload)) {\n    const view = payload as ArrayBufferView;\n    return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n  }\n  return undefined;\n}\n\n// --- Transport Stream SCTE-35 parsing ---\n\nexport function detectTsPacketFormat(\n  data: Uint8Array\n): { offset: number; packetSize: number; tsPayloadOffset: number } | undefined {\n  const packetSizes = [188, 192, 204];\n  for (const packetSize of packetSizes) {\n    const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n    for (let offset = 0; offset < packetSize; offset++) {\n      let matchedPackets = 0;\n      for (\n        let packetStart = offset;\n        packetStart + tsPayloadOffset < data.length &&\n        matchedPackets < 5;\n        packetStart += packetSize\n      ) {\n        if (data[packetStart + tsPayloadOffset] !== 0x47) {\n          break;\n        }\n        matchedPackets++;\n      }\n      if (matchedPackets >= 2) {\n        return { offset, packetSize, tsPayloadOffset };\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction getPsiSectionStart(\n  payload: Uint8Array,\n  payloadUnitStart: boolean\n): number | undefined {\n  if (!payloadUnitStart) {\n    return undefined;\n  }\n  const pointerField = payload[0];\n  if (pointerField == null) {\n    return undefined;\n  }\n  const sectionStart = 1 + pointerField;\n  return sectionStart < payload.length ? sectionStart : undefined;\n}\n\nfunction getPsiSectionLength(data: Uint8Array, offset: number): number {\n  return (((data[offset + 1] ?? 0) & 0x0f) << 8) | (data[offset + 2] ?? 0);\n}\n\nfunction parsePatSection(\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  pmtPids: Set<number>\n): void {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 8 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0x00) {\n    return;\n  }\n\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n\n  for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n    const programNumber =\n      ((payload[offset] ?? 0) << 8) | (payload[offset + 1] ?? 0);\n    const pid =\n      (((payload[offset + 2] ?? 0) & 0x1f) << 8) |\n      (payload[offset + 3] ?? 0);\n    if (programNumber !== 0) {\n      pmtPids.add(pid);\n    }\n  }\n}\n\nfunction descriptorsIdentifyScte35(\n  data: Uint8Array,\n  start: number,\n  end: number\n): boolean {\n  let offset = start;\n  while (offset + 2 <= end) {\n    const tag = data[offset] ?? 0;\n    const length = data[offset + 1] ?? 0;\n    const descriptorStart = offset + 2;\n    const descriptorEnd = descriptorStart + length;\n    if (descriptorEnd > end) {\n      return false;\n    }\n\n    const registration =\n      length >= 4\n        ? String.fromCharCode(\n            data[descriptorStart] ?? 0,\n            data[descriptorStart + 1] ?? 0,\n            data[descriptorStart + 2] ?? 0,\n            data[descriptorStart + 3] ?? 0\n          )\n        : \"\";\n    if (tag === 0x8a || registration === \"CUEI\" || registration === \"SCTE\") {\n      return true;\n    }\n\n    offset = descriptorEnd;\n  }\n  return false;\n}\n\nfunction parsePmtSection(\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  tsScte35Pids: Set<number>\n): void {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 12 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0x02) {\n    return;\n  }\n\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  const programInfoLength =\n    (((payload[sectionStart + 10] ?? 0) & 0x0f) << 8) |\n    (payload[sectionStart + 11] ?? 0);\n\n  let offset = sectionStart + 12 + programInfoLength;\n  while (offset + 5 <= sectionEnd - 4) {\n    const streamType = payload[offset] ?? 0;\n    const elementaryPid =\n      (((payload[offset + 1] ?? 0) & 0x1f) << 8) |\n      (payload[offset + 2] ?? 0);\n    const esInfoLength =\n      (((payload[offset + 3] ?? 0) & 0x0f) << 8) |\n      (payload[offset + 4] ?? 0);\n    const descriptorStart = offset + 5;\n    const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n\n    if (\n      streamType === 0x86 ||\n      (streamType === 0x06 &&\n        descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd))\n    ) {\n      tsScte35Pids.add(elementaryPid);\n    }\n\n    offset = descriptorStart + esInfoLength;\n  }\n}\n\nfunction hasProcessedTsScte35Section(\n  section: Uint8Array,\n  processedSections: Set<string>\n): boolean {\n  let checksum = 0;\n  for (let i = 0; i < section.length; i++) {\n    checksum = (checksum * 31 + (section[i] ?? 0)) >>> 0;\n  }\n\n  const key = `${section.length}:${checksum}`;\n  if (processedSections.has(key)) {\n    return true;\n  }\n\n  processedSections.add(key);\n  if (processedSections.size > 200) {\n    const firstKey = processedSections.values().next().value;\n    if (firstKey) {\n      processedSections.delete(firstKey);\n    }\n  }\n  return false;\n}\n\nfunction addScte35SectionMarker(\n  section: Uint8Array,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  if (section[0] !== 0xfc || hasProcessedTsScte35Section(section, processedSections)) {\n    return;\n  }\n\n  const marker = parseScte35Binary(section);\n  if (!marker) {\n    return;\n  }\n\n  marker.raw = {\n    ...(typeof marker.raw === \"object\" && marker.raw ? marker.raw : {}),\n    source: \"ts-packet\",\n  };\n  markers.push(marker);\n}\n\nfunction appendScte35Bytes(\n  pid: number,\n  bytes: Uint8Array,\n  assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  const assembler = assemblers.get(pid);\n  if (!assembler) {\n    return;\n  }\n\n  for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n    assembler.bytes.push(bytes[i] ?? 0);\n  }\n\n  if (assembler.bytes.length >= assembler.expectedLength) {\n    assemblers.delete(pid);\n    addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n  }\n}\n\nfunction collectScte35SectionsFromPayload(\n  pid: number,\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  if (payload.length === 0) {\n    return;\n  }\n\n  let offset = 0;\n  if (payloadUnitStart) {\n    const pointerField = payload[0] ?? 0;\n    const previousAssembler = assemblers.get(pid);\n    if (previousAssembler && pointerField > 0) {\n      appendScte35Bytes(\n        pid,\n        payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n        assemblers,\n        markers,\n        processedSections\n      );\n    }\n    assemblers.delete(pid);\n    offset = 1 + pointerField;\n  } else {\n    appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n    return;\n  }\n\n  while (offset + 3 <= payload.length) {\n    const tableId = payload[offset];\n    if (tableId == null || tableId === 0xff) {\n      return;\n    }\n\n    const sectionLength = getPsiSectionLength(payload, offset);\n    const totalLength = 3 + sectionLength;\n    if (sectionLength <= 0 || totalLength <= 3) {\n      return;\n    }\n\n    if (offset + totalLength <= payload.length) {\n      addScte35SectionMarker(\n        payload.subarray(offset, offset + totalLength),\n        markers,\n        processedSections\n      );\n      offset += totalLength;\n    } else {\n      assemblers.set(pid, {\n        bytes: Array.from(payload.subarray(offset)),\n        expectedLength: totalLength,\n      });\n      return;\n    }\n  }\n}\n\nexport function parseScte35FromTsPackets(\n  data: Uint8Array,\n  tsScte35Pids: Set<number>,\n  pmtPids: Set<number>,\n  processedSections: Set<string>\n): Scte35Marker[] {\n  const packetInfo = detectTsPacketFormat(data);\n  if (!packetInfo) {\n    return [];\n  }\n\n  const markers: Scte35Marker[] = [];\n  const sectionAssemblers = new Map<\n    number,\n    { bytes: number[]; expectedLength: number }\n  >();\n\n  for (\n    let packetStart = packetInfo.offset;\n    packetStart + packetInfo.packetSize <= data.length;\n    packetStart += packetInfo.packetSize\n  ) {\n    const tsStart = packetStart + packetInfo.tsPayloadOffset;\n    if (data[tsStart] !== 0x47) {\n      continue;\n    }\n\n    const secondByte = data[tsStart + 1];\n    const thirdByte = data[tsStart + 2];\n    const fourthByte = data[tsStart + 3];\n    if (\n      secondByte == null ||\n      thirdByte == null ||\n      fourthByte == null ||\n      (secondByte & 0x80) !== 0\n    ) {\n      continue;\n    }\n\n    const payloadUnitStart = (secondByte & 0x40) !== 0;\n    const pid = ((secondByte & 0x1f) << 8) | thirdByte;\n    const adaptationFieldControl = (fourthByte >> 4) & 0x03;\n    const hasPayload =\n      adaptationFieldControl === 1 || adaptationFieldControl === 3;\n    if (!hasPayload) {\n      continue;\n    }\n\n    let payloadStart = tsStart + 4;\n    if (adaptationFieldControl === 3) {\n      const adaptationLength = data[payloadStart];\n      if (adaptationLength == null) {\n        continue;\n      }\n      payloadStart += 1 + adaptationLength;\n    }\n\n    const payloadEnd = Math.min(tsStart + 188, data.length);\n    if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n      continue;\n    }\n\n    const payload = data.subarray(payloadStart, payloadEnd);\n    if (pid === 0) {\n      parsePatSection(payload, payloadUnitStart, pmtPids);\n    } else if (pmtPids.has(pid)) {\n      parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n    } else if (tsScte35Pids.has(pid)) {\n      collectScte35SectionsFromPayload(\n        pid,\n        payload,\n        payloadUnitStart,\n        sectionAssemblers,\n        markers,\n        processedSections\n      );\n    }\n  }\n\n  return markers;\n}\n\n// --- Binary SCTE-35 parsing ---\n\nclass BitReader {\n  private bytePos = 0;\n  private bitPos = 0;\n  constructor(private readonly buf: Uint8Array) {}\n  readBits(numBits: number): number {\n    let result = 0;\n    while (numBits > 0) {\n      if (this.bytePos >= this.buf.length) return result;\n      const remainingInByte = 8 - this.bitPos;\n      const toRead = Math.min(numBits, remainingInByte);\n      const currentByte = this.buf[this.bytePos]!;\n      const shift = remainingInByte - toRead;\n      const mask = ((1 << toRead) - 1) & 0xff;\n      const bits = (currentByte >> shift) & mask;\n      result = (result << toRead) | bits;\n      this.bitPos += toRead;\n      if (this.bitPos >= 8) {\n        this.bitPos = 0;\n        this.bytePos += 1;\n      }\n      numBits -= toRead;\n    }\n    return result >>> 0;\n  }\n  skipBits(n: number): void {\n    this.readBits(n);\n  }\n  get bytePosition(): number {\n    return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n  }\n}\n\nfunction readSpliceTime(\n  r: BitReader,\n  ptsAdjustmentTicks: number\n): number | undefined {\n  const timeSpecifiedFlag = r.readBits(1) === 1;\n  if (!timeSpecifiedFlag) {\n    r.readBits(7);\n    return undefined;\n  }\n  r.readBits(6);\n  const high = r.readBits(1);\n  const low = r.readBits(32);\n  const ptsTicks =\n    (high * 0x100000000 + low + ptsAdjustmentTicks) % 0x200000000;\n  return ptsTicks / 90000;\n}\n\nfunction markerTypeFromSegmentationTypeId(\n  segmentationTypeId: number\n): Scte35Marker[\"type\"] | undefined {\n  switch (segmentationTypeId) {\n    case 0x10:\n    case 0x22:\n    case 0x30:\n    case 0x32:\n    case 0x34:\n    case 0x36:\n      return \"start\";\n    case 0x11:\n    case 0x23:\n    case 0x31:\n    case 0x33:\n    case 0x35:\n    case 0x37:\n      return \"end\";\n    default:\n      return undefined;\n  }\n}\n\nfunction parseScte35SegmentationDescriptor(\n  descriptor: Uint8Array\n):\n  | {\n      type: Scte35Marker[\"type\"];\n      durationSeconds?: number;\n      segmentationEventId?: number;\n    }\n  | undefined {\n  if (descriptor.length < 11) {\n    return undefined;\n  }\n\n  const identifier = String.fromCharCode(\n    descriptor[0] ?? 0,\n    descriptor[1] ?? 0,\n    descriptor[2] ?? 0,\n    descriptor[3] ?? 0\n  );\n  if (identifier !== \"CUEI\") {\n    return undefined;\n  }\n\n  const segmentationEventId =\n    ((descriptor[4] ?? 0) * 0x1000000) +\n    ((descriptor[5] ?? 0) << 16) +\n    ((descriptor[6] ?? 0) << 8) +\n    (descriptor[7] ?? 0);\n  const cancelIndicator = ((descriptor[8] ?? 0) & 0x80) !== 0;\n  if (cancelIndicator) {\n    return undefined;\n  }\n\n  const flags = descriptor[9] ?? 0;\n  const programSegmentationFlag = (flags & 0x80) !== 0;\n  const segmentationDurationFlag = (flags & 0x40) !== 0;\n  let offset = 10;\n\n  if (!programSegmentationFlag) {\n    const componentCount = descriptor[offset] ?? 0;\n    offset += 1 + componentCount * 6;\n    if (offset > descriptor.length) {\n      return undefined;\n    }\n  }\n\n  let durationSeconds: number | undefined = undefined;\n  if (segmentationDurationFlag) {\n    if (offset + 5 > descriptor.length) {\n      return undefined;\n    }\n    const durationTicks =\n      ((descriptor[offset] ?? 0) * 0x100000000) +\n      ((descriptor[offset + 1] ?? 0) * 0x1000000) +\n      ((descriptor[offset + 2] ?? 0) << 16) +\n      ((descriptor[offset + 3] ?? 0) << 8) +\n      (descriptor[offset + 4] ?? 0);\n    durationSeconds = durationTicks / 90000;\n    offset += 5;\n  }\n\n  if (offset + 2 > descriptor.length) {\n    return undefined;\n  }\n  offset += 1;\n  const segmentationUpidLength = descriptor[offset] ?? 0;\n  offset += 1 + segmentationUpidLength;\n  if (offset >= descriptor.length) {\n    return undefined;\n  }\n\n  const segmentationTypeId = descriptor[offset] ?? 0;\n  const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n  if (!markerType) {\n    return undefined;\n  }\n\n  return {\n    type: markerType,\n    ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n    segmentationEventId,\n  };\n}\n\nfunction parseScte35SegmentationDescriptors(\n  data: Uint8Array,\n  offset: number\n):\n  | {\n      type: Scte35Marker[\"type\"];\n      durationSeconds?: number;\n      segmentationEventId?: number;\n    }\n  | undefined {\n  if (offset + 2 > data.length) {\n    return undefined;\n  }\n\n  const descriptorLoopLength =\n    ((data[offset] ?? 0) << 8) | (data[offset + 1] ?? 0);\n  let descriptorOffset = offset + 2;\n  const descriptorEnd = Math.min(\n    data.length,\n    descriptorOffset + descriptorLoopLength\n  );\n\n  while (descriptorOffset + 2 <= descriptorEnd) {\n    const descriptorTag = data[descriptorOffset] ?? 0;\n    const descriptorLength = data[descriptorOffset + 1] ?? 0;\n    const descriptorDataStart = descriptorOffset + 2;\n    const descriptorDataEnd = descriptorDataStart + descriptorLength;\n    if (descriptorDataEnd > descriptorEnd) {\n      return undefined;\n    }\n\n    if (descriptorTag === 0x02) {\n      const descriptorMarker = parseScte35SegmentationDescriptor(\n        data.subarray(descriptorDataStart, descriptorDataEnd)\n      );\n      if (descriptorMarker) {\n        return descriptorMarker;\n      }\n    }\n\n    descriptorOffset = descriptorDataEnd;\n  }\n\n  return undefined;\n}\n\nexport function parseScte35Binary(data: Uint8Array): Scte35Marker | undefined {\n  const r = new BitReader(data);\n  const tableId = r.readBits(8);\n  if (tableId !== 0xfc) return undefined;\n  r.readBits(1);\n  r.readBits(1);\n  r.readBits(2);\n  const sectionLength = r.readBits(12);\n  if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n    return undefined;\n  }\n  r.readBits(8);\n  r.readBits(1);\n  r.readBits(6);\n  const ptsAdjHigh = r.readBits(1);\n  const ptsAdjLow = r.readBits(32);\n  const ptsAdjustmentTicks = ptsAdjHigh * 0x100000000 + ptsAdjLow;\n  r.readBits(8);\n  r.readBits(12);\n  const spliceCommandLength = r.readBits(12);\n  const spliceCommandType = r.readBits(8);\n\n  let markerType: Scte35Marker[\"type\"] | undefined;\n  let durationSeconds: number | undefined = undefined;\n  let ptsSeconds: number | undefined = undefined;\n  let spliceEventId: number | undefined = undefined;\n  const commandBodyStart = r.bytePosition;\n\n  if (spliceCommandType === 5) {\n    spliceEventId = r.readBits(32);\n    const cancel = r.readBits(1) === 1;\n    r.readBits(7);\n    if (cancel) return undefined;\n    const outOfNetwork = r.readBits(1) === 1;\n    const programSpliceFlag = r.readBits(1) === 1;\n    const durationFlag = r.readBits(1) === 1;\n    const spliceImmediateFlag = r.readBits(1) === 1;\n    r.readBits(4);\n    markerType = outOfNetwork ? \"start\" : \"end\";\n\n    if (programSpliceFlag && !spliceImmediateFlag) {\n      ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n    } else if (!programSpliceFlag) {\n      const componentCount = r.readBits(8);\n      for (let i = 0; i < componentCount; i++) {\n        r.readBits(8);\n        if (!spliceImmediateFlag) {\n          const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n          if (ptsSeconds === undefined) {\n            ptsSeconds = componentPtsSeconds;\n          }\n        }\n      }\n    }\n\n    if (durationFlag) {\n      r.readBits(6);\n      r.readBits(1);\n      const high = r.readBits(1);\n      const low = r.readBits(32);\n      const durationTicks = high * 0x100000000 + low;\n      durationSeconds = durationTicks / 90000;\n    }\n    r.readBits(16);\n    r.readBits(8);\n    r.readBits(8);\n  } else if (spliceCommandType === 6) {\n    ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n  } else {\n    return undefined;\n  }\n\n  const expectedDescriptorOffset =\n    spliceCommandLength === 0x0fff\n      ? r.bytePosition\n      : commandBodyStart + spliceCommandLength;\n  const descriptorMarker = parseScte35SegmentationDescriptors(\n    data,\n    expectedDescriptorOffset\n  );\n\n  if (descriptorMarker) {\n    markerType = descriptorMarker.type;\n    if (durationSeconds === undefined) {\n      durationSeconds = descriptorMarker.durationSeconds;\n    }\n  }\n\n  if (!markerType) {\n    return undefined;\n  }\n\n  const marker: Scte35Marker = {\n    type: markerType,\n    ...(ptsSeconds !== undefined ? { ptsSeconds } : {}),\n    ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n    raw: {\n      splice_command_type: spliceCommandType,\n      ...(spliceEventId !== undefined ? { splice_event_id: spliceEventId } : {}),\n      ...(descriptorMarker?.segmentationEventId !== undefined\n        ? { segmentation_event_id: descriptorMarker.segmentationEventId }\n        : {}),\n    },\n  } as Scte35Marker;\n  return marker;\n}\n","import type { Scte35Marker } from \"../types\";\nimport type {\n  NormalizedScte35Cue,\n  Scte35CueContext,\n  Scte35CueSource,\n  Scte35CueReadiness,\n} from \"./playerTypes\";\nimport { getFragmentStartSeconds } from \"./Scte35Parser\";\n\nexport interface Scte35CueManagerCallbacks {\n  onEarlyStartCue(marker: Scte35Marker, fragmentSn: number | undefined, cueKey: string): void;\n  onPlaybackCue(marker: Scte35Marker, cueKey?: string): void;\n  isInAdBreak(): boolean;\n}\n\nexport class Scte35CueManager {\n  private readonly pendingScte35Cues: Map<string, NormalizedScte35Cue> = new Map();\n  private readonly recentScte35CueKeys: Map<string, number> = new Map();\n  private readonly recentScte35CueLimit: number = 200;\n  private pendingScte35CueKeyValue: string | undefined;\n  private activeScte35BreakKeyValue: string | undefined;\n  private scheduledScte35BreakKeyValue: string | undefined;\n\n  readonly tsScte35Pids: Set<number> = new Set();\n  readonly pmtPids: Set<number> = new Set();\n  readonly processedTsScte35Sections: Set<string> = new Set();\n\n  private debug: boolean;\n  private callbacks: Scte35CueManagerCallbacks;\n\n  constructor(debug: boolean, callbacks: Scte35CueManagerCallbacks) {\n    this.debug = debug;\n    this.callbacks = callbacks;\n  }\n\n  get pendingScte35CueKey(): string | undefined {\n    return this.pendingScte35CueKeyValue;\n  }\n  set pendingScte35CueKey(value: string | undefined) {\n    this.pendingScte35CueKeyValue = value;\n  }\n\n  get activeScte35BreakKey(): string | undefined {\n    return this.activeScte35BreakKeyValue;\n  }\n  set activeScte35BreakKey(value: string | undefined) {\n    this.activeScte35BreakKeyValue = value;\n  }\n\n  get scheduledScte35BreakKey(): string | undefined {\n    return this.scheduledScte35BreakKeyValue;\n  }\n  set scheduledScte35BreakKey(value: string | undefined) {\n    this.scheduledScte35BreakKeyValue = value;\n  }\n\n  createScte35CueContext(\n    source: Scte35CueSource,\n    readiness: Scte35CueReadiness,\n    frag?: any\n  ): Scte35CueContext {\n    const context: Scte35CueContext = { source, readiness };\n    if (typeof frag?.sn === \"number\") {\n      context.fragmentSn = frag.sn;\n    }\n    const fragmentStartSec = getFragmentStartSeconds(frag);\n    if (fragmentStartSec !== undefined) {\n      context.fragmentStartSeconds = fragmentStartSec;\n    }\n    return context;\n  }\n\n  onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void {\n    const cue = this.createScte35Cue(marker, context);\n    const pendingKey = this.getPendingScte35CueKey(cue);\n\n    if (context.readiness === \"early\") {\n      this.pendingScte35Cues.set(pendingKey, cue);\n      this.trimRecentScte35CueMaps();\n\n      if (marker.type === \"start\") {\n        this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n      }\n      return;\n    }\n\n    if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n          key: cue.key,\n          activeScte35BreakKey: this.activeScte35BreakKeyValue,\n          inAdBreak: this.callbacks.isInAdBreak(),\n          source: cue.source,\n        });\n      }\n      return;\n    }\n\n    if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n          key: cue.key,\n          source: cue.source,\n        });\n      }\n      return;\n    }\n\n    this.pendingScte35Cues.delete(pendingKey);\n    this.markScte35CueHandled(cue);\n    this.callbacks.onPlaybackCue(marker, cue.key);\n  }\n\n  activatePendingScte35CuesForFragment(frag: any): void {\n    const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : undefined;\n    if (fragmentSn === undefined) {\n      return;\n    }\n\n    const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n      ([, cue]) => cue.fragmentSn === fragmentSn\n    );\n\n    matchingCues.forEach(([pendingKey, cue]) => {\n      this.pendingScte35Cues.delete(pendingKey);\n      const context: Scte35CueContext = {\n        source: cue.source,\n        readiness: \"playback\",\n      };\n      context.fragmentSn = fragmentSn;\n      const fragmentStartSec =\n        cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n      if (fragmentStartSec !== undefined) {\n        context.fragmentStartSeconds = fragmentStartSec;\n      }\n      this.onScte35Cue(cue.marker, context);\n    });\n  }\n\n  private createScte35Cue(\n    marker: Scte35Marker,\n    context: Scte35CueContext\n  ): NormalizedScte35Cue {\n    const cue: NormalizedScte35Cue = {\n      marker,\n      source: context.source,\n      readiness: context.readiness,\n      key: this.getScte35CueKey(marker, context),\n    };\n    if (context.fragmentSn !== undefined) {\n      cue.fragmentSn = context.fragmentSn;\n    }\n    if (context.fragmentStartSeconds !== undefined) {\n      cue.fragmentStartSeconds = context.fragmentStartSeconds;\n    }\n    return cue;\n  }\n\n  private getScte35CueKey(\n    marker: Scte35Marker,\n    context: Scte35CueContext\n  ): string {\n    const raw = this.getScte35MarkerRaw(marker);\n    const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n    if (spliceEventId) {\n      return `splice:${spliceEventId}`;\n    }\n\n    const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n    if (segmentationEventId) {\n      return `segmentation:${segmentationEventId}`;\n    }\n\n    const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n    if (daterangeId) {\n      return `daterange:${daterangeId}`;\n    }\n\n    const scteValue =\n      this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) ||\n      this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n    if (scteValue) {\n      return `daterange-scte:${scteValue}`;\n    }\n\n    if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n      return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n    }\n\n    if (context.fragmentSn !== undefined) {\n      return `fragment:${context.fragmentSn}`;\n    }\n\n    return `${context.source}:wallclock:${Math.floor(Date.now() / 1000)}`;\n  }\n\n  private getPendingScte35CueKey(cue: NormalizedScte35Cue): string {\n    return `${cue.marker.type}:${cue.key}:${\n      cue.fragmentSn !== undefined ? cue.fragmentSn : \"unknown\"\n    }`;\n  }\n\n  private getScte35MarkerRaw(marker: Scte35Marker): any {\n    return typeof marker.raw === \"object\" && marker.raw !== null\n      ? (marker.raw as any)\n      : {};\n  }\n\n  private toIdentityString(value: unknown): string | undefined {\n    if (typeof value === \"number\" && Number.isFinite(value)) {\n      return String(value);\n    }\n    if (typeof value === \"string\" && value.trim().length > 0) {\n      return value.trim();\n    }\n    return undefined;\n  }\n\n  isStrongScte35CueKey(key: string | undefined): boolean {\n    return !!(\n      key &&\n      (key.startsWith(\"splice:\") ||\n        key.startsWith(\"segmentation:\") ||\n        key.startsWith(\"daterange:\") ||\n        key.startsWith(\"daterange-scte:\"))\n    );\n  }\n\n  private hasRecentlyHandledScte35Cue(cue: NormalizedScte35Cue): boolean {\n    if (\n      this.activeScte35BreakKeyValue === cue.key ||\n      this.scheduledScte35BreakKeyValue === cue.key\n    ) {\n      return true;\n    }\n\n    const recentKey = `${cue.marker.type}:${cue.key}`;\n    return this.recentScte35CueKeys.has(recentKey);\n  }\n\n  private markScte35CueHandled(cue: NormalizedScte35Cue): void {\n    this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n    this.trimRecentScte35CueMaps();\n  }\n\n  private trimRecentScte35CueMaps(): void {\n    while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n      const firstKey = this.recentScte35CueKeys.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.recentScte35CueKeys.delete(firstKey);\n    }\n\n    while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n      const firstKey = this.pendingScte35Cues.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.pendingScte35Cues.delete(firstKey);\n    }\n  }\n\n  private shouldAcceptScte35EndCue(cue: NormalizedScte35Cue): boolean {\n    if (!this.callbacks.isInAdBreak()) {\n      return false;\n    }\n\n    if (\n      this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) &&\n      this.isStrongScte35CueKey(cue.key) &&\n      this.activeScte35BreakKeyValue !== cue.key\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n}\n","import type {\n  StormcloudVideoPlayerConfig,\n  AdBreak,\n  StormcloudApiResponse,\n  AdController,\n} from \"../types\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport { applyVastMacros, generateCorrelator, normalizeVastTagUrl } from \"../utils/vastMacros\";\nimport type { VastConsentSignals } from \"../utils/vastMacros\";\nimport { resolveVastEnvironmentSignals } from \"../utils/vastEnvironmentSignals\";\nimport {\n  buildAnalyticsContext,\n  sendHeartbeat,\n  sendInitialTracking,\n} from \"../utils/tracking\";\n\nexport class AdConfigManager {\n  vmapBreaks: AdBreak[] = [];\n  consumedVmapBreakIds: Set<string> = new Set();\n  apiVastTagUrl: string | undefined;\n  apiNumberAds: number | undefined;\n  readonly streamCorrelator: string = generateCorrelator();\n  readonly viewCorrelator: string = generateCorrelator();\n  consentSignals: VastConsentSignals = {};\n  podCounter: number = 0;\n  podAssignedByPrefetch: boolean = false;\n\n  private lastHeartbeatTime: number = 0;\n  private heartbeatInterval: number | undefined;\n\n  private config: StormcloudVideoPlayerConfig;\n  private video: HTMLVideoElement;\n\n  constructor(config: StormcloudVideoPlayerConfig, video: HTMLVideoElement) {\n    this.config = config;\n    this.video = video;\n  }\n\n  get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  isVmapEnabled(): boolean {\n    return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n  }\n\n  async fetchAdConfiguration(): Promise<void> {\n    if (this.isVmapEnabled()) {\n      await this.fetchAndParseVmap(this.config.vmapUrl!);\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n      }\n      return;\n    }\n\n    const vastMode = this.config.vastMode || \"default\";\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n    }\n\n    if (vastMode === \"adstorm\") {\n      if (!this.config.licenseKey) {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n          );\n        }\n        return;\n      }\n\n      const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n      this.apiVastTagUrl = vastEndpoint;\n\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n          vastEndpoint\n        );\n      }\n      return;\n    }\n\n    if (this.config.vastTagUrl) {\n      this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n      return;\n    }\n\n    const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n\n    if (this.debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n        apiUrl\n      );\n    }\n\n    const headers: Record<string, string> = {};\n    if (this.config.licenseKey) {\n      headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n    }\n\n    const response = await fetch(apiUrl, { headers });\n    if (!response.ok) {\n      if (this.debug) {\n        console.warn(\n          `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n        );\n      }\n      return;\n    }\n\n    const data: StormcloudApiResponse = await response.json();\n\n    const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n    if (imaPayload) {\n      let decodedPayload = imaPayload;\n      try {\n        decodedPayload = decodeURIComponent(imaPayload);\n      } catch {\n        console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n      }\n      console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n      this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n    } else {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n        );\n      }\n    }\n\n    const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n    if (numberAds != null && numberAds > 0) {\n      this.apiNumberAds = numberAds;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n          this.apiNumberAds\n        );\n      }\n    }\n  }\n\n  private async fetchAndParseVmap(vmapUrl: string): Promise<void> {\n    if (!vmapUrl.trim()) {\n      return;\n    }\n\n    try {\n      const response = await fetch(vmapUrl);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch VMAP (${response.status})`);\n      }\n\n      const vmapXml = await response.text();\n      this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n      this.consumedVmapBreakIds.clear();\n\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n          vmapUrl\n        );\n      }\n    } catch (error) {\n      this.vmapBreaks = [];\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n      }\n    }\n  }\n\n  private parseVmapToBreaks(vmapXml: string): AdBreak[] {\n    if (typeof DOMParser === \"undefined\") {\n      return [];\n    }\n\n    const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n      }\n      return [];\n    }\n\n    const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n    let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(\n        doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n      );\n    }\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n        (el) => el.localName === \"AdBreak\"\n      );\n    }\n    const parsed: AdBreak[] = [];\n\n    adBreakNodes.forEach((node, index) => {\n      const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n      const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n      if (startTimeMs == null) {\n        return;\n      }\n\n      let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n      if (!adTagNode) {\n        adTagNode =\n          (node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") as Element | null) ??\n          undefined;\n      }\n      const adTagUrl = (adTagNode?.textContent || \"\").trim();\n      if (!adTagUrl) {\n        return;\n      }\n\n      const breakId =\n        node.getAttribute(\"breakId\") ||\n        `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n      parsed.push({\n        id: breakId,\n        startTimeMs,\n        vastTagUrl: adTagUrl,\n      });\n    });\n\n    parsed.sort((a, b) => {\n      const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n      const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n      return aStart - bStart;\n    });\n\n    return parsed;\n  }\n\n  private parseVmapTimeOffsetToMs(timeOffset: string): number | undefined {\n    if (!timeOffset) {\n      return undefined;\n    }\n\n    const normalized = timeOffset.trim().toLowerCase();\n    if (normalized === \"start\") {\n      return 0;\n    }\n\n    if (normalized === \"end\") {\n      return -1;\n    }\n\n    const hms = timeOffset.match(\n      /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n    );\n    if (hms) {\n      const [, hh, mm, ss, ms = \"0\"] = hms;\n      const hours = Number(hh);\n      const minutes = Number(mm);\n      const seconds = Number(ss);\n      const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n      return ((hours * 3600 + minutes * 60 + seconds) * 1000) + millis;\n    }\n\n    const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n    if (percent) {\n      const ratio = Number(percent[1]) / 100;\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1000 * ratio);\n      }\n      return undefined;\n    }\n\n    return undefined;\n  }\n\n  getAdBreakKey(adBreak: AdBreak): string {\n    if (adBreak.id) {\n      return adBreak.id;\n    }\n    return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n  }\n\n  resolveBreakStartMs(adBreak: AdBreak): number | undefined {\n    if (adBreak.startTimeMs >= 0) {\n      return adBreak.startTimeMs;\n    }\n\n    if (adBreak.startTimeMs === -1) {\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1000);\n      }\n    }\n\n    return undefined;\n  }\n\n  findCurrentOrNextBreak(nowMs: number): AdBreak | undefined {\n    const schedule: AdBreak[] = this.vmapBreaks;\n    let candidate: AdBreak | undefined;\n    const tol = this.config.driftToleranceMs ?? 1000;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (\n        breakStartMs <= nowMs + tol &&\n        (candidate == null ||\n          breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))\n      ) {\n        candidate = b;\n      }\n    }\n    return candidate;\n  }\n\n  findBreakForTime(nowMs: number): AdBreak | undefined {\n    const schedule: AdBreak[] = this.vmapBreaks;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n\n      if (b.durationMs) {\n        const end = breakStartMs + b.durationMs;\n        if (nowMs >= breakStartMs && nowMs < end) {\n          return b;\n        }\n        continue;\n      }\n\n      if (nowMs >= breakStartMs) {\n        return b;\n      }\n    }\n    return undefined;\n  }\n\n  selectVastTagsForBreak(b?: AdBreak): string[] | undefined {\n    if (!b || !b.vastTagUrl) return undefined;\n    if (b.vastTagUrl.includes(\",\")) {\n      return b.vastTagUrl\n        .split(\",\")\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0);\n    }\n    return [b.vastTagUrl];\n  }\n\n  beginNewAdPod(): void {\n    this.podCounter++;\n  }\n\n  private readonly defaultPodMaxAds: number = 6;\n  private readonly defaultPodMaxDurationMs: number = 120000;\n\n  resolvePodParams(breakDurationMs?: number): {\n    maxAds: number;\n    minDurationMs: number;\n    maxDurationMs: number;\n  } {\n    const maxDurationMs =\n      breakDurationMs != null && breakDurationMs > 0\n        ? breakDurationMs\n        : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0\n          ? this.config.podMaxDurationMs\n          : this.defaultPodMaxDurationMs;\n\n    const maxAds =\n      this.config.podMaxAds && this.config.podMaxAds > 0\n        ? this.config.podMaxAds\n        : this.apiNumberAds && this.apiNumberAds > 0\n          ? this.apiNumberAds\n          : this.defaultPodMaxAds;\n\n    const minDurationMs =\n      this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n\n    return { maxAds, minDurationMs, maxDurationMs };\n  }\n\n  generatePodVastUrl(\n    baseUrl: string,\n    podParams: { maxAds: number; minDurationMs: number; maxDurationMs: number },\n    adPlayer: AdController,\n    palNonce: PalNonceManager,\n    inAdBreak: boolean\n  ): string {\n    const adWillPlayMuted = inAdBreak\n      ? adPlayer.getOriginalMutedState()\n      : this.video.muted;\n    const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n\n    const urlWithMacros = applyVastMacros(baseUrl, {\n      correlator: this.viewCorrelator,\n      streamCorrelator: this.streamCorrelator,\n      pod: this.podCounter > 0 ? this.podCounter : undefined,\n      podMaxAds: podParams.maxAds,\n      podMinDurationMs: podParams.minDurationMs,\n      podMaxDurationMs: podParams.maxDurationMs,\n      isCtv: envSignals.isCtv,\n      contentUrl: envSignals.contentUrl,\n      pageUrl:\n        !envSignals.isCtv && typeof window !== \"undefined\"\n          ? window.location.href\n          : undefined,\n      adWillPlayMuted,\n      adWillAutoPlay: !!this.config.autoplay,\n      appId: envSignals.appId,\n      appName: envSignals.appName,\n      sessionId: envSignals.sessionId,\n      deviceId: envSignals.deviceId,\n      deviceIdType: envSignals.deviceIdType,\n      limitAdTracking: envSignals.limitAdTracking,\n      deviceTypeHint: envSignals.deviceTypeHint,\n      adTest: this.config.adTest,\n      consent: this.consentSignals,\n    });\n\n    const finalUrl = palNonce.injectNonce(urlWithMacros);\n    console.log(\n      `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n      finalUrl\n    );\n    return finalUrl;\n  }\n\n  // --- Tracking ---\n\n  initializeTracking(): void {\n    sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config))\n      .then(() => {\n        this.heartbeatInterval = window.setInterval(() => {\n          this.sendHeartbeatIfNeeded();\n        }, 5000);\n      })\n      .catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n            error\n          );\n        }\n        this.heartbeatInterval = window.setInterval(() => {\n          this.sendHeartbeatIfNeeded();\n        }, 5000);\n      });\n  }\n\n  private sendHeartbeatIfNeeded(): void {\n    const now = Date.now();\n    if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 30000) {\n      this.lastHeartbeatTime = now;\n      sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n            error\n          );\n        }\n      });\n    }\n  }\n\n  destroyTracking(): void {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = undefined;\n    }\n  }\n}\n","import type { AdController, StormcloudVideoPlayerConfig, Scte35Marker } from \"../types\";\n\nexport interface AdTimingCallbacks {\n  onAdStopTimerFired(): void;\n  onAdStartTimerFired(marker: Scte35Marker, cueKey: string | undefined): void;\n  onWatchdogTimeout(): void;\n  onFailsafeTimeout(): void;\n}\n\nexport class AdTimingService {\n  private adStopTimerId: number | undefined;\n  private adStartTimerId: number | undefined;\n  private adFailsafeTimerId: number | undefined;\n  private adRequestWatchdogId: number | undefined;\n  private adRequestWatchdogToken: number | null = null;\n  private adFailsafeToken: number | null = null;\n\n  ptsDriftEmaMs = 0;\n  expectedAdBreakDurationMs: number | undefined;\n  currentAdBreakStartWallClockMs: number | undefined;\n  scteAdBreakEndWallClockMs: number | undefined;\n  adBreakPlayedDurationMs: number = 0;\n  adBreakEpoch: number = 0;\n\n  adRequestTokenCounter = 0;\n  activeAdRequestToken: number | null = null;\n  currentAdIndex: number = 0;\n  totalAdsInBreak: number = 0;\n  totalAdRequestsInBreak: number = 0;\n  readonly maxTotalAdRequestsPerBreak: number = 10;\n  lastAdRequestTime: number = 0;\n  consecutiveFailures: number = 0;\n  readonly maxConsecutiveFailures: number = 5;\n  readonly minAdRequestIntervalMs: number = 3000;\n  readonly backoffBaseMs: number = 1000;\n  readonly maxBackoffMs: number = 15000;\n  private readonly defaultMinRemainingMsToStartAd: number = 4000;\n\n  failedVastUrls: Set<string> = new Set();\n  temporaryFailureUrls: Map<string, number> = new Map();\n  private readonly temporaryFailureCooldownMs: number = 30000;\n\n  private globalConsecutiveNoFills: number = 0;\n  private readonly globalNoFillThreshold: number = 3;\n  private globalNoFillCooldownUntil: number = 0;\n  private readonly globalNoFillBackoffBaseMs: number = 5000;\n  private readonly globalNoFillBackoffMaxMs: number = 60000;\n  private globalLastGamRequestTime: number = 0;\n  private readonly globalMinGamIntervalMs: number = 3000;\n\n  private config: StormcloudVideoPlayerConfig;\n  private video: HTMLVideoElement;\n  private callbacks: AdTimingCallbacks;\n\n  constructor(\n    config: StormcloudVideoPlayerConfig,\n    video: HTMLVideoElement,\n    callbacks: AdTimingCallbacks\n  ) {\n    this.config = config;\n    this.video = video;\n    this.callbacks = callbacks;\n  }\n\n  get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  // --- Ad stop timer ---\n\n  scheduleAdStopCountdown(remainingMs: number): void {\n    this.clearAdStopTimer();\n    const ms = Math.max(0, Math.floor(remainingMs));\n    if (ms === 0) {\n      this.ensureAdStoppedByTimer();\n      return;\n    }\n    this.adStopTimerId = window.setTimeout(() => {\n      this.ensureAdStoppedByTimer();\n    }, ms) as unknown as number;\n  }\n\n  clearAdStopTimer(): void {\n    if (this.adStopTimerId != null) {\n      clearTimeout(this.adStopTimerId);\n      this.adStopTimerId = undefined;\n    }\n  }\n\n  private ensureAdStoppedByTimer(): void {\n    this.adStopTimerId = undefined;\n    this.callbacks.onAdStopTimerFired();\n  }\n\n  // --- Ad start timer ---\n\n  scheduleAdStartIn(\n    delayMs: number,\n    marker: Scte35Marker = { type: \"start\" } as Scte35Marker,\n    cueKey?: string\n  ): void {\n    this.clearAdStartTimer();\n    const ms = Math.max(0, Math.floor(delayMs));\n    if (ms === 0) {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n      return;\n    }\n    this.adStartTimerId = window.setTimeout(() => {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n    }, ms) as unknown as number;\n  }\n\n  clearAdStartTimer(): void {\n    if (this.adStartTimerId != null) {\n      clearTimeout(this.adStartTimerId);\n      this.adStartTimerId = undefined;\n    }\n  }\n\n  // --- PTS drift ---\n\n  updatePtsDrift(ptsSecondsSample: number): void {\n    const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1000;\n    if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 60000) return;\n    const alpha = 0.1;\n    this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n  }\n\n  resolveScteBreakStartWallClockMs(marker: Scte35Marker): number {\n    const nowWallClockMs = Date.now();\n    if (typeof marker.ptsSeconds !== \"number\") {\n      return nowWallClockMs;\n    }\n\n    const nowMs = this.video.currentTime * 1000;\n    const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n    const deltaMs = marker.ptsSeconds * 1000 - estimatedCurrentPtsMs;\n    if (!Number.isFinite(deltaMs)) {\n      return nowWallClockMs;\n    }\n\n    return nowWallClockMs + Math.floor(deltaMs);\n  }\n\n  // --- Duration boundary ---\n\n  setAdBreakDurationBoundary(durationMs: number | undefined): void {\n    this.expectedAdBreakDurationMs = durationMs;\n    if (\n      durationMs != null &&\n      this.currentAdBreakStartWallClockMs != null\n    ) {\n      this.scteAdBreakEndWallClockMs =\n        this.currentAdBreakStartWallClockMs + durationMs;\n    } else {\n      this.scteAdBreakEndWallClockMs = undefined;\n    }\n  }\n\n  scheduleAdStopAtBreakBoundary(): void {\n    if (this.expectedAdBreakDurationMs == null) {\n      return;\n    }\n    this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n  }\n\n  // --- Duration budget ---\n\n  getWallClockRemainingAdMs(): number {\n    const endWallClockMs = this.getAdBreakEndWallClockMs();\n    if (endWallClockMs != null) {\n      return Math.max(0, endWallClockMs - Date.now());\n    }\n    return 0;\n  }\n\n  getAdBreakEndWallClockMs(): number | undefined {\n    if (this.scteAdBreakEndWallClockMs != null) {\n      return this.scteAdBreakEndWallClockMs;\n    }\n    if (\n      this.expectedAdBreakDurationMs == null ||\n      this.currentAdBreakStartWallClockMs == null\n    ) {\n      return undefined;\n    }\n    return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n  }\n\n  getDurationBudgetRemainingMs(): number {\n    if (this.expectedAdBreakDurationMs == null) {\n      return 0;\n    }\n    return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n  }\n\n  getLoadedAdDurationMs(adController: AdController): number {\n    const durationSec = adController.getLoadedAdDuration?.();\n    if (durationSec == null || durationSec <= 0) {\n      return 0;\n    }\n    return Math.round(durationSec * 1000);\n  }\n\n  adFitsRemainingBudget(durationMs: number): boolean {\n    if (durationMs <= 0) {\n      return true;\n    }\n    return durationMs <= this.getDurationBudgetRemainingMs();\n  }\n\n  logAdDurationDecision(\n    accepted: boolean,\n    durationMs: number,\n    adController: AdController\n  ): void {\n    if (!this.debug) {\n      return;\n    }\n    const remainingBudget = this.getDurationBudgetRemainingMs();\n    const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n    if (accepted) {\n      console.log(\n        `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n      );\n    } else {\n      console.log(\n        `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms — requesting another ad`\n      );\n    }\n  }\n\n  recordPlayedAdDuration(adController: AdController): void {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    if (durationMs <= 0) {\n      return;\n    }\n    this.adBreakPlayedDurationMs += durationMs;\n    if (this.debug) {\n      console.log(\n        `[AD-DURATION] Played ${durationMs}ms — total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n      );\n    }\n  }\n\n  ensureLoadedAdFitsBudget(adController: AdController): boolean {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    const fits = this.adFitsRemainingBudget(durationMs);\n    this.logAdDurationDecision(fits, durationMs, adController);\n    return fits;\n  }\n\n  rejectLoadedAdForDuration(adController: AdController): void {\n    try {\n      adController.destroy();\n    } catch {}\n  }\n\n  markAdStarted(): void {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n    this.totalAdRequestsInBreak++;\n    this.lastAdRequestTime = Date.now();\n  }\n\n  notePodAdStarted(): void {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n  }\n\n  getRemainingAdMs(): number {\n    const wallClockRemaining = this.getWallClockRemainingAdMs();\n    const budgetRemaining = this.getDurationBudgetRemainingMs();\n    if (this.expectedAdBreakDurationMs == null) {\n      return wallClockRemaining;\n    }\n    return Math.min(wallClockRemaining, budgetRemaining);\n  }\n\n  getMinRemainingMsToStartAd(): number {\n    const configured = this.config.minRemainingMsToStartAd;\n    if (typeof configured === \"number\" && configured >= 0) {\n      return configured;\n    }\n    return this.defaultMinRemainingMsToStartAd;\n  }\n\n  hasTimeToStartAnotherAd(): boolean {\n    const minRemaining = this.getMinRemainingMsToStartAd();\n    return (\n      this.getWallClockRemainingAdMs() > minRemaining &&\n      this.getDurationBudgetRemainingMs() > minRemaining\n    );\n  }\n\n  // --- Circuit breaker ---\n\n  isTemporaryAdError(error: Error): boolean {\n    const message = error?.message?.toLowerCase() || \"\";\n\n    if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n      return true;\n    }\n    if (message.includes(\"timeout\")) {\n      return true;\n    }\n    if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n      return true;\n    }\n    if (message.includes(\"ad playback error\")) {\n      return true;\n    }\n    return false;\n  }\n\n  isUrlInCooldown(vastTagUrl: string): boolean {\n    const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n    if (failureTime == null) {\n      return false;\n    }\n\n    const elapsed = Date.now() - failureTime;\n    if (elapsed >= this.temporaryFailureCooldownMs) {\n      this.temporaryFailureUrls.delete(vastTagUrl);\n      return false;\n    }\n\n    return true;\n  }\n\n  cleanupTemporaryFailures(): void {\n    const now = Date.now();\n    for (const [url, timestamp] of this.temporaryFailureUrls) {\n      if (now - timestamp >= this.temporaryFailureCooldownMs) {\n        this.temporaryFailureUrls.delete(url);\n      }\n    }\n  }\n\n  isGamInCooldown(): boolean {\n    return Date.now() < this.globalNoFillCooldownUntil;\n  }\n\n  recordGamNoFill(): void {\n    this.globalConsecutiveNoFills++;\n\n    if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n      const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n      const backoff = Math.min(\n        this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n        this.globalNoFillBackoffMaxMs\n      );\n      this.globalNoFillCooldownUntil = Date.now() + backoff;\n\n      if (this.debug) {\n        console.log(\n          `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n        );\n      }\n    }\n  }\n\n  resetGamNoFillCounter(): void {\n    if (this.globalConsecutiveNoFills > 0 && this.debug) {\n      console.log(\n        `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n      );\n    }\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillCooldownUntil = 0;\n  }\n\n  async enforceGlobalRateLimit(): Promise<void> {\n    const now = Date.now();\n    const elapsed = now - this.globalLastGamRequestTime;\n    if (elapsed < this.globalMinGamIntervalMs) {\n      const waitMs = this.globalMinGamIntervalMs - elapsed;\n      if (this.debug) {\n        console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n      }\n      await new Promise(resolve => setTimeout(resolve, waitMs));\n    }\n    this.globalLastGamRequestTime = Date.now();\n  }\n\n  // --- Watchdog ---\n\n  startAdRequestWatchdog(token: number): void {\n    this.clearAdRequestWatchdog();\n\n    const timeoutMs = this.config.adFailsafeTimeoutMs ?? 10000;\n    this.adRequestWatchdogToken = token;\n    this.adRequestWatchdogId = window.setTimeout(() => {\n      if (this.adRequestWatchdogToken !== token) {\n        return;\n      }\n\n      this.adRequestWatchdogId = undefined;\n      this.adRequestWatchdogToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n\n      this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n      this.callbacks.onWatchdogTimeout();\n    }, timeoutMs) as unknown as number;\n\n    this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n  }\n\n  clearAdRequestWatchdog(): void {\n    if (this.adRequestWatchdogId != null) {\n      clearTimeout(this.adRequestWatchdogId);\n      this.adRequestWatchdogId = undefined;\n    }\n\n    if (this.adRequestWatchdogToken != null) {\n      this.logAdState(\"ad_request_watchdog_cleared\", {\n        token: this.adRequestWatchdogToken,\n      });\n      this.adRequestWatchdogToken = null;\n    }\n  }\n\n  // --- Failsafe ---\n\n  startAdFailsafeTimer(token: number): void {\n    this.clearAdFailsafeTimer();\n\n    const failsafeMs = this.config.adFailsafeTimeoutMs ?? 10000;\n    this.adFailsafeToken = token;\n\n    this.adFailsafeTimerId = window.setTimeout(() => {\n      if (this.adFailsafeToken !== token) {\n        return;\n      }\n\n      this.adFailsafeTimerId = undefined;\n      this.adFailsafeToken = null;\n\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n\n      this.logAdState(\"ad_failsafe_triggered\", {\n        token,\n        failsafeMs,\n        videoPaused: this.video.paused,\n      });\n\n      this.callbacks.onFailsafeTimeout();\n    }, failsafeMs) as unknown as number;\n\n    this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n  }\n\n  clearAdFailsafeTimer(): void {\n    if (this.adFailsafeTimerId != null) {\n      clearTimeout(this.adFailsafeTimerId);\n      this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n      this.adFailsafeTimerId = undefined;\n    }\n\n    this.adFailsafeToken = null;\n  }\n\n  logAdState(event: string, extra: Record<string, unknown> = {}, adPlayer?: AdController, inAdBreak?: boolean, showAds?: boolean): void {\n    if (!this.debug) {\n      return;\n    }\n\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: new Date().toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\n      activeAdRequestToken: this.activeAdRequestToken,\n      ...extra,\n    });\n  }\n\n  // --- Reset for ad break end ---\n\n  resetForBreakEnd(): void {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdRequestWatchdog();\n    this.clearAdFailsafeTimer();\n    this.activeAdRequestToken = null;\n    this.expectedAdBreakDurationMs = undefined;\n    this.currentAdBreakStartWallClockMs = undefined;\n    this.scteAdBreakEndWallClockMs = undefined;\n    this.adBreakPlayedDurationMs = 0;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.consecutiveFailures = 0;\n    this.globalConsecutiveNoFills = 0;\n    this.adBreakEpoch++;\n  }\n\n  destroy(): void {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdFailsafeTimer();\n    this.clearAdRequestWatchdog();\n  }\n}\n","export class PlaceholderLayer {\n  private container: HTMLDivElement | undefined;\n  private debug: boolean;\n  private video: HTMLVideoElement;\n\n  constructor(video: HTMLVideoElement, debug: boolean) {\n    this.video = video;\n    this.debug = debug;\n  }\n\n  private ensureContainer(): void {\n    if (this.container) {\n      return;\n    }\n\n    const el = document.createElement(\"div\");\n    el.style.position = \"absolute\";\n    el.style.left = \"0\";\n    el.style.top = \"0\";\n    el.style.right = \"0\";\n    el.style.bottom = \"0\";\n    el.style.display = \"none\";\n    el.style.alignItems = \"center\";\n    el.style.justifyContent = \"center\";\n    el.style.pointerEvents = \"none\";\n    el.style.zIndex = \"5\";\n    el.style.backgroundColor = \"#000\";\n    el.style.transition = \"opacity 0.3s ease-in-out\";\n    el.style.opacity = \"0\";\n\n    if (!this.video.parentElement) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n      }\n      return;\n    }\n\n    this.video.parentElement.appendChild(el);\n    this.container = el;\n  }\n\n  show(): void {\n    this.ensureContainer();\n\n    if (!this.container) {\n      return;\n    }\n\n    if (!this.video.muted) {\n      this.video.muted = true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n      }\n    }\n\n    const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n    if (wasHidden) {\n      this.container.style.transition = \"none\";\n    } else {\n      this.container.style.transition = \"opacity 0.3s ease-in-out\";\n    }\n\n    this.container.style.backgroundColor = \"#000\";\n    this.container.style.display = \"flex\";\n    this.container.offsetHeight;\n    this.container.style.opacity = \"1\";\n    this.container.style.pointerEvents = \"auto\";\n\n    if (wasHidden) {\n      requestAnimationFrame(() => {\n        if (this.container) {\n          this.container.style.transition = \"opacity 0.3s ease-in-out\";\n        }\n      });\n    }\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n    }\n  }\n\n  hide(): void {\n    if (!this.container) {\n      return;\n    }\n\n    this.container.style.opacity = \"0\";\n    setTimeout(() => {\n      if (this.container) {\n        this.container.style.display = \"none\";\n        this.container.style.pointerEvents = \"none\";\n        this.container.style.backgroundColor = \"#000\";\n      }\n    }, 300);\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n    }\n  }\n\n  destroy(): void {\n    if (this.container) {\n      if (this.container.parentElement) {\n        this.container.parentElement.removeChild(this.container);\n      }\n      this.container = undefined;\n    }\n  }\n}\n","import Hls from \"hls.js\";\nimport type {\n  StormcloudVideoPlayerConfig,\n  Scte35Marker,\n  Id3TagInfo,\n} from \"../types\";\nimport type { Scte35CueContext } from \"./playerTypes\";\nimport {\n  parseScte35FromId3,\n  parseScte35FromTsPackets,\n  normalizeFragmentPayload,\n  getFragmentStartSeconds,\n  parseCueOutDuration,\n  parseCueOutCont,\n  parseAttributeList,\n  toNumber,\n} from \"./Scte35Parser\";\nimport type { Scte35CueManager } from \"./Scte35CueManager\";\nimport type { AdTimingService } from \"./AdTimingService\";\n\nexport interface HlsEngineCallbacks {\n  onManifestParsed(isLive: boolean): Promise<void>;\n  onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void;\n  activatePendingCuesForFragment(frag: any): void;\n  onFatalDestroy(): void;\n  isInAdBreak(): boolean;\n  hasPendingAdBreak(): boolean;\n}\n\nexport class HlsEngine {\n  hls: Hls | undefined;\n  isLiveStream: boolean = false;\n  nativeHlsMode: boolean = false;\n  videoSrcProtection: string | null = null;\n\n  private bufferedSegmentsCount: number = 0;\n  private shouldAutoplayAfterBuffering: boolean = false;\n  private hasInitialBufferCompleted: boolean = false;\n\n  private readonly config: StormcloudVideoPlayerConfig;\n  private readonly video: HTMLVideoElement;\n  private readonly cueManager: Scte35CueManager;\n  private readonly timing: AdTimingService;\n  private readonly callbacks: HlsEngineCallbacks;\n\n  constructor(\n    config: StormcloudVideoPlayerConfig,\n    video: HTMLVideoElement,\n    cueManager: Scte35CueManager,\n    timing: AdTimingService,\n    callbacks: HlsEngineCallbacks\n  ) {\n    this.config = config;\n    this.video = video;\n    this.cueManager = cueManager;\n    this.timing = timing;\n    this.callbacks = callbacks;\n  }\n\n  private get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  shouldUseNativeHls(getStreamType: () => \"hls\" | \"other\"): boolean {\n    const streamType = getStreamType();\n    if (streamType === \"other\") {\n      return true;\n    }\n    const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n    return !!(this.config.allowNativeHls && canNative);\n  }\n\n  async setupNativeHls(): Promise<void> {\n    this.nativeHlsMode = true;\n    this.videoSrcProtection = this.config.src;\n    this.video.src = this.config.src;\n\n    this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n\n    if (this.debug) {\n      const adBehavior = this.isLiveStream\n        ? \"live (main video continues muted during ads)\"\n        : \"vod (main video pauses during ads)\";\n      console.log(\n        \"[StormcloudVideoPlayer] Using native HLS playback:\",\n        {\n          isLive: this.isLiveStream,\n          allowNativeHls: this.config.allowNativeHls,\n          adBehavior,\n        }\n      );\n    }\n\n    if (this.config.autoplay) {\n      await this.video.play()?.catch(() => {});\n    }\n  }\n\n  setupHls(): void {\n    this.hls = new Hls({\n      enableWorker: true,\n      backBufferLength: 30,\n      liveDurationInfinity: true,\n      lowLatencyMode: !!this.config.lowLatencyMode,\n      maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1.0,\n      ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1000 * 1000,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\n      startPosition: -1,\n    });\n\n    this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n      this.hls?.loadSource(this.config.src);\n    });\n\n    this.hls.on(Hls.Events.MANIFEST_PARSED, async (_, _data: any) => {\n      this.isLiveStream =\n        this.config.isLiveStream ??\n        (this.hls?.levels?.some(\n          (level) =>\n            level?.details?.live === true || level?.details?.type === \"LIVE\"\n        ) ?? false);\n\n      await this.callbacks.onManifestParsed(this.isLiveStream);\n\n      this.bufferedSegmentsCount = 0;\n      this.hasInitialBufferCompleted = false;\n      this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Waiting for\",\n          minSegments,\n          \"segments to buffer before playback\"\n        );\n      }\n\n      if (minSegments === 0 || !this.config.autoplay) {\n        this.hasInitialBufferCompleted = true;\n        if (this.config.autoplay) {\n          await this.video.play()?.catch(() => {});\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\n      if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n        return;\n      }\n\n      const details = data?.details;\n      if (!details || !details.fragments || details.fragments.length === 0) {\n        return;\n      }\n\n      const fragmentsToScan = Math.min(5, details.fragments.length);\n\n      for (let i = 0; i < fragmentsToScan; i++) {\n        const frag = details.fragments[i];\n        const tagList: any[] | undefined = frag?.tagList;\n\n        if (!Array.isArray(tagList)) continue;\n\n        for (const entry of tagList) {\n          let tag = \"\";\n          let value = \"\";\n\n          if (Array.isArray(entry)) {\n            tag = String(entry[0] ?? \"\");\n            value = String(entry[1] ?? \"\");\n          } else if (typeof entry === \"string\") {\n            const idx = entry.indexOf(\":\");\n            if (idx >= 0) {\n              tag = entry.substring(0, idx);\n              value = entry.substring(idx + 1);\n            } else {\n              tag = entry;\n            }\n          }\n\n          if (!tag) continue;\n\n          if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n            const attrs = tag.includes(\"EXT-X-DATERANGE\")\n              ? parseAttributeList(value)\n              : {};\n            const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") ||\n              \"SCTE35-OUT\" in attrs ||\n              attrs[\"SCTE35-OUT\"] !== undefined;\n\n            if (hasScteOut) {\n              const durationSeconds = parseCueOutDuration(value);\n              const marker: Scte35Marker = {\n                type: \"start\",\n                ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n                raw: { tag, value, earlyDetection: true },\n              } as Scte35Marker;\n\n              if (this.debug) {\n                console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n              }\n\n              this.callbacks.onScte35Cue(marker, {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag),\n              });\n              return;\n            }\n          }\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.FRAG_BUFFERED, async (_evt, _data: any) => {\n      if (this.hasInitialBufferCompleted) {\n        return;\n      }\n\n      this.bufferedSegmentsCount++;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n        );\n      }\n\n      if (this.bufferedSegmentsCount >= minSegments) {\n        this.hasInitialBufferCompleted = true;\n\n        if (this.shouldAutoplayAfterBuffering) {\n          if (this.debug) {\n            console.log(\n              `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n            );\n          }\n          await this.video.play()?.catch((err) => {\n            if (this.debug) {\n              console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n            }\n          });\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.FRAG_PARSING_METADATA, (_evt, data: any) => {\n      const id3Tags: Id3TagInfo[] = (data?.samples || []).map((s: any) => ({\n        key: \"ID3\",\n        value: s?.data,\n        ptsSeconds: s?.pts,\n      }));\n      id3Tags.forEach((tag) => this.onId3Tag(tag));\n    });\n\n    this.hls.on(Hls.Events.FRAG_LOADED, (_evt, data: any) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n\n    this.hls.on(Hls.Events.FRAG_DECRYPTED, (_evt, data: any) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n\n    this.hls.on(Hls.Events.FRAG_CHANGED, (_evt, data: any) => {\n      const frag = data?.frag;\n      const tagList: any[] | undefined = frag?.tagList;\n      if (!Array.isArray(tagList)) {\n        this.callbacks.activatePendingCuesForFragment(frag);\n        return;\n      }\n\n      for (const entry of tagList) {\n        let tag = \"\";\n        let value = \"\";\n        if (Array.isArray(entry)) {\n          tag = String(entry[0] ?? \"\");\n          value = String(entry[1] ?? \"\");\n        } else if (typeof entry === \"string\") {\n          const idx = entry.indexOf(\":\");\n          if (idx >= 0) {\n            tag = entry.substring(0, idx);\n            value = entry.substring(idx + 1);\n          } else {\n            tag = entry;\n            value = \"\";\n          }\n        }\n\n        if (!tag) continue;\n        if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n          const prog = parseCueOutCont(value);\n          const marker: Scte35Marker = {\n            type: \"progress\",\n            ...(prog?.duration !== undefined\n              ? { durationSeconds: prog.duration }\n              : {}),\n            ...(prog?.elapsed !== undefined\n              ? { ptsSeconds: prog.elapsed }\n              : {}),\n            raw: { tag, value },\n          } as Scte35Marker;\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n          });\n        } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n          const durationSeconds = parseCueOutDuration(value);\n          const marker: Scte35Marker = {\n            type: \"start\",\n            ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n            raw: { tag, value },\n          } as Scte35Marker;\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n          });\n        } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n          this.callbacks.onScte35Cue(\n            { type: \"end\", raw: { tag, value } },\n            {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n            }\n          );\n        } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n          const attrs = parseAttributeList(value);\n          const hasScteOut =\n            \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n          const hasScteIn =\n            \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n          const klass = String(attrs[\"CLASS\"] ?? \"\");\n          const duration = toNumber(attrs[\"DURATION\"]);\n\n          if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n            const marker: Scte35Marker = {\n              type: \"start\",\n              ...(duration !== undefined ? { durationSeconds: duration } : {}),\n              raw: { tag, value, attrs },\n            } as Scte35Marker;\n            this.callbacks.onScte35Cue(marker, {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n            });\n          }\n          if (hasScteIn) {\n            this.callbacks.onScte35Cue(\n              { type: \"end\", raw: { tag, value, attrs } },\n              {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n              }\n            );\n          }\n        }\n      }\n      this.callbacks.activatePendingCuesForFragment(frag);\n    });\n\n    this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n      if (data?.fatal) {\n        switch (data.type) {\n          case Hls.ErrorTypes.NETWORK_ERROR:\n            this.hls?.startLoad();\n            break;\n          case Hls.ErrorTypes.MEDIA_ERROR:\n            this.hls?.recoverMediaError();\n            break;\n          default:\n            this.callbacks.onFatalDestroy();\n            break;\n        }\n      }\n    });\n\n    this.hls.attachMedia(this.video);\n  }\n\n  private onId3Tag(tag: Id3TagInfo): void {\n    if (typeof tag.ptsSeconds === \"number\") {\n      this.timing.updatePtsDrift(tag.ptsSeconds);\n    }\n    const marker = parseScte35FromId3(tag);\n    if (marker) {\n      this.callbacks.onScte35Cue(marker, {\n        source: \"id3\",\n        readiness: \"playback\",\n      });\n    }\n  }\n\n  private processFragmentScte35Payload(\n    payloadData: unknown,\n    fragmentSn?: number,\n    fragmentStartSeconds?: number\n  ): void {\n    const payload = normalizeFragmentPayload(payloadData);\n    if (!payload) {\n      return;\n    }\n\n    const markers = parseScte35FromTsPackets(\n      payload,\n      this.cueManager.tsScte35Pids,\n      this.cueManager.pmtPids,\n      this.cueManager.processedTsScte35Sections\n    );\n    markers.forEach((marker) => {\n      const context: Scte35CueContext = {\n        source: \"ts\",\n        readiness: \"early\",\n      };\n      if (fragmentSn !== undefined) {\n        context.fragmentSn = fragmentSn;\n      }\n      if (fragmentStartSeconds !== undefined) {\n        context.fragmentStartSeconds = fragmentStartSeconds;\n      }\n      this.callbacks.onScte35Cue(marker, context);\n    });\n  }\n\n  getLiveSyncPosition(): number | undefined {\n    const pos = this.hls?.liveSyncPosition;\n    return typeof pos === \"number\" && Number.isFinite(pos) ? pos : undefined;\n  }\n\n  destroy(): void {\n    this.hls?.destroy();\n    this.hls = undefined;\n  }\n}\n","import type { AdController } from \"../types\";\n\nexport function getAdAudioVolume(adPlayer: AdController): number {\n  return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\n\nexport function toggleMute(\n  video: HTMLVideoElement,\n  adPlayer: AdController,\n  debug: boolean\n): void {\n  if (adPlayer.isAdPlaying()) {\n    const newMutedState = !adPlayer.getOriginalMutedState();\n    const restoreVolume = adPlayer.getOriginalVolume() || 1;\n\n    adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n    adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n        newMutedState\n      );\n    }\n  } else {\n    video.muted = !video.muted;\n    adPlayer.updateOriginalMutedState(video.muted, video.volume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n    }\n  }\n}\n\nexport function toggleFullscreen(\n  video: HTMLVideoElement,\n  debug: boolean\n): Promise<void> {\n  return new Promise((resolve, reject) => {\n    if (!document.fullscreenElement) {\n      const container = video.parentElement;\n      if (!container) {\n        reject(new Error(\"No parent container found for fullscreen\"));\n        return;\n      }\n      container\n        .requestFullscreen()\n        .then(() => {\n          if (debug) {\n            console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n          }\n          resolve();\n        })\n        .catch((err) => {\n          if (debug) {\n            console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n          }\n          reject(err);\n        });\n    } else {\n      document\n        .exitFullscreen()\n        .then(() => {\n          if (debug) {\n            console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n          }\n          resolve();\n        })\n        .catch((err) => {\n          if (debug) {\n            console.error(\n              \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n              err\n            );\n          }\n          reject(err);\n        });\n    }\n  });\n}\n\nexport function isMuted(\n  video: HTMLVideoElement,\n  adPlayer: AdController\n): boolean {\n  if (adPlayer.isAdPlaying()) {\n    return adPlayer.getOriginalMutedState();\n  }\n  return video.muted;\n}\n\nexport function setMuted(\n  video: HTMLVideoElement,\n  adPlayer: AdController,\n  muted: boolean,\n  debug: boolean\n): void {\n  const adPlaying = adPlayer.isAdPlaying();\n\n  if (adPlaying && muted === video.muted) {\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n        { muted }\n      );\n    }\n    return;\n  }\n\n  video.muted = muted;\n\n  if (adPlaying) {\n    adPlayer.updateOriginalMutedState(muted, video.volume);\n    adPlayer.setAdVolume(muted ? 0 : 1);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n        muted,\n      });\n    }\n    return;\n  }\n\n  adPlayer.updateOriginalMutedState(muted, video.volume);\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n  }\n}\n\nexport function setVolume(\n  video: HTMLVideoElement,\n  adPlayer: AdController,\n  volume: number,\n  debug: boolean\n): void {\n  const clampedVolume = Math.max(0, Math.min(1, volume));\n  const adPlaying = adPlayer.isAdPlaying();\n\n  if (adPlaying) {\n    adPlayer.setAdVolume(clampedVolume);\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n        volume: clampedVolume,\n      });\n    }\n  } else {\n    video.volume = clampedVolume;\n    video.muted = clampedVolume === 0;\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n    }\n  }\n}\n\nexport function getVolume(\n  video: HTMLVideoElement,\n  adPlayer: AdController\n): number {\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying) {\n    return adPlayer.getAdVolume();\n  }\n  return video.volume;\n}\n\nexport function isFullscreen(): boolean {\n  return !!document.fullscreenElement;\n}\n\nexport function resizePlayer(\n  video: HTMLVideoElement,\n  adPlayer: AdController,\n  debug: boolean\n): void {\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] Resizing player\");\n  }\n\n  if (adPlayer && adPlayer.isAdPlaying()) {\n    const width = video.clientWidth || 640;\n    const height = video.clientHeight || 480;\n\n    if (debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n      );\n    }\n\n    adPlayer.resize(width, height);\n  }\n}\n"]}