UNPKG

nuclide-format-js

Version:

A collection of codemods to help auto format javascript

329 lines (284 loc) 23.9 kB
'use strict'; var _getJSXIdentifierName = require('./getJSXIdentifierName'); var _getJSXIdentifierName2 = _interopRequireDefault(_getJSXIdentifierName); var _getNamesFromID = require('./getNamesFromID'); var _getNamesFromID2 = _interopRequireDefault(_getNamesFromID); var _jscodeshift = require('jscodeshift'); var _jscodeshift2 = _interopRequireDefault(_jscodeshift); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var REACT_NODE = _jscodeshift2.default.identifier('React'); /** * These are the ways in which one might access an undeclared identifier. This * should only apply to actual code, not accessing undeclared types. */ /* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * * */ var CONFIG = [ // foo; { nodeType: _jscodeshift2.default.ExpressionStatement, getNodes: function getNodes(path) { return [path.node.expression]; } }, // foo(bar); { nodeType: _jscodeshift2.default.CallExpression, getNodes: function getNodes(path) { return [path.node.callee].concat(path.node.arguments); } }, // foo.declared; { nodeType: _jscodeshift2.default.MemberExpression, getNodes: function getNodes(path) { return [path.node.object]; } }, // foo = bar; { nodeType: _jscodeshift2.default.AssignmentExpression, getNodes: function getNodes(path) { return [path.node.left, path.node.right]; } }, // class declared extends foo {} { nodeType: _jscodeshift2.default.ClassDeclaration, getNodes: function getNodes(path) { return [path.node.superClass]; } }, // var declared = foo; { nodeType: _jscodeshift2.default.VariableDeclarator, getNodes: function getNodes(path) { return [path.node.init]; } }, // switch (declared) { case foo: break; } { nodeType: _jscodeshift2.default.SwitchCase, getNodes: function getNodes(path) { return [path.node.test]; } }, // {declared: foo} { nodeType: _jscodeshift2.default.ObjectExpression, // Generally props have a value, if it is a spread property it doesn't. getNodes: function getNodes(path) { return path.node.properties.map(function (prop) { return prop.value || prop; }); } }, // return foo; { nodeType: _jscodeshift2.default.ReturnStatement, getNodes: function getNodes(path) { return [path.node.argument]; } }, // if (foo) {} { nodeType: _jscodeshift2.default.IfStatement, getNodes: function getNodes(path) { return [path.node.test]; } }, // switch (foo) {} { nodeType: _jscodeshift2.default.SwitchStatement, getNodes: function getNodes(path) { return [path.node.discriminant]; } }, // !foo; { nodeType: _jscodeshift2.default.UnaryExpression, getNodes: function getNodes(path) { return [path.node.argument]; } }, // foo || bar; { nodeType: _jscodeshift2.default.BinaryExpression, getNodes: function getNodes(path) { return [path.node.left, path.node.right]; } }, // foo < bar; { nodeType: _jscodeshift2.default.LogicalExpression, getNodes: function getNodes(path) { return [path.node.left, path.node.right]; } }, // foo ? bar : baz; { nodeType: _jscodeshift2.default.ConditionalExpression, getNodes: function getNodes(path) { return [path.node.test, path.node.alternate, path.node.consequent]; } }, // new Foo() { nodeType: _jscodeshift2.default.NewExpression, getNodes: function getNodes(path) { return [path.node.callee].concat(path.node.arguments); } }, // foo++; { nodeType: _jscodeshift2.default.UpdateExpression, getNodes: function getNodes(path) { return [path.node.argument]; } }, // <Element attribute={foo} /> { nodeType: _jscodeshift2.default.JSXExpressionContainer, getNodes: function getNodes(path) { return [path.node.expression]; } }, // for (foo in bar) {} { nodeType: _jscodeshift2.default.ForInStatement, getNodes: function getNodes(path) { return [path.node.left, path.node.right]; } }, // for (foo of bar) {} { nodeType: _jscodeshift2.default.ForOfStatement, getNodes: function getNodes(path) { return [path.node.left, path.node.right]; } }, // for (foo; bar; baz) {} { nodeType: _jscodeshift2.default.ForStatement, getNodes: function getNodes(path) { return [path.node.init, path.node.test, path.node.update]; } }, // while (foo) {} { nodeType: _jscodeshift2.default.WhileStatement, getNodes: function getNodes(path) { return [path.node.test]; } }, // do {} while (foo) { nodeType: _jscodeshift2.default.DoWhileStatement, getNodes: function getNodes(path) { return [path.node.test]; } }, // [foo] { nodeType: _jscodeshift2.default.ArrayExpression, getNodes: function getNodes(path) { return path.node.elements; } }, // Special case. Any JSX elements will get transpiled to use React. { nodeType: _jscodeshift2.default.JSXOpeningElement, getNodes: function getNodes(path, options) { return (0, _getJSXIdentifierName2.default)(path).concat(shouldRequireReact(path, options) ? [REACT_NODE] : []); } }, // foo`something` { nodeType: _jscodeshift2.default.TaggedTemplateExpression, getNodes: function getNodes(path) { return [path.node.tag]; } }, // `${bar}` { nodeType: _jscodeshift2.default.TemplateLiteral, getNodes: function getNodes(path) { return path.node.expressions; } }, // function foo(a = b) {} { nodeType: _jscodeshift2.default.AssignmentPattern, getNodes: function getNodes(path) { return [path.node.right]; } }, // (foo: SomeType) { nodeType: _jscodeshift2.default.TypeCastExpression, getNodes: function getNodes(path) { return [path.node.expression]; } }]; /** * This will get a list of all identifiers that are not from a declaration. * * NOTE: this can get identifiers that are declared, if you want access to * identifiers that are access but undeclared see getUndeclaredIdentifiers */ function getNonDeclarationIdentifiers(root, options) { var ids = new Set(); var visitor = {}; CONFIG.forEach(function (config) { visitor['visit' + config.nodeType] = function (path) { var nodes = config.getNodes(path, options); nodes.forEach(function (node) { var names = (0, _getNamesFromID2.default)(node); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = names[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var name = _step.value; ids.add(name); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } }); this.traverse(path); }; }); _jscodeshift2.default.types.visit(root.nodes()[0], visitor); return ids; } function shouldRequireReact(path, options) { var tag = path.node.name; if (_jscodeshift2.default.JSXNamespacedName.check(tag)) { return !options.jsxNonReactNames.has(tag.namespace.name); } if (_jscodeshift2.default.JSXIdentifier.check(tag)) { return !options.jsxNonReactNames.has(tag.name); } return true; } module.exports = getNonDeclarationIdentifiers; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vdXRpbHMvZ2V0Tm9uRGVjbGFyYXRpb25JZGVudGlmaWVycy5qcyJdLCJuYW1lcyI6WyJSRUFDVF9OT0RFIiwiaWRlbnRpZmllciIsIkNPTkZJRyIsIm5vZGVUeXBlIiwiRXhwcmVzc2lvblN0YXRlbWVudCIsImdldE5vZGVzIiwicGF0aCIsIm5vZGUiLCJleHByZXNzaW9uIiwiQ2FsbEV4cHJlc3Npb24iLCJjYWxsZWUiLCJjb25jYXQiLCJhcmd1bWVudHMiLCJNZW1iZXJFeHByZXNzaW9uIiwib2JqZWN0IiwiQXNzaWdubWVudEV4cHJlc3Npb24iLCJsZWZ0IiwicmlnaHQiLCJDbGFzc0RlY2xhcmF0aW9uIiwic3VwZXJDbGFzcyIsIlZhcmlhYmxlRGVjbGFyYXRvciIsImluaXQiLCJTd2l0Y2hDYXNlIiwidGVzdCIsIk9iamVjdEV4cHJlc3Npb24iLCJwcm9wZXJ0aWVzIiwibWFwIiwicHJvcCIsInZhbHVlIiwiUmV0dXJuU3RhdGVtZW50IiwiYXJndW1lbnQiLCJJZlN0YXRlbWVudCIsIlN3aXRjaFN0YXRlbWVudCIsImRpc2NyaW1pbmFudCIsIlVuYXJ5RXhwcmVzc2lvbiIsIkJpbmFyeUV4cHJlc3Npb24iLCJMb2dpY2FsRXhwcmVzc2lvbiIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsImFsdGVybmF0ZSIsImNvbnNlcXVlbnQiLCJOZXdFeHByZXNzaW9uIiwiVXBkYXRlRXhwcmVzc2lvbiIsIkpTWEV4cHJlc3Npb25Db250YWluZXIiLCJGb3JJblN0YXRlbWVudCIsIkZvck9mU3RhdGVtZW50IiwiRm9yU3RhdGVtZW50IiwidXBkYXRlIiwiV2hpbGVTdGF0ZW1lbnQiLCJEb1doaWxlU3RhdGVtZW50IiwiQXJyYXlFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJKU1hPcGVuaW5nRWxlbWVudCIsIm9wdGlvbnMiLCJzaG91bGRSZXF1aXJlUmVhY3QiLCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iLCJ0YWciLCJUZW1wbGF0ZUxpdGVyYWwiLCJleHByZXNzaW9ucyIsIkFzc2lnbm1lbnRQYXR0ZXJuIiwiVHlwZUNhc3RFeHByZXNzaW9uIiwiZ2V0Tm9uRGVjbGFyYXRpb25JZGVudGlmaWVycyIsInJvb3QiLCJpZHMiLCJTZXQiLCJ2aXNpdG9yIiwiZm9yRWFjaCIsImNvbmZpZyIsIm5vZGVzIiwibmFtZXMiLCJuYW1lIiwiYWRkIiwidHJhdmVyc2UiLCJ0eXBlcyIsInZpc2l0IiwiSlNYTmFtZXNwYWNlZE5hbWUiLCJjaGVjayIsImpzeE5vblJlYWN0TmFtZXMiLCJoYXMiLCJuYW1lc3BhY2UiLCJKU1hJZGVudGlmaWVyIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFhQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQU9BLElBQU1BLGFBQWEsc0JBQUtDLFVBQUwsQ0FBZ0IsT0FBaEIsQ0FBbkI7O0FBRUE7Ozs7QUF4QkE7Ozs7Ozs7Ozs7QUE0QkEsSUFBTUMsU0FBNkI7QUFDakM7QUFDQTtBQUNFQyxZQUFVLHNCQUFLQyxtQkFEakI7QUFFRUMsWUFBVTtBQUFBLFdBQVEsQ0FBQ0MsS0FBS0MsSUFBTCxDQUFVQyxVQUFYLENBQVI7QUFBQTtBQUZaLENBRmlDOztBQU9qQztBQUNBO0FBQ0VMLFlBQVUsc0JBQUtNLGNBRGpCO0FBRUVKLFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVUcsTUFBWCxFQUFtQkMsTUFBbkIsQ0FBMEJMLEtBQUtDLElBQUwsQ0FBVUssU0FBcEMsQ0FBUjtBQUFBO0FBRlosQ0FSaUM7O0FBYWpDO0FBQ0E7QUFDRVQsWUFBVSxzQkFBS1UsZ0JBRGpCO0FBRUVSLFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVU8sTUFBWCxDQUFSO0FBQUE7QUFGWixDQWRpQzs7QUFtQmpDO0FBQ0E7QUFDRVgsWUFBVSxzQkFBS1ksb0JBRGpCO0FBRUVWLFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVVMsSUFBWCxFQUFpQlYsS0FBS0MsSUFBTCxDQUFVVSxLQUEzQixDQUFSO0FBQUE7QUFGWixDQXBCaUM7O0FBeUJqQztBQUNBO0FBQ0VkLFlBQVUsc0JBQUtlLGdCQURqQjtBQUVFYixZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVVZLFVBQVgsQ0FBUjtBQUFBO0FBRlosQ0ExQmlDOztBQStCakM7QUFDQTtBQUNFaEIsWUFBVSxzQkFBS2lCLGtCQURqQjtBQUVFZixZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVVjLElBQVgsQ0FBUjtBQUFBO0FBRlosQ0FoQ2lDOztBQXFDakM7QUFDQTtBQUNFbEIsWUFBVSxzQkFBS21CLFVBRGpCO0FBRUVqQixZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVVnQixJQUFYLENBQVI7QUFBQTtBQUZaLENBdENpQzs7QUEyQ2pDO0FBQ0E7QUFDRXBCLFlBQVUsc0JBQUtxQixnQkFEakI7QUFFRTtBQUNBbkIsWUFBVTtBQUFBLFdBQVFDLEtBQUtDLElBQUwsQ0FBVWtCLFVBQVYsQ0FBcUJDLEdBQXJCLENBQXlCO0FBQUEsYUFBUUMsS0FBS0MsS0FBTCxJQUFjRCxJQUF0QjtBQUFBLEtBQXpCLENBQVI7QUFBQTtBQUhaLENBNUNpQzs7QUFrRGpDO0FBQ0E7QUFDRXhCLFlBQVUsc0JBQUswQixlQURqQjtBQUVFeEIsWUFBVTtBQUFBLFdBQVEsQ0FBQ0MsS0FBS0MsSUFBTCxDQUFVdUIsUUFBWCxDQUFSO0FBQUE7QUFGWixDQW5EaUM7O0FBd0RqQztBQUNBO0FBQ0UzQixZQUFVLHNCQUFLNEIsV0FEakI7QUFFRTFCLFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVWdCLElBQVgsQ0FBUjtBQUFBO0FBRlosQ0F6RGlDOztBQThEakM7QUFDQTtBQUNFcEIsWUFBVSxzQkFBSzZCLGVBRGpCO0FBRUUzQixZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVUwQixZQUFYLENBQVI7QUFBQTtBQUZaLENBL0RpQzs7QUFvRWpDO0FBQ0E7QUFDRTlCLFlBQVUsc0JBQUsrQixlQURqQjtBQUVFN0IsWUFBVTtBQUFBLFdBQVEsQ0FBQ0MsS0FBS0MsSUFBTCxDQUFVdUIsUUFBWCxDQUFSO0FBQUE7QUFGWixDQXJFaUM7O0FBMEVqQztBQUNBO0FBQ0UzQixZQUFVLHNCQUFLZ0MsZ0JBRGpCO0FBRUU5QixZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVVTLElBQVgsRUFBaUJWLEtBQUtDLElBQUwsQ0FBVVUsS0FBM0IsQ0FBUjtBQUFBO0FBRlosQ0EzRWlDOztBQWdGakM7QUFDQTtBQUNFZCxZQUFVLHNCQUFLaUMsaUJBRGpCO0FBRUUvQixZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVVTLElBQVgsRUFBaUJWLEtBQUtDLElBQUwsQ0FBVVUsS0FBM0IsQ0FBUjtBQUFBO0FBRlosQ0FqRmlDOztBQXNGakM7QUFDQTtBQUNFZCxZQUFVLHNCQUFLa0MscUJBRGpCO0FBRUVoQyxZQUFVO0FBQUEsV0FBUSxDQUNoQkMsS0FBS0MsSUFBTCxDQUFVZ0IsSUFETSxFQUVoQmpCLEtBQUtDLElBQUwsQ0FBVStCLFNBRk0sRUFHaEJoQyxLQUFLQyxJQUFMLENBQVVnQyxVQUhNLENBQVI7QUFBQTtBQUZaLENBdkZpQzs7QUFnR2pDO0FBQ0E7QUFDRXBDLFlBQVUsc0JBQUtxQyxhQURqQjtBQUVFbkMsWUFBVTtBQUFBLFdBQVEsQ0FBQ0MsS0FBS0MsSUFBTCxDQUFVRyxNQUFYLEVBQW1CQyxNQUFuQixDQUEwQkwsS0FBS0MsSUFBTCxDQUFVSyxTQUFwQyxDQUFSO0FBQUE7QUFGWixDQWpHaUM7O0FBc0dqQztBQUNBO0FBQ0VULFlBQVUsc0JBQUtzQyxnQkFEakI7QUFFRXBDLFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVXVCLFFBQVgsQ0FBUjtBQUFBO0FBRlosQ0F2R2lDOztBQTRHakM7QUFDQTtBQUNFM0IsWUFBVSxzQkFBS3VDLHNCQURqQjtBQUVFckMsWUFBVTtBQUFBLFdBQVEsQ0FBQ0MsS0FBS0MsSUFBTCxDQUFVQyxVQUFYLENBQVI7QUFBQTtBQUZaLENBN0dpQzs7QUFrSGpDO0FBQ0E7QUFDRUwsWUFBVSxzQkFBS3dDLGNBRGpCO0FBRUV0QyxZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVVTLElBQVgsRUFBaUJWLEtBQUtDLElBQUwsQ0FBVVUsS0FBM0IsQ0FBUjtBQUFBO0FBRlosQ0FuSGlDOztBQXdIakM7QUFDQTtBQUNFZCxZQUFVLHNCQUFLeUMsY0FEakI7QUFFRXZDLFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVVMsSUFBWCxFQUFpQlYsS0FBS0MsSUFBTCxDQUFVVSxLQUEzQixDQUFSO0FBQUE7QUFGWixDQXpIaUM7O0FBOEhqQztBQUNBO0FBQ0VkLFlBQVUsc0JBQUswQyxZQURqQjtBQUVFeEMsWUFBVTtBQUFBLFdBQVEsQ0FBQ0MsS0FBS0MsSUFBTCxDQUFVYyxJQUFYLEVBQWlCZixLQUFLQyxJQUFMLENBQVVnQixJQUEzQixFQUFpQ2pCLEtBQUtDLElBQUwsQ0FBVXVDLE1BQTNDLENBQVI7QUFBQTtBQUZaLENBL0hpQzs7QUFvSWpDO0FBQ0E7QUFDRTNDLFlBQVUsc0JBQUs0QyxjQURqQjtBQUVFMUMsWUFBVTtBQUFBLFdBQVEsQ0FBQ0MsS0FBS0MsSUFBTCxDQUFVZ0IsSUFBWCxDQUFSO0FBQUE7QUFGWixDQXJJaUM7O0FBMElqQztBQUNBO0FBQ0VwQixZQUFVLHNCQUFLNkMsZ0JBRGpCO0FBRUUzQyxZQUFVO0FBQUEsV0FBUSxDQUFDQyxLQUFLQyxJQUFMLENBQVVnQixJQUFYLENBQVI7QUFBQTtBQUZaLENBM0lpQzs7QUFnSmpDO0FBQ0E7QUFDRXBCLFlBQVUsc0JBQUs4QyxlQURqQjtBQUVFNUMsWUFBVTtBQUFBLFdBQVFDLEtBQUtDLElBQUwsQ0FBVTJDLFFBQWxCO0FBQUE7QUFGWixDQWpKaUM7O0FBc0pqQztBQUNBO0FBQ0UvQyxZQUFVLHNCQUFLZ0QsaUJBRGpCO0FBRUU5QyxZQUFVLGtCQUFDQyxJQUFELEVBQU84QyxPQUFQO0FBQUEsV0FDUixvQ0FBcUI5QyxJQUFyQixFQUEyQkssTUFBM0IsQ0FDRTBDLG1CQUFtQi9DLElBQW5CLEVBQXlCOEMsT0FBekIsSUFDSSxDQUFDcEQsVUFBRCxDQURKLEdBRUksRUFITixDQURRO0FBQUE7QUFGWixDQXZKaUM7O0FBaUtqQztBQUNBO0FBQ0VHLFlBQVUsc0JBQUttRCx3QkFEakI7QUFFRWpELFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVWdELEdBQVgsQ0FBUjtBQUFBO0FBRlosQ0FsS2lDOztBQXVLakM7QUFDQTtBQUNFcEQsWUFBVSxzQkFBS3FELGVBRGpCO0FBRUVuRCxZQUFVO0FBQUEsV0FBUUMsS0FBS0MsSUFBTCxDQUFVa0QsV0FBbEI7QUFBQTtBQUZaLENBeEtpQzs7QUE2S2pDO0FBQ0E7QUFDRXRELFlBQVUsc0JBQUt1RCxpQkFEakI7QUFFRXJELFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVVUsS0FBWCxDQUFSO0FBQUE7QUFGWixDQTlLaUM7O0FBbUxqQztBQUNBO0FBQ0VkLFlBQVUsc0JBQUt3RCxrQkFEakI7QUFFRXRELFlBQVU7QUFBQSxXQUFRLENBQUNDLEtBQUtDLElBQUwsQ0FBVUMsVUFBWCxDQUFSO0FBQUE7QUFGWixDQXBMaUMsQ0FBbkM7O0FBMExBOzs7Ozs7QUFNQSxTQUFTb0QsNEJBQVQsQ0FBc0NDLElBQXRDLEVBQXdEVCxPQUF4RCxFQUE2RjtBQUMzRixNQUFNVSxNQUFNLElBQUlDLEdBQUosRUFBWjtBQUNBLE1BQU1DLFVBQVUsRUFBaEI7O0FBRUE5RCxTQUFPK0QsT0FBUCxDQUFlLGtCQUFVO0FBQ3ZCRCxzQkFBZ0JFLE9BQU8vRCxRQUF2QixJQUFxQyxVQUFTRyxJQUFULEVBQWU7QUFDbEQsVUFBTTZELFFBQVFELE9BQU83RCxRQUFQLENBQWdCQyxJQUFoQixFQUFzQjhDLE9BQXRCLENBQWQ7QUFDQWUsWUFBTUYsT0FBTixDQUFjLGdCQUFRO0FBQ3BCLFlBQU1HLFFBQVEsOEJBQWU3RCxJQUFmLENBQWQ7QUFEb0I7QUFBQTtBQUFBOztBQUFBO0FBRXBCLCtCQUFtQjZELEtBQW5CLDhIQUEwQjtBQUFBLGdCQUFmQyxJQUFlOztBQUN4QlAsZ0JBQUlRLEdBQUosQ0FBUUQsSUFBUjtBQUNEO0FBSm1CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLckIsT0FMRDtBQU1BLFdBQUtFLFFBQUwsQ0FBY2pFLElBQWQ7QUFDRCxLQVREO0FBVUQsR0FYRDs7QUFhQSx3QkFBS2tFLEtBQUwsQ0FBV0MsS0FBWCxDQUFpQlosS0FBS00sS0FBTCxHQUFhLENBQWIsQ0FBakIsRUFBa0NILE9BQWxDO0FBQ0EsU0FBT0YsR0FBUDtBQUNEOztBQUVELFNBQVNULGtCQUFULENBQTRCL0MsSUFBNUIsRUFBNEM4QyxPQUE1QyxFQUE2RTtBQUMzRSxNQUFNRyxNQUFNakQsS0FBS0MsSUFBTCxDQUFVOEQsSUFBdEI7QUFDQSxNQUFJLHNCQUFLSyxpQkFBTCxDQUF1QkMsS0FBdkIsQ0FBNkJwQixHQUE3QixDQUFKLEVBQXVDO0FBQ3JDLFdBQU8sQ0FBQ0gsUUFBUXdCLGdCQUFSLENBQXlCQyxHQUF6QixDQUE2QnRCLElBQUl1QixTQUFKLENBQWNULElBQTNDLENBQVI7QUFDRDtBQUNELE1BQUksc0JBQUtVLGFBQUwsQ0FBbUJKLEtBQW5CLENBQXlCcEIsR0FBekIsQ0FBSixFQUFtQztBQUNqQyxXQUFPLENBQUNILFFBQVF3QixnQkFBUixDQUF5QkMsR0FBekIsQ0FBNkJ0QixJQUFJYyxJQUFqQyxDQUFSO0FBQ0Q7QUFDRCxTQUFPLElBQVA7QUFDRDs7QUFFRFcsT0FBT0MsT0FBUCxHQUFpQnJCLDRCQUFqQiIsImZpbGUiOiJnZXROb25EZWNsYXJhdGlvbklkZW50aWZpZXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW5cbiAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqIEBmbG93XG4gKi9cblxuaW1wb3J0IHR5cGUge0NvbGxlY3Rpb24sIE5vZGUsIE5vZGVQYXRofSBmcm9tICcuLi90eXBlcy9hc3QnO1xuaW1wb3J0IHR5cGUge1NvdXJjZU9wdGlvbnN9IGZyb20gJy4uL29wdGlvbnMvU291cmNlT3B0aW9ucyc7XG5cbmltcG9ydCBnZXRKU1hJZGVudGlmaWVyTmFtZSBmcm9tICcuL2dldEpTWElkZW50aWZpZXJOYW1lJztcbmltcG9ydCBnZXROYW1lc0Zyb21JRCBmcm9tICcuL2dldE5hbWVzRnJvbUlEJztcbmltcG9ydCBqc2NzIGZyb20gJ2pzY29kZXNoaWZ0JztcblxudHlwZSBDb25maWdFbnRyeSA9IHtcbiAgbm9kZVR5cGU6IHN0cmluZyxcbiAgZ2V0Tm9kZXM6IChwYXRoOiBOb2RlUGF0aCwgb3B0aW9uczogU291cmNlT3B0aW9ucykgPT4gQXJyYXk8Tm9kZT4sXG59O1xuXG5jb25zdCBSRUFDVF9OT0RFID0ganNjcy5pZGVudGlmaWVyKCdSZWFjdCcpO1xuXG4vKipcbiAqIFRoZXNlIGFyZSB0aGUgd2F5cyBpbiB3aGljaCBvbmUgbWlnaHQgYWNjZXNzIGFuIHVuZGVjbGFyZWQgaWRlbnRpZmllci4gVGhpc1xuICogc2hvdWxkIG9ubHkgYXBwbHkgdG8gYWN0dWFsIGNvZGUsIG5vdCBhY2Nlc3NpbmcgdW5kZWNsYXJlZCB0eXBlcy5cbiAqL1xuY29uc3QgQ09ORklHOiBBcnJheTxDb25maWdFbnRyeT4gPSBbXG4gIC8vIGZvbztcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLkV4cHJlc3Npb25TdGF0ZW1lbnQsXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5leHByZXNzaW9uXSxcbiAgfSxcblxuICAvLyBmb28oYmFyKTtcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLkNhbGxFeHByZXNzaW9uLFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUuY2FsbGVlXS5jb25jYXQocGF0aC5ub2RlLmFyZ3VtZW50cyksXG4gIH0sXG5cbiAgLy8gZm9vLmRlY2xhcmVkO1xuICB7XG4gICAgbm9kZVR5cGU6IGpzY3MuTWVtYmVyRXhwcmVzc2lvbixcbiAgICBnZXROb2RlczogcGF0aCA9PiBbcGF0aC5ub2RlLm9iamVjdF0sXG4gIH0sXG5cbiAgLy8gZm9vID0gYmFyO1xuICB7XG4gICAgbm9kZVR5cGU6IGpzY3MuQXNzaWdubWVudEV4cHJlc3Npb24sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5sZWZ0LCBwYXRoLm5vZGUucmlnaHRdLFxuICB9LFxuXG4gIC8vIGNsYXNzIGRlY2xhcmVkIGV4dGVuZHMgZm9vIHt9XG4gIHtcbiAgICBub2RlVHlwZToganNjcy5DbGFzc0RlY2xhcmF0aW9uLFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUuc3VwZXJDbGFzc10sXG4gIH0sXG5cbiAgLy8gdmFyIGRlY2xhcmVkID0gZm9vO1xuICB7XG4gICAgbm9kZVR5cGU6IGpzY3MuVmFyaWFibGVEZWNsYXJhdG9yLFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUuaW5pdF0sXG4gIH0sXG5cbiAgLy8gc3dpdGNoIChkZWNsYXJlZCkgeyBjYXNlIGZvbzogYnJlYWs7IH1cbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLlN3aXRjaENhc2UsXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS50ZXN0XSxcbiAgfSxcblxuICAvLyB7ZGVjbGFyZWQ6IGZvb31cbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLk9iamVjdEV4cHJlc3Npb24sXG4gICAgLy8gR2VuZXJhbGx5IHByb3BzIGhhdmUgYSB2YWx1ZSwgaWYgaXQgaXMgYSBzcHJlYWQgcHJvcGVydHkgaXQgZG9lc24ndC5cbiAgICBnZXROb2RlczogcGF0aCA9PiBwYXRoLm5vZGUucHJvcGVydGllcy5tYXAocHJvcCA9PiBwcm9wLnZhbHVlIHx8IHByb3ApLFxuICB9LFxuXG4gIC8vIHJldHVybiBmb287XG4gIHtcbiAgICBub2RlVHlwZToganNjcy5SZXR1cm5TdGF0ZW1lbnQsXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5hcmd1bWVudF0sXG4gIH0sXG5cbiAgLy8gaWYgKGZvbykge31cbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLklmU3RhdGVtZW50LFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUudGVzdF0sXG4gIH0sXG5cbiAgLy8gc3dpdGNoIChmb28pIHt9XG4gIHtcbiAgICBub2RlVHlwZToganNjcy5Td2l0Y2hTdGF0ZW1lbnQsXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5kaXNjcmltaW5hbnRdLFxuICB9LFxuXG4gIC8vICFmb287XG4gIHtcbiAgICBub2RlVHlwZToganNjcy5VbmFyeUV4cHJlc3Npb24sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5hcmd1bWVudF0sXG4gIH0sXG5cbiAgLy8gZm9vIHx8IGJhcjtcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLkJpbmFyeUV4cHJlc3Npb24sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5sZWZ0LCBwYXRoLm5vZGUucmlnaHRdLFxuICB9LFxuXG4gIC8vIGZvbyA8IGJhcjtcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLkxvZ2ljYWxFeHByZXNzaW9uLFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUubGVmdCwgcGF0aC5ub2RlLnJpZ2h0XSxcbiAgfSxcblxuICAvLyBmb28gPyBiYXIgOiBiYXo7XG4gIHtcbiAgICBub2RlVHlwZToganNjcy5Db25kaXRpb25hbEV4cHJlc3Npb24sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW1xuICAgICAgcGF0aC5ub2RlLnRlc3QsXG4gICAgICBwYXRoLm5vZGUuYWx0ZXJuYXRlLFxuICAgICAgcGF0aC5ub2RlLmNvbnNlcXVlbnQsXG4gICAgXSxcbiAgfSxcblxuICAvLyBuZXcgRm9vKClcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLk5ld0V4cHJlc3Npb24sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5jYWxsZWVdLmNvbmNhdChwYXRoLm5vZGUuYXJndW1lbnRzKSxcbiAgfSxcblxuICAvLyBmb28rKztcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLlVwZGF0ZUV4cHJlc3Npb24sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5hcmd1bWVudF0sXG4gIH0sXG5cbiAgLy8gPEVsZW1lbnQgYXR0cmlidXRlPXtmb299IC8+XG4gIHtcbiAgICBub2RlVHlwZToganNjcy5KU1hFeHByZXNzaW9uQ29udGFpbmVyLFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUuZXhwcmVzc2lvbl0sXG4gIH0sXG5cbiAgLy8gZm9yIChmb28gaW4gYmFyKSB7fVxuICB7XG4gICAgbm9kZVR5cGU6IGpzY3MuRm9ySW5TdGF0ZW1lbnQsXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5sZWZ0LCBwYXRoLm5vZGUucmlnaHRdLFxuICB9LFxuXG4gIC8vIGZvciAoZm9vIG9mIGJhcikge31cbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLkZvck9mU3RhdGVtZW50LFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUubGVmdCwgcGF0aC5ub2RlLnJpZ2h0XSxcbiAgfSxcblxuICAvLyBmb3IgKGZvbzsgYmFyOyBiYXopIHt9XG4gIHtcbiAgICBub2RlVHlwZToganNjcy5Gb3JTdGF0ZW1lbnQsXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5pbml0LCBwYXRoLm5vZGUudGVzdCwgcGF0aC5ub2RlLnVwZGF0ZV0sXG4gIH0sXG5cbiAgLy8gd2hpbGUgKGZvbykge31cbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLldoaWxlU3RhdGVtZW50LFxuICAgIGdldE5vZGVzOiBwYXRoID0+IFtwYXRoLm5vZGUudGVzdF0sXG4gIH0sXG5cbiAgLy8gZG8ge30gd2hpbGUgKGZvbylcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLkRvV2hpbGVTdGF0ZW1lbnQsXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS50ZXN0XSxcbiAgfSxcblxuICAvLyBbZm9vXVxuICB7XG4gICAgbm9kZVR5cGU6IGpzY3MuQXJyYXlFeHByZXNzaW9uLFxuICAgIGdldE5vZGVzOiBwYXRoID0+IHBhdGgubm9kZS5lbGVtZW50cyxcbiAgfSxcblxuICAvLyBTcGVjaWFsIGNhc2UuIEFueSBKU1ggZWxlbWVudHMgd2lsbCBnZXQgdHJhbnNwaWxlZCB0byB1c2UgUmVhY3QuXG4gIHtcbiAgICBub2RlVHlwZToganNjcy5KU1hPcGVuaW5nRWxlbWVudCxcbiAgICBnZXROb2RlczogKHBhdGgsIG9wdGlvbnMpID0+XG4gICAgICBnZXRKU1hJZGVudGlmaWVyTmFtZShwYXRoKS5jb25jYXQoXG4gICAgICAgIHNob3VsZFJlcXVpcmVSZWFjdChwYXRoLCBvcHRpb25zKVxuICAgICAgICAgID8gW1JFQUNUX05PREVdXG4gICAgICAgICAgOiBbXSxcbiAgICAgICksXG4gIH0sXG5cbiAgLy8gZm9vYHNvbWV0aGluZ2BcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbixcbiAgICBnZXROb2RlczogcGF0aCA9PiBbcGF0aC5ub2RlLnRhZ10sXG4gIH0sXG5cbiAgLy8gYCR7YmFyfWBcbiAge1xuICAgIG5vZGVUeXBlOiBqc2NzLlRlbXBsYXRlTGl0ZXJhbCxcbiAgICBnZXROb2RlczogcGF0aCA9PiBwYXRoLm5vZGUuZXhwcmVzc2lvbnMsXG4gIH0sXG5cbiAgLy8gZnVuY3Rpb24gZm9vKGEgPSBiKSB7fVxuICB7XG4gICAgbm9kZVR5cGU6IGpzY3MuQXNzaWdubWVudFBhdHRlcm4sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5yaWdodF0sXG4gIH0sXG5cbiAgLy8gKGZvbzogU29tZVR5cGUpXG4gIHtcbiAgICBub2RlVHlwZToganNjcy5UeXBlQ2FzdEV4cHJlc3Npb24sXG4gICAgZ2V0Tm9kZXM6IHBhdGggPT4gW3BhdGgubm9kZS5leHByZXNzaW9uXSxcbiAgfSxcbl07XG5cbi8qKlxuICogVGhpcyB3aWxsIGdldCBhIGxpc3Qgb2YgYWxsIGlkZW50aWZpZXJzIHRoYXQgYXJlIG5vdCBmcm9tIGEgZGVjbGFyYXRpb24uXG4gKlxuICogTk9URTogdGhpcyBjYW4gZ2V0IGlkZW50aWZpZXJzIHRoYXQgYXJlIGRlY2xhcmVkLCBpZiB5b3Ugd2FudCBhY2Nlc3MgdG9cbiAqIGlkZW50aWZpZXJzIHRoYXQgYXJlIGFjY2VzcyBidXQgdW5kZWNsYXJlZCBzZWUgZ2V0VW5kZWNsYXJlZElkZW50aWZpZXJzXG4gKi9cbmZ1bmN0aW9uIGdldE5vbkRlY2xhcmF0aW9uSWRlbnRpZmllcnMocm9vdDogQ29sbGVjdGlvbiwgb3B0aW9uczogU291cmNlT3B0aW9ucyk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuICBjb25zdCB2aXNpdG9yID0ge307XG5cbiAgQ09ORklHLmZvckVhY2goY29uZmlnID0+IHtcbiAgICB2aXNpdG9yW2B2aXNpdCR7Y29uZmlnLm5vZGVUeXBlfWBdID0gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgY29uc3Qgbm9kZXMgPSBjb25maWcuZ2V0Tm9kZXMocGF0aCwgb3B0aW9ucyk7XG4gICAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICBjb25zdCBuYW1lcyA9IGdldE5hbWVzRnJvbUlEKG5vZGUpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICBpZHMuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMudHJhdmVyc2UocGF0aCk7XG4gICAgfTtcbiAgfSk7XG5cbiAganNjcy50eXBlcy52aXNpdChyb290Lm5vZGVzKClbMF0sIHZpc2l0b3IpO1xuICByZXR1cm4gaWRzO1xufVxuXG5mdW5jdGlvbiBzaG91bGRSZXF1aXJlUmVhY3QocGF0aDogTm9kZVBhdGgsIG9wdGlvbnM6IFNvdXJjZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgdGFnID0gcGF0aC5ub2RlLm5hbWU7XG4gIGlmIChqc2NzLkpTWE5hbWVzcGFjZWROYW1lLmNoZWNrKHRhZykpIHtcbiAgICByZXR1cm4gIW9wdGlvbnMuanN4Tm9uUmVhY3ROYW1lcy5oYXModGFnLm5hbWVzcGFjZS5uYW1lKTtcbiAgfVxuICBpZiAoanNjcy5KU1hJZGVudGlmaWVyLmNoZWNrKHRhZykpIHtcbiAgICByZXR1cm4gIW9wdGlvbnMuanN4Tm9uUmVhY3ROYW1lcy5oYXModGFnLm5hbWUpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5vbkRlY2xhcmF0aW9uSWRlbnRpZmllcnM7XG4iXX0=