{"version":3,"file":"js/chunk-vendors-a4db1735.50dbc2f4.js","mappings":"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","sources":["webpack://microsoft-academy/./node_modules/mpd-parser/dist/mpd-parser.es.js","webpack://microsoft-academy/./node_modules/mux.js/lib/tools/parse-sidx.js","webpack://microsoft-academy/./node_modules/mux.js/lib/utils/clock.js"],"sourcesContent":["/*! @name mpd-parser @version 0.19.2 @license Apache-2.0 */\nimport resolveUrl from '@videojs/vhs-utils/es/resolve-url';\nimport window from 'global/window';\nimport decodeB64ToUint8Array from '@videojs/vhs-utils/es/decode-b64-to-uint8-array';\nimport { DOMParser } from '@xmldom/xmldom';\n\nvar version = \"0.19.2\";\n\nvar isObject = function isObject(obj) {\n return !!obj && typeof obj === 'object';\n};\n\nvar merge = function merge() {\n for (var _len = arguments.length, objects = new Array(_len), _key = 0; _key < _len; _key++) {\n objects[_key] = arguments[_key];\n }\n\n return objects.reduce(function (result, source) {\n if (typeof source !== 'object') {\n return result;\n }\n\n Object.keys(source).forEach(function (key) {\n if (Array.isArray(result[key]) && Array.isArray(source[key])) {\n result[key] = result[key].concat(source[key]);\n } else if (isObject(result[key]) && isObject(source[key])) {\n result[key] = merge(result[key], source[key]);\n } else {\n result[key] = source[key];\n }\n });\n return result;\n }, {});\n};\nvar values = function values(o) {\n return Object.keys(o).map(function (k) {\n return o[k];\n });\n};\n\nvar range = function range(start, end) {\n var result = [];\n\n for (var i = start; i < end; i++) {\n result.push(i);\n }\n\n return result;\n};\nvar flatten = function flatten(lists) {\n return lists.reduce(function (x, y) {\n return x.concat(y);\n }, []);\n};\nvar from = function from(list) {\n if (!list.length) {\n return [];\n }\n\n var result = [];\n\n for (var i = 0; i < list.length; i++) {\n result.push(list[i]);\n }\n\n return result;\n};\nvar findIndexes = function findIndexes(l, key) {\n return l.reduce(function (a, e, i) {\n if (e[key]) {\n a.push(i);\n }\n\n return a;\n }, []);\n};\n\nvar errors = {\n INVALID_NUMBER_OF_PERIOD: 'INVALID_NUMBER_OF_PERIOD',\n DASH_EMPTY_MANIFEST: 'DASH_EMPTY_MANIFEST',\n DASH_INVALID_XML: 'DASH_INVALID_XML',\n NO_BASE_URL: 'NO_BASE_URL',\n MISSING_SEGMENT_INFORMATION: 'MISSING_SEGMENT_INFORMATION',\n SEGMENT_TIME_UNSPECIFIED: 'SEGMENT_TIME_UNSPECIFIED',\n UNSUPPORTED_UTC_TIMING_SCHEME: 'UNSUPPORTED_UTC_TIMING_SCHEME'\n};\n\n/**\n * @typedef {Object} SingleUri\n * @property {string} uri - relative location of segment\n * @property {string} resolvedUri - resolved location of segment\n * @property {Object} byterange - Object containing information on how to make byte range\n * requests following byte-range-spec per RFC2616.\n * @property {String} byterange.length - length of range request\n * @property {String} byterange.offset - byte offset of range request\n *\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1\n */\n\n/**\n * Converts a URLType node (5.3.9.2.3 Table 13) to a segment object\n * that conforms to how m3u8-parser is structured\n *\n * @see https://github.com/videojs/m3u8-parser\n *\n * @param {string} baseUrl - baseUrl provided by nodes\n * @param {string} source - source url for segment\n * @param {string} range - optional range used for range calls,\n * follows RFC 2616, Clause 14.35.1\n * @return {SingleUri} full segment information transformed into a format similar\n * to m3u8-parser\n */\n\nvar urlTypeToSegment = function urlTypeToSegment(_ref) {\n var _ref$baseUrl = _ref.baseUrl,\n baseUrl = _ref$baseUrl === void 0 ? '' : _ref$baseUrl,\n _ref$source = _ref.source,\n source = _ref$source === void 0 ? '' : _ref$source,\n _ref$range = _ref.range,\n range = _ref$range === void 0 ? '' : _ref$range,\n _ref$indexRange = _ref.indexRange,\n indexRange = _ref$indexRange === void 0 ? '' : _ref$indexRange;\n var segment = {\n uri: source,\n resolvedUri: resolveUrl(baseUrl || '', source)\n };\n\n if (range || indexRange) {\n var rangeStr = range ? range : indexRange;\n var ranges = rangeStr.split('-');\n var startRange = parseInt(ranges[0], 10);\n var endRange = parseInt(ranges[1], 10); // byterange should be inclusive according to\n // RFC 2616, Clause 14.35.1\n\n segment.byterange = {\n length: endRange - startRange + 1,\n offset: startRange\n };\n }\n\n return segment;\n};\nvar byteRangeToString = function byteRangeToString(byterange) {\n // `endRange` is one less than `offset + length` because the HTTP range\n // header uses inclusive ranges\n var endRange = byterange.offset + byterange.length - 1;\n return byterange.offset + \"-\" + endRange;\n};\n\n/**\n * parse the end number attribue that can be a string\n * number, or undefined.\n *\n * @param {string|number|undefined} endNumber\n * The end number attribute.\n *\n * @return {number|null}\n * The result of parsing the end number.\n */\n\nvar parseEndNumber = function parseEndNumber(endNumber) {\n if (endNumber && typeof endNumber !== 'number') {\n endNumber = parseInt(endNumber, 10);\n }\n\n if (isNaN(endNumber)) {\n return null;\n }\n\n return endNumber;\n};\n/**\n * Functions for calculating the range of available segments in static and dynamic\n * manifests.\n */\n\n\nvar segmentRange = {\n /**\n * Returns the entire range of available segments for a static MPD\n *\n * @param {Object} attributes\n * Inheritied MPD attributes\n * @return {{ start: number, end: number }}\n * The start and end numbers for available segments\n */\n static: function _static(attributes) {\n var duration = attributes.duration,\n _attributes$timescale = attributes.timescale,\n timescale = _attributes$timescale === void 0 ? 1 : _attributes$timescale,\n sourceDuration = attributes.sourceDuration,\n periodDuration = attributes.periodDuration;\n var endNumber = parseEndNumber(attributes.endNumber);\n var segmentDuration = duration / timescale;\n\n if (typeof endNumber === 'number') {\n return {\n start: 0,\n end: endNumber\n };\n }\n\n if (typeof periodDuration === 'number') {\n return {\n start: 0,\n end: periodDuration / segmentDuration\n };\n }\n\n return {\n start: 0,\n end: sourceDuration / segmentDuration\n };\n },\n\n /**\n * Returns the current live window range of available segments for a dynamic MPD\n *\n * @param {Object} attributes\n * Inheritied MPD attributes\n * @return {{ start: number, end: number }}\n * The start and end numbers for available segments\n */\n dynamic: function dynamic(attributes) {\n var NOW = attributes.NOW,\n clientOffset = attributes.clientOffset,\n availabilityStartTime = attributes.availabilityStartTime,\n _attributes$timescale2 = attributes.timescale,\n timescale = _attributes$timescale2 === void 0 ? 1 : _attributes$timescale2,\n duration = attributes.duration,\n _attributes$start = attributes.start,\n start = _attributes$start === void 0 ? 0 : _attributes$start,\n _attributes$minimumUp = attributes.minimumUpdatePeriod,\n minimumUpdatePeriod = _attributes$minimumUp === void 0 ? 0 : _attributes$minimumUp,\n _attributes$timeShift = attributes.timeShiftBufferDepth,\n timeShiftBufferDepth = _attributes$timeShift === void 0 ? Infinity : _attributes$timeShift;\n var endNumber = parseEndNumber(attributes.endNumber);\n var now = (NOW + clientOffset) / 1000;\n var periodStartWC = availabilityStartTime + start;\n var periodEndWC = now + minimumUpdatePeriod;\n var periodDuration = periodEndWC - periodStartWC;\n var segmentCount = Math.ceil(periodDuration * timescale / duration);\n var availableStart = Math.floor((now - periodStartWC - timeShiftBufferDepth) * timescale / duration);\n var availableEnd = Math.floor((now - periodStartWC) * timescale / duration);\n return {\n start: Math.max(0, availableStart),\n end: typeof endNumber === 'number' ? endNumber : Math.min(segmentCount, availableEnd)\n };\n }\n};\n/**\n * Maps a range of numbers to objects with information needed to build the corresponding\n * segment list\n *\n * @name toSegmentsCallback\n * @function\n * @param {number} number\n * Number of the segment\n * @param {number} index\n * Index of the number in the range list\n * @return {{ number: Number, duration: Number, timeline: Number, time: Number }}\n * Object with segment timing and duration info\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping a range of numbers to\n * information needed to build the segment list.\n *\n * @param {Object} attributes\n * Inherited MPD attributes\n * @return {toSegmentsCallback}\n * Callback map function\n */\n\nvar toSegments = function toSegments(attributes) {\n return function (number, index) {\n var duration = attributes.duration,\n _attributes$timescale3 = attributes.timescale,\n timescale = _attributes$timescale3 === void 0 ? 1 : _attributes$timescale3,\n periodIndex = attributes.periodIndex,\n _attributes$startNumb = attributes.startNumber,\n startNumber = _attributes$startNumb === void 0 ? 1 : _attributes$startNumb;\n return {\n number: startNumber + number,\n duration: duration / timescale,\n timeline: periodIndex,\n time: index * duration\n };\n };\n};\n/**\n * Returns a list of objects containing segment timing and duration info used for\n * building the list of segments. This uses the @duration attribute specified\n * in the MPD manifest to derive the range of segments.\n *\n * @param {Object} attributes\n * Inherited MPD attributes\n * @return {{number: number, duration: number, time: number, timeline: number}[]}\n * List of Objects with segment timing and duration info\n */\n\nvar parseByDuration = function parseByDuration(attributes) {\n var type = attributes.type,\n duration = attributes.duration,\n _attributes$timescale4 = attributes.timescale,\n timescale = _attributes$timescale4 === void 0 ? 1 : _attributes$timescale4,\n periodDuration = attributes.periodDuration,\n sourceDuration = attributes.sourceDuration;\n\n var _segmentRange$type = segmentRange[type](attributes),\n start = _segmentRange$type.start,\n end = _segmentRange$type.end;\n\n var segments = range(start, end).map(toSegments(attributes));\n\n if (type === 'static') {\n var index = segments.length - 1; // section is either a period or the full source\n\n var sectionDuration = typeof periodDuration === 'number' ? periodDuration : sourceDuration; // final segment may be less than full segment duration\n\n segments[index].duration = sectionDuration - duration / timescale * index;\n }\n\n return segments;\n};\n\n/**\n * Translates SegmentBase into a set of segments.\n * (DASH SPEC Section 5.3.9.3.2) contains a set of nodes. Each\n * node should be translated into segment.\n *\n * @param {Object} attributes\n * Object containing all inherited attributes from parent elements with attribute\n * names as keys\n * @return {Object.} list of segments\n */\n\nvar segmentsFromBase = function segmentsFromBase(attributes) {\n var baseUrl = attributes.baseUrl,\n _attributes$initializ = attributes.initialization,\n initialization = _attributes$initializ === void 0 ? {} : _attributes$initializ,\n sourceDuration = attributes.sourceDuration,\n _attributes$indexRang = attributes.indexRange,\n indexRange = _attributes$indexRang === void 0 ? '' : _attributes$indexRang,\n duration = attributes.duration; // base url is required for SegmentBase to work, per spec (Section 5.3.9.2.1)\n\n if (!baseUrl) {\n throw new Error(errors.NO_BASE_URL);\n }\n\n var initSegment = urlTypeToSegment({\n baseUrl: baseUrl,\n source: initialization.sourceURL,\n range: initialization.range\n });\n var segment = urlTypeToSegment({\n baseUrl: baseUrl,\n source: baseUrl,\n indexRange: indexRange\n });\n segment.map = initSegment; // If there is a duration, use it, otherwise use the given duration of the source\n // (since SegmentBase is only for one total segment)\n\n if (duration) {\n var segmentTimeInfo = parseByDuration(attributes);\n\n if (segmentTimeInfo.length) {\n segment.duration = segmentTimeInfo[0].duration;\n segment.timeline = segmentTimeInfo[0].timeline;\n }\n } else if (sourceDuration) {\n segment.duration = sourceDuration;\n segment.timeline = 0;\n } // This is used for mediaSequence\n\n\n segment.number = 0;\n return [segment];\n};\n/**\n * Given a playlist, a sidx box, and a baseUrl, update the segment list of the playlist\n * according to the sidx information given.\n *\n * playlist.sidx has metadadata about the sidx where-as the sidx param\n * is the parsed sidx box itself.\n *\n * @param {Object} playlist the playlist to update the sidx information for\n * @param {Object} sidx the parsed sidx box\n * @return {Object} the playlist object with the updated sidx information\n */\n\nvar addSidxSegmentsToPlaylist = function addSidxSegmentsToPlaylist(playlist, sidx, baseUrl) {\n // Retain init segment information\n var initSegment = playlist.sidx.map ? playlist.sidx.map : null; // Retain source duration from initial main manifest parsing\n\n var sourceDuration = playlist.sidx.duration; // Retain source timeline\n\n var timeline = playlist.timeline || 0;\n var sidxByteRange = playlist.sidx.byterange;\n var sidxEnd = sidxByteRange.offset + sidxByteRange.length; // Retain timescale of the parsed sidx\n\n var timescale = sidx.timescale; // referenceType 1 refers to other sidx boxes\n\n var mediaReferences = sidx.references.filter(function (r) {\n return r.referenceType !== 1;\n });\n var segments = [];\n var type = playlist.endList ? 'static' : 'dynamic'; // firstOffset is the offset from the end of the sidx box\n\n var startIndex = sidxEnd + sidx.firstOffset;\n\n for (var i = 0; i < mediaReferences.length; i++) {\n var reference = sidx.references[i]; // size of the referenced (sub)segment\n\n var size = reference.referencedSize; // duration of the referenced (sub)segment, in the timescale\n // this will be converted to seconds when generating segments\n\n var duration = reference.subsegmentDuration; // should be an inclusive range\n\n var endIndex = startIndex + size - 1;\n var indexRange = startIndex + \"-\" + endIndex;\n var attributes = {\n baseUrl: baseUrl,\n timescale: timescale,\n timeline: timeline,\n // this is used in parseByDuration\n periodIndex: timeline,\n duration: duration,\n sourceDuration: sourceDuration,\n indexRange: indexRange,\n type: type\n };\n var segment = segmentsFromBase(attributes)[0];\n\n if (initSegment) {\n segment.map = initSegment;\n }\n\n segments.push(segment);\n startIndex += size;\n }\n\n playlist.segments = segments;\n return playlist;\n};\n\nvar generateSidxKey = function generateSidxKey(sidx) {\n return sidx && sidx.uri + '-' + byteRangeToString(sidx.byterange);\n};\n\nvar mergeDiscontiguousPlaylists = function mergeDiscontiguousPlaylists(playlists) {\n var mergedPlaylists = values(playlists.reduce(function (acc, playlist) {\n // assuming playlist IDs are the same across periods\n // TODO: handle multiperiod where representation sets are not the same\n // across periods\n var name = playlist.attributes.id + (playlist.attributes.lang || ''); // Periods after first\n\n if (acc[name]) {\n var _acc$name$segments;\n\n // first segment of subsequent periods signal a discontinuity\n if (playlist.segments[0]) {\n playlist.segments[0].discontinuity = true;\n }\n\n (_acc$name$segments = acc[name].segments).push.apply(_acc$name$segments, playlist.segments); // bubble up contentProtection, this assumes all DRM content\n // has the same contentProtection\n\n\n if (playlist.attributes.contentProtection) {\n acc[name].attributes.contentProtection = playlist.attributes.contentProtection;\n }\n } else {\n // first Period\n acc[name] = playlist;\n }\n\n return acc;\n }, {}));\n return mergedPlaylists.map(function (playlist) {\n playlist.discontinuityStarts = findIndexes(playlist.segments, 'discontinuity');\n return playlist;\n });\n};\n\nvar addSidxSegmentsToPlaylist$1 = function addSidxSegmentsToPlaylist$1(playlist, sidxMapping) {\n var sidxKey = generateSidxKey(playlist.sidx);\n var sidxMatch = sidxKey && sidxMapping[sidxKey] && sidxMapping[sidxKey].sidx;\n\n if (sidxMatch) {\n addSidxSegmentsToPlaylist(playlist, sidxMatch, playlist.sidx.resolvedUri);\n }\n\n return playlist;\n};\nvar addSidxSegmentsToPlaylists = function addSidxSegmentsToPlaylists(playlists, sidxMapping) {\n if (sidxMapping === void 0) {\n sidxMapping = {};\n }\n\n if (!Object.keys(sidxMapping).length) {\n return playlists;\n }\n\n for (var i in playlists) {\n playlists[i] = addSidxSegmentsToPlaylist$1(playlists[i], sidxMapping);\n }\n\n return playlists;\n};\nvar formatAudioPlaylist = function formatAudioPlaylist(_ref, isAudioOnly) {\n var _attributes;\n\n var attributes = _ref.attributes,\n segments = _ref.segments,\n sidx = _ref.sidx;\n var playlist = {\n attributes: (_attributes = {\n NAME: attributes.id,\n BANDWIDTH: attributes.bandwidth,\n CODECS: attributes.codecs\n }, _attributes['PROGRAM-ID'] = 1, _attributes),\n uri: '',\n endList: attributes.type === 'static',\n timeline: attributes.periodIndex,\n resolvedUri: '',\n targetDuration: attributes.duration,\n segments: segments,\n mediaSequence: segments.length ? segments[0].number : 1\n };\n\n if (attributes.contentProtection) {\n playlist.contentProtection = attributes.contentProtection;\n }\n\n if (sidx) {\n playlist.sidx = sidx;\n }\n\n if (isAudioOnly) {\n playlist.attributes.AUDIO = 'audio';\n playlist.attributes.SUBTITLES = 'subs';\n }\n\n return playlist;\n};\nvar formatVttPlaylist = function formatVttPlaylist(_ref2) {\n var _m3u8Attributes;\n\n var attributes = _ref2.attributes,\n segments = _ref2.segments;\n\n if (typeof segments === 'undefined') {\n // vtt tracks may use single file in BaseURL\n segments = [{\n uri: attributes.baseUrl,\n timeline: attributes.periodIndex,\n resolvedUri: attributes.baseUrl || '',\n duration: attributes.sourceDuration,\n number: 0\n }]; // targetDuration should be the same duration as the only segment\n\n attributes.duration = attributes.sourceDuration;\n }\n\n var m3u8Attributes = (_m3u8Attributes = {\n NAME: attributes.id,\n BANDWIDTH: attributes.bandwidth\n }, _m3u8Attributes['PROGRAM-ID'] = 1, _m3u8Attributes);\n\n if (attributes.codecs) {\n m3u8Attributes.CODECS = attributes.codecs;\n }\n\n return {\n attributes: m3u8Attributes,\n uri: '',\n endList: attributes.type === 'static',\n timeline: attributes.periodIndex,\n resolvedUri: attributes.baseUrl || '',\n targetDuration: attributes.duration,\n segments: segments,\n mediaSequence: segments.length ? segments[0].number : 1\n };\n};\nvar organizeAudioPlaylists = function organizeAudioPlaylists(playlists, sidxMapping, isAudioOnly) {\n if (sidxMapping === void 0) {\n sidxMapping = {};\n }\n\n if (isAudioOnly === void 0) {\n isAudioOnly = false;\n }\n\n var mainPlaylist;\n var formattedPlaylists = playlists.reduce(function (a, playlist) {\n var role = playlist.attributes.role && playlist.attributes.role.value || '';\n var language = playlist.attributes.lang || '';\n var label = playlist.attributes.label || 'main';\n\n if (language && !playlist.attributes.label) {\n var roleLabel = role ? \" (\" + role + \")\" : '';\n label = \"\" + playlist.attributes.lang + roleLabel;\n }\n\n if (!a[label]) {\n a[label] = {\n language: language,\n autoselect: true,\n default: role === 'main',\n playlists: [],\n uri: ''\n };\n }\n\n var formatted = addSidxSegmentsToPlaylist$1(formatAudioPlaylist(playlist, isAudioOnly), sidxMapping);\n a[label].playlists.push(formatted);\n\n if (typeof mainPlaylist === 'undefined' && role === 'main') {\n mainPlaylist = playlist;\n mainPlaylist.default = true;\n }\n\n return a;\n }, {}); // if no playlists have role \"main\", mark the first as main\n\n if (!mainPlaylist) {\n var firstLabel = Object.keys(formattedPlaylists)[0];\n formattedPlaylists[firstLabel].default = true;\n }\n\n return formattedPlaylists;\n};\nvar organizeVttPlaylists = function organizeVttPlaylists(playlists, sidxMapping) {\n if (sidxMapping === void 0) {\n sidxMapping = {};\n }\n\n return playlists.reduce(function (a, playlist) {\n var label = playlist.attributes.lang || 'text';\n\n if (!a[label]) {\n a[label] = {\n language: label,\n default: false,\n autoselect: false,\n playlists: [],\n uri: ''\n };\n }\n\n a[label].playlists.push(addSidxSegmentsToPlaylist$1(formatVttPlaylist(playlist), sidxMapping));\n return a;\n }, {});\n};\n\nvar organizeCaptionServices = function organizeCaptionServices(captionServices) {\n return captionServices.reduce(function (svcObj, svc) {\n if (!svc) {\n return svcObj;\n }\n\n svc.forEach(function (service) {\n var channel = service.channel,\n language = service.language;\n svcObj[language] = {\n autoselect: false,\n default: false,\n instreamId: channel,\n language: language\n };\n\n if (service.hasOwnProperty('aspectRatio')) {\n svcObj[language].aspectRatio = service.aspectRatio;\n }\n\n if (service.hasOwnProperty('easyReader')) {\n svcObj[language].easyReader = service.easyReader;\n }\n\n if (service.hasOwnProperty('3D')) {\n svcObj[language]['3D'] = service['3D'];\n }\n });\n return svcObj;\n }, {});\n};\n\nvar formatVideoPlaylist = function formatVideoPlaylist(_ref3) {\n var _attributes2;\n\n var attributes = _ref3.attributes,\n segments = _ref3.segments,\n sidx = _ref3.sidx;\n var playlist = {\n attributes: (_attributes2 = {\n NAME: attributes.id,\n AUDIO: 'audio',\n SUBTITLES: 'subs',\n RESOLUTION: {\n width: attributes.width,\n height: attributes.height\n },\n CODECS: attributes.codecs,\n BANDWIDTH: attributes.bandwidth\n }, _attributes2['PROGRAM-ID'] = 1, _attributes2),\n uri: '',\n endList: attributes.type === 'static',\n timeline: attributes.periodIndex,\n resolvedUri: '',\n targetDuration: attributes.duration,\n segments: segments,\n mediaSequence: segments.length ? segments[0].number : 1\n };\n\n if (attributes.contentProtection) {\n playlist.contentProtection = attributes.contentProtection;\n }\n\n if (sidx) {\n playlist.sidx = sidx;\n }\n\n return playlist;\n};\n\nvar videoOnly = function videoOnly(_ref4) {\n var attributes = _ref4.attributes;\n return attributes.mimeType === 'video/mp4' || attributes.mimeType === 'video/webm' || attributes.contentType === 'video';\n};\n\nvar audioOnly = function audioOnly(_ref5) {\n var attributes = _ref5.attributes;\n return attributes.mimeType === 'audio/mp4' || attributes.mimeType === 'audio/webm' || attributes.contentType === 'audio';\n};\n\nvar vttOnly = function vttOnly(_ref6) {\n var attributes = _ref6.attributes;\n return attributes.mimeType === 'text/vtt' || attributes.contentType === 'text';\n};\n\nvar toM3u8 = function toM3u8(dashPlaylists, locations, sidxMapping) {\n var _mediaGroups;\n\n if (sidxMapping === void 0) {\n sidxMapping = {};\n }\n\n if (!dashPlaylists.length) {\n return {};\n } // grab all main manifest attributes\n\n\n var _dashPlaylists$0$attr = dashPlaylists[0].attributes,\n duration = _dashPlaylists$0$attr.sourceDuration,\n type = _dashPlaylists$0$attr.type,\n suggestedPresentationDelay = _dashPlaylists$0$attr.suggestedPresentationDelay,\n minimumUpdatePeriod = _dashPlaylists$0$attr.minimumUpdatePeriod;\n var videoPlaylists = mergeDiscontiguousPlaylists(dashPlaylists.filter(videoOnly)).map(formatVideoPlaylist);\n var audioPlaylists = mergeDiscontiguousPlaylists(dashPlaylists.filter(audioOnly));\n var vttPlaylists = dashPlaylists.filter(vttOnly);\n var captions = dashPlaylists.map(function (playlist) {\n return playlist.attributes.captionServices;\n }).filter(Boolean);\n var manifest = {\n allowCache: true,\n discontinuityStarts: [],\n segments: [],\n endList: true,\n mediaGroups: (_mediaGroups = {\n AUDIO: {},\n VIDEO: {}\n }, _mediaGroups['CLOSED-CAPTIONS'] = {}, _mediaGroups.SUBTITLES = {}, _mediaGroups),\n uri: '',\n duration: duration,\n playlists: addSidxSegmentsToPlaylists(videoPlaylists, sidxMapping)\n };\n\n if (minimumUpdatePeriod >= 0) {\n manifest.minimumUpdatePeriod = minimumUpdatePeriod * 1000;\n }\n\n if (locations) {\n manifest.locations = locations;\n }\n\n if (type === 'dynamic') {\n manifest.suggestedPresentationDelay = suggestedPresentationDelay;\n }\n\n var isAudioOnly = manifest.playlists.length === 0;\n\n if (audioPlaylists.length) {\n manifest.mediaGroups.AUDIO.audio = organizeAudioPlaylists(audioPlaylists, sidxMapping, isAudioOnly);\n }\n\n if (vttPlaylists.length) {\n manifest.mediaGroups.SUBTITLES.subs = organizeVttPlaylists(vttPlaylists, sidxMapping);\n }\n\n if (captions.length) {\n manifest.mediaGroups['CLOSED-CAPTIONS'].cc = organizeCaptionServices(captions);\n }\n\n return manifest;\n};\n\n/**\n * Calculates the R (repetition) value for a live stream (for the final segment\n * in a manifest where the r value is negative 1)\n *\n * @param {Object} attributes\n * Object containing all inherited attributes from parent elements with attribute\n * names as keys\n * @param {number} time\n * current time (typically the total time up until the final segment)\n * @param {number} duration\n * duration property for the given \n *\n * @return {number}\n * R value to reach the end of the given period\n */\nvar getLiveRValue = function getLiveRValue(attributes, time, duration) {\n var NOW = attributes.NOW,\n clientOffset = attributes.clientOffset,\n availabilityStartTime = attributes.availabilityStartTime,\n _attributes$timescale = attributes.timescale,\n timescale = _attributes$timescale === void 0 ? 1 : _attributes$timescale,\n _attributes$start = attributes.start,\n start = _attributes$start === void 0 ? 0 : _attributes$start,\n _attributes$minimumUp = attributes.minimumUpdatePeriod,\n minimumUpdatePeriod = _attributes$minimumUp === void 0 ? 0 : _attributes$minimumUp;\n var now = (NOW + clientOffset) / 1000;\n var periodStartWC = availabilityStartTime + start;\n var periodEndWC = now + minimumUpdatePeriod;\n var periodDuration = periodEndWC - periodStartWC;\n return Math.ceil((periodDuration * timescale - time) / duration);\n};\n/**\n * Uses information provided by SegmentTemplate.SegmentTimeline to determine segment\n * timing and duration\n *\n * @param {Object} attributes\n * Object containing all inherited attributes from parent elements with attribute\n * names as keys\n * @param {Object[]} segmentTimeline\n * List of objects representing the attributes of each S element contained within\n *\n * @return {{number: number, duration: number, time: number, timeline: number}[]}\n * List of Objects with segment timing and duration info\n */\n\n\nvar parseByTimeline = function parseByTimeline(attributes, segmentTimeline) {\n var type = attributes.type,\n _attributes$minimumUp2 = attributes.minimumUpdatePeriod,\n minimumUpdatePeriod = _attributes$minimumUp2 === void 0 ? 0 : _attributes$minimumUp2,\n _attributes$media = attributes.media,\n media = _attributes$media === void 0 ? '' : _attributes$media,\n sourceDuration = attributes.sourceDuration,\n _attributes$timescale2 = attributes.timescale,\n timescale = _attributes$timescale2 === void 0 ? 1 : _attributes$timescale2,\n _attributes$startNumb = attributes.startNumber,\n startNumber = _attributes$startNumb === void 0 ? 1 : _attributes$startNumb,\n timeline = attributes.periodIndex;\n var segments = [];\n var time = -1;\n\n for (var sIndex = 0; sIndex < segmentTimeline.length; sIndex++) {\n var S = segmentTimeline[sIndex];\n var duration = S.d;\n var repeat = S.r || 0;\n var segmentTime = S.t || 0;\n\n if (time < 0) {\n // first segment\n time = segmentTime;\n }\n\n if (segmentTime && segmentTime > time) {\n // discontinuity\n // TODO: How to handle this type of discontinuity\n // timeline++ here would treat it like HLS discontuity and content would\n // get appended without gap\n // E.G.\n // \n // \n // \n // \n // would have $Time$ values of [0, 1, 2, 5]\n // should this be appened at time positions [0, 1, 2, 3],(#EXT-X-DISCONTINUITY)\n // or [0, 1, 2, gap, gap, 5]? (#EXT-X-GAP)\n // does the value of sourceDuration consider this when calculating arbitrary\n // negative @r repeat value?\n // E.G. Same elements as above with this added at the end\n // \n // with a sourceDuration of 10\n // Would the 2 gaps be included in the time duration calculations resulting in\n // 8 segments with $Time$ values of [0, 1, 2, 5, 6, 7, 8, 9] or 10 segments\n // with $Time$ values of [0, 1, 2, 5, 6, 7, 8, 9, 10, 11] ?\n time = segmentTime;\n }\n\n var count = void 0;\n\n if (repeat < 0) {\n var nextS = sIndex + 1;\n\n if (nextS === segmentTimeline.length) {\n // last segment\n if (type === 'dynamic' && minimumUpdatePeriod > 0 && media.indexOf('$Number$') > 0) {\n count = getLiveRValue(attributes, time, duration);\n } else {\n // TODO: This may be incorrect depending on conclusion of TODO above\n count = (sourceDuration * timescale - time) / duration;\n }\n } else {\n count = (segmentTimeline[nextS].t - time) / duration;\n }\n } else {\n count = repeat + 1;\n }\n\n var end = startNumber + segments.length + count;\n var number = startNumber + segments.length;\n\n while (number < end) {\n segments.push({\n number: number,\n duration: duration / timescale,\n time: time,\n timeline: timeline\n });\n time += duration;\n number++;\n }\n }\n\n return segments;\n};\n\nvar identifierPattern = /\\$([A-z]*)(?:(%0)([0-9]+)d)?\\$/g;\n/**\n * Replaces template identifiers with corresponding values. To be used as the callback\n * for String.prototype.replace\n *\n * @name replaceCallback\n * @function\n * @param {string} match\n * Entire match of identifier\n * @param {string} identifier\n * Name of matched identifier\n * @param {string} format\n * Format tag string. Its presence indicates that padding is expected\n * @param {string} width\n * Desired length of the replaced value. Values less than this width shall be left\n * zero padded\n * @return {string}\n * Replacement for the matched identifier\n */\n\n/**\n * Returns a function to be used as a callback for String.prototype.replace to replace\n * template identifiers\n *\n * @param {Obect} values\n * Object containing values that shall be used to replace known identifiers\n * @param {number} values.RepresentationID\n * Value of the Representation@id attribute\n * @param {number} values.Number\n * Number of the corresponding segment\n * @param {number} values.Bandwidth\n * Value of the Representation@bandwidth attribute.\n * @param {number} values.Time\n * Timestamp value of the corresponding segment\n * @return {replaceCallback}\n * Callback to be used with String.prototype.replace to replace identifiers\n */\n\nvar identifierReplacement = function identifierReplacement(values) {\n return function (match, identifier, format, width) {\n if (match === '$$') {\n // escape sequence\n return '$';\n }\n\n if (typeof values[identifier] === 'undefined') {\n return match;\n }\n\n var value = '' + values[identifier];\n\n if (identifier === 'RepresentationID') {\n // Format tag shall not be present with RepresentationID\n return value;\n }\n\n if (!format) {\n width = 1;\n } else {\n width = parseInt(width, 10);\n }\n\n if (value.length >= width) {\n return value;\n }\n\n return \"\" + new Array(width - value.length + 1).join('0') + value;\n };\n};\n/**\n * Constructs a segment url from a template string\n *\n * @param {string} url\n * Template string to construct url from\n * @param {Obect} values\n * Object containing values that shall be used to replace known identifiers\n * @param {number} values.RepresentationID\n * Value of the Representation@id attribute\n * @param {number} values.Number\n * Number of the corresponding segment\n * @param {number} values.Bandwidth\n * Value of the Representation@bandwidth attribute.\n * @param {number} values.Time\n * Timestamp value of the corresponding segment\n * @return {string}\n * Segment url with identifiers replaced\n */\n\nvar constructTemplateUrl = function constructTemplateUrl(url, values) {\n return url.replace(identifierPattern, identifierReplacement(values));\n};\n/**\n * Generates a list of objects containing timing and duration information about each\n * segment needed to generate segment uris and the complete segment object\n *\n * @param {Object} attributes\n * Object containing all inherited attributes from parent elements with attribute\n * names as keys\n * @param {Object[]|undefined} segmentTimeline\n * List of objects representing the attributes of each S element contained within\n * the SegmentTimeline element\n * @return {{number: number, duration: number, time: number, timeline: number}[]}\n * List of Objects with segment timing and duration info\n */\n\nvar parseTemplateInfo = function parseTemplateInfo(attributes, segmentTimeline) {\n if (!attributes.duration && !segmentTimeline) {\n // if neither @duration or SegmentTimeline are present, then there shall be exactly\n // one media segment\n return [{\n number: attributes.startNumber || 1,\n duration: attributes.sourceDuration,\n time: 0,\n timeline: attributes.periodIndex\n }];\n }\n\n if (attributes.duration) {\n return parseByDuration(attributes);\n }\n\n return parseByTimeline(attributes, segmentTimeline);\n};\n/**\n * Generates a list of segments using information provided by the SegmentTemplate element\n *\n * @param {Object} attributes\n * Object containing all inherited attributes from parent elements with attribute\n * names as keys\n * @param {Object[]|undefined} segmentTimeline\n * List of objects representing the attributes of each S element contained within\n * the SegmentTimeline element\n * @return {Object[]}\n * List of segment objects\n */\n\nvar segmentsFromTemplate = function segmentsFromTemplate(attributes, segmentTimeline) {\n var templateValues = {\n RepresentationID: attributes.id,\n Bandwidth: attributes.bandwidth || 0\n };\n var _attributes$initializ = attributes.initialization,\n initialization = _attributes$initializ === void 0 ? {\n sourceURL: '',\n range: ''\n } : _attributes$initializ;\n var mapSegment = urlTypeToSegment({\n baseUrl: attributes.baseUrl,\n source: constructTemplateUrl(initialization.sourceURL, templateValues),\n range: initialization.range\n });\n var segments = parseTemplateInfo(attributes, segmentTimeline);\n return segments.map(function (segment) {\n templateValues.Number = segment.number;\n templateValues.Time = segment.time;\n var uri = constructTemplateUrl(attributes.media || '', templateValues); // See DASH spec section 5.3.9.2.2\n // - if timescale isn't present on any level, default to 1.\n\n var timescale = attributes.timescale || 1; // - if presentationTimeOffset isn't present on any level, default to 0\n\n var presentationTimeOffset = attributes.presentationTimeOffset || 0;\n var presentationTime = // Even if the @t attribute is not specified for the segment, segment.time is\n // calculated in mpd-parser prior to this, so it's assumed to be available.\n attributes.periodStart + (segment.time - presentationTimeOffset) / timescale;\n var map = {\n uri: uri,\n timeline: segment.timeline,\n duration: segment.duration,\n resolvedUri: resolveUrl(attributes.baseUrl || '', uri),\n map: mapSegment,\n number: segment.number,\n presentationTime: presentationTime\n };\n return map;\n });\n};\n\n/**\n * Converts a (of type URLType from the DASH spec 5.3.9.2 Table 14)\n * to an object that matches the output of a segment in videojs/mpd-parser\n *\n * @param {Object} attributes\n * Object containing all inherited attributes from parent elements with attribute\n * names as keys\n * @param {Object} segmentUrl\n * node to translate into a segment object\n * @return {Object} translated segment object\n */\n\nvar SegmentURLToSegmentObject = function SegmentURLToSegmentObject(attributes, segmentUrl) {\n var baseUrl = attributes.baseUrl,\n _attributes$initializ = attributes.initialization,\n initialization = _attributes$initializ === void 0 ? {} : _attributes$initializ;\n var initSegment = urlTypeToSegment({\n baseUrl: baseUrl,\n source: initialization.sourceURL,\n range: initialization.range\n });\n var segment = urlTypeToSegment({\n baseUrl: baseUrl,\n source: segmentUrl.media,\n range: segmentUrl.mediaRange\n });\n segment.map = initSegment;\n return segment;\n};\n/**\n * Generates a list of segments using information provided by the SegmentList element\n * SegmentList (DASH SPEC Section 5.3.9.3.2) contains a set of nodes. Each\n * node should be translated into segment.\n *\n * @param {Object} attributes\n * Object containing all inherited attributes from parent elements with attribute\n * names as keys\n * @param {Object[]|undefined} segmentTimeline\n * List of objects representing the attributes of each S element contained within\n * the SegmentTimeline element\n * @return {Object.} list of segments\n */\n\n\nvar segmentsFromList = function segmentsFromList(attributes, segmentTimeline) {\n var duration = attributes.duration,\n _attributes$segmentUr = attributes.segmentUrls,\n segmentUrls = _attributes$segmentUr === void 0 ? [] : _attributes$segmentUr,\n periodStart = attributes.periodStart; // Per spec (5.3.9.2.1) no way to determine segment duration OR\n // if both SegmentTimeline and @duration are defined, it is outside of spec.\n\n if (!duration && !segmentTimeline || duration && segmentTimeline) {\n throw new Error(errors.SEGMENT_TIME_UNSPECIFIED);\n }\n\n var segmentUrlMap = segmentUrls.map(function (segmentUrlObject) {\n return SegmentURLToSegmentObject(attributes, segmentUrlObject);\n });\n var segmentTimeInfo;\n\n if (duration) {\n segmentTimeInfo = parseByDuration(attributes);\n }\n\n if (segmentTimeline) {\n segmentTimeInfo = parseByTimeline(attributes, segmentTimeline);\n }\n\n var segments = segmentTimeInfo.map(function (segmentTime, index) {\n if (segmentUrlMap[index]) {\n var segment = segmentUrlMap[index]; // See DASH spec section 5.3.9.2.2\n // - if timescale isn't present on any level, default to 1.\n\n var timescale = attributes.timescale || 1; // - if presentationTimeOffset isn't present on any level, default to 0\n\n var presentationTimeOffset = attributes.presentationTimeOffset || 0;\n segment.timeline = segmentTime.timeline;\n segment.duration = segmentTime.duration;\n segment.number = segmentTime.number;\n segment.presentationTime = periodStart + (segmentTime.time - presentationTimeOffset) / timescale;\n return segment;\n } // Since we're mapping we should get rid of any blank segments (in case\n // the given SegmentTimeline is handling for more elements than we have\n // SegmentURLs for).\n\n }).filter(function (segment) {\n return segment;\n });\n return segments;\n};\n\nvar generateSegments = function generateSegments(_ref) {\n var attributes = _ref.attributes,\n segmentInfo = _ref.segmentInfo;\n var segmentAttributes;\n var segmentsFn;\n\n if (segmentInfo.template) {\n segmentsFn = segmentsFromTemplate;\n segmentAttributes = merge(attributes, segmentInfo.template);\n } else if (segmentInfo.base) {\n segmentsFn = segmentsFromBase;\n segmentAttributes = merge(attributes, segmentInfo.base);\n } else if (segmentInfo.list) {\n segmentsFn = segmentsFromList;\n segmentAttributes = merge(attributes, segmentInfo.list);\n }\n\n var segmentsInfo = {\n attributes: attributes\n };\n\n if (!segmentsFn) {\n return segmentsInfo;\n }\n\n var segments = segmentsFn(segmentAttributes, segmentInfo.segmentTimeline); // The @duration attribute will be used to determin the playlist's targetDuration which\n // must be in seconds. Since we've generated the segment list, we no longer need\n // @duration to be in @timescale units, so we can convert it here.\n\n if (segmentAttributes.duration) {\n var _segmentAttributes = segmentAttributes,\n duration = _segmentAttributes.duration,\n _segmentAttributes$ti = _segmentAttributes.timescale,\n timescale = _segmentAttributes$ti === void 0 ? 1 : _segmentAttributes$ti;\n segmentAttributes.duration = duration / timescale;\n } else if (segments.length) {\n // if there is no @duration attribute, use the largest segment duration as\n // as target duration\n segmentAttributes.duration = segments.reduce(function (max, segment) {\n return Math.max(max, Math.ceil(segment.duration));\n }, 0);\n } else {\n segmentAttributes.duration = 0;\n }\n\n segmentsInfo.attributes = segmentAttributes;\n segmentsInfo.segments = segments; // This is a sidx box without actual segment information\n\n if (segmentInfo.base && segmentAttributes.indexRange) {\n segmentsInfo.sidx = segments[0];\n segmentsInfo.segments = [];\n }\n\n return segmentsInfo;\n};\nvar toPlaylists = function toPlaylists(representations) {\n return representations.map(generateSegments);\n};\n\nvar findChildren = function findChildren(element, name) {\n return from(element.childNodes).filter(function (_ref) {\n var tagName = _ref.tagName;\n return tagName === name;\n });\n};\nvar getContent = function getContent(element) {\n return element.textContent.trim();\n};\n\nvar parseDuration = function parseDuration(str) {\n var SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n var SECONDS_IN_MONTH = 30 * 24 * 60 * 60;\n var SECONDS_IN_DAY = 24 * 60 * 60;\n var SECONDS_IN_HOUR = 60 * 60;\n var SECONDS_IN_MIN = 60; // P10Y10M10DT10H10M10.1S\n\n var durationRegex = /P(?:(\\d*)Y)?(?:(\\d*)M)?(?:(\\d*)D)?(?:T(?:(\\d*)H)?(?:(\\d*)M)?(?:([\\d.]*)S)?)?/;\n var match = durationRegex.exec(str);\n\n if (!match) {\n return 0;\n }\n\n var _match$slice = match.slice(1),\n year = _match$slice[0],\n month = _match$slice[1],\n day = _match$slice[2],\n hour = _match$slice[3],\n minute = _match$slice[4],\n second = _match$slice[5];\n\n return parseFloat(year || 0) * SECONDS_IN_YEAR + parseFloat(month || 0) * SECONDS_IN_MONTH + parseFloat(day || 0) * SECONDS_IN_DAY + parseFloat(hour || 0) * SECONDS_IN_HOUR + parseFloat(minute || 0) * SECONDS_IN_MIN + parseFloat(second || 0);\n};\nvar parseDate = function parseDate(str) {\n // Date format without timezone according to ISO 8601\n // YYY-MM-DDThh:mm:ss.ssssss\n var dateRegex = /^\\d+-\\d+-\\d+T\\d+:\\d+:\\d+(\\.\\d+)?$/; // If the date string does not specifiy a timezone, we must specifiy UTC. This is\n // expressed by ending with 'Z'\n\n if (dateRegex.test(str)) {\n str += 'Z';\n }\n\n return Date.parse(str);\n};\n\nvar parsers = {\n /**\n * Specifies the duration of the entire Media Presentation. Format is a duration string\n * as specified in ISO 8601\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The duration in seconds\n */\n mediaPresentationDuration: function mediaPresentationDuration(value) {\n return parseDuration(value);\n },\n\n /**\n * Specifies the Segment availability start time for all Segments referred to in this\n * MPD. For a dynamic manifest, it specifies the anchor for the earliest availability\n * time. Format is a date string as specified in ISO 8601\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The date as seconds from unix epoch\n */\n availabilityStartTime: function availabilityStartTime(value) {\n return parseDate(value) / 1000;\n },\n\n /**\n * Specifies the smallest period between potential changes to the MPD. Format is a\n * duration string as specified in ISO 8601\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The duration in seconds\n */\n minimumUpdatePeriod: function minimumUpdatePeriod(value) {\n return parseDuration(value);\n },\n\n /**\n * Specifies the suggested presentation delay. Format is a\n * duration string as specified in ISO 8601\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The duration in seconds\n */\n suggestedPresentationDelay: function suggestedPresentationDelay(value) {\n return parseDuration(value);\n },\n\n /**\n * specifices the type of mpd. Can be either \"static\" or \"dynamic\"\n *\n * @param {string} value\n * value of attribute as a string\n *\n * @return {string}\n * The type as a string\n */\n type: function type(value) {\n return value;\n },\n\n /**\n * Specifies the duration of the smallest time shifting buffer for any Representation\n * in the MPD. Format is a duration string as specified in ISO 8601\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The duration in seconds\n */\n timeShiftBufferDepth: function timeShiftBufferDepth(value) {\n return parseDuration(value);\n },\n\n /**\n * Specifies the PeriodStart time of the Period relative to the availabilityStarttime.\n * Format is a duration string as specified in ISO 8601\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The duration in seconds\n */\n start: function start(value) {\n return parseDuration(value);\n },\n\n /**\n * Specifies the width of the visual presentation\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed width\n */\n width: function width(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the height of the visual presentation\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed height\n */\n height: function height(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the bitrate of the representation\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed bandwidth\n */\n bandwidth: function bandwidth(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the number of the first Media Segment in this Representation in the Period\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed number\n */\n startNumber: function startNumber(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the timescale in units per seconds\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed timescale\n */\n timescale: function timescale(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the presentationTimeOffset.\n *\n * @param {string} value\n * value of the attribute as a string\n *\n * @return {number}\n * The parsed presentationTimeOffset\n */\n presentationTimeOffset: function presentationTimeOffset(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the constant approximate Segment duration\n * NOTE: The element also contains an @duration attribute. This duration\n * specifies the duration of the Period. This attribute is currently not\n * supported by the rest of the parser, however we still check for it to prevent\n * errors.\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed duration\n */\n duration: function duration(value) {\n var parsedValue = parseInt(value, 10);\n\n if (isNaN(parsedValue)) {\n return parseDuration(value);\n }\n\n return parsedValue;\n },\n\n /**\n * Specifies the Segment duration, in units of the value of the @timescale.\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed duration\n */\n d: function d(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the MPD start time, in @timescale units, the first Segment in the series\n * starts relative to the beginning of the Period\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed time\n */\n t: function t(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Specifies the repeat count of the number of following contiguous Segments with the\n * same duration expressed by the value of @d\n *\n * @param {string} value\n * value of attribute as a string\n * @return {number}\n * The parsed number\n */\n r: function r(value) {\n return parseInt(value, 10);\n },\n\n /**\n * Default parser for all other attributes. Acts as a no-op and just returns the value\n * as a string\n *\n * @param {string} value\n * value of attribute as a string\n * @return {string}\n * Unparsed value\n */\n DEFAULT: function DEFAULT(value) {\n return value;\n }\n};\n/**\n * Gets all the attributes and values of the provided node, parses attributes with known\n * types, and returns an object with attribute names mapped to values.\n *\n * @param {Node} el\n * The node to parse attributes from\n * @return {Object}\n * Object with all attributes of el parsed\n */\n\nvar parseAttributes = function parseAttributes(el) {\n if (!(el && el.attributes)) {\n return {};\n }\n\n return from(el.attributes).reduce(function (a, e) {\n var parseFn = parsers[e.name] || parsers.DEFAULT;\n a[e.name] = parseFn(e.value);\n return a;\n }, {});\n};\n\nvar keySystemsMap = {\n 'urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b': 'org.w3.clearkey',\n 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed': 'com.widevine.alpha',\n 'urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95': 'com.microsoft.playready',\n 'urn:uuid:f239e769-efa3-4850-9c16-a903c6932efb': 'com.adobe.primetime'\n};\n/**\n * Builds a list of urls that is the product of the reference urls and BaseURL values\n *\n * @param {string[]} referenceUrls\n * List of reference urls to resolve to\n * @param {Node[]} baseUrlElements\n * List of BaseURL nodes from the mpd\n * @return {string[]}\n * List of resolved urls\n */\n\nvar buildBaseUrls = function buildBaseUrls(referenceUrls, baseUrlElements) {\n if (!baseUrlElements.length) {\n return referenceUrls;\n }\n\n return flatten(referenceUrls.map(function (reference) {\n return baseUrlElements.map(function (baseUrlElement) {\n return resolveUrl(reference, getContent(baseUrlElement));\n });\n }));\n};\n/**\n * Contains all Segment information for its containing AdaptationSet\n *\n * @typedef {Object} SegmentInformation\n * @property {Object|undefined} template\n * Contains the attributes for the SegmentTemplate node\n * @property {Object[]|undefined} segmentTimeline\n * Contains a list of atrributes for each S node within the SegmentTimeline node\n * @property {Object|undefined} list\n * Contains the attributes for the SegmentList node\n * @property {Object|undefined} base\n * Contains the attributes for the SegmentBase node\n */\n\n/**\n * Returns all available Segment information contained within the AdaptationSet node\n *\n * @param {Node} adaptationSet\n * The AdaptationSet node to get Segment information from\n * @return {SegmentInformation}\n * The Segment information contained within the provided AdaptationSet\n */\n\nvar getSegmentInformation = function getSegmentInformation(adaptationSet) {\n var segmentTemplate = findChildren(adaptationSet, 'SegmentTemplate')[0];\n var segmentList = findChildren(adaptationSet, 'SegmentList')[0];\n var segmentUrls = segmentList && findChildren(segmentList, 'SegmentURL').map(function (s) {\n return merge({\n tag: 'SegmentURL'\n }, parseAttributes(s));\n });\n var segmentBase = findChildren(adaptationSet, 'SegmentBase')[0];\n var segmentTimelineParentNode = segmentList || segmentTemplate;\n var segmentTimeline = segmentTimelineParentNode && findChildren(segmentTimelineParentNode, 'SegmentTimeline')[0];\n var segmentInitializationParentNode = segmentList || segmentBase || segmentTemplate;\n var segmentInitialization = segmentInitializationParentNode && findChildren(segmentInitializationParentNode, 'Initialization')[0]; // SegmentTemplate is handled slightly differently, since it can have both\n // @initialization and an node. @initialization can be templated,\n // while the node can have a url and range specified. If the has\n // both @initialization and an subelement we opt to override with\n // the node, as this interaction is not defined in the spec.\n\n var template = segmentTemplate && parseAttributes(segmentTemplate);\n\n if (template && segmentInitialization) {\n template.initialization = segmentInitialization && parseAttributes(segmentInitialization);\n } else if (template && template.initialization) {\n // If it is @initialization we convert it to an object since this is the format that\n // later functions will rely on for the initialization segment. This is only valid\n // for \n template.initialization = {\n sourceURL: template.initialization\n };\n }\n\n var segmentInfo = {\n template: template,\n segmentTimeline: segmentTimeline && findChildren(segmentTimeline, 'S').map(function (s) {\n return parseAttributes(s);\n }),\n list: segmentList && merge(parseAttributes(segmentList), {\n segmentUrls: segmentUrls,\n initialization: parseAttributes(segmentInitialization)\n }),\n base: segmentBase && merge(parseAttributes(segmentBase), {\n initialization: parseAttributes(segmentInitialization)\n })\n };\n Object.keys(segmentInfo).forEach(function (key) {\n if (!segmentInfo[key]) {\n delete segmentInfo[key];\n }\n });\n return segmentInfo;\n};\n/**\n * Contains Segment information and attributes needed to construct a Playlist object\n * from a Representation\n *\n * @typedef {Object} RepresentationInformation\n * @property {SegmentInformation} segmentInfo\n * Segment information for this Representation\n * @property {Object} attributes\n * Inherited attributes for this Representation\n */\n\n/**\n * Maps a Representation node to an object containing Segment information and attributes\n *\n * @name inheritBaseUrlsCallback\n * @function\n * @param {Node} representation\n * Representation node from the mpd\n * @return {RepresentationInformation}\n * Representation information needed to construct a Playlist object\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping Representation nodes to\n * Segment information and attributes using inherited BaseURL nodes.\n *\n * @param {Object} adaptationSetAttributes\n * Contains attributes inherited by the AdaptationSet\n * @param {string[]} adaptationSetBaseUrls\n * Contains list of resolved base urls inherited by the AdaptationSet\n * @param {SegmentInformation} adaptationSetSegmentInfo\n * Contains Segment information for the AdaptationSet\n * @return {inheritBaseUrlsCallback}\n * Callback map function\n */\n\nvar inheritBaseUrls = function inheritBaseUrls(adaptationSetAttributes, adaptationSetBaseUrls, adaptationSetSegmentInfo) {\n return function (representation) {\n var repBaseUrlElements = findChildren(representation, 'BaseURL');\n var repBaseUrls = buildBaseUrls(adaptationSetBaseUrls, repBaseUrlElements);\n var attributes = merge(adaptationSetAttributes, parseAttributes(representation));\n var representationSegmentInfo = getSegmentInformation(representation);\n return repBaseUrls.map(function (baseUrl) {\n return {\n segmentInfo: merge(adaptationSetSegmentInfo, representationSegmentInfo),\n attributes: merge(attributes, {\n baseUrl: baseUrl\n })\n };\n });\n };\n};\n/**\n * Tranforms a series of content protection nodes to\n * an object containing pssh data by key system\n *\n * @param {Node[]} contentProtectionNodes\n * Content protection nodes\n * @return {Object}\n * Object containing pssh data by key system\n */\n\nvar generateKeySystemInformation = function generateKeySystemInformation(contentProtectionNodes) {\n return contentProtectionNodes.reduce(function (acc, node) {\n var attributes = parseAttributes(node);\n var keySystem = keySystemsMap[attributes.schemeIdUri];\n\n if (keySystem) {\n acc[keySystem] = {\n attributes: attributes\n };\n var psshNode = findChildren(node, 'cenc:pssh')[0];\n\n if (psshNode) {\n var pssh = getContent(psshNode);\n var psshBuffer = pssh && decodeB64ToUint8Array(pssh);\n acc[keySystem].pssh = psshBuffer;\n }\n }\n\n return acc;\n }, {});\n}; // defined in ANSI_SCTE 214-1 2016\n\n\nvar parseCaptionServiceMetadata = function parseCaptionServiceMetadata(service) {\n // 608 captions\n if (service.schemeIdUri === 'urn:scte:dash:cc:cea-608:2015') {\n var values = typeof service.value !== 'string' ? [] : service.value.split(';');\n return values.map(function (value) {\n var channel;\n var language; // default language to value\n\n language = value;\n\n if (/^CC\\d=/.test(value)) {\n var _value$split = value.split('=');\n\n channel = _value$split[0];\n language = _value$split[1];\n } else if (/^CC\\d$/.test(value)) {\n channel = value;\n }\n\n return {\n channel: channel,\n language: language\n };\n });\n } else if (service.schemeIdUri === 'urn:scte:dash:cc:cea-708:2015') {\n var _values = typeof service.value !== 'string' ? [] : service.value.split(';');\n\n return _values.map(function (value) {\n var flags = {\n // service or channel number 1-63\n 'channel': undefined,\n // language is a 3ALPHA per ISO 639.2/B\n // field is required\n 'language': undefined,\n // BIT 1/0 or ?\n // default value is 1, meaning 16:9 aspect ratio, 0 is 4:3, ? is unknown\n 'aspectRatio': 1,\n // BIT 1/0\n // easy reader flag indicated the text is tailed to the needs of beginning readers\n // default 0, or off\n 'easyReader': 0,\n // BIT 1/0\n // If 3d metadata is present (CEA-708.1) then 1\n // default 0\n '3D': 0\n };\n\n if (/=/.test(value)) {\n var _value$split2 = value.split('='),\n channel = _value$split2[0],\n _value$split2$ = _value$split2[1],\n opts = _value$split2$ === void 0 ? '' : _value$split2$;\n\n flags.channel = channel;\n flags.language = value;\n opts.split(',').forEach(function (opt) {\n var _opt$split = opt.split(':'),\n name = _opt$split[0],\n val = _opt$split[1];\n\n if (name === 'lang') {\n flags.language = val; // er for easyReadery\n } else if (name === 'er') {\n flags.easyReader = Number(val); // war for wide aspect ratio\n } else if (name === 'war') {\n flags.aspectRatio = Number(val);\n } else if (name === '3D') {\n flags['3D'] = Number(val);\n }\n });\n } else {\n flags.language = value;\n }\n\n if (flags.channel) {\n flags.channel = 'SERVICE' + flags.channel;\n }\n\n return flags;\n });\n }\n};\n/**\n * Maps an AdaptationSet node to a list of Representation information objects\n *\n * @name toRepresentationsCallback\n * @function\n * @param {Node} adaptationSet\n * AdaptationSet node from the mpd\n * @return {RepresentationInformation[]}\n * List of objects containing Representaion information\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping AdaptationSet nodes to a list of\n * Representation information objects\n *\n * @param {Object} periodAttributes\n * Contains attributes inherited by the Period\n * @param {string[]} periodBaseUrls\n * Contains list of resolved base urls inherited by the Period\n * @param {string[]} periodSegmentInfo\n * Contains Segment Information at the period level\n * @return {toRepresentationsCallback}\n * Callback map function\n */\n\nvar toRepresentations = function toRepresentations(periodAttributes, periodBaseUrls, periodSegmentInfo) {\n return function (adaptationSet) {\n var adaptationSetAttributes = parseAttributes(adaptationSet);\n var adaptationSetBaseUrls = buildBaseUrls(periodBaseUrls, findChildren(adaptationSet, 'BaseURL'));\n var role = findChildren(adaptationSet, 'Role')[0];\n var roleAttributes = {\n role: parseAttributes(role)\n };\n var attrs = merge(periodAttributes, adaptationSetAttributes, roleAttributes);\n var accessibility = findChildren(adaptationSet, 'Accessibility')[0];\n var captionServices = parseCaptionServiceMetadata(parseAttributes(accessibility));\n\n if (captionServices) {\n attrs = merge(attrs, {\n captionServices: captionServices\n });\n }\n\n var label = findChildren(adaptationSet, 'Label')[0];\n\n if (label && label.childNodes.length) {\n var labelVal = label.childNodes[0].nodeValue.trim();\n attrs = merge(attrs, {\n label: labelVal\n });\n }\n\n var contentProtection = generateKeySystemInformation(findChildren(adaptationSet, 'ContentProtection'));\n\n if (Object.keys(contentProtection).length) {\n attrs = merge(attrs, {\n contentProtection: contentProtection\n });\n }\n\n var segmentInfo = getSegmentInformation(adaptationSet);\n var representations = findChildren(adaptationSet, 'Representation');\n var adaptationSetSegmentInfo = merge(periodSegmentInfo, segmentInfo);\n return flatten(representations.map(inheritBaseUrls(attrs, adaptationSetBaseUrls, adaptationSetSegmentInfo)));\n };\n};\n/**\n * Contains all period information for mapping nodes onto adaptation sets.\n *\n * @typedef {Object} PeriodInformation\n * @property {Node} period.node\n * Period node from the mpd\n * @property {Object} period.attributes\n * Parsed period attributes from node plus any added\n */\n\n/**\n * Maps a PeriodInformation object to a list of Representation information objects for all\n * AdaptationSet nodes contained within the Period.\n *\n * @name toAdaptationSetsCallback\n * @function\n * @param {PeriodInformation} period\n * Period object containing necessary period information\n * @param {number} periodIndex\n * Index of the Period within the mpd\n * @return {RepresentationInformation[]}\n * List of objects containing Representaion information\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping Period nodes to a list of\n * Representation information objects\n *\n * @param {Object} mpdAttributes\n * Contains attributes inherited by the mpd\n * @param {string[]} mpdBaseUrls\n * Contains list of resolved base urls inherited by the mpd\n * @return {toAdaptationSetsCallback}\n * Callback map function\n */\n\nvar toAdaptationSets = function toAdaptationSets(mpdAttributes, mpdBaseUrls) {\n return function (period, index) {\n var periodBaseUrls = buildBaseUrls(mpdBaseUrls, findChildren(period.node, 'BaseURL'));\n var parsedPeriodId = parseInt(period.attributes.id, 10); // fallback to mapping index if Period@id is not a number\n\n var periodIndex = window.isNaN(parsedPeriodId) ? index : parsedPeriodId;\n var periodAttributes = merge(mpdAttributes, {\n periodIndex: periodIndex,\n periodStart: period.attributes.start\n });\n\n if (typeof period.attributes.duration === 'number') {\n periodAttributes.periodDuration = period.attributes.duration;\n }\n\n var adaptationSets = findChildren(period.node, 'AdaptationSet');\n var periodSegmentInfo = getSegmentInformation(period.node);\n return flatten(adaptationSets.map(toRepresentations(periodAttributes, periodBaseUrls, periodSegmentInfo)));\n };\n};\n/**\n * Gets Period@start property for a given period.\n *\n * @param {Object} options\n * Options object\n * @param {Object} options.attributes\n * Period attributes\n * @param {Object} [options.priorPeriodAttributes]\n * Prior period attributes (if prior period is available)\n * @param {string} options.mpdType\n * The MPD@type these periods came from\n * @return {number|null}\n * The period start, or null if it's an early available period or error\n */\n\nvar getPeriodStart = function getPeriodStart(_ref) {\n var attributes = _ref.attributes,\n priorPeriodAttributes = _ref.priorPeriodAttributes,\n mpdType = _ref.mpdType;\n\n // Summary of period start time calculation from DASH spec section 5.3.2.1\n //\n // A period's start is the first period's start + time elapsed after playing all\n // prior periods to this one. Periods continue one after the other in time (without\n // gaps) until the end of the presentation.\n //\n // The value of Period@start should be:\n // 1. if Period@start is present: value of Period@start\n // 2. if previous period exists and it has @duration: previous Period@start +\n // previous Period@duration\n // 3. if this is first period and MPD@type is 'static': 0\n // 4. in all other cases, consider the period an \"early available period\" (note: not\n // currently supported)\n // (1)\n if (typeof attributes.start === 'number') {\n return attributes.start;\n } // (2)\n\n\n if (priorPeriodAttributes && typeof priorPeriodAttributes.start === 'number' && typeof priorPeriodAttributes.duration === 'number') {\n return priorPeriodAttributes.start + priorPeriodAttributes.duration;\n } // (3)\n\n\n if (!priorPeriodAttributes && mpdType === 'static') {\n return 0;\n } // (4)\n // There is currently no logic for calculating the Period@start value if there is\n // no Period@start or prior Period@start and Period@duration available. This is not made\n // explicit by the DASH interop guidelines or the DASH spec, however, since there's\n // nothing about any other resolution strategies, it's implied. Thus, this case should\n // be considered an early available period, or error, and null should suffice for both\n // of those cases.\n\n\n return null;\n};\n/**\n * Traverses the mpd xml tree to generate a list of Representation information objects\n * that have inherited attributes from parent nodes\n *\n * @param {Node} mpd\n * The root node of the mpd\n * @param {Object} options\n * Available options for inheritAttributes\n * @param {string} options.manifestUri\n * The uri source of the mpd\n * @param {number} options.NOW\n * Current time per DASH IOP. Default is current time in ms since epoch\n * @param {number} options.clientOffset\n * Client time difference from NOW (in milliseconds)\n * @return {RepresentationInformation[]}\n * List of objects containing Representation information\n */\n\nvar inheritAttributes = function inheritAttributes(mpd, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$manifestUri = _options.manifestUri,\n manifestUri = _options$manifestUri === void 0 ? '' : _options$manifestUri,\n _options$NOW = _options.NOW,\n NOW = _options$NOW === void 0 ? Date.now() : _options$NOW,\n _options$clientOffset = _options.clientOffset,\n clientOffset = _options$clientOffset === void 0 ? 0 : _options$clientOffset;\n var periodNodes = findChildren(mpd, 'Period');\n\n if (!periodNodes.length) {\n throw new Error(errors.INVALID_NUMBER_OF_PERIOD);\n }\n\n var locations = findChildren(mpd, 'Location');\n var mpdAttributes = parseAttributes(mpd);\n var mpdBaseUrls = buildBaseUrls([manifestUri], findChildren(mpd, 'BaseURL')); // See DASH spec section 5.3.1.2, Semantics of MPD element. Default type to 'static'.\n\n mpdAttributes.type = mpdAttributes.type || 'static';\n mpdAttributes.sourceDuration = mpdAttributes.mediaPresentationDuration || 0;\n mpdAttributes.NOW = NOW;\n mpdAttributes.clientOffset = clientOffset;\n\n if (locations.length) {\n mpdAttributes.locations = locations.map(getContent);\n }\n\n var periods = []; // Since toAdaptationSets acts on individual periods right now, the simplest approach to\n // adding properties that require looking at prior periods is to parse attributes and add\n // missing ones before toAdaptationSets is called. If more such properties are added, it\n // may be better to refactor toAdaptationSets.\n\n periodNodes.forEach(function (node, index) {\n var attributes = parseAttributes(node); // Use the last modified prior period, as it may contain added information necessary\n // for this period.\n\n var priorPeriod = periods[index - 1];\n attributes.start = getPeriodStart({\n attributes: attributes,\n priorPeriodAttributes: priorPeriod ? priorPeriod.attributes : null,\n mpdType: mpdAttributes.type\n });\n periods.push({\n node: node,\n attributes: attributes\n });\n });\n return {\n locations: mpdAttributes.locations,\n representationInfo: flatten(periods.map(toAdaptationSets(mpdAttributes, mpdBaseUrls)))\n };\n};\n\nvar stringToMpdXml = function stringToMpdXml(manifestString) {\n if (manifestString === '') {\n throw new Error(errors.DASH_EMPTY_MANIFEST);\n }\n\n var parser = new DOMParser();\n var xml;\n var mpd;\n\n try {\n xml = parser.parseFromString(manifestString, 'application/xml');\n mpd = xml && xml.documentElement.tagName === 'MPD' ? xml.documentElement : null;\n } catch (e) {// ie 11 throwsw on invalid xml\n }\n\n if (!mpd || mpd && mpd.getElementsByTagName('parsererror').length > 0) {\n throw new Error(errors.DASH_INVALID_XML);\n }\n\n return mpd;\n};\n\n/**\n * Parses the manifest for a UTCTiming node, returning the nodes attributes if found\n *\n * @param {string} mpd\n * XML string of the MPD manifest\n * @return {Object|null}\n * Attributes of UTCTiming node specified in the manifest. Null if none found\n */\n\nvar parseUTCTimingScheme = function parseUTCTimingScheme(mpd) {\n var UTCTimingNode = findChildren(mpd, 'UTCTiming')[0];\n\n if (!UTCTimingNode) {\n return null;\n }\n\n var attributes = parseAttributes(UTCTimingNode);\n\n switch (attributes.schemeIdUri) {\n case 'urn:mpeg:dash:utc:http-head:2014':\n case 'urn:mpeg:dash:utc:http-head:2012':\n attributes.method = 'HEAD';\n break;\n\n case 'urn:mpeg:dash:utc:http-xsdate:2014':\n case 'urn:mpeg:dash:utc:http-iso:2014':\n case 'urn:mpeg:dash:utc:http-xsdate:2012':\n case 'urn:mpeg:dash:utc:http-iso:2012':\n attributes.method = 'GET';\n break;\n\n case 'urn:mpeg:dash:utc:direct:2014':\n case 'urn:mpeg:dash:utc:direct:2012':\n attributes.method = 'DIRECT';\n attributes.value = Date.parse(attributes.value);\n break;\n\n case 'urn:mpeg:dash:utc:http-ntp:2014':\n case 'urn:mpeg:dash:utc:ntp:2014':\n case 'urn:mpeg:dash:utc:sntp:2014':\n default:\n throw new Error(errors.UNSUPPORTED_UTC_TIMING_SCHEME);\n }\n\n return attributes;\n};\n\nvar VERSION = version;\n\nvar parse = function parse(manifestString, options) {\n if (options === void 0) {\n options = {};\n }\n\n var parsedManifestInfo = inheritAttributes(stringToMpdXml(manifestString), options);\n var playlists = toPlaylists(parsedManifestInfo.representationInfo);\n return toM3u8(playlists, parsedManifestInfo.locations, options.sidxMapping);\n};\n/**\n * Parses the manifest for a UTCTiming node, returning the nodes attributes if found\n *\n * @param {string} manifestString\n * XML string of the MPD manifest\n * @return {Object|null}\n * Attributes of UTCTiming node specified in the manifest. Null if none found\n */\n\n\nvar parseUTCTiming = function parseUTCTiming(manifestString) {\n return parseUTCTimingScheme(stringToMpdXml(manifestString));\n};\n\nexport { VERSION, addSidxSegmentsToPlaylist, generateSidxKey, inheritAttributes, parse, parseUTCTiming, stringToMpdXml, toM3u8, toPlaylists };\n","var MAX_UINT32 = Math.pow(2, 32);\n\nvar parseSidx = function(data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n references: [],\n referenceId: view.getUint32(4),\n timescale: view.getUint32(8)\n },\n i = 12;\n\n if (result.version === 0) {\n result.earliestPresentationTime = view.getUint32(i);\n result.firstOffset = view.getUint32(i + 4);\n i += 8;\n } else {\n // read 64 bits\n result.earliestPresentationTime = (view.getUint32(i) * MAX_UINT32) + view.getUint32(i + 4);\n result.firstOffset = (view.getUint32(i + 8) * MAX_UINT32) + view.getUint32(i + 12);\n i += 16;\n }\n\n i += 2; // reserved\n\n var referenceCount = view.getUint16(i);\n\n i += 2; // start of references\n\n for (; referenceCount > 0; i += 12, referenceCount--) {\n result.references.push({\n referenceType: (data[i] & 0x80) >>> 7,\n referencedSize: view.getUint32(i) & 0x7FFFFFFF,\n subsegmentDuration: view.getUint32(i + 4),\n startsWithSap: !!(data[i + 8] & 0x80),\n sapType: (data[i + 8] & 0x70) >>> 4,\n sapDeltaTime: view.getUint32(i + 8) & 0x0FFFFFFF\n });\n }\n\n return result;\n};\n\n\nmodule.exports = parseSidx;\n","/**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\nvar\n ONE_SECOND_IN_TS = 90000, // 90kHz clock\n secondsToVideoTs,\n secondsToAudioTs,\n videoTsToSeconds,\n audioTsToSeconds,\n audioTsToVideoTs,\n videoTsToAudioTs,\n metadataTsToSeconds;\n\nsecondsToVideoTs = function(seconds) {\n return seconds * ONE_SECOND_IN_TS;\n};\n\nsecondsToAudioTs = function(seconds, sampleRate) {\n return seconds * sampleRate;\n};\n\nvideoTsToSeconds = function(timestamp) {\n return timestamp / ONE_SECOND_IN_TS;\n};\n\naudioTsToSeconds = function(timestamp, sampleRate) {\n return timestamp / sampleRate;\n};\n\naudioTsToVideoTs = function(timestamp, sampleRate) {\n return secondsToVideoTs(audioTsToSeconds(timestamp, sampleRate));\n};\n\nvideoTsToAudioTs = function(timestamp, sampleRate) {\n return secondsToAudioTs(videoTsToSeconds(timestamp), sampleRate);\n};\n\n/**\n * Adjust ID3 tag or caption timing information by the timeline pts values\n * (if keepOriginalTimestamps is false) and convert to seconds\n */\nmetadataTsToSeconds = function(timestamp, timelineStartPts, keepOriginalTimestamps) {\n return videoTsToSeconds(keepOriginalTimestamps ? timestamp : timestamp - timelineStartPts);\n};\n\nmodule.exports = {\n ONE_SECOND_IN_TS: ONE_SECOND_IN_TS,\n secondsToVideoTs: secondsToVideoTs,\n secondsToAudioTs: secondsToAudioTs,\n videoTsToSeconds: videoTsToSeconds,\n audioTsToSeconds: audioTsToSeconds,\n audioTsToVideoTs: audioTsToVideoTs,\n videoTsToAudioTs: videoTsToAudioTs,\n metadataTsToSeconds: metadataTsToSeconds\n};\n"],"names":["isObject","obj","merge","_len","arguments","length","objects","Array","_key","reduce","result","source","Object","keys","forEach","key","isArray","concat","values","o","map","k","range","start","end","i","push","flatten","lists","x","y","from","list","findIndexes","l","a","e","errors","INVALID_NUMBER_OF_PERIOD","DASH_EMPTY_MANIFEST","DASH_INVALID_XML","NO_BASE_URL","MISSING_SEGMENT_INFORMATION","SEGMENT_TIME_UNSPECIFIED","UNSUPPORTED_UTC_TIMING_SCHEME","urlTypeToSegment","_ref","_ref$baseUrl","baseUrl","_ref$source","_ref$range","_ref$indexRange","indexRange","segment","uri","resolvedUri","resolveUrl","rangeStr","ranges","split","startRange","parseInt","endRange","byterange","offset","byteRangeToString","parseEndNumber","endNumber","isNaN","segmentRange","static","attributes","duration","_attributes$timescale","timescale","sourceDuration","periodDuration","segmentDuration","dynamic","NOW","clientOffset","availabilityStartTime","_attributes$timescale2","_attributes$start","_attributes$minimumUp","minimumUpdatePeriod","_attributes$timeShift","timeShiftBufferDepth","Infinity","now","periodStartWC","periodEndWC","segmentCount","Math","ceil","availableStart","floor","availableEnd","max","min","toSegments","number","index","_attributes$timescale3","periodIndex","_attributes$startNumb","startNumber","timeline","time","parseByDuration","type","_attributes$timescale4","_segmentRange$type","segments","sectionDuration","segmentsFromBase","_attributes$initializ","initialization","_attributes$indexRang","Error","initSegment","sourceURL","segmentTimeInfo","addSidxSegmentsToPlaylist","playlist","sidx","sidxByteRange","sidxEnd","mediaReferences","references","filter","r","referenceType","endList","startIndex","firstOffset","reference","size","referencedSize","subsegmentDuration","endIndex","generateSidxKey","mergeDiscontiguousPlaylists","playlists","mergedPlaylists","acc","_acc$name$segments","name","id","lang","discontinuity","apply","contentProtection","discontinuityStarts","addSidxSegmentsToPlaylist$1","sidxMapping","sidxKey","sidxMatch","addSidxSegmentsToPlaylists","formatAudioPlaylist","isAudioOnly","_attributes","NAME","BANDWIDTH","bandwidth","CODECS","codecs","targetDuration","mediaSequence","AUDIO","SUBTITLES","formatVttPlaylist","_ref2","_m3u8Attributes","m3u8Attributes","organizeAudioPlaylists","mainPlaylist","formattedPlaylists","role","value","language","label","roleLabel","autoselect","default","formatted","firstLabel","organizeVttPlaylists","organizeCaptionServices","captionServices","svcObj","svc","service","channel","instreamId","hasOwnProperty","aspectRatio","easyReader","formatVideoPlaylist","_ref3","_attributes2","RESOLUTION","width","height","videoOnly","_ref4","mimeType","contentType","audioOnly","_ref5","vttOnly","_ref6","toM3u8","dashPlaylists","locations","_mediaGroups","_dashPlaylists$0$attr","suggestedPresentationDelay","videoPlaylists","audioPlaylists","vttPlaylists","captions","Boolean","manifest","allowCache","mediaGroups","VIDEO","audio","subs","cc","getLiveRValue","parseByTimeline","segmentTimeline","_attributes$minimumUp2","_attributes$media","media","sIndex","S","d","repeat","segmentTime","t","count","nextS","indexOf","identifierPattern","identifierReplacement","match","identifier","format","join","constructTemplateUrl","url","replace","parseTemplateInfo","segmentsFromTemplate","templateValues","RepresentationID","Bandwidth","mapSegment","Number","Time","presentationTimeOffset","presentationTime","periodStart","SegmentURLToSegmentObject","segmentUrl","mediaRange","segmentsFromList","_attributes$segmentUr","segmentUrls","segmentUrlMap","segmentUrlObject","generateSegments","segmentAttributes","segmentsFn","segmentInfo","template","base","segmentsInfo","_segmentAttributes","_segmentAttributes$ti","toPlaylists","representations","findChildren","element","childNodes","tagName","getContent","textContent","trim","parseDuration","str","SECONDS_IN_YEAR","SECONDS_IN_MONTH","SECONDS_IN_DAY","SECONDS_IN_HOUR","SECONDS_IN_MIN","durationRegex","exec","_match$slice","slice","year","month","day","hour","minute","second","parseFloat","parseDate","dateRegex","test","Date","parse","parsers","mediaPresentationDuration","parsedValue","DEFAULT","parseAttributes","el","parseFn","keySystemsMap","buildBaseUrls","referenceUrls","baseUrlElements","baseUrlElement","getSegmentInformation","adaptationSet","segmentTemplate","segmentList","s","tag","segmentBase","segmentTimelineParentNode","segmentInitializationParentNode","segmentInitialization","inheritBaseUrls","adaptationSetAttributes","adaptationSetBaseUrls","adaptationSetSegmentInfo","representation","repBaseUrlElements","repBaseUrls","representationSegmentInfo","generateKeySystemInformation","contentProtectionNodes","node","keySystem","schemeIdUri","psshNode","pssh","psshBuffer","decodeB64ToUint8Array","parseCaptionServiceMetadata","_value$split","_values","flags","undefined","_value$split2","_value$split2$","opts","opt","_opt$split","val","toRepresentations","periodAttributes","periodBaseUrls","periodSegmentInfo","roleAttributes","attrs","accessibility","labelVal","nodeValue","toAdaptationSets","mpdAttributes","mpdBaseUrls","period","parsedPeriodId","window","adaptationSets","getPeriodStart","priorPeriodAttributes","mpdType","inheritAttributes","mpd","options","_options","_options$manifestUri","manifestUri","_options$NOW","_options$clientOffset","periodNodes","periods","priorPeriod","representationInfo","stringToMpdXml","manifestString","xml","parser","DOMParser","parseFromString","documentElement","getElementsByTagName","parseUTCTimingScheme","UTCTimingNode","method","parsedManifestInfo","parseUTCTiming","MAX_UINT32","pow","parseSidx","data","view","DataView","buffer","byteOffset","byteLength","version","Uint8Array","subarray","referenceId","getUint32","earliestPresentationTime","referenceCount","getUint16","startsWithSap","sapType","sapDeltaTime","module","exports","secondsToVideoTs","secondsToAudioTs","videoTsToSeconds","audioTsToSeconds","audioTsToVideoTs","videoTsToAudioTs","metadataTsToSeconds","ONE_SECOND_IN_TS","seconds","sampleRate","timestamp","timelineStartPts","keepOriginalTimestamps"],"sourceRoot":""}