@provoly/dashboard 0.12.6 → 0.12.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin/components/admin-classes/admin-classes-select/admin-classes-select.component.d.ts +2 -1
- package/admin/components/admin-classes/store/admin-class.effects.d.ts +2 -1
- package/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.d.ts +2 -1
- package/admin/components/admin-fields/admin-fields-select/admin-fields-select.component.d.ts +2 -1
- package/admin/i18n/en.translations.d.ts +2 -0
- package/admin/i18n/fr.translations.d.ts +2 -0
- package/admin/store/admin.actions.d.ts +31 -1
- package/admin/store/admin.effects.d.ts +27 -5
- package/admin/store/admin.reducer.d.ts +2 -1
- package/admin/store/admin.selectors.d.ts +1 -0
- package/admin/store/admin.service.d.ts +5 -1
- package/esm2022/admin/components/admin-classes/admin-classes-select/admin-classes-select.component.mjs +5 -3
- package/esm2022/admin/components/admin-classes/admin-classes.component.mjs +2 -1
- package/esm2022/admin/components/admin-classes/store/admin-class.actions.mjs +1 -1
- package/esm2022/admin/components/admin-classes/store/admin-class.effects.mjs +5 -4
- package/esm2022/admin/components/admin-classes/store/admin-class.reducer.mjs +1 -1
- package/esm2022/admin/components/admin-dataset/admin-dataset.component.mjs +2 -1
- package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +5 -3
- package/esm2022/admin/components/admin-fields/admin-fields-select/admin-fields-select.component.mjs +5 -3
- package/esm2022/admin/components/admin-fields/admin-fields.component.mjs +2 -1
- package/esm2022/admin/components/admin-predicates/admin-predicates-select/admin-predicates-select.component.mjs +3 -3
- package/esm2022/admin/components/admin-predicates/admin-predicates.component.mjs +1 -1
- package/esm2022/admin/components/admin.component.mjs +1 -1
- package/esm2022/admin/i18n/en.translations.mjs +3 -1
- package/esm2022/admin/i18n/fr.translations.mjs +3 -1
- package/esm2022/admin/store/admin.actions.mjs +8 -2
- package/esm2022/admin/store/admin.effects.mjs +6 -2
- package/esm2022/admin/store/admin.reducer.mjs +6 -2
- package/esm2022/admin/store/admin.selectors.mjs +4 -2
- package/esm2022/admin/store/admin.service.mjs +21 -1
- package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +2 -2
- package/esm2022/dataset/components/dataset.component.mjs +2 -1
- package/esm2022/lib/core/store/class/class.interface.mjs +1 -1
- package/esm2022/lib/core/store/data-source/data-source.actions.mjs +3 -1
- package/esm2022/lib/core/store/data-source/data-source.effects.mjs +6 -4
- package/esm2022/lib/core/store/data-source/data-source.reducer.mjs +27 -2
- package/esm2022/lib/core/store/data-source/data-source.service.mjs +6 -1
- package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-selector.component.mjs +97 -0
- package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +29 -62
- package/esm2022/lib/dashboard/components/widgets/public-api.mjs +2 -1
- package/esm2022/lib/dashboard/dashboard.module.mjs +8 -4
- package/esm2022/lib/dashboard/store/refresh.service.mjs +3 -2
- package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +4 -1
- package/esm2022/restitution/components/restitution/restitution.component.mjs +7 -24
- package/esm2022/restitution/style/css.component.mjs +2 -2
- package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +6 -5
- package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +3 -3
- package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +1 -1
- package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +3 -3
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +19 -12
- package/esm2022/widgets/widget-table/component/widget-table.component.mjs +3 -3
- package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +3 -3
- package/fesm2022/provoly-dashboard-admin.mjs +61 -14
- package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-dataset.mjs +2 -1
- package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-presentation.mjs +3 -0
- package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-restitution.mjs +8 -25
- package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +5 -4
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +2 -2
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +2 -2
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +18 -11
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +2 -2
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +2 -2
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +164 -74
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/lib/core/store/class/class.interface.d.ts +11 -0
- package/lib/core/store/data-source/data-source.actions.d.ts +12 -0
- package/lib/core/store/data-source/data-source.effects.d.ts +5 -0
- package/lib/core/store/data-source/data-source.service.d.ts +1 -0
- package/lib/dashboard/components/widgets/datasource-selector/datasource-selector.component.d.ts +34 -0
- package/lib/dashboard/components/widgets/header/widget-header.component.d.ts +5 -16
- package/lib/dashboard/components/widgets/public-api.d.ts +1 -0
- package/lib/dashboard/dashboard.module.d.ts +15 -14
- package/package.json +31 -31
- package/restitution/components/restitution/restitution.component.d.ts +3 -9
- package/restitution/style/_o-restitution.scss +0 -4
- package/schematics/ng-add/index.spec.js +0 -2
- package/schematics/ng-add/index.spec.js.map +1 -1
- package/styles/components/_o-datasources.scss +17 -56
- package/styles/components/_o-widget.scss +40 -32
- package/styles-theme/components-theme/_o-datasources.theme.scss +8 -5
- package/widgets/widget-map/component/widget-map.component.d.ts +5 -2
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
2
2
|
import { TemplatePortal } from '@angular/cdk/portal';
|
|
3
3
|
import { Component, EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core';
|
|
4
|
-
import { BehaviorSubject, combineLatest, map } from 'rxjs';
|
|
5
|
-
import { distinctUntilChanged } from 'rxjs/operators';
|
|
4
|
+
import { BehaviorSubject, combineLatest, distinctUntilChanged, map } from 'rxjs';
|
|
6
5
|
import { v4 } from 'uuid';
|
|
7
6
|
import { UNKNOWN_DATASOURCE } from '../../../../core/components/translate-id/translate-id.pipe';
|
|
8
7
|
import { DashboardGridLayout } from '../../../../core/model/manifest.interface';
|
|
@@ -23,8 +22,8 @@ import * as i6 from "../../../../core/components/icon/icon.component";
|
|
|
23
22
|
import * as i7 from "../../../../core/components/nq-color-selector/nq-color-selector.component";
|
|
24
23
|
import * as i8 from "../../../../core/access/access.directive";
|
|
25
24
|
import * as i9 from "../../../../core/components/select-image/select-image.component";
|
|
26
|
-
import * as i10 from "
|
|
27
|
-
import * as i11 from "
|
|
25
|
+
import * as i10 from "../../../../core/components/overlay/tooltip.directive";
|
|
26
|
+
import * as i11 from "../datasource-selector/datasource-selector.component";
|
|
28
27
|
import * as i12 from "../../../../core/components/translate-id/translate-id.pipe";
|
|
29
28
|
import * as i13 from "../../../../core/i18n/i18n.pipe";
|
|
30
29
|
import * as i14 from "./resultset-size.pipe";
|
|
@@ -33,19 +32,8 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
33
32
|
set manifest(manifest) {
|
|
34
33
|
this.manifest$.next(manifest);
|
|
35
34
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
get manifest() {
|
|
40
|
-
return this.manifest$.getValue();
|
|
41
|
-
}
|
|
42
|
-
set datasourceIds$(datasourceIds$) {
|
|
43
|
-
this.usedDatasources$ = combineLatest([datasourceIds$, this.store.select(DataSourceSelectors.getDataSources)]).pipe(map(([ids, datasources]) => ids
|
|
44
|
-
.map((id) => datasources.find((ds) => ds.id === id) ?? id)
|
|
45
|
-
.map((nq) => (typeof nq !== 'string' ? nq : UNKNOWN_DATASOURCE(nq)))));
|
|
46
|
-
this.subscriptions.add(this.usedDatasources$.subscribe((unq) => (this.usedNameQueryIds = unq.map((nq) => nq.id))));
|
|
47
|
-
this.subscription?.unsubscribe();
|
|
48
|
-
this.subscription = datasourceIds$.subscribe((dsIds) => (this.selectedDataSource = JSON.parse(JSON.stringify(dsIds))));
|
|
35
|
+
set datasourceIds(datasourceIds) {
|
|
36
|
+
this.selectedDataSourceIds$.next(datasourceIds);
|
|
49
37
|
}
|
|
50
38
|
set widgetIndex(widgetIndex) {
|
|
51
39
|
this._widgetIndex$.next(widgetIndex);
|
|
@@ -72,44 +60,26 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
72
60
|
datasource: [],
|
|
73
61
|
modificationDate: ''
|
|
74
62
|
};
|
|
75
|
-
this.search$ = new BehaviorSubject('');
|
|
76
|
-
this.choiceUsed = {};
|
|
77
63
|
this._widgetIndex$ = new BehaviorSubject(0);
|
|
78
64
|
this.open = false;
|
|
79
|
-
this.
|
|
80
|
-
this.idToNameDatasource = {};
|
|
65
|
+
this.selectedDataSourceIds$ = new BehaviorSubject([]);
|
|
81
66
|
this.windowManifest = null;
|
|
82
67
|
this.menu = false;
|
|
83
68
|
this.type = LibraryTypes.ILLUSTRATION;
|
|
84
69
|
this.windowManifest$ = this.store
|
|
85
70
|
.select(DashboardSelectors.windowManifest)
|
|
86
71
|
.pipe(distinctUntilChanged((p, c) => JSON.stringify(p) === JSON.stringify(c)));
|
|
87
|
-
this.allDataSources$ = combineLatest([
|
|
88
|
-
this.manifest$,
|
|
89
|
-
this.store.select(DataSourceSelectors.getDataSourcesSorted),
|
|
90
|
-
this.search$
|
|
91
|
-
]).pipe(map(([manifest, allNamedQueries, searchValue]) => {
|
|
92
|
-
let nqs = [...allNamedQueries];
|
|
93
|
-
if (!!manifest) {
|
|
94
|
-
const manifestNamedQueries = Array.isArray(manifest.datasource) ? manifest.datasource : [manifest.datasource];
|
|
95
|
-
manifestNamedQueries.forEach((manifestNamedQuery) => {
|
|
96
|
-
const alreadyPresent = !!allNamedQueries.find((nq) => nq.id === manifestNamedQuery);
|
|
97
|
-
if (!alreadyPresent) {
|
|
98
|
-
nqs.push(UNKNOWN_DATASOURCE(manifestNamedQuery ?? ''));
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return nqs.filter((nq) => nq.name.toLowerCase().includes(searchValue.toLowerCase()));
|
|
103
|
-
}));
|
|
104
72
|
this.targetIndexes$ = this.store.select(DashboardSelectors.targetTenantsIndexes);
|
|
105
|
-
this.subscriptions.add(this.allDataSources$.subscribe((allNqs) => allNqs.forEach((nq) => (this.choiceUsed[nq.id] = false))));
|
|
106
73
|
this.subscriptions.add(this.windowManifest$.subscribe((manifest) => {
|
|
107
74
|
this.windowManifest = manifest;
|
|
108
75
|
}));
|
|
109
76
|
this.lockedView$ = this.store
|
|
110
77
|
.select(DashboardSelectors.globalManifest)
|
|
111
|
-
.pipe(map((m) => !!m.locked || !!this.manifest?.locked));
|
|
112
|
-
this.
|
|
78
|
+
.pipe(map((m) => !!m.locked || !!this.manifest$.getValue()?.locked));
|
|
79
|
+
this.usedDatasources$ = combineLatest([
|
|
80
|
+
this.store.select(DataSourceSelectors.getDataSourcesSorted),
|
|
81
|
+
this.selectedDataSourceIds$
|
|
82
|
+
]).pipe(map(([allDss, dsIds]) => dsIds.map((id) => allDss.find((ds) => ds.id === id) ?? UNKNOWN_DATASOURCE(id))));
|
|
113
83
|
}
|
|
114
84
|
onArrowUp() {
|
|
115
85
|
const lastElement = this.menuList.nativeElement.lastElementChild;
|
|
@@ -148,18 +118,10 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
148
118
|
return this.currentLayout !== DashboardGridLayout.MANUAL;
|
|
149
119
|
}
|
|
150
120
|
get currentPlacementIndex() {
|
|
151
|
-
return this.places.findIndex((place) => this.manifest?.layout.x === place.layout.x &&
|
|
152
|
-
this.manifest
|
|
153
|
-
this.manifest
|
|
154
|
-
this.manifest
|
|
155
|
-
}
|
|
156
|
-
toogleDataSource(id) {
|
|
157
|
-
if (!this.selectedDataSource.includes(id)) {
|
|
158
|
-
this.selectedDataSource.push(id);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
this.selectedDataSource = this.selectedDataSource.filter((dataSourceId) => dataSourceId !== id);
|
|
162
|
-
}
|
|
121
|
+
return this.places.findIndex((place) => this.manifest$.getValue()?.layout.x === place.layout.x &&
|
|
122
|
+
this.manifest$.getValue()?.layout.y === place.layout.y &&
|
|
123
|
+
this.manifest$.getValue()?.layout.width === place.layout.width &&
|
|
124
|
+
this.manifest$.getValue()?.layout.height === place.layout.height);
|
|
163
125
|
}
|
|
164
126
|
menuOpen($event, forceOpen) {
|
|
165
127
|
this.menu = !this.menu;
|
|
@@ -202,7 +164,6 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
202
164
|
}
|
|
203
165
|
toggleCombo() {
|
|
204
166
|
if (!this.comboRef) {
|
|
205
|
-
this.usedNameQueryIds.forEach((unq) => (this.choiceUsed[unq] = true));
|
|
206
167
|
this.comboRef = this.overlay.create(new OverlayConfig({
|
|
207
168
|
hasBackdrop: true,
|
|
208
169
|
panelClass: ['o-widget__choose-resultset'],
|
|
@@ -235,8 +196,8 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
235
196
|
this.manifestModified.emit({
|
|
236
197
|
widgetIndex: this._widgetIndex,
|
|
237
198
|
manifest: {
|
|
238
|
-
...this.manifest,
|
|
239
|
-
datasource: this.
|
|
199
|
+
...this.manifest$.getValue(),
|
|
200
|
+
datasource: this.selectedDataSourceIds$.getValue()
|
|
240
201
|
}
|
|
241
202
|
});
|
|
242
203
|
this.toggleCombo();
|
|
@@ -328,7 +289,7 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
328
289
|
if (this.toolboxMenuService.isValidForCatalog(this.catalogInfo.name)) {
|
|
329
290
|
this.toolboxMenuService.addToCatalog({
|
|
330
291
|
...this.catalogInfo,
|
|
331
|
-
content: JSON.stringify({ ...this.manifest, title: this.catalogInfo.name })
|
|
292
|
+
content: JSON.stringify({ ...this.manifest$.getValue(), title: this.catalogInfo.name })
|
|
332
293
|
}, this._widgetIndex);
|
|
333
294
|
}
|
|
334
295
|
this.toggleCatalog();
|
|
@@ -371,7 +332,7 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
371
332
|
}
|
|
372
333
|
}
|
|
373
334
|
moveToPlace(place) {
|
|
374
|
-
const startLayout = this.manifest.layout;
|
|
335
|
+
const startLayout = this.manifest$.getValue().layout;
|
|
375
336
|
const targetLayout = place.layout;
|
|
376
337
|
const newWindowManifest = JSON.parse(JSON.stringify(this.windowManifest));
|
|
377
338
|
const targetWidgetIndex = newWindowManifest.widgets.findIndex((w) => w.layout.x === targetLayout.x &&
|
|
@@ -408,12 +369,18 @@ export class PryWidgetHeaderComponent extends SubscriptionnerDirective {
|
|
|
408
369
|
this.crossCatalog?.nativeElement?.focus();
|
|
409
370
|
}
|
|
410
371
|
}
|
|
372
|
+
datasourcesChanged($event) {
|
|
373
|
+
const ids = $event.map((ds) => ds.id);
|
|
374
|
+
if (JSON.stringify(this.selectedDataSourceIds$.getValue()) !== JSON.stringify(ids)) {
|
|
375
|
+
this.selectedDataSourceIds$.next(ids);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
411
378
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryWidgetHeaderComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i3.ToolboxMenuService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
412
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: { manifest: "manifest", 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 <h2 class=\"o-widget__header__content__title\" *ngIf=\"!!title; else querySelector\">\n {{ title }}\n </h2>\n <ng-template #querySelector>\n <div *ngFor=\"let ds of usedDatasources$ | async\" class=\"o-widget__header__content__query\">\n <pry-nq-color-selector [disabled]=\"true\" [datasource]=\"ds\"></pry-nq-color-selector>\n <img\n [height]=\"20\"\n [src]=\"ds.id | translateId: { type: 'datasource', output: 'icon' } | async\"\n [width]=\"20\"\n alt=\"\"\n class=\"o-widget__header__content__query__icon\"\n />\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n <h3 class=\"o-widget__header__content__query__name\" *ngIf=\"displayCount\">\n ({{ usedNameQueryIds | resultSetSize | async }})\n </h3>\n </div>\n <div *ngIf=\"!(usedDatasources$ | async)?.length\" class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n </ng-template>\n </div>\n <div class=\"m-btn-group\" *ngIf=\"!(lockedView$ | async) && displaySettings(headerOptions)\">\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</div>\n\n<ng-template #overlayMenu>\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 <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n *ngIf=\"!!manifest?.datasource && displayOption(headerOptions, 'datasourceSelection')\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleCombo()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n [pryTooltip]=\"infoTooltip\"\n aria-describedby=\"infoTooltip_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'parameters')\">\n <ng-content></ng-content>\n </li>\n <ng-container *ngIf=\"displayOption(headerOptions, 'window')\">\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let targetIndex of targetIndexes$ | async\">\n <button\n type=\"button\"\n (click)=\"moveInNewWindow(_widgetIndex, targetIndex)\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n #secondElement\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 </ng-container>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"hasGrid && displayOption(headerOptions, 'changeSpot')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n (click)=\"toggleChangeSpot()\"\n class=\"a-btn\"\n tabindex=\"-1\"\n [pryTooltip]=\"infoChangeSpot\"\n aria-describedby=\"infoTooltip_changeSpot\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'maximize')\">\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'addToCatalog')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleCatalog()\"\n class=\"a-btn\"\n [pryTooltip]=\"infoAdd\"\n aria-describedby=\"infoAdd_widgetHeader\"\n >\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'delete')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n [pryTooltip]=\"infoRemove\"\n aria-describedby=\"infoRemove_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let option of additionalOptions\">\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 </ul>\n </div>\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 #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoRemove>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoRemove_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoAdd>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoChangeSpot>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_changeSpot\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </div>\n</ng-template>\n\n<ng-template #template>\n <div class=\"m-namedqueries-wrapper\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"dialog_namedqueries\">\n <div class=\"o-widget__search\">\n <input\n id=\"catalog-search\"\n #inputCatalog\n (keydown.shift.tab)=\"focusValidation()\"\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'Recherchez une donn\u00E9e'\"\n [ngModel]=\"search$ | async\"\n (ngModelChange)=\"this.search$.next($event)\"\n />\n <pry-icon iconSvg=\"search\" [width]=\"17\" [height]=\"17\"></pry-icon>\n </div>\n <div *ngIf=\"selectedDataSource.length > 0; else noDataSource\">\n <h4 class=\"a-h4\">{{ '@pry.restitution.selection' | i18n }}</h4>\n <div>\n <ul class=\"o-datasources__list o-datasources__list--selected\">\n <li *ngFor=\"let id of selectedDataSource\" class=\"o-datasources__item\">\n <button class=\"o-datasources__card is-selected\" (click)=\"toogleDataSource(id)\" type=\"button\">\n <p>\n {{ idToNameDatasource[id] }}\n </p>\n <div class=\"a-btn a-btn--primary a-btn--icon-only\">\n <pry-icon [iconSvg]=\"'close'\" [width]=\"17\" [height]=\"17\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.restitution.unselectDataSource' | i18n }}</span>\n </div>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <ng-template #noDataSource>\n <h4 class=\"a-h4\">{{ '@pry.restitution.noDataSourceSelected' | i18n }}</h4>\n </ng-template>\n <h4 class=\"a-h4\">{{ '@pry.restitution.select' | i18n }}</h4>\n <ul class=\"o-datasources__list\">\n <li *ngFor=\"let nq of allDataSources$ | async\" (click)=\"toogleDataSource(nq.id)\" class=\"o-datasources__item\">\n <div class=\"o-datasources__card\">\n <div class=\"o-datasources__card__name\">\n <pry-checkbox\n [ngModel]=\"selectedDataSource.includes(nq.id)\"\n (click)=\"$event.preventDefault()\"\n ></pry-checkbox>\n <span class=\"u-visually-hidden\">{{ '@pry.restitution.selectDataSource' | i18n }}</span>\n <p class=\"a-p\">{{ nq.id | translateId: { type: 'datasource', output: 'name' } | async }}</p>\n </div>\n </div>\n </li>\n </ul>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"toggleCombo()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"button\"\n (click)=\"emitManifest()\"\n #validate\n (keydown.tab)=\"focusInputCatalog()\"\n class=\"a-btn a-btn--primary\"\n >\n {{ '@pry.toolbox.manifest.validated' | i18n }}\n </button>\n </div>\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\">\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 <ng-container *ngFor=\"let place of places; let i = index\">\n <ng-container *ngIf=\"currentPlacementIndex !== i\">\n <button type=\"button\" class=\"a-btn\" (click)=\"moveToPlace(place)\">\n <span>{{ '@pry.widget.tooltip.spotName' | i18n: { place: i + 1 } }}</span>\n </button>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: "component", type: i7.PryNqColorSelectorComponent, selector: "pry-nq-color-selector", inputs: ["disabled", "datasource"], outputs: ["colorChanged"] }, { kind: "directive", type: i8.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "component", type: i9.PrySelectImageComponent, selector: "pry-select-image", inputs: ["iconUrl", "size", "mode"], outputs: ["toggled", "changed"] }, { kind: "component", type: i10.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "directive", type: i11.PryTooltipDirective, selector: "[pryTooltip]", inputs: ["pryTooltip", "styleReversed", "pryTooltipContext", "pryTooltipPosition", "pryTooltipShowDelay"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i13.I18nPipe, name: "i18n" }, { kind: "pipe", type: i14.ResultSetSizePipe, name: "resultSetSize" }] }); }
|
|
379
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: { manifest: "manifest", 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 <h2 class=\"o-widget__header__content__title\" *ngIf=\"(manifest$ | async)?.title; else querySelector\">\n {{ (manifest$ | async)?.title }}\n </h2>\n <ng-template #querySelector>\n <div *ngFor=\"let ds of usedDatasources$ | async\" class=\"o-widget__header__content__query\">\n <pry-nq-color-selector [disabled]=\"true\" [datasource]=\"ds\"></pry-nq-color-selector>\n <img\n [height]=\"20\"\n [src]=\"ds.id | translateId : { type: 'datasource', output: 'icon' } | async\"\n [width]=\"20\"\n alt=\"\"\n class=\"o-widget__header__content__query__icon\"\n />\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n <h3 class=\"o-widget__header__content__query__name\" *ngIf=\"displayCount\">\n ({{ (selectedDataSourceIds$ | async) ?? [] | resultSetSize | async }})\n </h3>\n </div>\n <div *ngIf=\"((usedDatasources$ | async) ?? []).length === 0\" class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n </ng-template>\n </div>\n <div class=\"m-btn-group\" *ngIf=\"!(lockedView$ | async) && displaySettings(headerOptions)\">\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</div>\n\n<ng-template #overlayMenu>\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 <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n *ngIf=\"(manifest$ | async)?.datasource && displayOption(headerOptions, 'datasourceSelection')\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleCombo()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n [pryTooltip]=\"infoTooltip\"\n aria-describedby=\"infoTooltip_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'parameters')\">\n <ng-content></ng-content>\n </li>\n <ng-container *ngIf=\"displayOption(headerOptions, 'window')\">\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let targetIndex of targetIndexes$ | async\">\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 </ng-container>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"hasGrid && displayOption(headerOptions, 'changeSpot')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n (click)=\"toggleChangeSpot()\"\n class=\"a-btn\"\n tabindex=\"-1\"\n [pryTooltip]=\"infoChangeSpot\"\n aria-describedby=\"infoTooltip_changeSpot\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'maximize')\">\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'addToCatalog')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleCatalog()\"\n class=\"a-btn\"\n [pryTooltip]=\"infoAdd\"\n aria-describedby=\"infoAdd_widgetHeader\"\n >\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'delete')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n [pryTooltip]=\"infoRemove\"\n aria-describedby=\"infoRemove_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let option of additionalOptions\">\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 </ul>\n </div>\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 #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoRemove>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoRemove_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoAdd>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoChangeSpot>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_changeSpot\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </div>\n</ng-template>\n\n<ng-template #template>\n <pry-datasource-selector\n (cancel)=\"toggleCombo()\"\n (validated)=\"emitManifest()\"\n (nextTab)=\"focusInputCatalog()\"\n (previousTab)=\"focusValidation()\"\n (datasourcesChanged)=\"datasourcesChanged($event)\"\n [datasourceIds]=\"(selectedDataSourceIds$ | async) ?? []\"\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\">\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 <ng-container *ngFor=\"let place of places; let i = index\">\n <ng-container *ngIf=\"currentPlacementIndex !== i\">\n <button type=\"button\" class=\"a-btn\" (click)=\"moveToPlace(place)\">\n <span>{{ '@pry.widget.tooltip.spotName' | i18n : { place: i + 1 } }}</span>\n </button>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: "component", type: i7.PryNqColorSelectorComponent, selector: "pry-nq-color-selector", inputs: ["disabled", "datasource"], outputs: ["colorChanged"] }, { kind: "directive", type: i8.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "component", type: i9.PrySelectImageComponent, selector: "pry-select-image", inputs: ["iconUrl", "size", "mode"], outputs: ["toggled", "changed"] }, { kind: "directive", type: i10.PryTooltipDirective, selector: "[pryTooltip]", inputs: ["pryTooltip", "styleReversed", "pryTooltipContext", "pryTooltipPosition", "pryTooltipShowDelay"] }, { kind: "component", type: i11.DatasourceSelectorComponent, selector: "pry-datasource-selector", inputs: ["manifest", "datasourceIds"], outputs: ["cancel", "validated", "previousTab", "nextTab", "datasourcesChanged"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i13.I18nPipe, name: "i18n" }, { kind: "pipe", type: i14.ResultSetSizePipe, name: "resultSetSize" }] }); }
|
|
413
380
|
}
|
|
414
381
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryWidgetHeaderComponent, decorators: [{
|
|
415
382
|
type: Component,
|
|
416
|
-
args: [{ selector: 'pry-widget-header', template: "<div class=\"o-widget__header\">\n <div class=\"o-widget__header__content\">\n <h2 class=\"o-widget__header__content__title\" *ngIf=\"!!title; else querySelector\">\n {{ title }}\n </h2>\n <ng-template #querySelector>\n <div *ngFor=\"let ds of usedDatasources$ | async\" class=\"o-widget__header__content__query\">\n <pry-nq-color-selector [disabled]=\"true\" [datasource]=\"ds\"></pry-nq-color-selector>\n <img\n [height]=\"20\"\n [src]=\"ds.id | translateId: { type: 'datasource', output: 'icon' } | async\"\n [width]=\"20\"\n alt=\"\"\n class=\"o-widget__header__content__query__icon\"\n />\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n <h3 class=\"o-widget__header__content__query__name\" *ngIf=\"displayCount\">\n ({{ usedNameQueryIds | resultSetSize | async }})\n </h3>\n </div>\n <div *ngIf=\"!(usedDatasources$ | async)?.length\" class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n </ng-template>\n </div>\n <div class=\"m-btn-group\" *ngIf=\"!(lockedView$ | async) && displaySettings(headerOptions)\">\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</div>\n\n<ng-template #overlayMenu>\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 <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n *ngIf=\"!!manifest?.datasource && displayOption(headerOptions, 'datasourceSelection')\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleCombo()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n [pryTooltip]=\"infoTooltip\"\n aria-describedby=\"infoTooltip_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'parameters')\">\n <ng-content></ng-content>\n </li>\n <ng-container *ngIf=\"displayOption(headerOptions, 'window')\">\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let targetIndex of targetIndexes$ | async\">\n <button\n type=\"button\"\n (click)=\"moveInNewWindow(_widgetIndex, targetIndex)\"\n class=\"a-btn\"\n role=\"menuitem\"\n tabindex=\"-1\"\n #secondElement\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 </ng-container>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"hasGrid && displayOption(headerOptions, 'changeSpot')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n (click)=\"toggleChangeSpot()\"\n class=\"a-btn\"\n tabindex=\"-1\"\n [pryTooltip]=\"infoChangeSpot\"\n aria-describedby=\"infoTooltip_changeSpot\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'maximize')\">\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'addToCatalog')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleCatalog()\"\n class=\"a-btn\"\n [pryTooltip]=\"infoAdd\"\n aria-describedby=\"infoAdd_widgetHeader\"\n >\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'delete')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n [pryTooltip]=\"infoRemove\"\n aria-describedby=\"infoRemove_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let option of additionalOptions\">\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 </ul>\n </div>\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 #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoRemove>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoRemove_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoAdd>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoChangeSpot>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_changeSpot\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </div>\n</ng-template>\n\n<ng-template #template>\n <div class=\"m-namedqueries-wrapper\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"dialog_namedqueries\">\n <div class=\"o-widget__search\">\n <input\n id=\"catalog-search\"\n #inputCatalog\n (keydown.shift.tab)=\"focusValidation()\"\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'Recherchez une donn\u00E9e'\"\n [ngModel]=\"search$ | async\"\n (ngModelChange)=\"this.search$.next($event)\"\n />\n <pry-icon iconSvg=\"search\" [width]=\"17\" [height]=\"17\"></pry-icon>\n </div>\n <div *ngIf=\"selectedDataSource.length > 0; else noDataSource\">\n <h4 class=\"a-h4\">{{ '@pry.restitution.selection' | i18n }}</h4>\n <div>\n <ul class=\"o-datasources__list o-datasources__list--selected\">\n <li *ngFor=\"let id of selectedDataSource\" class=\"o-datasources__item\">\n <button class=\"o-datasources__card is-selected\" (click)=\"toogleDataSource(id)\" type=\"button\">\n <p>\n {{ idToNameDatasource[id] }}\n </p>\n <div class=\"a-btn a-btn--primary a-btn--icon-only\">\n <pry-icon [iconSvg]=\"'close'\" [width]=\"17\" [height]=\"17\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.restitution.unselectDataSource' | i18n }}</span>\n </div>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <ng-template #noDataSource>\n <h4 class=\"a-h4\">{{ '@pry.restitution.noDataSourceSelected' | i18n }}</h4>\n </ng-template>\n <h4 class=\"a-h4\">{{ '@pry.restitution.select' | i18n }}</h4>\n <ul class=\"o-datasources__list\">\n <li *ngFor=\"let nq of allDataSources$ | async\" (click)=\"toogleDataSource(nq.id)\" class=\"o-datasources__item\">\n <div class=\"o-datasources__card\">\n <div class=\"o-datasources__card__name\">\n <pry-checkbox\n [ngModel]=\"selectedDataSource.includes(nq.id)\"\n (click)=\"$event.preventDefault()\"\n ></pry-checkbox>\n <span class=\"u-visually-hidden\">{{ '@pry.restitution.selectDataSource' | i18n }}</span>\n <p class=\"a-p\">{{ nq.id | translateId: { type: 'datasource', output: 'name' } | async }}</p>\n </div>\n </div>\n </li>\n </ul>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"toggleCombo()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"button\"\n (click)=\"emitManifest()\"\n #validate\n (keydown.tab)=\"focusInputCatalog()\"\n class=\"a-btn a-btn--primary\"\n >\n {{ '@pry.toolbox.manifest.validated' | i18n }}\n </button>\n </div>\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\">\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 <ng-container *ngFor=\"let place of places; let i = index\">\n <ng-container *ngIf=\"currentPlacementIndex !== i\">\n <button type=\"button\" class=\"a-btn\" (click)=\"moveToPlace(place)\">\n <span>{{ '@pry.widget.tooltip.spotName' | i18n: { place: i + 1 } }}</span>\n </button>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n" }]
|
|
383
|
+
args: [{ selector: 'pry-widget-header', template: "<div class=\"o-widget__header\">\n <div class=\"o-widget__header__content\">\n <h2 class=\"o-widget__header__content__title\" *ngIf=\"(manifest$ | async)?.title; else querySelector\">\n {{ (manifest$ | async)?.title }}\n </h2>\n <ng-template #querySelector>\n <div *ngFor=\"let ds of usedDatasources$ | async\" class=\"o-widget__header__content__query\">\n <pry-nq-color-selector [disabled]=\"true\" [datasource]=\"ds\"></pry-nq-color-selector>\n <img\n [height]=\"20\"\n [src]=\"ds.id | translateId : { type: 'datasource', output: 'icon' } | async\"\n [width]=\"20\"\n alt=\"\"\n class=\"o-widget__header__content__query__icon\"\n />\n <h3 class=\"o-widget__header__content__query__name\">{{ ds.name }}</h3>\n <h3 class=\"o-widget__header__content__query__name\" *ngIf=\"displayCount\">\n ({{ (selectedDataSourceIds$ | async) ?? [] | resultSetSize | async }})\n </h3>\n </div>\n <div *ngIf=\"((usedDatasources$ | async) ?? []).length === 0\" class=\"o-widget__header__content__no-data\">\n <h2 class=\"o-widget__header__content__title\">{{ '@pry.widget.noData' | i18n }}</h2>\n </div>\n </ng-template>\n </div>\n <div class=\"m-btn-group\" *ngIf=\"!(lockedView$ | async) && displaySettings(headerOptions)\">\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</div>\n\n<ng-template #overlayMenu>\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 <li\n class=\"m-context-menu__list__item\"\n role=\"none\"\n *ngIf=\"(manifest$ | async)?.datasource && displayOption(headerOptions, 'datasourceSelection')\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"toggleActions\"\n (click)=\"toggleCombo()\"\n *pryAccess=\"{ module: 'dashboard', page: 'widget', action: 'select_named_query' }\"\n class=\"a-btn\"\n [pryTooltip]=\"infoTooltip\"\n aria-describedby=\"infoTooltip_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'parameters')\">\n <ng-content></ng-content>\n </li>\n <ng-container *ngIf=\"displayOption(headerOptions, 'window')\">\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let targetIndex of targetIndexes$ | async\">\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 </ng-container>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"hasGrid && displayOption(headerOptions, 'changeSpot')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n (click)=\"toggleChangeSpot()\"\n class=\"a-btn\"\n tabindex=\"-1\"\n [pryTooltip]=\"infoChangeSpot\"\n aria-describedby=\"infoTooltip_changeSpot\"\n >\n <pry-icon [height]=\"17\" [width]=\"17\" iconSvg=\"move\"></pry-icon>\n <span>{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </button>\n </li>\n <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'maximize')\">\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'addToCatalog')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleCatalog()\"\n class=\"a-btn\"\n [pryTooltip]=\"infoAdd\"\n aria-describedby=\"infoAdd_widgetHeader\"\n >\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngIf=\"displayOption(headerOptions, 'delete')\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n (click)=\"toggleRemoveConfirm($event)\"\n class=\"a-btn\"\n [pryTooltip]=\"infoRemove\"\n aria-describedby=\"infoRemove_widgetHeader\"\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 <li class=\"m-context-menu__list__item\" role=\"none\" *ngFor=\"let option of additionalOptions\">\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 </ul>\n </div>\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 #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.readSearch' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoRemove>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoRemove_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.deleteWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoAdd>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_widgetHeader\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.catalogWidget' | i18n }}</span>\n </div>\n</ng-template>\n<ng-template #infoChangeSpot>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoAdd_changeSpot\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.tooltip.changeSpot' | i18n }}</span>\n </div>\n</ng-template>\n\n<ng-template #template>\n <pry-datasource-selector\n (cancel)=\"toggleCombo()\"\n (validated)=\"emitManifest()\"\n (nextTab)=\"focusInputCatalog()\"\n (previousTab)=\"focusValidation()\"\n (datasourcesChanged)=\"datasourcesChanged($event)\"\n [datasourceIds]=\"(selectedDataSourceIds$ | async) ?? []\"\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\">\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 <ng-container *ngFor=\"let place of places; let i = index\">\n <ng-container *ngIf=\"currentPlacementIndex !== i\">\n <button type=\"button\" class=\"a-btn\" (click)=\"moveToPlace(place)\">\n <span>{{ '@pry.widget.tooltip.spotName' | i18n : { place: i + 1 } }}</span>\n </button>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n" }]
|
|
417
384
|
}], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i3.ToolboxMenuService }]; }, propDecorators: { template: [{
|
|
418
385
|
type: ViewChild,
|
|
419
386
|
args: ['template', { read: TemplateRef }]
|
|
@@ -466,9 +433,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImpor
|
|
|
466
433
|
type: Input
|
|
467
434
|
}], manifestModified: [{
|
|
468
435
|
type: Output
|
|
469
|
-
}], datasourceIds
|
|
436
|
+
}], datasourceIds: [{
|
|
470
437
|
type: Input
|
|
471
438
|
}], widgetIndex: [{
|
|
472
439
|
type: Input
|
|
473
440
|
}] } });
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1CQUFtQixFQUFxQyxNQUFNLDJDQUEyQyxDQUFDO0FBRW5ILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUMvRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFbEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBYXZDLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSx3QkFBd0I7SUFvQnBFLElBQWEsUUFBUSxDQUFDLFFBQStCO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFtQkQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFhLGNBQWMsQ0FBQyxjQUFvQztRQUM5RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2pILEdBQUcsQ0FDRCxDQUFDLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FDckIsR0FBRzthQUNBLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDekQsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFpQixDQUN6RixDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkgsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQzFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQWEsV0FBVyxDQUFDLFdBQW1CO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUF5QkQsWUFDVSxLQUFZLEVBQ1osT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ25DLGtCQUFzQztRQUU3QyxLQUFLLEVBQUUsQ0FBQztRQUxBLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbkMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQWxGL0MsY0FBUyxHQUFHLElBQUksZUFBZSxDQUF3QixJQUFJLENBQUMsQ0FBQztRQUU3RCxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQU9yQixzQkFBaUIsR0FBMEIsRUFBRSxDQUFDO1FBRTlDLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRW5CLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFxRCxDQUFDO1FBRW5HLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixnQkFBVyxHQUFXO1lBQ3BCLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDUixLQUFLLEVBQUUsRUFBRTtZQUNULElBQUksRUFBRSxFQUFFO1lBQ1IsV0FBVyxFQUFFLEVBQUU7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtTQUNyQixDQUFDO1FBK0JGLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQU1sQyxlQUFVLEdBQUcsRUFBK0IsQ0FBQztRQUM3QyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBRS9DLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYix1QkFBa0IsR0FBYSxFQUFFLENBQUM7UUFDbEMsdUJBQWtCLEdBQTZCLEVBQUUsQ0FBQztRQUVsRCxtQkFBYyxHQUE2QixJQUFJLENBQUM7UUFPaEQsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUN0QixTQUFJLEdBQWlCLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFTN0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSzthQUM5QixNQUFNLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDO2FBQ3pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakYsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVM7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQztZQUMzRCxJQUFJLENBQUMsT0FBTztTQUNiLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtnQkFDZCxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtvQkFDbEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssa0JBQWtCLENBQUMsQ0FBQztvQkFDcEYsSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN4RDtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDckcsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLO2FBQzFCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUM7YUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUUzRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUM3RyxDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDO1NBQzlEO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztTQUNqQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBc0IsQ0FBQztRQUN6RSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQXNCLENBQUM7UUFDN0YsSUFBSSxvQkFBb0IsRUFBRTtZQUN4QixvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUM5QjtRQUNELFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsRUFBRTtZQUN6QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUM7U0FDMUQ7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1NBQ2xDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFzQixDQUFDO1FBQ3pFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBc0IsQ0FBQztRQUM3RixJQUFJLG9CQUFvQixFQUFFO1lBQ3hCLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzlCO1FBQ0QsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDekUsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQzFCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSztZQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBVTtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO2FBQU07WUFDTCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ2pHO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFtQixFQUFFLFNBQW1CO1FBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3JFLElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDaEMsSUFBSSxhQUFhLENBQUM7Z0JBQ2hCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztnQkFDdEMsYUFBYSxFQUFFLFVBQVU7Z0JBQ3pCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPO3FCQUMzQixRQUFRLEVBQUU7cUJBQ1YsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztxQkFDckMsYUFBYSxDQUFDO29CQUNiO3dCQUNFLE9BQU8sRUFBRSxPQUFPO3dCQUNoQixPQUFPLEVBQUUsUUFBUTt3QkFDakIsUUFBUSxFQUFFLE9BQU87d0JBQ2pCLFFBQVEsRUFBRSxLQUFLO3FCQUNoQjtpQkFDRixDQUFDO2FBQ0wsQ0FBQyxDQUNILENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQztnQkFDcEUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQXNCLENBQUM7b0JBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBc0IsQ0FBQztvQkFDOUYsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxDQUFDO2lCQUN2RDtZQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNSO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNqQyxJQUFJLGFBQWEsQ0FBQztnQkFDaEIsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLFVBQVUsRUFBRSxDQUFDLDRCQUE0QixDQUFDO2dCQUMxQyxhQUFhLEVBQUUsVUFBVTthQUMxQixDQUFDLENBQ0gsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNGLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDL0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUM1QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDUjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLFdBQW1CLEVBQUUsV0FBbUI7UUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxRQUFRLENBQUMsV0FBbUI7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzlCLFFBQVEsRUFBRTtnQkFDUixHQUFHLElBQUksQ0FBQyxRQUFRO2dCQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUNQO1NBQy9CLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBbUI7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3pDLElBQUksYUFBYSxDQUFDO2dCQUNoQixXQUFXLEVBQUUsSUFBSTtnQkFDakIsVUFBVSxFQUFFLENBQUMsaUJBQWlCLENBQUM7Z0JBQy9CLGFBQWEsRUFBRSxVQUFVO2FBQzFCLENBQUMsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUM1RixJQUFJLE1BQU0sRUFBRTtnQkFDVixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFtQixDQUFDO2dCQUM5RSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7b0JBQ1gsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDNUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztpQkFDOUc7YUFDRjtZQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDckMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ1I7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDakIsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUM7WUFDdkMsUUFBUSxFQUFFO2dCQUNSLEdBQUcsSUFBSSxDQUFDLGNBQWM7Z0JBQ3RCLE9BQU8sRUFBRSxtQkFBbUI7YUFDN0I7U0FDRixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2pCLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsZ0JBQWdCLEVBQUUsRUFBRTthQUNyQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDbkMsSUFBSSxhQUFhLENBQUM7Z0JBQ2hCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0IsYUFBYSxFQUFFLFVBQVU7YUFDMUIsQ0FBQyxDQUNILENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDNUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ1I7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQ2xDO2dCQUNFLEdBQUcsSUFBSSxDQUFDLFdBQVc7Z0JBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzVFLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FDbEIsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBcUI7UUFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLE1BQW9CO1FBQ25DLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RCxDQUFDO0lBRUQsYUFBYSxDQUFDLGFBQWtCLEVBQUUsVUFBa0I7UUFDbEQsT0FBTyxDQUNMLGFBQWEsS0FBSyxTQUFTO1lBQzNCLGFBQWEsS0FBSyxJQUFJO1lBQ3RCLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxTQUFTO1lBQ3ZDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQ25DLENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZSxDQUFDLGFBQXdEO1FBQ3RFLE9BQU8sYUFBYSxLQUFLLFNBQVMsSUFBSSxhQUFhLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQW9CLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDMUcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUk7YUFDN0IsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDaEMsSUFBSSxhQUFhLENBQUM7Z0JBQ2hCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0IsYUFBYSxFQUFFLFVBQVU7YUFDMUIsQ0FBQyxDQUNILENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztTQUNsRjthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQXFCO1FBQy9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFTLENBQUMsTUFBTSxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFzQixDQUFDO1FBRS9GLE1BQU0saUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDM0QsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLO1lBQ3JDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQzFDLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQzFELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsS0FBSztZQUNwQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxDQUN6QyxDQUFDO1FBQ0YsSUFBSSxpQkFBaUIsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUM1QixpQkFBaUIsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1NBQ25FO1FBQ0QsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUVsRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDdEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUN0RSxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMzQztJQUNILENBQUM7OEdBdGVVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLG1ZQUNKLFdBQVcseUdBQ04sV0FBVywyRkFDbEIsV0FBVyxxR0FDTixXQUFXLDJHQUNSLFdBQVcscUdBQ2QsV0FBVyxzd0JDaEQvQyx1a2RBMFhBOzsyRkRoVmEsd0JBQXdCO2tCQUpwQyxTQUFTOytCQUNFLG1CQUFtQjtrTEFJaUIsUUFBUTtzQkFBckQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNPLGFBQWE7c0JBQS9ELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDTCxNQUFNO3NCQUFqRCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ08sV0FBVztzQkFBM0QsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNLLGNBQWM7c0JBQWpFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNELFdBQVc7c0JBQTNELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDckIsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNKLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFDSyxRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ1MsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ1AsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUNRLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0YsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQU1SLFFBQVE7c0JBQXBCLEtBQUs7Z0JBSUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBcUJNLGNBQWM7c0JBQTFCLEtBQUs7Z0JBZ0JPLFdBQVc7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBVTktOT1dOX0RBVEFTT1VSQ0UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2NvbXBvbmVudHMvdHJhbnNsYXRlLWlkL3RyYW5zbGF0ZS1pZC5waXBlJztcbmltcG9ydCB7IERhc2hib2FyZEdyaWRMYXlvdXQsIERhc2hib2FyZE1hbmlmZXN0LCBXaWRnZXRNYW5pZmVzdCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWwvbWFuaWZlc3QuaW50ZXJmYWNlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWwvd2lkZ2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25maWdBY3Rpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9jb25maWcvY29uZmlnLmFjdGlvbnMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSwgTmFtZWRRdWVyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc3RvcmUvZGF0YS1zb3VyY2UvZGF0YS1zb3VyY2UubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc3RvcmUvZGF0YS1zb3VyY2UvZGF0YS1zb3VyY2Uuc2VsZWN0b3JzJztcbmltcG9ydCB7IExpYnJhcnlUeXBlcyB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc3RvcmUvaW1hZ2UvaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBUb29sYm94TWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3Rvb2xib3gvdG9vbGJveC1tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQWN0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2Rhc2hib2FyZC5hY3Rpb25zJztcbmltcG9ydCB7IERhc2hib2FyZFNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2Rhc2hib2FyZC5zZWxlY3RvcnMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9ubmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc3Vic2NyaXB0aW9ubmVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBXaWRnZXRQbGFjZW1lbnRVdGlscyB9IGZyb20gJy4uL3dpZGdldC1wbGFjZW1lbnQvd2lkZ2V0LXBsYWNlbWVudC51dGlscyc7XG5cbmV4cG9ydCBjb25zdCBXSURHRVRfSEVBREVSX0hFSUdIVCA9IDYwO1xuXG5leHBvcnQgdHlwZSBIZWFkZXJBY3Rpb24gPSB7XG4gIGljb246IHN0cmluZztcbiAgYWN0aW9uOiAodGhhdDogUHJ5V2lkZ2V0SGVhZGVyQ29tcG9uZW50KSA9PiB2b2lkO1xuICBsYWJlbDogc3RyaW5nO1xuICBkaXNhYmxlZD86ICh0aGF0OiBQcnlXaWRnZXRIZWFkZXJDb21wb25lbnQpID0+IGJvb2xlYW47XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtaGVhZGVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBQcnlXaWRnZXRIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUge1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgdGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZU1vZGFsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0ZW1wbGF0ZU1vZGFsITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgndG9nZ2xlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0b2dnbGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdvdmVybGF5TWVudScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgb3ZlcmxheU1lbnUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdvdmVybGF5Q2F0YWxvZycsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgb3ZlcmxheUNhdGFsb2chOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdvdmVybGF5U3BvdCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgb3ZlcmxheVNwb3QhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0b2dnbGVQYW5lbCcpIHRvZ2dsZVBhbmVsITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nyb3NzJykgY3Jvc3MhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndmFsaWRhdGUnKSB2YWxpZGF0ZSE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd2YWxpZGF0ZUNhdGFsb2cnKSB2YWxpZGF0ZUNhdGFsb2chOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY2FuY2VsJykgY2FuY2VsITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nyb3NzQ2F0YWxvZycpIGNyb3NzQ2F0YWxvZyE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdpbnB1dENhdGFsb2cnKSBpbnB1dENhdGFsb2chOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdtZW51TGlzdCcpIG1lbnVMaXN0ITogRWxlbWVudFJlZjtcbiAgbWFuaWZlc3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxXaWRnZXRNYW5pZmVzdCB8IG51bGw+KG51bGwpO1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHBsYWNlczogV2lkZ2V0TWFuaWZlc3RbXSA9IFtdO1xuICBzZWxlY3RlZEl0ZW0/OiBFbGVtZW50IHwgbnVsbDtcblxuICBASW5wdXQoKSBzZXQgbWFuaWZlc3QobWFuaWZlc3Q6IFdpZGdldE1hbmlmZXN0IHwgbnVsbCkge1xuICAgIHRoaXMubWFuaWZlc3QkLm5leHQobWFuaWZlc3QpO1xuICB9XG5cbiAgQElucHV0KCkgYWRkaXRpb25hbE9wdGlvbnM6IEhlYWRlckFjdGlvbltdIHwgbnVsbCA9IFtdO1xuICBASW5wdXQoKSBoZWFkZXJPcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB8IHt9IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBkaXNwbGF5Q291bnQgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBtYW5pZmVzdE1vZGlmaWVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHdpZGdldEluZGV4OiBudW1iZXI7IG1hbmlmZXN0OiBXaWRnZXRNYW5pZmVzdCB9PigpO1xuXG4gIGlzRWRpdCA9IGZhbHNlO1xuICBjYXRhbG9nSW5mbzogV2lkZ2V0ID0ge1xuICAgIGlkOiB2NCgpLFxuICAgIGltYWdlOiAnJyxcbiAgICBuYW1lOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgY29udGVudDogJycsXG4gICAgZGF0YXNvdXJjZTogW10sXG4gICAgbW9kaWZpY2F0aW9uRGF0ZTogJydcbiAgfTtcblxuICBnZXQgdGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3Q/LnRpdGxlO1xuICB9XG5cbiAgZ2V0IG1hbmlmZXN0KCkge1xuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGFzb3VyY2VJZHMkKGRhdGFzb3VyY2VJZHMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPikge1xuICAgIHRoaXMudXNlZERhdGFzb3VyY2VzJCA9IGNvbWJpbmVMYXRlc3QoW2RhdGFzb3VyY2VJZHMkLCB0aGlzLnN0b3JlLnNlbGVjdChEYXRhU291cmNlU2VsZWN0b3JzLmdldERhdGFTb3VyY2VzKV0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbaWRzLCBkYXRhc291cmNlc10pID0+XG4gICAgICAgICAgaWRzXG4gICAgICAgICAgICAubWFwKChpZCkgPT4gZGF0YXNvdXJjZXMuZmluZCgoZHMpID0+IGRzLmlkID09PSBpZCkgPz8gaWQpXG4gICAgICAgICAgICAubWFwKChucSkgPT4gKHR5cGVvZiBucSAhPT0gJ3N0cmluZycgPyBucSA6IFVOS05PV05fREFUQVNPVVJDRShucSkpKSBhcyBOYW1lZFF1ZXJ5W11cbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy51c2VkRGF0YXNvdXJjZXMkLnN1YnNjcmliZSgodW5xKSA9PiAodGhpcy51c2VkTmFtZVF1ZXJ5SWRzID0gdW5xLm1hcCgobnEpID0+IG5xLmlkKSkpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGRhdGFzb3VyY2VJZHMkLnN1YnNjcmliZShcbiAgICAgIChkc0lkcykgPT4gKHRoaXMuc2VsZWN0ZWREYXRhU291cmNlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkc0lkcykpKVxuICAgICk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgd2lkZ2V0SW5kZXgod2lkZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX3dpZGdldEluZGV4JC5uZXh0KHdpZGdldEluZGV4KTtcbiAgICB0aGlzLl93aWRnZXRJbmRleCA9IHdpZGdldEluZGV4O1xuICB9XG5cbiAgc2VhcmNoJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICBsb2NrZWRWaWV3JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgdGFyZ2V0SW5kZXhlcyQ6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICB1c2VkRGF0YXNvdXJjZXMkITogT2JzZXJ2YWJsZTxEYXRhU291cmNlW10+O1xuICBhbGxEYXRhU291cmNlcyQ6IE9ic2VydmFibGU8RGF0YVNvdXJjZVtdPjtcbiAgdXNlZE5hbWVRdWVyeUlkcyE6IHN0cmluZ1tdO1xuICBjaG9pY2VVc2VkID0ge30gYXMgeyBbaXM6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgX3dpZGdldEluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgX3dpZGdldEluZGV4ITogbnVtYmVyO1xuICBvcGVuID0gZmFsc2U7XG4gIHNlbGVjdGVkRGF0YVNvdXJjZTogc3RyaW5nW10gPSBbXTtcbiAgaWRUb05hbWVEYXRhc291cmNlOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICB3aW5kb3dNYW5pZmVzdDogRGFzaGJvYXJkTWFuaWZlc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3aW5kb3dNYW5pZmVzdCQ6IE9ic2VydmFibGU8RGFzaGJvYXJkTWFuaWZlc3Q+O1xuICBwcml2YXRlIG1lbnVSZWY/OiBPdmVybGF5UmVmO1xuICBwcml2YXRlIGNvbWJvUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBjb25maXJtUmVtb3ZlUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBjYXRhbG9nUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBzcG90UmVmPzogT3ZlcmxheVJlZjtcbiAgbWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICB0eXBlOiBMaWJyYXJ5VHlwZXMgPSBMaWJyYXJ5VHlwZXMuSUxMVVNUUkFUSU9OO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHVibGljIHRvb2xib3hNZW51U2VydmljZTogVG9vbGJveE1lbnVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy53aW5kb3dNYW5pZmVzdCQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy53aW5kb3dNYW5pZmVzdClcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBKU09OLnN0cmluZ2lmeShwKSA9PT0gSlNPTi5zdHJpbmdpZnkoYykpKTtcblxuICAgIHRoaXMuYWxsRGF0YVNvdXJjZXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLm1hbmlmZXN0JCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZ2V0RGF0YVNvdXJjZXNTb3J0ZWQpLFxuICAgICAgdGhpcy5zZWFyY2gkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW21hbmlmZXN0LCBhbGxOYW1lZFF1ZXJpZXMsIHNlYXJjaFZhbHVlXSkgPT4ge1xuICAgICAgICBsZXQgbnFzID0gWy4uLmFsbE5hbWVkUXVlcmllc107XG4gICAgICAgIGlmICghIW1hbmlmZXN0KSB7XG4gICAgICAgICAgY29uc3QgbWFuaWZlc3ROYW1lZFF1ZXJpZXMgPSBBcnJheS5pc0FycmF5KG1hbmlmZXN0LmRhdGFzb3VyY2UpID8gbWFuaWZlc3QuZGF0YXNvdXJjZSA6IFttYW5pZmVzdC5kYXRhc291cmNlXTtcbiAgICAgICAgICBtYW5pZmVzdE5hbWVkUXVlcmllcy5mb3JFYWNoKChtYW5pZmVzdE5hbWVkUXVlcnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlQcmVzZW50ID0gISFhbGxOYW1lZFF1ZXJpZXMuZmluZCgobnEpID0+IG5xLmlkID09PSBtYW5pZmVzdE5hbWVkUXVlcnkpO1xuICAgICAgICAgICAgaWYgKCFhbHJlYWR5UHJlc2VudCkge1xuICAgICAgICAgICAgICBucXMucHVzaChVTktOT1dOX0RBVEFTT1VSQ0UobWFuaWZlc3ROYW1lZFF1ZXJ5ID8/ICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5xcy5maWx0ZXIoKG5xKSA9PiBucS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMudGFyZ2V0SW5kZXhlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMudGFyZ2V0VGVuYW50c0luZGV4ZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmFsbERhdGFTb3VyY2VzJC5zdWJzY3JpYmUoKGFsbE5xcykgPT4gYWxsTnFzLmZvckVhY2goKG5xKSA9PiAodGhpcy5jaG9pY2VVc2VkW25xLmlkXSA9IGZhbHNlKSkpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy53aW5kb3dNYW5pZmVzdCQuc3Vic2NyaWJlKChtYW5pZmVzdCkgPT4ge1xuICAgICAgICB0aGlzLndpbmRvd01hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5sb2NrZWRWaWV3JCA9IHRoaXMuc3RvcmVcbiAgICAgIC5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmdsb2JhbE1hbmlmZXN0KVxuICAgICAgLnBpcGUobWFwKChtKSA9PiAhIW0ubG9ja2VkIHx8ICEhdGhpcy5tYW5pZmVzdD8ubG9ja2VkKSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5hbGxEYXRhU291cmNlcyQuc3Vic2NyaWJlKChhbGxEcykgPT4gYWxsRHMuZm9yRWFjaCgoZHMpID0+ICh0aGlzLmlkVG9OYW1lRGF0YXNvdXJjZVtkcy5pZF0gPSBkcy5uYW1lKSkpXG4gICAgKTtcbiAgfVxuXG4gIG9uQXJyb3dVcCgpIHtcbiAgICBjb25zdCBsYXN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbT8ucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGxhc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uQXJyb3dEb3duKCkge1xuICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0/Lm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZmlyc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd01hbmlmZXN0Py5ncmlkPy5sYXlvdXQgPz8gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUw7XG4gIH1cblxuICBnZXQgaGFzR3JpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5b3V0ICE9PSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTDtcbiAgfVxuXG4gIGdldCBjdXJyZW50UGxhY2VtZW50SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2VzLmZpbmRJbmRleChcbiAgICAgIChwbGFjZSkgPT5cbiAgICAgICAgdGhpcy5tYW5pZmVzdD8ubGF5b3V0LnggPT09IHBsYWNlLmxheW91dC54ICYmXG4gICAgICAgIHRoaXMubWFuaWZlc3QubGF5b3V0LnkgPT09IHBsYWNlLmxheW91dC55ICYmXG4gICAgICAgIHRoaXMubWFuaWZlc3QubGF5b3V0LndpZHRoID09PSBwbGFjZS5sYXlvdXQud2lkdGggJiZcbiAgICAgICAgdGhpcy5tYW5pZmVzdC5sYXlvdXQuaGVpZ2h0ID09PSBwbGFjZS5sYXlvdXQuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIHRvb2dsZURhdGFTb3VyY2UoaWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuaW5jbHVkZXMoaWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5wdXNoKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UgPSB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5maWx0ZXIoKGRhdGFTb3VyY2VJZCkgPT4gZGF0YVNvdXJjZUlkICE9PSBpZCk7XG4gICAgfVxuICB9XG5cbiAgbWVudU9wZW4oJGV2ZW50PzogTW91c2VFdmVudCwgZm9yY2VPcGVuPzogYm9vbGVhbikge1xuICAgIHRoaXMubWVudSA9ICF0aGlzLm1lbnU7XG4gICAgY29uc3QgbXVzdE9wZW4gPSBmb3JjZU9wZW4gIT09IHVuZGVmaW5lZCA/IGZvcmNlT3BlbiA6ICF0aGlzLm1lbnVSZWY7XG4gICAgaWYgKG11c3RPcGVuKSB7XG4gICAgICB0aGlzLm1lbnVSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydtLWNvbnRleHQtbWVudS13cmFwcGVyJ10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJyxcbiAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXlcbiAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLnRvZ2dsZVBhbmVsKVxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1lbnUnIH0pKTtcbiAgICAgIHRoaXMubWVudVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLm1lbnVPcGVuKCkpO1xuICAgICAgdGhpcy5tZW51UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5vdmVybGF5TWVudSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLm1lbnVMaXN0Py5uYXRpdmVFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0/LmNoaWxkcmVuWzBdIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgICAgICAgIGZvY3VzID8gZm9jdXMuZm9jdXMoKSA6IGZvY3VzQ2hpbGRyZW5FbGVtZW50Py5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVudVJlZj8uZGlzcG9zZSgpO1xuICAgICAgdGhpcy5tZW51UmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1lbnUnIH0pKTtcbiAgICAgIHRoaXMudG9nZ2xlUGFuZWw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ29tYm8oKSB7XG4gICAgaWYgKCF0aGlzLmNvbWJvUmVmKSB7XG4gICAgICB0aGlzLnVzZWROYW1lUXVlcnlJZHMuZm9yRWFjaCgodW5xKSA9PiAodGhpcy5jaG9pY2VVc2VkW3VucV0gPSB0cnVlKSk7XG4gICAgICB0aGlzLmNvbWJvUmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnby13aWRnZXRfX2Nob29zZS1yZXN1bHRzZXQnXSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AnXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1jb21ibycgfSkpO1xuICAgICAgdGhpcy5jb21ib1JlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnRvZ2dsZUNvbWJvKCkpO1xuICAgICAgdGhpcy5jb21ib1JlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMudGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5wdXRDYXRhbG9nPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgfSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbWJvUmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuY29tYm9SZWYgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctY29tYm8nIH0pKTtcbiAgICAgIHRoaXMubWVudU9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBtb3ZlSW5OZXdXaW5kb3cod2lkZ2V0SW5kZXg6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5tb3ZlV2lkZ2V0KHsgd2lkZ2V0SW5kZXgsIHRhcmdldEluZGV4IH0pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudG9nZ2xlRWRpdGlvbk1vZGUoeyBmb3JjZTogZmFsc2UgfSkpO1xuICAgIHRoaXMubWVudU9wZW4oKTtcbiAgfVxuXG4gIG1heGltaXplKHdpZGdldEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMubWF4aW1pemVXaWRnZXQoeyB3aWRnZXRJbmRleCB9KSk7XG4gICAgdGhpcy5tZW51T3BlbigpO1xuICB9XG5cbiAgZW1pdE1hbmlmZXN0KCkge1xuICAgIHRoaXMubWFuaWZlc3RNb2RpZmllZC5lbWl0KHtcbiAgICAgIHdpZGdldEluZGV4OiB0aGlzLl93aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIC4uLnRoaXMubWFuaWZlc3QsXG4gICAgICAgIGRhdGFzb3VyY2U6IHRoaXMuc2VsZWN0ZWREYXRhU291cmNlXG4gICAgICB9IGFzIHVua25vd24gYXMgV2lkZ2V0TWFuaWZlc3RcbiAgICB9KTtcbiAgICB0aGlzLnRvZ2dsZUNvbWJvKCk7XG4gIH1cblxuICB0b2dnbGVSZW1vdmVDb25maXJtKCRldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlybVJlbW92ZVJlZikge1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnby1tb2RhbC13cmFwcGVyJ10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctbW9kYWwnIH0pKTtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnRvZ2dsZVJlbW92ZUNvbmZpcm0oKSk7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlTW9kYWwsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5vLW1vZGFsLXdyYXBwZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgaWYgKCEhcGFuZWwpIHtcbiAgICAgICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4od2luZG93LmlubmVyV2lkdGggLSBwYW5lbC5jbGllbnRXaWR0aCwgJGV2ZW50LmNsaWVudFggLSAzMCkpICsgJ3B4JztcbiAgICAgICAgICBwYW5lbC5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQgLSBwYW5lbC5jbGllbnRIZWlnaHQsICRldmVudC5jbGllbnRZIC0gMTApKSArICdweCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNyb3NzPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgfSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy50b2dnbGVQYW5lbD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tb2RhbCcgfSkpO1xuICAgICAgdGhpcy5tZW51T3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpcm1SZW1vdmUoKSB7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLmNhbmNlbFJlbW92ZUNvbmZpcm0oKTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBjb25zdCBsaXN0V2lkZ2V0TWFuaWZlc3RzID0gWy4uLih0aGlzLndpbmRvd01hbmlmZXN0IHx8IHsgd2lkZ2V0czogW10gfSkud2lkZ2V0c107XG4gICAgbGlzdFdpZGdldE1hbmlmZXN0cy5zcGxpY2UodGhpcy5fd2lkZ2V0SW5kZXgsIDEpO1xuXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkTWFuaWZlc3Qoe1xuICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgIC4uLnRoaXMud2luZG93TWFuaWZlc3QsXG4gICAgICAgICAgd2lkZ2V0czogbGlzdFdpZGdldE1hbmlmZXN0c1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjYW5jZWxSZW1vdmVDb25maXJtKCkge1xuICAgIHRoaXMuaXNFZGl0ID0gZmFsc2U7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSkpO1xuICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZj8uYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZVJlbW92ZUNvbmZpcm0oKSk7XG4gICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubWVudVJlZj8uZGlzcG9zZSgpO1xuICAgIHRoaXMubWVudVJlZiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctbWVudScgfSkpO1xuICB9XG5cbiAgdG9nZ2xlQ2F0YWxvZygpIHtcbiAgICBpZiAoIXRoaXMuY2F0YWxvZ1JlZikge1xuICAgICAgdGhpcy5jYXRhbG9nSW5mbyA9IHtcbiAgICAgICAgaWQ6IHY0KCksXG4gICAgICAgIGltYWdlOiAnJyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgY29udGVudDogJycsXG4gICAgICAgIGRhdGFzb3VyY2U6IFtdLFxuICAgICAgICBtb2RpZmljYXRpb25EYXRlOiAnJ1xuICAgICAgfTtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ28tbW9kYWwtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNhdGFsb2cnIH0pKTtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnRvZ2dsZUNhdGFsb2coKSk7XG4gICAgICB0aGlzLmNhdGFsb2dSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLm92ZXJsYXlDYXRhbG9nLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNyb3NzQ2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXRhbG9nUmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1jYXRhbG9nJyB9KSk7XG4gICAgICB0aGlzLm1lbnVPcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgY29uZmlybUNhdGFsb2coKSB7XG4gICAgaWYgKHRoaXMudG9vbGJveE1lbnVTZXJ2aWNlLmlzVmFsaWRGb3JDYXRhbG9nKHRoaXMuY2F0YWxvZ0luZm8ubmFtZSkpIHtcbiAgICAgIHRoaXMudG9vbGJveE1lbnVTZXJ2aWNlLmFkZFRvQ2F0YWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIC4uLnRoaXMuY2F0YWxvZ0luZm8sXG4gICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoeyAuLi50aGlzLm1hbmlmZXN0LCB0aXRsZTogdGhpcy5jYXRhbG9nSW5mby5uYW1lIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuX3dpZGdldEluZGV4XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUNhdGFsb2coKTtcbiAgfVxuXG4gIGV4ZWN1dGVBY3Rpb24ob3B0aW9uczogSGVhZGVyQWN0aW9uKSB7XG4gICAgb3B0aW9ucy5hY3Rpb24odGhpcyk7XG4gICAgdGhpcy5tZW51T3BlbigpO1xuICB9XG5cbiAgaXNBY3Rpb25EaXNhYmxlZChvcHRpb246IEhlYWRlckFjdGlvbikge1xuICAgIHJldHVybiAhIW9wdGlvbj8uZGlzYWJsZWQgPyBvcHRpb24/LmRpc2FibGVkKHRoaXMpIDogZmFsc2U7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uKGhlYWRlck9wdGlvbnM6IGFueSwgcGFyYW1ldGVyczogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGhlYWRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgaGVhZGVyT3B0aW9ucyA9PT0gdHJ1ZSB8fFxuICAgICAgaGVhZGVyT3B0aW9uc1twYXJhbWV0ZXJzXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBoZWFkZXJPcHRpb25zW3BhcmFtZXRlcnNdID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIGRpc3BsYXlTZXR0aW5ncyhoZWFkZXJPcHRpb25zOiB7IFtwOiBzdHJpbmddOiBib29sZWFuIH0gfCB7fSB8IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBoZWFkZXJPcHRpb25zID09PSB1bmRlZmluZWQgfHwgaGVhZGVyT3B0aW9ucyA9PT0gdHJ1ZSB8fCBPYmplY3Qua2V5cyhoZWFkZXJPcHRpb25zKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgdG9nZ2xlQ2hhbmdlU3BvdCgpIHtcbiAgICBpZiAoIXRoaXMuc3BvdFJlZikge1xuICAgICAgdGhpcy5wbGFjZXMgPSBXaWRnZXRQbGFjZW1lbnRVdGlscy5wbGFjZW1lbnRPcHRpb25zKHsgdHlwZTogJ2ljb24nIH0gYXMgV2lkZ2V0TWFuaWZlc3QsIHRoaXMuY3VycmVudExheW91dCwge1xuICAgICAgICAuLi50aGlzLndpbmRvd01hbmlmZXN0Py5ncmlkXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zcG90UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnby1tb2RhbC13cmFwcGVyJ10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctc3BvdCcgfSkpO1xuICAgICAgdGhpcy5zcG90UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGVDaGFuZ2VTcG90KCkpO1xuICAgICAgdGhpcy5zcG90UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5vdmVybGF5U3BvdCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3BvdFJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLnNwb3RSZWYgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctc3BvdCcgfSkpO1xuICAgICAgdGhpcy5tZW51T3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVUb1BsYWNlKHBsYWNlOiBXaWRnZXRNYW5pZmVzdCkge1xuICAgIGNvbnN0IHN0YXJ0TGF5b3V0ID0gdGhpcy5tYW5pZmVzdCEubGF5b3V0O1xuICAgIGNvbnN0IHRhcmdldExheW91dCA9IHBsYWNlLmxheW91dDtcbiAgICBjb25zdCBuZXdXaW5kb3dNYW5pZmVzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy53aW5kb3dNYW5pZmVzdCkpIGFzIERhc2hib2FyZE1hbmlmZXN0O1xuXG4gICAgY29uc3QgdGFyZ2V0V2lkZ2V0SW5kZXggPSBuZXdXaW5kb3dNYW5pZmVzdC53aWRnZXRzLmZpbmRJbmRleChcbiAgICAgICh3KSA9PlxuICAgICAgICB3LmxheW91dC54ID09PSB0YXJnZXRMYXlvdXQueCAmJlxuICAgICAgICB3LmxheW91dC55ID09PSB0YXJnZXRMYXlvdXQueSAmJlxuICAgICAgICB3LmxheW91dC53aWR0aCA9PT0gdGFyZ2V0TGF5b3V0LndpZHRoICYmXG4gICAgICAgIHcubGF5b3V0LmhlaWdodCA9PT0gdGFyZ2V0TGF5b3V0LmhlaWdodFxuICAgICk7XG4gICAgY29uc3Qgc3RhcnRXaWRnZXRJbmRleCA9IG5ld1dpbmRvd01hbmlmZXN0LndpZGdldHMuZmluZEluZGV4KFxuICAgICAgKHcpID0+XG4gICAgICAgIHcubGF5b3V0LnggPT09IHN0YXJ0TGF5b3V0LnggJiZcbiAgICAgICAgdy5sYXlvdXQueSA9PT0gc3RhcnRMYXlvdXQueSAmJlxuICAgICAgICB3LmxheW91dC53aWR0aCA9PT0gc3RhcnRMYXlvdXQud2lkdGggJiZcbiAgICAgICAgdy5sYXlvdXQuaGVpZ2h0ID09PSBzdGFydExheW91dC5oZWlnaHRcbiAgICApO1xuICAgIGlmICh0YXJnZXRXaWRnZXRJbmRleCAhPT0gLTEpIHtcbiAgICAgIG5ld1dpbmRvd01hbmlmZXN0LndpZGdldHNbdGFyZ2V0V2lkZ2V0SW5kZXhdLmxheW91dCA9IHN0YXJ0TGF5b3V0O1xuICAgIH1cbiAgICBuZXdXaW5kb3dNYW5pZmVzdC53aWRnZXRzW3N0YXJ0V2lkZ2V0SW5kZXhdLmxheW91dCA9IHRhcmdldExheW91dDtcblxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEYXNoYm9hcmRNYW5pZmVzdCh7IG1hbmlmZXN0OiBuZXdXaW5kb3dNYW5pZmVzdCB9KSk7XG5cbiAgICB0aGlzLnRvZ2dsZUNoYW5nZVNwb3QoKTtcbiAgfVxuXG4gIGZvY3VzQ3Jvc3NFbGVtZW50KCkge1xuICAgIHRoaXMuY3Jvc3M/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgdGhpcy5jcm9zc0NhdGFsb2c/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cblxuICBmb2N1c1ZhbGlkYXRpb24oKSB7XG4gICAgdGhpcy52YWxpZGF0ZUNhdGFsb2c/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgaWYgKCF0aGlzLnRvb2xib3hNZW51U2VydmljZS5pc1ZhbGlkRm9yQ2F0YWxvZyh0aGlzLmNhdGFsb2dJbmZvPy5uYW1lKSkge1xuICAgICAgdGhpcy5jYW5jZWw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGU/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cblxuICBmb2N1c0lucHV0Q2F0YWxvZygpIHtcbiAgICB0aGlzLmlucHV0Q2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIGRpc2FibGVWYWxpZGF0aW9uKCkge1xuICAgIGlmICghdGhpcy50b29sYm94TWVudVNlcnZpY2UuaXNWYWxpZEZvckNhdGFsb2codGhpcy5jYXRhbG9nSW5mbz8ubmFtZSkpIHtcbiAgICAgIHRoaXMuY3Jvc3NDYXRhbG9nPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJcIj5cbiAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRcIj5cbiAgICA8aDIgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X190aXRsZVwiICpuZ0lmPVwiISF0aXRsZTsgZWxzZSBxdWVyeVNlbGVjdG9yXCI+XG4gICAgICB7eyB0aXRsZSB9fVxuICAgIDwvaDI+XG4gICAgPG5nLXRlbXBsYXRlICNxdWVyeVNlbGVjdG9yPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZHMgb2YgdXNlZERhdGFzb3VyY2VzJCB8IGFzeW5jXCIgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X19xdWVyeVwiPlxuICAgICAgICA8cHJ5LW5xLWNvbG9yLXNlbGVjdG9yIFtkaXNhYmxlZF09XCJ0cnVlXCIgW2RhdGFzb3VyY2VdPVwiZHNcIj48L3ByeS1ucS1jb2xvci1zZWxlY3Rvcj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgIFtoZWlnaHRdPVwiMjBcIlxuICAgICAgICAgIFtzcmNdPVwiZHMuaWQgfCB0cmFuc2xhdGVJZDogeyB0eXBlOiAnZGF0YXNvdXJjZScsIG91dHB1dDogJ2ljb24nIH0gfCBhc3luY1wiXG4gICAgICAgICAgW3dpZHRoXT1cIjIwXCJcbiAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgIGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fcXVlcnlfX2ljb25cIlxuICAgICAgICAvPlxuICAgICAgICA8aDMgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X19xdWVyeV9fbmFtZVwiPnt7IGRzLm5hbWUgfX08L2gzPlxuICAgICAgICA8aDMgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X19xdWVyeV9fbmFtZVwiICpuZ0lmPVwiZGlzcGxheUNvdW50XCI+XG4gICAgICAgICAgKHt7IHVzZWROYW1lUXVlcnlJZHMgfCByZXN1bHRTZXRTaXplIHwgYXN5bmMgfX0pXG4gICAgICAgIDwvaDM+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhKHVzZWREYXRhc291cmNlcyQgfCBhc3luYyk/Lmxlbmd0aFwiIGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fbm8tZGF0YVwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X190aXRsZVwiPnt7ICdAcHJ5LndpZGdldC5ub0RhdGEnIHwgaTE4biB9fTwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCIgKm5nSWY9XCIhKGxvY2tlZFZpZXckIHwgYXN5bmMpICYmIGRpc3BsYXlTZXR0aW5ncyhoZWFkZXJPcHRpb25zKVwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgaWQ9XCJkaWFsb2dfTWVudVwiXG4gICAgICBhcmlhLWNvbnRyb2xzPVwibWVudVwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInRoaXMubWVudVwiXG4gICAgICAjdG9nZ2xlUGFuZWxcbiAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLW1vcmVcIlxuICAgICAgKGNsaWNrKT1cIm1lbnVPcGVuKCRldmVudClcIlxuICAgID5cbiAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjI1XCIgW3dpZHRoXT1cIjI1XCIgaWNvblN2Zz1cIm1vcmVfaG9yaXpcIj48L3ByeS1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LmFjdGlvbi5vcGVuTWVudVdpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI292ZXJsYXlNZW51PlxuICA8ZGl2IGNsYXNzPVwibS1jb250ZXh0LW1lbnVcIj5cbiAgICA8dWxcbiAgICAgIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RcIlxuICAgICAgI21lbnVMaXN0XG4gICAgICBpZD1cIm1lbnVcIlxuICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nX01lbnVcIlxuICAgICAgKGtleWRvd24uYXJyb3dEb3duKT1cIm9uQXJyb3dEb3duKClcIlxuICAgICAgKGtleWRvd24uYXJyb3dVcCk9XCJvbkFycm93VXAoKVwiXG4gICAgICAoa2V5ZG93bi5lc2NhcGUpPVwibWVudU9wZW4oKVwiXG4gICAgPlxuICAgICAgPGxpXG4gICAgICAgIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIlxuICAgICAgICByb2xlPVwibm9uZVwiXG4gICAgICAgICpuZ0lmPVwiISFtYW5pZmVzdD8uZGF0YXNvdXJjZSAmJiBkaXNwbGF5T3B0aW9uKGhlYWRlck9wdGlvbnMsICdkYXRhc291cmNlU2VsZWN0aW9uJylcIlxuICAgICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICBpZD1cInRvZ2dsZUFjdGlvbnNcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb21ibygpXCJcbiAgICAgICAgICAqcHJ5QWNjZXNzPVwieyBtb2R1bGU6ICdkYXNoYm9hcmQnLCBwYWdlOiAnd2lkZ2V0JywgYWN0aW9uOiAnc2VsZWN0X25hbWVkX3F1ZXJ5JyB9XCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuXCJcbiAgICAgICAgICBbcHJ5VG9vbHRpcF09XCJpbmZvVG9vbHRpcFwiXG4gICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImluZm9Ub29sdGlwX3dpZGdldEhlYWRlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxN1wiIFt3aWR0aF09XCIxN1wiIGljb25Tdmc9XCJzdGFjay1maWxsXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAnQHByeS53aWRnZXQudG9vbHRpcC5yZWFkU2VhcmNoJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIiAqbmdJZj1cImRpc3BsYXlPcHRpb24oaGVhZGVyT3B0aW9ucywgJ3BhcmFtZXRlcnMnKVwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2xpPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlPcHRpb24oaGVhZGVyT3B0aW9ucywgJ3dpbmRvdycpXCI+XG4gICAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIiAqbmdGb3I9XCJsZXQgdGFyZ2V0SW5kZXggb2YgdGFyZ2V0SW5kZXhlcyQgfCBhc3luY1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJbk5ld1dpbmRvdyhfd2lkZ2V0SW5kZXgsIHRhcmdldEluZGV4KVwiXG4gICAgICAgICAgICBjbGFzcz1cImEtYnRuXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICNzZWNvbmRFbGVtZW50XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBpY29uU3ZnPVwibGF1bmNoXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICh0YXJnZXRJbmRleCAhPT0gLTEgPyAnQHByeS53aWRnZXQudGFyZ2V0LmV4aXN0aW5nJyA6ICdAcHJ5LndpZGdldC50YXJnZXQubmV3JylcbiAgICAgICAgICAgICAgICB8IGkxOG46IHsgdGFyZ2V0SW5kZXg6IHRoaXMudGFyZ2V0SW5kZXggKyAxIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIiAqbmdJZj1cImhhc0dyaWQgJiYgZGlzcGxheU9wdGlvbihoZWFkZXJPcHRpb25zLCAnY2hhbmdlU3BvdCcpXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDaGFuZ2VTcG90KClcIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIFtwcnlUb29sdGlwXT1cImluZm9DaGFuZ2VTcG90XCJcbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5mb1Rvb2x0aXBfY2hhbmdlU3BvdFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxN1wiIFt3aWR0aF09XCIxN1wiIGljb25Tdmc9XCJtb3ZlXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAnQHByeS53aWRnZXQudG9vbHRpcC5jaGFuZ2VTcG90JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIiAqbmdJZj1cImRpc3BsYXlPcHRpb24oaGVhZGVyT3B0aW9ucywgJ21heGltaXplJylcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm1heGltaXplKF93aWRnZXRJbmRleClcIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJtZW51T3BlbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cImZ1bGxzY3JlZW5cIj48L3ByeS1pY29uPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC50YXJnZXQubWF4aW1pemUnIHwgaTE4biB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdF9faXRlbVwiIHJvbGU9XCJub25lXCIgKm5nSWY9XCJkaXNwbGF5T3B0aW9uKGhlYWRlck9wdGlvbnMsICdhZGRUb0NhdGFsb2cnKVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2F0YWxvZygpXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuXCJcbiAgICAgICAgICBbcHJ5VG9vbHRpcF09XCJpbmZvQWRkXCJcbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5mb0FkZF93aWRnZXRIZWFkZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBpY29uU3ZnPVwibGlicmFyeV9hZGRcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmNhdGFsb2dXaWRnZXQnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiICpuZ0lmPVwiZGlzcGxheU9wdGlvbihoZWFkZXJPcHRpb25zLCAnZGVsZXRlJylcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlbW92ZUNvbmZpcm0oJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJhLWJ0blwiXG4gICAgICAgICAgW3ByeVRvb2x0aXBdPVwiaW5mb1JlbW92ZVwiXG4gICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImluZm9SZW1vdmVfd2lkZ2V0SGVhZGVyXCJcbiAgICAgICAgICAoa2V5ZG93bi50YWIpPVwibWVudU9wZW4oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxN1wiIFt3aWR0aF09XCIxN1wiIGljb25Tdmc9XCJkZWxldGVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmRlbGV0ZVdpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdF9faXRlbVwiIHJvbGU9XCJub25lXCIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBhZGRpdGlvbmFsT3B0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJhLWJ0blwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0ZUFjdGlvbihvcHRpb24pXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNBY3Rpb25EaXNhYmxlZChvcHRpb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgW2ljb25TdmddPVwib3B0aW9uLmljb25cIj48L3ByeS1pY29uPlxuICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU1vZGFsPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJvLW1vZGFsXCJcbiAgICAoa2V5ZG93bi5lc2NhcGUpPVwiY2FuY2VsUmVtb3ZlQ29uZmlybSgpXCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nIGNvbmZpcm0gZGVsZXRlIHByZXNlbnRhdGlvblwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX190aXRsZVwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJhLWgyXCIgaWQ9XCJkaWFsb2dfdGl0bGVcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQubW9kYWxUaXRsZScgfCBpMThuIH19XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX2Nsb3NlXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgI2Nyb3NzIChjbGljayk9XCJjYW5jZWxSZW1vdmVDb25maXJtKClcIj5cbiAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCIgW2hlaWdodF09XCIzNVwiIFt3aWR0aF09XCIzNVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LnRvb2xib3guY2xvc2UnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXBcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjYW5jZWxSZW1vdmVDb25maXJtKClcIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIj5cbiAgICAgICAge3sgJ0BwcnkudG9vbGJveC5tYW5pZmVzdC5jbG9zZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJjb25maXJtUmVtb3ZlKClcIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5XCIgKGtleWRvd24udGFiKT1cImZvY3VzQ3Jvc3NFbGVtZW50KClcIj5cbiAgICAgICAge3sgJ0BwcnkudG9vbGJveC5tYW5pZmVzdC52YWxpZGF0ZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2luZm9Ub29sdGlwPlxuICA8ZGl2IGNsYXNzPVwibS10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIiBpZD1cImluZm9Ub29sdGlwX3dpZGdldEhlYWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibS10b29sdGlwX190ZXh0XCI+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAucmVhZFNlYXJjaCcgfCBpMThuIH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2luZm9SZW1vdmU+XG4gIDxkaXYgY2xhc3M9XCJtLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiIGlkPVwiaW5mb1JlbW92ZV93aWRnZXRIZWFkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmRlbGV0ZVdpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2luZm9BZGQ+XG4gIDxkaXYgY2xhc3M9XCJtLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiIGlkPVwiaW5mb0FkZF93aWRnZXRIZWFkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmNhdGFsb2dXaWRnZXQnIHwgaTE4biB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNpbmZvQ2hhbmdlU3BvdD5cbiAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCIgaWQ9XCJpbmZvQWRkX2NoYW5nZVNwb3RcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmNoYW5nZVNwb3QnIHwgaTE4biB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibS1uYW1lZHF1ZXJpZXMtd3JhcHBlclwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cImRpYWxvZ19uYW1lZHF1ZXJpZXNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXRfX3NlYXJjaFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIGlkPVwiY2F0YWxvZy1zZWFyY2hcIlxuICAgICAgICAjaW5wdXRDYXRhbG9nXG4gICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJmb2N1c1ZhbGlkYXRpb24oKVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1JlY2hlcmNoZXogdW5lIGRvbm7DqWUnXCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoJCB8IGFzeW5jXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGhpcy5zZWFyY2gkLm5leHQoJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJzZWFyY2hcIiBbd2lkdGhdPVwiMTdcIiBbaGVpZ2h0XT1cIjE3XCI+PC9wcnktaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWREYXRhU291cmNlLmxlbmd0aCA+IDA7IGVsc2Ugbm9EYXRhU291cmNlXCI+XG4gICAgICA8aDQgY2xhc3M9XCJhLWg0XCI+e3sgJ0BwcnkucmVzdGl0dXRpb24uc2VsZWN0aW9uJyB8IGkxOG4gfX08L2g0PlxuICAgICAgPGRpdj5cbiAgICAgICAgPHVsIGNsYXNzPVwiby1kYXRhc291cmNlc19fbGlzdCBvLWRhdGFzb3VyY2VzX19saXN0LS1zZWxlY3RlZFwiPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaWQgb2Ygc2VsZWN0ZWREYXRhU291cmNlXCIgY2xhc3M9XCJvLWRhdGFzb3VyY2VzX19pdGVtXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiby1kYXRhc291cmNlc19fY2FyZCBpcy1zZWxlY3RlZFwiIChjbGljayk9XCJ0b29nbGVEYXRhU291cmNlKGlkKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAge3sgaWRUb05hbWVEYXRhc291cmNlW2lkXSB9fVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeSBhLWJ0bi0taWNvbi1vbmx5XCI+XG4gICAgICAgICAgICAgICAgPHByeS1pY29uIFtpY29uU3ZnXT1cIidjbG9zZSdcIiBbd2lkdGhdPVwiMTdcIiBbaGVpZ2h0XT1cIjE3XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkucmVzdGl0dXRpb24udW5zZWxlY3REYXRhU291cmNlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9EYXRhU291cmNlPlxuICAgICAgPGg0IGNsYXNzPVwiYS1oNFwiPnt7ICdAcHJ5LnJlc3RpdHV0aW9uLm5vRGF0YVNvdXJjZVNlbGVjdGVkJyB8IGkxOG4gfX08L2g0PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGg0IGNsYXNzPVwiYS1oNFwiPnt7ICdAcHJ5LnJlc3RpdHV0aW9uLnNlbGVjdCcgfCBpMThuIH19PC9oND5cbiAgICA8dWwgY2xhc3M9XCJvLWRhdGFzb3VyY2VzX19saXN0XCI+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IG5xIG9mIGFsbERhdGFTb3VyY2VzJCB8IGFzeW5jXCIgKGNsaWNrKT1cInRvb2dsZURhdGFTb3VyY2UobnEuaWQpXCIgY2xhc3M9XCJvLWRhdGFzb3VyY2VzX19pdGVtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvLWRhdGFzb3VyY2VzX19jYXJkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm8tZGF0YXNvdXJjZXNfX2NhcmRfX25hbWVcIj5cbiAgICAgICAgICAgIDxwcnktY2hlY2tib3hcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWREYXRhU291cmNlLmluY2x1ZGVzKG5xLmlkKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICA+PC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkucmVzdGl0dXRpb24uc2VsZWN0RGF0YVNvdXJjZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJhLXBcIj57eyBucS5pZCB8IHRyYW5zbGF0ZUlkOiB7IHR5cGU6ICdkYXRhc291cmNlJywgb3V0cHV0OiAnbmFtZScgfSB8IGFzeW5jIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ0b2dnbGVDb21ibygpXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCI+XG4gICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgICAjdmFsaWRhdGVcbiAgICAgIChrZXlkb3duLnRhYik9XCJmb2N1c0lucHV0Q2F0YWxvZygpXCJcbiAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIlxuICAgID5cbiAgICAgIHt7ICdAcHJ5LnRvb2xib3gubWFuaWZlc3QudmFsaWRhdGVkJyB8IGkxOG4gfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI292ZXJsYXlDYXRhbG9nPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJvLW1vZGFsXCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nX0NhdGFsb2dcIlxuICAgIChrZXlkb3duLmVzY2FwZSk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fdGl0bGVcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwiYS1oMlwiPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5kZWZpbmVDYXRhbG9nJyB8IGkxOG4gfX1cbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fY2xvc2VcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgKGtleWRvd24uc2hpZnQudGFiKT1cImZvY3VzVmFsaWRhdGlvbigpXCJcbiAgICAgICAgICAjY3Jvc3NDYXRhbG9nXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhdGFsb2coKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCIgW2hlaWdodF09XCIzNVwiIFt3aWR0aF09XCIzNVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LnRvb2xib3guY2xvc2UnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibmFtZVwiPnt7ICdAcHJ5LnRvb2xib3guY2F0YWxvZy5sYWJlbCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImNhdGFsb2dJbmZvLm5hbWVcIiBpZD1cIm5hbWVcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCIgcmVxdWlyZWQgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiZGVzY3JpcHRpb25cIj57eyAnQHByeS50b29sYm94LmNhdGFsb2cuZGVzY3JpcHRpb24nIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJjYXRhbG9nSW5mby5kZXNjcmlwdGlvblwiIGlkPVwiZGVzY3JpcHRpb25cIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCIgcmVxdWlyZWQgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICA8cHJ5LXNlbGVjdC1pbWFnZVxuICAgICAgICBbaWNvblVybF09XCJjYXRhbG9nSW5mby5pbWFnZVwiXG4gICAgICAgIChjaGFuZ2VkKT1cImNhdGFsb2dJbmZvLmltYWdlID0gJGV2ZW50XCJcbiAgICAgICAgW21vZGVdPVwidHlwZVwiXG4gICAgICA+PC9wcnktc2VsZWN0LWltYWdlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhdGFsb2coKVwiXG4gICAgICAgICNjYW5jZWxcbiAgICAgICAgKGtleWRvd24udGFiKT1cImRpc2FibGVWYWxpZGF0aW9uKClcIlxuICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIlxuICAgICAgPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgI3ZhbGlkYXRlQ2F0YWxvZ1xuICAgICAgICAoY2xpY2spPVwiY29uZmlybUNhdGFsb2coKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdG9vbGJveE1lbnVTZXJ2aWNlLmlzVmFsaWRGb3JDYXRhbG9nKGNhdGFsb2dJbmZvLm5hbWUpXCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiXG4gICAgICAgIChrZXlkb3duLnRhYik9XCJmb2N1c0Nyb3NzRWxlbWVudCgpXCJcbiAgICAgID5cbiAgICAgICAge3sgJ0BwcnkudG9vbGJveC5tYW5pZmVzdC52YWxpZGF0ZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI292ZXJsYXlTcG90PlxuICA8ZGl2IGNsYXNzPVwiby1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX3RpdGxlXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImEtaDJcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQudG9vbHRpcC5jaGFuZ2VTcG90JyB8IGkxOG4gfX1cbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fY2xvc2VcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9nZ2xlQ2hhbmdlU3BvdCgpXCI+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiIFtoZWlnaHRdPVwiMzVcIiBbd2lkdGhdPVwiMzVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS50b29sYm94LmNsb3NlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGxhY2Ugb2YgcGxhY2VzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFBsYWNlbWVudEluZGV4ICE9PSBpXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYS1idG5cIiAoY2xpY2spPVwibW92ZVRvUGxhY2UocGxhY2UpXCI+XG4gICAgICAgICAgPHNwYW4+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuc3BvdE5hbWUnIHwgaTE4bjogeyBwbGFjZTogaSArIDEgfSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
441
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvZGFzaGJvYXJkL2NvbXBvbmVudHMvd2lkZ2V0cy9oZWFkZXIvd2lkZ2V0LWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1CQUFtQixFQUFxQyxNQUFNLDJDQUEyQyxDQUFDO0FBRW5ILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUMvRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtD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QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDUCxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVE7Z0JBQ1EsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNFLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBT1IsUUFBUTtzQkFBcEIsS0FBSztnQkFJRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFhTSxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLFdBQVc7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFVOS05PV05fREFUQVNPVVJDRSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvY29tcG9uZW50cy90cmFuc2xhdGUtaWQvdHJhbnNsYXRlLWlkLnBpcGUnO1xuaW1wb3J0IHsgRGFzaGJvYXJkR3JpZExheW91dCwgRGFzaGJvYXJkTWFuaWZlc3QsIFdpZGdldE1hbmlmZXN0IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbC9tYW5pZmVzdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgV2lkZ2V0IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbC93aWRnZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbmZpZ0FjdGlvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3N0b3JlL2NvbmZpZy9jb25maWcuYWN0aW9ucyc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9kYXRhLXNvdXJjZS9kYXRhLXNvdXJjZS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VsZWN0b3JzIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9kYXRhLXNvdXJjZS9kYXRhLXNvdXJjZS5zZWxlY3RvcnMnO1xuaW1wb3J0IHsgTGlicmFyeVR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdG9yZS9pbWFnZS9pbWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvb2xib3hNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdG9vbGJveC90b29sYm94LW1lbnUuc2VydmljZSc7XG5pbXBvcnQgeyBEYXNoYm9hcmRBY3Rpb25zIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvZGFzaGJvYXJkLmFjdGlvbnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkU2VsZWN0b3JzIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvZGFzaGJvYXJkLnNlbGVjdG9ycyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9zdWJzY3JpcHRpb25uZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFdpZGdldFBsYWNlbWVudFV0aWxzIH0gZnJvbSAnLi4vd2lkZ2V0LXBsYWNlbWVudC93aWRnZXQtcGxhY2VtZW50LnV0aWxzJztcblxuZXhwb3J0IGNvbnN0IFdJREdFVF9IRUFERVJfSEVJR0hUID0gNjA7XG5cbmV4cG9ydCB0eXBlIEhlYWRlckFjdGlvbiA9IHtcbiAgaWNvbjogc3RyaW5nO1xuICBhY3Rpb246ICh0aGF0OiBQcnlXaWRnZXRIZWFkZXJDb21wb25lbnQpID0+IHZvaWQ7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRpc2FibGVkPzogKHRoYXQ6IFByeVdpZGdldEhlYWRlckNvbXBvbmVudCkgPT4gYm9vbGVhbjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtaGVhZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFByeVdpZGdldEhlYWRlckNvbXBvbmVudCBleHRlbmRzIFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZSB7XG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0ZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlTW9kYWwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRlbXBsYXRlTW9kYWwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0b2dnbGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRvZ2dsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlNZW51JywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBvdmVybGF5TWVudSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlDYXRhbG9nJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBvdmVybGF5Q2F0YWxvZyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlTcG90JywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBvdmVybGF5U3BvdCE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ3RvZ2dsZVBhbmVsJykgdG9nZ2xlUGFuZWwhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY3Jvc3MnKSBjcm9zcyE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd2YWxpZGF0ZScpIHZhbGlkYXRlITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3ZhbGlkYXRlQ2F0YWxvZycpIHZhbGlkYXRlQ2F0YWxvZyE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjYW5jZWwnKSBjYW5jZWwhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY3Jvc3NDYXRhbG9nJykgY3Jvc3NDYXRhbG9nITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2lucHV0Q2F0YWxvZycpIGlucHV0Q2F0YWxvZyE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ21lbnVMaXN0JykgbWVudUxpc3QhOiBFbGVtZW50UmVmO1xuICBtYW5pZmVzdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdpZGdldE1hbmlmZXN0IHwgbnVsbD4obnVsbCk7XG4gIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcGxhY2VzOiBXaWRnZXRNYW5pZmVzdFtdID0gW107XG4gIHNlbGVjdGVkSXRlbT86IEVsZW1lbnQgfCBudWxsO1xuICB1c2VkRGF0YXNvdXJjZXMkOiBPYnNlcnZhYmxlPERhdGFTb3VyY2VbXT47XG5cbiAgQElucHV0KCkgc2V0IG1hbmlmZXN0KG1hbmlmZXN0OiBXaWRnZXRNYW5pZmVzdCB8IG51bGwpIHtcbiAgICB0aGlzLm1hbmlmZXN0JC5uZXh0KG1hbmlmZXN0KTtcbiAgfVxuXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxPcHRpb25zOiBIZWFkZXJBY3Rpb25bXSB8IG51bGwgPSBbXTtcbiAgQElucHV0KCkgaGVhZGVyT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfCB7fSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgZGlzcGxheUNvdW50ID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgbWFuaWZlc3RNb2RpZmllZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyB3aWRnZXRJbmRleDogbnVtYmVyOyBtYW5pZmVzdDogV2lkZ2V0TWFuaWZlc3QgfT4oKTtcblxuICBpc0VkaXQgPSBmYWxzZTtcbiAgY2F0YWxvZ0luZm86IFdpZGdldCA9IHtcbiAgICBpZDogdjQoKSxcbiAgICBpbWFnZTogJycsXG4gICAgbmFtZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIGNvbnRlbnQ6ICcnLFxuICAgIGRhdGFzb3VyY2U6IFtdLFxuICAgIG1vZGlmaWNhdGlvbkRhdGU6ICcnXG4gIH07XG5cbiAgQElucHV0KCkgc2V0IGRhdGFzb3VyY2VJZHMoZGF0YXNvdXJjZUlkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZUlkcyQubmV4dChkYXRhc291cmNlSWRzKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB3aWRnZXRJbmRleCh3aWRnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fd2lkZ2V0SW5kZXgkLm5leHQod2lkZ2V0SW5kZXgpO1xuICAgIHRoaXMuX3dpZGdldEluZGV4ID0gd2lkZ2V0SW5kZXg7XG4gIH1cblxuICBsb2NrZWRWaWV3JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgdGFyZ2V0SW5kZXhlcyQ6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICBfd2lkZ2V0SW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBfd2lkZ2V0SW5kZXghOiBudW1iZXI7XG4gIG9wZW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWREYXRhU291cmNlSWRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcblxuICB3aW5kb3dNYW5pZmVzdDogRGFzaGJvYXJkTWFuaWZlc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3aW5kb3dNYW5pZmVzdCQ6IE9ic2VydmFibGU8RGFzaGJvYXJkTWFuaWZlc3Q+O1xuICBwcml2YXRlIG1lbnVSZWY/OiBPdmVybGF5UmVmO1xuICBwcml2YXRlIGNvbWJvUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBjb25maXJtUmVtb3ZlUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBjYXRhbG9nUmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSBzcG90UmVmPzogT3ZlcmxheVJlZjtcbiAgbWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICB0eXBlOiBMaWJyYXJ5VHlwZXMgPSBMaWJyYXJ5VHlwZXMuSUxMVVNUUkFUSU9OO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHVibGljIHRvb2xib3hNZW51U2VydmljZTogVG9vbGJveE1lbnVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy53aW5kb3dNYW5pZmVzdCQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy53aW5kb3dNYW5pZmVzdClcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBKU09OLnN0cmluZ2lmeShwKSA9PT0gSlNPTi5zdHJpbmdpZnkoYykpKTtcblxuICAgIHRoaXMudGFyZ2V0SW5kZXhlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMudGFyZ2V0VGVuYW50c0luZGV4ZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndpbmRvd01hbmlmZXN0JC5zdWJzY3JpYmUoKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIHRoaXMud2luZG93TWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmxvY2tlZFZpZXckID0gdGhpcy5zdG9yZVxuICAgICAgLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuZ2xvYmFsTWFuaWZlc3QpXG4gICAgICAucGlwZShtYXAoKG0pID0+ICEhbS5sb2NrZWQgfHwgISF0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpPy5sb2NrZWQpKTtcblxuICAgIHRoaXMudXNlZERhdGFzb3VyY2VzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGF0YVNvdXJjZVNlbGVjdG9ycy5nZXREYXRhU291cmNlc1NvcnRlZCksXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZUlkcyRcbiAgICBdKS5waXBlKG1hcCgoW2FsbERzcywgZHNJZHNdKSA9PiBkc0lkcy5tYXAoKGlkKSA9PiBhbGxEc3MuZmluZCgoZHMpID0+IGRzLmlkID09PSBpZCkgPz8gVU5LTk9XTl9EQVRBU09VUkNFKGlkKSkpKTtcbiAgfVxuXG4gIG9uQXJyb3dVcCgpIHtcbiAgICBjb25zdCBsYXN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbT8ucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGxhc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uQXJyb3dEb3duKCkge1xuICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMubWVudUxpc3QubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0/Lm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZmlyc3RFbGVtZW50O1xuICAgIH1cbiAgICBjb25zdCBmb2N1c0VsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNDaGlsZHJlbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkSXRlbT8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0gYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKGZvY3VzQ2hpbGRyZW5FbGVtZW50KSB7XG4gICAgICBmb2N1c0NoaWxkcmVuRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd01hbmlmZXN0Py5ncmlkPy5sYXlvdXQgPz8gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUw7XG4gIH1cblxuICBnZXQgaGFzR3JpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5b3V0ICE9PSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTDtcbiAgfVxuXG4gIGdldCBjdXJyZW50UGxhY2VtZW50SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2VzLmZpbmRJbmRleChcbiAgICAgIChwbGFjZSkgPT5cbiAgICAgICAgdGhpcy5tYW5pZmVzdCQuZ2V0VmFsdWUoKT8ubGF5b3V0LnggPT09IHBsYWNlLmxheW91dC54ICYmXG4gICAgICAgIHRoaXMubWFuaWZlc3QkLmdldFZhbHVlKCk/LmxheW91dC55ID09PSBwbGFjZS5sYXlvdXQueSAmJlxuICAgICAgICB0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpPy5sYXlvdXQud2lkdGggPT09IHBsYWNlLmxheW91dC53aWR0aCAmJlxuICAgICAgICB0aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpPy5sYXlvdXQuaGVpZ2h0ID09PSBwbGFjZS5sYXlvdXQuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIG1lbnVPcGVuKCRldmVudD86IE1vdXNlRXZlbnQsIGZvcmNlT3Blbj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLm1lbnUgPSAhdGhpcy5tZW51O1xuICAgIGNvbnN0IG11c3RPcGVuID0gZm9yY2VPcGVuICE9PSB1bmRlZmluZWQgPyBmb3JjZU9wZW4gOiAhdGhpcy5tZW51UmVmO1xuICAgIGlmIChtdXN0T3Blbikge1xuICAgICAgdGhpcy5tZW51UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnbS1jb250ZXh0LW1lbnUtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCcsXG4gICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy50b2dnbGVQYW5lbClcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tZW51JyB9KSk7XG4gICAgICB0aGlzLm1lbnVSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoXykgPT4gdGhpcy5tZW51T3BlbigpKTtcbiAgICAgIHRoaXMubWVudVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMub3ZlcmxheU1lbnUsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5tZW51TGlzdD8ubmF0aXZlRWxlbWVudD8uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5zZWxlY3RlZEl0ZW0/LmNoaWxkcmVuWzBdIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGZvY3VzQ2hpbGRyZW5FbGVtZW50ID0gdGhpcy5zZWxlY3RlZEl0ZW0/LmNoaWxkcmVuWzBdPy5jaGlsZHJlblswXSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICAgICAgICBmb2N1cyA/IGZvY3VzLmZvY3VzKCkgOiBmb2N1c0NoaWxkcmVuRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lbnVSZWY/LmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMubWVudVJlZiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tZW51JyB9KSk7XG4gICAgICB0aGlzLnRvZ2dsZVBhbmVsPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUNvbWJvKCkge1xuICAgIGlmICghdGhpcy5jb21ib1JlZikge1xuICAgICAgdGhpcy5jb21ib1JlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ28td2lkZ2V0X19jaG9vc2UtcmVzdWx0c2V0J10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctY29tYm8nIH0pKTtcbiAgICAgIHRoaXMuY29tYm9SZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoXykgPT4gdGhpcy50b2dnbGVDb21ibygpKTtcbiAgICAgIHRoaXMuY29tYm9SZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0Q2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21ib1JlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmNvbWJvUmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLWNvbWJvJyB9KSk7XG4gICAgICB0aGlzLm1lbnVPcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgbW92ZUluTmV3V2luZG93KHdpZGdldEluZGV4OiBudW1iZXIsIHRhcmdldEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMubW92ZVdpZGdldCh7IHdpZGdldEluZGV4LCB0YXJnZXRJbmRleCB9KSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnRvZ2dsZUVkaXRpb25Nb2RlKHsgZm9yY2U6IGZhbHNlIH0pKTtcbiAgICB0aGlzLm1lbnVPcGVuKCk7XG4gIH1cblxuICBtYXhpbWl6ZSh3aWRnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLm1heGltaXplV2lkZ2V0KHsgd2lkZ2V0SW5kZXggfSkpO1xuICAgIHRoaXMubWVudU9wZW4oKTtcbiAgfVxuXG4gIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy5fd2lkZ2V0SW5kZXgsXG4gICAgICBtYW5pZmVzdDoge1xuICAgICAgICAuLi50aGlzLm1hbmlmZXN0JC5nZXRWYWx1ZSgpLFxuICAgICAgICBkYXRhc291cmNlOiB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZUlkcyQuZ2V0VmFsdWUoKVxuICAgICAgfSBhcyB1bmtub3duIGFzIFdpZGdldE1hbmlmZXN0XG4gICAgfSk7XG4gICAgdGhpcy50b2dnbGVDb21ibygpO1xuICB9XG5cbiAgdG9nZ2xlUmVtb3ZlQ29uZmlybSgkZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpcm1SZW1vdmVSZWYpIHtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ28tbW9kYWwtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1vZGFsJyB9KSk7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoXykgPT4gdGhpcy50b2dnbGVSZW1vdmVDb25maXJtKCkpO1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy50ZW1wbGF0ZU1vZGFsLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgIGlmICgkZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXYuby1tb2RhbC13cmFwcGVyJykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIGlmICghIXBhbmVsKSB7XG4gICAgICAgICAgcGFuZWwuc3R5bGUubGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoIC0gcGFuZWwuY2xpZW50V2lkdGgsICRldmVudC5jbGllbnRYIC0gMzApKSArICdweCc7XG4gICAgICAgICAgcGFuZWwuc3R5bGUudG9wID0gTWF0aC5tYXgoMCwgTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0IC0gcGFuZWwuY2xpZW50SGVpZ2h0LCAkZXZlbnQuY2xpZW50WSAtIDEwKSkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jcm9zcz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMudG9nZ2xlUGFuZWw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctbW9kYWwnIH0pKTtcbiAgICAgIHRoaXMubWVudU9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBjb25maXJtUmVtb3ZlKCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgdGhpcy5jYW5jZWxSZW1vdmVDb25maXJtKCk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgY29uc3QgbGlzdFdpZGdldE1hbmlmZXN0cyA9IFsuLi4odGhpcy53aW5kb3dNYW5pZmVzdCB8fCB7IHdpZGdldHM6IFtdIH0pLndpZGdldHNdO1xuICAgIGxpc3RXaWRnZXRNYW5pZmVzdHMuc3BsaWNlKHRoaXMuX3dpZGdldEluZGV4LCAxKTtcblxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZURhc2hib2FyZE1hbmlmZXN0KHtcbiAgICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgICAuLi50aGlzLndpbmRvd01hbmlmZXN0LFxuICAgICAgICAgIHdpZGdldHM6IGxpc3RXaWRnZXRNYW5pZmVzdHNcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY2FuY2VsUmVtb3ZlQ29uZmlybSgpIHtcbiAgICB0aGlzLmlzRWRpdCA9IGZhbHNlO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pKTtcbiAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWY/LmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGVSZW1vdmVDb25maXJtKCkpO1xuICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lbnVSZWY/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLm1lbnVSZWYgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1lbnUnIH0pKTtcbiAgfVxuXG4gIHRvZ2dsZUNhdGFsb2coKSB7XG4gICAgaWYgKCF0aGlzLmNhdGFsb2dSZWYpIHtcbiAgICAgIHRoaXMuY2F0YWxvZ0luZm8gPSB7XG4gICAgICAgIGlkOiB2NCgpLFxuICAgICAgICBpbWFnZTogJycsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgICBkYXRhc291cmNlOiBbXSxcbiAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogJydcbiAgICAgIH07XG4gICAgICB0aGlzLmNhdGFsb2dSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLW1vZGFsLXdyYXBwZXInXSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AnXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1jYXRhbG9nJyB9KSk7XG4gICAgICB0aGlzLmNhdGFsb2dSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoXykgPT4gdGhpcy50b2dnbGVDYXRhbG9nKCkpO1xuICAgICAgdGhpcy5jYXRhbG9nUmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5vdmVybGF5Q2F0YWxvZywgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jcm9zc0NhdGFsb2c/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB9LCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2F0YWxvZ1JlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmNhdGFsb2dSZWYgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctY2F0YWxvZycgfSkpO1xuICAgICAgdGhpcy5tZW51T3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpcm1DYXRhbG9nKCkge1xuICAgIGlmICh0aGlzLnRvb2xib3hNZW51U2VydmljZS5pc1ZhbGlkRm9yQ2F0YWxvZyh0aGlzLmNhdGFsb2dJbmZvLm5hbWUpKSB7XG4gICAgICB0aGlzLnRvb2xib3hNZW51U2VydmljZS5hZGRUb0NhdGFsb2coXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLmNhdGFsb2dJbmZvLFxuICAgICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHsgLi4udGhpcy5tYW5pZmVzdCQuZ2V0VmFsdWUoKSwgdGl0bGU6IHRoaXMuY2F0YWxvZ0luZm8ubmFtZSB9KVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLl93aWRnZXRJbmRleFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVDYXRhbG9nKCk7XG4gIH1cblxuICBleGVjdXRlQWN0aW9uKG9wdGlvbnM6IEhlYWRlckFjdGlvbikge1xuICAgIG9wdGlvbnMuYWN0aW9uKHRoaXMpO1xuICAgIHRoaXMubWVudU9wZW4oKTtcbiAgfVxuXG4gIGlzQWN0aW9uRGlzYWJsZWQob3B0aW9uOiBIZWFkZXJBY3Rpb24pIHtcbiAgICByZXR1cm4gISFvcHRpb24/LmRpc2FibGVkID8gb3B0aW9uPy5kaXNhYmxlZCh0aGlzKSA6IGZhbHNlO1xuICB9XG5cbiAgZGlzcGxheU9wdGlvbihoZWFkZXJPcHRpb25zOiBhbnksIHBhcmFtZXRlcnM6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICBoZWFkZXJPcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGhlYWRlck9wdGlvbnMgPT09IHRydWUgfHxcbiAgICAgIGhlYWRlck9wdGlvbnNbcGFyYW1ldGVyc10gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgaGVhZGVyT3B0aW9uc1twYXJhbWV0ZXJzXSA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICBkaXNwbGF5U2V0dGluZ3MoaGVhZGVyT3B0aW9uczogeyBbcDogc3RyaW5nXTogYm9vbGVhbiB9IHwge30gfCB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gaGVhZGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGhlYWRlck9wdGlvbnMgPT09IHRydWUgfHwgT2JqZWN0LmtleXMoaGVhZGVyT3B0aW9ucykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHRvZ2dsZUNoYW5nZVNwb3QoKSB7XG4gICAgaWYgKCF0aGlzLnNwb3RSZWYpIHtcbiAgICAgIHRoaXMucGxhY2VzID0gV2lkZ2V0UGxhY2VtZW50VXRpbHMucGxhY2VtZW50T3B0aW9ucyh7IHR5cGU6ICdpY29uJyB9IGFzIFdpZGdldE1hbmlmZXN0LCB0aGlzLmN1cnJlbnRMYXlvdXQsIHtcbiAgICAgICAgLi4udGhpcy53aW5kb3dNYW5pZmVzdD8uZ3JpZFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3BvdFJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ28tbW9kYWwtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLXNwb3QnIH0pKTtcbiAgICAgIHRoaXMuc3BvdFJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMudG9nZ2xlQ2hhbmdlU3BvdCgpKTtcbiAgICAgIHRoaXMuc3BvdFJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMub3ZlcmxheVNwb3QsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNwb3RSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5zcG90UmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLXNwb3QnIH0pKTtcbiAgICAgIHRoaXMubWVudU9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBtb3ZlVG9QbGFjZShwbGFjZTogV2lkZ2V0TWFuaWZlc3QpIHtcbiAgICBjb25zdCBzdGFydExheW91dCA9IHRoaXMubWFuaWZlc3QkLmdldFZhbHVlKCkhLmxheW91dDtcbiAgICBjb25zdCB0YXJnZXRMYXlvdXQgPSBwbGFjZS5sYXlvdXQ7XG4gICAgY29uc3QgbmV3V2luZG93TWFuaWZlc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMud2luZG93TWFuaWZlc3QpKSBhcyBEYXNoYm9hcmRNYW5pZmVzdDtcblxuICAgIGNvbnN0IHRhcmdldFdpZGdldEluZGV4ID0gbmV3V2luZG93TWFuaWZlc3Qud2lkZ2V0cy5maW5kSW5kZXgoXG4gICAgICAodykgPT5cbiAgICAgICAgdy5sYXlvdXQueCA9PT0gdGFyZ2V0TGF5b3V0LnggJiZcbiAgICAgICAgdy5sYXlvdXQueSA9PT0gdGFyZ2V0TGF5b3V0LnkgJiZcbiAgICAgICAgdy5sYXlvdXQud2lkdGggPT09IHRhcmdldExheW91dC53aWR0aCAmJlxuICAgICAgICB3LmxheW91dC5oZWlnaHQgPT09IHRhcmdldExheW91dC5oZWlnaHRcbiAgICApO1xuICAgIGNvbnN0IHN0YXJ0V2lkZ2V0SW5kZXggPSBuZXdXaW5kb3dNYW5pZmVzdC53aWRnZXRzLmZpbmRJbmRleChcbiAgICAgICh3KSA9PlxuICAgICAgICB3LmxheW91dC54ID09PSBzdGFydExheW91dC54ICYmXG4gICAgICAgIHcubGF5b3V0LnkgPT09IHN0YXJ0TGF5b3V0LnkgJiZcbiAgICAgICAgdy5sYXlvdXQud2lkdGggPT09IHN0YXJ0TGF5b3V0LndpZHRoICYmXG4gICAgICAgIHcubGF5b3V0LmhlaWdodCA9PT0gc3RhcnRMYXlvdXQuaGVpZ2h0XG4gICAgKTtcbiAgICBpZiAodGFyZ2V0V2lkZ2V0SW5kZXggIT09IC0xKSB7XG4gICAgICBuZXdXaW5kb3dNYW5pZmVzdC53aWRnZXRzW3RhcmdldFdpZGdldEluZGV4XS5sYXlvdXQgPSBzdGFydExheW91dDtcbiAgICB9XG4gICAgbmV3V2luZG93TWFuaWZlc3Qud2lkZ2V0c1tzdGFydFdpZGdldEluZGV4XS5sYXlvdXQgPSB0YXJnZXRMYXlvdXQ7XG5cbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkTWFuaWZlc3QoeyBtYW5pZmVzdDogbmV3V2luZG93TWFuaWZlc3QgfSkpO1xuXG4gICAgdGhpcy50b2dnbGVDaGFuZ2VTcG90KCk7XG4gIH1cblxuICBmb2N1c0Nyb3NzRWxlbWVudCgpIHtcbiAgICB0aGlzLmNyb3NzPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIHRoaXMuY3Jvc3NDYXRhbG9nPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgZm9jdXNWYWxpZGF0aW9uKCkge1xuICAgIHRoaXMudmFsaWRhdGVDYXRhbG9nPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIGlmICghdGhpcy50b29sYm94TWVudVNlcnZpY2UuaXNWYWxpZEZvckNhdGFsb2codGhpcy5jYXRhbG9nSW5mbz8ubmFtZSkpIHtcbiAgICAgIHRoaXMuY2FuY2VsPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgZm9jdXNJbnB1dENhdGFsb2coKSB7XG4gICAgdGhpcy5pbnB1dENhdGFsb2c/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cblxuICBkaXNhYmxlVmFsaWRhdGlvbigpIHtcbiAgICBpZiAoIXRoaXMudG9vbGJveE1lbnVTZXJ2aWNlLmlzVmFsaWRGb3JDYXRhbG9nKHRoaXMuY2F0YWxvZ0luZm8/Lm5hbWUpKSB7XG4gICAgICB0aGlzLmNyb3NzQ2F0YWxvZz8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBkYXRhc291cmNlc0NoYW5nZWQoJGV2ZW50OiBEYXRhU291cmNlW10pIHtcbiAgICBjb25zdCBpZHMgPSAkZXZlbnQubWFwKChkcykgPT4gZHMuaWQpO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZUlkcyQuZ2V0VmFsdWUoKSkgIT09IEpTT04uc3RyaW5naWZ5KGlkcykpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhU291cmNlSWRzJC5uZXh0KGlkcyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiby13aWRnZXRfX2hlYWRlclwiPlxuICA8ZGl2IGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudFwiPlxuICAgIDxoMiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3RpdGxlXCIgKm5nSWY9XCIobWFuaWZlc3QkIHwgYXN5bmMpPy50aXRsZTsgZWxzZSBxdWVyeVNlbGVjdG9yXCI+XG4gICAgICB7eyAobWFuaWZlc3QkIHwgYXN5bmMpPy50aXRsZSB9fVxuICAgIDwvaDI+XG4gICAgPG5nLXRlbXBsYXRlICNxdWVyeVNlbGVjdG9yPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZHMgb2YgdXNlZERhdGFzb3VyY2VzJCB8IGFzeW5jXCIgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X19xdWVyeVwiPlxuICAgICAgICA8cHJ5LW5xLWNvbG9yLXNlbGVjdG9yIFtkaXNhYmxlZF09XCJ0cnVlXCIgW2RhdGFzb3VyY2VdPVwiZHNcIj48L3ByeS1ucS1jb2xvci1zZWxlY3Rvcj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgIFtoZWlnaHRdPVwiMjBcIlxuICAgICAgICAgIFtzcmNdPVwiZHMuaWQgfCB0cmFuc2xhdGVJZCA6IHsgdHlwZTogJ2RhdGFzb3VyY2UnLCBvdXRwdXQ6ICdpY29uJyB9IHwgYXN5bmNcIlxuICAgICAgICAgIFt3aWR0aF09XCIyMFwiXG4gICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3F1ZXJ5X19pY29uXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGgzIGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fcXVlcnlfX25hbWVcIj57eyBkcy5uYW1lIH19PC9oMz5cbiAgICAgICAgPGgzIGNsYXNzPVwiby13aWRnZXRfX2hlYWRlcl9fY29udGVudF9fcXVlcnlfX25hbWVcIiAqbmdJZj1cImRpc3BsYXlDb3VudFwiPlxuICAgICAgICAgICh7eyAoc2VsZWN0ZWREYXRhU291cmNlSWRzJCB8IGFzeW5jKSA/PyBbXSB8IHJlc3VsdFNldFNpemUgfCBhc3luYyB9fSlcbiAgICAgICAgPC9oMz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIigodXNlZERhdGFzb3VyY2VzJCB8IGFzeW5jKSA/PyBbXSkubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJvLXdpZGdldF9faGVhZGVyX19jb250ZW50X19uby1kYXRhXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cIm8td2lkZ2V0X19oZWFkZXJfX2NvbnRlbnRfX3RpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm5vRGF0YScgfCBpMThuIH19PC9oMj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXBcIiAqbmdJZj1cIiEobG9ja2VkVmlldyQgfCBhc3luYykgJiYgZGlzcGxheVNldHRpbmdzKGhlYWRlck9wdGlvbnMpXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBpZD1cImRpYWxvZ19NZW51XCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJtZW51XCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidGhpcy5tZW51XCJcbiAgICAgICN0b2dnbGVQYW5lbFxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tbW9yZVwiXG4gICAgICAoY2xpY2spPVwibWVudU9wZW4oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMjVcIiBbd2lkdGhdPVwiMjVcIiBpY29uU3ZnPVwibW9yZV9ob3JpelwiPjwvcHJ5LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLm9wZW5NZW51V2lkZ2V0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjb3ZlcmxheU1lbnU+XG4gIDxkaXYgY2xhc3M9XCJtLWNvbnRleHQtbWVudVwiPlxuICAgIDx1bFxuICAgICAgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdFwiXG4gICAgICAjbWVudUxpc3RcbiAgICAgIGlkPVwibWVudVwiXG4gICAgICByb2xlPVwibWVudVwiXG4gICAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2dfTWVudVwiXG4gICAgICAoa2V5ZG93bi5hcnJvd0Rvd24pPVwib25BcnJvd0Rvd24oKVwiXG4gICAgICAoa2V5ZG93bi5hcnJvd1VwKT1cIm9uQXJyb3dVcCgpXCJcbiAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJtZW51T3BlbigpXCJcbiAgICA+XG4gICAgICA8bGlcbiAgICAgICAgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdF9faXRlbVwiXG4gICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgKm5nSWY9XCIobWFuaWZlc3QkIHwgYXN5bmMpPy5kYXRhc291cmNlICYmIGRpc3BsYXlPcHRpb24oaGVhZGVyT3B0aW9ucywgJ2RhdGFzb3VyY2VTZWxlY3Rpb24nKVwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIGlkPVwidG9nZ2xlQWN0aW9uc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbWJvKClcIlxuICAgICAgICAgICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2Rhc2hib2FyZCcsIHBhZ2U6ICd3aWRnZXQnLCBhY3Rpb246ICdzZWxlY3RfbmFtZWRfcXVlcnknIH1cIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgIFtwcnlUb29sdGlwXT1cImluZm9Ub29sdGlwXCJcbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5mb1Rvb2x0aXBfd2lkZ2V0SGVhZGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cInN0YWNrLWZpbGxcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLnJlYWRTZWFyY2gnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiICpuZ0lmPVwiZGlzcGxheU9wdGlvbihoZWFkZXJPcHRpb25zLCAncGFyYW1ldGVycycpXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvbGk+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheU9wdGlvbihoZWFkZXJPcHRpb25zLCAnd2luZG93JylcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiICpuZ0Zvcj1cImxldCB0YXJnZXRJbmRleCBvZiB0YXJnZXRJbmRleGVzJCB8IGFzeW5jXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwibW92ZUluTmV3V2luZG93KF93aWRnZXRJbmRleCwgdGFyZ2V0SW5kZXgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cImxhdW5jaFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAodGFyZ2V0SW5kZXggIT09IC0xID8gJ0Bwcnkud2lkZ2V0LnRhcmdldC5leGlzdGluZycgOiAnQHByeS53aWRnZXQudGFyZ2V0Lm5ldycpXG4gICAgICAgICAgICAgICAgfCBpMThuIDogeyB0YXJnZXRJbmRleDogdGhpcy50YXJnZXRJbmRleCArIDEgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiICpuZ0lmPVwiaGFzR3JpZCAmJiBkaXNwbGF5T3B0aW9uKGhlYWRlck9wdGlvbnMsICdjaGFuZ2VTcG90JylcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoYW5nZVNwb3QoKVwiXG4gICAgICAgICAgY2xhc3M9XCJhLWJ0blwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgW3ByeVRvb2x0aXBdPVwiaW5mb0NoYW5nZVNwb3RcIlxuICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbmZvVG9vbHRpcF9jaGFuZ2VTcG90XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cIm1vdmVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLmNoYW5nZVNwb3QnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIiByb2xlPVwibm9uZVwiICpuZ0lmPVwiZGlzcGxheU9wdGlvbihoZWFkZXJPcHRpb25zLCAnbWF4aW1pemUnKVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAoY2xpY2spPVwibWF4aW1pemUoX3dpZGdldEluZGV4KVwiXG4gICAgICAgICAgY2xhc3M9XCJhLWJ0blwiXG4gICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cIm1lbnVPcGVuKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBpY29uU3ZnPVwiZnVsbHNjcmVlblwiPjwvcHJ5LWljb24+XG4gICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0LnRhcmdldC5tYXhpbWl6ZScgfCBpMThuIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIiAqbmdJZj1cImRpc3BsYXlPcHRpb24oaGVhZGVyT3B0aW9ucywgJ2FkZFRvQ2F0YWxvZycpXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG5cIlxuICAgICAgICAgIFtwcnlUb29sdGlwXT1cImluZm9BZGRcIlxuICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbmZvQWRkX3dpZGdldEhlYWRlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxN1wiIFt3aWR0aF09XCIxN1wiIGljb25Tdmc9XCJsaWJyYXJ5X2FkZFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuY2F0YWxvZ1dpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgY2xhc3M9XCJtLWNvbnRleHQtbWVudV9fbGlzdF9faXRlbVwiIHJvbGU9XCJub25lXCIgKm5nSWY9XCJkaXNwbGF5T3B0aW9uKGhlYWRlck9wdGlvbnMsICdkZWxldGUnKVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmVtb3ZlQ29uZmlybSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuXCJcbiAgICAgICAgICBbcHJ5VG9vbHRpcF09XCJpbmZvUmVtb3ZlXCJcbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5mb1JlbW92ZV93aWRnZXRIZWFkZXJcIlxuICAgICAgICAgIChrZXlkb3duLnRhYik9XCJtZW51T3BlbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjE3XCIgW3dpZHRoXT1cIjE3XCIgaWNvblN2Zz1cImRlbGV0ZVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuZGVsZXRlV2lkZ2V0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCIgcm9sZT1cIm5vbmVcIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGFkZGl0aW9uYWxPcHRpb25zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIChjbGljayk9XCJleGVjdXRlQWN0aW9uKG9wdGlvbilcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FjdGlvbkRpc2FibGVkKG9wdGlvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTdcIiBbd2lkdGhdPVwiMTdcIiBbaWNvblN2Z109XCJvcHRpb24uaWNvblwiPjwvcHJ5LWljb24+XG4gICAgICAgICAge3sgb3B0aW9uLmxhYmVsIHwgaTE4biB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTW9kYWw+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm8tbW9kYWxcIlxuICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWxSZW1vdmVDb25maXJtKClcIlxuICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2cgY29uZmlybSBkZWxldGUgcHJlc2VudGF0aW9uXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX3RpdGxlXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImEtaDJcIiBpZD1cImRpYWxvZ190aXRsZVwiPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tb2RhbFRpdGxlJyB8IGkxOG4gfX1cbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fY2xvc2VcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIiAjY3Jvc3MgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiPlxuICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIiBbaGVpZ2h0XT1cIjM1XCIgW3dpZHRoXT1cIjM1XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkudG9vbGJveC5jbG9zZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cImNvbmZpcm1SZW1vdmUoKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIiAoa2V5ZG93bi50YWIpPVwiZm9jdXNDcm9zc0VsZW1lbnQoKVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LnZhbGlkYXRlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5mb1Rvb2x0aXA+XG4gIDxkaXYgY2xhc3M9XCJtLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiIGlkPVwiaW5mb1Rvb2x0aXBfd2lkZ2V0SGVhZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJtLXRvb2x0aXBfX3RleHRcIj57eyAnQHByeS53aWRnZXQudG9vbHRpcC5yZWFkU2VhcmNoJyB8IGkxOG4gfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjaW5mb1JlbW92ZT5cbiAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCIgaWQ9XCJpbmZvUmVtb3ZlX3dpZGdldEhlYWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibS10b29sdGlwX190ZXh0XCI+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuZGVsZXRlV2lkZ2V0JyB8IGkxOG4gfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjaW5mb0FkZD5cbiAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCIgaWQ9XCJpbmZvQWRkX3dpZGdldEhlYWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibS10b29sdGlwX190ZXh0XCI+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuY2F0YWxvZ1dpZGdldCcgfCBpMThuIH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2luZm9DaGFuZ2VTcG90PlxuICA8ZGl2IGNsYXNzPVwibS10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIiBpZD1cImluZm9BZGRfY2hhbmdlU3BvdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibS10b29sdGlwX190ZXh0XCI+e3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuY2hhbmdlU3BvdCcgfCBpMThuIH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGU+XG4gIDxwcnktZGF0YXNvdXJjZS1zZWxlY3RvclxuICAgIChjYW5jZWwpPVwidG9nZ2xlQ29tYm8oKVwiXG4gICAgKHZhbGlkYXRlZCk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgKG5leHRUYWIpPVwiZm9jdXNJbnB1dENhdGFsb2coKVwiXG4gICAgKHByZXZpb3VzVGFiKT1cImZvY3VzVmFsaWRhdGlvbigpXCJcbiAgICAoZGF0YXNvdXJjZXNDaGFuZ2VkKT1cImRhdGFzb3VyY2VzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICBbZGF0YXNvdXJjZUlkc109XCIoc2VsZWN0ZWREYXRhU291cmNlSWRzJCB8IGFzeW5jKSA/PyBbXVwiXG4gID48L3ByeS1kYXRhc291cmNlLXNlbGVjdG9yPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNvdmVybGF5Q2F0YWxvZz5cbiAgPGRpdlxuICAgIGNsYXNzPVwiby1tb2RhbFwiXG4gICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgIGFyaWEtbGFiZWxsZWRieT1cImRpYWxvZ19DYXRhbG9nXCJcbiAgICAoa2V5ZG93bi5lc2NhcGUpPVwidG9nZ2xlQ2F0YWxvZygpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX3RpdGxlXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImEtaDJcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQuZGVmaW5lQ2F0YWxvZycgfCBpMThuIH19XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX2Nsb3NlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJmb2N1c1ZhbGlkYXRpb24oKVwiXG4gICAgICAgICAgI2Nyb3NzQ2F0YWxvZ1xuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiIFtoZWlnaHRdPVwiMzVcIiBbd2lkdGhdPVwiMzVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS50b29sYm94LmNsb3NlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm5hbWVcIj57eyAnQHByeS50b29sYm94LmNhdGFsb2cubGFiZWwnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJjYXRhbG9nSW5mby5uYW1lXCIgaWQ9XCJuYW1lXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIHJlcXVpcmVkIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImRlc2NyaXB0aW9uXCI+e3sgJ0BwcnkudG9vbGJveC5jYXRhbG9nLmRlc2NyaXB0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiY2F0YWxvZ0luZm8uZGVzY3JpcHRpb25cIiBpZD1cImRlc2NyaXB0aW9uXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIHJlcXVpcmVkIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgPHByeS1zZWxlY3QtaW1hZ2VcbiAgICAgICAgW2ljb25VcmxdPVwiY2F0YWxvZ0luZm8uaW1hZ2VcIlxuICAgICAgICAoY2hhbmdlZCk9XCJjYXRhbG9nSW5mby5pbWFnZSA9ICRldmVudFwiXG4gICAgICAgIFttb2RlXT1cInR5cGVcIlxuICAgICAgPjwvcHJ5LXNlbGVjdC1pbWFnZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXBcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXRhbG9nKClcIlxuICAgICAgICAjY2FuY2VsXG4gICAgICAgIChrZXlkb3duLnRhYik9XCJkaXNhYmxlVmFsaWRhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCJcbiAgICAgID5cbiAgICAgICAge3sgJ0BwcnkudG9vbGJveC5tYW5pZmVzdC5jbG9zZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICN2YWxpZGF0ZUNhdGFsb2dcbiAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1DYXRhbG9nKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXRvb2xib3hNZW51U2VydmljZS5pc1ZhbGlkRm9yQ2F0YWxvZyhjYXRhbG9nSW5mby5uYW1lKVwiXG4gICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIlxuICAgICAgICAoa2V5ZG93bi50YWIpPVwiZm9jdXNDcm9zc0VsZW1lbnQoKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdAcHJ5LnRvb2xib3gubWFuaWZlc3QudmFsaWRhdGUnIHwgaTE4biB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNvdmVybGF5U3BvdD5cbiAgPGRpdiBjbGFzcz1cIm8tbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX190aXRsZVwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJhLWgyXCI+XG4gICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0LnRvb2x0aXAuY2hhbmdlU3BvdCcgfCBpMThuIH19XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX2Nsb3NlXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgKGNsaWNrKT1cInRvZ2dsZUNoYW5nZVNwb3QoKVwiPlxuICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIiBbaGVpZ2h0XT1cIjM1XCIgW3dpZHRoXT1cIjM1XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkudG9vbGJveC5jbG9zZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHBsYWNlIG9mIHBsYWNlczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRQbGFjZW1lbnRJbmRleCAhPT0gaVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImEtYnRuXCIgKGNsaWNrKT1cIm1vdmVUb1BsYWNlKHBsYWNlKVwiPlxuICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC50b29sdGlwLnNwb3ROYW1lJyB8IGkxOG4gOiB7IHBsYWNlOiBpICsgMSB9IH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|