@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
419 lines • 34.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: drawer.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Component, Directive, ElementRef, HostListener, Input, ViewChild, ViewContainerRef } from '@angular/core';
import { isNumber, parseInt, trim } from 'lodash-es';
import { fromEvent, Subject } from 'rxjs';
import { distinctUntilChanged, debounceTime } from 'rxjs/operators';
var DrawerContentDirective = /** @class */ (function () {
function DrawerContentDirective(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
}
DrawerContentDirective.decorators = [
{ type: Directive, args: [{
selector: '[dDrawerContentHost]',
},] }
];
/** @nocollapse */
DrawerContentDirective.ctorParameters = function () { return [
{ type: ViewContainerRef }
]; };
return DrawerContentDirective;
}());
export { DrawerContentDirective };
if (false) {
/** @type {?} */
DrawerContentDirective.prototype.viewContainerRef;
}
var DrawerComponent = /** @class */ (function () {
function DrawerComponent(elementRef) {
this.elementRef = elementRef;
this.animateState = 'void';
this.width = '300px';
this.isCover = true;
this.fullScreen = false;
this.clickDoms = [];
this.animationDone = new Subject();
}
/**
* @return {?}
*/
DrawerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.setWidth(this.width);
this._isCover = this.isCover === undefined ? true : this.isCover;
// some browsers(ie11 & edge) fire the animation done event twice
this.animationDoneSub = this.animationDone.pipe(distinctUntilChanged((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
return x.fromState === y.fromState && x.toState === y.toState;
}))).subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
_this.onAnimationEnd(event);
}));
};
/**
* @param {?} width
* @return {?}
*/
DrawerComponent.prototype.setWidth = /**
* @param {?} width
* @return {?}
*/
function (width) {
if (width.indexOf('%') >= 0) {
/** @type {?} */
var widthStr = trim(width, '%');
/** @type {?} */
var widthNum = parseInt(widthStr, 10);
this._width = isNumber(widthNum) ? (widthNum * window.innerWidth / 100 + 'px') : '0px';
}
else {
this._width = width;
}
this.oldWidth = this._width;
};
/**
* @return {?}
*/
DrawerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.animationDoneSub) {
this.animationDoneSub.unsubscribe();
}
if (this.resizeSub) {
this.resizeSub.unsubscribe();
}
};
/**
* @param {?} event
* @return {?}
*/
DrawerComponent.prototype.keydownHandler = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.escKeyCloseable && !this.isHaveDialogOrUpload()) {
this.hide();
}
};
/**
* @param {?} event
* @return {?}
*/
DrawerComponent.prototype.onAnimationEnd = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.animateState === 'void') {
this.onHidden();
}
if (this.animateState === 'in' && this.afterOpened) {
this.afterOpened();
}
};
// Will overwrite by drawer service
// Will overwrite by drawer service
/**
* @return {?}
*/
DrawerComponent.prototype.onHidden =
// Will overwrite by drawer service
/**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
DrawerComponent.prototype.show = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.bodyScrollable) {
document.querySelector('body').classList.add('modal-open');
}
this.animateState = 'in';
this.isCover = this.isCover === undefined ? true : this.isCover;
if (!this.backdropCloseable || this.isCover) {
return;
}
/** @type {?} */
var documentClick = fromEvent(document, 'click');
setTimeout((/**
* @return {?}
*/
function () {
_this.subscription = documentClick.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (_this.clickDoms && _this.clickDoms.length > 0) {
_this.clickDoms.forEach((/**
* @param {?} dom
* @return {?}
*/
function (dom) {
if (dom !== null && dom.contains(event.target)) {
_this.hide();
return;
}
}));
}
else {
/** @type {?} */
var target = event.target;
// 一定要document.contains(event.target),因为event.target可能已经不在document里了,这个时候就不能进hide了
if (_this.animateState === 'in' && (!_this.elementRef.nativeElement.contains(target) && document.body.contains(target))
&& !_this.isHaveDialogOrUpload()) {
_this.hide();
}
}
}));
}));
};
/**
* @return {?}
*/
DrawerComponent.prototype.hide = /**
* @return {?}
*/
function () {
var _this = this;
this.canHideModel().then((/**
* @param {?} canHide
* @return {?}
*/
function (canHide) {
if (!canHide) {
return;
}
if (!_this.bodyScrollable) {
document.querySelector('body').classList.remove('modal-open');
}
_this.animateState = 'void';
if (_this.subscription) {
_this.subscription.unsubscribe();
_this.subscription = undefined;
}
}));
};
// Will overwrite by drawer service
// Will overwrite by drawer service
/**
* @return {?}
*/
DrawerComponent.prototype.destroy =
// Will overwrite by drawer service
/**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
DrawerComponent.prototype.isHaveDialogOrUpload = /**
* @return {?}
*/
function () {
/** @type {?} */
var dialog = document.getElementsByClassName('modal-dialog');
/** @type {?} */
var upload = document.getElementById('d-upload-temp');
return (dialog && dialog.length > 0) || upload;
};
/**
* @return {?}
*/
DrawerComponent.prototype.canHideModel = /**
* @return {?}
*/
function () {
/** @type {?} */
var hiddenResult = Promise.resolve(true);
if (this.beforeHidden) {
/** @type {?} */
var result = this.beforeHidden();
if (typeof result !== 'undefined') {
if (result.then) {
hiddenResult = result;
}
else if (result.subscribe) {
hiddenResult = ((/** @type {?} */ (result))).toPromise();
}
else {
hiddenResult = Promise.resolve(result);
}
}
}
return hiddenResult;
};
/**
* @private
* @param {?=} fullScreen
* @return {?}
*/
DrawerComponent.prototype._setFullScreen = /**
* @private
* @param {?=} fullScreen
* @return {?}
*/
function (fullScreen) {
var _this = this;
if (this._width === this.oldWidth) {
if (fullScreen === true || fullScreen === undefined) {
this._width = this._isCover ? '100%' : window.innerWidth + 'px';
if (!this._isCover) {
/** @type {?} */
var resizeEv = fromEvent(window, 'resize');
/** @type {?} */
var result = resizeEv.pipe(debounceTime(100));
this.resizeSub = result.subscribe((/**
* @param {?} ev
* @return {?}
*/
function (ev) {
_this._width = window.innerWidth + 'px';
}));
}
}
}
else {
if (!fullScreen) {
this._width = this.oldWidth;
if (this.resizeSub) {
this.resizeSub.unsubscribe();
}
}
}
};
/**
* @return {?}
*/
DrawerComponent.prototype.toggleFullScreen = /**
* @return {?}
*/
function () {
this._setFullScreen();
};
/**
* @param {?} fullScreen
* @return {?}
*/
DrawerComponent.prototype.setFullScreen = /**
* @param {?} fullScreen
* @return {?}
*/
function (fullScreen) {
this._setFullScreen(fullScreen);
};
DrawerComponent.decorators = [
{ type: Component, args: [{
selector: 'd-drawer',
template: "<div\r\n class=\"drawer\"\r\n [attr.id]=\"id\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n>\r\n <div\r\n class=\"overlay-wrapper\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"overlay-backdrop\" [@fadeInOut]=\"animateState\" (click)=\"backdropCloseable && hide()\"></div>\r\n <div\r\n class=\"drawer-nav\"\r\n [ngStyle]=\"{ width: _width }\"\r\n [@flyInOut]=\"position + '-' + animateState\"\r\n (@flyInOut.done)=\"animationDone.next($event)\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"drawer-content\" cdkScrollable>\r\n <ng-template dDrawerContentHost></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
animations: [
trigger('fadeInOut', [
state('void', style({ display: 'block', opacity: 0 })),
state('in', style({ display: 'block', opacity: 0.6 })),
transition('* => *', animate('300ms ease')),
]),
trigger('flyInOut', [
state('left-void', style({ transform: 'translateX(-100%)', left: 0 })),
state('left-in', style({ transform: 'none', left: 0 })),
state('right-void', style({ transform: 'translateX(100%)', right: 0 })),
state('right-in', style({ transform: 'none', right: 0 })),
transition('* => *', animate('300ms ease')),
]),
],
styles: [".drawer{position:fixed;top:0;bottom:0;z-index:1000}.overlay-wrapper{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;position:absolute;top:0;bottom:0;z-index:1000}.display-width{left:0;right:0}.overlay-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(41,48,64,.2);width:100%;height:100%}.drawer-nav{position:absolute;top:0;bottom:0;background:#fff}.drawer-content{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto;box-shadow:0 1px 20px -5px rgba(41,48,64,.2)}"]
}] }
];
/** @nocollapse */
DrawerComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
DrawerComponent.propDecorators = {
id: [{ type: Input }],
width: [{ type: Input }],
isCover: [{ type: Input }],
fullScreen: [{ type: Input }],
drawerContentHost: [{ type: ViewChild, args: [DrawerContentDirective, { static: true },] }],
backdropCloseable: [{ type: Input }],
escKeyCloseable: [{ type: Input }],
beforeHidden: [{ type: Input }],
clickDoms: [{ type: Input }],
afterOpened: [{ type: Input }],
position: [{ type: Input }],
bodyScrollable: [{ type: Input }],
keydownHandler: [{ type: HostListener, args: ['document:keydown.escape', ['$event'],] }]
};
return DrawerComponent;
}());
export { DrawerComponent };
if (false) {
/** @type {?} */
DrawerComponent.prototype.animateState;
/** @type {?} */
DrawerComponent.prototype.id;
/** @type {?} */
DrawerComponent.prototype.width;
/** @type {?} */
DrawerComponent.prototype.isCover;
/** @type {?} */
DrawerComponent.prototype.fullScreen;
/** @type {?} */
DrawerComponent.prototype.drawerContentHost;
/** @type {?} */
DrawerComponent.prototype.backdropCloseable;
/** @type {?} */
DrawerComponent.prototype.escKeyCloseable;
/** @type {?} */
DrawerComponent.prototype.beforeHidden;
/** @type {?} */
DrawerComponent.prototype.clickDoms;
/** @type {?} */
DrawerComponent.prototype.afterOpened;
/** @type {?} */
DrawerComponent.prototype.position;
/** @type {?} */
DrawerComponent.prototype.bodyScrollable;
/** @type {?} */
DrawerComponent.prototype._width;
/** @type {?} */
DrawerComponent.prototype.oldWidth;
/** @type {?} */
DrawerComponent.prototype._isCover;
/** @type {?} */
DrawerComponent.prototype.subscription;
/** @type {?} */
DrawerComponent.prototype.animationDone;
/** @type {?} */
DrawerComponent.prototype.animationDoneSub;
/** @type {?} */
DrawerComponent.prototype.resizeSub;
/**
* @type {?}
* @private
*/
DrawerComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2RyYXdlci8iLCJzb3VyY2VzIjpbImRyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWUsWUFBWSxFQUFFLEtBQUssRUFDakUsU0FBUyxFQUFFLGdCQUFnQixFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFO0lBSUUsZ0NBQW1CLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQ3JELENBQUM7O2dCQUxGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2lCQUNqQzs7OztnQkFQb0IsZ0JBQWdCOztJQVdyQyw2QkFBQztDQUFBLEFBTkQsSUFNQztTQUhZLHNCQUFzQjs7O0lBQ3JCLGtEQUF5Qzs7QUFJdkQ7SUE0Q0UseUJBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF4QjFDLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBRWIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUNoQixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUtuQixjQUFTLEdBQVEsRUFBRSxDQUFDO1FBVzdCLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7SUFLOUMsQ0FBQzs7OztJQUVELGtDQUFROzs7SUFBUjtRQUFBLGlCQVVDO1FBVEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRWpFLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQW9COzs7OztRQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEUsT0FBTyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2hFLENBQUMsRUFBQyxDQUFDLENBQUMsU0FBUzs7OztRQUFDLFVBQUEsS0FBSztZQUNqQixLQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxrQ0FBUTs7OztJQUFSLFVBQVMsS0FBYTtRQUNwQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFOztnQkFDckIsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDOztnQkFDM0IsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3hGO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUNyQjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM5QixDQUFDOzs7O0lBRUQscUNBQVc7OztJQUFYO1FBQ0UsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDOUI7SUFDSCxDQUFDOzs7OztJQUVvRCx3Q0FBYzs7OztJQUFuRSxVQUFvRSxLQUFvQjtRQUN0RixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7Ozs7O0lBRUQsd0NBQWM7Ozs7SUFBZCxVQUFlLEtBQUs7UUFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELG1DQUFtQzs7Ozs7SUFDbkMsa0NBQVE7Ozs7O0lBQVI7SUFFQSxDQUFDOzs7O0lBRUQsOEJBQUk7OztJQUFKO1FBQUEsaUJBNkJDO1FBNUJDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1RDtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDM0MsT0FBTztTQUNSOztZQUNLLGFBQWEsR0FBRyxTQUFTLENBQWdCLFFBQVEsRUFBRSxPQUFPLENBQUM7UUFDakUsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxTQUFTOzs7O1lBQUMsVUFBQyxLQUFZO2dCQUN2RCxJQUFJLEtBQUksQ0FBQyxTQUFTLElBQUksS0FBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMvQyxLQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7b0JBQUMsVUFBQSxHQUFHO3dCQUN4QixJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQzlDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDWixPQUFPO3lCQUNSO29CQUNILENBQUMsRUFBQyxDQUFDO2lCQUNKO3FCQUFNOzt3QkFDQyxNQUFNLEdBQVEsS0FBSyxDQUFDLE1BQU07b0JBQ2hDLGtGQUFrRjtvQkFDbEYsSUFBSSxLQUFJLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzJCQUNoSCxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO3dCQUNqQyxLQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7cUJBQ2I7aUJBQ0Y7WUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNMLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVELDhCQUFJOzs7SUFBSjtRQUFBLGlCQWNDO1FBYkMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUk7Ozs7UUFBQyxVQUFDLE9BQU87WUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDWixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsS0FBSSxDQUFDLGNBQWMsRUFBRTtnQkFDeEIsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsS0FBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxLQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixLQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNoQyxLQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQzthQUMvQjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1DQUFtQzs7Ozs7SUFDakMsaUNBQU87Ozs7O0lBQVAsY0FBVyxDQUFDOzs7O0lBRWQsOENBQW9COzs7SUFBcEI7O1lBQ1EsTUFBTSxHQUFRLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUM7O1lBQzdELE1BQU0sR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUM1RCxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFRCxzQ0FBWTs7O0lBQVo7O1lBQ00sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRXhDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTs7Z0JBQ2YsTUFBTSxHQUFRLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdkMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0JBQ2pDLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtvQkFDZixZQUFZLEdBQUcsTUFBTSxDQUFDO2lCQUN2QjtxQkFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQzNCLFlBQVksR0FBRyxDQUFDLG1CQUFBLE1BQU0sRUFBdUIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUM1RDtxQkFBTTtvQkFDTCxZQUFZLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDeEM7YUFDRjtTQUNGO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQzs7Ozs7O0lBRU8sd0NBQWM7Ozs7O0lBQXRCLFVBQXVCLFVBQW9CO1FBQTNDLGlCQW9CQztRQW5CQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTs7d0JBQ1osUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDOzt3QkFDdEMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTOzs7O29CQUFDLFVBQUEsRUFBRTt3QkFDbEMsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztvQkFDekMsQ0FBQyxFQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUM5QjthQUNGO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBRU0sMENBQWdCOzs7SUFBdkI7UUFDRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7Ozs7SUFFTSx1Q0FBYTs7OztJQUFwQixVQUFxQixVQUFtQjtRQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O2dCQTFNRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLGlrQ0FBc0M7b0JBRXRDLFVBQVUsRUFBRTt3QkFDVixPQUFPLENBQUMsV0FBVyxFQUFFOzRCQUNuQixLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7NEJBQ3BELEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQzs0QkFDcEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7eUJBQzVDLENBQUM7d0JBQ0YsT0FBTyxDQUFDLFVBQVUsRUFBRTs0QkFDbEIsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7NEJBQ3BFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQzs0QkFDckQsS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7NEJBQ3JFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQzs0QkFDdkQsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7eUJBQzVDLENBQUM7cUJBQ0g7O2lCQUNGOzs7O2dCQWhDOEIsVUFBVTs7O3FCQW1DdEMsS0FBSzt3QkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBQ0wsS0FBSztvQ0FDTCxTQUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO29DQUNsRCxLQUFLO2tDQUNMLEtBQUs7K0JBQ0wsS0FBSzs0QkFDTCxLQUFLOzhCQUVMLEtBQUs7MkJBQ0wsS0FBSztpQ0FDTCxLQUFLO2lDQThDTCxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBNEhyRCxzQkFBQztDQUFBLEFBM01ELElBMk1DO1NBeExZLGVBQWU7OztJQUMxQix1Q0FBc0I7O0lBQ3RCLDZCQUFvQjs7SUFDcEIsZ0NBQXlCOztJQUN6QixrQ0FBd0I7O0lBQ3hCLHFDQUE0Qjs7SUFDNUIsNENBQStGOztJQUMvRiw0Q0FBb0M7O0lBQ3BDLDBDQUFrQzs7SUFDbEMsdUNBQThFOztJQUM5RSxvQ0FBNkI7O0lBRTdCLHNDQUErQjs7SUFDL0IsbUNBQW9DOztJQUNwQyx5Q0FBaUM7O0lBQ2pDLGlDQUFlOztJQUVmLG1DQUFpQjs7SUFDakIsbUNBQWtCOztJQUNsQix1Q0FBMkI7O0lBRTNCLHdDQUE4Qzs7SUFDOUMsMkNBQStCOztJQUMvQixvQ0FBd0I7Ozs7O0lBRVoscUNBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyLCBBbmltYXRpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQsXHJcbiAgT25Jbml0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBpc051bWJlciwgcGFyc2VJbnQsIHRyaW0gfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZERyYXdlckNvbnRlbnRIb3N0XScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb250ZW50RGlyZWN0aXZlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLWRyYXdlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RyYXdlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZHJhd2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZmFkZUluT3V0JywgW1xyXG4gICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHtkaXNwbGF5OiAnYmxvY2snLCBvcGFjaXR5OiAwfSkpLFxyXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7ZGlzcGxheTogJ2Jsb2NrJywgb3BhY2l0eTogMC42fSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IConLCBhbmltYXRlKCczMDBtcyBlYXNlJykpLFxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdmbHlJbk91dCcsIFtcclxuICAgICAgc3RhdGUoJ2xlZnQtdm9pZCcsIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKScsIGxlZnQ6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdsZWZ0LWluJywgc3R5bGUoe3RyYW5zZm9ybTogJ25vbmUnLCBsZWZ0OiAwfSkpLFxyXG4gICAgICBzdGF0ZSgncmlnaHQtdm9pZCcsIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJywgcmlnaHQ6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdyaWdodC1pbicsIHN0eWxlKHt0cmFuc2Zvcm06ICdub25lJywgcmlnaHQ6IDB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gKicsIGFuaW1hdGUoJzMwMG1zIGVhc2UnKSksXHJcbiAgICBdKSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgYW5pbWF0ZVN0YXRlID0gJ3ZvaWQnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgd2lkdGggPSAnMzAwcHgnO1xyXG4gIEBJbnB1dCgpIGlzQ292ZXIgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGZ1bGxTY3JlZW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKERyYXdlckNvbnRlbnREaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGRyYXdlckNvbnRlbnRIb3N0OiBEcmF3ZXJDb250ZW50RGlyZWN0aXZlO1xyXG4gIEBJbnB1dCgpIGJhY2tkcm9wQ2xvc2VhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGVzY0tleUNsb3NlYWJsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBiZWZvcmVIaWRkZW46ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICBASW5wdXQoKSBjbGlja0RvbXM6IGFueSA9IFtdO1xyXG4gIC8vIFdpbGwgb3ZlcndyaXRlIGJ5IGRyYXdlciBzZXJ2aWNlXHJcbiAgQElucHV0KCkgYWZ0ZXJPcGVuZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIHBvc2l0aW9uOiAncmlnaHQnIHwgJ2xlZnQnO1xyXG4gIEBJbnB1dCgpIGJvZHlTY3JvbGxhYmxlOiBib29sZWFuOyAvLyBkcmF3ZXLmiZPlvIBib2R55piv5ZCm5Y+v5rua5YqoXHJcbiAgX3dpZHRoOiBzdHJpbmc7XHJcbiAgLy8g5YWo5bGP5pe255So5p2l6K6w5b2V5LmL5YmN55qE5a695bqm77yM5Zug5Li65rKh6YGu572p55qE5oOF5Ya15LiLd2lkdGjkuI3og73mmK/nmb7liIbmr5RcclxuICBvbGRXaWR0aDogc3RyaW5nO1xyXG4gIF9pc0NvdmVyOiBib29sZWFuO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBhbmltYXRpb25Eb25lID0gbmV3IFN1YmplY3Q8QW5pbWF0aW9uRXZlbnQ+KCk7XHJcbiAgYW5pbWF0aW9uRG9uZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHJlc2l6ZVN1YjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgIHRoaXMuX2lzQ292ZXIgPSB0aGlzLmlzQ292ZXIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLmlzQ292ZXI7XHJcblxyXG4gICAgLy8gc29tZSBicm93c2VycyhpZTExICYgZWRnZSkgZmlyZSB0aGUgYW5pbWF0aW9uIGRvbmUgZXZlbnQgdHdpY2VcclxuICAgIHRoaXMuYW5pbWF0aW9uRG9uZVN1YiA9IHRoaXMuYW5pbWF0aW9uRG9uZS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh4LCB5KSA9PiB7XHJcbiAgICAgIHJldHVybiB4LmZyb21TdGF0ZSA9PT0geS5mcm9tU3RhdGUgJiYgeC50b1N0YXRlID09PSB5LnRvU3RhdGU7XHJcbiAgICB9KSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgdGhpcy5vbkFuaW1hdGlvbkVuZChldmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFdpZHRoKHdpZHRoOiBzdHJpbmcpIHtcclxuICAgIGlmICh3aWR0aC5pbmRleE9mKCclJykgPj0gMCkge1xyXG4gICAgICBjb25zdCB3aWR0aFN0ciA9IHRyaW0od2lkdGgsICclJyk7XHJcbiAgICAgIGNvbnN0IHdpZHRoTnVtID0gcGFyc2VJbnQod2lkdGhTdHIsIDEwKTtcclxuICAgICAgdGhpcy5fd2lkdGggPSBpc051bWJlcih3aWR0aE51bSkgPyAod2lkdGhOdW0gKiB3aW5kb3cuaW5uZXJXaWR0aCAvIDEwMCArICdweCcpIDogJzBweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbGRXaWR0aCA9IHRoaXMuX3dpZHRoO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRpb25Eb25lU3ViKSB7XHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uRG9uZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVzaXplU3ViKSB7XHJcbiAgICAgIHRoaXMucmVzaXplU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pIGtleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5lc2NLZXlDbG9zZWFibGUgJiYgIXRoaXMuaXNIYXZlRGlhbG9nT3JVcGxvYWQoKSkge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQW5pbWF0aW9uRW5kKGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRlU3RhdGUgPT09ICd2b2lkJykge1xyXG4gICAgICB0aGlzLm9uSGlkZGVuKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hbmltYXRlU3RhdGUgPT09ICdpbicgJiYgdGhpcy5hZnRlck9wZW5lZCkge1xyXG4gICAgICB0aGlzLmFmdGVyT3BlbmVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBXaWxsIG92ZXJ3cml0ZSBieSBkcmF3ZXIgc2VydmljZVxyXG4gIG9uSGlkZGVuKCkge1xyXG5cclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICBpZiAoIXRoaXMuYm9keVNjcm9sbGFibGUpIHtcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW4nKTtcclxuICAgIH1cclxuICAgIHRoaXMuYW5pbWF0ZVN0YXRlID0gJ2luJztcclxuICAgIHRoaXMuaXNDb3ZlciA9IHRoaXMuaXNDb3ZlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRoaXMuaXNDb3ZlcjtcclxuICAgIGlmICghdGhpcy5iYWNrZHJvcENsb3NlYWJsZSB8fCB0aGlzLmlzQ292ZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZG9jdW1lbnRDbGljayA9IGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2NsaWNrJyk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBkb2N1bWVudENsaWNrLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2tEb21zICYmIHRoaXMuY2xpY2tEb21zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuY2xpY2tEb21zLmZvckVhY2goZG9tID0+IHtcclxuICAgICAgICAgICAgaWYgKGRvbSAhPT0gbnVsbCAmJiBkb20uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldDogYW55ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgLy8g5LiA5a6a6KaBZG9jdW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0Ke+8jOWboOS4umV2ZW50LnRhcmdldOWPr+iDveW3sue7j+S4jeWcqGRvY3VtZW506YeM5LqG77yM6L+Z5Liq5pe25YCZ5bCx5LiN6IO96L+baGlkZeS6hlxyXG4gICAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZVN0YXRlID09PSAnaW4nICYmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRhcmdldCkpXHJcbiAgICAgICAgICAgICYmICF0aGlzLmlzSGF2ZURpYWxvZ09yVXBsb2FkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMuY2FuSGlkZU1vZGVsKCkudGhlbigoY2FuSGlkZSkgPT4ge1xyXG4gICAgICBpZiAoIWNhbkhpZGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmJvZHlTY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFuaW1hdGVTdGF0ZSA9ICd2b2lkJztcclxuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBXaWxsIG92ZXJ3cml0ZSBieSBkcmF3ZXIgc2VydmljZVxyXG4gICAgZGVzdHJveSgpIHt9XHJcblxyXG4gIGlzSGF2ZURpYWxvZ09yVXBsb2FkKCkge1xyXG4gICAgY29uc3QgZGlhbG9nOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtb2RhbC1kaWFsb2cnKTtcclxuICAgIGNvbnN0IHVwbG9hZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2QtdXBsb2FkLXRlbXAnKTtcclxuICAgIHJldHVybiAoZGlhbG9nICYmIGRpYWxvZy5sZW5ndGggPiAwKSB8fCB1cGxvYWQ7XHJcbiAgfVxyXG5cclxuICBjYW5IaWRlTW9kZWwoKSB7XHJcbiAgICBsZXQgaGlkZGVuUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmJlZm9yZUhpZGRlbikge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHRoaXMuYmVmb3JlSGlkZGVuKCk7XHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChyZXN1bHQudGhlbikge1xyXG4gICAgICAgICAgaGlkZGVuUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN1YnNjcmliZSkge1xyXG4gICAgICAgICAgaGlkZGVuUmVzdWx0ID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS50b1Byb21pc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaGlkZGVuUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhpZGRlblJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEZ1bGxTY3JlZW4oZnVsbFNjcmVlbj86IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl93aWR0aCA9PT0gdGhpcy5vbGRXaWR0aCkge1xyXG4gICAgICBpZiAoZnVsbFNjcmVlbiA9PT0gdHJ1ZSB8fCBmdWxsU2NyZWVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHRoaXMuX2lzQ292ZXIgPyAnMTAwJScgOiB3aW5kb3cuaW5uZXJXaWR0aCArICdweCc7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NvdmVyKSB7XHJcbiAgICAgICAgICBjb25zdCByZXNpemVFdiA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKTtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc2l6ZUV2LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpO1xyXG4gICAgICAgICAgdGhpcy5yZXNpemVTdWIgPSByZXN1bHQuc3Vic2NyaWJlKGV2ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCArICdweCc7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghZnVsbFNjcmVlbikge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5vbGRXaWR0aDtcclxuICAgICAgICBpZiAodGhpcy5yZXNpemVTdWIpIHtcclxuICAgICAgICAgIHRoaXMucmVzaXplU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlRnVsbFNjcmVlbigpIHtcclxuICAgIHRoaXMuX3NldEZ1bGxTY3JlZW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGdWxsU2NyZWVuKGZ1bGxTY3JlZW46IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3NldEZ1bGxTY3JlZW4oZnVsbFNjcmVlbik7XHJcbiAgfVxyXG59XHJcbiJdfQ==