UNPKG

ng-feedback

Version:

An angular directive for sending feedback featuring Angular 6, Html2canvas, Angular Material, Rxjs, inspired by Google send feedback, based on angular-cli.

154 lines (153 loc) 16.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { fromEvent as observableFromEvent } from 'rxjs'; import { takeUntil, finalize, map, mergeMap } from 'rxjs/operators'; import { Component, ElementRef, Input, Output, EventEmitter, ViewChild } from '@angular/core'; import { FeedbackService } from '../feedback.service'; var FeedbackToolbarComponent = /** @class */ (function () { function FeedbackToolbarComponent(el, feedbackService) { this.el = el; this.feedbackService = feedbackService; this.manipulate = new EventEmitter(); this.disableToolbarTips = false; this.isSwitch = false; this.isDragging = false; this.vars = {}; this.vars = feedbackService.initialVariables; } /** * @return {?} */ FeedbackToolbarComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { /** @type {?} */ var elStyle = this.el.nativeElement.style; elStyle.position = 'absolute'; elStyle.left = '43%'; elStyle.top = '60%'; this.addDragListenerOnMoveBtn(); }; /** * @return {?} */ FeedbackToolbarComponent.prototype.ngOnChanges = /** * @return {?} */ function () { this.isSwitch = this.drawColor !== this.feedbackService.highlightedColor; }; /** * @return {?} */ FeedbackToolbarComponent.prototype.done = /** * @return {?} */ function () { this.manipulate.emit('done'); }; /** * @return {?} */ FeedbackToolbarComponent.prototype.toggleHighlight = /** * @return {?} */ function () { this.isSwitch = false; this.manipulate.emit(this.feedbackService.highlightedColor); }; /** * @return {?} */ FeedbackToolbarComponent.prototype.toggleHide = /** * @return {?} */ function () { this.isSwitch = true; this.manipulate.emit(this.feedbackService.hiddenColor); }; /** * @return {?} */ FeedbackToolbarComponent.prototype.addDragListenerOnMoveBtn = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var mouseUp = observableFromEvent(this.toggleMoveBtn.nativeElement, 'mouseup'); /** @type {?} */ var mouseMove = observableFromEvent(document.documentElement, 'mousemove'); /** @type {?} */ var mouseDown = observableFromEvent(this.toggleMoveBtn.nativeElement, 'mousedown'); /** @type {?} */ var mouseDrag = mouseDown.pipe(mergeMap(function (md) { _this.feedbackService.setIsDraggingToolbar(true); /** @type {?} */ var startX = md.offsetX; /** @type {?} */ var startY = md.offsetY; _this.disableToolbarTips = true; _this.isDragging = true; // Calculate dif with mousemove until mouseup return mouseMove.pipe(map(function (mm) { mm.preventDefault(); return { left: mm.clientX - startX, top: mm.clientY - startY }; }), finalize(function () { _this.isDragging = false; _this.disableToolbarTips = false; _this.feedbackService.setIsDraggingToolbar(false); }), takeUntil(mouseUp)); })); mouseDrag.subscribe(function (pos) { _this.el.nativeElement.style.left = pos.left + 'px'; _this.el.nativeElement.style.top = pos.top + 'px'; }); }; FeedbackToolbarComponent.decorators = [ { type: Component, args: [{ selector: 'feedback-toolbar', template: "<div exclude-rect=\"true\" class=\"toolbar\">\r\n <div class=\"move-toolbar\" #toggleMove [matTooltip]=\"vars['moveToolbarTip']\" [matTooltipDisabled]=\"disableToolbarTips\">\r\n <svg focusable=\"false\" aria-label=\"Drag\" fill=\"#BDBDBD\" height=\"56\" width=\"16\"\r\n viewBox=\"-2 2 12 12\">\r\n <circle cx=\"1.5\" cy=\"1.5\" r=\"1.5\"></circle>\r\n <circle cx=\"1.5\" cy=\"7.5\" r=\"1.5\"></circle>\r\n <circle cx=\"1.5\" cy=\"13.5\" r=\"1.5\"></circle>\r\n <circle cx=\"6.5\" cy=\"1.5\" r=\"1.5\"></circle>\r\n <circle cx=\"6.5\" cy=\"7.5\" r=\"1.5\"></circle>\r\n <circle cx=\"6.5\" cy=\"13.5\" r=\"1.5\"></circle>\r\n </svg>\r\n </div>\r\n <button #highlightBtn (click)=\"toggleHighlight()\" [matTooltip]=\"vars['highlightTip']\"\r\n [matTooltipDisabled]=\"disableToolbarTips\" class=\"highlight-toggle\" [ngClass]=\"{'deepen-color': !isSwitch}\">\r\n <span class=\"toggle\">\r\n <svg focusable=\"false\" aria-label=\"\" viewBox=\"0 0 24 24\" height=\"36\" width=\"36\"\r\n fill=\"#ffd740\">\r\n <path d=\"M3 3h18v18H3z\"></path>\r\n </svg>\r\n\r\n <svg focusable=\"false\" aria-label=\"\" fill=\"#757575\" viewBox=\"0 0 24 24\"\r\n height=\"36\" width=\"36\" [ngClass]=\"{'toggle-decorator': !isSwitch}\" *ngIf=\"!isSwitch\">\r\n <path\r\n d=\"M21 17h-2.58l2.51 2.56c-.18.69-.73 1.26-1.41 1.44L17 18.5V21h-2v-6h6v2zM19 7h2v2h-2V7zm2-2h-2V3.08c1.1 0 2 .92 2 1.92zm-6-2h2v2h-2V3zm4 8h2v2h-2v-2zM9 21H7v-2h2v2zM5 9H3V7h2v2zm0-5.92V5H3c0-1 1-1.92 2-1.92zM5 17H3v-2h2v2zM9 5H7V3h2v2zm4 0h-2V3h2v2zm0 16h-2v-2h2v2zm-8-8H3v-2h2v2zm0 8.08C3.9 21.08 3 20 3 19h2v2.08z\"></path>\r\n </svg>\r\n </span>\r\n </button>\r\n <button (click)=\"toggleHide()\" [matTooltip]=\"vars['hideTip']\" [matTooltipDisabled]=\"disableToolbarTips\"\r\n class=\"hide-toggle\" [ngClass]=\"{'deepen-color': isSwitch}\">\r\n <span class=\"toggle\">\r\n <svg focusable=\"false\" aria-label=\"\" viewBox=\"0 0 24 24\" height=\"36\" width=\"36\"\r\n fill=\"#000\">\r\n <path d=\"M3 3h18v18H3z\"></path>\r\n </svg>\r\n <svg focusable=\"false\" aria-label=\"\" fill=\"#757575\" viewBox=\"0 0 24 24\"\r\n height=\"36\" width=\"36\" [ngClass]=\"{'toggle-decorator': isSwitch}\" *ngIf=\"isSwitch\">\r\n <path\r\n d=\"M21 17h-2.58l2.51 2.56c-.18.69-.73 1.26-1.41 1.44L17 18.5V21h-2v-6h6v2zM19 7h2v2h-2V7zm2-2h-2V3.08c1.1 0 2 .92 2 1.92zm-6-2h2v2h-2V3zm4 8h2v2h-2v-2zM9 21H7v-2h2v2zM5 9H3V7h2v2zm0-5.92V5H3c0-1 1-1.92 2-1.92zM5 17H3v-2h2v2zM9 5H7V3h2v2zm4 0h-2V3h2v2zm0 16h-2v-2h2v2zm-8-8H3v-2h2v2zm0 8.08C3.9 21.08 3 20 3 19h2v2.08z\"></path>\r\n </svg>\r\n </span>\r\n </button>\r\n <button mat-button class=\"merge-button\" (click)=\"done()\">{{vars['editDoneLabel']}}</button>\r\n</div>\r\n", styles: [".toolbar{align-items:center;background-color:#fff;border-radius:2px;box-shadow:rgba(0,0,0,.14) 0 24px 38px 3px,rgba(0,0,0,.12) 0 9px 46px 8px,rgba(0,0,0,.2) 0 11px 15px -7px;cursor:pointer;display:-webkit-inline-flex;flex-direction:row;height:56px;min-width:232px;pointer-events:auto;overflow:visible;position:absolute;margin:0 auto;width:228px;bottom:0;top:25%;left:0;right:0;z-index:999}.move-toolbar{cursor:-webkit-grab;height:56px;padding:0 12px;position:relative}.move-toolbar:active{cursor:-webkit-grabbing}.toggle{display:inline-block;position:relative;height:36px;width:36px}.toggle-decorator{left:0;position:absolute;top:0}.highlight-toggle{align-items:center;background-color:#fff;border:none;box-sizing:border-box;cursor:pointer;display:-webkit-flex;justify-content:center;outline:0;padding:10px;pointer-events:auto;position:relative;height:56px;width:56px}.deepen-color{background-color:#e0e0e0!important}.hide-toggle{align-items:center;background-color:#fff;border:none;box-sizing:border-box;cursor:pointer;display:-webkit-flex;justify-content:center;outline:0;padding:10px;pointer-events:auto;position:relative;height:56px;width:56px}.merge-button{padding:0!important;margin:0 10px!important;min-width:56px;color:#4285f4}"] }] } ]; /** @nocollapse */ FeedbackToolbarComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: FeedbackService } ]; }; FeedbackToolbarComponent.propDecorators = { drawColor: [{ type: Input }], manipulate: [{ type: Output }], toggleMoveBtn: [{ type: ViewChild, args: ['toggleMove',] }] }; return FeedbackToolbarComponent; }()); export { FeedbackToolbarComponent }; if (false) { /** @type {?} */ FeedbackToolbarComponent.prototype.drawColor; /** @type {?} */ FeedbackToolbarComponent.prototype.manipulate; /** @type {?} */ FeedbackToolbarComponent.prototype.disableToolbarTips; /** @type {?} */ FeedbackToolbarComponent.prototype.toggleMoveBtn; /** @type {?} */ FeedbackToolbarComponent.prototype.isSwitch; /** @type {?} */ FeedbackToolbarComponent.prototype.isDragging; /** @type {?} */ FeedbackToolbarComponent.prototype.vars; /** @type {?} */ FeedbackToolbarComponent.prototype.el; /** @type {?} */ FeedbackToolbarComponent.prototype.feedbackService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZGJhY2stdG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1mZWVkYmFjay8iLCJzb3VyY2VzIjpbImxpYi9mZWVkYmFjay10b29sYmFyL2ZlZWRiYWNrLXRvb2xiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxJQUFJLG1CQUFtQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXRELE9BQU8sRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBaUIsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7SUFxQmxELGtDQUFtQixFQUFjLEVBQVUsZUFBZ0M7UUFBeEQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjswQkFSdkQsSUFBSSxZQUFZLEVBQVU7a0NBQ2xCLEtBQUs7d0JBR2YsS0FBSzswQkFDSCxLQUFLO29CQUNILEVBQUU7UUFHdEIsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7S0FDOUM7Ozs7SUFFTSxrREFBZTs7Ozs7UUFDcEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDOzs7OztJQUczQiw4Q0FBVzs7OztRQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQzs7Ozs7SUFHcEUsdUNBQUk7Ozs7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Ozs7SUFHeEIsa0RBQWU7Ozs7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzs7OztJQUd2RCw2Q0FBVTs7OztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7Ozs7O0lBR2xELDJEQUF3Qjs7Ozs7O1FBQzdCLElBQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDOztRQUNqRixJQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDOztRQUM3RSxJQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQzs7UUFDckYsSUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBQyxFQUFjO1lBQ3ZELEtBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBQ2hELElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUM7O1lBQzFCLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDMUIsS0FBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUMvQixLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzs7WUFFdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUNuQixHQUFHLENBQUMsVUFBQyxFQUFjO2dCQUNqQixFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU87b0JBQ0wsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTTtvQkFDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTTtpQkFDekIsQ0FBQzthQUNILENBQUMsRUFDRixRQUFRLENBQUM7Z0JBQ1AsS0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLEtBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEQsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0osU0FBUyxDQUFDLFNBQVMsQ0FDakIsVUFBQyxHQUFHO1lBQ0YsS0FBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNuRCxLQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ2xELENBQUMsQ0FBQzs7O2dCQTlFUixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsK3pGQUFnRDs7aUJBRWpEOzs7O2dCQVJrQixVQUFVO2dCQUNyQixlQUFlOzs7NEJBVXBCLEtBQUs7NkJBRUwsTUFBTTtnQ0FHTixTQUFTLFNBQUMsWUFBWTs7bUNBbkJ6Qjs7U0FhYSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Zyb21FdmVudCBhcyBvYnNlcnZhYmxlRnJvbUV2ZW50fSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7dGFrZVVudGlsLCBmaW5hbGl6ZSwgbWFwLCBtZXJnZU1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBBZnRlclZpZXdJbml0LCBWaWV3Q2hpbGQsIE9uQ2hhbmdlc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7RmVlZGJhY2tTZXJ2aWNlfSBmcm9tICcuLi9mZWVkYmFjay5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZlZWRiYWNrLXRvb2xiYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mZWVkYmFjay10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mZWVkYmFjay10b29sYmFyLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEZlZWRiYWNrVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZHJhd0NvbG9yOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG1hbmlwdWxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBwdWJsaWMgZGlzYWJsZVRvb2xiYXJUaXBzID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgndG9nZ2xlTW92ZScpXHJcbiAgcHJpdmF0ZSB0b2dnbGVNb3ZlQnRuOiBFbGVtZW50UmVmO1xyXG4gIHB1YmxpYyBpc1N3aXRjaCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgcHVibGljIHZhcnM6IG9iamVjdCA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgZmVlZGJhY2tTZXJ2aWNlOiBGZWVkYmFja1NlcnZpY2UpIHtcclxuICAgIHRoaXMudmFycyA9IGZlZWRiYWNrU2VydmljZS5pbml0aWFsVmFyaWFibGVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGNvbnN0IGVsU3R5bGUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGU7XHJcbiAgICBlbFN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgIGVsU3R5bGUubGVmdCA9ICc0MyUnO1xyXG4gICAgZWxTdHlsZS50b3AgPSAnNjAlJztcclxuICAgIHRoaXMuYWRkRHJhZ0xpc3RlbmVyT25Nb3ZlQnRuKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICB0aGlzLmlzU3dpdGNoID0gdGhpcy5kcmF3Q29sb3IgIT09IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmhpZ2hsaWdodGVkQ29sb3I7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG9uZSgpIHtcclxuICAgIHRoaXMubWFuaXB1bGF0ZS5lbWl0KCdkb25lJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlSGlnaGxpZ2h0KCkge1xyXG4gICAgdGhpcy5pc1N3aXRjaCA9IGZhbHNlO1xyXG4gICAgdGhpcy5tYW5pcHVsYXRlLmVtaXQodGhpcy5mZWVkYmFja1NlcnZpY2UuaGlnaGxpZ2h0ZWRDb2xvcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlSGlkZSgpIHtcclxuICAgIHRoaXMuaXNTd2l0Y2ggPSB0cnVlO1xyXG4gICAgdGhpcy5tYW5pcHVsYXRlLmVtaXQodGhpcy5mZWVkYmFja1NlcnZpY2UuaGlkZGVuQ29sb3IpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZERyYWdMaXN0ZW5lck9uTW92ZUJ0bigpIHtcclxuICAgIGNvbnN0IG1vdXNlVXAgPSBvYnNlcnZhYmxlRnJvbUV2ZW50KHRoaXMudG9nZ2xlTW92ZUJ0bi5uYXRpdmVFbGVtZW50LCAnbW91c2V1cCcpO1xyXG4gICAgY29uc3QgbW91c2VNb3ZlID0gb2JzZXJ2YWJsZUZyb21FdmVudChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdtb3VzZW1vdmUnKTtcclxuICAgIGNvbnN0IG1vdXNlRG93biA9IG9ic2VydmFibGVGcm9tRXZlbnQodGhpcy50b2dnbGVNb3ZlQnRuLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nKTtcclxuICAgIGNvbnN0IG1vdXNlRHJhZyA9IG1vdXNlRG93bi5waXBlKG1lcmdlTWFwKChtZDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICB0aGlzLmZlZWRiYWNrU2VydmljZS5zZXRJc0RyYWdnaW5nVG9vbGJhcih0cnVlKTtcclxuICAgICAgY29uc3Qgc3RhcnRYID0gbWQub2Zmc2V0WDtcclxuICAgICAgY29uc3Qgc3RhcnRZID0gbWQub2Zmc2V0WTtcclxuICAgICAgdGhpcy5kaXNhYmxlVG9vbGJhclRpcHMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAvLyBDYWxjdWxhdGUgZGlmIHdpdGggbW91c2Vtb3ZlIHVudGlsIG1vdXNldXBcclxuICAgICAgcmV0dXJuIG1vdXNlTW92ZS5waXBlKFxyXG4gICAgICAgIG1hcCgobW06IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgIG1tLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsZWZ0OiBtbS5jbGllbnRYIC0gc3RhcnRYLFxyXG4gICAgICAgICAgICB0b3A6IG1tLmNsaWVudFkgLSBzdGFydFlcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVUb29sYmFyVGlwcyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5mZWVkYmFja1NlcnZpY2Uuc2V0SXNEcmFnZ2luZ1Rvb2xiYXIoZmFsc2UpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRha2VVbnRpbChtb3VzZVVwKSk7XHJcbiAgICB9KSk7XHJcbiAgICBtb3VzZURyYWcuc3Vic2NyaWJlKFxyXG4gICAgICAocG9zKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBwb3MubGVmdCArICdweCc7XHJcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IHBvcy50b3AgKyAncHgnO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuIl19