@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
449 lines • 56.2 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { Directive, Optional, Input, NgModule, Host, ComponentFactoryResolver, ViewContainerRef } from '@angular/core';
import { FilteringExpressionsTree } from '../data-operations/filtering-expressions-tree';
import { IgxColumnComponent } from './columns/column.component';
import { DataType } from '../data-operations/data-util';
import { IgxBooleanFilteringOperand, IgxNumberFilteringOperand, IgxDateFilteringOperand, IgxStringFilteringOperand } from '../data-operations/filtering-condition';
import { IgxGridComponent } from './grid/grid.component';
const COLUMNS = 'columns';
const FILTERING = 'filtering';
const ADVANCED_FILTERING = 'advancedFiltering';
const SORTING = 'sorting';
const GROUPBY = 'groupBy';
const PAGING = 'paging';
const ROW_SELECTION = 'rowSelection';
const CELL_SELECTION = 'cellSelection';
let IgxGridStateDirective = class IgxGridStateDirective {
/**
* @hidden
*/
constructor(grid, resolver, viewRef) {
this.grid = grid;
this.resolver = resolver;
this.viewRef = viewRef;
this._options = {
columns: true,
filtering: true,
advancedFiltering: true,
sorting: true,
groupBy: true,
paging: true,
cellSelection: true,
rowSelection: true
};
}
/**
* An object with options determining if a certain feature state should be saved.
*
* ```html
* <igx-grid [igxGridState]="options"></igx-grid>
* ```
* ```typescript
* public options = {selection: false, advancedFiltering: false};
* ```
*/
get options() {
return this._options;
}
set options(value) {
Object.assign(this._options, value);
}
/**
* Gets the state of a feature or states of all grid features, unless a certain feature is disabled through the `options` property.
* @param `serialize` determines whether the returned object will be serialized to JSON string. Default value is false.
* @param `feature` string or array of strings determining the features which state to retrieve. If skipped, returns all.
* @returns Returns the serialized to JSON string IGridState object, or the non-serialized IGridState object.
* ```html
* <igx-grid [igxGridState]="options"></igx-grid>
* ```
* ```typescript
* @ViewChild(IgxGridStateDirective, { static: true }) public state;
* let state = this.state.getState();
* ```
*/
getState(serialize = true, feature) {
let state;
if (feature) {
state = {};
if (Array.isArray(feature)) {
feature.forEach(f => {
state = Object.assign(state, this.getGridFeature(f));
});
}
else {
state = this.getGridFeature(feature);
}
}
else {
state = this.getAllGridFeatures();
}
if (serialize) {
state = JSON.stringify(state, this.stringifyCallback);
return state;
}
else {
return state;
}
}
/**
* Restores grid features' state based on the IGridState object passed as an argument.
* @param IGridState object to restore state from.
* @returns
* ```html
* <igx-grid [igxGridState]="options"></igx-grid>
* ```
* ```typescript
* @ViewChild(IgxGridStateDirective, { static: true }) public state;
* this.state.setState(gridState);
* ```
*/
setState(state) {
if (typeof state === 'string') {
state = JSON.parse(state);
}
this.state = state;
this.restoreGridState();
this.grid.cdr.detectChanges();
}
/**
* The method that calls corresponding methods to restore feature from this.state object.
*/
restoreGridState() {
for (const key of Object.keys(this.state)) {
if (this.state[key]) {
this.restoreFeature(key, this.state[key]);
}
}
}
/**
* Restores the state of a feature.
*/
restoreFeature(feature, state) {
switch (feature) {
case COLUMNS: {
this.restoreColumns(state);
break;
}
case FILTERING: {
this.restoreFiltering(state);
break;
}
case ADVANCED_FILTERING: {
this.restoreAdvancedFiltering(state);
break;
}
case SORTING: {
this.restoreSorting(state);
break;
}
case GROUPBY: {
this.restoreGroupBy(state);
break;
}
case PAGING: {
this.restorePaging(state);
break;
}
case ROW_SELECTION: {
this.restoreRowSelection(state);
break;
}
case CELL_SELECTION: {
this.restoreCellSelection(state);
break;
}
}
}
/**
* Returns an object containing all grid features state.
*/
getAllGridFeatures() {
let gridState = {};
for (const key of Object.keys(this.options)) {
if (this.options[key]) {
const feature = this.getGridFeature(key);
gridState = Object.assign(gridState, feature);
}
}
gridState = Object.assign({}, gridState);
return gridState;
}
/**
* Restores an object containing the state for a grid feature.
* `serialize` param determines whether the returned object will be serialized to a JSON string. Default value is false.,
*/
getGridFeature(feature) {
const state = {};
switch (feature) {
case COLUMNS: {
Object.assign(state, this.getColumns());
break;
}
case FILTERING: {
Object.assign(state, this.getFiltering());
break;
}
case ADVANCED_FILTERING: {
Object.assign(state, this.getAdvancedFiltering());
break;
}
case SORTING: {
Object.assign(state, this.getSorting());
break;
}
case GROUPBY: {
Object.assign(state, this.getGroupBy());
break;
}
case PAGING: {
Object.assign(state, this.getPaging());
break;
}
case ROW_SELECTION: {
Object.assign(state, this.getRowSelection());
break;
}
case CELL_SELECTION: {
Object.assign(state, this.getCellSelection());
break;
}
}
return state;
}
/**
* Helper method that creates a new array with the current grid columns.
*/
getColumns() {
const gridColumns = this.grid.columns.sort(this.sortByVisibleIndex).map((c) => {
return {
pinned: c.pinned,
sortable: c.sortable,
filterable: c.filterable,
editable: c.editable,
sortingIgnoreCase: c.sortingIgnoreCase,
filteringIgnoreCase: c.filteringIgnoreCase,
headerClasses: c.headerClasses,
headerGroupClasses: c.headerGroupClasses,
maxWidth: c.maxWidth,
groupable: c.groupable,
movable: c.movable,
hidden: c.hidden,
dataType: c.dataType,
hasSummary: c.hasSummary,
field: c.field,
width: c.width,
header: c.header,
resizable: c.resizable,
searchable: c.searchable
};
});
return { columns: gridColumns };
}
getFiltering() {
const filteringState = this.grid.filteringExpressionsTree;
return { filtering: filteringState };
}
getAdvancedFiltering() {
const advancedFiltering = this.grid.advancedFilteringExpressionsTree;
return { advancedFiltering: advancedFiltering };
}
getPaging() {
const pagingState = this.grid.pagingState;
return { paging: pagingState };
}
getSorting() {
const sortingState = this.grid.sortingExpressions;
sortingState.forEach(s => {
delete s.strategy;
});
return { sorting: sortingState };
}
getGroupBy() {
const groupingExpressions = this.grid.groupingExpressions;
groupingExpressions.forEach(expr => {
delete expr.strategy;
});
const expansionState = this.grid.groupingExpansionState;
const groupsExpanded = this.grid.groupsExpanded;
return { groupBy: { expressions: groupingExpressions, expansion: expansionState, defaultExpanded: groupsExpanded } };
}
getRowSelection() {
const selection = this.grid.selectedRows();
return { rowSelection: selection };
}
getCellSelection() {
const selection = this.grid.getSelectedRanges().map(range => {
return { rowStart: range.rowStart, rowEnd: range.rowEnd, columnStart: range.columnStart, columnEnd: range.columnEnd };
});
return { cellSelection: selection };
}
/**
* Restores the grid columns by modifying the `columnList` collection of the grid.
*/
restoreColumns(columnsState) {
const newColumns = [];
const factory = this.resolver.resolveComponentFactory(IgxColumnComponent);
columnsState.forEach((colState) => {
const ref = factory.create(this.viewRef.injector);
Object.assign(ref.instance, colState);
ref.changeDetectorRef.detectChanges();
newColumns.push(ref.instance);
});
this.grid.columnList.reset(newColumns);
this.grid.columnList.notifyOnChanges();
}
sortByVisibleIndex(colA, colB) {
const a = colA.visibleIndex, b = colB.visibleIndex;
return a > b ? 1 : a < b ? -1 : 0;
}
/**
* Restores the grid filtering state, i.e. sets the `filteringExpressionsTree` property value.
*/
restoreFiltering(state) {
const filterTree = this.createExpressionsTreeFromObject(state);
this.grid.filteringExpressionsTree = filterTree;
}
/**
* Restores the grid advanced filtering state, i.e. sets the `advancedFilteringExpressionsTree` property value.
*/
restoreAdvancedFiltering(state) {
const advFilterTree = this.createExpressionsTreeFromObject(state);
this.grid.advancedFilteringExpressionsTree = advFilterTree;
}
/**
* Restores the grid sorting state, i.e. sets the `sortingExpressions` property value.
*/
restoreSorting(state) {
this.grid.sortingExpressions = state;
}
/**
* Restores the grid grouping state, i.e. sets the `groupbyExpressions` property value.
*/
restoreGroupBy(state) {
this.grid.groupingExpressions = state.expressions;
if (this.grid.groupsExpanded !== state.defaultExpanded) {
this.grid.toggleAllGroupRows();
}
else {
this.grid.groupingExpansionState = state.expansion;
}
}
/**
* Restores the grid paging state, i.e. sets the `perPage` property value and paginate to index.
*/
restorePaging(state) {
if (this.grid.perPage !== state.recordsPerPage) {
this.grid.perPage = state.recordsPerPage;
this.grid.cdr.detectChanges();
}
this.grid.page = state.index;
}
restoreRowSelection(state) {
this.grid.selectRows(state);
}
restoreCellSelection(state) {
state.forEach(r => {
const range = { rowStart: r.rowStart, rowEnd: r.rowEnd, columnStart: r.columnStart, columnEnd: r.columnEnd };
this.grid.selectRange(range);
});
}
/**
* This method builds a FilteringExpressionsTree from a provided object.
*/
createExpressionsTreeFromObject(exprTreeObject) {
if (!exprTreeObject || !exprTreeObject.filteringOperands) {
return null;
}
const expressionsTree = new FilteringExpressionsTree(exprTreeObject.operator, exprTreeObject.fieldName);
for (const item of exprTreeObject.filteringOperands) {
// Check if item is an expressions tree or a single expression.
if (item.filteringOperands) {
const subTree = this.createExpressionsTreeFromObject(item);
expressionsTree.filteringOperands.push(subTree);
}
else {
const expr = item;
let dataType;
if (this.grid.columnList.length > 0) {
dataType = this.grid.columnList.find(c => c.field === expr.fieldName).dataType;
}
else {
dataType = this.state[COLUMNS].find(c => c.field === expr.fieldName).dataType;
}
// when ESF, values are stored in Set.
// First those values are converted to an array before returning string in the stringifyCallback
// now we need to convert those back to Set
if (Array.isArray(expr.searchVal)) {
expr.searchVal = new Set(expr.searchVal);
}
else {
expr.searchVal = (dataType === 'date') ? new Date(Date.parse(expr.searchVal)) : expr.searchVal;
}
expr.condition = this.generateFilteringCondition(dataType, expr.condition.name);
expressionsTree.filteringOperands.push(expr);
}
}
return expressionsTree;
}
/**
* Returns the filtering logic function for a given dataType and condition (contains, greaterThan, etc.)
*/
generateFilteringCondition(dataType, name) {
let filters;
switch (dataType) {
case DataType.Boolean:
filters = IgxBooleanFilteringOperand.instance();
break;
case DataType.Number:
filters = IgxNumberFilteringOperand.instance();
break;
case DataType.Date:
filters = IgxDateFilteringOperand.instance();
break;
case DataType.String:
default:
filters = IgxStringFilteringOperand.instance();
break;
}
return filters.condition(name);
}
stringifyCallback(key, val) {
if (key === 'searchVal' && val instanceof Set) {
return Array.from(val);
}
return val;
}
};
IgxGridStateDirective.ctorParameters = () => [
{ type: IgxGridComponent, decorators: [{ type: Host }, { type: Optional }] },
{ type: ComponentFactoryResolver },
{ type: ViewContainerRef }
];
__decorate([
Input('igxGridState'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxGridStateDirective.prototype, "options", null);
IgxGridStateDirective = __decorate([
Directive({
selector: '[igxGridState]'
}),
__param(0, Host()), __param(0, Optional()),
__metadata("design:paramtypes", [IgxGridComponent,
ComponentFactoryResolver,
ViewContainerRef])
], IgxGridStateDirective);
export { IgxGridStateDirective };
/**
* @hidden
*/
let IgxGridStateModule = class IgxGridStateModule {
};
IgxGridStateModule = __decorate([
NgModule({
declarations: [IgxGridStateDirective],
exports: [IgxGridStateDirective]
})
], IgxGridStateModule);
export { IgxGridStateModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9zdGF0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSwrQ0FBK0MsQ0FBQztBQUVwSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUNuRix5QkFBeUIsRUFBc0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUlsRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQThDekQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQzFCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUM5QixNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBQy9DLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDMUIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUNyQyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUM7QUFLdkMsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFrQzlCOztPQUVHO0lBQ0gsWUFDZ0MsSUFBc0IsRUFDMUMsUUFBa0MsRUFDaEMsT0FBeUI7UUFGUCxTQUFJLEdBQUosSUFBSSxDQUFrQjtRQUMxQyxhQUFRLEdBQVIsUUFB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QUFXLElBQUksR0FBRyxZQUFZLEdBQUcsRUFBRTtZQUMzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Q0FDSixDQUFBOztZQTNZeUMsZ0JBQWdCLHVCQUFqRCxJQUFJLFlBQUksUUFBUTtZQUNDLHdCQUF3QjtZQUN2QixnQkFBZ0I7O0FBZHZDO0lBREMsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7O29EQUdyQjtBQTVCUSxxQkFBcUI7SUFIakMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGdCQUFnQjtLQUM3QixDQUFDO0lBdUNPLFdBQUEsSUFBSSxFQUFFLENBQUEsRUFBRSxXQUFBLFFBQVEsRUFBRSxDQUFBO3FDQUFlLGdCQUFnQjtRQUNoQyx3QkFBd0I7UUFDdkIsZ0JBQWdCO0dBeEM5QixxQkFBcUIsQ0FpYmpDO1NBamJZLHFCQUFxQjtBQW1ibEM7O0dBRUc7QUFLSCxJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtDQUFJLENBQUE7QUFBdEIsa0JBQWtCO0lBSjlCLFFBQVEsQ0FBQztRQUNOLFlBQVksRUFBRSxDQUFDLHFCQUFxQixDQUFDO1FBQ3JDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO0tBQ25DLENBQUM7R0FDVyxrQkFBa0IsQ0FBSTtTQUF0QixrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9wdGlvbmFsLCBJbnB1dCwgTmdNb2R1bGUsIEhvc3QsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JvdXBpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2dyb3VwaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElQYWdpbmdTdGF0ZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9wYWdpbmctc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZCwgSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCwgSUZpbHRlcmluZ09wZXJhdGlvbn0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgR3JpZFNlbGVjdGlvblJhbmdlIH0gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlFeHBhbmRTdGF0ZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGJ5LWV4cGFuZC1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwaW5nU3RhdGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4R3JpZENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XG4gICAgY29sdW1ucz86IElDb2x1bW5TdGF0ZVtdO1xuICAgIGZpbHRlcmluZz86IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgYWR2YW5jZWRGaWx0ZXJpbmc/OiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIHBhZ2luZz86IElQYWdpbmdTdGF0ZTtcbiAgICBzb3J0aW5nPzogSVNvcnRpbmdFeHByZXNzaW9uW107XG4gICAgZ3JvdXBCeT86IElHcm91cGluZ1N0YXRlO1xuICAgIGNlbGxTZWxlY3Rpb24/OiBHcmlkU2VsZWN0aW9uUmFuZ2VbXTtcbiAgICByb3dTZWxlY3Rpb24/OiBhbnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFN0YXRlT3B0aW9ucyB7XG4gICAgY29sdW1ucz86IGJvb2xlYW47XG4gICAgZmlsdGVyaW5nPzogYm9vbGVhbjtcbiAgICBhZHZhbmNlZEZpbHRlcmluZz86IGJvb2xlYW47XG4gICAgc29ydGluZz86IGJvb2xlYW47XG4gICAgZ3JvdXBCeT86IGJvb2xlYW47XG4gICAgcGFnaW5nPzogYm9vbGVhbjtcbiAgICBjZWxsU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgICByb3dTZWxlY3Rpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2x1bW5TdGF0ZSB7XG4gICAgcGlubmVkOiBib29sZWFuO1xuICAgIHNvcnRhYmxlOiBib29sZWFuO1xuICAgIGZpbHRlcmFibGU6IGJvb2xlYW47XG4gICAgZWRpdGFibGU6IGJvb2xlYW47XG4gICAgc29ydGluZ0lnbm9yZUNhc2U6IGJvb2xlYW47XG4gICAgZmlsdGVyaW5nSWdub3JlQ2FzZTogYm9vbGVhbjtcbiAgICBoZWFkZXJDbGFzc2VzOiBzdHJpbmc7XG4gICAgaGVhZGVyR3JvdXBDbGFzc2VzOiBzdHJpbmc7XG4gICAgbWF4V2lkdGg6IHN0cmluZztcbiAgICBncm91cGFibGU6IGJvb2xlYW47XG4gICAgbW92YWJsZTogYm9vbGVhbjtcbiAgICBoaWRkZW46IGJvb2xlYW47XG4gICAgZGF0YVR5cGU6IERhdGFUeXBlO1xuICAgIGhhc1N1bW1hcnk6IGJvb2xlYW47XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICB3aWR0aDogYW55O1xuICAgIGhlYWRlcjogc3RyaW5nO1xuICAgIHJlc2l6YWJsZTogYm9vbGVhbjtcbiAgICBzZWFyY2hhYmxlOiBib29sZWFuO1xufVxuXG5jb25zdCBDT0xVTU5TID0gJ2NvbHVtbnMnO1xuY29uc3QgRklMVEVSSU5HID0gJ2ZpbHRlcmluZyc7XG5jb25zdCBBRFZBTkNFRF9GSUxURVJJTkcgPSAnYWR2YW5jZWRGaWx0ZXJpbmcnO1xuY29uc3QgU09SVElORyA9ICdzb3J0aW5nJztcbmNvbnN0IEdST1VQQlkgPSAnZ3JvdXBCeSc7XG5jb25zdCBQQUdJTkcgPSAncGFnaW5nJztcbmNvbnN0IFJPV19TRUxFQ1RJT04gPSAncm93U2VsZWN0aW9uJztcbmNvbnN0IENFTExfU0VMRUNUSU9OID0gJ2NlbGxTZWxlY3Rpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hHcmlkU3RhdGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUge1xuXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSUdyaWRTdGF0ZU9wdGlvbnMgPSB7XG4gICAgICAgIGNvbHVtbnM6IHRydWUsXG4gICAgICAgIGZpbHRlcmluZzogdHJ1ZSxcbiAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmc6IHRydWUsXG4gICAgICAgIHNvcnRpbmc6IHRydWUsXG4gICAgICAgIGdyb3VwQnk6IHRydWUsXG4gICAgICAgIHBhZ2luZzogdHJ1ZSxcbiAgICAgICAgY2VsbFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgcm93U2VsZWN0aW9uOiB0cnVlXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGU6IElHcmlkU3RhdGU7XG5cbiAgICAvKipcbiAgICAgKiAgQW4gb2JqZWN0IHdpdGggb3B0aW9ucyBkZXRlcm1pbmluZyBpZiBhIGNlcnRhaW4gZmVhdHVyZSBzdGF0ZSBzaG91bGQgYmUgc2F2ZWQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZ3hHcmlkU3RhdGVdPVwib3B0aW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvcHRpb25zID0ge3NlbGVjdGlvbjogZmFsc2UsIGFkdmFuY2VkRmlsdGVyaW5nOiBmYWxzZX07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hHcmlkU3RhdGUnKVxuICAgIHB1YmxpYyBnZXQgb3B0aW9ucygpOiBJR3JpZFN0YXRlT3B0aW9ucyB7XG4gICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvcHRpb25zKHZhbHVlOiBJR3JpZFN0YXRlT3B0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBIb3N0KCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSBncmlkOiBJZ3hHcmlkQ29tcG9uZW50LFxuICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByb3RlY3RlZCB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YXRlIG9mIGEgZmVhdHVyZSBvciBzdGF0ZXMgb2YgYWxsIGdyaWQgZmVhdHVyZXMsIHVubGVzcyBhIGNlcnRhaW4gZmVhdHVyZSBpcyBkaXNhYmxlZCB0aHJvdWdoIHRoZSBgb3B0aW9uc2AgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGBzZXJpYWxpemVgIGRldGVybWluZXMgd2hldGhlciB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgc2VyaWFsaXplZCB0byBKU09OIHN0cmluZy4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS5cbiAgICAgKiBAcGFyYW0gYGZlYXR1cmVgIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIGRldGVybWluaW5nIHRoZSBmZWF0dXJlcyB3aGljaCBzdGF0ZSB0byByZXRyaWV2ZS4gSWYgc2tpcHBlZCwgcmV0dXJucyBhbGwuXG4gICAgICogQHJldHVybnMgUmV0dXJucyB0aGUgc2VyaWFsaXplZCB0byBKU09OIHN0cmluZyBJR3JpZFN0YXRlIG9iamVjdCwgb3IgdGhlIG5vbi1zZXJpYWxpemVkIElHcmlkU3RhdGUgb2JqZWN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lneEdyaWRTdGF0ZV09XCJvcHRpb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBzdGF0ZTtcbiAgICAgKiBsZXQgc3RhdGUgPSAgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdGF0ZShzZXJpYWxpemUgPSB0cnVlLCBmZWF0dXJlPzogc3RyaW5nIHwgc3RyaW5nW10pOiBJR3JpZFN0YXRlIHwgc3RyaW5nICB7XG4gICAgICAgIGxldCBzdGF0ZTogSUdyaWRTdGF0ZSB8IHN0cmluZztcbiAgICAgICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgICAgICAgIHN0YXRlID0ge307XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmZWF0dXJlKSkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmUuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldEdyaWRGZWF0dXJlKGYpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSB0aGlzLmdldEdyaWRGZWF0dXJlKGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUgPSB0aGlzLmdldEFsbEdyaWRGZWF0dXJlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXJpYWxpemUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUsIHRoaXMuc3RyaW5naWZ5Q2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIGFzIHN0cmluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSBhcyBJR3JpZFN0YXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgZ3JpZCBmZWF0dXJlcycgc3RhdGUgYmFzZWQgb24gdGhlIElHcmlkU3RhdGUgb2JqZWN0IHBhc3NlZCBhcyBhbiBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0gSUdyaWRTdGF0ZSBvYmplY3QgdG8gcmVzdG9yZSBzdGF0ZSBmcm9tLlxuICAgICAqIEByZXR1cm5zXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWd4R3JpZFN0YXRlXT1cIm9wdGlvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHN0YXRlO1xuICAgICAqIHRoaXMuc3RhdGUuc2V0U3RhdGUoZ3JpZFN0YXRlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IElHcmlkU3RhdGUgfCBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gSlNPTi5wYXJzZShzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIGFzIElHcmlkU3RhdGU7XG4gICAgICAgIHRoaXMucmVzdG9yZUdyaWRTdGF0ZSgpO1xuICAgICAgICB0aGlzLmdyaWQuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kIHRoYXQgY2FsbHMgY29ycmVzcG9uZGluZyBtZXRob2RzIHRvIHJlc3RvcmUgZmVhdHVyZSBmcm9tIHRoaXMuc3RhdGUgb2JqZWN0LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzdG9yZUdyaWRTdGF0ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVGZWF0dXJlKGtleSwgdGhpcy5zdGF0ZVtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGZlYXR1cmUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXN0b3JlRmVhdHVyZShmZWF0dXJlOiBzdHJpbmcsIHN0YXRlOiBJQ29sdW1uU3RhdGVbXSB8IElQYWdpbmdTdGF0ZSB8IElTb3J0aW5nRXhwcmVzc2lvbltdIHxcbiAgICAgICAgSUdyb3VwaW5nU3RhdGUgfCBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB8IGFueVtdKSB7XG4gICAgICAgIHN3aXRjaCAoZmVhdHVyZSkge1xuICAgICAgICAgICAgY2FzZSBDT0xVTU5TOiB7XG4gICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVDb2x1bW5zKHN0YXRlIGFzIElDb2x1bW5TdGF0ZVtdKTtcbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBGSUxURVJJTkc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVGaWx0ZXJpbmcoc3RhdGUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgQURWQU5DRURfRklMVEVSSU5HOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlQWR2YW5jZWRGaWx0ZXJpbmcoc3RhdGUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU09SVElORzoge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVNvcnRpbmcoc3RhdGUgYXMgSVNvcnRpbmdFeHByZXNzaW9uW10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBjYXNlIEdST1VQQlk6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVHcm91cEJ5KHN0YXRlIGFzIElHcm91cGluZ1N0YXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2FzZSBQQUdJTkc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVQYWdpbmcoc3RhdGUgYXMgSVBhZ2luZ1N0YXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFJPV19TRUxFQ1RJT046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVSb3dTZWxlY3Rpb24oc3RhdGUgYXMgYW55W10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgQ0VMTF9TRUxFQ1RJT046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVDZWxsU2VsZWN0aW9uKHN0YXRlIGFzIEdyaWRTZWxlY3Rpb25SYW5nZVtdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGdyaWQgZmVhdHVyZXMgc3RhdGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRBbGxHcmlkRmVhdHVyZXMoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGxldCBncmlkU3RhdGU6IElHcmlkU3RhdGUgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRHcmlkRmVhdHVyZShrZXkpO1xuICAgICAgICAgICAgICAgIGdyaWRTdGF0ZSA9ICBPYmplY3QuYXNzaWduKGdyaWRTdGF0ZSwgZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBncmlkU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBncmlkU3RhdGUpO1xuICAgICAgICByZXR1cm4gZ3JpZFN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBmb3IgYSBncmlkIGZlYXR1cmUuXG4gICAgICogYHNlcmlhbGl6ZWAgcGFyYW0gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgSlNPTiBzdHJpbmcuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuLFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0R3JpZEZlYXR1cmUoZmVhdHVyZTogc3RyaW5nKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHN0YXRlOiBJR3JpZFN0YXRlID0ge307XG4gICAgICAgIHN3aXRjaCAoZmVhdHVyZSkge1xuICAgICAgICAgICAgY2FzZSBDT0xVTU5TOiB7XG4gICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldENvbHVtbnMoKSk7XG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRklMVEVSSU5HOiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgdGhpcy5nZXRGaWx0ZXJpbmcoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEFEVkFOQ0VEX0ZJTFRFUklORzoge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0QWR2YW5jZWRGaWx0ZXJpbmcoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFNPUlRJTkc6IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldFNvcnRpbmcoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhc2UgR1JPVVBCWToge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0R3JvdXBCeSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2FzZSBQQUdJTkc6IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldFBhZ2luZygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFJPV19TRUxFQ1RJT046IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldFJvd1NlbGVjdGlvbigpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIENFTExfU0VMRUNUSU9OOiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgdGhpcy5nZXRDZWxsU2VsZWN0aW9uKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgYXJyYXkgd2l0aCB0aGUgY3VycmVudCBncmlkIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDb2x1bW5zKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBncmlkQ29sdW1uczogSUNvbHVtblN0YXRlW10gPSB0aGlzLmdyaWQuY29sdW1ucy5zb3J0KHRoaXMuc29ydEJ5VmlzaWJsZUluZGV4KS5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGlubmVkOiBjLnBpbm5lZCxcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogYy5zb3J0YWJsZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJhYmxlOiBjLmZpbHRlcmFibGUsXG4gICAgICAgICAgICAgICAgZWRpdGFibGU6IGMuZWRpdGFibGUsXG4gICAgICAgICAgICAgICAgc29ydGluZ0lnbm9yZUNhc2U6IGMuc29ydGluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nSWdub3JlQ2FzZTogYy5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgICAgIGhlYWRlckNsYXNzZXM6IGMuaGVhZGVyQ2xhc3NlcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJHcm91cENsYXNzZXM6IGMuaGVhZGVyR3JvdXBDbGFzc2VzLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBjLm1heFdpZHRoLFxuICAgICAgICAgICAgICAgIGdyb3VwYWJsZTogYy5ncm91cGFibGUsXG4gICAgICAgICAgICAgICAgbW92YWJsZTogYy5tb3ZhYmxlLFxuICAgICAgICAgICAgICAgIGhpZGRlbjogYy5oaWRkZW4sXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6IGMuZGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgaGFzU3VtbWFyeTogYy5oYXNTdW1tYXJ5LFxuICAgICAgICAgICAgICAgIGZpZWxkOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBjLndpZHRoLFxuICAgICAgICAgICAgICAgIGhlYWRlcjogYy5oZWFkZXIsXG4gICAgICAgICAgICAgICAgcmVzaXphYmxlOiBjLnJlc2l6YWJsZSxcbiAgICAgICAgICAgICAgICBzZWFyY2hhYmxlOiBjLnNlYXJjaGFibGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBncmlkQ29sdW1ucyB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmlsdGVyaW5nKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdTdGF0ZSA9IHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIHJldHVybiB7IGZpbHRlcmluZzogZmlsdGVyaW5nU3RhdGUgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFkdmFuY2VkRmlsdGVyaW5nKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZyA9IHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgcmV0dXJuIHsgYWR2YW5jZWRGaWx0ZXJpbmc6IGFkdmFuY2VkRmlsdGVyaW5nIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYWdpbmcoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHBhZ2luZ1N0YXRlID0gdGhpcy5ncmlkLnBhZ2luZ1N0YXRlO1xuICAgICAgICByZXR1cm4geyBwYWdpbmc6IHBhZ2luZ1N0YXRlIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3J0aW5nKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBzb3J0aW5nU3RhdGUgPSB0aGlzLmdyaWQuc29ydGluZ0V4cHJlc3Npb25zO1xuICAgICAgICBzb3J0aW5nU3RhdGUuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBzLnN0cmF0ZWd5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgc29ydGluZzogc29ydGluZ1N0YXRlIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcm91cEJ5KCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBncm91cGluZ0V4cHJlc3Npb25zID0gdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnM7XG4gICAgICAgIGdyb3VwaW5nRXhwcmVzc2lvbnMuZm9yRWFjaChleHByID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBleHByLnN0cmF0ZWd5O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZXhwYW5zaW9uU3RhdGUgPSB0aGlzLmdyaWQuZ3JvdXBpbmdFeHBhbnNpb25TdGF0ZTtcbiAgICAgICAgY29uc3QgZ3JvdXBzRXhwYW5kZWQgPSB0aGlzLmdyaWQuZ3JvdXBzRXhwYW5kZWQ7XG5cbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBCeTogeyBleHByZXNzaW9uczogZ3JvdXBpbmdFeHByZXNzaW9ucywgZXhwYW5zaW9uOiBleHBhbnNpb25TdGF0ZSwgZGVmYXVsdEV4cGFuZGVkOiBncm91cHNFeHBhbmRlZH0gIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSb3dTZWxlY3Rpb24oKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgcmV0dXJuIHsgcm93U2VsZWN0aW9uOiBzZWxlY3Rpb24gfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENlbGxTZWxlY3Rpb24oKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ3JpZC5nZXRTZWxlY3RlZFJhbmdlcygpLm1hcChyYW5nZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dTdGFydDogcmFuZ2Uucm93U3RhcnQsIHJvd0VuZDogcmFuZ2Uucm93RW5kLCBjb2x1bW5TdGFydDogcmFuZ2UuY29sdW1uU3RhcnQsIGNvbHVtbkVuZDogcmFuZ2UuY29sdW1uRW5kIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBjZWxsU2VsZWN0aW9uOiBzZWxlY3Rpb24gfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgZ3JpZCBjb2x1bW5zIGJ5IG1vZGlmeWluZyB0aGUgYGNvbHVtbkxpc3RgIGNvbGxlY3Rpb24gb2YgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXN0b3JlQ29sdW1ucyhjb2x1bW5zU3RhdGU6IElDb2x1bW5TdGF0ZVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgY29sdW1uc1N0YXRlLmZvckVhY2goKGNvbFN0YXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBmYWN0b3J5LmNyZWF0ZSh0aGlzLnZpZXdSZWYuaW5qZWN0b3IpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZWYuaW5zdGFuY2UsIGNvbFN0YXRlKTtcbiAgICAgICAgICAgIHJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICBuZXdDb2x1bW5zLnB1c2gocmVmLmluc3RhbmNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbkxpc3QucmVzZXQobmV3Q29sdW1ucyk7XG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5MaXN0Lm5vdGlmeU9uQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc29ydEJ5VmlzaWJsZUluZGV4KGNvbEE6IElneENvbHVtbkNvbXBvbmVudCwgY29sQjogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3QgYSA9IGNvbEEudmlzaWJsZUluZGV4LCBiID0gY29sQi52aXNpYmxlSW5kZXg7XG4gICAgICAgICAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBncmlkIGZpbHRlcmluZyBzdGF0ZSwgaS5lLiBzZXRzIHRoZSBgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlYCBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc3RvcmVGaWx0ZXJpbmcoc3RhdGU6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJUcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uc1RyZWVGcm9tT2JqZWN0KHN0YXRlKTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBncmlkIGFkdmFuY2VkIGZpbHRlcmluZyBzdGF0ZSwgaS5lLiBzZXRzIHRoZSBgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVgIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzdG9yZUFkdmFuY2VkRmlsdGVyaW5nKHN0YXRlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgY29uc3QgYWR2RmlsdGVyVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvbnNUcmVlRnJvbU9iamVjdChzdGF0ZSk7XG4gICAgICAgIHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGFkdkZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBncmlkIHNvcnRpbmcgc3RhdGUsIGkuZS4gc