UNPKG

@neo-one/server-plugin

Version:

NEO•ONE Server plugin API.

207 lines (205 loc) 29.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("@neo-one/utils"); const rxjs_1 = require("rxjs"); const operators_1 = require("rxjs/operators"); const tasks_1 = require("./tasks"); class TaskWrapper { constructor({ task, taskList, collapse, }) { this.task = task; this.taskList = taskList; this.status$ = new rxjs_1.BehaviorSubject({ id: task.title, title: task.title, collapse, }); this.skip = task.skip === undefined ? (_ctx) => false : task.skip; this.getEnabled = task.enabled === undefined ? (_ctx) => true : task.enabled; this.mutableAborted = false; } check(ctx) { if (this.enabled && !this.pending && !this.done && !this.getEnabled(ctx)) { this.status$.next(undefined); } } get enabled() { return this.status$.getValue() !== undefined; } get pending() { const status = this.status$.getValue(); return status !== undefined && status.pending === true; } get done() { const status = this.status$.getValue(); return status !== undefined && tasks_1.isTaskDone(status); } get error() { const status = this.status$.getValue(); return status === undefined ? undefined : tasks_1.getTaskError(status); } abort() { this.mutableAborted = true; const status = this.status$.getValue(); if (status !== undefined) { this.status$.next(Object.assign({}, status, { skipped: 'Aborted' })); } this.status$.complete(); } complete() { this.status$.complete(); } async run(ctx) { const statusIn = this.status$.getValue(); if (statusIn === undefined) { this.status$.complete(); return; } if (this.mutableAborted) { return; } let status = Object.assign({}, statusIn, { pending: true }); const onError = (error) => { this.taskList.onError(error, ctx); this.taskList.mutableSuperOnError(error); }; try { const skip = this.skip(ctx); if (skip !== false) { status = Object.assign({}, status, { pending: false, skipped: skip }); this.status$.next(status); } else { this.status$.next(status); const result = this.task.task(ctx); let error; let message; if (result instanceof rxjs_1.Observable) { await result .pipe(operators_1.map((msg) => { status = Object.assign({}, status, { message: msg }); this.status$.next(status); })) .toPromise(); } else if (result instanceof Promise) { message = await result; } else if (result instanceof TaskList) { result.setSuperOnError(onError); result.run(ctx); const finalSubtasks = await result.status$ .pipe(operators_1.map((subtasks) => { status = Object.assign({}, status, { subtasks }); this.status$.next(status); return subtasks; })) .toPromise(); error = tasks_1.getTasksError(finalSubtasks); } this.status$.next(Object.assign({}, status, { pending: false, complete: error === undefined, message: message === undefined ? undefined : message, error })); } } catch (error) { const message = error.stack == undefined ? error.message : error.stack; this.status$.next(Object.assign({}, status, { pending: false, error: message == undefined || message === '' ? 'Something went wrong.' : message })); onError(error); } this.status$.complete(); } } class TaskList { constructor({ tasks, concurrent = false, onError, onComplete, onDone, initialContext = {}, freshContext = false, collapse = true, }) { this.tasks = tasks.map((task) => new TaskWrapper({ task, taskList: this, collapse, })); this.concurrent = concurrent; this.onError = onError === undefined ? (_error, _ctx) => { } : onError; this.onComplete = onComplete === undefined ? () => { } : onComplete; this.onDone = onDone === undefined ? (_failed) => { } : onDone; this.initialContext = initialContext; this.freshContext = freshContext; this.mutableSuperOnError = (_error) => { }; this.statusInternal$ = new rxjs_1.ReplaySubject(1); } get status$() { this.run().catch((error) => this.onError(error, {})); return this.statusInternal$; } async toPromise() { const result = await this.status$.toPromise(); const error = tasks_1.getTasksError(result); if (error !== undefined) { throw new Error(error); } } async abort() { await this.abort$().toPromise(); } abort$() { this.tasks.forEach((task) => task.abort()); return this.status$; } setSuperOnError(onError) { this.mutableSuperOnError = onError; } async run(ctxIn = {}) { if (this.mutableSubscription !== undefined) { return; } const ctx = this.freshContext ? {} : ctxIn; Object.entries(this.initialContext).forEach(([key, value]) => { ctx[key] = value; }); this.checkAll(ctx); this.mutableSubscription = rxjs_1.combineLatest(this.tasks.map((task) => task.status$)) .pipe(operators_1.map((statuses) => statuses.filter(utils_1.utils.notNull))) .subscribe(this.statusInternal$); await this.runTasks(ctx); const err = tasks_1.getTasksError(this.tasks.map((task) => task.status$.getValue()).filter(utils_1.utils.notNull)); if (err === undefined) { this.onComplete(); } this.onDone(err !== undefined); } async runTasks(ctx) { if (this.tasks.length === 0) { this.statusInternal$.next([]); return; } if (this.concurrent) { await Promise.all(this.tasks.map(async (task) => task.run(ctx))); } else { let error; for (const task of this.tasks) { if (error === undefined) { await task.run(ctx); } else { task.complete(); } error = task.error; } } } checkAll(ctx) { this.tasks.forEach((task) => task.check(ctx)); } } exports.TaskList = TaskList; //# sourceMappingURL=data:application/json;charset=utf8;base64,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b25lLXNlcnZlci1wbHVnaW4vc3JjL1Rhc2tMaXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0VGFza0Vycm9yLCBnZXRUYXNrc0Vycm9yLCBpc1Rhc2tEb25lIH0gZnJvbSAnLi90YXNrcyc7XG5pbXBvcnQgeyBUYXNrU3RhdHVzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbmV4cG9ydCB0eXBlIFRhc2tDb250ZXh0ID0gYW55O1xudHlwZSBTa2lwRm4gPSAoY3R4OiBUYXNrQ29udGV4dCkgPT4gc3RyaW5nIHwgYm9vbGVhbjtcbnR5cGUgRW5hYmxlZEZuID0gKGN0eDogVGFza0NvbnRleHQpID0+IGJvb2xlYW47XG50eXBlIE9uRXJyb3JGbiA9IChlcnJvcjogRXJyb3IsIGN0eDogVGFza0NvbnRleHQpID0+IHZvaWQ7XG50eXBlIE9uRG9uZUZuID0gKGZhaWxlZDogYm9vbGVhbikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBUYXNrIHtcbiAgcmVhZG9ubHkgc2tpcD86IFNraXBGbjtcbiAgcmVhZG9ubHkgZW5hYmxlZD86IEVuYWJsZWRGbjtcbiAgcmVhZG9ubHkgdGFzazogKGN0eDogVGFza0NvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCBQcm9taXNlPHN0cmluZz4gfCBPYnNlcnZhYmxlPHN0cmluZz4gfCBUYXNrTGlzdCB8IHZvaWQ7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0xpc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgdGFza3M6IHJlYWRvbmx5IFRhc2tbXTtcbiAgcmVhZG9ubHkgY29uY3VycmVudD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG9uRXJyb3I/OiBPbkVycm9yRm47XG4gIHJlYWRvbmx5IG9uQ29tcGxldGU/OiAoKSA9PiB2b2lkO1xuICByZWFkb25seSBvbkRvbmU/OiBPbkRvbmVGbjtcbiAgcmVhZG9ubHkgaW5pdGlhbENvbnRleHQ/OiBUYXNrQ29udGV4dDtcbiAgcmVhZG9ubHkgZnJlc2hDb250ZXh0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29sbGFwc2U/OiBib29sZWFuO1xufVxuXG5jbGFzcyBUYXNrV3JhcHBlciB7XG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXMkOiBCZWhhdmlvclN1YmplY3Q8VGFza1N0YXR1cyB8IHVuZGVmaW5lZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFzaztcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrTGlzdDogVGFza0xpc3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2tpcDogU2tpcEZuO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEVuYWJsZWQ6IEVuYWJsZWRGbjtcbiAgcHJpdmF0ZSBtdXRhYmxlQWJvcnRlZDogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioe1xuICAgIHRhc2ssXG4gICAgdGFza0xpc3QsXG4gICAgY29sbGFwc2UsXG4gIH06IHtcbiAgICByZWFkb25seSB0YXNrOiBUYXNrO1xuICAgIHJlYWRvbmx5IHRhc2tMaXN0OiBUYXNrTGlzdDtcbiAgICByZWFkb25seSBjb2xsYXBzZTogYm9vbGVhbjtcbiAgfSkge1xuICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgdGhpcy50YXNrTGlzdCA9IHRhc2tMaXN0O1xuICAgIHRoaXMuc3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFza1N0YXR1cyB8IHVuZGVmaW5lZD4oe1xuICAgICAgaWQ6IHRhc2sudGl0bGUsXG4gICAgICB0aXRsZTogdGFzay50aXRsZSxcbiAgICAgIGNvbGxhcHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5za2lwID0gdGFzay5za2lwID09PSB1bmRlZmluZWQgPyAoX2N0eCkgPT4gZmFsc2UgOiB0YXNrLnNraXA7XG4gICAgdGhpcy5nZXRFbmFibGVkID0gdGFzay5lbmFibGVkID09PSB1bmRlZmluZWQgPyAoX2N0eCkgPT4gdHJ1ZSA6IHRhc2suZW5hYmxlZDtcbiAgICB0aGlzLm11dGFibGVBYm9ydGVkID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgY2hlY2soY3R4OiBUYXNrQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgIXRoaXMucGVuZGluZyAmJiAhdGhpcy5kb25lICYmICF0aGlzLmdldEVuYWJsZWQoY3R4KSkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzJC5nZXRWYWx1ZSgpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG5cbiAgICByZXR1cm4gc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzLnBlbmRpbmcgPT09IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRvbmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG5cbiAgICByZXR1cm4gc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgaXNUYXNrRG9uZShzdGF0dXMpO1xuICB9XG5cbiAgcHVibGljIGdldCBlcnJvcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuc3RhdHVzJC5nZXRWYWx1ZSgpO1xuXG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZ2V0VGFza0Vycm9yKHN0YXR1cyk7XG4gIH1cblxuICBwdWJsaWMgYWJvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhYmxlQWJvcnRlZCA9IHRydWU7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG4gICAgaWYgKHN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dCh7IC4uLnN0YXR1cywgc2tpcHBlZDogJ0Fib3J0ZWQnIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXR1cyQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjb21wbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXR1cyQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBydW4oY3R4OiBUYXNrQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXR1c0luID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG4gICAgaWYgKHN0YXR1c0luID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5jb21wbGV0ZSgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm11dGFibGVBYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHN0YXR1cyA9IHsgLi4uc3RhdHVzSW4sIHBlbmRpbmc6IHRydWUgfTtcblxuICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aGlzLnRhc2tMaXN0Lm9uRXJyb3IoZXJyb3IsIGN0eCk7XG4gICAgICB0aGlzLnRhc2tMaXN0Lm11dGFibGVTdXBlck9uRXJyb3IoZXJyb3IpO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2tpcCA9IHRoaXMuc2tpcChjdHgpO1xuICAgICAgaWYgKHNraXAgIT09IGZhbHNlKSB7XG4gICAgICAgIHN0YXR1cyA9IHsgLi4uc3RhdHVzLCBwZW5kaW5nOiBmYWxzZSwgc2tpcHBlZDogc2tpcCB9O1xuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1maW5uaXNoXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudGFzay50YXNrKGN0eCk7XG5cbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICBsZXQgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgdm9pZDtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICBhd2FpdCByZXN1bHRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9IHsgLi4uc3RhdHVzLCBtZXNzYWdlOiBtc2cgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBUYXNrTGlzdCkge1xuICAgICAgICAgIHJlc3VsdC5zZXRTdXBlck9uRXJyb3Iob25FcnJvcik7XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgcmVzdWx0LnJ1bihjdHgpO1xuICAgICAgICAgIGNvbnN0IGZpbmFsU3VidGFza3MgPSBhd2FpdCByZXN1bHQuc3RhdHVzJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoc3VidGFza3MpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSB7IC4uLnN0YXR1cywgc3VidGFza3MgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChzdGF0dXMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1YnRhc2tzO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgICAgICBlcnJvciA9IGdldFRhc2tzRXJyb3IoZmluYWxTdWJ0YXNrcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dCh7XG4gICAgICAgICAgLi4uc3RhdHVzLFxuICAgICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICAgIGNvbXBsZXRlOiBlcnJvciA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1lc3NhZ2UsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3Iuc3RhY2sgPT0gdW5kZWZpbmVkID8gZXJyb3IubWVzc2FnZSA6IGVycm9yLnN0YWNrO1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoe1xuICAgICAgICAuLi5zdGF0dXMsXG4gICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbWVzc2FnZSA9PSB1bmRlZmluZWQgfHwgbWVzc2FnZSA9PT0gJycgPyAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJyA6IG1lc3NhZ2UsXG4gICAgICB9KTtcblxuICAgICAgb25FcnJvcihlcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXMkLmNvbXBsZXRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhc2tMaXN0IHtcbiAgcHVibGljIG11dGFibGVTdXBlck9uRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHB1YmxpYyByZWFkb25seSBvbkVycm9yOiBPbkVycm9yRm47XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza3M6IHJlYWRvbmx5IFRhc2tXcmFwcGVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uY3VycmVudDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRG9uZTogT25Eb25lRm47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdGlhbENvbnRleHQ6IFRhc2tDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IGZyZXNoQ29udGV4dDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0dXNJbnRlcm5hbCQ6IFJlcGxheVN1YmplY3Q8cmVhZG9ubHkgVGFza1N0YXR1c1tdPjtcbiAgcHJpdmF0ZSBtdXRhYmxlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHtcbiAgICB0YXNrcyxcbiAgICBjb25jdXJyZW50ID0gZmFsc2UsXG4gICAgb25FcnJvcixcbiAgICBvbkNvbXBsZXRlLFxuICAgIG9uRG9uZSxcbiAgICBpbml0aWFsQ29udGV4dCA9IHt9LFxuICAgIGZyZXNoQ29udGV4dCA9IGZhbHNlLFxuICAgIGNvbGxhcHNlID0gdHJ1ZSxcbiAgfTogVGFza0xpc3RPcHRpb25zKSB7XG4gICAgdGhpcy50YXNrcyA9IHRhc2tzLm1hcChcbiAgICAgICh0YXNrKSA9PlxuICAgICAgICBuZXcgVGFza1dyYXBwZXIoe1xuICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgdGFza0xpc3Q6IHRoaXMsXG4gICAgICAgICAgY29sbGFwc2UsXG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgIHRoaXMub25FcnJvciA9XG4gICAgICBvbkVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoX2Vycm9yLCBfY3R4KSA9PiB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICA6IG9uRXJyb3I7XG4gICAgdGhpcy5vbkNvbXBsZXRlID1cbiAgICAgIG9uQ29tcGxldGUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIDogb25Db21wbGV0ZTtcbiAgICB0aGlzLm9uRG9uZSA9XG4gICAgICBvbkRvbmUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChfZmFpbGVkKSA9PiB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICA6IG9uRG9uZTtcbiAgICB0aGlzLmluaXRpYWxDb250ZXh0ID0gaW5pdGlhbENvbnRleHQ7XG4gICAgdGhpcy5mcmVzaENvbnRleHQgPSBmcmVzaENvbnRleHQ7XG4gICAgdGhpcy5tdXRhYmxlU3VwZXJPbkVycm9yID0gKF9lcnJvcikgPT4ge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH07XG5cbiAgICB0aGlzLnN0YXR1c0ludGVybmFsJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICB9XG5cbiAgcHVibGljIGdldCBzdGF0dXMkKCk6IE9ic2VydmFibGU8cmVhZG9ubHkgVGFza1N0YXR1c1tdPiB7XG4gICAgdGhpcy5ydW4oKS5jYXRjaCgoZXJyb3IpID0+IHRoaXMub25FcnJvcihlcnJvciwge30pKTtcblxuICAgIHJldHVybiB0aGlzLnN0YXR1c0ludGVybmFsJDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0b1Byb21pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdGF0dXMkLnRvUHJvbWlzZSgpO1xuICAgIGNvbnN0IGVycm9yID0gZ2V0VGFza3NFcnJvcihyZXN1bHQpO1xuICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhYm9ydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmFib3J0JCgpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHVibGljIGFib3J0JCgpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IFRhc2tTdGF0dXNbXT4ge1xuICAgIHRoaXMudGFza3MuZm9yRWFjaCgodGFzaykgPT4gdGFzay5hYm9ydCgpKTtcblxuICAgIHJldHVybiB0aGlzLnN0YXR1cyQ7XG4gIH1cblxuICBwdWJsaWMgc2V0U3VwZXJPbkVycm9yKG9uRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm11dGFibGVTdXBlck9uRXJyb3IgPSBvbkVycm9yO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJ1bihjdHhJbjogVGFza0NvbnRleHQgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm11dGFibGVTdWJzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN0eCA9IHRoaXMuZnJlc2hDb250ZXh0ID8ge30gOiBjdHhJbjtcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmluaXRpYWxDb250ZXh0KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1vYmplY3QtbXV0YXRpb25cbiAgICAgIGN0eFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5jaGVja0FsbChjdHgpO1xuXG4gICAgdGhpcy5tdXRhYmxlU3Vic2NyaXB0aW9uID0gY29tYmluZUxhdGVzdCh0aGlzLnRhc2tzLm1hcCgodGFzaykgPT4gdGFzay5zdGF0dXMkKSlcbiAgICAgIC5waXBlKG1hcCgoc3RhdHVzZXMpOiByZWFkb25seSBUYXNrU3RhdHVzW10gPT4gc3RhdHVzZXMuZmlsdGVyKHV0aWxzLm5vdE51bGwpKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5zdGF0dXNJbnRlcm5hbCQpO1xuXG4gICAgYXdhaXQgdGhpcy5ydW5UYXNrcyhjdHgpO1xuICAgIGNvbnN0IGVyciA9IGdldFRhc2tzRXJyb3IodGhpcy50YXNrcy5tYXAoKHRhc2spID0+IHRhc2suc3RhdHVzJC5nZXRWYWx1ZSgpKS5maWx0ZXIodXRpbHMubm90TnVsbCkpO1xuXG4gICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5vbkRvbmUoZXJyICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5UYXNrcyhjdHg6IFRhc2tDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudGFza3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXR1c0ludGVybmFsJC5uZXh0KFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmN1cnJlbnQpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMudGFza3MubWFwKGFzeW5jICh0YXNrKSA9PiB0YXNrLnJ1bihjdHgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICBpZiAoZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGF3YWl0IHRhc2sucnVuKGN0eCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFzay5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yID0gdGFzay5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQWxsKGN0eDogVGFza0NvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tzLmZvckVhY2goKHRhc2spID0+IHRhc2suY2hlY2soY3R4KSk7XG4gIH1cbn1cbiJdfQ==