@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
368 lines • 36.2 kB
JavaScript
/**
* @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';
var StickyComponent = /** @class */ (function () {
function StickyComponent(el) {
var _this = this;
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 {?}
*/
function () {
/** @type {?} */
var fn = _this.scrollAndResizeHock;
/** @type {?} */
var 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 {?}
*/
function () {
fn();
_this.scrollPreStart = null;
_this.scrollTimer = null;
}), _this.THROTTLE_DELAY);
}
});
this.scrollAndResizeHock = (/**
* @return {?}
*/
function () {
if (_this.container.getBoundingClientRect().left - (_this.containerLeft || 0) !== 0) {
_this.status = 'stay';
_this.containerLeft = _this.container.getBoundingClientRect().left;
}
else {
_this.scrollHandler();
}
});
this.scrollHandler = (/**
* @return {?}
*/
function () {
/** @type {?} */
var 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';
}
});
}
Object.defineProperty(StickyComponent.prototype, "status", {
get: /**
* @return {?}
*/
function () {
return this._status;
},
set: /**
* @param {?} status
* @return {?}
*/
function (status) {
if (status !== this._status) {
this._prevStatus = this._status;
this._status = status;
this.statusProcess(this._status);
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
StickyComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.parentNode = this.el.nativeElement.parentNode;
if (!this.container) {
this.container = this.parentNode;
}
};
/**
* @return {?}
*/
StickyComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.scrollTarget = this.scrollTarget || window; // window有scroll事件,document.documentElement没有scroll事件
this.scrollTarget.addEventListener('scroll', this.throttle);
this.initScrollStatus(this.scrollTarget);
};
/**
* @return {?}
*/
StickyComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.scrollTarget.removeEventListener('scroll', this.throttle);
};
/**
* @param {?} status
* @return {?}
*/
StickyComponent.prototype.statusProcess = /**
* @param {?} status
* @return {?}
*/
function (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 {?}
*/
StickyComponent.prototype.calculateRelativePosition = /**
* @param {?} element
* @param {?} relativeElement
* @param {?} direction
* @return {?}
*/
function (element, relativeElement, direction) {
/** @type {?} */
var key = {
'left': ['left', 'Left'],
'top': ['top', 'Top']
};
if (window && window.getComputedStyle) {
/** @type {?} */
var 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 {?}
*/
StickyComponent.prototype.calculateRemainPosition = /**
* @param {?} element
* @param {?} relativeElement
* @param {?} container
* @return {?}
*/
function (element, relativeElement, container) {
if (window && window.getComputedStyle) {
/** @type {?} */
var computedStyle = window.getComputedStyle(container);
/** @type {?} */
var 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 {?}
*/
StickyComponent.prototype.initScrollStatus = /**
* @param {?} target
* @return {?}
*/
function (target) {
/** @type {?} */
var scrollTargets = target === window ? [document.documentElement, document.body] : [target];
/** @type {?} */
var flag = false;
scrollTargets.forEach((/**
* @param {?} scrollTarget
* @return {?}
*/
function (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());```
* 慎用,少用, 使用太多会影响性能。
*/
/**
* 提供给业务自己触发
* 用法:
* 1.捕获所有sticky:```\@ViewChildren(StickyComponent) stickies;```
* 2.触发刷新:当需要手动触发更新的时候,比如订阅数据返回后页面高度发生变化可以调用 ```stickies.forEach(sticky => sticky.recalculatePosition());```
* 慎用,少用, 使用太多会影响性能。
* @return {?}
*/
StickyComponent.prototype.recalculatePosition = /**
* 提供给业务自己触发
* 用法:
* 1.捕获所有sticky:```\@ViewChildren(StickyComponent) stickies;```
* 2.触发刷新:当需要手动触发更新的时候,比如订阅数据返回后页面高度发生变化可以调用 ```stickies.forEach(sticky => sticky.recalculatePosition());```
* 慎用,少用, 使用太多会影响性能。
* @return {?}
*/
function () {
this.initScrollStatus(this.scrollTarget);
};
StickyComponent.decorators = [
{ type: Component, args: [{
selector: 'd-sticky',
template: "\n <div #stickyWrapper [style.zIndex]=\"zIndex\">\n <ng-content></ng-content>\n </div>\n "
}] }
];
/** @nocollapse */
StickyComponent.ctorParameters = function () { return [
{ 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',] }]
};
return StickyComponent;
}());
export { StickyComponent };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2t5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3N0aWNreS8iLCJzb3VyY2VzIjpbInN0aWNreS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzVFLFVBQVUsRUFBNkIsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBSTdFO0lBMkNJLHlCQUFvQixFQUFjO1FBQWxDLGlCQUNDO1FBRG1CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFqQ0gsaUJBQVksR0FBRyxVQUFVLENBQUM7UUFTL0MsaUJBQVksR0FBK0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUd4RSxnQkFBVyxHQUFpQixTQUFTLENBQUM7UUFDdEMsWUFBTyxHQUFpQixRQUFRLENBQUM7O1FBZXpCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLHFCQUFnQixHQUFHLEdBQUcsQ0FBQztRQTZEL0IsYUFBUTs7O1FBQUc7O2dCQUNELEVBQUUsR0FBRyxLQUFJLENBQUMsbUJBQW1COztnQkFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixZQUFZLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxDQUFDLEtBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLEtBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDLGNBQWMsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3BELEVBQUUsRUFBRSxDQUFDO2dCQUNMLEtBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUMz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K0UzQyxZQUFZLFNBQUMsZUFBZTs7SUF5R2pDLHNCQUFDO0NBQUEsQUE1TUQsSUE0TUM7U0FuTVksZUFBZTs7O0lBQ3hCLHVDQUF5RDs7SUFDekQsaUNBQXdCOztJQUN4QixvQ0FBNEI7O0lBQzVCLCtCQUdFOztJQUNGLHVDQUFzQjs7SUFFdEIsdUNBQXdFOztJQUN4RSxrQ0FBc0Q7O0lBRXRELHNDQUFzQzs7SUFDdEMsa0NBQWlDOztJQVlqQyxxQ0FBVzs7SUFDWCx3Q0FBYzs7Ozs7SUFFZCx5Q0FBNEI7Ozs7O0lBQzVCLDJDQUErQjs7Ozs7SUFDL0IseUNBQXVCOzs7OztJQUN2QixzQ0FBb0I7O0lBMERwQixtQ0FxQkM7O0lBQ0QsOENBT0M7O0lBRUQsd0NBb0JDOzs7OztJQTNHVyw2QkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lcixcclxuICAgIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQgLCBPbkRlc3Ryb3ksIEhvc3RCaW5kaW5nfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCB0eXBlIFN0aWNreVN0YXR1cyA9ICAnbm9ybWFsJyB8ICdmb2xsb3cnIHwgJ3N0YXknIHwgJ3JlbWFpbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZC1zdGlja3knLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8ZGl2ICNzdGlja3lXcmFwcGVyIFtzdHlsZS56SW5kZXhdPVwiekluZGV4XCI+XHJcbiAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICBgLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFN0aWNreUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBIb3N0QmluZGluZygnc3R5bGUucG9zaXRpb24nKSBob3N0UG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgQElucHV0KCkgekluZGV4OiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBjb250YWluZXI6IEVsZW1lbnQ7IC8vIOm7mOiupOWAvOeItuWuueWZqFxyXG4gICAgQElucHV0KCkgdmlldzoge1xyXG4gICAgICAgIHRvcD86IG51bWJlcixcclxuICAgICAgICBib3R0b20/OiBudW1iZXIsXHJcbiAgICB9O1xyXG4gICAgQElucHV0KCkgc2Nyb2xsVGFyZ2V0O1xyXG5cclxuICAgIEBPdXRwdXQoKSBzdGF0dXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxTdGlja3lTdGF0dXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQFZpZXdDaGlsZCgnc3RpY2t5V3JhcHBlcicsIHsgc3RhdGljOiB0cnVlIH0pIHdyYXBwZXI7XHJcblxyXG4gICAgX3ByZXZTdGF0dXM6IFN0aWNreVN0YXR1cyA9IHVuZGVmaW5lZDtcclxuICAgIF9zdGF0dXM6IFN0aWNreVN0YXR1cyA9ICdub3JtYWwnO1xyXG4gICAgc2V0IHN0YXR1cyhzdGF0dXM6IFN0aWNreVN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgIT09IHRoaXMuX3N0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2U3RhdHVzID0gdGhpcy5fc3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzUHJvY2Vzcyh0aGlzLl9zdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzdGF0dXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICAgIH1cclxuXHJcbiAgICBwYXJlbnROb2RlO1xyXG4gICAgY29udGFpbmVyTGVmdDsgLy8g55So5LqO55uR5ZCs5piv5ZCm5piv5qiq5ZCR5rua5YqoXHJcblxyXG4gICAgcHJpdmF0ZSBUSFJPVFRMRV9ERUxBWSA9IDE2O1xyXG4gICAgcHJpdmF0ZSBUSFJPVFRMRV9UUklHR0VSID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxQcmVTdGFydDtcclxuICAgIHByaXZhdGUgc2Nyb2xsVGltZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIGlmICggIXRoaXMuY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgPSB0aGlzLnNjcm9sbFRhcmdldCB8fCB3aW5kb3c7IC8vIHdpbmRvd+aciXNjcm9sbOS6i+S7tu+8jGRvY3VtZW50LmRvY3VtZW50RWxlbWVudOayoeaciXNjcm9sbOS6i+S7tlxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudGhyb3R0bGUpO1xyXG4gICAgICAgIHRoaXMuaW5pdFNjcm9sbFN0YXR1cyh0aGlzLnNjcm9sbFRhcmdldCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy50aHJvdHRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdHVzUHJvY2VzcyhzdGF0dXMpIHtcclxuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xyXG4gICAgICAgICAgICBjYXNlICdub3JtYWwnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0YXRpYyc7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnZm9sbG93JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwICkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3N0YXknOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID1cclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudE5vZGUsICd0b3AnKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JlbWFpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnIHx8IHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uICE9PSAnYWJzb2x1dGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudE5vZGUsICd0b3AnKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7IC8vIOimgeWFiOi9rOS4umFic29sdXRl5YaN6K6h566X77yM5ZCm5YiZ5aaC5p6c5aSE5LqO6Z2eZml4ZWTlvbHlk43orqHnrpdcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZW1haW5Qb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCB0aGlzLmNvbnRhaW5lcikgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudE5vZGUsICdsZWZ0JykgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgICB0aHJvdHRsZSA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBmbiA9IHRoaXMuc2Nyb2xsQW5kUmVzaXplSG9jaztcclxuICAgICAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxUaW1lcikge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxUaW1lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxQcmVTdGFydCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gdGltZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbWUgLSB0aGlzLnNjcm9sbFByZVN0YXJ0ID4gdGhpcy5USFJPVFRMRV9UUklHR0VSKSB7XHJcbiAgICAgICAgICAgIGZuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsUHJlU3RhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxQcmVTdGFydCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICAgICAgfSwgdGhpcy5USFJPVFRMRV9ERUxBWSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2Nyb2xsQW5kUmVzaXplSG9jayA9ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtICh0aGlzLmNvbnRhaW5lckxlZnQgfHwgMCkgICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ3N0YXknO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckxlZnQgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyKTtcclxuICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wID4gKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ25vcm1hbCc7ICAgLy8g5YWo5bGA5ruR5Yqo77yIY29udGFpbmVyIT09cGFyZW50Tm9kZe+8ieaXtuWAmeWinuWKoOmihOWIpFxyXG4gICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICArIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCwgMTApXHJcbiAgICAgICAgICAgKyBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMClcclxuICAgICAgICAgICAgICAgPj0gKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApKSB7XHJcbiAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnbm9ybWFsJztcclxuICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tXHJcbiAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKVxyXG4gICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTApXHJcbiAgICAgICAgICAgLSB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgICAgPCAodGhpcy52aWV3ICYmIHRoaXMudmlldy50b3AgfHwgMCkgKyAodGhpcy52aWV3ICYmIHRoaXMudmlldy5ib3R0b20gfHwgMClcclxuICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAncmVtYWluJztcclxuICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCwgMTApIDwgKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApKVxyXG4gICAgICAgICApIHtcclxuICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdmb2xsb3cnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKGVsZW1lbnQsIHJlbGF0aXZlRWxlbWVudCwgZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0ge1xyXG4gICAgICAgICAgICAnbGVmdCc6IFsnbGVmdCcsICdMZWZ0J10sXHJcbiAgICAgICAgICAgICd0b3AnOiBbJ3RvcCcsICdUb3AnXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocmVsYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5W2RpcmVjdGlvbl1bMF1dXHJcbiAgICAgICAgICAgICAgICAgICAgLSByZWxhdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5W2RpcmVjdGlvbl1bMF1dXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydwYWRkaW5nJyArIGtleVtkaXJlY3Rpb25dWzFdXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydib3JkZXInICsga2V5W2RpcmVjdGlvbl1bMV0gKyAnV2lkdGgnXSwgMTApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhbGN1bGF0ZVJlbWFpblBvc2l0aW9uKGVsZW1lbnQsIHJlbGF0aXZlRWxlbWVudCwgY29udGFpbmVyKSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgIC0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICArIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICAgICAgICAgICAtIHJlbGF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICAgICAgICAgICAtIHBhcnNlSW50KGNvbXB1dGVkU3R5bGVbJ3BhZGRpbmdUb3AnXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydib3JkZXJUb3BXaWR0aCddLCAxMClcclxuICAgICAgICAgICAgICAgICAgICAtIHBhcnNlSW50KGNvbXB1dGVkU3R5bGVbJ3BhZGRpbmdCb3R0b20nXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydib3JkZXJCb3R0b21XaWR0aCddLCAxMCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPCAwID8gMCA6IHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFNjcm9sbFN0YXR1cyh0YXJnZXQpIHtcclxuICAgICAgY29uc3Qgc2Nyb2xsVGFyZ2V0cyA9IHRhcmdldCA9PT0gd2luZG93ID8gW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZG9jdW1lbnQuYm9keV0gOiBbdGFyZ2V0XTtcclxuICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcclxuICAgICAgc2Nyb2xsVGFyZ2V0cy5mb3JFYWNoKHNjcm9sbFRhcmdldCA9PiB7XHJcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldC5zY3JvbGxUb3AgJiYgc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCA+IDApIHtcclxuICAgICAgICAgICAgZmxhZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KHRoaXMuc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmj5Dkvpvnu5nkuJrliqHoh6rlt7Hop6blj5FcclxuICAgICAqIOeUqOazle+8mlxyXG4gICAgICogMS7mjZXojrfmiYDmnIlzdGlja3nvvJpgYGBAVmlld0NoaWxkcmVuKFN0aWNreUNvbXBvbmVudCkgc3RpY2tpZXM7YGBgXHJcbiAgICAgKiAyLuinpuWPkeWIt+aWsO+8muW9k+mcgOimgeaJi+WKqOinpuWPkeabtOaWsOeahOaXtuWAme+8jOavlOWmguiuoumYheaVsOaNrui/lOWbnuWQjumhtemdoumrmOW6puWPkeeUn+WPmOWMluWPr+S7peiwg+eUqCBgYGBzdGlja2llcy5mb3JFYWNoKHN0aWNreSA9PiBzdGlja3kucmVjYWxjdWxhdGVQb3NpdGlvbigpKTtgYGBcclxuICAgICAqIOaFjueUqO+8jOWwkeeUqO+8jCDkvb/nlKjlpKrlpJrkvJrlvbHlk43mgKfog73jgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY2FsY3VsYXRlUG9zaXRpb24oKSB7XHJcbiAgICAgIHRoaXMuaW5pdFNjcm9sbFN0YXR1cyh0aGlzLnNjcm9sbFRhcmdldCk7XHJcbiAgICB9XHJcbn1cclxuIl19