UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

324 lines 34 kB
/** * @fileoverview added by tsickle * Generated from: sticky.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ElementRef, HostBinding } from '@angular/core'; export class StickyComponent { /** * @param {?} el */ constructor(el) { this.el = el; this.hostPosition = 'relative'; this.statusChange = new EventEmitter(); this._prevStatus = undefined; this._status = 'normal'; // 用于监听是否是横向滚动 this.THROTTLE_DELAY = 16; this.THROTTLE_TRIGGER = 100; this.throttle = (/** * @return {?} */ () => { /** @type {?} */ const fn = this.scrollAndResizeHock; /** @type {?} */ const time = Date.now(); if (this.scrollTimer) { clearTimeout(this.scrollTimer); } if (!this.scrollPreStart) { this.scrollPreStart = time; } if (time - this.scrollPreStart > this.THROTTLE_TRIGGER) { fn(); this.scrollPreStart = null; this.scrollTimer = null; } else { this.scrollTimer = setTimeout((/** * @return {?} */ () => { fn(); this.scrollPreStart = null; this.scrollTimer = null; }), this.THROTTLE_DELAY); } }); this.scrollAndResizeHock = (/** * @return {?} */ () => { if (this.container.getBoundingClientRect().left - (this.containerLeft || 0) !== 0) { this.status = 'stay'; this.containerLeft = this.container.getBoundingClientRect().left; } else { this.scrollHandler(); } }); this.scrollHandler = (/** * @return {?} */ () => { /** @type {?} */ const computedStyle = window.getComputedStyle(this.container); if (this.parentNode.getBoundingClientRect().top > (this.view && this.view.top || 0)) { this.status = 'normal'; // 全局滑动(container!==parentNode)时候增加预判 } else if (this.container.getBoundingClientRect().top + parseInt(computedStyle.paddingTop, 10) + parseInt(computedStyle.borderTopWidth, 10) >= (this.view && this.view.top || 0)) { this.status = 'normal'; } else if (this.container.getBoundingClientRect().bottom - parseInt(computedStyle.paddingBottom, 10) - parseInt(computedStyle.borderBottomWidth, 10) - this.wrapper.nativeElement.getBoundingClientRect().height < (this.view && this.view.top || 0) + (this.view && this.view.bottom || 0)) { this.status = 'remain'; } else if ((this.container.getBoundingClientRect().top + parseInt(computedStyle.paddingTop, 10) < (this.view && this.view.top || 0))) { this.status = 'follow'; } }); } /** * @param {?} status * @return {?} */ set status(status) { if (status !== this._status) { this._prevStatus = this._status; this._status = status; this.statusProcess(this._status); } } /** * @return {?} */ get status() { return this._status; } /** * @return {?} */ ngOnInit() { this.parentNode = this.el.nativeElement.parentNode; if (!this.container) { this.container = this.parentNode; } } /** * @return {?} */ ngAfterViewInit() { this.scrollTarget = this.scrollTarget || window; // window有scroll事件,document.documentElement没有scroll事件 this.scrollTarget.addEventListener('scroll', this.throttle); this.initScrollStatus(this.scrollTarget); } /** * @return {?} */ ngOnDestroy() { this.scrollTarget.removeEventListener('scroll', this.throttle); } /** * @param {?} status * @return {?} */ statusProcess(status) { switch (status) { case 'normal': this.wrapper.nativeElement.style.top = 'auto'; this.wrapper.nativeElement.style.left = 'auto'; this.wrapper.nativeElement.style.position = 'static'; break; case 'follow': this.wrapper.nativeElement.style.top = (this.view && this.view.top || 0) + 'px'; this.wrapper.nativeElement.style.left = this.wrapper.nativeElement.getBoundingClientRect().left + 'px'; this.wrapper.nativeElement.style.position = 'fixed'; break; case 'stay': this.wrapper.nativeElement.style.top = this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'top') + 'px'; this.wrapper.nativeElement.style.left = 'auto'; this.wrapper.nativeElement.style.position = 'relative'; break; case 'remain': if (this.wrapper.nativeElement.style.position !== 'fixed' || this.wrapper.nativeElement.style.position !== 'absolute') { this.wrapper.nativeElement.style.top = this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'top') + 'px'; this.wrapper.nativeElement.style.left = 'auto'; this.wrapper.nativeElement.style.position = 'absolute'; // 要先转为absolute再计算,否则如果处于非fixed影响计算 } this.wrapper.nativeElement.style.top = this.calculateRemainPosition(this.wrapper.nativeElement, this.parentNode, this.container) + 'px'; this.wrapper.nativeElement.style.left = this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'left') + 'px'; this.wrapper.nativeElement.style.position = 'relative'; break; default: break; } } /** * @param {?} element * @param {?} relativeElement * @param {?} direction * @return {?} */ calculateRelativePosition(element, relativeElement, direction) { /** @type {?} */ const key = { 'left': ['left', 'Left'], 'top': ['top', 'Top'] }; if (window && window.getComputedStyle) { /** @type {?} */ const computedStyle = window.getComputedStyle(relativeElement); return element.getBoundingClientRect()[key[direction][0]] - relativeElement.getBoundingClientRect()[key[direction][0]] - parseInt(computedStyle['padding' + key[direction][1]], 10) - parseInt(computedStyle['border' + key[direction][1] + 'Width'], 10); } } /** * @param {?} element * @param {?} relativeElement * @param {?} container * @return {?} */ calculateRemainPosition(element, relativeElement, container) { if (window && window.getComputedStyle) { /** @type {?} */ const computedStyle = window.getComputedStyle(container); /** @type {?} */ const result = container.getBoundingClientRect().height - element.getBoundingClientRect().height + container.getBoundingClientRect().top - relativeElement.getBoundingClientRect().top - parseInt(computedStyle['paddingTop'], 10) - parseInt(computedStyle['borderTopWidth'], 10) - parseInt(computedStyle['paddingBottom'], 10) - parseInt(computedStyle['borderBottomWidth'], 10); return result < 0 ? 0 : result; } } /** * @param {?} target * @return {?} */ initScrollStatus(target) { /** @type {?} */ const scrollTargets = target === window ? [document.documentElement, document.body] : [target]; /** @type {?} */ let flag = false; scrollTargets.forEach((/** * @param {?} scrollTarget * @return {?} */ scrollTarget => { if (scrollTarget.scrollTop && scrollTarget.scrollTop > 0) { flag = true; } })); if (flag) { setTimeout(this.scrollHandler); } } /** * 提供给业务自己触发 * 用法: * 1.捕获所有sticky:```\@ViewChildren(StickyComponent) stickies;``` * 2.触发刷新:当需要手动触发更新的时候,比如订阅数据返回后页面高度发生变化可以调用 ```stickies.forEach(sticky => sticky.recalculatePosition());``` * 慎用,少用, 使用太多会影响性能。 * @return {?} */ recalculatePosition() { this.initScrollStatus(this.scrollTarget); } } StickyComponent.decorators = [ { type: Component, args: [{ selector: 'd-sticky', template: ` <div #stickyWrapper [style.zIndex]="zIndex"> <ng-content></ng-content> </div> ` }] } ]; /** @nocollapse */ StickyComponent.ctorParameters = () => [ { type: ElementRef } ]; StickyComponent.propDecorators = { hostPosition: [{ type: HostBinding, args: ['style.position',] }], zIndex: [{ type: Input }], container: [{ type: Input }], view: [{ type: Input }], scrollTarget: [{ type: Input }], statusChange: [{ type: Output }], wrapper: [{ type: ViewChild, args: ['stickyWrapper', { static: true },] }], throttle: [{ type: HostListener, args: ['window:resize',] }] }; if (false) { /** @type {?} */ StickyComponent.prototype.hostPosition; /** @type {?} */ StickyComponent.prototype.zIndex; /** @type {?} */ StickyComponent.prototype.container; /** @type {?} */ StickyComponent.prototype.view; /** @type {?} */ StickyComponent.prototype.scrollTarget; /** @type {?} */ StickyComponent.prototype.statusChange; /** @type {?} */ StickyComponent.prototype.wrapper; /** @type {?} */ StickyComponent.prototype._prevStatus; /** @type {?} */ StickyComponent.prototype._status; /** @type {?} */ StickyComponent.prototype.parentNode; /** @type {?} */ StickyComponent.prototype.containerLeft; /** * @type {?} * @private */ StickyComponent.prototype.THROTTLE_DELAY; /** * @type {?} * @private */ StickyComponent.prototype.THROTTLE_TRIGGER; /** * @type {?} * @private */ StickyComponent.prototype.scrollPreStart; /** * @type {?} * @private */ StickyComponent.prototype.scrollTimer; /** @type {?} */ StickyComponent.prototype.throttle; /** @type {?} */ StickyComponent.prototype.scrollAndResizeHock; /** @type {?} */ StickyComponent.prototype.scrollHandler; /** * @type {?} * @private */ StickyComponent.prototype.el; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2t5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3N0aWNreS8iLCJzb3VyY2VzIjpbInN0aWNreS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzVFLFVBQVUsRUFBNkIsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBYTdFLE1BQU0sT0FBTyxlQUFlOzs7O0lBa0N4QixZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQWpDSCxpQkFBWSxHQUFHLFVBQVUsQ0FBQztRQVMvQyxpQkFBWSxHQUErQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR3hFLGdCQUFXLEdBQWlCLFNBQVMsQ0FBQztRQUN0QyxZQUFPLEdBQWlCLFFBQVEsQ0FBQzs7UUFlekIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsR0FBRyxDQUFDO1FBNkQvQixhQUFROzs7UUFBRyxHQUFHLEVBQUU7O2tCQUNOLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1COztrQkFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3BELEVBQUUsRUFBRSxDQUFDO2dCQUNMLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUMzQjtpQkFBTTtnQkFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVU7OztnQkFBQyxHQUFHLEVBQUU7b0JBQy9CLEVBQUUsRUFBRSxDQUFDO29CQUNMLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDNUIsQ0FBQyxHQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUMzQjtRQUNMLENBQUMsRUFBQTtRQUNELHdCQUFtQjs7O1FBQUcsR0FBRyxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLEtBQU0sQ0FBQyxFQUFFO2dCQUNoRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ3BFO2lCQUFNO2dCQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUN4QjtRQUNMLENBQUMsRUFBQTtRQUVELGtCQUFhOzs7UUFBRyxHQUFHLEVBQUU7O2tCQUNaLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM3RCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUNoRixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFHLHFDQUFxQzthQUNuRTtpQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHO2tCQUMvQyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7a0JBQ3RDLFFBQVEsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQzttQkFDckMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQzthQUMxQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNO2tCQUNsRCxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7a0JBQ3pDLFFBQVEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2tCQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU07a0JBQ3JELENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQ3hFO2dCQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO2FBQzFCO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNoSTtnQkFDQSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQzthQUN6QjtRQUNMLENBQUMsRUFBQTtJQTFHRCxDQUFDOzs7OztJQXBCRCxJQUFJLE1BQU0sQ0FBQyxNQUFvQjtRQUMzQixJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7Ozs7SUFDRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQzs7OztJQWFELFFBQVE7UUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUNuRCxJQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDcEM7SUFDTCxDQUFDOzs7O0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsQ0FBQyxxREFBcUQ7UUFDdEcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7OztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkUsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsTUFBTTtRQUNoQixRQUFRLE1BQU0sRUFBRTtZQUNaLEtBQUssUUFBUTtnQkFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztnQkFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO2dCQUNyRCxNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBRSxHQUFHLElBQUksQ0FBQztnQkFDakYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ3ZHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO2dCQUNwRCxNQUFNO1lBQ1YsS0FBSyxNQUFNO2dCQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHO29CQUMvQixJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQy9GLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztnQkFDdkQsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCxJQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFO29CQUNwSCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRzt3QkFDaEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUM5RixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztvQkFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxtQ0FBbUM7aUJBQzlGO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHO29CQUNoQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNyRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSTtvQkFDakMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUMvRixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztnQkFDdkQsTUFBTTtZQUNWO2dCQUNJLE1BQU07U0FDYjtJQUNMLENBQUM7Ozs7Ozs7SUF1REQseUJBQXlCLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTOztjQUNuRCxHQUFHLEdBQUc7WUFDUixNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQ3hCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDeEI7UUFDRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7O2tCQUM3QixhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQztZQUM5RCxPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztrQkFDL0MsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2tCQUMxRCxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7a0JBQzFELFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNqRjtJQUNMLENBQUM7Ozs7Ozs7SUFDRCx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVM7UUFDdkQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFOztrQkFDN0IsYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7O2tCQUNsRCxNQUFNLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTTtrQkFDN0MsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTTtrQkFDdEMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRztrQkFDckMsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRztrQkFDM0MsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7a0JBQ3pDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUM7a0JBQzdDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDO2tCQUM1QyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFELE9BQU8sTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDbEM7SUFDTCxDQUFDOzs7OztJQUVELGdCQUFnQixDQUFDLE1BQU07O2NBQ2YsYUFBYSxHQUFHLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDOztZQUMxRixJQUFJLEdBQUcsS0FBSztRQUNoQixhQUFhLENBQUMsT0FBTzs7OztRQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ25DLElBQUksWUFBWSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRTtnQkFDdEQsSUFBSSxHQUFHLElBQUksQ0FBQzthQUNmO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLElBQUksRUFBRTtZQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEM7SUFFSCxDQUFDOzs7Ozs7Ozs7SUFTTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxDQUFDOzs7WUEzTUosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixRQUFRLEVBQUU7Ozs7S0FJVDthQUNKOzs7O1lBWEcsVUFBVTs7OzJCQWNULFdBQVcsU0FBQyxnQkFBZ0I7cUJBQzVCLEtBQUs7d0JBQ0wsS0FBSzttQkFDTCxLQUFLOzJCQUlMLEtBQUs7MkJBRUwsTUFBTTtzQkFDTixTQUFTLFNBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt1QkErRTNDLFlBQVksU0FBQyxlQUFlOzs7O0lBekY3Qix1Q0FBeUQ7O0lBQ3pELGlDQUF3Qjs7SUFDeEIsb0NBQTRCOztJQUM1QiwrQkFHRTs7SUFDRix1Q0FBc0I7O0lBRXRCLHVDQUF3RTs7SUFDeEUsa0NBQXNEOztJQUV0RCxzQ0FBc0M7O0lBQ3RDLGtDQUFpQzs7SUFZakMscUNBQVc7O0lBQ1gsd0NBQWM7Ozs7O0lBRWQseUNBQTRCOzs7OztJQUM1QiwyQ0FBK0I7Ozs7O0lBQy9CLHlDQUF1Qjs7Ozs7SUFDdkIsc0NBQW9COztJQTBEcEIsbUNBcUJDOztJQUNELDhDQU9DOztJQUVELHdDQW9CQzs7Ozs7SUEzR1csNkJBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIsXHJcbiAgICBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0ICwgT25EZXN0cm95LCBIb3N0QmluZGluZ30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgdHlwZSBTdGlja3lTdGF0dXMgPSAgJ25vcm1hbCcgfCAnZm9sbG93JyB8ICdzdGF5JyB8ICdyZW1haW4nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2Qtc3RpY2t5JyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPGRpdiAjc3RpY2t5V3JhcHBlciBbc3R5bGUuekluZGV4XT1cInpJbmRleFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgYCxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBTdGlja3lDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJykgaG9zdFBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgIEBJbnB1dCgpIHpJbmRleDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgY29udGFpbmVyOiBFbGVtZW50OyAvLyDpu5jorqTlgLzniLblrrnlmahcclxuICAgIEBJbnB1dCgpIHZpZXc6IHtcclxuICAgICAgICB0b3A/OiBudW1iZXIsXHJcbiAgICAgICAgYm90dG9tPzogbnVtYmVyLFxyXG4gICAgfTtcclxuICAgIEBJbnB1dCgpIHNjcm9sbFRhcmdldDtcclxuXHJcbiAgICBAT3V0cHV0KCkgc3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8U3RpY2t5U3RhdHVzPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBWaWV3Q2hpbGQoJ3N0aWNreVdyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB3cmFwcGVyO1xyXG5cclxuICAgIF9wcmV2U3RhdHVzOiBTdGlja3lTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICBfc3RhdHVzOiBTdGlja3lTdGF0dXMgPSAnbm9ybWFsJztcclxuICAgIHNldCBzdGF0dXMoc3RhdHVzOiBTdGlja3lTdGF0dXMpIHtcclxuICAgICAgICBpZiAoc3RhdHVzICE9PSB0aGlzLl9zdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldlN0YXR1cyA9IHRoaXMuX3N0YXR1cztcclxuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1Byb2Nlc3ModGhpcy5fc3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc3RhdHVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyZW50Tm9kZTtcclxuICAgIGNvbnRhaW5lckxlZnQ7IC8vIOeUqOS6juebkeWQrOaYr+WQpuaYr+aoquWQkea7muWKqFxyXG5cclxuICAgIHByaXZhdGUgVEhST1RUTEVfREVMQVkgPSAxNjtcclxuICAgIHByaXZhdGUgVEhST1RUTEVfVFJJR0dFUiA9IDEwMDtcclxuICAgIHByaXZhdGUgc2Nyb2xsUHJlU3RhcnQ7XHJcbiAgICBwcml2YXRlIHNjcm9sbFRpbWVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAoICF0aGlzLmNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gdGhpcy5zY3JvbGxUYXJnZXQgfHwgd2luZG93OyAvLyB3aW5kb3fmnIlzY3JvbGzkuovku7bvvIxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnTmsqHmnIlzY3JvbGzkuovku7ZcclxuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnRocm90dGxlKTtcclxuICAgICAgICB0aGlzLmluaXRTY3JvbGxTdGF0dXModGhpcy5zY3JvbGxUYXJnZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudGhyb3R0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXR1c1Byb2Nlc3Moc3RhdHVzKSB7XHJcbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgICAgICAgY2FzZSAnbm9ybWFsJzpcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2ZvbGxvdyc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSAodGhpcy52aWV3ICYmIHRoaXMudmlldy50b3AgfHwgMCApICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdzdGF5JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9XHJcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCAndG9wJykgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdyZW1haW4nOlxyXG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJyB8fCB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gJ2Fic29sdXRlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCAndG9wJykgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOyAvLyDopoHlhYjovazkuLphYnNvbHV0ZeWGjeiuoeeul++8jOWQpuWImeWmguaenOWkhOS6jumdnmZpeGVk5b2x5ZON6K6h566XXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVtYWluUG9zaXRpb24odGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGFyZW50Tm9kZSwgdGhpcy5jb250YWluZXIpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCAnbGVmdCcpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxyXG4gICAgdGhyb3R0bGUgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm4gPSB0aGlzLnNjcm9sbEFuZFJlc2l6ZUhvY2s7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVGltZXIpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGltZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsUHJlU3RhcnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxQcmVTdGFydCA9IHRpbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aW1lIC0gdGhpcy5zY3JvbGxQcmVTdGFydCA+IHRoaXMuVEhST1RUTEVfVFJJR0dFUikge1xyXG4gICAgICAgICAgICBmbigpO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsUHJlU3RhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuVEhST1RUTEVfREVMQVkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNjcm9sbEFuZFJlc2l6ZUhvY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSAodGhpcy5jb250YWluZXJMZWZ0IHx8IDApICAhPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdzdGF5JztcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJMZWZ0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcclxuICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA+ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdub3JtYWwnOyAgIC8vIOWFqOWxgOa7keWKqO+8iGNvbnRhaW5lciE9PXBhcmVudE5vZGXvvInml7blgJnlop7liqDpooTliKRcclxuICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAgICAgICAgKyBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsIDEwKVxyXG4gICAgICAgICAgICsgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApXHJcbiAgICAgICAgICAgICAgID49ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwKSkge1xyXG4gICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ25vcm1hbCc7XHJcbiAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbVxyXG4gICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tLCAxMClcclxuICAgICAgICAgICAtIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDEwKVxyXG4gICAgICAgICAgIC0gdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgIDwgKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApICsgKHRoaXMudmlldyAmJiB0aGlzLnZpZXcuYm90dG9tIHx8IDApXHJcbiAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ3JlbWFpbic7XHJcbiAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsIDEwKSA8ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwKSlcclxuICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnZm9sbG93JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbihlbGVtZW50LCByZWxhdGl2ZUVsZW1lbnQsIGRpcmVjdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHtcclxuICAgICAgICAgICAgJ2xlZnQnOiBbJ2xlZnQnLCAnTGVmdCddLFxyXG4gICAgICAgICAgICAndG9wJzogWyd0b3AnLCAnVG9wJ11cclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHJlbGF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2tleVtkaXJlY3Rpb25dWzBdXVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcmVsYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2tleVtkaXJlY3Rpb25dWzBdXVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsncGFkZGluZycgKyBrZXlbZGlyZWN0aW9uXVsxXV0sIDEwKVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnYm9yZGVyJyArIGtleVtkaXJlY3Rpb25dWzFdICsgJ1dpZHRoJ10sIDEwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYWxjdWxhdGVSZW1haW5Qb3NpdGlvbihlbGVtZW50LCByZWxhdGl2ZUVsZW1lbnQsIGNvbnRhaW5lcikge1xyXG4gICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAtIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgKyBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAgICAgICAgICAgICAgICAgLSByZWxhdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydwYWRkaW5nVG9wJ10sIDEwKVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnYm9yZGVyVG9wV2lkdGgnXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydwYWRkaW5nQm90dG9tJ10sIDEwKVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnYm9yZGVyQm90dG9tV2lkdGgnXSwgMTApO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IDwgMCA/IDAgOiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRTY3JvbGxTdGF0dXModGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbFRhcmdldHMgPSB0YXJnZXQgPT09IHdpbmRvdyA/IFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldIDogW3RhcmdldF07XHJcbiAgICAgIGxldCBmbGFnID0gZmFsc2U7XHJcbiAgICAgIHNjcm9sbFRhcmdldHMuZm9yRWFjaChzY3JvbGxUYXJnZXQgPT4ge1xyXG4gICAgICAgIGlmIChzY3JvbGxUYXJnZXQuc2Nyb2xsVG9wICYmIHNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPiAwKSB7XHJcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCh0aGlzLnNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o+Q5L6b57uZ5Lia5Yqh6Ieq5bex6Kem5Y+RXHJcbiAgICAgKiDnlKjms5XvvJpcclxuICAgICAqIDEu5o2V6I635omA5pyJc3RpY2t577yaYGBgQFZpZXdDaGlsZHJlbihTdGlja3lDb21wb25lbnQpIHN0aWNraWVzO2BgYFxyXG4gICAgICogMi7op6blj5HliLfmlrDvvJrlvZPpnIDopoHmiYvliqjop6blj5Hmm7TmlrDnmoTml7blgJnvvIzmr5TlpoLorqLpmIXmlbDmja7ov5Tlm57lkI7pobXpnaLpq5jluqblj5HnlJ/lj5jljJblj6/ku6XosIPnlKggYGBgc3RpY2tpZXMuZm9yRWFjaChzdGlja3kgPT4gc3RpY2t5LnJlY2FsY3VsYXRlUG9zaXRpb24oKSk7YGBgXHJcbiAgICAgKiDmhY7nlKjvvIzlsJHnlKjvvIwg5L2/55So5aSq5aSa5Lya5b2x5ZON5oCn6IO944CCXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWNhbGN1bGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgICB0aGlzLmluaXRTY3JvbGxTdGF0dXModGhpcy5zY3JvbGxUYXJnZXQpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==