UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

195 lines 19.3 kB
/** * @fileoverview added by tsickle * Generated from: movable.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, HostListener, ElementRef, Input } from '@angular/core'; export class MovableDirective { /** * @param {?} el */ constructor(el) { this.el = el; this.topStart = 0; this.leftStart = 0; this._allowDrag = false; this.checkHandleTarget = (/** * @param {?} target * @param {?} element * @return {?} */ function (target, element) { if (!element) { return false; } // Checks if the target is the element clicked, then checks each child element of element as well // Ignores button clicks // Ignore elements of type button if (element.tagName === 'BUTTON') { return false; } // If the target was found, return true (handle was found) if (element === target) { return true; } // Recursively iterate this elements children for (const /** @type {?} */ child in element.children) { if (element.children.hasOwnProperty(child)) { if (this.checkHandleTarget(target, element.children[child])) { return true; } } } // Handle was not found in this lineage // Note: return false is ignore unless it is the parent element return false; }); } /** * @return {?} */ ngOnInit() { this.element = this.moveEl || this.el.nativeElement; // css changes if (this._allowDrag) { this.element.style.position = 'relative'; } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes['moveEl']) { this.element = this.moveEl || this.el.nativeElement; } } /** * @param {?} event * @return {?} */ onMouseDown(event) { if (event.button === 2 || !this.checkHandleTarget(event.target, this.handle)) { return; // prevents right click drag, remove his if you don't want it } this.md = true; this.topStart = event.clientY - this.element.style.top.replace('px', ''); this.leftStart = event.clientX - this.element.style.left.replace('px', ''); } /** * @param {?} event * @return {?} */ onMouseUp(event) { this.md = false; } /** * @param {?} event * @return {?} */ onMouseMove(event) { if (this.md && this._allowDrag) { // 阻止拖动过程中文字被选中 event.stopPropagation(); event.preventDefault(); // 判断边界条件 /** @type {?} */ const modalRect = this.element.getBoundingClientRect(); /** @type {?} */ const parentRect = this.element.parentNode.getBoundingClientRect(); // 当前偏移量 /** @type {?} */ let currentTop = event.clientY - this.topStart; /** @type {?} */ let currentLeft = event.clientX - this.leftStart; // 计算上下距离,按照parentNode的位置计算偏移量,后续parentNode存在偏移量,需要考虑偏移量 /** @type {?} */ const maxTop = window.innerHeight - parentRect.top - modalRect.height; currentTop = ((parentRect.top + currentTop) <= 0 && -parentRect.top) || ((maxTop - currentTop <= 0) && maxTop) || currentTop; /** @type {?} */ const halfWidth = (window.innerWidth - modalRect.width) / 2; // 计算左右距离,默认居中,后续parentNode存在偏移量,需要考虑偏移量 currentLeft = ((currentLeft + halfWidth) <= 0 && -halfWidth) || ((halfWidth - currentLeft) <= 0 && halfWidth) || currentLeft; this.element.style.top = currentTop + 'px'; this.element.style.left = currentLeft + 'px'; } } /** * @param {?} event * @return {?} */ onTouchStart(event) { this.md = true; this.topStart = event.changedTouches[0].clientY - this.element.style.top.replace('px', ''); this.leftStart = event.changedTouches[0].clientX - this.element.style.left.replace('px', ''); event.stopPropagation(); } /** * @return {?} */ onTouchEnd() { this.md = false; } /** * @param {?} event * @return {?} */ onTouchMove(event) { if (this.md && this._allowDrag) { this.element.style.top = (event.changedTouches[0].clientY - this.topStart) + 'px'; this.element.style.left = (event.changedTouches[0].clientX - this.leftStart) + 'px'; } event.stopPropagation(); } /** * @param {?} value * @return {?} */ set allowDrag(value) { this._allowDrag = value; if (this._allowDrag) { this.handle.style.cursor = 'move'; } } } MovableDirective.decorators = [ { type: Directive, args: [{ selector: '[dMovable]' },] } ]; /** @nocollapse */ MovableDirective.ctorParameters = () => [ { type: ElementRef } ]; MovableDirective.propDecorators = { handle: [{ type: Input }], moveEl: [{ type: Input }], onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }], onMouseUp: [{ type: HostListener, args: ['document:mouseup', ['$event'],] }], onMouseMove: [{ type: HostListener, args: ['document:mousemove', ['$event'],] }], onTouchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }], onTouchEnd: [{ type: HostListener, args: ['document:touchend',] }], onTouchMove: [{ type: HostListener, args: ['document:touchmove', ['$event'],] }], allowDrag: [{ type: Input, args: ['dMovable',] }] }; if (false) { /** @type {?} */ MovableDirective.prototype.topStart; /** @type {?} */ MovableDirective.prototype.leftStart; /** @type {?} */ MovableDirective.prototype._allowDrag; /** @type {?} */ MovableDirective.prototype.md; /** @type {?} */ MovableDirective.prototype.handle; /** @type {?} */ MovableDirective.prototype.moveEl; /** @type {?} */ MovableDirective.prototype.element; /** @type {?} */ MovableDirective.prototype.checkHandleTarget; /** @type {?} */ MovableDirective.prototype.el; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9tb2RhbC8iLCJzb3VyY2VzIjpbIm1vdmFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFVLEtBQUssRUFBMkIsTUFBTSxlQUFlLENBQUM7QUFLM0csTUFBTSxPQUFPLGdCQUFnQjs7OztJQVN6QixZQUFtQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQVJqQyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFrRm5CLHNCQUFpQjs7Ozs7UUFBRyxVQUFVLE1BQU0sRUFBRSxPQUFPO1lBQzNDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELGlHQUFpRztZQUNqRyx3QkFBd0I7WUFDeEIsaUNBQWlDO1lBQ2pDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsMERBQTBEO1lBQzFELElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtnQkFDcEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELDZDQUE2QztZQUM3QyxLQUFLLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3pELE9BQU8sSUFBSSxDQUFDO3FCQUNmO2lCQUNKO2FBQ0o7WUFDRCx1Q0FBdUM7WUFDdkMsK0RB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QUUsR0FBRyxJQUFJLENBQUM7U0FDdkY7UUFDRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUE2QkQsSUFDSSxTQUFTLENBQUMsS0FBYztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUNuQztJQUNILENBQUM7OztZQXpISixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFlBQVk7YUFDdkI7Ozs7WUFKZ0MsVUFBVTs7O3FCQVV0QyxLQUFLO3FCQUNMLEtBQUs7MEJBbUJMLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7d0JBVXBDLFlBQVksU0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkFLM0MsWUFBWSxTQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDOzJCQXVCN0MsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQzt5QkFRckMsWUFBWSxTQUFDLG1CQUFtQjswQkFLaEMsWUFBWSxTQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO3dCQW9DN0MsS0FBSyxTQUFDLFVBQVU7Ozs7SUEvR2pCLG9DQUFhOztJQUNiLHFDQUFjOztJQUNkLHNDQUFtQjs7SUFDbkIsOEJBQVk7O0lBQ1osa0NBQTZCOztJQUM3QixrQ0FBNkI7O0lBQzdCLG1DQUFvQjs7SUE4RXBCLDZDQXlCRTs7SUFyR1UsOEJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2RNb3ZhYmxlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1vdmFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgICB0b3BTdGFydCA9IDA7XHJcbiAgICBsZWZ0U3RhcnQgPSAwO1xyXG4gICAgX2FsbG93RHJhZyA9IGZhbHNlO1xyXG4gICAgbWQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBoYW5kbGU6IEhUTUxFbGVtZW50O1xyXG4gICAgQElucHV0KCkgbW92ZUVsOiBIVE1MRWxlbWVudDtcclxuICAgIHB1YmxpYyBlbGVtZW50OiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIGVsOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLm1vdmVFbCB8fCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIC8vIGNzcyBjaGFuZ2VzXHJcbiAgICAgIGlmICh0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICBpZiAoY2hhbmdlc1snbW92ZUVsJ10pIHtcclxuICAgICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMubW92ZUVsIHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyIHx8ICF0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KGV2ZW50LnRhcmdldCwgdGhpcy5oYW5kbGUpKSB7XHJcbiAgICAgICAgcmV0dXJuOyAvLyBwcmV2ZW50cyByaWdodCBjbGljayBkcmFnLCByZW1vdmUgaGlzIGlmIHlvdSBkb24ndCB3YW50IGl0XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudG9wU3RhcnQgPSBldmVudC5jbGllbnRZIC0gdGhpcy5lbGVtZW50LnN0eWxlLnRvcC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgICAgdGhpcy5sZWZ0U3RhcnQgPSBldmVudC5jbGllbnRYIC0gdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgdGhpcy5tZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICBpZiAodGhpcy5tZCAmJiB0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgICAvLyDpmLvmraLmi5bliqjov4fnqIvkuK3mloflrZfooqvpgInkuK1cclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIC8vIOWIpOaWrei+ueeVjOadoeS7tlxyXG4gICAgICAgIGNvbnN0IG1vZGFsUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgLy8g5b2T5YmN5YGP56e76YePXHJcbiAgICAgICAgbGV0IGN1cnJlbnRUb3AgPSBldmVudC5jbGllbnRZIC0gdGhpcy50b3BTdGFydDtcclxuICAgICAgICBsZXQgY3VycmVudExlZnQgPSBldmVudC5jbGllbnRYIC0gdGhpcy5sZWZ0U3RhcnQ7XHJcbiAgICAgICAgLy8g6K6h566X5LiK5LiL6Led56a777yM5oyJ54WncGFyZW50Tm9kZeeahOS9jee9ruiuoeeul+WBj+enu+mHj++8jOWQjue7rXBhcmVudE5vZGXlrZjlnKjlgY/np7vph4/vvIzpnIDopoHogIPomZHlgY/np7vph49cclxuICAgICAgICBjb25zdCBtYXhUb3AgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBwYXJlbnRSZWN0LnRvcCAtIG1vZGFsUmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgY3VycmVudFRvcCA9ICgocGFyZW50UmVjdC50b3AgKyBjdXJyZW50VG9wKSA8PSAwICAmJiAtcGFyZW50UmVjdC50b3ApIHx8ICgobWF4VG9wIC0gY3VycmVudFRvcCA8PSAwICkgJiYgbWF4VG9wKSB8fCBjdXJyZW50VG9wO1xyXG4gICAgICAgIGNvbnN0IGhhbGZXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtIG1vZGFsUmVjdC53aWR0aCkgLyAyO1xyXG4gICAgICAgIC8vIOiuoeeul+W3puWPs+i3neemu++8jOm7mOiupOWxheS4re+8jOWQjue7rXBhcmVudE5vZGXlrZjlnKjlgY/np7vph4/vvIzpnIDopoHogIPomZHlgY/np7vph49cclxuICAgICAgICBjdXJyZW50TGVmdCA9ICgoY3VycmVudExlZnQgKyBoYWxmV2lkdGgpIDw9IDAgJiYgLWhhbGZXaWR0aCkgfHwgKChoYWxmV2lkdGggLSBjdXJyZW50TGVmdCkgPD0gMCAmJiBoYWxmV2lkdGgpIHx8IGN1cnJlbnRMZWZ0O1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50b3AgPSBjdXJyZW50VG9wICsgJ3B4JztcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9IGN1cnJlbnRMZWZ0ICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBbJyRldmVudCddKVxyXG4gICAgb25Ub3VjaFN0YXJ0KGV2ZW50OiBhbnkpIHtcclxuICAgICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudG9wU3RhcnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5lbGVtZW50LnN0eWxlLnRvcC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgICAgdGhpcy5sZWZ0U3RhcnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNoZW5kJylcclxuICAgIG9uVG91Y2hFbmQoKSB7XHJcbiAgICAgIHRoaXMubWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gICAgb25Ub3VjaE1vdmUoZXZlbnQ6IGFueSkge1xyXG4gICAgICBpZiAodGhpcy5tZCAmJiB0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudG9wID0gKCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy50b3BTdGFydCApICsgJ3B4JztcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9ICggZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMubGVmdFN0YXJ0ICkgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSGFuZGxlVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgZWxlbWVudCkge1xyXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2hlY2tzIGlmIHRoZSB0YXJnZXQgaXMgdGhlIGVsZW1lbnQgY2xpY2tlZCwgdGhlbiBjaGVja3MgZWFjaCBjaGlsZCBlbGVtZW50IG9mIGVsZW1lbnQgYXMgd2VsbFxyXG4gICAgICAvLyBJZ25vcmVzIGJ1dHRvbiBjbGlja3NcclxuICAgICAgLy8gSWdub3JlIGVsZW1lbnRzIG9mIHR5cGUgYnV0dG9uXHJcbiAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSWYgdGhlIHRhcmdldCB3YXMgZm91bmQsIHJldHVybiB0cnVlIChoYW5kbGUgd2FzIGZvdW5kKVxyXG4gICAgICBpZiAoZWxlbWVudCA9PT0gdGFyZ2V0KSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBSZWN1cnNpdmVseSBpdGVyYXRlIHRoaXMgZWxlbWVudHMgY2hpbGRyZW5cclxuICAgICAgZm9yIChjb25zdCAvKiogQHR5cGUgez99ICovIGNoaWxkIGluIGVsZW1lbnQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuLmhhc093blByb3BlcnR5KGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KHRhcmdldCwgZWxlbWVudC5jaGlsZHJlbltjaGlsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kbGUgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGxpbmVhZ2VcclxuICAgICAgLy8gTm90ZTogcmV0dXJuIGZhbHNlIGlzIGlnbm9yZSB1bmxlc3MgaXQgaXMgdGhlIHBhcmVudCBlbGVtZW50XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KCdkTW92YWJsZScpXHJcbiAgICBzZXQgYWxsb3dEcmFnKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMuX2FsbG93RHJhZyA9IHZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5fYWxsb3dEcmFnKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGUuc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19