@joniras/ngx-editor2
Version:
WYSIWYG Editor for Angular 8+
256 lines • 28.5 kB
JavaScript
var NgxTextEditorComponent_1;
import { __decorate } from "tslib";
import { Component, OnInit, Input, Output, ViewChild, EventEmitter, Renderer2, forwardRef, ElementRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { CommandExecutorService } from '../common/services/command-executor.service';
import { MessageService } from '../common/services/message.service';
import { ngxTextEditorConfig } from '../common/ngx-text-editor.defaults';
import * as Utils from '../common/utils/ngx-text-editor.utils';
let NgxTextEditorComponent = NgxTextEditorComponent_1 = class NgxTextEditorComponent {
/**
* @param _messageService service to send message to the editor message component
* @param _commandExecutor executes command from the toolbar
* @param _renderer access and manipulate the dom element
*/
constructor(_messageService, _commandExecutor, _renderer) {
this._messageService = _messageService;
this._commandExecutor = _commandExecutor;
this._renderer = _renderer;
/**
* The editor can be resized vertically.
*
* `basic` resizer enables the html5 reszier. Check here https://www.w3schools.com/cssref/css3_pr_resize.asp
*
* `stack` resizer enable a resizer that looks like as if in https://stackoverflow.com
*/
this.resizer = 'stack';
/**
* The config property is a JSON object
*
* All avaibale inputs inputs can be provided in the configuration as JSON
* inputs provided directly are considered as top priority
*/
this.config = ngxTextEditorConfig;
/** emits `blur` event when focused out from the textarea */
this.blur = new EventEmitter();
/** emits `focus` event when focused in to the textarea */
this.focus = new EventEmitter();
/** emits `uploadImage` event when image is selected */
this.uploadImage = new EventEmitter();
this.Utils = Utils;
}
/**
* events
*/
onTextAreaFocus() {
this.focus.emit('focus');
}
/** focus the text area when the editor is focussed */
onEditorFocus() {
this.textArea.nativeElement.focus();
}
/**
* Executed from the contentEditable section while the input property changes
* @param innerHTML html string from contentEditable
*/
onContentChange(innerHTML) {
if (typeof this.onChange === 'function') {
this.onChange(innerHTML);
this.togglePlaceholder(innerHTML);
}
}
onTextAreaBlur() {
/** save selection if focussed out */
this._commandExecutor.savedSelection = Utils.saveSelection();
if (typeof this.onTouched === 'function') {
this.onTouched();
}
this.blur.emit('blur');
}
/**
* Executed when the image from the disc is selected
* @param image uploaded file object
*/
onUploadImage(image) {
this.uploadImage.emit(image);
}
/**
* resizing text area
*
* @param offsetY vertical height of the eidtable portion of the editor
*/
resizeTextArea(offsetY) {
let newHeight = parseInt(this.height, 10);
newHeight += offsetY;
this.height = newHeight + 'px';
this.textArea.nativeElement.style.height = this.height;
}
/**
* editor actions, i.e., executes command from toolbar
*
* @param commandName name of the command to be executed
*/
executeCommand(commandName) {
try {
this._commandExecutor.execute(commandName);
}
catch (error) {
this._messageService.sendMessage(error.message);
}
}
/**
* Write a new value to the element.
*
* @param value value to be executed when there is a change in contenteditable
*/
writeValue(value) {
this.togglePlaceholder(value);
if (value === null || value === undefined || value === '' || value === '<br>') {
value = null;
}
this.refreshView(value);
}
/**
* Set the function to be called
* when the control receives a change event.
*
* @param fn a function
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* Set the function to be called
* when the control receives a touch event.
*
* @param fn a function
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* refresh view/HTML of the editor
*
* @param value html string from the editor
*/
refreshView(value) {
const normalizedValue = value === null ? '' : value;
this._renderer.setProperty(this.textArea.nativeElement, 'innerHTML', normalizedValue);
}
/**
* toggles placeholder based on input string
*
* @param value A HTML string from the editor
*/
togglePlaceholder(value) {
if (!value || value === '<br>' || value === '') {
this._renderer.addClass(this.ngxWrapper.nativeElement, 'show-placeholder');
}
else {
this._renderer.removeClass(this.ngxWrapper.nativeElement, 'show-placeholder');
}
}
/**
* returns a json containing input params
*/
getCollectiveParams() {
return {
editable: this.editable,
spellcheck: this.spellcheck,
placeholder: this.placeholder,
translate: this.translate,
height: this.height,
minHeight: this.minHeight,
width: this.width,
minWidth: this.minWidth,
enableToolbar: this.enableToolbar,
showToolbar: this.showToolbar,
imageEndPoint: this.imageEndPoint,
toolbar: this.toolbar
};
}
ngOnInit() {
/**
* set configuration
*/
this.config = this.Utils.getEditorConfiguration(this.config, ngxTextEditorConfig, this.getCollectiveParams());
this.height = this.height || this.textArea.nativeElement.offsetHeight;
this.executeCommand('enableObjectResizing');
}
};
NgxTextEditorComponent.ctorParameters = () => [
{ type: MessageService },
{ type: CommandExecutorService },
{ type: Renderer2 }
];
__decorate([
Input()
], NgxTextEditorComponent.prototype, "editable", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "spellcheck", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "placeholder", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "translate", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "height", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "minHeight", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "width", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "minWidth", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "toolbar", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "resizer", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "config", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "showToolbar", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "enableToolbar", void 0);
__decorate([
Input()
], NgxTextEditorComponent.prototype, "imageEndPoint", void 0);
__decorate([
Output()
], NgxTextEditorComponent.prototype, "blur", void 0);
__decorate([
Output()
], NgxTextEditorComponent.prototype, "focus", void 0);
__decorate([
Output()
], NgxTextEditorComponent.prototype, "uploadImage", void 0);
__decorate([
ViewChild('ngxTextArea', { static: true })
], NgxTextEditorComponent.prototype, "textArea", void 0);
__decorate([
ViewChild('ngxWrapper', { static: true })
], NgxTextEditorComponent.prototype, "ngxWrapper", void 0);
NgxTextEditorComponent = NgxTextEditorComponent_1 = __decorate([
Component({
selector: 'ngx-text-editor',
template: "<div class=\"ngx-text-editor\"\r\n id=\"ngxTextEditor\"\r\n [style.width]=\"config['width']\"\r\n [style.minWidth]=\"config['minWidth']\"\r\n tabindex=\"0\"\r\n (focus)=\"onEditorFocus()\">\r\n\r\n <ngx-text-editor-toolbar [config]=\"config\"\r\n (execute)=\"executeCommand($event)\"\r\n (uploadImage)=\"onUploadImage($event)\"></ngx-text-editor-toolbar>\r\n\r\n <!-- text area -->\r\n <div #ngxWrapper\r\n class=\"ngx-wrapper\">\r\n <div #ngxTextArea\r\n class=\"ngx-text-editor-textarea\"\r\n [attr.contenteditable]=\"config['editable']\"\r\n (input)=\"onContentChange($event.target.innerHTML)\"\r\n [attr.translate]=\"config['translate']\"\r\n [attr.spellcheck]=\"config['spellcheck']\"\r\n [style.height]=\"config['height']\"\r\n [style.minHeight]=\"config['minHeight']\"\r\n [style.resize]=\"Utils?.canResize(resizer)\"\r\n (focus)=\"onTextAreaFocus()\"\r\n (blur)=\"onTextAreaBlur()\"></div>\r\n\r\n <span class=\"ngx-text-editor-placeholder\">\r\n {{ placeholder || config['placeholder'] }}\r\n </span>\r\n </div>\r\n\r\n <ngx-text-editor-message></ngx-text-editor-message>\r\n\r\n <ngx-grippie *ngIf=\"resizer === 'stack'\"></ngx-grippie>\r\n</div>\r\n",
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxTextEditorComponent_1),
multi: true
}],
styles: [".ngx-text-editor{position:relative}.ngx-text-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868e96;opacity:1}.ngx-text-editor .ngx-wrapper{position:relative}.ngx-text-editor .ngx-wrapper .ngx-text-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border:1px solid #ddd;background-color:transparent;overflow-x:hidden;overflow-y:auto;z-index:2;position:relative}.ngx-text-editor .ngx-wrapper .ngx-text-editor-textarea.focus,.ngx-text-editor .ngx-wrapper .ngx-text-editor-textarea:focus{outline:0}.ngx-text-editor .ngx-wrapper .ngx-text-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.ngx-text-editor .ngx-wrapper .ngx-text-editor-textarea::before{content:normal!important}.ngx-text-editor .ngx-wrapper ::ng-deep p{margin-bottom:0}.ngx-text-editor .ngx-wrapper .ngx-text-editor-placeholder{display:none;position:absolute;top:0;padding:.5rem .8rem 1rem .9rem;z-index:1;color:#6c757d;opacity:1}.ngx-text-editor .ngx-wrapper.show-placeholder .ngx-text-editor-placeholder{display:block}"]
})
], NgxTextEditorComponent);
export { NgxTextEditorComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRleHQtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bqb25pcmFzL25neC1lZGl0b3IyLyIsInNvdXJjZXMiOlsibmd4LXRleHQtZWRpdG9yL25neC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFDLGlCQUFpQixFQUF1QixNQUFNLGdCQUFnQixDQUFDO0FBRXZFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVsRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEtBQUssS0FBSyxNQUFNLHVDQUF1QyxDQUFDO0FBYy9ELElBQWEsc0JBQXNCLDhCQUFuQyxNQUFhLHNCQUFzQjtJQWlGakM7Ozs7T0FJRztJQUNILFlBQ1UsZUFBOEIsRUFDOUIsZ0JBQXVDLEVBQ3ZDLFNBQW1CO1FBRm5CLG9CQUFlLEdBQWYsZUFBZSxDQUFlO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBdUI7UUFDdkMsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQW5EN0I7Ozs7OztXQU1HO1FBQ00sWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUUzQjs7Ozs7V0FLRztRQUNNLFdBQU0sR0FBRyxtQkFBbUIsQ0FBQztRQVd0Qyw0REFBNEQ7UUFDbEQsU0FBSSxHQUF3QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWpFLDBEQUEwRDtRQUNoRCxVQUFLLEdBQXdCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFbEUsdURBQXVEO1FBQzdDLGdCQUFX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RUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXNCLENBQUM7Z0JBQ3JELEtBQUssRUFBUSxJQUFJO2FBQ2xCLENBQUM7O0tBQ0gsQ0FBQztHQUNXLHNCQUFzQixDQXVQbEM7U0F2UFksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgZm9yd2FyZFJlZiwgRWxlbWVudFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQge0NvbW1hbmRFeGVjdXRvclNlcnZpY2V9IGZyb20gJy4uL2NvbW1vbi9zZXJ2aWNlcy9jb21tYW5kLWV4ZWN1dG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VTZXJ2aWNlfSBmcm9tICcuLi9jb21tb24vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7bmd4VGV4dEVkaXRvckNvbmZpZ30gZnJvbSAnLi4vY29tbW9uL25neC10ZXh0LWVkaXRvci5kZWZhdWx0cyc7XHJcbmltcG9ydCAqIGFzIFV0aWxzIGZyb20gJy4uL2NvbW1vbi91dGlscy9uZ3gtdGV4dC1lZGl0b3IudXRpbHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICAgICduZ3gtdGV4dC1lZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczpbXHJcbiAgICAnLi9uZ3gtdGV4dC1lZGl0b3IuY29tcG9uZW50LnNjc3MnXHJcbiAgXSxcclxuICBwcm92aWRlcnM6W3tcclxuICAgIHByb3ZpZGU6ICAgICBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neFRleHRFZGl0b3JDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6ICAgICAgIHRydWVcclxuICB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4VGV4dEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIC8qKiBTcGVjaWZpZXMgd2VhdGhlciB0aGUgdGV4dGFyZWEgdG8gYmUgZWRpdGFibGUgb3Igbm90ICovXHJcbiAgQElucHV0KCkgZWRpdGFibGU6Ym9vbGVhbjtcclxuXHJcbiAgLyoqIFRoZSBzcGVsbGNoZWNrIHByb3BlcnR5IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIHRvIGhhdmUgaXRzIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNrZWQgb3Igbm90LiAqL1xyXG4gIEBJbnB1dCgpIHNwZWxsY2hlY2s6Ym9vbGVhbjtcclxuXHJcbiAgLyoqIFBsYWNlaG9sZGVyIGZvciB0aGUgdGV4dEFyZWEgKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjpzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0cmFuc2xhdGUgcHJvcGVydHkgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCBzaG91bGQgYmUgdHJhbnNsYXRlZCBvciBub3QuXHJcbiAgICpcclxuICAgKiBDaGVjayBodHRwczovL3d3dy53M3NjaG9vbHMuY29tL3RhZ3MvYXR0X2dsb2JhbF90cmFuc2xhdGUuYXNwIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBicm93c2VyIHN1cHBvcnRcclxuICAgKi9cclxuICBASW5wdXQoKSB0cmFuc2xhdGU6c3RyaW5nO1xyXG5cclxuICAvKiogU2V0cyBoZWlnaHQgb2YgdGhlIGVkaXRvciAqL1xyXG4gIEBJbnB1dCgpIGhlaWdodDpzdHJpbmc7XHJcblxyXG4gIC8qKiBTZXRzIG1pbmltdW0gaGVpZ2h0IGZvciB0aGUgZWRpdG9yICovXHJcbiAgQElucHV0KCkgbWluSGVpZ2h0OnN0cmluZztcclxuXHJcbiAgLyoqIFNldHMgV2lkdGggb2YgdGhlIGVkaXRvciAqL1xyXG4gIEBJbnB1dCgpIHdpZHRoOnN0cmluZztcclxuXHJcbiAgLyoqIFNldHMgbWluaW11bSB3aWR0aCBvZiB0aGUgZWRpdG9yICovXHJcbiAgQElucHV0KCkgbWluV2lkdGg6c3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBUb29sYmFyIGFjY2VwdHMgYW4gYXJyYXkgd2hpY2ggc3BlY2lmaWVzIHRoZSBvcHRpb25zIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSB0b29sYmFyXHJcbiAgICpcclxuICAgKiBDaGVjayBuZ3hUZXh0RWRpdG9yQ29uZmlnIGZvciB0b29sYmFyIGNvbmZpZ3VyYXRpb25cclxuICAgKlxyXG4gICAqIFBhc3NpbmcgYW4gZW1wdHkgYXJyYXkgd2lsbCBlbmFibGUgYWxsIHRvb2xiYXJcclxuICAgKi9cclxuICBASW5wdXQoKSB0b29sYmFyOk9iamVjdDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGVkaXRvciBjYW4gYmUgcmVzaXplZCB2ZXJ0aWNhbGx5LlxyXG4gICAqXHJcbiAgICogYGJhc2ljYCByZXNpemVyIGVuYWJsZXMgdGhlIGh0bWw1IHJlc3ppZXIuIENoZWNrIGhlcmUgaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9jc3NyZWYvY3NzM19wcl9yZXNpemUuYXNwXHJcbiAgICpcclxuICAgKiBgc3RhY2tgIHJlc2l6ZXIgZW5hYmxlIGEgcmVzaXplciB0aGF0IGxvb2tzIGxpa2UgYXMgaWYgaW4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHJlc2l6ZXIgPSAnc3RhY2snO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY29uZmlnIHByb3BlcnR5IGlzIGEgSlNPTiBvYmplY3RcclxuICAgKlxyXG4gICAqIEFsbCBhdmFpYmFsZSBpbnB1dHMgaW5wdXRzIGNhbiBiZSBwcm92aWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBhcyBKU09OXHJcbiAgICogaW5wdXRzIHByb3ZpZGVkIGRpcmVjdGx5IGFyZSBjb25zaWRlcmVkIGFzIHRvcCBwcmlvcml0eVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNvbmZpZyA9IG5neFRleHRFZGl0b3JDb25maWc7XHJcblxyXG4gIC8qKiBXZWF0aGVyIHRvIHNob3cgb3IgaGlkZSB0b29sYmFyICovXHJcbiAgQElucHV0KCkgc2hvd1Rvb2xiYXI6Ym9vbGVhbjtcclxuXHJcbiAgLyoqIFdlYXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHRvb2xiYXIgKi9cclxuICBASW5wdXQoKSBlbmFibGVUb29sYmFyOmJvb2xlYW47XHJcblxyXG4gIC8qKiBFbmRwb2ludCBmb3Igd2hpY2ggdGhlIGltYWdlIHRvIGJlIHVwbG9hZGVkICovXHJcbiAgQElucHV0KCkgaW1hZ2VFbmRQb2ludDpzdHJpbmc7XHJcblxyXG4gIC8qKiBlbWl0cyBgYmx1cmAgZXZlbnQgd2hlbiBmb2N1c2VkIG91dCBmcm9tIHRoZSB0ZXh0YXJlYSAqL1xyXG4gIEBPdXRwdXQoKSBibHVyOkV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBlbWl0cyBgZm9jdXNgIGV2ZW50IHdoZW4gZm9jdXNlZCBpbiB0byB0aGUgdGV4dGFyZWEgKi9cclxuICBAT3V0cHV0KCkgZm9jdXM6RXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqIGVtaXRzIGB1cGxvYWRJbWFnZWAgZXZlbnQgd2hlbiBpbWFnZSBpcyBzZWxlY3RlZCAqL1xyXG4gIEBPdXRwdXQoKSB1cGxvYWRJbWFnZTpFdmVudEVtaXR0ZXI8SFRNTElucHV0RWxlbWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ25neFRleHRBcmVhJywgeyBzdGF0aWM6IHRydWUgfSkgdGV4dEFyZWE6YW55O1xyXG4gIEBWaWV3Q2hpbGQoJ25neFdyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBuZ3hXcmFwcGVyOmFueTtcclxuXHJcbiAgcHVibGljIFV0aWxzOmFueSA9IFV0aWxzO1xyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlOih2YWx1ZTpzdHJpbmcpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6KCkgPT4gdm9pZDtcclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIF9tZXNzYWdlU2VydmljZSBzZXJ2aWNlIHRvIHNlbmQgbWVzc2FnZSB0byB0aGUgZWRpdG9yIG1lc3NhZ2UgY29tcG9uZW50XHJcbiAgICogQHBhcmFtIF9jb21tYW5kRXhlY3V0b3IgZXhlY3V0ZXMgY29tbWFuZCBmcm9tIHRoZSB0b29sYmFyXHJcbiAgICogQHBhcmFtIF9yZW5kZXJlciBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIGRvbSBlbGVtZW50XHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTpNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NvbW1hbmRFeGVjdXRvcjpDb21tYW5kRXhlY3V0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXI6UmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogZXZlbnRzXHJcbiAgICovXHJcbiAgb25UZXh0QXJlYUZvY3VzKCk6dm9pZCB7XHJcbiAgICB0aGlzLmZvY3VzLmVtaXQoJ2ZvY3VzJyk7XHJcbiAgfVxyXG5cclxuICAvKiogZm9jdXMgdGhlIHRleHQgYXJlYSB3aGVuIHRoZSBlZGl0b3IgaXMgZm9jdXNzZWQgKi9cclxuICBvbkVkaXRvckZvY3VzKCkge1xyXG4gICAgdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlZCBmcm9tIHRoZSBjb250ZW50RWRpdGFibGUgc2VjdGlvbiB3aGlsZSB0aGUgaW5wdXQgcHJvcGVydHkgY2hhbmdlc1xyXG4gICAqIEBwYXJhbSBpbm5lckhUTUwgaHRtbCBzdHJpbmcgZnJvbSBjb250ZW50RWRpdGFibGVcclxuICAgKi9cclxuICBvbkNvbnRlbnRDaGFuZ2UoaW5uZXJIVE1MOnN0cmluZyk6dm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhpcy5vbkNoYW5nZShpbm5lckhUTUwpO1xyXG4gICAgICB0aGlzLnRvZ2dsZVBsYWNlaG9sZGVyKGlubmVySFRNTCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblRleHRBcmVhQmx1cigpOnZvaWQge1xyXG4gICAgLyoqIHNhdmUgc2VsZWN0aW9uIGlmIGZvY3Vzc2VkIG91dCAqL1xyXG4gICAgdGhpcy5fY29tbWFuZEV4ZWN1dG9yLnNhdmVkU2VsZWN0aW9uID0gVXRpbHMuc2F2ZVNlbGVjdGlvbigpO1xyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5vblRvdWNoZWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYmx1ci5lbWl0KCdibHVyJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlZCB3aGVuIHRoZSBpbWFnZSBmcm9tIHRoZSBkaXNjIGlzIHNlbGVjdGVkXHJcbiAgICogQHBhcmFtIGltYWdlIHVwbG9hZGVkIGZpbGUgb2JqZWN0XHJcbiAgICovXHJcbiAgb25VcGxvYWRJbWFnZShpbWFnZTpIVE1MSW5wdXRFbGVtZW50KTp2b2lkIHtcclxuICAgIHRoaXMudXBsb2FkSW1hZ2UuZW1pdChpbWFnZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXNpemluZyB0ZXh0IGFyZWFcclxuICAgKlxyXG4gICAqIEBwYXJhbSBvZmZzZXRZIHZlcnRpY2FsIGhlaWdodCBvZiB0aGUgZWlkdGFibGUgcG9ydGlvbiBvZiB0aGUgZWRpdG9yXHJcbiAgICovXHJcbiAgcmVzaXplVGV4dEFyZWEob2Zmc2V0WTpudW1iZXIpOnZvaWQge1xyXG4gICAgbGV0IG5ld0hlaWdodCA9IHBhcnNlSW50KHRoaXMuaGVpZ2h0LCAxMCk7XHJcbiAgICBuZXdIZWlnaHQgKz0gb2Zmc2V0WTtcclxuXHJcbiAgICB0aGlzLmhlaWdodCA9IG5ld0hlaWdodCArICdweCc7XHJcbiAgICB0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBlZGl0b3IgYWN0aW9ucywgaS5lLiwgZXhlY3V0ZXMgY29tbWFuZCBmcm9tIHRvb2xiYXJcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb21tYW5kTmFtZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkXHJcbiAgICovXHJcbiAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZE5hbWU6c3RyaW5nKTp2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2NvbW1hbmRFeGVjdXRvci5leGVjdXRlKGNvbW1hbmROYW1lKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnNlbmRNZXNzYWdlKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV3JpdGUgYSBuZXcgdmFsdWUgdG8gdGhlIGVsZW1lbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBjb250ZW50ZWRpdGFibGVcclxuICAgKi9cclxuICB3cml0ZVZhbHVlKHZhbHVlOmFueSk6dm9pZCB7XHJcbiAgICB0aGlzLnRvZ2dsZVBsYWNlaG9sZGVyKHZhbHVlKTtcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICc8YnI+Jykge1xyXG4gICAgICB2YWx1ZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZWZyZXNoVmlldyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxyXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZm4gYSBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46YW55KTp2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXHJcbiAgICogd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIHRvdWNoIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIGEgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjphbnkpOnZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJlZnJlc2ggdmlldy9IVE1MIG9mIHRoZSBlZGl0b3JcclxuICAgKlxyXG4gICAqIEBwYXJhbSB2YWx1ZSBodG1sIHN0cmluZyBmcm9tIHRoZSBlZGl0b3JcclxuICAgKi9cclxuICByZWZyZXNoVmlldyh2YWx1ZTpzdHJpbmcpOnZvaWQge1xyXG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT09IG51bGwgPyAnJyA6IHZhbHVlO1xyXG5cclxuICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudCwgJ2lubmVySFRNTCcsIG5vcm1hbGl6ZWRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiB0b2dnbGVzIHBsYWNlaG9sZGVyIGJhc2VkIG9uIGlucHV0IHN0cmluZ1xyXG4gICAqXHJcbiAgICogQHBhcmFtIHZhbHVlIEEgSFRNTCBzdHJpbmcgZnJvbSB0aGUgZWRpdG9yXHJcbiAgICovXHJcbiAgdG9nZ2xlUGxhY2Vob2xkZXIodmFsdWU6YW55KTp2b2lkIHtcclxuICAgIGlmICghdmFsdWUgfHwgdmFsdWUgPT09ICc8YnI+JyB8fCB2YWx1ZSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5uZ3hXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdzaG93LXBsYWNlaG9sZGVyJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLm5neFdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3Nob3ctcGxhY2Vob2xkZXInKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJldHVybnMgYSBqc29uIGNvbnRhaW5pbmcgaW5wdXQgcGFyYW1zXHJcbiAgICovXHJcbiAgZ2V0Q29sbGVjdGl2ZVBhcmFtcygpOmFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBlZGl0YWJsZTp0aGlzLmVkaXRhYmxlLFxyXG4gICAgICBzcGVsbGNoZWNrOnRoaXMuc3BlbGxjaGVjayxcclxuICAgICAgcGxhY2Vob2xkZXI6dGhpcy5wbGFjZWhvbGRlcixcclxuICAgICAgdHJhbnNsYXRlOnRoaXMudHJhbnNsYXRlLFxyXG4gICAgICBoZWlnaHQ6dGhpcy5oZWlnaHQsXHJcbiAgICAgIG1pbkhlaWdodDp0aGlzLm1pbkhlaWdodCxcclxuICAgICAgd2lkdGg6dGhpcy53aWR0aCxcclxuICAgICAgbWluV2lkdGg6dGhpcy5taW5XaWR0aCxcclxuICAgICAgZW5hYmxlVG9vbGJhcjp0aGlzLmVuYWJsZVRvb2xiYXIsXHJcbiAgICAgIHNob3dUb29sYmFyOnRoaXMuc2hvd1Rvb2xiYXIsXHJcbiAgICAgIGltYWdlRW5kUG9pbnQ6dGhpcy5pbWFnZUVuZFBvaW50LFxyXG4gICAgICB0b29sYmFyOnRoaXMudG9vbGJhclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBzZXQgY29uZmlndXJhdGlvblxyXG4gICAgICovXHJcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuVXRpbHMuZ2V0RWRpdG9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZywgbmd4VGV4dEVkaXRvckNvbmZpZywgdGhpcy5nZXRDb2xsZWN0aXZlUGFyYW1zKCkpO1xyXG5cclxuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgfHwgdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHJcbiAgICB0aGlzLmV4ZWN1dGVDb21tYW5kKCdlbmFibGVPYmplY3RSZXNpemluZycpO1xyXG4gIH1cclxufVxyXG4iXX0=