@provoly/dashboard 1.4.59 → 1.4.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +48 -41
- package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +39 -30
- package/esm2022/presentation/components/presentation.component.mjs +6 -3
- package/fesm2022/provoly-dashboard-presentation.mjs +43 -31
- package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +47 -40
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/lib/dashboard/components/widgets/header/widget-header.component.d.ts +1 -0
- package/package.json +7 -7
- package/presentation/components/add-edit-presentation/add-edit-presentation.component.d.ts +2 -1
- package/presentation/components/presentation.component.d.ts +2 -1
- package/styles/components/_o-widget.scss +10 -0
|
@@ -227,49 +227,56 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
227
227
|
this.store.dispatch(DashboardActions.toggleEditionMode({ force: false }));
|
|
228
228
|
this.menuOpen();
|
|
229
229
|
}
|
|
230
|
+
isWidgetZoomed(index) {
|
|
231
|
+
return this.manifestService.widgetZoomed()[index]?.zoom;
|
|
232
|
+
}
|
|
230
233
|
maximize(widgetIndex) {
|
|
231
|
-
this.
|
|
232
|
-
|
|
233
|
-
this.
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
widget
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
234
|
+
if (this.isWidgetZoomed(widgetIndex)) {
|
|
235
|
+
this.clickMax.set(true);
|
|
236
|
+
if (this.zoomWidth !== this.maxWidth) {
|
|
237
|
+
this.zoomLevel++;
|
|
238
|
+
this.zoomWidth = this.zoomWidth < this.maxWidth ? this.zoomWidth + 1 : this.maxWidth;
|
|
239
|
+
this.zoomHeight = this.zoomWidth < this.maxWidth ? this.zoomHeight + 1 : this.zoomHeight;
|
|
240
|
+
this.widgetsZoomed.forEach((widget, index) => {
|
|
241
|
+
widget.zoom = index === widgetIndex;
|
|
242
|
+
});
|
|
243
|
+
this.manifestService.widgetZoomed.set(this.widgetsZoomed);
|
|
244
|
+
this.manifestService.widgetZoomIn.next({
|
|
245
|
+
index: widgetIndex,
|
|
246
|
+
zoom: true,
|
|
247
|
+
layout: {
|
|
248
|
+
x: this.widgetX,
|
|
249
|
+
y: this.widgetY,
|
|
250
|
+
width: this.zoomWidth,
|
|
251
|
+
height: this.zoomHeight
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
250
255
|
}
|
|
251
256
|
}
|
|
252
257
|
minimize(widgetIndex) {
|
|
253
|
-
this.
|
|
254
|
-
|
|
255
|
-
this.zoomLevel
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
if (this.zoomLevel === 0) {
|
|
269
|
-
this.widgetsZoomed.forEach((widget) => {
|
|
270
|
-
widget.zoom = true;
|
|
258
|
+
if (this.isWidgetZoomed(widgetIndex)) {
|
|
259
|
+
this.clickMax.set(false);
|
|
260
|
+
if (this.zoomLevel > 0) {
|
|
261
|
+
this.zoomLevel--;
|
|
262
|
+
this.zoomWidth = this.zoomWidth > this.widgetWidth ? this.zoomWidth - 1 : this.widgetWidth;
|
|
263
|
+
this.zoomHeight = this.zoomHeight > this.widgetHeight ? this.zoomHeight - 1 : this.widgetHeight;
|
|
264
|
+
this.manifestService.widgetZoomIn.next({
|
|
265
|
+
index: widgetIndex,
|
|
266
|
+
zoom: true,
|
|
267
|
+
layout: {
|
|
268
|
+
x: this.widgetX,
|
|
269
|
+
y: this.widgetY,
|
|
270
|
+
width: this.zoomWidth,
|
|
271
|
+
height: this.zoomHeight
|
|
272
|
+
}
|
|
271
273
|
});
|
|
272
|
-
|
|
274
|
+
if (this.zoomLevel === 0) {
|
|
275
|
+
this.widgetsZoomed.forEach((widget) => {
|
|
276
|
+
widget.zoom = true;
|
|
277
|
+
});
|
|
278
|
+
this.manifestService.widgetZoomed.set(this.widgetsZoomed);
|
|
279
|
+
}
|
|
273
280
|
}
|
|
274
281
|
}
|
|
275
282
|
}
|
|
@@ -461,11 +468,11 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
461
468
|
this.openSub?.unsubscribe();
|
|
462
469
|
}
|
|
463
470
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PryWidgetHeaderComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i3.ToolboxMenuService }, { token: i4.ManifestService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
464
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: { manifest: "manifest", openData$: "openData$", additionalOptions: "additionalOptions", headerOptions: "headerOptions", displayCount: "displayCount", datasourceIds: "datasourceIds", widgetIndex: "widgetIndex" }, outputs: { manifestModified: "manifestModified" }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, read: TemplateRef }, { propertyName: "templateModal", first: true, predicate: ["templateModal"], descendants: true, read: TemplateRef }, { propertyName: "toggle", first: true, predicate: ["toggle"], descendants: true, read: TemplateRef }, { propertyName: "overlayMenu", first: true, predicate: ["overlayMenu"], descendants: true, read: TemplateRef }, { propertyName: "overlayCatalog", first: true, predicate: ["overlayCatalog"], descendants: true, read: TemplateRef }, { propertyName: "overlaySpot", first: true, predicate: ["overlaySpot"], descendants: true, read: TemplateRef }, { propertyName: "togglePanel", first: true, predicate: ["togglePanel"], descendants: true }, { propertyName: "cross", first: true, predicate: ["cross"], descendants: true }, { propertyName: "validate", first: true, predicate: ["validate"], descendants: true }, { propertyName: "validateCatalog", first: true, predicate: ["validateCatalog"], descendants: true }, { propertyName: "cancel", first: true, predicate: ["cancel"], descendants: true }, { propertyName: "crossCatalog", first: true, predicate: ["crossCatalog"], descendants: true }, { propertyName: "inputCatalog", first: true, predicate: ["inputCatalog"], descendants: true }, { propertyName: "menuList", first: true, predicate: ["menuList"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"o-widget__header\">\n <div class=\"o-widget__header__content\">\n @if ((manifest$ | async)?.title) {\n <h2 class=\"o-widget__header__content__title\">\n {{ (manifest$ | async)?.title }}\n </h2>\n } @else {\n @for (ds of usedDatasources$ | async; track ds) {\n <div class=\"o-widget__header__content__query\">\n @if (ds.id | translateId: { type: 'datasource', output: 'icon', noDefault: true } | async; as url) {\n <img [height]=\"20\" [src]=\"url\" [width]=\"20\" alt=\"\" class=\"o-widget__header__content__query__icon\" />\n }\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n @if (displayCount && !isGeo(ds)) {\n <h3 class=\"o-widget__header__content__query__name\">\n ({{ [ds.id] | resultSetSize | async }})\n </h3>\n }\n </div>\n }\n @if (((usedDatasources$ | async) ?? []).length === 0) {\n <div class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n }\n }\n </div>\n @if ((manifest$ | async)?.type === 'vega' && manifestService.widgetZoomed()[_widgetIndex]?.zoom) {\n <div class=\"vega-zoom-container\">\n <div (click)=\"minimize(_widgetIndex)\" [class.zoom-clicked]=\"!clickMax() && zoomLevel !== 0\">\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"remove\"></pry-icon>\n </div>\n <div (click)=\"maximize(_widgetIndex)\" [class.zoom-clicked]=\"clickMax() && zoomLevel !== 0\">\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"add\"></pry-icon>\n </div>\n </div>\n }\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n id=\"dialog_Menu\"\n aria-controls=\"menu\"\n [attr.aria-expanded]=\"this.menu\"\n #togglePanel\n class=\"a-btn a-btn--more\"\n (click)=\"menuOpen($event)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.openMenuWidget' | i18n }}</span>\n </button>\n </div>\n }\n</div>\n\n<ng-template #overlayMenu>\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n #menuList\n id=\"menu\"\n role=\"menu\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Menu\"\n (keydown.arrowDown)=\"onArrowDown()\"\n (keydown.arrowUp)=\"onArrowUp()\"\n (keydown.escape)=\"menuOpen()\"\n >\n @if (options === true || options['datasourceSelection'] === true) {\n <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleDatasourceSelection()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"stack-fill\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['parameters'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <ng-content></ng-content>\n </li>\n }\n @if (options === true || options!['window'] === true) {\n @for (targetIndex of targetIndexes$ | async; track targetIndex) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n (click)=\"moveInNewWindow(_widgetIndex, targetIndex)\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"launch\"></pry-icon>\n {{\n (targetIndex !== -1 ? '@pry.widget.target.existing' : '@pry.widget.target.new')\n | i18n: { targetIndex: this.targetIndex + 1 }\n }}\n </button>\n </li>\n }\n }\n @if (hasGrid && (options === true || options!['changeSpot'] === true)) {\n <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n >\n <button type=\"button\" role=\"menuitem\" (click)=\"toggleChangeSpot()\" class=\"a-btn\" tabindex=\"-1\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['maximize'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"maximize(_widgetIndex)\"\n class=\"a-btn\"\n (keydown.escape)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"fullscreen\"></pry-icon>\n {{ '@pry.widget.target.maximize' | i18n }}\n </button>\n </li>\n }\n @if (options === true || options!['addToCatalog'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" tabindex=\"-1\" (click)=\"toggleCatalog()\" class=\"a-btn\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"library_add\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['delete'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n (keydown.tab)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"delete\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </button>\n </li>\n }\n @for (option of additionalOptions; track option) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"executeAction(option)\"\n [disabled]=\"isActionDisabled(option)\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" [iconSvg]=\"option.icon\"></pry-icon>\n {{ option.label | i18n }}\n </button>\n </li>\n }\n </ul>\n </div>\n }\n</ng-template>\n\n<ng-template #templateModal>\n <div\n class=\"o-modal\"\n (keydown.escape)=\"cancelRemoveConfirm()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog confirm delete presentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #cross (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\" (keydown.tab)=\"focusCrossElement()\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #template>\n <pry-datasource-selector\n [manifest]=\"manifest$ | async\"\n (cancel)=\"toggleDatasourceSelection()\"\n (validated)=\"emitManifest()\"\n (nextTab)=\"focusInputCatalog()\"\n (previousTab)=\"focusValidation()\"\n (itemsChanged)=\"datasourcesChanged($event)\"\n ></pry-datasource-selector>\n</ng-template>\n\n<ng-template #overlayCatalog>\n <div\n class=\"o-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Catalog\"\n (keydown.escape)=\"toggleCatalog()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.defineCatalog' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n (keydown.shift.tab)=\"focusValidation()\"\n #crossCatalog\n (click)=\"toggleCatalog()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"name\">{{ '@pry.toolbox.catalog.label' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.name\" id=\"name\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"description\">{{ '@pry.toolbox.catalog.description' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.description\" id=\"description\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <pry-select-image\n [iconUrl]=\"catalogInfo.image\"\n (changed)=\"catalogInfo.image = $event\"\n [mode]=\"type\"\n ></pry-select-image>\n </div>\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n (click)=\"toggleCatalog()\"\n #cancel\n (keydown.tab)=\"disableValidation()\"\n class=\"a-btn a-btn--secondary\"\n >\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n #validateCatalog\n (click)=\"confirmCatalog()\"\n [disabled]=\"!toolboxMenuService.isValidForCatalog(catalogInfo.name)\"\n class=\"a-btn a-btn--primary\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #overlaySpot>\n <div class=\"o-modal -place\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.tooltip.changeSpot' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"toggleChangeSpot()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-dashboard\n [staticDashboard]=\"targetManifest!\"\n [breakpoint]=\"10\"\n [noBackground]=\"true\"\n [forceModeEdition]=\"false\"\n ></pry-dashboard>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i7.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "component", type: i8.PrySelectImageComponent, selector: "pry-select-image", inputs: ["iconUrl", "size", "mode"], outputs: ["toggled", "changed"] }, { kind: "component", type: i9.DashboardComponent, selector: "pry-dashboard", inputs: ["staticDashboard", "forceModeEdition", "CloseOnDragOut", "displayOptions", "noBackground", "breakpoint"], outputs: ["rowHeight", "rows"] }, { kind: "component", type: i10.DatasourceSelectorComponent, selector: "pry-datasource-selector", inputs: ["showButtons", "showTitle", "manifest"], outputs: ["previousTab", "nextTab", "cancel", "validated", "itemsChanged"] }, { kind: "pipe", type: i11.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i13.I18nPipe, name: "i18n" }, { kind: "pipe", type: i14.ResultSetSizePipe, name: "resultSetSize" }] }); }
|
|
471
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: { manifest: "manifest", openData$: "openData$", additionalOptions: "additionalOptions", headerOptions: "headerOptions", displayCount: "displayCount", datasourceIds: "datasourceIds", widgetIndex: "widgetIndex" }, outputs: { manifestModified: "manifestModified" }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, read: TemplateRef }, { propertyName: "templateModal", first: true, predicate: ["templateModal"], descendants: true, read: TemplateRef }, { propertyName: "toggle", first: true, predicate: ["toggle"], descendants: true, read: TemplateRef }, { propertyName: "overlayMenu", first: true, predicate: ["overlayMenu"], descendants: true, read: TemplateRef }, { propertyName: "overlayCatalog", first: true, predicate: ["overlayCatalog"], descendants: true, read: TemplateRef }, { propertyName: "overlaySpot", first: true, predicate: ["overlaySpot"], descendants: true, read: TemplateRef }, { propertyName: "togglePanel", first: true, predicate: ["togglePanel"], descendants: true }, { propertyName: "cross", first: true, predicate: ["cross"], descendants: true }, { propertyName: "validate", first: true, predicate: ["validate"], descendants: true }, { propertyName: "validateCatalog", first: true, predicate: ["validateCatalog"], descendants: true }, { propertyName: "cancel", first: true, predicate: ["cancel"], descendants: true }, { propertyName: "crossCatalog", first: true, predicate: ["crossCatalog"], descendants: true }, { propertyName: "inputCatalog", first: true, predicate: ["inputCatalog"], descendants: true }, { propertyName: "menuList", first: true, predicate: ["menuList"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"o-widget__header\">\n <div class=\"o-widget__header__content\">\n @if ((manifest$ | async)?.title) {\n <h2 class=\"o-widget__header__content__title\">\n {{ (manifest$ | async)?.title }}\n </h2>\n } @else {\n @for (ds of usedDatasources$ | async; track ds) {\n <div class=\"o-widget__header__content__query\">\n @if (ds.id | translateId: { type: 'datasource', output: 'icon', noDefault: true } | async; as url) {\n <img [height]=\"20\" [src]=\"url\" [width]=\"20\" alt=\"\" class=\"o-widget__header__content__query__icon\" />\n }\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n @if (displayCount && !isGeo(ds)) {\n <h3 class=\"o-widget__header__content__query__name\">({{ [ds.id] | resultSetSize | async }})</h3>\n }\n </div>\n }\n @if (((usedDatasources$ | async) ?? []).length === 0) {\n <div class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n }\n }\n </div>\n @if ((manifest$ | async)?.type === 'vega') {\n <div class=\"vega-zoom-container\">\n <div\n (click)=\"minimize(_widgetIndex)\"\n [class.zoom-clicked]=\"!clickMax() && zoomLevel !== 0\"\n [class.zoom-disabled]=\"zoomLevel === 0 || !isWidgetZoomed(_widgetIndex)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"remove\"></pry-icon>\n </div>\n <div\n (click)=\"maximize(_widgetIndex)\"\n [class.zoom-clicked]=\"clickMax() && zoomLevel !== 0 && this.zoomWidth !== this.maxWidth\"\n [class.zoom-disabled]=\"this.zoomWidth === this.maxWidth || !isWidgetZoomed(_widgetIndex)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"add\"></pry-icon>\n </div>\n </div>\n }\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n id=\"dialog_Menu\"\n aria-controls=\"menu\"\n [attr.aria-expanded]=\"this.menu\"\n #togglePanel\n class=\"a-btn a-btn--more\"\n (click)=\"menuOpen($event)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.openMenuWidget' | i18n }}</span>\n </button>\n </div>\n }\n</div>\n\n<ng-template #overlayMenu>\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n #menuList\n id=\"menu\"\n role=\"menu\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Menu\"\n (keydown.arrowDown)=\"onArrowDown()\"\n (keydown.arrowUp)=\"onArrowUp()\"\n (keydown.escape)=\"menuOpen()\"\n >\n @if (options === true || options['datasourceSelection'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleDatasourceSelection()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"stack-fill\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['parameters'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <ng-content></ng-content>\n </li>\n }\n @if (options === true || options!['window'] === true) {\n @for (targetIndex of targetIndexes$ | async; track targetIndex) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n (click)=\"moveInNewWindow(_widgetIndex, targetIndex)\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"launch\"></pry-icon>\n {{\n (targetIndex !== -1 ? '@pry.widget.target.existing' : '@pry.widget.target.new')\n | i18n: { targetIndex: this.targetIndex + 1 }\n }}\n </button>\n </li>\n }\n }\n @if (hasGrid && (options === true || options!['changeSpot'] === true)) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" (click)=\"toggleChangeSpot()\" class=\"a-btn\" tabindex=\"-1\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['maximize'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"maximize(_widgetIndex)\"\n class=\"a-btn\"\n (keydown.escape)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"fullscreen\"></pry-icon>\n {{ '@pry.widget.target.maximize' | i18n }}\n </button>\n </li>\n }\n @if (options === true || options!['addToCatalog'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" tabindex=\"-1\" (click)=\"toggleCatalog()\" class=\"a-btn\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"library_add\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['delete'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n (keydown.tab)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"delete\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </button>\n </li>\n }\n @for (option of additionalOptions; track option) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"executeAction(option)\"\n [disabled]=\"isActionDisabled(option)\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" [iconSvg]=\"option.icon\"></pry-icon>\n {{ option.label | i18n }}\n </button>\n </li>\n }\n </ul>\n </div>\n }\n</ng-template>\n\n<ng-template #templateModal>\n <div\n class=\"o-modal\"\n (keydown.escape)=\"cancelRemoveConfirm()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog confirm delete presentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #cross (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\" (keydown.tab)=\"focusCrossElement()\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #template>\n <pry-datasource-selector\n [manifest]=\"manifest$ | async\"\n (cancel)=\"toggleDatasourceSelection()\"\n (validated)=\"emitManifest()\"\n (nextTab)=\"focusInputCatalog()\"\n (previousTab)=\"focusValidation()\"\n (itemsChanged)=\"datasourcesChanged($event)\"\n ></pry-datasource-selector>\n</ng-template>\n\n<ng-template #overlayCatalog>\n <div\n class=\"o-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Catalog\"\n (keydown.escape)=\"toggleCatalog()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.defineCatalog' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n (keydown.shift.tab)=\"focusValidation()\"\n #crossCatalog\n (click)=\"toggleCatalog()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"name\">{{ '@pry.toolbox.catalog.label' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.name\" id=\"name\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"description\">{{ '@pry.toolbox.catalog.description' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.description\" id=\"description\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <pry-select-image\n [iconUrl]=\"catalogInfo.image\"\n (changed)=\"catalogInfo.image = $event\"\n [mode]=\"type\"\n ></pry-select-image>\n </div>\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n (click)=\"toggleCatalog()\"\n #cancel\n (keydown.tab)=\"disableValidation()\"\n class=\"a-btn a-btn--secondary\"\n >\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n #validateCatalog\n (click)=\"confirmCatalog()\"\n [disabled]=\"!toolboxMenuService.isValidForCatalog(catalogInfo.name)\"\n class=\"a-btn a-btn--primary\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #overlaySpot>\n <div class=\"o-modal -place\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.tooltip.changeSpot' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"toggleChangeSpot()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-dashboard\n [staticDashboard]=\"targetManifest!\"\n [breakpoint]=\"10\"\n [noBackground]=\"true\"\n [forceModeEdition]=\"false\"\n ></pry-dashboard>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i7.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "component", type: i8.PrySelectImageComponent, selector: "pry-select-image", inputs: ["iconUrl", "size", "mode"], outputs: ["toggled", "changed"] }, { kind: "component", type: i9.DashboardComponent, selector: "pry-dashboard", inputs: ["staticDashboard", "forceModeEdition", "CloseOnDragOut", "displayOptions", "noBackground", "breakpoint"], outputs: ["rowHeight", "rows"] }, { kind: "component", type: i10.DatasourceSelectorComponent, selector: "pry-datasource-selector", inputs: ["showButtons", "showTitle", "manifest"], outputs: ["previousTab", "nextTab", "cancel", "validated", "itemsChanged"] }, { kind: "pipe", type: i11.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i13.I18nPipe, name: "i18n" }, { kind: "pipe", type: i14.ResultSetSizePipe, name: "resultSetSize" }] }); }
|
|
465
472
|
}
|
|
466
473
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PryWidgetHeaderComponent, decorators: [{
|
|
467
474
|
type: Component,
|
|
468
|
-
args: [{ selector: 'pry-widget-header', template: "<div class=\"o-widget__header\">\n <div class=\"o-widget__header__content\">\n @if ((manifest$ | async)?.title) {\n <h2 class=\"o-widget__header__content__title\">\n {{ (manifest$ | async)?.title }}\n </h2>\n } @else {\n @for (ds of usedDatasources$ | async; track ds) {\n <div class=\"o-widget__header__content__query\">\n @if (ds.id | translateId: { type: 'datasource', output: 'icon', noDefault: true } | async; as url) {\n <img [height]=\"20\" [src]=\"url\" [width]=\"20\" alt=\"\" class=\"o-widget__header__content__query__icon\" />\n }\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n @if (displayCount && !isGeo(ds)) {\n <h3 class=\"o-widget__header__content__query__name\">\n ({{ [ds.id] | resultSetSize | async }})\n </h3>\n }\n </div>\n }\n @if (((usedDatasources$ | async) ?? []).length === 0) {\n <div class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n }\n }\n </div>\n @if ((manifest$ | async)?.type === 'vega' && manifestService.widgetZoomed()[_widgetIndex]?.zoom) {\n <div class=\"vega-zoom-container\">\n <div (click)=\"minimize(_widgetIndex)\" [class.zoom-clicked]=\"!clickMax() && zoomLevel !== 0\">\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"remove\"></pry-icon>\n </div>\n <div (click)=\"maximize(_widgetIndex)\" [class.zoom-clicked]=\"clickMax() && zoomLevel !== 0\">\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"add\"></pry-icon>\n </div>\n </div>\n }\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n id=\"dialog_Menu\"\n aria-controls=\"menu\"\n [attr.aria-expanded]=\"this.menu\"\n #togglePanel\n class=\"a-btn a-btn--more\"\n (click)=\"menuOpen($event)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.openMenuWidget' | i18n }}</span>\n </button>\n </div>\n }\n</div>\n\n<ng-template #overlayMenu>\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n #menuList\n id=\"menu\"\n role=\"menu\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Menu\"\n (keydown.arrowDown)=\"onArrowDown()\"\n (keydown.arrowUp)=\"onArrowUp()\"\n (keydown.escape)=\"menuOpen()\"\n >\n @if (options === true || options['datasourceSelection'] === true) {\n <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleDatasourceSelection()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"stack-fill\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['parameters'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <ng-content></ng-content>\n </li>\n }\n @if (options === true || options!['window'] === true) {\n @for (targetIndex of targetIndexes$ | async; track targetIndex) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n (click)=\"moveInNewWindow(_widgetIndex, targetIndex)\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"launch\"></pry-icon>\n {{\n (targetIndex !== -1 ? '@pry.widget.target.existing' : '@pry.widget.target.new')\n | i18n: { targetIndex: this.targetIndex + 1 }\n }}\n </button>\n </li>\n }\n }\n @if (hasGrid && (options === true || options!['changeSpot'] === true)) {\n <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n >\n <button type=\"button\" role=\"menuitem\" (click)=\"toggleChangeSpot()\" class=\"a-btn\" tabindex=\"-1\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['maximize'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"maximize(_widgetIndex)\"\n class=\"a-btn\"\n (keydown.escape)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"fullscreen\"></pry-icon>\n {{ '@pry.widget.target.maximize' | i18n }}\n </button>\n </li>\n }\n @if (options === true || options!['addToCatalog'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" tabindex=\"-1\" (click)=\"toggleCatalog()\" class=\"a-btn\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"library_add\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['delete'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n (keydown.tab)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"delete\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </button>\n </li>\n }\n @for (option of additionalOptions; track option) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"executeAction(option)\"\n [disabled]=\"isActionDisabled(option)\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" [iconSvg]=\"option.icon\"></pry-icon>\n {{ option.label | i18n }}\n </button>\n </li>\n }\n </ul>\n </div>\n }\n</ng-template>\n\n<ng-template #templateModal>\n <div\n class=\"o-modal\"\n (keydown.escape)=\"cancelRemoveConfirm()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog confirm delete presentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #cross (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\" (keydown.tab)=\"focusCrossElement()\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #template>\n <pry-datasource-selector\n [manifest]=\"manifest$ | async\"\n (cancel)=\"toggleDatasourceSelection()\"\n (validated)=\"emitManifest()\"\n (nextTab)=\"focusInputCatalog()\"\n (previousTab)=\"focusValidation()\"\n (itemsChanged)=\"datasourcesChanged($event)\"\n ></pry-datasource-selector>\n</ng-template>\n\n<ng-template #overlayCatalog>\n <div\n class=\"o-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Catalog\"\n (keydown.escape)=\"toggleCatalog()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.defineCatalog' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n (keydown.shift.tab)=\"focusValidation()\"\n #crossCatalog\n (click)=\"toggleCatalog()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"name\">{{ '@pry.toolbox.catalog.label' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.name\" id=\"name\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"description\">{{ '@pry.toolbox.catalog.description' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.description\" id=\"description\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <pry-select-image\n [iconUrl]=\"catalogInfo.image\"\n (changed)=\"catalogInfo.image = $event\"\n [mode]=\"type\"\n ></pry-select-image>\n </div>\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n (click)=\"toggleCatalog()\"\n #cancel\n (keydown.tab)=\"disableValidation()\"\n class=\"a-btn a-btn--secondary\"\n >\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n #validateCatalog\n (click)=\"confirmCatalog()\"\n [disabled]=\"!toolboxMenuService.isValidForCatalog(catalogInfo.name)\"\n class=\"a-btn a-btn--primary\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #overlaySpot>\n <div class=\"o-modal -place\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.tooltip.changeSpot' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"toggleChangeSpot()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-dashboard\n [staticDashboard]=\"targetManifest!\"\n [breakpoint]=\"10\"\n [noBackground]=\"true\"\n [forceModeEdition]=\"false\"\n ></pry-dashboard>\n </div>\n</ng-template>\n" }]
|
|
475
|
+
args: [{ selector: 'pry-widget-header', template: "<div class=\"o-widget__header\">\n <div class=\"o-widget__header__content\">\n @if ((manifest$ | async)?.title) {\n <h2 class=\"o-widget__header__content__title\">\n {{ (manifest$ | async)?.title }}\n </h2>\n } @else {\n @for (ds of usedDatasources$ | async; track ds) {\n <div class=\"o-widget__header__content__query\">\n @if (ds.id | translateId: { type: 'datasource', output: 'icon', noDefault: true } | async; as url) {\n <img [height]=\"20\" [src]=\"url\" [width]=\"20\" alt=\"\" class=\"o-widget__header__content__query__icon\" />\n }\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n @if (displayCount && !isGeo(ds)) {\n <h3 class=\"o-widget__header__content__query__name\">({{ [ds.id] | resultSetSize | async }})</h3>\n }\n </div>\n }\n @if (((usedDatasources$ | async) ?? []).length === 0) {\n <div class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n }\n }\n </div>\n @if ((manifest$ | async)?.type === 'vega') {\n <div class=\"vega-zoom-container\">\n <div\n (click)=\"minimize(_widgetIndex)\"\n [class.zoom-clicked]=\"!clickMax() && zoomLevel !== 0\"\n [class.zoom-disabled]=\"zoomLevel === 0 || !isWidgetZoomed(_widgetIndex)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"remove\"></pry-icon>\n </div>\n <div\n (click)=\"maximize(_widgetIndex)\"\n [class.zoom-clicked]=\"clickMax() && zoomLevel !== 0 && this.zoomWidth !== this.maxWidth\"\n [class.zoom-disabled]=\"this.zoomWidth === this.maxWidth || !isWidgetZoomed(_widgetIndex)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"add\"></pry-icon>\n </div>\n </div>\n }\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n id=\"dialog_Menu\"\n aria-controls=\"menu\"\n [attr.aria-expanded]=\"this.menu\"\n #togglePanel\n class=\"a-btn a-btn--more\"\n (click)=\"menuOpen($event)\"\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.openMenuWidget' | i18n }}</span>\n </button>\n </div>\n }\n</div>\n\n<ng-template #overlayMenu>\n @if (displayContextMenu$ | async; as options) {\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n #menuList\n id=\"menu\"\n role=\"menu\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Menu\"\n (keydown.arrowDown)=\"onArrowDown()\"\n (keydown.arrowUp)=\"onArrowUp()\"\n (keydown.escape)=\"menuOpen()\"\n >\n @if (options === true || options['datasourceSelection'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleDatasourceSelection()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"stack-fill\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['parameters'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <ng-content></ng-content>\n </li>\n }\n @if (options === true || options!['window'] === true) {\n @for (targetIndex of targetIndexes$ | async; track targetIndex) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n (click)=\"moveInNewWindow(_widgetIndex, targetIndex)\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"launch\"></pry-icon>\n {{\n (targetIndex !== -1 ? '@pry.widget.target.existing' : '@pry.widget.target.new')\n | i18n: { targetIndex: this.targetIndex + 1 }\n }}\n </button>\n </li>\n }\n }\n @if (hasGrid && (options === true || options!['changeSpot'] === true)) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" (click)=\"toggleChangeSpot()\" class=\"a-btn\" tabindex=\"-1\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['maximize'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"maximize(_widgetIndex)\"\n class=\"a-btn\"\n (keydown.escape)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"fullscreen\"></pry-icon>\n {{ '@pry.widget.target.maximize' | i18n }}\n </button>\n </li>\n }\n @if (options === true || options!['addToCatalog'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" tabindex=\"-1\" (click)=\"toggleCatalog()\" class=\"a-btn\">\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"library_add\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </button>\n </li>\n }\n @if (options === true || options!['delete'] === true) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n (keydown.tab)=\"menuOpen()\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"delete\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </button>\n </li>\n }\n @for (option of additionalOptions; track option) {\n <li class=\"m-context-menu__list__item\" role=\"none\">\n <button\n type=\"button\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"executeAction(option)\"\n [disabled]=\"isActionDisabled(option)\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" [iconSvg]=\"option.icon\"></pry-icon>\n {{ option.label | i18n }}\n </button>\n </li>\n }\n </ul>\n </div>\n }\n</ng-template>\n\n<ng-template #templateModal>\n <div\n class=\"o-modal\"\n (keydown.escape)=\"cancelRemoveConfirm()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog confirm delete presentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #cross (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\" (keydown.tab)=\"focusCrossElement()\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #template>\n <pry-datasource-selector\n [manifest]=\"manifest$ | async\"\n (cancel)=\"toggleDatasourceSelection()\"\n (validated)=\"emitManifest()\"\n (nextTab)=\"focusInputCatalog()\"\n (previousTab)=\"focusValidation()\"\n (itemsChanged)=\"datasourcesChanged($event)\"\n ></pry-datasource-selector>\n</ng-template>\n\n<ng-template #overlayCatalog>\n <div\n class=\"o-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_Catalog\"\n (keydown.escape)=\"toggleCatalog()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.defineCatalog' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n (keydown.shift.tab)=\"focusValidation()\"\n #crossCatalog\n (click)=\"toggleCatalog()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"name\">{{ '@pry.toolbox.catalog.label' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.name\" id=\"name\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"description\">{{ '@pry.toolbox.catalog.description' | i18n }}</label>\n <input [(ngModel)]=\"catalogInfo.description\" id=\"description\" type=\"text\" class=\"a-form-field\" required />\n </div>\n <div class=\"m-form-label-field\">\n <pry-select-image\n [iconUrl]=\"catalogInfo.image\"\n (changed)=\"catalogInfo.image = $event\"\n [mode]=\"type\"\n ></pry-select-image>\n </div>\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n (click)=\"toggleCatalog()\"\n #cancel\n (keydown.tab)=\"disableValidation()\"\n class=\"a-btn a-btn--secondary\"\n >\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n #validateCatalog\n (click)=\"confirmCatalog()\"\n [disabled]=\"!toolboxMenuService.isValidForCatalog(catalogInfo.name)\"\n class=\"a-btn a-btn--primary\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #overlaySpot>\n <div class=\"o-modal -place\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\">\n {{ '@pry.widget.tooltip.changeSpot' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"toggleChangeSpot()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-dashboard\n [staticDashboard]=\"targetManifest!\"\n [breakpoint]=\"10\"\n [noBackground]=\"true\"\n [forceModeEdition]=\"false\"\n ></pry-dashboard>\n </div>\n</ng-template>\n" }]
|
|
469
476
|
}], ctorParameters: () => [{ type: i1.Store }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i3.ToolboxMenuService }, { type: i4.ManifestService }], propDecorators: { template: [{
|
|
470
477
|
type: ViewChild,
|
|
471
478
|
args: ['template', { read: TemplateRef }]
|
|
@@ -525,4 +532,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
525
532
|
}], widgetIndex: [{
|
|
526
533
|
type: Input
|
|
527
534
|
}] } });
|
|
528
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsRUFDWCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFxQyxNQUFNLE1BQU0sQ0FBQztBQUNwSCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQXFDLE1BQU0sMkNBQTJDLENBQUM7QUFFbkgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0Q0FBNEMsQ0FB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QVcsRUFBRTtnQkFDTCxNQUFNO3NCQUFqRCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ08sV0FBVztzQkFBM0QsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNLLGNBQWM7c0JBQWpFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNELFdBQVc7c0JBQTNELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDckIsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNKLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFDSyxRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ1MsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ1AsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUNRLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0YsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQW1CUixRQUFRO3NCQUFwQixLQUFLO2dCQVVPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBT0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBYU0sYUFBYTtzQkFBekIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LCBzaWduYWwsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwvZXM2JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgR2VvTWV0YWRhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVsL2RhdGFzZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERhc2hib2FyZEdyaWRMYXlvdXQsIERhc2hib2FyZE1hbmlmZXN0LCBXaWRnZXRNYW5pZmVzdCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWwvbWFuaWZlc3QuaW50ZXJmYWNlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWwvd2lkZ2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25maWdBY3Rpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9jb25maWcvY29uZmlnLmFjdGlvbnMnO1xuaW1wb3J0IHsgRGF0YXNldCwgRGF0YVNvdXJjZSwgTmFtZWRRdWVyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc3RvcmUvZGF0YS1zb3VyY2UvZGF0YS1zb3VyY2UubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc3RvcmUvZGF0YS1zb3VyY2UvZGF0YS1zb3VyY2Uuc2VsZWN0b3JzJztcbmltcG9ydCB7IExpYnJhcnlUeXBlcyB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc3RvcmUvaW1hZ2UvaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBUb29sYm94TWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3Rvb2xib3gvdG9vbGJveC1tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQWN0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2Rhc2hib2FyZC5hY3Rpb25zJztcbmltcG9ydCB7IERhc2hib2FyZFNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2Rhc2hib2FyZC5zZWxlY3RvcnMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9ubmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc3Vic2NyaXB0aW9ubmVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBXaWRnZXRQbGFjZW1lbnRVdGlscyB9IGZyb20gJy4uL3dpZGdldC1wbGFjZW1lbnQvd2lkZ2V0LXBsYWNlbWVudC51dGlscyc7XG5pbXBvcnQgeyBXaWRnZXRDb250ZXh0TWVudURpc3BsYXlPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbC9kaXNwbGF5LW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfQ09MVU1OU19OVU1CRVIsIERFRkFVTFRfUk9XU19OVU1CRVIgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9kYXNoYm9hcmQuY29udGFudHMnO1xuaW1wb3J0IHsgTWFuaWZlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvbWFuaWZlc3Quc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBXSURHRVRfSEVBREVSX0hFSUdIVCA9IHtcbiAgdmFsdWU6IDMyXG59O1xuXG5leHBvcnQgdHlwZSBIZWFkZXJBY3Rpb24gPSB7XG4gIGljb246IHN0cmluZztcbiAgYWN0aW9uOiAodGhhdDogUHJ5V2lkZ2V0SGVhZGVyQ29tcG9uZW50KSA9PiB2b2lkO1xuICBsYWJlbDogc3RyaW5nO1xuICBkaXNhYmxlZD86ICh0aGF0OiBQcnlXaWRnZXRIZWFkZXJDb21wb25lbnQpID0+IGJvb2xlYW47XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtaGVhZGVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBQcnlXaWRnZXRIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgdGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZU1vZGFsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0ZW1wbGF0ZU1vZGFsITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgndG9nZ2xlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0b2dnbGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdvdmVybGF5TWVudScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgb3ZlcmxheU1lbnUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdvdmVybGF5Q2F0YWxvZycsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgb3ZlcmxheUNhdGFsb2chOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdvdmVybGF5U3BvdCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgb3ZlcmxheVNwb3QhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0b2dnbGVQYW5lbCcpIHRvZ2dsZVBhbmVsITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nyb3NzJykgY3Jvc3MhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndmFsaWRhdGUnKSB2YWxpZGF0ZSE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd2YWxpZGF0ZUNhdGFsb2cnKSB2YWxpZGF0ZUNhdGFsb2chOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY2FuY2VsJykgY2FuY2VsITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nyb3NzQ2F0YWxvZycpIGNyb3NzQ2F0YWxvZyE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdpbnB1dENhdGFsb2cnKSBpbnB1dENhdGFsb2chOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdtZW51TGlzdCcpIG1lbnVMaXN0ITogRWxlbWVudFJlZjtcbiAgbWFuaWZlc3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxXaWRnZXRNYW5pZmVzdCB8IG51bGw+KG51bGwpO1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHBsYWNlczogV2lkZ2V0TWFuaWZlc3RbXSA9IFtdO1xuICBzZWxlY3RlZEl0ZW0/OiBFbGVtZW50IHwgbnVsbDtcbiAgdXNlZERhdGFzb3VyY2VzJDogT2JzZXJ2YWJsZTxEYXRhU291cmNlW10+O1xuICBvcGVuU3ViPzogU3Vic2NyaXB0aW9uO1xuICB0YXJnZXRNYW5pZmVzdD86IERhc2hib2FyZE1hbmlmZXN0O1xuICB6b29tTGV2ZWwgPSAwO1xuICB6b29tV2lkdGggPSAwO1xuICB6b29tSGVpZ2h0ID0gMDtcbiAgbWF4V2lkdGggPSAwO1xuICBtYXhIZWlnaHQgPSAwO1xuICB3aWRnZXRYID0gMDtcbiAgd2lkZ2V0WSA9IDA7XG4gIHdpZGdldFdpZHRoID0gMDtcbiAgd2lkZ2V0SGVpZ2h0ID0gMDtcbiAgY2xpY2tNYXggPSBzaWduYWwoZmFsc2UpO1xuXG4gIEBJbnB1dCgpIHNldCBtYW5pZmVzdChtYW5pZmVzdDogV2lkZ2V0TWFuaWZlc3QgfCBudWxsKSB7XG4gICAgdGhpcy5tYW5pZmVzdCQubmV4dChtYW5pZmVzdCk7XG4gICAgdGhpcy53aWRnZXRYID0gbWFuaWZlc3Q/LmxheW91dC54ITtcbiAgICB0aGlzLndpZGdldFkgPSBtYW5pZmVzdD8ubGF5b3V0LnkhO1xuICAgIHRoaXMud2lkZ2V0V2lkdGggPSBtYW5pZmVzdD8ubGF5b3V0LndpZHRoITtcbiAgICB0aGlzLndpZGdldEhlaWdodCA9IG1hbmlmZXN0Py5sYXlvdXQuaGVpZ2h0ITtcbiAgICB0aGlzLnpvb21XaWR0aCA9IG1hbmlmZXN0Py5sYXlvdXQud2lkdGghO1xuICAgIHRoaXMuem9vbUhlaWdodCA9IG1hbmlmZXN0Py5sYXlvdXQuaGVpZ2h0ITtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvcGVuRGF0YSQob3BlbiQ6IE9ic2VydmFibGU8dm9pZD4gfCBTdWJqZWN0PHZvaWQ+KSB7XG4gICAgdGhpcy5vcGVuU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub3BlblN1YiA9IG9wZW4kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnRvZ2dsZURhdGFzb3VyY2VTZWxlY3Rpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxPcHRpb25zOiBIZWFkZXJBY3Rpb25bXSB8IG51bGwgPSBbXTtcbiAgQElucHV0KCkgaGVhZGVyT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfCB7fSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgZGlzcGxheUNvdW50ID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgbWFuaWZlc3RNb2RpZmllZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyB3aWRnZXRJbmRleDogbnVtYmVyOyBtYW5pZmVzdDogV2lkZ2V0TWFuaWZlc3QgfT4oKTtcblxuICBpc0VkaXQgPSBmYWxzZTtcbiAgY2F0YWxvZ0luZm86IFdpZGdldCA9IHtcbiAgICBpZDogdjQoKSxcbiAgICBpbWFnZTogJycsXG4gICAgbmFtZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIGNvbnRlbnQ6ICcnLFxuICAgIGRhdGFzb3VyY2U6IFtdLFxuICAgIG1vZGlmaWNhdGlvbkRhdGU6ICcnXG4gIH07XG5cbiAgQElucHV0KCkgc2V0IGRhdGFzb3VyY2VJZHMoZGF0YXNvdXJjZUlkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZUlkcyQubmV4dChkYXRhc291cmNlSWRzKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB3aWRnZXRJbmRleCh3aWRnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fd2lkZ2V0SW5kZXgkLm5leHQod2lkZ2V0SW5kZXgpO1xuICAgIHRoaXMuX3dpZGdldEluZGV4ID0gd2lkZ2V0SW5kZXg7XG4gIH1cblxuICBkaXNwbGF5Q29udGV4dE1lbnUkOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBXaWRnZXRDb250ZXh0TWVudURpc3BsYXlPcHRpb25zPjtcbiAgdGFyZ2V0SW5kZXhlcyQ6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICBfd2lkZ2V0SW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBfd2lkZ2V0SW5kZXghOiBudW1iZXI7XG4gIG9wZW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWREYXRhU291cmNlSWRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcblxuICB3aW5kb3dNYW5pZmVzdDogRGFzaGJvYXJkTWFuaWZlc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3aW5kb3dNYW5pZmVzdCQ6IE9ic2VydmFibGU8RGFzaGJvYXJkTWFuaWZlc3Q+O1xuICBwcml2YXRlIG1lbnVSZWY/OiBPdmVybGF5UmVmO1xuICBwcml2YXRlIGNvbWJvUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBjb25maXJtUmVtb3ZlUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBjYXRhbG9nUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBzcG90UmVmPzogT3ZlcmxheVJlZjtcbiAgbWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICB0eXBlOiBMaWJyYXJ5VHlwZXMgPSBMaWJyYXJ5VHlwZXMuSUxMVVNUUkFUSU9OO1xuICB3aWRnZXRzWm9vbWVkOiB7IGluZGV4OiBudW1iZXI7IHpvb206IGJvb2xlYW4gfVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwdWJsaWMgdG9vbGJveE1lbnVTZXJ2aWNlOiBUb29sYm94TWVudVNlcnZpY2UsXG4gICAgcHVibGljIG1hbmlmZXN0U2VydmljZTogTWFuaWZlc3RTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmRhc2hib2FyZENlbGxQYXJhbXMpLnN1YnNjcmliZSgocGFyYW1zKSA9PntcbiAgICAgIHRoaXMubWF4V2lkdGggPSBwYXJhbXMuY29sdW1ucztcbiAgICAgIHRoaXMubWF4SGVpZ2h0ID0gcGFyYW1zLnJvd3M7XG4gICAgfSk7XG4gICAgdGhpcy53aW5kb3dNYW5pZmVzdCQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy53aW5kb3dNYW5pZmVzdClcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSkpO1xuICAgIHRoaXMudGFyZ2V0SW5kZXhlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMudGFyZ2V0VGVuYW50c0luZGV4ZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndpbmRvd01hbmlmZXN0JC5zdWJzY3JpYmUoKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIHRoaXMud2luZG93TWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICAgICAgaWYgKHRoaXMud2luZG93TWFuaWZlc3Qud2lkZ2V0cyAmJiB0aGlzLndpbmRvd01hbmlmZXN0LndpZGdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMud2luZG93TWFuaWZlc3Qud2lkZ2V0cy5mb3JFYWNoKCh3aWRnZXQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLndpZGdldHNab29tZWQucHVzaCh7IGluZGV4LCB6b29tOiB0cnVlIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubWFuaWZlc3RTZXJ2aWNlLndpZGdldFpvb21lZC5zZXQodGhpcy53aWRnZXRzWm9vbWVkKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuZGlzcGxheUNvbnRleHRNZW51JCA9IHRoaXMuc3RvcmVcbiAgICAgIC5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmRpc3BsYXlPcHRpb25zKVxuICAgICAgLnBpcGUobWFwKChvcHRpb25zKSA9PiBvcHRpb25zLndpZGdldENvbnRleHRNZW51KSk7XG5cbiAgICB0aGlzLnVzZWREYXRhc291cmNlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZ2V0RGF0YVNvdXJjZXNTb3J0ZWQpLFxuICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2VJZHMkXG4gICAgXSkucGlwZShtYXAoKFthbGxEc3MsIGRzSWRzXSkgPT4gYWxsRHNzLmZpbHRlcigoZHMpID0+IGRzSWRzLmluY2x1ZGVzKGRzLmlkKSkpKTtcbiAgfVxuXG4gIG9uQXJyb3dVcCgpIHtcbiAgICBjb25zdCBsYXN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbT8ucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGxhc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uQXJyb3dEb3duKCkge1xuICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0/Lm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZmlyc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd01hbmlmZXN0Py5ncmlkPy5sYXlvdXQgPz8gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUw7XG4gIH1cblxuICBnZXQgaGFzR3JpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5b3V0ICE9PSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTDtcbiAgfVxuXG4gIGdldCBjdXJyZW50UGxhY2VtZW50SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2VzLmZpbmRJbmRleChcbiAgICAgIChwbGFjZSkgPT5cbiAgICAgICAgdGhpcy5tYW5pZmVzdCQuZ2V0VmFsdWUoKT8ubGF5b3V0LnggPT09IHBsYWNlLmxheW91dC54ICYmXG4gICAgICAgIHRoaXMubWFuaWZlc3QkLmdldFZhbHVlKCk/LmxheW91dC55ID09PSBwbGFjZS5sYXlvdXQueSAmJlxuICAgICAgICB0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpPy5sYXlvdXQud2lkdGggPT09IHBsYWNlLmxheW91dC53aWR0aCAmJlxuICAgICAgICB0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpPy5sYXlvdXQuaGVpZ2h0ID09PSBwbGFjZS5sYXlvdXQuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIG1lbnVPcGVuKCRldmVudD86IE1vdXNlRXZlbnQsIGZvcmNlT3Blbj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLm1lbnUgPSAhdGhpcy5tZW51O1xuICAgIGNvbnN0IG11c3RPcGVuID0gZm9yY2VPcGVuICE9PSB1bmRlZmluZWQgPyBmb3JjZU9wZW4gOiAhdGhpcy5tZW51UmVmO1xuICAgIGlmIChtdXN0T3Blbikge1xuICAgICAgdGhpcy5tZW51UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnbS1jb250ZXh0LW1lbnUtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCcsXG4gICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy50b2dnbGVQYW5lbClcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9mZnNldFg6IDUwLFxuICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1lbnUnIH0pKTtcbiAgICAgIHRoaXMubWVudVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLm1lbnVPcGVuKCkpO1xuICAgICAgdGhpcy5tZW51UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5vdmVybGF5TWVudSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLm1lbnVMaXN0Py5uYXRpdmVFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0/LmNoaWxkcmVuWzBdIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgICAgICAgIGZvY3VzID8gZm9jdXMuZm9jdXMoKSA6IGZvY3VzQ2hpbGRyZW5FbGVtZW50Py5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVudVJlZj8uZGlzcG9zZSgpO1xuICAgICAgdGhpcy5tZW51UmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1lbnUnIH0pKTtcbiAgICAgIHRoaXMudG9nZ2xlUGFuZWw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRGF0YXNvdXJjZVNlbGVjdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY29tYm9SZWYpIHtcbiAgICAgIHRoaXMuY29tYm9SZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLXdpZGdldF9fY2hvb3NlLXJlc3VsdHNldCddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNvbWJvJyB9KSk7XG4gICAgICB0aGlzLmNvbWJvUmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMudG9nZ2xlRGF0YXNvdXJjZVNlbGVjdGlvbigpKTtcbiAgICAgIHRoaXMuY29tYm9SZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0Q2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21ib1JlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmNvbWJvUmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNvbWJvJyB9KSk7XG4gICAgICB0aGlzLm1lbnVPcGVuKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVJbk5ld1dpbmRvdyh3aWRnZXRJbmRleDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLm1vdmVXaWRnZXQoeyB3aWRnZXRJbmRleCwgdGFyZ2V0SW5kZXggfSkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy50b2dnbGVFZGl0aW9uTW9kZSh7IGZvcmNlOiBmYWxzZSB9KSk7XG4gICAgdGhpcy5tZW51T3BlbigpO1xuICB9XG5cbiAgbWF4aW1pemUod2lkZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuY2xpY2tNYXguc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLnpvb21XaWR0aCAhPT0gdGhpcy5tYXhXaWR0aCkge1xuICAgICAgdGhpcy56b29tTGV2ZWwrKztcbiAgICAgIHRoaXMuem9vbVdpZHRoID0gdGhpcy56b29tV2lkdGggPCB0aGlzLm1heFdpZHRoID8gdGhpcy56b29tV2lkdGggKyAxIDogdGhpcy5tYXhXaWR0aDtcbiAgICAgIHRoaXMuem9vbUhlaWdodCA9IHRoaXMuem9vbVdpZHRoIDwgdGhpcy5tYXhXaWR0aCA/IHRoaXMuem9vbUhlaWdodCArIDEgOiB0aGlzLnpvb21IZWlnaHQ7XG4gICAgICB0aGlzLndpZGdldHNab29tZWQuZm9yRWFjaCgod2lkZ2V0LCBpbmRleCkgPT4ge1xuICAgICAgICB3aWRnZXQuem9vbSA9IGluZGV4ID09PSB3aWRnZXRJbmRleDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYW5pZmVzdFNlcnZpY2Uud2lkZ2V0Wm9vbWVkLnNldCh0aGlzLndpZGdldHNab29tZWQpO1xuICAgICAgdGhpcy5tYW5pZmVzdFNlcnZpY2Uud2lkZ2V0Wm9vbUluLm5leHQoe1xuICAgICAgICBpbmRleDogd2lkZ2V0SW5kZXgsXG4gICAgICAgIHpvb206IHRydWUsXG4gICAgICAgIGxheW91dDoge1xuICAgICAgICAgIHg6IHRoaXMud2lkZ2V0WCxcbiAgICAgICAgICB5OiB0aGlzLndpZGdldFksXG4gICAgICAgICAgd2lkdGg6IHRoaXMuem9vbVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogdGhpcy56b29tSGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG1pbmltaXplKHdpZGdldEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmNsaWNrTWF4LnNldChmYWxzZSk7XG4gICAgaWYgKHRoaXMuem9vbUxldmVsID4gMCkge1xuICAgICAgdGhpcy56b29tTGV2ZWwtLTtcbiAgICAgIHRoaXMuem9vbVdpZHRoID0gdGhpcy56b29tV2lkdGggPiB0aGlzLndpZGdldFdpZHRoID8gdGhpcy56b29tV2lkdGggLSAxIDogdGhpcy53aWRnZXRXaWR0aDtcbiAgICAgIHRoaXMuem9vbUhlaWdodCA9IHRoaXMuem9vbUhlaWdodCA+IHRoaXMud2lkZ2V0SGVpZ2h0ID8gdGhpcy56b29tSGVpZ2h0IC0gMSA6IHRoaXMud2lkZ2V0SGVpZ2h0O1xuICAgICAgdGhpcy5tYW5pZmVzdFNlcnZpY2Uud2lkZ2V0Wm9vbUluLm5leHQoe1xuICAgICAgICBpbmRleDogd2lkZ2V0SW5kZXgsXG4gICAgICAgIHpvb206IHRydWUsXG4gICAgICAgIGxheW91dDoge1xuICAgICAgICAgIHg6IHRoaXMud2lkZ2V0WCxcbiAgICAgICAgICB5OiB0aGlzLndpZGdldFksXG4gICAgICAgICAgd2lkdGg6IHRoaXMuem9vbVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogdGhpcy56b29tSGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuem9vbUxldmVsID09PSAwKSB7XG4gICAgICAgIHRoaXMud2lkZ2V0c1pvb21lZC5mb3JFYWNoKCh3aWRnZXQpID0+IHtcbiAgICAgICAgICB3aWRnZXQuem9vbSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1hbmlmZXN0U2VydmljZS53aWRnZXRab29tZWQuc2V0KHRoaXMud2lkZ2V0c1pvb21lZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZW1pdE1hbmlmZXN0KCkge1xuICAgIHRoaXMubWFuaWZlc3RNb2RpZmllZC5lbWl0KHtcbiAgICAgIHdpZGdldEluZGV4OiB0aGlzLl93aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIC4uLnRoaXMubWFuaWZlc3QkLmdldFZhbHVlKCksXG4gICAgICAgIGRhdGFzb3VyY2U6IHRoaXMuc2VsZWN0ZWREYXRhU291cmNlSWRzJC5nZXRWYWx1ZSgpXG4gICAgICB9IGFzIHVua25vd24gYXMgV2lkZ2V0TWFuaWZlc3RcbiAgICB9KTtcbiAgICB0aGlzLnRvZ2dsZURhdGFzb3VyY2VTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHRvZ2dsZVJlbW92ZUNvbmZpcm0oJGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5jb25maXJtUmVtb3ZlUmVmKSB7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLW1vZGFsLXdyYXBwZXInXSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AnXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tb2RhbCcgfSkpO1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMudG9nZ2xlUmVtb3ZlQ29uZmlybSgpKTtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMudGVtcGxhdGVNb2RhbCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBpZiAoJGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZGl2Lm8tbW9kYWwtd3JhcHBlcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBpZiAoISFwYW5lbCkge1xuICAgICAgICAgIHBhbmVsLnN0eWxlLmxlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCAtIHBhbmVsLmNsaWVudFdpZHRoLCAkZXZlbnQuY2xpZW50WCAtIDMwKSkgKyAncHgnO1xuICAgICAgICAgIHBhbmVsLnN0eWxlLnRvcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCAtIHBhbmVsLmNsaWVudEhlaWdodCwgJGV2ZW50LmNsaWVudFkgLSAxMCkpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3Jvc3M/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB9LCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnRvZ2dsZVBhbmVsPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1vZGFsJyB9KSk7XG4gICAgICB0aGlzLm1lbnVPcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgY29uZmlybVJlbW92ZSgpIHtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICAgIHRoaXMuY2FuY2VsUmVtb3ZlQ29uZmlybSgpO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIGNvbnN0IGxpc3RXaWRnZXRNYW5pZmVzdHMgPSBbLi4uKHRoaXMud2luZG93TWFuaWZlc3QgfHwgeyB3aWRnZXRzOiBbXSB9KS53aWRnZXRzXTtcbiAgICBsaXN0V2lkZ2V0TWFuaWZlc3RzLnNwbGljZSh0aGlzLl93aWRnZXRJbmRleCwgMSk7XG5cbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEYXNoYm9hcmRNYW5pZmVzdCh7XG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgLi4udGhpcy53aW5kb3dNYW5pZmVzdCxcbiAgICAgICAgICB3aWRnZXRzOiBsaXN0V2lkZ2V0TWFuaWZlc3RzXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNhbmNlbFJlbW92ZUNvbmZpcm0oKSB7XG4gICAgdGhpcy5pc0VkaXQgPSBmYWxzZTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSB9KSk7XG4gICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmPy5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMudG9nZ2xlUmVtb3ZlQ29uZmlybSgpKTtcbiAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWY/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZW51UmVmPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5tZW51UmVmID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tZW51JyB9KSk7XG4gIH1cblxuICB0b2dnbGVDYXRhbG9nKCkge1xuICAgIGlmICghdGhpcy5jYXRhbG9nUmVmKSB7XG4gICAgICB0aGlzLmNhdGFsb2dJbmZvID0ge1xuICAgICAgICBpZDogdjQoKSxcbiAgICAgICAgaW1hZ2U6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICBjb250ZW50OiAnJyxcbiAgICAgICAgZGF0YXNvdXJjZTogW10sXG4gICAgICAgIG1vZGlmaWNhdGlvbkRhdGU6ICcnXG4gICAgICB9O1xuICAgICAgdGhpcy5jYXRhbG9nUmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnby1tb2RhbC13cmFwcGVyJ10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctY2F0YWxvZycgfSkpO1xuICAgICAgdGhpcy5jYXRhbG9nUmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMudG9nZ2xlQ2F0YWxvZygpKTtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMub3ZlcmxheUNhdGFsb2csIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3Jvc3NDYXRhbG9nPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgfSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhdGFsb2dSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5jYXRhbG9nUmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNhdGFsb2cnIH0pKTtcbiAgICAgIHRoaXMubWVudU9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBjb25maXJtQ2F0YWxvZygpIHtcbiAgICBpZiAodGhpcy50b29sYm94TWVudVNlcnZpY2UuaXNWYWxpZEZvckNhdGFsb2codGhpcy5jYXRhbG9nSW5mby5uYW1lKSkge1xuICAgICAgdGhpcy50b29sYm94TWVudVNlcnZpY2UuYWRkVG9DYXRhbG9nKFxuICAgICAgICB7XG4gICAgICAgICAgLi4udGhpcy5jYXRhbG9nSW5mbyxcbiAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeSh7IC4uLnRoaXMubWFuaWZlc3QkLmdldFZhbHVlKCksIHRpdGxlOiB0aGlzLmNhdGFsb2dJbmZvLm5hbWUgfSlcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5fd2lkZ2V0SW5kZXhcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudG9nZ2xlQ2F0YWxvZygpO1xuICB9XG5cbiAgZXhlY3V0ZUFjdGlvbihvcHRpb25zOiBIZWFkZXJBY3Rpb24pIHtcbiAgICBvcHRpb25zLmFjdGlvbih0aGlzKTtcbiAgICB0aGlzLm1lbnVPcGVuKCk7XG4gIH1cblxuICBpc0FjdGlvbkRpc2FibGVkKG9wdGlvbjogSGVhZGVyQWN0aW9uKSB7XG4gICAgcmV0dXJuICEhb3B0aW9uPy5kaXNhYmxlZCA/IG9wdGlvbj8uZGlzYWJsZWQodGhpcykgOiBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZUNoYW5nZVNwb3QoKSB7XG4gICAgaWYgKCF0aGlzLnNwb3RSZWYpIHtcbiAgICAgIHRoaXMucGxhY2VzID0gV2lkZ2V0UGxhY2VtZW50VXRpbHMucGxhY2VtZW50T3B0aW9ucyh7IHR5cGU6ICdpY29uJyB9IGFzIFdpZGdldE1hbmlmZXN0LCB0aGlzLmN1cnJlbnRMYXlvdXQpO1xuICAgICAgdGhpcy5wbGFjZXNNYW5pZmVzdCgpO1xuXG4gICAgICB0aGlzLnNwb3RSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLW1vZGFsLXdyYXBwZXInXSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AnXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1zcG90JyB9KSk7XG4gICAgICB0aGlzLnNwb3RSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZUNoYW5nZVNwb3QoKSk7XG4gICAgICB0aGlzLnNwb3RSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLm92ZXJsYXlTcG90LCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zcG90UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuc3BvdFJlZiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1zcG90JyB9KSk7XG4gICAgICB0aGlzLm1lbnVPcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNDcm9zc0VsZW1lbnQoKSB7XG4gICAgdGhpcy5jcm9zcz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICB0aGlzLmNyb3NzQ2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIGZvY3VzVmFsaWRhdGlvbigpIHtcbiAgICB0aGlzLnZhbGlkYXRlQ2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICBpZiAoIXRoaXMudG9vbGJveE1lbnVTZXJ2aWNlLmlzVmFsaWRGb3JDYXRhbG9nKHRoaXMuY2F0YWxvZ0luZm8/Lm5hbWUpKSB7XG4gICAgICB0aGlzLmNhbmNlbD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZT8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIGZvY3VzSW5wdXRDYXRhbG9nKCkge1xuICAgIHRoaXMuaW5wdXRDYXRhbG9nPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgZGlzYWJsZVZhbGlkYXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRvb2xib3hNZW51U2VydmljZS5pc1ZhbGlkRm9yQ2F0YWxvZyh0aGlzLmNhdGFsb2dJbmZvPy5uYW1lKSkge1xuICAgICAgdGhpcy5jcm9zc0NhdGFsb2c/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZGF0YXNvdXJjZXNDaGFuZ2VkKCRldmVudDogc3RyaW5nW10pIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZERhdGFTb3VyY2VJZHMkLmdldFZhbHVlKCkpICE9PSBKU09OLnN0cmluZ2lmeSgkZXZlbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZUlkcyQubmV4dCgkZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlzR2VvKGRzOiBOYW1lZFF1ZXJ5IHwgRGF0YXNldCkge1xuICAgIHJldHVybiBkcy5tZXRhZGF0YT8uZmluZCgobSkgPT4gbS5tZXRhZGF0YURlZi5uYW1lID09PSBHZW9NZXRhZGF0YS5OQU1FU1BBQ0UpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwbGFjZXNNYW5pZmVzdCgpIHtcbiAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5tYW5pZmVzdCQuZ2V0VmFsdWUoKT8ubGF5b3V0ITtcbiAgICB0aGlzLnRhcmdldE1hbmlmZXN0ID0ge1xuICAgICAgd2lkZ2V0czogdGhpcy5wbGFjZXMubWFwKChwbGFjZSwgaWR4KSA9PiAoe1xuICAgICAgICAuLi5wbGFjZSxcbiAgICAgICAgdHlwZTogJ2ZpbGxlcicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBpbmRleDogZXF1YWwoY3VycmVudExheW91dCwgcGxhY2UubGF5b3V0KVxuICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgOiB0aGlzLnBsYWNlcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgKHBsKSA9PlxuICAgICAgICAgICAgICAgICAgcGxhY2UubGF5b3V0LnggPT09IHBsLmxheW91dC54ICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5sYXlvdXQueSA9PT0gcGwubGF5b3V0LnkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLmxheW91dC53aWR0aCA9PT0gcGwubGF5b3V0LndpZHRoICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5sYXlvdXQuaGVpZ2h0ID09PSBwbC5sYXlvdXQuaGVpZ2h0XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgc291cmNlUGxhY2U6IGN1cnJlbnRMYXlvdXQsXG4gICAgICAgICAgdGFyZ2V0UGxhY2U6IHBsYWNlLmxheW91dCxcbiAgICAgICAgICB3aW5kb3dNYW5pZmVzdDogdGhpcy53aW5kb3dNYW5pZmVzdFxuICAgICAgICB9XG4gICAgICB9KSksXG4gICAgICBncmlkOiB7XG4gICAgICAgIGxheW91dDogdGhpcy5jdXJyZW50TGF5b3V0LFxuICAgICAgICByb3dzOiB0aGlzLndpbmRvd01hbmlmZXN0Py5ncmlkPy5yb3dzID8/IERFRkFVTFRfUk9XU19OVU1CRVIsXG4gICAgICAgIGNvbHVtbnM6IHRoaXMud2luZG93TWFuaWZlc3Q/LmdyaWQ/LmNvbHVtbnMgPz8gREVGQVVMVF9DT0xVTU5TX05VTUJFUixcbiAgICAgICAgZ2FwOiAzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vcGVuU3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiby13aWRnZXRfX2hlYWRlclwiPlxuICA8ZGl2IGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudFwiPlxuICAgIEBpZiAoKG1hbmlmZXN0JCB8IGFzeW5jKT8udGl0bGUpIHtcbiAgICAgIDxoMiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3RpdGxlXCI+XG4gICAgICAgIHt7IChtYW5pZmVzdCQgfCBhc3luYyk/LnRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgIH0gQGVsc2Uge1xuICAgICAgQGZvciAoZHMgb2YgdXNlZERhdGFzb3VyY2VzJCB8IGFzeW5jOyB0cmFjayBkcykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fcXVlcnlcIj5cbiAgICAgICAgICBAaWYgKGRzLmlkIHwgdHJhbnNsYXRlSWQ6IHsgdHlwZTogJ2RhdGFzb3VyY2UnLCBvdXRwdXQ6ICdpY29uJywgbm9EZWZhdWx0OiB0cnVlIH0gfCBhc3luYzsgYXMgdXJsKSB7XG4gICAgICAgICAgICA8aW1nIFtoZWlnaHRdPVwiMjBcIiBbc3JjXT1cInVybFwiIFt3aWR0aF09XCIyMFwiIGFsdD1cIlwiIGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fcXVlcnlfX2ljb25cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aDMgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X19xdWVyeV9fbmFtZVwiPnt7IGRzLm5hbWUgfX08L2gzPlxuICAgICAgICAgIEBpZiAoZGlzcGxheUNvdW50ICYmICFpc0dlbyhkcykpIHtcbiAgICAgICAgICAgIDxoMyBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3F1ZXJ5X19uYW1lXCI+XG4gICAgICAgICAgICAgICh7eyBbZHMuaWRdIHwgcmVzdWx0U2V0U2l6ZSB8IGFzeW5jIH19KVxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmICgoKHVzZWREYXRhc291cmNlcyQgfCBhc3luYykgPz8gW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fbm8tZGF0YVwiPlxuICAgICAgICAgIDxoMiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3RpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm5vRGF0YScgfCBpMThuIH19PC9oMj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmICgobWFuaWZlc3QkIHwgYXN5bmMpPy50eXBlID09PSAndmVnYScgJiYgbWFuaWZlc3RTZXJ2aWNlLndpZGdldFpvb21lZCgpW193aWRnZXRJbmRleF0/Lnpvb20pIHtcbiAgICA8ZGl2IGNsYXNzPVwidmVnYS16b29tLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiAoY2xpY2spPVwibWluaW1pemUoX3dpZGdldEluZGV4KVwiIFtjbGFzcy56b29tLWNsaWNrZWRdPVwiIWNsaWNrTWF4KCkgJiYgem9vbUxldmVsICE9PSAwXCI+XG4gICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjI1XCIgW3dpZHRoXT1cIjI1XCIgaWNvblN2Zz1cInJlbW92ZVwiPjwvcHJ5LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKGNsaWNrKT1cIm1heGltaXplKF93aWRnZXRJbmRleClcIiBbY2xhc3Muem9vbS1jbGlja2VkXT1cImNsaWNrTWF4KCkgJiYgem9vbUxldmVsICE9PSAwXCI+XG4gICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjI1XCIgW3dpZHRoXT1cIjI1XCIgaWNvblN2Zz1cImFkZFwiPjwvcHJ5LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKGRpc3BsYXlDb250ZXh0TWVudSQgfCBhc3luYzsgYXMgb3B0aW9ucykge1xuICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJkaWFsb2dfTWVudVwiXG4gICAgICAgIGFyaWEtY29udHJvbHM9XCJtZW51XCJcbiAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJ0aGlzLm1lbnVcIlxuICAgICAgICAjdG9nZ2xlUGFuZWxcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tbW9yZVwiXG4gICAgICAgIChjbGljayk9XCJtZW51T3BlbigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIyNVwiIFt3aWR0aF09XCIyNVwiIGljb25Tdmc9XCJtb3JlX2hvcml6XCI+PC9wcnktaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LmFjdGlvbi5vcGVuTWVudVdpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI292ZXJsYXlNZW51PlxuICBAaWYgKGRpc3BsYXlDb250ZXh0TWVudSQgfCBhc3luYzsgYXMgb3B0aW9ucykge1xuICAgIDxkaXYgY2xhc3M9XCJtLWNvbnRleHQtbWVudVwiPlxuICAgICAgPHVsXG4gICAgICAgIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RcIlxuICAgICAgICAjbWVudUxpc3RcbiAgICAgICAgaWQ9XCJtZW51XCJcbiAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cImRpYWxvZ19NZW51XCJcbiAgICAgICAgKGtleWRvd24uYXJyb3dEb3duKT1cIm9uQXJyb3dEb3duKClcIlxuICAgICAgICAoa2V5ZG93bi5hcnJvd1VwKT1cIm9uQXJyb3dVcCgpXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cIm1lbnVPcGVuKClcIlxuICAgICAgICA+XG4gICAgICAgIEBpZiAob3B0aW9ucyA9PT0gdHJ1ZSB8fCBvcHRpb25zWydkYXRhc291cmNlU2VsZWN0aW9uJ10gPT09IHRydWUpIHtcbiAgICAgICAgICA8bGlcbiAgICAgICAgICAgIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIlxuICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIGlkPVwidG9nZ2xlQWN0aW9uc1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRhc291cmNlU2VsZWN0aW9uKClcIlxuICAgICAgICAgICAgICAqcHJ5QWNjZXNzPVwieyBtb2R1bGU6ICdkYXNoYm9hcmQnLCBwYWdlOiAnd2lkZ2V0JywgYWN0aW9uOiAnc2VsZWN0X25hbWVkX3F1ZXJ5JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0blwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBpY29uU3ZnPVwic3RhY2stZmlsbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLnJlYWRTZWFyY2gnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChvcHRpb25zID09PSB0cnVlIHx8IG9wdGlvbnMhWydwYXJhbWV0ZXJzJ10gPT09IHRydWUpIHtcbiAgICAgICAgICA8bGkgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdF9faXRlbVwiIHJvbGU9XCJub25lXCI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKG9wdGlvbnMgPT09IHRydWUgfHwgb3B0aW9ucyFbJ3dpbmRvdyddID09PSB0cnVlKSB7XG4gICAgICAgICAgQGZvciAodGFyZ2V0SW5kZXggb2YgdGFyZ2V0SW5kZXhlcyQgfCBhc3luYzsgdHJhY2sgdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSW5OZXdXaW5kb3coX3dpZGdldEluZGV4LCB0YXJnZXRJbmRleClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cImxhdW5jaFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAodGFyZ2V0SW5kZXggIT09IC0xID8gJ0Bwcnkud2lkZ2V0LnRhcmdldC5leGlzdGluZycgOiAnQHByeS53aWRnZXQudGFyZ2V0Lm5ldycpXG4gICAgICAgICAgICAgICAgfCBpMThuOiB7IHRhcmdldEluZGV4OiB0aGlzLnRhcmdldEluZGV4ICsgMSB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGhhc0dyaWQgJiYgKG9wdGlvbnMgPT09IHRydWUgfHwgb3B0aW9ucyFbJ2NoYW5nZVNwb3QnXSA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICA8bGlcbiAgICAgICAgICAgIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIlxuICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cIm1lbnVpdGVtXCIgKGNsaWNrKT1cInRvZ2dsZUNoYW5nZVNwb3QoKVwiIGNsYXNzPVwiYS1idG5cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cIm1vdmVcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICA8c3Bhbj57eyAnQHByeS53aWRnZXQudG9vbHRpcC5jaGFuZ2VTcG90JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAob3B0aW9ucyA9PT0gdHJ1ZSB8fCBvcHRpb25zIVsnbWF4aW1pemUnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibWF4aW1pemUoX3dpZGdldEluZGV4KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwibWVudU9wZW4oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBpY29uU3ZnPVwiZnVsbHNjcmVlblwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC50YXJnZXQubWF4aW1pemUnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKG9wdGlvbnMgPT09IHRydWUgfHwgb3B0aW9ucyFbJ2FkZFRvQ2F0YWxvZyddID09PSB0cnVlKSB7XG4gICAgICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cIm1lbnVpdGVtXCIgdGFiaW5kZXg9XCItMVwiIChjbGljayk9XCJ0b2dnbGVDYXRhbG9nKClcIiBjbGFzcz1cImEtYnRuXCI+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cImxpYnJhcnlfYWRkXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuY2F0YWxvZ1dpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKG9wdGlvbnMgPT09IHRydWUgfHwgb3B0aW9ucyFbJ2RlbGV0ZSddID09PSB0cnVlKSB7XG4gICAgICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSZW1vdmVDb25maXJtKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuXCJcbiAgICAgICAgICAgICAgKGtleWRvd24udGFiKT1cIm1lbnVPcGVuKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cImRlbGV0ZVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmRlbGV0ZVdpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChvcHRpb24gb2YgYWRkaXRpb25hbE9wdGlvbnM7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4ZWN1dGVBY3Rpb24ob3B0aW9uKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FjdGlvbkRpc2FibGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgW2ljb25TdmddPVwib3B0aW9uLmljb25cIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfCBpMThuIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICB9XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTW9kYWw+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm8tbW9kYWxcIlxuICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWxSZW1vdmVDb25maXJtKClcIlxuICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2cgY29uZmlybSBkZWxldGUgcHJlc2VudGF0aW9uXCJcbiAgICA+XG4gICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fdGl0bGVcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwiYS1oMlwiIGlkPVwiZGlhbG9nX3RpdGxlXCI+XG4gICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1vZGFsVGl0bGUnIHwgaTE4biB9fVxuICAgICAgICA8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX19jbG9zZVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiICNjcm9zcyAoY2xpY2spPVwiY2FuY2VsUmVtb3ZlQ29uZmlybSgpXCI+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiIFtoZWlnaHRdPVwiMzVcIiBbd2lkdGhdPVwiMzVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS50b29sYm94LmNsb3NlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsUmVtb3ZlQ29uZmlybSgpXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCI+XG4gICAgICAgIHt7ICdAcHJ5LnRvb2xib3gubWFuaWZlc3QuY2xvc2UnIHwgaTE4biB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoY2xpY2spPVwiY29uZmlybVJlbW92ZSgpXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiIChrZXlkb3duLnRhYik9XCJmb2N1c0Nyb3NzRWxlbWVudCgpXCI+XG4gICAgICAgIHt7ICdAcHJ5LnRvb2xib3gubWFuaWZlc3QudmFsaWRhdGUnIHwgaTE4biB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZT5cbiAgPHByeS1kYXRhc291cmNlLXNlbGVjdG9yXG4gICAgW21hbmlmZXN0XT1cIm1hbmlmZXN0JCB8IGFzeW5jXCJcbiAgICAoY2FuY2VsKT1cInRvZ2dsZURhdGFzb3VyY2VTZWxlY3Rpb24oKVwiXG4gICAgKHZhbGlkYXRlZCk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgKG5leHRUYWIpPVwiZm9jdXNJbnB1dENhdGFsb2coKVwiXG4gICAgKHByZXZpb3VzVGFiKT1cImZvY3VzVmFsaWRhdGlvbigpXCJcbiAgICAoaXRlbXNDaGFuZ2VkKT1cImRhdGFzb3VyY2VzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgPjwvcHJ5LWRhdGFzb3VyY2Utc2VsZWN0b3I+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI292ZXJsYXlDYXRhbG9nPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJvLW1vZGFsXCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nX0NhdGFsb2dcIlxuICAgIChrZXlkb3duLmVzY2FwZSk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICAgID5cbiAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX190aXRsZVwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJhLWgyXCI+XG4gICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0LmRlZmluZUNhdGFsb2cnIHwgaTE4biB9fVxuICAgICAgICA8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX19jbG9zZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCJcbiAgICAgICAgICAoa2V5ZG93bi5zaGlmdC50YWIpPVwiZm9jdXNWYWxpZGF0aW9uKClcIlxuICAgICAgICAgICNjcm9zc0NhdGFsb2dcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2F0YWxvZygpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiIFtoZWlnaHRdPVwiMzVcIiBbd2lkdGhdPVwiMzVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS50b29sYm94LmNsb3NlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm5hbWVcIj57eyAnQHByeS50b29sYm94LmNhdGFsb2cubGFiZWwnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJjYXRhbG9nSW5mby5uYW1lXCIgaWQ9XCJuYW1lXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIHJlcXVpcmVkIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImRlc2NyaXB0aW9uXCI+e3sgJ0BwcnkudG9vbGJveC5jYXRhbG9nLmRlc2NyaXB0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiY2F0YWxvZ0luZm8uZGVzY3JpcHRpb25cIiBpZD1cImRlc2NyaXB0aW9uXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIHJlcXVpcmVkIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPHByeS1zZWxlY3QtaW1hZ2VcbiAgICAgICAgW2ljb25VcmxdPVwiY2F0YWxvZ0luZm8uaW1hZ2VcIlxuICAgICAgICAoY2hhbmdlZCk9XCJjYXRhbG9nSW5mby5pbWFnZSA9ICRldmVudFwiXG4gICAgICAgIFttb2RlXT1cInR5cGVcIlxuICAgICAgPjwvcHJ5LXNlbGVjdC1pbWFnZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXBcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICAgICAgICAjY2FuY2VsXG4gICAgICAgIChrZXlkb3duLnRhYik9XCJkaXNhYmxlVmFsaWRhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCJcbiAgICAgICAgPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgI3ZhbGlkYXRlQ2F0YWxvZ1xuICAgICAgICAoY2xpY2spPVwiY29uZmlybUNhdGFsb2coKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdG9vbGJveE1lbnVTZXJ2aWNlLmlzVmFsaWRGb3JDYXRhbG9nKGNhdGFsb2dJbmZvLm5hbWUpXCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiXG4gICAgICAgIChrZXlkb3duLnRhYik9XCJmb2N1c0Nyb3NzRWxlbWVudCgpXCJcbiAgICAgICAgPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LnZhbGlkYXRlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjb3ZlcmxheVNwb3Q+XG4gIDxkaXYgY2xhc3M9XCJvLW1vZGFsIC1wbGFjZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX3RpdGxlXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImEtaDJcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQudG9vbHRpcC5jaGFuZ2VTcG90JyB8IGkxOG4gfX1cbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fY2xvc2VcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9nZ2xlQ2hhbmdlU3BvdCgpXCI+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiIFtoZWlnaHRdPVwiMzVcIiBbd2lkdGhdPVwiMzVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS50b29sYm94LmNsb3NlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHByeS1kYXNoYm9hcmRcbiAgICAgIFtzdGF0aWNEYXNoYm9hcmRdPVwidGFyZ2V0TWFuaWZlc3QhXCJcbiAgICAgIFticmVha3BvaW50XT1cIjEwXCJcbiAgICAgIFtub0JhY2tncm91bmRdPVwidHJ1ZVwiXG4gICAgICBbZm9yY2VNb2RlRWRpdGlvbl09XCJmYWxzZVwiXG4gICAgPjwvcHJ5LWRhc2hib2FyZD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
535
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFxQyxNQUFNLE1BQU0sQ0FBQztBQUNwSCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQXFDLE1BQU0sMkNBQTJDLENBQUM7QUFFbkgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0Q0FBNEMsQ0FB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QUVJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFhTSxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLFdBQVc7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIHNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbC9lczYnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBHZW9NZXRhZGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWwvZGF0YXNldC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGFzaGJvYXJkR3JpZExheW91dCwgRGFzaGJvYXJkTWFuaWZlc3QsIFdpZGdldE1hbmlmZXN0IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbC9tYW5pZmVzdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgV2lkZ2V0IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbC93aWRnZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbmZpZ0FjdGlvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3N0b3JlL2NvbmZpZy9jb25maWcuYWN0aW9ucyc7XG5pbXBvcnQgeyBEYXRhc2V0LCBEYXRhU291cmNlLCBOYW1lZFF1ZXJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9kYXRhLXNvdXJjZS9kYXRhLXNvdXJjZS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VsZWN0b3JzIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9kYXRhLXNvdXJjZS9kYXRhLXNvdXJjZS5zZWxlY3RvcnMnO1xuaW1wb3J0IHsgTGlicmFyeVR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9pbWFnZS9pbWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvb2xib3hNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdG9vbGJveC90b29sYm94LW1lbnUuc2VydmljZSc7XG5pbXBvcnQgeyBEYXNoYm9hcmRBY3Rpb25zIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvZGFzaGJvYXJkLmFjdGlvbnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkU2VsZWN0b3JzIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvZGFzaGJvYXJkLnNlbGVjdG9ycyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9zdWJzY3JpcHRpb25uZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFdpZGdldFBsYWNlbWVudFV0aWxzIH0gZnJvbSAnLi4vd2lkZ2V0LXBsYWNlbWVudC93aWRnZXQtcGxhY2VtZW50LnV0aWxzJztcbmltcG9ydCB7IFdpZGdldENvbnRleHRNZW51RGlzcGxheU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVsL2Rpc3BsYXktb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9DT0xVTU5TX05VTUJFUiwgREVGQVVMVF9ST1dTX05VTUJFUiB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2Rhc2hib2FyZC5jb250YW50cyc7XG5pbXBvcnQgeyBNYW5pZmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9tYW5pZmVzdC5zZXJ2aWNlJztcblxuZXhwb3J0IGNvbnN0IFdJREdFVF9IRUFERVJfSEVJR0hUID0ge1xuICB2YWx1ZTogMzJcbn07XG5cbmV4cG9ydCB0eXBlIEhlYWRlckFjdGlvbiA9IHtcbiAgaWNvbjogc3RyaW5nO1xuICBhY3Rpb246ICh0aGF0OiBQcnlXaWRnZXRIZWFkZXJDb21wb25lbnQpID0+IHZvaWQ7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRpc2FibGVkPzogKHRoYXQ6IFByeVdpZGdldEhlYWRlckNvbXBvbmVudCkgPT4gYm9vbGVhbjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtaGVhZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFByeVdpZGdldEhlYWRlckNvbXBvbmVudCBleHRlbmRzIFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0ZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlTW9kYWwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRlbXBsYXRlTW9kYWwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0b2dnbGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRvZ2dsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlNZW51JywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBvdmVybGF5TWVudSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlDYXRhbG9nJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBvdmVybGF5Q2F0YWxvZyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlTcG90JywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBvdmVybGF5U3BvdCE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ3RvZ2dsZVBhbmVsJykgdG9nZ2xlUGFuZWwhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY3Jvc3MnKSBjcm9zcyE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd2YWxpZGF0ZScpIHZhbGlkYXRlITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3ZhbGlkYXRlQ2F0YWxvZycpIHZhbGlkYXRlQ2F0YWxvZyE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjYW5jZWwnKSBjYW5jZWwhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY3Jvc3NDYXRhbG9nJykgY3Jvc3NDYXRhbG9nITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2lucHV0Q2F0YWxvZycpIGlucHV0Q2F0YWxvZyE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ21lbnVMaXN0JykgbWVudUxpc3QhOiBFbGVtZW50UmVmO1xuICBtYW5pZmVzdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdpZGdldE1hbmlmZXN0IHwgbnVsbD4obnVsbCk7XG4gIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcGxhY2VzOiBXaWRnZXRNYW5pZmVzdFtdID0gW107XG4gIHNlbGVjdGVkSXRlbT86IEVsZW1lbnQgfCBudWxsO1xuICB1c2VkRGF0YXNvdXJjZXMkOiBPYnNlcnZhYmxlPERhdGFTb3VyY2VbXT47XG4gIG9wZW5TdWI/OiBTdWJzY3JpcHRpb247XG4gIHRhcmdldE1hbmlmZXN0PzogRGFzaGJvYXJkTWFuaWZlc3Q7XG4gIHpvb21MZXZlbCA9IDA7XG4gIHpvb21XaWR0aCA9IDA7XG4gIHpvb21IZWlnaHQgPSAwO1xuICBtYXhXaWR0aCA9IDA7XG4gIG1heEhlaWdodCA9IDA7XG4gIHdpZGdldFggPSAwO1xuICB3aWRnZXRZID0gMDtcbiAgd2lkZ2V0V2lkdGggPSAwO1xuICB3aWRnZXRIZWlnaHQgPSAwO1xuICBjbGlja01heCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KCkgc2V0IG1hbmlmZXN0KG1hbmlmZXN0OiBXaWRnZXRNYW5pZmVzdCB8IG51bGwpIHtcbiAgICB0aGlzLm1hbmlmZXN0JC5uZXh0KG1hbmlmZXN0KTtcbiAgICB0aGlzLndpZGdldFggPSBtYW5pZmVzdD8ubGF5b3V0LnghO1xuICAgIHRoaXMud2lkZ2V0WSA9IG1hbmlmZXN0Py5sYXlvdXQueSE7XG4gICAgdGhpcy53aWRnZXRXaWR0aCA9IG1hbmlmZXN0Py5sYXlvdXQud2lkdGghO1xuICAgIHRoaXMud2lkZ2V0SGVpZ2h0ID0gbWFuaWZlc3Q/LmxheW91dC5oZWlnaHQhO1xuICAgIHRoaXMuem9vbVdpZHRoID0gbWFuaWZlc3Q/LmxheW91dC53aWR0aCE7XG4gICAgdGhpcy56b29tSGVpZ2h0ID0gbWFuaWZlc3Q/LmxheW91dC5oZWlnaHQhO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG9wZW5EYXRhJChvcGVuJDogT2JzZXJ2YWJsZTx2b2lkPiB8IFN1YmplY3Q8dm9pZD4pIHtcbiAgICB0aGlzLm9wZW5TdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vcGVuU3ViID0gb3BlbiQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudG9nZ2xlRGF0YXNvdXJjZVNlbGVjdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgQElucHV0KCkgYWRkaXRpb25hbE9wdGlvbnM6IEhlYWRlckFjdGlvbltdIHwgbnVsbCA9IFtdO1xuICBASW5wdXQoKSBoZWFkZXJPcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB8IHt9IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBkaXNwbGF5Q291bnQgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBtYW5pZmVzdE1vZGlmaWVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHdpZGdldEluZGV4OiBudW1iZXI7IG1hbmlmZXN0OiBXaWRnZXRNYW5pZmVzdCB9PigpO1xuXG4gIGlzRWRpdCA9IGZhbHNlO1xuICBjYXRhbG9nSW5mbzogV2lkZ2V0ID0ge1xuICAgIGlkOiB2NCgpLFxuICAgIGltYWdlOiAnJyxcbiAgICBuYW1lOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgY29udGVudDogJycsXG4gICAgZGF0YXNvdXJjZTogW10sXG4gICAgbW9kaWZpY2F0aW9uRGF0ZTogJydcbiAgfTtcblxuICBASW5wdXQoKSBzZXQgZGF0YXNvdXJjZUlkcyhkYXRhc291cmNlSWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhU291cmNlSWRzJC5uZXh0KGRhdGFzb3VyY2VJZHMpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHdpZGdldEluZGV4KHdpZGdldEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl93aWRnZXRJbmRleCQubmV4dCh3aWRnZXRJbmRleCk7XG4gICAgdGhpcy5fd2lkZ2V0SW5kZXggPSB3aWRnZXRJbmRleDtcbiAgfVxuXG4gIGRpc3BsYXlDb250ZXh0TWVudSQ6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFdpZGdldENvbnRleHRNZW51RGlzcGxheU9wdGlvbnM+O1xuICB0YXJnZXRJbmRleGVzJDogT2JzZXJ2YWJsZTxudW1iZXJbXT47XG4gIF93aWRnZXRJbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIF93aWRnZXRJbmRleCE6IG51bWJlcjtcbiAgb3BlbiA9IGZhbHNlO1xuICBzZWxlY3RlZERhdGFTb3VyY2VJZHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuXG4gIHdpbmRvd01hbmlmZXN0OiBEYXNoYm9hcmRNYW5pZmVzdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdpbmRvd01hbmlmZXN0JDogT2JzZXJ2YWJsZTxEYXNoYm9hcmRNYW5pZmVzdD47XG4gIHByaXZhdGUgbWVudVJlZj86IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgY29tYm9SZWY/OiBPdmVybGF5UmVmO1xuICBwcml2YXRlIGNvbmZpcm1SZW1vdmVSZWY/OiBPdmVybGF5UmVmO1xuICBwcml2YXRlIGNhdGFsb2dSZWY/OiBPdmVybGF5UmVmO1xuICBwcml2YXRlIHNwb3RSZWY/OiBPdmVybGF5UmVmO1xuICBtZW51OiBib29sZWFuID0gZmFsc2U7XG4gIHR5cGU6IExpYnJhcnlUeXBlcyA9IExpYnJhcnlUeXBlcy5JTExVU1RSQVRJT047XG4gIHdpZGdldHNab29tZWQ6IHsgaW5kZXg6IG51bWJlcjsgem9vbTogYm9vbGVhbiB9W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHB1YmxpYyB0b29sYm94TWVudVNlcnZpY2U6IFRvb2xib3hNZW51U2VydmljZSxcbiAgICBwdWJsaWMgbWFuaWZlc3RTZXJ2aWNlOiBNYW5pZmVzdFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuZGFzaGJvYXJkQ2VsbFBhcmFtcykuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgIHRoaXMubWF4V2lkdGggPSBwYXJhbXMuY29sdW1ucztcbiAgICAgIHRoaXMubWF4SGVpZ2h0ID0gcGFyYW1zLnJvd3M7XG4gICAgfSk7XG4gICAgdGhpcy53aW5kb3dNYW5pZmVzdCQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy53aW5kb3dNYW5pZmVzdClcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSkpO1xuICAgIHRoaXMudGFyZ2V0SW5kZXhlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMudGFyZ2V0VGVuYW50c0luZGV4ZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndpbmRvd01hbmlmZXN0JC5zdWJzY3JpYmUoKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIHRoaXMud2luZG93TWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICAgICAgaWYgKHRoaXMud2luZG93TWFuaWZlc3Qud2lkZ2V0cyAmJiB0aGlzLndpbmRvd01hbmlmZXN0LndpZGdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMud2luZG93TWFuaWZlc3Qud2lkZ2V0cy5mb3JFYWNoKCh3aWRnZXQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLndpZGdldHNab29tZWQucHVzaCh7IGluZGV4LCB6b29tOiB0cnVlIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubWFuaWZlc3RTZXJ2aWNlLndpZGdldFpvb21lZC5zZXQodGhpcy53aWRnZXRzWm9vbWVkKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuZGlzcGxheUNvbnRleHRNZW51JCA9IHRoaXMuc3RvcmVcbiAgICAgIC5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmRpc3BsYXlPcHRpb25zKVxuICAgICAgLnBpcGUobWFwKChvcHRpb25zKSA9PiBvcHRpb25zLndpZGdldENvbnRleHRNZW51KSk7XG5cbiAgICB0aGlzLnVzZWREYXRhc291cmNlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZ2V0RGF0YVNvdXJjZXNTb3J0ZWQpLFxuICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2VJZHMkXG4gICAgXSkucGlwZShtYXAoKFthbGxEc3MsIGRzSWRzXSkgPT4gYWxsRHNzLmZpbHRlcigoZHMpID0+IGRzSWRzLmluY2x1ZGVzKGRzLmlkKSkpKTtcbiAgfVxuXG4gIG9uQXJyb3dVcCgpIHtcbiAgICBjb25zdCBsYXN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbT8ucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGxhc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uQXJyb3dEb3duKCkge1xuICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0/Lm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZmlyc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd01hbmlmZXN0Py5ncmlkPy5sYXlvdXQgPz8gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUw7XG4gIH1cblxuICBnZXQgaGFzR3JpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5b3V0ICE9PSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTDtcbiAgfVxuXG4gIGdldCBjdXJyZW50UGxhY2VtZW50SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2VzLmZpbmRJbmRleChcbiAgICAgIChwbGFjZSkgPT5cbiAgICAgICAgdGhpcy5tYW5pZmVzdCQuZ2V0VmFsdWUoKT8ubGF5b3V0LnggPT09IHBsYWNlLmxheW91dC54ICYmXG4gICAgICAgIHRoaXMubWFuaWZlc3QkLmdldFZhbHVlKCk/LmxheW91dC55ID09PSBwbGFjZS5sYXlvdXQueSAmJlxuICAgICAgICB0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpPy5sYXlvdXQud2lkdGggPT09IHBsYWNlLmxheW91dC53aWR0aCAmJlxuICAgICAgICB0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpPy5sYXlvdXQuaGVpZ2h0ID09PSBwbGFjZS5sYXlvdXQuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIG1lbnVPcGVuKCRldmVudD86IE1vdXNlRXZlbnQsIGZvcmNlT3Blbj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLm1lbnUgPSAhdGhpcy5tZW51O1xuICAgIGNvbnN0IG11c3RPcGVuID0gZm9yY2VPcGVuICE9PSB1bmRlZmluZWQgPyBmb3JjZU9wZW4gOiAhdGhpcy5tZW51UmVmO1xuICAgIGlmIChtdXN0T3Blbikge1xuICAgICAgdGhpcy5tZW51UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnbS1jb250ZXh0LW1lbnUtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCcsXG4gICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy50b2dnbGVQYW5lbClcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9mZnNldFg6IDUwLFxuICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1lbnUnIH0pKTtcbiAgICAgIHRoaXMubWVudVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLm1lbnVPcGVuKCkpO1xuICAgICAgdGhpcy5tZW51UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5vdmVybGF5TWVudSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLm1lbnVMaXN0Py5uYXRpdmVFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0/LmNoaWxkcmVuWzBdIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgICAgICAgIGZvY3VzID8gZm9jdXMuZm9jdXMoKSA6IGZvY3VzQ2hpbGRyZW5FbGVtZW50Py5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVudVJlZj8uZGlzcG9zZSgpO1xuICAgICAgdGhpcy5tZW51UmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1lbnUnIH0pKTtcbiAgICAgIHRoaXMudG9nZ2xlUGFuZWw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRGF0YXNvdXJjZVNlbGVjdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY29tYm9SZWYpIHtcbiAgICAgIHRoaXMuY29tYm9SZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLXdpZGdldF9fY2hvb3NlLXJlc3VsdHNldCddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNvbWJvJyB9KSk7XG4gICAgICB0aGlzLmNvbWJvUmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMudG9nZ2xlRGF0YXNvdXJjZVNlbGVjdGlvbigpKTtcbiAgICAgIHRoaXMuY29tYm9SZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0Q2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21ib1JlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmNvbWJvUmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNvbWJvJyB9KSk7XG4gICAgICB0aGlzLm1lbnVPcGVuKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVJbk5ld1dpbmRvdyh3aWRnZXRJbmRleDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLm1vdmVXaWRnZXQoeyB3aWRnZXRJbmRleCwgdGFyZ2V0SW5kZXggfSkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy50b2dnbGVFZGl0aW9uTW9kZSh7IGZvcmNlOiBmYWxzZSB9KSk7XG4gICAgdGhpcy5tZW51T3BlbigpO1xuICB9XG5cbiAgaXNXaWRnZXRab29tZWQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0U2VydmljZS53aWRnZXRab29tZWQoKVtpbmRleF0/Lnpvb207XG4gIH1cblxuICBtYXhpbWl6ZSh3aWRnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaXNXaWRnZXRab29tZWQod2lkZ2V0SW5kZXgpKSB7XG4gICAgICB0aGlzLmNsaWNrTWF4LnNldCh0cnVlKTtcbiAgICAgIGlmICh0aGlzLnpvb21XaWR0aCAhPT0gdGhpcy5tYXhXaWR0aCkge1xuICAgICAgICB0aGlzLnpvb21MZXZlbCsrO1xuICAgICAgICB0aGlzLnpvb21XaWR0aCA9IHRoaXMuem9vbVdpZHRoIDwgdGhpcy5tYXhXaWR0aCA/IHRoaXMuem9vbVdpZHRoICsgMSA6IHRoaXMubWF4V2lkdGg7XG4gICAgICAgIHRoaXMuem9vbUhlaWdodCA9IHRoaXMuem9vbVdpZHRoIDwgdGhpcy5tYXhXaWR0aCA/IHRoaXMuem9vbUhlaWdodCArIDEgOiB0aGlzLnpvb21IZWlnaHQ7XG4gICAgICAgIHRoaXMud2lkZ2V0c1pvb21lZC5mb3JFYWNoKCh3aWRnZXQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgd2lkZ2V0Lnpvb20gPSBpbmRleCA9PT0gd2lkZ2V0SW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1hbmlmZXN0U2VydmljZS53aWRnZXRab29tZWQuc2V0KHRoaXMud2lkZ2V0c1pvb21lZCk7XG4gICAgICAgIHRoaXMubWFuaWZlc3RTZXJ2aWNlLndpZGdldFpvb21Jbi5uZXh0KHtcbiAgICAgICAgICBpbmRleDogd2lkZ2V0SW5kZXgsXG4gICAgICAgICAgem9vbTogdHJ1ZSxcbiAgICAgICAgICBsYXlvdXQ6IHtcbiAgICAgICAgICAgIHg6IHRoaXMud2lkZ2V0WCxcbiAgICAgICAgICAgIHk6IHRoaXMud2lkZ2V0WSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnpvb21XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy56b29tSGVpZ2h0XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBtaW5pbWl6ZSh3aWRnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaXNXaWRnZXRab29tZWQod2lkZ2V0SW5kZXgpKSB7XG4gICAgICB0aGlzLmNsaWNrTWF4LnNldChmYWxzZSk7XG4gICAgICBpZiAodGhpcy56b29tTGV2ZWwgPiAwKSB7XG4gICAgICAgIHRoaXMuem9vbUxldmVsLS07XG4gICAgICAgIHRoaXMuem9vbVdpZHRoID0gdGhpcy56b29tV2lkdGggPiB0aGlzLndpZGdldFdpZHRoID8gdGhpcy56b29tV2lkdGggLSAxIDogdGhpcy53aWRnZXRXaWR0aDtcbiAgICAgICAgdGhpcy56b29tSGVpZ2h0ID0gdGhpcy56b29tSGVpZ2h0ID4gdGhpcy53aWRnZXRIZWlnaHQgPyB0aGlzLnpvb21IZWlnaHQgLSAxIDogdGhpcy53aWRnZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubWFuaWZlc3RTZXJ2aWNlLndpZGdldFpvb21Jbi5uZXh0KHtcbiAgICAgICAgICBpbmRleDogd2lkZ2V0SW5kZXgsXG4gICAgICAgICAgem9vbTogdHJ1ZSxcbiAgICAgICAgICBsYXlvdXQ6IHtcbiAgICAgICAgICAgIHg6IHRoaXMud2lkZ2V0WCxcbiAgICAgICAgICAgIHk6IHRoaXMud2lkZ2V0WSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnpvb21XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy56b29tSGVpZ2h0XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuem9vbUxldmVsID09PSAwKSB7XG4gICAgICAgICAgdGhpcy53aWRnZXRzWm9vbWVkLmZvckVhY2goKHdpZGdldCkgPT4ge1xuICAgICAgICAgICAgd2lkZ2V0Lnpvb20gPSB0cnVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubWFuaWZlc3RTZXJ2aWNlLndpZGdldFpvb21lZC5zZXQodGhpcy53aWRnZXRzWm9vbWVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy5fd2lkZ2V0SW5kZXgsXG4gICAgICBtYW5pZmVzdDoge1xuICAgICAgICAuLi50aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpLFxuICAgICAgICBkYXRhc291cmNlOiB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZUlkcyQuZ2V0VmFsdWUoKVxuICAgICAgfSBhcyB1bmtub3duIGFzIFdpZGdldE1hbmlmZXN0XG4gICAgfSk7XG4gICAgdGhpcy50b2dnbGVEYXRhc291cmNlU2VsZWN0aW9uKCk7XG4gIH1cblxuICB0b2dnbGVSZW1vdmVDb25maXJtKCRldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlybVJlbW92ZVJlZikge1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnby1tb2RhbC13cmFwcGVyJ10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctbW9kYWwnIH0pKTtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnRvZ2dsZVJlbW92ZUNvbmZpcm0oKSk7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlTW9kYWwsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5vLW1vZGFsLXdyYXBwZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgaWYgKCEhcGFuZWwpIHtcbiAgICAgICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4od2luZG93LmlubmVyV2lkdGggLSBwYW5lbC5jbGllbnRXaWR0aCwgJGV2ZW50LmNsaWVudFggLSAzMCkpICsgJ3B4JztcbiAgICAgICAgICBwYW5lbC5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQgLSBwYW5lbC5jbGllbnRIZWlnaHQsICRldmVudC5jbGllbnRZIC0gMTApKSArICdweCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNyb3NzPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgfSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy50b2dnbGVQYW5lbD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tb2RhbCcgfSkpO1xuICAgICAgdGhpcy5tZW51T3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpcm1SZW1vdmUoKSB7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLmNhbmNlbFJlbW92ZUNvbmZpcm0oKTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBjb25zdCBsaXN0V2lkZ2V0TWFuaWZlc3RzID0gWy4uLih0aGlzLndpbmRvd01hbmlmZXN0IHx8IHsgd2lkZ2V0czogW10gfSkud2lkZ2V0c107XG4gICAgbGlzdFdpZGdldE1hbmlmZXN0cy5zcGxpY2UodGhpcy5fd2lkZ2V0SW5kZXgsIDEpO1xuXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkTWFuaWZlc3Qoe1xuICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgIC4uLnRoaXMud2luZG93TWFuaWZlc3QsXG4gICAgICAgICAgd2lkZ2V0czogbGlzdFdpZGdldE1hbmlmZXN0c1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjYW5jZWxSZW1vdmVDb25maXJtKCkge1xuICAgIHRoaXMuaXNFZGl0ID0gZmFsc2U7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSkpO1xuICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZj8uYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZVJlbW92ZUNvbmZpcm0oKSk7XG4gICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubWVudVJlZj8uZGlzcG9zZSgpO1xuICAgIHRoaXMubWVudVJlZiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctbWVudScgfSkpO1xuICB9XG5cbiAgdG9nZ2xlQ2F0YWxvZygpIHtcbiAgICBpZiAoIXRoaXMuY2F0YWxvZ1JlZikge1xuICAgICAgdGhpcy5jYXRhbG9nSW5mbyA9IHtcbiAgICAgICAgaWQ6IHY0KCksXG4gICAgICAgIGltYWdlOiAnJyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgY29udGVudDogJycsXG4gICAgICAgIGRhdGFzb3VyY2U6IFtdLFxuICAgICAgICBtb2RpZmljYXRpb25EYXRlOiAnJ1xuICAgICAgfTtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ28tbW9kYWwtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNhdGFsb2cnIH0pKTtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnRvZ2dsZUNhdGFsb2coKSk7XG4gICAgICB0aGlzLmNhdGFsb2dSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLm92ZXJsYXlDYXRhbG9nLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNyb3NzQ2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXRhbG9nUmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1jYXRhbG9nJyB9KSk7XG4gICAgICB0aGlzLm1lbnVPcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgY29uZmlybUNhdGFsb2coKSB7XG4gICAgaWYgKHRoaXMudG9vbGJveE1lbnVTZXJ2aWNlLmlzVmFsaWRGb3JDYXRhbG9nKHRoaXMuY2F0YWxvZ0luZm8ubmFtZSkpIHtcbiAgICAgIHRoaXMudG9vbGJveE1lbnVTZXJ2aWNlLmFkZFRvQ2F0YWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIC4uLnRoaXMuY2F0YWxvZ0luZm8sXG4gICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoeyAuLi50aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpLCB0aXRsZTogdGhpcy5jYXRhbG9nSW5mby5uYW1lIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuX3dpZGdldEluZGV4XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUNhdGFsb2coKTtcbiAgfVxuXG4gIGV4ZWN1dGVBY3Rpb24ob3B0aW9uczogSGVhZGVyQWN0aW9uKSB7XG4gICAgb3B0aW9ucy5hY3Rpb24odGhpcyk7XG4gICAgdGhpcy5tZW51T3BlbigpO1xuICB9XG5cbiAgaXNBY3Rpb25EaXNhYmxlZChvcHRpb246IEhlYWRlckFjdGlvbikge1xuICAgIHJldHVybiAhIW9wdGlvbj8uZGlzYWJsZWQgPyBvcHRpb24/LmRpc2FibGVkKHRoaXMpIDogZmFsc2U7XG4gIH1cblxuICB0b2dnbGVDaGFuZ2VTcG90KCkge1xuICAgIGlmICghdGhpcy5zcG90UmVmKSB7XG4gICAgICB0aGlzLnBsYWNlcyA9IFdpZGdldFBsYWNlbWVudFV0aWxzLnBsYWNlbWVudE9wdGlvbnMoeyB0eXBlOiAnaWNvbicgfSBhcyBXaWRnZXRNYW5pZmVzdCwgdGhpcy5jdXJyZW50TGF5b3V0KTtcbiAgICAgIHRoaXMucGxhY2VzTWFuaWZlc3QoKTtcblxuICAgICAgdGhpcy5zcG90UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnby1tb2RhbC13cmFwcGVyJ10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctc3BvdCcgfSkpO1xuICAgICAgdGhpcy5zcG90UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGVDaGFuZ2VTcG90KCkpO1xuICAgICAgdGhpcy5zcG90UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5vdmVybGF5U3BvdCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3BvdFJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLnNwb3RSZWYgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctc3BvdCcgfSkpO1xuICAgICAgdGhpcy5tZW51T3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzQ3Jvc3NFbGVtZW50KCkge1xuICAgIHRoaXMuY3Jvc3M/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgdGhpcy5jcm9zc0NhdGFsb2c/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cblxuICBmb2N1c1ZhbGlkYXRpb24oKSB7XG4gICAgdGhpcy52YWxpZGF0ZUNhdGFsb2c/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgaWYgKCF0aGlzLnRvb2xib3hNZW51U2VydmljZS5pc1ZhbGlkRm9yQ2F0YWxvZyh0aGlzLmNhdGFsb2dJbmZvPy5uYW1lKSkge1xuICAgICAgdGhpcy5jYW5jZWw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGU/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cblxuICBmb2N1c0lucHV0Q2F0YWxvZygpIHtcbiAgICB0aGlzLmlucHV0Q2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIGRpc2FibGVWYWxpZGF0aW9uKCkge1xuICAgIGlmICghdGhpcy50b29sYm94TWVudVNlcnZpY2UuaXNWYWxpZEZvckNhdGFsb2codGhpcy5jYXRhbG9nSW5mbz8ubmFtZSkpIHtcbiAgICAgIHRoaXMuY3Jvc3NDYXRhbG9nPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGRhdGFzb3VyY2VzQ2hhbmdlZCgkZXZlbnQ6IHN0cmluZ1tdKSB7XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWREYXRhU291cmNlSWRzJC5nZXRWYWx1ZSgpKSAhPT0gSlNPTi5zdHJpbmdpZnkoJGV2ZW50KSkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2VJZHMkLm5leHQoJGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBpc0dlbyhkczogTmFtZWRRdWVyeSB8IERhdGFzZXQpIHtcbiAgICByZXR1cm4gZHMubWV0YWRhdGE/LmZpbmQoKG0pID0+IG0ubWV0YWRhdGFEZWYubmFtZSA9PT0gR2VvTWV0YWRhdGEuTkFNRVNQQUNFKSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcGxhY2VzTWFuaWZlc3QoKSB7XG4gICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMubWFuaWZlc3QkLmdldFZhbHVlKCk/LmxheW91dCE7XG4gICAgdGhpcy50YXJnZXRNYW5pZmVzdCA9IHtcbiAgICAgIHdpZGdldHM6IHRoaXMucGxhY2VzLm1hcCgocGxhY2UsIGlkeCkgPT4gKHtcbiAgICAgICAgLi4ucGxhY2UsXG4gICAgICAgIHR5cGU6ICdmaWxsZXInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgaW5kZXg6IGVxdWFsKGN1cnJlbnRMYXlvdXQsIHBsYWNlLmxheW91dClcbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogdGhpcy5wbGFjZXMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgIChwbCkgPT5cbiAgICAgICAgICAgICAgICAgIHBsYWNlLmxheW91dC54ID09PSBwbC5sYXlvdXQueCAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UubGF5b3V0LnkgPT09IHBsLmxheW91dC55ICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5sYXlvdXQud2lkdGggPT09IHBsLmxheW91dC53aWR0aCAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UubGF5b3V0LmhlaWdodCA9PT0gcGwubGF5b3V0LmhlaWdodFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIHNvdXJjZVBsYWNlOiBjdXJyZW50TGF5b3V0LFxuICAgICAgICAgIHRhcmdldFBsYWNlOiBwbGFjZS5sYXlvdXQsXG4gICAgICAgICAgd2luZG93TWFuaWZlc3Q6IHRoaXMud2luZG93TWFuaWZlc3RcbiAgICAgICAgfVxuICAgICAgfSkpLFxuICAgICAgZ3JpZDoge1xuICAgICAgICBsYXlvdXQ6IHRoaXMuY3VycmVudExheW91dCxcbiAgICAgICAgcm93czogdGhpcy53aW5kb3dNYW5pZmVzdD8uZ3JpZD8ucm93cyA/PyBERUZBVUxUX1JPV1NfTlVNQkVSLFxuICAgICAgICBjb2x1bW5zOiB0aGlzLndpbmRvd01hbmlmZXN0Py5ncmlkPy5jb2x1bW5zID8/IERFRkFVTFRfQ09MVU1OU19OVU1CRVIsXG4gICAgICAgIGdhcDogM1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub3BlblN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJcIj5cbiAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRcIj5cbiAgICBAaWYgKChtYW5pZmVzdCQgfCBhc3luYyk/LnRpdGxlKSB7XG4gICAgICA8aDIgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X190aXRsZVwiPlxuICAgICAgICB7eyAobWFuaWZlc3QkIHwgYXN5bmMpPy50aXRsZSB9fVxuICAgICAgPC9oMj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBmb3IgKGRzIG9mIHVzZWREYXRhc291cmNlcyQgfCBhc3luYzsgdHJhY2sgZHMpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3F1ZXJ5XCI+XG4gICAgICAgICAgQGlmIChkcy5pZCB8IHRyYW5zbGF0ZUlkOiB7IHR5cGU6ICdkYXRhc291cmNlJywgb3V0cHV0OiAnaWNvbicsIG5vRGVmYXVsdDogdHJ1ZSB9IHwgYXN5bmM7IGFzIHVybCkge1xuICAgICAgICAgICAgPGltZyBbaGVpZ2h0XT1cIjIwXCIgW3NyY109XCJ1cmxcIiBbd2lkdGhdPVwiMjBcIiBhbHQ9XCJcIiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3F1ZXJ5X19pY29uXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGgzIGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fcXVlcnlfX25hbWVcIj57eyBkcy5uYW1lIH19PC9oMz5cbiAgICAgICAgICBAaWYgKGRpc3BsYXlDb3VudCAmJiAhaXNHZW8oZHMpKSB7XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X19xdWVyeV9fbmFtZVwiPih7eyBbZHMuaWRdIHwgcmVzdWx0U2V0U2l6ZSB8IGFzeW5jIH19KTwvaDM+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoKCh1c2VkRGF0YXNvdXJjZXMkIHwgYXN5bmMpID8/IFtdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX25vLWRhdGFcIj5cbiAgICAgICAgICA8aDIgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X190aXRsZVwiPnt7ICdAcHJ5LndpZGdldC5ub0RhdGEnIHwgaTE4biB9fTwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoKG1hbmlmZXN0JCB8IGFzeW5jKT8udHlwZSA9PT0gJ3ZlZ2EnKSB7XG4gICAgPGRpdiBjbGFzcz1cInZlZ2Etem9vbS1jb250YWluZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKGNsaWNrKT1cIm1pbmltaXplKF93aWRnZXRJbmRleClcIlxuICAgICAgICBbY2xhc3Muem9vbS1jbGlja2VkXT1cIiFjbGlja01heCgpICYmIHpvb21MZXZlbCAhPT0gMFwiXG4gICAgICAgIFtjbGFzcy56b29tLWRpc2FibGVkXT1cInpvb21MZXZlbCA9PT0gMCB8fCAhaXNXaWRnZXRab29tZWQoX3dpZGdldEluZGV4KVwiXG4gICAgICA+XG4gICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjI1XCIgW3dpZHRoXT1cIjI1XCIgaWNvblN2Zz1cInJlbW92ZVwiPjwvcHJ5LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKGNsaWNrKT1cIm1heGltaXplKF93aWRnZXRJbmRleClcIlxuICAgICAgICBbY2xhc3Muem9vbS1jbGlja2VkXT1cImNsaWNrTWF4KCkgJiYgem9vbUxldmVsICE9PSAwICYmIHRoaXMuem9vbVdpZHRoICE9PSB0aGlzLm1heFdpZHRoXCJcbiAgICAgICAgW2NsYXNzLnpvb20tZGlzYWJsZWRdPVwidGhpcy56b29tV2lkdGggPT09IHRoaXMubWF4V2lkdGggfHwgIWlzV2lkZ2V0Wm9vbWVkKF93aWRnZXRJbmRleClcIlxuICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIyNVwiIFt3aWR0aF09XCIyNVwiIGljb25Tdmc9XCJhZGRcIj48L3ByeS1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChkaXNwbGF5Q29udGV4dE1lbnUkIHwgYXN5bmM7IGFzIG9wdGlvbnMpIHtcbiAgICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXBcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwiZGlhbG9nX01lbnVcIlxuICAgICAgICBhcmlhLWNvbnRyb2xzPVwibWVudVwiXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidGhpcy5tZW51XCJcbiAgICAgICAgI3RvZ2dsZVBhbmVsXG4gICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLW1vcmVcIlxuICAgICAgICAoY2xpY2spPVwibWVudU9wZW4oJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjI1XCIgW3dpZHRoXT1cIjI1XCIgaWNvblN2Zz1cIm1vcmVfaG9yaXpcIj48L3ByeS1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLm9wZW5NZW51V2lkZ2V0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjb3ZlcmxheU1lbnU+XG4gIEBpZiAoZGlzcGxheUNvbnRleHRNZW51JCB8IGFzeW5jOyBhcyBvcHRpb25zKSB7XG4gICAgPGRpdiBjbGFzcz1cIm0tY29udGV4dC1tZW51XCI+XG4gICAgICA8dWxcbiAgICAgICAgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdFwiXG4gICAgICAgICNtZW51TGlzdFxuICAgICAgICBpZD1cIm1lbnVcIlxuICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nX01lbnVcIlxuICAgICAgICAoa2V5ZG93bi5hcnJvd0Rvd24pPVwib25BcnJvd0Rvd24oKVwiXG4gICAgICAgIChrZXlkb3duLmFycm93VXApPVwib25BcnJvd1VwKClcIlxuICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwibWVudU9wZW4oKVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAob3B0aW9ucyA9PT0gdHJ1ZSB8fCBvcHRpb25zWydkYXRhc291cmNlU2VsZWN0aW9uJ10gPT09IHRydWUpIHtcbiAgICAgICAgICA8bGkgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdF9faXRlbVwiIHJvbGU9XCJub25lXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgaWQ9XCJ0b2dnbGVBY3Rpb25zXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURhdGFzb3VyY2VTZWxlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2Rhc2hib2FyZCcsIHBhZ2U6ICd3aWRnZXQnLCBhY3Rpb246ICdzZWxlY3RfbmFtZWRfcXVlcnknIH1cIlxuICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBpY29uU3ZnPVwic3RhY2stZmlsbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLnJlYWRTZWFyY2gnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChvcHRpb25zID09PSB0cnVlIHx8IG9wdGlvbnMhWydwYXJhbWV0ZXJzJ10gPT09IHRydWUpIHtcbiAgICAgICAgICA8bGkgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdF9faXRlbVwiIHJvbGU9XCJub25lXCI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKG9wdGlvbnMgPT09IHRydWUgfHwgb3B0aW9ucyFbJ3dpbmRvdyddID09PSB0cnVlKSB7XG4gICAgICAgICAgQGZvciAodGFyZ2V0SW5kZXggb2YgdGFyZ2V0SW5kZXhlcyQgfCBhc3luYzsgdHJhY2sgdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSW5OZXdXaW5kb3coX3dpZGdldEluZGV4LCB0YXJnZXRJbmRleClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxN1wiIFt3aWR0aF09XCIxN1wiIGljb25Tdmc9XCJsYXVuY2hcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAodGFyZ2V0SW5kZXggIT09IC0xID8gJ0Bwcnkud2lkZ2V0LnRhcmdldC5leGlzdGluZycgOiAnQHByeS53aWRnZXQudGFyZ2V0Lm5ldycpXG4gICAgICAgICAgICAgICAgICAgIHwgaTE4bjogeyB0YXJnZXRJbmRleDogdGhpcy50YXJnZXRJbmRleCArIDEgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChoYXNHcmlkICYmIChvcHRpb25zID09PSB0cnVlIHx8IG9wdGlvbnMhWydjaGFuZ2VTcG90J10gPT09IHRydWUpKSB7XG4gICAgICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cIm1lbnVpdGVtXCIgKGNsaWNrKT1cInRvZ2dsZUNoYW5nZVNwb3QoKVwiIGNsYXNzPVwiYS1idG5cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cIm1vdmVcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICA8c3Bhbj57eyAnQHByeS53aWRnZXQudG9vbHRpcC5jaGFuZ2VTcG90JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAob3B0aW9ucyA9PT0gdHJ1ZSB8fCBvcHRpb25zIVsnbWF4aW1pemUnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibWF4aW1pemUoX3dpZGdldEluZGV4KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwibWVudU9wZW4oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cImZ1bGxzY3JlZW5cIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQudGFyZ2V0Lm1heGltaXplJyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChvcHRpb25zID09PSB0cnVlIHx8IG9wdGlvbnMhWydhZGRUb0NhdGFsb2cnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJtZW51aXRlbVwiIHRhYmluZGV4PVwiLTFcIiAoY2xpY2spPVwidG9nZ2xlQ2F0YWxvZygpXCIgY2xhc3M9XCJhLWJ0blwiPlxuICAgICAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxN1wiIFt3aWR0aF09XCIxN1wiIGljb25Tdmc9XCJsaWJyYXJ5X2FkZFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmNhdGFsb2dXaWRnZXQnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChvcHRpb25zID09PSB0cnVlIHx8IG9wdGlvbnMhWydkZWxldGUnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmVtb3ZlQ29uZmlybSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0blwiXG4gICAgICAgICAgICAgIChrZXlkb3duLnRhYik9XCJtZW51T3BlbigpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBpY29uU3ZnPVwiZGVsZXRlXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuZGVsZXRlV2lkZ2V0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKG9wdGlvbiBvZiBhZGRpdGlvbmFsT3B0aW9uczsgdHJhY2sgb3B0aW9uKSB7XG4gICAgICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0blwiXG4gICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0ZUFjdGlvbihvcHRpb24pXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQWN0aW9uRGlzYWJsZWQob3B0aW9uKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgW2ljb25TdmddPVwib3B0aW9uLmljb25cIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfCBpMThuIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICB9XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTW9kYWw+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm8tbW9kYWxcIlxuICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWxSZW1vdmVDb25maXJtKClcIlxuICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2cgY29uZmlybSBkZWxldGUgcHJlc2VudGF0aW9uXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX3RpdGxlXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImEtaDJcIiBpZD1cImRpYWxvZ190aXRsZVwiPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tb2RhbFRpdGxlJyB8IGkxOG4gfX1cbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fY2xvc2VcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIiAjY3Jvc3MgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiPlxuICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIiBbaGVpZ2h0XT1cIjM1XCIgW3dpZHRoXT1cIjM1XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkudG9vbGJveC5jbG9zZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cImNvbmZpcm1SZW1vdmUoKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIiAoa2V5ZG93bi50YWIpPVwiZm9jdXNDcm9zc0VsZW1lbnQoKVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LnZhbGlkYXRlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGU+XG4gIDxwcnktZGF0YXNvdXJjZS1zZWxlY3RvclxuICAgIFttYW5pZmVzdF09XCJtYW5pZmVzdCQgfCBhc3luY1wiXG4gICAgKGNhbmNlbCk9XCJ0b2dnbGVEYXRhc291cmNlU2VsZWN0aW9uKClcIlxuICAgICh2YWxpZGF0ZWQpPVwiZW1pdE1hbmlmZXN0KClcIlxuICAgIChuZXh0VGFiKT1cImZvY3VzSW5wdXRDYXRhbG9nKClcIlxuICAgIChwcmV2aW91c1RhYik9XCJmb2N1c1ZhbGlkYXRpb24oKVwiXG4gICAgKGl0ZW1zQ2hhbmdlZCk9XCJkYXRhc291cmNlc0NoYW5nZWQoJGV2ZW50KVwiXG4gID48L3ByeS1kYXRhc291cmNlLXNlbGVjdG9yPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNvdmVybGF5Q2F0YWxvZz5cbiAgPGRpdlxuICAgIGNsYXNzPVwiby1tb2RhbFwiXG4gICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgIGFyaWEtbGFiZWxsZWRieT1cImRpYWxvZ19DYXRhbG9nXCJcbiAgICAoa2V5ZG93bi5lc2NhcGUpPVwidG9nZ2xlQ2F0YWxvZygpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX3RpdGxlXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImEtaDJcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQuZGVmaW5lQ2F0YWxvZycgfCBpMThuIH19XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX2Nsb3NlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJmb2N1c1ZhbGlkYXRpb24oKVwiXG4gICAgICAgICAgI2Nyb3NzQ2F0YWxvZ1xuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiIFtoZWlnaHRdPVwiMzVcIiBbd2lkdGhdPVwiMzVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS50b29sYm94LmNsb3NlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm5hbWVcIj57eyAnQHByeS50b29sYm94LmNhdGFsb2cubGFiZWwnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJjYXRhbG9nSW5mby5uYW1lXCIgaWQ9XCJuYW1lXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIHJlcXVpcmVkIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImRlc2NyaXB0aW9uXCI+e3sgJ0BwcnkudG9vbGJveC5jYXRhbG9nLmRlc2NyaXB0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiY2F0YWxvZ0luZm8uZGVzY3JpcHRpb25cIiBpZD1cImRlc2NyaXB0aW9uXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIHJlcXVpcmVkIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPHByeS1zZWxlY3QtaW1hZ2VcbiAgICAgICAgW2ljb25VcmxdPVwiY2F0YWxvZ0luZm8uaW1hZ2VcIlxuICAgICAgICAoY2hhbmdlZCk9XCJjYXRhbG9nSW5mby5pbWFnZSA9ICRldmVudFwiXG4gICAgICAgIFttb2RlXT1cInR5cGVcIlxuICAgICAgPjwvcHJ5LXNlbGVjdC1pbWFnZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXBcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICAgICAgICAjY2FuY2VsXG4gICAgICAgIChrZXlkb3duLnRhYik9XCJkaXNhYmxlVmFsaWRhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCJcbiAgICAgID5cbiAgICAgICAge3sgJ0BwcnkudG9vbGJveC5tYW5pZmVzdC5jbG9zZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICN2YWxpZGF0ZUNhdGFsb2dcbiAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1DYXRhbG9nKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXRvb2xib3hNZW51U2VydmljZS5pc1ZhbGlkRm9yQ2F0YWxvZyhjYXRhbG9nSW5mby5uYW1lKVwiXG4gICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIlxuICAgICAgICAoa2V5ZG93bi50YWIpPVwiZm9jdXNDcm9zc0VsZW1lbnQoKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdAcHJ5LnRvb2xib3gubWFuaWZlc3QudmFsaWRhdGUnIHwgaTE4biB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNvdmVybGF5U3BvdD5cbiAgPGRpdiBjbGFzcz1cIm8tbW9kYWwgLXBsYWNlXCI+XG4gICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fdGl0bGVcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwiYS1oMlwiPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC50b29sdGlwLmNoYW5nZVNwb3QnIHwgaTE4biB9fVxuICAgICAgICA8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX19jbG9zZVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiIChjbGljayk9XCJ0b2dnbGVDaGFuZ2VTcG90KClcIj5cbiAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCIgW2hlaWdodF09XCIzNVwiIFt3aWR0aF09XCIzNVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LnRvb2xib3guY2xvc2UnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8cHJ5LWRhc2hib2FyZFxuICAgICAgW3N0YXRpY0Rhc2hib2FyZF09XCJ0YXJnZXRNYW5pZmVzdCFcIlxuICAgICAgW2JyZWFrcG9pbnRdPVwiMTBcIlxuICAgICAgW25vQmFja2dyb3VuZF09XCJ0cnVlXCJcbiAgICAgIFtmb3JjZU1vZGVFZGl0aW9uXT1cImZhbHNlXCJcbiAgICA+PC9wcnktZGFzaGJvYXJkPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|