@firestitch/report 18.19.0 → 18.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, EventEmitte
2
2
  import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
3
3
  import { DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';
4
4
  import { MatIcon } from '@angular/material/icon';
5
+ import { MatProgressSpinner } from '@angular/material/progress-spinner';
5
6
  import { MatTooltip } from '@angular/material/tooltip';
6
7
  import { FsMenuModule } from '@firestitch/menu';
7
8
  import { FsMessage } from '@firestitch/message';
@@ -73,6 +74,9 @@ export class ReportCanvasComponent {
73
74
  // survives pages being reordered or deleted; an id that no longer resolves
74
75
  // falls back to the first page.
75
76
  pageId = null;
77
+ // The host is reloading the report a Refresh asked for: the button shows a
78
+ // spinner and takes no second press until it lands.
79
+ busy = false;
76
80
  // A component asked for its settings dialog — the page-level host opens it
77
81
  // (it owns MatDialog + the post-save reload).
78
82
  componentSettings = new EventEmitter();
@@ -82,6 +86,9 @@ export class ReportCanvasComponent {
82
86
  // The page on screen changed — the host keeps it in the report's state.
83
87
  // Carries the page id, never the index.
84
88
  pageChanged = new EventEmitter();
89
+ // Refresh was pressed — the host reloads the report (it owns the load), and
90
+ // every tile refetches as the reloaded report re-inits the filter state.
91
+ refresh = new EventEmitter();
85
92
  zoomPan;
86
93
  // The rendered components of the active page — only the canvas can reach the
87
94
  // one instance a settings save applies to.
@@ -150,6 +157,10 @@ export class ReportCanvasComponent {
150
157
  // A text block added by double-clicking a band, whose editor opens once the
151
158
  // reloaded report draws it.
152
159
  _editOnArrival = null;
160
+ // The page on screen when Refresh was pressed, which the reloaded report
161
+ // lands on by id (canvasLandingPage). Held until the refresh ends (busy
162
+ // goes off), whether it brought a report or failed.
163
+ _keepPageId = null;
153
164
  // The report input as a signal, for the token contexts and the master's
154
165
  // drawn components. Notifies on every set: a reload hands over a new report
155
166
  // even when nothing a token shows moved, and a deleted header or footer
@@ -218,9 +229,13 @@ export class ReportCanvasComponent {
218
229
  pageIds: this.pages().map((page) => page.id),
219
230
  pageId: this.pageId,
220
231
  activePageIndex: this.activePageIndex(),
232
+ keepPageId: this._keepPageId,
221
233
  }));
222
234
  this._previousPageCount = this.pages().length;
223
235
  this._previousReportId = reportId;
236
+ if (changes.busy && !this.busy) {
237
+ this._keepPageId = null;
238
+ }
224
239
  // Tell the host which page is open whenever that changes — including the
225
240
  // FIRST time the report renders, not only when someone clicks a page.
226
241
  // Hosts bind things to the open page (the report chat scopes its
@@ -516,7 +531,19 @@ export class ReportCanvasComponent {
516
531
  this.selectComponent(null);
517
532
  }
518
533
  }
519
- // ----- zoom toolbar ---------------------------------------------------------
534
+ // ----- refresh + zoom toolbar -----------------------------------------------
535
+ // The report again, for changes made away from this screen (the MCP, another
536
+ // tab) and for data that moved. The text blocks' values are read again now:
537
+ // a reload only reads them when the report it brings moves their request.
538
+ refreshReport() {
539
+ if (this.busy) {
540
+ return;
541
+ }
542
+ this._keepPageId = this.activePageId();
543
+ this._pageValues.reload$.next();
544
+ this._masterValues.reload$.next();
545
+ this.refresh.emit();
546
+ }
520
547
  onZoomed(scale) {
521
548
  this.zoom.set(scale);
522
549
  }
@@ -907,30 +934,35 @@ export class ReportCanvasComponent {
907
934
  this._guides?.nativeElement?.replaceChildren();
908
935
  }
909
936
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
910
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportCanvasComponent, isStandalone: true, selector: "app-report-canvas", inputs: { report: "report", editMode: "editMode", pageId: "pageId" }, outputs: { componentSettings: "componentSettings", reportChanged: "reportChanged", pageChanged: "pageChanged" }, viewQueries: [{ propertyName: "zoomPan", first: true, predicate: FsZoomPanComponent, descendants: true }, { propertyName: "_viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "_guides", first: true, predicate: ["guides"], descendants: true }, { propertyName: "_renderedComponents", predicate: ReportComponentComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n wheel=\"modifier\"\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage) {\n <div\n class=\"page\"\n [class.editing]=\"editMode\"\n [class.master-editing]=\"isMasterEditing\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.--canvas-zoom]=\"zoom()\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n <!-- The header and footer: the master's components, drawn under the\n page's own. -->\n @if (isMasterShown && masterComponents().length) {\n <div\n class=\"master-layer\"\n [class.editable]=\"isMasterEditing\">\n @for (component of masterComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isMasterEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"masterTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n </div>\n }\n\n <!-- The header and footer bands, as guides while editing. While the\n header and footer are edited, an empty band says how to fill it\n and a double-click adds a text block there. -->\n @if (editMode) {\n @if (bands.headerHeight) {\n <div\n class=\"band band-header\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.headerHeight * PX\"\n (dblclick)=\"addTextInBand('header', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Header</span>\n @if (isBandEmpty('header')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n @if (bands.footerHeight) {\n <div\n class=\"band band-footer\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.footerHeight * PX\"\n (dblclick)=\"addTextInBand('footer', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Footer</span>\n @if (isBandEmpty('footer')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n }\n\n @for (component of activePageComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isPageEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"pageTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!activePageComponents().length && !masterMode()) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land.\n Every page gets a chip, including a lone one: the chip is what tells\n you which page you are on, and a report that hid it left you unable to\n tell page 1 of 1 from a page that failed to load. Deleting the last\n page is refused server-side, so the kebab is safe to expose here. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @for (page of pages(); track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex()\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleMasterHidden(page)\">\n {{ page.masterHidden ? 'Show header & footer' : 'Hide header & footer' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out (Ctrl/Cmd + scroll)\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom() * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in (Ctrl/Cmd + scroll)\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.page.master-editing>app-report-component{opacity:.35;pointer-events:none}.master-layer{position:absolute;inset:0;pointer-events:none}.master-layer.editable{z-index:10}.master-layer.editable app-report-component{pointer-events:auto}.band{position:absolute;left:0;right:0;z-index:5;pointer-events:none;background:#2196f30a;border-color:#2196f373;border-style:dashed;border-width:0}.band.band-header{top:0;border-bottom-width:calc(1px / var(--canvas-zoom, 1))}.band.band-footer{bottom:0;border-top-width:calc(1px / var(--canvas-zoom, 1))}.band.addable{pointer-events:auto;cursor:text;-webkit-user-select:none;user-select:none}.band .band-hint{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(calc(1 / var(--canvas-zoom, 1)));color:#9aa5b1;white-space:nowrap}.band .band-label{position:absolute;top:calc(10px / var(--canvas-zoom, 1));left:calc(10px / var(--canvas-zoom, 1));transform:scale(calc(1 / var(--canvas-zoom, 1)));transform-origin:top left;color:#2196f3cc;font-weight:600;text-transform:uppercase;letter-spacing:.06em}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "ngmodule", type: FsZoomPanModule }, { kind: "component", type: i3.FsZoomPanComponent, selector: "fs-zoom-pan", inputs: ["zoomMax", "zoomMin", "zoomScale", "zoomDefault", "zoomFactor", "zoomFit", "fitMode", "fitPosition", "fitPadding", "fitMaxScale", "wheel", "top", "left"], outputs: ["moved", "zoomed"] }, { kind: "component", type: ReportComponentComponent, selector: "app-report-component", inputs: ["reportId", "component", "groups", "editMode", "zoom", "snapper", "selected", "tokens", "valueKeysElsewhere"], outputs: ["selectComponent", "positionChanged", "openSettings", "removed", "valueSettings", "textSaved", "valuesRemoved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
937
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportCanvasComponent, isStandalone: true, selector: "app-report-canvas", inputs: { report: "report", editMode: "editMode", pageId: "pageId", busy: "busy" }, outputs: { componentSettings: "componentSettings", reportChanged: "reportChanged", pageChanged: "pageChanged", refresh: "refresh" }, viewQueries: [{ propertyName: "zoomPan", first: true, predicate: FsZoomPanComponent, descendants: true }, { propertyName: "_viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "_guides", first: true, predicate: ["guides"], descendants: true }, { propertyName: "_renderedComponents", predicate: ReportComponentComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n wheel=\"modifier\"\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage) {\n <div\n class=\"page\"\n [class.editing]=\"editMode\"\n [class.master-editing]=\"isMasterEditing\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.--canvas-zoom]=\"zoom()\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n <!-- The header and footer: the master's components, drawn under the\n page's own. -->\n @if (isMasterShown && masterComponents().length) {\n <div\n class=\"master-layer\"\n [class.editable]=\"isMasterEditing\">\n @for (component of masterComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isMasterEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"masterTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n </div>\n }\n\n <!-- The header and footer bands, as guides while editing. While the\n header and footer are edited, an empty band says how to fill it\n and a double-click adds a text block there. -->\n @if (editMode) {\n @if (bands.headerHeight) {\n <div\n class=\"band band-header\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.headerHeight * PX\"\n (dblclick)=\"addTextInBand('header', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Header</span>\n @if (isBandEmpty('header')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n @if (bands.footerHeight) {\n <div\n class=\"band band-footer\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.footerHeight * PX\"\n (dblclick)=\"addTextInBand('footer', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Footer</span>\n @if (isBandEmpty('footer')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n }\n\n @for (component of activePageComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isPageEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"pageTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!activePageComponents().length && !masterMode()) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land.\n Every page gets a chip, including a lone one: the chip is what tells\n you which page you are on, and a report that hid it left you unable to\n tell page 1 of 1 from a page that failed to load. Deleting the last\n page is refused server-side, so the kebab is safe to expose here. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @for (page of pages(); track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex()\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleMasterHidden(page)\">\n {{ page.masterHidden ? 'Show header & footer' : 'Hide header & footer' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <!-- Refresh sits to the left of the zoom, in a pill of its own: both act\n on the whole page in view, but Refresh is not a zoom step. -->\n <div class=\"view-controls\">\n <div class=\"control-pill\">\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Refresh\"\n [disabled]=\"busy\"\n (click)=\"refreshReport()\">\n @if (busy) {\n <mat-spinner diameter=\"20\"></mat-spinner>\n } @else {\n <mat-icon>refresh</mat-icon>\n }\n </button>\n </div>\n\n <div class=\"control-pill\">\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Zoom out (Ctrl/Cmd + scroll)\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom() * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Zoom in (Ctrl/Cmd + scroll)\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .view-controls{display:flex;align-items:center;gap:4px;margin-left:auto}.canvas-toolbar .control-pill{display:flex;align-items:center;gap:2px;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .control-pill .control-button{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .control-pill .control-button:hover:not(:disabled){background:#f0f4f8}.canvas-toolbar .control-pill .control-button:disabled{cursor:default}.canvas-toolbar .control-pill .control-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .control-pill .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .control-pill .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.page.master-editing>app-report-component{opacity:.35;pointer-events:none}.master-layer{position:absolute;inset:0;pointer-events:none}.master-layer.editable{z-index:10}.master-layer.editable app-report-component{pointer-events:auto}.band{position:absolute;left:0;right:0;z-index:5;pointer-events:none;background:#2196f30a;border-color:#2196f373;border-style:dashed;border-width:0}.band.band-header{top:0;border-bottom-width:calc(1px / var(--canvas-zoom, 1))}.band.band-footer{bottom:0;border-top-width:calc(1px / var(--canvas-zoom, 1))}.band.addable{pointer-events:auto;cursor:text;-webkit-user-select:none;user-select:none}.band .band-hint{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(calc(1 / var(--canvas-zoom, 1)));color:#9aa5b1;white-space:nowrap}.band .band-label{position:absolute;top:calc(10px / var(--canvas-zoom, 1));left:calc(10px / var(--canvas-zoom, 1));transform:scale(calc(1 / var(--canvas-zoom, 1)));transform-origin:top left;color:#2196f3cc;font-weight:600;text-transform:uppercase;letter-spacing:.06em}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "ngmodule", type: FsZoomPanModule }, { kind: "component", type: i3.FsZoomPanComponent, selector: "fs-zoom-pan", inputs: ["zoomMax", "zoomMin", "zoomScale", "zoomDefault", "zoomFactor", "zoomFit", "fitMode", "fitPosition", "fitPadding", "fitMaxScale", "wheel", "top", "left"], outputs: ["moved", "zoomed"] }, { kind: "component", type: ReportComponentComponent, selector: "app-report-component", inputs: ["reportId", "component", "groups", "editMode", "zoom", "snapper", "selected", "tokens", "valueKeysElsewhere"], outputs: ["selectComponent", "positionChanged", "openSettings", "removed", "valueSettings", "textSaved", "valuesRemoved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
911
938
  }
912
939
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportCanvasComponent, decorators: [{
913
940
  type: Component,
914
941
  args: [{ selector: 'app-report-canvas', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
915
942
  DragDropModule,
916
943
  MatIcon,
944
+ MatProgressSpinner,
917
945
  MatTooltip,
918
946
  FsMenuModule,
919
947
  FsZoomPanModule,
920
948
  ReportComponentComponent,
921
- ], template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n wheel=\"modifier\"\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage) {\n <div\n class=\"page\"\n [class.editing]=\"editMode\"\n [class.master-editing]=\"isMasterEditing\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.--canvas-zoom]=\"zoom()\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n <!-- The header and footer: the master's components, drawn under the\n page's own. -->\n @if (isMasterShown && masterComponents().length) {\n <div\n class=\"master-layer\"\n [class.editable]=\"isMasterEditing\">\n @for (component of masterComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isMasterEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"masterTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n </div>\n }\n\n <!-- The header and footer bands, as guides while editing. While the\n header and footer are edited, an empty band says how to fill it\n and a double-click adds a text block there. -->\n @if (editMode) {\n @if (bands.headerHeight) {\n <div\n class=\"band band-header\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.headerHeight * PX\"\n (dblclick)=\"addTextInBand('header', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Header</span>\n @if (isBandEmpty('header')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n @if (bands.footerHeight) {\n <div\n class=\"band band-footer\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.footerHeight * PX\"\n (dblclick)=\"addTextInBand('footer', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Footer</span>\n @if (isBandEmpty('footer')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n }\n\n @for (component of activePageComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isPageEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"pageTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!activePageComponents().length && !masterMode()) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land.\n Every page gets a chip, including a lone one: the chip is what tells\n you which page you are on, and a report that hid it left you unable to\n tell page 1 of 1 from a page that failed to load. Deleting the last\n page is refused server-side, so the kebab is safe to expose here. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @for (page of pages(); track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex()\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleMasterHidden(page)\">\n {{ page.masterHidden ? 'Show header & footer' : 'Hide header & footer' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out (Ctrl/Cmd + scroll)\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom() * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in (Ctrl/Cmd + scroll)\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.page.master-editing>app-report-component{opacity:.35;pointer-events:none}.master-layer{position:absolute;inset:0;pointer-events:none}.master-layer.editable{z-index:10}.master-layer.editable app-report-component{pointer-events:auto}.band{position:absolute;left:0;right:0;z-index:5;pointer-events:none;background:#2196f30a;border-color:#2196f373;border-style:dashed;border-width:0}.band.band-header{top:0;border-bottom-width:calc(1px / var(--canvas-zoom, 1))}.band.band-footer{bottom:0;border-top-width:calc(1px / var(--canvas-zoom, 1))}.band.addable{pointer-events:auto;cursor:text;-webkit-user-select:none;user-select:none}.band .band-hint{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(calc(1 / var(--canvas-zoom, 1)));color:#9aa5b1;white-space:nowrap}.band .band-label{position:absolute;top:calc(10px / var(--canvas-zoom, 1));left:calc(10px / var(--canvas-zoom, 1));transform:scale(calc(1 / var(--canvas-zoom, 1)));transform-origin:top left;color:#2196f3cc;font-weight:600;text-transform:uppercase;letter-spacing:.06em}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"] }]
949
+ ], template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n wheel=\"modifier\"\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage) {\n <div\n class=\"page\"\n [class.editing]=\"editMode\"\n [class.master-editing]=\"isMasterEditing\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.--canvas-zoom]=\"zoom()\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n <!-- The header and footer: the master's components, drawn under the\n page's own. -->\n @if (isMasterShown && masterComponents().length) {\n <div\n class=\"master-layer\"\n [class.editable]=\"isMasterEditing\">\n @for (component of masterComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isMasterEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"masterTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n </div>\n }\n\n <!-- The header and footer bands, as guides while editing. While the\n header and footer are edited, an empty band says how to fill it\n and a double-click adds a text block there. -->\n @if (editMode) {\n @if (bands.headerHeight) {\n <div\n class=\"band band-header\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.headerHeight * PX\"\n (dblclick)=\"addTextInBand('header', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Header</span>\n @if (isBandEmpty('header')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n @if (bands.footerHeight) {\n <div\n class=\"band band-footer\"\n [class.addable]=\"isMasterEditing\"\n [style.height.px]=\"bands.footerHeight * PX\"\n (dblclick)=\"addTextInBand('footer', $event)\">\n @if (isMasterEditing) {\n <span class=\"band-label small\">Footer</span>\n @if (isBandEmpty('footer')) {\n <span class=\"band-hint small\">Double-click to add text</span>\n }\n }\n </div>\n }\n }\n\n @for (component of activePageComponents(); track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"isPageEditing\"\n [zoom]=\"zoom()\"\n [snapper]=\"snapper\"\n [tokens]=\"pageTokens()\"\n [valueKeysElsewhere]=\"valueKeysElsewhere\"\n [selected]=\"component.id === selectedComponentId()\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (removed)=\"onComponentRemoved($event)\"\n (openSettings)=\"componentSettings.emit($event)\"\n (valueSettings)=\"openValueSettings(component, $event)\"\n (textSaved)=\"onTextSaved(component, $event)\"\n (valuesRemoved)=\"reportChanged.emit()\">\n </app-report-component>\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!activePageComponents().length && !masterMode()) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land.\n Every page gets a chip, including a lone one: the chip is what tells\n you which page you are on, and a report that hid it left you unable to\n tell page 1 of 1 from a page that failed to load. Deleting the last\n page is refused server-side, so the kebab is safe to expose here. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @for (page of pages(); track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex()\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleMasterHidden(page)\">\n {{ page.masterHidden ? 'Show header & footer' : 'Hide header & footer' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <!-- Refresh sits to the left of the zoom, in a pill of its own: both act\n on the whole page in view, but Refresh is not a zoom step. -->\n <div class=\"view-controls\">\n <div class=\"control-pill\">\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Refresh\"\n [disabled]=\"busy\"\n (click)=\"refreshReport()\">\n @if (busy) {\n <mat-spinner diameter=\"20\"></mat-spinner>\n } @else {\n <mat-icon>refresh</mat-icon>\n }\n </button>\n </div>\n\n <div class=\"control-pill\">\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Zoom out (Ctrl/Cmd + scroll)\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom() * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Zoom in (Ctrl/Cmd + scroll)\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"control-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .view-controls{display:flex;align-items:center;gap:4px;margin-left:auto}.canvas-toolbar .control-pill{display:flex;align-items:center;gap:2px;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .control-pill .control-button{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .control-pill .control-button:hover:not(:disabled){background:#f0f4f8}.canvas-toolbar .control-pill .control-button:disabled{cursor:default}.canvas-toolbar .control-pill .control-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .control-pill .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .control-pill .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.page.master-editing>app-report-component{opacity:.35;pointer-events:none}.master-layer{position:absolute;inset:0;pointer-events:none}.master-layer.editable{z-index:10}.master-layer.editable app-report-component{pointer-events:auto}.band{position:absolute;left:0;right:0;z-index:5;pointer-events:none;background:#2196f30a;border-color:#2196f373;border-style:dashed;border-width:0}.band.band-header{top:0;border-bottom-width:calc(1px / var(--canvas-zoom, 1))}.band.band-footer{bottom:0;border-top-width:calc(1px / var(--canvas-zoom, 1))}.band.addable{pointer-events:auto;cursor:text;-webkit-user-select:none;user-select:none}.band .band-hint{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(calc(1 / var(--canvas-zoom, 1)));color:#9aa5b1;white-space:nowrap}.band .band-label{position:absolute;top:calc(10px / var(--canvas-zoom, 1));left:calc(10px / var(--canvas-zoom, 1));transform:scale(calc(1 / var(--canvas-zoom, 1)));transform-origin:top left;color:#2196f3cc;font-weight:600;text-transform:uppercase;letter-spacing:.06em}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"] }]
922
950
  }], ctorParameters: () => [], propDecorators: { report: [{
923
951
  type: Input
924
952
  }], editMode: [{
925
953
  type: Input
926
954
  }], pageId: [{
927
955
  type: Input
956
+ }], busy: [{
957
+ type: Input
928
958
  }], componentSettings: [{
929
959
  type: Output
930
960
  }], reportChanged: [{
931
961
  type: Output
932
962
  }], pageChanged: [{
933
963
  type: Output
964
+ }], refresh: [{
965
+ type: Output
934
966
  }], zoomPan: [{
935
967
  type: ViewChild,
936
968
  args: [FsZoomPanComponent]
@@ -944,4 +976,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
944
976
  type: ViewChild,
945
977
  args: ['guides', { static: false }]
946
978
  }] } });
947
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUM3RCxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUNyRixRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FDekMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTlFLE9BQU8sRUFBZSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0UsT0FBTyxFQUNPLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUUs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QztJQUNqRCxDQUFDO3dHQXhrQ1UscUJBQXFCOzRGQUFyQixxQkFBcUIsNlNBdUJyQixrQkFBa0IsbVFBS2Ysd0JBQXdCLHFFQ2xNeEMsaTJSQWdPQSxtMEtEbEVJLGNBQWMsNi9CQUNkLE9BQU8sMklBQ1AsVUFBVSxnUkFDVixZQUFZLHVaQUNaLGVBQWUsOFNBQ2Ysd0JBQXdCOzs0RkFHZixxQkFBcUI7a0JBZmpDLFNBQVM7K0JBQ0UsbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLGNBQWM7d0JBQ2QsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLFlBQVk7d0JBQ1osZUFBZTt3QkFDZix3QkFBd0I7cUJBQ3pCO3dEQUllLE1BQU07c0JBQXJCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFNVSxNQUFNO3NCQUFyQixLQUFLO2dCQUlXLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFJVSxhQUFhO3NCQUE3QixNQUFNO2dCQUlVLFdBQVc7c0JBQTNCLE1BQU07Z0JBR0EsT0FBTztzQkFEYixTQUFTO3VCQUFDLGtCQUFrQjtnQkFNckIsbUJBQW1CO3NCQUQxQixZQUFZO3VCQUFDLHdCQUF3QjtnQkFJOUIsU0FBUztzQkFEaEIsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkvQixPQUFPO3NCQURkLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBRdWVyeUxpc3QsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLFxuICBXcml0YWJsZVNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgRHJhZ0Ryb3BNb2R1bGUsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNab29tUGFuQ29tcG9uZW50LCBGc1pvb21QYW5Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC96b29tLXBhbic7XG5cbmltcG9ydCB7XG4gIE9ic2VydmFibGUsIFN1YmplY3QsIGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciBhcyByeEZpbHRlciwgZnJvbSwgbWFwLCBtZXJnZSwgbWVyZ2VNYXAsXG4gIG9mLCBzd2l0Y2hNYXAsIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGNhbnZhc0xhbmRpbmdQYWdlIH0gZnJvbSAnLi4vLi4vY2FudmFzLWxhbmRpbmctcGFnZSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyB2YWx1ZVBpY2tzIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1maWx0ZXItbGluZXMnO1xuaW1wb3J0IHsgbGF5ZXJGaWx0ZXJHcm91cHMsIHNhbWVGaWx0ZXJGaWVsZHMsIHRleHRGaWx0ZXJGaWVsZHMgfSBmcm9tICcuLi8uLi9maWx0ZXItdGV4dCc7XG5pbXBvcnQge1xuICBDb21wb25lbnRTZXR0aW5ncywgUmVwb3J0LCBSZXBvcnRDb21wb25lbnQsIFJlcG9ydEZpbHRlckdyb3VwLCBSZXBvcnRIZWFkZXJGb290ZXIsIFJlcG9ydE1hc3RlciwgUmVwb3J0UGFnZSxcbiAgUmVwb3J0UGFnZVZhbHVlLCBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9IRUFESU5HX1NJWkUgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHsgZ3JvdXBPcHRpb25zUmVhZGVyLCBwaWNrZWRPcHRpb25OYW1lcyB9IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dEZpbHRlckZpZWxkLCBUZXh0VG9rZW5Db250ZXh0IH0gZnJvbSAnLi4vLi4vdGV4dCc7XG5pbXBvcnQgeyB2YWx1ZXNNYXRjaEFueUdyb3VwSWRzIH0gZnJvbSAnLi4vLi4vdGlsZS1kYXRhLXN0YXRlJztcbmltcG9ydCB7XG4gIGlzRHJhd24sIGxheWVyVmFsdWVLZXlzLCBzYW1lVGV4dFZhbHVlcywgc2hvd25WYWx1ZXMsIHRleHRWYWx1ZXMsIHZhbHVlS2V5LCB2YWx1ZUtleXMsXG59IGZyb20gJy4uLy4uL3ZhbHVlcyc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnRDb21wb25lbnQgfSBmcm9tICcuLi9yZXBvcnQtY29tcG9uZW50L3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50JztcblxuXG4vLyBTY3JlZW4gZGVuc2l0eSBvZiB0aGUgY2FudmFzOiA5NiBDU1MgcHggcGVyIGluY2ggKHRoZSBDU1MgcmVmZXJlbmNlIHBpeGVsKSxcbi8vIGJlZm9yZSB6b29tLiBBbGwgZ2VvbWV0cnkgc3RheXMgaW4gaW5jaGVzOyBvbmx5IHJlbmRlcmluZyBtdWx0aXBsaWVzIGJ5IGl0LlxuZXhwb3J0IGNvbnN0IFBYX1BFUl9JTkNIID0gOTY7XG5cbi8vIE9uZSBzbWFydCBndWlkZSBsaW5lLCBpbiBwYWdlIGluY2hlcy5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpZGVMaW5lIHtcbiAgb3JpZW50YXRpb246ICd2JyB8ICdoJztcbiAgcG9zaXRpb246IG51bWJlcjtcbn1cblxuLy8gVGhlIHNuYXBwaW5nIGNvbnRyYWN0IGhhbmRlZCB0byBlYWNoIGNvbXBvbmVudCdzIGRyYWcgbG9vcC4gSW1wbGVtZW50ZWQgYnlcbi8vIHRoZSBjYW52YXMgYmVjYXVzZSBvbmx5IGl0IHNlZXMgZXZlcnkgY29tcG9uZW50IChhbGlnbm1lbnQgY2FuZGlkYXRlcykgYW5kXG4vLyBvd25zIHRoZSBndWlkZXMgb3ZlcmxheS5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FudmFzU25hcHBlciB7XG4gIHNuYXBNb3ZlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgc25hcFJlc2l6ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZ2VvbWV0cnk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sIGhhbmRsZTogc3RyaW5nKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfTtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuLy8gT25lIGxheWVyJ3MgdmFsdWVzIHJlcXVlc3QgKGEgcGFnZSwgb3IgdGhlIG1hc3RlciksIHJlYWQgd2hlbiBpdCBpcyBzZW50OlxuLy8gdGhlIGxheWVyLCB0aGUgdmFsdWVzIGl0cyB0ZXh0IHNob3dzIGF0IHRoYXQgbW9tZW50ICh3aGF0IHJlYWRzIGFzIGxvYWRpbmdcbi8vIHVudGlsIGl0IGxhbmRzKSBhbmQgdGhlIGZpbHRlciB2YWx1ZXMgb2YgZXZlcnkgdmFsdWUgb24gdGhlIGxheWVyLlxuaW50ZXJmYWNlIExheWVyVmFsdWVzUmVxdWVzdCB7XG4gIHBhZ2VJZDogbnVtYmVyIHwgbnVsbDtcbiAgc2hvd246IFJlcG9ydENvbXBvbmVudFtdO1xuICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW107XG4gIC8vIFdoaWxlIHRoZSBncm91cHMgbWF0Y2ggJ2FueScsIHRoZSBncm91cHMgdGhhdCBjb21iaW5lXG4gIC8vICh2YWx1ZXNNYXRjaEFueUdyb3VwSWRzKTsgZW1wdHkgb3RoZXJ3aXNlLlxuICBtYXRjaEFueUdyb3VwSWRzOiBudW1iZXJbXTtcbiAgLy8gRXZlcnl0aGluZyB0aGUgbGF5ZXIncyBudW1iZXJzIGRlcGVuZCBvbjogdGhlIHJlcXVlc3QsIGFuZCBob3cgZWFjaCB2YWx1ZVxuICAvLyBpdCByZWFkcyBpcyBkZWZpbmVkLiBBIHJlbG9hZCBvZiB0aGUgcmVwb3J0IHRoYXQgbGVhdmVzIGl0IGFzIGl0IHdhcyBhc2tzXG4gIC8vIGZvciBub3RoaW5nLlxuICBzaWduYXR1cmU6IHN0cmluZztcbn1cblxuLy8gT25lIGxheWVyJ3MgbnVtYmVycyBhcyB0aGV5IGxhc3QgYXJyaXZlZCwgYnkgdmFsdWUgaWQsIGFuZCB0aGUgcmVxdWVzdCB0aGV5XG4vLyBhbnN3ZXIg4oCUIHJlc3VsdHMgZm9yIGFub3RoZXIgcGFnZSBhcmUgbm90IHRoaXMgcGFnZSdzLlxuaW50ZXJmYWNlIExheWVyVmFsdWVzIHtcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsO1xuICBzaWduYXR1cmU6IHN0cmluZztcbiAgcm93czogUmVhZG9ubHlNYXA8bnVtYmVyLCBSZXBvcnRQYWdlVmFsdWU+O1xufVxuXG4vLyBBIGxheWVyIHdob3NlIHZhbHVlcyB0aGUgY2FudmFzIHJlYWRzOiB0aGUgYWN0aXZlIHBhZ2UsIG9yIHRoZSBtYXN0ZXIuXG5pbnRlcmZhY2UgVmFsdWVMYXllciB7XG4gIC8vIFRoZSBsYXllciBhcyBpdCBzdGFuZHMsIG9yIG51bGwgd2hlbiBub25lIG9mIGl0cyBudW1iZXJzIGFyZSBuZWVkZWQuXG4gIHNvdXJjZTogKCkgPT4gUmVwb3J0UGFnZSB8IFJlcG9ydE1hc3RlciB8IG51bGw7XG4gIC8vIEFza3MgZm9yIGl0cyBudW1iZXJzIGFnYWluLlxuICByZWxvYWQkOiBTdWJqZWN0PHZvaWQ+O1xuICAvLyBJdHMgbnVtYmVycyBhcyB0aGV5IGxhc3QgYXJyaXZlZC5cbiAgcmVzdWx0czogV3JpdGFibGVTaWduYWw8TGF5ZXJWYWx1ZXMgfCBudWxsPjtcbiAgLy8gVGhlIHJlcXVlc3Qgb24gaXRzIHdheSwgbnVsbCBvbmNlIGl0IGhhcyBsYW5kZWQuIEEgdmFsdWUgaXQgYXNrcyBmb3JcbiAgLy8gcmVhZHMgYXMgbG9hZGluZyB1bnRpbCB0aGVuLCBzbyBhIG51bWJlciBvbiBzY3JlZW4gaXMgbmV2ZXIgb25lIHJlYWQgZm9yXG4gIC8vIGFuIGVhcmxpZXIgcmVxdWVzdCAoYW5vdGhlciBmaWx0ZXIsIHRoZSB2YWx1ZSBhcyBpdCB3YXMpLlxuICBwZW5kaW5nOiBXcml0YWJsZVNpZ25hbDxMYXllclZhbHVlc1JlcXVlc3QgfCBudWxsPjtcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAgd2l0aCBvcHRpb25zIHBpY2tlZCB3aG9zZSBuYW1lcyBhIGZpbHRlciB0b2tlbiByZWFkcyxcbi8vIGtleWVkIGJ5IHRoZSBncm91cCBhbmQgdGhlIHBpY2tlZCBpZHMgKG9wdGlvbk5hbWVzS2V5KS5cbmludGVyZmFjZSBPcHRpb25QaWNrIHtcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwO1xuICByZXBvcnRJZDogbnVtYmVyO1xuICB2YWx1ZXM6IHVua25vd25bXTtcbiAga2V5OiBzdHJpbmc7XG59XG5cbi8vIFdoZXRoZXIgdHdvIHRva2VuIGNvbnRleHRzIGZpbGwgZXZlcnkgdG9rZW4gdGhlIHNhbWUsIHNvIHJlY29tcHV0aW5nIG9uZVxuLy8gdGhhdCBjaGFuZ2VkIG5vdGhpbmcgYSB0b2tlbiBzaG93cyBoYW5kcyBiYWNrIHRoZSBvYmplY3QgdGhlIGJsb2NrcyBoYXZlLlxuZnVuY3Rpb24gc2FtZVRva2VucyhhOiBUZXh0VG9rZW5Db250ZXh0LCBiOiBUZXh0VG9rZW5Db250ZXh0KTogYm9vbGVhbiB7XG4gIHJldHVybiBhLnBhZ2VOdW1iZXIgPT09IGIucGFnZU51bWJlclxuICAgICYmIGEucGFnZU5hbWUgPT09IGIucGFnZU5hbWVcbiAgICAmJiBhLnJlcG9ydE5hbWUgPT09IGIucmVwb3J0TmFtZVxuICAgICYmIGEudmFsdWVQYWdlSWQgPT09IGIudmFsdWVQYWdlSWRcbiAgICAmJiBzYW1lVGV4dFZhbHVlcyhhLnZhbHVlcywgYi52YWx1ZXMpXG4gICAgJiYgc2FtZUZpbHRlckZpZWxkcyhhLmZpbHRlcnMsIGIuZmlsdGVycyk7XG59XG5cbi8vIE9uZSBvZiB0aGUgdHdvIGJhbmRzIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBhcmUgZHJhd24gaW4uXG50eXBlIEJhbmQgPSAnaGVhZGVyJyB8ICdmb290ZXInO1xuXG4vLyBXaGF0IHRoZSBuYW1lcyBvZiBhIHNlbGVjdCBncm91cCdzIHBpY2tlZCBvcHRpb25zIGFyZSBrZXB0IHVuZGVyLlxuZnVuY3Rpb24gb3B0aW9uTmFtZXNLZXkoZ3JvdXBJZDogbnVtYmVyLCB2YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbZ3JvdXBJZCwgdmFsdWVzLm1hcChTdHJpbmcpXSk7XG59XG5cbi8vIFRoZSBmaXhlZC1zaXplIHBhZ2UgY2FudmFzIOKAlCB0aGUgUG93ZXJQb2ludCBtb2RlbC4gUGFnZXMgYXJlIHRhYnMgKG9ubHkgdGhlXG4vLyBBQ1RJVkUgcGFnZSdzIGNvbXBvbmVudHMgZXhpc3Qg4oaSIG9ubHkgdGhleSBmZXRjaCk7IHRoZSBwYWdlIGlzIGFcbi8vIHBhZ2VXaWR0aMOXcGFnZUhlaWdodCBJTkNIRVMgc2hlZXQgcmVuZGVyZWQgYXQgOTZweC9pbiBpbnNpZGUgZnMtem9vbS1wYW5cbi8vIChDdHJsL0NtZCArIHdoZWVsIG9yIHBpbmNoIHRvIHpvb20sIGJhY2tncm91bmQgZHJhZyBwYW4sIHRvb2xiYXIgYnV0dG9uczsgYVxuLy8gcGxhaW4gd2hlZWwgc2Nyb2xscyB0aGUgbGlzdCB1bmRlciB0aGUgcG9pbnRlcikuXG4vL1xuLy8gQ29tcG9uZW50cyBhcmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkOyBkcmFnZ2luZyBnZXRzIHNtYXJ0IGFsaWdubWVudCBndWlkZXNcbi8vIChlZGdlcyArIGNlbnRlcnMgb2Ygc2libGluZ3MgYW5kIHRoZSBwYWdlKSB3aXRoIHNuYXBwaW5nLlxuLy9cbi8vIEhlYWRlciBhbmQgZm9vdGVyOiB0aGUgcmVwb3J0J3MgbWFzdGVyIGNvbXBvbmVudHMgKHJlcG9ydC5tYXN0ZXIpIGFyZSBkcmF3blxuLy8gb24gYSBsYXllciBVTkRFUiBldmVyeSBwYWdlJ3Mgb3duIGNvbXBvbmVudHMsIGxpa2UgYSBQb3dlclBvaW50IHNsaWRlIG1hc3Rlcixcbi8vIHVubGVzcyB0aGUgcGFnZSBoaWRlcyB0aGVtLiBJbiBlZGl0IG1vZGUgdGhlIGhvc3QgdG9vbGJhcidzIFwiSGVhZGVyICYgZm9vdGVyXCJcbi8vICh0b2dnbGVNYXN0ZXJNb2RlKSBzd2l0Y2hlcyB3aGljaCBsYXllciBpcyBsaXZlOiB0aGUgcGFnZSdzIGNvbXBvbmVudHMgZGltXG4vLyBhbmQgdGhlIG1hc3RlcidzIGJlY29tZSB0aGUgb25lcyB0aGF0IGRyYWcsIHJlc2l6ZSBhbmQgc25hcC4gVGhlIGhlYWRlci9mb290ZXIgYmFuZHMgKGNvbmZpZy5oZWFkZXJGb290ZXIpXG4vLyBhcmUgZHJhd24gYXMgZ3VpZGVzIHdoaWxlIGVkaXRpbmcgYW5kIGFyZSBzbmFwIGxpbmVzIGZvciBib3RoIGxheWVycy4gV2hpbGVcbi8vIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBhcmUgZWRpdGVkLCBhbiBlbXB0eSBiYW5kIHNheXMgaG93IHRvIGZpbGwgaXQsIGFuZFxuLy8gZG91YmxlLWNsaWNraW5nIGEgYmFuZCBhZGRzIGEgdGV4dCBibG9jayB0aGVyZSB3aXRoIGl0cyBlZGl0b3Igb3Blbi5cbi8vXG4vLyBMaXZlIHZhbHVlczogYSB0ZXh0IGJsb2NrIHNob3dzIG51bWJlcnMgaW5saW5lICh7e3ZhbHVlLmtleX19KS4gQSB2YWx1ZSBpc1xuLy8gbmV2ZXIgZHJhd247IGl0IGJlbG9uZ3MgdG8gdGhlIHBhZ2Ugd2hvc2UgdGV4dCBzaG93cyBpdCAodGhlIG1hc3RlciBmb3IgYVxuLy8gaGVhZGVyIG9yIGZvb3RlcikgYW5kIGlzIGxpc3RlZCBpbiB0aGF0IGxheWVyJ3MgYHZhbHVlc2AuIFRoZSBjYW52YXMgcmVhZHNcbi8vIHRoZSBudW1iZXJzIG9uZSByZXF1ZXN0IHBlciBsYXllciDigJQgdGhlIGFjdGl2ZSBwYWdlJ3MgYW5kIHRoZSBtYXN0ZXIncyDigJRcbi8vIGFuZCBoYW5kcyB0aGVtIHRvIGV2ZXJ5IGJsb2NrIG9mIHRoZSBsYXllciB3aXRoIHRoZSBwYWdlIHRva2Vucy4gV2hpY2hcbi8vIHZhbHVlcyBhIHJlcXVlc3QgcmVhZHMgaXMgdGhlIHNlcnZlcidzIGNhbGwgYWxvbmU6IHRoZSBvbmVzIHRoZSB0ZXh0IHNob3dzLFxuLy8gYW5kIHRoZSBvcGVyYW5kcyBvZiB0aGUgZm9ybXVsYXMgYW1vbmcgdGhlbS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY2FudmFzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1jYW52YXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXG4gICAgTWF0SWNvbixcbiAgICBNYXRUb29sdGlwLFxuICAgIEZzTWVudU1vZHVsZSxcbiAgICBGc1pvb21QYW5Nb2R1bGUsXG4gICAgUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyByZXBvcnQ6IFJlcG9ydDtcbiAgQElucHV0KCkgcHVibGljIGVkaXRNb2RlID0gZmFsc2U7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGhvc3Qgd2FudHMgb24gc2NyZWVuLCBieSBwYWdlIGlkIChhID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZFxuICAvLyB3aXRoLCBvciBhbiBvcGVuZWQgdmlldydzIHBhZ2UpLiBLZXllZCBvbiBpZCByYXRoZXIgdGhhbiBpbmRleCBzbyBpdFxuICAvLyBzdXJ2aXZlcyBwYWdlcyBiZWluZyByZW9yZGVyZWQgb3IgZGVsZXRlZDsgYW4gaWQgdGhhdCBubyBsb25nZXIgcmVzb2x2ZXNcbiAgLy8gZmFsbHMgYmFjayB0byB0aGUgZmlyc3QgcGFnZS5cbiAgQElucHV0KCkgcHVibGljIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gQSBjb21wb25lbnQgYXNrZWQgZm9yIGl0cyBzZXR0aW5ncyBkaWFsb2cg4oCUIHRoZSBwYWdlLWxldmVsIGhvc3Qgb3BlbnMgaXRcbiAgLy8gKGl0IG93bnMgTWF0RGlhbG9nICsgdGhlIHBvc3Qtc2F2ZSByZWxvYWQpLlxuICBAT3V0cHV0KCkgcHVibGljIGNvbXBvbmVudFNldHRpbmdzID0gbmV3IEV2ZW50RW1pdHRlcjxSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIHN0cnVjdHVyZSBjaGFuZ2VkIGhlcmUgKGEgcGFnZSB3YXMgYWRkZWQpIOKAlCB0aGUgaG9zdCByZS1mZXRjaGVzXG4gIC8vIGl0IChpdCBvd25zIHRoZSBhc3NlbWJsZWQgcmVwb3J0ICsgZmlsdGVyIHN0YXRlKS5cbiAgQE91dHB1dCgpIHB1YmxpYyByZXBvcnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIFRoZSBwYWdlIG9uIHNjcmVlbiBjaGFuZ2VkIOKAlCB0aGUgaG9zdCBrZWVwcyBpdCBpbiB0aGUgcmVwb3J0J3Mgc3RhdGUuXG4gIC8vIENhcnJpZXMgdGhlIHBhZ2UgaWQsIG5ldmVyIHRoZSBpbmRleC5cbiAgQE91dHB1dCgpIHB1YmxpYyBwYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBAVmlld0NoaWxkKEZzWm9vbVBhbkNvbXBvbmVudClcbiAgcHVibGljIHpvb21QYW46IEZzWm9vbVBhbkNvbXBvbmVudDtcblxuICAvLyBUaGUgcmVuZGVyZWQgY29tcG9uZW50cyBvZiB0aGUgYWN0aXZlIHBhZ2Ug4oCUIG9ubHkgdGhlIGNhbnZhcyBjYW4gcmVhY2ggdGhlXG4gIC8vIG9uZSBpbnN0YW5jZSBhIHNldHRpbmdzIHNhdmUgYXBwbGllcyB0by5cbiAgQFZpZXdDaGlsZHJlbihSZXBvcnRDb21wb25lbnRDb21wb25lbnQpXG4gIHByaXZhdGUgX3JlbmRlcmVkQ29tcG9uZW50czogUXVlcnlMaXN0PFJlcG9ydENvbXBvbmVudENvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZCgndmlld3BvcnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF92aWV3cG9ydDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnZ3VpZGVzJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2d1aWRlczogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgcHVibGljIHJlYWRvbmx5IFBYID0gUFhfUEVSX0lOQ0g7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIHBhZ2VzIGFzIHRoZSBjYW52YXMgZHJhd3MgdGhlbS4gVGhpcyBpcyB0aGUgaG9zdCdzIG93blxuICAvLyBgcmVwb3J0LnBhZ2VzYCBhcnJheSwgcGF0Y2hlZCBpbiBwbGFjZSAoYSByZW5hbWUsIGEgZGVsZXRlLCBhIHJlb3JkZXIpIHNvXG4gIC8vIHRoZSBob3N0J3MgZXhwb3J0cyBzZWUgdGhlIGNoYW5nZSB0b28uIEJlY2F1c2UgdGhlIGFycmF5XG4gIC8vIGFuZCBpdHMgcGFnZXMga2VlcCB0aGVpciBpZGVudGl0eSBhY3Jvc3MgYSBwYXRjaCwgdGhlIHNpZ25hbCBub3RpZmllcyBvblxuICAvLyBldmVyeSBzZXQgcmF0aGVyIHRoYW4gb25seSB3aGVuIHRoZSByZWZlcmVuY2UgY2hhbmdlcy5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VzID0gc2lnbmFsPFJlcG9ydFBhZ2VbXT4oW10sIHsgZXF1YWw6ICgpID0+IGZhbHNlIH0pO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlUGFnZUluZGV4ID0gc2lnbmFsKDApO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlUGFnZUlkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYWdlcygpW3RoaXMuYWN0aXZlUGFnZUluZGV4KCldPy5pZCA/PyBudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHpvb20gPSBzaWduYWwoMSk7XG5cbiAgLy8gRWRpdGluZyB0aGUgaGVhZGVyIGFuZCBmb290ZXIgKHRoZSBtYXN0ZXIgbGF5ZXIpIHJhdGhlciB0aGFuIHRoZSBwYWdlLlxuICBwdWJsaWMgcmVhZG9ubHkgbWFzdGVyTW9kZSA9IHNpZ25hbChmYWxzZSk7XG4gIHB1YmxpYyBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZENvbXBvbmVudElkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuICAvLyBUaGUgY29tcG9uZW50cyBlYWNoIGxheWVyIGRyYXdzLiBBIHZhbHVlIG9ubHkgcmVhZHMgaW5zaWRlIHRleHQsIHNvIG9uZVxuICAvLyB0aGF0IGxlYWtlZCBpbnRvIGEgbGF5ZXIncyBjb21wb25lbnRzIGlzIHN0aWxsIG5ldmVyIGRyYXduLlxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlUGFnZUNvbXBvbmVudHMgPSBjb21wdXRlZChcbiAgICAoKSA9PiAodGhpcy5wYWdlcygpW3RoaXMuYWN0aXZlUGFnZUluZGV4KCldPy5jb21wb25lbnRzID8/IFtdKS5maWx0ZXIoaXNEcmF3biksXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IG1hc3RlckNvbXBvbmVudHMgPSBjb21wdXRlZChcbiAgICAoKSA9PiAodGhpcy5fcmVwb3J0KCk/Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSkuZmlsdGVyKGlzRHJhd24pLFxuICApO1xuXG4gIC8vIFdoYXQgYSB0ZXh0IGJsb2NrJ3MgdG9rZW5zIGZpbGwgd2l0aCBvbiB0aGUgcGFnZSBvbiBzY3JlZW46IHt7cGFnZS5udW1iZXJ9fSxcbiAgLy8ge3twYWdlLm5hbWV9fSBhbmQge3tyZXBvcnQubmFtZX19ICh0aGUgbWFzdGVyJ3MgZm9vdGVyIG51bWJlcnMgZWFjaCBwYWdlIGJ5XG4gIC8vIGl0cyBwb3NpdGlvbiksIHRoZSByZXBvcnQncyB7e2ZpbHRlci48aWQ+fX0gZmllbGRzLCBhbmQgdGhlIHZhbHVlcyBvZiB0aGVcbiAgLy8gYmxvY2sncyBsYXllciDigJQgdGhlIGFjdGl2ZSBwYWdlJ3MgZm9yIGEgcGFnZSBibG9jaywgdGhlIG1hc3RlcidzIGZvciBhXG4gIC8vIGhlYWRlciBvciBmb290ZXIgYmxvY2ssIHdob3NlIGlkIGlzIGFsc28gdGhlIGVkaXRvcidzIGNsaXBib2FyZCBzY29wZS5cbiAgLy8gRXZlcnkgb3RoZXIgY29tcG9uZW50IG9mIHRoZSBsYXllciBmaWxscyBpdHMgdGl0bGUncyB0b2tlbnMgd2l0aCBpdCB0b28uXG4gIC8vIFRoZSBzYW1lIG9iamVjdCBpcyBoYW5kZWQgYmFjayB1bnRpbCBzb21ldGhpbmcgYSB0b2tlbiBzaG93cyBjaGFuZ2VzOlxuICAvLyBldmVyeSBjb21wb25lbnQgdGFrZXMgaXQgYXMgYW4gaW5wdXQsIGFuZCBhIGZyZXNoIG9iamVjdCB3b3VsZCBtYWtlIGVhY2hcbiAgLy8gdGV4dCBibG9jayByZXBhaW50IGl0cyBodG1sLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZVRva2VucyA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuX3Rva2VuQ29udGV4dChcbiAgICAgIHRoaXMuX3BhZ2VWYWx1ZUNvbXBvbmVudHMoKSxcbiAgICAgIHRoaXMuX3BhZ2VWYWx1ZXMsXG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJZCgpLFxuICAgICAgdGhpcy5hY3RpdmVQYWdlSWQoKSxcbiAgICApLFxuICAgIHsgZXF1YWw6IHNhbWVUb2tlbnMgfSxcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbWFzdGVyVG9rZW5zID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5fdG9rZW5Db250ZXh0KFxuICAgICAgdGhpcy5fbWFzdGVyVmFsdWVDb21wb25lbnRzKCksXG4gICAgICB0aGlzLl9tYXN0ZXJWYWx1ZXMsXG4gICAgICB0aGlzLl9yZXBvcnQoKT8ubWFzdGVyPy5pZCA/PyBudWxsLFxuICAgICAgbnVsbCxcbiAgICApLFxuICAgIHsgZXF1YWw6IHNhbWVUb2tlbnMgfSxcbiAgKTtcblxuICAvLyBUaGUgc25hcHBlciBoYW5kZWQgdG8gZXZlcnkgY29tcG9uZW50IChzdGFibGUgaWRlbnRpdHkgZm9yIE9uUHVzaCkuXG4gIHB1YmxpYyByZWFkb25seSBzbmFwcGVyOiBDYW52YXNTbmFwcGVyID0ge1xuICAgIHNuYXBNb3ZlOiAoY29tcG9uZW50LCB4LCB5KSA9PiB0aGlzLl9zbmFwTW92ZShjb21wb25lbnQsIHgsIHkpLFxuICAgIHNuYXBSZXNpemU6IChjb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpID0+IHRoaXMuX3NuYXBSZXNpemUoY29tcG9uZW50LCBnZW9tZXRyeSwgaGFuZGxlKSxcbiAgICBjbGVhcjogKCkgPT4gdGhpcy5fY2xlYXJHdWlkZXMoKSxcbiAgfTtcblxuICAvLyBUaGUgdmFsdWUga2V5cyB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgYSB0ZXh0J3MgbGF5ZXIgc2hvdyAodGhlIG1hc3RlcidzXG4gIC8vIGZvciBhIGhlYWRlciBvciBmb290ZXIgYmxvY2spLCBmb3IgaXRzIGVkaXRvcidzIG5vdGljZTogYSB2YWx1ZSBhbm90aGVyXG4gIC8vIGJsb2NrIHN0aWxsIHNob3dzIGlzIG5vdCBsZWZ0IHVudXNlZC4gUmVhZCB3aGVuIGFza2VkOiBzYXZpbmcgYSBibG9ja1xuICAvLyB3cml0ZXMgaXRzIGh0bWwgaW50byBpdHMgY29tcG9uZW50IGluIHBsYWNlLCB3aGljaCBubyBzaWduYWwgc2Vlcy5cbiAgLy8gU3RhYmxlLCBhcyB0aGUgc25hcHBlciBpcy5cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlS2V5c0Vsc2V3aGVyZSA9ICh0ZXh0OiBSZXBvcnRDb21wb25lbnQpOiBSZWFkb25seVNldDxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuX2lzTWFzdGVyQ29tcG9uZW50KHRleHQpID8gdGhpcy5yZXBvcnQ/Lm1hc3RlciA6IHRoaXMuYWN0aXZlUGFnZTtcblxuICAgIHJldHVybiBuZXcgU2V0KChsYXllcj8uY29tcG9uZW50cyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0JyAmJiBjb21wb25lbnQuaWQgIT09IHRleHQuaWQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB2YWx1ZUtleXMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCkpKTtcbiAgfTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9maWx0ZXJPcHRpb25zID0gaW5qZWN0KFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9maXR0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcHJldmlvdXNQYWdlQ291bnQgPSAwO1xuICBwcml2YXRlIF9wcmV2aW91c1JlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBUaGUgcGFnZSBpZCBsYXN0IGFubm91bmNlZCB0aHJvdWdoIHBhZ2VDaGFuZ2VkLCBzbyBhIHJlLXJlbmRlciB0aGF0IGxhbmRzIG9uXG4gIC8vIHRoZSBzYW1lIHBhZ2Ugc3RheXMgcXVpZXQg4oCUIGhvc3RzIHJlbG9hZCBvbiB0aGlzIGFuZCBhbiB1bmNoYW5nZWQgcGFnZSBpc1xuICAvLyBub3QgbmV3cy5cbiAgcHJpdmF0ZSBfZW1pdHRlZFBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gQSB0ZXh0IGJsb2NrIGFkZGVkIGJ5IGRvdWJsZS1jbGlja2luZyBhIGJhbmQsIHdob3NlIGVkaXRvciBvcGVucyBvbmNlIHRoZVxuICAvLyByZWxvYWRlZCByZXBvcnQgZHJhd3MgaXQuXG4gIHByaXZhdGUgX2VkaXRPbkFycml2YWw6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSByZXBvcnQgaW5wdXQgYXMgYSBzaWduYWwsIGZvciB0aGUgdG9rZW4gY29udGV4dHMgYW5kIHRoZSBtYXN0ZXInc1xuICAvLyBkcmF3biBjb21wb25lbnRzLiBOb3RpZmllcyBvbiBldmVyeSBzZXQ6IGEgcmVsb2FkIGhhbmRzIG92ZXIgYSBuZXcgcmVwb3J0XG4gIC8vIGV2ZW4gd2hlbiBub3RoaW5nIGEgdG9rZW4gc2hvd3MgbW92ZWQsIGFuZCBhIGRlbGV0ZWQgaGVhZGVyIG9yIGZvb3RlclxuICAvLyBibG9jayBpcyBzcGxpY2VkIG91dCBvZiB0aGUgc2FtZSByZXBvcnQuXG4gIHByaXZhdGUgX3JlcG9ydCA9IHNpZ25hbDxSZXBvcnQgfCBudWxsPihudWxsLCB7IGVxdWFsOiAoKSA9PiBmYWxzZSB9KTtcblxuICAvLyBUaGUgdmFsdWVzIGVhY2ggbGF5ZXIncyB0ZXh0IGNhbiBzaG93IChzaG93biBvciBub3QpLlxuICBwcml2YXRlIF9wYWdlVmFsdWVDb21wb25lbnRzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYWdlcygpW3RoaXMuYWN0aXZlUGFnZUluZGV4KCldPy52YWx1ZXMgPz8gW10pO1xuICBwcml2YXRlIF9tYXN0ZXJWYWx1ZUNvbXBvbmVudHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9yZXBvcnQoKT8ubWFzdGVyPy52YWx1ZXMgPz8gW10pO1xuXG4gIC8vIFRoZSBtYXN0ZXIncyBudW1iZXJzIGFyZSBuZWVkZWQgd2hpbGUgc29tZSBwYWdlIHNob3dzIHRoZSBoZWFkZXIgYW5kXG4gIC8vIGZvb3Rlciwgb3Igd2hpbGUgdGhleSBhcmUgYmVpbmcgZWRpdGVkLlxuICBwcml2YXRlIF9tYXN0ZXJOZWVkZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1hc3Rlck1vZGUoKSB8fCB0aGlzLnBhZ2VzKCkuc29tZSgocGFnZSkgPT4gIXBhZ2UubWFzdGVySGlkZGVuKSk7XG5cbiAgLy8gVGhlIHR3byBsYXllcnMgd2hvc2UgdmFsdWVzIGFyZSByZWFkLCBlYWNoIG9uIGl0cyBvd24gc3RyZWFtLlxuICBwcml2YXRlIF9wYWdlVmFsdWVzID0gdGhpcy5fdmFsdWVMYXllcigoKSA9PiB0aGlzLmFjdGl2ZVBhZ2UpO1xuICBwcml2YXRlIF9tYXN0ZXJWYWx1ZXMgPSB0aGlzLl92YWx1ZUxheWVyKCgpID0+ICh0aGlzLl9tYXN0ZXJOZWVkZWQoKSA/IHRoaXMucmVwb3J0Py5tYXN0ZXIgPz8gbnVsbCA6IG51bGwpKTtcblxuICAvLyBCdW1wZWQgd2hlbiBhIHZhbHVlIGlzIHJlbmFtZWQgaW4gcGxhY2UsIHdoaWNoIG5vIHNpZ25hbCBzZWVzLlxuICBwcml2YXRlIF92YWx1ZXNSZXZpc2lvbiA9IHNpZ25hbCgwKTtcblxuICAvLyBCdW1wZWQgd2hlbiBhIGZpbHRlcidzIHZhbHVlIGNoYW5nZWQgKF93YXRjaEZpbHRlcnMpOiB0aGUgZmlsdGVyIHN0YXRlXG4gIC8vIGhvbGRzIGl0cyB2YWx1ZXMgb3V0c2lkZSBhbnkgc2lnbmFsLlxuICBwcml2YXRlIF9maWx0ZXJSZXZpc2lvbiA9IHNpZ25hbCgwKTtcblxuICAvLyBUaGUgbmFtZXMgb2YgdGhlIG9wdGlvbnMgcGlja2VkIGluIGVhY2ggc2VsZWN0IGdyb3VwLCBieSBvcHRpb25OYW1lc0tleSxcbiAgLy8gYXMgdGhleSBsYXN0IGFycml2ZWQgKG51bGwgd2hlbiB0aGV5IGNvdWxkIG5vdCBiZSByZWFkLCB1bnRpbCBhIGZpbHRlclxuICAvLyB2YWx1ZSBjaGFuZ2VzIGFuZCBhc2tzIGFnYWluKSwgYW5kIHRoZSBrZXlzIGFza2VkIGZvciBzaW5jZSB0aGUgcmVwb3J0XG4gIC8vIGxhc3QgbG9hZGVkLiBBIHBpY2sgaXMgbmFtZWQgb25jZSBwZXIgbG9hZCwgc28gYSBmaWx0ZXIgc2V0IGJhY2sgdG8gYW5cbiAgLy8gZWFybGllciBwaWNrIHJlYWRzIGl0cyBuYW1lcyBhdCBvbmNlLiBBIHJlbG9hZCBuYW1lcyBldmVyeSBwaWNrIGFnYWluXG4gIC8vIGZyb20gdGhlIGZyZXNoIGxpc3RzLCBhcyBhbiBvcHRpb24gbWF5IGhhdmUgYmVlbiByZW5hbWVkOyBhIHBpY2sga2VlcHNcbiAgLy8gc2hvd2luZyB0aGUgbmFtZXMgaXQgaGFkIHVudGlsIHRoZSBuZXcgb25lcyBsYW5kLlxuICBwcml2YXRlIF9vcHRpb25OYW1lcyA9IHNpZ25hbDxSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbD4+KG5ldyBNYXAoKSk7XG4gIHByaXZhdGUgX29wdGlvbk5hbWVzQXNrZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBFYWNoIHNlbGVjdCBncm91cCdzIG9wdGlvbiBsaXN0LCBmZXRjaGVkIG9uY2UgYW5kIHJlYWQgZm9yIGV2ZXJ5IHBpY2tcbiAgLy8gb2YgdGhlIGdyb3VwOyByZWFkIGFmcmVzaCBhZnRlciBhIHJlbG9hZCwgd2hpY2ggbWF5IGhhdmUgY2hhbmdlZCBhIGdyb3VwLlxuICBwcml2YXRlIF9ncm91cE9wdGlvbnMgPSBncm91cE9wdGlvbnNSZWFkZXIodGhpcy5fcmVwb3J0RGF0YSk7XG5cbiAgLy8gVGhlIHNlbGVjdCBncm91cHMgd2l0aCBvcHRpb25zIHBpY2tlZCAoa2VwdCBvciBsZWZ0IG91dCkuIEVhY2ggcGljayBub3RcbiAgLy8gYXNrZWQgZm9yIHNpbmNlIHRoZSByZXBvcnQgbG9hZGVkIGlzIG5hbWVkIChfd2F0Y2hPcHRpb25OYW1lcykuXG4gIHByaXZhdGUgX3NlbGVjdFBpY2tzID0gY29tcHV0ZWQoKCk6IE9wdGlvblBpY2tbXSA9PiB7XG4gICAgdGhpcy5fZmlsdGVyUmV2aXNpb24oKTtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9yZXBvcnQoKTtcblxuICAgIHJldHVybiAocmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pXG4gICAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAudHlwZSA9PT0gJ3NlbGVjdCcpXG4gICAgICAubWFwKChncm91cCk6IE9wdGlvblBpY2sgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZVBpY2tzKHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKSk7XG5cbiAgICAgICAgcmV0dXJuIHsgZ3JvdXAsIHJlcG9ydElkOiByZXBvcnQuaWQsIHZhbHVlcywga2V5OiBvcHRpb25OYW1lc0tleShncm91cC5pZCwgdmFsdWVzKSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHBpY2spID0+IHBpY2sudmFsdWVzLmxlbmd0aCk7XG4gIH0pO1xuXG4gIC8vIFRoZSB2YWx1ZSBrZXlzIGVhY2ggbGF5ZXIgaGVsZCBhdCB0aGUgbGFzdCByZXBvcnQgbG9hZCwgYnkgcGFnZSBpZCBhbmRcbiAgLy8gbWFzdGVyIGlkLCBzbyBhIHJlbG9hZCBjYW4gdGVsbCB3aGljaCB2YWx1ZXMgd2VyZSBkZWxldGVkLlxuICBwcml2YXRlIF92YWx1ZUtleXNCeUxheWVyID0gbmV3IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gTGVhdmluZyBlZGl0IG1vZGUgYWx3YXlzIHJldHVybnMgdG8gdGhlIHBhZ2UgbGF5ZXIsIHNvIHRoZSBuZXh0IGVkaXRcbiAgICAvLyBzZXNzaW9uIHN0YXJ0cyB3aGVyZSBwZW9wbGUgZXhwZWN0LlxuICAgIGlmIChjaGFuZ2VzLmVkaXRNb2RlICYmICF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICB0aGlzLm1hc3Rlck1vZGUuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmdyb3VwcyA9IG5ldyBNYXAoKHRoaXMucmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pLm1hcCgoZ3JvdXApID0+IFtncm91cC5pZCwgZ3JvdXBdKSk7XG4gICAgdGhpcy5wYWdlcy5zZXQodGhpcy5yZXBvcnQ/LnBhZ2VzID8/IFtdKTtcblxuICAgIC8vIEEgcGFnZSBqdXN0IGFkZGVkIGluIHRoaXMgdGFiLCBlbHNlIHRoZSBhc2tlZC1mb3IgcGFnZSwgZWxzZSB0aGUgcGFnZVxuICAgIC8vIHNob3duICh0aGUgZmlyc3QgcGFnZSBvbiBhbm90aGVyIHJlcG9ydCkuIFNlZSBjYW52YXNMYW5kaW5nUGFnZS5cbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0Py5pZCA/PyBudWxsO1xuICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4LnNldChjYW52YXNMYW5kaW5nUGFnZSh7XG4gICAgICByZXBvcnRJZCxcbiAgICAgIHByZXZpb3VzUmVwb3J0SWQ6IHRoaXMuX3ByZXZpb3VzUmVwb3J0SWQsXG4gICAgICBwcmV2aW91c1BhZ2VDb3VudDogdGhpcy5fcHJldmlvdXNQYWdlQ291bnQsXG4gICAgICBwYWdlSWRzOiB0aGlzLnBhZ2VzKCkubWFwKChwYWdlKSA9PiBwYWdlLmlkKSxcbiAgICAgIHBhZ2VJZDogdGhpcy5wYWdlSWQsXG4gICAgICBhY3RpdmVQYWdlSW5kZXg6IHRoaXMuYWN0aXZlUGFnZUluZGV4KCksXG4gICAgfSkpO1xuICAgIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID0gdGhpcy5wYWdlcygpLmxlbmd0aDtcbiAgICB0aGlzLl9wcmV2aW91c1JlcG9ydElkID0gcmVwb3J0SWQ7XG5cbiAgICAvLyBUZWxsIHRoZSBob3N0IHdoaWNoIHBhZ2UgaXMgb3BlbiB3aGVuZXZlciB0aGF0IGNoYW5nZXMg4oCUIGluY2x1ZGluZyB0aGVcbiAgICAvLyBGSVJTVCB0aW1lIHRoZSByZXBvcnQgcmVuZGVycywgbm90IG9ubHkgd2hlbiBzb21lb25lIGNsaWNrcyBhIHBhZ2UuXG4gICAgLy8gSG9zdHMgYmluZCB0aGluZ3MgdG8gdGhlIG9wZW4gcGFnZSAodGhlIHJlcG9ydCBjaGF0IHNjb3BlcyBpdHNcbiAgICAvLyBjb252ZXJzYXRpb25zIHRvIGl0KSwgYW5kIHdpdGhvdXQgdGhpcyB0aGV5IHdvdWxkIHNpdCBvbiBubyBwYWdlIGF0IGFsbFxuICAgIC8vIHVudGlsIHRoZSBmaXJzdCBtYW51YWwgcGFnZSBjbGljay5cbiAgICBjb25zdCBhY3RpdmVQYWdlSWQgPSB0aGlzLmFjdGl2ZVBhZ2U/LmlkID8/IG51bGw7XG4gICAgaWYgKGFjdGl2ZVBhZ2VJZCAhPT0gdGhpcy5fZW1pdHRlZFBhZ2VJZCkge1xuICAgICAgdGhpcy5fZW1pdHRlZFBhZ2VJZCA9IGFjdGl2ZVBhZ2VJZDtcbiAgICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChhY3RpdmVQYWdlSWQpO1xuICAgIH1cblxuICAgIC8vIEEgKHJlKWxvYWRlZCByZXBvcnQgbWF5IGhhdmUgZ2FpbmVkLCBsb3N0IG9yIGNoYW5nZWQgdmFsdWVzLCBhbmQgYW55XG4gICAgLy8gdGV4dCBtYXkgbm93IHNob3cgZGlmZmVyZW50IG9uZXM6IHJlYWQgYWdhaW4gZWFjaCBsYXllciB3aG9zZSBudW1iZXJzXG4gICAgLy8gdGhhdCBtb3Zlcy4gSXRzIG9wdGlvbiBsaXN0cyBtYXkgaGF2ZSByZW5hbWVkIGEgcGljazogZWFjaCBpcyBuYW1lZFxuICAgIC8vIGFnYWluIGZyb20gdGhlIGZyZXNoIGxpc3RzLlxuICAgIGlmIChjaGFuZ2VzLnJlcG9ydCkge1xuICAgICAgdGhpcy5fZ3JvdXBPcHRpb25zID0gZ3JvdXBPcHRpb25zUmVhZGVyKHRoaXMuX3JlcG9ydERhdGEpO1xuICAgICAgdGhpcy5fb3B0aW9uTmFtZXNBc2tlZC5jbGVhcigpO1xuICAgICAgdGhpcy5fcmVwb3J0LnNldCh0aGlzLnJlcG9ydCk7XG4gICAgICB0aGlzLl9kcm9wUmVtb3ZlZFZhbHVlQ2hpcHMoKTtcbiAgICAgIHRoaXMuX3JlbG9hZElmQ2hhbmdlZCh0aGlzLl9wYWdlVmFsdWVzKTtcbiAgICAgIHRoaXMuX3JlbG9hZElmQ2hhbmdlZCh0aGlzLl9tYXN0ZXJWYWx1ZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlcG9ydCBoZWFkaW5nIHNpemUgaW4gcHggKGNvbmZpZyBpcyBwb2ludHM7IHRoZSBjYW52YXMgcmVuZGVycyBhdFxuICAvLyA5NnB4L2luLCBzbyBwb2ludHMgw5cgOTYvNzIpLiBJbmhlcml0ZWQgYnkgY29tcG9uZW50IHRpdGxlcyB2aWEgYSBDU1MgdmFyLlxuICBwdWJsaWMgZ2V0IGhlYWRpbmdTaXplUHgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLnJlcG9ydD8uY29uZmlnPy5zdHlsZXM/LmhlYWRpbmc/LnNpemUgPz8gREVGQVVMVF9IRUFESU5HX1NJWkU7XG5cbiAgICByZXR1cm4gcG9pbnRzICogKFBYX1BFUl9JTkNIIC8gNzIpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBGaXQgdGhlIHBhZ2UgdG8gdGhlIHZpZXdwb3J0IG9uY2Ugb24gZmlyc3QgcmVuZGVyOyBhZnRlciB0aGF0IHRoZVxuICAgIC8vIHZpZXdlcidzIHpvb20gY2hvaWNlIGlzIHJlc3BlY3RlZCBhY3Jvc3MgcmUtcmVuZGVycy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuem9vbUZpdCgpKTtcblxuICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2VkaXRBcnJpdmVkVGV4dCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlUGFnZSgpOiBSZXBvcnRQYWdlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXMoKVt0aGlzLmFjdGl2ZVBhZ2VJbmRleCgpXSA/PyBudWxsO1xuICB9XG5cbiAgLy8gVGhlIGhlYWRlci9mb290ZXIgYmFuZHMsIGluIGluY2hlcyAoMCA9IG5vIGJhbmQpLlxuICBwdWJsaWMgZ2V0IGJhbmRzKCk6IFJlcG9ydEhlYWRlckZvb3RlciB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0Py5jb25maWc/LmhlYWRlckZvb3RlciA/PyB7IGhlYWRlckhlaWdodDogMCwgZm9vdGVySGVpZ2h0OiAwIH07XG4gIH1cblxuICAvLyBUaGUgbWFzdGVyIGRyYXdzIHVubGVzcyB0aGUgcGFnZSBoaWRlcyBpdCDigJQgYW5kIGFsd2F5cyB3aGlsZSBpdCBpcyB0aGVcbiAgLy8gbGF5ZXIgYmVpbmcgZWRpdGVkLCBzbyBhIHBhZ2UgdGhhdCBoaWRlcyBpdCBjYW4gc3RpbGwgYmUgdXNlZCB0byBlZGl0IGl0LlxuICBwdWJsaWMgZ2V0IGlzTWFzdGVyU2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFzdGVyTW9kZSgpIHx8ICF0aGlzLmFjdGl2ZVBhZ2U/Lm1hc3RlckhpZGRlbjtcbiAgfVxuXG4gIC8vIFdoaWNoIGxheWVyIHRoZSBlZGl0IGdlc3R1cmVzIHJlYWNoLlxuICBwdWJsaWMgZ2V0IGlzUGFnZUVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdE1vZGUgJiYgIXRoaXMubWFzdGVyTW9kZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01hc3RlckVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdE1vZGUgJiYgdGhpcy5tYXN0ZXJNb2RlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlTWFzdGVyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLm1hc3Rlck1vZGUudXBkYXRlKCh2YWx1ZSkgPT4gIXZhbHVlKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gRHJvcCBhIHRleHQgYmxvY2sgd2hlcmUgaXQgd2lsbCBiZSBmb3VuZDogaW50byB0aGUgZm9vdGVyIChvciBoZWFkZXIpIGJhbmRcbiAgLy8gd2hpbGUgZWRpdGluZyB0aGUgaGVhZGVyIGFuZCBmb290ZXIsIGJlbG93IHRoZSBoZWFkZXIgYmFuZCBvbiBhIHBhZ2UuIFRoZVxuICAvLyBob3N0IHJlLWZldGNoZXMgdGhlIHJlcG9ydCBhbmQgaXQgYXBwZWFyczsgZG91YmxlLXByZXNzIG9wZW5zIGl0cyBlZGl0b3IuXG4gIHB1YmxpYyBhZGRUZXh0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGhlYWRlckhlaWdodCwgZm9vdGVySGVpZ2h0IH0gPSB0aGlzLmJhbmRzO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IHRoaXMucmVwb3J0LnBhZ2VXaWR0aDtcbiAgICBjb25zdCBwYWdlSGVpZ2h0ID0gdGhpcy5yZXBvcnQucGFnZUhlaWdodDtcbiAgICBjb25zdCBpc01hc3RlciA9IHRoaXMubWFzdGVyTW9kZSgpO1xuXG4gICAgbGV0IGdlb21ldHJ5ID0geyB4OiAwLjUsIHk6IGhlYWRlckhlaWdodCArIDAuNSwgdzogTWF0aC5taW4oNSwgcGFnZVdpZHRoIC0gMSksIGg6IDAuOCB9O1xuICAgIGlmIChpc01hc3Rlcikge1xuICAgICAgY29uc3QgYmFuZEhlaWdodCA9IGZvb3RlckhlaWdodCB8fCBoZWFkZXJIZWlnaHQgfHwgMC41O1xuICAgICAgY29uc3QgeSA9IGZvb3RlckhlaWdodFxuICAgICAgICA/IHBhZ2VIZWlnaHQgLSBmb290ZXJIZWlnaHRcbiAgICAgICAgOiAoaGVhZGVySGVpZ2h0ID8gMCA6IHBhZ2VIZWlnaHQgLSBiYW5kSGVpZ2h0KTtcbiAgICAgIGdlb21ldHJ5ID0geyB4OiAwLjUsIHk6IHkgKyAwLjA1LCB3OiBNYXRoLm1pbig0LCBwYWdlV2lkdGggLSAxKSwgaDogTWF0aC5tYXgoMC4zLCBiYW5kSGVpZ2h0IC0gMC4xKSB9O1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydERhdGEuYWRkVGV4dCh0aGlzLnJlcG9ydC5pZCwge1xuICAgICAgLi4uZ2VvbWV0cnksXG4gICAgICBwYWdlSWQ6IGlzTWFzdGVyID8gdW5kZWZpbmVkIDogdGhpcy5hY3RpdmVQYWdlPy5pZCxcbiAgICB9KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlcG9ydENoYW5nZWQuZW1pdCgpKTtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgbm8gaGVhZGVyIG9yIGZvb3RlciBibG9jayByZWFjaGVzIGludG8gdGhlIGJhbmQsIHNvIGl0IHNob3dzIGhvd1xuICAvLyB0byBmaWxsIGl0LiBSZWFkIG9uIGV2ZXJ5IGNoZWNrOiBhIGRyYWcgbW92ZXMgYSBibG9jayBpbiBwbGFjZS5cbiAgcHVibGljIGlzQmFuZEVtcHR5KGJhbmQ6IEJhbmQpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHRvcCwgYm90dG9tIH0gPSB0aGlzLl9iYW5kU3BhbihiYW5kKTtcblxuICAgIHJldHVybiAhdGhpcy5tYXN0ZXJDb21wb25lbnRzKClcbiAgICAgIC5zb21lKChjb21wb25lbnQpID0+IGNvbXBvbmVudC55IDwgYm90dG9tICYmIGNvbXBvbmVudC55ICsgY29tcG9uZW50LmggPiB0b3ApO1xuICB9XG5cbiAgLy8gRG91YmxlLWNsaWNraW5nIGEgYmFuZCB3aGlsZSBlZGl0aW5nIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBhZGRzIGEgdGV4dFxuICAvLyBibG9jayB3aGVyZSBpdCB3YXMgY2xpY2tlZCwgdGhlIGJhbmQncyBoZWlnaHQsIGFuZCBvcGVucyBpdHMgZWRpdG9yIG9uY2VcbiAgLy8gdGhlIGhvc3QncyByZWxvYWQgZHJhd3MgaXQg4oCUIHRoZSB3YXkgaW50byBhIGhlYWRlciBpbiBXb3JkLlxuICBwdWJsaWMgYWRkVGV4dEluQmFuZChiYW5kOiBCYW5kLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01hc3RlckVkaXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRvcCwgYm90dG9tIH0gPSB0aGlzLl9iYW5kU3BhbihiYW5kKTtcbiAgICBjb25zdCBwYWdlV2lkdGggPSB0aGlzLnJlcG9ydC5wYWdlV2lkdGg7XG4gICAgY29uc3QgcmVjdCA9IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjbGlja1ggPSAoKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCkgKiBwYWdlV2lkdGg7XG4gICAgY29uc3QgdyA9IE1hdGgubWluKDQsIHBhZ2VXaWR0aCAtIDEpO1xuXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5hZGRUZXh0KHRoaXMucmVwb3J0LmlkLCB7XG4gICAgICB4OiBNYXRoLm1pbihNYXRoLm1heCgwLCBjbGlja1gpLCBwYWdlV2lkdGggLSB3KSxcbiAgICAgIHk6IHRvcCArIDAuMDUsXG4gICAgICB3LFxuICAgICAgaDogTWF0aC5tYXgoMC4zLCBib3R0b20gLSB0b3AgLSAwLjEpLFxuICAgIH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCh0ZXh0OiBSZXBvcnRDb21wb25lbnQpID0+IHtcbiAgICAgICAgdGhpcy5fZWRpdE9uQXJyaXZhbCA9IHRleHQuaWQ7XG4gICAgICAgIHRoaXMucmVwb3J0Q2hhbmdlZC5lbWl0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIEEgdGV4dCBibG9jayBkZWxldGVkIGl0c2VsZiBmcm9tIGl0cyBtZW51OiBkcm9wIGl0IGZyb20gd2hpY2hldmVyIGxheWVyIGl0XG4gIC8vIHdhcyBvbiB3aXRob3V0IHJlLWZldGNoaW5nIHRoZSByZXBvcnQuIFRoYXQgY292ZXJzIHRoZSBibG9jayBhbG9uZTogdGhlXG4gIC8vIGRlbGV0ZSBhbHNvIHRha2VzIHRoZSB2YWx1ZXMgb25seSBpdCBzaG93ZWQsIHdoaWNoIGNvbWUgYmFjayBhc1xuICAvLyB2YWx1ZXNSZW1vdmVkLCBhbmQgdGhhdCBhc2tzIHRoZSBob3N0IHRvIHJlbG9hZCB0aGUgcmVwb3J0LlxuICBwdWJsaWMgb25Db21wb25lbnRSZW1vdmVkKGNvbXBvbmVudElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBsYXllcnMgPSBbdGhpcy5hY3RpdmVQYWdlPy5jb21wb25lbnRzLCB0aGlzLnJlcG9ydD8ubWFzdGVyPy5jb21wb25lbnRzXTtcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudHMgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGNvbXBvbmVudHM/LmZpbmRJbmRleCgoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQgPT09IGNvbXBvbmVudElkKSA/PyAtMTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMucGFnZXMuc2V0KHRoaXMucGFnZXMoKSk7XG4gICAgdGhpcy5fcmVwb3J0LnNldCh0aGlzLnJlcG9ydCk7XG4gICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdEZWxldGVkIHRleHQnKTtcbiAgfVxuXG4gIC8vIEEgdGV4dCBibG9jaydzIGh0bWwgd2FzIHNhdmVkLiBTYXZpbmcgbmV2ZXIgZGVsZXRlcyBhIHZhbHVlLCBidXQgaXQgY2FuXG4gIC8vIHNob3cgb25lIHRoZSBsYXllciBoYXMgbm8gbnVtYmVyIGZvcjogYSBjaGlwIHBhc3RlZCBiYWNrIGZyb20gYSB2YWx1ZSBub1xuICAvLyB0ZXh0IHNob3dlZCwgd2hpY2ggdGhlIHNlcnZlciBkaWQgbm90IHJlYWQuIEl0cyBsYXllciBpcyByZWFkIGFnYWluIHNvIHRoZVxuICAvLyBudW1iZXIgY29tZXMgaW47IGFuIGVkaXQgdGhhdCBzaG93cyBvbmx5IHZhbHVlcyBhbHJlYWR5IHJlYWQgYXNrcyBub3RoaW5nLlxuICBwdWJsaWMgb25UZXh0U2F2ZWQodGV4dDogUmVwb3J0Q29tcG9uZW50LCBodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpc01hc3RlciA9IHRoaXMuX2lzTWFzdGVyQ29tcG9uZW50KHRleHQpO1xuICAgIGNvbnN0IGxheWVyID0gaXNNYXN0ZXIgPyB0aGlzLl9tYXN0ZXJWYWx1ZXMgOiB0aGlzLl9wYWdlVmFsdWVzO1xuICAgIGNvbnN0IGxheWVySWQgPSBpc01hc3RlciA/ICh0aGlzLnJlcG9ydD8ubWFzdGVyPy5pZCA/PyBudWxsKSA6IHRoaXMuYWN0aXZlUGFnZUlkKCk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGxheWVyLnJlc3VsdHMoKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0cz8ucGFnZUlkID09PSBsYXllcklkID8gcmVzdWx0cy5yb3dzIDogbnVsbDtcbiAgICBjb25zdCB2YWx1ZXMgPSBpc01hc3RlciA/IHRoaXMuX21hc3RlclZhbHVlQ29tcG9uZW50cygpIDogdGhpcy5fcGFnZVZhbHVlQ29tcG9uZW50cygpO1xuICAgIGNvbnN0IHVucmVhZCA9IHNob3duVmFsdWVzKHZhbHVlcywgW3sgLi4udGV4dCwgY29uZmlnOiB7IC4uLnRleHQuY29uZmlnLCBodG1sIH0gfV0pXG4gICAgICAuc29tZSgodmFsdWUpID0+ICFyb3dzPy5oYXModmFsdWUuaWQpKTtcblxuICAgIGlmICh1bnJlYWQpIHtcbiAgICAgIGxheWVyLnJlbG9hZCQubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgY2hpcCdzIGdlYXI6IG9wZW4gdGhlIHNldHRpbmdzIG9mIHRoZSB2YWx1ZSBpdCBuYW1lcywgZnJvbSB0aGUgYmxvY2snc1xuICAvLyBvd24gbGF5ZXIsIHRocm91Z2ggdGhlIHNhbWUgb3V0cHV0IGFzIGFueSBjb21wb25lbnQncyBzZXR0aW5ncy5cbiAgcHVibGljIG9wZW5WYWx1ZVNldHRpbmdzKHRleHQ6IFJlcG9ydENvbXBvbmVudCwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLl9pc01hc3RlckNvbXBvbmVudCh0ZXh0KSA/IHRoaXMuX21hc3RlclZhbHVlQ29tcG9uZW50cygpIDogdGhpcy5fcGFnZVZhbHVlQ29tcG9uZW50cygpO1xuICAgIC8vIFRoZSBuZXdlc3QgdmFsdWUgaG9sZHMgYSBrZXksIGFzIGl0IGRvZXMgaW4gdGhlIHRleHQncyB0b2tlbnMuXG4gICAgY29uc3QgdmFsdWUgPSB2YWx1ZXMuZmlsdGVyKChjYW5kaWRhdGUpID0+IHZhbHVlS2V5KGNhbmRpZGF0ZSkgPT09IGtleSkucG9wKCk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50U2V0dGluZ3MuZW1pdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hhdCBhIGNvbXBvbmVudCdzIHRva2VucyBmaWxsIHdpdGggd2hlcmUgaXQgaXMgZHJhd246IHRoZSBtYXN0ZXIncyBmb3IgYVxuICAvLyBoZWFkZXIgb3IgZm9vdGVyIGNvbXBvbmVudCwgdGhlIHBhZ2UncyBmb3IgYW55IG90aGVyIOKAlCB3aGF0IGl0cyBoZWFkZXJcbiAgLy8gcmVhZHMgaXRzIHRpdGxlIHdpdGgsIGFuZCBzbyB3aGF0IGl0cyBzZXR0aW5ncyBkaWFsb2cgc2hvd3MgaXQgYXMuXG4gIHB1YmxpYyBjb21wb25lbnRUb2tlbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBUZXh0VG9rZW5Db250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5faXNNYXN0ZXJDb21wb25lbnQoY29tcG9uZW50KSA/IHRoaXMubWFzdGVyVG9rZW5zKCkgOiB0aGlzLnBhZ2VUb2tlbnMoKTtcbiAgfVxuXG4gIC8vIFNob3cgb3IgaGlkZSB0aGUgaGVhZGVyIGFuZCBmb290ZXIgb24gb25lIHBhZ2UsIGZyb20gaXRzIHRhYidzIGtlYmFiLlxuICBwdWJsaWMgdG9nZ2xlTWFzdGVySGlkZGVuKHBhZ2U6IFJlcG9ydFBhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBtYXN0ZXJIaWRkZW4gPSAhcGFnZS5tYXN0ZXJIaWRkZW47XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZVBhZ2UodGhpcy5yZXBvcnQuaWQsIHBhZ2UuaWQsIHsgbWFzdGVySGlkZGVuIH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgcGFnZS5tYXN0ZXJIaWRkZW4gPSBtYXN0ZXJIaWRkZW47XG4gICAgICAgIHRoaXMucGFnZXMuc2V0KHRoaXMucGFnZXMoKSk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcyhtYXN0ZXJIaWRkZW4gPyAnSGVhZGVyICYgZm9vdGVyIGhpZGRlbiBvbiB0aGlzIHBhZ2UnIDogJ0hlYWRlciAmIGZvb3RlciBzaG93biBvbiB0aGlzIHBhZ2UnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFBhZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4LnNldChpbmRleCk7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcblxuICAgIC8vIEtlcHQgaW4gc3RlcCB3aXRoIHRoZSBuZ09uQ2hhbmdlcyBhbm5vdW5jZW1lbnQgc28gdGhlIHR3byBjYW4ndCBkaXNhZ3JlZVxuICAgIC8vIGFib3V0IHdoYXQgdGhlIGhvc3Qgd2FzIGxhc3QgdG9sZC5cbiAgICB0aGlzLl9lbWl0dGVkUGFnZUlkID0gdGhpcy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsO1xuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCh0aGlzLl9lbWl0dGVkUGFnZUlkKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2U7IHRoZSBob3N0IHJlLWZldGNoZXMgdGhlIHJlcG9ydCBhbmQgbmdPbkNoYW5nZXMgbGFuZHNcbiAgLy8gdGhlIHZpZXcgb24gdGhlIG5ldyAobGFzdCkgcGFnZS5cbiAgcHVibGljIGFkZFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydERhdGEuYWRkUGFnZSh0aGlzLnJlcG9ydC5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXBvcnRDaGFuZ2VkLmVtaXQoKSk7XG4gIH1cblxuICBwdWJsaWMgcGFnZUxhYmVsKHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YDtcbiAgfVxuXG4gIC8vIFJlbmFtZSBmcm9tIHRoZSB0YWIncyBrZWJhYi4gVGhlIHBhZ2UgbGlzdCBpcyBwYXRjaGVkIGluIHBsYWNlIHJhdGhlciB0aGFuXG4gIC8vIHJlLWZldGNoaW5nIHRoZSByZXBvcnQ6IG5vdGhpbmcgZWxzZSBvbiB0aGUgY2FudmFzIGRlcGVuZHMgb24gYSBwYWdlJ3NcbiAgLy8gbmFtZSwgYW5kIGEgcmUtZmV0Y2ggd291bGQgcmUtcnVuIGV2ZXJ5IGNvbXBvbmVudCdzIHF1ZXJ5IHRvIHJlcGFpbnQgYVxuICAvLyBjaGlwJ3MgbGFiZWwuXG4gIHB1YmxpYyByZW5hbWVQYWdlKHBhZ2U6IFJlcG9ydFBhZ2UpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9tcHQuaW5wdXQoe1xuICAgICAgdGl0bGU6ICdFZGl0IFBhZ2UgTmFtZScsXG4gICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgZGVmYXVsdDogcGFnZS5uYW1lID8/ICcnLFxuICAgICAgY29tbWl0TGFiZWw6ICdTYXZlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuX3JlcG9ydERhdGFcbiAgICAgICAgICAudXBkYXRlUGFnZSh0aGlzLnJlcG9ydC5pZCwgcGFnZS5pZCwgeyBuYW1lIH0pXG4gICAgICAgICAgLnBpcGUobWFwKCgpID0+IG5hbWUpKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBwYWdlLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnBhZ2VzLnNldCh0aGlzLnBhZ2VzKCkpO1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NhdmVkIHBhZ2UgbmFtZScpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBEZWxldGUgZnJvbSB0aGUgdGFiJ3Mga2ViYWIuIFRoZSBjb25maXJtIG5hbWVzIHRoZSBwYWdlIGFuZCBzYXlzIHRoZVxuICAvLyBjb21wb25lbnRzIGdvIHdpdGggaXQg4oCUIHRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgbGFzdCBwYWdlLCBhbmQgdGhhdCByZWZ1c2FsXG4gIC8vIHN1cmZhY2VzIGFzIHRoZSBBUEkgZXJyb3IgbWVzc2FnZSByYXRoZXIgdGhhbiBiZWluZyBzZWNvbmQtZ3Vlc3NlZCBoZXJlLlxuICBwdWJsaWMgZGVsZXRlUGFnZShwYWdlOiBSZXBvcnRQYWdlKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdDb25maXJtJyxcbiAgICAgIHRlbXBsYXRlOiBgQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSBcIiR7dGhpcy5wYWdlTGFiZWwocGFnZSwgdGhpcy5wYWdlcygpLmluZGV4T2YocGFnZSkpfVwiIGFuZCBldmVyeXRoaW5nIG9uIGl0P2AsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGVQYWdlKHRoaXMucmVwb3J0LmlkLCBwYWdlLmlkKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlcyA9IHRoaXMucGFnZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYWdlcy5pbmRleE9mKHBhZ2UpO1xuICAgICAgICBwYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnBhZ2VzLnNldChwYWdlcyk7XG5cbiAgICAgICAgLy8gTGFuZCBvbiB0aGUgbmVpZ2hib3VyIHJhdGhlciB0aGFuIHNuYXBwaW5nIGJhY2sgdG8gdGhlIGZpcnN0IHBhZ2Ug4oCUXG4gICAgICAgIC8vIGRlbGV0aW5nIHBhZ2UgNCBvZiA2IHNob3VsZCBsZWF2ZSB5b3UgbG9va2luZyBhdCB3aGF0IGlzIG5vdyBwYWdlIDQuXG4gICAgICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4LnNldChNYXRoLm1pbihpbmRleCwgcGFnZXMubGVuZ3RoIC0gMSkpO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1BhZ2VDb3VudCA9IHBhZ2VzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcblxuICAgICAgICAvLyBUaGUgcGFnZSBvbiBzY3JlZW4ganVzdCBzdG9wcGVkIGV4aXN0aW5nIOKAlCByZXBvcnQgdGhlIG5laWdoYm91ciB3ZVxuICAgICAgICAvLyBsYW5kZWQgb24sIHNvIHRoZSBob3N0J3Mgc3RhdGUgbmFtZXMgYSBwYWdlIHRoZSByZXBvcnQgaGFzLlxuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQodGhpcy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsKTtcblxuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0RlbGV0ZWQgcGFnZScpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBBIHRhYiB3YXMgZHJhZ2dlZCB0byBhIG5ldyBzbG90OiByZW9yZGVyIGxvY2FsbHkgc28gdGhlIGNoaXBzIHNldHRsZVxuICAvLyBpbW1lZGlhdGVseSwga2VlcCB0aGUgdmlld2VyIG9uIHRoZSBwYWdlIHRoZXkgd2VyZSBsb29raW5nIGF0LCBhbmQgcGVyc2lzdFxuICAvLyB0aGUgd2hvbGUgc2VxdWVuY2UgaW4gb25lIFBVVC5cbiAgcHVibGljIG9uUGFnZURyb3BwZWQoZXZlbnQ6IENka0RyYWdEcm9wPHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnByZXZpb3VzSW5kZXggPT09IGV2ZW50LmN1cnJlbnRJbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZVBhZ2UgPSB0aGlzLmFjdGl2ZVBhZ2U7XG4gICAgY29uc3QgcGFnZXMgPSB0aGlzLnBhZ2VzKCk7XG5cbiAgICBtb3ZlSXRlbUluQXJyYXkocGFnZXMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgdGhpcy5wYWdlcy5zZXQocGFnZXMpO1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gcGFnZXMubWFwKChwYWdlLCBvcmRlcikgPT4ge1xuICAgICAgcGFnZS5vcmRlciA9IG9yZGVyO1xuXG4gICAgICByZXR1cm4geyBwYWdlSWQ6IHBhZ2UuaWQsIG9yZGVyIH07XG4gICAgfSk7XG5cbiAgICBpZiAoYWN0aXZlUGFnZSkge1xuICAgICAgdGhpcy5hY3RpdmVQYWdlSW5kZXguc2V0KHBhZ2VzLmluZGV4T2YoYWN0aXZlUGFnZSkpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydERhdGEuc2F2ZVBhZ2VQb3NpdGlvbnModGhpcy5yZXBvcnQuaWQsIHBvc2l0aW9ucylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIEhhbmQgcHJlc2VudGF0aW9uIHNldHRpbmdzICh0aXRsZSwgcGFkZGluZykgc2F2ZWQgaW4gdGhlIHNldHRpbmdzIGRpYWxvZyB0b1xuICAvLyB0aGUgb25lIGNvbXBvbmVudCB0aGV5IGJlbG9uZyB0by4gTm90aGluZyBoZXJlIGZlZWRzIHRoZSBxdWVyeSwgc28gdGhhdFxuICAvLyBjb21wb25lbnQgcmVwYWludHMgYW5kIGV2ZXJ5IG90aGVyIG9uZSBvbiB0aGUgcGFnZSBpcyBsZWZ0IGFsb25lLiBBIHZhbHVlXG4gIC8vIGlzIG5ldmVyIGRyYXduOiBpdHMgdGl0bGUgaXMgaXRzIE5hbWUsIHdoaWNoIGl0cyBjaGlwcyBhbmQgdG9rZW5zIHJlYWQuXG4gIHB1YmxpYyBhcHBseUNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudElkOiBudW1iZXIsIHNldHRpbmdzOiBDb21wb25lbnRTZXR0aW5ncyk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmRlcmVkID0gdGhpcy5fcmVuZGVyZWRDb21wb25lbnRzXG4gICAgICAuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuY29tcG9uZW50LmlkID09PSBjb21wb25lbnRJZCk7XG5cbiAgICBpZiAocmVuZGVyZWQpIHtcbiAgICAgIHJlbmRlcmVkLmFwcGx5U2V0dGluZ3Moc2V0dGluZ3MpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBbLi4udGhpcy5fcGFnZVZhbHVlQ29tcG9uZW50cygpLCAuLi50aGlzLl9tYXN0ZXJWYWx1ZUNvbXBvbmVudHMoKV1cbiAgICAgIC5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuXG4gICAgLy8gVGhlIHNlcnZlciBrZWVwcyB0aGUgb2xkIE5hbWUgZm9yIGEgYmxhbmsgb25lLlxuICAgIGlmICh2YWx1ZSAmJiBzZXR0aW5ncy50aXRsZT8udHJpbSgpKSB7XG4gICAgICB2YWx1ZS50aXRsZSA9IHNldHRpbmdzLnRpdGxlLnRyaW0oKTtcbiAgICAgIHRoaXMuX3ZhbHVlc1JldmlzaW9uLnVwZGF0ZSgocmV2aXNpb24pID0+IHJldmlzaW9uICsgMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdENvbXBvbmVudChjb21wb25lbnRJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZC5zZXQoY29tcG9uZW50SWQpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FudmFzUG9pbnRlckRvd24oKTogdm9pZCB7XG4gICAgLy8gQmFja2dyb3VuZCBjbGljayAocGFuIHN0YXJ0KSBkZXNlbGVjdHMuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCgpICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSB6b29tIHRvb2xiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHVibGljIG9uWm9vbWVkKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnpvb20uc2V0KHNjYWxlKTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy56b29tUGFuPy56b29tSW4oKTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMuem9vbVBhbj8uem9vbU91dCgpO1xuICB9XG5cbiAgcHVibGljIHpvb21GaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydD8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZXdwb3J0IHx8ICF0aGlzLnJlcG9ydD8ucGFnZVdpZHRoIHx8ICF0aGlzLnpvb21QYW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXQgPSBNYXRoLm1pbihcbiAgICAgICh2aWV3cG9ydC5jbGllbnRXaWR0aCAtIDMyKSAvICh0aGlzLnJlcG9ydC5wYWdlV2lkdGggKiBQWF9QRVJfSU5DSCksXG4gICAgICAodmlld3BvcnQuY2xpZW50SGVpZ2h0IC0gMzIpIC8gKHRoaXMucmVwb3J0LnBhZ2VIZWlnaHQgKiBQWF9QRVJfSU5DSCksXG4gICAgKTtcblxuICAgIHRoaXMuem9vbVBhbi56b29tKE1hdGgubWluKDEuNSwgTWF0aC5tYXgoMC4xLCBmaXQpKSk7XG4gICAgdGhpcy56b29tUGFuLm1vdmUoMTYsIDE2KTtcbiAgICB0aGlzLl9maXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHpvb21BY3R1YWwoKTogdm9pZCB7XG4gICAgdGhpcy56b29tUGFuPy56b29tKDEpO1xuICB9XG5cbiAgLy8gLS0tLS0gcGVyc2lzdGVuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEEgZHJhZy9yZXNpemUgbGFuZGVkIOKAlCBvbmUgUFVUIHBlciBnZXN0dXJlLlxuICBwdWJsaWMgb25Qb3NpdGlvbkNoYW5nZWQocG9zaXRpb246IHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyR3VpZGVzKCk7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zYXZlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBbcG9zaXRpb24gYXMgYW55XSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIC0tLS0tIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBFYWNoIGxheWVyIHJlYWRzIGl0cyB2YWx1ZXMnIG51bWJlcnMgb24gaXRzIG93biBzdHJlYW06IGFnYWluIHdoZW4gYVxuICAvLyByZXBvcnQgcmVsb2FkIGNoYW5nZXMgd2hhdCB0aGV5IGRlcGVuZCBvbiAobmdPbkNoYW5nZXMpLCB3aGVuIGEgc2F2ZWQgdGV4dFxuICAvLyBzaG93cyBhIHZhbHVlIGl0IGhhcyBubyBudW1iZXIgZm9yLCB3aGVuIGEgZmlsdGVyIGFueSBvZiBpdHMgdmFsdWVzXG4gIC8vIGZvbGxvd3MgY2hhbmdlcyAoYW4gb3BlcmFuZCBubyB0ZXh0IHNob3dzIG1vdmVzIHRoZSBmb3JtdWxhIHRoYXQgcmVhZHNcbiAgLy8gaXQpLCBhbmQgd2hlbiBpdCBjb21lcyBvbiBzY3JlZW4g4oCUIHRoZSBhY3RpdmUgcGFnZSB3aGVuIGFub3RoZXIgcGFnZSBkb2VzLFxuICAvLyB0aGUgbWFzdGVyIHdoZW4gYSBwYWdlIHNob3dzIGl0IG9yIGl0IGlzIGVkaXRlZC5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl93YXRjaFZhbHVlcyh0aGlzLl9wYWdlVmFsdWVzLCB0b09ic2VydmFibGUodGhpcy5hY3RpdmVQYWdlSWQpKTtcbiAgICB0aGlzLl93YXRjaFZhbHVlcyh0aGlzLl9tYXN0ZXJWYWx1ZXMsIHRvT2JzZXJ2YWJsZSh0aGlzLl9tYXN0ZXJOZWVkZWQpKTtcbiAgICB0aGlzLl93YXRjaEZpbHRlcnMoKTtcbiAgICB0aGlzLl93YXRjaE9wdGlvbk5hbWVzKCk7XG4gIH1cblxuICAvLyBUaGUgZmlsdGVyIHRva2VucyBmb2xsb3cgZXZlcnkgY2hhbmdlIG9mIGEgZmlsdGVyJ3MgdmFsdWUsIGhvd2V2ZXIgaXRcbiAgLy8gY29tZXM6IHRoZSBiYXIsIGEgc2F2ZWQgZmlsdGVyIHBpY2tlZCwgQ2xlYXIsIGEgcmVsb2FkLiBjaGFuZ2VzKClcbiAgLy8gYWxzbyBhbm5vdW5jZXMgd2hhdCBubyB0b2tlbiByZWFkcyAoYSBsaXN0J3Mgc29ydCBvciBzZWFyY2gsIGl0cyBoaWRkZW5cbiAgLy8gY29sdW1ucywgYSBkcmlsbCwgdGhlIHBhZ2UpLCB3aGljaCBtb3ZlcyBub3RoaW5nIGhlcmUuXG4gIHByaXZhdGUgX3dhdGNoRmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5fZmlsdGVyVmFsdWVzS2V5KCkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZvcmdldFVucmVhZE5hbWVzKCk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyUmV2aXNpb24udXBkYXRlKChyZXZpc2lvbikgPT4gcmV2aXNpb24gKyAxKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IGZpbHRlciBncm91cCdzIHZhbHVlIGFzIG9uZSBzdHJpbmc6IGFsbCBhIGZpbHRlciB0b2tlbiByZWFkcyBvZlxuICAvLyB0aGUgZmlsdGVyIHN0YXRlLlxuICBwcml2YXRlIF9maWx0ZXJWYWx1ZXNLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKHRoaXMuX3JlcG9ydCgpPy5maWx0ZXJHcm91cHMgPz8gW10pXG4gICAgICAubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCkgPz8gbnVsbF0pKTtcbiAgfVxuXG4gIC8vIERyb3BzIHRoZSBwaWNrcyB3aG9zZSBuYW1lcyBjb3VsZCBub3QgYmUgcmVhZCwgc28gdGhlIGNoYW5nZSB1bmRlciB3YXlcbiAgLy8gYXNrcyBmb3IgdGhlbSBhZ2FpbiByYXRoZXIgdGhhbiB0aGVpciB0b2tlbnMgcmVhZGluZyB0aGUgZW0gZGFzaCB1bnRpbFxuICAvLyB0aGUgcmVwb3J0IHJlbG9hZHMuXG4gIHByaXZhdGUgX2ZvcmdldFVucmVhZE5hbWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlZCA9IG5ldyBNYXAodGhpcy5fb3B0aW9uTmFtZXMoKSk7XG4gICAgY29uc3QgdW5yZWFkID0gWy4uLmxvYWRlZC5rZXlzKCldLmZpbHRlcigoa2V5KSA9PiBsb2FkZWQuZ2V0KGtleSkgPT09IG51bGwpO1xuICAgIGlmICghdW5yZWFkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVucmVhZC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGxvYWRlZC5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuX29wdGlvbk5hbWVzQXNrZWQuZGVsZXRlKGtleSk7XG4gICAgfSk7XG4gICAgdGhpcy5fb3B0aW9uTmFtZXMuc2V0KGxvYWRlZCk7XG4gIH1cblxuICAvLyBOYW1lcyBlYWNoIHNlbGVjdCBwaWNrIHRoZSBmaWx0ZXIgdG9rZW5zIHNob3csIG9uY2UgcGVyIGdyb3VwIGFuZCBwaWNrZWRcbiAgLy8gaWRzIGZvciBlYWNoIGxvYWQgb2YgdGhlIHJlcG9ydCwgYXMgdGhlIGJhcidzIGNoaXBzIG5hbWUgdGhlbTogYSBuYW1lIGl0c1xuICAvLyBsaXN0cyB0YXVnaHQsIGVsc2UgdGhlIGdyb3VwJ3Mgb3B0aW9uIGxpc3QsIHdoaWNoIGlzIGZldGNoZWQgb25jZSBmb3IgYWxsXG4gIC8vIG9mIGl0cyBwaWNrczsgbm90aGluZyBpcyBhc2tlZCB3aGlsZSBub3RoaW5nIGlzIHBpY2tlZC5cbiAgcHJpdmF0ZSBfd2F0Y2hPcHRpb25OYW1lcygpOiB2b2lkIHtcbiAgICB0b09ic2VydmFibGUodGhpcy5fc2VsZWN0UGlja3MpXG4gICAgICAucGlwZShcbiAgICAgICAgbWVyZ2VNYXAoKHBpY2tzKSA9PiBmcm9tKHBpY2tzLmZpbHRlcigocGljaykgPT4gIXRoaXMuX29wdGlvbk5hbWVzQXNrZWQuaGFzKHBpY2sua2V5KSkpKSxcbiAgICAgICAgdGFwKChwaWNrKSA9PiB0aGlzLl9vcHRpb25OYW1lc0Fza2VkLmFkZChwaWNrLmtleSkpLFxuICAgICAgICBtZXJnZU1hcCgocGljaykgPT4gcGlja2VkT3B0aW9uTmFtZXMoXG4gICAgICAgICAgdGhpcy5fZ3JvdXBPcHRpb25zKHBpY2suZ3JvdXAsIHBpY2sucmVwb3J0SWQpLFxuICAgICAgICAgIHBpY2sudmFsdWVzLFxuICAgICAgICAgICh2YWx1ZSkgPT4gdGhpcy5fZmlsdGVyT3B0aW9ucy5sYWJlbChwaWNrLmdyb3VwLmlkLCB2YWx1ZSksXG4gICAgICAgIClcbiAgICAgICAgICAucGlwZShtYXAoKG5hbWVzKSA9PiAoeyBrZXk6IHBpY2sua2V5LCBuYW1lcyB9KSkpKSxcbiAgICAgICAgdGFwKCh7IGtleSwgbmFtZXMgfSkgPT4gdGhpcy5fb3B0aW9uTmFtZXMudXBkYXRlKChsb2FkZWQpID0+IG5ldyBNYXAobG9hZGVkKS5zZXQoa2V5LCBuYW1lcykpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsdWVMYXllcihzb3VyY2U6ICgpID0+IFJlcG9ydFBhZ2UgfCBSZXBvcnRNYXN0ZXIgfCBudWxsKTogVmFsdWVMYXllciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIHJlbG9hZCQ6IG5ldyBTdWJqZWN0PHZvaWQ+KCksXG4gICAgICByZXN1bHRzOiBzaWduYWw8TGF5ZXJWYWx1ZXMgfCBudWxsPihudWxsKSxcbiAgICAgIHBlbmRpbmc6IHNpZ25hbDxMYXllclZhbHVlc1JlcXVlc3QgfCBudWxsPihudWxsKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVHJpZ2dlcnMgbGFuZGluZyB0b2dldGhlciAoYSByZWxvYWQgdGhhdCBhbHNvIGNoYW5nZXMgdGhlIHBhZ2UpIG1ha2Ugb25lXG4gIC8vIHJlcXVlc3QsIGFuZCBhIG5ld2VyIHJlcXVlc3QgZHJvcHMgdGhlIG9uZSBzdGlsbCBpbiBmbGlnaHQuIEFueSBvdGhlclxuICAvLyBjaGFuZ2Ugb2YgdGhlIHNjcmVlbidzIHN0YXRlIChjaGFuZ2VzKSBhc2tzIGFnYWluIG9ubHkgd2hlbiBpdCBtb3ZlZFxuICAvLyB0aGUgcmVxdWVzdDogdGhlIGJhciByZXNldCAoc3RhdGVWZXJzaW9uIG1vdmVzIG9uXG4gIC8vIGl0KSwgdGhlIG1hdGNoIGNoYW5nZWQsIG9yLCB3aGlsZSB0aGUgZ3JvdXBzIG1hdGNoICdhbnknLCBhIGdyb3VwIHRoZVxuICAvLyB2YWx1ZXMgaGF2ZSBubyBtZW1iZXIgb2YgdG9vayBvciBsb3N0IGEgdmFsdWUuXG4gIHByaXZhdGUgX3dhdGNoVmFsdWVzKGxheWVyOiBWYWx1ZUxheWVyLCBvblNjcmVlbiQ6IE9ic2VydmFibGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBtZXJnZShcbiAgICAgIGxheWVyLnJlbG9hZCQsXG4gICAgICBvblNjcmVlbiQsXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yQW55KCgpID0+IGxheWVyLnNvdXJjZSgpPy52YWx1ZXMgPz8gW10pLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpLFxuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlcygpLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICByeEZpbHRlcigoKSA9PiB0aGlzLl9yZXF1ZXN0TW92ZWQobGF5ZXIpKSxcbiAgICAgICksXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuX2xheWVyUmVxdWVzdChsYXllci5zb3VyY2UoKSkpLFxuICAgICAgICB0YXAoKHJlcXVlc3QpID0+IGxheWVyLnBlbmRpbmcuc2V0KHJlcXVlc3QpKSxcbiAgICAgICAgc3dpdGNoTWFwKChyZXF1ZXN0KSA9PiB0aGlzLl9sb2FkVmFsdWVzKHJlcXVlc3QpKSxcbiAgICAgICAgdGFwKChsb2FkZWQpID0+IHtcbiAgICAgICAgICBsYXllci5yZXN1bHRzLnNldChsb2FkZWQpO1xuICAgICAgICAgIGxheWVyLnBlbmRpbmcuc2V0KG51bGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gQSByZWxvYWQgb2YgdGhlIHJlcG9ydCByZWFkcyBhIGxheWVyJ3MgbnVtYmVycyBhZ2FpbiBvbmx5IHdoZW4gc29tZXRoaW5nXG4gIC8vIHRoZXkgZGVwZW5kIG9uIG1vdmVkOiBhIHJlbmFtZSwgb3IgYW4gZWRpdCB0byBhIHRpbGUsIGhhbmRzIG92ZXIgYSBuZXdcbiAgLy8gcmVwb3J0IGFuZCBsZWF2ZXMgZXZlcnkgbnVtYmVyIGFzIGl0IHdhcy4gQ29tcGFyZWQgd2l0aCB0aGUgcmVxdWVzdCBvbiBpdHNcbiAgLy8gd2F5LCBlbHNlIHRoZSBvbmUgd2hvc2UgbnVtYmVycyBhcmUgb24gc2NyZWVuLlxuICBwcml2YXRlIF9yZWxvYWRJZkNoYW5nZWQobGF5ZXI6IFZhbHVlTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVxdWVzdE1vdmVkKGxheWVyKSkge1xuICAgICAgbGF5ZXIucmVsb2FkJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hldGhlciB0aGUgbGF5ZXIncyByZXF1ZXN0IG5vdyBkaWZmZXJzIGZyb20gdGhlIG9uZSBvbiBpdHMgd2F5LCBlbHNlXG4gIC8vIHRoZSBvbmUgd2hvc2UgbnVtYmVycyBhcmUgb24gc2NyZWVuLlxuICBwcml2YXRlIF9yZXF1ZXN0TW92ZWQobGF5ZXI6IFZhbHVlTGF5ZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBsYXN0ID0gbGF5ZXIucGVuZGluZygpID8/IGxheWVyLnJlc3VsdHMoKTtcblxuICAgIHJldHVybiB0aGlzLl9sYXllclJlcXVlc3QobGF5ZXIuc291cmNlKCkpLnNpZ25hdHVyZSAhPT0gbGFzdD8uc2lnbmF0dXJlO1xuICB9XG5cbiAgLy8gUmVhZCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNlbnQsIG5vdCB3aGVuIGl0IHdhcyBhc2tlZCBmb3I6IGFuIGVkaXQgbWF5IGhhdmVcbiAgLy8ganVzdCBjaGFuZ2VkIHdoaWNoIHZhbHVlcyB0aGUgbGF5ZXIncyB0ZXh0IHNob3dzLiBUaGUgZmlsdGVyIHZhbHVlcyBvZlxuICAvLyBldmVyeSB2YWx1ZSBvbiB0aGUgbGF5ZXIgZ28gb3V0LCBzaG93biBvciBub3Q6IHRoZSBzZXJ2ZXIgZGVjaWRlcyB3aGljaFxuICAvLyB2YWx1ZXMgaXQgcmVhZHMsIGFuZCBhcHBsaWVzIHRvIGVhY2ggb25seSB0aGUgZW50cmllcyBuYW1pbmcgaXRzIG93blxuICAvLyBmaWx0ZXJzLCBzbyBhbiBvcGVyYW5kIG9ubHkgYSBmb3JtdWxhIHJlYWRzIGlzIGZpbHRlcmVkIGFzIGlmIGl0IHdlcmVcbiAgLy8gc2hvd24uIEEgdmFsdWUncyBOYW1lIGlzIGxlZnQgb3V0IG9mIHRoZSBzaWduYXR1cmU6IGEgcmVuYW1lIG1vdmVzIG5vXG4gIC8vIG51bWJlci4gV2hpbGUgdGhlIGdyb3VwcyBtYXRjaCAnYW55JywgdGhlIHJlcXVlc3QgbGlzdHMgdGhlIGdyb3VwcyB0aGF0XG4gIC8vIGNvbWJpbmUsIGJ5IHRoZSB0aWxlIHJ1bGUgKHZhbHVlc01hdGNoQW55R3JvdXBJZHMpOiBhIGhlYWRlciBvciBmb290ZXJcbiAgLy8gdmFsdWUncyBhcmUgdGhlIHBhZ2Ugb24gc2NyZWVuJ3MuXG4gIHByaXZhdGUgX2xheWVyUmVxdWVzdChsYXllcjogUmVwb3J0UGFnZSB8IFJlcG9ydE1hc3RlciB8IG51bGwpOiBMYXllclZhbHVlc1JlcXVlc3Qge1xuICAgIGNvbnN0IHBhZ2VJZCA9IGxheWVyPy5pZCA/PyBudWxsO1xuICAgIGNvbnN0IHZhbHVlcyA9IGxheWVyPy52YWx1ZXMgPz8gW107XG4gICAgY29uc3Qgc2hvd24gPSB0aGlzLl9zaG93blZhbHVlcyhsYXllcik7XG4gICAgY29uc3QgZmlsdGVycyA9IHZhbHVlcy5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSk7XG4gICAgY29uc3QgbWF0Y2hBbnlHcm91cElkcyA9IHZhbHVlcy5sZW5ndGhcbiAgICAgID8gdmFsdWVzTWF0Y2hBbnlHcm91cElkcyh0aGlzLnJlcG9ydCwgcGFnZUlkLCB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpKVxuICAgICAgOiBbXTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYWdlSWQsXG4gICAgICBzaG93bixcbiAgICAgIGZpbHRlcnMsXG4gICAgICBtYXRjaEFueUdyb3VwSWRzLFxuICAgICAgc2lnbmF0dXJlOiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgIHBhZ2VJZCxcbiAgICAgICAgc2hvd24ubWFwKCh2YWx1ZSkgPT4gdmFsdWUuaWQpLFxuICAgICAgICB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIHRpdGxlOiBudWxsIH0pKSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgbWF0Y2hBbnlHcm91cElkcyxcbiAgICAgIF0pLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgdmFsdWVzIGEgbGF5ZXIncyB0ZXh0IHNob3dzLiBJdHMgcmVxdWVzdCBhbHNvIHJlYWRzIHRoZSBvcGVyYW5kcyBvZlxuICAvLyB0aGUgZm9ybXVsYXMgYW1vbmcgdGhlbSwgYnV0IG9ubHkgdGhlIHNob3duIG9uZXMgcmVhZCBhcyBsb2FkaW5nIHdoaWxlIGl0XG4gIC8vIGlzIG9uIGl0cyB3YXksIGFuZCBhIGxheWVyIHRoYXQgc2hvd3Mgbm9uZSBhc2tzIGZvciBub3RoaW5nLlxuICBwcml2YXRlIF9zaG93blZhbHVlcyhsYXllcjogUmVwb3J0UGFnZSB8IFJlcG9ydE1hc3RlciB8IG51bGwpOiBSZXBvcnRDb21wb25lbnRbXSB7XG4gICAgY29uc3QgdGV4dHMgPSAobGF5ZXI/LmNvbXBvbmVudHMgPz8gW10pLmZpbHRlcigoY29tcG9uZW50KSA9PiBjb21wb25lbnQudHlwZSA9PT0gJ3RleHQnKTtcblxuICAgIHJldHVybiBzaG93blZhbHVlcyhsYXllcj8udmFsdWVzID8/IFtdLCB0ZXh0cyk7XG4gIH1cblxuICAvLyBPbmUgbGF5ZXIncyBudW1iZXJzLCBieSB2YWx1ZSBpZC4gQSBsYXllciB3aG9zZSB0ZXh0IHNob3dzIG5vIHZhbHVlIGFza3NcbiAgLy8gZm9yIG5vdGhpbmcuIEEgZmFpbGVkIHJlcXVlc3QgcmVhZHMgYXMgbm8gbnVtYmVycyAoZWFjaCB2YWx1ZSBhbiBlbSBkYXNoKVxuICAvLyByYXRoZXIgdGhhbiBhbiBlcnJvciBkaWFsb2c6IHRoZSB3b3JkcyBhcm91bmQgdGhlbSBzdGlsbCByZWFkLlxuICBwcml2YXRlIF9sb2FkVmFsdWVzKHtcbiAgICBwYWdlSWQsIHNob3duLCBmaWx0ZXJzLCBtYXRjaEFueUdyb3VwSWRzLCBzaWduYXR1cmUsXG4gIH06IExheWVyVmFsdWVzUmVxdWVzdCk6IE9ic2VydmFibGU8TGF5ZXJWYWx1ZXM+IHtcbiAgICBjb25zdCBsb2FkZWQgPSAocm93czogUmVwb3J0UGFnZVZhbHVlW10pOiBMYXllclZhbHVlcyA9PiAoe1xuICAgICAgcGFnZUlkLFxuICAgICAgc2lnbmF0dXJlLFxuICAgICAgcm93czogbmV3IE1hcChyb3dzLm1hcCgocm93KSA9PiBbcm93LmlkLCByb3ddKSksXG4gICAgfSk7XG5cbiAgICBpZiAocGFnZUlkID09PSBudWxsIHx8ICFzaG93bi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvZihsb2FkZWQoW10pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5wYWdlVmFsdWVzKHRoaXMucmVwb3J0LmlkLCBwYWdlSWQsIGZpbHRlcnMsIGZhbHNlLCB7IGhhbmRsZXJzOiBmYWxzZSB9LCBtYXRjaEFueUdyb3VwSWRzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocm93cykgPT4gbG9hZGVkKHJvd3MgPz8gW10pKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihsb2FkZWQoW10pKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIHRva2VucyBvZiBvbmUgbGF5ZXIncyBibG9ja3MuIE51bWJlcnMgcmVhZCBmb3IgYW5vdGhlciBwYWdlIGFyZSBub3RcbiAgLy8gdGhpcyBvbmUncywgc28gdW50aWwgaXRzIG93biBhcnJpdmUgaXRzIHZhbHVlcyByZWFkIGFzIGxvYWRpbmc7IHNvIGRvZXMgYVxuICAvLyB2YWx1ZSB0aGUgcmVxdWVzdCBvbiBpdHMgd2F5IGFza3MgZm9yLCB1bnRpbCBpdCBsYW5kcy4gZmlsdGVyUGFnZUlkIGlzXG4gIC8vIHRoZSBwYWdlIHdob3NlIHBhZ2UgZmlsdGVycyB0aGUgbGF5ZXIgcmVhZHM6IHRoZSBwYWdlJ3Mgb3duLCBub25lIChudWxsKVxuICAvLyBmb3IgdGhlIGhlYWRlciBhbmQgZm9vdGVyLlxuICBwcml2YXRlIF90b2tlbkNvbnRleHQoXG4gICAgdmFsdWVzOiBSZXBvcnRDb21wb25lbnRbXSxcbiAgICBsYXllcjogVmFsdWVMYXllcixcbiAgICB2YWx1ZVBhZ2VJZDogbnVtYmVyIHwgbnVsbCxcbiAgICBmaWx0ZXJQYWdlSWQ6IG51bWJlciB8IG51bGwsXG4gICk6IFRleHRUb2tlbkNvbnRleHQge1xuICAgIC8vIFJlYWQgc28gYSByZW5hbWUsIHBhdGNoZWQgaW50byB0aGUgdmFsdWUgaW4gcGxhY2UsIHJlY29tcHV0ZXMgdGhlIG5hbWVzLlxuICAgIHRoaXMuX3ZhbHVlc1JldmlzaW9uKCk7XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYWN0aXZlUGFnZUluZGV4KCk7XG4gICAgY29uc3QgcGFnZSA9IHRoaXMucGFnZXMoKVtpbmRleF07XG4gICAgY29uc3QgcmVzdWx0cyA9IGxheWVyLnJlc3VsdHMoKTtcbiAgICBjb25zdCBwZW5kaW5nID0gbGF5ZXIucGVuZGluZygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXI6IGluZGV4ICsgMSxcbiAgICAgIHBhZ2VOYW1lOiBwYWdlID8gdGhpcy5wYWdlTGFiZWwocGFnZSwgaW5kZXgpIDogJycsXG4gICAgICByZXBvcnROYW1lOiB0aGlzLl9yZXBvcnQoKT8ubmFtZSA/PyAnJyxcbiAgICAgIHZhbHVlczogdGV4dFZhbHVlcyhcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICByZXN1bHRzPy5wYWdlSWQgPT09IHZhbHVlUGFnZUlkID8gcmVzdWx0cyA6IG51bGwsXG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSxcbiAgICAgICAgbmV3IFNldChwZW5kaW5nPy5wYWdlSWQgPT09IHZhbHVlUGFnZUlkID8gcGVuZGluZy5zaG93bi5tYXAoKHZhbHVlKSA9PiB2YWx1ZS5pZCkgOiBbXSksXG4gICAgICApLFxuICAgICAgdmFsdWVQYWdlSWQsXG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJGaWVsZHMoZmlsdGVyUGFnZUlkKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gV2hhdCB0aGUge3tmaWx0ZXIuPGlkPn19IHRva2VucyBvZiBhIGxheWVyIHByaW50OiBlYWNoIGZpbHRlciBncm91cCB0aGVcbiAgLy8gbGF5ZXIgcmVhZHMgKGxheWVyRmlsdGVyR3JvdXBzKSBhdCB0aGUgdmlld2VyJ3MgY3VycmVudCB2YWx1ZS4gQSBzZWxlY3RcbiAgLy8gcmVhZHMgYXMgbG9hZGluZyB1bnRpbCB0aGUgbmFtZXMgb2YgaXRzIHBpY2tzIGFycml2ZS5cbiAgcHJpdmF0ZSBfZmlsdGVyRmllbGRzKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD4ge1xuICAgIHRoaXMuX2ZpbHRlclJldmlzaW9uKCk7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5fb3B0aW9uTmFtZXMoKTtcblxuICAgIHJldHVybiB0ZXh0RmlsdGVyRmllbGRzKFxuICAgICAgbGF5ZXJGaWx0ZXJHcm91cHModGhpcy5fcmVwb3J0KCk/LmZpbHRlckdyb3VwcyA/PyBbXSwgcGFnZUlkKSxcbiAgICAgIChncm91cElkKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cElkKSxcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKS5sb2NhbGUsXG4gICAgICAoZ3JvdXAsIHZhbHVlcykgPT4gbG9hZGVkLmdldChvcHRpb25OYW1lc0tleShncm91cC5pZCwgdmFsdWVzKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRha2UgYSBkZWxldGVkIHZhbHVlJ3MgY2hpcHMgb3V0IG9mIGFuIG9wZW4gZWRpdG9yLiBTYXZpbmcgaHRtbCBuZXZlclxuICAvLyBkZWxldGVzIGEgdmFsdWUsIHNvIGEga2V5IGxlYXZlcyBpdHMgbGF5ZXIgb25seSB3aGVuIHRoZSB2YWx1ZSBpcyBkZWxldGVkXG4gIC8vIChpdHMgZGlhbG9nLCB0aGUgYXNzaXN0YW50KSwgd2hlbiBhIHRleHQgZGVsZXRlIG9yIGFuIGFzc2lzdGFudCB3cml0ZVxuICAvLyBzd2VlcHMgdGhlIHBhZ2UncyB1bnVzZWQgdmFsdWVzLCBvciB3aXRoIGl0cyBwYWdlLiBIb3N0cyByZWxvYWQgdGhlIHJlcG9ydFxuICAvLyBhZnRlciBlYWNoLCBhbmQgdGhpcyBpcyB3aGF0IGZvbGxvd3MgdGhhdCByZWxvYWQgaW50byB0aGUgZWRpdG9yLiBPbmx5IHRoZVxuICAvLyBsYXllcnMgb24gc2NyZWVuIGhhdmUgcmVuZGVyZWQgYmxvY2tzOyBvdGhlciBwYWdlcyBhcmUgbGVmdCBhbG9uZS5cbiAgcHJpdmF0ZSBfZHJvcFJlbW92ZWRWYWx1ZUNoaXBzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBsYXllclZhbHVlS2V5cyh0aGlzLnJlcG9ydCk7XG4gICAgY29uc3QgbWFzdGVySWQgPSB0aGlzLnJlcG9ydD8ubWFzdGVyPy5pZCA/PyBudWxsO1xuICAgIGNvbnN0IHRleHRzID0gKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50cz8udG9BcnJheSgpID8/IFtdKS5maWx0ZXIoKHJlbmRlcmVkKSA9PiByZW5kZXJlZC5pc1RleHQpO1xuXG4gICAgdGhpcy5fdmFsdWVLZXlzQnlMYXllci5mb3JFYWNoKChrZXlzLCBsYXllcklkKSA9PiB7XG4gICAgICBjb25zdCBpc01hc3RlciA9IGxheWVySWQgPT09IG1hc3RlcklkO1xuICAgICAgaWYgKCFpc01hc3RlciAmJiBsYXllcklkICE9PSB0aGlzLmFjdGl2ZVBhZ2VJZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVtb3ZlZCA9IFsuLi5rZXlzXS5maWx0ZXIoKGtleSkgPT4gIW5leHQuZ2V0KGxheWVySWQpPy5oYXMoa2V5KSk7XG4gICAgICB0ZXh0c1xuICAgICAgICAuZmlsdGVyKChyZW5kZXJlZCkgPT4gdGhpcy5faXNNYXN0ZXJDb21wb25lbnQocmVuZGVyZWQuY29tcG9uZW50KSA9PT0gaXNNYXN0ZXIpXG4gICAgICAgIC5mb3JFYWNoKChyZW5kZXJlZCkgPT4gcmVtb3ZlZC5mb3JFYWNoKChrZXkpID0+IHJlbmRlcmVkLnJlbW92ZVZhbHVlKGtleSkpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3ZhbHVlS2V5c0J5TGF5ZXIgPSBuZXh0O1xuICB9XG5cbiAgLy8gSGVhZGVyIGFuZCBmb290ZXIgYmxvY2tzIGFyZSB0aGUgbWFzdGVyJ3M7IGV2ZXJ5IG90aGVyIGJsb2NrIGlzIHRoZSBwYWdlJ3MuXG4gIHByaXZhdGUgX2lzTWFzdGVyQ29tcG9uZW50KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnJlcG9ydD8ubWFzdGVyPy5jb21wb25lbnRzID8/IFtdKS5zb21lKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gY29tcG9uZW50LmlkKTtcbiAgfVxuXG4gIC8vIEEgYmFuZCdzIHRvcCBhbmQgYm90dG9tIGVkZ2VzLCBpbiBwYWdlIGluY2hlcy5cbiAgcHJpdmF0ZSBfYmFuZFNwYW4oYmFuZDogQmFuZCk6IHsgdG9wOiBudW1iZXI7IGJvdHRvbTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgaGVhZGVySGVpZ2h0LCBmb290ZXJIZWlnaHQgfSA9IHRoaXMuYmFuZHM7XG5cbiAgICByZXR1cm4gYmFuZCA9PT0gJ2hlYWRlcidcbiAgICAgID8geyB0b3A6IDAsIGJvdHRvbTogaGVhZGVySGVpZ2h0IH1cbiAgICAgIDogeyB0b3A6IHRoaXMucmVwb3J0LnBhZ2VIZWlnaHQgLSBmb290ZXJIZWlnaHQsIGJvdHRvbTogdGhpcy5yZXBvcnQucGFnZUhlaWdodCB9O1xuICB9XG5cbiAgLy8gT3BlbnMgdGhlIGVkaXRvciBvZiBhIGJsb2NrIGFkZGVkIGJ5IGRvdWJsZS1jbGlja2luZyBhIGJhbmQsIG9uY2UgaXQgaXNcbiAgLy8gZHJhd24uXG4gIHByaXZhdGUgX2VkaXRBcnJpdmVkVGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fcmVuZGVyZWRDb21wb25lbnRzXG4gICAgICAuZmluZCgocmVuZGVyZWQpID0+IHJlbmRlcmVkLmNvbXBvbmVudC5pZCA9PT0gdGhpcy5fZWRpdE9uQXJyaXZhbCk7XG5cbiAgICBpZiAodGV4dCkge1xuICAgICAgdGhpcy5fZWRpdE9uQXJyaXZhbCA9IG51bGw7XG4gICAgICB0ZXh0LmVkaXRUZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0gc21hcnQgZ3VpZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFBpeGVsIGZlZWwgb2YgdGhlIHNuYXAsIGNvbnZlcnRlZCB0byBpbmNoZXMgYXQgdGhlIGN1cnJlbnQgem9vbS5cbiAgcHJpdmF0ZSBnZXQgX3NuYXBUaHJlc2hvbGQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gOCAvIChQWF9QRVJfSU5DSCAqIE1hdGgubWF4KDAuMSwgdGhpcy56b29tKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBNb3ZlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgeyB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCB9ID0gdGhpcy5fY2FuZGlkYXRlcyhjb21wb25lbnQpO1xuICAgIGNvbnN0IGd1aWRlczogR3VpZGVMaW5lW10gPSBbXTtcblxuICAgIGNvbnN0IHNuYXBwZWRYID0gdGhpcy5fc25hcEF4aXMoXG4gICAgICBbXG4gICAgICAgIHsgb2Zmc2V0OiAwLCB2YWx1ZTogeCB9LFxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncgLyAyLCB2YWx1ZTogeCArIGNvbXBvbmVudC53IC8gMiB9LFxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncsIHZhbHVlOiB4ICsgY29tcG9uZW50LncgfSxcbiAgICAgIF0sXG4gICAgICB2ZXJ0aWNhbCxcbiAgICApO1xuICAgIGlmIChzbmFwcGVkWCAhPT0gbnVsbCkge1xuICAgICAgeCA9IHNuYXBwZWRYLmJhc2U7XG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkWC5ndWlkZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzbmFwcGVkWSA9IHRoaXMuX3NuYXBBeGlzKFxuICAgICAgW1xuICAgICAgICB7IG9mZnNldDogMCwgdmFsdWU6IHkgfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oIC8gMiwgdmFsdWU6IHkgKyBjb21wb25lbnQuaCAvIDIgfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oLCB2YWx1ZTogeSArIGNvbXBvbmVudC5oIH0sXG4gICAgICBdLFxuICAgICAgaG9yaXpvbnRhbCxcbiAgICApO1xuICAgIGlmIChzbmFwcGVkWSAhPT0gbnVsbCkge1xuICAgICAgeSA9IHNuYXBwZWRZLmJhc2U7XG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAnaCcsIHBvc2l0aW9uOiBzbmFwcGVkWS5ndWlkZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW5kZXJHdWlkZXMoZ3VpZGVzKTtcblxuICAgIHJldHVybiB7IHgsIHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBSZXNpemUoXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZ2VvbWV0cnk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgaGFuZGxlOiBzdHJpbmcsXG4gICk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgdmVydGljYWwsIGhvcml6b250YWwgfSA9IHRoaXMuX2NhbmRpZGF0ZXMoY29tcG9uZW50KTtcbiAgICBjb25zdCBndWlkZXM6IEd1aWRlTGluZVtdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5nZW9tZXRyeSB9O1xuXG4gICAgLy8gT25seSB0aGUgZWRnZXMgdGhlIGhhbmRsZSBtb3ZlcyBwYXJ0aWNpcGF0ZSBpbiBzbmFwcGluZy5cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdlJykpIHtcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LnggKyBnZW9tZXRyeS53LCB2ZXJ0aWNhbCk7XG4gICAgICBpZiAoc25hcHBlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudyA9IHNuYXBwZWQgLSBnZW9tZXRyeS54O1xuICAgICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCd3JykpIHtcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LngsIHZlcnRpY2FsKTtcbiAgICAgIGlmIChzbmFwcGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC53ID0gZ2VvbWV0cnkueCArIGdlb21ldHJ5LncgLSBzbmFwcGVkO1xuICAgICAgICByZXN1bHQueCA9IHNuYXBwZWQ7XG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICd2JywgcG9zaXRpb246IHNuYXBwZWQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3MnKSkge1xuICAgICAgY29uc3Qgc25hcHBlZCA9IHRoaXMuX25lYXJlc3QoZ2VvbWV0cnkueSArIGdlb21ldHJ5LmgsIGhvcml6b250YWwpO1xuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LmggPSBzbmFwcGVkIC0gZ2VvbWV0cnkueTtcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ2gnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnbicpKSB7XG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS55LCBob3Jpem9udGFsKTtcbiAgICAgIGlmIChzbmFwcGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5oID0gZ2VvbWV0cnkueSArIGdlb21ldHJ5LmggLSBzbmFwcGVkO1xuICAgICAgICByZXN1bHQueSA9IHNuYXBwZWQ7XG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcmVuZGVyR3VpZGVzKGd1aWRlcyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQWxpZ25tZW50IGNhbmRpZGF0ZXM6IHRoZSBwYWdlJ3MgZWRnZXMgKyBjZW50ZXIsIHRoZSBoZWFkZXIvZm9vdGVyIGJhbmRcbiAgLy8gbGluZXMsIGFuZCBldmVyeSBzaWJsaW5nJ3MgZWRnZXMgKyBjZW50ZXJzIOKAlCBzaWJsaW5ncyBvbiB0aGUgU0FNRSBsYXllcixcbiAgLy8gc2luY2UgYSBwYWdlIGNvbXBvbmVudCBhbGlnbnMgd2l0aCB0aGUgcGFnZSBhbmQgYSBoZWFkZXIgYmxvY2sgd2l0aCB0aGVcbiAgLy8gaGVhZGVyLlxuICBwcml2YXRlIF9jYW5kaWRhdGVzKG1vdmluZzogUmVwb3J0Q29tcG9uZW50KTogeyB2ZXJ0aWNhbDogbnVtYmVyW107IGhvcml6b250YWw6IG51bWJlcltdIH0ge1xuICAgIGNvbnN0IHZlcnRpY2FsID0gWzAsIHRoaXMucmVwb3J0LnBhZ2VXaWR0aCAvIDIsIHRoaXMucmVwb3J0LnBhZ2VXaWR0aF07XG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IFswLCB0aGlzLnJlcG9ydC5wYWdlSGVpZ2h0IC8gMiwgdGhpcy5yZXBvcnQucGFnZUhlaWdodF07XG5cbiAgICBjb25zdCB7IGhlYWRlckhlaWdodCwgZm9vdGVySGVpZ2h0IH0gPSB0aGlzLmJhbmRzO1xuICAgIGlmIChoZWFkZXJIZWlnaHQpIHtcbiAgICAgIGhvcml6b250YWwucHVzaChoZWFkZXJIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoZm9vdGVySGVpZ2h0KSB7XG4gICAgICBob3Jpem9udGFsLnB1c2godGhpcy5yZXBvcnQucGFnZUhlaWdodCAtIGZvb3RlckhlaWdodCk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXN0ZXIgPSB0aGlzLl9pc01hc3RlckNvbXBvbmVudChtb3ZpbmcpO1xuICAgIGNvbnN0IHNpYmxpbmdzID0gaXNNYXN0ZXIgPyB0aGlzLm1hc3RlckNvbXBvbmVudHMoKSA6IHRoaXMuYWN0aXZlUGFnZUNvbXBvbmVudHMoKTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHNpYmxpbmdzKSB7XG4gICAgICBpZiAoY29tcG9uZW50LmlkID09PSBtb3ZpbmcuaWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZlcnRpY2FsLnB1c2goY29tcG9uZW50LngsIGNvbXBvbmVudC54ICsgY29tcG9uZW50LncgLyAyLCBjb21wb25lbnQueCArIGNvbXBvbmVudC53KTtcbiAgICAgIGhvcml6b250YWwucHVzaChjb21wb25lbnQueSwgY29tcG9uZW50LnkgKyBjb21wb25lbnQuaCAvIDIsIGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHZlcnRpY2FsLCBob3Jpem9udGFsIH07XG4gIH1cblxuICAvLyBTbmFwIG9uZSBheGlzOiBvZiB0aGUgbW92aW5nIGJveCdzIHRocmVlIGxpbmVzIChlZGdlL2NlbnRlci9lZGdlKSwgZmluZFxuICAvLyB0aGUgY2xvc2VzdCBjYW5kaWRhdGUgd2l0aGluIHRocmVzaG9sZCBhbmQgcmV0dXJuIHRoZSBhZGp1c3RlZCBiYXNlXG4gIC8vIGNvb3JkaW5hdGUgcGx1cyB0aGUgZ3VpZGUgdG8gZHJhdy5cbiAgcHJpdmF0ZSBfc25hcEF4aXMoXG4gICAgbGluZXM6IHsgb2Zmc2V0OiBudW1iZXI7IHZhbHVlOiBudW1iZXIgfVtdLFxuICAgIGNhbmRpZGF0ZXM6IG51bWJlcltdLFxuICApOiB7IGJhc2U6IG51bWJlcjsgZ3VpZGU6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgbGV0IGJlc3Q6IHsgYmFzZTogbnVtYmVyOyBndWlkZTogbnVtYmVyOyBkaXN0YW5jZTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGNhbmRpZGF0ZSAtIGxpbmUudmFsdWUpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPD0gdGhpcy5fc25hcFRocmVzaG9sZCAmJiAoIWJlc3QgfHwgZGlzdGFuY2UgPCBiZXN0LmRpc3RhbmNlKSkge1xuICAgICAgICAgIGJlc3QgPSB7IGJhc2U6IGNhbmRpZGF0ZSAtIGxpbmUub2Zmc2V0LCBndWlkZTogY2FuZGlkYXRlLCBkaXN0YW5jZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3QgPyB7IGJhc2U6IGJlc3QuYmFzZSwgZ3VpZGU6IGJlc3QuZ3VpZGUgfSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9uZWFyZXN0KHZhbHVlOiBudW1iZXIsIGNhbmRpZGF0ZXM6IG51bWJlcltdKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IGJlc3Q6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBiZXN0RGlzdGFuY2UgPSB0aGlzLl9zbmFwVGhyZXNob2xkO1xuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhjYW5kaWRhdGUgLSB2YWx1ZSk7XG4gICAgICBpZiAoZGlzdGFuY2UgPD0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7XG4gICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiZXN0O1xuICB9XG5cbiAgLy8gVGhlIGd1aWRlcyBvdmVybGF5IGlzIGRyYXduIGltcGVyYXRpdmVseSDigJQgdGhlIGRyYWcgbG9vcCBydW5zIG91dHNpZGVcbiAgLy8gQW5ndWxhciBhbmQgcmVwYWludHMgb24gZXZlcnkgcG9pbnRlcm1vdmUuXG4gIHByaXZhdGUgX3JlbmRlckd1aWRlcyhndWlkZXM6IEd1aWRlTGluZVtdKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuX2d1aWRlcz8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBob3N0LnJlcGxhY2VDaGlsZHJlbiguLi5ndWlkZXMubWFwKChndWlkZSkgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGluZS5jbGFzc05hbWUgPSBgZ3VpZGUgZ3VpZGUtJHtndWlkZS5vcmllbnRhdGlvbn1gO1xuICAgICAgaWYgKGd1aWRlLm9yaWVudGF0aW9uID09PSAndicpIHtcbiAgICAgICAgbGluZS5zdHlsZS5sZWZ0ID0gYCR7Z3VpZGUucG9zaXRpb24gKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lLnN0eWxlLnRvcCA9IGAke2d1aWRlLnBvc2l0aW9uICogUFhfUEVSX0lOQ0h9cHhgO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckd1aWRlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9ndWlkZXM/Lm5hdGl2ZUVsZW1lbnQ/LnJlcGxhY2VDaGlsZHJlbigpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzXCI+XG4gIDxkaXZcbiAgICAjdmlld3BvcnRcbiAgICBjbGFzcz1cInBhZ2Utdmlld3BvcnRcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNhbnZhc1BvaW50ZXJEb3duKClcIj5cbiAgICA8ZnMtem9vbS1wYW5cbiAgICAgIHdoZWVsPVwibW9kaWZpZXJcIlxuICAgICAgW3pvb21NaW5dPVwiMC4xXCJcbiAgICAgIFt6b29tTWF4XT1cIjNcIlxuICAgICAgKHpvb21lZCk9XCJvblpvb21lZCgkZXZlbnQpXCI+XG4gICAgICBAaWYgKGFjdGl2ZVBhZ2UpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwicGFnZVwiXG4gICAgICAgICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgICAgICAgIFtjbGFzcy5tYXN0ZXItZWRpdGluZ109XCJpc01hc3RlckVkaXRpbmdcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJyZXBvcnQucGFnZVdpZHRoICogUFhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicmVwb3J0LnBhZ2VIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgW3N0eWxlLi0tY2FudmFzLXpvb21dPVwiem9vbSgpXCJcbiAgICAgICAgICBbc3R5bGUuLS1yZXBvcnQtaGVhZGluZy1zaXplLnB4XT1cImhlYWRpbmdTaXplUHhcIj5cbiAgICAgICAgICA8IS0tIFRoZSBoZWFkZXIgYW5kIGZvb3RlcjogdGhlIG1hc3RlcidzIGNvbXBvbmVudHMsIGRyYXduIHVuZGVyIHRoZVxuICAgICAgICAgICAgICAgcGFnZSdzIG93bi4gLS0+XG4gICAgICAgICAgQGlmIChpc01hc3RlclNob3duICYmIG1hc3RlckNvbXBvbmVudHMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXN0ZXItbGF5ZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuZWRpdGFibGVdPVwiaXNNYXN0ZXJFZGl0aW5nXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBtYXN0ZXJDb21wb25lbnRzKCk7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydC5pZFwiXG4gICAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiaXNNYXN0ZXJFZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgIFt6b29tXT1cInpvb20oKVwiXG4gICAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgIFt0b2tlbnNdPVwibWFzdGVyVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlS2V5c0Vsc2V3aGVyZV09XCJ2YWx1ZUtleXNFbHNld2hlcmVcIlxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImNvbXBvbmVudC5pZCA9PT0gc2VsZWN0ZWRDb21wb25lbnRJZCgpXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbXBvbmVudC54ICogUFhcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJjb21wb25lbnQueSAqIFBYXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb21wb25lbnQudyAqIFBYXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY29tcG9uZW50LmF1dG9IZWlnaHQgPyBudWxsIDogY29tcG9uZW50LmggKiBQWFwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0Q29tcG9uZW50KT1cInNlbGVjdENvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJvbkNvbXBvbmVudFJlbW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAob3BlblNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVTZXR0aW5ncyk9XCJvcGVuVmFsdWVTZXR0aW5ncyhjb21wb25lbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHRleHRTYXZlZCk9XCJvblRleHRTYXZlZChjb21wb25lbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlc1JlbW92ZWQpPVwicmVwb3J0Q2hhbmdlZC5lbWl0KClcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcywgYXMgZ3VpZGVzIHdoaWxlIGVkaXRpbmcuIFdoaWxlIHRoZVxuICAgICAgICAgICAgICAgaGVhZGVyIGFuZCBmb290ZXIgYXJlIGVkaXRlZCwgYW4gZW1wdHkgYmFuZCBzYXlzIGhvdyB0byBmaWxsIGl0XG4gICAgICAgICAgICAgICBhbmQgYSBkb3VibGUtY2xpY2sgYWRkcyBhIHRleHQgYmxvY2sgdGhlcmUuIC0tPlxuICAgICAgICAgIEBpZiAoZWRpdE1vZGUpIHtcbiAgICAgICAgICAgIEBpZiAoYmFuZHMuaGVhZGVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJhbmQgYmFuZC1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hZGRhYmxlXT1cImlzTWFzdGVyRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJiYW5kcy5oZWFkZXJIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cImFkZFRleHRJbkJhbmQoJ2hlYWRlcicsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGlzTWFzdGVyRWRpdGluZykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWxhYmVsIHNtYWxsXCI+SGVhZGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChpc0JhbmRFbXB0eSgnaGVhZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWhpbnQgc21hbGxcIj5Eb3VibGUtY2xpY2sgdG8gYWRkIHRleHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoYmFuZHMuZm9vdGVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJhbmQgYmFuZC1mb290ZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hZGRhYmxlXT1cImlzTWFzdGVyRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJiYW5kcy5mb290ZXJIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cImFkZFRleHRJbkJhbmQoJ2Zvb3RlcicsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGlzTWFzdGVyRWRpdGluZykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWxhYmVsIHNtYWxsXCI+Rm9vdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChpc0JhbmRFbXB0eSgnZm9vdGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWhpbnQgc21hbGxcIj5Eb3VibGUtY2xpY2sgdG8gYWRkIHRleHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2YgYWN0aXZlUGFnZUNvbXBvbmVudHMoKTsgdHJhY2sgY29tcG9uZW50LmlkKSB7XG4gICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydC5pZFwiXG4gICAgICAgICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cHNcIlxuICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiaXNQYWdlRWRpdGluZ1wiXG4gICAgICAgICAgICAgIFt6b29tXT1cInpvb20oKVwiXG4gICAgICAgICAgICAgIFtzbmFwcGVyXT1cInNuYXBwZXJcIlxuICAgICAgICAgICAgICBbdG9rZW5zXT1cInBhZ2VUb2tlbnMoKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZUtleXNFbHNld2hlcmVdPVwidmFsdWVLZXlzRWxzZXdoZXJlXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImNvbXBvbmVudC5pZCA9PT0gc2VsZWN0ZWRDb21wb25lbnRJZCgpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29tcG9uZW50LnggKiBQWFwiXG4gICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiY29tcG9uZW50LnkgKiBQWFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb21wb25lbnQudyAqIFBYXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb21wb25lbnQuYXV0b0hlaWdodCA/IG51bGwgOiBjb21wb25lbnQuaCAqIFBYXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENvbXBvbmVudCk9XCJzZWxlY3RDb21wb25lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChyZW1vdmVkKT1cIm9uQ29tcG9uZW50UmVtb3ZlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVTZXR0aW5ncyk9XCJvcGVuVmFsdWVTZXR0aW5ncyhjb21wb25lbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAodGV4dFNhdmVkKT1cIm9uVGV4dFNhdmVkKGNvbXBvbmVudCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh2YWx1ZXNSZW1vdmVkKT1cInJlcG9ydENoYW5nZWQuZW1pdCgpXCI+XG4gICAgICAgICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNndWlkZXNcbiAgICAgICAgICAgIGNsYXNzPVwiZ3VpZGVzXCI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKCFhY3RpdmVQYWdlQ29tcG9uZW50cygpLmxlbmd0aCAmJiAhbWFzdGVyTW9kZSgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1lbXB0eVwiPlxuICAgICAgICAgICAgICBBc2sgdGhlIGFzc2lzdGFudCB0byBhZGQgYSBjaGFydCwgbGlzdCBvciBLUEkgdG8gdGhpcyBwYWdlLlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2ZzLXpvb20tcGFuPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY2FudmFzLXRvb2xiYXJcIj5cbiAgICA8IS0tIFRhYnMgYXJlIG9uZSBob3Jpem9udGFsIGRyb3AgbGlzdDogZHJhZ2dpbmcgYSBjaGlwIHJlb3JkZXJzIHRoZSBwYWdlcy5cbiAgICAgICAgIFRoZSBkcm9wIElOREVYIGlzIGNvbXB1dGVkIGFsb25nIFggKG9yaWVudGF0aW9uKSwgYnV0IHRoZSBwcmV2aWV3IGlzXG4gICAgICAgICBkZWxpYmVyYXRlbHkgbGVmdCB1bmJvdW5kZWQgb24gYm90aCBheGVzIOKAlCBwaW5uaW5nIGl0IHRvIHRoZSByb3cgd2l0aFxuICAgICAgICAgY2RrRHJhZ0JvdW5kYXJ5IG1lYW5zIHRoZSBjaGlwIHlvdSBhcmUgZHJhZ2dpbmcgY292ZXJzIHRoZSBjaGlwcyB5b3VcbiAgICAgICAgIGFyZSBkcmFnZ2luZyBpdCBwYXN0LCBhbmQgeW91IGNhbm5vdCBzZWUgd2hlcmUgaXQgaXMgZ29pbmcgdG8gbGFuZC5cbiAgICAgICAgIEV2ZXJ5IHBhZ2UgZ2V0cyBhIGNoaXAsIGluY2x1ZGluZyBhIGxvbmUgb25lOiB0aGUgY2hpcCBpcyB3aGF0IHRlbGxzXG4gICAgICAgICB5b3Ugd2hpY2ggcGFnZSB5b3UgYXJlIG9uLCBhbmQgYSByZXBvcnQgdGhhdCBoaWQgaXQgbGVmdCB5b3UgdW5hYmxlIHRvXG4gICAgICAgICB0ZWxsIHBhZ2UgMSBvZiAxIGZyb20gYSBwYWdlIHRoYXQgZmFpbGVkIHRvIGxvYWQuIERlbGV0aW5nIHRoZSBsYXN0XG4gICAgICAgICBwYWdlIGlzIHJlZnVzZWQgc2VydmVyLXNpZGUsIHNvIHRoZSBrZWJhYiBpcyBzYWZlIHRvIGV4cG9zZSBoZXJlLiAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInBhZ2UtdGFic1wiXG4gICAgICBjZGtEcm9wTGlzdFxuICAgICAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxuICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvblBhZ2VEcm9wcGVkKCRldmVudClcIj5cbiAgICAgIEBmb3IgKHBhZ2Ugb2YgcGFnZXMoKTsgdHJhY2sgcGFnZS5pZDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgIDwhLS0gVGhlIGNoaXAgaXMgdGhlIGRyYWcgaGFuZGxlIEFORCB0aGUgdGFiOiBjbGlja2luZyBzZWxlY3RzLFxuICAgICAgICAgICAgIGRyYWdnaW5nIHJlb3JkZXJzLiBUaGUga2ViYWIgbGl2ZXMgaW5zaWRlIGl0LCBzbyB0aGUgd2hvbGVcbiAgICAgICAgICAgICBjb250cm9sIHN0YXlzIG9uZSBjaGlwIGluc3RlYWQgb2YgZ3Jvd2luZyBhIHNlY29uZCBidXR0b24uIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIGNsYXNzPVwicGFnZS10YWJcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaW5kZXggPT09IGFjdGl2ZVBhZ2VJbmRleCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZShpbmRleClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2UtdGFiLWxhYmVsXCI+e3sgcGFnZUxhYmVsKHBhZ2UsIGluZGV4KSB9fTwvc3Bhbj5cbiAgICAgICAgICA8IS0tIFRoZSBrZWJhYiBvcGVucyB0aGUgbWVudSByYXRoZXIgdGhhbiBzdGFydGluZyBhIGRyYWcgb3JcbiAgICAgICAgICAgICAgIHN3aXRjaGluZyBwYWdlcywgc28gaXQgc3dhbGxvd3MgaXRzIG93biBjbGljay4gLS0+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS10YWItbWVudVwiXG4gICAgICAgICAgICBbZnNNZW51VHJpZ2dlckZvcl09XCJwYWdlTWVudVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIE91dHNpZGUgdGhlIGNoaXA6IGNka0RyYWcgY2xvbmVzIGl0cyBob3N0IGludG8gdGhlIGRyYWcgcHJldmlldyxcbiAgICAgICAgICAgICBhbmQgYSBtZW51IG92ZXJsYXkgYW5jaG9yZWQgdG8gYSBjbG9uZWQgdHJpZ2dlciBvcGVucyBkZXRhY2hlZFxuICAgICAgICAgICAgIGZyb20gdGhlIHJlYWwgdGFiLiAtLT5cbiAgICAgICAgPGZzLW1lbnUgI3BhZ2VNZW51PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwicmVuYW1lUGFnZShwYWdlKVwiPlxuICAgICAgICAgICAgRWRpdCBuYW1lXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3RlckhpZGRlbihwYWdlKVwiPlxuICAgICAgICAgICAge3sgcGFnZS5tYXN0ZXJIaWRkZW4gPyAnU2hvdyBoZWFkZXIgJiBmb290ZXInIDogJ0hpZGUgaGVhZGVyICYgZm9vdGVyJyB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVQYWdlKHBhZ2UpXCI+XG4gICAgICAgICAgICBEZWxldGVcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2ZzLW1lbnU+XG4gICAgICB9XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInBhZ2UtdGFiIGFkZC1wYWdlXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBwYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZFBhZ2UoKVwiPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgUGFnZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiem9vbS1jb250cm9sc1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvblwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJab29tIG91dCAoQ3RybC9DbWQgKyBzY3JvbGwpXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21PdXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ6b29tLWxhYmVsXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIlpvb20gdG8gMTAwJVwiXG4gICAgICAgIChjbGljayk9XCJ6b29tQWN0dWFsKClcIj5cbiAgICAgICAge3sgKHpvb20oKSAqIDEwMCkudG9GaXhlZCgwKSB9fSVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvblwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJab29tIGluIChDdHJsL0NtZCArIHNjcm9sbClcIlxuICAgICAgICAoY2xpY2spPVwiem9vbUluKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiem9vbS1idXR0b25cIlxuICAgICAgICBtYXRUb29sdGlwPVwiRml0IHBhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiem9vbUZpdCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5maXRfc2NyZWVuPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
979
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUM3RCxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUNyRixRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FDekMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTlFLE9BQU8sRUFBZSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0UsT0FBTyxFQUNPLE9BQU8sRUFBRSxVQUFVLEVB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LE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLGNBQWM7d0JBQ2QsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixlQUFlO3dCQUNmLHdCQUF3QjtxQkFDekI7d0RBSWUsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQU1VLE1BQU07c0JBQXJCLEtBQUs7Z0JBSVUsSUFBSTtzQkFBbkIsS0FBSztnQkFJVyxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBSVUsYUFBYTtzQkFBN0IsTUFBTTtnQkFJVSxXQUFXO3NCQUEzQixNQUFNO2dCQUlVLE9BQU87c0JBQXZCLE1BQU07Z0JBR0EsT0FBTztzQkFEYixTQUFTO3VCQUFDLGtCQUFrQjtnQkFNckIsbUJBQW1CO3NCQUQxQixZQUFZO3VCQUFDLHdCQUF3QjtnQkFJOUIsU0FBUztzQkFEaEIsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkvQixPQUFPO3NCQURkLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBRdWVyeUxpc3QsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLFxuICBXcml0YWJsZVNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgRHJhZ0Ryb3BNb2R1bGUsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEZzTWVudU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lbnUnO1xuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5pbXBvcnQgeyBGc1pvb21QYW5Db21wb25lbnQsIEZzWm9vbVBhbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3pvb20tcGFuJztcblxuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIGFzIHJ4RmlsdGVyLCBmcm9tLCBtYXAsIG1lcmdlLCBtZXJnZU1hcCxcbiAgb2YsIHN3aXRjaE1hcCwgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgY2FudmFzTGFuZGluZ1BhZ2UgfSBmcm9tICcuLi8uLi9jYW52YXMtbGFuZGluZy1wYWdlJztcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IHZhbHVlUGlja3MgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWZpbHRlci1saW5lcyc7XG5pbXBvcnQgeyBsYXllckZpbHRlckdyb3Vwcywgc2FtZUZpbHRlckZpZWxkcywgdGV4dEZpbHRlckZpZWxkcyB9IGZyb20gJy4uLy4uL2ZpbHRlci10ZXh0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudFNldHRpbmdzLCBSZXBvcnQsIFJlcG9ydENvbXBvbmVudCwgUmVwb3J0RmlsdGVyR3JvdXAsIFJlcG9ydEhlYWRlckZvb3RlciwgUmVwb3J0TWFzdGVyLCBSZXBvcnRQYWdlLFxuICBSZXBvcnRQYWdlVmFsdWUsIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBERUZBVUxUX0hFQURJTkdfU0laRSB9IGZyb20gJy4uLy4uL2xheW91dCc7XG5pbXBvcnQgeyBncm91cE9wdGlvbnNSZWFkZXIsIHBpY2tlZE9wdGlvbk5hbWVzIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUZXh0RmlsdGVyRmllbGQsIFRleHRUb2tlbkNvbnRleHQgfSBmcm9tICcuLi8uLi90ZXh0JztcbmltcG9ydCB7IHZhbHVlc01hdGNoQW55R3JvdXBJZHMgfSBmcm9tICcuLi8uLi90aWxlLWRhdGEtc3RhdGUnO1xuaW1wb3J0IHtcbiAgaXNEcmF3biwgbGF5ZXJWYWx1ZUtleXMsIHNhbWVUZXh0VmFsdWVzLCBzaG93blZhbHVlcywgdGV4dFZhbHVlcywgdmFsdWVLZXksIHZhbHVlS2V5cyxcbn0gZnJvbSAnLi4vLi4vdmFsdWVzJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudENvbXBvbmVudCB9IGZyb20gJy4uL3JlcG9ydC1jb21wb25lbnQvcmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQnO1xuXG5cbi8vIFNjcmVlbiBkZW5zaXR5IG9mIHRoZSBjYW52YXM6IDk2IENTUyBweCBwZXIgaW5jaCAodGhlIENTUyByZWZlcmVuY2UgcGl4ZWwpLFxuLy8gYmVmb3JlIHpvb20uIEFsbCBnZW9tZXRyeSBzdGF5cyBpbiBpbmNoZXM7IG9ubHkgcmVuZGVyaW5nIG11bHRpcGxpZXMgYnkgaXQuXG5leHBvcnQgY29uc3QgUFhfUEVSX0lOQ0ggPSA5NjtcblxuLy8gT25lIHNtYXJ0IGd1aWRlIGxpbmUsIGluIHBhZ2UgaW5jaGVzLlxuZXhwb3J0IGludGVyZmFjZSBHdWlkZUxpbmUge1xuICBvcmllbnRhdGlvbjogJ3YnIHwgJ2gnO1xuICBwb3NpdGlvbjogbnVtYmVyO1xufVxuXG4vLyBUaGUgc25hcHBpbmcgY29udHJhY3QgaGFuZGVkIHRvIGVhY2ggY29tcG9uZW50J3MgZHJhZyBsb29wLiBJbXBsZW1lbnRlZCBieVxuLy8gdGhlIGNhbnZhcyBiZWNhdXNlIG9ubHkgaXQgc2VlcyBldmVyeSBjb21wb25lbnQgKGFsaWdubWVudCBjYW5kaWRhdGVzKSBhbmRcbi8vIG93bnMgdGhlIGd1aWRlcyBvdmVybGF5LlxuZXhwb3J0IGludGVyZmFjZSBDYW52YXNTbmFwcGVyIHtcbiAgc25hcE1vdmUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHg6IG51bWJlciwgeTogbnVtYmVyKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBzbmFwUmVzaXplKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBnZW9tZXRyeTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSwgaGFuZGxlOiBzdHJpbmcpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9O1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG4vLyBPbmUgbGF5ZXIncyB2YWx1ZXMgcmVxdWVzdCAoYSBwYWdlLCBvciB0aGUgbWFzdGVyKSwgcmVhZCB3aGVuIGl0IGlzIHNlbnQ6XG4vLyB0aGUgbGF5ZXIsIHRoZSB2YWx1ZXMgaXRzIHRleHQgc2hvd3MgYXQgdGhhdCBtb21lbnQgKHdoYXQgcmVhZHMgYXMgbG9hZGluZ1xuLy8gdW50aWwgaXQgbGFuZHMpIGFuZCB0aGUgZmlsdGVyIHZhbHVlcyBvZiBldmVyeSB2YWx1ZSBvbiB0aGUgbGF5ZXIuXG5pbnRlcmZhY2UgTGF5ZXJWYWx1ZXNSZXF1ZXN0IHtcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsO1xuICBzaG93bjogUmVwb3J0Q29tcG9uZW50W107XG4gIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXTtcbiAgLy8gV2hpbGUgdGhlIGdyb3VwcyBtYXRjaCAnYW55JywgdGhlIGdyb3VwcyB0aGF0IGNvbWJpbmVcbiAgLy8gKHZhbHVlc01hdGNoQW55R3JvdXBJZHMpOyBlbXB0eSBvdGhlcndpc2UuXG4gIG1hdGNoQW55R3JvdXBJZHM6IG51bWJlcltdO1xuICAvLyBFdmVyeXRoaW5nIHRoZSBsYXllcidzIG51bWJlcnMgZGVwZW5kIG9uOiB0aGUgcmVxdWVzdCwgYW5kIGhvdyBlYWNoIHZhbHVlXG4gIC8vIGl0IHJlYWRzIGlzIGRlZmluZWQuIEEgcmVsb2FkIG9mIHRoZSByZXBvcnQgdGhhdCBsZWF2ZXMgaXQgYXMgaXQgd2FzIGFza3NcbiAgLy8gZm9yIG5vdGhpbmcuXG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG4vLyBPbmUgbGF5ZXIncyBudW1iZXJzIGFzIHRoZXkgbGFzdCBhcnJpdmVkLCBieSB2YWx1ZSBpZCwgYW5kIHRoZSByZXF1ZXN0IHRoZXlcbi8vIGFuc3dlciDigJQgcmVzdWx0cyBmb3IgYW5vdGhlciBwYWdlIGFyZSBub3QgdGhpcyBwYWdlJ3MuXG5pbnRlcmZhY2UgTGF5ZXJWYWx1ZXMge1xuICBwYWdlSWQ6IG51bWJlciB8IG51bGw7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xuICByb3dzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydFBhZ2VWYWx1ZT47XG59XG5cbi8vIEEgbGF5ZXIgd2hvc2UgdmFsdWVzIHRoZSBjYW52YXMgcmVhZHM6IHRoZSBhY3RpdmUgcGFnZSwgb3IgdGhlIG1hc3Rlci5cbmludGVyZmFjZSBWYWx1ZUxheWVyIHtcbiAgLy8gVGhlIGxheWVyIGFzIGl0IHN0YW5kcywgb3IgbnVsbCB3aGVuIG5vbmUgb2YgaXRzIG51bWJlcnMgYXJlIG5lZWRlZC5cbiAgc291cmNlOiAoKSA9PiBSZXBvcnRQYWdlIHwgUmVwb3J0TWFzdGVyIHwgbnVsbDtcbiAgLy8gQXNrcyBmb3IgaXRzIG51bWJlcnMgYWdhaW4uXG4gIHJlbG9hZCQ6IFN1YmplY3Q8dm9pZD47XG4gIC8vIEl0cyBudW1iZXJzIGFzIHRoZXkgbGFzdCBhcnJpdmVkLlxuICByZXN1bHRzOiBXcml0YWJsZVNpZ25hbDxMYXllclZhbHVlcyB8IG51bGw+O1xuICAvLyBUaGUgcmVxdWVzdCBvbiBpdHMgd2F5LCBudWxsIG9uY2UgaXQgaGFzIGxhbmRlZC4gQSB2YWx1ZSBpdCBhc2tzIGZvclxuICAvLyByZWFkcyBhcyBsb2FkaW5nIHVudGlsIHRoZW4sIHNvIGEgbnVtYmVyIG9uIHNjcmVlbiBpcyBuZXZlciBvbmUgcmVhZCBmb3JcbiAgLy8gYW4gZWFybGllciByZXF1ZXN0IChhbm90aGVyIGZpbHRlciwgdGhlIHZhbHVlIGFzIGl0IHdhcykuXG4gIHBlbmRpbmc6IFdyaXRhYmxlU2lnbmFsPExheWVyVmFsdWVzUmVxdWVzdCB8IG51bGw+O1xufVxuXG4vLyBBIHNlbGVjdCBncm91cCB3aXRoIG9wdGlvbnMgcGlja2VkIHdob3NlIG5hbWVzIGEgZmlsdGVyIHRva2VuIHJlYWRzLFxuLy8ga2V5ZWQgYnkgdGhlIGdyb3VwIGFuZCB0aGUgcGlja2VkIGlkcyAob3B0aW9uTmFtZXNLZXkpLlxuaW50ZXJmYWNlIE9wdGlvblBpY2sge1xuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXA7XG4gIHJlcG9ydElkOiBudW1iZXI7XG4gIHZhbHVlczogdW5rbm93bltdO1xuICBrZXk6IHN0cmluZztcbn1cblxuLy8gV2hldGhlciB0d28gdG9rZW4gY29udGV4dHMgZmlsbCBldmVyeSB0b2tlbiB0aGUgc2FtZSwgc28gcmVjb21wdXRpbmcgb25lXG4vLyB0aGF0IGNoYW5nZWQgbm90aGluZyBhIHRva2VuIHNob3dzIGhhbmRzIGJhY2sgdGhlIG9iamVjdCB0aGUgYmxvY2tzIGhhdmUuXG5mdW5jdGlvbiBzYW1lVG9rZW5zKGE6IFRleHRUb2tlbkNvbnRleHQsIGI6IFRleHRUb2tlbkNvbnRleHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEucGFnZU51bWJlciA9PT0gYi5wYWdlTnVtYmVyXG4gICAgJiYgYS5wYWdlTmFtZSA9PT0gYi5wYWdlTmFtZVxuICAgICYmIGEucmVwb3J0TmFtZSA9PT0gYi5yZXBvcnROYW1lXG4gICAgJiYgYS52YWx1ZVBhZ2VJZCA9PT0gYi52YWx1ZVBhZ2VJZFxuICAgICYmIHNhbWVUZXh0VmFsdWVzKGEudmFsdWVzLCBiLnZhbHVlcylcbiAgICAmJiBzYW1lRmlsdGVyRmllbGRzKGEuZmlsdGVycywgYi5maWx0ZXJzKTtcbn1cblxuLy8gT25lIG9mIHRoZSB0d28gYmFuZHMgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGFyZSBkcmF3biBpbi5cbnR5cGUgQmFuZCA9ICdoZWFkZXInIHwgJ2Zvb3Rlcic7XG5cbi8vIFdoYXQgdGhlIG5hbWVzIG9mIGEgc2VsZWN0IGdyb3VwJ3MgcGlja2VkIG9wdGlvbnMgYXJlIGtlcHQgdW5kZXIuXG5mdW5jdGlvbiBvcHRpb25OYW1lc0tleShncm91cElkOiBudW1iZXIsIHZhbHVlczogdW5rbm93bltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtncm91cElkLCB2YWx1ZXMubWFwKFN0cmluZyldKTtcbn1cblxuLy8gVGhlIGZpeGVkLXNpemUgcGFnZSBjYW52YXMg4oCUIHRoZSBQb3dlclBvaW50IG1vZGVsLiBQYWdlcyBhcmUgdGFicyAob25seSB0aGVcbi8vIEFDVElWRSBwYWdlJ3MgY29tcG9uZW50cyBleGlzdCDihpIgb25seSB0aGV5IGZldGNoKTsgdGhlIHBhZ2UgaXMgYVxuLy8gcGFnZVdpZHRow5dwYWdlSGVpZ2h0IElOQ0hFUyBzaGVldCByZW5kZXJlZCBhdCA5NnB4L2luIGluc2lkZSBmcy16b29tLXBhblxuLy8gKEN0cmwvQ21kICsgd2hlZWwgb3IgcGluY2ggdG8gem9vbSwgYmFja2dyb3VuZCBkcmFnIHBhbiwgdG9vbGJhciBidXR0b25zOyBhXG4vLyBwbGFpbiB3aGVlbCBzY3JvbGxzIHRoZSBsaXN0IHVuZGVyIHRoZSBwb2ludGVyKS5cbi8vXG4vLyBDb21wb25lbnRzIGFyZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQ7IGRyYWdnaW5nIGdldHMgc21hcnQgYWxpZ25tZW50IGd1aWRlc1xuLy8gKGVkZ2VzICsgY2VudGVycyBvZiBzaWJsaW5ncyBhbmQgdGhlIHBhZ2UpIHdpdGggc25hcHBpbmcuXG4vL1xuLy8gSGVhZGVyIGFuZCBmb290ZXI6IHRoZSByZXBvcnQncyBtYXN0ZXIgY29tcG9uZW50cyAocmVwb3J0Lm1hc3RlcikgYXJlIGRyYXduXG4vLyBvbiBhIGxheWVyIFVOREVSIGV2ZXJ5IHBhZ2UncyBvd24gY29tcG9uZW50cywgbGlrZSBhIFBvd2VyUG9pbnQgc2xpZGUgbWFzdGVyLFxuLy8gdW5sZXNzIHRoZSBwYWdlIGhpZGVzIHRoZW0uIEluIGVkaXQgbW9kZSB0aGUgaG9zdCB0b29sYmFyJ3MgXCJIZWFkZXIgJiBmb290ZXJcIlxuLy8gKHRvZ2dsZU1hc3Rlck1vZGUpIHN3aXRjaGVzIHdoaWNoIGxheWVyIGlzIGxpdmU6IHRoZSBwYWdlJ3MgY29tcG9uZW50cyBkaW1cbi8vIGFuZCB0aGUgbWFzdGVyJ3MgYmVjb21lIHRoZSBvbmVzIHRoYXQgZHJhZywgcmVzaXplIGFuZCBzbmFwLiBUaGUgaGVhZGVyL2Zvb3RlciBiYW5kcyAoY29uZmlnLmhlYWRlckZvb3Rlcilcbi8vIGFyZSBkcmF3biBhcyBndWlkZXMgd2hpbGUgZWRpdGluZyBhbmQgYXJlIHNuYXAgbGluZXMgZm9yIGJvdGggbGF5ZXJzLiBXaGlsZVxuLy8gdGhlIGhlYWRlciBhbmQgZm9vdGVyIGFyZSBlZGl0ZWQsIGFuIGVtcHR5IGJhbmQgc2F5cyBob3cgdG8gZmlsbCBpdCwgYW5kXG4vLyBkb3VibGUtY2xpY2tpbmcgYSBiYW5kIGFkZHMgYSB0ZXh0IGJsb2NrIHRoZXJlIHdpdGggaXRzIGVkaXRvciBvcGVuLlxuLy9cbi8vIExpdmUgdmFsdWVzOiBhIHRleHQgYmxvY2sgc2hvd3MgbnVtYmVycyBpbmxpbmUgKHt7dmFsdWUua2V5fX0pLiBBIHZhbHVlIGlzXG4vLyBuZXZlciBkcmF3bjsgaXQgYmVsb25ncyB0byB0aGUgcGFnZSB3aG9zZSB0ZXh0IHNob3dzIGl0ICh0aGUgbWFzdGVyIGZvciBhXG4vLyBoZWFkZXIgb3IgZm9vdGVyKSBhbmQgaXMgbGlzdGVkIGluIHRoYXQgbGF5ZXIncyBgdmFsdWVzYC4gVGhlIGNhbnZhcyByZWFkc1xuLy8gdGhlIG51bWJlcnMgb25lIHJlcXVlc3QgcGVyIGxheWVyIOKAlCB0aGUgYWN0aXZlIHBhZ2UncyBhbmQgdGhlIG1hc3RlcidzIOKAlFxuLy8gYW5kIGhhbmRzIHRoZW0gdG8gZXZlcnkgYmxvY2sgb2YgdGhlIGxheWVyIHdpdGggdGhlIHBhZ2UgdG9rZW5zLiBXaGljaFxuLy8gdmFsdWVzIGEgcmVxdWVzdCByZWFkcyBpcyB0aGUgc2VydmVyJ3MgY2FsbCBhbG9uZTogdGhlIG9uZXMgdGhlIHRleHQgc2hvd3MsXG4vLyBhbmQgdGhlIG9wZXJhbmRzIG9mIHRoZSBmb3JtdWxhcyBhbW9uZyB0aGVtLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jYW52YXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LWNhbnZhcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcG9ydC1jYW52YXMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBEcmFnRHJvcE1vZHVsZSxcbiAgICBNYXRJY29uLFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lcixcbiAgICBNYXRUb29sdGlwLFxuICAgIEZzTWVudU1vZHVsZSxcbiAgICBGc1pvb21QYW5Nb2R1bGUsXG4gICAgUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyByZXBvcnQ6IFJlcG9ydDtcbiAgQElucHV0KCkgcHVibGljIGVkaXRNb2RlID0gZmFsc2U7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGhvc3Qgd2FudHMgb24gc2NyZWVuLCBieSBwYWdlIGlkIChhID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZFxuICAvLyB3aXRoLCBvciBhbiBvcGVuZWQgdmlldydzIHBhZ2UpLiBLZXllZCBvbiBpZCByYXRoZXIgdGhhbiBpbmRleCBzbyBpdFxuICAvLyBzdXJ2aXZlcyBwYWdlcyBiZWluZyByZW9yZGVyZWQgb3IgZGVsZXRlZDsgYW4gaWQgdGhhdCBubyBsb25nZXIgcmVzb2x2ZXNcbiAgLy8gZmFsbHMgYmFjayB0byB0aGUgZmlyc3QgcGFnZS5cbiAgQElucHV0KCkgcHVibGljIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIGhvc3QgaXMgcmVsb2FkaW5nIHRoZSByZXBvcnQgYSBSZWZyZXNoIGFza2VkIGZvcjogdGhlIGJ1dHRvbiBzaG93cyBhXG4gIC8vIHNwaW5uZXIgYW5kIHRha2VzIG5vIHNlY29uZCBwcmVzcyB1bnRpbCBpdCBsYW5kcy5cbiAgQElucHV0KCkgcHVibGljIGJ1c3kgPSBmYWxzZTtcblxuICAvLyBBIGNvbXBvbmVudCBhc2tlZCBmb3IgaXRzIHNldHRpbmdzIGRpYWxvZyDigJQgdGhlIHBhZ2UtbGV2ZWwgaG9zdCBvcGVucyBpdFxuICAvLyAoaXQgb3ducyBNYXREaWFsb2cgKyB0aGUgcG9zdC1zYXZlIHJlbG9hZCkuXG4gIEBPdXRwdXQoKSBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3MgPSBuZXcgRXZlbnRFbWl0dGVyPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICAvLyBUaGUgcmVwb3J0J3Mgc3RydWN0dXJlIGNoYW5nZWQgaGVyZSAoYSBwYWdlIHdhcyBhZGRlZCkg4oCUIHRoZSBob3N0IHJlLWZldGNoZXNcbiAgLy8gaXQgKGl0IG93bnMgdGhlIGFzc2VtYmxlZCByZXBvcnQgKyBmaWx0ZXIgc3RhdGUpLlxuICBAT3V0cHV0KCkgcHVibGljIHJlcG9ydENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gVGhlIHBhZ2Ugb24gc2NyZWVuIGNoYW5nZWQg4oCUIHRoZSBob3N0IGtlZXBzIGl0IGluIHRoZSByZXBvcnQncyBzdGF0ZS5cbiAgLy8gQ2FycmllcyB0aGUgcGFnZSBpZCwgbmV2ZXIgdGhlIGluZGV4LlxuICBAT3V0cHV0KCkgcHVibGljIHBhZ2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuXG4gIC8vIFJlZnJlc2ggd2FzIHByZXNzZWQg4oCUIHRoZSBob3N0IHJlbG9hZHMgdGhlIHJlcG9ydCAoaXQgb3ducyB0aGUgbG9hZCksIGFuZFxuICAvLyBldmVyeSB0aWxlIHJlZmV0Y2hlcyBhcyB0aGUgcmVsb2FkZWQgcmVwb3J0IHJlLWluaXRzIHRoZSBmaWx0ZXIgc3RhdGUuXG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVmcmVzaCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKEZzWm9vbVBhbkNvbXBvbmVudClcbiAgcHVibGljIHpvb21QYW46IEZzWm9vbVBhbkNvbXBvbmVudDtcblxuICAvLyBUaGUgcmVuZGVyZWQgY29tcG9uZW50cyBvZiB0aGUgYWN0aXZlIHBhZ2Ug4oCUIG9ubHkgdGhlIGNhbnZhcyBjYW4gcmVhY2ggdGhlXG4gIC8vIG9uZSBpbnN0YW5jZSBhIHNldHRpbmdzIHNhdmUgYXBwbGllcyB0by5cbiAgQFZpZXdDaGlsZHJlbihSZXBvcnRDb21wb25lbnRDb21wb25lbnQpXG4gIHByaXZhdGUgX3JlbmRlcmVkQ29tcG9uZW50czogUXVlcnlMaXN0PFJlcG9ydENvbXBvbmVudENvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZCgndmlld3BvcnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF92aWV3cG9ydDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnZ3VpZGVzJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2d1aWRlczogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgcHVibGljIHJlYWRvbmx5IFBYID0gUFhfUEVSX0lOQ0g7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIHBhZ2VzIGFzIHRoZSBjYW52YXMgZHJhd3MgdGhlbS4gVGhpcyBpcyB0aGUgaG9zdCdzIG93blxuICAvLyBgcmVwb3J0LnBhZ2VzYCBhcnJheSwgcGF0Y2hlZCBpbiBwbGFjZSAoYSByZW5hbWUsIGEgZGVsZXRlLCBhIHJlb3JkZXIpIHNvXG4gIC8vIHRoZSBob3N0J3MgZXhwb3J0cyBzZWUgdGhlIGNoYW5nZSB0b28uIEJlY2F1c2UgdGhlIGFycmF5XG4gIC8vIGFuZCBpdHMgcGFnZXMga2VlcCB0aGVpciBpZGVudGl0eSBhY3Jvc3MgYSBwYXRjaCwgdGhlIHNpZ25hbCBub3RpZmllcyBvblxuICAvLyBldmVyeSBzZXQgcmF0aGVyIHRoYW4gb25seSB3aGVuIHRoZSByZWZlcmVuY2UgY2hhbmdlcy5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VzID0gc2lnbmFsPFJlcG9ydFBhZ2VbXT4oW10sIHsgZXF1YWw6ICgpID0+IGZhbHNlIH0pO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlUGFnZUluZGV4ID0gc2lnbmFsKDApO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlUGFnZUlkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYWdlcygpW3RoaXMuYWN0aXZlUGFnZUluZGV4KCldPy5pZCA/PyBudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHpvb20gPSBzaWduYWwoMSk7XG5cbiAgLy8gRWRpdGluZyB0aGUgaGVhZGVyIGFuZCBmb290ZXIgKHRoZSBtYXN0ZXIgbGF5ZXIpIHJhdGhlciB0aGFuIHRoZSBwYWdlLlxuICBwdWJsaWMgcmVhZG9ubHkgbWFzdGVyTW9kZSA9IHNpZ25hbChmYWxzZSk7XG4gIHB1YmxpYyBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZENvbXBvbmVudElkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuICAvLyBUaGUgY29tcG9uZW50cyBlYWNoIGxheWVyIGRyYXdzLiBBIHZhbHVlIG9ubHkgcmVhZHMgaW5zaWRlIHRleHQsIHNvIG9uZVxuICAvLyB0aGF0IGxlYWtlZCBpbnRvIGEgbGF5ZXIncyBjb21wb25lbnRzIGlzIHN0aWxsIG5ldmVyIGRyYXduLlxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlUGFnZUNvbXBvbmVudHMgPSBjb21wdXRlZChcbiAgICAoKSA9PiAodGhpcy5wYWdlcygpW3RoaXMuYWN0aXZlUGFnZUluZGV4KCldPy5jb21wb25lbnRzID8/IFtdKS5maWx0ZXIoaXNEcmF3biksXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IG1hc3RlckNvbXBvbmVudHMgPSBjb21wdXRlZChcbiAgICAoKSA9PiAodGhpcy5fcmVwb3J0KCk/Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSkuZmlsdGVyKGlzRHJhd24pLFxuICApO1xuXG4gIC8vIFdoYXQgYSB0ZXh0IGJsb2NrJ3MgdG9rZW5zIGZpbGwgd2l0aCBvbiB0aGUgcGFnZSBvbiBzY3JlZW46IHt7cGFnZS5udW1iZXJ9fSxcbiAgLy8ge3twYWdlLm5hbWV9fSBhbmQge3tyZXBvcnQubmFtZX19ICh0aGUgbWFzdGVyJ3MgZm9vdGVyIG51bWJlcnMgZWFjaCBwYWdlIGJ5XG4gIC8vIGl0cyBwb3NpdGlvbiksIHRoZSByZXBvcnQncyB7e2ZpbHRlci48aWQ+fX0gZmllbGRzLCBhbmQgdGhlIHZhbHVlcyBvZiB0aGVcbiAgLy8gYmxvY2sncyBsYXllciDigJQgdGhlIGFjdGl2ZSBwYWdlJ3MgZm9yIGEgcGFnZSBibG9jaywgdGhlIG1hc3RlcidzIGZvciBhXG4gIC8vIGhlYWRlciBvciBmb290ZXIgYmxvY2ssIHdob3NlIGlkIGlzIGFsc28gdGhlIGVkaXRvcidzIGNsaXBib2FyZCBzY29wZS5cbiAgLy8gRXZlcnkgb3RoZXIgY29tcG9uZW50IG9mIHRoZSBsYXllciBmaWxscyBpdHMgdGl0bGUncyB0b2tlbnMgd2l0aCBpdCB0b28uXG4gIC8vIFRoZSBzYW1lIG9iamVjdCBpcyBoYW5kZWQgYmFjayB1bnRpbCBzb21ldGhpbmcgYSB0b2tlbiBzaG93cyBjaGFuZ2VzOlxuICAvLyBldmVyeSBjb21wb25lbnQgdGFrZXMgaXQgYXMgYW4gaW5wdXQsIGFuZCBhIGZyZXNoIG9iamVjdCB3b3VsZCBtYWtlIGVhY2hcbiAgLy8gdGV4dCBibG9jayByZXBhaW50IGl0cyBodG1sLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZVRva2VucyA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuX3Rva2VuQ29udGV4dChcbiAgICAgIHRoaXMuX3BhZ2VWYWx1ZUNvbXBvbmVudHMoKSxcbiAgICAgIHRoaXMuX3BhZ2VWYWx1ZXMsXG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJZCgpLFxuICAgICAgdGhpcy5hY3RpdmVQYWdlSWQoKSxcbiAgICApLFxuICAgIHsgZXF1YWw6IHNhbWVUb2tlbnMgfSxcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbWFzdGVyVG9rZW5zID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5fdG9rZW5Db250ZXh0KFxuICAgICAgdGhpcy5fbWFzdGVyVmFsdWVDb21wb25lbnRzKCksXG4gICAgICB0aGlzLl9tYXN0ZXJWYWx1ZXMsXG4gICAgICB0aGlzLl9yZXBvcnQoKT8ubWFzdGVyPy5pZCA/PyBudWxsLFxuICAgICAgbnVsbCxcbiAgICApLFxuICAgIHsgZXF1YWw6IHNhbWVUb2tlbnMgfSxcbiAgKTtcblxuICAvLyBUaGUgc25hcHBlciBoYW5kZWQgdG8gZXZlcnkgY29tcG9uZW50IChzdGFibGUgaWRlbnRpdHkgZm9yIE9uUHVzaCkuXG4gIHB1YmxpYyByZWFkb25seSBzbmFwcGVyOiBDYW52YXNTbmFwcGVyID0ge1xuICAgIHNuYXBNb3ZlOiAoY29tcG9uZW50LCB4LCB5KSA9PiB0aGlzLl9zbmFwTW92ZShjb21wb25lbnQsIHgsIHkpLFxuICAgIHNuYXBSZXNpemU6IChjb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpID0+IHRoaXMuX3NuYXBSZXNpemUoY29tcG9uZW50LCBnZW9tZXRyeSwgaGFuZGxlKSxcbiAgICBjbGVhcjogKCkgPT4gdGhpcy5fY2xlYXJHdWlkZXMoKSxcbiAgfTtcblxuICAvLyBUaGUgdmFsdWUga2V5cyB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgYSB0ZXh0J3MgbGF5ZXIgc2hvdyAodGhlIG1hc3RlcidzXG4gIC8vIGZvciBhIGhlYWRlciBvciBmb290ZXIgYmxvY2spLCBmb3IgaXRzIGVkaXRvcidzIG5vdGljZTogYSB2YWx1ZSBhbm90aGVyXG4gIC8vIGJsb2NrIHN0aWxsIHNob3dzIGlzIG5vdCBsZWZ0IHVudXNlZC4gUmVhZCB3aGVuIGFza2VkOiBzYXZpbmcgYSBibG9ja1xuICAvLyB3cml0ZXMgaXRzIGh0bWwgaW50byBpdHMgY29tcG9uZW50IGluIHBsYWNlLCB3aGljaCBubyBzaWduYWwgc2Vlcy5cbiAgLy8gU3RhYmxlLCBhcyB0aGUgc25hcHBlciBpcy5cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlS2V5c0Vsc2V3aGVyZSA9ICh0ZXh0OiBSZXBvcnRDb21wb25lbnQpOiBSZWFkb25seVNldDxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuX2lzTWFzdGVyQ29tcG9uZW50KHRleHQpID8gdGhpcy5yZXBvcnQ/Lm1hc3RlciA6IHRoaXMuYWN0aXZlUGFnZTtcblxuICAgIHJldHVybiBuZXcgU2V0KChsYXllcj8uY29tcG9uZW50cyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0JyAmJiBjb21wb25lbnQuaWQgIT09IHRleHQuaWQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB2YWx1ZUtleXMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCkpKTtcbiAgfTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9maWx0ZXJPcHRpb25zID0gaW5qZWN0KFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9maXR0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcHJldmlvdXNQYWdlQ291bnQgPSAwO1xuICBwcml2YXRlIF9wcmV2aW91c1JlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBUaGUgcGFnZSBpZCBsYXN0IGFubm91bmNlZCB0aHJvdWdoIHBhZ2VDaGFuZ2VkLCBzbyBhIHJlLXJlbmRlciB0aGF0IGxhbmRzIG9uXG4gIC8vIHRoZSBzYW1lIHBhZ2Ugc3RheXMgcXVpZXQg4oCUIGhvc3RzIHJlbG9hZCBvbiB0aGlzIGFuZCBhbiB1bmNoYW5nZWQgcGFnZSBpc1xuICAvLyBub3QgbmV3cy5cbiAgcHJpdmF0ZSBfZW1pdHRlZFBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gQSB0ZXh0IGJsb2NrIGFkZGVkIGJ5IGRvdWJsZS1jbGlja2luZyBhIGJhbmQsIHdob3NlIGVkaXRvciBvcGVucyBvbmNlIHRoZVxuICAvLyByZWxvYWRlZCByZXBvcnQgZHJhd3MgaXQuXG4gIHByaXZhdGUgX2VkaXRPbkFycml2YWw6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSBwYWdlIG9uIHNjcmVlbiB3aGVuIFJlZnJlc2ggd2FzIHByZXNzZWQsIHdoaWNoIHRoZSByZWxvYWRlZCByZXBvcnRcbiAgLy8gbGFuZHMgb24gYnkgaWQgKGNhbnZhc0xhbmRpbmdQYWdlKS4gSGVsZCB1bnRpbCB0aGUgcmVmcmVzaCBlbmRzIChidXN5XG4gIC8vIGdvZXMgb2ZmKSwgd2hldGhlciBpdCBicm91Z2h0IGEgcmVwb3J0IG9yIGZhaWxlZC5cbiAgcHJpdmF0ZSBfa2VlcFBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIHJlcG9ydCBpbnB1dCBhcyBhIHNpZ25hbCwgZm9yIHRoZSB0b2tlbiBjb250ZXh0cyBhbmQgdGhlIG1hc3RlcidzXG4gIC8vIGRyYXduIGNvbXBvbmVudHMuIE5vdGlmaWVzIG9uIGV2ZXJ5IHNldDogYSByZWxvYWQgaGFuZHMgb3ZlciBhIG5ldyByZXBvcnRcbiAgLy8gZXZlbiB3aGVuIG5vdGhpbmcgYSB0b2tlbiBzaG93cyBtb3ZlZCwgYW5kIGEgZGVsZXRlZCBoZWFkZXIgb3IgZm9vdGVyXG4gIC8vIGJsb2NrIGlzIHNwbGljZWQgb3V0IG9mIHRoZSBzYW1lIHJlcG9ydC5cbiAgcHJpdmF0ZSBfcmVwb3J0ID0gc2lnbmFsPFJlcG9ydCB8IG51bGw+KG51bGwsIHsgZXF1YWw6ICgpID0+IGZhbHNlIH0pO1xuXG4gIC8vIFRoZSB2YWx1ZXMgZWFjaCBsYXllcidzIHRleHQgY2FuIHNob3cgKHNob3duIG9yIG5vdCkuXG4gIHByaXZhdGUgX3BhZ2VWYWx1ZUNvbXBvbmVudHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZ2VzKClbdGhpcy5hY3RpdmVQYWdlSW5kZXgoKV0/LnZhbHVlcyA/PyBbXSk7XG4gIHByaXZhdGUgX21hc3RlclZhbHVlQ29tcG9uZW50cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3JlcG9ydCgpPy5tYXN0ZXI/LnZhbHVlcyA/PyBbXSk7XG5cbiAgLy8gVGhlIG1hc3RlcidzIG51bWJlcnMgYXJlIG5lZWRlZCB3aGlsZSBzb21lIHBhZ2Ugc2hvd3MgdGhlIGhlYWRlciBhbmRcbiAgLy8gZm9vdGVyLCBvciB3aGlsZSB0aGV5IGFyZSBiZWluZyBlZGl0ZWQuXG4gIHByaXZhdGUgX21hc3Rlck5lZWRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMubWFzdGVyTW9kZSgpIHx8IHRoaXMucGFnZXMoKS5zb21lKChwYWdlKSA9PiAhcGFnZS5tYXN0ZXJIaWRkZW4pKTtcblxuICAvLyBUaGUgdHdvIGxheWVycyB3aG9zZSB2YWx1ZXMgYXJlIHJlYWQsIGVhY2ggb24gaXRzIG93biBzdHJlYW0uXG4gIHByaXZhdGUgX3BhZ2VWYWx1ZXMgPSB0aGlzLl92YWx1ZUxheWVyKCgpID0+IHRoaXMuYWN0aXZlUGFnZSk7XG4gIHByaXZhdGUgX21hc3RlclZhbHVlcyA9IHRoaXMuX3ZhbHVlTGF5ZXIoKCkgPT4gKHRoaXMuX21hc3Rlck5lZWRlZCgpID8gdGhpcy5yZXBvcnQ/Lm1hc3RlciA/PyBudWxsIDogbnVsbCkpO1xuXG4gIC8vIEJ1bXBlZCB3aGVuIGEgdmFsdWUgaXMgcmVuYW1lZCBpbiBwbGFjZSwgd2hpY2ggbm8gc2lnbmFsIHNlZXMuXG4gIHByaXZhdGUgX3ZhbHVlc1JldmlzaW9uID0gc2lnbmFsKDApO1xuXG4gIC8vIEJ1bXBlZCB3aGVuIGEgZmlsdGVyJ3MgdmFsdWUgY2hhbmdlZCAoX3dhdGNoRmlsdGVycyk6IHRoZSBmaWx0ZXIgc3RhdGVcbiAgLy8gaG9sZHMgaXRzIHZhbHVlcyBvdXRzaWRlIGFueSBzaWduYWwuXG4gIHByaXZhdGUgX2ZpbHRlclJldmlzaW9uID0gc2lnbmFsKDApO1xuXG4gIC8vIFRoZSBuYW1lcyBvZiB0aGUgb3B0aW9ucyBwaWNrZWQgaW4gZWFjaCBzZWxlY3QgZ3JvdXAsIGJ5IG9wdGlvbk5hbWVzS2V5LFxuICAvLyBhcyB0aGV5IGxhc3QgYXJyaXZlZCAobnVsbCB3aGVuIHRoZXkgY291bGQgbm90IGJlIHJlYWQsIHVudGlsIGEgZmlsdGVyXG4gIC8vIHZhbHVlIGNoYW5nZXMgYW5kIGFza3MgYWdhaW4pLCBhbmQgdGhlIGtleXMgYXNrZWQgZm9yIHNpbmNlIHRoZSByZXBvcnRcbiAgLy8gbGFzdCBsb2FkZWQuIEEgcGljayBpcyBuYW1lZCBvbmNlIHBlciBsb2FkLCBzbyBhIGZpbHRlciBzZXQgYmFjayB0byBhblxuICAvLyBlYXJsaWVyIHBpY2sgcmVhZHMgaXRzIG5hbWVzIGF0IG9uY2UuIEEgcmVsb2FkIG5hbWVzIGV2ZXJ5IHBpY2sgYWdhaW5cbiAgLy8gZnJvbSB0aGUgZnJlc2ggbGlzdHMsIGFzIGFuIG9wdGlvbiBtYXkgaGF2ZSBiZWVuIHJlbmFtZWQ7IGEgcGljayBrZWVwc1xuICAvLyBzaG93aW5nIHRoZSBuYW1lcyBpdCBoYWQgdW50aWwgdGhlIG5ldyBvbmVzIGxhbmQuXG4gIHByaXZhdGUgX29wdGlvbk5hbWVzID0gc2lnbmFsPFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsPj4obmV3IE1hcCgpKTtcbiAgcHJpdmF0ZSBfb3B0aW9uTmFtZXNBc2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIEVhY2ggc2VsZWN0IGdyb3VwJ3Mgb3B0aW9uIGxpc3QsIGZldGNoZWQgb25jZSBhbmQgcmVhZCBmb3IgZXZlcnkgcGlja1xuICAvLyBvZiB0aGUgZ3JvdXA7IHJlYWQgYWZyZXNoIGFmdGVyIGEgcmVsb2FkLCB3aGljaCBtYXkgaGF2ZSBjaGFuZ2VkIGEgZ3JvdXAuXG4gIHByaXZhdGUgX2dyb3VwT3B0aW9ucyA9IGdyb3VwT3B0aW9uc1JlYWRlcih0aGlzLl9yZXBvcnREYXRhKTtcblxuICAvLyBUaGUgc2VsZWN0IGdyb3VwcyB3aXRoIG9wdGlvbnMgcGlja2VkIChrZXB0IG9yIGxlZnQgb3V0KS4gRWFjaCBwaWNrIG5vdFxuICAvLyBhc2tlZCBmb3Igc2luY2UgdGhlIHJlcG9ydCBsb2FkZWQgaXMgbmFtZWQgKF93YXRjaE9wdGlvbk5hbWVzKS5cbiAgcHJpdmF0ZSBfc2VsZWN0UGlja3MgPSBjb21wdXRlZCgoKTogT3B0aW9uUGlja1tdID0+IHtcbiAgICB0aGlzLl9maWx0ZXJSZXZpc2lvbigpO1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMuX3JlcG9ydCgpO1xuXG4gICAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC50eXBlID09PSAnc2VsZWN0JylcbiAgICAgIC5tYXAoKGdyb3VwKTogT3B0aW9uUGljayA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlUGlja3ModGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpKTtcblxuICAgICAgICByZXR1cm4geyBncm91cCwgcmVwb3J0SWQ6IHJlcG9ydC5pZCwgdmFsdWVzLCBrZXk6IG9wdGlvbk5hbWVzS2V5KGdyb3VwLmlkLCB2YWx1ZXMpIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigocGljaykgPT4gcGljay52YWx1ZXMubGVuZ3RoKTtcbiAgfSk7XG5cbiAgLy8gVGhlIHZhbHVlIGtleXMgZWFjaCBsYXllciBoZWxkIGF0IHRoZSBsYXN0IHJlcG9ydCBsb2FkLCBieSBwYWdlIGlkIGFuZFxuICAvLyBtYXN0ZXIgaWQsIHNvIGEgcmVsb2FkIGNhbiB0ZWxsIHdoaWNoIHZhbHVlcyB3ZXJlIGRlbGV0ZWQuXG4gIHByaXZhdGUgX3ZhbHVlS2V5c0J5TGF5ZXIgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBMZWF2aW5nIGVkaXQgbW9kZSBhbHdheXMgcmV0dXJucyB0byB0aGUgcGFnZSBsYXllciwgc28gdGhlIG5leHQgZWRpdFxuICAgIC8vIHNlc3Npb24gc3RhcnRzIHdoZXJlIHBlb3BsZSBleHBlY3QuXG4gICAgaWYgKGNoYW5nZXMuZWRpdE1vZGUgJiYgIXRoaXMuZWRpdE1vZGUpIHtcbiAgICAgIHRoaXMubWFzdGVyTW9kZS5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuZ3JvdXBzID0gbmV3IE1hcCgodGhpcy5yZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSkubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBncm91cF0pKTtcbiAgICB0aGlzLnBhZ2VzLnNldCh0aGlzLnJlcG9ydD8ucGFnZXMgPz8gW10pO1xuXG4gICAgLy8gQSBwYWdlIGp1c3QgYWRkZWQgaW4gdGhpcyB0YWIsIGVsc2UgdGhlIGFza2VkLWZvciBwYWdlLCBlbHNlIHRoZSBwYWdlXG4gICAgLy8gc2hvd24gKHRoZSBmaXJzdCBwYWdlIG9uIGFub3RoZXIgcmVwb3J0KS4gU2VlIGNhbnZhc0xhbmRpbmdQYWdlLlxuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnQ/LmlkID8/IG51bGw7XG4gICAgdGhpcy5hY3RpdmVQYWdlSW5kZXguc2V0KGNhbnZhc0xhbmRpbmdQYWdlKHtcbiAgICAgIHJlcG9ydElkLFxuICAgICAgcHJldmlvdXNSZXBvcnRJZDogdGhpcy5fcHJldmlvdXNSZXBvcnRJZCxcbiAgICAgIHByZXZpb3VzUGFnZUNvdW50OiB0aGlzLl9wcmV2aW91c1BhZ2VDb3VudCxcbiAgICAgIHBhZ2VJZHM6IHRoaXMucGFnZXMoKS5tYXAoKHBhZ2UpID0+IHBhZ2UuaWQpLFxuICAgICAgcGFnZUlkOiB0aGlzLnBhZ2VJZCxcbiAgICAgIGFjdGl2ZVBhZ2VJbmRleDogdGhpcy5hY3RpdmVQYWdlSW5kZXgoKSxcbiAgICAgIGtlZXBQYWdlSWQ6IHRoaXMuX2tlZXBQYWdlSWQsXG4gICAgfSkpO1xuICAgIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID0gdGhpcy5wYWdlcygpLmxlbmd0aDtcbiAgICB0aGlzLl9wcmV2aW91c1JlcG9ydElkID0gcmVwb3J0SWQ7XG5cbiAgICBpZiAoY2hhbmdlcy5idXN5ICYmICF0aGlzLmJ1c3kpIHtcbiAgICAgIHRoaXMuX2tlZXBQYWdlSWQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRlbGwgdGhlIGhvc3Qgd2hpY2ggcGFnZSBpcyBvcGVuIHdoZW5ldmVyIHRoYXQgY2hhbmdlcyDigJQgaW5jbHVkaW5nIHRoZVxuICAgIC8vIEZJUlNUIHRpbWUgdGhlIHJlcG9ydCByZW5kZXJzLCBub3Qgb25seSB3aGVuIHNvbWVvbmUgY2xpY2tzIGEgcGFnZS5cbiAgICAvLyBIb3N0cyBiaW5kIHRoaW5ncyB0byB0aGUgb3BlbiBwYWdlICh0aGUgcmVwb3J0IGNoYXQgc2NvcGVzIGl0c1xuICAgIC8vIGNvbnZlcnNhdGlvbnMgdG8gaXQpLCBhbmQgd2l0aG91dCB0aGlzIHRoZXkgd291bGQgc2l0IG9uIG5vIHBhZ2UgYXQgYWxsXG4gICAgLy8gdW50aWwgdGhlIGZpcnN0IG1hbnVhbCBwYWdlIGNsaWNrLlxuICAgIGNvbnN0IGFjdGl2ZVBhZ2VJZCA9IHRoaXMuYWN0aXZlUGFnZT8uaWQgPz8gbnVsbDtcbiAgICBpZiAoYWN0aXZlUGFnZUlkICE9PSB0aGlzLl9lbWl0dGVkUGFnZUlkKSB7XG4gICAgICB0aGlzLl9lbWl0dGVkUGFnZUlkID0gYWN0aXZlUGFnZUlkO1xuICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KGFjdGl2ZVBhZ2VJZCk7XG4gICAgfVxuXG4gICAgLy8gQSAocmUpbG9hZGVkIHJlcG9ydCBtYXkgaGF2ZSBnYWluZWQsIGxvc3Qgb3IgY2hhbmdlZCB2YWx1ZXMsIGFuZCBhbnlcbiAgICAvLyB0ZXh0IG1heSBub3cgc2hvdyBkaWZmZXJlbnQgb25lczogcmVhZCBhZ2FpbiBlYWNoIGxheWVyIHdob3NlIG51bWJlcnNcbiAgICAvLyB0aGF0IG1vdmVzLiBJdHMgb3B0aW9uIGxpc3RzIG1heSBoYXZlIHJlbmFtZWQgYSBwaWNrOiBlYWNoIGlzIG5hbWVkXG4gICAgLy8gYWdhaW4gZnJvbSB0aGUgZnJlc2ggbGlzdHMuXG4gICAgaWYgKGNoYW5nZXMucmVwb3J0KSB7XG4gICAgICB0aGlzLl9ncm91cE9wdGlvbnMgPSBncm91cE9wdGlvbnNSZWFkZXIodGhpcy5fcmVwb3J0RGF0YSk7XG4gICAgICB0aGlzLl9vcHRpb25OYW1lc0Fza2VkLmNsZWFyKCk7XG4gICAgICB0aGlzLl9yZXBvcnQuc2V0KHRoaXMucmVwb3J0KTtcbiAgICAgIHRoaXMuX2Ryb3BSZW1vdmVkVmFsdWVDaGlwcygpO1xuICAgICAgdGhpcy5fcmVsb2FkSWZDaGFuZ2VkKHRoaXMuX3BhZ2VWYWx1ZXMpO1xuICAgICAgdGhpcy5fcmVsb2FkSWZDaGFuZ2VkKHRoaXMuX21hc3RlclZhbHVlcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVwb3J0IGhlYWRpbmcgc2l6ZSBpbiBweCAoY29uZmlnIGlzIHBvaW50czsgdGhlIGNhbnZhcyByZW5kZXJzIGF0XG4gIC8vIDk2cHgvaW4sIHNvIHBvaW50cyDDlyA5Ni83MikuIEluaGVyaXRlZCBieSBjb21wb25lbnQgdGl0bGVzIHZpYSBhIENTUyB2YXIuXG4gIHB1YmxpYyBnZXQgaGVhZGluZ1NpemVQeCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucmVwb3J0Py5jb25maWc/LnN0eWxlcz8uaGVhZGluZz8uc2l6ZSA/PyBERUZBVUxUX0hFQURJTkdfU0laRTtcblxuICAgIHJldHVybiBwb2ludHMgKiAoUFhfUEVSX0lOQ0ggLyA3Mik7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIEZpdCB0aGUgcGFnZSB0byB0aGUgdmlld3BvcnQgb25jZSBvbiBmaXJzdCByZW5kZXI7IGFmdGVyIHRoYXQgdGhlXG4gICAgLy8gdmlld2VyJ3Mgem9vbSBjaG9pY2UgaXMgcmVzcGVjdGVkIGFjcm9zcyByZS1yZW5kZXJzLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy56b29tRml0KCkpO1xuXG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnRzLmNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZWRpdEFycml2ZWRUZXh0KCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVQYWdlKCk6IFJlcG9ydFBhZ2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcygpW3RoaXMuYWN0aXZlUGFnZUluZGV4KCldID8/IG51bGw7XG4gIH1cblxuICAvLyBUaGUgaGVhZGVyL2Zvb3RlciBiYW5kcywgaW4gaW5jaGVzICgwID0gbm8gYmFuZCkuXG4gIHB1YmxpYyBnZXQgYmFuZHMoKTogUmVwb3J0SGVhZGVyRm9vdGVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQ/LmNvbmZpZz8uaGVhZGVyRm9vdGVyID8/IHsgaGVhZGVySGVpZ2h0OiAwLCBmb290ZXJIZWlnaHQ6IDAgfTtcbiAgfVxuXG4gIC8vIFRoZSBtYXN0ZXIgZHJhd3MgdW5sZXNzIHRoZSBwYWdlIGhpZGVzIGl0IOKAlCBhbmQgYWx3YXlzIHdoaWxlIGl0IGlzIHRoZVxuICAvLyBsYXllciBiZWluZyBlZGl0ZWQsIHNvIGEgcGFnZSB0aGF0IGhpZGVzIGl0IGNhbiBzdGlsbCBiZSB1c2VkIHRvIGVkaXQgaXQuXG4gIHB1YmxpYyBnZXQgaXNNYXN0ZXJTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXN0ZXJNb2RlKCkgfHwgIXRoaXMuYWN0aXZlUGFnZT8ubWFzdGVySGlkZGVuO1xuICB9XG5cbiAgLy8gV2hpY2ggbGF5ZXIgdGhlIGVkaXQgZ2VzdHVyZXMgcmVhY2guXG4gIHB1YmxpYyBnZXQgaXNQYWdlRWRpdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0TW9kZSAmJiAhdGhpcy5tYXN0ZXJNb2RlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTWFzdGVyRWRpdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0TW9kZSAmJiB0aGlzLm1hc3Rlck1vZGUoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVNYXN0ZXJNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMubWFzdGVyTW9kZS51cGRhdGUoKHZhbHVlKSA9PiAhdmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZC5zZXQobnVsbCk7XG4gIH1cblxuICAvLyBEcm9wIGEgdGV4dCBibG9jayB3aGVyZSBpdCB3aWxsIGJlIGZvdW5kOiBpbnRvIHRoZSBmb290ZXIgKG9yIGhlYWRlcikgYmFuZFxuICAvLyB3aGlsZSBlZGl0aW5nIHRoZSBoZWFkZXIgYW5kIGZvb3RlciwgYmVsb3cgdGhlIGhlYWRlciBiYW5kIG9uIGEgcGFnZS4gVGhlXG4gIC8vIGhvc3QgcmUtZmV0Y2hlcyB0aGUgcmVwb3J0IGFuZCBpdCBhcHBlYXJzOyBkb3VibGUtcHJlc3Mgb3BlbnMgaXRzIGVkaXRvci5cbiAgcHVibGljIGFkZFRleHQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaGVhZGVySGVpZ2h0LCBmb290ZXJIZWlnaHQgfSA9IHRoaXMuYmFuZHM7XG4gICAgY29uc3QgcGFnZVdpZHRoID0gdGhpcy5yZXBvcnQucGFnZVdpZHRoO1xuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSB0aGlzLnJlcG9ydC5wYWdlSGVpZ2h0O1xuICAgIGNvbnN0IGlzTWFzdGVyID0gdGhpcy5tYXN0ZXJNb2RlKCk7XG5cbiAgICBsZXQgZ2VvbWV0cnkgPSB7IHg6IDAuNSwgeTogaGVhZGVySGVpZ2h0ICsgMC41LCB3OiBNYXRoLm1pbig1LCBwYWdlV2lkdGggLSAxKSwgaDogMC44IH07XG4gICAgaWYgKGlzTWFzdGVyKSB7XG4gICAgICBjb25zdCBiYW5kSGVpZ2h0ID0gZm9vdGVySGVpZ2h0IHx8IGhlYWRlckhlaWdodCB8fCAwLjU7XG4gICAgICBjb25zdCB5ID0gZm9vdGVySGVpZ2h0XG4gICAgICAgID8gcGFnZUhlaWdodCAtIGZvb3RlckhlaWdodFxuICAgICAgICA6IChoZWFkZXJIZWlnaHQgPyAwIDogcGFnZUhlaWdodCAtIGJhbmRIZWlnaHQpO1xuICAgICAgZ2VvbWV0cnkgPSB7IHg6IDAuNSwgeTogeSArIDAuMDUsIHc6IE1hdGgubWluKDQsIHBhZ2VXaWR0aCAtIDEpLCBoOiBNYXRoLm1heCgwLjMsIGJhbmRIZWlnaHQgLSAwLjEpIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5hZGRUZXh0KHRoaXMucmVwb3J0LmlkLCB7XG4gICAgICAuLi5nZW9tZXRyeSxcbiAgICAgIHBhZ2VJZDogaXNNYXN0ZXIgPyB1bmRlZmluZWQgOiB0aGlzLmFjdGl2ZVBhZ2U/LmlkLFxuICAgIH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVwb3J0Q2hhbmdlZC5lbWl0KCkpO1xuICB9XG5cbiAgLy8gV2hldGhlciBubyBoZWFkZXIgb3IgZm9vdGVyIGJsb2NrIHJlYWNoZXMgaW50byB0aGUgYmFuZCwgc28gaXQgc2hvd3MgaG93XG4gIC8vIHRvIGZpbGwgaXQuIFJlYWQgb24gZXZlcnkgY2hlY2s6IGEgZHJhZyBtb3ZlcyBhIGJsb2NrIGluIHBsYWNlLlxuICBwdWJsaWMgaXNCYW5kRW1wdHkoYmFuZDogQmFuZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdG9wLCBib3R0b20gfSA9IHRoaXMuX2JhbmRTcGFuKGJhbmQpO1xuXG4gICAgcmV0dXJuICF0aGlzLm1hc3RlckNvbXBvbmVudHMoKVxuICAgICAgLnNvbWUoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnkgPCBib3R0b20gJiYgY29tcG9uZW50LnkgKyBjb21wb25lbnQuaCA+IHRvcCk7XG4gIH1cblxuICAvLyBEb3VibGUtY2xpY2tpbmcgYSBiYW5kIHdoaWxlIGVkaXRpbmcgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGFkZHMgYSB0ZXh0XG4gIC8vIGJsb2NrIHdoZXJlIGl0IHdhcyBjbGlja2VkLCB0aGUgYmFuZCdzIGhlaWdodCwgYW5kIG9wZW5zIGl0cyBlZGl0b3Igb25jZVxuICAvLyB0aGUgaG9zdCdzIHJlbG9hZCBkcmF3cyBpdCDigJQgdGhlIHdheSBpbnRvIGEgaGVhZGVyIGluIFdvcmQuXG4gIHB1YmxpYyBhZGRUZXh0SW5CYW5kKGJhbmQ6IEJhbmQsIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWFzdGVyRWRpdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9wLCBib3R0b20gfSA9IHRoaXMuX2JhbmRTcGFuKGJhbmQpO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IHRoaXMucmVwb3J0LnBhZ2VXaWR0aDtcbiAgICBjb25zdCByZWN0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNsaWNrWCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCB3ID0gTWF0aC5taW4oNCwgcGFnZVdpZHRoIC0gMSk7XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLmFkZFRleHQodGhpcy5yZXBvcnQuaWQsIHtcbiAgICAgIHg6IE1hdGgubWluKE1hdGgubWF4KDAsIGNsaWNrWCksIHBhZ2VXaWR0aCAtIHcpLFxuICAgICAgeTogdG9wICsgMC4wNSxcbiAgICAgIHcsXG4gICAgICBoOiBNYXRoLm1heCgwLjMsIGJvdHRvbSAtIHRvcCAtIDAuMSksXG4gICAgfSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHRleHQ6IFJlcG9ydENvbXBvbmVudCkgPT4ge1xuICAgICAgICB0aGlzLl9lZGl0T25BcnJpdmFsID0gdGV4dC5pZDtcbiAgICAgICAgdGhpcy5yZXBvcnRDaGFuZ2VkLmVtaXQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQSB0ZXh0IGJsb2NrIGRlbGV0ZWQgaXRzZWxmIGZyb20gaXRzIG1lbnU6IGRyb3AgaXQgZnJvbSB3aGljaGV2ZXIgbGF5ZXIgaXRcbiAgLy8gd2FzIG9uIHdpdGhvdXQgcmUtZmV0Y2hpbmcgdGhlIHJlcG9ydC4gVGhhdCBjb3ZlcnMgdGhlIGJsb2NrIGFsb25lOiB0aGVcbiAgLy8gZGVsZXRlIGFsc28gdGFrZXMgdGhlIHZhbHVlcyBvbmx5IGl0IHNob3dlZCwgd2hpY2ggY29tZSBiYWNrIGFzXG4gIC8vIHZhbHVlc1JlbW92ZWQsIGFuZCB0aGF0IGFza3MgdGhlIGhvc3QgdG8gcmVsb2FkIHRoZSByZXBvcnQuXG4gIHB1YmxpYyBvbkNvbXBvbmVudFJlbW92ZWQoY29tcG9uZW50SWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGxheWVycyA9IFt0aGlzLmFjdGl2ZVBhZ2U/LmNvbXBvbmVudHMsIHRoaXMucmVwb3J0Py5tYXN0ZXI/LmNvbXBvbmVudHNdO1xuICAgIGZvciAoY29uc3QgY29tcG9uZW50cyBvZiBsYXllcnMpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gY29tcG9uZW50cz8uZmluZEluZGV4KChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCA9PT0gY29tcG9uZW50SWQpID8/IC0xO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5wYWdlcy5zZXQodGhpcy5wYWdlcygpKTtcbiAgICB0aGlzLl9yZXBvcnQuc2V0KHRoaXMucmVwb3J0KTtcbiAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0RlbGV0ZWQgdGV4dCcpO1xuICB9XG5cbiAgLy8gQSB0ZXh0IGJsb2NrJ3MgaHRtbCB3YXMgc2F2ZWQuIFNhdmluZyBuZXZlciBkZWxldGVzIGEgdmFsdWUsIGJ1dCBpdCBjYW5cbiAgLy8gc2hvdyBvbmUgdGhlIGxheWVyIGhhcyBubyBudW1iZXIgZm9yOiBhIGNoaXAgcGFzdGVkIGJhY2sgZnJvbSBhIHZhbHVlIG5vXG4gIC8vIHRleHQgc2hvd2VkLCB3aGljaCB0aGUgc2VydmVyIGRpZCBub3QgcmVhZC4gSXRzIGxheWVyIGlzIHJlYWQgYWdhaW4gc28gdGhlXG4gIC8vIG51bWJlciBjb21lcyBpbjsgYW4gZWRpdCB0aGF0IHNob3dzIG9ubHkgdmFsdWVzIGFscmVhZHkgcmVhZCBhc2tzIG5vdGhpbmcuXG4gIHB1YmxpYyBvblRleHRTYXZlZCh0ZXh0OiBSZXBvcnRDb21wb25lbnQsIGh0bWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGlzTWFzdGVyID0gdGhpcy5faXNNYXN0ZXJDb21wb25lbnQodGV4dCk7XG4gICAgY29uc3QgbGF5ZXIgPSBpc01hc3RlciA/IHRoaXMuX21hc3RlclZhbHVlcyA6IHRoaXMuX3BhZ2VWYWx1ZXM7XG4gICAgY29uc3QgbGF5ZXJJZCA9IGlzTWFzdGVyID8gKHRoaXMucmVwb3J0Py5tYXN0ZXI/LmlkID8/IG51bGwpIDogdGhpcy5hY3RpdmVQYWdlSWQoKTtcbiAgICBjb25zdCByZXN1bHRzID0gbGF5ZXIucmVzdWx0cygpO1xuICAgIGNvbnN0IHJvd3MgPSByZXN1bHRzPy5wYWdlSWQgPT09IGxheWVySWQgPyByZXN1bHRzLnJvd3MgOiBudWxsO1xuICAgIGNvbnN0IHZhbHVlcyA9IGlzTWFzdGVyID8gdGhpcy5fbWFzdGVyVmFsdWVDb21wb25lbnRzKCkgOiB0aGlzLl9wYWdlVmFsdWVDb21wb25lbnRzKCk7XG4gICAgY29uc3QgdW5yZWFkID0gc2hvd25WYWx1ZXModmFsdWVzLCBbeyAuLi50ZXh0LCBjb25maWc6IHsgLi4udGV4dC5jb25maWcsIGh0bWwgfSB9XSlcbiAgICAgIC5zb21lKCh2YWx1ZSkgPT4gIXJvd3M/Lmhhcyh2YWx1ZS5pZCkpO1xuXG4gICAgaWYgKHVucmVhZCkge1xuICAgICAgbGF5ZXIucmVsb2FkJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBjaGlwJ3MgZ2Vhcjogb3BlbiB0aGUgc2V0dGluZ3Mgb2YgdGhlIHZhbHVlIGl0IG5hbWVzLCBmcm9tIHRoZSBibG9jaydzXG4gIC8vIG93biBsYXllciwgdGhyb3VnaCB0aGUgc2FtZSBvdXRwdXQgYXMgYW55IGNvbXBvbmVudCdzIHNldHRpbmdzLlxuICBwdWJsaWMgb3BlblZhbHVlU2V0dGluZ3ModGV4dDogUmVwb3J0Q29tcG9uZW50LCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX2lzTWFzdGVyQ29tcG9uZW50KHRleHQpID8gdGhpcy5fbWFzdGVyVmFsdWVDb21wb25lbnRzKCkgOiB0aGlzLl9wYWdlVmFsdWVDb21wb25lbnRzKCk7XG4gICAgLy8gVGhlIG5ld2VzdCB2YWx1ZSBob2xkcyBhIGtleSwgYXMgaXQgZG9lcyBpbiB0aGUgdGV4dCdzIHRva2Vucy5cbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlcy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gdmFsdWVLZXkoY2FuZGlkYXRlKSA9PT0ga2V5KS5wb3AoKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5jb21wb25lbnRTZXR0aW5ncy5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvLyBXaGF0IGEgY29tcG9uZW50J3MgdG9rZW5zIGZpbGwgd2l0aCB3aGVyZSBpdCBpcyBkcmF3bjogdGhlIG1hc3RlcidzIGZvciBhXG4gIC8vIGhlYWRlciBvciBmb290ZXIgY29tcG9uZW50LCB0aGUgcGFnZSdzIGZvciBhbnkgb3RoZXIg4oCUIHdoYXQgaXRzIGhlYWRlclxuICAvLyByZWFkcyBpdHMgdGl0bGUgd2l0aCwgYW5kIHNvIHdoYXQgaXRzIHNldHRpbmdzIGRpYWxvZyBzaG93cyBpdCBhcy5cbiAgcHVibGljIGNvbXBvbmVudFRva2Vucyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFRleHRUb2tlbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9pc01hc3RlckNvbXBvbmVudChjb21wb25lbnQpID8gdGhpcy5tYXN0ZXJUb2tlbnMoKSA6IHRoaXMucGFnZVRva2VucygpO1xuICB9XG5cbiAgLy8gU2hvdyBvciBoaWRlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBvbiBvbmUgcGFnZSwgZnJvbSBpdHMgdGFiJ3Mga2ViYWIuXG4gIHB1YmxpYyB0b2dnbGVNYXN0ZXJIaWRkZW4ocGFnZTogUmVwb3J0UGFnZSk6IHZvaWQge1xuICAgIGNvbnN0IG1hc3RlckhpZGRlbiA9ICFwYWdlLm1hc3RlckhpZGRlbjtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEudXBkYXRlUGFnZSh0aGlzLnJlcG9ydC5pZCwgcGFnZS5pZCwgeyBtYXN0ZXJIaWRkZW4gfSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBwYWdlLm1hc3RlckhpZGRlbiA9IG1hc3RlckhpZGRlbjtcbiAgICAgICAgdGhpcy5wYWdlcy5zZXQodGhpcy5wYWdlcygpKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKG1hc3RlckhpZGRlbiA/ICdIZWFkZXIgJiBmb290ZXIgaGlkZGVuIG9uIHRoaXMgcGFnZScgOiAnSGVhZGVyICYgZm9vdGVyIHNob3duIG9uIHRoaXMgcGFnZScpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0UGFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQYWdlSW5kZXguc2V0KGluZGV4KTtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KG51bGwpO1xuXG4gICAgLy8gS2VwdCBpbiBzdGVwIHdpdGggdGhlIG5nT25DaGFuZ2VzIGFubm91bmNlbWVudCBzbyB0aGUgdHdvIGNhbid0IGRpc2FncmVlXG4gICAgLy8gYWJvdXQgd2hhdCB0aGUgaG9zdCB3YXMgbGFzdCB0b2xkLlxuICAgIHRoaXMuX2VtaXR0ZWRQYWdlSWQgPSB0aGlzLmFjdGl2ZVBhZ2U/LmlkID8/IG51bGw7XG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHRoaXMuX2VtaXR0ZWRQYWdlSWQpO1xuICB9XG5cbiAgLy8gQXBwZW5kIGEgYmxhbmsgcGFnZTsgdGhlIGhvc3QgcmUtZmV0Y2hlcyB0aGUgcmVwb3J0IGFuZCBuZ09uQ2hhbmdlcyBsYW5kc1xuICAvLyB0aGUgdmlldyBvbiB0aGUgbmV3IChsYXN0KSBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5hZGRQYWdlKHRoaXMucmVwb3J0LmlkKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlcG9ydENoYW5nZWQuZW1pdCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlTGFiZWwocGFnZTogUmVwb3J0UGFnZSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gO1xuICB9XG5cbiAgLy8gUmVuYW1lIGZyb20gdGhlIHRhYidzIGtlYmFiLiBUaGUgcGFnZSBsaXN0IGlzIHBhdGNoZWQgaW4gcGxhY2UgcmF0aGVyIHRoYW5cbiAgLy8gcmUtZmV0Y2hpbmcgdGhlIHJlcG9ydDogbm90aGluZyBlbHNlIG9uIHRoZSBjYW52YXMgZGVwZW5kcyBvbiBhIHBhZ2Unc1xuICAvLyBuYW1lLCBhbmQgYSByZS1mZXRjaCB3b3VsZCByZS1ydW4gZXZlcnkgY29tcG9uZW50J3MgcXVlcnkgdG8gcmVwYWludCBhXG4gIC8vIGNoaXAncyBsYWJlbC5cbiAgcHVibGljIHJlbmFtZVBhZ2UocGFnZTogUmVwb3J0UGFnZSk6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5pbnB1dCh7XG4gICAgICB0aXRsZTogJ0VkaXQgUGFnZSBOYW1lJyxcbiAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICBkZWZhdWx0OiBwYWdlLm5hbWUgPz8gJycsXG4gICAgICBjb21taXRMYWJlbDogJ1NhdmUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG5hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgICAgIC51cGRhdGVQYWdlKHRoaXMucmVwb3J0LmlkLCBwYWdlLmlkLCB7IG5hbWUgfSlcbiAgICAgICAgICAucGlwZShtYXAoKCkgPT4gbmFtZSkpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHBhZ2UubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucGFnZXMuc2V0KHRoaXMucGFnZXMoKSk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU2F2ZWQgcGFnZSBuYW1lJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBmcm9tIHRoZSB0YWIncyBrZWJhYi4gVGhlIGNvbmZpcm0gbmFtZXMgdGhlIHBhZ2UgYW5kIHNheXMgdGhlXG4gIC8vIGNvbXBvbmVudHMgZ28gd2l0aCBpdCDigJQgdGhlIHNlcnZlciByZWZ1c2VzIHRoZSBsYXN0IHBhZ2UsIGFuZCB0aGF0IHJlZnVzYWxcbiAgLy8gc3VyZmFjZXMgYXMgdGhlIEFQSSBlcnJvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHNlY29uZC1ndWVzc2VkIGhlcmUuXG4gIHB1YmxpYyBkZWxldGVQYWdlKHBhZ2U6IFJlcG9ydFBhZ2UpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogJ0NvbmZpcm0nLFxuICAgICAgdGVtcGxhdGU6IGBBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlIFwiJHt0aGlzLnBhZ2VMYWJlbChwYWdlLCB0aGlzLnBhZ2VzKCkuaW5kZXhPZihwYWdlKSl9XCIgYW5kIGV2ZXJ5dGhpbmcgb24gaXQ/YCxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZVBhZ2UodGhpcy5yZXBvcnQuaWQsIHBhZ2UuaWQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlcygpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHBhZ2VzLmluZGV4T2YocGFnZSk7XG4gICAgICAgIHBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMucGFnZXMuc2V0KHBhZ2VzKTtcblxuICAgICAgICAvLyBMYW5kIG9uIHRoZSBuZWlnaGJvdXIgcmF0aGVyIHRoYW4gc25hcHBpbmcgYmFjayB0byB0aGUgZmlyc3QgcGFnZSDigJRcbiAgICAgICAgLy8gZGVsZXRpbmcgcGFnZSA0IG9mIDYgc2hvdWxkIGxlYXZlIHlvdSBsb29raW5nIGF0IHdoYXQgaXMgbm93IHBhZ2UgNC5cbiAgICAgICAgdGhpcy5hY3RpdmVQYWdlSW5kZXguc2V0KE1hdGgubWluKGluZGV4LCBwYWdlcy5sZW5ndGggLSAxKSk7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID0gcGFnZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KG51bGwpO1xuXG4gICAgICAgIC8vIFRoZSBwYWdlIG9uIHNjcmVlbiBqdXN0IHN0b3BwZWQgZXhpc3Rpbmcg4oCUIHJlcG9ydCB0aGUgbmVpZ2hib3VyIHdlXG4gICAgICAgIC8vIGxhbmRlZCBvbiwgc28gdGhlIGhvc3QncyBzdGF0ZSBuYW1lcyBhIHBhZ2UgdGhlIHJlcG9ydCBoYXMuXG4gICAgICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCh0aGlzLmFjdGl2ZVBhZ2U/LmlkID8/IG51bGwpO1xuXG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnRGVsZXRlZCBwYWdlJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIEEgdGFiIHdhcyBkcmFnZ2VkIHRvIGEgbmV3IHNsb3Q6IHJlb3JkZXIgbG9jYWxseSBzbyB0aGUgY2hpcHMgc2V0dGxlXG4gIC8vIGltbWVkaWF0ZWx5LCBrZWVwIHRoZSB2aWV3ZXIgb24gdGhlIHBhZ2UgdGhleSB3ZXJlIGxvb2tpbmcgYXQsIGFuZCBwZXJzaXN0XG4gIC8vIHRoZSB3aG9sZSBzZXF1ZW5jZSBpbiBvbmUgUFVULlxuICBwdWJsaWMgb25QYWdlRHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQucHJldmlvdXNJbmRleCA9PT0gZXZlbnQuY3VycmVudEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlUGFnZSA9IHRoaXMuYWN0aXZlUGFnZTtcbiAgICBjb25zdCBwYWdlcyA9IHRoaXMucGFnZXMoKTtcblxuICAgIG1vdmVJdGVtSW5BcnJheShwYWdlcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLnBhZ2VzLnNldChwYWdlcyk7XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSBwYWdlcy5tYXAoKHBhZ2UsIG9yZGVyKSA9PiB7XG4gICAgICBwYWdlLm9yZGVyID0gb3JkZXI7XG5cbiAgICAgIHJldHVybiB7IHBhZ2VJZDogcGFnZS5pZCwgb3JkZXIgfTtcbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVQYWdlKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJbmRleC5zZXQocGFnZXMuaW5kZXhPZihhY3RpdmVQYWdlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zYXZlUGFnZVBvc2l0aW9ucyh0aGlzLnJlcG9ydC5pZCwgcG9zaXRpb25zKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gSGFuZCBwcmVzZW50YXRpb24gc2V0dGluZ3MgKHRpdGxlLCBwYWRkaW5nKSBzYXZlZCBpbiB0aGUgc2V0dGluZ3MgZGlhbG9nIHRvXG4gIC8vIHRoZSBvbmUgY29tcG9uZW50IHRoZXkgYmVsb25nIHRvLiBOb3RoaW5nIGhlcmUgZmVlZHMgdGhlIHF1ZXJ5LCBzbyB0aGF0XG4gIC8vIGNvbXBvbmVudCByZXBhaW50cyBhbmQgZXZlcnkgb3RoZXIgb25lIG9uIHRoZSBwYWdlIGlzIGxlZnQgYWxvbmUuIEEgdmFsdWVcbiAgLy8gaXMgbmV2ZXIgZHJhd246IGl0cyB0aXRsZSBpcyBpdHMgTmFtZSwgd2hpY2ggaXRzIGNoaXBzIGFuZCB0b2tlbnMgcmVhZC5cbiAgcHVibGljIGFwcGx5Q29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50SWQ6IG51bWJlciwgc2V0dGluZ3M6IENvbXBvbmVudFNldHRpbmdzKTogdm9pZCB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLl9yZW5kZXJlZENvbXBvbmVudHNcbiAgICAgIC5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5jb21wb25lbnQuaWQgPT09IGNvbXBvbmVudElkKTtcblxuICAgIGlmIChyZW5kZXJlZCkge1xuICAgICAgcmVuZGVyZWQuYXBwbHlTZXR0aW5ncyhzZXR0aW5ncyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IFsuLi50aGlzLl9wYWdlVmFsdWVDb21wb25lbnRzKCksIC4uLnRoaXMuX21hc3RlclZhbHVlQ29tcG9uZW50cygpXVxuICAgICAgLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSBjb21wb25lbnRJZCk7XG5cbiAgICAvLyBUaGUgc2VydmVyIGtlZXBzIHRoZSBvbGQgTmFtZSBmb3IgYSBibGFuayBvbmUuXG4gICAgaWYgKHZhbHVlICYmIHNldHRpbmdzLnRpdGxlPy50cmltKCkpIHtcbiAgICAgIHZhbHVlLnRpdGxlID0gc2V0dGluZ3MudGl0bGUudHJpbSgpO1xuICAgICAgdGhpcy5fdmFsdWVzUmV2aXNpb24udXBkYXRlKChyZXZpc2lvbikgPT4gcmV2aXNpb24gKyAxKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q29tcG9uZW50KGNvbXBvbmVudElkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChjb21wb25lbnRJZCk7XG4gIH1cblxuICBwdWJsaWMgb25DYW52YXNQb2ludGVyRG93bigpOiB2b2lkIHtcbiAgICAvLyBCYWNrZ3JvdW5kIGNsaWNrIChwYW4gc3RhcnQpIGRlc2VsZWN0cy5cbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCkgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIHJlZnJlc2ggKyB6b29tIHRvb2xiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBUaGUgcmVwb3J0IGFnYWluLCBmb3IgY2hhbmdlcyBtYWRlIGF3YXkgZnJvbSB0aGlzIHNjcmVlbiAodGhlIE1DUCwgYW5vdGhlclxuICAvLyB0YWIpIGFuZCBmb3IgZGF0YSB0aGF0IG1vdmVkLiBUaGUgdGV4dCBibG9ja3MnIHZhbHVlcyBhcmUgcmVhZCBhZ2FpbiBub3c6XG4gIC8vIGEgcmVsb2FkIG9ubHkgcmVhZHMgdGhlbSB3aGVuIHRoZSByZXBvcnQgaXQgYnJpbmdzIG1vdmVzIHRoZWlyIHJlcXVlc3QuXG4gIHB1YmxpYyByZWZyZXNoUmVwb3J0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJ1c3kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9rZWVwUGFnZUlkID0gdGhpcy5hY3RpdmVQYWdlSWQoKTtcbiAgICB0aGlzLl9wYWdlVmFsdWVzLnJlbG9hZCQubmV4dCgpO1xuICAgIHRoaXMuX21hc3RlclZhbHVlcy5yZWxvYWQkLm5leHQoKTtcbiAgICB0aGlzLnJlZnJlc2guZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG9uWm9vbWVkKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnpvb20uc2V0KHNjYWxlKTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy56b29tUGFuPy56b29tSW4oKTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMuem9vbVBhbj8uem9vbU91dCgpO1xuICB9XG5cbiAgcHVibGljIHpvb21GaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydD8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZXdwb3J0IHx8ICF0aGlzLnJlcG9ydD8ucGFnZVdpZHRoIHx8ICF0aGlzLnpvb21QYW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXQgPSBNYXRoLm1pbihcbiAgICAgICh2aWV3cG9ydC5jbGllbnRXaWR0aCAtIDMyKSAvICh0aGlzLnJlcG9ydC5wYWdlV2lkdGggKiBQWF9QRVJfSU5DSCksXG4gICAgICAodmlld3BvcnQuY2xpZW50SGVpZ2h0IC0gMzIpIC8gKHRoaXMucmVwb3J0LnBhZ2VIZWlnaHQgKiBQWF9QRVJfSU5DSCksXG4gICAgKTtcblxuICAgIHRoaXMuem9vbVBhbi56b29tKE1hdGgubWluKDEuNSwgTWF0aC5tYXgoMC4xLCBmaXQpKSk7XG4gICAgdGhpcy56b29tUGFuLm1vdmUoMTYsIDE2KTtcbiAgICB0aGlzLl9maXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHpvb21BY3R1YWwoKTogdm9pZCB7XG4gICAgdGhpcy56b29tUGFuPy56b29tKDEpO1xuICB9XG5cbiAgLy8gLS0tLS0gcGVyc2lzdGVuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEEgZHJhZy9yZXNpemUgbGFuZGVkIOKAlCBvbmUgUFVUIHBlciBnZXN0dXJlLlxuICBwdWJsaWMgb25Qb3NpdGlvbkNoYW5nZWQocG9zaXRpb246IHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyR3VpZGVzKCk7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zYXZlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBbcG9zaXRpb24gYXMgYW55XSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIC0tLS0tIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBFYWNoIGxheWVyIHJlYWRzIGl0cyB2YWx1ZXMnIG51bWJlcnMgb24gaXRzIG93biBzdHJlYW06IGFnYWluIHdoZW4gYVxuICAvLyByZXBvcnQgcmVsb2FkIGNoYW5nZXMgd2hhdCB0aGV5IGRlcGVuZCBvbiAobmdPbkNoYW5nZXMpLCB3aGVuIGEgc2F2ZWQgdGV4dFxuICAvLyBzaG93cyBhIHZhbHVlIGl0IGhhcyBubyBudW1iZXIgZm9yLCB3aGVuIGEgZmlsdGVyIGFueSBvZiBpdHMgdmFsdWVzXG4gIC8vIGZvbGxvd3MgY2hhbmdlcyAoYW4gb3BlcmFuZCBubyB0ZXh0IHNob3dzIG1vdmVzIHRoZSBmb3JtdWxhIHRoYXQgcmVhZHNcbiAgLy8gaXQpLCBhbmQgd2hlbiBpdCBjb21lcyBvbiBzY3JlZW4g4oCUIHRoZSBhY3RpdmUgcGFnZSB3aGVuIGFub3RoZXIgcGFnZSBkb2VzLFxuICAvLyB0aGUgbWFzdGVyIHdoZW4gYSBwYWdlIHNob3dzIGl0IG9yIGl0IGlzIGVkaXRlZC5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl93YXRjaFZhbHVlcyh0aGlzLl9wYWdlVmFsdWVzLCB0b09ic2VydmFibGUodGhpcy5hY3RpdmVQYWdlSWQpKTtcbiAgICB0aGlzLl93YXRjaFZhbHVlcyh0aGlzLl9tYXN0ZXJWYWx1ZXMsIHRvT2JzZXJ2YWJsZSh0aGlzLl9tYXN0ZXJOZWVkZWQpKTtcbiAgICB0aGlzLl93YXRjaEZpbHRlcnMoKTtcbiAgICB0aGlzLl93YXRjaE9wdGlvbk5hbWVzKCk7XG4gIH1cblxuICAvLyBUaGUgZmlsdGVyIHRva2VucyBmb2xsb3cgZXZlcnkgY2hhbmdlIG9mIGEgZmlsdGVyJ3MgdmFsdWUsIGhvd2V2ZXIgaXRcbiAgLy8gY29tZXM6IHRoZSBiYXIsIGEgc2F2ZWQgZmlsdGVyIHBpY2tlZCwgQ2xlYXIsIGEgcmVsb2FkLiBjaGFuZ2VzKClcbiAgLy8gYWxzbyBhbm5vdW5jZXMgd2hhdCBubyB0b2tlbiByZWFkcyAoYSBsaXN0J3Mgc29ydCBvciBzZWFyY2gsIGl0cyBoaWRkZW5cbiAgLy8gY29sdW1ucywgYSBkcmlsbCwgdGhlIHBhZ2UpLCB3aGljaCBtb3ZlcyBub3RoaW5nIGhlcmUuXG4gIHByaXZhdGUgX3dhdGNoRmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5fZmlsdGVyVmFsdWVzS2V5KCkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZvcmdldFVucmVhZE5hbWVzKCk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyUmV2aXNpb24udXBkYXRlKChyZXZpc2lvbikgPT4gcmV2aXNpb24gKyAxKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IGZpbHRlciBncm91cCdzIHZhbHVlIGFzIG9uZSBzdHJpbmc6IGFsbCBhIGZpbHRlciB0b2tlbiByZWFkcyBvZlxuICAvLyB0aGUgZmlsdGVyIHN0YXRlLlxuICBwcml2YXRlIF9maWx0ZXJWYWx1ZXNLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKHRoaXMuX3JlcG9ydCgpPy5maWx0ZXJHcm91cHMgPz8gW10pXG4gICAgICAubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCkgPz8gbnVsbF0pKTtcbiAgfVxuXG4gIC8vIERyb3BzIHRoZSBwaWNrcyB3aG9zZSBuYW1lcyBjb3VsZCBub3QgYmUgcmVhZCwgc28gdGhlIGNoYW5nZSB1bmRlciB3YXlcbiAgLy8gYXNrcyBmb3IgdGhlbSBhZ2FpbiByYXRoZXIgdGhhbiB0aGVpciB0b2tlbnMgcmVhZGluZyB0aGUgZW0gZGFzaCB1bnRpbFxuICAvLyB0aGUgcmVwb3J0IHJlbG9hZHMuXG4gIHByaXZhdGUgX2ZvcmdldFVucmVhZE5hbWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlZCA9IG5ldyBNYXAodGhpcy5fb3B0aW9uTmFtZXMoKSk7XG4gICAgY29uc3QgdW5yZWFkID0gWy4uLmxvYWRlZC5rZXlzKCldLmZpbHRlcigoa2V5KSA9PiBsb2FkZWQuZ2V0KGtleSkgPT09IG51bGwpO1xuICAgIGlmICghdW5yZWFkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVucmVhZC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGxvYWRlZC5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuX29wdGlvbk5hbWVzQXNrZWQuZGVsZXRlKGtleSk7XG4gICAgfSk7XG4gICAgdGhpcy5fb3B0aW9uTmFtZXMuc2V0KGxvYWRlZCk7XG4gIH1cblxuICAvLyBOYW1lcyBlYWNoIHNlbGVjdCBwaWNrIHRoZSBmaWx0ZXIgdG9rZW5zIHNob3csIG9uY2UgcGVyIGdyb3VwIGFuZCBwaWNrZWRcbiAgLy8gaWRzIGZvciBlYWNoIGxvYWQgb2YgdGhlIHJlcG9ydCwgYXMgdGhlIGJhcidzIGNoaXBzIG5hbWUgdGhlbTogYSBuYW1lIGl0c1xuICAvLyBsaXN0cyB0YXVnaHQsIGVsc2UgdGhlIGdyb3VwJ3Mgb3B0aW9uIGxpc3QsIHdoaWNoIGlzIGZldGNoZWQgb25jZSBmb3IgYWxsXG4gIC8vIG9mIGl0cyBwaWNrczsgbm90aGluZyBpcyBhc2tlZCB3aGlsZSBub3RoaW5nIGlzIHBpY2tlZC5cbiAgcHJpdmF0ZSBfd2F0Y2hPcHRpb25OYW1lcygpOiB2b2lkIHtcbiAgICB0b09ic2VydmFibGUodGhpcy5fc2VsZWN0UGlja3MpXG4gICAgICAucGlwZShcbiAgICAgICAgbWVyZ2VNYXAoKHBpY2tzKSA9PiBmcm9tKHBpY2tzLmZpbHRlcigocGljaykgPT4gIXRoaXMuX29wdGlvbk5hbWVzQXNrZWQuaGFzKHBpY2sua2V5KSkpKSxcbiAgICAgICAgdGFwKChwaWNrKSA9PiB0aGlzLl9vcHRpb25OYW1lc0Fza2VkLmFkZChwaWNrLmtleSkpLFxuICAgICAgICBtZXJnZU1hcCgocGljaykgPT4gcGlja2VkT3B0aW9uTmFtZXMoXG4gICAgICAgICAgdGhpcy5fZ3JvdXBPcHRpb25zKHBpY2suZ3JvdXAsIHBpY2sucmVwb3J0SWQpLFxuICAgICAgICAgIHBpY2sudmFsdWVzLFxuICAgICAgICAgICh2YWx1ZSkgPT4gdGhpcy5fZmlsdGVyT3B0aW9ucy5sYWJlbChwaWNrLmdyb3VwLmlkLCB2YWx1ZSksXG4gICAgICAgIClcbiAgICAgICAgICAucGlwZShtYXAoKG5hbWVzKSA9PiAoeyBrZXk6IHBpY2sua2V5LCBuYW1lcyB9KSkpKSxcbiAgICAgICAgdGFwKCh7IGtleSwgbmFtZXMgfSkgPT4gdGhpcy5fb3B0aW9uTmFtZXMudXBkYXRlKChsb2FkZWQpID0+IG5ldyBNYXAobG9hZGVkKS5zZXQoa2V5LCBuYW1lcykpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsdWVMYXllcihzb3VyY2U6ICgpID0+IFJlcG9ydFBhZ2UgfCBSZXBvcnRNYXN0ZXIgfCBudWxsKTogVmFsdWVMYXllciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIHJlbG9hZCQ6IG5ldyBTdWJqZWN0PHZvaWQ+KCksXG4gICAgICByZXN1bHRzOiBzaWduYWw8TGF5ZXJWYWx1ZXMgfCBudWxsPihudWxsKSxcbiAgICAgIHBlbmRpbmc6IHNpZ25hbDxMYXllclZhbHVlc1JlcXVlc3QgfCBudWxsPihudWxsKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVHJpZ2dlcnMgbGFuZGluZyB0b2dldGhlciAoYSByZWxvYWQgdGhhdCBhbHNvIGNoYW5nZXMgdGhlIHBhZ2UpIG1ha2Ugb25lXG4gIC8vIHJlcXVlc3QsIGFuZCBhIG5ld2VyIHJlcXVlc3QgZHJvcHMgdGhlIG9uZSBzdGlsbCBpbiBmbGlnaHQuIEFueSBvdGhlclxuICAvLyBjaGFuZ2Ugb2YgdGhlIHNjcmVlbidzIHN0YXRlIChjaGFuZ2VzKSBhc2tzIGFnYWluIG9ubHkgd2hlbiBpdCBtb3ZlZFxuICAvLyB0aGUgcmVxdWVzdDogdGhlIGJhciByZXNldCAoc3RhdGVWZXJzaW9uIG1vdmVzIG9uXG4gIC8vIGl0KSwgdGhlIG1hdGNoIGNoYW5nZWQsIG9yLCB3aGlsZSB0aGUgZ3JvdXBzIG1hdGNoICdhbnknLCBhIGdyb3VwIHRoZVxuICAvLyB2YWx1ZXMgaGF2ZSBubyBtZW1iZXIgb2YgdG9vayBvciBsb3N0IGEgdmFsdWUuXG4gIHByaXZhdGUgX3dhdGNoVmFsdWVzKGxheWVyOiBWYWx1ZUxheWVyLCBvblNjcmVlbiQ6IE9ic2VydmFibGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBtZXJnZShcbiAgICAgIGxheWVyLnJlbG9hZCQsXG4gICAgICBvblNjcmVlbiQsXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yQW55KCgpID0+IGxheWVyLnNvdXJjZSgpPy52YWx1ZXMgPz8gW10pLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpLFxuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlcygpLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICByeEZpbHRlcigoKSA9PiB0aGlzLl9yZXF1ZXN0TW92ZWQobGF5ZXIpKSxcbiAgICAgICksXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuX2xheWVyUmVxdWVzdChsYXllci5zb3VyY2UoKSkpLFxuICAgICAgICB0YXAoKHJlcXVlc3QpID0+IGxheWVyLnBlbmRpbmcuc2V0KHJlcXVlc3QpKSxcbiAgICAgICAgc3dpdGNoTWFwKChyZXF1ZXN0KSA9PiB0aGlzLl9sb2FkVmFsdWVzKHJlcXVlc3QpKSxcbiAgICAgICAgdGFwKChsb2FkZWQpID0+IHtcbiAgICAgICAgICBsYXllci5yZXN1bHRzLnNldChsb2FkZWQpO1xuICAgICAgICAgIGxheWVyLnBlbmRpbmcuc2V0KG51bGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gQSByZWxvYWQgb2YgdGhlIHJlcG9ydCByZWFkcyBhIGxheWVyJ3MgbnVtYmVycyBhZ2FpbiBvbmx5IHdoZW4gc29tZXRoaW5nXG4gIC8vIHRoZXkgZGVwZW5kIG9uIG1vdmVkOiBhIHJlbmFtZSwgb3IgYW4gZWRpdCB0byBhIHRpbGUsIGhhbmRzIG92ZXIgYSBuZXdcbiAgLy8gcmVwb3J0IGFuZCBsZWF2ZXMgZXZlcnkgbnVtYmVyIGFzIGl0IHdhcy4gQ29tcGFyZWQgd2l0aCB0aGUgcmVxdWVzdCBvbiBpdHNcbiAgLy8gd2F5LCBlbHNlIHRoZSBvbmUgd2hvc2UgbnVtYmVycyBhcmUgb24gc2NyZWVuLlxuICBwcml2YXRlIF9yZWxvYWRJZkNoYW5nZWQobGF5ZXI6IFZhbHVlTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVxdWVzdE1vdmVkKGxheWVyKSkge1xuICAgICAgbGF5ZXIucmVsb2FkJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hldGhlciB0aGUgbGF5ZXIncyByZXF1ZXN0IG5vdyBkaWZmZXJzIGZyb20gdGhlIG9uZSBvbiBpdHMgd2F5LCBlbHNlXG4gIC8vIHRoZSBvbmUgd2hvc2UgbnVtYmVycyBhcmUgb24gc2NyZWVuLlxuICBwcml2YXRlIF9yZXF1ZXN0TW92ZWQobGF5ZXI6IFZhbHVlTGF5ZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBsYXN0ID0gbGF5ZXIucGVuZGluZygpID8/IGxheWVyLnJlc3VsdHMoKTtcblxuICAgIHJldHVybiB0aGlzLl9sYXllclJlcXVlc3QobGF5ZXIuc291cmNlKCkpLnNpZ25hdHVyZSAhPT0gbGFzdD8uc2lnbmF0dXJlO1xuICB9XG5cbiAgLy8gUmVhZCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNlbnQsIG5vdCB3aGVuIGl0IHdhcyBhc2tlZCBmb3I6IGFuIGVkaXQgbWF5IGhhdmVcbiAgLy8ganVzdCBjaGFuZ2VkIHdoaWNoIHZhbHVlcyB0aGUgbGF5ZXIncyB0ZXh0IHNob3dzLiBUaGUgZmlsdGVyIHZhbHVlcyBvZlxuICAvLyBldmVyeSB2YWx1ZSBvbiB0aGUgbGF5ZXIgZ28gb3V0LCBzaG93biBvciBub3Q6IHRoZSBzZXJ2ZXIgZGVjaWRlcyB3aGljaFxuICAvLyB2YWx1ZXMgaXQgcmVhZHMsIGFuZCBhcHBsaWVzIHRvIGVhY2ggb25seSB0aGUgZW50cmllcyBuYW1pbmcgaXRzIG93blxuICAvLyBmaWx0ZXJzLCBzbyBhbiBvcGVyYW5kIG9ubHkgYSBmb3JtdWxhIHJlYWRzIGlzIGZpbHRlcmVkIGFzIGlmIGl0IHdlcmVcbiAgLy8gc2hvd24uIEEgdmFsdWUncyBOYW1lIGlzIGxlZnQgb3V0IG9mIHRoZSBzaWduYXR1cmU6IGEgcmVuYW1lIG1vdmVzIG5vXG4gIC8vIG51bWJlci4gV2hpbGUgdGhlIGdyb3VwcyBtYXRjaCAnYW55JywgdGhlIHJlcXVlc3QgbGlzdHMgdGhlIGdyb3VwcyB0aGF0XG4gIC8vIGNvbWJpbmUsIGJ5IHRoZSB0aWxlIHJ1bGUgKHZhbHVlc01hdGNoQW55R3JvdXBJZHMpOiBhIGhlYWRlciBvciBmb290ZXJcbiAgLy8gdmFsdWUncyBhcmUgdGhlIHBhZ2Ugb24gc2NyZWVuJ3MuXG4gIHByaXZhdGUgX2xheWVyUmVxdWVzdChsYXllcjogUmVwb3J0UGFnZSB8IFJlcG9ydE1hc3RlciB8IG51bGwpOiBMYXllclZhbHVlc1JlcXVlc3Qge1xuICAgIGNvbnN0IHBhZ2VJZCA9IGxheWVyPy5pZCA/PyBudWxsO1xuICAgIGNvbnN0IHZhbHVlcyA9IGxheWVyPy52YWx1ZXMgPz8gW107XG4gICAgY29uc3Qgc2hvd24gPSB0aGlzLl9zaG93blZhbHVlcyhsYXllcik7XG4gICAgY29uc3QgZmlsdGVycyA9IHZhbHVlcy5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSk7XG4gICAgY29uc3QgbWF0Y2hBbnlHcm91cElkcyA9IHZhbHVlcy5sZW5ndGhcbiAgICAgID8gdmFsdWVzTWF0Y2hBbnlHcm91cElkcyh0aGlzLnJlcG9ydCwgcGFnZUlkLCB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpKVxuICAgICAgOiBbXTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYWdlSWQsXG4gICAgICBzaG93bixcbiAgICAgIGZpbHRlcnMsXG4gICAgICBtYXRjaEFueUdyb3VwSWRzLFxuICAgICAgc2lnbmF0dXJlOiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgIHBhZ2VJZCxcbiAgICAgICAgc2hvd24ubWFwKCh2YWx1ZSkgPT4gdmFsdWUuaWQpLFxuICAgICAgICB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIHRpdGxlOiBudWxsIH0pKSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgbWF0Y2hBbnlHcm91cElkcyxcbiAgICAgIF0pLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgdmFsdWVzIGEgbGF5ZXIncyB0ZXh0IHNob3dzLiBJdHMgcmVxdWVzdCBhbHNvIHJlYWRzIHRoZSBvcGVyYW5kcyBvZlxuICAvLyB0aGUgZm9ybXVsYXMgYW1vbmcgdGhlbSwgYnV0IG9ubHkgdGhlIHNob3duIG9uZXMgcmVhZCBhcyBsb2FkaW5nIHdoaWxlIGl0XG4gIC8vIGlzIG9uIGl0cyB3YXksIGFuZCBhIGxheWVyIHRoYXQgc2hvd3Mgbm9uZSBhc2tzIGZvciBub3RoaW5nLlxuICBwcml2YXRlIF9zaG93blZhbHVlcyhsYXllcjogUmVwb3J0UGFnZSB8IFJlcG9ydE1hc3RlciB8IG51bGwpOiBSZXBvcnRDb21wb25lbnRbXSB7XG4gICAgY29uc3QgdGV4dHMgPSAobGF5ZXI/LmNvbXBvbmVudHMgPz8gW10pLmZpbHRlcigoY29tcG9uZW50KSA9PiBjb21wb25lbnQudHlwZSA9PT0gJ3RleHQnKTtcblxuICAgIHJldHVybiBzaG93blZhbHVlcyhsYXllcj8udmFsdWVzID8/IFtdLCB0ZXh0cyk7XG4gIH1cblxuICAvLyBPbmUgbGF5ZXIncyBudW1iZXJzLCBieSB2YWx1ZSBpZC4gQSBsYXllciB3aG9zZSB0ZXh0IHNob3dzIG5vIHZhbHVlIGFza3NcbiAgLy8gZm9yIG5vdGhpbmcuIEEgZmFpbGVkIHJlcXVlc3QgcmVhZHMgYXMgbm8gbnVtYmVycyAoZWFjaCB2YWx1ZSBhbiBlbSBkYXNoKVxuICAvLyByYXRoZXIgdGhhbiBhbiBlcnJvciBkaWFsb2c6IHRoZSB3b3JkcyBhcm91bmQgdGhlbSBzdGlsbCByZWFkLlxuICBwcml2YXRlIF9sb2FkVmFsdWVzKHtcbiAgICBwYWdlSWQsIHNob3duLCBmaWx0ZXJzLCBtYXRjaEFueUdyb3VwSWRzLCBzaWduYXR1cmUsXG4gIH06IExheWVyVmFsdWVzUmVxdWVzdCk6IE9ic2VydmFibGU8TGF5ZXJWYWx1ZXM+IHtcbiAgICBjb25zdCBsb2FkZWQgPSAocm93czogUmVwb3J0UGFnZVZhbHVlW10pOiBMYXllclZhbHVlcyA9PiAoe1xuICAgICAgcGFnZUlkLFxuICAgICAgc2lnbmF0dXJlLFxuICAgICAgcm93czogbmV3IE1hcChyb3dzLm1hcCgocm93KSA9PiBbcm93LmlkLCByb3ddKSksXG4gICAgfSk7XG5cbiAgICBpZiAocGFnZUlkID09PSBudWxsIHx8ICFzaG93bi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvZihsb2FkZWQoW10pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5wYWdlVmFsdWVzKHRoaXMucmVwb3J0LmlkLCBwYWdlSWQsIGZpbHRlcnMsIGZhbHNlLCB7IGhhbmRsZXJzOiBmYWxzZSB9LCBtYXRjaEFueUdyb3VwSWRzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocm93cykgPT4gbG9hZGVkKHJvd3MgPz8gW10pKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihsb2FkZWQoW10pKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIHRva2VucyBvZiBvbmUgbGF5ZXIncyBibG9ja3MuIE51bWJlcnMgcmVhZCBmb3IgYW5vdGhlciBwYWdlIGFyZSBub3RcbiAgLy8gdGhpcyBvbmUncywgc28gdW50aWwgaXRzIG93biBhcnJpdmUgaXRzIHZhbHVlcyByZWFkIGFzIGxvYWRpbmc7IHNvIGRvZXMgYVxuICAvLyB2YWx1ZSB0aGUgcmVxdWVzdCBvbiBpdHMgd2F5IGFza3MgZm9yLCB1bnRpbCBpdCBsYW5kcy4gZmlsdGVyUGFnZUlkIGlzXG4gIC8vIHRoZSBwYWdlIHdob3NlIHBhZ2UgZmlsdGVycyB0aGUgbGF5ZXIgcmVhZHM6IHRoZSBwYWdlJ3Mgb3duLCBub25lIChudWxsKVxuICAvLyBmb3IgdGhlIGhlYWRlciBhbmQgZm9vdGVyLlxuICBwcml2YXRlIF90b2tlbkNvbnRleHQoXG4gICAgdmFsdWVzOiBSZXBvcnRDb21wb25lbnRbXSxcbiAgICBsYXllcjogVmFsdWVMYXllcixcbiAgICB2YWx1ZVBhZ2VJZDogbnVtYmVyIHwgbnVsbCxcbiAgICBmaWx0ZXJQYWdlSWQ6IG51bWJlciB8IG51bGwsXG4gICk6IFRleHRUb2tlbkNvbnRleHQge1xuICAgIC8vIFJlYWQgc28gYSByZW5hbWUsIHBhdGNoZWQgaW50byB0aGUgdmFsdWUgaW4gcGxhY2UsIHJlY29tcHV0ZXMgdGhlIG5hbWVzLlxuICAgIHRoaXMuX3ZhbHVlc1JldmlzaW9uKCk7XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYWN0aXZlUGFnZUluZGV4KCk7XG4gICAgY29uc3QgcGFnZSA9IHRoaXMucGFnZXMoKVtpbmRleF07XG4gICAgY29uc3QgcmVzdWx0cyA9IGxheWVyLnJlc3VsdHMoKTtcbiAgICBjb25zdCBwZW5kaW5nID0gbGF5ZXIucGVuZGluZygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXI6IGluZGV4ICsgMSxcbiAgICAgIHBhZ2VOYW1lOiBwYWdlID8gdGhpcy5wYWdlTGFiZWwocGFnZSwgaW5kZXgpIDogJycsXG4gICAgICByZXBvcnROYW1lOiB0aGlzLl9yZXBvcnQoKT8ubmFtZSA/PyAnJyxcbiAgICAgIHZhbHVlczogdGV4dFZhbHVlcyhcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICByZXN1bHRzPy5wYWdlSWQgPT09IHZhbHVlUGFnZUlkID8gcmVzdWx0cyA6IG51bGwsXG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSxcbiAgICAgICAgbmV3IFNldChwZW5kaW5nPy5wYWdlSWQgPT09IHZhbHVlUGFnZUlkID8gcGVuZGluZy5zaG93bi5tYXAoKHZhbHVlKSA9PiB2YWx1ZS5pZCkgOiBbXSksXG4gICAgICApLFxuICAgICAgdmFsdWVQYWdlSWQsXG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJGaWVsZHMoZmlsdGVyUGFnZUlkKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gV2hhdCB0aGUge3tmaWx0ZXIuPGlkPn19IHRva2VucyBvZiBhIGxheWVyIHByaW50OiBlYWNoIGZpbHRlciBncm91cCB0aGVcbiAgLy8gbGF5ZXIgcmVhZHMgKGxheWVyRmlsdGVyR3JvdXBzKSBhdCB0aGUgdmlld2VyJ3MgY3VycmVudCB2YWx1ZS4gQSBzZWxlY3RcbiAgLy8gcmVhZHMgYXMgbG9hZGluZyB1bnRpbCB0aGUgbmFtZXMgb2YgaXRzIHBpY2tzIGFycml2ZS5cbiAgcHJpdmF0ZSBfZmlsdGVyRmllbGRzKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD4ge1xuICAgIHRoaXMuX2ZpbHRlclJldmlzaW9uKCk7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5fb3B0aW9uTmFtZXMoKTtcblxuICAgIHJldHVybiB0ZXh0RmlsdGVyRmllbGRzKFxuICAgICAgbGF5ZXJGaWx0ZXJHcm91cHModGhpcy5fcmVwb3J0KCk/LmZpbHRlckdyb3VwcyA/PyBbXSwgcGFnZUlkKSxcbiAgICAgIChncm91cElkKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cElkKSxcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKS5sb2NhbGUsXG4gICAgICAoZ3JvdXAsIHZhbHVlcykgPT4gbG9hZGVkLmdldChvcHRpb25OYW1lc0tleShncm91cC5pZCwgdmFsdWVzKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRha2UgYSBkZWxldGVkIHZhbHVlJ3MgY2hpcHMgb3V0IG9mIGFuIG9wZW4gZWRpdG9yLiBTYXZpbmcgaHRtbCBuZXZlclxuICAvLyBkZWxldGVzIGEgdmFsdWUsIHNvIGEga2V5IGxlYXZlcyBpdHMgbGF5ZXIgb25seSB3aGVuIHRoZSB2YWx1ZSBpcyBkZWxldGVkXG4gIC8vIChpdHMgZGlhbG9nLCB0aGUgYXNzaXN0YW50KSwgd2hlbiBhIHRleHQgZGVsZXRlIG9yIGFuIGFzc2lzdGFudCB3cml0ZVxuICAvLyBzd2VlcHMgdGhlIHBhZ2UncyB1bnVzZWQgdmFsdWVzLCBvciB3aXRoIGl0cyBwYWdlLiBIb3N0cyByZWxvYWQgdGhlIHJlcG9ydFxuICAvLyBhZnRlciBlYWNoLCBhbmQgdGhpcyBpcyB3aGF0IGZvbGxvd3MgdGhhdCByZWxvYWQgaW50byB0aGUgZWRpdG9yLiBPbmx5IHRoZVxuICAvLyBsYXllcnMgb24gc2NyZWVuIGhhdmUgcmVuZGVyZWQgYmxvY2tzOyBvdGhlciBwYWdlcyBhcmUgbGVmdCBhbG9uZS5cbiAgcHJpdmF0ZSBfZHJvcFJlbW92ZWRWYWx1ZUNoaXBzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBsYXllclZhbHVlS2V5cyh0aGlzLnJlcG9ydCk7XG4gICAgY29uc3QgbWFzdGVySWQgPSB0aGlzLnJlcG9ydD8ubWFzdGVyPy5pZCA/PyBudWxsO1xuICAgIGNvbnN0IHRleHRzID0gKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50cz8udG9BcnJheSgpID8/IFtdKS5maWx0ZXIoKHJlbmRlcmVkKSA9PiByZW5kZXJlZC5pc1RleHQpO1xuXG4gICAgdGhpcy5fdmFsdWVLZXlzQnlMYXllci5mb3JFYWNoKChrZXlzLCBsYXllcklkKSA9PiB7XG4gICAgICBjb25zdCBpc01hc3RlciA9IGxheWVySWQgPT09IG1hc3RlcklkO1xuICAgICAgaWYgKCFpc01hc3RlciAmJiBsYXllcklkICE9PSB0aGlzLmFjdGl2ZVBhZ2VJZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVtb3ZlZCA9IFsuLi5rZXlzXS5maWx0ZXIoKGtleSkgPT4gIW5leHQuZ2V0KGxheWVySWQpPy5oYXMoa2V5KSk7XG4gICAgICB0ZXh0c1xuICAgICAgICAuZmlsdGVyKChyZW5kZXJlZCkgPT4gdGhpcy5faXNNYXN0ZXJDb21wb25lbnQocmVuZGVyZWQuY29tcG9uZW50KSA9PT0gaXNNYXN0ZXIpXG4gICAgICAgIC5mb3JFYWNoKChyZW5kZXJlZCkgPT4gcmVtb3ZlZC5mb3JFYWNoKChrZXkpID0+IHJlbmRlcmVkLnJlbW92ZVZhbHVlKGtleSkpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3ZhbHVlS2V5c0J5TGF5ZXIgPSBuZXh0O1xuICB9XG5cbiAgLy8gSGVhZGVyIGFuZCBmb290ZXIgYmxvY2tzIGFyZSB0aGUgbWFzdGVyJ3M7IGV2ZXJ5IG90aGVyIGJsb2NrIGlzIHRoZSBwYWdlJ3MuXG4gIHByaXZhdGUgX2lzTWFzdGVyQ29tcG9uZW50KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnJlcG9ydD8ubWFzdGVyPy5jb21wb25lbnRzID8/IFtdKS5zb21lKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gY29tcG9uZW50LmlkKTtcbiAgfVxuXG4gIC8vIEEgYmFuZCdzIHRvcCBhbmQgYm90dG9tIGVkZ2VzLCBpbiBwYWdlIGluY2hlcy5cbiAgcHJpdmF0ZSBfYmFuZFNwYW4oYmFuZDogQmFuZCk6IHsgdG9wOiBudW1iZXI7IGJvdHRvbTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgaGVhZGVySGVpZ2h0LCBmb290ZXJIZWlnaHQgfSA9IHRoaXMuYmFuZHM7XG5cbiAgICByZXR1cm4gYmFuZCA9PT0gJ2hlYWRlcidcbiAgICAgID8geyB0b3A6IDAsIGJvdHRvbTogaGVhZGVySGVpZ2h0IH1cbiAgICAgIDogeyB0b3A6IHRoaXMucmVwb3J0LnBhZ2VIZWlnaHQgLSBmb290ZXJIZWlnaHQsIGJvdHRvbTogdGhpcy5yZXBvcnQucGFnZUhlaWdodCB9O1xuICB9XG5cbiAgLy8gT3BlbnMgdGhlIGVkaXRvciBvZiBhIGJsb2NrIGFkZGVkIGJ5IGRvdWJsZS1jbGlja2luZyBhIGJhbmQsIG9uY2UgaXQgaXNcbiAgLy8gZHJhd24uXG4gIHByaXZhdGUgX2VkaXRBcnJpdmVkVGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fcmVuZGVyZWRDb21wb25lbnRzXG4gICAgICAuZmluZCgocmVuZGVyZWQpID0+IHJlbmRlcmVkLmNvbXBvbmVudC5pZCA9PT0gdGhpcy5fZWRpdE9uQXJyaXZhbCk7XG5cbiAgICBpZiAodGV4dCkge1xuICAgICAgdGhpcy5fZWRpdE9uQXJyaXZhbCA9IG51bGw7XG4gICAgICB0ZXh0LmVkaXRUZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0gc21hcnQgZ3VpZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFBpeGVsIGZlZWwgb2YgdGhlIHNuYXAsIGNvbnZlcnRlZCB0byBpbmNoZXMgYXQgdGhlIGN1cnJlbnQgem9vbS5cbiAgcHJpdmF0ZSBnZXQgX3NuYXBUaHJlc2hvbGQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gOCAvIChQWF9QRVJfSU5DSCAqIE1hdGgubWF4KDAuMSwgdGhpcy56b29tKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBNb3ZlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgeyB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCB9ID0gdGhpcy5fY2FuZGlkYXRlcyhjb21wb25lbnQpO1xuICAgIGNvbnN0IGd1aWRlczogR3VpZGVMaW5lW10gPSBbXTtcblxuICAgIGNvbnN0IHNuYXBwZWRYID0gdGhpcy5fc25hcEF4aXMoXG4gICAgICBbXG4gICAgICAgIHsgb2Zmc2V0OiAwLCB2YWx1ZTogeCB9LFxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncgLyAyLCB2YWx1ZTogeCArIGNvbXBvbmVudC53IC8gMiB9LFxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncsIHZhbHVlOiB4ICsgY29tcG9uZW50LncgfSxcbiAgICAgIF0sXG4gICAgICB2ZXJ0aWNhbCxcbiAgICApO1xuICAgIGlmIChzbmFwcGVkWCAhPT0gbnVsbCkge1xuICAgICAgeCA9IHNuYXBwZWRYLmJhc2U7XG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkWC5ndWlkZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzbmFwcGVkWSA9IHRoaXMuX3NuYXBBeGlzKFxuICAgICAgW1xuICAgICAgICB7IG9mZnNldDogMCwgdmFsdWU6IHkgfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oIC8gMiwgdmFsdWU6IHkgKyBjb21wb25lbnQuaCAvIDIgfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oLCB2YWx1ZTogeSArIGNvbXBvbmVudC5oIH0sXG4gICAgICBdLFxuICAgICAgaG9yaXpvbnRhbCxcbiAgICApO1xuICAgIGlmIChzbmFwcGVkWSAhPT0gbnVsbCkge1xuICAgICAgeSA9IHNuYXBwZWRZLmJhc2U7XG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAnaCcsIHBvc2l0aW9uOiBzbmFwcGVkWS5ndWlkZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW5kZXJHdWlkZXMoZ3VpZGVzKTtcblxuICAgIHJldHVybiB7IHgsIHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBSZXNpemUoXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZ2VvbWV0cnk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgaGFuZGxlOiBzdHJpbmcsXG4gICk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgdmVydGljYWwsIGhvcml6b250YWwgfSA9IHRoaXMuX2NhbmRpZGF0ZXMoY29tcG9uZW50KTtcbiAgICBjb25zdCBndWlkZXM6IEd1aWRlTGluZVtdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5nZW9tZXRyeSB9O1xuXG4gICAgLy8gT25seSB0aGUgZWRnZXMgdGhlIGhhbmRsZSBtb3ZlcyBwYXJ0aWNpcGF0ZSBpbiBzbmFwcGluZy5cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdlJykpIHtcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LnggKyBnZW9tZXRyeS53LCB2ZXJ0aWNhbCk7XG4gICAgICBpZiAoc25hcHBlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudyA9IHNuYXBwZWQgLSBnZW9tZXRyeS54O1xuICAgICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCd3JykpIHtcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LngsIHZlcnRpY2FsKTtcbiAgICAgIGlmIChzbmFwcGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC53ID0gZ2VvbWV0cnkueCArIGdlb21ldHJ5LncgLSBzbmFwcGVkO1xuICAgICAgICByZXN1bHQueCA9IHNuYXBwZWQ7XG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICd2JywgcG9zaXRpb246IHNuYXBwZWQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3MnKSkge1xuICAgICAgY29uc3Qgc25hcHBlZCA9IHRoaXMuX25lYXJlc3QoZ2VvbWV0cnkueSArIGdlb21ldHJ5LmgsIGhvcml6b250YWwpO1xuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LmggPSBzbmFwcGVkIC0gZ2VvbWV0cnkueTtcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ2gnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnbicpKSB7XG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS55LCBob3Jpem9udGFsKTtcbiAgICAgIGlmIChzbmFwcGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5oID0gZ2VvbWV0cnkueSArIGdlb21ldHJ5LmggLSBzbmFwcGVkO1xuICAgICAgICByZXN1bHQueSA9IHNuYXBwZWQ7XG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcmVuZGVyR3VpZGVzKGd1aWRlcyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQWxpZ25tZW50IGNhbmRpZGF0ZXM6IHRoZSBwYWdlJ3MgZWRnZXMgKyBjZW50ZXIsIHRoZSBoZWFkZXIvZm9vdGVyIGJhbmRcbiAgLy8gbGluZXMsIGFuZCBldmVyeSBzaWJsaW5nJ3MgZWRnZXMgKyBjZW50ZXJzIOKAlCBzaWJsaW5ncyBvbiB0aGUgU0FNRSBsYXllcixcbiAgLy8gc2luY2UgYSBwYWdlIGNvbXBvbmVudCBhbGlnbnMgd2l0aCB0aGUgcGFnZSBhbmQgYSBoZWFkZXIgYmxvY2sgd2l0aCB0aGVcbiAgLy8gaGVhZGVyLlxuICBwcml2YXRlIF9jYW5kaWRhdGVzKG1vdmluZzogUmVwb3J0Q29tcG9uZW50KTogeyB2ZXJ0aWNhbDogbnVtYmVyW107IGhvcml6b250YWw6IG51bWJlcltdIH0ge1xuICAgIGNvbnN0IHZlcnRpY2FsID0gWzAsIHRoaXMucmVwb3J0LnBhZ2VXaWR0aCAvIDIsIHRoaXMucmVwb3J0LnBhZ2VXaWR0aF07XG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IFswLCB0aGlzLnJlcG9ydC5wYWdlSGVpZ2h0IC8gMiwgdGhpcy5yZXBvcnQucGFnZUhlaWdodF07XG5cbiAgICBjb25zdCB7IGhlYWRlckhlaWdodCwgZm9vdGVySGVpZ2h0IH0gPSB0aGlzLmJhbmRzO1xuICAgIGlmIChoZWFkZXJIZWlnaHQpIHtcbiAgICAgIGhvcml6b250YWwucHVzaChoZWFkZXJIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoZm9vdGVySGVpZ2h0KSB7XG4gICAgICBob3Jpem9udGFsLnB1c2godGhpcy5yZXBvcnQucGFnZUhlaWdodCAtIGZvb3RlckhlaWdodCk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXN0ZXIgPSB0aGlzLl9pc01hc3RlckNvbXBvbmVudChtb3ZpbmcpO1xuICAgIGNvbnN0IHNpYmxpbmdzID0gaXNNYXN0ZXIgPyB0aGlzLm1hc3RlckNvbXBvbmVudHMoKSA6IHRoaXMuYWN0aXZlUGFnZUNvbXBvbmVudHMoKTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHNpYmxpbmdzKSB7XG4gICAgICBpZiAoY29tcG9uZW50LmlkID09PSBtb3ZpbmcuaWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZlcnRpY2FsLnB1c2goY29tcG9uZW50LngsIGNvbXBvbmVudC54ICsgY29tcG9uZW50LncgLyAyLCBjb21wb25lbnQueCArIGNvbXBvbmVudC53KTtcbiAgICAgIGhvcml6b250YWwucHVzaChjb21wb25lbnQueSwgY29tcG9uZW50LnkgKyBjb21wb25lbnQuaCAvIDIsIGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHZlcnRpY2FsLCBob3Jpem9udGFsIH07XG4gIH1cblxuICAvLyBTbmFwIG9uZSBheGlzOiBvZiB0aGUgbW92aW5nIGJveCdzIHRocmVlIGxpbmVzIChlZGdlL2NlbnRlci9lZGdlKSwgZmluZFxuICAvLyB0aGUgY2xvc2VzdCBjYW5kaWRhdGUgd2l0aGluIHRocmVzaG9sZCBhbmQgcmV0dXJuIHRoZSBhZGp1c3RlZCBiYXNlXG4gIC8vIGNvb3JkaW5hdGUgcGx1cyB0aGUgZ3VpZGUgdG8gZHJhdy5cbiAgcHJpdmF0ZSBfc25hcEF4aXMoXG4gICAgbGluZXM6IHsgb2Zmc2V0OiBudW1iZXI7IHZhbHVlOiBudW1iZXIgfVtdLFxuICAgIGNhbmRpZGF0ZXM6IG51bWJlcltdLFxuICApOiB7IGJhc2U6IG51bWJlcjsgZ3VpZGU6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgbGV0IGJlc3Q6IHsgYmFzZTogbnVtYmVyOyBndWlkZTogbnVtYmVyOyBkaXN0YW5jZTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGNhbmRpZGF0ZSAtIGxpbmUudmFsdWUpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPD0gdGhpcy5fc25hcFRocmVzaG9sZCAmJiAoIWJlc3QgfHwgZGlzdGFuY2UgPCBiZXN0LmRpc3RhbmNlKSkge1xuICAgICAgICAgIGJlc3QgPSB7IGJhc2U6IGNhbmRpZGF0ZSAtIGxpbmUub2Zmc2V0LCBndWlkZTogY2FuZGlkYXRlLCBkaXN0YW5jZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3QgPyB7IGJhc2U6IGJlc3QuYmFzZSwgZ3VpZGU6IGJlc3QuZ3VpZGUgfSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9uZWFyZXN0KHZhbHVlOiBudW1iZXIsIGNhbmRpZGF0ZXM6IG51bWJlcltdKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IGJlc3Q6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBiZXN0RGlzdGFuY2UgPSB0aGlzLl9zbmFwVGhyZXNob2xkO1xuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhjYW5kaWRhdGUgLSB2YWx1ZSk7XG4gICAgICBpZiAoZGlzdGFuY2UgPD0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7XG4gICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiZXN0O1xuICB9XG5cbiAgLy8gVGhlIGd1aWRlcyBvdmVybGF5IGlzIGRyYXduIGltcGVyYXRpdmVseSDigJQgdGhlIGRyYWcgbG9vcCBydW5zIG91dHNpZGVcbiAgLy8gQW5ndWxhciBhbmQgcmVwYWludHMgb24gZXZlcnkgcG9pbnRlcm1vdmUuXG4gIHByaXZhdGUgX3JlbmRlckd1aWRlcyhndWlkZXM6IEd1aWRlTGluZVtdKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuX2d1aWRlcz8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBob3N0LnJlcGxhY2VDaGlsZHJlbiguLi5ndWlkZXMubWFwKChndWlkZSkgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGluZS5jbGFzc05hbWUgPSBgZ3VpZGUgZ3VpZGUtJHtndWlkZS5vcmllbnRhdGlvbn1gO1xuICAgICAgaWYgKGd1aWRlLm9yaWVudGF0aW9uID09PSAndicpIHtcbiAgICAgICAgbGluZS5zdHlsZS5sZWZ0ID0gYCR7Z3VpZGUucG9zaXRpb24gKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lLnN0eWxlLnRvcCA9IGAke2d1aWRlLnBvc2l0aW9uICogUFhfUEVSX0lOQ0h9cHhgO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckd1aWRlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9ndWlkZXM/Lm5hdGl2ZUVsZW1lbnQ/LnJlcGxhY2VDaGlsZHJlbigpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzXCI+XG4gIDxkaXZcbiAgICAjdmlld3BvcnRcbiAgICBjbGFzcz1cInBhZ2Utdmlld3BvcnRcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNhbnZhc1BvaW50ZXJEb3duKClcIj5cbiAgICA8ZnMtem9vbS1wYW5cbiAgICAgIHdoZWVsPVwibW9kaWZpZXJcIlxuICAgICAgW3pvb21NaW5dPVwiMC4xXCJcbiAgICAgIFt6b29tTWF4XT1cIjNcIlxuICAgICAgKHpvb21lZCk9XCJvblpvb21lZCgkZXZlbnQpXCI+XG4gICAgICBAaWYgKGFjdGl2ZVBhZ2UpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwicGFnZVwiXG4gICAgICAgICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgICAgICAgIFtjbGFzcy5tYXN0ZXItZWRpdGluZ109XCJpc01hc3RlckVkaXRpbmdcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJyZXBvcnQucGFnZVdpZHRoICogUFhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicmVwb3J0LnBhZ2VIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgW3N0eWxlLi0tY2FudmFzLXpvb21dPVwiem9vbSgpXCJcbiAgICAgICAgICBbc3R5bGUuLS1yZXBvcnQtaGVhZGluZy1zaXplLnB4XT1cImhlYWRpbmdTaXplUHhcIj5cbiAgICAgICAgICA8IS0tIFRoZSBoZWFkZXIgYW5kIGZvb3RlcjogdGhlIG1hc3RlcidzIGNvbXBvbmVudHMsIGRyYXduIHVuZGVyIHRoZVxuICAgICAgICAgICAgICAgcGFnZSdzIG93bi4gLS0+XG4gICAgICAgICAgQGlmIChpc01hc3RlclNob3duICYmIG1hc3RlckNvbXBvbmVudHMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXN0ZXItbGF5ZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuZWRpdGFibGVdPVwiaXNNYXN0ZXJFZGl0aW5nXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBtYXN0ZXJDb21wb25lbnRzKCk7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydC5pZFwiXG4gICAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiaXNNYXN0ZXJFZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgIFt6b29tXT1cInpvb20oKVwiXG4gICAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgIFt0b2tlbnNdPVwibWFzdGVyVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlS2V5c0Vsc2V3aGVyZV09XCJ2YWx1ZUtleXNFbHNld2hlcmVcIlxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImNvbXBvbmVudC5pZCA9PT0gc2VsZWN0ZWRDb21wb25lbnRJZCgpXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbXBvbmVudC54ICogUFhcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJjb21wb25lbnQueSAqIFBYXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb21wb25lbnQudyAqIFBYXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY29tcG9uZW50LmF1dG9IZWlnaHQgPyBudWxsIDogY29tcG9uZW50LmggKiBQWFwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0Q29tcG9uZW50KT1cInNlbGVjdENvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJvbkNvbXBvbmVudFJlbW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAob3BlblNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVTZXR0aW5ncyk9XCJvcGVuVmFsdWVTZXR0aW5ncyhjb21wb25lbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHRleHRTYXZlZCk9XCJvblRleHRTYXZlZChjb21wb25lbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlc1JlbW92ZWQpPVwicmVwb3J0Q2hhbmdlZC5lbWl0KClcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcywgYXMgZ3VpZGVzIHdoaWxlIGVkaXRpbmcuIFdoaWxlIHRoZVxuICAgICAgICAgICAgICAgaGVhZGVyIGFuZCBmb290ZXIgYXJlIGVkaXRlZCwgYW4gZW1wdHkgYmFuZCBzYXlzIGhvdyB0byBmaWxsIGl0XG4gICAgICAgICAgICAgICBhbmQgYSBkb3VibGUtY2xpY2sgYWRkcyBhIHRleHQgYmxvY2sgdGhlcmUuIC0tPlxuICAgICAgICAgIEBpZiAoZWRpdE1vZGUpIHtcbiAgICAgICAgICAgIEBpZiAoYmFuZHMuaGVhZGVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJhbmQgYmFuZC1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hZGRhYmxlXT1cImlzTWFzdGVyRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJiYW5kcy5oZWFkZXJIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cImFkZFRleHRJbkJhbmQoJ2hlYWRlcicsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGlzTWFzdGVyRWRpdGluZykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWxhYmVsIHNtYWxsXCI+SGVhZGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChpc0JhbmRFbXB0eSgnaGVhZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWhpbnQgc21hbGxcIj5Eb3VibGUtY2xpY2sgdG8gYWRkIHRleHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoYmFuZHMuZm9vdGVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJhbmQgYmFuZC1mb290ZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hZGRhYmxlXT1cImlzTWFzdGVyRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJiYW5kcy5mb290ZXJIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cImFkZFRleHRJbkJhbmQoJ2Zvb3RlcicsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGlzTWFzdGVyRWRpdGluZykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWxhYmVsIHNtYWxsXCI+Rm9vdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChpc0JhbmRFbXB0eSgnZm9vdGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYW5kLWhpbnQgc21hbGxcIj5Eb3VibGUtY2xpY2sgdG8gYWRkIHRleHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2YgYWN0aXZlUGFnZUNvbXBvbmVudHMoKTsgdHJhY2sgY29tcG9uZW50LmlkKSB7XG4gICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydC5pZFwiXG4gICAgICAgICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cHNcIlxuICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiaXNQYWdlRWRpdGluZ1wiXG4gICAgICAgICAgICAgIFt6b29tXT1cInpvb20oKVwiXG4gICAgICAgICAgICAgIFtzbmFwcGVyXT1cInNuYXBwZXJcIlxuICAgICAgICAgICAgICBbdG9rZW5zXT1cInBhZ2VUb2tlbnMoKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZUtleXNFbHNld2hlcmVdPVwidmFsdWVLZXlzRWxzZXdoZXJlXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImNvbXBvbmVudC5pZCA9PT0gc2VsZWN0ZWRDb21wb25lbnRJZCgpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29tcG9uZW50LnggKiBQWFwiXG4gICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiY29tcG9uZW50LnkgKiBQWFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb21wb25lbnQudyAqIFBYXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb21wb25lbnQuYXV0b0hlaWdodCA/IG51bGwgOiBjb21wb25lbnQuaCAqIFBYXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENvbXBvbmVudCk9XCJzZWxlY3RDb21wb25lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChyZW1vdmVkKT1cIm9uQ29tcG9uZW50UmVtb3ZlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVTZXR0aW5ncyk9XCJvcGVuVmFsdWVTZXR0aW5ncyhjb21wb25lbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAodGV4dFNhdmVkKT1cIm9uVGV4dFNhdmVkKGNvbXBvbmVudCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh2YWx1ZXNSZW1vdmVkKT1cInJlcG9ydENoYW5nZWQuZW1pdCgpXCI+XG4gICAgICAgICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNndWlkZXNcbiAgICAgICAgICAgIGNsYXNzPVwiZ3VpZGVzXCI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKCFhY3RpdmVQYWdlQ29tcG9uZW50cygpLmxlbmd0aCAmJiAhbWFzdGVyTW9kZSgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1lbXB0eVwiPlxuICAgICAgICAgICAgICBBc2sgdGhlIGFzc2lzdGFudCB0byBhZGQgYSBjaGFydCwgbGlzdCBvciBLUEkgdG8gdGhpcyBwYWdlLlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2ZzLXpvb20tcGFuPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY2FudmFzLXRvb2xiYXJcIj5cbiAgICA8IS0tIFRhYnMgYXJlIG9uZSBob3Jpem9udGFsIGRyb3AgbGlzdDogZHJhZ2dpbmcgYSBjaGlwIHJlb3JkZXJzIHRoZSBwYWdlcy5cbiAgICAgICAgIFRoZSBkcm9wIElOREVYIGlzIGNvbXB1dGVkIGFsb25nIFggKG9yaWVudGF0aW9uKSwgYnV0IHRoZSBwcmV2aWV3IGlzXG4gICAgICAgICBkZWxpYmVyYXRlbHkgbGVmdCB1bmJvdW5kZWQgb24gYm90aCBheGVzIOKAlCBwaW5uaW5nIGl0IHRvIHRoZSByb3cgd2l0aFxuICAgICAgICAgY2RrRHJhZ0JvdW5kYXJ5IG1lYW5zIHRoZSBjaGlwIHlvdSBhcmUgZHJhZ2dpbmcgY292ZXJzIHRoZSBjaGlwcyB5b3VcbiAgICAgICAgIGFyZSBkcmFnZ2luZyBpdCBwYXN0LCBhbmQgeW91IGNhbm5vdCBzZWUgd2hlcmUgaXQgaXMgZ29pbmcgdG8gbGFuZC5cbiAgICAgICAgIEV2ZXJ5IHBhZ2UgZ2V0cyBhIGNoaXAsIGluY2x1ZGluZyBhIGxvbmUgb25lOiB0aGUgY2hpcCBpcyB3aGF0IHRlbGxzXG4gICAgICAgICB5b3Ugd2hpY2ggcGFnZSB5b3UgYXJlIG9uLCBhbmQgYSByZXBvcnQgdGhhdCBoaWQgaXQgbGVmdCB5b3UgdW5hYmxlIHRvXG4gICAgICAgICB0ZWxsIHBhZ2UgMSBvZiAxIGZyb20gYSBwYWdlIHRoYXQgZmFpbGVkIHRvIGxvYWQuIERlbGV0aW5nIHRoZSBsYXN0XG4gICAgICAgICBwYWdlIGlzIHJlZnVzZWQgc2VydmVyLXNpZGUsIHNvIHRoZSBrZWJhYiBpcyBzYWZlIHRvIGV4cG9zZSBoZXJlLiAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInBhZ2UtdGFic1wiXG4gICAgICBjZGtEcm9wTGlzdFxuICAgICAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxuICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvblBhZ2VEcm9wcGVkKCRldmVudClcIj5cbiAgICAgIEBmb3IgKHBhZ2Ugb2YgcGFnZXMoKTsgdHJhY2sgcGFnZS5pZDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgIDwhLS0gVGhlIGNoaXAgaXMgdGhlIGRyYWcgaGFuZGxlIEFORCB0aGUgdGFiOiBjbGlja2luZyBzZWxlY3RzLFxuICAgICAgICAgICAgIGRyYWdnaW5nIHJlb3JkZXJzLiBUaGUga2ViYWIgbGl2ZXMgaW5zaWRlIGl0LCBzbyB0aGUgd2hvbGVcbiAgICAgICAgICAgICBjb250cm9sIHN0YXlzIG9uZSBjaGlwIGluc3RlYWQgb2YgZ3Jvd2luZyBhIHNlY29uZCBidXR0b24uIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIGNsYXNzPVwicGFnZS10YWJcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaW5kZXggPT09IGFjdGl2ZVBhZ2VJbmRleCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZShpbmRleClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2UtdGFiLWxhYmVsXCI+e3sgcGFnZUxhYmVsKHBhZ2UsIGluZGV4KSB9fTwvc3Bhbj5cbiAgICAgICAgICA8IS0tIFRoZSBrZWJhYiBvcGVucyB0aGUgbWVudSByYXRoZXIgdGhhbiBzdGFydGluZyBhIGRyYWcgb3JcbiAgICAgICAgICAgICAgIHN3aXRjaGluZyBwYWdlcywgc28gaXQgc3dhbGxvd3MgaXRzIG93biBjbGljay4gLS0+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS10YWItbWVudVwiXG4gICAgICAgICAgICBbZnNNZW51VHJpZ2dlckZvcl09XCJwYWdlTWVudVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIE91dHNpZGUgdGhlIGNoaXA6IGNka0RyYWcgY2xvbmVzIGl0cyBob3N0IGludG8gdGhlIGRyYWcgcHJldmlldyxcbiAgICAgICAgICAgICBhbmQgYSBtZW51IG92ZXJsYXkgYW5jaG9yZWQgdG8gYSBjbG9uZWQgdHJpZ2dlciBvcGVucyBkZXRhY2hlZFxuICAgICAgICAgICAgIGZyb20gdGhlIHJlYWwgdGFiLiAtLT5cbiAgICAgICAgPGZzLW1lbnUgI3BhZ2VNZW51PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwicmVuYW1lUGFnZShwYWdlKVwiPlxuICAgICAgICAgICAgRWRpdCBuYW1lXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3RlckhpZGRlbihwYWdlKVwiPlxuICAgICAgICAgICAge3sgcGFnZS5tYXN0ZXJIaWRkZW4gPyAnU2hvdyBoZWFkZXIgJiBmb290ZXInIDogJ0hpZGUgaGVhZGVyICYgZm9vdGVyJyB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVQYWdlKHBhZ2UpXCI+XG4gICAgICAgICAgICBEZWxldGVcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2ZzLW1lbnU+XG4gICAgICB9XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInBhZ2UtdGFiIGFkZC1wYWdlXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBwYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZFBhZ2UoKVwiPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgUGFnZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJlZnJlc2ggc2l0cyB0byB0aGUgbGVmdCBvZiB0aGUgem9vbSwgaW4gYSBwaWxsIG9mIGl0cyBvd246IGJvdGggYWN0XG4gICAgICAgICBvbiB0aGUgd2hvbGUgcGFnZSBpbiB2aWV3LCBidXQgUmVmcmVzaCBpcyBub3QgYSB6b29tIHN0ZXAuIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ2aWV3LWNvbnRyb2xzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbC1waWxsXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiUmVmcmVzaFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgIChjbGljayk9XCJyZWZyZXNoUmVwb3J0KClcIj5cbiAgICAgICAgICBAaWYgKGJ1c3kpIHtcbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjIwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLXBpbGxcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1idXR0b25cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJab29tIG91dCAoQ3RybC9DbWQgKyBzY3JvbGwpXCJcbiAgICAgICAgICAoY2xpY2spPVwiem9vbU91dCgpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ6b29tLWxhYmVsXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSB0byAxMDAlXCJcbiAgICAgICAgICAoY2xpY2spPVwiem9vbUFjdHVhbCgpXCI+XG4gICAgICAgICAge3sgKHpvb20oKSAqIDEwMCkudG9GaXhlZCgwKSB9fSVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSBpbiAoQ3RybC9DbWQgKyBzY3JvbGwpXCJcbiAgICAgICAgICAoY2xpY2spPVwiem9vbUluKClcIj5cbiAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiRml0IHBhZ2VcIlxuICAgICAgICAgIChjbGljayk9XCJ6b29tRml0KClcIj5cbiAgICAgICAgICA8bWF0LWljb24+Zml0X3NjcmVlbjwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=