UNPKG

16.8 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 });
12exports.getCallHierarchy = exports.canAdapt = void 0;
13const convert_1 = require("../convert");
14const Utils = require("../utils");
15const languageclient_1 = require("../languageclient");
16const outline_view_adapter_1 = require("./outline-view-adapter");
17const cancellationTokens = new WeakMap();
18/**
19 * Public: Determine whether this adapter can be used to adapt a language server based on the serverCapabilities matrix
20 * containing a callHierarchyProvider.
21 *
22 * @param serverCapabilities The {ServerCapabilities} of the language server to consider.
23 * @returns A {Boolean} indicating adapter can adapt the server based on the given serverCapabilities.
24 */
25function canAdapt(serverCapabilities) {
26 return Boolean(serverCapabilities.callHierarchyProvider);
27}
28exports.canAdapt = canAdapt;
29/**
30 * Public: Obtain the relationship between calling and called functions hierarchically. Corresponds to lsp's
31 * CallHierarchyPrepareRequest.
32 *
33 * @param connection A {LanguageClientConnection} to the language server that provides highlights.
34 * @param editor The Atom {TextEditor} containing the text associated with the calling.
35 * @param position The Atom {Point} associated with the calling.
36 * @param type The hierarchy type either incoming or outgoing.
37 * @returns A {Promise} of an {CallHierarchy}.
38 */
39function getCallHierarchy(connection, editor, point, type) {
40 var _a;
41 return __awaiter(this, void 0, void 0, function* () {
42 const results = yield Utils.doWithCancellationToken(connection, cancellationTokens, (cancellationToken) => connection.prepareCallHierarchy({
43 textDocument: convert_1.default.editorToTextDocumentIdentifier(editor),
44 position: convert_1.default.pointToPosition(point),
45 }, cancellationToken));
46 return {
47 type,
48 data: (_a = results === null || results === void 0 ? void 0 : results.map(convertCallHierarchyItem)) !== null && _a !== void 0 ? _a : [],
49 itemAt(num) {
50 if (type === "incoming") {
51 return getIncoming(this.connection, this.data[num].rawData);
52 }
53 else {
54 return getOutgoing(this.connection, this.data[num].rawData);
55 }
56 },
57 connection,
58 };
59 });
60}
61exports.getCallHierarchy = getCallHierarchy;
62/** Corresponds to lsp's CallHierarchyIncomingCallsRequest. */
63function getIncoming(connection, item) {
64 var _a;
65 return __awaiter(this, void 0, void 0, function* () {
66 const results = yield Utils.doWithCancellationToken(connection, cancellationTokens, (_cancellationToken) => connection.callHierarchyIncomingCalls({ item }));
67 return {
68 type: "incoming",
69 data: (_a = results === null || results === void 0 ? void 0 : results.map((res) => convertCallHierarchyItem(res.from))) !== null && _a !== void 0 ? _a : [],
70 itemAt(num) {
71 return getIncoming(this.connection, this.data[num].rawData);
72 },
73 connection,
74 };
75 });
76}
77/** Corresponds to lsp's CallHierarchyOutgoingCallsRequest. */
78function getOutgoing(connection, item) {
79 var _a;
80 return __awaiter(this, void 0, void 0, function* () {
81 const results = yield Utils.doWithCancellationToken(connection, cancellationTokens, (_cancellationToken) => connection.callHierarchyOutgoingCalls({ item }));
82 return {
83 type: "outgoing",
84 data: (_a = results === null || results === void 0 ? void 0 : results.map((res) => convertCallHierarchyItem(res.to))) !== null && _a !== void 0 ? _a : [],
85 itemAt(num) {
86 return getOutgoing(this.connection, this.data[num].rawData);
87 },
88 connection,
89 };
90 });
91}
92function convertCallHierarchyItem(rawData) {
93 var _a;
94 return {
95 path: convert_1.default.uriToPath(rawData.uri),
96 name: rawData.name,
97 icon: (_a = outline_view_adapter_1.default.symbolKindToEntityKind(rawData.kind)) !== null && _a !== void 0 ? _a : undefined,
98 tags: rawData.tags
99 ? [
100 ...rawData.tags.reduce((set, tag) => {
101 // filter out null and remove duplicates
102 const entity = symbolTagToEntityKind(tag);
103 return entity === null ? set : set.add(entity);
104 }, new Set()),
105 ]
106 : [],
107 detail: rawData.detail,
108 range: convert_1.default.lsRangeToAtomRange(rawData.range),
109 selectionRange: convert_1.default.lsRangeToAtomRange(rawData.selectionRange),
110 rawData,
111 };
112}
113function symbolTagToEntityKind(symbol) {
114 switch (symbol) {
115 case languageclient_1.SymbolTag.Deprecated:
116 return "deprecated";
117 default:
118 return null;
119 }
120}
121//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1oaWVyYXJjaHktYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9hZGFwdGVycy9jYWxsLWhpZXJhcmNoeS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUNBLHdDQUFnQztBQUNoQyxrQ0FBaUM7QUFDakMsc0RBQTZDO0FBSzdDLGlFQUF1RDtBQUV2RCxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUFxRCxDQUFBO0FBRTNGOzs7Ozs7R0FNRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxrQkFBc0M7SUFDN0QsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUMxRCxDQUFDO0FBRkQsNEJBRUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFzQixnQkFBZ0IsQ0FDcEMsVUFBb0MsRUFDcEMsTUFBa0IsRUFDbEIsS0FBWSxFQUNaLElBQU87OztRQUVQLE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FDeEcsVUFBVSxDQUFDLG9CQUFvQixDQUM3QjtZQUNFLFlBQVksRUFBRSxpQkFBTyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQztZQUM1RCxRQUFRLEVBQUUsaUJBQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1NBQ3pDLEVBQ0QsaUJBQWlCLENBQ2xCLENBQ0YsQ0FBQTtRQUNELE9BQW1DO1lBQ2pDLElBQUk7WUFDSixJQUFJLEVBQUUsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsR0FBRyxDQUFDLHdCQUF3QixDQUFDLG1DQUFJLEVBQUU7WUFDbEQsTUFBTSxDQUFDLEdBQVc7Z0JBQ2hCLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTtvQkFDdkIsT0FBMEMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFV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LEVBQUU7UUFDTixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsS0FBSyxFQUFFLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNoRCxjQUFjLEVBQUUsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQ2xFLE9BQU87S0FDUixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBYztJQUMzQyxRQUFRLE1BQU0sRUFBRTtRQUNkLEtBQUssMEJBQVMsQ0FBQyxVQUFVO1lBQ3ZCLE9BQU8sWUFBWSxDQUFBO1FBQ3JCO1lBQ0UsT0FBTyxJQUFJLENBQUE7S0FDZDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIGF0b21JZGUgZnJvbSBcImF0b20taWRlLWJhc2VcIlxuaW1wb3J0IENvbnZlcnQgZnJvbSBcIi4uL2NvbnZlcnRcIlxuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IFN5bWJvbFRhZyB9IGZyb20gXCIuLi9sYW5ndWFnZWNsaWVudFwiXG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbiwgU2VydmVyQ2FwYWJpbGl0aWVzLCBDYWxsSGllcmFyY2h5SXRlbSB9IGZyb20gXCIuLi9sYW5ndWFnZWNsaWVudFwiXG5pbXBvcnQgdHlwZSB7IENhbmNlbGxhdGlvblRva2VuU291cmNlIH0gZnJvbSBcInZzY29kZS1qc29ucnBjXCJcbmltcG9ydCB0eXBlIHsgUG9pbnQsIFRleHRFZGl0b3IgfSBmcm9tIFwiYXRvbVwiXG5cbmltcG9ydCBPdXRsaW5lVmlld0FkYXB0ZXIgZnJvbSBcIi4vb3V0bGluZS12aWV3LWFkYXB0ZXJcIlxuXG5jb25zdCBjYW5jZWxsYXRpb25Ub2tlbnMgPSBuZXcgV2Vha01hcDxMYW5ndWFnZUNsaWVudENvbm5lY3Rpb24sIENhbmNlbGxhdGlvblRva2VuU291cmNlPigpXG5cbi8qKlxuICogUHVibGljOiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gYWRhcHQgYSBsYW5ndWFnZSBzZXJ2ZXIgYmFzZWQgb24gdGhlIHNlcnZlckNhcGFiaWxpdGllcyBtYXRyaXhcbiAqIGNvbnRhaW5pbmcgYSBjYWxsSGllcmFyY2h5UHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHNlcnZlckNhcGFiaWxpdGllcyBUaGUge1NlcnZlckNhcGFiaWxpdGllc30gb2YgdGhlIGxhbmd1YWdlIHNlcnZlciB0byBjb25zaWRlci5cbiAqIEByZXR1cm5zIEEge0Jvb2xlYW59IGluZGljYXRpbmcgYWRhcHRlciBjYW4gYWRhcHQgdGhlIHNlcnZlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VydmVyQ2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuQWRhcHQoc2VydmVyQ2FwYWJpbGl0aWVzOiBTZXJ2ZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oc2VydmVyQ2FwYWJpbGl0aWVzLmNhbGxIaWVyYXJjaHlQcm92aWRlcilcbn1cblxuLyoqXG4gKiBQdWJsaWM6IE9idGFpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY2FsbGluZyBhbmQgY2FsbGVkIGZ1bmN0aW9ucyBoaWVyYXJjaGljYWxseS4gQ29ycmVzcG9uZHMgdG8gbHNwJ3NcbiAqIENhbGxIaWVyYXJjaHlQcmVwYXJlUmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gY29ubmVjdGlvbiBBIHtMYW5ndWFnZUNsaWVudENvbm5lY3Rpb259IHRvIHRoZSBsYW5ndWFnZSBzZXJ2ZXIgdGhhdCBwcm92aWRlcyBoaWdobGlnaHRzLlxuICogQHBhcmFtIGVkaXRvciBUaGUgQXRvbSB7VGV4dEVkaXRvcn0gY29udGFpbmluZyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcuXG4gKiBAcGFyYW0gcG9zaXRpb24gVGhlIEF0b20ge1BvaW50fSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcuXG4gKiBAcGFyYW0gdHlwZSBUaGUgaGllcmFyY2h5IHR5cGUgZWl0aGVyIGluY29taW5nIG9yIG91dGdvaW5nLlxuICogQHJldHVybnMgQSB7UHJvbWlzZX0gb2YgYW4ge0NhbGxIaWVyYXJjaHl9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FsbEhpZXJhcmNoeTxUIGV4dGVuZHMgYXRvbUlkZS5DYWxsSGllcmFyY2h5VHlwZT4oXG4gIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgZWRpdG9yOiBUZXh0RWRpdG9yLFxuICBwb2ludDogUG9pbnQsXG4gIHR5cGU6IFRcbik6IFByb21pc2U8YXRvbUlkZS5DYWxsSGllcmFyY2h5PFQ+PiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBVdGlscy5kb1dpdGhDYW5jZWxsYXRpb25Ub2tlbihjb25uZWN0aW9uLCBjYW5jZWxsYXRpb25Ub2tlbnMsIChjYW5jZWxsYXRpb25Ub2tlbikgPT5cbiAgICBjb25uZWN0aW9uLnByZXBhcmVDYWxsSGllcmFyY2h5KFxuICAgICAge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IENvbnZlcnQuZWRpdG9yVG9UZXh0RG9jdW1lbnRJZGVudGlmaWVyKGVkaXRvciksXG4gICAgICAgIHBvc2l0aW9uOiBDb252ZXJ0LnBvaW50VG9Qb3NpdGlvbihwb2ludCksXG4gICAgICB9LFxuICAgICAgY2FuY2VsbGF0aW9uVG9rZW5cbiAgICApXG4gIClcbiAgcmV0dXJuIDxDYWxsSGllcmFyY2h5Rm9yQWRhcHRlcjxUPj57XG4gICAgdHlwZSxcbiAgICBkYXRhOiByZXN1bHRzPy5tYXAoY29udmVydENhbGxIaWVyYXJjaHlJdGVtKSA/PyBbXSxcbiAgICBpdGVtQXQobnVtOiBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBcImluY29taW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIDxQcm9taXNlPGF0b21JZGUuQ2FsbEhpZXJhcmNoeTxUPj4+Z2V0SW5jb21pbmcodGhpcy5jb25uZWN0aW9uLCB0aGlzLmRhdGFbbnVtXS5yYXdEYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDxQcm9taXNlPGF0b21JZGUuQ2FsbEhpZXJhcmNoeTxUPj4+Z2V0T3V0Z29pbmcodGhpcy5jb25uZWN0aW9uLCB0aGlzLmRhdGFbbnVtXS5yYXdEYXRhKVxuICAgICAgfVxuICAgIH0sXG4gICAgY29ubmVjdGlvbixcbiAgfVxufVxuXG4vKiogQ29ycmVzcG9uZHMgdG8gbHNwJ3MgQ2FsbEhpZXJhcmNoeUluY29taW5nQ2FsbHNSZXF1ZXN0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0SW5jb21pbmcoXG4gIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgaXRlbTogQ2FsbEhpZXJhcmNoeUl0ZW1cbik6IFByb21pc2U8YXRvbUlkZS5DYWxsSGllcmFyY2h5PFwiaW5jb21pbmdcIj4+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFV0aWxzLmRvV2l0aENhbmNlbGxhdGlvblRva2VuKGNvbm5lY3Rpb24sIGNhbmNlbGxhdGlvblRva2VucywgKF9jYW5jZWxsYXRpb25Ub2tlbikgPT5cbiAgICBjb25uZWN0aW9uLmNhbGxIaWVyYXJjaHlJbmNvbWluZ0NhbGxzKHsgaXRlbSB9KVxuICApXG4gIHJldHVybiA8Q2FsbEhpZXJhcmNoeUZvckFkYXB0ZXI8XCJpbmNvbWluZ1wiPj57XG4gICAgdHlwZTogXCJpbmNvbWluZ1wiLFxuICAgIGRhdGE6IHJlc3VsdHM/Lm1hcCgocmVzKSA9PiBjb252ZXJ0Q2FsbEhpZXJhcmNoeUl0ZW0ocmVzLmZyb20pKSA/PyBbXSxcbiAgICBpdGVtQXQobnVtOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBnZXRJbmNvbWluZyh0aGlzLmNvbm5lY3Rpb24sIHRoaXMuZGF0YVtudW1dLnJhd0RhdGEpXG4gICAgfSxcbiAgICBjb25uZWN0aW9uLFxuICB9XG59XG4vKiogQ29ycmVzcG9uZHMgdG8gbHNwJ3MgQ2FsbEhpZXJhcmNoeU91dGdvaW5nQ2FsbHNSZXF1ZXN0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T3V0Z29pbmcoXG4gIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgaXRlbTogQ2FsbEhpZXJhcmNoeUl0ZW1cbik6IFByb21pc2U8YXRvbUlkZS5DYWxsSGllcmFyY2h5PFwib3V0Z29pbmdcIj4+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFV0aWxzLmRvV2l0aENhbmNlbGxhdGlvblRva2VuKGNvbm5lY3Rpb24sIGNhbmNlbGxhdGlvblRva2VucywgKF9jYW5jZWxsYXRpb25Ub2tlbikgPT5cbiAgICBjb25uZWN0aW9uLmNhbGxIaWVyYXJjaHlPdXRnb2luZ0NhbGxzKHsgaXRlbSB9KVxuICApXG4gIHJldHVybiA8Q2FsbEhpZXJhcmNoeUZvckFkYXB0ZXI8XCJvdXRnb2luZ1wiPj57XG4gICAgdHlwZTogXCJvdXRnb2luZ1wiLFxuICAgIGRhdGE6IHJlc3VsdHM/Lm1hcCgocmVzKSA9PiBjb252ZXJ0Q2FsbEhpZXJhcmNoeUl0ZW0ocmVzLnRvKSkgPz8gW10sXG4gICAgaXRlbUF0KG51bTogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gZ2V0T3V0Z29pbmcodGhpcy5jb25uZWN0aW9uLCB0aGlzLmRhdGFbbnVtXS5yYXdEYXRhKVxuICAgIH0sXG4gICAgY29ubmVjdGlvbixcbiAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q2FsbEhpZXJhcmNoeUl0ZW0ocmF3RGF0YTogQ2FsbEhpZXJhcmNoeUl0ZW0pOiBDYWxsSGllcmFyY2h5SXRlbUZvckFkYXB0ZXIge1xuICByZXR1cm4ge1xuICAgIHBhdGg6IENvbnZlcnQudXJpVG9QYXRoKHJhd0RhdGEudXJpKSxcbiAgICBuYW1lOiByYXdEYXRhLm5hbWUsXG4gICAgaWNvbjogT3V0bGluZVZpZXdBZGFwdGVyLnN5bWJvbEtpbmRUb0VudGl0eUtpbmQocmF3RGF0YS5raW5kKSA/PyB1bmRlZmluZWQsXG4gICAgdGFnczogcmF3RGF0YS50YWdzXG4gICAgICA/IFtcbiAgICAgICAgICAuLi5yYXdEYXRhLnRhZ3MucmVkdWNlKChzZXQsIHRhZykgPT4ge1xuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBudWxsIGFuZCByZW1vdmUgZHVwbGljYXRlc1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gc3ltYm9sVGFnVG9FbnRpdHlLaW5kKHRhZylcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHkgPT09IG51bGwgPyBzZXQgOiBzZXQuYWRkKGVudGl0eSlcbiAgICAgICAgICB9LCBuZXcgU2V0PGF0b21JZGUuU3ltYm9sVGFnS2luZD4oKSksXG4gICAgICAgIF1cbiAgICAgIDogW10sXG4gICAgZGV0YWlsOiByYXdEYXRhLmRldGFpbCxcbiAgICByYW5nZTogQ29udmVydC5sc1JhbmdlVG9BdG9tUmFuZ2UocmF3RGF0YS5yYW5nZSksXG4gICAgc2VsZWN0aW9uUmFuZ2U6IENvbnZlcnQubHNSYW5nZVRvQXRvbVJhbmdlKHJhd0RhdGEuc2VsZWN0aW9uUmFuZ2UpLFxuICAgIHJhd0RhdGEsXG4gIH1cbn1cblxuZnVuY3Rpb24gc3ltYm9sVGFnVG9FbnRpdHlLaW5kKHN5bWJvbDogbnVtYmVyKTogYXRvbUlkZS5TeW1ib2xUYWdLaW5kIHwgbnVsbCB7XG4gIHN3aXRjaCAoc3ltYm9sKSB7XG4gICAgY2FzZSBTeW1ib2xUYWcuRGVwcmVjYXRlZDpcbiAgICAgIHJldHVybiBcImRlcHJlY2F0ZWRcIlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbi8qKiBFeHRlbmQgQ2FsbEhpZXJhcmNoeSB0byBpbmNsdWRlIHByb3BlcnRpZXMgdXNlZCBpbnNpZGUgdGhlIGFkYXB0ZXIgKi9cbmludGVyZmFjZSBDYWxsSGllcmFyY2h5Rm9yQWRhcHRlcjxUIGV4dGVuZHMgYXRvbUlkZS5DYWxsSGllcmFyY2h5VHlwZT4gZXh0ZW5kcyBhdG9tSWRlLkNhbGxIaWVyYXJjaHk8VD4ge1xuICBkYXRhOiBDYWxsSGllcmFyY2h5SXRlbUZvckFkYXB0ZXJbXVxuICBjb25uZWN0aW9uOiBMYW5ndWFnZUNsaWVudENvbm5lY3Rpb25cbn1cblxuLyoqIEV4dGVuZCBDYWxsSGllcmFyY2h5SXRlbSB0byBpbmNsdWRlIHByb3BlcnRpZXMgdXNlZCBpbnNpZGUgdGhlIGFkYXB0ZXIgKi9cbmludGVyZmFjZSBDYWxsSGllcmFyY2h5SXRlbUZvckFkYXB0ZXIgZXh0ZW5kcyBhdG9tSWRlLkNhbGxIaWVyYXJjaHlJdGVtIHtcbiAgcmF3RGF0YTogQ2FsbEhpZXJhcmNoeUl0ZW1cbn1cbiJdfQ==
\No newline at end of file