source: trip-planner-front/node_modules/@angular/compiler-cli/linker/babel/src/ast/babel_ast_host.js@ 6a3a178

Last change on this file since 6a3a178 was 6a3a178, checked in by Ema <ema_spirova@…>, 3 years ago

initial commit

  • Property mode set to 100644
File size: 22.4 KB
Line 
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/compiler-cli/linker/babel/src/ast/babel_ast_host", ["require", "exports", "tslib", "@babel/types", "@angular/compiler-cli/linker"], factory);
15 }
16})(function (require, exports) {
17 "use strict";
18 Object.defineProperty(exports, "__esModule", { value: true });
19 exports.BabelAstHost = void 0;
20 var tslib_1 = require("tslib");
21 var t = require("@babel/types");
22 var linker_1 = require("@angular/compiler-cli/linker");
23 /**
24 * This implementation of `AstHost` is able to get information from Babel AST nodes.
25 */
26 var BabelAstHost = /** @class */ (function () {
27 function BabelAstHost() {
28 this.isStringLiteral = t.isStringLiteral;
29 this.isNumericLiteral = t.isNumericLiteral;
30 this.isArrayLiteral = t.isArrayExpression;
31 this.isObjectLiteral = t.isObjectExpression;
32 this.isCallExpression = t.isCallExpression;
33 }
34 BabelAstHost.prototype.getSymbolName = function (node) {
35 if (t.isIdentifier(node)) {
36 return node.name;
37 }
38 else if (t.isMemberExpression(node) && t.isIdentifier(node.property)) {
39 return node.property.name;
40 }
41 else {
42 return null;
43 }
44 };
45 BabelAstHost.prototype.parseStringLiteral = function (str) {
46 linker_1.assert(str, t.isStringLiteral, 'a string literal');
47 return str.value;
48 };
49 BabelAstHost.prototype.parseNumericLiteral = function (num) {
50 linker_1.assert(num, t.isNumericLiteral, 'a numeric literal');
51 return num.value;
52 };
53 BabelAstHost.prototype.isBooleanLiteral = function (bool) {
54 return t.isBooleanLiteral(bool) || isMinifiedBooleanLiteral(bool);
55 };
56 BabelAstHost.prototype.parseBooleanLiteral = function (bool) {
57 if (t.isBooleanLiteral(bool)) {
58 return bool.value;
59 }
60 else if (isMinifiedBooleanLiteral(bool)) {
61 return !bool.argument.value;
62 }
63 else {
64 throw new linker_1.FatalLinkerError(bool, 'Unsupported syntax, expected a boolean literal.');
65 }
66 };
67 BabelAstHost.prototype.parseArrayLiteral = function (array) {
68 linker_1.assert(array, t.isArrayExpression, 'an array literal');
69 return array.elements.map(function (element) {
70 linker_1.assert(element, isNotEmptyElement, 'element in array not to be empty');
71 linker_1.assert(element, isNotSpreadElement, 'element in array not to use spread syntax');
72 return element;
73 });
74 };
75 BabelAstHost.prototype.parseObjectLiteral = function (obj) {
76 var e_1, _a;
77 linker_1.assert(obj, t.isObjectExpression, 'an object literal');
78 var result = new Map();
79 try {
80 for (var _b = tslib_1.__values(obj.properties), _c = _b.next(); !_c.done; _c = _b.next()) {
81 var property = _c.value;
82 linker_1.assert(property, t.isObjectProperty, 'a property assignment');
83 linker_1.assert(property.value, t.isExpression, 'an expression');
84 linker_1.assert(property.key, isPropertyName, 'a property name');
85 var key = t.isIdentifier(property.key) ? property.key.name : property.key.value;
86 result.set(key, property.value);
87 }
88 }
89 catch (e_1_1) { e_1 = { error: e_1_1 }; }
90 finally {
91 try {
92 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
93 }
94 finally { if (e_1) throw e_1.error; }
95 }
96 return result;
97 };
98 BabelAstHost.prototype.isFunctionExpression = function (node) {
99 return t.isFunction(node);
100 };
101 BabelAstHost.prototype.parseReturnValue = function (fn) {
102 linker_1.assert(fn, this.isFunctionExpression, 'a function');
103 if (!t.isBlockStatement(fn.body)) {
104 // it is a simple array function expression: `(...) => expr`
105 return fn.body;
106 }
107 // it is a function (arrow or normal) with a body. E.g.:
108 // * `(...) => { stmt; ... }`
109 // * `function(...) { stmt; ... }`
110 if (fn.body.body.length !== 1) {
111 throw new linker_1.FatalLinkerError(fn.body, 'Unsupported syntax, expected a function body with a single return statement.');
112 }
113 var stmt = fn.body.body[0];
114 linker_1.assert(stmt, t.isReturnStatement, 'a function body with a single return statement');
115 if (stmt.argument === null) {
116 throw new linker_1.FatalLinkerError(stmt, 'Unsupported syntax, expected function to return a value.');
117 }
118 return stmt.argument;
119 };
120 BabelAstHost.prototype.parseCallee = function (call) {
121 linker_1.assert(call, t.isCallExpression, 'a call expression');
122 linker_1.assert(call.callee, t.isExpression, 'an expression');
123 return call.callee;
124 };
125 BabelAstHost.prototype.parseArguments = function (call) {
126 linker_1.assert(call, t.isCallExpression, 'a call expression');
127 return call.arguments.map(function (arg) {
128 linker_1.assert(arg, isNotSpreadArgument, 'argument not to use spread syntax');
129 linker_1.assert(arg, t.isExpression, 'argument to be an expression');
130 return arg;
131 });
132 };
133 BabelAstHost.prototype.getRange = function (node) {
134 if (node.loc == null || node.start === null || node.end === null) {
135 throw new linker_1.FatalLinkerError(node, 'Unable to read range for node - it is missing location information.');
136 }
137 return {
138 startLine: node.loc.start.line - 1,
139 startCol: node.loc.start.column,
140 startPos: node.start,
141 endPos: node.end,
142 };
143 };
144 return BabelAstHost;
145 }());
146 exports.BabelAstHost = BabelAstHost;
147 /**
148 * Return true if the expression does not represent an empty element in an array literal.
149 * For example in `[,foo]` the first element is "empty".
150 */
151 function isNotEmptyElement(e) {
152 return e !== null;
153 }
154 /**
155 * Return true if the expression is not a spread element of an array literal.
156 * For example in `[x, ...rest]` the `...rest` expression is a spread element.
157 */
158 function isNotSpreadElement(e) {
159 return !t.isSpreadElement(e);
160 }
161 /**
162 * Return true if the expression can be considered a text based property name.
163 */
164 function isPropertyName(e) {
165 return t.isIdentifier(e) || t.isStringLiteral(e) || t.isNumericLiteral(e);
166 }
167 /**
168 * Return true if the argument is not a spread element.
169 */
170 function isNotSpreadArgument(arg) {
171 return !t.isSpreadElement(arg);
172 }
173 /**
174 * Return true if the node is either `!0` or `!1`.
175 */
176 function isMinifiedBooleanLiteral(node) {
177 return t.isUnaryExpression(node) && node.prefix && node.operator === '!' &&
178 t.isNumericLiteral(node.argument) && (node.argument.value === 0 || node.argument.value === 1);
179 }
180});
181//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFiZWxfYXN0X2hvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvbGlua2VyL2JhYmVsL3NyYy9hc3QvYmFiZWxfYXN0X2hvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7OztJQUVILGdDQUFrQztJQUVsQyx1REFBNEU7SUFFNUU7O09BRUc7SUFDSDtRQUFBO1lBV0Usb0JBQWUsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBT3BDLHFCQUFnQixHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQXFCdEMsbUJBQWMsR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUM7WUFXckMsb0JBQWUsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUM7WUE0Q3ZDLHFCQUFnQixHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztRQTJCeEMsQ0FBQztRQXhIQyxvQ0FBYSxHQUFiLFVBQWMsSUFBa0I7WUFDOUIsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDbEI7aUJBQU0sSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3RFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDM0I7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLENBQUM7YUFDYjtRQUNILENBQUM7UUFJRCx5Q0FBa0IsR0FBbEIsVUFBbUIsR0FBaUI7WUFDbEMsZUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDbkQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ25CLENBQUM7UUFJRCwwQ0FBbUIsR0FBbkIsVUFBb0IsR0FBaUI7WUFDbkMsZUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUNyRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDbkIsQ0FBQztRQUVELHVDQUFnQixHQUFoQixVQUFpQixJQUFrQjtZQUNqQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsMENBQW1CLEdBQW5CLFVBQW9CLElBQWtCO1lBQ3BDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDbkI7aUJBQU0sSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSx5QkFBZ0IsQ0FBQyxJQUFJLEVBQUUsaURBQWlELENBQUMsQ0FBQzthQUNyRjtRQUNILENBQUM7UUFJRCx3Q0FBaUIsR0FBakIsVUFBa0IsS0FBbUI7WUFDbkMsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUN2RCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsT0FBTztnQkFDL0IsZUFBTSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO2dCQUN2RSxlQUFNLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLDJDQUEyQyxDQUFDLENBQUM7Z0JBQ2pGLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUlELHlDQUFrQixHQUFsQixVQUFtQixHQUFpQjs7WUFDbEMsZUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUV2RCxJQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQzs7Z0JBQy9DLEtBQXVCLElBQUEsS0FBQSxpQkFBQSxHQUFHLENBQUMsVUFBVSxDQUFBLGdCQUFBLDRCQUFFO29CQUFsQyxJQUFNLFFBQVEsV0FBQTtvQkFDakIsZUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztvQkFDOUQsZUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDeEQsZUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7b0JBQ3hELElBQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7b0JBQ2xGLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDakM7Ozs7Ozs7OztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCwyQ0FBb0IsR0FBcEIsVUFBcUIsSUFBa0I7WUFDckMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCx1Q0FBZ0IsR0FBaEIsVUFBaUIsRUFBZ0I7WUFDL0IsZUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hDLDREQUE0RDtnQkFDNUQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ2hCO1lBRUQsd0RBQXdEO1lBQ3hELDZCQUE2QjtZQUM3QixrQ0FBa0M7WUFFbEMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixNQUFNLElBQUkseUJBQWdCLENBQ3RCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsOEVBQThFLENBQUMsQ0FBQzthQUM5RjtZQUNELElBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLGVBQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLGdEQUFnRCxDQUFDLENBQUM7WUFDcEYsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDMUIsTUFBTSxJQUFJLHlCQUFnQixDQUFDLElBQUksRUFBRSwwREFBMEQsQ0FBQyxDQUFDO2FBQzlGO1lBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUM7UUFHRCxrQ0FBVyxHQUFYLFVBQVksSUFBa0I7WUFDNUIsZUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUN0RCxlQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO1FBQ0QscUNBQWMsR0FBZCxVQUFlLElBQWtCO1lBQy9CLGVBQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDdEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7Z0JBQzNCLGVBQU0sQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztnQkFDdEUsZUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLDhCQUE4QixDQUFDLENBQUM7Z0JBQzVELE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsK0JBQVEsR0FBUixVQUFTLElBQWtCO1lBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQ2hFLE1BQU0sSUFBSSx5QkFBZ0IsQ0FDdEIsSUFBSSxFQUFFLHFFQUFxRSxDQUFDLENBQUM7YUFDbEY7WUFDRCxPQUFPO2dCQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFDbEMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQy9CLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHO2FBQ2pCLENBQUM7UUFDSixDQUFDO1FBQ0gsbUJBQUM7SUFBRCxDQUFDLEFBekhELElBeUhDO0lBekhZLG9DQUFZO0lBMkh6Qjs7O09BR0c7SUFDSCxTQUFTLGlCQUFpQixDQUFDLENBQW9DO1FBRTdELE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxDQUErQjtRQUN6RCxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBR0Q7O09BRUc7SUFDSCxTQUFTLGNBQWMsQ0FBQyxDQUFlO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBT0Q7O09BRUc7SUFDSCxTQUFTLG1CQUFtQixDQUFDLEdBQWlCO1FBQzVDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFJRDs7T0FFRztJQUNILFNBQVMsd0JBQXdCLENBQUMsSUFBa0I7UUFDbEQsT0FBTyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUc7WUFDcEUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIHQgZnJvbSAnQGJhYmVsL3R5cGVzJztcblxuaW1wb3J0IHthc3NlcnQsIEFzdEhvc3QsIEZhdGFsTGlua2VyRXJyb3IsIFJhbmdlfSBmcm9tICcuLi8uLi8uLi8uLi9saW5rZXInO1xuXG4vKipcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYEFzdEhvc3RgIGlzIGFibGUgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gQmFiZWwgQVNUIG5vZGVzLlxuICovXG5leHBvcnQgY2xhc3MgQmFiZWxBc3RIb3N0IGltcGxlbWVudHMgQXN0SG9zdDx0LkV4cHJlc3Npb24+IHtcbiAgZ2V0U3ltYm9sTmFtZShub2RlOiB0LkV4cHJlc3Npb24pOiBzdHJpbmd8bnVsbCB7XG4gICAgaWYgKHQuaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZS5uYW1lO1xuICAgIH0gZWxzZSBpZiAodC5pc01lbWJlckV4cHJlc3Npb24obm9kZSkgJiYgdC5pc0lkZW50aWZpZXIobm9kZS5wcm9wZXJ0eSkpIHtcbiAgICAgIHJldHVybiBub2RlLnByb3BlcnR5Lm5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlzU3RyaW5nTGl0ZXJhbCA9IHQuaXNTdHJpbmdMaXRlcmFsO1xuXG4gIHBhcnNlU3RyaW5nTGl0ZXJhbChzdHI6IHQuRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgYXNzZXJ0KHN0ciwgdC5pc1N0cmluZ0xpdGVyYWwsICdhIHN0cmluZyBsaXRlcmFsJyk7XG4gICAgcmV0dXJuIHN0ci52YWx1ZTtcbiAgfVxuXG4gIGlzTnVtZXJpY0xpdGVyYWwgPSB0LmlzTnVtZXJpY0xpdGVyYWw7XG5cbiAgcGFyc2VOdW1lcmljTGl0ZXJhbChudW06IHQuRXhwcmVzc2lvbik6IG51bWJlciB7XG4gICAgYXNzZXJ0KG51bSwgdC5pc051bWVyaWNMaXRlcmFsLCAnYSBudW1lcmljIGxpdGVyYWwnKTtcbiAgICByZXR1cm4gbnVtLnZhbHVlO1xuICB9XG5cbiAgaXNCb29sZWFuTGl0ZXJhbChib29sOiB0LkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdC5pc0Jvb2xlYW5MaXRlcmFsKGJvb2wpIHx8IGlzTWluaWZpZWRCb29sZWFuTGl0ZXJhbChib29sKTtcbiAgfVxuXG4gIHBhcnNlQm9vbGVhbkxpdGVyYWwoYm9vbDogdC5FeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHQuaXNCb29sZWFuTGl0ZXJhbChib29sKSkge1xuICAgICAgcmV0dXJuIGJvb2wudmFsdWU7XG4gICAgfSBlbHNlIGlmIChpc01pbmlmaWVkQm9vbGVhbkxpdGVyYWwoYm9vbCkpIHtcbiAgICAgIHJldHVybiAhYm9vbC5hcmd1bWVudC52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEZhdGFsTGlua2VyRXJyb3IoYm9vbCwgJ1Vuc3VwcG9ydGVkIHN5bnRheCwgZXhwZWN0ZWQgYSBib29sZWFuIGxpdGVyYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaXNBcnJheUxpdGVyYWwgPSB0LmlzQXJyYXlFeHByZXNzaW9uO1xuXG4gIHBhcnNlQXJyYXlMaXRlcmFsKGFycmF5OiB0LkV4cHJlc3Npb24pOiB0LkV4cHJlc3Npb25bXSB7XG4gICAgYXNzZXJ0KGFycmF5LCB0LmlzQXJyYXlFeHByZXNzaW9uLCAnYW4gYXJyYXkgbGl0ZXJhbCcpO1xuICAgIHJldHVybiBhcnJheS5lbGVtZW50cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICBhc3NlcnQoZWxlbWVudCwgaXNOb3RFbXB0eUVsZW1lbnQsICdlbGVtZW50IGluIGFycmF5IG5vdCB0byBiZSBlbXB0eScpO1xuICAgICAgYXNzZXJ0KGVsZW1lbnQsIGlzTm90U3ByZWFkRWxlbWVudCwgJ2VsZW1lbnQgaW4gYXJyYXkgbm90IHRvIHVzZSBzcHJlYWQgc3ludGF4Jyk7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9KTtcbiAgfVxuXG4gIGlzT2JqZWN0TGl0ZXJhbCA9IHQuaXNPYmplY3RFeHByZXNzaW9uO1xuXG4gIHBhcnNlT2JqZWN0TGl0ZXJhbChvYmo6IHQuRXhwcmVzc2lvbik6IE1hcDxzdHJpbmcsIHQuRXhwcmVzc2lvbj4ge1xuICAgIGFzc2VydChvYmosIHQuaXNPYmplY3RFeHByZXNzaW9uLCAnYW4gb2JqZWN0IGxpdGVyYWwnKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCB0LkV4cHJlc3Npb24+KCk7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmoucHJvcGVydGllcykge1xuICAgICAgYXNzZXJ0KHByb3BlcnR5LCB0LmlzT2JqZWN0UHJvcGVydHksICdhIHByb3BlcnR5IGFzc2lnbm1lbnQnKTtcbiAgICAgIGFzc2VydChwcm9wZXJ0eS52YWx1ZSwgdC5pc0V4cHJlc3Npb24sICdhbiBleHByZXNzaW9uJyk7XG4gICAgICBhc3NlcnQocHJvcGVydHkua2V5LCBpc1Byb3BlcnR5TmFtZSwgJ2EgcHJvcGVydHkgbmFtZScpO1xuICAgICAgY29uc3Qga2V5ID0gdC5pc0lkZW50aWZpZXIocHJvcGVydHkua2V5KSA/IHByb3BlcnR5LmtleS5uYW1lIDogcHJvcGVydHkua2V5LnZhbHVlO1xuICAgICAgcmVzdWx0LnNldChrZXksIHByb3BlcnR5LnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlzRnVuY3Rpb25FeHByZXNzaW9uKG5vZGU6IHQuRXhwcmVzc2lvbik6IG5vZGUgaXMgRXh0cmFjdDx0LkZ1bmN0aW9uLCB0LkV4cHJlc3Npb24+IHtcbiAgICByZXR1cm4gdC5pc0Z1bmN0aW9uKG5vZGUpO1xuICB9XG5cbiAgcGFyc2VSZXR1cm5WYWx1ZShmbjogdC5FeHByZXNzaW9uKTogdC5FeHByZXNzaW9uIHtcbiAgICBhc3NlcnQoZm4sIHRoaXMuaXNGdW5jdGlvbkV4cHJlc3Npb24sICdhIGZ1bmN0aW9uJyk7XG4gICAgaWYgKCF0LmlzQmxvY2tTdGF0ZW1lbnQoZm4uYm9keSkpIHtcbiAgICAgIC8vIGl0IGlzIGEgc2ltcGxlIGFycmF5IGZ1bmN0aW9uIGV4cHJlc3Npb246IGAoLi4uKSA9PiBleHByYFxuICAgICAgcmV0dXJuIGZuLmJvZHk7XG4gICAgfVxuXG4gICAgLy8gaXQgaXMgYSBmdW5jdGlvbiAoYXJyb3cgb3Igbm9ybWFsKSB3aXRoIGEgYm9keS4gRS5nLjpcbiAgICAvLyAqIGAoLi4uKSA9PiB7IHN0bXQ7IC4uLiB9YFxuICAgIC8vICogYGZ1bmN0aW9uKC4uLikgeyBzdG10OyAuLi4gfWBcblxuICAgIGlmIChmbi5ib2R5LmJvZHkubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRmF0YWxMaW5rZXJFcnJvcihcbiAgICAgICAgICBmbi5ib2R5LCAnVW5zdXBwb3J0ZWQgc3ludGF4LCBleHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHkgd2l0aCBhIHNpbmdsZSByZXR1cm4gc3RhdGVtZW50LicpO1xuICAgIH1cbiAgICBjb25zdCBzdG10ID0gZm4uYm9keS5ib2R5WzBdO1xuICAgIGFzc2VydChzdG10LCB0LmlzUmV0dXJuU3RhdGVtZW50LCAnYSBmdW5jdGlvbiBib2R5IHdpdGggYSBzaW5nbGUgcmV0dXJuIHN0YXRlbWVudCcpO1xuICAgIGlmIChzdG10LmFyZ3VtZW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRmF0YWxMaW5rZXJFcnJvcihzdG10LCAnVW5zdXBwb3J0ZWQgc3ludGF4LCBleHBlY3RlZCBmdW5jdGlvbiB0byByZXR1cm4gYSB2YWx1ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RtdC5hcmd1bWVudDtcbiAgfVxuXG4gIGlzQ2FsbEV4cHJlc3Npb24gPSB0LmlzQ2FsbEV4cHJlc3Npb247XG4gIHBhcnNlQ2FsbGVlKGNhbGw6IHQuRXhwcmVzc2lvbik6IHQuRXhwcmVzc2lvbiB7XG4gICAgYXNzZXJ0KGNhbGwsIHQuaXNDYWxsRXhwcmVzc2lvbiwgJ2EgY2FsbCBleHByZXNzaW9uJyk7XG4gICAgYXNzZXJ0KGNhbGwuY2FsbGVlLCB0LmlzRXhwcmVzc2lvbiwgJ2FuIGV4cHJlc3Npb24nKTtcbiAgICByZXR1cm4gY2FsbC5jYWxsZWU7XG4gIH1cbiAgcGFyc2VBcmd1bWVudHMoY2FsbDogdC5FeHByZXNzaW9uKTogdC5FeHByZXNzaW9uW10ge1xuICAgIGFzc2VydChjYWxsLCB0LmlzQ2FsbEV4cHJlc3Npb24sICdhIGNhbGwgZXhwcmVzc2lvbicpO1xuICAgIHJldHVybiBjYWxsLmFyZ3VtZW50cy5tYXAoYXJnID0+IHtcbiAgICAgIGFzc2VydChhcmcsIGlzTm90U3ByZWFkQXJndW1lbnQsICdhcmd1bWVudCBub3QgdG8gdXNlIHNwcmVhZCBzeW50YXgnKTtcbiAgICAgIGFzc2VydChhcmcsIHQuaXNFeHByZXNzaW9uLCAnYXJndW1lbnQgdG8gYmUgYW4gZXhwcmVzc2lvbicpO1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9KTtcbiAgfVxuXG4gIGdldFJhbmdlKG5vZGU6IHQuRXhwcmVzc2lvbik6IFJhbmdlIHtcbiAgICBpZiAobm9kZS5sb2MgPT0gbnVsbCB8fCBub2RlLnN0YXJ0ID09PSBudWxsIHx8IG5vZGUuZW5kID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRmF0YWxMaW5rZXJFcnJvcihcbiAgICAgICAgICBub2RlLCAnVW5hYmxlIHRvIHJlYWQgcmFuZ2UgZm9yIG5vZGUgLSBpdCBpcyBtaXNzaW5nIGxvY2F0aW9uIGluZm9ybWF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRMaW5lOiBub2RlLmxvYy5zdGFydC5saW5lIC0gMSwgIC8vIEJhYmVsIGxpbmVzIGFyZSAxLWJhc2VkXG4gICAgICBzdGFydENvbDogbm9kZS5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgc3RhcnRQb3M6IG5vZGUuc3RhcnQsXG4gICAgICBlbmRQb3M6IG5vZGUuZW5kLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBkb2VzIG5vdCByZXByZXNlbnQgYW4gZW1wdHkgZWxlbWVudCBpbiBhbiBhcnJheSBsaXRlcmFsLlxuICogRm9yIGV4YW1wbGUgaW4gYFssZm9vXWAgdGhlIGZpcnN0IGVsZW1lbnQgaXMgXCJlbXB0eVwiLlxuICovXG5mdW5jdGlvbiBpc05vdEVtcHR5RWxlbWVudChlOiB0LkV4cHJlc3Npb258dC5TcHJlYWRFbGVtZW50fG51bGwpOiBlIGlzIHQuRXhwcmVzc2lvbnxcbiAgICB0LlNwcmVhZEVsZW1lbnQge1xuICByZXR1cm4gZSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBpcyBub3QgYSBzcHJlYWQgZWxlbWVudCBvZiBhbiBhcnJheSBsaXRlcmFsLlxuICogRm9yIGV4YW1wbGUgaW4gYFt4LCAuLi5yZXN0XWAgdGhlIGAuLi5yZXN0YCBleHByZXNzaW9uIGlzIGEgc3ByZWFkIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlzTm90U3ByZWFkRWxlbWVudChlOiB0LkV4cHJlc3Npb258dC5TcHJlYWRFbGVtZW50KTogZSBpcyB0LkV4cHJlc3Npb24ge1xuICByZXR1cm4gIXQuaXNTcHJlYWRFbGVtZW50KGUpO1xufVxuXG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gY2FuIGJlIGNvbnNpZGVyZWQgYSB0ZXh0IGJhc2VkIHByb3BlcnR5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvcGVydHlOYW1lKGU6IHQuRXhwcmVzc2lvbik6IGUgaXMgdC5JZGVudGlmaWVyfHQuU3RyaW5nTGl0ZXJhbHx0Lk51bWVyaWNMaXRlcmFsIHtcbiAgcmV0dXJuIHQuaXNJZGVudGlmaWVyKGUpIHx8IHQuaXNTdHJpbmdMaXRlcmFsKGUpIHx8IHQuaXNOdW1lcmljTGl0ZXJhbChlKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVjbGFyZWQgdHlwZSBvZiBhbiBhcmd1bWVudCB0byBhIGNhbGwgZXhwcmVzc2lvbi5cbiAqL1xudHlwZSBBcmd1bWVudFR5cGUgPSB0LkNhbGxFeHByZXNzaW9uWydhcmd1bWVudHMnXVtudW1iZXJdO1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBzcHJlYWQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gaXNOb3RTcHJlYWRBcmd1bWVudChhcmc6IEFyZ3VtZW50VHlwZSk6IGFyZyBpcyBFeGNsdWRlPEFyZ3VtZW50VHlwZSwgdC5TcHJlYWRFbGVtZW50PiB7XG4gIHJldHVybiAhdC5pc1NwcmVhZEVsZW1lbnQoYXJnKTtcbn1cblxudHlwZSBNaW5pZmllZEJvb2xlYW5MaXRlcmFsID0gdC5FeHByZXNzaW9uJnQuVW5hcnlFeHByZXNzaW9uJnthcmd1bWVudDogdC5OdW1lcmljTGl0ZXJhbH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgZWl0aGVyIGAhMGAgb3IgYCExYC5cbiAqL1xuZnVuY3Rpb24gaXNNaW5pZmllZEJvb2xlYW5MaXRlcmFsKG5vZGU6IHQuRXhwcmVzc2lvbik6IG5vZGUgaXMgTWluaWZpZWRCb29sZWFuTGl0ZXJhbCB7XG4gIHJldHVybiB0LmlzVW5hcnlFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUucHJlZml4ICYmIG5vZGUub3BlcmF0b3IgPT09ICchJyAmJlxuICAgICAgdC5pc051bWVyaWNMaXRlcmFsKG5vZGUuYXJndW1lbnQpICYmIChub2RlLmFyZ3VtZW50LnZhbHVlID09PSAwIHx8IG5vZGUuYXJndW1lbnQudmFsdWUgPT09IDEpO1xufVxuIl19
Note: See TracBrowser for help on using the repository browser.