ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
533 lines (532 loc) • 45.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ViewEncapsulation, Input, HostBinding, Output, EventEmitter, ElementRef } from '@angular/core';
var DrawerComponent = /** @class */ (function () {
function DrawerComponent(_el) {
this._el = _el;
this.prefixCls = 'am-drawer';
this.sidebarStyleFinal = {};
this.contentStyleFinal = {};
this.overlayStyleFinal = {};
this.sidebarWidth = 0;
this.sidebarHeight = 0;
this.sidebarTop = 0;
this.dragHandleTop = 0;
this.touchIdentifier = null;
this.touchStartX = null;
this.touchStartY = null;
this.touchCurrentX = null;
this.touchCurrentY = null;
this.touchSupported = typeof window === 'object' && 'ontouchstart' in window;
this._docked = false;
this._open = false;
this._position = 'left';
this.sidebarStyle = {};
this.contentStyle = {};
this.overlayStyle = {};
this.dragHandleStyle = {};
this.transitions = true;
this.touch = true;
this.enableDragHandle = true;
this.dragToggleDistance = 30;
this.onOpenChange = new EventEmitter();
this.am = true;
this.left = this._position === 'left';
this.right = this._position === 'right';
this.top = this._position == 'top';
this.bottom = this._position == 'bottom';
this.dockedCls = this._docked;
this.openCls = this._open;
}
Object.defineProperty(DrawerComponent.prototype, "docked", {
get: /**
* @return {?}
*/
function () {
return this._docked;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._docked = v;
this.dockedCls = v;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DrawerComponent.prototype, "open", {
get: /**
* @return {?}
*/
function () {
return this._open;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._open = v;
this.openCls = v;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DrawerComponent.prototype, "position", {
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._position = v;
this.right = false;
this.left = false;
this.top = false;
this.bottom = false;
switch (v) {
case 'right':
this.right = true;
break;
case 'left':
this.left = true;
break;
case 'top':
this.top = true;
break;
case 'bottom':
this.bottom = true;
break;
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
DrawerComponent.prototype.onOverlayClicked = /**
* @return {?}
*/
function () {
if (this._open) {
this.onOpenChange.emit(true);
}
};
/**
* @return {?}
*/
DrawerComponent.prototype.isTouching = /**
* @return {?}
*/
function () {
return this.touchIdentifier !== null;
};
/**
* @param {?} event
* @return {?}
*/
DrawerComponent.prototype.onTouchStart = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var touch = event.changedTouches[0];
this.touchIdentifier = touch.identifier;
this.touchStartX = touch.clientX;
this.touchStartY = touch.clientY;
this.touchCurrentX = touch.clientX;
this.touchCurrentY = touch.clientY;
};
/**
* @param {?} ev
* @return {?}
*/
DrawerComponent.prototype.onTouchMove = /**
* @param {?} ev
* @return {?}
*/
function (ev) {
for (var ind = 0; ind < ev.changedTouches.length; ind++) {
if (ev.changedTouches[ind].identifier === this.touchIdentifier) {
this.touchCurrentX = ev.changedTouches[ind].clientX;
this.touchCurrentY = ev.changedTouches[ind].clientY;
break;
}
}
this.update();
};
/**
* @return {?}
*/
DrawerComponent.prototype.onTouchEnd = /**
* @return {?}
*/
function () {
/** @type {?} */
var touchWidth = this.touchSidebarWidth();
if ((this._open && touchWidth < this.sidebarWidth - this.dragToggleDistance) ||
(!this._open && touchWidth > this.dragToggleDistance)) {
this.onOpenChange.emit(!this._open);
}
/** @type {?} */
var touchHeight = this.touchSidebarHeight();
if ((this._open && touchHeight < this.sidebarHeight - this.dragToggleDistance) ||
(!this._open && touchHeight > this.dragToggleDistance)) {
this.onOpenChange.emit(!this._open);
}
this.touchIdentifier = null;
this.touchStartX = null;
this.touchStartY = null;
this.touchCurrentX = null;
this.touchCurrentY = null;
this.update();
};
/**
* @return {?}
*/
DrawerComponent.prototype.saveSidebarSize = /**
* @return {?}
*/
function () {
/** @type {?} */
var sidebar = this._el.nativeElement.querySelector('#sidebar');
/** @type {?} */
var dragHandle = this._el.nativeElement.querySelector('#dragHandle');
/** @type {?} */
var width = sidebar.offsetWidth;
/** @type {?} */
var height = sidebar.offsetHeight;
/** @type {?} */
var sidebarTop = this.getOffset(sidebar).top;
/** @type {?} */
var dragHandleTop = this.getOffset(dragHandle).top;
if (width !== this.sidebarWidth) {
this.sidebarWidth = width;
}
if (height !== this.sidebarHeight) {
this.sidebarHeight = height;
}
if (sidebarTop !== this.sidebarTop) {
this.sidebarTop = sidebarTop;
}
if (dragHandleTop !== this.dragHandleTop) {
this.dragHandleTop = dragHandleTop;
}
};
/**
* @return {?}
*/
DrawerComponent.prototype.touchSidebarWidth = /**
* @return {?}
*/
function () {
if (this._position === 'right') {
if (this._open && window.innerWidth - this.touchStartX < this.sidebarWidth) {
if (this.touchCurrentX > this.touchStartX) {
return this.sidebarWidth + this.touchStartX - this.touchCurrentX;
}
return this.sidebarWidth;
}
return Math.min(window.innerWidth - this.touchCurrentX, this.sidebarWidth);
}
if (this._position === 'left') {
if (this._open && this.touchStartX < this.sidebarWidth) {
if (this.touchCurrentX > this.touchStartX) {
return this.sidebarWidth;
}
return this.sidebarWidth - this.touchStartX + this.touchCurrentX;
}
return Math.min(this.touchCurrentX, this.sidebarWidth);
}
};
/**
* @return {?}
*/
DrawerComponent.prototype.touchSidebarHeight = /**
* @return {?}
*/
function () {
if (this._position === 'bottom') {
if (this._open &&
this._el.nativeElement.offsetHeight - this.touchStartY + this._el.nativeElement.offsetTop < this.sidebarHeight) {
if (this.touchCurrentY > this.touchStartY) {
return this.sidebarHeight + this.touchStartY - this.touchCurrentY;
}
return this.sidebarHeight;
}
return Math.min(this._el.nativeElement.offsetHeight - this.touchCurrentY + this._el.nativeElement.offsetTop, this.sidebarHeight);
}
if (this._position === 'top') {
/** @type {?} */
var touchStartOffsetY = this.touchStartY - this.sidebarTop;
if (this._open && touchStartOffsetY < this.sidebarHeight) {
if (this.touchCurrentY > this.touchStartY) {
return this.sidebarHeight;
}
return this.sidebarHeight - this.touchStartY + this.touchCurrentY;
}
return Math.min(this.touchCurrentY - this.dragHandleTop, this.sidebarHeight);
}
};
/**
* @param {?} __0
* @return {?}
*/
DrawerComponent.prototype.renderStyle = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var sidebarStyle = _a.sidebarStyle, isTouching = _a.isTouching, overlayStyle = _a.overlayStyle, contentStyle = _a.contentStyle;
if (this._position === 'right' || this._position === 'left') {
sidebarStyle.transform = "translateX(0%)";
sidebarStyle.WebkitTransform = "translateX(0%)";
if (isTouching) {
/** @type {?} */
var percentage = this.touchSidebarWidth() / this.sidebarWidth;
// slide open to what we dragged
if (this._position === 'right') {
sidebarStyle.transform = "translateX(" + (1 - percentage) * 100 + "%)";
sidebarStyle.WebkitTransform = "translateX(" + (1 - percentage) * 100 + "%)";
}
if (this._position === 'left') {
sidebarStyle.transform = "translateX(-" + (1 - percentage) * 100 + "%)";
sidebarStyle.WebkitTransform = "translateX(-" + (1 - percentage) * 100 + "%)";
}
overlayStyle.opacity = percentage;
overlayStyle.visibility = 'visible';
}
if (contentStyle) {
contentStyle[this._position] = this.sidebarWidth + "px";
}
}
if (this._position === 'top' || this._position === 'bottom') {
sidebarStyle.transform = "translateY(0%)";
sidebarStyle.WebkitTransform = "translateY(0%)";
if (isTouching) {
/** @type {?} */
var percentage = this.touchSidebarHeight() / this.sidebarHeight;
if (this._position === 'bottom') {
sidebarStyle.transform = "translateY(" + (1 - percentage) * 100 + "%)";
sidebarStyle.WebkitTransform = "translateY(" + (1 - percentage) * 100 + "%)";
}
if (this._position === 'top') {
sidebarStyle.transform = "translateY(-" + (1 - percentage) * 100 + "%)";
sidebarStyle.WebkitTransform = "translateY(-" + (1 - percentage) * 100 + "%)";
}
overlayStyle.opacity = percentage;
overlayStyle.visibility = 'visible';
}
if (contentStyle) {
contentStyle[this._position] = this.sidebarHeight + "px";
}
}
};
/**
* @return {?}
*/
DrawerComponent.prototype.update = /**
* @return {?}
*/
function () {
/** @type {?} */
var sidebarStyle = tslib_1.__assign({}, this.sidebarStyle);
/** @type {?} */
var contentStyle = tslib_1.__assign({}, this.contentStyle);
/** @type {?} */
var overlayStyle = tslib_1.__assign({}, this.overlayStyle);
if (this.isTouching()) {
this.renderStyle({
sidebarStyle: sidebarStyle,
isTouching: true,
contentStyle: undefined,
overlayStyle: overlayStyle
});
}
else if (this._docked) {
this.dockedCls = true;
this.renderStyle({
sidebarStyle: sidebarStyle,
isTouching: undefined,
contentStyle: contentStyle,
overlayStyle: undefined
});
}
else if (this._open) {
this.openCls = true;
this.renderStyle({
sidebarStyle: sidebarStyle,
isTouching: undefined,
contentStyle: undefined,
overlayStyle: undefined
});
overlayStyle["opacity"] = 1;
overlayStyle["visibility"] = 'visible';
}
if (this.isTouching() || !this.transitions) {
sidebarStyle["transition"] = 'none';
sidebarStyle["WebkitTransition"] = 'none';
contentStyle["transition"] = 'none';
overlayStyle["transition"] = 'none';
}
this.sidebarStyleFinal = sidebarStyle;
this.contentStyleFinal = contentStyle;
this.overlayStyleFinal = overlayStyle;
};
/**
* @param {?} ele
* @return {?}
*/
DrawerComponent.prototype.getOffset = /**
* @param {?} ele
* @return {?}
*/
function (ele) {
/** @type {?} */
var el = ele;
/** @type {?} */
var _x = 0;
/** @type {?} */
var _y = 0;
while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
};
/**
* @return {?}
*/
DrawerComponent.prototype.ngAfterViewChecked = /**
* @return {?}
*/
function () {
if (!this.isTouching()) {
this.saveSidebarSize();
}
};
/**
* @return {?}
*/
DrawerComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.update();
};
DrawerComponent.decorators = [
{ type: Component, args: [{
selector: 'Drawer, nzm-drawer',
template: "<div class=\"{{prefixCls}}-sidebar\"\n [ngStyle]=\"sidebarStyleFinal\"\n id=\"sidebar\">\n <ng-template [ngTemplateOutlet]=\"sidebar\"></ng-template>\n</div>\n<div class=\"{{prefixCls}}-overlay\"\n [ngStyle]=\"overlayStyleFinal\"\n role=\"presentation\"\n ref=\"overlay\"\n (click)=\"onOverlayClicked()\"\n></div>\n<div class=\"{{prefixCls}}-content\"\n [ngStyle]=\"contentStyleFinal\"\n ref=\"content\">\n <div *ngIf=\"touch && touchSupported && !open && !docked && enableDragHandle\"\n id=\"dragHandle\"\n class=\"{{prefixCls}}-draghandle\"\n [ngStyle]=\"dragHandleStyle\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd()\"\n (touchcancle)=\"onTouchEnd()\"\n ></div>\n <ng-content></ng-content>\n</div>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
DrawerComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
DrawerComponent.propDecorators = {
sidebar: [{ type: Input }],
sidebarStyle: [{ type: Input }],
contentStyle: [{ type: Input }],
overlayStyle: [{ type: Input }],
dragHandleStyle: [{ type: Input }],
transitions: [{ type: Input }],
touch: [{ type: Input }],
enableDragHandle: [{ type: Input }],
dragToggleDistance: [{ type: Input }],
docked: [{ type: Input }],
open: [{ type: Input }],
position: [{ type: Input }],
onOpenChange: [{ type: Output }],
am: [{ type: HostBinding, args: ['class.am-drawer',] }],
left: [{ type: HostBinding, args: ['class.am-drawer-left',] }],
right: [{ type: HostBinding, args: ['class.am-drawer-right',] }],
top: [{ type: HostBinding, args: ['class.am-drawer-top',] }],
bottom: [{ type: HostBinding, args: ['class.am-drawer-bottom',] }],
dockedCls: [{ type: HostBinding, args: ['class.am-drawer-docked',] }],
openCls: [{ type: HostBinding, args: ['class.am-drawer-open',] }]
};
return DrawerComponent;
}());
export { DrawerComponent };
if (false) {
/** @type {?} */
DrawerComponent.prototype.prefixCls;
/** @type {?} */
DrawerComponent.prototype.sidebarStyleFinal;
/** @type {?} */
DrawerComponent.prototype.contentStyleFinal;
/** @type {?} */
DrawerComponent.prototype.overlayStyleFinal;
/** @type {?} */
DrawerComponent.prototype.sidebarWidth;
/** @type {?} */
DrawerComponent.prototype.sidebarHeight;
/** @type {?} */
DrawerComponent.prototype.sidebarTop;
/** @type {?} */
DrawerComponent.prototype.dragHandleTop;
/** @type {?} */
DrawerComponent.prototype.touchIdentifier;
/** @type {?} */
DrawerComponent.prototype.touchStartX;
/** @type {?} */
DrawerComponent.prototype.touchStartY;
/** @type {?} */
DrawerComponent.prototype.touchCurrentX;
/** @type {?} */
DrawerComponent.prototype.touchCurrentY;
/** @type {?} */
DrawerComponent.prototype.touchSupported;
/** @type {?} */
DrawerComponent.prototype._docked;
/** @type {?} */
DrawerComponent.prototype._open;
/** @type {?} */
DrawerComponent.prototype._position;
/** @type {?} */
DrawerComponent.prototype.sidebar;
/** @type {?} */
DrawerComponent.prototype.sidebarStyle;
/** @type {?} */
DrawerComponent.prototype.contentStyle;
/** @type {?} */
DrawerComponent.prototype.overlayStyle;
/** @type {?} */
DrawerComponent.prototype.dragHandleStyle;
/** @type {?} */
DrawerComponent.prototype.transitions;
/** @type {?} */
DrawerComponent.prototype.touch;
/** @type {?} */
DrawerComponent.prototype.enableDragHandle;
/** @type {?} */
DrawerComponent.prototype.dragToggleDistance;
/** @type {?} */
DrawerComponent.prototype.onOpenChange;
/** @type {?} */
DrawerComponent.prototype.am;
/** @type {?} */
DrawerComponent.prototype.left;
/** @type {?} */
DrawerComponent.prototype.right;
/** @type {?} */
DrawerComponent.prototype.top;
/** @type {?} */
DrawerComponent.prototype.bottom;
/** @type {?} */
DrawerComponent.prototype.dockedCls;
/** @type {?} */
DrawerComponent.prototype.openCls;
/** @type {?} */
DrawerComponent.prototype._el;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiZHJhd2VyL2RyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUdYLE1BQU0sZUFBZSxDQUFDOztJQXFHckIseUJBQW9CLEdBQWU7UUFBZixRQUFHLEdBQUgsR0FBRyxDQUFZO3lCQTdGZixXQUFXO2lDQUNXLEVBQUU7aUNBQ0YsRUFBRTtpQ0FDRixFQUFFOzRCQUNyQixDQUFDOzZCQUNBLENBQUM7MEJBQ0osQ0FBQzs2QkFDRSxDQUFDOytCQUNDLElBQUk7MkJBQ1IsSUFBSTsyQkFDSixJQUFJOzZCQUNGLElBQUk7NkJBQ0osSUFBSTs4QkFDRixPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksY0FBYyxJQUFJLE1BQU07dUJBRXJELEtBQUs7cUJBQ1AsS0FBSzt5QkFDRixNQUFNOzRCQUtHLEVBQUU7NEJBRUYsRUFBRTs0QkFFRixFQUFFOytCQUVDLEVBQUU7MkJBRW5CLElBQUk7cUJBRVYsSUFBSTtnQ0FFTyxJQUFJO2tDQUVILEVBQUU7NEJBd0NHLElBQUksWUFBWSxFQUFPO2tCQUczQyxJQUFJO29CQUVGLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTTtxQkFFeEIsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPO21CQUU1QixJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUs7c0JBRXBCLElBQUksQ0FBQyxTQUFTLElBQUksUUFBUTt5QkFFdkIsSUFBSSxDQUFDLE9BQU87dUJBRWQsSUFBSSxDQUFDLEtBQUs7S0FFVTtJQXhEdkMsc0JBQ0ksbUNBQU07Ozs7UUFEVjtZQUVFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNyQjs7Ozs7UUFDRCxVQUFXLENBQUM7WUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUNwQjs7O09BSkE7SUFLRCxzQkFDSSxpQ0FBSTs7OztRQURSO1lBRUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ25COzs7OztRQUNELFVBQVMsQ0FBQztZQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDbEI7OztPQUpBO0lBS0Qsc0JBQ0kscUNBQVE7Ozs7O1FBRFosVUFDYSxDQUFDO1lBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsUUFBUSxDQUFDLEVBQUU7Z0JBQ1QsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUNsQixNQUFNO2dCQUNSLEtBQUssTUFBTTtvQkFDVCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDakIsTUFBTTtnQkFDUixLQUFLLEtBQUs7b0JBQ1IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7b0JBQ2hCLE1BQU07Z0JBQ1IsS0FBSyxRQUFRO29CQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixNQUFNO2FBQ1Q7U0FDRjs7O09BQUE7Ozs7SUFxQkQsMENBQWdCOzs7SUFBaEI7UUFDRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtLQUNGOzs7O0lBRUQsb0NBQVU7OztJQUFWO1FBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQztLQUN0Qzs7Ozs7SUFFRCxzQ0FBWTs7OztJQUFaLFVBQWEsS0FBSzs7UUFDaEIsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0tBQ3BDOzs7OztJQUVELHFDQUFXOzs7O0lBQVgsVUFBWSxFQUFFO1FBQ1osS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3ZELElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDcEQsTUFBTTthQUNQO1NBQ0Y7UUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDZjs7OztJQUVELG9DQUFVOzs7SUFBVjs7UUFDRSxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1QyxJQUNFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDeEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUNyRDtZQUNBLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JDOztRQUVELElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlDLElBQ0UsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUMxRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQ3REO1lBQ0EsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDZjs7OztJQUVELHlDQUFlOzs7SUFBZjs7UUFDRSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7O1FBQ2pFLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7UUFFdkUsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQzs7UUFDbEMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQzs7UUFDcEMsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUM7O1FBQy9DLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRXJELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7UUFDRCxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztTQUM5QjtRQUNELElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7U0FDcEM7S0FDRjs7OztJQUVELDJDQUFpQjs7O0lBQWpCO1FBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sRUFBRTtZQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzFFLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUN6QyxPQUFPLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUNsRTtnQkFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDMUI7WUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1RTtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEQsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ3pDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztpQkFDMUI7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNsRTtZQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN4RDtLQUNGOzs7O0lBRUQsNENBQWtCOzs7SUFBbEI7UUFDRSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQy9CLElBQ0UsSUFBSSxDQUFDLEtBQUs7Z0JBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQzlHO2dCQUNBLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUN6QyxPQUFPLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUNuRTtnQkFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDM0I7WUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUMzRixJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO1NBQ0g7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFOztZQUM1QixJQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM3RCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDeEQsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ3pDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztpQkFDM0I7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNuRTtZQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzlFO0tBQ0Y7Ozs7O0lBRUQscUNBQVc7Ozs7SUFBWCxVQUFZLEVBQXdEO1lBQXRELDhCQUFZLEVBQUUsMEJBQVUsRUFBRSw4QkFBWSxFQUFFLDhCQUFZO1FBQ2hFLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUU7WUFDM0QsWUFBWSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztZQUMxQyxZQUFZLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDO1lBQ2hELElBQUksVUFBVSxFQUFFOztnQkFDZCxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDOztnQkFFaEUsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sRUFBRTtvQkFDOUIsWUFBWSxDQUFDLFNBQVMsR0FBRyxnQkFBYyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztvQkFDbEUsWUFBWSxDQUFDLGVBQWUsR0FBRyxnQkFBYyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztpQkFDekU7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sRUFBRTtvQkFDN0IsWUFBWSxDQUFDLFNBQVMsR0FBRyxpQkFBZSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztvQkFDbkUsWUFBWSxDQUFDLGVBQWUsR0FBRyxpQkFBZSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztpQkFDMUU7Z0JBQ0QsWUFBWSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7Z0JBQ2xDLFlBQVksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO2FBQ3JDO1lBQ0QsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQU0sSUFBSSxDQUFDLFlBQVksT0FBSSxDQUFDO2FBQ3pEO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQzNELFlBQVksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7WUFDMUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztZQUNoRCxJQUFJLFVBQVUsRUFBRTs7Z0JBQ2QsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDbEUsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtvQkFDL0IsWUFBWSxDQUFDLFNBQVMsR0FBRyxnQkFBYyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztvQkFDbEUsWUFBWSxDQUFDLGVBQWUsR0FBRyxnQkFBYyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztpQkFDekU7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtvQkFDNUIsWUFBWSxDQUFDLFNBQVMsR0FBRyxpQkFBZSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztvQkFDbkUsWUFBWSxDQUFDLGVBQWUsR0FBRyxpQkFBZSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQUksQ0FBQztpQkFDMUU7Z0JBQ0QsWUFBWSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7Z0JBQ2xDLFlBQVksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO2FBQ3JDO1lBQ0QsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQU0sSUFBSSxDQUFDLGFBQWEsT0FBSSxDQUFDO2FBQzFEO1NBQ0Y7S0FDRjs7OztJQUVELGdDQUFNOzs7SUFBTjs7UUFDRSxJQUFNLFlBQVksd0JBQVEsSUFBSSxDQUFDLFlBQVksRUFBRzs7UUFDOUMsSUFBTSxZQUFZLHdCQUFRLElBQUksQ0FBQyxZQUFZLEVBQUc7O1FBQzlDLElBQU0sWUFBWSx3QkFBUSxJQUFJLENBQUMsWUFBWSxFQUFHO1FBRTlDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2YsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsU0FBUztnQkFDdkIsWUFBWSxFQUFFLFlBQVk7YUFDM0IsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDZixZQUFZLEVBQUUsWUFBWTtnQkFDMUIsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFlBQVksRUFBRSxZQUFZO2dCQUMxQixZQUFZLEVBQUUsU0FBUzthQUN4QixDQUFDLENBQUM7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUNmLFlBQVksRUFBRSxZQUFZO2dCQUMxQixVQUFVLEVBQUUsU0FBUztnQkFDckIsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLFlBQVksRUFBRSxTQUFTO2FBQ3hCLENBQUMsQ0FBQztZQUNILFlBQVksY0FBVyxDQUFDLENBQUM7WUFDekIsWUFBWSxpQkFBYyxTQUFTLENBQUM7U0FDckM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDMUMsWUFBWSxpQkFBYyxNQUFNLENBQUM7WUFDakMsWUFBWSx1QkFBb0IsTUFBTSxDQUFDO1lBQ3ZDLFlBQVksaUJBQWMsTUFBTSxDQUFDO1lBQ2pDLFlBQVksaUJBQWMsTUFBTSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUM7S0FDdkM7Ozs7O0lBRUQsbUNBQVM7Ozs7SUFBVCxVQUFVLEdBQUc7O1FBQ1gsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDOztRQUNiLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs7UUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDWCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFELEVBQUUsSUFBSSxFQUFFLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDcEMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNsQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQztTQUN0QjtRQUNELE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztLQUM5Qjs7OztJQUVELDRDQUFrQjs7O0lBQWxCO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7S0FDRjs7OztJQUVELHFDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNmOztnQkFoVkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLHExQkFBc0M7b0JBQ3RDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzs7OztnQkFUQyxVQUFVOzs7MEJBOEJULEtBQUs7K0JBRUwsS0FBSzsrQkFFTCxLQUFLOytCQUVMLEtBQUs7a0NBRUwsS0FBSzs4QkFFTCxLQUFLO3dCQUVMLEtBQUs7bUNBRUwsS0FBSztxQ0FFTCxLQUFLO3lCQUVMLEtBQUs7dUJBUUwsS0FBSzsyQkFRTCxLQUFLOytCQXNCTCxNQUFNO3FCQUdOLFdBQVcsU0FBQyxpQkFBaUI7dUJBRTdCLFdBQVcsU0FBQyxzQkFBc0I7d0JBRWxDLFdBQVcsU0FBQyx1QkFBdUI7c0JBRW5DLFdBQVcsU0FBQyxxQkFBcUI7eUJBRWpDLFdBQVcsU0FBQyx3QkFBd0I7NEJBRXBDLFdBQVcsU0FBQyx3QkFBd0I7MEJBRXBDLFdBQVcsU0FBQyxzQkFBc0I7OzBCQTVHckM7O1NBaUJhLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBJbnB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBFbGVtZW50UmVmLFxuICBPbkNoYW5nZXMsXG4gIEFmdGVyVmlld0NoZWNrZWRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0RyYXdlciwgbnptLWRyYXdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIERyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcyB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLWRyYXdlcic7XG4gIHNpZGViYXJTdHlsZUZpbmFsOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBjb250ZW50U3R5bGVGaW5hbDogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgb3ZlcmxheVN0eWxlRmluYWw6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHNpZGViYXJXaWR0aDogbnVtYmVyID0gMDtcbiAgc2lkZWJhckhlaWdodDogbnVtYmVyID0gMDtcbiAgc2lkZWJhclRvcDogbnVtYmVyID0gMDtcbiAgZHJhZ0hhbmRsZVRvcDogbnVtYmVyID0gMDtcbiAgdG91Y2hJZGVudGlmaWVyOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaFN0YXJ0WDogbnVtYmVyID0gbnVsbDtcbiAgdG91Y2hTdGFydFk6IG51bWJlciA9IG51bGw7XG4gIHRvdWNoQ3VycmVudFg6IG51bWJlciA9IG51bGw7XG4gIHRvdWNoQ3VycmVudFk6IG51bWJlciA9IG51bGw7XG4gIHRvdWNoU3VwcG9ydGVkOiBib29sZWFuID0gdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgJ29udG91Y2hzdGFydCcgaW4gd2luZG93O1xuXG4gIHByaXZhdGUgX2RvY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9vcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Bvc2l0aW9uOiBzdHJpbmcgPSAnbGVmdCc7XG5cbiAgQElucHV0KClcbiAgc2lkZWJhcjogYW55O1xuICBASW5wdXQoKVxuICBzaWRlYmFyU3R5bGU6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIEBJbnB1dCgpXG4gIGNvbnRlbnRTdHlsZTogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgQElucHV0KClcbiAgb3ZlcmxheVN0eWxlOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKVxuICBkcmFnSGFuZGxlU3R5bGU6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIEBJbnB1dCgpXG4gIHRyYW5zaXRpb25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgdG91Y2g6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBlbmFibGVEcmFnSGFuZGxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZHJhZ1RvZ2dsZURpc3RhbmNlOiBudW1iZXIgPSAzMDtcbiAgQElucHV0KClcbiAgZ2V0IGRvY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZG9ja2VkO1xuICB9XG4gIHNldCBkb2NrZWQodikge1xuICAgIHRoaXMuX2RvY2tlZCA9IHY7XG4gICAgdGhpcy5kb2NrZWRDbHMgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBvcGVuKCkge1xuICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICB9XG4gIHNldCBvcGVuKHYpIHtcbiAgICB0aGlzLl9vcGVuID0gdjtcbiAgICB0aGlzLm9wZW5DbHMgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBwb3NpdGlvbih2KSB7XG4gICAgdGhpcy5fcG9zaXRpb24gPSB2O1xuICAgIHRoaXMucmlnaHQgPSBmYWxzZTtcbiAgICB0aGlzLmxlZnQgPSBmYWxzZTtcbiAgICB0aGlzLnRvcCA9IGZhbHNlO1xuICAgIHRoaXMuYm90dG9tID0gZmFsc2U7XG4gICAgc3dpdGNoICh2KSB7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHRoaXMucmlnaHQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0aGlzLmxlZnQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIHRoaXMudG9wID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB0aGlzLmJvdHRvbSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25PcGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyJylcbiAgYW06IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1sZWZ0JylcbiAgbGVmdDogYm9vbGVhbiA9IHRoaXMuX3Bvc2l0aW9uID09PSAnbGVmdCc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyLXJpZ2h0JylcbiAgcmlnaHQ6IGJvb2xlYW4gPSB0aGlzLl9wb3NpdGlvbiA9PT0gJ3JpZ2h0JztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItdG9wJylcbiAgdG9wOiBib29sZWFuID0gdGhpcy5fcG9zaXRpb24gPT0gJ3RvcCc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyLWJvdHRvbScpXG4gIGJvdHRvbTogYm9vbGVhbiA9IHRoaXMuX3Bvc2l0aW9uID09ICdib3R0b20nO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1kb2NrZWQnKVxuICBkb2NrZWRDbHM6IGJvb2xlYW4gPSB0aGlzLl9kb2NrZWQ7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyLW9wZW4nKVxuICBvcGVuQ2xzOiBib29sZWFuID0gdGhpcy5fb3BlbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbDogRWxlbWVudFJlZikge31cblxuICBvbk92ZXJsYXlDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLl9vcGVuKSB7XG4gICAgICB0aGlzLm9uT3BlbkNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGlzVG91Y2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG91Y2hJZGVudGlmaWVyICE9PSBudWxsO1xuICB9XG5cbiAgb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgY29uc3QgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICB0aGlzLnRvdWNoSWRlbnRpZmllciA9IHRvdWNoLmlkZW50aWZpZXI7XG4gICAgdGhpcy50b3VjaFN0YXJ0WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy50b3VjaFN0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgdGhpcy50b3VjaEN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICB0aGlzLnRvdWNoQ3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICB9XG5cbiAgb25Ub3VjaE1vdmUoZXYpIHtcbiAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCBldi5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBpZiAoZXYuY2hhbmdlZFRvdWNoZXNbaW5kXS5pZGVudGlmaWVyID09PSB0aGlzLnRvdWNoSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnRvdWNoQ3VycmVudFggPSBldi5jaGFuZ2VkVG91Y2hlc1tpbmRdLmNsaWVudFg7XG4gICAgICAgIHRoaXMudG91Y2hDdXJyZW50WSA9IGV2LmNoYW5nZWRUb3VjaGVzW2luZF0uY2xpZW50WTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBvblRvdWNoRW5kKCkge1xuICAgIGNvbnN0IHRvdWNoV2lkdGggPSB0aGlzLnRvdWNoU2lkZWJhcldpZHRoKCk7XG4gICAgaWYgKFxuICAgICAgKHRoaXMuX29wZW4gJiYgdG91Y2hXaWR0aCA8IHRoaXMuc2lkZWJhcldpZHRoIC0gdGhpcy5kcmFnVG9nZ2xlRGlzdGFuY2UpIHx8XG4gICAgICAoIXRoaXMuX29wZW4gJiYgdG91Y2hXaWR0aCA+IHRoaXMuZHJhZ1RvZ2dsZURpc3RhbmNlKVxuICAgICkge1xuICAgICAgdGhpcy5vbk9wZW5DaGFuZ2UuZW1pdCghdGhpcy5fb3Blbik7XG4gICAgfVxuXG4gICAgY29uc3QgdG91Y2hIZWlnaHQgPSB0aGlzLnRvdWNoU2lkZWJhckhlaWdodCgpO1xuICAgIGlmIChcbiAgICAgICh0aGlzLl9vcGVuICYmIHRvdWNoSGVpZ2h0IDwgdGhpcy5zaWRlYmFySGVpZ2h0IC0gdGhpcy5kcmFnVG9nZ2xlRGlzdGFuY2UpIHx8XG4gICAgICAoIXRoaXMuX29wZW4gJiYgdG91Y2hIZWlnaHQgPiB0aGlzLmRyYWdUb2dnbGVEaXN0YW5jZSlcbiAgICApIHtcbiAgICAgIHRoaXMub25PcGVuQ2hhbmdlLmVtaXQoIXRoaXMuX29wZW4pO1xuICAgIH1cbiAgICB0aGlzLnRvdWNoSWRlbnRpZmllciA9IG51bGw7XG4gICAgdGhpcy50b3VjaFN0YXJ0WCA9IG51bGw7XG4gICAgdGhpcy50b3VjaFN0YXJ0WSA9IG51bGw7XG4gICAgdGhpcy50b3VjaEN1cnJlbnRYID0gbnVsbDtcbiAgICB0aGlzLnRvdWNoQ3VycmVudFkgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBzYXZlU2lkZWJhclNpemUoKSB7XG4gICAgY29uc3Qgc2lkZWJhciA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI3NpZGViYXInKTtcbiAgICBjb25zdCBkcmFnSGFuZGxlID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjZHJhZ0hhbmRsZScpO1xuXG4gICAgY29uc3Qgd2lkdGggPSBzaWRlYmFyLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHNpZGViYXIub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IHNpZGViYXJUb3AgPSB0aGlzLmdldE9mZnNldChzaWRlYmFyKS50b3A7XG4gICAgY29uc3QgZHJhZ0hhbmRsZVRvcCA9IHRoaXMuZ2V0T2Zmc2V0KGRyYWdIYW5kbGUpLnRvcDtcblxuICAgIGlmICh3aWR0aCAhPT0gdGhpcy5zaWRlYmFyV2lkdGgpIHtcbiAgICAgIHRoaXMuc2lkZWJhcldpZHRoID0gd2lkdGg7XG4gICAgfVxuICAgIGlmIChoZWlnaHQgIT09IHRoaXMuc2lkZWJhckhlaWdodCkge1xuICAgICAgdGhpcy5zaWRlYmFySGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoc2lkZWJhclRvcCAhPT0gdGhpcy5zaWRlYmFyVG9wKSB7XG4gICAgICB0aGlzLnNpZGViYXJUb3AgPSBzaWRlYmFyVG9wO1xuICAgIH1cbiAgICBpZiAoZHJhZ0hhbmRsZVRvcCAhPT0gdGhpcy5kcmFnSGFuZGxlVG9wKSB7XG4gICAgICB0aGlzLmRyYWdIYW5kbGVUb3AgPSBkcmFnSGFuZGxlVG9wO1xuICAgIH1cbiAgfVxuXG4gIHRvdWNoU2lkZWJhcldpZHRoKCkge1xuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgaWYgKHRoaXMuX29wZW4gJiYgd2luZG93LmlubmVyV2lkdGggLSB0aGlzLnRvdWNoU3RhcnRYIDwgdGhpcy5zaWRlYmFyV2lkdGgpIHtcbiAgICAgICAgaWYgKHRoaXMudG91Y2hDdXJyZW50WCA+IHRoaXMudG91Y2hTdGFydFgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyV2lkdGggKyB0aGlzLnRvdWNoU3RhcnRYIC0gdGhpcy50b3VjaEN1cnJlbnRYO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXJXaWR0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMudG91Y2hDdXJyZW50WCwgdGhpcy5zaWRlYmFyV2lkdGgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBpZiAodGhpcy5fb3BlbiAmJiB0aGlzLnRvdWNoU3RhcnRYIDwgdGhpcy5zaWRlYmFyV2lkdGgpIHtcbiAgICAgICAgaWYgKHRoaXMudG91Y2hDdXJyZW50WCA+IHRoaXMudG91Y2hTdGFydFgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhcldpZHRoIC0gdGhpcy50b3VjaFN0YXJ0WCArIHRoaXMudG91Y2hDdXJyZW50WDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdWNoQ3VycmVudFgsIHRoaXMuc2lkZWJhcldpZHRoKTtcbiAgICB9XG4gIH1cblxuICB0b3VjaFNpZGViYXJIZWlnaHQoKSB7XG4gICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9vcGVuICYmXG4gICAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gdGhpcy50b3VjaFN0YXJ0WSArIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wIDwgdGhpcy5zaWRlYmFySGVpZ2h0XG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMudG91Y2hDdXJyZW50WSA+IHRoaXMudG91Y2hTdGFydFkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFySGVpZ2h0ICsgdGhpcy50b3VjaFN0YXJ0WSAtIHRoaXMudG91Y2hDdXJyZW50WTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFySGVpZ2h0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMudG91Y2hDdXJyZW50WSArIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wLFxuICAgICAgICB0aGlzLnNpZGViYXJIZWlnaHRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgY29uc3QgdG91Y2hTdGFydE9mZnNldFkgPSB0aGlzLnRvdWNoU3RhcnRZIC0gdGhpcy5zaWRlYmFyVG9wO1xuICAgICAgaWYgKHRoaXMuX29wZW4gJiYgdG91Y2hTdGFydE9mZnNldFkgPCB0aGlzLnNpZGViYXJIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMudG91Y2hDdXJyZW50WSA+IHRoaXMudG91Y2hTdGFydFkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXJIZWlnaHQgLSB0aGlzLnRvdWNoU3RhcnRZICsgdGhpcy50b3VjaEN1cnJlbnRZO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMudG91Y2hDdXJyZW50WSAtIHRoaXMuZHJhZ0hhbmRsZVRvcCwgdGhpcy5zaWRlYmFySGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJTdHlsZSh7IHNpZGViYXJTdHlsZSwgaXNUb3VjaGluZywgb3ZlcmxheVN0eWxlLCBjb250ZW50U3R5bGUgfSkge1xuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3JpZ2h0JyB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoMCUpYDtcbiAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgwJSlgO1xuICAgICAgaWYgKGlzVG91Y2hpbmcpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMudG91Y2hTaWRlYmFyV2lkdGgoKSAvIHRoaXMuc2lkZWJhcldpZHRoO1xuICAgICAgICAvLyBzbGlkZSBvcGVuIHRvIHdoYXQgd2UgZHJhZ2dlZFxuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHNpZGViYXJTdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgtJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoLSR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgIH1cbiAgICAgICAgb3ZlcmxheVN0eWxlLm9wYWNpdHkgPSBwZXJjZW50YWdlO1xuICAgICAgICBvdmVybGF5U3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZW50U3R5bGUpIHtcbiAgICAgICAgY29udGVudFN0eWxlW3RoaXMuX3Bvc2l0aW9uXSA9IGAke3RoaXMuc2lkZWJhcldpZHRofXB4YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHNpZGViYXJTdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgwJSlgO1xuICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKDAlKWA7XG4gICAgICBpZiAoaXNUb3VjaGluZykge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy50b3VjaFNpZGViYXJIZWlnaHQoKSAvIHRoaXMuc2lkZWJhckhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgIHNpZGViYXJTdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgkeygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgkeygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoLSR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKC0keygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICB9XG4gICAgICAgIG92ZXJsYXlTdHlsZS5vcGFjaXR5ID0gcGVyY2VudGFnZTtcbiAgICAgICAgb3ZlcmxheVN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICB9XG4gICAgICBpZiAoY29udGVudFN0eWxlKSB7XG4gICAgICAgIGNvbnRlbnRTdHlsZVt0aGlzLl9wb3NpdGlvbl0gPSBgJHt0aGlzLnNpZGViYXJIZWlnaHR9cHhgO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCBzaWRlYmFyU3R5bGUgPSB7IC4uLnRoaXMuc2lkZWJhclN0eWxlIH07XG4gICAgY29uc3QgY29udGVudFN0eWxlID0geyAuLi50aGlzLmNvbnRlbnRTdHlsZSB9O1xuICAgIGNvbnN0IG92ZXJsYXlTdHlsZSA9IHsgLi4udGhpcy5vdmVybGF5U3R5bGUgfTtcblxuICAgIGlmICh0aGlzLmlzVG91Y2hpbmcoKSkge1xuICAgICAgdGhpcy5yZW5kZXJTdHlsZSh7XG4gICAgICAgIHNpZGViYXJTdHlsZTogc2lkZWJhclN0eWxlLFxuICAgICAgICBpc1RvdWNoaW5nOiB0cnVlLFxuICAgICAgICBjb250ZW50U3R5bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3ZlcmxheVN0eWxlOiBvdmVybGF5U3R5bGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fZG9ja2VkKSB7XG4gICAgICB0aGlzLmRvY2tlZENscyA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlclN0eWxlKHtcbiAgICAgICAgc2lkZWJhclN0eWxlOiBzaWRlYmFyU3R5bGUsXG4gICAgICAgIGlzVG91Y2hpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGVudFN0eWxlOiBjb250ZW50U3R5bGUsXG4gICAgICAgIG92ZXJsYXlTdHlsZTogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wZW4pIHtcbiAgICAgIHRoaXMub3BlbkNscyA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlclN0eWxlKHtcbiAgICAgICAgc2lkZWJhclN0eWxlOiBzaWRlYmFyU3R5bGUsXG4gICAgICAgIGlzVG91Y2hpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGVudFN0eWxlOiB1bmRlZmluZWQsXG4gICAgICAgIG92ZXJsYXlTdHlsZTogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIG92ZXJsYXlTdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgIG92ZXJsYXlTdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzVG91Y2hpbmcoKSB8fCAhdGhpcy50cmFuc2l0aW9ucykge1xuICAgICAgc2lkZWJhclN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgIGNvbnRlbnRTdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgb3ZlcmxheVN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgfVxuICAgIHRoaXMuc2lkZWJhclN0eWxlRmluYWwgPSBzaWRlYmFyU3R5bGU7XG4gICAgdGhpcy5jb250ZW50U3R5bGVGaW5hbCA9IGNvbnRlbnRTdHlsZTtcbiAgICB0aGlzLm92ZXJsYXlTdHlsZUZpbmFsID0gb3ZlcmxheVN0eWxlO1xuICB9XG5cbiAgZ2V0T2Zmc2V0KGVsZSkge1xuICAgIGxldCBlbCA9IGVsZTtcbiAgICBsZXQgX3ggPSAwO1xuICAgIGxldCBfeSA9IDA7XG4gICAgd2hpbGUgKGVsICYmICFpc05hTihlbC5vZmZzZXRMZWZ0KSAmJiAhaXNOYU4oZWwub2Zmc2V0VG9wKSkge1xuICAgICAgX3ggKz0gZWwub2Zmc2V0TGVmdCAtIGVsLnNjcm9sbExlZnQ7XG4gICAgICBfeSArPSBlbC5vZmZzZXRUb3AgLSBlbC5zY3JvbGxUb3A7XG4gICAgICBlbCA9IGVsLm9mZnNldFBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHsgdG9wOiBfeSwgbGVmdDogX3ggfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNUb3VjaGluZygpKSB7XG4gICAgICB0aGlzLnNhdmVTaWRlYmFyU2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cbn1cbiJdfQ==