UNPKG

cc-terminal

Version:
191 lines 24.4 kB
import { Injectable } from '@angular/core'; import { Observable, Subject } from 'rxjs'; import { filter, map, takeUntil } from 'rxjs/operators'; import cloneDeep from 'lodash.clonedeep'; import * as i0 from "@angular/core"; export class CcTerminalService { constructor() { this.ngUnsubscribe = new Subject(); // https://stackoverflow.com/questions/38008334/angular-rxjs-when-should-i-unsubscribe-from-subscription/41177163#41177163 this.event = new Subject(); this.readyStore(); } fetch(url) { return Observable.create(observer => { // angular http lib does not support arrayBuffer hence XMLHTTP const req = new XMLHttpRequest(); req.open('get', url, true); req.responseType = 'arraybuffer'; req.onreadystatechange = function () { if (req.readyState === 4 && req.status === 200) { observer.next(req.response); observer.complete(); } }; req.send(); }); } // calls the next event with listener id on listening component and data to send broadcast(key, data) { this.event.next({ key, data }); } /** * @description - This function will register to execute the store whenever store is ready. */ readyStore() { this.on('store-ready').subscribe(_store => { this.store = _store; this.store.state$.subscribe(state => { console.log('StoreReady: In Service:', state); }); }); } // filters through active observers and maps data to a matching observer on(key) { return this.event.asObservable().pipe(filter((event) => event.key === key), map(event => event.data)); } /** * @description - Get the Current prompt */ getPrompt() { return this.prompt; } /** * @description - Get the Current store */ getStore() { console.log('here'); return this.store; } initPrompt(config) { this.prompt = {}; let _user, _path, _userPathSeparator, _promptEnd; config = config ? config.promptConfiguration : null; const build = () => { this.prompt.text = _user + _userPathSeparator + _path + _promptEnd; }; this.prompt.reset = () => { _user = config && config.user != null ? (config.user || '') : 'anon'; _path = config && config.path != null ? (config.path || '') : '\\'; _userPathSeparator = config && config.separator != null ? (config.separator || '') : '@'; _promptEnd = config && config.end != null ? (config.end || '') : ':>'; build(); }; this.prompt.text = ''; this.prompt.reset(); return this.prompt; } /** * @description - This function will help you to interpret your commands. * @param cmd - command */ interpret(cmd) { const prompt = this.getPrompt(); // this.store.state$.subscribe(state => { console.log(state); }); const command = (cmd.command || '').split(' '); let _command = null; this.store.state$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(state => { _command = cloneDeep(state.commands.filter(// Remove the reference of command by making copy, to avoid modifying the command state (item) => { return item.name === command[0]; })[0] || null); }); if (_command && _command.name) { if (_command.callback && typeof _command.callback === 'function') { _command.callback(); } switch (_command.name) { case 'help': _command.details.result = _command.details.result.map((_result) => { if (_result && _result.text && typeof _result.text === 'function') { let text = _result.text(this.store.state.commands.map((c) => { return c.name; })); return { ..._result, text }; } else { return _result; } }); break; default: _command.details.result = _command.details.result.map((_result) => { if (_result && _result.text && typeof _result.text === 'function') { let text = (_result.text()).toString(); return { ..._result, text }; } else { return _result; } }); } _command.details.result.splice(0, 0, { text: prompt.text + cmd.command }); console.log('Final:', _command); this.broadcast('terminal-output', _command); } else { let result = ''; try { result = eval(cmd.command); // eval.call(null, cmd.command); if (result !== undefined) { this.broadcast('terminal-output', { details: { output: true, result: [ { text: prompt.text + cmd.command, }, { text: '' + result }, ], breakLine: true, } }); } } catch (e) { this.broadcast('terminal-output', { details: { output: true, result: [ { text: prompt.text + cmd.command, }, { text: '' + e, css: { color: 'red' } }, ], breakLine: true, } }); } } /** * @description - Regex for exact match command * note: we can add this in constants * TODO: We can design the exact match regex based command also. */ const regex = { alert: /^alert$/, }; // Example of how to work with regex based command // else if (regex.alert.test(command[0])) { // this.broadcast('terminal-output', { // details: { // output: true, // result: [ // { text: prompt.text + cmd.command, }, // { text: '' + e, css: { color: 'red' } }], // breakLine: true, // } // }); // command.splice(0, 1); // Remove command from command string // alert(command.join(' ')); // console.log(command); // } } ngOnDestroy() { // Clear Storage allocation of memory. this.ngUnsubscribe.next(true); this.ngUnsubscribe.complete(); } } /** @nocollapse */ CcTerminalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CcTerminalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ CcTerminalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CcTerminalService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CcTerminalService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtdGVybWluYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NjLXRlcm1pbmFsL3NyYy9saWIvY2MtdGVybWluYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sU0FBUyxNQUFNLGtCQUFrQixDQUFDOztBQVV6QyxNQUFNLE9BQU8saUJBQWlCO0lBTTVCO1FBTFEsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDLENBQUMsMEhBQTBIO1FBTXhLLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBVztRQUVmLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQyw4REFBOEQ7WUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0IsR0FBRyxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7WUFDakMsR0FBRyxDQUFDLGtCQUFrQixHQUFHO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUM5QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDNUIsUUFBUSxDQUFD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QUM7UUFFRixrREFBa0Q7UUFDbEQsMkNBQTJDO1FBQzNDLHNDQUFzQztRQUN0QyxlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCw2Q0FBNkM7UUFDN0MsaURBQWlEO1FBQ2pELHVCQUF1QjtRQUN2QixNQUFNO1FBQ04sTUFBTTtRQUNOLGdFQUFnRTtRQUNoRSw4QkFBOEI7UUFDOUIsMEJBQTBCO1FBQzFCLElBQUk7SUFDTixDQUFDO0lBRUQsV0FBVztRQUNULHNDQUFzQztRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7O2lJQTVMVSxpQkFBaUI7cUlBQWpCLGlCQUFpQixjQUZoQixNQUFNOzJGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21tYW5kU3RvcmUgfSBmcm9tICcuL2NjLXRlcm1pbmFsLWNvbW1hbmQtc3RvcmUnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW50ZXJmYWNlIEJyb2FkY2FzdEV2ZW50IHtcbiAga2V5OiBhbnk7XG4gIGRhdGE/OiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENjVGVybWluYWxTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTsgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzgwMDgzMzQvYW5ndWxhci1yeGpzLXdoZW4tc2hvdWxkLWktdW5zdWJzY3JpYmUtZnJvbS1zdWJzY3JpcHRpb24vNDExNzcxNjMjNDExNzcxNjNcbiAgcHJvbXB0OiBhbnk7XG4gIHB1YmxpYyBzdG9yZTogQ29tbWFuZFN0b3JlO1xuICBwcml2YXRlIGV2ZW50OiBTdWJqZWN0PEJyb2FkY2FzdEV2ZW50PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV2ZW50ID0gbmV3IFN1YmplY3Q8QnJvYWRjYXN0RXZlbnQ+KCk7XG4gICAgdGhpcy5yZWFkeVN0b3JlKCk7XG4gIH1cblxuICBmZXRjaCh1cmw6IHN0cmluZykge1xuXG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKG9ic2VydmVyID0+IHtcbiAgICAgIC8vIGFuZ3VsYXIgaHR0cCBsaWIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheUJ1ZmZlciBoZW5jZSBYTUxIVFRQXG4gICAgICBjb25zdCByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIHJlcS5vcGVuKCdnZXQnLCB1cmwsIHRydWUpO1xuICAgICAgcmVxLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocmVxLnJlYWR5U3RhdGUgPT09IDQgJiYgcmVxLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXEucmVzcG9uc2UpO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXEuc2VuZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY2FsbHMgdGhlIG5leHQgZXZlbnQgd2l0aCBsaXN0ZW5lciBpZCBvbiBsaXN0ZW5pbmcgY29tcG9uZW50IGFuZCBkYXRhIHRvIHNlbmRcbiAgYnJvYWRjYXN0KGtleTogYW55LCBkYXRhPzogYW55KSB7XG4gICAgdGhpcy5ldmVudC5uZXh0KHsga2V5LCBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiAtIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciB0byBleGVjdXRlIHRoZSBzdG9yZSB3aGVuZXZlciBzdG9yZSBpcyByZWFkeS5cbiAgICovXG4gIHJlYWR5U3RvcmUoKSB7XG4gICAgdGhpcy5vbjxhbnk+KCdzdG9yZS1yZWFkeScpLnN1YnNjcmliZShfc3RvcmUgPT4ge1xuICAgICAgdGhpcy5zdG9yZSA9IF9zdG9yZTtcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdG9yZVJlYWR5OiBJbiBTZXJ2aWNlOicsIHN0YXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZmlsdGVycyB0aHJvdWdoIGFjdGl2ZSBvYnNlcnZlcnMgYW5kIG1hcHMgZGF0YSB0byBhIG1hdGNoaW5nIG9ic2VydmVyXG4gIG9uPFQ+KGtleTogYW55KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnQuYXNPYnNlcnZhYmxlKCkucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5rZXkgPT09IGtleSksIG1hcChldmVudCA9PiA8VD5ldmVudC5kYXRhKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gR2V0IHRoZSBDdXJyZW50IHByb21wdFxuICAgKi9cbiAgcHVibGljIGdldFByb21wdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9tcHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gR2V0IHRoZSBDdXJyZW50IHN0b3JlXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RvcmUoKSB7XG4gICAgY29uc29sZS5sb2coJ2hlcmUnKTtcbiAgICByZXR1cm4gdGhpcy5zdG9yZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0UHJvbXB0KGNvbmZpZzogYW55KSB7XG4gICAgdGhpcy5wcm9tcHQgPSB7fTtcbiAgICBsZXQgX3VzZXI6IGFueSwgX3BhdGg6IGFueSwgX3VzZXJQYXRoU2VwYXJhdG9yOiBhbnksIF9wcm9tcHRFbmQ6IGFueTtcbiAgICBjb25maWcgPSBjb25maWcgPyBjb25maWcucHJvbXB0Q29uZmlndXJhdGlvbiA6IG51bGw7XG4gICAgY29uc3QgYnVpbGQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb21wdC50ZXh0ID0gX3VzZXIgKyBfdXNlclBhdGhTZXBhcmF0b3IgKyBfcGF0aCArIF9wcm9tcHRFbmQ7XG4gICAgfTtcbiAgICB0aGlzLnByb21wdC5yZXNldCA9ICgpID0+IHtcbiAgICAgIF91c2VyID0gY29uZmlnICYmIGNvbmZpZy51c2VyICE9IG51bGwgPyAoY29uZmlnLnVzZXIgfHwgJycpIDogJ2Fub24nO1xuICAgICAgX3BhdGggPSBjb25maWcgJiYgY29uZmlnLnBhdGggIT0gbnVsbCA/IChjb25maWcucGF0aCB8fCAnJykgOiAnXFxcXCc7XG4gICAgICBfdXNlclBhdGhTZXBhcmF0b3IgPSBjb25maWcgJiYgY29uZmlnLnNlcGFyYXRvciAhPSBudWxsID8gKGNvbmZpZy5zZXBhcmF0b3IgfHwgJycpIDogJ0AnO1xuICAgICAgX3Byb21wdEVuZCA9IGNvbmZpZyAmJiBjb25maWcuZW5kICE9IG51bGwgPyAoY29uZmlnLmVuZCB8fCAnJykgOiAnOj4nO1xuICAgICAgYnVpbGQoKTtcbiAgICB9O1xuICAgIHRoaXMucHJvbXB0LnRleHQgPSAnJztcbiAgICB0aGlzLnByb21wdC5yZXNldCgpO1xuICAgIHJldHVybiB0aGlzLnByb21wdDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiAtIFRoaXMgZnVuY3Rpb24gd2lsbCBoZWxwIHlvdSB0byBpbnRlcnByZXQgeW91ciBjb21tYW5kcy5cbiAgICogQHBhcmFtIGNtZCAtIGNvbW1hbmRcbiAgICovXG4gIHB1YmxpYyBpbnRlcnByZXQoY21kOiBhbnkpIHtcbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmdldFByb21wdCgpO1xuICAgIC8vIHRoaXMuc3RvcmUuc3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7IGNvbnNvbGUubG9nKHN0YXRlKTsgfSk7XG4gICAgY29uc3QgY29tbWFuZCA9IChjbWQuY29tbWFuZCB8fCAnJykuc3BsaXQoJyAnKTtcbiAgICBsZXQgX2NvbW1hbmQgPSBudWxsO1xuICAgIHRoaXMuc3RvcmUuc3RhdGUkLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICBfY29tbWFuZCA9IGNsb25lRGVlcChzdGF0ZS5jb21tYW5kcy5maWx0ZXIoIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIG9mIGNvbW1hbmQgYnkgbWFraW5nIGNvcHksIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgY29tbWFuZCBzdGF0ZVxuICAgICAgICAoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IGNvbW1hbmRbMF07XG4gICAgICAgIH0pWzBdIHx8IG51bGwpO1xuICAgIH0pO1xuICAgIGlmIChfY29tbWFuZCAmJiBfY29tbWFuZC5uYW1lKSB7XG4gICAgICBpZiAoX2NvbW1hbmQuY2FsbGJhY2sgJiYgdHlwZW9mIF9jb21tYW5kLmNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9jb21tYW5kLmNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKF9jb21tYW5kLm5hbWUpIHtcbiAgICAgICAgY2FzZSAnaGVscCc6XG4gICAgICAgICAgX2NvbW1hbmQuZGV0YWlscy5yZXN1bHQgPSBfY29tbWFuZC5kZXRhaWxzLnJlc3VsdC5tYXAoKF9yZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChfcmVzdWx0ICYmIF9yZXN1bHQudGV4dCAmJiB0eXBlb2YgX3Jlc3VsdC50ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGxldCB0ZXh0ID0gX3Jlc3VsdC50ZXh0KHRoaXMuc3RvcmUuc3RhdGUuY29tbWFuZHMubWFwKChjKSA9PiB7IHJldHVybiBjLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uX3Jlc3VsdCwgdGV4dCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX2NvbW1hbmQuZGV0YWlscy5yZXN1bHQgPSBfY29tbWFuZC5kZXRhaWxzLnJlc3VsdC5tYXAoKF9yZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChfcmVzdWx0ICYmIF9yZXN1bHQudGV4dCAmJiB0eXBlb2YgX3Jlc3VsdC50ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGxldCB0ZXh0ID0gKF9yZXN1bHQudGV4dCgpKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5fcmVzdWx0LCB0ZXh0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9jb21tYW5kLmRldGFpbHMucmVzdWx0LnNwbGljZSgwLCAwLCB7IHRleHQ6IHByb21wdC50ZXh0ICsgY21kLmNvbW1hbmQgfSk7XG4gICAgICBjb25zb2xlLmxvZygnRmluYWw6JywgX2NvbW1hbmQpO1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ3Rlcm1pbmFsLW91dHB1dCcsIF9jb21tYW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZXZhbChjbWQuY29tbWFuZCk7IC8vIGV2YWwuY2FsbChudWxsLCBjbWQuY29tbWFuZCk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuYnJvYWRjYXN0KCd0ZXJtaW5hbC1vdXRwdXQnLCB7XG4gICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgIG91dHB1dDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVzdWx0OiBbXG4gICAgICAgICAgICAgICAgeyB0ZXh0OiBwcm9tcHQudGV4dCArIGNtZC5jb21tYW5kLCB9LFxuICAgICAgICAgICAgICAgIHsgdGV4dDogJycgKyByZXN1bHQgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYnJlYWtMaW5lOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0KCd0ZXJtaW5hbC1vdXRwdXQnLCB7XG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgb3V0cHV0OiB0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OiBbXG4gICAgICAgICAgICAgIHsgdGV4dDogcHJvbXB0LnRleHQgKyBjbWQuY29tbWFuZCwgfSxcbiAgICAgICAgICAgICAgeyB0ZXh0OiAnJyArIGUsIGNzczogeyBjb2xvcjogJ3JlZCcgfSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGJyZWFrTGluZTogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiAtIFJlZ2V4IGZvciBleGFjdCBtYXRjaCBjb21tYW5kXG4gICAgICogICBub3RlOiB3ZSBjYW4gYWRkIHRoaXMgaW4gY29uc3RhbnRzXG4gICAgICogIFRPRE86IFdlIGNhbiBkZXNpZ24gdGhlIGV4YWN0IG1hdGNoIHJlZ2V4IGJhc2VkIGNvbW1hbmQgYWxzby5cbiAgICAgKi9cbiAgICBjb25zdCByZWdleCA9IHsgLy8gV2UgY2FuIGRlc2lnbiB0aGUgZXhhY3QgbWF0Y2ggcmVnZXggYmFzZWQgY29tbWFuZCBhbHNvLlxuICAgICAgYWxlcnQ6IC9eYWxlcnQkLyxcbiAgICB9O1xuXG4gICAgLy8gRXhhbXBsZSBvZiBob3cgdG8gd29yayB3aXRoIHJlZ2V4IGJhc2VkIGNvbW1hbmRcbiAgICAvLyBlbHNlIGlmIChyZWdleC5hbGVydC50ZXN0KGNvbW1hbmRbMF0pKSB7XG4gICAgLy8gdGhpcy5icm9hZGNhc3QoJ3Rlcm1pbmFsLW91dHB1dCcsIHtcbiAgICAvLyAgIGRldGFpbHM6IHtcbiAgICAvLyAgIG91dHB1dDogdHJ1ZSxcbiAgICAvLyAgIHJlc3VsdDogW1xuICAgIC8vICAgICAgeyB0ZXh0OiBwcm9tcHQudGV4dCArIGNtZC5jb21tYW5kLCB9LFxuICAgIC8vICAgICAgeyB0ZXh0OiAnJyArIGUsIGNzczogeyBjb2xvcjogJ3JlZCcgfSB9XSxcbiAgICAvLyAgICAgYnJlYWtMaW5lOiB0cnVlLFxuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICAgIC8vICAgY29tbWFuZC5zcGxpY2UoMCwgMSk7IC8vIFJlbW92ZSBjb21tYW5kIGZyb20gY29tbWFuZCBzdHJpbmdcbiAgICAvLyAgIGFsZXJ0KGNvbW1hbmQuam9pbignICcpKTtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGNvbW1hbmQpO1xuICAgIC8vIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIENsZWFyIFN0b3JhZ2UgYWxsb2NhdGlvbiBvZiBtZW1vcnkuXG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxufVxuIl19