@rivmux/runtime-worker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1894 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true
8
+ });
9
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
+ return target;
11
+ };
12
+ //#endregion
13
+ //#region src/fixtures/m1-static-fmp4.ts
14
+ const M1_VIDEO_MIME = "video/mp4; codecs=\"avc1.42C01E\"";
15
+ const INIT_SEGMENT_BASE64 = [
16
+ "AAAAHGZ0eXBpc281AAACAGlzbzVpc282bXA0MQAAAuVtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAA",
17
+ "AAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAB6HRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAA",
18
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAABQAAAAPAAAAAAAYRtZGlhAAAAIG1kaGQAAAAAAAAAAAAA",
19
+ "AAAAADwAAAAAAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAEvbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAA",
20
+ "JGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAA73N0YmwAAACjc3RzZAAAAAAAAAABAAAAk2F2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAB",
21
+ "QADwAEgAAABIAAAAAAAAAAEVTGF2YzYxLjE5LjEwMSBsaWJ4MjY0AAAAAAAAAAAAAAAY//8AAAAtYXZjQwFCwB7/4QAWZ0LAHtoFB+wEQAAAAwBAAAAPI8WL",
22
+ "qAEABGjOD8gAAAAQcGFzcAAAAAEAAAABAAAAEHN0dHMAAAAAAAAAAAAAABBzdHNjAAAAAAAAAAAAAAAUc3RzegAAAAAAAAAAAAAAAAAAABBzdGNvAAAAAAAA",
23
+ "AAAAAAAobXZleAAAACB0cmV4AAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAYXVkdGEAAABZbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAA",
24
+ "AAAAAAAAAAAsaWxzdAAAACSpdG9vAAAAHGRhdGEAAAABAAAAAExhdmY2MS43LjEwMg=="
25
+ ].join("");
26
+ const MEDIA_SEGMENT_BASE64 = [
27
+ "AAAAmG1vb2YAAAAQbWZoZAAAAAAAAAABAAAAgHRyYWYAAAAcdGZoZAACADgAAAABAAACAAAAGjwBAQAAAAAAFHRmZHQBAAAAAAAAAAAAAAAAAABIdHJ1bgAA",
28
+ "AgUAAAAMAAAAoAIAAAAAABo8AAAGqAAAB4QAAAdsAAAHkAAAB+kAAAkfAAAHHwAAB6IAAAdPAAAHrQAABx4AAG1PbWRhdAAAAmYGBf//YtxF6b3m2Ui3lizY",
29
+ "INkj7u94MjY0IC0gY29yZSAxNjQgcjMxMDggMzFlMTlmOSAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMjMgLSBodHRwOi8v",
30
+ "d3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0xIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4",
31
+ "IHN1Ym1lPTIgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MCBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTAgOHg4ZGN0PTAgY3Ft",
32
+ "PTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9MCB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MyBzbGljZWRfdGhy",
33
+ "ZWFkcz0xIHNsaWNlcz0zIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0w",
34
+ "IHdlaWdodHA9MCBrZXlpbnQ9MTIga2V5aW50X21pbj03IHNjZW5lY3V0PTAgaW50cmFfcmVmcmVzaD0wIHJjPWNyZiBtYnRyZWU9MCBjcmY9MjMuMCBxY29t",
35
+ "cD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAACw9liIQj8QiKuDAhfgIUxMAC1qDDAAeLwzoQ0Kgd",
36
+ "JX/4mfOoxIpuVfDf/cReGVGNCoH9n/4n2SyzILWepD/7BY0+K1gTTP77uGoYRC/PQer10nDCoR53nq9IANIRkhQOl/f+0BwpHSlA3J/vgQABQAQYqEACVQAB",
37
+ "AEAB3MxIhcEdeLPDg1zo1P5A5v/9pgK5iSjamAHXlFRCo8AQ0qc71gIwj/78UFZjo0VRFREeDRan/NUNkU3LeuIHwAHi8M6ENCoHSV/+uGoYRCfP49XgatYl",
38
+ "YrHCHq9YNZiJIPZM/3zhGZSOVkHUDdPCQhsZT1e2iyzQKpj4I3/OCM6EcyIOqg0ufQS2R/bCGR0Mo2h3g9P9sdgPUVpqQUX/9+UdNvQcT/9+CQyjOjYJDYM6",
39
+ "dgZhn46n/78vdKxWL/+5EVURUSahAwr/NUNmU3Lf83EXhnQhoVA6Sv/3xqhsym5V+b/4O4agwyFpE4PV7SxZZkFzEqQ/+oHWZkjg/x/fLBoqWLPQQ////lw1",
40
+ "BhkLSJwerwNWsJSHIch6vWDWYzSBdNn++cIZlIU7oOoOJ2GDJSew2SMraQ6DzAerGyjanpWmhzGkdX/1qcmmbjAojNobUwZ+K1bZt/ojYRUHghD+ANFDYV1a",
41
+ "oExMMuY2dB0s7/BwI1GRGF3/yf/cReMqMSPh/d/+BPZiRo5ZXmxFlmQ+RyEv+cEM+IUzIOqQBS4rQayn99dxqGNyfNQer11OGPyPM09XpAGszJHAvv7/2gcd",
42
+ "nSuBOT/fBACFhAAEgKcHxeePoLNvgNRtTs6beg5W//cYD4xJRtTAWOJimOwrlY5nB/cCjanZPUWwnm//3GABbnHuBtTiKgI/2NF/uoyIwu965A+AA8XjKjEj",
43
+ "4f3f/rjUMbk+bx6vfIA1mZI4F9/f+g2nDViOVj1e2inkHQpsEb3AdpNon5VSAKfOkGtz++sSkIAuhx5I8PHbTRwecrnDiNrO/Ot46j6TsMR4xtgenA8Q24Pc",
44
+ "Y50pq4uxfK4h3JDRxNm+XEViKybIdf7qMiMLveuTiLxlzEj4f3f/v3UZEYXe9cnEXjLmJHw/u//XGoY3J83j1exJHJA9nMS/6QBrMyRwL7+/9oHHZ0rgTk/3",
45
+ "y41DG5Pm8er11OGPyPM89XpAGszJHAvv7/2gcdnSuBOT/fBAlQgABEybfmNqcPzG1NgPViI42piA9WIjjamzzTIbUyuaZDamwALGOP6htTEACxjj+obU41D/",
46
+ "+NwA4syAQz3Btq91GRGF3vXIGCigACAZ7jUMbk+ag9XvkAazMkcC+/v/fDIAAgBAB4QAtgDhjTSGVUXvhEExStdIC+//3haCYBnLHEcqjuvhACAKxZmjTzYA",
47
+ "6An/+0WAQBWP//wRApFPjQACaECKicn4f/4IooAApI+OAAOJUcAAR2f//4LgTRQABAy4QABEIQSEJEfBwBAIxwdBMf8P8FUIAAgAByQKCIBqEwcAgFY4PBsf",
48
+ "//wV4HCDiEHBwACgB4gAAgQgACBlA8bXMPG1zA4AIILuYcAEEF3MRBPHBjQACSJ/8P+CwFEUAAQDOIATxAABAoAAEA3B0ExB0ExBwAC4AAgEMQcAAuAAIBDH",
49
+ "//4IgUinxwACscAAQA5OTwAOAhD7DQJF/P+aQOAIAJBwIFiEDgWAGxHIHAsAJCwwLBsTwwLBLmMMOOCBgc/6MZScSEjw1DhigfT8eE41hp+PBMnWPx9Q9DfJ",
50
+ "/8lwGR8CIf0VsjQEyAwlEA/isueAx7r4fmeYoy54SPUM8PhMxcIxD4aHYCN2Q3MkAkQcz/iASO+J0EAEUobGAb+L/5qPG/Z/ZKcPFa1lmkUwe7y55w/UB4Cg",
51
+ "7CLV2+m/EJEDOghBIKGGTRbDDAItM4XS45Y//2oggI/4ADxeGdGNCoF8r/9r5RZZoOhjyHv9QQNPipYEsif74JhKEWDbzN3qGzYI1P5DSk//2eMI8SbB52gh",
52
+ "GySMCdcP/93X5f2Gyf7kyIxV/4n/wdx0YExVD8er3yANZk0cH1/f++FSQQmY4zriA75XXSEj//f87ObTDB77M0aeYGLM//7Xpgrrrp7XD8PwBAsBRigACBVi",
53
+ "AACAAAWIAT4OAgMZg4EBzMHQRmDwZkz2pgprp6euvDDAP+CsE2AmROxK1akEDgBgFCIAAgGnAAEAwBgd7TAImUsPAAktD+YyGHcQAjFyw86nJFSF1AKt3d13",
54
+ "/EgTP/p1hI2zfwkbZesQwCGPYaIBNuRW/wExIZzVq3VkHIDGZBICMBQgABADEAzYCfWdDsVNhmk8ImVzwAMBNsgSOLi1V0o4JSPu0QAASAcOufwDAFjCAr8u",
55
+ "ZcOQQA48/3NdX94OhEQkowgILqvhIvTmc7HGtYSlgAZ15N7YjeJFSYCqHKAcA4/XlxzZrjcvcBPSfWr98VQxIOY1saYaWUVLZ1GqAhM+0Q3+8wRFlHt8eMIM",
56
+ "PxDgAiRERjtbqDiARHAw5BACnDgVsvRowmC0EwGBErc+ffZbIeVjBYEArAKASRkOFYi7tf8cMcOlAFraCMdDc/9cHEAIjEJoDAAE+EwjrXSwD/e8MQssaOm7",
57
+ "WAsSyEqfr0AE2nMiDwi2J3aTBPXT10vDAfwcJIKICaRmVavPIECZkhua/AQpkR1q9+BO2kN1+FDMDhAECkA0AEP3CFuIYAVGVmLMQUAqN2g9ahu++5jK4AB2",
58
+ "bJobQqMI/8BDSNAmcoZBRyQIaRpidREb885smDdqhQ5+f/hjh0vwE0Tu1avwIEbshufgazCCJ7fgVeSdMM2AKTTXrTA/PRiURCa5Z4zHKZDTFJ3M5Cpglp6e",
59
+ "uubjgAFY0a65mCpNk8FcaAATQGEASRDHD/QLA4B0CrJv4BIQLO2nBgP+BMEogCqOo/wf/+DARh33A4QKKZcISE4QABAOS6vuARCzRAu1OVCEFwAd2JzGEW8J",
60
+ "3a/DGAY1r1XAdpMGcwFG5//Bwg5GEBODg4IAAqAIcCT2ewMVIetvVldPScIeUt0g/AXH4pQb6rMIX1LQ2Nxwzmt2qjhAf9BqAC6nyNt4/v9dQcQBEQwACgAu",
61
+ "MIAAuACGhAAGApBokzCkxIqAj9TAHQ3SFvfeABXbMwTv1KGO+QvAZswoI23SD/j8AxwjyYE8TOhuf+uDoER1CgGUwHAtwGwp5HIeVAwGAF1gZ+xwB0N0gITR",
62
+ "pGTMSooYYAWuAiZTAGS3S/+YewW8AFszCRSxpEH/21hBZ3CAkKXAj0mlbgwlh4EXSNK2gYJoagprimCjTeQ1jbAIZ2IPiG3/hr8CGZGhuf/AnHkhv7wcTYQg",
63
+ "YWQKTPkLMUhvf2x+Up/8po0DdjBkFHnc9MmxOcOnPPDDTBTT09dddddPT1xTBMZdf/u50CeOGOAAV1DwH/QaBMAGczJSj6//ByAZEIAAmAQsICAAKADmB4AG",
64
+ "cWxL73EdsnwZJigMtukH4AFJIkGzZCBTekVAR+pgBVN0g/4/hjhBhwIEbshufg8BkeBwJqHDdgQmjSMmYlQoDDACxcAjYogI63SAjpk2J8hUdgwwAusBn7HA",
65
+ "HU3S+A+Qexvoo04geBwCAeWWPADpIaApR4B4bat8CAFQAECQgAXAAEAIGg4AwlxkQ/tAQvZN6TCDwDgyADAKOGjF3aAWL2TepggfAfhxD4cdAVJEYDHdIbav",
66
+ "eHiH4HCD2y4xD8IHooQD0cGCu/gF+/mwU0+877A6pNfwAl7+bBJk+877/6h4DDpQAX+VmkRY/srLbx8QDwYA9kDgCZA4ACIvgBmf9Exqoej4AM6v/IjPTEXs",
67
+ "Dmb/67v2wU109PXXgAAABbhlAyiIQEr///wRRQABEt8cAAR9Y4AAsIScn8P/4KwVQOQDDIOIABA8QAAQPAABBhgeZXMPMrmBwACQDh1zDgAEgHDrn//+CIFY",
68
+ "p9HBk/+H/BYCaKAAICXEACLEAAEAsANg6BMQdAmIOAEAdiDgBAHYEQTxwY4AAgBScn4f/4aBEKAAIQ/wOAAgAgOZbCtAACM4FaAAEC2AGcssSum7X4AT5GKk",
69
+ "c7btf4cQ8A4aIAoJmgEM1QbahT/nDzng4IMRwoeKEQaHz67qwHO/n2dp98//j/adWAOd/Rs5o7tf//AA4DlOB5wPzgecD8ARTQZCmrVqQf8SBIhAjXAQCDXw",
70
+ "O4Aw6mcbrQMuAxWADBdVGcepx2P/hj+NnDyweBwEDBDIsAA5f3fCjlhFiQIAAiGCRBwBIvmB5DlfIrAC1wCNlMAM1ulZ76jhjgPBgTADR0239rSigdBRlw0g",
71
+ "HDAhwdnT2hyeB+ELc4zpGlbQME0MBgBgFHDRi7tf9YBjh04F2SaG6+fingdCjLCQsKEAEB2jsJ2xxHlSbmB1ImvaABP38MVxMn9r//8FgiKAAIBnEAIsQAAQ",
72
+ "KAABANwdBMYOgmIOAAXAAEAhjwcAAuAAIBDH//4IgUinxgABNDgACAHJyddddMFTaYK66enrr4Yf/Yeij67XHjh/kDQKMDhBTEHHIAyPCUBA4QARQ8MAeYrg",
73
+ "JoK2AeYrngcAQxtwAvYb3FA6G6QcAQx9znqHhwHgwKZTACObZJJD+0yDwMjhKmEABVxAJdzEX+//Ala54AsXsm+TAgLADDADOWWJXTdr8MYBjhAuL4ECN2Q3",
74
+ "P/4PDIwLYIOGJ5mB4Q3l3eOez2B/s06TABzv4yqzR3fPEfj/w0Ydzi/BwQYiKWEBDjSigSuphdr5DgoAEZDMcKSISXFt2j33x+AY4R5MCeEQqG5/3wOIAqy9",
75
+ "xAugoM+6dVAjoxLyFzHYpAwwAspgDHtDwL83S/+oewWlwADqPiGvXr+2JAChAAGQKIYwrM/AUjLyjLXuI8cM1BqCeuuunp66enrrp666YKFPBTHBiHbXD//x",
76
+ "wKA09V+BwgpjLOEohhAAGQEBxuAi+l3ktBMH0AiMgzBNNJMdu1LAALgACAQxx+AY4QYcB9JhlMhufg4Qcjx2EgI3qb6L/gLEYishzK4iVLDDACwVwIRiyAFI",
77
+ "t0o8B9Q9AvuDggQjfABf5WySKH9yB4IChAACAAADACAC8HSCUZXzgxl5DAB+YzHCaYWeRu0ApnTEFCtUrmzaOxAACgAAgFmeHEPhx0AUW0CEaBRuf98DgIGl",
78
+ "l3wgARkDQgABAMHCQkAwHvgE7/eMRcRk/tH/ICmdcUdS8xHJAL1RGI5wmnlHkbtB+oKa66enrp6euunrrp6euZgoMzKeCmMFBnA/wH/0CwEkHAgORwCQgBMc",
79
+ "2AVptTz4YAPhEFYbwtZxXdr8cMfw4aMALpMGcyG5//BwgUjCAqUQIAAQBRBgqGdusD3eDKrNGL7X+AqCTsIlG7+8ArNGRhEHwp5j92g/UFdddPT109PXXT11",
80
+ "8Ph5CVhwFGAS7HSJ/w6QACGrdpD68H9Z1THHutr3c+256+QHorQgEgYsIAAuDAgvAM8MkqcDfXn/zMAZYXkHMv63B6FciyfP65wX0Ig+G+E3TpeCVF7A0w5y",
81
+ "3lsTXuCn9Mw/fhVDpUAVr2Dc0az//VhBU8CAAhT0ANroZEaf8fGokd2/gR7KCrxMOVIerdZopAiV+//XxSLDhcAOUm4GZF9oYzN+hD5BsDZpEQfxtoEdvRdQ",
82
+ "3d44Hy1ENbp4DPyhH//BACYENCAANgYHH4A4eDNd5GJ2np+7yAGKBe4FET3agbObxsWxW7+4B8R+w2TbOepoH73SsfFbMgZL+d8H3nb0uO/V+f1dH/7mfx3Y",
83
+ "H9w4IAIhZoQABoDAs6a4ZF63pxYynhswVkHKb639HS1bDnvl6YKa6XAAAAb/ZQGSIhASv///BFFAAES3xwABH1jgACwhJyfw//grBVA5AMMg4gAEDxAABA8A",
84
+ "AEGGB5lcw8yuYHAAJAOHXMOAASAcOuYyJAAfSbaSTbS//4QXdggCc5OAKCZEAgpJtq4AoJiYENNNtX/xD4Le8IECcJCAEAignHSRGAwpBtq/HSQnBTTDbV/+",
85
+ "H/BYSKAAICXEACPEAAEAsANg6BMQdAmIOAEAdiDgBAHYEQTxgoYAAIACJyfh//giigACkj44AA4lRwABHZk/+vkhJDgJsADaHzZLFHkr6ApmFP9R7d9ATHIk",
86
+ "TLxAmff/WPr4V+aoRv/YDSlLQkR8XUt79py7SGoSql/ggACYYIIhAAiGGwA1DLKcaAegwWbqPVQB+xkmyGu7eXFrm4rYA43A4QcQgBS0Avvx8jf2oepQpnf1",
87
+ "7gBtcu/4AK/WSJ/RaX3+rbfyn37uvMRd3erC0JSMLcdRvu1BzNJuvB3f7fGd2Xc/dFa1jzPmCQxM/9hAAGgA6NCAAEAwAKA8CkINzw42AZjJwhRv54FPJ7Bb",
88
+ "mqIMCiOUgYS1sPHAOYqQYWj+egvrFi1DpB7i/HyUcdjztuD5/uejUs2n63dSrvX66r9NMj3/IAAAvtPszhdxj+uR/mB3WWfxPv6qRaeq977gHlulnISf0itf",
89
+ "KQ4/3wQABsDZoQAAgNgAGY0yj+I5f74reYpbXg/K+mV/f21kw1kXhBPf/U2FrxSK3a8DxI2/2jmn396+PAeN5kefB/2AJeVrCkAOa4jAEHYanQs9EYj7mmWd",
90
+ "BSaneop9enwfJWOPprI69Lu990tJ8S8f/32fenTZv/OCAANAVOBAACA0AApZET6GS21XQGSSCyp5tdovbDquC8w5V7ta9bAPaJsAstZWZZcNrng+K8PS2O0d",
91
+ "+pPetrj3I87P/fSpz+5Ju0/2SMD/GAABigACAhM2mOV/61wY2RKJ7/01MRmStiUfD+NKBAAFwxR4QAAgEgEAGAjLa6wiv7/aFmI2TwEc9qy/37YY0lWZZAQ3",
92
+ "7/pzSGCo9ABW7XghmF+QsTwAT078KRX4bE4IXlvCIymq9I/hTWcBYfvAKPCAI5pgH2POGJY/fb/IX5+M7////BEHxR9HBk6666YKmxTOAAk2km3yT4IFkUIB",
93
+ "IQv4ArTMDGYbavwBUkZgGGKNtQpwAE2mm06adBBZXCAkKf44tkBDNNtX/HBMyAIMWbavFPX73TBLXXT1/s0fHwWAmAnJIiOkQCKn/9wA6NVXsZH0lvQEo4xl",
94
+ "vW+gk/f+WhkPVa1f+wQXCkBWBiQP28dllGf9//gGd31hF/9v/IK4hDJEL6RhJU1v+In/rQMssu/lWz/v6cTYfmgvxb/1ODO8Eq1y3fnwynpw0//8gtvVyq9/",
95
+ "15KAytDvg920PyAfW7MDSQg3/RGXXX3cIAAiBhREIAFAAb5lkeAhaWw/jJYyI2uDO+lT+5Zot4zQRpNxMAbApg2pkAAggu4CGzbjCrJv7uAMhCIkoBxvad8d",
96
+ "i0beg0NqYFJzt1RrtaXZWpR++7jWyfLx1gmYLVHJB//K/n96Wfv+aJUY7eH4dfOhOTTEd3sIAhS2BAAFgDg14BqZhmneOwG2Ms20FNLe3H6YYQhAklcFEU19",
97
+ "vWgB2WBGw/+0Jo7MsizvH/B/zDwkMdk1dy3r9XqqLzj/fcE0S2Bpaz3f9/rvmUlmPJ/1Dn7UB67QX9v558pRVk4yb/obh2OAa/fT4kX/PvPwgEYQmEAAVAMB",
98
+ "xetrm4I/u3jIH0Ga/a8Ysm3L//6xNsPO+DCYeuBzSBL2BRFd2vA1eZSE5S6//XABISFEMP+2QYCET0b+8LUi0Kof+jdFOG+Qa/+rqBHy9amZ/f3P3mu/f/3S",
99
+ "L1WiEOblGZ0xhvfkXafwoMFcEIwOoghmljA3oGT+YNTuqbf3wIgmBIBsDnTs3AHWpB200CH/rIwXdMlSPu/CAAFwABAOYtHDD/DQtNCmEZoXKaHtRfhUr0lU",
100
+ "nBD1//L/7b6h2uuuunm40xo2tPT1109dL+VS8ewWAoDxTUqA/nvzzqSTt/7ebXxMB/KThJ3rNtYIAnDmBAAGAKDzkhf3GIvO/Ssj3MEF7OVB4ILa/lkAAi9z",
101
+ "BT/w8FZaVUdyb79dE6kcj9a/kUzT59YT5Ys7v54tmosdnqC7/fh7DbCaTefbBe/34f7RHw8FkKKkKfKKfpDK7qb/6AjvpULH3v56aqhyNf4KYGIEATgKMtwv",
102
+ "EKf43+CPWOV+EHx/vv1Jn//YKyPrpefnRaUo78e7f4Kga/En0g9UEAJwxgQABkCgoxOBMWiFbt/kgOlyaIkM8CIph+7f6MgACTXKM0FMFauuuuunp66enrrp",
103
+ "666f+H/sEUUfGjWtMFDpgprrrrrp6eunp666euunp66enrrwAAACFUGaIGP8M6ScIAE5yhBREABJRpGHiirI/zpF4aOiwARz6LITDgw/i8V4hyfA8IUzy8qs",
104
+ "IIkQ0JvNG+AB1olNx+VtgvSmRr5z3XUNhgl2SQXvCmtf6BpMrT2Cw2fvrapp46E8//dM2VYNfihWKXDx2i6u6KLp+NVW7wikIFVgBrtfbeclHo5gj2v5/QMA",
105
+ "TRvRqtfQ1ULeXpZ4bgfU0ww8URb/8732ANKxDg/31xdbf/FxEvz/l4cwYJoJQTQIVtfwOASrcwjiOKLqsmdcEIIROT+zDEIgP+g0QHu+0I8GkbLxACRGyGlo",
106
+ "mha9eMSzUPYfNGHgGMAj8GCkAEC2kNz/1xCR3DAnGhQYw2lpg8OEXPCcGsMChy/j+H4cJAEJoaoyG1NBCR/MSC+zdkA///wHZPGmED+H9hs3wAYv1/VeCHHH",
107
+ "I0aNqbwIoCxGSbnOGPjD78/ZuF+I+I/iXNgDnaTz0bO23r0Ca9Z7AqWemh+EPsFfBxAEpiJ9GVWyR1XvnV7NnVe+lzbrubYkygPD8NBorJg/gxTIAkDM7e2C",
108
+ "jSeXwKHAowhDxMJ5EZ1q51UmF+h0JB2lPgAcKbI5DR0GdDCl60D+BBCIb4Dqa7RGX4E2v3/D78VBLd/8uRHTYRwQqn8EM8IznX8BF6r698U8Igh8EP/rXgh8",
109
+ "EOdglkXhkExvxewHQPXc/ECvWs/4311rwQl3vwQ+CGIgAAAAs0EDKaIDrxeCH+l+/////8b4X8L+PyhcFHGmoTiilkPe+UBScRXl/cjvlebzoCIFXwH7y64I",
110
+ "9Lz6A8n+Gq/z2FyYW60AC0AyPU8aegBnwijgl+B/FE5wdrKc+IBmSfo/H7KF+cdHg5ANzhyOjm2BDWhwmQVICISiOnCXvFIRKLpwDrKfE/+8vwtyH4DKg0YG",
111
+ "dB7fpa80UuOhFJwbcMQ3D/JHIDo1L1Xm85RKXhuw/bUvX/kgAAAD1EEBkmiA68sEHgQc5fxj2QLgmwFY4xvTAYzb6EOsAPOyVSotuPvvuj9lXyDm/fgNtONx",
112
+ "Uc3f7kd3WY38ywBxXPO/nwwapr//5R0XUgeO3TL42KTG0HeC3l6u/e0x43KhnvxOXQG8BXuxr09d9A81iD1H+7pHy6SEPjyoqYppdHX/0kvhVE2+2AFFLxFJ",
113
+ "eCmFv/Wk3t6opAd5zH0UJfTi4vmx4/Z2CO0QwOKj9QLgRL7601+DXngDgr3G6zSCJnxATwgF/9qub/fDPn3L583/QFw1CAAIhqsIAAQBwAyPCMfI0LtrpXs8",
114
+ "RL8djeCl7D9sGX7v2VoxeeeCKOmOW2v/k3HHdULxvAIfHpHKXcXBAJn8JDelh6LVwnKA/2N4NqNdmbxNoHkhb2gfcY+p7wMAAgD6wgABAGABVyRMpYGDxHJq",
115
+ "rQ2H5wNhxJUwdoDk+MLS3zis+QjaeHVxgehxt9kd0i374PTzcy4DXwn3K7Q5nyf2BOP1P5y8RtVnYePAcQhMzrWUb/GwgWl1mK56v/YPwB9e2f0v//KX//L/",
116
+ "/Obyx/0CyAJ2//e/5LLDTsPfhvua1+82YFKX+X7wRLqh32CAlIUILs9FCWhY8XLE78voKBq7Hh7pT9mw7lnfyvzwLcd447b2Y/f1q+PfCR/79vwMNyQAH/rN",
117
+ "zBCzpSN2A3f7AnuFX1n5I7DF9sGxZZ9fBeARf7Pe6UUyo+YNfw1z8Am0jM4797pfDsRHiFDvRw0IS+0Kalge8rOCy+bMNLGF5Lx/wpGOvQf/FmyMoD9Uon/1",
118
+ "pQYHhBZjakeXiVrO8ofFeZ/9jpu2lokv/mDmVx6D5MRx1p1QH//ir16u3fcqjAqb/ev7f9r22BvfMy76DseDmXGYQ+Hngf61AO1S87WStd9391BIQyQgEECF",
119
+ "TCPaGv/ciYpfgxuj4dsomPycg89+Ng04y9b8Aeg5Jb9Ev79TfI6GZB43zWQGCIZ4DSwR131L/dcvp/QH+2XqE67GigO6v2+HKM3XB9dT9a8D/0eBhBkBYAsP",
120
+ "MUsAxu/0yftFax2OAsLAGhlgpDp4Gz2ZzDeKA1/qTRzss/f/4IAAgARjzi1vJeT/+eHc/HGh2EfHsFgKEW5/edb8b4YnbQH8dduAiYMwQAEcStMftGj5voxD",
121
+ "i5kwhUfNyzvusMlqUHiGB0dv+vRFh8bbwVwHYJ13a/n/+wVFqtirq5vf+gmMw1gNEBsrO3CXQGIgNsCDO/5S//wASETI4CcX6sdvwStgde3kyl+XxY+vDJKL",
122
+ "a+nPAUSY4Q19earabnnf/KX9Gtog/xcFMWWfz8FMAAACsUGaQGP8N1rA68PUJK98JnlbFAMD/gj7QruScb4AKJn6WUZ7v3Bd440qV3YBdpa/SvI9gCDIQJxx",
123
+ "EYl+pXCI5S6VcCNb4l3//AYFOeTFaYF7fwpYa06AwGtzUAmbqNcgSPL+fK8s/wGTiW3/z6UXPJt1XeFuDG1L/n/nfdrhpbtztvk7mQE3BW+6echVvosWL+Zc",
124
+ "pO83l4cwOgLIIdAWQAIhW1wOAklzgcBETcwQ4jguKq1Vf+ggggEQWiwHtPgfGOW/h7zGgIHCpu6UG2glbQRCU18Doi3PNGH8NQQ/YMEkF4Hhxl69AwChEMEF",
125
+ "mhGHrUDkcMsjAktNJwvJMcGYpQbAxOCGjQoTMg3sVBmuK0dkB3qyWGnwy6CIQByEAuCT8ACzsT5NVc6CP/vwBEZ8K8ZxPoWN/kqmzAbW6j8s8ytT+1glOWon",
126
+ "k91NBftf7DZvgVBSZb+t/vB89/l4vq+zrlHoT+33oDbvH85lv5dweeRRGWbhfg0mgKJoCpNAUTQeaIAJsfBC1QIWA2JyhdMMRuQLpmgI+EB9hvyDQog+B4Po",
127
+ "BAAEeILgMIvRAS1XvGYrRga1XvI1em5C/TYh4KghoGAQFwRFe7pFNj8QEdQUmvuDgghHA8GdBhE/81pYQgCQFCAAQAhAN4AlXbDRNU4Wf4AFzh28iHL1DPAZ",
128
+ "6dXwxpdNH//jdoue6S+EwQ4ihDkZJYeMkv1Rk00CzN8cePQ/isGzZbxrOLjTCYgH67gLOVYJCFL5T6K4RBN+XJbe752CuZ4RhYFFI9Kk0FEPdAgr+AxLFrS8",
129
+ "eYmdMTxcCBCp5MyYL6RezFvsEIRCFWOEOwhCARRD2whCAR4EEGMJF8IQj/L/hD7CEIghDWA1SdLg4MACYAHOZGVrcbvwAO2jT5y078vggCIQCP7CEIBEvVZ2",
130
+ "CeIgAAABQUEDKaQDrxT4RDQJAEymjrUH8BYBMAB/Mfkir5kkOABJEvySbfDsEEI2RV5f8If7PAgEzNDL9BEI+X/BAEAjxsEcQjSES+EP+X4bwj8v46EPwgEQ",
131
+ "yCCA60u6+AMuu5//e/++EdYRCMJcM4D1vuvgBifuv/+3/6wj2EIQCKMS2EIQCOwhCARhJ4R7CEI9hCEaJKOxYX40yHbCNs11EOtWBAejhgtw0WBNwrlwlVeh",
132
+ "uaAKbsxO3wezspN189ZRGFi4bxVEywzN9z1UI+7gLeEJ+R+6M3v6kAq/yWY7ZP8HmEq2XLffb8v4lYUYX4DFXa9ReA6/4DzZh3Z/1Qgh/Mx550WwOETPqwlw",
133
+ "72wDijtNV/TS/edYW5tx96Irw0UyPAaNN1dARPRVylc2VyF/YAoVNmD+riuFgV/Z3lHymEsRLb7jyQAAA4ZBAZJpAOvLBB4EHOX8YsNDQuCbACSW91lhmL5T",
134
+ "HFVgFKpLZelirvqH8VdAn5/8N3mTFJNN/66ObkzZBD3giiY8AdbVTt8JmvfjYd4DnMm3kwvv//UzISyxf//2AIb/8B3jgy7UB27OtjR9RubdUKaby4tv/6gv",
135
+ "W9YX7UB6aFRfuz/70PFrV//7URTBJ9e2tZlSD3iTXZ588gqAOTMUubSeA83lzL3BzYrqvshFHSyABQGbdLqfNf+nbptge4QBxKZmBvd0FuRvUY3gb9oFtqqQ",
136
+ "fDGEaudvP0/sCm8CAARu8IAAQAwAjlt/IZ0pkTFL8hVG5xA72SCCv5pwg2yCkSLvBr9KFZt1L9jCMlh35iEBv6wNTaGoaFRcmqyg1cBc1TePXX5lnWBvvF20",
137
+ "Ba+Q7xn5oFMil0ZTtXNPfHY18OfL5HrcvY0tr3/iQZ5zm7/v4OX3FvsPUp8GzAlrdcZW9u644P+/kDdhBnwE+19tmdr9HrFfjP3/4ED+M+7D5e/ylv/B+AMI",
138
+ "Se277/6jcNixpJg4derQ3r///lL//l//nN7Lf/QLBHJ0qDtr33WF4qpLrKd7WnRx3hc//57BMppPzggCcxwguzwcr+YRb+p+IkjxZ+XxEcxM5AYEoHM9s/qq",
139
+ "992D7li2+eo5qa1fao71Qq+/dAkzH3GEbtwHd0EjnrH6Q9zxYvQTtmmhNfAlax+Ot4ntpSv/ZSl4A7qajIr//+83lEX0L/Albh7/WpuwNKYSquAX7R9jKVIu",
140
+ "fW8VH/wJ8TPbOohIZjllkEWv7+ERioCAIUJaBRKxtTaGfPXRzu7wKmwxBtTkn6NMId/vXMlHJde2Dl9kXKPD2u7xZ1uR3T8yeeH1YkYYHdVm7DsoYsxb9Yj7",
141
+ "Ox6wcNDWBG3n/Y829Otu693AjwB5dd9LfZ/71L76E4d4y2pUINQ9PqeAYWMT3vH8/zuCAn6L6G+GVEBLD/0sO6MHUtx3lBq7pyeD0QMjTvKEA6gOs/ef9+P/",
142
+ "/nh3PxyrDQKDp6wI5yfH7+qQ8aGBgopM/8QKz+NHr+Y1ccPiHBWcD+rr/3/95i+/H4NN5lG/1P8d9WDZBEWwKMJV7H+3KxzQZs78/94WFBqEbN52N2uR3XWv",
143
+ "5/b1Vn///Gvg0S7kNo+COUuql6/vy+f1hkxLAmks4/NwAMfSA1vRQALbpeb7p/6D31xF0t6/8ewU0n3vn8/BTAAAAs5BmmBT/BhVdt2RYDpTKbxwmn3pP4KO",
144
+ "O5U8uWsv4nhkIhzABfnWzIE5t2ABzo4jMW1edCyMhobUwCIB/4EdrfOl8RF0wiOG8ADGKegaGqRf/wzmAFmH2q7xuthz/WB/vqccAjUgImaMIABEyVFF9SWm",
145
+ "NpgJO/7Ll3RpMz391edlsBg6D1a+4N8Sdj5/WH5EhQdXp7/Sxpi8dqVRP7BMsI45gSp+d88D/JFSP0I5LQWx3zwHg6q9eXzuxULcGT+6rf+d+l/8Iw0ef373",
146
+ "yA7bThdObfPIQl1mWlXee/Bc1sNffjzzMIwjDeDBNBKCaBCEyLFS4HACdbmIL+O5gciS5PleX8ChhlQSnHXhYA/uXIxl8ChCHBhDGDAErLhqSHSKk0F3QM5e",
147
+ "hoYcRgMSmjTXXqwIIIcOIP///TT00xFofbbPr9Fs+woyyRl+FwSf8bdUAJLrHISSuVN+401AkEiUrJf/5ICP7F4AxtV7d/r8AksAbU/+lr6YQX4f2GzfAEQU",
148
+ "mWfy3++WYybWQ+O7fo+LRsjX/v98AIS/q1zGAfMzuzA7y+HhzQjC5cDoI6Cw6COgviCU2ALKM92ehwdmcSSvYEn2ab3DfRpvfC3gwBMglAEyDjWIAnxlpC5v",
149
+ "bKmhc3hVsLFOQ1V75Xg8UxTVXvEQJURaHs+WxW01gQI0juDY2Q88xDj4AhewSGStX3Y5FvFAANw+gIALnGbgm8v54fvm7llgJ92d7+HBMiAIc021TRGo4R+v",
150
+ "XvwcECEd8HACKgkAJgPgNVOJd47Ay8HbBlBWZCT7Q9gKUUBQgRYIb1abNjjiEcQQdiBI641nEBnQSAsP9NP4TgOsBZhy/4IHzvCNbb8NlwE0hu1akFpUgBQq",
151
+ "bwAV5khxJ2/8//AFpIaOw2p+JwQ+CFXeH/D/gh8EOdgnlYQ4ZBQwMg9L74VJBieCay75//zfoQPxnvBCteCHwQxMAAAA7kEDKaYD7xWCHRvz//+G+pqFTgBF",
152
+ "86cn37Qz////8Z5jvn8/H+ug0MYqhXwgX/w0NC47CRp6BbhuQf5yL34HYkCWAe2g4+fJR4Scb6rUAD/ovLrv/uX7xomgtxL+AqUX87qENp2B+1EDUHfSH6A+",
153
+ "2AwiQORFkIm1PaHXn3beAWuMhtT+CSexfue2+X98wVC/CUSDEkSGuEbUf94xakMz2wy2B9g4bSVge+4RLMETeySIkYA5ZGnPIc/Lg0fv2Xwi66C3BG+BtAbc",
154
+ "Zm0pguFGD3+BUpqUHDfbfbwLhachLS4x4vh8pSwpDeS1I3fHv4AAAAOkQQGSaYD7ywQcQs5f58UEQuCbADWWzMifqQs8OXWC7qNTLdd6cABldE0Ay8BgVB7e",
155
+ "tX//dQiQJavK/V9CteAGL2uY/op17yn+ZHCicy/QwxXYd4B82KIXKn54XW9Tg/ZrGwAYC72hxtZZqx2WErD9tTGK/3TISKRj/smiqCV9vX3r0PB9Sqodv0Iz",
156
+ "GIH2nFFhlA4ufSB3rRxgLNo/I/ZQB//xDg/A5fFsFU9IPZ7YHeIa/7A9DexgotZIOXA0g3QAcZT6T3QS/zA8xIt+grkna8C/unE46gpHxQH6f/ty4uO/zGfb",
157
+ "tHbA4SWSx/apWBBQUKHeAxefS7a3BWAA3bfRj98yq1nfb7UrdZQgZsfwOLgs3b1DvkF7LZEysc5mAJ0tVQFX5DjyKjbkN9T4Fad2LtSzofvmxH/qBnTyV5CJ",
158
+ "/wfIHpolmflpnOuzfrGz/P+YXvU7qDjK1fCJPHDZIkft/+1SUwKdvzLlGqttaS4/A1+o/P+FocaZP97ndfU6//8Fs/36V//vdziV1N6PsN28P/X8rBx8Qs9w",
159
+ "0IBEfWmsBOf//fg5sROetDkm8guQm2SSi/8f/DS4gdY3qf0DAny+LGKowcHuYmNvb8R//5WU0SL88/6/kp/4KiCE24UzxTLm/7vjrV9VKo5PxMaHxYzvpTH/",
160
+ "WwnVed40HtPAhLZgOLpc8Xn/K1Lo+DdcfXE9J3tAOzTSjvf+C8FEu/tT2TYrdRYptDG8JHuA+/wAzevT//EBCz9J72kdV97++Z28mp/PErFHuldqdLdbu7I9",
161
+ "eBA/IWXVueqCIYcoIAg4LNDJidtYFypt+/rN8IDTjHetx7eAgr+E9NxvSM3v9g9w9Udl4/YRMv2Bf4CR7Z1vun8AdUuzu+wtsDWg7+24v9PJrsD3qDpAeBjd",
162
+ "81+LHkHKd5KRyPAIqpNxpRLZZM66DHjotn+3ikwKMhXLUvxuXh3lDz4ulEft9c40bjntyqdo6oz3Jgf6DhdxDKo/XcnmBFB4O4bcIsqNQq+INobU0y5bzmuv",
163
+ "ZC/7oOxKzi1ktmef/54dz8cX8NE8NAoKsvgNM7ZfZ+3xJ6kWE6koRGezT5fgTW/J3Kb781xf/EOCstZfcq//dcy0rSp/+3NQ287FuMv/Bx82nv98gZw+P/0Z",
164
+ "7N/AgLv/3//Yah+t6QFzrgdF9S/3wdwGiFxtW/WPO4Nq8QAVleU3+fyIMkR3wDZsEVsEV+4DQ29oT+J/+bsX6Cnv8ddff/X/gsgAAAKTQZqAU/zyqcN2QHfc",
165
+ "Zoifz8uYcMe/kL4i55I3gB7GiH2SnvwAXrUyMto17E+7A9vfgAXfsiQL3gp/v9BBM7W4enynappiX4vCNe+83Qosf/RRbaRsiDiBapdX/kv+b2+fCKQgVSA0",
166
+ "BgBC+n69xK6jmNC6RJdQAXjd6G03yhPRaOt/nhuB6RpwMHqire33udh0VCDg/31xdbf/4sSRe/PMwjCMMYHEAg6CHEAg6AOQDDoMOQDDoMQBIhCawOIhbgeE",
167
+ "JcwPMVwOmO5gghuBwQYQgw4IMIQYRJmKXhxDFueVXcz8F5S8UenJ1CSd/Cd8V17/0Bg4MDvHWWBjPigLsvFCO41RDFufJoE6/z3C8m1gwCII/c/rWDHhBB+I",
168
+ "tDznMnMppg/0f7QZxIcBJAAdESIxvCvBaCEMBEK3fwBie00/eoP4AL50nHkf/9TCA/C32GzfAGlhlIlav6p/q6ffB5U/F/HyP/O8UIJfhNuTbxuECr+/djPO",
169
+ "MEOZ3hGFvBgmgygmg+iV+AozSNkme8O9JEiTPefgiOov9wKEPRWKz4Aupg1NK1CsVskbIrDZInmFsvBOCdNbL4dl2Sty9HeWXwYhCEAMEChBQYsAYoA4Ongo",
170
+ "NzxyxtCCSmgIYAHHodECRq+XtXwz8GCcTTTTAIG6t+55WgNAgGIRDFQNf7KR7mv+BM3Lcm9qz/g9qIwR9o/eIdBGfF/x991D7l8I8IQjDZQGpMqXhl4V3AFP",
171
+ "L9az+AFoKT9iS0vfeYXBPRrQQWREQxLUS/GJaiX+CEI6CIR0CTtBfhc4cUglWXvfox/BZ7H7NghRoPBDj2CWkveMXNRczPCMMgmlAXQRdfIRRL+DeUYRb93r",
172
+ "/i19da8EK14IVMnghzwTxMAAAAEVQQMpqAPvE4If/Hgmd9333rHfiyu7vd3/////+M5Lveh3Nd+1wT9VVVV2sQEITL//U0sMSOfv/oR1HYK4R9dAmLR5f7xw",
173
+ "VC/ZgxhJAEn/EH+3I596t5ruKzEfpM6qkw8AX7jxKOmiAKpXbTEdf2xjC3FWgUY65sX6rqwU+ulaP/7jy6fgfWxD6taEBlxBOCFrzkiSHqWAS8lnpJ99EX2x",
174
+ "0RC/+d+eF+ASt1pp1EVTpzI4cTO/HD1Afrkj95kezwTQsS8BJ+rfGsOMmIAFzL6nvUoPd5H+bt+4IgtzbhVQWxwGv5C1c4ViOvMyb7+nv9jKVPp/fbGbptF0",
175
+ "iQG6mrVK87fHqdulwXfcCmVf/ufCLBPX3viFqAAAA9xBAZJqAPvI8EHELRf8EPmL+JeVBcE2AMIq5z9/QDi3qh9n8QRGZNAKofuv4cgT/Ui4qP//cAyxy7/4",
176
+ "uTfutoh+c62XsPTOBC9WWs/M/5ZCFtniJ7OyyXxClQjDvEIeJbAP8/qsNZAHu070ad5fChoHSRfYGohKg2bXj8PiKRh+3ao1/+UHk7lRSE/20qTijzE7+K4G",
177
+ "n8YETX79G1LNmv7aAqT0aEqe/RNk416DsLkDEPTZtFtmxjsD/2QGo/Yaf73ScHMX+R2oesfvDFtUCn2k3wFNWB9ba2rAygL041QiaGHWVoBPwTqlj1QuNJBm",
178
+ "34SFeHgGMGzZSt+7oO+UrH3aAm99h+x1AD/HQCYMZ/cxzvTf9Hfwnb++nzCbrQHHylX12n/ThGr/69ofz1d5+gJwBD7fQU76buIORj77Qwr5NG4/dJMSTqkK",
179
+ "6WpLaLQpRZcHsoev81N/Jgvj7Mc4r9O0Bnf8CB/oKXit5n7+G3h3nuWHPr+lKNqsa7Ly5GaXmTtG8jJXOvTa+nu+8ajo1HZ8tQ2JMgecMB16pDRCw///I8EG",
180
+ "2CHzUQNCAekY8yxIIrUFxmS0HyeFDtiUgfiqAZlTOR9QASQYfbT7X4S/h/h/+d+X7ppCw91SxIyXrYXddlJGiWQ/9PSLb3jfj4/M9upxt3fk2/O+/t4SRGqv",
181
+ "0LXK6g4ceJW5O0za+A38tF6EbuJ901NeAHu/97jqRUnyEg3HPtMr+AQalWKtff38psZRFTmEv0SDIANfTzatAS/u3/2n9qMD/7zbko5MTkyDb12x/vNlzzq8",
182
+ "fYus4Xc9bqA9H99/CIMKQEAEDhZQDZidsFMqP/If+35DS/tBhKBkFIOyvhDNkPfeI+PdbUXOJU/7h1nh62x8jcXL5eOz6vgb1D34ljuBYQPMWAKNaRRhdViN",
183
+ "THu4PunI6Qrs4BDTLQkmmsANn7/dvQVc9kj79qLL0vgEaHXWdVft6pCCA70S/yZ6migo2BN18h8ssce+w/kCaj/tYP/N/b+sX4zOyhyEJ0CH0qc5o/dT704/",
184
+ "/HvATV6MjdbME3h/2CblIda2+g+wyLDkHVhY22qGz/XNTv/+eHc/HKKw0CiQ2BubFqY+ZxckKE3vkQGvpBXYRMjjRrFO+v8JqQelG5f/1/sWLJDJWOqcdXqD",
185
+ "SdWH+4PE9Qo9vk/mTjB0y/H/gkymLOrX/m8HEf9AsikcvbD/j4Hap2Bv/+mnRdfqbougP1cEBKQ4QABQFMPjC1IOf0/BWTdIgQPT3fsglwyRvuch8IX8fE0y",
186
+ "O9HfEgHQLdNBnW/5C3xWFqd/4RYKaJV73vn8/BTAAAADGEGaoFP9fSl8THehvAEAqyTVY9+AFFahkr20GjO+h/3ngcQAQIghOIRCGrUUhGpTvqqhMP+QlP/H",
187
+ "+bs+3XXzxck8MBcBSwlqjougHFcsK06uUxAStZ3lAANarCe77fOTbJm+dnhbgTf2pf9/d+trFYVvdv+3ydpkATcHb7p5yFX+ixYv84o1msvDmDAEiCUASIAh",
188
+ "IjAR4HIYlzgxVzCMEe92aCHDeB4DGQQ8BjIAIcITJYHtXPA4IhNzPw6V3W9xRqqrYwEFbe8/Dx1HoC9ghOcKkgO+0q0EHX/Mk+fsfCEaHwaWgLWRFYdulBpa",
189
+ "AtZEVh26VsZb6xluOGOMAaj9OIaj9OIUjIuZupEjIuZuoCehNyI9CbkCWaOBMXZo4E2Yf/w0HASf8AIQgSUrh8MN2ocWBQRtLDbXwHpgofXzB4dgKmBILYQm",
190
+ "verX0F/NU7I/68C77dZI2oKpNPxfO/9TQ/X+w2b4GPluvk+/794KTLP5b/fI8WjRk/92+QgXQxXA1jI9NNzj7/id+eaEIX4MASIMoAkQfEuwBa0q89HSkt5p",
191
+ "6HLW0C1t4RjfBpNAHIAYKg8GhZAVJoA5ADBUH5ULIOIBkcACiRkTNm9M6b9EnZMmb2rbfofiZ52vBsGu7ds8vB7tnFa9MgxnbPnl4/BKUnnVYD9lxQERkdAE",
192
+ "MvggBACGDAIggh/2XD4WDxQGKAwEMbO1amBNkNoyKtGDMI2lnHZpgDG8otr+kvhOBAghCIfCIdJBibLpB4f85zcVltzAIoP/7kU9tlX80BHAADXk8GAqyAb5",
193
+ "Ab2tX1fvASNVPn/8GLYXJgBiPaHKbnhNHgso6gJptCLn/fg+Mno7AGDOVIbn/+wMEChDHFMK2W6NAb/2hgNy0IK6Vf/ppiHYRhbAe2ulAEiCDqa7hp4eAx0f",
194
+ "RAgUZG74F7+HQfQRhCGywE6klWr5RA3bwEvt1W/wAL0Zk4SpusfeYXBPRoAcQvBCEfBCgVJ1wQoT2oIRE9/h/BD/BCiXeCHFwTxikYfz+foILHGIIJeKLFF/",
195
+ "kDzv+jV9a8EKJl4Ic7BTFQAAAR1BAymqA+8Q+CH/wRAoWutY6sY+Lu+7/+v////4v/J3ejCMwm9+0ZvflzvnYJ8/n47/QJGy+EF46juGdh/Pwg8+ugUdrCFc",
196
+ "vr0cuQL8wGAdXEiAHGdGB9sQI8qIfj9dQ8OwsADJTah6L8YCV9UiEp6Sb6f/xYTLhYuAt7+gP2lRYNM3qryXnuMS3th9m1xDPA4Lqcw+aZEWU4Br7/affIV6",
197
+ "OyswvvVr9++X/7C/CMFAyIJGPI2UAw3XV/dKnklTn39QYu22n72Po/xnVCE4gEuCiKtwDzdd7+b+AHeKUokI2oICT7XOlt//3y+LBBrhYnhFoN8ebEB6GuUd",
198
+ "/P+O4t/e7cg9Q7UIAvss2+UXXMUt7r7m+EUCmOkcbbbbfuAAAAOoQQGSaoD7yPBx/iFy/4IfMX8dynC4JsAVGRPjjfALn1pO3d//gbWFU6TSM26lxBLmyu//",
199
+ "+IMgR5IhI+6vsSYWdyolEPf/3/wAvb333fnAEj/ed+S+PTaPh3guzuyHs/cjA+nW7gAjOpUWe65eCodmJrFr5X15nvYAGBJmYjQ/b1beKtbP6f5rPZ45saU/",
200
+ "/vaIu9UOv+9MaDGlgRu/nF9hWTqHmDCRoIwQjh/qvtn+3jacQ8wOX5BR8qD0Io/ctn6s3fcti+GjTYv7/MzjfpIDC2zocXOdI3BxruQb332kC/kOVP8pdVi6",
201
+ "jG7F+Bi2qNHT/I16nuv33haEktl5/xYKYIkHeA6u1Q7oPwBM3ph9/znvrkIKyhv0TWMzCHf0n9a+eAOP2BPiWv5Z3jdxSvAKDXDgYycOn+GADsoHIjXf7mBZ",
202
+ "RbYnWxf/+w5fHoYXig9rx9O779FsinzlDOPT5uf/EScBXVfh2Kn4XXOtBw799xGey+llKXmjBzdnS2kbR///k2m8f/P8G8l6Wv//75UFhONnC0bNNAsaNqxw",
203
+ "b/nfZD/zP8QuIXYIfM3YWDQgHjidLKWiP6+oiSfhu2d/1ANkl/7BUz93Wcm96BQ3//wIsmBmcF1cOSNP9/P9oBoo4+v8vqHLigmHrgIs79Qud7ZNWzyxv8ko",
204
+ "qbUh/3bP3S9iH9b+MUxri88SPR/8ONqAuXMn/g/K9cyzveChy/nrP3sqtHPwFv9/KjuvHRRCPjRVgEcP/9L/81glYNId4HuvA3tdRiftX6gv9e8OP/jhm72b",
205
+ "LAtvvODvV4gsd+v2a32BPDQm3/dO//MiPqTsoMLV6t//sMxaCMYWnM/qshd2if1tv7hy/I7jBQeqsb16cXPkF7IS3gXZWuwzryHs2SSw/oI1/gb+wDr13B+P",
206
+ "ybNrAf/mRqT1Y/+MHEFi4OUMPb18PdvHUq0iy7ojdpeNB5F73l+6COw72jwbgzg43dH/uPIqDQ45ockA2Gsaterc5zf1z9q4/92//5gHskJ87IMneyfzktiv",
207
+ "pnzyDUbOmj7g8TDItJWPvlbHKo/31g0//hB6QaGCL6aGX6asmBt6LkO0q6ncVqkfD5/hZWNfbT19/sSTDJQzqn9f/znH58gP/pUDN/8H+fQnXBzRwAcThhT/",
208
+ "7miHrUP9H/l/N8NRC7tjvJPhqgP9htvH6q/UDdU9H79X8zD8iv8/94iGSMPT2NfR9NMgO2Lh/czX/z/69eETeTX/lZxi9EVX/BZAAAAC9EGawFP89eGJ8fIX",
209
+ "8Idwv4AWWiM1nd/wPV2iCo8W/8w6JGAYM8LQZzrxeAZ3Ic/bA4AIQPaiazf/8vhGLpBcMDeCaNMFz71Ht9+AF42WyNN1sGEfq5/f39ljpXcWLRpd/hlAVXZL",
210
+ "W3/tuLTA1cvP3OoZl6yn791LoxKvBSNXpXjDRXZrq0OojpooVb9U9Qb6v3EmDN84JSMImyxKujv74i5KhtRVuK2l+fQ8FOr31GmxULcCernuq/7vwn/CMNHn",
211
+ "83e+QFNtFC6c2+eQhPWZaq7z34X0xr7rz3mfAk5f8EIEj/////+DAuP5W0K1wsHUmusa3obruOsCBDZ3u4hKIuAasmeHQbxg/JXu8FcVndMeTmH+H9ArD5s4",
212
+ "gmhAomEwsHS0HS0VZa2hbwuCb/gAuTf11n7+dCbZY0dEXajdYIxhK1GEA//ADn91Hrq/4AoKibZwdXsnw8s2kmbU3neEQJAW8HIfg5D+JogUgZ2xUIazYoEA",
213
+ "HaH2Z3SvdIOLJidnSvfOwV5/O+d8/n8v4S4IAiDAEywXosgcSyKPTrHPRMal6dAQYRhIkHXm78yxDAQ8NDrKpswYDWQeGrKy/EREQQimBZTeCG3cWwIhiaxU",
214
+ "LzNgGALGEBJ9gTFjZBL6oABflZkoiX82ARLkEv/4rB4ZEPggDwCUau44TQEw+vLlVewAaC3kRBrlYyNvRp0OSFj6SEUXtAOIcsCBieF6QcelSaCY3S6Exr/g",
215
+ "DEsWvcMxM0mDL4R4Q4b4G9dC+dLuBX9z/wc0Thkrz1z52CvO+d8/n8XxBCjlvCEgIokc7CMIQSiHfd92wQwQhENwBFNAzHNWr/8dfwCDX6PT//wBJqvR638v",
216
+ "gzhAIj+CITqrbCOCFY5j2RDL2tb3nYJ53hGGQTSpGghRnSQpIhFr6/P+EekwluOHQvzsE+d875/P5/P28JepgQQx7y/9wyj9l/CIIfy+EQQwyEA0ERKHQa8N",
217
+ "+BCKJoJBOoAXABCrN6Ih9fgAZHclM2SDFwAAAhtBAymsA+8RCIIQyCaAmkZirV84kEASK+ov9wfwAOcyatbm4P8v4MsPYIeqiYXBnDta134CamZVqAEgNqAB",
218
+ "kW0RTNkg8ADHS29EjYcvggCAQu+X/CP4LwiUXjR345/////xS85lDCXXz4fl9Qh8hlWsvhOuEJqr44IbHwigSVqqZWCAIBGYuW87BLnfO+fz8bCEgYh495fw",
219
+ "gLCMIhH4cFcBsm6T/4AYzX2v+9p4RCOb/1HCwWkwA0dH7fa9CAAIhSCNvgAOheuYpfmUEBNg54J8/CHIHuH3r4RQgtwjC3u98BNEV2rUODBrfhwAKyMzQmzl",
220
+ "dmD8Mk4CZIbFrUOwtLwAHyow2S1MvUMP4bwEKNmLWr5UA3AS/o+erYhwAHjWYlbdOscMcX9coSC/DsNCaBkSAAg9LC6hJ6em5UsunAJO6T5nwwkbAIyRJ45m",
221
+ "+79h94WLgEX/l/Ov6IIzj5eSTl4He2L3RRIH7dX7v/+EeIJwYqXj9wfBwfGVj5AOlWy2Pe9+wQxQQC/COiRgf2jL9ADG/WMRQGrslKNvlGH/ZvCvgguqQIfc",
222
+ "8h1nN1X6gCRsmmB0DZjYqWPVaGsLsIQtwFZrN1gP7s3CkGaYLsMd+I8FGqrYjfzuZedAb4RLiNHCXEh2nqzUCN0kxpiV2vXDJOAhjZ2rUdAO+AA8byCVZF6Z",
223
+ "gw/hvATRO7Vq+CmBv/DTPVYcAB8nENH8XJWDgAAABARBAZJrAPvJw2CriHiyA3AHHSbz34A1dEz573w5wdfipAH4A6ybWe4AxXI2VV4xfwRdEC5cAEH1+r//",
224
+ "6MItV4+O/wuQSTMXhzvbbGiFmNanqD7MchnAf/iSn5oH6J7qZpwBV6pn32+CfZ95y+CMShDNh3gqp6k80fvAP4kF7KWZ+9wAq3uzs9yj82W0nx4DUON+OfAY",
225
+ "+0VLn//dTZVIoXP/NEr4ZpL1J/JUiUmleQxYajYSsGw1cyshG5ab75tANxJZbn33Ta1vsHL52QmoehPT7vn+nT/LHGr148Bf9l9oBdIc05UbMr8wD3dpgf7I",
226
+ "b9aX+FT3ATmedj+QgASpoao4+w8KceEfvT59lVoyii//7o1cvu+bwU3msyP3rw7zP3ego0zvCCJQ5pGP2uE34cq9YTXbwwxiDVYff975fXb+GDej+dL3ICbJ",
227
+ "IIJL2WAW6765wrk6Ou9DV3WNfoHD5LVj2/HUMxInhUs+/Ycvnm8aHp8RXoYl05CO7nRHBor99QFH2hxm93v/Ue0b5YqncPNgb3z5wOC3qG4602rMnEpR0xWb",
228
+ "TL//o2mpZvPB9XT3ulXhYTmQJkRvc3AJgRoKDdTk/dhff///k4WFQe/B78Hv4EEgICxAiLcwG3Rp895AghbmAzKyNHVe98Lwdfg6/B1/gUJAUC0giNcgNciR",
229
+ "c9IIIS5AZVIiRVXjPZQ1BYr33m2rq/ZAOf+eNr/78HRx/IlyPutqs/Flfz//6HTEvujrv9Oh1/l+QKeID1xQvCyAUV2CbJJScHe9/j6VFefT9x++t2ftIcg3",
230
+ "hBugPv8dF/LzQ5uXn4bIN8f5vwNRhMo7C7/IwMT3Sar0366XgITcnI++l9yKSw7wIXsPugwnZ+f8N7U68Cd0fA/Ab5Af7qwKG8ZWFfaPi8z/1QFFfJtyZM7M",
231
+ "MyAHX7z5WeRfroYJc1GVORNPZP3r6B52HsLzdR/87768CWscVpZJj4lG4Dd37DzQl072YW3Qf5VTmh/kT4AgmxwEFgg9i8hJODIN69tg0Nbori7UM8v2eDyu",
232
+ "ch1///67hAO8E3juySoFXQHG6+27841vc/u6Y/5kJZ0h7za2dX/mR9+HQO6duYjNWcd5H6QrTn+WnITHEey5un/whDI04BTMRecoPej3U3+d//zw7n455IaB",
233
+ "RIMz/EIZQPBAjH1PpDz1SKALe7hfN+DwbPvvNVr/CAZK2LSgN9izOzTIOHNGC7Ez+Hp03llNBLNhAJSlbhH2l/5//A/ij7ETBFQP/Q3hqBi7wgL/WBXpNqh8",
234
+ "3znqQykufDxBdYQXZ4DNc7P/8/B3ZIPIVzr//X7UIwyRk/2A64jcsD/buYeX+AH1RIkB1ObD7tclEnx/4uCmCRizP5+CmAAAAgJBmuBTzF9dyRvASDdgafaB",
235
+ "Hoqbj9X23fYDu0FeFJ/lqHu/ftbSIC94KaV/oIJnJLB4bf7ymoyeHQT333TJ0Vgarjh2JLQ0ORdRHTSdH4bqq94QUhAqkBmD4AxZlvb60aJ6e5hqXfiF0AJo",
236
+ "3kPTXfTyoLLL0tw3AypGnAweqKv997lsOnIQ4P99eVWNf22JLL1nlhH/QQhHOuCELFxnLoo4gxjNglYu9Sn0KJs3gYJziABEiAvHgzMdBGZ4TM4EzIhUIghD",
237
+ "Rv+AFO5fQ+PwvoVyf9Ji+98v/BNhY3zYCUpC6WJVcBu7f+v++zTvCs7wjW3CObh8tFHspQgeLAA/gwBIyyoEjIsAAxAQEJKNPbA1qnxVgS3JZzy+Bj4oIqCk",
238
+ "jiXMUGD3kHXmCbyf70wTY/wiEEP4CFGxC1q55F8HCDkXi4GLIDB5ACf08XMzl9YG1oKlwAGJ7p4/Mxy+QE5U0BdDlNCGAACh7G+AmpjatX1fWAAX5WYtEy/o",
239
+ "AISogkGAASgCwgAWARYqqph5ilmRjTCN+f4AGC3kUzRkZGS0WPIXVBUTyngPGLSoUvD8sZ/AgFtoJf8B6S74oiUwLdNZqDQR349gAjvy/Ie8BgakqKS763t7",
240
+ "NtnwQopxVz3//hpFbPghDMNyRfXwJ3ofsQ4v8EIKDjqR+543eEveCHwQ+CHPBDFwAAABIUEDKa4D7zvgh/9AmH3wSb3r5b3/iYJ4R5AUXnxqCE0EInd4x4If",
241
+ "BDCPrgkJyY31bwQgkKq6QJ3zsEMI+jYY4/0ODTfd/WGgQeBwA8MovDoRiuOfO7wQod3ghBJ3eLwQxxf1xQwL+GkkQBV3wv+anG/8TdeBMmYl/6O+xMY6aK0f",
242
+ "GEV2NAeKvf952CdYW5XhrNe9YT/u9BinXB/2sPDpiU1eA3VIeIrodqvAUa5fd8vxqNcQ7rP194UDwXLgj8n9NGD+EZ8O9Ac/p8j/cAL3/5x8L3peXFlw9HAf",
243
+ "/6ncgIv6O3PCgBt9uyl/7BDwsTMWDdS4T0XoH5A41LgPtIvWBp+114++Z56RxfVON7cmVr6Ps6T0V9/6vXUzfDmtVw0tz/AAAAPwQQGSa4D7ycNgowPDIgDo",
244
+ "IiAJ6CJGeBa3enwDnAxFBdO1hGHMDoEMglFoDQiZlwBCPJLlQd3gYAE7tYYv4e4kJhfgEh4mYcKtA3dIUv7zP/d4G+TH7meER77qHGNG2lj+u8DG1TPOwCnf",
245
+ "aZ1oX3uhfuWHYrKAXrjOZvH1igDAzc28fYfQd4Vq2xol3yD7uSwM/4AH0087rR31WB6+76DTYDbsj1lufVN/vpN9p2Pvv5uWRD8XZH/2Eth2u76V//uzoNXM",
246
+ "vXYuRag/8Wgb2O3z43HAKhZEl2f9/DAD1/f98B+HrLpHAQT2YsoQ87kerJal5fA3ycBk4w76cWQnV4H3tZopZSQhM18MTHz7hoGfEv/nzyw0vEZ3D/6sACvv",
247
+ "vtd/Yq8alT8A6GtriyP1vl+UYRqw79wwQSPSA6AUAy67Y4/27sO72AAtfnAbp9oRVNfDd1UWmOQxORC8vW+BTPk/vh29TKR8kZDu41/9R34tvv+7sPGoPZM/",
248
+ "01unH4EB34QPvN9b+L7+6PbXaND4ea6yHeiKhqQ/4BZ+tNe/ecr2/ptml4RAtJXnS/dixanGqMAkaTVef/rhoRA4Qc9lwCQgWdoAb2WJXT7X4AORBkHotxj9",
249
+ "2vkQIOG4HgxEAdAjIPAuggs78B1srT8Ae5AEM0dadwjC5JRaCUWglFoIdAhkAHmQgAmyAJfcgOBqy9EHdhwCd7kHQEL7WGeZBooCi0PJ/JCyf/WJoNHefnxv",
250
+ "66bF6OSu8jJi1hwslmVf0e+r//SnQeJhNY7dRMu3v+43m2zQvK//3lil/3UfxUd2EzI+7l/D4HzytIKPxneKulikRnwPm8NdV0/twvBHBRb+MFteA+4Ugjrs",
251
+ "yvLfF4CobqtmfOmyh3rCwoYXgB9TwPeIL8tLn/GxO1PxmcQ/29c+6HF0kiLo8ZcwNXxHvVh348oBqeB5A9NCI8R5pbneypaR4pFfCWcrf8wLcgaKHpp7mnGf",
252
+ "FyxxptI7j3wiG8ylJALe/da/6g/dXnzXD2dVgdd1+2BdmwEw3Iuoy5d7qwQ0grl392+BtPknd/5/4X+juN0+XwmUUpLDvTIYJSJ5vwv7j+gNG31FA6jQ14Hk",
253
+ "J42B+yKrguxkUNb+zD3DB3nvmX6OtpiuqPfdDN5bO77Q/DI0hCikieiC+ZZ/uX//whjg0MMEoqTS2JUkyrlFSQE8IjRYDYbKc/PwdgaWVTYpP0ThkqTMEyg7",
254
+ "f8jr3fhxna8NbxcbWwcpf+//TSMUa6Rf/9/+X3GPw1GNZVt8/PR/fV6toESYZhv7OISmpGai34ZhNckt5/mDJBuxXGv+jj73ge4uT1zFJ1w3I5z/nIT+q77f",
255
+ "/BZAAAACVEGbAFPNxvgAUWx/7VpFv3hfY40rV24BRK+v0sUgEEMQQFVsKGIStK4RinLpU6Cd7413//AYYgBakogmzf2AhYTqYGPpwEwKr1oPUrq5wdS74/s3",
256
+ "dAEvCWzozpROemzqu8LcCb+1X/f3fjeKwre7d7b5O0yAJuDt9085C3+S8s19ecU1ms5f8IwQw3g0JUEqEqADtBALsTA6Q7ngcBCG3M64fRZuAgIYE3u94gAC",
257
+ "MhALrB4GwDoExiQsCAWCJwgYLiPwAd5G13vv+IXwNi8GOQb7iAyGM1sRDqwUyn/gBlG5df/7z/gApouzu//9zwsb4I6u+Vn/9t9kOWss3uvvvxyPAa4N/7zz",
258
+ "wlpUPcH35gsjLZuF/BoEiCVAkQcQnLgBztrKMvQ1GTKc8vQjzfs17ft4RjS/A4IIUg7A8MqDDgghSD2HhlQccAUQQFEExpdM8LZZt+sCQ0nmeF9ZN+jemm+e",
259
+ "DUAUYxcfvLw0ZtPnpoD3MXm7y9ghzKHggEQpJ7PPgo18N+B1q6+8doGMfBgTB7wQ5A5AYVl6QOE35wJRrnlBqC6G/FYAimgZjtWpziVqGfl+MR+ud//nzQEM",
260
+ "Ah+xvgJqY2rV9X14SBIBQgACeAJ4KqqYeYpZRrmABkFvIpmjIiMksgCFMuYsvhDhCofKDeyy3AZNHSYOcJNaXwIwgUgJz+Qc9oaUHnWAEdfE2xB4C+x+Tf/I",
261
+ "mXH11tbyvYR7CIa5PX72WbPwiCX5VVVV/4IfBCsfwQnFv8WELCKCoEJfzHh3P4ha6BI5oR0dKr4IfBD4IYyAAAABU0EDKbAD7zB2FAAIrd3dd8STP/oC/gIn",
262
+ "l95++CH/wkENVVf/l7vGwS0YqJ4Q9cYCa73e7v3vWO5f4LxA4QzHvfghzsEMIxI/eIsEDz48vhbiYqC2psWW1rxHGoIdk1XQIYS+9/o7eCFG7wQ+CFEKLOwU",
263
+ "xzxA4LgowEuPJ1CdnlRPdgPhoyYxzCd+u/3P8B7qwrsICXeArjJetxKekLZAB2PFNThI31QsFO1+mqvUGA0JBQFi5DaAwREWjdYas5tZoCAq6dl3iitcfv4o",
264
+ "AySFnTkQTJRUvGrKlav8eRklGCMnjTmRibZ9Q84X46WIibgNQkAbPNdCP5qvDFLv9z4llUfYqwbQ/6tEvKjggfGp4ARWXPlr6BKcq+9+S+wQcihYnW4YoPZK",
265
+ "PG+w/74a+zvAh949GbN62FUaNGg3B3h1ZqBHJHpLZ0r+f66+HhzWp5H46DP6wAAAA+9BAZJsAPvcEHghhsFGB0IyDMgqfhC2N4AT3k2JH9XvawjDmB0CGQdC",
266
+ "7XBLtrvACoZeyqirr1YRyl/GPEBIL8AzugP9xCBZI70gC5hrcX+Ce+7LScX/QKRDy3+tD9/01f2CPEnZ+/+xo4Jp+/zg1zZL42SFKQd4W5fVo66hRppr1/9o",
267
+ "CRqIDedieYP3qFOwYLit4H/5LOLI4PyX/vptpjhcOdyCh33iQH6sP+3xkae+BZsIACI95Q+DvMswYD7QnzueGpdkJT/a+dfwF4mNNQyHuDl92Vpw9GXP6H/2",
268
+ "EdVH95rbsD7zHssVSCG5ANly4DYS2w/6DnidegGNItksF7R3lXM9e4ngj2+15itszzv49y7/ATC8elN51uiB3hunP2Ay5fwi+tBAMR+qIbUP/bGQoy5tGB/v",
269
+ "EfOH8hkbe3j/jBmqcnPIAkM5rCVyKE/lHf4AWucnDW2wL+abIyFuuDsaQYJD2Ikp/gRVqgNN6veCtAl8E20/3DPKFmBCN/h355/jUJY+Kb8glOhNm311Mmu1",
270
+ "4t8wbtuEtCwyL3HWQi8gxKXmLhjX//nD4DqDU5f/2EbL//oFUEMNgmBoBMg+YAqb4Ga9/ACiozMNyrr3sIKAAhO7MxXd2ZiuwCIQVdvAhWS7V+AKLSAhWm2q",
271
+ "vleG0GoJhLEb6PY86ATEpMPUI6gF/3dy3/OWHOLvgCQCYLmgi+r0wT6+X5h08SID2hbQdi9BP/9zQ22u1T+t6AY2bhxH/JFuLVqd9v+pIJnKkANbwuOzqYDr",
272
+ "V6AbcYHQrQzz4b6CBtK93tpH/rELryJsqgLmEW/5Hf+kbUO6vAnCko3NapzCg7wjq8D//3qOPXoiDAc0uA29DR1ZzsruO7m77wPnUE1Vz7+/rs8Nz6mqwP2D",
273
+ "AhzVw/rIWl8I+JG9YQ4prZ6/88smi1VfWBy+VAoKVqHrcHp2uIHWGPyKmwbwPf+47S9uDBRvQMBAU15+eN9VAff6pi87pSjTx9kpji6OlGAcvgNd3I7rBx8x",
274
+ "x9kJ3Alur2yreC6MV3SKy6/S/UQc1h3gt6P3wm3LS42WYufpGIVusDwNwSP0C43FPKwPP6Z/fh/9+Kc4DWofYxbfB9x8MbXdnGBOmo/f1uA7/XVZnhy+Exle",
275
+ "cWt4Jcf/88O5+O4aBQGpql9Vm4Nqe7cegakb6K0KSCz0PoR4PUs3RCv+6fyMMlEPfwG88BvtZaf7ombtRn1L/zi9AOIvTpz8IDLPCoX1f+y7DUBTf0Rr/FaX",
276
+ "M6hR7XBVYJDPgQQrTjC363r+f4ExOZb3hdW/ZOGSJryv5X3x1zj11pWUNCF7AdPyKi/APs6Rn/sv/FwUxXFmfz8FMAAAAflBmyBTy8OYADzcZCk/Lt+2WgtC",
277
+ "Su4v7peHkrx4CV6i/jcbwh473GjBe3AlA147BwWwGJnmli0Ku9YyhZKLG3h6ekrbYKad/bdQHyrRo5zBsnUou7//JjyBkMuCuX/bwaYe1oQRpwahEfnebZAV",
278
+ "TzlCDINvgeOBgakisQ5Y+eTW2F0e/UCBD57oFvUzOP95WP1c4B1n/3ULcDern9W//234X/CMNHn83e+QFNtFC6c2+eQhPXMtKu89/wvpjX2XnvNCPYQhGtf/",
279
+ "KuEe5xoVNi54BKCryECjxPMagYSv7BFlUhBB+MVT6fSAACzBpYcAAswaWU0U0QAneWHATvLfDgJIALmkdhOZXboNZmQisUHPN2jQEf+AIXRN961/wAXE5saV",
280
+ "JB7oLG+AJf3ad8+iaqf86rfVWmcUn/X78hf/6LbS787+fh2P5XtPBjsioRWWFbKSuMNMCPHTQnzY/whAUP7cgJkjJ1qLbP4uByAHGQMkB8ja1mpwjrZxbMVs",
281
+ "H0yWmZAleU/ccVRhUuVYMAjFvz8x9mQcJSiwhP0XgVRCbxDAVaYe84NmbBCCU6SchQKh/5MU6OqQIfsIgmJVarV/BCCPe7+CEEZd3rMAf/8IglDABgkMAEQN",
282
+ "jz/zwCWBEd08/ABEbXa+ProFT6CC0JmNQQivghRK8EOdgnjIAAABakEDKbIBC82CEEQcFb3Z9CBVfBZWvm65UEm+iV8XXXlzynz/EwRwhzgiWEf2b+uCo1VW",
283
+ "97z4QGXxwQhHFSd34IRPd3f4ISiS5d4TYgPqY9/vf4R/yd3l800tQUCXfzw14IUZvBDt4MYREIE9cQCStdVl8VXGQRnVeGL4IfBD4IY/DwXFYAjuvgP5Vit0",
284
+ "//Dxf6ZXhr9Y/+JM2BMcHOnrBRMY0aJCdt6gCu/6/Sgb0KrpF6l+cNBbnabpmVBAQXtcnB/w6Qo3M+hwu0r10nX/k5Xbc9XZwAdEPptvgfh2Y8CqeTkbJH4r",
285
+ "IU3trz7fW4X4CR4yM9qIxkB/sQY/q7f9nOpX2g5EpXx9JlyxSWAmwrE8B+YqeB1/UdcAbBlgrvvnCgNVfUTS1lDmFuOff06XogiFbyj0Yxn1f3Qenz6AnX0c",
286
+ "32j/8nQFuYtBHuIT5NaMhtT9w84Vp97H+CXe7u7jUHwV3u7v7v3zEmysAAAD4EEBkmyAQvcEFAkNSdE7WCGeuP4/KjxI0L8AOgtZb9VeBbYvJPXZ/76gLWCV",
287
+ "aglfSq3YVkHFsS0Z+6Br+iToL/+SCK2bREEbrBKIYFXBD6VOGr55/GpdePTEEDuFFMAp6yiyZ6o4FKbceoEY6bA/68d8r4DY+p9M0YDubiTHy3qcYzDT8D7G",
288
+ "OPUh1n4sfEf/9WBizsNyMhlfXrq7RMSyqIzwl152d86tyaREf/4jSIwcvjYSbuHs6bWq//1cySmYFTt5qeDQQ6xQTTy18JPUsdwZPvINnsyXJp/zg/NyLDp4",
289
+ "78n9be5+A43lZ//SpeZmm4lv/XK+dn68EIPfymjVf/xL4M2CghGkHeRmwP6lHBgQAdbuAztiX9w7ZkrQmU3QH+sgauUg+nDV7mBcPTW6kBT1tb9PvDxr2WC2",
290
+ "9gQztsy9Pd53pGnwMy8SXtsDsQ895ZS7B0jzB7KZivwdfmiP/laBwZRmvjewcR7gP9keFH3csX7/yhtWP/rfFAFlR85Zzf4URFgF7SJ19zJ3CwnwC97Io7u/",
291
+ "0Gxc4YC8BrgKe6tG9///fBD9Dut4IMnMfi8v/5eLyvFMNQfTY0iDQOW/lFYN11+Z724NdjsLR/xbpG62eKQxf8sBkAFbVst9/wGgvfT+f8viSz4gYHtgWSMZ",
292
+ "on9N+cVLMH4mPNjmUTFapRcVn+U/Bw/NfwH/8+2daZ81yPjxU8qw+/HEq9w7yizA+JQMMv4xS6l3+gb9A0ml6ecFFXutuvPMhV1P+Xzlc0kO9EgMAYffof8N",
293
+ "gT3WiVb/8TO+uEfvdf7A/7jrJXrFSC6vpQcenjjToPlSENwFbSMtfCQcfXgMPDCX4FnB2AhX/I/qPMW9LuWnmbv////3BRbH3/s3+g5fefECA9ess0Bvhsf4",
294
+ "0oD6B/7sDbH6acOP8gfO3rEvs3HQGsuzveN534gznY8+I8iTHG7kDviNU8fXH+GdztFtNLu//XsQNPgGfoXnSe/JfEiZRaEMO+D6A3uPMAIbTagPvC/cehpr",
295
+ "dz/vnXWG/5WGW0csr4A4UaliVfnnkvxGea92p5TH77PQGhrbop+Dl8TrwyJDDBhYS99qxr3nWZ//88P51jthoFAlF8VzmRp8idpvZn1H3Xwc59Zjw/Y+C5ev",
296
+ "fGv7v+Xwc/wyVlNXHy8y3WlLf39r0W36tFL+ut/+zkw/pPn5f+hI+ZlRf74/8v4ovhqF2VTMz/9bpzspD2sggRnHdSP96ASFachdi9PBa/yyma+3f6DJoL0f",
297
+ "4sLb6rD/6RYAyb366edgD8N/R/5KQ1k90+7/xcFcYoEjn8/Hi+DAns/nfO+fz8KwAAACPkGbQFPM80b4ADTma7fx7UnZrUyNfGvaqw2ftbRIEt4c0r/IDA0q",
298
+ "ztLh4baf5hlTI8OwN7/9bJ0Vg1VCh2KWhoL0bUu6LLrPw3Vb/CKQgVSA4AUVWn7e9SQee5hHi/n0DAF8j/IelT74aqFvL0s8NwPSNOAweqKt7fe5bDpyEOD/",
299
+ "fXKrGv22JLL1nneEYcwYCVBKAlQBXwQErk4HJ9zgcAAoFTcwj/NA4TjwraAR4HERZfBiUsiE5xo78AF6X8FClY/N/himiMyLV74PTQ3RGFIXOg+bE6I45C5x",
300
+ "gTCKTABymQfItm2+B82JkRxiFztDipZ5xpiin+EmgYEixIvBGKXqEi7P+YYWr/ZdNxPT4P1BLrsUu/XldBuTAQJJNJ0+U6gKMU4/v/f7VMPok/+f/5n/jdx/",
301
+ "f5uF/BgCZBKAJkHEuJeASmzQuvRhuZGVV6E+xpk2N4W+b5vnn2qL7NViQeWe+ENrPfhDMX7BBIhgRDMKq5R2ZWfkULx000LNLBBDHFBlzDI9hAxUBlMPjTv9",
302
+ "6ZztfCCuICdCSQh0Q6nGJ6J7jC/4Q4bsCAYObIXJGY9cxK/Ds9eBi5PMAKYnzNG0mCDNGBFl4DVpGpfBvcLBEwRBHcV9ZfDARCAR8EJNxW2oIcN4AdpIDFa0",
303
+ "NtX8mWAML33++/AAKXbXy7vwQBGKfzC4KYxjHELsIfL/hEVhsFEAbjiDcVWr5RfgEzW67z/gBajGjdLX/XPl8LzQh0JbL4IAjDfYIum6QLBBhHOwQxsAAAGv",
304
+ "QQMptAPvK8IBH4ZD3DHl8CPWf9j/+jQjRB0tioRoh7QQ/BiEeCT/EwTx5fCH/QQ6BQdN5QgusvjAgUIbubIuvhssBBG7vWr64Zl3+GZd/YQwyUXieQkXwl/y",
305
+ "/uEP8EZuBrLny/BCEAj+whCAR8CTCIUQR/He//2PCIR5f8IX46GR0DKXPsfCDF0/3wjwiCHOw/HvDqC4KMNwYCCRnp/wBI9evyRlu+l9waKl3/aRNodcSxCe",
306
+ "DFS4PqKGgBN6qzC33uDQV+u1m/dWhShYuL9w2oQz+kWS+Xf34FPHeeL/9CWnJMgW9XGH41enqpfKTl8G+KX001HAcjbu/5fyBAEcKFD2H3u+DgRNp3VB9gf/",
307
+ "/GEaJwp3n1Ae+NtGlm+sbKpn+9oE3Hhhwa27cQC7fH6/wK2MaJapUaXwqEBEZcLeeeG+0P4NTcrmBXgIruu2RRD63dsDtVnBwuDwBGbX5ldfnmJr4/v9/TaO",
308
+ "ORkHMI//fQIAQBEIqJ04RBCGjcBCjZi1qHYClMO4D8ACXSTG9Rs6w8IghDF7vwEyJ29ahLQB+zAG3+kfPDwAHyUY2S9MtWAAAAO0QQGSbQD73BBlWCHKg/cL",
309
+ "gmwAiBf0xkK/6wxoEBiI+quoi+Pf/VpXxiT18vf/AocdezZfG/6BZzg6qL7iWEv5AfSdtG8h3jwTWyoxL4II6F00HcD5pgA8Un8aRn0b2B24Ex+QvyIFVPHD",
310
+ "yxmYnlcd4jG3odl89f+das+8po99tfQWyexHN2q7Lwi8jr/CQhMlR+Bboweyvmye+284q/PDgDaskHAbqncMnr7/wcvhFij1IHsV7AfnDPv0ovg4764NaJMB",
311
+ "Ah2iECL6NCYAmY5V+Uc2rR76iHdaAv+wfkD341Q0GQKFtuBGP4zPdgAMRUlK/jX2rueHQ/2uqu/7xZg76RYNeiI2BtIgBbLuJN6cqNvA3VoPLGyFN52iO8bL",
312
+ "wvY4+ohmnsb7ZiBujD/tuAsJmnaAhv//7//ldNIN8tev39YnbPN+///9lA2aE0Rf9YOw6QOED2R8DqsPX17A+ldiDBZGjuyDgx1Y/6jCg7B8PgOD1lgTe3nE",
313
+ "4k8ZNNYT8XeuZrFJr4mXufwCva9o7tS/LbF0cXVaaMP8+5f4j//4EChwqsv/wiHt7utQECN2atXPwRQFfgDO/VO/2rAAeFqjI369OrL+u8pf/5XgwKGjgq0K",
314
+ "+6QlN/mMioVNdZCt/4DumlRMb76tIAlu+klEX9si2ZRvzfxX/mzl9Ly+QoShNFCQeJonGynNnr/92JfL9Znz/2ZmzfsnH/qmb5IwPccf6BBnHQDV9gb9UVvO",
315
+ "kFEgZB++qob40KaRP/8Pz/sYBymk5U8XleAdd0ulfqX5WhJ0g71oSFokxD21gO0R9jezQ11znY/esye+D/1ejn/yoqSTQP+A/1cod1jPDvt7Q+HMuM4/30C0",
316
+ "Z6L/9/aDl/8gQD0df7l+GLg8AuvOJDUBcCXcb+jqoYu7A7XMDbqEHmPxgOPe6De/tFIsB1duB/AwyxTSu3uful2/AKqhz6y/799Q74QsD/ZbMN4eU7n04T1+",
317
+ "cNzDOCq1N/cMjv8f75bg7gMcdgfyUVeAaaXI3z5BakHCloI2PxvLXwVzEnTf9Ds3DI0VNAmqm72Ozn/+dB3OscX9/DQKAI25Qce/EMocZtoU3cknUNfYbd+D",
318
+ "x2Of2Lf/9/l//DJTNtcj+a/bWgL52Kf6WjnF++vi1Ot+ek/ICeS6r+9fT/3uGo2+VAD/APa9b47gS9TAwacb6Y5d+gLgLN30+u/DwCioqyPrv+GSN03D/DGN",
319
+ "18bhctG/4NjX7nF6AcRcID300wj8N9/4uCmMxZn8/BTAAAAB4UGbYFPNxvgAcWx37Vot+/sET4ONOSubwDbSfT9KSBACBEEBusIhiVqWgJinLpU6E73xrv/+",
320
+ "PApANJyS0QTaClhLUwNAYCO1V60IVdXKCRy/nIbS4Ah7Etn/npROeTN1XeFuBt/ar+f/7b+bsVhY3u3/BydpkATcHb7p5yFv5LyzX+cU1ms0I9hCEQS8Igk/",
321
+ "NzgrCAAJhiCwgJSkwAUqiUil//9yAADgA4FS8AM69//7/cgBDDZfnpl/brbL+J+FwUfADQTEmSqOD3+AC2zrQ2EH93aBoWPdlMFzTdsmOqHcaZBEkHaflrgO",
322
+ "7FY4Aan9oGaWP/poH8P7DZPgBC/L6z/eHD5smRkbU3kIDeF723a6L5JsRCGZYIAiHy4NI8qeAnkmdahWe+4CZJkHWrXCQV/WEzj+TgICeEAJDkCJkfgCExtM",
323
+ "eIcp/wGBlsSAfwgTC6QDwZlaaEvJ++eTR6y1hCHtwVUCBBeWeFlhYvnqCX5+u0DAgycfqc7z+vD8dZbe2wQDJo6XiAapqlwY0CgwIhfznfFGnPDL74fACEmf",
324
+ "r53gW6aNaHkUAZFpkcxK6YQyoOso9FOLlBCr+CHwQ8DROCV/hO/PiuCIEz2qRGGwTxjGN8EYKE34PBCiuKg58WyZR0AAAAEyQQMptgELy4If/QIh/+jQf+Gw",
325
+ "U8MvLhx9/+J4//QKMK4I9ax1F//zwUwj7UEJJAQbvwQ+CHCLBDPTwnh9HeP5A47f7FaqsEPghzsE8IYJguCrNEAc/8j2wCBlKPfunHBcKQqlfRFUByywyulg",
326
+ "a/afdYA1K3M7N9MoO7I93WyicLFxl19r/5kjrp4V1H/6wfS3UBsF38aZ3E+vUbMwcmusXE+jx3jHUel9r6anojxk6vl/h7QwLy5AKq/NdUP8d40T4rHbEMvy",
327
+ "SJrkAvLco3/OFs/0HD9MCuEwiyiDAIWd776QIuWd5EEScxFTdf+aXxIIg1HhMQCELc41wGz4R6gP/93S1Eu9OnlO9t1swdkuHELikAtoVxWFNTOPyi/zynne",
328
+ "8+z9mGufNH8/ghUdvBCjReCHAAAD/0EBkm2AQvawQZXghoFCZf+y/rsoX4BD0gZg//fQPOZGdFj4r6CnaSCmJT7vrCR7Cu0+pr7AbQRNq1kbfu2xSLdzadv9",
329
+ "8MZcCEtOeSZvR63gQ+55txI5fbMhQpQ7wNuwi26Xf7+D2K/jsWQIVMDemH+KqP8uLe8hu/uc3VYDsrCbBNzdPugJ/lEFX9VYANsrIR3xXgRRJT3/7gZzAgA7",
330
+ "i5RcSK2O2SD60UaOU/B7UAHHEzi53+vAEXToyMC77By+VRL0Hryfzjbpz9586fNjWd/KYedMDXFBxfermCX/L36BuJ4ErTeZ+by4ED+jDg4jplqD/59ichBW",
331
+ "YLyVq0P4KcvwkP0dlqwuhGS2k3+5JmIvb8A9IhT/ZG7UvjTDNuHfSYXZaGoAMGWz9+90caKz/9VkQcFgdIDUNC27BYUV65zjwMjTzhHZ9Mhn5njEIEAKaikf",
332
+ "dBQvXceDtXEg4UyaYTEe8BxYLuqeRWBy+PYwnOHqXcH2GZs35oYPf/78XW1Px3s3ucI6Sz6e8bCvcBv897oyC5eP/f0WAnfpY97CJtx2/4sloTngKiZt3Hvz",
333
+ "1BHhXlym+L6EgJPX+5K3///hjefK18ayZ7L//LBDVs7BTI85w0CYFiVHz6WI/6+VmbKzsKMfuAxk45Jf/80jvMzjQ+IC3Mx53o/8fm3L//y+5ZZB4eJQPvr5",
334
+ "LIuv9HpdwpH9/eUVvbaU7ryxJrcnNm+u/Ucd2G2JfYEDpQydG9AeBUzDdJ/Padhv1+2xLp4BmrHTWWrbcq7th/dtPAH0VpNJm7/3YcMHS4BFueHeHUFb1Xzy",
335
+ "/9Czx9aPfC+FZtUWt0ds36f0KDbujd3t49NnfqtsNR9yrVNWBf8TIjM2tDXnZqJ/D9B4CC1Xpf3exMUqzf1f/KQWFVzWR6ug5fKhCBG2w9nuf23/xAXb+j/7",
336
+ "bP+sC7w1+0B/svkXQG9/BbOA1/gEAnaw4bavZuKmgHs+vpt07Mv4Pzie2/Q/73b0/gODv5n7XtWcmn1//7RlNM6ba8DYPu6VP3Rf/8vvMJGqHeAl9fB2PiEq",
337
+ "vjdYPFXcz/6z6BQM268BoevDG9cH/+KFGT3hXTx50vzYI8GFz+i3+Fvwtnrvcd18xeZfycE/DeQ/BbYerrGfRf//7h8wZFh7uxI/Hnv0DUO0uKnF3n//zoO4",
338
+ "hY54ogaBQG45XOH9/63WsC7xUNu2hg/bLAc1Tzvwz8PIokz878M/YIWGoZtO7LvX+f4D0WL7e70oqysimvziqkE/x7/8waKU0RRmi+Kd8SN9oPXyuNqyOXRw",
339
+ "ff1BbCtOcZ+b8R4LUOPFsq+6v4pBkx5gKzBmBbbIEFr4tJFCAig/IJXnuba3/i4K4xQsz+fgpg=="
340
+ ].join("");
341
+ function createM1StaticFmp4Fixture() {
342
+ return {
343
+ mimeType: M1_VIDEO_MIME,
344
+ codec: "avc1.42C01E",
345
+ width: 320,
346
+ height: 240,
347
+ duration: .4,
348
+ initSegment: decodeBase64(INIT_SEGMENT_BASE64),
349
+ mediaSegment: decodeBase64(MEDIA_SEGMENT_BASE64)
350
+ };
351
+ }
352
+ function decodeBase64(value) {
353
+ const binary = atob(value);
354
+ const bytes = new Uint8Array(binary.length);
355
+ for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
356
+ return bytes.buffer;
357
+ }
358
+ //#endregion
359
+ //#region src/latency/buffer-ranges.ts
360
+ function normalizeBufferedRanges(input) {
361
+ if (isBufferedRangeArray(input)) return input.filter(isValidRange).map((range) => ({
362
+ start: range.start,
363
+ end: range.end
364
+ }));
365
+ const ranges = [];
366
+ for (let index = 0; index < input.length; index += 1) {
367
+ const range = {
368
+ start: input.start(index),
369
+ end: input.end(index)
370
+ };
371
+ if (isValidRange(range)) ranges.push(range);
372
+ }
373
+ return ranges;
374
+ }
375
+ function getBufferedStart(ranges) {
376
+ return ranges.length === 0 ? void 0 : ranges[0]?.start;
377
+ }
378
+ function getLiveEdge(ranges) {
379
+ return ranges[ranges.length - 1]?.end;
380
+ }
381
+ function getBufferedDuration(ranges) {
382
+ if (ranges.length === 0) return;
383
+ return ranges.reduce((total, range) => total + Math.max(0, range.end - range.start), 0);
384
+ }
385
+ function getForwardBuffer(ranges, currentTime) {
386
+ if (!Number.isFinite(currentTime)) return;
387
+ const liveEdge = getLiveEdge(ranges);
388
+ if (liveEdge === void 0) return;
389
+ return Math.max(0, liveEdge - currentTime);
390
+ }
391
+ function isValidRange(range) {
392
+ return Number.isFinite(range.start) && Number.isFinite(range.end) && range.end > range.start;
393
+ }
394
+ function isBufferedRangeArray(input) {
395
+ return Array.isArray(input);
396
+ }
397
+ //#endregion
398
+ //#region src/latency/latency-controller.ts
399
+ var LatencyController = class {
400
+ constructor(config) {
401
+ this.startupPlayRequested = false;
402
+ this.lastSeekRequestAtMs = Number.NEGATIVE_INFINITY;
403
+ this.latency = config.latency;
404
+ this.playback = config.playback;
405
+ }
406
+ evaluate(input) {
407
+ const metrics = this.computeMetrics(input);
408
+ const evaluation = { metrics };
409
+ if (metrics.currentTime !== void 0) {
410
+ const cleanupBefore = metrics.currentTime - this.latency.backwardBuffer;
411
+ if (cleanupBefore > 0) evaluation.cleanupBefore = cleanupBefore;
412
+ }
413
+ const forwardBuffer = metrics.forwardBuffer ?? metrics.bufferedDuration;
414
+ if (forwardBuffer !== void 0) {
415
+ if (!input.loaderPaused && forwardBuffer >= this.latency.maxForwardBuffer) evaluation.loaderCommand = "pause";
416
+ else if (input.loaderPaused && forwardBuffer <= this.latency.target) evaluation.loaderCommand = "resume";
417
+ }
418
+ evaluation.playbackControl = this.evaluatePlaybackControl(input, metrics);
419
+ return evaluation;
420
+ }
421
+ recordPlaybackControlResult(result) {
422
+ if (this.pendingPlaybackControl === result.type) this.pendingPlaybackControl = void 0;
423
+ }
424
+ reset() {
425
+ this.startupPlayRequested = false;
426
+ this.pendingPlaybackControl = void 0;
427
+ this.lastSeekRequestAtMs = Number.NEGATIVE_INFINITY;
428
+ }
429
+ computeMetrics(input) {
430
+ const bufferedStart = getBufferedStart(input.ranges);
431
+ const bufferedEnd = getLiveEdge(input.ranges);
432
+ const bufferedDuration = getBufferedDuration(input.ranges);
433
+ const videoState = input.videoState;
434
+ const metrics = {
435
+ bufferedStart,
436
+ bufferedEnd,
437
+ bufferedDuration
438
+ };
439
+ if (videoState === void 0) return metrics;
440
+ const forwardBuffer = getForwardBuffer(input.ranges, videoState.currentTime);
441
+ metrics.currentTime = videoState.currentTime;
442
+ metrics.forwardBuffer = forwardBuffer;
443
+ metrics.playbackRate = videoState.playbackRate;
444
+ metrics.readyState = videoState.readyState;
445
+ metrics.droppedFrames = videoState.droppedFrames;
446
+ metrics.liveLatency = forwardBuffer;
447
+ return metrics;
448
+ }
449
+ evaluatePlaybackControl(input, metrics) {
450
+ if (this.pendingPlaybackControl !== void 0) return;
451
+ if (!this.startupPlayRequested && this.playback.autoPlay && metrics.bufferedDuration !== void 0 && metrics.bufferedDuration >= this.latency.startupBuffer) {
452
+ this.startupPlayRequested = true;
453
+ this.pendingPlaybackControl = "play";
454
+ return {
455
+ type: "play",
456
+ reason: "startup-buffer-ready"
457
+ };
458
+ }
459
+ if (input.videoState === void 0 || metrics.liveLatency === void 0 || metrics.bufferedEnd === void 0) return;
460
+ if (metrics.liveLatency > this.latency.max) {
461
+ const seekTarget = Math.max(metrics.bufferedStart ?? 0, metrics.bufferedEnd - this.latency.target);
462
+ if (input.nowMs - this.lastSeekRequestAtMs >= SEEK_COOLDOWN_MS && Math.abs(seekTarget - input.videoState.currentTime) >= SEEK_MIN_DELTA_SECONDS) {
463
+ this.lastSeekRequestAtMs = input.nowMs;
464
+ this.pendingPlaybackControl = "seek";
465
+ return {
466
+ type: "seek",
467
+ targetTime: seekTarget,
468
+ reason: "latency-max-exceeded"
469
+ };
470
+ }
471
+ return;
472
+ }
473
+ if (metrics.liveLatency > this.latency.target + PLAYBACK_RATE_CHASE_THRESHOLD_SECONDS) {
474
+ if (Math.abs(input.videoState.playbackRate - PLAYBACK_RATE_CHASE) >= PLAYBACK_RATE_EPSILON) {
475
+ this.pendingPlaybackControl = "set-playback-rate";
476
+ return {
477
+ type: "set-playback-rate",
478
+ playbackRate: PLAYBACK_RATE_CHASE,
479
+ reason: "latency-above-target"
480
+ };
481
+ }
482
+ } else if (input.videoState.playbackRate !== 1 && metrics.liveLatency <= this.latency.target + PLAYBACK_RATE_RESTORE_THRESHOLD_SECONDS) {
483
+ this.pendingPlaybackControl = "set-playback-rate";
484
+ return {
485
+ type: "set-playback-rate",
486
+ playbackRate: 1,
487
+ reason: "latency-near-target"
488
+ };
489
+ }
490
+ }
491
+ };
492
+ const PLAYBACK_RATE_CHASE = 1.05;
493
+ const PLAYBACK_RATE_EPSILON = .005;
494
+ const PLAYBACK_RATE_CHASE_THRESHOLD_SECONDS = .25;
495
+ const PLAYBACK_RATE_RESTORE_THRESHOLD_SECONDS = .1;
496
+ const SEEK_COOLDOWN_MS = 1e3;
497
+ const SEEK_MIN_DELTA_SECONDS = .1;
498
+ //#endregion
499
+ //#region src/loader/retry-policy.ts
500
+ function createRetryPolicy(input) {
501
+ return {
502
+ maxAttempts: clampInteger(input?.maxAttempts, 1),
503
+ backoffMs: clampInteger(input?.backoffMs, 0)
504
+ };
505
+ }
506
+ function getRetryDelayMs(policy, attempt) {
507
+ if (policy.backoffMs === 0) return 0;
508
+ return policy.backoffMs * Math.max(1, attempt);
509
+ }
510
+ function clampInteger(value, minimum) {
511
+ if (value === void 0 || !Number.isFinite(value)) return minimum;
512
+ return Math.max(minimum, Math.trunc(value));
513
+ }
514
+ //#endregion
515
+ //#region src/loader/http-flv-loader.ts
516
+ var HttpFlvLoaderError = class extends Error {
517
+ constructor(code, message, status) {
518
+ super(message);
519
+ this.name = "HttpFlvLoaderError";
520
+ this.code = code;
521
+ this.status = status;
522
+ }
523
+ };
524
+ var HttpFlvLoader = class {
525
+ constructor(config) {
526
+ this.retry = createRetryPolicy(void 0);
527
+ this.state = "idle";
528
+ this.pausedState = false;
529
+ this.resumeWaiters = [];
530
+ this.mutableStats = {
531
+ bytesReceived: 0,
532
+ currentNetworkSpeed: 0
533
+ };
534
+ this.url = config.url;
535
+ this.headers = config.network.headers;
536
+ this.credentials = config.network.credentials;
537
+ this.retry = createRetryPolicy(config.network.retry);
538
+ this.fetchImpl = config.fetch ?? globalThis.fetch.bind(globalThis);
539
+ this.now = config.now ?? (() => performance.now());
540
+ this.sleep = config.sleep ?? wait;
541
+ }
542
+ get closed() {
543
+ return this.state === "closed";
544
+ }
545
+ get paused() {
546
+ return this.pausedState;
547
+ }
548
+ get stats() {
549
+ return { ...this.mutableStats };
550
+ }
551
+ async open() {
552
+ if (this.state !== "idle") throw new HttpFlvLoaderError("RIVMUX_LOADER_INVALID_STATE", "HTTP Fetch loader can only be opened once.");
553
+ this.state = "opening";
554
+ this.mutableStats.startedAtMs = this.now();
555
+ for (let attempt = 1; attempt <= this.retry.maxAttempts; attempt += 1) {
556
+ this.abortController = new AbortController();
557
+ try {
558
+ await this.openAttempt();
559
+ return;
560
+ } catch (cause) {
561
+ if (this.closed || isAbortLikeError(cause) || attempt >= this.retry.maxAttempts) throw cause;
562
+ await this.sleep(getRetryDelayMs(this.retry, attempt), this.abortController.signal);
563
+ }
564
+ }
565
+ }
566
+ async read() {
567
+ await this.waitUntilResumed();
568
+ if (this.closed) return null;
569
+ const reader = this.reader;
570
+ if (reader === void 0) {
571
+ if (this.closed) return null;
572
+ throw new HttpFlvLoaderError("RIVMUX_LOADER_NOT_OPEN", "HTTP Fetch loader must be opened before read().");
573
+ }
574
+ const result = await reader.read();
575
+ if (result.done) {
576
+ releaseReader(reader);
577
+ if (this.reader === reader) this.reader = void 0;
578
+ return null;
579
+ }
580
+ const bytes = result.value;
581
+ const receivedAtMs = this.now();
582
+ const previousChunkAtMs = this.mutableStats.lastChunkAtMs ?? this.mutableStats.startedAtMs ?? receivedAtMs;
583
+ const elapsedSeconds = Math.max((receivedAtMs - previousChunkAtMs) / 1e3, 0);
584
+ this.mutableStats.bytesReceived += bytes.byteLength;
585
+ this.mutableStats.currentNetworkSpeed = elapsedSeconds === 0 ? bytes.byteLength : bytes.byteLength / elapsedSeconds;
586
+ this.mutableStats.lastChunkAtMs = receivedAtMs;
587
+ return {
588
+ bytes,
589
+ receivedAtMs
590
+ };
591
+ }
592
+ pause() {
593
+ if (this.closed) return;
594
+ this.pausedState = true;
595
+ }
596
+ resume() {
597
+ if (!this.pausedState) return;
598
+ this.pausedState = false;
599
+ this.resolveResumeWaiters();
600
+ }
601
+ async close() {
602
+ if (this.closed) return;
603
+ this.state = "closed";
604
+ this.pausedState = false;
605
+ this.resolveResumeWaiters();
606
+ this.abortController?.abort();
607
+ const reader = this.reader;
608
+ this.reader = void 0;
609
+ if (reader === void 0) return;
610
+ try {
611
+ await reader.cancel();
612
+ } catch {} finally {
613
+ releaseReader(reader);
614
+ }
615
+ }
616
+ async openAttempt() {
617
+ const abortController = this.abortController;
618
+ if (abortController === void 0) throw new HttpFlvLoaderError("RIVMUX_LOADER_INVALID_STATE", "HTTP Fetch loader abort controller is missing.");
619
+ const response = await this.fetchImpl(this.url, {
620
+ method: "GET",
621
+ headers: createHeaders(this.headers),
622
+ credentials: this.credentials,
623
+ signal: abortController.signal
624
+ });
625
+ if (this.closed) {
626
+ await response.body?.cancel();
627
+ return;
628
+ }
629
+ if (!response.ok) {
630
+ await response.body?.cancel();
631
+ throw new HttpFlvLoaderError("RIVMUX_HTTP_STATUS", `HTTP Fetch loader received status ${response.status} ${response.statusText}.`, response.status);
632
+ }
633
+ if (response.body === null) throw new HttpFlvLoaderError("RIVMUX_HTTP_BODY_UNAVAILABLE", "HTTP Fetch loader response body is unavailable.");
634
+ const contentLength = response.headers.get("Content-Length");
635
+ if (contentLength !== null) {
636
+ const parsedContentLength = Number.parseInt(contentLength, 10);
637
+ if (Number.isFinite(parsedContentLength) && parsedContentLength >= 0) this.mutableStats.contentLength = parsedContentLength;
638
+ }
639
+ this.reader = response.body.getReader();
640
+ this.state = "open";
641
+ }
642
+ waitUntilResumed() {
643
+ if (!this.pausedState || this.closed) return Promise.resolve();
644
+ return new Promise((resolve) => {
645
+ this.resumeWaiters.push(resolve);
646
+ });
647
+ }
648
+ resolveResumeWaiters() {
649
+ const waiters = this.resumeWaiters;
650
+ this.resumeWaiters = [];
651
+ for (const resolve of waiters) resolve();
652
+ }
653
+ };
654
+ function isAbortLikeError(cause) {
655
+ return cause instanceof DOMException && cause.name === "AbortError";
656
+ }
657
+ function createHeaders(headers) {
658
+ const result = new Headers();
659
+ for (const [key, value] of Object.entries(headers)) result.append(key, value);
660
+ return result;
661
+ }
662
+ function releaseReader(reader) {
663
+ try {
664
+ reader.releaseLock();
665
+ } catch {}
666
+ }
667
+ function wait(ms, signal) {
668
+ if (ms <= 0) return Promise.resolve();
669
+ if (signal.aborted) return Promise.reject(createAbortError());
670
+ return new Promise((resolve, reject) => {
671
+ const cleanup = () => {
672
+ clearTimeout(timer);
673
+ signal.removeEventListener("abort", onAbort);
674
+ };
675
+ const onAbort = () => {
676
+ cleanup();
677
+ reject(createAbortError());
678
+ };
679
+ const timer = setTimeout(() => {
680
+ cleanup();
681
+ resolve();
682
+ }, ms);
683
+ signal.addEventListener("abort", onAbort, { once: true });
684
+ });
685
+ }
686
+ function createAbortError() {
687
+ return new DOMException("HTTP Fetch loader was aborted.", "AbortError");
688
+ }
689
+ //#endregion
690
+ //#region src/mse/mime.ts
691
+ const M1_VIDEO_MIME$1 = "video/mp4; codecs=\"avc1.42C01E\"";
692
+ function createMp4VideoMime(codec) {
693
+ return `video/mp4; codecs="${codec}"`;
694
+ }
695
+ function createMp4AudioMime(codec) {
696
+ return `audio/mp4; codecs="${codec}"`;
697
+ }
698
+ function isMseSupported(mimeType) {
699
+ return typeof MediaSource !== "undefined" && typeof MediaSource.isTypeSupported === "function" && MediaSource.isTypeSupported(mimeType);
700
+ }
701
+ function assertMseSupport(mimeType) {
702
+ if (typeof MediaSource === "undefined") throw new Error("MediaSource is not available in this worker.");
703
+ if (MediaSource.canConstructInDedicatedWorker !== true) throw new Error("MediaSource cannot be constructed in this dedicated worker.");
704
+ if (!isMseSupported(mimeType)) throw new Error(`MSE does not support ${mimeType}.`);
705
+ }
706
+ //#endregion
707
+ //#region src/mse/source-buffer-queue.ts
708
+ var SourceBufferQueue = class {
709
+ constructor(sourceBuffer) {
710
+ this.queue = [];
711
+ this.activeAppendBytes = 0;
712
+ this.destroyed = false;
713
+ this.sourceBuffer = sourceBuffer;
714
+ }
715
+ get length() {
716
+ return this.queue.length + (this.sourceBuffer.updating ? 1 : 0);
717
+ }
718
+ get queuedBytes() {
719
+ return this.activeAppendBytes + this.queue.reduce((total, operation) => total + (operation.type === "append" ? operation.data.byteLength : 0), 0);
720
+ }
721
+ get updating() {
722
+ return this.sourceBuffer.updating;
723
+ }
724
+ get bufferedRanges() {
725
+ return normalizeBufferedRanges(this.sourceBuffer.buffered);
726
+ }
727
+ get bufferedStart() {
728
+ return getBufferedStart(this.bufferedRanges);
729
+ }
730
+ get bufferedEnd() {
731
+ return getLiveEdge(this.bufferedRanges);
732
+ }
733
+ get bufferedDuration() {
734
+ return getBufferedDuration(this.bufferedRanges);
735
+ }
736
+ append(data) {
737
+ if (this.destroyed) return Promise.reject(/* @__PURE__ */ new Error("SourceBufferQueue has been destroyed."));
738
+ this.queue.push({
739
+ type: "append",
740
+ data
741
+ });
742
+ this.pendingDrain ??= this.drain();
743
+ return this.pendingDrain;
744
+ }
745
+ cleanupBefore(cutoff) {
746
+ if (this.destroyed) return Promise.reject(/* @__PURE__ */ new Error("SourceBufferQueue has been destroyed."));
747
+ const removals = this.createCleanupOperations(cutoff);
748
+ if (removals.length === 0) return this.pendingDrain ?? Promise.resolve();
749
+ this.queue.unshift(...removals);
750
+ this.pendingDrain ??= this.drain();
751
+ return this.pendingDrain;
752
+ }
753
+ reset() {
754
+ this.queue.length = 0;
755
+ this.activeAppendBytes = 0;
756
+ }
757
+ destroy() {
758
+ this.destroyed = true;
759
+ this.reset();
760
+ }
761
+ async drain() {
762
+ try {
763
+ while (this.queue.length > 0 && !this.destroyed) {
764
+ await this.waitForIdle();
765
+ this.activeAppendBytes = 0;
766
+ const operation = this.queue.shift();
767
+ if (operation?.type === "append") {
768
+ this.activeAppendBytes = operation.data.byteLength;
769
+ try {
770
+ this.sourceBuffer.appendBuffer(operation.data);
771
+ } catch (cause) {
772
+ this.activeAppendBytes = 0;
773
+ throw cause;
774
+ }
775
+ } else if (operation?.type === "remove") this.sourceBuffer.remove(operation.start, operation.end);
776
+ }
777
+ await this.waitForIdle();
778
+ this.activeAppendBytes = 0;
779
+ } finally {
780
+ if (this.queue.length === 0 && !this.sourceBuffer.updating) this.activeAppendBytes = 0;
781
+ this.pendingDrain = void 0;
782
+ }
783
+ }
784
+ createCleanupOperations(cutoff) {
785
+ if (!Number.isFinite(cutoff) || cutoff <= 0) return [];
786
+ return this.bufferedRanges.map((range) => ({
787
+ type: "remove",
788
+ start: range.start,
789
+ end: Math.min(range.end, cutoff)
790
+ })).filter((operation) => operation.end > operation.start);
791
+ }
792
+ waitForIdle() {
793
+ if (!this.sourceBuffer.updating) return Promise.resolve();
794
+ return new Promise((resolve, reject) => {
795
+ const cleanup = () => {
796
+ this.sourceBuffer.removeEventListener("updateend", onUpdateEnd);
797
+ this.sourceBuffer.removeEventListener("error", onError);
798
+ this.sourceBuffer.removeEventListener("abort", onAbort);
799
+ };
800
+ const onUpdateEnd = () => {
801
+ cleanup();
802
+ resolve();
803
+ };
804
+ const onError = () => {
805
+ cleanup();
806
+ reject(/* @__PURE__ */ new Error("SourceBuffer append failed."));
807
+ };
808
+ const onAbort = () => {
809
+ cleanup();
810
+ reject(/* @__PURE__ */ new Error("SourceBuffer append was aborted."));
811
+ };
812
+ this.sourceBuffer.addEventListener("updateend", onUpdateEnd, { once: true });
813
+ this.sourceBuffer.addEventListener("error", onError, { once: true });
814
+ this.sourceBuffer.addEventListener("abort", onAbort, { once: true });
815
+ });
816
+ }
817
+ };
818
+ //#endregion
819
+ //#region src/mse/mse-controller.ts
820
+ var MseController = class {
821
+ constructor() {
822
+ this.sourceBuffers = /* @__PURE__ */ new Map();
823
+ this.queues = /* @__PURE__ */ new Map();
824
+ this.lastCleanupBefore = 0;
825
+ }
826
+ get appendQueueLength() {
827
+ return Array.from(this.queues.values()).reduce((total, queue) => total + queue.length, 0);
828
+ }
829
+ get appendQueueBytes() {
830
+ return Array.from(this.queues.values()).reduce((total, queue) => total + queue.queuedBytes, 0);
831
+ }
832
+ get sourceBufferUpdating() {
833
+ return Array.from(this.queues.values()).some((queue) => queue.updating);
834
+ }
835
+ get sourceBufferCount() {
836
+ return this.sourceBuffers.size;
837
+ }
838
+ get bufferedStart() {
839
+ return this.primaryQueue?.bufferedStart;
840
+ }
841
+ get bufferedEnd() {
842
+ return this.primaryQueue?.bufferedEnd;
843
+ }
844
+ get bufferedDuration() {
845
+ return this.primaryQueue?.bufferedDuration;
846
+ }
847
+ get bufferedRanges() {
848
+ return this.primaryQueue?.bufferedRanges ?? [];
849
+ }
850
+ get bufferedRangeCount() {
851
+ return Array.from(this.queues.values()).reduce((total, queue) => total + queue.bufferedRanges.length, 0);
852
+ }
853
+ async createMediaSourceHandle() {
854
+ assertMseSupport(M1_VIDEO_MIME$1);
855
+ const mediaSource = new MediaSource();
856
+ this.mediaSource = mediaSource;
857
+ const handle = mediaSource.handle;
858
+ if (handle === void 0) throw new Error("MediaSourceHandle is not available.");
859
+ return handle;
860
+ }
861
+ async appendFixture(fixture) {
862
+ const mediaSource = this.mediaSource;
863
+ if (mediaSource === void 0) throw new Error("MediaSource has not been created.");
864
+ await waitForSourceOpen(mediaSource);
865
+ const queue = this.ensureQueue("video", fixture.mimeType);
866
+ await queue.append(fixture.initSegment);
867
+ await queue.append(fixture.mediaSegment);
868
+ mediaSource.duration = fixture.duration;
869
+ }
870
+ async appendInitSegment(segment) {
871
+ const mediaSource = this.requireMediaSource();
872
+ const mimeType = createMp4Mime(segment.track, segment.codec);
873
+ assertMseSupport(mimeType);
874
+ await waitForSourceOpen(mediaSource);
875
+ await this.ensureQueue(segment.track, mimeType).append(toAppendBuffer(segment.bytes));
876
+ }
877
+ async appendMediaSegment(segment) {
878
+ const queue = this.queues.get(segment.track) ?? this.queues.get("muxed");
879
+ if (queue === void 0) throw new Error(`Cannot append ${segment.track} media segment before init segment.`);
880
+ await queue.append(toAppendBuffer(segment.bytes));
881
+ const mediaSource = this.requireMediaSource();
882
+ const duration = segment.dtsEndMs / 1e3;
883
+ if (Number.isFinite(duration) && duration > 0 && mediaSource.readyState === "open") mediaSource.duration = Math.max(mediaSource.duration, duration);
884
+ }
885
+ async cleanupBefore(cutoff) {
886
+ if (!Number.isFinite(cutoff) || cutoff <= 0 || cutoff <= this.lastCleanupBefore + CLEANUP_STEP_SECONDS) return;
887
+ this.lastCleanupBefore = cutoff;
888
+ await Promise.all(Array.from(this.queues.values(), (queue) => queue.cleanupBefore(cutoff)));
889
+ }
890
+ reset() {
891
+ for (const queue of this.queues.values()) queue.reset();
892
+ this.lastCleanupBefore = 0;
893
+ }
894
+ destroy() {
895
+ for (const queue of this.queues.values()) queue.destroy();
896
+ this.queues.clear();
897
+ if (this.mediaSource !== void 0) for (const sourceBuffer of this.sourceBuffers.values()) try {
898
+ this.mediaSource.removeSourceBuffer(sourceBuffer);
899
+ } catch {}
900
+ this.sourceBuffers.clear();
901
+ this.mediaSource = void 0;
902
+ }
903
+ get primaryQueue() {
904
+ return this.queues.get("video") ?? this.queues.get("muxed") ?? this.queues.get("audio");
905
+ }
906
+ requireMediaSource() {
907
+ if (this.mediaSource === void 0) throw new Error("MediaSource has not been created.");
908
+ return this.mediaSource;
909
+ }
910
+ ensureQueue(track, mimeType) {
911
+ const existing = this.queues.get(track);
912
+ if (existing !== void 0) return existing;
913
+ const sourceBuffer = this.requireMediaSource().addSourceBuffer(mimeType);
914
+ const queue = new SourceBufferQueue(sourceBuffer);
915
+ this.sourceBuffers.set(track, sourceBuffer);
916
+ this.queues.set(track, queue);
917
+ return queue;
918
+ }
919
+ };
920
+ function waitForSourceOpen(mediaSource) {
921
+ if (mediaSource.readyState === "open") return Promise.resolve();
922
+ return new Promise((resolve, reject) => {
923
+ const cleanup = () => {
924
+ mediaSource.removeEventListener("sourceopen", onOpen);
925
+ mediaSource.removeEventListener("sourceclose", onClose);
926
+ mediaSource.removeEventListener("error", onError);
927
+ };
928
+ const onOpen = () => {
929
+ cleanup();
930
+ resolve();
931
+ };
932
+ const onClose = () => {
933
+ cleanup();
934
+ reject(/* @__PURE__ */ new Error("MediaSource closed before sourceopen."));
935
+ };
936
+ const onError = () => {
937
+ cleanup();
938
+ reject(/* @__PURE__ */ new Error("MediaSource failed before sourceopen."));
939
+ };
940
+ mediaSource.addEventListener("sourceopen", onOpen, { once: true });
941
+ mediaSource.addEventListener("sourceclose", onClose, { once: true });
942
+ mediaSource.addEventListener("error", onError, { once: true });
943
+ });
944
+ }
945
+ function toAppendBuffer(bytes) {
946
+ const copy = new Uint8Array(bytes.byteLength);
947
+ copy.set(bytes);
948
+ return copy.buffer;
949
+ }
950
+ function createMp4Mime(track, codec) {
951
+ return track === "audio" ? createMp4AudioMime(codec) : createMp4VideoMime(codec);
952
+ }
953
+ const CLEANUP_STEP_SECONDS = .25;
954
+ //#endregion
955
+ //#region src/wasm/rivmux-transmux-wasm.ts
956
+ var WasmTransmuxCoreHost = class {
957
+ constructor(Core) {
958
+ this.core = new Core();
959
+ }
960
+ pushChunk(chunk) {
961
+ return normalizeCoreEvents(this.core.pushChunk(chunk));
962
+ }
963
+ flush() {
964
+ return normalizeCoreEvents(this.core.flush());
965
+ }
966
+ reset() {
967
+ this.core.reset();
968
+ }
969
+ destroy() {
970
+ this.core.destroy();
971
+ }
972
+ };
973
+ function normalizeCoreEvents(value) {
974
+ if (!Array.isArray(value)) throw new TypeError("Transmux core returned a non-array event payload.");
975
+ return value.map((event) => normalizeCoreEvent(event));
976
+ }
977
+ function coreMediaInfoToPlayerMediaInfo(mediaInfo) {
978
+ const result = { container: mediaInfo.container };
979
+ if (mediaInfo.videoCodec !== void 0) result.videoCodec = mediaInfo.videoCodec;
980
+ if (mediaInfo.audioCodec !== void 0) result.audioCodec = mediaInfo.audioCodec;
981
+ if (mediaInfo.width !== void 0) result.width = mediaInfo.width;
982
+ if (mediaInfo.height !== void 0) result.height = mediaInfo.height;
983
+ if (mediaInfo.audioSampleRate !== void 0) result.audioSampleRate = mediaInfo.audioSampleRate;
984
+ if (mediaInfo.audioChannelCount !== void 0) result.audioChannelCount = mediaInfo.audioChannelCount;
985
+ return result;
986
+ }
987
+ function coreErrorToPlayerError(error) {
988
+ return {
989
+ kind: coreErrorKind(error.code),
990
+ code: `RIVMUX_CORE_${coreErrorCodeLabel(error.code)}`,
991
+ message: error.message,
992
+ terminal: true
993
+ };
994
+ }
995
+ function coreWarningToPlayerWarning(warning) {
996
+ return {
997
+ code: warning.code,
998
+ message: warning.message
999
+ };
1000
+ }
1001
+ function normalizeCoreEvent(value) {
1002
+ if (!isRecord$1(value) || typeof value.type !== "string") throw new TypeError("Transmux core event is missing a string type.");
1003
+ const data = value.data;
1004
+ switch (value.type) {
1005
+ case "probeResult": return {
1006
+ type: "probeResult",
1007
+ data: normalizeProbeResult(data)
1008
+ };
1009
+ case "mediaInfo": return {
1010
+ type: "mediaInfo",
1011
+ data: normalizeMediaInfo(data)
1012
+ };
1013
+ case "initSegment": return {
1014
+ type: "initSegment",
1015
+ data: normalizeInitSegment(data)
1016
+ };
1017
+ case "mediaSegment": return {
1018
+ type: "mediaSegment",
1019
+ data: normalizeMediaSegment(data)
1020
+ };
1021
+ case "videoConfig":
1022
+ case "audioConfig":
1023
+ case "videoSample":
1024
+ case "audioSample":
1025
+ case "metadata":
1026
+ case "discontinuity": return {
1027
+ type: value.type,
1028
+ data
1029
+ };
1030
+ case "warning": return {
1031
+ type: "warning",
1032
+ data: normalizeWarning(data)
1033
+ };
1034
+ case "fatalError": return {
1035
+ type: "fatalError",
1036
+ data: normalizeError(data)
1037
+ };
1038
+ default: throw new TypeError(`Unsupported transmux core event type: ${value.type}.`);
1039
+ }
1040
+ }
1041
+ function normalizeInitSegment(value) {
1042
+ if (!isRecord$1(value)) throw new TypeError("Transmux core initSegment event payload must be an object.");
1043
+ return {
1044
+ track: normalizeTrackKind(value.track),
1045
+ codec: normalizeRequiredPrimitive(value.codec, "string", "initSegment codec"),
1046
+ timescale: normalizeRequiredPrimitive(value.timescale, "number", "initSegment timescale"),
1047
+ bytes: normalizeBytes(value.bytes, "initSegment bytes")
1048
+ };
1049
+ }
1050
+ function normalizeMediaSegment(value) {
1051
+ if (!isRecord$1(value)) throw new TypeError("Transmux core mediaSegment event payload must be an object.");
1052
+ return {
1053
+ track: normalizeTrackKind(value.track),
1054
+ dtsStartMs: normalizeRequiredPrimitive(value.dtsStartMs, "number", "mediaSegment dtsStartMs"),
1055
+ dtsEndMs: normalizeRequiredPrimitive(value.dtsEndMs, "number", "mediaSegment dtsEndMs"),
1056
+ keyframe: normalizeRequiredPrimitive(value.keyframe, "boolean", "mediaSegment keyframe"),
1057
+ bytes: normalizeBytes(value.bytes, "mediaSegment bytes")
1058
+ };
1059
+ }
1060
+ function normalizeProbeResult(value) {
1061
+ if (!isRecord$1(value) || value.container !== "flv" && value.container !== "mpegTs") throw new TypeError("Transmux core probe result has an unsupported container.");
1062
+ const result = { container: value.container };
1063
+ const video = normalizeOptionalString(value.video, [
1064
+ "avc",
1065
+ "hevc",
1066
+ "av1"
1067
+ ]);
1068
+ const audio = normalizeOptionalString(value.audio, [
1069
+ "aac",
1070
+ "mp3",
1071
+ "ac3",
1072
+ "eac3",
1073
+ "opus"
1074
+ ]);
1075
+ if (video !== void 0) result.video = video;
1076
+ if (audio !== void 0) result.audio = audio;
1077
+ return result;
1078
+ }
1079
+ function normalizeMediaInfo(value) {
1080
+ if (!isRecord$1(value)) throw new TypeError("Transmux core mediaInfo event payload must be an object.");
1081
+ const result = { ...normalizeProbeResult(value) };
1082
+ const videoCodec = normalizeOptionalPrimitive(value.videoCodec, "string");
1083
+ const audioCodec = normalizeOptionalPrimitive(value.audioCodec, "string");
1084
+ const width = normalizeOptionalPrimitive(value.width, "number");
1085
+ const height = normalizeOptionalPrimitive(value.height, "number");
1086
+ const audioSampleRate = normalizeOptionalPrimitive(value.audioSampleRate, "number");
1087
+ const audioChannelCount = normalizeOptionalPrimitive(value.audioChannelCount, "number");
1088
+ if (videoCodec !== void 0) result.videoCodec = videoCodec;
1089
+ if (audioCodec !== void 0) result.audioCodec = audioCodec;
1090
+ if (width !== void 0) result.width = width;
1091
+ if (height !== void 0) result.height = height;
1092
+ if (audioSampleRate !== void 0) result.audioSampleRate = audioSampleRate;
1093
+ if (audioChannelCount !== void 0) result.audioChannelCount = audioChannelCount;
1094
+ return result;
1095
+ }
1096
+ function normalizeWarning(value) {
1097
+ if (!isRecord$1(value) || typeof value.code !== "string" || typeof value.message !== "string") throw new TypeError("Transmux core warning payload must include code and message.");
1098
+ return {
1099
+ code: value.code,
1100
+ message: value.message
1101
+ };
1102
+ }
1103
+ function normalizeError(value) {
1104
+ if (!isRecord$1(value) || typeof value.code !== "string" || typeof value.message !== "string") throw new TypeError("Transmux core error payload must include code and message.");
1105
+ return {
1106
+ code: normalizeCoreErrorCode(value.code),
1107
+ message: value.message
1108
+ };
1109
+ }
1110
+ function normalizeCoreErrorCode(code) {
1111
+ if (![
1112
+ "unsupportedContainer",
1113
+ "unsupportedVideoCodec",
1114
+ "unsupportedAudioCodec",
1115
+ "invalidContainerData",
1116
+ "invalidCodecConfig",
1117
+ "invalidTimestamp",
1118
+ "muxerError",
1119
+ "internalError"
1120
+ ].includes(code)) throw new TypeError(`Unsupported transmux core error code: ${code}.`);
1121
+ return code;
1122
+ }
1123
+ function coreErrorKind(code) {
1124
+ switch (code) {
1125
+ case "unsupportedContainer":
1126
+ case "unsupportedVideoCodec":
1127
+ case "unsupportedAudioCodec": return "unsupported";
1128
+ case "invalidContainerData": return "demux";
1129
+ case "invalidCodecConfig": return "codec";
1130
+ case "invalidTimestamp": return "demux";
1131
+ case "muxerError": return "mux";
1132
+ case "internalError": return "runtime";
1133
+ }
1134
+ }
1135
+ function coreErrorCodeLabel(code) {
1136
+ return code.replace(/[A-Z]/g, (letter) => `_${letter}`).toUpperCase();
1137
+ }
1138
+ function normalizeOptionalString(value, allowed) {
1139
+ if (value === void 0 || value === null) return;
1140
+ if (typeof value === "string" && allowed.includes(value)) return value;
1141
+ throw new TypeError(`Unexpected transmux core enum value: ${String(value)}.`);
1142
+ }
1143
+ function normalizeOptionalPrimitive(value, expectedType) {
1144
+ if (value === void 0 || value === null) return;
1145
+ if (typeof value === expectedType) return value;
1146
+ throw new TypeError(`Expected optional ${expectedType}, received ${typeof value}.`);
1147
+ }
1148
+ function normalizeRequiredPrimitive(value, expectedType, field) {
1149
+ if (typeof value !== expectedType) throw new TypeError(`Expected ${field} to be ${expectedType}, received ${typeof value}.`);
1150
+ return value;
1151
+ }
1152
+ function normalizeTrackKind(value) {
1153
+ if (value === "video" || value === "audio" || value === "muxed") return value;
1154
+ throw new TypeError(`Unsupported transmux core track kind: ${String(value)}.`);
1155
+ }
1156
+ function normalizeBytes(value, field) {
1157
+ if (value instanceof Uint8Array) return value;
1158
+ if (Array.isArray(value) && value.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) return new Uint8Array(value);
1159
+ throw new TypeError(`Expected ${field} to be Uint8Array-compatible bytes.`);
1160
+ }
1161
+ function isRecord$1(value) {
1162
+ return typeof value === "object" && value !== null;
1163
+ }
1164
+ //#endregion
1165
+ //#region \0wasm-helpers.js
1166
+ function instantiate(source, imports, stream) {
1167
+ const instantiate = WebAssembly[stream ? "instantiateStreaming" : "instantiate"];
1168
+ return instantiate(source, imports).then(({ instance }) => instance);
1169
+ }
1170
+ function loadWasmModule(sync, fileUrl, src, imports) {
1171
+ let buf = null;
1172
+ if (fileUrl) return instantiate(fetch(fileUrl), imports, true);
1173
+ const raw = globalThis.atob(src);
1174
+ const len = raw.length;
1175
+ buf = new Uint8Array(new ArrayBuffer(len));
1176
+ for (let i = 0; i < len; i++) buf[i] = raw.charCodeAt(i);
1177
+ if (sync) {
1178
+ const mod = new WebAssembly.Module(buf);
1179
+ return new WebAssembly.Instance(mod, imports);
1180
+ } else return instantiate(buf, imports);
1181
+ }
1182
+ //#endregion
1183
+ //#region ../../crates/transmux-core/dist/rivmux_transmux_core_bg.js
1184
+ var TransmuxCore = class {
1185
+ __destroy_into_raw() {
1186
+ const ptr = this.__wbg_ptr;
1187
+ this.__wbg_ptr = 0;
1188
+ TransmuxCoreFinalization.unregister(this);
1189
+ return ptr;
1190
+ }
1191
+ free() {
1192
+ const ptr = this.__destroy_into_raw();
1193
+ wasm.__wbg_transmuxcore_free(ptr, 0);
1194
+ }
1195
+ destroy() {
1196
+ wasm.transmuxcore_destroy(this.__wbg_ptr);
1197
+ }
1198
+ /**
1199
+ * @returns {any}
1200
+ */
1201
+ flush() {
1202
+ try {
1203
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1204
+ wasm.transmuxcore_flush(retptr, this.__wbg_ptr);
1205
+ var r0 = getDataViewMemory0().getInt32(retptr + 0, true);
1206
+ var r1 = getDataViewMemory0().getInt32(retptr + 4, true);
1207
+ if (getDataViewMemory0().getInt32(retptr + 8, true)) throw takeObject(r1);
1208
+ return takeObject(r0);
1209
+ } finally {
1210
+ wasm.__wbindgen_add_to_stack_pointer(16);
1211
+ }
1212
+ }
1213
+ constructor() {
1214
+ const ret = wasm.transmuxcore_new();
1215
+ this.__wbg_ptr = ret;
1216
+ TransmuxCoreFinalization.register(this, this.__wbg_ptr, this);
1217
+ return this;
1218
+ }
1219
+ /**
1220
+ * @param {Uint8Array} data
1221
+ * @returns {any}
1222
+ */
1223
+ pushChunk(data) {
1224
+ try {
1225
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1226
+ const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export);
1227
+ const len0 = WASM_VECTOR_LEN;
1228
+ wasm.transmuxcore_pushChunk(retptr, this.__wbg_ptr, ptr0, len0);
1229
+ var r0 = getDataViewMemory0().getInt32(retptr + 0, true);
1230
+ var r1 = getDataViewMemory0().getInt32(retptr + 4, true);
1231
+ if (getDataViewMemory0().getInt32(retptr + 8, true)) throw takeObject(r1);
1232
+ return takeObject(r0);
1233
+ } finally {
1234
+ wasm.__wbindgen_add_to_stack_pointer(16);
1235
+ }
1236
+ }
1237
+ reset() {
1238
+ wasm.transmuxcore_reset(this.__wbg_ptr);
1239
+ }
1240
+ };
1241
+ if (Symbol.dispose) TransmuxCore.prototype[Symbol.dispose] = TransmuxCore.prototype.free;
1242
+ function __wbg_Error_fdd633d4bb5dd76a(arg0, arg1) {
1243
+ return addHeapObject(Error(getStringFromWasm0(arg0, arg1)));
1244
+ }
1245
+ function __wbg_String_8564e559799eccda(arg0, arg1) {
1246
+ const ptr1 = passStringToWasm0(String(getObject(arg1)), wasm.__wbindgen_export, wasm.__wbindgen_export2);
1247
+ const len1 = WASM_VECTOR_LEN;
1248
+ getDataViewMemory0().setInt32(arg0 + 4, len1, true);
1249
+ getDataViewMemory0().setInt32(arg0 + 0, ptr1, true);
1250
+ }
1251
+ function __wbg___wbindgen_throw_ea4887a5f8f9a9db(arg0, arg1) {
1252
+ throw new Error(getStringFromWasm0(arg0, arg1));
1253
+ }
1254
+ function __wbg_new_2e117a478906f062() {
1255
+ return addHeapObject(/* @__PURE__ */ new Object());
1256
+ }
1257
+ function __wbg_new_36e147a8ced3c6e0() {
1258
+ return addHeapObject(new Array());
1259
+ }
1260
+ function __wbg_set_6be42768c690e380(arg0, arg1, arg2) {
1261
+ getObject(arg0)[takeObject(arg1)] = takeObject(arg2);
1262
+ }
1263
+ function __wbg_set_dc601f4a69da0bc2(arg0, arg1, arg2) {
1264
+ getObject(arg0)[arg1 >>> 0] = takeObject(arg2);
1265
+ }
1266
+ function __wbindgen_cast_0000000000000001(arg0) {
1267
+ return addHeapObject(arg0);
1268
+ }
1269
+ function __wbindgen_cast_0000000000000002(arg0) {
1270
+ return addHeapObject(arg0);
1271
+ }
1272
+ function __wbindgen_cast_0000000000000003(arg0, arg1) {
1273
+ return addHeapObject(getStringFromWasm0(arg0, arg1));
1274
+ }
1275
+ function __wbindgen_object_clone_ref(arg0) {
1276
+ return addHeapObject(getObject(arg0));
1277
+ }
1278
+ function __wbindgen_object_drop_ref(arg0) {
1279
+ takeObject(arg0);
1280
+ }
1281
+ const TransmuxCoreFinalization = typeof FinalizationRegistry === "undefined" ? {
1282
+ register: () => {},
1283
+ unregister: () => {}
1284
+ } : new FinalizationRegistry((ptr) => wasm.__wbg_transmuxcore_free(ptr, 1));
1285
+ function addHeapObject(obj) {
1286
+ if (heap_next === heap.length) heap.push(heap.length + 1);
1287
+ const idx = heap_next;
1288
+ heap_next = heap[idx];
1289
+ heap[idx] = obj;
1290
+ return idx;
1291
+ }
1292
+ function dropObject(idx) {
1293
+ if (idx < 1028) return;
1294
+ heap[idx] = heap_next;
1295
+ heap_next = idx;
1296
+ }
1297
+ let cachedDataViewMemory0 = null;
1298
+ function getDataViewMemory0() {
1299
+ if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || cachedDataViewMemory0.buffer.detached === void 0 && cachedDataViewMemory0.buffer !== wasm.memory.buffer) cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
1300
+ return cachedDataViewMemory0;
1301
+ }
1302
+ function getStringFromWasm0(ptr, len) {
1303
+ return decodeText(ptr >>> 0, len);
1304
+ }
1305
+ let cachedUint8ArrayMemory0 = null;
1306
+ function getUint8ArrayMemory0() {
1307
+ if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
1308
+ return cachedUint8ArrayMemory0;
1309
+ }
1310
+ function getObject(idx) {
1311
+ return heap[idx];
1312
+ }
1313
+ let heap = new Array(1024).fill(void 0);
1314
+ heap.push(void 0, null, true, false);
1315
+ let heap_next = heap.length;
1316
+ function passArray8ToWasm0(arg, malloc) {
1317
+ const ptr = malloc(arg.length * 1, 1) >>> 0;
1318
+ getUint8ArrayMemory0().set(arg, ptr / 1);
1319
+ WASM_VECTOR_LEN = arg.length;
1320
+ return ptr;
1321
+ }
1322
+ function passStringToWasm0(arg, malloc, realloc) {
1323
+ if (realloc === void 0) {
1324
+ const buf = cachedTextEncoder.encode(arg);
1325
+ const ptr = malloc(buf.length, 1) >>> 0;
1326
+ getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
1327
+ WASM_VECTOR_LEN = buf.length;
1328
+ return ptr;
1329
+ }
1330
+ let len = arg.length;
1331
+ let ptr = malloc(len, 1) >>> 0;
1332
+ const mem = getUint8ArrayMemory0();
1333
+ let offset = 0;
1334
+ for (; offset < len; offset++) {
1335
+ const code = arg.charCodeAt(offset);
1336
+ if (code > 127) break;
1337
+ mem[ptr + offset] = code;
1338
+ }
1339
+ if (offset !== len) {
1340
+ if (offset !== 0) arg = arg.slice(offset);
1341
+ ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
1342
+ const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
1343
+ const ret = cachedTextEncoder.encodeInto(arg, view);
1344
+ offset += ret.written;
1345
+ ptr = realloc(ptr, len, offset, 1) >>> 0;
1346
+ }
1347
+ WASM_VECTOR_LEN = offset;
1348
+ return ptr;
1349
+ }
1350
+ function takeObject(idx) {
1351
+ const ret = getObject(idx);
1352
+ dropObject(idx);
1353
+ return ret;
1354
+ }
1355
+ let cachedTextDecoder = new TextDecoder("utf-8", {
1356
+ ignoreBOM: true,
1357
+ fatal: true
1358
+ });
1359
+ cachedTextDecoder.decode();
1360
+ const MAX_SAFARI_DECODE_BYTES = 2146435072;
1361
+ let numBytesDecoded = 0;
1362
+ function decodeText(ptr, len) {
1363
+ numBytesDecoded += len;
1364
+ if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
1365
+ cachedTextDecoder = new TextDecoder("utf-8", {
1366
+ ignoreBOM: true,
1367
+ fatal: true
1368
+ });
1369
+ cachedTextDecoder.decode();
1370
+ numBytesDecoded = len;
1371
+ }
1372
+ return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
1373
+ }
1374
+ const cachedTextEncoder = new TextEncoder();
1375
+ if (!("encodeInto" in cachedTextEncoder)) cachedTextEncoder.encodeInto = function(arg, view) {
1376
+ const buf = cachedTextEncoder.encode(arg);
1377
+ view.set(buf);
1378
+ return {
1379
+ read: arg.length,
1380
+ written: buf.length
1381
+ };
1382
+ };
1383
+ let WASM_VECTOR_LEN = 0;
1384
+ let wasm;
1385
+ function __wbg_set_wasm(val) {
1386
+ wasm = val;
1387
+ }
1388
+ //#endregion
1389
+ //#region ../../crates/transmux-core/dist/rivmux_transmux_core_bg.wasm
1390
+ var rivmux_transmux_core_bg_exports = /* @__PURE__ */ __exportAll({
1391
+ __abort_handler: () => __abort_handler,
1392
+ __instance_terminated: () => __instance_terminated,
1393
+ __wbg_transmuxcore_free: () => __wbg_transmuxcore_free,
1394
+ __wbindgen_add_to_stack_pointer: () => __wbindgen_add_to_stack_pointer,
1395
+ __wbindgen_export: () => __wbindgen_export,
1396
+ __wbindgen_export2: () => __wbindgen_export2,
1397
+ memory: () => memory,
1398
+ transmuxcore_destroy: () => transmuxcore_destroy,
1399
+ transmuxcore_flush: () => transmuxcore_flush,
1400
+ transmuxcore_new: () => transmuxcore_new,
1401
+ transmuxcore_pushChunk: () => transmuxcore_pushChunk,
1402
+ transmuxcore_reset: () => transmuxcore_reset
1403
+ });
1404
+ function __wasm_init(imports) {
1405
+ return loadWasmModule(false, new URL("rivmux-transmux-core.wasm", import.meta.url), null, imports);
1406
+ }
1407
+ const instance = await __wasm_init({ "./rivmux_transmux_core_bg.js": {
1408
+ "__wbindgen_object_drop_ref": __wbindgen_object_drop_ref,
1409
+ "__wbg_set_dc601f4a69da0bc2": __wbg_set_dc601f4a69da0bc2,
1410
+ "__wbg_set_6be42768c690e380": __wbg_set_6be42768c690e380,
1411
+ "__wbindgen_object_clone_ref": __wbindgen_object_clone_ref,
1412
+ "__wbg_String_8564e559799eccda": __wbg_String_8564e559799eccda,
1413
+ "__wbg_new_36e147a8ced3c6e0": __wbg_new_36e147a8ced3c6e0,
1414
+ "__wbg_new_2e117a478906f062": __wbg_new_2e117a478906f062,
1415
+ "__wbg___wbindgen_throw_ea4887a5f8f9a9db": __wbg___wbindgen_throw_ea4887a5f8f9a9db,
1416
+ "__wbg_Error_fdd633d4bb5dd76a": __wbg_Error_fdd633d4bb5dd76a,
1417
+ "__wbindgen_cast_0000000000000001": __wbindgen_cast_0000000000000001,
1418
+ "__wbindgen_cast_0000000000000002": __wbindgen_cast_0000000000000002,
1419
+ "__wbindgen_cast_0000000000000003": __wbindgen_cast_0000000000000003
1420
+ } });
1421
+ const memory = instance.exports.memory;
1422
+ const __wbg_transmuxcore_free = instance.exports.__wbg_transmuxcore_free;
1423
+ const transmuxcore_destroy = instance.exports.transmuxcore_destroy;
1424
+ const transmuxcore_flush = instance.exports.transmuxcore_flush;
1425
+ const transmuxcore_new = instance.exports.transmuxcore_new;
1426
+ const transmuxcore_pushChunk = instance.exports.transmuxcore_pushChunk;
1427
+ const transmuxcore_reset = instance.exports.transmuxcore_reset;
1428
+ const __abort_handler = instance.exports.__abort_handler;
1429
+ const __instance_terminated = instance.exports.__instance_terminated;
1430
+ const __wbindgen_export = instance.exports.__wbindgen_export;
1431
+ const __wbindgen_export2 = instance.exports.__wbindgen_export2;
1432
+ const __wbindgen_add_to_stack_pointer = instance.exports.__wbindgen_add_to_stack_pointer;
1433
+ //#endregion
1434
+ //#region ../../crates/transmux-core/dist/rivmux_transmux_core.js
1435
+ __wbg_set_wasm(rivmux_transmux_core_bg_exports);
1436
+ //#endregion
1437
+ //#region src/wasm/wasm-loader.ts
1438
+ function createWasmTransmuxCoreHost(Core) {
1439
+ return Core === void 0 ? void 0 : new WasmTransmuxCoreHost(Core);
1440
+ }
1441
+ function createBundledWasmTransmuxCoreHost() {
1442
+ return new WasmTransmuxCoreHost(TransmuxCore);
1443
+ }
1444
+ async function loadWasmTransmuxCoreHost(wasmUrl) {
1445
+ if (wasmUrl === void 0) return createBundledWasmTransmuxCoreHost();
1446
+ const wasmModule = normalizeWasmBindgenModule(await nativeDynamicImport(toWasmBindgenGlueUrl(wasmUrl)));
1447
+ await wasmModule.default(wasmUrl);
1448
+ return new WasmTransmuxCoreHost(wasmModule.TransmuxCore);
1449
+ }
1450
+ function toWasmBindgenGlueUrl(wasmUrl) {
1451
+ const url = new URL(wasmUrl, globalThis.location?.href ?? "http://localhost/");
1452
+ const path = url.pathname;
1453
+ url.pathname = path.endsWith("_bg.wasm") ? `${path.slice(0, -8)}.js` : path.replace(/\.wasm$/u, ".js");
1454
+ return url.href;
1455
+ }
1456
+ function normalizeWasmBindgenModule(value) {
1457
+ if (!isRecord(value) || typeof value.default !== "function" || typeof value.TransmuxCore !== "function") throw new TypeError("WASM transmux module must export default init and TransmuxCore.");
1458
+ return value;
1459
+ }
1460
+ function nativeDynamicImport(url) {
1461
+ return new Function("url", "return import(url)")(url);
1462
+ }
1463
+ function isRecord(value) {
1464
+ return typeof value === "object" && value !== null;
1465
+ }
1466
+ //#endregion
1467
+ //#region src/runtime.ts
1468
+ var RuntimeWorker = class {
1469
+ constructor(port, dependencies = {}) {
1470
+ this.state = "idle";
1471
+ this.lastLatencyMetrics = {};
1472
+ this.statsTickInFlight = false;
1473
+ this.loaderRunId = 0;
1474
+ this.outputBytes = 0;
1475
+ this.appendQueueMaxLength = 0;
1476
+ this.appendQueueMaxBytes = 0;
1477
+ this.port = port;
1478
+ this.createMseController = dependencies.createMseController ?? (() => new MseController());
1479
+ this.createLoader = dependencies.createLoader ?? ((config) => new HttpFlvLoader(config));
1480
+ this.createTransmuxCore = dependencies.createTransmuxCore ?? ((options) => loadWasmTransmuxCoreHost(options.runtime.wasmUrl));
1481
+ this.now = dependencies.now ?? (() => performance.now());
1482
+ }
1483
+ async handleCommand(command) {
1484
+ if (this.state === "destroyed") return;
1485
+ try {
1486
+ switch (command.type) {
1487
+ case "init":
1488
+ this.url = command.url;
1489
+ this.options = command.options;
1490
+ this.latencyController = createLatencyController(command.options);
1491
+ this.state = "ready";
1492
+ this.post({ type: "ready" });
1493
+ return;
1494
+ case "attach-media-source":
1495
+ await this.attachMediaSource();
1496
+ return;
1497
+ case "start":
1498
+ await this.start();
1499
+ return;
1500
+ case "stop":
1501
+ await this.stop();
1502
+ return;
1503
+ case "update-options":
1504
+ this.options = this.options === void 0 ? void 0 : mergeOptions(this.options, command.options);
1505
+ if (this.options !== void 0) this.latencyController = createLatencyController(this.options);
1506
+ return;
1507
+ case "video-state":
1508
+ this.videoState = command.state;
1509
+ await this.applyLatencyPolicy();
1510
+ this.postStats();
1511
+ return;
1512
+ case "playback-control-result":
1513
+ this.latencyController?.recordPlaybackControlResult(command.result);
1514
+ return;
1515
+ case "destroy":
1516
+ await this.destroy();
1517
+ return;
1518
+ }
1519
+ } catch (cause) {
1520
+ this.fail("runtime", "RIVMUX_WORKER_COMMAND_FAILED", "Worker command failed.", true, cause);
1521
+ }
1522
+ }
1523
+ async attachMediaSource() {
1524
+ if (this.state === "idle") {
1525
+ this.fail("runtime", "RIVMUX_WORKER_NOT_INITIALIZED", "Worker must be initialized before attach.", true);
1526
+ return;
1527
+ }
1528
+ if (this.mse === void 0) this.mse = this.createMseController();
1529
+ try {
1530
+ const handle = await this.mse.createMediaSourceHandle();
1531
+ this.post({
1532
+ type: "media-source-handle",
1533
+ handle
1534
+ }, [handle]);
1535
+ this.state = "attached";
1536
+ } catch (cause) {
1537
+ this.fail("mse", "RIVMUX_MSE_ATTACH_FAILED", "MSE media source attachment failed.", true, cause);
1538
+ }
1539
+ }
1540
+ async start() {
1541
+ const options = this.options;
1542
+ if (this.mse === void 0 || options === void 0 || this.state === "idle" || this.state === "ready") {
1543
+ this.fail("runtime", "RIVMUX_WORKER_START_REQUIRES_ATTACH", "Worker start requires an attached MediaSource.", true);
1544
+ return;
1545
+ }
1546
+ if (this.state === "started") return;
1547
+ const fixture = createM1StaticFmp4Fixture();
1548
+ const transmuxCore = await this.createTransmuxCore(options);
1549
+ const hasTransmuxCore = transmuxCore !== void 0;
1550
+ if (transmuxCore !== void 0) {
1551
+ this.transmuxCore?.destroy();
1552
+ this.transmuxCore = transmuxCore;
1553
+ } else try {
1554
+ await this.mse.appendFixture(fixture);
1555
+ } catch (cause) {
1556
+ this.fail("mse", "RIVMUX_MSE_APPEND_FAILED", "MSE append failed.", true, cause);
1557
+ return;
1558
+ }
1559
+ this.state = "started";
1560
+ this.outputBytes = hasTransmuxCore ? 0 : fixture.initSegment.byteLength + fixture.mediaSegment.byteLength;
1561
+ this.appendQueueMaxLength = 0;
1562
+ this.appendQueueMaxBytes = 0;
1563
+ if (!hasTransmuxCore) this.post({
1564
+ type: "media-info",
1565
+ mediaInfo: {
1566
+ container: "fmp4",
1567
+ videoCodec: fixture.codec,
1568
+ width: fixture.width,
1569
+ height: fixture.height
1570
+ }
1571
+ });
1572
+ this.startStatsTimer();
1573
+ await this.applyLatencyPolicy();
1574
+ this.postStats();
1575
+ this.startLoader();
1576
+ }
1577
+ async stop() {
1578
+ await this.closeLoader();
1579
+ this.mse?.destroy();
1580
+ this.mse = void 0;
1581
+ this.latencyController?.reset();
1582
+ this.videoState = void 0;
1583
+ this.lastLatencyMetrics = {};
1584
+ this.state = "stopped";
1585
+ this.post({ type: "stopped" });
1586
+ }
1587
+ async destroy() {
1588
+ await this.closeLoader();
1589
+ this.mse?.destroy();
1590
+ this.mse = void 0;
1591
+ this.latencyController?.reset();
1592
+ this.videoState = void 0;
1593
+ this.lastLatencyMetrics = {};
1594
+ this.state = "destroyed";
1595
+ this.post({ type: "destroyed" });
1596
+ this.port.close();
1597
+ }
1598
+ startLoader() {
1599
+ const options = this.options;
1600
+ const url = this.url;
1601
+ if (options === void 0 || url === void 0) {
1602
+ this.fail("runtime", "RIVMUX_WORKER_NOT_INITIALIZED", "Worker must be initialized before loader start.", true);
1603
+ return;
1604
+ }
1605
+ const loader = this.createLoader({
1606
+ url,
1607
+ network: options.network
1608
+ });
1609
+ const runId = this.loaderRunId + 1;
1610
+ this.loaderRunId = runId;
1611
+ this.loader = loader;
1612
+ this.runLoader(loader, runId);
1613
+ }
1614
+ async runLoader(loader, runId) {
1615
+ try {
1616
+ await loader.open();
1617
+ while (this.isCurrentLoader(loader, runId)) {
1618
+ await this.applyLatencyPolicy();
1619
+ const chunk = await loader.read();
1620
+ if (chunk === null) break;
1621
+ this.postStats(loader.stats);
1622
+ if (!await this.processTransmuxEvents(this.transmuxCore?.pushChunk(chunk.bytes) ?? [])) {
1623
+ await this.closeCurrentLoader(loader, runId);
1624
+ return;
1625
+ }
1626
+ await this.applyLatencyPolicy();
1627
+ this.postStats(loader.stats);
1628
+ }
1629
+ } catch (cause) {
1630
+ if (!this.isCurrentLoader(loader, runId) || isAbortLikeError(cause)) return;
1631
+ await this.closeCurrentLoader(loader, runId);
1632
+ this.fail("network", getNetworkErrorCode(cause), "HTTP Fetch loader failed.", true, cause);
1633
+ return;
1634
+ } finally {
1635
+ if (this.isCurrentLoader(loader, runId)) await this.closeCurrentLoader(loader, runId);
1636
+ }
1637
+ }
1638
+ async closeLoader() {
1639
+ this.stopStatsTimer();
1640
+ const loader = this.loader;
1641
+ if (loader === void 0) return;
1642
+ this.loader = void 0;
1643
+ this.loaderRunId += 1;
1644
+ this.transmuxCore?.destroy();
1645
+ this.transmuxCore = void 0;
1646
+ await loader.close();
1647
+ }
1648
+ async closeCurrentLoader(loader, runId) {
1649
+ if (this.loader !== loader || this.loaderRunId !== runId) return;
1650
+ this.stopStatsTimer();
1651
+ this.loader = void 0;
1652
+ this.loaderRunId += 1;
1653
+ this.transmuxCore?.destroy();
1654
+ this.transmuxCore = void 0;
1655
+ await loader.close();
1656
+ }
1657
+ isCurrentLoader(loader, runId) {
1658
+ return this.loader === loader && this.loaderRunId === runId && this.state === "started";
1659
+ }
1660
+ postStats(loaderStats) {
1661
+ const metrics = this.lastLatencyMetrics;
1662
+ const mseStats = this.collectMseStats();
1663
+ const loaderSnapshot = loaderStats ?? this.loader?.stats;
1664
+ this.post({
1665
+ type: "stats",
1666
+ stats: {
1667
+ bytesReceived: loaderSnapshot?.bytesReceived ?? 0,
1668
+ currentNetworkSpeed: loaderSnapshot?.currentNetworkSpeed ?? 0,
1669
+ networkIdleMs: getNetworkIdleMs(loaderSnapshot, this.now()),
1670
+ outputBytes: this.outputBytes,
1671
+ appendQueueLength: mseStats.appendQueueLength,
1672
+ appendQueueBytes: mseStats.appendQueueBytes,
1673
+ appendQueueMaxLength: this.appendQueueMaxLength,
1674
+ appendQueueMaxBytes: this.appendQueueMaxBytes,
1675
+ loaderPaused: this.loader?.paused ?? false,
1676
+ sourceBufferUpdating: mseStats.sourceBufferUpdating,
1677
+ sourceBufferCount: mseStats.sourceBufferCount,
1678
+ bufferedStart: metrics.bufferedStart ?? this.mse?.bufferedStart,
1679
+ bufferedEnd: metrics.bufferedEnd ?? this.mse?.bufferedEnd,
1680
+ bufferedDuration: metrics.bufferedDuration ?? this.mse?.bufferedDuration,
1681
+ bufferedRangeCount: mseStats.bufferedRangeCount,
1682
+ currentTime: metrics.currentTime,
1683
+ liveLatency: metrics.liveLatency,
1684
+ playbackRate: metrics.playbackRate,
1685
+ readyState: metrics.readyState,
1686
+ droppedFrames: metrics.droppedFrames
1687
+ }
1688
+ });
1689
+ }
1690
+ async processTransmuxEvents(events) {
1691
+ for (const event of events) switch (event.type) {
1692
+ case "mediaInfo":
1693
+ this.post({
1694
+ type: "media-info",
1695
+ mediaInfo: coreMediaInfoToPlayerMediaInfo(event.data)
1696
+ });
1697
+ break;
1698
+ case "warning":
1699
+ this.post({
1700
+ type: "warning",
1701
+ warning: coreWarningToPlayerWarning(event.data)
1702
+ });
1703
+ break;
1704
+ case "fatalError":
1705
+ this.post({
1706
+ type: "error",
1707
+ error: coreErrorToPlayerError(event.data)
1708
+ });
1709
+ this.state = "fatal-error";
1710
+ return false;
1711
+ case "initSegment":
1712
+ if (!await this.appendToMse(() => this.mse?.appendInitSegment(event.data))) return false;
1713
+ this.outputBytes += event.data.bytes.byteLength;
1714
+ await this.applyLatencyPolicy();
1715
+ break;
1716
+ case "mediaSegment":
1717
+ if (!await this.appendToMse(() => this.mse?.appendMediaSegment(event.data))) return false;
1718
+ this.outputBytes += event.data.bytes.byteLength;
1719
+ await this.applyLatencyPolicy();
1720
+ break;
1721
+ case "probeResult":
1722
+ case "videoConfig":
1723
+ case "audioConfig":
1724
+ case "videoSample":
1725
+ case "audioSample":
1726
+ case "metadata":
1727
+ case "discontinuity": break;
1728
+ }
1729
+ return true;
1730
+ }
1731
+ collectMseStats() {
1732
+ const appendQueueLength = this.mse?.appendQueueLength ?? 0;
1733
+ const appendQueueBytes = this.mse?.appendQueueBytes ?? 0;
1734
+ this.appendQueueMaxLength = Math.max(this.appendQueueMaxLength, appendQueueLength);
1735
+ this.appendQueueMaxBytes = Math.max(this.appendQueueMaxBytes, appendQueueBytes);
1736
+ return {
1737
+ appendQueueLength,
1738
+ appendQueueBytes,
1739
+ sourceBufferUpdating: this.mse?.sourceBufferUpdating ?? false,
1740
+ sourceBufferCount: this.mse?.sourceBufferCount ?? 0,
1741
+ bufferedRangeCount: this.mse?.bufferedRangeCount ?? 0
1742
+ };
1743
+ }
1744
+ async appendToMse(append) {
1745
+ try {
1746
+ await append();
1747
+ return true;
1748
+ } catch (cause) {
1749
+ this.fail("mse", "RIVMUX_MSE_APPEND_FAILED", "MSE append failed.", true, cause);
1750
+ return false;
1751
+ }
1752
+ }
1753
+ async applyLatencyPolicy() {
1754
+ const latencyController = this.latencyController;
1755
+ const mse = this.mse;
1756
+ if (latencyController === void 0 || mse === void 0) return;
1757
+ const loader = this.loader;
1758
+ const evaluation = latencyController.evaluate({
1759
+ ranges: mse.bufferedRanges,
1760
+ videoState: this.videoState,
1761
+ loaderPaused: loader?.paused ?? false,
1762
+ nowMs: this.now()
1763
+ });
1764
+ this.lastLatencyMetrics = evaluation.metrics;
1765
+ if (evaluation.cleanupBefore !== void 0) await mse.cleanupBefore(evaluation.cleanupBefore);
1766
+ if (loader !== void 0 && evaluation.loaderCommand === "pause") loader.pause();
1767
+ else if (loader !== void 0 && evaluation.loaderCommand === "resume") loader.resume();
1768
+ if (evaluation.playbackControl !== void 0) this.post({
1769
+ type: "playback-control",
1770
+ action: evaluation.playbackControl
1771
+ });
1772
+ }
1773
+ startStatsTimer() {
1774
+ this.stopStatsTimer();
1775
+ const intervalMs = this.options?.diagnostics.statsIntervalMs;
1776
+ if (intervalMs === void 0 || intervalMs <= 0) return;
1777
+ this.statsTimer = setInterval(() => {
1778
+ this.emitStatsTick();
1779
+ }, intervalMs);
1780
+ }
1781
+ stopStatsTimer() {
1782
+ if (this.statsTimer === void 0) return;
1783
+ clearInterval(this.statsTimer);
1784
+ this.statsTimer = void 0;
1785
+ this.statsTickInFlight = false;
1786
+ }
1787
+ async emitStatsTick() {
1788
+ if (this.statsTickInFlight || this.state !== "started") return;
1789
+ this.statsTickInFlight = true;
1790
+ try {
1791
+ await this.applyLatencyPolicy();
1792
+ this.postStats();
1793
+ } catch (cause) {
1794
+ this.fail("mse", "RIVMUX_MSE_LATENCY_POLICY_FAILED", "MSE latency policy failed.", true, cause);
1795
+ } finally {
1796
+ this.statsTickInFlight = false;
1797
+ }
1798
+ }
1799
+ fail(kind, code, message, terminal, cause) {
1800
+ const error = cause === void 0 ? {
1801
+ kind,
1802
+ code,
1803
+ message,
1804
+ terminal
1805
+ } : {
1806
+ kind,
1807
+ code,
1808
+ message,
1809
+ terminal,
1810
+ cause: serializeCause(cause)
1811
+ };
1812
+ if (terminal) this.state = "fatal-error";
1813
+ this.post({
1814
+ type: "error",
1815
+ error
1816
+ });
1817
+ }
1818
+ post(message, transfer) {
1819
+ this.port.postMessage(message, transfer);
1820
+ }
1821
+ };
1822
+ function getNetworkErrorCode(cause) {
1823
+ return cause instanceof HttpFlvLoaderError ? cause.code : "RIVMUX_HTTP_LOADER_FAILED";
1824
+ }
1825
+ function getNetworkIdleMs(stats, nowMs) {
1826
+ const markerMs = stats?.lastChunkAtMs ?? stats?.startedAtMs;
1827
+ if (markerMs === void 0) return;
1828
+ return Math.max(nowMs - markerMs, 0);
1829
+ }
1830
+ function serializeCause(cause) {
1831
+ if (cause instanceof Error) return {
1832
+ name: cause.name,
1833
+ message: cause.message
1834
+ };
1835
+ return cause;
1836
+ }
1837
+ function createLatencyController(options) {
1838
+ return new LatencyController({
1839
+ latency: options.latency,
1840
+ playback: options.playback
1841
+ });
1842
+ }
1843
+ function mergeOptions(current, updates) {
1844
+ return {
1845
+ playback: {
1846
+ ...current.playback,
1847
+ ...updates.playback
1848
+ },
1849
+ latency: {
1850
+ ...current.latency,
1851
+ ...updates.latency
1852
+ },
1853
+ network: {
1854
+ ...current.network,
1855
+ ...updates.network,
1856
+ headers: {
1857
+ ...current.network.headers,
1858
+ ...updates.network?.headers
1859
+ },
1860
+ retry: {
1861
+ ...current.network.retry,
1862
+ ...updates.network?.retry
1863
+ }
1864
+ },
1865
+ runtime: {
1866
+ ...current.runtime,
1867
+ ...updates.runtime
1868
+ },
1869
+ diagnostics: {
1870
+ ...current.diagnostics,
1871
+ ...updates.diagnostics
1872
+ }
1873
+ };
1874
+ }
1875
+ //#endregion
1876
+ //#region src/worker-entry.ts
1877
+ function startRuntimeWorker(scope) {
1878
+ const runtime = new RuntimeWorker({
1879
+ postMessage: (message, transfer) => scope.postMessage(message, transfer),
1880
+ close: () => scope.close()
1881
+ });
1882
+ scope.addEventListener("message", (event) => {
1883
+ runtime.handleCommand(event.data);
1884
+ });
1885
+ scope.postMessage({ type: "worker-ready" });
1886
+ return runtime;
1887
+ }
1888
+ const globalScope = globalThis;
1889
+ const workerGlobalScope = globalThis.WorkerGlobalScope;
1890
+ if (workerGlobalScope !== void 0 && globalScope instanceof workerGlobalScope && typeof globalScope.postMessage === "function") startRuntimeWorker(globalScope);
1891
+ //#endregion
1892
+ export { HttpFlvLoader, HttpFlvLoaderError, M1_VIDEO_MIME, MseController, RuntimeWorker, SourceBufferQueue, WasmTransmuxCoreHost, createM1StaticFmp4Fixture, createWasmTransmuxCoreHost, isMseSupported, normalizeCoreEvents, startRuntimeWorker };
1893
+
1894
+ //# sourceMappingURL=rivmux-runtime-worker.js.map