UNPKG

22.8 kBJavaScriptView Raw
1/**
2 * @license
3 * Copyright Google LLC All Rights Reserved.
4 *
5 * Use of this source code is governed by an MIT-style license that can be
6 * found in the LICENSE file at https://angular.io/license
7 */
8(function (factory) {
9 if (typeof module === "object" && typeof module.exports === "object") {
10 var v = factory(require, exports);
11 if (v !== undefined) module.exports = v;
12 }
13 else if (typeof define === "function" && define.amd) {
14 define("@angular/language-service/ivy/display_parts", ["require", "exports", "tslib", "@angular/compiler-cli/src/ngtsc/typecheck/api", "typescript"], factory);
15 }
16})(function (require, exports) {
17 "use strict";
18 Object.defineProperty(exports, "__esModule", { value: true });
19 exports.getTsSymbolDisplayInfo = exports.getDirectiveDisplayInfo = exports.unsafeCastDisplayInfoKindToScriptElementKind = exports.createDisplayParts = exports.getSymbolDisplayInfo = exports.DisplayInfoKind = exports.SYMBOL_TEXT = exports.SYMBOL_SPACE = exports.SYMBOL_PUNC = exports.SYMBOL_INTERFACE = exports.ALIAS_NAME = void 0;
20 var tslib_1 = require("tslib");
21 var api_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/api");
22 var ts = require("typescript");
23 // Reverse mappings of enum would generate strings
24 exports.ALIAS_NAME = ts.SymbolDisplayPartKind[ts.SymbolDisplayPartKind.aliasName];
25 exports.SYMBOL_INTERFACE = ts.SymbolDisplayPartKind[ts.SymbolDisplayPartKind.interfaceName];
26 exports.SYMBOL_PUNC = ts.SymbolDisplayPartKind[ts.SymbolDisplayPartKind.punctuation];
27 exports.SYMBOL_SPACE = ts.SymbolDisplayPartKind[ts.SymbolDisplayPartKind.space];
28 exports.SYMBOL_TEXT = ts.SymbolDisplayPartKind[ts.SymbolDisplayPartKind.text];
29 /**
30 * Label for various kinds of Angular entities for TS display info.
31 */
32 var DisplayInfoKind;
33 (function (DisplayInfoKind) {
34 DisplayInfoKind["ATTRIBUTE"] = "attribute";
35 DisplayInfoKind["COMPONENT"] = "component";
36 DisplayInfoKind["DIRECTIVE"] = "directive";
37 DisplayInfoKind["EVENT"] = "event";
38 DisplayInfoKind["REFERENCE"] = "reference";
39 DisplayInfoKind["ELEMENT"] = "element";
40 DisplayInfoKind["VARIABLE"] = "variable";
41 DisplayInfoKind["PIPE"] = "pipe";
42 DisplayInfoKind["PROPERTY"] = "property";
43 DisplayInfoKind["METHOD"] = "method";
44 DisplayInfoKind["TEMPLATE"] = "template";
45 })(DisplayInfoKind = exports.DisplayInfoKind || (exports.DisplayInfoKind = {}));
46 function getSymbolDisplayInfo(tsLS, typeChecker, symbol) {
47 var kind;
48 if (symbol.kind === api_1.SymbolKind.Reference) {
49 kind = DisplayInfoKind.REFERENCE;
50 }
51 else if (symbol.kind === api_1.SymbolKind.Variable) {
52 kind = DisplayInfoKind.VARIABLE;
53 }
54 else {
55 throw new Error("AssertionError: unexpected symbol kind " + api_1.SymbolKind[symbol.kind]);
56 }
57 var displayParts = createDisplayParts(symbol.declaration.name, kind, /* containerName */ undefined, typeChecker.typeToString(symbol.tsType));
58 var documentation = symbol.kind === api_1.SymbolKind.Reference ?
59 getDocumentationFromTypeDefAtLocation(tsLS, symbol.targetLocation) :
60 getDocumentationFromTypeDefAtLocation(tsLS, symbol.initializerLocation);
61 return {
62 kind: kind,
63 displayParts: displayParts,
64 documentation: documentation,
65 };
66 }
67 exports.getSymbolDisplayInfo = getSymbolDisplayInfo;
68 /**
69 * Construct a compound `ts.SymbolDisplayPart[]` which incorporates the container and type of a
70 * target declaration.
71 * @param name Name of the target
72 * @param kind component, directive, pipe, etc.
73 * @param containerName either the Symbol's container or the NgModule that contains the directive
74 * @param type user-friendly name of the type
75 * @param documentation docstring or comment
76 */
77 function createDisplayParts(name, kind, containerName, type) {
78 var containerDisplayParts = containerName !== undefined ?
79 [
80 { text: containerName, kind: exports.SYMBOL_INTERFACE },
81 { text: '.', kind: exports.SYMBOL_PUNC },
82 ] :
83 [];
84 var typeDisplayParts = type !== undefined ?
85 [
86 { text: ':', kind: exports.SYMBOL_PUNC },
87 { text: ' ', kind: exports.SYMBOL_SPACE },
88 { text: type, kind: exports.SYMBOL_INTERFACE },
89 ] :
90 [];
91 return tslib_1.__spread([
92 { text: '(', kind: exports.SYMBOL_PUNC },
93 { text: kind, kind: exports.SYMBOL_TEXT },
94 { text: ')', kind: exports.SYMBOL_PUNC },
95 { text: ' ', kind: exports.SYMBOL_SPACE }
96 ], containerDisplayParts, [
97 { text: name, kind: exports.SYMBOL_INTERFACE }
98 ], typeDisplayParts);
99 }
100 exports.createDisplayParts = createDisplayParts;
101 /**
102 * Convert a `SymbolDisplayInfoKind` to a `ts.ScriptElementKind` type, allowing it to pass through
103 * TypeScript APIs.
104 *
105 * In practice, this is an "illegal" type cast. Since `ts.ScriptElementKind` is a string, this is
106 * safe to do if TypeScript only uses the value in a string context. Consumers of this conversion
107 * function are responsible for ensuring this is the case.
108 */
109 function unsafeCastDisplayInfoKindToScriptElementKind(kind) {
110 return kind;
111 }
112 exports.unsafeCastDisplayInfoKindToScriptElementKind = unsafeCastDisplayInfoKindToScriptElementKind;
113 function getDocumentationFromTypeDefAtLocation(tsLS, shimLocation) {
114 var _a;
115 var typeDefs = tsLS.getTypeDefinitionAtPosition(shimLocation.shimPath, shimLocation.positionInShimFile);
116 if (typeDefs === undefined || typeDefs.length === 0) {
117 return undefined;
118 }
119 return (_a = tsLS.getQuickInfoAtPosition(typeDefs[0].fileName, typeDefs[0].textSpan.start)) === null || _a === void 0 ? void 0 : _a.documentation;
120 }
121 function getDirectiveDisplayInfo(tsLS, dir) {
122 var _a, _b;
123 var kind = dir.isComponent ? DisplayInfoKind.COMPONENT : DisplayInfoKind.DIRECTIVE;
124 var decl = dir.tsSymbol.declarations.find(ts.isClassDeclaration);
125 if (decl === undefined || decl.name === undefined) {
126 return { kind: kind, displayParts: [], documentation: [] };
127 }
128 var res = tsLS.getQuickInfoAtPosition(decl.getSourceFile().fileName, decl.name.getStart());
129 if (res === undefined) {
130 return { kind: kind, displayParts: [], documentation: [] };
131 }
132 var displayParts = createDisplayParts(dir.tsSymbol.name, kind, (_b = (_a = dir.ngModule) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.text, undefined);
133 return {
134 kind: kind,
135 displayParts: displayParts,
136 documentation: res.documentation,
137 };
138 }
139 exports.getDirectiveDisplayInfo = getDirectiveDisplayInfo;
140 function getTsSymbolDisplayInfo(tsLS, checker, symbol, kind, ownerName) {
141 var decl = symbol.valueDeclaration;
142 if (decl === undefined || (!ts.isPropertyDeclaration(decl) && !ts.isMethodDeclaration(decl)) ||
143 !ts.isIdentifier(decl.name)) {
144 return null;
145 }
146 var res = tsLS.getQuickInfoAtPosition(decl.getSourceFile().fileName, decl.name.getStart());
147 if (res === undefined) {
148 return { kind: kind, displayParts: [], documentation: [] };
149 }
150 var type = checker.getDeclaredTypeOfSymbol(symbol);
151 var typeString = checker.typeToString(type);
152 var displayParts = createDisplayParts(symbol.name, kind, ownerName !== null && ownerName !== void 0 ? ownerName : undefined, typeString);
153 return {
154 kind: kind,
155 displayParts: displayParts,
156 documentation: res.documentation,
157 };
158 }
159 exports.getTsSymbolDisplayInfo = getTsSymbolDisplayInfo;
160});
161//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheV9wYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xhbmd1YWdlLXNlcnZpY2UvaXZ5L2Rpc3BsYXlfcGFydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7OztJQUVILHFFQUFrSjtJQUNsSiwrQkFBaUM7SUFHakMsa0RBQWtEO0lBQ3JDLFFBQUEsVUFBVSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUUsUUFBQSxnQkFBZ0IsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BGLFFBQUEsV0FBVyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0UsUUFBQSxZQUFZLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RSxRQUFBLFdBQVcsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBR25GOztPQUVHO0lBQ0gsSUFBWSxlQVlYO0lBWkQsV0FBWSxlQUFlO1FBQ3pCLDBDQUF1QixDQUFBO1FBQ3ZCLDBDQUF1QixDQUFBO1FBQ3ZCLDBDQUF1QixDQUFBO1FBQ3ZCLGtDQUFlLENBQUE7UUFDZiwwQ0FBdUIsQ0FBQTtRQUN2QixzQ0FBbUIsQ0FBQTtRQUNuQix3Q0FBcUIsQ0FBQTtRQUNyQixnQ0FBYSxDQUFBO1FBQ2Isd0NBQXFCLENBQUE7UUFDckIsb0NBQWlCLENBQUE7UUFDakIsd0NBQXFCLENBQUE7SUFDdkIsQ0FBQyxFQVpXLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVC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QUksRUFBRSxJQUFJLEVBQUUsU0FBUyxhQUFULFNBQVMsY0FBVCxTQUFTLEdBQUksU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRS9GLE9BQU87WUFDTCxJQUFJLE1BQUE7WUFDSixZQUFZLGNBQUE7WUFDWixhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWE7U0FDakMsQ0FBQztJQUNKLENBQUM7SUF2QkQsd0RBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7RGlyZWN0aXZlSW5TY29wZSwgUmVmZXJlbmNlU3ltYm9sLCBTaGltTG9jYXRpb24sIFN5bWJvbCwgU3ltYm9sS2luZCwgVmFyaWFibGVTeW1ib2x9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvdHlwZWNoZWNrL2FwaSc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuXG4vLyBSZXZlcnNlIG1hcHBpbmdzIG9mIGVudW0gd291bGQgZ2VuZXJhdGUgc3RyaW5nc1xuZXhwb3J0IGNvbnN0IEFMSUFTX05BTUUgPSB0cy5TeW1ib2xEaXNwbGF5UGFydEtpbmRbdHMuU3ltYm9sRGlzcGxheVBhcnRLaW5kLmFsaWFzTmFtZV07XG5leHBvcnQgY29uc3QgU1lNQk9MX0lOVEVSRkFDRSA9IHRzLlN5bWJvbERpc3BsYXlQYXJ0S2luZFt0cy5TeW1ib2xEaXNwbGF5UGFydEtpbmQuaW50ZXJmYWNlTmFtZV07XG5leHBvcnQgY29uc3QgU1lNQk9MX1BVTkMgPSB0cy5TeW1ib2xEaXNwbGF5UGFydEtpbmRbdHMuU3ltYm9sRGlzcGxheVBhcnRLaW5kLnB1bmN0dWF0aW9uXTtcbmV4cG9ydCBjb25zdCBTWU1CT0xfU1BBQ0UgPSB0cy5TeW1ib2xEaXNwbGF5UGFydEtpbmRbdHMuU3ltYm9sRGlzcGxheVBhcnRLaW5kLnNwYWNlXTtcbmV4cG9ydCBjb25zdCBTWU1CT0xfVEVYVCA9IHRzLlN5bWJvbERpc3BsYXlQYXJ0S2luZFt0cy5TeW1ib2xEaXNwbGF5UGFydEtpbmQudGV4dF07XG5cblxuLyoqXG4gKiBMYWJlbCBmb3IgdmFyaW91cyBraW5kcyBvZiBBbmd1bGFyIGVudGl0aWVzIGZvciBUUyBkaXNwbGF5IGluZm8uXG4gKi9cbmV4cG9ydCBlbnVtIERpc3BsYXlJbmZvS2luZCB7XG4gIEFUVFJJQlVURSA9ICdhdHRyaWJ1dGUnLFxuICBDT01QT05FTlQgPSAnY29tcG9uZW50JyxcbiAgRElSRUNUSVZFID0gJ2RpcmVjdGl2ZScsXG4gIEVWRU5UID0gJ2V2ZW50JyxcbiAgUkVGRVJFTkNFID0gJ3JlZmVyZW5jZScsXG4gIEVMRU1FTlQgPSAnZWxlbWVudCcsXG4gIFZBUklBQkxFID0gJ3ZhcmlhYmxlJyxcbiAgUElQRSA9ICdwaXBlJyxcbiAgUFJPUEVSVFkgPSAncHJvcGVydHknLFxuICBNRVRIT0QgPSAnbWV0aG9kJyxcbiAgVEVNUExBVEUgPSAndGVtcGxhdGUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc3BsYXlJbmZvIHtcbiAga2luZDogRGlzcGxheUluZm9LaW5kO1xuICBkaXNwbGF5UGFydHM6IHRzLlN5bWJvbERpc3BsYXlQYXJ0W107XG4gIGRvY3VtZW50YXRpb246IHRzLlN5bWJvbERpc3BsYXlQYXJ0W118dW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ltYm9sRGlzcGxheUluZm8oXG4gICAgdHNMUzogdHMuTGFuZ3VhZ2VTZXJ2aWNlLCB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gICAgc3ltYm9sOiBSZWZlcmVuY2VTeW1ib2x8VmFyaWFibGVTeW1ib2wpOiBEaXNwbGF5SW5mbyB7XG4gIGxldCBraW5kOiBEaXNwbGF5SW5mb0tpbmQ7XG4gIGlmIChzeW1ib2wua2luZCA9PT0gU3ltYm9sS2luZC5SZWZlcmVuY2UpIHtcbiAgICBraW5kID0gRGlzcGxheUluZm9LaW5kLlJFRkVSRU5DRTtcbiAgfSBlbHNlIGlmIChzeW1ib2wua2luZCA9PT0gU3ltYm9sS2luZC5WYXJpYWJsZSkge1xuICAgIGtpbmQgPSBEaXNwbGF5SW5mb0tpbmQuVkFSSUFCTEU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXNzZXJ0aW9uRXJyb3I6IHVuZXhwZWN0ZWQgc3ltYm9sIGtpbmQgJHtTeW1ib2xLaW5kWyhzeW1ib2wgYXMgU3ltYm9sKS5raW5kXX1gKTtcbiAgfVxuXG4gIGNvbnN0IGRpc3BsYXlQYXJ0cyA9IGNyZWF0ZURpc3BsYXlQYXJ0cyhcbiAgICAgIHN5bWJvbC5kZWNsYXJhdGlvbi5uYW1lLCBraW5kLCAvKiBjb250YWluZXJOYW1lICovIHVuZGVmaW5lZCxcbiAgICAgIHR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhzeW1ib2wudHNUeXBlKSk7XG4gIGNvbnN0IGRvY3VtZW50YXRpb24gPSBzeW1ib2wua2luZCA9PT0gU3ltYm9sS2luZC5SZWZlcmVuY2UgP1xuICAgICAgZ2V0RG9jdW1lbnRhdGlvbkZyb21UeXBlRGVmQXRMb2NhdGlvbih0c0xTLCBzeW1ib2wudGFyZ2V0TG9jYXRpb24pIDpcbiAgICAgIGdldERvY3VtZW50YXRpb25Gcm9tVHlwZURlZkF0TG9jYXRpb24odHNMUywgc3ltYm9sLmluaXRpYWxpemVyTG9jYXRpb24pO1xuICByZXR1cm4ge1xuICAgIGtpbmQsXG4gICAgZGlzcGxheVBhcnRzLFxuICAgIGRvY3VtZW50YXRpb24sXG4gIH07XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgY29tcG91bmQgYHRzLlN5bWJvbERpc3BsYXlQYXJ0W11gIHdoaWNoIGluY29ycG9yYXRlcyB0aGUgY29udGFpbmVyIGFuZCB0eXBlIG9mIGFcbiAqIHRhcmdldCBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRhcmdldFxuICogQHBhcmFtIGtpbmQgY29tcG9uZW50LCBkaXJlY3RpdmUsIHBpcGUsIGV0Yy5cbiAqIEBwYXJhbSBjb250YWluZXJOYW1lIGVpdGhlciB0aGUgU3ltYm9sJ3MgY29udGFpbmVyIG9yIHRoZSBOZ01vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBkaXJlY3RpdmVcbiAqIEBwYXJhbSB0eXBlIHVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGUgdHlwZVxuICogQHBhcmFtIGRvY3VtZW50YXRpb24gZG9jc3RyaW5nIG9yIGNvbW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpc3BsYXlQYXJ0cyhcbiAgICBuYW1lOiBzdHJpbmcsIGtpbmQ6IERpc3BsYXlJbmZvS2luZCwgY29udGFpbmVyTmFtZTogc3RyaW5nfHVuZGVmaW5lZCxcbiAgICB0eXBlOiBzdHJpbmd8dW5kZWZpbmVkKTogdHMuU3ltYm9sRGlzcGxheVBhcnRbXSB7XG4gIGNvbnN0IGNvbnRhaW5lckRpc3BsYXlQYXJ0cyA9IGNvbnRhaW5lck5hbWUgIT09IHVuZGVmaW5lZCA/XG4gICAgICBbXG4gICAgICAgIHt0ZXh0OiBjb250YWluZXJOYW1lLCBraW5kOiBTWU1CT0xfSU5URVJGQUNFfSxcbiAgICAgICAge3RleHQ6ICcuJywga2luZDogU1lNQk9MX1BVTkN9LFxuICAgICAgXSA6XG4gICAgICBbXTtcblxuICBjb25zdCB0eXBlRGlzcGxheVBhcnRzID0gdHlwZSAhPT0gdW5kZWZpbmVkID9cbiAgICAgIFtcbiAgICAgICAge3RleHQ6ICc6Jywga2luZDogU1lNQk9MX1BVTkN9LFxuICAgICAgICB7dGV4dDogJyAnLCBraW5kOiBTWU1CT0xfU1BBQ0V9LFxuICAgICAgICB7dGV4dDogdHlwZSwga2luZDogU1lNQk9MX0lOVEVSRkFDRX0sXG4gICAgICBdIDpcbiAgICAgIFtdO1xuICByZXR1cm4gW1xuICAgIHt0ZXh0OiAnKCcsIGtpbmQ6IFNZTUJPTF9QVU5DfSxcbiAgICB7dGV4dDoga2luZCwga2luZDogU1lNQk9MX1RFWFR9LFxuICAgIHt0ZXh0OiAnKScsIGtpbmQ6IFNZTUJPTF9QVU5DfSxcbiAgICB7dGV4dDogJyAnLCBraW5kOiBTWU1CT0xfU1BBQ0V9LFxuICAgIC4uLmNvbnRhaW5lckRpc3BsYXlQYXJ0cyxcbiAgICB7dGV4dDogbmFtZSwga2luZDogU1lNQk9MX0lOVEVSRkFDRX0sXG4gICAgLi4udHlwZURpc3BsYXlQYXJ0cyxcbiAgXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgYFN5bWJvbERpc3BsYXlJbmZvS2luZGAgdG8gYSBgdHMuU2NyaXB0RWxlbWVudEtpbmRgIHR5cGUsIGFsbG93aW5nIGl0IHRvIHBhc3MgdGhyb3VnaFxuICogVHlwZVNjcmlwdCBBUElzLlxuICpcbiAqIEluIHByYWN0aWNlLCB0aGlzIGlzIGFuIFwiaWxsZWdhbFwiIHR5cGUgY2FzdC4gU2luY2UgYHRzLlNjcmlwdEVsZW1lbnRLaW5kYCBpcyBhIHN0cmluZywgdGhpcyBpc1xuICogc2FmZSB0byBkbyBpZiBUeXBlU2NyaXB0IG9ubHkgdXNlcyB0aGUgdmFsdWUgaW4gYSBzdHJpbmcgY29udGV4dC4gQ29uc3VtZXJzIG9mIHRoaXMgY29udmVyc2lvblxuICogZnVuY3Rpb24gYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGlzIGlzIHRoZSBjYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlQ2FzdERpc3BsYXlJbmZvS2luZFRvU2NyaXB0RWxlbWVudEtpbmQoa2luZDogRGlzcGxheUluZm9LaW5kKTpcbiAgICB0cy5TY3JpcHRFbGVtZW50S2luZCB7XG4gIHJldHVybiBraW5kIGFzIHN0cmluZyBhcyB0cy5TY3JpcHRFbGVtZW50S2luZDtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRhdGlvbkZyb21UeXBlRGVmQXRMb2NhdGlvbihcbiAgICB0c0xTOiB0cy5MYW5ndWFnZVNlcnZpY2UsIHNoaW1Mb2NhdGlvbjogU2hpbUxvY2F0aW9uKTogdHMuU3ltYm9sRGlzcGxheVBhcnRbXXx1bmRlZmluZWQge1xuICBjb25zdCB0eXBlRGVmcyA9XG4gICAgICB0c0xTLmdldFR5cGVEZWZpbml0aW9uQXRQb3NpdGlvbihzaGltTG9jYXRpb24uc2hpbVBhdGgsIHNoaW1Mb2NhdGlvbi5wb3NpdGlvbkluU2hpbUZpbGUpO1xuICBpZiAodHlwZURlZnMgPT09IHVuZGVmaW5lZCB8fCB0eXBlRGVmcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0c0xTLmdldFF1aWNrSW5mb0F0UG9zaXRpb24odHlwZURlZnNbMF0uZmlsZU5hbWUsIHR5cGVEZWZzWzBdLnRleHRTcGFuLnN0YXJ0KVxuICAgICAgPy5kb2N1bWVudGF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aXZlRGlzcGxheUluZm8oXG4gICAgdHNMUzogdHMuTGFuZ3VhZ2VTZXJ2aWNlLCBkaXI6IERpcmVjdGl2ZUluU2NvcGUpOiBEaXNwbGF5SW5mbyB7XG4gIGNvbnN0IGtpbmQgPSBkaXIuaXNDb21wb25lbnQgPyBEaXNwbGF5SW5mb0tpbmQuQ09NUE9ORU5UIDogRGlzcGxheUluZm9LaW5kLkRJUkVDVElWRTtcbiAgY29uc3QgZGVjbCA9IGRpci50c1N5bWJvbC5kZWNsYXJhdGlvbnMuZmluZCh0cy5pc0NsYXNzRGVjbGFyYXRpb24pO1xuICBpZiAoZGVjbCA9PT0gdW5kZWZpbmVkIHx8IGRlY2wubmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtraW5kLCBkaXNwbGF5UGFydHM6IFtdLCBkb2N1bWVudGF0aW9uOiBbXX07XG4gIH1cblxuICBjb25zdCByZXMgPSB0c0xTLmdldFF1aWNrSW5mb0F0UG9zaXRpb24oZGVjbC5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWUsIGRlY2wubmFtZS5nZXRTdGFydCgpKTtcbiAgaWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtraW5kLCBkaXNwbGF5UGFydHM6IFtdLCBkb2N1bWVudGF0aW9uOiBbXX07XG4gIH1cblxuICBjb25zdCBkaXNwbGF5UGFydHMgPVxuICAgICAgY3JlYXRlRGlzcGxheVBhcnRzKGRpci50c1N5bWJvbC5uYW1lLCBraW5kLCBkaXIubmdNb2R1bGU/Lm5hbWU/LnRleHQsIHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBraW5kLFxuICAgIGRpc3BsYXlQYXJ0cyxcbiAgICBkb2N1bWVudGF0aW9uOiByZXMuZG9jdW1lbnRhdGlvbixcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzU3ltYm9sRGlzcGxheUluZm8oXG4gICAgdHNMUzogdHMuTGFuZ3VhZ2VTZXJ2aWNlLCBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlciwgc3ltYm9sOiB0cy5TeW1ib2wsIGtpbmQ6IERpc3BsYXlJbmZvS2luZCxcbiAgICBvd25lck5hbWU6IHN0cmluZ3xudWxsKTogRGlzcGxheUluZm98bnVsbCB7XG4gIGNvbnN0IGRlY2wgPSBzeW1ib2wudmFsdWVEZWNsYXJhdGlvbjtcbiAgaWYgKGRlY2wgPT09IHVuZGVmaW5lZCB8fCAoIXRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihkZWNsKSAmJiAhdHMuaXNNZXRob2REZWNsYXJhdGlvbihkZWNsKSkgfHxcbiAgICAgICF0cy5pc0lkZW50aWZpZXIoZGVjbC5uYW1lKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJlcyA9IHRzTFMuZ2V0UXVpY2tJbmZvQXRQb3NpdGlvbihkZWNsLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSwgZGVjbC5uYW1lLmdldFN0YXJ0KCkpO1xuICBpZiAocmVzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge2tpbmQsIGRpc3BsYXlQYXJ0czogW10sIGRvY3VtZW50YXRpb246IFtdfTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKHN5bWJvbCk7XG4gIGNvbnN0IHR5cGVTdHJpbmcgPSBjaGVja2VyLnR5cGVUb1N0cmluZyh0eXBlKTtcblxuICBjb25zdCBkaXNwbGF5UGFydHMgPSBjcmVhdGVEaXNwbGF5UGFydHMoc3ltYm9sLm5hbWUsIGtpbmQsIG93bmVyTmFtZSA/PyB1bmRlZmluZWQsIHR5cGVTdHJpbmcpO1xuXG4gIHJldHVybiB7XG4gICAga2luZCxcbiAgICBkaXNwbGF5UGFydHMsXG4gICAgZG9jdW1lbnRhdGlvbjogcmVzLmRvY3VtZW50YXRpb24sXG4gIH07XG59XG4iXX0=
\No newline at end of file