@provoly/dashboard 0.14.6 → 0.14.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/components/metadata-editor/metadata-editor.component.d.ts +3 -1
- package/dataset/components/dataset-detail/dataset-detail.component.d.ts +1 -0
- package/dataset/i18n/en.translations.d.ts +1 -0
- package/dataset/i18n/fr.translations.d.ts +1 -0
- package/dataset/style/_o-pry-dataset-detail.scss +7 -6
- package/dataset/style/_o-pry-dataset.scss +6 -3
- package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +1 -1
- package/esm2022/admin/components/admin-user/admin-user-select/admin-user-select.component.mjs +1 -1
- package/esm2022/components/metadata-editor/metadata-editor.component.mjs +30 -9
- package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +6 -3
- package/esm2022/dataset/i18n/en.translations.mjs +2 -1
- package/esm2022/dataset/i18n/fr.translations.mjs +2 -1
- package/esm2022/dataset/style/css.component.mjs +2 -2
- package/esm2022/lib/core/i18n/en.translations.mjs +3 -2
- package/esm2022/lib/core/i18n/fr.translations.mjs +3 -2
- package/esm2022/lib/core/model/widget-map-manifest.interface.mjs +1 -1
- package/esm2022/lib/core/store/config/config.effects.mjs +3 -3
- package/esm2022/lib/core/store/data-source/data-source.effects.mjs +4 -4
- package/esm2022/lib/core/store/relation-types/relation-types.effects.mjs +3 -2
- package/esm2022/lib/dashboard/components/context-menu/context-menu.component.mjs +1 -1
- package/esm2022/lib/dashboard/components/dashboard.component.mjs +11 -8
- package/esm2022/lib/dashboard/components/widgets/widget-instanciator/widget-instanciator.component.mjs +2 -6
- package/esm2022/lib/dashboard/public-api.mjs +2 -2
- package/esm2022/lib/dashboard/store/dashboard.actions.mjs +6 -2
- package/esm2022/lib/dashboard/store/dashboard.effects.mjs +20 -13
- package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +11 -2
- package/esm2022/lib/dashboard/store/dashboard.selectors.mjs +4 -2
- package/esm2022/lib/dashboard/store/manifest.service.mjs +11 -1
- package/esm2022/lib/dashboard/store/wms.service.mjs +54 -0
- package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +19 -3
- package/esm2022/presentation/presentation.module.mjs +8 -4
- package/esm2022/presentation/style/css.component.mjs +2 -2
- package/esm2022/restitution/components/restitution/restitution.component.mjs +1 -1
- package/esm2022/widgets/widget-map/component/widget-map-layer.service.mjs +2 -1
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +34 -32
- package/esm2022/widgets/widget-map/pipe/widget-map-legend-url.pipe.mjs +3 -4
- package/esm2022/widgets/widget-map/public-api.mjs +1 -2
- package/esm2022/widgets/widget-map/utils/xml-utils.class.mjs +20 -1
- package/fesm2022/provoly-dashboard-admin.mjs +2 -2
- package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs +29 -8
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-dataset.mjs +9 -4
- package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-presentation.mjs +26 -7
- package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-restitution.mjs +1 -1
- package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +37 -76
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +110 -66
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/lib/core/i18n/en.translations.d.ts +1 -0
- package/lib/core/i18n/fr.translations.d.ts +1 -0
- package/lib/core/model/widget-map-manifest.interface.d.ts +1 -0
- package/lib/dashboard/components/dashboard.component.d.ts +4 -4
- package/lib/dashboard/components/widgets/widget-instanciator/widget-instanciator.component.d.ts +1 -3
- package/lib/dashboard/public-api.d.ts +1 -1
- package/lib/dashboard/store/dashboard.actions.d.ts +31 -0
- package/lib/dashboard/store/dashboard.effects.d.ts +9 -3
- package/lib/dashboard/store/dashboard.reducers.d.ts +4 -0
- package/lib/dashboard/store/dashboard.selectors.d.ts +5 -0
- package/lib/dashboard/store/manifest.service.d.ts +2 -0
- package/{widgets/widget-map/component → lib/dashboard/store}/wms.service.d.ts +4 -4
- package/package.json +31 -31
- package/presentation/components/add-edit-presentation/add-edit-presentation.component.d.ts +3 -0
- package/presentation/presentation.module.d.ts +2 -1
- package/presentation/style/_o-pry-new-presentation.scss +18 -5
- package/schematics/ng-update/version-0-14/index.spec.js +0 -1
- package/schematics/ng-update/version-0-14/index.spec.js.map +1 -1
- package/widgets/widget-map/component/widget-map.component.d.ts +11 -8
- package/widgets/widget-map/pipe/widget-map-legend-url.pipe.d.ts +4 -3
- package/widgets/widget-map/public-api.d.ts +0 -1
- package/widgets/widget-map/utils/xml-utils.class.d.ts +1 -0
- package/esm2022/lib/dashboard/store/geocoding.service.mjs +0 -44
- package/esm2022/widgets/widget-map/component/wms.service.mjs +0 -67
- package/lib/dashboard/store/geocoding.service.d.ts +0 -56
|
@@ -10,27 +10,25 @@ import { fromLonLat, get as getProjection, transform } from 'ol/proj';
|
|
|
10
10
|
import { register } from 'ol/proj/proj4';
|
|
11
11
|
import { TileWMS } from 'ol/source';
|
|
12
12
|
import proj4 from 'proj4';
|
|
13
|
-
import { BehaviorSubject, combineLatest, debounceTime, delay, distinctUntilChanged, filter, from, map, mergeMap, of, startWith
|
|
13
|
+
import { BehaviorSubject, combineLatest, debounceTime, delay, distinctUntilChanged, filter, from, map, mergeMap, of, startWith } from 'rxjs';
|
|
14
14
|
import { InteractionManager } from '../interaction/interaction-manager.class';
|
|
15
15
|
import { CqlUtils } from '../utils/cql-utils.class';
|
|
16
16
|
import { DEFAULT_MAP_CENTER, DEFAULT_ZOOM_MAX, DEFAULT_ZOOM_MIN, DEFAULT_ZOOM_START, exportMapAsImage, getLinkFeature, getMapAsPng, populateIntensityAttribute, populateLocationAttribute } from '../utils/widget-map.utils';
|
|
17
17
|
import { XMLUtils } from '../utils/xml-utils.class';
|
|
18
|
-
import { WmsService } from './wms.service';
|
|
19
18
|
import * as i0 from "@angular/core";
|
|
20
19
|
import * as i1 from "@ngrx/store";
|
|
21
20
|
import * as i2 from "@provoly/dashboard";
|
|
22
21
|
import * as i3 from "@angular/cdk/overlay";
|
|
23
22
|
import * as i4 from "./widget-map-layer.service";
|
|
24
|
-
import * as i5 from "
|
|
25
|
-
import * as i6 from "@angular/
|
|
26
|
-
import * as i7 from "@
|
|
27
|
-
import * as i8 from "
|
|
28
|
-
import * as i9 from "../
|
|
29
|
-
import * as i10 from "../pipe/widget-map-
|
|
30
|
-
import * as i11 from "../pipe/widget-map-legend-url.pipe";
|
|
23
|
+
import * as i5 from "@angular/common";
|
|
24
|
+
import * as i6 from "@angular/forms";
|
|
25
|
+
import * as i7 from "@provoly/dashboard/components/checkbox";
|
|
26
|
+
import * as i8 from "../style/css.component";
|
|
27
|
+
import * as i9 from "../pipe/widget-map-geometry-fields-for.pipe";
|
|
28
|
+
import * as i10 from "../pipe/widget-map-legend-url.pipe";
|
|
31
29
|
export const TOOLTIP_PADDING = 15;
|
|
32
30
|
export class WidgetMapComponent extends DataWidgetComponent {
|
|
33
|
-
constructor(store, snackBar, translateService, tooltipFactoryService, overlay, viewContainerRef, symbolService, injector, widgetMapLayerService, el
|
|
31
|
+
constructor(store, snackBar, translateService, tooltipFactoryService, overlay, viewContainerRef, symbolService, injector, widgetMapLayerService, el) {
|
|
34
32
|
super(store, el);
|
|
35
33
|
this.snackBar = snackBar;
|
|
36
34
|
this.translateService = translateService;
|
|
@@ -40,8 +38,9 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
40
38
|
this.symbolService = symbolService;
|
|
41
39
|
this.injector = injector;
|
|
42
40
|
this.widgetMapLayerService = widgetMapLayerService;
|
|
43
|
-
this.
|
|
44
|
-
|
|
41
|
+
this.layerTypes = this.widgetMapLayerService.implementationList
|
|
42
|
+
.filter((type) => type !== 'auto')
|
|
43
|
+
.sort((a, b) => this.translateService
|
|
45
44
|
.instant('@pry.widget.map.layerType.' + a)
|
|
46
45
|
.localeCompare(this.translateService.instant('@pry.widget.map.layerType.' + b)));
|
|
47
46
|
this.optionsCopy = {};
|
|
@@ -74,9 +73,9 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
74
73
|
})));
|
|
75
74
|
this.selectedIds$ = this.store.select(DashboardSelectors.selectedItemIds);
|
|
76
75
|
this.geoServerLayerDescriptions$ = combineLatest([
|
|
77
|
-
this.usedDatasources$.pipe(startWith([])),
|
|
78
|
-
this.store.select(ConfigSelectors.geoServerUrl).pipe(
|
|
79
|
-
]).pipe(map(([dataSources, geoServerUrl]) => {
|
|
76
|
+
this.usedDatasources$.pipe(startWith([]), distinctUntilChanged((p, c) => equal(p, c))),
|
|
77
|
+
this.store.select(ConfigSelectors.geoServerUrl).pipe(startWith(undefined))
|
|
78
|
+
]).pipe(debounceTime(100), map(([dataSources, geoServerUrl]) => {
|
|
80
79
|
if (!geoServerUrl)
|
|
81
80
|
return [];
|
|
82
81
|
return dataSources
|
|
@@ -99,7 +98,7 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
99
98
|
};
|
|
100
99
|
})
|
|
101
100
|
.map((layer) => layer);
|
|
102
|
-
}));
|
|
101
|
+
}), distinctUntilChanged((p, c) => equal(p, c)), startWith([]));
|
|
103
102
|
this.autoDatasetLayers$ = combineLatest([
|
|
104
103
|
this.classes$,
|
|
105
104
|
this.fields$,
|
|
@@ -119,12 +118,13 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
119
118
|
}));
|
|
120
119
|
})
|
|
121
120
|
.flat()));
|
|
122
|
-
this.
|
|
123
|
-
|
|
124
|
-
this.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
121
|
+
this.subscriptions.add(this.manifest$
|
|
122
|
+
.pipe(map((manifest) => ((manifest.options ?? { layers: [] }).layers?.filter((layer) => ['wms'].includes(layer.type))).map((layer) => layer.url)))
|
|
123
|
+
.subscribe((urls) => urls.forEach((url) => this.store.dispatch(DashboardActions.getCapability({ url })))));
|
|
124
|
+
this.subscriptions.add(this.geoServerLayerDescriptions$
|
|
125
|
+
.pipe(map((layers) => layers.map((layer) => layer.url)))
|
|
126
|
+
.subscribe((urls) => urls.forEach((url) => this.store.dispatch(DashboardActions.getCapability({ url })))));
|
|
127
|
+
this.wmsCapabilities$ = this.store.select(DashboardSelectors.capabilities);
|
|
128
128
|
this.options$ = combineLatest([
|
|
129
129
|
this.manifest$,
|
|
130
130
|
this.resultSet$,
|
|
@@ -132,7 +132,7 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
132
132
|
this.fields$,
|
|
133
133
|
this.styles$,
|
|
134
134
|
this.geoServerLayerDescriptions$,
|
|
135
|
-
this.wmsCapabilities
|
|
135
|
+
this.wmsCapabilities$,
|
|
136
136
|
this.autoDatasetLayers$
|
|
137
137
|
]).pipe(map(([manifest, resultSet, classes, fields, mapStyles, geoLayers, capabilities, autoDatasetLayers]) => {
|
|
138
138
|
// auto determine layers parameters to provide a working view
|
|
@@ -167,7 +167,8 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
167
167
|
// Get all previous layers, without geoserver layers that are not requested anymore, then add new geoserver layers (potentially with a preconfig from manifest).
|
|
168
168
|
autoOptions.layers = [
|
|
169
169
|
...(autoOptions.layers ?? []).map((layer) => {
|
|
170
|
-
|
|
170
|
+
// @ts-ignore
|
|
171
|
+
const geoLayer = geoLayers.find((geoLayer) => layer.key === geoLayer.key) ?? null;
|
|
171
172
|
return layer.type === 'geoserver'
|
|
172
173
|
? geoLayer
|
|
173
174
|
? { ...geoLayer, ...layer }
|
|
@@ -479,9 +480,9 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
479
480
|
if (!layer.title) {
|
|
480
481
|
if (['geoserver', 'wms'].includes(layer.type)) {
|
|
481
482
|
const geoLayer = layer;
|
|
482
|
-
const layerCapabilities = capabilities
|
|
483
|
+
const layerCapabilities = capabilities ? capabilities[geoLayer.url] : undefined;
|
|
483
484
|
if (layerCapabilities) {
|
|
484
|
-
const matchingLayer =
|
|
485
|
+
const matchingLayer = XMLUtils.getMatchingLayer(geoLayer.paramLayer, layerCapabilities.doc);
|
|
485
486
|
if (matchingLayer) {
|
|
486
487
|
const matchingTitle = XMLUtils.find(matchingLayer.childNodes, 'Title');
|
|
487
488
|
if (matchingTitle) {
|
|
@@ -723,12 +724,13 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
723
724
|
.getSource()
|
|
724
725
|
.getFeatureInfoUrl(transform(pixel, projGeo, projLambert), this.map.getView().getResolution(), 'EPSG:2154', {
|
|
725
726
|
INFO_FORMAT: 'application/json',
|
|
726
|
-
FEATURE_COUNT: 10
|
|
727
|
+
FEATURE_COUNT: 10,
|
|
728
|
+
...layer.getProperties()['getFeatureInfoAdditionalParameters']
|
|
727
729
|
});
|
|
728
730
|
if (url) {
|
|
729
731
|
this.store.dispatch(DashboardActions.getWmsFeatures({
|
|
730
732
|
url,
|
|
731
|
-
oClass: layer.getProperties()
|
|
733
|
+
oClass: layer.getProperties()['oClass'] ?? '',
|
|
732
734
|
coordinates: pixel
|
|
733
735
|
}));
|
|
734
736
|
}
|
|
@@ -800,13 +802,13 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
800
802
|
super.ngOnDestroy();
|
|
801
803
|
this.store.dispatch(DashboardActions.resetWmsFeatures());
|
|
802
804
|
}
|
|
803
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: WidgetMapComponent, deps: [{ token: i1.Store }, { token: i2.PrySnackbarService }, { token: i2.PryI18nService }, { token: i2.TooltipFactoryService }, { token: i3.Overlay }, { token: i0.ViewContainerRef }, { token: i2.SymbolService }, { token: i0.Injector }, { token: i4.WidgetMapLayerService }, { token: i0.ElementRef }
|
|
804
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: WidgetMapComponent, selector: "pry-widget-map", viewQueries: [{ propertyName: "mapRef", first: true, predicate: ["mapRef"], descendants: true }, { propertyName: "popup", first: true, predicate: ["popup"], descendants: true }, { propertyName: "popupContent", first: true, predicate: ["popupContent"], descendants: true, read: ViewContainerRef }, { propertyName: "exportTypeTemplate", first: true, predicate: ["exportTypeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "address", first: true, predicate: ["address"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [itemsAsOption]=\"true\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.style === STYLE_FROM_URL\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n\n <pry-checkbox (ngModelChange)=\"changeSingleLayer($event)\" [ngModel]=\"optionsCopy.singleLayer ?? false\">\n {{ '@pry.widget.map.singleLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeFit($event)\" [ngModel]=\"optionsCopy.fit ?? false\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n\n <div class=\"o-settings__popup__content__actions -has-separator\">\n <button type=\"button\" (click)=\"addLayer()\" class=\"a-btn a-btn--icon-text -link-like\">\n <pry-icon iconSvg=\"library_add\"></pry-icon>\n {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n\n <div *ngFor=\"let layer of optionsCopy?.layers; let i = index\" class=\"o-settings__popup__content__fields\">\n <div class=\"o-settings__popup__content__fields__head\">\n <h3 class=\"a-h3 settings-layer-title__title\">{{ '@pry.widget.map.layer' | i18n : { index: i + 1 } }}</h3>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"invertLayers(i, i - 1)\" *ngIf=\"i > 0\">\n <pry-icon iconSvg=\"fleche_haut\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveUp' | i18n }}</span>\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n (click)=\"invertLayers(i, i + 1)\"\n *ngIf=\"i < (optionsCopy?.layers?.length ?? 0) - 1\"\n >\n <pry-icon iconSvg=\"fleche_bas\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveDown' | i18n }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.layerOptions' | i18n : { index: i + 1 } }}</legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_layerTitle\">{{ '@pry.widget.map.layerTitle' | i18n }}</label>\n <input\n id=\"map_layerTitle\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeTitle($event, layer)\"\n [value]=\"layer.title ?? ''\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"!['geoserver', 'auto'].includes(layer.type)\">\n <label class=\"a-label\" for=\"map_layerType\">{{ '@pry.widget.map.layerType.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [bindData]=\"true\"\n [itemsAsOption]=\"true\"\n [items]=\"layerTypes\"\n [labelTranslate]=\"true\"\n [ngModel]=\"layer.type\"\n baseTranslate=\"@pry.widget.map.layerType.\"\n class=\"a-pry-select\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n\n <div\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n \"\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"classes$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n class=\"a-pry-select\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n </fieldset>\n </div>\n\n <fieldset\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n <ng-container\n *ngIf=\"\n layer\n | geometryFieldsFor : { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async as fields\n \"\n >\n <div\n *ngIf=\"\n ['heatmap', 'bubble', 'marker', 'point', 'line', 'polygon', 'multi-line', 'multi-polygon'].indexOf(\n layer.type\n ) >= 0\n \"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n </div>\n\n <div *ngIf=\"['heatmap', 'bubble'].indexOf(layer.type) >= 0\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n </fieldset>\n\n <fieldset\n *ngIf=\"\n layer.type === 'wms' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{ '@pry.widget.map.wms.paramLayer' | i18n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{ '@pry.widget.map.wms.matrixSet' | i18n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms'\">\n <pry-checkbox (ngModelChange)=\"changeParamTiled($event, layer)\" [ngModel]=\"layer?.paramTiled ?? false\">\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n </fieldset>\n\n <fieldset *ngIf=\"layer.type === 'marker'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n <div *ngIf=\"layer.clustered\">\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n </fieldset>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.attributions\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n\n <button\n type=\"button\"\n (click)=\"deleteLayer(i, layer)\"\n class=\"a-btn a-btn--icon-text -link-like\"\n *ngIf=\"layer.type !== 'geoserver'\"\n data-func=\"delete\"\n >\n <pry-icon iconSvg=\"delete\" [width]=\"19\" [height]=\"19\"></pry-icon>\n <span>{{ '@pry.widget.map.deleteLayer' | i18n }}</span>\n </button>\n </div>\n </pry-settings>\n </pry-widget-header>\n\n <div class=\"m-btn-group -selection-choice\" [style.transform]=\"bottomLeft$ | async\">\n <ng-container *ngFor=\"let action of basicActions$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n (click)=\"interactionManager.selectionInteraction.changeSelection(action)\"\n [class.-selected]=\"interactionManager.selectionInteraction.selectionType === action\"\n [pryTooltip]=\"infoTooltipAction\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipAction\"\n [pryTooltipContext]=\"{ action: action }\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n </ng-container>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [pryTooltip]=\"infoTooltipDown\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipDown_widgetMap\"\n *ngIf=\"(actions$ | async)?.includes('export')\"\n >\n <pry-icon iconSvg=\"file_download\" (click)=\"export()\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n <div\n class=\"ol-control m-layer-switcher\"\n *ngIf=\"((layers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"layersTop$ | async\"\n >\n <button\n class=\"m-layer-switcher__toggle\"\n (click)=\"toggleLayersWindow()\"\n [title]=\"'@pry.widget.map.selectLayers' | i18n\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </button>\n <ng-container *ngFor=\"let layer of mapLayers; let index = index\">\n <div class=\"m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n {{ layer.get('title') }}\n <ng-container *ngIf=\"!(options$ | async)?.singleLayer; else singleLayer\">\n <pry-checkbox [ngModel]=\"layer.getVisible()\" (change)=\"changeVisibility(layer)\"></pry-checkbox>\n </ng-container>\n <ng-template #singleLayer>\n <input\n type=\"radio\"\n name=\"layer\"\n [id]=\"'radio-layer-' + layer.get('title').split(' ')[0]\"\n [ngModel]=\"layerVisibleIdx\"\n [value]=\"index\"\n (change)=\"changeVisibility(layer)\"\n />\n </ng-template>\n </div>\n </ng-container>\n </div>\n\n <div\n class=\"ol-control m-layer-legend\"\n *ngIf=\"((legendLayers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"legendTop$ | async\"\n >\n <button class=\"m-layer-legend__toggle\" (click)=\"toggleLegendWindow()\" [title]=\"'@pry.widget.map.legends' | i18n\">\n <pry-icon iconSvg=\"legend\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </button>\n <ng-container *ngFor=\"let geoLayer of legendLayers$ | async; let index = index\">\n <div class=\"m-layer-legend__title\" [class.-hidden]=\"!legendTabOpen\">\n {{ geoLayer.title }}\n <ng-container *ngIf=\"isLayerRendered(geoLayer)\">\n <button class=\"m-layer-legend__toggle\" (click)=\"toggleLegend(index)\">\n <pry-icon\n [iconSvg]=\"legendTab === index ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!isLayerRendered(geoLayer)\">\n <pry-icon [iconSvg]=\"'close'\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </ng-container>\n </div>\n <div\n class=\"m-layer-legend__image\"\n [class.-hidden]=\"!legendTabOpen || legendTab !== index || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n <ng-container *ngIf=\"geoLayer | legendUrl : { capabilities: (wmsCapabilities$ | async) } as url\">\n <img\n [src]=\"url\"\n [alt]=\"'@pry.widget.map.legend' | i18n : { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n </ng-container>\n <ng-container *ngIf=\"!(geoLayer | legendUrl : { capabilities: (wmsCapabilities$ | async) })\">\n <p class=\"m-layer-legend__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n </ng-container>\n </div>\n </ng-container>\n </div>\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n </div>\n </div>\n\n <ng-template #infoTooltipAction let-action=\"action\">\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipAction\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </div>\n </ng-template>\n\n <ng-template #infoTooltipDown>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipDown_widgetMap\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.map.export' | i18n }}</span>\n </div>\n </ng-template>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ this.tooltipIndex + 1 }} / {{ this.tooltipNumber }}</p>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipMove(-1)\" [disabled]=\"!tooltipCanMove(-1)\">\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipMove(1)\" [disabled]=\"!tooltipCanMove(1)\">\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n <div\n #address\n class=\"m-tooltip m-tooltip--address tooltip-address\"\n [style.display]=\"'none'\"\n (click)=\"hideAddress()\"\n ></div>\n</div>\n", dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["labelTranslate", "baseTranslate", "translationFn", "translationFnArgs", "clearable", "multiple", "multipleClearRight", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "items", "itemsAsOption", "bindData", "bindValue", "bindLabel", "bindIcon", "iconSize", "templateLabel", "templateOption", "autocomplete"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i8.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "directive", type: i2.PryTooltipDirective, selector: "[pryTooltip]", inputs: ["pryTooltip", "styleReversed", "pryTooltipContext", "pryTooltipPosition", "pryTooltipShowDelay"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "component", type: i9.PryWidgetMapCssComponent, selector: "pry-widget-map-css" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i10.GeometryFieldsForPipe, name: "geometryFieldsFor" }, { kind: "pipe", type: i11.WidgetMapLegendUrlPipe, name: "legendUrl" }] }); }
|
|
805
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: WidgetMapComponent, deps: [{ token: i1.Store }, { token: i2.PrySnackbarService }, { token: i2.PryI18nService }, { token: i2.TooltipFactoryService }, { token: i3.Overlay }, { token: i0.ViewContainerRef }, { token: i2.SymbolService }, { token: i0.Injector }, { token: i4.WidgetMapLayerService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
806
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: WidgetMapComponent, selector: "pry-widget-map", viewQueries: [{ propertyName: "mapRef", first: true, predicate: ["mapRef"], descendants: true }, { propertyName: "popup", first: true, predicate: ["popup"], descendants: true }, { propertyName: "popupContent", first: true, predicate: ["popupContent"], descendants: true, read: ViewContainerRef }, { propertyName: "exportTypeTemplate", first: true, predicate: ["exportTypeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "address", first: true, predicate: ["address"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [itemsAsOption]=\"true\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.style === STYLE_FROM_URL\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n\n <pry-checkbox (ngModelChange)=\"changeSingleLayer($event)\" [ngModel]=\"optionsCopy.singleLayer ?? false\">\n {{ '@pry.widget.map.singleLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeFit($event)\" [ngModel]=\"optionsCopy.fit ?? false\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n\n <div class=\"o-settings__popup__content__actions -has-separator\">\n <button type=\"button\" (click)=\"addLayer()\" class=\"a-btn a-btn--icon-text -link-like\">\n <pry-icon iconSvg=\"library_add\"></pry-icon>\n {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n\n <div *ngFor=\"let layer of optionsCopy?.layers; let i = index\" class=\"o-settings__popup__content__fields\">\n <div class=\"o-settings__popup__content__fields__head\">\n <h3 class=\"a-h3 settings-layer-title__title\">{{ '@pry.widget.map.layer' | i18n : { index: i + 1 } }}</h3>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"invertLayers(i, i - 1)\" *ngIf=\"i > 0\">\n <pry-icon iconSvg=\"fleche_haut\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveUp' | i18n }}</span>\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n (click)=\"invertLayers(i, i + 1)\"\n *ngIf=\"i < (optionsCopy?.layers?.length ?? 0) - 1\"\n >\n <pry-icon iconSvg=\"fleche_bas\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveDown' | i18n }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.layerOptions' | i18n : { index: i + 1 } }}</legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_layerTitle\">{{ '@pry.widget.map.layerTitle' | i18n }}</label>\n <input\n id=\"map_layerTitle\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeTitle($event, layer)\"\n [value]=\"layer.title ?? ''\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"!['geoserver', 'auto'].includes(layer.type)\">\n <label class=\"a-label\" for=\"map_layerType\">{{ '@pry.widget.map.layerType.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [bindData]=\"true\"\n [itemsAsOption]=\"true\"\n [items]=\"layerTypes\"\n [labelTranslate]=\"true\"\n [ngModel]=\"layer.type\"\n baseTranslate=\"@pry.widget.map.layerType.\"\n class=\"a-pry-select\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n\n <div\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n \"\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"classes$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n class=\"a-pry-select\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n </fieldset>\n </div>\n\n <fieldset\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n <ng-container\n *ngIf=\"\n layer\n | geometryFieldsFor : { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async as fields\n \"\n >\n <div\n *ngIf=\"\n ['heatmap', 'bubble', 'marker', 'point', 'line', 'polygon', 'multi-line', 'multi-polygon'].indexOf(\n layer.type\n ) >= 0\n \"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n </div>\n\n <div *ngIf=\"['heatmap', 'bubble'].indexOf(layer.type) >= 0\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n </fieldset>\n\n <fieldset\n *ngIf=\"\n layer.type === 'wms' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{ '@pry.widget.map.wms.paramLayer' | i18n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{ '@pry.widget.map.wms.matrixSet' | i18n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms'\">\n <pry-checkbox (ngModelChange)=\"changeParamTiled($event, layer)\" [ngModel]=\"layer?.paramTiled ?? false\">\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n </fieldset>\n\n <fieldset *ngIf=\"layer.type === 'marker'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n <div *ngIf=\"layer.clustered\">\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n </fieldset>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.attributions\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n\n <button\n type=\"button\"\n (click)=\"deleteLayer(i, layer)\"\n class=\"a-btn a-btn--icon-text -link-like\"\n *ngIf=\"layer.type !== 'geoserver'\"\n data-func=\"delete\"\n >\n <pry-icon iconSvg=\"delete\" [width]=\"19\" [height]=\"19\"></pry-icon>\n <span>{{ '@pry.widget.map.deleteLayer' | i18n }}</span>\n </button>\n </div>\n </pry-settings>\n </pry-widget-header>\n\n <div class=\"m-btn-group -selection-choice\" [style.transform]=\"bottomLeft$ | async\">\n <ng-container *ngFor=\"let action of basicActions$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n (click)=\"interactionManager.selectionInteraction.changeSelection(action)\"\n [class.-selected]=\"interactionManager.selectionInteraction.selectionType === action\"\n [pryTooltip]=\"infoTooltipAction\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipAction\"\n [pryTooltipContext]=\"{ action: action }\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n </ng-container>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [pryTooltip]=\"infoTooltipDown\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipDown_widgetMap\"\n *ngIf=\"(actions$ | async)?.includes('export')\"\n >\n <pry-icon iconSvg=\"file_download\" (click)=\"export()\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n <div\n class=\"ol-control m-layer-switcher\"\n *ngIf=\"((layers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"layersTop$ | async\"\n >\n <button\n class=\"m-layer-switcher__toggle\"\n (click)=\"toggleLayersWindow()\"\n [title]=\"'@pry.widget.map.selectLayers' | i18n\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </button>\n <ng-container *ngFor=\"let layer of mapLayers; let index = index\">\n <div class=\"m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n {{ layer.get('title') }}\n <ng-container *ngIf=\"!(options$ | async)?.singleLayer; else singleLayer\">\n <pry-checkbox [ngModel]=\"layer.getVisible()\" (change)=\"changeVisibility(layer)\"></pry-checkbox>\n </ng-container>\n <ng-template #singleLayer>\n <input\n type=\"radio\"\n name=\"layer\"\n [id]=\"'radio-layer-' + layer.get('title').split(' ')[0]\"\n [ngModel]=\"layerVisibleIdx\"\n [value]=\"index\"\n (change)=\"changeVisibility(layer)\"\n />\n </ng-template>\n </div>\n </ng-container>\n </div>\n\n <div\n class=\"ol-control m-layer-legend\"\n *ngIf=\"((legendLayers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"legendTop$ | async\"\n >\n <button class=\"m-layer-legend__toggle\" (click)=\"toggleLegendWindow()\" [title]=\"'@pry.widget.map.legends' | i18n\">\n <pry-icon iconSvg=\"legend\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </button>\n <ng-container *ngFor=\"let geoLayer of legendLayers$ | async; let index = index\">\n <div class=\"m-layer-legend__title\" [class.-hidden]=\"!legendTabOpen\">\n {{ geoLayer.title }}\n <ng-container *ngIf=\"isLayerRendered(geoLayer)\">\n <button class=\"m-layer-legend__toggle\" (click)=\"toggleLegend(index)\">\n <pry-icon\n [iconSvg]=\"legendTab === index ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!isLayerRendered(geoLayer)\">\n <pry-icon [iconSvg]=\"'close'\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </ng-container>\n </div>\n <div\n class=\"m-layer-legend__image\"\n [class.-hidden]=\"!legendTabOpen || legendTab !== index || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n <ng-container *ngIf=\"geoLayer | legendUrl : { capabilities: (wmsCapabilities$ | async) } as url\">\n <img\n [src]=\"url\"\n [alt]=\"'@pry.widget.map.legend' | i18n : { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n </ng-container>\n <ng-container *ngIf=\"!(geoLayer | legendUrl : { capabilities: (wmsCapabilities$ | async) })\">\n <p class=\"m-layer-legend__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n </ng-container>\n </div>\n </ng-container>\n </div>\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n </div>\n </div>\n\n <ng-template #infoTooltipAction let-action=\"action\">\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipAction\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </div>\n </ng-template>\n\n <ng-template #infoTooltipDown>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipDown_widgetMap\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.map.export' | i18n }}</span>\n </div>\n </ng-template>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ this.tooltipIndex + 1 }} / {{ this.tooltipNumber }}</p>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipMove(-1)\" [disabled]=\"!tooltipCanMove(-1)\">\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipMove(1)\" [disabled]=\"!tooltipCanMove(1)\">\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n <div\n #address\n class=\"m-tooltip m-tooltip--address tooltip-address\"\n [style.display]=\"'none'\"\n (click)=\"hideAddress()\"\n ></div>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.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: i6.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["labelTranslate", "baseTranslate", "translationFn", "translationFnArgs", "clearable", "multiple", "multipleClearRight", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "items", "itemsAsOption", "bindData", "bindValue", "bindLabel", "bindIcon", "iconSize", "templateLabel", "templateOption", "autocomplete"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i7.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "directive", type: i2.PryTooltipDirective, selector: "[pryTooltip]", inputs: ["pryTooltip", "styleReversed", "pryTooltipContext", "pryTooltipPosition", "pryTooltipShowDelay"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "component", type: i8.PryWidgetMapCssComponent, selector: "pry-widget-map-css" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.GeometryFieldsForPipe, name: "geometryFieldsFor" }, { kind: "pipe", type: i10.WidgetMapLegendUrlPipe, name: "legendUrl" }] }); }
|
|
805
807
|
}
|
|
806
808
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: WidgetMapComponent, decorators: [{
|
|
807
809
|
type: Component,
|
|
808
810
|
args: [{ selector: 'pry-widget-map', template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [itemsAsOption]=\"true\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.style === STYLE_FROM_URL\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n\n <pry-checkbox (ngModelChange)=\"changeSingleLayer($event)\" [ngModel]=\"optionsCopy.singleLayer ?? false\">\n {{ '@pry.widget.map.singleLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeFit($event)\" [ngModel]=\"optionsCopy.fit ?? false\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n\n <div class=\"o-settings__popup__content__actions -has-separator\">\n <button type=\"button\" (click)=\"addLayer()\" class=\"a-btn a-btn--icon-text -link-like\">\n <pry-icon iconSvg=\"library_add\"></pry-icon>\n {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n\n <div *ngFor=\"let layer of optionsCopy?.layers; let i = index\" class=\"o-settings__popup__content__fields\">\n <div class=\"o-settings__popup__content__fields__head\">\n <h3 class=\"a-h3 settings-layer-title__title\">{{ '@pry.widget.map.layer' | i18n : { index: i + 1 } }}</h3>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"invertLayers(i, i - 1)\" *ngIf=\"i > 0\">\n <pry-icon iconSvg=\"fleche_haut\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveUp' | i18n }}</span>\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n (click)=\"invertLayers(i, i + 1)\"\n *ngIf=\"i < (optionsCopy?.layers?.length ?? 0) - 1\"\n >\n <pry-icon iconSvg=\"fleche_bas\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveDown' | i18n }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.layerOptions' | i18n : { index: i + 1 } }}</legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_layerTitle\">{{ '@pry.widget.map.layerTitle' | i18n }}</label>\n <input\n id=\"map_layerTitle\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeTitle($event, layer)\"\n [value]=\"layer.title ?? ''\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"!['geoserver', 'auto'].includes(layer.type)\">\n <label class=\"a-label\" for=\"map_layerType\">{{ '@pry.widget.map.layerType.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [bindData]=\"true\"\n [itemsAsOption]=\"true\"\n [items]=\"layerTypes\"\n [labelTranslate]=\"true\"\n [ngModel]=\"layer.type\"\n baseTranslate=\"@pry.widget.map.layerType.\"\n class=\"a-pry-select\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n\n <div\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n \"\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"classes$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n class=\"a-pry-select\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n </fieldset>\n </div>\n\n <fieldset\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n <ng-container\n *ngIf=\"\n layer\n | geometryFieldsFor : { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async as fields\n \"\n >\n <div\n *ngIf=\"\n ['heatmap', 'bubble', 'marker', 'point', 'line', 'polygon', 'multi-line', 'multi-polygon'].indexOf(\n layer.type\n ) >= 0\n \"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n </div>\n\n <div *ngIf=\"['heatmap', 'bubble'].indexOf(layer.type) >= 0\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [itemsAsOption]=\"true\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n </fieldset>\n\n <fieldset\n *ngIf=\"\n layer.type === 'wms' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{ '@pry.widget.map.wms.paramLayer' | i18n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{ '@pry.widget.map.wms.matrixSet' | i18n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms'\">\n <pry-checkbox (ngModelChange)=\"changeParamTiled($event, layer)\" [ngModel]=\"layer?.paramTiled ?? false\">\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n </fieldset>\n\n <fieldset *ngIf=\"layer.type === 'marker'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n <div *ngIf=\"layer.clustered\">\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n </fieldset>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.attributions\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n\n <button\n type=\"button\"\n (click)=\"deleteLayer(i, layer)\"\n class=\"a-btn a-btn--icon-text -link-like\"\n *ngIf=\"layer.type !== 'geoserver'\"\n data-func=\"delete\"\n >\n <pry-icon iconSvg=\"delete\" [width]=\"19\" [height]=\"19\"></pry-icon>\n <span>{{ '@pry.widget.map.deleteLayer' | i18n }}</span>\n </button>\n </div>\n </pry-settings>\n </pry-widget-header>\n\n <div class=\"m-btn-group -selection-choice\" [style.transform]=\"bottomLeft$ | async\">\n <ng-container *ngFor=\"let action of basicActions$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n (click)=\"interactionManager.selectionInteraction.changeSelection(action)\"\n [class.-selected]=\"interactionManager.selectionInteraction.selectionType === action\"\n [pryTooltip]=\"infoTooltipAction\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipAction\"\n [pryTooltipContext]=\"{ action: action }\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n </ng-container>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [pryTooltip]=\"infoTooltipDown\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipDown_widgetMap\"\n *ngIf=\"(actions$ | async)?.includes('export')\"\n >\n <pry-icon iconSvg=\"file_download\" (click)=\"export()\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n <div\n class=\"ol-control m-layer-switcher\"\n *ngIf=\"((layers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"layersTop$ | async\"\n >\n <button\n class=\"m-layer-switcher__toggle\"\n (click)=\"toggleLayersWindow()\"\n [title]=\"'@pry.widget.map.selectLayers' | i18n\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </button>\n <ng-container *ngFor=\"let layer of mapLayers; let index = index\">\n <div class=\"m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n {{ layer.get('title') }}\n <ng-container *ngIf=\"!(options$ | async)?.singleLayer; else singleLayer\">\n <pry-checkbox [ngModel]=\"layer.getVisible()\" (change)=\"changeVisibility(layer)\"></pry-checkbox>\n </ng-container>\n <ng-template #singleLayer>\n <input\n type=\"radio\"\n name=\"layer\"\n [id]=\"'radio-layer-' + layer.get('title').split(' ')[0]\"\n [ngModel]=\"layerVisibleIdx\"\n [value]=\"index\"\n (change)=\"changeVisibility(layer)\"\n />\n </ng-template>\n </div>\n </ng-container>\n </div>\n\n <div\n class=\"ol-control m-layer-legend\"\n *ngIf=\"((legendLayers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"legendTop$ | async\"\n >\n <button class=\"m-layer-legend__toggle\" (click)=\"toggleLegendWindow()\" [title]=\"'@pry.widget.map.legends' | i18n\">\n <pry-icon iconSvg=\"legend\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </button>\n <ng-container *ngFor=\"let geoLayer of legendLayers$ | async; let index = index\">\n <div class=\"m-layer-legend__title\" [class.-hidden]=\"!legendTabOpen\">\n {{ geoLayer.title }}\n <ng-container *ngIf=\"isLayerRendered(geoLayer)\">\n <button class=\"m-layer-legend__toggle\" (click)=\"toggleLegend(index)\">\n <pry-icon\n [iconSvg]=\"legendTab === index ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!isLayerRendered(geoLayer)\">\n <pry-icon [iconSvg]=\"'close'\" [width]=\"22\" [height]=\"22\"></pry-icon>\n </ng-container>\n </div>\n <div\n class=\"m-layer-legend__image\"\n [class.-hidden]=\"!legendTabOpen || legendTab !== index || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n <ng-container *ngIf=\"geoLayer | legendUrl : { capabilities: (wmsCapabilities$ | async) } as url\">\n <img\n [src]=\"url\"\n [alt]=\"'@pry.widget.map.legend' | i18n : { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n </ng-container>\n <ng-container *ngIf=\"!(geoLayer | legendUrl : { capabilities: (wmsCapabilities$ | async) })\">\n <p class=\"m-layer-legend__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n </ng-container>\n </div>\n </ng-container>\n </div>\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n </div>\n </div>\n\n <ng-template #infoTooltipAction let-action=\"action\">\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipAction\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </div>\n </ng-template>\n\n <ng-template #infoTooltipDown>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipDown_widgetMap\" aria-hidden=\"true\">\n <span class=\"m-tooltip__text\">{{ '@pry.widget.map.export' | i18n }}</span>\n </div>\n </ng-template>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ this.tooltipIndex + 1 }} / {{ this.tooltipNumber }}</p>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipMove(-1)\" [disabled]=\"!tooltipCanMove(-1)\">\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipMove(1)\" [disabled]=\"!tooltipCanMove(1)\">\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n <div\n #address\n class=\"m-tooltip m-tooltip--address tooltip-address\"\n [style.display]=\"'none'\"\n (click)=\"hideAddress()\"\n ></div>\n</div>\n" }]
|
|
809
|
-
}], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.PrySnackbarService }, { type: i2.PryI18nService }, { type: i2.TooltipFactoryService }, { type: i3.Overlay }, { type: i0.ViewContainerRef }, { type: i2.SymbolService }, { type: i0.Injector }, { type: i4.WidgetMapLayerService }, { type: i0.ElementRef }
|
|
811
|
+
}], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.PrySnackbarService }, { type: i2.PryI18nService }, { type: i2.TooltipFactoryService }, { type: i3.Overlay }, { type: i0.ViewContainerRef }, { type: i2.SymbolService }, { type: i0.Injector }, { type: i4.WidgetMapLayerService }, { type: i0.ElementRef }]; }, propDecorators: { mapRef: [{
|
|
810
812
|
type: ViewChild,
|
|
811
813
|
args: ['mapRef']
|
|
812
814
|
}], popup: [{
|
|
@@ -822,4 +824,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImpor
|
|
|
822
824
|
type: ViewChild,
|
|
823
825
|
args: ['address']
|
|
824
826
|
}] } });
|
|
825
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1tYXAvY29tcG9uZW50L3dpZGdldC1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtbWFwL2NvbXBvbmVudC93aWRnZXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCxTQUFTLEVBS1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUtMLGNBQWMsRUFDZCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUVsQixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBRW5CLGNBQWMsRUFDZCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFNBQVMsRUFlVCxjQUFjLEVBR2QsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFXLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUdoQyxPQUFPLGVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1B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Z0JBQWdCOzRYQUtMLE1BQU07c0JBQTFCLFNBQVM7dUJBQUMsUUFBUTtnQkFDQyxLQUFLO3NCQUF4QixTQUFTO3VCQUFDLE9BQU87Z0JBQ3FDLFlBQVk7c0JBQWxFLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUNHLGtCQUFrQjtzQkFBekUsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ2hDLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXkgYXMgY2RrT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGUsXG4gIEJhc2VUb29sdGlwQ29tcG9uZW50LFxuICBCYXNlV2lkZ2V0TWFwTGF5ZXJPcHRpb25zLFxuICBDbGFzcyxcbiAgQ2xhc3NTZWxlY3RvcnMsXG4gIENvbmZpZ1NlbGVjdG9ycyxcbiAgRGFzaGJvYXJkQWN0aW9ucyxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBEYXRhc2V0LFxuICBEYXRhU291cmNlU2VsZWN0b3JzLFxuICBEYXRhV2lkZ2V0Q29tcG9uZW50LFxuICBGaWVsZCxcbiAgRmllbGRTZWxlY3RvcnMsXG4gIEdlb01ldGFkYXRhLFxuICBHZW9tZXRyaWNGaWVsZFR5cGVzLFxuICBJdGVtVXRpbHMsXG4gIE1hcEF1dG9MYXllck9wdGlvbnMsXG4gIE1hcEZlYXR1cmVMYXllck9wdGlvbnMsXG4gIE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucyxcbiAgTWFwUmFzdGVyVGlsZUxheWVyT3B0aW9ucyxcbiAgTWFwVmVjdG9yVGlsZUxheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0T3B0aW9ucyxcbiAgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMsXG4gIE1hcFdNVFNMYXllckxheWVyT3B0aW9ucyxcbiAgUHJ5STE4blNlcnZpY2UsXG4gIFByeVNuYWNrYmFyU2VydmljZSxcbiAgUmVzdWx0c2V0VXRpbHMsXG4gIFN5bWJvbFNlcnZpY2UsXG4gIFRvb2x0aXBGYWN0b3J5U2VydmljZSxcbiAgVG9vbHRpcE1vZGUsXG4gIFdJREdFVF9IRUFERVJfSEVJR0hULFxuICB3aWRnZXRNYXBDb25maWdcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwvZXM2JztcbmltcG9ydCB7IEZlYXR1cmUsIE1hcCwgT3ZlcmxheSwgVmlldyB9IGZyb20gJ29sJztcbmltcG9ydCB7IGFwcGx5QmFja2dyb3VuZCwgYXBwbHlTdHlsZSB9IGZyb20gJ29sLW1hcGJveC1zdHlsZSc7XG5pbXBvcnQgeyBib3VuZGluZ0V4dGVudCwgY3JlYXRlRW1wdHkgfSBmcm9tICdvbC9leHRlbnQnO1xuaW1wb3J0IHsgQ2lyY2xlLCBHZW9tZXRyeSwgUG9pbnQgfSBmcm9tICdvbC9nZW9tJztcbmltcG9ydCB7IFRpbGUgfSBmcm9tICdvbC9sYXllcic7XG5pbXBvcnQgQmFzZUxheWVyIGZyb20gJ29sL2xheWVyL0Jhc2UnO1xuaW1wb3J0IFZlY3RvckxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3Rvcic7XG5pbXBvcnQgVmVjdG9yVGlsZUxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3RvclRpbGUnO1xuaW1wb3J0IHsgUGl4ZWwgfSBmcm9tICdvbC9waXhlbCc7XG5pbXBvcnQgeyBmcm9tTG9uTGF0LCBnZXQgYXMgZ2V0UHJvamVjdGlvbiwgdHJhbnNmb3JtIH0gZnJvbSAnb2wvcHJvaic7XG5cbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnb2wvcHJvai9wcm9qNCc7XG5pbXBvcnQgeyBUaWxlV01TIH0gZnJvbSAnb2wvc291cmNlJztcbmltcG9ydCBWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJ29sL3N0eWxlJztcbmltcG9ydCBwcm9qNCBmcm9tICdwcm9qNCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb20sXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uTWFuYWdlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLW1hbmFnZXIuY2xhc3MnO1xuaW1wb3J0IHsgQ3FsVXRpbHMgfSBmcm9tICcuLi91dGlscy9jcWwtdXRpbHMuY2xhc3MnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NQVBfQ0VOVEVSLFxuICBERUZBVUxUX1pPT01fTUFYLFxuICBERUZBVUxUX1pPT01fTUlOLFxuICBERUZBVUxUX1pPT01fU1RBUlQsXG4gIGV4cG9ydE1hcEFzSW1hZ2UsXG4gIGdldExpbmtGZWF0dXJlLFxuICBnZXRNYXBBc1BuZyxcbiAgcG9wdWxhdGVJbnRlbnNpdHlBdHRyaWJ1dGUsXG4gIHBvcHVsYXRlTG9jYXRpb25BdHRyaWJ1dGVcbn0gZnJvbSAnLi4vdXRpbHMvd2lkZ2V0LW1hcC51dGlscyc7XG5pbXBvcnQgeyBYTUxVdGlscyB9IGZyb20gJy4uL3V0aWxzL3htbC11dGlscy5jbGFzcyc7XG5pbXBvcnQgeyBXaWRnZXRNYXBMYXllclNlcnZpY2UgfSBmcm9tICcuL3dpZGdldC1tYXAtbGF5ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZSwgV21zU2VydmljZSB9IGZyb20gJy4vd21zLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgVE9PTFRJUF9QQURESU5HID0gMTU7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1tYXAuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldE1hcENvbXBvbmVudCBleHRlbmRzIERhdGFXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBtYXBVcmwkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIEBWaWV3Q2hpbGQoJ21hcFJlZicpIG1hcFJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3BvcHVwJykgcG9wdXAhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwb3B1cENvbnRlbnQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgcG9wdXBDb250ZW50ITogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZXhwb3J0VHlwZVRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBleHBvcnRUeXBlVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdhZGRyZXNzJykgYWRkcmVzcyE6IEVsZW1lbnRSZWY7XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPE1hcFdpZGdldE9wdGlvbnM+O1xuICBsYXllclR5cGVzID0gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuaW1wbGVtZW50YXRpb25MaXN0LnNvcnQoKGEsIGIpID0+XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgICAuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS4nICsgYSlcbiAgICAgIC5sb2NhbGVDb21wYXJlKHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLicgKyBiKSlcbiAgKTtcbiAgb3B0aW9uc0NvcHk6IE1hcFdpZGdldE9wdGlvbnMgPSB7fSBhcyBNYXBXaWRnZXRPcHRpb25zO1xuICBjbGFzc2VzJDogT2JzZXJ2YWJsZTxDbGFzc1tdPjtcbiAgZmllbGRzJDogT2JzZXJ2YWJsZTxGaWVsZFtdPjtcbiAgc2VsZWN0ZWRJZHMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgYm90dG9tTGVmdCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgbGF5ZXJzJCE6IE9ic2VydmFibGU8QmFzZUxheWVyW10+O1xuICBtYXAhOiBNYXA7XG4gIGFkZGl0aW9uYWxMYXllcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U8R2VvbWV0cnk+PltdPihbXSk7XG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG4gIHN0eWxlcyQ6IE9ic2VydmFibGU8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdPjtcbiAgV0lER0VUX0hFQURFUl9IRUlHSFQgPSBXSURHRVRfSEVBREVSX0hFSUdIVDtcbiAgaSA9IDA7XG4gIGl0ZW1TdHlsZXMkITogT2JzZXJ2YWJsZTx7IFtpZDogc3RyaW5nXTogeyBjbGFzc2ljOiBTdHlsZTsgYm9yZGVyZWQ6IFN0eWxlIH0gfT47XG4gIGhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgYWN0aW9ucyQgPSB3aWRnZXRNYXBDb25maWcuYWN0aW9ucyQ7XG4gIHByaXZhdGUgd21zRmVhdHVyZXMkOiBPYnNlcnZhYmxlPGFueVtdPjtcbiAgY2xhc3NpY0ZlYXR1cmVzJDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcbiAgZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnMkOiBPYnNlcnZhYmxlPE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1tdPjtcbiAgbGVnZW5kVGFiT3BlbiA9IGZhbHNlO1xuICBsYXllcnNUYWJPcGVuID0gZmFsc2U7XG4gIGxlZ2VuZFRhYiA9IDA7XG4gIGxlZ2VuZExheWVycyQhOiBPYnNlcnZhYmxlPChNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMgfCBNYXBXTVNMYXllckxheWVyT3B0aW9ucylbXT47XG4gIGxlZ2VuZFRvcCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgbGF5ZXJzVG9wJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBsZWdlbmRIZWlnaHQkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGltYWdlTm90UHJvdmlkZWQ6IGJvb2xlYW5bXSA9IFtdO1xuICBiYXNpY0FjdGlvbnMkOiBPYnNlcnZhYmxlPCgnY2xpY2snIHwgJ2xhc3NvJyB8ICdyZWN0YW5nbGUnIHwgJ3pvb20nIHwgJ21vdmUnIHwgJ2V4cG9ydCcgfCAndXBsb2FkJylbXT47XG4gIHpvb21BbmRDZW50ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHpvb20/OiB7IHN0YXJ0OiBudW1iZXI7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9OyBjZW50ZXI/OiBudW1iZXJbXSB9Pih7fSk7XG4gIGZpdE9wdGlvbiQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBtYXBTdHlsZVVybCQhOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+O1xuICBpbnRlcmFjdGlvbk1hbmFnZXI6IEludGVyYWN0aW9uTWFuYWdlciA9IG5ldyBJbnRlcmFjdGlvbk1hbmFnZXIoKTtcbiAgbWFwU3R5bGVMYXllciQhOiBPYnNlcnZhYmxlPFZlY3RvclRpbGVMYXllcltdPjtcbiAgdG9vbHRpcEluZGV4ID0gMDtcbiAgdG9vbHRpcE51bWJlciA9IDA7XG4gIFNUWUxFX0ZST01fVVJMID0gJ191cmwnO1xuICBOT19TVFlMRSA9ICdub25lJztcbiAgd21zQ2FwYWJpbGl0aWVzJDogT2JzZXJ2YWJsZTwoR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2UgfCBudWxsKVtdPjtcbiAgYXV0b0RhdGFzZXRMYXllcnMkOiBPYnNlcnZhYmxlPE1hcEF1dG9MYXllck9wdGlvbnNbXT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogUHJ5U25hY2tiYXJTZXJ2aWNlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBwcml2YXRlIHRvb2x0aXBGYWN0b3J5U2VydmljZTogVG9vbHRpcEZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3ZlcmxheTogY2RrT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBzeW1ib2xTZXJ2aWNlOiBTeW1ib2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgd2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlOiBXaWRnZXRNYXBMYXllclNlcnZpY2UsXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB3bXNTZXJ2aWNlOiBXbXNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHN0b3JlLCBlbCk7XG5cbiAgICB0aGlzLmJhc2ljQWN0aW9ucyQgPSB0aGlzLmFjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbiAhPT0gJ2V4cG9ydCcgJiYgYWN0aW9uICE9PSAndXBsb2FkJykpXG4gICAgKTtcblxuICAgIHRoaXMuY2xhc3NlcyQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpXG4gICAgICAucGlwZShtYXAoKGNsYXNzZXMpID0+IGNsYXNzZXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSkpKTtcbiAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChGaWVsZFNlbGVjdG9ycy5maWVsZHMpO1xuICAgIHRoaXMuc3R5bGVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KENvbmZpZ1NlbGVjdG9ycy5tYXBTdHlsZXMpLnBpcGUoXG4gICAgICBtYXAoKHN0eWxlcykgPT5cbiAgICAgICAgc3R5bGVzLmNvbmNhdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLk5PX1NUWUxFLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubm9TdHlsZScpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLlNUWUxFX0ZST01fVVJMLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc3R5bGVGcm9tVXJsJylcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0ZWRJZHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnNlbGVjdGVkSXRlbUlkcyk7XG5cbiAgICB0aGlzLmdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy51c2VkRGF0YXNvdXJjZXMkLnBpcGUoc3RhcnRXaXRoKFtdKSksXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMuZ2VvU2VydmVyVXJsKS5waXBlKGRlYm91bmNlVGltZSgxMCksIHN0YXJ0V2l0aCh1bmRlZmluZWQpKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtkYXRhU291cmNlcywgZ2VvU2VydmVyVXJsXSkgPT4ge1xuICAgICAgICBpZiAoIWdlb1NlcnZlclVybCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNcbiAgICAgICAgICAuZmlsdGVyKChkcykgPT4gZHMubWV0YWRhdGE/LmZpbmQoKG0pID0+IG0ubWV0YWRhdGFEZWYubmFtZSA9PT0gR2VvTWV0YWRhdGEuTkFNRVNQQUNFKSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5tYXAoKGRzKSA9PiB7XG4gICAgICAgICAgICBkcyA9IGRzIGFzIHVua25vd24gYXMgRGF0YXNldDtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICAgICAgZHMubWV0YWRhdGE/LmZvckVhY2goKG0pID0+IChtZXRhZGF0YXNbbS5tZXRhZGF0YURlZi5uYW1lXSA9IG0udmFsdWUpKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdnZW9zZXJ2ZXInLFxuICAgICAgICAgICAgICB1cmw6IGdlb1NlcnZlclVybCArICcvJyArIG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdICsgJy93bXM/U0VSVklDRT1XTVMmVkVSU0lPTj0xLjMuMCcsXG4gICAgICAgICAgICAgIHBhcmFtVGlsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IHBhcnNlSW50KG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5PUEFDSVRZXSA/PyAxMDAsIDEwKSxcbiAgICAgICAgICAgICAgb0NsYXNzOiBkcy5vQ2xhc3MsXG4gICAgICAgICAgICAgIGtleTogbWV0YWRhdGFzW0dlb01ldGFkYXRhLk5BTUVTUEFDRV0gKyAnOicgKyBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuS0VZXSxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuTkFNRVNQQUNFXSxcbiAgICAgICAgICAgICAgcGFyYW1MYXllcjogbWV0YWRhdGFzW0dlb01ldGFkYXRhLktFWV0sXG4gICAgICAgICAgICAgIG5hbWU6IGRzLm5hbWUsXG4gICAgICAgICAgICAgIGRhdGFzb3VyY2VJZDogZHMuaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKChsYXllcikgPT4gbGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuYXV0b0RhdGFzZXRMYXllcnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5maWVsZHMkLFxuICAgICAgdGhpcy51c2VkRGF0YXNvdXJjZXMkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgICAgIG1hcCgoZGF0YXNvdXJjZXMpID0+IGRhdGFzb3VyY2VzLmZpbHRlcigoZHMpID0+IGRzLnNvdXJjZVR5cGUgPT09ICdkYXRhc2V0JykgYXMgRGF0YXNldFtdKVxuICAgICAgKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbY2xhc3NlcywgZmllbGRzLCBkYXRhU2V0c10pID0+XG4gICAgICAgICAgZGF0YVNldHNcbiAgICAgICAgICAgIC5tYXAoKGRzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gY2xhc3Nlcy5maW5kKChjbGF6eikgPT4gY2xhenouaWQgPT09IGRzLm9DbGFzcyk7XG4gICAgICAgICAgICAgIGNvbnN0IGdlb0F0dHJpYnV0ZXMgPSAoXG4gICAgICAgICAgICAgICAgbW9kZWw/LmF0dHJpYnV0ZXMubWFwKChhdHRyKSA9PiAoeyBhdHRyLCBmaWVsZDogZmllbGRzLmZpbmQoKGYpID0+IGF0dHIuZmllbGQgPT09IGYuaWQpIH0pKSA/PyBbXVxuICAgICAgICAgICAgICApLmZpbHRlcigoeyBhdHRyLCBmaWVsZCB9KSA9PiAhIWZpZWxkICYmIEdlb21ldHJpY0ZpZWxkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpO1xuICAgICAgICAgICAgICByZXR1cm4gZ2VvQXR0cmlidXRlcy5tYXAoXG4gICAgICAgICAgICAgICAgKGdlbykgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGAke2RzLm5hbWV9IC0gJHtnZW8uYXR0ci5uYW1lfSAoJHtnZW8uZmllbGQhLnR5cGV9KWAsXG4gICAgICAgICAgICAgICAgICAgIG9DbGFzczogZHMub0NsYXNzLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IGRzLmlkLFxuICAgICAgICAgICAgICAgICAgICBzdWJUeXBlOiBnZW8uZmllbGQhLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFtkcy5vQ2xhc3NdLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6IGdlby5hdHRyLm5hbWVcbiAgICAgICAgICAgICAgICAgIH0gYXMgTWFwQXV0b0xheWVyT3B0aW9ucylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmxhdCgpIGFzIE1hcEF1dG9MYXllck9wdGlvbnNbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLndtc0NhcGFiaWxpdGllcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMubWFuaWZlc3QkLnBpcGUoXG4gICAgICAgIG1hcChcbiAgICAgICAgICAobWFuaWZlc3QpID0+XG4gICAgICAgICAgICAoKG1hbmlmZXN0Lm9wdGlvbnMgPz8geyBsYXllcnM6IFtdIH0pIGFzIE1hcFdpZGdldE9wdGlvbnMpLmxheWVycz8uZmlsdGVyKChsYXllcikgPT5cbiAgICAgICAgICAgICAgWyd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKVxuICAgICAgICAgICAgKSBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9uc1tdXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICB0aGlzLmdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt3bXNMYXllcnMsIGdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zXSkgPT4ge1xuICAgICAgICByZXR1cm4gWy4uLndtc0xheWVycywgLi4uZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnNdO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpLFxuICAgICAgc3dpdGNoTWFwKCh3bXNMYXllcnMpID0+IGNvbWJpbmVMYXRlc3Qod21zTGF5ZXJzLm1hcCgobGF5ZXIpID0+IHdtc1NlcnZpY2UuZ2V0Q2FwYWJpbGl0aWVzKGxheWVyKSkpKSxcbiAgICAgIHN0YXJ0V2l0aChbXSlcbiAgICApO1xuXG4gICAgdGhpcy5vcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tYW5pZmVzdCQsXG4gICAgICB0aGlzLnJlc3VsdFNldCQsXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5maWVsZHMkLFxuICAgICAgdGhpcy5zdHlsZXMkLFxuICAgICAgdGhpcy5nZW9TZXJ2ZXJMYXllckRlc2NyaXB0aW9ucyQsXG4gICAgICB0aGlzLndtc0NhcGFiaWxpdGllcyQucGlwZShzdGFydFdpdGgoW10pKSxcbiAgICAgIHRoaXMuYXV0b0RhdGFzZXRMYXllcnMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW21hbmlmZXN0LCByZXN1bHRTZXQsIGNsYXNzZXMsIGZpZWxkcywgbWFwU3R5bGVzLCBnZW9MYXllcnMsIGNhcGFiaWxpdGllcywgYXV0b0RhdGFzZXRMYXllcnNdKSA9PiB7XG4gICAgICAgIC8vIGF1dG8gZGV0ZXJtaW5lIGxheWVycyBwYXJhbWV0ZXJzIHRvIHByb3ZpZGUgYSB3b3JraW5nIHZpZXdcbiAgICAgICAgY29uc3QgYXV0b09wdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0Lm9wdGlvbnMpKSBhcyBNYXBXaWRnZXRPcHRpb25zO1xuICAgICAgICBpZiAoIWF1dG9PcHRpb25zLnRvb2x0aXBNb2RlKSB7XG4gICAgICAgICAgYXV0b09wdGlvbnMudG9vbHRpcE1vZGUgPSBUb29sdGlwTW9kZS5DTElDSztcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycyA9IFtcbiAgICAgICAgICAuLi4oYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKS5maWx0ZXIoKGxheWVyKSA9PiBsYXllci50eXBlICE9PSAnYXV0bycpLFxuICAgICAgICAgIC4uLihhdXRvT3B0aW9ucy5hdXRvbWF0aWNMYXllcnNcbiAgICAgICAgICAgID8gYXV0b0RhdGFzZXRMYXllcnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgKGxheWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAhYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyIHx8XG4gICAgICAgICAgICAgICAgICAgICFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIuaW5jbHVkZXMobGF5ZXIua2V5ICsgJy0nICsgbGF5ZXIuc3ViVHlwZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLm1hcCgobGF5ZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5sYXllcixcbiAgICAgICAgICAgICAgICAgIC4uLigoYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIChwcmV2TGF5ZXIpID0+IHByZXZMYXllci5rZXkgPT09IGxheWVyLmtleSAmJiBwcmV2TGF5ZXIuYXR0cmlidXRlID09PSBsYXllci5hdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICkgPz8ge30pXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IFtdKVxuICAgICAgICBdO1xuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycz8uZm9yRWFjaCgobGF5ZXIsIGkpID0+IHtcbiAgICAgICAgICBwb3B1bGF0ZUxvY2F0aW9uQXR0cmlidXRlKGxheWVyLCByZXN1bHRTZXQsIGNsYXNzZXMsIGZpZWxkcyk7XG4gICAgICAgICAgcG9wdWxhdGVJbnRlbnNpdHlBdHRyaWJ1dGUobGF5ZXIsIHJlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzKTtcbiAgICAgICAgICBpZiAoYXV0b09wdGlvbnMuYXR0cmlidXRpb25zKSB7XG4gICAgICAgICAgICBsYXllci5hdHRyaWJ1dGlvbiA9IGxheWVyLmF0dHJpYnV0aW9uID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYWN0dWFsTGF5ZXJLZXlzID0gKGF1dG9PcHRpb25zLmxheWVycyA/PyBbXSlcbiAgICAgICAgICAubWFwKChsYXllcikgPT4gKGxheWVyIGFzIE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucykua2V5ID8/IG51bGwpXG4gICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhIWtleSk7XG5cbiAgICAgICAgLy8gR2V0IGFsbCBwcmV2aW91cyBsYXllcnMsIHdpdGhvdXQgZ2Vvc2VydmVyIGxheWVycyB0aGF0IGFyZSBub3QgcmVxdWVzdGVkIGFueW1vcmUsIHRoZW4gYWRkIG5ldyBnZW9zZXJ2ZXIgbGF5ZXJzIChwb3RlbnRpYWxseSB3aXRoIGEgcHJlY29uZmlnIGZyb20gbWFuaWZlc3QpLlxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMgPSBbXG4gICAgICAgICAgLi4uKGF1dG9PcHRpb25zLmxheWVycyA/PyBbXSkubWFwKChsYXllcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ2VvTGF5ZXIgPSBnZW9MYXllcnMuZmluZCgobGF5ZXIpID0+IGxheWVyLmtleSA9PT0gbGF5ZXIua2V5KSA/PyBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInXG4gICAgICAgICAgICAgID8gZ2VvTGF5ZXJcbiAgICAgICAgICAgICAgICA/IHsgLi4uZ2VvTGF5ZXIsIC4uLmxheWVyIH1cbiAgICAgICAgICAgICAgICA6IChudWxsIGFzIHVua25vd24gYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKVxuICAgICAgICAgICAgICA6IHsgLi4ubGF5ZXIgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5nZW9MYXllcnMuZmlsdGVyKChsYXllcikgPT4gIWFjdHVhbExheWVyS2V5cy5pbmNsdWRlcyhsYXllci5rZXkpKVxuICAgICAgICBdLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIpO1xuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdExheWVyVGl0bGUobGF5ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhIW1hcFN0eWxlcyAmJlxuICAgICAgICAgIG1hcFN0eWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgKCFhdXRvT3B0aW9ucy5zdHlsZSB8fCAhbWFwU3R5bGVzLm1hcCgoc3R5bGUpID0+IHN0eWxlLmlkZW50aWZpZXIpLmluY2x1ZGVzKGF1dG9PcHRpb25zLnN0eWxlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbGlnaHRTdHlsZXMgPSBtYXBTdHlsZXMuZmlsdGVyKChzdHlsZSkgPT4gIShzdHlsZS5pZGVudGlmaWVyID8/ICctJykuaW5jbHVkZXMoJ2RhcmsnKSk7XG4gICAgICAgICAgYXV0b09wdGlvbnMuc3R5bGUgPSBsaWdodFN0eWxlcy5sZW5ndGggPiAwID8gbGlnaHRTdHlsZXNbMF0uaWRlbnRpZmllciA6IG1hcFN0eWxlc1swXS5pZGVudGlmaWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllcikge1xuICAgICAgICAgIGNvbnN0IGJhc2UgPSBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXI7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBpZ25vcmVBdXRvTGF5ZXJzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeVxuICAgICAgICAgIGNvbnN0IHBvc3NpYmxlSWdub3JlQXV0b0xheWVyS2V5cyA9IGF1dG9EYXRhc2V0TGF5ZXJzLm1hcCgobGF5ZXIpID0+IGxheWVyLmtleSArICctJyArIGxheWVyLnN1YlR5cGUpO1xuICAgICAgICAgIGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllciA9IChhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgPz8gW10pLmZpbHRlcigoa2V5KSA9PlxuICAgICAgICAgICAgcG9zc2libGVJZ25vcmVBdXRvTGF5ZXJLZXlzLmluY2x1ZGVzKGtleSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyIHx8IGJhc2UubGVuZ3RoICE9PSBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRNYW5pZmVzdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhdXRvT3B0aW9ucztcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5vcHRpb25zJC5waXBlKGZpbHRlcigob3B0KSA9PiAhIW9wdCkpLnN1YnNjcmliZSgob3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLm1hcFVybCQgPSB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMubWFwVXJsKTtcbiAgICB0aGlzLndtc0ZlYXR1cmVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy53bXNGZWF0dXJlcyk7XG5cbiAgICB0aGlzLmJvdHRvbUxlZnQkID0gdGhpcy53aWRnZXRTaXplJC5waXBlKFxuICAgICAgbWFwKChzaXplKSA9PiBgdHJhbnNsYXRlKDEwcHggLGNhbGMoJHtzaXplLmhlaWdodH1weCAtIDEwMCUgLSAxMHB4KSlgKSxcbiAgICAgIGRlbGF5KDEwKVxuICAgICk7XG5cbiAgICB0aGlzLml0ZW1TdHlsZXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5yZXN1bHRTZXQkLCB0aGlzLm1hbmlmZXN0JCwgdGhpcy5zdGF0aWNSZXN1bHRTZXQkXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChbcnMsIG1hbmlmZXN0LCBzcnNdKSA9PiB7XG4gICAgICAgIGlmICgobWFuaWZlc3QuZGF0YXNvdXJjZSA9PT0gdW5kZWZpbmVkIHx8IG1hbmlmZXN0LmRhdGFzb3VyY2UubGVuZ3RoID09PSAwKSAmJiAhc3JzKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHsgW2lkOiBzdHJpbmddOiB7IGNsYXNzaWM6IFN0eWxlOyBib3JkZXJlZDogU3R5bGUgfSB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gT2JqZWN0LnZhbHVlcyhycy5pdGVtcykucmVkdWNlKChwLCBjKSA9PiBjLmxlbmd0aCArIHAsIDApO1xuICAgICAgICAgICAgICBpZiAodG90YWwgPT09IDApIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB7IFtpZDogc3RyaW5nXTogeyBjbGFzc2ljOiBTdHlsZTsgYm9yZGVyZWQ6IFN0eWxlIH0gfTtcbiAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhycy5pdGVtcykuZm9yRWFjaCgoaXRlbXMpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bWJvbFNlcnZpY2UuZ2V0U3ltYm9sQXNJY29uU3R5bGUoaXRlbSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltYm9sU2VydmljZS5nZXRTeW1ib2xBc0ljb25TdHlsZShpdGVtLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgXSkudGhlbigoW3N0eWxlLCBiU3R5bGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpdGVtLmlkXSA9IHsgY2xhc3NpYzogc3R5bGUsIGJvcmRlcmVkOiBiU3R5bGUgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID49IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmhlaWdodCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpZGdldFNpemUkLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLCB0aGlzLmRpc3BsYXlIZWFkZXIkXSkucGlwZShcbiAgICAgIG1hcCgoW3NpemUsIGRpc3BsYXldKSA9PiAoc2l6ZS5oZWlnaHQgPz8gMTAwKSAtIChkaXNwbGF5ID8gV0lER0VUX0hFQURFUl9IRUlHSFQgOiAwKSksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuXG4gICAgdGhpcy5sYXllcnNUb3AkID0gdGhpcy5kaXNwbGF5SGVhZGVyJC5waXBlKG1hcCgoZGlzcGxheSkgPT4gMTQwIC0gKGRpc3BsYXkgPyAwIDogV0lER0VUX0hFQURFUl9IRUlHSFQpKSk7XG4gICAgdGhpcy5sZWdlbmRUb3AkID0gdGhpcy5kaXNwbGF5SGVhZGVyJC5waXBlKG1hcCgoZGlzcGxheSkgPT4gMTgwIC0gKGRpc3BsYXkgPyAwIDogV0lER0VUX0hFQURFUl9IRUlHSFQpKSk7XG5cbiAgICB0aGlzLmxlZ2VuZEhlaWdodCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpZGdldFNpemUkLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLCB0aGlzLmxlZ2VuZFRvcCRdKS5waXBlKFxuICAgICAgbWFwKChbc2l6ZSwgdG9wXSkgPT4ge1xuICAgICAgICByZXR1cm4gKHNpemUuaGVpZ2h0ID8/IDEwMCkgLSBXSURHRVRfSEVBREVSX0hFSUdIVCAtIHRvcCAtIDU2OyAvLyA1NnB4IGlzIHRoZSB0b29sdGlwIGhlaWdodCArIG1hcmdpblxuICAgICAgfSksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuICB9XG5cbiAgaW5pdEludGVyYWN0aW9uTWFuYWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIuaW5pdCh0aGlzKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoeyB0YXJnZXQ6IHRoaXMubWFwUmVmLm5hdGl2ZUVsZW1lbnQgfSk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIgPSB0aGlzLmluaXRJbnRlcmFjdGlvbk1hbmFnZXIoKTtcbiAgICB0aGlzLm1hcFN0eWxlVXJsJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3B0aW9ucyQsIHRoaXMubWFwVXJsJF0pLnBpcGUoXG4gICAgICBtYXAoKFtvcHRpb25zLCB1cmxdKSA9PiB7XG4gICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdHlsZSkge1xuICAgICAgICAgIGNhc2UgdGhpcy5OT19TVFlMRTpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIGNhc2UgdGhpcy5TVFlMRV9GUk9NX1VSTDpcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnN0eWxlVVJMID8/ICcnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYCR7dXJsfS9zdHlsZXMvJHtvcHRpb25zLnN0eWxlfS9zdHlsZS5qc29uYDtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcblxuICAgIHRoaXMubWFwU3R5bGVMYXllciQgPSB0aGlzLm1hcFN0eWxlVXJsJC5waXBlKFxuICAgICAgbWFwKChzdHlsZVVybCkgPT4ge1xuICAgICAgICBpZiAoIXN0eWxlVXJsKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxheWVyID0gbmV3IFZlY3RvclRpbGVMYXllcih7XG4gICAgICAgICAgZGVjbHV0dGVyOiB0cnVlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHsgdGl0bGU6ICdiYWNrZ3JvdW5kJyB9XG4gICAgICAgIH0pO1xuICAgICAgICBhcHBseVN0eWxlKGxheWVyLCBzdHlsZVVybCkuY2F0Y2goKGVycikgPT4gY29uc29sZS53YXJuKCdTdHlsZSBhcHBsaWNhdGlvbiBwcm9ibGVtJywgZXJyKSk7XG4gICAgICAgIGFwcGx5QmFja2dyb3VuZChsYXllciwgc3R5bGVVcmwpLmNhdGNoKChlcnIpID0+IGNvbnNvbGUud2FybignQmFja2dyb3VuZCBhcHBsaWNhdGlvbiBwcm9ibGVtJywgZXJyKSk7XG4gICAgICAgIHJldHVybiBbbGF5ZXJdO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5vcHRpb25zJFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgob3B0aW9ucykgPT4gKHtcbiAgICAgICAgICBjZW50ZXI6IGZyb21Mb25MYXQob3B0aW9ucy5jZW50ZXIgPz8gREVGQVVMVF9NQVBfQ0VOVEVSKSxcbiAgICAgICAgICBtYXhab29tOiBvcHRpb25zLnpvb20/Lm1heCA/PyBERUZBVUxUX1pPT01fTUFYLFxuICAgICAgICAgIG1pblpvb206IG9wdGlvbnMuem9vbT8ubWluID8/IERFRkFVTFRfWk9PTV9NSU4sXG4gICAgICAgICAgem9vbTogb3B0aW9ucy56b29tPy5zdGFydCA/PyBERUZBVUxUX1pPT01fU1RBUlRcbiAgICAgICAgfSkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh2aWV3KSA9PiB0aGlzLm1hcC5zZXRWaWV3KG5ldyBWaWV3KHZpZXcpKSk7XG5cbiAgICB0aGlzLmZpdE9wdGlvbiQgPSB0aGlzLm9wdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKG9wdGlvbnMpID0+ICEhb3B0aW9ucy5maXQpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG5cbiAgICB0aGlzLmZpdE9wdGlvbiQuc3Vic2NyaWJlKChmaXQpID0+IHRoaXMuZml0TWFwRm9yT2JqZWN0cyhmaXQpKTtcblxuICAgIHRoaXMubGF5ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5yZXN1bHRTZXQkLFxuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMuY2xhc3NlcyQsXG4gICAgICB0aGlzLmFkZGl0aW9uYWxMYXllcnMkLFxuICAgICAgdGhpcy5pdGVtU3R5bGVzJCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5kYXRhc291cmNlRmlsdGVycykucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpKVxuICAgIF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoXG4gICAgICAgIChbcmVzdWx0U2V0LCBvcHRpb25zLCBjbGFzc2VzLCBhZGRpdGlvbmFsTGF5ZXJzLCBpdGVtU3R5bGVzLCBmaWx0ZXJzXSkgPT4gISFyZXN1bHRTZXQgJiYgISFvcHRpb25zICYmICEhY2xhc3Nlc1xuICAgICAgKSxcbiAgICAgIG1hcCgoW3Jlc3VsdFNldCwgb3B0aW9ucywgY2xhc3NlcywgYWRkaXRpb25hbExheWVycywgaXRlbVN0eWxlcywgZmlsdGVyc10pID0+IHtcbiAgICAgICAgbGV0IGhhc1JlbGF0aW9uTGF5ZXIgPSBudWxsIGFzIHVua25vd24gYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPGFueT4+O1xuXG4gICAgICAgIGNvbnN0IGxheWVycyA9IChvcHRpb25zPy5sYXllcnMgfHwgW10pXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIChsYXllcikgPT4gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuZG9udE5lZWRMb2NhdGlvbi5pbmNsdWRlcyhsYXllci50eXBlKSB8fCAhIWxheWVyLmF0dHJpYnV0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgKGxheWVyKSA9PiB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS5kb250TmVlZEludGVuc2l0eS5pbmNsdWRlcyhsYXllci50eXBlKSB8fCAhIWxheWVyLmludGVuc2l0eUF0dHJpYnV0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNGb3JDbGFzcyA9IE9iamVjdC5rZXlzKHJlc3VsdFNldC5pdGVtcylcbiAgICAgICAgICAgICAgLm1hcCgoY2xhc3NJZCkgPT4gKHtcbiAgICAgICAgICAgICAgICBjbGFzc0lkLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0QXR0cmlidXRlc0ZvckRyYXdpbmcoY2xhc3NlcywgY2xhc3NJZCwgbGF5ZXIpXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgIChwLCBjKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgLi4ucCxcbiAgICAgICAgICAgICAgICAgIFtjLmNsYXNzSWRdOiBjXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAge30gYXMge1xuICAgICAgICAgICAgICAgICAgW2tleTogc3RyaW5nXToge1xuICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHlBdHRyaWJ1dGU6IEF0dHJpYnV0ZTtcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25BdHRyaWJ1dGU6IEF0dHJpYnV0ZTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgbGF5ZXJDbGFzc2VzSWQgPSBjbGFzc2VzLm1hcCgoY2xhenopID0+IGNsYXp6LmlkKTtcbiAgICAgICAgICAgIGlmICgnY2xhc3NlcycgaW4gbGF5ZXIgJiYgISFsYXllci5jbGFzc2VzICYmIGxheWVyLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsYXllckNsYXNzZXNJZCA9IGxheWVyLmNsYXNzZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByYW5nZSA9IHsgbWluOiAwLCBtYXg6IDAgfTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICghIWxheWVyLmludGVuc2l0eUF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3Qua2V5cyhyZXN1bHRTZXQuaXRlbXMpXG4gICAgICAgICAgICAgICAgLm1hcCgoY2xhc3NJZCkgPT5cbiAgICAgICAgICAgICAgICAgIHJlc3VsdFNldC5pdGVtc1tjbGFzc0lkXS5tYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgICAgIEl0ZW1VdGlscy5nZXRBdHRyaWJ1dGVDYWxjdWxhdGVkVmFsdWUoaXRlbSwgYXR0cmlidXRlc0ZvckNsYXNzW2l0ZW0ub0NsYXNzXS5pbnRlbnNpdHlBdHRyaWJ1dGUpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+IFsuLi5wLCAuLi5jXSwgW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigodmFsdWUpID0+ICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgYXMgbnVtYmVyW107XG5cbiAgICAgICAgICAgICAgcmFuZ2UgPSB2YWx1ZXMucmVkdWNlKChwLCBjKSA9PiAoeyBtaW46IE1hdGgubWluKHAubWluLCBjKSwgbWF4OiBNYXRoLm1heChwLm1heCwgYykgfSksIHtcbiAgICAgICAgICAgICAgICBtaW46IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICAgICAgbWF4OiAtTnVtYmVyLk1BWF9WQUxVRVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW1wbCA9IHRoaXMud2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLmxheWVyc0ltcGxlbWVudGF0aW9uW2xheWVyLnR5cGVdO1xuICAgICAgICAgICAgaWYgKCEhaW1wbCkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHRMYXllciA9IGltcGwoXG4gICAgICAgICAgICAgICAgbGF5ZXIgYXMgYW55LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNGb3JDbGFzcyxcbiAgICAgICAgICAgICAgICBsYXllckNsYXNzZXNJZCxcbiAgICAgICAgICAgICAgICByZXN1bHRTZXQsXG4gICAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgICAgaXRlbVN0eWxlcyxcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ3JlbGF0aW9uJykge1xuICAgICAgICAgICAgICAgIGhhc1JlbGF0aW9uTGF5ZXIgPSByZXN1bHRMYXllciBhcyB1bmtub3duIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZT47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCd0aXRsZScsIGxheWVyLnRpdGxlKTtcblxuICAgICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcWxfZmlsdGVyID0gQ3FsVXRpbHMuZ2V0Q1FMUGFyYW1zRm9yKGxheWVyLmRhdGFzb3VyY2VJZCwgZmlsdGVycywgY2xhc3Nlcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3FsX2ZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIENRTCBxdWVyeSB0byBnZW9zZXJ2ZXIgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAocmVzdWx0TGF5ZXIgYXMgVGlsZTxUaWxlV01TPikuZ2V0U291cmNlKCkhLnVwZGF0ZVBhcmFtcyh7IGNxbF9maWx0ZXIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExheWVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTGF5ZXIgdHlwZSAke2xheWVyLnR5cGV9IGlzIHVua25vd25gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgdW5rbm93biBhcyBCYXNlTGF5ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gISFsYXllcik7XG5cbiAgICAgICAgaWYgKCEhaGFzUmVsYXRpb25MYXllcikge1xuICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gbGF5ZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gIShsYXllciBpbnN0YW5jZW9mIFRpbGUpKVxuICAgICAgICAgICAgLm1hcCgobGF5ZXIpID0+XG4gICAgICAgICAgICAgIGxheWVyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC5nZXRTb3VyY2UoKVxuICAgICAgICAgICAgICAgIC5nZXRGZWF0dXJlcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZmVhdHVyZXM6IEZlYXR1cmU8YW55PikgPT4gISFmZWF0dXJlcy5nZXQoJ2lkJykgfHwgISFmZWF0dXJlcy5nZXQoJ2ZlYXR1cmVzJykpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucmVkdWNlKChwLCBjKSA9PiBbLi4ucCwgLi4uY10sIFtdKTtcblxuICAgICAgICAgIHJlc3VsdFNldC5yZWxhdGlvbnMuZm9yRWFjaCgocmVsYXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGZlYXR1cmVzLmZpbmQoKGY6IEZlYXR1cmU8UG9pbnQgfCBDaXJjbGU+KSA9PiBmLmdldCgnaWQnKSA9PT0gcmVsYXRpb24uc291cmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBmZWF0dXJlcy5maW5kKChmOiBGZWF0dXJlPFBvaW50IHwgQ2lyY2xlPikgPT4gZi5nZXQoJ2lkJykgPT09IHJlbGF0aW9uLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgIGlmICghIXNvdXJjZSAmJiAhIWRlc3QpIHtcbiAgICAgICAgICAgICAgaGFzUmVsYXRpb25MYXllci5nZXRTb3VyY2UoKT8uYWRkRmVhdHVyZShnZXRMaW5rRmVhdHVyZShyZWxhdGlvbiwgc291cmNlLCBkZXN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGF5ZXJzLnB1c2goLi4uYWRkaXRpb25hbExheWVycyk7XG4gICAgICAgIGxheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgsIGFycikgPT4gbGF5ZXIuc2V0KCd6SW5kZXgnLCBhcnIubGVuZ3RoIC0gaW5kZXgpKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zaW5nbGVMYXllcikge1xuICAgICAgICAgIGxheWVycy5mb3JFYWNoKChsYXllciwgaWR4KSA9PiB7XG4gICAgICAgICAgICBsYXllci5zZXRWaXNpYmxlKGlkeCA9PT0gMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5sZWdlbmRMYXllcnMkID0gdGhpcy5vcHRpb25zJC5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAob3B0aW9ucykgPT5cbiAgICAgICAgICAob3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+IFsnZ2Vvc2VydmVyJywgJ3dtcyddLmluY2x1ZGVzKGxheWVyLnR5cGUpKSBhcyAoXG4gICAgICAgICAgICB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1xuICAgICAgICAgICAgfCBNYXBXTVNMYXllckxheWVyT3B0aW9uc1xuICAgICAgICAgIClbXVxuICAgICAgKSxcbiAgICAgIGRlbGF5KDEwKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMubWFwU3R5bGVMYXllciQsXG4gICAgICAgIHRoaXMubGF5ZXJzJCxcbiAgICAgICAgdGhpcy5maXRPcHRpb24kLFxuICAgICAgICB0aGlzLnNlbGVjdGVkSWRzJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSkpXG4gICAgICBdKS5zdWJzY3JpYmUoKFttYXBTdHlsZUxheWVyLCBsYXllcnMsIGZpdCwgc2VsZWN0ZWRJZHNdKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvQXBwbHlMYXllcnMgPSBbLi4ubGF5ZXJzLCAuLi5tYXBTdHlsZUxheWVyXTtcbiAgICAgICAgdGhpcy5tYXAuc2V0TGF5ZXJzKHRvQXBwbHlMYXllcnMpO1xuICAgICAgICB0aGlzLm1hcFxuICAgICAgICAgIC5nZXRBbGxMYXllcnMoKVxuICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiAhKGxheWVyIGluc3RhbmNlb2YgVGlsZSkpXG4gICAgICAgICAgLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBnZXRGZWF0dXJlcyA9IChsYXllci5nZXRTb3VyY2UoKSBhcyBWZWN0b3JTb3VyY2UpPy5nZXRGZWF0dXJlcztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ2V0RmVhdHVyZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgKGxheWVyLmdldFNvdXJjZSgpIGFzIFZlY3RvclNvdXJjZSk/LmdldEZlYXR1cmVzKCkuZm9yRWFjaCgoZmVhdHVyZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGZlYXR1cmUuZ2V0KCd0eXBlJyk7XG4gICAgICAgICAgICAgICAgaWYgKFsnYnViYmxlJywgJ21hcmtlcicsICdwb2ludCcsICdsaW5lJywgJ3BvbHlnb24nLCAnbXVsdGktbGluZScsICdtdWx0aS1wb2x5Z29uJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmUuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZ2V0KHNlbGVjdGVkSWRzLmluY2x1ZGVzKGZlYXR1cmUuZ2V0KCdpZCcpKSA/ICdzZWxlY3RlZFN0eWxlJyA6ICdjbGFzc2ljU3R5bGUnKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZml0TWFwRm9yT2JqZWN0cyhmaXQsIHNlbGVjdGVkSWRzKTtcbiAgICAgICAgICB0aGlzLm1hcC51cGRhdGVTaXplKCk7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMud21zRmVhdHVyZXMkLCB0aGlzLmNsYXNzaWNGZWF0dXJlcyQsIHRoaXMud2lkZ2V0U2l6ZSQsIHRoaXMuZGlzcGxheUhlYWRlciRdKS5zdWJzY3JpYmUoXG4gICAgICAgIChbd21zRmVhdHVyZXMsIGNsYXNzaWNGZWF0dXJlcywgc2l6ZSwgaGVhZGVyXSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgdGhpcy50b29sdGlwSW5kZXggPSAwO1xuICAgICAgICAgICAgY29uc3QgcG9wdXBPdmVybGF5ID0gbmV3IE92ZXJsYXkoe1xuICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLnBvcHVwLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgIG9mZnNldDogWzksIDldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubWFwLmFkZE92ZXJsYXkocG9wdXBPdmVybGF5KTtcbiAgICAgICAgICAgIHRoaXMucG9wdXBDb250ZW50LmNsZWFyKCk7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRQcm9taXNlcyA9IFtdIGFzIFByb21pc2U8Q29tcG9uZW50UmVmPEJhc2VUb29sdGlwQ29tcG9uZW50PiB8IG51bGw+W107XG4gICAgICAgICAgICB3bXNGZWF0dXJlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBjb21wb25lbnRQcm9taXNlcy5wdXNoKHRoaXMuZ2VuZXJhdGVUb29sdGlwKHZhbHVlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNsYXNzaWNGZWF0dXJlcy5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFByb21pc2VzLnB1c2godGhpcy5nZW5lcmF0ZVRvb2x0aXAodmFsdWUpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChjb21wb25lbnRQcm9taXNlcykudGhlbigocHJvbWlzZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVhbENvbXBvbmVudHMgPSBwcm9taXNlcy5maWx0ZXIoKGNvbXBvbmVudCkgPT4gISFjb21wb25lbnQpO1xuICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBOdW1iZXIgPSByZWFsQ29tcG9uZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmIChyZWFsQ29tcG9uZW50cy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXAubmF0aXZlRWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBvcHVwT3ZlcmxheS5zZXRQb3NpdGlvbihbLTk5OTk5OTk5OTksIC05OTk5OTk5OTk5XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cC5uYXRpdmVFbGVtZW50LmhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBnbyBvdXRzaWRlIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0ge1xuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAyMDAgKyAoaGVhZGVyID8gV0lER0VUX0hFQURFUl9IRUlHSFQgOiAwKSArIFRPT0xUSVBfUEFERElORyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMDAgKyBUT09MVElQX1BBRERJTkdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCBwaXhlbCA9IHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLnRvb2x0aXBFdmVudD8ucGl4ZWw7XG4gICAgICAgICAgICAgICAgaWYgKCEhcGl4ZWwgJiYgcGl4ZWxbMF0gKyByZWN0LndpZHRoID4gc2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgcGl4ZWxbMF0gPSBzaXplLndpZHRoIC0gcmVjdC53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCEhcGl4ZWwgJiYgcGl4ZWxbMV0gKyByZWN0LmhlaWdodCA+IHNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICBwaXhlbFsxXSA9IHNpemUuaGVpZ2h0IC0gcmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwTW92ZSgwKTtcbiAgICAgICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgICAgICAgICAgcG9wdXBPdmVybGF5LnNldFBvc2l0aW9uKHRoaXMubWFwLmdldENvb3JkaW5hdGVGcm9tUGl4ZWwocGl4ZWwgPz8gWzAsIDBdKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBpbml0UmVzdWx0U2V0JCgpIHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMucmVzdWx0U2V0cyksXG4gICAgICB0aGlzLmRhdGFzb3VyY2VJZHMkLFxuICAgICAgdGhpcy5zdGF0aWNSZXN1bHRTZXQkLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGF0YVNvdXJjZVNlbGVjdG9ycy5kYXRhc2V0cylcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcmVzdWx0U2V0cywgcmVzdWx0U2V0TmFtZXNBcnJheSwgc3RhdGljUmVzdWx0U2V0LCBkZWZpbml0aW9uc10pID0+IHtcbiAgICAgICAgaWYgKCEhc3RhdGljUmVzdWx0U2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRpY1Jlc3VsdFNldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHRTZXRBcnJheSA9IHJlc3VsdFNldE5hbWVzQXJyYXlcbiAgICAgICAgICAuZmlsdGVyKChyc05hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBkZWZpbml0aW9ucy5maW5kKChkc2QpID0+IGRzZC5pZCA9PT0gcnNOYW1lKSBhcyBEYXRhc2V0IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuICFkZWZpbml0aW9uIHx8ICEoZGVmaW5pdGlvbi5tZXRhZGF0YSA/PyBbXSkuZmluZCgobWV0YSkgPT4gbWV0YS5tZXRhZGF0YURlZi5uYW1lID09PSAnX2dlb0tleScpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcCgocnNOYW1lKSA9PiByZXN1bHRTZXRzW3JzTmFtZSA/PyAnJ10pXG4gICAgICAgICAgLmZpbHRlcigocnNOYW1lKSA9PiAhIXJzTmFtZSk7XG4gICAgICAgIHJldHVybiByZXN1bHRTZXRBcnJheS5yZWR1Y2UoKHJzMSwgcnMyKSA9PiBSZXN1bHRzZXRVdGlscy5tZXJnZVJlc3VsdFNldHMocnMxLCByczIpLCB7XG4gICAgICAgICAgaXRlbXM6IHt9LFxuICAgICAgICAgIHJlbGF0aW9uczogW10sXG4gICAgICAgICAgbWVyZ2VkOiByZXN1bHRTZXRBcnJheS5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCB2KSA9PiBlcXVhbChwLCB2KSlcbiAgICApO1xuICB9XG5cbiAgZ2VuZXJhdGVUb29sdGlwKHZhbHVlOiB7XG4gICAgb0NsYXNzOiBzdHJpbmc7XG4gICAgY29vcmRpbmF0ZXM6IFBpeGVsO1xuICAgIHZhbHVlczogYW55O1xuICB9KTogUHJvbWlzZTxDb21wb25lbnRSZWY8QmFzZVRvb2x0aXBDb21wb25lbnQ+IHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50JCA9IHRoaXMudG9vbHRpcEZhY3RvcnlTZXJ2aWNlLmdlbmVyYXRlVG9vbHRpcCh2YWx1ZS5vQ2xhc3MsIHRoaXMuaW5qZWN0b3IsIHRoaXMucG9wdXBDb250ZW50KTtcbiAgICAgIGNvbXBvbmVudCQuc3Vic2NyaWJlKChjb21wb25lbnQpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5kYXRhLml0ZW0gPSB2YWx1ZS52YWx1ZXM7XG4gICAgICAgICAgY29tcG9uZW50Lmluc3RhbmNlLnBvcHVwID0gdGhpcy5wb3B1cDtcbiAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0RGVmYXVsdExheWVyVGl0bGUobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgY2FwYWJpbGl0aWVzOiAoR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2UgfCBudWxsKVtdKSB7XG4gICAgaWYgKCFsYXllci50aXRsZSkge1xuICAgICAgaWYgKFsnZ2Vvc2VydmVyJywgJ3dtcyddLmluY2x1ZGVzKGxheWVyLnR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGdlb0xheWVyID0gbGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxheWVyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzLmZpbmQoKGNhcCkgPT4gY2FwPy5wYXJhbUxheWVyID09PSBnZW9MYXllci5wYXJhbUxheWVyKTtcblxuICAgICAgICBpZiAobGF5ZXJDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ0xheWVyID0gV21zU2VydmljZS5nZXRNYXRjaGluZ0xheWVyKGdlb0xheWVyLnBhcmFtTGF5ZXIsIGxheWVyQ2FwYWJpbGl0aWVzLmRvYyk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nTGF5ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVGl0bGUgPSBYTUxVdGlscy5maW5kKG1hdGNoaW5nTGF5ZXIuY2hpbGROb2RlcywgJ1RpdGxlJyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdUaXRsZSkge1xuICAgICAgICAgICAgICBsYXllci50aXRsZSA9XG4gICAgICAgICAgICAgICAgISFtYXRjaGluZ1RpdGxlLnRleHRDb250ZW50ICYmIG1hdGNoaW5nVGl0bGUudGV4dENvbnRlbnQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgPyBtYXRjaGluZ1RpdGxlLnRleHRDb250ZW50XG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheWVyLnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYEBwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUuJHtsYXllci50eXBlfWAsIHsgLi4ubGF5ZXIgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZml0TWFwRm9yT2JqZWN0cyhmaXQ6IGJvb2xlYW4sIHNlbGVjdGVkSWRzPzogc3RyaW5nW10pIHtcbiAgICBpZiAoZml0KSB7XG4gICAgICBsZXQgZXh0ZW50ID0gY3JlYXRlRW1wdHkoKTtcbiAgICAgIGNvbnN0IGxpc3RPZk1hcmtlcnMgPSBbXSBhcyBhbnlbXTtcblxuICAgICAgdGhpcy5tYXBcbiAgICAgICAgLmdldEFsbExheWVycygpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGxheWVyKSA9PiAhIWxheWVyLmdldFNvdXJjZSAmJiAhIWxheWVyLmdldFNvdXJjZSgpICYmICEhKGxheWVyLmdldFNvdXJjZSgpIGFzIFZlY3RvclNvdXJjZSkuZ2V0RmVhdHVyZXNcbiAgICAgICAgKVxuICAgICAgICAuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAobGF5ZXIuZ2V0U291cmNlKCkgYXMgVmVjdG9yU291cmNlKS5nZXRGZWF0dXJlcygpLmZvckVhY2goKGZlYXR1cmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBmZWF0dXJlLmdldCgnaWQnKTtcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWRJZHMgfHwgc2VsZWN0ZWRJZHMubGVuZ3RoIDw9IDAgfHwgKHNlbGVjdGVkSWRzLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRJZHMuaW5jbHVkZXMoaWQpKSkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmUuZ2V0KCd0eXBlJykpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdoZWF0cG9pbnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3BvaW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICdtYXJrZXInOlxuICAgICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKGZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKC4uLmZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3BvbHlnb24nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ211bHRpLWxpbmUnOlxuICAgICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKC4uLmZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpLmZsYXQoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtdWx0aS1wb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaCguLi5mZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKS5mbGF0KCkuZmxhdCgpKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBsaXN0T2ZNYXJrZXJzLnB1c2goZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldENlbnRlcigpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRFeHRlbnQgPSBib3VuZGluZ0V4dGVudChsaXN0T2ZNYXJrZXJzLmZpbHRlcigoY29vcmQpID0+ICEhY29vcmQpKTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0ZWRFeHRlbnRbMF0gIT09IEluZmluaXR5ICYmXG4gICAgICAgIHNlbGVjdGVkRXh0ZW50WzFdICE9PSBJbmZpbml0eSAmJlxuICAgICAgICBzZWxlY3RlZEV4dGVudFsyXSAhPT0gLUluZmluaXR5ICYmXG4gICAgICAgIHNlbGVjdGVkRXh0ZW50WzNdICE9PSAtSW5maW5pdHlcbiAgICAgICkge1xuICAgICAgICBleHRlbnQgPSBzZWxlY3RlZEV4dGVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dGVudFswXSAhPT0gSW5maW5pdHkgJiYgZXh0ZW50WzFdICE9PSBJbmZpbml0eSAmJiBleHRlbnRbMl0gIT09IC1JbmZpbml0eSAmJiBleHRlbnRbM10gIT09IC1JbmZpbml0eSkge1xuICAgICAgICB0aGlzLm1hcC5nZXRWaWV3KCkuZml0KGV4dGVudCwgeyBwYWRkaW5nOiBbMjAsIDIwLCA3MCwgNzBdLCBkdXJhdGlvbjogMjAwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXR0cmlidXRlc0ZvckRyYXdpbmcoY2xhc3NlczogQ2xhc3NbXSwgY2xhc3NJZDogc3RyaW5nLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgY2xhc3NPYmogPSBjbGFzc2VzLmZpbmQoKGNsKSA9PiBjbC5pZCA9PT0gY2xhc3NJZCkgPz8gKHsgYXR0cmlidXRlczogW10gYXMgQXR0cmlidXRlW10gfSBhcyBDbGFzcyk7XG4gICAgY29uc3QgbG9jYXRpb25BdHRyaWJ1dGUgPSB0aGlzLmdldExvY2F0aW9uQXR0cmlidXRlKGNsYXNzT2JqLCBsYXllcik7XG4gICAgY29uc3QgaW50ZW5zaXR5QXR0cmlidXRlID0gdGhpcy5nZXRJbnRlbnNpdHlBdHRyaWJ1dGUoXG4gICAgICBjbGFzc09iaixcbiAgICAgIGxheWVyIGFzIE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnNcbiAgICApO1xuICAgIHJldHVybiB7IGxvY2F0aW9uQXR0cmlidXRlLCBpbnRlbnNpdHlBdHRyaWJ1dGUgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW50ZW5zaXR5QXR0cmlidXRlKFxuICAgIGNsYXNzT2JqOiBDbGFzcyB8IHVuZGVmaW5lZCxcbiAgICBsYXllcjogTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9uc1xuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGNsYXNzT2JqIHx8IHsgYXR0cmlidXRlczogW10gfSkuYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLm5hbWUgPT09IGxheWVyPy5pbnRlbnNpdHlBdHRyaWJ1dGUgPz8gJycpID8/XG4gICAgICAodW5kZWZpbmVkIGFzIHVua25vd24gYXMgQXR0cmlidXRlKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldExvY2F0aW9uQXR0cmlidXRlKGNsYXNzT2JqOiBDbGFzcywgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucyk6IEF0dHJpYnV0ZSB7XG4gICAgdHlwZSBsYXllcnMgPSBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zO1xuICAgIGNvbnN0IHNwZWNpZmljTGF5ZXIgPSBsYXllciBhcyBsYXllcnM7XG4gICAgcmV0dXJuIChcbiAgICAgIGNsYXNzT2JqLmF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci5uYW1lID09PSAoc3BlY2lmaWNMYXllcj8uYXR0cmlidXRlID8/IFtdKSA/PyAnJykgPz9cbiAgICAgICh1bmRlZmluZWQgYXMgdW5rbm93biBhcyBBdHRyaWJ1dGUpXG4gICAgKTtcbiAgfVxuXG4gIGNoYW5nZVN0eWxlKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5zdHlsZSA9ICRldmVudDtcbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5zdHlsZSAhPT0gdGhpcy5TVFlMRV9GUk9NX1VSTCkge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuc3R5bGVVUkw7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3R5bGVVUkwoJGV2ZW50OiBFdmVudCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnN0eWxlVVJMID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlRml0KCRldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuZml0ID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlQXR0cmlidXRpb25zKCRldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuYXR0cmlidXRpb25zID0gJGV2ZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmF0dHJpYnV0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiAobGF5ZXIuYXR0cmlidXRpb24gPSAnJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uZm9yRWFjaCgobGF5ZXIpID0+IGRlbGV0ZSBsYXllci5hdHRyaWJ1dGlvbik7XG4gICAgfVxuICB9XG5cbiAgYWRkTGF5ZXIoKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmxheWVycykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMucHVzaCh7IGF0dHJpYnV0ZTogJycgfSBhcyBNYXBXaWRnZXRMYXllck9wdGlvbnMpO1xuICB9XG5cbiAgY2hhbmdlTGF5ZXJUeXBlKCRldmVudDogYW55LCBpOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID8/IFtdO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlID0gJGV2ZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlID09PSAnd21zJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucy5wYXJhbUxheWVyID0gb3B0aW9ucy5wYXJhbUxheWVyID8/ICcnO1xuICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCA/PyAnJztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUgPT09ICd3bXRzJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldIGFzIE1hcFdNVFNMYXllckxheWVyT3B0aW9ucztcbiAgICAgIG9wdGlvbnMucGFyYW1MYXllciA9IG9wdGlvbnMucGFyYW1MYXllciA/PyAnJztcbiAgICAgIG9wdGlvbnMuc3R5bGUgPSBvcHRpb25zLnN0eWxlID8/ICcnO1xuICAgICAgb3B0aW9ucy5tYXRyaXhTZXQgPSBvcHRpb25zLm1hdHJpeFNldCA/PyAnJztcbiAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgPz8gJyc7XG4gICAgfVxuICAgIGlmIChbJ2ZlYXR1cmVsYXllcicsICd2ZWN0b3J0aWxlJywgJ3Jhc3RlcnRpbGUnXS5pbmNsdWRlcyh0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlKSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldIGFzIE1hcEZlYXR1cmVMYXllck9wdGlvbnM7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsID8/ICcnO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVRpdGxlKCRldmVudDogYW55LCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgbGF5ZXIudGl0bGUgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBlbWl0TWFuaWZlc3QoKSB7XG4gICAgdGhpcy5tYW5pZmVzdE1vZGlmaWVkLmVtaXQoe1xuICAgICAgd2lkZ2V0SW5kZXg6IHRoaXMud2lkZ2V0SW5kZXgsXG4gICAgICBtYW5pZmVzdDoge1xuICAgICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgICBvcHRpb25zOiB7IC4uLnRoaXMub3B0aW9uc0NvcHksIGxheWVyczogKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID8/IFtdKS5maWx0ZXIoKGxheWVyKSA9PiAhIWxheWVyLnR5cGUpIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNoYW5nZUxvY2F0aW9uQXR0cmlidXRlcygkZXZlbnQ6IGFueSwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5hdHRyaWJ1dGUgPSAkZXZlbnQ7XG4gIH1cblxuICBsYXllckhhc0ludGVuc2l0eShsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKTogTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucyB7XG4gICAgcmV0dXJuIDxNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zPmxheWVyO1xuICB9XG5cbiAgY2hhbmdlSW50ZW5zaXR5QXR0cmlidXRlcygkZXZlbnQ6IGFueSwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyXyA9IDxNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zPmxheWVyO1xuICAgIGxheWVyXy5pbnRlbnNpdHlBdHRyaWJ1dGUgPSAkZXZlbnQ7XG4gIH1cblxuICBjaGFuZ2VDbGFzc2VzKCRldmVudDogc3RyaW5nW10sIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBzcGVjaWZpY0xheWVyID0gbGF5ZXIgYXNcbiAgICAgIHwgTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9uc1xuICAgICAgfCBNYXBXaWRnZXRNYXJrZXJMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zO1xuICAgIHNwZWNpZmljTGF5ZXIuY2xhc3NlcyA9ICRldmVudDtcbiAgfVxuXG4gIGRlbGV0ZUxheWVyKGk6IG51bWJlciwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9uc0NvcHk/LmxheWVycz8uc3BsaWNlKGksIDEpO1xuICAgIGlmIChsYXllci50eXBlID09PSAnYXV0bycpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuaWdub3JlQXV0b0xheWVyID0gWy4uLih0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllciA/PyBbXSksIGxheWVyLmtleSArICctJyArIGxheWVyLnN1YlR5cGVdO1xuICAgIH1cbiAgfVxuXG4gIGludmVydExheWVycyhpZHg6IG51bWJlciwgaWR4V2l0aDogbnVtYmVyKSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zQ29weSAmJiAhIXRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICBjb25zdCB0bXAgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpZHhXaXRoXTtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2lkeFdpdGhdID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaWR4XTtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2lkeF0gPSB0bXA7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlVXJsKFxuICAgICRldmVudDogRXZlbnQsXG4gICAgbGF5ZXI6XG4gICAgICB8IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcEZlYXR1cmVMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwVmVjdG9yVGlsZUxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBSYXN0ZXJUaWxlTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFdNVFNMYXllckxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLnVybCA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZUF0dHJpYnV0aW9uKCRldmVudDogRXZlbnQsIGxheWVyOiBCYXNlV2lkZ2V0TWFwTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLmF0dHJpYnV0aW9uID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlUGFyYW1MYXllcigkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIucGFyYW1MYXllciA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZVBhcmFtVGlsZWQoJGV2ZW50OiBib29sZWFuLCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5wYXJhbVRpbGVkID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlTWF0cml4U2V0KCRldmVudDogRXZlbnQsIGxheWVyOiBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIubWF0cml4U2V0ID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlUGFyYW1TdHlsZSgkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLnN0eWxlID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgZXhwb3J0KCkge1xuICAgIGV4cG9ydE1hcEFzSW1hZ2UodGhpcy5tYXAsICdtYXAucG5nJyk7XG4gIH1cblxuICBvdmVycmlkZSB0b0ltYWdlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGdldE1hcEFzUG5nKHRoaXMubWFwKTtcbiAgfVxuXG4gIGNoYW5nZUNsdXN0ZXJlZChsYXllcjogTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zLCAkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICBsYXllci5jbHVzdGVyZWQgPSAkZXZlbnQ7XG4gICAgaWYgKGxheWVyLmNsdXN0ZXJlZCkge1xuICAgICAgbGF5ZXIuY2x1c3RlckRpc3RhbmNlID0gMTA7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlQ2x1c3RlckRpc3RhbmNlKGxheWVyOiBNYXBXaWRnZXRNYXJrZXJMYXllck9wdGlvbnMsICRldmVudDogRXZlbnQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuY2x1c3RlckRpc3RhbmNlID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgaGlkZUFkZHJlc3MoKSB7XG4gICAgdGhpcy5hZGRyZXNzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGNoYW5nZU9wYWNpdHkobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgJGV2ZW50OiBzdHJpbmcpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIub3BhY2l0eSA9IHBhcnNlSW50KCRldmVudCwgMTApO1xuICB9XG5cbiAgZ2V0V01TTGF5ZXJzKCkge1xuICAgIHJldHVybiAhdGhpcy5tYXBcbiAgICAgID8gW11cbiAgICAgIDogdGhpcy5tYXBcbiAgICAgICAgICAuZ2V0QWxsTGF5ZXJzKClcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUaWxlV01TKVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIucmVuZGVyZWQgPT09IHRydWUpO1xuICB9XG5cbiAgaXNMYXllclJlbmRlcmVkKGxheWVyOiBhbnkpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldFdNU0xheWVycygpLmZpbmQoKHdtc0xheWVyKSA9PiB3bXNMYXllci5nZXQoJ3RpdGxlJykgPT09IGxheWVyLnRpdGxlKTtcbiAgfVxuXG4gIGlzTGF5ZXJWaXNpYmxlKGxheWVyOiBhbnkpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldFdNU0xheWVycygpXG4gICAgICAuZmluZCgod21zTGF5ZXIpID0+IHdtc0xheWVyLmdldCgndGl0bGUnKSA9PT0gbGF5ZXIudGl0bGUpXG4gICAgICA/LmdldFZpc2libGUoKTtcbiAgfVxuXG4gIGdldEZlYXR1cmVGcm9tU2VydmVyKHdtc0xheWVyczogYW55W10sIHBpeGVsOiBQaXhlbCkge1xuICAgIHByb2o0LmRlZnMoXG4gICAgICAnRVBTRzoyMTU0JyxcbiAgICAgICcrcHJvaj1sY2MgK2xhdF8wPTQ2LjUgK2xvbl8wPTMgK2xhdF8xPTQ5ICtsYXRfMj00NCAreF8wPTcwMDAwMCAreV8wPTY2MDAwMDAgK2VsbHBzPUdSUzgwICt0b3dnczg0PTAsMCwwLDAsMCwwLDAgK3VuaXRzPW0gK25vX2RlZnMgK3R5cGU9Y3JzJ1xuICAgICk7XG4gICAgcmVnaXN0ZXIocHJvajQpO1xuICAgIGNvbnN0IHByb2pHZW8gPSBnZXRQcm9qZWN0aW9uKCdFUFNHOjM4NTcnKTtcbiAgICBjb25zdCBwcm9qTGFtYmVydCA9IGdldFByb2plY3Rpb24oJ0VQU0c6MjE1NCcpO1xuXG4gICAgaWYgKHByb2pMYW1iZXJ0ICYmIHByb2pHZW8pIHtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygd21zTGF5ZXJzKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGxheWVyXG4gICAgICAgICAgLmdldFNvdXJjZSgpXG4gICAgICAgICAgLmdldEZlYXR1cmVJbmZvVXJsKHRyYW5zZm9ybShwaXhlbCwgcHJvakdlbywgcHJvakxhbWJlcnQpLCB0aGlzLm1hcC5nZXRWaWV3KCkuZ2V0UmVzb2x1dGlvbigpLCAnRVBTRzoyMTU0Jywge1xuICAgICAgICAgICAgSU5GT19GT1JNQVQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIEZFQVRVUkVfQ09VTlQ6IDEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy5nZXRXbXNGZWF0dXJlcyh7XG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgb0NsYXNzOiBsYXllci5nZXRQcm9wZXJ0aWVzKCkub0NsYXNzID8/ICcnLFxuICAgICAgICAgICAgICBjb29yZGluYXRlczogcGl4ZWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVdtc0NsYXNzKCRldmVudDogYW55LCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5vQ2xhc3MgPSAkZXZlbnQ7XG4gIH1cblxuICB0b2dnbGVMZWdlbmQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubGVnZW5kVGFiID0gdGhpcy5sZWdlbmRUYWIgPT09IGluZGV4ID8gLTEgOiBpbmRleDtcbiAgfVxuXG4gIHRvZ2dsZUxlZ2VuZFdpbmRvdygpIHtcbiAgICB0aGlzLmxlZ2VuZFRhYk9wZW4gPSAhdGhpcy5sZWdlbmRUYWJPcGVuO1xuICAgIHRoaXMubGF5ZXJzVGFiT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlTGF5ZXJzV2luZG93KCkge1xuICAgIHRoaXMubGF5ZXJzVGFiT3BlbiA9ICF0aGlzLmxheWVyc1RhYk9wZW47XG4gICAgdGhpcy5sZWdlbmRUYWJPcGVuID0gZmFsc2U7XG4gIH1cblxuICB0b29sdGlwTW92ZShudW1iZXI6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnRvb2x0aXBDYW5Nb3ZlKG51bWJlcikpIHtcbiAgICAgIHRoaXMuc2V0U3R5bGVBc3luYyh0aGlzLnRvb2x0aXBJbmRleCwgJ25vbmUnKTtcbiAgICAgIHRoaXMudG9vbHRpcEluZGV4ID0gdGhpcy50b29sdGlwSW5kZXggKyBudW1iZXI7XG4gICAgICB0aGlzLnNldFN0eWxlQXN5bmModGhpcy50b29sdGlwSW5kZXgsICdibG9jaycpO1xuICAgIH1cbiAgfVxuXG4gIHRvb2x0aXBDYW5Nb3ZlKG51bWJlcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHRpcEluZGV4ICsgbnVtYmVyID49IDAgJiYgdGhpcy50b29sdGlwSW5kZXggKyBudW1iZXIgPCB0aGlzLnRvb2x0aXBOdW1iZXI7XG4gIH1cblxuICBwcml2YXRlIHNldFN0eWxlQXN5bmMoaWR4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lciA9IHRoaXMucG9wdXBDb250ZW50LmdldChpZHgpO1xuICAgICAgaWYgKHRhcmdldENvbnRhaW5lcikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRhcmdldENvbnRhaW5lci5yb290Tm9kZXNbMF0uc3R5bGUuZGlzcGxheSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBnZXQgbWFwTGF5ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLm1hcFxuICAgICAgLmdldExheWVycygpXG4gICAgICAuZ2V0QXJyYXkoKVxuICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldCgndGl0bGUnKSAhPT0gJ2JhY2tncm91bmQnKTtcbiAgfVxuXG4gIGNoYW5nZVZpc2liaWxpdHkobGF5ZXI6IEJhc2VMYXllcikge1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnNpbmdsZUxheWVyKSB7XG4gICAgICB0aGlzLm1hcExheWVycy5mb3JFYWNoKChsYXllcikgPT4gbGF5ZXIuc2V0VmlzaWJsZShmYWxzZSkpO1xuICAgICAgbGF5ZXIuc2V0VmlzaWJsZSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5ZXIuc2V0VmlzaWJsZSghbGF5ZXIuZ2V0VmlzaWJsZSgpKTtcbiAgICB9XG4gICAgdGhpcy5tYXAudXBkYXRlU2l6ZSgpO1xuICB9XG5cbiAgY2hhbmdlU2luZ2xlTGF5ZXIoJGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnNpbmdsZUxheWVyID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlQXV0b0xheWVyKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5hdXRvbWF0aWNMYXllcnMgPSAkZXZlbnQ7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmF1dG9tYXRpY0xheWVycykge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuaWdub3JlQXV0b0xheWVyO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXllclZpc2libGVJZHgoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwTGF5ZXJzLm1hcCgobGF5ZXIsIGlkeCkgPT4gKGxheWVyLmdldFZpc2libGUoKSA/IGlkeCA6IDApKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnJlc2V0V21zRmVhdHVyZXMoKSk7XG4gIH1cbn1cbiIsIjxwcnktd2lkZ2V0LW1hcC1jc3M+PC9wcnktd2lkZ2V0LW1hcC1jc3M+XG48ZGl2IGNsYXNzPVwiby13aWRnZXQgby13aWRnZXQtLW1hcFwiPlxuICA8cHJ5LXdpZGdldC1oZWFkZXJcbiAgICBbZGF0YXNvdXJjZUlkc109XCIoZGF0YXNvdXJjZUlkcyQgfCBhc3luYykgPz8gW11cIlxuICAgICpuZ0lmPVwiZGlzcGxheUhlYWRlciQgfCBhc3luY1wiXG4gICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICBbbWFuaWZlc3RdPVwibWFuaWZlc3RcIlxuICAgIChtYW5pZmVzdE1vZGlmaWVkKT1cIm1hbmlmZXN0TW9kaWZpZWQuZW1pdCgkZXZlbnQpXCJcbiAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgICNoZWFkZXJcbiAgPlxuICAgIDxwcnktc2V0dGluZ3NcbiAgICAgIChzYXZlVHJpZ2dlcmVkKT1cImVtaXRNYW5pZmVzdCgpXCJcbiAgICAgIChjaGFuZ2VUaXRsZSk9XCJjaGFuZ2VXaWRnZXRUaXRsZSgkZXZlbnQpXCJcbiAgICAgIFtoZWFkZXJQcmVzZW50XT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICAgIFtoZWFkZXJdPVwiaGVhZGVyXCJcbiAgICAgIFtvcGVuJF09XCJvcGVuJFwiXG4gICAgICBjbGFzcz1cIm8tc2V0dGluZ3NcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9zdHlsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAuc3R5bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU3R5bGUoJGV2ZW50KVwiXG4gICAgICAgICAgW2l0ZW1zQXNPcHRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgW2l0ZW1zXT1cInN0eWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc3R5bGVcIlxuICAgICAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICBiaW5kVmFsdWU9XCJpZGVudGlmaWVyXCJcbiAgICAgICAgICBpZD1cIm1hcF9zdHlsZVwiXG4gICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIiAqbmdJZj1cIm9wdGlvbnNDb3B5LnN0eWxlID09PSBTVFlMRV9GUk9NX1VSTFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwic3R5bGVfVVJMXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zdHlsZVVybCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgaWQ9XCJzdHlsZV9VUkxcIlxuICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgKGlucHV0KT1cImNoYW5nZVN0eWxlVVJMKCRldmVudClcIlxuICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25zQ29weS5zdHlsZVVSTCA/PyAnJ1wiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VTaW5nbGVMYXllcigkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc2luZ2xlTGF5ZXIgPz8gZmFsc2VcIj5cbiAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zaW5nbGVMYXllcicgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VBdXRvTGF5ZXIoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmF1dG9tYXRpY0xheWVycyA/PyBmYWxzZVwiPlxuICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmF1dG9MYXllcicgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VGaXQoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmZpdCA/PyBmYWxzZVwiPlxuICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmZpdCcgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VBdHRyaWJ1dGlvbnMoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmF0dHJpYnV0aW9ucyA/PyBmYWxzZVwiPlxuICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmF0dHJpYnV0aW9ucycgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm8tc2V0dGluZ3NfX3BvcHVwX19jb250ZW50X19hY3Rpb25zIC1oYXMtc2VwYXJhdG9yXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRMYXllcigpXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IC1saW5rLWxpa2VcIj5cbiAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImxpYnJhcnlfYWRkXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmFkZExheWVyJyB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbGF5ZXIgb2Ygb3B0aW9uc0NvcHk/LmxheWVyczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkc19faGVhZFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImEtaDMgc2V0dGluZ3MtbGF5ZXItdGl0bGVfX3RpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllcicgfCBpMThuIDogeyBpbmRleDogaSArIDEgfSB9fTwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwiaW52ZXJ0TGF5ZXJzKGksIGkgLSAxKVwiICpuZ0lmPVwiaSA+IDBcIj5cbiAgICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS5hY3Rpb24ubW92ZVVwJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbnZlcnRMYXllcnMoaSwgaSArIDEpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpIDwgKG9wdGlvbnNDb3B5Py5sYXllcnM/Lmxlbmd0aCA/PyAwKSAtIDFcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImZsZWNoZV9iYXNcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLm1vdmVEb3duJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8tc2V0dGluZ3NfX3BvcHVwX19jb250ZW50X19maWVsZHNfX2NvbnRlbnRcIj5cbiAgICAgICAgICA8cHJ5LXJhbmdlXG4gICAgICAgICAgICBbbmdNb2RlbF09XCIobGF5ZXI/Lm9wYWNpdHkgPz8gMTAwKSArICcnXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZU9wYWNpdHkobGF5ZXIsICRldmVudClcIlxuICAgICAgICAgICAgbGFiZWxUcmFuc2xhdGU9XCJAcHJ5LndpZGdldC5tYXAub3BhY2l0eVwiXG4gICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgPjwvcHJ5LXJhbmdlPlxuXG4gICAgICAgICAgPGZpZWxkc2V0PlxuICAgICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllck9wdGlvbnMnIHwgaTE4biA6IHsgaW5kZXg6IGkgKyAxIH0gfX08L2xlZ2VuZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllclRpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclRpdGxlJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cIm1hcF9sYXllclRpdGxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VUaXRsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnRpdGxlID8/ICcnXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCIhWydnZW9zZXJ2ZXInLCAnYXV0byddLmluY2x1ZGVzKGxheWVyLnR5cGUpXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbGF5ZXJUeXBlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUudGl0bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTGF5ZXJUeXBlKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgIFtiaW5kRGF0YV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNBc09wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwibGF5ZXJUeXBlc1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsVHJhbnNsYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyLnR5cGVcIlxuICAgICAgICAgICAgICAgIGJhc2VUcmFuc2xhdGU9XCJAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLlwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIGlkPVwibWFwX2xheWVyVHlwZVwiXG4gICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyZWxhdGlvbicgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnd21zJyAmJlxuICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXRzJyAmJlxuICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdnZW9zZXJ2ZXInICYmXG4gICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2ZlYXR1cmVsYXllcicgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAndmVjdG9ydGlsZScgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAncmFzdGVydGlsZScgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnYXV0bydcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX2NsYXNzZXNcIj57eyAnQHByeS53aWRnZXQubWFwLmNsYXNzZXMnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2xhc3NlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zQXNPcHRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNsYXNzZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5jbGFzc2VzXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIGlkPVwibWFwX2NsYXNzZXNcIlxuICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGZpZWxkc2V0XG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyZWxhdGlvbicgJiZcbiAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXMnICYmXG4gICAgICAgICAgICBsYXllci50eXBlICE9PSAnd210cycgJiZcbiAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdnZW9zZXJ2ZXInICYmXG4gICAgICAgICAgICBsYXllci50eXBlICE9PSAnZmVhdHVyZWxheWVyJyAmJlxuICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3ZlY3RvcnRpbGUnICYmXG4gICAgICAgICAgICBsYXllci50eXBlICE9PSAncmFzdGVydGlsZSdcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sb2NhdGlvbkF0dHInIHwgaTE4biB9fTwvbGVnZW5kPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGxheWVyXG4gICAgICAgICAgICAgICAgfCBnZW9tZXRyeUZpZWxkc0ZvciA6IHsgcmVzdWx0U2V0OiByZXN1bHRTZXQkLCBjbGFzc2VzOiBsYXllci5jbGFzc2VzLCB0eXBlOiBsYXllci50eXBlIH1cbiAgICAgICAgICAgICAgICB8IGFzeW5jIGFzIGZpZWxkc1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgWydoZWF0bWFwJywgJ2J1YmJsZScsICdtYXJrZXInLCAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJywgJ211bHRpLWxpbmUnLCAnbXVsdGktcG9seWdvbiddLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICBsYXllci50eXBlXG4gICAgICAgICAgICAgICAgKSA+PSAwXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX2xvY2F0aW9uQXR0cmlidXRlX2JvdGhcIj57e1xuICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sb2NhdGlvbkF0dHJpYnV0ZS5ib3RoJyB8IGkxOG5cbiAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUxvY2F0aW9uQXR0cmlidXRlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNBc09wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sb2NhdGlvbkF0dHJpYnV0ZV9ib3RoXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1wcnktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiWydoZWF0bWFwJywgJ2J1YmJsZSddLmluZGV4T2YobGF5ZXIudHlwZSkgPj0gMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9pbnRlbnNpdHlBdHRyaWJ1dGVcIj57e1xuICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5pbnRlbnNpdHlBdHRyaWJ1dGUnIHwgaTE4blxuICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlSW50ZW5zaXR5QXR0cmlidXRlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNBc09wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXJIYXNJbnRlbnNpdHkobGF5ZXIpLmludGVuc2l0eUF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfaW50ZW5zaXR5QXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1wcnktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuXG4gICAgICAgIDxmaWVsZHNldFxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBsYXllci50eXBlID09PSAnd21zJyB8fFxuICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3dtdHMnIHx8XG4gICAgICAgICAgICBsYXllci50eXBlID09PSAnZmVhdHVyZWxheWVyJyB8fFxuICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3ZlY3RvcnRpbGUnIHx8XG4gICAgICAgICAgICBsYXllci50eXBlID09PSAncmFzdGVydGlsZSdcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC50aWxlJyB8IGkxOG4gfX08L2xlZ2VuZD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc191cmxcIj57eyAnQHByeS53aWRnZXQubWFwLndtcy51cmwnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX3VybFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlVXJsKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnVybFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ3dtcycgfHwgbGF5ZXIudHlwZSA9PT0gJ3dtdHMnXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc19wYXJhbUxheWVyXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMucGFyYW1MYXllcicgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfcGFyYW1MYXllclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1MYXllcigkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5wYXJhbUxheWVyXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX21hdHJpeFNldFwiPnt7ICdAcHJ5LndpZGdldC5tYXAud21zLm1hdHJpeFNldCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfbWF0cml4U2V0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VNYXRyaXhTZXQoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwibGF5ZXIubWF0cml4U2V0XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX3N0eWxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMuc3R5bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX3N0eWxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VQYXJhbVN0eWxlKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnN0eWxlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd21zJ1wiPlxuICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VQYXJhbVRpbGVkKCRldmVudCwgbGF5ZXIpXCIgW25nTW9kZWxdPVwibGF5ZXI/LnBhcmFtVGlsZWQgPz8gZmFsc2VcIj5cbiAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMucGFyYW1UaWxlZCcgfCBpMThuIH19XG4gICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICA8ZmllbGRzZXQgKm5nSWY9XCJsYXllci50eXBlID09PSAnbWFya2VyJ1wiPlxuICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAuY2x1c3RlcmluZycgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbHVzdGVyZWQobGF5ZXIsICRldmVudClcIiBbbmdNb2RlbF09XCJsYXllci5jbHVzdGVyZWRcIj5cbiAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5jbHVzdGVyZWQnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImxheWVyLmNsdXN0ZXJlZFwiPlxuICAgICAgICAgICAgPHByeS1yYW5nZVxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5jbHVzdGVyZWRcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbHVzdGVyRGlzdGFuY2UobGF5ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICBsYWJlbFRyYW5zbGF0ZT1cIkBwcnkud2lkZ2V0Lm1hcC5jbHVzdGVyRGlzdGFuY2VcIlxuICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgbWF4PVwiNTAwXCJcbiAgICAgICAgICAgID48L3ByeS1yYW5nZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJvcHRpb25zQ29weS5hdHRyaWJ1dGlvbnNcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiYXR0cmlidXRpb25cIj57eyAnQHByeS53aWRnZXQubWFwLmF0dHJpYnV0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgaWQ9XCJhdHRyaWJ1dGlvblwiXG4gICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlQXR0cmlidXRpb24oJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLmF0dHJpYnV0aW9uID8gbGF5ZXIuYXR0cmlidXRpb24gOiAnJ1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVMYXllcihpLCBsYXllcilcIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCAtbGluay1saWtlXCJcbiAgICAgICAgICAqbmdJZj1cImxheWVyLnR5cGUgIT09ICdnZW9zZXJ2ZXInXCJcbiAgICAgICAgICBkYXRhLWZ1bmM9XCJkZWxldGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJkZWxldGVcIiBbd2lkdGhdPVwiMTlcIiBbaGVpZ2h0XT1cIjE5XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAnQHByeS53aWRnZXQubWFwLmRlbGV0ZUxheWVyJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9wcnktc2V0dGluZ3M+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG5cbiAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwIC1zZWxlY3Rpb24tY2hvaWNlXCIgW3N0eWxlLnRyYW5zZm9ybV09XCJib3R0b21MZWZ0JCB8IGFzeW5jXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGJhc2ljQWN0aW9ucyQgfCBhc3luY1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCJcbiAgICAgICAgKGNsaWNrKT1cImludGVyYWN0aW9uTWFuYWdlci5zZWxlY3Rpb25JbnRlcmFjdGlvbi5jaGFuZ2VTZWxlY3Rpb24oYWN0aW9uKVwiXG4gICAgICAgIFtjbGFzcy4tc2VsZWN0ZWRdPVwiaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkludGVyYWN0aW9uLnNlbGVjdGlvblR5cGUgPT09IGFjdGlvblwiXG4gICAgICAgIFtwcnlUb29sdGlwXT1cImluZm9Ub29sdGlwQWN0aW9uXCJcbiAgICAgICAgcHJ5VG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImluZm9Ub29sdGlwQWN0aW9uXCJcbiAgICAgICAgW3ByeVRvb2x0aXBDb250ZXh0XT1cInsgYWN0aW9uOiBhY3Rpb24gfVwiXG4gICAgICA+XG4gICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCJhY3Rpb25cIj48L3ByeS1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC4nICsgYWN0aW9uIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgaWQ9XCJleHBvcnRfY2FyZFwiXG4gICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgYXJpYS1jb250cm9scz1cImV4cG9ydF90eXBlXCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgIFtwcnlUb29sdGlwXT1cImluZm9Ub29sdGlwRG93blwiXG4gICAgICBwcnlUb29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYS1kZXNjcmliZWRieT1cImluZm9Ub29sdGlwRG93bl93aWRnZXRNYXBcIlxuICAgICAgKm5nSWY9XCIoYWN0aW9ucyQgfCBhc3luYyk/LmluY2x1ZGVzKCdleHBvcnQnKVwiXG4gICAgPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmaWxlX2Rvd25sb2FkXCIgKGNsaWNrKT1cImV4cG9ydCgpXCI+PC9wcnktaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmV4cG9ydCcgfCBpMThuIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJvbC1jb250cm9sIG0tbGF5ZXItc3dpdGNoZXJcIlxuICAgICpuZ0lmPVwiKChsYXllcnMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cImxheWVyc1RvcCQgfCBhc3luY1wiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm0tbGF5ZXItc3dpdGNoZXJfX3RvZ2dsZVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTGF5ZXJzV2luZG93KClcIlxuICAgICAgW3RpdGxlXT1cIidAcHJ5LndpZGdldC5tYXAuc2VsZWN0TGF5ZXJzJyB8IGkxOG5cIlxuICAgID5cbiAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibGF5ZXJzXCIgW3dpZHRoXT1cIjIyXCIgW2hlaWdodF09XCIyMlwiPjwvcHJ5LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGF5ZXIgb2YgbWFwTGF5ZXJzOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm0tbGF5ZXItc3dpdGNoZXJfX3RpdGxlXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxheWVyc1RhYk9wZW5cIj5cbiAgICAgICAge3sgbGF5ZXIuZ2V0KCd0aXRsZScpIH19XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKG9wdGlvbnMkIHwgYXN5bmMpPy5zaW5nbGVMYXllcjsgZWxzZSBzaW5nbGVMYXllclwiPlxuICAgICAgICAgIDxwcnktY2hlY2tib3ggW25nTW9kZWxdPVwibGF5ZXIuZ2V0VmlzaWJsZSgpXCIgKGNoYW5nZSk9XCJjaGFuZ2VWaXNpYmlsaXR5KGxheWVyKVwiPjwvcHJ5LWNoZWNrYm94PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVMYXllcj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBuYW1lPVwibGF5ZXJcIlxuICAgICAgICAgICAgW2lkXT1cIidyYWRpby1sYXllci0nICsgbGF5ZXIuZ2V0KCd0aXRsZScpLnNwbGl0KCcgJylbMF1cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXJWaXNpYmxlSWR4XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpbmRleFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVZpc2liaWxpdHkobGF5ZXIpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm9sLWNvbnRyb2wgbS1sYXllci1sZWdlbmRcIlxuICAgICpuZ0lmPVwiKChsZWdlbmRMYXllcnMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cImxlZ2VuZFRvcCQgfCBhc3luY1wiXG4gID5cbiAgICA8YnV0dG9uIGNsYXNzPVwibS1sYXllci1sZWdlbmRfX3RvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVMZWdlbmRXaW5kb3coKVwiIFt0aXRsZV09XCInQHByeS53aWRnZXQubWFwLmxlZ2VuZHMnIHwgaTE4blwiPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJsZWdlbmRcIiBbd2lkdGhdPVwiMjJcIiBbaGVpZ2h0XT1cIjIyXCI+PC9wcnktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBnZW9MYXllciBvZiBsZWdlbmRMYXllcnMkIHwgYXN5bmM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1sYXllci1sZWdlbmRfX3RpdGxlXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW5cIj5cbiAgICAgICAge3sgZ2VvTGF5ZXIudGl0bGUgfX1cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTGF5ZXJSZW5kZXJlZChnZW9MYXllcilcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibS1sYXllci1sZWdlbmRfX3RvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVMZWdlbmQoaW5kZXgpXCI+XG4gICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgW2ljb25TdmddPVwibGVnZW5kVGFiID09PSBpbmRleCA/ICdjaGV2cm9uX3RvcCcgOiAnY2hldnJvbl9ib3R0b20nXCJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cIjIyXCJcbiAgICAgICAgICAgICAgW2hlaWdodF09XCIyMlwiXG4gICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiPlxuICAgICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCInY2xvc2UnXCIgW3dpZHRoXT1cIjIyXCIgW2hlaWdodF09XCIyMlwiPjwvcHJ5LWljb24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibS1sYXllci1sZWdlbmRfX2ltYWdlXCJcbiAgICAgICAgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW4gfHwgbGVnZW5kVGFiICE9PSBpbmRleCB8fCAhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiXG4gICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cImxlZ2VuZEhlaWdodCQgfCBhc3luY1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZW9MYXllciB8IGxlZ2VuZFVybCA6IHsgY2FwYWJpbGl0aWVzOiAod21zQ2FwYWJpbGl0aWVzJCB8IGFzeW5jKSB9IGFzIHVybFwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgIFthbHRdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmQnIHwgaTE4biA6IHsgbGF5ZXI6IGdlb0xheWVyLnRpdGxlIH1cIlxuICAgICAgICAgICAgKGVycm9yKT1cImltYWdlTm90UHJvdmlkZWRbaW5kZXhdID0gdHJ1ZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGdlb0xheWVyIHwgbGVnZW5kVXJsIDogeyBjYXBhYmlsaXRpZXM6ICh3bXNDYXBhYmlsaXRpZXMkIHwgYXN5bmMpIH0pXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtLWxheWVyLWxlZ2VuZF9fZXJyb3JcIj57eyAnQHByeS53aWRnZXQubWFwLmxlZ2VuZE5vdFByb3ZpZGVkJyB8IGkxOG4gfX08L3A+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHQkIHwgYXN5bmNcIiBjbGFzcz1cIm8tbWFwLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tYXBcIj5cbiAgICAgIDxkaXYgI21hcFJlZiBpZD1cIm1hcFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2luZm9Ub29sdGlwQWN0aW9uIGxldC1hY3Rpb249XCJhY3Rpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwibS10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIiBpZD1cImluZm9Ub29sdGlwQWN0aW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPnt7ICdAcHJ5LndpZGdldC5tYXAuJyArIGFjdGlvbiB8IGkxOG4gfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICNpbmZvVG9vbHRpcERvd24+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCIgaWQ9XCJpbmZvVG9vbHRpcERvd25fd2lkZ2V0TWFwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPnt7ICdAcHJ5LndpZGdldC5tYXAuZXhwb3J0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiAjcG9wdXAgY2xhc3M9XCJtLXRvb2x0aXAgbS10b29sdGlwLS1wb3B1cFwiIFtoaWRkZW5dPVwidHJ1ZVwiIHJvbGU9XCJ0b29sdGlwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcC0tcG9wdXBfX2hlYWRlclwiPlxuICAgICAgPHA+e3sgdGhpcy50b29sdGlwSW5kZXggKyAxIH19IC8ge3sgdGhpcy50b29sdGlwTnVtYmVyIH19PC9wPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9vbHRpcE1vdmUoLTEpXCIgW2Rpc2FibGVkXT1cIiF0b29sdGlwQ2FuTW92ZSgtMSlcIj5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJhcnJvd19iYWNrXCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9vbHRpcE1vdmUoMSlcIiBbZGlzYWJsZWRdPVwiIXRvb2x0aXBDYW5Nb3ZlKDEpXCI+XG4gICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiYXJyb3dfcmlnaHRcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcC0tcG9wdXBfX2NvbnRhaW5lclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAjcG9wdXBDb250ZW50PjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgICNhZGRyZXNzXG4gICAgY2xhc3M9XCJtLXRvb2x0aXAgbS10b29sdGlwLS1hZGRyZXNzIHRvb2x0aXAtYWRkcmVzc1wiXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiJ25vbmUnXCJcbiAgICAoY2xpY2spPVwiaGlkZUFkZHJlc3MoKVwiXG4gID48L2Rpdj5cbjwvZGl2PlxuIl19
|
|
827
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1tYXAvY29tcG9uZW50L3dpZGdldC1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtbWFwL2NvbXBvbmVudC93aWRnZXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCxTQUFTLEVBS1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUtMLGNBQWMsRUFDZCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUVsQixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBRW5CLGNBQWMsRUFDZCxXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLFNBQVMsRUFlVCxjQUFjLEVBR2QsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFXLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEQsT0FBTyxFQUFTLElBQUksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUd2QyxPQUFPLGVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1B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QUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRVEsV0FBVztRQUNsQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7OEdBaGpDVSxrQkFBa0I7a0dBQWxCLGtCQUFrQixtVEFJTSxnQkFBZ0IsbUhBQ1YsV0FBVyx5SUM5R3RELG0wbEJBcWRBOzsyRkQ1V2Esa0JBQWtCO2tCQUo5QixTQUFTOytCQUNFLGdCQUFnQjttV0FLTCxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVE7Z0JBQ0MsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPO2dCQUNxQyxZQUFZO3NCQUFsRSxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRyxrQkFBa0I7c0JBQXpFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNoQyxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5IGFzIGNka092ZXJsYXksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBCYXNlVG9vbHRpcENvbXBvbmVudCxcbiAgQmFzZVdpZGdldE1hcExheWVyT3B0aW9ucyxcbiAgQ2xhc3MsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBDb25maWdTZWxlY3RvcnMsXG4gIERhc2hib2FyZEFjdGlvbnMsXG4gIERhc2hib2FyZFNlbGVjdG9ycyxcbiAgRGF0YXNldCxcbiAgRGF0YVNvdXJjZVNlbGVjdG9ycyxcbiAgRGF0YVdpZGdldENvbXBvbmVudCxcbiAgRmllbGQsXG4gIEZpZWxkU2VsZWN0b3JzLFxuICBHZW9NZXRhZGF0YSxcbiAgR2VvbWV0cmljRmllbGRUeXBlcyxcbiAgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2UsXG4gIEl0ZW1VdGlscyxcbiAgTWFwQXV0b0xheWVyT3B0aW9ucyxcbiAgTWFwRmVhdHVyZUxheWVyT3B0aW9ucyxcbiAgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zLFxuICBNYXBSYXN0ZXJUaWxlTGF5ZXJPcHRpb25zLFxuICBNYXBWZWN0b3JUaWxlTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldExheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRPcHRpb25zLFxuICBNYXBXTVNMYXllckxheWVyT3B0aW9ucyxcbiAgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zLFxuICBQcnlJMThuU2VydmljZSxcbiAgUHJ5U25hY2tiYXJTZXJ2aWNlLFxuICBSZXN1bHRzZXRVdGlscyxcbiAgU3ltYm9sU2VydmljZSxcbiAgVG9vbHRpcEZhY3RvcnlTZXJ2aWNlLFxuICBUb29sdGlwTW9kZSxcbiAgV0lER0VUX0hFQURFUl9IRUlHSFQsXG4gIHdpZGdldE1hcENvbmZpZ1xufSBmcm9tICdAcHJvdm9seS9kYXNoYm9hcmQnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbC9lczYnO1xuaW1wb3J0IHsgRmVhdHVyZSwgTWFwLCBPdmVybGF5LCBWaWV3IH0gZnJvbSAnb2wnO1xuaW1wb3J0IHsgYXBwbHlCYWNrZ3JvdW5kLCBhcHBseVN0eWxlIH0gZnJvbSAnb2wtbWFwYm94LXN0eWxlJztcbmltcG9ydCB7IGJvdW5kaW5nRXh0ZW50LCBjcmVhdGVFbXB0eSB9IGZyb20gJ29sL2V4dGVudCc7XG5pbXBvcnQgeyBDaXJjbGUsIEdlb21ldHJ5LCBQb2ludCB9IGZyb20gJ29sL2dlb20nO1xuaW1wb3J0IHsgTGF5ZXIsIFRpbGUgfSBmcm9tICdvbC9sYXllcic7XG5pbXBvcnQgQmFzZUxheWVyIGZyb20gJ29sL2xheWVyL0Jhc2UnO1xuaW1wb3J0IFZlY3RvckxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3Rvcic7XG5pbXBvcnQgVmVjdG9yVGlsZUxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3RvclRpbGUnO1xuaW1wb3J0IHsgUGl4ZWwgfSBmcm9tICdvbC9waXhlbCc7XG5pbXBvcnQgeyBmcm9tTG9uTGF0LCBnZXQgYXMgZ2V0UHJvamVjdGlvbiwgdHJhbnNmb3JtIH0gZnJvbSAnb2wvcHJvaic7XG5cbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnb2wvcHJvai9wcm9qNCc7XG5pbXBvcnQgeyBUaWxlV01TIH0gZnJvbSAnb2wvc291cmNlJztcbmltcG9ydCBWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJ29sL3N0eWxlJztcbmltcG9ydCBwcm9qNCBmcm9tICdwcm9qNCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb20sXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzdGFydFdpdGhcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi1tYW5hZ2VyLmNsYXNzJztcbmltcG9ydCB7IENxbFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvY3FsLXV0aWxzLmNsYXNzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfTUFQX0NFTlRFUixcbiAgREVGQVVMVF9aT09NX01BWCxcbiAgREVGQVVMVF9aT09NX01JTixcbiAgREVGQVVMVF9aT09NX1NUQVJULFxuICBleHBvcnRNYXBBc0ltYWdlLFxuICBnZXRMaW5rRmVhdHVyZSxcbiAgZ2V0TWFwQXNQbmcsXG4gIHBvcHVsYXRlSW50ZW5zaXR5QXR0cmlidXRlLFxuICBwb3B1bGF0ZUxvY2F0aW9uQXR0cmlidXRlXG59IGZyb20gJy4uL3V0aWxzL3dpZGdldC1tYXAudXRpbHMnO1xuaW1wb3J0IHsgWE1MVXRpbHMgfSBmcm9tICcuLi91dGlscy94bWwtdXRpbHMuY2xhc3MnO1xuaW1wb3J0IHsgV2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXQtbWFwLWxheWVyLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgVE9PTFRJUF9QQURESU5HID0gMTU7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1tYXAuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldE1hcENvbXBvbmVudCBleHRlbmRzIERhdGFXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBtYXBVcmwkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIEBWaWV3Q2hpbGQoJ21hcFJlZicpIG1hcFJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3BvcHVwJykgcG9wdXAhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwb3B1cENvbnRlbnQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgcG9wdXBDb250ZW50ITogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZXhwb3J0VHlwZVRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBleHBvcnRUeXBlVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdhZGRyZXNzJykgYWRkcmVzcyE6IEVsZW1lbnRSZWY7XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPE1hcFdpZGdldE9wdGlvbnM+O1xuICBsYXllclR5cGVzID0gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuaW1wbGVtZW50YXRpb25MaXN0XG4gICAgLmZpbHRlcigodHlwZSkgPT4gdHlwZSAhPT0gJ2F1dG8nKVxuICAgIC5zb3J0KChhLCBiKSA9PlxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgICAgIC5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLicgKyBhKVxuICAgICAgICAubG9jYWxlQ29tcGFyZSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS4nICsgYikpXG4gICAgKTtcbiAgb3B0aW9uc0NvcHk6IE1hcFdpZGdldE9wdGlvbnMgPSB7fSBhcyBNYXBXaWRnZXRPcHRpb25zO1xuICBjbGFzc2VzJDogT2JzZXJ2YWJsZTxDbGFzc1tdPjtcbiAgZmllbGRzJDogT2JzZXJ2YWJsZTxGaWVsZFtdPjtcbiAgc2VsZWN0ZWRJZHMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgYm90dG9tTGVmdCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgbGF5ZXJzJCE6IE9ic2VydmFibGU8QmFzZUxheWVyW10+O1xuICBtYXAhOiBNYXA7XG4gIGFkZGl0aW9uYWxMYXllcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U8R2VvbWV0cnk+PltdPihbXSk7XG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG4gIHN0eWxlcyQ6IE9ic2VydmFibGU8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdPjtcbiAgV0lER0VUX0hFQURFUl9IRUlHSFQgPSBXSURHRVRfSEVBREVSX0hFSUdIVDtcbiAgaSA9IDA7XG4gIGl0ZW1TdHlsZXMkITogT2JzZXJ2YWJsZTx7IFtpZDogc3RyaW5nXTogeyBjbGFzc2ljOiBTdHlsZTsgYm9yZGVyZWQ6IFN0eWxlIH0gfT47XG4gIGhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgYWN0aW9ucyQgPSB3aWRnZXRNYXBDb25maWcuYWN0aW9ucyQ7XG4gIHByaXZhdGUgd21zRmVhdHVyZXMkOiBPYnNlcnZhYmxlPGFueVtdPjtcbiAgY2xhc3NpY0ZlYXR1cmVzJDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcbiAgZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnMkOiBPYnNlcnZhYmxlPE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1tdPjtcbiAgbGVnZW5kVGFiT3BlbiA9IGZhbHNlO1xuICBsYXllcnNUYWJPcGVuID0gZmFsc2U7XG4gIGxlZ2VuZFRhYiA9IDA7XG4gIGxlZ2VuZExheWVycyQhOiBPYnNlcnZhYmxlPChNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMgfCBNYXBXTVNMYXllckxheWVyT3B0aW9ucylbXT47XG4gIGxlZ2VuZFRvcCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgbGF5ZXJzVG9wJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBsZWdlbmRIZWlnaHQkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGltYWdlTm90UHJvdmlkZWQ6IGJvb2xlYW5bXSA9IFtdO1xuICBiYXNpY0FjdGlvbnMkOiBPYnNlcnZhYmxlPCgnY2xpY2snIHwgJ2xhc3NvJyB8ICdyZWN0YW5nbGUnIHwgJ3pvb20nIHwgJ21vdmUnIHwgJ2V4cG9ydCcgfCAndXBsb2FkJylbXT47XG4gIHpvb21BbmRDZW50ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHpvb20/OiB7IHN0YXJ0OiBudW1iZXI7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9OyBjZW50ZXI/OiBudW1iZXJbXSB9Pih7fSk7XG4gIGZpdE9wdGlvbiQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBtYXBTdHlsZVVybCQhOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+O1xuICBpbnRlcmFjdGlvbk1hbmFnZXI6IEludGVyYWN0aW9uTWFuYWdlciA9IG5ldyBJbnRlcmFjdGlvbk1hbmFnZXIoKTtcbiAgbWFwU3R5bGVMYXllciQhOiBPYnNlcnZhYmxlPFZlY3RvclRpbGVMYXllcltdPjtcbiAgdG9vbHRpcEluZGV4ID0gMDtcbiAgdG9vbHRpcE51bWJlciA9IDA7XG4gIFNUWUxFX0ZST01fVVJMID0gJ191cmwnO1xuICBOT19TVFlMRSA9ICdub25lJztcbiAgd21zQ2FwYWJpbGl0aWVzJDogT2JzZXJ2YWJsZTx7IFtwOiBzdHJpbmddOiBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZSB8IG51bGwgfSB8IHVuZGVmaW5lZD47XG4gIGF1dG9EYXRhc2V0TGF5ZXJzJDogT2JzZXJ2YWJsZTxNYXBBdXRvTGF5ZXJPcHRpb25zW10+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0b3JlOiBTdG9yZTxhbnk+LFxuICAgIHByaXZhdGUgc25hY2tCYXI6IFByeVNuYWNrYmFyU2VydmljZSxcbiAgICBwdWJsaWMgdHJhbnNsYXRlU2VydmljZTogUHJ5STE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b29sdGlwRmFjdG9yeVNlcnZpY2U6IFRvb2x0aXBGYWN0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXk6IGNka092ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgc3ltYm9sU2VydmljZTogU3ltYm9sU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHdpZGdldE1hcExheWVyU2VydmljZTogV2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLFxuICAgIGVsOiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKHN0b3JlLCBlbCk7XG5cbiAgICB0aGlzLmJhc2ljQWN0aW9ucyQgPSB0aGlzLmFjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbiAhPT0gJ2V4cG9ydCcgJiYgYWN0aW9uICE9PSAndXBsb2FkJykpXG4gICAgKTtcblxuICAgIHRoaXMuY2xhc3NlcyQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpXG4gICAgICAucGlwZShtYXAoKGNsYXNzZXMpID0+IGNsYXNzZXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSkpKTtcbiAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChGaWVsZFNlbGVjdG9ycy5maWVsZHMpO1xuICAgIHRoaXMuc3R5bGVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KENvbmZpZ1NlbGVjdG9ycy5tYXBTdHlsZXMpLnBpcGUoXG4gICAgICBtYXAoKHN0eWxlcykgPT5cbiAgICAgICAgc3R5bGVzLmNvbmNhdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLk5PX1NUWUxFLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubm9TdHlsZScpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLlNUWUxFX0ZST01fVVJMLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc3R5bGVGcm9tVXJsJylcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0ZWRJZHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnNlbGVjdGVkSXRlbUlkcyk7XG5cbiAgICB0aGlzLmdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy51c2VkRGF0YXNvdXJjZXMkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICAgICksXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMuZ2VvU2VydmVyVXJsKS5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKVxuICAgIF0pLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgIG1hcCgoW2RhdGFTb3VyY2VzLCBnZW9TZXJ2ZXJVcmxdKSA9PiB7XG4gICAgICAgIGlmICghZ2VvU2VydmVyVXJsKSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBkYXRhU291cmNlc1xuICAgICAgICAgIC5maWx0ZXIoKGRzKSA9PiBkcy5tZXRhZGF0YT8uZmluZCgobSkgPT4gbS5tZXRhZGF0YURlZi5uYW1lID09PSBHZW9NZXRhZGF0YS5OQU1FU1BBQ0UpICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgLm1hcCgoZHMpID0+IHtcbiAgICAgICAgICAgIGRzID0gZHMgYXMgdW5rbm93biBhcyBEYXRhc2V0O1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBkcy5tZXRhZGF0YT8uZm9yRWFjaCgobSkgPT4gKG1ldGFkYXRhc1ttLm1ldGFkYXRhRGVmLm5hbWVdID0gbS52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdHlwZTogJ2dlb3NlcnZlcicsXG4gICAgICAgICAgICAgIHVybDogZ2VvU2VydmVyVXJsICsgJy8nICsgbWV0YWRhdGFzW0dlb01ldGFkYXRhLk5BTUVTUEFDRV0gKyAnL3dtcz9TRVJWSUNFPVdNUyZWRVJTSU9OPTEuMy4wJyxcbiAgICAgICAgICAgICAgcGFyYW1UaWxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogcGFyc2VJbnQobWV0YWRhdGFzW0dlb01ldGFkYXRhLk9QQUNJVFldID8/IDEwMCwgMTApLFxuICAgICAgICAgICAgICBvQ2xhc3M6IGRzLm9DbGFzcyxcbiAgICAgICAgICAgICAga2V5OiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuTkFNRVNQQUNFXSArICc6JyArIG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5LRVldLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdLFxuICAgICAgICAgICAgICBwYXJhbUxheWVyOiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuS0VZXSxcbiAgICAgICAgICAgICAgbmFtZTogZHMubmFtZSxcbiAgICAgICAgICAgICAgZGF0YXNvdXJjZUlkOiBkcy5pZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKGxheWVyKSA9PiBsYXllciBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMpO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpLFxuICAgICAgc3RhcnRXaXRoKFtdKVxuICAgICk7XG5cbiAgICB0aGlzLmF1dG9EYXRhc2V0TGF5ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuZmllbGRzJCxcbiAgICAgIHRoaXMudXNlZERhdGFzb3VyY2VzJC5waXBlKFxuICAgICAgICBzdGFydFdpdGgoW10pLFxuICAgICAgICBtYXAoKGRhdGFzb3VyY2VzKSA9PiBkYXRhc291cmNlcy5maWx0ZXIoKGRzKSA9PiBkcy5zb3VyY2VUeXBlID09PSAnZGF0YXNldCcpIGFzIERhdGFzZXRbXSlcbiAgICAgIClcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoW2NsYXNzZXMsIGZpZWxkcywgZGF0YVNldHNdKSA9PlxuICAgICAgICAgIGRhdGFTZXRzXG4gICAgICAgICAgICAubWFwKChkcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IGNsYXNzZXMuZmluZCgoY2xhenopID0+IGNsYXp6LmlkID09PSBkcy5vQ2xhc3MpO1xuICAgICAgICAgICAgICBjb25zdCBnZW9BdHRyaWJ1dGVzID0gKFxuICAgICAgICAgICAgICAgIG1vZGVsPy5hdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gKHsgYXR0ciwgZmllbGQ6IGZpZWxkcy5maW5kKChmKSA9PiBhdHRyLmZpZWxkID09PSBmLmlkKSB9KSkgPz8gW11cbiAgICAgICAgICAgICAgKS5maWx0ZXIoKHsgYXR0ciwgZmllbGQgfSkgPT4gISFmaWVsZCAmJiBHZW9tZXRyaWNGaWVsZFR5cGVzLmluY2x1ZGVzKGZpZWxkLnR5cGUpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdlb0F0dHJpYnV0ZXMubWFwKFxuICAgICAgICAgICAgICAgIChnZW8pID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHtkcy5uYW1lfSAtICR7Z2VvLmF0dHIubmFtZX0gKCR7Z2VvLmZpZWxkIS50eXBlfSlgLFxuICAgICAgICAgICAgICAgICAgICBvQ2xhc3M6IGRzLm9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAga2V5OiBkcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgc3ViVHlwZTogZ2VvLmZpZWxkIS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbZHMub0NsYXNzXSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlOiBnZW8uYXR0ci5uYW1lXG4gICAgICAgICAgICAgICAgICB9IGFzIE1hcEF1dG9MYXllck9wdGlvbnMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZsYXQoKSBhcyBNYXBBdXRvTGF5ZXJPcHRpb25zW11cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMubWFuaWZlc3QkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgobWFuaWZlc3QpID0+XG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICgobWFuaWZlc3Qub3B0aW9ucyA/PyB7IGxheWVyczogW10gfSkgYXMgTWFwV2lkZ2V0T3B0aW9ucykubGF5ZXJzPy5maWx0ZXIoKGxheWVyKSA9PlxuICAgICAgICAgICAgICAgIFsnd21zJ10uaW5jbHVkZXMobGF5ZXIudHlwZSlcbiAgICAgICAgICAgICAgKSBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9uc1tdXG4gICAgICAgICAgICApLm1hcCgobGF5ZXIpID0+IGxheWVyLnVybClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodXJscykgPT4gdXJscy5mb3JFYWNoKCh1cmwpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5nZXRDYXBhYmlsaXR5KHsgdXJsIH0pKSkpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5nZW9TZXJ2ZXJMYXllckRlc2NyaXB0aW9ucyRcbiAgICAgICAgLnBpcGUobWFwKChsYXllcnMpID0+IGxheWVycy5tYXAoKGxheWVyKSA9PiBsYXllci51cmwpKSlcbiAgICAgICAgLnN1YnNjcmliZSgodXJscykgPT4gdXJscy5mb3JFYWNoKCh1cmwpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5nZXRDYXBhYmlsaXR5KHsgdXJsIH0pKSkpXG4gICAgKTtcblxuICAgIHRoaXMud21zQ2FwYWJpbGl0aWVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5jYXBhYmlsaXRpZXMpO1xuXG4gICAgdGhpcy5vcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tYW5pZmVzdCQsXG4gICAgICB0aGlzLnJlc3VsdFNldCQsXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5maWVsZHMkLFxuICAgICAgdGhpcy5zdHlsZXMkLFxuICAgICAgdGhpcy5nZW9TZXJ2ZXJMYXllckRlc2NyaXB0aW9ucyQsXG4gICAgICB0aGlzLndtc0NhcGFiaWxpdGllcyQsXG4gICAgICB0aGlzLmF1dG9EYXRhc2V0TGF5ZXJzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFttYW5pZmVzdCwgcmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMsIG1hcFN0eWxlcywgZ2VvTGF5ZXJzLCBjYXBhYmlsaXRpZXMsIGF1dG9EYXRhc2V0TGF5ZXJzXSkgPT4ge1xuICAgICAgICAvLyBhdXRvIGRldGVybWluZSBsYXllcnMgcGFyYW1ldGVycyB0byBwcm92aWRlIGEgd29ya2luZyB2aWV3XG4gICAgICAgIGNvbnN0IGF1dG9PcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5vcHRpb25zKSkgYXMgTWFwV2lkZ2V0T3B0aW9ucztcbiAgICAgICAgaWYgKCFhdXRvT3B0aW9ucy50b29sdGlwTW9kZSkge1xuICAgICAgICAgIGF1dG9PcHRpb25zLnRvb2x0aXBNb2RlID0gVG9vbHRpcE1vZGUuQ0xJQ0s7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMgPSBbXG4gICAgICAgICAgLi4uKGF1dG9PcHRpb25zLmxheWVycyA/PyBbXSkuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIudHlwZSAhPT0gJ2F1dG8nKSxcbiAgICAgICAgICAuLi4oYXV0b09wdGlvbnMuYXV0b21hdGljTGF5ZXJzXG4gICAgICAgICAgICA/IGF1dG9EYXRhc2V0TGF5ZXJzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIChsYXllcikgPT5cbiAgICAgICAgICAgICAgICAgICAgIWF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllciB8fFxuICAgICAgICAgICAgICAgICAgICAhYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyLmluY2x1ZGVzKGxheWVyLmtleSArICctJyArIGxheWVyLnN1YlR5cGUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5tYXAoKGxheWVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgLi4ubGF5ZXIsXG4gICAgICAgICAgICAgICAgICAuLi4oKGF1dG9PcHRpb25zLmxheWVycyA/PyBbXSkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAocHJldkxheWVyKSA9PiBwcmV2TGF5ZXIua2V5ID09PSBsYXllci5rZXkgJiYgcHJldkxheWVyLmF0dHJpYnV0ZSA9PT0gbGF5ZXIuYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICApID8/IHt9KVxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiBbXSlcbiAgICAgICAgXTtcblxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnM/LmZvckVhY2goKGxheWVyLCBpKSA9PiB7XG4gICAgICAgICAgcG9wdWxhdGVMb2NhdGlvbkF0dHJpYnV0ZShsYXllciwgcmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMpO1xuICAgICAgICAgIHBvcHVsYXRlSW50ZW5zaXR5QXR0cmlidXRlKGxheWVyLCByZXN1bHRTZXQsIGNsYXNzZXMsIGZpZWxkcyk7XG4gICAgICAgICAgaWYgKGF1dG9PcHRpb25zLmF0dHJpYnV0aW9ucykge1xuICAgICAgICAgICAgbGF5ZXIuYXR0cmlidXRpb24gPSBsYXllci5hdHRyaWJ1dGlvbiA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFjdHVhbExheWVyS2V5cyA9IChhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pXG4gICAgICAgICAgLm1hcCgobGF5ZXIpID0+IChsYXllciBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMpLmtleSA/PyBudWxsKVxuICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gISFrZXkpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgcHJldmlvdXMgbGF5ZXJzLCB3aXRob3V0IGdlb3NlcnZlciBsYXllcnMgdGhhdCBhcmUgbm90IHJlcXVlc3RlZCBhbnltb3JlLCB0aGVuIGFkZCBuZXcgZ2Vvc2VydmVyIGxheWVycyAocG90ZW50aWFsbHkgd2l0aCBhIHByZWNvbmZpZyBmcm9tIG1hbmlmZXN0KS5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gW1xuICAgICAgICAgIC4uLihhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pLm1hcCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdlb0xheWVyID0gZ2VvTGF5ZXJzLmZpbmQoKGdlb0xheWVyKSA9PiBsYXllci5rZXkgPT09IGdlb0xheWVyLmtleSkgPz8gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBsYXllci50eXBlID09PSAnZ2Vvc2VydmVyJ1xuICAgICAgICAgICAgICA/IGdlb0xheWVyXG4gICAgICAgICAgICAgICAgPyB7IC4uLmdlb0xheWVyLCAuLi5sYXllciB9XG4gICAgICAgICAgICAgICAgOiAobnVsbCBhcyB1bmtub3duIGFzIE1hcFdpZGdldExheWVyT3B0aW9ucylcbiAgICAgICAgICAgICAgOiB7IC4uLmxheWVyIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLi4uZ2VvTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+ICFhY3R1YWxMYXllcktleXMuaW5jbHVkZXMobGF5ZXIua2V5KSlcbiAgICAgICAgXS5maWx0ZXIoKGxheWVyKSA9PiAhIWxheWVyKTtcblxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHRMYXllclRpdGxlKGxheWVyLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgISFtYXBTdHlsZXMgJiZcbiAgICAgICAgICBtYXBTdHlsZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICghYXV0b09wdGlvbnMuc3R5bGUgfHwgIW1hcFN0eWxlcy5tYXAoKHN0eWxlKSA9PiBzdHlsZS5pZGVudGlmaWVyKS5pbmNsdWRlcyhhdXRvT3B0aW9ucy5zdHlsZSkpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGxpZ2h0U3R5bGVzID0gbWFwU3R5bGVzLmZpbHRlcigoc3R5bGUpID0+ICEoc3R5bGUuaWRlbnRpZmllciA/PyAnLScpLmluY2x1ZGVzKCdkYXJrJykpO1xuICAgICAgICAgIGF1dG9PcHRpb25zLnN0eWxlID0gbGlnaHRTdHlsZXMubGVuZ3RoID4gMCA/IGxpZ2h0U3R5bGVzWzBdLmlkZW50aWZpZXIgOiBtYXBTdHlsZXNbMF0uaWRlbnRpZmllcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIpIHtcbiAgICAgICAgICBjb25zdCBiYXNlID0gYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIGZyb20gaWdub3JlQXV0b0xheWVycywgdmFsdWVzIHRoYXQgYXJlIG5vdCBuZWNlc3NhcnlcbiAgICAgICAgICBjb25zdCBwb3NzaWJsZUlnbm9yZUF1dG9MYXllcktleXMgPSBhdXRvRGF0YXNldExheWVycy5tYXAoKGxheWVyKSA9PiBsYXllci5rZXkgKyAnLScgKyBsYXllci5zdWJUeXBlKTtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgPSAoYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyID8/IFtdKS5maWx0ZXIoKGtleSkgPT5cbiAgICAgICAgICAgIHBvc3NpYmxlSWdub3JlQXV0b0xheWVyS2V5cy5pbmNsdWRlcyhrZXkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllciB8fCBiYXNlLmxlbmd0aCAhPT0gYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0TWFuaWZlc3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXV0b09wdGlvbnM7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyQucGlwZShmaWx0ZXIoKG9wdCkgPT4gISFvcHQpKS5zdWJzY3JpYmUoKG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucykpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5tYXBVcmwkID0gdGhpcy5zdG9yZS5zZWxlY3QoQ29uZmlnU2VsZWN0b3JzLm1hcFVybCk7XG4gICAgdGhpcy53bXNGZWF0dXJlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMud21zRmVhdHVyZXMpO1xuXG4gICAgdGhpcy5ib3R0b21MZWZ0JCA9IHRoaXMud2lkZ2V0U2l6ZSQucGlwZShcbiAgICAgIG1hcCgoc2l6ZSkgPT4gYHRyYW5zbGF0ZSgxMHB4ICxjYWxjKCR7c2l6ZS5oZWlnaHR9cHggLSAxMDAlIC0gMTBweCkpYCksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuXG4gICAgdGhpcy5pdGVtU3R5bGVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmVzdWx0U2V0JCwgdGhpcy5tYW5pZmVzdCQsIHRoaXMuc3RhdGljUmVzdWx0U2V0JF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3JzLCBtYW5pZmVzdCwgc3JzXSkgPT4ge1xuICAgICAgICBpZiAoKG1hbmlmZXN0LmRhdGFzb3VyY2UgPT09IHVuZGVmaW5lZCB8fCBtYW5pZmVzdC5kYXRhc291cmNlLmxlbmd0aCA9PT0gMCkgJiYgIXNycykge1xuICAgICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTx7IFtpZDogc3RyaW5nXTogeyBjbGFzc2ljOiBTdHlsZTsgYm9yZGVyZWQ6IFN0eWxlIH0gfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0b3RhbCA9IE9iamVjdC52YWx1ZXMocnMuaXRlbXMpLnJlZHVjZSgocCwgYykgPT4gYy5sZW5ndGggKyBwLCAwKTtcbiAgICAgICAgICAgICAgaWYgKHRvdGFsID09PSAwKSByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgeyBbaWQ6IHN0cmluZ106IHsgY2xhc3NpYzogU3R5bGU7IGJvcmRlcmVkOiBTdHlsZSB9IH07XG4gICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMocnMuaXRlbXMpLmZvckVhY2goKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW1ib2xTZXJ2aWNlLmdldFN5bWJvbEFzSWNvblN0eWxlKGl0ZW0pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bWJvbFNlcnZpY2UuZ2V0U3ltYm9sQXNJY29uU3R5bGUoaXRlbSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIF0pLnRoZW4oKFtzdHlsZSwgYlN0eWxlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaXRlbS5pZF0gPSB7IGNsYXNzaWM6IHN0eWxlLCBib3JkZXJlZDogYlN0eWxlIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+PSB0b3RhbCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5oZWlnaHQkID0gY29tYmluZUxhdGVzdChbdGhpcy53aWRnZXRTaXplJC5waXBlKGRlYm91bmNlVGltZSgxMDApKSwgdGhpcy5kaXNwbGF5SGVhZGVyJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzaXplLCBkaXNwbGF5XSkgPT4gKHNpemUuaGVpZ2h0ID8/IDEwMCkgLSAoZGlzcGxheSA/IFdJREdFVF9IRUFERVJfSEVJR0hUIDogMCkpLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcblxuICAgIHRoaXMubGF5ZXJzVG9wJCA9IHRoaXMuZGlzcGxheUhlYWRlciQucGlwZShtYXAoKGRpc3BsYXkpID0+IDE0MCAtIChkaXNwbGF5ID8gMCA6IFdJREdFVF9IRUFERVJfSEVJR0hUKSkpO1xuICAgIHRoaXMubGVnZW5kVG9wJCA9IHRoaXMuZGlzcGxheUhlYWRlciQucGlwZShtYXAoKGRpc3BsYXkpID0+IDE4MCAtIChkaXNwbGF5ID8gMCA6IFdJREdFVF9IRUFERVJfSEVJR0hUKSkpO1xuXG4gICAgdGhpcy5sZWdlbmRIZWlnaHQkID0gY29tYmluZUxhdGVzdChbdGhpcy53aWRnZXRTaXplJC5waXBlKGRlYm91bmNlVGltZSgxMDApKSwgdGhpcy5sZWdlbmRUb3AkXSkucGlwZShcbiAgICAgIG1hcCgoW3NpemUsIHRvcF0pID0+IHtcbiAgICAgICAgcmV0dXJuIChzaXplLmhlaWdodCA/PyAxMDApIC0gV0lER0VUX0hFQURFUl9IRUlHSFQgLSB0b3AgLSA1NjsgLy8gNTZweCBpcyB0aGUgdG9vbHRpcCBoZWlnaHQgKyBtYXJnaW5cbiAgICAgIH0pLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcbiAgfVxuXG4gIGluaXRJbnRlcmFjdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLmluaXQodGhpcyk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKHsgdGFyZ2V0OiB0aGlzLm1hcFJlZi5uYXRpdmVFbGVtZW50IH0pO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyID0gdGhpcy5pbml0SW50ZXJhY3Rpb25NYW5hZ2VyKCk7XG4gICAgdGhpcy5tYXBTdHlsZVVybCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLm1hcFVybCRdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgdXJsXSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3R5bGUpIHtcbiAgICAgICAgICBjYXNlIHRoaXMuTk9fU1RZTEU6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjYXNlIHRoaXMuU1RZTEVfRlJPTV9VUkw6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsZVVSTCA/PyAnJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGAke3VybH0vc3R5bGVzLyR7b3B0aW9ucy5zdHlsZX0vc3R5bGUuanNvbmA7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG5cbiAgICB0aGlzLm1hcFN0eWxlTGF5ZXIkID0gdGhpcy5tYXBTdHlsZVVybCQucGlwZShcbiAgICAgIG1hcCgoc3R5bGVVcmwpID0+IHtcbiAgICAgICAgaWYgKCFzdHlsZVVybCkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIoe1xuICAgICAgICAgIGRlY2x1dHRlcjogdHJ1ZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7IHRpdGxlOiAnYmFja2dyb3VuZCcgfVxuICAgICAgICB9KTtcbiAgICAgICAgYXBwbHlTdHlsZShsYXllciwgc3R5bGVVcmwpLmNhdGNoKChlcnIpID0+IGNvbnNvbGUud2FybignU3R5bGUgYXBwbGljYXRpb24gcHJvYmxlbScsIGVycikpO1xuICAgICAgICBhcHBseUJhY2tncm91bmQobGF5ZXIsIHN0eWxlVXJsKS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ0JhY2tncm91bmQgYXBwbGljYXRpb24gcHJvYmxlbScsIGVycikpO1xuICAgICAgICByZXR1cm4gW2xheWVyXTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMub3B0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKG9wdGlvbnMpID0+ICh7XG4gICAgICAgICAgY2VudGVyOiBmcm9tTG9uTGF0KG9wdGlvbnMuY2VudGVyID8/IERFRkFVTFRfTUFQX0NFTlRFUiksXG4gICAgICAgICAgbWF4Wm9vbTogb3B0aW9ucy56b29tPy5tYXggPz8gREVGQVVMVF9aT09NX01BWCxcbiAgICAgICAgICBtaW5ab29tOiBvcHRpb25zLnpvb20/Lm1pbiA/PyBERUZBVUxUX1pPT01fTUlOLFxuICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbT8uc3RhcnQgPz8gREVGQVVMVF9aT09NX1NUQVJUXG4gICAgICAgIH0pKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodmlldykgPT4gdGhpcy5tYXAuc2V0VmlldyhuZXcgVmlldyh2aWV3KSkpO1xuXG4gICAgdGhpcy5maXRPcHRpb24kID0gdGhpcy5vcHRpb25zJC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zKSA9PiAhIW9wdGlvbnMuZml0KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuXG4gICAgdGhpcy5maXRPcHRpb24kLnN1YnNjcmliZSgoZml0KSA9PiB0aGlzLmZpdE1hcEZvck9iamVjdHMoZml0KSk7XG5cbiAgICB0aGlzLmxheWVycyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucmVzdWx0U2V0JCxcbiAgICAgIHRoaXMub3B0aW9ucyQsXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5hZGRpdGlvbmFsTGF5ZXJzJCxcbiAgICAgIHRoaXMuaXRlbVN0eWxlcyQsXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuZGF0YXNvdXJjZUZpbHRlcnMpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKSlcbiAgICBdKS5waXBlKFxuICAgICAgZmlsdGVyKFxuICAgICAgICAoW3Jlc3VsdFNldCwgb3B0aW9ucywgY2xhc3NlcywgYWRkaXRpb25hbExheWVycywgaXRlbVN0eWxlcywgZmlsdGVyc10pID0+ICEhcmVzdWx0U2V0ICYmICEhb3B0aW9ucyAmJiAhIWNsYXNzZXNcbiAgICAgICksXG4gICAgICBtYXAoKFtyZXN1bHRTZXQsIG9wdGlvbnMsIGNsYXNzZXMsIGFkZGl0aW9uYWxMYXllcnMsIGl0ZW1TdHlsZXMsIGZpbHRlcnNdKSA9PiB7XG4gICAgICAgIGxldCBoYXNSZWxhdGlvbkxheWVyID0gbnVsbCBhcyB1bmtub3duIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZTxhbnk+PjtcblxuICAgICAgICBjb25zdCBsYXllcnMgPSAob3B0aW9ucz8ubGF5ZXJzIHx8IFtdKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAobGF5ZXIpID0+IHRoaXMud2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLmRvbnROZWVkTG9jYXRpb24uaW5jbHVkZXMobGF5ZXIudHlwZSkgfHwgISFsYXllci5hdHRyaWJ1dGVcbiAgICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIChsYXllcikgPT4gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuZG9udE5lZWRJbnRlbnNpdHkuaW5jbHVkZXMobGF5ZXIudHlwZSkgfHwgISFsYXllci5pbnRlbnNpdHlBdHRyaWJ1dGVcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzRm9yQ2xhc3MgPSBPYmplY3Qua2V5cyhyZXN1bHRTZXQuaXRlbXMpXG4gICAgICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+ICh7XG4gICAgICAgICAgICAgICAgY2xhc3NJZCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldEF0dHJpYnV0ZXNGb3JEcmF3aW5nKGNsYXNzZXMsIGNsYXNzSWQsIGxheWVyKVxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgICAgICAocCwgYykgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgICAgICAgICBbYy5jbGFzc0lkXTogY1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHt9IGFzIHtcbiAgICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5QXR0cmlidXRlOiBBdHRyaWJ1dGU7XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uQXR0cmlidXRlOiBBdHRyaWJ1dGU7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGxheWVyQ2xhc3Nlc0lkID0gY2xhc3Nlcy5tYXAoKGNsYXp6KSA9PiBjbGF6ei5pZCk7XG4gICAgICAgICAgICBpZiAoJ2NsYXNzZXMnIGluIGxheWVyICYmICEhbGF5ZXIuY2xhc3NlcyAmJiBsYXllci5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbGF5ZXJDbGFzc2VzSWQgPSBsYXllci5jbGFzc2VzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB7IG1pbjogMCwgbWF4OiAwIH07XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAoISFsYXllci5pbnRlbnNpdHlBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMocmVzdWx0U2V0Lml0ZW1zKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+XG4gICAgICAgICAgICAgICAgICByZXN1bHRTZXQuaXRlbXNbY2xhc3NJZF0ubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICBJdGVtVXRpbHMuZ2V0QXR0cmlidXRlQ2FsY3VsYXRlZFZhbHVlKGl0ZW0sIGF0dHJpYnV0ZXNGb3JDbGFzc1tpdGVtLm9DbGFzc10uaW50ZW5zaXR5QXR0cmlidXRlKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVkdWNlKChwLCBjKSA9PiBbLi4ucCwgLi4uY10sIFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIGFzIG51bWJlcltdO1xuXG4gICAgICAgICAgICAgIHJhbmdlID0gdmFsdWVzLnJlZHVjZSgocCwgYykgPT4gKHsgbWluOiBNYXRoLm1pbihwLm1pbiwgYyksIG1heDogTWF0aC5tYXgocC5tYXgsIGMpIH0pLCB7XG4gICAgICAgICAgICAgICAgbWluOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgICAgIG1heDogLU51bWJlci5NQVhfVkFMVUVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGltcGwgPSB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS5sYXllcnNJbXBsZW1lbnRhdGlvbltsYXllci50eXBlXTtcbiAgICAgICAgICAgIGlmICghIWltcGwpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0TGF5ZXIgPSBpbXBsKFxuICAgICAgICAgICAgICAgIGxheWVyIGFzIGFueSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzRm9yQ2xhc3MsXG4gICAgICAgICAgICAgICAgbGF5ZXJDbGFzc2VzSWQsXG4gICAgICAgICAgICAgICAgcmVzdWx0U2V0LFxuICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgIGl0ZW1TdHlsZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdyZWxhdGlvbicpIHtcbiAgICAgICAgICAgICAgICBoYXNSZWxhdGlvbkxheWVyID0gcmVzdWx0TGF5ZXIgYXMgdW5rbm93biBhcyBWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U+O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgndGl0bGUnLCBsYXllci50aXRsZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3FsX2ZpbHRlciA9IENxbFV0aWxzLmdldENRTFBhcmFtc0ZvcihsYXllci5kYXRhc291cmNlSWQsIGZpbHRlcnMsIGNsYXNzZXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNxbF9maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEFkZGluZyBDUUwgcXVlcnkgdG8gZ2Vvc2VydmVyIGxheWVyc1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdExheWVyIGFzIFRpbGU8VGlsZVdNUz4pLmdldFNvdXJjZSgpIS51cGRhdGVQYXJhbXMoeyBjcWxfZmlsdGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRMYXllcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYExheWVyIHR5cGUgJHtsYXllci50eXBlfSBpcyB1bmtub3duYCk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsIGFzIHVua25vd24gYXMgQmFzZUxheWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIpO1xuXG4gICAgICAgIGlmICghIWhhc1JlbGF0aW9uTGF5ZXIpIHtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IGxheWVyc1xuICAgICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEobGF5ZXIgaW5zdGFuY2VvZiBUaWxlKSlcbiAgICAgICAgICAgIC5tYXAoKGxheWVyKSA9PlxuICAgICAgICAgICAgICBsYXllclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAuZ2V0U291cmNlKClcbiAgICAgICAgICAgICAgICAuZ2V0RmVhdHVyZXMoKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZlYXR1cmVzOiBGZWF0dXJlPGFueT4pID0+ICEhZmVhdHVyZXMuZ2V0KCdpZCcpIHx8ICEhZmVhdHVyZXMuZ2V0KCdmZWF0dXJlcycpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gWy4uLnAsIC4uLmNdLCBbXSk7XG5cbiAgICAgICAgICByZXN1bHRTZXQucmVsYXRpb25zLmZvckVhY2goKHJlbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBmZWF0dXJlcy5maW5kKChmOiBGZWF0dXJlPFBvaW50IHwgQ2lyY2xlPikgPT4gZi5nZXQoJ2lkJykgPT09IHJlbGF0aW9uLnNvdXJjZSk7XG4gICAgICAgICAgICBjb25zdCBkZXN0ID0gZmVhdHVyZXMuZmluZCgoZjogRmVhdHVyZTxQb2ludCB8IENpcmNsZT4pID0+IGYuZ2V0KCdpZCcpID09PSByZWxhdGlvbi5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICBpZiAoISFzb3VyY2UgJiYgISFkZXN0KSB7XG4gICAgICAgICAgICAgIGhhc1JlbGF0aW9uTGF5ZXIuZ2V0U291cmNlKCk/LmFkZEZlYXR1cmUoZ2V0TGlua0ZlYXR1cmUocmVsYXRpb24sIHNvdXJjZSwgZGVzdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxheWVycy5wdXNoKC4uLmFkZGl0aW9uYWxMYXllcnMpO1xuICAgICAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIsIGluZGV4LCBhcnIpID0+IGxheWVyLnNldCgnekluZGV4JywgYXJyLmxlbmd0aCAtIGluZGV4KSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2luZ2xlTGF5ZXIpIHtcbiAgICAgICAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIsIGlkeCkgPT4ge1xuICAgICAgICAgICAgbGF5ZXIuc2V0VmlzaWJsZShpZHggPT09IDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMubGVnZW5kTGF5ZXJzJCA9IHRoaXMub3B0aW9ucyQucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICAgKG9wdGlvbnMubGF5ZXJzID8/IFtdKS5maWx0ZXIoKGxheWVyKSA9PiBbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKSkgYXMgKFxuICAgICAgICAgICAgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICAgIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICApW11cbiAgICAgICksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLm1hcFN0eWxlTGF5ZXIkLFxuICAgICAgICB0aGlzLmxheWVycyQsXG4gICAgICAgIHRoaXMuZml0T3B0aW9uJCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZElkcyQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpKVxuICAgICAgXSkuc3Vic2NyaWJlKChbbWFwU3R5bGVMYXllciwgbGF5ZXJzLCBmaXQsIHNlbGVjdGVkSWRzXSkgPT4ge1xuICAgICAgICBjb25zdCB0b0FwcGx5TGF5ZXJzID0gWy4uLmxheWVycywgLi4ubWFwU3R5bGVMYXllcl07XG4gICAgICAgIHRoaXMubWFwLnNldExheWVycyh0b0FwcGx5TGF5ZXJzKTtcbiAgICAgICAgdGhpcy5tYXBcbiAgICAgICAgICAuZ2V0QWxsTGF5ZXJzKClcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gIShsYXllciBpbnN0YW5jZW9mIFRpbGUpKVxuICAgICAgICAgIC5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ2V0RmVhdHVyZXMgPSAobGF5ZXIuZ2V0U291cmNlKCkgYXMgVmVjdG9yU291cmNlKT8uZ2V0RmVhdHVyZXM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGdldEZlYXR1cmVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIChsYXllci5nZXRTb3VyY2UoKSBhcyBWZWN0b3JTb3VyY2UpPy5nZXRGZWF0dXJlcygpLmZvckVhY2goKGZlYXR1cmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBmZWF0dXJlLmdldCgndHlwZScpO1xuICAgICAgICAgICAgICAgIGlmIChbJ2J1YmJsZScsICdtYXJrZXInLCAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJywgJ211bHRpLWxpbmUnLCAnbXVsdGktcG9seWdvbiddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICBmZWF0dXJlLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLmdldChzZWxlY3RlZElkcy5pbmNsdWRlcyhmZWF0dXJlLmdldCgnaWQnKSkgPyAnc2VsZWN0ZWRTdHlsZScgOiAnY2xhc3NpY1N0eWxlJylcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpdE1hcEZvck9iamVjdHMoZml0LCBzZWxlY3RlZElkcyk7XG4gICAgICAgICAgdGhpcy5tYXAudXBkYXRlU2l6ZSgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLndtc0ZlYXR1cmVzJCwgdGhpcy5jbGFzc2ljRmVhdHVyZXMkLCB0aGlzLndpZGdldFNpemUkLCB0aGlzLmRpc3BsYXlIZWFkZXIkXSkuc3Vic2NyaWJlKFxuICAgICAgICAoW3dtc0ZlYXR1cmVzLCBjbGFzc2ljRmVhdHVyZXMsIHNpemUsIGhlYWRlcl0pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5tYXApIHtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcEluZGV4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHBvcHVwT3ZlcmxheSA9IG5ldyBPdmVybGF5KHtcbiAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5wb3B1cC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICBvZmZzZXQ6IFs5LCA5XVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm1hcC5hZGRPdmVybGF5KHBvcHVwT3ZlcmxheSk7XG4gICAgICAgICAgICB0aGlzLnBvcHVwQ29udGVudC5jbGVhcigpO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UHJvbWlzZXMgPSBbXSBhcyBQcm9taXNlPENvbXBvbmVudFJlZjxCYXNlVG9vbHRpcENvbXBvbmVudD4gfCBudWxsPltdO1xuICAgICAgICAgICAgd21zRmVhdHVyZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgY29tcG9uZW50UHJvbWlzZXMucHVzaCh0aGlzLmdlbmVyYXRlVG9vbHRpcCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbGFzc2ljRmVhdHVyZXMuZm9yRWFjaCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb21wb25lbnRQcm9taXNlcy5wdXNoKHRoaXMuZ2VuZXJhdGVUb29sdGlwKHZhbHVlKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoY29tcG9uZW50UHJvbWlzZXMpLnRoZW4oKHByb21pc2VzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxDb21wb25lbnRzID0gcHJvbWlzZXMuZmlsdGVyKChjb21wb25lbnQpID0+ICEhY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgdGhpcy50b29sdGlwTnVtYmVyID0gcmVhbENvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAocmVhbENvbXBvbmVudHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwLm5hdGl2ZUVsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwb3B1cE92ZXJsYXkuc2V0UG9zaXRpb24oWy05OTk5OTk5OTk5LCAtOTk5OTk5OTk5OV0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXAubmF0aXZlRWxlbWVudC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBEbyBub3QgZ28gb3V0c2lkZSB0aGUgbWFwXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHtcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogMjAwICsgKGhlYWRlciA/IFdJREdFVF9IRUFERVJfSEVJR0hUIDogMCkgKyBUT09MVElQX1BBRERJTkcsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogMzAwICsgVE9PTFRJUF9QQURESU5HXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcGl4ZWwgPSB0aGlzLmludGVyYWN0aW9uTWFuYWdlci50b29sdGlwRXZlbnQ/LnBpeGVsO1xuICAgICAgICAgICAgICAgIGlmICghIXBpeGVsICYmIHBpeGVsWzBdICsgcmVjdC53aWR0aCA+IHNpemUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgIHBpeGVsWzBdID0gc2l6ZS53aWR0aCAtIHJlY3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghIXBpeGVsICYmIHBpeGVsWzFdICsgcmVjdC5oZWlnaHQgPiBzaXplLmhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgcGl4ZWxbMV0gPSBzaXplLmhlaWdodCAtIHJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcE1vdmUoMCk7XG4gICAgICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICAgICAgICAgIHBvcHVwT3ZlcmxheS5zZXRQb3NpdGlvbih0aGlzLm1hcC5nZXRDb29yZGluYXRlRnJvbVBpeGVsKHBpeGVsID8/IFswLCAwXSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5pdFJlc3VsdFNldCQoKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnJlc3VsdFNldHMpLFxuICAgICAgdGhpcy5kYXRhc291cmNlSWRzJCxcbiAgICAgIHRoaXMuc3RhdGljUmVzdWx0U2V0JCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZGF0YXNldHMpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3Jlc3VsdFNldHMsIHJlc3VsdFNldE5hbWVzQXJyYXksIHN0YXRpY1Jlc3VsdFNldCwgZGVmaW5pdGlvbnNdKSA9PiB7XG4gICAgICAgIGlmICghIXN0YXRpY1Jlc3VsdFNldCkge1xuICAgICAgICAgIHJldHVybiBzdGF0aWNSZXN1bHRTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0U2V0QXJyYXkgPSByZXN1bHRTZXROYW1lc0FycmF5XG4gICAgICAgICAgLmZpbHRlcigocnNOYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gZGVmaW5pdGlvbnMuZmluZCgoZHNkKSA9PiBkc2QuaWQgPT09IHJzTmFtZSkgYXMgRGF0YXNldCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiAhZGVmaW5pdGlvbiB8fCAhKGRlZmluaXRpb24ubWV0YWRhdGEgPz8gW10pLmZpbmQoKG1ldGEpID0+IG1ldGEubWV0YWRhdGFEZWYubmFtZSA9PT0gJ19nZW9LZXknKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKHJzTmFtZSkgPT4gcmVzdWx0U2V0c1tyc05hbWUgPz8gJyddKVxuICAgICAgICAgIC5maWx0ZXIoKHJzTmFtZSkgPT4gISFyc05hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0U2V0QXJyYXkucmVkdWNlKChyczEsIHJzMikgPT4gUmVzdWx0c2V0VXRpbHMubWVyZ2VSZXN1bHRTZXRzKHJzMSwgcnMyKSwge1xuICAgICAgICAgIGl0ZW1zOiB7fSxcbiAgICAgICAgICByZWxhdGlvbnM6IFtdLFxuICAgICAgICAgIG1lcmdlZDogcmVzdWx0U2V0QXJyYXkubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgdikgPT4gZXF1YWwocCwgdikpXG4gICAgKTtcbiAgfVxuXG4gIGdlbmVyYXRlVG9vbHRpcCh2YWx1ZToge1xuICAgIG9DbGFzczogc3RyaW5nO1xuICAgIGNvb3JkaW5hdGVzOiBQaXhlbDtcbiAgICB2YWx1ZXM6IGFueTtcbiAgfSk6IFByb21pc2U8Q29tcG9uZW50UmVmPEJhc2VUb29sdGlwQ29tcG9uZW50PiB8IG51bGw+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCQgPSB0aGlzLnRvb2x0aXBGYWN0b3J5U2VydmljZS5nZW5lcmF0ZVRvb2x0aXAodmFsdWUub0NsYXNzLCB0aGlzLmluamVjdG9yLCB0aGlzLnBvcHVwQ29udGVudCk7XG4gICAgICBjb21wb25lbnQkLnN1YnNjcmliZSgoY29tcG9uZW50KSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICBjb21wb25lbnQuaW5zdGFuY2UuZGF0YS5pdGVtID0gdmFsdWUudmFsdWVzO1xuICAgICAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5wb3B1cCA9IHRoaXMucG9wdXA7XG4gICAgICAgICAgcmVzb2x2ZShjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldERlZmF1bHRMYXllclRpdGxlKFxuICAgIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsXG4gICAgY2FwYWJpbGl0aWVzOiB7IFtwOiBzdHJpbmddOiBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZSB8IG51bGwgfSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIWxheWVyLnRpdGxlKSB7XG4gICAgICBpZiAoWydnZW9zZXJ2ZXInLCAnd21zJ10uaW5jbHVkZXMobGF5ZXIudHlwZSkpIHtcbiAgICAgICAgY29uc3QgZ2VvTGF5ZXIgPSBsYXllciBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMgfCBNYXBXTVNMYXllckxheWVyT3B0aW9ucztcbiAgICAgICAgY29uc3QgbGF5ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXMgPyBjYXBhYmlsaXRpZXNbZ2VvTGF5ZXIudXJsXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobGF5ZXJDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ0xheWVyID0gWE1MVXRpbHMuZ2V0TWF0Y2hpbmdMYXllcihnZW9MYXllci5wYXJhbUxheWVyLCBsYXllckNhcGFiaWxpdGllcy5kb2MpO1xuICAgICAgICAgIGlmIChtYXRjaGluZ0xheWVyKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1RpdGxlID0gWE1MVXRpbHMuZmluZChtYXRjaGluZ0xheWVyLmNoaWxkTm9kZXMsICdUaXRsZScpO1xuICAgICAgICAgICAgaWYgKG1hdGNoaW5nVGl0bGUpIHtcbiAgICAgICAgICAgICAgbGF5ZXIudGl0bGUgPVxuICAgICAgICAgICAgICAgICEhbWF0Y2hpbmdUaXRsZS50ZXh0Q29udGVudCAmJiBtYXRjaGluZ1RpdGxlLnRleHRDb250ZW50Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gbWF0Y2hpbmdUaXRsZS50ZXh0Q29udGVudFxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXllci50aXRsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLiR7bGF5ZXIudHlwZX1gLCB7IC4uLmxheWVyIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpdE1hcEZvck9iamVjdHMoZml0OiBib29sZWFuLCBzZWxlY3RlZElkcz86IHN0cmluZ1tdKSB7XG4gICAgaWYgKGZpdCkge1xuICAgICAgbGV0IGV4dGVudCA9IGNyZWF0ZUVtcHR5KCk7XG4gICAgICBjb25zdCBsaXN0T2ZNYXJrZXJzID0gW10gYXMgYW55W107XG5cbiAgICAgIHRoaXMubWFwXG4gICAgICAgIC5nZXRBbGxMYXllcnMoKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChsYXllcikgPT4gISFsYXllci5nZXRTb3VyY2UgJiYgISFsYXllci5nZXRTb3VyY2UoKSAmJiAhIShsYXllci5nZXRTb3VyY2UoKSBhcyBWZWN0b3JTb3VyY2UpLmdldEZlYXR1cmVzXG4gICAgICAgIClcbiAgICAgICAgLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgKGxheWVyLmdldFNvdXJjZSgpIGFzIFZlY3RvclNvdXJjZSkuZ2V0RmVhdHVyZXMoKS5mb3JFYWNoKChmZWF0dXJlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZmVhdHVyZS5nZXQoJ2lkJyk7XG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkSWRzIHx8IHNlbGVjdGVkSWRzLmxlbmd0aCA8PSAwIHx8IChzZWxlY3RlZElkcy5sZW5ndGggPiAwICYmIHNlbGVjdGVkSWRzLmluY2x1ZGVzKGlkKSkpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlLmdldCgndHlwZScpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnaGVhdHBvaW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICdwb2ludCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFya2VyJzpcbiAgICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaChmZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdsaW5lJzpcbiAgICAgICAgICAgICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaCguLi5mZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgICAgICAgICBjYXNlICdtdWx0aS1saW5lJzpcbiAgICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaCguLi5mZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKS5mbGF0KCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbXVsdGktcG9seWdvbic6XG4gICAgICAgICAgICAgICAgICBsaXN0T2ZNYXJrZXJzLnB1c2goLi4uZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldENvb3JkaW5hdGVzKCkuZmxhdCgpLmZsYXQoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKGZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDZW50ZXIoKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkRXh0ZW50ID0gYm91bmRpbmdFeHRlbnQobGlzdE9mTWFya2Vycy5maWx0ZXIoKGNvb3JkKSA9PiAhIWNvb3JkKSk7XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdGVkRXh0ZW50WzBdICE9PSBJbmZpbml0eSAmJlxuICAgICAgICBzZWxlY3RlZEV4dGVudFsxXSAhPT0gSW5maW5pdHkgJiZcbiAgICAgICAgc2VsZWN0ZWRFeHRlbnRbMl0gIT09IC1JbmZpbml0eSAmJlxuICAgICAgICBzZWxlY3RlZEV4dGVudFszXSAhPT0gLUluZmluaXR5XG4gICAgICApIHtcbiAgICAgICAgZXh0ZW50ID0gc2VsZWN0ZWRFeHRlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChleHRlbnRbMF0gIT09IEluZmluaXR5ICYmIGV4dGVudFsxXSAhPT0gSW5maW5pdHkgJiYgZXh0ZW50WzJdICE9PSAtSW5maW5pdHkgJiYgZXh0ZW50WzNdICE9PSAtSW5maW5pdHkpIHtcbiAgICAgICAgdGhpcy5tYXAuZ2V0VmlldygpLmZpdChleHRlbnQsIHsgcGFkZGluZzogWzIwLCAyMCwgNzAsIDcwXSwgZHVyYXRpb246IDIwMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEF0dHJpYnV0ZXNGb3JEcmF3aW5nKGNsYXNzZXM6IENsYXNzW10sIGNsYXNzSWQ6IHN0cmluZywgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGNsYXNzT2JqID0gY2xhc3Nlcy5maW5kKChjbCkgPT4gY2wuaWQgPT09IGNsYXNzSWQpID8/ICh7IGF0dHJpYnV0ZXM6IFtdIGFzIEF0dHJpYnV0ZVtdIH0gYXMgQ2xhc3MpO1xuICAgIGNvbnN0IGxvY2F0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRMb2NhdGlvbkF0dHJpYnV0ZShjbGFzc09iaiwgbGF5ZXIpO1xuICAgIGNvbnN0IGludGVuc2l0eUF0dHJpYnV0ZSA9IHRoaXMuZ2V0SW50ZW5zaXR5QXR0cmlidXRlKFxuICAgICAgY2xhc3NPYmosXG4gICAgICBsYXllciBhcyBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zXG4gICAgKTtcbiAgICByZXR1cm4geyBsb2NhdGlvbkF0dHJpYnV0ZSwgaW50ZW5zaXR5QXR0cmlidXRlIH07XG4gIH1cblxuICBwcml2YXRlIGdldEludGVuc2l0eUF0dHJpYnV0ZShcbiAgICBjbGFzc09iajogQ2xhc3MgfCB1bmRlZmluZWQsXG4gICAgbGF5ZXI6IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChjbGFzc09iaiB8fCB7IGF0dHJpYnV0ZXM6IFtdIH0pLmF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci5uYW1lID09PSBsYXllcj8uaW50ZW5zaXR5QXR0cmlidXRlID8/ICcnKSA/P1xuICAgICAgKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIEF0dHJpYnV0ZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhdGlvbkF0dHJpYnV0ZShjbGFzc09iajogQ2xhc3MsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpOiBBdHRyaWJ1dGUge1xuICAgIHR5cGUgbGF5ZXJzID0gTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucztcbiAgICBjb25zdCBzcGVjaWZpY0xheWVyID0gbGF5ZXIgYXMgbGF5ZXJzO1xuICAgIHJldHVybiAoXG4gICAgICBjbGFzc09iai5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIubmFtZSA9PT0gKHNwZWNpZmljTGF5ZXI/LmF0dHJpYnV0ZSA/PyBbXSkgPz8gJycpID8/XG4gICAgICAodW5kZWZpbmVkIGFzIHVua25vd24gYXMgQXR0cmlidXRlKVxuICAgICk7XG4gIH1cblxuICBjaGFuZ2VTdHlsZSgkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuc3R5bGUgPSAkZXZlbnQ7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkuc3R5bGUgIT09IHRoaXMuU1RZTEVfRlJPTV9VUkwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5LnN0eWxlVVJMO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVN0eWxlVVJMKCRldmVudDogRXZlbnQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5vcHRpb25zQ29weS5zdHlsZVVSTCA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZUZpdCgkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmZpdCA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZUF0dHJpYnV0aW9ucygkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmF0dHJpYnV0aW9ucyA9ICRldmVudDtcbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5hdHRyaWJ1dGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLmF0dHJpYnV0aW9uID0gJycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiBkZWxldGUgbGF5ZXIuYXR0cmlidXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGFkZExheWVyKCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5sYXllcnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gW107XG4gICAgfVxuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLnB1c2goeyBhdHRyaWJ1dGU6ICcnIH0gYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKTtcbiAgfVxuXG4gIGNoYW5nZUxheWVyVHlwZSgkZXZlbnQ6IGFueSwgaTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmxheWVycykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA/PyBbXTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSA9ICRldmVudDtcbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSA9PT0gJ3dtcycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXSBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9ucztcbiAgICAgIG9wdGlvbnMucGFyYW1MYXllciA9IG9wdGlvbnMucGFyYW1MYXllciA/PyAnJztcbiAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgPz8gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlID09PSAnd210cycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXSBhcyBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnM7XG4gICAgICBvcHRpb25zLnBhcmFtTGF5ZXIgPSBvcHRpb25zLnBhcmFtTGF5ZXIgPz8gJyc7XG4gICAgICBvcHRpb25zLnN0eWxlID0gb3B0aW9ucy5zdHlsZSA/PyAnJztcbiAgICAgIG9wdGlvbnMubWF0cml4U2V0ID0gb3B0aW9ucy5tYXRyaXhTZXQgPz8gJyc7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsID8/ICcnO1xuICAgIH1cbiAgICBpZiAoWydmZWF0dXJlbGF5ZXInLCAndmVjdG9ydGlsZScsICdyYXN0ZXJ0aWxlJ10uaW5jbHVkZXModGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXSBhcyBNYXBGZWF0dXJlTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCA/PyAnJztcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VUaXRsZSgkZXZlbnQ6IGFueSwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGxheWVyLnRpdGxlID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgZW1pdE1hbmlmZXN0KCkge1xuICAgIHRoaXMubWFuaWZlc3RNb2RpZmllZC5lbWl0KHtcbiAgICAgIHdpZGdldEluZGV4OiB0aGlzLndpZGdldEluZGV4LFxuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgb3B0aW9uczogeyAuLi50aGlzLm9wdGlvbnNDb3B5LCBsYXllcnM6ICh0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA/PyBbXSkuZmlsdGVyKChsYXllcikgPT4gISFsYXllci50eXBlKSB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VMb2NhdGlvbkF0dHJpYnV0ZXMoJGV2ZW50OiBhbnksIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuYXR0cmlidXRlID0gJGV2ZW50O1xuICB9XG5cbiAgbGF5ZXJIYXNJbnRlbnNpdHkobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucyk6IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnMge1xuICAgIHJldHVybiA8TWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucz5sYXllcjtcbiAgfVxuXG4gIGNoYW5nZUludGVuc2l0eUF0dHJpYnV0ZXMoJGV2ZW50OiBhbnksIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBsYXllcl8gPSA8TWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucz5sYXllcjtcbiAgICBsYXllcl8uaW50ZW5zaXR5QXR0cmlidXRlID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlQ2xhc3NlcygkZXZlbnQ6IHN0cmluZ1tdLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3Qgc3BlY2lmaWNMYXllciA9IGxheWVyIGFzXG4gICAgICB8IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucztcbiAgICBzcGVjaWZpY0xheWVyLmNsYXNzZXMgPSAkZXZlbnQ7XG4gIH1cblxuICBkZWxldGVMYXllcihpOiBudW1iZXIsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5Py5sYXllcnM/LnNwbGljZShpLCAxKTtcbiAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2F1dG8nKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllciA9IFsuLi4odGhpcy5vcHRpb25zQ29weS5pZ25vcmVBdXRvTGF5ZXIgPz8gW10pLCBsYXllci5rZXkgKyAnLScgKyBsYXllci5zdWJUeXBlXTtcbiAgICB9XG4gIH1cblxuICBpbnZlcnRMYXllcnMoaWR4OiBudW1iZXIsIGlkeFdpdGg6IG51bWJlcikge1xuICAgIGlmICghIXRoaXMub3B0aW9uc0NvcHkgJiYgISF0aGlzLm9wdGlvbnNDb3B5LmxheWVycykge1xuICAgICAgY29uc3QgdG1wID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaWR4V2l0aF07XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpZHhXaXRoXSA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2lkeF07XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpZHhdID0gdG1wO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVVybChcbiAgICAkZXZlbnQ6IEV2ZW50LFxuICAgIGxheWVyOlxuICAgICAgfCBNYXBXTVNMYXllckxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBGZWF0dXJlTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFZlY3RvclRpbGVMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwUmFzdGVyVGlsZUxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zXG4gICkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci51cmwgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VBdHRyaWJ1dGlvbigkZXZlbnQ6IEV2ZW50LCBsYXllcjogQmFzZVdpZGdldE1hcExheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5hdHRyaWJ1dGlvbiA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZVBhcmFtTGF5ZXIoJGV2ZW50OiBFdmVudCwgbGF5ZXI6IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLnBhcmFtTGF5ZXIgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VQYXJhbVRpbGVkKCRldmVudDogYm9vbGVhbiwgbGF5ZXI6IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgbGF5ZXIucGFyYW1UaWxlZCA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZU1hdHJpeFNldCgkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLm1hdHJpeFNldCA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZVBhcmFtU3R5bGUoJGV2ZW50OiBFdmVudCwgbGF5ZXI6IE1hcFdNVFNMYXllckxheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5zdHlsZSA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGV4cG9ydCgpIHtcbiAgICBleHBvcnRNYXBBc0ltYWdlKHRoaXMubWFwLCAnbWFwLnBuZycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9JbWFnZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBnZXRNYXBBc1BuZyh0aGlzLm1hcCk7XG4gIH1cblxuICBjaGFuZ2VDbHVzdGVyZWQobGF5ZXI6IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucywgJGV2ZW50OiBib29sZWFuKSB7XG4gICAgbGF5ZXIuY2x1c3RlcmVkID0gJGV2ZW50O1xuICAgIGlmIChsYXllci5jbHVzdGVyZWQpIHtcbiAgICAgIGxheWVyLmNsdXN0ZXJEaXN0YW5jZSA9IDEwO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUNsdXN0ZXJEaXN0YW5jZShsYXllcjogTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zLCAkZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLmNsdXN0ZXJEaXN0YW5jZSA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGhpZGVBZGRyZXNzKCkge1xuICAgIHRoaXMuYWRkcmVzcy5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBjaGFuZ2VPcGFjaXR5KGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsICRldmVudDogc3RyaW5nKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLm9wYWNpdHkgPSBwYXJzZUludCgkZXZlbnQsIDEwKTtcbiAgfVxuXG4gIGdldFdNU0xheWVycygpOiBMYXllcjxhbnk+W10ge1xuICAgIHJldHVybiAhdGhpcy5tYXBcbiAgICAgID8gW11cbiAgICAgIDogdGhpcy5tYXBcbiAgICAgICAgICAuZ2V0QWxsTGF5ZXJzKClcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUaWxlV01TKVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIucmVuZGVyZWQgPT09IHRydWUpO1xuICB9XG5cbiAgaXNMYXllclJlbmRlcmVkKGxheWVyOiBhbnkpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldFdNU0xheWVycygpLmZpbmQoKHdtc0xheWVyKSA9PiB3bXNMYXllci5nZXQoJ3RpdGxlJykgPT09IGxheWVyLnRpdGxlKTtcbiAgfVxuXG4gIGlzTGF5ZXJWaXNpYmxlKGxheWVyOiBhbnkpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldFdNU0xheWVycygpXG4gICAgICAuZmluZCgod21zTGF5ZXIpID0+IHdtc0xheWVyLmdldCgndGl0bGUnKSA9PT0gbGF5ZXIudGl0bGUpXG4gICAgICA/LmdldFZpc2libGUoKTtcbiAgfVxuXG4gIGdldEZlYXR1cmVGcm9tU2VydmVyKHdtc0xheWVyczogTGF5ZXI8YW55PltdLCBwaXhlbDogUGl4ZWwpIHtcbiAgICBwcm9qNC5kZWZzKFxuICAgICAgJ0VQU0c6MjE1NCcsXG4gICAgICAnK3Byb2o9bGNjICtsYXRfMD00Ni41ICtsb25fMD0zICtsYXRfMT00OSArbGF0XzI9NDQgK3hfMD03MDAwMDAgK3lfMD02NjAwMDAwICtlbGxwcz1HUlM4MCArdG93Z3M4ND0wLDAsMCwwLDAsMCwwICt1bml0cz1tICtub19kZWZzICt0eXBlPWNycydcbiAgICApO1xuICAgIHJlZ2lzdGVyKHByb2o0KTtcbiAgICBjb25zdCBwcm9qR2VvID0gZ2V0UHJvamVjdGlvbignRVBTRzozODU3Jyk7XG4gICAgY29uc3QgcHJvakxhbWJlcnQgPSBnZXRQcm9qZWN0aW9uKCdFUFNHOjIxNTQnKTtcblxuICAgIGlmIChwcm9qTGFtYmVydCAmJiBwcm9qR2VvKSB7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHdtc0xheWVycykge1xuICAgICAgICBjb25zdCB1cmwgPSBsYXllclxuICAgICAgICAgIC5nZXRTb3VyY2UoKVxuICAgICAgICAgIC5nZXRGZWF0dXJlSW5mb1VybCh0cmFuc2Zvcm0ocGl4ZWwsIHByb2pHZW8sIHByb2pMYW1iZXJ0KSwgdGhpcy5tYXAuZ2V0VmlldygpLmdldFJlc29sdXRpb24oKSwgJ0VQU0c6MjE1NCcsIHtcbiAgICAgICAgICAgIElORk9fRk9STUFUOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICBGRUFUVVJFX0NPVU5UOiAxMCxcbiAgICAgICAgICAgIC4uLmxheWVyLmdldFByb3BlcnRpZXMoKVsnZ2V0RmVhdHVyZUluZm9BZGRpdGlvbmFsUGFyYW1ldGVycyddXG4gICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy5nZXRXbXNGZWF0dXJlcyh7XG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgb0NsYXNzOiBsYXllci5nZXRQcm9wZXJ0aWVzKClbJ29DbGFzcyddID8/ICcnLFxuICAgICAgICAgICAgICBjb29yZGluYXRlczogcGl4ZWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVdtc0NsYXNzKCRldmVudDogYW55LCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5vQ2xhc3MgPSAkZXZlbnQ7XG4gIH1cblxuICB0b2dnbGVMZWdlbmQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubGVnZW5kVGFiID0gdGhpcy5sZWdlbmRUYWIgPT09IGluZGV4ID8gLTEgOiBpbmRleDtcbiAgfVxuXG4gIHRvZ2dsZUxlZ2VuZFdpbmRvdygpIHtcbiAgICB0aGlzLmxlZ2VuZFRhYk9wZW4gPSAhdGhpcy5sZWdlbmRUYWJPcGVuO1xuICAgIHRoaXMubGF5ZXJzVGFiT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlTGF5ZXJzV2luZG93KCkge1xuICAgIHRoaXMubGF5ZXJzVGFiT3BlbiA9ICF0aGlzLmxheWVyc1RhYk9wZW47XG4gICAgdGhpcy5sZWdlbmRUYWJPcGVuID0gZmFsc2U7XG4gIH1cblxuICB0b29sdGlwTW92ZShudW1iZXI6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnRvb2x0aXBDYW5Nb3ZlKG51bWJlcikpIHtcbiAgICAgIHRoaXMuc2V0U3R5bGVBc3luYyh0aGlzLnRvb2x0aXBJbmRleCwgJ25vbmUnKTtcbiAgICAgIHRoaXMudG9vbHRpcEluZGV4ID0gdGhpcy50b29sdGlwSW5kZXggKyBudW1iZXI7XG4gICAgICB0aGlzLnNldFN0eWxlQXN5bmModGhpcy50b29sdGlwSW5kZXgsICdibG9jaycpO1xuICAgIH1cbiAgfVxuXG4gIHRvb2x0aXBDYW5Nb3ZlKG51bWJlcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHRpcEluZGV4ICsgbnVtYmVyID49IDAgJiYgdGhpcy50b29sdGlwSW5kZXggKyBudW1iZXIgPCB0aGlzLnRvb2x0aXBOdW1iZXI7XG4gIH1cblxuICBwcml2YXRlIHNldFN0eWxlQXN5bmMoaWR4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lciA9IHRoaXMucG9wdXBDb250ZW50LmdldChpZHgpO1xuICAgICAgaWYgKHRhcmdldENvbnRhaW5lcikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRhcmdldENvbnRhaW5lci5yb290Tm9kZXNbMF0uc3R5bGUuZGlzcGxheSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBnZXQgbWFwTGF5ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLm1hcFxuICAgICAgLmdldExheWVycygpXG4gICAgICAuZ2V0QXJyYXkoKVxuICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldCgndGl0bGUnKSAhPT0gJ2JhY2tncm91bmQnKTtcbiAgfVxuXG4gIGNoYW5nZVZpc2liaWxpdHkobGF5ZXI6IEJhc2VMYXllcikge1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnNpbmdsZUxheWVyKSB7XG4gICAgICB0aGlzLm1hcExheWVycy5mb3JFYWNoKChsYXllcikgPT4gbGF5ZXIuc2V0VmlzaWJsZShmYWxzZSkpO1xuICAgICAgbGF5ZXIuc2V0VmlzaWJsZSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5ZXIuc2V0VmlzaWJsZSghbGF5ZXIuZ2V0VmlzaWJsZSgpKTtcbiAgICB9XG4gICAgdGhpcy5tYXAudXBkYXRlU2l6ZSgpO1xuICB9XG5cbiAgY2hhbmdlU2luZ2xlTGF5ZXIoJGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnNpbmdsZUxheWVyID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlQXV0b0xheWVyKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5hdXRvbWF0aWNMYXllcnMgPSAkZXZlbnQ7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmF1dG9tYXRpY0xheWVycykge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuaWdub3JlQXV0b0xheWVyO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXllclZpc2libGVJZHgoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwTGF5ZXJzLm1hcCgobGF5ZXIsIGlkeCkgPT4gKGxheWVyLmdldFZpc2libGUoKSA/IGlkeCA6IDApKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnJlc2V0V21zRmVhdHVyZXMoKSk7XG4gIH1cbn1cbiIsIjxwcnktd2lkZ2V0LW1hcC1jc3M+PC9wcnktd2lkZ2V0LW1hcC1jc3M+XG48ZGl2IGNsYXNzPVwiby13aWRnZXQgby13aWRnZXQtLW1hcFwiPlxuICA8cHJ5LXdpZGdldC1oZWFkZXJcbiAgICBbZGF0YXNvdXJjZUlkc109XCIoZGF0YXNvdXJjZUlkcyQgfCBhc3luYykgPz8gW11cIlxuICAgICpuZ0lmPVwiZGlzcGxheUhlYWRlciQgfCBhc3luY1wiXG4gICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICBbbWFuaWZlc3RdPVwibWFuaWZlc3RcIlxuICAgIChtYW5pZmVzdE1vZGlmaWVkKT1cIm1hbmlmZXN0TW9kaWZpZWQuZW1pdCgkZXZlbnQpXCJcbiAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgICNoZWFkZXJcbiAgPlxuICAgIDxwcnktc2V0dGluZ3NcbiAgICAgIChzYXZlVHJpZ2dlcmVkKT1cImVtaXRNYW5pZmVzdCgpXCJcbiAgICAgIChjaGFuZ2VUaXRsZSk9XCJjaGFuZ2VXaWRnZXRUaXRsZSgkZXZlbnQpXCJcbiAgICAgIFtoZWFkZXJQcmVzZW50XT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICAgIFtoZWFkZXJdPVwiaGVhZGVyXCJcbiAgICAgIFtvcGVuJF09XCJvcGVuJFwiXG4gICAgICBjbGFzcz1cIm8tc2V0dGluZ3NcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9zdHlsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAuc3R5bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU3R5bGUoJGV2ZW50KVwiXG4gICAgICAgICAgW2l0ZW1zQXNPcHRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgW2l0ZW1zXT1cInN0eWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc3R5bGVcIlxuICAgICAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICBiaW5kVmFsdWU9XCJpZGVudGlmaWVyXCJcbiAgICAgICAgICBpZD1cIm1hcF9zdHlsZVwiXG4gICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIiAqbmdJZj1cIm9wdGlvbnNDb3B5LnN0eWxlID09PSBTVFlMRV9GUk9NX1VSTFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwic3R5bGVfVVJMXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zdHlsZVVybCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgaWQ9XCJzdHlsZV9VUkxcIlxuICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgKGlucHV0KT1cImNoYW5nZVN0eWxlVVJMKCRldmVudClcIlxuICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25zQ29weS5zdHlsZVVSTCA/PyAnJ1wiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VTaW5nbGVMYXllcigkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc2luZ2xlTGF5ZXIgPz8gZmFsc2VcIj5cbiAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zaW5nbGVMYXllcicgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VBdXRvTGF5ZXIoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmF1dG9tYXRpY0xheWVycyA/PyBmYWxzZVwiPlxuICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmF1dG9MYXllcicgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VGaXQoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmZpdCA/PyBmYWxzZVwiPlxuICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmZpdCcgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VBdHRyaWJ1dGlvbnMoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmF0dHJpYnV0aW9ucyA/PyBmYWxzZVwiPlxuICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmF0dHJpYnV0aW9ucycgfCBpMThuIH19XG4gICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm8tc2V0dGluZ3NfX3BvcHVwX19jb250ZW50X19hY3Rpb25zIC1oYXMtc2VwYXJhdG9yXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRMYXllcigpXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IC1saW5rLWxpa2VcIj5cbiAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImxpYnJhcnlfYWRkXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmFkZExheWVyJyB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbGF5ZXIgb2Ygb3B0aW9uc0NvcHk/LmxheWVyczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkc19faGVhZFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImEtaDMgc2V0dGluZ3MtbGF5ZXItdGl0bGVfX3RpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllcicgfCBpMThuIDogeyBpbmRleDogaSArIDEgfSB9fTwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwiaW52ZXJ0TGF5ZXJzKGksIGkgLSAxKVwiICpuZ0lmPVwiaSA+IDBcIj5cbiAgICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS5hY3Rpb24ubW92ZVVwJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbnZlcnRMYXllcnMoaSwgaSArIDEpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpIDwgKG9wdGlvbnNDb3B5Py5sYXllcnM/Lmxlbmd0aCA/PyAwKSAtIDFcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImZsZWNoZV9iYXNcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLm1vdmVEb3duJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8tc2V0dGluZ3NfX3BvcHVwX19jb250ZW50X19maWVsZHNfX2NvbnRlbnRcIj5cbiAgICAgICAgICA8cHJ5LXJhbmdlXG4gICAgICAgICAgICBbbmdNb2RlbF09XCIobGF5ZXI/Lm9wYWNpdHkgPz8gMTAwKSArICcnXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZU9wYWNpdHkobGF5ZXIsICRldmVudClcIlxuICAgICAgICAgICAgbGFiZWxUcmFuc2xhdGU9XCJAcHJ5LndpZGdldC5tYXAub3BhY2l0eVwiXG4gICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgPjwvcHJ5LXJhbmdlPlxuXG4gICAgICAgICAgPGZpZWxkc2V0PlxuICAgICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllck9wdGlvbnMnIHwgaTE4biA6IHsgaW5kZXg6IGkgKyAxIH0gfX08L2xlZ2VuZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllclRpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclRpdGxlJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cIm1hcF9sYXllclRpdGxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VUaXRsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnRpdGxlID8/ICcnXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCIhWydnZW9zZXJ2ZXInLCAnYXV0byddLmluY2x1ZGVzKGxheWVyLnR5cGUpXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbGF5ZXJUeXBlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUudGl0bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTGF5ZXJUeXBlKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgIFtiaW5kRGF0YV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNBc09wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwibGF5ZXJUeXBlc1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsVHJhbnNsYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyLnR5cGVcIlxuICAgICAgICAgICAgICAgIGJhc2VUcmFuc2xhdGU9XCJAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLlwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIGlkPVwibWFwX2xheWVyVHlwZVwiXG4gICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyZWxhdGlvbicgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnd21zJyAmJlxuICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXRzJyAmJlxuICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdnZW9zZXJ2ZXInICYmXG4gICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2ZlYXR1cmVsYXllcicgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAndmVjdG9ydGlsZScgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAncmFzdGVydGlsZScgJiZcbiAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnYXV0bydcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX2NsYXNzZXNcIj57eyAnQHByeS53aWRnZXQubWFwLmNsYXNzZXMnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2xhc3NlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zQXNPcHRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNsYXNzZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5jbGFzc2VzXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIGlkPVwibWFwX2NsYXNzZXNcIlxuICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGZpZWxkc2V0XG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyZWxhdGlvbicgJiZcbiAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXMnICYmXG4gICAgICAgICAgICBsYXllci50eXBlICE9PSAnd210cycgJiZcbiAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdnZW9zZXJ2ZXInICYmXG4gICAgICAgICAgICBsYXllci50eXBlICE9PSAnZmVhdHVyZWxheWVyJyAmJlxuICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3ZlY3RvcnRpbGUnICYmXG4gICAgICAgICAgICBsYXllci50eXBlICE9PSAncmFzdGVydGlsZSdcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sb2NhdGlvbkF0dHInIHwgaTE4biB9fTwvbGVnZW5kPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGxheWVyXG4gICAgICAgICAgICAgICAgfCBnZW9tZXRyeUZpZWxkc0ZvciA6IHsgcmVzdWx0U2V0OiByZXN1bHRTZXQkLCBjbGFzc2VzOiBsYXllci5jbGFzc2VzLCB0eXBlOiBsYXllci50eXBlIH1cbiAgICAgICAgICAgICAgICB8IGFzeW5jIGFzIGZpZWxkc1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgWydoZWF0bWFwJywgJ2J1YmJsZScsICdtYXJrZXInLCAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJywgJ211bHRpLWxpbmUnLCAnbXVsdGktcG9seWdvbiddLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICBsYXllci50eXBlXG4gICAgICAgICAgICAgICAgKSA+PSAwXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX2xvY2F0aW9uQXR0cmlidXRlX2JvdGhcIj57e1xuICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sb2NhdGlvbkF0dHJpYnV0ZS5ib3RoJyB8IGkxOG5cbiAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUxvY2F0aW9uQXR0cmlidXRlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNBc09wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sb2NhdGlvbkF0dHJpYnV0ZV9ib3RoXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1wcnktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiWydoZWF0bWFwJywgJ2J1YmJsZSddLmluZGV4T2YobGF5ZXIudHlwZSkgPj0gMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9pbnRlbnNpdHlBdHRyaWJ1dGVcIj57e1xuICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5pbnRlbnNpdHlBdHRyaWJ1dGUnIHwgaTE4blxuICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlSW50ZW5zaXR5QXR0cmlidXRlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNBc09wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXJIYXNJbnRlbnNpdHkobGF5ZXIpLmludGVuc2l0eUF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfaW50ZW5zaXR5QXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1wcnktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuXG4gICAgICAgIDxmaWVsZHNldFxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBsYXllci50eXBlID09PSAnd21zJyB8fFxuICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3dtdHMnIHx8XG4gICAgICAgICAgICBsYXllci50eXBlID09PSAnZmVhdHVyZWxheWVyJyB8fFxuICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3ZlY3RvcnRpbGUnIHx8XG4gICAgICAgICAgICBsYXllci50eXBlID09PSAncmFzdGVydGlsZSdcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC50aWxlJyB8IGkxOG4gfX08L2xlZ2VuZD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc191cmxcIj57eyAnQHByeS53aWRnZXQubWFwLndtcy51cmwnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX3VybFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlVXJsKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnVybFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ3dtcycgfHwgbGF5ZXIudHlwZSA9PT0gJ3dtdHMnXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc19wYXJhbUxheWVyXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMucGFyYW1MYXllcicgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfcGFyYW1MYXllclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1MYXllcigkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5wYXJhbUxheWVyXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX21hdHJpeFNldFwiPnt7ICdAcHJ5LndpZGdldC5tYXAud21zLm1hdHJpeFNldCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfbWF0cml4U2V0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VNYXRyaXhTZXQoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwibGF5ZXIubWF0cml4U2V0XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX3N0eWxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMuc3R5bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX3N0eWxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VQYXJhbVN0eWxlKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnN0eWxlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd21zJ1wiPlxuICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VQYXJhbVRpbGVkKCRldmVudCwgbGF5ZXIpXCIgW25nTW9kZWxdPVwibGF5ZXI/LnBhcmFtVGlsZWQgPz8gZmFsc2VcIj5cbiAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMucGFyYW1UaWxlZCcgfCBpMThuIH19XG4gICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICA8ZmllbGRzZXQgKm5nSWY9XCJsYXllci50eXBlID09PSAnbWFya2VyJ1wiPlxuICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAuY2x1c3RlcmluZycgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbHVzdGVyZWQobGF5ZXIsICRldmVudClcIiBbbmdNb2RlbF09XCJsYXllci5jbHVzdGVyZWRcIj5cbiAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5jbHVzdGVyZWQnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImxheWVyLmNsdXN0ZXJlZFwiPlxuICAgICAgICAgICAgPHByeS1yYW5nZVxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5jbHVzdGVyZWRcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbHVzdGVyRGlzdGFuY2UobGF5ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICBsYWJlbFRyYW5zbGF0ZT1cIkBwcnkud2lkZ2V0Lm1hcC5jbHVzdGVyRGlzdGFuY2VcIlxuICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgbWF4PVwiNTAwXCJcbiAgICAgICAgICAgID48L3ByeS1yYW5nZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJvcHRpb25zQ29weS5hdHRyaWJ1dGlvbnNcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiYXR0cmlidXRpb25cIj57eyAnQHByeS53aWRnZXQubWFwLmF0dHJpYnV0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgaWQ9XCJhdHRyaWJ1dGlvblwiXG4gICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlQXR0cmlidXRpb24oJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLmF0dHJpYnV0aW9uID8gbGF5ZXIuYXR0cmlidXRpb24gOiAnJ1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVMYXllcihpLCBsYXllcilcIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCAtbGluay1saWtlXCJcbiAgICAgICAgICAqbmdJZj1cImxheWVyLnR5cGUgIT09ICdnZW9zZXJ2ZXInXCJcbiAgICAgICAgICBkYXRhLWZ1bmM9XCJkZWxldGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJkZWxldGVcIiBbd2lkdGhdPVwiMTlcIiBbaGVpZ2h0XT1cIjE5XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAnQHByeS53aWRnZXQubWFwLmRlbGV0ZUxheWVyJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9wcnktc2V0dGluZ3M+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG5cbiAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwIC1zZWxlY3Rpb24tY2hvaWNlXCIgW3N0eWxlLnRyYW5zZm9ybV09XCJib3R0b21MZWZ0JCB8IGFzeW5jXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGJhc2ljQWN0aW9ucyQgfCBhc3luY1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCJcbiAgICAgICAgKGNsaWNrKT1cImludGVyYWN0aW9uTWFuYWdlci5zZWxlY3Rpb25JbnRlcmFjdGlvbi5jaGFuZ2VTZWxlY3Rpb24oYWN0aW9uKVwiXG4gICAgICAgIFtjbGFzcy4tc2VsZWN0ZWRdPVwiaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkludGVyYWN0aW9uLnNlbGVjdGlvblR5cGUgPT09IGFjdGlvblwiXG4gICAgICAgIFtwcnlUb29sdGlwXT1cImluZm9Ub29sdGlwQWN0aW9uXCJcbiAgICAgICAgcHJ5VG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImluZm9Ub29sdGlwQWN0aW9uXCJcbiAgICAgICAgW3ByeVRvb2x0aXBDb250ZXh0XT1cInsgYWN0aW9uOiBhY3Rpb24gfVwiXG4gICAgICA+XG4gICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCJhY3Rpb25cIj48L3ByeS1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC4nICsgYWN0aW9uIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgaWQ9XCJleHBvcnRfY2FyZFwiXG4gICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgYXJpYS1jb250cm9scz1cImV4cG9ydF90eXBlXCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgIFtwcnlUb29sdGlwXT1cImluZm9Ub29sdGlwRG93blwiXG4gICAgICBwcnlUb29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYS1kZXNjcmliZWRieT1cImluZm9Ub29sdGlwRG93bl93aWRnZXRNYXBcIlxuICAgICAgKm5nSWY9XCIoYWN0aW9ucyQgfCBhc3luYyk/LmluY2x1ZGVzKCdleHBvcnQnKVwiXG4gICAgPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmaWxlX2Rvd25sb2FkXCIgKGNsaWNrKT1cImV4cG9ydCgpXCI+PC9wcnktaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmV4cG9ydCcgfCBpMThuIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJvbC1jb250cm9sIG0tbGF5ZXItc3dpdGNoZXJcIlxuICAgICpuZ0lmPVwiKChsYXllcnMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cImxheWVyc1RvcCQgfCBhc3luY1wiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm0tbGF5ZXItc3dpdGNoZXJfX3RvZ2dsZVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTGF5ZXJzV2luZG93KClcIlxuICAgICAgW3RpdGxlXT1cIidAcHJ5LndpZGdldC5tYXAuc2VsZWN0TGF5ZXJzJyB8IGkxOG5cIlxuICAgID5cbiAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibGF5ZXJzXCIgW3dpZHRoXT1cIjIyXCIgW2hlaWdodF09XCIyMlwiPjwvcHJ5LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGF5ZXIgb2YgbWFwTGF5ZXJzOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm0tbGF5ZXItc3dpdGNoZXJfX3RpdGxlXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxheWVyc1RhYk9wZW5cIj5cbiAgICAgICAge3sgbGF5ZXIuZ2V0KCd0aXRsZScpIH19XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKG9wdGlvbnMkIHwgYXN5bmMpPy5zaW5nbGVMYXllcjsgZWxzZSBzaW5nbGVMYXllclwiPlxuICAgICAgICAgIDxwcnktY2hlY2tib3ggW25nTW9kZWxdPVwibGF5ZXIuZ2V0VmlzaWJsZSgpXCIgKGNoYW5nZSk9XCJjaGFuZ2VWaXNpYmlsaXR5KGxheWVyKVwiPjwvcHJ5LWNoZWNrYm94PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVMYXllcj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBuYW1lPVwibGF5ZXJcIlxuICAgICAgICAgICAgW2lkXT1cIidyYWRpby1sYXllci0nICsgbGF5ZXIuZ2V0KCd0aXRsZScpLnNwbGl0KCcgJylbMF1cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXJWaXNpYmxlSWR4XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpbmRleFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVZpc2liaWxpdHkobGF5ZXIpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm9sLWNvbnRyb2wgbS1sYXllci1sZWdlbmRcIlxuICAgICpuZ0lmPVwiKChsZWdlbmRMYXllcnMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cImxlZ2VuZFRvcCQgfCBhc3luY1wiXG4gID5cbiAgICA8YnV0dG9uIGNsYXNzPVwibS1sYXllci1sZWdlbmRfX3RvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVMZWdlbmRXaW5kb3coKVwiIFt0aXRsZV09XCInQHByeS53aWRnZXQubWFwLmxlZ2VuZHMnIHwgaTE4blwiPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJsZWdlbmRcIiBbd2lkdGhdPVwiMjJcIiBbaGVpZ2h0XT1cIjIyXCI+PC9wcnktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBnZW9MYXllciBvZiBsZWdlbmRMYXllcnMkIHwgYXN5bmM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1sYXllci1sZWdlbmRfX3RpdGxlXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW5cIj5cbiAgICAgICAge3sgZ2VvTGF5ZXIudGl0bGUgfX1cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTGF5ZXJSZW5kZXJlZChnZW9MYXllcilcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibS1sYXllci1sZWdlbmRfX3RvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVMZWdlbmQoaW5kZXgpXCI+XG4gICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgW2ljb25TdmddPVwibGVnZW5kVGFiID09PSBpbmRleCA/ICdjaGV2cm9uX3RvcCcgOiAnY2hldnJvbl9ib3R0b20nXCJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cIjIyXCJcbiAgICAgICAgICAgICAgW2hlaWdodF09XCIyMlwiXG4gICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiPlxuICAgICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCInY2xvc2UnXCIgW3dpZHRoXT1cIjIyXCIgW2hlaWdodF09XCIyMlwiPjwvcHJ5LWljb24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibS1sYXllci1sZWdlbmRfX2ltYWdlXCJcbiAgICAgICAgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW4gfHwgbGVnZW5kVGFiICE9PSBpbmRleCB8fCAhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiXG4gICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cImxlZ2VuZEhlaWdodCQgfCBhc3luY1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZW9MYXllciB8IGxlZ2VuZFVybCA6IHsgY2FwYWJpbGl0aWVzOiAod21zQ2FwYWJpbGl0aWVzJCB8IGFzeW5jKSB9IGFzIHVybFwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgIFthbHRdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmQnIHwgaTE4biA6IHsgbGF5ZXI6IGdlb0xheWVyLnRpdGxlIH1cIlxuICAgICAgICAgICAgKGVycm9yKT1cImltYWdlTm90UHJvdmlkZWRbaW5kZXhdID0gdHJ1ZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGdlb0xheWVyIHwgbGVnZW5kVXJsIDogeyBjYXBhYmlsaXRpZXM6ICh3bXNDYXBhYmlsaXRpZXMkIHwgYXN5bmMpIH0pXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtLWxheWVyLWxlZ2VuZF9fZXJyb3JcIj57eyAnQHByeS53aWRnZXQubWFwLmxlZ2VuZE5vdFByb3ZpZGVkJyB8IGkxOG4gfX08L3A+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHQkIHwgYXN5bmNcIiBjbGFzcz1cIm8tbWFwLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tYXBcIj5cbiAgICAgIDxkaXYgI21hcFJlZiBpZD1cIm1hcFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2luZm9Ub29sdGlwQWN0aW9uIGxldC1hY3Rpb249XCJhY3Rpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwibS10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIiBpZD1cImluZm9Ub29sdGlwQWN0aW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPnt7ICdAcHJ5LndpZGdldC5tYXAuJyArIGFjdGlvbiB8IGkxOG4gfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICNpbmZvVG9vbHRpcERvd24+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCIgaWQ9XCJpbmZvVG9vbHRpcERvd25fd2lkZ2V0TWFwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPnt7ICdAcHJ5LndpZGdldC5tYXAuZXhwb3J0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiAjcG9wdXAgY2xhc3M9XCJtLXRvb2x0aXAgbS10b29sdGlwLS1wb3B1cFwiIFtoaWRkZW5dPVwidHJ1ZVwiIHJvbGU9XCJ0b29sdGlwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcC0tcG9wdXBfX2hlYWRlclwiPlxuICAgICAgPHA+e3sgdGhpcy50b29sdGlwSW5kZXggKyAxIH19IC8ge3sgdGhpcy50b29sdGlwTnVtYmVyIH19PC9wPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9vbHRpcE1vdmUoLTEpXCIgW2Rpc2FibGVkXT1cIiF0b29sdGlwQ2FuTW92ZSgtMSlcIj5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJhcnJvd19iYWNrXCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9vbHRpcE1vdmUoMSlcIiBbZGlzYWJsZWRdPVwiIXRvb2x0aXBDYW5Nb3ZlKDEpXCI+XG4gICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiYXJyb3dfcmlnaHRcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcC0tcG9wdXBfX2NvbnRhaW5lclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAjcG9wdXBDb250ZW50PjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgICNhZGRyZXNzXG4gICAgY2xhc3M9XCJtLXRvb2x0aXAgbS10b29sdGlwLS1hZGRyZXNzIHRvb2x0aXAtYWRkcmVzc1wiXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiJ25vbmUnXCJcbiAgICAoY2xpY2spPVwiaGlkZUFkZHJlc3MoKVwiXG4gID48L2Rpdj5cbjwvZGl2PlxuIl19
|