inspector-ng 0.0.4 → 0.0.6

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.
@@ -39,6 +39,16 @@ export class inspectorComponent {
39
39
  this.hydrated = signal(false);
40
40
  this.history = signal([]);
41
41
  this.historyIndex = signal(-1);
42
+ this.handleCapturedClick = (event) => {
43
+ if (!event.shiftKey ||
44
+ !this.canInspectClick(event) ||
45
+ !this.selectElementAtPoint(event)) {
46
+ return;
47
+ }
48
+ event.preventDefault();
49
+ event.stopPropagation();
50
+ event.stopImmediatePropagation();
51
+ };
42
52
  this.draggingGuideId = null;
43
53
  this.selectedElement = null;
44
54
  this.hoverElement = null;
@@ -65,7 +75,14 @@ export class inspectorComponent {
65
75
  });
66
76
  }
67
77
  ngOnInit() {
68
- if (!this.isBrowser || !this.persistOnReload) {
78
+ if (!this.isBrowser) {
79
+ this.hydrated.set(true);
80
+ return;
81
+ }
82
+ window.addEventListener('click', this.handleCapturedClick, {
83
+ capture: true,
84
+ });
85
+ if (!this.persistOnReload) {
69
86
  this.hydrated.set(true);
70
87
  return;
71
88
  }
@@ -91,6 +108,14 @@ export class inspectorComponent {
91
108
  this.hydrated.set(true);
92
109
  this.refreshTypographyBlocks();
93
110
  }
111
+ ngOnDestroy() {
112
+ if (!this.isBrowser) {
113
+ return;
114
+ }
115
+ window.removeEventListener('click', this.handleCapturedClick, {
116
+ capture: true,
117
+ });
118
+ }
94
119
  setToolMode(mode) {
95
120
  if (!this.enabled()) {
96
121
  this.enabled.set(true);
@@ -278,29 +303,54 @@ export class inspectorComponent {
278
303
  this.guidePreview.set(guide);
279
304
  return;
280
305
  }
281
- if (this.toolMode() !== 'select') {
306
+ if (!this.canInspectClick(event)) {
282
307
  return;
283
308
  }
309
+ this.selectElementAtPoint(event);
310
+ }
311
+ handleViewportChange() {
312
+ if (this.selectedElement && document.contains(this.selectedElement)) {
313
+ this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));
314
+ }
315
+ this.updateDistanceOverlay();
316
+ this.refreshTypographyBlocks();
317
+ }
318
+ canInspectClick(event) {
319
+ if (!this.enabled() || !this.isBrowser || this.toolMode() !== 'select') {
320
+ return false;
321
+ }
322
+ const overlay = this.overlayRoot()?.nativeElement ?? null;
323
+ return !(overlay && overlay.contains(event.target));
324
+ }
325
+ selectElementAtPoint(event) {
326
+ const overlay = this.overlayRoot()?.nativeElement ?? null;
284
327
  const target = getTargetElement({ x: event.clientX, y: event.clientY }, overlay);
285
328
  if (!target) {
286
329
  this.selectedMeasurement.set(null);
287
330
  this.selectedElement = null;
288
331
  this.distanceOverlay.set(null);
289
332
  this.refreshTypographyBlocks();
290
- return;
333
+ return false;
334
+ }
335
+ // Ctrl+click: select the minimum common parent of current selection and clicked element
336
+ if ((event.ctrlKey || event.metaKey) && this.selectedElement) {
337
+ const commonParent = this.findMinimumCommonParent(this.selectedElement, target);
338
+ if (commonParent &&
339
+ commonParent !== document.body &&
340
+ commonParent !== document.documentElement) {
341
+ this.selectedMeasurement.set(getInspectMeasurement(commonParent));
342
+ this.selectedElement = commonParent;
343
+ this.updateDistanceOverlay();
344
+ this.refreshTypographyBlocks();
345
+ return true;
346
+ }
291
347
  }
292
348
  this.selectedMeasurement.set(getInspectMeasurement(target));
293
349
  this.selectedElement = target;
294
350
  this.selectedGuideId.set(this.findGuideAtPoint(event.clientX, event.clientY));
295
351
  this.updateDistanceOverlay();
296
352
  this.refreshTypographyBlocks();
297
- }
298
- handleViewportChange() {
299
- if (this.selectedElement && document.contains(this.selectedElement)) {
300
- this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));
301
- }
302
- this.updateDistanceOverlay();
303
- this.refreshTypographyBlocks();
353
+ return true;
304
354
  }
305
355
  updateDistanceOverlay() {
306
356
  if (!this.altPressed() ||
@@ -397,6 +447,24 @@ export class inspectorComponent {
397
447
  cloneGuides(guides) {
398
448
  return guides.map((guide) => ({ ...guide }));
399
449
  }
450
+ findMinimumCommonParent(elementA, elementB) {
451
+ // Build ancestor chain for element A
452
+ const ancestorsA = new Set();
453
+ let current = elementA;
454
+ while (current) {
455
+ ancestorsA.add(current);
456
+ current = current.parentElement;
457
+ }
458
+ // Walk up from elementB until we find a common ancestor
459
+ current = elementB;
460
+ while (current) {
461
+ if (ancestorsA.has(current)) {
462
+ return current;
463
+ }
464
+ current = current.parentElement;
465
+ }
466
+ return null;
467
+ }
400
468
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
401
469
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: inspectorComponent, isStandalone: true, selector: "inspector-overlay", inputs: { highlightColor: "highlightColor", guideColor: "guideColor", hoverHighlightEnabled: "hoverHighlightEnabled", persistOnReload: "persistOnReload" }, host: { listeners: { "window:keydown": "handleKeydown($event)", "window:keyup": "handleKeyup($event)", "window:pointermove": "handlePointerMove($event)", "window:pointerup": "handlePointerUp()", "window:click": "handleClick($event)", "window:resize": "handleViewportChange()", "window:scroll": "handleViewportChange()" } }, viewQueries: [{ propertyName: "overlayRoot", first: true, predicate: ["overlayRoot"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"inspector-root\" #overlayRoot>\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n title=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n title=\"Typography mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n </button>\n <div class=\"inspector-guide-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--guide-main\"\n [class.is-active]=\"toolMode() === 'guides'\"\n (click)=\"setToolMode('guides')\"\n title=\"Guides mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 2h1v12H4zM11 2h1v12h-1zM2 4h12v1H2zM2 11h12v1H2z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--ghost inspector-icon-button--guide-menu\"\n [class.is-active]=\"guideMenuOpen()\"\n (click)=\"toggleGuideMenu()\"\n title=\"Guide options\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4.47 6.97L8 10.5l3.53-3.53-.94-.94L8 8.62 5.41 6.03z\" />\n </svg>\n </button>\n\n @if (guideMenuOpen()) {\n <div class=\"inspector-guide-menu\">\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'vertical'\"\n (click)=\"setGuideOrientation('vertical')\"\n >\n Vertical\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'horizontal'\"\n (click)=\"setGuideOrientation('horizontal')\"\n >\n Horizontal\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment inspector-segment--danger\"\n (click)=\"clearGuides()\"\n >\n Clear\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:18px;right:18px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail,.inspector-guide-menu{display:flex;gap:4px;padding:4px;border-radius:8px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__rail{align-items:center}.inspector-guide-group{position:relative;display:flex;gap:0;align-items:center;border-radius:6px}.inspector-guide-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:max-content;flex-direction:column;align-items:stretch}.inspector-guide-menu .inspector-segment{justify-content:flex-start;width:100%}.inspector-icon-button,.inspector-segment{display:inline-flex;align-items:center;justify-content:center;height:26px;border:0;border-radius:6px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .12s ease,color .12s ease;font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{width:26px}.inspector-icon-button svg{width:14px;height:14px;fill:currentColor}.inspector-icon-button:hover,.inspector-segment:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active,.inspector-segment.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--ghost.is-active{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button--guide-main{border-radius:6px 0 0 6px}.inspector-icon-button--guide-menu{width:20px;border-radius:0 6px 6px 0}.inspector-icon-button--guide-menu svg{width:12px;height:12px}.inspector-segment{padding:0 8px;white-space:nowrap}.inspector-segment--danger:hover{background:#ef444429;color:#fecaca}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
402
470
  }
@@ -436,4 +504,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
436
504
  type: HostListener,
437
505
  args: ['window:scroll']
438
506
  }] } });
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIscUJBQXFCLEdBQ3RCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixvQkFBb0IsR0FDckIsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBV2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBZ0Q3QixZQUFpQyxVQUFrQjtRQS9DMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7UUFDcEMsZ0JBQVcsR0FBRyxTQUFTLENBQTBCLGFBQWEsQ0FBQyxDQUFDO1FBRWhF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bEMsTUFBTTsyQkFBQyxXQUFXO3lDQTFDdEIsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQW9KTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUYxQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN4QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBd0U5QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCO2dCQVVoQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTZDeEMsb0JBQW9CO3NCQUZuQixZQUFZO3VCQUFDLGVBQWU7O3NCQUM1QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIFBMQVRGT1JNX0lELFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBHVUlERV9ISVRCT1hfU0laRSxcbiAgR1VJREVfU05BUF9ESVNUQU5DRSxcbiAgaW5zcGVjdG9yX1NUQVRFX1ZFUlNJT04sXG4gIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zcGVjdE1lYXN1cmVtZW50LFxuICBnZXRSZWN0RnJvbURvbSxcbiAgZ2V0VGFyZ2V0RWxlbWVudCxcbiAgZ2V0VmlzaWJsZVRleHRCbG9ja3MsXG59IGZyb20gJy4vZG9tJztcbmltcG9ydCB7IGdldERpc3RhbmNlT3ZlcmxheSB9IGZyb20gJy4vZGlzdGFuY2VzJztcbmltcG9ydCB7IGNsYW1wLCBnZXRWaWV3cG9ydFNpemUsIHJlY3RzRXF1YWwgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIERpc3RhbmNlT3ZlcmxheSxcbiAgR3VpZGUsXG4gIEd1aWRlT3JpZW50YXRpb24sXG4gIEluc3BlY3RNZWFzdXJlbWVudCxcbiAgaW5zcGVjdG9yUGVyc2lzdGVkU3RhdGUsXG4gIFJlY3QsXG4gIFRleHRCbG9ja0Fubm90YXRpb24sXG4gIFRvb2xNb2RlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUlkLCBmb3JtYXRWYWx1ZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbnNwZWN0b3Itb3ZlcmxheScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5zcGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2luc3BlY3Rvci5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIGluc3BlY3RvckNvbXBvbmVudCB7XG4gIHJlYWRvbmx5IE1hdGggPSBNYXRoO1xuICByZWFkb25seSBmb3JtYXRWYWx1ZSA9IGZvcm1hdFZhbHVlO1xuICByZWFkb25seSBndWlkZUhpdGJveFNpemUgPSBHVUlERV9ISVRCT1hfU0laRTtcbiAgcmVhZG9ubHkgb3ZlcmxheVJvb3QgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdvdmVybGF5Um9vdCcpO1xuXG4gIEBJbnB1dCgpIGhpZ2hsaWdodENvbG9yID0gJyM0ZjhjZmYnO1xuICBASW5wdXQoKSBndWlkZUNvbG9yID0gJyNmZjdhMDAnO1xuICBASW5wdXQoKSBob3ZlckhpZ2hsaWdodEVuYWJsZWQgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJzaXN0T25SZWxvYWQgPSBmYWxzZTtcblxuICByZWFkb25seSBlbmFibGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgdG9vbE1vZGUgPSBzaWduYWw8VG9vbE1vZGU+KCdub25lJyk7XG4gIHJlYWRvbmx5IGd1aWRlT3JpZW50YXRpb24gPSBzaWduYWw8R3VpZGVPcmllbnRhdGlvbj4oJ3ZlcnRpY2FsJyk7XG4gIHJlYWRvbmx5IGd1aWRlcyA9IHNpZ25hbDxHdWlkZVtdPihbXSk7XG4gIHJlYWRvbmx5IGhvdmVyUmVjdCA9IHNpZ25hbDxSZWN0IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkR3VpZGVJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZWFzdXJlbWVudCA9IHNpZ25hbDxJbnNwZWN0TWVhc3VyZW1lbnQgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2hvd1R5cG9ncmFwaHkgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IGFsdFByZXNzZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBkaXN0YW5jZU92ZXJsYXkgPSBzaWduYWw8RGlzdGFuY2VPdmVybGF5IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHRleHRCbG9ja3MgPSBzaWduYWw8VGV4dEJsb2NrQW5ub3RhdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGd1aWRlTWVudU9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBndWlkZVByZXZpZXcgPSBzaWduYWw8R3VpZGUgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBzZWxlY3RlZE1ldGFMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50KCk7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7c2VsZWN0ZWQubGFiZWx9IMK3ICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQucmVjdC53aWR0aCl9IHggJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5yZWN0LmhlaWdodCl9IMK3ICR7c2VsZWN0ZWQuc3R5bGVzLmZvbnRTaXplfSAvICR7c2VsZWN0ZWQuc3R5bGVzLmxpbmVIZWlnaHR9IC8gJHtzZWxlY3RlZC5zdHlsZXMuY29sb3J9YDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0Jyb3dzZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaHlkcmF0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnkgPSBzaWduYWw8R3VpZGVbXVtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeUluZGV4ID0gc2lnbmFsKC0xKTtcbiAgcHJpdmF0ZSBkcmFnZ2luZ0d1aWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcmVhZG9ubHkgY2FuVW5kbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPiAwKTtcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCgpID49IDAgJiZcbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4KCkgPCB0aGlzLmhpc3RvcnkoKS5sZW5ndGggLSAxLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBlcnNpc3RPblJlbG9hZCB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMuaHlkcmF0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQ6IGluc3BlY3RvclBlcnNpc3RlZFN0YXRlID0ge1xuICAgICAgICB2ZXJzaW9uOiBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTixcbiAgICAgICAgZW5hYmxlZDogdGhpcy5lbmFibGVkKCksXG4gICAgICAgIHRvb2xNb2RlOiB0aGlzLnRvb2xNb2RlKCksXG4gICAgICAgIGd1aWRlT3JpZW50YXRpb246IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpLFxuICAgICAgICBndWlkZXM6IHRoaXMuZ3VpZGVzKCksXG4gICAgICAgIHNob3dUeXBvZ3JhcGh5OiB0aGlzLnNob3dUeXBvZ3JhcGh5KCksXG4gICAgICB9O1xuXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5wZXJzaXN0T25SZWxvYWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShpbnNwZWN0b3JfU1RPUkFHRV9LRVkpO1xuICAgIGlmICghc3RvcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdG9yZWQpIGFzIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlO1xuICAgICAgaWYgKHBhcnNlZC52ZXJzaW9uID09PSBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTikge1xuICAgICAgICB0aGlzLmVuYWJsZWQuc2V0KHBhcnNlZC5lbmFibGVkKTtcbiAgICAgICAgdGhpcy50b29sTW9kZS5zZXQocGFyc2VkLnRvb2xNb2RlKTtcbiAgICAgICAgdGhpcy5ndWlkZU9yaWVudGF0aW9uLnNldChwYXJzZWQuZ3VpZGVPcmllbnRhdGlvbik7XG4gICAgICAgIHRoaXMuZ3VpZGVzLnNldChwYXJzZWQuZ3VpZGVzID8/IFtdKTtcbiAgICAgICAgdGhpcy5zaG93VHlwb2dyYXBoeS5zZXQocGFyc2VkLnNob3dUeXBvZ3JhcGh5ID8/IHRydWUpO1xuICAgICAgICB0aGlzLnJlY29yZEhpc3RvcnkocGFyc2VkLmd1aWRlcyA/PyBbXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgbWFsZm9ybWVkIHN0YXRlXG4gICAgfVxuXG4gICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgc2V0VG9vbE1vZGUobW9kZTogVG9vbE1vZGUpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZWQuc2V0KHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMudG9vbE1vZGUuc2V0KHRoaXMudG9vbE1vZGUoKSA9PT0gbW9kZSA/ICdub25lJyA6IG1vZGUpO1xuICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHNldEd1aWRlT3JpZW50YXRpb24ob3JpZW50YXRpb246IEd1aWRlT3JpZW50YXRpb24pIHtcbiAgICB0aGlzLmd1aWRlT3JpZW50YXRpb24uc2V0KG9yaWVudGF0aW9uKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gIH1cblxuICB0b2dnbGVUeXBvZ3JhcGh5KCkge1xuICAgIHRoaXMuc2hvd1R5cG9ncmFwaHkudXBkYXRlKCh2YWx1ZSkgPT4gIXZhbHVlKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICB0b2dnbGVHdWlkZU1lbnUoKSB7XG4gICAgdGhpcy5ndWlkZU1lbnVPcGVuLnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gIH1cblxuICBjbGVhckd1aWRlcygpIHtcbiAgICB0aGlzLmd1aWRlcy5zZXQoW10pO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICB0aGlzLnJlY29yZEhpc3RvcnkoW10pO1xuICB9XG5cbiAgdHJhY2tHdWlkZSA9IChfaW5kZXg6IG51bWJlciwgZ3VpZGU6IEd1aWRlKSA9PiBndWlkZS5pZDtcbiAgdHJhY2tUZXh0QmxvY2sgPSAoX2luZGV4OiBudW1iZXIsIGJsb2NrOiBUZXh0QmxvY2tBbm5vdGF0aW9uKSA9PiBibG9jay5pZDtcbiAgdHJhY2tDb25uZWN0b3IgPSAoXG4gICAgX2luZGV4OiBudW1iZXIsXG4gICAgY29ubmVjdG9yOiBEaXN0YW5jZU92ZXJsYXlbJ2Nvbm5lY3RvcnMnXVtudW1iZXJdLFxuICApID0+IGAke2Nvbm5lY3Rvci54MX06JHtjb25uZWN0b3IueTF9OiR7Y29ubmVjdG9yLngyfToke2Nvbm5lY3Rvci55Mn1gO1xuXG4gIHN0YXJ0R3VpZGVEcmFnKGV2ZW50OiBQb2ludGVyRXZlbnQsIGd1aWRlOiBHdWlkZSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBndWlkZS5pZDtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQoZ3VpZGUuaWQpO1xuICB9XG5cbiAgZm9ybWF0RWRnZXMoZWRnZXM6IEluc3BlY3RNZWFzdXJlbWVudFsncGFkZGluZyddKSB7XG4gICAgcmV0dXJuIGAke2Zvcm1hdFZhbHVlKGVkZ2VzLnRvcCl9ICR7Zm9ybWF0VmFsdWUoZWRnZXMucmlnaHQpfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmJvdHRvbSl9ICR7Zm9ybWF0VmFsdWUoZWRnZXMubGVmdCl9YDtcbiAgfVxuXG4gIGZvcm1hdEdhcChzZWxlY3RlZDogSW5zcGVjdE1lYXN1cmVtZW50KSB7XG4gICAgcmV0dXJuIGAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5yb3cpfSAvICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQuZ2FwLmNvbHVtbil9YDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5lbmFibGVkLnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoW10pO1xuICAgICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJiBrZXkgPT09ICd6Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy5yZWRvKCkgOiB0aGlzLnVuZG8oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAncycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdzZWxlY3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdndWlkZXMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAndicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0FsdCcpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgIHRoaXMuY2xlYXJHdWlkZXMoKTtcbiAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKGtleSA9PT0gJ2JhY2tzcGFjZScgfHwga2V5ID09PSAnZGVsZXRlJykgJiYgdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG5leHRHdWlkZXMgPSB0aGlzLmd1aWRlcygpLmZpbHRlcihcbiAgICAgICAgKGd1aWRlKSA9PiBndWlkZS5pZCAhPT0gdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnJlY29yZEhpc3RvcnkobmV4dEd1aWRlcyk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQWx0Jykge1xuICAgICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJtb3ZlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KFxuICAgICAgICB0aGlzLmd1aWRlcygpLm1hcCgoZ3VpZGUpID0+IHtcbiAgICAgICAgICBpZiAoZ3VpZGUuaWQgIT09IHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3VpZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgICAgICAgY29uc3QgbWF4ID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZ3VpZGUsIHBvc2l0aW9uOiBjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpID8/XG4gICAgICAgIGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldCh0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnIHx8ICF0aGlzLmhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmFsdFByZXNzZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBnZXRSZWN0RnJvbURvbSh0YXJnZXQpO1xuICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghcmVjdHNFcXVhbChyZWN0LCB0aGlzLmhvdmVyUmVjdCgpKSkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KHJlY3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnKVxuICBoYW5kbGVQb2ludGVyVXAoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZEhpc3RvcnkodGhpcy5ndWlkZXMoKSk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBudWxsO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICBpZiAob3ZlcmxheSAmJiBvdmVybGF5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBndWlkZSA9IHRoaXMuZ2V0R3VpZGVQcmV2aWV3KGV2ZW50KTtcbiAgICAgIHRoaXMuYWRkR3VpZGUoeyAuLi5ndWlkZSwgaWQ6IGNyZWF0ZUlkKCkgfSk7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQoZ3VpZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgb3ZlcmxheSxcbiAgICApO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KHRhcmdldCkpO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChcbiAgICAgIHRoaXMuZmluZEd1aWRlQXRQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICApO1xuICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBoYW5kbGVWaWV3cG9ydENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzdGFuY2VPdmVybGF5KCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFsdFByZXNzZWQoKSB8fFxuICAgICAgIXRoaXMuc2VsZWN0ZWRFbGVtZW50IHx8XG4gICAgICAhdGhpcy5ob3ZlckVsZW1lbnQgfHxcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID09PSB0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuY29udGFpbnModGhpcy5ob3ZlckVsZW1lbnQpIHx8XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudC5jb250YWlucyh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQoXG4gICAgICBnZXREaXN0YW5jZU92ZXJsYXkoXG4gICAgICAgIGdldFJlY3RGcm9tRG9tKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSxcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5ob3ZlckVsZW1lbnQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5zaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoXG4gICAgICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyh0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbClcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+XG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA8PSB2aWV3cG9ydC5oZWlnaHQgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LmxlZnQgPD0gdmlld3BvcnQud2lkdGgsXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYmxvY2spID0+ICh7XG4gICAgICAgICAgLi4uYmxvY2ssXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgLi4uYmxvY2sucmVjdCxcbiAgICAgICAgICAgIGxlZnQ6IGNsYW1wKGJsb2NrLnJlY3QubGVmdCwgMCwgdmlld3BvcnQud2lkdGggLSAxMiksXG4gICAgICAgICAgICB0b3A6IGNsYW1wKGJsb2NrLnJlY3QudG9wLCAxNCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkR3VpZGUoZ3VpZGU6IEd1aWRlKSB7XG4gICAgY29uc3QgbmV4dEd1aWRlcyA9IFsuLi50aGlzLmd1aWRlcygpLCBndWlkZV07XG4gICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChndWlkZS5pZCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHdWlkZVByZXZpZXcoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQpOiBHdWlkZSB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpO1xuICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgIG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3QgbWF4ID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyB2aWV3cG9ydC53aWR0aCA6IHZpZXdwb3J0LmhlaWdodDtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3ByZXZpZXcnLFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBwb3NpdGlvbjogdGhpcy5zbmFwR3VpZGUoY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNuYXBHdWlkZShwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSBwb3NpdGlvbikgPD0gR1VJREVfU05BUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gZ3VpZGUucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEd1aWRlQXRQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgZ3VpZGUgb2YgdGhpcy5ndWlkZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICBNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHgpIDw9IEdVSURFX0hJVEJPWF9TSVpFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLmlkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geSkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmRvKCkge1xuICAgIGlmICghdGhpcy5jYW5VbmRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSAtIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRvKCkge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSArIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvcmRIaXN0b3J5KGd1aWRlczogR3VpZGVbXSkge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmhpc3RvcnkoKS5zbGljZSgwLCB0aGlzLmhpc3RvcnlJbmRleCgpICsgMSk7XG4gICAgYmFzZS5wdXNoKHRoaXMuY2xvbmVHdWlkZXMoZ3VpZGVzKSk7XG4gICAgdGhpcy5oaXN0b3J5LnNldChiYXNlKTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQoYmFzZS5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVHdWlkZXMoZ3VpZGVzOiBHdWlkZVtdKSB7XG4gICAgcmV0dXJuIGd1aWRlcy5tYXAoKGd1aWRlKSA9PiAoeyAuLi5ndWlkZSB9KSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbnNwZWN0b3Itcm9vdFwiICNvdmVybGF5Um9vdD5cbiAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yYWlsXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ3NlbGVjdCdcIlxuICAgICAgICAoY2xpY2spPVwic2V0VG9vbE1vZGUoJ3NlbGVjdCcpXCJcbiAgICAgICAgdGl0bGU9XCJTZWxlY3QgbW9kZVwiXG4gICAgICA+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMyAybDggOC0zIC43TDYuNyAxMyA2IDEwIDMgMnpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b25cIlxuICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInNob3dUeXBvZ3JhcGh5KClcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlVHlwb2dyYXBoeSgpXCJcbiAgICAgICAgdGl0bGU9XCJUeXBvZ3JhcGh5IG1vZGVcIlxuICAgICAgPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMgNFYyaDEwdjJoLTR2MTBIN1Y0elwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWdyb3VwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvbiBpbnNwZWN0b3ItaWNvbi1idXR0b24tLWd1aWRlLW1haW5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ2d1aWRlcydcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUb29sTW9kZSgnZ3VpZGVzJylcIlxuICAgICAgICAgIHRpdGxlPVwiR3VpZGVzIG1vZGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQgMmgxdjEySDR6TTExIDJoMXYxMmgtMXpNMiA0aDEydjFIMnpNMiAxMWgxMnYxSDJ6XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uIGluc3BlY3Rvci1pY29uLWJ1dHRvbi0tZ2hvc3QgaW5zcGVjdG9yLWljb24tYnV0dG9uLS1ndWlkZS1tZW51XCJcbiAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cImd1aWRlTWVudU9wZW4oKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUd1aWRlTWVudSgpXCJcbiAgICAgICAgICB0aXRsZT1cIkd1aWRlIG9wdGlvbnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuNDcgNi45N0w4IDEwLjVsMy41My0zLjUzLS45NC0uOTRMOCA4LjYyIDUuNDEgNi4wM3pcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICBAaWYgKGd1aWRlTWVudU9wZW4oKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUtbWVudVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3Itc2VnbWVudFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiZ3VpZGVPcmllbnRhdGlvbigpID09PSAndmVydGljYWwnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBWZXJ0aWNhbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1zZWdtZW50XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJndWlkZU9yaWVudGF0aW9uKCkgPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRHdWlkZU9yaWVudGF0aW9uKCdob3Jpem9udGFsJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBIb3Jpem9udGFsXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXNlZ21lbnQgaW5zcGVjdG9yLXNlZ21lbnQtLWRhbmdlclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckd1aWRlcygpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgdG9vbE1vZGUoKSA9PT0gXCJzZWxlY3RcIikge1xuICAgIEBpZiAoaG92ZXJSZWN0KCkgJiYgaG92ZXJIaWdobGlnaHRFbmFibGVkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1ob3ZlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdmVyUmVjdCgpIS5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJob3ZlclJlY3QoKSEudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhvdmVyUmVjdCgpIS53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaG92ZXJSZWN0KCkhLmhlaWdodFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1hY2NlbnRdPVwiaGlnaGxpZ2h0Q29sb3JcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoc2VsZWN0ZWRNZWFzdXJlbWVudCgpOyBhcyBzZWxlY3RlZCkge1xuICAgICAgQGlmIChzZWxlY3RlZC5nYXAuYWN0aXZlICYmIHNlbGVjdGVkLnBhcmVudFJlY3QpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcFwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3Qud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC5oZWlnaHRcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcCAtIDhcIlxuICAgICAgICA+XG4gICAgICAgICAgRyB7eyBmb3JtYXRHYXAoc2VsZWN0ZWQpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1tYXJnaW5cIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcCAtIDhcIlxuICAgICAgPlxuICAgICAgICBNIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLm1hcmdpbikgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1zZWxlY3RlZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucmVjdC5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci1sYWJlbFwiPnt7IHNlbGVjdGVkTWV0YUxpbmUoKSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICBzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3AgKyBzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHQgKyA4XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIFAge3sgZm9ybWF0RWRnZXMoc2VsZWN0ZWQucGFkZGluZykgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICBAZm9yIChibG9jayBvZiB0ZXh0QmxvY2tzKCk7IHRyYWNrIGJsb2NrLmlkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXRleHQtY2hpcFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImJsb2NrLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiYmxvY2sucmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBfX3N3YXRjaFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiYmxvY2suc3R5bGVzLmNvbG9yXCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmZvbnRTaXplIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMubGluZUhlaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmNvbG9yIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgYWx0UHJlc3NlZCgpICYmIGRpc3RhbmNlT3ZlcmxheSgpOyBhcyBkaXN0YW5jZSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0QS5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEEudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0QS53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RBLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0Qi5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEIudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0Qi53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RCLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICBjb25uZWN0b3Igb2YgZGlzdGFuY2UuY29ubmVjdG9ycztcbiAgICAgIHRyYWNrIHRyYWNrQ29ubmVjdG9yKCRpbmRleCwgY29ubmVjdG9yKVxuICAgICkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb25uZWN0b3JcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0tdmVydGljYWxdPVwiY29ubmVjdG9yLngxID09PSBjb25uZWN0b3IueDJcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0taG9yaXpvbnRhbF09XCJjb25uZWN0b3IueTEgPT09IGNvbm5lY3Rvci55MlwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci54MSwgY29ubmVjdG9yLngyKVwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiTWF0aC5taW4oY29ubmVjdG9yLnkxLCBjb25uZWN0b3IueTIpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIk1hdGgubWF4KDEsIE1hdGguYWJzKGNvbm5lY3Rvci54MiAtIGNvbm5lY3Rvci54MSkpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueTIgLSBjb25uZWN0b3IueTEpKVwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChkaXN0YW5jZS5ob3Jpem9udGFsICYmIGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLWhvcml6b250YWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBNYXRoLm1pbihkaXN0YW5jZS5ob3Jpem9udGFsLngxISwgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55IVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJcbiAgICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS5ob3Jpem9udGFsLngyISAtIGRpc3RhbmNlLmhvcml6b250YWwueDEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAoZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEgKyBkaXN0YW5jZS5ob3Jpem9udGFsLngyISkgLyAyXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55ISArIDEwXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UuaG9yaXpvbnRhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UudmVydGljYWwgJiYgZGlzdGFuY2UudmVydGljYWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCFcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGRpc3RhbmNlLnZlcnRpY2FsLnkxISwgZGlzdGFuY2UudmVydGljYWwueTIhKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UudmVydGljYWwueTIhIC0gZGlzdGFuY2UudmVydGljYWwueTEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWcgaW5zcGVjdG9yLWRpc3RhbmNlLXRhZy0tdmVydGljYWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS52ZXJ0aWNhbC54ISArIDEwXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZGlzdGFuY2UudmVydGljYWwueTEhICsgZGlzdGFuY2UudmVydGljYWwueTIhKSAvIDJcIlxuICAgICAgPlxuICAgICAgICB7eyBmb3JtYXRWYWx1ZShkaXN0YW5jZS52ZXJ0aWNhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpKSB7XG4gICAgQGlmICh0b29sTW9kZSgpID09PSBcImd1aWRlc1wiKSB7XG4gICAgICBAaWYgKGd1aWRlUHJldmlldygpOyBhcyBwcmV2aWV3KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ndWlkZSBpbnNwZWN0b3ItZ3VpZGUtLXByZXZpZXdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXZlcnRpY2FsXT1cInByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcHJldmlldy5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKGd1aWRlIG9mIGd1aWRlcygpOyB0cmFjayBndWlkZS5pZCkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGVcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXNlbGVjdGVkXT1cInNlbGVjdGVkR3VpZGVJZCgpID09PSBndWlkZS5pZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZ3VpZGUucG9zaXRpb24gOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJzdGFydEd1aWRlRHJhZygkZXZlbnQsIGd1aWRlKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIscUJBQXFCLEdBQ3RCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixvQkFBb0IsR0FDckIsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBV2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBNkQ3QixZQUFpQyxVQUFrQjtRQTVEMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7UUFDcEMsZ0JBQVcsR0FBRyxTQUFTLENBQTBCLGFBQWEsQ0FBQyxDQUFDO1FBRWhF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QyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxPQUFzQixDQUFDO1lBQ2hDLENBQUM7WUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNsQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOytHQWxsQlUsa0JBQWtCLGtCQTZEVCxXQUFXO21HQTdEcEIsa0JBQWtCLHlxQkNqRC9CLDhrVUFpU0E7OzRGRGhQYSxrQkFBa0I7a0JBUjlCLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUCxFQUFFLG1CQUdNLHVCQUF1QixDQUFDLE1BQU07OzBCQStEbEMsTUFBTTsyQkFBQyxXQUFXO3lDQXZEdEIsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQW9MTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUYxQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN4QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBd0U5QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCO2dCQVVoQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTJCeEMsb0JBQW9CO3NCQUZuQixZQUFZO3VCQUFDLGVBQWU7O3NCQUM1QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgUExBVEZPUk1fSUQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEdVSURFX0hJVEJPWF9TSVpFLFxuICBHVUlERV9TTkFQX0RJU1RBTkNFLFxuICBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTixcbiAgaW5zcGVjdG9yX1NUT1JBR0VfS0VZLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBnZXRJbnNwZWN0TWVhc3VyZW1lbnQsXG4gIGdldFJlY3RGcm9tRG9tLFxuICBnZXRUYXJnZXRFbGVtZW50LFxuICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyxcbn0gZnJvbSAnLi9kb20nO1xuaW1wb3J0IHsgZ2V0RGlzdGFuY2VPdmVybGF5IH0gZnJvbSAnLi9kaXN0YW5jZXMnO1xuaW1wb3J0IHsgY2xhbXAsIGdldFZpZXdwb3J0U2l6ZSwgcmVjdHNFcXVhbCB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHtcbiAgRGlzdGFuY2VPdmVybGF5LFxuICBHdWlkZSxcbiAgR3VpZGVPcmllbnRhdGlvbixcbiAgSW5zcGVjdE1lYXN1cmVtZW50LFxuICBpbnNwZWN0b3JQZXJzaXN0ZWRTdGF0ZSxcbiAgUmVjdCxcbiAgVGV4dEJsb2NrQW5ub3RhdGlvbixcbiAgVG9vbE1vZGUsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlSWQsIGZvcm1hdFZhbHVlIH0gZnJvbSAnLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2luc3BlY3Rvci1vdmVybGF5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vaW5zcGVjdG9yLmNvbXBvbmVudC5jc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgaW5zcGVjdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgTWF0aCA9IE1hdGg7XG4gIHJlYWRvbmx5IGZvcm1hdFZhbHVlID0gZm9ybWF0VmFsdWU7XG4gIHJlYWRvbmx5IGd1aWRlSGl0Ym94U2l6ZSA9IEdVSURFX0hJVEJPWF9TSVpFO1xuICByZWFkb25seSBvdmVybGF5Um9vdCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ292ZXJsYXlSb290Jyk7XG5cbiAgQElucHV0KCkgaGlnaGxpZ2h0Q29sb3IgPSAnIzRmOGNmZic7XG4gIEBJbnB1dCgpIGd1aWRlQ29sb3IgPSAnI2ZmN2EwMCc7XG4gIEBJbnB1dCgpIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCA9IHRydWU7XG4gIEBJbnB1dCgpIHBlcnNpc3RPblJlbG9hZCA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IGVuYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB0b29sTW9kZSA9IHNpZ25hbDxUb29sTW9kZT4oJ25vbmUnKTtcbiAgcmVhZG9ubHkgZ3VpZGVPcmllbnRhdGlvbiA9IHNpZ25hbDxHdWlkZU9yaWVudGF0aW9uPigndmVydGljYWwnKTtcbiAgcmVhZG9ubHkgZ3VpZGVzID0gc2lnbmFsPEd1aWRlW10+KFtdKTtcbiAgcmVhZG9ubHkgaG92ZXJSZWN0ID0gc2lnbmFsPFJlY3QgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRHdWlkZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZE1lYXN1cmVtZW50ID0gc2lnbmFsPEluc3BlY3RNZWFzdXJlbWVudCB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzaG93VHlwb2dyYXBoeSA9IHNpZ25hbCh0cnVlKTtcbiAgcmVhZG9ubHkgYWx0UHJlc3NlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc3RhbmNlT3ZlcmxheSA9IHNpZ25hbDxEaXN0YW5jZU92ZXJsYXkgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdGV4dEJsb2NrcyA9IHNpZ25hbDxUZXh0QmxvY2tBbm5vdGF0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgZ3VpZGVNZW51T3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGd1aWRlUHJldmlldyA9IHNpZ25hbDxHdWlkZSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkTWV0YUxpbmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQoKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgJHtzZWxlY3RlZC5sYWJlbH0gwrcgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5yZWN0LndpZHRoKX0geCAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3QuaGVpZ2h0KX0gwrcgJHtzZWxlY3RlZC5zdHlsZXMuZm9udFNpemV9IC8gJHtzZWxlY3RlZC5zdHlsZXMubGluZUhlaWdodH0gLyAke3NlbGVjdGVkLnN0eWxlcy5jb2xvcn1gO1xuICB9KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBoeWRyYXRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeSA9IHNpZ25hbDxHdWlkZVtdW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5SW5kZXggPSBzaWduYWwoLTEpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNhcHR1cmVkQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoXG4gICAgICAhZXZlbnQuc2hpZnRLZXkgfHxcbiAgICAgICF0aGlzLmNhbkluc3BlY3RDbGljayhldmVudCkgfHxcbiAgICAgICF0aGlzLnNlbGVjdEVsZW1lbnRBdFBvaW50KGV2ZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH07XG4gIHByaXZhdGUgZHJhZ2dpbmdHdWlkZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3RlZEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHJlYWRvbmx5IGNhblVuZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhpc3RvcnlJbmRleCgpID4gMCk7XG4gIHJlYWRvbmx5IGNhblJlZG8gPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgoKSA+PSAwICYmXG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCgpIDwgdGhpcy5oaXN0b3J5KCkubGVuZ3RoIC0gMSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBvYmplY3QpIHtcbiAgICB0aGlzLmlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5wZXJzaXN0T25SZWxvYWQgfHwgIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmh5ZHJhdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkOiBpbnNwZWN0b3JQZXJzaXN0ZWRTdGF0ZSA9IHtcbiAgICAgICAgdmVyc2lvbjogaW5zcGVjdG9yX1NUQVRFX1ZFUlNJT04sXG4gICAgICAgIGVuYWJsZWQ6IHRoaXMuZW5hYmxlZCgpLFxuICAgICAgICB0b29sTW9kZTogdGhpcy50b29sTW9kZSgpLFxuICAgICAgICBndWlkZU9yaWVudGF0aW9uOiB0aGlzLmd1aWRlT3JpZW50YXRpb24oKSxcbiAgICAgICAgZ3VpZGVzOiB0aGlzLmd1aWRlcygpLFxuICAgICAgICBzaG93VHlwb2dyYXBoeTogdGhpcy5zaG93VHlwb2dyYXBoeSgpLFxuICAgICAgfTtcblxuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICBpbnNwZWN0b3JfU1RPUkFHRV9LRVksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2FwdHVyZWRDbGljaywge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5wZXJzaXN0T25SZWxvYWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShpbnNwZWN0b3JfU1RPUkFHRV9LRVkpO1xuICAgIGlmICghc3RvcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdG9yZWQpIGFzIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlO1xuICAgICAgaWYgKHBhcnNlZC52ZXJzaW9uID09PSBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTikge1xuICAgICAgICB0aGlzLmVuYWJsZWQuc2V0KHBhcnNlZC5lbmFibGVkKTtcbiAgICAgICAgdGhpcy50b29sTW9kZS5zZXQocGFyc2VkLnRvb2xNb2RlKTtcbiAgICAgICAgdGhpcy5ndWlkZU9yaWVudGF0aW9uLnNldChwYXJzZWQuZ3VpZGVPcmllbnRhdGlvbik7XG4gICAgICAgIHRoaXMuZ3VpZGVzLnNldChwYXJzZWQuZ3VpZGVzID8/IFtdKTtcbiAgICAgICAgdGhpcy5zaG93VHlwb2dyYXBoeS5zZXQocGFyc2VkLnNob3dUeXBvZ3JhcGh5ID8/IHRydWUpO1xuICAgICAgICB0aGlzLnJlY29yZEhpc3RvcnkocGFyc2VkLmd1aWRlcyA/PyBbXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgbWFsZm9ybWVkIHN0YXRlXG4gICAgfVxuXG4gICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2FwdHVyZWRDbGljaywge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvb2xNb2RlKG1vZGU6IFRvb2xNb2RlKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5lbmFibGVkLnNldCh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnRvb2xNb2RlLnNldCh0aGlzLnRvb2xNb2RlKCkgPT09IG1vZGUgPyAnbm9uZScgOiBtb2RlKTtcbiAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBzZXRHdWlkZU9yaWVudGF0aW9uKG9yaWVudGF0aW9uOiBHdWlkZU9yaWVudGF0aW9uKSB7XG4gICAgdGhpcy5ndWlkZU9yaWVudGF0aW9uLnNldChvcmllbnRhdGlvbik7XG4gICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICB9XG5cbiAgdG9nZ2xlVHlwb2dyYXBoeSgpIHtcbiAgICB0aGlzLnNob3dUeXBvZ3JhcGh5LnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgdG9nZ2xlR3VpZGVNZW51KCkge1xuICAgIHRoaXMuZ3VpZGVNZW51T3Blbi51cGRhdGUoKHZhbHVlKSA9PiAhdmFsdWUpO1xuICB9XG5cbiAgY2xlYXJHdWlkZXMoKSB7XG4gICAgdGhpcy5ndWlkZXMuc2V0KFtdKTtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KFtdKTtcbiAgfVxuXG4gIHRyYWNrR3VpZGUgPSAoX2luZGV4OiBudW1iZXIsIGd1aWRlOiBHdWlkZSkgPT4gZ3VpZGUuaWQ7XG4gIHRyYWNrVGV4dEJsb2NrID0gKF9pbmRleDogbnVtYmVyLCBibG9jazogVGV4dEJsb2NrQW5ub3RhdGlvbikgPT4gYmxvY2suaWQ7XG4gIHRyYWNrQ29ubmVjdG9yID0gKFxuICAgIF9pbmRleDogbnVtYmVyLFxuICAgIGNvbm5lY3RvcjogRGlzdGFuY2VPdmVybGF5Wydjb25uZWN0b3JzJ11bbnVtYmVyXSxcbiAgKSA9PiBgJHtjb25uZWN0b3IueDF9OiR7Y29ubmVjdG9yLnkxfToke2Nvbm5lY3Rvci54Mn06JHtjb25uZWN0b3IueTJ9YDtcblxuICBzdGFydEd1aWRlRHJhZyhldmVudDogUG9pbnRlckV2ZW50LCBndWlkZTogR3VpZGUpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gZ3VpZGUuaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgfVxuXG4gIGZvcm1hdEVkZ2VzKGVkZ2VzOiBJbnNwZWN0TWVhc3VyZW1lbnRbJ3BhZGRpbmcnXSkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShlZGdlcy50b3ApfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLnJpZ2h0KX0gJHtmb3JtYXRWYWx1ZShlZGdlcy5ib3R0b20pfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmxlZnQpfWA7XG4gIH1cblxuICBmb3JtYXRHYXAoc2VsZWN0ZWQ6IEluc3BlY3RNZWFzdXJlbWVudCkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5nYXAucm93KX0gLyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5jb2x1bW4pfWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZW5hYmxlZC51cGRhdGUoKHZhbHVlKSA9PiAhdmFsdWUpO1xuICAgICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgICB0aGlzLnRvb2xNb2RlLnNldCgnbm9uZScpO1xuICAgICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiYga2V5ID09PSAneicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zaGlmdEtleSA/IHRoaXMucmVkbygpIDogdGhpcy51bmRvKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3MnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRUb29sTW9kZSgnc2VsZWN0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ2cnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRUb29sTW9kZSgnZ3VpZGVzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ2gnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRHdWlkZU9yaWVudGF0aW9uKCdob3Jpem9udGFsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3YnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRHdWlkZU9yaWVudGF0aW9uKCd2ZXJ0aWNhbCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdBbHQnKSB7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZXNjYXBlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB0aGlzLmNsZWFyR3VpZGVzKCk7XG4gICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKChrZXkgPT09ICdiYWNrc3BhY2UnIHx8IGtleSA9PT0gJ2RlbGV0ZScpICYmIHRoaXMuc2VsZWN0ZWRHdWlkZUlkKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBuZXh0R3VpZGVzID0gdGhpcy5ndWlkZXMoKS5maWx0ZXIoXG4gICAgICAgIChndWlkZSkgPT4gZ3VpZGUuaWQgIT09IHRoaXMuc2VsZWN0ZWRHdWlkZUlkKCksXG4gICAgICApO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0FsdCcpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVybW92ZScsIFsnJGV2ZW50J10pXG4gIGhhbmRsZVBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICAgIHRoaXMuZ3VpZGVzLnNldChcbiAgICAgICAgdGhpcy5ndWlkZXMoKS5tYXAoKGd1aWRlKSA9PiB7XG4gICAgICAgICAgaWYgKGd1aWRlLmlkICE9PSB0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGd1aWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByYXdQb3NpdGlvbiA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgICAgICAgIGNvbnN0IG1heCA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZpZXdwb3J0LndpZHRoIDogdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICAgIHJldHVybiB7IC4uLmd1aWRlLCBwb3NpdGlvbjogY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSA/P1xuICAgICAgICBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQodGhpcy5nZXRHdWlkZVByZXZpZXcoZXZlbnQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0JyB8fCAhdGhpcy5ob3ZlckhpZ2hsaWdodEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy5hbHRQcmVzc2VkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldEVsZW1lbnQoXG4gICAgICB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgIHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsLFxuICAgICk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gZ2V0UmVjdEZyb21Eb20odGFyZ2V0KTtcbiAgICB0aGlzLmhvdmVyRWxlbWVudCA9IHRhcmdldDtcbiAgICBpZiAoIXJlY3RzRXF1YWwocmVjdCwgdGhpcy5ob3ZlclJlY3QoKSkpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChyZWN0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cG9pbnRlcnVwJylcbiAgaGFuZGxlUG9pbnRlclVwKCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZ0d1aWRlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KHRoaXMuZ3VpZGVzKCkpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAnZ3VpZGVzJykge1xuICAgICAgaWYgKG92ZXJsYXkgJiYgb3ZlcmxheS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3VpZGUgPSB0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCk7XG4gICAgICB0aGlzLmFkZEd1aWRlKHsgLi4uZ3VpZGUsIGlkOiBjcmVhdGVJZCgpIH0pO1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KGd1aWRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBoYW5kbGVWaWV3cG9ydENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuSW5zcGVjdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICByZXR1cm4gIShvdmVybGF5ICYmIG92ZXJsYXkuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgb3ZlcmxheSxcbiAgICApO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEN0cmwrY2xpY2s6IHNlbGVjdCB0aGUgbWluaW11bSBjb21tb24gcGFyZW50IG9mIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBjbGlja2VkIGVsZW1lbnRcbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvbW1vblBhcmVudCA9IHRoaXMuZmluZE1pbmltdW1Db21tb25QYXJlbnQoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LFxuICAgICAgICB0YXJnZXQsXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBjb21tb25QYXJlbnQgJiZcbiAgICAgICAgY29tbW9uUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICAgIGNvbW1vblBhcmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChnZXRJbnNwZWN0TWVhc3VyZW1lbnQoY29tbW9uUGFyZW50KSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gY29tbW9uUGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KHRhcmdldCkpO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChcbiAgICAgIHRoaXMuZmluZEd1aWRlQXRQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICApO1xuICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEaXN0YW5jZU92ZXJsYXkoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWx0UHJlc3NlZCgpIHx8XG4gICAgICAhdGhpcy5zZWxlY3RlZEVsZW1lbnQgfHxcbiAgICAgICF0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPT09IHRoaXMuaG92ZXJFbGVtZW50IHx8XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5jb250YWlucyh0aGlzLmhvdmVyRWxlbWVudCkgfHxcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50LmNvbnRhaW5zKHRoaXMuc2VsZWN0ZWRFbGVtZW50KVxuICAgICkge1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChcbiAgICAgIGdldERpc3RhbmNlT3ZlcmxheShcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5zZWxlY3RlZEVsZW1lbnQpLFxuICAgICAgICBnZXRSZWN0RnJvbURvbSh0aGlzLmhvdmVyRWxlbWVudCksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLnNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld3BvcnRTaXplKCk7XG4gICAgdGhpcy50ZXh0QmxvY2tzLnNldChcbiAgICAgIGdldFZpc2libGVUZXh0QmxvY2tzKHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChibG9jaykgPT5cbiAgICAgICAgICAgIGJsb2NrLnJlY3QudG9wID49IDAgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QudG9wIDw9IHZpZXdwb3J0LmhlaWdodCAmJlxuICAgICAgICAgICAgYmxvY2sucmVjdC5sZWZ0ID49IDAgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA8PSB2aWV3cG9ydC53aWR0aCxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChibG9jaykgPT4gKHtcbiAgICAgICAgICAuLi5ibG9jayxcbiAgICAgICAgICByZWN0OiB7XG4gICAgICAgICAgICAuLi5ibG9jay5yZWN0LFxuICAgICAgICAgICAgbGVmdDogY2xhbXAoYmxvY2sucmVjdC5sZWZ0LCAwLCB2aWV3cG9ydC53aWR0aCAtIDEyKSxcbiAgICAgICAgICAgIHRvcDogY2xhbXAoYmxvY2sucmVjdC50b3AsIDE0LCB2aWV3cG9ydC5oZWlnaHQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHdWlkZShndWlkZTogR3VpZGUpIHtcbiAgICBjb25zdCBuZXh0R3VpZGVzID0gWy4uLnRoaXMuZ3VpZGVzKCksIGd1aWRlXTtcbiAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgICB0aGlzLnJlY29yZEhpc3RvcnkobmV4dEd1aWRlcyk7XG4gIH1cblxuICBwcml2YXRlIGdldEd1aWRlUHJldmlldyhldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCk6IEd1aWRlIHtcbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdGhpcy5ndWlkZU9yaWVudGF0aW9uKCk7XG4gICAgY29uc3QgcmF3UG9zaXRpb24gPVxuICAgICAgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBldmVudC5jbGllbnRYIDogZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBtYXggPSBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZpZXdwb3J0LndpZHRoIDogdmlld3BvcnQuaGVpZ2h0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiAncHJldmlldycsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnNuYXBHdWlkZShjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc25hcEd1aWRlKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IGd1aWRlIG9mIHRoaXMuZ3VpZGVzKCkpIHtcbiAgICAgIGlmIChNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHBvc2l0aW9uKSA8PSBHVUlERV9TTkFQX0RJU1RBTkNFKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5wb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kR3VpZGVBdFBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geCkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgJiZcbiAgICAgICAgTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSB5KSA8PSBHVUlERV9ISVRCT1hfU0laRVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHVuZG8oKSB7XG4gICAgaWYgKCF0aGlzLmNhblVuZG8oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpIC0gMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICB0aGlzLmd1aWRlcy5zZXQodGhpcy5jbG9uZUd1aWRlcyh0aGlzLmhpc3RvcnkoKVtuZXh0SW5kZXhdKSk7XG4gIH1cblxuICBwcml2YXRlIHJlZG8oKSB7XG4gICAgaWYgKCF0aGlzLmNhblJlZG8oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpICsgMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICB0aGlzLmd1aWRlcy5zZXQodGhpcy5jbG9uZUd1aWRlcyh0aGlzLmhpc3RvcnkoKVtuZXh0SW5kZXhdKSk7XG4gIH1cblxuICBwcml2YXRlIHJlY29yZEhpc3RvcnkoZ3VpZGVzOiBHdWlkZVtdKSB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuaGlzdG9yeSgpLnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxKTtcbiAgICBiYXNlLnB1c2godGhpcy5jbG9uZUd1aWRlcyhndWlkZXMpKTtcbiAgICB0aGlzLmhpc3Rvcnkuc2V0KGJhc2UpO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChiYXNlLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUd1aWRlcyhndWlkZXM6IEd1aWRlW10pIHtcbiAgICByZXR1cm4gZ3VpZGVzLm1hcCgoZ3VpZGUpID0+ICh7IC4uLmd1aWRlIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1pbmltdW1Db21tb25QYXJlbnQoXG4gICAgZWxlbWVudEE6IEhUTUxFbGVtZW50LFxuICAgIGVsZW1lbnRCOiBIVE1MRWxlbWVudCxcbiAgKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBCdWlsZCBhbmNlc3RvciBjaGFpbiBmb3IgZWxlbWVudCBBXG4gICAgY29uc3QgYW5jZXN0b3JzQSA9IG5ldyBTZXQ8RWxlbWVudD4oKTtcbiAgICBsZXQgY3VycmVudDogRWxlbWVudCB8IG51bGwgPSBlbGVtZW50QTtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgYW5jZXN0b3JzQS5hZGQoY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFdhbGsgdXAgZnJvbSBlbGVtZW50QiB1bnRpbCB3ZSBmaW5kIGEgY29tbW9uIGFuY2VzdG9yXG4gICAgY3VycmVudCA9IGVsZW1lbnRCO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoYW5jZXN0b3JzQS5oYXMoY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLXJvb3RcIiAjb3ZlcmxheVJvb3Q+XG4gIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fcmFpbFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b25cIlxuICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRvb2xNb2RlKCkgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgKGNsaWNrKT1cInNldFRvb2xNb2RlKCdzZWxlY3QnKVwiXG4gICAgICAgIHRpdGxlPVwiU2VsZWN0IG1vZGVcIlxuICAgICAgPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMgMmw4IDgtMyAuN0w2LjcgMTMgNiAxMCAzIDJ6XCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJzaG93VHlwb2dyYXBoeSgpXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVR5cG9ncmFwaHkoKVwiXG4gICAgICAgIHRpdGxlPVwiVHlwb2dyYXBoeSBtb2RlXCJcbiAgICAgID5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0zIDRWMmgxMHYyaC00djEwSDdWNHpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci1ndWlkZS1ncm91cFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b24gaW5zcGVjdG9yLWljb24tYnV0dG9uLS1ndWlkZS1tYWluXCJcbiAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRvb2xNb2RlKCkgPT09ICdndWlkZXMnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VG9vbE1vZGUoJ2d1aWRlcycpXCJcbiAgICAgICAgICB0aXRsZT1cIkd1aWRlcyBtb2RlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk00IDJoMXYxMkg0ek0xMSAyaDF2MTJoLTF6TTIgNGgxMnYxSDJ6TTIgMTFoMTJ2MUgyelwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvbiBpbnNwZWN0b3ItaWNvbi1idXR0b24tLWdob3N0IGluc3BlY3Rvci1pY29uLWJ1dHRvbi0tZ3VpZGUtbWVudVwiXG4gICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJndWlkZU1lbnVPcGVuKClcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVHdWlkZU1lbnUoKVwiXG4gICAgICAgICAgdGl0bGU9XCJHdWlkZSBvcHRpb25zXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk00LjQ3IDYuOTdMOCAxMC41bDMuNTMtMy41My0uOTQtLjk0TDggOC42MiA1LjQxIDYuMDN6XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgQGlmIChndWlkZU1lbnVPcGVuKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLW1lbnVcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXNlZ21lbnRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cImd1aWRlT3JpZW50YXRpb24oKSA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRHdWlkZU9yaWVudGF0aW9uKCd2ZXJ0aWNhbCcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgVmVydGljYWxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3Itc2VnbWVudFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiZ3VpZGVPcmllbnRhdGlvbigpID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0R3VpZGVPcmllbnRhdGlvbignaG9yaXpvbnRhbCcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgSG9yaXpvbnRhbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1zZWdtZW50IGluc3BlY3Rvci1zZWdtZW50LS1kYW5nZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJHdWlkZXMoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIENsZWFyXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHRvb2xNb2RlKCkgPT09IFwic2VsZWN0XCIpIHtcbiAgICBAaWYgKGhvdmVyUmVjdCgpICYmIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0taG92ZXJcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJob3ZlclJlY3QoKSEubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiaG92ZXJSZWN0KCkhLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJob3ZlclJlY3QoKSEud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhvdmVyUmVjdCgpIS5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID48L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKHNlbGVjdGVkTWVhc3VyZW1lbnQoKTsgYXMgc2VsZWN0ZWQpIHtcbiAgICAgIEBpZiAoc2VsZWN0ZWQuZ2FwLmFjdGl2ZSAmJiBzZWxlY3RlZC5wYXJlbnRSZWN0KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3BcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QuaGVpZ2h0XCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3AgLSA4XCJcbiAgICAgICAgPlxuICAgICAgICAgIEcge3sgZm9ybWF0R2FwKHNlbGVjdGVkKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLW1hcmdpblwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgTSB7eyBmb3JtYXRFZGdlcyhzZWxlY3RlZC5tYXJnaW4pIH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tc2VsZWN0ZWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5yZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLnJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWFjY2VudF09XCJoaWdobGlnaHRDb2xvclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItbGFiZWxcIj57eyBzZWxlY3RlZE1ldGFMaW5lKCkgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1wYWRkaW5nXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHRcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1wYWRkaW5nXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgc2VsZWN0ZWQucGFkZGluZ1JlY3QudG9wICsgc2VsZWN0ZWQucGFkZGluZ1JlY3QuaGVpZ2h0ICsgOFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICBQIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLnBhZGRpbmcpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSAmJiBzaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgQGZvciAoYmxvY2sgb2YgdGV4dEJsb2NrcygpOyB0cmFjayBibG9jay5pZCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJibG9jay5yZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImJsb2NrLnJlY3QudG9wIC0gOFwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItdGV4dC1jaGlwX19zd2F0Y2hcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJsb2NrLnN0eWxlcy5jb2xvclwiXG4gICAgICAgID48L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5mb250U2l6ZSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmxpbmVIZWlnaHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5jb2xvciB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIGFsdFByZXNzZWQoKSAmJiBkaXN0YW5jZU92ZXJsYXkoKTsgYXMgZGlzdGFuY2UpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZGlzdGFuY2VcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UucmVjdEEubGVmdFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLnJlY3RBLnRvcFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZGlzdGFuY2UucmVjdEEud2lkdGhcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkaXN0YW5jZS5yZWN0QS5oZWlnaHRcIlxuICAgID48L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZGlzdGFuY2VcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UucmVjdEIubGVmdFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLnJlY3RCLnRvcFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZGlzdGFuY2UucmVjdEIud2lkdGhcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkaXN0YW5jZS5yZWN0Qi5oZWlnaHRcIlxuICAgID48L2Rpdj5cblxuICAgIEBmb3IgKFxuICAgICAgY29ubmVjdG9yIG9mIGRpc3RhbmNlLmNvbm5lY3RvcnM7XG4gICAgICB0cmFjayB0cmFja0Nvbm5lY3RvcigkaW5kZXgsIGNvbm5lY3RvcilcbiAgICApIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29ubmVjdG9yXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1jb25uZWN0b3ItLXZlcnRpY2FsXT1cImNvbm5lY3Rvci54MSA9PT0gY29ubmVjdG9yLngyXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1jb25uZWN0b3ItLWhvcml6b250YWxdPVwiY29ubmVjdG9yLnkxID09PSBjb25uZWN0b3IueTJcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJNYXRoLm1pbihjb25uZWN0b3IueDEsIGNvbm5lY3Rvci54MilcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci55MSwgY29ubmVjdG9yLnkyKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueDIgLSBjb25uZWN0b3IueDEpKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiTWF0aC5tYXgoMSwgTWF0aC5hYnMoY29ubmVjdG9yLnkyIC0gY29ubmVjdG9yLnkxKSlcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UuaG9yaXpvbnRhbCAmJiBkaXN0YW5jZS5ob3Jpem9udGFsLnZhbHVlID4gMCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS1saW5lIGluc3BlY3Rvci1kaXN0YW5jZS1saW5lLS1ob3Jpem9udGFsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgTWF0aC5taW4oZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEsIGRpc3RhbmNlLmhvcml6b250YWwueDIhKVxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLmhvcml6b250YWwueSFcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEgLSBkaXN0YW5jZS5ob3Jpem9udGFsLngxISlcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtdGFnXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgKGRpc3RhbmNlLmhvcml6b250YWwueDEhICsgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpIC8gMlxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLmhvcml6b250YWwueSEgKyAxMFwiXG4gICAgICA+XG4gICAgICAgIHt7IGZvcm1hdFZhbHVlKGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGRpc3RhbmNlLnZlcnRpY2FsICYmIGRpc3RhbmNlLnZlcnRpY2FsLnZhbHVlID4gMCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS1saW5lIGluc3BlY3Rvci1kaXN0YW5jZS1saW5lLS12ZXJ0aWNhbFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnZlcnRpY2FsLnghXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJNYXRoLm1pbihkaXN0YW5jZS52ZXJ0aWNhbC55MSEsIGRpc3RhbmNlLnZlcnRpY2FsLnkyISlcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIlxuICAgICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLnZlcnRpY2FsLnkyISAtIGRpc3RhbmNlLnZlcnRpY2FsLnkxISlcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtdGFnIGluc3BlY3Rvci1kaXN0YW5jZS10YWctLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCEgKyAxMFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGRpc3RhbmNlLnZlcnRpY2FsLnkxISArIGRpc3RhbmNlLnZlcnRpY2FsLnkyISkgLyAyXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UudmVydGljYWwudmFsdWUpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSkge1xuICAgIEBpZiAodG9vbE1vZGUoKSA9PT0gXCJndWlkZXNcIikge1xuICAgICAgQGlmIChndWlkZVByZXZpZXcoKTsgYXMgcHJldmlldykge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUgaW5zcGVjdG9yLWd1aWRlLS1wcmV2aWV3XCJcbiAgICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAndmVydGljYWwnXCJcbiAgICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1ob3Jpem9udGFsXT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAgIHByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBwcmV2aWV3LnBvc2l0aW9uIDogbnVsbFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICAgIHByZXZpZXcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1ndWlkZS1saW5lXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZm9yIChndWlkZSBvZiBndWlkZXMoKTsgdHJhY2sgZ3VpZGUuaWQpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS0tdmVydGljYWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1ob3Jpem9udGFsXT1cImd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1zZWxlY3RlZF09XCJzZWxlY3RlZEd1aWRlSWQoKSA9PT0gZ3VpZGUuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBndWlkZS5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWd1aWRlXT1cImd1aWRlQ29sb3JcIlxuICAgICAgICAocG9pbnRlcmRvd24pPVwic3RhcnRHdWlkZURyYWcoJGV2ZW50LCBndWlkZSlcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1ndWlkZS1saW5lXCI+PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICB9XG48L2Rpdj5cbiJdfQ==
@@ -305,6 +305,16 @@ class inspectorComponent {
305
305
  this.hydrated = signal(false);
306
306
  this.history = signal([]);
307
307
  this.historyIndex = signal(-1);
308
+ this.handleCapturedClick = (event) => {
309
+ if (!event.shiftKey ||
310
+ !this.canInspectClick(event) ||
311
+ !this.selectElementAtPoint(event)) {
312
+ return;
313
+ }
314
+ event.preventDefault();
315
+ event.stopPropagation();
316
+ event.stopImmediatePropagation();
317
+ };
308
318
  this.draggingGuideId = null;
309
319
  this.selectedElement = null;
310
320
  this.hoverElement = null;
@@ -331,7 +341,14 @@ class inspectorComponent {
331
341
  });
332
342
  }
333
343
  ngOnInit() {
334
- if (!this.isBrowser || !this.persistOnReload) {
344
+ if (!this.isBrowser) {
345
+ this.hydrated.set(true);
346
+ return;
347
+ }
348
+ window.addEventListener('click', this.handleCapturedClick, {
349
+ capture: true,
350
+ });
351
+ if (!this.persistOnReload) {
335
352
  this.hydrated.set(true);
336
353
  return;
337
354
  }
@@ -357,6 +374,14 @@ class inspectorComponent {
357
374
  this.hydrated.set(true);
358
375
  this.refreshTypographyBlocks();
359
376
  }
377
+ ngOnDestroy() {
378
+ if (!this.isBrowser) {
379
+ return;
380
+ }
381
+ window.removeEventListener('click', this.handleCapturedClick, {
382
+ capture: true,
383
+ });
384
+ }
360
385
  setToolMode(mode) {
361
386
  if (!this.enabled()) {
362
387
  this.enabled.set(true);
@@ -544,29 +569,54 @@ class inspectorComponent {
544
569
  this.guidePreview.set(guide);
545
570
  return;
546
571
  }
547
- if (this.toolMode() !== 'select') {
572
+ if (!this.canInspectClick(event)) {
548
573
  return;
549
574
  }
575
+ this.selectElementAtPoint(event);
576
+ }
577
+ handleViewportChange() {
578
+ if (this.selectedElement && document.contains(this.selectedElement)) {
579
+ this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));
580
+ }
581
+ this.updateDistanceOverlay();
582
+ this.refreshTypographyBlocks();
583
+ }
584
+ canInspectClick(event) {
585
+ if (!this.enabled() || !this.isBrowser || this.toolMode() !== 'select') {
586
+ return false;
587
+ }
588
+ const overlay = this.overlayRoot()?.nativeElement ?? null;
589
+ return !(overlay && overlay.contains(event.target));
590
+ }
591
+ selectElementAtPoint(event) {
592
+ const overlay = this.overlayRoot()?.nativeElement ?? null;
550
593
  const target = getTargetElement({ x: event.clientX, y: event.clientY }, overlay);
551
594
  if (!target) {
552
595
  this.selectedMeasurement.set(null);
553
596
  this.selectedElement = null;
554
597
  this.distanceOverlay.set(null);
555
598
  this.refreshTypographyBlocks();
556
- return;
599
+ return false;
600
+ }
601
+ // Ctrl+click: select the minimum common parent of current selection and clicked element
602
+ if ((event.ctrlKey || event.metaKey) && this.selectedElement) {
603
+ const commonParent = this.findMinimumCommonParent(this.selectedElement, target);
604
+ if (commonParent &&
605
+ commonParent !== document.body &&
606
+ commonParent !== document.documentElement) {
607
+ this.selectedMeasurement.set(getInspectMeasurement(commonParent));
608
+ this.selectedElement = commonParent;
609
+ this.updateDistanceOverlay();
610
+ this.refreshTypographyBlocks();
611
+ return true;
612
+ }
557
613
  }
558
614
  this.selectedMeasurement.set(getInspectMeasurement(target));
559
615
  this.selectedElement = target;
560
616
  this.selectedGuideId.set(this.findGuideAtPoint(event.clientX, event.clientY));
561
617
  this.updateDistanceOverlay();
562
618
  this.refreshTypographyBlocks();
563
- }
564
- handleViewportChange() {
565
- if (this.selectedElement && document.contains(this.selectedElement)) {
566
- this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));
567
- }
568
- this.updateDistanceOverlay();
569
- this.refreshTypographyBlocks();
619
+ return true;
570
620
  }
571
621
  updateDistanceOverlay() {
572
622
  if (!this.altPressed() ||
@@ -663,6 +713,24 @@ class inspectorComponent {
663
713
  cloneGuides(guides) {
664
714
  return guides.map((guide) => ({ ...guide }));
665
715
  }
716
+ findMinimumCommonParent(elementA, elementB) {
717
+ // Build ancestor chain for element A
718
+ const ancestorsA = new Set();
719
+ let current = elementA;
720
+ while (current) {
721
+ ancestorsA.add(current);
722
+ current = current.parentElement;
723
+ }
724
+ // Walk up from elementB until we find a common ancestor
725
+ current = elementB;
726
+ while (current) {
727
+ if (ancestorsA.has(current)) {
728
+ return current;
729
+ }
730
+ current = current.parentElement;
731
+ }
732
+ return null;
733
+ }
666
734
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
667
735
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: inspectorComponent, isStandalone: true, selector: "inspector-overlay", inputs: { highlightColor: "highlightColor", guideColor: "guideColor", hoverHighlightEnabled: "hoverHighlightEnabled", persistOnReload: "persistOnReload" }, host: { listeners: { "window:keydown": "handleKeydown($event)", "window:keyup": "handleKeyup($event)", "window:pointermove": "handlePointerMove($event)", "window:pointerup": "handlePointerUp()", "window:click": "handleClick($event)", "window:resize": "handleViewportChange()", "window:scroll": "handleViewportChange()" } }, viewQueries: [{ propertyName: "overlayRoot", first: true, predicate: ["overlayRoot"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"inspector-root\" #overlayRoot>\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n title=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n title=\"Typography mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n </button>\n <div class=\"inspector-guide-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--guide-main\"\n [class.is-active]=\"toolMode() === 'guides'\"\n (click)=\"setToolMode('guides')\"\n title=\"Guides mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 2h1v12H4zM11 2h1v12h-1zM2 4h12v1H2zM2 11h12v1H2z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--ghost inspector-icon-button--guide-menu\"\n [class.is-active]=\"guideMenuOpen()\"\n (click)=\"toggleGuideMenu()\"\n title=\"Guide options\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4.47 6.97L8 10.5l3.53-3.53-.94-.94L8 8.62 5.41 6.03z\" />\n </svg>\n </button>\n\n @if (guideMenuOpen()) {\n <div class=\"inspector-guide-menu\">\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'vertical'\"\n (click)=\"setGuideOrientation('vertical')\"\n >\n Vertical\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'horizontal'\"\n (click)=\"setGuideOrientation('horizontal')\"\n >\n Horizontal\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment inspector-segment--danger\"\n (click)=\"clearGuides()\"\n >\n Clear\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:18px;right:18px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail,.inspector-guide-menu{display:flex;gap:4px;padding:4px;border-radius:8px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__rail{align-items:center}.inspector-guide-group{position:relative;display:flex;gap:0;align-items:center;border-radius:6px}.inspector-guide-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:max-content;flex-direction:column;align-items:stretch}.inspector-guide-menu .inspector-segment{justify-content:flex-start;width:100%}.inspector-icon-button,.inspector-segment{display:inline-flex;align-items:center;justify-content:center;height:26px;border:0;border-radius:6px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .12s ease,color .12s ease;font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{width:26px}.inspector-icon-button svg{width:14px;height:14px;fill:currentColor}.inspector-icon-button:hover,.inspector-segment:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active,.inspector-segment.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--ghost.is-active{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button--guide-main{border-radius:6px 0 0 6px}.inspector-icon-button--guide-menu{width:20px;border-radius:0 6px 6px 0}.inspector-icon-button--guide-menu svg{width:12px;height:12px}.inspector-segment{padding:0 8px;white-space:nowrap}.inspector-segment--danger:hover{background:#ef444429;color:#fecaca}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
668
736
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inspector-ng.mjs","sources":["../../../projects/inspector-ng/src/lib/constants.ts","../../../projects/inspector-ng/src/lib/geometry.ts","../../../projects/inspector-ng/src/lib/distances.ts","../../../projects/inspector-ng/src/lib/dom.ts","../../../projects/inspector-ng/src/lib/utils.ts","../../../projects/inspector-ng/src/lib/inspector.component.ts","../../../projects/inspector-ng/src/lib/inspector.component.html","../../../projects/inspector-ng/src/inspector-ng.ts"],"sourcesContent":["export const inspector_STORAGE_KEY = \"inspector-state\";\nexport const inspector_STATE_VERSION = 1;\nexport const GUIDE_SNAP_DISTANCE = 10;\nexport const GUIDE_HITBOX_SIZE = 14;\n","import { Rect } from './types';\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.max(min, Math.min(max, value));\n\nexport const getViewportSize = () => ({\n width: typeof window === 'undefined' ? 1 : window.innerWidth || 1,\n height: typeof window === 'undefined' ? 1 : window.innerHeight || 1,\n});\n\nexport const rectContainsPoint = (\n rect: Rect,\n point: { x: number; y: number },\n) =>\n point.x >= rect.left &&\n point.x <= rect.left + rect.width &&\n point.y >= rect.top &&\n point.y <= rect.top + rect.height;\n\nexport const rectsEqual = (a: Rect | null, b: Rect | null, epsilon = 0.5) => {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n return (\n Math.abs(a.left - b.left) < epsilon &&\n Math.abs(a.top - b.top) < epsilon &&\n Math.abs(a.width - b.width) < epsilon &&\n Math.abs(a.height - b.height) < epsilon\n );\n};\n","import { clamp, getViewportSize } from './geometry';\nimport { DistanceOverlay, Rect } from './types';\n\nexport const getDistanceOverlay = (rectA: Rect, rectB: Rect): DistanceOverlay => {\n const rightA = rectA.left + rectA.width;\n const bottomA = rectA.top + rectA.height;\n const rightB = rectB.left + rectB.width;\n const bottomB = rectB.top + rectB.height;\n const centerAX = rectA.left + rectA.width / 2;\n const centerAY = rectA.top + rectA.height / 2;\n\n let horizontal: DistanceOverlay['horizontal'] = null;\n let vertical: DistanceOverlay['vertical'] = null;\n const connectors: DistanceOverlay['connectors'] = [];\n\n const separatedX = rightA <= rectB.left || rightB <= rectA.left;\n const separatedY = bottomA <= rectB.top || bottomB <= rectA.top;\n\n if (separatedX) {\n const aIsLeft = rightA <= rectB.left;\n const x1 = aIsLeft ? rightA : rightB;\n const x2 = aIsLeft ? rectB.left : rectA.left;\n const y = centerAY;\n horizontal = { x1, x2, y, value: Math.abs(x2 - x1) };\n\n const edgeBX = aIsLeft ? rectB.left : rightB;\n if (y < rectB.top) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: rectB.top });\n } else if (y > bottomB) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: bottomB });\n }\n }\n\n if (separatedY) {\n const aIsTop = bottomA <= rectB.top;\n const y1 = aIsTop ? bottomA : bottomB;\n const y2 = aIsTop ? rectB.top : rectA.top;\n const x = centerAX;\n vertical = { y1, y2, x, value: Math.abs(y2 - y1) };\n\n const edgeBY = aIsTop ? rectB.top : bottomB;\n if (x < rectB.left) {\n connectors.push({ x1: x, y1: edgeBY, x2: rectB.left, y2: edgeBY });\n } else if (x > rightB) {\n connectors.push({ x1: x, y1: edgeBY, x2: rightB, y2: edgeBY });\n }\n }\n\n const viewport = getViewportSize();\n\n return {\n rectA,\n rectB,\n horizontal,\n vertical,\n connectors: connectors\n .map((segment) => ({\n x1: clamp(segment.x1, 0, viewport.width),\n y1: clamp(segment.y1, 0, viewport.height),\n x2: clamp(segment.x2, 0, viewport.width),\n y2: clamp(segment.y2, 0, viewport.height),\n }))\n .filter(\n (segment) =>\n Math.abs(segment.x1 - segment.x2) > 0.5 ||\n Math.abs(segment.y1 - segment.y2) > 0.5,\n ),\n };\n};\n","import { InspectMeasurement, Rect, TextBlockAnnotation, TextInspection } from './types';\n\nexport const getRectFromDom = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n};\n\nexport const getElementLabel = (element: HTMLElement) => {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className\n ? `.${element.className.toString().split(' ')[0]}`\n : '';\n return `${tag}${id}${className}`;\n};\n\nconst toHex = (value: number) => value.toString(16).padStart(2, '0');\n\nconst normalizeColorToHex = (color: string) => {\n const trimmed = color.trim().toLowerCase();\n if (trimmed.startsWith('#')) {\n if (trimmed.length === 4) {\n return `#${trimmed[1]}${trimmed[1]}${trimmed[2]}${trimmed[2]}${trimmed[3]}${trimmed[3]}`;\n }\n return trimmed;\n }\n\n const rgbMatch = trimmed.match(\n /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*[0-9.]+\\s*)?\\)$/,\n );\n if (!rgbMatch) {\n return color;\n }\n\n const [, r, g, b] = rgbMatch;\n return `#${toHex(Math.round(Number(r)))}${toHex(Math.round(Number(g)))}${toHex(Math.round(Number(b)))}`;\n};\n\nexport const getTextInspection = (element: HTMLElement): TextInspection => {\n const style = window.getComputedStyle(element);\n return {\n fontFamily: style.fontFamily,\n fontSize: style.fontSize,\n fontWeight: style.fontWeight,\n lineHeight: style.lineHeight,\n letterSpacing: style.letterSpacing,\n color: normalizeColorToHex(style.color),\n textAlign: style.textAlign,\n };\n};\n\nconst parseEdge = (value: string) => Number.parseFloat(value) || 0;\n\nexport const getInspectMeasurement = (element: HTMLElement): InspectMeasurement => {\n const rect = getRectFromDom(element);\n const style = window.getComputedStyle(element);\n const parentElement = element.parentElement;\n const parentStyle = parentElement ? window.getComputedStyle(parentElement) : null;\n const padding = {\n top: parseEdge(style.paddingTop),\n right: parseEdge(style.paddingRight),\n bottom: parseEdge(style.paddingBottom),\n left: parseEdge(style.paddingLeft),\n };\n const margin = {\n top: parseEdge(style.marginTop),\n right: parseEdge(style.marginRight),\n bottom: parseEdge(style.marginBottom),\n left: parseEdge(style.marginLeft),\n };\n const rowGap = parentStyle ? parseEdge(parentStyle.rowGap) : 0;\n const columnGap = parentStyle ? parseEdge(parentStyle.columnGap) : 0;\n const parentDisplay = parentStyle?.display ?? '';\n const hasGap =\n !!parentElement &&\n (parentDisplay.includes('flex') || parentDisplay.includes('grid')) &&\n (rowGap > 0 || columnGap > 0);\n\n return {\n rect,\n paddingRect: {\n left: rect.left + padding.left,\n top: rect.top + padding.top,\n width: Math.max(0, rect.width - padding.left - padding.right),\n height: Math.max(0, rect.height - padding.top - padding.bottom),\n },\n marginRect: {\n left: rect.left - margin.left,\n top: rect.top - margin.top,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n },\n padding,\n margin,\n gap: {\n row: rowGap,\n column: columnGap,\n active: hasGap,\n },\n parentRect: hasGap && parentElement ? getRectFromDom(parentElement) : null,\n label: getElementLabel(element),\n styles: getTextInspection(element),\n };\n};\n\nconst isVisibleTextCandidate = (element: HTMLElement) => {\n const text = element.innerText?.trim() ?? '';\n if (!text) {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n Number.parseFloat(style.opacity || '1') === 0\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width < 8 || rect.height < 8) {\n return false;\n }\n\n for (const child of Array.from(element.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ((child.innerText?.trim() ?? '') && child.getBoundingClientRect().height > 0) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const getVisibleTextBlocks = (\n overlayElement: HTMLElement | null,\n limit = 160,\n): TextBlockAnnotation[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const nodes = Array.from(document.querySelectorAll('body *'));\n const blocks: TextBlockAnnotation[] = [];\n\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement && overlayElement.contains(node)) {\n continue;\n }\n if (!isVisibleTextCandidate(node)) {\n continue;\n }\n\n const rect = getRectFromDom(node);\n const text = (node.innerText || node.textContent || '').replace(/\\s+/g, ' ').trim();\n blocks.push({\n id: `${node.tagName.toLowerCase()}-${Math.round(rect.left)}-${Math.round(rect.top)}-${text.slice(0, 24)}`,\n rect,\n text,\n styles: getTextInspection(node),\n });\n\n if (blocks.length >= limit) {\n break;\n }\n }\n\n return blocks;\n};\n\nexport const getTargetElement = (\n point: { x: number; y: number },\n overlayElement: HTMLElement | null,\n) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (overlayElement) {\n const previous = overlayElement.style.pointerEvents;\n overlayElement.style.pointerEvents = 'none';\n const elements = document.elementsFromPoint(point.x, point.y);\n overlayElement.style.pointerEvents = previous;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement.contains(element)) {\n continue;\n }\n if (element === document.body || element === document.documentElement) {\n continue;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 2 || rect.height <= 2) {\n continue;\n }\n return element;\n }\n\n return null;\n }\n\n return document.elementFromPoint(point.x, point.y) as HTMLElement | null;\n};\n","export const createId = () =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n\nexport const formatValue = (value: number) => Math.round(value);\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n Inject,\n Input,\n PLATFORM_ID,\n computed,\n effect,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n GUIDE_HITBOX_SIZE,\n GUIDE_SNAP_DISTANCE,\n inspector_STATE_VERSION,\n inspector_STORAGE_KEY,\n} from './constants';\nimport {\n getInspectMeasurement,\n getRectFromDom,\n getTargetElement,\n getVisibleTextBlocks,\n} from './dom';\nimport { getDistanceOverlay } from './distances';\nimport { clamp, getViewportSize, rectsEqual } from './geometry';\nimport {\n DistanceOverlay,\n Guide,\n GuideOrientation,\n InspectMeasurement,\n inspectorPersistedState,\n Rect,\n TextBlockAnnotation,\n ToolMode,\n} from './types';\nimport { createId, formatValue } from './utils';\n\n@Component({\n selector: 'inspector-overlay',\n standalone: true,\n imports: [],\n templateUrl: './inspector.component.html',\n styleUrl: './inspector.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class inspectorComponent {\n readonly Math = Math;\n readonly formatValue = formatValue;\n readonly guideHitboxSize = GUIDE_HITBOX_SIZE;\n readonly overlayRoot = viewChild<ElementRef<HTMLElement>>('overlayRoot');\n\n @Input() highlightColor = '#4f8cff';\n @Input() guideColor = '#ff7a00';\n @Input() hoverHighlightEnabled = true;\n @Input() persistOnReload = false;\n\n readonly enabled = signal(false);\n readonly toolMode = signal<ToolMode>('none');\n readonly guideOrientation = signal<GuideOrientation>('vertical');\n readonly guides = signal<Guide[]>([]);\n readonly hoverRect = signal<Rect | null>(null);\n readonly selectedGuideId = signal<string | null>(null);\n readonly selectedMeasurement = signal<InspectMeasurement | null>(null);\n readonly showTypography = signal(true);\n readonly altPressed = signal(false);\n readonly distanceOverlay = signal<DistanceOverlay | null>(null);\n readonly textBlocks = signal<TextBlockAnnotation[]>([]);\n readonly guideMenuOpen = signal(false);\n readonly guidePreview = signal<Guide | null>(null);\n\n readonly selectedMetaLine = computed(() => {\n const selected = this.selectedMeasurement();\n if (!selected) {\n return '';\n }\n return `${selected.label} · ${formatValue(selected.rect.width)} x ${formatValue(selected.rect.height)} · ${selected.styles.fontSize} / ${selected.styles.lineHeight} / ${selected.styles.color}`;\n });\n\n private readonly isBrowser: boolean;\n private readonly hydrated = signal(false);\n private readonly history = signal<Guide[][]>([]);\n private readonly historyIndex = signal(-1);\n private draggingGuideId: string | null = null;\n private selectedElement: HTMLElement | null = null;\n private hoverElement: HTMLElement | null = null;\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(\n () =>\n this.historyIndex() >= 0 &&\n this.historyIndex() < this.history().length - 1,\n );\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n\n effect(() => {\n if (!this.persistOnReload || !this.isBrowser || !this.hydrated()) {\n return;\n }\n\n const payload: inspectorPersistedState = {\n version: inspector_STATE_VERSION,\n enabled: this.enabled(),\n toolMode: this.toolMode(),\n guideOrientation: this.guideOrientation(),\n guides: this.guides(),\n showTypography: this.showTypography(),\n };\n\n window.localStorage.setItem(\n inspector_STORAGE_KEY,\n JSON.stringify(payload),\n );\n });\n }\n\n ngOnInit() {\n if (!this.isBrowser || !this.persistOnReload) {\n this.hydrated.set(true);\n return;\n }\n\n const stored = window.localStorage.getItem(inspector_STORAGE_KEY);\n if (!stored) {\n this.hydrated.set(true);\n return;\n }\n\n try {\n const parsed = JSON.parse(stored) as inspectorPersistedState;\n if (parsed.version === inspector_STATE_VERSION) {\n this.enabled.set(parsed.enabled);\n this.toolMode.set(parsed.toolMode);\n this.guideOrientation.set(parsed.guideOrientation);\n this.guides.set(parsed.guides ?? []);\n this.showTypography.set(parsed.showTypography ?? true);\n this.recordHistory(parsed.guides ?? []);\n }\n } catch {\n // ignore malformed state\n }\n\n this.hydrated.set(true);\n this.refreshTypographyBlocks();\n }\n\n setToolMode(mode: ToolMode) {\n if (!this.enabled()) {\n this.enabled.set(true);\n }\n\n this.toolMode.set(this.toolMode() === mode ? 'none' : mode);\n this.hoverRect.set(null);\n this.guidePreview.set(null);\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n }\n\n setGuideOrientation(orientation: GuideOrientation) {\n this.guideOrientation.set(orientation);\n this.guidePreview.set(null);\n }\n\n toggleTypography() {\n this.showTypography.update((value) => !value);\n this.refreshTypographyBlocks();\n }\n\n toggleGuideMenu() {\n this.guideMenuOpen.update((value) => !value);\n }\n\n clearGuides() {\n this.guides.set([]);\n this.selectedGuideId.set(null);\n this.recordHistory([]);\n }\n\n trackGuide = (_index: number, guide: Guide) => guide.id;\n trackTextBlock = (_index: number, block: TextBlockAnnotation) => block.id;\n trackConnector = (\n _index: number,\n connector: DistanceOverlay['connectors'][number],\n ) => `${connector.x1}:${connector.y1}:${connector.x2}:${connector.y2}`;\n\n startGuideDrag(event: PointerEvent, guide: Guide) {\n event.preventDefault();\n event.stopPropagation();\n this.draggingGuideId = guide.id;\n this.selectedGuideId.set(guide.id);\n }\n\n formatEdges(edges: InspectMeasurement['padding']) {\n return `${formatValue(edges.top)} ${formatValue(edges.right)} ${formatValue(edges.bottom)} ${formatValue(edges.left)}`;\n }\n\n formatGap(selected: InspectMeasurement) {\n return `${formatValue(selected.gap.row)} / ${formatValue(selected.gap.column)}`;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n const key = event.key.toLowerCase();\n\n if (key === 'm') {\n event.preventDefault();\n this.enabled.update((value) => !value);\n if (!this.enabled()) {\n this.toolMode.set('none');\n this.hoverRect.set(null);\n this.selectedGuideId.set(null);\n this.distanceOverlay.set(null);\n this.textBlocks.set([]);\n this.guidePreview.set(null);\n }\n this.refreshTypographyBlocks();\n return;\n }\n\n if (!this.enabled()) {\n return;\n }\n\n if ((event.metaKey || event.ctrlKey) && key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.redo() : this.undo();\n return;\n }\n\n if (key === 's') {\n event.preventDefault();\n this.setToolMode('select');\n return;\n }\n\n if (key === 'g') {\n event.preventDefault();\n this.setToolMode('guides');\n return;\n }\n\n if (key === 'h') {\n event.preventDefault();\n this.setGuideOrientation('horizontal');\n return;\n }\n\n if (key === 'v') {\n event.preventDefault();\n this.setGuideOrientation('vertical');\n return;\n }\n\n if (event.key === 'Alt') {\n this.altPressed.set(true);\n this.updateDistanceOverlay();\n return;\n }\n\n if (key === 'escape') {\n event.preventDefault();\n this.selectedMeasurement.set(null);\n this.selectedGuideId.set(null);\n this.hoverRect.set(null);\n this.distanceOverlay.set(null);\n this.selectedElement = null;\n this.hoverElement = null;\n this.guidePreview.set(null);\n this.clearGuides();\n this.refreshTypographyBlocks();\n return;\n }\n\n if ((key === 'backspace' || key === 'delete') && this.selectedGuideId()) {\n event.preventDefault();\n const nextGuides = this.guides().filter(\n (guide) => guide.id !== this.selectedGuideId(),\n );\n this.guides.set(nextGuides);\n this.selectedGuideId.set(null);\n this.recordHistory(nextGuides);\n }\n }\n\n @HostListener('window:keyup', ['$event'])\n handleKeyup(event: KeyboardEvent) {\n if (event.key === 'Alt') {\n this.altPressed.set(false);\n this.distanceOverlay.set(null);\n }\n }\n\n @HostListener('window:pointermove', ['$event'])\n handlePointerMove(event: PointerEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n if (this.draggingGuideId) {\n this.guidePreview.set(null);\n const viewport = getViewportSize();\n this.guides.set(\n this.guides().map((guide) => {\n if (guide.id !== this.draggingGuideId) {\n return guide;\n }\n const rawPosition =\n guide.orientation === 'vertical' ? event.clientX : event.clientY;\n const max =\n guide.orientation === 'vertical' ? viewport.width : viewport.height;\n return { ...guide, position: clamp(rawPosition, 0, max) };\n }),\n );\n return;\n }\n\n if (this.toolMode() === 'guides') {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n\n if (\n this.overlayRoot()?.nativeElement.contains(event.target as Node) ??\n false\n ) {\n this.guidePreview.set(null);\n return;\n }\n\n this.guidePreview.set(this.getGuidePreview(event));\n return;\n }\n\n this.guidePreview.set(null);\n\n if (this.toolMode() !== 'select' || !this.hoverHighlightEnabled) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n if (!this.altPressed()) {\n return;\n }\n }\n\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n this.overlayRoot()?.nativeElement ?? null,\n );\n if (!target) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n return;\n }\n\n const rect = getRectFromDom(target);\n this.hoverElement = target;\n if (!rectsEqual(rect, this.hoverRect())) {\n this.hoverRect.set(rect);\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n @HostListener('window:pointerup')\n handlePointerUp() {\n if (!this.draggingGuideId) {\n return;\n }\n this.recordHistory(this.guides());\n this.draggingGuideId = null;\n }\n\n @HostListener('window:click', ['$event'])\n handleClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n\n if (this.toolMode() === 'guides') {\n if (overlay && overlay.contains(event.target as Node)) {\n return;\n }\n const guide = this.getGuidePreview(event);\n this.addGuide({ ...guide, id: createId() });\n this.guidePreview.set(guide);\n return;\n }\n\n if (this.toolMode() !== 'select') {\n return;\n }\n\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n overlay,\n );\n if (!target) {\n this.selectedMeasurement.set(null);\n this.selectedElement = null;\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n return;\n }\n\n this.selectedMeasurement.set(getInspectMeasurement(target));\n this.selectedElement = target;\n this.selectedGuideId.set(\n this.findGuideAtPoint(event.clientX, event.clientY),\n );\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n handleViewportChange() {\n if (this.selectedElement && document.contains(this.selectedElement)) {\n this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n private updateDistanceOverlay() {\n if (\n !this.altPressed() ||\n !this.selectedElement ||\n !this.hoverElement ||\n this.selectedElement === this.hoverElement ||\n this.selectedElement.contains(this.hoverElement) ||\n this.hoverElement.contains(this.selectedElement)\n ) {\n this.distanceOverlay.set(null);\n return;\n }\n\n this.distanceOverlay.set(\n getDistanceOverlay(\n getRectFromDom(this.selectedElement),\n getRectFromDom(this.hoverElement),\n ),\n );\n }\n\n private refreshTypographyBlocks() {\n if (!this.isBrowser || !this.enabled() || !this.showTypography()) {\n this.textBlocks.set([]);\n return;\n }\n\n const viewport = getViewportSize();\n this.textBlocks.set(\n getVisibleTextBlocks(this.overlayRoot()?.nativeElement ?? null)\n .filter(\n (block) =>\n block.rect.top >= 0 &&\n block.rect.top <= viewport.height &&\n block.rect.left >= 0 &&\n block.rect.left <= viewport.width,\n )\n .map((block) => ({\n ...block,\n rect: {\n ...block.rect,\n left: clamp(block.rect.left, 0, viewport.width - 12),\n top: clamp(block.rect.top, 14, viewport.height),\n },\n })),\n );\n }\n\n private addGuide(guide: Guide) {\n const nextGuides = [...this.guides(), guide];\n this.guides.set(nextGuides);\n this.selectedGuideId.set(guide.id);\n this.recordHistory(nextGuides);\n }\n\n private getGuidePreview(event: PointerEvent | MouseEvent): Guide {\n const viewport = getViewportSize();\n const orientation = this.guideOrientation();\n const rawPosition =\n orientation === 'vertical' ? event.clientX : event.clientY;\n const max = orientation === 'vertical' ? viewport.width : viewport.height;\n\n return {\n id: 'preview',\n orientation,\n position: this.snapGuide(clamp(rawPosition, 0, max)),\n };\n }\n\n private snapGuide(position: number) {\n for (const guide of this.guides()) {\n if (Math.abs(guide.position - position) <= GUIDE_SNAP_DISTANCE) {\n return guide.position;\n }\n }\n return position;\n }\n\n private findGuideAtPoint(x: number, y: number) {\n for (const guide of this.guides()) {\n if (\n guide.orientation === 'vertical' &&\n Math.abs(guide.position - x) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n if (\n guide.orientation === 'horizontal' &&\n Math.abs(guide.position - y) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n }\n return null;\n }\n\n private undo() {\n if (!this.canUndo()) {\n return;\n }\n const nextIndex = this.historyIndex() - 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private redo() {\n if (!this.canRedo()) {\n return;\n }\n const nextIndex = this.historyIndex() + 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private recordHistory(guides: Guide[]) {\n const base = this.history().slice(0, this.historyIndex() + 1);\n base.push(this.cloneGuides(guides));\n this.history.set(base);\n this.historyIndex.set(base.length - 1);\n }\n\n private cloneGuides(guides: Guide[]) {\n return guides.map((guide) => ({ ...guide }));\n }\n}\n","<div class=\"inspector-root\" #overlayRoot>\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n title=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n title=\"Typography mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n </button>\n <div class=\"inspector-guide-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--guide-main\"\n [class.is-active]=\"toolMode() === 'guides'\"\n (click)=\"setToolMode('guides')\"\n title=\"Guides mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 2h1v12H4zM11 2h1v12h-1zM2 4h12v1H2zM2 11h12v1H2z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--ghost inspector-icon-button--guide-menu\"\n [class.is-active]=\"guideMenuOpen()\"\n (click)=\"toggleGuideMenu()\"\n title=\"Guide options\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4.47 6.97L8 10.5l3.53-3.53-.94-.94L8 8.62 5.41 6.03z\" />\n </svg>\n </button>\n\n @if (guideMenuOpen()) {\n <div class=\"inspector-guide-menu\">\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'vertical'\"\n (click)=\"setGuideOrientation('vertical')\"\n >\n Vertical\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'horizontal'\"\n (click)=\"setGuideOrientation('horizontal')\"\n >\n Horizontal\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment inspector-segment--danger\"\n (click)=\"clearGuides()\"\n >\n Clear\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inspector-ng.mjs","sources":["../../../projects/inspector-ng/src/lib/constants.ts","../../../projects/inspector-ng/src/lib/geometry.ts","../../../projects/inspector-ng/src/lib/distances.ts","../../../projects/inspector-ng/src/lib/dom.ts","../../../projects/inspector-ng/src/lib/utils.ts","../../../projects/inspector-ng/src/lib/inspector.component.ts","../../../projects/inspector-ng/src/lib/inspector.component.html","../../../projects/inspector-ng/src/inspector-ng.ts"],"sourcesContent":["export const inspector_STORAGE_KEY = \"inspector-state\";\nexport const inspector_STATE_VERSION = 1;\nexport const GUIDE_SNAP_DISTANCE = 10;\nexport const GUIDE_HITBOX_SIZE = 14;\n","import { Rect } from './types';\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.max(min, Math.min(max, value));\n\nexport const getViewportSize = () => ({\n width: typeof window === 'undefined' ? 1 : window.innerWidth || 1,\n height: typeof window === 'undefined' ? 1 : window.innerHeight || 1,\n});\n\nexport const rectContainsPoint = (\n rect: Rect,\n point: { x: number; y: number },\n) =>\n point.x >= rect.left &&\n point.x <= rect.left + rect.width &&\n point.y >= rect.top &&\n point.y <= rect.top + rect.height;\n\nexport const rectsEqual = (a: Rect | null, b: Rect | null, epsilon = 0.5) => {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n return (\n Math.abs(a.left - b.left) < epsilon &&\n Math.abs(a.top - b.top) < epsilon &&\n Math.abs(a.width - b.width) < epsilon &&\n Math.abs(a.height - b.height) < epsilon\n );\n};\n","import { clamp, getViewportSize } from './geometry';\nimport { DistanceOverlay, Rect } from './types';\n\nexport const getDistanceOverlay = (rectA: Rect, rectB: Rect): DistanceOverlay => {\n const rightA = rectA.left + rectA.width;\n const bottomA = rectA.top + rectA.height;\n const rightB = rectB.left + rectB.width;\n const bottomB = rectB.top + rectB.height;\n const centerAX = rectA.left + rectA.width / 2;\n const centerAY = rectA.top + rectA.height / 2;\n\n let horizontal: DistanceOverlay['horizontal'] = null;\n let vertical: DistanceOverlay['vertical'] = null;\n const connectors: DistanceOverlay['connectors'] = [];\n\n const separatedX = rightA <= rectB.left || rightB <= rectA.left;\n const separatedY = bottomA <= rectB.top || bottomB <= rectA.top;\n\n if (separatedX) {\n const aIsLeft = rightA <= rectB.left;\n const x1 = aIsLeft ? rightA : rightB;\n const x2 = aIsLeft ? rectB.left : rectA.left;\n const y = centerAY;\n horizontal = { x1, x2, y, value: Math.abs(x2 - x1) };\n\n const edgeBX = aIsLeft ? rectB.left : rightB;\n if (y < rectB.top) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: rectB.top });\n } else if (y > bottomB) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: bottomB });\n }\n }\n\n if (separatedY) {\n const aIsTop = bottomA <= rectB.top;\n const y1 = aIsTop ? bottomA : bottomB;\n const y2 = aIsTop ? rectB.top : rectA.top;\n const x = centerAX;\n vertical = { y1, y2, x, value: Math.abs(y2 - y1) };\n\n const edgeBY = aIsTop ? rectB.top : bottomB;\n if (x < rectB.left) {\n connectors.push({ x1: x, y1: edgeBY, x2: rectB.left, y2: edgeBY });\n } else if (x > rightB) {\n connectors.push({ x1: x, y1: edgeBY, x2: rightB, y2: edgeBY });\n }\n }\n\n const viewport = getViewportSize();\n\n return {\n rectA,\n rectB,\n horizontal,\n vertical,\n connectors: connectors\n .map((segment) => ({\n x1: clamp(segment.x1, 0, viewport.width),\n y1: clamp(segment.y1, 0, viewport.height),\n x2: clamp(segment.x2, 0, viewport.width),\n y2: clamp(segment.y2, 0, viewport.height),\n }))\n .filter(\n (segment) =>\n Math.abs(segment.x1 - segment.x2) > 0.5 ||\n Math.abs(segment.y1 - segment.y2) > 0.5,\n ),\n };\n};\n","import { InspectMeasurement, Rect, TextBlockAnnotation, TextInspection } from './types';\n\nexport const getRectFromDom = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n};\n\nexport const getElementLabel = (element: HTMLElement) => {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className\n ? `.${element.className.toString().split(' ')[0]}`\n : '';\n return `${tag}${id}${className}`;\n};\n\nconst toHex = (value: number) => value.toString(16).padStart(2, '0');\n\nconst normalizeColorToHex = (color: string) => {\n const trimmed = color.trim().toLowerCase();\n if (trimmed.startsWith('#')) {\n if (trimmed.length === 4) {\n return `#${trimmed[1]}${trimmed[1]}${trimmed[2]}${trimmed[2]}${trimmed[3]}${trimmed[3]}`;\n }\n return trimmed;\n }\n\n const rgbMatch = trimmed.match(\n /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*[0-9.]+\\s*)?\\)$/,\n );\n if (!rgbMatch) {\n return color;\n }\n\n const [, r, g, b] = rgbMatch;\n return `#${toHex(Math.round(Number(r)))}${toHex(Math.round(Number(g)))}${toHex(Math.round(Number(b)))}`;\n};\n\nexport const getTextInspection = (element: HTMLElement): TextInspection => {\n const style = window.getComputedStyle(element);\n return {\n fontFamily: style.fontFamily,\n fontSize: style.fontSize,\n fontWeight: style.fontWeight,\n lineHeight: style.lineHeight,\n letterSpacing: style.letterSpacing,\n color: normalizeColorToHex(style.color),\n textAlign: style.textAlign,\n };\n};\n\nconst parseEdge = (value: string) => Number.parseFloat(value) || 0;\n\nexport const getInspectMeasurement = (element: HTMLElement): InspectMeasurement => {\n const rect = getRectFromDom(element);\n const style = window.getComputedStyle(element);\n const parentElement = element.parentElement;\n const parentStyle = parentElement ? window.getComputedStyle(parentElement) : null;\n const padding = {\n top: parseEdge(style.paddingTop),\n right: parseEdge(style.paddingRight),\n bottom: parseEdge(style.paddingBottom),\n left: parseEdge(style.paddingLeft),\n };\n const margin = {\n top: parseEdge(style.marginTop),\n right: parseEdge(style.marginRight),\n bottom: parseEdge(style.marginBottom),\n left: parseEdge(style.marginLeft),\n };\n const rowGap = parentStyle ? parseEdge(parentStyle.rowGap) : 0;\n const columnGap = parentStyle ? parseEdge(parentStyle.columnGap) : 0;\n const parentDisplay = parentStyle?.display ?? '';\n const hasGap =\n !!parentElement &&\n (parentDisplay.includes('flex') || parentDisplay.includes('grid')) &&\n (rowGap > 0 || columnGap > 0);\n\n return {\n rect,\n paddingRect: {\n left: rect.left + padding.left,\n top: rect.top + padding.top,\n width: Math.max(0, rect.width - padding.left - padding.right),\n height: Math.max(0, rect.height - padding.top - padding.bottom),\n },\n marginRect: {\n left: rect.left - margin.left,\n top: rect.top - margin.top,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n },\n padding,\n margin,\n gap: {\n row: rowGap,\n column: columnGap,\n active: hasGap,\n },\n parentRect: hasGap && parentElement ? getRectFromDom(parentElement) : null,\n label: getElementLabel(element),\n styles: getTextInspection(element),\n };\n};\n\nconst isVisibleTextCandidate = (element: HTMLElement) => {\n const text = element.innerText?.trim() ?? '';\n if (!text) {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n Number.parseFloat(style.opacity || '1') === 0\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width < 8 || rect.height < 8) {\n return false;\n }\n\n for (const child of Array.from(element.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ((child.innerText?.trim() ?? '') && child.getBoundingClientRect().height > 0) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const getVisibleTextBlocks = (\n overlayElement: HTMLElement | null,\n limit = 160,\n): TextBlockAnnotation[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const nodes = Array.from(document.querySelectorAll('body *'));\n const blocks: TextBlockAnnotation[] = [];\n\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement && overlayElement.contains(node)) {\n continue;\n }\n if (!isVisibleTextCandidate(node)) {\n continue;\n }\n\n const rect = getRectFromDom(node);\n const text = (node.innerText || node.textContent || '').replace(/\\s+/g, ' ').trim();\n blocks.push({\n id: `${node.tagName.toLowerCase()}-${Math.round(rect.left)}-${Math.round(rect.top)}-${text.slice(0, 24)}`,\n rect,\n text,\n styles: getTextInspection(node),\n });\n\n if (blocks.length >= limit) {\n break;\n }\n }\n\n return blocks;\n};\n\nexport const getTargetElement = (\n point: { x: number; y: number },\n overlayElement: HTMLElement | null,\n) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (overlayElement) {\n const previous = overlayElement.style.pointerEvents;\n overlayElement.style.pointerEvents = 'none';\n const elements = document.elementsFromPoint(point.x, point.y);\n overlayElement.style.pointerEvents = previous;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement.contains(element)) {\n continue;\n }\n if (element === document.body || element === document.documentElement) {\n continue;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 2 || rect.height <= 2) {\n continue;\n }\n return element;\n }\n\n return null;\n }\n\n return document.elementFromPoint(point.x, point.y) as HTMLElement | null;\n};\n","export const createId = () =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n\nexport const formatValue = (value: number) => Math.round(value);\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n PLATFORM_ID,\n computed,\n effect,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n GUIDE_HITBOX_SIZE,\n GUIDE_SNAP_DISTANCE,\n inspector_STATE_VERSION,\n inspector_STORAGE_KEY,\n} from './constants';\nimport {\n getInspectMeasurement,\n getRectFromDom,\n getTargetElement,\n getVisibleTextBlocks,\n} from './dom';\nimport { getDistanceOverlay } from './distances';\nimport { clamp, getViewportSize, rectsEqual } from './geometry';\nimport {\n DistanceOverlay,\n Guide,\n GuideOrientation,\n InspectMeasurement,\n inspectorPersistedState,\n Rect,\n TextBlockAnnotation,\n ToolMode,\n} from './types';\nimport { createId, formatValue } from './utils';\n\n@Component({\n selector: 'inspector-overlay',\n standalone: true,\n imports: [],\n templateUrl: './inspector.component.html',\n styleUrl: './inspector.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class inspectorComponent implements OnDestroy {\n readonly Math = Math;\n readonly formatValue = formatValue;\n readonly guideHitboxSize = GUIDE_HITBOX_SIZE;\n readonly overlayRoot = viewChild<ElementRef<HTMLElement>>('overlayRoot');\n\n @Input() highlightColor = '#4f8cff';\n @Input() guideColor = '#ff7a00';\n @Input() hoverHighlightEnabled = true;\n @Input() persistOnReload = false;\n\n readonly enabled = signal(false);\n readonly toolMode = signal<ToolMode>('none');\n readonly guideOrientation = signal<GuideOrientation>('vertical');\n readonly guides = signal<Guide[]>([]);\n readonly hoverRect = signal<Rect | null>(null);\n readonly selectedGuideId = signal<string | null>(null);\n readonly selectedMeasurement = signal<InspectMeasurement | null>(null);\n readonly showTypography = signal(true);\n readonly altPressed = signal(false);\n readonly distanceOverlay = signal<DistanceOverlay | null>(null);\n readonly textBlocks = signal<TextBlockAnnotation[]>([]);\n readonly guideMenuOpen = signal(false);\n readonly guidePreview = signal<Guide | null>(null);\n\n readonly selectedMetaLine = computed(() => {\n const selected = this.selectedMeasurement();\n if (!selected) {\n return '';\n }\n return `${selected.label} · ${formatValue(selected.rect.width)} x ${formatValue(selected.rect.height)} · ${selected.styles.fontSize} / ${selected.styles.lineHeight} / ${selected.styles.color}`;\n });\n\n private readonly isBrowser: boolean;\n private readonly hydrated = signal(false);\n private readonly history = signal<Guide[][]>([]);\n private readonly historyIndex = signal(-1);\n private readonly handleCapturedClick = (event: MouseEvent) => {\n if (\n !event.shiftKey ||\n !this.canInspectClick(event) ||\n !this.selectElementAtPoint(event)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n };\n private draggingGuideId: string | null = null;\n private selectedElement: HTMLElement | null = null;\n private hoverElement: HTMLElement | null = null;\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(\n () =>\n this.historyIndex() >= 0 &&\n this.historyIndex() < this.history().length - 1,\n );\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n\n effect(() => {\n if (!this.persistOnReload || !this.isBrowser || !this.hydrated()) {\n return;\n }\n\n const payload: inspectorPersistedState = {\n version: inspector_STATE_VERSION,\n enabled: this.enabled(),\n toolMode: this.toolMode(),\n guideOrientation: this.guideOrientation(),\n guides: this.guides(),\n showTypography: this.showTypography(),\n };\n\n window.localStorage.setItem(\n inspector_STORAGE_KEY,\n JSON.stringify(payload),\n );\n });\n }\n\n ngOnInit() {\n if (!this.isBrowser) {\n this.hydrated.set(true);\n return;\n }\n\n window.addEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n\n if (!this.persistOnReload) {\n this.hydrated.set(true);\n return;\n }\n\n const stored = window.localStorage.getItem(inspector_STORAGE_KEY);\n if (!stored) {\n this.hydrated.set(true);\n return;\n }\n\n try {\n const parsed = JSON.parse(stored) as inspectorPersistedState;\n if (parsed.version === inspector_STATE_VERSION) {\n this.enabled.set(parsed.enabled);\n this.toolMode.set(parsed.toolMode);\n this.guideOrientation.set(parsed.guideOrientation);\n this.guides.set(parsed.guides ?? []);\n this.showTypography.set(parsed.showTypography ?? true);\n this.recordHistory(parsed.guides ?? []);\n }\n } catch {\n // ignore malformed state\n }\n\n this.hydrated.set(true);\n this.refreshTypographyBlocks();\n }\n\n ngOnDestroy() {\n if (!this.isBrowser) {\n return;\n }\n\n window.removeEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n }\n\n setToolMode(mode: ToolMode) {\n if (!this.enabled()) {\n this.enabled.set(true);\n }\n\n this.toolMode.set(this.toolMode() === mode ? 'none' : mode);\n this.hoverRect.set(null);\n this.guidePreview.set(null);\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n }\n\n setGuideOrientation(orientation: GuideOrientation) {\n this.guideOrientation.set(orientation);\n this.guidePreview.set(null);\n }\n\n toggleTypography() {\n this.showTypography.update((value) => !value);\n this.refreshTypographyBlocks();\n }\n\n toggleGuideMenu() {\n this.guideMenuOpen.update((value) => !value);\n }\n\n clearGuides() {\n this.guides.set([]);\n this.selectedGuideId.set(null);\n this.recordHistory([]);\n }\n\n trackGuide = (_index: number, guide: Guide) => guide.id;\n trackTextBlock = (_index: number, block: TextBlockAnnotation) => block.id;\n trackConnector = (\n _index: number,\n connector: DistanceOverlay['connectors'][number],\n ) => `${connector.x1}:${connector.y1}:${connector.x2}:${connector.y2}`;\n\n startGuideDrag(event: PointerEvent, guide: Guide) {\n event.preventDefault();\n event.stopPropagation();\n this.draggingGuideId = guide.id;\n this.selectedGuideId.set(guide.id);\n }\n\n formatEdges(edges: InspectMeasurement['padding']) {\n return `${formatValue(edges.top)} ${formatValue(edges.right)} ${formatValue(edges.bottom)} ${formatValue(edges.left)}`;\n }\n\n formatGap(selected: InspectMeasurement) {\n return `${formatValue(selected.gap.row)} / ${formatValue(selected.gap.column)}`;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n const key = event.key.toLowerCase();\n\n if (key === 'm') {\n event.preventDefault();\n this.enabled.update((value) => !value);\n if (!this.enabled()) {\n this.toolMode.set('none');\n this.hoverRect.set(null);\n this.selectedGuideId.set(null);\n this.distanceOverlay.set(null);\n this.textBlocks.set([]);\n this.guidePreview.set(null);\n }\n this.refreshTypographyBlocks();\n return;\n }\n\n if (!this.enabled()) {\n return;\n }\n\n if ((event.metaKey || event.ctrlKey) && key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.redo() : this.undo();\n return;\n }\n\n if (key === 's') {\n event.preventDefault();\n this.setToolMode('select');\n return;\n }\n\n if (key === 'g') {\n event.preventDefault();\n this.setToolMode('guides');\n return;\n }\n\n if (key === 'h') {\n event.preventDefault();\n this.setGuideOrientation('horizontal');\n return;\n }\n\n if (key === 'v') {\n event.preventDefault();\n this.setGuideOrientation('vertical');\n return;\n }\n\n if (event.key === 'Alt') {\n this.altPressed.set(true);\n this.updateDistanceOverlay();\n return;\n }\n\n if (key === 'escape') {\n event.preventDefault();\n this.selectedMeasurement.set(null);\n this.selectedGuideId.set(null);\n this.hoverRect.set(null);\n this.distanceOverlay.set(null);\n this.selectedElement = null;\n this.hoverElement = null;\n this.guidePreview.set(null);\n this.clearGuides();\n this.refreshTypographyBlocks();\n return;\n }\n\n if ((key === 'backspace' || key === 'delete') && this.selectedGuideId()) {\n event.preventDefault();\n const nextGuides = this.guides().filter(\n (guide) => guide.id !== this.selectedGuideId(),\n );\n this.guides.set(nextGuides);\n this.selectedGuideId.set(null);\n this.recordHistory(nextGuides);\n }\n }\n\n @HostListener('window:keyup', ['$event'])\n handleKeyup(event: KeyboardEvent) {\n if (event.key === 'Alt') {\n this.altPressed.set(false);\n this.distanceOverlay.set(null);\n }\n }\n\n @HostListener('window:pointermove', ['$event'])\n handlePointerMove(event: PointerEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n if (this.draggingGuideId) {\n this.guidePreview.set(null);\n const viewport = getViewportSize();\n this.guides.set(\n this.guides().map((guide) => {\n if (guide.id !== this.draggingGuideId) {\n return guide;\n }\n const rawPosition =\n guide.orientation === 'vertical' ? event.clientX : event.clientY;\n const max =\n guide.orientation === 'vertical' ? viewport.width : viewport.height;\n return { ...guide, position: clamp(rawPosition, 0, max) };\n }),\n );\n return;\n }\n\n if (this.toolMode() === 'guides') {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n\n if (\n this.overlayRoot()?.nativeElement.contains(event.target as Node) ??\n false\n ) {\n this.guidePreview.set(null);\n return;\n }\n\n this.guidePreview.set(this.getGuidePreview(event));\n return;\n }\n\n this.guidePreview.set(null);\n\n if (this.toolMode() !== 'select' || !this.hoverHighlightEnabled) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n if (!this.altPressed()) {\n return;\n }\n }\n\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n this.overlayRoot()?.nativeElement ?? null,\n );\n if (!target) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n return;\n }\n\n const rect = getRectFromDom(target);\n this.hoverElement = target;\n if (!rectsEqual(rect, this.hoverRect())) {\n this.hoverRect.set(rect);\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n @HostListener('window:pointerup')\n handlePointerUp() {\n if (!this.draggingGuideId) {\n return;\n }\n this.recordHistory(this.guides());\n this.draggingGuideId = null;\n }\n\n @HostListener('window:click', ['$event'])\n handleClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n\n if (this.toolMode() === 'guides') {\n if (overlay && overlay.contains(event.target as Node)) {\n return;\n }\n const guide = this.getGuidePreview(event);\n this.addGuide({ ...guide, id: createId() });\n this.guidePreview.set(guide);\n return;\n }\n\n if (!this.canInspectClick(event)) {\n return;\n }\n\n this.selectElementAtPoint(event);\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n handleViewportChange() {\n if (this.selectedElement && document.contains(this.selectedElement)) {\n this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n private canInspectClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser || this.toolMode() !== 'select') {\n return false;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n return !(overlay && overlay.contains(event.target as Node));\n }\n\n private selectElementAtPoint(event: MouseEvent) {\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n overlay,\n );\n if (!target) {\n this.selectedMeasurement.set(null);\n this.selectedElement = null;\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n return false;\n }\n\n // Ctrl+click: select the minimum common parent of current selection and clicked element\n if ((event.ctrlKey || event.metaKey) && this.selectedElement) {\n const commonParent = this.findMinimumCommonParent(\n this.selectedElement,\n target,\n );\n if (\n commonParent &&\n commonParent !== document.body &&\n commonParent !== document.documentElement\n ) {\n this.selectedMeasurement.set(getInspectMeasurement(commonParent));\n this.selectedElement = commonParent;\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n }\n\n this.selectedMeasurement.set(getInspectMeasurement(target));\n this.selectedElement = target;\n this.selectedGuideId.set(\n this.findGuideAtPoint(event.clientX, event.clientY),\n );\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n\n private updateDistanceOverlay() {\n if (\n !this.altPressed() ||\n !this.selectedElement ||\n !this.hoverElement ||\n this.selectedElement === this.hoverElement ||\n this.selectedElement.contains(this.hoverElement) ||\n this.hoverElement.contains(this.selectedElement)\n ) {\n this.distanceOverlay.set(null);\n return;\n }\n\n this.distanceOverlay.set(\n getDistanceOverlay(\n getRectFromDom(this.selectedElement),\n getRectFromDom(this.hoverElement),\n ),\n );\n }\n\n private refreshTypographyBlocks() {\n if (!this.isBrowser || !this.enabled() || !this.showTypography()) {\n this.textBlocks.set([]);\n return;\n }\n\n const viewport = getViewportSize();\n this.textBlocks.set(\n getVisibleTextBlocks(this.overlayRoot()?.nativeElement ?? null)\n .filter(\n (block) =>\n block.rect.top >= 0 &&\n block.rect.top <= viewport.height &&\n block.rect.left >= 0 &&\n block.rect.left <= viewport.width,\n )\n .map((block) => ({\n ...block,\n rect: {\n ...block.rect,\n left: clamp(block.rect.left, 0, viewport.width - 12),\n top: clamp(block.rect.top, 14, viewport.height),\n },\n })),\n );\n }\n\n private addGuide(guide: Guide) {\n const nextGuides = [...this.guides(), guide];\n this.guides.set(nextGuides);\n this.selectedGuideId.set(guide.id);\n this.recordHistory(nextGuides);\n }\n\n private getGuidePreview(event: PointerEvent | MouseEvent): Guide {\n const viewport = getViewportSize();\n const orientation = this.guideOrientation();\n const rawPosition =\n orientation === 'vertical' ? event.clientX : event.clientY;\n const max = orientation === 'vertical' ? viewport.width : viewport.height;\n\n return {\n id: 'preview',\n orientation,\n position: this.snapGuide(clamp(rawPosition, 0, max)),\n };\n }\n\n private snapGuide(position: number) {\n for (const guide of this.guides()) {\n if (Math.abs(guide.position - position) <= GUIDE_SNAP_DISTANCE) {\n return guide.position;\n }\n }\n return position;\n }\n\n private findGuideAtPoint(x: number, y: number) {\n for (const guide of this.guides()) {\n if (\n guide.orientation === 'vertical' &&\n Math.abs(guide.position - x) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n if (\n guide.orientation === 'horizontal' &&\n Math.abs(guide.position - y) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n }\n return null;\n }\n\n private undo() {\n if (!this.canUndo()) {\n return;\n }\n const nextIndex = this.historyIndex() - 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private redo() {\n if (!this.canRedo()) {\n return;\n }\n const nextIndex = this.historyIndex() + 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private recordHistory(guides: Guide[]) {\n const base = this.history().slice(0, this.historyIndex() + 1);\n base.push(this.cloneGuides(guides));\n this.history.set(base);\n this.historyIndex.set(base.length - 1);\n }\n\n private cloneGuides(guides: Guide[]) {\n return guides.map((guide) => ({ ...guide }));\n }\n\n private findMinimumCommonParent(\n elementA: HTMLElement,\n elementB: HTMLElement,\n ): HTMLElement | null {\n // Build ancestor chain for element A\n const ancestorsA = new Set<Element>();\n let current: Element | null = elementA;\n while (current) {\n ancestorsA.add(current);\n current = current.parentElement;\n }\n\n // Walk up from elementB until we find a common ancestor\n current = elementB;\n while (current) {\n if (ancestorsA.has(current)) {\n return current as HTMLElement;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n}\n","<div class=\"inspector-root\" #overlayRoot>\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n title=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n title=\"Typography mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n </button>\n <div class=\"inspector-guide-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--guide-main\"\n [class.is-active]=\"toolMode() === 'guides'\"\n (click)=\"setToolMode('guides')\"\n title=\"Guides mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 2h1v12H4zM11 2h1v12h-1zM2 4h12v1H2zM2 11h12v1H2z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--ghost inspector-icon-button--guide-menu\"\n [class.is-active]=\"guideMenuOpen()\"\n (click)=\"toggleGuideMenu()\"\n title=\"Guide options\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4.47 6.97L8 10.5l3.53-3.53-.94-.94L8 8.62 5.41 6.03z\" />\n </svg>\n </button>\n\n @if (guideMenuOpen()) {\n <div class=\"inspector-guide-menu\">\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'vertical'\"\n (click)=\"setGuideOrientation('vertical')\"\n >\n Vertical\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'horizontal'\"\n (click)=\"setGuideOrientation('horizontal')\"\n >\n Horizontal\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment inspector-segment--danger\"\n (click)=\"clearGuides()\"\n >\n Clear\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { ElementRef } from '@angular/core';
1
+ import { ElementRef, OnDestroy } from '@angular/core';
2
2
  import { DistanceOverlay, Guide, GuideOrientation, InspectMeasurement, Rect, TextBlockAnnotation, ToolMode } from './types';
3
3
  import * as i0 from "@angular/core";
4
- export declare class inspectorComponent {
4
+ export declare class inspectorComponent implements OnDestroy {
5
5
  readonly Math: Math;
6
6
  readonly formatValue: (value: number) => number;
7
7
  readonly guideHitboxSize = 14;
@@ -28,6 +28,7 @@ export declare class inspectorComponent {
28
28
  private readonly hydrated;
29
29
  private readonly history;
30
30
  private readonly historyIndex;
31
+ private readonly handleCapturedClick;
31
32
  private draggingGuideId;
32
33
  private selectedElement;
33
34
  private hoverElement;
@@ -35,6 +36,7 @@ export declare class inspectorComponent {
35
36
  readonly canRedo: import("@angular/core").Signal<boolean>;
36
37
  constructor(platformId: object);
37
38
  ngOnInit(): void;
39
+ ngOnDestroy(): void;
38
40
  setToolMode(mode: ToolMode): void;
39
41
  setGuideOrientation(orientation: GuideOrientation): void;
40
42
  toggleTypography(): void;
@@ -52,6 +54,8 @@ export declare class inspectorComponent {
52
54
  handlePointerUp(): void;
53
55
  handleClick(event: MouseEvent): void;
54
56
  handleViewportChange(): void;
57
+ private canInspectClick;
58
+ private selectElementAtPoint;
55
59
  private updateDistanceOverlay;
56
60
  private refreshTypographyBlocks;
57
61
  private addGuide;
@@ -62,6 +66,7 @@ export declare class inspectorComponent {
62
66
  private redo;
63
67
  private recordHistory;
64
68
  private cloneGuides;
69
+ private findMinimumCommonParent;
65
70
  static ɵfac: i0.ɵɵFactoryDeclaration<inspectorComponent, never>;
66
71
  static ɵcmp: i0.ɵɵComponentDeclaration<inspectorComponent, "inspector-overlay", never, { "highlightColor": { "alias": "highlightColor"; "required": false; }; "guideColor": { "alias": "guideColor"; "required": false; }; "hoverHighlightEnabled": { "alias": "hoverHighlightEnabled"; "required": false; }; "persistOnReload": { "alias": "persistOnReload"; "required": false; }; }, {}, never, never, true, never>;
67
72
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inspector-ng",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.3.0",
6
6
  "@angular/core": "^17.3.0"