ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
1,293 lines • 142 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs'), require('rxjs/operators'), require('ng-zorro-antd/core'), require('ng-zorro-antd/dropdown'), require('ng-zorro-antd/i18n'), require('@angular/cdk/platform'), require('@angular/cdk/scrolling'), require('@angular/common'), require('@angular/forms'), require('ng-zorro-antd/checkbox'), require('ng-zorro-antd/empty'), require('ng-zorro-antd/icon'), require('ng-zorro-antd/menu'), require('ng-zorro-antd/pagination'), require('ng-zorro-antd/radio'), require('ng-zorro-antd/spin')) :
typeof define === 'function' && define.amd ? define('ng-zorro-antd/table', ['exports', '@angular/core', 'rxjs', 'rxjs/operators', 'ng-zorro-antd/core', 'ng-zorro-antd/dropdown', 'ng-zorro-antd/i18n', '@angular/cdk/platform', '@angular/cdk/scrolling', '@angular/common', '@angular/forms', 'ng-zorro-antd/checkbox', 'ng-zorro-antd/empty', 'ng-zorro-antd/icon', 'ng-zorro-antd/menu', 'ng-zorro-antd/pagination', 'ng-zorro-antd/radio', 'ng-zorro-antd/spin'], factory) :
(factory((global['ng-zorro-antd'] = global['ng-zorro-antd'] || {}, global['ng-zorro-antd'].table = {}),global.ng.core,global.rxjs,global.rxjs.operators,global['ng-zorro-antd'].core,global['ng-zorro-antd'].dropdown,global['ng-zorro-antd'].i18n,global.ng.cdk.platform,global.ng.cdk.scrolling,global.ng.common,global.ng.forms,global['ng-zorro-antd'].checkbox,global['ng-zorro-antd'].empty,global['ng-zorro-antd'].icon,global['ng-zorro-antd'].menu,global['ng-zorro-antd'].pagination,global['ng-zorro-antd'].radio,global['ng-zorro-antd'].spin));
}(this, (function (exports,core,rxjs,operators,core$1,dropdown,i18n,platform,scrolling,common,forms,checkbox,empty,icon,menu,pagination,radio,spin) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if (d = decorators[i])
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __metadata(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
return Reflect.metadata(metadataKey, metadataValue);
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
}
catch (error) {
e = { error: error };
}
finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
}
finally {
if (e)
throw e.error;
}
}
return ar;
}
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzThComponent = /** @class */ (function () {
function NzThComponent(cdr, i18n$$1) {
this.cdr = cdr;
this.i18n = i18n$$1;
this.hasFilterValue = false;
this.filterVisible = false;
this.multipleFilterList = [];
this.singleFilterList = [];
/* tslint:disable-next-line:no-any */
this.locale = ( /** @type {?} */({}));
this.nzWidthChange$ = new rxjs.Subject();
this.destroy$ = new rxjs.Subject();
this.hasDefaultFilter = false;
/* tslint:disable-next-line:no-any */
this.nzSelections = [];
this.nzChecked = false;
this.nzDisabled = false;
this.nzIndeterminate = false;
this.nzFilterMultiple = true;
this.nzSort = null;
this.nzFilters = [];
this.nzExpand = false;
this.nzShowCheckbox = false;
this.nzCustomFilter = false;
this.nzShowSort = false;
this.nzShowFilter = false;
this.nzShowRowSelection = false;
this.nzCheckedChange = new core.EventEmitter();
this.nzSortChange = new core.EventEmitter();
this.nzSortChangeWithKey = new core.EventEmitter();
/* tslint:disable-next-line:no-any */
this.nzFilterChange = new core.EventEmitter();
}
/**
* @return {?}
*/
NzThComponent.prototype.updateSortValue = /**
* @return {?}
*/
function () {
if (this.nzShowSort) {
if (this.nzSort === 'descend') {
this.setSortValue('ascend');
}
else if (this.nzSort === 'ascend') {
this.setSortValue(null);
}
else {
this.setSortValue('descend');
}
}
};
/**
* @param {?} value
* @return {?}
*/
NzThComponent.prototype.setSortValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.nzSort = value;
this.nzSortChangeWithKey.emit({ key: this.nzSortKey, value: this.nzSort });
this.nzSortChange.emit(this.nzSort);
};
Object.defineProperty(NzThComponent.prototype, "filterList", {
get: /**
* @return {?}
*/ function () {
return this.multipleFilterList.filter(( /**
* @param {?} item
* @return {?}
*/function (item) { return item.checked; })).map(( /**
* @param {?} item
* @return {?}
*/function (item) { return item.value; }));
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzThComponent.prototype, "filterValue", {
/* tslint:disable-next-line:no-any */
get: /* tslint:disable-next-line:no-any */
/**
* @return {?}
*/
function () {
/** @type {?} */
var checkedFilter = this.singleFilterList.find(( /**
* @param {?} item
* @return {?}
*/function (item) { return item.checked; }));
return checkedFilter ? checkedFilter.value : null;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NzThComponent.prototype.updateFilterStatus = /**
* @return {?}
*/
function () {
if (this.nzFilterMultiple) {
this.hasFilterValue = this.filterList.length > 0;
}
else {
this.hasFilterValue = core$1.isNotNil(this.filterValue);
}
};
/**
* @return {?}
*/
NzThComponent.prototype.search = /**
* @return {?}
*/
function () {
this.updateFilterStatus();
if (this.nzFilterMultiple) {
this.nzFilterChange.emit(this.filterList);
}
else {
this.nzFilterChange.emit(this.filterValue);
}
};
/**
* @return {?}
*/
NzThComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.initMultipleFilterList(true);
this.initSingleFilterList(true);
this.hasFilterValue = false;
};
/**
* @param {?} filter
* @return {?}
*/
NzThComponent.prototype.checkMultiple = /**
* @param {?} filter
* @return {?}
*/
function (filter) {
filter.checked = !filter.checked;
};
/**
* @param {?} filter
* @return {?}
*/
NzThComponent.prototype.checkSingle = /**
* @param {?} filter
* @return {?}
*/
function (filter) {
this.singleFilterList.forEach(( /**
* @param {?} item
* @return {?}
*/function (item) { return (item.checked = item === filter); }));
};
/**
* @return {?}
*/
NzThComponent.prototype.hideDropDown = /**
* @return {?}
*/
function () {
this.nzDropDownComponent.setVisibleStateWhen(false);
this.filterVisible = false;
};
/**
* @param {?} value
* @return {?}
*/
NzThComponent.prototype.dropDownVisibleChange = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.filterVisible = value;
if (!value) {
this.search();
}
};
/**
* @param {?=} force
* @return {?}
*/
NzThComponent.prototype.initMultipleFilterList = /**
* @param {?=} force
* @return {?}
*/
function (force) {
var _this = this;
this.multipleFilterList = this.nzFilters.map(( /**
* @param {?} item
* @return {?}
*/function (item) {
/** @type {?} */
var checked = force ? false : !!item.byDefault;
if (checked) {
_this.hasDefaultFilter = true;
}
return { text: item.text, value: item.value, checked: checked };
}));
this.checkDefaultFilters();
};
/**
* @param {?=} force
* @return {?}
*/
NzThComponent.prototype.initSingleFilterList = /**
* @param {?=} force
* @return {?}
*/
function (force) {
var _this = this;
this.singleFilterList = this.nzFilters.map(( /**
* @param {?} item
* @return {?}
*/function (item) {
/** @type {?} */
var checked = force ? false : !!item.byDefault;
if (checked) {
_this.hasDefaultFilter = true;
}
return { text: item.text, value: item.value, checked: checked };
}));
this.checkDefaultFilters();
};
/**
* @return {?}
*/
NzThComponent.prototype.checkDefaultFilters = /**
* @return {?}
*/
function () {
if (!this.nzFilters || this.nzFilters.length === 0 || !this.hasDefaultFilter) {
return;
}
this.updateFilterStatus();
};
/**
* @return {?}
*/
NzThComponent.prototype.marForCheck = /**
* @return {?}
*/
function () {
this.cdr.markForCheck();
};
/**
* @return {?}
*/
NzThComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.i18n.localeChange.pipe(operators.takeUntil(this.destroy$)).subscribe(( /**
* @return {?}
*/function () {
_this.locale = _this.i18n.getLocaleData('Table');
_this.cdr.markForCheck();
}));
};
/**
* @param {?} changes
* @return {?}
*/
NzThComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.nzFilters) {
this.initMultipleFilterList();
this.initSingleFilterList();
this.updateFilterStatus();
}
if (changes.nzWidth) {
this.nzWidthChange$.next(this.nzWidth);
}
};
/**
* @return {?}
*/
NzThComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy$.next();
this.destroy$.complete();
};
NzThComponent.decorators = [
{ type: core.Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'th:not(.nz-disable-th)',
preserveWhitespaces: false,
encapsulation: core.ViewEncapsulation.None,
changeDetection: core.ChangeDetectionStrategy.OnPush,
template: "<ng-template #checkboxTemplate>\n <label nz-checkbox\n [class.ant-table-selection-select-all-custom]=\"nzShowRowSelection\"\n [(ngModel)]=\"nzChecked\"\n [nzDisabled]=\"nzDisabled\"\n [nzIndeterminate]=\"nzIndeterminate\"\n (ngModelChange)=\"nzCheckedChange.emit($event)\">\n </label>\n</ng-template>\n<span class=\"ant-table-header-column\">\n <div [class.ant-table-column-sorters]=\"nzShowSort\" (click)=\"updateSortValue()\">\n <span class=\"ant-table-column-title\">\n <ng-container *ngIf=\"nzShowCheckbox && !nzShowRowSelection\">\n <ng-template [ngTemplateOutlet]=\"checkboxTemplate\"></ng-template>\n </ng-container>\n <div class=\"ant-table-selection\" *ngIf=\"nzShowRowSelection\">\n <ng-container *ngIf=\"nzShowCheckbox\">\n <ng-template [ngTemplateOutlet]=\"checkboxTemplate\"></ng-template>\n </ng-container>\n <nz-dropdown nzPlacement=\"bottomLeft\">\n <div nz-dropdown class=\"ant-table-selection-down\">\n <i nz-icon type=\"down\"></i>\n </div>\n <ul nz-menu class=\"ant-table-selection-menu\">\n <li nz-menu-item *ngFor=\"let selection of nzSelections\" (click)=\"selection.onSelect()\">{{selection.text}}</li>\n </ul>\n </nz-dropdown>\n </div>\n <ng-content></ng-content>\n </span>\n <ng-content selector=\"nz-dropdown\"></ng-content>\n <div class=\"ant-table-column-sorter\" *ngIf=\"nzShowSort\">\n <div class=\"ant-table-column-sorter-inner ant-table-column-sorter-inner-full\">\n <i nz-icon\n type=\"caret-up\"\n class=\"ant-table-column-sorter-up\"\n [class.on]=\"nzSort == 'ascend'\"\n [class.off]=\"nzSort != 'ascend'\"></i>\n <i nz-icon\n type=\"caret-down\"\n class=\"ant-table-column-sorter-down\"\n [class.on]=\"nzSort == 'descend'\"\n [class.off]=\"nzSort != 'descend'\"></i>\n </div>\n </div>\n </div>\n</span>\n<nz-dropdown nzTrigger=\"click\" *ngIf=\"nzShowFilter\" [nzClickHide]=\"false\" nzTableFilter (nzVisibleChange)=\"dropDownVisibleChange($event)\">\n <i nz-icon type=\"filter\" theme=\"fill\" [class.ant-table-filter-selected]=\"hasFilterValue\" [class.ant-table-filter-open]=\"filterVisible\" nz-dropdown></i>\n <ul nz-menu>\n <ng-container *ngIf=\"nzFilterMultiple\">\n <li nz-menu-item *ngFor=\"let filter of multipleFilterList\" (click)=\"checkMultiple(filter)\">\n <label nz-checkbox [ngModel]=\"filter.checked\" (ngModelChange)=\"checkMultiple(filter)\"></label><span>{{filter.text}}</span>\n </li>\n </ng-container>\n <ng-container *ngIf=\"!nzFilterMultiple\">\n <li nz-menu-item *ngFor=\"let filter of singleFilterList\" (click)=\"checkSingle(filter)\">\n <label nz-radio [ngModel]=\"filter.checked\" (ngModelChange)=\"checkSingle(filter)\">{{filter.text}}</label>\n </li>\n </ng-container>\n </ul>\n <div class=\"ant-table-filter-dropdown-btns\">\n <a class=\"ant-table-filter-dropdown-link confirm\" (click)=\"hideDropDown()\">\n <span>{{ locale.filterConfirm }}</span>\n </a>\n <a class=\"ant-table-filter-dropdown-link clear\" (click)=\"reset();hideDropDown()\">\n <span>{{ locale.filterReset }}</span>\n </a>\n </div>\n</nz-dropdown>\n",
host: {
'[class.ant-table-column-has-actions]': 'nzShowFilter || nzShowSort || nzCustomFilter',
'[class.ant-table-column-has-filters]': 'nzShowFilter || nzCustomFilter',
'[class.ant-table-column-has-sorters]': 'nzShowSort',
'[class.ant-table-selection-column-custom]': 'nzShowRowSelection',
'[class.ant-table-selection-column]': 'nzShowCheckbox',
'[class.ant-table-expand-icon-th]': 'nzExpand',
'[class.ant-table-th-left-sticky]': 'nzLeft',
'[class.ant-table-th-right-sticky]': 'nzRight',
'[class.ant-table-column-sort]': "nzSort === 'descend' || nzSort === 'ascend'",
'[style.left]': 'nzLeft',
'[style.right]': 'nzRight',
'[style.text-align]': 'nzAlign'
}
}] }
];
/** @nocollapse */
NzThComponent.ctorParameters = function () {
return [
{ type: core.ChangeDetectorRef },
{ type: i18n.NzI18nService }
];
};
NzThComponent.propDecorators = {
nzDropDownComponent: [{ type: core.ViewChild, args: [dropdown.NzDropDownComponent,] }],
nzSelections: [{ type: core.Input }],
nzChecked: [{ type: core.Input }],
nzDisabled: [{ type: core.Input }],
nzIndeterminate: [{ type: core.Input }],
nzSortKey: [{ type: core.Input }],
nzFilterMultiple: [{ type: core.Input }],
nzWidth: [{ type: core.Input }],
nzLeft: [{ type: core.Input }],
nzRight: [{ type: core.Input }],
nzAlign: [{ type: core.Input }],
nzSort: [{ type: core.Input }],
nzFilters: [{ type: core.Input }],
nzExpand: [{ type: core.Input }],
nzShowCheckbox: [{ type: core.Input }],
nzCustomFilter: [{ type: core.Input }],
nzShowSort: [{ type: core.Input }],
nzShowFilter: [{ type: core.Input }],
nzShowRowSelection: [{ type: core.Input }],
nzCheckedChange: [{ type: core.Output }],
nzSortChange: [{ type: core.Output }],
nzSortChangeWithKey: [{ type: core.Output }],
nzFilterChange: [{ type: core.Output }]
};
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzThComponent.prototype, "nzExpand", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzThComponent.prototype, "nzShowCheckbox", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzThComponent.prototype, "nzCustomFilter", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzThComponent.prototype, "nzShowSort", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzThComponent.prototype, "nzShowFilter", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzThComponent.prototype, "nzShowRowSelection", void 0);
return NzThComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzVirtualScrollDirective = /** @class */ (function () {
/* tslint:disable-next-line:no-any */
function NzVirtualScrollDirective(templateRef) {
this.templateRef = templateRef;
}
NzVirtualScrollDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[nz-virtual-scroll]',
exportAs: 'nzVirtualScroll'
},] }
];
/** @nocollapse */
NzVirtualScrollDirective.ctorParameters = function () {
return [
{ type: core.TemplateRef }
];
};
return NzVirtualScrollDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template T
*/
var NzTableComponent = /** @class */ (function () {
function NzTableComponent(renderer, ngZone, cdr, nzMeasureScrollbarService, i18n$$1, platform$$1, elementRef) {
this.renderer = renderer;
this.ngZone = ngZone;
this.cdr = cdr;
this.nzMeasureScrollbarService = nzMeasureScrollbarService;
this.i18n = i18n$$1;
this.platform = platform$$1;
/**
* public data for ngFor tr
*/
this.data = [];
this.locale = {}; // tslint:disable-line:no-any
this.lastScrollLeft = 0;
this.headerBottomStyle = {};
this.destroy$ = new rxjs.Subject();
this.nzSize = 'default';
this.nzPageSizeOptions = [10, 20, 30, 40, 50];
this.nzVirtualScroll = false;
this.nzVirtualItemSize = 0;
this.nzVirtualMaxBufferPx = 200;
this.nzVirtualMinBufferPx = 100;
this.nzLoadingDelay = 0;
this.nzTotal = 0;
this.nzWidthConfig = [];
this.nzPageIndex = 1;
this.nzPageSize = 10;
this.nzData = [];
this.nzPaginationPosition = 'bottom';
this.nzScroll = { x: null, y: null };
this.nzFrontPagination = true;
this.nzTemplateMode = false;
this.nzBordered = false;
this.nzShowPagination = true;
this.nzLoading = false;
this.nzShowSizeChanger = false;
this.nzHideOnSinglePage = false;
this.nzShowQuickJumper = false;
this.nzSimple = false;
this.nzPageSizeChange = new core.EventEmitter();
this.nzPageIndexChange = new core.EventEmitter();
/* tslint:disable-next-line:no-any */
this.nzCurrentPageDataChange = new core.EventEmitter();
renderer.addClass(elementRef.nativeElement, 'ant-table-wrapper');
}
Object.defineProperty(NzTableComponent.prototype, "tableBodyNativeElement", {
get: /**
* @return {?}
*/ function () {
return this.tableBodyElement && this.tableBodyElement.nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzTableComponent.prototype, "tableHeaderNativeElement", {
get: /**
* @return {?}
*/ function () {
return this.tableHeaderElement && this.tableHeaderElement.nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzTableComponent.prototype, "cdkVirtualScrollNativeElement", {
get: /**
* @return {?}
*/ function () {
return this.cdkVirtualScrollElement && this.cdkVirtualScrollElement.nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzTableComponent.prototype, "mixTableBodyNativeElement", {
get: /**
* @return {?}
*/ function () {
return this.tableBodyNativeElement || this.cdkVirtualScrollNativeElement;
},
enumerable: true,
configurable: true
});
/**
* @param {?} size
* @param {?} index
* @return {?}
*/
NzTableComponent.prototype.emitPageSizeOrIndex = /**
* @param {?} size
* @param {?} index
* @return {?}
*/
function (size, index) {
if (this.nzPageSize !== size || this.nzPageIndex !== index) {
if (this.nzPageSize !== size) {
this.nzPageSize = size;
this.nzPageSizeChange.emit(this.nzPageSize);
}
if (this.nzPageIndex !== index) {
this.nzPageIndex = index;
this.nzPageIndexChange.emit(this.nzPageIndex);
}
this.updateFrontPaginationDataIfNeeded(this.nzPageSize !== size);
}
};
/**
* @param {?} e
* @return {?}
*/
NzTableComponent.prototype.syncScrollTable = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (e.currentTarget === e.target) {
/** @type {?} */
var target = ( /** @type {?} */(e.target));
if (target.scrollLeft !== this.lastScrollLeft && this.nzScroll && this.nzScroll.x) {
if (target === this.mixTableBodyNativeElement && this.tableHeaderNativeElement) {
this.tableHeaderNativeElement.scrollLeft = target.scrollLeft;
}
else if (target === this.tableHeaderNativeElement && this.mixTableBodyNativeElement) {
this.mixTableBodyNativeElement.scrollLeft = target.scrollLeft;
}
this.setScrollPositionClassName();
}
this.lastScrollLeft = target.scrollLeft;
}
};
/**
* @return {?}
*/
NzTableComponent.prototype.setScrollPositionClassName = /**
* @return {?}
*/
function () {
if (this.mixTableBodyNativeElement && this.nzScroll && this.nzScroll.x) {
if (this.mixTableBodyNativeElement.scrollWidth === this.mixTableBodyNativeElement.clientWidth &&
this.mixTableBodyNativeElement.scrollWidth !== 0) {
this.setScrollName();
}
else if (this.mixTableBodyNativeElement.scrollLeft === 0) {
this.setScrollName('left');
}
else if (this.mixTableBodyNativeElement.scrollWidth ===
this.mixTableBodyNativeElement.scrollLeft + this.mixTableBodyNativeElement.clientWidth) {
this.setScrollName('right');
}
else {
this.setScrollName('middle');
}
}
};
/**
* @param {?=} position
* @return {?}
*/
NzTableComponent.prototype.setScrollName = /**
* @param {?=} position
* @return {?}
*/
function (position) {
var _this = this;
/** @type {?} */
var prefix = 'ant-table-scroll-position';
/** @type {?} */
var classList = ['left', 'right', 'middle'];
classList.forEach(( /**
* @param {?} name
* @return {?}
*/function (name) {
_this.renderer.removeClass(_this.tableMainElement.nativeElement, prefix + "-" + name);
}));
if (position) {
this.renderer.addClass(this.tableMainElement.nativeElement, prefix + "-" + position);
}
};
/**
* @return {?}
*/
NzTableComponent.prototype.fitScrollBar = /**
* @return {?}
*/
function () {
/** @type {?} */
var scrollbarWidth = this.nzMeasureScrollbarService.scrollBarWidth;
if (scrollbarWidth) {
this.headerBottomStyle = {
marginBottom: "-" + scrollbarWidth + "px",
paddingBottom: "0px"
};
this.cdr.markForCheck();
}
};
/**
* @param {?=} isPageSizeOrDataChange
* @return {?}
*/
NzTableComponent.prototype.updateFrontPaginationDataIfNeeded = /**
* @param {?=} isPageSizeOrDataChange
* @return {?}
*/
function (isPageSizeOrDataChange) {
var _this = this;
if (isPageSizeOrDataChange === void 0) {
isPageSizeOrDataChange = false;
}
/** @type {?} */
var data = [];
if (this.nzFrontPagination) {
this.nzTotal = this.nzData.length;
if (isPageSizeOrDataChange) {
/** @type {?} */
var maxPageIndex = Math.ceil(this.nzData.length / this.nzPageSize) || 1;
/** @type {?} */
var pageIndex_1 = this.nzPageIndex > maxPageIndex ? maxPageIndex : this.nzPageIndex;
if (pageIndex_1 !== this.nzPageIndex) {
this.nzPageIndex = pageIndex_1;
Promise.resolve().then(( /**
* @return {?}
*/function () { return _this.nzPageIndexChange.emit(pageIndex_1); }));
}
}
data = this.nzData.slice((this.nzPageIndex - 1) * this.nzPageSize, this.nzPageIndex * this.nzPageSize);
}
else {
data = this.nzData;
}
this.data = __spread(data);
this.nzCurrentPageDataChange.next(this.data);
};
/**
* @return {?}
*/
NzTableComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.i18n.localeChange.pipe(operators.takeUntil(this.destroy$)).subscribe(( /**
* @return {?}
*/function () {
_this.locale = _this.i18n.getLocaleData('Table');
_this.cdr.markForCheck();
}));
};
/**
* @param {?} changes
* @return {?}
*/
NzTableComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.nzScroll) {
if (changes.nzScroll.currentValue) {
this.nzScroll = changes.nzScroll.currentValue;
}
else {
this.nzScroll = { x: null, y: null };
}
this.setScrollPositionClassName();
}
if (changes.nzPageIndex || changes.nzPageSize || changes.nzFrontPagination || changes.nzData) {
this.updateFrontPaginationDataIfNeeded(!!(changes.nzPageSize || changes.nzData));
}
};
/**
* @return {?}
*/
NzTableComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.platform.isBrowser) {
return;
}
setTimeout(( /**
* @return {?}
*/function () { return _this.setScrollPositionClassName(); }));
this.ngZone.runOutsideAngular(( /**
* @return {?}
*/function () {
rxjs.merge(_this.tableHeaderNativeElement ? rxjs.fromEvent(_this.tableHeaderNativeElement, 'scroll') : rxjs.EMPTY, _this.mixTableBodyNativeElement ? rxjs.fromEvent(_this.mixTableBodyNativeElement, 'scroll') : rxjs.EMPTY)
.pipe(operators.takeUntil(_this.destroy$))
.subscribe(( /**
* @param {?} data
* @return {?}
*/function (data) {
_this.syncScrollTable(data);
}));
rxjs.fromEvent(window, 'resize')
.pipe(operators.startWith(true), operators.takeUntil(_this.destroy$))
.subscribe(( /**
* @return {?}
*/function () {
_this.fitScrollBar();
_this.setScrollPositionClassName();
}));
}));
};
/**
* @return {?}
*/
NzTableComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
this.listOfNzThComponent.changes
.pipe(operators.startWith(true), operators.flatMap(( /**
* @return {?}
*/function () {
return rxjs.merge.apply(void 0, __spread([_this.listOfNzThComponent.changes], _this.listOfNzThComponent.map(( /**
* @param {?} th
* @return {?}
*/function (th) { return th.nzWidthChange$; }))));
})), operators.takeUntil(this.destroy$))
.subscribe(( /**
* @return {?}
*/function () {
_this.cdr.markForCheck();
}));
};
/**
* @return {?}
*/
NzTableComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy$.next();
this.destroy$.complete();
};
NzTableComponent.decorators = [
{ type: core.Component, args: [{
selector: 'nz-table',
exportAs: 'nzTable',
preserveWhitespaces: false,
changeDetection: core.ChangeDetectionStrategy.OnPush,
encapsulation: core.ViewEncapsulation.None,
template: "<ng-template #renderItemTemplate let-type let-page=\"page\">\n <a class=\"ant-pagination-item-link\" *ngIf=\"type==='pre'\"><i nz-icon type=\"left\"></i></a>\n <a class=\"ant-pagination-item-link\" *ngIf=\"type==='next'\"><i nz-icon type=\"right\"></i></a>\n <a *ngIf=\"type=='page'\">{{ page }}</a>\n</ng-template>\n<ng-template #colGroupTemplate>\n <colgroup>\n <col [style.width]=\"width\" [style.minWidth]=\"width\" *ngFor=\"let width of nzWidthConfig\">\n <col [style.width]=\"th.nzWidth\" [style.minWidth]=\"th.nzWidth\" *ngFor=\"let th of listOfNzThComponent\">\n </colgroup>\n</ng-template>\n<ng-template #headerTemplate>\n <ng-template [ngTemplateOutlet]=\"colGroupTemplate\"></ng-template>\n <thead class=\"ant-table-thead\" *ngIf=\"!nzScroll.y\">\n <ng-template [ngTemplateOutlet]=\"nzTheadComponent?.templateRef\"></ng-template>\n </thead>\n</ng-template>\n<ng-template #tableInnerTemplate>\n <div #tableHeaderElement\n *ngIf=\"nzScroll.y\"\n [ngStyle]=\"headerBottomStyle\"\n class=\"ant-table-header\">\n <table [class.ant-table-fixed]=\"nzScroll.x\" [style.width]=\"nzScroll.x\">\n <ng-template [ngTemplateOutlet]=\"colGroupTemplate\"></ng-template>\n <thead class=\"ant-table-thead\" *ngIf=\"nzScroll.y\">\n <ng-template [ngTemplateOutlet]=\"nzTheadComponent?.templateRef\"></ng-template>\n </thead>\n </table>\n </div>\n <div #tableBodyElement *ngIf=\"!nzVirtualScroll;else scrollViewTpl\"\n class=\"ant-table-body\"\n [style.maxHeight]=\"nzScroll.y\"\n [style.overflow-y]=\"nzScroll.y ? 'scroll' : ''\"\n [style.overflow-x]=\"nzScroll.x ? 'auto' : ''\">\n <table [class.ant-table-fixed]=\"nzScroll.x\" [style.width]=\"nzScroll.x\">\n <ng-template [ngIf]=\"!nzVirtualScroll\" [ngTemplateOutlet]=\"headerTemplate\"></ng-template>\n <ng-content></ng-content>\n </table>\n </div>\n <ng-template #scrollViewTpl>\n <cdk-virtual-scroll-viewport\n class=\"ant-table-body\"\n [itemSize]=\"nzVirtualItemSize\"\n [maxBufferPx]=\"nzVirtualMaxBufferPx\"\n [minBufferPx]=\"nzVirtualMinBufferPx\"\n [style.height]=\"nzScroll.y\">\n <table [class.ant-table-fixed]=\"nzScroll.x\" [style.width]=\"nzScroll.x\">\n <ng-template [ngIf]=\"nzVirtualScroll\" [ngTemplateOutlet]=\"headerTemplate\"></ng-template>\n <tbody>\n <ng-container *cdkVirtualFor=\"let item of data; let i = index\">\n <ng-template [ngTemplateOutlet]=\"nzVirtualScrollDirective?.templateRef\" [ngTemplateOutletContext]=\"{$implicit:item, index:i}\"></ng-template>\n </ng-container>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n <div class=\"ant-table-placeholder\" *ngIf=\"data.length === 0 && !nzLoading && !nzTemplateMode\">\n <nz-embed-empty [nzComponentName]=\"'table'\" [specificContent]=\"nzNoResult\"></nz-embed-empty>\n </div>\n <div class=\"ant-table-footer\" *ngIf=\"nzFooter\">\n <ng-container *nzStringTemplateOutlet=\"nzFooter\">{{ nzFooter }}</ng-container>\n </div>\n</ng-template>\n<ng-template #paginationTemplate>\n <nz-pagination *ngIf=\"nzShowPagination && data.length\"\n [nzInTable]=\"true\"\n [nzShowSizeChanger]=\"nzShowSizeChanger\"\n [nzPageSizeOptions]=\"nzPageSizeOptions\"\n [nzItemRender]=\"nzItemRender\"\n [nzShowQuickJumper]=\"nzShowQuickJumper\"\n [nzHideOnSinglePage]=\"nzHideOnSinglePage\"\n [nzShowTotal]=\"nzShowTotal\"\n [nzSize]=\"(nzSize === 'middle' || nzSize=='small') ? 'small' : ''\"\n [nzPageSize]=\"nzPageSize\"\n [nzTotal]=\"nzTotal\"\n [nzSimple]=\"nzSimple\"\n [nzPageIndex]=\"nzPageIndex\"\n (nzPageSizeChange)=\"emitPageSizeOrIndex($event,nzPageIndex)\"\n (nzPageIndexChange)=\"emitPageSizeOrIndex(nzPageSize,$event)\">\n </nz-pagination>\n</ng-template>\n<nz-spin [nzDelay]=\"nzLoadingDelay\" [nzSpinning]=\"nzLoading\" [nzIndicator]=\"nzLoadingIndicator\">\n <ng-container *ngIf=\"nzPaginationPosition === 'both' || nzPaginationPosition === 'top'\">\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\n </ng-container>\n <div #tableMainElement\n class=\"ant-table\"\n [class.ant-table-fixed-header]=\"nzScroll.x || nzScroll.y\"\n [class.ant-table-bordered]=\"nzBordered\"\n [class.ant-table-default]=\"nzSize === 'default'\"\n [class.ant-table-middle]=\"nzSize === 'middle'\"\n [class.ant-table-small]=\"nzSize === 'small'\">\n <div class=\"ant-table-title\" *ngIf=\"nzTitle\">\n <ng-container *nzStringTemplateOutlet=\"nzTitle\">{{ nzTitle }}</ng-container>\n </div>\n <div class=\"ant-table-content\">\n <ng-container *ngIf=\"nzScroll.x || nzScroll.y; else tableInnerTemplate\">\n <div class=\"ant-table-scroll\">\n <ng-template [ngTemplateOutlet]=\"tableInnerTemplate\"></ng-template>\n </div>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"nzPaginationPosition === 'both' || nzPaginationPosition === 'bottom'\">\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\n </ng-container>\n</nz-spin>\n",
host: {
'[class.ant-table-empty]': 'data.length === 0'
},
styles: ["\n nz-table {\n display: block;\n }\n\n cdk-virtual-scroll-viewport.ant-table-body {\n overflow-y: scroll;\n }\n "]
}] }
];
/** @nocollapse */
NzTableComponent.ctorParameters = function () {
return [
{ type: core.Renderer2 },
{ type: core.NgZone },
{ type: core.ChangeDetectorRef },
{ type: core$1.NzMeasureScrollbarService },
{ type: i18n.NzI18nService },
{ type: platform.Platform },
{ type: core.ElementRef }
];
};
NzTableComponent.propDecorators = {
listOfNzThComponent: [{ type: core.ContentChildren, args: [NzThComponent, { descendants: true },] }],
tableHeaderElement: [{ type: core.ViewChild, args: ['tableHeaderElement', { read: core.ElementRef },] }],
tableBodyElement: [{ type: core.ViewChild, args: ['tableBodyElement', { read: core.ElementRef },] }],
tableMainElement: [{ type: core.ViewChild, args: ['tableMainElement', { read: core.ElementRef },] }],
cdkVirtualScrollElement: [{ type: core.ViewChild, args: [scrolling.CdkVirtualScrollViewport, { read: core.ElementRef },] }],
cdkVirtualScrollViewport: [{ type: core.ViewChild, args: [scrolling.CdkVirtualScrollViewport, { read: scrolling.CdkVirtualScrollViewport },] }],
nzVirtualScrollDirective: [{ type: core.ContentChild, args: [NzVirtualScrollDirective,] }],
nzSize: [{ type: core.Input }],
nzShowTotal: [{ type: core.Input }],
nzPageSizeOptions: [{ type: core.Input }],
nzVirtualScroll: [{ type: core.Input }],
nzVirtualItemSize: [{ type: core.Input }],
nzVirtualMaxBufferPx: [{ type: core.Input }],
nzVirtualMinBufferPx: [{ type: core.Input }],
nzLoadingDelay: [{ type: core.Input }],
nzLoadingIndicator: [{ type: core.Input }],
nzTotal: [{ type: core.Input }],
nzTitle: [{ type: core.Input }],
nzFooter: [{ type: core.Input }],
nzNoResult: [{ type: core.Input }],
nzWidthConfig: [{ type: core.Input }],
nzPageIndex: [{ type: core.Input }],
nzPageSize: [{ type: core.Input }],
nzData: [{ type: core.Input }],
nzPaginationPosition: [{ type: core.Input }],
nzScroll: [{ type: core.Input }],
nzItemRender: [{ type: core.Input }, { type: core.ViewChild, args: ['renderItemTemplate',] }],
nzFrontPagination: [{ type: core.Input }],
nzTemplateMode: [{ type: core.Input }],
nzBordered: [{ type: core.Input }],
nzShowPagination: [{ type: core.Input }],
nzLoading: [{ type: core.Input }],
nzShowSizeChanger: [{ type: core.Input }],
nzHideOnSinglePage: [{ type: core.Input }],
nzShowQuickJumper: [{ type: core.Input }],
nzSimple: [{ type: core.Input }],
nzPageSizeChange: [{ type: core.Output }],
nzPageIndexChange: [{ type: core.Output }],
nzCurrentPageDataChange: [{ type: core.Output }]
};
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzVirtualScroll", void 0);
__decorate([
core$1.InputNumber(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzVirtualItemSize", void 0);
__decorate([
core$1.InputNumber(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzVirtualMaxBufferPx", void 0);
__decorate([
core$1.InputNumber(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzVirtualMinBufferPx", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzFrontPagination", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzTemplateMode", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzBordered", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzShowPagination", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzLoading", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzShowSizeChanger", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzHideOnSinglePage", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzShowQuickJumper", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTableComponent.prototype, "nzSimple", void 0);
return NzTableComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzTbodyDirective = /** @class */ (function () {
function NzTbodyDirective(nzTableComponent) {
this.nzTableComponent = nzTableComponent;
}
NzTbodyDirective.decorators = [
{ type: core.Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: 'tbody',
host: {
'[class.ant-table-tbody]': 'nzTableComponent'
}
},] }
];
/** @nocollapse */
NzTbodyDirective.ctorParameters = function () {
return [
{ type: NzTableComponent, decorators: [{ type: core.Host }, { type: core.Optional }] }
];
};
return NzTbodyDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzTdComponent = /** @class */ (function () {
function NzTdComponent(elementRef, nzUpdateHostClassService) {
this.elementRef = elementRef;
this.nzUpdateHostClassService = nzUpdateHostClassService;
this.nzChecked = false;
this.nzDisabled = false;
this.nzIndeterminate = false;
this.nzExpand = false;
this.nzShowExpand = false;
this.nzShowCheckbox = false;
this.nzCheckedChange = new core.EventEmitter();
this.nzExpandChange = new core.EventEmitter();
}
/**
* @param {?} e
* @return {?}
*/
NzTdComponent.prototype.expandChange = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.stopPropagation();
this.nzExpand = !this.nzExpand;
this.nzExpandChange.emit(this.nzExpand);
};
/**
* @return {?}
*/
NzTdComponent.prototype.setClassMap = /**
* @return {?}
*/
function () {
var _a;
this.nzUpdateHostClassService.updateHostClass(this.elementRef.nativeElement, (_a = {},
_a["ant-table-row-expand-icon-cell"] = this.nzShowExpand && !core$1.isNotNil(this.nzIndentSize),
_a["ant-table-selection-column"] = this.nzShowCheckbox,
_a["ant-table-td-left-sticky"] = core$1.isNotNil(this.nzLeft),
_a["ant-table-td-right-sticky"] = core$1.isNotNil(this.nzRight),
_a));
};
/**
* @param {?} changes
* @return {?}
*/
NzTdComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.nzIndentSize || changes.nzShowExpand || changes.nzShowCheckbox || changes.nzRight || changes.nzLeft) {
this.setClassMap();
}
};
NzTdComponent.decorators = [
{ type: core.Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'td:not(.nz-disable-td)',
changeDetection: core.ChangeDetectionStrategy.OnPush,
providers: [core$1.NzUpdateHostClassService],
preserveWhitespaces: false,
encapsulation: core.ViewEncapsulation.None,
template: "<span class=\"ant-table-row-indent\" *ngIf=\"nzIndentSize >= 0\" [style.padding-left.px]=\"nzIndentSize\"></span>\n<label *ngIf=\"nzShowCheckbox\"\n nz-checkbox\n [nzDisabled]=\"nzDisabled\"\n [(ngModel)]=\"nzChecked\"\n [nzIndeterminate]=\"nzIndeterminate\"\n (ngModelChange)=\"nzCheckedChange.emit($event)\">\n</label>\n<span *ngIf=\"!nzShowExpand && nzIndentSize >= 0\"\n class=\"ant-table-row-expand-icon ant-table-row-spaced\">\n</span>\n<span *ngIf=\"nzShowExpand\"\n class=\"ant-table-row-expand-icon\"\n [class.ant-table-row-expanded]=\"nzExpand\"\n [class.ant-table-row-collapsed]=\"!nzExpand\"\n (click)=\"expandChange($event)\">\n</span>\n<ng-content></ng-content>",
host: {
'[style.left]': 'nzLeft',
'[style.right]': 'nzRight',
'[style.text-align]': 'nzAlign'
}
}] }
];
/** @nocollapse */
NzTdComponent.ctorParameters = function () {
return [
{ type: core.ElementRef },
{ type: core$1.NzUpdateHostClassService }
];
};
NzTdComponent.propDecorators = {
nzChecked: [{ type: core.Input }],
nzDisabled: [{ type: core.Input }],
nzIndeterminate: [{ type: core.Input }],
nzLeft: [{ type: core.Input }],
nzRight: [{ type: core.Input }],
nzAlign: [{ type: core.Input }],
nzIndentSize: [{ type: core.Input }],
nzExpand: [{ type: core.Input }],
nzShowExpand: [{ type: core.Input }],
nzShowCheckbox: [{ type: core.Input }],
nzCheckedChange: [{ type: core.Output }],
nzExpandChange: [{ type: core.Output }]
};
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTdComponent.prototype, "nzExpand", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTdComponent.prototype, "nzShowExpand", void 0);
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTdComponent.prototype, "nzShowCheckbox", void 0);
return NzTdComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzTheadComponent = /** @class */ (function () {
// tslint:disable-next-line:no-any
function NzTheadComponent(nzTableComponent, elementRef, renderer) {
this.nzTableComponent = nzTableComponent;
this.elementRef = elementRef;
this.renderer = renderer;
this.destroy$ = new rxjs.Subject();
this.nzSingleSort = false;
this.nzSortChange = new core.EventEmitter();
if (this.nzTableComponent) {
this.nzTableComponent.nzTheadComponent = this;
}
}
/**
* @return {?}
*/
NzTheadComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
this.listOfNzThComponent.changes
.pipe(operators.startWith(true), operators.flatMap(( /**
* @return {?}
*/function () {
return rxjs.merge.apply(void 0, __spread(_this.listOfNzThComponent.map(( /**
* @param {?} th
* @return {?}
*/function (th) { return th.nzSortChangeWithKey; }))));
})), operators.takeUntil(this.destroy$))
.subscribe(( /**
* @param {?} data
* @return {?}
*/function (data) {
_this.nzSortChange.emit(data);
if (_this.nzSingleSort) {
_this.listOfNzThComponent.forEach(( /**
* @param {?} th
* @return {?}
*/function (th) {
th.nzSort = th.nzSortKey === data.key ? th.nzSort : null;
th.marForCheck();
}));
}
}));
};
/**
* @return {?}
*/
NzTheadComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.nzTableComponent) {
this.renderer.removeChild(this.renderer.parentNode(this.elementRef.nativeElement), this.elementRef.nativeElement);
}
};
/**
* @return {?}
*/
NzTheadComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy$.next();
this.destroy$.complete();
};
NzTheadComponent.decorators = [
{ type: core.Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'thead:not(.ant-table-thead)',
changeDetection: core.ChangeDetectionStrategy.OnPush,
encapsulation: core.ViewEncapsulation.None,
template: "<ng-template #contentTemplate>\n <ng-content></ng-content>\n</ng-template>\n<ng-container *ngIf=\"!nzTableComponent\">\n <ng-template [ngTemplateOutlet]=\"contentTemplate\"></ng-template>\n</ng-container>"
}] }
];
/** @nocollapse */
NzTheadComponent.ctorParameters = function () {
return [
{ type: NzTableComponent, decorators: [{ type: core.Host }, { type: core.Optional }] },
{ type: core.ElementRef },
{ type: core.Renderer2 }
];
};
NzTheadComponent.propDecorators = {
templateRef: [{ type: core.ViewChild, args: ['contentTemplate',] }],
listOfNzThComponent: [{ type: core.ContentChildren, args: [NzThComponent, { descendants: true },] }],
nzSingleSort: [{ type: core.Input }],
nzSortChange: [{ type: core.Output }]
};
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzTheadComponent.prototype, "nzSingleSort", void 0);
return NzTheadComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzTrDirective = /** @class */ (function () {
function NzTrDirective(elementRef, renderer, nzTableComponent) {
this.elementRef = elementRef;
this.renderer = renderer;
this.nzTableComponent = nzTableComponent;
}
Object.defineProperty(NzTrDirective.prototype, "nzExpand", {
set: /**
* @param {?} value
* @return {?}
*/ function (value) {
if (core$1.toBoolean(value)) {
this.renderer.removeStyle(this.elementRef.nativeElement, 'display');
this.renderer.addClass(this.elementRef.nativeElement, 'ant-table-expanded-row');
}
else {
this.renderer.setStyle(this.elementRef.nativeElement, 'display', 'none');
this.renderer.removeClass(this.elementRef.nativeElement, 'ant-table-expanded-row');
}
},
enumerable: true,
configurable: true
});
NzTrDirective.decorators = [
{ type: core.Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: 'tr',
host: {
'[class.ant-table-row]': 'nzTableComponent'
}
},] }
];
/** @nocollapse */
NzTrDirective.ctorParameters = function () {
return [
{ type: core.ElementRef },
{ type: core.Renderer2 },
{ type: NzTableComponent, decorators: [{ type: core.Host }, { type: core.Optional }] }
];
};
NzTrDirective.propDecorators = {
nzExpand: [{ type: core.Input }]
};
return NzTrDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzTableModule = /** @class */ (function () {
function NzTableModule() {
}
NzTableModule.decorators = [
{ type: core.NgModule, args: [{
declarations: [
NzTableComponent,
NzThComponent,
NzTdComponent,
NzTheadComponent,
NzTbodyDirective,
NzTrDirective,
NzVirtualScrollDirective
],
exports: [
NzTableComponent,
NzThComponent,
NzTdComponent,
NzTheadComponent,
NzTbodyDirective,
NzTrDirective,
NzVirtualScrollDirective
],
imports: [
menu.NzMenuModule,
forms.FormsModule,
core$1.NzAddOnModule,
radio.NzRadioModule,
checkbox.NzCheckboxModule,
dropdown.NzDropDownModule,
common.CommonModule,
pagination.NzPaginationModule,
spin.NzSpinModule,
i18n.NzI18nModule,
icon.NzIconModule,
empty.NzEmptyModule,
scrolling.ScrollingModule
]
},] }
];
return NzTableModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
exports.NzTableComponent = NzTableComponent;
exports.NzTableModule = NzTableModule;
exports.NzTbodyDirective = NzTbodyDirective;
exports.NzTdComponent = NzTdComponent;
exports.NzThComponent = NzThComponent;
exports.NzTheadComponent = NzTheadComponent;
exports.NzTrDirective = NzTrDirective;
exports.NzVirtualScrollDirective = NzVirtualScrollDirective;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctem9ycm8tYW50ZC10YWJsZS51bWQuanMubWFwIiwic291cmNlcyI6WyJub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwibmc6Ly9uZy16b3Jyby1hbnRkL3RhYmxlL256LXRoLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC90YWJsZS9uei12aXJ0dWFsLXNjcm9sbC5kaXJlY3RpdmUudHMiLCJuZzovL25nLXpvcnJvLWFudGQvdGFibGUvbnotdGFibGUuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL3RhYmxlL256LXRib2R5LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC90YWJsZS9uei10ZC5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQvdGFibGUvbnotdGhlYWQuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL3RhYmxlL256LXRyLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC90YWJsZS9uei10YWJsZS5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgaXNOb3ROaWwsIElucHV0Qm9vbGVhbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZSc7XG5pbXBvcnQgeyBOekRyb3BEb3duQ29tcG9uZW50IH0gZnJvbSAnbmctem9ycm8tYW50ZC9kcm9wZG93bic7XG5pbXBvcnQgeyBOekkxOG5JbnRlcmZhY2UsIE56STE4blNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2kxOG4nO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG5leHBvcnQgdHlwZSBOelRoRmlsdGVyVHlwZSA9IEFycmF5PHsgdGV4dDogc3RyaW5nOyB2YWx1ZTogYW55OyBieURlZmF1bHQ/OiBib29sZWFuIH0+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE56VGhJdGVtSW50ZXJmYWNlIHtcbiAgdGV4dDogc3RyaW5nO1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHZhbHVlOiBhbnk7XG4gIGNoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAndGg6bm90KC5uei1kaXNhYmxlLXRoKScsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICcuL256LXRoLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuYW50LXRhYmxlLWNvbHVtbi1oYXMtYWN0aW9uc10nOiAnbnpTaG93RmlsdGVyIHx8IG56U2hvd1NvcnQgfHwgbnpDdXN0b21GaWx0ZXInLFxuICAgICdbY2xhc3MuYW50LXRhYmxlLWNvbHVtbi1oYXMtZmlsdGVyc10nOiAnbnpTaG93RmlsdGVyIHx8IG56Q3VzdG9tRmlsdGVyJyxcbiAgICAnW2NsYXNzLmFudC10YWJsZS1jb2x1bW4taGFzLXNvcnRlcnNdJzogJ256U2hvd1NvcnQnLFxuICAgICdbY2xhc3MuYW50LXRhYmxlLXNlbGVjdGlvbi1jb2x1bW4tY3VzdG9tXSc6ICduelNob3dSb3dTZWxlY3Rpb24nLFxuICAgICdbY2xhc3MuYW50LXRhYmxlLXNlbGVjdGlvbi1jb2x1bW5dJzogJ256U2hvd0NoZWNrYm94JyxcbiAgICAnW2NsYXNzLmFudC10YWJsZS1leHBhbmQtaWNvbi10aF0nOiAnbnpFeHBhbmQnLFxuICAgICdbY2xhc3MuYW50LXRhYmxlLXRoLWxlZnQtc3RpY2t5XSc6ICduekxlZnQnLFxuICAgICdbY2xhc3MuYW50LXRhYmxlLXRoLXJpZ2h0LXN0aWNreV0nOiAnbnpSaWdodCcsXG4gICAgJ1tjbGFzcy5hbnQtdGFibGUtY29sdW1uLXNvcnRdJzogYG56U29ydCA9PT0gJ2Rlc2NlbmQnIHx8IG56U29ydCA9PT0gJ2FzY2VuZCdgLFxuICAgICdbc3R5bGUubGVmdF0nOiAnbnpMZWZ0JyxcbiAgICAnW3N0eWxlLnJpZ2h0XSc6ICduelJpZ2h0JyxcbiAgICAnW3N0eWxlLnRleHQtYWxpZ25dJzogJ256QWxpZ24nXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTnpUaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBoYXNGaWx0ZXJWYWx1ZSA9IGZhbHNlO1xuICBmaWx0ZXJWaXNpYmxlID0gZmFsc2U7XG4gIG11bHRpcGxlRmlsdGVyTGlzdDogTnpUaEl0ZW1JbnRlcmZhY2VbXSA9IFtdO1xuICBzaW5nbGVGaWx0ZXJMaXN0OiBOelRoSXRlbUludGVyZmFjZVtdID0gW107XG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgbG9jYWxlOiBOekkxOG5JbnRlcmZhY2VbJ1RhYmxlJ10gPSB7fSBhcyBOekkxOG5JbnRlcmZhY2VbJ1RhYmxlJ107XG4gIG56V2lkdGhDaGFuZ2UkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgaGFzRGVmYXVsdEZpbHRlciA9IGZhbHNlO1xuICBAVmlld0NoaWxkKE56RHJvcERvd25Db21wb25lbnQpIG56RHJvcERvd25Db21wb25lbnQ6IE56RHJvcERvd25Db21wb25lbnQ7XG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgQElucHV0KCkgbnpTZWxlY3Rpb25zOiBBcnJheTx7IHRleHQ6IHN0cmluZzsgb25TZWxlY3QoLi4uYXJnczogYW55W10pOiBhbnkgfT4gPSBbXTtcbiAgQElucHV0KCkgbnpDaGVja2VkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56RGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgbnpJbmRldGVybWluYXRlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56U29ydEtleTogc3RyaW5nO1xuICBASW5wdXQoKSBuekZpbHRlck11bHRpcGxlID0gdHJ1ZTtcbiAgQElucHV0KCkgbnpXaWR0aDogc3RyaW5nO1xuICBASW5wdXQoKSBuekxlZnQ6IHN0cmluZztcbiAgQElucHV0KCkgbnpSaWdodDogc3RyaW5nO1xuICBASW5wdXQoKSBuekFsaWduOiAnbGVmdCcgfCAncmlnaHQnIHwgJ2NlbnRlcic7XG4gIEBJbnB1dCgpIG56U29ydDogJ2FzY2VuZCcgfCAnZGVzY2VuZCcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpGaWx0ZXJzOiBOelRoRmlsdGVyVHlwZSA9IFtdO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpFeHBhbmQgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd0NoZWNrYm94ID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekN1c3RvbUZpbHRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93U29ydCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93RmlsdGVyID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNob3dSb3dTZWxlY3Rpb24gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q2hlY2tlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56U29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56U29ydENoYW5nZVdpdGhLZXkgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudWxsIH0+KCk7XG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56RmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXSB8IGFueT4oKTtcblxuICB1cGRhdGVTb3J0VmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpTaG93U29ydCkge1xuICAgICAgaWYgKHRoaXMubnpTb3J0ID09PSAnZGVzY2VuZCcpIHtcbiAgICAgICAgdGhpcy5zZXRTb3J0VmFsdWUoJ2FzY2VuZCcpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm56U29ydCA9PT0gJ2FzY2VuZCcpIHtcbiAgICAgICAgdGhpcy5zZXRTb3J0VmFsdWUobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFNvcnRWYWx1ZSgnZGVzY2VuZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFNvcnRWYWx1ZSh2YWx1ZTogJ2FzY2VuZCcgfCAnZGVzY2VuZCcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5uelNvcnQgPSB2YWx1ZTtcbiAgICB0aGlzLm56U29ydENoYW5nZVdpdGhLZXkuZW1pdCh7IGtleTogdGhpcy5uelNvcnRLZXksIHZhbHVlOiB0aGlzLm56U29ydCB9KTtcbiAgICB0aGlzLm56U29ydENoYW5nZS5lbWl0KHRoaXMubnpTb3J0KTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJMaXN0KCk6IE56VGhJdGVtSW50ZXJmYWNlW10ge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGxlRmlsdGVyTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmNoZWNrZWQpLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBnZXQgZmlsdGVyVmFsdWUoKTogYW55IHtcbiAgICBjb25zdCBjaGVja2VkRmlsdGVyID0gdGhpcy5zaW5nbGVGaWx0ZXJMaXN0LmZpbmQoaXRlbSA9PiBpdGVtLmNoZWNrZWQpO1xuICAgIHJldHVybiBjaGVja2VkRmlsdGVyID8gY2hlY2tlZEZpbHRlci52YWx1ZSA6IG51bGw7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJTdGF0dXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpGaWx0ZXJNdWx0aXBsZSkge1xuICAgICAgdGhpcy5oYXNGaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyTGlzdC5sZW5ndGggPiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhc0ZpbHRlclZhbHVlID0gaXNOb3ROaWwodGhpcy5maWx0ZXJWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyU3RhdHVzKCk7XG4gICAgaWYgKHRoaXMubnpGaWx0ZXJNdWx0aXBsZSkge1xuICAgICAgdGhpcy5uekZpbHRlckNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubnpGaWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlclZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRNdWx0aXBsZUZpbHRlckxpc3QodHJ1ZSk7XG4gICAgdGhpcy5pbml0U2luZ2xlRmlsdGVyTGlzdCh0cnVlKTtcbiAgICB0aGlzLmhhc0ZpbHRlclZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBjaGVja011bHRpcGxlKGZpbHRlcjogTnpUaEl0ZW1JbnRlcmZhY2UpOiB2b2lkIHtcbiAgICBmaWx0ZXIuY2hlY2tlZCA9ICFmaWx0ZXIuY2hlY2tlZDtcbiAgfVxuXG4gIGNoZWNrU2luZ2xlKGZpbHRlcjogTnpUaEl0ZW1JbnRlcmZhY2UpOiB2b2lkIHtcbiAgICB0aGlzLnNpbmdsZUZpbHRlckxpc3QuZm9yRWFjaChpdGVtID0+IChpdGVtLmNoZWNrZWQgPSBpdGVtID09PSBmaWx0ZXIpKTtcbiAgfVxuXG4gIGhpZGVEcm9wRG93bigpOiB2b2lkIHtcbiAgICB0aGlzLm56RHJvcERvd25Db21wb25lbnQuc2V0VmlzaWJsZVN0YXRlV2hlbihmYWxzZSk7XG4gICAgdGhpcy5maWx0ZXJWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICBkcm9wRG93blZpc2libGVDaGFuZ2UodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlclZpc2libGUgPSB2YWx1ZTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLnNlYXJjaCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRNdWx0aXBsZUZpbHRlckxpc3QoZm9yY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5tdWx0aXBsZUZpbHRlckxpc3QgPSB0aGlzLm56RmlsdGVycy5tYXAoaXRlbSA9PiB7XG4gICAgICBjb25zdCBjaGVja2VkID0gZm9yY2UgPyBmYWxzZSA6ICEhaXRlbS5ieURlZmF1bHQ7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLmhhc0RlZmF1bHRGaWx0ZXIgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdGV4dDogaXRlbS50ZXh0LCB2YWx1ZTogaXRlbS52YWx1ZSwgY2hlY2tlZCB9O1xuICAgIH0pO1xuICAgIHRoaXMuY2hlY2tEZWZhdWx0RmlsdGVycygpO1xuICB9XG5cbiAgaW5pdFNpbmdsZUZpbHRlckxpc3QoZm9yY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaW5nbGVGaWx0ZXJMaXN0ID0gdGhpcy5uekZpbHRlcnMubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IGZvcmNlID8gZmFsc2UgOiAhIWl0ZW0uYnlEZWZhdWx0O1xuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5oYXNEZWZhdWx0RmlsdGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHRleHQ6IGl0ZW0udGV4dCwgdmFsdWU6IGl0ZW0udmFsdWUsIGNoZWNrZWQgfTtcbiAgICB9KTtcbiAgICB0aGlzLmNoZWNrRGVmYXVsdEZpbHRlcnMoKTtcbiAgfVxuXG4gIGNoZWNrRGVmYXVsdEZpbHRlcnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56RmlsdGVycyB8fCB0aGlzLm56RmlsdGVycy5sZW5ndGggPT09IDAgfHwgIXRoaXMuaGFzRGVmYXVsdEZpbHRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZpbHRlclN0YXR1cygpO1xuICB9XG5cbiAgbWFyRm9yQ2hlY2soKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgaTE4bjogTnpJMThuU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmkxOG4ubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlRGF0YSgnVGFibGUnKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm56RmlsdGVycykge1xuICAgICAgdGhpcy5pbml0TXVsdGlwbGVGaWx0ZXJMaXN0KCk7XG4gICAgICB0aGlzLmluaXRTaW5nbGVGaWx0ZXJMaXN0KCk7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlclN0YXR1cygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5ueldpZHRoKSB7XG4gICAgICB0aGlzLm56V2lkdGhDaGFuZ2UkLm5leHQodGhpcy5ueldpZHRoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuei12aXJ0dWFsLXNjcm9sbF0nLFxuICBleHBvcnRBczogJ256VmlydHVhbFNjcm9sbCdcbn0pXG5leHBvcnQgY2xhc3MgTnpWaXJ0dWFsU2Nyb2xsRGlyZWN0aXZlIHtcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBhbnk7IGluZGV4OiBudW1iZXIgfT4pIHt9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBFTVBUWSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmxhdE1hcCwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IElucHV0Qm9vbGVhbiwgSW5wdXROdW1iZXIsIE56TWVhc3VyZVNjcm9sbGJhclNlcnZpY2UsIE56U2l6ZU1EU1R5cGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUnO1xuaW1wb3J0IHsgTnpJMThuU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5cbmltcG9ydCB7IE56VGhDb21wb25lbnQgfSBmcm9tICcuL256LXRoLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOelRoZWFkQ29tcG9uZW50IH0gZnJvbSAnLi9uei10aGVhZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpWaXJ0dWFsU2Nyb2xsRGlyZWN0aXZlIH0gZnJvbSAnLi9uei12aXJ0dWFsLXNjcm9sbC5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei10YWJsZScsXG4gIGV4cG9ydEFzOiAnbnpUYWJsZScsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGVVcmw6ICcuL256LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuYW50LXRhYmxlLWVtcHR5XSc6ICdkYXRhLmxlbmd0aCA9PT0gMCdcbiAgfSxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgbnotdGFibGUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cblxuICAgICAgY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LmFudC10YWJsZS1ib2R5IHtcbiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgICAgfVxuICAgIGBcbiAgXVxufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbmV4cG9ydCBjbGFzcyBOelRhYmxlQ29tcG9uZW50PFQgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIC8qKiBwdWJsaWMgZGF0YSBmb3IgbmdGb3IgdHIgKi9cbiAgZGF0YTogVFtdID0gW107XG4gIGxvY2FsZTogYW55ID0ge307IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tYW55XG4gIG56VGhlYWRDb21wb25lbnQ6IE56VGhlYWRDb21wb25lbnQ7XG4gIGxhc3RTY3JvbGxMZWZ0ID0gMDtcbiAgaGVhZGVyQm90dG9tU3R5bGUgPSB7fTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIEBDb250ZW50Q2hpbGRyZW4oTnpUaENvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBsaXN0T2ZOelRoQ29tcG9uZW50OiBRdWVyeUxpc3Q8TnpUaENvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlSGVhZGVyRWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSB0YWJsZUhlYWRlckVsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keUVsZW1lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdGFibGVCb2R5RWxlbWVudDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVNYWluRWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSB0YWJsZU1haW5FbGVtZW50OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGNka1ZpcnR1YWxTY3JvbGxFbGVtZW50OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgeyByZWFkOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSlcbiAgY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gIEBDb250ZW50Q2hpbGQoTnpWaXJ0dWFsU2Nyb2xsRGlyZWN0aXZlKSBuelZpcnR1YWxTY3JvbGxEaXJlY3RpdmU6IE56VmlydHVhbFNjcm9sbERpcmVjdGl2ZTtcbiAgQElucHV0KCkgbnpTaXplOiBOelNpemVNRFNUeXBlID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBuelNob3dUb3RhbDogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IG51bWJlcjsgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl0gfT47XG4gIEBJbnB1dCgpIG56UGFnZVNpemVPcHRpb25zID0gWzEwLCAyMCwgMzAsIDQwLCA1MF07XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0TnVtYmVyKCkgbnpWaXJ0dWFsSXRlbVNpemUgPSAwO1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBuelZpcnR1YWxNYXhCdWZmZXJQeCA9IDIwMDtcbiAgQElucHV0KCkgQElucHV0TnVtYmVyKCkgbnpWaXJ0dWFsTWluQnVmZmVyUHggPSAxMDA7XG4gIEBJbnB1dCgpIG56TG9hZGluZ0RlbGF5ID0gMDtcbiAgQElucHV0KCkgbnpMb2FkaW5nSW5kaWNhdG9yOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQElucHV0KCkgbnpUb3RhbCA9IDA7XG4gIEBJbnB1dCgpIG56VGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBuekZvb3Rlcjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIG56Tm9SZXN1bHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBueldpZHRoQ29uZmlnOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBuelBhZ2VJbmRleCA9IDE7XG4gIEBJbnB1dCgpIG56UGFnZVNpemUgPSAxMDtcbiAgQElucHV0KCkgbnpEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgbnpQYWdpbmF0aW9uUG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnYm90aCcgPSAnYm90dG9tJztcbiAgQElucHV0KCkgbnpTY3JvbGw6IHsgeD86IHN0cmluZyB8IG51bGw7IHk/OiBzdHJpbmcgfCBudWxsIH0gPSB7IHg6IG51bGwsIHk6IG51bGwgfTtcbiAgQElucHV0KCkgQFZpZXdDaGlsZCgncmVuZGVySXRlbVRlbXBsYXRlJykgbnpJdGVtUmVuZGVyOiBUZW1wbGF0ZVJlZjx7XG4gICAgJGltcGxpY2l0OiAncGFnZScgfCAncHJldicgfCAnbmV4dCc7XG4gICAgcGFnZTogbnVtYmVyO1xuICB9PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RnJvbnRQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56VGVtcGxhdGVNb2RlID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekJvcmRlcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNob3dQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56TG9hZGluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93U2l6ZUNoYW5nZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56SGlkZU9uU2luZ2xlUGFnZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93UXVpY2tKdW1wZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2ltcGxlID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuelBhZ2VTaXplQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56UGFnZUluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDdXJyZW50UGFnZURhdGFDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZ2V0IHRhYmxlQm9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlQm9keUVsZW1lbnQgJiYgdGhpcy50YWJsZUJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBnZXQgdGFibGVIZWFkZXJOYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUhlYWRlckVsZW1lbnQgJiYgdGhpcy50YWJsZUhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGdldCBjZGtWaXJ0dWFsU2Nyb2xsTmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY2RrVmlydHVhbFNjcm9sbEVsZW1lbnQgJiYgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgZ2V0IG1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlQm9keU5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsTmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGVtaXRQYWdlU2l6ZU9ySW5kZXgoc2l6ZTogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpQYWdlU2l6ZSAhPT0gc2l6ZSB8fCB0aGlzLm56UGFnZUluZGV4ICE9PSBpbmRleCkge1xuICAgICAgaWYgKHRoaXMubnpQYWdlU2l6ZSAhPT0gc2l6ZSkge1xuICAgICAgICB0aGlzLm56UGFnZVNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLm56UGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLm56UGFnZVNpemUpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubnpQYWdlSW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgIHRoaXMubnpQYWdlSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5uelBhZ2VJbmRleENoYW5nZS5lbWl0KHRoaXMubnpQYWdlSW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVGcm9udFBhZ2luYXRpb25EYXRhSWZOZWVkZWQodGhpcy5uelBhZ2VTaXplICE9PSBzaXplKTtcbiAgICB9XG4gIH1cblxuICBzeW5jU2Nyb2xsVGFibGUoZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmN1cnJlbnRUYXJnZXQgPT09IGUudGFyZ2V0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICh0YXJnZXQuc2Nyb2xsTGVmdCAhPT0gdGhpcy5sYXN0U2Nyb2xsTGVmdCAmJiB0aGlzLm56U2Nyb2xsICYmIHRoaXMubnpTY3JvbGwueCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQgJiYgdGhpcy50YWJsZUhlYWRlck5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlSGVhZGVyTmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSB0aGlzLnRhYmxlSGVhZGVyTmF0aXZlRWxlbWVudCAmJiB0aGlzLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U2Nyb2xsUG9zaXRpb25DbGFzc05hbWUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSB0YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICB9XG4gIH1cblxuICBzZXRTY3JvbGxQb3NpdGlvbkNsYXNzTmFtZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50ICYmIHRoaXMubnpTY3JvbGwgJiYgdGhpcy5uelNjcm9sbC54KSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWl4VGFibGVCb2R5TmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aCA9PT0gdGhpcy5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoICYmXG4gICAgICAgIHRoaXMubWl4VGFibGVCb2R5TmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aCAhPT0gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0U2Nyb2xsTmFtZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNldFNjcm9sbE5hbWUoJ2xlZnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMubWl4VGFibGVCb2R5TmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aCA9PT1cbiAgICAgICAgdGhpcy5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgKyB0aGlzLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNldFNjcm9sbE5hbWUoJ3JpZ2h0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFNjcm9sbE5hbWUoJ21pZGRsZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFNjcm9sbE5hbWUocG9zaXRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwcmVmaXggPSAnYW50LXRhYmxlLXNjcm9sbC1wb3NpdGlvbic7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gWydsZWZ0JywgJ3JpZ2h0JywgJ21pZGRsZSddO1xuICAgIGNsYXNzTGlzdC5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLnRhYmxlTWFpbkVsZW1lbnQubmF0aXZlRWxlbWVudCwgYCR7cHJlZml4fS0ke25hbWV9YCk7XG4gICAgfSk7XG4gICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMudGFibGVNYWluRWxlbWVudC5uYXRpdmVFbGVtZW50LCBgJHtwcmVmaXh9LSR7cG9zaXRpb259YCk7XG4gICAgfVxuICB9XG5cbiAgZml0U2Nyb2xsQmFyKCk6IHZvaWQge1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5uek1lYXN1cmVTY3JvbGxiYXJTZXJ2aWNlLnNjcm9sbEJhcldpZHRoO1xuICAgIGlmIChzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgdGhpcy5oZWFkZXJCb3R0b21TdHlsZSA9IHtcbiAgICAgICAgbWFyZ2luQm90dG9tOiBgLSR7c2Nyb2xsYmFyV2lkdGh9cHhgLFxuICAgICAgICBwYWRkaW5nQm90dG9tOiBgMHB4YFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUZyb250UGFnaW5hdGlvbkRhdGFJZk5lZWRlZChpc1BhZ2VTaXplT3JEYXRhQ2hhbmdlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBsZXQgZGF0YTogYW55W10gPSBbXTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1hbnlcbiAgICBpZiAodGhpcy5uekZyb250UGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5uelRvdGFsID0gdGhpcy5uekRhdGEubGVuZ3RoO1xuICAgICAgaWYgKGlzUGFnZVNpemVPckRhdGFDaGFuZ2UpIHtcbiAgICAgICAgY29uc3QgbWF4UGFnZUluZGV4ID0gTWF0aC5jZWlsKHRoaXMubnpEYXRhLmxlbmd0aCAvIHRoaXMubnpQYWdlU2l6ZSkgfHwgMTtcbiAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy5uelBhZ2VJbmRleCA+IG1heFBhZ2VJbmRleCA/IG1heFBhZ2VJbmRleCA6IHRoaXMubnpQYWdlSW5kZXg7XG4gICAgICAgIGlmIChwYWdlSW5kZXggIT09IHRoaXMubnpQYWdlSW5kZXgpIHtcbiAgICAgICAgICB0aGlzLm56UGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5uelBhZ2VJbmRleENoYW5nZS5lbWl0KHBhZ2VJbmRleCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkYXRhID0gdGhpcy5uekRhdGEuc2xpY2UoKHRoaXMubnpQYWdlSW5kZXggLSAxKSAqIHRoaXMubnpQYWdlU2l6ZSwgdGhpcy5uelBhZ2VJbmRleCAqIHRoaXMubnpQYWdlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0aGlzLm56RGF0YTtcbiAgICB9XG4gICAgdGhpcy5kYXRhID0gWy4uLmRhdGFdO1xuICAgIHRoaXMubnpDdXJyZW50UGFnZURhdGFDaGFuZ2UubmV4dCh0aGlzLmRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbnpNZWFzdXJlU2Nyb2xsYmFyU2VydmljZTogTnpNZWFzdXJlU2Nyb2xsYmFyU2VydmljZSxcbiAgICBwcml2YXRlIGkxOG46IE56STE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICApIHtcbiAgICByZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdhbnQtdGFibGUtd3JhcHBlcicpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pMThuLmxvY2FsZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5pMThuLmdldExvY2FsZURhdGEoJ1RhYmxlJyk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5uelNjcm9sbCkge1xuICAgICAgaWYgKGNoYW5nZXMubnpTY3JvbGwuY3VycmVudFZhbHVlKSB7XG4gICAgICAgIHRoaXMubnpTY3JvbGwgPSBjaGFuZ2VzLm56U2Nyb2xsLmN1cnJlbnRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubnpTY3JvbGwgPSB7IHg6IG51bGwsIHk6IG51bGwgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U2Nyb2xsUG9zaXRpb25DbGFzc05hbWUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubnpQYWdlSW5kZXggfHwgY2hhbmdlcy5uelBhZ2VTaXplIHx8IGNoYW5nZXMubnpGcm9udFBhZ2luYXRpb24gfHwgY2hhbmdlcy5uekRhdGEpIHtcbiAgICAgIHRoaXMudXBkYXRlRnJvbnRQYWdpbmF0aW9uRGF0YUlmTmVlZGVkKCEhKGNoYW5nZXMubnpQYWdlU2l6ZSB8fCBjaGFuZ2VzLm56RGF0YSkpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRTY3JvbGxQb3NpdGlvbkNsYXNzTmFtZSgpKTtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBtZXJnZTxNb3VzZUV2ZW50PihcbiAgICAgICAgdGhpcy50YWJsZUhlYWRlck5hdGl2ZUVsZW1lbnQgPyBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy50YWJsZUhlYWRlck5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKSA6IEVNUFRZLFxuICAgICAgICB0aGlzLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQgPyBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50LCAnc2Nyb2xsJykgOiBFTVBUWVxuICAgICAgKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnN5bmNTY3JvbGxUYWJsZShkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICBmcm9tRXZlbnQ8VUlFdmVudD4od2luZG93LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoKHRydWUpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZml0U2Nyb2xsQmFyKCk7XG4gICAgICAgICAgdGhpcy5zZXRTY3JvbGxQb3NpdGlvbkNsYXNzTmFtZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZk56VGhDb21wb25lbnQuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0cnVlKSxcbiAgICAgICAgZmxhdE1hcCgoKSA9PlxuICAgICAgICAgIG1lcmdlKHRoaXMubGlzdE9mTnpUaENvbXBvbmVudC5jaGFuZ2VzLCAuLi50aGlzLmxpc3RPZk56VGhDb21wb25lbnQubWFwKHRoID0+IHRoLm56V2lkdGhDaGFuZ2UkKSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE56VGFibGVDb21wb25lbnQgfSBmcm9tICcuL256LXRhYmxlLmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAndGJvZHknLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5hbnQtdGFibGUtdGJvZHldJzogJ256VGFibGVDb21wb25lbnQnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTnpUYm9keURpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKEBIb3N0KCkgQE9wdGlvbmFsKCkgcHVibGljIG56VGFibGVDb21wb25lbnQ6IE56VGFibGVDb21wb25lbnQpIHt9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBpc05vdE5pbCwgSW5wdXRCb29sZWFuLCBOelVwZGF0ZUhvc3RDbGFzc1NlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ3RkOm5vdCgubnotZGlzYWJsZS10ZCknLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbTnpVcGRhdGVIb3N0Q2xhc3NTZXJ2aWNlXSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiAnLi9uei10ZC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICAnW3N0eWxlLmxlZnRdJzogJ256TGVmdCcsXG4gICAgJ1tzdHlsZS5yaWdodF0nOiAnbnpSaWdodCcsXG4gICAgJ1tzdHlsZS50ZXh0LWFsaWduXSc6ICduekFsaWduJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56VGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBuekNoZWNrZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgbnpEaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBuekluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbnpMZWZ0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56UmlnaHQ6IHN0cmluZztcbiAgQElucHV0KCkgbnpBbGlnbjogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdjZW50ZXInO1xuICBASW5wdXQoKSBuekluZGVudFNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RXhwYW5kID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNob3dFeHBhbmQgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd0NoZWNrYm94ID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekNoZWNrZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekV4cGFuZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBleHBhbmRDaGFuZ2UoZTogRXZlbnQpOiB2b2lkIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubnpFeHBhbmQgPSAhdGhpcy5uekV4cGFuZDtcbiAgICB0aGlzLm56RXhwYW5kQ2hhbmdlLmVtaXQodGhpcy5uekV4cGFuZCk7XG4gIH1cblxuICBzZXRDbGFzc01hcCgpOiB2b2lkIHtcbiAgICB0aGlzLm56VXBkYXRlSG9zdENsYXNzU2VydmljZS51cGRhdGVIb3N0Q2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIFtgYW50LXRhYmxlLXJvdy1leHBhbmQtaWNvbi1jZWxsYF06IHRoaXMubnpTaG93RXhwYW5kICYmICFpc05vdE5pbCh0aGlzLm56SW5kZW50U2l6ZSksXG4gICAgICBbYGFudC10YWJsZS1zZWxlY3Rpb24tY29sdW1uYF06IHRoaXMubnpTaG93Q2hlY2tib3gsXG4gICAgICBbYGFudC10YWJsZS10ZC1sZWZ0LXN0aWNreWBdOiBpc05vdE5pbCh0aGlzLm56TGVmdCksXG4gICAgICBbYGFudC10YWJsZS10ZC1yaWdodC1zdGlja3lgXTogaXNOb3ROaWwodGhpcy5uelJpZ2h0KVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIG56VXBkYXRlSG9zdENsYXNzU2VydmljZTogTnpVcGRhdGVIb3N0Q2xhc3NTZXJ2aWNlKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5uekluZGVudFNpemUgfHwgY2hhbmdlcy5uelNob3dFeHBhbmQgfHwgY2hhbmdlcy5uelNob3dDaGVja2JveCB8fCBjaGFuZ2VzLm56UmlnaHQgfHwgY2hhbmdlcy5uekxlZnQpIHtcbiAgICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZsYXRNYXAsIHN0YXJ0V2l0aCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUnO1xuXG5pbXBvcnQgeyBOelRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9uei10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpUaENvbXBvbmVudCB9IGZyb20gJy4vbnotdGguY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICd0aGVhZDpub3QoLmFudC10YWJsZS10aGVhZCknLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGVVcmw6ICcuL256LXRoZWFkLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBOelRoZWFkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRUZW1wbGF0ZScpIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQENvbnRlbnRDaGlsZHJlbihOelRoQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGxpc3RPZk56VGhDb21wb25lbnQ6IFF1ZXJ5TGlzdDxOelRoQ29tcG9uZW50PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2luZ2xlU29ydCA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpTb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KCk7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdHJ1Y3RvcihcbiAgICBASG9zdCgpIEBPcHRpb25hbCgpIHB1YmxpYyBuelRhYmxlQ29tcG9uZW50OiBOelRhYmxlQ29tcG9uZW50LFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7XG4gICAgaWYgKHRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50Lm56VGhlYWRDb21wb25lbnQgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZk56VGhDb21wb25lbnQuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0cnVlKSxcbiAgICAgICAgZmxhdE1hcCgoKSA9PiBtZXJnZSguLi50aGlzLmxpc3RPZk56VGhDb21wb25lbnQubWFwKHRoID0+IHRoLm56U29ydENoYW5nZVdpdGhLZXkpKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIHRoaXMubnpTb3J0Q2hhbmdlLmVtaXQoZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLm56U2luZ2xlU29ydCkge1xuICAgICAgICAgIHRoaXMubGlzdE9mTnpUaENvbXBvbmVudC5mb3JFYWNoKHRoID0+IHtcbiAgICAgICAgICAgIHRoLm56U29ydCA9IHRoLm56U29ydEtleSA9PT0gZGF0YS5rZXkgPyB0aC5uelNvcnQgOiBudWxsO1xuICAgICAgICAgICAgdGgubWFyRm9yQ2hlY2soKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0LCBJbnB1dCwgT3B0aW9uYWwsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlJztcbmltcG9ydCB7IE56VGFibGVDb21wb25lbnQgfSBmcm9tICcuL256LXRhYmxlLmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAndHInLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5hbnQtdGFibGUtcm93XSc6ICduelRhYmxlQ29tcG9uZW50J1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56VHJEaXJlY3RpdmUge1xuICBASW5wdXQoKVxuICBzZXQgbnpFeHBhbmQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodG9Cb29sZWFuKHZhbHVlKSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdhbnQtdGFibGUtZXhwYW5kZWQtcm93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdhbnQtdGFibGUtZXhwYW5kZWQtcm93Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBASG9zdCgpIEBPcHRpb25hbCgpIHB1YmxpYyBuelRhYmxlQ29tcG9uZW50OiBOelRhYmxlQ29tcG9uZW50XG4gICkge31cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE56Q2hlY2tib3hNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NoZWNrYm94JztcbmltcG9ydCB7IE56QWRkT25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUnO1xuaW1wb3J0IHsgTnpEcm9wRG93bk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZHJvcGRvd24nO1xuaW1wb3J0IHsgTnpFbXB0eU1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZW1wdHknO1xuaW1wb3J0IHsgTnpJMThuTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pMThuJztcbmltcG9ydCB7IE56SWNvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaWNvbic7XG5pbXBvcnQgeyBOek1lbnVNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL21lbnUnO1xuaW1wb3J0IHsgTnpQYWdpbmF0aW9uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9wYWdpbmF0aW9uJztcbmltcG9ydCB7IE56UmFkaW9Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL3JhZGlvJztcbmltcG9ydCB7IE56U3Bpbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvc3Bpbic7XG5cbmltcG9ydCB7IE56VGFibGVDb21wb25lbnQgfSBmcm9tICcuL256LXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOelRib2R5RGlyZWN0aXZlIH0gZnJvbSAnLi9uei10Ym9keS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnpUZENvbXBvbmVudCB9IGZyb20gJy4vbnotdGQuY29tcG9uZW50JztcbmltcG9ydCB7IE56VGhDb21wb25lbnQgfSBmcm9tICcuL256LXRoLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOelRoZWFkQ29tcG9uZW50IH0gZnJvbSAnLi9uei10aGVhZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpUckRpcmVjdGl2ZSB9IGZyb20gJy4vbnotdHIuZGlyZWN0aXZlJztcbmltcG9ydCB7IE56VmlydHVhbFNjcm9sbERpcmVjdGl2ZSB9IGZyb20gJy4vbnotdmlydHVhbC1zY3JvbGwuZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgTnpUYWJsZUNvbXBvbmVudCxcbiAgICBOelRoQ29tcG9uZW50LFxuICAgIE56VGRDb21wb25lbnQsXG4gICAgTnpUaGVhZENvbXBvbmVudCxcbiAgICBOelRib2R5RGlyZWN0aXZlLFxuICAgIE56VHJEaXJlY3RpdmUsXG4gICAgTnpWaXJ0dWFsU2Nyb2xsRGlyZWN0aXZlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBOelRhYmxlQ29tcG9uZW50LFxuICAgIE56VGhDb21wb25lbnQsXG4gICAgTnpUZENvbXBvbmVudCxcbiAgICBOelRoZWFkQ29tcG9uZW50LFxuICAgIE56VGJvZHlEaXJlY3RpdmUsXG4gICAgTnpUckRpcmVjdGl2ZSxcbiAgICBOelZpcnR1YWxTY3JvbGxEaXJlY3RpdmVcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIE56TWVudU1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOekFkZE9uTW9kdWxlLFxuICAgIE56UmFkaW9Nb2R1bGUsXG4gICAgTnpDaGVja2JveE1vZHVsZSxcbiAgICBOekRyb3BEb3duTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBOelBhZ2luYXRpb25Nb2R1bGUsXG4gICAgTnpTcGluTW9kdWxlLFxuICAgIE56STE4bk1vZHVsZSxcbiAgICBOekljb25Nb2R1bGUsXG4gICAgTnpFbXB0eU1vZHVsZSxcbiAgICBTY3JvbGxpbmdNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOelRhYmxlTW9kdWxlIHt9XG4iXSwibmFtZXMiOlsiaTE4biIsIlN1YmplY3QiLCJFdmVudEVtaXR0ZXIiLCJpc05vdE5pbCIsInRha2VVbnRpbCIsIkNvbXBvbmVudCIsIlZpZXdFbmNhcHN1bGF0aW9uIiwiQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kiLCJDaGFuZ2VEZXRlY3RvclJlZiIsIk56STE4blNlcnZpY2UiLCJWaWV3Q2hpbGQiLCJOekRyb3BEb3duQ29tcG9uZW50IiwiSW5wdXQiLCJPdXRwdXQiLCJ0c2xpYl8xLl9fZGVjb3JhdGUiLCJJbnB1dEJvb2xlYW4iLCJEaXJlY3RpdmUiLCJUZW1wbGF0ZVJlZiIsInBsYXRmb3JtIiwibWVyZ2UiLCJmcm9tRXZlbnQiLCJFTVBUWSIsInN0YXJ0V2l0aCIsImZsYXRNYXAiLCJSZW5kZXJlcjIiLCJOZ1pvbmUiLCJOek1lYXN1cmVTY3JvbGxiYXJTZXJ2aWNlIiwiUGxhdGZvcm0iLCJFbGVtZW50UmVmIiwiQ29udGVudENoaWxkcmVuIiwiQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IiwiQ29udGVudENoaWxkIiwiSW5wdXROdW1iZXIiLCJIb3N0IiwiT3B0aW9uYWwiLCJOelVwZGF0ZUhvc3RDbGFzc1NlcnZpY2UiLCJ0b0Jvb2xlYW4iLCJOZ01vZHVsZSIsIk56TWVudU1vZHVsZSIsIkZvcm1zTW9kdWxlIiwiTnpBZGRPbk1vZHVsZSIsIk56UmFkaW9Nb2R1bGUiLCJOekNoZWNrYm94TW9kdWxlIiwiTnpEcm9wRG93bk1vZHVsZSIsIkNvbW1vbk1vZHVsZSIsIk56UGFnaW5hdGlvbk1vZHVsZSIsIk56U3Bpbk1vZHVsZSIsIk56STE4bk1vZHVsZSIsIk56SWNvbk1vZHVsZSIsIk56RW1wdHlNb2R1bGUiLCJTY3JvbGxpbmdNb2R1bGUiXSwibWFwcGlu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