atom-languageclient
Version:
Integrate Language Servers with Atom
121 lines • 16.8 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCallHierarchy = exports.canAdapt = void 0;
const convert_1 = require("../convert");
const Utils = require("../utils");
const languageclient_1 = require("../languageclient");
const outline_view_adapter_1 = require("./outline-view-adapter");
const cancellationTokens = new WeakMap();
/**
* Public: Determine whether this adapter can be used to adapt a language server based on the serverCapabilities matrix
* containing a callHierarchyProvider.
*
* @param serverCapabilities The {ServerCapabilities} of the language server to consider.
* @returns A {Boolean} indicating adapter can adapt the server based on the given serverCapabilities.
*/
function canAdapt(serverCapabilities) {
return Boolean(serverCapabilities.callHierarchyProvider);
}
exports.canAdapt = canAdapt;
/**
* Public: Obtain the relationship between calling and called functions hierarchically. Corresponds to lsp's
* CallHierarchyPrepareRequest.
*
* @param connection A {LanguageClientConnection} to the language server that provides highlights.
* @param editor The Atom {TextEditor} containing the text associated with the calling.
* @param position The Atom {Point} associated with the calling.
* @param type The hierarchy type either incoming or outgoing.
* @returns A {Promise} of an {CallHierarchy}.
*/
function getCallHierarchy(connection, editor, point, type) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const results = yield Utils.doWithCancellationToken(connection, cancellationTokens, (cancellationToken) => connection.prepareCallHierarchy({
textDocument: convert_1.default.editorToTextDocumentIdentifier(editor),
position: convert_1.default.pointToPosition(point),
}, cancellationToken));
return {
type,
data: (_a = results === null || results === void 0 ? void 0 : results.map(convertCallHierarchyItem)) !== null && _a !== void 0 ? _a : [],
itemAt(num) {
if (type === "incoming") {
return getIncoming(this.connection, this.data[num].rawData);
}
else {
return getOutgoing(this.connection, this.data[num].rawData);
}
},
connection,
};
});
}
exports.getCallHierarchy = getCallHierarchy;
/** Corresponds to lsp's CallHierarchyIncomingCallsRequest. */
function getIncoming(connection, item) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const results = yield Utils.doWithCancellationToken(connection, cancellationTokens, (_cancellationToken) => connection.callHierarchyIncomingCalls({ item }));
return {
type: "incoming",
data: (_a = results === null || results === void 0 ? void 0 : results.map((res) => convertCallHierarchyItem(res.from))) !== null && _a !== void 0 ? _a : [],
itemAt(num) {
return getIncoming(this.connection, this.data[num].rawData);
},
connection,
};
});
}
/** Corresponds to lsp's CallHierarchyOutgoingCallsRequest. */
function getOutgoing(connection, item) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const results = yield Utils.doWithCancellationToken(connection, cancellationTokens, (_cancellationToken) => connection.callHierarchyOutgoingCalls({ item }));
return {
type: "outgoing",
data: (_a = results === null || results === void 0 ? void 0 : results.map((res) => convertCallHierarchyItem(res.to))) !== null && _a !== void 0 ? _a : [],
itemAt(num) {
return getOutgoing(this.connection, this.data[num].rawData);
},
connection,
};
});
}
function convertCallHierarchyItem(rawData) {
var _a;
return {
path: convert_1.default.uriToPath(rawData.uri),
name: rawData.name,
icon: (_a = outline_view_adapter_1.default.symbolKindToEntityKind(rawData.kind)) !== null && _a !== void 0 ? _a : undefined,
tags: rawData.tags
? [
...rawData.tags.reduce((set, tag) => {
// filter out null and remove duplicates
const entity = symbolTagToEntityKind(tag);
return entity === null ? set : set.add(entity);
}, new Set()),
]
: [],
detail: rawData.detail,
range: convert_1.default.lsRangeToAtomRange(rawData.range),
selectionRange: convert_1.default.lsRangeToAtomRange(rawData.selectionRange),
rawData,
};
}
function symbolTagToEntityKind(symbol) {
switch (symbol) {
case languageclient_1.SymbolTag.Deprecated:
return "deprecated";
default:
return null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1oaWVyYXJjaHktYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9hZGFwdGVycy9jYWxsLWhpZXJhcmNoeS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUNBLHdDQUFnQztBQUNoQyxrQ0FBaUM7QUFDakMsc0RBQTZDO0FBSzdDLGlFQUF1RDtBQUV2RCxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUFxRCxDQUFBO0FBRTNGOzs7Ozs7R0FNRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxrQkFBc0M7SUFDN0QsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUMxRCxDQUFDO0FBRkQsNEJBRUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFzQixnQkFBZ0IsQ0FDcEMsVUFBb0MsRUFDcEMsTUFBa0IsRUFDbEIsS0FBWSxFQUNaLElBQU87OztRQUVQLE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FDeEcsVUFBVSxDQUFDLG9CQUFvQixDQUM3QjtZQUNFLFlBQVksRUFBRSxpQkFBTyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQztZQUM1RCxRQUFRLEVBQUUsaUJBQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1NBQ3pDLEVBQ0QsaUJBQWlCLENBQ2xCLENBQ0YsQ0FBQTtRQUNELE9BQW1DO1lBQ2pDLElBQUk7WUFDSixJQUFJLEVBQUUsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsR0FBRyxDQUFDLHdCQUF3QixDQUFDLG1DQUFJLEVBQUU7WUFDbEQsTUFBTSxDQUFDLEdBQVc7Z0JBQ2hCLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTtvQkFDdkIsT0FBMEMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFV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LEVBQUU7UUFDTixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsS0FBSyxFQUFFLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNoRCxjQUFjLEVBQUUsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQ2xFLE9BQU87S0FDUixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBYztJQUMzQyxRQUFRLE1BQU0sRUFBRTtRQUNkLEtBQUssMEJBQVMsQ0FBQyxVQUFVO1lBQ3ZCLE9BQU8sWUFBWSxDQUFBO1FBQ3JCO1lBQ0UsT0FBTyxJQUFJLENBQUE7S0FDZDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIGF0b21JZGUgZnJvbSBcImF0b20taWRlLWJhc2VcIlxuaW1wb3J0IENvbnZlcnQgZnJvbSBcIi4uL2NvbnZlcnRcIlxuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IFN5bWJvbFRhZyB9IGZyb20gXCIuLi9sYW5ndWFnZWNsaWVudFwiXG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbiwgU2VydmVyQ2FwYWJpbGl0aWVzLCBDYWxsSGllcmFyY2h5SXRlbSB9IGZyb20gXCIuLi9sYW5ndWFnZWNsaWVudFwiXG5pbXBvcnQgdHlwZSB7IENhbmNlbGxhdGlvblRva2VuU291cmNlIH0gZnJvbSBcInZzY29kZS1qc29ucnBjXCJcbmltcG9ydCB0eXBlIHsgUG9pbnQsIFRleHRFZGl0b3IgfSBmcm9tIFwiYXRvbVwiXG5cbmltcG9ydCBPdXRsaW5lVmlld0FkYXB0ZXIgZnJvbSBcIi4vb3V0bGluZS12aWV3LWFkYXB0ZXJcIlxuXG5jb25zdCBjYW5jZWxsYXRpb25Ub2tlbnMgPSBuZXcgV2Vha01hcDxMYW5ndWFnZUNsaWVudENvbm5lY3Rpb24sIENhbmNlbGxhdGlvblRva2VuU291cmNlPigpXG5cbi8qKlxuICogUHVibGljOiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gYWRhcHQgYSBsYW5ndWFnZSBzZXJ2ZXIgYmFzZWQgb24gdGhlIHNlcnZlckNhcGFiaWxpdGllcyBtYXRyaXhcbiAqIGNvbnRhaW5pbmcgYSBjYWxsSGllcmFyY2h5UHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHNlcnZlckNhcGFiaWxpdGllcyBUaGUge1NlcnZlckNhcGFiaWxpdGllc30gb2YgdGhlIGxhbmd1YWdlIHNlcnZlciB0byBjb25zaWRlci5cbiAqIEByZXR1cm5zIEEge0Jvb2xlYW59IGluZGljYXRpbmcgYWRhcHRlciBjYW4gYWRhcHQgdGhlIHNlcnZlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VydmVyQ2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuQWRhcHQoc2VydmVyQ2FwYWJpbGl0aWVzOiBTZXJ2ZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oc2VydmVyQ2FwYWJpbGl0aWVzLmNhbGxIaWVyYXJjaHlQcm92aWRlcilcbn1cblxuLyoqXG4gKiBQdWJsaWM6IE9idGFpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY2FsbGluZyBhbmQgY2FsbGVkIGZ1bmN0aW9ucyBoaWVyYXJjaGljYWxseS4gQ29ycmVzcG9uZHMgdG8gbHNwJ3NcbiAqIENhbGxIaWVyYXJjaHlQcmVwYXJlUmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gY29ubmVjdGlvbiBBIHtMYW5ndWFnZUNsaWVudENvbm5lY3Rpb259IHRvIHRoZSBsYW5ndWFnZSBzZXJ2ZXIgdGhhdCBwcm92aWRlcyBoaWdobGlnaHRzLlxuICogQHBhcmFtIGVkaXRvciBUaGUgQXRvbSB7VGV4dEVkaXRvcn0gY29udGFpbmluZyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcuXG4gKiBAcGFyYW0gcG9zaXRpb24gVGhlIEF0b20ge1BvaW50fSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcuXG4gKiBAcGFyYW0gdHlwZSBUaGUgaGllcmFyY2h5IHR5cGUgZWl0aGVyIGluY29taW5nIG9yIG91dGdvaW5nLlxuICogQHJldHVybnMgQSB7UHJvbWlzZX0gb2YgYW4ge0NhbGxIaWVyYXJjaHl9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FsbEhpZXJhcmNoeTxUIGV4dGVuZHMgYXRvbUlkZS5DYWxsSGllcmFyY2h5VHlwZT4oXG4gIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgZWRpdG9yOiBUZXh0RWRpdG9yLFxuICBwb2ludDogUG9pbnQsXG4gIHR5cGU6IFRcbik6IFByb21pc2U8YXRvbUlkZS5DYWxsSGllcmFyY2h5PFQ+PiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBVdGlscy5kb1dpdGhDYW5jZWxsYXRpb25Ub2tlbihjb25uZWN0aW9uLCBjYW5jZWxsYXRpb25Ub2tlbnMsIChjYW5jZWxsYXRpb25Ub2tlbikgPT5cbiAgICBjb25uZWN0aW9uLnByZXBhcmVDYWxsSGllcmFyY2h5KFxuICAgICAge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IENvbnZlcnQuZWRpdG9yVG9UZXh0RG9jdW1lbnRJZGVudGlmaWVyKGVkaXRvciksXG4gICAgICAgIHBvc2l0aW9uOiBDb252ZXJ0LnBvaW50VG9Qb3NpdGlvbihwb2ludCksXG4gICAgICB9LFxuICAgICAgY2FuY2VsbGF0aW9uVG9rZW5cbiAgICApXG4gIClcbiAgcmV0dXJuIDxDYWxsSGllcmFyY2h5Rm9yQWRhcHRlcjxUPj57XG4gICAgdHlwZSxcbiAgICBkYXRhOiByZXN1bHRzPy5tYXAoY29udmVydENhbGxIaWVyYXJjaHlJdGVtKSA/PyBbXSxcbiAgICBpdGVtQXQobnVtOiBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBcImluY29taW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIDxQcm9taXNlPGF0b21JZGUuQ2FsbEhpZXJhcmNoeTxUPj4+Z2V0SW5jb21pbmcodGhpcy5jb25uZWN0aW9uLCB0aGlzLmRhdGFbbnVtXS5yYXdEYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDxQcm9taXNlPGF0b21JZGUuQ2FsbEhpZXJhcmNoeTxUPj4+Z2V0T3V0Z29pbmcodGhpcy5jb25uZWN0aW9uLCB0aGlzLmRhdGFbbnVtXS5yYXdEYXRhKVxuICAgICAgfVxuICAgIH0sXG4gICAgY29ubmVjdGlvbixcbiAgfVxufVxuXG4vKiogQ29ycmVzcG9uZHMgdG8gbHNwJ3MgQ2FsbEhpZXJhcmNoeUluY29taW5nQ2FsbHNSZXF1ZXN0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0SW5jb21pbmcoXG4gIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgaXRlbTogQ2FsbEhpZXJhcmNoeUl0ZW1cbik6IFByb21pc2U8YXRvbUlkZS5DYWxsSGllcmFyY2h5PFwiaW5jb21pbmdcIj4+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFV0aWxzLmRvV2l0aENhbmNlbGxhdGlvblRva2VuKGNvbm5lY3Rpb24sIGNhbmNlbGxhdGlvblRva2VucywgKF9jYW5jZWxsYXRpb25Ub2tlbikgPT5cbiAgICBjb25uZWN0aW9uLmNhbGxIaWVyYXJjaHlJbmNvbWluZ0NhbGxzKHsgaXRlbSB9KVxuICApXG4gIHJldHVybiA8Q2FsbEhpZXJhcmNoeUZvckFkYXB0ZXI8XCJpbmNvbWluZ1wiPj57XG4gICAgdHlwZTogXCJpbmNvbWluZ1wiLFxuICAgIGRhdGE6IHJlc3VsdHM/Lm1hcCgocmVzKSA9PiBjb252ZXJ0Q2FsbEhpZXJhcmNoeUl0ZW0ocmVzLmZyb20pKSA/PyBbXSxcbiAgICBpdGVtQXQobnVtOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBnZXRJbmNvbWluZyh0aGlzLmNvbm5lY3Rpb24sIHRoaXMuZGF0YVtudW1dLnJhd0RhdGEpXG4gICAgfSxcbiAgICBjb25uZWN0aW9uLFxuICB9XG59XG4vKiogQ29ycmVzcG9uZHMgdG8gbHNwJ3MgQ2FsbEhpZXJhcmNoeU91dGdvaW5nQ2FsbHNSZXF1ZXN0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T3V0Z29pbmcoXG4gIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgaXRlbTogQ2FsbEhpZXJhcmNoeUl0ZW1cbik6IFByb21pc2U8YXRvbUlkZS5DYWxsSGllcmFyY2h5PFwib3V0Z29pbmdcIj4+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFV0aWxzLmRvV2l0aENhbmNlbGxhdGlvblRva2VuKGNvbm5lY3Rpb24sIGNhbmNlbGxhdGlvblRva2VucywgKF9jYW5jZWxsYXRpb25Ub2tlbikgPT5cbiAgICBjb25uZWN0aW9uLmNhbGxIaWVyYXJjaHlPdXRnb2luZ0NhbGxzKHsgaXRlbSB9KVxuICApXG4gIHJldHVybiA8Q2FsbEhpZXJhcmNoeUZvckFkYXB0ZXI8XCJvdXRnb2luZ1wiPj57XG4gICAgdHlwZTogXCJvdXRnb2luZ1wiLFxuICAgIGRhdGE6IHJlc3VsdHM/Lm1hcCgocmVzKSA9PiBjb252ZXJ0Q2FsbEhpZXJhcmNoeUl0ZW0ocmVzLnRvKSkgPz8gW10sXG4gICAgaXRlbUF0KG51bTogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gZ2V0T3V0Z29pbmcodGhpcy5jb25uZWN0aW9uLCB0aGlzLmRhdGFbbnVtXS5yYXdEYXRhKVxuICAgIH0sXG4gICAgY29ubmVjdGlvbixcbiAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q2FsbEhpZXJhcmNoeUl0ZW0ocmF3RGF0YTogQ2FsbEhpZXJhcmNoeUl0ZW0pOiBDYWxsSGllcmFyY2h5SXRlbUZvckFkYXB0ZXIge1xuICByZXR1cm4ge1xuICAgIHBhdGg6IENvbnZlcnQudXJpVG9QYXRoKHJhd0RhdGEudXJpKSxcbiAgICBuYW1lOiByYXdEYXRhLm5hbWUsXG4gICAgaWNvbjogT3V0bGluZVZpZXdBZGFwdGVyLnN5bWJvbEtpbmRUb0VudGl0eUtpbmQocmF3RGF0YS5raW5kKSA/PyB1bmRlZmluZWQsXG4gICAgdGFnczogcmF3RGF0YS50YWdzXG4gICAgICA/IFtcbiAgICAgICAgICAuLi5yYXdEYXRhLnRhZ3MucmVkdWNlKChzZXQsIHRhZykgPT4ge1xuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBudWxsIGFuZCByZW1vdmUgZHVwbGljYXRlc1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gc3ltYm9sVGFnVG9FbnRpdHlLaW5kKHRhZylcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHkgPT09IG51bGwgPyBzZXQgOiBzZXQuYWRkKGVudGl0eSlcbiAgICAgICAgICB9LCBuZXcgU2V0PGF0b21JZGUuU3ltYm9sVGFnS2luZD4oKSksXG4gICAgICAgIF1cbiAgICAgIDogW10sXG4gICAgZGV0YWlsOiByYXdEYXRhLmRldGFpbCxcbiAgICByYW5nZTogQ29udmVydC5sc1JhbmdlVG9BdG9tUmFuZ2UocmF3RGF0YS5yYW5nZSksXG4gICAgc2VsZWN0aW9uUmFuZ2U6IENvbnZlcnQubHNSYW5nZVRvQXRvbVJhbmdlKHJhd0RhdGEuc2VsZWN0aW9uUmFuZ2UpLFxuICAgIHJhd0RhdGEsXG4gIH1cbn1cblxuZnVuY3Rpb24gc3ltYm9sVGFnVG9FbnRpdHlLaW5kKHN5bWJvbDogbnVtYmVyKTogYXRvbUlkZS5TeW1ib2xUYWdLaW5kIHwgbnVsbCB7XG4gIHN3aXRjaCAoc3ltYm9sKSB7XG4gICAgY2FzZSBTeW1ib2xUYWcuRGVwcmVjYXRlZDpcbiAgICAgIHJldHVybiBcImRlcHJlY2F0ZWRcIlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbi8qKiBFeHRlbmQgQ2FsbEhpZXJhcmNoeSB0byBpbmNsdWRlIHByb3BlcnRpZXMgdXNlZCBpbnNpZGUgdGhlIGFkYXB0ZXIgKi9cbmludGVyZmFjZSBDYWxsSGllcmFyY2h5Rm9yQWRhcHRlcjxUIGV4dGVuZHMgYXRvbUlkZS5DYWxsSGllcmFyY2h5VHlwZT4gZXh0ZW5kcyBhdG9tSWRlLkNhbGxIaWVyYXJjaHk8VD4ge1xuICBkYXRhOiBDYWxsSGllcmFyY2h5SXRlbUZvckFkYXB0ZXJbXVxuICBjb25uZWN0aW9uOiBMYW5ndWFnZUNsaWVudENvbm5lY3Rpb25cbn1cblxuLyoqIEV4dGVuZCBDYWxsSGllcmFyY2h5SXRlbSB0byBpbmNsdWRlIHByb3BlcnRpZXMgdXNlZCBpbnNpZGUgdGhlIGFkYXB0ZXIgKi9cbmludGVyZmFjZSBDYWxsSGllcmFyY2h5SXRlbUZvckFkYXB0ZXIgZXh0ZW5kcyBhdG9tSWRlLkNhbGxIaWVyYXJjaHlJdGVtIHtcbiAgcmF3RGF0YTogQ2FsbEhpZXJhcmNoeUl0ZW1cbn1cbiJdfQ==
;