ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
477 lines (476 loc) • 43.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, HostBinding, Output, EventEmitter, ElementRef } from '@angular/core';
export class DrawerComponent {
/**
* @param {?} _el
*/
constructor(_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;
}
/**
* @return {?}
*/
get docked() {
return this._docked;
}
/**
* @param {?} v
* @return {?}
*/
set docked(v) {
this._docked = v;
this.dockedCls = v;
}
/**
* @return {?}
*/
get open() {
return this._open;
}
/**
* @param {?} v
* @return {?}
*/
set open(v) {
this._open = v;
this.openCls = v;
}
/**
* @param {?} v
* @return {?}
*/
set position(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;
}
}
/**
* @return {?}
*/
onOverlayClicked() {
if (this._open) {
this.onOpenChange.emit(true);
}
}
/**
* @return {?}
*/
isTouching() {
return this.touchIdentifier !== null;
}
/**
* @param {?} event
* @return {?}
*/
onTouchStart(event) {
/** @type {?} */
const 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 {?}
*/
onTouchMove(ev) {
for (let 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 {?}
*/
onTouchEnd() {
/** @type {?} */
const touchWidth = this.touchSidebarWidth();
if ((this._open && touchWidth < this.sidebarWidth - this.dragToggleDistance) ||
(!this._open && touchWidth > this.dragToggleDistance)) {
this.onOpenChange.emit(!this._open);
}
/** @type {?} */
const 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 {?}
*/
saveSidebarSize() {
/** @type {?} */
const sidebar = this._el.nativeElement.querySelector('#sidebar');
/** @type {?} */
const dragHandle = this._el.nativeElement.querySelector('#dragHandle');
/** @type {?} */
const width = sidebar.offsetWidth;
/** @type {?} */
const height = sidebar.offsetHeight;
/** @type {?} */
const sidebarTop = this.getOffset(sidebar).top;
/** @type {?} */
const 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 {?}
*/
touchSidebarWidth() {
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 {?}
*/
touchSidebarHeight() {
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 {?} */
const 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 {?}
*/
renderStyle({ sidebarStyle, isTouching, overlayStyle, contentStyle }) {
if (this._position === 'right' || this._position === 'left') {
sidebarStyle.transform = `translateX(0%)`;
sidebarStyle.WebkitTransform = `translateX(0%)`;
if (isTouching) {
/** @type {?} */
const 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 {?} */
const 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 {?}
*/
update() {
/** @type {?} */
const sidebarStyle = Object.assign({}, this.sidebarStyle);
/** @type {?} */
const contentStyle = Object.assign({}, this.contentStyle);
/** @type {?} */
const overlayStyle = Object.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 {?}
*/
getOffset(ele) {
/** @type {?} */
let el = ele;
/** @type {?} */
let _x = 0;
/** @type {?} */
let _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 {?}
*/
ngAfterViewChecked() {
if (!this.isTouching()) {
this.saveSidebarSize();
}
}
/**
* @return {?}
*/
ngOnChanges() {
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 = () => [
{ 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',] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiZHJhd2VyL2RyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxXQUFXLEVBQ1gsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBR1gsTUFBTSxlQUFlLENBQUM7QUFPdkIsTUFBTTs7OztJQThGSixZQUFvQixHQUFlO1FBQWYsUUFBRyxHQUFILEdBQUcsQ0FBWTt5QkE3RmYsV0FBVztpQ0FDVyxFQUFFO2lDQUNGLEVBQUU7aUNBQ0YsRUFBRTs0QkFDckIsQ0FBQzs2QkFDQSxDQUFDOzBCQUNKLENBQUM7NkJBQ0UsQ0FBQzsrQkFDQyxJQUFJOzJCQUNSLElBQUk7MkJBQ0osSUFBSTs2QkFDRixJQUFJOzZCQUNKLElBQUk7OEJBQ0YsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLGNBQWMsSUFBSSxNQUFNO3VCQUVyRCxLQUFLO3FCQUNQLEtBQUs7eUJBQ0YsTUFBTTs0QkFLRyxFQUFFOzRCQUVGLEVBQUU7NEJBRUYsRUFBRTsrQkFFQyxFQUFFOzJCQUVuQixJQUFJO3FCQUVWLElBQUk7Z0NBRU8sSUFBSTtrQ0FFSCxFQUFFOzRCQXdDRyxJQUFJLFlBQVksRUFBTztrQkFHM0MsSUFBSTtvQkFFRixJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU07cUJBRXhCLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTzttQkFFNUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLO3NCQUVwQixJQUFJLENBQUMsU0FBUyxJQUFJLFFBQVE7eUJBRXZCLElBQUksQ0FBQyxPQUFPO3VCQUVkLElBQUksQ0FBQyxLQUFLO0tBRVU7Ozs7SUF4RHZDLElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUNyQjs7Ozs7SUFDRCxJ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OztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtLQUNGOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNmOzs7WUFoVkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLHExQkFBc0M7Z0JBQ3RDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3RDOzs7O1lBVEMsVUFBVTs7O3NCQThCVCxLQUFLOzJCQUVMLEtBQUs7MkJBRUwsS0FBSzsyQkFFTCxLQUFLOzhCQUVMLEtBQUs7MEJBRUwsS0FBSztvQkFFTCxLQUFLOytCQUVMLEtBQUs7aUNBRUwsS0FBSztxQkFFTCxLQUFLO21CQVFMLEtBQUs7dUJBUUwsS0FBSzsyQkFzQkwsTUFBTTtpQkFHTixXQUFXLFNBQUMsaUJBQWlCO21CQUU3QixXQUFXLFNBQUMsc0JBQXNCO29CQUVsQyxXQUFXLFNBQUMsdUJBQXVCO2tCQUVuQyxXQUFXLFNBQUMscUJBQXFCO3FCQUVqQyxXQUFXLFNBQUMsd0JBQXdCO3dCQUVwQyxXQUFXLFNBQUMsd0JBQXdCO3NCQUVwQyxXQUFXLFNBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIEhvc3RCaW5kaW5nLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBBZnRlclZpZXdDaGVja2VkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdEcmF3ZXIsIG56bS1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1kcmF3ZXInO1xuICBzaWRlYmFyU3R5bGVGaW5hbDogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgY29udGVudFN0eWxlRmluYWw6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIG92ZXJsYXlTdHlsZUZpbmFsOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBzaWRlYmFyV2lkdGg6IG51bWJlciA9IDA7XG4gIHNpZGViYXJIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHNpZGViYXJUb3A6IG51bWJlciA9IDA7XG4gIGRyYWdIYW5kbGVUb3A6IG51bWJlciA9IDA7XG4gIHRvdWNoSWRlbnRpZmllcjogbnVtYmVyID0gbnVsbDtcbiAgdG91Y2hTdGFydFg6IG51bWJlciA9IG51bGw7XG4gIHRvdWNoU3RhcnRZOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaEN1cnJlbnRYOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaEN1cnJlbnRZOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaFN1cHBvcnRlZDogYm9vbGVhbiA9IHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdztcblxuICBwcml2YXRlIF9kb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wb3NpdGlvbjogc3RyaW5nID0gJ2xlZnQnO1xuXG4gIEBJbnB1dCgpXG4gIHNpZGViYXI6IGFueTtcbiAgQElucHV0KClcbiAgc2lkZWJhclN0eWxlOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKVxuICBjb250ZW50U3R5bGU6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIEBJbnB1dCgpXG4gIG92ZXJsYXlTdHlsZTogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgQElucHV0KClcbiAgZHJhZ0hhbmRsZVN0eWxlOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKVxuICB0cmFuc2l0aW9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHRvdWNoOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZW5hYmxlRHJhZ0hhbmRsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGRyYWdUb2dnbGVEaXN0YW5jZTogbnVtYmVyID0gMzA7XG4gIEBJbnB1dCgpXG4gIGdldCBkb2NrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvY2tlZDtcbiAgfVxuICBzZXQgZG9ja2VkKHYpIHtcbiAgICB0aGlzLl9kb2NrZWQgPSB2O1xuICAgIHRoaXMuZG9ja2VkQ2xzID0gdjtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlbjtcbiAgfVxuICBzZXQgb3Blbih2KSB7XG4gICAgdGhpcy5fb3BlbiA9IHY7XG4gICAgdGhpcy5vcGVuQ2xzID0gdjtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcG9zaXRpb24odikge1xuICAgIHRoaXMuX3Bvc2l0aW9uID0gdjtcbiAgICB0aGlzLnJpZ2h0ID0gZmFsc2U7XG4gICAgdGhpcy5sZWZ0ID0gZmFsc2U7XG4gICAgdGhpcy50b3AgPSBmYWxzZTtcbiAgICB0aGlzLmJvdHRvbSA9IGZhbHNlO1xuICAgIHN3aXRjaCAodikge1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB0aGlzLnJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgdGhpcy5sZWZ0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICB0aGlzLnRvcCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGhpcy5ib3R0b20gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uT3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlcicpXG4gIGFtOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItbGVmdCcpXG4gIGxlZnQ6IGJvb2xlYW4gPSB0aGlzLl9wb3NpdGlvbiA9PT0gJ2xlZnQnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1yaWdodCcpXG4gIHJpZ2h0OiBib29sZWFuID0gdGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyLXRvcCcpXG4gIHRvcDogYm9vbGVhbiA9IHRoaXMuX3Bvc2l0aW9uID09ICd0b3AnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1ib3R0b20nKVxuICBib3R0b206IGJvb2xlYW4gPSB0aGlzLl9wb3NpdGlvbiA9PSAnYm90dG9tJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItZG9ja2VkJylcbiAgZG9ja2VkQ2xzOiBib29sZWFuID0gdGhpcy5fZG9ja2VkO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1vcGVuJylcbiAgb3BlbkNsczogYm9vbGVhbiA9IHRoaXMuX29wZW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgb25PdmVybGF5Q2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5fb3Blbikge1xuICAgICAgdGhpcy5vbk9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBpc1RvdWNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvdWNoSWRlbnRpZmllciAhPT0gbnVsbDtcbiAgfVxuXG4gIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgIGNvbnN0IHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgdGhpcy50b3VjaElkZW50aWZpZXIgPSB0b3VjaC5pZGVudGlmaWVyO1xuICAgIHRoaXMudG91Y2hTdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHRoaXMudG91Y2hTdGFydFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMudG91Y2hDdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy50b3VjaEN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgfVxuXG4gIG9uVG91Y2hNb3ZlKGV2KSB7XG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgZXYuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpbmQrKykge1xuICAgICAgaWYgKGV2LmNoYW5nZWRUb3VjaGVzW2luZF0uaWRlbnRpZmllciA9PT0gdGhpcy50b3VjaElkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy50b3VjaEN1cnJlbnRYID0gZXYuY2hhbmdlZFRvdWNoZXNbaW5kXS5jbGllbnRYO1xuICAgICAgICB0aGlzLnRvdWNoQ3VycmVudFkgPSBldi5jaGFuZ2VkVG91Y2hlc1tpbmRdLmNsaWVudFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgb25Ub3VjaEVuZCgpIHtcbiAgICBjb25zdCB0b3VjaFdpZHRoID0gdGhpcy50b3VjaFNpZGViYXJXaWR0aCgpO1xuICAgIGlmIChcbiAgICAgICh0aGlzLl9vcGVuICYmIHRvdWNoV2lkdGggPCB0aGlzLnNpZGViYXJXaWR0aCAtIHRoaXMuZHJhZ1RvZ2dsZURpc3RhbmNlKSB8fFxuICAgICAgKCF0aGlzLl9vcGVuICYmIHRvdWNoV2lkdGggPiB0aGlzLmRyYWdUb2dnbGVEaXN0YW5jZSlcbiAgICApIHtcbiAgICAgIHRoaXMub25PcGVuQ2hhbmdlLmVtaXQoIXRoaXMuX29wZW4pO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdWNoSGVpZ2h0ID0gdGhpcy50b3VjaFNpZGViYXJIZWlnaHQoKTtcbiAgICBpZiAoXG4gICAgICAodGhpcy5fb3BlbiAmJiB0b3VjaEhlaWdodCA8IHRoaXMuc2lkZWJhckhlaWdodCAtIHRoaXMuZHJhZ1RvZ2dsZURpc3RhbmNlKSB8fFxuICAgICAgKCF0aGlzLl9vcGVuICYmIHRvdWNoSGVpZ2h0ID4gdGhpcy5kcmFnVG9nZ2xlRGlzdGFuY2UpXG4gICAgKSB7XG4gICAgICB0aGlzLm9uT3BlbkNoYW5nZS5lbWl0KCF0aGlzLl9vcGVuKTtcbiAgICB9XG4gICAgdGhpcy50b3VjaElkZW50aWZpZXIgPSBudWxsO1xuICAgIHRoaXMudG91Y2hTdGFydFggPSBudWxsO1xuICAgIHRoaXMudG91Y2hTdGFydFkgPSBudWxsO1xuICAgIHRoaXMudG91Y2hDdXJyZW50WCA9IG51bGw7XG4gICAgdGhpcy50b3VjaEN1cnJlbnRZID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgc2F2ZVNpZGViYXJTaXplKCkge1xuICAgIGNvbnN0IHNpZGViYXIgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzaWRlYmFyJyk7XG4gICAgY29uc3QgZHJhZ0hhbmRsZSA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2RyYWdIYW5kbGUnKTtcblxuICAgIGNvbnN0IHdpZHRoID0gc2lkZWJhci5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBzaWRlYmFyLm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBzaWRlYmFyVG9wID0gdGhpcy5nZXRPZmZzZXQoc2lkZWJhcikudG9wO1xuICAgIGNvbnN0IGRyYWdIYW5kbGVUb3AgPSB0aGlzLmdldE9mZnNldChkcmFnSGFuZGxlKS50b3A7XG5cbiAgICBpZiAod2lkdGggIT09IHRoaXMuc2lkZWJhcldpZHRoKSB7XG4gICAgICB0aGlzLnNpZGViYXJXaWR0aCA9IHdpZHRoO1xuICAgIH1cbiAgICBpZiAoaGVpZ2h0ICE9PSB0aGlzLnNpZGViYXJIZWlnaHQpIHtcbiAgICAgIHRoaXMuc2lkZWJhckhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgaWYgKHNpZGViYXJUb3AgIT09IHRoaXMuc2lkZWJhclRvcCkge1xuICAgICAgdGhpcy5zaWRlYmFyVG9wID0gc2lkZWJhclRvcDtcbiAgICB9XG4gICAgaWYgKGRyYWdIYW5kbGVUb3AgIT09IHRoaXMuZHJhZ0hhbmRsZVRvcCkge1xuICAgICAgdGhpcy5kcmFnSGFuZGxlVG9wID0gZHJhZ0hhbmRsZVRvcDtcbiAgICB9XG4gIH1cblxuICB0b3VjaFNpZGViYXJXaWR0aCgpIHtcbiAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIGlmICh0aGlzLl9vcGVuICYmIHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy50b3VjaFN0YXJ0WCA8IHRoaXMuc2lkZWJhcldpZHRoKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFggPiB0aGlzLnRvdWNoU3RhcnRYKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhcldpZHRoICsgdGhpcy50b3VjaFN0YXJ0WCAtIHRoaXMudG91Y2hDdXJyZW50WDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyV2lkdGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aC5taW4od2luZG93LmlubmVyV2lkdGggLSB0aGlzLnRvdWNoQ3VycmVudFgsIHRoaXMuc2lkZWJhcldpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgaWYgKHRoaXMuX29wZW4gJiYgdGhpcy50b3VjaFN0YXJ0WCA8IHRoaXMuc2lkZWJhcldpZHRoKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFggPiB0aGlzLnRvdWNoU3RhcnRYKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhcldpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXJXaWR0aCAtIHRoaXMudG91Y2hTdGFydFggKyB0aGlzLnRvdWNoQ3VycmVudFg7XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy50b3VjaEN1cnJlbnRYLCB0aGlzLnNpZGViYXJXaWR0aCk7XG4gICAgfVxuICB9XG5cbiAgdG91Y2hTaWRlYmFySGVpZ2h0KCkge1xuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fb3BlbiAmJlxuICAgICAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMudG91Y2hTdGFydFkgKyB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCA8IHRoaXMuc2lkZWJhckhlaWdodFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFkgPiB0aGlzLnRvdWNoU3RhcnRZKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhckhlaWdodCArIHRoaXMudG91Y2hTdGFydFkgLSB0aGlzLnRvdWNoQ3VycmVudFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhckhlaWdodDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLnRvdWNoQ3VycmVudFkgKyB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCxcbiAgICAgICAgdGhpcy5zaWRlYmFySGVpZ2h0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgIGNvbnN0IHRvdWNoU3RhcnRPZmZzZXRZID0gdGhpcy50b3VjaFN0YXJ0WSAtIHRoaXMuc2lkZWJhclRvcDtcbiAgICAgIGlmICh0aGlzLl9vcGVuICYmIHRvdWNoU3RhcnRPZmZzZXRZIDwgdGhpcy5zaWRlYmFySGVpZ2h0KSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFkgPiB0aGlzLnRvdWNoU3RhcnRZKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhckhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFySGVpZ2h0IC0gdGhpcy50b3VjaFN0YXJ0WSArIHRoaXMudG91Y2hDdXJyZW50WTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdWNoQ3VycmVudFkgLSB0aGlzLmRyYWdIYW5kbGVUb3AsIHRoaXMuc2lkZWJhckhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyU3R5bGUoeyBzaWRlYmFyU3R5bGUsIGlzVG91Y2hpbmcsIG92ZXJsYXlTdHlsZSwgY29udGVudFN0eWxlIH0pIHtcbiAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCcgfHwgdGhpcy5fcG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgc2lkZWJhclN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKDAlKWA7XG4gICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoMCUpYDtcbiAgICAgIGlmIChpc1RvdWNoaW5nKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLnRvdWNoU2lkZWJhcldpZHRoKCkgLyB0aGlzLnNpZGViYXJXaWR0aDtcbiAgICAgICAgLy8gc2xpZGUgb3BlbiB0byB3aGF0IHdlIGRyYWdnZWRcbiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoLSR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKC0keygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICB9XG4gICAgICAgIG92ZXJsYXlTdHlsZS5vcGFjaXR5ID0gcGVyY2VudGFnZTtcbiAgICAgICAgb3ZlcmxheVN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICB9XG4gICAgICBpZiAoY29udGVudFN0eWxlKSB7XG4gICAgICAgIGNvbnRlbnRTdHlsZVt0aGlzLl9wb3NpdGlvbl0gPSBgJHt0aGlzLnNpZGViYXJXaWR0aH1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5fcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoMCUpYDtcbiAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgwJSlgO1xuICAgICAgaWYgKGlzVG91Y2hpbmcpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMudG91Y2hTaWRlYmFySGVpZ2h0KCkgLyB0aGlzLnNpZGViYXJIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKC0keygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgtJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgfVxuICAgICAgICBvdmVybGF5U3R5bGUub3BhY2l0eSA9IHBlcmNlbnRhZ2U7XG4gICAgICAgIG92ZXJsYXlTdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRlbnRTdHlsZSkge1xuICAgICAgICBjb250ZW50U3R5bGVbdGhpcy5fcG9zaXRpb25dID0gYCR7dGhpcy5zaWRlYmFySGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgY29uc3Qgc2lkZWJhclN0eWxlID0geyAuLi50aGlzLnNpZGViYXJTdHlsZSB9O1xuICAgIGNvbnN0IGNvbnRlbnRTdHlsZSA9IHsgLi4udGhpcy5jb250ZW50U3R5bGUgfTtcbiAgICBjb25zdCBvdmVybGF5U3R5bGUgPSB7IC4uLnRoaXMub3ZlcmxheVN0eWxlIH07XG5cbiAgICBpZiAodGhpcy5pc1RvdWNoaW5nKCkpIHtcbiAgICAgIHRoaXMucmVuZGVyU3R5bGUoe1xuICAgICAgICBzaWRlYmFyU3R5bGU6IHNpZGViYXJTdHlsZSxcbiAgICAgICAgaXNUb3VjaGluZzogdHJ1ZSxcbiAgICAgICAgY29udGVudFN0eWxlOiB1bmRlZmluZWQsXG4gICAgICAgIG92ZXJsYXlTdHlsZTogb3ZlcmxheVN0eWxlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2RvY2tlZCkge1xuICAgICAgdGhpcy5kb2NrZWRDbHMgPSB0cnVlO1xuICAgICAgdGhpcy5yZW5kZXJTdHlsZSh7XG4gICAgICAgIHNpZGViYXJTdHlsZTogc2lkZWJhclN0eWxlLFxuICAgICAgICBpc1RvdWNoaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRlbnRTdHlsZTogY29udGVudFN0eWxlLFxuICAgICAgICBvdmVybGF5U3R5bGU6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vcGVuKSB7XG4gICAgICB0aGlzLm9wZW5DbHMgPSB0cnVlO1xuICAgICAgdGhpcy5yZW5kZXJTdHlsZSh7XG4gICAgICAgIHNpZGViYXJTdHlsZTogc2lkZWJhclN0eWxlLFxuICAgICAgICBpc1RvdWNoaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRlbnRTdHlsZTogdW5kZWZpbmVkLFxuICAgICAgICBvdmVybGF5U3R5bGU6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBvdmVybGF5U3R5bGUub3BhY2l0eSA9IDE7XG4gICAgICBvdmVybGF5U3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1RvdWNoaW5nKCkgfHwgIXRoaXMudHJhbnNpdGlvbnMpIHtcbiAgICAgIHNpZGViYXJTdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgICBjb250ZW50U3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgIG92ZXJsYXlTdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgIH1cbiAgICB0aGlzLnNpZGViYXJTdHlsZUZpbmFsID0gc2lkZWJhclN0eWxlO1xuICAgIHRoaXMuY29udGVudFN0eWxlRmluYWwgPSBjb250ZW50U3R5bGU7XG4gICAgdGhpcy5vdmVybGF5U3R5bGVGaW5hbCA9IG92ZXJsYXlTdHlsZTtcbiAgfVxuXG4gIGdldE9mZnNldChlbGUpIHtcbiAgICBsZXQgZWwgPSBlbGU7XG4gICAgbGV0IF94ID0gMDtcbiAgICBsZXQgX3kgPSAwO1xuICAgIHdoaWxlIChlbCAmJiAhaXNOYU4oZWwub2Zmc2V0TGVmdCkgJiYgIWlzTmFOKGVsLm9mZnNldFRvcCkpIHtcbiAgICAgIF94ICs9IGVsLm9mZnNldExlZnQgLSBlbC5zY3JvbGxMZWZ0O1xuICAgICAgX3kgKz0gZWwub2Zmc2V0VG9wIC0gZWwuc2Nyb2xsVG9wO1xuICAgICAgZWwgPSBlbC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB7IHRvcDogX3ksIGxlZnQ6IF94IH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzVG91Y2hpbmcoKSkge1xuICAgICAgdGhpcy5zYXZlU2lkZWJhclNpemUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG59XG4iXX0=