UNPKG

15.1 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11Object.defineProperty(exports, "__esModule", { value: true });
12const assert = require("assert");
13const convert_1 = require("../convert");
14const apply_edit_adapter_1 = require("./apply-edit-adapter");
15const languageclient_1 = require("../languageclient");
16class CodeActionAdapter {
17 /** @returns A {Boolean} indicating this adapter can adapt the server based on the given serverCapabilities. */
18 static canAdapt(serverCapabilities) {
19 return serverCapabilities.codeActionProvider === true;
20 }
21 /**
22 * Public: Retrieves code actions for a given editor, range, and context (diagnostics). Throws an error if
23 * codeActionProvider is not a registered capability.
24 *
25 * @param connection A {LanguageClientConnection} to the language server that provides highlights.
26 * @param serverCapabilities The {ServerCapabilities} of the language server that will be used.
27 * @param editor The Atom {TextEditor} containing the diagnostics.
28 * @param range The Atom {Range} to fetch code actions for.
29 * @param linterMessages An {Array<linter$Message>} to fetch code actions for. This is typically a list of messages
30 * intersecting `range`.
31 * @returns A {Promise} of an {Array} of {atomIde$CodeAction}s to display.
32 */
33 static getCodeActions(connection, serverCapabilities, linterAdapter, editor, range, linterMessages, filterActions = (actions) => actions, onApply = () => Promise.resolve(true)) {
34 return __awaiter(this, void 0, void 0, function* () {
35 if (linterAdapter == null) {
36 return [];
37 }
38 assert(serverCapabilities.codeActionProvider, "Must have the textDocument/codeAction capability");
39 const params = createCodeActionParams(linterAdapter, editor, range, linterMessages);
40 const actions = filterActions(yield connection.codeAction(params));
41 if (actions === null) {
42 return [];
43 }
44 return actions.map((action) => CodeActionAdapter.createCodeAction(action, connection, onApply));
45 });
46 }
47 static createCodeAction(action, connection, onApply) {
48 return {
49 apply() {
50 return __awaiter(this, void 0, void 0, function* () {
51 if (!(yield onApply(action))) {
52 return;
53 }
54 if (languageclient_1.CodeAction.is(action)) {
55 CodeActionAdapter.applyWorkspaceEdit(action.edit);
56 yield CodeActionAdapter.executeCommand(action.command, connection);
57 }
58 else {
59 yield CodeActionAdapter.executeCommand(action, connection);
60 }
61 });
62 },
63 getTitle() {
64 return Promise.resolve(action.title);
65 },
66 dispose() { },
67 };
68 }
69 static applyWorkspaceEdit(edit) {
70 if (languageclient_1.WorkspaceEdit.is(edit)) {
71 apply_edit_adapter_1.default.onApplyEdit({ edit });
72 }
73 }
74 static executeCommand(command, connection) {
75 return __awaiter(this, void 0, void 0, function* () {
76 if (languageclient_1.Command.is(command)) {
77 yield connection.executeCommand({
78 command: command.command,
79 arguments: command.arguments,
80 });
81 }
82 });
83 }
84}
85exports.default = CodeActionAdapter;
86function createCodeActionParams(linterAdapter, editor, range, linterMessages) {
87 let diagnostics;
88 if (linterMessages.length === 0) {
89 diagnostics = [];
90 }
91 else {
92 // TODO compile time dispatch using function names
93 diagnostics = areLinterMessages(linterMessages)
94 ? linterAdapter.getLSDiagnosticsForMessages(linterMessages)
95 : linterAdapter.getLSDiagnosticsForIdeDiagnostics(linterMessages, editor);
96 }
97 return {
98 textDocument: convert_1.default.editorToTextDocumentIdentifier(editor),
99 range: convert_1.default.atomRangeToLSRange(range),
100 context: {
101 diagnostics,
102 },
103 };
104}
105function areLinterMessages(linterMessages) {
106 if ("excerpt" in linterMessages[0]) {
107 return true;
108 }
109 return false;
110}
111//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1hY3Rpb24tYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9hZGFwdGVycy9jb2RlLWFjdGlvbi1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBS0EsaUNBQWlDO0FBQ2pDLHdDQUFnQztBQUNoQyw2REFBbUQ7QUFDbkQsc0RBUTBCO0FBRzFCLE1BQXFCLGlCQUFpQjtJQUNwQywrR0FBK0c7SUFDeEcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBc0M7UUFDM0QsT0FBTyxrQkFBa0IsQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLENBQUE7SUFDdkQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFPLGNBQWMsQ0FDaEMsVUFBb0MsRUFDcEMsa0JBQXNDLEVBQ3RDLGFBQXFFLEVBQ3JFLE1BQWtCLEVBQ2xCLEtBQVksRUFDWixjQUF1RCxFQUN2RCxnQkFBK0YsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFDbkgsVUFBOEQsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7O1lBRXpGLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtnQkFDekIsT0FBTyxFQUFFLENBQUE7YUFDVjtZQUNELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxrREFBa0QsQ0FBQyxDQUFBO1lBRWpHLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1lBQ25GLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUNsRSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFBO2FBQ1Y7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNqRyxDQUFDO0tBQUE7SUFFTyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLE1BQTRCLEVBQzVCLFVBQW9DLEVBQ3BDLE9BQTJEO1FBRTNELE9BQU87WUFDQyxLQUFLOztvQkFDVCxJQUFJLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO3dCQUM1QixPQUFNO3FCQUNQO29CQUNELElBQUksMkJBQVUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ3pCLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDakQsTUFBTSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQTtxQkFDbkU7eUJBQU07d0JBQ0wsTUFBTSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO3FCQUMzRDtnQkFDSCxDQUFDO2FBQUE7WUFDRCxRQUFRO2dCQUNOLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELE9BQU8sS0FBVSxDQUFDO1NBQ25CLENBQUE7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQStCO1FBQy9ELElBQUksOEJBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsNEJBQWdCLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtTQUN2QztJQUNILENBQUM7SUFFTyxNQUFNLENBQU8sY0FBYyxDQUFDLE9BQVksRUFBRSxVQUFvQzs7WUFDcEYsSUFBSSx3QkFBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDO29CQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87b0JBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztpQkFDN0IsQ0FBQyxDQUFBO2FBQ0g7UUFDSCxDQUFDO0tBQUE7Q0FDRjtBQS9FRCxvQ0ErRUM7QUFFRCxTQUFTLHNCQUFzQixDQUM3QixhQUF5RCxFQUN6RCxNQUFrQixFQUNsQixLQUFZLEVBQ1osY0FBdUQ7SUFFdkQsSUFBSSxXQUF5QixDQUFBO0lBQzdCLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0IsV0FBVyxHQUFHLEVBQUUsQ0FBQTtLQUNqQjtTQUFNO1FBQ0wsa0RBQWtEO1FBQ2xELFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDN0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxjQUFrQyxDQUFDO1lBQy9FLENBQUMsQ0FBRSxhQUFzQyxDQUFDLGlDQUFpQyxDQUN2RSxjQUFzQyxFQUN0QyxNQUFNLENBQ1AsQ0FBQTtLQUNOO0lBQ0QsT0FBTztRQUNMLFlBQVksRUFBRSxpQkFBTyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQztRQUM1RCxLQUFLLEVBQUUsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7UUFDeEMsT0FBTyxFQUFFO1lBQ1AsV0FBVztTQUNaO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLGNBQXVEO0lBQ2hGLElBQUksU0FBUyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNsQyxPQUFPLElBQUksQ0FBQTtLQUNaO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBhdG9tSWRlIGZyb20gXCJhdG9tLWlkZS1iYXNlXCJcbmltcG9ydCAqIGFzIGxpbnRlciBmcm9tIFwiYXRvbS9saW50ZXJcIlxuaW1wb3J0IExpbnRlclB1c2hWMkFkYXB0ZXIgZnJvbSBcIi4vbGludGVyLXB1c2gtdjItYWRhcHRlclwiXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZGVwcmVjYXRlZCAqL1xuaW1wb3J0IElkZURpYWdub3N0aWNBZGFwdGVyIGZyb20gXCIuL2RpYWdub3N0aWMtYWRhcHRlclwiXG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKVxuaW1wb3J0IENvbnZlcnQgZnJvbSBcIi4uL2NvbnZlcnRcIlxuaW1wb3J0IEFwcGx5RWRpdEFkYXB0ZXIgZnJvbSBcIi4vYXBwbHktZWRpdC1hZGFwdGVyXCJcbmltcG9ydCB7XG4gIENvZGVBY3Rpb24sXG4gIENvZGVBY3Rpb25QYXJhbXMsXG4gIENvbW1hbmQsXG4gIERpYWdub3N0aWMsXG4gIExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgU2VydmVyQ2FwYWJpbGl0aWVzLFxuICBXb3Jrc3BhY2VFZGl0LFxufSBmcm9tIFwiLi4vbGFuZ3VhZ2VjbGllbnRcIlxuaW1wb3J0IHsgUmFuZ2UsIFRleHRFZGl0b3IgfSBmcm9tIFwiYXRvbVwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvZGVBY3Rpb25BZGFwdGVyIHtcbiAgLyoqIEByZXR1cm5zIEEge0Jvb2xlYW59IGluZGljYXRpbmcgdGhpcyBhZGFwdGVyIGNhbiBhZGFwdCB0aGUgc2VydmVyIGJhc2VkIG9uIHRoZSBnaXZlbiBzZXJ2ZXJDYXBhYmlsaXRpZXMuICovXG4gIHB1YmxpYyBzdGF0aWMgY2FuQWRhcHQoc2VydmVyQ2FwYWJpbGl0aWVzOiBTZXJ2ZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2VydmVyQ2FwYWJpbGl0aWVzLmNvZGVBY3Rpb25Qcm92aWRlciA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYzogUmV0cmlldmVzIGNvZGUgYWN0aW9ucyBmb3IgYSBnaXZlbiBlZGl0b3IsIHJhbmdlLCBhbmQgY29udGV4dCAoZGlhZ25vc3RpY3MpLiBUaHJvd3MgYW4gZXJyb3IgaWZcbiAgICogY29kZUFjdGlvblByb3ZpZGVyIGlzIG5vdCBhIHJlZ2lzdGVyZWQgY2FwYWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gQSB7TGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9ufSB0byB0aGUgbGFuZ3VhZ2Ugc2VydmVyIHRoYXQgcHJvdmlkZXMgaGlnaGxpZ2h0cy5cbiAgICogQHBhcmFtIHNlcnZlckNhcGFiaWxpdGllcyBUaGUge1NlcnZlckNhcGFiaWxpdGllc30gb2YgdGhlIGxhbmd1YWdlIHNlcnZlciB0aGF0IHdpbGwgYmUgdXNlZC5cbiAgICogQHBhcmFtIGVkaXRvciBUaGUgQXRvbSB7VGV4dEVkaXRvcn0gY29udGFpbmluZyB0aGUgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSByYW5nZSBUaGUgQXRvbSB7UmFuZ2V9IHRvIGZldGNoIGNvZGUgYWN0aW9ucyBmb3IuXG4gICAqIEBwYXJhbSBsaW50ZXJNZXNzYWdlcyBBbiB7QXJyYXk8bGludGVyJE1lc3NhZ2U+fSB0byBmZXRjaCBjb2RlIGFjdGlvbnMgZm9yLiBUaGlzIGlzIHR5cGljYWxseSBhIGxpc3Qgb2YgbWVzc2FnZXNcbiAgICogICBpbnRlcnNlY3RpbmcgYHJhbmdlYC5cbiAgICogQHJldHVybnMgQSB7UHJvbWlzZX0gb2YgYW4ge0FycmF5fSBvZiB7YXRvbUlkZSRDb2RlQWN0aW9ufXMgdG8gZGlzcGxheS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0Q29kZUFjdGlvbnMoXG4gICAgY29ubmVjdGlvbjogTGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9uLFxuICAgIHNlcnZlckNhcGFiaWxpdGllczogU2VydmVyQ2FwYWJpbGl0aWVzLFxuICAgIGxpbnRlckFkYXB0ZXI6IExpbnRlclB1c2hWMkFkYXB0ZXIgfCBJZGVEaWFnbm9zdGljQWRhcHRlciB8IHVuZGVmaW5lZCxcbiAgICBlZGl0b3I6IFRleHRFZGl0b3IsXG4gICAgcmFuZ2U6IFJhbmdlLFxuICAgIGxpbnRlck1lc3NhZ2VzOiBsaW50ZXIuTWVzc2FnZVtdIHwgYXRvbUlkZS5EaWFnbm9zdGljW10sXG4gICAgZmlsdGVyQWN0aW9uczogKGFjdGlvbnM6IChDb21tYW5kIHwgQ29kZUFjdGlvbilbXSB8IG51bGwpID0+IChDb21tYW5kIHwgQ29kZUFjdGlvbilbXSB8IG51bGwgPSAoYWN0aW9ucykgPT4gYWN0aW9ucyxcbiAgICBvbkFwcGx5OiAoYWN0aW9uOiBDb21tYW5kIHwgQ29kZUFjdGlvbikgPT4gUHJvbWlzZTxib29sZWFuPiA9ICgpID0+IFByb21pc2UucmVzb2x2ZSh0cnVlKVxuICApOiBQcm9taXNlPGF0b21JZGUuQ29kZUFjdGlvbltdPiB7XG4gICAgaWYgKGxpbnRlckFkYXB0ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIGFzc2VydChzZXJ2ZXJDYXBhYmlsaXRpZXMuY29kZUFjdGlvblByb3ZpZGVyLCBcIk11c3QgaGF2ZSB0aGUgdGV4dERvY3VtZW50L2NvZGVBY3Rpb24gY2FwYWJpbGl0eVwiKVxuXG4gICAgY29uc3QgcGFyYW1zID0gY3JlYXRlQ29kZUFjdGlvblBhcmFtcyhsaW50ZXJBZGFwdGVyLCBlZGl0b3IsIHJhbmdlLCBsaW50ZXJNZXNzYWdlcylcbiAgICBjb25zdCBhY3Rpb25zID0gZmlsdGVyQWN0aW9ucyhhd2FpdCBjb25uZWN0aW9uLmNvZGVBY3Rpb24ocGFyYW1zKSlcbiAgICBpZiAoYWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIHJldHVybiBhY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiBDb2RlQWN0aW9uQWRhcHRlci5jcmVhdGVDb2RlQWN0aW9uKGFjdGlvbiwgY29ubmVjdGlvbiwgb25BcHBseSkpXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb2RlQWN0aW9uKFxuICAgIGFjdGlvbjogQ29tbWFuZCB8IENvZGVBY3Rpb24sXG4gICAgY29ubmVjdGlvbjogTGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9uLFxuICAgIG9uQXBwbHk6IChhY3Rpb246IENvbW1hbmQgfCBDb2RlQWN0aW9uKSA9PiBQcm9taXNlPGJvb2xlYW4+XG4gICk6IGF0b21JZGUuQ29kZUFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jIGFwcGx5KCkge1xuICAgICAgICBpZiAoIShhd2FpdCBvbkFwcGx5KGFjdGlvbikpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvZGVBY3Rpb24uaXMoYWN0aW9uKSkge1xuICAgICAgICAgIENvZGVBY3Rpb25BZGFwdGVyLmFwcGx5V29ya3NwYWNlRWRpdChhY3Rpb24uZWRpdClcbiAgICAgICAgICBhd2FpdCBDb2RlQWN0aW9uQWRhcHRlci5leGVjdXRlQ29tbWFuZChhY3Rpb24uY29tbWFuZCwgY29ubmVjdGlvbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBDb2RlQWN0aW9uQWRhcHRlci5leGVjdXRlQ29tbWFuZChhY3Rpb24sIGNvbm5lY3Rpb24pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRUaXRsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFjdGlvbi50aXRsZSlcbiAgICAgIH0sXG4gICAgICBkaXNwb3NlKCk6IHZvaWQge30sXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoV29ya3NwYWNlRWRpdC5pcyhlZGl0KSkge1xuICAgICAgQXBwbHlFZGl0QWRhcHRlci5vbkFwcGx5RWRpdCh7IGVkaXQgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBleGVjdXRlQ29tbWFuZChjb21tYW5kOiBhbnksIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChDb21tYW5kLmlzKGNvbW1hbmQpKSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmV4ZWN1dGVDb21tYW5kKHtcbiAgICAgICAgY29tbWFuZDogY29tbWFuZC5jb21tYW5kLFxuICAgICAgICBhcmd1bWVudHM6IGNvbW1hbmQuYXJndW1lbnRzLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29kZUFjdGlvblBhcmFtcyhcbiAgbGludGVyQWRhcHRlcjogTGludGVyUHVzaFYyQWRhcHRlciB8IElkZURpYWdub3N0aWNBZGFwdGVyLFxuICBlZGl0b3I6IFRleHRFZGl0b3IsXG4gIHJhbmdlOiBSYW5nZSxcbiAgbGludGVyTWVzc2FnZXM6IGxpbnRlci5NZXNzYWdlW10gfCBhdG9tSWRlLkRpYWdub3N0aWNbXVxuKTogQ29kZUFjdGlvblBhcmFtcyB7XG4gIGxldCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdXG4gIGlmIChsaW50ZXJNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBkaWFnbm9zdGljcyA9IFtdXG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyBjb21waWxlIHRpbWUgZGlzcGF0Y2ggdXNpbmcgZnVuY3Rpb24gbmFtZXNcbiAgICBkaWFnbm9zdGljcyA9IGFyZUxpbnRlck1lc3NhZ2VzKGxpbnRlck1lc3NhZ2VzKVxuICAgICAgPyBsaW50ZXJBZGFwdGVyLmdldExTRGlhZ25vc3RpY3NGb3JNZXNzYWdlcyhsaW50ZXJNZXNzYWdlcyBhcyBsaW50ZXIuTWVzc2FnZVtdKVxuICAgICAgOiAobGludGVyQWRhcHRlciBhcyBJZGVEaWFnbm9zdGljQWRhcHRlcikuZ2V0TFNEaWFnbm9zdGljc0ZvcklkZURpYWdub3N0aWNzKFxuICAgICAgICAgIGxpbnRlck1lc3NhZ2VzIGFzIGF0b21JZGUuRGlhZ25vc3RpY1tdLFxuICAgICAgICAgIGVkaXRvclxuICAgICAgICApXG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0ZXh0RG9jdW1lbnQ6IENvbnZlcnQuZWRpdG9yVG9UZXh0RG9jdW1lbnRJZGVudGlmaWVyKGVkaXRvciksXG4gICAgcmFuZ2U6IENvbnZlcnQuYXRvbVJhbmdlVG9MU1JhbmdlKHJhbmdlKSxcbiAgICBjb250ZXh0OiB7XG4gICAgICBkaWFnbm9zdGljcyxcbiAgICB9LFxuICB9XG59XG5cbmZ1bmN0aW9uIGFyZUxpbnRlck1lc3NhZ2VzKGxpbnRlck1lc3NhZ2VzOiBsaW50ZXIuTWVzc2FnZVtdIHwgYXRvbUlkZS5EaWFnbm9zdGljW10pOiBib29sZWFuIHtcbiAgaWYgKFwiZXhjZXJwdFwiIGluIGxpbnRlck1lc3NhZ2VzWzBdKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cbiJdfQ==
\No newline at end of file