UNPKG

@handsontable/angular-wrapper

Version:

Best Data Grid for Angular with Spreadsheet Look and Feel.

180 lines 23.6 kB
import Handsontable from 'handsontable'; import { createComponent, } from '@angular/core'; import { CustomEditorPlaceholderComponent } from './custom-editor-placeholder.component'; import { take } from 'rxjs/operators'; /** * Adapter for BaseEditor from Handsontable. */ export class BaseEditorAdapter extends Handsontable.editors.BaseEditor { /** Reference to the custom editor component. */ _componentRef; /** Reference to the editor placeholder component. */ _editorPlaceHolderRef; /** Flag indicating whether the placeholder is ready. */ _isPlaceholderReady = false; /** Subscription for the finish edit event. */ _finishEditSubscription; /** Subscription for the cancel edit event. */ _cancelEditSubscription; /** * Creates an instance of BaseEditorAdapter. * @param instance The Handsontable instance. */ constructor(instance) { super(instance); this.hot.addHook('afterRowResize', this.onAfterRowResize.bind(this)); this.hot.addHook('afterColumnResize', this.onAfterColumnResize.bind(this)); this.hot.addHook('afterDestroy', this.onAfterDestroy.bind(this)); } /** * Prepares the editor for editing. Parameters are passed from Handsontable. * @param row The row index. * @param column The column index. * @param prop The property name. * @param TD The table cell element. * @param originalValue The original value of the cell. * @param cellProperties The cell properties. */ prepare(row, column, prop, TD, originalValue, cellProperties) { if (!this.isOpened()) { super.prepare(row, column, prop, TD, originalValue, cellProperties); const columnMeta = this.hot.getColumnMeta(column); if (!this._isPlaceholderReady) { this.createEditorPlaceholder(columnMeta._environmentInjector); this._isPlaceholderReady = true; } this._componentRef = columnMeta._editorComponentReference; if (this._finishEditSubscription) { this._finishEditSubscription.unsubscribe(); this._finishEditSubscription = undefined; } if (this._cancelEditSubscription) { this._cancelEditSubscription.unsubscribe(); this._cancelEditSubscription = undefined; } this._finishEditSubscription = this._componentRef.instance.finishEdit .pipe(take(1)) .subscribe(() => { this.finishEditing(); }); this._cancelEditSubscription = this._componentRef.instance.cancelEdit .pipe(take(1)) .subscribe(() => { this.cancelChanges(); }); } } /** * Closes the editor. This event is triggered by Handsontable. */ close() { if (this.isOpened()) { this.resetEditorState(); this._editorPlaceHolderRef.changeDetectorRef.detectChanges(); this._editorPlaceHolderRef.instance.detachEditor(); this._componentRef.instance.onClose(); } } /** * Focuses the editor. This event is triggered by Handsontable. */ focus() { this._componentRef.instance.onFocus(); } /** * Gets the value from the editor. * @returns The value from the editor. */ getValue() { return this._componentRef.instance?.getValue(); } /** * Opens the editor. This event is triggered by Handsontable. * When opening, we set the shortcut context to 'editor'. * This allows the built-in keyboard shortcuts to operate within the editor. * @param event The event that triggered the opening of the editor. * @remarks When entering edit mode using double-click, keyboard shortcuts do not work. */ open(event) { this.hot.getShortcutManager().setActiveContextName('editor'); this.applyPropsToEditor(); this._componentRef.instance.onOpen(event); } /** * Sets the value for the custom editor. * @param newValue The value to set. */ setValue(newValue) { this._componentRef.instance?.setValue(newValue); this._componentRef.changeDetectorRef.detectChanges(); } /** * Applies properties to the custom editor and editor placeholder. */ applyPropsToEditor() { const rect = this.getEditedCellRect(); if (!this.isInFullEditMode()) { this._componentRef.instance.setValue(null); } this._componentRef.setInput('originalValue', this.originalValue); this._componentRef.setInput('row', this.row); this._componentRef.setInput('column', this.col); this._componentRef.setInput('prop', this.prop); this._componentRef.setInput('cellProperties', this.cellProperties); this._editorPlaceHolderRef.setInput('top', rect.top); this._editorPlaceHolderRef.setInput('left', rect.start); this._editorPlaceHolderRef.setInput('height', rect.height); this._editorPlaceHolderRef.setInput('width', rect.width); this._editorPlaceHolderRef.setInput('isVisible', true); this._editorPlaceHolderRef.setInput('componentRef', this._componentRef); this._editorPlaceHolderRef.changeDetectorRef.detectChanges(); } /** * Creates the editor placeholder and append it to hot rootElement. * @param injector The environment injector. */ createEditorPlaceholder(injector) { this._editorPlaceHolderRef = createComponent(CustomEditorPlaceholderComponent, { environmentInjector: injector, }); this.hot.rootElement.appendChild(this._editorPlaceHolderRef.location.nativeElement); } /** * Handles the after column resize event. * Helps adjust the editor size to the column size and update its position. */ onAfterColumnResize() { if (this.isOpened()) { this.applyPropsToEditor(); } } /** * Handles the after row resize event. * Helps adjust the editor size to the column size and update its position. */ onAfterRowResize() { if (this.isOpened()) { this.applyPropsToEditor(); } } /** * Handles the after destroy event. */ onAfterDestroy() { this._editorPlaceHolderRef?.destroy(); } /** * Resets the editor placeholder state. * We need to reset the editor placeholder state because we use it * to store multiple references to the custom editor. */ resetEditorState() { this._editorPlaceHolderRef.setInput('top', undefined); this._editorPlaceHolderRef.setInput('left', undefined); this._editorPlaceHolderRef.setInput('height', undefined); this._editorPlaceHolderRef.setInput('width', undefined); this._editorPlaceHolderRef.setInput('isVisible', false); this._editorPlaceHolderRef.setInput('componentRef', undefined); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1lZGl0b3ItYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2VkaXRvci9iYXNlLWVkaXRvci1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBRUwsZUFBZSxHQUVoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUl6RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVO0lBQ3BFLGdEQUFnRDtJQUN4QyxhQUFhLENBQTZDO0lBRWxFLHFEQUFxRDtJQUM3QyxxQkFBcUIsQ0FBaUQ7SUFFOUUsd0RBQXdEO0lBQ2hELG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUVwQyw4Q0FBOEM7SUFDdEMsdUJBQXVCLENBQWdCO0lBRS9DLDhDQUE4QztJQUN0Qyx1QkFBdUIsQ0FBZ0I7SUFFL0M7OztPQUdHO0lBQ0gsWUFBWSxRQUEyQjtRQUNyQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFB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QyxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIYW5kc29udGFibGUgZnJvbSAnaGFuZHNvbnRhYmxlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgY3JlYXRlQ29tcG9uZW50LFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEN1c3RvbUVkaXRvclBsYWNlaG9sZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jdXN0b20tZWRpdG9yLXBsYWNlaG9sZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb2x1bW5TZXR0aW5nc0ludGVybmFsIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi1zZXR0aW5ncyc7XG5pbXBvcnQgeyBIb3RDZWxsRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9ob3QtY2VsbC1lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBBZGFwdGVyIGZvciBCYXNlRWRpdG9yIGZyb20gSGFuZHNvbnRhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZUVkaXRvckFkYXB0ZXIgZXh0ZW5kcyBIYW5kc29udGFibGUuZWRpdG9ycy5CYXNlRWRpdG9yIHtcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgY3VzdG9tIGVkaXRvciBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2NvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxIb3RDZWxsRWRpdG9yQ29tcG9uZW50PGFueT4+O1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVkaXRvciBwbGFjZWhvbGRlciBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2VkaXRvclBsYWNlSG9sZGVyUmVmOiBDb21wb25lbnRSZWY8Q3VzdG9tRWRpdG9yUGxhY2Vob2xkZXJDb21wb25lbnQ+O1xuXG4gIC8qKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGxhY2Vob2xkZXIgaXMgcmVhZHkuICovXG4gIHByaXZhdGUgX2lzUGxhY2Vob2xkZXJSZWFkeSA9IGZhbHNlO1xuXG4gIC8qKiBTdWJzY3JpcHRpb24gZm9yIHRoZSBmaW5pc2ggZWRpdCBldmVudC4gKi9cbiAgcHJpdmF0ZSBfZmluaXNoRWRpdFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAvKiogU3Vic2NyaXB0aW9uIGZvciB0aGUgY2FuY2VsIGVkaXQgZXZlbnQuICovXG4gIHByaXZhdGUgX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQmFzZUVkaXRvckFkYXB0ZXIuXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5zdGFuY2U6IEhhbmRzb250YWJsZS5Db3JlKSB7XG4gICAgc3VwZXIoaW5zdGFuY2UpO1xuXG4gICAgdGhpcy5ob3QuYWRkSG9vaygnYWZ0ZXJSb3dSZXNpemUnLCB0aGlzLm9uQWZ0ZXJSb3dSZXNpemUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5ob3QuYWRkSG9vaygnYWZ0ZXJDb2x1bW5SZXNpemUnLCB0aGlzLm9uQWZ0ZXJDb2x1bW5SZXNpemUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5ob3QuYWRkSG9vaygnYWZ0ZXJEZXN0cm95JywgdGhpcy5vbkFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyB0aGUgZWRpdG9yIGZvciBlZGl0aW5nLiBQYXJhbWV0ZXJzIGFyZSBwYXNzZWQgZnJvbSBIYW5kc29udGFibGUuXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGluZGV4LlxuICAgKiBAcGFyYW0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIFREIFRoZSB0YWJsZSBjZWxsIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBvcmlnaW5hbFZhbHVlIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgY2VsbC5cbiAgICogQHBhcmFtIGNlbGxQcm9wZXJ0aWVzIFRoZSBjZWxsIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlKFxuICAgIHJvdzogbnVtYmVyLFxuICAgIGNvbHVtbjogbnVtYmVyLFxuICAgIHByb3A6IHN0cmluZyB8IG51bWJlcixcbiAgICBURDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsXG4gICAgb3JpZ2luYWxWYWx1ZTogYW55LFxuICAgIGNlbGxQcm9wZXJ0aWVzOiBIYW5kc29udGFibGUuQ2VsbFByb3BlcnRpZXNcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbmVkKCkpIHtcbiAgICAgIHN1cGVyLnByZXBhcmUocm93LCBjb2x1bW4sIHByb3AsIFRELCBvcmlnaW5hbFZhbHVlLCBjZWxsUHJvcGVydGllcyk7XG4gICAgICBjb25zdCBjb2x1bW5NZXRhOiBDb2x1bW5TZXR0aW5nc0ludGVybmFsID0gdGhpcy5ob3QuZ2V0Q29sdW1uTWV0YShcbiAgICAgICAgY29sdW1uXG4gICAgICApIGFzIENvbHVtblNldHRpbmdzSW50ZXJuYWw7XG5cbiAgICAgIGlmICghdGhpcy5faXNQbGFjZWhvbGRlclJlYWR5KSB7XG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdG9yUGxhY2Vob2xkZXIoY29sdW1uTWV0YS5fZW52aXJvbm1lbnRJbmplY3Rvcik7XG4gICAgICAgIHRoaXMuX2lzUGxhY2Vob2xkZXJSZWFkeSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IGNvbHVtbk1ldGEuX2VkaXRvckNvbXBvbmVudFJlZmVyZW5jZTtcblxuICAgICAgaWYgKHRoaXMuX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5fZmluaXNoRWRpdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY2FuY2VsRWRpdFN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24gPSB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UuZmluaXNoRWRpdFxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbmlzaEVkaXRpbmcoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24gPSB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UuY2FuY2VsRWRpdFxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbmNlbENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZWRpdG9yLiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBIYW5kc29udGFibGUuXG4gICAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICB0aGlzLnJlc2V0RWRpdG9yU3RhdGUoKTtcbiAgICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLmluc3RhbmNlLmRldGFjaEVkaXRvcigpO1xuICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0aGUgZWRpdG9yLiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBIYW5kc29udGFibGUuXG4gICAqL1xuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2Uub25Gb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGZyb20gdGhlIGVkaXRvci5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGZyb20gdGhlIGVkaXRvci5cbiAgICovXG4gIGdldFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZT8uZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgZWRpdG9yLiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBIYW5kc29udGFibGUuXG4gICAqIFdoZW4gb3BlbmluZywgd2Ugc2V0IHRoZSBzaG9ydGN1dCBjb250ZXh0IHRvICdlZGl0b3InLlxuICAgKiBUaGlzIGFsbG93cyB0aGUgYnVpbHQtaW4ga2V5Ym9hcmQgc2hvcnRjdXRzIHRvIG9wZXJhdGUgd2l0aGluIHRoZSBlZGl0b3IuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG9wZW5pbmcgb2YgdGhlIGVkaXRvci5cbiAgICogQHJlbWFya3MgV2hlbiBlbnRlcmluZyBlZGl0IG1vZGUgdXNpbmcgZG91YmxlLWNsaWNrLCBrZXlib2FyZCBzaG9ydGN1dHMgZG8gbm90IHdvcmsuXG4gICAqL1xuICBvcGVuKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmhvdC5nZXRTaG9ydGN1dE1hbmFnZXIoKS5zZXRBY3RpdmVDb250ZXh0TmFtZSgnZWRpdG9yJyk7XG4gICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2Uub25PcGVuKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGN1c3RvbSBlZGl0b3IuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKi9cbiAgc2V0VmFsdWUobmV3VmFsdWU/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U/LnNldFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgcHJvcGVydGllcyB0byB0aGUgY3VzdG9tIGVkaXRvciBhbmQgZWRpdG9yIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVByb3BzVG9FZGl0b3IoKTogdm9pZCB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0RWRpdGVkQ2VsbFJlY3QoKTtcblxuICAgIGlmICghdGhpcy5pc0luRnVsbEVkaXRNb2RlKCkpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXRWYWx1ZShudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ29yaWdpbmFsVmFsdWUnLCB0aGlzLm9yaWdpbmFsVmFsdWUpO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgncm93JywgdGhpcy5yb3cpO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgnY29sdW1uJywgdGhpcy5jb2wpO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgncHJvcCcsIHRoaXMucHJvcCk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLnNldElucHV0KCdjZWxsUHJvcGVydGllcycsIHRoaXMuY2VsbFByb3BlcnRpZXMpO1xuXG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3RvcCcsIHJlY3QudG9wKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnbGVmdCcsIHJlY3Quc3RhcnQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2lzVmlzaWJsZScsIHRydWUpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdjb21wb25lbnRSZWYnLCB0aGlzLl9jb21wb25lbnRSZWYpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlZGl0b3IgcGxhY2Vob2xkZXIgYW5kIGFwcGVuZCBpdCB0byBob3Qgcm9vdEVsZW1lbnQuXG4gICAqIEBwYXJhbSBpbmplY3RvciBUaGUgZW52aXJvbm1lbnQgaW5qZWN0b3IuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVkaXRvclBsYWNlaG9sZGVyKGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYgPSBjcmVhdGVDb21wb25lbnQoXG4gICAgICBDdXN0b21FZGl0b3JQbGFjZWhvbGRlckNvbXBvbmVudCxcbiAgICAgIHtcbiAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogaW5qZWN0b3IgYXMgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5ob3Qucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoXG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBhZnRlciBjb2x1bW4gcmVzaXplIGV2ZW50LlxuICAgKiBIZWxwcyBhZGp1c3QgdGhlIGVkaXRvciBzaXplIHRvIHRoZSBjb2x1bW4gc2l6ZSBhbmQgdXBkYXRlIGl0cyBwb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlckNvbHVtblJlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICB0aGlzLmFwcGx5UHJvcHNUb0VkaXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBhZnRlciByb3cgcmVzaXplIGV2ZW50LlxuICAgKiBIZWxwcyBhZGp1c3QgdGhlIGVkaXRvciBzaXplIHRvIHRoZSBjb2x1bW4gc2l6ZSBhbmQgdXBkYXRlIGl0cyBwb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlclJvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICB0aGlzLmFwcGx5UHJvcHNUb0VkaXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBhZnRlciBkZXN0cm95IGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBvbkFmdGVyRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZj8uZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIHN0YXRlLlxuICAgKiBXZSBuZWVkIHRvIHJlc2V0IHRoZSBlZGl0b3IgcGxhY2Vob2xkZXIgc3RhdGUgYmVjYXVzZSB3ZSB1c2UgaXRcbiAgICogdG8gc3RvcmUgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byB0aGUgY3VzdG9tIGVkaXRvci5cbiAgICovXG4gIHByaXZhdGUgcmVzZXRFZGl0b3JTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgndG9wJywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnbGVmdCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2hlaWdodCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3dpZHRoJywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnaXNWaXNpYmxlJywgZmFsc2UpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdjb21wb25lbnRSZWYnLCB1bmRlZmluZWQpO1xuICB9XG59XG4iXX0=