@c8y/ngx-components 1021.78.7 → 1021.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/asset-property/asset-property.model.d.ts +33 -0
- package/core/asset-property/asset-property.model.d.ts.map +1 -0
- package/core/asset-property/asset-property.service.d.ts +20 -0
- package/core/asset-property/asset-property.service.d.ts.map +1 -0
- package/core/common/virtual-scroll/virtual-scroller-wrapper.component.d.ts +7 -1
- package/core/common/virtual-scroll/virtual-scroller-wrapper.component.d.ts.map +1 -1
- package/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.d.ts +23 -0
- package/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.d.ts.map +1 -0
- package/core/data-grid/column/tree-node-column/tree-node.data-grid-column.d.ts +23 -0
- package/core/data-grid/column/tree-node-column/tree-node.data-grid-column.d.ts.map +1 -0
- package/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.d.ts +6 -0
- package/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/asset-property-grid.component.d.ts +31 -0
- package/core/data-grid/configure-custom-column/asset-property-grid.component.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/configure-custom-column.service.d.ts +17 -0
- package/core/data-grid/configure-custom-column/configure-custom-column.service.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/identifier.cell-renderer.component.d.ts +9 -0
- package/core/data-grid/configure-custom-column/identifier.cell-renderer.component.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/identifier.data-grid-column.d.ts +6 -0
- package/core/data-grid/configure-custom-column/identifier.data-grid-column.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/tags.cell-renderer.components.d.ts +9 -0
- package/core/data-grid/configure-custom-column/tags.cell-renderer.components.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/tags.data-grid-column.d.ts +6 -0
- package/core/data-grid/configure-custom-column/tags.data-grid-column.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/title.cell-renderer.component.d.ts +9 -0
- package/core/data-grid/configure-custom-column/title.cell-renderer.component.d.ts.map +1 -0
- package/core/data-grid/configure-custom-column/title.data-grid-column.d.ts +6 -0
- package/core/data-grid/configure-custom-column/title.data-grid-column.d.ts.map +1 -0
- package/core/data-grid/data-grid.component.d.ts +33 -6
- package/core/data-grid/data-grid.component.d.ts.map +1 -1
- package/core/data-grid/data-grid.model.d.ts +13 -1
- package/core/data-grid/data-grid.model.d.ts.map +1 -1
- package/core/data-grid/data-grid.module.d.ts.map +1 -1
- package/core/data-grid/filter-chip/filter-mapper.module.d.ts.map +1 -1
- package/core/data-grid/grid-data-source.d.ts +11 -2
- package/core/data-grid/grid-data-source.d.ts.map +1 -1
- package/core/data-grid/index.d.ts +4 -1
- package/core/data-grid/index.d.ts.map +1 -1
- package/esm2022/branding/shared/lazy/branding/branding.component.mjs +2 -2
- package/esm2022/context-dashboard/dashboard-manager/type-dashboard-target-assets-grid/type-dashboard-target-assets-grid.component.mjs +1 -1
- package/esm2022/context-dashboard/dashboard-manager/type-dashboards-list/type-dashboards-list.component.mjs +1 -1
- package/esm2022/core/asset-property/asset-property.model.mjs +2 -0
- package/esm2022/core/asset-property/asset-property.service.mjs +84 -0
- package/esm2022/core/common/virtual-scroll/virtual-scroller-wrapper.component.mjs +25 -6
- package/esm2022/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.mjs +87 -0
- package/esm2022/core/data-grid/column/tree-node-column/tree-node.data-grid-column.mjs +15 -0
- package/esm2022/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.mjs +15 -0
- package/esm2022/core/data-grid/configure-custom-column/asset-property-grid.component.mjs +131 -0
- package/esm2022/core/data-grid/configure-custom-column/configure-custom-column.component.mjs +3 -3
- package/esm2022/core/data-grid/configure-custom-column/configure-custom-column.service.mjs +51 -0
- package/esm2022/core/data-grid/configure-custom-column/identifier.cell-renderer.component.mjs +20 -0
- package/esm2022/core/data-grid/configure-custom-column/identifier.data-grid-column.mjs +26 -0
- package/esm2022/core/data-grid/configure-custom-column/tags.cell-renderer.components.mjs +20 -0
- package/esm2022/core/data-grid/configure-custom-column/tags.data-grid-column.mjs +25 -0
- package/esm2022/core/data-grid/configure-custom-column/title.cell-renderer.component.mjs +20 -0
- package/esm2022/core/data-grid/configure-custom-column/title.data-grid-column.mjs +26 -0
- package/esm2022/core/data-grid/data-grid.component.mjs +104 -58
- package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
- package/esm2022/core/data-grid/data-grid.module.mjs +1 -1
- package/esm2022/core/data-grid/filter-chip/filter-mapper.module.mjs +3 -2
- package/esm2022/core/data-grid/grid-data-source.mjs +92 -22
- package/esm2022/core/data-grid/index.mjs +5 -2
- package/esm2022/device-grid/device-grid.component.mjs +1 -1
- package/esm2022/device-profile/device-profile-list.component.mjs +1 -1
- package/esm2022/device-provisioned-certificates/device-tab-provisioned-certificates.component.mjs +1 -1
- package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +1 -1
- package/esm2022/files-repository/files-repository.component.mjs +1 -1
- package/esm2022/messaging-management/messaging/topic/topic-list-view.component.mjs +2 -2
- package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.mjs +2 -2
- package/esm2022/operations/bulk-single-operations-list/single-operations-list.component.mjs +2 -2
- package/esm2022/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.mjs +2 -2
- package/esm2022/repository/configuration/list/configuration-list.component.mjs +1 -1
- package/esm2022/repository/firmware/list/firmware-list.component.mjs +1 -1
- package/esm2022/repository/software/list/software-list.component.mjs +1 -1
- package/esm2022/search/search-grid.component.mjs +1 -1
- package/esm2022/services/services-device-tab/services-device-tab.component.mjs +1 -1
- package/esm2022/sub-assets/sub-assets-grid.component.mjs +1 -1
- package/esm2022/tenants/tenant-list/tenant-list.component.mjs +1 -1
- package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +2 -2
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-xQgHuomT.mjs +233 -0
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-xQgHuomT.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-c8y-ngx-components-D2rmddmn.mjs +36873 -0
- package/fesm2022/c8y-ngx-components-c8y-ngx-components-D2rmddmn.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -2
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +2 -2
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +1 -36518
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +36 -0
- package/package.json +1 -1
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { CdkHeaderCell, CdkTable } from '@angular/cdk/table';
|
|
2
|
-
import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Inject, Input, Optional, Output, QueryList, ViewChild, ViewChildren, ViewContainerRef, forwardRef } from '@angular/core';
|
|
2
|
+
import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Inject, Input, Optional, Output, QueryList, ViewChild, ViewChildren, ViewContainerRef, forwardRef, inject } from '@angular/core';
|
|
3
3
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
4
4
|
import { ActivatedRoute } from '@angular/router';
|
|
5
5
|
import { parseInt as _parseInt, castArray, flow, get, indexOf, isEmpty, isNil, union, uniqBy, without } from 'lodash-es';
|
|
6
|
-
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
7
6
|
import { BehaviorSubject, Subject, combineLatest, forkJoin, isObservable, merge, of, pipe } from 'rxjs';
|
|
8
7
|
import { combineLatestWith, concatMap, debounceTime, delay, distinctUntilChanged, filter, first, map, mergeMap, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';
|
|
9
8
|
import { AlertService } from '../alert/alert.service';
|
|
@@ -17,7 +16,8 @@ import { ActionControlsExtensionService } from './action-controls-extension.serv
|
|
|
17
16
|
import { ColumnDirective } from './column/column.directive';
|
|
18
17
|
import { CustomColumn } from './column/custom.column';
|
|
19
18
|
import { ExpandableRowColumn } from './column/expandable-row-column/expandable.data-grid-column';
|
|
20
|
-
import {
|
|
19
|
+
import { TreeNodeColumn } from './column/tree-node-column/tree-node.data-grid-column';
|
|
20
|
+
import { CustomColumnService } from './configure-custom-column/configure-custom-column.service';
|
|
21
21
|
import { DATA_GRID_CONFIGURATION_STRATEGY } from './data-grid-configuration.model';
|
|
22
22
|
import { BuiltInActionType, FilteringActionType, minColumnGridTrackSize, ratiosByColumnTypes } from './data-grid.model';
|
|
23
23
|
import { DataGridService } from './data-grid.service';
|
|
@@ -28,31 +28,30 @@ import * as i0 from "@angular/core";
|
|
|
28
28
|
import * as i1 from "./data-grid.service";
|
|
29
29
|
import * as i2 from "@angular/platform-browser";
|
|
30
30
|
import * as i3 from "../product-experience/gainsight.service";
|
|
31
|
-
import * as i4 from "
|
|
32
|
-
import * as i5 from "
|
|
33
|
-
import * as i6 from "
|
|
34
|
-
import * as i7 from "@angular/
|
|
35
|
-
import * as i8 from "@angular/
|
|
36
|
-
import * as i9 from "@angular/cdk/
|
|
37
|
-
import * as i10 from "@angular/
|
|
38
|
-
import * as i11 from "
|
|
39
|
-
import * as i12 from "../
|
|
40
|
-
import * as i13 from "../
|
|
41
|
-
import * as i14 from "../
|
|
42
|
-
import * as i15 from "
|
|
43
|
-
import * as i16 from "ngx-bootstrap/
|
|
44
|
-
import * as i17 from "ngx-bootstrap/
|
|
45
|
-
import * as i18 from "ngx-bootstrap/
|
|
46
|
-
import * as i19 from "
|
|
47
|
-
import * as i20 from "
|
|
48
|
-
import * as i21 from "
|
|
49
|
-
import * as i22 from "./column/
|
|
50
|
-
import * as i23 from "
|
|
51
|
-
import * as i24 from "../
|
|
52
|
-
import * as i25 from "
|
|
53
|
-
import * as i26 from "./filter-chip/filter-
|
|
54
|
-
import * as i27 from "./
|
|
55
|
-
import * as i28 from "./visible-controls.pipe";
|
|
31
|
+
import * as i4 from "../alert/alert.service";
|
|
32
|
+
import * as i5 from "./action-controls-extension.service";
|
|
33
|
+
import * as i6 from "@angular/router";
|
|
34
|
+
import * as i7 from "@angular/common";
|
|
35
|
+
import * as i8 from "@angular/cdk/table";
|
|
36
|
+
import * as i9 from "@angular/cdk/drag-drop";
|
|
37
|
+
import * as i10 from "@angular/forms";
|
|
38
|
+
import * as i11 from "../common/icon.directive";
|
|
39
|
+
import * as i12 from "../i18n/c8y-translate.directive";
|
|
40
|
+
import * as i13 from "../common/loading.component";
|
|
41
|
+
import * as i14 from "../modal/popover-confirm.component";
|
|
42
|
+
import * as i15 from "ngx-bootstrap/dropdown";
|
|
43
|
+
import * as i16 from "ngx-bootstrap/popover";
|
|
44
|
+
import * as i17 from "ngx-bootstrap/tooltip";
|
|
45
|
+
import * as i18 from "ngx-bootstrap/pagination";
|
|
46
|
+
import * as i19 from "../product-experience/product-experience.directive";
|
|
47
|
+
import * as i20 from "@angular/cdk/a11y";
|
|
48
|
+
import * as i21 from "./column/cell-renderer.component";
|
|
49
|
+
import * as i22 from "./column/filtering-form-renderer.component";
|
|
50
|
+
import * as i23 from "../i18n/c8y-translate.pipe";
|
|
51
|
+
import * as i24 from "../common/map-function.pipe";
|
|
52
|
+
import * as i25 from "./filter-chip/filter-mapper.pipe";
|
|
53
|
+
import * as i26 from "./filter-chip/grouped-filter-chips.pipe";
|
|
54
|
+
import * as i27 from "./visible-controls.pipe";
|
|
56
55
|
var SortingOrder;
|
|
57
56
|
(function (SortingOrder) {
|
|
58
57
|
SortingOrder["ASC"] = "asc";
|
|
@@ -106,12 +105,19 @@ export class DataGridComponent {
|
|
|
106
105
|
set _headerActionControls(headerActionControls) {
|
|
107
106
|
this.headerActionControls = headerActionControls || [];
|
|
108
107
|
}
|
|
109
|
-
|
|
108
|
+
/**
|
|
109
|
+
* In a client side data fed tree-grid, this input determines the name of the
|
|
110
|
+
* property holding the child nodes of the current node.
|
|
111
|
+
* Default value is `childNodes`.
|
|
112
|
+
*/
|
|
113
|
+
set childNodesProperty(childNodesProperty) {
|
|
114
|
+
this.dataSource.childNodesProperty = childNodesProperty;
|
|
115
|
+
}
|
|
116
|
+
constructor(configurationStrategy, dataGridService, sanitizer, gainsightService, alertService, actionControlsService, route) {
|
|
110
117
|
this.configurationStrategy = configurationStrategy;
|
|
111
118
|
this.dataGridService = dataGridService;
|
|
112
119
|
this.sanitizer = sanitizer;
|
|
113
120
|
this.gainsightService = gainsightService;
|
|
114
|
-
this.bsModalService = bsModalService;
|
|
115
121
|
this.alertService = alertService;
|
|
116
122
|
this.actionControlsService = actionControlsService;
|
|
117
123
|
this.route = route;
|
|
@@ -167,6 +173,11 @@ export class DataGridComponent {
|
|
|
167
173
|
this.expandableRows = 'NONE';
|
|
168
174
|
/** Determines if the Reload button will be hidden. */
|
|
169
175
|
this.hideReload = false;
|
|
176
|
+
/**
|
|
177
|
+
* In a tree-grid, this input determines the name of the property that will be used as a label
|
|
178
|
+
* to refer to the parent node its pagination row.
|
|
179
|
+
*/
|
|
180
|
+
this.parentNodeLabelProperty = 'id';
|
|
170
181
|
/** Emits an event when mouse is over a row. */
|
|
171
182
|
this.rowMouseOver = new EventEmitter();
|
|
172
183
|
/** Emits an event when mouse leaves a row. */
|
|
@@ -253,15 +264,22 @@ export class DataGridComponent {
|
|
|
253
264
|
this.manualSearch$ = new Subject();
|
|
254
265
|
this.lastManualSearchValue = '';
|
|
255
266
|
this.SEARCH_DEBOUNCE_TIME = 500;
|
|
267
|
+
this.customColumnService = inject(CustomColumnService);
|
|
256
268
|
/**
|
|
257
269
|
* Event emitter, taking boolean values used for loading data grid data with debounce.
|
|
258
270
|
* Default value is set to false. Set to true if data grid is using infinite scroll and page should be reloaded.
|
|
259
271
|
* This is used to avoid having multiple this.loadData() function calls.
|
|
260
272
|
*/
|
|
261
273
|
this.triggerLoadData = new EventEmitter();
|
|
274
|
+
this.isDataRow = (idx, row) => {
|
|
275
|
+
return !this.isPaginationRow(idx, row);
|
|
276
|
+
};
|
|
262
277
|
this.isRowExpanded = (_, row) => {
|
|
263
278
|
return !!this.expandedRows.get(row);
|
|
264
279
|
};
|
|
280
|
+
this.isPaginationRow = (_, row) => {
|
|
281
|
+
return !!row?.θpagination;
|
|
282
|
+
};
|
|
265
283
|
this.triggerLoadData.pipe(debounceTime(1), takeUntil(this.unsubscribe$)).subscribe(reload => {
|
|
266
284
|
this.loadData(reload);
|
|
267
285
|
});
|
|
@@ -364,6 +382,13 @@ export class DataGridComponent {
|
|
|
364
382
|
this.expandedRows.delete(row);
|
|
365
383
|
this.tableRef.renderRows();
|
|
366
384
|
}
|
|
385
|
+
expandNode(row) {
|
|
386
|
+
row.pagination = row.pagination ?? this.childNodePagination;
|
|
387
|
+
this.loadData(false, row);
|
|
388
|
+
}
|
|
389
|
+
collapseNode(row) {
|
|
390
|
+
this.dataSource.collapseNode(row);
|
|
391
|
+
}
|
|
367
392
|
setColumns(config) {
|
|
368
393
|
if (!!this.configurationStrategy && !isEmpty(this._columns)) {
|
|
369
394
|
this.columns = this.dataGridService.applyConfigToColumns(config, this._columns);
|
|
@@ -389,27 +414,18 @@ export class DataGridComponent {
|
|
|
389
414
|
this.pagination = { ...this.pagination, pageSize: this.minPossiblePageSize };
|
|
390
415
|
}
|
|
391
416
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
ignoreBackdropClick: true,
|
|
398
|
-
initialState: {
|
|
399
|
-
columns: this.columns
|
|
400
|
-
}
|
|
401
|
-
});
|
|
402
|
-
modalRef.content.onAddCustomColumn
|
|
403
|
-
.pipe(tap((customColumnConfig) => {
|
|
404
|
-
const firstFixedColumPosition = this.columns.indexOf(this.columns.find(column => column.positionFixed));
|
|
405
|
-
this.columns.splice(firstFixedColumPosition > -1 ? firstFixedColumPosition : this.columns.length, 0, new CustomColumn(customColumnConfig));
|
|
417
|
+
async openCustomColumn() {
|
|
418
|
+
await this.customColumnService.openCustomColumns(this.columns, config => {
|
|
419
|
+
const firstFixed = this.columns.findIndex(c => c.positionFixed);
|
|
420
|
+
const idx = firstFixed > -1 ? firstFixed : this.columns.length;
|
|
421
|
+
this.columns.splice(idx, 0, new CustomColumn(config));
|
|
406
422
|
this.updateColumns();
|
|
407
423
|
this.triggerEvent({
|
|
408
424
|
action: PX_ACTIONS.ADD_CUSTOM_COLUMN,
|
|
409
|
-
column:
|
|
425
|
+
column: config.header || config.name
|
|
410
426
|
});
|
|
411
|
-
|
|
412
|
-
|
|
427
|
+
this.onAddCustomColumn.emit(config);
|
|
428
|
+
});
|
|
413
429
|
}
|
|
414
430
|
async removeCustomColumn(poConfirm, column, ddConfigureColumns) {
|
|
415
431
|
ddConfigureColumns.autoClose = false;
|
|
@@ -568,6 +584,18 @@ export class DataGridComponent {
|
|
|
568
584
|
}
|
|
569
585
|
this.triggerEvent({ action: PX_ACTIONS.CHANGE_PAGINATION, itemsPerPage, page });
|
|
570
586
|
}
|
|
587
|
+
updateChildPagination({ itemsPerPage, page }, { parentRow }) {
|
|
588
|
+
if (page === parentRow?.pagination?.currentPage &&
|
|
589
|
+
itemsPerPage === parentRow?.pagination?.pageSize) {
|
|
590
|
+
// avoid endless loop through same page feedback
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
parentRow.pagination = {
|
|
594
|
+
currentPage: page,
|
|
595
|
+
pageSize: itemsPerPage
|
|
596
|
+
};
|
|
597
|
+
this.loadData(false, parentRow);
|
|
598
|
+
}
|
|
571
599
|
clickReload() {
|
|
572
600
|
this.searchText = '';
|
|
573
601
|
this.reload();
|
|
@@ -762,7 +790,7 @@ export class DataGridComponent {
|
|
|
762
790
|
}
|
|
763
791
|
return config;
|
|
764
792
|
}
|
|
765
|
-
loadData(reload = false) {
|
|
793
|
+
loadData(reload = false, parentRow) {
|
|
766
794
|
const { rows, columns, pagination, searchText, serverSideDataCallback, selectable, selectionPrimaryKey, infiniteScroll } = this;
|
|
767
795
|
this.dataSource.loadData({
|
|
768
796
|
rows,
|
|
@@ -773,7 +801,8 @@ export class DataGridComponent {
|
|
|
773
801
|
selectable,
|
|
774
802
|
selectionPrimaryKey,
|
|
775
803
|
infiniteScroll,
|
|
776
|
-
reload
|
|
804
|
+
reload,
|
|
805
|
+
parentRow
|
|
777
806
|
});
|
|
778
807
|
}
|
|
779
808
|
updateColumns() {
|
|
@@ -796,7 +825,14 @@ export class DataGridComponent {
|
|
|
796
825
|
}
|
|
797
826
|
: undefined;
|
|
798
827
|
const expandableRowsColumn = this.expandableRows !== 'NONE' ? new ExpandableRowColumn() : null;
|
|
799
|
-
const
|
|
828
|
+
const treeNodeColums = this.treeGrid ? new TreeNodeColumn() : null;
|
|
829
|
+
const columns = [
|
|
830
|
+
treeNodeColums,
|
|
831
|
+
expandableRowsColumn,
|
|
832
|
+
selectionColumn,
|
|
833
|
+
...this.columns,
|
|
834
|
+
actionsColumn
|
|
835
|
+
]
|
|
800
836
|
.filter(Boolean)
|
|
801
837
|
.map(this.withColumnDefaults);
|
|
802
838
|
this.columns = uniqBy(columns, 'name');
|
|
@@ -824,14 +860,16 @@ export class DataGridComponent {
|
|
|
824
860
|
return {
|
|
825
861
|
visible: true,
|
|
826
862
|
positionFixed: false,
|
|
827
|
-
resizable: true,
|
|
863
|
+
resizable: dataType === 'icon' ? false : true,
|
|
828
864
|
sortable: true,
|
|
829
865
|
sortOrder: '',
|
|
830
866
|
filterable: false,
|
|
831
867
|
...column,
|
|
832
868
|
dataType,
|
|
833
869
|
gridTrackSize: column.gridTrackSize ||
|
|
834
|
-
|
|
870
|
+
(dataType === 'icon'
|
|
871
|
+
? `max-content`
|
|
872
|
+
: `minmax(${minColumnGridTrackSize}px, ${ratiosByColumnTypes[dataType]}fr)`),
|
|
835
873
|
headerCSSClassName: (typeof headerCSSClassName === 'string'
|
|
836
874
|
? headerCSSClassName.split(' ')
|
|
837
875
|
: headerCSSClassName) || [],
|
|
@@ -1097,13 +1135,13 @@ export class DataGridComponent {
|
|
|
1097
1135
|
}
|
|
1098
1136
|
}
|
|
1099
1137
|
}
|
|
1100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, deps: [{ token: DATA_GRID_CONFIGURATION_STRATEGY, optional: true }, { token: i1.DataGridService }, { token: i2.DomSanitizer }, { token: i3.GainsightService }, { token: i4.
|
|
1101
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataGridComponent, selector: "c8y-data-grid", inputs: { title: "title", loadMoreItemsLabel: "loadMoreItemsLabel", loadingItemsLabel: "loadingItemsLabel", showSearch: "showSearch", refresh: "refresh", _columns: ["columns", "_columns"], _rows: ["rows", "_rows"], _pagination: ["pagination", "_pagination"], _infiniteScroll: ["infiniteScroll", "_infiniteScroll"], _serverSideDataCallback: ["serverSideDataCallback", "_serverSideDataCallback"], _selectable: ["selectable", "_selectable"], _singleSelection: ["singleSelection", "_singleSelection"], _selectionPrimaryKey: ["selectionPrimaryKey", "_selectionPrimaryKey"], _displayOptions: ["displayOptions", "_displayOptions"], _actionControls: ["actionControls", "_actionControls"], _bulkActionControls: ["bulkActionControls", "_bulkActionControls"], _headerActionControls: ["headerActionControls", "_headerActionControls"], searchText: "searchText", configureColumnsEnabled: "configureColumnsEnabled", showCounterWarning: "showCounterWarning", activeClassName: "activeClassName", expandableRows: "expandableRows", hideReload: "hideReload" }, outputs: { rowMouseOver: "rowMouseOver", rowMouseLeave: "rowMouseLeave", rowClick: "rowClick", onConfigChange: "onConfigChange", onBeforeFilter: "onBeforeFilter", onBeforeSearch: "onBeforeSearch", onFilter: "onFilter", itemsSelect: "itemsSelect", onReload: "onReload", onAddCustomColumn: "onAddCustomColumn", onRemoveCustomColumn: "onRemoveCustomColumn", onColumnFilterReset: "onColumnFilterReset", onSort: "onSort", onPageSizeChange: "onPageSizeChange", onColumnReordered: "onColumnReordered", onColumnVisibilityChange: "onColumnVisibilityChange" }, host: { classAttribute: "d-contents" }, providers: [
|
|
1138
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, deps: [{ token: DATA_GRID_CONFIGURATION_STRATEGY, optional: true }, { token: i1.DataGridService }, { token: i2.DomSanitizer }, { token: i3.GainsightService }, { token: i4.AlertService }, { token: i5.ActionControlsExtensionService }, { token: i6.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1139
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataGridComponent, selector: "c8y-data-grid", inputs: { title: "title", loadMoreItemsLabel: "loadMoreItemsLabel", loadingItemsLabel: "loadingItemsLabel", showSearch: "showSearch", refresh: "refresh", _columns: ["columns", "_columns"], _rows: ["rows", "_rows"], _pagination: ["pagination", "_pagination"], childNodePagination: "childNodePagination", _infiniteScroll: ["infiniteScroll", "_infiniteScroll"], _serverSideDataCallback: ["serverSideDataCallback", "_serverSideDataCallback"], _selectable: ["selectable", "_selectable"], _singleSelection: ["singleSelection", "_singleSelection"], _selectionPrimaryKey: ["selectionPrimaryKey", "_selectionPrimaryKey"], _displayOptions: ["displayOptions", "_displayOptions"], _actionControls: ["actionControls", "_actionControls"], _bulkActionControls: ["bulkActionControls", "_bulkActionControls"], _headerActionControls: ["headerActionControls", "_headerActionControls"], searchText: "searchText", configureColumnsEnabled: "configureColumnsEnabled", showCounterWarning: "showCounterWarning", activeClassName: "activeClassName", expandableRows: "expandableRows", treeGrid: "treeGrid", hideReload: "hideReload", childNodesProperty: "childNodesProperty", parentNodeLabelProperty: "parentNodeLabelProperty" }, outputs: { rowMouseOver: "rowMouseOver", rowMouseLeave: "rowMouseLeave", rowClick: "rowClick", onConfigChange: "onConfigChange", onBeforeFilter: "onBeforeFilter", onBeforeSearch: "onBeforeSearch", onFilter: "onFilter", itemsSelect: "itemsSelect", onReload: "onReload", onAddCustomColumn: "onAddCustomColumn", onRemoveCustomColumn: "onRemoveCustomColumn", onColumnFilterReset: "onColumnFilterReset", onSort: "onSort", onPageSizeChange: "onPageSizeChange", onColumnReordered: "onColumnReordered", onColumnVisibilityChange: "onColumnVisibilityChange" }, host: { classAttribute: "d-contents" }, providers: [
|
|
1102
1140
|
{
|
|
1103
1141
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
1104
1142
|
useExisting: forwardRef(() => DataGridComponent)
|
|
1105
1143
|
}
|
|
1106
|
-
], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i8.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i8.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i8.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i9.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i9.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i9.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i9.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i9.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i9.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i9.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i9.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i9.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i9.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i9.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i9.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i9.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i9.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i10.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.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: i11.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i13.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i14.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i15.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i16.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i16.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i16.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i17.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i18.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i19.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i20.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i21.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i22.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i23.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.SlicePipe, name: "slice" }, { kind: "pipe", type: i24.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i25.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i26.FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: i27.GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: i28.VisibleControlsPipe, name: "visibleControls" }] }); }
|
|
1144
|
+
], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped && !treeGrid\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex; when: isDataRow\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd',\n row.level > 0 ? 'data-grid-child-node' : ''\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <tr\n class=\"pagination-row\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [class]=\"'level-' + (row.parentRow.level + 1)\"\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--child-counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"{\n pageFirstItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize + 1,\n pageLastItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize +\n 1 +\n (row.childrenStats.currentPageSize - 1),\n itemsTotal: row.childrenStats.filteredSize\n }\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n <span class=\"text-muted text-12 m-r-4\">{{ 'Parent node' | translate }}</span>\n <span class=\"tag tag--default\">{{ row.parentRow?.[parentNodeLabelProperty] }}</span>\n </div>\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n <pagination\n class=\"d-flex j-c-end\"\n *ngIf=\"row.childrenStats.filteredSize > row.childrenStats.currentPageSize\"\n [ngModel]=\"row.childrenStats.currentPage\"\n (pageChanged)=\"updateChildPagination($event, row)\"\n [totalItems]=\"row.childrenStats.filteredSize\"\n [itemsPerPage]=\"row?.parentRow?.pagination?.pageSize ?? childNodePagination.pageSize\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i7.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i7.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i8.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i8.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i8.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i8.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i8.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i8.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i8.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i8.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i8.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i8.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i8.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i8.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i8.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i8.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.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: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i12.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i13.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i14.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i15.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i15.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i15.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i16.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i17.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i18.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i19.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i20.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i21.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i22.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.SlicePipe, name: "slice" }, { kind: "pipe", type: i23.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i24.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i25.FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: i26.GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: i27.VisibleControlsPipe, name: "visibleControls" }] }); }
|
|
1107
1145
|
}
|
|
1108
1146
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, decorators: [{
|
|
1109
1147
|
type: Component,
|
|
@@ -1112,13 +1150,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1112
1150
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
1113
1151
|
useExisting: forwardRef(() => DataGridComponent)
|
|
1114
1152
|
}
|
|
1115
|
-
], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
|
|
1153
|
+
], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped && !treeGrid\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex; when: isDataRow\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd',\n row.level > 0 ? 'data-grid-child-node' : ''\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <tr\n class=\"pagination-row\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [class]=\"'level-' + (row.parentRow.level + 1)\"\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--child-counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"{\n pageFirstItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize + 1,\n pageLastItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize +\n 1 +\n (row.childrenStats.currentPageSize - 1),\n itemsTotal: row.childrenStats.filteredSize\n }\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n <span class=\"text-muted text-12 m-r-4\">{{ 'Parent node' | translate }}</span>\n <span class=\"tag tag--default\">{{ row.parentRow?.[parentNodeLabelProperty] }}</span>\n </div>\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n <pagination\n class=\"d-flex j-c-end\"\n *ngIf=\"row.childrenStats.filteredSize > row.childrenStats.currentPageSize\"\n [ngModel]=\"row.childrenStats.currentPage\"\n (pageChanged)=\"updateChildPagination($event, row)\"\n [totalItems]=\"row.childrenStats.filteredSize\"\n [itemsPerPage]=\"row?.parentRow?.pagination?.pageSize ?? childNodePagination.pageSize\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
|
|
1116
1154
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
1117
1155
|
type: Optional
|
|
1118
1156
|
}, {
|
|
1119
1157
|
type: Inject,
|
|
1120
1158
|
args: [DATA_GRID_CONFIGURATION_STRATEGY]
|
|
1121
|
-
}] }, { type: i1.DataGridService }, { type: i2.DomSanitizer }, { type: i3.GainsightService }, { type: i4.
|
|
1159
|
+
}] }, { type: i1.DataGridService }, { type: i2.DomSanitizer }, { type: i3.GainsightService }, { type: i4.AlertService }, { type: i5.ActionControlsExtensionService }, { type: i6.ActivatedRoute }], propDecorators: { title: [{
|
|
1122
1160
|
type: Input
|
|
1123
1161
|
}], loadMoreItemsLabel: [{
|
|
1124
1162
|
type: Input
|
|
@@ -1137,6 +1175,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1137
1175
|
}], _pagination: [{
|
|
1138
1176
|
type: Input,
|
|
1139
1177
|
args: ['pagination']
|
|
1178
|
+
}], childNodePagination: [{
|
|
1179
|
+
type: Input
|
|
1140
1180
|
}], _infiniteScroll: [{
|
|
1141
1181
|
type: Input,
|
|
1142
1182
|
args: ['infiniteScroll']
|
|
@@ -1174,8 +1214,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1174
1214
|
type: Input
|
|
1175
1215
|
}], expandableRows: [{
|
|
1176
1216
|
type: Input
|
|
1217
|
+
}], treeGrid: [{
|
|
1218
|
+
type: Input
|
|
1177
1219
|
}], hideReload: [{
|
|
1178
1220
|
type: Input
|
|
1221
|
+
}], childNodesProperty: [{
|
|
1222
|
+
type: Input
|
|
1223
|
+
}], parentNodeLabelProperty: [{
|
|
1224
|
+
type: Input
|
|
1179
1225
|
}], rowMouseOver: [{
|
|
1180
1226
|
type: Output
|
|
1181
1227
|
}], rowMouseLeave: [{
|
|
@@ -1230,4 +1276,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1230
1276
|
type: ViewChild,
|
|
1231
1277
|
args: [CdkTable, { static: false }]
|
|
1232
1278
|
}] } });
|
|
1233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxRQUFRLElBQUksU0FBUyxFQUNyQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNM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TUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxzQkFBc0I7Z0JBR0csZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHckMsVUFBVTtzQkFBbkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBc0VtQixNQUFNO3NCQUFoRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWpELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrSGVhZGVyQ2VsbCwgQ2RrVGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgcGFyc2VJbnQgYXMgX3BhcnNlSW50LFxuICBjYXN0QXJyYXksXG4gIGZsb3csXG4gIGdldCxcbiAgaW5kZXhPZixcbiAgaXNFbXB0eSxcbiAgaXNOaWwsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFVuYXJ5RnVuY3Rpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZvcmtKb2luLFxuICBpc09ic2VydmFibGUsXG4gIG1lcmdlLFxuICBvZixcbiAgcGlwZVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3RXaXRoLFxuICBjb25jYXRNYXAsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IExvYWRNb3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZE1vcmVNb2RlIH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IFBvcG92ZXJDb25maXJtQnV0dG9ucywgUG9wb3ZlckNvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9wb3BvdmVyLWNvbmZpcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZVxufSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvcHJvZHVjdC1leHBlcmllbmNlLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vYWN0aW9uLWNvbnRyb2xzLWV4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxSZW5kZXJlclNwZWMgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vY3VzdG9tLmNvbHVtbic7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93Q29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vZXhwYW5kYWJsZS1yb3ctY29sdW1uL2V4cGFuZGFibGUuZGF0YS1ncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjLCBGaWx0ZXJpbmdNb2RpZmllciB9IGZyb20gJy4vY29sdW1uL2ZpbHRlcmluZy1mb3JtLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4nO1xuaW1wb3J0IHtcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIERhdGFHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5LFxuICBHcmlkQ29uZmlnQ29udGV4dCxcbiAgR3JpZENvbmZpZ1BhcnQsXG4gIEdyaWRFdmVudFR5cGVcbn0gZnJvbSAnLi9kYXRhLWdyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBBY3Rpb25Db250cm9sSG9vayxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcixcbiAgRmlsdGVyQ2hpcCxcbiAgRmlsdGVyaW5nQWN0aW9uVHlwZSxcbiAgR3JpZENvbmZpZyxcbiAgSGVhZGVyQWN0aW9uQ29udHJvbCxcbiAgUGFnaW5hdGlvbixcbiAgUm93LFxuICBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICBTb3J0T3JkZXIsXG4gIFNwZWNpYWxDb2x1bW5OYW1lLFxuICBtaW5Db2x1bW5HcmlkVHJhY2tTaXplLFxuICByYXRpb3NCeUNvbHVtblR5cGVzXG59IGZyb20gJy4vZGF0YS1ncmlkLm1vZGVsJztcbmltcG9ydCB7IERhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vZGF0YS1ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vZXhwYW5kYWJsZS1yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCdjb2x1bW5zJylcbiAgX2NvbHVtbnM6IENvbHVtbltdO1xuXG4gIGRhdGFTb3VyY2UgPSBuZXcgR3JpZERhdGFTb3VyY2UoKTtcbiAgcm93czogUm93W107XG4gIC8qKiBUaGUgbGlzdCBvZiByb3dzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZCAodXNlZCBmb3IgY2xpZW50IHNpZGUgZGF0YSkuICovXG4gIEBJbnB1dCgncm93cycpXG4gIHNldCBfcm93cyhyb3dzOiBSb3dbXSkge1xuICAgIHRoaXMucm93cyA9IHJvd3MgfHwgW107XG4gIH1cblxuICBmaWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgZmlsdGVyZWRJdGVtc0NvdW50OiAwLFxuICAgIGFsbEl0ZW1zQ291bnQ6IDBcbiAgfTtcblxuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uO1xuICBwYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgcGFnZUZpcnN0SXRlbUlkeDogMCxcbiAgICBwYWdlTGFzdEl0ZW1JZHg6IDAsXG4gICAgaXRlbXNUb3RhbDogMFxuICB9O1xuICBsYXN0Q2xpY2tlZFJvdzogUm93O1xuICByZWFkb25seSBwb3NzaWJsZVBhZ2VTaXplczogbnVtYmVyW10gPSBbMjUsIDUwLCAxMDBdO1xuICByZWFkb25seSBtaW5Qb3NzaWJsZVBhZ2VTaXplID0gTWF0aC5taW4oLi4udGhpcy5wb3NzaWJsZVBhZ2VTaXplcyk7XG4gIC8qKiBQYWdpbmF0aW9uIHNldHRpbmdzLCBlLmcuIGFsbG93cyBmb3Igc2V0dGluZyBjdXJyZW50IHBhZ2Ugb3IgcGFnZSBzaXplLiAqL1xuICBASW5wdXQoJ3BhZ2luYXRpb24nKVxuICBzZXQgX3BhZ2luYXRpb24ocGFnaW5hdGlvbjogUGFnaW5hdGlvbikge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHBhZ2luYXRpb247XG4gIH1cblxuICBpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlO1xuICAvKiogU2V0cyBsb2FkIG1vcmUgbW9kZS4gKi9cbiAgQElucHV0KCdpbmZpbml0ZVNjcm9sbCcpXG4gIHNldCBfaW5maW5pdGVTY3JvbGwoaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZSkge1xuICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBpbmZpbml0ZVNjcm9sbDtcbiAgfVxuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGRhdGEgbmVlZHMgdG8gYmUgbG9hZGVkIGZyb20gc2VydmVyLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgW1tEYXRhU291cmNlTW9kaWZpZXJdXSBhbmQgcmV0dXJuIFtbU2VydmVyU2lkZURhdGFSZXN1bHRdXS5cbiAgICovXG4gIEBJbnB1dCgnc2VydmVyU2lkZURhdGFDYWxsYmFjaycpXG4gIHNldCBfc2VydmVyU2lkZURhdGFDYWxsYmFjayhzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID0gc2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgfVxuXG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgYSBjaGVja2JveCBpbiB0aGUgZmlyc3QgY29sdW1uLiAqL1xuICBASW5wdXQoJ3NlbGVjdGFibGUnKVxuICBzZXQgX3NlbGVjdGFibGUoc2VsZWN0YWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gIH1cblxuICBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoJ3NpbmdsZVNlbGVjdGlvbicpXG4gIHNldCBfc2luZ2xlU2VsZWN0aW9uKHNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uID0gc2luZ2xlU2VsZWN0aW9uO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleSA9ICdpZCc7XG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0ncyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VsZWN0aW9uIHN0YXR1cy4gKi9cbiAgQElucHV0KCdzZWxlY3Rpb25QcmltYXJ5S2V5JylcbiAgc2V0IF9zZWxlY3Rpb25QcmltYXJ5S2V5KHNlbGVjdGlvblByaW1hcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0aW9uUHJpbWFyeUtleSA9IHNlbGVjdGlvblByaW1hcnlLZXk7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMgPSB7XG4gICAgc3RyaXBlZDogdHJ1ZSxcbiAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgZ3JpZEhlYWRlcjogdHJ1ZSxcbiAgICBmaWx0ZXI6IHRydWUsXG4gICAgaG92ZXI6IHRydWVcbiAgfTtcbiAgLyoqIFNldHMgZGlzcGxheSBvcHRpb25zLiAqL1xuICBASW5wdXQoJ2Rpc3BsYXlPcHRpb25zJylcbiAgc2V0IF9kaXNwbGF5T3B0aW9ucyhkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQubmV4dChhY3Rpb25Db250cm9scyk7XG4gIH1cblxuICBidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuICovXG4gIEBJbnB1dCgnYnVsa0FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9idWxrQWN0aW9uQ29udHJvbHMoYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5idWxrQWN0aW9uQ29udHJvbHMgPSBidWxrQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICBoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIGRhdGEgZ3JpZCBoZWFkZXIpLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyhoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5oZWFkZXJBY3Rpb25Db250cm9scyA9IGhlYWRlckFjdGlvbkNvbnRyb2xzIHx8IFtdO1xuICB9XG5cbiAgLyoqIFNldHMgaW5pdGlhbCBzZWFyY2ggdGV4dC4gKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIGN1c3RvbSBjb2x1bW5zIGJ1dHRvbiB3aWxsIGJlIGVuYWJsZWQuICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkID0gdHJ1ZTtcblxuICAvKiogU2hvd3MgdGhlIHdhcm5pbmcgZm9yIHRoZSBzdWItYXNzZXRzIGNvdW50ZXIgKi9cbiAgQElucHV0KClcbiAgc2hvd0NvdW50ZXJXYXJuaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIHJvd3MgKGxhc3QgY2xpY2tlZCkuXG4gICAqIFNldCBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZSBhcHBlbmRpbmcgYWN0aXZlIGNsYXNzIHRvIGdyaWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUNsYXNzTmFtZSA9ICdhY3RpdmUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSByb3dzIG9mIHRoZSBkYXRhIGdyaWQgd2lsbCBiZSBleHBhbmRhYmxlLlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqIC0gYE5PTkVgIC0gbm8gZXhwYW5kYWJsZSByb3dzIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIGBTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIHN5bmNocm9ub3VzbHkgd2hlbiBidXR0b24gaXMgY2xpY2tlZFxuICAgKiAtIGBBU1lOQ2AgLSBhZGRpdGlvbmFsIGNvbHVtbiB3aXRoIGV4cGFuZCBidXR0b24gaXMgZGlzcGxheWVkIGFuZCBleHBhbmRhYmxlIHJvd3MgYXJlIGV4cGFuZGluZyBhc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlUm93czogJ05PTkUnIHwgJ1NZTkMnIHwgJ0FTWU5DJyA9ICdOT05FJztcblxuICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgUmVsb2FkIGJ1dHRvbiB3aWxsIGJlIGhpZGRlbi4gKi9cbiAgQElucHV0KCkgaGlkZVJlbG9hZCA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGlzIG92ZXIgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZU92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgbGVhdmVzIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VMZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIHJvdyBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gZ3JpZCdzIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpIG9uQ29uZmlnQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBmaWx0ZXIgaXMgYXBwbGllZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkIGluIGEgY29sdW1uLiAqL1xuICBAT3V0cHV0KCkgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb2x1bW5OYW1lPzogc3RyaW5nO1xuICAgIGRyb3Bkb3duPzogQnNEcm9wZG93bkRpcmVjdGl2ZTtcbiAgICBmaWx0ZXJpbmdNb2RpZmllcj86IEZpbHRlcjtcbiAgfT4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gaXRlbXMgc2VsZWN0aW9uIGNoYW5nZXMuIFRoZSBhcnJheSBjb250YWlucyBrZXlzIG9mIHNlbGVjdGVkIGl0ZW1zIChrZXkgcHJvcGVydHkgaXMgZGVmaW5lZCBieSBgc2VsZWN0aW9uUHJpbWFyeUtleWApLiAqL1xuICBAT3V0cHV0KCkgaXRlbXNTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiByZWxvYWQgYnV0dG9uIGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBvblJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBjdXN0b20gY29sdW1uIGlzIGFkZGVkICovXG4gIEBPdXRwdXQoKSBvbkFkZEN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tQ29sdW1uQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgcmVtb3ZlZCAqL1xuICBAT3V0cHV0KCkgb25SZW1vdmVDdXN0b21Db2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGFmdGVyIHRoZSBjb2x1bW4gZmlsdGVyIGhhcyBiZWVuIHJlc2V0ICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtbkZpbHRlclJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW4+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBzb3J0aW5nIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gcGFnZSBzaXplIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uUGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBvcmRlciBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtblJlb3JkZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKENvbHVtbkRpcmVjdGl2ZSkgY29sdW1uUmVuZGVyZXJzOiBRdWVyeUxpc3Q8Q29sdW1uRGlyZWN0aXZlPjtcblxuICBAQ29udGVudENoaWxkKEV4cGFuZGFibGVSb3dEaXJlY3RpdmUpXG4gIGV4cGFuZGFibGVSb3c6IEV4cGFuZGFibGVSb3dEaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZCgnc2Nyb2xsJywgeyBzdGF0aWM6IHRydWUgfSkgc2Nyb2xsQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2luZmluaXRlU2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGluZmluaXRlU2Nyb2xsQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmUpIGVtcHR5U3RhdGU6IEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlO1xuXG4gIGxvYWRNb3JlQ29tcG9uZW50OiBMb2FkTW9yZUNvbXBvbmVudDtcblxuICBjb2x1bW5OYW1lcyA9IFtdO1xuXG4gIHN0eWxlcyA9IHtcbiAgICB0YWJsZUN1cnNvcjogJ2F1dG8nLFxuICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IHVuZGVmaW5lZCxcbiAgICBncmlkSW5maW5pdGVTY3JvbGxDb2x1bW46IHVuZGVmaW5lZFxuICB9O1xuXG4gIHNlYXJjaFRleHQkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIGZpbHRlcmluZ0FwcGxpZWQgPSBmYWxzZTtcbiAgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZDogQ29sdW1uW10gPSBbXTtcblxuICB0b3RhbFBhZ2VzQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KEluZmluaXR5KTtcbiAgaGlkZVBhZ2luYXRpb24kID0gdGhpcy50b3RhbFBhZ2VzQ291bnQkLnBpcGUoXG4gICAgbWFwKHRvdGFsUGFnZXNDb3VudCA9PiB0b3RhbFBhZ2VzQ291bnQgPD0gMSksXG4gICAgZGVsYXkoMCkgLy8gcHJldmVudHMgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclxuICApO1xuXG4gIHNlbGVjdGVkSXRlbUlkczogc3RyaW5nW10gPSBbXTtcbiAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICBhbGxTZWxlY3RlZDogZmFsc2UsXG4gICAgYWxsRGVzZWxlY3RlZDogdHJ1ZVxuICB9O1xuXG4gIGJ1aWx0SW5BY3Rpb25UeXBlID0ge1xuICAgIEVkaXQ6IEJ1aWx0SW5BY3Rpb25UeXBlLkVkaXQsXG4gICAgRGVsZXRlOiBCdWlsdEluQWN0aW9uVHlwZS5EZWxldGUsXG4gICAgRXhwb3J0OiBCdWlsdEluQWN0aW9uVHlwZS5FeHBvcnRcbiAgfTtcblxuICBjb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9uczogUG9wb3ZlckNvbmZpcm1CdXR0b25zW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0NhbmNlbCcpLFxuICAgICAgYWN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUmVtb3ZlYGNvbHVtbix2ZXJiYCcpLFxuICAgICAgc3RhdHVzOiAnZGFuZ2VyJyxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgfVxuICBdO1xuXG4gIGlzQ29uZmlnQ29udGV4dEtub3duID0gZmFsc2U7XG4gIGVtcHR5U3RhdGVDb250ZXh0JDogT2JzZXJ2YWJsZTxEYXRhU291cmNlU3RhdHM+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiByb3dzIHdoaWNoIGhhdmUgYmVlbiBleHBhbmRlZC5cbiAgICovXG4gIGV4cGFuZGVkUm93czogTWFwPFJvdywgeyB2aXNpYmxlJDogU3ViamVjdDxib29sZWFuPiB8IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB9PiA9IG5ldyBNYXAoKTtcblxuICAvKiogUHJvZHVjdCBleHBlcmllbmNlIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgKi9cbiAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudCA9IHsgZXZlbnROYW1lOiBQWF9FVkVOVF9OQU1FIH07XG4gIFBYX0FDVElPTlMgPSBQWF9BQ1RJT05TO1xuXG4gIHJlYWRvbmx5IHNvcnRDb2x1bW5UaXRsZSA9IGdldHRleHQoJ1NvcnQgY29sdW1uIFwie3sgbmFtZSB9fVwiJyk7XG5cbiAgcmVzaXplSGFuZGxlTW91c2VEb3duJCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgdGFyZ2V0Q29sdW1uTmFtZTogc3RyaW5nIH0+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gIGZpbHRlcnNIZWxwUG9wb3Zlckh0bWw6IHN0cmluZyA9IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuXG4gIHByaXZhdGUgaGVhZGVyQmVpbmdSZXNpemVkOiB7XG4gICAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAgIGVsOiBIVE1MRWxlbWVudDtcbiAgfTtcbiAgQFZpZXdDaGlsZHJlbihDZGtIZWFkZXJDZWxsLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSB0aFJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgcHJpdmF0ZSB0aEVsczogSFRNTEVsZW1lbnRbXTtcblxuICBAVmlld0NoaWxkKENka1RhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVSZWY6IENka1RhYmxlPGFueT47XG5cbiAgcHJpdmF0ZSByZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50OiBib29sZWFuO1xuXG4gIHByaXZhdGUgY29sdW1uc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q29sdW1uczogQ29sdW1uW10gPSBbXTtcblxuICBwcml2YXRlIHJlbG9hZENvbmZpZ3VyYXRpb24kOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIGFjdGlvbkNvbnRyb2xzSW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBY3Rpb25Db250cm9sW10+KFtdKTtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBtYW51YWxTZWFyY2gkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgbGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfVElNRSA9IDUwMDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc1NlcnZpY2U6IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uV2hlbk5vRGV2aWNlc0xhc3RQYWdlKHN0YXRzKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNDb25maWdDb250ZXh0S25vd24gPSAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5pc0NvbnRleHRLbm93bigpO1xuXG4gICAgdGhpcy5zZXR1cFNlYXJjaE9ic2VydmFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuZGF0YVNvdXJjZS5kYXRhJCwgdGhpcy5pdGVtc1NlbGVjdC5hc09ic2VydmFibGUoKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VFbXB0eSA9IGRhdGEubGVuZ3RoID09PSAwO1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgICAgICAgYWxsU2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyBmYWxzZSA6IGRhdGEuZXZlcnkoaXRlbSA9PiB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSxcbiAgICAgICAgICAgIGFsbERlc2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyB0cnVlIDogZGF0YS5ldmVyeShpdGVtID0+ICF0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuXG4gICAgdGhpcy5hY3Rpb25Db250cm9sc1NlcnZpY2UuaXRlbXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgc3dpdGNoTWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICAgIGhvb2tzLm1hcChob29rID0+XG4gICAgICAgICAgICAgIHRvT2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBob29rPy5tYXRjaGVzR3JpZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgICAgICAgICAgICAgICAgICAgaG9vay5tYXRjaGVzR3JpZCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb250ZXh0KClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZVxuICAgICAgICAgICAgICApLnBpcGUobWFwKG1hdGNoZXMgPT4gKHsgaG9vaywgbWF0Y2hlcyB9KSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKS5waXBlKHN0YXJ0V2l0aChbXSkpXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFycmF5PHsgaG9vazogQWN0aW9uQ29udHJvbEhvb2s7IG1hdGNoZXM6IGJvb2xlYW4gfT4pID0+XG4gICAgICAgICAgaG9va3MuZmlsdGVyKGhvb2sgPT4gaG9vay5tYXRjaGVzKS5tYXAoaG9vayA9PiBob29rLmhvb2spXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFjdGlvbkNvbnRyb2xIb29rW10pID0+XG4gICAgICAgICAgaG9va3MucmVkdWNlKChhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdLCBjdXJyZW50SG9vazogQWN0aW9uQ29udHJvbEhvb2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWN0aW9uQ29udHJvbHMsIC4uLmNhc3RBcnJheShjdXJyZW50SG9vay5hY3Rpb25Db250cm9scyldO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICApLFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmFjdGlvbkNvbnRyb2xzSW5wdXQkKSxcbiAgICAgICAgdGFwKFxuICAgICAgICAgIChbaG9va0NvbnRyb2xzLCBpbnB1dENvbnRyb2xzXSkgPT5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbkNvbnRyb2xzID0gWy4uLmlucHV0Q29udHJvbHMsIC4uLmhvb2tDb250cm9sc10pXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmICh0aGlzLnJlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG5cbiAgICAvLyBSZXNldHRpbmcgdGhlIHN0YXRzIHNpemUgdG8gMCB3aGVuIG1hbmFnZWQgb2JqZWN0cyBhcmUgZGVsZXRlZCBidXQgc2l6aW5nIG5vdCB5ZXQgdXBkYXRlZFxuICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIE1UTS02MDIyNiBpcyByZXNvbHZlZFxuICAgIHRoaXMuZW1wdHlTdGF0ZUNvbnRleHQkID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXRhU291cmNlLnN0YXRzJCwgdGhpcy5kYXRhU291cmNlLmRhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW3N0YXRzLCBkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHMuZmlsdGVyZWRTaXplID09PSAxICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdHMsIHNpemU6IDAsIGZpbHRlcmVkU2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0cztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldEV4cGFuZGFibGVSb3dWaXNpYmxlKHJvdzogUm93LCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhldmVudCkge1xuICAgIGlmIChcbiAgICAgICgoIWV2ZW50Ll9hY3Rpb25Db250cm9scyAmJiAhZXZlbnQuc2VhcmNoVGV4dCkgfHwgZXZlbnQuX2FjdGlvbkNvbnRyb2xzPy5maXJzdENoYW5nZSkgJiZcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxvYWQgPSAhIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uY3VycmVudFZhbHVlICYmICFldmVudC5faW5maW5pdGVTY3JvbGw/LmZpcnN0Q2hhbmdlO1xuICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdChyZWxvYWQpO1xuICAgIH1cbiAgICBpZiAoISFldmVudC5fY29sdW1ucyAmJiAhZXZlbnQuX2NvbHVtbnMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnNldHVwUmVzaXplSGFuZGxlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGV4cGFuZChyb3c6IFJvdykge1xuICAgIGNvbnN0IGlzU3luY0V4cGFuZCA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgPT09ICdTWU5DJztcbiAgICBsZXQgdmlzaWJsZVN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgaWYgKGlzU3luY0V4cGFuZCkge1xuICAgICAgdmlzaWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5kZWRSb3dzLnNldChyb3csIHsgdmlzaWJsZSQ6IHZpc2libGVTdWJqZWN0IH0pO1xuICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIHJldHVybiB2aXNpYmxlU3ViamVjdDtcbiAgfVxuXG4gIGNvbGxhcHNlKHJvdzogUm93KTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gIH1cblxuICBpc1Jvd0V4cGFuZGVkID0gKF8sIHJvdzogUm93KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdyk7XG4gIH07XG5cbiAgc2V0Q29sdW1ucyhjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneSAmJiAhaXNFbXB0eSh0aGlzLl9jb2x1bW5zKSkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kYXRhR3JpZFNlcnZpY2UuYXBwbHlDb25maWdUb0NvbHVtbnMoY29uZmlnLCB0aGlzLl9jb2x1bW5zKTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgfHwgISF0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBzZXRQYWdlU2l6ZShjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISFjb25maWc/LnBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBnZXQodGhpcy5wYWdpbmF0aW9uLCAncGFnZVNpemUnKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICF0aGlzLnBvc3NpYmxlUGFnZVNpemVzLmZpbmQocG9zc2libGVQYWdlU2l6ZSA9PiBwb3NzaWJsZVBhZ2VTaXplID09PSBwYWdlU2l6ZSlcbiAgICApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5taW5Qb3NzaWJsZVBhZ2VTaXplIH07XG4gICAgfVxuICB9XG5cbiAgb3BlbkN1c3RvbUNvbHVtbk1vZGFsKCk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5ic01vZGFsU2VydmljZS5zaG93KENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnLFxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnNcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1vZGFsUmVmLmNvbnRlbnQub25BZGRDdXN0b21Db2x1bW5cbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGN1c3RvbUNvbHVtbkNvbmZpZzogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gPSB0aGlzLmNvbHVtbnMuaW5kZXhPZihcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4ucG9zaXRpb25GaXhlZClcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoXG4gICAgICAgICAgICBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA+IC0xID8gZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gOiB0aGlzLmNvbHVtbnMubGVuZ3RoLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIG5ldyBDdXN0b21Db2x1bW4oY3VzdG9tQ29sdW1uQ29uZmlnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkFERF9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgICAgY29sdW1uOiBjdXN0b21Db2x1bW5Db25maWcuaGVhZGVyIHx8IGN1c3RvbUNvbHVtbkNvbmZpZy5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwobW9kYWxSZWYub25IaWRkZW4pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMub25BZGRDdXN0b21Db2x1bW4uZW1pdChldmVudCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlQ3VzdG9tQ29sdW1uKFxuICAgIHBvQ29uZmlybTogUG9wb3ZlckNvbmZpcm1Db21wb25lbnQsXG4gICAgY29sdW1uOiBDb2x1bW4sXG4gICAgZGRDb25maWd1cmVDb2x1bW5zOiBCc0Ryb3Bkb3duRGlyZWN0aXZlXG4gICkge1xuICAgIGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSBmYWxzZTtcbiAgICBwb0NvbmZpcm0ubWVzc2FnZSA9IGdldHRleHQoJ0RvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGNvbHVtbj8nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVtb3ZlOiBib29sZWFuID0gYXdhaXQgcG9Db25maXJtLnNob3codGhpcy5jb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9ucyk7XG4gICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbD8ubmFtZSAhPT0gY29sdW1uPy5uYW1lKTtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMub25SZW1vdmVDdXN0b21Db2x1bW4uZW1pdChjb2x1bW4pO1xuICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTU9WRV9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uLmhlYWRlciB8fCBjb2x1bW4ubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGUpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4gKGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSB0cnVlKSwgMCk7XG4gIH1cblxuICBhc3luYyByZW1vdmVGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPEZpbHRlckNoaXA+KSB7XG4gICAgY29uc3QgZmlsdGVyaW5nTW9kaWZpZXIgPSBmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeVxuICAgICAgPyB7IGV4dGVybmFsRmlsdGVyUXVlcnk6IGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5IH1cbiAgICAgIDogeyBmaWx0ZXJQcmVkaWNhdGU6IGZpbHRlci5maWx0ZXJQcmVkaWNhdGUgfTtcbiAgICB0aGlzLm9uQmVmb3JlRmlsdGVyLmVtaXQoe1xuICAgICAgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICBkcm9wZG93bjogdW5kZWZpbmVkLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAoZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkgJiYgIXRoaXMuY2hlY2tJZkFueVZhbHVlc0V4aXN0KGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5KSkgfHxcbiAgICAgIGZpbHRlci5maWx0ZXJQcmVkaWNhdGVcbiAgICApIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtmaWx0ZXIuY29sdW1uTmFtZV0sIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlclxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbZmlsdGVyLmNvbHVtbk5hbWVdLCB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICAgIHBheWxvYWQ6IHsgZmlsdGVyaW5nTW9kaWZpZXIgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe1xuICAgICAgICBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgICAgZHJvcGRvd246IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU1PVkVfRklMVEVSLFxuICAgICAgY29sdW1uOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gIH1cblxuICB0cmFja0J5TmFtZShpbmRleCwgaXRlbSkge1xuICAgIHJldHVybiBpdGVtLm5hbWU7XG4gIH1cblxuICByZXNvbHZlQ2VsbFZhbHVlKHJvdywgcGF0aCkge1xuICAgIHJldHVybiBmbG93KFtcbiAgICAgIHggPT4gdGhpcy5kYXRhU291cmNlLnJlc29sdmVWYWx1ZSh4LCBwYXRoKSxcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yZXNvbHZlRnVuY3Rpb24sXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uubm9ybWFsaXplTmlsXG4gICAgXSkocm93KTtcbiAgfVxuXG4gIGNoYW5nZVNvcnRPcmRlcihjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW5OYW1lKTtcblxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGNvbnN0IHsgc29ydE9yZGVyIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmICghc29ydE9yZGVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sIFNvcnRpbmdPcmRlci5BU0MpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0T3JkZXIgPT09IFNvcnRpbmdPcmRlci5BU0MpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkRFU0MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNvcnRpbmcoY29sdW1uTmFtZXM6IHN0cmluZ1tdLCBzb3J0T3JkZXI6IFNvcnRPcmRlcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfU09SVElOR19PUkRFUixcbiAgICAgIGNvbHVtbnM6IGNvbHVtbk5hbWVzLFxuICAgICAgc29ydE9yZGVyOiBzb3J0T3JkZXIgPT09ICcnID8gJ25vbmUnIDogc29ydE9yZGVyXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pOiBDb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICByZXR1cm4geyAuLi5jb2x1bW4sIHNvcnRPcmRlciB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgnc29ydCcpO1xuXG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5BUFBMWV9GSUxURVIsXG4gICAgICBjb2x1bW46IGNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24pIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRVNFVF9GSUxURVIsIGNvbHVtbjogY29sdW1uTmFtZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHsgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlciB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24gfSk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMocmVsb2FkID0gdHJ1ZSkge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFxuICAgICAgdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICAge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9LFxuICAgICAgcmVsb2FkXG4gICAgKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe30pO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX0ZJTFRFUiB9KTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZyhcbiAgICBjb2x1bW5OYW1lczogc3RyaW5nW10sXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlO1xuICAgICAgcGF5bG9hZD86IHsgZmlsdGVyaW5nTW9kaWZpZXI6IEZpbHRlcmluZ01vZGlmaWVyIH07XG4gICAgfSxcbiAgICByZWxvYWQgPSB0cnVlXG4gICkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgLi4uKGFjdGlvbi50eXBlID09PSBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyXG4gICAgICAgICAgICA/IGFjdGlvbi5wYXlsb2FkLmZpbHRlcmluZ01vZGlmaWVyXG4gICAgICAgICAgICA6IHRoaXMub25SZXNldEZpbHRlckFjdGlvbihjb2x1bW4pKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuXG4gICAgaWYgKHJlbG9hZCkge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCkge1xuICAgIHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZCA9IHRoaXMuY29sdW1ucy5maWx0ZXIodGhpcy5pc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQpO1xuICAgIHRoaXMuZmlsdGVyaW5nQXBwbGllZCA9IHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZC5sZW5ndGggPiAwO1xuXG4gICAgdGhpcy5maWx0ZXJzSGVscFBvcG92ZXJIdG1sID0gdGhpcy5maWx0ZXJpbmdBcHBsaWVkXG4gICAgICA/IGdldHRleHQoXG4gICAgICAgICAgJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLiBDbGljayA8Yj5BY3RpdmUgZmlsdGVyczwvYj4gYnV0dG9uIHRvIG1hbmFnZSBhcHBsaWVkIGZpbHRlcnMuJ1xuICAgICAgICApXG4gICAgICA6IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuICB9XG5cbiAgaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkKGNvbHVtbjogQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBmaWx0ZXJhYmxlLCBmaWx0ZXJQcmVkaWNhdGUsIGV4dGVybmFsRmlsdGVyUXVlcnkgfSA9IGNvbHVtbjtcblxuICAgIHJldHVybiAhIShmaWx0ZXJhYmxlICYmIChmaWx0ZXJQcmVkaWNhdGUgfHwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpO1xuICB9XG5cbiAgdXBkYXRlUGFnaW5hdGlvbih7IGl0ZW1zUGVyUGFnZSwgcGFnZSB9KSB7XG4gICAgY29uc3QgY29uZmlnQ2hhbmdlZCA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemUgIT09IGl0ZW1zUGVyUGFnZTtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgcGFnZVNpemU6IGl0ZW1zUGVyUGFnZSwgY3VycmVudFBhZ2U6IHBhZ2UgfTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgncGFnaW5hdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfUEFHSU5BVElPTiwgaXRlbXNQZXJQYWdlLCBwYWdlIH0pO1xuICB9XG5cbiAgY2xpY2tSZWxvYWQoKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgICB0aGlzLm9uUmVsb2FkLm5leHQoKTtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRUxPQUQgfSk7XG4gIH1cblxuICByZWxvYWQocmVkaXJlY3QgPSB0cnVlKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgY3VycmVudFBhZ2U6IHJlZGlyZWN0ID8gMSA6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZVxuICAgIH07XG4gICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWREYXRhKHRydWUpO1xuICAgIHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgfVxuXG4gIGxvYWROZXh0UGFnZSgpOiBQcm9taXNlPElSZXN1bHRMaXN0PG9iamVjdD4+IHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5uZXh0UGFnZSB9O1xuXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5yZXN1bHRMaXN0JFxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gaW4gb3JkZXIgZm9yIGB0b1Byb21pc2VgIHRvIHdvcmssIHRoZSBvYnNlcnZhYmxlIG5lZWRzIHRvIGNvbXBsZXRlXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHBhZ2luZzoge1xuICAgICAgICAgICAgLi4ucmVzdWx0LnBhZ2luZyxcbiAgICAgICAgICAgIG5leHQ6IHRoaXMubG9hZE5leHRQYWdlLmJpbmQodGhpcylcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSVJlc3VsdExpc3Q8b2JqZWN0PjtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0NFTEwnLCB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGU6ICdIRUFERVInLCB2YWx1ZSwgcm93OiB1bmRlZmluZWQsIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjKHsgY29sdW1uLCBkcm9wZG93biB9KTogRmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOlxuICAgICAgICBnZXQodGhpcy5nZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pLCAnZmlsdGVyaW5nRm9ybVJlbmRlcmVyRGVmLnRlbXBsYXRlJykgfHxcbiAgICAgICAgY29sdW1uLmZpbHRlcmluZ0Zvcm1SZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgcHJvcGVydHk6IGNvbHVtbixcbiAgICAgICAgYXBwbHlGaWx0ZXI6IHRoaXMuYXBwbHlGaWx0ZXIuYmluZCh0aGlzLCBjb2x1bW4ubmFtZSwgZHJvcGRvd24pLFxuICAgICAgICByZXNldEZpbHRlcjogdGhpcy5yZXNldEZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93bilcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0QWxsSXRlbXNTZWxlY3RlZChzZWxlY3RlZCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zZWxlY3Rpb24kXG4gICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmaWx0ZXJlZERhdGFJZHMgfSkgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGZpbHRlcmVkRGF0YUlkcywgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGRhdGEsIHNlbGVjdGVkKSk7XG4gIH1cblxuICBzZXRJdGVtc1NlbGVjdGVkKGl0ZW1zOiBhbnksIHNlbGVjdGVkKSB7XG4gICAgY29uc3QgaXRlbUlkcyA9IGl0ZW1zLm1hcCgoaXRlbTogb2JqZWN0IHwgc3RyaW5nKSA9PlxuICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID8gaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldIDogaXRlbVxuICAgICk7XG5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IHNlbGVjdGVkXG4gICAgICA/IHVuaW9uKHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCBpdGVtSWRzKVxuICAgICAgOiB3aXRob3V0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCAuLi5pdGVtSWRzKTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0ZWRJdGVtKGl0ZW06IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW2l0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XV07XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IFtdO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBpc0l0ZW1TZWxlY3RlZChpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtSWRzLmluY2x1ZGVzKGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSk7XG4gIH1cblxuICBvbkNvbHVtbkRyb3AoeyBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXggfSkge1xuICAgIGNvbnN0IGRpZmZlcmVudEluZGV4ID0gcHJldmlvdXNJbmRleCAhPT0gY3VycmVudEluZGV4O1xuXG4gICAgaWYgKGRpZmZlcmVudEluZGV4KSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU9SREVSX0NPTFVNTlMsXG4gICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5OYW1lc1twcmV2aW91c0luZGV4XVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShjdXJyZW50SW5kZXgsIDAsIGNvbHVtblswXSk7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3Jlb3JkZXJDb2x1bW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICB0aGlzLmNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSlcbiAgICAgICAgICAubWFwKCh7IGdyaWRUcmFja1NpemUgfSkgPT4gZ3JpZFRyYWNrU2l6ZSlcbiAgICAgICAgICAuam9pbignICcpXG4gICAgICApLFxuICAgICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYDEgLyAtMWApXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVRoRWxzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aEVscyA9IHRoaXMudGhSZWZzXG4gICAgICAgID8gdGhpcy50aFJlZnMudG9BcnJheSgpLm1hcCgoeyBuYXRpdmVFbGVtZW50IH0pID0+IG5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIDogW107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBUbyBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuXG4gIGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW46IENvbHVtbikge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleE9mKFxuICAgICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKSxcbiAgICAgICAgY29sdW1uXG4gICAgICApID5cbiAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUpLmxlbmd0aCAvIDJcbiAgICApO1xuICB9XG5cbiAgZW1pdENvbmZpZ0NoYW5nZShldmVudFR5cGU/OiBHcmlkRXZlbnRUeXBlKSB7XG4gICAgaWYgKHRoaXMuY29sdW1uc0luaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpO1xuICAgICAgY29uc3QgY29uZmlnID0geyBjb2x1bW5zLCBwYWdpbmF0aW9uOiB0aGlzLnBhZ2luYXRpb24gfTtcbiAgICAgIHRoaXMub25Db25maWdDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgICAgdGhpcy5vblNvcnQuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYWdpbmF0aW9uJzpcbiAgICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZW9yZGVyQ29sdW1uJzpcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uUmVvcmRlcmVkLmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2hhbmdlQ29sdW1uVmlzaWJpbGl0eSc6XG4gICAgICAgICAgdGhpcy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChldmVudERhdGEpIHtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KHRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZXZlbnROYW1lIHx8IFBYX0VWRU5UX05BTUUsIHtcbiAgICAgIC4uLnRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZGF0YSxcbiAgICAgIC4uLmV2ZW50RGF0YVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBSb3cpIHtcbiAgICB0aGlzLmxhc3RDbGlja2VkUm93ID0gcm93O1xuICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuICB9XG5cbiAgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgIHRoaXMubWFudWFsU2VhcmNoJC5uZXh0KHNlYXJjaFRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNlYXJjaE9ic2VydmFibGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGF1dG9TZWFyY2gkID0gdGhpcy5zZWFyY2hUZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuU0VBUkNIX0RFQk9VTkNFX1RJTUUpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUpLFxuICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG1hbnVhbFNlYXJjaCQgPSB0aGlzLm1hbnVhbFNlYXJjaCQucGlwZShcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS50cmltKCkgIT09ICcnKSxcbiAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgIHRoaXMubGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBtZXJnZShhdXRvU2VhcmNoJCwgbWFudWFsU2VhcmNoJClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICB0YXAoc2VhcmNoVGV4dCA9PiB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlU2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFQVJDSCxcbiAgICAgICAgICAgIHNlYXJjaElucHV0OiBzZWFyY2hUZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2V0RmlsdGVyQWN0aW9uKGNvbHVtbjogQ29sdW1uKSB7XG4gICAgdGhpcy5vbkNvbHVtbkZpbHRlclJlc2V0LmVtaXQoY29sdW1uKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyUHJlZGljYXRlOiB1bmRlZmluZWQsXG4gICAgICBleHRlcm5hbEZpbHRlclF1ZXJ5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBDb2x1bW5Ub0NvbmZpZyhjb2x1bW46IENvbHVtbik6IENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZyB7XG4gICAgbGV0IGNvbmZpZztcbiAgICBpZiAoY29sdW1uLmN1c3RvbSkge1xuICAgICAgY29uc3QgeyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGV4dGVybmFsRmlsdGVyUXVlcnksIGhlYWRlciwgcGF0aCB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0ge1xuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBzb3J0T3JkZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0sXG4gICAgICAgIGhlYWRlcixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgY3VzdG9tOiB0cnVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0geyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gfTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eShjb25maWc/LmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuZmlsdGVyO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGxvYWREYXRhKHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgfSA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UubG9hZERhdGEoe1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsLFxuICAgICAgcmVsb2FkXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnMoKSB7XG4gICAgY29uc3Qgc3BlY2lhbENvbHVtbiA9IHtcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHNlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc2VsZWN0YWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICBuYW1lOiB0aGlzLnNpbmdsZVNlbGVjdGlvbiA/IFNwZWNpYWxDb2x1bW5OYW1lLlJhZGlvQnV0dG9uIDogU3BlY2lhbENvbHVtbk5hbWUuQ2hlY2tib3gsXG4gICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJzMycHgnXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGlvbnNDb2x1bW4gPVxuICAgICAgdGhpcy5hY3Rpb25Db250cm9scz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwZWNpYWxDb2x1bW4sXG4gICAgICAgICAgICBuYW1lOiBTcGVjaWFsQ29sdW1uTmFtZS5BY3Rpb25zLFxuICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJ21pbm1heCg0MHB4LCBhdXRvKSdcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXhwYW5kYWJsZVJvd3NDb2x1bW4gPSB0aGlzLmV4cGFuZGFibGVSb3dzICE9PSAnTk9ORScgPyBuZXcgRXhwYW5kYWJsZVJvd0NvbHVtbigpIDogbnVsbDtcbiAgICBjb25zdCBjb2x1bW5zID0gW2V4cGFuZGFibGVSb3dzQ29sdW1uLCBzZWxlY3Rpb25Db2x1bW4sIC4uLnRoaXMuY29sdW1ucywgYWN0aW9uc0NvbHVtbl1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAodGhpcy53aXRoQ29sdW1uRGVmYXVsdHMpO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gdW5pcUJ5KGNvbHVtbnMsICduYW1lJyk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5OYW1lcygpO1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgdGhpcy51cGRhdGVUaEVscygpO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqLCByZXN1bHRzID0gW10pIHtcbiAgICBpZiAob2JqICYmIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqW2tleV0sIHJlc3VsdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzLnNvbWUodmFsID0+ICEhdmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aENvbHVtbkRlZmF1bHRzKGNvbHVtbik6IENvbHVtbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGUgfHwgQ29sdW1uRGF0YVR5cGUuVGV4dFNob3J0O1xuICAgIGNvbnN0IHsgaGVhZGVyQ1NTQ2xhc3NOYW1lLCBjZWxsQ1NTQ2xhc3NOYW1lIH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0T3JkZXI6ICcnLFxuICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGdyaWRUcmFja1NpemU6XG4gICAgICAgIGNvbHVtbi5ncmlkVHJhY2tTaXplIHx8XG4gICAgICAgIGBtaW5tYXgoJHttaW5Db2x1bW5HcmlkVHJhY2tTaXplfXB4LCAke3JhdGlvc0J5Q29sdW1uVHlwZXNbZGF0YVR5cGVdfWZyKWAsXG4gICAgICBoZWFkZXJDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgaGVhZGVyQ1NTQ2xhc3NOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gaGVhZGVyQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJylcbiAgICAgICAgICA6IGhlYWRlckNTU0NsYXNzTmFtZSkgfHwgW10sXG4gICAgICBjZWxsQ1NTQ2xhc3NOYW1lOlxuICAgICAgICAodHlwZW9mIGNlbGxDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnID8gY2VsbENTU0NsYXNzTmFtZS5zcGxpdCgnICcpIDogY2VsbENTU0NsYXNzTmFtZSkgfHxcbiAgICAgICAgW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1lcygpIHtcbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCByZXNpemVIYW5kbGVEcmFnJCA9IHRoaXMucmVzaXplSGFuZGxlTW91c2VEb3duJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgbWVyZ2VNYXAoKHsgZXZlbnQsIHRhcmdldENvbHVtbk5hbWUgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0YXJnZXRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogdW5pb24oY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgWydoZWFkZXItLWJlaW5nLXJlc2l6ZWQnXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB7XG4gICAgICAgICAgY29sdW1uTmFtZTogdGFyZ2V0Q29sdW1uTmFtZSxcbiAgICAgICAgICBlbDogKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2NvbC1yZXNpemUnXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmVzaXplSGFuZGxlRHJhZyQuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkICYmIGNvbHVtbi5uYW1lID09PSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJEaXY6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gUmVhZCBzY3JvbGxDb250YWluZXJFbCdzIG9mZnNldCBsZWZ0IHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPSBzY3JvbGxDb250YWluZXJEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICAgICAgLy8gQWRqdXN0IHdpdGggdGhlIHNjcm9sbENvbnRhaW5lckVsIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbE9mZnNldCA9IHNjcm9sbENvbnRhaW5lckRpdi5zY3JvbGxMZWZ0IC0gaG9yaXpvbnRhbE9mZnNldDtcblxuICAgICAgICAgICAgLy8gUmVhZCBsZWZ0IG9mZnNldCBvZiB0aGUgcmVzaXplZCBoZWFkZXIuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJPZmZzZXRMZWZ0ID0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuZWwub2Zmc2V0TGVmdCB8fCAwO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRlc2lyZWQgd2lkdGguXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGhvcml6b250YWxTY3JvbGxPZmZzZXQgKyBldmVudC5jbGllbnRYIC0gaGVhZGVyT2Zmc2V0TGVmdDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbiBvYmplY3Qgd2l0aCB0aGUgbmV3IHNpemUgdmFsdWUsIGVuZm9yY2Ugb3VyIG1pbmltdW0gc2l6ZS5cbiAgICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogYCR7TWF0aC5tYXgobWluQ29sdW1uR3JpZFRyYWNrU2l6ZSwgd2lkdGgpfXB4YFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgdGhlIG90aGVyIGhlYWRlcnMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNldCB3aWR0aCwgZml4IGl0IHRvIHRoZWlyIGNvbXB1dGVkIHdpZHRoLlxuICAgICAgICAgIGlmIChjb2x1bW4uZ3JpZFRyYWNrU2l6ZS5zdGFydHNXaXRoKCdtaW5tYXgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBpc24ndCBmaXhlZCB5ZXQgKGl0IHdvdWxkIGJlIGEgcHggdmFsdWUpXG4gICAgICAgICAgICAgIGdyaWRUcmFja1NpemU6IGAke19wYXJzZUludCh0aGlzLnRoRWxzW2ldLmNsaWVudFdpZHRoKX1weGBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVXBkYXRlIHRoZSBjb2x1bW4gc2l6ZXMuXG4gICAgICAgICAqIE5vdGU6IGdyaWQtdGVtcGxhdGUtY29sdW1ucyBzZXRzIHRoZSB3aWR0aCBmb3IgYWxsIGNvbHVtbnMgaW4gb25lIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4ubmFtZSA9PT0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICBoZWFkZXJDU1NDbGFzc05hbWU6IHdpdGhvdXQoY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgJ2hlYWRlci0tYmVpbmctcmVzaXplZCcpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhlYWRlckJlaW5nUmVzaXplZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2F1dG8nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTW91c2VIaWdobGlnaHRzKCkge1xuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGUsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgY29uc3QgY29sdW1uUmVuZGVyZXIgPSB0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbik7XG4gICAgY29uc3QgcmVuZGVyZXJUZW1wbGF0ZSA9IGdldChcbiAgICAgIGNvbHVtblJlbmRlcmVyLFxuICAgICAgYCR7dHlwZSA9PT0gJ0hFQURFUicgPyAnaGVhZGVyQ2VsbFJlbmRlcmVyRGVmJyA6ICdjZWxsUmVuZGVyZXJEZWYnfS50ZW1wbGF0ZWBcbiAgICApO1xuXG4gICAgY29uc3QgeyBjZWxsUmVuZGVyZXJDb21wb25lbnQsIGhlYWRlckNlbGxSZW5kZXJlckNvbXBvbmVudCB9ID0gY29sdW1uO1xuICAgIGNvbnN0IHJlbmRlcmVyQ29tcG9uZW50ID1cbiAgICAgIHR5cGUgPT09ICdIRUFERVInID8gaGVhZGVyQ2VsbFJlbmRlcmVyQ29tcG9uZW50IDogY2VsbFJlbmRlcmVyQ29tcG9uZW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOiByZW5kZXJlclRlbXBsYXRlIHx8IHJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXRlbTogcm93LFxuICAgICAgICBwcm9wZXJ0eTogY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKTogQ29sdW1uRGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5SZW5kZXJlcnMudG9BcnJheSgpLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcmluZ0xhYmVsc1BhcmFtcyhzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgdGhpcy5maWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgICBmaWx0ZXJlZEl0ZW1zQ291bnQ6IHN0YXRzLmZpbHRlcmVkU2l6ZSxcbiAgICAgIGFsbEl0ZW1zQ291bnQ6IHN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdpbmF0aW9uTGFiZWxQYXJhbXMoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIG5leHRQYWdlOiBzdGF0cy5uZXh0UGFnZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VGaXJzdEl0ZW1JZHggPSAoc3RhdHMuY3VycmVudFBhZ2UgLSAxKSAqIHN0YXRzLmZpcnN0UGFnZVNpemUgKyAxO1xuICAgIHRoaXMucGFnaW5hdGlvbkxhYmVsUGFyYW1zID0ge1xuICAgICAgcGFnZUZpcnN0SXRlbUlkeCxcbiAgICAgIHBhZ2VMYXN0SXRlbUlkeDogcGFnZUZpcnN0SXRlbUlkeCArIChzdGF0cy5jdXJyZW50UGFnZVNpemUgLSAxKSxcbiAgICAgIGl0ZW1zVG90YWw6IHN0YXRzLmZpbHRlcmVkU2l6ZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25XaGVuTm9EZXZpY2VzTGFzdFBhZ2Uoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmICghc3RhdHMubmV4dFBhZ2UgJiYgc3RhdHMuY3VycmVudFBhZ2VTaXplID09PSAwICYmIHN0YXRzLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAgIC4uLnRoaXMucGFnaW5hdGlvbixcbiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSAtIDEsXG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgJiZcbiAgICAgIHN0YXRzICYmXG4gICAgICBzdGF0cy5uZXh0UGFnZSAmJlxuICAgICAgKCF0aGlzLmxvYWRNb3JlQ29tcG9uZW50IHx8IHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudClcbiAgICApIHtcbiAgICAgIHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jbGVhcigpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoTG9hZE1vcmVDb21wb25lbnQpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgTG9hZE1vcmVDb21wb25lbnQ7XG4gICAgICBpbnN0YW5jZS51c2VJbnRlcnNlY3Rpb24gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnYXV0bycgfHwgdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2hpZGRlbic7XG4gICAgICBpbnN0YW5jZS5oaWRkZW4gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnaGlkZGVuJztcbiAgICAgIGluc3RhbmNlLnBhZ2luZyA9IHtcbiAgICAgICAgbmV4dFBhZ2U6IHN0YXRzLm5leHRQYWdlLFxuICAgICAgICBuZXh0OiB0aGlzLmxvYWROZXh0UGFnZS5iaW5kKHRoaXMpXG4gICAgICB9IGFzIFBhZ2luZzxJSWRlbnRpZmllZD47XG4gICAgICBpbnN0YW5jZS5sb2FkTmV4dExhYmVsID0gdGhpcy5sb2FkTW9yZUl0ZW1zTGFiZWw7XG4gICAgICBpbnN0YW5jZS5sb2FkaW5nTGFiZWwgPSB0aGlzLmxvYWRpbmdJdGVtc0xhYmVsO1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sb2FkTW9yZUNvbXBvbmVudCAmJiAhc3RhdHMubmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVDb21wb25lbnQucGFnaW5nID0ge1xuICAgICAgICBuZXh0UGFnZTogbnVsbFxuICAgICAgfSBhcyBQYWdpbmc8SUlkZW50aWZpZWQ+O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCkge1xuICAgIG1lcmdlKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMub25Tb3J0LFxuICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UsXG4gICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQsXG4gICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlXG4gICAgICApLnBpcGUobWFwKGNvbmZpZyA9PiBjb25maWcuY29sdW1ucykpLFxuICAgICAgbWVyZ2UodGhpcy5vbkFkZEN1c3RvbUNvbHVtbiwgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbikucGlwZShcbiAgICAgICAgbWFwKCgpID0+ICh0aGlzLmNvbHVtbnMgfHwgW10pLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpKVxuICAgICAgKSxcbiAgICAgIHRoaXMub25GaWx0ZXIucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbHVtbk5hbWUsIGZpbHRlcmluZ01vZGlmaWVyIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpLm1hcCgoY29sdW1uOiBDb2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChpc05pbChjb2x1bW5OYW1lKSkge1xuICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLm5hbWUgPT09IGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyaW5nTW9kaWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5maWx0ZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlciA9IGZpbHRlcmluZ01vZGlmaWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGNvbHVtbnM6IEFycmF5PENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZz4pID0+ICh7XG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgfVxuICAgICAgICB9KSksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5KSxcbiAgICAgICAgdGhpcy50cmltRmlsdGVyQ29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1Tb3J0Q29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uT3JkZXJQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKSxcbiAgICAgICAgY29uY2F0TWFwKChjb25maWc6IEdyaWRDb25maWcpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LnNhdmVDb25maWckKGNvbmZpZykpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1GaWx0ZXJDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnZmlsdGVyJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBjb2wuZmlsdGVyO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1Tb3J0Q29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3NvcnQnLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29sLnNvcnRPcmRlciA9ICcnO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248XG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPixcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gID4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnY3VzdG9tQ29sdW1ucycsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGNvbDogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiAhY29sLmN1c3RvbSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uT3JkZXJQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnb3JkZXInLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgIG9sZENvbmZpZz8uY29sdW1ucyB8fCAodGhpcy5kZWZhdWx0Q29sdW1ucyBhcyBDb2x1bW5Db25maWdbXSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjdXN0b20gY29sdW1ucyBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNBZGRlZCA9IChjb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICBjb2wgPT4gIW9sZENvbHVtbnMuZmluZChvbGQgPT4gb2xkLm5hbWUgPT09IGNvbC5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSBbXG4gICAgICAgICAgICAgIC4uLm9sZENvbHVtbnMubWFwKG9sZENvbCA9PlxuICAgICAgICAgICAgICAgIChjb25maWcuY29sdW1ucyB8fCBbXSkuZmluZChuZXdDb2wgPT4gbmV3Q29sLm5hbWUgPT09IG9sZENvbC5uYW1lKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5zQWRkZWRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCd2aXNpYmlsaXR5JywgY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbmZpZyQoKS5waXBlKFxuICAgICAgICAgIG1hcChvbGRDb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChuZXdDb2wgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sID0gY29sdW1ucy5maW5kKChjb2w6IGFueSkgPT4gbmV3Q29sLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgbmV3Q29sLnZpc2libGUgPSBvbGRDb2w/LnZpc2libGUgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXZlbnRQaXBlKFxuICAgIGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0LFxuICAgIHRyaW1FdmVudERhdGFGbjogKGNvbmZpZzogR3JpZENvbmZpZykgPT4gR3JpZENvbmZpZyB8IE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ29uZmlnRmlsdGVyXG4gICAgICAgICAgLmNhbGwodGhpcywgY29uZmlnUGFydClcbiAgICAgICAgICAucGlwZShtYXAoa2VlcEV2ZW50RGF0YSA9PiAoeyBjb25maWcsIGtlZXBFdmVudERhdGEgfSkpKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSA9PlxuICAgICAgICBrZWVwRXZlbnREYXRhID8gY29uZmlnIDogdHJpbUV2ZW50RGF0YUZuLmNhbGwodGhpcywgY29uZmlnKVxuICAgICAgKSxcbiAgICAgIGNvbmNhdE1hcChjb25maWcgPT4gKGlzT2JzZXJ2YWJsZShjb25maWcpID8gY29uZmlnIDogb2YoY29uZmlnKSkgYXMgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmlnRmlsdGVyKGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNvbnN0IHZhbHVlT3JGbiA9IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZU9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlT3JGbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZU9yRm47XG4gICAgfVxuICAgIHJldHVybiB0b09ic2VydmFibGUocmVzdWx0ID8/IHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYWZlbHlJbnZva2VNYXRjaGVyKFxuICAgIG1hdGNoZXNGbjogKFxuICAgICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgY29udGV4dD86IEdyaWRDb25maWdDb250ZXh0XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIGNvbnRleHQ/OiBHcmlkQ29uZmlnQ29udGV4dFxuICApIHtcbiAgICBpZiAobWF0Y2hlc0ZuKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc0ZuKHJvdXRlLCBjb250ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1zY3JvbGxcIlxuICAjc2Nyb2xsXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndGFibGUtZGF0YS1ncmlkX19vdmVybGF5JzogKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgIWxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcbiAgfVwiXG4gIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS10YWJsZS1kYXRhLWdyaWQtc2Nyb2xsXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS13cmFwcGVyXCJcbiAgICAqbmdJZj1cIihkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudD8uaXNMb2FkaW5nXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWRfX2xvYWRpbmctLWxvYWRlclwiPlxuICAgICAgPGM4eS1sb2FkaW5nXG4gICAgICAgIGxheW91dD1cImFwcGxpY2F0aW9uXCJcbiAgICAgICAgW21lc3NhZ2VdPVwibG9hZGluZ0l0ZW1zTGFiZWxcIlxuICAgICAgPjwvYzh5LWxvYWRpbmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1oZWFkZXIgc2VwYXJhdG9yIGxhcmdlLXBhZGRpbmdcIlxuICAgICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZ3JpZEhlYWRlclwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImg0XCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ20tci0xNic6ICEhdGl0bGUgfVwiXG4gICAgPlxuICAgICAge3sgdGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcmluZ0FwcGxpZWRcIj5cbiAgICAgICAgPHNtYWxsXG4gICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgKm5nSWY9XCIhIWZpbHRlcmluZ0xhYmVsc1BhcmFtcy5hbGxJdGVtc0NvdW50XCJcbiAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJmaWx0ZXJpbmdMYWJlbHNQYXJhbXNcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZmlsdGVyZWRJdGVtc0NvdW50IH19IG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImxhYmVsIGxhYmVsLWRlZmF1bHQgbS1yLTRcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgTm8gZmlsdGVyc1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgKm5nSWY9XCJmaWx0ZXJpbmdBcHBsaWVkXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvIG0tci00XCI+XG4gICAgICAgICAgICAgIHt7IChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgI2RkRmlsdGVycz1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImRkRmlsdGVycy5pc09wZW5cIlxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBtLWwtOFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBY3RpdmUgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1maWx0ZXJzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cImZpbHRlclwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0FjdGl2ZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2Utc3lzdGVtXCI+XG4gICAgICAgICAgICAgIHt7IGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQubGVuZ3RoIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIlxuICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtZ3JpZF9fZHJvcGRvd24gYmctbGV2ZWwtMFwiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIG0tMFwiPlxuICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkOyBsZXQgbGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VwYXJhdG9yLWJvdHRvbSc6ICFsYXN0IH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBzdGlja3ktdG9wIHRleHQtdHJ1bmNhdGUgbm8tYm9yZGVyLXRvcCBwLWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBib3JkZXJsZXNzIGQtZmxleCBkLWNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBlZEZpbHRlckNoaXBzIG9mIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcFRvRmlsdGVyQ2hpcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdyb3VwZWRGaWx0ZXJDaGlwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdwLXQtMCc6IGZpcnN0IH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21hbGwgcC1iLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cGVkRmlsdGVyQ2hpcHMubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwZWRGaWx0ZXJDaGlwcy5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgZ2FwLTQgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhZyB0YWctLWluZm8gY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGlwIG9mIGdyb3VwZWRGaWx0ZXJDaGlwcy5jaGlwc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4teHMgYnRuLWNsZWFuIHRleHQtMTAgbS1yLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGNoaXAucmVtb3ZlKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmVtb3ZlLWNoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hpcC5kaXNwbGF5VmFsdWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIHNlcGFyYXRvci10b3Agc3RpY2t5LWJvdHRvbVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdDbGVhciBhbGwgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWNsZWFyLWZpbHRlcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ0NsZWFyIGFsbCBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbSBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbcG9wb3Zlcl09XCJmaWx0ZXJzSGVscFBvcG92ZXJcIlxuICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1oZWxwLWZpbHRlcnNcIlxuICAgICAgPlxuICAgICAgICA8aSBjOHlJY29uPVwicXVlc3Rpb24tY2lyY2xlLW9cIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmlsdGVyc0hlbHBQb3BvdmVyPlxuICAgICAgICA8ZGl2IFtpbm5lckh0bWxdPVwiZmlsdGVyc0hlbHBQb3BvdmVySHRtbCB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0bi1jbGVhbiB0ZXh0LXByaW1hcnkgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgcG9wb3Zlcj1cInt7ICdUaGUgY291bnRlciBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBtaWdodCBiZSBpbmFjY3VyYXRlLicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJzaG93Q291bnRlcldhcm5pbmdcIlxuICAgICAgPlxuICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cIm0tbC1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnRuYmFyIGQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyQWN0aW9uQ29udHJvbCBvZiBoZWFkZXJBY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9scyB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGVhZGVyQWN0aW9uQ29udHJvbC50ZW1wbGF0ZTsgZWxzZSBjdXN0b21UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG4gYnRuLWxpbmtcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5jYWxsYmFjaygpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogaGVhZGVyQWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgIHR5cGU6IGhlYWRlckFjdGlvbkNvbnRyb2wudHlwZVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgICBbYzh5SWNvbl09XCJoZWFkZXJBY3Rpb25Db250cm9sLmljb25cIlxuICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGhlYWRlckFjdGlvbkNvbnRyb2wudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBoZWFkZXJBY3Rpb25Db250cm9sOiBoZWFkZXJBY3Rpb25Db250cm9sIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICAgICpuZ0lmPVwiY29uZmlndXJlQ29sdW1uc0VuYWJsZWRcIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgI2RkQ29uZmlndXJlQ29sdW1ucz1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImRkQ29uZmlndXJlQ29sdW1ucy5pc09wZW5cIlxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdDb25maWd1cmUgY29sdW1ucycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLWJ0blwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwiY29sdW1uc1wiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0NvbmZpZ3VyZSBjb2x1bW5zJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDx1bFxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRhdGEtZ3JpZF9fZHJvcGRvd25cIlxuICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwIG0tMFwiXG4gICAgICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uQ29sdW1uRHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5wb3NpdGlvbkZpeGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZHJhZ2dhYmxlLWFmdGVyIHAtMCBhLWktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveCBwLWwtMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLWhlYWRlci0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpOyBlbWl0Q29uZmlnQ2hhbmdlKCdjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9WSVNJQklMSVRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogIWNvbHVtbi52aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3Qgc2hvd09uSG92ZXIgbWF4LXdpZHRoLWZpdCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZWBjb2x1bW4sdmVyYmAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnUmVtb3ZlYGNvbHVtbix2ZXJiYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUN1c3RvbUNvbHVtbihwb0NvbmZpcm0sIGNvbHVtbiwgZGRDb25maWd1cmVDb2x1bW5zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5jdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjOHktcG9wb3Zlci1jb25maXJtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ29uZmlybSByZW1vdmFsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNwb0NvbmZpcm1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2M4eS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjOHlJY29uPVwibWludXMtY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tY3VzdG9tLWNvbHVtbi1yZW1vdmUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICBjbGFzcz1cInAtOCBzdGlja3ktYm90dG9tIHNlcGFyYXRvci10b3BcIlxuICAgICAgICAgICAgICAqbmdJZj1cImlzQ29uZmlnQ29udGV4dEtub3duXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIGN1c3RvbSBjb2x1bW4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1hZGQtY3VzdG9tLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DdXN0b21Db2x1bW5Nb2RhbCgpOyBkZENvbmZpZ3VyZUNvbHVtbnMuaGlkZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJwbHVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQWRkIGN1c3RvbSBjb2x1bW4nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0biBidG4tbGlua1wiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCIhaGlkZVJlbG9hZFwiXG4gICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcmVsb2FkLWJ0blwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUmVsb2FkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgID48L2k+XG4gICAgICAgICAgPHNwYW4+e3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNlYXJjaCBtLWwtc20tMTYgZGF0YS1ncmlkX19zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgfHwgc2hvd1NlYXJjaFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1NlYXJjaOKApicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoVGV4dCQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXJcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwidGltZXNcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hUZXh0ID0gJyc7IHNlYXJjaFRleHQkLmVtaXQoJycpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5DTEVBUl9TRUFSQ0ggfVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnMgYW5pbWF0ZWQgc2xpZGVJbkRvd24gZmFzdFwiXG4gICAgICBkYXRhLWN5PVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnNcIlxuICAgICAgKm5nSWY9XCJzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoICE9PSAwXCJcbiAgICA+XG4gICAgICA8aDQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nUGx1cmFsXT1cInNlbGVjdGVkSXRlbUlkcy5sZW5ndGhcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTFcIj5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT4xIHNlbGVjdGVkIGl0ZW0uPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIm90aGVyXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IHNlbGVjdGVkSXRlbUlkcy5sZW5ndGggfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNvdW50IH19IHNlbGVjdGVkIGl0ZW1zLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8YnIgY2xhc3M9XCJ2aXNpYmxlLXhzXCIgLz5cbiAgICAgICAgPHNtYWxsICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgJiYgc2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCA+PSBwYWdpbmF0aW9uLnBhZ2VTaXplXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJhY3RcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldEFsbEl0ZW1zU2VsZWN0ZWQodHJ1ZSlcIlxuICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiAoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBTZWxlY3QgYWxsIHt7IGNvdW50IH19IGl0ZW1zXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuYmFyIGQtZmxleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgYnVsa0FjdGlvbkNvbnRyb2wgb2YgYnVsa0FjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiBzZWxlY3RlZEl0ZW1JZHMgfCBhc3luY1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJidWxrQWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19FWFBPUlQgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic2lnbi1vdXRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19ERUxFVEUgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBidWxrQWN0aW9uQ29udHJvbC50ZXh0XG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1bGtBY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBidWxrQWN0aW9uQ29udHJvbC5pY29uIH19XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NBTkNFTFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8dGFibGVcbiAgICBjbGFzcz1cInRhYmxlIHRhYmxlLWZpbHRlcmVkLXNvcnRlZCB0YWJsZS1kYXRhLWdyaWQgbGFyZ2UtcGFkZGluZ1wiXG4gICAgW2NsYXNzLnRhYmxlLXN0cmlwZWRdPVwiZGlzcGxheU9wdGlvbnMuc3RyaXBlZFwiXG4gICAgW2NsYXNzLnRhYmxlLWJvcmRlcmVkXT1cImRpc3BsYXlPcHRpb25zLmJvcmRlcmVkXCJcbiAgICBbY2xhc3MudGFibGUtaG92ZXJdPVwiZGlzcGxheU9wdGlvbnMuaG92ZXJcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1jaGVja2JveGVzXT1cInNlbGVjdGFibGVcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1hY3Rpb25zXT1cImFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDBcIlxuICAgIFtzdHlsZS5ncmlkLXRlbXBsYXRlLWNvbHVtbnNdPVwic3R5bGVzLmdyaWRUZW1wbGF0ZUNvbHVtbnNcIlxuICAgIGNkay10YWJsZVxuICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwidHJ1ZVwiXG4gICAgKG1vdXNlbW92ZSk9XCJyZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkLmVtaXQoJGV2ZW50KVwiXG4gICAgKG1vdXNldXApPVwicmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQuZW1pdCgkZXZlbnQpXCJcbiAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tdGFibGVcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICBbY2RrQ29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxEZXNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKCRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRJdGVtc1NlbGVjdGVkKFtyb3ddLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0lURU0sXG4gICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8tYnV0dG9uJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPjwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXJhZGlvXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInNlbGVjdC1yb3dcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VTZWxlY3RlZEl0ZW0ocm93KVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yYWRpb1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FjdGlvbnMnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtIHNyLW9ubHlcIj57eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICB8IHZpc2libGVDb250cm9sczogcm93XG4gICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICB8IHNsaWNlOiAwIDogKChhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyID8gMSA6IDIpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImFjdGlvbkNvbnRyb2wudHlwZVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3RcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRWRpdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkVkaXRcIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRURJVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1lZGl0LWJ1dHRvbi1pbi1yb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IGJ0bi1kb3QtLWRhbmdlciBzaG93T25Ib3ZlclwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkRFTEVURV9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmVtb3ZlLWJ1dHRvbi1pbi1yb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGFjdGlvbkNvbnRyb2wuaWNvbiA/IGFjdGlvbkNvbnRyb2wudGV4dCA6ICcnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgKGFjdGlvbkNvbnRyb2wuaWNvbiA/IGFjdGlvbkNvbnRyb2wudGV4dCA6ICcnKSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBzaG93T25Ib3ZlcjogYWN0aW9uQ29udHJvbC5zaG93T25Ib3ZlciB9XCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2M4eS1kYXRhLWdyaWQtLWJ1dHRvbi1pbi1yb3ctLScgKyBhY3Rpb25Db250cm9sLnRleHRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25Db250cm9sLmljb25cIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFjdGlvbkNvbnRyb2wuaWNvblwiPnt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ20tbC1hdXRvIG92ZXJmbG93LXZpc2libGUnOlxuICAgICAgICAgICAgICAgICAgKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDJcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gcmlnaHRcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMlwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBjOHktZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcm93LWFjdGlvbnMtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZWxsaXBzaXMtdlwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGFjdGlvbkNvbnRyb2wgb2YgYWN0aW9uQ29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgdmlzaWJsZUNvbnRyb2xzOiByb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgc2xpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDIgPyAxIDogMilcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FRElUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5EZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuREVMRVRFX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FWFBPUlRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkYXRhLWV4cG9ydFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgW2NsYXNzLnNvcnRlZF09XCJjb2x1bW4uc29ydE9yZGVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5maWx0ZXJlZF09XCJjb2x1bW4gfCBtYXA6IGlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZFwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJjb2x1bW4uZGF0YVR5cGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWMgOiB0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIj48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGlzRHJvcERvd25QbGFjZWRSaWdodCB0byBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIHt7IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pID8gJ3JpZ2h0JyA6ICdsZWZ0JyB9fVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICAgICAjZ3JpZEhlYWRlckRyb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImdyaWRIZWFkZXJEcm9wZG93bi5pc09wZW5cIlxuICAgICAgICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2RhdGEtZ3JpZC0taGVhZGVyLWJ0bi0tJyArIGNvbHVtbi5oZWFkZXJcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tYzh5LWNlbGwtcmVuZGVyZXJcIlxuICAgICAgICAgICAgICAgICAgICBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0ZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiXG4gICAgICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQtZ3JpZCc6IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZGF0YS1ncmlkX19kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duOiBncmlkSGVhZGVyRHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLWNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NwZWNdPVwiZmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlY1wiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWM4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlclwiXG4gICAgICAgICAgICAgICAgICAgID48L2M4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1zb3J0XCJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInsgJ21hcmdpbi1sZWZ0JzogIWNvbHVtbi5maWx0ZXJhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSA/ICctMjBweCcgOiBudWxsIH1cIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwic29ydENvbHVtblRpdGxlIHwgdHJhbnNsYXRlOiB7IG5hbWU6IGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTb3J0T3JkZXIoY29sdW1uLm5hbWUpXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImNoYW5nZS1zb3J0LW9yZGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnNvcnRPcmRlclwiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9uZy1hcnJvdy11cFwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2FzYydcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb25nLWFycm93LWRvd25cIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkZXNjJ1wiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImV4Y2hhbmdlXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5yZXNpemFibGVcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIlxuICAgICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZU1vdXNlRG93biQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHRhcmdldENvbHVtbk5hbWU6IGNvbHVtbi5uYW1lIH0pXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtY2VsbC10aXRsZV09XCJjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmNlbGxDU1NDbGFzc05hbWVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwiY29sdW1uLmRhdGFUeXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzb2x2ZUNlbGxWYWx1ZShyb3csIGNvbHVtbi5wYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0Q2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJpbmZpbml0ZVNjcm9sbEZvb3RlclwiPlxuICAgICAgPHRkXG4gICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCJzdHlsZXMuZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uXCJcbiAgICAgICAgY2RrLWZvb3Rlci1jZWxsXG4gICAgICAgICpjZGtGb290ZXJDZWxsRGVmXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSAjaW5maW5pdGVTY3JvbGxDb250YWluZXI+PC90ZW1wbGF0ZT5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHJcbiAgICAgIGNkay1oZWFkZXItcm93XG4gICAgICAqY2RrSGVhZGVyUm93RGVmPVwiY29sdW1uTmFtZXNcIlxuICAgID48L3RyPlxuXG4gICAgPHRyXG4gICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcm93LWluLWRhdGEtZ3JpZFwiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uTmFtZXM7IGxldCBpZHggPSBkYXRhSW5kZXhcIlxuICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICBhY3RpdmVDbGFzc05hbWUgJiYgcm93ID09PSBsYXN0Q2xpY2tlZFJvdyA/IGFjdGl2ZUNsYXNzTmFtZSA6ICcnLFxuICAgICAgICBpZHggJSAyID09PSAwID8gJ2V2ZW4nIDogJ29kZCdcbiAgICAgIF1cIlxuICAgICAgKG1vdXNlb3Zlcik9XCJyb3dNb3VzZU92ZXIuZW1pdChyb3cpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cInJvd01vdXNlTGVhdmUuZW1pdChyb3cpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDbGljayhyb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDx0clxuICAgICAgY2xhc3M9XCJleHBhbmRlZC1yb3dcIlxuICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICEoZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkIHwgYXN5bmMpIH1cIlxuICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWV4cGFuZGVkLXJvdy1pbi1kYXRhLWdyaWRcIlxuICAgICAgY2RrLXJvd1xuICAgICAgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWQtcm93J107IHdoZW46IGlzUm93RXhwYW5kZWRcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJleHBhbmRlZC1yb3dcIj5cbiAgICAgIDx0ZFxuICAgICAgICBbc3R5bGUuZ3JpZC1jb2x1bW5dPVwic3R5bGVzLmdyaWRJbmZpbml0ZVNjcm9sbENvbHVtblwiXG4gICAgICAgIGNkay1jZWxsXG4gICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgZXhwYW5kYWJsZVJvdz8udGVtcGxhdGU7XG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICBhc3luY1JlbmRlclN1Y2Nlc3M6IHNldEV4cGFuZGFibGVSb3dWaXNpYmxlLmJpbmQodGhpcywgcm93LCB0cnVlKSxcbiAgICAgICAgICAgICAgYXN5bmNSZW5kZXJGYWlsOiBzZXRFeHBhbmRhYmxlUm93VmlzaWJsZS5iaW5kKHRoaXMsIHJvdywgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8dHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICFpbmZpbml0ZVNjcm9sbCB9XCJcbiAgICAgICAgY2RrLWZvb3Rlci1yb3dcbiAgICAgICAgKmNka0Zvb3RlclJvd0RlZj1cIlsnaW5maW5pdGVTY3JvbGxGb290ZXInXVwiXG4gICAgICA+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90YWJsZT5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXggbS0wIHAtdC00MCBwLWItNDBcIlxuICAgICpuZ0lmPVwiXG4gICAgICAhKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiZcbiAgICAgICgoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID09PSAwIHx8IChkYXRhU291cmNlLmRhdGEkIHwgYXN5bmMpLmxlbmd0aCA9PT0gMClcbiAgICBcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGNvbC1zbS00IG0tbC1hdXRvIG0tci1hdXRvXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjOHktdWktZW1wdHktc3RhdGUsIC5jOHktZW1wdHktc3RhdGVcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgZW1wdHlTdGF0ZT8udGVtcGxhdGVSZWY7XG4gICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IGVtcHR5U3RhdGVDb250ZXh0JCB8IGFzeW5jIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWZvb3RlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiXG4gICAgKm5nSWY9XCJwYWdpbmF0aW9uICYmICFpbmZpbml0ZVNjcm9sbFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY291bnRlciBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmN1cnJlbnRQYWdlU2l6ZSA+IDBcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jb3VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInRleHQtbXV0ZWRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInBhZ2luYXRpb25MYWJlbFBhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBwYWdlRmlyc3RJdGVtSWR4IH19IC0ge3sgcGFnZUxhc3RJdGVtSWR4IH19IG9mIHt7IGl0ZW1zVG90YWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyIHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWlubGluZSBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA+IG1pblBvc3NpYmxlUGFnZVNpemVcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICBmb3I9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0l0ZW1zIHBlciBwYWdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgaWQ9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcGFnZXNpemUtb3B0aW9uc1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlOiAkZXZlbnQsIHBhZ2U6IHBhZ2luYXRpb24uY3VycmVudFBhZ2UgfSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZVNpemUgb2YgcG9zc2libGVQYWdlU2l6ZXNcIlxuICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHBhZ2VTaXplIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1yaWdodFwiPlxuICAgICAgPHBhZ2luYXRpb25cbiAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJoaWRlUGFnaW5hdGlvbiQgfCBhc3luY1wiXG4gICAgICAgIGNsYXNzPVwicC10LTggcC1iLThcIlxuICAgICAgICAqbmdJZj1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPiAwXCJcbiAgICAgICAgW25nTW9kZWxdPVwicGFnaW5hdGlvbi5jdXJyZW50UGFnZVwiXG4gICAgICAgIChwYWdlQ2hhbmdlZCk9XCJ1cGRhdGVQYWdpbmF0aW9uKCRldmVudClcIlxuICAgICAgICBbdG90YWxJdGVtc109XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplXCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgKG51bVBhZ2VzKT1cInRvdGFsUGFnZXNDb3VudCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgW21heFNpemVdPVwiNVwiXG4gICAgICAgIFtib3VuZGFyeUxpbmtzXT1cImZhbHNlXCJcbiAgICAgICAgcHJldmlvdXNUZXh0PVwiUHJldmlvdXNcIlxuICAgICAgICBuZXh0VGV4dD1cIk5leHRcIlxuICAgICAgPjwvcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
1279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQ0wsUUFBUSxJQUFJLFNBQVMsRUFDckIsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEVBQ0gsT0FBTyxFQUNQLE9BQU8sRUFDUCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1IsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNB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RUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxzQkFBc0I7Z0JBR0csZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHckMsVUFBVTtzQkFBbkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBc0VtQixNQUFNO3NCQUFoRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWpELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrSGVhZGVyQ2VsbCwgQ2RrVGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSUlkZW50aWZpZWQsIElSZXN1bHRMaXN0LCBQYWdpbmcgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBwYXJzZUludCBhcyBfcGFyc2VJbnQsXG4gIGNhc3RBcnJheSxcbiAgZmxvdyxcbiAgZ2V0LFxuICBpbmRleE9mLFxuICBpc0VtcHR5LFxuICBpc05pbCxcbiAgdW5pb24sXG4gIHVuaXFCeSxcbiAgd2l0aG91dFxufSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNEcm9wZG93bkRpcmVjdGl2ZSB9IGZyb20gJ25neC1ib290c3RyYXAvZHJvcGRvd24nO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBVbmFyeUZ1bmN0aW9uLFxuICBjb21iaW5lTGF0ZXN0LFxuICBmb3JrSm9pbixcbiAgaXNPYnNlcnZhYmxlLFxuICBtZXJnZSxcbiAgb2YsXG4gIHBpcGVcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBjb21iaW5lTGF0ZXN0V2l0aCxcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlbGF5LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uL2FsZXJ0L2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmUgfSBmcm9tICcuLi9jb21tb24vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29tbW9uL2V4dGVuc2lvbi1ob29rcyc7XG5pbXBvcnQgeyBMb2FkTW9yZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9sb2FkLW1vcmUuY29tcG9uZW50JztcbmltcG9ydCB7IExvYWRNb3JlTW9kZSB9IGZyb20gJy4uL2NvbW1vbi9sb2FkLW1vcmUubW9kZWwnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBQb3BvdmVyQ29uZmlybUJ1dHRvbnMsIFBvcG92ZXJDb25maXJtQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kYWwvcG9wb3Zlci1jb25maXJtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYWluc2lnaHRTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC1leHBlcmllbmNlL2dhaW5zaWdodC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnQsXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2Vcbn0gZnJvbSAnLi4vcHJvZHVjdC1leHBlcmllbmNlL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2RlbCc7XG5pbXBvcnQgeyBBY3Rpb25Db250cm9sc0V4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuL2FjdGlvbi1jb250cm9scy1leHRlbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsUmVuZGVyZXJTcGVjIH0gZnJvbSAnLi9jb2x1bW4vY2VsbC1yZW5kZXJlcic7XG5pbXBvcnQgeyBDb2x1bW5EaXJlY3RpdmUgfSBmcm9tICcuL2NvbHVtbi9jb2x1bW4uZGlyZWN0aXZlJztcbmltcG9ydCB7IEN1c3RvbUNvbHVtbiB9IGZyb20gJy4vY29sdW1uL2N1c3RvbS5jb2x1bW4nO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd0NvbHVtbiB9IGZyb20gJy4vY29sdW1uL2V4cGFuZGFibGUtcm93LWNvbHVtbi9leHBhbmRhYmxlLmRhdGEtZ3JpZC1jb2x1bW4nO1xuaW1wb3J0IHsgRmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYywgRmlsdGVyaW5nTW9kaWZpZXIgfSBmcm9tICcuL2NvbHVtbi9maWx0ZXJpbmctZm9ybS1yZW5kZXJlcic7XG5pbXBvcnQgeyBUcmVlTm9kZUNvbHVtbiB9IGZyb20gJy4vY29sdW1uL3RyZWUtbm9kZS1jb2x1bW4vdHJlZS1ub2RlLmRhdGEtZ3JpZC1jb2x1bW4nO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4uc2VydmljZSc7XG5pbXBvcnQge1xuICBEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSxcbiAgRGF0YUdyaWRDb25maWd1cmF0aW9uU3RyYXRlZ3ksXG4gIEdyaWRDb25maWdDb250ZXh0LFxuICBHcmlkQ29uZmlnUGFydCxcbiAgR3JpZEV2ZW50VHlwZVxufSBmcm9tICcuL2RhdGEtZ3JpZC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7XG4gIEFjdGlvbkNvbnRyb2wsXG4gIEFjdGlvbkNvbnRyb2xIb29rLFxuICBCdWlsdEluQWN0aW9uVHlwZSxcbiAgQnVsa0FjdGlvbkNvbnRyb2wsXG4gIENvbHVtbixcbiAgQ29sdW1uQ29uZmlnLFxuICBDb2x1bW5EYXRhVHlwZSxcbiAgQ3VzdG9tQ29sdW1uQ29uZmlnLFxuICBEYXRhR3JpZCxcbiAgRGF0YVNvdXJjZVN0YXRzLFxuICBEaXNwbGF5T3B0aW9ucyxcbiAgRmlsdGVyLFxuICBGaWx0ZXJDaGlwLFxuICBGaWx0ZXJpbmdBY3Rpb25UeXBlLFxuICBHcmlkQ29uZmlnLFxuICBIZWFkZXJBY3Rpb25Db250cm9sLFxuICBQYWdpbmF0aW9uLFxuICBSb3csXG4gIFNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gIFNvcnRPcmRlcixcbiAgU3BlY2lhbENvbHVtbk5hbWUsXG4gIG1pbkNvbHVtbkdyaWRUcmFja1NpemUsXG4gIHJhdGlvc0J5Q29sdW1uVHlwZXNcbn0gZnJvbSAnLi9kYXRhLWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgRGF0YUdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLWdyaWQuc2VydmljZSc7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93RGlyZWN0aXZlIH0gZnJvbSAnLi9leHBhbmRhYmxlLXJvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgR3JpZERhdGFTb3VyY2UgfSBmcm9tICcuL2dyaWQtZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHsgUFhfQUNUSU9OUywgUFhfRVZFTlRfTkFNRSB9IGZyb20gJy4vcHJvZHVjdC1leHBlcmllbmNlLmNvbnN0YW50cyc7XG5cbmVudW0gU29ydGluZ09yZGVyIHtcbiAgQVNDID0gJ2FzYycsXG4gIERFU0MgPSAnZGVzYydcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGEtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb250ZW50cycgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGFHcmlkQ29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhR3JpZENvbXBvbmVudFxuICBpbXBsZW1lbnRzIERhdGFHcmlkLCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2VcbntcbiAgLyoqIFRoZSB0aXRsZSBmb3IgdGhlIGRhdGEgZ3JpZCwgaXQncyBkaXNwbGF5ZWQgaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBnZXR0ZXh0KCdJdGVtcycpO1xuICAvKiogVGhlIGxhYmVsIGZvciBsb2FkIG1vcmUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBsb2FkTW9yZUl0ZW1zTGFiZWw6IHN0cmluZyA9IGdldHRleHQoJ0xvYWQgbW9yZSBpdGVtcycpO1xuICAvKiogVGhlIGxhYmVsIGZvciBsb2FkaW5nIGluZGljYXRvci4gKi9cbiAgQElucHV0KCkgbG9hZGluZ0l0ZW1zTGFiZWw6IHN0cmluZyA9IGdldHRleHQoJ0xvYWRpbmcgaXRlbXPigKYnKTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciB0ZXh0IHNlYXJjaCBpbnB1dCBpcyBzaG93biBpbiB0aGUgZ3JpZCdzIGhlYWRlci4gKi9cbiAgQElucHV0KCkgc2hvd1NlYXJjaCA9IGZhbHNlO1xuICAvKiogVGFrZXMgYW4gZXZlbnQgZW1pdHRlci4gV2hlbiBhbiBldmVudCBpcyBlbWl0dGVkLCB0aGUgZ3JpZCB3aWxsIGJlIHJlbG9hZGVkLiAqL1xuICBASW5wdXQoKSByZWZyZXNoOiBFdmVudEVtaXR0ZXI8dm9pZD47XG5cbiAgY29sdW1uczogQ29sdW1uW10gPSBbXTtcbiAgLyoqIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBncmlkLiAqL1xuICBASW5wdXQoJ2NvbHVtbnMnKVxuICBfY29sdW1uczogQ29sdW1uW107XG5cbiAgZGF0YVNvdXJjZSA9IG5ldyBHcmlkRGF0YVNvdXJjZSgpO1xuICByb3dzOiBSb3dbXTtcbiAgLyoqIFRoZSBsaXN0IG9mIHJvd3MgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBncmlkICh1c2VkIGZvciBjbGllbnQgc2lkZSBkYXRhKS4gKi9cbiAgQElucHV0KCdyb3dzJylcbiAgc2V0IF9yb3dzKHJvd3M6IFJvd1tdKSB7XG4gICAgdGhpcy5yb3dzID0gcm93cyB8fCBbXTtcbiAgfVxuXG4gIGZpbHRlcmluZ0xhYmVsc1BhcmFtcyA9IHtcbiAgICBmaWx0ZXJlZEl0ZW1zQ291bnQ6IDAsXG4gICAgYWxsSXRlbXNDb3VudDogMFxuICB9O1xuXG4gIHBhZ2luYXRpb246IFBhZ2luYXRpb247XG4gIHBhZ2luYXRpb25MYWJlbFBhcmFtcyA9IHtcbiAgICBwYWdlRmlyc3RJdGVtSWR4OiAwLFxuICAgIHBhZ2VMYXN0SXRlbUlkeDogMCxcbiAgICBpdGVtc1RvdGFsOiAwXG4gIH07XG4gIGxhc3RDbGlja2VkUm93OiBSb3c7XG4gIHJlYWRvbmx5IHBvc3NpYmxlUGFnZVNpemVzOiBudW1iZXJbXSA9IFsyNSwgNTAsIDEwMF07XG4gIHJlYWRvbmx5IG1pblBvc3NpYmxlUGFnZVNpemUgPSBNYXRoLm1pbiguLi50aGlzLnBvc3NpYmxlUGFnZVNpemVzKTtcbiAgLyoqIFBhZ2luYXRpb24gc2V0dGluZ3MsIGUuZy4gYWxsb3dzIGZvciBzZXR0aW5nIGN1cnJlbnQgcGFnZSBvciBwYWdlIHNpemUuICovXG4gIEBJbnB1dCgncGFnaW5hdGlvbicpXG4gIHNldCBfcGFnaW5hdGlvbihwYWdpbmF0aW9uOiBQYWdpbmF0aW9uKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0gcGFnaW5hdGlvbjtcbiAgfVxuXG4gIC8qKiBDaGlsZCBub2RlIHBhZ2luYXRpb24gc2V0dGluZ3MsIGUuZy4gYWxsb3dzIGZvciBzZXR0aW5nIHBhZ2Ugc2l6ZSBvZiBsb2FkZWQgY2hpbGQgbm9kZSBwYWdlcy4gKi9cbiAgQElucHV0KClcbiAgY2hpbGROb2RlUGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcblxuICBpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlO1xuICAvKiogU2V0cyBsb2FkIG1vcmUgbW9kZS4gKi9cbiAgQElucHV0KCdpbmZpbml0ZVNjcm9sbCcpXG4gIHNldCBfaW5maW5pdGVTY3JvbGwoaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZSkge1xuICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBpbmZpbml0ZVNjcm9sbDtcbiAgfVxuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGRhdGEgbmVlZHMgdG8gYmUgbG9hZGVkIGZyb20gc2VydmVyLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgW1tEYXRhU291cmNlTW9kaWZpZXJdXSBhbmQgcmV0dXJuIFtbU2VydmVyU2lkZURhdGFSZXN1bHRdXS5cbiAgICovXG4gIEBJbnB1dCgnc2VydmVyU2lkZURhdGFDYWxsYmFjaycpXG4gIHNldCBfc2VydmVyU2lkZURhdGFDYWxsYmFjayhzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID0gc2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgfVxuXG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgYSBjaGVja2JveCBpbiB0aGUgZmlyc3QgY29sdW1uLiAqL1xuICBASW5wdXQoJ3NlbGVjdGFibGUnKVxuICBzZXQgX3NlbGVjdGFibGUoc2VsZWN0YWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gIH1cblxuICBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoJ3NpbmdsZVNlbGVjdGlvbicpXG4gIHNldCBfc2luZ2xlU2VsZWN0aW9uKHNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uID0gc2luZ2xlU2VsZWN0aW9uO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleSA9ICdpZCc7XG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0ncyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VsZWN0aW9uIHN0YXR1cy4gKi9cbiAgQElucHV0KCdzZWxlY3Rpb25QcmltYXJ5S2V5JylcbiAgc2V0IF9zZWxlY3Rpb25QcmltYXJ5S2V5KHNlbGVjdGlvblByaW1hcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0aW9uUHJpbWFyeUtleSA9IHNlbGVjdGlvblByaW1hcnlLZXk7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMgPSB7XG4gICAgc3RyaXBlZDogdHJ1ZSxcbiAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgZ3JpZEhlYWRlcjogdHJ1ZSxcbiAgICBmaWx0ZXI6IHRydWUsXG4gICAgaG92ZXI6IHRydWVcbiAgfTtcbiAgLyoqIFNldHMgZGlzcGxheSBvcHRpb25zLiAqL1xuICBASW5wdXQoJ2Rpc3BsYXlPcHRpb25zJylcbiAgc2V0IF9kaXNwbGF5T3B0aW9ucyhkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQubmV4dChhY3Rpb25Db250cm9scyk7XG4gIH1cblxuICBidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuICovXG4gIEBJbnB1dCgnYnVsa0FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9idWxrQWN0aW9uQ29udHJvbHMoYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5idWxrQWN0aW9uQ29udHJvbHMgPSBidWxrQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICBoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIGRhdGEgZ3JpZCBoZWFkZXIpLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyhoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5oZWFkZXJBY3Rpb25Db250cm9scyA9IGhlYWRlckFjdGlvbkNvbnRyb2xzIHx8IFtdO1xuICB9XG5cbiAgLyoqIFNldHMgaW5pdGlhbCBzZWFyY2ggdGV4dC4gKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIGN1c3RvbSBjb2x1bW5zIGJ1dHRvbiB3aWxsIGJlIGVuYWJsZWQuICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkID0gdHJ1ZTtcblxuICAvKiogU2hvd3MgdGhlIHdhcm5pbmcgZm9yIHRoZSBzdWItYXNzZXRzIGNvdW50ZXIgKi9cbiAgQElucHV0KClcbiAgc2hvd0NvdW50ZXJXYXJuaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIHJvd3MgKGxhc3QgY2xpY2tlZCkuXG4gICAqIFNldCBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZSBhcHBlbmRpbmcgYWN0aXZlIGNsYXNzIHRvIGdyaWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUNsYXNzTmFtZSA9ICdhY3RpdmUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSByb3dzIG9mIHRoZSBkYXRhIGdyaWQgd2lsbCBiZSBleHBhbmRhYmxlLlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqIC0gYE5PTkVgIC0gbm8gZXhwYW5kYWJsZSByb3dzIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIGBTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIHN5bmNocm9ub3VzbHkgd2hlbiBidXR0b24gaXMgY2xpY2tlZFxuICAgKiAtIGBBU1lOQ2AgLSBhZGRpdGlvbmFsIGNvbHVtbiB3aXRoIGV4cGFuZCBidXR0b24gaXMgZGlzcGxheWVkIGFuZCBleHBhbmRhYmxlIHJvd3MgYXJlIGV4cGFuZGluZyBhc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlUm93czogJ05PTkUnIHwgJ1NZTkMnIHwgJ0FTWU5DJyA9ICdOT05FJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBncmlkIGlzIGEgdHJlZSBncmlkLlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgYW4gYWRkaXRpb25hbCBjb2x1bW4gd2l0aCBleHBhbmQvY29sbGFwc2UgYnV0dG9uIGlzIGRpc3BsYXllZCBmb3Igcm93cyB3aXRoIGNoaWxkIG5vZGVzLlxuICAgKi9cbiAgQElucHV0KCkgdHJlZUdyaWQ6IGJvb2xlYW47XG5cbiAgLyoqIERldGVybWluZXMgaWYgdGhlIFJlbG9hZCBidXR0b24gd2lsbCBiZSBoaWRkZW4uICovXG4gIEBJbnB1dCgpIGhpZGVSZWxvYWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW4gYSBjbGllbnQgc2lkZSBkYXRhIGZlZCB0cmVlLWdyaWQsIHRoaXMgaW5wdXQgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGVcbiAgICogcHJvcGVydHkgaG9sZGluZyB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBgY2hpbGROb2Rlc2AuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY2hpbGROb2Rlc1Byb3BlcnR5KGNoaWxkTm9kZXNQcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmNoaWxkTm9kZXNQcm9wZXJ0eSA9IGNoaWxkTm9kZXNQcm9wZXJ0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBhIHRyZWUtZ3JpZCwgdGhpcyBpbnB1dCBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBhIGxhYmVsXG4gICAqIHRvIHJlZmVyIHRvIHRoZSBwYXJlbnQgbm9kZSBpdHMgcGFnaW5hdGlvbiByb3cuXG4gICAqL1xuICBASW5wdXQoKSBwYXJlbnROb2RlTGFiZWxQcm9wZXJ0eSA9ICdpZCc7XG5cbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgaXMgb3ZlciBhIHJvdy4gKi9cbiAgQE91dHB1dCgpIHJvd01vdXNlT3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBtb3VzZSBsZWF2ZXMgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZUxlYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgcm93IGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBncmlkJ3MgY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkLiAqL1xuICBAT3V0cHV0KCkgb25Db25maWdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIGZpbHRlciBpcyBhcHBsaWVkLiAqL1xuICBAT3V0cHV0KCkgb25CZWZvcmVGaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGJlZm9yZSB0aGUgc2VhcmNoIGlzIHBlcmZvcm1lZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgZmlsdGVyIGlzIGFwcGxpZWQgaW4gYSBjb2x1bW4uICovXG4gIEBPdXRwdXQoKSBvbkZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGNvbHVtbk5hbWU/OiBzdHJpbmc7XG4gICAgZHJvcGRvd24/OiBCc0Ryb3Bkb3duRGlyZWN0aXZlO1xuICAgIGZpbHRlcmluZ01vZGlmaWVyPzogRmlsdGVyO1xuICB9PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBpdGVtcyBzZWxlY3Rpb24gY2hhbmdlcy4gVGhlIGFycmF5IGNvbnRhaW5zIGtleXMgb2Ygc2VsZWN0ZWQgaXRlbXMgKGtleSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGJ5IGBzZWxlY3Rpb25QcmltYXJ5S2V5YCkuICovXG4gIEBPdXRwdXQoKSBpdGVtc1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHJlbG9hZCBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgYWRkZWQgKi9cbiAgQE91dHB1dCgpIG9uQWRkQ3VzdG9tQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21Db2x1bW5Db25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgY3VzdG9tIGNvbHVtbiBpcyByZW1vdmVkICovXG4gIEBPdXRwdXQoKSBvblJlbW92ZUN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYWZ0ZXIgdGhlIGNvbHVtbiBmaWx0ZXIgaGFzIGJlZW4gcmVzZXQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uRmlsdGVyUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIHNvcnRpbmcgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Tb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBwYWdlIHNpemUgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25QYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uUmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQ29sdW1uRGlyZWN0aXZlKSBjb2x1bW5SZW5kZXJlcnM6IFF1ZXJ5TGlzdDxDb2x1bW5EaXJlY3RpdmU+O1xuXG4gIEBDb250ZW50Q2hpbGQoRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSlcbiAgZXhwYW5kYWJsZVJvdzogRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZTtcblxuICBAVmlld0NoaWxkKCdzY3JvbGwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzY3JvbGxDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnaW5maW5pdGVTY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgaW5maW5pdGVTY3JvbGxDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQENvbnRlbnRDaGlsZChFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSkgZW1wdHlTdGF0ZTogRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmU7XG5cbiAgbG9hZE1vcmVDb21wb25lbnQ6IExvYWRNb3JlQ29tcG9uZW50O1xuXG4gIGNvbHVtbk5hbWVzID0gW107XG5cbiAgc3R5bGVzID0ge1xuICAgIHRhYmxlQ3Vyc29yOiAnYXV0bycsXG4gICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdW5kZWZpbmVkLFxuICAgIGdyaWRJbmZpbml0ZVNjcm9sbENvbHVtbjogdW5kZWZpbmVkXG4gIH07XG5cbiAgc2VhcmNoVGV4dCQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgZmlsdGVyaW5nQXBwbGllZCA9IGZhbHNlO1xuICBjb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkOiBDb2x1bW5bXSA9IFtdO1xuXG4gIHRvdGFsUGFnZXNDb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oSW5maW5pdHkpO1xuICBoaWRlUGFnaW5hdGlvbiQgPSB0aGlzLnRvdGFsUGFnZXNDb3VudCQucGlwZShcbiAgICBtYXAodG90YWxQYWdlc0NvdW50ID0+IHRvdGFsUGFnZXNDb3VudCA8PSAxKSxcbiAgICBkZWxheSgwKSAvLyBwcmV2ZW50cyBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICk7XG5cbiAgc2VsZWN0ZWRJdGVtSWRzOiBzdHJpbmdbXSA9IFtdO1xuICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgIGFsbFNlbGVjdGVkOiBmYWxzZSxcbiAgICBhbGxEZXNlbGVjdGVkOiB0cnVlXG4gIH07XG5cbiAgYnVpbHRJbkFjdGlvblR5cGUgPSB7XG4gICAgRWRpdDogQnVpbHRJbkFjdGlvblR5cGUuRWRpdCxcbiAgICBEZWxldGU6IEJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZSxcbiAgICBFeHBvcnQ6IEJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFxuICB9O1xuXG4gIGNvbmZpcm1SZW1vdmVDb2x1bW5CdXR0b25zOiBQb3BvdmVyQ29uZmlybUJ1dHRvbnNbXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnQ2FuY2VsJyksXG4gICAgICBhY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdSZW1vdmVgY29sdW1uLHZlcmJgJyksXG4gICAgICBzdGF0dXM6ICdkYW5nZXInLFxuICAgICAgYWN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUodHJ1ZSlcbiAgICB9XG4gIF07XG5cbiAgaXNDb25maWdDb250ZXh0S25vd24gPSBmYWxzZTtcbiAgZW1wdHlTdGF0ZUNvbnRleHQkOiBPYnNlcnZhYmxlPERhdGFTb3VyY2VTdGF0cz47XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIHJvd3Mgd2hpY2ggaGF2ZSBiZWVuIGV4cGFuZGVkLlxuICAgKi9cbiAgZXhwYW5kZWRSb3dzOiBNYXA8Um93LCB7IHZpc2libGUkOiBTdWJqZWN0PGJvb2xlYW4+IHwgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IH0+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKiBQcm9kdWN0IGV4cGVyaWVuY2UgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyAqL1xuICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50ID0geyBldmVudE5hbWU6IFBYX0VWRU5UX05BTUUgfTtcbiAgUFhfQUNUSU9OUyA9IFBYX0FDVElPTlM7XG5cbiAgcmVhZG9ubHkgc29ydENvbHVtblRpdGxlID0gZ2V0dGV4dCgnU29ydCBjb2x1bW4gXCJ7eyBuYW1lIH19XCInKTtcblxuICByZXNpemVIYW5kbGVNb3VzZURvd24kID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyB0YXJnZXRDb2x1bW5OYW1lOiBzdHJpbmcgfT4oKTtcbiAgcmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgcmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgZmlsdGVyc0hlbHBQb3BvdmVySHRtbDogc3RyaW5nID0gZ2V0dGV4dCgnQ2xpY2sgdGhlIGNvbHVtbiBoZWFkZXJzIHRvIGFwcGx5IGZpbHRlcnMuJyk7XG5cbiAgcHJpdmF0ZSBoZWFkZXJCZWluZ1Jlc2l6ZWQ6IHtcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmc7XG4gICAgZWw6IEhUTUxFbGVtZW50O1xuICB9O1xuICBAVmlld0NoaWxkcmVuKENka0hlYWRlckNlbGwsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIHRoUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBwcml2YXRlIHRoRWxzOiBIVE1MRWxlbWVudFtdO1xuXG4gIEBWaWV3Q2hpbGQoQ2RrVGFibGUsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZVJlZjogQ2RrVGFibGU8YW55PjtcblxuICBwcml2YXRlIHJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjb2x1bW5zSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGRlZmF1bHRDb2x1bW5zOiBDb2x1bW5bXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVsb2FkQ29uZmlndXJhdGlvbiQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgYWN0aW9uQ29udHJvbHNJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFjdGlvbkNvbnRyb2xbXT4oW10pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIG1hbnVhbFNlYXJjaCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBsYXN0TWFudWFsU2VhcmNoVmFsdWUgPSAnJztcblxuICBwcml2YXRlIHJlYWRvbmx5IFNFQVJDSF9ERUJPVU5DRV9USU1FID0gNTAwO1xuXG4gIHByaXZhdGUgY3VzdG9tQ29sdW1uU2VydmljZSA9IGluamVjdChDdXN0b21Db2x1bW5TZXJ2aWNlKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc1NlcnZpY2U6IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uV2hlbk5vRGV2aWNlc0xhc3RQYWdlKHN0YXRzKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNDb25maWdDb250ZXh0S25vd24gPSAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5pc0NvbnRleHRLbm93bigpO1xuXG4gICAgdGhpcy5zZXR1cFNlYXJjaE9ic2VydmFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuZGF0YVNvdXJjZS5kYXRhJCwgdGhpcy5pdGVtc1NlbGVjdC5hc09ic2VydmFibGUoKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VFbXB0eSA9IGRhdGEubGVuZ3RoID09PSAwO1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgICAgICAgYWxsU2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyBmYWxzZSA6IGRhdGEuZXZlcnkoaXRlbSA9PiB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSxcbiAgICAgICAgICAgIGFsbERlc2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyB0cnVlIDogZGF0YS5ldmVyeShpdGVtID0+ICF0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuXG4gICAgdGhpcy5hY3Rpb25Db250cm9sc1NlcnZpY2UuaXRlbXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgc3dpdGNoTWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICAgIGhvb2tzLm1hcChob29rID0+XG4gICAgICAgICAgICAgIHRvT2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBob29rPy5tYXRjaGVzR3JpZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgICAgICAgICAgICAgICAgICAgaG9vay5tYXRjaGVzR3JpZCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb250ZXh0KClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZVxuICAgICAgICAgICAgICApLnBpcGUobWFwKG1hdGNoZXMgPT4gKHsgaG9vaywgbWF0Y2hlcyB9KSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKS5waXBlKHN0YXJ0V2l0aChbXSkpXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFycmF5PHsgaG9vazogQWN0aW9uQ29udHJvbEhvb2s7IG1hdGNoZXM6IGJvb2xlYW4gfT4pID0+XG4gICAgICAgICAgaG9va3MuZmlsdGVyKGhvb2sgPT4gaG9vay5tYXRjaGVzKS5tYXAoaG9vayA9PiBob29rLmhvb2spXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFjdGlvbkNvbnRyb2xIb29rW10pID0+XG4gICAgICAgICAgaG9va3MucmVkdWNlKChhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdLCBjdXJyZW50SG9vazogQWN0aW9uQ29udHJvbEhvb2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWN0aW9uQ29udHJvbHMsIC4uLmNhc3RBcnJheShjdXJyZW50SG9vay5hY3Rpb25Db250cm9scyldO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICApLFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmFjdGlvbkNvbnRyb2xzSW5wdXQkKSxcbiAgICAgICAgdGFwKFxuICAgICAgICAgIChbaG9va0NvbnRyb2xzLCBpbnB1dENvbnRyb2xzXSkgPT5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbkNvbnRyb2xzID0gWy4uLmlucHV0Q29udHJvbHMsIC4uLmhvb2tDb250cm9sc10pXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmICh0aGlzLnJlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG5cbiAgICAvLyBSZXNldHRpbmcgdGhlIHN0YXRzIHNpemUgdG8gMCB3aGVuIG1hbmFnZWQgb2JqZWN0cyBhcmUgZGVsZXRlZCBidXQgc2l6aW5nIG5vdCB5ZXQgdXBkYXRlZFxuICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIE1UTS02MDIyNiBpcyByZXNvbHZlZFxuICAgIHRoaXMuZW1wdHlTdGF0ZUNvbnRleHQkID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXRhU291cmNlLnN0YXRzJCwgdGhpcy5kYXRhU291cmNlLmRhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW3N0YXRzLCBkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHMuZmlsdGVyZWRTaXplID09PSAxICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdHMsIHNpemU6IDAsIGZpbHRlcmVkU2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0cztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldEV4cGFuZGFibGVSb3dWaXNpYmxlKHJvdzogUm93LCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhldmVudCkge1xuICAgIGlmIChcbiAgICAgICgoIWV2ZW50Ll9hY3Rpb25Db250cm9scyAmJiAhZXZlbnQuc2VhcmNoVGV4dCkgfHwgZXZlbnQuX2FjdGlvbkNvbnRyb2xzPy5maXJzdENoYW5nZSkgJiZcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxvYWQgPSAhIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uY3VycmVudFZhbHVlICYmICFldmVudC5faW5maW5pdGVTY3JvbGw/LmZpcnN0Q2hhbmdlO1xuICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdChyZWxvYWQpO1xuICAgIH1cbiAgICBpZiAoISFldmVudC5fY29sdW1ucyAmJiAhZXZlbnQuX2NvbHVtbnMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnNldHVwUmVzaXplSGFuZGxlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGV4cGFuZChyb3c6IFJvdykge1xuICAgIGNvbnN0IGlzU3luY0V4cGFuZCA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgPT09ICdTWU5DJztcbiAgICBsZXQgdmlzaWJsZVN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgaWYgKGlzU3luY0V4cGFuZCkge1xuICAgICAgdmlzaWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5kZWRSb3dzLnNldChyb3csIHsgdmlzaWJsZSQ6IHZpc2libGVTdWJqZWN0IH0pO1xuICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIHJldHVybiB2aXNpYmxlU3ViamVjdDtcbiAgfVxuXG4gIGNvbGxhcHNlKHJvdzogUm93KTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gIH1cblxuICBleHBhbmROb2RlKHJvdzogUm93KTogdm9pZCB7XG4gICAgcm93LnBhZ2luYXRpb24gPSByb3cucGFnaW5hdGlvbiA/PyB0aGlzLmNoaWxkTm9kZVBhZ2luYXRpb247XG4gICAgdGhpcy5sb2FkRGF0YShmYWxzZSwgcm93KTtcbiAgfVxuXG4gIGNvbGxhcHNlTm9kZShyb3c6IFJvdyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5jb2xsYXBzZU5vZGUocm93KTtcbiAgfVxuXG4gIGlzRGF0YVJvdyA9IChpZHg6IG51bWJlciwgcm93OiBSb3cpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gIXRoaXMuaXNQYWdpbmF0aW9uUm93KGlkeCwgcm93KTtcbiAgfTtcblxuICBpc1Jvd0V4cGFuZGVkID0gKF8sIHJvdzogUm93KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdyk7XG4gIH07XG5cbiAgaXNQYWdpbmF0aW9uUm93ID0gKF8sIHJvdzogUm93KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhcm93Py7OuHBhZ2luYXRpb247XG4gIH07XG5cbiAgc2V0Q29sdW1ucyhjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneSAmJiAhaXNFbXB0eSh0aGlzLl9jb2x1bW5zKSkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kYXRhR3JpZFNlcnZpY2UuYXBwbHlDb25maWdUb0NvbHVtbnMoY29uZmlnLCB0aGlzLl9jb2x1bW5zKTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgfHwgISF0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBzZXRQYWdlU2l6ZShjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISFjb25maWc/LnBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBnZXQodGhpcy5wYWdpbmF0aW9uLCAncGFnZVNpemUnKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICF0aGlzLnBvc3NpYmxlUGFnZVNpemVzLmZpbmQocG9zc2libGVQYWdlU2l6ZSA9PiBwb3NzaWJsZVBhZ2VTaXplID09PSBwYWdlU2l6ZSlcbiAgICApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5taW5Qb3NzaWJsZVBhZ2VTaXplIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkN1c3RvbUNvbHVtbigpIHtcbiAgICBhd2FpdCB0aGlzLmN1c3RvbUNvbHVtblNlcnZpY2Uub3BlbkN1c3RvbUNvbHVtbnModGhpcy5jb2x1bW5zLCBjb25maWcgPT4ge1xuICAgICAgY29uc3QgZmlyc3RGaXhlZCA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoYyA9PiBjLnBvc2l0aW9uRml4ZWQpO1xuICAgICAgY29uc3QgaWR4ID0gZmlyc3RGaXhlZCA+IC0xID8gZmlyc3RGaXhlZCA6IHRoaXMuY29sdW1ucy5sZW5ndGg7XG4gICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGlkeCwgMCwgbmV3IEN1c3RvbUNvbHVtbihjb25maWcpKTtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQUREX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgIGNvbHVtbjogY29uZmlnLmhlYWRlciB8fCBjb25maWcubmFtZVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uQWRkQ3VzdG9tQ29sdW1uLmVtaXQoY29uZmlnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUN1c3RvbUNvbHVtbihcbiAgICBwb0NvbmZpcm06IFBvcG92ZXJDb25maXJtQ29tcG9uZW50LFxuICAgIGNvbHVtbjogQ29sdW1uLFxuICAgIGRkQ29uZmlndXJlQ29sdW1uczogQnNEcm9wZG93bkRpcmVjdGl2ZVxuICApIHtcbiAgICBkZENvbmZpZ3VyZUNvbHVtbnMuYXV0b0Nsb3NlID0gZmFsc2U7XG4gICAgcG9Db25maXJtLm1lc3NhZ2UgPSBnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBjb2x1bW4/Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbW92ZTogYm9vbGVhbiA9IGF3YWl0IHBvQ29uZmlybS5zaG93KHRoaXMuY29uZmlybVJlbW92ZUNvbHVtbkJ1dHRvbnMpO1xuICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2w/Lm5hbWUgIT09IGNvbHVtbj8ubmFtZSk7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm9uUmVtb3ZlQ3VzdG9tQ29sdW1uLmVtaXQoY29sdW1uKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU1PVkVfQ1VTVE9NX0NPTFVNTixcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbi5oZWFkZXIgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IChkZENvbmZpZ3VyZUNvbHVtbnMuYXV0b0Nsb3NlID0gdHJ1ZSksIDApO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlRmlsdGVyKGZpbHRlcjogUGFydGlhbDxGaWx0ZXJDaGlwPikge1xuICAgIGNvbnN0IGZpbHRlcmluZ01vZGlmaWVyID0gZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnlcbiAgICAgID8geyBleHRlcm5hbEZpbHRlclF1ZXJ5OiBmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9XG4gICAgICA6IHsgZmlsdGVyUHJlZGljYXRlOiBmaWx0ZXIuZmlsdGVyUHJlZGljYXRlIH07XG4gICAgdGhpcy5vbkJlZm9yZUZpbHRlci5lbWl0KHtcbiAgICAgIGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lLFxuICAgICAgZHJvcGRvd246IHVuZGVmaW5lZCxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgKGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5ICYmICF0aGlzLmNoZWNrSWZBbnlWYWx1ZXNFeGlzdChmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpIHx8XG4gICAgICBmaWx0ZXIuZmlsdGVyUHJlZGljYXRlXG4gICAgKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbZmlsdGVyLmNvbHVtbk5hbWVdLCB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuUmVzZXRGaWx0ZXJcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2ZpbHRlci5jb2x1bW5OYW1lXSwge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyLFxuICAgICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5vbkZpbHRlci5lbWl0KHtcbiAgICAgICAgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICAgIGRyb3Bkb3duOiB1bmRlZmluZWQsXG4gICAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICBhY3Rpb246IFBYX0FDVElPTlMuUkVNT1ZFX0ZJTFRFUixcbiAgICAgIGNvbHVtbjogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICB9XG5cbiAgdHJhY2tCeU5hbWUoaW5kZXgsIGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5uYW1lO1xuICB9XG5cbiAgcmVzb2x2ZUNlbGxWYWx1ZShyb3csIHBhdGgpIHtcbiAgICByZXR1cm4gZmxvdyhbXG4gICAgICB4ID0+IHRoaXMuZGF0YVNvdXJjZS5yZXNvbHZlVmFsdWUoeCwgcGF0aCksXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucmVzb2x2ZUZ1bmN0aW9uLFxuICAgICAgdGhpcy5kYXRhU291cmNlLm5vcm1hbGl6ZU5pbFxuICAgIF0pKHJvdyk7XG4gIH1cblxuICBjaGFuZ2VTb3J0T3JkZXIoY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uTmFtZSk7XG5cbiAgICBpZiAoY29sdW1uKSB7XG4gICAgICBjb25zdCB7IHNvcnRPcmRlciB9ID0gY29sdW1uO1xuXG4gICAgICBpZiAoIXNvcnRPcmRlcikge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCBTb3J0aW5nT3JkZXIuQVNDKTtcbiAgICAgIH0gZWxzZSBpZiAoc29ydE9yZGVyID09PSBTb3J0aW5nT3JkZXIuQVNDKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sIFNvcnRpbmdPcmRlci5ERVNDKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVTb3J0aW5nKGNvbHVtbk5hbWVzOiBzdHJpbmdbXSwgc29ydE9yZGVyOiBTb3J0T3JkZXIpIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ0hBTkdFX1NPUlRJTkdfT1JERVIsXG4gICAgICBjb2x1bW5zOiBjb2x1bW5OYW1lcyxcbiAgICAgIHNvcnRPcmRlcjogc29ydE9yZGVyID09PSAnJyA/ICdub25lJyA6IHNvcnRPcmRlclxuICAgIH0pO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKTogQ29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29sdW1uLCBzb3J0T3JkZXIgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3NvcnQnKTtcblxuICAgIHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICBhcHBseUZpbHRlcihjb2x1bW5OYW1lLCBkcm9wZG93biwgZmlsdGVyaW5nTW9kaWZpZXIpIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICBhY3Rpb246IFBYX0FDVElPTlMuQVBQTFlfRklMVEVSLFxuICAgICAgY29sdW1uOiBjb2x1bW5OYW1lLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgICB0aGlzLm9uQmVmb3JlRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lLCBkcm9wZG93biwgZmlsdGVyaW5nTW9kaWZpZXIgfSk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2NvbHVtbk5hbWVdLCB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyLFxuICAgICAgcGF5bG9hZDogeyBmaWx0ZXJpbmdNb2RpZmllciB9XG4gICAgfSk7XG4gICAgZHJvcGRvd24uaGlkZSgpO1xuICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgfVxuXG4gIHJlc2V0RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoeyBhY3Rpb246IFBYX0FDVElPTlMuUkVTRVRfRklMVEVSLCBjb2x1bW46IGNvbHVtbk5hbWUgfSk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2NvbHVtbk5hbWVdLCB7IHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuUmVzZXRGaWx0ZXIgfSk7XG4gICAgZHJvcGRvd24uaGlkZSgpO1xuICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duIH0pO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXJzKHJlbG9hZCA9IHRydWUpIHtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhcbiAgICAgIHRoaXMuY29sdW1ucy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlclxuICAgICAgfSxcbiAgICAgIHJlbG9hZFxuICAgICk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHt9KTtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5DTEVBUl9GSUxURVIgfSk7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJpbmcoXG4gICAgY29sdW1uTmFtZXM6IHN0cmluZ1tdLFxuICAgIGFjdGlvbjoge1xuICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZTtcbiAgICAgIHBheWxvYWQ/OiB7IGZpbHRlcmluZ01vZGlmaWVyOiBGaWx0ZXJpbmdNb2RpZmllciB9O1xuICAgIH0sXG4gICAgcmVsb2FkID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICBpZiAoY29sdW1uTmFtZXMuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgIC4uLihhY3Rpb24udHlwZSA9PT0gRmlsdGVyaW5nQWN0aW9uVHlwZS5BcHBseUZpbHRlclxuICAgICAgICAgICAgPyBhY3Rpb24ucGF5bG9hZC5maWx0ZXJpbmdNb2RpZmllclxuICAgICAgICAgICAgOiB0aGlzLm9uUmVzZXRGaWx0ZXJBY3Rpb24oY29sdW1uKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0FwcGxpZWQoKTtcblxuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpIHtcbiAgICB0aGlzLmNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKHRoaXMuaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkKTtcbiAgICB0aGlzLmZpbHRlcmluZ0FwcGxpZWQgPSB0aGlzLmNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQubGVuZ3RoID4gMDtcblxuICAgIHRoaXMuZmlsdGVyc0hlbHBQb3BvdmVySHRtbCA9IHRoaXMuZmlsdGVyaW5nQXBwbGllZFxuICAgICAgPyBnZXR0ZXh0KFxuICAgICAgICAgICdDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4gQ2xpY2sgPGI+QWN0aXZlIGZpbHRlcnM8L2I+IGJ1dHRvbiB0byBtYW5hZ2UgYXBwbGllZCBmaWx0ZXJzLidcbiAgICAgICAgKVxuICAgICAgOiBnZXR0ZXh0KCdDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4nKTtcbiAgfVxuXG4gIGlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZChjb2x1bW46IENvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgZmlsdGVyYWJsZSwgZmlsdGVyUHJlZGljYXRlLCBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4gISEoZmlsdGVyYWJsZSAmJiAoZmlsdGVyUHJlZGljYXRlIHx8IGV4dGVybmFsRmlsdGVyUXVlcnkpKTtcbiAgfVxuXG4gIHVwZGF0ZVBhZ2luYXRpb24oeyBpdGVtc1BlclBhZ2UsIHBhZ2UgfSkge1xuICAgIGNvbnN0IGNvbmZpZ0NoYW5nZWQgPSB0aGlzLnBhZ2luYXRpb24/LnBhZ2VTaXplICE9PSBpdGVtc1BlclBhZ2U7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIHBhZ2VTaXplOiBpdGVtc1BlclBhZ2UsIGN1cnJlbnRQYWdlOiBwYWdlIH07XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIGlmIChjb25maWdDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3BhZ2luYXRpb24nKTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoeyBhY3Rpb246IFBYX0FDVElPTlMuQ0hBTkdFX1BBR0lOQVRJT04sIGl0ZW1zUGVyUGFnZSwgcGFnZSB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNoaWxkUGFnaW5hdGlvbih7IGl0ZW1zUGVyUGFnZSwgcGFnZSB9LCB7IHBhcmVudFJvdyB9KSB7XG4gICAgaWYgKFxuICAgICAgcGFnZSA9PT0gcGFyZW50Um93Py5wYWdpbmF0aW9uPy5jdXJyZW50UGFnZSAmJlxuICAgICAgaXRlbXNQZXJQYWdlID09PSBwYXJlbnRSb3c/LnBhZ2luYXRpb24/LnBhZ2VTaXplXG4gICAgKSB7XG4gICAgICAvLyBhdm9pZCBlbmRsZXNzIGxvb3AgdGhyb3VnaCBzYW1lIHBhZ2UgZmVlZGJhY2tcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50Um93LnBhZ2luYXRpb24gPSB7XG4gICAgICBjdXJyZW50UGFnZTogcGFnZSxcbiAgICAgIHBhZ2VTaXplOiBpdGVtc1BlclBhZ2VcbiAgICB9O1xuICAgIHRoaXMubG9hZERhdGEoZmFsc2UsIHBhcmVudFJvdyk7XG4gIH1cblxuICBjbGlja1JlbG9hZCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLnJlbG9hZCgpO1xuICAgIHRoaXMub25SZWxvYWQubmV4dCgpO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTE9BRCB9KTtcbiAgfVxuXG4gIHJlbG9hZChyZWRpcmVjdCA9IHRydWUpIHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICBjdXJyZW50UGFnZTogcmVkaXJlY3QgPyAxIDogdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlXG4gICAgfTtcbiAgICB0aGlzLnJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQgPSB0cnVlO1xuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XG4gICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICB9XG5cbiAgbG9hZE5leHRQYWdlKCk6IFByb21pc2U8SVJlc3VsdExpc3Q8b2JqZWN0Pj4ge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLm5leHRQYWdlIH07XG5cbiAgICB0aGlzLmxvYWREYXRhKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLnJlc3VsdExpc3QkXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBpbiBvcmRlciBmb3IgYHRvUHJvbWlzZWAgdG8gd29yaywgdGhlIG9ic2VydmFibGUgbmVlZHMgdG8gY29tcGxldGVcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAuLi5yZXN1bHQucGFnaW5nLFxuICAgICAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVzdWx0TGlzdDxvYmplY3Q+O1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlOiAnQ0VMTCcsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0hFQURFUicsIHZhbHVlLCByb3c6IHVuZGVmaW5lZCwgY29sdW1uTmFtZSB9KTtcbiAgfVxuXG4gIGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMoeyBjb2x1bW4sIGRyb3Bkb3duIH0pOiBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6XG4gICAgICAgIGdldCh0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbiksICdmaWx0ZXJpbmdGb3JtUmVuZGVyZXJEZWYudGVtcGxhdGUnKSB8fFxuICAgICAgICBjb2x1bW4uZmlsdGVyaW5nRm9ybVJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBwcm9wZXJ0eTogY29sdW1uLFxuICAgICAgICBhcHBseUZpbHRlcjogdGhpcy5hcHBseUZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93biksXG4gICAgICAgIHJlc2V0RmlsdGVyOiB0aGlzLnJlc2V0RmlsdGVyLmJpbmQodGhpcywgY29sdW1uLm5hbWUsIGRyb3Bkb3duKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRBbGxJdGVtc1NlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNlbGVjdGlvbiRcbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZpbHRlcmVkRGF0YUlkcyB9KSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZmlsdGVyZWREYXRhSWRzLCBzZWxlY3RlZCkpO1xuICB9XG5cbiAgc2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoc2VsZWN0ZWQpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZGF0YSwgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEl0ZW1zU2VsZWN0ZWQoaXRlbXM6IGFueSwgc2VsZWN0ZWQpIHtcbiAgICBjb25zdCBpdGVtSWRzID0gaXRlbXMubWFwKChpdGVtOiBvYmplY3QgfCBzdHJpbmcpID0+XG4gICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgPyBpdGVtW3RoaXMuc2VsZWN0aW9uUHJpbWFyeUtleV0gOiBpdGVtXG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gc2VsZWN0ZWRcbiAgICAgID8gdW5pb24odGhpcy5zZWxlY3RlZEl0ZW1JZHMsIGl0ZW1JZHMpXG4gICAgICA6IHdpdGhvdXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMsIC4uLml0ZW1JZHMpO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBjaGFuZ2VTZWxlY3RlZEl0ZW0oaXRlbTogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBbaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldXTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW107XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGlzSXRlbVNlbGVjdGVkKGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1JZHMuaW5jbHVkZXMoaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldKTtcbiAgfVxuXG4gIG9uQ29sdW1uRHJvcCh7IHByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCB9KSB7XG4gICAgY29uc3QgZGlmZmVyZW50SW5kZXggPSBwcmV2aW91c0luZGV4ICE9PSBjdXJyZW50SW5kZXg7XG5cbiAgICBpZiAoZGlmZmVyZW50SW5kZXgpIHtcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFT1JERVJfQ09MVU1OUyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbk5hbWVzW3ByZXZpb3VzSW5kZXhdXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5zcGxpY2UocHJldmlvdXNJbmRleCwgMSk7XG4gICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgY29sdW1uWzBdKTtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgncmVvcmRlckNvbHVtbicpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICB9XG5cbiAgdXBkYXRlR3JpZENvbHVtbnNTaXplKCkge1xuICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXG4gICAgICAgIHRoaXMuY29sdW1uc1xuICAgICAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKVxuICAgICAgICAgIC5tYXAoKHsgZ3JpZFRyYWNrU2l6ZSB9KSA9PiBncmlkVHJhY2tTaXplKVxuICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICksXG4gICAgICBncmlkSW5maW5pdGVTY3JvbGxDb2x1bW46IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgMSAvIC0xYClcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlVGhFbHMoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRoRWxzID0gdGhpcy50aFJlZnNcbiAgICAgICAgPyB0aGlzLnRoUmVmcy50b0FycmF5KCkubWFwKCh7IG5hdGl2ZUVsZW1lbnQgfSkgPT4gbmF0aXZlRWxlbWVudClcbiAgICAgICAgOiBbXTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIFRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy5cbiAgaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbjogQ29sdW1uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGluZGV4T2YoXG4gICAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUpLFxuICAgICAgICBjb2x1bW5cbiAgICAgICkgPlxuICAgICAgdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSkubGVuZ3RoIC8gMlxuICAgICk7XG4gIH1cblxuICBlbWl0Q29uZmlnQ2hhbmdlKGV2ZW50VHlwZT86IEdyaWRFdmVudFR5cGUpIHtcbiAgICBpZiAodGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSk7XG4gICAgICBjb25zdCBjb25maWcgPSB7IGNvbHVtbnMsIHBhZ2luYXRpb246IHRoaXMucGFnaW5hdGlvbiB9O1xuICAgICAgdGhpcy5vbkNvbmZpZ0NoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICBjYXNlICdzb3J0JzpcbiAgICAgICAgICB0aGlzLm9uU29ydC5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhZ2luYXRpb24nOlxuICAgICAgICAgIHRoaXMub25QYWdlU2l6ZUNoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Jlb3JkZXJDb2x1bW4nOlxuICAgICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5JzpcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGV2ZW50RGF0YSkge1xuICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQodGhpcy5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50Py5ldmVudE5hbWUgfHwgUFhfRVZFTlRfTkFNRSwge1xuICAgICAgLi4udGhpcy5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50Py5kYXRhLFxuICAgICAgLi4uZXZlbnREYXRhXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayhyb3c6IFJvdykge1xuICAgIHRoaXMubGFzdENsaWNrZWRSb3cgPSByb3c7XG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG4gIH1cblxuICBwZXJmb3JtU2VhcmNoKHNlYXJjaFRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7XG4gICAgdGhpcy5tYW51YWxTZWFyY2gkLm5leHQoc2VhcmNoVGV4dCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwU2VhcmNoT2JzZXJ2YWJsZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYXV0b1NlYXJjaCQgPSB0aGlzLnNlYXJjaFRleHQkLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5TRUFSQ0hfREVCT1VOQ0VfVElNRSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlICE9PSB0aGlzLmxhc3RNYW51YWxTZWFyY2hWYWx1ZSksXG4gICAgICB0YXAodmFsdWUgPT4ge1xuICAgICAgICB0aGlzLmxhc3RNYW51YWxTZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbWFudWFsU2VhcmNoJCA9IHRoaXMubWFudWFsU2VhcmNoJC5waXBlKFxuICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlLnRyaW0oKSAhPT0gJycpLFxuICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIG1lcmdlKGF1dG9TZWFyY2gkLCBtYW51YWxTZWFyY2gkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCksXG4gICAgICAgIHRhcChzZWFyY2hUZXh0ID0+IHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgICAgICAgIHRoaXMub25CZWZvcmVTZWFyY2guZW1pdChzZWFyY2hUZXh0KTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VBUkNILFxuICAgICAgICAgICAgc2VhcmNoSW5wdXQ6IHNlYXJjaFRleHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzZXRGaWx0ZXJBY3Rpb24oY29sdW1uOiBDb2x1bW4pIHtcbiAgICB0aGlzLm9uQ29sdW1uRmlsdGVyUmVzZXQuZW1pdChjb2x1bW4pO1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJQcmVkaWNhdGU6IHVuZGVmaW5lZCxcbiAgICAgIGV4dGVybmFsRmlsdGVyUXVlcnk6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG1hcENvbHVtblRvQ29uZmlnKGNvbHVtbjogQ29sdW1uKTogQ29sdW1uQ29uZmlnIHwgQ3VzdG9tQ29sdW1uQ29uZmlnIHtcbiAgICBsZXQgY29uZmlnO1xuICAgIGlmIChjb2x1bW4uY3VzdG9tKSB7XG4gICAgICBjb25zdCB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSwgaGVhZGVyLCBwYXRoIH0gPSBjb2x1bW47XG4gICAgICBjb25maWcgPSB7XG4gICAgICAgIHZpc2libGUsXG4gICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZmlsdGVyOiB7IGV4dGVybmFsRmlsdGVyUXVlcnkgfSxcbiAgICAgICAgaGVhZGVyLFxuICAgICAgICBwYXRoLFxuICAgICAgICBjdXN0b206IHRydWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gPSBjb2x1bW47XG4gICAgICBjb25maWcgPSB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZmlsdGVyOiB7IGV4dGVybmFsRmlsdGVyUXVlcnkgfSB9O1xuICAgIH1cblxuICAgIGlmIChpc0VtcHR5KGNvbmZpZz8uZmlsdGVyPy5leHRlcm5hbEZpbHRlclF1ZXJ5KSkge1xuICAgICAgZGVsZXRlIGNvbmZpZy5maWx0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGEocmVsb2FkID0gZmFsc2UsIHBhcmVudFJvdz86IFJvdykge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbFxuICAgIH0gPSB0aGlzO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmxvYWREYXRhKHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbCxcbiAgICAgIHJlbG9hZCxcbiAgICAgIHBhcmVudFJvd1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIGNvbnN0IHNwZWNpYWxDb2x1bW4gPSB7XG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwb3NpdGlvbkZpeGVkOiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCBzZWxlY3Rpb25Db2x1bW4gPSB0aGlzLnNlbGVjdGFibGVcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnNwZWNpYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogdGhpcy5zaW5nbGVTZWxlY3Rpb24gPyBTcGVjaWFsQ29sdW1uTmFtZS5SYWRpb0J1dHRvbiA6IFNwZWNpYWxDb2x1bW5OYW1lLkNoZWNrYm94LFxuICAgICAgICAgIGdyaWRUcmFja1NpemU6ICczMnB4J1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhY3Rpb25zQ29sdW1uID1cbiAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5zcGVjaWFsQ29sdW1uLFxuICAgICAgICAgICAgbmFtZTogU3BlY2lhbENvbHVtbk5hbWUuQWN0aW9ucyxcbiAgICAgICAgICAgIGdyaWRUcmFja1NpemU6ICdtaW5tYXgoNDBweCwgYXV0byknXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGV4cGFuZGFibGVSb3dzQ29sdW1uID0gdGhpcy5leHBhbmRhYmxlUm93cyAhPT0gJ05PTkUnID8gbmV3IEV4cGFuZGFibGVSb3dDb2x1bW4oKSA6IG51bGw7XG4gICAgY29uc3QgdHJlZU5vZGVDb2x1bXMgPSB0aGlzLnRyZWVHcmlkID8gbmV3IFRyZWVOb2RlQ29sdW1uKCkgOiBudWxsO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbXG4gICAgICB0cmVlTm9kZUNvbHVtcyxcbiAgICAgIGV4cGFuZGFibGVSb3dzQ29sdW1uLFxuICAgICAgc2VsZWN0aW9uQ29sdW1uLFxuICAgICAgLi4udGhpcy5jb2x1bW5zLFxuICAgICAgYWN0aW9uc0NvbHVtblxuICAgIF1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAodGhpcy53aXRoQ29sdW1uRGVmYXVsdHMpO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gdW5pcUJ5KGNvbHVtbnMsICduYW1lJyk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5OYW1lcygpO1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgdGhpcy51cGRhdGVUaEVscygpO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqLCByZXN1bHRzID0gW10pIHtcbiAgICBpZiAob2JqICYmIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqW2tleV0sIHJlc3VsdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzLnNvbWUodmFsID0+ICEhdmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aENvbHVtbkRlZmF1bHRzKGNvbHVtbik6IENvbHVtbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGUgfHwgQ29sdW1uRGF0YVR5cGUuVGV4dFNob3J0O1xuICAgIGNvbnN0IHsgaGVhZGVyQ1NTQ2xhc3NOYW1lLCBjZWxsQ1NTQ2xhc3NOYW1lIH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgICAgcmVzaXphYmxlOiBkYXRhVHlwZSA9PT0gJ2ljb24nID8gZmFsc2UgOiB0cnVlLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0T3JkZXI6ICcnLFxuICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGdyaWRUcmFja1NpemU6XG4gICAgICAgIGNvbHVtbi5ncmlkVHJhY2tTaXplIHx8XG4gICAgICAgIChkYXRhVHlwZSA9PT0gJ2ljb24nXG4gICAgICAgICAgPyBgbWF4LWNvbnRlbnRgXG4gICAgICAgICAgOiBgbWlubWF4KCR7bWluQ29sdW1uR3JpZFRyYWNrU2l6ZX1weCwgJHtyYXRpb3NCeUNvbHVtblR5cGVzW2RhdGFUeXBlXX1mcilgKSxcbiAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTpcbiAgICAgICAgKHR5cGVvZiBoZWFkZXJDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBoZWFkZXJDU1NDbGFzc05hbWUuc3BsaXQoJyAnKVxuICAgICAgICAgIDogaGVhZGVyQ1NTQ2xhc3NOYW1lKSB8fCBbXSxcbiAgICAgIGNlbGxDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgY2VsbENTU0NsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBjZWxsQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJykgOiBjZWxsQ1NTQ2xhc3NOYW1lKSB8fFxuICAgICAgICBbXVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbk5hbWVzKCkge1xuICAgIHRoaXMuY29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVzaXplSGFuZGxlKCkge1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZURyYWckID0gdGhpcy5yZXNpemVIYW5kbGVNb3VzZURvd24kLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgdGFwKCgpID0+IHRoaXMuY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSksXG4gICAgICBtZXJnZU1hcCgoeyBldmVudCwgdGFyZ2V0Q29sdW1uTmFtZSB9KSA9PiB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uLm5hbWUgPT09IHRhcmdldENvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyQ1NTQ2xhc3NOYW1lOiB1bmlvbihjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lLCBbJ2hlYWRlci0tYmVpbmctcmVzaXplZCddKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmhlYWRlckJlaW5nUmVzaXplZCA9IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiB0YXJnZXRDb2x1bW5OYW1lLFxuICAgICAgICAgIGVsOiAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8ucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgICAgIHRhYmxlQ3Vyc29yOiAnY29sLXJlc2l6ZSdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXNpemVIYW5kbGVEcmFnJC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4sIGkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgJiYgY29sdW1uLm5hbWUgPT09IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckRpdjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBSZWFkIHNjcm9sbENvbnRhaW5lckVsJ3Mgb2Zmc2V0IGxlZnQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9IHNjcm9sbENvbnRhaW5lckRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXG4gICAgICAgICAgICAvLyBBZGp1c3Qgd2l0aCB0aGUgc2Nyb2xsQ29udGFpbmVyRWwgaG9yaXpvbnRhbCBzY3JvbGwgcG9zaXRpb24uXG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRGl2LnNjcm9sbExlZnQgLSBob3Jpem9udGFsT2Zmc2V0O1xuXG4gICAgICAgICAgICAvLyBSZWFkIGxlZnQgb2Zmc2V0IG9mIHRoZSByZXNpemVkIGhlYWRlci5cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlck9mZnNldExlZnQgPSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5lbC5vZmZzZXRMZWZ0IHx8IDA7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGVzaXJlZCB3aWR0aC5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldCArIGV2ZW50LmNsaWVudFggLSBoZWFkZXJPZmZzZXRMZWZ0O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1uIG9iamVjdCB3aXRoIHRoZSBuZXcgc2l6ZSB2YWx1ZSwgZW5mb3JjZSBvdXIgbWluaW11bSBzaXplLlxuICAgICAgICAgICAgICBncmlkVHJhY2tTaXplOiBgJHtNYXRoLm1heChtaW5Db2x1bW5HcmlkVHJhY2tTaXplLCB3aWR0aCl9cHhgXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZvciB0aGUgb3RoZXIgaGVhZGVycyB3aGljaCBkb24ndCBoYXZlIGEgc2V0IHdpZHRoLCBmaXggaXQgdG8gdGhlaXIgY29tcHV0ZWQgd2lkdGguXG4gICAgICAgICAgaWYgKGNvbHVtbi5ncmlkVHJhY2tTaXplLnN0YXJ0c1dpdGgoJ21pbm1heCcpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIC8vIGlzbid0IGZpeGVkIHlldCAoaXQgd291bGQgYmUgYSBweCB2YWx1ZSlcbiAgICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogYCR7X3BhcnNlSW50KHRoaXMudGhFbHNbaV0uY2xpZW50V2lkdGgpfXB4YFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGNvbHVtbiBzaXplcy5cbiAgICAgICAgICogTm90ZTogZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHNldHMgdGhlIHdpZHRoIGZvciBhbGwgY29sdW1ucyBpbiBvbmUgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhlYWRlckJlaW5nUmVzaXplZCkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogd2l0aG91dChjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lLCAnaGVhZGVyLS1iZWluZy1yZXNpemVkJylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgICAgIHRhYmxlQ3Vyc29yOiAnYXV0bydcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSB7XG4gICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZSwgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICBjb25zdCBjb2x1bW5SZW5kZXJlciA9IHRoaXMuZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKTtcbiAgICBjb25zdCByZW5kZXJlclRlbXBsYXRlID0gZ2V0KFxuICAgICAgY29sdW1uUmVuZGVyZXIsXG4gICAgICBgJHt0eXBlID09PSAnSEVBREVSJyA/ICdoZWFkZXJDZWxsUmVuZGVyZXJEZWYnIDogJ2NlbGxSZW5kZXJlckRlZid9LnRlbXBsYXRlYFxuICAgICk7XG5cbiAgICBjb25zdCB7IGNlbGxSZW5kZXJlckNvbXBvbmVudCwgaGVhZGVyQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gPSBjb2x1bW47XG4gICAgY29uc3QgcmVuZGVyZXJDb21wb25lbnQgPVxuICAgICAgdHlwZSA9PT0gJ0hFQURFUicgPyBoZWFkZXJDZWxsUmVuZGVyZXJDb21wb25lbnQgOiBjZWxsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6IHJlbmRlcmVyVGVtcGxhdGUgfHwgcmVuZGVyZXJDb21wb25lbnQsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpdGVtOiByb3csXG4gICAgICAgIHByb3BlcnR5OiBjb2x1bW5cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pOiBDb2x1bW5EaXJlY3RpdmUge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblJlbmRlcmVycy50b0FycmF5KCkuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbi5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICB0aGlzLmZpbHRlcmluZ0xhYmVsc1BhcmFtcyA9IHtcbiAgICAgIGZpbHRlcmVkSXRlbXNDb3VudDogc3RhdHMuZmlsdGVyZWRTaXplLFxuICAgICAgYWxsSXRlbXNDb3VudDogc3RhdHMuc2l6ZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKHN0YXRzLm5leHRQYWdlKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgbmV4dFBhZ2U6IHN0YXRzLm5leHRQYWdlIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUZpcnN0SXRlbUlkeCA9IChzdGF0cy5jdXJyZW50UGFnZSAtIDEpICogc3RhdHMuZmlyc3RQYWdlU2l6ZSArIDE7XG4gICAgdGhpcy5wYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgICBwYWdlRmlyc3RJdGVtSWR4LFxuICAgICAgcGFnZUxhc3RJdGVtSWR4OiBwYWdlRmlyc3RJdGVtSWR4ICsgKHN0YXRzLmN1cnJlbnRQYWdlU2l6ZSAtIDEpLFxuICAgICAgaXRlbXNUb3RhbDogc3RhdHMuZmlsdGVyZWRTaXplXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnaW5hdGlvbldoZW5Ob0RldmljZXNMYXN0UGFnZShzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKCFzdGF0cy5uZXh0UGFnZSAmJiBzdGF0cy5jdXJyZW50UGFnZVNpemUgPT09IDAgJiYgc3RhdHMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlIC0gMSxcbiAgICAgICAgbmV4dFBhZ2U6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2FkTW9yZUNvbXBvbmVudChzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCAmJlxuICAgICAgc3RhdHMgJiZcbiAgICAgIHN0YXRzLm5leHRQYWdlICYmXG4gICAgICAoIXRoaXMubG9hZE1vcmVDb21wb25lbnQgfHwgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KVxuICAgICkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChMb2FkTW9yZUNvbXBvbmVudCk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBMb2FkTW9yZUNvbXBvbmVudDtcbiAgICAgIGluc3RhbmNlLnVzZUludGVyc2VjdGlvbiA9IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdhdXRvJyB8fCB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnaGlkZGVuJztcbiAgICAgIGluc3RhbmNlLmhpZGRlbiA9IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdoaWRkZW4nO1xuICAgICAgaW5zdGFuY2UucGFnaW5nID0ge1xuICAgICAgICBuZXh0UGFnZTogc3RhdHMubmV4dFBhZ2UsXG4gICAgICAgIG5leHQ6IHRoaXMubG9hZE5leHRQYWdlLmJpbmQodGhpcylcbiAgICAgIH0gYXMgUGFnaW5nPElJZGVudGlmaWVkPjtcbiAgICAgIGluc3RhbmNlLmxvYWROZXh0TGFiZWwgPSB0aGlzLmxvYWRNb3JlSXRlbXNMYWJlbDtcbiAgICAgIGluc3RhbmNlLmxvYWRpbmdMYWJlbCA9IHRoaXMubG9hZGluZ0l0ZW1zTGFiZWw7XG4gICAgICB0aGlzLmxvYWRNb3JlQ29tcG9uZW50ID0gaW5zdGFuY2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvYWRNb3JlQ29tcG9uZW50ICYmICFzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudC5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9IGFzIFBhZ2luZzxJSWRlbnRpZmllZD47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb1RvcCgpIHtcbiAgICBpZiAodGhpcy5pbmZpbml0ZVNjcm9sbCkge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0FuZFBlcnNpc3RDb25maWdDaGFuZ2UoKSB7XG4gICAgbWVyZ2UoXG4gICAgICBtZXJnZShcbiAgICAgICAgdGhpcy5vblNvcnQsXG4gICAgICAgIHRoaXMub25QYWdlU2l6ZUNoYW5nZSxcbiAgICAgICAgdGhpcy5vbkNvbHVtblJlb3JkZXJlZCxcbiAgICAgICAgdGhpcy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2VcbiAgICAgICkucGlwZShtYXAoY29uZmlnID0+IGNvbmZpZy5jb2x1bW5zKSksXG4gICAgICBtZXJnZSh0aGlzLm9uQWRkQ3VzdG9tQ29sdW1uLCB0aGlzLm9uUmVtb3ZlQ3VzdG9tQ29sdW1uKS5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gKHRoaXMuY29sdW1ucyB8fCBbXSkubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSkpXG4gICAgICApLFxuICAgICAgdGhpcy5vbkZpbHRlci5waXBlKFxuICAgICAgICBtYXAoKHsgY29sdW1uTmFtZSwgZmlsdGVyaW5nTW9kaWZpZXIgfSkgPT5cbiAgICAgICAgICB0aGlzLmNvbHVtbnMubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSkubWFwKChjb2x1bW46IENvbHVtbkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTmlsKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW4uZmlsdGVyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ubmFtZSA9PT0gY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXJpbmdNb2RpZmllcikpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyID0gZmlsdGVyaW5nTW9kaWZpZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoY29sdW1uczogQXJyYXk8Q29sdW1uQ29uZmlnIHwgQ3VzdG9tQ29sdW1uQ29uZmlnPikgPT4gKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSB9XG4gICAgICAgIH0pKSxcbiAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kpLFxuICAgICAgICB0aGlzLnRyaW1GaWx0ZXJDb25maWdQaXBlKCksXG4gICAgICAgIHRoaXMudHJpbVNvcnRDb25maWdQaXBlKCksXG4gICAgICAgIHRoaXMudHJpbUN1c3RvbUNvbHVtbkNvbmZpZ1BpcGUoKSxcbiAgICAgICAgdGhpcy5pZ25vcmVDb2x1bW5PcmRlclBpcGUoKSxcbiAgICAgICAgdGhpcy5pZ25vcmVDb2x1bW5WaXNpYmlsaXR5UGlwZSgpLFxuICAgICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuc2F2ZUNvbmZpZyQoY29uZmlnKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbUZpbHRlckNvbmZpZ1BpcGUoKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdmaWx0ZXInLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgZGVsZXRlIGNvbC5maWx0ZXI7XG4gICAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbVNvcnRDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnc29ydCcsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5tYXAoY29sID0+IHtcbiAgICAgICAgICBjb2wuc29ydE9yZGVyID0gJyc7XG4gICAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbUN1c3RvbUNvbHVtbkNvbmZpZ1BpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdjdXN0b21Db2x1bW5zJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoY29sOiBDdXN0b21Db2x1bW5Db25maWcpID0+ICFjb2wuY3VzdG9tKTtcblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpZ25vcmVDb2x1bW5PcmRlclBpcGUoKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdvcmRlcicsIGNvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5nZXRDb25maWckKCkucGlwZShcbiAgICAgICAgICBtYXAob2xkQ29uZmlnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID1cbiAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1c3RvbSBjb2x1bW5zIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgY29uc3QgY29sdW1uc0FkZGVkID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgIGNvbCA9PiAhb2xkQ29sdW1ucy5maW5kKG9sZCA9PiBvbGQubmFtZSA9PT0gY29sLm5hbWUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25maWcuY29sdW1ucyA9IFtcbiAgICAgICAgICAgICAgLi4ub2xkQ29sdW1ucy5tYXAob2xkQ29sID0+XG4gICAgICAgICAgICAgICAgKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKG5ld0NvbCA9PiBuZXdDb2wubmFtZSA9PT0gb2xkQ29sLm5hbWUpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIC4uLmNvbHVtbnNBZGRlZFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpZ25vcmVDb2x1bW5WaXNpYmlsaXR5UGlwZSgpOiBVbmFyeUZ1bmN0aW9uPFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz4sXG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPlxuICA+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3Zpc2liaWxpdHknLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKG5ld0NvbCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID1cbiAgICAgICAgICAgICAgICBvbGRDb25maWc/LmNvbHVtbnMgfHwgKHRoaXMuZGVmYXVsdENvbHVtbnMgYXMgQ29sdW1uQ29uZmlnW10pO1xuICAgICAgICAgICAgICBjb25zdCBvbGRDb2wgPSBjb2x1bW5zLmZpbmQoKGNvbDogYW55KSA9PiBuZXdDb2wubmFtZSA9PT0gY29sLm5hbWUpO1xuICAgICAgICAgICAgICBuZXdDb2wudmlzaWJsZSA9IG9sZENvbD8udmlzaWJsZSA/PyB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3Q29sO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFdmVudFBpcGUoXG4gICAgY29uZmlnUGFydDogR3JpZENvbmZpZ1BhcnQsXG4gICAgdHJpbUV2ZW50RGF0YUZuOiAoY29uZmlnOiBHcmlkQ29uZmlnKSA9PiBHcmlkQ29uZmlnIHwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPlxuICApOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNvbmNhdE1hcCgoY29uZmlnOiBHcmlkQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVDb25maWdGaWx0ZXJcbiAgICAgICAgICAuY2FsbCh0aGlzLCBjb25maWdQYXJ0KVxuICAgICAgICAgIC5waXBlKG1hcChrZWVwRXZlbnREYXRhID0+ICh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSkpO1xuICAgICAgfSksXG4gICAgICBtYXAoKHsgY29uZmlnLCBrZWVwRXZlbnREYXRhIH0pID0+XG4gICAgICAgIGtlZXBFdmVudERhdGEgPyBjb25maWcgOiB0cmltRXZlbnREYXRhRm4uY2FsbCh0aGlzLCBjb25maWcpXG4gICAgICApLFxuICAgICAgY29uY2F0TWFwKGNvbmZpZyA9PiAoaXNPYnNlcnZhYmxlKGNvbmZpZykgPyBjb25maWcgOiBvZihjb25maWcpKSBhcyBPYnNlcnZhYmxlPEdyaWRDb25maWc+KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDb25maWdGaWx0ZXIoY29uZmlnUGFydDogR3JpZENvbmZpZ1BhcnQpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuIHwgT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj47XG4gICAgY29uc3QgdmFsdWVPckZuID0gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29udGV4dCgpPy5jb25maWdGaWx0ZXI/Lltjb25maWdQYXJ0XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVzdWx0ID0gdmFsdWVPckZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlT3JGbjtcbiAgICB9XG4gICAgcmV0dXJuIHRvT2JzZXJ2YWJsZShyZXN1bHQgPz8gdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgbWF0Y2hlc0ZuOiAoXG4gICAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICBjb250ZXh0PzogR3JpZENvbmZpZ0NvbnRleHRcbiAgICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgY29udGV4dD86IEdyaWRDb25maWdDb250ZXh0XG4gICkge1xuICAgIGlmIChtYXRjaGVzRm4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzRm4ocm91dGUsIGNvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLXNjcm9sbFwiXG4gICNzY3JvbGxcbiAgW25nQ2xhc3NdPVwie1xuICAgICd0YWJsZS1kYXRhLWdyaWRfX292ZXJsYXknOiAoZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jKSAmJiAhbG9hZE1vcmVDb21wb25lbnQ/LmlzTG9hZGluZ1xuICB9XCJcbiAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXRhYmxlLWRhdGEtZ3JpZC1zY3JvbGxcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWRfX2xvYWRpbmctLXdyYXBwZXJcIlxuICAgICpuZ0lmPVwiKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgIWxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZF9fbG9hZGluZy0tbG9hZGVyXCI+XG4gICAgICA8Yzh5LWxvYWRpbmdcbiAgICAgICAgbGF5b3V0PVwiYXBwbGljYXRpb25cIlxuICAgICAgICBbbWVzc2FnZV09XCJsb2FkaW5nSXRlbXNMYWJlbFwiXG4gICAgICA+PC9jOHktbG9hZGluZz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiXG4gICAgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5ncmlkSGVhZGVyXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaDRcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnbS1yLTE2JzogISF0aXRsZSB9XCJcbiAgICA+XG4gICAgICB7eyB0aXRsZSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlPcHRpb25zLmZpbHRlclwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhZmlsdGVyaW5nQXBwbGllZFwiPlxuICAgICAgICA8c21hbGxcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBmaWx0ZXJlZEl0ZW1zQ291bnQgfX0gb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwibGFiZWwgbGFiZWwtZGVmYXVsdCBtLXItNFwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBObyBmaWx0ZXJzXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXJcIlxuICAgICAgICAqbmdJZj1cImZpbHRlcmluZ0FwcGxpZWRcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFmaWx0ZXJpbmdMYWJlbHNQYXJhbXMuYWxsSXRlbXNDb3VudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhLWktY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWluZm8gbS1yLTRcIj5cbiAgICAgICAgICAgICAge3sgKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwiZmlsdGVyaW5nTGFiZWxzUGFyYW1zXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdFwiXG4gICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAjZGRGaWx0ZXJzPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZGRGaWx0ZXJzLmlzT3BlblwiXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIG0tbC04XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FjdGl2ZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWZpbHRlcnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwiZmlsdGVyXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQWN0aXZlIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1zeXN0ZW1cIj5cbiAgICAgICAgICAgICAge3sgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZC5sZW5ndGggfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiXG4gICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1ncmlkX19kcm9wZG93biBiZy1sZXZlbC0wXCI+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbS0wXCI+XG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQ7IGxldCBsYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZXBhcmF0b3ItYm90dG9tJzogIWxhc3QgfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taGVhZGVyIHN0aWNreS10b3AgdGV4dC10cnVuY2F0ZSBuby1ib3JkZXItdG9wIHAtYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJvcmRlcmxlc3MgZC1mbGV4IGQtY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cGVkRmlsdGVyQ2hpcHMgb2YgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFwVG9GaWx0ZXJDaGlwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ3JvdXBlZEZpbHRlckNoaXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3AtdC0wJzogZmlyc3QgfVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWFsbCBwLWItNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwZWRGaWx0ZXJDaGlwcy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXBlZEZpbHRlckNoaXBzLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlciBnYXAtNCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnIHRhZy0taW5mbyBjaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaXAgb2YgZ3JvdXBlZEZpbHRlckNoaXBzLmNoaXBzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi14cyBidG4tY2xlYW4gdGV4dC0xMCBtLXItNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlIGZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoY2hpcC5yZW1vdmUoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yZW1vdmUtY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwidGltZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjaGlwLmRpc3BsYXlWYWx1ZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gc2VwYXJhdG9yLXRvcCBzdGlja3ktYm90dG9tXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NsZWFyIGFsbCBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tY2xlYXItZmlsdGVyc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyAnQ2xlYXIgYWxsIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtIGhpZGRlbi14cyBoaWRkZW4tc21cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtwb3BvdmVyXT1cImZpbHRlcnNIZWxwUG9wb3ZlclwiXG4gICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImRpc3BsYXlPcHRpb25zLmZpbHRlclwiXG4gICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWhlbHAtZmlsdGVyc1wiXG4gICAgICA+XG4gICAgICAgIDxpIGM4eUljb249XCJxdWVzdGlvbi1jaXJjbGUtb1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNmaWx0ZXJzSGVscFBvcG92ZXI+XG4gICAgICAgIDxkaXYgW2lubmVySHRtbF09XCJmaWx0ZXJzSGVscFBvcG92ZXJIdG1sIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIHRleHQtcHJpbWFyeSBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBwb3BvdmVyPVwie3sgJ1RoZSBjb3VudGVyIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIG1pZ2h0IGJlIGluYWNjdXJhdGUuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cInNob3dDb3VudGVyV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxpIGM4eUljb249XCJ3YXJuaW5nXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG5iYXIgZC1mbGV4IGEtaS1jZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXJBY3Rpb25Db250cm9sIG9mIGhlYWRlckFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzIHwgYXN5bmNcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoZWFkZXJBY3Rpb25Db250cm9sLnRlbXBsYXRlOyBlbHNlIGN1c3RvbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0biBidG4tbGlua1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgaGVhZGVyQWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoZWFkZXJBY3Rpb25Db250cm9sLmNhbGxiYWNrKClcIlxuICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgdHlwZTogaGVhZGVyQWN0aW9uQ29udHJvbC50eXBlXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAgIFtjOHlJY29uXT1cImhlYWRlckFjdGlvbkNvbnRyb2wuaWNvblwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tVGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgaGVhZGVyQWN0aW9uQ29udHJvbC50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IGhlYWRlckFjdGlvbkNvbnRyb2w6IGhlYWRlckFjdGlvbkNvbnRyb2wgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdFwiXG4gICAgICAgICAgKm5nSWY9XCJjb25maWd1cmVDb2x1bW5zRW5hYmxlZFwiXG4gICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAjZGRDb25maWd1cmVDb2x1bW5zPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZGRDb25maWd1cmVDb2x1bW5zLmlzT3BlblwiXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NvbmZpZ3VyZSBjb2x1bW5zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4tYnRuXCJcbiAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJjb2x1bW5zXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQ29uZmlndXJlIGNvbHVtbnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZGF0YS1ncmlkX19kcm9wZG93blwiXG4gICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAgbS0wXCJcbiAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Db2x1bW5Ecm9wKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdMb2NrQXhpcz1cInlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLnBvc2l0aW9uRml4ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkcmFnZ2FibGUtYWZ0ZXIgcC0wIGEtaS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94IHAtbC0xNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4taGVhZGVyLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR3JpZENvbHVtbnNTaXplKCk7IGVtaXRDb25maWdDaGFuZ2UoJ2NoYW5nZUNvbHVtblZpc2liaWxpdHknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ0hBTkdFX1ZJU0lCSUxJVFksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiAhY29sdW1uLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBzaG93T25Ib3ZlciBtYXgtd2lkdGgtZml0IGEtaS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlYGNvbHVtbix2ZXJiYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdSZW1vdmVgY29sdW1uLHZlcmJgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ3VzdG9tQ29sdW1uKHBvQ29uZmlybSwgY29sdW1uLCBkZENvbmZpZ3VyZUNvbHVtbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGM4eS1wb3BvdmVyLWNvbmZpcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidDb25maXJtIHJlbW92YWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI3BvQ29uZmlybVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYzh5LXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJtaW51cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLXJlbW92ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgIGNsYXNzPVwicC04IHN0aWNreS1ib3R0b20gc2VwYXJhdG9yLXRvcFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNDb25maWdDb250ZXh0S25vd25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWFkZC1jdXN0b20tY29sdW1uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkN1c3RvbUNvbHVtbigpOyBkZENvbmZpZ3VyZUNvbHVtbnMuaGlkZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJwbHVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQWRkIGN1c3RvbSBjb2x1bW4nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0biBidG4tbGlua1wiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCIhaGlkZVJlbG9hZFwiXG4gICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcmVsb2FkLWJ0blwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUmVsb2FkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgID48L2k+XG4gICAgICAgICAgPHNwYW4+e3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNlYXJjaCBtLWwtc20tMTYgZGF0YS1ncmlkX19zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgfHwgc2hvd1NlYXJjaFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1NlYXJjaOKApicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoVGV4dCQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXJcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwidGltZXNcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hUZXh0ID0gJyc7IHNlYXJjaFRleHQkLmVtaXQoJycpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5DTEVBUl9TRUFSQ0ggfVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnMgYW5pbWF0ZWQgc2xpZGVJbkRvd24gZmFzdFwiXG4gICAgICBkYXRhLWN5PVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnNcIlxuICAgICAgKm5nSWY9XCJzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoICE9PSAwXCJcbiAgICA+XG4gICAgICA8aDQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nUGx1cmFsXT1cInNlbGVjdGVkSXRlbUlkcy5sZW5ndGhcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTFcIj5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT4xIHNlbGVjdGVkIGl0ZW0uPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIm90aGVyXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IHNlbGVjdGVkSXRlbUlkcy5sZW5ndGggfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNvdW50IH19IHNlbGVjdGVkIGl0ZW1zLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8YnIgY2xhc3M9XCJ2aXNpYmxlLXhzXCIgLz5cbiAgICAgICAgPHNtYWxsICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgJiYgc2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCA+PSBwYWdpbmF0aW9uLnBhZ2VTaXplXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJhY3RcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldEFsbEl0ZW1zU2VsZWN0ZWQodHJ1ZSlcIlxuICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiAoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBTZWxlY3QgYWxsIHt7IGNvdW50IH19IGl0ZW1zXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuYmFyIGQtZmxleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgYnVsa0FjdGlvbkNvbnRyb2wgb2YgYnVsa0FjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiBzZWxlY3RlZEl0ZW1JZHMgfCBhc3luY1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJidWxrQWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19FWFBPUlQgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic2lnbi1vdXRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19ERUxFVEUgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBidWxrQWN0aW9uQ29udHJvbC50ZXh0XG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1bGtBY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBidWxrQWN0aW9uQ29udHJvbC5pY29uIH19XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NBTkNFTFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8dGFibGVcbiAgICBjbGFzcz1cInRhYmxlIHRhYmxlLWZpbHRlcmVkLXNvcnRlZCB0YWJsZS1kYXRhLWdyaWQgbGFyZ2UtcGFkZGluZ1wiXG4gICAgW2NsYXNzLnRhYmxlLXN0cmlwZWRdPVwiZGlzcGxheU9wdGlvbnMuc3RyaXBlZCAmJiAhdHJlZUdyaWRcIlxuICAgIFtjbGFzcy50YWJsZS1ib3JkZXJlZF09XCJkaXNwbGF5T3B0aW9ucy5ib3JkZXJlZFwiXG4gICAgW2NsYXNzLnRhYmxlLWhvdmVyXT1cImRpc3BsYXlPcHRpb25zLmhvdmVyXCJcbiAgICBbY2xhc3MudGFibGUtZGF0YS1ncmlkLXdpdGgtY2hlY2tib3hlc109XCJzZWxlY3RhYmxlXCJcbiAgICBbY2xhc3MudGFibGUtZGF0YS1ncmlkLXdpdGgtYWN0aW9uc109XCJhY3Rpb25Db250cm9scy5sZW5ndGggPiAwXCJcbiAgICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cInN0eWxlcy5ncmlkVGVtcGxhdGVDb2x1bW5zXCJcbiAgICBjZGstdGFibGVcbiAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgICBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cInRydWVcIlxuICAgIChtb3VzZW1vdmUpPVwicmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJC5lbWl0KCRldmVudClcIlxuICAgIChtb3VzZXVwKT1cInJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkLmVtaXQoJGV2ZW50KVwiXG4gICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXRhYmxlXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeU5hbWVcIlxuICAgICAgW2Nka0NvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLm5hbWVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUuYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxTZWxlY3RlZCB8fFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUuYWxsRGVzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRBbGxJdGVtc0luQ3VycmVudFBhZ2VTZWxlY3RlZCgkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5TRUxFQ1RfQUxMX0lURU1TIH1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0SXRlbXNTZWxlY3RlZChbcm93XSwgJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvLWJ1dHRvbidcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID48L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1yYWRpb1wiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJzZWxlY3Qtcm93XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlU2VsZWN0ZWRJdGVtKHJvdylcIlxuICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUxFQ1RfSVRFTSxcbiAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmFkaW9cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhY3Rpb25zJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSBzci1vbmx5XCI+e3sgJ0FjdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uQ29udHJvbCBvZiBhY3Rpb25Db250cm9sc1xuICAgICAgICAgICAgICAgICAgfCB2aXNpYmxlQ29udHJvbHM6IHJvd1xuICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgfCBzbGljZTogMCA6ICgoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMiA/IDEgOiAyKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJhY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0VkaXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FZGl0XCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVESVRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tZWRpdC1idXR0b24taW4tcm93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1kYW5nZXIgc2hvd09uSG92ZXJcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5ERUxFVEVfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJlbW92ZS1idXR0b24taW4tcm93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihhY3Rpb25Db250cm9sLmljb24gPyBhY3Rpb25Db250cm9sLnRleHQgOiAnJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7IChhY3Rpb25Db250cm9sLmljb24gPyBhY3Rpb25Db250cm9sLnRleHQgOiAnJykgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgc2hvd09uSG92ZXI6IGFjdGlvbkNvbnRyb2wuc2hvd09uSG92ZXIgfVwiXG4gICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT05fSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogYWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidjOHktZGF0YS1ncmlkLS1idXR0b24taW4tcm93LS0nICsgYWN0aW9uQ29udHJvbC50ZXh0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjOHlJY29uPVwie3sgYWN0aW9uQ29udHJvbC5pY29uIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9uQ29udHJvbC5pY29uQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uQ29udHJvbC5pY29uXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFhY3Rpb25Db250cm9sLmljb25cIj57eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICdtLWwtYXV0byBvdmVyZmxvdy12aXNpYmxlJzpcbiAgICAgICAgICAgICAgICAgIChhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIHJpZ2h0XCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICAgICAgICpuZ0lmPVwiKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDJcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi10b2dnbGUgYzh5LWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FjdGlvbnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJvdy1hY3Rpb25zLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImVsbGlwc2lzLXZcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAgICAgICB8IHZpc2libGVDb250cm9sczogcm93XG4gICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogKChhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyID8gMSA6IDIpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImFjdGlvbkNvbnRyb2wudHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRURJVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkRFTEVURV9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FeHBvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRVhQT1JUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGF0YS1leHBvcnRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT05fSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogYWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjOHlJY29uPVwie3sgYWN0aW9uQ29udHJvbC5pY29uIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9uQ29udHJvbC5pY29uQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIFtjbGFzcy5zb3J0ZWRdPVwiY29sdW1uLnNvcnRPcmRlclwiXG4gICAgICAgICAgICBbY2xhc3MuZmlsdGVyZWRdPVwiY29sdW1uIHwgbWFwOiBpc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwiY29sdW1uLmRhdGFUeXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIFt0aXRsZV09XCIoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBpc0Ryb3BEb3duUGxhY2VkUmlnaHQgdG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSB7eyBpc0Ryb3BEb3duUGxhY2VkUmlnaHQoY29sdW1uKSA/ICdyaWdodCcgOiAnbGVmdCcgfX1cIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAgICAgI2dyaWRIZWFkZXJEcm9wZG93bj1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJncmlkSGVhZGVyRHJvcGRvd24uaXNPcGVuXCJcbiAgICAgICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLWhlYWRlci1idG4tLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWM4eS1jZWxsLXJlbmRlcmVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiXG4gICAgICAgICAgICAgICAgICA+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdGaWx0ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8IS0tIGlzRHJvcERvd25QbGFjZWRSaWdodCB0byBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuIC0tPlxuICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIlxuICAgICAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdkcm9wZG93bi1tZW51LXJpZ2h0LWdyaWQnOiBpc0Ryb3BEb3duUGxhY2VkUmlnaHQoY29sdW1uKSB9XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRhdGEtZ3JpZF9fZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bjogZ3JpZEhlYWRlckRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0RmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgZmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiZy1jb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzcGVjXT1cImZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWNcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXJcIlxuICAgICAgICAgICAgICAgICAgICA+PC9jOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4tc29ydFwiXG4gICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdtYXJnaW4tbGVmdCc6ICFjb2x1bW4uZmlsdGVyYWJsZSAmJiBjb2x1bW4uc29ydGFibGUgPyAnLTIwcHgnIDogbnVsbCB9XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cInNvcnRDb2x1bW5UaXRsZSB8IHRyYW5zbGF0ZTogeyBuYW1lOiBjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlIH1cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU29ydE9yZGVyKGNvbHVtbi5uYW1lKVwiXG4gICAgICAgICAgICAgIGRhdGEtY3k9XCJjaGFuZ2Utc29ydC1vcmRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5zb3J0T3JkZXJcIj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImxvbmctYXJyb3ctdXBcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidhc2MnXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9uZy1hcnJvdy1kb3duXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInZGVzYydcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJleGNoYW5nZVwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJyZXNpemUtaGFuZGxlXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4ucmVzaXphYmxlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJcbiAgICAgICAgICAgICAgICByZXNpemVIYW5kbGVNb3VzZURvd24kLmVtaXQoeyBldmVudDogJGV2ZW50LCB0YXJnZXRDb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWNlbGwtdGl0bGVdPVwiY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5jZWxsQ1NTQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2RhdGEtZ3JpZC0tJyArIGNvbHVtbi5oZWFkZXJcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10eXBlXT1cImNvbHVtbi5kYXRhVHlwZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc29sdmVDZWxsVmFsdWUocm93LCBjb2x1bW4ucGF0aCksXG4gICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldENlbGxSZW5kZXJlclNwZWMgOiB0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIj48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgY2RrQ29sdW1uRGVmPVwiaW5maW5pdGVTY3JvbGxGb290ZXJcIj5cbiAgICAgIDx0ZFxuICAgICAgICBbc3R5bGUuZ3JpZC1jb2x1bW5dPVwic3R5bGVzLmdyaWRJbmZpbml0ZVNjcm9sbENvbHVtblwiXG4gICAgICAgIGNkay1mb290ZXItY2VsbFxuICAgICAgICAqY2RrRm9vdGVyQ2VsbERlZlxuICAgICAgPlxuICAgICAgICA8dGVtcGxhdGUgI2luZmluaXRlU2Nyb2xsQ29udGFpbmVyPjwvdGVtcGxhdGU+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHRyXG4gICAgICBjZGstaGVhZGVyLXJvd1xuICAgICAgKmNka0hlYWRlclJvd0RlZj1cImNvbHVtbk5hbWVzXCJcbiAgICA+PC90cj5cblxuICAgIDx0clxuICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJvdy1pbi1kYXRhLWdyaWRcIlxuICAgICAgY2RrLXJvd1xuICAgICAgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbk5hbWVzOyBsZXQgaWR4ID0gZGF0YUluZGV4OyB3aGVuOiBpc0RhdGFSb3dcIlxuICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICBhY3RpdmVDbGFzc05hbWUgJiYgcm93ID09PSBsYXN0Q2xpY2tlZFJvdyA/IGFjdGl2ZUNsYXNzTmFtZSA6ICcnLFxuICAgICAgICBpZHggJSAyID09PSAwID8gJ2V2ZW4nIDogJ29kZCcsXG4gICAgICAgIHJvdy5sZXZlbCA+IDAgPyAnZGF0YS1ncmlkLWNoaWxkLW5vZGUnIDogJydcbiAgICAgIF1cIlxuICAgICAgKG1vdXNlb3Zlcik9XCJyb3dNb3VzZU92ZXIuZW1pdChyb3cpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cInJvd01vdXNlTGVhdmUuZW1pdChyb3cpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDbGljayhyb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDx0clxuICAgICAgY2xhc3M9XCJleHBhbmRlZC1yb3dcIlxuICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICEoZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkIHwgYXN5bmMpIH1cIlxuICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWV4cGFuZGVkLXJvdy1pbi1kYXRhLWdyaWRcIlxuICAgICAgY2RrLXJvd1xuICAgICAgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWQtcm93J107IHdoZW46IGlzUm93RXhwYW5kZWRcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJleHBhbmRlZC1yb3dcIj5cbiAgICAgIDx0ZFxuICAgICAgICBbc3R5bGUuZ3JpZC1jb2x1bW5dPVwic3R5bGVzLmdyaWRJbmZpbml0ZVNjcm9sbENvbHVtblwiXG4gICAgICAgIGNkay1jZWxsXG4gICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgZXhwYW5kYWJsZVJvdz8udGVtcGxhdGU7XG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICBhc3luY1JlbmRlclN1Y2Nlc3M6IHNldEV4cGFuZGFibGVSb3dWaXNpYmxlLmJpbmQodGhpcywgcm93LCB0cnVlKSxcbiAgICAgICAgICAgICAgYXN5bmNSZW5kZXJGYWlsOiBzZXRFeHBhbmRhYmxlUm93VmlzaWJsZS5iaW5kKHRoaXMsIHJvdywgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0clxuICAgICAgY2xhc3M9XCJwYWdpbmF0aW9uLXJvd1wiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydwYWdpbmF0aW9uLXJvdyddOyB3aGVuOiBpc1BhZ2luYXRpb25Sb3dcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJwYWdpbmF0aW9uLXJvd1wiPlxuICAgICAgPHRkXG4gICAgICAgIFtjbGFzc109XCInbGV2ZWwtJyArIChyb3cucGFyZW50Um93LmxldmVsICsgMSlcIlxuICAgICAgICBbc3R5bGUuZ3JpZC1jb2x1bW5dPVwic3R5bGVzLmdyaWRJbmZpbml0ZVNjcm9sbENvbHVtblwiXG4gICAgICAgIGNkay1jZWxsXG4gICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXJcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvdW50ZXIgcC10LTggcC1iLThcIlxuICAgICAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuY3VycmVudFBhZ2VTaXplID4gMFwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jaGlsZC1jb3VudGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtbXV0ZWRcIlxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cIntcbiAgICAgICAgICAgICAgICBwYWdlRmlyc3RJdGVtSWR4OlxuICAgICAgICAgICAgICAgICAgKHJvdy5jaGlsZHJlblN0YXRzLmN1cnJlbnRQYWdlIC0gMSkgKiByb3cuY2hpbGRyZW5TdGF0cy5maXJzdFBhZ2VTaXplICsgMSxcbiAgICAgICAgICAgICAgICBwYWdlTGFzdEl0ZW1JZHg6XG4gICAgICAgICAgICAgICAgICAocm93LmNoaWxkcmVuU3RhdHMuY3VycmVudFBhZ2UgLSAxKSAqIHJvdy5jaGlsZHJlblN0YXRzLmZpcnN0UGFnZVNpemUgK1xuICAgICAgICAgICAgICAgICAgMSArXG4gICAgICAgICAgICAgICAgICAocm93LmNoaWxkcmVuU3RhdHMuY3VycmVudFBhZ2VTaXplIC0gMSksXG4gICAgICAgICAgICAgICAgaXRlbXNUb3RhbDogcm93LmNoaWxkcmVuU3RhdHMuZmlsdGVyZWRTaXplXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBwYWdlRmlyc3RJdGVtSWR4IH19IC0ge3sgcGFnZUxhc3RJdGVtSWR4IH19IG9mIHt7IGl0ZW1zVG90YWwgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCB0ZXh0LTEyIG0tci00XCI+e3sgJ1BhcmVudCBub2RlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIHRhZy0tZGVmYXVsdFwiPnt7IHJvdy5wYXJlbnRSb3c/LltwYXJlbnROb2RlTGFiZWxQcm9wZXJ0eV0gfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgY29sLXNtLW9mZnNldC00IG5vLWd1dHRlciB0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgPHBhZ2luYXRpb25cbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGotYy1lbmRcIlxuICAgICAgICAgICAgKm5nSWY9XCJyb3cuY2hpbGRyZW5TdGF0cy5maWx0ZXJlZFNpemUgPiByb3cuY2hpbGRyZW5TdGF0cy5jdXJyZW50UGFnZVNpemVcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwicm93LmNoaWxkcmVuU3RhdHMuY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cInVwZGF0ZUNoaWxkUGFnaW5hdGlvbigkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwicm93LmNoaWxkcmVuU3RhdHMuZmlsdGVyZWRTaXplXCJcbiAgICAgICAgICAgIFtpdGVtc1BlclBhZ2VdPVwicm93Py5wYXJlbnRSb3c/LnBhZ2luYXRpb24/LnBhZ2VTaXplID8/IGNoaWxkTm9kZVBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAgICAgW21heFNpemVdPVwiNVwiXG4gICAgICAgICAgICBbYm91bmRhcnlMaW5rc109XCJmYWxzZVwiXG4gICAgICAgICAgICBwcmV2aW91c1RleHQ9XCJQcmV2aW91c1wiXG4gICAgICAgICAgICBuZXh0VGV4dD1cIk5leHRcIlxuICAgICAgICAgID48L3BhZ2luYXRpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8dHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICFpbmZpbml0ZVNjcm9sbCB9XCJcbiAgICAgICAgY2RrLWZvb3Rlci1yb3dcbiAgICAgICAgKmNka0Zvb3RlclJvd0RlZj1cIlsnaW5maW5pdGVTY3JvbGxGb290ZXInXVwiXG4gICAgICA+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90YWJsZT5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXggbS0wIHAtdC00MCBwLWItNDBcIlxuICAgICpuZ0lmPVwiXG4gICAgICAhKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiZcbiAgICAgICgoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID09PSAwIHx8IChkYXRhU291cmNlLmRhdGEkIHwgYXN5bmMpLmxlbmd0aCA9PT0gMClcbiAgICBcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGNvbC1zbS00IG0tbC1hdXRvIG0tci1hdXRvXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjOHktdWktZW1wdHktc3RhdGUsIC5jOHktZW1wdHktc3RhdGVcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgZW1wdHlTdGF0ZT8udGVtcGxhdGVSZWY7XG4gICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IGVtcHR5U3RhdGVDb250ZXh0JCB8IGFzeW5jIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWZvb3RlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiXG4gICAgKm5nSWY9XCJwYWdpbmF0aW9uICYmICFpbmZpbml0ZVNjcm9sbFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY291bnRlciBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmN1cnJlbnRQYWdlU2l6ZSA+IDBcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jb3VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInRleHQtbXV0ZWRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInBhZ2luYXRpb25MYWJlbFBhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBwYWdlRmlyc3RJdGVtSWR4IH19IC0ge3sgcGFnZUxhc3RJdGVtSWR4IH19IG9mIHt7IGl0ZW1zVG90YWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyIHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWlubGluZSBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA+IG1pblBvc3NpYmxlUGFnZVNpemVcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICBmb3I9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0l0ZW1zIHBlciBwYWdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgaWQ9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcGFnZXNpemUtb3B0aW9uc1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlOiAkZXZlbnQsIHBhZ2U6IHBhZ2luYXRpb24uY3VycmVudFBhZ2UgfSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZVNpemUgb2YgcG9zc2libGVQYWdlU2l6ZXNcIlxuICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHBhZ2VTaXplIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1yaWdodFwiPlxuICAgICAgPHBhZ2luYXRpb25cbiAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJoaWRlUGFnaW5hdGlvbiQgfCBhc3luY1wiXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4IGotYy1lbmRcIlxuICAgICAgICAqbmdJZj1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPiAwXCJcbiAgICAgICAgW25nTW9kZWxdPVwicGFnaW5hdGlvbi5jdXJyZW50UGFnZVwiXG4gICAgICAgIChwYWdlQ2hhbmdlZCk9XCJ1cGRhdGVQYWdpbmF0aW9uKCRldmVudClcIlxuICAgICAgICBbdG90YWxJdGVtc109XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplXCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgKG51bVBhZ2VzKT1cInRvdGFsUGFnZXNDb3VudCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgW21heFNpemVdPVwiNVwiXG4gICAgICAgIFtib3VuZGFyeUxpbmtzXT1cImZhbHNlXCJcbiAgICAgICAgcHJldmlvdXNUZXh0PVwiUHJldmlvdXNcIlxuICAgICAgICBuZXh0VGV4dD1cIk5leHRcIlxuICAgICAgPjwvcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|