ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
646 lines • 51.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, EventEmitter, Host, Input, Optional, Output, SkipSelf, TemplateRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ReplaySubject, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { NzNoAnimationDirective } from '../core/no-animation/nz-no-animation.directive';
import { isNotNil } from '../core/util/check';
import { InputBoolean } from '../core/util/convert';
import { NzTreeSelectService } from '../tree-select/nz-tree-select.service';
import { NzTreeBaseService } from './nz-tree-base.service';
import { NzTreeNode } from './nz-tree-node';
import { NzTreeService } from './nz-tree.service';
/**
* @param {?} treeSelectService
* @param {?} treeService
* @return {?}
*/
export function NzTreeServiceFactory(treeSelectService, treeService) {
return treeSelectService ? treeSelectService : treeService;
}
export class NzTreeComponent {
/**
* @param {?} nzTreeService
* @param {?} cdr
* @param {?=} noAnimation
*/
constructor(nzTreeService, cdr, noAnimation) {
this.nzTreeService = nzTreeService;
this.cdr = cdr;
this.noAnimation = noAnimation;
this.nzShowIcon = false;
this.nzShowLine = false;
this.nzCheckStrictly = false;
this.nzCheckable = false;
this.nzShowExpand = true;
this.nzAsyncData = false;
this.nzDraggable = false;
this.nzExpandAll = false;
this.nzHideUnMatched = false;
this.nzSelectMode = false;
/**
* @deprecated use
* nzExpandAll instead
*/
this.nzDefaultExpandAll = false;
// model bind
this.nzExpandedKeysChange = new EventEmitter();
this.nzSelectedKeysChange = new EventEmitter();
this.nzCheckedKeysChange = new EventEmitter();
this.nzSearchValueChange = new EventEmitter();
/**
* @deprecated use
* nzSearchValueChange instead
*/
this.nzOnSearchNode = new EventEmitter();
this.nzClick = new EventEmitter();
this.nzDblClick = new EventEmitter();
this.nzContextMenu = new EventEmitter();
this.nzCheckBoxChange = new EventEmitter();
this.nzExpandChange = new EventEmitter();
this.nzOnDragStart = new EventEmitter();
this.nzOnDragEnter = new EventEmitter();
this.nzOnDragOver = new EventEmitter();
this.nzOnDragLeave = new EventEmitter();
this.nzOnDrop = new EventEmitter();
this.nzOnDragEnd = new EventEmitter();
this._searchValue = null;
this._nzMultiple = false;
this.nzDefaultSubject = new ReplaySubject(6);
this.destroy$ = new Subject();
this.nzNodes = [];
this.prefixCls = 'ant-tree';
this.classMap = {};
this.onChange = (/**
* @return {?}
*/
() => null);
this.onTouched = (/**
* @return {?}
*/
() => null);
}
/**
* @param {?} value
* @return {?}
*/
set nzMultiple(value) {
this._nzMultiple = value;
this.nzTreeService.isMultiple = value;
}
/**
* @return {?}
*/
get nzMultiple() {
return this._nzMultiple;
}
/**
* @param {?} value
* @return {?}
*/
set nzData(value) {
if (Array.isArray(value)) {
if (!this.nzTreeService.isArrayOfNzTreeNode(value)) {
// has not been new NzTreeNode
this.nzNodes = value.map((/**
* @param {?} item
* @return {?}
*/
item => (new NzTreeNode(item, null, this.nzTreeService))));
}
else {
this.nzNodes = value.map((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.service = this.nzTreeService;
return item;
}));
}
this.nzTreeService.isCheckStrictly = this.nzCheckStrictly;
this.nzTreeService.isMultiple = this.nzMultiple;
this.nzTreeService.initTree(this.nzNodes);
}
else {
if (value !== null) {
console.warn('ngModel only accepts an array and must be not empty');
}
}
}
/**
* @deprecated use
* nzExpandedKeys instead
* @param {?} value
* @return {?}
*/
set nzDefaultExpandedKeys(value) {
this.nzDefaultSubject.next({ type: 'nzExpandedKeys', keys: value });
}
/**
* @deprecated use
* nzSelectedKeys instead
* @param {?} value
* @return {?}
*/
set nzDefaultSelectedKeys(value) {
this.nzDefaultSubject.next({ type: 'nzSelectedKeys', keys: value });
}
/**
* @deprecated use
* nzCheckedKeys instead
* @param {?} value
* @return {?}
*/
set nzDefaultCheckedKeys(value) {
this.nzDefaultSubject.next({ type: 'nzCheckedKeys', keys: value });
}
/**
* @param {?} value
* @return {?}
*/
set nzExpandedKeys(value) {
this.nzDefaultSubject.next({ type: 'nzExpandedKeys', keys: value });
}
/**
* @param {?} value
* @return {?}
*/
set nzSelectedKeys(value) {
this.nzDefaultSubject.next({ type: 'nzSelectedKeys', keys: value });
}
/**
* @param {?} value
* @return {?}
*/
set nzCheckedKeys(value) {
this.nzDefaultSubject.next({ type: 'nzCheckedKeys', keys: value });
}
/**
* @param {?} value
* @return {?}
*/
set nzSearchValue(value) {
this._searchValue = value;
this.nzTreeService.searchExpand(value);
if (isNotNil(value)) {
this.nzSearchValueChange.emit(this.nzTreeService.formatEvent('search', null, null));
this.nzOnSearchNode.emit(this.nzTreeService.formatEvent('search', null, null));
}
}
/**
* @return {?}
*/
get nzSearchValue() {
return this._searchValue;
}
/**
* @return {?}
*/
getTreeNodes() {
return this.nzTreeService.rootNodes;
}
/**
* @param {?} key
* @return {?}
*/
getTreeNodeByKey(key) {
/** @type {?} */
let targetNode = null;
/** @type {?} */
const getNode = (/**
* @param {?} node
* @return {?}
*/
(node) => {
if (node.key === key) {
targetNode = node;
// break every
return false;
}
else {
node.getChildren().every((/**
* @param {?} n
* @return {?}
*/
n => {
return getNode(n);
}));
}
return true;
});
this.nzNodes.every((/**
* @param {?} n
* @return {?}
*/
n => {
return getNode(n);
}));
return targetNode;
}
/**
* public function
* @return {?}
*/
getCheckedNodeList() {
return this.nzTreeService.getCheckedNodeList();
}
/**
* @return {?}
*/
getSelectedNodeList() {
return this.nzTreeService.getSelectedNodeList();
}
/**
* @return {?}
*/
getHalfCheckedNodeList() {
return this.nzTreeService.getHalfCheckedNodeList();
}
/**
* @return {?}
*/
getExpandedNodeList() {
return this.nzTreeService.getExpandedNodeList();
}
/**
* @return {?}
*/
getMatchedNodeList() {
return this.nzTreeService.getMatchedNodeList();
}
/**
* @return {?}
*/
setClassMap() {
this.classMap = {
[this.prefixCls]: true,
[this.prefixCls + '-show-line']: this.nzShowLine,
[`${this.prefixCls}-icon-hide`]: !this.nzShowIcon,
['draggable-tree']: this.nzDraggable,
['ant-select-tree']: this.nzSelectMode
};
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (Array.isArray(value)) {
this.nzNodes = value.map((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.service = this.nzTreeService;
return item;
}));
this.nzTreeService.isCheckStrictly = this.nzCheckStrictly;
this.nzTreeService.isMultiple = this.nzMultiple;
this.nzTreeService.initTree(this.nzNodes);
this.cdr.markForCheck();
}
else {
if (value !== null) {
console.warn('ngModel only accepts an array and should be not empty');
}
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @return {?}
*/
ngOnInit() {
this.setClassMap();
this.nzDefaultSubscription = this.nzDefaultSubject.subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
if (!data || !data.keys) {
return;
}
switch (data.type) {
case 'nzExpandedKeys':
this.nzTreeService.calcExpandedKeys(data.keys, this.nzNodes);
this.nzExpandedKeysChange.emit(data.keys);
break;
case 'nzSelectedKeys':
this.nzTreeService.calcSelectedKeys(data.keys, this.nzNodes, this.nzMultiple);
this.nzSelectedKeysChange.emit(data.keys);
break;
case 'nzCheckedKeys':
this.nzTreeService.calcCheckedKeys(data.keys, this.nzNodes, this.nzCheckStrictly);
this.nzCheckedKeysChange.emit(data.keys);
break;
}
this.cdr.markForCheck();
}));
this.nzTreeService.eventTriggerChanged().pipe(takeUntil(this.destroy$)).subscribe((/**
* @param {?} data
* @return {?}
*/
data => {
switch (data.eventName) {
case 'expand':
this.nzExpandChange.emit(data);
break;
case 'click':
this.nzClick.emit(data);
break;
case 'check':
this.nzCheckBoxChange.emit(data);
break;
case 'dblclick':
this.nzDblClick.emit(data);
break;
case 'contextmenu':
this.nzContextMenu.emit(data);
break;
// drag drop
case 'dragstart':
this.nzOnDragStart.emit(data);
break;
case 'dragenter':
this.nzOnDragEnter.emit(data);
break;
case 'dragover':
this.nzOnDragOver.emit(data);
break;
case 'dragleave':
this.nzOnDragLeave.emit(data);
break;
case 'drop':
this.nzOnDrop.emit(data);
break;
case 'dragend':
this.nzOnDragEnd.emit(data);
break;
}
}));
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.nzCheckStrictly) {
this.nzTreeService.isCheckStrictly = changes.nzCheckStrictly.currentValue;
}
if (changes.nzMultiple) {
this.nzTreeService.isMultiple = changes.nzMultiple.currentValue;
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
this.destroy$ = null;
if (this.nzDefaultSubscription) {
this.nzDefaultSubscription.unsubscribe();
this.nzDefaultSubscription = null;
}
}
}
NzTreeComponent.decorators = [
{ type: Component, args: [{
selector: 'nz-tree',
template: "<ul\n role=\"tree\"\n unselectable=\"on\"\n [ngClass]=\"classMap\">\n <ng-container *ngFor=\"let node of nzNodes\">\n <nz-tree-node\n [nzTreeNode]=\"node\"\n [nzSelectMode]=\"nzSelectMode\"\n [nzShowLine]=\"nzShowLine\"\n [nzDraggable]=\"nzDraggable\"\n [nzCheckable]=\"nzCheckable\"\n [nzShowExpand]=\"nzShowExpand\"\n [nzAsyncData]=\"nzAsyncData\"\n [nzSearchValue]=\"nzSearchValue\"\n [nzHideUnMatched]=\"nzHideUnMatched\"\n [nzBeforeDrop]=\"nzBeforeDrop\"\n [nzCheckStrictly]=\"nzCheckStrictly\"\n [nzExpandAll]=\"nzExpandAll\"\n [nzDefaultExpandAll]=\"nzDefaultExpandAll\"\n [nzShowIcon]=\"nzShowIcon\"\n [nzTreeTemplate]=\"nzTreeTemplate\"\n [nzNoAnimation]=\"noAnimation?.nzNoAnimation\">\n </nz-tree-node>\n </ng-container>\n</ul>",
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
NzTreeService,
{
provide: NzTreeBaseService,
useFactory: NzTreeServiceFactory,
deps: [
[
new SkipSelf(),
new Optional(),
NzTreeSelectService
],
NzTreeService
]
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => NzTreeComponent)),
multi: true
}
]
}] }
];
/** @nocollapse */
NzTreeComponent.ctorParameters = () => [
{ type: NzTreeBaseService },
{ type: ChangeDetectorRef },
{ type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] }
];
NzTreeComponent.propDecorators = {
nzShowIcon: [{ type: Input }],
nzShowLine: [{ type: Input }],
nzCheckStrictly: [{ type: Input }],
nzCheckable: [{ type: Input }],
nzShowExpand: [{ type: Input }],
nzAsyncData: [{ type: Input }],
nzDraggable: [{ type: Input }],
nzExpandAll: [{ type: Input }],
nzHideUnMatched: [{ type: Input }],
nzSelectMode: [{ type: Input }],
nzDefaultExpandAll: [{ type: Input }],
nzBeforeDrop: [{ type: Input }],
nzMultiple: [{ type: Input }],
nzData: [{ type: Input }],
nzDefaultExpandedKeys: [{ type: Input }],
nzDefaultSelectedKeys: [{ type: Input }],
nzDefaultCheckedKeys: [{ type: Input }],
nzExpandedKeys: [{ type: Input }],
nzSelectedKeys: [{ type: Input }],
nzCheckedKeys: [{ type: Input }],
nzSearchValue: [{ type: Input }],
nzExpandedKeysChange: [{ type: Output }],
nzSelectedKeysChange: [{ type: Output }],
nzCheckedKeysChange: [{ type: Output }],
nzSearchValueChange: [{ type: Output }],
nzOnSearchNode: [{ type: Output }],
nzClick: [{ type: Output }],
nzDblClick: [{ type: Output }],
nzContextMenu: [{ type: Output }],
nzCheckBoxChange: [{ type: Output }],
nzExpandChange: [{ type: Output }],
nzOnDragStart: [{ type: Output }],
nzOnDragEnter: [{ type: Output }],
nzOnDragOver: [{ type: Output }],
nzOnDragLeave: [{ type: Output }],
nzOnDrop: [{ type: Output }],
nzOnDragEnd: [{ type: Output }],
nzTreeTemplate: [{ type: ContentChild, args: ['nzTreeTemplate',] }]
};
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzShowIcon", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzShowLine", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzCheckStrictly", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzCheckable", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzShowExpand", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzAsyncData", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzDraggable", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzExpandAll", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzHideUnMatched", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzSelectMode", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Object)
], NzTreeComponent.prototype, "nzDefaultExpandAll", void 0);
tslib_1.__decorate([
InputBoolean(),
tslib_1.__metadata("design:type", Boolean),
tslib_1.__metadata("design:paramtypes", [Boolean])
], NzTreeComponent.prototype, "nzMultiple", null);
if (false) {
/** @type {?} */
NzTreeComponent.prototype.nzShowIcon;
/** @type {?} */
NzTreeComponent.prototype.nzShowLine;
/** @type {?} */
NzTreeComponent.prototype.nzCheckStrictly;
/** @type {?} */
NzTreeComponent.prototype.nzCheckable;
/** @type {?} */
NzTreeComponent.prototype.nzShowExpand;
/** @type {?} */
NzTreeComponent.prototype.nzAsyncData;
/** @type {?} */
NzTreeComponent.prototype.nzDraggable;
/** @type {?} */
NzTreeComponent.prototype.nzExpandAll;
/** @type {?} */
NzTreeComponent.prototype.nzHideUnMatched;
/** @type {?} */
NzTreeComponent.prototype.nzSelectMode;
/**
* @deprecated use
* nzExpandAll instead
* @type {?}
*/
NzTreeComponent.prototype.nzDefaultExpandAll;
/** @type {?} */
NzTreeComponent.prototype.nzBeforeDrop;
/** @type {?} */
NzTreeComponent.prototype.nzExpandedKeysChange;
/** @type {?} */
NzTreeComponent.prototype.nzSelectedKeysChange;
/** @type {?} */
NzTreeComponent.prototype.nzCheckedKeysChange;
/** @type {?} */
NzTreeComponent.prototype.nzSearchValueChange;
/**
* @deprecated use
* nzSearchValueChange instead
* @type {?}
*/
NzTreeComponent.prototype.nzOnSearchNode;
/** @type {?} */
NzTreeComponent.prototype.nzClick;
/** @type {?} */
NzTreeComponent.prototype.nzDblClick;
/** @type {?} */
NzTreeComponent.prototype.nzContextMenu;
/** @type {?} */
NzTreeComponent.prototype.nzCheckBoxChange;
/** @type {?} */
NzTreeComponent.prototype.nzExpandChange;
/** @type {?} */
NzTreeComponent.prototype.nzOnDragStart;
/** @type {?} */
NzTreeComponent.prototype.nzOnDragEnter;
/** @type {?} */
NzTreeComponent.prototype.nzOnDragOver;
/** @type {?} */
NzTreeComponent.prototype.nzOnDragLeave;
/** @type {?} */
NzTreeComponent.prototype.nzOnDrop;
/** @type {?} */
NzTreeComponent.prototype.nzOnDragEnd;
/** @type {?} */
NzTreeComponent.prototype.nzTreeTemplate;
/** @type {?} */
NzTreeComponent.prototype._searchValue;
/** @type {?} */
NzTreeComponent.prototype._nzMultiple;
/** @type {?} */
NzTreeComponent.prototype.nzDefaultSubject;
/** @type {?} */
NzTreeComponent.prototype.nzDefaultSubscription;
/** @type {?} */
NzTreeComponent.prototype.destroy$;
/** @type {?} */
NzTreeComponent.prototype.nzNodes;
/** @type {?} */
NzTreeComponent.prototype.prefixCls;
/** @type {?} */
NzTreeComponent.prototype.classMap;
/** @type {?} */
NzTreeComponent.prototype.onChange;
/** @type {?} */
NzTreeComponent.prototype.onTouched;
/** @type {?} */
NzTreeComponent.prototype.nzTreeService;
/**
* @type {?}
* @private
*/
NzTreeComponent.prototype.cdr;
/** @type {?} */
NzTreeComponent.prototype.noAnimation;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLyIsInNvdXJjZXMiOlsidHJlZS9uei10cmVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixJQUFJLEVBQ0osS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sUUFBUSxFQUNSLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7OztBQUVsRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsaUJBQXNDLEVBQUUsV0FBMEI7SUFDckcsT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztBQUM3RCxDQUFDO0FBNEJELE1BQU0sT0FBTyxlQUFlOzs7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RTs7b0RBQXFCO0FBQ3BCO0lBQWYsWUFBWSxFQUFFOztvREFBcUI7QUFDcEI7SUFBZixZQUFZLEVBQUU7O29EQUFxQjtBQUNwQjtJQUFmLFlBQVksRUFBRTs7d0RBQXlCO0FBQ3hCO0lBQWYsWUFBWSxFQUFFOztxREFBc0I7QUFLckI7SUFBZixZQUFZLEVBQUU7OzJEQUE0QjtBQUlwRDtJQURVLFlBQVksRUFBRTs7O2lEQUl2Qjs7O0lBckJELHFDQUE0Qzs7SUFDNUMscUNBQTRDOztJQUM1QywwQ0FBaUQ7O0lBQ2pELHNDQUE2Qzs7SUFDN0MsdUNBQTZDOztJQUM3QyxzQ0FBNkM7O0lBQzdDLHNDQUE2Qzs7SUFDN0Msc0NBQTZDOztJQUM3QywwQ0FBaUQ7O0lBQ2pELHVDQUE4Qzs7Ozs7O0lBSzlDLDZDQUFvRDs7SUFDcEQsdUNBQWlGOztJQTRGakYsK0NBQStGOztJQUMvRiwrQ0FBK0Y7O0lBQy9GLDhDQUE4Rjs7SUFFOUYsOENBQTZGOzs7Ozs7SUFLN0YseUNBQXdGOztJQUV4RixrQ0FBaUY7O0lBQ2pGLHFDQUFvRjs7SUFDcEYsd0NBQXVGOztJQUN2RiwyQ0FBMEY7O0lBQzFGLHlDQUF3Rjs7SUFFeEYsd0NBQXVGOztJQUN2Rix3Q0FBdUY7O0lBQ3ZGLHVDQUFzRjs7SUFDdEYsd0NBQXVGOztJQUN2RixtQ0FBa0Y7O0lBQ2xGLHNDQUFxRjs7SUFFckYseUNBQWlFOztJQUNqRSx1Q0FBb0I7O0lBQ3BCLHNDQUE2Qjs7SUFDN0IsMkNBQTBFOztJQUMxRSxnREFBb0M7O0lBQ3BDLG1DQUF5Qjs7SUFDekIsa0NBQTJCOztJQUMzQixvQ0FBdUI7O0lBQ3ZCLG1DQUFjOztJQUVkLG1DQUFxRDs7SUFDckQsb0NBQW1DOztJQXFGakMsd0NBQXVDOzs7OztJQUN2Qyw4QkFBOEI7O0lBQzlCLHNDQUErRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGZvcndhcmRSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZSxcbiAgU2tpcFNlbGYsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOek5vQW5pbWF0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vY29yZS9uby1hbmltYXRpb24vbnotbm8tYW5pbWF0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBpc05vdE5pbCB9IGZyb20gJy4uL2NvcmUvdXRpbC9jaGVjayc7XG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4gfSBmcm9tICcuLi9jb3JlL3V0aWwvY29udmVydCc7XG5pbXBvcnQgeyBOelRyZWVTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi4vdHJlZS1zZWxlY3QvbnotdHJlZS1zZWxlY3Quc2VydmljZSc7XG5pbXBvcnQgeyBOekZvcm1hdEJlZm9yZURyb3BFdmVudCwgTnpGb3JtYXRFbWl0RXZlbnQgfSBmcm9tICcuLi90cmVlL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBOelRyZWVCYXNlU2VydmljZSB9IGZyb20gJy4vbnotdHJlZS1iYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnpUcmVlTm9kZSB9IGZyb20gJy4vbnotdHJlZS1ub2RlJztcbmltcG9ydCB7IE56VHJlZVNlcnZpY2UgfSBmcm9tICcuL256LXRyZWUuc2VydmljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBOelRyZWVTZXJ2aWNlRmFjdG9yeSh0cmVlU2VsZWN0U2VydmljZTogTnpUcmVlU2VsZWN0U2VydmljZSwgdHJlZVNlcnZpY2U6IE56VHJlZVNlcnZpY2UpOiBOelRyZWVCYXNlU2VydmljZSB7XG4gIHJldHVybiB0cmVlU2VsZWN0U2VydmljZSA/IHRyZWVTZWxlY3RTZXJ2aWNlIDogdHJlZVNlcnZpY2U7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvciAgICAgICA6ICduei10cmVlJyxcbiAgdGVtcGxhdGVVcmwgICAgOiAnLi9uei10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVycyAgICAgIDogW1xuICAgIE56VHJlZVNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZSAgIDogTnpUcmVlQmFzZVNlcnZpY2UsXG4gICAgICB1c2VGYWN0b3J5OiBOelRyZWVTZXJ2aWNlRmFjdG9yeSxcbiAgICAgIGRlcHMgICAgICA6IFtcbiAgICAgICAgW1xuICAgICAgICAgIG5ldyBTa2lwU2VsZigpLFxuICAgICAgICAgIG5ldyBPcHRpb25hbCgpLFxuICAgICAgICAgIE56VHJlZVNlbGVjdFNlcnZpY2VcbiAgICAgICAgXSxcbiAgICAgICAgTnpUcmVlU2VydmljZVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZSAgICA6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnpUcmVlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpICAgICAgOiB0cnVlXG4gICAgfVxuICBdXG59KVxuXG5leHBvcnQgY2xhc3MgTnpUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93SWNvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93TGluZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDaGVja1N0cmljdGx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekNoZWNrYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93RXhwYW5kID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56QXN5bmNEYXRhID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekRyYWdnYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpFeHBhbmRBbGwgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56SGlkZVVuTWF0Y2hlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTZWxlY3RNb2RlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2VcbiAgICogbnpFeHBhbmRBbGwgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RGVmYXVsdEV4cGFuZEFsbCA9IGZhbHNlO1xuICBASW5wdXQoKSBuekJlZm9yZURyb3A6IChjb25maXJtOiBOekZvcm1hdEJlZm9yZURyb3BFdmVudCkgPT4gT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcbiAgc2V0IG56TXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9uek11bHRpcGxlID0gdmFsdWU7XG4gICAgdGhpcy5uelRyZWVTZXJ2aWNlLmlzTXVsdGlwbGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBuek11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9uek11bHRpcGxlO1xuICB9XG5cbiAgQElucHV0KClcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBzZXQgbnpEYXRhKHZhbHVlOiBhbnlbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKCF0aGlzLm56VHJlZVNlcnZpY2UuaXNBcnJheU9mTnpUcmVlTm9kZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gaGFzIG5vdCBiZWVuIG5ldyBOelRyZWVOb2RlXG4gICAgICAgIHRoaXMubnpOb2RlcyA9IHZhbHVlLm1hcChpdGVtID0+IChuZXcgTnpUcmVlTm9kZShpdGVtLCBudWxsLCB0aGlzLm56VHJlZVNlcnZpY2UpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm56Tm9kZXMgPSB2YWx1ZS5tYXAoKGl0ZW06IE56VHJlZU5vZGUpID0+IHtcbiAgICAgICAgICBpdGVtLnNlcnZpY2UgPSB0aGlzLm56VHJlZVNlcnZpY2U7XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5uelRyZWVTZXJ2aWNlLmlzQ2hlY2tTdHJpY3RseSA9IHRoaXMubnpDaGVja1N0cmljdGx5O1xuICAgICAgdGhpcy5uelRyZWVTZXJ2aWNlLmlzTXVsdGlwbGUgPSB0aGlzLm56TXVsdGlwbGU7XG4gICAgICB0aGlzLm56VHJlZVNlcnZpY2UuaW5pdFRyZWUodGhpcy5uek5vZGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignbmdNb2RlbCBvbmx5IGFjY2VwdHMgYW4gYXJyYXkgYW5kIG11c3QgYmUgbm90IGVtcHR5Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZVxuICAgKiBuekV4cGFuZGVkS2V5cyBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbnpEZWZhdWx0RXhwYW5kZWRLZXlzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubnpEZWZhdWx0U3ViamVjdC5uZXh0KHsgdHlwZTogJ256RXhwYW5kZWRLZXlzJywga2V5czogdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlXG4gICAqIG56U2VsZWN0ZWRLZXlzIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBuekRlZmF1bHRTZWxlY3RlZEtleXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uekRlZmF1bHRTdWJqZWN0Lm5leHQoeyB0eXBlOiAnbnpTZWxlY3RlZEtleXMnLCBrZXlzOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2VcbiAgICogbnpDaGVja2VkS2V5cyBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbnpEZWZhdWx0Q2hlY2tlZEtleXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uekRlZmF1bHRTdWJqZWN0Lm5leHQoeyB0eXBlOiAnbnpDaGVja2VkS2V5cycsIGtleXM6IHZhbHVlIH0pO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IG56RXhwYW5kZWRLZXlzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubnpEZWZhdWx0U3ViamVjdC5uZXh0KHsgdHlwZTogJ256RXhwYW5kZWRLZXlzJywga2V5czogdmFsdWUgfSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgbnpTZWxlY3RlZEtleXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uekRlZmF1bHRTdWJqZWN0Lm5leHQoeyB0eXBlOiAnbnpTZWxlY3RlZEtleXMnLCBrZXlzOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBuekNoZWNrZWRLZXlzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubnpEZWZhdWx0U3ViamVjdC5uZXh0KHsgdHlwZTogJ256Q2hlY2tlZEtleXMnLCBrZXlzOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBuelNlYXJjaFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubnpUcmVlU2VydmljZS5zZWFyY2hFeHBhbmQodmFsdWUpO1xuICAgIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMubnpTZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KHRoaXMubnpUcmVlU2VydmljZS5mb3JtYXRFdmVudCgnc2VhcmNoJywgbnVsbCwgbnVsbCkpO1xuICAgICAgdGhpcy5uek9uU2VhcmNoTm9kZS5lbWl0KHRoaXMubnpUcmVlU2VydmljZS5mb3JtYXRFdmVudCgnc2VhcmNoJywgbnVsbCwgbnVsbCkpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBuelNlYXJjaFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaFZhbHVlO1xuICB9XG5cbiAgLy8gbW9kZWwgYmluZFxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpFeHBhbmRlZEtleXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpTZWxlY3RlZEtleXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDaGVja2VkS2V5c0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZ1tdPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56U2VhcmNoVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2VcbiAgICogbnpTZWFyY2hWYWx1ZUNoYW5nZSBpbnN0ZWFkXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPblNlYXJjaE5vZGU6IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q2xpY2s6IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekRibENsaWNrOiBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDb250ZXh0TWVudTogRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q2hlY2tCb3hDaGFuZ2U6IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekV4cGFuZENoYW5nZTogRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyYWdTdGFydDogRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnRW50ZXI6IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ092ZXI6IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ0xlYXZlOiBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyb3A6IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ0VuZDogRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBAQ29udGVudENoaWxkKCduelRyZWVUZW1wbGF0ZScpIG56VHJlZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBfc2VhcmNoVmFsdWUgPSBudWxsO1xuICBfbnpNdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBuekRlZmF1bHRTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8eyB0eXBlOiBzdHJpbmcsIGtleXM6IHN0cmluZ1tdIH0+KDYpO1xuICBuekRlZmF1bHRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBuek5vZGVzOiBOelRyZWVOb2RlW10gPSBbXTtcbiAgcHJlZml4Q2xzID0gJ2FudC10cmVlJztcbiAgY2xhc3NNYXAgPSB7fTtcblxuICBvbkNoYW5nZTogKHZhbHVlOiBOelRyZWVOb2RlW10pID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIGdldFRyZWVOb2RlcygpOiBOelRyZWVOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm56VHJlZVNlcnZpY2Uucm9vdE5vZGVzO1xuICB9XG5cbiAgZ2V0VHJlZU5vZGVCeUtleShrZXk6IHN0cmluZyk6IE56VHJlZU5vZGUge1xuICAgIGxldCB0YXJnZXROb2RlID0gbnVsbDtcbiAgICBjb25zdCBnZXROb2RlID0gKG5vZGU6IE56VHJlZU5vZGUpOiBib29sZWFuID0+IHtcbiAgICAgIGlmIChub2RlLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHRhcmdldE5vZGUgPSBub2RlO1xuICAgICAgICAvLyBicmVhayBldmVyeVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmdldENoaWxkcmVuKCkuZXZlcnkobiA9PiB7XG4gICAgICAgICAgcmV0dXJuIGdldE5vZGUobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICB0aGlzLm56Tm9kZXMuZXZlcnkobiA9PiB7XG4gICAgICByZXR1cm4gZ2V0Tm9kZShuKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0Tm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwdWJsaWMgZnVuY3Rpb25cbiAgICovXG4gIGdldENoZWNrZWROb2RlTGlzdCgpOiBOelRyZWVOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm56VHJlZVNlcnZpY2UuZ2V0Q2hlY2tlZE5vZGVMaXN0KCk7XG4gIH1cblxuICBnZXRTZWxlY3RlZE5vZGVMaXN0KCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubnpUcmVlU2VydmljZS5nZXRTZWxlY3RlZE5vZGVMaXN0KCk7XG4gIH1cblxuICBnZXRIYWxmQ2hlY2tlZE5vZGVMaXN0KCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubnpUcmVlU2VydmljZS5nZXRIYWxmQ2hlY2tlZE5vZGVMaXN0KCk7XG4gIH1cblxuICBnZXRFeHBhbmRlZE5vZGVMaXN0KCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubnpUcmVlU2VydmljZS5nZXRFeHBhbmRlZE5vZGVMaXN0KCk7XG4gIH1cblxuICBnZXRNYXRjaGVkTm9kZUxpc3QoKTogTnpUcmVlTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5uelRyZWVTZXJ2aWNlLmdldE1hdGNoZWROb2RlTGlzdCgpO1xuICB9XG5cbiAgc2V0Q2xhc3NNYXAoKTogdm9pZCB7XG4gICAgdGhpcy5jbGFzc01hcCA9IHtcbiAgICAgIFsgdGhpcy5wcmVmaXhDbHMgXSAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgIFsgdGhpcy5wcmVmaXhDbHMgKyAnLXNob3ctbGluZScgXTogdGhpcy5uelNob3dMaW5lLFxuICAgICAgWyBgJHt0aGlzLnByZWZpeENsc30taWNvbi1oaWRlYCBdOiAhdGhpcy5uelNob3dJY29uLFxuICAgICAgWyAnZHJhZ2dhYmxlLXRyZWUnIF0gICAgICAgICAgICAgOiB0aGlzLm56RHJhZ2dhYmxlLFxuICAgICAgWyAnYW50LXNlbGVjdC10cmVlJyBdICAgICAgICAgICAgOiB0aGlzLm56U2VsZWN0TW9kZVxuICAgIH07XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBOelRyZWVOb2RlW10pOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMubnpOb2RlcyA9IHZhbHVlLm1hcCgoaXRlbTogTnpUcmVlTm9kZSkgPT4ge1xuICAgICAgICBpdGVtLnNlcnZpY2UgPSB0aGlzLm56VHJlZVNlcnZpY2U7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm56VHJlZVNlcnZpY2UuaXNDaGVja1N0cmljdGx5ID0gdGhpcy5uekNoZWNrU3RyaWN0bHk7XG4gICAgICB0aGlzLm56VHJlZVNlcnZpY2UuaXNNdWx0aXBsZSA9IHRoaXMubnpNdWx0aXBsZTtcbiAgICAgIHRoaXMubnpUcmVlU2VydmljZS5pbml0VHJlZSh0aGlzLm56Tm9kZXMpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ25nTW9kZWwgb25seSBhY2NlcHRzIGFuIGFycmF5IGFuZCBzaG91bGQgYmUgbm90IGVtcHR5Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IE56VHJlZU5vZGVbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuelRyZWVTZXJ2aWNlOiBOelRyZWVCYXNlU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEhvc3QoKSBAT3B0aW9uYWwoKSBwdWJsaWMgbm9BbmltYXRpb24/OiBOek5vQW5pbWF0aW9uRGlyZWN0aXZlKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gICAgdGhpcy5uekRlZmF1bHRTdWJzY3JpcHRpb24gPSB0aGlzLm56RGVmYXVsdFN1YmplY3Quc3Vic2NyaWJlKChkYXRhOiB7IHR5cGU6IHN0cmluZywga2V5czogc3RyaW5nW10gfSkgPT4ge1xuICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmtleXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbnpFeHBhbmRlZEtleXMnOlxuICAgICAgICAgIHRoaXMubnpUcmVlU2VydmljZS5jYWxjRXhwYW5kZWRLZXlzKGRhdGEua2V5cywgdGhpcy5uek5vZGVzKTtcbiAgICAgICAgICB0aGlzLm56RXhwYW5kZWRLZXlzQ2hhbmdlLmVtaXQoZGF0YS5rZXlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnpTZWxlY3RlZEtleXMnOlxuICAgICAgICAgIHRoaXMubnpUcmVlU2VydmljZS5jYWxjU2VsZWN0ZWRLZXlzKGRhdGEua2V5cywgdGhpcy5uek5vZGVzLCB0aGlzLm56TXVsdGlwbGUpO1xuICAgICAgICAgIHRoaXMubnpTZWxlY3RlZEtleXNDaGFuZ2UuZW1pdChkYXRhLmtleXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduekNoZWNrZWRLZXlzJzpcbiAgICAgICAgICB0aGlzLm56VHJlZVNlcnZpY2UuY2FsY0NoZWNrZWRLZXlzKGRhdGEua2V5cywgdGhpcy5uek5vZGVzLCB0aGlzLm56Q2hlY2tTdHJpY3RseSk7XG4gICAgICAgICAgdGhpcy5uekNoZWNrZWRLZXlzQ2hhbmdlLmVtaXQoZGF0YS5rZXlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICAgIHRoaXMubnpUcmVlU2VydmljZS5ldmVudFRyaWdnZXJDaGFuZ2VkKCkucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgc3dpdGNoIChkYXRhLmV2ZW50TmFtZSkge1xuICAgICAgICBjYXNlICdleHBhbmQnOlxuICAgICAgICAgIHRoaXMubnpFeHBhbmRDaGFuZ2UuZW1pdChkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2xpY2snOlxuICAgICAgICAgIHRoaXMubnpDbGljay5lbWl0KGRhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjaGVjayc6XG4gICAgICAgICAgdGhpcy5uekNoZWNrQm94Q2hhbmdlLmVtaXQoZGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICAgICAgICB0aGlzLm56RGJsQ2xpY2suZW1pdChkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgICAgICAgIHRoaXMubnpDb250ZXh0TWVudS5lbWl0KGRhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBkcmFnIGRyb3BcbiAgICAgICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICAgICAgICB0aGlzLm56T25EcmFnU3RhcnQuZW1pdChkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgICAgICB0aGlzLm56T25EcmFnRW50ZXIuZW1pdChkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICA