UNPKG

@senx/warpview-editor

Version:

WarpView Editor Elements

176 lines 28.2 kB
/* * Copyright 2020-2022 SenX S.A.S. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Utils } from '../../model/utils'; import { Component, ElementRef, Input, ViewChild, ViewEncapsulation } from '@angular/core'; import { editor } from 'monaco-editor'; import { Logger } from '../../model/logger'; import { EditorConfig } from '../../model/editorConfig'; var setTheme = editor.setTheme; var create = editor.create; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class WarpViewRawResultComponent { constructor() { this.loading = false; // tslint:disable-next-line:variable-name this._theme = 'light'; // tslint:disable-next-line:variable-name this._config = { editor: new EditorConfig(), messageClass: '', errorClass: '' }; // tslint:disable-next-line:variable-name this._debug = false; this.LINE_HEIGHT = 18; this.CONTAINER_GUTTER = 10; this.monacoTheme = 'vs'; this.LOG = new Logger(WarpViewRawResultComponent, this._debug); } set debug(debug) { if (typeof debug === 'string') { debug = 'true' === debug; } this._debug = debug; this.LOG.setDebug(debug); } get debug() { return this._debug; } set theme(newValue) { this.LOG.debug(['WarpViewRawResult'], 'The new value of theme is: ', newValue); if ('dark' === newValue) { this.monacoTheme = 'vs-dark'; } else { this.monacoTheme = 'vs'; } this.LOG.debug(['WarpViewRawResult'], 'The new value of theme is: ', this.monacoTheme); this._theme = newValue; setTheme(this.monacoTheme); } get theme() { return this._theme; } set result(newValue) { this.loading = true; this._result = newValue; this.LOG.debug(['WarpViewRawResult'], 'The new value of result is: ', newValue); this.buildEditor(this._result || ''); this.loading = false; } get result() { return this._result; } set config(config) { let conf = (typeof config === 'string') ? JSON.parse(config || '{}') : config || {}; this._config = Utils.mergeDeep(this._config, conf); this.LOG.debug(['config'], this._config, conf); if (this.resEd) { this.LOG.debug(['config'], this._config); this.resEd.updateOptions(this.setOptions()); } } get config() { return this._config; } ngOnInit() { this._config = Utils.mergeDeep(this._config, this.config); if ('dark' === this.theme) { this.monacoTheme = 'vs-dark'; } this.LOG.debug(['ngOnInit'], this.result); } buildEditor(json) { this.LOG.debug(['buildEditor'], 'buildEditor', json, this._config); this.json = json; if (!this.resEd && json) { this.resEd = create(this.editor.nativeElement, this.setOptions()); } if (!!this.resEd) { this.resEd.setValue(json || ''); } this.loading = false; } adjustHeight() { if (this.editor) { const el = this.editor.nativeElement; const codeContainer = el.getElementsByClassName('view-lines')[0]; const containerHeight = codeContainer.offsetHeight; let prevLineCount = 0; if (!containerHeight) { // dom hasn't finished settling down. wait a bit more. setTimeout(() => this.adjustHeight(), 0); } else { setTimeout(() => { const height = codeContainer.childElementCount > prevLineCount ? codeContainer.offsetHeight // unfold : codeContainer.childElementCount * this.LINE_HEIGHT + this.CONTAINER_GUTTER; // fold prevLineCount = codeContainer.childElementCount; el.style.height = height + 'px'; this.resEd.layout(); }, 0); } } } ngAfterViewInit() { this.LOG.debug(['ngAfterViewInit'], this._result); this.loading = true; this.buildEditor(JSON.stringify(this._result)); this.loading = false; } setOptions() { return { value: '', language: 'json', bracketPairColorization: { enable: true }, minimap: { enabled: true }, lineHeight: this.LINE_HEIGHT, automaticLayout: true, scrollBeyondLastLine: false, theme: this.monacoTheme, readOnly: !!this._config.editor.rawResultsReadOnly, fixedOverflowWidgets: true, lineNumbers: 'on', wordWrap: 'on', folding: false }; } } WarpViewRawResultComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: WarpViewRawResultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); WarpViewRawResultComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: WarpViewRawResultComponent, selector: "warpview-raw-result", inputs: { debug: "debug", theme: "theme", result: "result", config: "config", heightLine: "heightLine", heightPx: "heightPx" }, viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }], ngImport: i0, template: "<!--\n ~ Copyright 2020 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div [class]=\"'wrapper ' + _theme\">\n <div *ngIf=\"loading\" class=\"loader\">\n <div class=\"spinner\"></div>\n </div>\n <div #editor></div>\n</div>\n", styles: ["/*!\n * Copyright 2020 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */:host,warpview-raw-result{height:100%}:host .decorationsOverviewRuler,warpview-raw-result .decorationsOverviewRuler{display:none}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host .editor-res,warpview-raw-result .editor-res{width:100%;min-height:500px;height:100%}:host .wrapper,warpview-raw-result .wrapper{width:100%;height:100%;overflow:hidden}:host .wrapper .loader,warpview-raw-result .wrapper .loader{background-color:#0000004d;position:absolute;z-index:1;inset:0}:host .wrapper .loader .spinner,warpview-raw-result .wrapper .loader .spinner{animation:spin 1s linear infinite;border-color:var(--warp-view-spinner-color, #5899DA) transparent transparent transparent;border-style:solid;border-radius:50%;width:50px;height:50px;position:absolute;overflow:visible;z-index:999;margin:auto;top:calc(50% - 25px);left:calc(50% - 25px)}:host .wrapper.dark,warpview-raw-result .wrapper.dark{background-color:#1e1e1e;color:#f8f9fa;--warp-view-spinner-color: #f3f3f3}:host .wrapper.light,warpview-raw-result .wrapper.light{background-color:#fff!important;color:#000}:host .wrapper>div,warpview-raw-result .wrapper>div{width:100%!important;height:100%}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: WarpViewRawResultComponent, decorators: [{ type: Component, args: [{ selector: 'warpview-raw-result', encapsulation: ViewEncapsulation.Emulated, template: "<!--\n ~ Copyright 2020 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div [class]=\"'wrapper ' + _theme\">\n <div *ngIf=\"loading\" class=\"loader\">\n <div class=\"spinner\"></div>\n </div>\n <div #editor></div>\n</div>\n", styles: ["/*!\n * Copyright 2020 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */:host,warpview-raw-result{height:100%}:host .decorationsOverviewRuler,warpview-raw-result .decorationsOverviewRuler{display:none}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host .editor-res,warpview-raw-result .editor-res{width:100%;min-height:500px;height:100%}:host .wrapper,warpview-raw-result .wrapper{width:100%;height:100%;overflow:hidden}:host .wrapper .loader,warpview-raw-result .wrapper .loader{background-color:#0000004d;position:absolute;z-index:1;inset:0}:host .wrapper .loader .spinner,warpview-raw-result .wrapper .loader .spinner{animation:spin 1s linear infinite;border-color:var(--warp-view-spinner-color, #5899DA) transparent transparent transparent;border-style:solid;border-radius:50%;width:50px;height:50px;position:absolute;overflow:visible;z-index:999;margin:auto;top:calc(50% - 25px);left:calc(50% - 25px)}:host .wrapper.dark,warpview-raw-result .wrapper.dark{background-color:#1e1e1e;color:#f8f9fa;--warp-view-spinner-color: #f3f3f3}:host .wrapper.light,warpview-raw-result .wrapper.light{background-color:#fff!important;color:#000}:host .wrapper>div,warpview-raw-result .wrapper>div{width:100%!important;height:100%}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { editor: [{ type: ViewChild, args: ['editor', { static: true }] }], debug: [{ type: Input }], theme: [{ type: Input }], result: [{ type: Input }], config: [{ type: Input, args: ['config'] }], heightLine: [{ type: Input }], heightPx: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FycC12aWV3LXJhdy1yZXN1bHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FycHZpZXctZWRpdG9yLW5nL3NyYy9saWIvZWxlbWVudHMvd2FycC12aWV3LXJhdy1yZXN1bHQvd2FycC12aWV3LXJhdy1yZXN1bHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FycHZpZXctZWRpdG9yLW5nL3NyYy9saWIvZWxlbWVudHMvd2FycC12aWV3LXJhdy1yZXN1bHQvd2FycC12aWV3LXJhdy1yZXN1bHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFnQixTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRXRELElBQU8sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDbEMsSUFBTyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7O0FBUzlCLE1BQU0sT0FBTywwQkFBMEI7SUFrRnJDO1FBckJBLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIseUNBQXlDO1FBQ3pDLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFHakIseUNBQXlDO1FBQ3pDLFlBQU8sR0FBVztZQUNoQixNQUFNLEVBQUUsSUFBSSxZQUFZLEVBQUU7WUFDMUIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsVUFB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QyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTztZQUNMLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLE1BQU07WUFDaEIsdUJBQXVCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO1lBQ3ZDLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUM7WUFDeEIsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzVCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLG9CQUFvQixFQUFFLEtBQUs7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3ZCLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCO1lBQ2xELG9CQUFvQixFQUFFLElBQUk7WUFDMUIsV0FBVyxFQUFFLElBQUk7WUFDakIsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsS0FBSztTQUNHLENBQUM7SUFDdEIsQ0FBQzs7d0hBekpVLDBCQUEwQjs0R0FBMUIsMEJBQTBCLDJTQ2pDdkMsa3lCQXNCQTs0RkRXYSwwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0UscUJBQXFCLGlCQUdoQixpQkFBaUIsQ0FBQyxRQUFROzBFQUdKLE1BQU07c0JBQTFDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFHdEIsS0FBSztzQkFBakIsS0FBSztnQkFZTyxLQUFLO3NCQUFqQixLQUFLO2dCQWdCTyxNQUFNO3NCQUFsQixLQUFLO2dCQVllLE1BQU07c0JBQTFCLEtBQUs7dUJBQUMsUUFBUTtnQkFjTixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAyMDIwLTIwMjIgU2VuWCBTLkEuUy5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7VXRpbHN9IGZyb20gJy4uLy4uL21vZGVsL3V0aWxzJztcbmltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7ZWRpdG9yfSBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7TG9nZ2VyfSBmcm9tICcuLi8uLi9tb2RlbC9sb2dnZXInO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL21vZGVsL2NvbmZpZyc7XG5pbXBvcnQge0VkaXRvckNvbmZpZ30gZnJvbSAnLi4vLi4vbW9kZWwvZWRpdG9yQ29uZmlnJztcbmltcG9ydCBJU3RhbmRhbG9uZUNvZGVFZGl0b3IgPSBlZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xuaW1wb3J0IHNldFRoZW1lID0gZWRpdG9yLnNldFRoZW1lO1xuaW1wb3J0IGNyZWF0ZSA9IGVkaXRvci5jcmVhdGU7XG5pbXBvcnQgSUVkaXRvck9wdGlvbnMgPSBlZGl0b3IuSUVkaXRvck9wdGlvbnM7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dhcnB2aWV3LXJhdy1yZXN1bHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2FycC12aWV3LXJhdy1yZXN1bHQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93YXJwLXZpZXctcmF3LXJlc3VsdC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZFxufSlcbmV4cG9ydCBjbGFzcyBXYXJwVmlld1Jhd1Jlc3VsdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicsIHtzdGF0aWM6IHRydWV9KSBlZGl0b3I6IEVsZW1lbnRSZWY7XG4gIGpzb246IHN0cmluZztcblxuICBASW5wdXQoKSBzZXQgZGVidWcoZGVidWc6IGJvb2xlYW4gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGRlYnVnID09PSAnc3RyaW5nJykge1xuICAgICAgZGVidWcgPSAndHJ1ZScgPT09IGRlYnVnO1xuICAgIH1cbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnO1xuICAgIHRoaXMuTE9HLnNldERlYnVnKGRlYnVnKTtcbiAgfVxuXG4gIGdldCBkZWJ1ZygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVidWc7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGhlbWUobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuTE9HLmRlYnVnKFsnV2FycFZpZXdSYXdSZXN1bHQnXSwgJ1RoZSBuZXcgdmFsdWUgb2YgdGhlbWUgaXM6ICcsIG5ld1ZhbHVlKTtcbiAgICBpZiAoJ2RhcmsnID09PSBuZXdWYWx1ZSkge1xuICAgICAgdGhpcy5tb25hY29UaGVtZSA9ICd2cy1kYXJrJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb25hY29UaGVtZSA9ICd2cyc7XG4gICAgfVxuICAgIHRoaXMuTE9HLmRlYnVnKFsnV2FycFZpZXdSYXdSZXN1bHQnXSwgJ1RoZSBuZXcgdmFsdWUgb2YgdGhlbWUgaXM6ICcsIHRoaXMubW9uYWNvVGhlbWUpO1xuICAgIHRoaXMuX3RoZW1lID0gbmV3VmFsdWU7XG4gICAgc2V0VGhlbWUodGhpcy5tb25hY29UaGVtZSk7XG4gIH1cblxuICBnZXQgdGhlbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGhlbWU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVzdWx0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX3Jlc3VsdCA9IG5ld1ZhbHVlO1xuICAgIHRoaXMuTE9HLmRlYnVnKFsnV2FycFZpZXdSYXdSZXN1bHQnXSwgJ1RoZSBuZXcgdmFsdWUgb2YgcmVzdWx0IGlzOiAnLCBuZXdWYWx1ZSk7XG4gICAgdGhpcy5idWlsZEVkaXRvcih0aGlzLl9yZXN1bHQgfHwgJycpO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHJlc3VsdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHQ7XG4gIH1cblxuICBASW5wdXQoJ2NvbmZpZycpIHNldCBjb25maWcoY29uZmlnOiBDb25maWcgfCBzdHJpbmcpIHtcbiAgICBsZXQgY29uZiA9ICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykgPyBKU09OLnBhcnNlKGNvbmZpZyB8fCAne30nKSA6IGNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLl9jb25maWcgPSBVdGlscy5tZXJnZURlZXAodGhpcy5fY29uZmlnLCBjb25mKTtcbiAgICB0aGlzLkxPRy5kZWJ1ZyhbJ2NvbmZpZyddLCB0aGlzLl9jb25maWcsIGNvbmYpO1xuICAgIGlmICh0aGlzLnJlc0VkKSB7XG4gICAgICB0aGlzLkxPRy5kZWJ1ZyhbJ2NvbmZpZyddLCB0aGlzLl9jb25maWcpO1xuICAgICAgdGhpcy5yZXNFZC51cGRhdGVPcHRpb25zKHRoaXMuc2V0T3B0aW9ucygpKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29uZmlnKCk6IENvbmZpZyB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgpIGhlaWdodExpbmU6IG51bWJlcjtcbiAgQElucHV0KCkgaGVpZ2h0UHg6IG51bWJlcjtcblxuICBsb2FkaW5nID0gZmFsc2U7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIF90aGVtZSA9ICdsaWdodCc7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIF9yZXN1bHQ6IHN0cmluZztcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX2NvbmZpZzogQ29uZmlnID0ge1xuICAgIGVkaXRvcjogbmV3IEVkaXRvckNvbmZpZygpLFxuICAgIG1lc3NhZ2VDbGFzczogJycsXG4gICAgZXJyb3JDbGFzczogJydcbiAgfTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX2RlYnVnID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBMT0c6IExvZ2dlcjtcblxuICBwcml2YXRlIExJTkVfSEVJR0hUID0gMTg7XG4gIHByaXZhdGUgQ09OVEFJTkVSX0dVVFRFUiA9IDEwO1xuICBwcml2YXRlIHJlc0VkOiBJU3RhbmRhbG9uZUNvZGVFZGl0b3I7XG4gIHByaXZhdGUgbW9uYWNvVGhlbWUgPSAndnMnO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuTE9HID0gbmV3IExvZ2dlcihXYXJwVmlld1Jhd1Jlc3VsdENvbXBvbmVudCwgdGhpcy5fZGVidWcpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fY29uZmlnID0gVXRpbHMubWVyZ2VEZWVwKHRoaXMuX2NvbmZpZywgdGhpcy5jb25maWcpO1xuICAgIGlmICgnZGFyaycgPT09IHRoaXMudGhlbWUpIHtcbiAgICAgIHRoaXMubW9uYWNvVGhlbWUgPSAndnMtZGFyayc7XG4gICAgfVxuICAgIHRoaXMuTE9HLmRlYnVnKFsnbmdPbkluaXQnXSwgdGhpcy5yZXN1bHQpO1xuICB9XG5cbiAgYnVpbGRFZGl0b3IoanNvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5MT0cuZGVidWcoWydidWlsZEVkaXRvciddLCAnYnVpbGRFZGl0b3InLCBqc29uLCB0aGlzLl9jb25maWcpO1xuICAgIHRoaXMuanNvbiA9IGpzb247XG4gICAgaWYgKCF0aGlzLnJlc0VkICYmIGpzb24pIHtcbiAgICAgIHRoaXMucmVzRWQgPSBjcmVhdGUodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudCwgdGhpcy5zZXRPcHRpb25zKCkpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLnJlc0VkKSB7XG4gICAgICB0aGlzLnJlc0VkLnNldFZhbHVlKGpzb24gfHwgJycpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICB9XG5cbiAgYWRqdXN0SGVpZ2h0KCkge1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgY29kZUNvbnRhaW5lciA9IGVsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZpZXctbGluZXMnKVswXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvZGVDb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgbGV0IHByZXZMaW5lQ291bnQgPSAwO1xuICAgICAgaWYgKCFjb250YWluZXJIZWlnaHQpIHtcbiAgICAgICAgLy8gZG9tIGhhc24ndCBmaW5pc2hlZCBzZXR0bGluZyBkb3duLiB3YWl0IGEgYml0IG1vcmUuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGp1c3RIZWlnaHQoKSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPVxuICAgICAgICAgICAgY29kZUNvbnRhaW5lci5jaGlsZEVsZW1lbnRDb3VudCA+IHByZXZMaW5lQ291bnRcbiAgICAgICAgICAgICAgPyBjb2RlQ29udGFpbmVyLm9mZnNldEhlaWdodCAvLyB1bmZvbGRcbiAgICAgICAgICAgICAgOiBjb2RlQ29udGFpbmVyLmNoaWxkRWxlbWVudENvdW50ICogdGhpcy5MSU5FX0hFSUdIVCArIHRoaXMuQ09OVEFJTkVSX0dVVFRFUjsgLy8gZm9sZFxuICAgICAgICAgIHByZXZMaW5lQ291bnQgPSBjb2RlQ29udGFpbmVyLmNoaWxkRWxlbWVudENvdW50O1xuICAgICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgICAgdGhpcy5yZXNFZC5sYXlvdXQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuTE9HLmRlYnVnKFsnbmdBZnRlclZpZXdJbml0J10sIHRoaXMuX3Jlc3VsdCk7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmJ1aWxkRWRpdG9yKEpTT04uc3RyaW5naWZ5KHRoaXMuX3Jlc3VsdCkpO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgc2V0T3B0aW9ucygpOiBJRWRpdG9yT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIGxhbmd1YWdlOiAnanNvbicsXG4gICAgICBicmFja2V0UGFpckNvbG9yaXphdGlvbjoge2VuYWJsZTogdHJ1ZX0sXG4gICAgICBtaW5pbWFwOiB7ZW5hYmxlZDogdHJ1ZX0sXG4gICAgICBsaW5lSGVpZ2h0OiB0aGlzLkxJTkVfSEVJR0hULFxuICAgICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxuICAgICAgc2Nyb2xsQmV5b25kTGFzdExpbmU6IGZhbHNlLFxuICAgICAgdGhlbWU6IHRoaXMubW9uYWNvVGhlbWUsXG4gICAgICByZWFkT25seTogISF0aGlzLl9jb25maWcuZWRpdG9yLnJhd1Jlc3VsdHNSZWFkT25seSxcbiAgICAgIGZpeGVkT3ZlcmZsb3dXaWRnZXRzOiB0cnVlLFxuICAgICAgbGluZU51bWJlcnM6ICdvbicsXG4gICAgICB3b3JkV3JhcDogJ29uJyxcbiAgICAgIGZvbGRpbmc6IGZhbHNlXG4gICAgfSBhcyBJRWRpdG9yT3B0aW9ucztcbiAgfVxufVxuIiwiPCEtLVxuICB+ICBDb3B5cmlnaHQgMjAyMCBTZW5YIFMuQS5TLlxuICB+XG4gIH4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgflxuICB+ICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgfiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48ZGl2IFtjbGFzc109XCInd3JhcHBlciAnICsgX3RoZW1lXCI+XG4gIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJsb2FkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAjZWRpdG9yPjwvZGl2PlxuPC9kaXY+XG4iXX0=