@dan-uni/dan-any 0.2.6 → 0.4.8

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.
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import * as __WEBPACK_EXTERNAL_MODULE_fast_xml_parser_1c5d6bda__ from "fast-xml-parser";
2
- import * as __WEBPACK_EXTERNAL_MODULE_canvas__ from "canvas";
3
- import * as __WEBPACK_EXTERNAL_MODULE_hh_mm_ss_6ead5141__ from "hh-mm-ss";
4
- import * as __WEBPACK_EXTERNAL_MODULE_jssha__ from "jssha";
5
- import * as __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__ from "node:zlib";
6
- import * as __WEBPACK_EXTERNAL_MODULE_base16384__ from "base16384";
1
+ import { XMLBuilder, XMLParser } from "fast-xml-parser";
2
+ import hh_mm_ss from "hh-mm-ss";
3
+ import jssha from "jssha";
4
+ import { createCanvas } from "canvas";
5
+ import { brotliCompressSync, brotliDecompressSync, gunzipSync, gzipSync } from "node:zlib";
6
+ import { decode, encode as external_base16384_encode } from "base16384";
7
7
  var __webpack_require__ = {};
8
8
  (()=>{
9
- __webpack_require__.d = function(exports, definition) {
9
+ __webpack_require__.d = (exports, definition)=>{
10
10
  for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {
11
11
  enumerable: true,
12
12
  get: definition[key]
@@ -14,12 +14,10 @@ var __webpack_require__ = {};
14
14
  };
15
15
  })();
16
16
  (()=>{
17
- __webpack_require__.o = function(obj, prop) {
18
- return Object.prototype.hasOwnProperty.call(obj, prop);
19
- };
17
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
20
18
  })();
21
19
  (()=>{
22
- __webpack_require__.r = function(exports) {
20
+ __webpack_require__.r = (exports)=>{
23
21
  if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports, Symbol.toStringTag, {
24
22
  value: 'Module'
25
23
  });
@@ -28,13 +26,23 @@ var __webpack_require__ = {};
28
26
  });
29
27
  };
30
28
  })();
29
+ var platform_namespaceObject = {};
30
+ __webpack_require__.r(platform_namespaceObject);
31
+ __webpack_require__.d(platform_namespaceObject, {
32
+ PlatformDanmakuOnlySource: ()=>platform_PlatformDanmakuOnlySource,
33
+ PlatformDanmakuOnlySources: ()=>PlatformDanmakuOnlySources,
34
+ PlatformDanmakuSources: ()=>PlatformDanmakuSources,
35
+ PlatformInfoSource: ()=>platform_PlatformInfoSource,
36
+ PlatformInfoSources: ()=>PlatformInfoSources,
37
+ PlatformSources: ()=>PlatformSources,
38
+ PlatformVideoSource: ()=>platform_PlatformVideoSource,
39
+ PlatformVideoSources: ()=>PlatformVideoSources
40
+ });
31
41
  var id_gen_namespaceObject = {};
32
42
  __webpack_require__.r(id_gen_namespaceObject);
33
43
  __webpack_require__.d(id_gen_namespaceObject, {
34
- UniID: ()=>UniID,
35
- createDMID: ()=>createDMID,
36
- domainPreset: ()=>domainPreset,
37
- platforms: ()=>platforms
44
+ UniID: ()=>id_gen_UniID,
45
+ createDMID: ()=>createDMID
38
46
  });
39
47
  var dm_gen_namespaceObject = {};
40
48
  __webpack_require__.r(dm_gen_namespaceObject);
@@ -244,7 +252,10 @@ function makeInt64Support() {
244
252
  const dv = new DataView(new ArrayBuffer(8));
245
253
  const ok = "function" == typeof BigInt && "function" == typeof dv.getBigInt64 && "function" == typeof dv.getBigUint64 && "function" == typeof dv.setBigInt64 && "function" == typeof dv.setBigUint64 && ("object" != typeof process || "object" != typeof process.env || "1" !== process.env.BUF_BIGINT_DISABLE);
246
254
  if (ok) {
247
- const MIN = BigInt("-9223372036854775808"), MAX = BigInt("9223372036854775807"), UMIN = BigInt("0"), UMAX = BigInt("18446744073709551615");
255
+ const MIN = BigInt("-9223372036854775808");
256
+ const MAX = BigInt("9223372036854775807");
257
+ const UMIN = BigInt("0");
258
+ const UMAX = BigInt("18446744073709551615");
248
259
  return {
249
260
  zero: BigInt(0),
250
261
  supported: true,
@@ -327,8 +338,6 @@ function scalarZeroValue(type, longAsString) {
327
338
  return "";
328
339
  case descriptors_ScalarType.BOOL:
329
340
  return false;
330
- default:
331
- return 0;
332
341
  case descriptors_ScalarType.DOUBLE:
333
342
  case descriptors_ScalarType.FLOAT:
334
343
  return 0.0;
@@ -340,6 +349,8 @@ function scalarZeroValue(type, longAsString) {
340
349
  return longAsString ? "0" : protoInt64.zero;
341
350
  case descriptors_ScalarType.BYTES:
342
351
  return new Uint8Array(0);
352
+ default:
353
+ return 0;
343
354
  }
344
355
  }
345
356
  function isScalarZeroValue(type, value) {
@@ -438,8 +449,9 @@ function isReflectList(arg, field) {
438
449
  var _a, _b, _c, _d;
439
450
  if (isObject(arg) && unsafeLocal in arg && "add" in arg && "field" in arg && "function" == typeof arg.field) {
440
451
  if (void 0 !== field) {
441
- const a = field, b = arg.field();
442
- return a.listKind == b.listKind && a.scalar === b.scalar && (null === (_a = a.message) || void 0 === _a ? void 0 : _a.typeName) === (null === (_b = b.message) || void 0 === _b ? void 0 : _b.typeName) && (null === (_c = a.enum) || void 0 === _c ? void 0 : _c.typeName) === (null === (_d = b.enum) || void 0 === _d ? void 0 : _d.typeName);
452
+ const a = field;
453
+ const b = arg.field();
454
+ return a.listKind == b.listKind && a.scalar === b.scalar && (null == (_a = a.message) ? void 0 : _a.typeName) === (null == (_b = b.message) ? void 0 : _b.typeName) && (null == (_c = a.enum) ? void 0 : _c.typeName) === (null == (_d = b.enum) ? void 0 : _d.typeName);
443
455
  }
444
456
  return true;
445
457
  }
@@ -450,7 +462,7 @@ function isReflectMap(arg, field) {
450
462
  if (isObject(arg) && unsafeLocal in arg && "has" in arg && "field" in arg && "function" == typeof arg.field) {
451
463
  if (void 0 !== field) {
452
464
  const a = field, b = arg.field();
453
- return a.mapKey === b.mapKey && a.mapKind == b.mapKind && a.scalar === b.scalar && (null === (_a = a.message) || void 0 === _a ? void 0 : _a.typeName) === (null === (_b = b.message) || void 0 === _b ? void 0 : _b.typeName) && (null === (_c = a.enum) || void 0 === _c ? void 0 : _c.typeName) === (null === (_d = b.enum) || void 0 === _d ? void 0 : _d.typeName);
465
+ return a.mapKey === b.mapKey && a.mapKind == b.mapKind && a.scalar === b.scalar && (null == (_a = a.message) ? void 0 : _a.typeName) === (null == (_b = b.message) ? void 0 : _b.typeName) && (null == (_c = a.enum) ? void 0 : _c.typeName) === (null == (_d = b.enum) ? void 0 : _d.typeName);
454
466
  }
455
467
  return true;
456
468
  }
@@ -475,7 +487,7 @@ function getTextEncoding() {
475
487
  try {
476
488
  encodeURIComponent(text);
477
489
  return true;
478
- } catch (e) {
490
+ } catch (_) {
479
491
  return false;
480
492
  }
481
493
  }
@@ -493,7 +505,7 @@ var binary_encoding_WireType;
493
505
  WireType[WireType["Bit32"] = 5] = "Bit32";
494
506
  })(binary_encoding_WireType || (binary_encoding_WireType = {}));
495
507
  const FLOAT32_MAX = 3.4028234663852886e38;
496
- const FLOAT32_MIN = -340282346638528860000000000000000000000;
508
+ const FLOAT32_MIN = -3.4028234663852886e+38;
497
509
  const UINT32_MAX = 0xffffffff;
498
510
  const INT32_MAX = 0x7fffffff;
499
511
  const INT32_MIN = -2147483648;
@@ -623,12 +635,12 @@ class BinaryWriter {
623
635
  return this;
624
636
  }
625
637
  sint64(value) {
626
- let tc = protoInt64.enc(value), sign = tc.hi >> 31, lo = tc.lo << 1 ^ sign, hi = (tc.hi << 1 | tc.lo >>> 31) ^ sign;
638
+ const tc = protoInt64.enc(value), sign = tc.hi >> 31, lo = tc.lo << 1 ^ sign, hi = (tc.hi << 1 | tc.lo >>> 31) ^ sign;
627
639
  varint64write(lo, hi, this.buf);
628
640
  return this;
629
641
  }
630
642
  uint64(value) {
631
- let tc = protoInt64.uEnc(value);
643
+ const tc = protoInt64.uEnc(value);
632
644
  varint64write(tc.lo, tc.hi, this.buf);
633
645
  return this;
634
646
  }
@@ -751,7 +763,7 @@ function assertFloat32(arg) {
751
763
  if ("string" == typeof arg) {
752
764
  const o = arg;
753
765
  arg = Number(arg);
754
- if (isNaN(arg) && "NaN" !== o) throw new Error("invalid float32: " + o);
766
+ if (Number.isNaN(arg) && "NaN" !== o) throw new Error("invalid float32: " + o);
755
767
  } else if ("number" != typeof arg) throw new Error("invalid float32: " + typeof arg);
756
768
  if (Number.isFinite(arg) && (arg > FLOAT32_MAX || arg < FLOAT32_MIN)) throw new Error("invalid float32: " + arg);
757
769
  }
@@ -821,22 +833,22 @@ function checkScalarValue(value, scalar) {
821
833
  case descriptors_ScalarType.INT64:
822
834
  case descriptors_ScalarType.SFIXED64:
823
835
  case descriptors_ScalarType.SINT64:
824
- if ("string" != typeof value && "bigint" != typeof value && "number" != typeof value) return false;
825
- try {
836
+ if ("bigint" == typeof value || "number" == typeof value || "string" == typeof value && value.length > 0) try {
826
837
  protoInt64.parse(value);
827
- } catch (e) {
838
+ return true;
839
+ } catch (_) {
828
840
  return `${value} out of range`;
829
841
  }
830
- return true;
842
+ return false;
831
843
  case descriptors_ScalarType.FIXED64:
832
844
  case descriptors_ScalarType.UINT64:
833
- if ("string" != typeof value && "bigint" != typeof value && "number" != typeof value) return false;
834
- try {
845
+ if ("bigint" == typeof value || "number" == typeof value || "string" == typeof value && value.length > 0) try {
835
846
  protoInt64.uParse(value);
836
- } catch (e) {
847
+ return true;
848
+ } catch (_) {
837
849
  return `${value} out of range`;
838
850
  }
839
- return true;
851
+ return false;
840
852
  }
841
853
  }
842
854
  function reasonSingular(field, val, details) {
@@ -1084,7 +1096,7 @@ function reflect_reflect(messageDesc, message, check = true) {
1084
1096
  class ReflectMessageImpl {
1085
1097
  get sortedFields() {
1086
1098
  var _a;
1087
- return null !== (_a = this._sortedFields) && void 0 !== _a ? _a : this._sortedFields = this.desc.fields.concat().sort((a, b)=>a.number - b.number);
1099
+ return null != (_a = this._sortedFields) ? _a : this._sortedFields = this.desc.fields.concat().sort((a, b)=>a.number - b.number);
1088
1100
  }
1089
1101
  constructor(messageDesc, message, check = true){
1090
1102
  this.lists = new Map();
@@ -1453,8 +1465,9 @@ function fromBinary(schema, bytes, options) {
1453
1465
  function readMessage(message, reader, options, delimited, lengthOrDelimitedFieldNo) {
1454
1466
  var _a;
1455
1467
  const end = delimited ? reader.len : reader.pos + lengthOrDelimitedFieldNo;
1456
- let fieldNo, wireType;
1457
- const unknownFields = null !== (_a = message.getUnknown()) && void 0 !== _a ? _a : [];
1468
+ let fieldNo;
1469
+ let wireType;
1470
+ const unknownFields = null != (_a = message.getUnknown()) ? _a : [];
1458
1471
  while(reader.pos < end){
1459
1472
  [fieldNo, wireType] = reader.tag();
1460
1473
  if (delimited && wireType == binary_encoding_WireType.EndGroup) break;
@@ -1496,7 +1509,8 @@ function readField(message, reader, field, wireType, options) {
1496
1509
  }
1497
1510
  function readMapEntry(reader, map, options) {
1498
1511
  const field = map.field();
1499
- let key, val;
1512
+ let key;
1513
+ let val;
1500
1514
  const end = reader.pos + reader.uint32();
1501
1515
  while(reader.pos < end){
1502
1516
  const [fieldNo] = reader.tag();
@@ -1536,16 +1550,10 @@ function readMapEntry(reader, map, options) {
1536
1550
  function readListField(reader, wireType, list, options) {
1537
1551
  var _a;
1538
1552
  const field = list.field();
1539
- if ("message" === field.listKind) {
1540
- list.add(readMessageField(reader, options, field));
1541
- return;
1542
- }
1543
- const scalarType = null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32;
1553
+ if ("message" === field.listKind) return void list.add(readMessageField(reader, options, field));
1554
+ const scalarType = null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32;
1544
1555
  const packed = wireType == binary_encoding_WireType.LengthDelimited && scalarType != descriptors_ScalarType.STRING && scalarType != descriptors_ScalarType.BYTES;
1545
- if (!packed) {
1546
- list.add(readScalar(reader, scalarType));
1547
- return;
1548
- }
1556
+ if (!packed) return void list.add(readScalar(reader, scalarType));
1549
1557
  const e = reader.uint32() + reader.pos;
1550
1558
  while(reader.pos < e)list.add(readScalar(reader, scalarType));
1551
1559
  }
@@ -1603,12 +1611,12 @@ function writeFields(writer, opts, msg) {
1603
1611
  var _a;
1604
1612
  for (const f of msg.sortedFields){
1605
1613
  if (!msg.isSet(f)) {
1606
- if (f.presence == LEGACY_REQUIRED) throw new Error(`cannot encode field ${msg.desc.typeName}.${f.name} to binary: required field not set`);
1614
+ if (f.presence == LEGACY_REQUIRED) throw new Error(`cannot encode ${f} to binary: required field not set`);
1607
1615
  continue;
1608
1616
  }
1609
1617
  writeField(writer, opts, msg, f);
1610
1618
  }
1611
- if (opts.writeUnknownFields) for (const { no, wireType, data } of null !== (_a = msg.getUnknown()) && void 0 !== _a ? _a : [])writer.tag(no, wireType).raw(data);
1619
+ if (opts.writeUnknownFields) for (const { no, wireType, data } of null != (_a = msg.getUnknown()) ? _a : [])writer.tag(no, wireType).raw(data);
1612
1620
  return writer;
1613
1621
  }
1614
1622
  function writeField(writer, opts, msg, field) {
@@ -1616,7 +1624,7 @@ function writeField(writer, opts, msg, field) {
1616
1624
  switch(field.fieldKind){
1617
1625
  case "scalar":
1618
1626
  case "enum":
1619
- writeScalar(writer, null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32, field.number, msg.get(field));
1627
+ writeScalar(writer, msg.desc.typeName, field.name, null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32, field.number, msg.get(field));
1620
1628
  break;
1621
1629
  case "list":
1622
1630
  writeListField(writer, opts, field, msg.get(field));
@@ -1629,8 +1637,8 @@ function writeField(writer, opts, msg, field) {
1629
1637
  break;
1630
1638
  }
1631
1639
  }
1632
- function writeScalar(writer, scalarType, fieldNo, value) {
1633
- writeScalarValue(writer.tag(fieldNo, writeTypeOfScalar(scalarType)), scalarType, value);
1640
+ function writeScalar(writer, msgName, fieldName, scalarType, fieldNo, value) {
1641
+ writeScalarValue(writer.tag(fieldNo, writeTypeOfScalar(scalarType)), msgName, fieldName, scalarType, value);
1634
1642
  }
1635
1643
  function writeMessageField(writer, opts, field, message) {
1636
1644
  if (field.delimitedEncoding) writeFields(writer.tag(field.number, binary_encoding_WireType.StartGroup), opts, message).tag(field.number, binary_encoding_WireType.EndGroup);
@@ -1642,24 +1650,24 @@ function writeListField(writer, opts, field, list) {
1642
1650
  for (const item of list)writeMessageField(writer, opts, field, item);
1643
1651
  return;
1644
1652
  }
1645
- const scalarType = null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32;
1653
+ const scalarType = null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32;
1646
1654
  if (field.packed) {
1647
1655
  if (!list.size) return;
1648
1656
  writer.tag(field.number, binary_encoding_WireType.LengthDelimited).fork();
1649
- for (const item of list)writeScalarValue(writer, scalarType, item);
1657
+ for (const item of list)writeScalarValue(writer, field.parent.typeName, field.name, scalarType, item);
1650
1658
  writer.join();
1651
1659
  return;
1652
1660
  }
1653
- for (const item of list)writeScalar(writer, scalarType, field.number, item);
1661
+ for (const item of list)writeScalar(writer, field.parent.typeName, field.name, scalarType, field.number, item);
1654
1662
  }
1655
1663
  function writeMapEntry(writer, opts, field, key, value) {
1656
1664
  var _a;
1657
1665
  writer.tag(field.number, binary_encoding_WireType.LengthDelimited).fork();
1658
- writeScalar(writer, field.mapKey, 1, key);
1666
+ writeScalar(writer, field.parent.typeName, field.name, field.mapKey, 1, key);
1659
1667
  switch(field.mapKind){
1660
1668
  case "scalar":
1661
1669
  case "enum":
1662
- writeScalar(writer, null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32, 2, value);
1670
+ writeScalar(writer, field.parent.typeName, field.name, null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32, 2, value);
1663
1671
  break;
1664
1672
  case "message":
1665
1673
  writeFields(writer.tag(2, binary_encoding_WireType.LengthDelimited).fork(), opts, value).join();
@@ -1667,53 +1675,58 @@ function writeMapEntry(writer, opts, field, key, value) {
1667
1675
  }
1668
1676
  writer.join();
1669
1677
  }
1670
- function writeScalarValue(writer, type, value) {
1671
- switch(type){
1672
- case descriptors_ScalarType.STRING:
1673
- writer.string(value);
1674
- break;
1675
- case descriptors_ScalarType.BOOL:
1676
- writer.bool(value);
1677
- break;
1678
- case descriptors_ScalarType.DOUBLE:
1679
- writer.double(value);
1680
- break;
1681
- case descriptors_ScalarType.FLOAT:
1682
- writer.float(value);
1683
- break;
1684
- case descriptors_ScalarType.INT32:
1685
- writer.int32(value);
1686
- break;
1687
- case descriptors_ScalarType.INT64:
1688
- writer.int64(value);
1689
- break;
1690
- case descriptors_ScalarType.UINT64:
1691
- writer.uint64(value);
1692
- break;
1693
- case descriptors_ScalarType.FIXED64:
1694
- writer.fixed64(value);
1695
- break;
1696
- case descriptors_ScalarType.BYTES:
1697
- writer.bytes(value);
1698
- break;
1699
- case descriptors_ScalarType.FIXED32:
1700
- writer.fixed32(value);
1701
- break;
1702
- case descriptors_ScalarType.SFIXED32:
1703
- writer.sfixed32(value);
1704
- break;
1705
- case descriptors_ScalarType.SFIXED64:
1706
- writer.sfixed64(value);
1707
- break;
1708
- case descriptors_ScalarType.SINT64:
1709
- writer.sint64(value);
1710
- break;
1711
- case descriptors_ScalarType.UINT32:
1712
- writer.uint32(value);
1713
- break;
1714
- case descriptors_ScalarType.SINT32:
1715
- writer.sint32(value);
1716
- break;
1678
+ function writeScalarValue(writer, msgName, fieldName, type, value) {
1679
+ try {
1680
+ switch(type){
1681
+ case descriptors_ScalarType.STRING:
1682
+ writer.string(value);
1683
+ break;
1684
+ case descriptors_ScalarType.BOOL:
1685
+ writer.bool(value);
1686
+ break;
1687
+ case descriptors_ScalarType.DOUBLE:
1688
+ writer.double(value);
1689
+ break;
1690
+ case descriptors_ScalarType.FLOAT:
1691
+ writer.float(value);
1692
+ break;
1693
+ case descriptors_ScalarType.INT32:
1694
+ writer.int32(value);
1695
+ break;
1696
+ case descriptors_ScalarType.INT64:
1697
+ writer.int64(value);
1698
+ break;
1699
+ case descriptors_ScalarType.UINT64:
1700
+ writer.uint64(value);
1701
+ break;
1702
+ case descriptors_ScalarType.FIXED64:
1703
+ writer.fixed64(value);
1704
+ break;
1705
+ case descriptors_ScalarType.BYTES:
1706
+ writer.bytes(value);
1707
+ break;
1708
+ case descriptors_ScalarType.FIXED32:
1709
+ writer.fixed32(value);
1710
+ break;
1711
+ case descriptors_ScalarType.SFIXED32:
1712
+ writer.sfixed32(value);
1713
+ break;
1714
+ case descriptors_ScalarType.SFIXED64:
1715
+ writer.sfixed64(value);
1716
+ break;
1717
+ case descriptors_ScalarType.SINT64:
1718
+ writer.sint64(value);
1719
+ break;
1720
+ case descriptors_ScalarType.UINT32:
1721
+ writer.uint32(value);
1722
+ break;
1723
+ case descriptors_ScalarType.SINT32:
1724
+ writer.sint32(value);
1725
+ break;
1726
+ }
1727
+ } catch (e) {
1728
+ if (e instanceof Error) throw new Error(`cannot encode field ${msgName}.${fieldName} to binary: ${e.message}`);
1729
+ throw e;
1717
1730
  }
1718
1731
  }
1719
1732
  function writeTypeOfScalar(type) {
@@ -1868,11 +1881,11 @@ function parseTextFormatScalarValue(type, value) {
1868
1881
  case descriptors_ScalarType.FLOAT:
1869
1882
  switch(value){
1870
1883
  case "inf":
1871
- return Number.POSITIVE_INFINITY;
1884
+ return 1 / 0;
1872
1885
  case "-inf":
1873
- return Number.NEGATIVE_INFINITY;
1886
+ return -1 / 0;
1874
1887
  case "nan":
1875
- return Number.NaN;
1888
+ return NaN;
1876
1889
  default:
1877
1890
  return parseFloat(value);
1878
1891
  }
@@ -1943,7 +1956,7 @@ function unescapeBytesDefaultValue(str) {
1943
1956
  const t = input.take(2);
1944
1957
  if (false === t) return false;
1945
1958
  const n = parseInt(s + t, 8);
1946
- if (isNaN(n)) return false;
1959
+ if (Number.isNaN(n)) return false;
1947
1960
  b.push(n);
1948
1961
  break;
1949
1962
  }
@@ -1953,7 +1966,7 @@ function unescapeBytesDefaultValue(str) {
1953
1966
  const t = input.take(2);
1954
1967
  if (false === t) return false;
1955
1968
  const n = parseInt(s + t, 16);
1956
- if (isNaN(n)) return false;
1969
+ if (Number.isNaN(n)) return false;
1957
1970
  b.push(n);
1958
1971
  break;
1959
1972
  }
@@ -1963,7 +1976,7 @@ function unescapeBytesDefaultValue(str) {
1963
1976
  const t = input.take(4);
1964
1977
  if (false === t) return false;
1965
1978
  const n = parseInt(s + t, 16);
1966
- if (isNaN(n)) return false;
1979
+ if (Number.isNaN(n)) return false;
1967
1980
  const chunk = new Uint8Array(4);
1968
1981
  const view = new DataView(chunk.buffer);
1969
1982
  view.setInt32(0, n, true);
@@ -2091,7 +2104,7 @@ function createBaseRegistry() {
2091
2104
  },
2092
2105
  getExtensionFor (extendee, no) {
2093
2106
  var _a;
2094
- return null === (_a = extendees.get(extendee.typeName)) || void 0 === _a ? void 0 : _a.get(no);
2107
+ return null == (_a = extendees.get(extendee.typeName)) ? void 0 : _a.get(no);
2095
2108
  },
2096
2109
  getService (typeName) {
2097
2110
  const t = types.get(typeName);
@@ -2123,7 +2136,8 @@ const featureDefaults = {
2123
2136
  repeatedFieldEncoding: 2,
2124
2137
  utf8Validation: 3,
2125
2138
  messageEncoding: 1,
2126
- jsonFormat: 2
2139
+ jsonFormat: 2,
2140
+ enforceNamingStyle: 2
2127
2141
  },
2128
2142
  999: {
2129
2143
  fieldPresence: 2,
@@ -2131,7 +2145,8 @@ const featureDefaults = {
2131
2145
  repeatedFieldEncoding: 1,
2132
2146
  utf8Validation: 2,
2133
2147
  messageEncoding: 1,
2134
- jsonFormat: 1
2148
+ jsonFormat: 1,
2149
+ enforceNamingStyle: 2
2135
2150
  },
2136
2151
  1000: {
2137
2152
  fieldPresence: 1,
@@ -2139,7 +2154,8 @@ const featureDefaults = {
2139
2154
  repeatedFieldEncoding: 1,
2140
2155
  utf8Validation: 2,
2141
2156
  messageEncoding: 1,
2142
- jsonFormat: 1
2157
+ jsonFormat: 1,
2158
+ enforceNamingStyle: 2
2143
2159
  }
2144
2160
  };
2145
2161
  function addFile(proto, reg) {
@@ -2147,7 +2163,7 @@ function addFile(proto, reg) {
2147
2163
  const file = {
2148
2164
  kind: "file",
2149
2165
  proto,
2150
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2166
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2151
2167
  edition: getFileEdition(proto),
2152
2168
  name: proto.name.replace(/\.proto$/, ""),
2153
2169
  dependencies: findFileDependencies(proto, reg),
@@ -2166,7 +2182,7 @@ function addFile(proto, reg) {
2166
2182
  },
2167
2183
  add (desc) {
2168
2184
  var _a;
2169
- assert((null === (_a = desc.proto.options) || void 0 === _a ? void 0 : _a.mapEntry) === true);
2185
+ assert((null == (_a = desc.proto.options) ? void 0 : _a.mapEntry) === true);
2170
2186
  mapEntriesStore.set(desc.typeName, desc);
2171
2187
  }
2172
2188
  };
@@ -2221,12 +2237,12 @@ function addFields(message, reg, mapEntries) {
2221
2237
  for (const child of message.nestedMessages)addFields(child, reg, mapEntries);
2222
2238
  }
2223
2239
  function addEnum(proto, file, parent, reg) {
2224
- var _a, _b, _c;
2240
+ var _a, _b, _c, _d, _e;
2225
2241
  const sharedPrefix = findEnumSharedPrefix(proto.name, proto.value);
2226
2242
  const desc = {
2227
2243
  kind: "enum",
2228
2244
  proto,
2229
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2245
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2230
2246
  file,
2231
2247
  parent,
2232
2248
  open: true,
@@ -2241,30 +2257,29 @@ function addEnum(proto, file, parent, reg) {
2241
2257
  };
2242
2258
  desc.open = isEnumOpen(desc);
2243
2259
  reg.add(desc);
2244
- proto.value.forEach((proto)=>{
2245
- var _a, _b;
2246
- const name = proto.name;
2247
- desc.values.push(desc.value[proto.number] = {
2260
+ for (const p of proto.value){
2261
+ const name = p.name;
2262
+ desc.values.push(desc.value[p.number] = {
2248
2263
  kind: "enum_value",
2249
- proto,
2250
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2264
+ proto: p,
2265
+ deprecated: null != (_d = null == (_c = p.options) ? void 0 : _c.deprecated) ? _d : false,
2251
2266
  parent: desc,
2252
2267
  name,
2253
2268
  localName: safeObjectProperty(void 0 == sharedPrefix ? name : name.substring(sharedPrefix.length)),
2254
- number: proto.number,
2269
+ number: p.number,
2255
2270
  toString () {
2256
2271
  return `enum value ${desc.typeName}.${name}`;
2257
2272
  }
2258
2273
  });
2259
- });
2260
- (null !== (_c = null == parent ? void 0 : parent.nestedEnums) && void 0 !== _c ? _c : file.enums).push(desc);
2274
+ }
2275
+ (null != (_e = null == parent ? void 0 : parent.nestedEnums) ? _e : file.enums).push(desc);
2261
2276
  }
2262
2277
  function addMessage(proto, file, parent, reg, mapEntries) {
2263
2278
  var _a, _b, _c, _d;
2264
2279
  const desc = {
2265
2280
  kind: "message",
2266
2281
  proto,
2267
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2282
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2268
2283
  file,
2269
2284
  parent,
2270
2285
  name: proto.name,
@@ -2280,9 +2295,9 @@ function addMessage(proto, file, parent, reg, mapEntries) {
2280
2295
  return `message ${this.typeName}`;
2281
2296
  }
2282
2297
  };
2283
- if ((null === (_c = proto.options) || void 0 === _c ? void 0 : _c.mapEntry) === true) mapEntries.add(desc);
2298
+ if ((null == (_c = proto.options) ? void 0 : _c.mapEntry) === true) mapEntries.add(desc);
2284
2299
  else {
2285
- (null !== (_d = null == parent ? void 0 : parent.nestedMessages) && void 0 !== _d ? _d : file.messages).push(desc);
2300
+ (null != (_d = null == parent ? void 0 : parent.nestedMessages) ? _d : file.messages).push(desc);
2286
2301
  reg.add(desc);
2287
2302
  }
2288
2303
  for (const enumProto of proto.enumType)addEnum(enumProto, file, desc, reg);
@@ -2293,7 +2308,7 @@ function addService(proto, file, reg) {
2293
2308
  const desc = {
2294
2309
  kind: "service",
2295
2310
  proto,
2296
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2311
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2297
2312
  file,
2298
2313
  name: proto.name,
2299
2314
  typeName: makeTypeName(proto, void 0, file),
@@ -2323,14 +2338,14 @@ function newMethod(proto, parent, reg) {
2323
2338
  return {
2324
2339
  kind: "rpc",
2325
2340
  proto,
2326
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2341
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2327
2342
  parent,
2328
2343
  name,
2329
2344
  localName: safeObjectProperty(name.length ? safeObjectProperty(name[0].toLowerCase() + name.substring(1)) : name),
2330
2345
  methodKind,
2331
2346
  input,
2332
2347
  output,
2333
- idempotency: null !== (_d = null === (_c = proto.options) || void 0 === _c ? void 0 : _c.idempotencyLevel) && void 0 !== _d ? _d : IDEMPOTENCY_UNKNOWN,
2348
+ idempotency: null != (_d = null == (_c = proto.options) ? void 0 : _c.idempotencyLevel) ? _d : IDEMPOTENCY_UNKNOWN,
2334
2349
  toString () {
2335
2350
  return `rpc ${parent.typeName}.${name}`;
2336
2351
  }
@@ -2356,7 +2371,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
2356
2371
  const field = {
2357
2372
  kind: "field",
2358
2373
  proto,
2359
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2374
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2360
2375
  name: proto.name,
2361
2376
  number: proto.number,
2362
2377
  scalar: void 0,
@@ -2396,7 +2411,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
2396
2411
  }
2397
2412
  const label = proto.label;
2398
2413
  const type = proto.type;
2399
- const jstype = null === (_c = proto.options) || void 0 === _c ? void 0 : _c.jstype;
2414
+ const jstype = null == (_c = proto.options) ? void 0 : _c.jstype;
2400
2415
  if (label === LABEL_REPEATED) {
2401
2416
  const mapEntry = type == TYPE_MESSAGE ? null == mapEntries ? void 0 : mapEntries.get(trimLeadingDot(proto.typeName)) : void 0;
2402
2417
  if (mapEntry) {
@@ -2513,12 +2528,13 @@ function getFieldPresence(proto, oneof, isExtension, parent) {
2513
2528
  if (proto.label == LABEL_REQUIRED) return registry_LEGACY_REQUIRED;
2514
2529
  if (proto.label == LABEL_REPEATED) return registry_IMPLICIT;
2515
2530
  if (!!oneof || proto.proto3Optional) return EXPLICIT;
2516
- if (proto.type == TYPE_MESSAGE) return EXPLICIT;
2517
2531
  if (isExtension) return EXPLICIT;
2518
- return resolveFeature("fieldPresence", {
2532
+ const resolved = resolveFeature("fieldPresence", {
2519
2533
  proto,
2520
2534
  parent
2521
2535
  });
2536
+ if (resolved == registry_IMPLICIT && (proto.type == TYPE_MESSAGE || proto.type == TYPE_GROUP)) return EXPLICIT;
2537
+ return resolved;
2522
2538
  }
2523
2539
  function isPackedField(proto, parent) {
2524
2540
  if (proto.label != LABEL_REPEATED) return false;
@@ -2549,7 +2565,7 @@ function isEnumOpen(desc) {
2549
2565
  var _a;
2550
2566
  return OPEN == resolveFeature("enumType", {
2551
2567
  proto: desc.proto,
2552
- parent: null !== (_a = desc.parent) && void 0 !== _a ? _a : desc.file
2568
+ parent: null != (_a = desc.parent) ? _a : desc.file
2553
2569
  });
2554
2570
  }
2555
2571
  function isDelimitedEncoding(proto, parent) {
@@ -2561,13 +2577,13 @@ function isDelimitedEncoding(proto, parent) {
2561
2577
  }
2562
2578
  function resolveFeature(name, ref) {
2563
2579
  var _a, _b;
2564
- const featureSet = null === (_a = ref.proto.options) || void 0 === _a ? void 0 : _a.features;
2580
+ const featureSet = null == (_a = ref.proto.options) ? void 0 : _a.features;
2565
2581
  if (featureSet) {
2566
2582
  const val = featureSet[name];
2567
2583
  if (0 != val) return val;
2568
2584
  }
2569
2585
  if ("kind" in ref) {
2570
- if ("message" == ref.kind) return resolveFeature(name, null !== (_b = ref.parent) && void 0 !== _b ? _b : ref.file);
2586
+ if ("message" == ref.kind) return resolveFeature(name, null != (_b = ref.parent) ? _b : ref.file);
2571
2587
  const editionDefaults = featureDefaults[ref.edition];
2572
2588
  if (!editionDefaults) throw new Error(`feature default for edition ${ref.edition} not found`);
2573
2589
  return editionDefaults[name];
@@ -2605,13 +2621,13 @@ function bootDescriptorProto(init) {
2605
2621
  return {
2606
2622
  $typeName: "google.protobuf.DescriptorProto",
2607
2623
  name: init.name,
2608
- field: null !== (_b = null === (_a = init.field) || void 0 === _a ? void 0 : _a.map(bootFieldDescriptorProto)) && void 0 !== _b ? _b : [],
2624
+ field: null != (_b = null == (_a = init.field) ? void 0 : _a.map(bootFieldDescriptorProto)) ? _b : [],
2609
2625
  extension: [],
2610
- nestedType: null !== (_d = null === (_c = init.nestedType) || void 0 === _c ? void 0 : _c.map(bootDescriptorProto)) && void 0 !== _d ? _d : [],
2611
- enumType: null !== (_f = null === (_e = init.enumType) || void 0 === _e ? void 0 : _e.map(bootEnumDescriptorProto)) && void 0 !== _f ? _f : [],
2612
- extensionRange: null !== (_h = null === (_g = init.extensionRange) || void 0 === _g ? void 0 : _g.map((e)=>Object.assign({
2626
+ nestedType: null != (_d = null == (_c = init.nestedType) ? void 0 : _c.map(bootDescriptorProto)) ? _d : [],
2627
+ enumType: null != (_f = null == (_e = init.enumType) ? void 0 : _e.map(bootEnumDescriptorProto)) ? _f : [],
2628
+ extensionRange: null != (_h = null == (_g = init.extensionRange) ? void 0 : _g.map((e)=>Object.assign({
2613
2629
  $typeName: "google.protobuf.DescriptorProto.ExtensionRange"
2614
- }, e))) && void 0 !== _h ? _h : [],
2630
+ }, e))) ? _h : [],
2615
2631
  oneofDecl: [],
2616
2632
  reservedRange: [],
2617
2633
  reservedName: []
@@ -2649,10 +2665,10 @@ function bootFieldOptions(init) {
2649
2665
  return Object.assign(proto, Object.assign(Object.assign({
2650
2666
  $typeName: "google.protobuf.FieldOptions"
2651
2667
  }, init), {
2652
- targets: null !== (_a = init.targets) && void 0 !== _a ? _a : [],
2653
- editionDefaults: null !== (_c = null === (_b = init.editionDefaults) || void 0 === _b ? void 0 : _b.map((e)=>Object.assign({
2668
+ targets: null != (_a = init.targets) ? _a : [],
2669
+ editionDefaults: null != (_c = null == (_b = init.editionDefaults) ? void 0 : _b.map((e)=>Object.assign({
2654
2670
  $typeName: "google.protobuf.FieldOptions.EditionDefault"
2655
- }, e))) && void 0 !== _c ? _c : [],
2671
+ }, e))) ? _c : [],
2656
2672
  uninterpretedOption: []
2657
2673
  }));
2658
2674
  }
@@ -2684,6 +2700,12 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
2684
2700
  label: 3,
2685
2701
  typeName: ".google.protobuf.FileDescriptorProto"
2686
2702
  }
2703
+ ],
2704
+ extensionRange: [
2705
+ {
2706
+ start: 536000000,
2707
+ end: 536000001
2708
+ }
2687
2709
  ]
2688
2710
  },
2689
2711
  {
@@ -4242,6 +4264,37 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
4242
4264
  }
4243
4265
  ]
4244
4266
  }
4267
+ },
4268
+ {
4269
+ name: "enforce_naming_style",
4270
+ number: 7,
4271
+ type: 14,
4272
+ label: 1,
4273
+ typeName: ".google.protobuf.FeatureSet.EnforceNamingStyle",
4274
+ options: {
4275
+ retention: 2,
4276
+ targets: [
4277
+ 1,
4278
+ 2,
4279
+ 3,
4280
+ 4,
4281
+ 5,
4282
+ 6,
4283
+ 7,
4284
+ 8,
4285
+ 9
4286
+ ],
4287
+ editionDefaults: [
4288
+ {
4289
+ value: "STYLE_LEGACY",
4290
+ edition: 900
4291
+ },
4292
+ {
4293
+ value: "STYLE2024",
4294
+ edition: 1001
4295
+ }
4296
+ ]
4297
+ }
4245
4298
  }
4246
4299
  ],
4247
4300
  enumType: [
@@ -4350,6 +4403,23 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
4350
4403
  number: 2
4351
4404
  }
4352
4405
  ]
4406
+ },
4407
+ {
4408
+ name: "EnforceNamingStyle",
4409
+ value: [
4410
+ {
4411
+ name: "ENFORCE_NAMING_STYLE_UNKNOWN",
4412
+ number: 0
4413
+ },
4414
+ {
4415
+ name: "STYLE2024",
4416
+ number: 1
4417
+ },
4418
+ {
4419
+ name: "STYLE_LEGACY",
4420
+ number: 2
4421
+ }
4422
+ ]
4353
4423
  }
4354
4424
  ],
4355
4425
  extensionRange: [
@@ -4474,6 +4544,12 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
4474
4544
  }
4475
4545
  ]
4476
4546
  }
4547
+ ],
4548
+ extensionRange: [
4549
+ {
4550
+ start: 536000000,
4551
+ end: 536000001
4552
+ }
4477
4553
  ]
4478
4554
  },
4479
4555
  {
@@ -4718,6 +4794,12 @@ var descriptor_pb_FeatureSet_JsonFormat;
4718
4794
  FeatureSet_JsonFormat[FeatureSet_JsonFormat["ALLOW"] = 1] = "ALLOW";
4719
4795
  FeatureSet_JsonFormat[FeatureSet_JsonFormat["LEGACY_BEST_EFFORT"] = 2] = "LEGACY_BEST_EFFORT";
4720
4796
  })(descriptor_pb_FeatureSet_JsonFormat || (descriptor_pb_FeatureSet_JsonFormat = {}));
4797
+ var descriptor_pb_FeatureSet_EnforceNamingStyle;
4798
+ (function(FeatureSet_EnforceNamingStyle) {
4799
+ FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["ENFORCE_NAMING_STYLE_UNKNOWN"] = 0] = "ENFORCE_NAMING_STYLE_UNKNOWN";
4800
+ FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["STYLE2024"] = 1] = "STYLE2024";
4801
+ FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["STYLE_LEGACY"] = 2] = "STYLE_LEGACY";
4802
+ })(descriptor_pb_FeatureSet_EnforceNamingStyle || (descriptor_pb_FeatureSet_EnforceNamingStyle = {}));
4721
4803
  var descriptor_pb_GeneratedCodeInfo_Annotation_Semantic;
4722
4804
  (function(GeneratedCodeInfo_Annotation_Semantic) {
4723
4805
  GeneratedCodeInfo_Annotation_Semantic[GeneratedCodeInfo_Annotation_Semantic["NONE"] = 0] = "NONE";
@@ -4743,7 +4825,7 @@ function fileDesc(b64, imports) {
4743
4825
  var _a;
4744
4826
  const root = fromBinary(FileDescriptorProtoSchema, base64Decode(b64));
4745
4827
  root.messageType.forEach(restoreJsonNames);
4746
- root.dependency = null !== (_a = null == imports ? void 0 : imports.map((f)=>f.proto.name)) && void 0 !== _a ? _a : [];
4828
+ root.dependency = null != (_a = null == imports ? void 0 : imports.map((f)=>f.proto.name)) ? _a : [];
4747
4829
  const reg = createFileRegistry(root, (protoFileName)=>null == imports ? void 0 : imports.find((f)=>f.proto.name === protoFileName));
4748
4830
  return reg.getFile(root.name);
4749
4831
  }
@@ -4759,96 +4841,83 @@ function timestampDate(timestamp) {
4759
4841
  return new Date(timestamp_timestampMs(timestamp));
4760
4842
  }
4761
4843
  function timestampFromMs(timestampMs) {
4844
+ const seconds = Math.floor(timestampMs / 1000);
4762
4845
  return create(TimestampSchema, {
4763
- seconds: protoInt64.parse(Math.floor(timestampMs / 1000)),
4764
- nanos: timestampMs % 1000 * 1000000
4846
+ seconds: protoInt64.parse(seconds),
4847
+ nanos: (timestampMs - 1000 * seconds) * 1000000
4765
4848
  });
4766
4849
  }
4767
4850
  function timestamp_timestampMs(timestamp) {
4768
4851
  return 1000 * Number(timestamp.seconds) + Math.ceil(timestamp.nanos / 1000000);
4769
4852
  }
4770
- const color_pad = (s)=>s.length < 2 ? `0${s}` : s;
4771
- const decimalToHex = (n)=>color_pad(n.toString(16));
4772
- const isDarkColor = ({ r, g, b })=>0.299 * r + 0.587 * g + 0.114 * b < 0x30;
4773
- const WHITE = {
4774
- r: 255,
4775
- g: 255,
4776
- b: 255
4777
- };
4778
- const BLACK = {
4779
- r: 0,
4780
- g: 0,
4781
- b: 0
4782
- };
4783
- const hexColorToRGB = (hex)=>{
4784
- if (0 === hex.indexOf('#')) hex = hex.slice(1);
4785
- const [r, g, b] = 3 === hex.length ? hex.split('').map((c)=>c + c) : hex.match(/../g) || [];
4786
- return {
4787
- r: Number.parseInt(r, 16),
4788
- g: Number.parseInt(g, 16),
4789
- b: Number.parseInt(b, 16)
4790
- };
4791
- };
4792
- const formatColor = ({ r, g, b }, opacity)=>{
4793
- const color = [
4794
- b,
4795
- g,
4796
- r
4797
- ];
4798
- if (void 0 !== opacity) {
4799
- const alpha = Math.round((1 - opacity) * 255);
4800
- color.unshift(alpha);
4801
- }
4802
- return `&H${color.map(decimalToHex).join('').toUpperCase()}`;
4803
- };
4804
- const getDecoratingColor = (color)=>isDarkColor(color) ? WHITE : BLACK;
4805
- const isWhite = (color)=>255 === color.r && 255 === color.g && 255 === color.b;
4806
- const DanmakuType = {
4807
- SCROLL: 1,
4808
- BOTTOM: 2,
4809
- TOP: 3
4810
- };
4811
- const FontSize = {
4812
- SMALL: 0,
4813
- NORMAL: 1,
4814
- LARGE: 2
4815
- };
4816
- const domainPreset = {
4817
- acfun: 'acfun',
4818
- baha: 'baha',
4819
- bgm: 'bgm',
4820
- bili: 'bili',
4821
- bglobal: 'bglobal',
4822
- ddplay: 'ddplay',
4823
- tucao: 'tucao'
4824
- };
4825
- const platforms = Object.keys(domainPreset);
4826
- class UniID {
4853
+ const file_bili_dm = /*@__PURE__*/ fileDesc("Cg1iaWxpL2RtLnByb3RvEiBiaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MSJkCgZBdmF0YXISCgoCaWQYASABKAkSCwoDdXJsGAIgASgJEkEKC2F2YXRhcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyVHlwZSIjCgZCdWJibGUSDAoEdGV4dBgBIAEoCRILCgN1cmwYAiABKAkixgEKCEJ1YmJsZVYyEgwKBHRleHQYASABKAkSCwoDdXJsGAIgASgJEkEKC2J1YmJsZV90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlVHlwZRIVCg1leHBvc3VyZV9vbmNlGAQgASgIEkUKDWV4cG9zdXJlX3R5cGUYBSABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiWwoGQnV0dG9uEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUiWAoOQnV6endvcmRDb25maWcSRgoIa2V5d29yZHMYASADKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXp6d29yZFNob3dDb25maWcieAoSQnV6endvcmRTaG93Q29uZmlnEgwKBG5hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEg4KBnNvdXJjZRgDIAEoBRIKCgJpZBgEIAEoAxITCgtidXp6d29yZF9pZBgFIAEoAxITCgtzY2hlbWFfdHlwZRgGIAEoBSJ7CghDaGVja0JveBIMCgR0ZXh0GAEgASgJEjwKBHR5cGUYAiABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja2JveFR5cGUSFQoNZGVmYXVsdF92YWx1ZRgDIAEoCBIMCgRzaG93GAQgASgIIm8KCkNoZWNrQm94VjISDAoEdGV4dBgBIAEoCRI8CgR0eXBlGAIgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tib3hUeXBlEhUKDWRlZmF1bHRfdmFsdWUYAyABKAgiggIKC0NsaWNrQnV0dG9uEhUKDXBvcnRyYWl0X3RleHQYASADKAkSFgoObGFuZHNjYXBlX3RleHQYAiADKAkSGwoTcG9ydHJhaXRfdGV4dF9mb2N1cxgDIAMoCRIcChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIAMoCRJBCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSDAoEc2hvdxgGIAEoCBI4CgZidWJibGUYByABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdWJibGUiswIKDUNsaWNrQnV0dG9uVjISFQoNcG9ydHJhaXRfdGV4dBgBIAMoCRIWCg5sYW5kc2NhcGVfdGV4dBgCIAMoCRIbChNwb3J0cmFpdF90ZXh0X2ZvY3VzGAMgAygJEhwKFGxhbmRzY2FwZV90ZXh0X2ZvY3VzGAQgAygJEkEKC3JlbmRlcl90eXBlGAUgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIXCg90ZXh0X2lucHV0X3Bvc3QYBiABKAgSFQoNZXhwb3N1cmVfb25jZRgHIAEoCBJFCg1leHBvc3VyZV90eXBlGAggASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIksKB0NvbW1hbmQSQAoLY29tbWFuZF9kbXMYASADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG0i5gEKCUNvbW1hbmREbRIKCgJpZBgBIAEoAxILCgNvaWQYAiABKAMSCwoDbWlkGAMgASgDEg8KB2NvbW1hbmQYBCABKAkSDwoHY29udGVudBgFIAEoCRIQCghwcm9ncmVzcxgGIAEoBRINCgVjdGltZRgHIAEoCRINCgVtdGltZRgIIAEoCRINCgVleHRyYRgJIAEoCRINCgVpZFN0chgKIAEoCRIMCgR0eXBlGAsgASgFEhMKC2F1dG9fY3JlYXRlGAwgASgIEhIKCmNvdW50X2Rvd24YDSABKAUSDAoEYXR0chgOIAEoBSJQCg1EYW5tYWt1QUlGbGFnEj8KCGRtX2ZsYWdzGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWciiwMKC0Rhbm1ha3VFbGVtEgoKAmlkGAEgASgDEhAKCHByb2dyZXNzGAIgASgFEgwKBG1vZGUYAyABKAUSEAoIZm9udHNpemUYBCABKAUSPwoFY29sb3IYBSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIQCghtaWRfaGFzaBgGIAEoCRIPCgdjb250ZW50GAcgASgJEg0KBWN0aW1lGAggASgDEg4KBndlaWdodBgJIAEoBRIOCgZhY3Rpb24YCiABKAkSDAoEcG9vbBgLIAEoBRIOCgZpZF9zdHIYDCABKAkSDAoEYXR0chgNIAEoBRIRCglhbmltYXRpb24YFiABKAkSDQoFZXh0cmEYFyABKAkSQgoIY29sb3JmdWwYGCABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIMCgR0eXBlGBkgASgFEgsKA29pZBgaIAEoAyIpCgtEYW5tYWt1RmxhZxIMCgRkbWlkGAEgASgDEgwKBGZsYWcYAiABKAUiSwoRRGFubWFrdUZsYWdDb25maWcSEAoIcmVjX2ZsYWcYASABKAUSEAoIcmVjX3RleHQYAiABKAkSEgoKcmVjX3N3aXRjaBgDIAEoBSKLBwoYRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnEikKIXBsYXllcl9kYW5tYWt1X3VzZV9kZWZhdWx0X2NvbmZpZxgBIAEoCBIsCiRwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9zd2l0Y2gYBCABKAgSKwojcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWwYBSABKAUSHwoXcGxheWVyX2Rhbm1ha3VfYmxvY2t0b3AYBiABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tzY3JvbGwYByABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tib3R0b20YCCABKAgSJAoccGxheWVyX2Rhbm1ha3VfYmxvY2tjb2xvcmZ1bBgJIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja3JlcGVhdBgKIAEoCBIjChtwbGF5ZXJfZGFubWFrdV9ibG9ja3NwZWNpYWwYCyABKAgSHgoWcGxheWVyX2Rhbm1ha3Vfb3BhY2l0eRgMIAEoAhIkChxwbGF5ZXJfZGFubWFrdV9zY2FsaW5nZmFjdG9yGA0gASgCEh0KFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAhIcChRwbGF5ZXJfZGFubWFrdV9zcGVlZBgPIAEoBRIkChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBAgASgIEikKIXBsYXllcl9kYW5tYWt1X3Nlbmlvcl9tb2RlX3N3aXRjaBgRIAEoBRIuCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgSIAEoBRKYAQoqcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjJfbWFwGBMgAygLMmQuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EiUKHXBsYXllcl9kYW5tYWt1X2VuYWJsZV9oZXJkX2RtGBQgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi7AkKEURhbm11UGxheWVyQ29uZmlnEh0KFXBsYXllcl9kYW5tYWt1X3N3aXRjaBgBIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9zd2l0Y2hfc2F2ZRgCIAEoCBIpCiFwbGF5ZXJfZGFubWFrdV91c2VfZGVmYXVsdF9jb25maWcYAyABKAgSLAokcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIEisKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUgASgFEh8KF3BsYXllcl9kYW5tYWt1X2Jsb2NrdG9wGAYgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2Nrc2Nyb2xsGAcgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrYm90dG9tGAggASgIEiQKHHBsYXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tyZXBlYXQYCiABKAgSIwobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIEh4KFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAISJAoccGxheWVyX2Rhbm1ha3Vfc2NhbGluZ2ZhY3RvchgNIAEoAhIdChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAISHAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAUSJgoecGxheWVyX2Rhbm1ha3VfZW5hYmxlYmxvY2tsaXN0GBAgASgIEiQKHGlubGluZV9wbGF5ZXJfZGFubWFrdV9zd2l0Y2gYESABKAgSJAocaW5saW5lX3BsYXllcl9kYW5tYWt1X2NvbmZpZxgSIAEoBRImCh5wbGF5ZXJfZGFubWFrdV9pb3Nfc3dpdGNoX3NhdmUYEyABKAUSKQohcGxheWVyX2Rhbm1ha3Vfc2VuaW9yX21vZGVfc3dpdGNoGBQgASgFEi4KJnBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBUgASgFEpEBCipwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92Ml9tYXAYFiADKAsyXS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckNvbmZpZy5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIlCh1wbGF5ZXJfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgXIAEoCBImCh5wbGF5ZXJfZGFubWFrdV9ibG9ja3RvcF9ib3R0b20YGCABKAgSIAoYcGxheWVyX2Rhbm1ha3VfZG9tYWluX3YyGBkgASgFEh4KFnBsYXllcl9kYW5tYWt1X2RlbnNpdHkYGiABKAUSJQodcGxheWVyX2Rhbm1ha3Vfc3VidGl0bGVfcHJvb2YYGyABKAgSIwobcGxheWVyX2Rhbm1ha3VfcGVvcGxlX3Byb29mGBwgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEiMAoWRGFubXVQbGF5ZXJDb25maWdQYW5lbBIWCg5zZWxlY3Rpb25fdGV4dBgBIAEoCSJLChhEYW5tdVBsYXllckR5bmFtaWNDb25maWcSEAoIcHJvZ3Jlc3MYASABKAUSHQoVcGxheWVyX2Rhbm1ha3VfZG9tYWluGA4gASgCIpADChVEYW5tdVBsYXllclZpZXdDb25maWcSYQodZGFubXVrdV9kZWZhdWx0X3BsYXllcl9jb25maWcYASABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdURlZmF1bHRQbGF5ZXJDb25maWcSUgoVZGFubXVrdV9wbGF5ZXJfY29uZmlnGAIgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWcSYQodZGFubXVrdV9wbGF5ZXJfZHluYW1pY19jb25maWcYAyADKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckR5bmFtaWNDb25maWcSXQobZGFubXVrdV9wbGF5ZXJfY29uZmlnX3BhbmVsGAQgASgLMjguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWdQYW5lbCKZBQoURGFubXVXZWJQbGF5ZXJDb25maWcSEQoJZG1fc3dpdGNoGAEgASgIEhEKCWFpX3N3aXRjaBgCIAEoCBIQCghhaV9sZXZlbBgDIAEoBRIQCghibG9ja3RvcBgEIAEoCBITCgtibG9ja3Njcm9sbBgFIAEoCBITCgtibG9ja2JvdHRvbRgGIAEoCBISCgpibG9ja2NvbG9yGAcgASgIEhQKDGJsb2Nrc3BlY2lhbBgIIAEoCBIUCgxwcmV2ZW50c2hhZGUYCSABKAgSDQoFZG1hc2sYCiABKAgSDwoHb3BhY2l0eRgLIAEoAhIOCgZkbWFyZWEYDCABKAUSEQoJc3BlZWRwbHVzGA0gASgCEhAKCGZvbnRzaXplGA4gASgCEhIKCnNjcmVlbnN5bmMYDyABKAgSEQoJc3BlZWRzeW5jGBAgASgIEhIKCmZvbnRmYW1pbHkYESABKAkSDAoEYm9sZBgSIAEoCBISCgpmb250Ym9yZGVyGBMgASgFEhEKCWRyYXdfdHlwZRgUIAEoCRIaChJzZW5pb3JfbW9kZV9zd2l0Y2gYFSABKAUSEwoLYWlfbGV2ZWxfdjIYFiABKAUSYQoPYWlfbGV2ZWxfdjJfbWFwGBcgAygLMkguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcuQWlMZXZlbFYyTWFwRW50cnkSFwoPYmxvY2t0b3BfYm90dG9tGBggASgIEhIKCmRtX2FyZWFfdjIYGSABKAUSEgoKZG1fZGVuc2l0eRgaIAEoBRozChFBaUxldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIlkKCkRtQ29sb3JmdWwSPgoEdHlwZRgBIAEoDjIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWxUeXBlEgsKA3NyYxgCIAEoCSJQCg9EbUV4cG9SZXBvcnRSZXESEgoKc2Vzc2lvbl9pZBgBIAEoCRILCgNvaWQYAiABKAMSDQoFZG1pZHMYAyABKAwSDQoFc3BtaWQYBCABKAkiEQoPRG1FeHBvUmVwb3J0UmVzIm0KCkRtSGVyZFZpZXcSGwoTZGlzcGxheV9oZXJkX2RtX251bRgBIAEoBRJCCghoZXJkX2RtcxgCIAMoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlZpZXdIZXJkRG1FbGVtIpYCCgpEbU1hc2tXYWxsEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAxIPCgdjb250ZW50GAMgASgJEk0KDGNvbnRlbnRfdHlwZRgEIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRJFCghiaXpfdHlwZRgFIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxCaXpUeXBlEkUKCGNvbnRlbnRzGAYgAygLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbENvbnRlbnQiawoRRG1NYXNrV2FsbENvbnRlbnQSRQoEdHlwZRgBIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRIPCgdjb250ZW50GAIgASgJIs0QChFEbVBsYXllckNvbmZpZ1JlcRIKCgJ0cxgBIAEoAxJFCgZzd2l0Y2gYAiABKAsyNS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3dpdGNoEk4KC3N3aXRjaF9zYXZlGAMgASgLMjkuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaFNhdmUSWwoSdXNlX2RlZmF1bHRfY29uZmlnGAQgASgLMj8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVVzZURlZmF1bHRDb25maWcSYQoVYWlfcmVjb21tZW5kZWRfc3dpdGNoGAUgASgLMkIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2gSXwoUYWlfcmVjb21tZW5kZWRfbGV2ZWwYBiABKAsyQS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEkkKCGJsb2NrdG9wGAcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wEk8KC2Jsb2Nrc2Nyb2xsGAggASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc2Nyb2xsEk8KC2Jsb2NrYm90dG9tGAkgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrYm90dG9tElMKDWJsb2NrY29sb3JmdWwYCiABKAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tjb2xvcmZ1bBJPCgtibG9ja3JlcGVhdBgLIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3JlcGVhdBJRCgxibG9ja3NwZWNpYWwYDCABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEkcKB29wYWNpdHkYDSABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1T3BhY2l0eRJTCg1zY2FsaW5nZmFjdG9yGA4gASgLMjwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVNjYWxpbmdmYWN0b3ISRQoGZG9tYWluGA8gASgLMjUuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpbhJDCgVzcGVlZBgQIAEoCzI0LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTcGVlZBJXCg9lbmFibGVibG9ja2xpc3QYESABKAsyPi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0El4KGWlubGluZVBsYXllckRhbm1ha3VTd2l0Y2gYEiABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5JbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoElsKEnNlbmlvcl9tb2RlX3N3aXRjaBgTIAEoCzI/LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTZW5pb3JNb2RlU3dpdGNoEmQKF2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBQgASgLMkMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyElMKDmVuYWJsZV9oZXJkX2RtGBUgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRJWCg9ibG9ja3RvcF9ib3R0b20YFiABKAsyPS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SSgoJZG9tYWluX3YyGBcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpblYyEkcKB2RlbnNpdHkYGCABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RGVuc2l0eRJUCg5zdWJ0aXRsZV9wcm9vZhgZIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mElAKDHBlb3BsZV9wcm9vZhgaIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VQZW9wbGVQcm9vZiIvCgtEbVNlZ0NvbmZpZxIRCglwYWdlX3NpemUYASABKAMSDQoFdG90YWwYAiABKAMikQIKEERtU2VnTW9iaWxlUmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBRJACgdhaV9mbGFnGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUFJRmxhZxIVCg1zZWdtZW50X3J1bGVzGAQgAygDEkIKDGNvbG9yZnVsX3NyYxgFIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWwSEwoLY29udGV4dF9zcmMYBiABKAkiygEKDkRtU2VnTW9iaWxlUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDEhYKDnRlZW5hZ2Vyc19tb2RlGAUgASgFEgoKAnBzGAYgASgDEgoKAnBlGAcgASgDEhEKCXB1bGxfbW9kZRgIIAEoBRISCgpmcm9tX3NjZW5lGAkgASgFEg0KBXNwbWlkGAogASgJEhMKC2NvbnRleHRfZXh0GAsgASgJIlwKDURtU2VnT3R0UmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBSJMCgtEbVNlZ090dFJlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAyJdCg1EbVNlZ1NES1JlcGx5Eg4KBmNsb3NlZBgBIAEoCBI8CgVlbGVtcxgCIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VFbGVtIkwKC0RtU2VnU0RLUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDIncKCURtU3ViVmlldxIMCgR0eXBlGAEgASgFEgsKA29pZBgCIAEoAxILCgNwaWQYAyABKAMSQgoLcG9zdF9wYW5lbDIYBCADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxWMiKhCQoLRG1WaWV3UmVwbHkSDgoGY2xvc2VkGAEgASgIEjkKBG1hc2sYAiABKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb01hc2sSQQoIc3VidGl0bGUYAyABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb1N1YnRpdGxlEhMKC3NwZWNpYWxfZG1zGAQgAygJEkQKB2FpX2ZsYWcYBSABKAsyMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RmxhZ0NvbmZpZxJOCg1wbGF5ZXJfY29uZmlnGAYgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJWaWV3Q29uZmlnEhYKDnNlbmRfYm94X3N0eWxlGAcgASgFEg0KBWFsbG93GAggASgIEhEKCWNoZWNrX2JveBgJIAEoCBIaChJjaGVja19ib3hfc2hvd19tc2cYCiABKAkSGAoQdGV4dF9wbGFjZWhvbGRlchgLIAEoCRIZChFpbnB1dF9wbGFjZWhvbGRlchgMIAEoCRIdChVyZXBvcnRfZmlsdGVyX2NvbnRlbnQYDSADKAkSQQoLZXhwb19yZXBvcnQYDiABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvUmVwb3J0EkkKD2J1enp3b3JkX2NvbmZpZxgPIAEoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1enp3b3JkQ29uZmlnEkIKC2V4cHJlc3Npb25zGBAgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgRIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGBIgAygJEkIKC3Bvc3RfcGFuZWwyGBMgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISQgoMZG1fbWFza193YWxsGBQgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbBI9CgdkbV9oZXJkGBUgASgLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1IZXJkVmlldxI6Cgdjb21tYW5kGBYgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ29tbWFuZBIKCgJrdhgXIAEoCRI+CglzdWJfdmlld3MYGCADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVN1YlZpZXcSNgoDcW9lGBkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUW9lSW5mbyJtCglEbVZpZXdSZXESCwoDcGlkGAEgASgDEgsKA29pZBgCIAEoAxIMCgR0eXBlGAMgASgFEg0KBXNwbWlkGAQgASgJEhQKDGlzX2hhcmRfYm9vdBgFIAEoBRITCgtjb250ZXh0X2V4dBgGIAEoCSKBBgoORG1XZWJWaWV3UmVwbHkSDQoFc3RhdGUYASABKAUSDAoEdGV4dBgCIAEoCRIRCgl0ZXh0X3NpZGUYAyABKAkSPQoGZG1fc2dlGAQgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdDb25maWcSQQoEZmxhZxgFIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnQ29uZmlnEhMKC3NwZWNpYWxfZG1zGAYgAygJEhEKCWNoZWNrX2JveBgHIAEoCBINCgVjb3VudBgIIAEoAxJACgtjb21tYW5kX2RtcxgJIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmREbRJNCg1wbGF5ZXJfY29uZmlnGAogASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcSHQoVcmVwb3J0X2ZpbHRlcl9jb250ZW50GAsgAygJEkIKC2V4cHJlc3Npb25zGAwgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgNIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGA4gAygJEkIKC3Bvc3RfcGFuZWwyGA8gAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISPgoJc3ViX3ZpZXdzGBAgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TdWJWaWV3EjYKA3FvZRgRIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm8iKgoKRXhwb1JlcG9ydBIcChRzaG91bGRfcmVwb3J0X2F0X2VuZBgBIAEoCCJkCgpFeHByZXNzaW9uEg8KB2tleXdvcmQYASADKAkSCwoDdXJsGAIgASgJEjgKBnBlcmlvZBgDIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBlcmlvZCJJCgtFeHByZXNzaW9ucxI6CgRkYXRhGAEgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbiIqChlJbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoEg0KBXZhbHVlGAEgASgIIicKBUxhYmVsEg0KBXRpdGxlGAEgASgJEg8KB2NvbnRlbnQYAiADKAkihwEKB0xhYmVsVjISDQoFdGl0bGUYASABKAkSDwoHY29udGVudBgCIAMoCRIVCg1leHBvc3VyZV9vbmNlGAMgASgIEkUKDWV4cG9zdXJlX3R5cGUYBCABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiJAoGUGVyaW9kEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAyIwCh9QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEg0KBXZhbHVlGAEgASgFIjIKIVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMhINCgV2YWx1ZRgBIAEoBSIxCiBQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZFN3aXRjaBINCgV2YWx1ZRgBIAEoCCIpChhQbGF5ZXJEYW5tYWt1QmxvY2tib3R0b20SDQoFdmFsdWUYASABKAgiKwoaUGxheWVyRGFubWFrdUJsb2NrY29sb3JmdWwSDQoFdmFsdWUYASABKAgiKQoYUGxheWVyRGFubWFrdUJsb2NrcmVwZWF0Eg0KBXZhbHVlGAEgASgIIikKGFBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBINCgV2YWx1ZRgBIAEoCCIqChlQbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEg0KBXZhbHVlGAEgASgIIiYKFVBsYXllckRhbm1ha3VCbG9ja3RvcBINCgV2YWx1ZRgBIAEoCCIsChtQbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SDQoFdmFsdWUYASABKAgiJQoUUGxheWVyRGFubWFrdURlbnNpdHkSDQoFdmFsdWUYASABKAUiJAoTUGxheWVyRGFubWFrdURvbWFpbhINCgV2YWx1ZRgBIAEoAiImChVQbGF5ZXJEYW5tYWt1RG9tYWluVjISDQoFdmFsdWUYASABKAUiKgoZUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRINCgV2YWx1ZRgBIAEoCCItChxQbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0Eg0KBXZhbHVlGAEgASgIIiUKFFBsYXllckRhbm1ha3VPcGFjaXR5Eg0KBXZhbHVlGAEgASgCIikKGFBsYXllckRhbm1ha3VQZW9wbGVQcm9vZhINCgV2YWx1ZRgBIAEoCCIrChpQbGF5ZXJEYW5tYWt1U2NhbGluZ2ZhY3RvchINCgV2YWx1ZRgBIAEoAiIuCh1QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBINCgV2YWx1ZRgBIAEoBSIjChJQbGF5ZXJEYW5tYWt1U3BlZWQSDQoFdmFsdWUYASABKAUiKwoaUGxheWVyRGFubWFrdVN1YnRpdGxlUHJvb2YSDQoFdmFsdWUYASABKAgiOAoTUGxheWVyRGFubWFrdVN3aXRjaBINCgV2YWx1ZRgBIAEoCBISCgpjYW5faWdub3JlGAIgASgIIigKF1BsYXllckRhbm1ha3VTd2l0Y2hTYXZlEg0KBXZhbHVlGAEgASgIIi4KHVBsYXllckRhbm1ha3VVc2VEZWZhdWx0Q29uZmlnEg0KBXZhbHVlGAEgASgIIowDCglQb3N0UGFuZWwSDQoFc3RhcnQYASABKAMSCwoDZW5kGAIgASgDEhAKCHByaW9yaXR5GAMgASgDEg4KBmJpel9pZBgEIAEoAxJECghiaXpfdHlwZRgFIAEoDjIyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbEJpelR5cGUSQwoMY2xpY2tfYnV0dG9uGAYgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2xpY2tCdXR0b24SPwoKdGV4dF9pbnB1dBgHIAEoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dBI9CgljaGVja19ib3gYCCABKAsyKi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja0JveBI2CgV0b2FzdBgJIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0Iq0ECgtQb3N0UGFuZWxWMhINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMSRAoIYml6X3R5cGUYAyABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxCaXpUeXBlEkUKDGNsaWNrX2J1dHRvbhgEIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uVjISQQoKdGV4dF9pbnB1dBgFIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dFYyEj8KCWNoZWNrX2JveBgGIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrQm94VjISOAoFdG9hc3QYByABKAsyKS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdFYyEjoKBmJ1YmJsZRgIIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1YmJsZVYyEjgKBWxhYmVsGAkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuTGFiZWxWMhJBCgtwb3N0X3N0YXR1cxgKIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RTdGF0dXMiFwoHUW9lSW5mbxIMCgRpbmZvGAEgASgJIikKCFJlc3BvbnNlEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSL5AgoMU3VidGl0bGVJdGVtEgoKAmlkGAEgASgDEg4KBmlkX3N0chgCIAEoCRILCgNsYW4YAyABKAkSDwoHbGFuX2RvYxgEIAEoCRIUCgxzdWJ0aXRsZV91cmwYBSABKAkSOgoGYXV0aG9yGAYgASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVXNlckluZm8SPAoEdHlwZRgHIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlVHlwZRIVCg1sYW5fZG9jX2JyaWVmGAggASgJEkEKB2FpX3R5cGUYCSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpVHlwZRJFCglhaV9zdGF0dXMYCiABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpU3RhdHVzIugCCglUZXh0SW5wdXQSHAoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAkSHQoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJEkEKC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIYChBwbGFjZWhvbGRlcl9wb3N0GAQgASgIEgwKBHNob3cYBSABKAgSOAoGYXZhdGFyGAYgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEkEKC3Bvc3Rfc3RhdHVzGAcgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFN0YXR1cxI2CgVsYWJlbBgIIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxhYmVsIvsBCgtUZXh0SW5wdXRWMhIcChRwb3J0cmFpdF9wbGFjZWhvbGRlchgBIAMoCRIdChVsYW5kc2NhcGVfcGxhY2Vob2xkZXIYAiADKAkSQQoLcmVuZGVyX3R5cGUYAyABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5SZW5kZXJUeXBlEhgKEHBsYWNlaG9sZGVyX3Bvc3QYBCABKAgSOAoGYXZhdGFyGAUgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEhgKEHRleHRfaW5wdXRfbGltaXQYBiABKAUibwoFVG9hc3QSDAoEdGV4dBgBIAEoCRIQCghkdXJhdGlvbhgCIAEoBRIMCgRzaG93GAMgASgIEjgKBmJ1dHRvbhgEIAEoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1dHRvbiJiCg1Ub2FzdEJ1dHRvblYyEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUicwoHVG9hc3RWMhIMCgR0ZXh0GAEgASgJEhAKCGR1cmF0aW9uGAIgASgFEkgKD3RvYXN0X2J1dHRvbl92MhgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0QnV0dG9uVjIiXAoIVXNlckluZm8SCwoDbWlkGAEgASgDEgwKBG5hbWUYAiABKAkSCwoDc2V4GAMgASgJEgwKBGZhY2UYBCABKAkSDAoEc2lnbhgFIAEoCRIMCgRyYW5rGAYgASgFIlMKCVZpZGVvTWFzaxILCgNjaWQYASABKAMSDAoEcGxhdBgCIAEoBRILCgNmcHMYAyABKAUSDAoEdGltZRgEIAEoAxIQCghtYXNrX3VybBgFIAEoCSJwCg1WaWRlb1N1YnRpdGxlEgsKA2xhbhgBIAEoCRIPCgdsYW5fZG9jGAIgASgJEkEKCXN1YnRpdGxlcxgDIAMoCzIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlSXRlbSKSAQoOVmlld0hlcmREbUVsZW0SEAoIaGVyZF9tc2cYASABKAkSFgoOaGVyZF9zdGFydF9jbnQYAiABKAUSFAoMaGVyZF9lbmRfY250GAMgASgFEhIKCnJlZ2V4X3J1bGUYBCABKAkSFgoOc3RhcnRfcHJvZ3Jlc3MYBSABKAUSFAoMZW5kX3Byb2dyZXNzGAYgASgFKjMKCkF2YXRhclR5cGUSEgoOQXZhdGFyVHlwZU5vbmUQABIRCg1BdmF0YXJUeXBlTkZUEAEqWQoKQnViYmxlVHlwZRISCg5CdWJibGVUeXBlTm9uZRAAEhkKFUJ1YmJsZVR5cGVDbGlja0J1dHRvbhABEhwKGEJ1YmJsZVR5cGVEbVNldHRpbmdQYW5lbBACKlgKDENoZWNrYm94VHlwZRIUChBDaGVja2JveFR5cGVOb25lEAASGQoVQ2hlY2tib3hUeXBlRW5jb3VyYWdlEAESFwoTQ2hlY2tib3hUeXBlQ29sb3JETRACKjUKDkRtQ29sb3JmdWxUeXBlEgwKCE5vbmVUeXBlEAASFQoPVmlwR3JhZHVhbENvbG9yEOHUAypgChFEbU1hc2tXYWxsQml6VHlwZRILCgdVbmtub3duEAASBwoDT0dWEAESCgoGQml6UGljEAISCAoETXV0ZRADEgoKBlJlY29yZBAEEgkKBUNsb3VkEAUSCAoEQUlHQxAGKnYKFURtTWFza1dhbGxDb250ZW50VHlwZRIgChxEbU1hc2tXYWxsQ29udGVudFR5cGVVbmtub3duEAASHQoZRG1NYXNrV2FsbENvbnRlbnRUeXBlVGV4dBABEhwKGERtTWFza1dhbGxDb250ZW50VHlwZVBpYxACKjwKDEV4cG9zdXJlVHlwZRIUChBFeHBvc3VyZVR5cGVOb25lEAASFgoSRXhwb3N1cmVUeXBlRE1TZW5kEAEqgwIKEFBvc3RQYW5lbEJpelR5cGUSGAoUUG9zdFBhbmVsQml6VHlwZU5vbmUQABIdChlQb3N0UGFuZWxCaXpUeXBlRW5jb3VyYWdlEAESGwoXUG9zdFBhbmVsQml6VHlwZUNvbG9yRE0QAhIZChVQb3N0UGFuZWxCaXpUeXBlTkZURE0QAxIdChlQb3N0UGFuZWxCaXpUeXBlRnJhZ0Nsb3NlEAQSHQoZUG9zdFBhbmVsQml6VHlwZVJlY29tbWVuZBAFEhwKGFBvc3RQYW5lbEJpelR5cGVQbG90TGVhaxAGEiIKHlBvc3RQYW5lbEJpelR5cGVBbnRpSGFyYXNzbWVudBAHKjgKClBvc3RTdGF0dXMSFAoQUG9zdFN0YXR1c05vcm1hbBAAEhQKEFBvc3RTdGF0dXNDbG9zZWQQASpOCgpSZW5kZXJUeXBlEhIKDlJlbmRlclR5cGVOb25lEAASFAoQUmVuZGVyVHlwZVNpbmdsZRABEhYKElJlbmRlclR5cGVSb3RhdGlvbhACKjYKEFN1YnRpdGxlQWlTdGF0dXMSCAoETm9uZRAAEgwKCEV4cG9zdXJlEAESCgoGQXNzaXN0EAIqKwoOU3VidGl0bGVBaVR5cGUSCgoGTm9ybWFsEAASDQoJVHJhbnNsYXRlEAEqHgoMU3VidGl0bGVUeXBlEgYKAkNDEAASBgoCQUkQASpOChFUb2FzdEZ1bmN0aW9uVHlwZRIZChVUb2FzdEZ1bmN0aW9uVHlwZU5vbmUQABIeChpUb2FzdEZ1bmN0aW9uVHlwZVBvc3RQYW5lbBABMqAFCgJETRJzCgtEbVNlZ01vYmlsZRIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnTW9iaWxlUmVxGjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdNb2JpbGVSZXBseRJkCgZEbVZpZXcSKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXEaLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXBseRJxCg5EbVBsYXllckNvbmZpZxIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtUGxheWVyQ29uZmlnUmVxGiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVzcG9uc2USagoIRG1TZWdPdHQSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ090dFJlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnT3R0UmVwbHkSagoIRG1TZWdTREsSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ1NES1JlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnU0RLUmVwbHkSdAoMRG1FeHBvUmVwb3J0EjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVxGjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVzYgZwcm90bzM");
4854
+ const DmSegMobileReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 30);
4855
+ const DmWebViewReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 39);
4856
+ const file_danuni = /*@__PURE__*/ fileDesc("CgxkYW51bmkucHJvdG8SEWRhbnVuaS5kYW5tYWt1LnYxIjIKCmxpc3REYW5SZXESCgoCSUQYASABKAkSEAoDc2VnGAIgASgFSACIAQFCBgoEX3NlZyLCAgoHRGFubWFrdRIMCgRTT0lEGAEgASgJEgwKBERNSUQYAiABKAkSEAoIcHJvZ3Jlc3MYAyABKAUSJQoEbW9kZRgEIAEoDjIXLmRhbnVuaS5kYW5tYWt1LnYxLk1vZGUSEAoIZm9udHNpemUYBSABKAUSDQoFY29sb3IYBiABKAUSEAoIc2VuZGVySUQYByABKAkSDwoHY29udGVudBgIIAEoCRIpCgVjdGltZRgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDgoGd2VpZ2h0GAogASgFEiUKBHBvb2wYCyABKA4yFy5kYW51bmkuZGFubWFrdS52MS5Qb29sEgwKBGF0dHIYDCADKAkSEAoIcGxhdGZvcm0YDSABKAkSEgoFZXh0cmEYDiABKAlIAIgBAUIICgZfZXh0cmEiPAoMRGFubWFrdVJlcGx5EiwKCGRhbm1ha3VzGAEgAygLMhouZGFudW5pLmRhbm1ha3UudjEuRGFubWFrdSo9CgRNb2RlEgoKBk5vcm1hbBAAEgoKBkJvdHRvbRABEgcKA1RvcBACEgsKB1JldmVyc2UQAxIHCgNFeHQQBCopCgRQb29sEgcKA0RlZhAAEgcKA1N1YhABEgcKA0FkdhACEgYKAkl4EAMyXQoORGFubWFrdVNlcnZpY2USSwoHbGlzdERhbhIdLmRhbnVuaS5kYW5tYWt1LnYxLmxpc3REYW5SZXEaHy5kYW51bmkuZGFubWFrdS52MS5EYW5tYWt1UmVwbHkiAFAAYgZwcm90bzM", [
4857
+ file_google_protobuf_timestamp
4858
+ ]);
4859
+ const DanmakuReplySchema = /*@__PURE__*/ message_messageDesc(file_danuni, 2);
4860
+ var platform_PlatformInfoSource = /*#__PURE__*/ function(PlatformInfoSource) {
4861
+ PlatformInfoSource["Bangumi"] = "bgm";
4862
+ PlatformInfoSource["TMDB"] = "tmdb";
4863
+ return PlatformInfoSource;
4864
+ }({});
4865
+ const PlatformInfoSources = Object.values(platform_PlatformInfoSource);
4866
+ var platform_PlatformVideoSource = /*#__PURE__*/ function(PlatformVideoSource) {
4867
+ PlatformVideoSource["Acfun"] = "acfun";
4868
+ PlatformVideoSource["Baha"] = "baha";
4869
+ PlatformVideoSource["Bilibili"] = "bili";
4870
+ PlatformVideoSource["BilibiliGlobal"] = "bglobal";
4871
+ PlatformVideoSource["Iqiyi"] = "iqiyi";
4872
+ PlatformVideoSource["Tencent"] = "tencent";
4873
+ PlatformVideoSource["Youku"] = "youku";
4874
+ return PlatformVideoSource;
4875
+ }({});
4876
+ const PlatformVideoSources = Object.values(platform_PlatformVideoSource);
4877
+ var platform_PlatformDanmakuOnlySource = /*#__PURE__*/ function(PlatformDanmakuOnlySource) {
4878
+ PlatformDanmakuOnlySource["DanDanPlay"] = "ddplay";
4879
+ PlatformDanmakuOnlySource["TuCao"] = "tucao";
4880
+ return PlatformDanmakuOnlySource;
4881
+ }({});
4882
+ const PlatformDanmakuOnlySources = Object.values(platform_PlatformDanmakuOnlySource);
4883
+ const PlatformDanmakuSources = [
4884
+ ...PlatformVideoSources,
4885
+ ...PlatformDanmakuOnlySources
4886
+ ];
4887
+ const PlatformSources = [
4888
+ ...PlatformInfoSources,
4889
+ ...PlatformDanmakuSources
4890
+ ];
4891
+ class id_gen_UniID {
4827
4892
  id;
4828
4893
  domain;
4829
4894
  constructor(id, domain){
4830
4895
  this.id = id;
4831
4896
  this.domain = domain;
4832
4897
  }
4898
+ static fromString(str) {
4899
+ const [id, domain] = str.split('@');
4900
+ return new id_gen_UniID(id, domain);
4901
+ }
4833
4902
  toString() {
4834
4903
  return `${this.id}@${this.domain}`;
4835
4904
  }
4836
4905
  static fromNull(domain) {
4837
- return new UniID('anonymous', domain || 'danuni');
4906
+ return new id_gen_UniID('runtime' === domain ? 'runtime' : 'anonymous', domain || 'danuni');
4838
4907
  }
4839
4908
  static fromBili({ cid, mid, midHash }) {
4840
- if (cid) return new UniID(cid.toString(), domainPreset.bili);
4841
- if (mid) return new UniID(mid.toString(), domainPreset.bili);
4842
- if (midHash) return new UniID(midHash, domainPreset.bili);
4843
- return this.fromNull(domainPreset.bili);
4909
+ if (cid) return new id_gen_UniID(cid.toString(), platform_PlatformVideoSource.Bilibili);
4910
+ if (mid) return new id_gen_UniID(mid.toString(), platform_PlatformVideoSource.Bilibili);
4911
+ if (midHash) return new id_gen_UniID(midHash, platform_PlatformVideoSource.Bilibili);
4912
+ return this.fromNull(platform_PlatformVideoSource.Bilibili);
4844
4913
  }
4845
4914
  static fromUnknown(id, domain) {
4846
- if (id) return new UniID(id, domain);
4915
+ if (id) return new id_gen_UniID(id, domain);
4847
4916
  return this.fromNull(domain);
4848
4917
  }
4849
4918
  }
4850
4919
  function createDMID(content = '', senderID, ctime, slice = 8) {
4851
- return new __WEBPACK_EXTERNAL_MODULE_jssha__["default"]('SHA3-256', 'TEXT').update(content + senderID + UniDM.transCtime(ctime).toISOString()).getHash('HEX').slice(0, slice);
4920
+ return new jssha('SHA3-256', 'TEXT').update(content + senderID + UniDM.transCtime(ctime).toISOString()).getHash('HEX').slice(0, slice);
4852
4921
  }
4853
4922
  const BigIntSerializer = (k, v)=>'bigint' == typeof v ? v.toString() : v;
4854
4923
  function cleanEmptyObjects(obj) {
@@ -4857,7 +4926,7 @@ function cleanEmptyObjects(obj) {
4857
4926
  const cleaned = {};
4858
4927
  for (const [key, value] of Object.entries(obj)){
4859
4928
  const cleanedValue = cleanEmptyObjects(value);
4860
- if (void 0 !== cleanedValue && !('object' == typeof cleanedValue && 0 === Object.keys(cleanedValue).length)) cleaned[key] = cleanedValue;
4929
+ if (void 0 !== cleanedValue && ('object' != typeof cleanedValue || 0 !== Object.keys(cleanedValue).length)) cleaned[key] = cleanedValue;
4861
4930
  }
4862
4931
  return Object.keys(cleaned).length > 0 ? cleaned : {};
4863
4932
  }
@@ -4916,16 +4985,16 @@ var dm_gen_ExtraDanUniChapterType = /*#__PURE__*/ function(ExtraDanUniChapterTyp
4916
4985
  }({});
4917
4986
  const ExtraDanUniChapterTypeDict = {
4918
4987
  chs: {
4919
- ch: '其它片段',
4920
- rev: '回顾',
4921
- op: '片头',
4922
- int: '中场',
4923
- ed: '片尾',
4924
- prvw: '预告',
4925
- cut: '删减',
4926
- dup: '补档',
4927
- biz: '商业广告',
4928
- promo: '推广'
4988
+ ch: "\u5176\u5B83\u7247\u6BB5",
4989
+ rev: "\u56DE\u987E",
4990
+ op: "\u7247\u5934",
4991
+ int: "\u4E2D\u573A",
4992
+ ed: "\u7247\u5C3E",
4993
+ prvw: "\u9884\u544A",
4994
+ cut: "\u5220\u51CF",
4995
+ dup: "\u8865\u6863",
4996
+ biz: "\u5546\u4E1A\u5E7F\u544A",
4997
+ promo: "\u63A8\u5E7F"
4929
4998
  }
4930
4999
  };
4931
5000
  var dm_gen_ExtraDanUniChapterAction = /*#__PURE__*/ function(ExtraDanUniChapterAction) {
@@ -4951,7 +5020,7 @@ var dm_gen_Pools = /*#__PURE__*/ function(Pools) {
4951
5020
  return Pools;
4952
5021
  }({});
4953
5022
  class UniDM {
4954
- FCID;
5023
+ SOID;
4955
5024
  progress;
4956
5025
  mode;
4957
5026
  fontsize;
@@ -4963,11 +5032,10 @@ class UniDM {
4963
5032
  pool;
4964
5033
  attr;
4965
5034
  platform;
4966
- SPMO;
4967
5035
  extraStr;
4968
5036
  DMID;
4969
- constructor(FCID, progress = 0, mode = 0, fontsize = 25, color = 16777215, senderID = UniID.fromNull().toString(), content = '', ctime = new Date(), weight = 5, pool = 0, attr = [], platform, SPMO, extraStr, DMID){
4970
- this.FCID = FCID;
5037
+ constructor(SOID, progress = 0, mode = 0, fontsize = 25, color = 16777215, senderID = id_gen_UniID.fromNull().toString(), content = '', ctime = new Date(), weight = 0, pool = 0, attr = [], platform, extraStr, DMID){
5038
+ this.SOID = SOID;
4971
5039
  this.progress = progress;
4972
5040
  this.mode = mode;
4973
5041
  this.fontsize = fontsize;
@@ -4979,14 +5047,13 @@ class UniDM {
4979
5047
  this.pool = pool;
4980
5048
  this.attr = attr;
4981
5049
  this.platform = platform;
4982
- this.SPMO = SPMO;
4983
5050
  this.extraStr = extraStr;
4984
5051
  this.DMID = DMID;
4985
5052
  if (progress < 0) this.progress = 0;
4986
5053
  if (mode < 0 || mode > 4) this.mode = 0;
4987
5054
  if (fontsize <= 0) this.fontsize = 25;
4988
5055
  if (color <= 0) this.color = 16777215;
4989
- if (weight <= 0 || weight > 10) this.weight = 5;
5056
+ if (weight < 0 || weight > 10) this.weight = 5;
4990
5057
  if (pool < 0 || pool > 3) this.pool = 0;
4991
5058
  if (!DMID) DMID = this.toDMID();
4992
5059
  this.progress = Number.parseFloat(progress.toFixed(3));
@@ -4994,14 +5061,14 @@ class UniDM {
4994
5061
  if ('{}' === extraStr) this.extraStr = void 0;
4995
5062
  }
4996
5063
  static create(args) {
4997
- return args ? new UniDM(args.FCID || UniID.fromNull().toString(), args.progress, args.mode, args.fontsize, args.color, args.senderID, args.content, args.ctime, args.weight, args.pool, args.attr, args.platform, args.SPMO, 'object' == typeof args.extra ? JSON.stringify(args.extra) : args.extra || args.extraStr, args.DMID) : new UniDM(UniID.fromNull().toString());
5064
+ return args ? new UniDM(args.SOID || id_gen_UniID.fromNull().toString(), args.progress, args.mode, args.fontsize, args.color, args.senderID, args.content, args.ctime, args.weight, args.pool, args.attr, args.platform, 'object' == typeof args.extra ? JSON.stringify(args.extra) : args.extra || args.extraStr, args.DMID) : new UniDM(id_gen_UniID.fromNull().toString());
4998
5065
  }
4999
5066
  get extra() {
5000
5067
  const extra = JSON.parse(this.extraStr || '{}');
5001
5068
  return extra;
5002
5069
  }
5003
5070
  get isFrom3rdPlatform() {
5004
- if (this.platform && platforms.includes(this.platform)) return true;
5071
+ if (this.platform && PlatformDanmakuSources.includes(this.platform)) return true;
5005
5072
  return false;
5006
5073
  }
5007
5074
  toDMID() {
@@ -5009,12 +5076,11 @@ class UniDM {
5009
5076
  }
5010
5077
  isSameAs(dan, _check2 = false) {
5011
5078
  const isSame = (k)=>this[k] === dan[k], checks = [
5012
- 'FCID',
5079
+ 'SOID',
5013
5080
  'content',
5014
5081
  'mode',
5015
5082
  'platform',
5016
- 'pool',
5017
- 'SPMO'
5083
+ 'pool'
5018
5084
  ].every((k)=>isSame(k));
5019
5085
  if ('{}' === JSON.stringify(this.extra) && '{}' === JSON.stringify(dan.extra)) return checks;
5020
5086
  const thisHasOnlyMerge = this.extra.danuni?.merge && !this.extra.artplayer && !this.extra.bili && !this.extra.danuni.chapter;
@@ -5041,15 +5107,12 @@ class UniDM {
5041
5107
  const def = UniDM.create(), dan = UniDM.create(this);
5042
5108
  for(const key in dan){
5043
5109
  const k = key, v = dan[k];
5044
- if ('FCID' !== key) {
5045
- if (v) {
5046
- if (v === def[k]) delete dan[k];
5047
- else {
5048
- if ('attr' === k && Array.isArray(v) && 0 === v.length) delete dan[k];
5049
- if ('extraStr' === k && '{}' === v) delete dan[k];
5050
- }
5051
- } else delete dan[k];
5110
+ if ('SOID' !== key) if (v) if (v === def[k]) delete dan[k];
5111
+ else {
5112
+ if ('attr' === k && Array.isArray(v) && 0 === v.length) delete dan[k];
5113
+ if ('extraStr' === k && '{}' === v) delete dan[k];
5052
5114
  }
5115
+ else delete dan[k];
5053
5116
  }
5054
5117
  return JSON.parse(JSON.stringify(dan));
5055
5118
  }
@@ -5071,20 +5134,20 @@ class UniDM {
5071
5134
  clone.content = `${this.content} x${merge.count}`;
5072
5135
  } else if (danuni.chapter) {
5073
5136
  const chapter = danuni.chapter;
5074
- if ("cut" === chapter.type) clone.content = `[提示]${clone.platform}源${ExtraDanUniChapterTypeDict.chs[chapter.type]}了${chapter.duration}秒`;
5075
- else if ("dup" === chapter.type) clone.content = `[提示(${ExtraDanUniChapterTypeDict.chs[chapter.type]})]${clone.platform}源-${chapter.duration}秒`;
5076
- else clone.content = `[空降(${ExtraDanUniChapterTypeDict.chs[chapter.type]})]${__WEBPACK_EXTERNAL_MODULE_hh_mm_ss_6ead5141__["default"].fromS(clone.progress + chapter.duration)}`;
5137
+ if ("cut" === chapter.type) clone.content = `[\u{63D0}\u{793A}]${clone.platform}\u{6E90}${ExtraDanUniChapterTypeDict.chs[chapter.type]}\u{4E86}${chapter.duration}\u{79D2}`;
5138
+ else if ("dup" === chapter.type) clone.content = `[\u{63D0}\u{793A}(${ExtraDanUniChapterTypeDict.chs[chapter.type]})]${clone.platform}\u{6E90}-${chapter.duration}\u{79D2}`;
5139
+ else clone.content = `[\u{7A7A}\u{964D}(${ExtraDanUniChapterTypeDict.chs[chapter.type]})]${hh_mm_ss.fromS(clone.progress + chapter.duration)}`;
5077
5140
  }
5078
5141
  } else if (check('bili') && clone.extra.bili) {
5079
5142
  const bili = clone.extra.bili;
5080
- if (7 === bili.mode && bili.adv) clone.content = `[B站高级弹幕]${JSON.parse(bili.adv)[4] || ''}`;
5143
+ if (7 === bili.mode && bili.adv) clone.content = `[B\u{7AD9}\u{9AD8}\u{7EA7}\u{5F39}\u{5E55}]${JSON.parse(bili.adv)[4] || ''}`;
5081
5144
  else if (bili.command) {
5082
5145
  const command = bili.command;
5083
- clone.content = `[B站指令弹幕]${command.content}`;
5146
+ clone.content = `[B\u{7AD9}\u{6307}\u{4EE4}\u{5F39}\u{5E55}]${command.content}`;
5084
5147
  clone.fontsize = 36;
5085
5148
  }
5086
5149
  }
5087
- clone.senderID = 'compat@bot';
5150
+ clone.senderID = 'compat[bot]@dan-any';
5088
5151
  clone.attr.push('Compatible');
5089
5152
  if (cleanExtra) clone.extraStr = void 0;
5090
5153
  return clone;
@@ -5096,10 +5159,8 @@ class UniDM {
5096
5159
  if ('s' === tsUnit) return false;
5097
5160
  return ts < 100000000;
5098
5161
  }
5099
- if ('number' == typeof oriCtime || 'bigint' == typeof oriCtime) {
5100
- if (isMsTs(oriCtime)) return new Date(Number(oriCtime));
5101
- return new Date(1000 * Number(oriCtime));
5102
- }
5162
+ if ('number' == typeof oriCtime || 'bigint' == typeof oriCtime) if (isMsTs(oriCtime)) return new Date(Number(oriCtime));
5163
+ else return new Date(1000 * Number(oriCtime));
5103
5164
  if ('string' != typeof oriCtime) return oriCtime;
5104
5165
  if (/^\d+n$/.test(oriCtime)) return new Date(Number(oriCtime.slice(0, -1)));
5105
5166
  return new Date(oriCtime);
@@ -5146,11 +5207,11 @@ class UniDM {
5146
5207
  }
5147
5208
  return mode;
5148
5209
  }
5149
- static fromBili(args, SPMO, cid) {
5210
+ static fromBili(args, cid) {
5150
5211
  if (args.oid && !cid) cid = args.oid;
5151
- const FCID = UniID.fromBili({
5212
+ const SOID = `def::${id_gen_UniID.fromBili({
5152
5213
  cid
5153
- }), senderID = UniID.fromBili({
5214
+ })}`, senderID = id_gen_UniID.fromBili({
5154
5215
  midHash: args.midHash
5155
5216
  });
5156
5217
  let mode = 0;
@@ -5188,28 +5249,79 @@ class UniDM {
5188
5249
  }
5189
5250
  return this.create({
5190
5251
  ...args,
5191
- FCID: FCID.toString(),
5252
+ SOID: SOID.toString(),
5192
5253
  mode,
5193
5254
  senderID: senderID.toString(),
5194
5255
  ctime: this.transCtime(args.ctime, 's'),
5195
5256
  weight: args.weight ? args.weight : 3 === pool ? 1 : 0,
5196
5257
  pool,
5197
- attr: DMAttrUtils.fromBin(args.attr, 'bili'),
5198
- platform: domainPreset.bili,
5199
- SPMO,
5258
+ attr: DMAttrUtils.fromBin(args.attr, platform_PlatformVideoSource.Bilibili),
5259
+ platform: platform_PlatformVideoSource.Bilibili,
5200
5260
  extra: args.mode >= 7 ? JSON.stringify(extra, BigIntSerializer) : void 0
5201
5261
  });
5202
5262
  }
5203
- static fromBiliCommand(args, SPMO, cid) {
5263
+ toBiliXML() {
5264
+ const recMode = (mode, extra)=>{
5265
+ switch(mode){
5266
+ case 0:
5267
+ return 1;
5268
+ case 1:
5269
+ return 4;
5270
+ case 2:
5271
+ return 5;
5272
+ case 3:
5273
+ return 6;
5274
+ case 4:
5275
+ if (!extra) return 1;
5276
+ if (extra.adv) return 7;
5277
+ if (extra.code) return 8;
5278
+ else if (extra.bas) return 9;
5279
+ else return 1;
5280
+ default:
5281
+ return 1;
5282
+ }
5283
+ };
5284
+ const rMode = recMode(this.mode, this.extra?.bili);
5285
+ let content;
5286
+ switch(rMode){
5287
+ case 7:
5288
+ content = this.extra?.bili?.adv;
5289
+ break;
5290
+ case 8:
5291
+ content = this.extra?.bili?.code;
5292
+ break;
5293
+ case 9:
5294
+ content = this.extra?.bili?.bas;
5295
+ break;
5296
+ default:
5297
+ content = this.content;
5298
+ break;
5299
+ }
5300
+ return {
5301
+ '#text': content ?? this.content,
5302
+ '@_p': [
5303
+ this.progress,
5304
+ rMode,
5305
+ this.fontsize,
5306
+ this.color,
5307
+ this.ctime.getTime() / 1000,
5308
+ this.pool,
5309
+ this.senderID,
5310
+ this.DMID || this.toDMID(),
5311
+ this.weight
5312
+ ].join(',')
5313
+ };
5314
+ }
5315
+ static fromBiliCommand(args, cid) {
5204
5316
  if (args.oid && !cid) cid = args.oid;
5205
- const FCID = UniID.fromBili({
5317
+ const SOID = id_gen_UniID.fromBili({
5206
5318
  cid
5207
- }), senderID = UniID.fromBili({
5319
+ }), senderID = id_gen_UniID.fromBili({
5208
5320
  mid: args.mid
5209
5321
  });
5210
5322
  return this.create({
5211
5323
  ...args,
5212
- FCID: FCID.toString(),
5324
+ SOID: SOID.toString(),
5213
5325
  mode: 4,
5214
5326
  senderID: senderID.toString(),
5215
5327
  ctime: new Date(`${args.ctime} GMT+0800`),
@@ -5218,8 +5330,7 @@ class UniDM {
5218
5330
  attr: [
5219
5331
  'Protect'
5220
5332
  ],
5221
- platform: domainPreset.bili,
5222
- SPMO,
5333
+ platform: platform_PlatformVideoSource.Bilibili,
5223
5334
  extra: JSON.stringify({
5224
5335
  bili: {
5225
5336
  command: args
@@ -5228,10 +5339,10 @@ class UniDM {
5228
5339
  });
5229
5340
  }
5230
5341
  static fromDplayer(args, playerID, domain) {
5231
- const FCID = UniID.fromUnknown(playerID, domain), senderID = UniID.fromUnknown(args.midHash, domain);
5342
+ const SOID = id_gen_UniID.fromUnknown(playerID, domain), senderID = id_gen_UniID.fromUnknown(args.midHash, domain);
5232
5343
  return this.create({
5233
5344
  ...args,
5234
- FCID: FCID.toString(),
5345
+ SOID: SOID.toString(),
5235
5346
  mode: this.transMode(args.mode, 'dplayer'),
5236
5347
  senderID: senderID.toString(),
5237
5348
  platform: domain
@@ -5250,7 +5361,7 @@ class UniDM {
5250
5361
  };
5251
5362
  }
5252
5363
  static fromArtplayer(args, playerID, domain) {
5253
- const FCID = UniID.fromUnknown(playerID, domain), senderID = UniID.fromUnknown('', domain);
5364
+ const SOID = id_gen_UniID.fromUnknown(playerID, domain), senderID = id_gen_UniID.fromUnknown('', domain);
5254
5365
  let extra = args.border ? {
5255
5366
  artplayer: {
5256
5367
  border: args.border,
@@ -5270,7 +5381,7 @@ class UniDM {
5270
5381
  };
5271
5382
  return this.create({
5272
5383
  ...args,
5273
- FCID: FCID.toString(),
5384
+ SOID: SOID.toString(),
5274
5385
  mode: this.transMode(args.mode, 'artplayer'),
5275
5386
  senderID: senderID.toString(),
5276
5387
  platform: domain,
@@ -5289,11 +5400,11 @@ class UniDM {
5289
5400
  style: this.extra.artplayer?.style
5290
5401
  };
5291
5402
  }
5292
- static fromDDplay(args, episodeId, domain = domainPreset.ddplay) {
5293
- const FCID = UniID.fromUnknown(episodeId, domain);
5403
+ static fromDDplay(args, episodeId, domain = platform_PlatformDanmakuOnlySource.DanDanPlay) {
5404
+ const SOID = id_gen_UniID.fromUnknown(`def::${episodeId}`, domain);
5294
5405
  return this.create({
5295
5406
  ...args,
5296
- FCID: FCID.toString(),
5407
+ SOID: SOID.toString(),
5297
5408
  mode: this.transMode(args.mode, 'ddplay'),
5298
5409
  senderID: args.uid,
5299
5410
  content: args.m,
@@ -5315,78 +5426,605 @@ class UniDM {
5315
5426
  };
5316
5427
  }
5317
5428
  }
5318
- function decimalToRGB888(decimal) {
5319
- const r = decimal >> 16 & 0xff;
5320
- const g = decimal >> 8 & 0xff;
5321
- const b = 0xff & decimal;
5322
- return {
5323
- r,
5324
- g,
5325
- b
5326
- };
5327
- }
5328
- function UniPool2DanmakuLists(UP) {
5329
- const dans = UP.dans;
5330
- let type = DanmakuType.SCROLL;
5331
- return dans.map((d)=>{
5332
- if (d.mode === dm_gen_Modes.Bottom) type = DanmakuType.BOTTOM;
5333
- else if (d.mode === dm_gen_Modes.Top) type = DanmakuType.TOP;
5429
+ class UniPool {
5430
+ dans;
5431
+ options;
5432
+ constructor(dans, options = {}){
5433
+ this.dans = dans;
5434
+ this.options = options;
5435
+ if (false !== options.dedupe) options.dedupe = true;
5436
+ if (this.options.dedupe) this.dedupe();
5437
+ }
5438
+ async pipe(fn) {
5439
+ return fn(this);
5440
+ }
5441
+ pipeSync(fn) {
5442
+ return fn(this);
5443
+ }
5444
+ get shared() {
5445
+ const isShared = (key)=>this.dans.every((d)=>d[key]);
5334
5446
  return {
5335
- time: d.progress,
5336
- type,
5337
- fontSizeType: d.fontsize,
5338
- content: d.content,
5339
- color: decimalToRGB888(d.color),
5340
- extra: d
5447
+ SOID: isShared('SOID') ? this.dans[0].SOID : void 0,
5448
+ senderID: isShared('senderID') ? this.dans[0].senderID : void 0,
5449
+ platform: isShared('platform') ? this.dans[0].platform : void 0,
5450
+ pool: isShared('pool') ? this.dans[0].pool : void 0,
5451
+ mode: isShared('mode') ? this.dans[0].mode : void 0,
5452
+ color: isShared('color') ? this.dans[0].color : void 0
5341
5453
  };
5342
- });
5343
- }
5344
- function DanmakuList2UniPool(d) {
5345
- return new UniPool(d.map((d)=>d.extra));
5346
- }
5347
- const lang_assign = (source, ...targets)=>{
5348
- for (const target of targets)for (const key of Object.keys(target))source[key] = target[key];
5349
- return source;
5350
- };
5351
- const arrayOfLength = (length, defaultValue)=>{
5352
- const array = new Array(length);
5353
- for(let i = 0; i < length; i++)array[i] = defaultValue;
5354
- return array;
5355
- };
5356
- const computeScrollInTime = (rectWidth, screenWidth, scrollTime)=>{
5357
- const speed = (screenWidth + rectWidth) / scrollTime;
5358
- return rectWidth / speed;
5359
- };
5360
- const computeScrollOverTime = (rectWidth, screenWidth, scrollTime)=>{
5361
- const speed = (screenWidth + rectWidth) / scrollTime;
5362
- return screenWidth / speed;
5363
- };
5364
- const splitGrids = ({ fontSize, padding, playResY, bottomSpace })=>{
5365
- const defaultFontSize = fontSize[FontSize.NORMAL];
5366
- const paddingTop = padding[0];
5367
- const paddingBottom = padding[2];
5368
- const linesCount = Math.floor((playResY - bottomSpace) / (defaultFontSize + paddingTop + paddingBottom));
5369
- return {
5370
- 1: arrayOfLength(linesCount, {
5371
- start: 0,
5372
- end: 0,
5373
- width: 0
5374
- }),
5375
- 3: arrayOfLength(linesCount, 0),
5376
- 2: arrayOfLength(linesCount, 0)
5377
- };
5378
- };
5379
- const measureTextWidth = (()=>{
5380
- const canvasContext = (0, __WEBPACK_EXTERNAL_MODULE_canvas__.createCanvas)(50, 50).getContext('2d');
5381
- const supportTextMeasure = !!canvasContext.measureText('中');
5382
- if (supportTextMeasure) return (fontName, fontSize, bold, text)=>{
5383
- canvasContext.font = `${bold ? 'bold' : 'normal'} ${fontSize}px ${fontName}`;
5384
- const textWidth = canvasContext.measureText(text).width;
5385
- return Math.round(textWidth);
5386
- };
5387
- console.warn('[Warn] node-canvas is installed without text measure support, layout may not be correct');
5388
- return (_fontName, fontSize, _bold, text)=>text.length * fontSize;
5389
- })();
5454
+ }
5455
+ get stat() {
5456
+ const default_stat = {
5457
+ SOID: [],
5458
+ mode: [
5459
+ {
5460
+ val: dm_gen_Modes.Normal,
5461
+ count: 0
5462
+ },
5463
+ {
5464
+ val: dm_gen_Modes.Bottom,
5465
+ count: 0
5466
+ },
5467
+ {
5468
+ val: dm_gen_Modes.Top,
5469
+ count: 0
5470
+ },
5471
+ {
5472
+ val: dm_gen_Modes.Reverse,
5473
+ count: 0
5474
+ },
5475
+ {
5476
+ val: dm_gen_Modes.Ext,
5477
+ count: 0
5478
+ }
5479
+ ],
5480
+ fontsize: [],
5481
+ color: [],
5482
+ senderID: [],
5483
+ content: [],
5484
+ weight: [],
5485
+ pool: [
5486
+ {
5487
+ val: dm_gen_Pools.Def,
5488
+ count: 0
5489
+ },
5490
+ {
5491
+ val: dm_gen_Pools.Sub,
5492
+ count: 0
5493
+ },
5494
+ {
5495
+ val: dm_gen_Pools.Adv,
5496
+ count: 0
5497
+ },
5498
+ {
5499
+ val: dm_gen_Pools.Ix,
5500
+ count: 0
5501
+ }
5502
+ ],
5503
+ platform: []
5504
+ };
5505
+ const stat = this.dans.reduce((s, d)=>{
5506
+ const SOID = s.SOID.find((i)=>i.val === d.SOID);
5507
+ if (SOID) SOID.count++;
5508
+ else s.SOID.push({
5509
+ val: d.SOID,
5510
+ count: 1
5511
+ });
5512
+ const mode = s.mode.find((i)=>i.val === d.mode);
5513
+ if (mode) mode.count++;
5514
+ else s.mode.push({
5515
+ val: d.mode,
5516
+ count: 1
5517
+ });
5518
+ const fontsize = s.fontsize.find((i)=>i.val === d.fontsize);
5519
+ if (fontsize) fontsize.count++;
5520
+ else s.fontsize.push({
5521
+ val: d.fontsize,
5522
+ count: 1
5523
+ });
5524
+ const color = s.color.find((i)=>i.val === d.color);
5525
+ if (color) color.count++;
5526
+ else s.color.push({
5527
+ val: d.color,
5528
+ count: 1
5529
+ });
5530
+ const senderID = s.senderID.find((i)=>i.val === d.senderID);
5531
+ if (senderID) senderID.count++;
5532
+ else s.senderID.push({
5533
+ val: d.senderID,
5534
+ count: 1
5535
+ });
5536
+ const content = s.content.find((i)=>i.val === d.content);
5537
+ if (content) content.count++;
5538
+ else s.content.push({
5539
+ val: d.content,
5540
+ count: 1
5541
+ });
5542
+ const weight = s.weight.find((i)=>i.val === d.weight);
5543
+ if (weight) weight.count++;
5544
+ else s.weight.push({
5545
+ val: d.weight,
5546
+ count: 1
5547
+ });
5548
+ const pool = s.pool.find((i)=>i.val === d.pool);
5549
+ if (pool) pool.count++;
5550
+ else s.pool.push({
5551
+ val: d.pool,
5552
+ count: 1
5553
+ });
5554
+ const platform = s.platform.find((i)=>i.val === d.platform);
5555
+ if (platform) platform.count++;
5556
+ else s.platform.push({
5557
+ val: d.platform,
5558
+ count: 1
5559
+ });
5560
+ return s;
5561
+ }, default_stat);
5562
+ return stat;
5563
+ }
5564
+ get most() {
5565
+ const s = this.stat;
5566
+ return {
5567
+ mode: s.mode.sort((a, b)=>b.count - a.count)[0].val,
5568
+ fontsize: s.fontsize.sort((a, b)=>b.count - a.count)[0].val,
5569
+ color: s.color.sort((a, b)=>b.count - a.count)[0].val,
5570
+ senderID: s.senderID.sort((a, b)=>b.count - a.count)[0].val,
5571
+ content: s.content.sort((a, b)=>b.count - a.count)[0].val,
5572
+ weight: s.weight.sort((a, b)=>b.count - a.count)[0].val,
5573
+ pool: s.pool.sort((a, b)=>b.count - a.count)[0].val,
5574
+ platform: s.platform.sort((a, b)=>b.count - a.count)[0].val
5575
+ };
5576
+ }
5577
+ static create() {
5578
+ return new UniPool([]);
5579
+ }
5580
+ assign(dans) {
5581
+ if (dans instanceof UniPool) return new UniPool([
5582
+ ...this.dans,
5583
+ ...dans.dans
5584
+ ]);
5585
+ if (dans instanceof UniDM) return new UniPool([
5586
+ ...this.dans,
5587
+ dans
5588
+ ]);
5589
+ if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new UniPool([
5590
+ ...this.dans,
5591
+ ...dans
5592
+ ]);
5593
+ return this;
5594
+ }
5595
+ split(key) {
5596
+ if (this.shared[key]) return [
5597
+ this
5598
+ ];
5599
+ const set = new Set(this.dans.map((d)=>d[key]));
5600
+ return [
5601
+ ...set
5602
+ ].map((v)=>new UniPool(this.dans.filter((d)=>d[key] === v), {
5603
+ dedupe: false
5604
+ }));
5605
+ }
5606
+ dedupe() {
5607
+ const map = new Map();
5608
+ this.dans.forEach((d)=>map.set(d.DMID || d.toDMID(), d));
5609
+ this.dans = [
5610
+ ...map.values()
5611
+ ];
5612
+ this.options.dedupe = false;
5613
+ }
5614
+ merge(lifetime = 0) {
5615
+ if (!this.shared.SOID) {
5616
+ console.error("\u672C\u529F\u80FD\u4EC5\u652F\u6301\u540C\u5F39\u5E55\u5E93\u5185\u4F7F\u7528\uFF0C\u53EF\u5148 .split('SOID') \u5728\u5206\u522B\u4F7F\u7528");
5617
+ return this;
5618
+ }
5619
+ if (lifetime <= 0) return this;
5620
+ const mergeContext = this.dans.reduce(([result, cache, mergeObj], danmaku)=>{
5621
+ const key = [
5622
+ 'SOID',
5623
+ 'content',
5624
+ 'mode',
5625
+ 'platform',
5626
+ 'pool'
5627
+ ].map((k)=>danmaku[k]).join('|');
5628
+ const cached = cache[key];
5629
+ const lastAppearTime = cached?.progress || 0;
5630
+ if (cached && danmaku.progress - lastAppearTime <= lifetime && danmaku.isSameAs(cached)) {
5631
+ const senders = mergeObj[key].senders;
5632
+ senders.push(danmaku.senderID);
5633
+ const extra = danmaku.extra;
5634
+ extra.danuni = extra.danuni || {};
5635
+ extra.danuni.merge = {
5636
+ count: senders.length,
5637
+ duration: danmaku.progress - cached.progress,
5638
+ senders,
5639
+ taolu_count: senders.length,
5640
+ taolu_senders: senders
5641
+ };
5642
+ danmaku.extraStr = JSON.stringify(extra);
5643
+ cache[key] = danmaku;
5644
+ mergeObj[key] = extra.danuni.merge;
5645
+ return [
5646
+ result,
5647
+ cache,
5648
+ mergeObj
5649
+ ];
5650
+ }
5651
+ {
5652
+ mergeObj[key] = {
5653
+ count: 1,
5654
+ duration: 0,
5655
+ senders: [
5656
+ danmaku.senderID
5657
+ ],
5658
+ taolu_count: 1,
5659
+ taolu_senders: [
5660
+ danmaku.senderID
5661
+ ]
5662
+ };
5663
+ cache[key] = danmaku;
5664
+ const extra = danmaku.extra;
5665
+ extra.danuni = extra.danuni || {};
5666
+ extra.danuni.merge = mergeObj[key];
5667
+ danmaku.extraStr = JSON.stringify(extra);
5668
+ result.push(danmaku);
5669
+ return [
5670
+ result,
5671
+ cache,
5672
+ mergeObj
5673
+ ];
5674
+ }
5675
+ }, [
5676
+ [],
5677
+ {},
5678
+ {}
5679
+ ]);
5680
+ const [result, _cache, mergeObj] = mergeContext;
5681
+ result.forEach((danmaku, i)=>{
5682
+ const key = [
5683
+ 'SOID',
5684
+ 'content',
5685
+ 'mode',
5686
+ 'platform',
5687
+ 'pool'
5688
+ ].map((k)=>danmaku[k]).join('|');
5689
+ const extra = result[i].extra, mergeData = mergeObj[key];
5690
+ result[i].extraStr = JSON.stringify({
5691
+ ...extra,
5692
+ danuni: {
5693
+ ...extra.danuni,
5694
+ merge: mergeData
5695
+ }
5696
+ });
5697
+ if (mergeData?.count) if (mergeData.count <= 1) {
5698
+ const updatedExtra = {
5699
+ ...extra
5700
+ };
5701
+ if (updatedExtra.danuni) {
5702
+ delete updatedExtra.danuni.merge;
5703
+ if (0 === Object.keys(updatedExtra.danuni).length) delete updatedExtra.danuni;
5704
+ }
5705
+ result[i].extraStr = Object.keys(updatedExtra).length > 0 ? JSON.stringify(updatedExtra) : void 0;
5706
+ } else {
5707
+ result[i].senderID = 'merge[bot]@dan-any';
5708
+ result[i].attr ? result[i].attr.push('Protect') : result[i].attr = [
5709
+ 'Protect'
5710
+ ];
5711
+ }
5712
+ });
5713
+ return new UniPool(result);
5714
+ }
5715
+ minify() {
5716
+ return this.dans.map((d)=>d.minify());
5717
+ }
5718
+ convert2(format, continue_on_error = false) {
5719
+ switch(format){
5720
+ case 'danuni.json':
5721
+ return this.dans;
5722
+ case 'danuni.bin':
5723
+ return this.toPb();
5724
+ case 'dplayer.json':
5725
+ return this.toDplayer();
5726
+ case 'artplayer.json':
5727
+ return this.toArtplayer();
5728
+ case 'ddplay.json':
5729
+ return this.toDDplay();
5730
+ case 'common.ass':
5731
+ return this.toASS();
5732
+ default:
5733
+ {
5734
+ const message = '(err) Unknown format or unsupported now!';
5735
+ if (continue_on_error) return message;
5736
+ throw new Error(message);
5737
+ }
5738
+ }
5739
+ }
5740
+ static fromPb(bin) {
5741
+ const data = fromBinary(DanmakuReplySchema, new Uint8Array(bin));
5742
+ return new UniPool(data.danmakus.map((d)=>new UniDM(d.SOID, d.progress, d.mode, d.fontsize, d.color, d.senderID, d.content, timestampDate(d.ctime || timestampNow()), d.weight, d.pool, d.attr, d.platform, d.extra, d.DMID)));
5743
+ }
5744
+ toPb() {
5745
+ return toBinary(DanmakuReplySchema, create(DanmakuReplySchema, {
5746
+ danmakus: this.dans.map((d)=>({
5747
+ SOID: d.SOID,
5748
+ DMID: d.DMID,
5749
+ progress: d.progress,
5750
+ mode: d.mode,
5751
+ fontsize: d.fontsize,
5752
+ color: d.color,
5753
+ senderID: d.senderID,
5754
+ content: d.content,
5755
+ ctime: timestampFromDate(d.ctime),
5756
+ weight: d.weight,
5757
+ pool: d.pool,
5758
+ attr: d.attr,
5759
+ platform: d.platform,
5760
+ extra: d.extraStr
5761
+ }))
5762
+ }));
5763
+ }
5764
+ static fromBiliXML(xml) {
5765
+ const parser = new XMLParser({
5766
+ ignoreAttributes: false
5767
+ }), oriData = parser.parse(xml), dans = oriData.i.d;
5768
+ return new UniPool(dans.map((d)=>{
5769
+ const p_str = d['@_p'], p_arr = p_str.split(',');
5770
+ return UniDM.fromBili({
5771
+ content: d['#text'],
5772
+ progress: Number.parseFloat(p_arr[0]),
5773
+ mode: Number.parseInt(p_arr[1]),
5774
+ fontsize: Number.parseInt(p_arr[2]),
5775
+ color: Number.parseInt(p_arr[3]),
5776
+ ctime: BigInt(p_arr[4]),
5777
+ pool: Number.parseInt(p_arr[5]),
5778
+ midHash: p_arr[6],
5779
+ id: BigInt(p_arr[7]),
5780
+ weight: Number.parseInt(p_arr[8])
5781
+ }, BigInt(oriData.i.chatid));
5782
+ }));
5783
+ }
5784
+ toBiliXML() {
5785
+ const genCID = (id)=>{
5786
+ const UniID = id_gen_UniID.fromString(id);
5787
+ if (UniID.domain === platform_PlatformVideoSource.Bilibili) {
5788
+ const cid = Number(UniID.id.replaceAll('def::', ''));
5789
+ if (cid) return cid;
5790
+ }
5791
+ return Number.parseInt(Buffer.from(id).toString('hex'), 16);
5792
+ };
5793
+ const builder = new XMLBuilder({
5794
+ ignoreAttributes: false
5795
+ });
5796
+ return builder.build({
5797
+ '?xml': {
5798
+ '@_version': '1.0',
5799
+ '@_encoding': 'UTF-8'
5800
+ },
5801
+ i: {
5802
+ chatserver: 'chat.bilibili.com',
5803
+ chatid: genCID(this.dans[0].SOID),
5804
+ mission: 0,
5805
+ maxlimit: this.dans.length,
5806
+ state: 0,
5807
+ real_name: 0,
5808
+ source: 'k-v',
5809
+ d: this.dans.map((dan)=>dan.toBiliXML())
5810
+ }
5811
+ });
5812
+ }
5813
+ static fromBiliGrpc(bin) {
5814
+ const data = fromBinary(DmSegMobileReplySchema, new Uint8Array(bin)), json = data.elems;
5815
+ return new UniPool(json.map((d)=>UniDM.fromBili({
5816
+ ...d,
5817
+ progress: d.progress / 1000
5818
+ })));
5819
+ }
5820
+ static fromBiliCommandGrpc(bin) {
5821
+ const data = fromBinary(DmWebViewReplySchema, new Uint8Array(bin)), json = data.commandDms;
5822
+ return new UniPool(json.map((d)=>UniDM.fromBiliCommand(d)));
5823
+ }
5824
+ static fromDplayer(json, playerID, domain = 'other') {
5825
+ return new UniPool(json.data.map((d)=>UniDM.fromDplayer({
5826
+ content: d[4],
5827
+ progress: d[0],
5828
+ mode: d[1],
5829
+ color: d[2],
5830
+ midHash: d[3]
5831
+ }, playerID, domain)));
5832
+ }
5833
+ toDplayer() {
5834
+ return {
5835
+ code: 0,
5836
+ data: this.dans.map((dan)=>{
5837
+ const d = dan.toDplayer();
5838
+ return [
5839
+ d.progress,
5840
+ d.mode,
5841
+ d.color,
5842
+ d.midHash,
5843
+ d.content
5844
+ ];
5845
+ })
5846
+ };
5847
+ }
5848
+ static fromArtplayer(json, playerID, domain = 'other') {
5849
+ return new UniPool(json.map((d)=>UniDM.fromArtplayer({
5850
+ content: d.text,
5851
+ progress: d.time || 0,
5852
+ mode: d.mode || 0,
5853
+ color: Number((d.color || 'FFFFFF').replace('#', '0x')),
5854
+ style: d.style
5855
+ }, playerID, domain)));
5856
+ }
5857
+ toArtplayer() {
5858
+ return this.dans.map((dan)=>{
5859
+ const d = dan.toArtplayer();
5860
+ return {
5861
+ text: d.content,
5862
+ time: d.progress,
5863
+ mode: d.mode,
5864
+ color: `#${d.color.toString(16).toUpperCase() || 'FFFFFF'}`,
5865
+ border: d.border,
5866
+ style: d.style
5867
+ };
5868
+ });
5869
+ }
5870
+ static fromDDPlay(json, episodeId) {
5871
+ return new UniPool(json.comments.map((d)=>{
5872
+ const p_arr = d.p.split(',');
5873
+ return UniDM.fromDDplay({
5874
+ cid: d.cid,
5875
+ color: Number.parseInt(p_arr[2]),
5876
+ m: d.m,
5877
+ mode: Number.parseInt(p_arr[1]),
5878
+ progress: Number.parseFloat(p_arr[0]),
5879
+ uid: p_arr[3]
5880
+ }, episodeId);
5881
+ }));
5882
+ }
5883
+ toDDplay() {
5884
+ return {
5885
+ count: this.dans.length,
5886
+ comments: this.dans.map((dan)=>{
5887
+ const d = dan.toDDplay();
5888
+ return {
5889
+ cid: d.cid,
5890
+ p: `${d.progress},${d.mode},${d.color},${d.uid}`,
5891
+ m: d.m
5892
+ };
5893
+ })
5894
+ };
5895
+ }
5896
+ static fromASS(ass) {
5897
+ return parseAssRawField(ass);
5898
+ }
5899
+ toASS(options = {
5900
+ substyle: {}
5901
+ }) {
5902
+ const fn = this.shared.SOID;
5903
+ return generateASS(this, {
5904
+ filename: fn,
5905
+ title: fn,
5906
+ ...options
5907
+ });
5908
+ }
5909
+ }
5910
+ const color_pad = (s)=>s.length < 2 ? `0${s}` : s;
5911
+ const decimalToHex = (n)=>color_pad(n.toString(16));
5912
+ const isDarkColor = ({ r, g, b })=>0.299 * r + 0.587 * g + 0.114 * b < 0x30;
5913
+ const WHITE = {
5914
+ r: 255,
5915
+ g: 255,
5916
+ b: 255
5917
+ };
5918
+ const BLACK = {
5919
+ r: 0,
5920
+ g: 0,
5921
+ b: 0
5922
+ };
5923
+ const hexColorToRGB = (hex)=>{
5924
+ if (0 === hex.indexOf('#')) hex = hex.slice(1);
5925
+ const [r, g, b] = 3 === hex.length ? hex.split('').map((c)=>c + c) : hex.match(/../g) || [];
5926
+ return {
5927
+ r: Number.parseInt(r, 16),
5928
+ g: Number.parseInt(g, 16),
5929
+ b: Number.parseInt(b, 16)
5930
+ };
5931
+ };
5932
+ const formatColor = ({ r, g, b }, opacity)=>{
5933
+ const color = [
5934
+ b,
5935
+ g,
5936
+ r
5937
+ ];
5938
+ if (void 0 !== opacity) {
5939
+ const alpha = Math.round((1 - opacity) * 255);
5940
+ color.unshift(alpha);
5941
+ }
5942
+ return `&H${color.map(decimalToHex).join('').toUpperCase()}`;
5943
+ };
5944
+ const getDecoratingColor = (color)=>isDarkColor(color) ? WHITE : BLACK;
5945
+ const isWhite = (color)=>255 === color.r && 255 === color.g && 255 === color.b;
5946
+ const DanmakuType = {
5947
+ SCROLL: 1,
5948
+ BOTTOM: 2,
5949
+ TOP: 3
5950
+ };
5951
+ const FontSize = {
5952
+ SMALL: 0,
5953
+ NORMAL: 1,
5954
+ LARGE: 2
5955
+ };
5956
+ function decimalToRGB888(decimal) {
5957
+ const r = decimal >> 16 & 0xff;
5958
+ const g = decimal >> 8 & 0xff;
5959
+ const b = 0xff & decimal;
5960
+ return {
5961
+ r,
5962
+ g,
5963
+ b
5964
+ };
5965
+ }
5966
+ function UniPool2DanmakuLists(UP) {
5967
+ const dans = UP.dans;
5968
+ let type = DanmakuType.SCROLL;
5969
+ return dans.map((d)=>{
5970
+ if (d.mode === dm_gen_Modes.Bottom) type = DanmakuType.BOTTOM;
5971
+ else if (d.mode === dm_gen_Modes.Top) type = DanmakuType.TOP;
5972
+ return {
5973
+ time: d.progress,
5974
+ type,
5975
+ fontSizeType: d.fontsize,
5976
+ content: d.content,
5977
+ color: decimalToRGB888(d.color),
5978
+ extra: d
5979
+ };
5980
+ });
5981
+ }
5982
+ function DanmakuList2UniPool(d) {
5983
+ return new UniPool(d.map((d)=>UniDM.create(d.extra)));
5984
+ }
5985
+ const lang_assign = (source, ...targets)=>{
5986
+ for (const target of targets)for (const key of Object.keys(target))source[key] = target[key];
5987
+ return source;
5988
+ };
5989
+ const arrayOfLength = (length, defaultValue)=>{
5990
+ const array = new Array(length);
5991
+ for(let i = 0; i < length; i++)array[i] = defaultValue;
5992
+ return array;
5993
+ };
5994
+ const computeScrollInTime = (rectWidth, screenWidth, scrollTime)=>{
5995
+ const speed = (screenWidth + rectWidth) / scrollTime;
5996
+ return rectWidth / speed;
5997
+ };
5998
+ const computeScrollOverTime = (rectWidth, screenWidth, scrollTime)=>{
5999
+ const speed = (screenWidth + rectWidth) / scrollTime;
6000
+ return screenWidth / speed;
6001
+ };
6002
+ const splitGrids = ({ fontSize, padding, playResY, bottomSpace })=>{
6003
+ const defaultFontSize = fontSize[FontSize.NORMAL];
6004
+ const paddingTop = padding[0];
6005
+ const paddingBottom = padding[2];
6006
+ const linesCount = Math.floor((playResY - bottomSpace) / (defaultFontSize + paddingTop + paddingBottom));
6007
+ return {
6008
+ 1: arrayOfLength(linesCount, {
6009
+ start: 0,
6010
+ end: 0,
6011
+ width: 0
6012
+ }),
6013
+ 3: arrayOfLength(linesCount, 0),
6014
+ 2: arrayOfLength(linesCount, 0)
6015
+ };
6016
+ };
6017
+ const measureTextWidth = (()=>{
6018
+ const canvasContext = createCanvas(50, 50).getContext('2d');
6019
+ const supportTextMeasure = !!canvasContext.measureText("\u4E2D");
6020
+ if (supportTextMeasure) return (fontName, fontSize, bold, text)=>{
6021
+ canvasContext.font = `${bold ? 'bold' : 'normal'} ${fontSize}px ${fontName}`;
6022
+ const textWidth = canvasContext.measureText(text).width;
6023
+ return Math.round(textWidth);
6024
+ };
6025
+ console.warn('[Warn] node-canvas is installed without text measure support, layout may not be correct');
6026
+ return (_fontName, fontSize, _bold, text)=>text.length * fontSize;
6027
+ })();
5390
6028
  const resolveAvailableFixGrid = (grids, time)=>{
5391
6029
  for (const [i, grid] of grids.entries())if (grid <= time) return i;
5392
6030
  return -1;
@@ -5470,7 +6108,7 @@ const formatTime = (seconds)=>{
5470
6108
  const minorSecond = Math.floor((seconds - integer) * 100);
5471
6109
  return `${hour}:${pad(minute)}:${pad(second)}.${minorSecond}`;
5472
6110
  };
5473
- const encode = (text)=>text.toString().replaceAll('{', '{').replaceAll('}', '}').replaceAll(/\r|\n/g, '');
6111
+ const encode = (text)=>text.toString().replaceAll('{', "\uFF5B").replaceAll('}', "\uFF5D").replaceAll(/\r|\n/g, '');
5474
6112
  const scrollCommand = ({ start, end, top })=>`\\move(${start},${top},${end},${top})`;
5475
6113
  const fixCommand = ({ top, left })=>`\\an8\\pos(${left},${top})`;
5476
6114
  const colorCommand = (color)=>`\\c${formatColor(color)}`;
@@ -5555,7 +6193,7 @@ const info = ({ playResX, playResY }, { filename, title })=>{
5555
6193
  const content = [
5556
6194
  '[Script Info]',
5557
6195
  `Title: ${title}`,
5558
- `Original Script: 根据 ${filename} 的弹幕信息,由 ${package_namespaceObject.e8} 生成`,
6196
+ `Original Script: \u{6839}\u{636E} ${filename} \u{7684}\u{5F39}\u{5E55}\u{4FE1}\u{606F}\u{FF0C}\u{7531} ${package_namespaceObject.e8} \u{751F}\u{6210}`,
5559
6197
  'ScriptType: v4.00+',
5560
6198
  'Collisions: Reverse',
5561
6199
  `PlayResX: ${playResX}`,
@@ -5576,16 +6214,16 @@ function fromUint16Array(array) {
5576
6214
  for (const element of array)result += String.fromCharCode(element);
5577
6215
  return result;
5578
6216
  }
5579
- const ass_raw = (list, config, context, compressType = 'brotli', baseType = 'base18384')=>{
5580
- const raw = {
6217
+ function raw_raw(list, config, context, compressType = 'brotli', baseType = 'base18384') {
6218
+ const raw1 = {
5581
6219
  list,
5582
6220
  config,
5583
6221
  context
5584
- }, rawText = JSON.stringify(raw);
6222
+ }, rawText = JSON.stringify(raw1);
5585
6223
  let compress = Buffer.from('');
5586
- compress = 'brotli' === compressType ? (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.brotliCompressSync)(rawText) : (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.gzipSync)(rawText);
5587
- return `;RawCompressType: ${compressType}\n;RawBaseType: ${baseType}\n;Raw: ${'base64' === baseType ? compress.toString('base64') : fromUint16Array(__WEBPACK_EXTERNAL_MODULE_base16384__.encode(compress))}`;
5588
- };
6224
+ compress = 'brotli' === compressType ? brotliCompressSync(rawText) : gzipSync(rawText);
6225
+ return `;RawCompressType: ${compressType}\n;RawBaseType: ${baseType}\n;Raw: ${'base64' === baseType ? compress.toString('base64') : fromUint16Array(external_base16384_encode(compress))}`;
6226
+ }
5589
6227
  function deRaw(ass) {
5590
6228
  const arr = ass.split('\n'), lineCompressType = arr.find((line)=>line.startsWith(';RawCompressType:')), lineBaseType = arr.find((line)=>line.startsWith(';RawBaseType:')), lineRaw = arr.find((line)=>line.startsWith(';Raw:'));
5591
6229
  if (!lineCompressType || !lineBaseType || !lineRaw) return;
@@ -5593,9 +6231,9 @@ function deRaw(ass) {
5593
6231
  let compressType = lineCompressType.replace(';RawCompressType: ', '').trim(), baseType = lineBaseType.replace(';RawBaseType: ', '').trim();
5594
6232
  if (!compressTypes.includes(compressType)) compressType = 'gzip';
5595
6233
  if (!baseTypes.includes(baseType)) baseType = 'base64';
5596
- const text = lineRaw.replace(';Raw: ', '').trim(), buffer = 'base64' === baseType ? Buffer.from(text, 'base64') : Buffer.from(__WEBPACK_EXTERNAL_MODULE_base16384__.decode(Buffer.from(text, 'utf-8').toString('utf-8')));
6234
+ const text = lineRaw.replace(';Raw: ', '').trim(), buffer = 'base64' === baseType ? Buffer.from(text, 'base64') : Buffer.from(decode(Buffer.from(text, 'utf-8').toString('utf-8')));
5597
6235
  let decompress = Buffer.from('');
5598
- decompress = 'brotli' === compressType ? (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.brotliDecompressSync)(buffer) : (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.gzipSync)(buffer);
6236
+ decompress = 'brotli' === compressType ? brotliDecompressSync(buffer) : gunzipSync(buffer);
5599
6237
  try {
5600
6238
  return JSON.parse(decompress.toString('utf-8'));
5601
6239
  } catch {
@@ -5647,14 +6285,14 @@ const style = ({ fontName, fontSize, color: configColor, outlineColor, backColor
5647
6285
  const ass_create = (list, rawList, config, context = {
5648
6286
  filename: 'unknown',
5649
6287
  title: 'unknown'
5650
- })=>{
6288
+ }, rawConfig)=>{
5651
6289
  const Elist = UniPool2DanmakuLists(list), ErawList = UniPool2DanmakuLists(rawList);
5652
6290
  const content = [
5653
6291
  info(config, context),
5654
6292
  style(config),
5655
6293
  ass_event(Elist, config)
5656
6294
  ];
5657
- if (config.includeRaw) content.push(ass_raw(ErawList, config, context));
6295
+ if (config.includeRaw) content.push(raw_raw(ErawList, config, context, rawConfig?.compressType, rawConfig?.baseType));
5658
6296
  return `${content.join('\n\n')}\n`;
5659
6297
  };
5660
6298
  const ass_gen_config = (overrides = {})=>{
@@ -5699,7 +6337,7 @@ function generateASS(danmaku, options) {
5699
6337
  const content = ass_create(layoutList, danmaku, config, {
5700
6338
  filename: options?.filename || 'unknown',
5701
6339
  title: options?.title || 'unknown'
5702
- });
6340
+ }, options.raw);
5703
6341
  return content;
5704
6342
  }
5705
6343
  function parseAssRawField(ass) {
@@ -5707,42 +6345,167 @@ function parseAssRawField(ass) {
5707
6345
  if (!raw) return UniPool.create();
5708
6346
  return DanmakuList2UniPool(raw.list);
5709
6347
  }
5710
- const file_bili_dm = /*@__PURE__*/ fileDesc("Cg1iaWxpL2RtLnByb3RvEiBiaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MSJkCgZBdmF0YXISCgoCaWQYASABKAkSCwoDdXJsGAIgASgJEkEKC2F2YXRhcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyVHlwZSIjCgZCdWJibGUSDAoEdGV4dBgBIAEoCRILCgN1cmwYAiABKAkixgEKCEJ1YmJsZVYyEgwKBHRleHQYASABKAkSCwoDdXJsGAIgASgJEkEKC2J1YmJsZV90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlVHlwZRIVCg1leHBvc3VyZV9vbmNlGAQgASgIEkUKDWV4cG9zdXJlX3R5cGUYBSABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiWwoGQnV0dG9uEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUiWAoOQnV6endvcmRDb25maWcSRgoIa2V5d29yZHMYASADKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXp6d29yZFNob3dDb25maWcieAoSQnV6endvcmRTaG93Q29uZmlnEgwKBG5hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEg4KBnNvdXJjZRgDIAEoBRIKCgJpZBgEIAEoAxITCgtidXp6d29yZF9pZBgFIAEoAxITCgtzY2hlbWFfdHlwZRgGIAEoBSJ7CghDaGVja0JveBIMCgR0ZXh0GAEgASgJEjwKBHR5cGUYAiABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja2JveFR5cGUSFQoNZGVmYXVsdF92YWx1ZRgDIAEoCBIMCgRzaG93GAQgASgIIm8KCkNoZWNrQm94VjISDAoEdGV4dBgBIAEoCRI8CgR0eXBlGAIgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tib3hUeXBlEhUKDWRlZmF1bHRfdmFsdWUYAyABKAgiggIKC0NsaWNrQnV0dG9uEhUKDXBvcnRyYWl0X3RleHQYASADKAkSFgoObGFuZHNjYXBlX3RleHQYAiADKAkSGwoTcG9ydHJhaXRfdGV4dF9mb2N1cxgDIAMoCRIcChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIAMoCRJBCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSDAoEc2hvdxgGIAEoCBI4CgZidWJibGUYByABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdWJibGUiswIKDUNsaWNrQnV0dG9uVjISFQoNcG9ydHJhaXRfdGV4dBgBIAMoCRIWCg5sYW5kc2NhcGVfdGV4dBgCIAMoCRIbChNwb3J0cmFpdF90ZXh0X2ZvY3VzGAMgAygJEhwKFGxhbmRzY2FwZV90ZXh0X2ZvY3VzGAQgAygJEkEKC3JlbmRlcl90eXBlGAUgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIXCg90ZXh0X2lucHV0X3Bvc3QYBiABKAgSFQoNZXhwb3N1cmVfb25jZRgHIAEoCBJFCg1leHBvc3VyZV90eXBlGAggASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIksKB0NvbW1hbmQSQAoLY29tbWFuZF9kbXMYASADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG0i5gEKCUNvbW1hbmREbRIKCgJpZBgBIAEoAxILCgNvaWQYAiABKAMSCwoDbWlkGAMgASgDEg8KB2NvbW1hbmQYBCABKAkSDwoHY29udGVudBgFIAEoCRIQCghwcm9ncmVzcxgGIAEoBRINCgVjdGltZRgHIAEoCRINCgVtdGltZRgIIAEoCRINCgVleHRyYRgJIAEoCRINCgVpZFN0chgKIAEoCRIMCgR0eXBlGAsgASgFEhMKC2F1dG9fY3JlYXRlGAwgASgIEhIKCmNvdW50X2Rvd24YDSABKAUSDAoEYXR0chgOIAEoBSJQCg1EYW5tYWt1QUlGbGFnEj8KCGRtX2ZsYWdzGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWciiwMKC0Rhbm1ha3VFbGVtEgoKAmlkGAEgASgDEhAKCHByb2dyZXNzGAIgASgFEgwKBG1vZGUYAyABKAUSEAoIZm9udHNpemUYBCABKAUSPwoFY29sb3IYBSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIQCghtaWRfaGFzaBgGIAEoCRIPCgdjb250ZW50GAcgASgJEg0KBWN0aW1lGAggASgDEg4KBndlaWdodBgJIAEoBRIOCgZhY3Rpb24YCiABKAkSDAoEcG9vbBgLIAEoBRIOCgZpZF9zdHIYDCABKAkSDAoEYXR0chgNIAEoBRIRCglhbmltYXRpb24YFiABKAkSDQoFZXh0cmEYFyABKAkSQgoIY29sb3JmdWwYGCABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIMCgR0eXBlGBkgASgFEgsKA29pZBgaIAEoAyIpCgtEYW5tYWt1RmxhZxIMCgRkbWlkGAEgASgDEgwKBGZsYWcYAiABKAUiSwoRRGFubWFrdUZsYWdDb25maWcSEAoIcmVjX2ZsYWcYASABKAUSEAoIcmVjX3RleHQYAiABKAkSEgoKcmVjX3N3aXRjaBgDIAEoBSKLBwoYRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnEikKIXBsYXllcl9kYW5tYWt1X3VzZV9kZWZhdWx0X2NvbmZpZxgBIAEoCBIsCiRwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9zd2l0Y2gYBCABKAgSKwojcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWwYBSABKAUSHwoXcGxheWVyX2Rhbm1ha3VfYmxvY2t0b3AYBiABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tzY3JvbGwYByABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tib3R0b20YCCABKAgSJAoccGxheWVyX2Rhbm1ha3VfYmxvY2tjb2xvcmZ1bBgJIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja3JlcGVhdBgKIAEoCBIjChtwbGF5ZXJfZGFubWFrdV9ibG9ja3NwZWNpYWwYCyABKAgSHgoWcGxheWVyX2Rhbm1ha3Vfb3BhY2l0eRgMIAEoAhIkChxwbGF5ZXJfZGFubWFrdV9zY2FsaW5nZmFjdG9yGA0gASgCEh0KFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAhIcChRwbGF5ZXJfZGFubWFrdV9zcGVlZBgPIAEoBRIkChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBAgASgIEikKIXBsYXllcl9kYW5tYWt1X3Nlbmlvcl9tb2RlX3N3aXRjaBgRIAEoBRIuCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgSIAEoBRKYAQoqcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjJfbWFwGBMgAygLMmQuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EiUKHXBsYXllcl9kYW5tYWt1X2VuYWJsZV9oZXJkX2RtGBQgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi7AkKEURhbm11UGxheWVyQ29uZmlnEh0KFXBsYXllcl9kYW5tYWt1X3N3aXRjaBgBIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9zd2l0Y2hfc2F2ZRgCIAEoCBIpCiFwbGF5ZXJfZGFubWFrdV91c2VfZGVmYXVsdF9jb25maWcYAyABKAgSLAokcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIEisKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUgASgFEh8KF3BsYXllcl9kYW5tYWt1X2Jsb2NrdG9wGAYgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2Nrc2Nyb2xsGAcgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrYm90dG9tGAggASgIEiQKHHBsYXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tyZXBlYXQYCiABKAgSIwobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIEh4KFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAISJAoccGxheWVyX2Rhbm1ha3Vfc2NhbGluZ2ZhY3RvchgNIAEoAhIdChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAISHAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAUSJgoecGxheWVyX2Rhbm1ha3VfZW5hYmxlYmxvY2tsaXN0GBAgASgIEiQKHGlubGluZV9wbGF5ZXJfZGFubWFrdV9zd2l0Y2gYESABKAgSJAocaW5saW5lX3BsYXllcl9kYW5tYWt1X2NvbmZpZxgSIAEoBRImCh5wbGF5ZXJfZGFubWFrdV9pb3Nfc3dpdGNoX3NhdmUYEyABKAUSKQohcGxheWVyX2Rhbm1ha3Vfc2VuaW9yX21vZGVfc3dpdGNoGBQgASgFEi4KJnBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBUgASgFEpEBCipwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92Ml9tYXAYFiADKAsyXS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckNvbmZpZy5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIlCh1wbGF5ZXJfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgXIAEoCBImCh5wbGF5ZXJfZGFubWFrdV9ibG9ja3RvcF9ib3R0b20YGCABKAgSIAoYcGxheWVyX2Rhbm1ha3VfZG9tYWluX3YyGBkgASgFEh4KFnBsYXllcl9kYW5tYWt1X2RlbnNpdHkYGiABKAUSJQodcGxheWVyX2Rhbm1ha3Vfc3VidGl0bGVfcHJvb2YYGyABKAgSIwobcGxheWVyX2Rhbm1ha3VfcGVvcGxlX3Byb29mGBwgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEiMAoWRGFubXVQbGF5ZXJDb25maWdQYW5lbBIWCg5zZWxlY3Rpb25fdGV4dBgBIAEoCSJLChhEYW5tdVBsYXllckR5bmFtaWNDb25maWcSEAoIcHJvZ3Jlc3MYASABKAUSHQoVcGxheWVyX2Rhbm1ha3VfZG9tYWluGA4gASgCIpADChVEYW5tdVBsYXllclZpZXdDb25maWcSYQodZGFubXVrdV9kZWZhdWx0X3BsYXllcl9jb25maWcYASABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdURlZmF1bHRQbGF5ZXJDb25maWcSUgoVZGFubXVrdV9wbGF5ZXJfY29uZmlnGAIgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWcSYQodZGFubXVrdV9wbGF5ZXJfZHluYW1pY19jb25maWcYAyADKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckR5bmFtaWNDb25maWcSXQobZGFubXVrdV9wbGF5ZXJfY29uZmlnX3BhbmVsGAQgASgLMjguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWdQYW5lbCKZBQoURGFubXVXZWJQbGF5ZXJDb25maWcSEQoJZG1fc3dpdGNoGAEgASgIEhEKCWFpX3N3aXRjaBgCIAEoCBIQCghhaV9sZXZlbBgDIAEoBRIQCghibG9ja3RvcBgEIAEoCBITCgtibG9ja3Njcm9sbBgFIAEoCBITCgtibG9ja2JvdHRvbRgGIAEoCBISCgpibG9ja2NvbG9yGAcgASgIEhQKDGJsb2Nrc3BlY2lhbBgIIAEoCBIUCgxwcmV2ZW50c2hhZGUYCSABKAgSDQoFZG1hc2sYCiABKAgSDwoHb3BhY2l0eRgLIAEoAhIOCgZkbWFyZWEYDCABKAUSEQoJc3BlZWRwbHVzGA0gASgCEhAKCGZvbnRzaXplGA4gASgCEhIKCnNjcmVlbnN5bmMYDyABKAgSEQoJc3BlZWRzeW5jGBAgASgIEhIKCmZvbnRmYW1pbHkYESABKAkSDAoEYm9sZBgSIAEoCBISCgpmb250Ym9yZGVyGBMgASgFEhEKCWRyYXdfdHlwZRgUIAEoCRIaChJzZW5pb3JfbW9kZV9zd2l0Y2gYFSABKAUSEwoLYWlfbGV2ZWxfdjIYFiABKAUSYQoPYWlfbGV2ZWxfdjJfbWFwGBcgAygLMkguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcuQWlMZXZlbFYyTWFwRW50cnkSFwoPYmxvY2t0b3BfYm90dG9tGBggASgIEhIKCmRtX2FyZWFfdjIYGSABKAUSEgoKZG1fZGVuc2l0eRgaIAEoBRozChFBaUxldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIlkKCkRtQ29sb3JmdWwSPgoEdHlwZRgBIAEoDjIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWxUeXBlEgsKA3NyYxgCIAEoCSJQCg9EbUV4cG9SZXBvcnRSZXESEgoKc2Vzc2lvbl9pZBgBIAEoCRILCgNvaWQYAiABKAMSDQoFZG1pZHMYAyABKAwSDQoFc3BtaWQYBCABKAkiEQoPRG1FeHBvUmVwb3J0UmVzIm0KCkRtSGVyZFZpZXcSGwoTZGlzcGxheV9oZXJkX2RtX251bRgBIAEoBRJCCghoZXJkX2RtcxgCIAMoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlZpZXdIZXJkRG1FbGVtIpYCCgpEbU1hc2tXYWxsEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAxIPCgdjb250ZW50GAMgASgJEk0KDGNvbnRlbnRfdHlwZRgEIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRJFCghiaXpfdHlwZRgFIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxCaXpUeXBlEkUKCGNvbnRlbnRzGAYgAygLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbENvbnRlbnQiawoRRG1NYXNrV2FsbENvbnRlbnQSRQoEdHlwZRgBIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRIPCgdjb250ZW50GAIgASgJIs0QChFEbVBsYXllckNvbmZpZ1JlcRIKCgJ0cxgBIAEoAxJFCgZzd2l0Y2gYAiABKAsyNS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3dpdGNoEk4KC3N3aXRjaF9zYXZlGAMgASgLMjkuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaFNhdmUSWwoSdXNlX2RlZmF1bHRfY29uZmlnGAQgASgLMj8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVVzZURlZmF1bHRDb25maWcSYQoVYWlfcmVjb21tZW5kZWRfc3dpdGNoGAUgASgLMkIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2gSXwoUYWlfcmVjb21tZW5kZWRfbGV2ZWwYBiABKAsyQS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEkkKCGJsb2NrdG9wGAcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wEk8KC2Jsb2Nrc2Nyb2xsGAggASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc2Nyb2xsEk8KC2Jsb2NrYm90dG9tGAkgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrYm90dG9tElMKDWJsb2NrY29sb3JmdWwYCiABKAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tjb2xvcmZ1bBJPCgtibG9ja3JlcGVhdBgLIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3JlcGVhdBJRCgxibG9ja3NwZWNpYWwYDCABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEkcKB29wYWNpdHkYDSABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1T3BhY2l0eRJTCg1zY2FsaW5nZmFjdG9yGA4gASgLMjwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVNjYWxpbmdmYWN0b3ISRQoGZG9tYWluGA8gASgLMjUuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpbhJDCgVzcGVlZBgQIAEoCzI0LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTcGVlZBJXCg9lbmFibGVibG9ja2xpc3QYESABKAsyPi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0El4KGWlubGluZVBsYXllckRhbm1ha3VTd2l0Y2gYEiABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5JbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoElsKEnNlbmlvcl9tb2RlX3N3aXRjaBgTIAEoCzI/LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTZW5pb3JNb2RlU3dpdGNoEmQKF2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBQgASgLMkMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyElMKDmVuYWJsZV9oZXJkX2RtGBUgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRJWCg9ibG9ja3RvcF9ib3R0b20YFiABKAsyPS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SSgoJZG9tYWluX3YyGBcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpblYyEkcKB2RlbnNpdHkYGCABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RGVuc2l0eRJUCg5zdWJ0aXRsZV9wcm9vZhgZIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mElAKDHBlb3BsZV9wcm9vZhgaIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VQZW9wbGVQcm9vZiIvCgtEbVNlZ0NvbmZpZxIRCglwYWdlX3NpemUYASABKAMSDQoFdG90YWwYAiABKAMikQIKEERtU2VnTW9iaWxlUmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBRJACgdhaV9mbGFnGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUFJRmxhZxIVCg1zZWdtZW50X3J1bGVzGAQgAygDEkIKDGNvbG9yZnVsX3NyYxgFIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWwSEwoLY29udGV4dF9zcmMYBiABKAkiygEKDkRtU2VnTW9iaWxlUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDEhYKDnRlZW5hZ2Vyc19tb2RlGAUgASgFEgoKAnBzGAYgASgDEgoKAnBlGAcgASgDEhEKCXB1bGxfbW9kZRgIIAEoBRISCgpmcm9tX3NjZW5lGAkgASgFEg0KBXNwbWlkGAogASgJEhMKC2NvbnRleHRfZXh0GAsgASgJIlwKDURtU2VnT3R0UmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBSJMCgtEbVNlZ090dFJlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAyJdCg1EbVNlZ1NES1JlcGx5Eg4KBmNsb3NlZBgBIAEoCBI8CgVlbGVtcxgCIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VFbGVtIkwKC0RtU2VnU0RLUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDIncKCURtU3ViVmlldxIMCgR0eXBlGAEgASgFEgsKA29pZBgCIAEoAxILCgNwaWQYAyABKAMSQgoLcG9zdF9wYW5lbDIYBCADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxWMiKhCQoLRG1WaWV3UmVwbHkSDgoGY2xvc2VkGAEgASgIEjkKBG1hc2sYAiABKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb01hc2sSQQoIc3VidGl0bGUYAyABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb1N1YnRpdGxlEhMKC3NwZWNpYWxfZG1zGAQgAygJEkQKB2FpX2ZsYWcYBSABKAsyMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RmxhZ0NvbmZpZxJOCg1wbGF5ZXJfY29uZmlnGAYgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJWaWV3Q29uZmlnEhYKDnNlbmRfYm94X3N0eWxlGAcgASgFEg0KBWFsbG93GAggASgIEhEKCWNoZWNrX2JveBgJIAEoCBIaChJjaGVja19ib3hfc2hvd19tc2cYCiABKAkSGAoQdGV4dF9wbGFjZWhvbGRlchgLIAEoCRIZChFpbnB1dF9wbGFjZWhvbGRlchgMIAEoCRIdChVyZXBvcnRfZmlsdGVyX2NvbnRlbnQYDSADKAkSQQoLZXhwb19yZXBvcnQYDiABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvUmVwb3J0EkkKD2J1enp3b3JkX2NvbmZpZxgPIAEoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1enp3b3JkQ29uZmlnEkIKC2V4cHJlc3Npb25zGBAgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgRIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGBIgAygJEkIKC3Bvc3RfcGFuZWwyGBMgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISQgoMZG1fbWFza193YWxsGBQgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbBI9CgdkbV9oZXJkGBUgASgLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1IZXJkVmlldxI6Cgdjb21tYW5kGBYgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ29tbWFuZBIKCgJrdhgXIAEoCRI+CglzdWJfdmlld3MYGCADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVN1YlZpZXcSNgoDcW9lGBkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUW9lSW5mbyJtCglEbVZpZXdSZXESCwoDcGlkGAEgASgDEgsKA29pZBgCIAEoAxIMCgR0eXBlGAMgASgFEg0KBXNwbWlkGAQgASgJEhQKDGlzX2hhcmRfYm9vdBgFIAEoBRITCgtjb250ZXh0X2V4dBgGIAEoCSKBBgoORG1XZWJWaWV3UmVwbHkSDQoFc3RhdGUYASABKAUSDAoEdGV4dBgCIAEoCRIRCgl0ZXh0X3NpZGUYAyABKAkSPQoGZG1fc2dlGAQgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdDb25maWcSQQoEZmxhZxgFIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnQ29uZmlnEhMKC3NwZWNpYWxfZG1zGAYgAygJEhEKCWNoZWNrX2JveBgHIAEoCBINCgVjb3VudBgIIAEoAxJACgtjb21tYW5kX2RtcxgJIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmREbRJNCg1wbGF5ZXJfY29uZmlnGAogASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcSHQoVcmVwb3J0X2ZpbHRlcl9jb250ZW50GAsgAygJEkIKC2V4cHJlc3Npb25zGAwgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgNIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGA4gAygJEkIKC3Bvc3RfcGFuZWwyGA8gAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISPgoJc3ViX3ZpZXdzGBAgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TdWJWaWV3EjYKA3FvZRgRIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm8iKgoKRXhwb1JlcG9ydBIcChRzaG91bGRfcmVwb3J0X2F0X2VuZBgBIAEoCCJkCgpFeHByZXNzaW9uEg8KB2tleXdvcmQYASADKAkSCwoDdXJsGAIgASgJEjgKBnBlcmlvZBgDIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBlcmlvZCJJCgtFeHByZXNzaW9ucxI6CgRkYXRhGAEgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbiIqChlJbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoEg0KBXZhbHVlGAEgASgIIicKBUxhYmVsEg0KBXRpdGxlGAEgASgJEg8KB2NvbnRlbnQYAiADKAkihwEKB0xhYmVsVjISDQoFdGl0bGUYASABKAkSDwoHY29udGVudBgCIAMoCRIVCg1leHBvc3VyZV9vbmNlGAMgASgIEkUKDWV4cG9zdXJlX3R5cGUYBCABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiJAoGUGVyaW9kEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAyIwCh9QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEg0KBXZhbHVlGAEgASgFIjIKIVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMhINCgV2YWx1ZRgBIAEoBSIxCiBQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZFN3aXRjaBINCgV2YWx1ZRgBIAEoCCIpChhQbGF5ZXJEYW5tYWt1QmxvY2tib3R0b20SDQoFdmFsdWUYASABKAgiKwoaUGxheWVyRGFubWFrdUJsb2NrY29sb3JmdWwSDQoFdmFsdWUYASABKAgiKQoYUGxheWVyRGFubWFrdUJsb2NrcmVwZWF0Eg0KBXZhbHVlGAEgASgIIikKGFBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBINCgV2YWx1ZRgBIAEoCCIqChlQbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEg0KBXZhbHVlGAEgASgIIiYKFVBsYXllckRhbm1ha3VCbG9ja3RvcBINCgV2YWx1ZRgBIAEoCCIsChtQbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SDQoFdmFsdWUYASABKAgiJQoUUGxheWVyRGFubWFrdURlbnNpdHkSDQoFdmFsdWUYASABKAUiJAoTUGxheWVyRGFubWFrdURvbWFpbhINCgV2YWx1ZRgBIAEoAiImChVQbGF5ZXJEYW5tYWt1RG9tYWluVjISDQoFdmFsdWUYASABKAUiKgoZUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRINCgV2YWx1ZRgBIAEoCCItChxQbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0Eg0KBXZhbHVlGAEgASgIIiUKFFBsYXllckRhbm1ha3VPcGFjaXR5Eg0KBXZhbHVlGAEgASgCIikKGFBsYXllckRhbm1ha3VQZW9wbGVQcm9vZhINCgV2YWx1ZRgBIAEoCCIrChpQbGF5ZXJEYW5tYWt1U2NhbGluZ2ZhY3RvchINCgV2YWx1ZRgBIAEoAiIuCh1QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBINCgV2YWx1ZRgBIAEoBSIjChJQbGF5ZXJEYW5tYWt1U3BlZWQSDQoFdmFsdWUYASABKAUiKwoaUGxheWVyRGFubWFrdVN1YnRpdGxlUHJvb2YSDQoFdmFsdWUYASABKAgiOAoTUGxheWVyRGFubWFrdVN3aXRjaBINCgV2YWx1ZRgBIAEoCBISCgpjYW5faWdub3JlGAIgASgIIigKF1BsYXllckRhbm1ha3VTd2l0Y2hTYXZlEg0KBXZhbHVlGAEgASgIIi4KHVBsYXllckRhbm1ha3VVc2VEZWZhdWx0Q29uZmlnEg0KBXZhbHVlGAEgASgIIowDCglQb3N0UGFuZWwSDQoFc3RhcnQYASABKAMSCwoDZW5kGAIgASgDEhAKCHByaW9yaXR5GAMgASgDEg4KBmJpel9pZBgEIAEoAxJECghiaXpfdHlwZRgFIAEoDjIyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbEJpelR5cGUSQwoMY2xpY2tfYnV0dG9uGAYgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2xpY2tCdXR0b24SPwoKdGV4dF9pbnB1dBgHIAEoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dBI9CgljaGVja19ib3gYCCABKAsyKi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja0JveBI2CgV0b2FzdBgJIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0Iq0ECgtQb3N0UGFuZWxWMhINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMSRAoIYml6X3R5cGUYAyABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxCaXpUeXBlEkUKDGNsaWNrX2J1dHRvbhgEIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uVjISQQoKdGV4dF9pbnB1dBgFIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dFYyEj8KCWNoZWNrX2JveBgGIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrQm94VjISOAoFdG9hc3QYByABKAsyKS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdFYyEjoKBmJ1YmJsZRgIIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1YmJsZVYyEjgKBWxhYmVsGAkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuTGFiZWxWMhJBCgtwb3N0X3N0YXR1cxgKIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RTdGF0dXMiFwoHUW9lSW5mbxIMCgRpbmZvGAEgASgJIikKCFJlc3BvbnNlEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSL5AgoMU3VidGl0bGVJdGVtEgoKAmlkGAEgASgDEg4KBmlkX3N0chgCIAEoCRILCgNsYW4YAyABKAkSDwoHbGFuX2RvYxgEIAEoCRIUCgxzdWJ0aXRsZV91cmwYBSABKAkSOgoGYXV0aG9yGAYgASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVXNlckluZm8SPAoEdHlwZRgHIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlVHlwZRIVCg1sYW5fZG9jX2JyaWVmGAggASgJEkEKB2FpX3R5cGUYCSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpVHlwZRJFCglhaV9zdGF0dXMYCiABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpU3RhdHVzIugCCglUZXh0SW5wdXQSHAoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAkSHQoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJEkEKC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIYChBwbGFjZWhvbGRlcl9wb3N0GAQgASgIEgwKBHNob3cYBSABKAgSOAoGYXZhdGFyGAYgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEkEKC3Bvc3Rfc3RhdHVzGAcgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFN0YXR1cxI2CgVsYWJlbBgIIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxhYmVsIvsBCgtUZXh0SW5wdXRWMhIcChRwb3J0cmFpdF9wbGFjZWhvbGRlchgBIAMoCRIdChVsYW5kc2NhcGVfcGxhY2Vob2xkZXIYAiADKAkSQQoLcmVuZGVyX3R5cGUYAyABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5SZW5kZXJUeXBlEhgKEHBsYWNlaG9sZGVyX3Bvc3QYBCABKAgSOAoGYXZhdGFyGAUgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEhgKEHRleHRfaW5wdXRfbGltaXQYBiABKAUibwoFVG9hc3QSDAoEdGV4dBgBIAEoCRIQCghkdXJhdGlvbhgCIAEoBRIMCgRzaG93GAMgASgIEjgKBmJ1dHRvbhgEIAEoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1dHRvbiJiCg1Ub2FzdEJ1dHRvblYyEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUicwoHVG9hc3RWMhIMCgR0ZXh0GAEgASgJEhAKCGR1cmF0aW9uGAIgASgFEkgKD3RvYXN0X2J1dHRvbl92MhgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0QnV0dG9uVjIiXAoIVXNlckluZm8SCwoDbWlkGAEgASgDEgwKBG5hbWUYAiABKAkSCwoDc2V4GAMgASgJEgwKBGZhY2UYBCABKAkSDAoEc2lnbhgFIAEoCRIMCgRyYW5rGAYgASgFIlMKCVZpZGVvTWFzaxILCgNjaWQYASABKAMSDAoEcGxhdBgCIAEoBRILCgNmcHMYAyABKAUSDAoEdGltZRgEIAEoAxIQCghtYXNrX3VybBgFIAEoCSJwCg1WaWRlb1N1YnRpdGxlEgsKA2xhbhgBIAEoCRIPCgdsYW5fZG9jGAIgASgJEkEKCXN1YnRpdGxlcxgDIAMoCzIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlSXRlbSKSAQoOVmlld0hlcmREbUVsZW0SEAoIaGVyZF9tc2cYASABKAkSFgoOaGVyZF9zdGFydF9jbnQYAiABKAUSFAoMaGVyZF9lbmRfY250GAMgASgFEhIKCnJlZ2V4X3J1bGUYBCABKAkSFgoOc3RhcnRfcHJvZ3Jlc3MYBSABKAUSFAoMZW5kX3Byb2dyZXNzGAYgASgFKjMKCkF2YXRhclR5cGUSEgoOQXZhdGFyVHlwZU5vbmUQABIRCg1BdmF0YXJUeXBlTkZUEAEqWQoKQnViYmxlVHlwZRISCg5CdWJibGVUeXBlTm9uZRAAEhkKFUJ1YmJsZVR5cGVDbGlja0J1dHRvbhABEhwKGEJ1YmJsZVR5cGVEbVNldHRpbmdQYW5lbBACKlgKDENoZWNrYm94VHlwZRIUChBDaGVja2JveFR5cGVOb25lEAASGQoVQ2hlY2tib3hUeXBlRW5jb3VyYWdlEAESFwoTQ2hlY2tib3hUeXBlQ29sb3JETRACKjUKDkRtQ29sb3JmdWxUeXBlEgwKCE5vbmVUeXBlEAASFQoPVmlwR3JhZHVhbENvbG9yEOHUAypgChFEbU1hc2tXYWxsQml6VHlwZRILCgdVbmtub3duEAASBwoDT0dWEAESCgoGQml6UGljEAISCAoETXV0ZRADEgoKBlJlY29yZBAEEgkKBUNsb3VkEAUSCAoEQUlHQxAGKnYKFURtTWFza1dhbGxDb250ZW50VHlwZRIgChxEbU1hc2tXYWxsQ29udGVudFR5cGVVbmtub3duEAASHQoZRG1NYXNrV2FsbENvbnRlbnRUeXBlVGV4dBABEhwKGERtTWFza1dhbGxDb250ZW50VHlwZVBpYxACKjwKDEV4cG9zdXJlVHlwZRIUChBFeHBvc3VyZVR5cGVOb25lEAASFgoSRXhwb3N1cmVUeXBlRE1TZW5kEAEqgwIKEFBvc3RQYW5lbEJpelR5cGUSGAoUUG9zdFBhbmVsQml6VHlwZU5vbmUQABIdChlQb3N0UGFuZWxCaXpUeXBlRW5jb3VyYWdlEAESGwoXUG9zdFBhbmVsQml6VHlwZUNvbG9yRE0QAhIZChVQb3N0UGFuZWxCaXpUeXBlTkZURE0QAxIdChlQb3N0UGFuZWxCaXpUeXBlRnJhZ0Nsb3NlEAQSHQoZUG9zdFBhbmVsQml6VHlwZVJlY29tbWVuZBAFEhwKGFBvc3RQYW5lbEJpelR5cGVQbG90TGVhaxAGEiIKHlBvc3RQYW5lbEJpelR5cGVBbnRpSGFyYXNzbWVudBAHKjgKClBvc3RTdGF0dXMSFAoQUG9zdFN0YXR1c05vcm1hbBAAEhQKEFBvc3RTdGF0dXNDbG9zZWQQASpOCgpSZW5kZXJUeXBlEhIKDlJlbmRlclR5cGVOb25lEAASFAoQUmVuZGVyVHlwZVNpbmdsZRABEhYKElJlbmRlclR5cGVSb3RhdGlvbhACKjYKEFN1YnRpdGxlQWlTdGF0dXMSCAoETm9uZRAAEgwKCEV4cG9zdXJlEAESCgoGQXNzaXN0EAIqKwoOU3VidGl0bGVBaVR5cGUSCgoGTm9ybWFsEAASDQoJVHJhbnNsYXRlEAEqHgoMU3VidGl0bGVUeXBlEgYKAkNDEAASBgoCQUkQASpOChFUb2FzdEZ1bmN0aW9uVHlwZRIZChVUb2FzdEZ1bmN0aW9uVHlwZU5vbmUQABIeChpUb2FzdEZ1bmN0aW9uVHlwZVBvc3RQYW5lbBABMqAFCgJETRJzCgtEbVNlZ01vYmlsZRIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnTW9iaWxlUmVxGjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdNb2JpbGVSZXBseRJkCgZEbVZpZXcSKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXEaLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXBseRJxCg5EbVBsYXllckNvbmZpZxIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtUGxheWVyQ29uZmlnUmVxGiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVzcG9uc2USagoIRG1TZWdPdHQSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ090dFJlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnT3R0UmVwbHkSagoIRG1TZWdTREsSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ1NES1JlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnU0RLUmVwbHkSdAoMRG1FeHBvUmVwb3J0EjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVxGjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVzYgZwcm90bzM");
5711
- const DmSegMobileReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 30);
5712
- const DmWebViewReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 39);
5713
- const file_danuni = /*@__PURE__*/ fileDesc("CgxkYW51bmkucHJvdG8SEWRhbnVuaS5kYW5tYWt1LnYxIt4CCgdEYW5tYWt1EgwKBEZDSUQYASABKAkSDAoERE1JRBgCIAEoCRIQCghwcm9ncmVzcxgDIAEoBRIlCgRtb2RlGAQgASgOMhcuZGFudW5pLmRhbm1ha3UudjEuTW9kZRIQCghmb250c2l6ZRgFIAEoBRINCgVjb2xvchgGIAEoBRIQCghzZW5kZXJJRBgHIAEoCRIPCgdjb250ZW50GAggASgJEikKBWN0aW1lGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIOCgZ3ZWlnaHQYCiABKAUSJQoEcG9vbBgLIAEoDjIXLmRhbnVuaS5kYW5tYWt1LnYxLlBvb2wSDAoEYXR0chgMIAMoCRIQCghwbGF0Zm9ybRgNIAEoCRIRCgRTUE1PGA4gASgJSACIAQESEgoFZXh0cmEYDyABKAlIAYgBAUIHCgVfU1BNT0IICgZfZXh0cmEiPAoMRGFubWFrdVJlcGx5EiwKCGRhbm1ha3VzGAEgAygLMhouZGFudW5pLmRhbm1ha3UudjEuRGFubWFrdSo9CgRNb2RlEgoKBk5vcm1hbBAAEgoKBkJvdHRvbRABEgcKA1RvcBACEgsKB1JldmVyc2UQAxIHCgNFeHQQBCopCgRQb29sEgcKA0RlZhAAEgcKA1N1YhABEgcKA0FkdhACEgYKAkl4EANQAGIGcHJvdG8z", [
5714
- file_google_protobuf_timestamp
5715
- ]);
5716
- const DanmakuReplySchema = /*@__PURE__*/ message_messageDesc(file_danuni, 1);
5717
- class UniPool {
6348
+ class src_UniPool {
5718
6349
  dans;
5719
- shared;
5720
- constructor(dans){
6350
+ options;
6351
+ constructor(dans, options = {}){
5721
6352
  this.dans = dans;
5722
- this.shared = {};
5723
- function isShared(key) {
5724
- return 1 === new Set(dans.map((d)=>d[key])).size;
5725
- }
5726
- if (isShared('FCID')) this.shared.FCID = dans[0].FCID;
5727
- if (isShared('senderID')) this.shared.senderID = dans[0].senderID;
5728
- if (isShared('platform')) this.shared.platform = dans[0].platform;
5729
- if (isShared('SPMO')) this.shared.SPMO = dans[0].SPMO;
5730
- if (isShared('pool')) this.shared.pool = dans[0].pool;
5731
- if (isShared('mode')) this.shared.mode = dans[0].mode;
6353
+ this.options = options;
6354
+ if (false !== options.dedupe) options.dedupe = true;
6355
+ if (this.options.dedupe) this.dedupe();
6356
+ }
6357
+ async pipe(fn) {
6358
+ return fn(this);
6359
+ }
6360
+ pipeSync(fn) {
6361
+ return fn(this);
6362
+ }
6363
+ get shared() {
6364
+ const isShared = (key)=>this.dans.every((d)=>d[key]);
6365
+ return {
6366
+ SOID: isShared('SOID') ? this.dans[0].SOID : void 0,
6367
+ senderID: isShared('senderID') ? this.dans[0].senderID : void 0,
6368
+ platform: isShared('platform') ? this.dans[0].platform : void 0,
6369
+ pool: isShared('pool') ? this.dans[0].pool : void 0,
6370
+ mode: isShared('mode') ? this.dans[0].mode : void 0,
6371
+ color: isShared('color') ? this.dans[0].color : void 0
6372
+ };
6373
+ }
6374
+ get stat() {
6375
+ const default_stat = {
6376
+ SOID: [],
6377
+ mode: [
6378
+ {
6379
+ val: dm_gen_Modes.Normal,
6380
+ count: 0
6381
+ },
6382
+ {
6383
+ val: dm_gen_Modes.Bottom,
6384
+ count: 0
6385
+ },
6386
+ {
6387
+ val: dm_gen_Modes.Top,
6388
+ count: 0
6389
+ },
6390
+ {
6391
+ val: dm_gen_Modes.Reverse,
6392
+ count: 0
6393
+ },
6394
+ {
6395
+ val: dm_gen_Modes.Ext,
6396
+ count: 0
6397
+ }
6398
+ ],
6399
+ fontsize: [],
6400
+ color: [],
6401
+ senderID: [],
6402
+ content: [],
6403
+ weight: [],
6404
+ pool: [
6405
+ {
6406
+ val: dm_gen_Pools.Def,
6407
+ count: 0
6408
+ },
6409
+ {
6410
+ val: dm_gen_Pools.Sub,
6411
+ count: 0
6412
+ },
6413
+ {
6414
+ val: dm_gen_Pools.Adv,
6415
+ count: 0
6416
+ },
6417
+ {
6418
+ val: dm_gen_Pools.Ix,
6419
+ count: 0
6420
+ }
6421
+ ],
6422
+ platform: []
6423
+ };
6424
+ const stat = this.dans.reduce((s, d)=>{
6425
+ const SOID = s.SOID.find((i)=>i.val === d.SOID);
6426
+ if (SOID) SOID.count++;
6427
+ else s.SOID.push({
6428
+ val: d.SOID,
6429
+ count: 1
6430
+ });
6431
+ const mode = s.mode.find((i)=>i.val === d.mode);
6432
+ if (mode) mode.count++;
6433
+ else s.mode.push({
6434
+ val: d.mode,
6435
+ count: 1
6436
+ });
6437
+ const fontsize = s.fontsize.find((i)=>i.val === d.fontsize);
6438
+ if (fontsize) fontsize.count++;
6439
+ else s.fontsize.push({
6440
+ val: d.fontsize,
6441
+ count: 1
6442
+ });
6443
+ const color = s.color.find((i)=>i.val === d.color);
6444
+ if (color) color.count++;
6445
+ else s.color.push({
6446
+ val: d.color,
6447
+ count: 1
6448
+ });
6449
+ const senderID = s.senderID.find((i)=>i.val === d.senderID);
6450
+ if (senderID) senderID.count++;
6451
+ else s.senderID.push({
6452
+ val: d.senderID,
6453
+ count: 1
6454
+ });
6455
+ const content = s.content.find((i)=>i.val === d.content);
6456
+ if (content) content.count++;
6457
+ else s.content.push({
6458
+ val: d.content,
6459
+ count: 1
6460
+ });
6461
+ const weight = s.weight.find((i)=>i.val === d.weight);
6462
+ if (weight) weight.count++;
6463
+ else s.weight.push({
6464
+ val: d.weight,
6465
+ count: 1
6466
+ });
6467
+ const pool = s.pool.find((i)=>i.val === d.pool);
6468
+ if (pool) pool.count++;
6469
+ else s.pool.push({
6470
+ val: d.pool,
6471
+ count: 1
6472
+ });
6473
+ const platform = s.platform.find((i)=>i.val === d.platform);
6474
+ if (platform) platform.count++;
6475
+ else s.platform.push({
6476
+ val: d.platform,
6477
+ count: 1
6478
+ });
6479
+ return s;
6480
+ }, default_stat);
6481
+ return stat;
6482
+ }
6483
+ get most() {
6484
+ const s = this.stat;
6485
+ return {
6486
+ mode: s.mode.sort((a, b)=>b.count - a.count)[0].val,
6487
+ fontsize: s.fontsize.sort((a, b)=>b.count - a.count)[0].val,
6488
+ color: s.color.sort((a, b)=>b.count - a.count)[0].val,
6489
+ senderID: s.senderID.sort((a, b)=>b.count - a.count)[0].val,
6490
+ content: s.content.sort((a, b)=>b.count - a.count)[0].val,
6491
+ weight: s.weight.sort((a, b)=>b.count - a.count)[0].val,
6492
+ pool: s.pool.sort((a, b)=>b.count - a.count)[0].val,
6493
+ platform: s.platform.sort((a, b)=>b.count - a.count)[0].val
6494
+ };
5732
6495
  }
5733
6496
  static create() {
5734
- return new UniPool([]);
6497
+ return new src_UniPool([]);
5735
6498
  }
5736
6499
  assign(dans) {
5737
- if (dans instanceof UniPool) return new UniPool([
6500
+ if (dans instanceof src_UniPool) return new src_UniPool([
5738
6501
  ...this.dans,
5739
6502
  ...dans.dans
5740
6503
  ]);
5741
- if (dans instanceof UniDM) return new UniPool([
6504
+ if (dans instanceof UniDM) return new src_UniPool([
5742
6505
  ...this.dans,
5743
6506
  dans
5744
6507
  ]);
5745
- if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new UniPool([
6508
+ if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new src_UniPool([
5746
6509
  ...this.dans,
5747
6510
  ...dans
5748
6511
  ]);
@@ -5755,21 +6518,31 @@ class UniPool {
5755
6518
  const set = new Set(this.dans.map((d)=>d[key]));
5756
6519
  return [
5757
6520
  ...set
5758
- ].map((v)=>new UniPool(this.dans.filter((d)=>d[key] === v)));
6521
+ ].map((v)=>new src_UniPool(this.dans.filter((d)=>d[key] === v), {
6522
+ dedupe: false
6523
+ }));
6524
+ }
6525
+ dedupe() {
6526
+ const map = new Map();
6527
+ this.dans.forEach((d)=>map.set(d.DMID || d.toDMID(), d));
6528
+ this.dans = [
6529
+ ...map.values()
6530
+ ];
6531
+ this.options.dedupe = false;
5759
6532
  }
5760
6533
  merge(lifetime = 0) {
5761
- if (!this.shared.FCID) {
5762
- console.error("本功能仅支持同弹幕库内使用,可先 .split('FCID') 在分别使用");
6534
+ if (!this.shared.SOID) {
6535
+ console.error("\u672C\u529F\u80FD\u4EC5\u652F\u6301\u540C\u5F39\u5E55\u5E93\u5185\u4F7F\u7528\uFF0C\u53EF\u5148 .split('SOID') \u5728\u5206\u522B\u4F7F\u7528");
5763
6536
  return this;
5764
6537
  }
5765
6538
  if (lifetime <= 0) return this;
5766
6539
  const mergeContext = this.dans.reduce(([result, cache, mergeObj], danmaku)=>{
5767
6540
  const key = [
6541
+ 'SOID',
5768
6542
  'content',
5769
6543
  'mode',
5770
6544
  'platform',
5771
- 'pool',
5772
- 'SPMO'
6545
+ 'pool'
5773
6546
  ].map((k)=>danmaku[k]).join('|');
5774
6547
  const cached = cache[key];
5775
6548
  const lastAppearTime = cached?.progress || 0;
@@ -5781,7 +6554,9 @@ class UniPool {
5781
6554
  extra.danuni.merge = {
5782
6555
  count: senders.length,
5783
6556
  duration: danmaku.progress - cached.progress,
5784
- senders
6557
+ senders,
6558
+ taolu_count: senders.length,
6559
+ taolu_senders: senders
5785
6560
  };
5786
6561
  danmaku.extraStr = JSON.stringify(extra);
5787
6562
  cache[key] = danmaku;
@@ -5798,6 +6573,10 @@ class UniPool {
5798
6573
  duration: 0,
5799
6574
  senders: [
5800
6575
  danmaku.senderID
6576
+ ],
6577
+ taolu_count: 1,
6578
+ taolu_senders: [
6579
+ danmaku.senderID
5801
6580
  ]
5802
6581
  };
5803
6582
  cache[key] = danmaku;
@@ -5820,11 +6599,11 @@ class UniPool {
5820
6599
  const [result, _cache, mergeObj] = mergeContext;
5821
6600
  result.forEach((danmaku, i)=>{
5822
6601
  const key = [
6602
+ 'SOID',
5823
6603
  'content',
5824
6604
  'mode',
5825
6605
  'platform',
5826
- 'pool',
5827
- 'SPMO'
6606
+ 'pool'
5828
6607
  ].map((k)=>danmaku[k]).join('|');
5829
6608
  const extra = result[i].extra, mergeData = mergeObj[key];
5830
6609
  result[i].extraStr = JSON.stringify({
@@ -5834,20 +6613,23 @@ class UniPool {
5834
6613
  merge: mergeData
5835
6614
  }
5836
6615
  });
5837
- if (mergeData?.count) {
5838
- if (mergeData.count <= 1) {
5839
- const updatedExtra = {
5840
- ...extra
5841
- };
5842
- if (updatedExtra.danuni) {
5843
- delete updatedExtra.danuni.merge;
5844
- if (0 === Object.keys(updatedExtra.danuni).length) delete updatedExtra.danuni;
5845
- }
5846
- result[i].extraStr = Object.keys(updatedExtra).length > 0 ? JSON.stringify(updatedExtra) : void 0;
5847
- } else result[i].senderID = 'merge@bot';
6616
+ if (mergeData?.count) if (mergeData.count <= 1) {
6617
+ const updatedExtra = {
6618
+ ...extra
6619
+ };
6620
+ if (updatedExtra.danuni) {
6621
+ delete updatedExtra.danuni.merge;
6622
+ if (0 === Object.keys(updatedExtra.danuni).length) delete updatedExtra.danuni;
6623
+ }
6624
+ result[i].extraStr = Object.keys(updatedExtra).length > 0 ? JSON.stringify(updatedExtra) : void 0;
6625
+ } else {
6626
+ result[i].senderID = 'merge[bot]@dan-any';
6627
+ result[i].attr ? result[i].attr.push('Protect') : result[i].attr = [
6628
+ 'Protect'
6629
+ ];
5848
6630
  }
5849
6631
  });
5850
- return new UniPool(result);
6632
+ return new src_UniPool(result);
5851
6633
  }
5852
6634
  minify() {
5853
6635
  return this.dans.map((d)=>d.minify());
@@ -5876,12 +6658,12 @@ class UniPool {
5876
6658
  }
5877
6659
  static fromPb(bin) {
5878
6660
  const data = fromBinary(DanmakuReplySchema, new Uint8Array(bin));
5879
- return new UniPool(data.danmakus.map((d)=>new UniDM(d.FCID, d.progress, d.mode, d.fontsize, d.color, d.senderID, d.content, timestampDate(d.ctime || timestampNow()), d.weight, d.pool, d.attr, d.platform, d.SPMO, d.extra, d.DMID)));
6661
+ return new src_UniPool(data.danmakus.map((d)=>new UniDM(d.SOID, d.progress, d.mode, d.fontsize, d.color, d.senderID, d.content, timestampDate(d.ctime || timestampNow()), d.weight, d.pool, d.attr, d.platform, d.extra, d.DMID)));
5880
6662
  }
5881
6663
  toPb() {
5882
6664
  return toBinary(DanmakuReplySchema, create(DanmakuReplySchema, {
5883
6665
  danmakus: this.dans.map((d)=>({
5884
- FCID: d.FCID,
6666
+ SOID: d.SOID,
5885
6667
  DMID: d.DMID,
5886
6668
  progress: d.progress,
5887
6669
  mode: d.mode,
@@ -5894,16 +6676,15 @@ class UniPool {
5894
6676
  pool: d.pool,
5895
6677
  attr: d.attr,
5896
6678
  platform: d.platform,
5897
- SPMO: d.SPMO,
5898
6679
  extra: d.extraStr
5899
6680
  }))
5900
6681
  }));
5901
6682
  }
5902
- static fromBiliXML(xml, SPMO) {
5903
- const parser = new __WEBPACK_EXTERNAL_MODULE_fast_xml_parser_1c5d6bda__.XMLParser({
6683
+ static fromBiliXML(xml) {
6684
+ const parser = new XMLParser({
5904
6685
  ignoreAttributes: false
5905
6686
  }), oriData = parser.parse(xml), dans = oriData.i.d;
5906
- return new UniPool(dans.map((d)=>{
6687
+ return new src_UniPool(dans.map((d)=>{
5907
6688
  const p_str = d['@_p'], p_arr = p_str.split(',');
5908
6689
  return UniDM.fromBili({
5909
6690
  content: d['#text'],
@@ -5916,19 +6697,51 @@ class UniPool {
5916
6697
  midHash: p_arr[6],
5917
6698
  id: BigInt(p_arr[7]),
5918
6699
  weight: Number.parseInt(p_arr[8])
5919
- }, SPMO, BigInt(oriData.i.chatid));
6700
+ }, BigInt(oriData.i.chatid));
5920
6701
  }));
5921
6702
  }
5922
- static fromBiliGrpc(bin, SPMO) {
6703
+ toBiliXML() {
6704
+ const genCID = (id)=>{
6705
+ const UniID = id_gen_UniID.fromString(id);
6706
+ if (UniID.domain === platform_PlatformVideoSource.Bilibili) {
6707
+ const cid = Number(UniID.id.replaceAll('def::', ''));
6708
+ if (cid) return cid;
6709
+ }
6710
+ return Number.parseInt(Buffer.from(id).toString('hex'), 16);
6711
+ };
6712
+ const builder = new XMLBuilder({
6713
+ ignoreAttributes: false
6714
+ });
6715
+ return builder.build({
6716
+ '?xml': {
6717
+ '@_version': '1.0',
6718
+ '@_encoding': 'UTF-8'
6719
+ },
6720
+ i: {
6721
+ chatserver: 'chat.bilibili.com',
6722
+ chatid: genCID(this.dans[0].SOID),
6723
+ mission: 0,
6724
+ maxlimit: this.dans.length,
6725
+ state: 0,
6726
+ real_name: 0,
6727
+ source: 'k-v',
6728
+ d: this.dans.map((dan)=>dan.toBiliXML())
6729
+ }
6730
+ });
6731
+ }
6732
+ static fromBiliGrpc(bin) {
5923
6733
  const data = fromBinary(DmSegMobileReplySchema, new Uint8Array(bin)), json = data.elems;
5924
- return new UniPool(json.map((d)=>UniDM.fromBili(d, SPMO)));
6734
+ return new src_UniPool(json.map((d)=>UniDM.fromBili({
6735
+ ...d,
6736
+ progress: d.progress / 1000
6737
+ })));
5925
6738
  }
5926
- static fromBiliCommandGrpc(bin, SPMO) {
6739
+ static fromBiliCommandGrpc(bin) {
5927
6740
  const data = fromBinary(DmWebViewReplySchema, new Uint8Array(bin)), json = data.commandDms;
5928
- return new UniPool(json.map((d)=>UniDM.fromBiliCommand(d, SPMO)));
6741
+ return new src_UniPool(json.map((d)=>UniDM.fromBiliCommand(d)));
5929
6742
  }
5930
6743
  static fromDplayer(json, playerID, domain = 'other') {
5931
- return new UniPool(json.data.map((d)=>UniDM.fromDplayer({
6744
+ return new src_UniPool(json.data.map((d)=>UniDM.fromDplayer({
5932
6745
  content: d[4],
5933
6746
  progress: d[0],
5934
6747
  mode: d[1],
@@ -5952,7 +6765,7 @@ class UniPool {
5952
6765
  };
5953
6766
  }
5954
6767
  static fromArtplayer(json, playerID, domain = 'other') {
5955
- return new UniPool(json.map((d)=>UniDM.fromArtplayer({
6768
+ return new src_UniPool(json.map((d)=>UniDM.fromArtplayer({
5956
6769
  content: d.text,
5957
6770
  progress: d.time || 0,
5958
6771
  mode: d.mode || 0,
@@ -5973,8 +6786,8 @@ class UniPool {
5973
6786
  };
5974
6787
  });
5975
6788
  }
5976
- static fromDDPlay(json, episodeId, domain) {
5977
- return new UniPool(json.comments.map((d)=>{
6789
+ static fromDDPlay(json, episodeId) {
6790
+ return new src_UniPool(json.comments.map((d)=>{
5978
6791
  const p_arr = d.p.split(',');
5979
6792
  return UniDM.fromDDplay({
5980
6793
  cid: d.cid,
@@ -5983,7 +6796,7 @@ class UniPool {
5983
6796
  mode: Number.parseInt(p_arr[1]),
5984
6797
  progress: Number.parseFloat(p_arr[0]),
5985
6798
  uid: p_arr[3]
5986
- }, episodeId, domain);
6799
+ }, episodeId);
5987
6800
  }));
5988
6801
  }
5989
6802
  toDDplay() {
@@ -6005,7 +6818,7 @@ class UniPool {
6005
6818
  toASS(options = {
6006
6819
  substyle: {}
6007
6820
  }) {
6008
- const fn = this.shared.FCID;
6821
+ const fn = this.shared.SOID;
6009
6822
  return generateASS(this, {
6010
6823
  filename: fn,
6011
6824
  title: fn,
@@ -6013,4 +6826,4 @@ class UniPool {
6013
6826
  });
6014
6827
  }
6015
6828
  }
6016
- export { UniDM, dm_gen_namespaceObject as UniDMTools, id_gen_namespaceObject as UniIDTools, UniPool };
6829
+ export { UniDM, dm_gen_namespaceObject as UniDMTools, id_gen_namespaceObject as UniIDTools, src_UniPool as UniPool, platform_namespaceObject as platform };