ngx-pluto
Version:
435 lines • 38.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Input, Renderer2, TemplateRef } from '@angular/core';
import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { NpTooltip } from './tooltip.component';
/** @type {?} */
var OFFSET = 4;
/**
* Tooltip提示文本
*
* <example-url>https://stackblitz.com/edit/np-tooltip-sample?embed=1&file=src/app/app.component.html</example-url>
*/
var NpTooltipDirective = /** @class */ (function () {
function NpTooltipDirective(overlay, overlayPositionBuilder, elementRef, renderer) {
this.overlay = overlay;
this.overlayPositionBuilder = overlayPositionBuilder;
this.elementRef = elementRef;
this.renderer = renderer;
/**
* 显示提示文本
*/
this.text = '';
/**
* 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本
*/
this.position = 'top';
/**
* 提示文本背景色
*/
this.bgColor = 'rgba(73, 89, 106, .7)';
/**
* 提示文本水平方向X轴位移
*/
this.offsetX = null;
/**
* 提示文本垂直方向Y轴位移
*/
this.offsetY = null;
/**
* 是否展示提示文本指向箭头,默认展示
*/
this.showArrow = true;
/**
* 触发方式,默认为鼠标hover
*/
this.trigger = 'hover';
this.withPositions = {
originX: 'center',
originY: 'top',
overlayX: 'center',
overlayY: 'bottom',
offsetX: 0,
offsetY: -2 * OFFSET
};
}
/**
* @return {?}
*/
NpTooltipDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.initWithPositions();
/** @type {?} */
var positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo(this.elementRef)
.withPositions([this.withPositions]);
this.overlayRef = this.overlay.create({ positionStrategy: positionStrategy, hasBackdrop: this.trigger === 'click' });
this.overlayRef.backdropClick().subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
_this.hide();
}));
};
/**
* @return {?}
*/
NpTooltipDirective.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var overlayElement;
if (this.trigger === 'hover') {
this.renderer.listen(this.elementRef.nativeElement, 'mouseenter', (/**
* @return {?}
*/
function () { return _this.delayEnterLeave(true, true, 0.15); }));
this.renderer.listen(this.elementRef.nativeElement, 'mouseleave', (/**
* @return {?}
*/
function () {
_this.delayEnterLeave(true, false, 0.1);
if (_this.overlayRef && !overlayElement) { // NOTE: we bind events under "mouseleave" due to the overlayRef is only created after the overlay was completely shown up
overlayElement = _this.overlayRef.overlayElement;
_this.renderer.listen(overlayElement, 'mouseenter', (/**
* @return {?}
*/
function () { return _this.delayEnterLeave(false, true); }));
_this.renderer.listen(overlayElement, 'mouseleave', (/**
* @return {?}
*/
function () { return _this.delayEnterLeave(false, false); }));
}
}));
}
else if (this.trigger === 'click') {
this.renderer.listen(this.elementRef.nativeElement, 'click', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this.show();
}));
}
};
/**
* @private
* @return {?}
*/
NpTooltipDirective.prototype.initWithPositions = /**
* @private
* @return {?}
*/
function () {
switch (this.position) {
case 'top':
this.withPositions = {
originX: 'center',
originY: 'top',
overlayX: 'center',
overlayY: 'bottom',
offsetX: this.offsetX === null ? 0 : this.offsetX,
offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY
};
break;
case 'right':
this.withPositions = {
originX: 'end',
originY: 'center',
overlayX: 'start',
overlayY: 'center',
offsetX: this.offsetX === null ? 2 * OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 0 : this.offsetY
};
break;
case 'bottom':
this.withPositions = {
originX: 'center',
originY: 'bottom',
overlayX: 'center',
overlayY: 'top',
offsetX: this.offsetX === null ? 0 : this.offsetX,
offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY
};
break;
case 'left':
this.withPositions = {
originX: 'start',
originY: 'center',
overlayX: 'end',
overlayY: 'center',
offsetX: this.offsetX === null ? -2 * OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 0 : this.offsetY
};
break;
case 'topLeft':
this.withPositions = {
originX: 'start',
originY: 'top',
overlayX: 'end',
overlayY: 'bottom',
offsetX: this.offsetX === null ? OFFSET : this.offsetX,
offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY
};
break;
case 'topRight':
this.withPositions = {
originX: 'end',
originY: 'top',
overlayX: 'start',
overlayY: 'bottom',
offsetX: this.offsetX === null ? -OFFSET : this.offsetX,
offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY
};
break;
case 'bottomLeft':
this.withPositions = {
originX: 'start',
originY: 'bottom',
overlayX: 'end',
overlayY: 'top',
offsetX: this.offsetX === null ? OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY
};
break;
case 'bottomRight':
this.withPositions = {
originX: 'end',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top',
offsetX: this.offsetX === null ? -OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY
};
break;
default:
break;
}
if (this.position === 'top') {
this.elementRef.nativeElement.classList.add('arrow-bottom');
}
};
/**
* @private
* @return {?}
*/
NpTooltipDirective.prototype.buildArrow = /**
* @private
* @return {?}
*/
function () {
if (!this.overlayRef || !this.overlayRef.hostElement) {
return;
}
/** @type {?} */
var arrowPosition;
switch (this.position) {
case 'top':
arrowPosition = 'arrow-bottom';
break;
case 'right':
arrowPosition = 'arrow-left';
break;
case 'bottom':
arrowPosition = 'arrow-top';
break;
case 'left':
arrowPosition = 'arrow-right';
break;
case 'topLeft':
arrowPosition = 'arrow-bottomRight';
break;
case 'topRight':
arrowPosition = 'arrow-bottomLeft';
break;
case 'bottomLeft':
arrowPosition = 'arrow-topRight';
break;
case 'bottomRight':
arrowPosition = 'arrow-topLeft';
break;
default:
break;
}
/** @type {?} */
var tooltipTag = this.overlayRef.hostElement.getElementsByTagName('np-tooltip')[0];
if (tooltipTag) {
tooltipTag.classList.add(arrowPosition);
}
};
/**
* @private
* @param {?} isOrigin
* @param {?} isEnter
* @param {?=} delay
* @return {?}
*/
NpTooltipDirective.prototype.delayEnterLeave = /**
* @private
* @param {?} isOrigin
* @param {?} isEnter
* @param {?=} delay
* @return {?}
*/
function (isOrigin, isEnter, delay) {
var _this = this;
if (delay === void 0) { delay = -1; }
if (this.delayTimer) { // Clear timer during the delay time
window.clearTimeout(this.delayTimer);
this.delayTimer = null;
}
else if (delay > 0) {
this.delayTimer = window.setTimeout((/**
* @return {?}
*/
function () {
_this.delayTimer = null;
isEnter ? _this.show() : _this.hide();
}), delay * 1000);
}
else {
isEnter && isOrigin ? this.show() : this.hide(); // [Compatible] The "isOrigin" is used due to the tooltip will not hide immediately (may caused by the fade-out animation)
}
};
/**
* @return {?}
*/
NpTooltipDirective.prototype.show = /**
* @return {?}
*/
function () {
if (this.overlayRef.hasAttached()) {
return;
}
/** @type {?} */
var tooltipRef = this.overlayRef.attach(new ComponentPortal(NpTooltip));
if (this.text) {
tooltipRef.instance.text = this.text;
}
if (this.template) {
tooltipRef.instance.template = this.template;
}
tooltipRef.instance.bgColor = this.bgColor;
if (this.showArrow) {
this.buildArrow();
}
};
/**
* @return {?}
*/
NpTooltipDirective.prototype.hide = /**
* @return {?}
*/
function () {
if (this.overlayRef.hasAttached) {
this.overlayRef.detach();
}
};
NpTooltipDirective.decorators = [
{ type: Directive, args: [{ selector: '[npTooltip]' },] }
];
/** @nocollapse */
NpTooltipDirective.ctorParameters = function () { return [
{ type: Overlay },
{ type: OverlayPositionBuilder },
{ type: ElementRef },
{ type: Renderer2 }
]; };
NpTooltipDirective.propDecorators = {
text: [{ type: Input, args: ['npTooltip',] }],
template: [{ type: Input }],
position: [{ type: Input }],
bgColor: [{ type: Input }],
offsetX: [{ type: Input }],
offsetY: [{ type: Input }],
showArrow: [{ type: Input }],
trigger: [{ type: Input }]
};
return NpTooltipDirective;
}());
export { NpTooltipDirective };
if (false) {
/**
* 显示提示文本
* @type {?}
*/
NpTooltipDirective.prototype.text;
/**
* 支持自定义模板ng-template展示提示文本
* @type {?}
*/
NpTooltipDirective.prototype.template;
/**
* 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本
* @type {?}
*/
NpTooltipDirective.prototype.position;
/**
* 提示文本背景色
* @type {?}
*/
NpTooltipDirective.prototype.bgColor;
/**
* 提示文本水平方向X轴位移
* @type {?}
*/
NpTooltipDirective.prototype.offsetX;
/**
* 提示文本垂直方向Y轴位移
* @type {?}
*/
NpTooltipDirective.prototype.offsetY;
/**
* 是否展示提示文本指向箭头,默认展示
* @type {?}
*/
NpTooltipDirective.prototype.showArrow;
/**
* 触发方式,默认为鼠标hover
* @type {?}
*/
NpTooltipDirective.prototype.trigger;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.overlayRef;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.withPositions;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.delayTimer;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.overlay;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.overlayPositionBuilder;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.elementRef;
/** @type {?} */
NpTooltipDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsVUFBVSxFQUFnQixLQUFLLEVBQVUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7SUFFMUMsTUFBTSxHQUFHLENBQUM7Ozs7OztBQU9oQjtJQStCSSw0QkFBb0IsT0FBZ0IsRUFDeEIsc0JBQThDLEVBQzlDLFVBQXNCLEVBQ3ZCLFFBQW1CO1FBSFYsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUN4QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdkIsYUFBUSxHQUFSLFFBQVEsQ0FBVzs7OztRQTlCVixTQUFJLEdBQUcsRUFBRSxDQUFDOzs7O1FBSXJCLGFBQVEsR0FBc0IsS0FBSyxDQUFDOzs7O1FBRXBDLFlBQU8sR0FBVyx1QkFBdUIsQ0FBQzs7OztRQUUxQyxZQUFPLEdBQVcsSUFBSSxDQUFDOzs7O1FBRXZCLFlBQU8sR0FBVyxJQUFJLENBQUM7Ozs7UUFFdkIsY0FBUyxHQUFZLElBQUksQ0FBQzs7OztRQUUxQixZQUFPLEdBQXNCLE9BQU8sQ0FBQztRQUd0QyxrQkFBYSxHQUFRO1lBQ3pCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTTtTQUN2QixDQUFDO0lBT0YsQ0FBQzs7OztJQUVELHFDQUFROzs7SUFBUjtRQUFBLGlCQVdDO1FBVkcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7O1lBRW5CLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDL0MsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNwQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixrQkFBQSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbkcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTOzs7O1FBQUMsVUFBQSxHQUFHO1lBQ3pDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7SUFFRCw0Q0FBZTs7O0lBQWY7UUFBQSxpQkFrQkM7O1lBakJPLGNBQWM7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxZQUFZOzs7WUFBRSxjQUFNLE9BQUEsS0FBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUF0QyxDQUFzQyxFQUFDLENBQUM7WUFDaEgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsWUFBWTs7O1lBQUU7Z0JBQzlELEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxLQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsMEhBQTBIO29CQUNoSyxjQUFjLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7b0JBQ2hELEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxZQUFZOzs7b0JBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFqQyxDQUFpQyxFQUFDLENBQUM7b0JBQzVGLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxZQUFZOzs7b0JBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFsQyxDQUFrQyxFQUFDLENBQUM7aUJBQ2hHO1lBQ0wsQ0FBQyxFQUFDLENBQUM7U0FDTjthQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsT0FBTzs7OztZQUFFLFVBQUMsQ0FBQztnQkFDM0QsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixLQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsQ0FBQyxFQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Ozs7O0lBRU8sOENBQWlCOzs7O0lBQXpCO1FBQ0ksUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ25CLEtBQUssS0FBSztnQkFDTixJQUFJLENBQUMsYUFBYSxHQUFHO29CQUNqQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLFFBQVEsRUFBRSxRQUFRO29CQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQ2pELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztpQkFDOUQsQ0FBQztnQkFDRixNQUFNO1lBQ1YsS0FBSyxPQUFPO2dCQUNSLElBQUksQ0FBQyxhQUFhLEdBQUc7b0JBQ2pCLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUUsT0FBTztvQkFDakIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQzFELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztpQkFDcEQsQ0FBQztnQkFDRixNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULElBQUksQ0FBQyxhQUFhLEdBQUc7b0JBQ2pCLE9BQU8sRUFBRSxRQUFRO29CQUNqQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLFFBQVEsRUFBRSxLQUFLO29CQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztvQkFDakQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztpQkFDN0QsQ0FBQztnQkFDRixNQUFNO1lBQ1YsS0FBSyxNQUFNO2dCQUNQLElBQUksQ0FBQyxhQUFhLEdBQUc7b0JBQ2pCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztvQkFDM0QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO2lCQUNwRCxDQUFDO2dCQUNGLE1BQU07WUFDVixLQUFLLFNBQVM7Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsR0FBRztvQkFDakIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE9BQU8sRUFBRSxLQUFLO29CQUNkLFFBQVEsRUFBRSxLQUFLO29CQUNmLFFBQVEsRUFBRSxRQUFRO29CQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQ3RELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztpQkFDOUQsQ0FBQztnQkFDRixNQUFNO1lBQ1YsS0FBSyxVQUFVO2dCQUNYLElBQUksQ0FBQyxhQUFhLEdBQUc7b0JBQ2pCLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSxLQUFLO29CQUNkLFFBQVEsRUFBRSxPQUFPO29CQUNqQixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQ3ZELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztpQkFDOUQsQ0FBQztnQkFDRixNQUFNO1lBQ1YsS0FBSyxZQUFZO2dCQUNiLElBQUksQ0FBQyxhQUFhLEdBQUc7b0JBQ2pCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO29CQUN0RCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO2lCQUM3RCxDQUFDO2dCQUNGLE1BQU07WUFDVixLQUFLLGFBQWE7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRztvQkFDakIsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLFFBQVEsRUFBRSxPQUFPO29CQUNqQixRQUFRLEVBQUUsS0FBSztvQkFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztvQkFDdkQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztpQkFDN0QsQ0FBQztnQkFDRixNQUFNO1lBQ1Y7Z0JBQ0ksTUFBTTtTQUNiO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTtZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQy9EO0lBQ0wsQ0FBQzs7Ozs7SUFFTyx1Q0FBVTs7OztJQUFsQjtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7WUFDbEQsT0FBTztTQUNWOztZQUVHLGFBQXFCO1FBQ3pCLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNuQixLQUFLLEtBQUs7Z0JBQ04sYUFBYSxHQUFHLGNBQWMsQ0FBQTtnQkFDOUIsTUFBTTtZQUNWLEtBQUssT0FBTztnQkFDUixhQUFhLEdBQUcsWUFBWSxDQUFBO2dCQUM1QixNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULGFBQWEsR0FBRyxXQUFXLENBQUE7Z0JBQzNCLE1BQU07WUFDVixLQUFLLE1BQU07Z0JBQ1AsYUFBYSxHQUFHLGFBQWEsQ0FBQTtnQkFDN0IsTUFBTTtZQUNWLEtBQUssU0FBUztnQkFDVixhQUFhLEdBQUcsbUJBQW1CLENBQUE7Z0JBQ25DLE1BQU07WUFDVixLQUFLLFVBQVU7Z0JBQ1gsYUFBYSxHQUFHLGtCQUFrQixDQUFBO2dCQUNsQyxNQUFNO1lBQ1YsS0FBSyxZQUFZO2dCQUNiLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQTtnQkFDaEMsTUFBTTtZQUNWLEtBQUssYUFBYTtnQkFDZCxhQUFhLEdBQUcsZUFBZSxDQUFBO2dCQUMvQixNQUFNO1lBRVY7Z0JBQ0ksTUFBTTtTQUNiOztZQUNHLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEYsSUFBSSxVQUFVLEVBQUU7WUFDWixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7Ozs7Ozs7O0lBRU8sNENBQWU7Ozs7Ozs7SUFBdkIsVUFBd0IsUUFBaUIsRUFBRSxPQUFnQixFQUFFLEtBQWtCO1FBQS9FLGlCQVlDO1FBWjRELHNCQUFBLEVBQUEsU0FBaUIsQ0FBQztRQUMzRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxvQ0FBb0M7WUFDdkQsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDMUI7YUFBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVTs7O1lBQUM7Z0JBQ2hDLEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hDLENBQUMsR0FBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDcEI7YUFBTTtZQUNILE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsMEhBQTBIO1NBQzlLO0lBQ0wsQ0FBQzs7OztJQUVELGlDQUFJOzs7SUFBSjtRQUNJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUMvQixPQUFPO1NBQ1Y7O1lBRUssVUFBVSxHQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNYLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDeEM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2hEO1FBRUQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUUzQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3JCO0lBQ0wsQ0FBQzs7OztJQUVELGlDQUFJOzs7SUFBSjtRQUNJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7O2dCQW5QSixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFOzs7O2dCQVg3QixPQUFPO2dCQUFFLHNCQUFzQjtnQkFETixVQUFVO2dCQUErQixTQUFTOzs7dUJBZ0IvRSxLQUFLLFNBQUMsV0FBVzsyQkFFakIsS0FBSzsyQkFFTCxLQUFLOzBCQUVMLEtBQUs7MEJBRUwsS0FBSzswQkFFTCxLQUFLOzRCQUVMLEtBQUs7MEJBRUwsS0FBSzs7SUFrT1YseUJBQUM7Q0FBQSxBQXBQRCxJQW9QQztTQW5QWSxrQkFBa0I7Ozs7OztJQUczQixrQ0FBOEI7Ozs7O0lBRTlCLHNDQUFvQzs7Ozs7SUFFcEMsc0NBQTZDOzs7OztJQUU3QyxxQ0FBbUQ7Ozs7O0lBRW5ELHFDQUFnQzs7Ozs7SUFFaEMscUNBQWdDOzs7OztJQUVoQyx1Q0FBbUM7Ozs7O0lBRW5DLHFDQUE4Qzs7Ozs7SUFFOUMsd0NBQStCOzs7OztJQUMvQiwyQ0FPRTs7Ozs7SUFDRix3Q0FBbUI7Ozs7O0lBRVAscUNBQXdCOzs7OztJQUNoQyxvREFBc0Q7Ozs7O0lBQ3RELHdDQUE4Qjs7SUFDOUIsc0NBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5UG9zaXRpb25CdWlsZGVyLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgTnBUb29sdGlwIH0gZnJvbSAnLi90b29sdGlwLmNvbXBvbmVudCc7XHJcblxyXG5jb25zdCBPRkZTRVQgPSA0O1xyXG5cclxuLyoqXHJcbiogVG9vbHRpcOaPkOekuuaWh+acrFxyXG4qIFxyXG4qIDxleGFtcGxlLXVybD5odHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvbnAtdG9vbHRpcC1zYW1wbGU/ZW1iZWQ9MSZmaWxlPXNyYy9hcHAvYXBwLmNvbXBvbmVudC5odG1sPC9leGFtcGxlLXVybD5cclxuKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25wVG9vbHRpcF0nIH0pXHJcbmV4cG9ydCBjbGFzcyBOcFRvb2x0aXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIC8qKuaYvuekuuaPkOekuuaWh+acrCAqL1xyXG4gICAgQElucHV0KCducFRvb2x0aXAnKSB0ZXh0ID0gJyc7XHJcbiAgICAvKirmlK/mjIHoh6rlrprkuYnmqKHmnb9uZy10ZW1wbGF0ZeWxleekuuaPkOekuuaWh+acrCAqL1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICAvKirmlK/mjIHkuIrjgIHlj7PjgIHkuIvjgIHlt6bjgIHkuIrlt6bjgIHkuIrlj7PjgIHkuIvlt6bjgIHkuIvlj7M45Liq5pa55ZCR5bGV56S65o+Q56S65paH5pys77yM6buY6K6k5bGV56S65LiK5pa55o+Q56S65paH5pysICovXHJcbiAgICBASW5wdXQoKSBwb3NpdGlvbjogTnBUb29sdGlwUG9zaXRpb24gPSAndG9wJztcclxuICAgIC8qKuaPkOekuuaWh+acrOiDjOaZr+iJsiAqL1xyXG4gICAgQElucHV0KCkgYmdDb2xvcjogc3RyaW5nID0gJ3JnYmEoNzMsIDg5LCAxMDYsIC43KSc7XHJcbiAgICAvKirmj5DnpLrmlofmnKzmsLTlubPmlrnlkJFY6L205L2N56e7ICovXHJcbiAgICBASW5wdXQoKSBvZmZzZXRYOiBudW1iZXIgPSBudWxsO1xyXG4gICAgLyoq5o+Q56S65paH5pys5Z6C55u05pa55ZCRWei9tOS9jeenuyAqL1xyXG4gICAgQElucHV0KCkgb2Zmc2V0WTogbnVtYmVyID0gbnVsbDtcclxuICAgIC8qKuaYr+WQpuWxleekuuaPkOekuuaWh+acrOaMh+WQkeeureWktO+8jOm7mOiupOWxleekuiAqL1xyXG4gICAgQElucHV0KCkgc2hvd0Fycm93OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKuinpuWPkeaWueW8j++8jOm7mOiupOS4uum8oOagh2hvdmVyICovXHJcbiAgICBASW5wdXQoKSB0cmlnZ2VyOiAnaG92ZXInIHwgJ2NsaWNrJyA9ICdob3Zlcic7XHJcblxyXG4gICAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xyXG4gICAgcHJpdmF0ZSB3aXRoUG9zaXRpb25zOiBhbnkgPSB7XHJcbiAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxyXG4gICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICBvZmZzZXRYOiAwLFxyXG4gICAgICAgIG9mZnNldFk6IC0yICogT0ZGU0VUXHJcbiAgICB9O1xyXG4gICAgcHJpdmF0ZSBkZWxheVRpbWVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgICAgICBwcml2YXRlIG92ZXJsYXlQb3NpdGlvbkJ1aWxkZXI6IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0V2l0aFBvc2l0aW9ucygpO1xyXG5cclxuICAgICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXHJcbiAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcclxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMoW3RoaXMud2l0aFBvc2l0aW9uc10pO1xyXG5cclxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHsgcG9zaXRpb25TdHJhdGVneSwgaGFzQmFja2Ryb3A6IHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJyB9KTtcclxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IG92ZXJsYXlFbGVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5kZWxheUVudGVyTGVhdmUodHJ1ZSwgdHJ1ZSwgMC4xNSkpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGF5RW50ZXJMZWF2ZSh0cnVlLCBmYWxzZSwgMC4xKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgIW92ZXJsYXlFbGVtZW50KSB7IC8vIE5PVEU6IHdlIGJpbmQgZXZlbnRzIHVuZGVyIFwibW91c2VsZWF2ZVwiIGR1ZSB0byB0aGUgb3ZlcmxheVJlZiBpcyBvbmx5IGNyZWF0ZWQgYWZ0ZXIgdGhlIG92ZXJsYXkgd2FzIGNvbXBsZXRlbHkgc2hvd24gdXBcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5RWxlbWVudCA9IHRoaXMub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihvdmVybGF5RWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLmRlbGF5RW50ZXJMZWF2ZShmYWxzZSwgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKG92ZXJsYXlFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHRoaXMuZGVsYXlFbnRlckxlYXZlKGZhbHNlLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0V2l0aFBvc2l0aW9ucygpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMucG9zaXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gLTIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aXRoUG9zaXRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAyICogT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gLTIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gMCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0b3BMZWZ0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IC0yICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gLU9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAtMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdib3R0b21MZWZ0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aXRoUG9zaXRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAtT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT09ICd0b3AnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Fycm93LWJvdHRvbScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkQXJyb3coKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm92ZXJsYXlSZWYgfHwgIXRoaXMub3ZlcmxheVJlZi5ob3N0RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYXJyb3dQb3NpdGlvbjogc3RyaW5nO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wb3NpdGlvbikge1xyXG4gICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy1ib3R0b20nXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy1sZWZ0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LXRvcCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctcmlnaHQnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndG9wTGVmdCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LWJvdHRvbVJpZ2h0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctYm90dG9tTGVmdCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdib3R0b21MZWZ0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctdG9wUmlnaHQnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy10b3BMZWZ0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0b29sdGlwVGFnID0gdGhpcy5vdmVybGF5UmVmLmhvc3RFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCducC10b29sdGlwJylbMF07XHJcbiAgICAgICAgaWYgKHRvb2x0aXBUYWcpIHtcclxuICAgICAgICAgICAgdG9vbHRpcFRhZy5jbGFzc0xpc3QuYWRkKGFycm93UG9zaXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGF5RW50ZXJMZWF2ZShpc09yaWdpbjogYm9vbGVhbiwgaXNFbnRlcjogYm9vbGVhbiwgZGVsYXk6IG51bWJlciA9IC0xKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVsYXlUaW1lcikgeyAvLyBDbGVhciB0aW1lciBkdXJpbmcgdGhlIGRlbGF5IHRpbWVcclxuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5VGltZXIgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsYXlUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlUaW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpc0VudGVyID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfSwgZGVsYXkgKiAxMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpc0VudGVyICYmIGlzT3JpZ2luID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTsgLy8gW0NvbXBhdGlibGVdIFRoZSBcImlzT3JpZ2luXCIgaXMgdXNlZCBkdWUgdG8gdGhlIHRvb2x0aXAgd2lsbCBub3QgaGlkZSBpbW1lZGlhdGVseSAobWF5IGNhdXNlZCBieSB0aGUgZmFkZS1vdXQgYW5pbWF0aW9uKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0b29sdGlwUmVmOiBDb21wb25lbnRSZWY8TnBUb29sdGlwPlxyXG4gICAgICAgICAgICA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IENvbXBvbmVudFBvcnRhbChOcFRvb2x0aXApKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGV4dCkge1xyXG4gICAgICAgICAgICB0b29sdGlwUmVmLmluc3RhbmNlLnRleHQgPSB0aGlzLnRleHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0b29sdGlwUmVmLmluc3RhbmNlLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvb2x0aXBSZWYuaW5zdGFuY2UuYmdDb2xvciA9IHRoaXMuYmdDb2xvcjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0Fycm93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRBcnJvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTnBUb29sdGlwUG9zaXRpb24gPSAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICd0b3BMZWZ0JyB8ICd0b3BSaWdodCcgfCAnYm90dG9tTGVmdCcgfCAnYm90dG9tUmlnaHQnOyJdfQ==