ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
471 lines • 44.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, QueryList, ViewChild, ElementRef, HostBinding, TemplateRef, EventEmitter, ContentChildren, ViewEncapsulation } from '@angular/core';
import { TabPaneComponent } from './tab-pane.component';
var TabsComponent = /** @class */ (function () {
function TabsComponent() {
this.prefixCls = 'am-tabs';
this.selectedKey = 0;
this.keyToSelect = 0;
this.paneMoveStyle = 'translate3d(0, 0, 0)';
this._startTime = 0;
this._startPosition = 0;
this._velocityThreshold = 0.3;
this._tabDirection = 'horizontal';
this._tabBarPosition = 'top';
this.page = 5;
this.swipeable = true;
this.useOnPan = true;
this.animated = true;
this.distanceToChangeTab = 0.3;
this.tabTitleSize = 0;
this.tabBarActiveTextColor = '';
this.tabBarInactiveTextColor = '';
this.renderTabBar = null;
this.tabBarBackgroundColor = '#FFF';
this.prerenderingSiblingsNumber = -1;
this.tabBarTextStyle = {};
/**
* should be removed when https://github.com/angular/angular/issues/20810 resolved *
*/
this.tabPanesContent = null;
this.onChange = new EventEmitter();
this.onTabClick = new EventEmitter();
this.amTabs = true;
this.amTabsTop = true;
this.amTabsLeft = false;
this.amTabsRight = false;
this.amTabsBottom = false;
this.amTabsVertical = false;
this.amTabsHorizontal = true;
}
Object.defineProperty(TabsComponent.prototype, "activeTab", {
get: /**
* @return {?}
*/
function () {
return this.selectedKey;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.keyToSelect = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TabsComponent.prototype, "tabBarPosition", {
get: /**
* @return {?}
*/
function () {
return this._tabBarPosition;
},
set: /**
* @param {?} position
* @return {?}
*/
function (position) {
this._tabBarPosition = position;
switch (position) {
case 'top':
this.amTabsTop = true;
this.amTabsLeft = false;
this.amTabsRight = false;
this.amTabsBottom = false;
break;
case 'left':
this.amTabsTop = false;
this.amTabsLeft = true;
this.amTabsRight = false;
this.amTabsBottom = false;
break;
case 'bottom':
this.amTabsTop = false;
this.amTabsLeft = false;
this.amTabsRight = false;
this.amTabsBottom = true;
break;
case 'right':
this.amTabsTop = false;
this.amTabsLeft = false;
this.amTabsRight = true;
this.amTabsBottom = false;
break;
default:
break;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TabsComponent.prototype, "tabDirection", {
get: /**
* @return {?}
*/
function () {
return this._tabDirection;
},
set: /**
* @param {?} direction
* @return {?}
*/
function (direction) {
this._tabDirection = direction;
switch (direction) {
case 'horizontal':
this.amTabsHorizontal = true;
this.amTabsVertical = false;
break;
case 'vertical':
this.amTabsHorizontal = false;
this.amTabsVertical = true;
break;
default:
break;
}
},
enumerable: true,
configurable: true
});
/**
* @param {?} index
* @return {?}
*/
TabsComponent.prototype.clickTab = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (this.selectedKey !== index) {
this.keyToSelect = index;
this.onTabClick.emit({ index: this.keyToSelect });
}
};
/**
* @return {?}
*/
TabsComponent.prototype.getCurrentTabPanes = /**
* @return {?}
*/
function () {
return this.tabPanesContent || this.tabPanes;
};
/**
* @param {?} event
* @return {?}
*/
TabsComponent.prototype.onTouchStart = /**
* @param {?} event
* @return {?}
*/
function (event) {
this._startTime = event.timeStamp;
if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
if ('horizontal' === this._tabDirection) {
this._startPosition =
event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX;
}
else if ('vertical' === this._tabDirection) {
this._startPosition =
event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientY;
}
}
};
/**
* @param {?} event
* @return {?}
*/
TabsComponent.prototype.onTouchMove = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
if ('horizontal' === this._tabDirection) {
/** @type {?} */
var distance = event.changedTouches[0].clientX - this._startPosition;
if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) {
return;
}
else if (distance > 0 && this.activeTab === 0) {
return;
}
// velocity 小于阈值才认为是pan操作
if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
this.useOnPan &&
this.swipeable &&
this.animated) {
this.paneMoveStyle = 'translate3d(calc(-' + this.selectedKey * 100 + '% + ' + distance + 'px), 0, 0 )';
}
}
else if ('vertical' === this._tabDirection) {
/** @type {?} */
var distance = event.changedTouches[0].clientY - this._startPosition;
if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) {
return;
}
else if (distance > 0 && this.activeTab === 0) {
return;
}
if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
this.useOnPan &&
this.swipeable &&
this.animated) {
this.paneMoveStyle = 'translate3d(0, calc(-' + this.selectedKey * 100 + '% + ' + distance + 'px, 0 )';
}
}
}
};
/**
* @param {?} event
* @return {?}
*/
TabsComponent.prototype.onTouchEnd = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
if ('horizontal' === this._tabDirection) {
/** @type {?} */
var distance = event.changedTouches[0].clientX - this._startPosition;
/** @type {?} */
var distanceToChangeTabPx = this.tabContent.nativeElement.offsetWidth * this.distanceToChangeTab;
if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
(this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) ||
(this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold &&
(this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) {
if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) {
this.keyToSelect++;
}
else if (distance > 0 && this.activeTab > 0) {
this.keyToSelect--;
}
}
this.paneMoveStyle = 'translate3d(-' + this.selectedKey * 100 + '%, 0, 0 )';
}
else if ('vertical' === this._tabDirection) {
/** @type {?} */
var distance = event.changedTouches[0].clientY - this._startPosition;
/** @type {?} */
var distanceToChangeTabPx = this.tabContent.nativeElement.offsetHeight * this.distanceToChangeTab;
if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
(this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) ||
(this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold &&
(this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) {
if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) {
this.keyToSelect++;
}
else if (distance > 0 && this.activeTab > 0) {
this.keyToSelect--;
}
}
this.paneMoveStyle = 'translate3d(0, -' + this.selectedKey * 100 + '%, 0 )';
}
}
};
/**
* @return {?}
*/
TabsComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.selectTabPane(this.keyToSelect);
this.selectedKey = this.keyToSelect;
};
/**
* @return {?}
*/
TabsComponent.prototype.ngDoCheck = /**
* @return {?}
*/
function () {
if (this.keyToSelect !== this.selectedKey && this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
this.selectTabPane(this.keyToSelect);
this.selectedKey = this.keyToSelect;
this.onChange.emit({ index: this.selectedKey });
}
};
/**
* @private
* @param {?} index
* @return {?}
*/
TabsComponent.prototype.selectTabPane = /**
* @private
* @param {?} index
* @return {?}
*/
function (index) {
if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
/** @type {?} */
var actualKeyToSelect = Math.min(this.getCurrentTabPanes().length - 1, Math.max(index || 0, 0));
if ('horizontal' === this._tabDirection) {
this.paneMoveStyle = 'translate3d(-' + actualKeyToSelect * 100 + '%, 0, 0 )';
}
else if ('vertical' === this._tabDirection) {
this.paneMoveStyle = 'translate3d(0, -' + actualKeyToSelect * 100 + '%, 0 )';
}
}
};
/**
* @private
* @param {?} deltaDistance
* @param {?} deltaTime
* @return {?}
*/
TabsComponent.prototype.getVelocity = /**
* @private
* @param {?} deltaDistance
* @param {?} deltaTime
* @return {?}
*/
function (deltaDistance, deltaTime) {
return Math.abs(deltaDistance / deltaTime);
};
TabsComponent.decorators = [
{ type: Component, args: [{
selector: 'Tabs, nzm-tabs',
template: "<ng-container>\n <ng-template\n *ngIf=\"'top' === tabBarPosition || 'left' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n >\n </ng-template>\n <div\n #TabContent\n class=\"{{ prefixCls }}-content-wrap\"\n [ngClass]=\"{ 'am-tabs-content-wrap-animated': animated }\"\n [ngStyle]=\"{ transform: paneMoveStyle, webkitTransform: paneMoveStyle }\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n >\n <div\n tab-pane-body\n *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n [content]=\"tabPane.content\"\n [active]=\"i === selectedKey\"\n [prerender]=\"\n prerenderingSiblingsNumber < 0 ||\n (selectedKey - i <= prerenderingSiblingsNumber && selectedKey - i + prerenderingSiblingsNumber >= 0)\n \"\n ></div>\n </div>\n <ng-template\n *ngIf=\"'bottom' === tabBarPosition || 'right' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n ></ng-template>\n</ng-container>\n\n<ng-template #renderDefaultTabBar>\n <DefaultTabBar\n #DefaultTabBar\n [page]=\"page\"\n [animated]=\"animated\"\n [activeTab]=\"selectedKey\"\n [tabTitleSize]=\"tabTitleSize\"\n [tabBarPosition]=\"tabBarPosition\"\n [tabBarUnderlineStyle]=\"tabBarUnderlineStyle\"\n [tabBarBackgroundColor]=\"tabBarBackgroundColor\"\n >\n <div\n #TabTitle\n *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n class=\"{{ prefixCls }}-default-bar-tab\"\n [ngClass]=\"{\n 'am-tabs-default-bar-tab-active': i === selectedKey,\n 'am-tabs-default-bar-tab-disabled': tabPane.disabled\n }\"\n [ngStyle]=\"tabBarTextStyle\"\n [style.color]=\"i === selectedKey ? tabBarActiveTextColor : tabBarInactiveTextColor\"\n (click)=\"clickTab(i)\"\n >\n <ng-container *ngIf=\"tabPane.isTitleString; else titleTemplate\">\n {{ tabPane.title }}\n </ng-container>\n <ng-template #titleTemplate>\n <ng-template [ngTemplateOutlet]=\"tabPane.title\"></ng-template>\n </ng-template>\n </div>\n </DefaultTabBar>\n</ng-template>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
TabsComponent.ctorParameters = function () { return []; };
TabsComponent.propDecorators = {
tabPanes: [{ type: ContentChildren, args: [TabPaneComponent, { descendants: false },] }],
tabContent: [{ type: ViewChild, args: ['TabContent',] }],
tabsBarSwipe: [{ type: ViewChild, args: ['TabsBarSwipe',] }],
defaultTabBar: [{ type: ViewChild, args: ['DefaultTabBar',] }],
tabsBarContainer: [{ type: ViewChild, args: ['TabsBarContainer',] }],
page: [{ type: Input }],
swipeable: [{ type: Input }],
useOnPan: [{ type: Input }],
animated: [{ type: Input }],
tabBarUnderlineStyle: [{ type: Input }],
distanceToChangeTab: [{ type: Input }],
tabTitleSize: [{ type: Input }],
tabBarActiveTextColor: [{ type: Input }],
tabBarInactiveTextColor: [{ type: Input }],
renderTabBar: [{ type: Input }],
tabBarBackgroundColor: [{ type: Input }],
prerenderingSiblingsNumber: [{ type: Input }],
tabBarTextStyle: [{ type: Input }],
tabPanesContent: [{ type: Input }],
activeTab: [{ type: Input }],
tabBarPosition: [{ type: Input }],
tabDirection: [{ type: Input }],
onChange: [{ type: Output }],
onTabClick: [{ type: Output }],
amTabs: [{ type: HostBinding, args: ['class.am-tabs',] }],
amTabsTop: [{ type: HostBinding, args: ['class.am-tabs-top',] }],
amTabsLeft: [{ type: HostBinding, args: ['class.am-tabs-left',] }],
amTabsRight: [{ type: HostBinding, args: ['class.am-tabs-right',] }],
amTabsBottom: [{ type: HostBinding, args: ['class.am-tabs-bottom',] }],
amTabsVertical: [{ type: HostBinding, args: ['class.am-tabs-vertical',] }],
amTabsHorizontal: [{ type: HostBinding, args: ['class.am-tabs-horizontal',] }]
};
return TabsComponent;
}());
export { TabsComponent };
if (false) {
/** @type {?} */
TabsComponent.prototype.prefixCls;
/** @type {?} */
TabsComponent.prototype.selectedKey;
/** @type {?} */
TabsComponent.prototype.keyToSelect;
/** @type {?} */
TabsComponent.prototype.paneMoveStyle;
/**
* @type {?}
* @private
*/
TabsComponent.prototype._startTime;
/**
* @type {?}
* @private
*/
TabsComponent.prototype._startPosition;
/**
* @type {?}
* @private
*/
TabsComponent.prototype._velocityThreshold;
/**
* @type {?}
* @private
*/
TabsComponent.prototype._tabDirection;
/**
* @type {?}
* @private
*/
TabsComponent.prototype._tabBarPosition;
/** @type {?} */
TabsComponent.prototype.tabPanes;
/** @type {?} */
TabsComponent.prototype.tabContent;
/** @type {?} */
TabsComponent.prototype.tabsBarSwipe;
/** @type {?} */
TabsComponent.prototype.defaultTabBar;
/** @type {?} */
TabsComponent.prototype.tabsBarContainer;
/** @type {?} */
TabsComponent.prototype.page;
/** @type {?} */
TabsComponent.prototype.swipeable;
/** @type {?} */
TabsComponent.prototype.useOnPan;
/** @type {?} */
TabsComponent.prototype.animated;
/** @type {?} */
TabsComponent.prototype.tabBarUnderlineStyle;
/** @type {?} */
TabsComponent.prototype.distanceToChangeTab;
/** @type {?} */
TabsComponent.prototype.tabTitleSize;
/** @type {?} */
TabsComponent.prototype.tabBarActiveTextColor;
/** @type {?} */
TabsComponent.prototype.tabBarInactiveTextColor;
/** @type {?} */
TabsComponent.prototype.renderTabBar;
/** @type {?} */
TabsComponent.prototype.tabBarBackgroundColor;
/** @type {?} */
TabsComponent.prototype.prerenderingSiblingsNumber;
/** @type {?} */
TabsComponent.prototype.tabBarTextStyle;
/**
* should be removed when https://github.com/angular/angular/issues/20810 resolved *
* @type {?}
*/
TabsComponent.prototype.tabPanesContent;
/** @type {?} */
TabsComponent.prototype.onChange;
/** @type {?} */
TabsComponent.prototype.onTabClick;
/** @type {?} */
TabsComponent.prototype.amTabs;
/** @type {?} */
TabsComponent.prototype.amTabsTop;
/** @type {?} */
TabsComponent.prototype.amTabsLeft;
/** @type {?} */
TabsComponent.prototype.amTabsRight;
/** @type {?} */
TabsComponent.prototype.amTabsBottom;
/** @type {?} */
TabsComponent.prototype.amTabsVertical;
/** @type {?} */
TabsComponent.prototype.amTabsHorizontal;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRhYnMvdGFicy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3hEO0lBMklFO1FBcklBLGNBQVMsR0FBVyxTQUFTLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsa0JBQWEsR0FBVyxzQkFBc0IsQ0FBQztRQUV2QyxlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLHVCQUFrQixHQUFXLEdBQUcsQ0FBQztRQUNqQyxrQkFBYSxHQUFpQixZQUFZLENBQUM7UUFDM0Msb0JBQWUsR0FBdUIsS0FBSyxDQUFDO1FBZXBELFNBQUksR0FBVyxDQUFDLENBQUM7UUFFakIsY0FBUyxHQUFZLElBQUksQ0FBQztRQUUxQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBRXpCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFJekIsd0JBQW1CLEdBQVcsR0FBRyxDQUFDO1FBRWxDLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRXpCLDBCQUFxQixHQUFXLEVBQUUsQ0FBQztRQUVuQyw0QkFBdUIsR0FBVyxFQUFFLENBQUM7UUFFckMsaUJBQVksR0FBc0IsSUFBSSxDQUFDO1FBRXZDLDBCQUFxQixHQUFXLE1BQU0sQ0FBQztRQUV2QywrQkFBMEIsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUV4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SUFFN0Isd0NBQ29EOztJQThEcEQsaUNBQ2tGOztJQUNsRixtQ0FDb0Y7O0lBRXBGLCtCQUN1Qjs7SUFDdkIsa0NBQzBCOztJQUMxQixtQ0FDNEI7O0lBQzVCLG9DQUM2Qjs7SUFDN0IscUNBQzhCOztJQUM5Qix1Q0FDZ0M7O0lBQ2hDLHlDQUNpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRG9DaGVjayxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBUZW1wbGF0ZVJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFiUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vdGFiLXBhbmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYkRpcmVjdGlvbiwgVGFiQmFyUG9zaXRpb25UeXBlLCBUYWJzT25DaGFuZ2VFdmVudCB9IGZyb20gJy4vUHJvcHNUeXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnVGFicywgbnptLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGFic0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIEFmdGVyQ29udGVudEluaXQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS10YWJzJztcbiAgc2VsZWN0ZWRLZXk6IG51bWJlciA9IDA7XG4gIGtleVRvU2VsZWN0OiBudW1iZXIgPSAwO1xuICBwYW5lTW92ZVN0eWxlOiBzdHJpbmcgPSAndHJhbnNsYXRlM2QoMCwgMCwgMCknO1xuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfc3RhcnRQb3NpdGlvbjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfdmVsb2NpdHlUaHJlc2hvbGQ6IG51bWJlciA9IDAuMztcbiAgcHJpdmF0ZSBfdGFiRGlyZWN0aW9uOiBUYWJEaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCc7XG4gIHByaXZhdGUgX3RhYkJhclBvc2l0aW9uOiBUYWJCYXJQb3NpdGlvblR5cGUgPSAndG9wJztcblxuICBAQ29udGVudENoaWxkcmVuKFRhYlBhbmVDb21wb25lbnQsIHsgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gIHRhYlBhbmVzOiBRdWVyeUxpc3Q8VGFiUGFuZUNvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZCgnVGFiQ29udGVudCcpXG4gIHRhYkNvbnRlbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ1RhYnNCYXJTd2lwZScpXG4gIHRhYnNCYXJTd2lwZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnRGVmYXVsdFRhYkJhcicpXG4gIGRlZmF1bHRUYWJCYXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ1RhYnNCYXJDb250YWluZXInKVxuICB0YWJzQmFyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIHBhZ2U6IG51bWJlciA9IDU7XG4gIEBJbnB1dCgpXG4gIHN3aXBlYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHVzZU9uUGFuOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICB0YWJCYXJVbmRlcmxpbmVTdHlsZTogb2JqZWN0O1xuICBASW5wdXQoKVxuICBkaXN0YW5jZVRvQ2hhbmdlVGFiOiBudW1iZXIgPSAwLjM7XG4gIEBJbnB1dCgpXG4gIHRhYlRpdGxlU2l6ZTogbnVtYmVyID0gMDtcbiAgQElucHV0KClcbiAgdGFiQmFyQWN0aXZlVGV4dENvbG9yOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgdGFiQmFySW5hY3RpdmVUZXh0Q29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICByZW5kZXJUYWJCYXI6IFRlbXBsYXRlUmVmPHZvaWQ+ID0gbnVsbDtcbiAgQElucHV0KClcbiAgdGFiQmFyQmFja2dyb3VuZENvbG9yOiBzdHJpbmcgPSAnI0ZGRic7XG4gIEBJbnB1dCgpXG4gIHByZXJlbmRlcmluZ1NpYmxpbmdzTnVtYmVyOiBudW1iZXIgPSAtMTtcbiAgQElucHV0KClcbiAgdGFiQmFyVGV4dFN0eWxlOiBvYmplY3QgPSB7fTtcbiAgLyoqIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjA4MTAgcmVzb2x2ZWQgKiovXG4gIEBJbnB1dCgpXG4gIHRhYlBhbmVzQ29udGVudDogUXVlcnlMaXN0PFRhYlBhbmVDb21wb25lbnQ+ID0gbnVsbDtcbiAgQElucHV0KClcbiAgZ2V0IGFjdGl2ZVRhYigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkS2V5O1xuICB9XG4gIHNldCBhY3RpdmVUYWIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMua2V5VG9TZWxlY3QgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGFiQmFyUG9zaXRpb24oKTogVGFiQmFyUG9zaXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiQmFyUG9zaXRpb247XG4gIH1cbiAgc2V0IHRhYkJhclBvc2l0aW9uKHBvc2l0aW9uOiBUYWJCYXJQb3NpdGlvblR5cGUpIHtcbiAgICB0aGlzLl90YWJCYXJQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHRhYkRpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiRGlyZWN0aW9uO1xuICB9XG4gIHNldCB0YWJEaXJlY3Rpb24oZGlyZWN0aW9uOiBUYWJEaXJlY3Rpb24pIHtcbiAgICB0aGlzLl90YWJEaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2hvcml6b250YWwnOlxuICAgICAgICB0aGlzLmFtVGFic0hvcml6b250YWwgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic1ZlcnRpY2FsID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmVydGljYWwnOlxuICAgICAgICB0aGlzLmFtVGFic0hvcml6b250YWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPFRhYnNPbkNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFic09uQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKVxuICBvblRhYkNsaWNrOiBFdmVudEVtaXR0ZXI8VGFic09uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJzT25DaGFuZ2VFdmVudD4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMnKVxuICBhbVRhYnM6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtdG9wJylcbiAgYW1UYWJzVG9wOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLWxlZnQnKVxuICBhbVRhYnNMZWZ0OiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1yaWdodCcpXG4gIGFtVGFic1JpZ2h0OiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1ib3R0b20nKVxuICBhbVRhYnNCb3R0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXZlcnRpY2FsJylcbiAgYW1UYWJzVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLWhvcml6b250YWwnKVxuICBhbVRhYnNIb3Jpem9udGFsOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgY2xpY2tUYWIoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkS2V5ICE9PSBpbmRleCkge1xuICAgICAgdGhpcy5rZXlUb1NlbGVjdCA9IGluZGV4O1xuICAgICAgdGhpcy5vblRhYkNsaWNrLmVtaXQoeyBpbmRleDogdGhpcy5rZXlUb1NlbGVjdCB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRDdXJyZW50VGFiUGFuZXMoKTogUXVlcnlMaXN0PFRhYlBhbmVDb21wb25lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy50YWJQYW5lc0NvbnRlbnQgfHwgdGhpcy50YWJQYW5lcztcbiAgfVxuXG4gIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IGV2ZW50LnRpbWVTdGFtcDtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID1cbiAgICAgICAgICBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9XG4gICAgICAgICAgZXZlbnQgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblRvdWNoTW92ZShldmVudCkge1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdmVsb2NpdHkg5bCP5LqO6ZiI5YC85omN6K6k5Li65pivcGFu5pON5L2cXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgdGhpcy51c2VPblBhbiAmJlxuICAgICAgICAgIHRoaXMuc3dpcGVhYmxlICYmXG4gICAgICAgICAgdGhpcy5hbmltYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoY2FsYygtJyArIHRoaXMuc2VsZWN0ZWRLZXkgKiAxMDAgKyAnJSArICcgKyBkaXN0YW5jZSArICdweCksIDAsIDAgKSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICB0aGlzLnVzZU9uUGFuICYmXG4gICAgICAgICAgdGhpcy5zd2lwZWFibGUgJiZcbiAgICAgICAgICB0aGlzLmFuaW1hdGVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgwLCBjYWxjKC0nICsgdGhpcy5zZWxlY3RlZEtleSAqIDEwMCArICclICsgJyArIGRpc3RhbmNlICsgJ3B4LCAwICknO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaEVuZChldmVudCkge1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCA9IHRoaXMudGFiQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogdGhpcy5kaXN0YW5jZVRvQ2hhbmdlVGFiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnVzZU9uUGFuICYmIHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCkpIHx8XG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPiB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCAvIDIpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiIDwgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0Kys7XG4gICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0LS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgtJyArIHRoaXMuc2VsZWN0ZWRLZXkgKiAxMDAgKyAnJSwgMCwgMCApJztcbiAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCA9IHRoaXMudGFiQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMuZGlzdGFuY2VUb0NoYW5nZVRhYjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy51c2VPblBhbiAmJiB0aGlzLnN3aXBlYWJsZSAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHgpKSB8fFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpID4gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnN3aXBlYWJsZSAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggLyAyKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA8IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdCsrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID4gMCkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoMCwgLScgKyB0aGlzLnNlbGVjdGVkS2V5ICogMTAwICsgJyUsIDAgKSc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2VsZWN0VGFiUGFuZSh0aGlzLmtleVRvU2VsZWN0KTtcbiAgICB0aGlzLnNlbGVjdGVkS2V5ID0gdGhpcy5rZXlUb1NlbGVjdDtcbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAodGhpcy5rZXlUb1NlbGVjdCAhPT0gdGhpcy5zZWxlY3RlZEtleSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RUYWJQYW5lKHRoaXMua2V5VG9TZWxlY3QpO1xuICAgICAgdGhpcy5zZWxlY3RlZEtleSA9IHRoaXMua2V5VG9TZWxlY3Q7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoeyBpbmRleDogdGhpcy5zZWxlY3RlZEtleSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdFRhYlBhbmUoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWN0dWFsS2V5VG9TZWxlY3QgPSBNYXRoLm1pbih0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEsIE1hdGgubWF4KGluZGV4IHx8IDAsIDApKTtcbiAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoLScgKyBhY3R1YWxLZXlUb1NlbGVjdCAqIDEwMCArICclLCAwLCAwICknO1xuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKDAsIC0nICsgYWN0dWFsS2V5VG9TZWxlY3QgKiAxMDAgKyAnJSwgMCApJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZlbG9jaXR5KGRlbHRhRGlzdGFuY2UsIGRlbHRhVGltZSkge1xuICAgIHJldHVybiBNYXRoLmFicyhkZWx0YURpc3RhbmNlIC8gZGVsdGFUaW1lKTtcbiAgfVxufVxuIl19