UNPKG

ngx-ace-icy

Version:
513 lines 31.4 kB
/** * @fileoverview added by tsickle * Generated from: ngx-ace.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, Output, ElementRef, Input, forwardRef, NgZone } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; var NgxAceComponent = /** @class */ (function () { function NgxAceComponent(elementRef, zone) { var _this = this; this.elementRef = elementRef; this.zone = zone; this.textChanged = new EventEmitter(); this.textChange = new EventEmitter(); this.placeholder = '请输入内容'; this.style = {}; // tslint:disable-next-line:variable-name this._options = {}; // tslint:disable-next-line:variable-name this._readOnly = false; // tslint:disable-next-line:variable-name this._theme = 'monokai'; // tslint:disable-next-line:variable-name this._mode = 'sql'; // tslint:disable-next-line:variable-name this._autoUpdateContent = true; // tslint:disable-next-line:variable-name this._durationBeforeCallback = 0; // tslint:disable-next-line:variable-name this._text = ''; // tslint:disable-next-line:variable-name // private _onChange = (_: any) => { // } this.onChange = (/** * @return {?} */ function () { return null; }); // tslint:disable-next-line:variable-name // private _onTouched = () => { // } this.onTouched = (/** * @return {?} */ function () { return null; }); /** @type {?} */ var el = elementRef.nativeElement; this.zone.runOutsideAngular((/** * @return {?} */ function () { // tslint:disable-next-line:no-string-literal _this._editor = ace['edit'](el); })); this._editor.setOptions({ enableBasicAutocompletion: true, enableSnippets: true, enableLiveAutocompletion: true, minLines: 1, maxLines: Infinity, }); this._editor.$blockScrolling = Infinity; this._editor.setShowPrintMargin(false); } /** * @return {?} */ NgxAceComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.init(); this.initEvents(); }; /** * @return {?} */ NgxAceComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this._editor.destroy(); }; /** * @return {?} */ NgxAceComponent.prototype.init = /** * @return {?} */ function () { this.setOptions(this._options || {}); this.setTheme(this._theme); this.setMode(this._mode); this.setReadOnly(this._readOnly); }; /** * @return {?} */ NgxAceComponent.prototype.initEvents = /** * @return {?} */ function () { var _this = this; this._editor.on('change', (/** * @return {?} */ function () { return _this.updateText(); })); this._editor.on('paste', (/** * @return {?} */ function () { return _this.updateText(); })); }; /** * @return {?} */ NgxAceComponent.prototype.updateText = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var newVal = this._editor.getValue(); if (newVal === this.oldText) { return; } if (!this._durationBeforeCallback) { this._text = newVal; this.zone.run((/** * @return {?} */ function () { _this.textChange.emit(newVal); _this.textChanged.emit(newVal); _this.onChange(newVal); })); } else { if (this.timeoutSaving) { clearTimeout(this.timeoutSaving); } this.timeoutSaving = setTimeout((/** * @return {?} */ function () { _this._text = newVal; _this.zone.run((/** * @return {?} */ function () { _this.textChange.emit(newVal); _this.textChanged.emit(newVal); })); _this.timeoutSaving = null; }), this._durationBeforeCallback); } this.oldText = newVal; this.emptyMessage(); }; Object.defineProperty(NgxAceComponent.prototype, "options", { set: /** * @param {?} options * @return {?} */ function (options) { this.setOptions(options); }, enumerable: true, configurable: true }); /** * @param {?} options * @return {?} */ NgxAceComponent.prototype.setOptions = /** * @param {?} options * @return {?} */ function (options) { this._options = options; this._editor.setOptions(options || {}); }; Object.defineProperty(NgxAceComponent.prototype, "readOnly", { set: /** * @param {?} readOnly * @return {?} */ function (readOnly) { this.setReadOnly(readOnly); }, enumerable: true, configurable: true }); /** * @param {?} readOnly * @return {?} */ NgxAceComponent.prototype.setReadOnly = /** * @param {?} readOnly * @return {?} */ function (readOnly) { this._readOnly = readOnly; this._editor.setReadOnly(readOnly); }; Object.defineProperty(NgxAceComponent.prototype, "theme", { set: /** * @param {?} theme * @return {?} */ function (theme) { this.setTheme(theme); }, enumerable: true, configurable: true }); /** * @param {?} theme * @return {?} */ NgxAceComponent.prototype.setTheme = /** * @param {?} theme * @return {?} */ function (theme) { this._theme = theme; this._editor.setTheme("ace/theme/" + theme); }; Object.defineProperty(NgxAceComponent.prototype, "mode", { set: /** * @param {?} mode * @return {?} */ function (mode) { this.setMode(mode); }, enumerable: true, configurable: true }); /** * @param {?} mode * @return {?} */ NgxAceComponent.prototype.setMode = /** * @param {?} mode * @return {?} */ function (mode) { this._mode = mode; if (typeof this._mode === 'object') { this._editor.getSession().setMode(this._mode); } else { this._editor.getSession().setMode("ace/mode/" + this._mode); } }; Object.defineProperty(NgxAceComponent.prototype, "value", { get: /** * @return {?} */ function () { return this.text; }, set: /** * @param {?} value * @return {?} */ function (value) { this.setText(value); }, enumerable: true, configurable: true }); /** * @param {?} value * @return {?} */ NgxAceComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this.setText(value); }; /** * @param {?} fn * @return {?} */ NgxAceComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ NgxAceComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; Object.defineProperty(NgxAceComponent.prototype, "text", { get: /** * @return {?} */ function () { return this._text; }, set: /** * @param {?} text * @return {?} */ function (text) { this.setText(text); }, enumerable: true, configurable: true }); /** * @param {?} text * @return {?} */ NgxAceComponent.prototype.setText = /** * @param {?} text * @return {?} */ function (text) { if (text === null || text === undefined) { text = ''; } if (this._text !== text && this._autoUpdateContent === true) { this._text = text; this._editor.setValue(text); this.onChange(text); this._editor.clearSelection(); } this.emptyMessage(); }; Object.defineProperty(NgxAceComponent.prototype, "autoUpdateContent", { set: /** * @param {?} status * @return {?} */ function (status) { this.setAutoUpdateContent(status); }, enumerable: true, configurable: true }); /** * @param {?} status * @return {?} */ NgxAceComponent.prototype.setAutoUpdateContent = /** * @param {?} status * @return {?} */ function (status) { this._autoUpdateContent = status; }; Object.defineProperty(NgxAceComponent.prototype, "durationBeforeCallback", { set: /** * @param {?} num * @return {?} */ function (num) { this.setDurationBeforeCallback(num); }, enumerable: true, configurable: true }); /** * @param {?} num * @return {?} */ NgxAceComponent.prototype.setDurationBeforeCallback = /** * @param {?} num * @return {?} */ function (num) { this._durationBeforeCallback = num; }; /** 为空时增加placeholder提示信息 */ /** * 为空时增加placeholder提示信息 * @private * @return {?} */ NgxAceComponent.prototype.emptyMessage = /** * 为空时增加placeholder提示信息 * @private * @return {?} */ function () { /** @type {?} */ var shouldShow = !this._text.length; /** @type {?} */ var node = this._editor.renderer.emptyMessageNode; if (!shouldShow && node) { this._editor.renderer.scroller.removeChild(this._editor.renderer.emptyMessageNode); this._editor.renderer.emptyMessageNode = null; } else if (shouldShow && !node) { node = this._editor.renderer.emptyMessageNode = document.createElement('div'); node.textContent = this.placeholder; node.className = 'ace_emptyMessage'; node.style.padding = '0 9px'; node.style.position = 'absolute'; node.style.zIndex = 9; node.style.opacity = 0.5; this._editor.renderer.scroller.appendChild(node); } }; /** * @return {?} */ NgxAceComponent.prototype.getEditor = /** * @return {?} */ function () { return this._editor; }; NgxAceComponent.decorators = [ { type: Component, args: [{ selector: 'c-ngx-ace', template: '', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return NgxAceComponent; })), multi: true }], styles: [':host { display:block;box-sizing: content-box;}'] }] } ]; /** @nocollapse */ NgxAceComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: NgZone } ]; }; NgxAceComponent.propDecorators = { textChanged: [{ type: Output }], textChange: [{ type: Output }], placeholder: [{ type: Input }], style: [{ type: Input }], options: [{ type: Input }], readOnly: [{ type: Input }], theme: [{ type: Input }], mode: [{ type: Input }], value: [{ type: Input }], text: [{ type: Input }], autoUpdateContent: [{ type: Input }], durationBeforeCallback: [{ type: Input }] }; return NgxAceComponent; }()); export { NgxAceComponent }; if (false) { /** @type {?} */ NgxAceComponent.prototype.textChanged; /** @type {?} */ NgxAceComponent.prototype.textChange; /** @type {?} */ NgxAceComponent.prototype.placeholder; /** @type {?} */ NgxAceComponent.prototype.style; /** @type {?} */ NgxAceComponent.prototype._options; /** @type {?} */ NgxAceComponent.prototype._readOnly; /** @type {?} */ NgxAceComponent.prototype._theme; /** @type {?} */ NgxAceComponent.prototype._mode; /** @type {?} */ NgxAceComponent.prototype._autoUpdateContent; /** @type {?} */ NgxAceComponent.prototype._editor; /** @type {?} */ NgxAceComponent.prototype._durationBeforeCallback; /** @type {?} */ NgxAceComponent.prototype._text; /** @type {?} */ NgxAceComponent.prototype.oldText; /** @type {?} */ NgxAceComponent.prototype.timeoutSaving; /** * @type {?} * @private */ NgxAceComponent.prototype.onChange; /** * @type {?} * @private */ NgxAceComponent.prototype.onTouched; /** * @type {?} * @private */ NgxAceComponent.prototype.elementRef; /** * @type {?} * @private */ NgxAceComponent.prototype.zone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFjZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWNlLWljeS8iLCJzb3VyY2VzIjpbIm5neC1hY2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUgsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBSXpFO0lBbUNFLHlCQUFvQixVQUFzQixFQUFVLElBQVk7UUFBaEUsaUJBZUM7UUFmbUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUF2QnRELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxnQkFBVyxHQUFHLE9BQU8sQ0FBQztRQUN0QixVQUFLLEdBQVEsRUFBRSxDQUFDOztRQUV6QixhQUFRLEdBQVEsRUFBRSxDQUFDOztRQUVuQixjQUFTLEdBQUcsS0FBSyxDQUFDOztRQUVsQixXQUFNLEdBQUcsU0FBUyxDQUFDOztRQUVuQixVQUFLLEdBQVEsS0FBSyxDQUFDOztRQUVuQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7O1FBSTFCLDRCQUF1QixHQUFHLENBQUMsQ0FBQzs7UUFFNUIsVUFBSyxHQUFHLEVBQUUsQ0FBQzs7OztRQWdJSCxhQUFROzs7UUFBNEIsY0FBTSxPQUFBLElBQUksRUFBSixDQUFJLEVBQUM7Ozs7UUFTL0MsY0FBUzs7O1FBQWUsY0FBTSxPQUFBLElBQUksRUFBSixDQUFJLEVBQUM7O1lBcEluQyxFQUFFLEdBQUcsVUFBVSxDQUFDLGFBQWE7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDO1lBQzFCLDZDQUE2QztZQUM3QyxL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QWlEO2lCQU0zRDs7OztnQkFkeUMsVUFBVTtnQkFBd0MsTUFBTTs7OzhCQWlCL0YsTUFBTTs2QkFDTixNQUFNOzhCQUNOLEtBQUs7d0JBQ0wsS0FBSzswQkF3RkwsS0FBSzsyQkFTTCxLQUFLO3dCQVNMLEtBQUs7dUJBU0wsS0FBSzt3QkFpQkwsS0FBSzt1QkErQkwsS0FBSztvQ0FrQkwsS0FBSzt5Q0FRTCxLQUFLOztJQStCUixzQkFBQztDQUFBLEFBM09ELElBMk9DO1NBak9ZLGVBQWU7OztJQUUxQixzQ0FBMkM7O0lBQzNDLHFDQUEwQzs7SUFDMUMsc0NBQStCOztJQUMvQixnQ0FBeUI7O0lBRXpCLG1DQUFtQjs7SUFFbkIsb0NBQWtCOztJQUVsQixpQ0FBbUI7O0lBRW5CLGdDQUFtQjs7SUFFbkIsNkNBQTBCOztJQUUxQixrQ0FBYTs7SUFFYixrREFBNEI7O0lBRTVCLGdDQUFXOztJQUNYLGtDQUFhOztJQUNiLHdDQUFtQjs7Ozs7SUE4SG5CLG1DQUF1RDs7Ozs7SUFTdkQsb0NBQTJDOzs7OztJQXJJL0IscUNBQThCOzs7OztJQUFFLCtCQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIEVsZW1lbnRSZWYsIElucHV0LCBmb3J3YXJkUmVmLCBPbkluaXQsIE9uRGVzdHJveSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmRlY2xhcmUgdmFyIGFjZTogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLW5neC1hY2UnLFxuICB0ZW1wbGF0ZTogJycsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6YmxvY2s7Ym94LXNpemluZzogY29udGVudC1ib3g7fSddLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4QWNlQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hBY2VDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBPdXRwdXQoKSB0ZXh0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ+ivt+i+k+WFpeWGheWuuSc7XG4gIEBJbnB1dCgpIHN0eWxlOiBhbnkgPSB7fTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX29wdGlvbnM6IGFueSA9IHt9O1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBfcmVhZE9ubHkgPSBmYWxzZTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX3RoZW1lID0gJ21vbm9rYWknO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBfbW9kZTogYW55ID0gJ3NxbCc7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIF9hdXRvVXBkYXRlQ29udGVudCA9IHRydWU7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIF9lZGl0b3I6IGFueTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX2R1cmF0aW9uQmVmb3JlQ2FsbGJhY2sgPSAwO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBfdGV4dCA9ICcnO1xuICBvbGRUZXh0OiBhbnk7XG4gIHRpbWVvdXRTYXZpbmc6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgdGhpcy5fZWRpdG9yID0gYWNlWydlZGl0J10oZWwpO1xuICAgIH0pO1xuICAgIHRoaXMuX2VkaXRvci5zZXRPcHRpb25zKHtcbiAgICAgIGVuYWJsZUJhc2ljQXV0b2NvbXBsZXRpb246IHRydWUsXG4gICAgICBlbmFibGVTbmlwcGV0czogdHJ1ZSxcbiAgICAgIGVuYWJsZUxpdmVBdXRvY29tcGxldGlvbjogdHJ1ZSxcbiAgICAgIG1pbkxpbmVzOiAxLFxuICAgICAgbWF4TGluZXM6IEluZmluaXR5LFxuICAgIH0pO1xuICAgIHRoaXMuX2VkaXRvci4kYmxvY2tTY3JvbGxpbmcgPSBJbmZpbml0eTtcbiAgICB0aGlzLl9lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuaW5pdEV2ZW50cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZWRpdG9yLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMuX29wdGlvbnMgfHwge30pO1xuICAgIHRoaXMuc2V0VGhlbWUodGhpcy5fdGhlbWUpO1xuICAgIHRoaXMuc2V0TW9kZSh0aGlzLl9tb2RlKTtcbiAgICB0aGlzLnNldFJlYWRPbmx5KHRoaXMuX3JlYWRPbmx5KTtcbiAgfVxuXG4gIGluaXRFdmVudHMoKSB7XG4gICAgdGhpcy5fZWRpdG9yLm9uKCdjaGFuZ2UnLCAoKSA9PiB0aGlzLnVwZGF0ZVRleHQoKSk7XG4gICAgdGhpcy5fZWRpdG9yLm9uKCdwYXN0ZScsICgpID0+IHRoaXMudXBkYXRlVGV4dCgpKTtcbiAgfVxuXG4gIHVwZGF0ZVRleHQoKSB7XG4gICAgY29uc3QgbmV3VmFsID0gdGhpcy5fZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgaWYgKG5ld1ZhbCA9PT0gdGhpcy5vbGRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5fZHVyYXRpb25CZWZvcmVDYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGV4dCA9IG5ld1ZhbDtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdChuZXdWYWwpO1xuICAgICAgICB0aGlzLnRleHRDaGFuZ2VkLmVtaXQobmV3VmFsKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWwpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnRpbWVvdXRTYXZpbmcpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFNhdmluZyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGltZW91dFNhdmluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl90ZXh0ID0gbmV3VmFsO1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdChuZXdWYWwpO1xuICAgICAgICAgIHRoaXMudGV4dENoYW5nZWQuZW1pdChuZXdWYWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50aW1lb3V0U2F2aW5nID0gbnVsbDtcbiAgICAgIH0sIHRoaXMuX2R1cmF0aW9uQmVmb3JlQ2FsbGJhY2spO1xuICAgIH1cbiAgICB0aGlzLm9sZFRleHQgPSBuZXdWYWw7XG4gICAgdGhpcy5lbXB0eU1lc3NhZ2UoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvcHRpb25zKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fZWRpdG9yLnNldE9wdGlvbnMob3B0aW9ucyB8fCB7fSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVhZE9ubHkocmVhZE9ubHk6IGFueSkge1xuICAgIHRoaXMuc2V0UmVhZE9ubHkocmVhZE9ubHkpO1xuICB9XG5cbiAgc2V0UmVhZE9ubHkocmVhZE9ubHk6IGFueSkge1xuICAgIHRoaXMuX3JlYWRPbmx5ID0gcmVhZE9ubHk7XG4gICAgdGhpcy5fZWRpdG9yLnNldFJlYWRPbmx5KHJlYWRPbmx5KTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0aGVtZSh0aGVtZTogYW55KSB7XG4gICAgdGhpcy5zZXRUaGVtZSh0aGVtZSk7XG4gIH1cblxuICBzZXRUaGVtZSh0aGVtZTogYW55KSB7XG4gICAgdGhpcy5fdGhlbWUgPSB0aGVtZTtcbiAgICB0aGlzLl9lZGl0b3Iuc2V0VGhlbWUoYGFjZS90aGVtZS8ke3RoZW1lfWApO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1vZGUobW9kZTogYW55KSB7XG4gICAgdGhpcy5zZXRNb2RlKG1vZGUpO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBhbnkpIHtcbiAgICB0aGlzLl9tb2RlID0gbW9kZTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX21vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl9lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUodGhpcy5fbW9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZShgYWNlL21vZGUvJHt0aGlzLl9tb2RlfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFRleHQodmFsdWUpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXRUZXh0KHZhbHVlKTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIC8vIHByaXZhdGUgX29uQ2hhbmdlID0gKF86IGFueSkgPT4ge1xuICAvLyB9XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAvLyBwcml2YXRlIF9vblRvdWNoZWQgPSAoKSA9PiB7XG4gIC8vIH1cbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFRleHQodGV4dCk7XG4gIH1cblxuICBzZXRUZXh0KHRleHQ6IGFueSkge1xuICAgIGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9ICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGV4dCAhPT0gdGV4dCAmJiB0aGlzLl9hdXRvVXBkYXRlQ29udGVudCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7XG4gICAgICB0aGlzLl9lZGl0b3Iuc2V0VmFsdWUodGV4dCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRleHQpO1xuICAgICAgdGhpcy5fZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZW1wdHlNZXNzYWdlKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYXV0b1VwZGF0ZUNvbnRlbnQoc3RhdHVzOiBhbnkpIHtcbiAgICB0aGlzLnNldEF1dG9VcGRhdGVDb250ZW50KHN0YXR1cyk7XG4gIH1cblxuICBzZXRBdXRvVXBkYXRlQ29udGVudChzdGF0dXM6IGFueSkge1xuICAgIHRoaXMuX2F1dG9VcGRhdGVDb250ZW50ID0gc3RhdHVzO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGR1cmF0aW9uQmVmb3JlQ2FsbGJhY2sobnVtOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldER1cmF0aW9uQmVmb3JlQ2FsbGJhY2sobnVtKTtcbiAgfVxuXG4gIHNldER1cmF0aW9uQmVmb3JlQ2FsbGJhY2sobnVtOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kdXJhdGlvbkJlZm9yZUNhbGxiYWNrID0gbnVtO1xuICB9XG5cbiAgLyoqIOS4uuepuuaXtuWinuWKoHBsYWNlaG9sZGVy5o+Q56S65L+h5oGvICovXG4gIHByaXZhdGUgZW1wdHlNZXNzYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNob3VsZFNob3cgPSAhdGhpcy5fdGV4dC5sZW5ndGg7XG4gICAgbGV0IG5vZGUgPSB0aGlzLl9lZGl0b3IucmVuZGVyZXIuZW1wdHlNZXNzYWdlTm9kZTtcbiAgICBpZiAoIXNob3VsZFNob3cgJiYgbm9kZSkge1xuICAgICAgdGhpcy5fZWRpdG9yLnJlbmRlcmVyLnNjcm9sbGVyLnJlbW92ZUNoaWxkKHRoaXMuX2VkaXRvci5yZW5kZXJlci5lbXB0eU1lc3NhZ2VOb2RlKTtcbiAgICAgIHRoaXMuX2VkaXRvci5yZW5kZXJlci5lbXB0eU1lc3NhZ2VOb2RlID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNob3VsZFNob3cgJiYgIW5vZGUpIHtcbiAgICAgIG5vZGUgPSB0aGlzLl9lZGl0b3IucmVuZGVyZXIuZW1wdHlNZXNzYWdlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbm9kZS50ZXh0Q29udGVudCA9IHRoaXMucGxhY2Vob2xkZXI7XG4gICAgICBub2RlLmNsYXNzTmFtZSA9ICdhY2VfZW1wdHlNZXNzYWdlJztcbiAgICAgIG5vZGUuc3R5bGUucGFkZGluZyA9ICcwIDlweCc7XG4gICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgIG5vZGUuc3R5bGUuekluZGV4ID0gOTtcbiAgICAgIG5vZGUuc3R5bGUub3BhY2l0eSA9IDAuNTtcbiAgICAgIHRoaXMuX2VkaXRvci5yZW5kZXJlci5zY3JvbGxlci5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG4gIH1cblxuICBnZXRFZGl0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgfVxuXG59XG4iXX0=