1 | import _ from 'lodash';
|
2 | import ts from 'typescript';
|
3 | import { heritage, modifier, overload, parametered } from './base';
|
4 | import * as declaration from './declaration';
|
5 | import * as node_ from './node';
|
6 | import * as reference from './reference';
|
7 | import * as symbol_ from './symbol';
|
8 | import * as type_ from './type_';
|
9 | import * as utils from './utils';
|
10 | export function isClassProperty(node) {
|
11 | return ts.isPropertyDeclaration(node) || ts.isGetAccessorDeclaration(node) || ts.isSetAccessorDeclaration(node);
|
12 | }
|
13 | export function isClassInstanceProperty(node) {
|
14 | return (isClassProperty(node) || ts.isParameterPropertyDeclaration(node)) && !modifier.isStatic(node);
|
15 | }
|
16 | export function isClassInstanceMember(node) {
|
17 | return (ts.isMethodDeclaration(node) || isClassInstanceProperty(node)) && !modifier.isStatic(node);
|
18 | }
|
19 | export function isClassStaticProperty(node) {
|
20 | return (ts.isMethodDeclaration(node) || isClassProperty(node)) && modifier.isStatic(node);
|
21 | }
|
22 | export function isClassStaticMember(node) {
|
23 | return (ts.isMethodDeclaration(node) || isClassProperty(node)) && modifier.isStatic(node);
|
24 | }
|
25 | export function isClassMember(node) {
|
26 | return isClassInstanceMember(node) || isClassStaticMember(node);
|
27 | }
|
28 | export function getExtends(node) {
|
29 | const extendsClause = heritage.getHeritageClauseByKind(node, ts.SyntaxKind.ExtendsKeyword);
|
30 | if (extendsClause === undefined) {
|
31 | return undefined;
|
32 | }
|
33 | const typeNodes = heritage.getTypeNodes(extendsClause);
|
34 | return typeNodes.length === 0 ? undefined : typeNodes[0];
|
35 | }
|
36 | export function getExtendsOrThrow(node) {
|
37 | return utils.throwIfNullOrUndefined(getExtends(node), 'extends expression');
|
38 | }
|
39 | export function getImplements(node) {
|
40 | const implementsClause = heritage.getHeritageClauseByKind(node, ts.SyntaxKind.ImplementsKeyword);
|
41 | if (implementsClause === undefined) {
|
42 | return undefined;
|
43 | }
|
44 | return heritage.getTypeNodes(implementsClause);
|
45 | }
|
46 | export function getImplementsArray(node) {
|
47 | return utils.getArray(getImplements(node));
|
48 | }
|
49 | export function getMembers(node) {
|
50 | const members = [...node.members];
|
51 | const implementationCtors = members.filter(ts.isConstructorDeclaration).filter((c) => overload.isImplementation(c));
|
52 | for (const ctor of implementationCtors) {
|
53 | let insertIndex = members.indexOf(ctor) + 1;
|
54 | for (const param of parametered.getParameters(ctor)) {
|
55 | if (ts.isParameterPropertyDeclaration(param)) {
|
56 | members.splice(insertIndex, 0, param);
|
57 | insertIndex += 1;
|
58 | }
|
59 | }
|
60 | }
|
61 | return members.filter(isClassMember);
|
62 | }
|
63 | export function getConcreteMembers(node) {
|
64 | return declaration.isAmbient(node)
|
65 | ? []
|
66 | : getMembers(node).filter((member) => {
|
67 | if (ts.isMethodDeclaration(member)) {
|
68 | return overload.isImplementation(member);
|
69 | }
|
70 | return true;
|
71 | });
|
72 | }
|
73 | export function getInstanceProperties(node) {
|
74 | return getMembers(node).filter(isClassInstanceProperty);
|
75 | }
|
76 | export function getInstanceMembers(node) {
|
77 | return getMembers(node).filter(isClassInstanceMember);
|
78 | }
|
79 | export function getInstanceMethods(node) {
|
80 | return getInstanceMembers(node).filter(ts.isMethodDeclaration);
|
81 | }
|
82 | export function getMethods(node) {
|
83 | return getMembers(node).filter(ts.isMethodDeclaration);
|
84 | }
|
85 | export function getSetAccessors(node) {
|
86 | return getMembers(node).filter(ts.isSetAccessor);
|
87 | }
|
88 | export function getInstanceMethod(node, name) {
|
89 | return getInstanceMethods(node).find((method) => node_.getName(method) === name);
|
90 | }
|
91 | export function getConcreteInstanceProperties(node) {
|
92 | return getConcreteMembers(node).filter(isClassInstanceProperty);
|
93 | }
|
94 | export function getConcreteInstanceMembers(node) {
|
95 | return getConcreteMembers(node).filter(isClassInstanceMember);
|
96 | }
|
97 | export function getConcreteInstanceMethods(node) {
|
98 | return getConcreteInstanceMembers(node).filter(ts.isMethodDeclaration);
|
99 | }
|
100 | export function getStaticProperties(node) {
|
101 | return getMembers(node).filter(isClassStaticProperty);
|
102 | }
|
103 | export function getStaticMembers(node) {
|
104 | return getMembers(node).filter(isClassStaticMember);
|
105 | }
|
106 | export function getConcreteStaticProperties(node) {
|
107 | return getConcreteMembers(node).filter(isClassStaticProperty);
|
108 | }
|
109 | export function getConcreteStaticMembers(node) {
|
110 | return getConcreteMembers(node).filter(isClassStaticMember);
|
111 | }
|
112 | export function getConcreteStaticMethods(node) {
|
113 | return getConcreteStaticMembers(node).filter(ts.isMethodDeclaration);
|
114 | }
|
115 | export function getConstructors(node) {
|
116 | return node.members.filter(ts.isConstructorDeclaration);
|
117 | }
|
118 | export function getConcreteConstructor(node) {
|
119 | return getConstructors(node).find((ctor) => overload.isImplementation(ctor));
|
120 | }
|
121 | export function getFirstConcreteConstructor(typeChecker, node) {
|
122 | const ctor = getConcreteConstructor(node);
|
123 | if (ctor !== undefined) {
|
124 | return ctor;
|
125 | }
|
126 | const baseClass = getBaseClass(typeChecker, node);
|
127 | if (baseClass === undefined) {
|
128 | return undefined;
|
129 | }
|
130 | return getFirstConcreteConstructor(typeChecker, baseClass);
|
131 | }
|
132 | function getDerivedClassesWorker(program, languageService, node, seen = new Set()) {
|
133 | if (seen.has(node)) {
|
134 | return [];
|
135 | }
|
136 | return reference
|
137 | .findReferencesAsNodes(program, languageService, node)
|
138 | .reduce((acc, ref) => {
|
139 | const parent = node_.getParent(ref);
|
140 | if (parent === undefined) {
|
141 | return acc;
|
142 | }
|
143 | const clause = node_.getParent(parent);
|
144 | if (clause === undefined || !ts.isHeritageClause(clause) || !heritage.isExtends(clause)) {
|
145 | return acc;
|
146 | }
|
147 | const derived = node_.getFirstAncestorByKindOrThrow(clause, ts.SyntaxKind.ClassDeclaration);
|
148 | return acc.concat(getDerivedClassesWorker(program, languageService, derived, seen));
|
149 | }, [])
|
150 | .concat([node]);
|
151 | }
|
152 | export function getDerivedClasses(program, languageService, node) {
|
153 | const result = getDerivedClassesWorker(program, languageService, node);
|
154 | return result.filter((value) => value !== node);
|
155 | }
|
156 | function getImplementorsWorker(program, languageService, node, seen = new Set()) {
|
157 | if (seen.has(node)) {
|
158 | return [];
|
159 | }
|
160 | return reference
|
161 | .findReferencesAsNodes(program, languageService, node)
|
162 | .reduce((acc, ref) => {
|
163 | const parent = node_.getParent(ref);
|
164 | if (parent === undefined) {
|
165 | return acc;
|
166 | }
|
167 | const clause = node_.getParent(parent);
|
168 | if (clause === undefined ||
|
169 | !ts.isHeritageClause(clause) ||
|
170 | (!heritage.isImplements(clause) && !heritage.isExtends(clause))) {
|
171 | return acc;
|
172 | }
|
173 | let derived = node_.getFirstAncestorByKind(clause, ts.SyntaxKind.ClassDeclaration);
|
174 | if (derived === undefined) {
|
175 | derived = node_.getFirstAncestorByKindOrThrow(clause, ts.SyntaxKind.InterfaceDeclaration);
|
176 | }
|
177 | return acc.concat(getImplementorsWorker(program, languageService, derived, seen));
|
178 | }, [])
|
179 | .concat(ts.isClassDeclaration(node) ? [node] : []);
|
180 | }
|
181 | export function getImplementors(program, languageService, node) {
|
182 | return getImplementorsWorker(program, languageService, node);
|
183 | }
|
184 | function getExtendorsWorker(program, languageService, node, seen = new Set()) {
|
185 | if (seen.has(node)) {
|
186 | return [];
|
187 | }
|
188 | return reference
|
189 | .findReferencesAsNodes(program, languageService, node)
|
190 | .reduce((acc, ref) => {
|
191 | const parent = node_.getParent(ref);
|
192 | if (parent === undefined) {
|
193 | return acc;
|
194 | }
|
195 | const clause = node_.getParent(parent);
|
196 | if (clause === undefined || !ts.isHeritageClause(clause) || !heritage.isExtends(clause)) {
|
197 | return acc;
|
198 | }
|
199 | const derived = node_.getFirstAncestorByTestOrThrow(clause, ts.isClassDeclaration);
|
200 | return acc.concat(getImplementorsWorker(program, languageService, derived, seen));
|
201 | }, [])
|
202 | .concat(ts.isClassDeclaration(node) ? [node] : []);
|
203 | }
|
204 | export function getExtendors(program, languageService, node) {
|
205 | return getExtendorsWorker(program, languageService, node);
|
206 | }
|
207 | export function getBaseTypes(typeChecker, node) {
|
208 | return type_.getBaseTypesArray(type_.getType(typeChecker, node));
|
209 | }
|
210 | export function getBaseTypesFlattened(typeChecker, node) {
|
211 | function getBaseTypesWorker(type) {
|
212 | if (type_.isIntersection(type)) {
|
213 | return _.flatten(type_.getIntersectionTypesArray(type).map(getBaseTypesWorker));
|
214 | }
|
215 | const baseTypes = type_.getBaseTypesArray(type);
|
216 | return [type].concat(_.flatten(baseTypes.map(getBaseTypesWorker)));
|
217 | }
|
218 | return _.flatten(getBaseTypes(typeChecker, node).map(getBaseTypesWorker));
|
219 | }
|
220 | export function getBaseClasses(typeChecker, node) {
|
221 | const baseTypes = getBaseTypesFlattened(typeChecker, node);
|
222 | return baseTypes
|
223 | .map((type) => type_.getSymbol(type))
|
224 | .filter(utils.notNull)
|
225 | .map((symbol) => symbol_.getDeclarations(symbol))
|
226 | .reduce((a, b) => a.concat(b), [])
|
227 | .filter(ts.isClassDeclaration);
|
228 | }
|
229 | export function getBaseClass(typeChecker, node) {
|
230 | const declarations = getBaseClasses(typeChecker, node);
|
231 | return declarations.length === 1 ? declarations[0] : undefined;
|
232 | }
|
233 |
|
234 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IGhlcml0YWdlLCBtb2RpZmllciwgb3ZlcmxvYWQsIHBhcmFtZXRlcmVkIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIGRlY2xhcmF0aW9uIGZyb20gJy4vZGVjbGFyYXRpb24nO1xuaW1wb3J0ICogYXMgbm9kZV8gZnJvbSAnLi9ub2RlJztcbmltcG9ydCAqIGFzIHJlZmVyZW5jZSBmcm9tICcuL3JlZmVyZW5jZSc7XG5pbXBvcnQgKiBhcyBzeW1ib2xfIGZyb20gJy4vc3ltYm9sJztcbmltcG9ydCAqIGFzIHR5cGVfIGZyb20gJy4vdHlwZV8nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIENsYXNzUHJvcGVydHlUeXBlID0gdHMuUHJvcGVydHlEZWNsYXJhdGlvbiB8IHRzLkdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCB0cy5TZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcm9wZXJ0eShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc1Byb3BlcnR5VHlwZSB7XG4gIHJldHVybiB0cy5pc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgdHMuaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKTtcbn1cblxuZXhwb3J0IHR5cGUgQ2xhc3NJbnN0YW5jZVByb3BlcnR5VHlwZSA9IENsYXNzUHJvcGVydHlUeXBlIHwgdHMuUGFyYW1ldGVyUHJvcGVydHlEZWNsYXJhdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBpc0NsYXNzSW5zdGFuY2VQcm9wZXJ0eShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc0luc3RhbmNlUHJvcGVydHlUeXBlIHtcbiAgcmV0dXJuIChpc0NsYXNzUHJvcGVydHkobm9kZSkgfHwgdHMuaXNQYXJhbWV0ZXJQcm9wZXJ0eURlY2xhcmF0aW9uKG5vZGUpKSAmJiAhbW9kaWZpZXIuaXNTdGF0aWMobm9kZSk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzSW5zdGFuY2VNZW1iZXJUeXBlID0gdHMuTWV0aG9kRGVjbGFyYXRpb24gfCBDbGFzc0luc3RhbmNlUHJvcGVydHlUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NJbnN0YW5jZU1lbWJlcihub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc0luc3RhbmNlTWVtYmVyVHlwZSB7XG4gIHJldHVybiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc0NsYXNzSW5zdGFuY2VQcm9wZXJ0eShub2RlKSkgJiYgIW1vZGlmaWVyLmlzU3RhdGljKG5vZGUpO1xufVxuXG5leHBvcnQgdHlwZSBDbGFzc1N0YXRpY1Byb3BlcnR5VHlwZSA9IENsYXNzUHJvcGVydHlUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NTdGF0aWNQcm9wZXJ0eShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc1N0YXRpY1Byb3BlcnR5VHlwZSB7XG4gIHJldHVybiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc0NsYXNzUHJvcGVydHkobm9kZSkpICYmIG1vZGlmaWVyLmlzU3RhdGljKG5vZGUpO1xufVxuXG5leHBvcnQgdHlwZSBDbGFzc1N0YXRpY01lbWJlclR5cGUgPSB0cy5NZXRob2REZWNsYXJhdGlvbiB8IENsYXNzU3RhdGljUHJvcGVydHlUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NTdGF0aWNNZW1iZXIobm9kZTogdHMuTm9kZSk6IG5vZGUgaXMgQ2xhc3NTdGF0aWNNZW1iZXJUeXBlIHtcbiAgcmV0dXJuICh0cy5pc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzQ2xhc3NQcm9wZXJ0eShub2RlKSkgJiYgbW9kaWZpZXIuaXNTdGF0aWMobm9kZSk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzTWVtYmVyVHlwZSA9IENsYXNzSW5zdGFuY2VNZW1iZXJUeXBlIHwgQ2xhc3NTdGF0aWNNZW1iZXJUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NNZW1iZXIobm9kZTogdHMuTm9kZSk6IG5vZGUgaXMgQ2xhc3NNZW1iZXJUeXBlIHtcbiAgcmV0dXJuIGlzQ2xhc3NJbnN0YW5jZU1lbWJlcihub2RlKSB8fCBpc0NsYXNzU3RhdGljTWVtYmVyKG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5kcyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogdHMuRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXh0ZW5kc0NsYXVzZSA9IGhlcml0YWdlLmdldEhlcml0YWdlQ2xhdXNlQnlLaW5kKG5vZGUsIHRzLlN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpO1xuICBpZiAoZXh0ZW5kc0NsYXVzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHR5cGVOb2RlcyA9IGhlcml0YWdlLmdldFR5cGVOb2RlcyhleHRlbmRzQ2xhdXNlKTtcblxuICByZXR1cm4gdHlwZU5vZGVzLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHR5cGVOb2Rlc1swXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuZHNPclRocm93KG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiB0cy5FeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMge1xuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXRFeHRlbmRzKG5vZGUpLCAnZXh0ZW5kcyBleHByZXNzaW9uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBsZW1lbnRzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgdHMuRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbXBsZW1lbnRzQ2xhdXNlID0gaGVyaXRhZ2UuZ2V0SGVyaXRhZ2VDbGF1c2VCeUtpbmQobm9kZSwgdHMuU3ludGF4S2luZC5JbXBsZW1lbnRzS2V5d29yZCk7XG4gIGlmIChpbXBsZW1lbnRzQ2xhdXNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGhlcml0YWdlLmdldFR5cGVOb2RlcyhpbXBsZW1lbnRzQ2xhdXNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGxlbWVudHNBcnJheShcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbixcbik6IHJlYWRvbmx5IHRzLkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1tdIHtcbiAgcmV0dXJuIHV0aWxzLmdldEFycmF5KGdldEltcGxlbWVudHMobm9kZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVtYmVycyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogcmVhZG9ubHkgQ2xhc3NNZW1iZXJUeXBlW10ge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgcmVhZG9ubHktYXJyYXlcbiAgY29uc3QgbWVtYmVyczogQXJyYXk8dHMuQ2xhc3NFbGVtZW50IHwgdHMuUGFyYW1ldGVyUHJvcGVydHlEZWNsYXJhdGlvbj4gPSBbLi4ubm9kZS5tZW1iZXJzXTtcbiAgY29uc3QgaW1wbGVtZW50YXRpb25DdG9ycyA9IG1lbWJlcnMuZmlsdGVyKHRzLmlzQ29uc3RydWN0b3JEZWNsYXJhdGlvbikuZmlsdGVyKChjKSA9PiBvdmVybG9hZC5pc0ltcGxlbWVudGF0aW9uKGMpKTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gIGZvciAoY29uc3QgY3RvciBvZiBpbXBsZW1lbnRhdGlvbkN0b3JzKSB7XG4gICAgLy8gaW5zZXJ0IGFmdGVyIHRoZSBjb25zdHJ1Y3RvclxuICAgIGxldCBpbnNlcnRJbmRleCA9IG1lbWJlcnMuaW5kZXhPZihjdG9yKSArIDE7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbWV0ZXJlZC5nZXRQYXJhbWV0ZXJzKGN0b3IpKSB7XG4gICAgICBpZiAodHMuaXNQYXJhbWV0ZXJQcm9wZXJ0eURlY2xhcmF0aW9uKHBhcmFtKSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXJyYXktbXV0YXRpb25cbiAgICAgICAgbWVtYmVycy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHBhcmFtKTtcbiAgICAgICAgaW5zZXJ0SW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVtYmVycy5maWx0ZXIoaXNDbGFzc01lbWJlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZU1lbWJlcnMobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbik6IHJlYWRvbmx5IENsYXNzTWVtYmVyVHlwZVtdIHtcbiAgcmV0dXJuIGRlY2xhcmF0aW9uLmlzQW1iaWVudChub2RlKVxuICAgID8gW11cbiAgICA6IGdldE1lbWJlcnMobm9kZSkuZmlsdGVyKChtZW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgIHJldHVybiBvdmVybG9hZC5pc0ltcGxlbWVudGF0aW9uKG1lbWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgQ2xhc3NJbnN0YW5jZVByb3BlcnR5VHlwZVtdIHtcbiAgcmV0dXJuIGdldE1lbWJlcnMobm9kZSkuZmlsdGVyKGlzQ2xhc3NJbnN0YW5jZVByb3BlcnR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbmNlTWVtYmVycyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogcmVhZG9ubHkgQ2xhc3NJbnN0YW5jZU1lbWJlclR5cGVbXSB7XG4gIHJldHVybiBnZXRNZW1iZXJzKG5vZGUpLmZpbHRlcihpc0NsYXNzSW5zdGFuY2VNZW1iZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdGFuY2VNZXRob2RzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiByZWFkb25seSB0cy5NZXRob2REZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldEluc3RhbmNlTWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNNZXRob2REZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2RzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiByZWFkb25seSB0cy5NZXRob2REZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldE1lbWJlcnMobm9kZSkuZmlsdGVyKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0QWNjZXNzb3JzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiByZWFkb25seSB0cy5TZXRBY2Nlc3NvckRlY2xhcmF0aW9uW10ge1xuICByZXR1cm4gZ2V0TWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNTZXRBY2Nlc3Nvcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YW5jZU1ldGhvZChcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbixcbiAgbmFtZTogc3RyaW5nLFxuKTogdHMuTWV0aG9kRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0SW5zdGFuY2VNZXRob2RzKG5vZGUpLmZpbmQoKG1ldGhvZCkgPT4gbm9kZV8uZ2V0TmFtZShtZXRob2QpID09PSBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmNyZXRlSW5zdGFuY2VQcm9wZXJ0aWVzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgQ2xhc3NJbnN0YW5jZVByb3BlcnR5VHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc0luc3RhbmNlUHJvcGVydHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uY3JldGVJbnN0YW5jZU1lbWJlcnMoXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24sXG4pOiByZWFkb25seSBDbGFzc0luc3RhbmNlTWVtYmVyVHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc0luc3RhbmNlTWVtYmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmNyZXRlSW5zdGFuY2VNZXRob2RzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgdHMuTWV0aG9kRGVjbGFyYXRpb25bXSB7XG4gIHJldHVybiBnZXRDb25jcmV0ZUluc3RhbmNlTWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNNZXRob2REZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0aWNQcm9wZXJ0aWVzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgQ2xhc3NTdGF0aWNQcm9wZXJ0eVR5cGVbXSB7XG4gIHJldHVybiBnZXRNZW1iZXJzKG5vZGUpLmZpbHRlcihpc0NsYXNzU3RhdGljUHJvcGVydHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdGljTWVtYmVycyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogcmVhZG9ubHkgQ2xhc3NTdGF0aWNNZW1iZXJUeXBlW10ge1xuICByZXR1cm4gZ2V0TWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc1N0YXRpY01lbWJlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZVN0YXRpY1Byb3BlcnRpZXMoXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24sXG4pOiByZWFkb25seSBDbGFzc1N0YXRpY1Byb3BlcnR5VHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc1N0YXRpY1Byb3BlcnR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmNyZXRlU3RhdGljTWVtYmVycyhcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbixcbik6IHJlYWRvbmx5IENsYXNzU3RhdGljTWVtYmVyVHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc1N0YXRpY01lbWJlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZVN0YXRpY01ldGhvZHMoXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24sXG4pOiByZWFkb25seSB0cy5NZXRob2REZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlU3RhdGljTWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNNZXRob2REZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25zdHJ1Y3RvcnMobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbik6IHJlYWRvbmx5IHRzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb25bXSB7XG4gIHJldHVybiBub2RlLm1lbWJlcnMuZmlsdGVyKHRzLmlzQ29uc3RydWN0b3JEZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZUNvbnN0cnVjdG9yKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogdHMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRDb25zdHJ1Y3RvcnMobm9kZSkuZmluZCgoY3RvcikgPT4gb3ZlcmxvYWQuaXNJbXBsZW1lbnRhdGlvbihjdG9yKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdENvbmNyZXRlQ29uc3RydWN0b3IoXG4gIHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbixcbik6IHRzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdG9yID0gZ2V0Q29uY3JldGVDb25zdHJ1Y3Rvcihub2RlKTtcbiAgaWYgKGN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjdG9yO1xuICB9XG5cbiAgY29uc3QgYmFzZUNsYXNzID0gZ2V0QmFzZUNsYXNzKHR5cGVDaGVja2VyLCBub2RlKTtcbiAgaWYgKGJhc2VDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBnZXRGaXJzdENvbmNyZXRlQ29uc3RydWN0b3IodHlwZUNoZWNrZXIsIGJhc2VDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIGdldERlcml2ZWRDbGFzc2VzV29ya2VyKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSxcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbixcbiAgc2VlbiA9IG5ldyBTZXQ8dHMuQ2xhc3NEZWNsYXJhdGlvbj4oKSxcbik6IHJlYWRvbmx5IHRzLkNsYXNzRGVjbGFyYXRpb25bXSB7XG4gIGlmIChzZWVuLmhhcyhub2RlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiByZWZlcmVuY2VcbiAgICAuZmluZFJlZmVyZW5jZXNBc05vZGVzKHByb2dyYW0sIGxhbmd1YWdlU2VydmljZSwgbm9kZSlcbiAgICAucmVkdWNlPHJlYWRvbmx5IHRzLkNsYXNzRGVjbGFyYXRpb25bXT4oKGFjYywgcmVmKSA9PiB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBub2RlXy5nZXRQYXJlbnQocmVmKSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsYXVzZSA9IG5vZGVfLmdldFBhcmVudChwYXJlbnQpIGFzIHRzLk5vZGUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2xhdXNlID09PSB1bmRlZmluZWQgfHwgIXRzLmlzSGVyaXRhZ2VDbGF1c2UoY2xhdXNlKSB8fCAhaGVyaXRhZ2UuaXNFeHRlbmRzKGNsYXVzZSkpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVyaXZlZCA9IG5vZGVfLmdldEZpcnN0QW5jZXN0b3JCeUtpbmRPclRocm93PHRzLkNsYXNzRGVjbGFyYXRpb24+KGNsYXVzZSwgdHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcblxuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0RGVyaXZlZENsYXNzZXNXb3JrZXIocHJvZ3JhbSwgbGFuZ3VhZ2VTZXJ2aWNlLCBkZXJpdmVkLCBzZWVuKSk7XG4gICAgfSwgW10pXG4gICAgLmNvbmNhdChbbm9kZV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVyaXZlZENsYXNzZXMoXG4gIHByb2dyYW06IHRzLlByb2dyYW0sXG4gIGxhbmd1YWdlU2VydmljZTogdHMuTGFuZ3VhZ2VTZXJ2aWNlLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uLFxuKTogcmVhZG9ubHkgdHMuQ2xhc3NEZWNsYXJhdGlvbltdIHtcbiAgY29uc3QgcmVzdWx0ID0gZ2V0RGVyaXZlZENsYXNzZXNXb3JrZXIocHJvZ3JhbSwgbGFuZ3VhZ2VTZXJ2aWNlLCBub2RlKTtcblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSBub2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW1wbGVtZW50b3JzV29ya2VyKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSxcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkludGVyZmFjZURlY2xhcmF0aW9uLFxuICBzZWVuID0gbmV3IFNldDx0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24+KCksXG4pOiByZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10ge1xuICBpZiAoc2Vlbi5oYXMobm9kZSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gcmVmZXJlbmNlXG4gICAgLmZpbmRSZWZlcmVuY2VzQXNOb2Rlcyhwcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2UsIG5vZGUpXG4gICAgLnJlZHVjZTxyZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10+KChhY2MsIHJlZikgPT4ge1xuICAgICAgY29uc3QgcGFyZW50ID0gbm9kZV8uZ2V0UGFyZW50KHJlZikgYXMgdHMuTm9kZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGF1c2UgPSBub2RlXy5nZXRQYXJlbnQocGFyZW50KSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBjbGF1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAhdHMuaXNIZXJpdGFnZUNsYXVzZShjbGF1c2UpIHx8XG4gICAgICAgICghaGVyaXRhZ2UuaXNJbXBsZW1lbnRzKGNsYXVzZSkgJiYgIWhlcml0YWdlLmlzRXh0ZW5kcyhjbGF1c2UpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGxldCBkZXJpdmVkOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgPSBub2RlXy5nZXRGaXJzdEFuY2VzdG9yQnlLaW5kPFxuICAgICAgICB0cy5DbGFzc0RlY2xhcmF0aW9uXG4gICAgICA+KGNsYXVzZSwgdHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgIGlmIChkZXJpdmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVyaXZlZCA9IG5vZGVfLmdldEZpcnN0QW5jZXN0b3JCeUtpbmRPclRocm93PHRzLkludGVyZmFjZURlY2xhcmF0aW9uPihcbiAgICAgICAgICBjbGF1c2UsXG4gICAgICAgICAgdHMuU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0SW1wbGVtZW50b3JzV29ya2VyKHByb2dyYW0sIGxhbmd1YWdlU2VydmljZSwgZGVyaXZlZCwgc2VlbikpO1xuICAgIH0sIFtdKVxuICAgIC5jb25jYXQodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpID8gW25vZGVdIDogW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wbGVtZW50b3JzKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSxcbiAgbm9kZTogdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4pOiByZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10ge1xuICByZXR1cm4gZ2V0SW1wbGVtZW50b3JzV29ya2VyKHByb2dyYW0sIGxhbmd1YWdlU2VydmljZSwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGdldEV4dGVuZG9yc1dvcmtlcihcbiAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiB0cy5MYW5ndWFnZVNlcnZpY2UsXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24sXG4gIHNlZW4gPSBuZXcgU2V0PHRzLkNsYXNzRGVjbGFyYXRpb24+KCksXG4pOiByZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10ge1xuICBpZiAoc2Vlbi5oYXMobm9kZSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gcmVmZXJlbmNlXG4gICAgLmZpbmRSZWZlcmVuY2VzQXNOb2Rlcyhwcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2UsIG5vZGUpXG4gICAgLnJlZHVjZTxyZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10+KChhY2MsIHJlZikgPT4ge1xuICAgICAgY29uc3QgcGFyZW50ID0gbm9kZV8uZ2V0UGFyZW50KHJlZikgYXMgdHMuTm9kZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGF1c2UgPSBub2RlXy5nZXRQYXJlbnQocGFyZW50KSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNsYXVzZSA9PT0gdW5kZWZpbmVkIHx8ICF0cy5pc0hlcml0YWdlQ2xhdXNlKGNsYXVzZSkgfHwgIWhlcml0YWdlLmlzRXh0ZW5kcyhjbGF1c2UpKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlcml2ZWQ6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgPSBub2RlXy5nZXRGaXJzdEFuY2VzdG9yQnlUZXN0T3JUaHJvdyhcbiAgICAgICAgY2xhdXNlLFxuICAgICAgICB0cy5pc0NsYXNzRGVjbGFyYXRpb24sXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRJbXBsZW1lbnRvcnNXb3JrZXIocHJvZ3JhbSwgbGFuZ3VhZ2VTZXJ2aWNlLCBkZXJpdmVkLCBzZWVuKSk7XG4gICAgfSwgW10pXG4gICAgLmNvbmNhdCh0cy5pc0NsYXNzRGVjbGFyYXRpb24obm9kZSkgPyBbbm9kZV0gOiBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbmRvcnMoXG4gIHByb2dyYW06IHRzLlByb2dyYW0sXG4gIGxhbmd1YWdlU2VydmljZTogdHMuTGFuZ3VhZ2VTZXJ2aWNlLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uLFxuKTogcmVhZG9ubHkgdHMuQ2xhc3NEZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldEV4dGVuZG9yc1dvcmtlcihwcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2UsIG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZVR5cGVzKFxuICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24gfCB0cy5JbnRlcmZhY2VEZWNsYXJhdGlvbixcbik6IHJlYWRvbmx5IHRzLlR5cGVbXSB7XG4gIHJldHVybiB0eXBlXy5nZXRCYXNlVHlwZXNBcnJheSh0eXBlXy5nZXRUeXBlKHR5cGVDaGVja2VyLCBub2RlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlVHlwZXNGbGF0dGVuZWQoXG4gIHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbiB8IHRzLkludGVyZmFjZURlY2xhcmF0aW9uLFxuKTogcmVhZG9ubHkgdHMuVHlwZVtdIHtcbiAgZnVuY3Rpb24gZ2V0QmFzZVR5cGVzV29ya2VyKHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10ge1xuICAgIGlmICh0eXBlXy5pc0ludGVyc2VjdGlvbih0eXBlKSkge1xuICAgICAgcmV0dXJuIF8uZmxhdHRlbih0eXBlXy5nZXRJbnRlcnNlY3Rpb25UeXBlc0FycmF5KHR5cGUpLm1hcChnZXRCYXNlVHlwZXNXb3JrZXIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlVHlwZXMgPSB0eXBlXy5nZXRCYXNlVHlwZXNBcnJheSh0eXBlKTtcblxuICAgIHJldHVybiBbdHlwZV0uY29uY2F0KF8uZmxhdHRlbihiYXNlVHlwZXMubWFwKGdldEJhc2VUeXBlc1dvcmtlcikpKTtcbiAgfVxuXG4gIHJldHVybiBfLmZsYXR0ZW4oZ2V0QmFzZVR5cGVzKHR5cGVDaGVja2VyLCBub2RlKS5tYXAoZ2V0QmFzZVR5cGVzV29ya2VyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlQ2xhc3NlcyhcbiAgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgdHMuQ2xhc3NEZWNsYXJhdGlvbltdIHtcbiAgY29uc3QgYmFzZVR5cGVzID0gZ2V0QmFzZVR5cGVzRmxhdHRlbmVkKHR5cGVDaGVja2VyLCBub2RlKTtcblxuICByZXR1cm4gYmFzZVR5cGVzXG4gICAgLm1hcCgodHlwZSkgPT4gdHlwZV8uZ2V0U3ltYm9sKHR5cGUpKVxuICAgIC5maWx0ZXIodXRpbHMubm90TnVsbClcbiAgICAubWFwKChzeW1ib2wpID0+IHN5bWJvbF8uZ2V0RGVjbGFyYXRpb25zKHN5bWJvbCkpXG4gICAgLnJlZHVjZTxyZWFkb25seSB0cy5EZWNsYXJhdGlvbltdPigoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKVxuICAgIC5maWx0ZXIodHMuaXNDbGFzc0RlY2xhcmF0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VDbGFzcyhcbiAgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGdldEJhc2VDbGFzc2VzKHR5cGVDaGVja2VyLCBub2RlKTtcblxuICByZXR1cm4gZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSA/IGRlY2xhcmF0aW9uc1swXSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|