UNPKG

26 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4// tslint:disable ban-types
5const ts_utils_1 = require("@neo-one/ts-utils");
6const typescript_1 = tslib_1.__importDefault(require("typescript"));
7const CompilerDiagnostic_1 = require("./CompilerDiagnostic");
8const DiagnosticCode_1 = require("./DiagnosticCode");
9class Context {
10 constructor(program, typeChecker, languageService, globals, libs, libAliases, mutableDiagnostics = typescript_1.default.getPreEmitDiagnostics(program)) {
11 this.program = program;
12 this.typeChecker = typeChecker;
13 this.languageService = languageService;
14 this.globals = globals;
15 this.libs = libs;
16 this.libAliases = libAliases;
17 this.mutableDiagnostics = mutableDiagnostics;
18 }
19 get diagnostics() {
20 return this.mutableDiagnostics;
21 }
22 update(program, typeChecker, languageService, globals, libs, libAliases) {
23 return new Context(program, typeChecker, languageService, globals, libs, libAliases, [...this.mutableDiagnostics]);
24 }
25 addDiagnostics(diagnostics) {
26 this.mutableDiagnostics.push(...diagnostics);
27 }
28 reportError(node, message, code) {
29 this.mutableDiagnostics.push(new CompilerDiagnostic_1.CompilerDiagnostic(node, message, code, typescript_1.default.DiagnosticCategory.Error));
30 }
31 reportWarning(node, message, code) {
32 this.mutableDiagnostics.push(new CompilerDiagnostic_1.CompilerDiagnostic(node, message, code, typescript_1.default.DiagnosticCategory.Warning));
33 }
34 reportUnsupported(node) {
35 this.reportError(node, 'Unsupported syntax', DiagnosticCode_1.DiagnosticCode.UNSUPPORTED_SYNTAX);
36 }
37 reportTypeError(node) {
38 this.reportError(node, 'Could not infer type. Please add an explicit type annotation.', DiagnosticCode_1.DiagnosticCode.UNKNOWN_TYPE);
39 }
40 reportTypeWarning(node) {
41 this.reportWarning(node, 'Could not infer type. Deoptimized implementation will be used. Add an explicit type annotation ' + 'to optimize the output.', DiagnosticCode_1.DiagnosticCode.UNKNOWN_TYPE);
42 }
43 getType(node, { warning = true, error = false } = {
44 warning: true,
45 error: false
46 }) {
47 const type = this.getNotAnyType(ts_utils_1.tsUtils.type_.getType(this.typeChecker, node));
48 if (type === undefined) {
49 if (error) {
50 this.reportTypeError(node);
51 }
52 else if (warning) {
53 this.reportTypeWarning(node);
54 }
55 }
56 if (type !== undefined) {
57 const constraintType = ts_utils_1.tsUtils.type_.getConstraint(type);
58 if (constraintType !== undefined) {
59 return constraintType;
60 }
61 }
62 return type;
63 }
64 getTypeOfSymbol(symbol, node, { warning = true, error = false } = {
65 warning: true,
66 error: false
67 }) {
68 if (symbol === undefined) {
69 return undefined;
70 }
71 const type = this.getNotAnyType(ts_utils_1.tsUtils.type_.getTypeAtLocation(this.typeChecker, symbol, node));
72 if (type === undefined) {
73 if (error) {
74 this.reportTypeError(node);
75 }
76 else if (warning) {
77 this.reportTypeWarning(node);
78 }
79 }
80 return type;
81 }
82 getSymbol(node, { warning = true, error = false } = {
83 warning: true,
84 error: false
85 }) {
86 let symbol = ts_utils_1.tsUtils.node.getSymbol(this.typeChecker, node);
87 if (symbol === undefined) {
88 const noWarnOrError = {
89 warning: false,
90 error: false
91 };
92 const type = this.getType(node, noWarnOrError);
93 symbol = this.getSymbolForType(node, type, noWarnOrError);
94 }
95 if (symbol === undefined) {
96 const message = 'Could not determine source symbol.';
97 if (error) {
98 this.reportError(node, message, DiagnosticCode_1.DiagnosticCode.UNKNOWN_SYMBOL);
99 }
100 else if (warning) {
101 this.reportWarning(node, message, DiagnosticCode_1.DiagnosticCode.UNKNOWN_SYMBOL);
102 }
103 return undefined;
104 }
105 const aliased = ts_utils_1.tsUtils.symbol.getAliasedSymbol(this.typeChecker, symbol);
106 if (aliased !== undefined) {
107 return aliased;
108 }
109 return symbol;
110 }
111 getSymbolForType(node, type, { warning = true, error = false } = {
112 warning: true,
113 error: false
114 }) {
115 if (type === undefined) {
116 return undefined;
117 }
118 const symbol = ts_utils_1.tsUtils.type_.getSymbol(type);
119 if (symbol === undefined) {
120 if (!ts_utils_1.tsUtils.type_.isSymbolic(type)) {
121 return undefined;
122 }
123 const message = `Could not determine source symbol for type: ${ts_utils_1.tsUtils.type_.getText(this.typeChecker, type, node)}.`;
124 if (error) {
125 this.reportError(node, message, DiagnosticCode_1.DiagnosticCode.UNKNOWN_SYMBOL);
126 }
127 else if (warning) {
128 this.reportWarning(node, message, DiagnosticCode_1.DiagnosticCode.UNKNOWN_SYMBOL);
129 }
130 return undefined;
131 }
132 const aliased = ts_utils_1.tsUtils.symbol.getAliasedSymbol(this.typeChecker, symbol);
133 if (aliased !== undefined) {
134 return aliased;
135 }
136 return symbol;
137 }
138 isOnlyGlobal(node, type, name) {
139 return this.isGlobalSymbol(node, this.getSymbolForType(node, type), name);
140 }
141 isGlobal(node, type, name) {
142 return this.isGlobalSymbol(node, this.getSymbolForType(node, type), name);
143 }
144 hasGlobal(node, type, name) {
145 return type !== undefined && ts_utils_1.tsUtils.type_.hasType(type, testType => this.isGlobalSymbol(node, this.getSymbolForType(node, testType), name));
146 }
147 isGlobalSymbol(_node, symbol, name) {
148 return symbol === this.globals[name];
149 }
150 isOnlyLib(node, type, name) {
151 return this.isLibSymbol(node, this.getSymbolForType(node, type), name);
152 }
153 isLibSymbol(_node, symbol, name) {
154 return symbol === this.libs[name];
155 }
156 isLibAlias(identifier, name) {
157 if (identifier === undefined) {
158 return false;
159 }
160 return this.libAliases[name].has(identifier);
161 }
162 getNotAnyType(type) {
163 // tslint:disable-next-line no-bitwise
164 if (type === undefined || ts_utils_1.tsUtils.type_.isAny(type)) {
165 return undefined;
166 }
167 return type;
168 }
169}
170exports.Context = Context;
171
172//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnRleHQudHMiXSwibmFtZXMiOlsiQ29udGV4dCIsInByb2dyYW0iLCJ0eXBlQ2hlY2tlciIsImxhbmd1YWdlU2VydmljZSIsImdsb2JhbHMiLCJsaWJzIiwibGliQWxpYXNlcyIsIm11dGFibGVEaWFnbm9zdGljcyIsInRzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwiZGlhZ25vc3RpY3MiLCJ1cGRhdGUiLCJhZGREaWFnbm9zdGljcyIsInB1c2giLCJyZXBvcnRFcnJvciIsIm5vZGUiLCJtZXNzYWdlIiwiY29kZSIsIkNvbXBpbGVyRGlhZ25vc3RpYyIsIkRpYWdub3N0aWNDYXRlZ29yeSIsIkVycm9yIiwicmVwb3J0V2FybmluZyIsIldhcm5pbmciLCJyZXBvcnRVbnN1cHBvcnRlZCIsIkRpYWdub3N0aWNDb2RlIiwiVU5TVVBQT1JURURfU1lOVEFYIiwicmVwb3J0VHlwZUVycm9yIiwiVU5LTk9XTl9UWVBFIiwicmVwb3J0VHlwZVdhcm5pbmciLCJnZXRUeXBlIiwid2FybmluZyIsImVycm9yIiwidHlwZSIsImdldE5vdEFueVR5cGUiLCJ0c1V0aWxzIiwidHlwZV8iLCJ1bmRlZmluZWQiLCJjb25zdHJhaW50VHlwZSIsImdldENvbnN0cmFpbnQiLCJnZXRUeXBlT2ZTeW1ib2wiLCJzeW1ib2wiLCJnZXRUeXBlQXRMb2NhdGlvbiIsImdldFN5bWJvbCIsIm5vV2Fybk9yRXJyb3IiLCJnZXRTeW1ib2xGb3JUeXBlIiwiVU5LTk9XTl9TWU1CT0wiLCJhbGlhc2VkIiwiZ2V0QWxpYXNlZFN5bWJvbCIsImlzU3ltYm9saWMiLCJnZXRUZXh0IiwiaXNPbmx5R2xvYmFsIiwibmFtZSIsImlzR2xvYmFsU3ltYm9sIiwiaXNHbG9iYWwiLCJoYXNHbG9iYWwiLCJoYXNUeXBlIiwidGVzdFR5cGUiLCJfbm9kZSIsImlzT25seUxpYiIsImlzTGliU3ltYm9sIiwiaXNMaWJBbGlhcyIsImlkZW50aWZpZXIiLCJoYXMiLCJpc0FueSJdLCJtYXBwaW5ncyI6Ijs7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dGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZSBiYW4tdHlwZXNcbmltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IENvbXBpbGVyRGlhZ25vc3RpYyB9IGZyb20gJy4vQ29tcGlsZXJEaWFnbm9zdGljJztcbmltcG9ydCB7IERpYWdub3N0aWNDb2RlIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29kZSc7XG5pbXBvcnQgeyBHbG9iYWxzLCBMaWJBbGlhc2VzLCBMaWJBbGlhc2VzV2l0aFJlc2V0LCBMaWJzIH0gZnJvbSAnLi9zeW1ib2xzJztcblxuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGVycm9yPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgd2FybmluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IGxhbmd1YWdlU2VydmljZTogdHMuTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFkb25seSBnbG9iYWxzOiBHbG9iYWxzLFxuICAgIHB1YmxpYyByZWFkb25seSBsaWJzOiBMaWJzLFxuICAgIHB1YmxpYyByZWFkb25seSBsaWJBbGlhc2VzOiBMaWJBbGlhc2VzV2l0aFJlc2V0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbXV0YWJsZURpYWdub3N0aWNzOiB0cy5EaWFnbm9zdGljW10gPSB0cy5nZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSksXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGRpYWdub3N0aWNzKCk6IFJlYWRvbmx5QXJyYXk8dHMuRGlhZ25vc3RpYz4ge1xuICAgIHJldHVybiB0aGlzLm11dGFibGVEaWFnbm9zdGljcztcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUoXG4gICAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbiAgICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlOiB0cy5MYW5ndWFnZVNlcnZpY2UsXG4gICAgZ2xvYmFsczogR2xvYmFscyxcbiAgICBsaWJzOiBMaWJzLFxuICAgIGxpYkFsaWFzZXM6IExpYkFsaWFzZXNXaXRoUmVzZXQsXG4gICk6IENvbnRleHQge1xuICAgIHJldHVybiBuZXcgQ29udGV4dChwcm9ncmFtLCB0eXBlQ2hlY2tlciwgbGFuZ3VhZ2VTZXJ2aWNlLCBnbG9iYWxzLCBsaWJzLCBsaWJBbGlhc2VzLCBbLi4udGhpcy5tdXRhYmxlRGlhZ25vc3RpY3NdKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREaWFnbm9zdGljcyhkaWFnbm9zdGljczogUmVhZG9ubHlBcnJheTx0cy5EaWFnbm9zdGljPik6IHZvaWQge1xuICAgIHRoaXMubXV0YWJsZURpYWdub3N0aWNzLnB1c2goLi4uZGlhZ25vc3RpY3MpO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydEVycm9yKG5vZGU6IHRzLk5vZGUsIG1lc3NhZ2U6IHN0cmluZywgY29kZTogRGlhZ25vc3RpY0NvZGUpOiB2b2lkIHtcbiAgICB0aGlzLm11dGFibGVEaWFnbm9zdGljcy5wdXNoKG5ldyBDb21waWxlckRpYWdub3N0aWMobm9kZSwgbWVzc2FnZSwgY29kZSwgdHMuRGlhZ25vc3RpY0NhdGVnb3J5LkVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0V2FybmluZyhub2RlOiB0cy5Ob2RlLCBtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IERpYWdub3N0aWNDb2RlKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhYmxlRGlhZ25vc3RpY3MucHVzaChuZXcgQ29tcGlsZXJEaWFnbm9zdGljKG5vZGUsIG1lc3NhZ2UsIGNvZGUsIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5XYXJuaW5nKSk7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0VW5zdXBwb3J0ZWQobm9kZTogdHMuTm9kZSk6IHZvaWQge1xuICAgIHRoaXMucmVwb3J0RXJyb3Iobm9kZSwgJ1Vuc3VwcG9ydGVkIHN5bnRheCcsIERpYWdub3N0aWNDb2RlLlVOU1VQUE9SVEVEX1NZTlRBWCk7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0VHlwZUVycm9yKG5vZGU6IHRzLk5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlcG9ydEVycm9yKFxuICAgICAgbm9kZSxcbiAgICAgICdDb3VsZCBub3QgaW5mZXIgdHlwZS4gUGxlYXNlIGFkZCBhbiBleHBsaWNpdCB0eXBlIGFubm90YXRpb24uJyxcbiAgICAgIERpYWdub3N0aWNDb2RlLlVOS05PV05fVFlQRSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydFR5cGVXYXJuaW5nKG5vZGU6IHRzLk5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlcG9ydFdhcm5pbmcoXG4gICAgICBub2RlLFxuICAgICAgJ0NvdWxkIG5vdCBpbmZlciB0eXBlLiBEZW9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQuIEFkZCBhbiBleHBsaWNpdCB0eXBlIGFubm90YXRpb24gJyArXG4gICAgICAgICd0byBvcHRpbWl6ZSB0aGUgb3V0cHV0LicsXG4gICAgICBEaWFnbm9zdGljQ29kZS5VTktOT1dOX1RZUEUsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUeXBlKFxuICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgeyB3YXJuaW5nID0gdHJ1ZSwgZXJyb3IgPSBmYWxzZSB9OiBEaWFnbm9zdGljT3B0aW9ucyA9IHsgd2FybmluZzogdHJ1ZSwgZXJyb3I6IGZhbHNlIH0sXG4gICk6IHRzLlR5cGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vdEFueVR5cGUodHNVdGlscy50eXBlXy5nZXRUeXBlKHRoaXMudHlwZUNoZWNrZXIsIG5vZGUpKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlcG9ydFR5cGVFcnJvcihub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAod2FybmluZykge1xuICAgICAgICB0aGlzLnJlcG9ydFR5cGVXYXJuaW5nKG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnRUeXBlID0gdHNVdGlscy50eXBlXy5nZXRDb25zdHJhaW50KHR5cGUpO1xuICAgICAgaWYgKGNvbnN0cmFpbnRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRUeXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGVPZlN5bWJvbChcbiAgICBzeW1ib2w6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBub2RlOiB0cy5Ob2RlLFxuICAgIHsgd2FybmluZyA9IHRydWUsIGVycm9yID0gZmFsc2UgfTogRGlhZ25vc3RpY09wdGlvbnMgPSB7IHdhcm5pbmc6IHRydWUsIGVycm9yOiBmYWxzZSB9LFxuICApOiB0cy5UeXBlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc3ltYm9sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm90QW55VHlwZSh0c1V0aWxzLnR5cGVfLmdldFR5cGVBdExvY2F0aW9uKHRoaXMudHlwZUNoZWNrZXIsIHN5bWJvbCwgbm9kZSkpO1xuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlcG9ydFR5cGVFcnJvcihub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAod2FybmluZykge1xuICAgICAgICB0aGlzLnJlcG9ydFR5cGVXYXJuaW5nKG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGdldFN5bWJvbChcbiAgICBub2RlOiB0cy5Ob2RlLFxuICAgIHsgd2FybmluZyA9IHRydWUsIGVycm9yID0gZmFsc2UgfTogRGlhZ25vc3RpY09wdGlvbnMgPSB7IHdhcm5pbmc6IHRydWUsIGVycm9yOiBmYWxzZSB9LFxuICApOiB0cy5TeW1ib2wgfCB1bmRlZmluZWQge1xuICAgIGxldCBzeW1ib2wgPSB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sKHRoaXMudHlwZUNoZWNrZXIsIG5vZGUpO1xuICAgIGlmIChzeW1ib2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgbm9XYXJuT3JFcnJvciA9IHsgd2FybmluZzogZmFsc2UsIGVycm9yOiBmYWxzZSB9O1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZShub2RlLCBub1dhcm5PckVycm9yKTtcbiAgICAgIHN5bWJvbCA9IHRoaXMuZ2V0U3ltYm9sRm9yVHlwZShub2RlLCB0eXBlLCBub1dhcm5PckVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoc3ltYm9sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ291bGQgbm90IGRldGVybWluZSBzb3VyY2Ugc3ltYm9sLic7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihub2RlLCBtZXNzYWdlLCBEaWFnbm9zdGljQ29kZS5VTktOT1dOX1NZTUJPTCk7XG4gICAgICB9IGVsc2UgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRXYXJuaW5nKG5vZGUsIG1lc3NhZ2UsIERpYWdub3N0aWNDb2RlLlVOS05PV05fU1lNQk9MKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBhbGlhc2VkID0gdHNVdGlscy5zeW1ib2wuZ2V0QWxpYXNlZFN5bWJvbCh0aGlzLnR5cGVDaGVja2VyLCBzeW1ib2wpO1xuICAgIGlmIChhbGlhc2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBhbGlhc2VkO1xuICAgIH1cblxuICAgIHJldHVybiBzeW1ib2w7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ltYm9sRm9yVHlwZShcbiAgICBub2RlOiB0cy5Ob2RlLFxuICAgIHR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQsXG4gICAgeyB3YXJuaW5nID0gdHJ1ZSwgZXJyb3IgPSBmYWxzZSB9OiBEaWFnbm9zdGljT3B0aW9ucyA9IHsgd2FybmluZzogdHJ1ZSwgZXJyb3I6IGZhbHNlIH0sXG4gICk6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzeW1ib2wgPSB0c1V0aWxzLnR5cGVfLmdldFN5bWJvbCh0eXBlKTtcbiAgICBpZiAoc3ltYm9sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghdHNVdGlscy50eXBlXy5pc1N5bWJvbGljKHR5cGUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ291bGQgbm90IGRldGVybWluZSBzb3VyY2Ugc3ltYm9sIGZvciB0eXBlOiAke3RzVXRpbHMudHlwZV8uZ2V0VGV4dChcbiAgICAgICAgdGhpcy50eXBlQ2hlY2tlcixcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbm9kZSxcbiAgICAgICl9LmA7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihub2RlLCBtZXNzYWdlLCBEaWFnbm9zdGljQ29kZS5VTktOT1dOX1NZTUJPTCk7XG4gICAgICB9IGVsc2UgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRXYXJuaW5nKG5vZGUsIG1lc3NhZ2UsIERpYWdub3N0aWNDb2RlLlVOS05PV05fU1lNQk9MKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBhbGlhc2VkID0gdHNVdGlscy5zeW1ib2wuZ2V0QWxpYXNlZFN5bWJvbCh0aGlzLnR5cGVDaGVja2VyLCBzeW1ib2wpO1xuICAgIGlmIChhbGlhc2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBhbGlhc2VkO1xuICAgIH1cblxuICAgIHJldHVybiBzeW1ib2w7XG4gIH1cblxuICBwdWJsaWMgaXNPbmx5R2xvYmFsKG5vZGU6IHRzLk5vZGUsIHR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQsIG5hbWU6IGtleW9mIEdsb2JhbHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0dsb2JhbFN5bWJvbChub2RlLCB0aGlzLmdldFN5bWJvbEZvclR5cGUobm9kZSwgdHlwZSksIG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGlzR2xvYmFsKG5vZGU6IHRzLk5vZGUsIHR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQsIG5hbWU6IGtleW9mIEdsb2JhbHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0dsb2JhbFN5bWJvbChub2RlLCB0aGlzLmdldFN5bWJvbEZvclR5cGUobm9kZSwgdHlwZSksIG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGhhc0dsb2JhbChub2RlOiB0cy5Ob2RlLCB0eXBlOiB0cy5UeXBlIHwgdW5kZWZpbmVkLCBuYW1lOiBrZXlvZiBHbG9iYWxzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdHNVdGlscy50eXBlXy5oYXNUeXBlKHR5cGUsICh0ZXN0VHlwZSkgPT4gdGhpcy5pc0dsb2JhbFN5bWJvbChub2RlLCB0aGlzLmdldFN5bWJvbEZvclR5cGUobm9kZSwgdGVzdFR5cGUpLCBuYW1lKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGlzR2xvYmFsU3ltYm9sKF9ub2RlOiB0cy5Ob2RlLCBzeW1ib2w6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCwgbmFtZToga2V5b2YgR2xvYmFscyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzeW1ib2wgPT09IHRoaXMuZ2xvYmFsc1tuYW1lXTtcbiAgfVxuXG4gIHB1YmxpYyBpc09ubHlMaWIobm9kZTogdHMuTm9kZSwgdHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZCwgbmFtZToga2V5b2YgTGlicyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTGliU3ltYm9sKG5vZGUsIHRoaXMuZ2V0U3ltYm9sRm9yVHlwZShub2RlLCB0eXBlKSwgbmFtZSk7XG4gIH1cblxuICBwdWJsaWMgaXNMaWJTeW1ib2woX25vZGU6IHRzLk5vZGUsIHN5bWJvbDogdHMuU3ltYm9sIHwgdW5kZWZpbmVkLCBuYW1lOiBrZXlvZiBMaWJzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN5bWJvbCA9PT0gdGhpcy5saWJzW25hbWVdO1xuICB9XG5cbiAgcHVibGljIGlzTGliQWxpYXMoaWRlbnRpZmllcjogdHMuSWRlbnRpZmllciB8IHVuZGVmaW5lZCwgbmFtZToga2V5b2YgTGliQWxpYXNlcyk6IGJvb2xlYW4ge1xuICAgIGlmIChpZGVudGlmaWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5saWJBbGlhc2VzW25hbWVdLmhhcyhpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Tm90QW55VHlwZSh0eXBlOiB0cy5UeXBlIHwgdW5kZWZpbmVkKTogdHMuVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHRzVXRpbHMudHlwZV8uaXNBbnkodHlwZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn1cbiJdfQ==