@highlight-run/rrweb 2.0.8 → 2.0.11

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.
Files changed (41) hide show
  1. package/dist/plugins/console-record.js +5 -5
  2. package/dist/plugins/console-record.min.js +5 -5
  3. package/dist/plugins/console-record.min.js.map +1 -1
  4. package/dist/plugins/console-replay.js +3 -3
  5. package/dist/plugins/console-replay.min.js +3 -3
  6. package/dist/plugins/console-replay.min.js.map +1 -1
  7. package/dist/record/rrweb-record-pack.js +2 -2
  8. package/dist/record/rrweb-record-pack.min.js +2 -2
  9. package/dist/record/rrweb-record-pack.min.js.map +1 -1
  10. package/dist/record/rrweb-record.js +3 -3
  11. package/dist/record/rrweb-record.min.js +3 -3
  12. package/dist/record/rrweb-record.min.js.map +1 -1
  13. package/dist/replay/rrweb-replay-unpack.js +3 -4
  14. package/dist/replay/rrweb-replay-unpack.min.js +3 -4
  15. package/dist/replay/rrweb-replay-unpack.min.js.map +1 -1
  16. package/dist/replay/rrweb-replay.js +3 -4
  17. package/dist/replay/rrweb-replay.min.js +3 -4
  18. package/dist/replay/rrweb-replay.min.js.map +1 -1
  19. package/dist/rrweb-all.js +24 -25
  20. package/dist/rrweb-all.min.js +24 -25
  21. package/dist/rrweb-all.min.js.map +1 -1
  22. package/dist/rrweb.js +14 -15
  23. package/dist/rrweb.min.js +14 -15
  24. package/dist/rrweb.min.js.map +1 -1
  25. package/es/rrweb/packages/rrdom/es/virtual-dom.js +51 -90
  26. package/es/rrweb/packages/rrweb/src/index.js +1 -1
  27. package/es/rrweb/packages/rrweb/src/record/index.js +6 -3
  28. package/es/rrweb/packages/rrweb/src/record/mutation.js +1 -1
  29. package/es/rrweb/packages/rrweb/src/record/observer.js +1 -1
  30. package/es/rrweb/packages/rrweb/src/replay/index.js +1 -1
  31. package/es/rrweb/packages/rrweb/src/utils.js +1 -1
  32. package/lib/plugins/console-record.js +1 -9
  33. package/lib/plugins/console-replay.js +1 -9
  34. package/lib/record/rrweb-record-pack.js +3 -9
  35. package/lib/record/rrweb-record.js +21 -1061
  36. package/lib/replay/rrweb-replay-unpack.js +96 -1015
  37. package/lib/replay/rrweb-replay.js +96 -1015
  38. package/lib/rrweb-all.js +141 -2034
  39. package/lib/rrweb.js +141 -2034
  40. package/package.json +4 -4
  41. package/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js +0 -1858
@@ -1,66 +1,4 @@
1
- var NodeType$1;
2
- (function (NodeType) {
3
- NodeType[NodeType["Document"] = 0] = "Document";
4
- NodeType[NodeType["DocumentType"] = 1] = "DocumentType";
5
- NodeType[NodeType["Element"] = 2] = "Element";
6
- NodeType[NodeType["Text"] = 3] = "Text";
7
- NodeType[NodeType["CDATA"] = 4] = "CDATA";
8
- NodeType[NodeType["Comment"] = 5] = "Comment";
9
- })(NodeType$1 || (NodeType$1 = {}));
10
- var Mirror$1 = (function () {
11
- function Mirror() {
12
- this.idNodeMap = new Map();
13
- this.nodeMetaMap = new WeakMap();
14
- }
15
- Mirror.prototype.getId = function (n) {
16
- var _a;
17
- if (!n)
18
- return -1;
19
- var id = (_a = this.getMeta(n)) === null || _a === void 0 ? void 0 : _a.id;
20
- return id !== null && id !== void 0 ? id : -1;
21
- };
22
- Mirror.prototype.getNode = function (id) {
23
- return this.idNodeMap.get(id) || null;
24
- };
25
- Mirror.prototype.getIds = function () {
26
- return Array.from(this.idNodeMap.keys());
27
- };
28
- Mirror.prototype.getMeta = function (n) {
29
- return this.nodeMetaMap.get(n) || null;
30
- };
31
- Mirror.prototype.removeNodeFromMap = function (n) {
32
- var _this = this;
33
- var id = this.getId(n);
34
- this.idNodeMap["delete"](id);
35
- if (n.childNodes) {
36
- n.childNodes.forEach(function (childNode) {
37
- return _this.removeNodeFromMap(childNode);
38
- });
39
- }
40
- };
41
- Mirror.prototype.has = function (id) {
42
- return this.idNodeMap.has(id);
43
- };
44
- Mirror.prototype.hasNode = function (node) {
45
- return this.nodeMetaMap.has(node);
46
- };
47
- Mirror.prototype.add = function (n, meta) {
48
- var id = meta.id;
49
- this.idNodeMap.set(id, n);
50
- this.nodeMetaMap.set(n, meta);
51
- };
52
- Mirror.prototype.replace = function (id, n) {
53
- this.idNodeMap.set(id, n);
54
- };
55
- Mirror.prototype.reset = function () {
56
- this.idNodeMap = new Map();
57
- this.nodeMetaMap = new WeakMap();
58
- };
59
- return Mirror;
60
- }());
61
- function createMirror$1() {
62
- return new Mirror$1();
63
- }
1
+ import { NodeType as NodeType$1, createMirror as createMirror$1 } from '@highlight-run/rrweb-snapshot';
64
2
 
65
3
  function parseCSSText(cssText) {
66
4
  const res = {};
@@ -535,7 +473,7 @@ function diff(oldTree, newTree, replayer, rrnodeMirror) {
535
473
  break;
536
474
  }
537
475
  case NodeType$1.Element: {
538
- const oldElement = (oldTree);
476
+ const oldElement = oldTree;
539
477
  const newRRElement = newTree;
540
478
  diffProps(oldElement, newRRElement, rrnodeMirror);
541
479
  scrollDataToApply = newRRElement.scrollData;
@@ -543,7 +481,7 @@ function diff(oldTree, newTree, replayer, rrnodeMirror) {
543
481
  switch (newRRElement.tagName) {
544
482
  case 'AUDIO':
545
483
  case 'VIDEO': {
546
- const oldMediaElement = (oldTree);
484
+ const oldMediaElement = oldTree;
547
485
  const newMediaRRElement = newRRElement;
548
486
  if (newMediaRRElement.paused !== undefined)
549
487
  newMediaRRElement.paused
@@ -558,7 +496,7 @@ function diff(oldTree, newTree, replayer, rrnodeMirror) {
558
496
  break;
559
497
  }
560
498
  case 'CANVAS':
561
- newTree.canvasMutations.forEach((canvasMutation) => replayer.applyCanvas(canvasMutation.event, canvasMutation.mutation, (oldTree)));
499
+ newTree.canvasMutations.forEach((canvasMutation) => replayer.applyCanvas(canvasMutation.event, canvasMutation.mutation, oldTree));
562
500
  break;
563
501
  case 'STYLE':
564
502
  applyVirtualStyleRulesToNode(oldElement, newTree.rules);
@@ -585,8 +523,7 @@ function diff(oldTree, newTree, replayer, rrnodeMirror) {
585
523
  scrollDataToApply && replayer.applyScroll(scrollDataToApply, true);
586
524
  inputDataToApply && replayer.applyInput(inputDataToApply);
587
525
  if (newTree.nodeName === 'IFRAME') {
588
- const oldContentDocument = (oldTree)
589
- .contentDocument;
526
+ const oldContentDocument = oldTree.contentDocument;
590
527
  const newIFrameElement = newTree;
591
528
  if (oldContentDocument) {
592
529
  const sn = rrnodeMirror.getMeta(newIFrameElement.contentDocument);
@@ -625,7 +562,7 @@ function diffProps(oldTree, newTree, rrnodeMirror) {
625
562
  newTree.scrollTop && (oldTree.scrollTop = newTree.scrollTop);
626
563
  }
627
564
  function diffChildren(oldChildren, newChildren, parentNode, replayer, rrnodeMirror) {
628
- var _a, _b;
565
+ var _a;
629
566
  let oldStartIndex = 0, oldEndIndex = oldChildren.length - 1, newStartIndex = 0, newEndIndex = newChildren.length - 1;
630
567
  let oldStartNode = oldChildren[oldStartIndex], oldEndNode = oldChildren[oldEndIndex], newStartNode = newChildren[newStartIndex], newEndNode = newChildren[newEndIndex];
631
568
  let oldIdToIndex = undefined, indexInOld;
@@ -647,16 +584,26 @@ function diffChildren(oldChildren, newChildren, parentNode, replayer, rrnodeMirr
647
584
  newEndNode = newChildren[--newEndIndex];
648
585
  }
649
586
  else if (replayer.mirror.getId(oldStartNode) === rrnodeMirror.getId(newEndNode)) {
650
- parentNode.insertBefore(oldStartNode, oldEndNode.nextSibling);
651
- diff(oldStartNode, newEndNode, replayer, rrnodeMirror);
652
- oldStartNode = oldChildren[++oldStartIndex];
653
- newEndNode = newChildren[--newEndIndex];
587
+ try {
588
+ parentNode.insertBefore(oldStartNode, oldEndNode.nextSibling);
589
+ diff(oldStartNode, newEndNode, replayer, rrnodeMirror);
590
+ oldStartNode = oldChildren[++oldStartIndex];
591
+ newEndNode = newChildren[--newEndIndex];
592
+ }
593
+ catch (e) {
594
+ console.error(e, parentNode, oldStartNode, oldEndNode);
595
+ }
654
596
  }
655
597
  else if (replayer.mirror.getId(oldEndNode) === rrnodeMirror.getId(newStartNode)) {
656
- parentNode.insertBefore(oldEndNode, oldStartNode);
657
- diff(oldEndNode, newStartNode, replayer, rrnodeMirror);
658
- oldEndNode = oldChildren[--oldEndIndex];
659
- newStartNode = newChildren[++newStartIndex];
598
+ try {
599
+ parentNode.insertBefore(oldEndNode, oldStartNode);
600
+ diff(oldEndNode, newStartNode, replayer, rrnodeMirror);
601
+ oldEndNode = oldChildren[--oldEndIndex];
602
+ newStartNode = newChildren[++newStartIndex];
603
+ }
604
+ catch (e) {
605
+ console.error(e, parentNode, oldEndNode, oldStartNode);
606
+ }
660
607
  }
661
608
  else {
662
609
  if (!oldIdToIndex) {
@@ -670,21 +617,31 @@ function diffChildren(oldChildren, newChildren, parentNode, replayer, rrnodeMirr
670
617
  indexInOld = oldIdToIndex[rrnodeMirror.getId(newStartNode)];
671
618
  if (indexInOld) {
672
619
  const nodeToMove = oldChildren[indexInOld];
673
- parentNode.insertBefore(nodeToMove, oldStartNode);
674
- diff(nodeToMove, newStartNode, replayer, rrnodeMirror);
675
- oldChildren[indexInOld] = undefined;
620
+ try {
621
+ parentNode.insertBefore(nodeToMove, oldStartNode);
622
+ diff(nodeToMove, newStartNode, replayer, rrnodeMirror);
623
+ oldChildren[indexInOld] = undefined;
624
+ }
625
+ catch (e) {
626
+ console.error(e, parentNode, nodeToMove, oldStartNode);
627
+ }
676
628
  }
677
629
  else {
678
630
  const newNode = createOrGetNode(newStartNode, replayer.mirror, rrnodeMirror);
679
- if (((_a = replayer.mirror.getMeta(parentNode)) === null || _a === void 0 ? void 0 : _a.type) === NodeType$1.Document &&
680
- ((_b = replayer.mirror.getMeta(newNode)) === null || _b === void 0 ? void 0 : _b.type) === NodeType$1.Element &&
681
- (parentNode).documentElement) {
682
- parentNode.removeChild((parentNode).documentElement);
631
+ if (parentNode.nodeName === '#document' &&
632
+ ((_a = replayer.mirror.getMeta(newNode)) === null || _a === void 0 ? void 0 : _a.type) === NodeType$1.Element &&
633
+ parentNode.documentElement) {
634
+ parentNode.removeChild(parentNode.documentElement);
683
635
  oldChildren[oldStartIndex] = undefined;
684
636
  oldStartNode = undefined;
685
637
  }
686
- parentNode.insertBefore(newNode, oldStartNode || null);
687
- diff(newNode, newStartNode, replayer, rrnodeMirror);
638
+ try {
639
+ parentNode.insertBefore(newNode, oldStartNode || null);
640
+ diff(newNode, newStartNode, replayer, rrnodeMirror);
641
+ }
642
+ catch (e) {
643
+ console.error(e, parentNode, newNode, oldStartNode || null);
644
+ }
688
645
  }
689
646
  newStartNode = newChildren[++newStartIndex];
690
647
  }
@@ -699,8 +656,13 @@ function diffChildren(oldChildren, newChildren, parentNode, replayer, rrnodeMirr
699
656
  });
700
657
  for (; newStartIndex <= newEndIndex; ++newStartIndex) {
701
658
  const newNode = createOrGetNode(newChildren[newStartIndex], replayer.mirror, rrnodeMirror);
702
- parentNode.insertBefore(newNode, referenceNode);
703
- diff(newNode, newChildren[newStartIndex], replayer, rrnodeMirror);
659
+ try {
660
+ parentNode.insertBefore(newNode, referenceNode);
661
+ diff(newNode, newChildren[newStartIndex], replayer, rrnodeMirror);
662
+ }
663
+ catch (e) {
664
+ console.error(e, parentNode, newNode, referenceNode);
665
+ }
704
666
  }
705
667
  }
706
668
  else if (newStartIndex > newEndIndex) {
@@ -754,8 +716,7 @@ function getNestedRule(rules, position) {
754
716
  return rule;
755
717
  }
756
718
  else {
757
- return getNestedRule((rule).cssRules[position[1]]
758
- .cssRules, position.slice(2));
719
+ return getNestedRule(rule.cssRules[position[1]].cssRules, position.slice(2));
759
720
  }
760
721
  }
761
722
  var StyleRuleType;
@@ -1,6 +1,6 @@
1
1
  import record from './record/index.js';
2
2
  export { default as record } from './record/index.js';
3
- import '../../rrweb-snapshot/es/rrweb-snapshot.js';
3
+ import '@highlight-run/rrweb-snapshot';
4
4
  import '../../rrdom/es/virtual-dom.js';
5
5
  export { EventType, IncrementalSource, MouseInteractions, ReplayerEvents } from './types.js';
6
6
  import * as utils from './utils.js';
@@ -1,6 +1,6 @@
1
- import { createMirror, snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';
1
+ import { createMirror, snapshot } from '@highlight-run/rrweb-snapshot';
2
2
  import { initObservers, mutationBuffers } from './observer.js';
3
- import { polyfill, on, getWindowWidth, getWindowHeight, isSerializedIframe, hasShadowRoot } from '../utils.js';
3
+ import { polyfill, on, getWindowWidth, getWindowHeight, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';
4
4
  import { EventType, IncrementalSource } from '../types.js';
5
5
  import { IframeManager } from './iframe-manager.js';
6
6
  import { ShadowDomManager } from './shadow-dom-manager.js';
@@ -180,6 +180,9 @@ function record(options = {}) {
180
180
  if (isSerializedIframe(n, mirror)) {
181
181
  iframeManager.addIframe(n);
182
182
  }
183
+ if (isSerializedStylesheet(n, mirror)) {
184
+ stylesheetManager.addStylesheet(n);
185
+ }
183
186
  if (hasShadowRoot(n)) {
184
187
  shadowDomManager.addShadowRoot(n.shadowRoot, document);
185
188
  }
@@ -189,7 +192,7 @@ function record(options = {}) {
189
192
  shadowDomManager.observeAttachShadow(iframe);
190
193
  },
191
194
  onStylesheetLoad: (linkEl, childSn) => {
192
- this.stylesheetManager.attachStylesheet(linkEl, childSn, this.mirror);
195
+ stylesheetManager.attachStylesheet(linkEl, childSn, mirror);
193
196
  },
194
197
  keepIframeSrcFn,
195
198
  });
@@ -1,4 +1,4 @@
1
- import { obfuscateText, isShadowRoot, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';
1
+ import { obfuscateText, isShadowRoot, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '@highlight-run/rrweb-snapshot';
2
2
  import { isIgnored, isBlocked, isSerialized, isAncestorRemoved, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';
3
3
 
4
4
  function isNodeInLinkedList(n) {
@@ -1,4 +1,4 @@
1
- import { maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';
1
+ import { maskInputValue } from '@highlight-run/rrweb-snapshot';
2
2
  import { on, throttle, isBlocked, getWindowHeight, getWindowWidth, hookSetter, patch, isTouchEvent, isCanvasNode } from '../utils.js';
3
3
  import { MouseInteractions, IncrementalSource } from '../types.js';
4
4
  import MutationBuffer from './mutation.js';
@@ -1,5 +1,5 @@
1
1
  import { __awaiter } from './../../../../ext/tslib/tslib.es6.js';
2
- import { createCache, createMirror, rebuild, buildNodeWithSN, NodeType } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';
2
+ import { createCache, createMirror, rebuild, buildNodeWithSN, NodeType } from '@highlight-run/rrweb-snapshot';
3
3
  import { RRDocument, diff, createOrGetNode, getDefaultSN, StyleRuleType, buildFromDom, buildFromNode } from '../../../rrdom/es/virtual-dom.js';
4
4
  import * as mitt_es from './../../../../ext/mitt/dist/mitt.es.js';
5
5
  import mitt$1 from './../../../../ext/mitt/dist/mitt.es.js';
@@ -1,4 +1,4 @@
1
- import { classMatchesRegex, IGNORED_NODE, isShadowRoot } from '../../rrweb-snapshot/es/rrweb-snapshot.js';
1
+ import { classMatchesRegex, IGNORED_NODE, isShadowRoot } from '@highlight-run/rrweb-snapshot';
2
2
 
3
3
  function on(type, fn, target = document) {
4
4
  const options = { capture: true, passive: true };
@@ -2,15 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var NodeType;
6
- (function (NodeType) {
7
- NodeType[NodeType["Document"] = 0] = "Document";
8
- NodeType[NodeType["DocumentType"] = 1] = "DocumentType";
9
- NodeType[NodeType["Element"] = 2] = "Element";
10
- NodeType[NodeType["Text"] = 3] = "Text";
11
- NodeType[NodeType["CDATA"] = 4] = "CDATA";
12
- NodeType[NodeType["Comment"] = 5] = "Comment";
13
- })(NodeType || (NodeType = {}));
5
+ require('@highlight-run/rrweb-snapshot');
14
6
 
15
7
  const DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +
16
8
  '\r\n' +
@@ -2,15 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var NodeType;
6
- (function (NodeType) {
7
- NodeType[NodeType["Document"] = 0] = "Document";
8
- NodeType[NodeType["DocumentType"] = 1] = "DocumentType";
9
- NodeType[NodeType["Element"] = 2] = "Element";
10
- NodeType[NodeType["Text"] = 3] = "Text";
11
- NodeType[NodeType["CDATA"] = 4] = "CDATA";
12
- NodeType[NodeType["Comment"] = 5] = "Comment";
13
- })(NodeType || (NodeType = {}));
5
+ require('@highlight-run/rrweb-snapshot');
14
6
 
15
7
  const DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +
16
8
  '\r\n' +
@@ -2,15 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var NodeType;
6
- (function (NodeType) {
7
- NodeType[NodeType["Document"] = 0] = "Document";
8
- NodeType[NodeType["DocumentType"] = 1] = "DocumentType";
9
- NodeType[NodeType["Element"] = 2] = "Element";
10
- NodeType[NodeType["Text"] = 3] = "Text";
11
- NodeType[NodeType["CDATA"] = 4] = "CDATA";
12
- NodeType[NodeType["Comment"] = 5] = "Comment";
13
- })(NodeType || (NodeType = {}));
5
+ var rrwebSnapshot = require('@highlight-run/rrweb-snapshot');
14
6
 
15
7
  const DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +
16
8
  '\r\n' +
@@ -206,6 +198,8 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
206
198
  createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7DQogICAgICAgICAgICBjb25zdCBpZCA9IGAke3dpZHRofS0ke2hlaWdodH1gOw0KICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsNCiAgICAgICAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7DQogICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSB5aWVsZCBvZmZzY3JlZW4uY29udmVydFRvQmxvYigpOw0KICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOw0KICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgIHJldHVybiBiYXNlNjQ7DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBjb25zdCB3b3JrZXIgPSBzZWxmOw0KICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgaWYgKCEoJ09mZnNjcmVlbkNhbnZhcycgaW4gZ2xvYmFsVGhpcykpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkOiBlLmRhdGEuaWQgfSk7DQogICAgICAgICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQgfSA9IGUuZGF0YTsNCiAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOw0KICAgICAgICAgICAgYml0bWFwLmNsb3NlKCk7DQogICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoKTsNCiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHlpZWxkIGJsb2IuYXJyYXlCdWZmZXIoKTsNCiAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOw0KICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICBpZCwNCiAgICAgICAgICAgICAgICB0eXBlLA0KICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICB3aWR0aCwNCiAgICAgICAgICAgICAgICBoZWlnaHQsDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);
207
199
  /* eslint-enable */
208
200
 
201
+ rrwebSnapshot.createMirror();
202
+
209
203
  // DEFLATE is a complex format; to read this code, you should probably check the RFC first:
210
204
 
211
205
  // aliases for shorter compressed code (most minifers don't do this)