{
  "version": 3,
  "sources": ["../../node_modules/ts-md5/src/md5.ts", "../../node_modules/ts-md5/src/md5_file_hasher.ts", "../../node_modules/ts-md5/src/parallel_hasher.ts", "../../node_modules/ts-md5/src/index.ts", "../../node_modules/ms/index.js", "../../node_modules/debug/src/common.js", "../../node_modules/debug/src/browser.js", "../../node_modules/has-flag/index.js", "../../node_modules/supports-color/index.js", "../../node_modules/debug/src/node.js", "../../node_modules/debug/src/index.js", "../src/components/index.node.ts", "../src/utils/bits.ts", "../src/utils/protocols/rtp.ts", "../src/components/component.ts", "../src/components/helpers/stream-factory.ts", "../src/components/message.ts", "../src/components/messageStreams.ts", "../src/components/aacdepay/parser.ts", "../src/components/aacdepay/index.ts", "../src/utils/config.ts", "../src/utils/protocols/rtsp.ts", "../src/components/auth/digest.ts", "../src/components/auth/www-authenticate.ts", "../src/components/auth/index.ts", "../src/components/basicdepay/index.ts", "../src/components/h264depay/index.ts", "../src/components/h264depay/parser.ts", "../src/components/inspector/index.ts", "../src/components/jpegdepay/index.ts", "../src/components/jpegdepay/headers.ts", "../src/utils/clamp.ts", "../src/components/jpegdepay/make-qtable.ts", "../src/components/jpegdepay/parser.ts", "../src/components/mp4capture/index.ts", "../src/components/mp4muxer/index.ts", "../src/components/mp4muxer/helpers/isom.ts", "../src/components/mp4muxer/helpers/aacSettings.ts", "../src/components/mp4muxer/helpers/bufferreader.ts", "../src/components/mp4muxer/helpers/spsparser.ts", "../src/components/mp4muxer/helpers/utils.ts", "../src/components/mp4muxer/helpers/h264Settings.ts", "../src/components/mp4muxer/helpers/boxbuilder.ts", "../src/components/onvifdepay/index.ts", "../src/components/recorder/index.ts", "../src/components/replayer/index.ts", "../src/components/helpers/sleep.ts", "../src/components/rtsp-parser/index.ts", "../src/components/rtsp-parser/builder.ts", "../src/utils/protocols/rtcp.ts", "../src/utils/protocols/sdp.ts", "../src/components/rtsp-parser/parser.ts", "../src/components/rtsp-session/index.ts", "../src/utils/protocols/ntp.ts", "../src/components/tcp/index.ts", "../src/components/ws-sink/index.ts", "../src/pipelines/index.node.ts", "../src/pipelines/pipeline.ts", "../src/pipelines/rtsp-pipeline.ts", "../src/pipelines/rtsp-mjpeg-pipeline.ts", "../src/pipelines/rtsp-mp4-pipeline.ts", "../src/pipelines/cli-mjpeg-pipeline.ts", "../src/pipelines/cli-mp4-pipeline.ts", "../src/pipelines/tcp-ws-proxy-pipeline.ts", "../src/utils/index.node.ts", "../src/utils/clock.ts", "../src/utils/retry.ts", "../src/utils/scheduler.ts"],
  "sourcesContent": ["/*\n\nTypeScript Md5\n==============\n\nBased on work by\n* Joseph Myers: http://www.myersdaily.org/joseph/javascript/md5-text.html\n* Andr\u00E9 Cruz: https://github.com/satazor/SparkMD5\n* Raymond Hill: https://github.com/gorhill/yamd5.js\n\nEffectively a TypeScrypt re-write of Raymond Hill JS Library\n\nThe MIT License (MIT)\n\nCopyright (C) 2014 Raymond Hill\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n\n            DO WHAT YOU WANT TO PUBLIC LICENSE\n                    Version 2, December 2004\n\n Copyright (C) 2015 Andr\u00E9 Cruz <amdfcruz@gmail.com>\n\n Everyone is permitted to copy and distribute verbatim or modified\n copies of this license document, and changing it is allowed as long\n as the name is changed.\n\n            DO WHAT YOU WANT TO PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. You just DO WHAT YOU WANT TO.\n\n\n*/\n\n\ninterface HasherState {\n    buffer: string;\n    buflen: number;\n    length: number;\n    state: number[];\n};\n\nexport class Md5 {\n\n    /**\n     * Hash a UTF-8 string on the spot\n     * @param str String to hash\n     * @param raw Whether to return the value as an `Int32Array`\n     */\n    public static hashStr(str: string, raw?: false): string;\n    public static hashStr(str: string, raw: true): Int32Array;\n    public static hashStr(str: string, raw: boolean = false) {\n        return this.onePassHasher\n            .start()\n            .appendStr(str)\n            .end(raw);\n    }\n\n    /**\n     * Hash a ASCII string on the spot\n     * @param str String to hash\n     * @param raw Whether to return the value as an `Int32Array`\n     */\n    public static hashAsciiStr(str: string, raw?: false): string;\n    public static hashAsciiStr(str: string, raw: true): Int32Array;\n    public static hashAsciiStr(str: string, raw: boolean = false) {\n        return this.onePassHasher\n            .start()\n            .appendAsciiStr(str)\n            .end(raw);\n    }\n        // Private Static Variables\n    private static stateIdentity = new Int32Array([1732584193, -271733879, -1732584194, 271733878]);\n    private static buffer32Identity = new Int32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n    private static hexChars = '0123456789abcdef';\n    private static hexOut: string[] = [];\n\n    // Permanent instance is to use for one-call hashing\n    private static onePassHasher = new Md5();\n\n    private static _hex(x: Int32Array): string {\n        const hc = Md5.hexChars;\n        const ho = Md5.hexOut;\n        let n;\n        let offset;\n        let j;\n        let i;\n\n        for (i = 0; i < 4; i += 1) {\n            offset = i * 8;\n            n = x[i];\n            for (j = 0; j < 8; j += 2) {\n                ho[offset + 1 + j] = hc.charAt(n & 0x0F);\n                n >>>= 4;\n                ho[offset + 0 + j] = hc.charAt(n & 0x0F);\n                n >>>= 4;\n            }\n        }\n        return ho.join('');\n    }\n\n    private static _md5cycle(x: Int32Array|Uint32Array, k: Int32Array|Uint32Array) {\n        let a = x[0];\n        let b = x[1];\n        let c = x[2];\n        let d = x[3];\n        // ff()\n        a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[10] - 42063 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        // gg()\n        a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        // hh()\n        a += (b ^ c ^ d) + k[5] - 378558 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        // ii()\n        a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n\n        x[0] = a + x[0] | 0;\n        x[1] = b + x[1] | 0;\n        x[2] = c + x[2] | 0;\n        x[3] = d + x[3] | 0;\n    }\n\n    private _dataLength = 0;\n    private _bufferLength = 0;\n\n    private _state: Int32Array = new Int32Array(4);\n    private _buffer: ArrayBuffer = new ArrayBuffer(68);\n    private _buffer8: Uint8Array;\n    private _buffer32: Uint32Array;\n\n    constructor() {\n        this._buffer8 = new Uint8Array(this._buffer, 0, 68);\n        this._buffer32 = new Uint32Array(this._buffer, 0, 17);\n        this.start();\n    }\n\n    /**\n     * Initialise buffer to be hashed\n     */\n    public start() {\n        this._dataLength = 0;\n        this._bufferLength = 0;\n        this._state.set(Md5.stateIdentity);\n        return this;\n    }\n\n    // Char to code point to to array conversion:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n    // #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown\n\n    /**\n     * Append a UTF-8 string to the hash buffer\n     * @param str String to append\n     */\n    public appendStr(str: string) {\n        const buf8 = this._buffer8;\n        const buf32 = this._buffer32;\n        let bufLen = this._bufferLength;\n        let code;\n        let i;\n\n        for (i = 0; i < str.length; i += 1) {\n            code = str.charCodeAt(i);\n            if (code < 128) {\n                buf8[bufLen++] = code;\n            } else if (code < 0x800) {\n                buf8[bufLen++] = (code >>> 6) + 0xC0;\n                buf8[bufLen++] = code & 0x3F | 0x80;\n            } else if (code < 0xD800 || code > 0xDBFF) {\n                buf8[bufLen++] = (code >>> 12) + 0xE0;\n                buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;\n                buf8[bufLen++] = (code & 0x3F) | 0x80;\n            } else {\n                code = ((code - 0xD800) * 0x400) + (str.charCodeAt(++i) - 0xDC00) + 0x10000;\n                if (code > 0x10FFFF) {\n                    throw new Error('Unicode standard supports code points up to U+10FFFF');\n                }\n                buf8[bufLen++] = (code >>> 18) + 0xF0;\n                buf8[bufLen++] = (code >>> 12 & 0x3F) | 0x80;\n                buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;\n                buf8[bufLen++] = (code & 0x3F) | 0x80;\n            }\n            if (bufLen >= 64) {\n                this._dataLength += 64;\n                Md5._md5cycle(this._state, buf32);\n                bufLen -= 64;\n                buf32[0] = buf32[16];\n            }\n        }\n        this._bufferLength = bufLen;\n        return this;\n    }\n\n    /**\n     * Append an ASCII string to the hash buffer\n     * @param str String to append\n     */\n    public appendAsciiStr(str: string) {\n        const buf8 = this._buffer8;\n        const buf32 = this._buffer32;\n        let bufLen = this._bufferLength;\n        let i;\n        let j = 0;\n\n        for (; ;) {\n            i = Math.min(str.length - j, 64 - bufLen);\n            while (i--) {\n                buf8[bufLen++] = str.charCodeAt(j++);\n            }\n            if (bufLen < 64) {\n                break;\n            }\n            this._dataLength += 64;\n            Md5._md5cycle(this._state, buf32);\n            bufLen = 0;\n        }\n        this._bufferLength = bufLen;\n        return this;\n    }\n\n    /**\n     * Append a byte array to the hash buffer\n     * @param input array to append\n     */\n    public appendByteArray(input: Uint8Array) {\n        const buf8 = this._buffer8;\n        const buf32 = this._buffer32;\n        let bufLen = this._bufferLength;\n        let i;\n        let j = 0;\n\n        for (; ;) {\n            i = Math.min(input.length - j, 64 - bufLen);\n            while (i--) {\n                buf8[bufLen++] = input[j++];\n            }\n            if (bufLen < 64) {\n                break;\n            }\n            this._dataLength += 64;\n            Md5._md5cycle(this._state, buf32);\n            bufLen = 0;\n        }\n        this._bufferLength = bufLen;\n        return this;\n    }\n\n    /**\n     * Get the state of the hash buffer\n     */\n    public getState(): HasherState {\n        const s = this._state;\n\n        return {\n            buffer: String.fromCharCode.apply(null, Array.from(this._buffer8)),\n            buflen: this._bufferLength,\n            length: this._dataLength,\n            state: [s[0], s[1], s[2], s[3]]\n        };\n    }\n\n    /**\n     * Override the current state of the hash buffer\n     * @param state New hash buffer state\n     */\n    public setState(state: HasherState) {\n        const buf = state.buffer;\n        const x = state.state;\n        const s = this._state;\n        let i;\n\n        this._dataLength = state.length;\n        this._bufferLength = state.buflen;\n        s[0] = x[0];\n        s[1] = x[1];\n        s[2] = x[2];\n        s[3] = x[3];\n\n        for (i = 0; i < buf.length; i += 1) {\n            this._buffer8[i] = buf.charCodeAt(i);\n        }\n    }\n\n    /**\n     * Hash the current state of the hash buffer and return the result\n     * @param raw Whether to return the value as an `Int32Array`\n     */\n    public end(raw: boolean = false) {\n        const bufLen = this._bufferLength;\n        const buf8 = this._buffer8;\n        const buf32 = this._buffer32;\n        const i = (bufLen >> 2) + 1;\n\n        this._dataLength += bufLen;\n        const dataBitsLen = this._dataLength * 8\n\n        buf8[bufLen] = 0x80;\n        buf8[bufLen + 1] = buf8[bufLen + 2] = buf8[bufLen + 3] = 0;\n        buf32.set(Md5.buffer32Identity.subarray(i), i);\n\n        if (bufLen > 55) {\n            Md5._md5cycle(this._state, buf32);\n            buf32.set(Md5.buffer32Identity);\n        }\n\n        // Do the final computation based on the tail and length\n        // Beware that the final length may not fit in 32 bits so we take care of that\n        if (dataBitsLen <= 0xFFFFFFFF) {\n            buf32[14] = dataBitsLen;\n        } else {\n            const matches = dataBitsLen.toString(16).match(/(.*?)(.{0,8})$/);\n            if (matches === null) {\n                return;\n            }\n\n            const lo = parseInt(matches[2], 16);\n            const hi = parseInt(matches[1], 16) || 0;\n\n            buf32[14] = lo;\n            buf32[15] = hi;\n        }\n\n        Md5._md5cycle(this._state, buf32);\n\n        return raw ? this._state : Md5._hex(this._state);\n    }\n}\n\nif (Md5.hashStr('hello') !== '5d41402abc4b2a76b9719d911017c592') {\n    throw new Error('Md5 self test failed.');\n}\n", "import {Md5} from './md5';\n\ndeclare let FileReaderSync: any;\n\nexport interface HashingResponse {\n    success: boolean;\n    result?: string | Int32Array;\n}\n\n// Hashes any blob\nexport class Md5FileHasher {\n    private _reader: any;\n\n    private _md5!: Md5;\n    private _part!: number;\n    // private _length!: number;\n    private _blob: any;\n\n\n    constructor(\n        private _callback: (r: HashingResponse) => void,    // Callback to return the result\n        private _async: boolean = true,                     // Async version is not always available in a web worker\n        private _partSize: number = 1048576,                // 1mb\n    ) {\n        this._configureReader();\n    }\n\n    /**\n     * Hash a blob of data in the worker\n     * @param blob Data to hash\n     */\n    public hash(blob: any) {\n        const self = this;\n\n        self._blob = blob;\n        // self._length = Math.ceil(blob.size / self._partSize);\n        self._part = 0;\n        self._md5 = new Md5();\n        self._processPart();\n    }\n\n\n    private _fail() {\n        this._callback({\n            success: false,\n            result: 'data read failed'\n        });\n    }\n\n    private _hashData(e: any) {\n        let self = this;\n\n        self._md5.appendByteArray(new Uint8Array(e.target.result));\n        if (self._part * self._partSize >= self._blob.size) {\n            self._callback({\n                success: true,\n                result: self._md5.end()\n            });\n        } else {\n            self._processPart();\n        }\n    }\n\n    private _processPart() {\n        const self = this;\n        let endbyte = 0;\n        let current_part: any;\n\n        self._part += 1;\n\n        if (self._blob.size > self._partSize) {        // If blob bigger then part_size we will slice it up\n            endbyte = self._part * self._partSize;\n            if (endbyte > self._blob.size) {\n                endbyte = self._blob.size;\n            }\n            current_part = self._blob.slice((self._part - 1) * self._partSize, endbyte);\n        } else {\n            current_part = self._blob;\n        }\n\n        if (self._async) {\n            self._reader.readAsArrayBuffer(current_part);\n        } else {\n            setTimeout(() => {\n                try {\n                    self._hashData({\n                        target: {\n                            result: self._reader.readAsArrayBuffer(current_part)\n                        },\n                    });\n                } catch (e) {\n                    self._fail();\n                }\n            }, 0);\n        }\n    }\n\n    private _configureReader() {\n        const self = this;\n\n        if (self._async) {\n            self._reader = new FileReader();\n            self._reader.onload = self._hashData.bind(self);\n            self._reader.onerror = self._fail.bind(self);\n            self._reader.onabort = self._fail.bind(self);\n        } else {\n            self._reader = new FileReaderSync();\n        }\n    }\n}\n", "export interface WorkerOptions {\n    credentials?: 'omit' | 'same-origin' | 'include';\n    name?: string;\n    type?: 'classic' | 'module';\n}\n\ndeclare var Worker: {\n    prototype: Worker;\n    new (stringUrl: string, options?: WorkerOptions): Worker;\n};\n\ninterface HashingRequest {\n    blob: any;\n    resolve: (...d: any) => void;\n    reject: (...d: any) => void;\n};\n\nexport class ParallelHasher {\n    private _queue: HashingRequest[] = [];\n    private _hashWorker: any;\n    private _processing?: HashingRequest;\n\n    private _ready: boolean = true;\n\n    constructor(workerUri: string, workerOptions?: WorkerOptions) {\n        const self = this;\n\n        if (Worker) {\n            self._hashWorker = new Worker(workerUri, workerOptions);\n            self._hashWorker.onmessage = self._recievedMessage.bind(self);\n            self._hashWorker.onerror = (err: any) => {\n                self._ready = false;\n                console.error('Hash worker failure', err);\n            };\n        } else {\n            self._ready = false;\n            console.error('Web Workers are not supported in this browser');\n        }\n    }\n\n    /**\n     * Hash a blob of data in the worker\n     * @param blob Data to hash\n     * @returns Promise of the Hashed result\n     */\n    public hash(blob: any) {\n        const self = this;\n        let promise;\n\n        promise = new Promise((resolve, reject) => {\n            self._queue.push({\n                blob,\n                resolve,\n                reject,\n            });\n\n            self._processNext();\n        });\n\n        return promise;\n    }\n\n    /** Terminate any existing hash requests */\n    public terminate() {\n        this._ready = false;\n        this._hashWorker.terminate();\n    }\n\n    // Processes the next item in the queue\n    private _processNext() {\n        if (this._ready && !this._processing && this._queue.length > 0) {\n            this._processing = this._queue.pop();\n            this._hashWorker.postMessage(this._processing!.blob);\n        }\n    }\n\n    // Hash result is returned from the worker\n    private _recievedMessage(evt: any) {\n        const data = evt.data;\n\n        if (data.success) {\n            this._processing?.resolve(data.result);\n        } else {\n            this._processing?.reject(data.result);\n        }\n\n        this._processing = undefined;\n        this._processNext();\n    }\n}\n", "\nexport { Md5 } from './md5';\nexport { Md5FileHasher, HashingResponse } from './md5_file_hasher';\nexport { ParallelHasher } from './parallel_hasher';\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n", "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n", "'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n", "'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet flagForceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tflagForceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m') ||\n\t\t\thasFlag('color=full') ||\n\t\t\thasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream, options = {}) {\n\tconst level = supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options\n\t});\n\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: getSupportLevel({isTTY: tty.isatty(1)}),\n\tstderr: getSupportLevel({isTTY: tty.isatty(2)})\n};\n", "/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = `  ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n", "/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n", "export * from './aacdepay'\nexport * from './auth'\nexport * from './basicdepay'\nexport * from './component'\nexport * from './h264depay'\nexport * from './inspector'\nexport * from './jpegdepay'\nexport * from './message'\nexport * from './messageStreams'\nexport * from './mp4capture'\nexport * from './mp4muxer'\nexport * from './onvifdepay'\nexport * from './recorder'\nexport * from './replayer'\nexport * from './rtsp-parser'\nexport * from './rtsp-session'\nexport * from './tcp'\nexport * from './ws-sink'\n", "export const POS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]\n", "import { POS } from '../bits'\n\n// Real Time Protocol (RTP)\n// https://tools.ietf.org/html/rfc3550#section-5.1\n\n/*\nRTP Fixed Header Fields\n\n  0               1               2               3\n  0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  |V=2|P|X|  CC   |M|     PT      |       sequence number         |\n  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  |                           timestamp                           |\n  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  |           synchronization source (SSRC) identifier            |\n  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n  |            contributing source (CSRC) identifiers             |\n  |                             ....                              |\n  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  |   profile-specific ext. id    | profile-specific ext. length  |\n  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  |                 profile-specific extension                    |\n  |                             ....                              |\n  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n*/\n\nexport const version = (buffer: Buffer) => {\n  return buffer[0] >>> 6\n}\n\nexport const padding = (buffer: Buffer) => {\n  return !!(buffer[0] & POS[2])\n}\n\nexport const extension = (buffer: Buffer) => {\n  return !!(buffer[0] & POS[3])\n}\n\nexport const cSrcCount = (buffer: Buffer) => {\n  return buffer[0] & 0x0f\n}\n\nexport const marker = (buffer: Buffer) => {\n  return !!(buffer[1] & POS[0])\n}\n\nexport const payloadType = (buffer: Buffer) => {\n  return buffer[1] & 0x7f\n}\n\nexport const sequenceNumber = (buffer: Buffer) => {\n  return buffer.readUInt16BE(2)\n}\n\nexport const timestamp = (buffer: Buffer) => {\n  return buffer.readUInt32BE(4)\n}\n\nexport const sSrc = (buffer: Buffer) => {\n  return buffer.readUInt32BE(8)\n}\n\nexport const cSrc = (buffer: Buffer, rank = 0) => {\n  return cSrcCount(buffer) > rank ? buffer.readUInt32BE(12 + rank * 4) : 0\n}\n\nexport const extHeaderLength = (buffer: Buffer) => {\n  return !extension(buffer)\n    ? 0\n    : buffer.readUInt16BE(12 + cSrcCount(buffer) * 4 + 2)\n}\n\nexport const extHeader = (buffer: Buffer) => {\n  return extHeaderLength(buffer) === 0\n    ? Buffer.from([])\n    : buffer.slice(\n        12 + cSrcCount(buffer) * 4,\n        12 + cSrcCount(buffer) * 4 + 4 + extHeaderLength(buffer) * 4\n      )\n}\n\nexport const payload = (buffer: Buffer) => {\n  return !extension(buffer)\n    ? buffer.slice(12 + cSrcCount(buffer) * 4)\n    : buffer.slice(12 + cSrcCount(buffer) * 4 + 4 + extHeaderLength(buffer) * 4)\n}\n", "import { Duplex, PassThrough, Readable, Stream, Writable } from 'stream'\n\nimport StreamFactory from './helpers/stream-factory'\nimport { GenericMessage, MessageHandler } from './message'\n\nexport type Component = Source | Tube | Sink\n\ntype ErrorEventHandler = (err: Error) => void\n\n/**\n * Component\n *\n * A component is a set of bi-directional streams consisting of an 'incoming'\n * and 'outgoing' stream.\n *\n * They contain references to other components so they can form a linked list of\n * components, i.e. a pipeline. When linking components, the incoming and\n * outgoing streams are piped, so that data flowing through the incoming stream\n * is transfered to the next component, and data in the outgoing stream flows\n * to the previous component.\n *\n * Components at the end of such a pipeline typically connect the incoming and\n * outgoing streams to a data source or data sink.\n *\n * Typically, for a component that is connected to two other components, both\n * incoming and outgoing will be Transform streams. For a source, 'incoming'\n * will be a Readable stream and 'outgoing' a Writable stream, while for a sink\n * it is reversed. Both source and sink could also use a single Duplex stream,\n * with incoming === outgoing.\n *\n * server end-point                          client end-point\n *  /-------------      -----------------      -------------\\\n *  |  Writable  |  <-  |   Transform   |  <-  |  Readable  |\n *  |   source   |      |      tube     |      |    sink    |\n *  |  Readable  |  ->  |   Transform   |  ->  |  Writable  |\n *  \\-------------      -----------------      -------------/\n */\nabstract class AbstractComponent {\n  /**\n   * The stream going towards the client end-point\n   */\n  public abstract incoming: Stream\n  /**\n   * The stream going back to the server end-point\n   */\n  public abstract outgoing: Stream\n  /**\n   * The next component (downstream, towards the client)\n   */\n  public abstract next: Tube | Sink | null\n  /**\n   * The previous component (upstream, towards the server)\n   */\n  public abstract prev: Tube | Source | null\n  protected _incomingErrorHandler?: ErrorEventHandler\n  protected _outgoingErrorHandler?: ErrorEventHandler\n  /**\n   * Connect a downstream component (towards the client)\n   */\n  public abstract connect(next: Tube | Sink | null): Component\n  /**\n   * Disconnect a downstream component downstream (towards the client)\n   */\n  public abstract disconnect(): Component\n}\n\n/**\n * Source component\n *\n * A component that can only have a next component connected (no previous) and\n * where the incoming and outgoing streams are connected to an external data\n * source.\n */\nexport class Source extends AbstractComponent {\n  /**\n   * Set up a source component that has a message list as data source.\n   *\n   * @param messages - List of objects (with data property) to emit on the\n   * incoming stream\n   */\n  public static fromMessages(messages: GenericMessage[]) {\n    const component = new Source(\n      StreamFactory.producer(messages),\n      StreamFactory.consumer()\n    )\n\n    return component\n  }\n\n  public incoming: Readable\n  public outgoing: Writable\n  public next: Tube | Sink | null\n  public prev: null\n\n  constructor(\n    incoming: Readable = new Readable({ objectMode: true }),\n    outgoing: Writable = new Writable({ objectMode: true })\n  ) {\n    super()\n    this.incoming = incoming\n    this.outgoing = outgoing\n    this.next = null\n    this.prev = null\n  }\n\n  /**\n   * Attach another component so the the 'down' stream flows into the\n   * next component 'down' stream and the 'up' stream of the other component\n   * flows into the 'up' stream of this component. This is what establishes the\n   * meaning of 'up' and 'down'.\n   * @param  next - The component to connect.\n   * @return A reference to the connected component.\n   *\n   *      -------------- pipe --------------\n   *  <-  |  outgoing  |  <-  |  outgoing  | <-\n   *      |    this    |      |    next    |\n   *  ->  |  incoming  |  ->  |  incoming  | ->\n   *      -------------- pipe --------------\n   */\n  public connect(next: Tube | Sink | null): Component {\n    // If the next component is not there, we want to return this component\n    // so that it is possible to continue to chain. If there is a next component,\n    // but this component already has a next one, or the next one already has a\n    // previous component, throw an error.\n    if (next === null) {\n      return this\n    } else if (this.next !== null || next.prev !== null) {\n      throw new Error('connection failed: component(s) already connected')\n    }\n\n    if (!this.incoming.readable || !this.outgoing.writable) {\n      throw new Error('connection failed: this component not compatible')\n    }\n\n    if (!next.incoming.writable || !next.outgoing.readable) {\n      throw new Error('connection failed: next component not compatible')\n    }\n\n    try {\n      this.incoming.pipe(next.incoming)\n      next.outgoing.pipe(this.outgoing)\n    } catch (e) {\n      throw new Error(`connection failed: ${(e as Error).message}`)\n    }\n\n    /**\n     * Propagate errors back upstream, this assures an error will be propagated\n     * to all previous streams (but not further than any endpoints). What happens\n     * when an error is emitted on a stream is up to the stream's implementation.\n     */\n    const incomingErrorHandler: ErrorEventHandler = (err) => {\n      this.incoming.emit('error', err)\n    }\n    next.incoming.on('error', incomingErrorHandler)\n\n    const outgoingErrorHandler: ErrorEventHandler = (err) => {\n      next.outgoing.emit('error', err)\n    }\n    this.outgoing.on('error', outgoingErrorHandler)\n\n    // Keep a bidirectional linked list of components by storing\n    // a reference to the next component and the listeners that we set up.\n    this.next = next\n    next.prev = this\n    this._incomingErrorHandler = incomingErrorHandler\n    this._outgoingErrorHandler = outgoingErrorHandler\n\n    return next\n  }\n\n  /**\n   * Disconnect the next connected component. When there is no next component\n   * the function will just do nothing.\n   * @return {Component} - A reference to this component.\n   */\n  public disconnect(): Component {\n    const next = this.next\n\n    if (next !== null) {\n      this.incoming.unpipe(next.incoming)\n      next.outgoing.unpipe(this.outgoing)\n\n      if (typeof this._incomingErrorHandler !== 'undefined') {\n        next.incoming.removeListener('error', this._incomingErrorHandler)\n      }\n      if (typeof this._outgoingErrorHandler !== 'undefined') {\n        this.outgoing.removeListener('error', this._outgoingErrorHandler)\n      }\n\n      this.next = null\n      next.prev = null\n      delete this._incomingErrorHandler\n      delete this._outgoingErrorHandler\n    }\n\n    return this\n  }\n}\n\n/**\n * Tube component\n *\n * A component where both incoming and outgoing streams are Duplex streams, and\n * can be connected to a previous and next component, typically in the middle of\n * a pipeline.\n */\nexport class Tube extends Source {\n  /**\n   * Create a component that calls a handler function for each message passing\n   * through, but otherwise just passes data through.\n   *\n   * Can be used to log messages passing through a pipeline.\n   */\n  public static fromHandlers(\n    fnIncoming: MessageHandler | undefined,\n    fnOutgoing: MessageHandler | undefined\n  ) {\n    const incomingStream = fnIncoming\n      ? StreamFactory.peeker(fnIncoming)\n      : undefined\n    const outgoingStream = fnOutgoing\n      ? StreamFactory.peeker(fnOutgoing)\n      : undefined\n\n    return new Tube(incomingStream, outgoingStream)\n  }\n\n  public incoming: Duplex\n  public outgoing: Duplex\n\n  constructor(\n    incoming: Duplex = new PassThrough({ objectMode: true }),\n    outgoing: Duplex = new PassThrough({ objectMode: true })\n  ) {\n    super(incoming, outgoing)\n    this.incoming = incoming\n    this.outgoing = outgoing\n  }\n}\n\n/**\n * Sink component\n *\n * A component that can only have a previous component connected (no next) and\n * where the incoming and outgoing streams are connected to an external data\n * source.\n */\nexport class Sink extends AbstractComponent {\n  /**\n   * Create a component that swallows incoming data (calling fn on it).  To\n   * print data, you would use fn = console.log.\n   *\n   * @param fn - The callback to use for the incoming data.\n   */\n  public static fromHandler(fn: MessageHandler) {\n    const component = new Sink(\n      StreamFactory.consumer(fn),\n      StreamFactory.producer(undefined)\n    )\n    // A sink should propagate when stream is ending.\n    component.incoming.on('finish', () => {\n      component.outgoing.push(null)\n    })\n\n    return component\n  }\n\n  public incoming: Writable\n  public outgoing: Readable\n  public next: null\n  public prev: Tube | Source | null\n\n  constructor(\n    incoming: Writable = new Writable({ objectMode: true }),\n    outgoing: Readable = new Readable({ objectMode: true })\n  ) {\n    super()\n    this.incoming = incoming\n    this.outgoing = outgoing\n    this.next = null\n    this.prev = null\n  }\n\n  public connect(): Component {\n    throw new Error('connection failed: attempting to connect after a sink')\n  }\n\n  public disconnect(): Component {\n    return this\n  }\n}\n", "import { Readable, Transform, Writable } from 'stream'\n\nexport default class StreamFactory {\n  /**\n   * Creates a writable stream that sends all messages written to the stream\n   * to a callback function and then considers it written.\n   * @param fn  The callback to be invoked on the message\n   */\n  public static consumer(\n    fn: (msg: any) => void = () => {\n      /* */\n    }\n  ) {\n    return new Writable({\n      objectMode: true,\n      write(msg, _encoding, callback) {\n        fn(msg)\n        callback()\n      },\n    })\n  }\n\n  public static peeker(fn: (msg: any) => void) {\n    if (typeof fn !== 'function') {\n      throw new Error('you must supply a function')\n    }\n    return new Transform({\n      objectMode: true,\n      transform(msg, _encoding, callback) {\n        fn(msg)\n        callback(undefined, msg)\n      },\n    })\n  }\n\n  /**\n   * Creates a readable stream that sends a message for each element of an array.\n   * @param arr  The array with elements to be turned into a stream.\n   */\n  public static producer(messages?: any[]) {\n    let counter = 0\n    return new Readable({\n      objectMode: true,\n      read() {\n        if (messages !== undefined) {\n          if (counter < messages.length) {\n            this.push(messages[counter++])\n          } else {\n            // End the stream\n            this.push(null)\n          }\n        }\n      },\n    })\n  }\n\n  public static recorder(type: string, fileStream: NodeJS.WritableStream) {\n    return new Transform({\n      objectMode: true,\n      transform(msg, encoding, callback) {\n        const timestamp = Date.now()\n        // Replace binary data with base64 string\n        const message = Object.assign({}, msg, {\n          data: msg.data.toString('base64'),\n        })\n        fileStream.write(JSON.stringify({ type, timestamp, message }, null, 2))\n        fileStream.write(',\\n')\n        callback(undefined, msg)\n      },\n    })\n  }\n\n  /**\n   * Yield binary messages from JSON packet array until depleted.\n   * @return {Generator} Returns a JSON packet iterator.\n   */\n  public static replayer(packets: any[]) {\n    let packetCounter = 0\n    let lastTimestamp = packets[0].timestamp\n    return new Readable({\n      objectMode: true,\n      read() {\n        const packet = packets[packetCounter++]\n        if (packet) {\n          const { type, timestamp, message } = packet\n          const delay = timestamp - lastTimestamp\n          lastTimestamp = timestamp\n          if (message) {\n            const data = message.data\n              ? Buffer.from(message.data, 'base64')\n              : Buffer.alloc(0)\n            const msg = Object.assign({}, message, { data })\n            this.push({ type, delay, msg })\n          } else {\n            this.push({ type, delay, msg: null })\n          }\n        } else {\n          this.push(null)\n        }\n      },\n    })\n  }\n}\n", "import { MediaTrack } from '../utils/protocols/isom'\nimport { Rtcp } from '../utils/protocols/rtcp'\nimport { Sdp } from '../utils/protocols/sdp'\n\nexport interface GenericMessage {\n  readonly type: MessageType\n  readonly data: Buffer\n  ntpTimestamp?: number\n}\n\nexport enum MessageType {\n  UNKNOWN = 0,\n  RAW,\n  RTP,\n  RTCP,\n  RTSP,\n  SDP,\n  ELEMENTARY,\n  H264,\n  ISOM,\n  XML,\n  JPEG,\n}\n\nexport interface RawMessage extends GenericMessage {\n  readonly type: MessageType.RAW\n}\n\nexport interface RtpMessage extends GenericMessage {\n  readonly type: MessageType.RTP\n  readonly channel: number\n}\n\nexport interface RtcpMessage extends GenericMessage {\n  readonly type: MessageType.RTCP\n  readonly channel: number\n  readonly rtcp: Rtcp\n}\n\nexport interface RtspMessage extends GenericMessage {\n  readonly type: MessageType.RTSP\n  readonly method?: string\n  readonly headers?: { [key: string]: string }\n  readonly uri?: string\n  readonly protocol?: string\n}\n\nexport interface SdpMessage extends GenericMessage {\n  readonly type: MessageType.SDP\n  readonly sdp: Sdp\n}\n\nexport interface ElementaryMessage extends GenericMessage {\n  readonly type: MessageType.ELEMENTARY\n  readonly payloadType: number\n  readonly timestamp: number\n}\n\nexport interface H264Message extends GenericMessage {\n  readonly type: MessageType.H264\n  readonly payloadType: number\n  readonly timestamp: number\n  readonly nalType: number\n}\n\nexport interface IsomMessage extends GenericMessage {\n  readonly type: MessageType.ISOM\n  readonly checkpointTime?: number // presentation time of last I-frame (s)\n  readonly tracks?: MediaTrack[]\n  readonly mime?: string\n}\n\nexport interface XmlMessage extends GenericMessage {\n  readonly type: MessageType.XML\n  readonly timestamp: number\n  readonly payloadType: number\n}\n\nexport interface JpegMessage extends GenericMessage {\n  readonly type: MessageType.JPEG\n  readonly timestamp: number\n  readonly payloadType: number\n  readonly framesize: {\n    readonly width: number\n    readonly height: number\n  }\n}\n\nexport type Message =\n  | RawMessage\n  | RtpMessage\n  | RtcpMessage\n  | RtspMessage\n  | SdpMessage\n  | ElementaryMessage\n  | H264Message\n  | IsomMessage\n  | XmlMessage\n  | JpegMessage\n\nexport type MessageHandler = (msg: Message) => void\n", "import { Transform, TransformCallback } from 'stream'\n\nimport { Message } from './message'\n\ntype MessageTransform = (\n  this: Transform,\n  msg: Message,\n  encoding: string,\n  callback: TransformCallback\n) => void\n\nexport const createTransform = (transform: MessageTransform) => {\n  return new Transform({\n    objectMode: true,\n    transform,\n  })\n}\n", "import { payload, payloadType, timestamp } from '../../utils/protocols/rtp'\nimport { ElementaryMessage, MessageType, RtpMessage } from '../message'\n\n/*\nFrom RFC 3640 https://tools.ietf.org/html/rfc3640\n  2.11.  Global Structure of Payload Format\n\n     The RTP payload following the RTP header, contains three octet-\n     aligned data sections, of which the first two MAY be empty, see\n     Figure 1.\n\n           +---------+-----------+-----------+---------------+\n           | RTP     | AU Header | Auxiliary | Access Unit   |\n           | Header  | Section   | Section   | Data Section  |\n           +---------+-----------+-----------+---------------+\n\n                     <----------RTP Packet Payload----------->\n\n              Figure 1: Data sections within an RTP packet\nNote that auxilary section is empty for AAC-hbr\n\n  3.2.1.  The AU Header Section\n\n   When present, the AU Header Section consists of the AU-headers-length\n   field, followed by a number of AU-headers, see Figure 2.\n\n      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+\n      |AU-headers-length|AU-header|AU-header|      |AU-header|padding|\n      |                 |   (1)   |   (2)   |      |   (n)   | bits  |\n      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+\n\n                   Figure 2: The AU Header Section\n*/\n\nexport function parse(\n  rtp: RtpMessage,\n  hasHeader: boolean,\n  callback: (msg: ElementaryMessage) => void\n) {\n  const buffer = payload(rtp.data)\n\n  let headerLength = 0\n  if (hasHeader) {\n    const auHeaderLengthInBits = buffer.readUInt16BE(0)\n    headerLength = 2 + (auHeaderLengthInBits + (auHeaderLengthInBits % 8)) / 8 // Add padding\n  }\n  const packet: ElementaryMessage = {\n    type: MessageType.ELEMENTARY,\n    data: buffer.slice(headerLength),\n    payloadType: payloadType(rtp.data),\n    timestamp: timestamp(rtp.data),\n    ntpTimestamp: rtp.ntpTimestamp,\n  }\n\n  callback(packet)\n}\n", "import { payloadType } from '../../utils/protocols/rtp'\nimport { Tube } from '../component'\nimport { Message, MessageType } from '../message'\nimport { createTransform } from '../messageStreams'\n\nimport { parse } from './parser'\n\n/*\nmedia: [{ type: 'video',\n   port: '0',\n   proto: 'RTP/AVP',\n   fmt: '96',\n   rtpmap: '96 H264/90000',\n   fmtp: {\n      format: '96',\n      parameters: {\n        'packetization-mode': '1',\n        'profile-level-id': '4d0029',\n        'sprop-parameter-sets': 'Z00AKeKQDwBE/LgLcBAQGkHiRFQ=,aO48gA==',\n      },\n    },\n   control: 'rtsp://hostname/axis-media/media.amp/stream=0?audio=1&video=1',\n   framerate: '25.000000',\n   transform: [[1, 0, 0], [0, 0.75, 0], [0, 0, 1]] },\n   { type: 'audio',\n     port: '0',\n     proto: 'RTP/AVP',\n     fmt: '97',\n     fmtp: {\n       parameters: {\n         bitrate: '32000',\n         config: '1408',\n         indexdeltalength: '3',\n         indexlength: '3',\n         mode: 'AAC-hbr',\n         'profile-level-id': '2',\n         sizelength: '13',\n         streamtype: '5'\n       },\n       format: '97'\n     },\n     rtpmap: '97 MPEG4-GENERIC/16000/1',\n     control: 'rtsp://hostname/axis-media/media.amp/stream=1?audio=1&video=1' }]\n*/\n\nexport class AACDepay extends Tube {\n  constructor() {\n    let AACPayloadType: number\n    let hasHeader: boolean\n\n    const incoming = createTransform(function (\n      msg: Message,\n      encoding,\n      callback\n    ) {\n      if (msg.type === MessageType.SDP) {\n        // Check if there is an AAC track in the SDP\n        let validMedia\n        for (const media of msg.sdp.media) {\n          if (\n            media.type === 'audio' &&\n            media.fmtp &&\n            media.fmtp.parameters &&\n            media.fmtp.parameters.mode === 'AAC-hbr'\n          ) {\n            validMedia = media\n          }\n        }\n        if (validMedia && validMedia.rtpmap !== undefined) {\n          AACPayloadType = Number(validMedia.rtpmap.payloadType)\n          const parameters = validMedia.fmtp.parameters\n          // Required\n          const sizeLength = Number(parameters.sizelength) || 0\n          const indexLength = Number(parameters.indexlength) || 0\n          const indexDeltaLength = Number(parameters.indexdeltalength) || 0\n          // Optionals\n          const CTSDeltaLength = Number(parameters.ctsdeltalength) || 0\n          const DTSDeltaLength = Number(parameters.dtsdeltalength) || 0\n          const RandomAccessIndication =\n            Number(parameters.randomaccessindication) || 0\n          const StreamStateIndication =\n            Number(parameters.streamstateindication) || 0\n          const AuxiliaryDataSizeLength =\n            Number(parameters.auxiliarydatasizelength) || 0\n\n          hasHeader =\n            sizeLength +\n              Math.max(indexLength, indexDeltaLength) +\n              CTSDeltaLength +\n              DTSDeltaLength +\n              RandomAccessIndication +\n              StreamStateIndication +\n              AuxiliaryDataSizeLength >\n            0\n        }\n        callback(undefined, msg)\n      } else if (\n        msg.type === MessageType.RTP &&\n        payloadType(msg.data) === AACPayloadType\n      ) {\n        parse(msg, hasHeader, this.push.bind(this))\n        callback()\n      } else {\n        // Not a message we should handle\n        callback(undefined, msg)\n      }\n    })\n\n    // outgoing will be defaulted to a PassThrough stream\n    super(incoming)\n  }\n}\n", "export interface ConfigOptions {\n  [key: string]: any\n}\n\n/**\n * Flat merge of objects, ignoring undefined override values.\n * @param  template - The object with default values\n * @param  override - The object with override values.\n * @return The template object with override merged in.\n */\nexport const merge = <T extends ConfigOptions>(template: T, override: T): T => {\n  let cleanOverride\n  if (override !== undefined) {\n    if (typeof override !== 'object') {\n      throw new Error('merge expects override to be an object!')\n    } else {\n      cleanOverride = Object.keys(override).reduce(\n        (acc: ConfigOptions, key) => {\n          if (override[key] !== undefined) {\n            acc[key] = override[key]\n          }\n          return acc\n        },\n        {}\n      )\n    }\n  }\n  return Object.assign({}, template, cleanOverride)\n}\n", "/*\n * The RTSP response format is defined in RFC 7826,\n * using ABNF notation specified in RFC 5234.\n * Strings in ABNF rules (\"...\") are always case insensitive!\n *\n * Basic rules to help with the headers below:\n * ====\n * CR              =  %x0D ; US-ASCII CR, carriage return (13)\n * LF              =  %x0A  ; US-ASCII LF, linefeed (10)\n * SP              =  %x20  ; US-ASCII SP, space (32)\n * HT              =  %x09  ; US-ASCII HT, horizontal-tab (9)\n * CRLF            =  CR LF\n * LWS             =  [CRLF] 1*( SP / HT ) ; Line-breaking whitespace\n * SWS             =  [LWS] ; Separating whitespace\n * HCOLON          =  *( SP / HT ) \":\" SWS\n *\n * RTSP response rules (a `*` means zero or more):\n * ====\n * Status-Line  = RTSP-Version SP Status-Code SP Reason-Phrase CRLF\n * Response     = Status-Line\n *                *((general-header\n *                /  response-header\n *                /  message-body-header) CRLF)\n *                CRLF\n *                [ message-body-data ]\n *\n * Example response:\n * ====\n * RTSP/1.0 200 OK\n * CSeq: 3\n * Content-Type: application/sdp\n * Content-Base: rtsp://192.168.0.3/axis-media/media.amp/\n * Server: GStreamer RTSP server\n * Date: Wed, 03 Jun 2015 14:23:42 GMT\n * Content-Length: 623\n *\n * v=0\n * ....\n */\n\n/**\n * Extract the value of a header.\n *\n * @param buffer The response bytes\n * @param header The header to search for\n */\nexport const extractHeaderValue = (buffer: Buffer, header: string) => {\n  const anchor = `\\n${header.toLowerCase()}: `\n  const start = buffer.toString().toLowerCase().indexOf(anchor)\n  if (start >= 0) {\n    const end = buffer.indexOf('\\n', start + anchor.length)\n    const headerValue = buffer\n      .toString('ascii', start + anchor.length, end)\n      .trim()\n    return headerValue\n  }\n  return null\n}\n\nexport const sequence = (buffer: Buffer) => {\n  /**\n   * CSeq           =  \"CSeq\" HCOLON cseq-nr\n   * cseq-nr        =  1*9DIGIT\n   */\n  const val = extractHeaderValue(buffer, 'CSeq')\n  if (val !== null) {\n    return Number(val)\n  }\n  return null\n}\n\nexport const sessionId = (buffer: Buffer) => {\n  /**\n   * Session          =  \"Session\" HCOLON session-id\n   *                     [ SEMI \"timeout\" EQUAL delta-seconds ]\n   * session-id        =  1*256( ALPHA / DIGIT / safe )\n   * delta-seconds     =  1*19DIGIT\n   */\n  const val = extractHeaderValue(buffer, 'Session')\n  return val ? val.split(';')[0] : null\n}\n\nexport const sessionTimeout = (buffer: Buffer) => {\n  /**\n   * Session          =  \"Session\" HCOLON session-id\n   *                     [ SEMI \"timeout\" EQUAL delta-seconds ]\n   * session-id        =  1*256( ALPHA / DIGIT / safe )\n   * delta-seconds     =  1*19DIGIT\n   */\n  const val = extractHeaderValue(buffer, 'Session')\n  if (val === null) {\n    return null\n  }\n  const defaultTimeout = 60\n  const timeoutToken = 'timeout='\n  const timeoutPosition = val.toLowerCase().indexOf(timeoutToken)\n  if (timeoutPosition !== -1) {\n    let timeoutVal = val.substring(timeoutPosition + timeoutToken.length)\n    timeoutVal = timeoutVal.split(';')[0]\n    const parsedTimeout = parseInt(timeoutVal)\n    return Number.isNaN(parsedTimeout) ? defaultTimeout : parsedTimeout\n  }\n  return defaultTimeout\n}\n\nexport const statusCode = (buffer: Buffer) => {\n  return Number(buffer.toString('ascii', 9, 12))\n}\n\nexport const contentBase = (buffer: Buffer) => {\n  /**\n   * Content-Base       =  \"Content-Base\" HCOLON RTSP-URI\n   */\n  return extractHeaderValue(buffer, 'Content-Base')\n}\n\nexport const contentLocation = (buffer: Buffer) => {\n  /**\n   * Content-Location   =  \"Content-Location\" HCOLON RTSP-REQ-Ref\n   */\n  return extractHeaderValue(buffer, 'Content-Location')\n}\n\nexport const connectionEnded = (buffer: Buffer) => {\n  /**\n   * Connection         =  \"Connection\" HCOLON connection-token\n   *                       *(COMMA connection-token)\n   * connection-token   =  \"close\" / token\n   */\n  const connectionToken = extractHeaderValue(buffer, 'Connection')\n  return connectionToken !== null && connectionToken.toLowerCase() === 'close'\n}\n\nexport const range = (buffer: Buffer) => {\n  /**\n   * Range              =  \"Range\" HCOLON ranges-spec\n   * ranges-spec        =  npt-range / utc-range / smpte-range\n   *                       /  range-ext\n   * npt-range        =  \"npt\" [EQUAL npt-range-spec]\n   * npt-range-spec   =  ( npt-time \"-\" [ npt-time ] ) / ( \"-\" npt-time )\n   * npt-time         =  \"now\" / npt-sec / npt-hhmmss / npt-hhmmss-comp\n   * npt-sec          =  1*19DIGIT [ \".\" 1*9DIGIT ]\n   * npt-hhmmss       =  npt-hh \":\" npt-mm \":\" npt-ss [ \".\" 1*9DIGIT ]\n   * npt-hh           =  2*19DIGIT   ; any positive number\n   * npt-mm           =  2*2DIGIT  ; 0-59\n   * npt-ss           =  2*2DIGIT  ; 0-59\n   * npt-hhmmss-comp  =  npt-hh-comp \":\" npt-mm-comp \":\" npt-ss-comp\n   *                     [ \".\" 1*9DIGIT ] ; Compatibility format\n   * npt-hh-comp      =  1*19DIGIT   ; any positive number\n   * npt-mm-comp      =  1*2DIGIT  ; 0-59\n   * npt-ss-comp      =  1*2DIGIT  ; 0-59\n   */\n\n  // Example range headers:\n  // Range: npt=now-\n  // Range: npt=1154.598701-3610.259146\n  const npt = extractHeaderValue(buffer, 'Range')\n  if (npt !== null) {\n    return npt.split('=')[1].split('-')\n  }\n  return undefined\n}\n\n/**\n * Determine the offset of the RTSP body, where the header ends.\n * If there is no header ending, -1 is returned\n * @param  chunk - A piece of data\n * @return The body offset, or -1 if no header end found\n */\nexport const bodyOffset = (chunk: Buffer) => {\n  /**\n   * Strictly speaking, it seems RTSP MUST have CRLF and doesn't allow CR or LF on its own.\n   * That means that the end of the header part should be a pair of CRLF, but we're being\n   * flexible here and also allow LF LF or CR CR instead of CRLF CRLF.\n   */\n  const bodyOffsets = ['\\n\\n', '\\r\\r', '\\r\\n\\r\\n']\n    .map((s) => {\n      const offset = chunk.indexOf(s)\n      if (offset !== -1) {\n        return offset + s.length\n      }\n      return offset\n    })\n    .filter((offset) => offset !== -1)\n  if (bodyOffsets.length > 0) {\n    return bodyOffsets.reduce((acc, offset) => {\n      return Math.min(acc, offset)\n    })\n  }\n  return -1\n}\n", "// https://tools.ietf.org/html/rfc2617#section-3.2.1\nimport { Md5 as MD5 } from 'ts-md5'\n\nimport { ChallengeParams } from './www-authenticate'\n\nfunction md5Hash(s: string): string {\n  const hash = new MD5().appendStr(s).end()\n  if (hash === undefined) {\n    throw new Error('empty MD5 hash')\n  }\n  return hash.toString()\n}\n\nexport class DigestAuth {\n  private readonly realm: string\n  private readonly nonce: string\n  private readonly opaque?: string\n  private readonly algorithm?: 'md5' | 'md5-sess'\n  private readonly qop?: 'auth' | 'auth-int'\n  private readonly username: string\n\n  private readonly ha1Base: string\n  private count: number\n\n  constructor(params: ChallengeParams, username: string, password: string) {\n    const realm = params.get('realm')\n    if (realm === undefined) {\n      throw new Error('no realm in digest challenge')\n    }\n    this.realm = realm\n\n    this.ha1Base = md5Hash(`${username}:${realm}:${password}`)\n\n    const nonce = params.get('nonce')\n    if (nonce === undefined) {\n      throw new Error('no nonce in digest challenge')\n    }\n    this.nonce = nonce\n\n    this.opaque = params.get('opaque')\n\n    const algorithm = params.get('algorithm')\n    if (algorithm !== undefined) {\n      if (algorithm === 'md5') {\n        this.algorithm = 'md5'\n      } else if (algorithm === 'md5-sess') {\n        this.algorithm = 'md5-sess'\n      }\n    } else {\n      this.algorithm = 'md5'\n    }\n\n    const qop = params.get('qop')\n    if (qop !== undefined) {\n      const possibleQops = qop.split(',').map((qopType) => qopType.trim())\n      if (possibleQops.some((qopValue) => qopValue === 'auth')) {\n        this.qop = 'auth'\n      } else if (possibleQops.some((qopValue) => qopValue === 'auth-int')) {\n        this.qop = 'auth-int'\n      }\n    }\n\n    this.count = 0\n    this.username = username\n  }\n\n  nc = () => {\n    ++this.count\n    return this.count.toString(16).padStart(8, '0')\n  }\n\n  cnonce = () => {\n    return new Array(4)\n      .fill(0)\n      .map(() => Math.floor(Math.random() * 256))\n      .map((n) => n.toString(16))\n      .join('')\n  }\n\n  ha1 = (cnonce: string): string => {\n    let ha1 = this.ha1Base\n    if (this.algorithm === 'md5-sess') {\n      ha1 = md5Hash(`${ha1}:${this.nonce}:${cnonce}`)\n    }\n    return ha1\n  }\n\n  ha2 = (method: string, uri: string, body = ''): string => {\n    let ha2 = md5Hash(`${method}:${uri}`)\n    if (this.algorithm === 'md5-sess') {\n      const hbody = md5Hash(body)\n      ha2 = md5Hash(`${method}:${uri}:${hbody}`)\n    }\n    return ha2\n  }\n\n  authorization = (method = 'GET', uri = '', body?: string): string => {\n    // Increase count\n    const nc = this.nc()\n    const cnonce = this.cnonce()\n\n    const ha1 = this.ha1(cnonce)\n    const ha2 = this.ha2(method, uri, body)\n\n    const response =\n      this.qop === undefined\n        ? md5Hash(`${ha1}:${this.nonce}:${ha2}`)\n        : md5Hash(`${ha1}:${this.nonce}:${nc}:${cnonce}:${this.qop}:${ha2}`)\n\n    const authorizationParams: string[] = []\n    authorizationParams.push(`username=\"${this.username}\"`)\n    authorizationParams.push(`realm=\"${this.realm}\"`)\n    authorizationParams.push(`nonce=\"${this.nonce}\"`)\n    authorizationParams.push(`uri=\"${uri}\"`)\n    if (this.qop !== undefined) {\n      authorizationParams.push(`qop=${this.qop}`)\n      authorizationParams.push(`nc=${nc}`)\n      authorizationParams.push(`cnonce=\"${cnonce}\"`)\n    }\n    authorizationParams.push(`response=\"${response}\"`)\n    if (this.opaque !== undefined) {\n      authorizationParams.push(`opaque=\"${this.opaque}\"`)\n    }\n    return `Digest ${authorizationParams.join(', ')}`\n  }\n}\n", "export type ChallengeParams = Map<string, string>\n\nexport interface Challenge {\n  type: string\n  params: ChallengeParams\n}\n\nexport const parseWWWAuthenticate = (header: string): Challenge => {\n  const [, type, ...challenge] = header.split(' ')\n\n  const pairs: Array<[string, string]> = []\n  const re = /\\s*([^=]+)=\"([^\"]*)\",?/gm\n  let match\n  do {\n    match = re.exec(challenge.join(' '))\n    if (match !== null) {\n      const [, key, value] = match\n      pairs.push([key, value])\n    }\n  } while (match !== null)\n\n  const params = new Map(pairs)\n\n  return { type: type.toLowerCase(), params }\n}\n", "import { merge } from '../../utils/config'\nimport { statusCode } from '../../utils/protocols/rtsp'\nimport { Tube } from '../component'\nimport { Message, MessageType, RtspMessage } from '../message'\nimport { createTransform } from '../messageStreams'\n\nimport { DigestAuth } from './digest'\nimport { parseWWWAuthenticate } from './www-authenticate'\n\nconst UNAUTHORIZED = 401\n\nexport interface AuthConfig {\n  username?: string\n  password?: string\n}\n\nconst DEFAULT_CONFIG = {\n  username: 'root',\n  password: 'pass',\n}\n\n/*\n * This component currently only supports Basic authentication\n * It should be placed between the RTSP parser and the RTSP Session.\n */\n\nexport class Auth extends Tube {\n  constructor(config: AuthConfig = {}) {\n    const { username, password } = merge(DEFAULT_CONFIG, config)\n    if (username === undefined || password === undefined) {\n      throw new Error('need username and password')\n    }\n\n    let lastSentMessage: RtspMessage\n    let authHeader: string\n\n    const outgoing = createTransform(function (\n      msg: Message,\n      encoding,\n      callback\n    ) {\n      if (msg.type === MessageType.RTSP) {\n        lastSentMessage = msg\n        if (authHeader && msg.headers) {\n          msg.headers.Authorization = authHeader\n        }\n      }\n\n      callback(undefined, msg)\n    })\n\n    const incoming = createTransform(function (\n      msg: Message,\n      encoding,\n      callback\n    ) {\n      if (\n        msg.type === MessageType.RTSP &&\n        statusCode(msg.data) === UNAUTHORIZED\n      ) {\n        const headers = msg.data.toString().split('\\n')\n        const wwwAuth = headers.find((header) => /WWW-Auth/i.test(header))\n        if (wwwAuth === undefined) {\n          throw new Error('cannot find WWW-Authenticate header')\n        }\n        const challenge = parseWWWAuthenticate(wwwAuth)\n        if (challenge.type === 'basic') {\n          authHeader = `Basic ${Buffer.from(`${username}:${password}`).toString(\n            'base64'\n          )}`\n        } else if (challenge.type === 'digest') {\n          const digest = new DigestAuth(challenge.params, username, password)\n          authHeader = digest.authorization(\n            lastSentMessage.method,\n            lastSentMessage.uri\n          )\n        } else {\n          // unkown authentication type, give up\n          return\n        }\n\n        // Retry last RTSP message\n        // Write will fire our outgoing transform function.\n        outgoing.write(lastSentMessage, () => callback())\n      } else {\n        // Not a message we should handle\n        callback(undefined, msg)\n      }\n    })\n\n    super(incoming, outgoing)\n  }\n}\n", "import {\n  marker,\n  payload,\n  payloadType,\n  timestamp,\n} from '../../utils/protocols/rtp'\nimport { Tube } from '../component'\nimport { Message, MessageType } from '../message'\nimport { createTransform } from '../messageStreams'\n\nexport class BasicDepay extends Tube {\n  constructor(rtpPayloadType: number) {\n    if (rtpPayloadType === undefined) {\n      throw new Error('you must supply a payload type to BasicDepayComponent')\n    }\n\n    let buffer = Buffer.alloc(0)\n\n    const incoming = createTransform(function (\n      msg: Message,\n      encoding,\n      callback\n    ) {\n      if (\n        msg.type === MessageType.RTP &&\n        payloadType(msg.data) === rtpPayloadType\n      ) {\n        const rtpPayload = payload(msg.data)\n        buffer = Buffer.concat([buffer, rtpPayload])\n\n        if (marker(msg.data)) {\n          if (buffer.length > 0) {\n            this.push({\n              data: buffer,\n              timestamp: timestamp(msg.data),\n              ntpTimestamp: msg.ntpTimestamp,\n              payloadType: payloadType(msg.data),\n              type: MessageType.ELEMENTARY,\n            })\n          }\n          buffer = Buffer.alloc(0)\n        }\n        callback()\n      } else {\n        // Not a message we should handle\n        callback(undefined, msg)\n      }\n    })\n\n    // outgoing will be defaulted to a PassThrough stream\n    super(incoming)\n  }\n}\n", "import { Transform } from 'stream'\n\nimport { marker, payloadType } from '../../utils/protocols/rtp'\nimport { VideoMedia } from '../../utils/protocols/sdp'\nimport { Tube } from '../component'\nimport { Message, MessageType } from '../message'\n\nimport { H264DepayParser, NAL_TYPES } from './parser'\n\nexport class H264Depay extends Tube {\n  constructor() {\n    let h264PayloadType: number\n    let idrFound = false\n    let packets: Buffer[] = []\n\n    const h264DepayParser = new H264DepayParser()\n\n    // Incoming\n\n    const incoming = new Transform({\n      objectMode: true,\n      transform(msg: Message, _encoding, callback) {\n        // Get correct payload types from sdp to identify video and audio\n        if (msg.type === MessageType.SDP) {\n          const h264Media = msg.sdp.media.find((media): media is VideoMedia => {\n            return (\n              media.type === 'video' &&\n              media.rtpmap !== undefined &&\n              media.rtpmap.encodingName === 'H264'\n            )\n          })\n          if (h264Media !== undefined && h264Media.rtpmap !== undefined) {\n            h264PayloadType = h264Media.rtpmap.payloadType\n          }\n          callback(undefined, msg) // Pass on the original SDP message\n        } else if (\n          msg.type === MessageType.RTP &&\n          payloadType(msg.data) === h264PayloadType\n        ) {\n          const endOfFrame = marker(msg.data)\n          const h264Message = h264DepayParser.parse(msg)\n\n          // Skip if not a full H264 frame, or when there hasn't been an I-frame yet\n          if (\n            h264Message === null ||\n            (!idrFound && h264Message.nalType !== NAL_TYPES.IDR_PICTURE)\n          ) {\n            callback()\n            return\n          }\n\n          idrFound = true\n\n          // H.264 over RTP uses the RTP marker bit to indicate a complete\n          // frame.  At this point, the packets can be used to construct a\n          // complete message.\n\n          packets.push(h264Message.data)\n          if (endOfFrame) {\n            this.push({\n              ...h264Message,\n              data: packets.length === 1 ? packets[0] : Buffer.concat(packets),\n            })\n            packets = []\n          }\n          callback()\n        } else {\n          // Not a message we should handle\n          callback(undefined, msg)\n        }\n      },\n    })\n\n    // outgoing will be defaulted to a PassThrough stream\n    super(incoming)\n  }\n}\n", "import debug from 'debug'\n\nimport { payload, payloadType, timestamp } from '../../utils/protocols/rtp'\nimport { H264Message, MessageType, RtpMessage } from '../message'\n\nexport enum NAL_TYPES {\n  UNSPECIFIED = 0,\n  NON_IDR_PICTURE = 1, // P-frame\n  IDR_PICTURE = 5, // I-frame\n  SPS = 7,\n  PPS = 8,\n}\n\n/*\nFirst byte in payload (rtp payload header):\n      +---------------+\n      |0|1|2|3|4|5|6|7|\n      +-+-+-+-+-+-+-+-+\n      |F|NRI|  Type   |\n      +---------------+\n\n2nd byte in payload: FU header (if type in first byte is 28)\n      +---------------+\n      |0|1|2|3|4|5|6|7|\n      +-+-+-+-+-+-+-+-+\n      |S|E|R|  Type   | S = start, E = end\n      +---------------+\n*/\n\nconst h264Debug = debug('msl:h264depay')\n\nexport class H264DepayParser {\n  private _buffer: Buffer\n\n  constructor() {\n    this._buffer = Buffer.alloc(0)\n  }\n\n  parse(rtp: RtpMessage): H264Message | null {\n    const rtpPayload = payload(rtp.data)\n    const type = rtpPayload[0] & 0x1f\n\n    if (type === 28) {\n      /* FU-A NALU */ const fuIndicator = rtpPayload[0]\n      const fuHeader = rtpPayload[1]\n      const startBit = !!(fuHeader >> 7)\n      const nalType = fuHeader & 0x1f\n      const nal = (fuIndicator & 0xe0) | nalType\n      const stopBit = fuHeader & 64\n      if (startBit) {\n        this._buffer = Buffer.concat([\n          Buffer.from([0, 0, 0, 0, nal]),\n          rtpPayload.slice(2),\n        ])\n        return null\n      } else if (stopBit) {\n        /* receieved end bit */ const h264frame = Buffer.concat([\n          this._buffer,\n          rtpPayload.slice(2),\n        ])\n        h264frame.writeUInt32BE(h264frame.length - 4, 0)\n        const msg: H264Message = {\n          data: h264frame,\n          type: MessageType.H264,\n          timestamp: timestamp(rtp.data),\n          ntpTimestamp: rtp.ntpTimestamp,\n          payloadType: payloadType(rtp.data),\n          nalType,\n        }\n        this._buffer = Buffer.alloc(0)\n        return msg\n      }\n      // Put the received data on the buffer and cut the header bytes\n      this._buffer = Buffer.concat([this._buffer, rtpPayload.slice(2)])\n      return null\n    } else if (\n      (type === NAL_TYPES.NON_IDR_PICTURE || type === NAL_TYPES.IDR_PICTURE) &&\n      this._buffer.length === 0\n    ) {\n      /* Single NALU */ const h264frame = Buffer.concat([\n        Buffer.from([0, 0, 0, 0]),\n        rtpPayload,\n      ])\n      h264frame.writeUInt32BE(h264frame.length - 4, 0)\n      const msg: H264Message = {\n        data: h264frame,\n        type: MessageType.H264,\n        timestamp: timestamp(rtp.data),\n        ntpTimestamp: rtp.ntpTimestamp,\n        payloadType: payloadType(rtp.data),\n        nalType: type,\n      }\n      this._buffer = Buffer.alloc(0)\n      return msg\n    }\n    h264Debug(\n      `H264depayComponent can only extract types 1,5 and 28, got ${type}`\n    )\n    this._buffer = Buffer.alloc(0)\n    return null\n  }\n}\n", "import { Transform } from 'stream'\n\nimport { Tube } from '../component'\nimport { GenericMessage, MessageType } from '../message'\n\nconst generateLogger = (prefix: string, type?: MessageType) => {\n  let lastTimestamp = Date.now()\n\n  const log = (msg: GenericMessage) => {\n    const timestamp = Date.now()\n    console.log(`${prefix}: +${timestamp - lastTimestamp}ms`, msg)\n    lastTimestamp = timestamp\n  }\n\n  if (type === undefined) {\n    return log\n  }\n  return (msg: GenericMessage) => msg.type === type && log(msg)\n}\n\n/**\n * Component that logs whatever is passing through.\n */\nexport class Inspector extends Tube {\n  /**\n   * Create a new inspector component.\n   * @argument {String} type  The type of message to log (default is to log all).\n   * @return {undefined}\n   */\n  constructor(type?: MessageType) {\n    const incomingLogger = generateLogger('incoming', type)\n\n    const incoming = new Transform({\n      objectMode: true,\n      transform(msg, encoding, callback) {\n        incomingLogger(msg)\n        callback(undefined, msg)\n      },\n    })\n\n    const outgoingLogger = generateLogger('outgoing', type)\n\n    const outgoing = new Transform({\n      objectMode: true,\n      transform(msg, encoding, callback) {\n        outgoingLogger(msg)\n        callback(undefined, msg)\n      },\n    })\n\n    super(incoming, outgoing)\n  }\n}\n", "import { Transform } from 'stream'\n\nimport { marker, payloadType, timestamp } from '../../utils/protocols/rtp'\nimport { VideoMedia } from '../../utils/protocols/sdp'\nimport { Tube } from '../component'\nimport { Message, MessageType } from '../message'\n\nimport { jpegDepayFactory } from './parser'\n\nexport class JPEGDepay extends Tube {\n  constructor() {\n    let jpegPayloadType: number\n    let packets: Buffer[] = []\n    let jpegDepay: (packets: Buffer[]) => {\n      size: { width: number; height: number }\n      data: Buffer\n    }\n\n    const incoming = new Transform({\n      objectMode: true,\n      transform(msg: Message, encoding, callback) {\n        if (msg.type === MessageType.SDP) {\n          const jpegMedia = msg.sdp.media.find((media): media is VideoMedia => {\n            return (\n              media.type === 'video' &&\n              media.rtpmap !== undefined &&\n              media.rtpmap.encodingName === 'JPEG'\n            )\n          })\n          if (jpegMedia !== undefined && jpegMedia.rtpmap !== undefined) {\n            jpegPayloadType = Number(jpegMedia.rtpmap.payloadType)\n            const framesize = jpegMedia.framesize\n            // `framesize` is an SDP field that is present in e.g. Axis camera's\n            // and is used because the width and height that can be sent inside\n            // the JPEG header are both limited to 2040.\n            // If present, we use this width and height as the default values\n            // to be used by the jpeg depay function, otherwise we ignore this\n            // and let the JPEG header inside the RTP packets determine this.\n            if (framesize !== undefined) {\n              const [width, height] = framesize\n              // msg.framesize = { width, height }\n              jpegDepay = jpegDepayFactory(width, height)\n            } else {\n              jpegDepay = jpegDepayFactory()\n            }\n          }\n\n          callback(undefined, msg)\n        } else if (\n          msg.type === MessageType.RTP &&\n          payloadType(msg.data) === jpegPayloadType\n        ) {\n          packets.push(msg.data)\n\n          // JPEG over RTP uses the RTP marker bit to indicate end\n          // of fragmentation. At this point, the packets can be used\n          // to reconstruct a JPEG frame.\n          if (marker(msg.data) && packets.length > 0) {\n            const jpegFrame = jpegDepay(packets)\n            this.push({\n              timestamp: timestamp(msg.data),\n              ntpTimestamp: msg.ntpTimestamp,\n              payloadType: payloadType(msg.data),\n              data: jpegFrame.data,\n              framesize: jpegFrame.size,\n              type: MessageType.JPEG,\n            })\n            packets = []\n          }\n          callback()\n        } else {\n          // Not a message we should handle\n          callback(undefined, msg)\n        }\n      },\n    })\n\n    // outgoing will be defaulted to a PassThrough stream\n    super(incoming)\n  }\n}\n", "/**\n * Generate frame and scan headers that can be prepended to the\n * RTP/JPEG data payload to produce a JPEG compressed image in\n * interchange format.\n *\n * For detailed information, check Appendix A of:\n * https://tools.ietf.org/html/rfc2435\n */\n\nexport function makeImageHeader() {\n  return Buffer.from([0xff, 0xd8])\n}\n\nexport function makeQuantHeader(precision: number, qTable: Buffer) {\n  const lumSize = precision & 1 ? 128 : 64\n  const chmSize = precision & 2 ? 128 : 64\n  if (qTable.length !== lumSize + chmSize) {\n    throw new Error('invalid quantization table')\n  }\n  const lumaPrefix = Buffer.from([0xff, 0xdb, 0, lumSize + 3, 0])\n  const chromaPrefix = Buffer.from([0xff, 0xdb, 0, chmSize + 3, 1])\n  return Buffer.concat([\n    lumaPrefix,\n    qTable.slice(0, lumSize),\n    chromaPrefix,\n    qTable.slice(lumSize),\n  ])\n}\n\nexport function makeFrameHeader(width: number, height: number, type: number) {\n  return Buffer.from([\n    0xff,\n    0xc0, // SOF_0 (Start Of Frame)\n    0,\n    17,\n    8,\n    height >> 8,\n    height,\n    width >> 8,\n    width,\n    3,\n    0,\n    type === 0 ? 0x21 : 0x22,\n    0,\n    1,\n    0x11,\n    1,\n    2,\n    0x11,\n    1,\n  ])\n}\n\n// biome-ignore format: custom formatting\nconst LUM_DC_CODELENS = [0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]\n// biome-ignore format: custom formatting\nconst LUM_DC_SYMBOLS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n// biome-ignore format: custom formatting\nconst LUM_AC_CODELENS = [0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d]\n// biome-ignore format: custom formatting\nconst LUM_AC_SYMBOLS = [\n  0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13,\n  0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42,\n  0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a,\n  0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35,\n  0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,\n  0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67,\n  0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84,\n  0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,\n  0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3,\n  0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,\n  0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1,\n  0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4,\n  0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,\n]\n// biome-ignore format: custom formatting\nconst CHM_DC_CODELENS = [0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]\n// biome-ignore format: custom formatting\nconst CHM_DC_SYMBOLS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n// biome-ignore format: custom formatting\nconst CHM_AC_CODELENS = [0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77]\n// biome-ignore format: custom formatting\nconst CHM_AC_SYMBOLS = [\n  0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51,\n  0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,\n  0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24,\n  0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a,\n  0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,\n  0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,\n  0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82,\n  0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,\n  0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,\n  0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,\n  0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,\n  0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,\n  0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,\n]\n\nexport function makeHuffmanHeader() {\n  const LUM_DC_BUFFER = [\n    [\n      0xff,\n      0xc4,\n      0,\n      3 + LUM_DC_CODELENS.length + LUM_DC_SYMBOLS.length,\n      (0 << 4) | 0,\n    ],\n    LUM_DC_CODELENS,\n    LUM_DC_SYMBOLS,\n  ]\n\n  const LUM_AC_BUFFER = [\n    [\n      0xff,\n      0xc4,\n      0,\n      3 + LUM_AC_CODELENS.length + LUM_AC_SYMBOLS.length,\n      (1 << 4) | 0,\n    ],\n    LUM_AC_CODELENS,\n    LUM_AC_SYMBOLS,\n  ]\n\n  const CHM_DC_BUFFER = [\n    [\n      0xff,\n      0xc4,\n      0,\n      3 + CHM_DC_CODELENS.length + CHM_DC_SYMBOLS.length,\n      (0 << 4) | 1,\n    ],\n    CHM_DC_CODELENS,\n    CHM_DC_SYMBOLS,\n  ]\n\n  const CHM_AC_BUFFER = [\n    [\n      0xff,\n      0xc4,\n      0,\n      3 + CHM_AC_CODELENS.length + CHM_AC_SYMBOLS.length,\n      (1 << 4) | 1,\n    ],\n    CHM_AC_CODELENS,\n    CHM_AC_SYMBOLS,\n  ]\n\n  return Buffer.concat([\n    ...LUM_DC_BUFFER.map(Buffer.from),\n    ...LUM_AC_BUFFER.map(Buffer.from),\n    ...CHM_DC_BUFFER.map(Buffer.from),\n    ...CHM_AC_BUFFER.map(Buffer.from),\n  ])\n}\n\nexport function makeScanHeader() {\n  return Buffer.from([\n    0xff,\n    0xda, // SOS (Start Of Scan)\n    0,\n    12,\n    3,\n    0,\n    0,\n    1,\n    0x11,\n    2,\n    0x11,\n    0,\n    63,\n    0,\n  ])\n}\n\nexport function makeDRIHeader(dri: number) {\n  return Buffer.from([0xff, 0xdd, 0x00, 4, dri >> 8, dri & 0xff])\n}\n", "export function clamp(val: number, min: number, max: number): number {\n  return val > max ? max : val < min ? min : val\n}\n", "import { clamp } from '../../utils/clamp'\n/**\n * @function makeQtable\n * Creating a quantization table from a Q factor\n * Example Code from RFC 2435 Appendix A ported to TypeScript\n *\n * Default luminance/chrominance quantization tables in RFC example are not in zig-zag order.\n * The RFC does not mention that default tables should be in zig-zag ordering,\n * but they say that about the included tables. RFC sample code appears to have a mistake.\n * All the tested cameras and LGPL projects use zig-zag default tables.\n * So we use zig-zaged tables from ISO/IEC 10918-1 Annex K Section K.1\n * @see https://tools.ietf.org/html/rfc2435\n * @see https://www.iso.org/standard/18902.html\n */\n// biome-ignore format: custom formatting\nconst jpegLumaQuantizer = [\n  16, 11, 12, 14, 12, 10, 16, 14, 13, 14, 18, 17, 16, 19, 24, 40, 26, 24, 22,\n  22, 24, 49, 35, 37, 29, 40, 58, 51, 61, 60, 57, 51, 56, 55, 64, 72, 92, 78,\n  64, 68, 87, 69, 55, 56, 80, 109, 81, 87, 95, 98, 103, 104, 103, 62, 77, 113,\n  121, 112, 100, 120, 92, 101, 103, 99,\n]\n// biome-ignore format: custom formatting\nconst jpeChromaQuantizer = [\n  17, 18, 18, 24, 21, 24, 47, 26, 26, 47, 99, 66, 56, 66, 99, 99, 99, 99, 99,\n  99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,\n  99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,\n  99, 99, 99, 99, 99, 99, 99,\n]\n\nexport function makeQtable(Q: number): Buffer {\n  const factor = clamp(Q, 1, 99)\n  const buffer = Buffer.alloc(128)\n  const S = Q < 50 ? Math.floor(5000 / factor) : 200 - factor * 2\n\n  for (let i = 0; i < 64; i++) {\n    const lq = Math.floor((jpegLumaQuantizer[i] * S + 50) / 100)\n    const cq = Math.floor((jpeChromaQuantizer[i] * S + 50) / 100)\n    buffer.writeUInt8(clamp(lq, 1, 255), i)\n    buffer.writeUInt8(clamp(cq, 1, 255), i + 64)\n  }\n  return buffer\n}\n", "import { payload } from '../../utils/protocols/rtp'\n\nimport {\n  makeDRIHeader,\n  makeFrameHeader,\n  makeHuffmanHeader,\n  makeImageHeader,\n  makeQuantHeader,\n  makeScanHeader,\n} from './headers'\nimport { makeQtable } from './make-qtable'\n\n/**\n * Each packet contains a special JPEG header which immediately follows\n * the RTP header.  The first 8 bytes of this header, called the \"main\n * JPEG header\", are as follows:*\n *  0                   1                   2                   3\n *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | Type-specific |              Fragment Offset                  |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |      Type     |       Q       |     Width     |     Height    |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\n/**\n * Restart Marker header: when using types 64-127\n *  0                   1                   2                   3\n *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |       Restart Interval        |F|L|       Restart Count       |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\n/**\n * Quantization Table header: when using Q values 128-255\n *  0                   1                   2                   3\n *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |      MBZ      |   Precision   |             Length            |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |                    Quantization Table Data                    |\n * |                              ...                              |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport function jpegDepayFactory(defaultWidth = 0, defaultHeight = 0) {\n  const IMAGE_HEADER = makeImageHeader()\n  const HUFFMAN_HEADER = makeHuffmanHeader()\n  const SCAN_HEADER = makeScanHeader()\n\n  return function jpegDepay(packets: Buffer[]) {\n    let metadata\n    const fragments: Buffer[] = []\n    for (const packet of packets) {\n      let fragment = payload(packet)\n\n      // Parse and extract JPEG header.\n      const typeSpecific = fragment.readUInt8(0)\n      const fragmentOffset =\n        (fragment.readUInt8(1) << 16) |\n        (fragment.readUInt8(2) << 8) |\n        fragment.readUInt8(3)\n      const type = fragment.readUInt8(4)\n      const Q = fragment.readUInt8(5)\n      const width = fragment.readUInt8(6) * 8 || defaultWidth\n      const height = fragment.readUInt8(7) * 8 || defaultHeight\n      fragment = fragment.slice(8)\n\n      // Parse and extract Restart Marker header if present.\n      let DRI = 0\n      if (type >= 64 && type <= 127) {\n        DRI = fragment.readUInt16BE(0)\n        fragment = fragment.slice(4)\n      }\n\n      // Parse and extract Quantization Table header if present.\n      if (Q >= 128 && fragmentOffset === 0) {\n        // const MBZ = fragment.readUInt8()\n        const precision = fragment.readUInt8(1)\n        const length = fragment.readUInt16BE(2)\n        const qTable = fragment.slice(4, 4 + length)\n        metadata = {\n          typeSpecific,\n          type,\n          width,\n          height,\n          DRI,\n          precision,\n          qTable,\n        }\n        fragment = fragment.slice(4 + length)\n      } // Compute Quantization Table\n      else if (Q < 128 && fragmentOffset === 0) {\n        const precision = 0\n        const qTable = makeQtable(Q)\n        metadata = {\n          typeSpecific,\n          type,\n          width,\n          height,\n          DRI,\n          precision,\n          qTable,\n        }\n      }\n\n      fragments.push(fragment)\n    }\n\n    if (metadata === undefined) {\n      throw new Error('no quantization header present')\n    }\n\n    const { precision, qTable, type, width, height } = metadata\n\n    const quantHeader = makeQuantHeader(precision, qTable)\n\n    const driHeader =\n      metadata.DRI === 0 ? Buffer.alloc(0) : makeDRIHeader(metadata.DRI)\n\n    const frameHeader = makeFrameHeader(width, height, type)\n\n    return {\n      size: { width, height },\n      data: Buffer.concat([\n        IMAGE_HEADER,\n        quantHeader,\n        driHeader,\n        frameHeader,\n        HUFFMAN_HEADER,\n        SCAN_HEADER,\n        ...fragments,\n      ]),\n    }\n  }\n}\n", "import debug from 'debug'\n\nimport { Transform } from 'stream'\n\nimport { Tube } from '../component'\nimport { Message, MessageType } from '../message'\n\nconst MAX_CAPTURE_BYTES = 225000000 // 5 min at a rate of 6 Mbit/s\n\n/**\n * Component that records MP4 data.\n */\nexport class Mp4Capture extends Tube {\n  private _active: boolean\n  private _capture: boolean\n  private _captureCallback: (buffer: Buffer) => void\n  private _bufferOffset: number\n  private readonly _bufferSize: number\n  private _buffer: Buffer\n\n  constructor(maxSize = MAX_CAPTURE_BYTES) {\n    const incoming = new Transform({\n      objectMode: true,\n      transform: (msg: Message, _encoding, callback) => {\n        // Arrival of ISOM with tracks indicates new movie, start recording if active.\n        if (\n          this._active &&\n          msg.type === MessageType.ISOM &&\n          msg.tracks !== undefined\n        ) {\n          this._capture = true\n        }\n\n        // If capture enabled, record all ISOM (MP4) boxes\n        if (this._capture && msg.type === MessageType.ISOM) {\n          if (\n            this._bufferOffset <\n            this._buffer.byteLength - msg.data.byteLength\n          ) {\n            msg.data.copy(this._buffer, this._bufferOffset)\n            this._bufferOffset += msg.data.byteLength\n          } else {\n            this.stop()\n          }\n        }\n        // Always pass on all messages\n        callback(undefined, msg)\n      },\n    })\n\n    // Stop any recording when the stream is closed.\n    incoming.on('finish', () => {\n      this.stop()\n    })\n\n    super(incoming)\n\n    this._buffer = Buffer.allocUnsafe(0)\n    this._bufferSize = maxSize\n    this._bufferOffset = 0\n\n    this._active = false\n    this._capture = false\n    this._captureCallback = () => {\n      /** noop */\n    }\n  }\n\n  /**\n   * Activate video capture. The capture will begin when a new movie starts,\n   * and will terminate when the movie ends or when the buffer is full. On\n   * termination, the callback you passed will be called with the captured\n   * data as argument.\n   * @param callback  Will be called when data is captured.\n   */\n  start(callback: (buffer: Buffer) => void) {\n    if (!this._active) {\n      debug('msl:capture:start')(callback)\n\n      this._captureCallback = callback\n\n      this._buffer = Buffer.allocUnsafe(this._bufferSize)\n      this._bufferOffset = 0\n\n      this._active = true\n    }\n  }\n\n  /**\n   * Deactivate video capture. This ends an ongoing capture and prevents\n   * any further capturing.\n   */\n  stop() {\n    if (this._active) {\n      debug('msl:capture:stop')(`captured bytes: ${this._bufferOffset}`)\n\n      try {\n        this._captureCallback(this._buffer.slice(0, this._bufferOffset))\n      } catch (e) {\n        console.error(e)\n      }\n\n      this._buffer = Buffer.allocUnsafe(0)\n      this._bufferOffset = 0\n\n      this._active = false\n      this._capture = false\n    }\n  }\n}\n", "import debug from 'debug'\n\nimport { Transform } from 'stream'\n\nimport { Tube } from '../component'\nimport { NAL_TYPES } from '../h264depay/parser'\nimport { Message, MessageType } from '../message'\n\nimport { BoxBuilder } from './helpers/boxbuilder'\nimport { Box } from './helpers/isom'\n\n/**\n * Component that converts elementary stream data into MP4 boxes honouring\n * the ISO BMFF Byte Stream (Some extra restrictions are involved).\n */\nexport class Mp4Muxer extends Tube {\n  public boxBuilder: BoxBuilder\n  public onSync?: (ntpPresentationTime: number) => void\n  /**\n   * Create a new mp4muxer component.\n   * @return {undefined}\n   */\n  constructor() {\n    const boxBuilder = new BoxBuilder()\n    const onSync = (ntpPresentationTime: number) => {\n      this.onSync && this.onSync(ntpPresentationTime)\n    }\n    const incoming = new Transform({\n      objectMode: true,\n      transform(msg: Message, encoding, callback) {\n        if (msg.type === MessageType.SDP) {\n          /**\n           * Arrival of SDP signals the beginning of a new movie.\n           * Set up the ftyp and moov boxes.\n           */\n\n          // Why is this here? These should be default inside the mvhd box?\n          const now = Math.floor(new Date().getTime() / 1000 + 2082852000)\n          const ftyp = new Box('ftyp')\n          const moov = boxBuilder.moov(msg.sdp, now)\n\n          const data = Buffer.allocUnsafe(ftyp.byteLength + moov.byteLength)\n          ftyp.copy(data, 0)\n          moov.copy(data, ftyp.byteLength)\n\n          debug('msl:mp4:isom')(`ftyp: ${ftyp.format()}`)\n          debug('msl:mp4:isom')(`moov: ${moov.format()}`)\n\n          // Set up a list of tracks that contain info about\n          // the type of media, encoding, and codec are present.\n          const tracks = msg.sdp.media.map((media) => {\n            return {\n              type: media.type,\n              encoding: media.rtpmap && media.rtpmap.encodingName,\n              mime: media.mime,\n              codec: media.codec,\n            }\n          })\n\n          this.push({ type: MessageType.ISOM, data, tracks, ftyp, moov })\n        } else if (\n          msg.type === MessageType.ELEMENTARY ||\n          msg.type === MessageType.H264\n        ) {\n          /**\n           * Otherwise we are getting some elementary stream data.\n           * Set up the moof and mdat boxes.\n           */\n\n          const { payloadType, timestamp, ntpTimestamp } = msg\n          const trackId = boxBuilder.trackIdMap[payloadType]\n\n          if (trackId) {\n            if (!boxBuilder.ntpPresentationTime) {\n              boxBuilder.setPresentationTime(trackId, ntpTimestamp)\n              if (boxBuilder.ntpPresentationTime) {\n                onSync(boxBuilder.ntpPresentationTime)\n              }\n            }\n\n            let checkpointTime: number | undefined\n            const idrPicture =\n              msg.type === MessageType.H264\n                ? msg.nalType === NAL_TYPES.IDR_PICTURE\n                : undefined\n            if (\n              boxBuilder.ntpPresentationTime &&\n              idrPicture &&\n              msg.ntpTimestamp !== undefined\n            ) {\n              checkpointTime =\n                (msg.ntpTimestamp - boxBuilder.ntpPresentationTime) / 1000\n            }\n\n            const byteLength = msg.data.byteLength\n            const moof = boxBuilder.moof({ trackId, timestamp, byteLength })\n            const mdat = boxBuilder.mdat(msg.data)\n\n            const data = Buffer.allocUnsafe(moof.byteLength + mdat.byteLength)\n            moof.copy(data, 0)\n            mdat.copy(data, moof.byteLength)\n\n            this.push({\n              type: MessageType.ISOM,\n              data,\n              moof,\n              mdat,\n              ntpTimestamp,\n              checkpointTime,\n            })\n          }\n        } else {\n          // No message type we recognize, pass it on.\n          this.push(msg)\n        }\n        callback()\n      },\n    })\n\n    super(incoming)\n    this.boxBuilder = boxBuilder\n  }\n\n  get bitrate() {\n    return (\n      this.boxBuilder.trackData &&\n      this.boxBuilder.trackData.map((data) => data.bitrate)\n    )\n  }\n\n  get framerate() {\n    return (\n      this.boxBuilder.trackData &&\n      this.boxBuilder.trackData.map((data) => data.framerate)\n    )\n  }\n\n  get ntpPresentationTime() {\n    return this.boxBuilder.ntpPresentationTime\n  }\n}\n", "// Elements: parts of a box that hold values.\n// They should have a:\n// - byteLength\n// - value (can be accessed from outside to set/retrieve)\n// - store(buffer, offset) -> write the value to a buffer\n// - load(buffer, offset) -> read data and store in value\n\nimport { MediaTrack } from '../../../utils/protocols/isom'\n\ntype BufferMutation = (buffer: Buffer, offset: number) => void\n\n// Constants\nconst UINT32_RANGE = Math.pow(2, 32)\n\nabstract class BoxElement {\n  public byteLength: number\n  public value: any\n  abstract copy(buffer: Buffer, offset: number): void\n  abstract load(buffer: Buffer, offset: number): void\n\n  constructor(size: number) {\n    this.byteLength = size\n  }\n}\n\nclass Empty extends BoxElement {\n  constructor(size = 0) {\n    super(size)\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    buffer.fill(0, offset, offset + this.byteLength)\n  }\n\n  load() {\n    /** noop */\n  }\n}\n\nclass CharArray extends BoxElement {\n  public value: string\n\n  constructor(s: string) {\n    super(s.length)\n    this.value = s\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    for (let i = 0; i < this.byteLength; i += 1) {\n      buffer[offset + i] = this.value.charCodeAt(i)\n    }\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    this.value = buffer\n      .slice(offset, offset + this.byteLength)\n      .toString('ascii')\n  }\n}\n\nclass UInt8 extends BoxElement {\n  public value: number\n\n  constructor(scalar = 0) {\n    super(1)\n    this.value = scalar\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    buffer.writeUInt8(this.value, offset)\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    this.value = buffer.readUInt8(offset)\n  }\n}\n\nclass UInt8Array extends BoxElement {\n  public value: number[]\n\n  constructor(array: number[]) {\n    super(array.length)\n    this.value = array\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    for (let i = 0; i < this.value.length; ++i) {\n      buffer.writeUInt8(this.value[i], offset + i)\n    }\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    for (let i = 0; i < this.value.length; ++i) {\n      this.value[i] = buffer.readUInt8(offset + i)\n    }\n  }\n}\n\nclass UInt16BE extends BoxElement {\n  public value: number\n\n  constructor(scalar = 0) {\n    super(2)\n    this.value = scalar\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    buffer.writeUInt16BE(this.value, offset)\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    this.value = buffer.readUInt16BE(offset)\n  }\n}\n\nclass UInt24BE extends BoxElement {\n  public value: number\n\n  constructor(scalar = 0) {\n    super(3)\n    this.value = scalar\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    buffer.writeUInt8((this.value >> 16) & 0xff, offset)\n    buffer.writeUInt8((this.value >> 8) & 0xff, offset + 1)\n    buffer.writeUInt8(this.value & 0xff, offset + 2)\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    this.value =\n      (buffer.readUInt8(offset) << (16 + buffer.readUInt8(offset + 1))) <<\n      (8 + buffer.readUInt8(offset + 2))\n  }\n}\n\nclass UInt16BEArray extends BoxElement {\n  public value: number[]\n\n  constructor(array: number[]) {\n    super(array.length * 2)\n    this.value = array\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    for (let i = 0; i < this.value.length; ++i) {\n      buffer.writeUInt16BE(this.value[i], offset + 2 * i)\n    }\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    for (let i = 0; i < this.value.length; ++i) {\n      this.value[i] = buffer.readUInt16BE(offset + 2 * i)\n    }\n  }\n}\n\nclass UInt32BE extends BoxElement {\n  public value: number\n\n  constructor(scalar = 0) {\n    super(4)\n    this.value = scalar\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    buffer.writeUInt32BE(this.value, offset)\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    this.value = buffer.readUInt32BE(offset)\n  }\n}\n\nclass UInt32BEArray extends BoxElement {\n  public value: number[]\n\n  constructor(array: number[]) {\n    super(array.length * 4)\n    this.value = array\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    for (let i = 0; i < this.value.length; ++i) {\n      buffer.writeUInt32BE(this.value[i], offset + 4 * i)\n    }\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    for (let i = 0; i < this.value.length; ++i) {\n      this.value[i] = buffer.readUInt32BE(offset + 4 * i)\n    }\n  }\n}\n\nclass UInt64BE extends BoxElement {\n  public value: number\n\n  constructor(scalar = 0) {\n    super(8)\n    this.value = scalar\n  }\n\n  copy: BufferMutation = (buffer, offset) => {\n    const high = (this.value / UINT32_RANGE) | 0\n    const low = this.value - high * UINT32_RANGE\n    buffer.writeUInt32BE(high, offset)\n    buffer.writeUInt32BE(low, offset + 4)\n  }\n\n  load: BufferMutation = (buffer, offset) => {\n    const high = buffer.readUInt32BE(offset)\n    const low = buffer.readUInt32BE(offset + 4)\n    this.value = high * UINT32_RANGE + low\n  }\n}\n\n/**\n * Class factory for a parameter set element. A parameter set groups a size,\n * and an array of parameter sets consisting each of a size and a byte array.\n * These elements are used by the avcC box.\n * @param  [sizeMask=0x00]  A bit mask to use for the size.\n * @return An element type that groups parameter sets.\n */\nconst createParameterSetArrayClass = function (sizeMask = 0x00) {\n  return class ParameterSetArray extends BoxElement {\n    public value: any[]\n    /**\n     * Takes an array of byte-arrays\n     * @param  array The array of byte arrays\n     */\n    constructor(array: number[][]) {\n      super(0)\n      // this.setLengths = array.map((byteArray) => byteArray.length);\n      this.value = array.reduce(\n        (flatArray: any, byteArray) => {\n          return flatArray.concat(\n            new UInt16BE(byteArray.length),\n            new UInt8Array(byteArray)\n          )\n        },\n        [new UInt8(sizeMask | array.length)]\n      )\n      this.byteLength = this.value.reduce(\n        (total, element) => total + element.byteLength,\n        0\n      )\n    }\n\n    copy: BufferMutation = (buffer, offset) => {\n      let i = 0\n      for (const element of this.value) {\n        element.copy(buffer, offset + i)\n        i += element.byteLength\n      }\n    }\n\n    load: BufferMutation = () => {\n      /** noop */\n    }\n  }\n}\n\ninterface BoxSpec {\n  container?: string\n  mandatory?: boolean\n  quantity?: string\n  box: 'Box' | 'FullBox' | 'None'\n  is_container: boolean\n  body?: Array<[string, any, any?]>\n  config?: any\n}\n\n/**\n * Specifications for a selection of ISO BMFF box types.\n *\n * Most of these are defined in ISO/IEC 14496-12,\n * For specific boxes like avc1/avcC/mp4a/esds the exact document is specified\n * with the appropriate box/descriptor.\n *\n * To add a new box, follow the same pattern: you need an object with at least\n * the property 'box' (which is 'Box' or 'FullBox') and for non-container boxes\n * you need also a 'body' property specifying the elements that the box contains.\n * The values assigned to each element in the spec are used as default.\n */\n\nconst BOXSPEC: { [key: string]: BoxSpec } = {\n  // File Type Box\n  ftyp: {\n    container: 'file',\n    mandatory: true,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n    body: [\n      ['major_brand', CharArray, 'isom'],\n      ['minor_version', UInt32BE, 0],\n      ['compatible_brands', CharArray, 'mp41'],\n      // ['compatible_brands1', CharArray, 'iso2'],\n      // ['compatible_brands2', CharArray, 'dash'],\n    ],\n  },\n  // Movie Container\n  moov: {\n    container: 'file',\n    mandatory: true,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n  },\n  // Movie Data Box\n  mdat: {\n    container: 'file',\n    mandatory: false,\n    quantity: 'any',\n    box: 'Box',\n    is_container: false,\n    body: [],\n  },\n  // Movie Header Box\n  mvhd: {\n    container: 'moov',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['creation_time', UInt32BE, 0],\n      ['modification_time', UInt32BE, 0],\n      ['timescale', UInt32BE, 1000], // time-scale for entire presentation, default = milliseconds\n      ['duration', UInt32BE, 0xffffffff], // length of entire presentation, default = undetermined\n      ['rate', UInt32BE, 0x00010000], // fixed point 16.16, preferred playback rate, default = 1.0\n      ['volume', UInt16BE, 0x0100], // fixed point 8.8, preferred playback volume, default = 1.0\n      ['reserved', Empty, 10],\n      // transformation matrix, default = unity\n      [\n        'matrix',\n        UInt32BEArray,\n        [0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000],\n      ],\n      ['pre_defined', Empty, 24],\n      ['next_track_ID', UInt32BE, 0xffffffff], // next unused track ID, default = unknown\n    ],\n  },\n  // Track Container\n  trak: {\n    container: 'moov',\n    mandatory: true,\n    quantity: 'one+',\n    box: 'Box',\n    is_container: true,\n  },\n  // Track Header Box\n  tkhd: {\n    container: 'trak',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    // Flag values for the track header:\n    // 0x000001 Track_enabled: track enabled (otherwise ignored)\n    // 0x000002 Track_in_movie: track used in presentation\n    // 0x000004 Track_in_preview: used when previewing presentation\n    config: {\n      flags: 0x000003, // track enabled and used in presentation\n    },\n    body: [\n      ['creation_time', UInt32BE, 0],\n      ['modification_time', UInt32BE, 0],\n      ['track_ID', UInt32BE, 1], // Track identifier, cannot be 0\n      ['reserved', Empty, 4],\n      ['duration', UInt32BE, 0], // Duration of track using timescale of mvhd box\n      ['reserved2', Empty, 8],\n      ['layer', UInt16BE, 0], // Front-to-back ordering, lower is closer to viewer\n      ['alternate_group', UInt16BE, 0], // Possible grouping of tracks\n      ['volume', UInt16BE, 0x0100], // Track's relative audio volume 8.8 fixed point\n      ['reserved3', Empty, 2],\n      [\n        'matrix',\n        UInt32BEArray,\n        [0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000],\n      ],\n      ['width', UInt32BE, 0], // Visual presentation width, 16.16 fixed point\n      ['height', UInt32BE, 0], // Visual presentation height, 16.16 fixed point\n    ],\n  },\n  // Track Reference Box\n  tref: {\n    container: 'trak',\n    mandatory: false,\n    quantity: 'one-',\n    box: 'Box',\n    is_container: false,\n  },\n  // Media Container\n  mdia: {\n    container: 'trak',\n    mandatory: false,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n  },\n  // Media Header Box\n  mdhd: {\n    container: 'mdia',\n    mandatory: false,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['creation_time', UInt32BE, 0],\n      ['modification_time', UInt32BE, 0],\n      ['timescale', UInt32BE, 1000], // time-scale for entire presentation, default = milliseconds\n      ['duration', UInt32BE, 0xffffffff], // length of entire presentation, default = undetermined\n      ['language', UInt16BE, 0], // ISO 639-2 lanugage code, three lower-case letters, stored as\n      ['pre_defined', UInt16BE, 0],\n    ],\n  },\n  // Handler Reference Box\n  hdlr: {\n    container: 'mdia',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['predefined', UInt32BE, 0],\n      ['handler_type', CharArray, 'vide'], // 'vide', 'soun', or 'hint'\n      ['reserved', Empty, 12],\n      ['name', CharArray, 'VideoHandler\\0'],\n    ],\n  },\n  // Media Information Container\n  minf: {\n    container: 'mdia',\n    mandatory: true,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n  },\n  // Video Media Header Box\n  vmhd: {\n    container: 'minf',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    config: {\n      flags: 0x000001,\n    },\n    body: [\n      ['graphicsmode', UInt16BE, 0], // Composition mode of the video track, 0 = overwrite\n      ['opcolor', UInt16BEArray, [0, 0, 0]], // Red green blue, for use by graphics modes\n    ],\n  },\n  // Sound Media Header Box\n  smhd: {\n    container: 'minf',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      // Place mono track in stereo space:\n      //  8.8 fixed point, 0 = center, -1.0 = left, 1.0 = right\n      ['balance', UInt16BE, 0x0000],\n      ['reserved', UInt16BE],\n    ],\n  },\n  // Data Information Container\n  dinf: {\n    container: 'minf',\n    mandatory: true,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n  },\n  // Data Reference Box\n  dref: {\n    // When adding elements to this box, update the entry_count value!\n    container: 'dinf',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: true,\n    body: [\n      ['entry_count', UInt32BE, 0], // Number of entries.\n    ],\n  },\n  'url ': {\n    container: 'dref',\n    mandatory: true,\n    quantity: 'one+',\n    box: 'FullBox',\n    is_container: false,\n    // Flag values:\n    // 0x000001 Local reference, which means empty URL\n    config: {\n      flags: 0x000001,\n    },\n    body: [\n      // ['location', CharArray, ''],\n    ],\n  },\n  // Sample Table Container\n  stbl: {\n    container: 'minf',\n    mandatory: true,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n  },\n  // Decoding Time to Sample Box\n  stts: {\n    container: 'stbl',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['entry_count', UInt32BE, 0],\n      // For each entry these two elements:\n      // ['sample_count', UInt32BE, 0], // Number of consecutive samples with same delta\n      // ['sample_delta', UInt32BE, 0], // Delta of each sample\n    ],\n  },\n  stsd: {\n    container: 'stbl',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: true,\n    body: [\n      ['entry_count', UInt32BE, 1],\n      // For each entry, one of these three boxes depending on the handler:\n      // VisualSampleEntry, AudioSampleEntry, HintSampleEntry\n    ],\n  },\n  /*\n  ISO/IEC 14496-12:2005(E) 8.16.2 (pp. 28)\n  aligned(8) abstract class SampleEntry (unsigned int(32) format)\n    extends Box(format){\n    const unsigned int(8)[6] reserved = 0;\n    unsigned int(16) data_reference_index;\n  }\n  class VisualSampleEntry(codingname) extends SampleEntry (codingname){\n    unsigned int(16) pre_defined = 0;\n    const unsigned int(16) reserved = 0;\n    unsigned int(32)[3] pre_defined = 0;\n    unsigned int(16) width;\n    unsigned int(16) height;\n    template unsigned int(32) horizresolution = 0x00480000; // 72 dpi\n    template unsigned int(32) vertresolution = 0x00480000; // 72 dpi\n    const unsigned int(32) reserved = 0;\n    template unsigned int(16) frame_count = 1;\n    string[32] compressorname;\n    template unsigned int(16) depth = 0x0018;\n    int(16) pre_defined = -1;\n  }\n  ISO/IEC 14496-15:2004(E) 5.3.4.1 (pp. 14)\n  class AVCSampleEntry() extends VisualSampleEntry (\u2018avc1\u2019){\n    AVCConfigurationBox config;\n    MPEG4BitRateBox (); // optional\n    MPEG4ExtensionDescriptorsBox (); // optional\n  }\n  */\n  avc1: {\n    container: 'stsd',\n    mandatory: false,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n    body: [\n      ['reserved', Empty, 6],\n      ['data_reference_index', UInt16BE, 1],\n      ['pre_defined', UInt16BE, 0],\n      ['reserved2', Empty, 2],\n      ['pre_defined2', UInt32BEArray, [0, 0, 0]],\n      ['width', UInt16BE, 1920],\n      ['height', UInt16BE, 1080],\n      ['horizresolution', UInt32BE, 0x00480000],\n      ['vertresolution', UInt32BE, 0x00480000],\n      ['reserved3', UInt32BE, 0],\n      ['frame_count', UInt16BE, 1],\n      ['compressorname', UInt8Array, Buffer.alloc(32)],\n      ['depth', UInt16BE, 0x0018],\n      ['pre_defined3', UInt16BE, 0xffff],\n    ],\n  },\n  /*\n  class AVCConfigurationBox extends Box(\u2018avcC\u2019) {\n    AVCDecoderConfigurationRecord() AVCConfig;\n  }\n  ISO/IEC 14496-15:2004(E) 5.2.4.1.1 (pp. 12)\n  aligned(8) class AVCDecoderConfigurationRecord {\n    unsigned int(8) configurationVersion = 1;\n    unsigned int(8) AVCProfileIndication;\n    unsigned int(8) profile_compatibility;\n    unsigned int(8) AVCLevelIndication;\n    bit(6) reserved = \u2018111111\u2019b;\n    unsigned int(2) lengthSizeMinusOne;\n    bit(3) reserved = \u2018111\u2019b;\n    unsigned int(5) numOfSequenceParameterSets;\n    for (i=0; i< numOfSequenceParameterSets; i++) {\n      unsigned int(16) sequenceParameterSetLength ;\n      bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;\n    }\n    unsigned int(8) numOfPictureParameterSets;\n    for (i=0; i< numOfPictureParameterSets; i++) {\n      unsigned int(16) pictureParameterSetLength;\n      bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;\n    }\n  }\n  */\n  avcC: {\n    container: 'avc1',\n    mandatory: false,\n    quantity: 'one',\n    box: 'Box',\n    is_container: false,\n    body: [\n      ['configurationVersion', UInt8, 1],\n      ['AVCProfileIndication', UInt8, 0x4d],\n      ['profile_compatibility', UInt8, 0x00],\n      ['AVCLevelIndication', UInt8, 0x29],\n      // size = reserved 0b111111 + 0b11 NALUnitLength (0b11 = 4-byte)\n      ['lengthSizeMinusOne', UInt8, 0b11111111],\n      // Example SPS (length 20):\n      //   [0x67, 0x4d, 0x00, 0x29, 0xe2, 0x90, 0x0f, 0x00,\n      //    0x44, 0xfc, 0xb8, 0x0b, 0x70, 0x10, 0x10, 0x1a,\n      //    0x41, 0xe2, 0x44, 0x54]\n      // number of sets = reserved 0b111 + number of SPS (0b00001 = 1)\n      // ['numOfSequenceParameterSets', UInt8, 0b11100001],\n      // ['sequenceParameterSetLength', UInt16BE, 0], // Lenght in bytes of the SPS that follows\n      // ['sequenceParameterSetNALUnit', UInt8Array, []],\n      // These are packed in a single custom element:\n      ['sequenceParameterSets', createParameterSetArrayClass(0xe0), []],\n      // Example PPS (length 4):\n      //   [0x68, 0xee, 0x3c, 0x80]\n      // ['numOfPictureParameterSets', UInt8, 1], // number of PPS\n      // ['pictureParameterSetLength', UInt16BE, 0], // Length in bytes of the PPS that follows\n      // ['pictureParameterSetNALUnit', UInt8Array, []]\n      // These are packed in a single custom element:\n      ['pictureParameterSets', createParameterSetArrayClass(), []],\n    ],\n  },\n  /*\n  ISO/IEC 14496-12:2005(E) 8.16.2 (pp. 28)\n  aligned(8) abstract class SampleEntry (unsigned int(32) format)\n    extends Box(format){\n    const unsigned int(8)[6] reserved = 0;\n    unsigned int(16) data_reference_index;\n  }\n  class AudioSampleEntry(codingname) extends SampleEntry (codingname){\n    const unsigned int(32)[2] reserved = 0;\n    template unsigned int(16) channelcount = 2;\n    template unsigned int(16) samplesize = 16;\n    unsigned int(16) pre_defined = 0;\n    const unsigned int(16) reserved = 0 ;\n    template unsigned int(32) samplerate = {timescale of media}<<16;\n  }\n  */\n  mp4a: {\n    container: 'stsd',\n    mandatory: false,\n    quantity: 'one',\n    box: 'Box',\n    is_container: true,\n    body: [\n      ['reserved', Empty, 6],\n      ['data_reference_index', UInt16BE, 1],\n      ['reserved2', UInt32BEArray, [0, 0]],\n      ['channelcount', UInt16BE, 2],\n      ['samplesize', UInt16BE, 16],\n      ['pre_defined', UInt16BE, 0],\n      ['reserved3', UInt16BE, 0],\n      ['samplerate', UInt32BE, 0], // 16.16 bit floating point\n    ],\n  },\n  /* Elementary stream descriptor\n  basic box that holds only an ESDescriptor\n  reference: 'https://developer.apple.com/library/content/documentation/QuickTime/\nQTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-124774'\n  Descriptors have a tag that identifies them, specified in ISO/IEC 14496-1 8.3.12\n  ISO/IEC 14496-1 8.3.3 (pp. 24) ES_Descriptor\n  aligned(8) class ES_Descriptor : bit(8) tag=ES_DescrTag {\n    bit(8) length;\n    bit(16) ES_ID;\n    bit(1) streamDependenceFlag;\n    bit(1) URL_Flag;\n    const bit(1) reserved=1;\n    bit(5) streamPriority;\n    if (streamDependenceFlag)\n      bit(16) dependsOn_ES_ID;\n    if (URL_Flag)\n      bit(8) URLstring[length-3-(streamDependencFlag*2)];\n    ExtensionDescriptor extDescr[0 .. 255];\n    LanguageDescriptor langDescr[0 .. 1];\n    DecoderConfigDescriptor decConfigDescr;\n    SLConfigDescriptor slConfigDescr;\n    IPI_DescPointer ipiPtr[0 .. 1];\n    IP_IdentificationDataSet ipIDS[0 .. 1];\n    QoS_Descriptor qosDescr[0 .. 1];\n  }\n  aligned(8) class DecoderConfigDescriptor\n    : bit(8) tag=DecoderConfigDescrTag {\n    bit(8) length;\n    bit(8) objectProfileIndication;\n    bit(6) streamType;\n    bit(1) upStream;\n    const bit(1) reserved=1;\n    bit(24) bufferSizeDB;\n    bit(32) maxBitrate;\n    bit(32) avgBitrate;\n    DecoderSpecificInfo decSpecificInfo[];\n  }\n  aligned(8) class DecoderSpecificInfoShort extends DecoderSpecificInfo\n  : bit(8) tag=DecSpecificInfoShortTag\n  {\n    bit(8) length;\n    bit(8) specificInfo[length];\n  }\n  aligned(8) class SLConfigDescriptor : bit(8) tag=SLConfigDescrTag {\n    bit(8) length;\n    bit(8) predefined;\n    if (predefined==0) {\n      bit(1) useAccessUnitStartFlag;\n      bit(1) useAccessUnitEndFlag;\n      bit(1) useRandomAccessPointFlag;\n      bit(1) usePaddingFlag;\n      bit(1) useTimeStampsFlag;\n      bit(1) useWallClockTimeStampFlag;\n      bit(1) useIdleFlag;\n      bit(1) durationFlag;\n      bit(32) timeStampResolution;\n      bit(32) OCRResolution;\n      bit(8) timeStampLength; // must be less than 64\n      bit(8) OCRLength;\n      // must be less than 64\n      bit(8) AU_Length;\n      // must be less than 32\n      bit(8) instantBitrateLength;\n      bit(4) degradationPriorityLength;\n      bit(4) seqNumLength;\n      if (durationFlag) {\n        bit(32) timeScale;\n        bit(16) accessUnitDuration;\n        bit(16) compositionUnitDuration;\n      }\n      if (!useTimeStampsFlag) {\n        if (useWallClockTimeStampFlag)\n          double(64) wallClockTimeStamp;\n        bit(timeStampLength) startDecodingTimeStamp;\n        bit(timeStampLength) startCompositionTimeStamp;\n      }\n    }\n    aligned(8) bit(1) OCRstreamFlag;\n    const bit(7) reserved=0b1111.111;\n    if (OCRstreamFlag)\n      bit(16) OCR_ES_Id;\n  }\n  */\n  esds: {\n    container: 'mp4a',\n    mandatory: false,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['ES_DescrTag', UInt8, 3],\n      // length of the remainder of this descriptor in byte,\n      // excluding trailing embedded descriptors.\n      ['ES_DescrLength', UInt8, 25],\n      ['ES_ID', UInt16BE, 1],\n      ['flagsAndStreamPriority', UInt8, 0],\n      ['DecoderConfigDescrTag', UInt8, 4],\n      // length of the remainder of this descriptor in bytes,\n      // excluding trailing embedded descriptors.\n      ['DecoderConfigDescrLength', UInt8, 17],\n      ['objectProfileIndication', UInt8, 0x40],\n      ['streamTypeUpstreamReserved', UInt8, 0x15],\n      ['bufferSizeDB', UInt8Array, [0, 0, 0]],\n      ['maxBitRate', UInt32BE, 0],\n      ['avgBitRate', UInt32BE, 0],\n      ['DecSpecificInfoShortTag', UInt8, 5],\n      ['DecSpecificInfoShortLength', UInt8, 2],\n      ['audioConfigBytes', UInt16BE, 0],\n      ['SLConfigDescrTag', UInt8, 6],\n      ['SLConfigDescrLength', UInt8, 1],\n      ['SLConfigDescrPredefined', UInt8, 0x02], // ISO use\n    ],\n  },\n  // Sample Size Box\n  stsz: {\n    container: 'stbl',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['sample_size', UInt32BE, 0],\n      ['sample_count', UInt32BE, 0],\n      // For each sample up to sample_count, append an entry_size:\n      // ['entry_size', UInt32BE, ],\n    ],\n  },\n  // Sample To Chunk Box\n  stsc: {\n    container: 'stbl',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['entry_count', UInt32BE, 0],\n      // For each entry up to entry_count, append these elements:\n      // ['first_chunk', UInt32BE, ],\n      // ['samples_per_chunk', UInt32BE, ],\n      // ['samples_description_index', UInt32BE, ],\n    ],\n  },\n  // Chunk Offset Box\n  stco: {\n    container: 'stbl',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['entry_count', UInt32BE, 0],\n      // For each entry up to entry_count, append an element:\n      // ['chunk_offset', UInt32BE, ],\n    ],\n  },\n  // Sync Sample Box\n  stss: {\n    container: 'stbl',\n    mandatory: false,\n    quantity: 'one-',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['entry_count', UInt32BE, 0],\n      // For each entry up to entry_count, append an element:\n      // ['sample_number', UInt32BE, ],\n    ],\n  },\n  // Edit Box\n  edts: {\n    container: 'trak',\n    mandatory: false,\n    quantity: 'one-',\n    box: 'Box',\n    is_container: true,\n  },\n  // Edit List Box\n  elst: {\n    container: 'edts',\n    mandatory: false,\n    quantity: 'one-',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['entry_count', UInt32BE, 1],\n      ['segment_duration', UInt32BE, 0],\n      ['media_time', UInt32BE, 0xffffffff],\n      ['media_rate_integer', UInt16BE, 1],\n      ['media_rate_fraction', UInt16BE, 0],\n    ],\n  },\n  mvex: {\n    container: 'moov',\n    mandatory: false,\n    quantity: 'one-',\n    box: 'Box',\n    is_container: true,\n  },\n  mehd: {\n    container: 'mvex',\n    mandatory: false,\n    quantity: 'one-',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['fragment_duration', UInt32BE, 0], // Total duration of movie\n    ],\n  },\n  trex: {\n    container: 'mvex',\n    mandatory: true,\n    quantity: 'one+',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['track_ID', UInt32BE, 1], // The track to which this data is applicable\n      ['default_sample_description_index', UInt32BE, 1],\n      ['default_sample_duration', UInt32BE, 0],\n      ['default_sample_size', UInt32BE, 0],\n      ['default_sample_flags', UInt32BE, 0],\n    ],\n  },\n  moof: {\n    container: 'file',\n    mandatory: false,\n    quantity: 'zero+',\n    box: 'Box',\n    is_container: false,\n  },\n  mfhd: {\n    container: 'moof',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    body: [\n      ['sequence_number', UInt32BE, 0], // A number associated with this fragment\n    ],\n  },\n  traf: {\n    container: 'moof',\n    mandatory: false,\n    quantity: 'zero+',\n    box: 'Box',\n    is_container: true,\n  },\n  tfhd: {\n    container: 'traf',\n    mandatory: true,\n    quantity: 'one',\n    box: 'FullBox',\n    is_container: false,\n    // Flag values for the track fragment header:\n    // 0x000001 base-data-offset-present\n    // 0x000002 sample-description-index-present\n    // 0x000008 default-sample-duration-present\n    // 0x000010 default-sample-size-present\n    // 0x000020 default-sample-flags-present\n    // 0x010000 duration-is-empty\n    // 0x020000 default-base-is-moof\n    config: {\n      flags: 0x000020, // default sample flags present\n    },\n    body: [\n      ['track_ID', UInt32BE, 1], // The track to which this data is applicable\n      // ['base_data_offset', UInt64BE, 0],\n      // ['default_sample_description_index', UInt32BE, 0],\n      // ['default_sample_duration', UInt32BE, 0],\n      // ['default_sample_size', UInt32BE, 0],\n      ['default_sample_flags', UInt32BE, 0],\n    ],\n  },\n  tfdt: {\n    container: 'traf',\n    mandatory: false,\n    quantity: 'one-',\n    box: 'FullBox',\n    is_container: false,\n    config: {\n      version: 1, // Version 1 uses 64-bit value for baseMediaDecodeTime\n    },\n    body: [['baseMediaDecodeTime', UInt64BE, 0]],\n  },\n  trun: {\n    container: 'traf',\n    mandatory: false,\n    quantity: 'zero+',\n    box: 'FullBox',\n    is_container: false,\n    // Flag values for the track fragment header:\n    // 0x000001 data-offset-present\n    // 0x000004 first-sample-flags-present\n    // 0x000100 sample-duration-present\n    // 0x000200 sample-size-present\n    // 0x000400 sample-flags-present\n    // 0x000800 sample-composition-time-offsets-present\n    config: {\n      flags: 0x000305, // default sample flags present\n    },\n    body: [\n      ['sample_count', UInt32BE, 1], // How many samples there are\n      ['data_offset', UInt32BE, 0],\n      ['first_sample_flags', UInt32BE, 0],\n      ['sample_duration', UInt32BE, 0],\n      ['sample_size', UInt32BE, 0],\n      // ['sample_flags', UInt32BE, 0],\n      // ['sample_composition_time_offset', UInt32BE, 0],\n    ],\n  },\n  // Unknown Box, used for parsing\n  '....': {\n    box: 'Box',\n    is_container: false,\n    body: [],\n  },\n  // File Box, special box without any headers\n  file: {\n    box: 'None',\n    is_container: true,\n    mandatory: true,\n    quantity: 'one',\n  },\n}\n\n/**\n * Helper functions to generate some standard elements that are needed by\n * all types of boxes.\n * All boxes have a length and type, where so-called full boxes have an\n * additional 4-bytes (1-byte version and 3-byte flags fields).\n */\nclass Header {\n  static None() {\n    return []\n  }\n\n  static Box(type: string) {\n    return [\n      ['size', UInt32BE, 0],\n      ['type', CharArray, type],\n    ]\n  }\n\n  static FullBox(type: string) {\n    return ([] as any).concat(this.Box(type), [\n      ['version', UInt8, 0x00],\n      ['flags', UInt24BE, 0x000000],\n    ])\n  }\n}\n\n/**\n * Box class.\n *\n * Defines a box as an entity similar to a C struct, where the struct is\n * represented by a Map of elements.\n * Each element is an object with at least:\n *  - a 'byteLength' property (size of element in bytes)\n *  - a 'copy' method (BufferMutation signature)\n */\nexport class Box extends BoxElement {\n  public type: string\n  public config: { [key: string]: any }\n  public struct: Map<\n    string,\n    {\n      offset: number\n      element: {\n        value?: any\n        byteLength: number\n        copy: BufferMutation\n        load?: BufferMutation\n        format?: (indent?: number) => string\n      }\n    }\n  >\n\n  /**\n   * Create a new Box.\n   * @param  type   4-character ASCII string\n   * @param  config Configuration holding (key: value) fields\n   */\n  constructor(type: string, config?: { [key: string]: any }) {\n    super(0)\n    this.type = type\n    const spec = BOXSPEC[this.type]\n    if (spec === undefined) {\n      throw new Error(`unknown box type: ${type}`)\n    }\n    this.config = Object.assign({}, spec.config, config)\n    const header = Header[spec.box](this.type)\n    const body = spec.body || []\n    // Uglify changes the name of the original class, so this doesn't work.\n    // TODO: find a better way to check for this.\n    // if (spec.body === undefined && this.constructor.name !== 'Container') {\n    //   throw new Error(`Body missing but '${type}' is not a container box`);\n    // }\n\n    // Initialize all elements, an element is something with a byteLength\n    this.struct = new Map()\n    let offset = 0\n    for (const [key, Type, defaultValue] of ([] as any).concat(header, body)) {\n      if (this.has(key)) {\n        throw new Error('Trying to add existing key')\n      }\n      let value = defaultValue\n      if (this.config[key]) {\n        value = this.config[key]\n      }\n      const element = new Type(value)\n      this.struct.set(key, { offset, element })\n      offset += element.byteLength\n    }\n\n    this.byteLength = offset\n  }\n\n  /**\n   * Get access to an element based on it's name.\n   * @param  key The element's name\n   * @return Object with 'byteLength' property and 'copy' method\n   */\n  element(key: string) {\n    const value = this.struct.get(key)\n    if (value === undefined) {\n      throw new Error('invalid key')\n    }\n    return value.element\n  }\n\n  /**\n   * Set an element's value.\n   * @param  key The element's name\n   * @param  value The element's (new) value\n   */\n  set(key: string, value: any) {\n    this.element(key).value = value\n  }\n\n  /**\n   * Get an element's value.\n   * @param  key The element's name\n   * @return The element's value\n   */\n  get(key: string) {\n    return this.element(key).value\n  }\n\n  /**\n   * Get an element's offset.\n   * @param  key The element's name\n   * @return The element's offset\n   */\n  offset(key: string) {\n    const value = this.struct.get(key)\n    if (value === undefined) {\n      throw new Error('invalid key')\n    }\n    return value.offset\n  }\n\n  /**\n   * Check if a certain element exists\n   * @param  key The element's name\n   * @return true if the element is known, false if not\n   */\n  has(key: string) {\n    return this.struct.has(key)\n  }\n\n  /**\n   * Add a new element to the box.\n   * @param key     A _new_ non-existing element name.\n   * @param element Something with a 'byteLength' property and 'copy' method.\n   * @return this box, so that 'add' can be used in a chain\n   */\n  add(key: string, element: BoxElement | Buffer) {\n    if (this.has(key)) {\n      throw new Error('Trying to add existing key')\n    }\n    this.struct.set(key, { offset: this.byteLength, element })\n    this.byteLength += element.byteLength\n    return this\n  }\n\n  /**\n   * Create a buffer and copy all element values to it.\n   * @return Data representing the box.\n   */\n  buffer() {\n    const buffer = Buffer.allocUnsafe(this.byteLength)\n    this.copy(buffer)\n    return buffer\n  }\n\n  /**\n   * Copy all values of the box into an existing buffer.\n   * @param  buffer     The target buffer to accept the box data\n   * @param  [offset=0] The number of bytes into the target to start at.\n   */\n  copy(buffer: Buffer, offset = 0) {\n    // Before writing, make sure the size property is set correctly.\n    this.set('size', this.byteLength)\n    for (const entry of this.struct.values()) {\n      entry.element.copy(buffer, offset + entry.offset)\n    }\n  }\n\n  /**\n   * Read element values from a box's data representation.\n   * @param  buffer     The source buffer with box data\n   * @param  [offset=0] The number of bytes into the source to start at.\n   */\n  load(buffer: Buffer, offset = 0) {\n    for (const entry of this.struct.values()) {\n      if (entry.element.load !== undefined) {\n        entry.element.load(buffer, offset + entry.offset)\n      }\n    }\n  }\n\n  /**\n   * Pretty-format an entire box as an element/box hierarchy.\n   * @param  [indent=0] How large an indentation to use for the hierarchy\n   */\n  format(indent = 0) {\n    const lines = [`${' '.repeat(indent)}[${this.type}] (${this.byteLength})`]\n    for (const [key, entry] of this.struct) {\n      const element = entry.element\n      if (element.format !== undefined) {\n        lines.push(element.format(indent + 2))\n      } else {\n        lines.push(\n          `${' '.repeat(indent + 2)}${key} = ${element.value} (${\n            element.byteLength\n          })`\n        )\n      }\n    }\n    return lines.join('\\n')\n  }\n\n  /**\n   * Pretty-print an entire box as an element/box hierarchy.\n   * @param  [indent=0] How large an indentation to use for the hierarchy\n   */\n  print(indent: number) {\n    console.warn(this.format(indent))\n  }\n}\n\n/**\n * Container class\n *\n * special box with an 'add' method which allows appending of other boxes,\n * and a 'parse' method to extract contained boxes.\n */\nexport class Container extends Box {\n  public boxSize: number\n  /**\n   * Create a new container box\n   * @param  type   4-character ASCII string\n   * @param  config Configuration holding (key: value) fields\n   * @param  boxes  One or more boxes to append.\n   */\n  constructor(type: string, config?: { [key: string]: any }, ...boxes: Box[]) {\n    super(type, config)\n    this.boxSize = 0\n    this.append(...boxes)\n  }\n\n  /**\n   * Add one or more boxes to the container.\n   * @param boxes The box(es) to append\n   * @return this container, so that add can be used in a chain\n   */\n  append(...boxes: Box[]) {\n    for (const box of boxes) {\n      this.add(`box_${this.boxSize++}`, box)\n    }\n    return this\n  }\n\n  /**\n   * Parse a container box by looking for boxes that it contains, and\n   * recursively proceed when it is another container.\n   *\n   * FIXME: this cannot properly handle different versions of the FullBox,\n   * currenlty the loader is hardcoded to the version used in this file.\n   * Also, appearance of an esds box is assumed to be AAC audio information,\n   * while the avcC box signals H.264 video information.\n   *\n   * @param  data The data to parse.\n   */\n  parse(data: Buffer) {\n    const tracks: MediaTrack[] = []\n    while (data.byteLength > 0) {\n      const type = new CharArray('....')\n      type.load(data, 4)\n      const boxType = type.value\n      const spec = BOXSPEC[boxType]\n      let box\n      if (spec !== undefined) {\n        if (spec.is_container) {\n          box = new Container(boxType)\n          box.load(data)\n          const boxTracks = box.parse(\n            data.slice(box.byteLength, box.get('size'))\n          )\n          tracks.push(...boxTracks)\n        } else {\n          box = new Box(boxType)\n          box.load(data)\n          // Handle 2 kinds of tracks with streaming MP4: video or audio\n          if (boxType === 'avcC') {\n            const profile = box\n              .element('AVCProfileIndication')\n              .value.toString(16)\n              .padStart(2, 0)\n            const compat = box\n              .element('profile_compatibility')\n              .value.toString(16)\n              .padStart(2, 0)\n            const level = box\n              .element('AVCLevelIndication')\n              .value.toString(16)\n              .padStart(2, 0)\n            tracks.push({\n              type: 'video',\n              mime: `avc1.${profile}${compat}${level}`,\n            })\n          } else if (boxType === 'esds') {\n            const audioConfigBytes = box.element('audioConfigBytes').value\n            const objectTypeIndication = (audioConfigBytes >>> 11) & 0x001f\n            tracks.push({\n              type: 'audio',\n              mime: `mp4a.40.${objectTypeIndication}`,\n            })\n          }\n        }\n      } else {\n        box = new Box('....')\n        box.load(data)\n        box.type = box.get('type')\n      }\n      this.append(box)\n      data = data.slice(box.get('size'))\n    }\n    return tracks\n  }\n}\n", "import { AACMedia } from '../../../utils/protocols/sdp'\n\nimport { Box, Container } from './isom'\n\n// All audio object types defined in ISO/IEC 14496-3 pp. 40\nconst AUDIO_OBJECT_TYPE_NAMES: { [key: number]: string } = {\n  1: 'AAC Main',\n  2: 'AAC LC',\n}\n\n// All frequencies defined in ISO/IEC 14496-3 pp. 42\nconst FREQUENCY_VALUES: { [key: number]: string } = {\n  0: '96 kHz',\n  1: '88.2 kHz',\n  2: '64 kHz',\n  3: '48 kHz',\n  4: '44.1 kHz',\n  5: '32 kHz',\n  6: '24 kHz',\n  7: '22.05 kHz',\n  8: '16 kHz',\n  9: '12 kHz',\n  10: '11.025 kHz',\n  11: '8 kHz',\n  12: '7.35 kHz',\n}\n\n// All channels defined in ISO/IEC 14496-3 pp. 42\nconst CHANNEL_CONFIG_NAMES: { [key: number]: string } = {\n  1: 'Mono',\n  2: 'Stereo',\n}\n\nexport interface AACEncoding {\n  coding: string\n  samplingRate: string\n  channels: string\n}\n\nconst aacEncodingName = (audioConfigBytes: number): AACEncoding => {\n  const audioObjectType = (audioConfigBytes >>> 11) & 0x001f\n  const frequencyIndex = (audioConfigBytes >>> 7) & 0x000f\n  const channelConfig = (audioConfigBytes >>> 3) & 0x000f\n\n  const audioType =\n    AUDIO_OBJECT_TYPE_NAMES[audioObjectType] || `AAC (${audioObjectType})`\n  const samplingRate = FREQUENCY_VALUES[frequencyIndex] || 'unknown'\n  const channels =\n    CHANNEL_CONFIG_NAMES[channelConfig] || channelConfig.toString()\n\n  return {\n    coding: audioType,\n    samplingRate,\n    channels,\n  }\n}\n\nexport const aacSettings = (media: AACMedia, date: number, trackId: number) => {\n  /*\n   * Example SDP media segment for MPEG4-GENERIC audio:\n   *\n\n  {\n     \"type\": \"audio\",\n     \"port\": \"0\",\n     \"proto\": \"RTP/AVP\",\n     \"fmt\": \"97\",\n     \"connectionData\": {\n       \"netType\": \"IN\",\n       \"addrType\": \"IP4\",\n       \"connectionAddress\": \"0.0.0.0\"\n     },\n     \"bwtype\": \"AS\",\n     \"bandwidth\": \"32\",\n     \"rtpmap\": {\n       \"payloadType\": \"97\",\n       \"encodingName\": \"MPEG4-GENERIC\",\n       \"clockrate\": \"16000\",\n       \"encodingParameters\": \"1\"\n     },\n     \"fmtp\": {\n       \"format\": \"97\",\n       \"parameters\": {\n         \"streamtype\": \"5\",\n         \"profile-level-id\": \"2\",\n         \"mode\": \"AAC-hbr\",\n         \"config\": \"1408\",\n         \"sizelength\": \"13\",\n         \"indexlength\": \"3\",\n         \"indexdeltalength\": \"3\",\n         \"bitrate\": \"32000\"\n       }\n     },\n     \"control\": \"rtsp://hostname/axis-media/media.amp/stream=1?audio=1\"\n   }\n\n   */\n\n  const bitrate = Number(media.fmtp.parameters.bitrate) || 320000\n  const audioConfigBytes = parseInt(media.fmtp.parameters.config, 16)\n  const audioObjectType = (audioConfigBytes >>> 11) & 0x001f\n\n  return {\n    tkhd: {\n      track_ID: trackId,\n      creation_time: date,\n      modification_time: date,\n      width: 0,\n      height: 0,\n      volume: 1,\n    },\n    mdhd: {\n      timescale: Number(media.rtpmap.clockrate),\n      creation_time: date,\n      modification_time: date,\n      duration: 0,\n    },\n\n    hdlr: {\n      handler_type: 'soun',\n      name: 'SoundHandler\\0', // 00 soundhandler, add 00 if things screws up\n    },\n\n    mediaHeaderBox: new Box('smhd'),\n    sampleEntryBox: new Container(\n      'mp4a',\n      {\n        samplerate: (media.rtpmap.clockrate << 16) >>> 0, // FIXME: Is this  correct?\n      },\n      new Box('esds', {\n        audioConfigBytes, // Converting from hex string to int\n        maxBitRate: bitrate,\n        avgBitRate: bitrate,\n      })\n    ),\n\n    /*\n    https://wiki.multimedia.cx/index.php/Understanding_AAC\n    AAC is a variable bitrate (VBR) block-based codec where each block decodes\n    to 1024 time-domain samples, which means that a single block (or frame?) is\n    1024 ticks long, which we take as default here.\n    */\n    defaultFrameDuration: 1024,\n\n    // MIME type\n    mime: `mp4a.40.${audioObjectType}`,\n    codec: aacEncodingName(audioConfigBytes),\n  }\n}\n", "/**\n * Defines functions for reading from a binary buffer. Works similair to the\n * DataView object, but uses bitshifts instead for performance.\n * @class BufferReader\n * @constructor\n * @param buffer - An ArrayBuffer to be read from.\n */\nexport class BufferReader {\n  private readonly _buffer: ArrayBuffer\n  private readonly _dataView: DataView\n  private _offset: number\n  private _bitpos: number\n  private _byte: number\n\n  constructor(buffer: Buffer) {\n    this._buffer = buffer\n    this._dataView = new DataView(this._buffer)\n    this._offset = 0\n    this._bitpos = 0\n    this._byte = 0\n  }\n\n  /**\n   * Reads 8-bit of data from the buffer.\n   * @method readUint8\n   * @param  offset - Index in the buffer.\n   * @return An unsigned 8-bit integer.\n   */\n  readUint8(offset: number) {\n    return this._dataView.getUint8(offset)\n  }\n\n  /**\n   * Reads 16-bit of data from the buffer.\n   * @method readUint16\n   * @param  offset - Index in the buffer.\n   * @return An unsigned 16-bit integer.\n   */\n  readUint16(offset: number) {\n    return this._dataView.getUint16(offset)\n  }\n\n  /**\n   * Reads 32-bit of data from the buffer.\n   * @method readUint32\n   * @param  offset - Index in the buffer.\n   * @return An unsigned 32-bit integer.\n   */\n  readUint32(offset: number) {\n    return this._dataView.getUint32(offset)\n  }\n\n  /**\n   * Reads the next byte of data from the buffer and increaments the offset.\n   * @method readNext\n   * @return {Number} An unsigned 8-bit integer.\n   */\n  readNext() {\n    const value = this.readUint8(this._offset)\n    this._offset += 1\n    return value\n  }\n\n  readBits(length: number) {\n    if (length > 32 || length === 0) {\n      throw new Error('length has to be between 0 - 31 bits')\n    }\n\n    let result = 0\n    for (let i = 1; i <= length; ++i) {\n      if (this._bitpos === 0) {\n        /* Previous byte all read out. Get a new one. */\n        this._byte = this.readNext()\n      }\n      /* Shift result one left to make room for another bit,\n      then add the next bit on the stream. */\n      result = (result << 1) | ((this._byte >> (8 - ++this._bitpos)) & 0x01)\n      this._bitpos %= 8\n    }\n\n    return result\n  }\n\n  readUnsignedExpGolomb() {\n    let bitsToRead = 0\n    while (this.readBits(1) !== 1) {\n      bitsToRead++\n    }\n\n    if (bitsToRead === 0) {\n      return 0 /* Easy peasy, just a single 1. This is 0 in exp golomb */\n    }\n\n    if (bitsToRead >= 31) {\n      throw new Error('read unsigned exponential Golomb: internal error')\n    }\n\n    /* Read all bits part of this number */\n    let n = this.readBits(bitsToRead)\n    /* Move in the 1 read by while-statement above */\n    n |= 0x1 << bitsToRead\n\n    return n - 1 /* Because result in exp golomb is one larger */\n  }\n\n  readSignedExpGolomb() {\n    let r = this.readUnsignedExpGolomb()\n    if (r & 0x01) {\n      r = (r + 1) >> 1\n    } else {\n      r = -(r >> 1)\n    }\n    return r\n  }\n\n  /**\n   * Returns the size of the buffer\n   * @method readSize\n   * @return {Number} The buffer size.\n   */\n  size() {\n    return this._buffer.byteLength\n  }\n\n  /**\n   * Returns an instance of the buffer as an unsigned 8-bit integer array.\n   * @method getUint8Array\n   * @return {Uint8Array} Unsigned 8-bit integer representation of the buffer\n   */\n  getUint8Array() {\n    return new Uint8Array(this._buffer)\n  }\n\n  /**\n   * Returns the buffer object\n   * @method getArrayBuffer\n   * @return {ArrayBuffer} The buffer used the BufferReader\n   */\n  getArrayBuffer() {\n    return this._buffer\n  }\n}\n", "import { BufferReader } from './bufferreader'\n\nexport class SPSParser {\n  public reader: BufferReader\n\n  constructor(buffer: Buffer) {\n    this.reader = new BufferReader(buffer)\n  }\n\n  parse() {\n    // nalhdr\n    this.reader.readNext()\n    const profile = this.reader.readNext()\n    // constraints\n    this.reader.readNext()\n    const level = this.reader.readNext()\n\n    // seqParameterSetId\n    this.reader.readUnsignedExpGolomb()\n\n    if ([100, 110, 122, 244, 44, 83, 86, 118].includes(profile)) {\n      const chromaFormat = this.reader.readUnsignedExpGolomb()\n      if (chromaFormat === 3) {\n        // Separate color plane flag\n        this.reader.readBits(1)\n      }\n\n      // bitDepthLumaMinus8\n      this.reader.readUnsignedExpGolomb()\n\n      // bitDepthChromaMinus8\n      this.reader.readUnsignedExpGolomb()\n\n      // qpPrimeYZeroTransformBypassFlag\n      this.reader.readBits(1)\n      const seqScalingMatrix = this.reader.readBits(1)\n      if (seqScalingMatrix) {\n        for (let k = 0; k < (chromaFormat !== 3 ? 8 : 12); k++) {\n          // seqScalingListPresentFlag\n          this.reader.readBits(1)\n          // TODO: More logic goes here..\n        }\n      }\n    }\n\n    // log2MaxFrameNumMinus4\n    this.reader.readUnsignedExpGolomb()\n    const picOrderCntType = this.reader.readUnsignedExpGolomb()\n    if (picOrderCntType === 0) {\n      // log2MaxPicOrderCntLsbMinus4\n      this.reader.readUnsignedExpGolomb()\n    } else if (picOrderCntType === 1) {\n      let numRefFramesInPic = 0\n      this.reader.readBits(1)\n      this.reader.readSignedExpGolomb()\n      this.reader.readSignedExpGolomb()\n      numRefFramesInPic = this.reader.readUnsignedExpGolomb()\n      for (let i = 0; i < numRefFramesInPic; i++) {\n        this.reader.readSignedExpGolomb()\n      }\n    }\n\n    // maxNumRefFrames\n    this.reader.readUnsignedExpGolomb()\n    // gapsInFrameNumValueAllowedFlag\n    this.reader.readBits(1)\n    const picWidthInMbsMinus1 = this.reader.readUnsignedExpGolomb()\n    const picHeightInMapUnitsMinus1 = this.reader.readUnsignedExpGolomb()\n    const picFrameMbsOnlyFlag = this.reader.readBits(1)\n    // direct8x8InferenceFlag\n    this.reader.readBits(1)\n    const frameCroppingFlag = this.reader.readBits(1)\n\n    const frameCropLeftOffset = frameCroppingFlag\n      ? this.reader.readUnsignedExpGolomb()\n      : 0\n    const frameCropRightOffset = frameCroppingFlag\n      ? this.reader.readUnsignedExpGolomb()\n      : 0\n    const frameCropTopOffset = frameCroppingFlag\n      ? this.reader.readUnsignedExpGolomb()\n      : 0\n    const frameCropBottomOffset = frameCroppingFlag\n      ? this.reader.readUnsignedExpGolomb()\n      : 0\n\n    const w =\n      (picWidthInMbsMinus1 + 1) * 16 -\n      frameCropLeftOffset * 2 -\n      frameCropRightOffset * 2\n    const h =\n      (2 - picFrameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 -\n      frameCropTopOffset * 2 -\n      frameCropBottomOffset * 2\n\n    return {\n      profile,\n      level: level / 10.0,\n      width: w,\n      height: h,\n    }\n  }\n}\n", "export function b64ToUint6(nChr: number) {\n  return nChr > 64 && nChr < 91\n    ? nChr - 65\n    : nChr > 96 && nChr < 123\n      ? nChr - 71\n      : nChr > 47 && nChr < 58\n        ? nChr + 4\n        : nChr === 43\n          ? 62\n          : nChr === 47\n            ? 63\n            : 0\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding\nexport function base64DecToArr(sBase64: string, nBlocksSize: number) {\n  const sB64Enc = sBase64.replace(/[^A-Za-z0-9+/]/g, '')\n  const nInLen = sB64Enc.length\n  const nOutLen = nBlocksSize\n    ? Math.ceil(((nInLen * 3 + 1) >> 2) / nBlocksSize) * nBlocksSize\n    : (nInLen * 3 + 1) >> 2\n  const taBytes = new Uint8Array(nOutLen)\n\n  let nMod3\n  let nMod4\n  let nUint24 = 0\n  let nOutIdx = 0\n  for (let nInIdx = 0; nInIdx < nInLen; nInIdx++) {\n    nMod4 = nInIdx & 3\n    nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (18 - 6 * nMod4)\n    if (nMod4 === 3 || nInLen - nInIdx === 1) {\n      for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {\n        taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255\n      }\n      nUint24 = 0\n    }\n  }\n\n  return taBytes\n}\n", "import { H264Media } from '../../../utils/protocols/sdp'\n\nimport { Box, Container } from './isom'\nimport { SPSParser } from './spsparser'\nimport { base64DecToArr } from './utils'\n\nconst PROFILE_NAMES: { [key: number]: string } = {\n  66: 'Baseline',\n  77: 'Main',\n  100: 'High',\n}\n\nconst h264EncodingName = (profileLevelId: string) => {\n  const profileCode = parseInt(profileLevelId.substr(0, 2), 16)\n  const levelCode = parseInt(profileLevelId.substr(4, 2), 16)\n\n  const profile = PROFILE_NAMES[profileCode] || profileCode.toString()\n  const level = (levelCode / 10).toFixed(1)\n\n  return {\n    coding: 'H.264',\n    profile,\n    level,\n  }\n}\n\nexport const h264Settings = (\n  media: H264Media,\n  date: number,\n  trackId: number\n) => {\n  /*\n   * Example SDP media segment for H264 audio:\n   *\n\n   {\n     \"type\": \"video\",\n     \"port\": \"0\",\n     \"proto\": \"RTP/AVP\",\n     \"fmt\": \"96\",\n     \"connectionData\": {\n       \"netType\": \"IN\",\n       \"addrType\": \"IP4\",\n       \"connectionAddress\": \"0.0.0.0\"\n     },\n     \"bwtype\": \"AS\",\n     \"bandwidth\": \"50000\",\n     \"rtpmap\": {\n       \"payloadType\": \"96\",\n       \"encodingName\": \"H264\",\n       \"clockrate\": \"90000\"\n     },\n     \"fmtp\": {\n       \"format\": \"96\",\n       \"parameters\": {\n         \"packetization-mode\": \"1\",\n         \"profile-level-id\": \"4d0029\",\n         \"sprop-parameter-sets\": \"Z00AKeKQDwBE/LgLcBAQGkHiRFQ=,aO48gA==\"\n       }\n     },\n     \"control\": \"rtsp://hostname/axis-media/media.amp/stream=0?audio=1\",\n     \"framerate\": \"25.000000\",\n     \"transform\": [[1,0,0],[0,1,0],[0,0,1]]\n   },\n\n   */\n\n  const profileLevelId = media.fmtp.parameters['profile-level-id']\n  const parameterSets = media.fmtp.parameters['sprop-parameter-sets']\n    .split(',')\n    .map(base64DecToArr)\n\n  // We assume the first set is _the_ SPS (no support for multiple).\n  const sps = parameterSets.slice(0, 1)\n  // The remaining sets are all PPS to support more than one.\n  const pps = parameterSets.slice(1)\n\n  const parsedSps = new SPSParser(sps[0].buffer).parse()\n  // If media framerate is missing in SDP, it is not possible to calculate\n  // the frame duration. Use a fallback value (90000 Hz / 25 fps)\n  const FALLBACK_FRAME_DURATION = 3600\n  return {\n    mediaHeaderBox: new Box('vmhd'),\n    sampleEntryBox: new Container(\n      'avc1',\n      {\n        width: parsedSps.width,\n        height: parsedSps.height,\n      },\n      new Box('avcC', {\n        AVCProfileIndication: sps[0][1],\n        profile_compatibility: sps[0][2],\n        AVCLevelIndication: sps[0][3],\n        sequenceParameterSets: sps,\n        pictureParameterSets: pps,\n      })\n    ),\n    tkhd: {\n      track_ID: trackId,\n      creation_time: date,\n      modification_time: date,\n      width: parsedSps.width << 16,\n      height: parsedSps.height << 16,\n      volume: 0,\n    },\n    hdlr: {},\n    mdhd: {\n      timescale: media.rtpmap.clockrate,\n      creation_time: date,\n      modification_time: date,\n      duration: 0,\n    },\n\n    // (ticks / s) / (frames / s) = ticks / frame, e.g. frame duration in ticks\n    defaultFrameDuration:\n      media.framerate !== undefined && media.framerate > 0\n        ? Number(media.rtpmap.clockrate) / Number(media.framerate) ||\n          FALLBACK_FRAME_DURATION\n        : FALLBACK_FRAME_DURATION,\n    // MIME type\n    mime: `avc1.${profileLevelId}`,\n    codec: h264EncodingName(profileLevelId),\n  }\n}\n", "import { Sdp } from '../../../utils/protocols/sdp'\n\nimport { aacSettings } from './aacSettings'\nimport { h264Settings } from './h264Settings'\nimport { Box, Container } from './isom'\n\ninterface MoofMetadata {\n  trackId: number\n  timestamp: number\n  byteLength: number\n}\n\nconst formatDefaults: {\n  [key: string]: (\n    media: any,\n    date: number,\n    trackId: number\n  ) => { mime: string; codec: any; defaultFrameDuration: number }\n} = {\n  'MPEG4-GENERIC': aacSettings,\n  H264: h264Settings,\n}\n\ninterface TrackData {\n  lastTimestamp: number\n  baseMediaDecodeTime: number\n  defaultFrameDuration: number\n  clockrate: number\n  bitrate: number\n  framerate: number\n  cumulativeByteLength: number\n  cumulativeDuration: number\n  cumulativeFrames: number\n}\n\nconst createTrackData = (): TrackData => {\n  return {\n    lastTimestamp: 0,\n    baseMediaDecodeTime: 0,\n    defaultFrameDuration: 0,\n    clockrate: 0,\n    bitrate: 0,\n    framerate: 0,\n    cumulativeByteLength: 0,\n    cumulativeDuration: 0,\n    cumulativeFrames: 0,\n  }\n}\n\ninterface RateInfo {\n  byteLength: number\n  duration: number\n}\n\nconst updateRateInfo = (\n  trackData: TrackData,\n  { byteLength, duration }: RateInfo\n) => {\n  trackData.cumulativeByteLength += byteLength\n  trackData.cumulativeDuration += duration\n  trackData.cumulativeFrames++\n\n  // Update the cumulative number size (bytes) and duration (ticks), and if\n  // the duration exceeds the clockrate (meaning longer than 1 second of data),\n  // then compute a new bitrate and reset cumulative size and duration.\n  if (trackData.cumulativeDuration >= trackData.clockrate) {\n    const bits = 8 * trackData.cumulativeByteLength\n    const frames = trackData.cumulativeFrames\n    const seconds = trackData.cumulativeDuration / trackData.clockrate\n    trackData.bitrate = bits / seconds\n    trackData.framerate = frames / seconds\n    trackData.cumulativeByteLength = 0\n    trackData.cumulativeDuration = 0\n    trackData.cumulativeFrames = 0\n  }\n}\n\n/**\n * Create boxes for a stream initiated by an sdp object\n *\n * @class BoxBuilder\n */\nexport class BoxBuilder {\n  public trackIdMap: { [key: number]: number }\n  public sequenceNumber: number\n  public ntpPresentationTime: number\n  public trackData: TrackData[]\n  public videoTrackId?: number\n\n  constructor() {\n    this.trackIdMap = {}\n    this.sequenceNumber = 0\n    this.ntpPresentationTime = 0\n    this.trackData = []\n  }\n\n  trak(settings: any) {\n    const trak = new Container('trak')\n    const mdia = new Container('mdia')\n    const minf = new Container('minf')\n    const dinf = new Container('dinf')\n    const dref = new Container('dref')\n    const stbl = new Container('stbl')\n\n    dref.set('entry_count', 1)\n\n    trak.append(\n      new Box('tkhd', settings.tkhd),\n      mdia.append(\n        new Box('mdhd', settings.mdhd),\n        new Box('hdlr', settings.hdlr),\n        minf.append(\n          settings.mediaHeaderBox, // vmhd or smhd box (video or sound)\n          dinf.append(dref.append(new Box('url '))),\n          stbl.append(\n            new Container('stsd', undefined, settings.sampleEntryBox),\n            new Box('stts'),\n            new Box('stsc'),\n            new Box('stco'),\n            new Box('stsz'),\n            new Box('stss')\n          )\n        )\n      )\n    )\n\n    return trak\n  }\n\n  /**\n   * Creates a Moov box from the provided options.\n   * @method moov\n   * @param  sdp - The session description protocol\n   * @param  date - The creation/modification time of the movie\n   * @return Moov object\n   */\n  moov(sdp: Sdp, date: any) {\n    const moov = new Container('moov')\n    moov.append(\n      new Box('mvhd', {\n        creation_time: date,\n        modification_time: date,\n        duration: 0,\n      })\n    )\n\n    const mvex = new Container('mvex')\n\n    // For each of the media segments in the SDP structure, we will set up\n    // a track in the MP4 file. For each track, a 'trak' box is added to the\n    // 'moov' box and a 'trex' box is added to the 'mvex' box.\n\n    this.trackIdMap = {}\n    this.sequenceNumber = 0\n    this.ntpPresentationTime = 0\n\n    let trackId = 0\n    this.trackData = []\n\n    sdp.media.forEach((media) => {\n      if (media.rtpmap === undefined) {\n        return\n      }\n\n      const payloadType = media.rtpmap.payloadType\n      const encoding = media.rtpmap.encodingName\n\n      if (formatDefaults[encoding] !== undefined) {\n        // We know how to handle this encoding, add a new track for it, and\n        // register the track for this payloadType.\n        this.trackIdMap[payloadType] = ++trackId\n\n        // Mark the video track\n        if (media.type.toLowerCase() === 'video') {\n          this.videoTrackId = trackId\n        }\n\n        // Extract the settings from the SDP media information based on\n        // the encoding name (H264, MPEG4-GENERIC, ...).\n        const settings = formatDefaults[encoding](media, date, trackId)\n        media.mime = settings.mime // add MIME type to the SDP media\n        media.codec = settings.codec // add human readable codec string to the SDP media\n\n        const trackData = createTrackData()\n        trackData.clockrate = media.rtpmap.clockrate\n        // Set default frame duration (in ticks) for later use\n        trackData.defaultFrameDuration = settings.defaultFrameDuration\n\n        this.trackData.push(trackData)\n\n        const trak = this.trak(settings)\n        moov.append(trak)\n        mvex.append(new Box('trex', { track_ID: trackId }))\n      }\n    })\n\n    moov.append(mvex)\n\n    return moov\n  }\n\n  /**\n   * Boxes that carry actual elementary stream fragment metadata + data.\n   */\n\n  /**\n   * Creates a moof box from the provided fragment metadata.\n   * @method moof\n   * @param  metadata - Track ID, timestamp, bytelength\n   * @return moof Container\n   */\n  moof(metadata: MoofMetadata) {\n    const { trackId, timestamp, byteLength } = metadata\n    const trackOffset = trackId - 1\n\n    const trackData = this.trackData[trackOffset]\n\n    // The RTP timestamps are unsigned 32 bit and will overflow\n    // at some point. We can guard against the overflow by ORing with 0,\n    // which will bring any difference back into signed 32-bit domain.\n    // If the duration would be negative, it's set to zero to prevent\n    // possible issues later when it's written as an unsigned int.\n    const duration =\n      trackData.lastTimestamp !== 0\n        ? Math.max(0, (timestamp - trackData.lastTimestamp) | 0)\n        : trackData.defaultFrameDuration\n\n    trackData.lastTimestamp = timestamp\n\n    const moof = new Container('moof')\n    const traf = new Container('traf')\n\n    const trun = new Box('trun', {\n      sample_duration: duration,\n      sample_size: byteLength,\n      first_sample_flags: 0x40,\n    })\n\n    moof.append(\n      new Box('mfhd', { sequence_number: this.sequenceNumber++ }),\n      traf.append(\n        new Box('tfhd', { track_ID: trackId }),\n        new Box('tfdt', { baseMediaDecodeTime: trackData.baseMediaDecodeTime }),\n        trun\n      )\n    )\n\n    trackData.baseMediaDecodeTime += duration\n\n    // Correct the trun data offset\n    trun.set('data_offset', moof.byteLength + 8)\n\n    updateRateInfo(trackData, { byteLength, duration })\n\n    return moof\n  }\n\n  /**\n   * Creates an mdat box containing the elementary stream data.\n   * @param  data - Elementary stream data\n   * @return mdat Box\n   */\n  mdat(data: Buffer) {\n    const box = new Box('mdat')\n    box.add('data', data)\n    return box\n  }\n\n  setPresentationTime(trackId: number, ntpTimestamp?: number) {\n    // Before updating the baseMediaDecodeTime, we check if\n    // there is already a base NTP time to use as a reference\n    // for computing presentation times.\n    if (\n      !this.ntpPresentationTime &&\n      ntpTimestamp &&\n      trackId === this.videoTrackId\n    ) {\n      const trackOffset = trackId - 1\n      const trackData = this.trackData[trackOffset]\n      this.ntpPresentationTime =\n        ntpTimestamp -\n        1000 * (trackData.baseMediaDecodeTime / trackData.clockrate)\n    }\n  }\n}\n", "import { Transform } from 'stream'\n\nimport {\n  marker,\n  payload,\n  payloadType,\n  timestamp,\n} from '../../utils/protocols/rtp'\nimport { Tube } from '../component'\nimport { Message, MessageType, XmlMessage } from '../message'\n\nexport class ONVIFDepay extends Tube {\n  constructor() {\n    let XMLPayloadType: number\n    let packets: Buffer[] = []\n\n    const incoming = new Transform({\n      objectMode: true,\n      transform(msg: Message, encoding, callback) {\n        if (msg.type === MessageType.SDP) {\n          let validMedia\n          for (const media of msg.sdp.media) {\n            if (\n              media.type === 'application' &&\n              media.rtpmap &&\n              media.rtpmap.encodingName === 'VND.ONVIF.METADATA'\n            ) {\n              validMedia = media\n            }\n          }\n          if (validMedia && validMedia.rtpmap) {\n            XMLPayloadType = Number(validMedia.rtpmap.payloadType)\n          }\n          callback(undefined, msg)\n        } else if (\n          msg.type === MessageType.RTP &&\n          payloadType(msg.data) === XMLPayloadType\n        ) {\n          // Add payload to packet stack\n          packets.push(payload(msg.data))\n\n          // XML over RTP uses the RTP marker bit to indicate end\n          // of fragmentation. At this point, the packets can be used\n          // to reconstruct an XML packet.\n          if (marker(msg.data) && packets.length > 0) {\n            const xmlMsg: XmlMessage = {\n              timestamp: timestamp(msg.data),\n              ntpTimestamp: msg.ntpTimestamp,\n              payloadType: payloadType(msg.data),\n              data: Buffer.concat(packets),\n              type: MessageType.XML,\n            }\n            callback(undefined, xmlMsg)\n            packets = []\n            return\n          }\n          callback()\n        } else {\n          // Not a message we should handle\n          callback(undefined, msg)\n        }\n      },\n    })\n\n    // outgoing will be defaulted to a PassThrough stream\n    super(incoming)\n  }\n}\n", "import { createWriteStream } from 'fs'\nimport { join } from 'path'\n\nimport { Tube } from '../component'\nimport StreamFactory from '../helpers/stream-factory'\n\n/**\n * Component that writes passing incoming/outgoing streams\n * interleaved to a filestream. The resulting stream (file) stores\n * messages as a JSON array, where each element has a type, timestamp,\n * and the original message (that went through the stream).\n */\nexport class Recorder extends Tube {\n  /**\n   * Create a new recorder component that will record to a writable stream.\n   * @param fileStream - The stream to save the messages to.\n   */\n  constructor(fileStream: NodeJS.WritableStream) {\n    const incoming = StreamFactory.recorder('incoming', fileStream)\n    const outgoing = StreamFactory.recorder('outgoing', fileStream)\n\n    const interleaved = { incoming, outgoing }\n\n    const streamsFinished = []\n    for (const [key, value] of Object.entries(interleaved)) {\n      streamsFinished.push(\n        new Promise<void>((resolve) =>\n          value.on('finish', () => {\n            const timestamp = Date.now()\n            const message = null\n            const type = key\n            fileStream.write(\n              JSON.stringify({ type, timestamp, message }, null, 2)\n            )\n            fileStream.write(',\\n')\n            resolve()\n          })\n        )\n      )\n    }\n\n    // start of file: begin JSON array\n    fileStream.write('[\\n')\n\n    // end of file: close JSON array\n    Promise.all(streamsFinished)\n      .then(() => {\n        fileStream.write(JSON.stringify(null))\n        fileStream.write('\\n]\\n')\n      })\n      .catch(() => {\n        /** ignore */\n      })\n\n    super(incoming, outgoing)\n  }\n\n  /**\n   * Create a new recorder component that will record to a file.\n   * @param filename - The name of the file (relative to cwd)\n   */\n  static toFile(filename = 'data.json') {\n    const cwd = process.cwd()\n    const fileStream = createWriteStream(join(cwd, filename))\n\n    return new Recorder(fileStream)\n  }\n}\n", "import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { Readable, Writable } from 'stream'\n\nimport { Source } from '../component'\nimport { sleep } from '../helpers/sleep'\nimport StreamFactory from '../helpers/stream-factory'\n\nexport class Replayer extends Source {\n  /**\n   * Create a new replay component that will play provided data.\n   * The packets need to conform to the format:\n   * {\n   *   type: 'incoming'/'outgoing',\n   *   delay: Number,\n   *   msg: Object (original message)\n   * }\n   * @param packetStream - The JSON data to replay.\n   */\n  constructor(packetStream: Readable) {\n    let finished = false\n\n    const incoming = new Readable({\n      objectMode: true,\n      read() {\n        //\n      },\n    })\n\n    /**\n     * Emit incoming items in the queue until an outgoing item is found.\n     */\n    const start = async () => {\n      let packet = packetStream.read()\n\n      while (packet && packet.type === 'incoming') {\n        await sleep(packet.delay)\n        incoming.push(packet.msg)\n        packet = packetStream.read()\n      }\n      if (finished) {\n        incoming.push(null)\n      }\n    }\n\n    const outgoing = new Writable({\n      objectMode: true,\n      write(msg, encoding, callback) {\n        start().catch(() => {\n          /** ignore */\n        }) // resume streaming\n        callback()\n      },\n    })\n\n    outgoing.on('finish', () => {\n      finished = true\n    })\n\n    outgoing.on('pipe', async () => await start())\n\n    super(incoming, outgoing)\n  }\n\n  /**\n   * Create a new replay component that will play from a file.\n   * @param filename - The name of the file (relative to cwd)\n   */\n  static fromFile(filename = 'data.json') {\n    const cwd = process.cwd()\n    const data = readFileSync(join(cwd, filename))\n    const packets = JSON.parse(data.toString())\n    const packetStream = StreamFactory.replayer(packets)\n\n    return new Replayer(packetStream)\n  }\n}\n", "/**\n * Return a promise that resolves after a specific time.\n * @param  ms Waiting time in milliseconds\n * @return Resolves after waiting time\n */\nexport const sleep = async (ms: number) => {\n  return await new Promise((resolve) => {\n    setTimeout(resolve, ms)\n  })\n}\n", "import { Transform } from 'stream'\n\nimport { Tube } from '../component'\nimport { Message, MessageType } from '../message'\n\nimport { builder } from './builder'\nimport { Parser } from './parser'\n\n/**\n * A component that converts raw binary data into RTP/RTSP/RTCP packets on the\n * incoming stream, and converts RTSP commands to raw binary data on the outgoing\n * stream. The component is agnostic of any RTSP session details (you need an\n * RTSP session component in the pipeline).\n * @extends {Component}\n */\nexport class RtspParser extends Tube {\n  constructor() {\n    const parser = new Parser()\n\n    // Incoming stream\n    const incoming = new Transform({\n      objectMode: true,\n      transform(msg: Message, encoding, callback) {\n        if (msg.type === MessageType.RAW) {\n          try {\n            parser.parse(msg.data).forEach((message) => incoming.push(message))\n            callback()\n          } catch (e) {\n            const err = e as Error\n            callback(err)\n          }\n        } else {\n          // Not a message we should handle\n          callback(undefined, msg)\n        }\n      },\n    })\n\n    // Outgoing stream\n    const outgoing = new Transform({\n      objectMode: true,\n      transform(msg: Message, encoding, callback) {\n        if (msg.type === MessageType.RTSP) {\n          const data = builder(msg)\n          callback(undefined, { type: MessageType.RAW, data })\n        } else {\n          // don't touch other types\n          callback(undefined, msg)\n        }\n      },\n    })\n\n    super(incoming, outgoing)\n  }\n}\n", "import debug from 'debug'\n\nimport { RtspMessage } from '../message'\n\nconst DEFAULT_PROTOCOL = 'RTSP/1.0'\n\nexport const builder = (msg: RtspMessage): Buffer => {\n  if (!msg.method || !msg.uri) {\n    throw new Error('message needs to contain a method and a uri')\n  }\n  const protocol = msg.protocol || DEFAULT_PROTOCOL\n  const headers = msg.headers || {}\n\n  const messageString = [\n    `${msg.method} ${msg.uri} ${protocol}`,\n    Object.entries(headers)\n      .map(([key, value]) => `${key}: ${value}`)\n      .join('\\r\\n'),\n    '\\r\\n',\n  ].join('\\r\\n')\n  debug('msl:rtsp:outgoing')(messageString)\n\n  return Buffer.from(messageString)\n}\n", "import { MessageType, RtcpMessage } from '../../components/message'\nimport { POS } from '../bits'\n\n// Real Time Control Protocol (RTCP)\n// https://tools.ietf.org/html/rfc3550#section-6\n\n/*\nCommon RTCP packed header:\n\n        0                   1                   2                   3\n        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nheader |V=2|P|    RC   |   PT=SR=200   |             length            |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n*/\nexport enum RTCPPacketType {\n  SR = 200,\n  RR = 201,\n  SDES = 202,\n  BYE = 203,\n  APP = 204,\n}\n\nexport interface Rtcp {\n  readonly version: number\n  readonly padding: boolean\n  readonly count: number\n  readonly packetType: RTCPPacketType | number\n  readonly length: number\n}\n\nconst parseBase = (buffer: Buffer): Rtcp => ({\n  version: buffer[0] >>> 6,\n  padding: !!(buffer[0] & POS[2]),\n  count: buffer[0] & 0x1f,\n  packetType: buffer.readUInt8(1),\n  length: buffer.readUInt16BE(2),\n})\n\nexport const parseRtcp = (\n  buffer: Buffer\n): Rtcp | RtcpSR | RtcpRR | RtcpSDES | RtcpBye | RtcpApp => {\n  const base = parseBase(buffer)\n\n  switch (base.packetType) {\n    case RTCPPacketType.SR:\n      return parseSR(buffer, base)\n    case RTCPPacketType.RR:\n      return parseRR(buffer, base)\n    case RTCPPacketType.SDES:\n      return parseSDES(buffer, base)\n    case RTCPPacketType.BYE:\n      return parseBYE(buffer, base)\n    case RTCPPacketType.APP:\n      return parseAPP(buffer, base)\n    default:\n      return base\n  }\n}\n\nexport const rtcpMessageFromBuffer = (\n  channel: number,\n  buffer: Buffer\n): RtcpMessage => {\n  return {\n    type: MessageType.RTCP,\n    data: buffer,\n    channel,\n    rtcp: parseRtcp(buffer),\n  }\n}\n\n/*\nSR: Sender Report RTCP Packet\n\n        0                   1                   2                   3\n        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nheader |V=2|P|    RC   |   PT=SR=200   |             length            |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                         SSRC of sender                        |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\nsender |              NTP timestamp, most significant word             |\ninfo   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |             NTP timestamp, least significant word             |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                         RTP timestamp                         |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                     sender's packet count                     |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                      sender's octet count                     |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\nreport |                 SSRC_1 (SSRC of first source)                 |\nblock  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  1    | fraction lost |       cumulative number of packets lost       |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |           extended highest sequence number received           |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                      interarrival jitter                      |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                         last SR (LSR)                         |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                   delay since last SR (DLSR)                  |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\nreport |                 SSRC_2 (SSRC of second source)                |\nblock  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  2    :                               ...                             :\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n       |                  profile-specific extensions                  |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n*/\n\nexport const SR = {\n  packetType: 200,\n}\n\nexport interface RtcpReportBlock {\n  readonly syncSource: number\n  readonly fractionLost: number\n  readonly cumulativeNumberOfPacketsLost: number\n  readonly extendedHighestSequenceNumberReceived: number\n  readonly interarrivalJitter: number\n  readonly lastSRTimestamp: number\n  readonly delaySinceLastSR: number\n}\n\nconst parseReportBlocks = (\n  count: number,\n  buffer: Buffer,\n  offset: number\n): RtcpReportBlock[] => {\n  const reports: RtcpReportBlock[] = []\n  for (let reportNumber = 0; reportNumber < count; reportNumber++) {\n    const o = offset + reportNumber * 24\n    reports.push({\n      syncSource: buffer.readUInt32BE(o + 0),\n      fractionLost: buffer.readUInt8(o + 4),\n      cumulativeNumberOfPacketsLost: buffer.readUIntBE(o + 5, 3),\n      extendedHighestSequenceNumberReceived: buffer.readUInt32BE(o + 8),\n      interarrivalJitter: buffer.readUInt32BE(o + 12),\n      lastSRTimestamp: buffer.readUInt32BE(o + 16),\n      delaySinceLastSR: buffer.readUInt32BE(o + 20),\n    })\n  }\n  return reports\n}\n\nexport interface RtcpSR extends Rtcp {\n  readonly version: RTCPPacketType.SR\n\n  readonly syncSource: number\n  readonly ntpMost: number\n  readonly ntpLeast: number\n  readonly rtpTimestamp: number\n  readonly sendersPacketCount: number\n  readonly sendersOctetCount: number\n  readonly reports: readonly RtcpReportBlock[]\n}\n\nconst parseSR = (buffer: Buffer, base: Rtcp): RtcpSR => ({\n  ...base,\n  syncSource: buffer.readUInt32BE(4),\n  ntpMost: buffer.readUInt32BE(8),\n  ntpLeast: buffer.readUInt32BE(12),\n  rtpTimestamp: buffer.readUInt32BE(16),\n  sendersPacketCount: buffer.readUInt32BE(20),\n  sendersOctetCount: buffer.readUInt32BE(24),\n  reports: parseReportBlocks(base.count, buffer, 28),\n})\n\nexport const isRtcpSR = (rtcp: Rtcp): rtcp is RtcpSR =>\n  rtcp.packetType === RTCPPacketType.SR\n\n/*\nRR: Receiver Report RTCP Packet\n\n        0                   1                   2                   3\n        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nheader |V=2|P|    RC   |   PT=RR=201   |             length            |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                     SSRC of packet sender                     |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\nreport |                 SSRC_1 (SSRC of first source)                 |\nblock  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  1    | fraction lost |       cumulative number of packets lost       |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |           extended highest sequence number received           |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                      interarrival jitter                      |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                         last SR (LSR)                         |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                   delay since last SR (DLSR)                  |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\nreport |                 SSRC_2 (SSRC of second source)                |\nblock  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n  2    :                               ...                             :\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n       |                  profile-specific extensions                  |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n*/\n\nexport interface RtcpRR extends Rtcp {\n  readonly version: RTCPPacketType.RR\n\n  readonly syncSource: number\n  readonly reports: readonly RtcpReportBlock[]\n}\n\nconst parseRR = (buffer: Buffer, base: Rtcp): RtcpRR => ({\n  ...base,\n  syncSource: buffer.readUInt32BE(4),\n  reports: parseReportBlocks(base.count, buffer, 8),\n})\n\nexport const isRtcpRR = (rtcp: Rtcp): rtcp is RtcpRR =>\n  rtcp.packetType === RTCPPacketType.RR\n\n/*\nSDES: Source Description RTCP Packet\n\n        0                   1                   2                   3\n        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nheader |V=2|P|    SC   |  PT=SDES=202  |             length            |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\nchunk  |                          SSRC/CSRC_1                          |\n  1    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                           SDES items                          |\n       |                              ...                              |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\nchunk  |                          SSRC/CSRC_2                          |\n  2    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                           SDES items                          |\n       |                              ...                              |\n       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n*/\n\nexport enum SDESItem {\n  CNAME = 1,\n  NAME = 2,\n  EMAIL = 3,\n  PHONE = 4,\n  LOC = 5,\n  TOOL = 6,\n  NOTE = 7,\n  PRIV = 8,\n}\n\nexport interface RtcpSDESBlock {\n  readonly source: number\n  readonly items: Array<[number, string] | [SDESItem.PRIV, string, string]>\n}\n\nexport interface RtcpSDES extends Rtcp {\n  readonly version: RTCPPacketType.SDES\n\n  readonly syncSource: number\n  readonly sourceDescriptions: readonly RtcpSDESBlock[]\n}\n\nconst parseSDES = (buffer: Buffer, base: Rtcp): RtcpSDES => {\n  const sourceDescriptions: RtcpSDESBlock[] = []\n  let offset = 4\n  for (let block = 0; block < base.count; block++) {\n    const chunk: RtcpSDESBlock = {\n      source: buffer.readUInt32BE(offset),\n      items: [],\n    }\n    offset += 4\n\n    while (true) {\n      const itemType = buffer.readUInt8(offset++)\n\n      if (itemType === 0) {\n        // start next block at word boundary\n        if (offset % 4 !== 0) {\n          offset += 4 - (offset % 4)\n        }\n        break\n      }\n\n      const length = buffer.readUInt8(offset++)\n\n      if (itemType === SDESItem.PRIV) {\n        const prefixLength = buffer.readUInt8(offset)\n        const prefix = buffer.toString(\n          'utf8',\n          offset + 1,\n          offset + 1 + prefixLength\n        )\n        const value = buffer.toString(\n          'utf8',\n          offset + 1 + prefixLength,\n          offset + length\n        )\n        chunk.items.push([SDESItem.PRIV, prefix, value])\n      } else {\n        const value = buffer.toString('utf8', offset, offset + length)\n        chunk.items.push([itemType, value])\n      }\n\n      offset += length\n    }\n    sourceDescriptions.push(chunk)\n  }\n\n  return {\n    ...base,\n    syncSource: buffer.readUInt32BE(4),\n    sourceDescriptions,\n  }\n}\n\nexport const isRtcpSDES = (rtcp: Rtcp): rtcp is RtcpSDES =>\n  rtcp.packetType === RTCPPacketType.SDES\n\n/*\nBYE: Goodbye RTCP Packet\n\n       0                   1                   2                   3\n       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n      |V=2|P|    SC   |   PT=BYE=203  |             length            |\n      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n      |                           SSRC/CSRC                           |\n      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n      :                              ...                              :\n      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n(opt) |     length    |               reason for leaving            ...\n      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n*/\n\nexport interface RtcpBye extends Rtcp {\n  readonly version: RTCPPacketType.BYE\n\n  readonly sources: number[]\n  readonly reason?: string\n}\n\nconst parseBYE = (buffer: Buffer, base: Rtcp): RtcpBye => {\n  const sources: number[] = []\n  for (let block = 0; block < base.count; block++) {\n    sources.push(buffer.readUInt32BE(4 + 4 * block))\n  }\n\n  let reason\n  if (base.length > base.count) {\n    const start = 4 + 4 * base.count\n    const length = buffer.readUInt8(start)\n    reason = buffer.toString('utf-8', start + 1, start + 1 + length)\n  }\n\n  return {\n    ...base,\n    sources,\n    reason,\n  }\n}\n\nexport const isRtcpBye = (rtcp: Rtcp): rtcp is RtcpBye =>\n  rtcp.packetType === RTCPPacketType.BYE\n\n/*\nAPP: Application-Defined RTCP Packet\n\n    0                   1                   2                   3\n    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n   |V=2|P| subtype |   PT=APP=204  |             length            |\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n   |                           SSRC/CSRC                           |\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n   |                          name (ASCII)                         |\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n   |                   application-dependent data                ...\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n*/\n\nexport interface RtcpApp extends Rtcp {\n  readonly version: RTCPPacketType.APP\n\n  readonly subtype: number\n  readonly source: number\n  readonly name: string\n  readonly data: Buffer\n}\n\nconst parseAPP = (buffer: Buffer, base: Rtcp): RtcpApp => {\n  return {\n    ...base,\n    subtype: base.count,\n    source: buffer.readUInt32BE(4),\n    name: buffer.toString('ascii', 8, 12),\n    data: buffer.slice(12),\n  }\n}\n\nexport const isRtcpApp = (rtcp: Rtcp): rtcp is RtcpApp =>\n  rtcp.packetType === RTCPPacketType.APP\n", "import { MessageType, SdpMessage } from '../../components/message'\n\nimport { NtpSeconds, seconds } from './ntp'\n\ninterface ConnectionField {\n  // c=<nettype> <addrtype> <connection-address>\n  networkType: 'IN'\n  addressType: 'IP4' | 'IP6'\n  connectionAddress: string\n}\n\ninterface BandwidthField {\n  readonly type: string\n  readonly value: number\n}\n\n// RTSP extensions: https://tools.ietf.org/html/rfc7826 (22.15)\n// exists on both session and media level\ninterface RtspExtensions {\n  readonly range?: string\n  readonly control?: string\n  readonly mtag?: string\n}\n\n/**\n * The session description protocol (SDP).\n *\n * Contains parser to convert SDP data into an SDP structure.\n * https://tools.ietf.org/html/rfc4566\n *\n * NOTE: not all SDP attributes have been implemented,\n * and in some cases the handling of attributes has been\n * simplified to not cover multiple identical attributes.\n */\n\n/**\n * Session description\n *\n * Optional items are marked with a '*'.\n *\n * v=  (protocol version)\n * o=  (owner/creator and session identifier).\n * s=  (session name)\n * i=* (session information)\n * u=* (URI of description)\n * e=* (email address)\n * p=* (phone number)\n * c=* (connection information - not required if included in all media)\n * b=* (bandwidth information)\n * One or more time descriptions (see below)\n * z=* (time zone adjustments)\n * k=* (encryption key)\n * a=* (zero or more session attribute lines)\n * Zero or more media descriptions (see below)\n *\n * Names of the fields below are annotated above with\n * the names used in Appendix A: SDP Grammar of RFC 2327.\n */\nexport interface SessionDescription extends RtspExtensions {\n  // v=0\n  readonly version: 0\n  // o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>\n  readonly originField: OriginField\n  // s=<session name>\n  readonly name: string\n  // i=<session description>\n  readonly description?: string\n  // u=<uri>\n  readonly uri?: string\n  // e=<email-address>\n  readonly email?: string | string[]\n  // p=<phone-number>\n  readonly phone?: string | string[]\n  // c=<nettype> <addrtype> <connection-address>\n  readonly connection?: ConnectionField\n  // b=<bwtype>:<bandwidth>\n  readonly bandwidth?: BandwidthField\n  // One or more time descriptions\n  readonly time: TimeDescription\n  readonly repeatTimes?: RepeatTimeDescription\n  // Zero or more media descriptions\n  readonly media: MediaDescription[]\n}\n\ninterface OriginField {\n  // o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>\n  username: string\n  sessionId: number\n  sessionVersion: number\n  networkType: 'IN'\n  addressType: 'IP4' | 'IP6'\n  address: string\n}\n\n/**\n * Time description\n *\n * t=  (time the session is active)\n * r=* (zero or more repeat times)\n */\nexport interface TimeDescription {\n  // t=<start-time> <stop-time>\n  readonly startTime: NtpSeconds\n  readonly stopTime: NtpSeconds\n}\n\nexport interface RepeatTimeDescription {\n  // r=<repeat interval> <active duration> <offsets from start-time>\n  readonly repeatInterval: seconds\n  readonly activeDuration: seconds\n  readonly offsets: seconds[]\n}\n\n/**\n * Media description\n *\n * m=  (media name and transport address)\n * i=* (media title)\n * c=* (connection information -- optional if included at session level)\n * b=* (zero or more bandwidth information lines)\n * k=* (encryption key)\n * a=* (zero or more media attribute lines)\n *\n * The parser only handles a single fmt value\n * and only one rtpmap attribute (in theory there\n * can be multiple fmt values with corresponding rtpmap\n * attributes)\n */\nexport interface MediaDescription extends RtspExtensions {\n  // m=<media> <port> <proto> <fmt> ...\n  // m=<media> <port>/<number of ports> <proto> <fmt> ...\n  readonly type: 'audio' | 'video' | 'application' | 'data' | 'control'\n  readonly port: number\n  readonly protocol: 'udp' | 'RTP/AVP' | 'RTP/SAVP'\n  readonly fmt: number // Payload type(s)\n  readonly connection?: ConnectionField\n  readonly bandwidth?: BandwidthField\n  /**\n   * Any remaining attributes\n   * a=...\n   */\n  // a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]\n  readonly rtpmap?: {\n    readonly clockrate: number\n    readonly encodingName: string\n    readonly payloadType: number\n  }\n  // a=fmtp:<format> <format specific parameters>\n  readonly fmtp: {\n    readonly format: string\n    readonly parameters: { [key: string]: any }\n  }\n  // Extra non-SDP properties\n  // TODO: refactor this away\n  mime?: string\n  codec?: any\n}\n\nexport type TransformationMatrix = readonly [\n  readonly [number, number, number],\n  readonly [number, number, number],\n  readonly [number, number, number],\n]\n\nexport interface VideoMedia extends MediaDescription {\n  readonly type: 'video'\n  readonly framerate?: number\n  // Transformation matrix\n  readonly transform?: TransformationMatrix\n  readonly 'x-sensor-transform'?: TransformationMatrix\n  // JPEG\n  readonly framesize?: [number, number]\n}\n\nexport interface H264Media extends VideoMedia {\n  readonly rtpmap: {\n    readonly clockrate: number\n    readonly encodingName: string\n    readonly payloadType: number\n  }\n}\n\nexport interface AudioMedia extends MediaDescription {\n  readonly type: 'audio'\n}\n\nexport interface AACParameters {\n  readonly bitrate: string\n  readonly config: string\n  readonly indexdeltalength: string\n  readonly indexlength: string\n  readonly mode: 'AAC-hbr'\n  readonly 'profile-level-id': string\n  readonly sizelength: string\n  readonly streamtype: string\n  readonly ctsdeltalength: string\n  readonly dtsdeltalength: string\n  readonly randomaccessindication: string\n  readonly streamstateindication: string\n  readonly auxiliarydatasizelength: string\n}\n\nexport interface AACMedia extends AudioMedia {\n  readonly fmtp: {\n    readonly format: string\n    readonly parameters: AACParameters\n  }\n  readonly rtpmap: {\n    readonly clockrate: number\n    readonly encodingName: string\n    readonly payloadType: number\n  }\n}\n\nexport interface Sdp {\n  readonly session: SessionDescription\n  readonly media: MediaDescription[]\n}\n\nconst extractLineVals = (buffer: Buffer, lineStart: string, start = 0) => {\n  const anchor = `\\n${lineStart}`\n  start = buffer.indexOf(anchor, start)\n  let end = 0\n  const ret: string[] = []\n  while (start >= 0) {\n    end = buffer.indexOf('\\n', start + anchor.length)\n    ret.push(buffer.toString('ascii', start + anchor.length, end).trim())\n    start = buffer.indexOf(anchor, end)\n  }\n  return ret\n}\n\n// SDP parsing\n\n/**\n * Identify the start of a session-level or media-level section.\n * @param  line - The line to parse\n */\nconst newMediaLevel = (line: string) => {\n  return line.match(/^m=/)\n}\n\nconst splitOnFirst = (c: string, text: string) => {\n  const p = text.indexOf(c)\n  if (p < 0) {\n    return [text.slice(0)]\n  }\n  return [text.slice(0, p), text.slice(p + 1)]\n}\n\nconst attributeParsers: any = {\n  fmtp: (value: string) => {\n    const [format, stringParameters] = splitOnFirst(' ', value)\n    switch (format) {\n      default: {\n        const pairs = stringParameters.trim().split(';')\n        const parameters: { [key: string]: any } = {}\n        pairs.forEach((pair) => {\n          const [key, val] = splitOnFirst('=', pair)\n          const normalizedKey = key.trim().toLowerCase()\n          if (normalizedKey !== '') {\n            parameters[normalizedKey] = val.trim()\n          }\n        })\n        return { format, parameters }\n      }\n    }\n  },\n  framerate: Number,\n  rtpmap: (value: string) => {\n    const [payloadType, encoding] = splitOnFirst(' ', value)\n    const [encodingName, clockrate, encodingParameters] = encoding\n      .toUpperCase()\n      .split('/')\n    if (encodingParameters === undefined) {\n      return {\n        payloadType: Number(payloadType),\n        encodingName,\n        clockrate: Number(clockrate),\n      }\n    }\n    return {\n      payloadType: Number(payloadType),\n      encodingName,\n      clockrate: Number(clockrate),\n      encodingParameters,\n    }\n  },\n  transform: (value: string) => {\n    return value.split(';').map((row) => row.split(',').map(Number))\n  },\n  'x-sensor-transform': (value: string) => {\n    return value.split(';').map((row) => row.split(',').map(Number))\n  },\n  framesize: (value: string) => {\n    return value.split(' ')[1].split('-').map(Number)\n  },\n}\n\nconst parseAttribute = (body: string) => {\n  const [attribute, value] = splitOnFirst(':', body)\n  if (value === undefined) {\n    return { [attribute]: true }\n  }\n  if (attributeParsers[attribute] !== undefined) {\n    return { [attribute]: attributeParsers[attribute](value) }\n  }\n  return { [attribute]: value }\n}\n\nconst extractField = (line: string) => {\n  const prefix = line.slice(0, 1)\n  const body = line.slice(2)\n  switch (prefix) {\n    case 'v':\n      return { version: body }\n    case 'o': {\n      const [\n        username,\n        sessionId,\n        sessionVersion,\n        netType,\n        addrType,\n        unicastAddress,\n      ] = body.split(' ')\n      return {\n        origin: {\n          addrType,\n          netType,\n          sessionId,\n          sessionVersion,\n          unicastAddress,\n          username,\n        },\n      }\n    }\n    case 's':\n      return { sessionName: body }\n    case 'i':\n      return { sessionInformation: body }\n    case 'u':\n      return { uri: body }\n    case 'e':\n      return { email: body }\n    case 'p':\n      return { phone: body }\n    // c=<nettype> <addrtype> <connection-address>\n    case 'c': {\n      const [connectionNetType, connectionAddrType, connectionAddress] =\n        body.split(' ')\n      return {\n        connectionData: {\n          addrType: connectionAddrType,\n          connectionAddress,\n          netType: connectionNetType,\n        },\n      }\n    }\n    // b=<bwtype>:<bandwidth>\n    case 'b': {\n      const [bwtype, bandwidth] = body.split(':')\n      return { bwtype, bandwidth }\n    }\n    // t=<start-time> <stop-time>\n    case 't': {\n      const [startTime, stopTime] = body.split(' ').map(Number)\n      return { time: { startTime, stopTime } }\n    }\n    // r=<repeat interval> <active duration> <offsets from start-time>\n    case 'r': {\n      const [repeatInterval, activeDuration, ...offsets] = body\n        .split(' ')\n        .map(Number)\n      return {\n        repeatTimes: { repeatInterval, activeDuration, offsets },\n      }\n    }\n    // z=<adjustment time> <offset> <adjustment time> <offset> ....\n    case 'z':\n      return\n    // k=<method>\n    // k=<method>:<encryption key>\n    case 'k':\n      return\n    // a=<attribute>\n    // a=<attribute>:<value>\n    case 'a':\n      return parseAttribute(body)\n    case 'm': {\n      // Only the first fmt field is parsed!\n      const [type, port, protocol, fmt] = body.split(' ')\n      return { type, port: Number(port), protocol, fmt: Number(fmt) }\n    }\n    default:\n    // console.log('unknown SDP prefix ', prefix);\n  }\n}\n\nexport const extractURIs = (buffer: Buffer) => {\n  // There is a control URI above the m= line, which should not be used\n  const seekFrom = buffer.indexOf('\\nm=')\n  return extractLineVals(buffer, 'a=control:', seekFrom)\n}\n\n/**\n * Parse an SDP text into a data structure with session and media objects.\n *\n * @param  buffer - The buffer containing the SDP plain text\n * @return Structured SDP data\n */\nexport const parse = (buffer: Buffer): Sdp => {\n  const sdp = buffer\n    .toString('ascii')\n    .split('\\n')\n    .map((s) => s.trim())\n  const struct: { [key: string]: any } = { session: {}, media: [] }\n  let mediaCounter = 0\n  let current = struct.session\n  for (const line of sdp) {\n    if (newMediaLevel(line)) {\n      struct.media[mediaCounter] = {}\n      current = struct.media[mediaCounter]\n      ++mediaCounter\n    }\n    current = Object.assign(current, extractField(line))\n  }\n  return struct as Sdp\n}\n\nexport const messageFromBuffer = (buffer: Buffer): SdpMessage => {\n  return {\n    type: MessageType.SDP,\n    data: buffer,\n    sdp: parse(buffer),\n  }\n}\n", "import { rtcpMessageFromBuffer } from '../../utils/protocols/rtcp'\nimport { bodyOffset, extractHeaderValue } from '../../utils/protocols/rtsp'\nimport { messageFromBuffer } from '../../utils/protocols/sdp'\nimport {\n  MessageType,\n  RtcpMessage,\n  RtpMessage,\n  RtspMessage,\n  SdpMessage,\n} from '../message'\n\n/**\n * The different possible internal parser states.\n */\nenum STATE {\n  IDLE = 0,\n  INTERLEAVED = 1,\n  RTSP = 2,\n}\n\nconst INTERLEAVED_HEADER_BYTES = 4\nconst ASCII_DOLLAR = 0x24\n\ninterface RtpPacketInfo {\n  channel: number\n  begin: number\n  end: number\n}\n\n/**\n * Extract packet information from the interleaved header\n * (4-byte section before the RTP packet).\n * @param  chunks - Buffers constituting the data.\n * @return Packet information (channel, begin, end).\n */\nconst rtpPacketInfo = (chunks: Buffer[]): RtpPacketInfo => {\n  const header = Buffer.alloc(INTERLEAVED_HEADER_BYTES)\n  let i = 0\n  let bytesRead = 0\n\n  while (bytesRead < header.length) {\n    const chunk = chunks[i++]\n    const bytesToRead = Math.min(chunk.length, header.length - bytesRead)\n    chunk.copy(header, bytesRead, 0, bytesToRead)\n    bytesRead += bytesToRead\n  }\n  const channel = header[1]\n  const begin = header.length\n  const length = header.readUInt16BE(2)\n  const end = begin + length\n\n  return { channel, begin, end }\n}\n\n/**\n * Parser class with a public method that takes a data chunk and\n * returns an array of RTP/RTSP/RTCP message objects. The parser\n * keeps track of the added chunks internally in an array and only\n * concatenates chunks when data is needed to construct a message.\n * @type {[type]}\n */\nexport class Parser {\n  private _chunks: Buffer[] = []\n  private _length = 0\n  private _state: STATE = STATE.IDLE\n  private _packet?: RtpPacketInfo\n\n  /**\n   * Create a new Parser object.\n   * @return {undefined}\n   */\n  constructor() {\n    this._init()\n  }\n\n  /**\n   * Initialize the internal properties to their default starting\n   * values.\n   * @return {undefined}\n   */\n  _init() {\n    this._chunks = []\n    this._length = 0\n    this._state = STATE.IDLE\n  }\n\n  _push(chunk: Buffer) {\n    this._chunks.push(chunk)\n    this._length += chunk.length\n  }\n\n  /**\n   * Extract RTSP messages.\n   * @return {Array} An array of messages, possibly empty.\n   */\n  _parseRtsp(): Array<RtspMessage | SdpMessage> {\n    const messages: Array<RtspMessage | SdpMessage> = []\n\n    const buffer = Buffer.concat(this._chunks)\n    const chunkBodyOffset = bodyOffset(buffer)\n    // If last added chunk does not have the end of the header, return.\n    if (chunkBodyOffset === -1) {\n      return messages\n    }\n\n    const rtspHeaderLength = chunkBodyOffset\n    const contentLength = extractHeaderValue(buffer, 'Content-Length')\n    if (\n      contentLength &&\n      parseInt(contentLength) > buffer.length - rtspHeaderLength\n    ) {\n      // we do not have the whole body\n      return messages\n    }\n\n    this._init() // resets this._chunks and this._length\n\n    if (\n      rtspHeaderLength === buffer.length ||\n      buffer[rtspHeaderLength] === ASCII_DOLLAR\n    ) {\n      // No body in this chunk, assume there is no body?\n      const packet = buffer.slice(0, rtspHeaderLength)\n      messages.push({ type: MessageType.RTSP, data: packet })\n\n      // Add the remaining data to the chunk stack.\n      const trailing = buffer.slice(rtspHeaderLength)\n      this._push(trailing)\n    } else {\n      // Body is assumed to be the remaining data of the last chunk.\n      const packet = buffer\n      const body = buffer.slice(rtspHeaderLength)\n\n      messages.push({ type: MessageType.RTSP, data: packet })\n      messages.push(messageFromBuffer(body))\n    }\n\n    return messages\n  }\n\n  /**\n   * Extract RTP/RTCP messages.\n   * @return {Array} An array of messages, possibly empty.\n   */\n  _parseInterleaved(): Array<RtpMessage | RtcpMessage> {\n    const messages: Array<RtpMessage | RtcpMessage> = []\n\n    // Skip as long as we don't have the first 4 bytes\n    if (this._length < INTERLEAVED_HEADER_BYTES) {\n      return messages\n    }\n\n    // Enough bytes to construct the header and extract packet info.\n    if (!this._packet) {\n      this._packet = rtpPacketInfo(this._chunks)\n    }\n\n    // As long as we don't have enough chunks, skip.\n    if (this._length < this._packet.end) {\n      return messages\n    }\n\n    // We have enough data to extract the packet.\n    const buffer = Buffer.concat(this._chunks)\n    const packet = buffer.slice(this._packet.begin, this._packet.end)\n    const trailing = buffer.slice(this._packet.end)\n    const channel = this._packet.channel\n\n    delete this._packet\n\n    // Prepare next bit.\n    this._init()\n    this._push(trailing)\n\n    // Extract messages\n    if (channel % 2 === 0) {\n      // Even channels 0, 2, ...\n      messages.push({ type: MessageType.RTP, data: packet, channel })\n    } else {\n      // Odd channels 1, 3, ...\n      let rtcpPackets = packet\n      do {\n        // RTCP packets can be packed together, unbundle them:\n        const rtcpByteSize = rtcpPackets.readUInt16BE(2) * 4 + 4\n        messages.push(\n          rtcpMessageFromBuffer(channel, rtcpPackets.slice(0, rtcpByteSize))\n        )\n        rtcpPackets = rtcpPackets.slice(rtcpByteSize)\n      } while (rtcpPackets.length > 0)\n    }\n\n    return messages\n  }\n\n  /**\n   * Set the internal state based on the type of the first chunk\n   */\n  _setState() {\n    // Remove leading 0-sized chunks.\n    while (this._chunks.length > 0 && this._chunks[0].length === 0) {\n      this._chunks.shift()\n    }\n\n    const firstChunk = this._chunks[0]\n\n    if (this._chunks.length === 0) {\n      this._state = STATE.IDLE\n    } else if (firstChunk[0] === ASCII_DOLLAR) {\n      this._state = STATE.INTERLEAVED\n    } else if (firstChunk.toString('ascii', 0, 4) === 'RTSP') {\n      this._state = STATE.RTSP\n    } else {\n      throw new Error(`Unknown chunk of length ${firstChunk.length}`)\n    }\n  }\n\n  /**\n   * Add the next chunk of data to the parser and extract messages.\n   * If no message can be extracted, an empty array is returned, otherwise\n   * an array of messages is returned.\n   * @param  chunk - The next piece of data.\n   * @return An array of messages, possibly empty.\n   */\n  parse(\n    chunk: Buffer\n  ): Array<SdpMessage | RtspMessage | RtpMessage | RtcpMessage> {\n    this._push(chunk)\n\n    if (this._state === STATE.IDLE) {\n      this._setState()\n    }\n\n    let messages: Array<SdpMessage | RtspMessage | RtpMessage | RtcpMessage> =\n      []\n    let done = false\n\n    while (!done) {\n      let extracted: Array<\n        SdpMessage | RtspMessage | RtpMessage | RtcpMessage\n      > = []\n      switch (this._state) {\n        case STATE.IDLE:\n          break\n        case STATE.INTERLEAVED:\n          extracted = this._parseInterleaved()\n          break\n        case STATE.RTSP:\n          extracted = this._parseRtsp()\n          break\n        default:\n          throw new Error('internal error: unknown state')\n      }\n\n      if (extracted.length > 0) {\n        messages = messages.concat(extracted)\n      } else {\n        done = true\n      }\n\n      this._setState()\n    }\n\n    return messages\n  }\n}\n", "import debug from 'debug'\n\nimport { Transform } from 'stream'\n\nimport { merge } from '../../utils/config'\nimport { getTime } from '../../utils/protocols/ntp'\nimport { Rtcp, isRtcpSR } from '../../utils/protocols/rtcp'\nimport { timestamp } from '../../utils/protocols/rtp'\nimport {\n  connectionEnded,\n  contentBase,\n  contentLocation,\n  range,\n  sequence,\n  sessionId,\n  sessionTimeout,\n  statusCode,\n} from '../../utils/protocols/rtsp'\nimport { Sdp } from '../../utils/protocols/sdp'\nimport { Tube } from '../component'\nimport {\n  Message,\n  MessageType,\n  RtcpMessage,\n  RtpMessage,\n  RtspMessage,\n  SdpMessage,\n} from '../message'\n\nfunction isAbsolute(url: string) {\n  return /^[^:]+:\\/\\//.test(url)\n}\n\nenum STATE {\n  IDLE = 'idle',\n  PLAYING = 'playing',\n  PAUSED = 'paused',\n}\n\nexport enum RTSP_METHOD {\n  OPTIONS = 'OPTIONS',\n  DESCRIBE = 'DESCRIBE',\n  SETUP = 'SETUP',\n  PLAY = 'PLAY',\n  PAUSE = 'PAUSE',\n  TEARDOWN = 'TEARDOWN',\n}\n\nconst MIN_SESSION_TIMEOUT = 5 // minimum timeout for a rtsp session in seconds\n\ninterface Headers {\n  [key: string]: string\n}\n\ninterface Command {\n  method: RTSP_METHOD\n  headers?: Headers\n  uri?: string\n}\n\ninterface MethodHeaders {\n  [key: string]: Headers\n}\n\nexport interface RtspConfig {\n  hostname?: string\n  parameters?: string[]\n  uri?: string\n  headers?: MethodHeaders\n  defaultHeaders?: Headers\n}\n\n// Default RTSP configuration\nconst defaultConfig = (\n  hostname: string = typeof window === 'undefined'\n    ? ''\n    : window.location.hostname,\n  parameters: string[] = []\n): RtspConfig => {\n  const uri =\n    parameters.length > 0\n      ? `rtsp://${hostname}/axis-media/media.amp?${parameters.join('&')}`\n      : `rtsp://${hostname}/axis-media/media.amp`\n\n  return { uri }\n}\n\nexport class RTSPResponseError extends Error {\n  public code: number\n\n  constructor(message: string, code: number) {\n    super(message)\n    this.name = 'RTSPResponseError'\n    this.code = code\n  }\n}\n\n/**\n * A component that sets up a command queue in order to interact with the RTSP\n * server. Allows control over the RTSP session by listening to incoming messages\n * and sending request on the outgoing stream.\n *\n * The following handlers can be set on the component:\n *  - onSdp: will be called when an SDP object is sent with the object as argument\n *  - onPlay: will be called when an RTSP PLAY response is sent with the media range\n *            as argument. The latter is an array [start, stop], where start is \"now\"\n *            (for live) or a time in seconds, and stop is undefined (for live or\n *            ongoing streams) or a time in seconds.\n * @extends {Component}\n */\nexport class RtspSession extends Tube {\n  public uri?: string\n  public headers?: MethodHeaders\n  public defaultHeaders?: Headers\n  public t0?: { [key: number]: number }\n  public n0?: { [key: number]: number }\n  public clockrates?: { [key: number]: number }\n  public startTime?: number\n\n  public onRtcp?: (rtcp: Rtcp) => void\n  public onSdp?: (sdp: Sdp) => void\n  public onError?: (err: RTSPResponseError) => void\n  public onPlay?: (range?: string[]) => void\n\n  public retry?: () => void\n\n  private _outgoingClosed: boolean\n  private _sequence?: number\n  private _callStack?: Command[]\n  private _callHistory?: any[]\n  private _state?: STATE\n  private _waiting?: boolean\n  private _contentBase?: string | null\n  private _contentLocation?: string | null\n  private _sessionId?: string | null\n  private _sessionControlURL: string\n  private _renewSessionInterval?: number | null\n\n  /**\n   * Create a new RTSP session controller component.\n   * @param  [config] Details about the session.\n   * @param  [config.hostname] The RTSP server hostname\n   * @param  [config.parameters] The RTSP URI parameters\n   * @param  [config.uri] The full RTSP URI (overrides any hostname/parameters)\n   * @param  [config.defaultHeaders] Default headers to use (for all methods).\n   * @param  [config.headers] Headers to use (mapped to each method).\n   */\n  constructor(config: RtspConfig = {}) {\n    const { uri, headers, defaultHeaders } = merge(\n      defaultConfig(config.hostname, config.parameters),\n      config\n    )\n\n    const incoming = new Transform({\n      objectMode: true,\n      transform: (msg: Message, _, callback) => {\n        if (msg.type === MessageType.RTSP) {\n          this._onRtsp(msg)\n          callback() // Consumes the RTSP packages\n        } else if (msg.type === MessageType.RTCP) {\n          this._onRtcp(msg)\n          // Execute externally registered SDP handler\n          this.onRtcp && this.onRtcp(msg.rtcp)\n          // Pass SDP forward\n          callback(undefined, msg)\n        } else if (msg.type === MessageType.RTP) {\n          this._onRtp(msg)\n          callback(undefined, msg)\n        } else if (msg.type === MessageType.SDP) {\n          this._onSdp(msg)\n          // Execute externally registered SDP handler\n          this.onSdp && this.onSdp(msg.sdp)\n          // Pass SDP forward\n          callback(undefined, msg)\n        } else {\n          // Not a message we should handle\n          callback(undefined, msg)\n        }\n      },\n    })\n\n    incoming.on('end', () => {\n      // Incoming was ended, assume that outgoing is closed as well\n      this._outgoingClosed = true\n    })\n\n    super(incoming)\n\n    this._outgoingClosed = false\n\n    this._reset()\n    this.update(uri, headers, defaultHeaders)\n\n    this._sessionControlURL = this._controlURL()\n  }\n\n  /**\n   * Update the cached RTSP uri and headers.\n   * @param  uri - The RTSP URI.\n   * @param  headers - Maps commands to headers.\n   * @param  defaultHeaders - Default headers.\n   */\n  update(\n    uri: string | undefined,\n    headers: MethodHeaders = {},\n    defaultHeaders: Headers = {}\n  ) {\n    if (uri === undefined) {\n      throw new Error(\n        'You must supply an uri when creating a RtspSessionComponent'\n      )\n    }\n    this.uri = uri\n    this.defaultHeaders = defaultHeaders\n    this.headers = Object.assign(\n      {\n        [RTSP_METHOD.OPTIONS]: {},\n        [RTSP_METHOD.PLAY]: {},\n        [RTSP_METHOD.SETUP]: { Blocksize: '64000' },\n        [RTSP_METHOD.DESCRIBE]: { Accept: 'application/sdp' },\n        [RTSP_METHOD.PAUSE]: {},\n      },\n      headers\n    )\n  }\n\n  /**\n   * Restore the initial values to the state they were in before any RTSP\n   * connection was made.\n   */\n  _reset() {\n    this._sequence = 1\n    this.retry = () => console.error(\"No request sent, can't retry\")\n    this._callStack = []\n    this._callHistory = []\n    this._state = STATE.IDLE\n    this._waiting = false\n\n    this._contentBase = null\n    this._sessionId = null\n    if (this._renewSessionInterval !== null) {\n      clearInterval(this._renewSessionInterval)\n    }\n    this._renewSessionInterval = null\n\n    this.t0 = undefined\n    this.n0 = undefined\n    this.clockrates = undefined\n  }\n\n  _controlURL(attribute?: string) {\n    if (attribute !== undefined && isAbsolute(attribute)) {\n      return attribute\n    }\n\n    // Not defined or not absolute, we need a base URI\n    const baseURL = this._contentBase ?? this._contentLocation ?? this.uri\n    if (baseURL === null || baseURL === undefined) {\n      throw new Error(\n        'relative or missing control attribute but no base URL available'\n      )\n    }\n    if (attribute === undefined || attribute === '*') {\n      return baseURL\n    }\n    return new URL(attribute, baseURL).href\n  }\n\n  /**\n   * Handles incoming RTSP messages and send the next command in the queue.\n   * @param  msg - An incoming RTSP message.\n   */\n  _onRtsp(msg: RtspMessage) {\n    this._waiting = false\n\n    const status = statusCode(msg.data)\n    const ended = connectionEnded(msg.data)\n    const seq = sequence(msg.data)\n    if (seq === null) {\n      throw new Error('rtsp: expected sequence number')\n    }\n    if (this._callHistory === undefined) {\n      throw new Error('rtsp: internal error')\n    }\n    const method = this._callHistory[seq - 1]\n\n    debug('msl:rtsp:incoming')(`${msg.data}`)\n    if (!this._sessionId && !ended) {\n      // Response on first SETUP\n      this._sessionId = sessionId(msg.data)\n      const _sessionTimeout = sessionTimeout(msg.data)\n      if (_sessionTimeout !== null) {\n        // The server specified that sessions will timeout if not renewed.\n        // In order to keep it alive we need periodically send a RTSP_OPTIONS message\n        if (this._renewSessionInterval !== null) {\n          clearInterval(this._renewSessionInterval)\n        }\n        this._renewSessionInterval = setInterval(\n          () => {\n            this._enqueue({ method: RTSP_METHOD.OPTIONS })\n            this._dequeue()\n          },\n          Math.max(MIN_SESSION_TIMEOUT, _sessionTimeout - 5) * 1000\n        ) as unknown as number\n      }\n    }\n\n    if (!this._contentBase) {\n      this._contentBase = contentBase(msg.data)\n    }\n    if (!this._contentLocation) {\n      this._contentLocation = contentLocation(msg.data)\n    }\n    if (status >= 400) {\n      // TODO: Retry in certain cases?\n      this.onError &&\n        this.onError(new RTSPResponseError(msg.data.toString('ascii'), status))\n    }\n\n    if (method === RTSP_METHOD.PLAY) {\n      // When starting to play, send the actual range to an external handler.\n      this.onPlay && this.onPlay(range(msg.data))\n    }\n\n    if (ended) {\n      debug('msl:rtsp:incoming')(\n        `RTSP Session ${this._sessionId} ended with statusCode: ${status}`\n      )\n      this._sessionId = null\n    }\n\n    this._dequeue()\n  }\n\n  _onRtcp(msg: RtcpMessage) {\n    if (this.t0 === undefined || this.n0 === undefined) {\n      throw new Error('rtsp: internal error')\n    }\n    if (isRtcpSR(msg.rtcp)) {\n      const rtpChannel = msg.channel - 1\n      this.t0[rtpChannel] = msg.rtcp.rtpTimestamp\n      this.n0[rtpChannel] = getTime(msg.rtcp.ntpMost, msg.rtcp.ntpLeast)\n    }\n  }\n\n  _onRtp(msg: RtpMessage) {\n    if (\n      this.t0 === undefined ||\n      this.n0 === undefined ||\n      this.clockrates === undefined\n    ) {\n      throw new Error('rtsp: internal error')\n    }\n    const rtpChannel = msg.channel\n    const t0 = this.t0[rtpChannel]\n    const n0 = this.n0[rtpChannel]\n    if (typeof t0 !== 'undefined' && typeof n0 !== 'undefined') {\n      const clockrate = this.clockrates[rtpChannel]\n      const t = timestamp(msg.data)\n      // The RTP timestamps are unsigned 32 bit and will overflow\n      // at some point. We can guard against the overflow by ORing with 0,\n      // which will bring any difference back into signed 32-bit domain.\n      const dt = (t - t0) | 0\n      msg.ntpTimestamp = (dt / clockrate) * 1000 + n0\n    }\n  }\n\n  /**\n   * Handles incoming SDP messages, reply with SETUP and optionally PLAY.\n   * @param  msg - An incoming SDP message.\n   */\n  _onSdp(msg: SdpMessage) {\n    this.n0 = {}\n    this.t0 = {}\n    this.clockrates = {}\n\n    this._sessionControlURL = this._controlURL(msg.sdp.session.control)\n\n    msg.sdp.media.forEach((media, index) => {\n      // We should actually be able to handle\n      // non-dynamic payload types, but ignored for now.\n      if (media.rtpmap === undefined) {\n        return\n      }\n      const { clockrate } = media.rtpmap\n\n      const rtp = index * 2\n      const rtcp = rtp + 1\n\n      const uri =\n        media.control === undefined\n          ? this._sessionControlURL\n          : this._controlURL(media.control)\n\n      this._enqueue({\n        method: RTSP_METHOD.SETUP,\n        headers: {\n          Transport: `RTP/AVP/TCP;unicast;interleaved=${rtp}-${rtcp}`,\n        },\n        uri,\n      })\n\n      // TODO: see if we can get rid of this check somehow\n      if (this.clockrates === undefined) {\n        return\n      }\n      this.clockrates[rtp] = clockrate\n    })\n    if (this._state === STATE.PLAYING) {\n      this._enqueue({\n        method: RTSP_METHOD.PLAY,\n        headers: {\n          Range: `npt=${this.startTime || 0}-`,\n        },\n        uri: this._sessionControlURL,\n      })\n    }\n    this._dequeue()\n  }\n\n  /**\n   * Set up command queue in order to start playing, i.e. PLAY optionally\n   * preceeded by OPTIONS/DESCRIBE commands. If not waiting, immediately\n   * start sending.\n   * @param  startTime - Time (seconds) at which to start playing\n   */\n  play(startTime = 0) {\n    if (this._state === STATE.IDLE) {\n      this.startTime = Number(startTime) || 0\n      this._enqueue({ method: RTSP_METHOD.OPTIONS })\n      this._enqueue({ method: RTSP_METHOD.DESCRIBE })\n    } else if (this._state === STATE.PAUSED) {\n      if (this._sessionId === null || this._sessionId === undefined) {\n        throw new Error('rtsp: internal error')\n      }\n      this._enqueue({\n        method: RTSP_METHOD.PLAY,\n        headers: {\n          Session: this._sessionId,\n        },\n        uri: this._sessionControlURL,\n      })\n    }\n    this._state = STATE.PLAYING\n    this._dequeue()\n  }\n\n  /**\n   * Queue a pause command, and send if not waiting.\n   * @return {undefined}\n   */\n  pause() {\n    this._enqueue({ method: RTSP_METHOD.PAUSE })\n    this._state = STATE.PAUSED\n    this._dequeue()\n  }\n\n  /**\n   * End the session if there is one, otherwise just cancel\n   * any outstanding calls on the stack.\n   * @return {undefined}\n   */\n  stop() {\n    if (this._sessionId) {\n      this._enqueue({ method: RTSP_METHOD.TEARDOWN })\n    } else {\n      this._callStack = []\n    }\n    this._state = STATE.IDLE\n    if (this._renewSessionInterval !== null) {\n      clearInterval(this._renewSessionInterval)\n      this._renewSessionInterval = null\n    }\n    this._dequeue()\n  }\n\n  /**\n   * Pushes an RTSP request onto the outgoing stream.\n   * @param  cmd - The details about the command to send.\n   */\n  send(cmd: Command) {\n    const { method, headers, uri } = cmd\n    if (method === undefined) {\n      throw new Error('missing method when send request')\n    }\n    this._waiting = true\n    this.retry = this.send.bind(this, cmd)\n\n    if (\n      this._sequence === undefined ||\n      this.headers === undefined ||\n      this._callHistory === undefined\n    ) {\n      throw new Error('rtsp: internal error')\n    }\n    const message = Object.assign(\n      {\n        type: MessageType.RTSP,\n        uri: uri || this._sessionControlURL,\n        data: Buffer.alloc(0), // data is a mandatory field. Not used by session -> parser messages.\n      },\n      { method, headers },\n      {\n        headers: Object.assign(\n          { CSeq: this._sequence++ },\n          this.defaultHeaders, // default headers (for all methods)\n          this.headers[method], // preset headers for this method\n          headers // headers that came with the invokation\n        ),\n      }\n    )\n    this._sessionId && (message.headers.Session = this._sessionId)\n    this._callHistory.push(method)\n    if (!this._outgoingClosed) {\n      this.outgoing.push(message)\n    } else {\n      // If the socket is closed, dont attempt to send any data\n      debug('msl:rtsp:outgoing')(`Unable to send ${method}, connection closed`)\n    }\n  }\n\n  /**\n   * Push a command onto the call stack.\n   * @param  cmd - The command to queue\n   */\n  _enqueue(cmd: Command) {\n    if (this._callStack === undefined) {\n      throw new Error('rtsp: internal error')\n    }\n    this._callStack.push(cmd)\n  }\n\n  /**\n   * If possible, send the next command on the call stack.\n   */\n  _dequeue() {\n    if (this._callStack === undefined) {\n      throw new Error('rtsp: internal error')\n    }\n    if (!this._waiting && this._callStack.length > 0) {\n      const cmd = this._callStack.shift()\n      if (cmd !== undefined) {\n        this.send(cmd)\n      }\n    }\n  }\n}\n", "// NTP is offset from 01.01.1900\nconst NTP_UNIX_EPOCH_OFFSET = Date.UTC(1900, 0, 1)\n\n// Convenience types\nexport type seconds = number\nexport type milliSeconds = number\nexport type NtpSeconds = number\nexport type NtpMilliSeconds = number\n\n/**\n * Convert NTP time to milliseconds since January 1, 1970, 00:00:00 UTC (Unix Epoch)\n * @param ntpMost - Seconds since 01.01.1900\n * @param ntpLeast - Fractions since 01.01.1900\n */\nexport function getTime(ntpMost: number, ntpLeast: number): NtpMilliSeconds {\n  const ntpMilliSeconds = (ntpMost + ntpLeast / 0x100000000) * 1000\n  return NTP_UNIX_EPOCH_OFFSET + ntpMilliSeconds\n}\n", "import { Socket, connect } from 'node:net'\n\nimport { Readable, Writable } from 'stream'\n\nimport { Source } from '../component'\nimport { MessageType } from '../message'\n\nexport class TcpSource extends Source {\n  /**\n   * Create a TCP component.\n   * A TCP socket will be created from parsing the URL of the first outgoing message.\n   * @param host  Force RTSP host (overrides OPTIONS URL)\n   */\n  constructor(host?: string) {\n    let socket: Socket\n    /**\n     * Set up an incoming stream and attach it to the socket.\n     */\n    const incoming = new Readable({\n      objectMode: true,\n      read() {\n        //\n      },\n    })\n\n    /**\n     * Set up outgoing stream and attach it to the socket.\n     */\n    const outgoing = new Writable({\n      objectMode: true,\n      write(msg, encoding, callback) {\n        const b = msg.data\n\n        if (!socket) {\n          // Create socket on first outgoing message\n          /*\n          `OPTIONS rtsp://192.168.0.3:554/axis-media/media.amp?resolution=176x144&fps=1 RTSP/1.0\n          CSeq: 1\n          Date: Wed, 03 Jun 2015 14:26:16 GMT\n          `\n          */\n          let url: string\n          if (host === undefined) {\n            const firstSpace = b.indexOf(' ')\n            const secondSpace = b.indexOf(' ', (firstSpace as number) + 1)\n            url = b.slice(firstSpace, secondSpace).toString('ascii')\n          } else {\n            url = `rtsp://${host}`\n          }\n          const { hostname, port } = new URL(url)\n          socket = connect(\n            Number(port) || 554,\n            hostname === null ? undefined : hostname\n          )\n          socket.on('error', (e) => {\n            console.error('TCP socket error:', e)\n            socket.destroy()\n            incoming.push(null)\n          })\n\n          socket.on('data', (buffer) => {\n            if (!incoming.push({ data: buffer, type: MessageType.RAW })) {\n              console.warn(\n                'TCP Component internal error: not allowed to push more data'\n              )\n            }\n          })\n          // When closing a socket, indicate there is no more data to be sent,\n          // but leave the outgoing stream open to check if more requests are coming.\n          socket.on('end', () => {\n            console.warn('socket ended')\n            incoming.push(null)\n          })\n        }\n        try {\n          socket.write(msg.data, encoding, callback)\n        } catch (e) {\n          console.warn('message lost during send:', msg)\n        }\n      },\n    })\n\n    // When an error is sent on the incoming stream, close the socket.\n    incoming.on('error', (e) => {\n      console.log('closing TCP socket due to incoming error', e)\n      socket && socket.end()\n    })\n\n    // When there is no more data going to be sent, close!\n    incoming.on('finish', () => {\n      socket && socket.end()\n    })\n\n    // When an error happens on the outgoing stream, just warn.\n    outgoing.on('error', (e) => {\n      console.warn('error during TCP send, ignoring:', e)\n    })\n\n    // When there is no more data going to be written, close!\n    outgoing.on('finish', () => {\n      socket && socket.end()\n    })\n\n    /**\n     * initialize the component.\n     */\n    super(incoming, outgoing)\n  }\n}\n", "import { Readable, Writable } from 'stream'\n\nimport { Sink } from '../component'\nimport { MessageType } from '../message'\n\n/**\n * The socket used here is a ws socket returned by\n * a ws Server's 'connection' event.\n */\n\nexport class WSSink extends Sink {\n  constructor(socket: any) {\n    const outgoing = new Readable({\n      objectMode: true,\n      read: () => {\n        /** noop */\n      },\n    })\n\n    const incoming = new Writable({\n      objectMode: true,\n      write: (msg, encoding, callback) => {\n        try {\n          socket.send(msg.data)\n        } catch (e) {\n          console.warn('message lost during send:', msg)\n        }\n        callback()\n      },\n    })\n\n    socket.on('message', function (data: Buffer) {\n      outgoing.push({ data, type: MessageType.RAW })\n    })\n\n    socket.on('close', function () {\n      outgoing.push(null)\n    })\n    socket.on('error', (e: Error) => {\n      console.error('WebSocket error:', e)\n      socket.terminate()\n      outgoing.push(null)\n    })\n\n    // When an error is sent on the incoming stream, close the socket.\n    incoming.on('error', (e) => {\n      console.log('closing WebSocket due to incoming error', e)\n      socket && socket.close && socket.close()\n    })\n\n    // When there is no more data going to be sent, close!\n    incoming.on('finish', () => {\n      socket && socket.close && socket.close()\n    })\n\n    // When an error happens on the outgoing stream, just warn.\n    outgoing.on('error', (e) => {\n      console.warn('error during WebSocket send, ignoring:', e)\n    })\n\n    // When there is no more data going to be written, close!\n    outgoing.on('finish', () => {\n      socket && socket.close && socket.close()\n    })\n\n    /**\n     * initialize the component.\n     */\n    super(incoming, outgoing)\n  }\n}\n", "export * from './pipeline'\n\nexport * from './rtsp-mjpeg-pipeline'\nexport * from './rtsp-mp4-pipeline'\nexport * from './rtsp-pipeline'\n\nexport * from './cli-mjpeg-pipeline'\nexport * from './cli-mp4-pipeline'\nexport * from './tcp-ws-proxy-pipeline'\n", "import { Component, Sink, Source, Tube } from '../components/component'\n\n/**\n * Pipeline\n *\n * A pipeline is a linked list of components with some convenience methods to\n * handle inserting or removing components from the linked list.\n *\n * A internal set keeps track of which components the pipeline contains, while\n * any order is completely determined by the component's connectedness.\n */\nexport class Pipeline {\n  public firstComponent: Component\n  public lastComponent: Component\n\n  private _set: Set<Component>\n  /**\n   * @param components - The components of the pipeline in order.\n   */\n  constructor(...components: Component[]) {\n    const [car, ...cdr] = components\n\n    this._set = new Set(components)\n\n    this.firstComponent = car\n    this.lastComponent = cdr.reduce((last, component) => {\n      return last.connect(component as Tube | Sink)\n    }, car)\n  }\n\n  /**\n   * @param components - The components of the pipeline in order.\n   */\n  init(...components: Component[]) {\n    const [car, ...cdr] = components\n\n    this._set = new Set(components)\n\n    this.firstComponent = car\n    this.lastComponent = cdr.reduce((last, component) => {\n      return last.connect(component as Tube | Sink)\n    }, car)\n  }\n\n  /**\n   * Inserts a component into the pipeline.\n   *\n   * @param component - Tube or Source behind which to insert a new component.\n   * @param component - Tube or Sink to insert.\n   */\n  insertAfter(component: Source | Tube, newComponent: Tube | Sink) {\n    if (!this._set.has(component)) {\n      throw new Error('insertion point not part of pipeline')\n    }\n    if (this._set.has(newComponent)) {\n      throw new Error('new component already in the pipeline')\n    }\n\n    const cdr = component.next\n    if (cdr === null) {\n      component.connect(newComponent)\n      this.lastComponent = newComponent\n    } else {\n      component.disconnect()\n      component.connect(newComponent).connect(cdr)\n    }\n    this._set.add(newComponent)\n\n    return this\n  }\n\n  /**\n   * Inserts a component into the pipeline.\n   *\n   * @param component - Tube or Sink in front of which to insert a new component.\n   * @param component - Tube or Source to insert.\n   */\n  insertBefore(component: Tube | Sink, newComponent: Source | Tube) {\n    if (!this._set.has(component)) {\n      throw new Error('insertion point not part of pipeline')\n    }\n    if (this._set.has(newComponent)) {\n      throw new Error('new component already in the pipeline')\n    }\n\n    const car = component.prev\n    if (car === null) {\n      newComponent.connect(component)\n      this.firstComponent = newComponent\n    } else {\n      car.disconnect()\n      car.connect(newComponent as Tube).connect(component)\n    }\n    this._set.add(newComponent)\n\n    return this\n  }\n\n  /**\n   * Removes a component from the pipeline.\n   *\n   * @param component - Component to remove.\n   */\n  remove(component: Component) {\n    if (!this._set.has(component)) {\n      throw new Error('component not part of pipeline')\n    }\n\n    const car = component.prev\n    const cdr = component.next\n    if (car === null && cdr === null) {\n      throw new Error('cannot remove last component')\n    } else if (car === null && cdr !== null) {\n      component.disconnect()\n      this.firstComponent = cdr\n    } else if (car !== null && cdr === null) {\n      car.disconnect()\n      this.lastComponent = car\n    } else if (car !== null && cdr !== null) {\n      car.disconnect()\n      // FIXME: upgrade to Typescript 4.5.5\n      // infers component as \"never\" in this case.\n      // Try to revert this with newer TS versions.\n      const cmp = component as unknown as Component\n      cmp.disconnect()\n      car.connect(cdr)\n    }\n    this._set.delete(component)\n\n    return this\n  }\n\n  /**\n   * Inserts a component at the end of the pipeline.\n   *\n   * @param component - Tube or Sink to insert.\n   */\n  append(...components: Array<Tube | Sink>) {\n    components.forEach((component) => {\n      this.insertAfter(this.lastComponent as Source | Tube, component)\n    })\n\n    return this\n  }\n\n  /**\n   * Inserts a component at the beginning of the pipeline.\n   *\n   * @param component - Tube or Source to insert.\n   */\n  prepend(...components: Array<Source | Tube>) {\n    components.forEach((component) => {\n      this.insertBefore(this.firstComponent as Tube | Sink, component)\n    })\n\n    return this\n  }\n}\n", "import { RtspParser } from '../components/rtsp-parser'\nimport { RtspConfig, RtspSession } from '../components/rtsp-session'\nimport { Sdp } from '../utils/protocols/sdp'\n\nimport { Pipeline } from './pipeline'\n\n/**\n * RtspPipeline\n *\n * A pipeline that converts interleaved RTSP/RTP into a series of RTP, RTCP, and\n * RTSP packets.  The pipeline exposes the RTSP session component as\n * `this.session`, and wraps its play, pause and stop methods.\n *\n * The following handlers can be defined:\n * - onSdp: called when the session descript protocol is available, with the SDP\n *   object as argument\n * - onPlay: called when a response from the PLAY command arrives, with the play\n *   range as argument\n */\nexport class RtspPipeline extends Pipeline {\n  public onSdp?: (sdp: Sdp) => void\n  public onPlay?: (range: string[] | undefined) => void\n  public rtsp: RtspSession\n\n  constructor(rtspConfig?: RtspConfig) {\n    const rtspParser = new RtspParser()\n    const rtspSession = new RtspSession(rtspConfig)\n\n    rtspSession.onSdp = (sdp) => {\n      this.onSdp && this.onSdp(sdp)\n    }\n\n    rtspSession.onPlay = (range) => {\n      this.onPlay && this.onPlay(range)\n    }\n\n    super(rtspParser, rtspSession)\n\n    // Expose session for external use\n    this.rtsp = rtspSession\n  }\n}\n", "import { JPEGDepay } from '../components/jpegdepay'\nimport { RtspConfig } from '../components/rtsp-session'\n\nimport { RtspPipeline } from './rtsp-pipeline'\n\n/**\n * RtspMjpegPipeline\n *\n * A pipeline that can process JPEG RTP data, and converts it to streaming\n * motion JPEG format (sequence of JPEG images).\n *\n * The following handlers can be defined:\n * - all handlers from the RtspPipeline\n */\nexport class RtspMjpegPipeline extends RtspPipeline {\n  constructor(rtspConfig?: RtspConfig) {\n    super(rtspConfig)\n\n    const jpegDepay = new JPEGDepay()\n\n    this.append(jpegDepay)\n  }\n}\n", "import { AACDepay } from '../components/aacdepay'\nimport { H264Depay } from '../components/h264depay'\nimport { Mp4Muxer } from '../components/mp4muxer'\nimport { RtspConfig } from '../components/rtsp-session'\n\nimport { RtspPipeline } from './rtsp-pipeline'\n\n/**\n * RtspMp4Pipeline\n *\n * A pipeline that can process H264/AAC RTP data, and converts it to streaming\n * MP4 format (ISO BMFF bytestream).\n *\n * The following handlers can be defined:\n * - all handlers from the RtspPipeline\n * - `onSync`: called when the NTP time of the first frame is known, with the\n *   timestamp as argument (the timestamp is UNIX milliseconds)\n */\nexport class RtspMp4Pipeline extends RtspPipeline {\n  public onSync?: (ntpPresentationTime: number) => void\n\n  private readonly _mp4Muxer: Mp4Muxer\n\n  constructor(rtspConfig?: RtspConfig) {\n    super(rtspConfig)\n\n    const h264Depay = new H264Depay()\n    const aacDepay = new AACDepay()\n    const mp4Muxer = new Mp4Muxer()\n\n    mp4Muxer.onSync = (ntpPresentationTime) => {\n      this.onSync && this.onSync(ntpPresentationTime)\n    }\n\n    this.append(h264Depay, aacDepay, mp4Muxer)\n\n    this._mp4Muxer = mp4Muxer\n  }\n\n  get bitrate() {\n    return this._mp4Muxer.bitrate\n  }\n\n  get framerate() {\n    return this._mp4Muxer.framerate\n  }\n}\n", "import { Auth, AuthConfig } from '../components/auth'\nimport { Sink } from '../components/component'\nimport { MessageType } from '../components/message'\nimport { RtspConfig } from '../components/rtsp-session'\nimport { TcpSource } from '../components/tcp'\n\nimport { RtspMjpegPipeline } from './rtsp-mjpeg-pipeline'\n\ninterface RtspAuthConfig {\n  rtsp?: RtspConfig\n  auth?: AuthConfig\n}\n\n/**\n * CliMjpegPipeline\n *\n * A pipeline which connects to an RTSP server over TCP and can process JPEG\n * over RTP data producing a stream of JPEG images.\n */\nexport class CliMjpegPipeline extends RtspMjpegPipeline {\n  constructor(config: RtspAuthConfig) {\n    const { rtsp: rtspConfig, auth: authConfig } = config\n\n    super(rtspConfig)\n\n    const auth = new Auth(authConfig)\n    this.insertBefore(this.rtsp, auth)\n\n    const tcpSource = new TcpSource()\n\n    const dataSaver = process.stdout.isTTY\n      ? (msg: any) => console.log(msg.type, msg.data)\n      : (msg: any) =>\n          msg.type === MessageType.JPEG && process.stdout.write(msg.data)\n    const videoSink = Sink.fromHandler(dataSaver)\n\n    this.prepend(tcpSource)\n    this.append(videoSink)\n  }\n}\n", "import { Auth, AuthConfig } from '../components/auth'\nimport { Sink } from '../components/component'\nimport { MessageType } from '../components/message'\nimport { RtspConfig } from '../components/rtsp-session'\nimport { TcpSource } from '../components/tcp'\n\nimport { RtspMp4Pipeline } from './rtsp-mp4-pipeline'\n\ninterface RtspAuthConfig {\n  rtsp?: RtspConfig\n  auth?: AuthConfig\n}\n\n/**\n * CliMp4Pipeline\n *\n * A pipeline which connects to an RTSP server over TCP and process H.264/AAC\n * over RTP to produce a stream of MP4 data.\n */\nexport class CliMp4Pipeline extends RtspMp4Pipeline {\n  constructor(config: RtspAuthConfig) {\n    const { rtsp: rtspConfig, auth: authConfig } = config\n\n    super(rtspConfig)\n\n    const auth = new Auth(authConfig)\n    this.insertBefore(this.rtsp, auth)\n\n    const tcpSource = new TcpSource()\n\n    const dataSaver = process.stdout.isTTY\n      ? (msg: any) => console.log(msg.type, msg.data)\n      : (msg: any) =>\n          msg.type === MessageType.ISOM && process.stdout.write(msg.data)\n    const videoSink = Sink.fromHandler(dataSaver)\n\n    this.prepend(tcpSource)\n    this.append(videoSink)\n  }\n}\n", "import { ServerOptions, WebSocketServer } from 'ws'\n\nimport { TcpSource } from '../components/tcp'\nimport { WSSink } from '../components/ws-sink'\n\nimport { Pipeline } from './pipeline'\n\ninterface TcpWsConfig {\n  readonly wsOptions?: ServerOptions\n  readonly rtspHost?: string\n}\n\n/**\n * TcpWsProxyPipeline\n *\n * A (two-component) pipeline that listens for WebSocket connections and\n * connects them to another server over TCP. This can be used as a WebSocket\n * proxy for an RTSP server.\n */\nexport class TcpWsProxyPipeline extends Pipeline {\n  public wss: WebSocketServer\n\n  public constructor(config: TcpWsConfig = {}) {\n    const { wsOptions, rtspHost } = config\n    const wss = new WebSocketServer(wsOptions)\n    wss.on('connection', (socket) => {\n      const wsSink = new WSSink(socket)\n      const tcpSource = new TcpSource(rtspHost)\n\n      this.init(tcpSource, wsSink)\n    })\n\n    super()\n\n    // Expose WebSocket Server for external use\n    this.wss = wss\n  }\n}\n", "export { Clock } from './clock'\nexport * from './protocols'\nexport * from './retry'\nexport { Scheduler } from './scheduler'\n", "/**\n * Clock\n *\n * A simple timer to keep track of elapsed time,\n * which can be retrieved with the `now` method.\n * The clock is initially in a stopped state, during\n * which the elapsed time does not increase. When\n * started, the clock will return the total elapsed\n * time since the first start / last reset.\n *\n * As a convenience, start/stop are aliased as\n * play/pause, to mimic a media element (for use\n * as a playback clock). The `currentTime` getter\n * returns the elapsed time in seconds (floating\n * point), also as a convenienve to closely match\n * the behaviour of a video element.\n */\nexport class Clock {\n  private started: number\n  private stopped: boolean\n  private elapsed: number\n\n  constructor() {\n    this.elapsed = 0\n    this.started = 0\n    this.stopped = true\n  }\n\n  public start() {\n    if (this.stopped) {\n      this.started = window.performance.now()\n      this.stopped = false\n    }\n  }\n\n  public stop() {\n    if (!this.stopped) {\n      this.elapsed = this.now()\n      this.stopped = true\n    }\n  }\n\n  public reset() {\n    this.elapsed = 0\n    this.started = 0\n    this.stopped = true\n  }\n\n  // Gives the elapsed time in milliseconds since the\n  // clock was first started (after last reset).\n  public now() {\n    if (this.stopped) {\n      return this.elapsed\n    }\n    return this.elapsed + (window.performance.now() - this.started)\n  }\n\n  public play() {\n    this.start()\n  }\n\n  public pause() {\n    this.stop()\n  }\n\n  // Gives the elapsed time in seconds since last reset.\n  get currentTime() {\n    return this.now() / 1000\n  }\n}\n", "import { RtspSession } from '../components/rtsp-session'\n\n/**\n * Retry failed commands.\n *\n * This retries RTSP commands that fails up to a certain\n * limit of times.\n */\nexport const addRTSPRetry = (\n  rtspSession: RtspSession,\n  { maxRetries, errors } = { maxRetries: 20, errors: [503] }\n) => {\n  let retries = 0\n\n  const oldOnError = rtspSession.onError\n\n  rtspSession.onError = (err) => {\n    oldOnError?.(err)\n\n    if (!errors.includes(err.code)) {\n      return\n    }\n\n    // Stop retrying after 20 tries (~20 seconds)\n    if ((retries += 1) > maxRetries) {\n      console.log('retry, too many', retries, maxRetries)\n      return\n    }\n\n    // Retry\n    setTimeout(() => rtspSession.retry?.(), retries * 100)\n  }\n}\n", "export interface Clock {\n  readonly currentTime: number\n  readonly play: () => void\n  readonly pause: () => void\n}\n\n// The default tolerance for matching the handler\n// invocation to clock presentation time.\nconst DEFAULT_TOLERANCE = 10\n\n/**\n * A scheduler that can decide when to execute a certain\n * timestamped callback so that it happens in sync with a video\n * element.\n *\n * To use it:\n *\n * (1) Initialize a new Scheduler with a clock (to synchronize\n * against) and a callback (to be called when a message is in\n * sync with the video). The clock can be a HTMLVideoElement,\n * or anything that has a `currentTime` property which gives\n * the current presentation time in seconds, and a `pause` and\n * `play` method to control playback.\n *\n * (2) Call the `run` method every time a new message arrives\n * that you want to schedule (it needs to have an ntpTimestamp).\n * As soon at the presentation time is known, call the `init`\n * method and pass in that time, so that the scheduler can\n * start to schedule the callbacks. From then on, whenever\n * a message in the queue has a timestamp that matches the\n * current presentation time of the video, your callback will\n * fire.\n */\n\nexport class Scheduler<T extends { readonly ntpTimestamp?: number }> {\n  private readonly _clock: Clock\n  private readonly _handler: (msg: T) => void\n  private readonly _tolerance: number\n  private _nextRun: number\n  private _nextPlay: number\n  private _fifo: T[]\n  private _ntpPresentationTime: number\n  private _suspended: boolean\n\n  /**\n   * Creates an instance of Scheduler.\n   * @param clock - The clock to use (so we can control playback)\n   * @param handler - The callback to invoke when a message is in sync\n   * @param tolerance - The milliseconds defining \"in sync\" (default = 10)\n   */\n  constructor(\n    clock: Clock,\n    handler: (msg: T) => void,\n    tolerance = DEFAULT_TOLERANCE\n  ) {\n    this._clock = clock\n    this._handler = handler\n    this._tolerance = tolerance\n    this._nextRun = 0\n    this._nextPlay = 0\n    this._fifo = []\n    this._ntpPresentationTime = 0\n    this._suspended = false\n  }\n\n  /**\n   * Bring the scheduler back to it's initial state.\n   */\n  public reset() {\n    clearTimeout(this._nextRun)\n    clearTimeout(this._nextPlay)\n    this._fifo = []\n    this._ntpPresentationTime = 0\n    this._suspended = false\n  }\n\n  /**\n   * Initialize the scheduler.\n   *\n   * @param ntpPresentationTime - The offset representing the start of the presentation\n   */\n  public init(ntpPresentationTime: number) {\n    this._ntpPresentationTime = ntpPresentationTime\n  }\n\n  /**\n   * Suspend the scheduler.\n   *\n   * This releases control of the clock and stops any scheduling activity.\n   * Note that this doesn't mean the clock will be in a particular state\n   * (could be started or stopped), just that the scheduler will no longer\n   * control it.\n   */\n  public suspend() {\n    clearTimeout(this._nextPlay)\n    this._suspended = true\n  }\n\n  /**\n   * Resume the scheduler.\n   *\n   * This gives back control of the clock and the ability\n   * to schedule messages. The scheduler will immediately\n   * try to do that on resume.\n   */\n  public resume() {\n    this._suspended = false\n    this.run(undefined)\n  }\n\n  /**\n   * Run the scheduler.\n   *\n   * @param newMessage - New message to schedule.\n   */\n  public run(newMessage?: T) {\n    clearTimeout(this._nextRun)\n    // If there is no way to schedule anything, just return.\n    // The first schedule will happen for the first .run that\n    // is called after the presentation time has been initialized.\n    if (typeof this._ntpPresentationTime === 'undefined') {\n      return\n    }\n    // If there is a new message, add it to the FIFO queue\n    if (typeof newMessage !== 'undefined') {\n      this._fifo.push(newMessage)\n    }\n    // If the scheduler is suspended, we can only keep the\n    // messages and not do anything with them.\n    if (this._suspended) {\n      return\n    }\n    // If there are no messages, we don't need to bother or\n    // even re-schedule, because the new call to .run() will\n    // have to come from outside with a new message.\n    if (this._fifo.length === 0) {\n      return\n    }\n    // There is at least one message in the FIFO queue, either\n    // display it, or re-schedule the method for later execution\n    let timeToPresent = 0\n    let currentMessage: T\n    do {\n      const msg = this._fifo.shift()\n      if (msg === undefined) {\n        throw new Error('internal error: message should never be undefined')\n      }\n      currentMessage = msg\n      const ntpTimestamp = currentMessage.ntpTimestamp\n      if (ntpTimestamp === undefined) {\n        continue\n      }\n      const presentationTime = ntpTimestamp - this._ntpPresentationTime\n      timeToPresent = presentationTime - this._clock.currentTime * 1000\n      // If the message is within a tolerance of the presentation time\n      // then call the handler.\n      if (Math.abs(timeToPresent) < this._tolerance) {\n        this._handler && this._handler(currentMessage)\n      }\n    } while (timeToPresent < this._tolerance && this._fifo.length > 0)\n\n    if (timeToPresent < -this._tolerance) {\n      // We ran out of messages, delay the video with the same amount\n      // of delay as the last message had on the FIFO queue.\n      // Since we don't have any messages in the queue right now,\n      // the only way for anything to happen is if scheduler.run\n      // is called.\n      clearTimeout(this._nextPlay)\n      this._clock.pause()\n      this._nextPlay = window.setTimeout(\n        () => this._clock.play(),\n        -timeToPresent\n      )\n    } else if (timeToPresent > this._tolerance) {\n      // message is later than video, add it back to the queue and\n      // re-run the scheduling at a later point in time\n      this._fifo.unshift(currentMessage)\n      this._nextRun = window.setTimeout(\n        () => this.run(undefined),\n        timeToPresent\n      )\n    }\n  }\n}\n"],
  "mappings": "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AA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAChC;AAEO,SAAS,oBAAoB;AAClC,QAAM,gBAAgB;AAAA,IACpB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,gBAAgB,SAAS,eAAe;AAAA,MAC3C,KAAK,IAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,gBAAgB,SAAS,eAAe;AAAA,MAC3C,KAAK,IAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,gBAAgB,SAAS,eAAe;AAAA,MAC3C,KAAK,IAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,gBAAgB,SAAS,eAAe;AAAA,MAC3C,KAAK,IAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,GAAG,cAAc,IAAI,OAAO,IAAI;AAAA,IAChC,GAAG,cAAc,IAAI,OAAO,IAAI;AAAA,IAChC,GAAG,cAAc,IAAI,OAAO,IAAI;AAAA,IAChC,GAAG,cAAc,IAAI,OAAO,IAAI;AAAA,EAClC,CAAC;AACH;AAEO,SAAS,iBAAiB;AAC/B,SAAO,OAAO,KAAK;AAAA,IACjB;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,SAAS,cAAc,KAAa;AACzC,SAAO,OAAO,KAAK,CAAC,KAAM,KAAM,GAAM,GAAG,OAAO,GAAG,MAAM,GAAI,CAAC;AAChE;;;AChLO,SAAS,MAAM,KAAa,KAAa,KAAqB;AACnE,SAAO,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AAC7C;;;ACaA,IAAM,oBAAoB;AAAA,EACxB;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACxE;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACxE;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACxE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AACpC;AAEA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACxE;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACxE;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACxE;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAC1B;AAEO,SAAS,WAAW,GAAmB;AAC5C,QAAM,SAAS,MAAM,GAAG,GAAG,EAAE;AAC7B,QAAM,SAAS,OAAO,MAAM,GAAG;AAC/B,QAAM,IAAI,IAAI,KAAK,KAAK,MAAM,MAAO,MAAM,IAAI,MAAM,SAAS;AAE9D,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,KAAK,KAAK,OAAO,kBAAkB,CAAC,IAAI,IAAI,MAAM,GAAG;AAC3D,UAAM,KAAK,KAAK,OAAO,mBAAmB,CAAC,IAAI,IAAI,MAAM,GAAG;AAC5D,WAAO,WAAW,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC;AACtC,WAAO,WAAW,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE;AAAA,EAC7C;AACA,SAAO;AACT;;;ACKO,SAAS,iBAAiB,eAAe,GAAG,gBAAgB,GAAG;AACpE,QAAM,eAAe,gBAAgB;AACrC,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,cAAc,eAAe;AAEnC,SAAO,SAAS,UAAU,SAAmB;AAC3C,QAAI;AACJ,UAAM,YAAsB,CAAC;AAC7B,eAAW,UAAU,SAAS;AAC5B,UAAI,WAAW,QAAQ,MAAM;AAG7B,YAAM,eAAe,SAAS,UAAU,CAAC;AACzC,YAAM,iBACH,SAAS,UAAU,CAAC,KAAK,KACzB,SAAS,UAAU,CAAC,KAAK,IAC1B,SAAS,UAAU,CAAC;AACtB,YAAMC,QAAO,SAAS,UAAU,CAAC;AACjC,YAAM,IAAI,SAAS,UAAU,CAAC;AAC9B,YAAMC,SAAQ,SAAS,UAAU,CAAC,IAAI,KAAK;AAC3C,YAAMC,UAAS,SAAS,UAAU,CAAC,IAAI,KAAK;AAC5C,iBAAW,SAAS,MAAM,CAAC;AAG3B,UAAI,MAAM;AACV,UAAIF,SAAQ,MAAMA,SAAQ,KAAK;AAC7B,cAAM,SAAS,aAAa,CAAC;AAC7B,mBAAW,SAAS,MAAM,CAAC;AAAA,MAC7B;AAGA,UAAI,KAAK,OAAO,mBAAmB,GAAG;AAEpC,cAAMG,aAAY,SAAS,UAAU,CAAC;AACtC,cAAM,SAAS,SAAS,aAAa,CAAC;AACtC,cAAMC,UAAS,SAAS,MAAM,GAAG,IAAI,MAAM;AAC3C,mBAAW;AAAA,UACT;AAAA,UACA,MAAAJ;AAAA,UACA,OAAAC;AAAA,UACA,QAAAC;AAAA,UACA;AAAA,UACA,WAAAC;AAAA,UACA,QAAAC;AAAA,QACF;AACA,mBAAW,SAAS,MAAM,IAAI,MAAM;AAAA,MACtC,WACS,IAAI,OAAO,mBAAmB,GAAG;AACxC,cAAMD,aAAY;AAClB,cAAMC,UAAS,WAAW,CAAC;AAC3B,mBAAW;AAAA,UACT;AAAA,UACA,MAAAJ;AAAA,UACA,OAAAC;AAAA,UACA,QAAAC;AAAA,UACA;AAAA,UACA,WAAAC;AAAA,UACA,QAAAC;AAAA,QACF;AAAA,MACF;AAEA,gBAAU,KAAK,QAAQ;AAAA,IACzB;AAEA,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,EAAE,WAAW,QAAQ,MAAM,OAAO,OAAO,IAAI;AAEnD,UAAM,cAAc,gBAAgB,WAAW,MAAM;AAErD,UAAM,YACJ,SAAS,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,cAAc,SAAS,GAAG;AAEnE,UAAM,cAAc,gBAAgB,OAAO,QAAQ,IAAI;AAEvD,WAAO;AAAA,MACL,MAAM,EAAE,OAAO,OAAO;AAAA,MACtB,MAAM,OAAO,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AJ/HO,IAAM,YAAN,cAAwB,KAAK;AAAA,EAClC,cAAc;AACZ,QAAI;AACJ,QAAI,UAAoB,CAAC;AACzB,QAAI;AAKJ,UAAM,WAAW,IAAIC,WAAU;AAAA,MAC7B,YAAY;AAAA,MACZ,UAAU,KAAc,UAAU,UAAU;AAC1C,YAAI,IAAI,sBAA0B;AAChC,gBAAM,YAAY,IAAI,IAAI,MAAM,KAAK,CAAC,UAA+B;AACnE,mBACE,MAAM,SAAS,WACf,MAAM,WAAW,UACjB,MAAM,OAAO,iBAAiB;AAAA,UAElC,CAAC;AACD,cAAI,cAAc,UAAa,UAAU,WAAW,QAAW;AAC7D,8BAAkB,OAAO,UAAU,OAAO,WAAW;AACrD,kBAAM,YAAY,UAAU;AAO5B,gBAAI,cAAc,QAAW;AAC3B,oBAAM,CAAC,OAAO,MAAM,IAAI;AAExB,0BAAY,iBAAiB,OAAO,MAAM;AAAA,YAC5C,OAAO;AACL,0BAAY,iBAAiB;AAAA,YAC/B;AAAA,UACF;AAEA,mBAAS,QAAW,GAAG;AAAA,QACzB,WACE,IAAI,wBACJ,YAAY,IAAI,IAAI,MAAM,iBAC1B;AACA,kBAAQ,KAAK,IAAI,IAAI;AAKrB,cAAI,OAAO,IAAI,IAAI,KAAK,QAAQ,SAAS,GAAG;AAC1C,kBAAM,YAAY,UAAU,OAAO;AACnC,iBAAK,KAAK;AAAA,cACR,WAAW,UAAU,IAAI,IAAI;AAAA,cAC7B,cAAc,IAAI;AAAA,cAClB,aAAa,YAAY,IAAI,IAAI;AAAA,cACjC,MAAM,UAAU;AAAA,cAChB,WAAW,UAAU;AAAA,cACrB;AAAA,YACF,CAAC;AACD,sBAAU,CAAC;AAAA,UACb;AACA,mBAAS;AAAA,QACX,OAAO;AAEL,mBAAS,QAAW,GAAG;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,QAAQ;AAAA,EAChB;AACF;;;AKhFA,IAAAC,gBAAkB;AAElB,SAAS,aAAAC,kBAAiB;AAK1B,IAAM,oBAAoB;AAKnB,IAAM,aAAN,cAAyB,KAAK;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACS;AAAA,EACT;AAAA,EAER,YAAY,UAAU,mBAAmB;AACvC,UAAM,WAAW,IAAIC,WAAU;AAAA,MAC7B,YAAY;AAAA,MACZ,WAAW,CAAC,KAAc,WAAW,aAAa;AAEhD,YACE,KAAK,WACL,IAAI,yBACJ,IAAI,WAAW,QACf;AACA,eAAK,WAAW;AAAA,QAClB;AAGA,YAAI,KAAK,YAAY,IAAI,uBAA2B;AAClD,cACE,KAAK,gBACL,KAAK,QAAQ,aAAa,IAAI,KAAK,YACnC;AACA,gBAAI,KAAK,KAAK,KAAK,SAAS,KAAK,aAAa;AAC9C,iBAAK,iBAAiB,IAAI,KAAK;AAAA,UACjC,OAAO;AACL,iBAAK,KAAK;AAAA,UACZ;AAAA,QACF;AAEA,iBAAS,QAAW,GAAG;AAAA,MACzB;AAAA,IACF,CAAC;AAGD,aAAS,GAAG,UAAU,MAAM;AAC1B,WAAK,KAAK;AAAA,IACZ,CAAC;AAED,UAAM,QAAQ;AAEd,SAAK,UAAU,OAAO,YAAY,CAAC;AACnC,SAAK,cAAc;AACnB,SAAK,gBAAgB;AAErB,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,mBAAmB,MAAM;AAAA,IAE9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAoC;AACxC,QAAI,CAAC,KAAK,SAAS;AACjB,wBAAAC,SAAM,mBAAmB,EAAE,QAAQ;AAEnC,WAAK,mBAAmB;AAExB,WAAK,UAAU,OAAO,YAAY,KAAK,WAAW;AAClD,WAAK,gBAAgB;AAErB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACL,QAAI,KAAK,SAAS;AAChB,wBAAAA,SAAM,kBAAkB,EAAE,mBAAmB,KAAK,aAAa,EAAE;AAEjE,UAAI;AACF,aAAK,iBAAiB,KAAK,QAAQ,MAAM,GAAG,KAAK,aAAa,CAAC;AAAA,MACjE,SAAS,GAAG;AACV,gBAAQ,MAAM,CAAC;AAAA,MACjB;AAEA,WAAK,UAAU,OAAO,YAAY,CAAC;AACnC,WAAK,gBAAgB;AAErB,WAAK,UAAU;AACf,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AACF;;;AC7GA,IAAAC,gBAAkB;AAElB,SAAS,aAAAC,kBAAiB;;;ACU1B,IAAM,eAAe,KAAK,IAAI,GAAG,EAAE;AAEnC,IAAe,aAAf,MAA0B;AAAA,EACjB;AAAA,EACA;AAAA,EAIP,YAAY,MAAc;AACxB,SAAK,aAAa;AAAA,EACpB;AACF;AAEA,IAAM,QAAN,cAAoB,WAAW;AAAA,EAC7B,YAAY,OAAO,GAAG;AACpB,UAAM,IAAI;AAAA,EACZ;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,WAAO,KAAK,GAAG,QAAQ,SAAS,KAAK,UAAU;AAAA,EACjD;AAAA,EAEA,OAAO;AAAA,EAEP;AACF;AAEA,IAAM,YAAN,cAAwB,WAAW;AAAA,EAC1B;AAAA,EAEP,YAAY,GAAW;AACrB,UAAM,EAAE,MAAM;AACd,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,YAAY,KAAK,GAAG;AAC3C,aAAO,SAAS,CAAC,IAAI,KAAK,MAAM,WAAW,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,SAAK,QAAQ,OACV,MAAM,QAAQ,SAAS,KAAK,UAAU,EACtC,SAAS,OAAO;AAAA,EACrB;AACF;AAEA,IAAM,QAAN,cAAoB,WAAW;AAAA,EACtB;AAAA,EAEP,YAAY,SAAS,GAAG;AACtB,UAAM,CAAC;AACP,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,WAAO,WAAW,KAAK,OAAO,MAAM;AAAA,EACtC;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,SAAK,QAAQ,OAAO,UAAU,MAAM;AAAA,EACtC;AACF;AAEA,IAAM,aAAN,cAAyB,WAAW;AAAA,EAC3B;AAAA,EAEP,YAAY,OAAiB;AAC3B,UAAM,MAAM,MAAM;AAClB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAE,GAAG;AAC1C,aAAO,WAAW,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAE,GAAG;AAC1C,WAAK,MAAM,CAAC,IAAI,OAAO,UAAU,SAAS,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,IAAM,WAAN,cAAuB,WAAW;AAAA,EACzB;AAAA,EAEP,YAAY,SAAS,GAAG;AACtB,UAAM,CAAC;AACP,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,WAAO,cAAc,KAAK,OAAO,MAAM;AAAA,EACzC;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,SAAK,QAAQ,OAAO,aAAa,MAAM;AAAA,EACzC;AACF;AAEA,IAAM,WAAN,cAAuB,WAAW;AAAA,EACzB;AAAA,EAEP,YAAY,SAAS,GAAG;AACtB,UAAM,CAAC;AACP,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,WAAO,WAAY,KAAK,SAAS,KAAM,KAAM,MAAM;AACnD,WAAO,WAAY,KAAK,SAAS,IAAK,KAAM,SAAS,CAAC;AACtD,WAAO,WAAW,KAAK,QAAQ,KAAM,SAAS,CAAC;AAAA,EACjD;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,SAAK,QACF,OAAO,UAAU,MAAM,KAAM,KAAK,OAAO,UAAU,SAAS,CAAC,KAC7D,IAAI,OAAO,UAAU,SAAS,CAAC;AAAA,EACpC;AACF;AAEA,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAC9B;AAAA,EAEP,YAAY,OAAiB;AAC3B,UAAM,MAAM,SAAS,CAAC;AACtB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAE,GAAG;AAC1C,aAAO,cAAc,KAAK,MAAM,CAAC,GAAG,SAAS,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAE,GAAG;AAC1C,WAAK,MAAM,CAAC,IAAI,OAAO,aAAa,SAAS,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAEA,IAAM,WAAN,cAAuB,WAAW;AAAA,EACzB;AAAA,EAEP,YAAY,SAAS,GAAG;AACtB,UAAM,CAAC;AACP,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,WAAO,cAAc,KAAK,OAAO,MAAM;AAAA,EACzC;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,SAAK,QAAQ,OAAO,aAAa,MAAM;AAAA,EACzC;AACF;AAEA,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAC9B;AAAA,EAEP,YAAY,OAAiB;AAC3B,UAAM,MAAM,SAAS,CAAC;AACtB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAE,GAAG;AAC1C,aAAO,cAAc,KAAK,MAAM,CAAC,GAAG,SAAS,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAE,GAAG;AAC1C,WAAK,MAAM,CAAC,IAAI,OAAO,aAAa,SAAS,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAEA,IAAM,WAAN,cAAuB,WAAW;AAAA,EACzB;AAAA,EAEP,YAAY,SAAS,GAAG;AACtB,UAAM,CAAC;AACP,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,UAAM,OAAQ,KAAK,QAAQ,eAAgB;AAC3C,UAAM,MAAM,KAAK,QAAQ,OAAO;AAChC,WAAO,cAAc,MAAM,MAAM;AACjC,WAAO,cAAc,KAAK,SAAS,CAAC;AAAA,EACtC;AAAA,EAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,UAAM,OAAO,OAAO,aAAa,MAAM;AACvC,UAAM,MAAM,OAAO,aAAa,SAAS,CAAC;AAC1C,SAAK,QAAQ,OAAO,eAAe;AAAA,EACrC;AACF;AASA,IAAM,+BAA+B,SAAU,WAAW,GAAM;AAC9D,SAAO,MAAM,0BAA0B,WAAW;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKP,YAAY,OAAmB;AAC7B,YAAM,CAAC;AAEP,WAAK,QAAQ,MAAM;AAAA,QACjB,CAAC,WAAgB,cAAc;AAC7B,iBAAO,UAAU;AAAA,YACf,IAAI,SAAS,UAAU,MAAM;AAAA,YAC7B,IAAI,WAAW,SAAS;AAAA,UAC1B;AAAA,QACF;AAAA,QACA,CAAC,IAAI,MAAM,WAAW,MAAM,MAAM,CAAC;AAAA,MACrC;AACA,WAAK,aAAa,KAAK,MAAM;AAAA,QAC3B,CAAC,OAAO,YAAY,QAAQ,QAAQ;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAuB,CAAC,QAAQ,WAAW;AACzC,UAAI,IAAI;AACR,iBAAW,WAAW,KAAK,OAAO;AAChC,gBAAQ,KAAK,QAAQ,SAAS,CAAC;AAC/B,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA,IAEA,OAAuB,MAAM;AAAA,IAE7B;AAAA,EACF;AACF;AAyBA,IAAM,UAAsC;AAAA;AAAA,EAE1C,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,WAAW,MAAM;AAAA,MACjC,CAAC,iBAAiB,UAAU,CAAC;AAAA,MAC7B,CAAC,qBAAqB,WAAW,MAAM;AAAA;AAAA;AAAA,IAGzC;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,EACT;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,iBAAiB,UAAU,CAAC;AAAA,MAC7B,CAAC,qBAAqB,UAAU,CAAC;AAAA,MACjC,CAAC,aAAa,UAAU,GAAI;AAAA;AAAA,MAC5B,CAAC,YAAY,UAAU,UAAU;AAAA;AAAA,MACjC,CAAC,QAAQ,UAAU,KAAU;AAAA;AAAA,MAC7B,CAAC,UAAU,UAAU,GAAM;AAAA;AAAA,MAC3B,CAAC,YAAY,OAAO,EAAE;AAAA;AAAA,MAEtB;AAAA,QACE;AAAA,QACA;AAAA,QACA,CAAC,OAAY,GAAG,GAAG,GAAG,OAAY,GAAG,GAAG,GAAG,UAAU;AAAA,MACvD;AAAA,MACA,CAAC,eAAe,OAAO,EAAE;AAAA,MACzB,CAAC,iBAAiB,UAAU,UAAU;AAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,IAKd,QAAQ;AAAA,MACN,OAAO;AAAA;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,CAAC,iBAAiB,UAAU,CAAC;AAAA,MAC7B,CAAC,qBAAqB,UAAU,CAAC;AAAA,MACjC,CAAC,YAAY,UAAU,CAAC;AAAA;AAAA,MACxB,CAAC,YAAY,OAAO,CAAC;AAAA,MACrB,CAAC,YAAY,UAAU,CAAC;AAAA;AAAA,MACxB,CAAC,aAAa,OAAO,CAAC;AAAA,MACtB,CAAC,SAAS,UAAU,CAAC;AAAA;AAAA,MACrB,CAAC,mBAAmB,UAAU,CAAC;AAAA;AAAA,MAC/B,CAAC,UAAU,UAAU,GAAM;AAAA;AAAA,MAC3B,CAAC,aAAa,OAAO,CAAC;AAAA,MACtB;AAAA,QACE;AAAA,QACA;AAAA,QACA,CAAC,OAAY,GAAG,GAAG,GAAG,OAAY,GAAG,GAAG,GAAG,UAAU;AAAA,MACvD;AAAA,MACA,CAAC,SAAS,UAAU,CAAC;AAAA;AAAA,MACrB,CAAC,UAAU,UAAU,CAAC;AAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,iBAAiB,UAAU,CAAC;AAAA,MAC7B,CAAC,qBAAqB,UAAU,CAAC;AAAA,MACjC,CAAC,aAAa,UAAU,GAAI;AAAA;AAAA,MAC5B,CAAC,YAAY,UAAU,UAAU;AAAA;AAAA,MACjC,CAAC,YAAY,UAAU,CAAC;AAAA;AAAA,MACxB,CAAC,eAAe,UAAU,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,cAAc,UAAU,CAAC;AAAA,MAC1B,CAAC,gBAAgB,WAAW,MAAM;AAAA;AAAA,MAClC,CAAC,YAAY,OAAO,EAAE;AAAA,MACtB,CAAC,QAAQ,WAAW,gBAAgB;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,QAAQ;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,CAAC,gBAAgB,UAAU,CAAC;AAAA;AAAA,MAC5B,CAAC,WAAW,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA;AAAA;AAAA,MAGJ,CAAC,WAAW,UAAU,CAAM;AAAA,MAC5B,CAAC,YAAY,QAAQ;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA;AAAA,IAEJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA;AAAA;AAAA,IAGd,QAAQ;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA;AAAA,IAEN;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,IAI7B;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA;AAAA;AAAA,IAG7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,YAAY,OAAO,CAAC;AAAA,MACrB,CAAC,wBAAwB,UAAU,CAAC;AAAA,MACpC,CAAC,eAAe,UAAU,CAAC;AAAA,MAC3B,CAAC,aAAa,OAAO,CAAC;AAAA,MACtB,CAAC,gBAAgB,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,MACzC,CAAC,SAAS,UAAU,IAAI;AAAA,MACxB,CAAC,UAAU,UAAU,IAAI;AAAA,MACzB,CAAC,mBAAmB,UAAU,OAAU;AAAA,MACxC,CAAC,kBAAkB,UAAU,OAAU;AAAA,MACvC,CAAC,aAAa,UAAU,CAAC;AAAA,MACzB,CAAC,eAAe,UAAU,CAAC;AAAA,MAC3B,CAAC,kBAAkB,YAAY,OAAO,MAAM,EAAE,CAAC;AAAA,MAC/C,CAAC,SAAS,UAAU,EAAM;AAAA,MAC1B,CAAC,gBAAgB,UAAU,KAAM;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,wBAAwB,OAAO,CAAC;AAAA,MACjC,CAAC,wBAAwB,OAAO,EAAI;AAAA,MACpC,CAAC,yBAAyB,OAAO,CAAI;AAAA,MACrC,CAAC,sBAAsB,OAAO,EAAI;AAAA;AAAA,MAElC,CAAC,sBAAsB,OAAO,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUxC,CAAC,yBAAyB,6BAA6B,GAAI,GAAG,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOhE,CAAC,wBAAwB,6BAA6B,GAAG,CAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,YAAY,OAAO,CAAC;AAAA,MACrB,CAAC,wBAAwB,UAAU,CAAC;AAAA,MACpC,CAAC,aAAa,eAAe,CAAC,GAAG,CAAC,CAAC;AAAA,MACnC,CAAC,gBAAgB,UAAU,CAAC;AAAA,MAC5B,CAAC,cAAc,UAAU,EAAE;AAAA,MAC3B,CAAC,eAAe,UAAU,CAAC;AAAA,MAC3B,CAAC,aAAa,UAAU,CAAC;AAAA,MACzB,CAAC,cAAc,UAAU,CAAC;AAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoFA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,OAAO,CAAC;AAAA;AAAA;AAAA,MAGxB,CAAC,kBAAkB,OAAO,EAAE;AAAA,MAC5B,CAAC,SAAS,UAAU,CAAC;AAAA,MACrB,CAAC,0BAA0B,OAAO,CAAC;AAAA,MACnC,CAAC,yBAAyB,OAAO,CAAC;AAAA;AAAA;AAAA,MAGlC,CAAC,4BAA4B,OAAO,EAAE;AAAA,MACtC,CAAC,2BAA2B,OAAO,EAAI;AAAA,MACvC,CAAC,8BAA8B,OAAO,EAAI;AAAA,MAC1C,CAAC,gBAAgB,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,MACtC,CAAC,cAAc,UAAU,CAAC;AAAA,MAC1B,CAAC,cAAc,UAAU,CAAC;AAAA,MAC1B,CAAC,2BAA2B,OAAO,CAAC;AAAA,MACpC,CAAC,8BAA8B,OAAO,CAAC;AAAA,MACvC,CAAC,oBAAoB,UAAU,CAAC;AAAA,MAChC,CAAC,oBAAoB,OAAO,CAAC;AAAA,MAC7B,CAAC,uBAAuB,OAAO,CAAC;AAAA,MAChC,CAAC,2BAA2B,OAAO,CAAI;AAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA,MAC3B,CAAC,gBAAgB,UAAU,CAAC;AAAA;AAAA;AAAA,IAG9B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK7B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA;AAAA;AAAA,IAG7B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA;AAAA;AAAA,IAG7B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,eAAe,UAAU,CAAC;AAAA,MAC3B,CAAC,oBAAoB,UAAU,CAAC;AAAA,MAChC,CAAC,cAAc,UAAU,UAAU;AAAA,MACnC,CAAC,sBAAsB,UAAU,CAAC;AAAA,MAClC,CAAC,uBAAuB,UAAU,CAAC;AAAA,IACrC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,qBAAqB,UAAU,CAAC;AAAA;AAAA,IACnC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,YAAY,UAAU,CAAC;AAAA;AAAA,MACxB,CAAC,oCAAoC,UAAU,CAAC;AAAA,MAChD,CAAC,2BAA2B,UAAU,CAAC;AAAA,MACvC,CAAC,uBAAuB,UAAU,CAAC;AAAA,MACnC,CAAC,wBAAwB,UAAU,CAAC;AAAA,IACtC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,CAAC,mBAAmB,UAAU,CAAC;AAAA;AAAA,IACjC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASd,QAAQ;AAAA,MACN,OAAO;AAAA;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,CAAC,YAAY,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxB,CAAC,wBAAwB,UAAU,CAAC;AAAA,IACtC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA,IACd,QAAQ;AAAA,MACN,SAAS;AAAA;AAAA,IACX;AAAA,IACA,MAAM,CAAC,CAAC,uBAAuB,UAAU,CAAC,CAAC;AAAA,EAC7C;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,KAAK;AAAA,IACL,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQd,QAAQ;AAAA,MACN,OAAO;AAAA;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,CAAC,gBAAgB,UAAU,CAAC;AAAA;AAAA,MAC5B,CAAC,eAAe,UAAU,CAAC;AAAA,MAC3B,CAAC,sBAAsB,UAAU,CAAC;AAAA,MAClC,CAAC,mBAAmB,UAAU,CAAC;AAAA,MAC/B,CAAC,eAAe,UAAU,CAAC;AAAA;AAAA;AAAA,IAG7B;AAAA,EACF;AAAA;AAAA,EAEA,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,EACT;AAAA;AAAA,EAEA,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,cAAc;AAAA,IACd,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACF;AAQA,IAAM,SAAN,MAAa;AAAA,EACX,OAAO,OAAO;AACZ,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,OAAO,IAAI,MAAc;AACvB,WAAO;AAAA,MACL,CAAC,QAAQ,UAAU,CAAC;AAAA,MACpB,CAAC,QAAQ,WAAW,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,MAAc;AAC3B,WAAQ,CAAC,EAAU,OAAO,KAAK,IAAI,IAAI,GAAG;AAAA,MACxC,CAAC,WAAW,OAAO,CAAI;AAAA,MACvB,CAAC,SAAS,UAAU,CAAQ;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AAWO,IAAM,MAAN,cAAkB,WAAW;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBP,YAAY,MAAc,QAAiC;AACzD,UAAM,CAAC;AACP,SAAK,OAAO;AACZ,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAI,SAAS,QAAW;AACtB,YAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE;AAAA,IAC7C;AACA,SAAK,SAAS,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,MAAM;AACnD,UAAM,SAAS,OAAO,KAAK,GAAG,EAAE,KAAK,IAAI;AACzC,UAAM,OAAO,KAAK,QAAQ,CAAC;AAQ3B,SAAK,SAAS,oBAAI,IAAI;AACtB,QAAI,SAAS;AACb,eAAW,CAAC,KAAK,MAAM,YAAY,KAAM,CAAC,EAAU,OAAO,QAAQ,IAAI,GAAG;AACxE,UAAI,KAAK,IAAI,GAAG,GAAG;AACjB,cAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AACA,UAAI,QAAQ;AACZ,UAAI,KAAK,OAAO,GAAG,GAAG;AACpB,gBAAQ,KAAK,OAAO,GAAG;AAAA,MACzB;AACA,YAAM,UAAU,IAAI,KAAK,KAAK;AAC9B,WAAK,OAAO,IAAI,KAAK,EAAE,QAAQ,QAAQ,CAAC;AACxC,gBAAU,QAAQ;AAAA,IACpB;AAEA,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,KAAa;AACnB,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AACjC,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AACA,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAa,OAAY;AAC3B,SAAK,QAAQ,GAAG,EAAE,QAAQ;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAa;AACf,WAAO,KAAK,QAAQ,GAAG,EAAE;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAa;AAClB,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AACjC,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AACA,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAa;AACf,WAAO,KAAK,OAAO,IAAI,GAAG;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KAAa,SAA8B;AAC7C,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,SAAK,OAAO,IAAI,KAAK,EAAE,QAAQ,KAAK,YAAY,QAAQ,CAAC;AACzD,SAAK,cAAc,QAAQ;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACP,UAAM,SAAS,OAAO,YAAY,KAAK,UAAU;AACjD,SAAK,KAAK,MAAM;AAChB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,QAAgB,SAAS,GAAG;AAE/B,SAAK,IAAI,QAAQ,KAAK,UAAU;AAChC,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,YAAM,QAAQ,KAAK,QAAQ,SAAS,MAAM,MAAM;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,QAAgB,SAAS,GAAG;AAC/B,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,UAAI,MAAM,QAAQ,SAAS,QAAW;AACpC,cAAM,QAAQ,KAAK,QAAQ,SAAS,MAAM,MAAM;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAS,GAAG;AACjB,UAAM,QAAQ,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,MAAM,KAAK,UAAU,GAAG;AACzE,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,QAAQ;AACtC,YAAM,UAAU,MAAM;AACtB,UAAI,QAAQ,WAAW,QAAW;AAChC,cAAM,KAAK,QAAQ,OAAO,SAAS,CAAC,CAAC;AAAA,MACvC,OAAO;AACL,cAAM;AAAA,UACJ,GAAG,IAAI,OAAO,SAAS,CAAC,CAAC,GAAG,GAAG,MAAM,QAAQ,KAAK,KAChD,QAAQ,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAgB;AACpB,YAAQ,KAAK,KAAK,OAAO,MAAM,CAAC;AAAA,EAClC;AACF;AAQO,IAAM,YAAN,MAAM,mBAAkB,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOP,YAAY,MAAc,WAAoC,OAAc;AAC1E,UAAM,MAAM,MAAM;AAClB,SAAK,UAAU;AACf,SAAK,OAAO,GAAG,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,OAAc;AACtB,eAAW,OAAO,OAAO;AACvB,WAAK,IAAI,OAAO,KAAK,SAAS,IAAI,GAAG;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,MAAc;AAClB,UAAM,SAAuB,CAAC;AAC9B,WAAO,KAAK,aAAa,GAAG;AAC1B,YAAM,OAAO,IAAI,UAAU,MAAM;AACjC,WAAK,KAAK,MAAM,CAAC;AACjB,YAAM,UAAU,KAAK;AACrB,YAAM,OAAO,QAAQ,OAAO;AAC5B,UAAI;AACJ,UAAI,SAAS,QAAW;AACtB,YAAI,KAAK,cAAc;AACrB,gBAAM,IAAI,WAAU,OAAO;AAC3B,cAAI,KAAK,IAAI;AACb,gBAAM,YAAY,IAAI;AAAA,YACpB,KAAK,MAAM,IAAI,YAAY,IAAI,IAAI,MAAM,CAAC;AAAA,UAC5C;AACA,iBAAO,KAAK,GAAG,SAAS;AAAA,QAC1B,OAAO;AACL,gBAAM,IAAI,IAAI,OAAO;AACrB,cAAI,KAAK,IAAI;AAEb,cAAI,YAAY,QAAQ;AACtB,kBAAM,UAAU,IACb,QAAQ,sBAAsB,EAC9B,MAAM,SAAS,EAAE,EACjB,SAAS,GAAG,CAAC;AAChB,kBAAM,SAAS,IACZ,QAAQ,uBAAuB,EAC/B,MAAM,SAAS,EAAE,EACjB,SAAS,GAAG,CAAC;AAChB,kBAAM,QAAQ,IACX,QAAQ,oBAAoB,EAC5B,MAAM,SAAS,EAAE,EACjB,SAAS,GAAG,CAAC;AAChB,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,MAAM,QAAQ,OAAO,GAAG,MAAM,GAAG,KAAK;AAAA,YACxC,CAAC;AAAA,UACH,WAAW,YAAY,QAAQ;AAC7B,kBAAM,mBAAmB,IAAI,QAAQ,kBAAkB,EAAE;AACzD,kBAAM,uBAAwB,qBAAqB,KAAM;AACzD,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,MAAM,WAAW,oBAAoB;AAAA,YACvC,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,IAAI,IAAI,MAAM;AACpB,YAAI,KAAK,IAAI;AACb,YAAI,OAAO,IAAI,IAAI,MAAM;AAAA,MAC3B;AACA,WAAK,OAAO,GAAG;AACf,aAAO,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AACF;;;AC3yCA,IAAM,0BAAqD;AAAA,EACzD,GAAG;AAAA,EACH,GAAG;AACL;AAGA,IAAM,mBAA8C;AAAA,EAClD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,IAAM,uBAAkD;AAAA,EACtD,GAAG;AAAA,EACH,GAAG;AACL;AAQA,IAAM,kBAAkB,CAAC,qBAA0C;AACjE,QAAM,kBAAmB,qBAAqB,KAAM;AACpD,QAAM,iBAAkB,qBAAqB,IAAK;AAClD,QAAM,gBAAiB,qBAAqB,IAAK;AAEjD,QAAM,YACJ,wBAAwB,eAAe,KAAK,QAAQ,eAAe;AACrE,QAAM,eAAe,iBAAiB,cAAc,KAAK;AACzD,QAAM,WACJ,qBAAqB,aAAa,KAAK,cAAc,SAAS;AAEhE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,cAAc,CAAC,OAAiB,MAAc,YAAoB;AAyC7E,QAAM,UAAU,OAAO,MAAM,KAAK,WAAW,OAAO,KAAK;AACzD,QAAM,mBAAmB,SAAS,MAAM,KAAK,WAAW,QAAQ,EAAE;AAClE,QAAM,kBAAmB,qBAAqB,KAAM;AAEpD,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,IACA,MAAM;AAAA,MACJ,WAAW,OAAO,MAAM,OAAO,SAAS;AAAA,MACxC,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,UAAU;AAAA,IACZ;AAAA,IAEA,MAAM;AAAA,MACJ,cAAc;AAAA,MACd,MAAM;AAAA;AAAA,IACR;AAAA,IAEA,gBAAgB,IAAI,IAAI,MAAM;AAAA,IAC9B,gBAAgB,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,QACE,YAAa,MAAM,OAAO,aAAa,OAAQ;AAAA;AAAA,MACjD;AAAA,MACA,IAAI,IAAI,QAAQ;AAAA,QACd;AAAA;AAAA,QACA,YAAY;AAAA,QACZ,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,sBAAsB;AAAA;AAAA,IAGtB,MAAM,WAAW,eAAe;AAAA,IAChC,OAAO,gBAAgB,gBAAgB;AAAA,EACzC;AACF;;;AC7IO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAgB;AAC1B,SAAK,UAAU;AACf,SAAK,YAAY,IAAI,SAAS,KAAK,OAAO;AAC1C,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,QAAgB;AACxB,WAAO,KAAK,UAAU,SAAS,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,QAAgB;AACzB,WAAO,KAAK,UAAU,UAAU,MAAM;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,QAAgB;AACzB,WAAO,KAAK,UAAU,UAAU,MAAM;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW;AACT,UAAM,QAAQ,KAAK,UAAU,KAAK,OAAO;AACzC,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,QAAgB;AACvB,QAAI,SAAS,MAAM,WAAW,GAAG;AAC/B,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,KAAK,QAAQ,EAAE,GAAG;AAChC,UAAI,KAAK,YAAY,GAAG;AAEtB,aAAK,QAAQ,KAAK,SAAS;AAAA,MAC7B;AAGA,eAAU,UAAU,IAAO,KAAK,SAAU,IAAI,EAAE,KAAK,UAAY;AACjE,WAAK,WAAW;AAAA,IAClB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,wBAAwB;AACtB,QAAI,aAAa;AACjB,WAAO,KAAK,SAAS,CAAC,MAAM,GAAG;AAC7B;AAAA,IACF;AAEA,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,IAAI;AACpB,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAGA,QAAI,IAAI,KAAK,SAAS,UAAU;AAEhC,SAAK,KAAO;AAEZ,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,sBAAsB;AACpB,QAAI,IAAI,KAAK,sBAAsB;AACnC,QAAI,IAAI,GAAM;AACZ,UAAK,IAAI,KAAM;AAAA,IACjB,OAAO;AACL,UAAI,EAAE,KAAK;AAAA,IACb;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACL,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB;AACd,WAAO,IAAI,WAAW,KAAK,OAAO;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB;AACf,WAAO,KAAK;AAAA,EACd;AACF;;;AC3IO,IAAM,YAAN,MAAgB;AAAA,EACd;AAAA,EAEP,YAAY,QAAgB;AAC1B,SAAK,SAAS,IAAI,aAAa,MAAM;AAAA,EACvC;AAAA,EAEA,QAAQ;AAEN,SAAK,OAAO,SAAS;AACrB,UAAM,UAAU,KAAK,OAAO,SAAS;AAErC,SAAK,OAAO,SAAS;AACrB,UAAM,QAAQ,KAAK,OAAO,SAAS;AAGnC,SAAK,OAAO,sBAAsB;AAElC,QAAI,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,GAAG,EAAE,SAAS,OAAO,GAAG;AAC3D,YAAM,eAAe,KAAK,OAAO,sBAAsB;AACvD,UAAI,iBAAiB,GAAG;AAEtB,aAAK,OAAO,SAAS,CAAC;AAAA,MACxB;AAGA,WAAK,OAAO,sBAAsB;AAGlC,WAAK,OAAO,sBAAsB;AAGlC,WAAK,OAAO,SAAS,CAAC;AACtB,YAAM,mBAAmB,KAAK,OAAO,SAAS,CAAC;AAC/C,UAAI,kBAAkB;AACpB,iBAAS,IAAI,GAAG,KAAK,iBAAiB,IAAI,IAAI,KAAK,KAAK;AAEtD,eAAK,OAAO,SAAS,CAAC;AAAA,QAExB;AAAA,MACF;AAAA,IACF;AAGA,SAAK,OAAO,sBAAsB;AAClC,UAAM,kBAAkB,KAAK,OAAO,sBAAsB;AAC1D,QAAI,oBAAoB,GAAG;AAEzB,WAAK,OAAO,sBAAsB;AAAA,IACpC,WAAW,oBAAoB,GAAG;AAChC,UAAI,oBAAoB;AACxB,WAAK,OAAO,SAAS,CAAC;AACtB,WAAK,OAAO,oBAAoB;AAChC,WAAK,OAAO,oBAAoB;AAChC,0BAAoB,KAAK,OAAO,sBAAsB;AACtD,eAAS,IAAI,GAAG,IAAI,mBAAmB,KAAK;AAC1C,aAAK,OAAO,oBAAoB;AAAA,MAClC;AAAA,IACF;AAGA,SAAK,OAAO,sBAAsB;AAElC,SAAK,OAAO,SAAS,CAAC;AACtB,UAAM,sBAAsB,KAAK,OAAO,sBAAsB;AAC9D,UAAM,4BAA4B,KAAK,OAAO,sBAAsB;AACpE,UAAM,sBAAsB,KAAK,OAAO,SAAS,CAAC;AAElD,SAAK,OAAO,SAAS,CAAC;AACtB,UAAM,oBAAoB,KAAK,OAAO,SAAS,CAAC;AAEhD,UAAM,sBAAsB,oBACxB,KAAK,OAAO,sBAAsB,IAClC;AACJ,UAAM,uBAAuB,oBACzB,KAAK,OAAO,sBAAsB,IAClC;AACJ,UAAM,qBAAqB,oBACvB,KAAK,OAAO,sBAAsB,IAClC;AACJ,UAAM,wBAAwB,oBAC1B,KAAK,OAAO,sBAAsB,IAClC;AAEJ,UAAM,KACH,sBAAsB,KAAK,KAC5B,sBAAsB,IACtB,uBAAuB;AACzB,UAAM,KACH,IAAI,wBAAwB,4BAA4B,KAAK,KAC9D,qBAAqB,IACrB,wBAAwB;AAE1B,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACtGO,SAAS,WAAW,MAAc;AACvC,SAAO,OAAO,MAAM,OAAO,KACvB,OAAO,KACP,OAAO,MAAM,OAAO,MAClB,OAAO,KACP,OAAO,MAAM,OAAO,KAClB,OAAO,IACP,SAAS,KACP,KACA,SAAS,KACP,KACA;AACd;AAGO,SAAS,eAAe,SAAiB,aAAqB;AACnE,QAAM,UAAU,QAAQ,QAAQ,mBAAmB,EAAE;AACrD,QAAM,SAAS,QAAQ;AACvB,QAAM,UAAU,cACZ,KAAK,MAAO,SAAS,IAAI,KAAM,KAAK,WAAW,IAAI,cAClD,SAAS,IAAI,KAAM;AACxB,QAAM,UAAU,IAAI,WAAW,OAAO;AAEtC,MAAI;AACJ,MAAI;AACJ,MAAI,UAAU;AACd,MAAI,UAAU;AACd,WAAS,SAAS,GAAG,SAAS,QAAQ,UAAU;AAC9C,YAAQ,SAAS;AACjB,eAAW,WAAW,QAAQ,WAAW,MAAM,CAAC,KAAM,KAAK,IAAI;AAC/D,QAAI,UAAU,KAAK,SAAS,WAAW,GAAG;AACxC,WAAK,QAAQ,GAAG,QAAQ,KAAK,UAAU,SAAS,SAAS,WAAW;AAClE,gBAAQ,OAAO,IAAK,aAAc,OAAO,QAAS,MAAO;AAAA,MAC3D;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;;;ACjCA,IAAM,gBAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AACP;AAEA,IAAM,mBAAmB,CAAC,mBAA2B;AACnD,QAAM,cAAc,SAAS,eAAe,OAAO,GAAG,CAAC,GAAG,EAAE;AAC5D,QAAM,YAAY,SAAS,eAAe,OAAO,GAAG,CAAC,GAAG,EAAE;AAE1D,QAAM,UAAU,cAAc,WAAW,KAAK,YAAY,SAAS;AACnE,QAAM,SAAS,YAAY,IAAI,QAAQ,CAAC;AAExC,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAC1B,OACA,MACA,YACG;AAqCH,QAAM,iBAAiB,MAAM,KAAK,WAAW,kBAAkB;AAC/D,QAAM,gBAAgB,MAAM,KAAK,WAAW,sBAAsB,EAC/D,MAAM,GAAG,EACT,IAAI,cAAc;AAGrB,QAAM,MAAM,cAAc,MAAM,GAAG,CAAC;AAEpC,QAAM,MAAM,cAAc,MAAM,CAAC;AAEjC,QAAM,YAAY,IAAI,UAAU,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM;AAGrD,QAAM,0BAA0B;AAChC,SAAO;AAAA,IACL,gBAAgB,IAAI,IAAI,MAAM;AAAA,IAC9B,gBAAgB,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,QACE,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,MACpB;AAAA,MACA,IAAI,IAAI,QAAQ;AAAA,QACd,sBAAsB,IAAI,CAAC,EAAE,CAAC;AAAA,QAC9B,uBAAuB,IAAI,CAAC,EAAE,CAAC;AAAA,QAC/B,oBAAoB,IAAI,CAAC,EAAE,CAAC;AAAA,QAC5B,uBAAuB;AAAA,QACvB,sBAAsB;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACA,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,OAAO,UAAU,SAAS;AAAA,MAC1B,QAAQ,UAAU,UAAU;AAAA,MAC5B,QAAQ;AAAA,IACV;AAAA,IACA,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,MACJ,WAAW,MAAM,OAAO;AAAA,MACxB,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,UAAU;AAAA,IACZ;AAAA;AAAA,IAGA,sBACE,MAAM,cAAc,UAAa,MAAM,YAAY,IAC/C,OAAO,MAAM,OAAO,SAAS,IAAI,OAAO,MAAM,SAAS,KACvD,0BACA;AAAA;AAAA,IAEN,MAAM,QAAQ,cAAc;AAAA,IAC5B,OAAO,iBAAiB,cAAc;AAAA,EACxC;AACF;;;AC/GA,IAAM,iBAMF;AAAA,EACF,iBAAiB;AAAA,EACjB,MAAM;AACR;AAcA,IAAM,kBAAkB,MAAiB;AACvC,SAAO;AAAA,IACL,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,EACpB;AACF;AAOA,IAAM,iBAAiB,CACrB,WACA,EAAE,YAAY,SAAS,MACpB;AACH,YAAU,wBAAwB;AAClC,YAAU,sBAAsB;AAChC,YAAU;AAKV,MAAI,UAAU,sBAAsB,UAAU,WAAW;AACvD,UAAM,OAAO,IAAI,UAAU;AAC3B,UAAM,SAAS,UAAU;AACzB,UAAM,UAAU,UAAU,qBAAqB,UAAU;AACzD,cAAU,UAAU,OAAO;AAC3B,cAAU,YAAY,SAAS;AAC/B,cAAU,uBAAuB;AACjC,cAAU,qBAAqB;AAC/B,cAAU,mBAAmB;AAAA,EAC/B;AACF;AAOO,IAAM,aAAN,MAAiB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,cAAc;AACZ,SAAK,aAAa,CAAC;AACnB,SAAK,iBAAiB;AACtB,SAAK,sBAAsB;AAC3B,SAAK,YAAY,CAAC;AAAA,EACpB;AAAA,EAEA,KAAK,UAAe;AAClB,UAAM,OAAO,IAAI,UAAU,MAAM;AACjC,UAAM,OAAO,IAAI,UAAU,MAAM;AACjC,UAAM,OAAO,IAAI,UAAU,MAAM;AACjC,UAAM,OAAO,IAAI,UAAU,MAAM;AACjC,UAAM,OAAO,IAAI,UAAU,MAAM;AACjC,UAAM,OAAO,IAAI,UAAU,MAAM;AAEjC,SAAK,IAAI,eAAe,CAAC;AAEzB,SAAK;AAAA,MACH,IAAI,IAAI,QAAQ,SAAS,IAAI;AAAA,MAC7B,KAAK;AAAA,QACH,IAAI,IAAI,QAAQ,SAAS,IAAI;AAAA,QAC7B,IAAI,IAAI,QAAQ,SAAS,IAAI;AAAA,QAC7B,KAAK;AAAA,UACH,SAAS;AAAA;AAAA,UACT,KAAK,OAAO,KAAK,OAAO,IAAI,IAAI,MAAM,CAAC,CAAC;AAAA,UACxC,KAAK;AAAA,YACH,IAAI,UAAU,QAAQ,QAAW,SAAS,cAAc;AAAA,YACxD,IAAI,IAAI,MAAM;AAAA,YACd,IAAI,IAAI,MAAM;AAAA,YACd,IAAI,IAAI,MAAM;AAAA,YACd,IAAI,IAAI,MAAM;AAAA,YACd,IAAI,IAAI,MAAM;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,KAAU,MAAW;AACxB,UAAM,OAAO,IAAI,UAAU,MAAM;AACjC,SAAK;AAAA,MACH,IAAI,IAAI,QAAQ;AAAA,QACd,eAAe;AAAA,QACf,mBAAmB;AAAA,QACnB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,IAAI,UAAU,MAAM;AAMjC,SAAK,aAAa,CAAC;AACnB,SAAK,iBAAiB;AACtB,SAAK,sBAAsB;AAE3B,QAAI,UAAU;AACd,SAAK,YAAY,CAAC;AAElB,QAAI,MAAM,QAAQ,CAAC,UAAU;AAC3B,UAAI,MAAM,WAAW,QAAW;AAC9B;AAAA,MACF;AAEA,YAAMC,eAAc,MAAM,OAAO;AACjC,YAAM,WAAW,MAAM,OAAO;AAE9B,UAAI,eAAe,QAAQ,MAAM,QAAW;AAG1C,aAAK,WAAWA,YAAW,IAAI,EAAE;AAGjC,YAAI,MAAM,KAAK,YAAY,MAAM,SAAS;AACxC,eAAK,eAAe;AAAA,QACtB;AAIA,cAAM,WAAW,eAAe,QAAQ,EAAE,OAAO,MAAM,OAAO;AAC9D,cAAM,OAAO,SAAS;AACtB,cAAM,QAAQ,SAAS;AAEvB,cAAM,YAAY,gBAAgB;AAClC,kBAAU,YAAY,MAAM,OAAO;AAEnC,kBAAU,uBAAuB,SAAS;AAE1C,aAAK,UAAU,KAAK,SAAS;AAE7B,cAAM,OAAO,KAAK,KAAK,QAAQ;AAC/B,aAAK,OAAO,IAAI;AAChB,aAAK,OAAO,IAAI,IAAI,QAAQ,EAAE,UAAU,QAAQ,CAAC,CAAC;AAAA,MACpD;AAAA,IACF,CAAC;AAED,SAAK,OAAO,IAAI;AAEhB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAK,UAAwB;AAC3B,UAAM,EAAE,SAAS,WAAAC,YAAW,WAAW,IAAI;AAC3C,UAAM,cAAc,UAAU;AAE9B,UAAM,YAAY,KAAK,UAAU,WAAW;AAO5C,UAAM,WACJ,UAAU,kBAAkB,IACxB,KAAK,IAAI,GAAIA,aAAY,UAAU,gBAAiB,CAAC,IACrD,UAAU;AAEhB,cAAU,gBAAgBA;AAE1B,UAAM,OAAO,IAAI,UAAU,MAAM;AACjC,UAAM,OAAO,IAAI,UAAU,MAAM;AAEjC,UAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,MAC3B,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,oBAAoB;AAAA,IACtB,CAAC;AAED,SAAK;AAAA,MACH,IAAI,IAAI,QAAQ,EAAE,iBAAiB,KAAK,iBAAiB,CAAC;AAAA,MAC1D,KAAK;AAAA,QACH,IAAI,IAAI,QAAQ,EAAE,UAAU,QAAQ,CAAC;AAAA,QACrC,IAAI,IAAI,QAAQ,EAAE,qBAAqB,UAAU,oBAAoB,CAAC;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAEA,cAAU,uBAAuB;AAGjC,SAAK,IAAI,eAAe,KAAK,aAAa,CAAC;AAE3C,mBAAe,WAAW,EAAE,YAAY,SAAS,CAAC;AAElD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,MAAc;AACjB,UAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,QAAI,IAAI,QAAQ,IAAI;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,oBAAoB,SAAiB,cAAuB;AAI1D,QACE,CAAC,KAAK,uBACN,gBACA,YAAY,KAAK,cACjB;AACA,YAAM,cAAc,UAAU;AAC9B,YAAM,YAAY,KAAK,UAAU,WAAW;AAC5C,WAAK,sBACH,eACA,OAAQ,UAAU,sBAAsB,UAAU;AAAA,IACtD;AAAA,EACF;AACF;;;AP7QO,IAAM,WAAN,cAAuB,KAAK;AAAA,EAC1B;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKP,cAAc;AACZ,UAAM,aAAa,IAAI,WAAW;AAClC,UAAM,SAAS,CAAC,wBAAgC;AAC9C,WAAK,UAAU,KAAK,OAAO,mBAAmB;AAAA,IAChD;AACA,UAAM,WAAW,IAAIC,WAAU;AAAA,MAC7B,YAAY;AAAA,MACZ,UAAU,KAAc,UAAU,UAAU;AAC1C,YAAI,IAAI,sBAA0B;AAOhC,gBAAM,MAAM,KAAK,OAAM,oBAAI,KAAK,GAAE,QAAQ,IAAI,MAAO,SAAU;AAC/D,gBAAM,OAAO,IAAI,IAAI,MAAM;AAC3B,gBAAM,OAAO,WAAW,KAAK,IAAI,KAAK,GAAG;AAEzC,gBAAM,OAAO,OAAO,YAAY,KAAK,aAAa,KAAK,UAAU;AACjE,eAAK,KAAK,MAAM,CAAC;AACjB,eAAK,KAAK,MAAM,KAAK,UAAU;AAE/B,4BAAAC,SAAM,cAAc,EAAE,SAAS,KAAK,OAAO,CAAC,EAAE;AAC9C,4BAAAA,SAAM,cAAc,EAAE,SAAS,KAAK,OAAO,CAAC,EAAE;AAI9C,gBAAM,SAAS,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU;AAC1C,mBAAO;AAAA,cACL,MAAM,MAAM;AAAA,cACZ,UAAU,MAAM,UAAU,MAAM,OAAO;AAAA,cACvC,MAAM,MAAM;AAAA,cACZ,OAAO,MAAM;AAAA,YACf;AAAA,UACF,CAAC;AAED,eAAK,KAAK,EAAE,oBAAwB,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QAChE,WACE,IAAI,+BACJ,IAAI,uBACJ;AAMA,gBAAM,EAAE,aAAAC,cAAa,WAAAC,YAAW,aAAa,IAAI;AACjD,gBAAM,UAAU,WAAW,WAAWD,YAAW;AAEjD,cAAI,SAAS;AACX,gBAAI,CAAC,WAAW,qBAAqB;AACnC,yBAAW,oBAAoB,SAAS,YAAY;AACpD,kBAAI,WAAW,qBAAqB;AAClC,uBAAO,WAAW,mBAAmB;AAAA,cACvC;AAAA,YACF;AAEA,gBAAI;AACJ,kBAAM,aACJ,IAAI,wBACA,IAAI,kCACJ;AACN,gBACE,WAAW,uBACX,cACA,IAAI,iBAAiB,QACrB;AACA,gCACG,IAAI,eAAe,WAAW,uBAAuB;AAAA,YAC1D;AAEA,kBAAM,aAAa,IAAI,KAAK;AAC5B,kBAAM,OAAO,WAAW,KAAK,EAAE,SAAS,WAAAC,YAAW,WAAW,CAAC;AAC/D,kBAAM,OAAO,WAAW,KAAK,IAAI,IAAI;AAErC,kBAAM,OAAO,OAAO,YAAY,KAAK,aAAa,KAAK,UAAU;AACjE,iBAAK,KAAK,MAAM,CAAC;AACjB,iBAAK,KAAK,MAAM,KAAK,UAAU;AAE/B,iBAAK,KAAK;AAAA,cACR;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AAEL,eAAK,KAAK,GAAG;AAAA,QACf;AACA,iBAAS;AAAA,MACX;AAAA,IACF,CAAC;AAED,UAAM,QAAQ;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,IAAI,UAAU;AACZ,WACE,KAAK,WAAW,aAChB,KAAK,WAAW,UAAU,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,EAExD;AAAA,EAEA,IAAI,YAAY;AACd,WACE,KAAK,WAAW,aAChB,KAAK,WAAW,UAAU,IAAI,CAAC,SAAS,KAAK,SAAS;AAAA,EAE1D;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;;;AQ5IA,SAAS,aAAAC,kBAAiB;AAWnB,IAAM,aAAN,cAAyB,KAAK;AAAA,EACnC,cAAc;AACZ,QAAI;AACJ,QAAI,UAAoB,CAAC;AAEzB,UAAM,WAAW,IAAIC,WAAU;AAAA,MAC7B,YAAY;AAAA,MACZ,UAAU,KAAc,UAAU,UAAU;AAC1C,YAAI,IAAI,sBAA0B;AAChC,cAAI;AACJ,qBAAW,SAAS,IAAI,IAAI,OAAO;AACjC,gBACE,MAAM,SAAS,iBACf,MAAM,UACN,MAAM,OAAO,iBAAiB,sBAC9B;AACA,2BAAa;AAAA,YACf;AAAA,UACF;AACA,cAAI,cAAc,WAAW,QAAQ;AACnC,6BAAiB,OAAO,WAAW,OAAO,WAAW;AAAA,UACvD;AACA,mBAAS,QAAW,GAAG;AAAA,QACzB,WACE,IAAI,wBACJ,YAAY,IAAI,IAAI,MAAM,gBAC1B;AAEA,kBAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC;AAK9B,cAAI,OAAO,IAAI,IAAI,KAAK,QAAQ,SAAS,GAAG;AAC1C,kBAAM,SAAqB;AAAA,cACzB,WAAW,UAAU,IAAI,IAAI;AAAA,cAC7B,cAAc,IAAI;AAAA,cAClB,aAAa,YAAY,IAAI,IAAI;AAAA,cACjC,MAAM,OAAO,OAAO,OAAO;AAAA,cAC3B;AAAA,YACF;AACA,qBAAS,QAAW,MAAM;AAC1B,sBAAU,CAAC;AACX;AAAA,UACF;AACA,mBAAS;AAAA,QACX,OAAO;AAEL,mBAAS,QAAW,GAAG;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,QAAQ;AAAA,EAChB;AACF;;;ACnEA,SAAS,yBAAyB;AAClC,SAAS,YAAY;AAWd,IAAM,WAAN,MAAM,kBAAiB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjC,YAAY,YAAmC;AAC7C,UAAM,WAAW,cAAc,SAAS,YAAY,UAAU;AAC9D,UAAM,WAAW,cAAc,SAAS,YAAY,UAAU;AAE9D,UAAM,cAAc,EAAE,UAAU,SAAS;AAEzC,UAAM,kBAAkB,CAAC;AACzB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,sBAAgB;AAAA,QACd,IAAI;AAAA,UAAc,CAAC,YACjB,MAAM,GAAG,UAAU,MAAM;AACvB,kBAAMC,aAAY,KAAK,IAAI;AAC3B,kBAAM,UAAU;AAChB,kBAAM,OAAO;AACb,uBAAW;AAAA,cACT,KAAK,UAAU,EAAE,MAAM,WAAAA,YAAW,QAAQ,GAAG,MAAM,CAAC;AAAA,YACtD;AACA,uBAAW,MAAM,KAAK;AACtB,oBAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,eAAW,MAAM,KAAK;AAGtB,YAAQ,IAAI,eAAe,EACxB,KAAK,MAAM;AACV,iBAAW,MAAM,KAAK,UAAU,IAAI,CAAC;AACrC,iBAAW,MAAM,OAAO;AAAA,IAC1B,CAAC,EACA,MAAM,MAAM;AAAA,IAEb,CAAC;AAEH,UAAM,UAAU,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAO,WAAW,aAAa;AACpC,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,aAAa,kBAAkB,KAAK,KAAK,QAAQ,CAAC;AAExD,WAAO,IAAI,UAAS,UAAU;AAAA,EAChC;AACF;;;ACnEA,SAAS,oBAAoB;AAC7B,SAAS,QAAAC,aAAY;AAErB,SAAS,YAAAC,WAAU,YAAAC,iBAAgB;;;ACE5B,IAAM,QAAQ,OAAO,OAAe;AACzC,SAAO,MAAM,IAAI,QAAQ,CAAC,YAAY;AACpC,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;;;ADAO,IAAM,WAAN,MAAM,kBAAiB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnC,YAAY,cAAwB;AAClC,QAAI,WAAW;AAEf,UAAM,WAAW,IAAIC,UAAS;AAAA,MAC5B,YAAY;AAAA,MACZ,OAAO;AAAA,MAEP;AAAA,IACF,CAAC;AAKD,UAAM,QAAQ,YAAY;AACxB,UAAI,SAAS,aAAa,KAAK;AAE/B,aAAO,UAAU,OAAO,SAAS,YAAY;AAC3C,cAAM,MAAM,OAAO,KAAK;AACxB,iBAAS,KAAK,OAAO,GAAG;AACxB,iBAAS,aAAa,KAAK;AAAA,MAC7B;AACA,UAAI,UAAU;AACZ,iBAAS,KAAK,IAAI;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,WAAW,IAAIC,UAAS;AAAA,MAC5B,YAAY;AAAA,MACZ,MAAM,KAAK,UAAU,UAAU;AAC7B,cAAM,EAAE,MAAM,MAAM;AAAA,QAEpB,CAAC;AACD,iBAAS;AAAA,MACX;AAAA,IACF,CAAC;AAED,aAAS,GAAG,UAAU,MAAM;AAC1B,iBAAW;AAAA,IACb,CAAC;AAED,aAAS,GAAG,QAAQ,YAAY,MAAM,MAAM,CAAC;AAE7C,UAAM,UAAU,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAS,WAAW,aAAa;AACtC,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,OAAO,aAAaC,MAAK,KAAK,QAAQ,CAAC;AAC7C,UAAM,UAAU,KAAK,MAAM,KAAK,SAAS,CAAC;AAC1C,UAAM,eAAe,cAAc,SAAS,OAAO;AAEnD,WAAO,IAAI,UAAS,YAAY;AAAA,EAClC;AACF;;;AE7EA,SAAS,aAAAC,kBAAiB;;;ACA1B,IAAAC,gBAAkB;AAIlB,IAAM,mBAAmB;AAElB,IAAM,UAAU,CAAC,QAA6B;AACnD,MAAI,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK;AAC3B,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,QAAM,WAAW,IAAI,YAAY;AACjC,QAAM,UAAU,IAAI,WAAW,CAAC;AAEhC,QAAM,gBAAgB;AAAA,IACpB,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,QAAQ;AAAA,IACpC,OAAO,QAAQ,OAAO,EACnB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK,EAAE,EACxC,KAAK,MAAM;AAAA,IACd;AAAA,EACF,EAAE,KAAK,MAAM;AACb,oBAAAC,SAAM,mBAAmB,EAAE,aAAa;AAExC,SAAO,OAAO,KAAK,aAAa;AAClC;;;ACRO,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gCAAA,QAAK,OAAL;AACA,EAAAA,gCAAA,QAAK,OAAL;AACA,EAAAA,gCAAA,UAAO,OAAP;AACA,EAAAA,gCAAA,SAAM,OAAN;AACA,EAAAA,gCAAA,SAAM,OAAN;AALU,SAAAA;AAAA,GAAA;AAgBZ,IAAM,YAAY,CAAC,YAA0B;AAAA,EAC3C,SAAS,OAAO,CAAC,MAAM;AAAA,EACvB,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,EAC7B,OAAO,OAAO,CAAC,IAAI;AAAA,EACnB,YAAY,OAAO,UAAU,CAAC;AAAA,EAC9B,QAAQ,OAAO,aAAa,CAAC;AAC/B;AAEO,IAAM,YAAY,CACvB,WAC0D;AAC1D,QAAM,OAAO,UAAU,MAAM;AAE7B,UAAQ,KAAK,YAAY;AAAA,IACvB,KAAK;AACH,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAC7B,KAAK;AACH,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAC7B,KAAK;AACH,aAAO,UAAU,QAAQ,IAAI;AAAA,IAC/B,KAAK;AACH,aAAO,SAAS,QAAQ,IAAI;AAAA,IAC9B,KAAK;AACH,aAAO,SAAS,QAAQ,IAAI;AAAA,IAC9B;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,wBAAwB,CACnC,SACA,WACgB;AAChB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,MAAM,UAAU,MAAM;AAAA,EACxB;AACF;AA0CO,IAAM,KAAK;AAAA,EAChB,YAAY;AACd;AAYA,IAAM,oBAAoB,CACxB,OACA,QACA,WACsB;AACtB,QAAM,UAA6B,CAAC;AACpC,WAAS,eAAe,GAAG,eAAe,OAAO,gBAAgB;AAC/D,UAAM,IAAI,SAAS,eAAe;AAClC,YAAQ,KAAK;AAAA,MACX,YAAY,OAAO,aAAa,IAAI,CAAC;AAAA,MACrC,cAAc,OAAO,UAAU,IAAI,CAAC;AAAA,MACpC,+BAA+B,OAAO,WAAW,IAAI,GAAG,CAAC;AAAA,MACzD,uCAAuC,OAAO,aAAa,IAAI,CAAC;AAAA,MAChE,oBAAoB,OAAO,aAAa,IAAI,EAAE;AAAA,MAC9C,iBAAiB,OAAO,aAAa,IAAI,EAAE;AAAA,MAC3C,kBAAkB,OAAO,aAAa,IAAI,EAAE;AAAA,IAC9C,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAcA,IAAM,UAAU,CAAC,QAAgB,UAAwB;AAAA,EACvD,GAAG;AAAA,EACH,YAAY,OAAO,aAAa,CAAC;AAAA,EACjC,SAAS,OAAO,aAAa,CAAC;AAAA,EAC9B,UAAU,OAAO,aAAa,EAAE;AAAA,EAChC,cAAc,OAAO,aAAa,EAAE;AAAA,EACpC,oBAAoB,OAAO,aAAa,EAAE;AAAA,EAC1C,mBAAmB,OAAO,aAAa,EAAE;AAAA,EACzC,SAAS,kBAAkB,KAAK,OAAO,QAAQ,EAAE;AACnD;AAEO,IAAM,WAAW,CAAC,SACvB,KAAK,eAAe;AAuCtB,IAAM,UAAU,CAAC,QAAgB,UAAwB;AAAA,EACvD,GAAG;AAAA,EACH,YAAY,OAAO,aAAa,CAAC;AAAA,EACjC,SAAS,kBAAkB,KAAK,OAAO,QAAQ,CAAC;AAClD;AAEO,IAAM,WAAW,CAAC,SACvB,KAAK,eAAe;AAsBf,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,SAAM,KAAN;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AARU,SAAAA;AAAA,GAAA;AAuBZ,IAAM,YAAY,CAAC,QAAgB,SAAyB;AAC1D,QAAM,qBAAsC,CAAC;AAC7C,MAAI,SAAS;AACb,WAAS,QAAQ,GAAG,QAAQ,KAAK,OAAO,SAAS;AAC/C,UAAM,QAAuB;AAAA,MAC3B,QAAQ,OAAO,aAAa,MAAM;AAAA,MAClC,OAAO,CAAC;AAAA,IACV;AACA,cAAU;AAEV,WAAO,MAAM;AACX,YAAM,WAAW,OAAO,UAAU,QAAQ;AAE1C,UAAI,aAAa,GAAG;AAElB,YAAI,SAAS,MAAM,GAAG;AACpB,oBAAU,IAAK,SAAS;AAAA,QAC1B;AACA;AAAA,MACF;AAEA,YAAM,SAAS,OAAO,UAAU,QAAQ;AAExC,UAAI,aAAa,cAAe;AAC9B,cAAM,eAAe,OAAO,UAAU,MAAM;AAC5C,cAAM,SAAS,OAAO;AAAA,UACpB;AAAA,UACA,SAAS;AAAA,UACT,SAAS,IAAI;AAAA,QACf;AACA,cAAM,QAAQ,OAAO;AAAA,UACnB;AAAA,UACA,SAAS,IAAI;AAAA,UACb,SAAS;AAAA,QACX;AACA,cAAM,MAAM,KAAK,CAAC,cAAe,QAAQ,KAAK,CAAC;AAAA,MACjD,OAAO;AACL,cAAM,QAAQ,OAAO,SAAS,QAAQ,QAAQ,SAAS,MAAM;AAC7D,cAAM,MAAM,KAAK,CAAC,UAAU,KAAK,CAAC;AAAA,MACpC;AAEA,gBAAU;AAAA,IACZ;AACA,uBAAmB,KAAK,KAAK;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,OAAO,aAAa,CAAC;AAAA,IACjC;AAAA,EACF;AACF;AAEO,IAAM,aAAa,CAAC,SACzB,KAAK,eAAe;AAyBtB,IAAM,WAAW,CAAC,QAAgB,SAAwB;AACxD,QAAM,UAAoB,CAAC;AAC3B,WAAS,QAAQ,GAAG,QAAQ,KAAK,OAAO,SAAS;AAC/C,YAAQ,KAAK,OAAO,aAAa,IAAI,IAAI,KAAK,CAAC;AAAA,EACjD;AAEA,MAAI;AACJ,MAAI,KAAK,SAAS,KAAK,OAAO;AAC5B,UAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,UAAM,SAAS,OAAO,UAAU,KAAK;AACrC,aAAS,OAAO,SAAS,SAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM;AAAA,EACjE;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,YAAY,CAAC,SACxB,KAAK,eAAe;AA4BtB,IAAM,WAAW,CAAC,QAAgB,SAAwB;AACxD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,KAAK;AAAA,IACd,QAAQ,OAAO,aAAa,CAAC;AAAA,IAC7B,MAAM,OAAO,SAAS,SAAS,GAAG,EAAE;AAAA,IACpC,MAAM,OAAO,MAAM,EAAE;AAAA,EACvB;AACF;AAEO,IAAM,YAAY,CAAC,SACxB,KAAK,eAAe;;;ACtLtB,IAAM,kBAAkB,CAAC,QAAgB,WAAmB,QAAQ,MAAM;AACxE,QAAM,SAAS;AAAA,EAAK,SAAS;AAC7B,UAAQ,OAAO,QAAQ,QAAQ,KAAK;AACpC,MAAI,MAAM;AACV,QAAM,MAAgB,CAAC;AACvB,SAAO,SAAS,GAAG;AACjB,UAAM,OAAO,QAAQ,MAAM,QAAQ,OAAO,MAAM;AAChD,QAAI,KAAK,OAAO,SAAS,SAAS,QAAQ,OAAO,QAAQ,GAAG,EAAE,KAAK,CAAC;AACpE,YAAQ,OAAO,QAAQ,QAAQ,GAAG;AAAA,EACpC;AACA,SAAO;AACT;AAQA,IAAM,gBAAgB,CAAC,SAAiB;AACtC,SAAO,KAAK,MAAM,KAAK;AACzB;AAEA,IAAM,eAAe,CAAC,GAAW,SAAiB;AAChD,QAAM,IAAI,KAAK,QAAQ,CAAC;AACxB,MAAI,IAAI,GAAG;AACT,WAAO,CAAC,KAAK,MAAM,CAAC,CAAC;AAAA,EACvB;AACA,SAAO,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC;AAC7C;AAEA,IAAM,mBAAwB;AAAA,EAC5B,MAAM,CAAC,UAAkB;AACvB,UAAM,CAAC,QAAQ,gBAAgB,IAAI,aAAa,KAAK,KAAK;AAC1D,YAAQ,QAAQ;AAAA,MACd,SAAS;AACP,cAAM,QAAQ,iBAAiB,KAAK,EAAE,MAAM,GAAG;AAC/C,cAAM,aAAqC,CAAC;AAC5C,cAAM,QAAQ,CAAC,SAAS;AACtB,gBAAM,CAAC,KAAK,GAAG,IAAI,aAAa,KAAK,IAAI;AACzC,gBAAM,gBAAgB,IAAI,KAAK,EAAE,YAAY;AAC7C,cAAI,kBAAkB,IAAI;AACxB,uBAAW,aAAa,IAAI,IAAI,KAAK;AAAA,UACvC;AAAA,QACF,CAAC;AACD,eAAO,EAAE,QAAQ,WAAW;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,EACX,QAAQ,CAAC,UAAkB;AACzB,UAAM,CAACC,cAAa,QAAQ,IAAI,aAAa,KAAK,KAAK;AACvD,UAAM,CAAC,cAAc,WAAW,kBAAkB,IAAI,SACnD,YAAY,EACZ,MAAM,GAAG;AACZ,QAAI,uBAAuB,QAAW;AACpC,aAAO;AAAA,QACL,aAAa,OAAOA,YAAW;AAAA,QAC/B;AAAA,QACA,WAAW,OAAO,SAAS;AAAA,MAC7B;AAAA,IACF;AACA,WAAO;AAAA,MACL,aAAa,OAAOA,YAAW;AAAA,MAC/B;AAAA,MACA,WAAW,OAAO,SAAS;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW,CAAC,UAAkB;AAC5B,WAAO,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC;AAAA,EACjE;AAAA,EACA,sBAAsB,CAAC,UAAkB;AACvC,WAAO,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC;AAAA,EACjE;AAAA,EACA,WAAW,CAAC,UAAkB;AAC5B,WAAO,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,EAClD;AACF;AAEA,IAAM,iBAAiB,CAAC,SAAiB;AACvC,QAAM,CAAC,WAAW,KAAK,IAAI,aAAa,KAAK,IAAI;AACjD,MAAI,UAAU,QAAW;AACvB,WAAO,EAAE,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AACA,MAAI,iBAAiB,SAAS,MAAM,QAAW;AAC7C,WAAO,EAAE,CAAC,SAAS,GAAG,iBAAiB,SAAS,EAAE,KAAK,EAAE;AAAA,EAC3D;AACA,SAAO,EAAE,CAAC,SAAS,GAAG,MAAM;AAC9B;AAEA,IAAM,eAAe,CAAC,SAAiB;AACrC,QAAM,SAAS,KAAK,MAAM,GAAG,CAAC;AAC9B,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB,KAAK,KAAK;AACR,YAAM;AAAA,QACJ;AAAA,QACAC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI,KAAK,MAAM,GAAG;AAClB,aAAO;AAAA,QACL,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,WAAAA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,EAAE,aAAa,KAAK;AAAA,IAC7B,KAAK;AACH,aAAO,EAAE,oBAAoB,KAAK;AAAA,IACpC,KAAK;AACH,aAAO,EAAE,KAAK,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,EAAE,OAAO,KAAK;AAAA,IACvB,KAAK;AACH,aAAO,EAAE,OAAO,KAAK;AAAA,IAEvB,KAAK,KAAK;AACR,YAAM,CAAC,mBAAmB,oBAAoB,iBAAiB,IAC7D,KAAK,MAAM,GAAG;AAChB,aAAO;AAAA,QACL,gBAAgB;AAAA,UACd,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,KAAK;AACR,YAAM,CAAC,QAAQ,SAAS,IAAI,KAAK,MAAM,GAAG;AAC1C,aAAO,EAAE,QAAQ,UAAU;AAAA,IAC7B;AAAA,IAEA,KAAK,KAAK;AACR,YAAM,CAAC,WAAW,QAAQ,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AACxD,aAAO,EAAE,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,IACzC;AAAA,IAEA,KAAK,KAAK;AACR,YAAM,CAAC,gBAAgB,gBAAgB,GAAG,OAAO,IAAI,KAClD,MAAM,GAAG,EACT,IAAI,MAAM;AACb,aAAO;AAAA,QACL,aAAa,EAAE,gBAAgB,gBAAgB,QAAQ;AAAA,MACzD;AAAA,IACF;AAAA,IAEA,KAAK;AACH;AAAA,IAGF,KAAK;AACH;AAAA,IAGF,KAAK;AACH,aAAO,eAAe,IAAI;AAAA,IAC5B,KAAK,KAAK;AAER,YAAM,CAAC,MAAM,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,GAAG;AAClD,aAAO,EAAE,MAAM,MAAM,OAAO,IAAI,GAAG,UAAU,KAAK,OAAO,GAAG,EAAE;AAAA,IAChE;AAAA,IACA;AAAA,EAEF;AACF;AAEO,IAAM,cAAc,CAAC,WAAmB;AAE7C,QAAM,WAAW,OAAO,QAAQ,MAAM;AACtC,SAAO,gBAAgB,QAAQ,cAAc,QAAQ;AACvD;AAQO,IAAMC,SAAQ,CAAC,WAAwB;AAC5C,QAAM,MAAM,OACT,SAAS,OAAO,EAChB,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtB,QAAM,SAAiC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE;AAChE,MAAI,eAAe;AACnB,MAAI,UAAU,OAAO;AACrB,aAAW,QAAQ,KAAK;AACtB,QAAI,cAAc,IAAI,GAAG;AACvB,aAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,gBAAU,OAAO,MAAM,YAAY;AACnC,QAAE;AAAA,IACJ;AACA,cAAU,OAAO,OAAO,SAAS,aAAa,IAAI,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,WAA+B;AAC/D,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,KAAKA,OAAM,MAAM;AAAA,EACnB;AACF;;;AC/ZA,IAAM,2BAA2B;AACjC,IAAM,eAAe;AAcrB,IAAM,gBAAgB,CAAC,WAAoC;AACzD,QAAM,SAAS,OAAO,MAAM,wBAAwB;AACpD,MAAI,IAAI;AACR,MAAI,YAAY;AAEhB,SAAO,YAAY,OAAO,QAAQ;AAChC,UAAM,QAAQ,OAAO,GAAG;AACxB,UAAM,cAAc,KAAK,IAAI,MAAM,QAAQ,OAAO,SAAS,SAAS;AACpE,UAAM,KAAK,QAAQ,WAAW,GAAG,WAAW;AAC5C,iBAAa;AAAA,EACf;AACA,QAAM,UAAU,OAAO,CAAC;AACxB,QAAM,QAAQ,OAAO;AACrB,QAAM,SAAS,OAAO,aAAa,CAAC;AACpC,QAAM,MAAM,QAAQ;AAEpB,SAAO,EAAE,SAAS,OAAO,IAAI;AAC/B;AASO,IAAM,SAAN,MAAa;AAAA,EACV,UAAoB,CAAC;AAAA,EACrB,UAAU;AAAA,EACV,SAAgB;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,cAAc;AACZ,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ;AACN,SAAK,UAAU,CAAC;AAChB,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,OAAe;AACnB,SAAK,QAAQ,KAAK,KAAK;AACvB,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAA8C;AAC5C,UAAM,WAA4C,CAAC;AAEnD,UAAM,SAAS,OAAO,OAAO,KAAK,OAAO;AACzC,UAAM,kBAAkB,WAAW,MAAM;AAEzC,QAAI,oBAAoB,IAAI;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB;AACzB,UAAM,gBAAgB,mBAAmB,QAAQ,gBAAgB;AACjE,QACE,iBACA,SAAS,aAAa,IAAI,OAAO,SAAS,kBAC1C;AAEA,aAAO;AAAA,IACT;AAEA,SAAK,MAAM;AAEX,QACE,qBAAqB,OAAO,UAC5B,OAAO,gBAAgB,MAAM,cAC7B;AAEA,YAAM,SAAS,OAAO,MAAM,GAAG,gBAAgB;AAC/C,eAAS,KAAK,EAAE,oBAAwB,MAAM,OAAO,CAAC;AAGtD,YAAM,WAAW,OAAO,MAAM,gBAAgB;AAC9C,WAAK,MAAM,QAAQ;AAAA,IACrB,OAAO;AAEL,YAAM,SAAS;AACf,YAAM,OAAO,OAAO,MAAM,gBAAgB;AAE1C,eAAS,KAAK,EAAE,oBAAwB,MAAM,OAAO,CAAC;AACtD,eAAS,KAAK,kBAAkB,IAAI,CAAC;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAqD;AACnD,UAAM,WAA4C,CAAC;AAGnD,QAAI,KAAK,UAAU,0BAA0B;AAC3C,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,cAAc,KAAK,OAAO;AAAA,IAC3C;AAGA,QAAI,KAAK,UAAU,KAAK,QAAQ,KAAK;AACnC,aAAO;AAAA,IACT;AAGA,UAAM,SAAS,OAAO,OAAO,KAAK,OAAO;AACzC,UAAM,SAAS,OAAO,MAAM,KAAK,QAAQ,OAAO,KAAK,QAAQ,GAAG;AAChE,UAAM,WAAW,OAAO,MAAM,KAAK,QAAQ,GAAG;AAC9C,UAAM,UAAU,KAAK,QAAQ;AAE7B,WAAO,KAAK;AAGZ,SAAK,MAAM;AACX,SAAK,MAAM,QAAQ;AAGnB,QAAI,UAAU,MAAM,GAAG;AAErB,eAAS,KAAK,EAAE,mBAAuB,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAChE,OAAO;AAEL,UAAI,cAAc;AAClB,SAAG;AAED,cAAM,eAAe,YAAY,aAAa,CAAC,IAAI,IAAI;AACvD,iBAAS;AAAA,UACP,sBAAsB,SAAS,YAAY,MAAM,GAAG,YAAY,CAAC;AAAA,QACnE;AACA,sBAAc,YAAY,MAAM,YAAY;AAAA,MAC9C,SAAS,YAAY,SAAS;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AAEV,WAAO,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,CAAC,EAAE,WAAW,GAAG;AAC9D,WAAK,QAAQ,MAAM;AAAA,IACrB;AAEA,UAAM,aAAa,KAAK,QAAQ,CAAC;AAEjC,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,WAAK,SAAS;AAAA,IAChB,WAAW,WAAW,CAAC,MAAM,cAAc;AACzC,WAAK,SAAS;AAAA,IAChB,WAAW,WAAW,SAAS,SAAS,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAK,SAAS;AAAA,IAChB,OAAO;AACL,YAAM,IAAI,MAAM,2BAA2B,WAAW,MAAM,EAAE;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MACE,OAC4D;AAC5D,SAAK,MAAM,KAAK;AAEhB,QAAI,KAAK,WAAW,cAAY;AAC9B,WAAK,UAAU;AAAA,IACjB;AAEA,QAAI,WACF,CAAC;AACH,QAAI,OAAO;AAEX,WAAO,CAAC,MAAM;AACZ,UAAI,YAEA,CAAC;AACL,cAAQ,KAAK,QAAQ;AAAA,QACnB,KAAK;AACH;AAAA,QACF,KAAK;AACH,sBAAY,KAAK,kBAAkB;AACnC;AAAA,QACF,KAAK;AACH,sBAAY,KAAK,WAAW;AAC5B;AAAA,QACF;AACE,gBAAM,IAAI,MAAM,+BAA+B;AAAA,MACnD;AAEA,UAAI,UAAU,SAAS,GAAG;AACxB,mBAAW,SAAS,OAAO,SAAS;AAAA,MACtC,OAAO;AACL,eAAO;AAAA,MACT;AAEA,WAAK,UAAU;AAAA,IACjB;AAEA,WAAO;AAAA,EACT;AACF;;;AJzPO,IAAM,aAAN,cAAyB,KAAK;AAAA,EACnC,cAAc;AACZ,UAAM,SAAS,IAAI,OAAO;AAG1B,UAAM,WAAW,IAAIC,WAAU;AAAA,MAC7B,YAAY;AAAA,MACZ,UAAU,KAAc,UAAU,UAAU;AAC1C,YAAI,IAAI,sBAA0B;AAChC,cAAI;AACF,mBAAO,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC,YAAY,SAAS,KAAK,OAAO,CAAC;AAClE,qBAAS;AAAA,UACX,SAAS,GAAG;AACV,kBAAM,MAAM;AACZ,qBAAS,GAAG;AAAA,UACd;AAAA,QACF,OAAO;AAEL,mBAAS,QAAW,GAAG;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,WAAW,IAAIA,WAAU;AAAA,MAC7B,YAAY;AAAA,MACZ,UAAU,KAAc,UAAU,UAAU;AAC1C,YAAI,IAAI,uBAA2B;AACjC,gBAAM,OAAO,QAAQ,GAAG;AACxB,mBAAS,QAAW,EAAE,mBAAuB,KAAK,CAAC;AAAA,QACrD,OAAO;AAEL,mBAAS,QAAW,GAAG;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,UAAU,QAAQ;AAAA,EAC1B;AACF;;;AKtDA,IAAAC,gBAAkB;AAElB,SAAS,aAAAC,mBAAiB;;;ACD1B,IAAM,wBAAwB,KAAK,IAAI,MAAM,GAAG,CAAC;AAa1C,SAAS,QAAQ,SAAiB,UAAmC;AAC1E,QAAM,mBAAmB,UAAU,WAAW,cAAe;AAC7D,SAAO,wBAAwB;AACjC;;;ADYA,SAAS,WAAW,KAAa;AAC/B,SAAO,cAAc,KAAK,GAAG;AAC/B;AAQO,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,cAAW;AAND,SAAAA;AAAA,GAAA;AASZ,IAAM,sBAAsB;AAyB5B,IAAM,gBAAgB,CACpB,WAAmB,OAAO,WAAW,cACjC,KACA,OAAO,SAAS,UACpB,aAAuB,CAAC,MACT;AACf,QAAM,MACJ,WAAW,SAAS,IAChB,UAAU,QAAQ,yBAAyB,WAAW,KAAK,GAAG,CAAC,KAC/D,UAAU,QAAQ;AAExB,SAAO,EAAE,IAAI;AACf;AAEO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EACpC;AAAA,EAEP,YAAY,SAAiB,MAAc;AACzC,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAeO,IAAM,cAAN,cAA0B,KAAK;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,YAAY,SAAqB,CAAC,GAAG;AACnC,UAAM,EAAE,KAAK,SAAS,eAAe,IAAI;AAAA,MACvC,cAAc,OAAO,UAAU,OAAO,UAAU;AAAA,MAChD;AAAA,IACF;AAEA,UAAM,WAAW,IAAIC,YAAU;AAAA,MAC7B,YAAY;AAAA,MACZ,WAAW,CAAC,KAAc,GAAG,aAAa;AACxC,YAAI,IAAI,uBAA2B;AACjC,eAAK,QAAQ,GAAG;AAChB,mBAAS;AAAA,QACX,WAAW,IAAI,uBAA2B;AACxC,eAAK,QAAQ,GAAG;AAEhB,eAAK,UAAU,KAAK,OAAO,IAAI,IAAI;AAEnC,mBAAS,QAAW,GAAG;AAAA,QACzB,WAAW,IAAI,sBAA0B;AACvC,eAAK,OAAO,GAAG;AACf,mBAAS,QAAW,GAAG;AAAA,QACzB,WAAW,IAAI,sBAA0B;AACvC,eAAK,OAAO,GAAG;AAEf,eAAK,SAAS,KAAK,MAAM,IAAI,GAAG;AAEhC,mBAAS,QAAW,GAAG;AAAA,QACzB,OAAO;AAEL,mBAAS,QAAW,GAAG;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAED,aAAS,GAAG,OAAO,MAAM;AAEvB,WAAK,kBAAkB;AAAA,IACzB,CAAC;AAED,UAAM,QAAQ;AAEd,SAAK,kBAAkB;AAEvB,SAAK,OAAO;AACZ,SAAK,OAAO,KAAK,SAAS,cAAc;AAExC,SAAK,qBAAqB,KAAK,YAAY;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OACE,KACA,UAAyB,CAAC,GAC1B,iBAA0B,CAAC,GAC3B;AACA,QAAI,QAAQ,QAAW;AACrB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,SAAK,MAAM;AACX,SAAK,iBAAiB;AACtB,SAAK,UAAU,OAAO;AAAA,MACpB;AAAA,QACE,CAAC,uBAAmB,GAAG,CAAC;AAAA,QACxB,CAAC,iBAAgB,GAAG,CAAC;AAAA,QACrB,CAAC,mBAAiB,GAAG,EAAE,WAAW,QAAQ;AAAA,QAC1C,CAAC,yBAAoB,GAAG,EAAE,QAAQ,kBAAkB;AAAA,QACpD,CAAC,mBAAiB,GAAG,CAAC;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACP,SAAK,YAAY;AACjB,SAAK,QAAQ,MAAM,QAAQ,MAAM,8BAA8B;AAC/D,SAAK,aAAa,CAAC;AACnB,SAAK,eAAe,CAAC;AACrB,SAAK,SAAS;AACd,SAAK,WAAW;AAEhB,SAAK,eAAe;AACpB,SAAK,aAAa;AAClB,QAAI,KAAK,0BAA0B,MAAM;AACvC,oBAAc,KAAK,qBAAqB;AAAA,IAC1C;AACA,SAAK,wBAAwB;AAE7B,SAAK,KAAK;AACV,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,YAAY,WAAoB;AAC9B,QAAI,cAAc,UAAa,WAAW,SAAS,GAAG;AACpD,aAAO;AAAA,IACT;AAGA,UAAM,UAAU,KAAK,gBAAgB,KAAK,oBAAoB,KAAK;AACnE,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC7C,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,cAAc,UAAa,cAAc,KAAK;AAChD,aAAO;AAAA,IACT;AACA,WAAO,IAAI,IAAI,WAAW,OAAO,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,KAAkB;AACxB,SAAK,WAAW;AAEhB,UAAM,SAAS,WAAW,IAAI,IAAI;AAClC,UAAM,QAAQ,gBAAgB,IAAI,IAAI;AACtC,UAAM,MAAM,SAAS,IAAI,IAAI;AAC7B,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,QAAI,KAAK,iBAAiB,QAAW;AACnC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,UAAM,SAAS,KAAK,aAAa,MAAM,CAAC;AAExC,sBAAAC,SAAM,mBAAmB,EAAE,GAAG,IAAI,IAAI,EAAE;AACxC,QAAI,CAAC,KAAK,cAAc,CAAC,OAAO;AAE9B,WAAK,aAAa,UAAU,IAAI,IAAI;AACpC,YAAM,kBAAkB,eAAe,IAAI,IAAI;AAC/C,UAAI,oBAAoB,MAAM;AAG5B,YAAI,KAAK,0BAA0B,MAAM;AACvC,wBAAc,KAAK,qBAAqB;AAAA,QAC1C;AACA,aAAK,wBAAwB;AAAA,UAC3B,MAAM;AACJ,iBAAK,SAAS,EAAE,QAAQ,wBAAoB,CAAC;AAC7C,iBAAK,SAAS;AAAA,UAChB;AAAA,UACA,KAAK,IAAI,qBAAqB,kBAAkB,CAAC,IAAI;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,YAAY,IAAI,IAAI;AAAA,IAC1C;AACA,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,mBAAmB,gBAAgB,IAAI,IAAI;AAAA,IAClD;AACA,QAAI,UAAU,KAAK;AAEjB,WAAK,WACH,KAAK,QAAQ,IAAI,kBAAkB,IAAI,KAAK,SAAS,OAAO,GAAG,MAAM,CAAC;AAAA,IAC1E;AAEA,QAAI,WAAW,mBAAkB;AAE/B,WAAK,UAAU,KAAK,OAAO,MAAM,IAAI,IAAI,CAAC;AAAA,IAC5C;AAEA,QAAI,OAAO;AACT,wBAAAA,SAAM,mBAAmB;AAAA,QACvB,gBAAgB,KAAK,UAAU,2BAA2B,MAAM;AAAA,MAClE;AACA,WAAK,aAAa;AAAA,IACpB;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,KAAkB;AACxB,QAAI,KAAK,OAAO,UAAa,KAAK,OAAO,QAAW;AAClD,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,QAAI,SAAS,IAAI,IAAI,GAAG;AACtB,YAAM,aAAa,IAAI,UAAU;AACjC,WAAK,GAAG,UAAU,IAAI,IAAI,KAAK;AAC/B,WAAK,GAAG,UAAU,IAAI,QAAQ,IAAI,KAAK,SAAS,IAAI,KAAK,QAAQ;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,OAAO,KAAiB;AACtB,QACE,KAAK,OAAO,UACZ,KAAK,OAAO,UACZ,KAAK,eAAe,QACpB;AACA,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,UAAM,aAAa,IAAI;AACvB,UAAM,KAAK,KAAK,GAAG,UAAU;AAC7B,UAAM,KAAK,KAAK,GAAG,UAAU;AAC7B,QAAI,OAAO,OAAO,eAAe,OAAO,OAAO,aAAa;AAC1D,YAAM,YAAY,KAAK,WAAW,UAAU;AAC5C,YAAM,IAAI,UAAU,IAAI,IAAI;AAI5B,YAAM,KAAM,IAAI,KAAM;AACtB,UAAI,eAAgB,KAAK,YAAa,MAAO;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAAiB;AACtB,SAAK,KAAK,CAAC;AACX,SAAK,KAAK,CAAC;AACX,SAAK,aAAa,CAAC;AAEnB,SAAK,qBAAqB,KAAK,YAAY,IAAI,IAAI,QAAQ,OAAO;AAElE,QAAI,IAAI,MAAM,QAAQ,CAAC,OAAO,UAAU;AAGtC,UAAI,MAAM,WAAW,QAAW;AAC9B;AAAA,MACF;AACA,YAAM,EAAE,UAAU,IAAI,MAAM;AAE5B,YAAM,MAAM,QAAQ;AACpB,YAAM,OAAO,MAAM;AAEnB,YAAM,MACJ,MAAM,YAAY,SACd,KAAK,qBACL,KAAK,YAAY,MAAM,OAAO;AAEpC,WAAK,SAAS;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,WAAW,mCAAmC,GAAG,IAAI,IAAI;AAAA,QAC3D;AAAA,QACA;AAAA,MACF,CAAC;AAGD,UAAI,KAAK,eAAe,QAAW;AACjC;AAAA,MACF;AACA,WAAK,WAAW,GAAG,IAAI;AAAA,IACzB,CAAC;AACD,QAAI,KAAK,WAAW,yBAAe;AACjC,WAAK,SAAS;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,OAAO,OAAO,KAAK,aAAa,CAAC;AAAA,QACnC;AAAA,QACA,KAAK,KAAK;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,YAAY,GAAG;AAClB,QAAI,KAAK,WAAW,mBAAY;AAC9B,WAAK,YAAY,OAAO,SAAS,KAAK;AACtC,WAAK,SAAS,EAAE,QAAQ,wBAAoB,CAAC;AAC7C,WAAK,SAAS,EAAE,QAAQ,0BAAqB,CAAC;AAAA,IAChD,WAAW,KAAK,WAAW,uBAAc;AACvC,UAAI,KAAK,eAAe,QAAQ,KAAK,eAAe,QAAW;AAC7D,cAAM,IAAI,MAAM,sBAAsB;AAAA,MACxC;AACA,WAAK,SAAS;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,SAAS,KAAK;AAAA,QAChB;AAAA,QACA,KAAK,KAAK;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACN,SAAK,SAAS,EAAE,QAAQ,oBAAkB,CAAC;AAC3C,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACL,QAAI,KAAK,YAAY;AACnB,WAAK,SAAS,EAAE,QAAQ,0BAAqB,CAAC;AAAA,IAChD,OAAO;AACL,WAAK,aAAa,CAAC;AAAA,IACrB;AACA,SAAK,SAAS;AACd,QAAI,KAAK,0BAA0B,MAAM;AACvC,oBAAc,KAAK,qBAAqB;AACxC,WAAK,wBAAwB;AAAA,IAC/B;AACA,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,KAAc;AACjB,UAAM,EAAE,QAAQ,SAAS,IAAI,IAAI;AACjC,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,SAAK,WAAW;AAChB,SAAK,QAAQ,KAAK,KAAK,KAAK,MAAM,GAAG;AAErC,QACE,KAAK,cAAc,UACnB,KAAK,YAAY,UACjB,KAAK,iBAAiB,QACtB;AACA,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,UAAM,UAAU,OAAO;AAAA,MACrB;AAAA,QACE;AAAA,QACA,KAAK,OAAO,KAAK;AAAA,QACjB,MAAM,OAAO,MAAM,CAAC;AAAA;AAAA,MACtB;AAAA,MACA,EAAE,QAAQ,QAAQ;AAAA,MAClB;AAAA,QACE,SAAS,OAAO;AAAA,UACd,EAAE,MAAM,KAAK,YAAY;AAAA,UACzB,KAAK;AAAA;AAAA,UACL,KAAK,QAAQ,MAAM;AAAA;AAAA,UACnB;AAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,eAAe,QAAQ,QAAQ,UAAU,KAAK;AACnD,SAAK,aAAa,KAAK,MAAM;AAC7B,QAAI,CAAC,KAAK,iBAAiB;AACzB,WAAK,SAAS,KAAK,OAAO;AAAA,IAC5B,OAAO;AAEL,wBAAAA,SAAM,mBAAmB,EAAE,kBAAkB,MAAM,qBAAqB;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,KAAc;AACrB,QAAI,KAAK,eAAe,QAAW;AACjC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,SAAK,WAAW,KAAK,GAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,QAAI,KAAK,eAAe,QAAW;AACjC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,QAAI,CAAC,KAAK,YAAY,KAAK,WAAW,SAAS,GAAG;AAChD,YAAM,MAAM,KAAK,WAAW,MAAM;AAClC,UAAI,QAAQ,QAAW;AACrB,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;;;AEliBA,SAAiB,eAAe;AAEhC,SAAS,YAAAC,WAAU,YAAAC,iBAAgB;AAK5B,IAAM,YAAN,cAAwB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpC,YAAY,MAAe;AACzB,QAAI;AAIJ,UAAM,WAAW,IAAIC,UAAS;AAAA,MAC5B,YAAY;AAAA,MACZ,OAAO;AAAA,MAEP;AAAA,IACF,CAAC;AAKD,UAAM,WAAW,IAAIC,UAAS;AAAA,MAC5B,YAAY;AAAA,MACZ,MAAM,KAAK,UAAU,UAAU;AAC7B,cAAM,IAAI,IAAI;AAEd,YAAI,CAAC,QAAQ;AAQX,cAAI;AACJ,cAAI,SAAS,QAAW;AACtB,kBAAM,aAAa,EAAE,QAAQ,GAAG;AAChC,kBAAM,cAAc,EAAE,QAAQ,KAAM,aAAwB,CAAC;AAC7D,kBAAM,EAAE,MAAM,YAAY,WAAW,EAAE,SAAS,OAAO;AAAA,UACzD,OAAO;AACL,kBAAM,UAAU,IAAI;AAAA,UACtB;AACA,gBAAM,EAAE,UAAU,KAAK,IAAI,IAAI,IAAI,GAAG;AACtC,mBAAS;AAAA,YACP,OAAO,IAAI,KAAK;AAAA,YAChB,aAAa,OAAO,SAAY;AAAA,UAClC;AACA,iBAAO,GAAG,SAAS,CAAC,MAAM;AACxB,oBAAQ,MAAM,qBAAqB,CAAC;AACpC,mBAAO,QAAQ;AACf,qBAAS,KAAK,IAAI;AAAA,UACpB,CAAC;AAED,iBAAO,GAAG,QAAQ,CAAC,WAAW;AAC5B,gBAAI,CAAC,SAAS,KAAK,EAAE,MAAM,QAAQ,kBAAsB,CAAC,GAAG;AAC3D,sBAAQ;AAAA,gBACN;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAGD,iBAAO,GAAG,OAAO,MAAM;AACrB,oBAAQ,KAAK,cAAc;AAC3B,qBAAS,KAAK,IAAI;AAAA,UACpB,CAAC;AAAA,QACH;AACA,YAAI;AACF,iBAAO,MAAM,IAAI,MAAM,UAAU,QAAQ;AAAA,QAC3C,SAAS,GAAG;AACV,kBAAQ,KAAK,6BAA6B,GAAG;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,CAAC;AAGD,aAAS,GAAG,SAAS,CAAC,MAAM;AAC1B,cAAQ,IAAI,4CAA4C,CAAC;AACzD,gBAAU,OAAO,IAAI;AAAA,IACvB,CAAC;AAGD,aAAS,GAAG,UAAU,MAAM;AAC1B,gBAAU,OAAO,IAAI;AAAA,IACvB,CAAC;AAGD,aAAS,GAAG,SAAS,CAAC,MAAM;AAC1B,cAAQ,KAAK,oCAAoC,CAAC;AAAA,IACpD,CAAC;AAGD,aAAS,GAAG,UAAU,MAAM;AAC1B,gBAAU,OAAO,IAAI;AAAA,IACvB,CAAC;AAKD,UAAM,UAAU,QAAQ;AAAA,EAC1B;AACF;;;AC5GA,SAAS,YAAAC,WAAU,YAAAC,iBAAgB;AAU5B,IAAM,SAAN,cAAqB,KAAK;AAAA,EAC/B,YAAY,QAAa;AACvB,UAAM,WAAW,IAAIC,UAAS;AAAA,MAC5B,YAAY;AAAA,MACZ,MAAM,MAAM;AAAA,MAEZ;AAAA,IACF,CAAC;AAED,UAAM,WAAW,IAAIC,UAAS;AAAA,MAC5B,YAAY;AAAA,MACZ,OAAO,CAAC,KAAK,UAAU,aAAa;AAClC,YAAI;AACF,iBAAO,KAAK,IAAI,IAAI;AAAA,QACtB,SAAS,GAAG;AACV,kBAAQ,KAAK,6BAA6B,GAAG;AAAA,QAC/C;AACA,iBAAS;AAAA,MACX;AAAA,IACF,CAAC;AAED,WAAO,GAAG,WAAW,SAAU,MAAc;AAC3C,eAAS,KAAK,EAAE,MAAM,kBAAsB,CAAC;AAAA,IAC/C,CAAC;AAED,WAAO,GAAG,SAAS,WAAY;AAC7B,eAAS,KAAK,IAAI;AAAA,IACpB,CAAC;AACD,WAAO,GAAG,SAAS,CAAC,MAAa;AAC/B,cAAQ,MAAM,oBAAoB,CAAC;AACnC,aAAO,UAAU;AACjB,eAAS,KAAK,IAAI;AAAA,IACpB,CAAC;AAGD,aAAS,GAAG,SAAS,CAAC,MAAM;AAC1B,cAAQ,IAAI,2CAA2C,CAAC;AACxD,gBAAU,OAAO,SAAS,OAAO,MAAM;AAAA,IACzC,CAAC;AAGD,aAAS,GAAG,UAAU,MAAM;AAC1B,gBAAU,OAAO,SAAS,OAAO,MAAM;AAAA,IACzC,CAAC;AAGD,aAAS,GAAG,SAAS,CAAC,MAAM;AAC1B,cAAQ,KAAK,0CAA0C,CAAC;AAAA,IAC1D,CAAC;AAGD,aAAS,GAAG,UAAU,MAAM;AAC1B,gBAAU,OAAO,SAAS,OAAO,MAAM;AAAA,IACzC,CAAC;AAKD,UAAM,UAAU,QAAQ;AAAA,EAC1B;AACF;;;ACtEA,IAAAC,sBAAA;AAAA,SAAAA,qBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWO,IAAM,WAAN,MAAe;AAAA,EACb;AAAA,EACA;AAAA,EAEC;AAAA;AAAA;AAAA;AAAA,EAIR,eAAe,YAAyB;AACtC,UAAM,CAAC,KAAK,GAAG,GAAG,IAAI;AAEtB,SAAK,OAAO,IAAI,IAAI,UAAU;AAE9B,SAAK,iBAAiB;AACtB,SAAK,gBAAgB,IAAI,OAAO,CAAC,MAAM,cAAc;AACnD,aAAO,KAAK,QAAQ,SAAwB;AAAA,IAC9C,GAAG,GAAG;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,YAAyB;AAC/B,UAAM,CAAC,KAAK,GAAG,GAAG,IAAI;AAEtB,SAAK,OAAO,IAAI,IAAI,UAAU;AAE9B,SAAK,iBAAiB;AACtB,SAAK,gBAAgB,IAAI,OAAO,CAAC,MAAM,cAAc;AACnD,aAAO,KAAK,QAAQ,SAAwB;AAAA,IAC9C,GAAG,GAAG;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,WAA0B,cAA2B;AAC/D,QAAI,CAAC,KAAK,KAAK,IAAI,SAAS,GAAG;AAC7B,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,QAAI,KAAK,KAAK,IAAI,YAAY,GAAG;AAC/B,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,MAAM,UAAU;AACtB,QAAI,QAAQ,MAAM;AAChB,gBAAU,QAAQ,YAAY;AAC9B,WAAK,gBAAgB;AAAA,IACvB,OAAO;AACL,gBAAU,WAAW;AACrB,gBAAU,QAAQ,YAAY,EAAE,QAAQ,GAAG;AAAA,IAC7C;AACA,SAAK,KAAK,IAAI,YAAY;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,WAAwB,cAA6B;AAChE,QAAI,CAAC,KAAK,KAAK,IAAI,SAAS,GAAG;AAC7B,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,QAAI,KAAK,KAAK,IAAI,YAAY,GAAG;AAC/B,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,MAAM,UAAU;AACtB,QAAI,QAAQ,MAAM;AAChB,mBAAa,QAAQ,SAAS;AAC9B,WAAK,iBAAiB;AAAA,IACxB,OAAO;AACL,UAAI,WAAW;AACf,UAAI,QAAQ,YAAoB,EAAE,QAAQ,SAAS;AAAA,IACrD;AACA,SAAK,KAAK,IAAI,YAAY;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAsB;AAC3B,QAAI,CAAC,KAAK,KAAK,IAAI,SAAS,GAAG;AAC7B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,UAAU;AACtB,QAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD,WAAW,QAAQ,QAAQ,QAAQ,MAAM;AACvC,gBAAU,WAAW;AACrB,WAAK,iBAAiB;AAAA,IACxB,WAAW,QAAQ,QAAQ,QAAQ,MAAM;AACvC,UAAI,WAAW;AACf,WAAK,gBAAgB;AAAA,IACvB,WAAW,QAAQ,QAAQ,QAAQ,MAAM;AACvC,UAAI,WAAW;AAIf,YAAM,MAAM;AACZ,UAAI,WAAW;AACf,UAAI,QAAQ,GAAG;AAAA,IACjB;AACA,SAAK,KAAK,OAAO,SAAS;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,YAAgC;AACxC,eAAW,QAAQ,CAAC,cAAc;AAChC,WAAK,YAAY,KAAK,eAAgC,SAAS;AAAA,IACjE,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,YAAkC;AAC3C,eAAW,QAAQ,CAAC,cAAc;AAChC,WAAK,aAAa,KAAK,gBAA+B,SAAS;AAAA,IACjE,CAAC;AAED,WAAO;AAAA,EACT;AACF;;;AC1IO,IAAM,eAAN,cAA2B,SAAS;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,YAAyB;AACnC,UAAM,aAAa,IAAI,WAAW;AAClC,UAAM,cAAc,IAAI,YAAY,UAAU;AAE9C,gBAAY,QAAQ,CAAC,QAAQ;AAC3B,WAAK,SAAS,KAAK,MAAM,GAAG;AAAA,IAC9B;AAEA,gBAAY,SAAS,CAACC,WAAU;AAC9B,WAAK,UAAU,KAAK,OAAOA,MAAK;AAAA,IAClC;AAEA,UAAM,YAAY,WAAW;AAG7B,SAAK,OAAO;AAAA,EACd;AACF;;;AC3BO,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAClD,YAAY,YAAyB;AACnC,UAAM,UAAU;AAEhB,UAAM,YAAY,IAAI,UAAU;AAEhC,SAAK,OAAO,SAAS;AAAA,EACvB;AACF;;;ACJO,IAAM,kBAAN,cAA8B,aAAa;AAAA,EACzC;AAAA,EAEU;AAAA,EAEjB,YAAY,YAAyB;AACnC,UAAM,UAAU;AAEhB,UAAM,YAAY,IAAI,UAAU;AAChC,UAAM,WAAW,IAAI,SAAS;AAC9B,UAAM,WAAW,IAAI,SAAS;AAE9B,aAAS,SAAS,CAAC,wBAAwB;AACzC,WAAK,UAAU,KAAK,OAAO,mBAAmB;AAAA,IAChD;AAEA,SAAK,OAAO,WAAW,UAAU,QAAQ;AAEzC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,UAAU;AAAA,EACxB;AACF;;;AC3BO,IAAM,mBAAN,cAA+B,kBAAkB;AAAA,EACtD,YAAY,QAAwB;AAClC,UAAM,EAAE,MAAM,YAAY,MAAM,WAAW,IAAI;AAE/C,UAAM,UAAU;AAEhB,UAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAK,aAAa,KAAK,MAAM,IAAI;AAEjC,UAAM,YAAY,IAAI,UAAU;AAEhC,UAAM,YAAY,QAAQ,OAAO,QAC7B,CAAC,QAAa,QAAQ,IAAI,IAAI,MAAM,IAAI,IAAI,IAC5C,CAAC,QACC,IAAI,0BAA6B,QAAQ,OAAO,MAAM,IAAI,IAAI;AACpE,UAAM,YAAY,KAAK,YAAY,SAAS;AAE5C,SAAK,QAAQ,SAAS;AACtB,SAAK,OAAO,SAAS;AAAA,EACvB;AACF;;;ACpBO,IAAM,iBAAN,cAA6B,gBAAgB;AAAA,EAClD,YAAY,QAAwB;AAClC,UAAM,EAAE,MAAM,YAAY,MAAM,WAAW,IAAI;AAE/C,UAAM,UAAU;AAEhB,UAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAK,aAAa,KAAK,MAAM,IAAI;AAEjC,UAAM,YAAY,IAAI,UAAU;AAEhC,UAAM,YAAY,QAAQ,OAAO,QAC7B,CAAC,QAAa,QAAQ,IAAI,IAAI,MAAM,IAAI,IAAI,IAC5C,CAAC,QACC,IAAI,yBAA6B,QAAQ,OAAO,MAAM,IAAI,IAAI;AACpE,UAAM,YAAY,KAAK,YAAY,SAAS;AAE5C,SAAK,QAAQ,SAAS;AACtB,SAAK,OAAO,SAAS;AAAA,EACvB;AACF;;;ACvCA,SAAwB,uBAAuB;AAmBxC,IAAM,qBAAN,cAAiC,SAAS;AAAA,EACxC;AAAA,EAEA,YAAY,SAAsB,CAAC,GAAG;AAC3C,UAAM,EAAE,WAAW,SAAS,IAAI;AAChC,UAAM,MAAM,IAAI,gBAAgB,SAAS;AACzC,QAAI,GAAG,cAAc,CAAC,WAAW;AAC/B,YAAM,SAAS,IAAI,OAAO,MAAM;AAChC,YAAM,YAAY,IAAI,UAAU,QAAQ;AAExC,WAAK,KAAK,WAAW,MAAM;AAAA,IAC7B,CAAC;AAED,UAAM;AAGN,SAAK,MAAM;AAAA,EACb;AACF;;;ACrCA,IAAAC,sBAAA;AAAA,SAAAA,qBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBO,IAAM,QAAN,MAAY;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEO,QAAQ;AACb,QAAI,KAAK,SAAS;AAChB,WAAK,UAAU,OAAO,YAAY,IAAI;AACtC,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEO,OAAO;AACZ,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,KAAK,IAAI;AACxB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEO,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA,EAIO,MAAM;AACX,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK;AAAA,IACd;AACA,WAAO,KAAK,WAAW,OAAO,YAAY,IAAI,IAAI,KAAK;AAAA,EACzD;AAAA,EAEO,OAAO;AACZ,SAAK,MAAM;AAAA,EACb;AAAA,EAEO,QAAQ;AACb,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA,EAGA,IAAI,cAAc;AAChB,WAAO,KAAK,IAAI,IAAI;AAAA,EACtB;AACF;;;AC7DO,IAAM,eAAe,CAC1B,aACA,EAAE,YAAY,OAAO,IAAI,EAAE,YAAY,IAAI,QAAQ,CAAC,GAAG,EAAE,MACtD;AACH,MAAI,UAAU;AAEd,QAAM,aAAa,YAAY;AAE/B,cAAY,UAAU,CAAC,QAAQ;AAC7B,iBAAa,GAAG;AAEhB,QAAI,CAAC,OAAO,SAAS,IAAI,IAAI,GAAG;AAC9B;AAAA,IACF;AAGA,SAAK,WAAW,KAAK,YAAY;AAC/B,cAAQ,IAAI,mBAAmB,SAAS,UAAU;AAClD;AAAA,IACF;AAGA,eAAW,MAAM,YAAY,QAAQ,GAAG,UAAU,GAAG;AAAA,EACvD;AACF;;;ACxBA,IAAM,oBAAoB;AA0BnB,IAAM,YAAN,MAA8D;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,YACE,OACA,SACA,YAAY,mBACZ;AACA,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,QAAQ,CAAC;AACd,SAAK,uBAAuB;AAC5B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ;AACb,iBAAa,KAAK,QAAQ;AAC1B,iBAAa,KAAK,SAAS;AAC3B,SAAK,QAAQ,CAAC;AACd,SAAK,uBAAuB;AAC5B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAK,qBAA6B;AACvC,SAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,UAAU;AACf,iBAAa,KAAK,SAAS;AAC3B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,IAAI,MAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAI,YAAgB;AACzB,iBAAa,KAAK,QAAQ;AAI1B,QAAI,OAAO,KAAK,yBAAyB,aAAa;AACpD;AAAA,IACF;AAEA,QAAI,OAAO,eAAe,aAAa;AACrC,WAAK,MAAM,KAAK,UAAU;AAAA,IAC5B;AAGA,QAAI,KAAK,YAAY;AACnB;AAAA,IACF;AAIA,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B;AAAA,IACF;AAGA,QAAI,gBAAgB;AACpB,QAAI;AACJ,OAAG;AACD,YAAM,MAAM,KAAK,MAAM,MAAM;AAC7B,UAAI,QAAQ,QAAW;AACrB,cAAM,IAAI,MAAM,mDAAmD;AAAA,MACrE;AACA,uBAAiB;AACjB,YAAM,eAAe,eAAe;AACpC,UAAI,iBAAiB,QAAW;AAC9B;AAAA,MACF;AACA,YAAM,mBAAmB,eAAe,KAAK;AAC7C,sBAAgB,mBAAmB,KAAK,OAAO,cAAc;AAG7D,UAAI,KAAK,IAAI,aAAa,IAAI,KAAK,YAAY;AAC7C,aAAK,YAAY,KAAK,SAAS,cAAc;AAAA,MAC/C;AAAA,IACF,SAAS,gBAAgB,KAAK,cAAc,KAAK,MAAM,SAAS;AAEhE,QAAI,gBAAgB,CAAC,KAAK,YAAY;AAMpC,mBAAa,KAAK,SAAS;AAC3B,WAAK,OAAO,MAAM;AAClB,WAAK,YAAY,OAAO;AAAA,QACtB,MAAM,KAAK,OAAO,KAAK;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF,WAAW,gBAAgB,KAAK,YAAY;AAG1C,WAAK,MAAM,QAAQ,cAAc;AACjC,WAAK,WAAW,OAAO;AAAA,QACrB,MAAM,KAAK,IAAI,MAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
  "names": ["Md5", "Md5FileHasher", "ParallelHasher", "parse", "debug", "version", "useColors", "debug", "Readable", "Writable", "timestamp", "Readable", "Writable", "MessageType", "Transform", "MD5", "Transform", "debug", "Transform", "Transform", "timestamp", "Transform", "Transform", "type", "width", "height", "precision", "qTable", "Transform", "import_debug", "Transform", "Transform", "debug", "import_debug", "Transform", "payloadType", "timestamp", "Transform", "debug", "payloadType", "timestamp", "Transform", "Transform", "timestamp", "join", "Readable", "Writable", "Readable", "Writable", "join", "Transform", "import_debug", "debug", "RTCPPacketType", "SDESItem", "payloadType", "sessionId", "parse", "Transform", "import_debug", "Transform", "RTSP_METHOD", "Transform", "debug", "Readable", "Writable", "Readable", "Writable", "Readable", "Writable", "Readable", "Writable", "index_node_exports", "range", "index_node_exports", "parse"]
}
