diff --git a/CHANGELOG.md b/CHANGELOG.md
index 72ab2caf..07e54c39 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## [8.6.4](https://github.com/AtomLinter/linter-eslint/compare/v8.6.3...v8.6.4) (2021-03-24)
+
+
+### Bug Fixes
+
+* remove loading workarounds ([23f20af](https://github.com/AtomLinter/linter-eslint/commit/23f20af3ea5b9c930d6dd49f8acfd99b6afcd46c))
+
## [8.6.3](https://github.com/AtomLinter/linter-eslint/compare/v8.6.2...v8.6.3) (2021-03-23)
diff --git a/dist/helpers.js b/dist/helpers.js
new file mode 100644
index 00000000..c1481410
--- /dev/null
+++ b/dist/helpers.js
@@ -0,0 +1,400 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.startWorker = startWorker;
+exports.killWorker = killWorker;
+exports.sendJob = sendJob;
+exports.getDebugInfo = getDebugInfo;
+exports.generateDebugString = generateDebugString;
+exports.generateUserMessage = generateUserMessage;
+exports.handleError = handleError;
+exports.processESLintMessages = processESLintMessages;
+exports.processJobResponse = processJobResponse;
+exports.rules = void 0;
+
+var _path = require("path");
+
+var _atomLinter = require("atom-linter");
+
+var _cryptoRandomString = _interopRequireDefault(require("crypto-random-string"));
+
+var _atom = require("atom");
+
+var _rules = _interopRequireDefault(require("./rules"));
+
+var _editor = require("./validate/editor");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// eslint-disable-next-line import/no-extraneous-dependencies, import/extensions
+const rules = new _rules.default();
+exports.rules = rules;
+let worker = null;
+/**
+ * Start the worker process if it hasn't already been started
+ */
+
+function startWorker() {
+ if (worker === null) {
+ worker = new _atom.Task(require.resolve('./worker.js'));
+ }
+
+ if (worker.started) {
+ // Worker start request has already been sent
+ return;
+ } // Send empty arguments as we don't use them in the worker
+
+
+ worker.start([]); // NOTE: Modifies the Task of the worker, but it's the only clean way to track this
+
+ worker.started = true;
+}
+/**
+ * Forces the worker Task to kill itself
+ */
+
+
+function killWorker() {
+ if (worker !== null) {
+ worker.terminate();
+ worker = null;
+ }
+}
+/**
+ * Send a job to the worker and return the results
+ * @param {Object} config Configuration for the job to send to the worker
+ * @return {Object|String|Error} The data returned from the worker
+ */
+
+
+async function sendJob(config) {
+ if (worker && !worker.childProcess.connected) {
+ // Sometimes the worker dies and becomes disconnected
+ // When that happens, it seems that there is no way to recover other
+ // than to kill the worker and create a new one.
+ killWorker();
+ } // Ensure the worker is started
+
+
+ startWorker(); // Expand the config with a unique ID to emit on
+ // NOTE: Jobs _must_ have a unique ID as they are completely async and results
+ // can arrive back in any order.
+ // eslint-disable-next-line no-param-reassign
+
+ config.emitKey = (0, _cryptoRandomString.default)({
+ length: 10
+ });
+ return new Promise((resolve, reject) => {
+ // All worker errors are caught and re-emitted along with their associated
+ // emitKey, so that we do not create multiple listeners for the same
+ // 'task:error' event
+ const errSub = worker.on(`workerError:${config.emitKey}`, ({
+ msg,
+ stack
+ }) => {
+ // Re-throw errors from the task
+ const error = new Error(msg); // Set the stack to the one given to us by the worker
+
+ error.stack = stack;
+ errSub.dispose(); // eslint-disable-next-line no-use-before-define
+
+ responseSub.dispose();
+ reject(error);
+ });
+ const responseSub = worker.on(config.emitKey, data => {
+ errSub.dispose();
+ responseSub.dispose();
+ resolve(data);
+ }); // Send the job on to the worker
+
+ try {
+ worker.send(config);
+ } catch (e) {
+ errSub.dispose();
+ responseSub.dispose();
+ console.error(e);
+ }
+ });
+}
+
+async function getDebugInfo() {
+ const textEditor = atom.workspace.getActiveTextEditor();
+ let filePath;
+ let editorScopes;
+
+ if (atom.workspace.isTextEditor(textEditor)) {
+ filePath = textEditor.getPath();
+ editorScopes = textEditor.getLastCursor().getScopeDescriptor().getScopesArray();
+ } else {
+ // Somehow this can be called with no active TextEditor, impossible I know...
+ filePath = 'unknown';
+ editorScopes = ['unknown'];
+ }
+
+ const packagePath = atom.packages.resolvePackagePath('linter-eslint');
+ let linterEslintMeta;
+
+ if (packagePath === undefined) {
+ // Apparently for some users the package path fails to resolve
+ linterEslintMeta = {
+ version: 'unknown!'
+ };
+ } else {
+ // eslint-disable-next-line import/no-dynamic-require
+ linterEslintMeta = require((0, _path.join)(packagePath, 'package.json'));
+ }
+
+ const config = atom.config.get('linter-eslint');
+ const hoursSinceRestart = Math.round(process.uptime() / 3600 * 10) / 10;
+ let returnVal;
+
+ try {
+ const response = await sendJob({
+ type: 'debug',
+ config,
+ filePath
+ });
+ returnVal = {
+ atomVersion: atom.getVersion(),
+ linterEslintVersion: linterEslintMeta.version,
+ linterEslintConfig: config,
+ // eslint-disable-next-line import/no-dynamic-require
+ eslintVersion: require((0, _path.join)(response.path, 'package.json')).version,
+ hoursSinceRestart,
+ platform: process.platform,
+ eslintType: response.type,
+ eslintPath: response.path,
+ editorScopes
+ };
+ } catch (error) {
+ atom.notifications.addError(`${error}`);
+ }
+
+ return returnVal;
+}
+
+async function generateDebugString() {
+ const debug = await getDebugInfo();
+ const details = [`Atom version: ${debug.atomVersion}`, `linter-eslint version: ${debug.linterEslintVersion}`, `ESLint version: ${debug.eslintVersion}`, `Hours since last Atom restart: ${debug.hoursSinceRestart}`, `Platform: ${debug.platform}`, `Using ${debug.eslintType} ESLint from: ${debug.eslintPath}`, `Current file's scopes: ${JSON.stringify(debug.editorScopes, null, 2)}`, `linter-eslint configuration: ${JSON.stringify(debug.linterEslintConfig, null, 2)}`];
+ return details.join('\n');
+}
+/**
+ * Turn the given options into a Linter message array
+ * @param {TextEditor} textEditor The TextEditor to use to build the message
+ * @param {Object} options The parameters used to fill in the message
+ * @param {string} [options.severity='error'] Can be one of: 'error', 'warning', 'info'
+ * @param {string} [options.excerpt=''] Short text to use in the message
+ * @param {string|Function} [options.description] Used to provide additional information
+ * @return {Array} Message to user generated from the parameters
+ */
+
+
+function generateUserMessage(textEditor, options) {
+ const {
+ severity = 'error',
+ excerpt = '',
+ description
+ } = options;
+ return [{
+ severity,
+ excerpt,
+ description,
+ location: {
+ file: textEditor.getPath(),
+ position: (0, _atomLinter.generateRange)(textEditor)
+ }
+ }];
+}
+/**
+ * Generates a message to the user in order to nicely display the Error being
+ * thrown instead of depending on generic error handling.
+ * @param {TextEditor} textEditor The TextEditor to use to build the message
+ * @param {Error} error Error to generate a message for
+ * @return {Array} Message to user generated from the Error
+ */
+
+
+function handleError(textEditor, error) {
+ const {
+ stack,
+ message
+ } = error; // Only show the first line of the message as the excerpt
+
+ const excerpt = `Error while running ESLint: ${message.split('\n')[0]}.`;
+ const description = `
${message}\n
${stack}`;
+ return generateUserMessage(textEditor, {
+ severity: 'error',
+ excerpt,
+ description
+ });
+}
+
+const generateInvalidTrace = async ({
+ msgLine,
+ msgCol,
+ msgEndLine,
+ msgEndCol,
+ eslintFullRange,
+ filePath,
+ textEditor,
+ ruleId,
+ message
+}) => {
+ let errMsgRange = `${msgLine + 1}:${msgCol}`;
+
+ if (eslintFullRange) {
+ errMsgRange += ` - ${msgEndLine + 1}:${msgEndCol + 1}`;
+ }
+
+ const rangeText = `Requested ${eslintFullRange ? 'start point' : 'range'}: ${errMsgRange}`;
+ const issueURL = 'https://github.com/AtomLinter/linter-eslint/issues/new';
+ const titleText = `Invalid position given by '${ruleId}'`;
+ const title = encodeURIComponent(titleText);
+ const body = encodeURIComponent(['ESLint returned a point that did not exist in the document being edited.', `Rule: \`${ruleId}\``, rangeText, '', '', '', '', '', 'Debug information:', '```json', JSON.stringify(await getDebugInfo(), null, 2), '```'].join('\n'));
+ const location = {
+ file: filePath,
+ position: (0, _atomLinter.generateRange)(textEditor, 0)
+ };
+ const newIssueURL = `${issueURL}?title=${title}&body=${body}`;
+ return {
+ severity: 'error',
+ excerpt: `${titleText}. See the description for details. ` + 'Click the URL to open a new issue!',
+ url: newIssueURL,
+ location,
+ description: `${rangeText}\nOriginal message: ${message}`
+ };
+};
+/**
+ * Given a raw response from ESLint, this processes the messages into a format
+ * compatible with the Linter API.
+ * @param {Object} messages The messages from ESLint's response
+ * @param {TextEditor} textEditor The Atom::TextEditor of the file the messages belong to
+ * @param {bool} showRule Whether to show the rule in the messages
+ * @return {Promise} The messages transformed into Linter messages
+ */
+
+
+async function processESLintMessages(messages, textEditor, showRule) {
+ return Promise.all(messages.map(async ({
+ fatal,
+ message: originalMessage,
+ line,
+ severity,
+ ruleId,
+ column,
+ fix,
+ endLine,
+ endColumn
+ }) => {
+ const message = fatal ? originalMessage.split('\n')[0] : originalMessage;
+ const filePath = textEditor.getPath();
+ const textBuffer = textEditor.getBuffer();
+ let linterFix = null;
+
+ if (fix) {
+ const fixRange = new _atom.Range(textBuffer.positionForCharacterIndex(fix.range[0]), textBuffer.positionForCharacterIndex(fix.range[1]));
+ linterFix = {
+ position: fixRange,
+ replaceWith: fix.text
+ };
+ }
+
+ let msgCol;
+ let msgEndLine;
+ let msgEndCol;
+ let eslintFullRange = false;
+ /*
+ Note: ESLint positions are 1-indexed, while Atom expects 0-indexed,
+ positions. We are subtracting 1 from these values here so we don't have to
+ keep doing so in later uses.
+ */
+
+ const msgLine = line - 1;
+
+ if (typeof endColumn === 'number' && typeof endLine === 'number') {
+ eslintFullRange = true; // Here we always want the column to be a number
+
+ msgCol = Math.max(0, column - 1);
+ msgEndLine = endLine - 1;
+ msgEndCol = endColumn - 1;
+ } else {
+ // We want msgCol to remain undefined if it was initially so
+ // `generateRange` will give us a range over the entire line
+ msgCol = typeof column === 'number' ? column - 1 : column;
+ }
+
+ let ret = {
+ severity: severity === 1 ? 'warning' : 'error',
+ location: {
+ file: filePath
+ }
+ };
+
+ if (ruleId) {
+ ret.url = rules.getRuleUrl(ruleId);
+ } // HACK for https://github.com/AtomLinter/linter-eslint/issues/1249
+
+
+ let fixLineEnding = false;
+
+ if (ruleId === 'prettier/prettier' && message === 'Delete `␍`') {
+ fixLineEnding = true;
+ }
+
+ let range;
+
+ try {
+ if (eslintFullRange) {
+ if (!fixLineEnding) {
+ (0, _editor.throwIfInvalidPoint)(textBuffer, msgLine, msgCol);
+ (0, _editor.throwIfInvalidPoint)(textBuffer, msgEndLine, msgEndCol);
+ }
+
+ range = [[msgLine, msgCol], [msgEndLine, msgEndCol]];
+ } else {
+ range = (0, _atomLinter.generateRange)(textEditor, msgLine, msgCol);
+ }
+
+ ret.location.position = range;
+ const ruleAppendix = showRule ? ` (${ruleId || 'Fatal'})` : '';
+ ret.excerpt = `${message}${ruleAppendix}`;
+
+ if (linterFix) {
+ ret.solutions = [linterFix];
+ }
+ } catch (err) {
+ ret = await generateInvalidTrace({
+ msgLine,
+ msgCol,
+ msgEndLine,
+ msgEndCol,
+ eslintFullRange,
+ filePath,
+ textEditor,
+ ruleId,
+ message
+ });
+ }
+
+ return ret;
+ }));
+}
+/**
+ * Processes the response from the lint job
+ * @param {Object} response The raw response from the job
+ * @param {TextEditor} textEditor The Atom::TextEditor of the file the messages belong to
+ * @param {bool} showRule Whether to show the rule in the messages
+ * @return {Promise} The messages transformed into Linter messages
+ */
+
+
+async function processJobResponse(response, textEditor, showRule) {
+ if (Object.prototype.hasOwnProperty.call(response, 'updatedRules')) {
+ rules.replaceRules(response.updatedRules);
+ }
+
+ return processESLintMessages(response.messages, textEditor, showRule);
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbInJ1bGVzIiwiUnVsZXMiLCJ3b3JrZXIiLCJzdGFydFdvcmtlciIsIlRhc2siLCJyZXF1aXJlIiwicmVzb2x2ZSIsInN0YXJ0ZWQiLCJzdGFydCIsImtpbGxXb3JrZXIiLCJ0ZXJtaW5hdGUiLCJzZW5kSm9iIiwiY29uZmlnIiwiY2hpbGRQcm9jZXNzIiwiY29ubmVjdGVkIiwiZW1pdEtleSIsImxlbmd0aCIsIlByb21pc2UiLCJyZWplY3QiLCJlcnJTdWIiLCJvbiIsIm1zZyIsInN0YWNrIiwiZXJyb3IiLCJFcnJvciIsImRpc3Bvc2UiLCJyZXNwb25zZVN1YiIsImRhdGEiLCJzZW5kIiwiZSIsImNvbnNvbGUiLCJnZXREZWJ1Z0luZm8iLCJ0ZXh0RWRpdG9yIiwiYXRvbSIsIndvcmtzcGFjZSIsImdldEFjdGl2ZVRleHRFZGl0b3IiLCJmaWxlUGF0aCIsImVkaXRvclNjb3BlcyIsImlzVGV4dEVkaXRvciIsImdldFBhdGgiLCJnZXRMYXN0Q3Vyc29yIiwiZ2V0U2NvcGVEZXNjcmlwdG9yIiwiZ2V0U2NvcGVzQXJyYXkiLCJwYWNrYWdlUGF0aCIsInBhY2thZ2VzIiwicmVzb2x2ZVBhY2thZ2VQYXRoIiwibGludGVyRXNsaW50TWV0YSIsInVuZGVmaW5lZCIsInZlcnNpb24iLCJnZXQiLCJob3Vyc1NpbmNlUmVzdGFydCIsIk1hdGgiLCJyb3VuZCIsInByb2Nlc3MiLCJ1cHRpbWUiLCJyZXR1cm5WYWwiLCJyZXNwb25zZSIsInR5cGUiLCJhdG9tVmVyc2lvbiIsImdldFZlcnNpb24iLCJsaW50ZXJFc2xpbnRWZXJzaW9uIiwibGludGVyRXNsaW50Q29uZmlnIiwiZXNsaW50VmVyc2lvbiIsInBhdGgiLCJwbGF0Zm9ybSIsImVzbGludFR5cGUiLCJlc2xpbnRQYXRoIiwibm90aWZpY2F0aW9ucyIsImFkZEVycm9yIiwiZ2VuZXJhdGVEZWJ1Z1N0cmluZyIsImRlYnVnIiwiZGV0YWlscyIsIkpTT04iLCJzdHJpbmdpZnkiLCJqb2luIiwiZ2VuZXJhdGVVc2VyTWVzc2FnZSIsIm9wdGlvbnMiLCJzZXZlcml0eSIsImV4Y2VycHQiLCJkZXNjcmlwdGlvbiIsImxvY2F0aW9uIiwiZmlsZSIsInBvc2l0aW9uIiwiaGFuZGxlRXJyb3IiLCJtZXNzYWdlIiwic3BsaXQiLCJnZW5lcmF0ZUludmFsaWRUcmFjZSIsIm1zZ0xpbmUiLCJtc2dDb2wiLCJtc2dFbmRMaW5lIiwibXNnRW5kQ29sIiwiZXNsaW50RnVsbFJhbmdlIiwicnVsZUlkIiwiZXJyTXNnUmFuZ2UiLCJyYW5nZVRleHQiLCJpc3N1ZVVSTCIsInRpdGxlVGV4dCIsInRpdGxlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiYm9keSIsIm5ld0lzc3VlVVJMIiwidXJsIiwicHJvY2Vzc0VTTGludE1lc3NhZ2VzIiwibWVzc2FnZXMiLCJzaG93UnVsZSIsImFsbCIsIm1hcCIsImZhdGFsIiwib3JpZ2luYWxNZXNzYWdlIiwibGluZSIsImNvbHVtbiIsImZpeCIsImVuZExpbmUiLCJlbmRDb2x1bW4iLCJ0ZXh0QnVmZmVyIiwiZ2V0QnVmZmVyIiwibGludGVyRml4IiwiZml4UmFuZ2UiLCJSYW5nZSIsInBvc2l0aW9uRm9yQ2hhcmFjdGVySW5kZXgiLCJyYW5nZSIsInJlcGxhY2VXaXRoIiwidGV4dCIsIm1heCIsInJldCIsImdldFJ1bGVVcmwiLCJmaXhMaW5lRW5kaW5nIiwicnVsZUFwcGVuZGl4Iiwic29sdXRpb25zIiwiZXJyIiwicHJvY2Vzc0pvYlJlc3BvbnNlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVwbGFjZVJ1bGVzIiwidXBkYXRlZFJ1bGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7QUFIQTtBQUtPLE1BQU1BLEtBQUssR0FBRyxJQUFJQyxjQUFKLEVBQWQ7O0FBQ1AsSUFBSUMsTUFBTSxHQUFHLElBQWI7QUFFQTtBQUNB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LEdBQUcsR0FBRyxNQUFNdEMsb0JBQW9CLENBQUM7QUFDL0JDLFFBQUFBLE9BRCtCO0FBRS9CQyxRQUFBQSxNQUYrQjtBQUcvQkMsUUFBQUEsVUFIK0I7QUFJL0JDLFFBQUFBLFNBSitCO0FBSy9CQyxRQUFBQSxlQUwrQjtBQU0vQnZELFFBQUFBLFFBTitCO0FBTy9CSixRQUFBQSxVQVArQjtBQVEvQjRELFFBQUFBLE1BUitCO0FBUy9CUixRQUFBQTtBQVQrQixPQUFELENBQWhDO0FBV0Q7O0FBRUQsV0FBT3dDLEdBQVA7QUFDRCxHQTNGa0IsQ0FBWixDQUFQO0FBNEZEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLGVBQWVNLGtCQUFmLENBQWtDMUUsUUFBbEMsRUFBNEN4QixVQUE1QyxFQUF3RHdFLFFBQXhELEVBQWtFO0FBQ3ZFLE1BQUkyQixNQUFNLENBQUNDLFNBQVAsQ0FBaUJDLGNBQWpCLENBQWdDQyxJQUFoQyxDQUFxQzlFLFFBQXJDLEVBQStDLGNBQS9DLENBQUosRUFBb0U7QUFDbEV4RCxJQUFBQSxLQUFLLENBQUN1SSxZQUFOLENBQW1CL0UsUUFBUSxDQUFDZ0YsWUFBNUI7QUFDRDs7QUFDRCxTQUFPbEMscUJBQXFCLENBQUM5QyxRQUFRLENBQUMrQyxRQUFWLEVBQW9CdkUsVUFBcEIsRUFBZ0N3RSxRQUFoQyxDQUE1QjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBnZW5lcmF0ZVJhbmdlIH0gZnJvbSAnYXRvbS1saW50ZXInXG5pbXBvcnQgY3J5cHRvUmFuZG9tU3RyaW5nIGZyb20gJ2NyeXB0by1yYW5kb20tc3RyaW5nJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcywgaW1wb3J0L2V4dGVuc2lvbnNcbmltcG9ydCB7IFJhbmdlLCBUYXNrIH0gZnJvbSAnYXRvbSdcbmltcG9ydCBSdWxlcyBmcm9tICcuL3J1bGVzJ1xuaW1wb3J0IHsgdGhyb3dJZkludmFsaWRQb2ludCB9IGZyb20gJy4vdmFsaWRhdGUvZWRpdG9yJ1xuXG5leHBvcnQgY29uc3QgcnVsZXMgPSBuZXcgUnVsZXMoKVxubGV0IHdvcmtlciA9IG51bGxcblxuLyoqXG4gKiBTdGFydCB0aGUgd29ya2VyIHByb2Nlc3MgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBzdGFydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydFdvcmtlcigpIHtcbiAgaWYgKHdvcmtlciA9PT0gbnVsbCkge1xuICAgIHdvcmtlciA9IG5ldyBUYXNrKHJlcXVpcmUucmVzb2x2ZSgnLi93b3JrZXIuanMnKSlcbiAgfVxuXG4gIGlmICh3b3JrZXIuc3RhcnRlZCkge1xuICAgIC8vIFdvcmtlciBzdGFydCByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gc2VudFxuICAgIHJldHVyblxuICB9XG4gIC8vIFNlbmQgZW1wdHkgYXJndW1lbnRzIGFzIHdlIGRvbid0IHVzZSB0aGVtIGluIHRoZSB3b3JrZXJcbiAgd29ya2VyLnN0YXJ0KFtdKVxuXG4gIC8vIE5PVEU6IE1vZGlmaWVzIHRoZSBUYXNrIG9mIHRoZSB3b3JrZXIsIGJ1dCBpdCdzIHRoZSBvbmx5IGNsZWFuIHdheSB0byB0cmFjayB0aGlzXG4gIHdvcmtlci5zdGFydGVkID0gdHJ1ZVxufVxuXG4vKipcbiAqIEZvcmNlcyB0aGUgd29ya2VyIFRhc2sgdG8ga2lsbCBpdHNlbGZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtpbGxXb3JrZXIoKSB7XG4gIGlmICh3b3JrZXIgIT09IG51bGwpIHtcbiAgICB3b3JrZXIudGVybWluYXRlKClcbiAgICB3b3JrZXIgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBTZW5kIGEgam9iIHRvIHRoZSB3b3JrZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0c1xuICogQHBhcmFtICB7T2JqZWN0fSBjb25maWcgQ29uZmlndXJhdGlvbiBmb3IgdGhlIGpvYiB0byBzZW5kIHRvIHRoZSB3b3JrZXJcbiAqIEByZXR1cm4ge09iamVjdHxTdHJpbmd8RXJyb3J9ICAgICAgICBUaGUgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSB3b3JrZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRKb2IoY29uZmlnKSB7XG4gIGlmICh3b3JrZXIgJiYgIXdvcmtlci5jaGlsZFByb2Nlc3MuY29ubmVjdGVkKSB7XG4gICAgLy8gU29tZXRpbWVzIHRoZSB3b3JrZXIgZGllcyBhbmQgYmVjb21lcyBkaXNjb25uZWN0ZWRcbiAgICAvLyBXaGVuIHRoYXQgaGFwcGVucywgaXQgc2VlbXMgdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8gcmVjb3ZlciBvdGhlclxuICAgIC8vIHRoYW4gdG8ga2lsbCB0aGUgd29ya2VyIGFuZCBjcmVhdGUgYSBuZXcgb25lLlxuICAgIGtpbGxXb3JrZXIoKVxuICB9XG5cbiAgLy8gRW5zdXJlIHRoZSB3b3JrZXIgaXMgc3RhcnRlZFxuICBzdGFydFdvcmtlcigpXG5cbiAgLy8gRXhwYW5kIHRoZSBjb25maWcgd2l0aCBhIHVuaXF1ZSBJRCB0byBlbWl0IG9uXG4gIC8vIE5PVEU6IEpvYnMgX211c3RfIGhhdmUgYSB1bmlxdWUgSUQgYXMgdGhleSBhcmUgY29tcGxldGVseSBhc3luYyBhbmQgcmVzdWx0c1xuICAvLyBjYW4gYXJyaXZlIGJhY2sgaW4gYW55IG9yZGVyLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgY29uZmlnLmVtaXRLZXkgPSBjcnlwdG9SYW5kb21TdHJpbmcoeyBsZW5ndGg6IDEwIH0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBBbGwgd29ya2VyIGVycm9ycyBhcmUgY2F1Z2h0IGFuZCByZS1lbWl0dGVkIGFsb25nIHdpdGggdGhlaXIgYXNzb2NpYXRlZFxuICAgIC8vIGVtaXRLZXksIHNvIHRoYXQgd2UgZG8gbm90IGNyZWF0ZSBtdWx0aXBsZSBsaXN0ZW5lcnMgZm9yIHRoZSBzYW1lXG4gICAgLy8gJ3Rhc2s6ZXJyb3InIGV2ZW50XG4gICAgY29uc3QgZXJyU3ViID0gd29ya2VyLm9uKGB3b3JrZXJFcnJvcjoke2NvbmZpZy5lbWl0S2V5fWAsICh7IG1zZywgc3RhY2sgfSkgPT4ge1xuICAgICAgLy8gUmUtdGhyb3cgZXJyb3JzIGZyb20gdGhlIHRhc2tcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1zZylcbiAgICAgIC8vIFNldCB0aGUgc3RhY2sgdG8gdGhlIG9uZSBnaXZlbiB0byB1cyBieSB0aGUgd29ya2VyXG4gICAgICBlcnJvci5zdGFjayA9IHN0YWNrXG4gICAgICBlcnJTdWIuZGlzcG9zZSgpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgIHJlc3BvbnNlU3ViLmRpc3Bvc2UoKVxuICAgICAgcmVqZWN0KGVycm9yKVxuICAgIH0pXG4gICAgY29uc3QgcmVzcG9uc2VTdWIgPSB3b3JrZXIub24oY29uZmlnLmVtaXRLZXksIChkYXRhKSA9PiB7XG4gICAgICBlcnJTdWIuZGlzcG9zZSgpXG4gICAgICByZXNwb25zZVN1Yi5kaXNwb3NlKClcbiAgICAgIHJlc29sdmUoZGF0YSlcbiAgICB9KVxuICAgIC8vIFNlbmQgdGhlIGpvYiBvbiB0byB0aGUgd29ya2VyXG4gICAgdHJ5IHtcbiAgICAgIHdvcmtlci5zZW5kKGNvbmZpZylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJTdWIuZGlzcG9zZSgpXG4gICAgICByZXNwb25zZVN1Yi5kaXNwb3NlKClcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZWJ1Z0luZm8oKSB7XG4gIGNvbnN0IHRleHRFZGl0b3IgPSBhdG9tLndvcmtzcGFjZS5nZXRBY3RpdmVUZXh0RWRpdG9yKClcbiAgbGV0IGZpbGVQYXRoXG4gIGxldCBlZGl0b3JTY29wZXNcbiAgaWYgKGF0b20ud29ya3NwYWNlLmlzVGV4dEVkaXRvcih0ZXh0RWRpdG9yKSkge1xuICAgIGZpbGVQYXRoID0gdGV4dEVkaXRvci5nZXRQYXRoKClcbiAgICBlZGl0b3JTY29wZXMgPSB0ZXh0RWRpdG9yLmdldExhc3RDdXJzb3IoKS5nZXRTY29wZURlc2NyaXB0b3IoKS5nZXRTY29wZXNBcnJheSgpXG4gIH0gZWxzZSB7XG4gICAgLy8gU29tZWhvdyB0aGlzIGNhbiBiZSBjYWxsZWQgd2l0aCBubyBhY3RpdmUgVGV4dEVkaXRvciwgaW1wb3NzaWJsZSBJIGtub3cuLi5cbiAgICBmaWxlUGF0aCA9ICd1bmtub3duJ1xuICAgIGVkaXRvclNjb3BlcyA9IFsndW5rbm93biddXG4gIH1cbiAgY29uc3QgcGFja2FnZVBhdGggPSBhdG9tLnBhY2thZ2VzLnJlc29sdmVQYWNrYWdlUGF0aCgnbGludGVyLWVzbGludCcpXG4gIGxldCBsaW50ZXJFc2xpbnRNZXRhXG4gIGlmIChwYWNrYWdlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQXBwYXJlbnRseSBmb3Igc29tZSB1c2VycyB0aGUgcGFja2FnZSBwYXRoIGZhaWxzIHRvIHJlc29sdmVcbiAgICBsaW50ZXJFc2xpbnRNZXRhID0geyB2ZXJzaW9uOiAndW5rbm93biEnIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWR5bmFtaWMtcmVxdWlyZVxuICAgIGxpbnRlckVzbGludE1ldGEgPSByZXF1aXJlKGpvaW4ocGFja2FnZVBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgfVxuICBjb25zdCBjb25maWcgPSBhdG9tLmNvbmZpZy5nZXQoJ2xpbnRlci1lc2xpbnQnKVxuICBjb25zdCBob3Vyc1NpbmNlUmVzdGFydCA9IE1hdGgucm91bmQoKHByb2Nlc3MudXB0aW1lKCkgLyAzNjAwKSAqIDEwKSAvIDEwXG4gIGxldCByZXR1cm5WYWxcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlbmRKb2Ioe1xuICAgICAgdHlwZTogJ2RlYnVnJyxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGZpbGVQYXRoXG4gICAgfSlcbiAgICByZXR1cm5WYWwgPSB7XG4gICAgICBhdG9tVmVyc2lvbjogYXRvbS5nZXRWZXJzaW9uKCksXG4gICAgICBsaW50ZXJFc2xpbnRWZXJzaW9uOiBsaW50ZXJFc2xpbnRNZXRhLnZlcnNpb24sXG4gICAgICBsaW50ZXJFc2xpbnRDb25maWc6IGNvbmZpZyxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgICBlc2xpbnRWZXJzaW9uOiByZXF1aXJlKGpvaW4ocmVzcG9uc2UucGF0aCwgJ3BhY2thZ2UuanNvbicpKS52ZXJzaW9uLFxuICAgICAgaG91cnNTaW5jZVJlc3RhcnQsXG4gICAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICAgIGVzbGludFR5cGU6IHJlc3BvbnNlLnR5cGUsXG4gICAgICBlc2xpbnRQYXRoOiByZXNwb25zZS5wYXRoLFxuICAgICAgZWRpdG9yU2NvcGVzLFxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhdG9tLm5vdGlmaWNhdGlvbnMuYWRkRXJyb3IoYCR7ZXJyb3J9YClcbiAgfVxuICByZXR1cm4gcmV0dXJuVmFsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlYnVnU3RyaW5nKCkge1xuICBjb25zdCBkZWJ1ZyA9IGF3YWl0IGdldERlYnVnSW5mbygpXG4gIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgYEF0b20gdmVyc2lvbjogJHtkZWJ1Zy5hdG9tVmVyc2lvbn1gLFxuICAgIGBsaW50ZXItZXNsaW50IHZlcnNpb246ICR7ZGVidWcubGludGVyRXNsaW50VmVyc2lvbn1gLFxuICAgIGBFU0xpbnQgdmVyc2lvbjogJHtkZWJ1Zy5lc2xpbnRWZXJzaW9ufWAsXG4gICAgYEhvdXJzIHNpbmNlIGxhc3QgQXRvbSByZXN0YXJ0OiAke2RlYnVnLmhvdXJzU2luY2VSZXN0YXJ0fWAsXG4gICAgYFBsYXRmb3JtOiAke2RlYnVnLnBsYXRmb3JtfWAsXG4gICAgYFVzaW5nICR7ZGVidWcuZXNsaW50VHlwZX0gRVNMaW50IGZyb206ICR7ZGVidWcuZXNsaW50UGF0aH1gLFxuICAgIGBDdXJyZW50IGZpbGUncyBzY29wZXM6ICR7SlNPTi5zdHJpbmdpZnkoZGVidWcuZWRpdG9yU2NvcGVzLCBudWxsLCAyKX1gLFxuICAgIGBsaW50ZXItZXNsaW50IGNvbmZpZ3VyYXRpb246ICR7SlNPTi5zdHJpbmdpZnkoZGVidWcubGludGVyRXNsaW50Q29uZmlnLCBudWxsLCAyKX1gXG4gIF1cbiAgcmV0dXJuIGRldGFpbHMuam9pbignXFxuJylcbn1cblxuLyoqXG4gKiBUdXJuIHRoZSBnaXZlbiBvcHRpb25zIGludG8gYSBMaW50ZXIgbWVzc2FnZSBhcnJheVxuICogQHBhcmFtICB7VGV4dEVkaXRvcn0gdGV4dEVkaXRvciBUaGUgVGV4dEVkaXRvciB0byB1c2UgdG8gYnVpbGQgdGhlIG1lc3NhZ2VcbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAgICBUaGUgcGFyYW1ldGVycyB1c2VkIHRvIGZpbGwgaW4gdGhlIG1lc3NhZ2VcbiAqIEBwYXJhbSAge3N0cmluZ30gW29wdGlvbnMuc2V2ZXJpdHk9J2Vycm9yJ10gQ2FuIGJlIG9uZSBvZjogJ2Vycm9yJywgJ3dhcm5pbmcnLCAnaW5mbydcbiAqIEBwYXJhbSAge3N0cmluZ30gW29wdGlvbnMuZXhjZXJwdD0nJ10gU2hvcnQgdGV4dCB0byB1c2UgaW4gdGhlIG1lc3NhZ2VcbiAqIEBwYXJhbSAge3N0cmluZ3xGdW5jdGlvbn0gW29wdGlvbnMuZGVzY3JpcHRpb25dIFVzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgICBNZXNzYWdlIHRvIHVzZXIgZ2VuZXJhdGVkIGZyb20gdGhlIHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVXNlck1lc3NhZ2UodGV4dEVkaXRvciwgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgc2V2ZXJpdHkgPSAnZXJyb3InLFxuICAgIGV4Y2VycHQgPSAnJyxcbiAgICBkZXNjcmlwdGlvbixcbiAgfSA9IG9wdGlvbnNcbiAgcmV0dXJuIFt7XG4gICAgc2V2ZXJpdHksXG4gICAgZXhjZXJwdCxcbiAgICBkZXNjcmlwdGlvbixcbiAgICBsb2NhdGlvbjoge1xuICAgICAgZmlsZTogdGV4dEVkaXRvci5nZXRQYXRoKCksXG4gICAgICBwb3NpdGlvbjogZ2VuZXJhdGVSYW5nZSh0ZXh0RWRpdG9yKSxcbiAgICB9LFxuICB9XVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW4gb3JkZXIgdG8gbmljZWx5IGRpc3BsYXkgdGhlIEVycm9yIGJlaW5nXG4gKiB0aHJvd24gaW5zdGVhZCBvZiBkZXBlbmRpbmcgb24gZ2VuZXJpYyBlcnJvciBoYW5kbGluZy5cbiAqIEBwYXJhbSAge1RleHRFZGl0b3J9IHRleHRFZGl0b3IgVGhlIFRleHRFZGl0b3IgdG8gdXNlIHRvIGJ1aWxkIHRoZSBtZXNzYWdlXG4gKiBAcGFyYW0gIHtFcnJvcn0gZXJyb3IgICAgICBFcnJvciB0byBnZW5lcmF0ZSBhIG1lc3NhZ2UgZm9yXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgICBNZXNzYWdlIHRvIHVzZXIgZ2VuZXJhdGVkIGZyb20gdGhlIEVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcih0ZXh0RWRpdG9yLCBlcnJvcikge1xuICBjb25zdCB7IHN0YWNrLCBtZXNzYWdlIH0gPSBlcnJvclxuICAvLyBPbmx5IHNob3cgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG1lc3NhZ2UgYXMgdGhlIGV4Y2VycHRcbiAgY29uc3QgZXhjZXJwdCA9IGBFcnJvciB3aGlsZSBydW5uaW5nIEVTTGludDogJHttZXNzYWdlLnNwbGl0KCdcXG4nKVswXX0uYFxuICBjb25zdCBkZXNjcmlwdGlvbiA9IGA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+JHttZXNzYWdlfVxcbjxociAvPiR7c3RhY2t9PC9kaXY+YFxuICByZXR1cm4gZ2VuZXJhdGVVc2VyTWVzc2FnZSh0ZXh0RWRpdG9yLCB7IHNldmVyaXR5OiAnZXJyb3InLCBleGNlcnB0LCBkZXNjcmlwdGlvbiB9KVxufVxuXG5jb25zdCBnZW5lcmF0ZUludmFsaWRUcmFjZSA9IGFzeW5jICh7XG4gIG1zZ0xpbmUsIG1zZ0NvbCwgbXNnRW5kTGluZSwgbXNnRW5kQ29sLFxuICBlc2xpbnRGdWxsUmFuZ2UsIGZpbGVQYXRoLCB0ZXh0RWRpdG9yLCBydWxlSWQsIG1lc3NhZ2Vcbn0pID0+IHtcbiAgbGV0IGVyck1zZ1JhbmdlID0gYCR7bXNnTGluZSArIDF9OiR7bXNnQ29sfWBcbiAgaWYgKGVzbGludEZ1bGxSYW5nZSkge1xuICAgIGVyck1zZ1JhbmdlICs9IGAgLSAke21zZ0VuZExpbmUgKyAxfToke21zZ0VuZENvbCArIDF9YFxuICB9XG4gIGNvbnN0IHJhbmdlVGV4dCA9IGBSZXF1ZXN0ZWQgJHtlc2xpbnRGdWxsUmFuZ2UgPyAnc3RhcnQgcG9pbnQnIDogJ3JhbmdlJ306ICR7ZXJyTXNnUmFuZ2V9YFxuICBjb25zdCBpc3N1ZVVSTCA9ICdodHRwczovL2dpdGh1Yi5jb20vQXRvbUxpbnRlci9saW50ZXItZXNsaW50L2lzc3Vlcy9uZXcnXG4gIGNvbnN0IHRpdGxlVGV4dCA9IGBJbnZhbGlkIHBvc2l0aW9uIGdpdmVuIGJ5ICcke3J1bGVJZH0nYFxuICBjb25zdCB0aXRsZSA9IGVuY29kZVVSSUNvbXBvbmVudCh0aXRsZVRleHQpXG4gIGNvbnN0IGJvZHkgPSBlbmNvZGVVUklDb21wb25lbnQoW1xuICAgICdFU0xpbnQgcmV0dXJuZWQgYSBwb2ludCB0aGF0IGRpZCBub3QgZXhpc3QgaW4gdGhlIGRvY3VtZW50IGJlaW5nIGVkaXRlZC4nLFxuICAgIGBSdWxlOiBcXGAke3J1bGVJZH1cXGBgLFxuICAgIHJhbmdlVGV4dCxcbiAgICAnJywgJycsXG4gICAgJzwhLS0gSWYgYXQgYWxsIHBvc3NpYmxlLCBwbGVhc2UgaW5jbHVkZSBjb2RlIHRvIHJlcHJvZHVjZSB0aGlzIGlzc3VlISAtLT4nLFxuICAgICcnLCAnJyxcbiAgICAnRGVidWcgaW5mb3JtYXRpb246JyxcbiAgICAnYGBganNvbicsXG4gICAgSlNPTi5zdHJpbmdpZnkoYXdhaXQgZ2V0RGVidWdJbmZvKCksIG51bGwsIDIpLFxuICAgICdgYGAnXG4gIF0uam9pbignXFxuJykpXG5cbiAgY29uc3QgbG9jYXRpb24gPSB7XG4gICAgZmlsZTogZmlsZVBhdGgsXG4gICAgcG9zaXRpb246IGdlbmVyYXRlUmFuZ2UodGV4dEVkaXRvciwgMCksXG4gIH1cbiAgY29uc3QgbmV3SXNzdWVVUkwgPSBgJHtpc3N1ZVVSTH0/dGl0bGU9JHt0aXRsZX0mYm9keT0ke2JvZHl9YFxuXG4gIHJldHVybiB7XG4gICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgZXhjZXJwdDogYCR7dGl0bGVUZXh0fS4gU2VlIHRoZSBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscy4gYFxuICAgICAgKyAnQ2xpY2sgdGhlIFVSTCB0byBvcGVuIGEgbmV3IGlzc3VlIScsXG4gICAgdXJsOiBuZXdJc3N1ZVVSTCxcbiAgICBsb2NhdGlvbixcbiAgICBkZXNjcmlwdGlvbjogYCR7cmFuZ2VUZXh0fVxcbk9yaWdpbmFsIG1lc3NhZ2U6ICR7bWVzc2FnZX1gXG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIHJhdyByZXNwb25zZSBmcm9tIEVTTGludCwgdGhpcyBwcm9jZXNzZXMgdGhlIG1lc3NhZ2VzIGludG8gYSBmb3JtYXRcbiAqIGNvbXBhdGlibGUgd2l0aCB0aGUgTGludGVyIEFQSS5cbiAqIEBwYXJhbSAge09iamVjdH0gICAgIG1lc3NhZ2VzICAgVGhlIG1lc3NhZ2VzIGZyb20gRVNMaW50J3MgcmVzcG9uc2VcbiAqIEBwYXJhbSAge1RleHRFZGl0b3J9IHRleHRFZGl0b3IgVGhlIEF0b206OlRleHRFZGl0b3Igb2YgdGhlIGZpbGUgdGhlIG1lc3NhZ2VzIGJlbG9uZyB0b1xuICogQHBhcmFtICB7Ym9vbH0gICAgICAgc2hvd1J1bGUgICBXaGV0aGVyIHRvIHNob3cgdGhlIHJ1bGUgaW4gdGhlIG1lc3NhZ2VzXG4gKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgICAgICAgIFRoZSBtZXNzYWdlcyB0cmFuc2Zvcm1lZCBpbnRvIExpbnRlciBtZXNzYWdlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0VTTGludE1lc3NhZ2VzKG1lc3NhZ2VzLCB0ZXh0RWRpdG9yLCBzaG93UnVsZSkge1xuICByZXR1cm4gUHJvbWlzZS5hbGwobWVzc2FnZXMubWFwKGFzeW5jICh7XG4gICAgZmF0YWwsIG1lc3NhZ2U6IG9yaWdpbmFsTWVzc2FnZSwgbGluZSwgc2V2ZXJpdHksIHJ1bGVJZCwgY29sdW1uLCBmaXgsIGVuZExpbmUsIGVuZENvbHVtblxuICB9KSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGZhdGFsID8gb3JpZ2luYWxNZXNzYWdlLnNwbGl0KCdcXG4nKVswXSA6IG9yaWdpbmFsTWVzc2FnZVxuICAgIGNvbnN0IGZpbGVQYXRoID0gdGV4dEVkaXRvci5nZXRQYXRoKClcbiAgICBjb25zdCB0ZXh0QnVmZmVyID0gdGV4dEVkaXRvci5nZXRCdWZmZXIoKVxuICAgIGxldCBsaW50ZXJGaXggPSBudWxsXG4gICAgaWYgKGZpeCkge1xuICAgICAgY29uc3QgZml4UmFuZ2UgPSBuZXcgUmFuZ2UoXG4gICAgICAgIHRleHRCdWZmZXIucG9zaXRpb25Gb3JDaGFyYWN0ZXJJbmRleChmaXgucmFuZ2VbMF0pLFxuICAgICAgICB0ZXh0QnVmZmVyLnBvc2l0aW9uRm9yQ2hhcmFjdGVySW5kZXgoZml4LnJhbmdlWzFdKVxuICAgICAgKVxuICAgICAgbGludGVyRml4ID0ge1xuICAgICAgICBwb3NpdGlvbjogZml4UmFuZ2UsXG4gICAgICAgIHJlcGxhY2VXaXRoOiBmaXgudGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbXNnQ29sXG4gICAgbGV0IG1zZ0VuZExpbmVcbiAgICBsZXQgbXNnRW5kQ29sXG4gICAgbGV0IGVzbGludEZ1bGxSYW5nZSA9IGZhbHNlXG5cbiAgICAvKlxuICAgICBOb3RlOiBFU0xpbnQgcG9zaXRpb25zIGFyZSAxLWluZGV4ZWQsIHdoaWxlIEF0b20gZXhwZWN0cyAwLWluZGV4ZWQsXG4gICAgIHBvc2l0aW9ucy4gV2UgYXJlIHN1YnRyYWN0aW5nIDEgZnJvbSB0aGVzZSB2YWx1ZXMgaGVyZSBzbyB3ZSBkb24ndCBoYXZlIHRvXG4gICAgIGtlZXAgZG9pbmcgc28gaW4gbGF0ZXIgdXNlcy5cbiAgICAgKi9cbiAgICBjb25zdCBtc2dMaW5lID0gbGluZSAtIDFcbiAgICBpZiAodHlwZW9mIGVuZENvbHVtbiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGVuZExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICBlc2xpbnRGdWxsUmFuZ2UgPSB0cnVlXG4gICAgICAvLyBIZXJlIHdlIGFsd2F5cyB3YW50IHRoZSBjb2x1bW4gdG8gYmUgYSBudW1iZXJcbiAgICAgIG1zZ0NvbCA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIDEpXG4gICAgICBtc2dFbmRMaW5lID0gZW5kTGluZSAtIDFcbiAgICAgIG1zZ0VuZENvbCA9IGVuZENvbHVtbiAtIDFcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugd2FudCBtc2dDb2wgdG8gcmVtYWluIHVuZGVmaW5lZCBpZiBpdCB3YXMgaW5pdGlhbGx5IHNvXG4gICAgICAvLyBgZ2VuZXJhdGVSYW5nZWAgd2lsbCBnaXZlIHVzIGEgcmFuZ2Ugb3ZlciB0aGUgZW50aXJlIGxpbmVcbiAgICAgIG1zZ0NvbCA9IHR5cGVvZiBjb2x1bW4gPT09ICdudW1iZXInID8gY29sdW1uIC0gMSA6IGNvbHVtblxuICAgIH1cblxuICAgIGxldCByZXQgPSB7XG4gICAgICBzZXZlcml0eTogc2V2ZXJpdHkgPT09IDEgPyAnd2FybmluZycgOiAnZXJyb3InLFxuICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgZmlsZTogZmlsZVBhdGgsXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJ1bGVJZCkge1xuICAgICAgcmV0LnVybCA9IHJ1bGVzLmdldFJ1bGVVcmwocnVsZUlkKVxuICAgIH1cblxuICAgIC8vIEhBQ0sgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9BdG9tTGludGVyL2xpbnRlci1lc2xpbnQvaXNzdWVzLzEyNDlcbiAgICBsZXQgZml4TGluZUVuZGluZyA9IGZhbHNlXG4gICAgaWYgKHJ1bGVJZCA9PT0gJ3ByZXR0aWVyL3ByZXR0aWVyJyAmJiAobWVzc2FnZSA9PT0gJ0RlbGV0ZSBg4pCNYCcpKSB7XG4gICAgICBmaXhMaW5lRW5kaW5nID0gdHJ1ZVxuICAgIH1cblxuICAgIGxldCByYW5nZVxuICAgIHRyeSB7XG4gICAgICBpZiAoZXNsaW50RnVsbFJhbmdlKSB7XG4gICAgICAgIGlmICghZml4TGluZUVuZGluZykge1xuICAgICAgICAgIHRocm93SWZJbnZhbGlkUG9pbnQodGV4dEJ1ZmZlciwgbXNnTGluZSwgbXNnQ29sKVxuICAgICAgICAgIHRocm93SWZJbnZhbGlkUG9pbnQodGV4dEJ1ZmZlciwgbXNnRW5kTGluZSwgbXNnRW5kQ29sKVxuICAgICAgICB9XG4gICAgICAgIHJhbmdlID0gW1ttc2dMaW5lLCBtc2dDb2xdLCBbbXNnRW5kTGluZSwgbXNnRW5kQ29sXV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmdlID0gZ2VuZXJhdGVSYW5nZSh0ZXh0RWRpdG9yLCBtc2dMaW5lLCBtc2dDb2wpXG4gICAgICB9XG4gICAgICByZXQubG9jYXRpb24ucG9zaXRpb24gPSByYW5nZVxuXG4gICAgICBjb25zdCBydWxlQXBwZW5kaXggPSBzaG93UnVsZSA/IGAgKCR7cnVsZUlkIHx8ICdGYXRhbCd9KWAgOiAnJ1xuICAgICAgcmV0LmV4Y2VycHQgPSBgJHttZXNzYWdlfSR7cnVsZUFwcGVuZGl4fWBcblxuICAgICAgaWYgKGxpbnRlckZpeCkge1xuICAgICAgICByZXQuc29sdXRpb25zID0gW2xpbnRlckZpeF1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldCA9IGF3YWl0IGdlbmVyYXRlSW52YWxpZFRyYWNlKHtcbiAgICAgICAgbXNnTGluZSxcbiAgICAgICAgbXNnQ29sLFxuICAgICAgICBtc2dFbmRMaW5lLFxuICAgICAgICBtc2dFbmRDb2wsXG4gICAgICAgIGVzbGludEZ1bGxSYW5nZSxcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIHRleHRFZGl0b3IsXG4gICAgICAgIHJ1bGVJZCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9KSlcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGxpbnQgam9iXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICByZXNwb25zZSAgIFRoZSByYXcgcmVzcG9uc2UgZnJvbSB0aGUgam9iXG4gKiBAcGFyYW0gIHtUZXh0RWRpdG9yfSB0ZXh0RWRpdG9yIFRoZSBBdG9tOjpUZXh0RWRpdG9yIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlcyBiZWxvbmcgdG9cbiAqIEBwYXJhbSAge2Jvb2x9ICAgICAgIHNob3dSdWxlICAgV2hldGhlciB0byBzaG93IHRoZSBydWxlIGluIHRoZSBtZXNzYWdlc1xuICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgICAgICAgICBUaGUgbWVzc2FnZXMgdHJhbnNmb3JtZWQgaW50byBMaW50ZXIgbWVzc2FnZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NKb2JSZXNwb25zZShyZXNwb25zZSwgdGV4dEVkaXRvciwgc2hvd1J1bGUpIHtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXNwb25zZSwgJ3VwZGF0ZWRSdWxlcycpKSB7XG4gICAgcnVsZXMucmVwbGFjZVJ1bGVzKHJlc3BvbnNlLnVwZGF0ZWRSdWxlcylcbiAgfVxuICByZXR1cm4gcHJvY2Vzc0VTTGludE1lc3NhZ2VzKHJlc3BvbnNlLm1lc3NhZ2VzLCB0ZXh0RWRpdG9yLCBzaG93UnVsZSlcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/dist/main.js b/dist/main.js
new file mode 100644
index 00000000..c57ab1c6
--- /dev/null
+++ b/dist/main.js
@@ -0,0 +1,2 @@
+"use strict";var e=require("os"),t=require("child_process"),n=require("fs"),r=require("path"),o=require("atom"),i=require("assert"),a=require("crypto"),s=require("util");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=l(e),u=l(t),d=l(n),f=l(r),p=l(i),m=l(a),h=l(s);function g(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var v=g(c.default),y=g(d.default),w=g(f.default);const b=/\s+at.*(?:\(|\s)(.*)\)?/,E=/^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/,_=void 0===v.default.homedir?"":v.default.homedir();class x extends Error{constructor(e){if(!Array.isArray(e))throw new TypeError("Expected input to be an Array, got "+typeof e);let t=(e=[...e].map((e=>e instanceof Error?e:null!==e&&"object"==typeof e?Object.assign(new Error(e.message),e):new Error(e)))).map((e=>{return"string"==typeof e.stack?(e=>e.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g,""))((t=e.stack,n=Object.assign({pretty:!1},n),t.replace(/\\/g,"/").split("\n").filter((e=>{const t=e.match(b);if(null===t||!t[1])return!0;const n=t[1];return!n.includes(".app/Contents/Resources/electron.asar")&&!n.includes(".app/Contents/Resources/default_app.asar")&&!E.test(n)})).filter((e=>""!==e.trim())).map((e=>n.pretty?e.replace(b,((e,t)=>e.replace(t,t.replace(_,"~")))):e)).join("\n"))):String(e);var t,n})).join("\n");t="\n"+((e,t=1,n)=>{if(n={indent:" ",includeEmptyLines:!1,...n},"string"!=typeof e)throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof e}\``);if("number"!=typeof t)throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof t}\``);if("string"!=typeof n.indent)throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof n.indent}\``);if(0===t)return e;const r=n.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return e.replace(r,n.indent.repeat(t))})(t,4),super(t),this.name="AggregateError",Object.defineProperty(this,"_errors",{value:e})}*[Symbol.iterator](){for(const e of this._errors)yield e}}var S=x;const P=(e,t,n)=>new Promise(((r,o)=>{if(n=Object.assign({concurrency:1/0},n),"function"!=typeof t)throw new TypeError("Mapper function is required");const{concurrency:i}=n;if(!("number"==typeof i&&i>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${i}\` (${typeof i})`);const a=[],s=e[Symbol.iterator]();let l=!1,c=!1,u=0,d=0;const f=()=>{if(l)return;const e=s.next(),n=d;if(d++,e.done)return c=!0,void(0===u&&r(a));u++,Promise.resolve(e.value).then((e=>t(e,n))).then((e=>{a[n]=e,u--,f()}),(e=>{l=!0,o(e)}))};for(let e=0;e(await k(e,((e,n)=>Promise.all([t(e,n),e])),n)).filter((e=>Boolean(e[0]))).map((e=>e[1]));var O=A,T=A;O.default=T;const C="undefined"!=typeof atom,N="undefined"!=typeof atom&&(atom.inDevMode()||atom.inSpecMode());var $=/["'&<>]/,R=function(e){var t,n=""+e,r=$.exec(n);if(!r)return n;var o="",i=0,a=0;for(i=r.index;i{const o={stdout:r.stdout?[]:null,stderr:r.stderr?[]:null};r.on("error",t),r.stdout&&r.stdout.on("data",(function(e){o.stdout.push(e),n.handleStdout&&n.handleStdout(e)})),r.stderr&&r.stderr.on("data",(function(e){o.stderr.push(e),n.handleStderr&&n.handleStderr(e)})),r.on("close",(t=>{let r=null;null!=o.stdout&&(r=null===n.encoding||"buffer"===n.encoding?Buffer.concat(o.stdout):o.stdout.join(""));let i=null;null!=o.stderr&&(i=null===n.encoding||"buffer"===n.encoding?Buffer.concat(o.stderr):o.stderr.join("")),e({exitCode:t,stdout:r,stderr:i})}))}));return n.handleChildProcess(r),o}(e,t,{...n,handleChildProcess(e){r=e}});return o.kill=function(e){return r.kill(e)},o}async function L(e){if(C){const t=await async function(e){var t;const n=atom.packages.getLoadedPackage(e.name);return null==n?null:null!==(t=n.metadata.version)&&void 0!==t?t:null}(e);if(t)return t}return async function(e){var t,n;const{directory:r}=e;if(null==r)return null;let o=null;try{o=JSON.parse(await y.default.promises.readFile(w.default.join(r,"package.json"),"utf8"))}catch(e){return null}return null!==(t=null===(n=o)||void 0===n?void 0:n.version)&&void 0!==t?t:null}(e)}const M=C?async function(e){return atom.packages.resolvePackagePath(e)}:async function(e){var t;const n=w.default.join(null!==(t=process.env.ATOM_HOME)&&void 0!==t?t:w.default.join(v.default.homedir(),".atom"),"packages",e);try{return await y.default.promises.access(n,y.default.constants.R_OK),n}catch(e){return null}};function D(e,t){if(!e)throw new Error(null!=t?t:"Invariant violation")}async function F(e){const t=await(C?async function(e){const t=atom.packages.getLoadedPackage(e),n=t&&t.metadata["package-deps"];return Array.isArray(n)?n:[]}(e):async function(e){let t=null;try{t=await y.default.promises.stat(e)}catch(e){}if(null==t||!t.isDirectory())throw new Error("[Package-Deps] Expected packageName to be a readable directory in Node.js invocation");let n=null;try{const t=await y.default.promises.readFile(w.default.join(e,"package.json"),"utf8");n=JSON.parse(t)}catch(e){}const r=null==n||"object"!=typeof n?[]:n["package-deps"];return Array.isArray(r)?r:[]}(e));return N&&(D(Array.isArray(t),`Dependencies for ${e} are not a valid array`),t.forEach(((t,n)=>{if(Array.isArray(t))t.forEach(((t,r)=>{const o=`Dependency#${n}#${r} for ${e} is invalid`;D("string"==typeof t.name&&t.name.length>0,o),D(null==t.minimumVersion||"string"==typeof t.minimumVersion&&t.minimumVersion.length>0,o)})),D(t.length>0,`Dependency#${n} for ${e} has no group items`);else{const r=`Dependency#${n} for ${e} is invalid`;D("string"==typeof t.name&&t.name.length>0,r),D(null==t.minimumVersion||"string"==typeof t.minimumVersion&&t.minimumVersion.length>0,r)}}))),t}async function H(e){if(null==e.directory)return!0;if(null==e.minimumVersion)return!1;const t=await L(e);return null==t||1===function(e,t){for(var n=e.split("."),r=t.split("."),o=0;o<3;o++){var i=Number(n[o]),a=Number(r[o]);if(i>a)return 1;if(a>i)return-1;if(!isNaN(i)&&isNaN(a))return 1;if(isNaN(i)&&!isNaN(a))return-1}return 0}(e.minimumVersion,t)}const U=new Set(["✓","done"]),W=/(?:Installing|Moving) (.*?) to .* (.*)/;async function q(e){if("string"==typeof e)return{name:e,directory:await M(e)};if("name"in e)return{...e,directory:await M(e.name)};throw console.error("This package-deps entry is not valid. Please see https://github.com/steelbrain/package-deps#how-it-works",{entry:e}),Error("The package-deps entry is not valid. Please see https://github.com/steelbrain/package-deps#how-it-works")}let K=!0;const z=C?function({packageName:e,dependencies:t}){const n=[],r=atom.notifications.addInfo(`Installing ${e} dependencies`,{detail:`Installing ${t.map((e=>e.name)).join(", ")}`,dismissable:!0}),o=document.createElement("progress");o.max=t.length,o.style.width="100%";try{var i;const e=atom.views.getView(r),t=null!==(i=null==e?void 0:e.element)&&void 0!==i?i:null;if(null==t)throw new Error("Unable to get notification element from view");const n=t.querySelector(".detail-content");if(null==n)throw new Error("Content detail container not found inside the notification");n.appendChild(o)}catch(e){console.error("[Package-Deps] Error during showing installation progress to user",e)}return{handleFailure({dependency:e,error:t}){var r;n.push(e.name),o.value+=1,console.error(`[Package-Deps] Unable to install ${e.name}, Error:`,null!==(r=null==t?void 0:t.stack)&&void 0!==r?r:t)},handleDependencyInstalled(e){o.value+=1},handleComplete(){r.dismiss(),n.length>0?atom.notifications.addWarning(`Failed to install ${e} dependencies`,{detail:`These packages were not installed, check your console\nfor more info.\n${n.join("\n")}`,dismissable:!0}):atom.notifications.addSuccess(`Installed ${e} dependencies`,{detail:`Installed ${t.map((e=>e.name)).join(", ")}`}),Promise.all(t.map((e=>n.includes(e.name)?null:atom.packages.activatePackage(e.name)))).catch((t=>{console.error(`[Package-Deps] Error activating installed packages for ${e}`,t)}))}}}:function({dependencies:e}){let t=!1;return console.log(`Installing dependencies:\n${e.map((e=>` - ${e.name}`)).join("\n")}`),{handleFailure({dependency:e,error:n}){var r;t=!0,console.error(`Unable to install ${e.name}, Error:`,null!==(r=null==n?void 0:n.stack)&&void 0!==r?r:n)},handleDependencyInstalled(e){console.log("Successfully installed",e.name)},handleComplete(){console.log("Installation complete"),t&&(process.exitCode=1)}}},V=C?function({packageName:e,dependencies:t}){return new Promise((n=>{const r=t.filter((e=>!Array.isArray(e))),o=t.filter((e=>Array.isArray(e))),i=0===o.length,a=i?r.map((e=>e.name)).join(", "):"Something went wrong. Check your developer console",s=o.map((e=>e[0]));atom.packages.isPackageDisabled("notifications")&&console.warn(`Enable notifications to install dependencies for ${e}`);const l=atom.notifications.addInfo(`${e} needs to install dependencies`,{dismissable:!0,icon:"cloud-download",detail:a,description:`Install dependenc${1===t.length?"y":"ies"}?`,buttons:[{text:"Yes",onDidClick:()=>{n(i?r:r.concat(s)),l.dismiss()}},{text:"No Thanks",onDidClick:()=>{l.dismiss()}},{text:"Never",onDidClick:()=>{!function(e){var t;if(!C)return;const n=new Set(null!==(t=atom.config.get("atom-package-deps.ignored"))&&void 0!==t?t:[]);n.add(e),atom.config.set("atom-package-deps.ignored",Array.from(n))}(e),K&&(K=!1,atom.notifications.addInfo("How to reset package-deps memory",{dismissable:!0,description:"To modify the list of ignored files invoke 'Application: Open Your Config' and change the 'atom-package-deps' section"})),l.dismiss()}}]});if(l.onDidDismiss((()=>n([]))),!i)try{var c;const e=atom.views.getView(l),t=null!==(c=null==e?void 0:e.element)&&void 0!==c?c:null;if(null==t)throw new Error("Unable to get notification element from view");const n=t.querySelector(".detail-content");if(null==n)throw new Error("Content detail container not found inside the notification");if(n.innerHTML="",r.length>0){const e=document.createElement("div");e.innerHTML=`Packages without choices: ${r.map((e=>R(e.name))).join(" ")} `,n.appendChild(e)}const i=document.createElement("div");i.innerHTML="Packages with choices:",n.appendChild(i);const a=document.createElement("ul");o.forEach(((e,t)=>{const n=document.createElement("li"),r=document.createElement("select");r.innerHTML=e.map((e=>`${R(e.name)} `)).join("\n"),r.addEventListener("change",(()=>{const n=e.find((e=>e.name===r.value));null!=n&&(s[t]=n)})),n.style.marginTop="5px",n.appendChild(r),a.appendChild(n)})),n.appendChild(a)}catch(e){console.error("[Package-Deps] Error during showing package choices to user",e)}}))}:async function({dependencies:e}){return e.map((e=>Array.isArray(e)?e[0]:e))};var B=async function(e,t=!1){if(D("string"==typeof e&&e.length>0,"[Package-Deps] Package name is required"),n=e,C&&(null!==(r=atom.config.get("atom-package-deps.ignored"))&&void 0!==r?r:[]).includes(n))return;var n,r;const o=await F(e);if(0===o.length)return;const i=await Promise.all(o.map((async e=>Array.isArray(e)?Promise.all(e.map(q)):q(e)))),a=await O(i,(async function(e){return Array.isArray(e)?(await Promise.all(e.map((e=>H(e))))).every(Boolean):H(e)}));if(0===a.length)return;let s;if(s=t?a.map((e=>Array.isArray(e)?e[0]:e)):await V({packageName:e,dependencies:a}),0===s.length)return;const l=z({packageName:e,dependencies:s});await(async(e,t,{concurrency:n=1/0,stopOnError:r=!0}={})=>new Promise(((o,i)=>{if("function"!=typeof t)throw new TypeError("Mapper function is required");if(!Number.isSafeInteger(n)&&n!==1/0||!(n>=1))throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${n}\` (${typeof n})`);const a=[],s=[],l=e[Symbol.iterator]();let c=!1,u=!1,d=0,f=0;const p=()=>{if(c)return;const e=l.next(),n=f;if(f++,e.done)return u=!0,void(0===d&&(r||0===s.length?o(a):i(new S(s))));d++,(async()=>{try{const r=await e.value;a[n]=await t(r,n),d--,p()}catch(e){r?(c=!0,i(e)):(s.push(e),d--,p())}})()};for(let e=0;e((e,t)=>{if(!t)throw new Error(e);return!0})(`${t}:${n} isn't a valid point!`,((e,t,n)=>e.clipPosition([t,n]).isEqual([t,n]))(e,t,n)),X=(e,t)=>e.getCursors().some((e=>e.getScopeDescriptor().getScopesArray().some((e=>t.includes(e)))));var G="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Z(e){var t={exports:{}};return e(t,t.exports),t.exports}function Q(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.')}var ee="[object GeneratorFunction]",te=/^\[object .+?Constructor\]$/,ne="object"==typeof G&&G&&G.Object===Object&&G,re="object"==typeof self&&self&&self.Object===Object&&self,oe=ne||re||Function("return this")();function ie(e,t){return!!(e?e.length:0)&&function(e,t,n){if(t!=t)return function(e,t,n,r){var o=e.length,i=n+(r?1:-1);for(;r?i--:++i-1}function ae(e,t,n){for(var r=-1,o=e?e.length:0;++r-1},Pe.prototype.set=function(e,t){var n=this.__data__,r=Ae(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},ke.prototype.clear=function(){this.__data__={hash:new Se,map:new(Ee||Pe),string:new Se}},ke.prototype.delete=function(e){return Ce(this,e).delete(e)},ke.prototype.get=function(e){return Ce(this,e).get(e)},ke.prototype.has=function(e){return Ce(this,e).has(e)},ke.prototype.set=function(e,t){return Ce(this,e).set(e,t),this},je.prototype.add=je.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},je.prototype.has=function(e){return this.__data__.has(e)};var Te=_e&&1/ce(new _e([,-0]))[1]==1/0?function(e){return new _e(e)}:function(){};function Ce(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function Ne(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return Oe(n)?n:void 0}function $e(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var Re,Ie=function(e){return e&&e.length?function(e,t,n){var r=-1,o=ie,i=e.length,a=!0,s=[],l=s;if(n)a=!1,o=ae;else if(i>=200){var c=t?null:Te(e);if(c)return ce(c);a=!1,o=le,l=new je}else l=t?[]:s;e:for(;++r1&&void 0!==arguments[1]?arguments[1]:"SIGTERM",n=Qe.default.basename(e.spawnfile);if("win32"===process.platform&&"wmic.exe"!==n&&"wmic"!==n)try{var r=yield tt("wmic",["process","where","(ParentProcessId="+e.pid+")","get","processid"],{stream:"stdout",timeout:6e4});r.split(/\s+/).filter((function(e){return/^\d+$/.test(e)})).map((function(e){return parseInt(e,10)})).filter((function(t){return t!==e.pid&&t>0})).forEach((function(e){process.kill(e,t)}))}catch(e){}else e.kill(t)})),function(e){return qe.apply(this,arguments)}),Qe=function(e){return e&&e.__esModule?e:{default:e}}(f.default);function et(e){return function(){var t=e.apply(this,arguments);return new Promise((function(e,n){return function r(o,i){try{var a=t[o](i),s=a.value}catch(e){return void n(e)}if(!a.done)return Promise.resolve(s).then((function(e){r("next",e)}),(function(e){r("throw",e)}));e(s)}("next")}))}}function tt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,Xe.validate)(e,t,n),o=null,i=null,a=Ge(e,t,r,(function(e){o?Ze(e,o):i=e}));return a.kill=function(e){i?Ze(i,e):o=e||"SIGTERM"},a}var nt={exec:tt,execNode:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return(0,Xe.validate)(e,t,n),tt(process.execPath,[e].concat(t),n)}},rt="win32"===process.platform,ot=rt?/[^:]\\$/:/.\/$/;const it=process.binding("constants"),at=(pt=rt?process.env.TEMP||process.env.TMP||(process.env.SystemRoot||process.env.windir)+"\\temp":process.env.TMPDIR||process.env.TMP||process.env.TEMP||"/tmp",ot.test(pt)&&(pt=pt.slice(0,-1)),pt),st="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",lt=/XXXXXX/,ct=(it.O_CREAT||it.fs.O_CREAT)|(it.O_EXCL||it.fs.O_EXCL)|(it.O_RDWR||it.fs.O_RDWR),ut=it.EBADF||it.os.errno.EBADF,dt=it.ENOENT||it.os.errno.ENOENT,ft=[];var pt,mt=!1,ht=!1;function gt(e){var t=[],n=null;try{n=m.default.randomBytes(e)}catch(t){n=m.default.pseudoRandomBytes(e)}for(var r=0;r0?e():o(new Error("Could not get a unique tmp filename, max tries reached "+t));o(null,t)}))}()}function Et(e){var t=yt(e)[0],n=t.name?1:t.tries||3;if(isNaN(n)||n<0)throw new Error("Invalid tries");if(t.template&&!t.template.match(lt))throw new Error("Invalid template provided");do{const e=wt(t);try{d.default.statSync(e)}catch(t){return e}}while(n-- >0);throw new Error("Could not get a unique tmp filename, max tries reached")}function _t(e){const t=[e];do{for(var n=t.pop(),r=!1,o=d.default.readdirSync(n),i=0,a=o.length;i=0&&ft.splice(o,1),n=!0,e(t)}o&&o(null)}}function kt(){if(!ht||mt)for(;ft.length;)try{ft[0].call(null)}catch(e){}}function jt(e){return At(e,-dt,"ENOENT")}function At(e,t,n){return e.code==t||e.code==n}const Ot=process.versions.node.split(".").map((function(e){return parseInt(e,10)}));0===Ot[0]&&(Ot[1]<9||9===Ot[1]&&Ot[2]<5)&&process.addListener("uncaughtException",(function(e){throw ht=!0,kt(),e})),process.addListener("exit",(function(e){e&&(ht=!0),kt()}));var Tt={tmpdir:at,dir:function(e,t){var n=yt(e,t),r=n[0],o=n[1];bt(r,(function(e,t){if(e)return o(e);d.default.mkdir(t,r.mode||448,(function(e){if(e)return o(e);o(null,t,St(t,r))}))}))},dirSync:function(e){var t=yt(e)[0];const n=Et(t);return d.default.mkdirSync(n,t.mode||448),{name:n,removeCallback:St(n,t)}},file:function(e,t){var n=yt(e,t),r=n[0],o=n[1];r.postfix=vt(r.postfix)?".tmp":r.postfix,bt(r,(function(e,t){if(e)return o(e);d.default.open(t,ct,r.mode||384,(function(e,n){return e?o(e):r.discardDescriptor?d.default.close(n,(function(e){if(e){try{d.default.unlinkSync(t)}catch(t){jt(t)||(e=t)}return o(e)}o(null,t,void 0,xt(t,-1,r))})):r.detachDescriptor?o(null,t,n,xt(t,-1,r)):void o(null,t,n,xt(t,n,r))}))}))},fileSync:function(e){var t=yt(e)[0];t.postfix=t.postfix||".tmp";const n=t.discardDescriptor||t.detachDescriptor,r=Et(t);var o=d.default.openSync(r,ct,t.mode||384);return t.discardDescriptor&&(d.default.closeSync(o),o=void 0),{name:r,fd:o,removeCallback:xt(r,n?-1:o,t)}},tmpName:bt,tmpNameSync:Et,setGracefulCleanup:function(){mt=!0}},Ct=Z((function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.unlinkFile=t.writeFile=void 0;var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getWordRegexp=function(e,t){var n=e.scopeDescriptorForBufferPosition(t),r=(o=atom.config.get("editor.nonWordCharacters",{scope:n}),o.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"));var o;return new RegExp("^[\t ]*$|[^\\s"+r+"]+")},t.getTempDirectory=function(e){return new Promise((function(t,n){o.default.dir({prefix:e},(function(e,r,o){e?n(e):t({path:r,cleanup:o})}))}))},t.fileExists=function(e){return new Promise((function(t){r.default.access(e,r.default.R_OK,(function(e){t(null===e)}))}))},t.validateExec=function(e,t,r){if("string"!=typeof e)throw new Error("Invalid or no `command` provided");if(!(t instanceof Array))throw new Error("Invalid or no `args` provided");if("object"!==(void 0===r?"undefined":n(r)))throw new Error("Invalid or no `options` provided")},t.validateEditor=function(e){var t=void 0;t="function"==typeof atom.workspace.isTextEditor?atom.workspace.isTextEditor(e):"function"==typeof e.getText;if(!t)throw new Error("Invalid TextEditor provided")},t.validateFind=function(e,t){if("string"!=typeof e)throw new Error("Invalid or no `directory` provided");if("string"!=typeof t&&!(t instanceof Array))throw new Error("Invalid or no `name` provided")},t.wrapExec=function(e){return function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=!1,i=e(t,n,Object.assign({timeout:1e4},r)),a=i;if(r.uniqueKey){if("string"!=typeof r.uniqueKey)throw new Error("options.uniqueKey must be a string");var l=s.get(r.uniqueKey);l&&l(),s.set(r.uniqueKey,(function(){o=!0,i.kill()})),a=a.then((function(e){return o?null:e}),(function(e){if(o)return null;throw e}))}return a.catch((function(e){if("ENOENT"===e.code){var t=new Error("Failed to spawn command `"+e.path+"`. Make sure `"+e.path+"` is installed and on your PATH");throw t.code="ENOENT",t}throw e}))}};var r=a(d.default),o=a(Tt),i=a(Be);function a(e){return e&&e.__esModule?e:{default:e}}t.writeFile=(0,i.default)(r.default.writeFile),t.unlinkFile=(0,i.default)(r.default.unlink);var s=new Map})),Nt=Z((function(e,t){!function(t){var n,r=/^[$_a-z][$_a-z0-9]*$/i;function o(e){var t,n,o,i,a,s,l,c={},u=0,d="",f=!1;for(t=0;t",t+3))<0)throw new Error("'>' missing in named backreference.");if(!(l=c[s=e.substring(t+3,a)]))throw new Error("Named group '"+s+"' is not defined in backreference.");if("number"!=typeof l)throw new Error("Named backreference referencing duplicate named group '"+s+"'.");t=a,d+=l}else if(f)"]"===n&&(f=!1);else if("["===n)f=!0;else if("("===n&&"?:"!==i&&"?="!==i&&"?!"!==i&&(u++,"?<"===i||":<"===i)){if((a=e.indexOf(">",t+3))<0)throw new Error("'>' missing in named group.");if(s=e.substring(t+3,a),!r.test(s))throw new Error("Invalide group name '"+s+"'. Regexp group name should start with '_$a-zA-Z' and can contain only '_$a-zA-Z0-9'.");void 0===(l=c[s])?c[s]=u:"number"==typeof l?c[s]=[l,u]:l.push(u),t=a}return{mapper:c,regexText:d}}e.exports=function(e,t){if("boolean"!=typeof e){"string"!=typeof e&&(t=(e.global?"g":"")+(e.multiline?"m":"")+(e.ignoreCase?"i":""),e=e.source);var r=n?n[e]||(n[e]=o(e)):o(e),i=new RegExp(r.regexText,t);return i.groupsIndices=r.mapper,i.exec=function(e){var t=RegExp.prototype.exec.call(this,e);return t&&a(t),t},i.execGroups=function(e,t){var n=this.exec(e);return n?n.groups(t):null},i.replace=function(e,t){if("function"==typeof t)return e.replace(i,(function(){var e=Array.prototype.slice.call(arguments,0,arguments.length-2);return a(e),t.apply(e,arguments)}));var n=function(e,t){var n,r,o,i,a,s,l="";for(n=0;n' missing in replacement named group.");if(void 0===(s=t[i=e.substring(n+2,a)]))throw new Error("Named group '"+i+"' is not defined in replacement text.");if("number"!=typeof s)throw new Error("Named replacement referencing duplicate named group '"+i+"'.");l+=s,n=a}return l}(t,this.groupsIndices);return e.replace(this,n)},i}function a(e){var t,n,o=r.mapper;return e.group=function(t,n){var r=o[t];if("number"==typeof r)return e[r];if(n)return r.map((function(t){return e[t]}));if(r)for(var i=0;ii)throw new Error("Line number ("+r+") greater than maximum line ("+i+")");var a="number"==typeof n&&Number.isFinite(n)&&n>-1,s=o.lineForRow(r),c=s.length,u=a?n:0;if(a){var d=l.getWordRegexp(e,[r,u]).exec(s.substr(n));d&&(c=u+d.index+d[0].length)}else{var f=s.match(/^\s+/);f&&(u=f[0].length)}if(u>s.length)throw new Error("Column start ("+(u||0)+") greater than line length ("+s.length+") for line "+r);return[[r,u],[r,c]]},t.find=h,t.findCached=function(e,t){l.validateFind(e,t);var n=[].concat(t),r=e+":"+n.join(","),o=m.get(r);if(o)try{return s.accessSync(o,s.R_OK),o}catch(e){m.delete(r)}var i=h(e,n);i&&m.set(r,i);return i},t.tempFile=function(e,t,n){if("string"!=typeof e)throw new Error("Invalid or no `fileName` provided");if("string"!=typeof t)throw new Error("Invalid or no `fileContents` provided");if("function"!=typeof n)throw new Error("Invalid or no `callback` provided");return i([{name:e,contents:t}],(function(e){return n(e[0])}))},t.parse=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"!=typeof e)throw new Error("Invalid or no `data` provided");if("string"!=typeof t)throw new Error("Invalid or no `regex` provided");if("object"!==(void 0===r?"undefined":n(r)))throw new Error("Invalid or no `options` provided");null===p&&(p=Nt);var o={flags:""},i=Object.assign(o,r);-1===i.flags.indexOf("g")&&(i.flags+="g");var a=[],s=new p(t,i.flags),l=s.exec(e);for(;null!==l;){var c=l.groups(),u=c.type,d=c.message,f=c.file||i.filePath||null,m=c.lineStart||c.line||0,h=c.colStart||c.col||0,g=c.lineEnd||c.line||0,v=c.colEnd||c.col||0;a.push({type:u,text:d,filePath:f,range:[[m>0?m-1:0,h>0?h-1:0],[g>0?g-1:0,v>0?v-1:0]]}),l=s.exec(e)}return a};var a=c(f.default),s=c(d.default),l=c(Ct);function c(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function u(e){return function(){var t=e.apply(this,arguments);return new Promise((function(e,n){return function r(o,i){try{var a=t[o](i),s=a.value}catch(e){return void n(e)}if(!a.done)return Promise.resolve(s).then((function(e){r("next",e)}),(function(e){r("throw",e)}));e(s)}("next")}))}}var p=null,m=t.FindCache=new Map;function h(e,t){l.validateFind(e,t);for(var n=[].concat(t),r=e.split(a.sep);r.length;){var o=r.join(a.sep);""===o&&(o=a.resolve(e,"/"));var i=!0,c=!1,u=void 0;try{for(var d,f=n[Symbol.iterator]();!(i=(d=f.next()).done);i=!0){var p=d.value,m=a.join(o,p);try{return s.accessSync(m,s.R_OK),m}catch(e){}}}catch(e){c=!0,u=e}finally{try{!i&&f.return&&f.return()}finally{if(c)throw u}}r.pop()}return null}var g=l.wrapExec(nt.exec),v=l.wrapExec(nt.execNode);t.exec=g,t.execNode=v}));const{promisify:Rt}=h.default,It=Rt(m.default.randomBytes),Lt="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~".split(""),Mt="0123456789".split(""),Dt="CDEHKMPRTUWXY012458".split(""),Ft="!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~".split(""),Ht="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),Ut=[void 0,"hex","base64","url-safe","numeric","distinguishable","ascii-printable","alphanumeric"],Wt=(e,t)=>({length:n,type:r,characters:o})=>{if(!(n>=0&&Number.isFinite(n)))throw new TypeError("Expected a `length` to be a non-negative finite number");if(void 0!==r&&void 0!==o)throw new TypeError("Expected either `type` or `characters`");if(void 0!==o&&"string"!=typeof o)throw new TypeError("Expected `characters` to be string");if(!Ut.includes(r))throw new TypeError(`Unknown type: ${r}`);if(void 0===r&&void 0===o&&(r="hex"),"hex"===r||void 0===r&&void 0===o)return t(Math.ceil(.5*n),"hex",n);if("base64"===r)return t(Math.ceil(.75*n),"base64",n);if("url-safe"===r)return e(n,Lt);if("numeric"===r)return e(n,Mt);if("distinguishable"===r)return e(n,Dt);if("ascii-printable"===r)return e(n,Ft);if("alphanumeric"===r)return e(n,Ht);if(0===o.length)throw new TypeError("Expected `characters` string length to be greater than or equal to 1");if(o.length>65536)throw new TypeError("Expected `characters` string length to be less or equal to 65536");return e(n,o.split(""))};var qt=Wt(((e,t)=>{const n=t.length,r=Math.floor(65536/n)*n-1,o=2*Math.ceil(1.1*e);let i="",a=0;for(;ar||(i+=t[e%n],a++)}}return i}),((e,t,n)=>m.default.randomBytes(e).toString(t).slice(0,n))),Kt=Wt((async(e,t)=>{const n=t.length,r=Math.floor(65536/n)*n-1,o=2*Math.ceil(1.1*e);let i="",a=0;for(;ar||(i+=t[e%n],a++)}}return i}),(async(e,t,n)=>(await It(e)).toString(t).slice(0,n)));qt.async=Kt;var zt={angular:"Gillespie59",ava:"avajs",backbone:"ilyavolodin",ember:"netguru","es6-recommended":"https://github.com/mgtitimoli/eslint-plugin-es6-recommended#rules","eslint-comments":"mysticatea","eslint-plugin":"not-an-aardvark",flowtype:"https://github.com/gajus/eslint-plugin-flowtype#RULENAME",fp:"jfmengels",github:"github",immutable:"https://github.com/jhusain/eslint-plugin-immutable#RULENAME",import:"benmosher","import-order":"jfmengels",jasmine:"tlvince",jest:"jest-community",jsdoc:"https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-RULENAME","jsx-a11y":"evcohen",lodash:"wix","lodash-fp":"jfmengels",meteor:"dferber90",mocha:"lo1tuma",mongodb:"https://github.com/nfroidure/eslint-plugin-mongodb#RULENAME",mozilla:"https://gecko.readthedocs.io/en/latest/tools/lint/linters/eslint-plugin-mozilla.html#RULENAME","netguru-ember":"https://github.com/netguru/eslint-plugin-netguru-ember/blob/master/docs/RULES.md#RULENAME","no-unsanitized":"mozilla","no-use-extend-native":"dustinspecker",node:"mysticatea",prettier:"https://github.com/prettier/eslint-plugin-prettier#options",promise:"xjamundx",protractor:"alecxe",react:"yannickcr","react-native":"Intellicode","redux-saga":"pke",requirejs:"cvisco",security:"https://github.com/nodesecurity/eslint-plugin-security#rules",standard:"https://github.com/xjamundx/eslint-plugin-standard#rules-explanations",typescript:"nzakas",unicorn:"sindresorhus",xo:"sindresorhus/eslint-plugin-unicorn",visualforce:"forcedotcom",vue:"vuejs","jsx-control-statements":"vkbansal"};for(var Vt of Object.keys(zt)){var Bt=zt[Vt];Bt.includes("/")||(Bt+="/eslint-plugin-"+Vt),2===Bt.split("/").length&&(Bt="https://github.com/"+Bt+"/blob/master/docs/rules/RULENAME.md"),zt[Vt]=Bt}var Jt=function(e){if("string"!=typeof e)throw new TypeError("ruleId must be a string, got "+typeof e);var t=e.split("/");if(1===t.length)return{found:!0,url:"https://eslint.org/docs/rules/"+e};var n=t[0],r=t[1],o=zt[n];return o?{found:!0,url:o.replace("RULENAME",r)}:{found:!1,url:"https://github.com/jfmengels/eslint-rule-documentation/blob/master/contributing.md"}};const Yt=new class{constructor(e){this.replaceRules(e)}replaceRules(e){void 0!==this.rules&&this.rules.clear(),this.rules=new Map(e)}getFixableRules(){const e=[];for(const[t,n]of this.rules)n&&n.meta&&n.meta.fixable&&e.push(t);return e}getRuleUrl(e){const t=this.rules.get(e);return t&&t.meta&&t.meta.docs&&t.meta.docs.url?t.meta.docs.url:Jt(e).url}getRules(){return this.rules}};let Xt=null;function Gt(){null===Xt&&(Xt=new o.Task(require.resolve("./worker.js"))),Xt.started||(Xt.start([]),Xt.started=!0)}function Zt(){null!==Xt&&(Xt.terminate(),Xt=null)}async function Qt(e){return Xt&&!Xt.childProcess.connected&&Zt(),Gt(),e.emitKey=qt({length:10}),new Promise(((t,n)=>{const r=Xt.on(`workerError:${e.emitKey}`,(({msg:e,stack:t})=>{const i=new Error(e);i.stack=t,r.dispose(),o.dispose(),n(i)})),o=Xt.on(e.emitKey,(e=>{r.dispose(),o.dispose(),t(e)}));try{Xt.send(e)}catch(e){r.dispose(),o.dispose(),console.error(e)}}))}async function en(){const e=atom.workspace.getActiveTextEditor();let t,n;atom.workspace.isTextEditor(e)?(t=e.getPath(),n=e.getLastCursor().getScopeDescriptor().getScopesArray()):(t="unknown",n=["unknown"]);const o=atom.packages.resolvePackagePath("linter-eslint");let i;i=void 0===o?{version:"unknown!"}:Q(r.join(o,"package.json"));const a=atom.config.get("linter-eslint"),s=Math.round(process.uptime()/3600*10)/10;let l;try{const e=await Qt({type:"debug",config:a,filePath:t});l={atomVersion:atom.getVersion(),linterEslintVersion:i.version,linterEslintConfig:a,eslintVersion:Q(r.join(e.path,"package.json")).version,hoursSinceRestart:s,platform:process.platform,eslintType:e.type,eslintPath:e.path,editorScopes:n}}catch(e){atom.notifications.addError(`${e}`)}return l}async function tn(){const e=await en();return[`Atom version: ${e.atomVersion}`,`linter-eslint version: ${e.linterEslintVersion}`,`ESLint version: ${e.eslintVersion}`,`Hours since last Atom restart: ${e.hoursSinceRestart}`,`Platform: ${e.platform}`,`Using ${e.eslintType} ESLint from: ${e.eslintPath}`,`Current file's scopes: ${JSON.stringify(e.editorScopes,null,2)}`,`linter-eslint configuration: ${JSON.stringify(e.linterEslintConfig,null,2)}`].join("\n")}function nn(e,t){const{severity:n="error",excerpt:r="",description:o}=t;return[{severity:n,excerpt:r,description:o,location:{file:e.getPath(),position:$t.generateRange(e)}}]}function rn(e,t){const{stack:n,message:r}=t;return nn(e,{severity:"error",excerpt:`Error while running ESLint: ${r.split("\n")[0]}.`,description:`${r}\n
${n}`})}async function on(e,t,n){return Promise.all(e.map((async({fatal:e,message:r,line:i,severity:a,ruleId:s,column:l,fix:c,endLine:u,endColumn:d})=>{const f=e?r.split("\n")[0]:r,p=t.getPath(),m=t.getBuffer();let h,g,v,y=null;if(c){y={position:new o.Range(m.positionForCharacterIndex(c.range[0]),m.positionForCharacterIndex(c.range[1])),replaceWith:c.text}}let w=!1;const b=i-1;"number"==typeof d&&"number"==typeof u?(w=!0,h=Math.max(0,l-1),g=u-1,v=d-1):h="number"==typeof l?l-1:l;let E={severity:1===a?"warning":"error",location:{file:p}};s&&(E.url=Yt.getRuleUrl(s));let _,x=!1;"prettier/prettier"===s&&"Delete `␍`"===f&&(x=!0);try{w?(x||(Y(m,b,h),Y(m,g,v)),_=[[b,h],[g,v]]):_=$t.generateRange(t,b,h),E.location.position=_;const e=n?` (${s||"Fatal"})`:"";E.excerpt=`${f}${e}`,y&&(E.solutions=[y])}catch(e){E=await(async({msgLine:e,msgCol:t,msgEndLine:n,msgEndCol:r,eslintFullRange:o,filePath:i,textEditor:a,ruleId:s,message:l})=>{let c=`${e+1}:${t}`;o&&(c+=` - ${n+1}:${r+1}`);const u=`Requested ${o?"start point":"range"}: ${c}`,d=`Invalid position given by '${s}'`;return{severity:"error",excerpt:`${d}. See the description for details. Click the URL to open a new issue!`,url:`https://github.com/AtomLinter/linter-eslint/issues/new?title=${encodeURIComponent(d)}&body=${encodeURIComponent(["ESLint returned a point that did not exist in the document being edited.",`Rule: \`${s}\``,u,"","","\x3c!-- If at all possible, please include code to reproduce this issue! --\x3e","","","Debug information:","```json",JSON.stringify(await en(),null,2),"```"].join("\n"))}`,location:{file:i,position:$t.generateRange(a,0)},description:`${u}\nOriginal message: ${l}`}})({msgLine:b,msgCol:h,msgEndLine:g,msgEndCol:v,eslintFullRange:w,filePath:p,textEditor:t,ruleId:s,message:f})}return E})))}async function an(e,t,n){return Object.prototype.hasOwnProperty.call(e,"updatedRules")&&Yt.replaceRules(e.updatedRules),on(e.messages,t,n)}var sn=Object.freeze({__proto__:null,rules:Yt,startWorker:Gt,killWorker:Zt,sendJob:Qt,getDebugInfo:en,generateDebugString:tn,generateUserMessage:nn,handleError:rn,processESLintMessages:on,processJobResponse:an});const ln=[{added:"January, 2018",description:"Organized config settings into sections",moves:[{old:"disableWhenNoEslintConfig",new:"disabling.disableWhenNoEslintConfig"},{old:"fixOnSave",new:"autofix.fixOnSave"},{old:"ignoreFixableRulesWhileTyping",new:"autofix.ignoreFixableRulesWhileTyping"},{old:"rulesToDisableWhileFixing",new:"autofix.rulesToDisableWhileFixing"},{old:"rulesToSilenceWhileTyping",new:"disabling.rulesToSilenceWhileTyping"},{old:"disableEslintIgnore",new:"advanced.disableEslintIgnore"},{old:"disableFSCache",new:"advanced.disableFSCache"},{old:"showRuleIdInMessage",new:"advanced.showRuleIdInMessage"},{old:"eslintrcPath",new:"global.eslintrcPath"},{old:"advancedLocalNodeModules",new:"advanced.localNodeModules"},{old:"eslintRulesDirs",new:"advanced.eslintRulesDirs"},{old:"useGlobalEslint",new:"global.useGlobalEslint"},{old:"globalNodePath",new:"global.globalNodePath"}]},{added:"September, 2017",description:"Deprecated eslintRulesDir{String} option in favor of eslintRulesDirs{Array}",migrate(e){const t=e.eslintRulesDir;if(t){0===e.eslintRulesDirs.length&&atom.config.set("linter-eslint.eslintRulesDirs",[t]),atom.config.unset("linter-eslint.eslintRulesDir")}}}];var cn=function(e=ln){if(e.length){const t=atom.config.get("linter-eslint");e.forEach((e=>{e.moves&&Array.isArray(e.moves)?e.moves.forEach((e=>{const n=t[e.old];void 0!==n&&(atom.config.set(`linter-eslint.${e.new}`,n),atom.config.unset(`linter-eslint.${e.old}`))})):"function"==typeof e.migrate&&e.migrate(t)}))}};const un=new Set,dn=e=>{let t;t=window.requestIdleCallback((()=>{un.delete(t),e()})),un.add(t)},fn=[];let pn,mn,hn,gn,vn;const yn=e=>Array.from(e).reduce(((e,t)=>Object.assign(e,{[t]:0})),{});module.exports={activate(){this.subscriptions=new o.CompositeDisposable,cn();const e="source.js.embedded.html";this.subscriptions.add(atom.config.observe("linter-eslint.lintHtmlFiles",(t=>{mn=t,mn?fn.push(e):-1!==fn.indexOf(e)&&fn.splice(fn.indexOf(e),1)}))),this.subscriptions.add(atom.config.observe("linter-eslint.scopes",(t=>{fn.splice(0,fn.length),Array.prototype.push.apply(fn,t),mn&&!fn.includes(e)&&fn.push(e)}))),this.subscriptions.add(atom.workspace.observeTextEditors((e=>{e.onDidSave((async()=>{X(e,fn)&&atom.config.get("linter-eslint.autofix.fixOnSave")&&await this.fixJob(!0)}))}))),this.subscriptions.add(atom.commands.add("atom-text-editor",{"linter-eslint:debug":async()=>{const e={detail:await tn(),dismissable:!0};atom.notifications.addInfo("linter-eslint debugging information",e)}})),this.subscriptions.add(atom.commands.add("atom-text-editor",{"linter-eslint:fix-file":async()=>{await this.fixJob()}})),this.subscriptions.add(atom.config.observe("linter-eslint.advanced.showRuleIdInMessage",(e=>{pn=e}))),this.subscriptions.add(atom.config.observe("linter-eslint.disabling.rulesToSilenceWhileTyping",(e=>{hn=e}))),this.subscriptions.add(atom.config.observe("linter-eslint.autofix.rulesToDisableWhileFixing",(e=>{gn=yn(e)}))),this.subscriptions.add(atom.config.observe("linter-eslint.autofix.ignoreFixableRulesWhileTyping",(e=>{vn=e}))),this.subscriptions.add(atom.contextMenu.add({"atom-text-editor:not(.mini), .overlayer":[{label:"ESLint Fix",command:"linter-eslint:fix-file",shouldDisplay:e=>{const t=atom.workspace.getActiveTextEditor();if(!t)return!1;return e.path.some((e=>e.component&&t.component&&e.component===t.component))&&X(t,fn)}}]})),(()=>{const e=()=>{J.install("linter-eslint")},t=()=>{Gt()};atom.inSpecMode()||(dn(e),dn(t))})()},deactivate(){un.forEach((e=>window.cancelIdleCallback(e))),un.clear(),sn&&Zt(),this.subscriptions.dispose()},provideLinter:()=>({name:"ESLint",grammarScopes:fn,scope:"file",lintsOnChange:!0,lint:async e=>{if(!atom.workspace.isTextEditor(e))return null;const t=e.getPath();if(!t)return null;if(t.includes("://"))return nn(e,{severity:"warning",excerpt:"Remote file open, linter-eslint is disabled for this file."});const n=e.getText();let r={};if(e.isModified())if(vn){const e=new Set(Yt.getFixableRules());hn.forEach((t=>e.add(t))),r=yn(e)}else r=yn(hn);try{const o=await Qt({type:"lint",contents:n,config:atom.config.get("linter-eslint"),rules:r,filePath:t,projectPath:atom.project.relativizePath(t)[0]||""});return e.getText()!==n?null:an(o,e,pn)}catch(t){return rn(e,t)}}}),async fixJob(e=!1){const t=atom.workspace.getActiveTextEditor();if(!t||!atom.workspace.isTextEditor(t))return;if(t.isModified()){const e="Linter-ESLint: Please save before fixing";atom.notifications.addError(e)}const n=t.getPath(),r=atom.project.relativizePath(n)[0],o=t.getText();if(0===o.length)return;let i={};Object.keys(gn).length>0&&(i=gn);try{const t=await Qt({type:"fix",config:atom.config.get("linter-eslint"),contents:o,rules:i,filePath:n,projectPath:r});e||atom.notifications.addSuccess(t)}catch(e){atom.notifications.addWarning(e.message)}}};
+//# sourceMappingURL=main.js.map
diff --git a/dist/main.js.map b/dist/main.js.map
new file mode 100644
index 00000000..980feca5
--- /dev/null
+++ b/dist/main.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"main.js","sources":["../node_modules/atom-package-deps/lib/index.js","../src/validate/throw.js","../src/validate/editor.js","../node_modules/lodash.uniq/index.js","../node_modules/consistent-env/lib/index.js","../node_modules/consistent-env/lib/helpers.js","../node_modules/sb-memoize/lib/index.js","../node_modules/sb-promisify/lib/index.js","../node_modules/sb-exec/lib/index.js","../node_modules/sb-npm-path/lib/helpers.js","../node_modules/sb-npm-path/lib/index.js","../node_modules/sb-exec/lib/helpers.js","../node_modules/os-tmpdir/index.js","../node_modules/tmp/lib/tmp.js","../node_modules/atom-linter/lib/helpers.js","../node_modules/named-js-regexp/lib/named-js-regexp.js","../node_modules/atom-linter/lib/index.js","../node_modules/crypto-random-string/index.js","../node_modules/eslint-rule-documentation/index.js","../src/helpers.js","../src/rules.js","../src/migrate-config-options.js","../src/main.js"],"sourcesContent":["'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar os = require('os');\nvar child_process = require('child_process');\nvar fs = require('fs');\nvar path = require('path');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar os__default = /*#__PURE__*/_interopDefaultLegacy(os);\nvar fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);\nvar path__default = /*#__PURE__*/_interopDefaultLegacy(path);\n\nvar indentString = (string, count = 1, options) => {\n\toptions = {\n\t\tindent: ' ',\n\t\tincludeEmptyLines: false,\n\t\t...options\n\t};\n\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t`Expected \\`input\\` to be a \\`string\\`, got \\`${typeof string}\\``\n\t\t);\n\t}\n\n\tif (typeof count !== 'number') {\n\t\tthrow new TypeError(\n\t\t\t`Expected \\`count\\` to be a \\`number\\`, got \\`${typeof count}\\``\n\t\t);\n\t}\n\n\tif (typeof options.indent !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t`Expected \\`options.indent\\` to be a \\`string\\`, got \\`${typeof options.indent}\\``\n\t\t);\n\t}\n\n\tif (count === 0) {\n\t\treturn string;\n\t}\n\n\tconst regex = options.includeEmptyLines ? /^/gm : /^(?!\\s*$)/gm;\n\n\treturn string.replace(regex, options.indent.repeat(count));\n};\n\nconst extractPathRegex = /\\s+at.*(?:\\(|\\s)(.*)\\)?/;\nconst pathRegex = /^(?:(?:(?:node|(?:internal\\/[\\w/]*|.*node_modules\\/(?:babel-polyfill|pirates)\\/.*)?\\w+)\\.js:\\d+:\\d+)|native)/;\nconst homeDir = typeof os__default['default'].homedir === 'undefined' ? '' : os__default['default'].homedir();\n\nvar cleanStack = (stack, options) => {\n\toptions = Object.assign({pretty: false}, options);\n\n\treturn stack.replace(/\\\\/g, '/')\n\t\t.split('\\n')\n\t\t.filter(line => {\n\t\t\tconst pathMatches = line.match(extractPathRegex);\n\t\t\tif (pathMatches === null || !pathMatches[1]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst match = pathMatches[1];\n\n\t\t\t// Electron\n\t\t\tif (\n\t\t\t\tmatch.includes('.app/Contents/Resources/electron.asar') ||\n\t\t\t\tmatch.includes('.app/Contents/Resources/default_app.asar')\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn !pathRegex.test(match);\n\t\t})\n\t\t.filter(line => line.trim() !== '')\n\t\t.map(line => {\n\t\t\tif (options.pretty) {\n\t\t\t\treturn line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~')));\n\t\t\t}\n\n\t\t\treturn line;\n\t\t})\n\t\t.join('\\n');\n};\n\nconst cleanInternalStack = stack => stack.replace(/\\s+at .*aggregate-error\\/index.js:\\d+:\\d+\\)?/g, '');\n\nclass AggregateError extends Error {\n\tconstructor(errors) {\n\t\tif (!Array.isArray(errors)) {\n\t\t\tthrow new TypeError(`Expected input to be an Array, got ${typeof errors}`);\n\t\t}\n\n\t\terrors = [...errors].map(error => {\n\t\t\tif (error instanceof Error) {\n\t\t\t\treturn error;\n\t\t\t}\n\n\t\t\tif (error !== null && typeof error === 'object') {\n\t\t\t\t// Handle plain error objects with message property and/or possibly other metadata\n\t\t\t\treturn Object.assign(new Error(error.message), error);\n\t\t\t}\n\n\t\t\treturn new Error(error);\n\t\t});\n\n\t\tlet message = errors\n\t\t\t.map(error => {\n\t\t\t\t// The `stack` property is not standardized, so we can't assume it exists\n\t\t\t\treturn typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error);\n\t\t\t})\n\t\t\t.join('\\n');\n\t\tmessage = '\\n' + indentString(message, 4);\n\t\tsuper(message);\n\n\t\tthis.name = 'AggregateError';\n\n\t\tObject.defineProperty(this, '_errors', {value: errors});\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const error of this._errors) {\n\t\t\tyield error;\n\t\t}\n\t}\n}\n\nvar aggregateError = AggregateError;\n\nvar pMap = async (\n\titerable,\n\tmapper,\n\t{\n\t\tconcurrency = Infinity,\n\t\tstopOnError = true\n\t} = {}\n) => {\n\treturn new Promise((resolve, reject) => {\n\t\tif (typeof mapper !== 'function') {\n\t\t\tthrow new TypeError('Mapper function is required');\n\t\t}\n\n\t\tif (!((Number.isSafeInteger(concurrency) || concurrency === Infinity) && concurrency >= 1)) {\n\t\t\tthrow new TypeError(`Expected \\`concurrency\\` to be an integer from 1 and up or \\`Infinity\\`, got \\`${concurrency}\\` (${typeof concurrency})`);\n\t\t}\n\n\t\tconst result = [];\n\t\tconst errors = [];\n\t\tconst iterator = iterable[Symbol.iterator]();\n\t\tlet isRejected = false;\n\t\tlet isIterableDone = false;\n\t\tlet resolvingCount = 0;\n\t\tlet currentIndex = 0;\n\n\t\tconst next = () => {\n\t\t\tif (isRejected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextItem = iterator.next();\n\t\t\tconst index = currentIndex;\n\t\t\tcurrentIndex++;\n\n\t\t\tif (nextItem.done) {\n\t\t\t\tisIterableDone = true;\n\n\t\t\t\tif (resolvingCount === 0) {\n\t\t\t\t\tif (!stopOnError && errors.length !== 0) {\n\t\t\t\t\t\treject(new aggregateError(errors));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresolvingCount++;\n\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst element = await nextItem.value;\n\t\t\t\t\tresult[index] = await mapper(element, index);\n\t\t\t\t\tresolvingCount--;\n\t\t\t\t\tnext();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (stopOnError) {\n\t\t\t\t\t\tisRejected = true;\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors.push(error);\n\t\t\t\t\t\tresolvingCount--;\n\t\t\t\t\t\tnext();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})();\n\t\t};\n\n\t\tfor (let i = 0; i < concurrency; i++) {\n\t\t\tnext();\n\n\t\t\tif (isIterableDone) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n};\n\nconst pMap$1 = (iterable, mapper, options) => new Promise((resolve, reject) => {\n\toptions = Object.assign({\n\t\tconcurrency: Infinity\n\t}, options);\n\n\tif (typeof mapper !== 'function') {\n\t\tthrow new TypeError('Mapper function is required');\n\t}\n\n\tconst {concurrency} = options;\n\n\tif (!(typeof concurrency === 'number' && concurrency >= 1)) {\n\t\tthrow new TypeError(`Expected \\`concurrency\\` to be a number from 1 and up, got \\`${concurrency}\\` (${typeof concurrency})`);\n\t}\n\n\tconst ret = [];\n\tconst iterator = iterable[Symbol.iterator]();\n\tlet isRejected = false;\n\tlet isIterableDone = false;\n\tlet resolvingCount = 0;\n\tlet currentIndex = 0;\n\n\tconst next = () => {\n\t\tif (isRejected) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextItem = iterator.next();\n\t\tconst i = currentIndex;\n\t\tcurrentIndex++;\n\n\t\tif (nextItem.done) {\n\t\t\tisIterableDone = true;\n\n\t\t\tif (resolvingCount === 0) {\n\t\t\t\tresolve(ret);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tresolvingCount++;\n\n\t\tPromise.resolve(nextItem.value)\n\t\t\t.then(element => mapper(element, i))\n\t\t\t.then(\n\t\t\t\tvalue => {\n\t\t\t\t\tret[i] = value;\n\t\t\t\t\tresolvingCount--;\n\t\t\t\t\tnext();\n\t\t\t\t},\n\t\t\t\terror => {\n\t\t\t\t\tisRejected = true;\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t);\n\t};\n\n\tfor (let i = 0; i < concurrency; i++) {\n\t\tnext();\n\n\t\tif (isIterableDone) {\n\t\t\tbreak;\n\t\t}\n\t}\n});\n\nvar pMap_1 = pMap$1;\n// TODO: Remove this for the next major release\nvar _default = pMap$1;\npMap_1.default = _default;\n\nconst pFilter = async (iterable, filterer, options) => {\n\tconst values = await pMap_1(\n\t\titerable,\n\t\t(element, index) => Promise.all([filterer(element, index), element]),\n\t\toptions\n\t);\n\treturn values.filter(value => Boolean(value[0])).map(value => value[1]);\n};\n\nvar pFilter_1 = pFilter;\n// TODO: Remove this for the next major release\nvar _default$1 = pFilter;\npFilter_1.default = _default$1;\n\nconst IS_ATOM = typeof atom !== 'undefined';\nconst IS_DEV = typeof atom !== 'undefined' && (atom.inDevMode() || atom.inSpecMode());\nconst IGNORED_CONFIG_NAME = 'atom-package-deps.ignored';\n\n/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nvar escapeHtml_1 = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n\nasync function spawnInternal(command, args, options) {\n const spawnedProcess = child_process.spawn(command, args, options);\n const promise = new Promise((resolve, reject) => {\n const output = {\n stdout: spawnedProcess.stdout ? [] : null,\n stderr: spawnedProcess.stderr ? [] : null,\n };\n spawnedProcess.on('error', reject);\n if (spawnedProcess.stdout) {\n spawnedProcess.stdout.on('data', function (chunk) {\n output.stdout.push(chunk);\n if (options.handleStdout) {\n options.handleStdout(chunk);\n }\n });\n }\n if (spawnedProcess.stderr) {\n spawnedProcess.stderr.on('data', function (chunk) {\n output.stderr.push(chunk);\n if (options.handleStderr) {\n options.handleStderr(chunk);\n }\n });\n }\n spawnedProcess.on('close', code => {\n let outputStdout = null;\n if (output.stdout != null) {\n outputStdout =\n options.encoding === null || options.encoding === 'buffer'\n ? Buffer.concat(output.stdout)\n : output.stdout.join('');\n }\n let outputStderr = null;\n if (output.stderr != null) {\n outputStderr =\n options.encoding === null || options.encoding === 'buffer'\n ? Buffer.concat(output.stderr)\n : output.stderr.join('');\n }\n resolve({\n exitCode: code,\n stdout: outputStdout,\n stderr: outputStderr,\n });\n });\n });\n options.handleChildProcess(spawnedProcess);\n return promise;\n}\nfunction spawn(command, args, options) {\n let spawnedProcess;\n const promise = spawnInternal(command, args, {\n ...options,\n handleChildProcess(_spawnedProcess) {\n spawnedProcess = _spawnedProcess;\n },\n });\n promise.kill = function (signal) {\n // TODO: kill all subprocesses on windows with wmic?\n return spawnedProcess.kill(signal);\n };\n return promise;\n}\n\nvar semverCompare = function cmp (a, b) {\n var pa = a.split('.');\n var pb = b.split('.');\n for (var i = 0; i < 3; i++) {\n var na = Number(pa[i]);\n var nb = Number(pb[i]);\n if (na > nb) return 1;\n if (nb > na) return -1;\n if (!isNaN(na) && isNaN(nb)) return 1;\n if (isNaN(na) && !isNaN(nb)) return -1;\n }\n return 0;\n};\n\nasync function getDependencies(packageName) {\n const packageModule = atom.packages.getLoadedPackage(packageName);\n const packageDependencies = packageModule && packageModule.metadata['package-deps'];\n return Array.isArray(packageDependencies) ? packageDependencies : [];\n}\nasync function resolveDependencyPath(packageName) {\n return atom.packages.resolvePackagePath(packageName);\n}\nasync function getInstalledDependencyVersion(dependency) {\n var _packageModule$metada;\n\n const packageModule = atom.packages.getLoadedPackage(dependency.name);\n return packageModule == null ? null : (_packageModule$metada = packageModule.metadata.version) !== null && _packageModule$metada !== void 0 ? _packageModule$metada : null;\n}\n\nasync function getDependencies$1(packageName) {\n let packageStats = null;\n\n try {\n packageStats = await fs__default['default'].promises.stat(packageName);\n } catch (_) {// No Op\n }\n\n if (packageStats == null || !packageStats.isDirectory()) {\n throw new Error(`[Package-Deps] Expected packageName to be a readable directory in Node.js invocation`);\n }\n\n let parsed = null;\n\n try {\n const contents = await fs__default['default'].promises.readFile(path__default['default'].join(packageName, 'package.json'), 'utf8');\n parsed = JSON.parse(contents);\n } catch (_) {// Ignore JSON read errors and such\n }\n\n const packageDependencies = parsed == null || typeof parsed !== 'object' ? [] : parsed['package-deps'];\n return Array.isArray(packageDependencies) ? packageDependencies : [];\n}\nasync function resolveDependencyPath$1(packageName) {\n var _process$env$ATOM_HOM;\n\n const packageDirectory = path__default['default'].join((_process$env$ATOM_HOM = process.env.ATOM_HOME) !== null && _process$env$ATOM_HOM !== void 0 ? _process$env$ATOM_HOM : path__default['default'].join(os__default['default'].homedir(), '.atom'), 'packages', packageName);\n\n try {\n await fs__default['default'].promises.access(packageDirectory, fs__default['default'].constants.R_OK);\n return packageDirectory;\n } catch (_) {\n return null;\n }\n}\nasync function getInstalledDependencyVersion$1(dependency) {\n var _manifest$version, _manifest;\n\n const {\n directory\n } = dependency;\n\n if (directory == null) {\n // Not possible to get version without resolved directory in Node.js version\n return null;\n }\n\n let manifest = null;\n\n try {\n manifest = JSON.parse(await fs__default['default'].promises.readFile(path__default['default'].join(directory, 'package.json'), 'utf8'));\n } catch (_) {\n return null;\n }\n\n return (_manifest$version = (_manifest = manifest) === null || _manifest === void 0 ? void 0 : _manifest.version) !== null && _manifest$version !== void 0 ? _manifest$version : null;\n}\n\n/**\n * Internal helpers\n */\n\nasync function getInstalledDependencyVersion$2(dependency) {\n if (IS_ATOM) {\n const atomPackageVersion = await getInstalledDependencyVersion(dependency);\n\n if (atomPackageVersion) {\n return atomPackageVersion;\n } // If the package isn't activated, it won't be loaded, so fallback to reading manifest file instead\n\n }\n\n return getInstalledDependencyVersion$1(dependency);\n}\n/**\n * Exported helpers\n */\n\n\nconst resolveDependencyPath$2 = IS_ATOM ? resolveDependencyPath : resolveDependencyPath$1;\nfunction invariant(condition, message) {\n if (!condition) {\n throw new Error(message !== null && message !== void 0 ? message : 'Invariant violation');\n }\n}\nasync function getDependencies$2(name) {\n const dependencies = await (IS_ATOM ? getDependencies(name) : getDependencies$1(name));\n\n if (IS_DEV) {\n invariant(Array.isArray(dependencies), `Dependencies for ${name} are not a valid array`);\n dependencies.forEach((item, index) => {\n if (Array.isArray(item)) {\n item.forEach((subitem, subindex) => {\n const invalidMessage = `Dependency#${index}#${subindex} for ${name} is invalid`;\n invariant(typeof subitem.name === 'string' && subitem.name.length > 0, invalidMessage);\n invariant(subitem.minimumVersion == null || typeof subitem.minimumVersion === 'string' && subitem.minimumVersion.length > 0, invalidMessage);\n });\n invariant(item.length > 0, `Dependency#${index} for ${name} has no group items`);\n } else {\n const invalidMessage = `Dependency#${index} for ${name} is invalid`;\n invariant(typeof item.name === 'string' && item.name.length > 0, invalidMessage);\n invariant(item.minimumVersion == null || typeof item.minimumVersion === 'string' && item.minimumVersion.length > 0, invalidMessage);\n }\n });\n }\n\n return dependencies;\n}\nasync function shouldInstallDependency(dependency) {\n if (dependency.directory == null) {\n // Not installed, so install\n return true;\n }\n\n if (dependency.minimumVersion == null) {\n // Already installed and no version defined, so skip\n return false;\n }\n\n const version = await getInstalledDependencyVersion$2(dependency);\n\n if (version == null) {\n // Unable to get current version, so install\n return true;\n }\n\n return semverCompare(dependency.minimumVersion, version) === 1;\n}\nfunction isPackageIgnored(name) {\n var _atom$config$get;\n\n if (!IS_ATOM) {\n // Never ignored in CLI\n return false;\n }\n\n const ignoredPackages = (_atom$config$get = atom.config.get(IGNORED_CONFIG_NAME)) !== null && _atom$config$get !== void 0 ? _atom$config$get : [];\n\n if (ignoredPackages.includes(name)) {\n return true;\n }\n\n return false;\n}\nfunction markPackageAsIgnored(name) {\n var _atom$config$get2;\n\n if (!IS_ATOM) {\n // No op in CLI\n return;\n }\n\n const ignoredPackages = new Set((_atom$config$get2 = atom.config.get(IGNORED_CONFIG_NAME)) !== null && _atom$config$get2 !== void 0 ? _atom$config$get2 : []);\n ignoredPackages.add(name);\n atom.config.set(IGNORED_CONFIG_NAME, Array.from(ignoredPackages));\n}\nconst INSTALL_VALID_TICKS = new Set(['✓', 'done']);\nconst INSTALL_VALIDATION_REGEXP = /(?:Installing|Moving) (.*?) to .* (.*)/; // Example success output: Uninstalling linter-ui-default ✓\n\nasync function installPackage(dependency) {\n const apmPath = IS_ATOM ? `\"${atom.packages.getApmPath()}\"` : 'apm';\n const {\n stdout,\n stderr\n } = await spawn(apmPath, ['install', dependency.name, '--production', '--color', 'false'], {\n shell: true\n });\n const match = INSTALL_VALIDATION_REGEXP.exec(stdout.trim());\n\n if (match != null && INSTALL_VALID_TICKS.has(match[2])) {\n // Installation complete and verified\n return;\n }\n\n const error = new Error(`Error installing dependency: ${dependency.name}`);\n error.stack = stderr.trim();\n throw error;\n}\nasync function getResolvedDependency(item) {\n // string entry\n if (typeof item === 'string') {\n return {\n name: item,\n directory: await resolveDependencyPath$2(item)\n };\n }\n\n if ('name' in item) {\n return { ...item,\n directory: await resolveDependencyPath$2(item.name)\n };\n }\n\n console.error(`This package-deps entry is not valid. Please see https://github.com/steelbrain/package-deps#how-it-works`, {\n entry: item\n });\n throw Error(`The package-deps entry is not valid. Please see https://github.com/steelbrain/package-deps#how-it-works`);\n}\n\nlet showResetInstruction = true;\nfunction confirmPackagesToInstall({\n packageName,\n dependencies\n}) {\n return new Promise(resolve => {\n const ungroupedDependencies = dependencies.filter(item => !Array.isArray(item));\n const groupedDependencies = dependencies.filter(item => Array.isArray(item));\n const skipGroups = groupedDependencies.length === 0;\n const detail = skipGroups ? ungroupedDependencies.map(item => item.name).join(', ') : 'Something went wrong. Check your developer console';\n const groupChoices = groupedDependencies.map(item => item[0]); // If Atom \"notifications\" package is disabled output a warning in case no other notifications package is installed.\n\n if (atom.packages.isPackageDisabled('notifications')) {\n console.warn(`Enable notifications to install dependencies for ${packageName}`);\n }\n\n const notification = atom.notifications.addInfo(`${packageName} needs to install dependencies`, {\n dismissable: true,\n icon: 'cloud-download',\n detail,\n description: `Install dependenc${dependencies.length === 1 ? 'y' : 'ies'}?`,\n buttons: [{\n text: 'Yes',\n onDidClick: () => {\n if (skipGroups) {\n resolve(ungroupedDependencies);\n } else {\n resolve(ungroupedDependencies.concat(groupChoices));\n }\n\n notification.dismiss();\n }\n }, {\n text: 'No Thanks',\n onDidClick: () => {\n notification.dismiss();\n }\n }, {\n text: 'Never',\n onDidClick: () => {\n markPackageAsIgnored(packageName);\n\n if (showResetInstruction) {\n showResetInstruction = false;\n atom.notifications.addInfo('How to reset package-deps memory', {\n dismissable: true,\n description: \"To modify the list of ignored files invoke 'Application: Open Your Config' and change the 'atom-package-deps' section\"\n });\n }\n\n notification.dismiss();\n }\n }]\n });\n notification.onDidDismiss(() => resolve([]));\n\n if (skipGroups) {\n return;\n } // Handle groups\n\n\n try {\n var _notificationView$ele;\n\n const notificationView = atom.views.getView(notification);\n const notificationElement = (_notificationView$ele = notificationView === null || notificationView === void 0 ? void 0 : notificationView.element) !== null && _notificationView$ele !== void 0 ? _notificationView$ele : null;\n\n if (notificationElement == null) {\n throw new Error('Unable to get notification element from view');\n }\n\n const notificationContent = notificationElement.querySelector('.detail-content');\n\n if (notificationContent == null) {\n throw new Error('Content detail container not found inside the notification');\n } // Clear the contents and add some skel\n\n\n notificationContent.innerHTML = ''; // Add list of ungroup dependencies to the top of the notification\n\n if (ungroupedDependencies.length > 0) {\n const ungroupedLine = document.createElement('div');\n ungroupedLine.innerHTML = `Packages without choices: ${ungroupedDependencies.map(item => escapeHtml_1(item.name)).join(' ')} `;\n notificationContent.appendChild(ungroupedLine);\n } // Create a label line for groups\n\n\n const groupLabelLine = document.createElement('div');\n groupLabelLine.innerHTML = `Packages with choices:`;\n notificationContent.appendChild(groupLabelLine); // Create one line per group with a select inside\n\n const groupedList = document.createElement('ul');\n groupedDependencies.forEach((item, index) => {\n const listItem = document.createElement('li');\n const select = document.createElement('select');\n select.innerHTML = item.map(subitem => `${escapeHtml_1(subitem.name)} `).join('\\n');\n select.addEventListener('change', () => {\n // Change the selected value for this index for resolve to use\n const subitem = item.find(entry => entry.name === select.value);\n\n if (subitem != null) {\n groupChoices[index] = subitem;\n }\n });\n listItem.style.marginTop = '5px';\n listItem.appendChild(select);\n groupedList.appendChild(listItem);\n });\n notificationContent.appendChild(groupedList);\n } catch (err) {\n console.error('[Package-Deps] Error during showing package choices to user', err);\n }\n });\n}\nfunction getView({\n packageName,\n dependencies\n}) {\n const failed = [];\n const notification = atom.notifications.addInfo(`Installing ${packageName} dependencies`, {\n detail: `Installing ${dependencies.map(item => item.name).join(', ')}`,\n dismissable: true\n });\n const progress = document.createElement('progress');\n progress.max = dependencies.length;\n progress.style.width = '100%';\n\n try {\n var _notificationView$ele2;\n\n const notificationView = atom.views.getView(notification);\n const notificationElement = (_notificationView$ele2 = notificationView === null || notificationView === void 0 ? void 0 : notificationView.element) !== null && _notificationView$ele2 !== void 0 ? _notificationView$ele2 : null;\n\n if (notificationElement == null) {\n throw new Error('Unable to get notification element from view');\n }\n\n const notificationContent = notificationElement.querySelector('.detail-content');\n\n if (notificationContent == null) {\n throw new Error('Content detail container not found inside the notification');\n }\n\n notificationContent.appendChild(progress);\n } catch (err) {\n console.error('[Package-Deps] Error during showing installation progress to user', err);\n }\n\n return {\n handleFailure({\n dependency,\n error\n }) {\n var _error$stack;\n\n failed.push(dependency.name);\n progress.value += 1;\n console.error(`[Package-Deps] Unable to install ${dependency.name}, Error:`, (_error$stack = error === null || error === void 0 ? void 0 : error.stack) !== null && _error$stack !== void 0 ? _error$stack : error);\n },\n\n handleDependencyInstalled(dependency) {\n progress.value += 1;\n },\n\n handleComplete() {\n notification.dismiss();\n\n if (failed.length > 0) {\n atom.notifications.addWarning(`Failed to install ${packageName} dependencies`, {\n detail: `These packages were not installed, check your console\\nfor more info.\\n${failed.join('\\n')}`,\n dismissable: true\n });\n } else {\n atom.notifications.addSuccess(`Installed ${packageName} dependencies`, {\n detail: `Installed ${dependencies.map(item => item.name).join(', ')}`\n });\n }\n\n Promise.all(dependencies.map(item => {\n if (!failed.includes(item.name)) {\n return atom.packages.activatePackage(item.name);\n }\n\n return null;\n })).catch(err => {\n console.error(`[Package-Deps] Error activating installed packages for ${packageName}`, err);\n });\n }\n\n };\n}\n\nasync function confirmPackagesToInstall$1({\n dependencies\n}) {\n // No user interaction on the CLI. Install the first (aka \"default\" choice) package\n return dependencies.map(item => Array.isArray(item) ? item[0] : item);\n}\nfunction getView$1({\n dependencies\n}) {\n let failed = false;\n console.log(`Installing dependencies:\\n${dependencies.map(item => ` - ${item.name}`).join('\\n')}`);\n return {\n handleFailure({\n dependency,\n error\n }) {\n var _error$stack;\n\n failed = true;\n console.error(`Unable to install ${dependency.name}, Error:`, (_error$stack = error === null || error === void 0 ? void 0 : error.stack) !== null && _error$stack !== void 0 ? _error$stack : error);\n },\n\n handleDependencyInstalled(dependency) {\n console.log('Successfully installed', dependency.name);\n },\n\n handleComplete() {\n console.log('Installation complete');\n\n if (failed) {\n // Fail the invocation\n process.exitCode = 1;\n }\n }\n\n };\n}\n\nconst getView$2 = IS_ATOM ? getView : getView$1;\nconst confirmPackagesToInstall$2 = IS_ATOM ? confirmPackagesToInstall : confirmPackagesToInstall$1;\n\nasync function install(packageName, hideUserPrompt = false) {\n invariant(typeof packageName === 'string' && packageName.length > 0, '[Package-Deps] Package name is required');\n\n if (isPackageIgnored(packageName)) {\n // User ignored this package\n return;\n } // Get list of relevant dependencies\n\n\n const dependencies = await getDependencies$2(packageName);\n\n if (dependencies.length === 0) {\n // Short-circuit\n return;\n } // Resolve directories of relevant dependencies\n\n\n const resolvedDependencies = await Promise.all(dependencies.map(async item => {\n if (Array.isArray(item)) {\n return Promise.all(item.map(getResolvedDependency));\n }\n\n return getResolvedDependency(item);\n })); // Filter out already installed, in range dependencies\n // If one dependency from a group is already installed, whole group is ignored\n\n const dependenciesToInstall = await pFilter_1(resolvedDependencies, async function (item) {\n if (Array.isArray(item)) {\n return (await Promise.all(item.map(subitem => shouldInstallDependency(subitem)))).every(Boolean);\n }\n\n return shouldInstallDependency(item);\n });\n\n if (dependenciesToInstall.length === 0) {\n // Short-circuit if all have been skipped\n return;\n }\n\n let chosenDependencies;\n\n if (!hideUserPrompt) {\n chosenDependencies = await confirmPackagesToInstall$2({\n packageName,\n dependencies: dependenciesToInstall\n });\n } else {\n // prompt-less installation\n chosenDependencies = dependenciesToInstall.map(dep => {\n if (Array.isArray(dep)) {\n return dep[0];\n }\n\n return dep;\n });\n }\n\n if (chosenDependencies.length === 0) {\n // Short-circuit if user interaction cancelled all\n return;\n }\n\n const view = getView$2({\n packageName,\n dependencies: chosenDependencies\n });\n await pMap(chosenDependencies, async function (dependency) {\n try {\n await installPackage(dependency);\n view.handleDependencyInstalled(dependency);\n } catch (err) {\n view.handleFailure({\n dependency,\n error: err\n });\n }\n }, {\n concurrency: 2\n });\n view.handleComplete();\n}\n\nexports.install = install;\n","const throwIfFail = (msg, passed) => {\n if (!passed) {\n throw new Error(msg)\n }\n return true\n}\n\nexport default throwIfFail\n","import throwIfFail from './throw'\n\nexport const isValidPoint = (textBuffer, line, column) => {\n // Clip the given point to a valid one\n const validPoint = textBuffer.clipPosition([line, column])\n // Compare to original\n return validPoint.isEqual([line, column])\n}\n\nexport const throwIfInvalidPoint = (textBuffer, line, column) => (\n throwIfFail(\n `${line}:${column} isn't a valid point!`,\n isValidPoint(textBuffer, line, column)\n ))\n\nexport const hasValidScope = (editor, validScopes) => editor.getCursors()\n .some(cursor => cursor.getScopeDescriptor()\n .getScopesArray()\n .some(scope => validScopes.includes(scope)))\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array ? array.length : 0;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\n/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return baseFindIndex(array, baseIsNaN, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\n/**\n * Checks if a cache value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n Set = getNative(root, 'Set'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each\n * element is kept.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length)\n ? baseUniq(array)\n : [];\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = uniq;\n","'use strict';\n\nvar _path = require('path');\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _helpers = require('./helpers');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = function () {\n if (process.platform === 'win32' || !process.env.SHELL) {\n return (0, _helpers.assign)({}, process.env);\n }\n if (global[_helpers.CACHE_KEY]) {\n return (0, _helpers.assign)({}, global[_helpers.CACHE_KEY]);\n }\n var shellName = _path2.default.basename(process.env.SHELL);\n if (_helpers.KNOWN_SHELLS.indexOf(shellName) === -1) {\n return (0, _helpers.assign)({}, process.env);\n }\n try {\n var environment = (0, _helpers.applySugar)((0, _helpers.parse)((0, _helpers.identifyEnvironment)()));\n global[_helpers.CACHE_KEY] = environment;\n return environment;\n } catch (error) {\n console.error('[consistent-env] Unable to determine environment', error);\n return (0, _helpers.assign)({}, process.env);\n }\n};\n\nmodule.exports.async = function () {\n return new Promise(function (resolve) {\n if (process.platform === 'win32' || !process.env.SHELL) {\n resolve((0, _helpers.assign)({}, process.env));\n } else if (global[_helpers.CACHE_KEY]) {\n resolve((0, _helpers.assign)({}, global[_helpers.CACHE_KEY]));\n } else {\n var shellName = _path2.default.basename(process.env.SHELL);\n if (_helpers.KNOWN_SHELLS.indexOf(shellName) === -1) {\n resolve((0, _helpers.assign)({}, process.env));\n } else {\n resolve((0, _helpers.identifyEnvironmentAsync)().then(_helpers.parse).then(_helpers.applySugar).then(function (environment) {\n global[_helpers.CACHE_KEY] = environment;\n return environment;\n }));\n }\n }\n }).catch(function (error) {\n console.error('[consistent-env] Unable to determine environment', error);\n return (0, _helpers.assign)({}, process.env);\n });\n};","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.assign = exports.CACHE_KEY = exports.KNOWN_SHELLS = undefined;\nexports.identifyEnvironment = identifyEnvironment;\nexports.identifyEnvironmentAsync = identifyEnvironmentAsync;\nexports.parse = parse;\nexports.applySugar = applySugar;\nexports.getCommand = getCommand;\n\nvar _path = require('path');\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _lodash = require('lodash.uniq');\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _child_process = require('child_process');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SPAWN_TIMEOUT = 4000;\n\nvar DEFAULT_PATHS = ['/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin'];\nvar KNOWN_SHELLS = exports.KNOWN_SHELLS = ['zsh', 'bash', 'fish'];\nvar CACHE_KEY = exports.CACHE_KEY = '__STEELBRAIN_CONSISTENT_ENV_V1';\nvar assign = exports.assign = Object.assign || function (target, source) {\n for (var key in source) {\n if ({}.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n return target;\n};\n\nfunction identifyEnvironment() {\n var _getCommand = getCommand(),\n command = _getCommand.command,\n parameters = _getCommand.parameters,\n options = _getCommand.options;\n\n options.timeout = SPAWN_TIMEOUT;\n return (0, _child_process.spawnSync)(command, parameters, options).stdout.toString().split('\\0');\n}\n\nfunction identifyEnvironmentAsync() {\n return new Promise(function (resolve, reject) {\n var _getCommand2 = getCommand(),\n command = _getCommand2.command,\n parameters = _getCommand2.parameters,\n options = _getCommand2.options;\n\n var childProcess = (0, _child_process.spawn)(command, parameters, options);\n var stdout = [];\n var timer = setTimeout(function () {\n childProcess.kill();\n reject(new Error('Process execution timed out'));\n }, SPAWN_TIMEOUT);\n childProcess.stdout.on('data', function (chunk) {\n stdout.push(chunk);\n });\n childProcess.on('close', function () {\n clearTimeout(timer);\n resolve(stdout.join('').split('\\0'));\n });\n childProcess.on('error', function (error) {\n reject(error);\n });\n });\n}\n\nfunction parse(rawEnvironment) {\n var environment = {};\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = rawEnvironment[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var chunk = _step.value;\n\n var index = chunk.indexOf('=');\n if (index !== -1) {\n var key = chunk.slice(0, index);\n var value = chunk.slice(index + 1);\n environment[key] = value;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return environment;\n}\n\nfunction applySugar(environment) {\n var path = process.env.PATH ? process.env.PATH.split(':') : [];\n if (environment.PATH) {\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = environment.PATH.split(':')[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var chunk = _step2.value;\n\n if (chunk && path.indexOf(chunk) === -1) {\n path.push(chunk);\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n }\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = DEFAULT_PATHS[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var entry = _step3.value;\n\n if (path.indexOf(entry) === -1) {\n path = [entry].concat(path);\n }\n }\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3.return) {\n _iterator3.return();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n\n if (!environment.USER) {\n if (process.env.USER) {\n environment.USER = process.env.USER;\n } else if (environment.HOME) {\n environment.USER = _path2.default.basename(environment.HOME);\n }\n }\n\n environment.PATH = (0, _lodash2.default)(path).join(':');\n environment.PWD = process.cwd();\n environment.OLDPWD = environment.PWD;\n return environment;\n}\n\nfunction getCommand() {\n // Print the environment separated by \\0\n var pyScript = 'import os;print(\\\\\"\\\\0\\\\\".join(map(\\\\\"=\\\\\".join, dict(os.environ).items()))+\\\\\"\\\\0\\\\\")';\n var shScript = 'python -c \"' + pyScript + '\"||' + 'python3 -c \"' + pyScript + '\"||' +\n // If python is not available, fallback to a POSIX compatible\n // way of retrieving the environment separated by \\0.\n 'env|' +\n // Find all names of potential environment variables.\n // This also returns variable assignments that are in the value\n // of another environment variable.\n 'sed -n -e \"s/^\\\\([A-Za-z_][A-Za-z0-9_]*\\\\)=.*/\\\\1/p\"|' + 'while read name;' + 'do ' +\n // Check if the variable name is defined in the shell, thus\n // weeding out names that are not real environment variables.\n '[ \"$name\" != \"_\" -a -n \"$(eval \"printf \\\\\"%s\\\\\" \\\\\"\\\\${$name+x}\\\\\"\")\" ]&&' + // eslint-disable-line no-template-curly-in-string\n // Retrieve the value with an indirect variable reference.\n // This method has the drawback, that we have to ignore all\n // environment variables, whose names are not valid identifier.\n // As POSIX compatible environment variable names are valid\n // identifiers, this shouldn't cause problems.\n // The shell defines some variables on its own (like RANDOM).\n // Environment variables with the same name will be overwritten.\n 'value=\"$(eval \"printf \\\\\"%s\\\\\" \\\\\"\\\\${$name}\\\\\"\")\"&&' + // eslint-disable-line no-template-curly-in-string\n // Output the environment variable separated by \\0.\n 'printf \"%s=%s\\\\0\" \"$name\" \"$value\";' + 'done;' + 'exit;';\n // Wrap the script with sh for incompatible shells.\n var wrappedShScript = 'sh -c \\'' + shScript + '\\';exit;';\n var command = process.env.SHELL || 'sh';\n var options = { encoding: 'utf8' };\n var parameters = ['-c', wrappedShScript];\n\n var shell = _path2.default.basename(command);\n if (shell === 'bash') {\n parameters = ['-c', 'source ~/.bashrc;source ~/.bash_profile;' + shScript];\n } else if (shell === 'zsh') {\n parameters = ['-c', 'source ~/.zshrc;' + shScript];\n } else if (shell === 'fish') {\n parameters = ['-c', 'source ~/.config/fish/config.fish;' + wrappedShScript];\n } else if (shell === 'sh' || shell === 'ksh') {\n parameters = ['-c', shScript];\n }\n\n return { command: command, parameters: parameters, options: options };\n}","'use strict';\n\nvar CACHE_DELETED = Symbol('cache deleted');\n\nfunction memoize(callback) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n function memoized() {\n for (var _len = arguments.length, parameters = Array(_len), _key = 0; _key < _len; _key++) {\n parameters[_key] = arguments[_key];\n }\n\n var cacheKey = JSON.stringify(parameters);\n var parametersLength = parameters.length;\n\n if (cacheKey in memoized.__sb_cache && memoized.__sb_cache[cacheKey] !== CACHE_DELETED) {\n var _value = memoized.__sb_cache[cacheKey];\n if (options.async && !(_value && _value.constructor.name === 'Promise')) {\n return Promise.resolve(_value);\n }\n return _value;\n }\n\n var value = void 0;\n if (parametersLength === 1) {\n value = callback.call(this, parameters[0]);\n } else if (parametersLength === 2) {\n value = callback.call(this, parameters[0], parameters[1]);\n } else if (parametersLength === 3) {\n value = callback.call(this, parameters[0], parameters[1], parameters[2]);\n } else if (parametersLength === 4) {\n value = callback.call(this, parameters[0], parameters[1], parameters[2], parameters[3]);\n } else {\n value = callback.apply(this, parameters);\n }\n\n memoized.__sb_cache[cacheKey] = value;\n if (options.async) {\n if (!value || value.constructor.name !== 'Promise') {\n throw new Error('Memoization Error, Async function returned non-promise value');\n }\n return value.then(function (realValue) {\n memoized.__sb_cache[cacheKey] = realValue;\n return realValue;\n }, function (error) {\n memoized.__sb_cache[cacheKey] = CACHE_DELETED;\n throw error;\n });\n }\n return value;\n }\n memoized.__sb_cache = {};\n\n return memoized;\n}\n\nmodule.exports = memoize;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nfunction promisify(callback) {\n var throwError = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\n\n return function promisified() {\n var _this = this;\n\n for (var _len = arguments.length, parameters = Array(_len), _key = 0; _key < _len; _key++) {\n parameters[_key] = arguments[_key];\n }\n\n var promise = new Promise(function (resolve, reject) {\n parameters.push(function (error, data) {\n if (error) {\n reject(error);\n } else resolve(data);\n });\n callback.apply(_this, parameters);\n });\n if (!throwError) {\n promise = promise.then(function (result) {\n return typeof result === 'undefined' ? true : result;\n }).catch(function () {\n return false;\n });\n }\n return promise;\n };\n}\n\nfunction promisifyAll(object) {\n var throwError = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\n\n var duplicate = Object.assign({}, object);\n for (var item in duplicate) {\n if (!{}.hasOwnProperty.call(duplicate, item) || typeof duplicate[item] !== 'function') {\n continue;\n }\n duplicate[item + 'Async'] = promisify(duplicate[item], throwError);\n }\n return duplicate;\n}\n\nexports.default = promisify;\nexports.promisify = promisify;\nexports.promisifyAll = promisifyAll;","'use strict';\n\nvar exec = function () {\n var _ref = _asyncToGenerator(function* (givenFilePath, givenParameters, options, callback) {\n var nodeSpawnOptions = yield (0, _helpers.getSpawnOptions)(options);\n var filePath = givenFilePath;\n var parameters = givenParameters;\n var spawnedCmdOnWindows = false;\n\n if ((0, _helpers.shouldNormalizeForWindows)(filePath, options)) {\n nodeSpawnOptions.windowsVerbatimArguments = true;\n var cmdArgs = [filePath];\n // filePath must be escaped if it has a \\s in it, otherwise it must not\n if (/\\s/.test(filePath)) {\n cmdArgs = cmdArgs.map(_helpers.escape);\n }\n cmdArgs = cmdArgs.concat(parameters.map(_helpers.escape));\n filePath = process.env.comspec || 'cmd.exe';\n parameters = ['/s', '/c', '\"' + cmdArgs.join(' ') + '\"'];\n spawnedCmdOnWindows = true;\n }\n\n return new Promise(function (resolve, reject) {\n var spawnedProcess = (0, _child_process.spawn)(filePath, parameters, nodeSpawnOptions);\n var data = { stdout: [], stderr: [] };\n var timeout = void 0;\n\n if (spawnedProcess.stdout) {\n spawnedProcess.stdout.on('data', function (chunk) {\n data.stdout.push(chunk);\n });\n }\n if (spawnedProcess.stderr) {\n spawnedProcess.stderr.on('data', function (chunk) {\n data.stderr.push(chunk);\n });\n }\n spawnedProcess.on('error', function (error) {\n reject(error);\n });\n spawnedProcess.on('close', function (exitCode) {\n clearTimeout(timeout);\n\n var stdout = data.stdout.join('').trim();\n var stderr = data.stderr.join('').trim();\n\n // NOTE: On windows, we spawn everything through cmd.exe\n // So we have to manually construct ENOENT from it's error message\n if (spawnedCmdOnWindows && stderr === '\\'' + givenFilePath + '\\' is not recognized as an internal or external command,\\r\\noperable program or batch file.') {\n reject((0, _helpers.getENOENTError)(givenFilePath, givenParameters));\n return;\n }\n\n if (options.stream === 'stdout') {\n if (stderr && options.throwOnStderr) {\n reject(new Error(stderr));\n } else if (exitCode !== 0 && !options.ignoreExitCode) {\n console.error('[exec] Process exited with no-zero code, stdout: ', stdout);\n reject(new Error('Process exited with non-zero code: ' + exitCode));\n } else {\n resolve(stdout);\n }\n } else if (options.stream === 'stderr') {\n if (stderr.length === 0 && !options.allowEmptyStderr) {\n reject(new Error('Process exited with no output, code: ' + exitCode));\n } else {\n resolve(stderr);\n }\n } else {\n resolve({ stdout: stdout, stderr: stderr, exitCode: exitCode });\n }\n });\n\n if (spawnedProcess.stdin) {\n if (options.stdin) {\n try {\n spawnedProcess.stdin.write(options.stdin);\n } catch (_) {/* No Op */}\n }\n try {\n spawnedProcess.stdin.end();\n } catch (_) {/* No Op */}\n }\n\n if (options.timeout !== Infinity) {\n timeout = setTimeout(function () {\n // eslint-disable-next-line no-use-before-define\n killProcess(spawnedProcess);\n reject(new Error('Process execution timed out'));\n }, options.timeout);\n }\n callback(spawnedProcess);\n });\n });\n\n return function exec(_x, _x2, _x3, _x4) {\n return _ref.apply(this, arguments);\n };\n}();\n\n// NOTE: This proxy function is required to allow .kill() in different stages of process spawn\n// We cannot put this logic into exec() directly because it's an async function and doesn't\n// allow us to temper the underlying promise\n\n\nvar killProcess = function () {\n var _ref2 = _asyncToGenerator(function* (spawnedProcess) {\n var signal = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'SIGTERM';\n\n var spawnfile = _path2.default.basename(spawnedProcess.spawnfile);\n if (process.platform !== 'win32' || spawnfile === 'wmic.exe' || spawnfile === 'wmic') {\n // Also do this if the process is wmic\n spawnedProcess.kill(signal);\n return;\n }\n try {\n var output = yield execProxy('wmic', ['process', 'where', '(ParentProcessId=' + spawnedProcess.pid + ')', 'get', 'processid'], { stream: 'stdout', timeout: 60 * 1000 });\n output.split(/\\s+/).filter(function (i) {\n return (/^\\d+$/.test(i)\n );\n }).map(function (i) {\n return parseInt(i, 10);\n }).filter(function (i) {\n return i !== spawnedProcess.pid && i > 0;\n }).forEach(function (pid) {\n process.kill(pid, signal);\n });\n } catch (error) {/* No Op */}\n });\n\n return function killProcess(_x7) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nvar _path = require('path');\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _child_process = require('child_process');\n\nvar _helpers = require('./helpers');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nfunction execProxy(filePath) {\n var parameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var givenOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var options = (0, _helpers.validate)(filePath, parameters, givenOptions);\n var killSignal = null;\n var spawnedProcess = null;\n var promise = exec(filePath, parameters, options, function (spawnedChildProcess) {\n if (killSignal) {\n // eslint-disable-next-line no-use-before-define\n killProcess(spawnedChildProcess, killSignal);\n } else {\n spawnedProcess = spawnedChildProcess;\n }\n });\n promise.kill = function (givenKillSignal) {\n if (spawnedProcess) {\n // eslint-disable-next-line no-use-before-define\n killProcess(spawnedProcess, givenKillSignal);\n } else {\n killSignal = givenKillSignal || 'SIGTERM';\n }\n };\n return promise;\n}\n\nfunction execNode(filePath) {\n var parameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var givenOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n (0, _helpers.validate)(filePath, parameters, givenOptions);\n return execProxy(process.execPath, [filePath].concat(parameters), givenOptions);\n}\n\nmodule.exports = { exec: execProxy, execNode: execNode };","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.findAsync = exports.find = undefined;\n\nvar findItemAsync = function () {\n var _ref = _asyncToGenerator(function* (directory, name) {\n var names = [].concat(name);\n var chunks = directory.split(_path2.default.sep);\n\n while (chunks.length) {\n var currentDir = chunks.join(_path2.default.sep);\n if (currentDir === '') {\n currentDir = _path2.default.resolve(directory, '/');\n }\n for (var i = 0, length = names.length; i < length; ++i) {\n var fileName = names[i];\n var filePath = _path2.default.join(currentDir, fileName);\n try {\n yield access(filePath, _fs2.default.R_OK);\n return filePath;\n } catch (_) {\n // Do nothing\n }\n }\n chunks.pop();\n }\n\n return null;\n });\n\n return function findItemAsync(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\nvar _path = require('path');\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _fs = require('fs');\n\nvar _fs2 = _interopRequireDefault(_fs);\n\nvar _sbMemoize = require('sb-memoize');\n\nvar _sbMemoize2 = _interopRequireDefault(_sbMemoize);\n\nvar _sbPromisify = require('sb-promisify');\n\nvar _sbPromisify2 = _interopRequireDefault(_sbPromisify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { return step(\"next\", value); }, function (err) { return step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar access = (0, _sbPromisify2.default)(_fs2.default.access);\n\nfunction findItem(directory, name) {\n var names = [].concat(name);\n var chunks = directory.split(_path2.default.sep);\n\n while (chunks.length) {\n var currentDir = chunks.join(_path2.default.sep);\n if (currentDir === '') {\n currentDir = _path2.default.resolve(directory, '/');\n }\n for (var i = 0, length = names.length; i < length; ++i) {\n var fileName = names[i];\n var filePath = _path2.default.join(currentDir, fileName);\n\n try {\n _fs2.default.accessSync(filePath, _fs2.default.R_OK);\n return filePath;\n } catch (_) {\n // Do nothing\n }\n }\n chunks.pop();\n }\n\n return null;\n}\n\nvar find = exports.find = (0, _sbMemoize2.default)(findItem);\nvar findAsync = exports.findAsync = (0, _sbMemoize2.default)(findItemAsync, { async: true });","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.clearCache = exports.getPathAsync = exports.getPath = undefined;\n\nvar getPathAsync = function () {\n var _ref = _asyncToGenerator(function* () {\n var givenCurrentDirectory = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0];\n\n var currentDirectory = givenCurrentDirectory;\n if (!currentDirectory) {\n currentDirectory = process.cwd();\n }\n return (yield (0, _helpers.findAsync)(currentDirectory, _path2.default.join('node_modules', '.bin'))) || '';\n });\n\n return function getPathAsync(_x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\nvar _path = require('path');\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _helpers = require('./helpers');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { return step(\"next\", value); }, function (err) { return step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nfunction getPath() {\n var givenCurrentDirectory = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0];\n\n var currentDirectory = givenCurrentDirectory;\n if (!currentDirectory) {\n currentDirectory = process.cwd();\n }\n return (0, _helpers.find)(currentDirectory, _path2.default.join('node_modules', '.bin')) || '';\n}\n\nfunction clearCache() {\n _helpers.find.__sb_cache = {};\n _helpers.findAsync.__sb_cache = {};\n}\n\nexports.default = getPath;\nexports.getPath = getPath;\nexports.getPathAsync = getPathAsync;\nexports.clearCache = clearCache;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getSpawnOptions = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar getSpawnOptions = exports.getSpawnOptions = function () {\n var _ref = _asyncToGenerator(function* (options) {\n var spawnOptions = Object.assign({}, options, {\n env: mergeEnv((yield (0, _consistentEnv.async)()), options.env)\n });\n var npmPath = void 0;\n var local = options.local;\n if (local) {\n npmPath = yield (0, _sbNpmPath.getPathAsync)(local.directory);\n }\n if (local && npmPath) {\n for (var key in spawnOptions.env) {\n if ({}.hasOwnProperty.call(spawnOptions.env, key) && key === 'PATH') {\n var value = spawnOptions.env[key];\n spawnOptions.env[key] = local.prepend ? npmPath + PATH_SEPARATOR + value : value + PATH_SEPARATOR + npmPath;\n break;\n }\n }\n }\n delete spawnOptions.timeout;\n if (spawnOptions.env.OS) {\n spawnOptions.env.OS = undefined;\n }\n if (process.versions.electron) {\n spawnOptions.env.ELECTRON_RUN_AS_NODE = '1';\n spawnOptions.env.ATOM_SHELL_INTERNAL_RUN_AS_NODE = '1';\n spawnOptions.env.ELECTRON_NO_ATTACH_CONSOLE = '1';\n }\n return spawnOptions;\n });\n\n return function getSpawnOptions(_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\nexports.validate = validate;\nexports.mergePath = mergePath;\nexports.mergeEnv = mergeEnv;\nexports.escape = escape;\nexports.shouldNormalizeForWindows = shouldNormalizeForWindows;\nexports.getENOENTError = getENOENTError;\n\nvar _path = require('path');\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _assert = require('assert');\n\nvar _assert2 = _interopRequireDefault(_assert);\n\nvar _lodash = require('lodash.uniq');\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _consistentEnv = require('consistent-env');\n\nvar _sbNpmPath = require('sb-npm-path');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar PATH_SEPARATOR = process.platform === 'win32' ? ';' : ':';\n\nfunction validate(filePath, parameters, givenOptionsAccepted) {\n // NOTE: We need to specify type of this to object to supress some warnings that rise from the merge (Flow, duh)\n var defaultOptions = {};\n var options = Object.assign(defaultOptions, givenOptionsAccepted);\n\n (0, _assert2.default)(typeof filePath === 'string' && filePath, 'filePath must be a string');\n (0, _assert2.default)(Array.isArray(parameters), 'parameters must be an array');\n\n (0, _assert2.default)((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object' && options, 'options must be an object');\n if (options.stream) {\n var stream = options.stream;\n (0, _assert2.default)(stream === 'both' || stream === 'stdout' || stream === 'stderr', 'options.stream should be stdout|stderr|both');\n } else options.stream = 'stdout';\n if (options.timeout) {\n (0, _assert2.default)(typeof options.timeout === 'number', 'options.timeout must be a number');\n } else options.timeout = Infinity;\n if (options.env) {\n (0, _assert2.default)(_typeof(options.env) === 'object', 'options.env must be an object');\n } else options.env = {};\n if (options.stdin) {\n (0, _assert2.default)(typeof options.stdin === 'string' || Buffer.isBuffer(options.stdin), 'options.stdin must be a string or a Buffer');\n } else options.stdin = null;\n if (typeof options.throwOnStderr !== 'undefined') {\n (0, _assert2.default)(typeof options.throwOnStderr === 'boolean', 'options.throwOnStderr must be a boolean');\n } else options.throwOnStderr = true;\n if (typeof options.local !== 'undefined') {\n (0, _assert2.default)(_typeof(options.local) === 'object', 'options.local must be an object');\n (0, _assert2.default)(typeof options.local.directory === 'string', 'options.local.directory must be a string');\n if (typeof options.local.prepend !== 'undefined') {\n (0, _assert2.default)(typeof options.local.prepend === 'boolean', 'options.local.prepend must be a boolean');\n } else options.local.prepend = false;\n }\n if (typeof options.allowEmptyStderr !== 'undefined') {\n (0, _assert2.default)(typeof options.allowEmptyStderr === 'boolean', 'options.throwWhenEmptyStderr must be a boolean');\n } else options.allowEmptyStderr = false;\n if (typeof options.ignoreExitCode !== 'undefined') {\n (0, _assert2.default)(typeof options.ignoreExitCode === 'boolean', 'options.ignoreExitCode must be a boolean');\n } else options.ignoreExitCode = false;\n\n return options;\n}\n\nfunction mergePath(a, b) {\n return (0, _lodash2.default)(a.split(';').concat(b.split(';')).map(function (i) {\n return i.trim();\n }).filter(function (i) {\n return i;\n })).join(';');\n}\n\nfunction mergeEnv(envA, envB) {\n if (process.platform !== 'win32') {\n return Object.assign(envA, envB);\n }\n\n // NOTE: Merge PATH and Path on windows\n var mergedEnv = { PATH: '' };\n for (var key in envA) {\n if (key.toUpperCase() !== 'PATH') {\n mergedEnv[key] = envA[key];\n continue;\n }\n mergedEnv.PATH = mergePath(mergedEnv.PATH, envA[key]);\n }\n for (var _key in envB) {\n if (_key.toUpperCase() !== 'PATH') {\n mergedEnv[_key] = envB[_key];\n continue;\n }\n mergedEnv.PATH = mergePath(mergedEnv.PATH, envB[_key]);\n }\n return mergedEnv;\n}\n\nfunction escape(item) {\n return '\"' + String(item).replace(/\"/g, '\\\\\"') + '\"';\n}\n\nfunction shouldNormalizeForWindows(filePath, options) {\n var baseFilePath = _path2.default.basename(filePath);\n return process.platform === 'win32' && !options.shell && baseFilePath !== 'cmd.exe' && baseFilePath !== 'cmd';\n}\n\nfunction getENOENTError(filePath, parameters) {\n var error = new Error('spawn ' + filePath + ' ENOENT');\n error.code = 'ENOENT';\n error.errno = 'ENOENT';\n error.syscall = 'spawn ' + filePath;\n error.path = filePath;\n error.spawnargs = parameters;\n return error;\n}","'use strict';\nvar isWindows = process.platform === 'win32';\nvar trailingSlashRe = isWindows ? /[^:]\\\\$/ : /.\\/$/;\n\n// https://github.com/nodejs/node/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43\nmodule.exports = function () {\n\tvar path;\n\n\tif (isWindows) {\n\t\tpath = process.env.TEMP ||\n\t\t\tprocess.env.TMP ||\n\t\t\t(process.env.SystemRoot || process.env.windir) + '\\\\temp';\n\t} else {\n\t\tpath = process.env.TMPDIR ||\n\t\t\tprocess.env.TMP ||\n\t\t\tprocess.env.TEMP ||\n\t\t\t'/tmp';\n\t}\n\n\tif (trailingSlashRe.test(path)) {\n\t\tpath = path.slice(0, -1);\n\t}\n\n\treturn path;\n};\n","/*!\n * Tmp\n *\n * Copyright (c) 2011-2017 KARASZI Istvan \n *\n * MIT Licensed\n */\n\n/*\n * Module dependencies.\n */\nconst fs = require('fs');\nconst path = require('path');\nconst crypto = require('crypto');\nconst osTmpDir = require('os-tmpdir');\nconst _c = process.binding('constants');\n\n/*\n * The working inner variables.\n */\nconst\n /**\n * The temporary directory.\n * @type {string}\n */\n tmpDir = osTmpDir(),\n\n // the random characters to choose from\n RANDOM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n TEMPLATE_PATTERN = /XXXXXX/,\n\n DEFAULT_TRIES = 3,\n\n CREATE_FLAGS = (_c.O_CREAT || _c.fs.O_CREAT) | (_c.O_EXCL || _c.fs.O_EXCL) | (_c.O_RDWR || _c.fs.O_RDWR),\n\n EBADF = _c.EBADF || _c.os.errno.EBADF,\n ENOENT = _c.ENOENT || _c.os.errno.ENOENT,\n\n DIR_MODE = 448 /* 0o700 */,\n FILE_MODE = 384 /* 0o600 */,\n\n // this will hold the objects need to be removed on exit\n _removeObjects = [];\n\nvar\n _gracefulCleanup = false,\n _uncaughtException = false;\n\n/**\n * Random name generator based on crypto.\n * Adapted from http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript\n *\n * @param {number} howMany\n * @returns {string} the generated random name\n * @private\n */\nfunction _randomChars(howMany) {\n var\n value = [],\n rnd = null;\n\n // make sure that we do not fail because we ran out of entropy\n try {\n rnd = crypto.randomBytes(howMany);\n } catch (e) {\n rnd = crypto.pseudoRandomBytes(howMany);\n }\n\n for (var i = 0; i < howMany; i++) {\n value.push(RANDOM_CHARS[rnd[i] % RANDOM_CHARS.length]);\n }\n\n return value.join('');\n}\n\n/**\n * Checks whether the `obj` parameter is defined or not.\n *\n * @param {Object} obj\n * @returns {boolean} true if the object is undefined\n * @private\n */\nfunction _isUndefined(obj) {\n return typeof obj === 'undefined';\n}\n\n/**\n * Parses the function arguments.\n *\n * This function helps to have optional arguments.\n *\n * @param {(Options|Function)} options\n * @param {Function} callback\n * @returns {Array} parsed arguments\n * @private\n */\nfunction _parseArguments(options, callback) {\n if (typeof options == 'function') {\n return [callback || {}, options];\n }\n\n if (_isUndefined(options)) {\n return [{}, callback];\n }\n\n return [options, callback];\n}\n\n/**\n * Generates a new temporary name.\n *\n * @param {Object} opts\n * @returns {string} the new random name according to opts\n * @private\n */\nfunction _generateTmpName(opts) {\n if (opts.name) {\n return path.join(opts.dir || tmpDir, opts.name);\n }\n\n // mkstemps like template\n if (opts.template) {\n return opts.template.replace(TEMPLATE_PATTERN, _randomChars(6));\n }\n\n // prefix and postfix\n const name = [\n opts.prefix || 'tmp-',\n process.pid,\n _randomChars(12),\n opts.postfix || ''\n ].join('');\n\n return path.join(opts.dir || tmpDir, name);\n}\n\n/**\n * Gets a temporary file name.\n *\n * @param {(Options|tmpNameCallback)} options options or callback\n * @param {?tmpNameCallback} callback the callback function\n */\nfunction tmpName(options, callback) {\n var\n args = _parseArguments(options, callback),\n opts = args[0],\n cb = args[1],\n tries = opts.name ? 1 : opts.tries || DEFAULT_TRIES;\n\n if (isNaN(tries) || tries < 0)\n return cb(new Error('Invalid tries'));\n\n if (opts.template && !opts.template.match(TEMPLATE_PATTERN))\n return cb(new Error('Invalid template provided'));\n\n (function _getUniqueName() {\n const name = _generateTmpName(opts);\n\n // check whether the path exists then retry if needed\n fs.stat(name, function (err) {\n if (!err) {\n if (tries-- > 0) return _getUniqueName();\n\n return cb(new Error('Could not get a unique tmp filename, max tries reached ' + name));\n }\n\n cb(null, name);\n });\n }());\n}\n\n/**\n * Synchronous version of tmpName.\n *\n * @param {Object} options\n * @returns {string} the generated random name\n * @throws {Error} if the options are invalid or could not generate a filename\n */\nfunction tmpNameSync(options) {\n var\n args = _parseArguments(options),\n opts = args[0],\n tries = opts.name ? 1 : opts.tries || DEFAULT_TRIES;\n\n if (isNaN(tries) || tries < 0)\n throw new Error('Invalid tries');\n\n if (opts.template && !opts.template.match(TEMPLATE_PATTERN))\n throw new Error('Invalid template provided');\n\n do {\n const name = _generateTmpName(opts);\n try {\n fs.statSync(name);\n } catch (e) {\n return name;\n }\n } while (tries-- > 0);\n\n throw new Error('Could not get a unique tmp filename, max tries reached');\n}\n\n/**\n * Creates and opens a temporary file.\n *\n * @param {(Options|fileCallback)} options the config options or the callback function\n * @param {?fileCallback} callback\n */\nfunction file(options, callback) {\n var\n args = _parseArguments(options, callback),\n opts = args[0],\n cb = args[1];\n\n opts.postfix = (_isUndefined(opts.postfix)) ? '.tmp' : opts.postfix;\n\n // gets a temporary filename\n tmpName(opts, function _tmpNameCreated(err, name) {\n if (err) return cb(err);\n\n // create and open the file\n fs.open(name, CREATE_FLAGS, opts.mode || FILE_MODE, function _fileCreated(err, fd) {\n if (err) return cb(err);\n\n if (opts.discardDescriptor) {\n return fs.close(fd, function _discardCallback(err) {\n if (err) {\n // Low probability, and the file exists, so this could be\n // ignored. If it isn't we certainly need to unlink the\n // file, and if that fails too its error is more\n // important.\n try {\n fs.unlinkSync(name);\n } catch (e) {\n if (!isENOENT(e)) {\n err = e;\n }\n }\n return cb(err);\n }\n cb(null, name, undefined, _prepareTmpFileRemoveCallback(name, -1, opts));\n });\n }\n if (opts.detachDescriptor) {\n return cb(null, name, fd, _prepareTmpFileRemoveCallback(name, -1, opts));\n }\n cb(null, name, fd, _prepareTmpFileRemoveCallback(name, fd, opts));\n });\n });\n}\n\n/**\n * Synchronous version of file.\n *\n * @param {Options} options\n * @returns {FileSyncObject} object consists of name, fd and removeCallback\n * @throws {Error} if cannot create a file\n */\nfunction fileSync(options) {\n var\n args = _parseArguments(options),\n opts = args[0];\n\n opts.postfix = opts.postfix || '.tmp';\n\n const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor;\n const name = tmpNameSync(opts);\n var fd = fs.openSync(name, CREATE_FLAGS, opts.mode || FILE_MODE);\n if (opts.discardDescriptor) {\n fs.closeSync(fd); \n fd = undefined;\n }\n\n return {\n name: name,\n fd: fd,\n removeCallback: _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts)\n };\n}\n\n/**\n * Removes files and folders in a directory recursively.\n *\n * @param {string} root\n * @private\n */\nfunction _rmdirRecursiveSync(root) {\n const dirs = [root];\n\n do {\n var\n dir = dirs.pop(),\n deferred = false,\n files = fs.readdirSync(dir);\n\n for (var i = 0, length = files.length; i < length; i++) {\n var\n file = path.join(dir, files[i]),\n stat = fs.lstatSync(file); // lstat so we don't recurse into symlinked directories\n\n if (stat.isDirectory()) {\n if (!deferred) {\n deferred = true;\n dirs.push(dir);\n }\n dirs.push(file);\n } else {\n fs.unlinkSync(file);\n }\n }\n\n if (!deferred) {\n fs.rmdirSync(dir);\n }\n } while (dirs.length !== 0);\n}\n\n/**\n * Creates a temporary directory.\n *\n * @param {(Options|dirCallback)} options the options or the callback function\n * @param {?dirCallback} callback\n */\nfunction dir(options, callback) {\n var\n args = _parseArguments(options, callback),\n opts = args[0],\n cb = args[1];\n\n // gets a temporary filename\n tmpName(opts, function _tmpNameCreated(err, name) {\n if (err) return cb(err);\n\n // create the directory\n fs.mkdir(name, opts.mode || DIR_MODE, function _dirCreated(err) {\n if (err) return cb(err);\n\n cb(null, name, _prepareTmpDirRemoveCallback(name, opts));\n });\n });\n}\n\n/**\n * Synchronous version of dir.\n *\n * @param {Options} options\n * @returns {DirSyncObject} object consists of name and removeCallback\n * @throws {Error} if it cannot create a directory\n */\nfunction dirSync(options) {\n var\n args = _parseArguments(options),\n opts = args[0];\n\n const name = tmpNameSync(opts);\n fs.mkdirSync(name, opts.mode || DIR_MODE);\n\n return {\n name: name,\n removeCallback: _prepareTmpDirRemoveCallback(name, opts)\n };\n}\n\n/**\n * Prepares the callback for removal of the temporary file.\n *\n * @param {string} name the path of the file\n * @param {number} fd file descriptor\n * @param {Object} opts\n * @returns {fileCallback}\n * @private\n */\nfunction _prepareTmpFileRemoveCallback(name, fd, opts) {\n const removeCallback = _prepareRemoveCallback(function _removeCallback(fdPath) {\n try {\n if (0 <= fdPath[0]) {\n fs.closeSync(fdPath[0]);\n }\n }\n catch (e) {\n // under some node/windows related circumstances, a temporary file\n // may have not be created as expected or the file was already closed\n // by the user, in which case we will simply ignore the error\n if (!isEBADF(e) && !isENOENT(e)) {\n // reraise any unanticipated error\n throw e;\n }\n }\n try {\n fs.unlinkSync(fdPath[1]);\n }\n catch (e) {\n if (!isENOENT(e)) {\n // reraise any unanticipated error\n throw e;\n }\n }\n }, [fd, name]);\n\n if (!opts.keep) {\n _removeObjects.unshift(removeCallback);\n }\n\n return removeCallback;\n}\n\n/**\n * Prepares the callback for removal of the temporary directory.\n *\n * @param {string} name\n * @param {Object} opts\n * @returns {Function} the callback\n * @private\n */\nfunction _prepareTmpDirRemoveCallback(name, opts) {\n const removeFunction = opts.unsafeCleanup ? _rmdirRecursiveSync : fs.rmdirSync.bind(fs);\n const removeCallback = _prepareRemoveCallback(removeFunction, name);\n\n if (!opts.keep) {\n _removeObjects.unshift(removeCallback);\n }\n\n return removeCallback;\n}\n\n/**\n * Creates a guarded function wrapping the removeFunction call.\n *\n * @param {Function} removeFunction\n * @param {Object} arg\n * @returns {Function}\n * @private\n */\nfunction _prepareRemoveCallback(removeFunction, arg) {\n var called = false;\n\n return function _cleanupCallback(next) {\n if (!called) {\n const index = _removeObjects.indexOf(_cleanupCallback);\n if (index >= 0) {\n _removeObjects.splice(index, 1);\n }\n\n called = true;\n removeFunction(arg);\n }\n\n if (next) next(null);\n };\n}\n\n/**\n * The garbage collector.\n *\n * @private\n */\nfunction _garbageCollector() {\n if (_uncaughtException && !_gracefulCleanup) {\n return;\n }\n\n // the function being called removes itself from _removeObjects,\n // loop until _removeObjects is empty\n while (_removeObjects.length) {\n try {\n _removeObjects[0].call(null);\n } catch (e) {\n // already removed?\n }\n }\n}\n\n/**\n * Helper for testing against EBADF to compensate changes made to Node 7.x under Windows.\n */\nfunction isEBADF(error) {\n return isExpectedError(error, -EBADF, 'EBADF');\n}\n\n/**\n * Helper for testing against ENOENT to compensate changes made to Node 7.x under Windows.\n */\nfunction isENOENT(error) {\n return isExpectedError(error, -ENOENT, 'ENOENT');\n}\n\n/**\n * Helper to determine whether the expected error code matches the actual code and errno,\n * which will differ between the supported node versions.\n *\n * - Node >= 7.0:\n * error.code {String}\n * error.errno {String|Number} any numerical value will be negated\n *\n * - Node >= 6.0 < 7.0:\n * error.code {String}\n * error.errno {Number} negated\n *\n * - Node >= 4.0 < 6.0: introduces SystemError\n * error.code {String}\n * error.errno {Number} negated\n *\n * - Node >= 0.10 < 4.0:\n * error.code {Number} negated\n * error.errno n/a\n */\nfunction isExpectedError(error, code, errno) {\n return error.code == code || error.code == errno;\n}\n\n/**\n * Sets the graceful cleanup.\n *\n * Also removes the created files and directories when an uncaught exception occurs.\n */\nfunction setGracefulCleanup() {\n _gracefulCleanup = true;\n}\n\nconst version = process.versions.node.split('.').map(function (value) {\n return parseInt(value, 10);\n});\n\nif (version[0] === 0 && (version[1] < 9 || version[1] === 9 && version[2] < 5)) {\n process.addListener('uncaughtException', function _uncaughtExceptionThrown(err) {\n _uncaughtException = true;\n _garbageCollector();\n\n throw err;\n });\n}\n\nprocess.addListener('exit', function _exit(code) {\n if (code) _uncaughtException = true;\n _garbageCollector();\n});\n\n/**\n * Configuration options.\n *\n * @typedef {Object} Options\n * @property {?number} tries the number of tries before give up the name generation\n * @property {?string} template the \"mkstemp\" like filename template\n * @property {?string} name fix name\n * @property {?string} dir the tmp directory to use\n * @property {?string} prefix prefix for the generated name\n * @property {?string} postfix postfix for the generated name\n */\n\n/**\n * @typedef {Object} FileSyncObject\n * @property {string} name the name of the file\n * @property {string} fd the file descriptor\n * @property {fileCallback} removeCallback the callback function to remove the file\n */\n\n/**\n * @typedef {Object} DirSyncObject\n * @property {string} name the name of the directory\n * @property {fileCallback} removeCallback the callback function to remove the directory\n */\n\n/**\n * @callback tmpNameCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n */\n\n/**\n * @callback fileCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {number} fd the file descriptor\n * @param {cleanupCallback} fn the cleanup callback function\n */\n\n/**\n * @callback dirCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {cleanupCallback} fn the cleanup callback function\n */\n\n/**\n * Removes the temporary created file or directory.\n *\n * @callback cleanupCallback\n * @param {simpleCallback} [next] function to call after entry was removed\n */\n\n/**\n * Callback function for function composition.\n * @see {@link https://github.com/raszi/node-tmp/issues/57|raszi/node-tmp#57}\n *\n * @callback simpleCallback\n */\n\n// exporting all the needed methods\nmodule.exports.tmpdir = tmpDir;\n\nmodule.exports.dir = dir;\nmodule.exports.dirSync = dirSync;\n\nmodule.exports.file = file;\nmodule.exports.fileSync = fileSync;\n\nmodule.exports.tmpName = tmpName;\nmodule.exports.tmpNameSync = tmpNameSync;\n\nmodule.exports.setGracefulCleanup = setGracefulCleanup;\n","'use strict';\n'use babel';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.unlinkFile = exports.writeFile = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.getWordRegexp = getWordRegexp;\nexports.getTempDirectory = getTempDirectory;\nexports.fileExists = fileExists;\nexports.validateExec = validateExec;\nexports.validateEditor = validateEditor;\nexports.validateFind = validateFind;\nexports.wrapExec = wrapExec;\n\nvar _fs = require('fs');\n\nvar _fs2 = _interopRequireDefault(_fs);\n\nvar _tmp = require('tmp');\n\nvar _tmp2 = _interopRequireDefault(_tmp);\n\nvar _sbPromisify = require('sb-promisify');\n\nvar _sbPromisify2 = _interopRequireDefault(_sbPromisify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar writeFile = exports.writeFile = (0, _sbPromisify2.default)(_fs2.default.writeFile);\nvar unlinkFile = exports.unlinkFile = (0, _sbPromisify2.default)(_fs2.default.unlink);\n\nfunction escapeRegexp(string) {\n // Shamelessly stolen from https://github.com/atom/underscore-plus/blob/130913c179fe1d718a14034f4818adaf8da4db12/src/underscore-plus.coffee#L138\n return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nfunction getWordRegexp(textEditor, bufferPosition) {\n var scopeDescriptor = textEditor.scopeDescriptorForBufferPosition(bufferPosition);\n var nonWordCharacters = escapeRegexp(atom.config.get('editor.nonWordCharacters', {\n scope: scopeDescriptor\n }));\n return new RegExp('^[\\t ]*$|[^\\\\s' + nonWordCharacters + ']+');\n}\n\nfunction getTempDirectory(prefix) {\n return new Promise(function (resolve, reject) {\n _tmp2.default.dir({ prefix: prefix }, function (error, directory, cleanup) {\n if (error) {\n reject(error);\n } else resolve({ path: directory, cleanup: cleanup });\n });\n });\n}\n\nfunction fileExists(filePath) {\n return new Promise(function (resolve) {\n _fs2.default.access(filePath, _fs2.default.R_OK, function (error) {\n resolve(error === null);\n });\n });\n}\n\nfunction validateExec(command, args, options) {\n if (typeof command !== 'string') {\n throw new Error('Invalid or no `command` provided');\n } else if (!(args instanceof Array)) {\n throw new Error('Invalid or no `args` provided');\n } else if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {\n throw new Error('Invalid or no `options` provided');\n }\n}\n\nfunction validateEditor(editor) {\n var isEditor = void 0;\n if (typeof atom.workspace.isTextEditor === 'function') {\n // Added in Atom v1.4.0\n isEditor = atom.workspace.isTextEditor(editor);\n } else {\n isEditor = typeof editor.getText === 'function';\n }\n if (!isEditor) {\n throw new Error('Invalid TextEditor provided');\n }\n}\n\nfunction validateFind(directory, name) {\n if (typeof directory !== 'string') {\n throw new Error('Invalid or no `directory` provided');\n } else if (typeof name !== 'string' && !(name instanceof Array)) {\n throw new Error('Invalid or no `name` provided');\n }\n}\n\nvar processMap = new Map();\n\nfunction wrapExec(callback) {\n return function (filePath, parameters) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var killed = false;\n var spawned = callback(filePath, parameters, Object.assign({ timeout: 10000 }, options));\n var mirror = spawned;\n\n if (options.uniqueKey) {\n if (typeof options.uniqueKey !== 'string') throw new Error('options.uniqueKey must be a string');\n\n var oldValue = processMap.get(options.uniqueKey);\n if (oldValue) {\n oldValue();\n }\n processMap.set(options.uniqueKey, function () {\n killed = true;\n spawned.kill();\n });\n mirror = mirror.then(function (value) {\n if (killed) return null;\n return value;\n }, function (error) {\n if (killed) return null;\n throw error;\n });\n }\n\n return mirror.catch(function (error) {\n if (error.code === 'ENOENT') {\n var newError = new Error('Failed to spawn command `' + error.path + '`. Make sure `' + error.path + '` is installed and on your PATH');\n // $FlowIgnore: Custom property\n newError.code = 'ENOENT';\n throw newError;\n }\n throw error;\n });\n };\n}","\"use strict\";\n(function (window) {\n var validGroupName = /^[$_a-z][$_a-z0-9]*$/i;\n var cache;\n\n function parseRegex(text) {\n var i, c, c1, c12, nameEnd, name, item,\n mapper = {},\n current = 0,\n regexText = \"\",\n inCharSet = false;\n\n for (i = 0; i < text.length; ++i) {\n c = text[i]; c1 = text[i + 1]; c12 = c1 + text[i + 2];\n regexText += c;\n if (c === \"\\\\\") {\n if (!inCharSet && c12 === \"k<\") {\n // this is back reference\n nameEnd = text.indexOf(\">\", i + 3);\n if (nameEnd < 0) {\n throw new Error(\"'>' missing in named backreference.\");\n }\n name = text.substring(i + 3, nameEnd);\n item = mapper[name];\n if (!item) {\n throw new Error(\"Named group '\" + name + \"' is not defined in backreference.\");\n }\n if (typeof item !== \"number\") {\n throw new Error(\"Named backreference referencing duplicate named group '\" + name + \"'.\");\n }\n i = nameEnd;\n regexText += item;\n } else {\n regexText += c1;\n ++i;\n }\n } else if (inCharSet) {\n if (c === \"]\") {\n inCharSet = false;\n }\n } else if (c === \"[\") {\n inCharSet = true;\n } else {\n // if it starts with '(' and is neither non capturing group '(?:', nor positive lookahead \"(?=\" nor negative lookahead \"(?!\" then this is capturing group expression \n if (c === \"(\" && c12 !== \"?:\" && c12 !== \"?=\" && c12 !== \"?!\") {\n current++;\n // if it starts with '?<' or ':<' then this is capturing named group \n if (c12 === \"?<\" || c12 === \":<\") {\n nameEnd = text.indexOf(\">\", i + 3);\n if (nameEnd < 0) {\n throw new Error(\"'>' missing in named group.\");\n }\n name = text.substring(i + 3, nameEnd);\n if (!validGroupName.test(name)) {\n throw new Error(\"Invalide group name '\" + name + \"'. Regexp group name should start with '_$a-zA-Z' and can contain only '_$a-zA-Z0-9'.\");\n }\n item = mapper[name];\n if (item === undefined) {\n mapper[name] = current;\n } else if (typeof item === \"number\") {\n mapper[name] = [item, current];\n } else {\n item.push(current);\n }\n i = nameEnd;\n }\n }\n }\n }\n return { mapper: mapper, regexText: regexText };\n }\n\n function parseReplacement(text, groupsIndices) {\n var i, c, c1, name, nameEnd, groupIndex,\n result = '';\n for (i = 0; i < text.length; ++i) {\n c = text[i]; c1 = text[i + 1];\n result += c;\n if (c === '$') {\n if (c1 === '$') {\n result += c1;\n ++i;\n } else if (c1 === '{') {\n nameEnd = text.indexOf(\"}\", i + 2);\n if (nameEnd < 0) {\n throw new Error(\"'>' missing in replacement named group.\");\n }\n name = text.substring(i + 2, nameEnd);\n groupIndex = groupsIndices[name];\n if (groupIndex === undefined) {\n throw new Error(\"Named group '\" + name + \"' is not defined in replacement text.\");\n }\n if (typeof groupIndex !== \"number\") {\n throw new Error(\"Named replacement referencing duplicate named group '\" + name + \"'.\");\n }\n result += groupIndex;\n i = nameEnd;\n }\n }\n }\n return result;\n }\n /**\n * Create regexp with additional properties or enable/disable cache\n * @param {(string|RegExp|boolean)} regexp string, regular literal or true/false for enable/disable cache \n * @param {string} flags \n */\n function createNamedRegex(regexp, flags) {\n\n if (typeof regexp === \"boolean\") {\n // options parameter\n if (regexp === false) {\n cache = undefined;\n } else if (!cache) {\n cache = {};\n }\n return;\n }\n\n if (typeof regexp !== \"string\") {\n // parameter is regexp literal\n flags = (regexp.global ? \"g\" : \"\") +\n (regexp.multiline ? \"m\" : \"\") +\n (regexp.ignoreCase ? \"i\" : \"\");\n regexp = regexp.source;\n }\n\n var info = cache ? (cache[regexp] || (cache[regexp] = parseRegex(regexp))) : parseRegex(regexp);\n var regex = new RegExp(info.regexText, flags);\n\n regex.groupsIndices = info.mapper;\n\n function extendMatched(matched) {\n var mapper = info.mapper;\n /**\n * Returns value for group name or undefined. If same group name was defined multiple time, it returns first not undefined value.\n * If all is set to true, then it returns array of all matched values.\n */\n matched.group = function (name, all) {\n var indices = mapper[name];\n if (typeof indices === \"number\") {\n // name group is defined only once\n return matched[indices];\n } else if (all) {\n // name group is defined multiple time and because all is true, return array of all matched values\n return indices.map(function (v) { return matched[v]; });\n } else if (indices) {\n // name group is defined multiple time and because all is false, return first not undefined matched value\n for (var i = 0; i < indices.length; ++i) {\n var value = matched[indices[i]];\n if (value !== undefined) {\n return value;\n }\n }\n }\n return undefined;\n };\n var cachedGroups, cachedGroupsAll;\n matched.groups = function (all) {\n var cg = all ? cachedGroupsAll : cachedGroups;\n if (cg) {\n return cg;\n }\n cg = {};\n for (var name in mapper) {\n cg[name] = matched.group(name, all);\n }\n return all ? cachedGroupsAll = cg : cachedGroups = cg;\n };\n return matched;\n }\n\n regex.exec = function (text) {\n var matched = RegExp.prototype.exec.call(this, text);\n if (matched) {\n extendMatched(matched);\n }\n return matched;\n }\n regex.execGroups = function (text, all) {\n var matched = this.exec(text);\n if (!matched) {\n return null;\n }\n return matched.groups(all);\n }\n\n regex.replace = function (text, replacement) {\n if (typeof replacement === \"function\") {\n return text.replace(regex, function () {\n var matched = Array.prototype.slice.call(arguments, 0, arguments.length - 2);\n extendMatched(matched);\n return replacement.apply(matched, arguments);\n });\n } else {\n var replacementText = parseReplacement(replacement, this.groupsIndices);\n return text.replace(this, replacementText);\n }\n }\n return regex;\n }\n\n if (typeof exports !== \"undefined\") {\n module.exports = createNamedRegex;\n } else if (typeof define === \"function\" && define.amd) {\n define(function () {\n return createNamedRegex;\n })\n } else {\n window.createNamedRegex = createNamedRegex;\n }\n\n\n})(typeof window === \"undefined\" ? this : window);\n\n\n\n\n","'use strict';\n'use babel';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.execNode = exports.exec = exports.tempFiles = exports.findCachedAsync = exports.findAsync = exports.FindCache = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar findAsync = exports.findAsync = function () {\n var _ref = _asyncToGenerator(function* (directory, name) {\n Helpers.validateFind(directory, name);\n var names = [].concat(name);\n var chunks = directory.split(Path.sep);\n\n while (chunks.length) {\n var currentDir = chunks.join(Path.sep);\n if (currentDir === '') {\n currentDir = Path.resolve(directory, '/');\n }\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = names[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var fileName = _step.value;\n\n var _filePath = Path.join(currentDir, fileName);\n // NOTE: If we follow ESLint here and collect all promises and await at once\n // It'll end up being more inefficient, we'll be doing more fs.stat calls than\n // necessary\n // eslint-disable-next-line no-await-in-loop\n if (yield Helpers.fileExists(_filePath)) {\n return _filePath;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n chunks.pop();\n }\n\n return null;\n });\n\n return function findAsync(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\nvar findCachedAsync = exports.findCachedAsync = function () {\n var _ref2 = _asyncToGenerator(function* (directory, name) {\n Helpers.validateFind(directory, name);\n var names = [].concat(name);\n var cacheKey = directory + ':' + names.join(',');\n var cachedFilePath = FindCache.get(cacheKey);\n\n if (cachedFilePath) {\n if (yield Helpers.fileExists(cachedFilePath)) {\n return cachedFilePath;\n }\n FindCache.delete(cacheKey);\n }\n var filePath = yield findAsync(directory, names);\n if (filePath) {\n FindCache.set(cacheKey, filePath);\n }\n return filePath;\n });\n\n return function findCachedAsync(_x3, _x4) {\n return _ref2.apply(this, arguments);\n };\n}();\n\nvar tempFiles = exports.tempFiles = function () {\n var _ref3 = _asyncToGenerator(function* (files, callback) {\n if (!Array.isArray(files)) {\n throw new Error('Invalid or no `files` provided');\n } else if (typeof callback !== 'function') {\n throw new Error('Invalid or no `callback` provided');\n }\n\n var tempDirectory = yield Helpers.getTempDirectory('atom-linter_');\n var filePaths = [];\n\n yield Promise.all(files.map(function (file) {\n var fileName = file.name;\n var fileContents = file.contents;\n var filePath = Path.join(tempDirectory.path, fileName);\n filePaths.push(filePath);\n return Helpers.writeFile(filePath, fileContents);\n }));\n try {\n return yield callback(filePaths);\n } finally {\n yield Promise.all(filePaths.map(function (filePath) {\n return Helpers.unlinkFile(filePath);\n }));\n tempDirectory.cleanup();\n }\n });\n\n return function tempFiles(_x5, _x6) {\n return _ref3.apply(this, arguments);\n };\n}();\n\nexports.generateRange = generateRange;\nexports.find = find;\nexports.findCached = findCached;\nexports.tempFile = tempFile;\nexports.parse = parse;\n\nvar _path = require('path');\n\nvar Path = _interopRequireWildcard(_path);\n\nvar _fs = require('fs');\n\nvar FS = _interopRequireWildcard(_fs);\n\nvar _sbExec = require('sb-exec');\n\nvar _helpers = require('./helpers');\n\nvar Helpers = _interopRequireWildcard(_helpers);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar NamedRegexp = null;\nvar FindCache = exports.FindCache = new Map();\n\nfunction generateRange(textEditor, line, column) {\n Helpers.validateEditor(textEditor);\n var lineNumber = line;\n\n if (typeof lineNumber !== 'number' || !Number.isFinite(lineNumber) || lineNumber < 0) {\n lineNumber = 0;\n }\n\n var buffer = textEditor.getBuffer();\n var lineMax = buffer.getLineCount() - 1;\n\n if (lineNumber > lineMax) {\n throw new Error('Line number (' + lineNumber + ') greater than maximum line (' + lineMax + ')');\n }\n\n var columnGiven = typeof column === 'number' && Number.isFinite(column) && column > -1;\n var lineText = buffer.lineForRow(lineNumber);\n var colEnd = lineText.length;\n var colStart = columnGiven ? column : 0;\n if (columnGiven) {\n var match = Helpers.getWordRegexp(textEditor, [lineNumber, colStart]).exec(lineText.substr(column));\n if (match) {\n colEnd = colStart + match.index + match[0].length;\n }\n } else {\n var indentation = lineText.match(/^\\s+/);\n if (indentation) {\n colStart = indentation[0].length;\n }\n }\n if (colStart > lineText.length) {\n throw new Error('Column start (' + (colStart || 0) + ') greater than line length (' + lineText.length + ') for line ' + lineNumber);\n }\n\n return [[lineNumber, colStart], [lineNumber, colEnd]];\n}\n\nfunction find(directory, name) {\n Helpers.validateFind(directory, name);\n var names = [].concat(name);\n var chunks = directory.split(Path.sep);\n\n while (chunks.length) {\n var currentDir = chunks.join(Path.sep);\n if (currentDir === '') {\n currentDir = Path.resolve(directory, '/');\n }\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = names[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var fileName = _step2.value;\n\n var _filePath2 = Path.join(currentDir, fileName);\n\n try {\n FS.accessSync(_filePath2, FS.R_OK);\n return _filePath2;\n } catch (_) {\n // Do nothing\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n chunks.pop();\n }\n\n return null;\n}\n\nfunction findCached(directory, name) {\n Helpers.validateFind(directory, name);\n var names = [].concat(name);\n var cacheKey = directory + ':' + names.join(',');\n var cachedFilePath = FindCache.get(cacheKey);\n\n if (cachedFilePath) {\n try {\n FS.accessSync(cachedFilePath, FS.R_OK);\n return cachedFilePath;\n } catch (_) {\n FindCache.delete(cacheKey);\n }\n }\n var filePath = find(directory, names);\n if (filePath) {\n FindCache.set(cacheKey, filePath);\n }\n return filePath;\n}\n\nfunction tempFile(fileName, fileContents, callback) {\n if (typeof fileName !== 'string') {\n throw new Error('Invalid or no `fileName` provided');\n } else if (typeof fileContents !== 'string') {\n throw new Error('Invalid or no `fileContents` provided');\n } else if (typeof callback !== 'function') {\n throw new Error('Invalid or no `callback` provided');\n }\n\n return tempFiles([{\n name: fileName,\n contents: fileContents\n }], function (results) {\n return callback(results[0]);\n });\n}\n\nfunction parse(data, regex) {\n var givenOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof data !== 'string') {\n throw new Error('Invalid or no `data` provided');\n } else if (typeof regex !== 'string') {\n throw new Error('Invalid or no `regex` provided');\n } else if ((typeof givenOptions === 'undefined' ? 'undefined' : _typeof(givenOptions)) !== 'object') {\n throw new Error('Invalid or no `options` provided');\n }\n\n if (NamedRegexp === null) {\n /* eslint-disable global-require */\n NamedRegexp = require('named-js-regexp');\n /* eslint-enable global-require */\n }\n\n var defaultOptions = { flags: '' };\n var options = Object.assign(defaultOptions, givenOptions);\n if (options.flags.indexOf('g') === -1) {\n options.flags += 'g';\n }\n\n var messages = [];\n var compiledRegexp = new NamedRegexp(regex, options.flags);\n var rawMatch = compiledRegexp.exec(data);\n\n while (rawMatch !== null) {\n var match = rawMatch.groups();\n var type = match.type;\n var text = match.message;\n var file = match.file || options.filePath || null;\n\n var lineStart = match.lineStart || match.line || 0;\n var colStart = match.colStart || match.col || 0;\n var lineEnd = match.lineEnd || match.line || 0;\n var colEnd = match.colEnd || match.col || 0;\n\n messages.push({\n type: type,\n text: text,\n filePath: file,\n range: [[lineStart > 0 ? lineStart - 1 : 0, colStart > 0 ? colStart - 1 : 0], [lineEnd > 0 ? lineEnd - 1 : 0, colEnd > 0 ? colEnd - 1 : 0]]\n });\n\n rawMatch = compiledRegexp.exec(data);\n }\n\n return messages;\n}\n\nvar execProxy = Helpers.wrapExec(_sbExec.exec);\nvar execNodeProxy = Helpers.wrapExec(_sbExec.execNode);\n\nexports.exec = execProxy;\nexports.execNode = execNodeProxy;","'use strict';\nconst {promisify} = require('util');\nconst crypto = require('crypto');\n\nconst randomBytesAsync = promisify(crypto.randomBytes);\n\nconst urlSafeCharacters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~'.split('');\nconst numericCharacters = '0123456789'.split('');\nconst distinguishableCharacters = 'CDEHKMPRTUWXY012458'.split('');\nconst asciiPrintableCharacters = '!\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.split('');\nconst alphanumericCharacters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split('');\n\nconst generateForCustomCharacters = (length, characters) => {\n\t// Generating entropy is faster than complex math operations, so we use the simplest way\n\tconst characterCount = characters.length;\n\tconst maxValidSelector = (Math.floor(0x10000 / characterCount) * characterCount) - 1; // Using values above this will ruin distribution when using modular division\n\tconst entropyLength = 2 * Math.ceil(1.1 * length); // Generating a bit more than required so chances we need more than one pass will be really low\n\tlet string = '';\n\tlet stringLength = 0;\n\n\twhile (stringLength < length) { // In case we had many bad values, which may happen for character sets of size above 0x8000 but close to it\n\t\tconst entropy = crypto.randomBytes(entropyLength);\n\t\tlet entropyPosition = 0;\n\n\t\twhile (entropyPosition < entropyLength && stringLength < length) {\n\t\t\tconst entropyValue = entropy.readUInt16LE(entropyPosition);\n\t\t\tentropyPosition += 2;\n\t\t\tif (entropyValue > maxValidSelector) { // Skip values which will ruin distribution when using modular division\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tstring += characters[entropyValue % characterCount];\n\t\t\tstringLength++;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst generateForCustomCharactersAsync = async (length, characters) => {\n\t// Generating entropy is faster than complex math operations, so we use the simplest way\n\tconst characterCount = characters.length;\n\tconst maxValidSelector = (Math.floor(0x10000 / characterCount) * characterCount) - 1; // Using values above this will ruin distribution when using modular division\n\tconst entropyLength = 2 * Math.ceil(1.1 * length); // Generating a bit more than required so chances we need more than one pass will be really low\n\tlet string = '';\n\tlet stringLength = 0;\n\n\twhile (stringLength < length) { // In case we had many bad values, which may happen for character sets of size above 0x8000 but close to it\n\t\tconst entropy = await randomBytesAsync(entropyLength); // eslint-disable-line no-await-in-loop\n\t\tlet entropyPosition = 0;\n\n\t\twhile (entropyPosition < entropyLength && stringLength < length) {\n\t\t\tconst entropyValue = entropy.readUInt16LE(entropyPosition);\n\t\t\tentropyPosition += 2;\n\t\t\tif (entropyValue > maxValidSelector) { // Skip values which will ruin distribution when using modular division\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tstring += characters[entropyValue % characterCount];\n\t\t\tstringLength++;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst generateRandomBytes = (byteLength, type, length) => crypto.randomBytes(byteLength).toString(type).slice(0, length);\n\nconst generateRandomBytesAsync = async (byteLength, type, length) => {\n\tconst buffer = await randomBytesAsync(byteLength);\n\treturn buffer.toString(type).slice(0, length);\n};\n\nconst allowedTypes = [\n\tundefined,\n\t'hex',\n\t'base64',\n\t'url-safe',\n\t'numeric',\n\t'distinguishable',\n\t'ascii-printable',\n\t'alphanumeric'\n];\n\nconst createGenerator = (generateForCustomCharacters, generateRandomBytes) => ({length, type, characters}) => {\n\tif (!(length >= 0 && Number.isFinite(length))) {\n\t\tthrow new TypeError('Expected a `length` to be a non-negative finite number');\n\t}\n\n\tif (type !== undefined && characters !== undefined) {\n\t\tthrow new TypeError('Expected either `type` or `characters`');\n\t}\n\n\tif (characters !== undefined && typeof characters !== 'string') {\n\t\tthrow new TypeError('Expected `characters` to be string');\n\t}\n\n\tif (!allowedTypes.includes(type)) {\n\t\tthrow new TypeError(`Unknown type: ${type}`);\n\t}\n\n\tif (type === undefined && characters === undefined) {\n\t\ttype = 'hex';\n\t}\n\n\tif (type === 'hex' || (type === undefined && characters === undefined)) {\n\t\treturn generateRandomBytes(Math.ceil(length * 0.5), 'hex', length); // Need 0.5 byte entropy per character\n\t}\n\n\tif (type === 'base64') {\n\t\treturn generateRandomBytes(Math.ceil(length * 0.75), 'base64', length); // Need 0.75 byte of entropy per character\n\t}\n\n\tif (type === 'url-safe') {\n\t\treturn generateForCustomCharacters(length, urlSafeCharacters);\n\t}\n\n\tif (type === 'numeric') {\n\t\treturn generateForCustomCharacters(length, numericCharacters);\n\t}\n\n\tif (type === 'distinguishable') {\n\t\treturn generateForCustomCharacters(length, distinguishableCharacters);\n\t}\n\n\tif (type === 'ascii-printable') {\n\t\treturn generateForCustomCharacters(length, asciiPrintableCharacters);\n\t}\n\n\tif (type === 'alphanumeric') {\n\t\treturn generateForCustomCharacters(length, alphanumericCharacters);\n\t}\n\n\tif (characters.length === 0) {\n\t\tthrow new TypeError('Expected `characters` string length to be greater than or equal to 1');\n\t}\n\n\tif (characters.length > 0x10000) {\n\t\tthrow new TypeError('Expected `characters` string length to be less or equal to 65536');\n\t}\n\n\treturn generateForCustomCharacters(length, characters.split(''));\n};\n\nmodule.exports = createGenerator(generateForCustomCharacters, generateRandomBytes);\nmodule.exports.async = createGenerator(generateForCustomCharactersAsync, generateRandomBytesAsync);\n","'use strict';\n\nvar plugins = require('./plugins.json');\n\nfor (var pluginName of Object.keys(plugins)) {\n var url = plugins[pluginName];\n\n if (!url.includes('/')) {\n url += '/eslint-plugin-' + pluginName;\n }\n if (url.split('/').length === 2) {\n url = 'https://github.com/' + url + '/blob/master/docs/rules/RULENAME.md';\n }\n\n plugins[pluginName] = url;\n}\n\nfunction getRuleURI(ruleId) {\n if (typeof ruleId !== 'string') {\n throw new TypeError(`ruleId must be a string, got ${typeof ruleId}`);\n }\n\n var ruleParts = ruleId.split('/');\n\n if (ruleParts.length === 1) {\n return {\n found: true,\n url: 'https://eslint.org/docs/rules/' + ruleId\n };\n }\n\n var pluginName = ruleParts[0];\n var ruleName = ruleParts[1];\n var url = plugins[pluginName];\n\n if (!url) {\n return {\n found: false,\n url: 'https://github.com/jfmengels/eslint-rule-documentation/blob/master/contributing.md'\n };\n }\n\n return {\n found: true,\n url: url.replace('RULENAME', ruleName)\n };\n}\n\nmodule.exports = getRuleURI;\n","import { join } from 'path'\nimport { generateRange } from 'atom-linter'\nimport cryptoRandomString from 'crypto-random-string'\n// eslint-disable-next-line import/no-extraneous-dependencies, import/extensions\nimport { Range, Task } from 'atom'\nimport Rules from './rules'\nimport { throwIfInvalidPoint } from './validate/editor'\n\nexport const rules = new Rules()\nlet worker = null\n\n/**\n * Start the worker process if it hasn't already been started\n */\nexport function startWorker() {\n if (worker === null) {\n worker = new Task(require.resolve('./worker.js'))\n }\n\n if (worker.started) {\n // Worker start request has already been sent\n return\n }\n // Send empty arguments as we don't use them in the worker\n worker.start([])\n\n // NOTE: Modifies the Task of the worker, but it's the only clean way to track this\n worker.started = true\n}\n\n/**\n * Forces the worker Task to kill itself\n */\nexport function killWorker() {\n if (worker !== null) {\n worker.terminate()\n worker = null\n }\n}\n\n/**\n * Send a job to the worker and return the results\n * @param {Object} config Configuration for the job to send to the worker\n * @return {Object|String|Error} The data returned from the worker\n */\nexport async function sendJob(config) {\n if (worker && !worker.childProcess.connected) {\n // Sometimes the worker dies and becomes disconnected\n // When that happens, it seems that there is no way to recover other\n // than to kill the worker and create a new one.\n killWorker()\n }\n\n // Ensure the worker is started\n startWorker()\n\n // Expand the config with a unique ID to emit on\n // NOTE: Jobs _must_ have a unique ID as they are completely async and results\n // can arrive back in any order.\n // eslint-disable-next-line no-param-reassign\n config.emitKey = cryptoRandomString({ length: 10 })\n\n return new Promise((resolve, reject) => {\n // All worker errors are caught and re-emitted along with their associated\n // emitKey, so that we do not create multiple listeners for the same\n // 'task:error' event\n const errSub = worker.on(`workerError:${config.emitKey}`, ({ msg, stack }) => {\n // Re-throw errors from the task\n const error = new Error(msg)\n // Set the stack to the one given to us by the worker\n error.stack = stack\n errSub.dispose()\n // eslint-disable-next-line no-use-before-define\n responseSub.dispose()\n reject(error)\n })\n const responseSub = worker.on(config.emitKey, (data) => {\n errSub.dispose()\n responseSub.dispose()\n resolve(data)\n })\n // Send the job on to the worker\n try {\n worker.send(config)\n } catch (e) {\n errSub.dispose()\n responseSub.dispose()\n console.error(e)\n }\n })\n}\n\nexport async function getDebugInfo() {\n const textEditor = atom.workspace.getActiveTextEditor()\n let filePath\n let editorScopes\n if (atom.workspace.isTextEditor(textEditor)) {\n filePath = textEditor.getPath()\n editorScopes = textEditor.getLastCursor().getScopeDescriptor().getScopesArray()\n } else {\n // Somehow this can be called with no active TextEditor, impossible I know...\n filePath = 'unknown'\n editorScopes = ['unknown']\n }\n const packagePath = atom.packages.resolvePackagePath('linter-eslint')\n let linterEslintMeta\n if (packagePath === undefined) {\n // Apparently for some users the package path fails to resolve\n linterEslintMeta = { version: 'unknown!' }\n } else {\n // eslint-disable-next-line import/no-dynamic-require\n linterEslintMeta = require(join(packagePath, 'package.json'))\n }\n const config = atom.config.get('linter-eslint')\n const hoursSinceRestart = Math.round((process.uptime() / 3600) * 10) / 10\n let returnVal\n try {\n const response = await sendJob({\n type: 'debug',\n config,\n filePath\n })\n returnVal = {\n atomVersion: atom.getVersion(),\n linterEslintVersion: linterEslintMeta.version,\n linterEslintConfig: config,\n // eslint-disable-next-line import/no-dynamic-require\n eslintVersion: require(join(response.path, 'package.json')).version,\n hoursSinceRestart,\n platform: process.platform,\n eslintType: response.type,\n eslintPath: response.path,\n editorScopes,\n }\n } catch (error) {\n atom.notifications.addError(`${error}`)\n }\n return returnVal\n}\n\nexport async function generateDebugString() {\n const debug = await getDebugInfo()\n const details = [\n `Atom version: ${debug.atomVersion}`,\n `linter-eslint version: ${debug.linterEslintVersion}`,\n `ESLint version: ${debug.eslintVersion}`,\n `Hours since last Atom restart: ${debug.hoursSinceRestart}`,\n `Platform: ${debug.platform}`,\n `Using ${debug.eslintType} ESLint from: ${debug.eslintPath}`,\n `Current file's scopes: ${JSON.stringify(debug.editorScopes, null, 2)}`,\n `linter-eslint configuration: ${JSON.stringify(debug.linterEslintConfig, null, 2)}`\n ]\n return details.join('\\n')\n}\n\n/**\n * Turn the given options into a Linter message array\n * @param {TextEditor} textEditor The TextEditor to use to build the message\n * @param {Object} options The parameters used to fill in the message\n * @param {string} [options.severity='error'] Can be one of: 'error', 'warning', 'info'\n * @param {string} [options.excerpt=''] Short text to use in the message\n * @param {string|Function} [options.description] Used to provide additional information\n * @return {Array} Message to user generated from the parameters\n */\nexport function generateUserMessage(textEditor, options) {\n const {\n severity = 'error',\n excerpt = '',\n description,\n } = options\n return [{\n severity,\n excerpt,\n description,\n location: {\n file: textEditor.getPath(),\n position: generateRange(textEditor),\n },\n }]\n}\n\n/**\n * Generates a message to the user in order to nicely display the Error being\n * thrown instead of depending on generic error handling.\n * @param {TextEditor} textEditor The TextEditor to use to build the message\n * @param {Error} error Error to generate a message for\n * @return {Array} Message to user generated from the Error\n */\nexport function handleError(textEditor, error) {\n const { stack, message } = error\n // Only show the first line of the message as the excerpt\n const excerpt = `Error while running ESLint: ${message.split('\\n')[0]}.`\n const description = `${message}\\n
${stack}`\n return generateUserMessage(textEditor, { severity: 'error', excerpt, description })\n}\n\nconst generateInvalidTrace = async ({\n msgLine, msgCol, msgEndLine, msgEndCol,\n eslintFullRange, filePath, textEditor, ruleId, message\n}) => {\n let errMsgRange = `${msgLine + 1}:${msgCol}`\n if (eslintFullRange) {\n errMsgRange += ` - ${msgEndLine + 1}:${msgEndCol + 1}`\n }\n const rangeText = `Requested ${eslintFullRange ? 'start point' : 'range'}: ${errMsgRange}`\n const issueURL = 'https://github.com/AtomLinter/linter-eslint/issues/new'\n const titleText = `Invalid position given by '${ruleId}'`\n const title = encodeURIComponent(titleText)\n const body = encodeURIComponent([\n 'ESLint returned a point that did not exist in the document being edited.',\n `Rule: \\`${ruleId}\\``,\n rangeText,\n '', '',\n '',\n '', '',\n 'Debug information:',\n '```json',\n JSON.stringify(await getDebugInfo(), null, 2),\n '```'\n ].join('\\n'))\n\n const location = {\n file: filePath,\n position: generateRange(textEditor, 0),\n }\n const newIssueURL = `${issueURL}?title=${title}&body=${body}`\n\n return {\n severity: 'error',\n excerpt: `${titleText}. See the description for details. `\n + 'Click the URL to open a new issue!',\n url: newIssueURL,\n location,\n description: `${rangeText}\\nOriginal message: ${message}`\n }\n}\n\n/**\n * Given a raw response from ESLint, this processes the messages into a format\n * compatible with the Linter API.\n * @param {Object} messages The messages from ESLint's response\n * @param {TextEditor} textEditor The Atom::TextEditor of the file the messages belong to\n * @param {bool} showRule Whether to show the rule in the messages\n * @return {Promise} The messages transformed into Linter messages\n */\nexport async function processESLintMessages(messages, textEditor, showRule) {\n return Promise.all(messages.map(async ({\n fatal, message: originalMessage, line, severity, ruleId, column, fix, endLine, endColumn\n }) => {\n const message = fatal ? originalMessage.split('\\n')[0] : originalMessage\n const filePath = textEditor.getPath()\n const textBuffer = textEditor.getBuffer()\n let linterFix = null\n if (fix) {\n const fixRange = new Range(\n textBuffer.positionForCharacterIndex(fix.range[0]),\n textBuffer.positionForCharacterIndex(fix.range[1])\n )\n linterFix = {\n position: fixRange,\n replaceWith: fix.text\n }\n }\n let msgCol\n let msgEndLine\n let msgEndCol\n let eslintFullRange = false\n\n /*\n Note: ESLint positions are 1-indexed, while Atom expects 0-indexed,\n positions. We are subtracting 1 from these values here so we don't have to\n keep doing so in later uses.\n */\n const msgLine = line - 1\n if (typeof endColumn === 'number' && typeof endLine === 'number') {\n eslintFullRange = true\n // Here we always want the column to be a number\n msgCol = Math.max(0, column - 1)\n msgEndLine = endLine - 1\n msgEndCol = endColumn - 1\n } else {\n // We want msgCol to remain undefined if it was initially so\n // `generateRange` will give us a range over the entire line\n msgCol = typeof column === 'number' ? column - 1 : column\n }\n\n let ret = {\n severity: severity === 1 ? 'warning' : 'error',\n location: {\n file: filePath,\n }\n }\n\n if (ruleId) {\n ret.url = rules.getRuleUrl(ruleId)\n }\n\n // HACK for https://github.com/AtomLinter/linter-eslint/issues/1249\n let fixLineEnding = false\n if (ruleId === 'prettier/prettier' && (message === 'Delete `␍`')) {\n fixLineEnding = true\n }\n\n let range\n try {\n if (eslintFullRange) {\n if (!fixLineEnding) {\n throwIfInvalidPoint(textBuffer, msgLine, msgCol)\n throwIfInvalidPoint(textBuffer, msgEndLine, msgEndCol)\n }\n range = [[msgLine, msgCol], [msgEndLine, msgEndCol]]\n } else {\n range = generateRange(textEditor, msgLine, msgCol)\n }\n ret.location.position = range\n\n const ruleAppendix = showRule ? ` (${ruleId || 'Fatal'})` : ''\n ret.excerpt = `${message}${ruleAppendix}`\n\n if (linterFix) {\n ret.solutions = [linterFix]\n }\n } catch (err) {\n ret = await generateInvalidTrace({\n msgLine,\n msgCol,\n msgEndLine,\n msgEndCol,\n eslintFullRange,\n filePath,\n textEditor,\n ruleId,\n message,\n })\n }\n\n return ret\n }))\n}\n\n/**\n * Processes the response from the lint job\n * @param {Object} response The raw response from the job\n * @param {TextEditor} textEditor The Atom::TextEditor of the file the messages belong to\n * @param {bool} showRule Whether to show the rule in the messages\n * @return {Promise} The messages transformed into Linter messages\n */\nexport async function processJobResponse(response, textEditor, showRule) {\n if (Object.prototype.hasOwnProperty.call(response, 'updatedRules')) {\n rules.replaceRules(response.updatedRules)\n }\n return processESLintMessages(response.messages, textEditor, showRule)\n}\n","import ruleURI from 'eslint-rule-documentation'\n\n/**\n * Stores a list of rules from ESLint\n */\nexport default class Rules {\n /**\n * Instantiates a Rules object, optionally with an existing list of rules\n * @param {Array} newRules Array of Arrays of the rule and properties\n */\n constructor(newRules) {\n this.replaceRules(newRules)\n }\n\n /**\n * Process the updated rules into the local Map and call further update functions\n * @param {Array} newRules Array of Arrays of the rule and properties\n */\n replaceRules(newRules) {\n if (this.rules !== undefined) {\n this.rules.clear()\n }\n\n /** @type {Map} */\n this.rules = new Map(newRules)\n }\n\n /**\n * [getFixableRules description]\n * @return {Array} The ruleIds of the currently known fixable rules\n */\n getFixableRules() {\n const ruleIds = []\n // eslint-disable-next-line no-restricted-syntax\n for (const [ruleId, ruleProps] of this.rules) {\n if (ruleProps && ruleProps.meta && ruleProps.meta.fixable) {\n ruleIds.push(ruleId)\n }\n }\n return ruleIds\n }\n\n /**\n * Get the URL of the documentation for a rule, either from the rule's own\n * metadata, from eslint-rule-documentation's known rules, or the fallback URL\n * on how to add it to eslint-rule-documentation.\n * @param {string} ruleId The rule ID to get the documentation URL for\n * @return {string} URL of the rule documentation\n */\n getRuleUrl(ruleId) {\n const props = this.rules.get(ruleId)\n if (props && props.meta && props.meta.docs && props.meta.docs.url) {\n // The rule has a documentation URL specified in its metadata\n return props.meta.docs.url\n }\n\n // The rule didn't specify a URL in its metadata, or was not currently known\n // somehow. Attempt to determine a URL using eslint-rule-documentation.\n return ruleURI(ruleId).url\n }\n\n /**\n * Return the known rules.\n * @return {Map} The currently known rules\n */\n getRules() {\n return this.rules\n }\n}\n","/*\n * These migrations can take one of two forms, a direct move or a general function.\n *\n * Direct move:\n * These objects have an array of `moves`, which\n * are objects containing an `old` setting name and a `new` setting name.\n * Any existing config found in the `old` name will be moved over to (and overwrite)\n * the `new` key.\n *\n * Functions:\n * These have a `migrate` function, which takes the\n * current linter-eslint atom config as an argument, and can act on it however\n * it needs to.\n */\nconst activeMigrations = [\n {\n added: 'January, 2018',\n description: 'Organized config settings into sections',\n moves: [\n {\n old: 'disableWhenNoEslintConfig',\n new: 'disabling.disableWhenNoEslintConfig',\n }, {\n old: 'fixOnSave',\n new: 'autofix.fixOnSave'\n }, {\n old: 'ignoreFixableRulesWhileTyping',\n new: 'autofix.ignoreFixableRulesWhileTyping'\n }, {\n old: 'rulesToDisableWhileFixing',\n new: 'autofix.rulesToDisableWhileFixing'\n }, {\n old: 'rulesToSilenceWhileTyping',\n new: 'disabling.rulesToSilenceWhileTyping'\n }, {\n old: 'disableEslintIgnore',\n new: 'advanced.disableEslintIgnore'\n }, {\n old: 'disableFSCache',\n new: 'advanced.disableFSCache'\n }, {\n old: 'showRuleIdInMessage',\n new: 'advanced.showRuleIdInMessage'\n }, {\n old: 'eslintrcPath',\n new: 'global.eslintrcPath'\n }, {\n old: 'advancedLocalNodeModules',\n new: 'advanced.localNodeModules'\n }, {\n old: 'eslintRulesDirs',\n new: 'advanced.eslintRulesDirs'\n }, {\n old: 'useGlobalEslint',\n new: 'global.useGlobalEslint'\n }, {\n old: 'globalNodePath',\n new: 'global.globalNodePath'\n }\n ]\n },\n {\n added: 'September, 2017',\n description: 'Deprecated eslintRulesDir{String} option in favor of eslintRulesDirs{Array}',\n migrate(config) {\n const oldRulesdir = config.eslintRulesDir\n if (oldRulesdir) {\n const newRulesDirs = config.eslintRulesDirs\n if (newRulesDirs.length === 0) {\n atom.config.set('linter-eslint.eslintRulesDirs', [oldRulesdir])\n }\n atom.config.unset('linter-eslint.eslintRulesDir')\n }\n }\n }\n]\n\n/*\n * This function can be called when linter-eslint first activates in order to\n * ensure that the user's settings are up-to-date with the current version of\n * linter-eslint. Ideally, we would call this only when upgrading to a new\n * version.\n */\nfunction migrateConfigOptions(migrations = activeMigrations) {\n if (migrations.length) {\n const linterEslintConfig = atom.config.get('linter-eslint')\n migrations.forEach((migration) => {\n if (migration.moves && Array.isArray(migration.moves)) {\n // Copy old settings over to the new ones, then unset the old setting keys\n migration.moves.forEach((move) => {\n const oldSetting = linterEslintConfig[move.old]\n if (oldSetting !== undefined) {\n atom.config.set(`linter-eslint.${move.new}`, oldSetting)\n atom.config.unset(`linter-eslint.${move.old}`)\n }\n })\n } else if (typeof migration.migrate === 'function') {\n migration.migrate(linterEslintConfig)\n }\n })\n }\n}\n\nexports.migrateConfigOptions = migrateConfigOptions\n","// eslint-disable-next-line import/no-extraneous-dependencies, import/extensions\nimport { CompositeDisposable } from 'atom'\nimport { hasValidScope } from './validate/editor'\nimport * as helpers from './helpers'\nimport { migrateConfigOptions } from './migrate-config-options'\n\n// Internal variables\nconst idleCallbacks = new Set()\n\nconst makeIdleCallback = (work) => {\n let callbackId\n const callBack = () => {\n idleCallbacks.delete(callbackId)\n work()\n }\n callbackId = window.requestIdleCallback(callBack)\n idleCallbacks.add(callbackId)\n}\n\nconst scheduleIdleTasks = () => {\n const linterEslintInstallPeerPackages = () => {\n require('atom-package-deps').install('linter-eslint')\n }\n const linterEslintStartWorker = () => {\n helpers.startWorker()\n }\n\n if (!atom.inSpecMode()) {\n makeIdleCallback(linterEslintInstallPeerPackages)\n makeIdleCallback(linterEslintStartWorker)\n }\n}\n\n// Configuration\nconst scopes = []\nlet showRule\nlet lintHtmlFiles\nlet ignoredRulesWhenModified\nlet ignoredRulesWhenFixing\nlet ignoreFixableRulesWhileTyping\n\n// Internal functions\n/**\n * Given an Array or iterable containing a list of Rule IDs, return an Object\n * to be sent to ESLint's configuration that disables those rules.\n * @param {[iterable]} ruleIds Iterable containing ruleIds to ignore\n * @return {Object} Object containing properties for each rule to ignore\n */\nconst idsToIgnoredRules = ruleIds => (\n Array.from(ruleIds).reduce(\n // 0 is the severity to turn off a rule\n (ids, id) => Object.assign(ids, { [id]: 0 }),\n {}\n ))\n\n\nmodule.exports = {\n activate() {\n this.subscriptions = new CompositeDisposable()\n\n migrateConfigOptions()\n\n const embeddedScope = 'source.js.embedded.html'\n this.subscriptions.add(atom.config.observe(\n 'linter-eslint.lintHtmlFiles',\n (value) => {\n lintHtmlFiles = value\n if (lintHtmlFiles) {\n scopes.push(embeddedScope)\n } else if (scopes.indexOf(embeddedScope) !== -1) {\n scopes.splice(scopes.indexOf(embeddedScope), 1)\n }\n }\n ))\n\n this.subscriptions.add(atom.config.observe(\n 'linter-eslint.scopes',\n (value) => {\n // Remove any old scopes\n scopes.splice(0, scopes.length)\n // Add the current scopes\n Array.prototype.push.apply(scopes, value)\n // Ensure HTML linting still works if the setting is updated\n if (lintHtmlFiles && !scopes.includes(embeddedScope)) {\n scopes.push(embeddedScope)\n }\n }\n ))\n\n this.subscriptions.add(atom.workspace.observeTextEditors((editor) => {\n editor.onDidSave(async () => {\n if (hasValidScope(editor, scopes)\n && atom.config.get('linter-eslint.autofix.fixOnSave')\n ) {\n await this.fixJob(true)\n }\n })\n }))\n\n this.subscriptions.add(atom.commands.add('atom-text-editor', {\n 'linter-eslint:debug': async () => {\n const debugString = await helpers.generateDebugString()\n const notificationOptions = { detail: debugString, dismissable: true }\n atom.notifications.addInfo('linter-eslint debugging information', notificationOptions)\n }\n }))\n\n this.subscriptions.add(atom.commands.add('atom-text-editor', {\n 'linter-eslint:fix-file': async () => {\n await this.fixJob()\n }\n }))\n\n this.subscriptions.add(atom.config.observe(\n 'linter-eslint.advanced.showRuleIdInMessage',\n (value) => { showRule = value }\n ))\n\n this.subscriptions.add(atom.config.observe(\n 'linter-eslint.disabling.rulesToSilenceWhileTyping',\n (ids) => { ignoredRulesWhenModified = ids }\n ))\n\n this.subscriptions.add(atom.config.observe(\n 'linter-eslint.autofix.rulesToDisableWhileFixing',\n (ids) => { ignoredRulesWhenFixing = idsToIgnoredRules(ids) }\n ))\n\n this.subscriptions.add(atom.config.observe(\n 'linter-eslint.autofix.ignoreFixableRulesWhileTyping',\n (value) => { ignoreFixableRulesWhileTyping = value }\n ))\n\n this.subscriptions.add(atom.contextMenu.add({\n 'atom-text-editor:not(.mini), .overlayer': [{\n label: 'ESLint Fix',\n command: 'linter-eslint:fix-file',\n shouldDisplay: (evt) => {\n const activeEditor = atom.workspace.getActiveTextEditor()\n if (!activeEditor) {\n return false\n }\n // Black magic!\n // Compares the private component property of the active TextEditor\n // against the components of the elements\n const evtIsActiveEditor = evt.path.some(elem => (\n // Atom v1.19.0+\n elem.component && activeEditor.component\n && elem.component === activeEditor.component))\n // Only show if it was the active editor and it is a valid scope\n return evtIsActiveEditor && hasValidScope(activeEditor, scopes)\n }\n }]\n }))\n\n scheduleIdleTasks()\n },\n\n deactivate() {\n idleCallbacks.forEach(callbackID => window.cancelIdleCallback(callbackID))\n idleCallbacks.clear()\n if (helpers) {\n // If the helpers module hasn't been loaded then there was no chance a\n // worker was started anyway.\n helpers.killWorker()\n }\n this.subscriptions.dispose()\n },\n\n provideLinter() {\n return {\n name: 'ESLint',\n grammarScopes: scopes,\n scope: 'file',\n lintsOnChange: true,\n lint: async (textEditor) => {\n if (!atom.workspace.isTextEditor(textEditor)) {\n // If we somehow get fed an invalid TextEditor just immediately return\n return null\n }\n\n const filePath = textEditor.getPath()\n if (!filePath) {\n // The editor currently has no path, we can't report messages back to\n // Linter so just return null\n return null\n }\n\n\n if (filePath.includes('://')) {\n // If the path is a URL (Nuclide remote file) return a message\n // telling the user we are unable to work on remote files.\n return helpers.generateUserMessage(textEditor, {\n severity: 'warning',\n excerpt: 'Remote file open, linter-eslint is disabled for this file.',\n })\n }\n\n const text = textEditor.getText()\n\n let rules = {}\n if (textEditor.isModified()) {\n if (ignoreFixableRulesWhileTyping) {\n // Note that the fixable rules will only have values after the first lint job\n const ignoredRules = new Set(helpers.rules.getFixableRules())\n ignoredRulesWhenModified.forEach(ruleId => ignoredRules.add(ruleId))\n rules = idsToIgnoredRules(ignoredRules)\n } else {\n rules = idsToIgnoredRules(ignoredRulesWhenModified)\n }\n }\n\n try {\n const response = await helpers.sendJob({\n type: 'lint',\n contents: text,\n config: atom.config.get('linter-eslint'),\n rules,\n filePath,\n projectPath: atom.project.relativizePath(filePath)[0] || ''\n })\n if (textEditor.getText() !== text) {\n /*\n The editor text has been modified since the lint was triggered,\n as we can't be sure that the results will map properly back to\n the new contents, simply return `null` to tell the\n `provideLinter` consumer not to update the saved results.\n */\n return null\n }\n return helpers.processJobResponse(response, textEditor, showRule)\n } catch (error) {\n return helpers.handleError(textEditor, error)\n }\n }\n }\n },\n\n async fixJob(isSave = false) {\n const textEditor = atom.workspace.getActiveTextEditor()\n\n if (!textEditor || !atom.workspace.isTextEditor(textEditor)) {\n // Silently return if the TextEditor is invalid\n return\n }\n\n if (textEditor.isModified()) {\n // Abort for invalid or unsaved text editors\n const message = 'Linter-ESLint: Please save before fixing'\n atom.notifications.addError(message)\n }\n\n const filePath = textEditor.getPath()\n const projectPath = atom.project.relativizePath(filePath)[0]\n\n // Get the text from the editor, so we can use executeOnText\n const text = textEditor.getText()\n // Do not try to make fixes on an empty file\n if (text.length === 0) {\n return\n }\n\n let rules = {}\n if (Object.keys(ignoredRulesWhenFixing).length > 0) {\n rules = ignoredRulesWhenFixing\n }\n\n try {\n const response = await helpers.sendJob({\n type: 'fix',\n config: atom.config.get('linter-eslint'),\n contents: text,\n rules,\n filePath,\n projectPath\n })\n if (!isSave) {\n atom.notifications.addSuccess(response)\n }\n } catch (err) {\n atom.notifications.addWarning(err.message)\n }\n },\n}\n"],"names":["_interopDefaultLegacy","e","os__default","os","fs__default","fs","path__default","path","extractPathRegex","pathRegex","homeDir","homedir","AggregateError","Error","constructor","errors","Array","isArray","TypeError","message","map","error","Object","assign","stack","replace","cleanInternalStack","options","pretty","split","filter","line","pathMatches","match","includes","test","trim","m","p1","join","String","string","count","indent","includeEmptyLines","regex","repeat","indentString","name","defineProperty","this","value","Symbol","iterator","_errors","aggregateError","pMap$1","iterable","mapper","Promise","resolve","reject","concurrency","Infinity","ret","isRejected","isIterableDone","resolvingCount","currentIndex","next","nextItem","i","done","then","element","pMap_1","_default","default","pFilter","async","filterer","index","all","Boolean","pFilter_1","_default$1","IS_ATOM","atom","IS_DEV","inDevMode","inSpecMode","matchHtmlRegExp","escapeHtml_1","escape","str","exec","html","lastIndex","length","charCodeAt","substring","spawn","command","args","spawnedProcess","promise","child_process","output","stdout","stderr","on","chunk","push","handleStdout","handleStderr","code","outputStdout","encoding","Buffer","concat","outputStderr","exitCode","handleChildProcess","spawnInternal","_spawnedProcess","kill","signal","getInstalledDependencyVersion$2","dependency","atomPackageVersion","_packageModule$metada","packageModule","packages","getLoadedPackage","metadata","version","getInstalledDependencyVersion","_manifest$version","_manifest","directory","manifest","JSON","parse","promises","readFile","_","getInstalledDependencyVersion$1","resolveDependencyPath$2","packageName","resolvePackagePath","_process$env$ATOM_HOM","packageDirectory","process","env","ATOM_HOME","access","constants","R_OK","invariant","condition","getDependencies$2","dependencies","packageDependencies","getDependencies","packageStats","stat","isDirectory","parsed","contents","getDependencies$1","forEach","item","subitem","subindex","invalidMessage","minimumVersion","shouldInstallDependency","a","b","pa","pb","na","Number","nb","isNaN","semverCompare","INSTALL_VALID_TICKS","Set","INSTALL_VALIDATION_REGEXP","getResolvedDependency","console","entry","showResetInstruction","getView$2","failed","notification","notifications","addInfo","detail","dismissable","progress","document","createElement","max","style","width","_notificationView$ele2","notificationView","views","getView","notificationElement","notificationContent","querySelector","appendChild","err","handleFailure","_error$stack","handleDependencyInstalled","handleComplete","dismiss","addWarning","addSuccess","activatePackage","catch","log","confirmPackagesToInstall$2","ungroupedDependencies","groupedDependencies","skipGroups","groupChoices","isPackageDisabled","warn","icon","description","buttons","text","onDidClick","_atom$config$get2","ignoredPackages","config","get","add","set","from","markPackageAsIgnored","onDidDismiss","_notificationView$ele","innerHTML","ungroupedLine","groupLabelLine","groupedList","listItem","select","addEventListener","find","marginTop","exports","hideUserPrompt","_atom$config$get","resolvedDependencies","dependenciesToInstall","every","chosenDependencies","dep","view","stopOnError","isSafeInteger","result","pMap","apmPath","getApmPath","shell","has","installPackage","throwIfInvalidPoint","textBuffer","column","msg","passed","throwIfFail","clipPosition","isEqual","isValidPoint","hasValidScope","editor","validScopes","getCursors","some","cursor","getScopeDescriptor","getScopesArray","scope","genTag","reIsHostCtor","freeGlobal","global","freeSelf","self","root","Function","arrayIncludes","array","fromIndex","predicate","fromRight","baseFindIndex","baseIsNaN","baseIndexOf","arrayIncludesWith","comparator","cacheHas","cache","key","setToArray","size","uid","arrayProto","prototype","funcProto","objectProto","coreJsData","maskSrcKey","keys","IE_PROTO","funcToString","toString","hasOwnProperty","objectToString","reIsNative","RegExp","call","splice","Map","getNative","nativeCreate","Hash","entries","clear","ListCache","MapCache","SetCache","values","__data__","assocIndexOf","other","baseIsNative","isObject","func","tag","isFunction","isHostObject","toSource","data","undefined","pop","getMapData","createSet","type","object","getValue","module","obj","iteratee","isCommon","seen","outer","computed","seenIndex","baseUniq","_getCommand","getCommand","parameters","timeout","_child_process","spawnSync","_getCommand2","childProcess","timer","setTimeout","clearTimeout","rawEnvironment","environment","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","indexOf","slice","return","PATH","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","DEFAULT_PATHS","USER","HOME","_path2","basename","_lodash2","PWD","cwd","OLDPWD","_interopRequireDefault","_path","_lodash","__esModule","pyScript","shScript","wrappedShScript","SHELL","target","source","platform","_helpers","CACHE_KEY","shellName","KNOWN_SHELLS","applySugar","identifyEnvironment","identifyEnvironmentAsync","CACHE_DELETED","callback","arguments","memoized","_len","_key","cacheKey","stringify","parametersLength","__sb_cache","_value","apply","realValue","promisify","throwError","_this","_ref","_ref2","duplicate","fn","findItemAsync","names","chunks","sep","currentDir","fileName","filePath","_fs2","gen","step","arg","info","_x","_x2","_fs","_sbMemoize2","_sbMemoize","_sbPromisify","accessSync","getPathAsync","givenCurrentDirectory","currentDirectory","findAsync","getPath","_typeof","spawnOptions","mergeEnv","_consistentEnv","npmPath","local","_sbNpmPath","prepend","PATH_SEPARATOR","OS","versions","electron","ELECTRON_RUN_AS_NODE","ATOM_SHELL_INTERNAL_RUN_AS_NODE","ELECTRON_NO_ATTACH_CONSOLE","givenOptionsAccepted","_assert2","stream","stdin","isBuffer","throwOnStderr","allowEmptyStderr","ignoreExitCode","mergePath","baseFilePath","errno","syscall","spawnargs","_assert","envA","envB","mergedEnv","toUpperCase","_asyncToGenerator","givenFilePath","givenParameters","nodeSpawnOptions","getSpawnOptions","spawnedCmdOnWindows","shouldNormalizeForWindows","windowsVerbatimArguments","cmdArgs","comspec","getENOENTError","write","end","killProcess","_x3","_x4","spawnfile","execProxy","pid","parseInt","_x7","givenOptions","validate","killSignal","spawnedChildProcess","givenKillSignal","execNode","execPath","isWindows","trailingSlashRe","_c","binding","tmpDir","TEMP","TMP","SystemRoot","windir","TMPDIR","RANDOM_CHARS","TEMPLATE_PATTERN","CREATE_FLAGS","O_CREAT","O_EXCL","O_RDWR","EBADF","ENOENT","_removeObjects","_gracefulCleanup","_uncaughtException","_randomChars","howMany","rnd","crypto","randomBytes","pseudoRandomBytes","_isUndefined","_parseArguments","_generateTmpName","opts","dir","template","prefix","postfix","tmpName","cb","tries","_getUniqueName","tmpNameSync","statSync","_rmdirRecursiveSync","dirs","deferred","files","readdirSync","file","lstatSync","unlinkSync","rmdirSync","_prepareTmpFileRemoveCallback","fd","removeCallback","_prepareRemoveCallback","fdPath","closeSync","isExpectedError","isENOENT","keep","unshift","_prepareTmpDirRemoveCallback","unsafeCleanup","bind","removeFunction","called","_cleanupCallback","_garbageCollector","node","addListener","mkdir","mode","mkdirSync","open","discardDescriptor","close","detachDescriptor","discardOrDetachDescriptor","openSync","textEditor","bufferPosition","scopeDescriptor","scopeDescriptorForBufferPosition","nonWordCharacters","_tmp2","cleanup","isEditor","workspace","isTextEditor","getText","killed","spawned","mirror","uniqueKey","oldValue","processMap","newError","_tmp","_sbPromisify2","writeFile","unlink","window","validGroupName","parseRegex","c","c1","c12","nameEnd","current","regexText","inCharSet","regexp","flags","multiline","ignoreCase","groupsIndices","matched","extendMatched","execGroups","groups","replacement","replacementText","groupIndex","parseReplacement","cachedGroups","cachedGroupsAll","group","indices","v","cg","Helpers","validateFind","Path","_filePath","fileExists","cachedFilePath","FindCache","delete","_ref3","tempFiles","tempDirectory","getTempDirectory","filePaths","fileContents","unlinkFile","_x5","_x6","validateEditor","lineNumber","isFinite","buffer","getBuffer","lineMax","getLineCount","columnGiven","lineText","lineForRow","colEnd","colStart","getWordRegexp","substr","indentation","FS","results","NamedRegexp","require","defaultOptions","messages","compiledRegexp","rawMatch","lineStart","col","lineEnd","range","_interopRequireWildcard","newObj","_filePath2","wrapExec","_sbExec","execNodeProxy","randomBytesAsync","urlSafeCharacters","numericCharacters","distinguishableCharacters","asciiPrintableCharacters","alphanumericCharacters","allowedTypes","createGenerator","generateForCustomCharacters","generateRandomBytes","characters","Math","ceil","characterCount","maxValidSelector","floor","entropyLength","stringLength","entropy","entropyPosition","entropyValue","readUInt16LE","byteLength","pluginName","plugins","url","ruleId","ruleParts","found","ruleName","rules","newRules","replaceRules","getFixableRules","ruleIds","ruleProps","meta","fixable","getRuleUrl","props","docs","ruleURI","getRules","worker","startWorker","Task","started","start","killWorker","terminate","sendJob","connected","emitKey","cryptoRandomString","errSub","dispose","responseSub","send","getDebugInfo","getActiveTextEditor","editorScopes","getLastCursor","packagePath","linterEslintMeta","hoursSinceRestart","round","uptime","returnVal","response","atomVersion","getVersion","linterEslintVersion","linterEslintConfig","eslintVersion","eslintType","eslintPath","addError","generateDebugString","debug","generateUserMessage","severity","excerpt","location","position","generateRange","handleError","processESLintMessages","showRule","fatal","originalMessage","fix","endLine","endColumn","msgCol","msgEndLine","msgEndCol","linterFix","Range","positionForCharacterIndex","replaceWith","eslintFullRange","msgLine","fixLineEnding","ruleAppendix","solutions","errMsgRange","rangeText","titleText","encodeURIComponent","generateInvalidTrace","processJobResponse","updatedRules","activeMigrations","added","moves","old","new","migrate","oldRulesdir","eslintRulesDir","eslintRulesDirs","unset","migrations","migration","move","oldSetting","idleCallbacks","makeIdleCallback","work","callbackId","requestIdleCallback","scopes","lintHtmlFiles","ignoredRulesWhenModified","ignoredRulesWhenFixing","ignoreFixableRulesWhileTyping","idsToIgnoredRules","reduce","ids","id","activate","subscriptions","CompositeDisposable","migrateConfigOptions","embeddedScope","observe","observeTextEditors","onDidSave","fixJob","commands","notificationOptions","helpers","contextMenu","label","shouldDisplay","evt","activeEditor","elem","component","linterEslintInstallPeerPackages","install","linterEslintStartWorker","scheduleIdleTasks","deactivate","callbackID","cancelIdleCallback","provideLinter","grammarScopes","lintsOnChange","lint","isModified","ignoredRules","projectPath","project","relativizePath","isSave"],"mappings":"uSASA,SAASA,EAAuBC,UAAYA,GAAkB,iBAANA,GAAkB,YAAaA,EAAIA,EAAI,SAAaA,GAE5G,IAAIC,EAA2BF,EAAsBG,WACjDC,EAA2BJ,EAAsBK,WACjDC,EAA6BN,EAAsBO,WAoCvD,MAAMC,EAAmB,0BACnBC,EAAY,+GACZC,OAAoD,IAAnCR,EAAW,QAAYS,QAA0B,GAAKT,EAAW,QAAYS,UAsCpG,MAAMC,UAAuBC,MAC5BC,YAAYC,OACNC,MAAMC,QAAQF,SACZ,IAAIG,UAAW,6CAA4CH,OAgB9DI,GAbJJ,EAAS,IAAIA,GAAQK,KAAIC,GACpBA,aAAiBR,MACbQ,EAGM,OAAVA,GAAmC,iBAAVA,EAErBC,OAAOC,OAAO,IAAIV,MAAMQ,EAAMF,SAAUE,GAGzC,IAAIR,MAAMQ,MAIhBD,KAAIC,UAE0B,iBAAhBA,EAAMG,MAxBGA,CAAAA,GAASA,EAAMC,QAAQ,gDAAiD,IAwBtDC,EA1D3BF,EA0DyDH,EAAMG,MAzDhFG,EAAUL,OAAOC,OAAO,CAACK,QAAQ,GAAQD,GAElCH,EAAMC,QAAQ,MAAO,KAC1BI,MAAM,MACNC,QAAOC,UACDC,EAAcD,EAAKE,MAAMzB,MACX,OAAhBwB,IAAyBA,EAAY,UACjC,QAGFC,EAAQD,EAAY,UAIzBC,EAAMC,SAAS,2CACfD,EAAMC,SAAS,8CAKRzB,EAAU0B,KAAKF,MAEvBH,QAAOC,GAAwB,KAAhBA,EAAKK,SACpBhB,KAAIW,GACAJ,EAAQC,OACJG,EAAKN,QAAQjB,GAAkB,CAAC6B,EAAGC,IAAOD,EAAEZ,QAAQa,EAAIA,EAAGb,QAAQf,EAAS,QAG7EqB,IAEPQ,KAAK,QA2BmFC,OAAOnB,GA1DjF,IAACG,EAAOG,KA4DrBY,KAAK,MACPpB,EAAU,KAnGO,EAACsB,EAAQC,EAAQ,EAAGf,QACtCA,EAAU,CACTgB,OAAQ,IACRC,mBAAmB,KAChBjB,GAGkB,iBAAXc,QACJ,IAAIvB,UACR,uDAAsDuB,UAIpC,iBAAVC,QACJ,IAAIxB,UACR,uDAAsDwB,UAI3B,iBAAnBf,EAAQgB,aACZ,IAAIzB,UACR,gEAA+DS,EAAQgB,eAI5D,IAAVD,SACID,QAGFI,EAAQlB,EAAQiB,kBAAoB,MAAQ,qBAE3CH,EAAOhB,QAAQoB,EAAOlB,EAAQgB,OAAOG,OAAOJ,KAoEjCK,CAAa5B,EAAS,SACjCA,QAED6B,KAAO,iBAEZ1B,OAAO2B,eAAeC,KAAM,UAAW,CAACC,MAAOpC,MAG7CqC,OAAOC,gBACJ,MAAMhC,KAAS6B,KAAKI,cAClBjC,GAKT,IAAIkC,EAAiB3C,EAiFrB,MAAM4C,EAAS,CAACC,EAAUC,EAAQ/B,IAAY,IAAIgC,SAAQ,CAACC,EAASC,QACnElC,EAAUL,OAAOC,OAAO,CACvBuC,YAAaC,EAAAA,GACXpC,GAEmB,mBAAX+B,QACJ,IAAIxC,UAAU,qCAGf4C,YAACA,GAAenC,OAEO,iBAAhBmC,GAA4BA,GAAe,SACjD,IAAI5C,UAAW,gEAA+D4C,eAAyBA,YAGxGE,EAAM,GACNX,EAAWI,EAASL,OAAOC,gBAC7BY,GAAa,EACbC,GAAiB,EACjBC,EAAiB,EACjBC,EAAe,QAEbC,EAAO,QACRJ,eAIEK,EAAWjB,EAASgB,OACpBE,EAAIH,KACVA,IAEIE,EAASE,YACZN,GAAiB,OAEM,IAAnBC,GACHP,EAAQI,IAMVG,IAEAR,QAAQC,QAAQU,EAASnB,OACvBsB,MAAKC,GAAWhB,EAAOgB,EAASH,KAChCE,MACAtB,IACCa,EAAIO,GAAKpB,EACTgB,IACAE,OAEDhD,IACC4C,GAAa,EACbJ,EAAOxC,WAKN,IAAIkD,EAAI,EAAGA,EAAIT,IACnBO,KAEIH,GAH4BK,SASlC,IAAII,EAASnB,EAEToB,EAAWpB,EACfmB,EAAOE,QAAUD,EAEjB,MAAME,EAAUC,MAAOtB,EAAUuB,EAAUrD,WACrBgD,EACpBlB,GACA,CAACiB,EAASO,IAAUtB,QAAQuB,IAAI,CAACF,EAASN,EAASO,GAAQP,KAC3D/C,IAEaG,QAAOqB,GAASgC,QAAQhC,EAAM,MAAK/B,KAAI+B,GAASA,EAAM,KAGrE,IAAIiC,EAAYN,EAEZO,EAAaP,EACjBM,EAAUP,QAAUQ,EAEpB,MAAMC,EAA0B,oBAATC,KACjBC,EAAyB,oBAATD,OAAyBA,KAAKE,aAAeF,KAAKG,cAgBxE,IAAIC,EAAkB,UAOlBC,EAUJ,SAAoBnD,OAQdoD,EAPAC,EAAM,GAAKrD,EACXR,EAAQ0D,EAAgBI,KAAKD,OAE5B7D,SACI6D,MAILE,EAAO,GACPf,EAAQ,EACRgB,EAAY,MAEXhB,EAAQhD,EAAMgD,MAAOA,EAAQa,EAAII,OAAQjB,IAAS,QAC7Ca,EAAIK,WAAWlB,SAChB,GACHY,EAAS,oBAEN,GACHA,EAAS,mBAEN,GACHA,EAAS,mBAEN,GACHA,EAAS,kBAEN,GACHA,EAAS,8BAMTI,IAAchB,IAChBe,GAAQF,EAAIM,UAAUH,EAAWhB,IAGnCgB,EAAYhB,EAAQ,EACpBe,GAAQH,SAGHI,IAAchB,EACjBe,EAAOF,EAAIM,UAAUH,EAAWhB,GAChCe,GAoDN,SAASK,EAAMC,EAASC,EAAM5E,OACtB6E,QACEC,EAnDV1B,eAA6BuB,EAASC,EAAM5E,SAClC6E,EAAiBE,UAAcL,MAAMC,EAASC,EAAM5E,GACpD8E,EAAU,IAAI9C,SAAQ,CAACC,EAASC,WAC5B8C,EAAS,CACXC,OAAQJ,EAAeI,OAAS,GAAK,KACrCC,OAAQL,EAAeK,OAAS,GAAK,MAEzCL,EAAeM,GAAG,QAASjD,GACvB2C,EAAeI,QACfJ,EAAeI,OAAOE,GAAG,QAAQ,SAAUC,GACvCJ,EAAOC,OAAOI,KAAKD,GACfpF,EAAQsF,cACRtF,EAAQsF,aAAaF,MAI7BP,EAAeK,QACfL,EAAeK,OAAOC,GAAG,QAAQ,SAAUC,GACvCJ,EAAOE,OAAOG,KAAKD,GACfpF,EAAQuF,cACRvF,EAAQuF,aAAaH,MAIjCP,EAAeM,GAAG,SAASK,QACnBC,EAAe,KACE,MAAjBT,EAAOC,SACPQ,EACyB,OAArBzF,EAAQ0F,UAA0C,WAArB1F,EAAQ0F,SAC/BC,OAAOC,OAAOZ,EAAOC,QACrBD,EAAOC,OAAOrE,KAAK,SAE7BiF,EAAe,KACE,MAAjBb,EAAOE,SACPW,EACyB,OAArB7F,EAAQ0F,UAA0C,WAArB1F,EAAQ0F,SAC/BC,OAAOC,OAAOZ,EAAOE,QACrBF,EAAOE,OAAOtE,KAAK,KAEjCqB,EAAQ,CACJ6D,SAAUN,EACVP,OAAQQ,EACRP,OAAQW,iBAIpB7F,EAAQ+F,mBAAmBlB,GACpBC,EAISkB,CAAcrB,EAASC,EAAM,IACtC5E,EACH+F,mBAAmBE,GACfpB,EAAiBoB,YAGzBnB,EAAQoB,KAAO,SAAUC,UAEdtB,EAAeqB,KAAKC,IAExBrB,EA8FX1B,eAAegD,EAAgCC,MACzC1C,EAAS,OACL2C,QAvEVlD,eAA6CiD,OACvCE,QAEEC,EAAgB5C,KAAK6C,SAASC,iBAAiBL,EAAWhF,aACxC,MAAjBmF,EAAwB,KAAoE,QAA5DD,EAAwBC,EAAcG,SAASC,eAA+C,IAA1BL,EAAmCA,EAAwB,KAmEnIM,CAA8BR,MAE3DC,SACKA,SAhCblD,eAA+CiD,OACzCS,EAAmBC,QAEjBC,UACJA,GACEX,KAEa,MAAbW,SAEK,SAGLC,EAAW,SAGbA,EAAWC,KAAKC,YAAY1I,EAAW,QAAY2I,SAASC,SAAS1I,EAAa,QAAYiC,KAAKoG,EAAW,gBAAiB,SAC/H,MAAOM,UACA,YAG6G,QAA9GR,EAA+C,QAA1BC,EAAYE,SAAoC,IAAdF,OAAuB,EAASA,EAAUH,eAA2C,IAAtBE,EAA+BA,EAAoB,KAiB1KS,CAAgClB,GAOzC,MAAMmB,EAA0B7D,EAzFhCP,eAAqCqE,UAC5B7D,KAAK6C,SAASiB,mBAAmBD,IAgC1CrE,eAAuCqE,OACjCE,QAEEC,EAAmBjJ,EAAa,QAAYiC,KAAyD,QAAnD+G,EAAwBE,QAAQC,IAAIC,iBAAiD,IAA1BJ,EAAmCA,EAAwBhJ,EAAa,QAAYiC,KAAKrC,EAAW,QAAYS,UAAW,SAAU,WAAYyI,oBAG5PhJ,EAAW,QAAY2I,SAASY,OAAOJ,EAAkBnJ,EAAW,QAAYwJ,UAAUC,MACzFN,EACP,MAAON,UACA,OAgDX,SAASa,EAAUC,EAAW5I,OACvB4I,QACG,IAAIlJ,MAAMM,MAAAA,EAAyCA,EAAU,uBAGvE4D,eAAeiF,EAAkBhH,SACzBiH,QAAsB3E,EArG9BP,eAA+BqE,SACvBjB,EAAgB5C,KAAK6C,SAASC,iBAAiBe,GAC/Cc,EAAsB/B,GAAiBA,EAAcG,SAAS,uBAC7DtH,MAAMC,QAAQiJ,GAAuBA,EAAsB,GAkG5BC,CAAgBnH,GAtFxD+B,eAAiCqE,OAC3BgB,EAAe,SAGjBA,QAAqBhK,EAAW,QAAY2I,SAASsB,KAAKjB,GAC1D,MAAOH,OAGW,MAAhBmB,IAAyBA,EAAaE,oBAClC,IAAIzJ,MAAO,4FAGf0J,EAAS,eAGLC,QAAiBpK,EAAW,QAAY2I,SAASC,SAAS1I,EAAa,QAAYiC,KAAK6G,EAAa,gBAAiB,QAC5HmB,EAAS1B,KAAKC,MAAM0B,GACpB,MAAOvB,UAGHiB,EAAgC,MAAVK,GAAoC,iBAAXA,EAAsB,GAAKA,EAAO,uBAChFvJ,MAAMC,QAAQiJ,GAAuBA,EAAsB,GAiEJO,CAAkBzH,WAE5EwC,IACFsE,EAAU9I,MAAMC,QAAQgJ,GAAgB,oBAAmBjH,2BAC3DiH,EAAaS,SAAQ,CAACC,EAAM1F,QACtBjE,MAAMC,QAAQ0J,GAChBA,EAAKD,SAAQ,CAACE,EAASC,WACfC,EAAkB,cAAa7F,KAAS4F,SAAgB7H,eAC9D8G,EAAkC,iBAAjBc,EAAQ5H,MAAqB4H,EAAQ5H,KAAKkD,OAAS,EAAG4E,GACvEhB,EAAoC,MAA1Bc,EAAQG,gBAA4D,iBAA3BH,EAAQG,gBAA+BH,EAAQG,eAAe7E,OAAS,EAAG4E,MAE/HhB,EAAUa,EAAKzE,OAAS,EAAI,cAAajB,SAAajC,4BACjD,OACC8H,EAAkB,cAAa7F,SAAajC,eAClD8G,EAA+B,iBAAda,EAAK3H,MAAqB2H,EAAK3H,KAAKkD,OAAS,EAAG4E,GACjEhB,EAAiC,MAAvBa,EAAKI,gBAAyD,iBAAxBJ,EAAKI,gBAA+BJ,EAAKI,eAAe7E,OAAS,EAAG4E,QAKnHb,EAETlF,eAAeiG,EAAwBhD,MACT,MAAxBA,EAAWW,iBAEN,KAGwB,MAA7BX,EAAW+C,sBAEN,QAGHxC,QAAgBR,EAAgCC,UAEvC,MAAXO,GAKyD,IA3J3C,SAAc0C,EAAGC,WAC7BC,EAAKF,EAAEpJ,MAAM,KACbuJ,EAAKF,EAAErJ,MAAM,KACR0C,EAAI,EAAGA,EAAI,EAAGA,IAAK,KACpB8G,EAAKC,OAAOH,EAAG5G,IACfgH,EAAKD,OAAOF,EAAG7G,OACf8G,EAAKE,EAAI,OAAO,KAChBA,EAAKF,EAAI,OAAQ,MAChBG,MAAMH,IAAOG,MAAMD,GAAK,OAAO,KAChCC,MAAMH,KAAQG,MAAMD,GAAK,OAAQ,SAElC,EAgJFE,CAAczD,EAAW+C,eAAgBxC,GA8BlD,MAAMmD,EAAsB,IAAIC,IAAI,CAAC,IAAK,SACpCC,EAA4B,yCAqBlC7G,eAAe8G,EAAsBlB,MAEf,iBAATA,QACF,CACL3H,KAAM2H,EACNhC,gBAAiBQ,EAAwBwB,OAIzC,SAAUA,QACL,IAAKA,EACVhC,gBAAiBQ,EAAwBwB,EAAK3H,aAIlD8I,QAAQzK,MAAO,2GAA2G,CACxH0K,MAAOpB,IAEH9J,MAAO,2GAGf,IAAImL,GAAuB,EAsO3B,MAAMC,EAAY3G,EApHlB,UAAiB8D,YACfA,EADea,aAEfA,UAEMiC,EAAS,GACTC,EAAe5G,KAAK6G,cAAcC,QAAS,cAAajD,iBAA4B,CACxFkD,OAAS,cAAarC,EAAa7I,KAAIuJ,GAAQA,EAAK3H,OAAMT,KAAK,QAC/DgK,aAAa,IAETC,EAAWC,SAASC,cAAc,YACxCF,EAASG,IAAM1C,EAAa/D,OAC5BsG,EAASI,MAAMC,MAAQ,eAGjBC,QAEEC,EAAmBxH,KAAKyH,MAAMC,QAAQd,GACtCe,EAAkJ,QAA3HJ,EAAyBC,MAAAA,OAA2D,EAASA,EAAiBrI,eAAgD,IAA3BoI,EAAoCA,EAAyB,QAElM,MAAvBI,QACI,IAAIrM,MAAM,sDAGZsM,EAAsBD,EAAoBE,cAAc,sBAEnC,MAAvBD,QACI,IAAItM,MAAM,8DAGlBsM,EAAoBE,YAAYb,GAChC,MAAOc,GACPxB,QAAQzK,MAAM,oEAAqEiM,SAG9E,CACLC,eAAcvF,WACZA,EADY3G,MAEZA,QAEImM,EAEJtB,EAAOlF,KAAKgB,EAAWhF,MACvBwJ,EAASrJ,OAAS,EAClB2I,QAAQzK,MAAO,oCAAmC2G,EAAWhF,eAA+F,QAA9EwK,EAAenM,MAAAA,OAAqC,EAASA,EAAMG,aAAoC,IAAjBgM,EAA0BA,EAAenM,IAG/MoM,0BAA0BzF,GACxBwE,EAASrJ,OAAS,GAGpBuK,iBACEvB,EAAawB,UAETzB,EAAOhG,OAAS,EAClBX,KAAK6G,cAAcwB,WAAY,qBAAoBxE,iBAA4B,CAC7EkD,OAAS,0EAAyEJ,EAAO3J,KAAK,QAC9FgK,aAAa,IAGfhH,KAAK6G,cAAcyB,WAAY,aAAYzE,iBAA4B,CACrEkD,OAAS,aAAYrC,EAAa7I,KAAIuJ,GAAQA,EAAK3H,OAAMT,KAAK,UAIlEoB,QAAQuB,IAAI+E,EAAa7I,KAAIuJ,GACtBuB,EAAOhK,SAASyI,EAAK3H,MAInB,KAHEuC,KAAK6C,SAAS0F,gBAAgBnD,EAAK3H,SAI1C+K,OAAMT,IACRxB,QAAQzK,MAAO,0DAAyD+H,IAAekE,SAa/F,UAAmBrD,aACjBA,QAEIiC,GAAS,SACbJ,QAAQkC,IAAK,6BAA4B/D,EAAa7I,KAAIuJ,GAAS,OAAMA,EAAK3H,SAAQT,KAAK,SACpF,CACLgL,eAAcvF,WACZA,EADY3G,MAEZA,QAEImM,EAEJtB,GAAS,EACTJ,QAAQzK,MAAO,qBAAoB2G,EAAWhF,eAA+F,QAA9EwK,EAAenM,MAAAA,OAAqC,EAASA,EAAMG,aAAoC,IAAjBgM,EAA0BA,EAAenM,IAGhMoM,0BAA0BzF,GACxB8D,QAAQkC,IAAI,yBAA0BhG,EAAWhF,OAGnD0K,iBACE5B,QAAQkC,IAAI,yBAER9B,IAEF1C,QAAQ/B,SAAW,MAQrBwG,EAA6B3I,EAtOnC,UAAkC8D,YAChCA,EADgCa,aAEhCA,WAEO,IAAItG,SAAQC,UACXsK,EAAwBjE,EAAanI,QAAO6I,IAAS3J,MAAMC,QAAQ0J,KACnEwD,EAAsBlE,EAAanI,QAAO6I,GAAQ3J,MAAMC,QAAQ0J,KAChEyD,EAA4C,IAA/BD,EAAoBjI,OACjCoG,EAAS8B,EAAaF,EAAsB9M,KAAIuJ,GAAQA,EAAK3H,OAAMT,KAAK,MAAQ,qDAChF8L,EAAeF,EAAoB/M,KAAIuJ,GAAQA,EAAK,KAEtDpF,KAAK6C,SAASkG,kBAAkB,kBAClCxC,QAAQyC,KAAM,oDAAmDnF,WAG7D+C,EAAe5G,KAAK6G,cAAcC,QAAS,GAAEjD,kCAA6C,CAC9FmD,aAAa,EACbiC,KAAM,iBACNlC,OAAAA,EACAmC,YAAc,oBAA2C,IAAxBxE,EAAa/D,OAAe,IAAM,SACnEwI,QAAS,CAAC,CACRC,KAAM,MACNC,WAAY,KAERhL,EADEwK,EACMF,EAEAA,EAAsB3G,OAAO8G,IAGvClC,EAAawB,YAEd,CACDgB,KAAM,YACNC,WAAY,KACVzC,EAAawB,YAEd,CACDgB,KAAM,QACNC,WAAY,MA9FpB,SAA8B5L,OACxB6L,MAECvJ,eAKCwJ,EAAkB,IAAInD,IAAmE,QAA9DkD,EAAoBtJ,KAAKwJ,OAAOC,IApUvC,oCAoUmG,IAAtBH,EAA+BA,EAAoB,IAC1JC,EAAgBG,IAAIjM,GACpBuC,KAAKwJ,OAAOG,IAtUc,4BAsUWlO,MAAMmO,KAAKL,IAqFxCM,CAAqBhG,GAEjB4C,IACFA,GAAuB,EACvBzG,KAAK6G,cAAcC,QAAQ,mCAAoC,CAC7DE,aAAa,EACbkC,YAAa,2HAIjBtC,EAAawB,kBAInBxB,EAAakD,cAAa,IAAMzL,EAAQ,OAEpCwK,UAMEkB,QAEEvC,EAAmBxH,KAAKyH,MAAMC,QAAQd,GACtCe,EAAiJ,QAA1HoC,EAAwBvC,MAAAA,OAA2D,EAASA,EAAiBrI,eAA+C,IAA1B4K,EAAmCA,EAAwB,QAE/L,MAAvBpC,QACI,IAAIrM,MAAM,sDAGZsM,EAAsBD,EAAoBE,cAAc,sBAEnC,MAAvBD,QACI,IAAItM,MAAM,iEAIlBsM,EAAoBoC,UAAY,GAE5BrB,EAAsBhI,OAAS,EAAG,OAC9BsJ,EAAgB/C,SAASC,cAAc,OAC7C8C,EAAcD,UAAa,2CAA0CrB,EAAsB9M,KAAIuJ,GAAQ/E,EAAa+E,EAAK3H,QAAOT,KAAK,yBACrI4K,EAAoBE,YAAYmC,SAI5BC,EAAiBhD,SAASC,cAAc,OAC9C+C,EAAeF,UAAa,yBAC5BpC,EAAoBE,YAAYoC,SAE1BC,EAAcjD,SAASC,cAAc,MAC3CyB,EAAoBzD,SAAQ,CAACC,EAAM1F,WAC3B0K,EAAWlD,SAASC,cAAc,MAClCkD,EAASnD,SAASC,cAAc,UACtCkD,EAAOL,UAAY5E,EAAKvJ,KAAIwJ,GAAY,WAAUhF,EAAagF,EAAQ5H,mBAAkBT,KAAK,MAC9FqN,EAAOC,iBAAiB,UAAU,WAE1BjF,EAAUD,EAAKmF,MAAK/D,GAASA,EAAM/I,OAAS4M,EAAOzM,QAE1C,MAAXyH,IACFyD,EAAapJ,GAAS2F,MAG1B+E,EAAS/C,MAAMmD,UAAY,MAC3BJ,EAAStC,YAAYuC,GACrBF,EAAYrC,YAAYsC,MAE1BxC,EAAoBE,YAAYqC,GAChC,MAAOpC,GACPxB,QAAQzK,MAAM,8DAA+DiM,QAkFnFvI,gBAA0CkF,aACxCA,WAGOA,EAAa7I,KAAIuJ,GAAQ3J,MAAMC,QAAQ0J,GAAQA,EAAK,GAAKA,KAuHlEqF,MAlFAjL,eAAuBqE,EAAa6G,GAAiB,MACnDnG,EAAiC,iBAAhBV,GAA4BA,EAAYlD,OAAS,EAAG,2CAjT7ClD,EAmTHoG,EAhThB9D,IAKiF,QAA7D4K,EAAmB3K,KAAKwJ,OAAOC,IApT9B,oCAoTyF,IAArBkB,EAA8BA,EAAmB,IAE3HhO,SAASc,UAV/B,IAA0BA,EACpBkN,QAwTEjG,QAAqBD,EAAkBZ,MAEjB,IAAxBa,EAAa/D,oBAMXiK,QAA6BxM,QAAQuB,IAAI+E,EAAa7I,KAAI2D,MAAAA,GAC1D/D,MAAMC,QAAQ0J,GACThH,QAAQuB,IAAIyF,EAAKvJ,IAAIyK,IAGvBA,EAAsBlB,MAIzByF,QAA8BhL,EAAU+K,GAAsBpL,eAAgB4F,UAC9E3J,MAAMC,QAAQ0J,UACFhH,QAAQuB,IAAIyF,EAAKvJ,KAAIwJ,GAAWI,EAAwBJ,OAAYyF,MAAMlL,SAGnF6F,EAAwBL,SAGI,IAAjCyF,EAAsBlK,kBAKtBoK,KASFA,EAPGL,EAOkBG,EAAsBhP,KAAImP,GACzCvP,MAAMC,QAAQsP,GACTA,EAAI,GAGNA,UAXkBtC,EAA2B,CACpD7E,YAAAA,EACAa,aAAcmG,IAagB,IAA9BE,EAAmBpK,oBAKjBsK,EAAOvE,EAAU,CACrB7C,YAAAA,EACAa,aAAcqG,SAn0BPvL,OACVtB,EACAC,GAECI,YAAAA,EAAcC,EAAAA,EACd0M,YAAAA,GAAc,GACX,KAEG,IAAI9M,SAAQ,CAACC,EAASC,QACN,mBAAXH,QACJ,IAAIxC,UAAU,mCAGdoK,OAAOoF,cAAc5M,IAAgBA,IAAgBC,EAAAA,KAAaD,GAAe,SACjF,IAAI5C,UAAW,kFAAiF4C,eAAyBA,YAG1H6M,EAAS,GACT5P,EAAS,GACTsC,EAAWI,EAASL,OAAOC,gBAC7BY,GAAa,EACbC,GAAiB,EACjBC,EAAiB,EACjBC,EAAe,QAEbC,EAAO,QACRJ,eAIEK,EAAWjB,EAASgB,OACpBY,EAAQb,KACdA,IAEIE,EAASE,YACZN,GAAiB,OAEM,IAAnBC,IACEsM,GAAiC,IAAlB1P,EAAOmF,OAG1BtC,EAAQ+M,GAFR9M,EAAO,IAAIN,EAAexC,MAS7BoD,yBAIQO,QAAgBJ,EAASnB,MAC/BwN,EAAO1L,SAAevB,EAAOgB,EAASO,GACtCd,IACAE,IACC,MAAOhD,GACJoP,GACHxM,GAAa,EACbJ,EAAOxC,KAEPN,EAAOiG,KAAK3F,GACZ8C,IACAE,eAMC,IAAIE,EAAI,EAAGA,EAAIT,IACnBO,KAEIH,GAH4BK,SAgwB3BqM,CAAKN,GAAoBvL,eAAgBiD,aAnVjDjD,eAA8BiD,SACtB6I,EAAUvL,EAAW,IAAGC,KAAK6C,SAAS0I,gBAAkB,OACxDlK,OACJA,EADIC,OAEJA,SACQR,EAAMwK,EAAS,CAAC,UAAW7I,EAAWhF,KAAM,eAAgB,UAAW,SAAU,CACzF+N,OAAO,IAEH9O,EAAQ2J,EAA0B7F,KAAKa,EAAOxE,WAEvC,MAATH,GAAiByJ,EAAoBsF,IAAI/O,EAAM,iBAK7CZ,EAAQ,IAAIR,MAAO,gCAA+BmH,EAAWhF,cACnE3B,EAAMG,MAAQqF,EAAOzE,OACff,EAoUI4P,CAAejJ,GACrBwI,EAAK/C,0BAA0BzF,GAC/B,MAAOsF,GACPkD,EAAKjD,cAAc,CACjBvF,WAAAA,EACA3G,MAAOiM,OAGV,CACDxJ,YAAa,IAEf0M,EAAK9C,+ECr9BP,MCSawD,EAAsB,CAACC,EAAYpP,EAAMqP,IDTlC,EAACC,EAAKC,SACnBA,QACG,IAAIzQ,MAAMwQ,UAEX,GCMPE,CACG,GAAExP,KAAQqP,yBATa,EAACD,EAAYpP,EAAMqP,IAE1BD,EAAWK,aAAa,CAACzP,EAAMqP,IAEhCK,QAAQ,CAAC1P,EAAMqP,IAM/BM,CAAaP,EAAYpP,EAAMqP,IAGtBO,EAAgB,CAACC,EAAQC,IAAgBD,EAAOE,aAC1DC,MAAKC,GAAUA,EAAOC,qBACpBC,iBACAH,MAAKI,GAASN,EAAY3P,SAASiQ,0aCRxC,IAUIC,GAAS,6BASTC,GAAe,8BAGfC,GAA8B,iBAAVC,GAAsBA,GAAUA,EAAOjR,SAAWA,QAAUiR,EAGhFC,GAA0B,iBAARC,MAAoBA,MAAQA,KAAKnR,SAAWA,QAAUmR,KAGxEC,GAAOJ,IAAcE,IAAYG,SAAS,cAATA,GAWrC,SAASC,GAAcC,EAAO1P,YACf0P,EAAQA,EAAM3M,OAAS,IAyDtC,SAAqB2M,EAAO1P,EAAO2P,MAC7B3P,GAAUA,SAtBhB,SAAuB0P,EAAOE,EAAWD,EAAWE,OAC9C9M,EAAS2M,EAAM3M,OACfjB,EAAQ6N,GAAaE,EAAY,GAAK,QAElCA,EAAY/N,MAAYA,EAAQiB,MAClC6M,EAAUF,EAAM5N,GAAQA,EAAO4N,UAC1B5N,SAGH,EAcCgO,CAAcJ,EAAOK,GAAWJ,OAErC7N,EAAQ6N,EAAY,EACpB5M,EAAS2M,EAAM3M,cAEVjB,EAAQiB,MACX2M,EAAM5N,KAAW9B,SACZ8B,SAGH,EApEWkO,CAAYN,EAAO1P,EAAO,IAAM,EAYrD,SAASiQ,GAAkBP,EAAO1P,EAAOkQ,WACnCpO,GAAS,EACTiB,EAAS2M,EAAQA,EAAM3M,OAAS,IAE3BjB,EAAQiB,MACXmN,EAAWlQ,EAAO0P,EAAM5N,WACnB,SAGJ,EAyDT,SAASiO,GAAU/P,UACVA,GAAUA,EAWnB,SAASmQ,GAASC,EAAOC,UAChBD,EAAMvC,IAAIwC,GAyCnB,SAASC,GAAWvE,OACdjK,GAAS,EACT0L,EAAS3P,MAAMkO,EAAIwE,aAEvBxE,EAAIxE,SAAQ,SAASvH,GACnBwN,IAAS1L,GAAS9B,KAEbwN,EAIT,IASMgD,GATFC,GAAa5S,MAAM6S,UACnBC,GAAYnB,SAASkB,UACrBE,GAAczS,OAAOuS,UAGrBG,GAAatB,GAAK,sBAGlBuB,IACEN,GAAM,SAAS5N,KAAKiO,IAAcA,GAAWE,MAAQF,GAAWE,KAAKC,UAAY,KACvE,iBAAmBR,GAAO,GAItCS,GAAeN,GAAUO,SAGzBC,GAAiBP,GAAYO,eAO7BC,GAAiBR,GAAYM,SAG7BG,GAAaC,OAAO,IACtBL,GAAaM,KAAKJ,IAAgB7S,QApMjB,sBAoMuC,QACvDA,QAAQ,yDAA0D,SAAW,KAI5EkT,GAASf,GAAWe,OAGpBC,GAAMC,GAAUnC,GAAM,OACtB/G,GAAMkJ,GAAUnC,GAAM,OACtBoC,GAAeD,GAAUvT,OAAQ,UASrC,SAASyT,GAAKC,OACR/P,GAAS,EACTiB,EAAS8O,EAAUA,EAAQ9O,OAAS,WAEnC+O,UACIhQ,EAAQiB,GAAQ,KACnB6F,EAAQiJ,EAAQ/P,QACfiK,IAAInD,EAAM,GAAIA,EAAM,KA2F7B,SAASmJ,GAAUF,OACb/P,GAAS,EACTiB,EAAS8O,EAAUA,EAAQ9O,OAAS,WAEnC+O,UACIhQ,EAAQiB,GAAQ,KACnB6F,EAAQiJ,EAAQ/P,QACfiK,IAAInD,EAAM,GAAIA,EAAM,KAyG7B,SAASoJ,GAASH,OACZ/P,GAAS,EACTiB,EAAS8O,EAAUA,EAAQ9O,OAAS,WAEnC+O,UACIhQ,EAAQiB,GAAQ,KACnB6F,EAAQiJ,EAAQ/P,QACfiK,IAAInD,EAAM,GAAIA,EAAM,KAwF7B,SAASqJ,GAASC,OACZpQ,GAAS,EACTiB,EAASmP,EAASA,EAAOnP,OAAS,WAEjCoP,SAAW,IAAIH,KACXlQ,EAAQiB,QACV+I,IAAIoG,EAAOpQ,IA4CpB,SAASsQ,GAAa1C,EAAOW,WAiOjBrQ,EAAOqS,EAhObtP,EAAS2M,EAAM3M,OACZA,SA+NG/C,EA9ND0P,EAAM3M,GAAQ,OA8NNsP,EA9NUhC,IA+NArQ,GAAUA,GAASqS,GAAUA,SA9N7CtP,SAGH,EAWV,SAASuP,GAAatS,YACfuS,GAASvS,KAgIEwS,EAhIiBxS,EAiIxB8Q,IAAeA,MAAc0B,MAkGxC,SAAoBxS,OAGdyS,EAAMF,GAASvS,GAASoR,GAAeG,KAAKvR,GAAS,SA1zB7C,qBA2zBLyS,GAAkBA,GAAOxD,GApOjByD,CAAW1S,IAtc5B,SAAsBA,OAGhBwN,GAAS,KACA,MAATxN,GAA0C,mBAAlBA,EAAMkR,aAE9B1D,KAAYxN,EAAQ,IACpB,MAAOlD,WAEJ0Q,EA6b6BmF,CAAa3S,GAAUqR,GAAanC,IACzDlQ,KAuIjB,SAAkBwT,MACJ,MAARA,EAAc,YAEPvB,GAAaM,KAAKiB,GACzB,MAAO1V,eAEC0V,EAAO,GACf,MAAO1V,WAEJ,GAhJa8V,CAAS5S,IA4H/B,IAAkBwS,EAjalBZ,GAAKlB,UAAUoB,MAnEf,gBACOK,SAAWR,GAAeA,GAAa,MAAQ,IAmEtDC,GAAKlB,UAAL,OAtDA,SAAoBL,UACXtQ,KAAK8N,IAAIwC,WAAetQ,KAAKoS,SAAS9B,IAsD/CuB,GAAKlB,UAAU7E,IA1Cf,SAAiBwE,OACXwC,EAAO9S,KAAKoS,YACZR,GAAc,KACZnE,EAASqF,EAAKxC,SApRD,8BAqRV7C,OAA4BsF,EAAYtF,SAE1C2D,GAAeI,KAAKsB,EAAMxC,GAAOwC,EAAKxC,QAAOyC,GAqCtDlB,GAAKlB,UAAU7C,IAzBf,SAAiBwC,OACXwC,EAAO9S,KAAKoS,gBACTR,QAA6BmB,IAAdD,EAAKxC,GAAqBc,GAAeI,KAAKsB,EAAMxC,IAwB5EuB,GAAKlB,UAAU3E,IAXf,SAAiBsE,EAAKrQ,UACTD,KAAKoS,SACX9B,GAAQsB,SAA0BmB,IAAV9S,EApTV,4BAoTkDA,EAC9DD,MAoHTgS,GAAUrB,UAAUoB,MAjFpB,gBACOK,SAAW,IAiFlBJ,GAAUrB,UAAV,OArEA,SAAyBL,OACnBwC,EAAO9S,KAAKoS,SACZrQ,EAAQsQ,GAAaS,EAAMxC,WAE3BvO,EAAQ,KAIRA,GADY+Q,EAAK9P,OAAS,EAE5B8P,EAAKE,MAELvB,GAAOD,KAAKsB,EAAM/Q,EAAO,IAEpB,IAyDTiQ,GAAUrB,UAAU7E,IA7CpB,SAAsBwE,OAChBwC,EAAO9S,KAAKoS,SACZrQ,EAAQsQ,GAAaS,EAAMxC,UAExBvO,EAAQ,OAAIgR,EAAYD,EAAK/Q,GAAO,IA0C7CiQ,GAAUrB,UAAU7C,IA9BpB,SAAsBwC,UACb+B,GAAarS,KAAKoS,SAAU9B,IAAQ,GA8B7C0B,GAAUrB,UAAU3E,IAjBpB,SAAsBsE,EAAKrQ,OACrB6S,EAAO9S,KAAKoS,SACZrQ,EAAQsQ,GAAaS,EAAMxC,UAE3BvO,EAAQ,EACV+Q,EAAKhP,KAAK,CAACwM,EAAKrQ,IAEhB6S,EAAK/Q,GAAO,GAAK9B,EAEZD,MAkGTiS,GAAStB,UAAUoB,MA/DnB,gBACOK,SAAW,MACN,IAAIP,OACL,IAAKH,IAAOM,WACT,IAAIH,KA4DlBI,GAAStB,UAAT,OA/CA,SAAwBL,UACf2C,GAAWjT,KAAMsQ,GAAjB,OAAgCA,IA+CzC2B,GAAStB,UAAU7E,IAnCnB,SAAqBwE,UACZ2C,GAAWjT,KAAMsQ,GAAKxE,IAAIwE,IAmCnC2B,GAAStB,UAAU7C,IAvBnB,SAAqBwC,UACZ2C,GAAWjT,KAAMsQ,GAAKxC,IAAIwC,IAuBnC2B,GAAStB,UAAU3E,IAVnB,SAAqBsE,EAAKrQ,UACxBgT,GAAWjT,KAAMsQ,GAAKtE,IAAIsE,EAAKrQ,GACxBD,MAyDTkS,GAASvB,UAAU5E,IAAMmG,GAASvB,UAAU7M,KAnB5C,SAAqB7D,eACdmS,SAASpG,IAAI/L,EA1iBC,6BA2iBZD,MAkBTkS,GAASvB,UAAU7C,IANnB,SAAqB7N,UACZD,KAAKoS,SAAStE,IAAI7N,IA6G3B,IAAIiT,GAAczK,IAAQ,EAAI8H,GAAW,IAAI9H,GAAI,GAAG,KAAK,IAlqB1C,EAAA,EAkqBoE,SAAS0J,UACnF,IAAI1J,GAAI0J,IAwMjB,aA7LA,SAASc,GAAW/U,EAAKoS,OA2BNrQ,EACbkT,EA3BAL,EAAO5U,EAAIkU,gBA4BC,WADZe,SADalT,EAzBAqQ,KA2BmB,UAAR6C,GAA4B,UAARA,GAA4B,WAARA,EACrD,cAAVlT,EACU,OAAVA,GA5BD6S,EAAmB,iBAAPxC,EAAkB,SAAW,QACzCwC,EAAK5U,IAWX,SAASyT,GAAUyB,EAAQ9C,OACrBrQ,EArjBN,SAAkBmT,EAAQ9C,UACP,MAAV8C,OAAiBL,EAAYK,EAAO9C,GAojB/B+C,CAASD,EAAQ9C,UACtBiC,GAAatS,GAASA,OAAQ8S,EA2JvC,SAASP,GAASvS,OACZkT,SAAclT,UACTA,IAAkB,UAARkT,GAA4B,YAARA,GAmBzCG,ICv3BgCC,MDuwBhC,SAAc5D,UACJA,GAASA,EAAM3M,OAzJzB,SAAkB2M,EAAO6D,EAAUrD,OAC7BpO,GAAS,EACT/C,EAAW0Q,GACX1M,EAAS2M,EAAM3M,OACfyQ,GAAW,EACXhG,EAAS,GACTiG,EAAOjG,KAEP0C,EACFsD,GAAW,EACXzU,EAAWkR,QAER,GAAIlN,GAznBY,IAynBgB,KAC/BgJ,EAAMwH,EAAW,KAAON,GAAUvD,MAClC3D,SACKuE,GAAWvE,GAEpByH,GAAW,EACXzU,EAAWoR,GACXsD,EAAO,IAAIxB,QAGXwB,EAAOF,EAAW,GAAK/F,EAEzBkG,EACA,OAAS5R,EAAQiB,GAAQ,KACnB/C,EAAQ0P,EAAM5N,GACd6R,EAAWJ,EAAWA,EAASvT,GAASA,KAE5CA,EAASkQ,GAAwB,IAAVlQ,EAAeA,EAAQ,EAC1CwT,GAAYG,GAAaA,EAAU,SACjCC,EAAYH,EAAK1Q,OACd6Q,QACDH,EAAKG,KAAeD,WACbD,EAGTH,GACFE,EAAK5P,KAAK8P,GAEZnG,EAAO3J,KAAK7D,QAEJjB,EAAS0U,EAAME,EAAUzD,KAC7BuD,IAASjG,GACXiG,EAAK5P,KAAK8P,GAEZnG,EAAO3J,KAAK7D,WAGTwN,EAyGHqG,CAASnE,GACT,wBEhxBNvR,OAAO2B,iBAAwB,aAAc,CAC3CE,OAAO,IAET6M,SAAiBA,YAAoBA,oBAAuBiG,EAC5DjG,sBAgCA,eACMiH,EAAcC,IACd5Q,EAAU2Q,EAAY3Q,QACtB6Q,EAAaF,EAAYE,WACzBxV,EAAUsV,EAAYtV,eAE1BA,EAAQyV,QApBU,KAqBX,EAAIC,UAAeC,WAAWhR,EAAS6Q,EAAYxV,GAASiF,OAAOyN,WAAWxS,MAAM,OAtC7FmO,2BAyCA,kBACS,IAAIrM,SAAQ,SAAUC,EAASC,OAChC0T,EAAeL,IACf5Q,EAAUiR,EAAajR,QACvB6Q,EAAaI,EAAaJ,WAC1BxV,EAAU4V,EAAa5V,QAEvB6V,GAAe,EAAIH,UAAehR,OAAOC,EAAS6Q,EAAYxV,GAC9DiF,EAAS,GACT6Q,EAAQC,YAAW,WACrBF,EAAa3P,OACbhE,EAAO,IAAIhD,MAAM,kCAnCH,KAqChB2W,EAAa5Q,OAAOE,GAAG,QAAQ,SAAUC,GACvCH,EAAOI,KAAKD,MAEdyQ,EAAa1Q,GAAG,SAAS,WACvB6Q,aAAaF,GACb7T,EAAQgD,EAAOrE,KAAK,IAAIV,MAAM,UAEhC2V,EAAa1Q,GAAG,SAAS,SAAUzF,GACjCwC,EAAOxC,UA7Db2O,QAkEA,SAAe4H,OACTC,EAAc,GACdC,GAA4B,EAC5BC,GAAoB,EACpBC,OAAiB/B,UAGd,IAAmDgC,EAA/CC,EAAYN,EAAexU,OAAOC,cAAsByU,GAA6BG,EAAQC,EAAU7T,QAAQG,MAAOsT,GAA4B,EAAM,KAC3J/Q,EAAQkR,EAAM9U,MAEd8B,EAAQ8B,EAAMoR,QAAQ,SACX,IAAXlT,EAAc,KACZuO,EAAMzM,EAAMqR,MAAM,EAAGnT,GACrB9B,EAAQ4D,EAAMqR,MAAMnT,EAAQ,GAChC4S,EAAYrE,GAAOrQ,IAGvB,MAAOmK,GACPyK,GAAoB,EACpBC,EAAiB1K,eAGVwK,GAA6BI,EAAUG,QAC1CH,EAAUG,oBAGRN,QACIC,UAKLH,GAjGT7H,aAoGA,SAAoB6H,OACdtX,EAAOiJ,QAAQC,IAAI6O,KAAO9O,QAAQC,IAAI6O,KAAKzW,MAAM,KAAO,MACxDgW,EAAYS,KAAM,KAChBC,GAA6B,EAC7BC,GAAqB,EACrBC,OAAkBxC,UAGf,IAAiEyC,EAA7DC,EAAad,EAAYS,KAAKzW,MAAM,KAAKuB,OAAOC,cAAuBkV,GAA8BG,EAASC,EAAWtU,QAAQG,MAAO+T,GAA6B,EAAM,KAC9KxR,EAAQ2R,EAAOvV,MAEf4D,IAAkC,IAAzBxG,EAAK4X,QAAQpR,IACxBxG,EAAKyG,KAAKD,IAGd,MAAOuG,GACPkL,GAAqB,EACrBC,EAAkBnL,eAGXiL,GAA8BI,EAAWN,QAC5CM,EAAWN,oBAGTG,QACIC,QAKVG,GAA6B,EAC7BC,GAAqB,EACrBC,OAAkB7C,UAGf,IAAmD8C,EAA/CC,EAAaC,EAAc7V,OAAOC,cAAuBuV,GAA8BG,EAASC,EAAW3U,QAAQG,MAAOoU,GAA6B,EAAM,KAChK7M,EAAQgN,EAAO5V,OAEU,IAAzB5C,EAAK4X,QAAQpM,KACfxL,EAAO,CAACwL,GAAOxE,OAAOhH,KAG1B,MAAO+M,GACPuL,GAAqB,EACrBC,EAAkBxL,eAGXsL,GAA8BI,EAAWX,QAC5CW,EAAWX,oBAGTQ,QACIC,GAKPjB,EAAYqB,OACX1P,QAAQC,IAAIyP,KACdrB,EAAYqB,KAAO1P,QAAQC,IAAIyP,KACtBrB,EAAYsB,OACrBtB,EAAYqB,KAAOE,EAAOvU,QAAQwU,SAASxB,EAAYsB,eAI3DtB,EAAYS,MAAO,EAAIgB,EAASzU,SAAStE,GAAMgC,KAAK,KACpDsV,EAAY0B,IAAM/P,QAAQgQ,MAC1B3B,EAAY4B,OAAS5B,EAAY0B,IAC1B1B,GAvKT7H,aAAqBkH,EAIrB,IAAIkC,EAASM,EAAuBC,WAIhCL,EAAWI,EAAuBE,IAItC,SAASF,EAAuBjD,UAAcA,GAAOA,EAAIoD,WAAapD,EAAM,CAAE5R,QAAS4R,GAEvF,IAEIwC,EAAgB,CAAC,OAAQ,QAAS,WAAY,YAAa,iBAAkB,mBA0JjF,SAAS/B,QAEH4C,EAAW,yFACXC,EAAW,cAAgBD,EAAhB,kBAAoDA,EAApD,4PAsBXE,EAAkB,UAAaD,EAAW,UAC1CzT,EAAUkD,QAAQC,IAAIwQ,OAAS,KAE/B9C,EAAa,CAAC,KAAM6C,GAEpBjJ,EAAQqI,EAAOvU,QAAQwU,SAAS/S,SACtB,SAAVyK,EACFoG,EAAa,CAAC,KAAM,2CAA6C4C,GAC9C,QAAVhJ,EACToG,EAAa,CAAC,KAAM,mBAAqB4C,GACtB,SAAVhJ,EACToG,EAAa,CAAC,KAAM,qCAAuC6C,GACxC,OAAVjJ,GAA4B,QAAVA,IAC3BoG,EAAa,CAAC,KAAM4C,IAGf,CAAEzT,QAASA,EAAS6Q,WAAYA,EAAYxV,QAdrC,CAAE0F,SAAU,SApLT2I,eAAuB,CAAC,MAAO,OAAQ,QAC1CA,YAAoB,iCACvBA,SAAiB1O,OAAOC,QAAU,SAAU2Y,EAAQC,OAC1D,IAAI3G,KAAO2G,GACV,IAAG7F,eAAeI,KAAKyF,EAAQ3G,KACjC0G,EAAO1G,GAAO2G,EAAO3G,WAGlB0G,MD/BLd,IAI4B3C,GAJIkD,YAIiBlD,GAAIoD,WAAapD,GAAM,CAAE5R,QAAS4R,IAEvFD,OAAiB,cACU,UAArBhN,QAAQ4Q,WAAyB5Q,QAAQC,IAAIwQ,aACxC,EAAII,GAAS9Y,QAAQ,GAAIiI,QAAQC,QAEtC8I,EAAO8H,GAASC,kBACX,EAAID,GAAS9Y,QAAQ,GAAIgR,EAAO8H,GAASC,gBAE9CC,EAAYnB,GAAOvU,QAAQwU,SAAS7P,QAAQC,IAAIwQ,WACF,IAA9CI,GAASG,aAAarC,QAAQoC,UACzB,EAAIF,GAAS9Y,QAAQ,GAAIiI,QAAQC,aAGpCoO,GAAc,EAAIwC,GAASI,aAAY,EAAIJ,GAASvR,QAAO,EAAIuR,GAASK,gCAC5EnI,EAAO8H,GAASC,WAAazC,EACtBA,EACP,MAAOxW,UACPyK,QAAQzK,MAAM,mDAAoDA,IAC3D,EAAIgZ,GAAS9Y,QAAQ,GAAIiI,QAAQC,gBAIrB,kBACd,IAAI9F,SAAQ,SAAUC,MACF,UAArB4F,QAAQ4Q,UAAyB5Q,QAAQC,IAAIwQ,MAE1C,GAAI1H,EAAO8H,GAASC,WACzB1W,GAAQ,EAAIyW,GAAS9Y,QAAQ,GAAIgR,EAAO8H,GAASC,iBAC5C,KACDC,EAAYnB,GAAOvU,QAAQwU,SAAS7P,QAAQC,IAAIwQ,QACF,IAA9CI,GAASG,aAAarC,QAAQoC,GAChC3W,GAAQ,EAAIyW,GAAS9Y,QAAQ,GAAIiI,QAAQC,MAEzC7F,GAAQ,EAAIyW,GAASM,4BAA4BlW,KAAK4V,GAASvR,OAAOrE,KAAK4V,GAASI,YAAYhW,MAAK,SAAUoT,UAC7GtF,EAAO8H,GAASC,WAAazC,EACtBA,WAVXjU,GAAQ,EAAIyW,GAAS9Y,QAAQ,GAAIiI,QAAQC,SAc1CsE,OAAM,SAAU1M,UACjByK,QAAQzK,MAAM,mDAAoDA,IAC3D,EAAIgZ,GAAS9Y,QAAQ,GAAIiI,QAAQC,SEhD5C,IAAImR,GAAgBxX,OAAO,iBAsD3BoT,OApDA,SAAiBqE,OACXlZ,EAAUmZ,UAAU5U,QAAU,QAAsB+P,IAAjB6E,UAAU,GAAmB,GAAKA,UAAU,YAE1EC,QACF,IAAIC,EAAOF,UAAU5U,OAAQiR,EAAanW,MAAMga,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IACjF9D,EAAW8D,GAAQH,UAAUG,OAG3BC,EAAWrS,KAAKsS,UAAUhE,GAC1BiE,EAAmBjE,EAAWjR,UAE9BgV,KAAYH,EAASM,YAAcN,EAASM,WAAWH,KAAcN,GAAe,KAClFU,EAASP,EAASM,WAAWH,UAC7BvZ,EAAQoD,OAAWuW,GAAsC,YAA5BA,EAAOxa,YAAYkC,KAG7CsY,EAFE3X,QAAQC,QAAQ0X,OAKvBnY,OAAQ,KAEVA,EADuB,IAArBiY,EACMP,EAASnG,KAAKxR,KAAMiU,EAAW,IACT,IAArBiE,EACDP,EAASnG,KAAKxR,KAAMiU,EAAW,GAAIA,EAAW,IACxB,IAArBiE,EACDP,EAASnG,KAAKxR,KAAMiU,EAAW,GAAIA,EAAW,GAAIA,EAAW,IACvC,IAArBiE,EACDP,EAASnG,KAAKxR,KAAMiU,EAAW,GAAIA,EAAW,GAAIA,EAAW,GAAIA,EAAW,IAE5E0D,EAASU,MAAMrY,KAAMiU,GAG/B4D,EAASM,WAAWH,GAAY/X,EAC5BxB,EAAQoD,MAAO,KACZ5B,GAAoC,YAA3BA,EAAMrC,YAAYkC,WACxB,IAAInC,MAAM,uEAEXsC,EAAMsB,MAAK,SAAU+W,UAC1BT,EAASM,WAAWH,GAAYM,EACzBA,KACN,SAAUna,SACX0Z,EAASM,WAAWH,GAAYN,GAC1BvZ,YAGH8B,SAET4X,EAASM,WAAa,GAEfN,GChDT,SAASU,GAAUZ,OACba,EAAaZ,UAAU5U,QAAU,QAAsB+P,IAAjB6E,UAAU,IAA0BA,UAAU,UAEjF,mBACDa,EAAQzY,KAEH8X,EAAOF,UAAU5U,OAAQiR,EAAanW,MAAMga,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IACjF9D,EAAW8D,GAAQH,UAAUG,OAG3BxU,EAAU,IAAI9C,SAAQ,SAAUC,EAASC,GAC3CsT,EAAWnQ,MAAK,SAAU3F,EAAO2U,GAC3B3U,EACFwC,EAAOxC,GACFuC,EAAQoS,MAEjB6E,EAASU,MAAMI,EAAOxE,aAEnBuE,IACHjV,EAAUA,EAAQhC,MAAK,SAAUkM,eACN,IAAXA,GAAgCA,KAC7C5C,OAAM,kBACA,MAGJtH,GAiBXuJ,IC5CM4L,GAuGAC,MD3DYJ,MACEA,MAdpB,SAAsBnF,OAChBoF,EAAaZ,UAAU5U,QAAU,QAAsB+P,IAAjB6E,UAAU,IAA0BA,UAAU,GAEpFgB,EAAYxa,OAAOC,OAAO,GAAI+U,OAC7B,IAAI3L,KAAQmR,GACV,IAAGxH,eAAeI,KAAKoH,EAAWnR,IAAoC,mBAApBmR,EAAUnR,KAGjEmR,EAAUnR,EAAO,SAAW8Q,GAAUK,EAAUnR,GAAO+Q,WAElDI,mHE1CTxa,OAAO2B,iBAAwB,aAAc,CAC3CE,OAAO,IAET6M,YAAoBA,YAAeiG,EAEnC,IAiD2B8F,EAhDrBH,EADFI,GAiDuBD,EAhDI,UAAWpT,EAAW3F,WAC7CiZ,EAAQ,GAAG1U,OAAOvE,GAClBkZ,EAASvT,EAAU9G,MAAMuX,EAAOvU,QAAQsX,KAErCD,EAAOhW,QAAQ,KAChBkW,EAAaF,EAAO3Z,KAAK6W,EAAOvU,QAAQsX,KACzB,KAAfC,IACFA,EAAahD,EAAOvU,QAAQjB,QAAQ+E,EAAW,UAE5C,IAAIpE,EAAI,EAAG2B,EAAS+V,EAAM/V,OAAQ3B,EAAI2B,IAAU3B,EAAG,KAClD8X,EAAWJ,EAAM1X,GACjB+X,EAAWlD,EAAOvU,QAAQtC,KAAK6Z,EAAYC,oBAEvC1S,EAAO2S,EAAUC,EAAK1X,QAAQgF,MAC7ByS,EACP,MAAOrT,KAIXiT,EAAOhG,aAGF,MAtBL0F,EAgDkC,eAAkBY,EAAMT,EAAGR,MAAMrY,KAAM4X,kBAAmB,IAAInX,SAAQ,SAAUC,EAASC,YAAmB4Y,EAAKjJ,EAAKkJ,WAAiBC,EAAOH,EAAIhJ,GAAKkJ,GAAUvZ,EAAQwZ,EAAKxZ,MAAS,MAAO9B,eAASwC,EAAOxC,OAAsBsb,EAAKnY,YAAwCb,QAAQC,QAAQT,GAAOsB,MAAK,SAAUtB,UAAgBsZ,EAAK,OAAQtZ,MAAW,SAAUmK,UAAcmP,EAAK,QAASnP,MAApJ1J,EAAQT,UAAiKsZ,EAAK,YAvB9b,SAAuBG,EAAIC,UACzBjB,EAAKL,MAAMrY,KAAM4X,aAMxB1B,EAASM,EAAuBC,WAIhC4C,EAAO7C,EAAuBoD,WAI9BC,EAAcrD,EAAuBsD,IAMzC,SAAStD,EAAuBjD,UAAcA,GAAOA,EAAIoD,WAAapD,EAAM,CAAE5R,QAAS4R,GAIvF,IAAI9M,GAAS,EANO+P,EAAuBuD,IAMZpY,SAAS0X,EAAK1X,QAAQ8E,QA4B1CqG,QAAe,EAAI+M,EAAYlY,UA1B1C,SAAkB8D,EAAW3F,WACvBiZ,EAAQ,GAAG1U,OAAOvE,GAClBkZ,EAASvT,EAAU9G,MAAMuX,EAAOvU,QAAQsX,KAErCD,EAAOhW,QAAQ,KAChBkW,EAAaF,EAAO3Z,KAAK6W,EAAOvU,QAAQsX,KACzB,KAAfC,IACFA,EAAahD,EAAOvU,QAAQjB,QAAQ+E,EAAW,UAE5C,IAAIpE,EAAI,EAAG2B,EAAS+V,EAAM/V,OAAQ3B,EAAI2B,IAAU3B,EAAG,KAClD8X,EAAWJ,EAAM1X,GACjB+X,EAAWlD,EAAOvU,QAAQtC,KAAK6Z,EAAYC,cAG7CE,EAAK1X,QAAQqY,WAAWZ,EAAUC,EAAK1X,QAAQgF,MACxCyS,EACP,MAAOrT,KAIXiT,EAAOhG,aAGF,QAIOlG,aAAoB,EAAI+M,EAAYlY,SAASmX,EAAe,CAAEjX,OAAO,2BCrFrFzD,OAAO2B,iBAAwB,aAAc,CAC3CE,OAAO,IAET6M,aAAqBA,eAAuBA,eAAkBiG,EAE9D,IAwB2B8F,EAvBrBH,EADFuB,GAwBuBpB,EAvBI,gBACvBqB,EAAwBtC,UAAU5U,QAAU,QAAsB+P,IAAjB6E,UAAU,GAAmB,KAAOA,UAAU,GAE/FuC,EAAmBD,SAClBC,IACHA,EAAmB7T,QAAQgQ,cAEf,EAAIa,GAASiD,WAAWD,EAAkBjE,EAAOvU,QAAQtC,KAAK,eAAgB,WAAa,IAPvGqZ,EAuBkC,eAAkBY,EAAMT,EAAGR,MAAMrY,KAAM4X,kBAAmB,IAAInX,SAAQ,SAAUC,EAASC,YAAmB4Y,EAAKjJ,EAAKkJ,WAAiBC,EAAOH,EAAIhJ,GAAKkJ,GAAUvZ,EAAQwZ,EAAKxZ,MAAS,MAAO9B,eAASwC,EAAOxC,OAAsBsb,EAAKnY,YAAwCb,QAAQC,QAAQT,GAAOsB,MAAK,SAAUtB,UAAgBsZ,EAAK,OAAQtZ,MAAW,SAAUmK,UAAcmP,EAAK,QAASnP,MAApJ1J,EAAQT,UAAiKsZ,EAAK,YAb9b,SAAsBI,UACpBjB,EAAKL,MAAMrY,KAAM4X,aAMxB1B,EAIJ,SAAgC3C,UAAcA,GAAOA,EAAIoD,WAAapD,EAAM,CAAE5R,QAAS4R,GAJ1EiD,CAAuBC,WAQpC,SAAS4D,QACHH,EAAwBtC,UAAU5U,QAAU,QAAsB+P,IAAjB6E,UAAU,GAAmB,KAAOA,UAAU,GAE/FuC,EAAmBD,SAClBC,IACHA,EAAmB7T,QAAQgQ,QAEtB,EAAIa,GAASvK,MAAMuN,EAAkBjE,EAAOvU,QAAQtC,KAAK,eAAgB,UAAY,GAQ9FyN,UAAkBuN,EAClBvN,UAAkBuN,EAClBvN,eAAuBmN,EACvBnN,aARA,WACEqK,GAASvK,KAAKuL,WAAa,GAC3BhB,GAASiD,UAAUjC,WAAa,2BC3ClC/Z,OAAO2B,iBAAwB,aAAc,CAC3CE,OAAO,IAET6M,uBAA0BiG,EAE1B,IA+D2B8F,EA5DrBH,EAHF4B,EAA4B,mBAAXpa,QAAoD,iBAApBA,OAAOC,SAAwB,SAAUoT,iBAAqBA,GAAS,SAAUA,UAAcA,GAAyB,mBAAXrT,QAAyBqT,EAAI3V,cAAgBsC,QAAUqT,IAAQrT,OAAOyQ,UAAY,gBAAkB4C,GAEhPzG,mBA6DK+L,EA5DI,UAAWpa,OAClC8b,EAAenc,OAAOC,OAAO,GAAII,EAAS,CAC5C8H,IAAKiU,QAAgB,EAAIC,GAAe5Y,SAAWpD,EAAQ8H,OAEzDmU,OAAU,EACVC,EAAQlc,EAAQkc,SAChBA,IACFD,QAAgB,EAAIE,GAAWX,cAAcU,EAAMlV,YAEjDkV,GAASD,MACN,IAAIpK,KAAOiK,EAAahU,OACvB,GAAG6K,eAAeI,KAAK+I,EAAahU,IAAK+J,IAAgB,SAARA,EAAgB,KAC/DrQ,EAAQsa,EAAahU,IAAI+J,GAC7BiK,EAAahU,IAAI+J,GAAOqK,EAAME,QAAUH,EAAUI,EAAiB7a,EAAQA,EAAQ6a,EAAiBJ,sBAKnGH,EAAarG,QAChBqG,EAAahU,IAAIwU,KACnBR,EAAahU,IAAIwU,QAAKhI,GAEpBzM,QAAQ0U,SAASC,WACnBV,EAAahU,IAAI2U,qBAAuB,IACxCX,EAAahU,IAAI4U,gCAAkC,IACnDZ,EAAahU,IAAI6U,2BAA6B,KAEzCb,GA3BL7B,EA4DkC,eAAkBY,EAAMT,EAAGR,MAAMrY,KAAM4X,kBAAmB,IAAInX,SAAQ,SAAUC,EAASC,YAAmB4Y,EAAKjJ,EAAKkJ,WAAiBC,EAAOH,EAAIhJ,GAAKkJ,GAAUvZ,EAAQwZ,EAAKxZ,MAAS,MAAO9B,eAASwC,EAAOxC,OAAsBsb,EAAKnY,YAAwCb,QAAQC,QAAQT,GAAOsB,MAAK,SAAUtB,GAASsZ,EAAK,OAAQtZ,MAAW,SAAUmK,GAAOmP,EAAK,QAASnP,MAAtI1J,EAAQT,UAAmJsZ,EAAK,YA9Bhb,SAAyBG,UACvBhB,EAAKL,MAAMrY,KAAM4X,aAI5B9K,WA6BA,SAAkBsM,EAAUnF,EAAYoH,OAGlC5c,EAAUL,OAAOC,OADA,GACuBgd,SAExCC,EAAS3Z,SAA6B,iBAAbyX,GAAyBA,EAAU,gCAC5DkC,EAAS3Z,SAAS7D,MAAMC,QAAQkW,GAAa,kCAE7CqH,EAAS3Z,SAA+E,iBAAlD,IAAZlD,EAA0B,YAAc6b,EAAQ7b,KAA0BA,EAAS,6BAC7GA,EAAQ8c,OAAQ,KACdA,EAAS9c,EAAQ8c,UACjBD,EAAS3Z,SAAoB,SAAX4Z,GAAgC,WAAXA,GAAkC,WAAXA,EAAqB,oDAClF9c,EAAQ8c,OAAS,SACpB9c,EAAQyV,WACNoH,EAAS3Z,SAAoC,iBAApBlD,EAAQyV,QAAsB,oCACtDzV,EAAQyV,QAAUrT,EAAAA,EACrBpC,EAAQ8H,OACN+U,EAAS3Z,SAAkC,WAAzB2Y,EAAQ7b,EAAQ8H,KAAmB,iCACpD9H,EAAQ8H,IAAM,GACjB9H,EAAQ+c,SACNF,EAAS3Z,SAAkC,iBAAlBlD,EAAQ+c,OAAsBpX,OAAOqX,SAAShd,EAAQ+c,OAAQ,8CACtF/c,EAAQ+c,MAAQ,UACc,IAA1B/c,EAAQid,iBACbJ,EAAS3Z,SAA0C,kBAA1BlD,EAAQid,cAA6B,2CAC7Djd,EAAQid,eAAgB,OACF,IAAlBjd,EAAQkc,WACbW,EAAS3Z,SAAoC,WAA3B2Y,EAAQ7b,EAAQkc,OAAqB,sCACvDW,EAAS3Z,SAA4C,iBAA5BlD,EAAQkc,MAAMlV,UAAwB,iDAC9B,IAA1BhH,EAAQkc,MAAME,WACnBS,EAAS3Z,SAA0C,kBAA1BlD,EAAQkc,MAAME,QAAuB,2CAC7Dpc,EAAQkc,MAAME,SAAU,QAEO,IAA7Bpc,EAAQkd,oBACbL,EAAS3Z,SAA6C,kBAA7BlD,EAAQkd,iBAAgC,kDAChEld,EAAQkd,kBAAmB,OACI,IAA3Bld,EAAQmd,kBACbN,EAAS3Z,SAA2C,kBAA3BlD,EAAQmd,eAA8B,4CAC9Dnd,EAAQmd,gBAAiB,SAEzBnd,GAnETqO,YAAoB+O,EACpB/O,WAAmB0N,EACnB1N,SAoGA,SAAgBrF,SACP,IAAMnI,OAAOmI,GAAMlJ,QAAQ,KAAM,OAAS,KApGnDuO,4BAuGA,SAAmCsM,EAAU3a,OACvCqd,EAAe5F,EAAOvU,QAAQwU,SAASiD,SACf,UAArB9S,QAAQ4Q,WAAyBzY,EAAQoP,OAA0B,YAAjBiO,GAA+C,QAAjBA,GAxGzFhP,iBA2GA,SAAwBsM,EAAUnF,OAC5B9V,EAAQ,IAAIR,MAAM,SAAWyb,EAAW,kBAC5Cjb,EAAM8F,KAAO,SACb9F,EAAM4d,MAAQ,SACd5d,EAAM6d,QAAU,SAAW5C,EAC3Bjb,EAAMd,KAAO+b,EACbjb,EAAM8d,UAAYhI,EACX9V,GA9GT,IAAI+X,EAASM,EAAuBC,WAIhC6E,EAAW9E,EAAuB0F,WAIlC9F,EAAWI,EAAuBE,IAMtC,SAASF,EAAuBjD,UAAcA,GAAOA,EAAIoD,WAAapD,EAAM,CAAE5R,QAAS4R,GAIvF,IAAIuH,EAAsC,UAArBxU,QAAQ4Q,SAAuB,IAAM,IA4C1D,SAAS2E,EAAU9T,EAAGC,UACb,EAAIoO,EAASzU,SAASoG,EAAEpJ,MAAM,KAAK0F,OAAO2D,EAAErJ,MAAM,MAAMT,KAAI,SAAUmD,UACpEA,EAAEnC,UACRN,QAAO,SAAUyC,UACXA,MACLhC,KAAK,KAGX,SAASmb,EAAS2B,EAAMC,MACG,UAArB9V,QAAQ4Q,gBACH9Y,OAAOC,OAAO8d,EAAMC,OAIzBC,EAAY,CAAEjH,KAAM,QACnB,IAAI9E,KAAO6L,EACY,SAAtB7L,EAAIgM,cAIRD,EAAUjH,KAAOyG,EAAUQ,EAAUjH,KAAM+G,EAAK7L,IAH9C+L,EAAU/L,GAAO6L,EAAK7L,OAKrB,IAAIyH,KAAQqE,EACY,SAAvBrE,EAAKuE,cAITD,EAAUjH,KAAOyG,EAAUQ,EAAUjH,KAAMgH,EAAKrE,IAH9CsE,EAAUtE,GAAQqE,EAAKrE,UAKpBsE,MH/ILxZ,IACE6V,GAAO6D,IAAkB,UAAWC,EAAeC,EAAiBhe,EAASkZ,OAC3E+E,QAAyB,EAAIvF,GAASwF,iBAAiBle,GACvD2a,EAAWoD,EACXvI,EAAawI,EACbG,GAAsB,MAEtB,EAAIzF,GAAS0F,2BAA2BzD,EAAU3a,GAAU,CAC9Die,EAAiBI,0BAA2B,MACxCC,EAAU,CAAC3D,GAEX,KAAKna,KAAKma,KACZ2D,EAAUA,EAAQ7e,IAAIiZ,GAASxU,SAEjCoa,EAAUA,EAAQ1Y,OAAO4P,EAAW/V,IAAIiZ,GAASxU,SACjDyW,EAAW9S,QAAQC,IAAIyW,SAAW,UAClC/I,EAAa,CAAC,KAAM,KAAM,IAAM8I,EAAQ1d,KAAK,KAAO,KACpDud,GAAsB,SAGjB,IAAInc,SAAQ,SAAUC,EAASC,OAChC2C,GAAiB,EAAI6Q,UAAehR,OAAOiW,EAAUnF,EAAYyI,GACjE5J,EAAO,CAAEpP,OAAQ,GAAIC,OAAQ,IAC7BuQ,OAAU,KAEV5Q,EAAeI,QACjBJ,EAAeI,OAAOE,GAAG,QAAQ,SAAUC,GACzCiP,EAAKpP,OAAOI,KAAKD,MAGjBP,EAAeK,QACjBL,EAAeK,OAAOC,GAAG,QAAQ,SAAUC,GACzCiP,EAAKnP,OAAOG,KAAKD,MAGrBP,EAAeM,GAAG,SAAS,SAAUzF,GACnCwC,EAAOxC,MAETmF,EAAeM,GAAG,SAAS,SAAUW,GACnCkQ,aAAaP,OAETxQ,EAASoP,EAAKpP,OAAOrE,KAAK,IAAIH,OAC9ByE,EAASmP,EAAKnP,OAAOtE,KAAK,IAAIH,OAI9B0d,GAAuBjZ,IAAW,IAAO6Y,EAAgB,6FAC3D7b,GAAO,EAAIwW,GAAS8F,gBAAgBT,EAAeC,IAI9B,WAAnBhe,EAAQ8c,OACN5X,GAAUlF,EAAQid,cACpB/a,EAAO,IAAIhD,MAAMgG,IACK,IAAbY,GAAmB9F,EAAQmd,eAIpClb,EAAQgD,IAHRkF,QAAQzK,MAAM,oDAAqDuF,GACnE/C,EAAO,IAAIhD,MAAM,sCAAwC4G,KAI/B,WAAnB9F,EAAQ8c,OACK,IAAlB5X,EAAOX,QAAiBvE,EAAQkd,iBAGlCjb,EAAQiD,GAFRhD,EAAO,IAAIhD,MAAM,wCAA0C4G,IAK7D7D,EAAQ,CAAEgD,OAAQA,EAAQC,OAAQA,EAAQY,SAAUA,OAIpDjB,EAAekY,MAAO,IACpB/c,EAAQ+c,UAERlY,EAAekY,MAAM0B,MAAMze,EAAQ+c,OACnC,MAAOzV,QAGTzC,EAAekY,MAAM2B,MACrB,MAAOpX,KAGPtH,EAAQyV,UAAYrT,EAAAA,IACtBqT,EAAUM,YAAW,WAEnB4I,GAAY9Z,GACZ3C,EAAO,IAAIhD,MAAM,kCAChBc,EAAQyV,UAEbyD,EAASrU,SAIN,SAAcoW,EAAIC,EAAK0D,EAAKC,UAC1B5E,GAAKL,MAAMrY,KAAM4X,aASxBwF,IACEzE,GAAQ4D,IAAkB,UAAWjZ,OACnCsB,EAASgT,UAAU5U,OAAS,QAAsB+P,IAAjB6E,UAAU,GAAmBA,UAAU,GAAK,UAE7E2F,EAAYrH,GAAOvU,QAAQwU,SAAS7S,EAAeia,cAC9B,UAArBjX,QAAQ4Q,UAAsC,aAAdqG,GAA0C,SAAdA,UAM1D9Z,QAAe+Z,GAAU,OAAQ,CAAC,UAAW,QAAS,oBAAsBla,EAAema,IAAM,IAAK,MAAO,aAAc,CAAElC,OAAQ,SAAUrH,QAAS,MAC5JzQ,EAAO9E,MAAM,OAAOC,QAAO,SAAUyC,SAC3B,QAAQpC,KAAKoC,MAEpBnD,KAAI,SAAUmD,UACRqc,SAASrc,EAAG,OAClBzC,QAAO,SAAUyC,UACXA,IAAMiC,EAAema,KAAOpc,EAAI,KACtCmG,SAAQ,SAAUiW,GACnBnX,QAAQ3B,KAAK8Y,EAAK7Y,MAEpB,MAAOzG,SAfPmF,EAAeqB,KAAKC,MAkBjB,SAAqB+Y,UACnBhF,GAAMN,MAAMrY,KAAM4X,aAMzB1B,GAMJ,SAAgC3C,UAAcA,GAAOA,EAAIoD,WAAapD,EAAM,CAAE5R,QAAS4R,GAN1EiD,CAAuBC,WAQpC,SAAS8F,GAAkB1D,UAAa,eAAkBS,EAAMT,EAAGR,MAAMrY,KAAM4X,kBAAmB,IAAInX,SAAQ,SAAUC,EAASC,mBAAmB4Y,EAAKjJ,EAAKkJ,WAAiBC,EAAOH,EAAIhJ,GAAKkJ,GAAUvZ,EAAQwZ,EAAKxZ,MAAS,MAAO9B,eAASwC,EAAOxC,OAAsBsb,EAAKnY,YAAwCb,QAAQC,QAAQT,GAAOsB,MAAK,SAAUtB,GAASsZ,EAAK,OAAQtZ,MAAW,SAAUmK,GAAOmP,EAAK,QAASnP,MAAtI1J,EAAQT,GAAmJsZ,CAAK,YAEzb,SAASiE,GAAUpE,OACbnF,EAAa2D,UAAU5U,OAAS,QAAsB+P,IAAjB6E,UAAU,GAAmBA,UAAU,GAAK,GACjFgG,EAAehG,UAAU5U,OAAS,QAAsB+P,IAAjB6E,UAAU,GAAmBA,UAAU,GAAK,GAEnFnZ,GAAU,EAAI0Y,GAAS0G,UAAUzE,EAAUnF,EAAY2J,GACvDE,EAAa,KACbxa,EAAiB,KACjBC,EAAUV,GAAKuW,EAAUnF,EAAYxV,GAAS,SAAUsf,GACtDD,EAEFV,GAAYW,EAAqBD,GAEjCxa,EAAiBya,YAGrBxa,EAAQoB,KAAO,SAAUqZ,GACnB1a,EAEF8Z,GAAY9Z,EAAgB0a,GAE5BF,EAAaE,GAAmB,WAG7Bza,EAWT+P,OAAiB,CAAEzQ,KAAM2a,GAAWS,SARpC,SAAkB7E,OACZnF,EAAa2D,UAAU5U,OAAS,QAAsB+P,IAAjB6E,UAAU,GAAmBA,UAAU,GAAK,GACjFgG,EAAehG,UAAU5U,OAAS,QAAsB+P,IAAjB6E,UAAU,GAAmBA,UAAU,GAAK,YAEnFT,GAAS0G,UAAUzE,EAAUnF,EAAY2J,GACtCJ,GAAUlX,QAAQ4X,SAAU,CAAC9E,GAAU/U,OAAO4P,GAAa2J,KIjLhEO,GAAiC,UAArB7X,QAAQ4Q,SACpBkH,GAAkBD,GAAY,UAAY,OCa9C,MAAME,GAAK/X,QAAQgY,QAAQ,aAUzBC,IDhBAlhB,GADG8gB,GACI7X,QAAQC,IAAIiY,MAClBlY,QAAQC,IAAIkY,MACXnY,QAAQC,IAAImY,YAAcpY,QAAQC,IAAIoY,QAAU,SAE3CrY,QAAQC,IAAIqY,QAClBtY,QAAQC,IAAIkY,KACZnY,QAAQC,IAAIiY,MACZ,OAGEJ,GAAgBnf,KAAK5B,MACxBA,GAAOA,GAAK6X,MAAM,GAAI,IAGhB7X,ICKNwhB,GAAe,iEAEfC,GAAmB,SAInBC,IAAgBV,GAAGW,SAAWX,GAAGlhB,GAAG6hB,UAAYX,GAAGY,QAAUZ,GAAGlhB,GAAG8hB,SAAWZ,GAAGa,QAAUb,GAAGlhB,GAAG+hB,QAEjGC,GAAQd,GAAGc,OAASd,GAAGphB,GAAG8e,MAAMoD,MAChCC,GAASf,GAAGe,QAAUf,GAAGphB,GAAG8e,MAAMqD,OAMlCC,GAAiB,GDtCF,IACZhiB,GCwCHiiB,IAAmB,EACnBC,IAAqB,EAUvB,SAASC,GAAaC,OAElBxf,EAAQ,GACRyf,EAAM,SAINA,EAAMC,UAAOC,YAAYH,GACzB,MAAO1iB,GACP2iB,EAAMC,UAAOE,kBAAkBJ,OAG5B,IAAIpe,EAAI,EAAGA,EAAIoe,EAASpe,IAC3BpB,EAAM6D,KAAK+a,GAAaa,EAAIre,GAAKwd,GAAa7b,gBAGzC/C,EAAMZ,KAAK,IAUpB,SAASygB,GAAavM,eACE,IAARA,EAahB,SAASwM,GAAgBthB,EAASkZ,SACV,mBAAXlZ,EACF,CAACkZ,GAAY,GAAIlZ,GAGtBqhB,GAAarhB,GACR,CAAC,GAAIkZ,GAGP,CAAClZ,EAASkZ,GAUnB,SAASqI,GAAiBC,MACpBA,EAAKngB,YACAzC,UAAKgC,KAAK4gB,EAAKC,KAAO3B,GAAQ0B,EAAKngB,SAIxCmgB,EAAKE,gBACAF,EAAKE,SAAS5hB,QAAQugB,GAAkBU,GAAa,UAIxD1f,EAAO,CACXmgB,EAAKG,QAAU,OACf9Z,QAAQmX,IACR+B,GAAa,IACbS,EAAKI,SAAW,IAChBhhB,KAAK,WAEAhC,UAAKgC,KAAK4gB,EAAKC,KAAO3B,GAAQze,GASvC,SAASwgB,GAAQ7hB,EAASkZ,OAEtBtU,EAAO0c,GAAgBthB,EAASkZ,GAChCsI,EAAO5c,EAAK,GACZkd,EAAKld,EAAK,GACVmd,EAAQP,EAAKngB,KAAO,EAAImgB,EAAKO,OApHf,SAsHZlY,MAAMkY,IAAUA,EAAQ,EACnBD,EAAG,IAAI5iB,MAAM,kBAElBsiB,EAAKE,WAAaF,EAAKE,SAASphB,MAAM+f,IACjCyB,EAAG,IAAI5iB,MAAM,4CAEZ8iB,UACF3gB,EAAOkgB,GAAiBC,GAG9B9iB,UAAGgK,KAAKrH,GAAM,SAAUsK,OACjBA,SACCoW,KAAU,EAAUC,IAEjBF,EAAG,IAAI5iB,MAAM,0DAA4DmC,IAGlFygB,EAAG,KAAMzgB,SAYf,SAAS4gB,GAAYjiB,OAGjBwhB,EADOF,GAAgBthB,GACX,GACZ+hB,EAAQP,EAAKngB,KAAO,EAAImgB,EAAKO,OAvJf,KAyJZlY,MAAMkY,IAAUA,EAAQ,EAC1B,MAAM,IAAI7iB,MAAM,oBAEdsiB,EAAKE,WAAaF,EAAKE,SAASphB,MAAM+f,IACxC,MAAM,IAAInhB,MAAM,+BAEf,OACKmC,EAAOkgB,GAAiBC,OAE5B9iB,UAAGwjB,SAAS7gB,GACZ,MAAO/C,UACA+C,SAEF0gB,KAAU,SAEb,IAAI7iB,MAAM,0DAuFlB,SAASijB,GAAoBpR,SACrBqR,EAAO,CAACrR,KAEX,SAEC0Q,EAAMW,EAAK7N,MACX8N,GAAW,EACXC,EAAQ5jB,UAAG6jB,YAAYd,GAEhB7e,EAAI,EAAG2B,EAAS+d,EAAM/d,OAAQ3B,EAAI2B,EAAQ3B,IAAK,KAEpD4f,EAAO5jB,UAAKgC,KAAK6gB,EAAKa,EAAM1f,IACrBlE,UAAG+jB,UAAUD,GAEb7Z,eACF0Z,IACHA,GAAW,EACXD,EAAK/c,KAAKoc,IAEZW,EAAK/c,KAAKmd,IAEV9jB,UAAGgkB,WAAWF,GAIbH,GACH3jB,UAAGikB,UAAUlB,SAEQ,IAAhBW,EAAK7d,QA0DhB,SAASqe,GAA8BvhB,EAAMwhB,EAAIrB,SACzCsB,EAAiBC,IAAuB,SAAyBC,OAE/D,GAAKA,EAAO,IACdtkB,UAAGukB,UAAUD,EAAO,IAGxB,MAAO1kB,QAgGMoB,EA5FEpB,EA6FV4kB,GAAgBxjB,GAAQghB,GAAO,UA7FdyC,GAAS7kB,UAErBA,EA0Fd,IAAiBoB,MAtFXhB,UAAGgkB,WAAWM,EAAO,IAEvB,MAAO1kB,OACA6kB,GAAS7kB,SAENA,KAGT,CAACukB,EAAIxhB,WAEHmgB,EAAK4B,MACRxC,GAAeyC,QAAQP,GAGlBA,EAWT,SAASQ,GAA6BjiB,EAAMmgB,SAEpCsB,EAAiBC,GADAvB,EAAK+B,cAAgBpB,GAAsBzjB,UAAGikB,UAAUa,KAAK9kB,WACtB2C,UAEzDmgB,EAAK4B,MACRxC,GAAeyC,QAAQP,GAGlBA,EAWT,SAASC,GAAuBU,EAAgB1I,OAC1C2I,GAAS,SAEN,SAASC,EAAiBjhB,OAC1BghB,EAAQ,OACLpgB,EAAQsd,GAAepK,QAAQmN,GACjCrgB,GAAS,GACXsd,GAAe5N,OAAO1P,EAAO,GAG/BogB,GAAS,EACTD,EAAe1I,GAGbrY,GAAMA,EAAK,OASnB,SAASkhB,SACH9C,IAAuBD,QAMpBD,GAAerc,YAElBqc,GAAe,GAAG7N,KAAK,MACvB,MAAOzU,KAgBb,SAAS6kB,GAASzjB,UACTwjB,GAAgBxjB,GAAQihB,GAAQ,UAuBzC,SAASuC,GAAgBxjB,EAAO8F,EAAM8X,UAC7B5d,EAAM8F,MAAQA,GAAQ9F,EAAM8F,MAAQ8X,EAY7C,MAAM1W,GAAUiB,QAAQ0U,SAASsH,KAAK3jB,MAAM,KAAKT,KAAI,SAAU+B,UACtDyd,SAASzd,EAAO,OAGN,IAAfoF,GAAQ,KAAaA,GAAQ,GAAK,GAAoB,IAAfA,GAAQ,IAAYA,GAAQ,GAAK,IAC1EiB,QAAQic,YAAY,qBAAqB,SAAkCnY,SACzEmV,IAAqB,EACrB8C,KAEMjY,KAIV9D,QAAQic,YAAY,QAAQ,SAAete,GACrCA,IAAMsb,IAAqB,GAC/B8C,QAgEF/O,eAAwBiL,OAnRxB,SAAa9f,EAASkZ,OAElBtU,EAAO0c,GAAgBthB,EAASkZ,GAChCsI,EAAO5c,EAAK,GACZkd,EAAKld,EAAK,GAGZid,GAAQL,GAAM,SAAyB7V,EAAKtK,MACtCsK,EAAK,OAAOmW,EAAGnW,GAGnBjN,UAAGqlB,MAAM1iB,EAAMmgB,EAAKwC,MAxSX,KAwS6B,SAAqBrY,MACrDA,EAAK,OAAOmW,EAAGnW,GAEnBmW,EAAG,KAAMzgB,EAAMiiB,GAA6BjiB,EAAMmgB,mBAYxD,SAAiBxhB,OAGbwhB,EADOF,GAAgBthB,GACX,SAERqB,EAAO4gB,GAAYT,UACzB9iB,UAAGulB,UAAU5iB,EAAMmgB,EAAKwC,MA7Tb,KA+TJ,CACL3iB,KAAMA,EACNyhB,eAAgBQ,GAA6BjiB,EAAMmgB,UAvJvD,SAAcxhB,EAASkZ,OAEnBtU,EAAO0c,GAAgBthB,EAASkZ,GAChCsI,EAAO5c,EAAK,GACZkd,EAAKld,EAAK,GAEZ4c,EAAKI,QAAWP,GAAaG,EAAKI,SAAY,OAASJ,EAAKI,QAG5DC,GAAQL,GAAM,SAAyB7V,EAAKtK,MACtCsK,EAAK,OAAOmW,EAAGnW,GAGnBjN,UAAGwlB,KAAK7iB,EAAMif,GAAckB,EAAKwC,MAtLvB,KAsL0C,SAAsBrY,EAAKkX,UACzElX,EAAYmW,EAAGnW,GAEf6V,EAAK2C,kBACAzlB,UAAG0lB,MAAMvB,GAAI,SAA0BlX,MACxCA,EAAK,KAMLjN,UAAGgkB,WAAWrhB,GACd,MAAO/C,GACF6kB,GAAS7kB,KACZqN,EAAMrN,UAGHwjB,EAAGnW,GAEZmW,EAAG,KAAMzgB,OAAMiT,EAAWsO,GAA8BvhB,GAAO,EAAGmgB,OAGlEA,EAAK6C,iBACAvC,EAAG,KAAMzgB,EAAMwhB,EAAID,GAA8BvhB,GAAO,EAAGmgB,SAEpEM,EAAG,KAAMzgB,EAAMwhB,EAAID,GAA8BvhB,EAAMwhB,EAAIrB,oBAYjE,SAAkBxhB,OAGdwhB,EADOF,GAAgBthB,GACX,GAEdwhB,EAAKI,QAAUJ,EAAKI,SAAW,aAEzB0C,EAA4B9C,EAAK2C,mBAAqB3C,EAAK6C,iBAC3DhjB,EAAO4gB,GAAYT,OACrBqB,EAAKnkB,UAAG6lB,SAASljB,EAAMif,GAAckB,EAAKwC,MApOlC,YAqORxC,EAAK2C,oBACPzlB,UAAGukB,UAAUJ,GACbA,OAAKvO,GAGA,CACLjT,KAAMA,EACNwhB,GAAIA,EACJC,eAAgBF,GAA8BvhB,EAAMijB,GAA6B,EAAIzB,EAAIrB,aA0UpEK,eACII,sBA5F7B,WACEpB,IAAmB,wBClgBrBlhB,OAAO2B,iBAAwB,aAAc,CAC3CE,OAAO,IAET6M,aAAqBA,iBAAoBiG,EAEzC,IAAIuH,EAA4B,mBAAXpa,QAAoD,iBAApBA,OAAOC,SAAwB,SAAUoT,iBAAqBA,GAAS,SAAUA,UAAcA,GAAyB,mBAAXrT,QAAyBqT,EAAI3V,cAAgBsC,QAAUqT,IAAQrT,OAAOyQ,UAAY,gBAAkB4C,GAEtQzG,gBA8BA,SAAuBmW,EAAYC,OAC7BC,EAAkBF,EAAWG,iCAAiCF,GAC9DG,GAPgB9jB,EAOiB8C,KAAKwJ,OAAOC,IAAI,2BAA4B,CAC/EmD,MAAOkU,IANF5jB,EAAOhB,QAAQ,wBAAyB,SAFjD,IAAsBgB,SAUb,IAAIgS,OAAO,iBAAmB8R,EAAoB,OAlC3DvW,mBAqCA,SAA0BsT,UACjB,IAAI3f,SAAQ,SAAUC,EAASC,GACpC2iB,EAAM3hB,QAAQue,IAAI,CAAEE,OAAQA,IAAU,SAAUjiB,EAAOsH,EAAW8d,GAC5DplB,EACFwC,EAAOxC,GACFuC,EAAQ,CAAErD,KAAMoI,EAAW8d,QAASA,WAzCjDzW,aA8CA,SAAoBsM,UACX,IAAI3Y,SAAQ,SAAUC,GAC3B2Y,EAAK1X,QAAQ8E,OAAO2S,EAAUC,EAAK1X,QAAQgF,MAAM,SAAUxI,GACzDuC,EAAkB,OAAVvC,UAhDd2O,eAqDA,SAAsB1J,EAASC,EAAM5E,MACZ,iBAAZ2E,QACH,IAAIzF,MAAM,oCACX,KAAM0F,aAAgBvF,aACrB,IAAIH,MAAM,iCACX,GAA0E,iBAAlD,IAAZc,EAA0B,YAAc6b,EAAQ7b,UAC3D,IAAId,MAAM,qCA1DpBmP,iBA8DA,SAAwB4B,OAClB8U,OAAW,EAGbA,EAFyC,mBAAhCnhB,KAAKohB,UAAUC,aAEbrhB,KAAKohB,UAAUC,aAAahV,GAEF,mBAAnBA,EAAOiV,YAEtBH,QACG,IAAI7lB,MAAM,gCAtEpBmP,eA0EA,SAAsBrH,EAAW3F,MACN,iBAAd2F,QACH,IAAI9H,MAAM,sCACX,GAAoB,iBAATmC,KAAuBA,aAAgBhC,aACjD,IAAIH,MAAM,kCA7EpBmP,WAmFA,SAAkB6K,UACT,SAAUyB,EAAUnF,OACrBxV,EAAUmZ,UAAU5U,OAAS,QAAsB+P,IAAjB6E,UAAU,GAAmBA,UAAU,GAAK,GAE9EgM,GAAS,EACTC,EAAUlM,EAASyB,EAAUnF,EAAY7V,OAAOC,OAAO,CAAE6V,QAAS,KAASzV,IAC3EqlB,EAASD,KAETplB,EAAQslB,UAAW,IACY,iBAAtBtlB,EAAQslB,UAAwB,MAAM,IAAIpmB,MAAM,0CAEvDqmB,EAAWC,EAAWnY,IAAIrN,EAAQslB,WAClCC,GACFA,IAEFC,EAAWjY,IAAIvN,EAAQslB,WAAW,WAChCH,GAAS,EACTC,EAAQlf,UAEVmf,EAASA,EAAOviB,MAAK,SAAUtB,UACzB2jB,EAAe,KACZ3jB,KACN,SAAU9B,MACPylB,EAAQ,OAAO,WACbzlB,YAIH2lB,EAAOjZ,OAAM,SAAU1M,MACT,WAAfA,EAAM8F,KAAmB,KACvBigB,EAAW,IAAIvmB,MAAM,4BAA8BQ,EAAMd,KAAO,iBAAmBc,EAAMd,KAAO,yCAEpG6mB,EAASjgB,KAAO,SACVigB,QAEF/lB,OAlHZ,IAAIkb,EAAO7C,EAAuBoD,WAI9B0J,EAAQ9M,EAAuB2N,IAI/BC,EAAgB5N,EAAuBuD,IAE3C,SAASvD,EAAuBjD,UAAcA,GAAOA,EAAIoD,WAAapD,EAAM,CAAE5R,QAAS4R,GAEvEzG,aAAoB,EAAIsX,EAAcziB,SAAS0X,EAAK1X,QAAQ0iB,WAC3DvX,cAAqB,EAAIsX,EAAcziB,SAAS0X,EAAK1X,QAAQ2iB,QAgE9E,IAAIL,EAAa,IAAIvS,4BChGrB,SAAW6S,OAELlU,EADAmU,EAAiB,iCAGZC,EAAWhZ,OACdpK,EAAGqjB,EAAGC,EAAIC,EAAKC,EAAS/kB,EAAM2H,EAChCjH,EAAS,GACTskB,EAAU,EACVC,EAAY,GACZC,GAAY,MAET3jB,EAAI,EAAGA,EAAIoK,EAAKzI,SAAU3B,KAC7BqjB,EAAIjZ,EAAKpK,GAAsBujB,GAAlBD,EAAKlZ,EAAKpK,EAAI,IAAeoK,EAAKpK,EAAI,GACnD0jB,GAAaL,EACH,OAANA,KACGM,GAAqB,OAARJ,EAiBhBG,GAAaJ,IACXtjB,MAlB4B,KAE9BwjB,EAAUpZ,EAAKwJ,QAAQ,IAAK5T,EAAI,IAClB,QACN,IAAI1D,MAAM,4CAGlB8J,EAAOjH,EADPV,EAAO2L,EAAKvI,UAAU7B,EAAI,EAAGwjB,WAGrB,IAAIlnB,MAAM,gBAAkBmC,EAAO,yCAEvB,iBAAT2H,QACH,IAAI9J,MAAM,0DAA4DmC,EAAO,MAErFuB,EAAIwjB,EACJE,GAAatd,OAKV,GAAIud,EACC,MAANN,IACFM,GAAY,QAET,GAAU,MAANN,EACTM,GAAY,UAGF,MAANN,GAAqB,OAARE,GAAwB,OAARA,GAAwB,OAARA,IAC/CE,IAEY,OAARF,GAAwB,OAARA,GAAc,KAChCC,EAAUpZ,EAAKwJ,QAAQ,IAAK5T,EAAI,IAClB,QACN,IAAI1D,MAAM,kCAElBmC,EAAO2L,EAAKvI,UAAU7B,EAAI,EAAGwjB,IACxBL,EAAevlB,KAAKa,SACjB,IAAInC,MAAM,wBAA0BmC,EAAO,8FAGtCiT,KADbtL,EAAOjH,EAAOV,IAEZU,EAAOV,GAAQglB,EACU,iBAATrd,EAChBjH,EAAOV,GAAQ,CAAC2H,EAAMqd,GAEtBrd,EAAK3D,KAAKghB,GAEZzjB,EAAIwjB,QAKL,CAAErkB,OAAQA,EAAQukB,UAAWA,GAsIpCzR,mBAhGwB2R,EAAQC,MAEV,kBAAXD,GAUW,iBAAXA,IAETC,GAASD,EAAO5V,OAAS,IAAM,KAC5B4V,EAAOE,UAAY,IAAM,KACzBF,EAAOG,WAAa,IAAM,IAC7BH,EAASA,EAAOhO,YAGdwC,EAAOpJ,EAASA,EAAM4U,KAAY5U,EAAM4U,GAAUR,EAAWQ,IAAYR,EAAWQ,GACpFtlB,EAAQ,IAAI4R,OAAOkI,EAAKsL,UAAWG,UAEvCvlB,EAAM0lB,cAAgB5L,EAAKjZ,OA0C3Bb,EAAMkD,KAAO,SAAU4I,OACjB6Z,EAAU/T,OAAOZ,UAAU9N,KAAK2O,KAAKxR,KAAMyL,UAC3C6Z,GACFC,EAAcD,GAETA,GAET3lB,EAAM6lB,WAAa,SAAU/Z,EAAMzJ,OAC7BsjB,EAAUtlB,KAAK6C,KAAK4I,UACnB6Z,EAGEA,EAAQG,OAAOzjB,GAFb,MAKXrC,EAAMpB,QAAU,SAAUkN,EAAMia,MACH,mBAAhBA,SACFja,EAAKlN,QAAQoB,GAAO,eACrB2lB,EAAUxnB,MAAM6S,UAAUuE,MAAM1D,KAAKoG,UAAW,EAAGA,UAAU5U,OAAS,UAC1EuiB,EAAcD,GACPI,EAAYrN,MAAMiN,EAAS1N,kBAGhC+N,WA3HgBla,EAAM4Z,OAC1BhkB,EAAGqjB,EAAGC,EAAI7kB,EAAM+kB,EAASe,EAC3BnY,EAAS,OACNpM,EAAI,EAAGA,EAAIoK,EAAKzI,SAAU3B,KAC7BqjB,EAAIjZ,EAAKpK,GAAIsjB,EAAKlZ,EAAKpK,EAAI,GAC3BoM,GAAUiX,EACA,MAANA,KACS,MAAPC,EACFlX,GAAUkX,IACRtjB,OACG,GAAW,MAAPsjB,EAAY,KACrBE,EAAUpZ,EAAKwJ,QAAQ,IAAK5T,EAAI,IAClB,QACN,IAAI1D,MAAM,mDAICoV,KADnB6S,EAAaP,EADbvlB,EAAO2L,EAAKvI,UAAU7B,EAAI,EAAGwjB,WAGrB,IAAIlnB,MAAM,gBAAkBmC,EAAO,4CAEjB,iBAAf8lB,QACH,IAAIjoB,MAAM,wDAA0DmC,EAAO,MAEnF2N,GAAUmY,EACVvkB,EAAIwjB,SAIHpX,EA+FmBoY,CAAiBH,EAAa1lB,KAAKqlB,sBAClD5Z,EAAKlN,QAAQyB,KAAM2lB,IAGvBhmB,WAnEE4lB,EAAcD,OAyBjBQ,EAAcC,EAxBdvlB,EAASiZ,EAAKjZ,cAKlB8kB,EAAQU,MAAQ,SAAUlmB,EAAMkC,OAC1BikB,EAAUzlB,EAAOV,MACE,iBAAZmmB,SAEFX,EAAQW,GACV,GAAIjkB,SAEFikB,EAAQ/nB,KAAI,SAAUgoB,UAAYZ,EAAQY,MAC5C,GAAID,MAEJ,IAAI5kB,EAAI,EAAGA,EAAI4kB,EAAQjjB,SAAU3B,EAAG,KACnCpB,EAAQqlB,EAAQW,EAAQ5kB,YACd0R,IAAV9S,SACKA,IAOfqlB,EAAQG,OAAS,SAAUzjB,OACrBmkB,EAAKnkB,EAAM+jB,EAAkBD,KAC7BK,SACKA,MAGJ,IAAIrmB,KADTqmB,EAAK,GACY3lB,EACf2lB,EAAGrmB,GAAQwlB,EAAQU,MAAMlmB,EAAMkC,UAE1BA,EAAM+jB,EAAkBI,EAAKL,EAAeK,GAE9Cb,GA1DQ,IAAXL,EACF5U,OAAQ0C,EACE1C,IACVA,EAAQ,KAjHhB,0BCEAjS,OAAO2B,iBAAwB,aAAc,CAC3CE,OAAO,IAET6M,WAAmBA,OAAeA,YAAoBA,kBAA0BA,YAAoBA,iBAAoBiG,EAExH,IAAIuH,EAA4B,mBAAXpa,QAAoD,iBAApBA,OAAOC,SAAwB,SAAUoT,iBAAqBA,GAAS,SAAUA,UAAcA,GAAyB,mBAAXrT,QAAyBqT,EAAI3V,cAAgBsC,QAAUqT,IAAQrT,OAAOyQ,UAAY,gBAAkB4C,GAElQ6G,EAAYtN,YAAoB,eAC9B4L,EAAO6D,GAAkB,UAAW9W,EAAW3F,GACjDsmB,EAAQC,aAAa5gB,EAAW3F,WAC5BiZ,EAAQ,GAAG1U,OAAOvE,GAClBkZ,EAASvT,EAAU9G,MAAM2nB,EAAKrN,KAE3BD,EAAOhW,QAAQ,KAChBkW,EAAaF,EAAO3Z,KAAKinB,EAAKrN,KACf,KAAfC,IACFA,EAAaoN,EAAK5lB,QAAQ+E,EAAW,UAEnCmP,GAA4B,EAC5BC,GAAoB,EACpBC,OAAiB/B,UAGd,IAA0CgC,EAAtCC,EAAY+D,EAAM7Y,OAAOC,cAAsByU,GAA6BG,EAAQC,EAAU7T,QAAQG,MAAOsT,GAA4B,EAAM,KAClJuE,EAAWpE,EAAM9U,MAEjBsmB,EAAYD,EAAKjnB,KAAK6Z,EAAYC,YAK5BiN,EAAQI,WAAWD,UACpBA,GAGX,MAAOnc,GACPyK,GAAoB,EACpBC,EAAiB1K,eAGVwK,GAA6BI,EAAUG,QAC1CH,EAAUG,oBAGRN,QACIC,GAKZkE,EAAOhG,aAGF,eAGF,SAAmB0G,EAAIC,UACrBjB,EAAKL,MAAMrY,KAAM4X,YAlDQ,GAsDd9K,kBAA0B,eAC1C6L,EAAQ4D,GAAkB,UAAW9W,EAAW3F,GAClDsmB,EAAQC,aAAa5gB,EAAW3F,OAC5BiZ,EAAQ,GAAG1U,OAAOvE,GAClBkY,EAAWvS,EAAY,IAAMsT,EAAM1Z,KAAK,KACxConB,EAAiBC,EAAU5a,IAAIkM,MAE/ByO,EAAgB,UACRL,EAAQI,WAAWC,UACpBA,EAETC,EAAUC,OAAO3O,OAEfoB,QAAiBgB,EAAU3U,EAAWsT,UACtCK,GACFsN,EAAU1a,IAAIgM,EAAUoB,GAEnBA,YAGF,SAAyBiE,EAAKC,UAC5B3E,EAAMN,MAAMrY,KAAM4X,YArBmB,GAyBhD,IACMgP,EADFC,EAAY/Z,aACV8Z,EAAQrK,GAAkB,UAAWwE,EAAOpJ,OACzC7Z,MAAMC,QAAQgjB,SACX,IAAIpjB,MAAM,kCACX,GAAwB,mBAAbga,QACV,IAAIha,MAAM,yCAGdmpB,QAAsBV,EAAQW,iBAAiB,gBAC/CC,EAAY,SAEVvmB,QAAQuB,IAAI+e,EAAM7iB,KAAI,SAAU+iB,OAChC9H,EAAW8H,EAAKnhB,KAChBmnB,EAAehG,EAAK3Z,SACpB8R,EAAWkN,EAAKjnB,KAAKynB,EAAczpB,KAAM8b,UAC7C6N,EAAUljB,KAAKsV,GACRgN,EAAQ/B,UAAUjL,EAAU6N,wBAGtBtP,EAASqP,iBAEhBvmB,QAAQuB,IAAIglB,EAAU9oB,KAAI,SAAUkb,UACjCgN,EAAQc,WAAW9N,OAE5B0N,EAAcvD,cAIX,SAAmB4D,EAAKC,UACtBR,EAAMvO,MAAMrY,KAAM4X,aAI7B9K,gBA2BA,SAAuBmW,EAAYpkB,EAAMqP,GACvCkY,EAAQiB,eAAepE,OACnBqE,EAAazoB,GAES,iBAAfyoB,IAA4Blf,OAAOmf,SAASD,IAAeA,EAAa,KACjFA,EAAa,OAGXE,EAASvE,EAAWwE,YACpBC,EAAUF,EAAOG,eAAiB,KAElCL,EAAaI,QACT,IAAI/pB,MAAM,gBAAkB2pB,EAAa,gCAAkCI,EAAU,SAGzFE,EAAgC,iBAAX1Z,GAAuB9F,OAAOmf,SAASrZ,IAAWA,GAAU,EACjF2Z,EAAWL,EAAOM,WAAWR,GAC7BS,EAASF,EAAS7kB,OAClBglB,EAAWJ,EAAc1Z,EAAS,KAClC0Z,EAAa,KACX7oB,EAAQqnB,EAAQ6B,cAAchF,EAAY,CAACqE,EAAYU,IAAWnlB,KAAKglB,EAASK,OAAOha,IACvFnP,IACFgpB,EAASC,EAAWjpB,EAAMgD,MAAQhD,EAAM,GAAGiE,YAExC,KACDmlB,EAAcN,EAAS9oB,MAAM,QAC7BopB,IACFH,EAAWG,EAAY,GAAGnlB,WAG1BglB,EAAWH,EAAS7kB,aAChB,IAAIrF,MAAM,kBAAoBqqB,GAAY,GAAK,+BAAiCH,EAAS7kB,OAAS,cAAgBskB,SAGnH,CAAC,CAACA,EAAYU,GAAW,CAACV,EAAYS,KA5D/Cjb,OAAeF,EACfE,aA8GA,SAAoBrH,EAAW3F,GAC7BsmB,EAAQC,aAAa5gB,EAAW3F,OAC5BiZ,EAAQ,GAAG1U,OAAOvE,GAClBkY,EAAWvS,EAAY,IAAMsT,EAAM1Z,KAAK,KACxConB,EAAiBC,EAAU5a,IAAIkM,MAE/ByO,aAEA2B,EAAGpO,WAAWyM,EAAgB2B,EAAGzhB,MAC1B8f,EACP,MAAO1gB,GACP2gB,EAAUC,OAAO3O,OAGjBoB,EAAWxM,EAAKnH,EAAWsT,GAC3BK,GACFsN,EAAU1a,IAAIgM,EAAUoB,UAEnBA,GA/HTtM,WAkIA,SAAkBqM,EAAU8N,EAActP,MAChB,iBAAbwB,QACH,IAAIxb,MAAM,qCACX,GAA4B,iBAAjBspB,QACV,IAAItpB,MAAM,yCACX,GAAwB,mBAAbga,QACV,IAAIha,MAAM,4CAGXkpB,EAAU,CAAC,CAChB/mB,KAAMqZ,EACN7R,SAAU2f,KACR,SAAUoB,UACL1Q,EAAS0Q,EAAQ,QA9I5Bvb,QAkJA,SAAegG,EAAMnT,OACfie,EAAehG,UAAU5U,OAAS,QAAsB+P,IAAjB6E,UAAU,GAAmBA,UAAU,GAAK,MAEnE,iBAAT9E,QACH,IAAInV,MAAM,iCACX,GAAqB,iBAAVgC,QACV,IAAIhC,MAAM,kCACX,GAAoF,iBAAvD,IAAjBigB,EAA+B,YAActD,EAAQsD,UAChE,IAAIjgB,MAAM,oCAGE,OAAhB2qB,IAEFA,EAAcC,QAIZC,EAAiB,CAAEtD,MAAO,IAC1BzmB,EAAUL,OAAOC,OAAOmqB,EAAgB5K,IACR,IAAhCnf,EAAQymB,MAAMjQ,QAAQ,OACxBxW,EAAQymB,OAAS,SAGfuD,EAAW,GACXC,EAAiB,IAAIJ,EAAY3oB,EAAOlB,EAAQymB,OAChDyD,EAAWD,EAAe7lB,KAAKiQ,QAEf,OAAb6V,GAAmB,KACpB5pB,EAAQ4pB,EAASlD,SACjBtS,EAAOpU,EAAMoU,KACb1H,EAAO1M,EAAMd,QACbgjB,EAAOliB,EAAMkiB,MAAQxiB,EAAQ2a,UAAY,KAEzCwP,EAAY7pB,EAAM6pB,WAAa7pB,EAAMF,MAAQ,EAC7CmpB,EAAWjpB,EAAMipB,UAAYjpB,EAAM8pB,KAAO,EAC1CC,EAAU/pB,EAAM+pB,SAAW/pB,EAAMF,MAAQ,EACzCkpB,EAAShpB,EAAMgpB,QAAUhpB,EAAM8pB,KAAO,EAE1CJ,EAAS3kB,KAAK,CACZqP,KAAMA,EACN1H,KAAMA,EACN2N,SAAU6H,EACV8H,MAAO,CAAC,CAACH,EAAY,EAAIA,EAAY,EAAI,EAAGZ,EAAW,EAAIA,EAAW,EAAI,GAAI,CAACc,EAAU,EAAIA,EAAU,EAAI,EAAGf,EAAS,EAAIA,EAAS,EAAI,MAG1IY,EAAWD,EAAe7lB,KAAKiQ,UAG1B2V,GA9LT,IAAInC,EAAO0C,EAAwBvS,WAI/B2R,EAAKY,EAAwBpP,WAM7BwM,EAAU4C,EAAwB7R,IAEtC,SAAS6R,EAAwBzV,MAAWA,GAAOA,EAAIoD,kBAAqBpD,MAAkB0V,EAAS,MAAe,MAAP1V,MAAoB,IAAIjD,KAAOiD,EAAWnV,OAAOuS,UAAUS,eAAeI,KAAK+B,EAAKjD,KAAM2Y,EAAO3Y,GAAOiD,EAAIjD,WAAU2Y,EAAOtnB,QAAU4R,EAAY0V,EAElQ,SAAS1M,EAAkB1D,UAAa,eAAkBS,EAAMT,EAAGR,MAAMrY,KAAM4X,kBAAmB,IAAInX,SAAQ,SAAUC,EAASC,mBAAmB4Y,EAAKjJ,EAAKkJ,WAAiBC,EAAOH,EAAIhJ,GAAKkJ,GAAUvZ,EAAQwZ,EAAKxZ,MAAS,MAAO9B,eAASwC,EAAOxC,OAAsBsb,EAAKnY,YAAwCb,QAAQC,QAAQT,GAAOsB,MAAK,SAAUtB,GAASsZ,EAAK,OAAQtZ,MAAW,SAAUmK,GAAOmP,EAAK,QAASnP,MAAtI1J,EAAQT,GAAmJsZ,CAAK,YAEzb,IAAI+O,EAAc,KACd5B,EAAY5Z,YAAoB,IAAI4E,IAuCxC,SAAS9E,EAAKnH,EAAW3F,GACvBsmB,EAAQC,aAAa5gB,EAAW3F,WAC5BiZ,EAAQ,GAAG1U,OAAOvE,GAClBkZ,EAASvT,EAAU9G,MAAM2nB,EAAKrN,KAE3BD,EAAOhW,QAAQ,KAChBkW,EAAaF,EAAO3Z,KAAKinB,EAAKrN,KACf,KAAfC,IACFA,EAAaoN,EAAK5lB,QAAQ+E,EAAW,UAEnC4P,GAA6B,EAC7BC,GAAqB,EACrBC,OAAkBxC,UAGf,IAA2CyC,EAAvCC,EAAasD,EAAM7Y,OAAOC,cAAuBkV,GAA8BG,EAASC,EAAWtU,QAAQG,MAAO+T,GAA6B,EAAM,KACxJ8D,EAAW3D,EAAOvV,MAElBipB,EAAa5C,EAAKjnB,KAAK6Z,EAAYC,cAGrCiP,EAAGpO,WAAWkP,EAAYd,EAAGzhB,MACtBuiB,EACP,MAAOnjB,MAIX,MAAOqE,GACPkL,GAAqB,EACrBC,EAAkBnL,eAGXiL,GAA8BI,EAAWN,QAC5CM,EAAWN,oBAGTG,QACIC,GAKZyD,EAAOhG,aAGF,KA4FT,IAAIwK,EAAY4I,EAAQ+C,SAASC,GAAQvmB,MACrCwmB,EAAgBjD,EAAQ+C,SAASC,GAAQnL,UAE7CnR,OAAe0Q,EACf1Q,WAAmBuc,KCtUnB,MAAM9Q,UAACA,IAAagQ,UAGde,GAAmB/Q,GAAUoH,UAAOC,aAEpC2J,GAAoB,qEAAqE5qB,MAAM,IAC/F6qB,GAAoB,aAAa7qB,MAAM,IACvC8qB,GAA4B,sBAAsB9qB,MAAM,IACxD+qB,GAA2B,mGAAmG/qB,MAAM,IACpIgrB,GAAyB,iEAAiEhrB,MAAM,IA+DhGirB,GAAe,MACpB7W,EACA,MACA,SACA,WACA,UACA,kBACA,kBACA,gBAGK8W,GAAkB,CAACC,EAA6BC,IAAwB,EAAE/mB,OAAAA,EAAQmQ,KAAAA,EAAM6W,WAAAA,WACvFhnB,GAAU,GAAKoF,OAAOmf,SAASvkB,UAC9B,IAAIhF,UAAU,kEAGR+U,IAATI,QAAqCJ,IAAfiX,QACnB,IAAIhsB,UAAU,kDAGF+U,IAAfiX,GAAkD,iBAAfA,QAChC,IAAIhsB,UAAU,0CAGhB4rB,GAAa5qB,SAASmU,SACpB,IAAInV,UAAW,iBAAgBmV,aAGzBJ,IAATI,QAAqCJ,IAAfiX,IACzB7W,EAAO,OAGK,QAATA,QAA4BJ,IAATI,QAAqCJ,IAAfiX,SACrCD,EAAoBE,KAAKC,KAAc,GAATlnB,GAAe,MAAOA,MAG/C,WAATmQ,SACI4W,EAAoBE,KAAKC,KAAc,IAATlnB,GAAgB,SAAUA,MAGnD,aAATmQ,SACI2W,EAA4B9mB,EAAQumB,OAG/B,YAATpW,SACI2W,EAA4B9mB,EAAQwmB,OAG/B,oBAATrW,SACI2W,EAA4B9mB,EAAQymB,OAG/B,oBAATtW,SACI2W,EAA4B9mB,EAAQ0mB,OAG/B,iBAATvW,SACI2W,EAA4B9mB,EAAQ2mB,OAGlB,IAAtBK,EAAWhnB,aACR,IAAIhF,UAAU,2EAGjBgsB,EAAWhnB,OAAS,YACjB,IAAIhF,UAAU,2EAGd8rB,EAA4B9mB,EAAQgnB,EAAWrrB,MAAM,MAG7D2U,OAAiBuW,IApImB,CAAC7mB,EAAQgnB,WAEtCG,EAAiBH,EAAWhnB,OAC5BonB,EAAoBH,KAAKI,MAAM,MAAUF,GAAkBA,EAAkB,EAC7EG,EAAgB,EAAIL,KAAKC,KAAK,IAAMlnB,OACtCzD,EAAS,GACTgrB,EAAe,OAEZA,EAAevnB,GAAQ,OACvBwnB,EAAU7K,UAAOC,YAAY0K,OAC/BG,EAAkB,OAEfA,EAAkBH,GAAiBC,EAAevnB,GAAQ,OAC1D0nB,EAAeF,EAAQG,aAAaF,GAC1CA,GAAmB,EACfC,EAAeN,IAInB7qB,GAAUyqB,EAAWU,EAAeP,GACpCI,aAIKhrB,KA8BoB,CAACqrB,EAAYzX,EAAMnQ,IAAW2c,UAAOC,YAAYgL,GAAYzZ,SAASgC,GAAM+B,MAAM,EAAGlS,QA+E1F6mB,IA1GkBhoB,MAAOmB,EAAQgnB,WAEjDG,EAAiBH,EAAWhnB,OAC5BonB,EAAoBH,KAAKI,MAAM,MAAUF,GAAkBA,EAAkB,EAC7EG,EAAgB,EAAIL,KAAKC,KAAK,IAAMlnB,OACtCzD,EAAS,GACTgrB,EAAe,OAEZA,EAAevnB,GAAQ,OACvBwnB,QAAgBlB,GAAiBgB,OACnCG,EAAkB,OAEfA,EAAkBH,GAAiBC,EAAevnB,GAAQ,OAC1D0nB,EAAeF,EAAQG,aAAaF,GAC1CA,GAAmB,EACfC,EAAeN,IAInB7qB,GAAUyqB,EAAWU,EAAeP,GACpCI,aAIKhrB,KAKyBsC,MAAO+oB,EAAYzX,EAAMnQ,WACpCsmB,GAAiBsB,IACxBzZ,SAASgC,GAAM+B,MAAM,EAAGlS,shDClEvC,IAAK,IAAI6nB,MAAczsB,OAAO4S,KAAK8Z,IAAU,KACvCC,GAAMD,GAAQD,IAEbE,GAAI/rB,SAAS,OAChB+rB,IAAO,kBAAoBF,IAEC,IAA1BE,GAAIpsB,MAAM,KAAKqE,SACjB+nB,GAAM,sBAAwBA,GAAM,uCAGtCD,GAAQD,IAAcE,GAkCxBzX,OA/BA,SAAoB0X,MACI,iBAAXA,QACH,IAAIhtB,UAAW,uCAAsCgtB,OAGzDC,EAAYD,EAAOrsB,MAAM,QAEJ,IAArBssB,EAAUjoB,aACL,CACLkoB,OAAO,EACPH,IAAK,iCAAmCC,OAIxCH,EAAaI,EAAU,GACvBE,EAAWF,EAAU,GACrBF,EAAMD,GAAQD,UAEbE,EAOE,CACLG,OAAO,EACPH,IAAKA,EAAIxsB,QAAQ,WAAY4sB,IARtB,CACLD,OAAO,EACPH,IAAK,uFC9BJ,MAAMK,GAAQ,ICHN,MAKbxtB,YAAYytB,QACLC,aAAaD,GAOpBC,aAAaD,QACQtY,IAAf/S,KAAKorB,YACFA,MAAMrZ,aAIRqZ,MAAQ,IAAI1Z,IAAI2Z,GAOvBE,wBACQC,EAAU,OAEX,MAAOR,EAAQS,KAAczrB,KAAKorB,MACjCK,GAAaA,EAAUC,MAAQD,EAAUC,KAAKC,SAChDH,EAAQ1nB,KAAKknB,UAGVQ,EAUTI,WAAWZ,SACHa,EAAQ7rB,KAAKorB,MAAMtf,IAAIkf,UACzBa,GAASA,EAAMH,MAAQG,EAAMH,KAAKI,MAAQD,EAAMH,KAAKI,KAAKf,IAErDc,EAAMH,KAAKI,KAAKf,IAKlBgB,GAAQf,GAAQD,IAOzBiB,kBACShsB,KAAKorB,QDzDhB,IAAIa,GAAS,KAKN,SAASC,KACC,OAAXD,KACFA,GAAS,IAAIE,OAAK5D,QAAQ7nB,QAAQ,iBAGhCurB,GAAOG,UAKXH,GAAOI,MAAM,IAGbJ,GAAOG,SAAU,GAMZ,SAASE,KACC,OAAXL,KACFA,GAAOM,YACPN,GAAS,MASNpqB,eAAe2qB,GAAQ3gB,UACxBogB,KAAWA,GAAO3X,aAAamY,WAIjCH,KAIFJ,KAMArgB,EAAO6gB,QAAUC,GAAmB,CAAE3pB,OAAQ,KAEvC,IAAIvC,SAAQ,CAACC,EAASC,WAIrBisB,EAASX,GAAOroB,GAAI,eAAciI,EAAO6gB,WAAW,EAAGve,IAAAA,EAAK7P,MAAAA,YAE1DH,EAAQ,IAAIR,MAAMwQ,GAExBhQ,EAAMG,MAAQA,EACdsuB,EAAOC,UAEPC,EAAYD,UACZlsB,EAAOxC,MAEH2uB,EAAcb,GAAOroB,GAAGiI,EAAO6gB,SAAU5Z,IAC7C8Z,EAAOC,UACPC,EAAYD,UACZnsB,EAAQoS,UAIRmZ,GAAOc,KAAKlhB,GACZ,MAAO9O,GACP6vB,EAAOC,UACPC,EAAYD,UACZjkB,QAAQzK,MAAMpB,OAKb8E,eAAemrB,WACd/J,EAAa5gB,KAAKohB,UAAUwJ,0BAC9B7T,EACA8T,EACA7qB,KAAKohB,UAAUC,aAAaT,IAC9B7J,EAAW6J,EAAW5I,UACtB6S,EAAejK,EAAWkK,gBAAgBpe,qBAAqBC,mBAG/DoK,EAAW,UACX8T,EAAe,CAAC,kBAEZE,EAAc/qB,KAAK6C,SAASiB,mBAAmB,qBACjDknB,EAGFA,OAFkBta,IAAhBqa,EAEiB,CAAE/nB,QAAS,YAGXkjB,EAAQlpB,OAAK+tB,EAAa,uBAEzCvhB,EAASxJ,KAAKwJ,OAAOC,IAAI,iBACzBwhB,EAAoBrD,KAAKsD,MAAOjnB,QAAQknB,SAAW,KAAQ,IAAM,OACnEC,YAEIC,QAAiBlB,GAAQ,CAC7BrZ,KAAM,QACNtH,OAAAA,EACAuN,SAAAA,IAEFqU,EAAY,CACVE,YAAatrB,KAAKurB,aAClBC,oBAAqBR,EAAiBhoB,QACtCyoB,mBAAoBjiB,EAEpBkiB,cAAexF,EAAQlpB,OAAKquB,EAASrwB,KAAM,iBAAiBgI,QAC5DioB,kBAAAA,EACApW,SAAU5Q,QAAQ4Q,SAClB8W,WAAYN,EAASva,KACrB8a,WAAYP,EAASrwB,KACrB6vB,aAAAA,GAEF,MAAO/uB,GACPkE,KAAK6G,cAAcglB,SAAU,GAAE/vB,YAE1BsvB,EAGF5rB,eAAessB,WACdC,QAAcpB,WACJ,CACb,iBAAgBoB,EAAMT,cACtB,0BAAyBS,EAAMP,sBAC/B,mBAAkBO,EAAML,gBACxB,kCAAiCK,EAAMd,oBACvC,aAAYc,EAAMlX,WAClB,SAAQkX,EAAMJ,2BAA2BI,EAAMH,aAC/C,0BAAyBtoB,KAAKsS,UAAUmW,EAAMlB,aAAc,KAAM,KAClE,gCAA+BvnB,KAAKsS,UAAUmW,EAAMN,mBAAoB,KAAM,MAElEzuB,KAAK,MAYf,SAASgvB,GAAoBpL,EAAYxkB,SACxC6vB,SACJA,EAAW,QADPC,QAEJA,EAAU,GAFNhjB,YAGJA,GACE9M,QACG,CAAC,CACN6vB,SAAAA,EACAC,QAAAA,EACAhjB,YAAAA,EACAijB,SAAU,CACRvN,KAAMgC,EAAW5I,UACjBoU,SAAUC,iBAAczL,MAYvB,SAAS0L,GAAY1L,EAAY9kB,SAChCG,MAAEA,EAAFL,QAASA,GAAYE,SAIpBkwB,GAAoBpL,EAAY,CAAEqL,SAAU,QAASC,QAF3C,+BAA8BtwB,EAAQU,MAAM,MAAM,MAEE4M,YADhD,sCAAqCtN,YAAkBK,YAqDvEuD,eAAe+sB,GAAsBnG,EAAUxF,EAAY4L,UACzDpuB,QAAQuB,IAAIymB,EAASvqB,KAAI2D,OAC9BitB,MAAAA,EAAO7wB,QAAS8wB,EAAiBlwB,KAAAA,EAAMyvB,SAAAA,EAAUtD,OAAAA,EAAQ9c,OAAAA,EAAQ8gB,IAAAA,EAAKC,QAAAA,EAASC,UAAAA,YAEzEjxB,EAAU6wB,EAAQC,EAAgBpwB,MAAM,MAAM,GAAKowB,EACnD3V,EAAW6J,EAAW5I,UACtBpM,EAAagV,EAAWwE,gBAY1B0H,EACAC,EACAC,EAbAC,EAAY,QACZN,EAAK,CAKPM,EAAY,CACVb,SALe,IAAIc,QACnBthB,EAAWuhB,0BAA0BR,EAAIjG,MAAM,IAC/C9a,EAAWuhB,0BAA0BR,EAAIjG,MAAM,KAI/C0G,YAAaT,EAAIvjB,UAMjBikB,GAAkB,QAOhBC,EAAU9wB,EAAO,EACE,iBAAdqwB,GAA6C,iBAAZD,GAC1CS,GAAkB,EAElBP,EAASlF,KAAKxgB,IAAI,EAAGyE,EAAS,GAC9BkhB,EAAaH,EAAU,EACvBI,EAAYH,EAAY,GAIxBC,EAA2B,iBAAXjhB,EAAsBA,EAAS,EAAIA,MAGjDpN,EAAM,CACRwtB,SAAuB,IAAbA,EAAiB,UAAY,QACvCE,SAAU,CACRvN,KAAM7H,IAIN4R,IACFlqB,EAAIiqB,IAAMK,GAAMQ,WAAWZ,QASzBjC,EALA6G,GAAgB,EACL,sBAAX5E,GAA+C,eAAZ/sB,IACrC2xB,GAAgB,OAKZF,GACGE,IACH5hB,EAAoBC,EAAY0hB,EAASR,GACzCnhB,EAAoBC,EAAYmhB,EAAYC,IAE9CtG,EAAQ,CAAC,CAAC4G,EAASR,GAAS,CAACC,EAAYC,KAEzCtG,EAAQ2F,iBAAczL,EAAY0M,EAASR,GAE7CruB,EAAI0tB,SAASC,SAAW1F,QAElB8G,EAAehB,EAAY,KAAI7D,GAAU,WAAa,GAC5DlqB,EAAIytB,QAAW,GAAEtwB,IAAU4xB,IAEvBP,IACFxuB,EAAIgvB,UAAY,CAACR,IAEnB,MAAOllB,GACPtJ,OA/HuBe,QAC3B8tB,QAAAA,EAASR,OAAAA,EAAQC,WAAAA,EAAYC,UAAAA,EAC7BK,gBAAAA,EAAiBtW,SAAAA,EAAU6J,WAAAA,EAAY+H,OAAAA,EAAQ/sB,QAAAA,UAE3C8xB,EAAe,GAAEJ,EAAU,KAAKR,IAChCO,IACFK,GAAgB,MAAKX,EAAa,KAAKC,EAAY,WAE/CW,EAAa,aAAYN,EAAkB,cAAgB,YAAYK,IAEvEE,EAAa,8BAA6BjF,WAqBzC,CACLsD,SAAU,QACVC,QAAU,GAAE0B,yEAEZlF,IANmB,gEAlBPmF,mBAAmBD,WACpBC,mBAAmB,CAC9B,2EACC,WAAUlF,MACXgF,EACA,GAAI,GACJ,kFACA,GAAI,GACJ,qBACA,UACArqB,KAAKsS,gBAAgB+U,KAAgB,KAAM,GAC3C,OACA3tB,KAAK,SAaLmvB,SAXe,CACfvN,KAAM7H,EACNqV,SAAUC,iBAAczL,EAAY,IAUpC1X,YAAc,GAAEykB,wBAAgC/xB,MA0FlCkyB,CAAqB,CAC/BR,QAAAA,EACAR,OAAAA,EACAC,WAAAA,EACAC,UAAAA,EACAK,gBAAAA,EACAtW,SAAAA,EACA6J,WAAAA,EACA+H,OAAAA,EACA/sB,QAAAA,WAIG6C,MAWJe,eAAeuuB,GAAmB1C,EAAUzK,EAAY4L,UACzDzwB,OAAOuS,UAAUS,eAAeI,KAAKkc,EAAU,iBACjDtC,GAAME,aAAaoC,EAAS2C,cAEvBzB,GAAsBlB,EAASjF,SAAUxF,EAAY4L,uNEjV9D,MAAMyB,GAAmB,CACvB,CACEC,MAAO,gBACPhlB,YAAa,0CACbilB,MAAO,CACL,CACEC,IAAK,4BACLC,IAAK,uCACJ,CACDD,IAAK,YACLC,IAAK,qBACJ,CACDD,IAAK,gCACLC,IAAK,yCACJ,CACDD,IAAK,4BACLC,IAAK,qCACJ,CACDD,IAAK,4BACLC,IAAK,uCACJ,CACDD,IAAK,sBACLC,IAAK,gCACJ,CACDD,IAAK,iBACLC,IAAK,2BACJ,CACDD,IAAK,sBACLC,IAAK,gCACJ,CACDD,IAAK,eACLC,IAAK,uBACJ,CACDD,IAAK,2BACLC,IAAK,6BACJ,CACDD,IAAK,kBACLC,IAAK,4BACJ,CACDD,IAAK,kBACLC,IAAK,0BACJ,CACDD,IAAK,iBACLC,IAAK,2BAIX,CACEH,MAAO,kBACPhlB,YAAa,sFACbolB,QAAQ9kB,SACA+kB,EAAc/kB,EAAOglB,kBACvBD,EAAa,CAEa,IADP/kB,EAAOilB,gBACX9tB,QACfX,KAAKwJ,OAAOG,IAAI,gCAAiC,CAAC4kB,IAEpDvuB,KAAKwJ,OAAOklB,MAAM,oCAgC1BjkB,OApBA,SAA8BkkB,EAAaV,OACrCU,EAAWhuB,OAAQ,OACf8qB,EAAqBzrB,KAAKwJ,OAAOC,IAAI,iBAC3CklB,EAAWxpB,SAASypB,IACdA,EAAUT,OAAS1yB,MAAMC,QAAQkzB,EAAUT,OAE7CS,EAAUT,MAAMhpB,SAAS0pB,UACjBC,EAAarD,EAAmBoD,EAAKT,UACxB1d,IAAfoe,IACF9uB,KAAKwJ,OAAOG,IAAK,iBAAgBklB,EAAKR,MAAOS,GAC7C9uB,KAAKwJ,OAAOklB,MAAO,iBAAgBG,EAAKT,WAGN,mBAAtBQ,EAAUN,SAC1BM,EAAUN,QAAQ7C,QC1F1B,MAAMsD,GAAgB,IAAI3oB,IAEpB4oB,GAAoBC,QACpBC,EAKJA,EAAahN,OAAOiN,qBAJH,KACfJ,GAAczK,OAAO4K,GACrBD,OAGFF,GAAcrlB,IAAIwlB,IAkBdE,GAAS,GACf,IAAI5C,GACA6C,GACAC,GACAC,GACAC,GASJ,MAAMC,GAAoBtG,GACxB1tB,MAAMmO,KAAKuf,GAASuG,QAElB,CAACC,EAAKC,IAAO7zB,OAAOC,OAAO2zB,EAAK,EAAGC,GAAK,KACxC,IAIJ3e,eAAiB,CACf4e,gBACOC,cAAgB,IAAIC,sBAEzBC,WAEMC,EAAgB,+BACjBH,cAAcpmB,IAAI1J,KAAKwJ,OAAO0mB,QACjC,+BACCtyB,IACCyxB,GAAgBzxB,EACZyxB,GACFD,GAAO3tB,KAAKwuB,IACgC,IAAnCb,GAAOxc,QAAQqd,IACxBb,GAAOhgB,OAAOggB,GAAOxc,QAAQqd,GAAgB,YAK9CH,cAAcpmB,IAAI1J,KAAKwJ,OAAO0mB,QACjC,wBACCtyB,IAECwxB,GAAOhgB,OAAO,EAAGggB,GAAOzuB,QAExBlF,MAAM6S,UAAU7M,KAAKuU,MAAMoZ,GAAQxxB,GAE/ByxB,KAAkBD,GAAOzyB,SAASszB,IACpCb,GAAO3tB,KAAKwuB,YAKbH,cAAcpmB,IAAI1J,KAAKohB,UAAU+O,oBAAoB9jB,IACxDA,EAAO+jB,WAAU5wB,UACX4M,EAAcC,EAAQ+iB,KACrBpvB,KAAKwJ,OAAOC,IAAI,0CAEb9L,KAAK0yB,QAAO,eAKnBP,cAAcpmB,IAAI1J,KAAKswB,SAAS5mB,IAAI,mBAAoB,uBACpClK,gBAEf+wB,EAAsB,CAAExpB,aADJypB,KACyBxpB,aAAa,GAChEhH,KAAK6G,cAAcC,QAAQ,sCAAuCypB,YAIjET,cAAcpmB,IAAI1J,KAAKswB,SAAS5mB,IAAI,mBAAoB,0BACjClK,gBAClB7B,KAAK0yB,kBAIVP,cAAcpmB,IAAI1J,KAAKwJ,OAAO0mB,QACjC,8CACCtyB,IAAY4uB,GAAW5uB,WAGrBkyB,cAAcpmB,IAAI1J,KAAKwJ,OAAO0mB,QACjC,qDACCP,IAAUL,GAA2BK,WAGnCG,cAAcpmB,IAAI1J,KAAKwJ,OAAO0mB,QACjC,mDACCP,IAAUJ,GAAyBE,GAAkBE,YAGnDG,cAAcpmB,IAAI1J,KAAKwJ,OAAO0mB,QACjC,uDACCtyB,IAAY4xB,GAAgC5xB,WAG1CkyB,cAAcpmB,IAAI1J,KAAKywB,YAAY/mB,IAAI,2CACC,CAAC,CAC1CgnB,MAAO,aACP3vB,QAAS,yBACT4vB,cAAgBC,UACRC,EAAe7wB,KAAKohB,UAAUwJ,0BAC/BiG,SACI,SAKiBD,EAAI51B,KAAKwR,MAAKskB,GAEtCA,EAAKC,WAAaF,EAAaE,WAC1BD,EAAKC,YAAcF,EAAaE,aAEX3kB,EAAcykB,EAAczB,UAnIxC,YAClB4B,EAAkC,KACtC9K,EAA6B+K,QAAQ,kBAEjCC,EAA0B,KAC9BV,MAGGxwB,KAAKG,eACR6uB,GAAiBgC,GACjBhC,GAAiBkC,KA8HjBC,IAGFC,aACErC,GAAc5pB,SAAQksB,GAAcnP,OAAOoP,mBAAmBD,KAC9DtC,GAAcrf,QACV8gB,IAGFA,UAEGV,cAActF,WAGrB+G,cAAa,KACJ,CACL9zB,KAAM,SACN+zB,cAAepC,GACfxiB,MAAO,OACP6kB,eAAe,EACfC,KAAMlyB,MAAAA,QACCQ,KAAKohB,UAAUC,aAAaT,UAExB,WAGH7J,EAAW6J,EAAW5I,cACvBjB,SAGI,QAILA,EAASpa,SAAS,cAGb6zB,GAA4B5P,EAAY,CAC7CqL,SAAU,UACVC,QAAS,qEAIP9iB,EAAOwX,EAAWU,cAEpByH,EAAQ,MACRnI,EAAW+Q,gBACTnC,GAA+B,OAE3BoC,EAAe,IAAIxrB,IAAIoqB,GAActH,mBAC3CoG,GAAyBnqB,SAAQwjB,GAAUiJ,EAAaloB,IAAIif,KAC5DI,EAAQ0G,GAAkBmC,QAE1B7I,EAAQ0G,GAAkBH,cAKtBjE,QAAiBmF,GAAgB,CACrC1f,KAAM,OACN7L,SAAUmE,EACVI,OAAQxJ,KAAKwJ,OAAOC,IAAI,uBACxBsf,EACAhS,SAAAA,EACA8a,YAAa7xB,KAAK8xB,QAAQC,eAAehb,GAAU,IAAM,YAEvD6J,EAAWU,YAAclY,EAOpB,KAEFonB,GAA2BnF,EAAUzK,EAAY4L,IACxD,MAAO1wB,UACA00B,GAAoB5P,EAAY9kB,oBAMlCk2B,GAAS,SACdpR,EAAa5gB,KAAKohB,UAAUwJ,0BAE7BhK,IAAe5gB,KAAKohB,UAAUC,aAAaT,aAK5CA,EAAW+Q,aAAc,OAErB/1B,EAAU,2CAChBoE,KAAK6G,cAAcglB,SAASjwB,SAGxBmb,EAAW6J,EAAW5I,UACtB6Z,EAAc7xB,KAAK8xB,QAAQC,eAAehb,GAAU,GAGpD3N,EAAOwX,EAAWU,aAEJ,IAAhBlY,EAAKzI,kBAILooB,EAAQ,GACRhtB,OAAO4S,KAAK4gB,IAAwB5uB,OAAS,IAC/CooB,EAAQwG,cAIFlE,QAAiBmF,GAAgB,CACrC1f,KAAM,MACNtH,OAAQxJ,KAAKwJ,OAAOC,IAAI,iBACxBxE,SAAUmE,EACV2f,MAAAA,EACAhS,SAAAA,EACA8a,YAAAA,IAEGG,GACHhyB,KAAK6G,cAAcyB,WAAW+iB,GAEhC,MAAOtjB,GACP/H,KAAK6G,cAAcwB,WAAWN,EAAInM"}
\ No newline at end of file
diff --git a/dist/migrate-config-options.js b/dist/migrate-config-options.js
new file mode 100644
index 00000000..ff9d6932
--- /dev/null
+++ b/dist/migrate-config-options.js
@@ -0,0 +1,108 @@
+"use strict";
+
+/*
+ * These migrations can take one of two forms, a direct move or a general function.
+ *
+ * Direct move:
+ * These objects have an array of `moves`, which
+ * are objects containing an `old` setting name and a `new` setting name.
+ * Any existing config found in the `old` name will be moved over to (and overwrite)
+ * the `new` key.
+ *
+ * Functions:
+ * These have a `migrate` function, which takes the
+ * current linter-eslint atom config as an argument, and can act on it however
+ * it needs to.
+ */
+const activeMigrations = [{
+ added: 'January, 2018',
+ description: 'Organized config settings into sections',
+ moves: [{
+ old: 'disableWhenNoEslintConfig',
+ new: 'disabling.disableWhenNoEslintConfig'
+ }, {
+ old: 'fixOnSave',
+ new: 'autofix.fixOnSave'
+ }, {
+ old: 'ignoreFixableRulesWhileTyping',
+ new: 'autofix.ignoreFixableRulesWhileTyping'
+ }, {
+ old: 'rulesToDisableWhileFixing',
+ new: 'autofix.rulesToDisableWhileFixing'
+ }, {
+ old: 'rulesToSilenceWhileTyping',
+ new: 'disabling.rulesToSilenceWhileTyping'
+ }, {
+ old: 'disableEslintIgnore',
+ new: 'advanced.disableEslintIgnore'
+ }, {
+ old: 'disableFSCache',
+ new: 'advanced.disableFSCache'
+ }, {
+ old: 'showRuleIdInMessage',
+ new: 'advanced.showRuleIdInMessage'
+ }, {
+ old: 'eslintrcPath',
+ new: 'global.eslintrcPath'
+ }, {
+ old: 'advancedLocalNodeModules',
+ new: 'advanced.localNodeModules'
+ }, {
+ old: 'eslintRulesDirs',
+ new: 'advanced.eslintRulesDirs'
+ }, {
+ old: 'useGlobalEslint',
+ new: 'global.useGlobalEslint'
+ }, {
+ old: 'globalNodePath',
+ new: 'global.globalNodePath'
+ }]
+}, {
+ added: 'September, 2017',
+ description: 'Deprecated eslintRulesDir{String} option in favor of eslintRulesDirs{Array}',
+
+ migrate(config) {
+ const oldRulesdir = config.eslintRulesDir;
+
+ if (oldRulesdir) {
+ const newRulesDirs = config.eslintRulesDirs;
+
+ if (newRulesDirs.length === 0) {
+ atom.config.set('linter-eslint.eslintRulesDirs', [oldRulesdir]);
+ }
+
+ atom.config.unset('linter-eslint.eslintRulesDir');
+ }
+ }
+
+}];
+/*
+ * This function can be called when linter-eslint first activates in order to
+ * ensure that the user's settings are up-to-date with the current version of
+ * linter-eslint. Ideally, we would call this only when upgrading to a new
+ * version.
+ */
+
+function migrateConfigOptions(migrations = activeMigrations) {
+ if (migrations.length) {
+ const linterEslintConfig = atom.config.get('linter-eslint');
+ migrations.forEach(migration => {
+ if (migration.moves && Array.isArray(migration.moves)) {
+ // Copy old settings over to the new ones, then unset the old setting keys
+ migration.moves.forEach(move => {
+ const oldSetting = linterEslintConfig[move.old];
+
+ if (oldSetting !== undefined) {
+ atom.config.set(`linter-eslint.${move.new}`, oldSetting);
+ atom.config.unset(`linter-eslint.${move.old}`);
+ }
+ });
+ } else if (typeof migration.migrate === 'function') {
+ migration.migrate(linterEslintConfig);
+ }
+ });
+ }
+}
+
+exports.migrateConfigOptions = migrateConfigOptions;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9taWdyYXRlLWNvbmZpZy1vcHRpb25zLmpzIl0sIm5hbWVzIjpbImFjdGl2ZU1pZ3JhdGlvbnMiLCJhZGRlZCIsImRlc2NyaXB0aW9uIiwibW92ZXMiLCJvbGQiLCJuZXciLCJtaWdyYXRlIiwiY29uZmlnIiwib2xkUnVsZXNkaXIiLCJlc2xpbnRSdWxlc0RpciIsIm5ld1J1bGVzRGlycyIsImVzbGludFJ1bGVzRGlycyIsImxlbmd0aCIsImF0b20iLCJzZXQiLCJ1bnNldCIsIm1pZ3JhdGVDb25maWdPcHRpb25zIiwibWlncmF0aW9ucyIsImxpbnRlckVzbGludENvbmZpZyIsImdldCIsImZvckVhY2giLCJtaWdyYXRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJtb3ZlIiwib2xkU2V0dGluZyIsInVuZGVmaW5lZCIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLGdCQUFnQixHQUFHLENBQ3ZCO0FBQ0VDLEVBQUFBLEtBQUssRUFBRSxlQURUO0FBRUVDLEVBQUFBLFdBQVcsRUFBRSx5Q0FGZjtBQUdFQyxFQUFBQSxLQUFLLEVBQUUsQ0FDTDtBQUNFQyxJQUFBQSxHQUFHLEVBQUUsMkJBRFA7QUFFRUMsSUFBQUEsR0FBRyxFQUFFO0FBRlAsR0FESyxFQUlGO0FBQ0RELElBQUFBLEdBQUcsRUFBRSxXQURKO0FBRURDLElBQUFBLEdBQUcsRUFBRTtBQUZKLEdBSkUsRUFPRjtBQUNERCxJQUFBQSxHQUFHLEVBQUUsK0JBREo7QUFFREMsSUFBQUEsR0FBRyxFQUFFO0FBRkosR0FQRSxFQVVGO0FBQ0RELElBQUFBLEdBQUcsRUFBRSwyQkFESjtBQUVEQyxJQUFBQSxHQUFHLEVBQUU7QUFGSixHQVZFLEVBYUY7QUFDREQsSUFBQUEsR0FBRyxFQUFFLDJCQURKO0FBRURDLElBQUFBLEdBQUcsRUFBRTtBQUZKLEdB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bnRlbnQiOlsiLypcbiAqIFRoZXNlIG1pZ3JhdGlvbnMgY2FuIHRha2Ugb25lIG9mIHR3byBmb3JtcywgYSBkaXJlY3QgbW92ZSBvciBhIGdlbmVyYWwgZnVuY3Rpb24uXG4gKlxuICogRGlyZWN0IG1vdmU6XG4gKiAgIFRoZXNlIG9iamVjdHMgaGF2ZSBhbiBhcnJheSBvZiBgbW92ZXNgLCB3aGljaFxuICogICBhcmUgb2JqZWN0cyBjb250YWluaW5nIGFuIGBvbGRgIHNldHRpbmcgbmFtZSBhbmQgYSBgbmV3YCBzZXR0aW5nIG5hbWUuXG4gKiAgIEFueSBleGlzdGluZyBjb25maWcgZm91bmQgaW4gdGhlIGBvbGRgIG5hbWUgd2lsbCBiZSBtb3ZlZCBvdmVyIHRvIChhbmQgb3ZlcndyaXRlKVxuICogICB0aGUgYG5ld2Aga2V5LlxuICpcbiAqIEZ1bmN0aW9uczpcbiAqICAgVGhlc2UgaGF2ZSBhIGBtaWdyYXRlYCBmdW5jdGlvbiwgd2hpY2ggdGFrZXMgdGhlXG4gKiAgIGN1cnJlbnQgbGludGVyLWVzbGludCBhdG9tIGNvbmZpZyBhcyBhbiBhcmd1bWVudCwgYW5kIGNhbiBhY3Qgb24gaXQgaG93ZXZlclxuICogICBpdCBuZWVkcyB0by5cbiAqL1xuY29uc3QgYWN0aXZlTWlncmF0aW9ucyA9IFtcbiAge1xuICAgIGFkZGVkOiAnSmFudWFyeSwgMjAxOCcsXG4gICAgZGVzY3JpcHRpb246ICdPcmdhbml6ZWQgY29uZmlnIHNldHRpbmdzIGludG8gc2VjdGlvbnMnLFxuICAgIG1vdmVzOiBbXG4gICAgICB7XG4gICAgICAgIG9sZDogJ2Rpc2FibGVXaGVuTm9Fc2xpbnRDb25maWcnLFxuICAgICAgICBuZXc6ICdkaXNhYmxpbmcuZGlzYWJsZVdoZW5Ob0VzbGludENvbmZpZycsXG4gICAgICB9LCB7XG4gICAgICAgIG9sZDogJ2ZpeE9uU2F2ZScsXG4gICAgICAgIG5ldzogJ2F1dG9maXguZml4T25TYXZlJ1xuICAgICAgfSwge1xuICAgICAgICBvbGQ6ICdpZ25vcmVGaXhhYmxlUnVsZXNXaGlsZVR5cGluZycsXG4gICAgICAgIG5ldzogJ2F1dG9maXguaWdub3JlRml4YWJsZVJ1bGVzV2hpbGVUeXBpbmcnXG4gICAgICB9LCB7XG4gICAgICAgIG9sZDogJ3J1bGVzVG9EaXNhYmxlV2hpbGVGaXhpbmcnLFxuICAgICAgICBuZXc6ICdhdXRvZml4LnJ1bGVzVG9EaXNhYmxlV2hpbGVGaXhpbmcnXG4gICAgICB9LCB7XG4gICAgICAgIG9sZDogJ3J1bGVzVG9TaWxlbmNlV2hpbGVUeXBpbmcnLFxuICAgICAgICBuZXc6ICdkaXNhYmxpbmcucnVsZXNUb1NpbGVuY2VXaGlsZVR5cGluZydcbiAgICAgIH0sIHtcbiAgICAgICAgb2xkOiAnZGlzYWJsZUVzbGludElnbm9yZScsXG4gICAgICAgIG5ldzogJ2FkdmFuY2VkLmRpc2FibGVFc2xpbnRJZ25vcmUnXG4gICAgICB9LCB7XG4gICAgICAgIG9sZDogJ2Rpc2FibGVGU0NhY2hlJyxcbiAgICAgICAgbmV3OiAnYWR2YW5jZWQuZGlzYWJsZUZTQ2FjaGUnXG4gICAgICB9LCB7XG4gICAgICAgIG9sZDogJ3Nob3dSdWxlSWRJbk1lc3NhZ2UnLFxuICAgICAgICBuZXc6ICdhZHZhbmNlZC5zaG93UnVsZUlkSW5NZXNzYWdlJ1xuICAgICAgfSwge1xuICAgICAgICBvbGQ6ICdlc2xpbnRyY1BhdGgnLFxuICAgICAgICBuZXc6ICdnbG9iYWwuZXNsaW50cmNQYXRoJ1xuICAgICAgfSwge1xuICAgICAgICBvbGQ6ICdhZHZhbmNlZExvY2FsTm9kZU1vZHVsZXMnLFxuICAgICAgICBuZXc6ICdhZHZhbmNlZC5sb2NhbE5vZGVNb2R1bGVzJ1xuICAgICAgfSwge1xuICAgICAgICBvbGQ6ICdlc2xpbnRSdWxlc0RpcnMnLFxuICAgICAgICBuZXc6ICdhZHZhbmNlZC5lc2xpbnRSdWxlc0RpcnMnXG4gICAgICB9LCB7XG4gICAgICAgIG9sZDogJ3VzZUdsb2JhbEVzbGludCcsXG4gICAgICAgIG5ldzogJ2dsb2JhbC51c2VHbG9iYWxFc2xpbnQnXG4gICAgICB9LCB7XG4gICAgICAgIG9sZDogJ2dsb2JhbE5vZGVQYXRoJyxcbiAgICAgICAgbmV3OiAnZ2xvYmFsLmdsb2JhbE5vZGVQYXRoJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgIGFkZGVkOiAnU2VwdGVtYmVyLCAyMDE3JyxcbiAgICBkZXNjcmlwdGlvbjogJ0RlcHJlY2F0ZWQgZXNsaW50UnVsZXNEaXJ7U3RyaW5nfSBvcHRpb24gaW4gZmF2b3Igb2YgZXNsaW50UnVsZXNEaXJze0FycmF5PFN0cmluZz59JyxcbiAgICBtaWdyYXRlKGNvbmZpZykge1xuICAgICAgY29uc3Qgb2xkUnVsZXNkaXIgPSBjb25maWcuZXNsaW50UnVsZXNEaXJcbiAgICAgIGlmIChvbGRSdWxlc2Rpcikge1xuICAgICAgICBjb25zdCBuZXdSdWxlc0RpcnMgPSBjb25maWcuZXNsaW50UnVsZXNEaXJzXG4gICAgICAgIGlmIChuZXdSdWxlc0RpcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXRvbS5jb25maWcuc2V0KCdsaW50ZXItZXNsaW50LmVzbGludFJ1bGVzRGlycycsIFtvbGRSdWxlc2Rpcl0pXG4gICAgICAgIH1cbiAgICAgICAgYXRvbS5jb25maWcudW5zZXQoJ2xpbnRlci1lc2xpbnQuZXNsaW50UnVsZXNEaXInKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXVxuXG4vKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHdoZW4gbGludGVyLWVzbGludCBmaXJzdCBhY3RpdmF0ZXMgaW4gb3JkZXIgdG9cbiAqIGVuc3VyZSB0aGF0IHRoZSB1c2VyJ3Mgc2V0dGluZ3MgYXJlIHVwLXRvLWRhdGUgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mXG4gKiBsaW50ZXItZXNsaW50LiAgSWRlYWxseSwgd2Ugd291bGQgY2FsbCB0aGlzIG9ubHkgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdcbiAqIHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIG1pZ3JhdGVDb25maWdPcHRpb25zKG1pZ3JhdGlvbnMgPSBhY3RpdmVNaWdyYXRpb25zKSB7XG4gIGlmIChtaWdyYXRpb25zLmxlbmd0aCkge1xuICAgIGNvbnN0IGxpbnRlckVzbGludENvbmZpZyA9IGF0b20uY29uZmlnLmdldCgnbGludGVyLWVzbGludCcpXG4gICAgbWlncmF0aW9ucy5mb3JFYWNoKChtaWdyYXRpb24pID0+IHtcbiAgICAgIGlmIChtaWdyYXRpb24ubW92ZXMgJiYgQXJyYXkuaXNBcnJheShtaWdyYXRpb24ubW92ZXMpKSB7XG4gICAgICAgIC8vIENvcHkgb2xkIHNldHRpbmdzIG92ZXIgdG8gdGhlIG5ldyBvbmVzLCB0aGVuIHVuc2V0IHRoZSBvbGQgc2V0dGluZyBrZXlzXG4gICAgICAgIG1pZ3JhdGlvbi5tb3Zlcy5mb3JFYWNoKChtb3ZlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2xkU2V0dGluZyA9IGxpbnRlckVzbGludENvbmZpZ1ttb3ZlLm9sZF1cbiAgICAgICAgICBpZiAob2xkU2V0dGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhdG9tLmNvbmZpZy5zZXQoYGxpbnRlci1lc2xpbnQuJHttb3ZlLm5ld31gLCBvbGRTZXR0aW5nKVxuICAgICAgICAgICAgYXRvbS5jb25maWcudW5zZXQoYGxpbnRlci1lc2xpbnQuJHttb3ZlLm9sZH1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pZ3JhdGlvbi5taWdyYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1pZ3JhdGlvbi5taWdyYXRlKGxpbnRlckVzbGludENvbmZpZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydHMubWlncmF0ZUNvbmZpZ09wdGlvbnMgPSBtaWdyYXRlQ29uZmlnT3B0aW9uc1xuIl19
\ No newline at end of file
diff --git a/dist/rules.js b/dist/rules.js
new file mode 100644
index 00000000..0932d3ed
--- /dev/null
+++ b/dist/rules.js
@@ -0,0 +1,90 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _eslintRuleDocumentation = _interopRequireDefault(require("eslint-rule-documentation"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Stores a list of rules from ESLint
+ */
+class Rules {
+ /**
+ * Instantiates a Rules object, optionally with an existing list of rules
+ * @param {Array} newRules Array of Arrays of the rule and properties
+ */
+ constructor(newRules) {
+ this.replaceRules(newRules);
+ }
+ /**
+ * Process the updated rules into the local Map and call further update functions
+ * @param {Array} newRules Array of Arrays of the rule and properties
+ */
+
+
+ replaceRules(newRules) {
+ if (this.rules !== undefined) {
+ this.rules.clear();
+ }
+ /** @type {Map} */
+
+
+ this.rules = new Map(newRules);
+ }
+ /**
+ * [getFixableRules description]
+ * @return {Array} The ruleIds of the currently known fixable rules
+ */
+
+
+ getFixableRules() {
+ const ruleIds = []; // eslint-disable-next-line no-restricted-syntax
+
+ for (const [ruleId, ruleProps] of this.rules) {
+ if (ruleProps && ruleProps.meta && ruleProps.meta.fixable) {
+ ruleIds.push(ruleId);
+ }
+ }
+
+ return ruleIds;
+ }
+ /**
+ * Get the URL of the documentation for a rule, either from the rule's own
+ * metadata, from eslint-rule-documentation's known rules, or the fallback URL
+ * on how to add it to eslint-rule-documentation.
+ * @param {string} ruleId The rule ID to get the documentation URL for
+ * @return {string} URL of the rule documentation
+ */
+
+
+ getRuleUrl(ruleId) {
+ const props = this.rules.get(ruleId);
+
+ if (props && props.meta && props.meta.docs && props.meta.docs.url) {
+ // The rule has a documentation URL specified in its metadata
+ return props.meta.docs.url;
+ } // The rule didn't specify a URL in its metadata, or was not currently known
+ // somehow. Attempt to determine a URL using eslint-rule-documentation.
+
+
+ return (0, _eslintRuleDocumentation.default)(ruleId).url;
+ }
+ /**
+ * Return the known rules.
+ * @return {Map} The currently known rules
+ */
+
+
+ getRules() {
+ return this.rules;
+ }
+
+}
+
+exports.default = Rules;
+module.exports = exports.default;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ydWxlcy5qcyJdLCJuYW1lcyI6WyJSdWxlcyIsImNvbnN0cnVjdG9yIiwibmV3UnVsZXMiLCJyZXBsYWNlUnVsZXMiLCJydWxlcyIsInVuZGVmaW5lZCIsImNsZWFyIiwiTWFwIiwiZ2V0Rml4YWJsZVJ1bGVzIiwicnVsZUlkcyIsInJ1bGVJZCIsInJ1bGVQcm9wcyIsIm1ldGEiLCJmaXhhYmxlIiwicHVzaCIsImdldFJ1bGVVcmwiLCJwcm9wcyIsImdldCIsImRvY3MiLCJ1cmwiLCJnZXRSdWxlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBRUE7QUFDQTtBQUNBO0FBQ2UsTUFBTUEsS0FBTixDQUFZO0FBQ3pCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0VDLEVBQUFBLFdBQVcsQ0FBQ0MsUUFBRCxFQUFXO0FBQ3BCLFNBQUtDLFlBQUwsQ0FBa0JELFFBQWxCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7O0FBQ0VDLEVBQUFBLFlBQVksQ0FBQ0QsUUFBRCxFQUFXO0FBQ3JCLFFBQUksS0FBS0UsS0FBTCxLQUFlQyxTQUFuQixFQUE4QjtBQUM1QixXQUFLRCxLQUFMLENBQVdFLEtBQVg7QUFDRDtBQUVEOzs7QUFDQSxTQUFLRixLQUFMLEdBQWEsSUFBSUcsR0FBSixDQUFRTCxRQUFSLENBQWI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBOzs7QUFDRU0sRUFBQUEsZUFBZSxHQUFHO0FBQ2hCLFVBQU1DLE9BQU8sR0FBRyxFQUFoQixDQURnQixDQUVoQjs7QUFDQSxTQUFLLE1BQU0sQ0FBQ0MsTUFBRCxFQUFTQyxTQUFULENBQVgsSUFBa0MsS0FBS1AsS0FBdkMsRUFBOEM7QUFDNUMsVUFBSU8sU0FBUyxJQUFJQSxTQUFTLENBQUNDLElBQXZCLElBQStCRCxTQUFTLENBQUNDLElBQVYsQ0FBZUMsT0FBbEQsRUFBMkQ7QUFDekRKLFFBQUFBLE9BQU8sQ0FBQ0ssSUFBUixDQUFhSixNQUFiO0FBQ0Q7QUFDRjs7QUFDRCxXQUFPRCxPQUFQO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VNLEVBQUFBLFVBQVUsQ0FBQ0wsTUFBRCxFQUFTO0FBQ2pCLFVBQU1NLEtBQUssR0FBRyxLQUFLWixLQUFMLENBQVdhLEdBQVgsQ0FBZVAsTUFBZixDQUFkOztBQUNBLFFBQUlNLEtBQUssSUFBSUEsS0FBSyxDQUFDSixJQUFmLElBQXVCSSxLQUFLLENBQUNKLElBQU4sQ0FBV00sSUFBbEMsSUFBMENGLEtBQUssQ0FBQ0osSUFBTixDQUFXTSxJQUFYLENBQWdCQyxHQUE5RCxFQUFtRTtBQUNqRTtBQUNBLGFBQU9ILEtBQUssQ0FBQ0osSUFBTixDQUFXTSxJQUFYLENBQWdCQyxHQUF2QjtBQUNELEtBTGdCLENBT2pCO0FBQ0E7OztBQUNBLFdBQU8sc0NBQVFULE1BQVIsRUFBZ0JTLEdBQXZCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7O0FBQ0VDLEVBQUFBLFFBQVEsR0FBRztBQUNULFdBQU8sS0FBS2hCLEtBQVo7QUFDRDs7QUE5RHdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJ1bGVVUkkgZnJvbSAnZXNsaW50LXJ1bGUtZG9jdW1lbnRhdGlvbidcblxuLyoqXG4gKiBTdG9yZXMgYSBsaXN0IG9mIHJ1bGVzIGZyb20gRVNMaW50XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJ1bGVzIHtcbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlcyBhIFJ1bGVzIG9iamVjdCwgb3B0aW9uYWxseSB3aXRoIGFuIGV4aXN0aW5nIGxpc3Qgb2YgcnVsZXNcbiAgICogQHBhcmFtIHtBcnJheTxBcnJheTxzdHJpbmcsIGFueT59IG5ld1J1bGVzIEFycmF5IG9mIEFycmF5cyBvZiB0aGUgcnVsZSBhbmQgcHJvcGVydGllc1xuICAgKi9cbiAgY29uc3RydWN0b3IobmV3UnVsZXMpIHtcbiAgICB0aGlzLnJlcGxhY2VSdWxlcyhuZXdSdWxlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoZSB1cGRhdGVkIHJ1bGVzIGludG8gdGhlIGxvY2FsIE1hcCBhbmQgY2FsbCBmdXJ0aGVyIHVwZGF0ZSBmdW5jdGlvbnNcbiAgICogQHBhcmFtICB7QXJyYXk8QXJyYXk8c3RyaW5nLCBhbnk+fSBuZXdSdWxlcyBBcnJheSBvZiBBcnJheXMgb2YgdGhlIHJ1bGUgYW5kIHByb3BlcnRpZXNcbiAgICovXG4gIHJlcGxhY2VSdWxlcyhuZXdSdWxlcykge1xuICAgIGlmICh0aGlzLnJ1bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucnVsZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLnJ1bGVzID0gbmV3IE1hcChuZXdSdWxlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBbZ2V0Rml4YWJsZVJ1bGVzIGRlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtBcnJheTxzdHJpbmc+fSBUaGUgcnVsZUlkcyBvZiB0aGUgY3VycmVudGx5IGtub3duIGZpeGFibGUgcnVsZXNcbiAgICovXG4gIGdldEZpeGFibGVSdWxlcygpIHtcbiAgICBjb25zdCBydWxlSWRzID0gW11cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBmb3IgKGNvbnN0IFtydWxlSWQsIHJ1bGVQcm9wc10gb2YgdGhpcy5ydWxlcykge1xuICAgICAgaWYgKHJ1bGVQcm9wcyAmJiBydWxlUHJvcHMubWV0YSAmJiBydWxlUHJvcHMubWV0YS5maXhhYmxlKSB7XG4gICAgICAgIHJ1bGVJZHMucHVzaChydWxlSWQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydWxlSWRzXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBVUkwgb2YgdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgcnVsZSwgZWl0aGVyIGZyb20gdGhlIHJ1bGUncyBvd25cbiAgICogbWV0YWRhdGEsIGZyb20gZXNsaW50LXJ1bGUtZG9jdW1lbnRhdGlvbidzIGtub3duIHJ1bGVzLCBvciB0aGUgZmFsbGJhY2sgVVJMXG4gICAqIG9uIGhvdyB0byBhZGQgaXQgdG8gZXNsaW50LXJ1bGUtZG9jdW1lbnRhdGlvbi5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBydWxlSWQgVGhlIHJ1bGUgSUQgdG8gZ2V0IHRoZSBkb2N1bWVudGF0aW9uIFVSTCBmb3JcbiAgICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgVVJMIG9mIHRoZSBydWxlIGRvY3VtZW50YXRpb25cbiAgICovXG4gIGdldFJ1bGVVcmwocnVsZUlkKSB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnJ1bGVzLmdldChydWxlSWQpXG4gICAgaWYgKHByb3BzICYmIHByb3BzLm1ldGEgJiYgcHJvcHMubWV0YS5kb2NzICYmIHByb3BzLm1ldGEuZG9jcy51cmwpIHtcbiAgICAgIC8vIFRoZSBydWxlIGhhcyBhIGRvY3VtZW50YXRpb24gVVJMIHNwZWNpZmllZCBpbiBpdHMgbWV0YWRhdGFcbiAgICAgIHJldHVybiBwcm9wcy5tZXRhLmRvY3MudXJsXG4gICAgfVxuXG4gICAgLy8gVGhlIHJ1bGUgZGlkbid0IHNwZWNpZnkgYSBVUkwgaW4gaXRzIG1ldGFkYXRhLCBvciB3YXMgbm90IGN1cnJlbnRseSBrbm93blxuICAgIC8vIHNvbWVob3cuIEF0dGVtcHQgdG8gZGV0ZXJtaW5lIGEgVVJMIHVzaW5nIGVzbGludC1ydWxlLWRvY3VtZW50YXRpb24uXG4gICAgcmV0dXJuIHJ1bGVVUkkocnVsZUlkKS51cmxcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGtub3duIHJ1bGVzLlxuICAgKiBAcmV0dXJuIHtNYXA8c3RyaW5nLCBhbnk+fSBUaGUgY3VycmVudGx5IGtub3duIHJ1bGVzXG4gICAqL1xuICBnZXRSdWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlc1xuICB9XG59XG4iXX0=
\ No newline at end of file
diff --git a/dist/validate/editor.js b/dist/validate/editor.js
new file mode 100644
index 00000000..01b2b785
--- /dev/null
+++ b/dist/validate/editor.js
@@ -0,0 +1,28 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.hasValidScope = exports.throwIfInvalidPoint = exports.isValidPoint = void 0;
+
+var _throw = _interopRequireDefault(require("./throw"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const isValidPoint = (textBuffer, line, column) => {
+ // Clip the given point to a valid one
+ const validPoint = textBuffer.clipPosition([line, column]); // Compare to original
+
+ return validPoint.isEqual([line, column]);
+};
+
+exports.isValidPoint = isValidPoint;
+
+const throwIfInvalidPoint = (textBuffer, line, column) => (0, _throw.default)(`${line}:${column} isn't a valid point!`, isValidPoint(textBuffer, line, column));
+
+exports.throwIfInvalidPoint = throwIfInvalidPoint;
+
+const hasValidScope = (editor, validScopes) => editor.getCursors().some(cursor => cursor.getScopeDescriptor().getScopesArray().some(scope => validScopes.includes(scope)));
+
+exports.hasValidScope = hasValidScope;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0ZS9lZGl0b3IuanMiXSwibmFtZXMiOlsiaXNWYWxpZFBvaW50IiwidGV4dEJ1ZmZlciIsImxpbmUiLCJjb2x1bW4iLCJ2YWxpZFBvaW50IiwiY2xpcFBvc2l0aW9uIiwiaXNFcXVhbCIsInRocm93SWZJbnZhbGlkUG9pbnQiLCJoYXNWYWxpZFNjb3BlIiwiZWRpdG9yIiwidmFsaWRTY29wZXMiLCJnZXRDdXJzb3JzIiwic29tZSIsImN1cnNvciIsImdldFNjb3BlRGVzY3JpcHRvciIsImdldFNjb3Blc0FycmF5Iiwic2NvcGUiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBRU8sTUFBTUEsWUFBWSxHQUFHLENBQUNDLFVBQUQsRUFBYUMsSUFBYixFQUFtQkMsTUFBbkIsS0FBOEI7QUFDeEQ7QUFDQSxRQUFNQyxVQUFVLEdBQUdILFVBQVUsQ0FBQ0ksWUFBWCxDQUF3QixDQUFDSCxJQUFELEVBQU9DLE1BQVAsQ0FBeEIsQ0FBbkIsQ0FGd0QsQ0FHeEQ7O0FBQ0EsU0FBT0MsVUFBVSxDQUFDRSxPQUFYLENBQW1CLENBQUNKLElBQUQsRUFBT0MsTUFBUCxDQUFuQixDQUFQO0FBQ0QsQ0FMTTs7OztBQU9BLE1BQU1JLG1CQUFtQixHQUFHLENBQUNOLFVBQUQsRUFBYUMsSUFBYixFQUFtQkMsTUFBbkIsS0FDakMsb0JBQ0csR0FBRUQsSUFBSyxJQUFHQyxNQUFPLHVCQURwQixFQUVFSCxZQUFZLENBQUNDLFVBQUQsRUFBYUMsSUFBYixFQUFtQkMsTUFBbkIsQ0FGZCxDQURLOzs7O0FBTUEsTUFBTUssYUFBYSxHQUFHLENBQUNDLE1BQUQsRUFBU0MsV0FBVCxLQUF5QkQsTUFBTSxDQUFDRSxVQUFQLEdBQ25EQyxJQURtRCxDQUM5Q0MsTUFBTSxJQUFJQSxNQUFNLENBQUNDLGtCQUFQLEdBQ2JDLGNBRGEsR0FFYkgsSUFGYSxDQUVSSSxLQUFLLElBQUlOLFdBQVcsQ0FBQ08sUUFBWixDQUFxQkQsS0FBckIsQ0FGRCxDQURvQyxDQUEvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0aHJvd0lmRmFpbCBmcm9tICcuL3Rocm93J1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZFBvaW50ID0gKHRleHRCdWZmZXIsIGxpbmUsIGNvbHVtbikgPT4ge1xuICAvLyBDbGlwIHRoZSBnaXZlbiBwb2ludCB0byBhIHZhbGlkIG9uZVxuICBjb25zdCB2YWxpZFBvaW50ID0gdGV4dEJ1ZmZlci5jbGlwUG9zaXRpb24oW2xpbmUsIGNvbHVtbl0pXG4gIC8vIENvbXBhcmUgdG8gb3JpZ2luYWxcbiAgcmV0dXJuIHZhbGlkUG9pbnQuaXNFcXVhbChbbGluZSwgY29sdW1uXSlcbn1cblxuZXhwb3J0IGNvbnN0IHRocm93SWZJbnZhbGlkUG9pbnQgPSAodGV4dEJ1ZmZlciwgbGluZSwgY29sdW1uKSA9PiAoXG4gIHRocm93SWZGYWlsKFxuICAgIGAke2xpbmV9OiR7Y29sdW1ufSBpc24ndCBhIHZhbGlkIHBvaW50IWAsXG4gICAgaXNWYWxpZFBvaW50KHRleHRCdWZmZXIsIGxpbmUsIGNvbHVtbilcbiAgKSlcblxuZXhwb3J0IGNvbnN0IGhhc1ZhbGlkU2NvcGUgPSAoZWRpdG9yLCB2YWxpZFNjb3BlcykgPT4gZWRpdG9yLmdldEN1cnNvcnMoKVxuICAuc29tZShjdXJzb3IgPT4gY3Vyc29yLmdldFNjb3BlRGVzY3JpcHRvcigpXG4gICAgLmdldFNjb3Blc0FycmF5KClcbiAgICAuc29tZShzY29wZSA9PiB2YWxpZFNjb3Blcy5pbmNsdWRlcyhzY29wZSkpKVxuIl19
\ No newline at end of file
diff --git a/dist/validate/throw.js b/dist/validate/throw.js
new file mode 100644
index 00000000..2fd1637a
--- /dev/null
+++ b/dist/validate/throw.js
@@ -0,0 +1,19 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+const throwIfFail = (msg, passed) => {
+ if (!passed) {
+ throw new Error(msg);
+ }
+
+ return true;
+};
+
+var _default = throwIfFail;
+exports.default = _default;
+module.exports = exports.default;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0ZS90aHJvdy5qcyJdLCJuYW1lcyI6WyJ0aHJvd0lmRmFpbCIsIm1zZyIsInBhc3NlZCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsTUFBTUEsV0FBVyxHQUFHLENBQUNDLEdBQUQsRUFBTUMsTUFBTixLQUFpQjtBQUNuQyxNQUFJLENBQUNBLE1BQUwsRUFBYTtBQUNYLFVBQU0sSUFBSUMsS0FBSixDQUFVRixHQUFWLENBQU47QUFDRDs7QUFDRCxTQUFPLElBQVA7QUFDRCxDQUxEOztlQU9lRCxXIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdGhyb3dJZkZhaWwgPSAobXNnLCBwYXNzZWQpID0+IHtcbiAgaWYgKCFwYXNzZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHRocm93SWZGYWlsXG4iXX0=
\ No newline at end of file
diff --git a/dist/worker-helpers.js b/dist/worker-helpers.js
new file mode 100644
index 00000000..6f1de034
--- /dev/null
+++ b/dist/worker-helpers.js
@@ -0,0 +1,258 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.getNodePrefixPath = getNodePrefixPath;
+exports.findESLintDirectory = findESLintDirectory;
+exports.getESLintFromDirectory = getESLintFromDirectory;
+exports.refreshModulesPath = refreshModulesPath;
+exports.getESLintInstance = getESLintInstance;
+exports.getConfigForFile = getConfigForFile;
+exports.getRelativePath = getRelativePath;
+exports.getCLIEngineOptions = getCLIEngineOptions;
+exports.getRules = getRules;
+exports.didRulesChange = didRulesChange;
+
+var _path = _interopRequireDefault(require("path"));
+
+var _fsPlus = _interopRequireDefault(require("fs-plus"));
+
+var _child_process = _interopRequireDefault(require("child_process"));
+
+var _resolveEnv = _interopRequireDefault(require("resolve-env"));
+
+var _atomLinter = require("atom-linter");
+
+var _consistentPath = _interopRequireDefault(require("consistent-path"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const Cache = {
+ ESLINT_LOCAL_PATH: _path.default.normalize(_path.default.join(__dirname, '..', 'node_modules', 'eslint')),
+ NODE_PREFIX_PATH: null,
+ LAST_MODULES_PATH: null
+};
+/**
+ * Takes a path and translates `~` to the user's home directory, and replaces
+ * all environment variables with their value.
+ * @param {string} path The path to remove "strangeness" from
+ * @return {string} The cleaned path
+ */
+
+const cleanPath = path => path ? (0, _resolveEnv.default)(_fsPlus.default.normalize(path)) : '';
+
+function getNodePrefixPath() {
+ if (Cache.NODE_PREFIX_PATH === null) {
+ const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
+
+ try {
+ Cache.NODE_PREFIX_PATH = _child_process.default.spawnSync(npmCommand, ['get', 'prefix'], {
+ env: Object.assign(Object.assign({}, process.env), {
+ PATH: (0, _consistentPath.default)()
+ })
+ }).output[1].toString().trim();
+ } catch (e) {
+ const errMsg = 'Unable to execute `npm get prefix`. Please make sure ' + 'Atom is getting $PATH correctly.';
+ throw new Error(errMsg);
+ }
+ }
+
+ return Cache.NODE_PREFIX_PATH;
+}
+
+function isDirectory(dirPath) {
+ let isDir;
+
+ try {
+ isDir = _fsPlus.default.statSync(dirPath).isDirectory();
+ } catch (e) {
+ isDir = false;
+ }
+
+ return isDir;
+}
+
+let fallbackForGlobalErrorThrown = false;
+
+function findESLintDirectory(modulesDir, config, projectPath, fallbackForGlobal = false) {
+ let eslintDir = null;
+ let locationType = null;
+
+ if (config.global.useGlobalEslint && !fallbackForGlobal) {
+ locationType = 'global';
+ const configGlobal = cleanPath(config.global.globalNodePath);
+ const prefixPath = configGlobal || getNodePrefixPath(); // NPM on Windows and Yarn on all platforms
+
+ eslintDir = _path.default.join(prefixPath, 'node_modules', 'eslint');
+
+ if (!isDirectory(eslintDir)) {
+ // NPM on platforms other than Windows
+ eslintDir = _path.default.join(prefixPath, 'lib', 'node_modules', 'eslint');
+ }
+ } else if (!config.advanced.localNodeModules) {
+ locationType = 'local project';
+ eslintDir = _path.default.join(modulesDir || '', 'eslint');
+ } else if (_path.default.isAbsolute(cleanPath(config.advanced.localNodeModules))) {
+ locationType = 'advanced specified';
+ eslintDir = _path.default.join(cleanPath(config.advanced.localNodeModules), 'eslint');
+ } else {
+ locationType = 'advanced specified';
+ eslintDir = _path.default.join(projectPath || '', cleanPath(config.advanced.localNodeModules), 'eslint');
+ }
+
+ if (isDirectory(eslintDir)) {
+ return {
+ path: eslintDir,
+ type: locationType
+ };
+ }
+
+ if (config.global.useGlobalEslint && !fallbackForGlobal) {
+ if (!fallbackForGlobalErrorThrown) {
+ // Throw the error only once to prevent performance issues
+ fallbackForGlobalErrorThrown = true;
+ console.error(`Global ESLint is not found, falling back to other Eslint installations...
+ Please ensure the global Node path is set correctly.
+ If you wanted to use a local installation of Eslint, disable Global Eslint option in the linter-eslint config.`);
+ }
+
+ return findESLintDirectory(modulesDir, config, projectPath, true);
+ }
+
+ return {
+ path: Cache.ESLINT_LOCAL_PATH,
+ type: 'bundled fallback'
+ };
+}
+
+function getESLintFromDirectory(modulesDir, config, projectPath) {
+ const {
+ path: ESLintDirectory
+ } = findESLintDirectory(modulesDir, config, projectPath);
+
+ try {
+ // eslint-disable-next-line import/no-dynamic-require
+ return require(ESLintDirectory);
+ } catch (e) {
+ if (config.global.useGlobalEslint && e.code === 'MODULE_NOT_FOUND') {
+ throw new Error('ESLint not found, try restarting Atom to clear caches.');
+ } // eslint-disable-next-line import/no-dynamic-require
+
+
+ return require(Cache.ESLINT_LOCAL_PATH);
+ }
+}
+
+function refreshModulesPath(modulesDir) {
+ if (Cache.LAST_MODULES_PATH !== modulesDir) {
+ Cache.LAST_MODULES_PATH = modulesDir;
+ process.env.NODE_PATH = modulesDir || ''; // eslint-disable-next-line no-underscore-dangle
+
+ require('module').Module._initPaths();
+ }
+}
+
+function getESLintInstance(fileDir, config, projectPath) {
+ const modulesDir = _path.default.dirname((0, _atomLinter.findCached)(fileDir, 'node_modules/eslint') || '');
+
+ refreshModulesPath(modulesDir);
+ return getESLintFromDirectory(modulesDir, config, projectPath);
+}
+
+function getConfigForFile(eslint, filePath) {
+ const cli = new eslint.CLIEngine();
+
+ try {
+ return cli.getConfigForFile(filePath);
+ } catch (e) {
+ // No configuration was found
+ return null;
+ }
+}
+
+function getRelativePath(fileDir, filePath, config, projectPath) {
+ const ignoreFile = config.advanced.disableEslintIgnore ? null : (0, _atomLinter.findCached)(fileDir, '.eslintignore'); // If we can find an .eslintignore file, we can set cwd there
+ // (because they are expected to be at the project root)
+
+ if (ignoreFile) {
+ const ignoreDir = _path.default.dirname(ignoreFile);
+
+ process.chdir(ignoreDir);
+ return _path.default.relative(ignoreDir, filePath);
+ } // Otherwise, we'll set the cwd to the atom project root as long as that exists
+
+
+ if (projectPath) {
+ process.chdir(projectPath);
+ return _path.default.relative(projectPath, filePath);
+ } // If all else fails, use the file location itself
+
+
+ process.chdir(fileDir);
+ return _path.default.basename(filePath);
+}
+
+function getCLIEngineOptions(type, config, rules, filePath, fileConfig) {
+ const cliEngineConfig = {
+ rules,
+ ignore: !config.advanced.disableEslintIgnore,
+ fix: type === 'fix'
+ };
+ cliEngineConfig.rulePaths = config.advanced.eslintRulesDirs.map(path => {
+ const rulesDir = cleanPath(path);
+
+ if (!_path.default.isAbsolute(rulesDir)) {
+ return (0, _atomLinter.findCached)(_path.default.dirname(filePath), rulesDir);
+ }
+
+ return rulesDir;
+ }).filter(path => path);
+
+ if (fileConfig === null && config.global.eslintrcPath) {
+ // If we didn't find a configuration use the fallback from the settings
+ cliEngineConfig.configFile = cleanPath(config.global.eslintrcPath);
+ }
+
+ return cliEngineConfig;
+}
+/**
+ * Gets the list of rules used for a lint job
+ * @param {Object} cliEngine The CLIEngine instance used for the lint job
+ * @return {Map} A Map of the rules used, rule names as keys, rule
+ * properties as the contents.
+ */
+
+
+function getRules(cliEngine) {
+ // Pull the list of rules used directly from the CLIEngine
+ // Added in https://github.com/eslint/eslint/pull/9782
+ if (Object.prototype.hasOwnProperty.call(cliEngine, 'getRules')) {
+ return cliEngine.getRules();
+ } // Attempt to use the internal (undocumented) `linter` instance attached to
+ // the CLIEngine to get the loaded rules (including plugin rules).
+ // Added in ESLint v4
+
+
+ if (Object.prototype.hasOwnProperty.call(cliEngine, 'linter')) {
+ return cliEngine.linter.getRules();
+ } // Older versions of ESLint don't (easily) support getting a list of rules
+
+
+ return new Map();
+}
+/**
+ * Given an exiting rule list and a new rule list, determines whether there
+ * have been changes.
+ * NOTE: This only accounts for presence of the rules, changes to their metadata
+ * are not taken into account.
+ * @param {Map} newRules A Map of the new rules
+ * @param {Map} currentRules A Map of the current rules
+ * @return {boolean} Whether or not there were changes
+ */
+
+
+function didRulesChange(currentRules, newRules) {
+ return !(currentRules.size === newRules.size && Array.from(currentRules.keys()).every(ruleId => newRules.has(ruleId)));
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93b3JrZXItaGVscGVycy5qcyJdLCJuYW1lcyI6WyJDYWNoZSIsIkVTTElOVF9MT0NBTF9QQVRIIiwiUGF0aCIsIm5vcm1hbGl6ZSIsImpvaW4iLCJfX2Rpcm5hbWUiLCJOT0RFX1BSRUZJWF9QQVRIIiwiTEFTVF9NT0RVTEVTX1BBVEgiLCJjbGVhblBhdGgiLCJwYXRoIiwiZnMiLCJnZXROb2RlUHJlZml4UGF0aCIsIm5wbUNvbW1hbmQiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJDaGlsZFByb2Nlc3MiLCJzcGF3blN5bmMiLCJlbnYiLCJPYmplY3QiLCJhc3NpZ24iLCJQQVRIIiwib3V0cHV0IiwidG9TdHJpbmciLCJ0cmltIiwiZSIsImVyck1zZyIsIkVycm9yIiwiaXNEaXJlY3RvcnkiLCJkaXJQYXRoIiwiaXNEaXIiLCJzdGF0U3luYyIsImZhbGxiYWNrRm9yR2xvYmFsRXJyb3JUaHJvd24iLCJmaW5kRVNMaW50RGlyZWN0b3J5IiwibW9kdWxlc0RpciIsImNvbmZpZyIsInByb2plY3RQYXRoIiwiZmFsbGJhY2tGb3JHbG9iYWwiLCJlc2xpbnREaXIiLCJsb2NhdGlvblR5cGUiLCJnbG9iYWwiLCJ1c2VHbG9iYWxFc2xpbnQiLCJjb25maWdHbG9iYWwiLCJnbG9iYWxOb2RlUGF0aCIsInByZWZpeFBhdGgiLCJhZHZhbmNlZCIsImxvY2FsTm9kZU1vZHVsZXMiLCJpc0Fic29sdXRlIiwidHlwZSIsImNvbnNvbGUiLCJlcnJvciIsImdldEVTTGludEZyb21EaXJlY3RvcnkiLCJFU0xpbnREaXJlY3RvcnkiLCJyZXF1aXJlIiwiY29kZSIsInJlZnJlc2hNb2R1bGVzUGF0aCIsIk5PREVfUEFUSCIsIk1vZHVsZSIsIl9pbml0UGF0aHMiLCJnZXRFU0xpbnRJbnN0YW5jZSIsImZpbGVEaXIiLCJkaXJuYW1lIiwiZ2V0Q29uZmlnRm9yRmlsZSIsImVzbGludCIsImZpbGVQYXRoIiwiY2xpIiwiQ0xJRW5naW5lIiwiZ2V0UmVsYXRpdmVQYXRoIiwiaWdub3JlRmlsZSIsImRpc2FibGVFc2xpbnRJZ25vcmUiLCJpZ25vcmVEaXIiLCJjaGRpciIsInJlbGF0aXZlIiwiYmFzZW5hbWUiLCJnZXRDTElFbmdpbmVPcHRpb25zIiwicnVsZXMiLCJmaWxlQ29uZmlnIiwiY2xpRW5naW5lQ29uZmlnIiwiaWdub3JlIiwiZml4IiwicnVsZVBhdGhzIiwiZXNsaW50UnVsZXNEaXJzIiwibWFwIiwicnVsZXNEaXIiLCJmaWx0ZXIiLCJlc2xpbnRyY1BhdGgiLCJjb25maWdGaWxlIiwiZ2V0UnVsZXMiLCJjbGlFbmdpbmUiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJsaW50ZXIiLCJNYXAiLCJkaWRSdWxlc0NoYW5nZSIsImN1cnJlbnRSdWxlcyIsIm5ld1J1bGVzIiwic2l6ZSIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJldmVyeSIsInJ1bGVJZCIsImhhcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsS0FBSyxHQUFHO0FBQ1pDLEVBQUFBLGlCQUFpQixFQUFFQyxjQUFLQyxTQUFMLENBQWVELGNBQUtFLElBQUwsQ0FBVUMsU0FBVixFQUFxQixJQUFyQixFQUEyQixjQUEzQixFQUEyQyxRQUEzQyxDQUFmLENBRFA7QUFFWkMsRUFBQUEsZ0JBQWdCLEVBQUUsSUFGTjtBQUdaQyxFQUFBQSxpQkFBaUIsRUFBRTtBQUhQLENBQWQ7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsU0FBUyxHQUFHQyxJQUFJLElBQUtBLElBQUksR0FBRyx5QkFBV0MsZ0JBQUdQLFNBQUgsQ0FBYU0sSUFBYixDQUFYLENBQUgsR0FBb0MsRUFBbkU7O0FBRU8sU0FBU0UsaUJBQVQsR0FBNkI7QUFDbEMsTUFBSVgsS0FBSyxDQUFDTSxnQkFBTixLQUEyQixJQUEvQixFQUFxQztBQUNuQyxVQUFNTSxVQUFVLEdBQUdDLE9BQU8sQ0FBQ0MsUUFB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QUNBO0FBQ0E7OztBQUNPLFNBQVNDLGNBQVQsQ0FBd0JDLFlBQXhCLEVBQXNDQyxRQUF0QyxFQUFnRDtBQUNyRCxTQUFPLEVBQUVELFlBQVksQ0FBQ0UsSUFBYixLQUFzQkQsUUFBUSxDQUFDQyxJQUEvQixJQUNKQyxLQUFLLENBQUNDLElBQU4sQ0FBV0osWUFBWSxDQUFDSyxJQUFiLEVBQVgsRUFBZ0NDLEtBQWhDLENBQXNDQyxNQUFNLElBQUlOLFFBQVEsQ0FBQ08sR0FBVCxDQUFhRCxNQUFiLENBQWhELENBREUsQ0FBUDtBQUVEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcy1wbHVzJ1xuaW1wb3J0IENoaWxkUHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHJlc29sdmVFbnYgZnJvbSAncmVzb2x2ZS1lbnYnXG5pbXBvcnQgeyBmaW5kQ2FjaGVkIH0gZnJvbSAnYXRvbS1saW50ZXInXG5pbXBvcnQgZ2V0UGF0aCBmcm9tICdjb25zaXN0ZW50LXBhdGgnXG5cbmNvbnN0IENhY2hlID0ge1xuICBFU0xJTlRfTE9DQUxfUEFUSDogUGF0aC5ub3JtYWxpemUoUGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ25vZGVfbW9kdWxlcycsICdlc2xpbnQnKSksXG4gIE5PREVfUFJFRklYX1BBVEg6IG51bGwsXG4gIExBU1RfTU9EVUxFU19QQVRIOiBudWxsXG59XG5cbi8qKlxuICogVGFrZXMgYSBwYXRoIGFuZCB0cmFuc2xhdGVzIGB+YCB0byB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCBhbmQgcmVwbGFjZXNcbiAqIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB0aGVpciB2YWx1ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byByZW1vdmUgXCJzdHJhbmdlbmVzc1wiIGZyb21cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICBUaGUgY2xlYW5lZCBwYXRoXG4gKi9cbmNvbnN0IGNsZWFuUGF0aCA9IHBhdGggPT4gKHBhdGggPyByZXNvbHZlRW52KGZzLm5vcm1hbGl6ZShwYXRoKSkgOiAnJylcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVQcmVmaXhQYXRoKCkge1xuICBpZiAoQ2FjaGUuTk9ERV9QUkVGSVhfUEFUSCA9PT0gbnVsbCkge1xuICAgIGNvbnN0IG5wbUNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ25wbS5jbWQnIDogJ25wbSdcbiAgICB0cnkge1xuICAgICAgQ2FjaGUuTk9ERV9QUkVGSVhfUEFUSCA9IENoaWxkUHJvY2Vzcy5zcGF3blN5bmMobnBtQ29tbWFuZCwgWydnZXQnLCAncHJlZml4J10sIHtcbiAgICAgICAgZW52OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52KSwgeyBQQVRIOiBnZXRQYXRoKCkgfSlcbiAgICAgIH0pLm91dHB1dFsxXS50b1N0cmluZygpLnRyaW0oKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGVyck1zZyA9ICdVbmFibGUgdG8gZXhlY3V0ZSBgbnBtIGdldCBwcmVmaXhgLiBQbGVhc2UgbWFrZSBzdXJlICdcbiAgICAgICAgKyAnQXRvbSBpcyBnZXR0aW5nICRQQVRIIGNvcnJlY3RseS4nXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKVxuICAgIH1cbiAgfVxuICByZXR1cm4gQ2FjaGUuTk9ERV9QUkVGSVhfUEFUSFxufVxuXG5mdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoKSB7XG4gIGxldCBpc0RpclxuICB0cnkge1xuICAgIGlzRGlyID0gZnMuc3RhdFN5bmMoZGlyUGF0aCkuaXNEaXJlY3RvcnkoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgaXNEaXIgPSBmYWxzZVxuICB9XG4gIHJldHVybiBpc0RpclxufVxuXG5sZXQgZmFsbGJhY2tGb3JHbG9iYWxFcnJvclRocm93biA9IGZhbHNlXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRVNMaW50RGlyZWN0b3J5KG1vZHVsZXNEaXIsIGNvbmZpZywgcHJvamVjdFBhdGgsIGZhbGxiYWNrRm9yR2xvYmFsID0gZmFsc2UpIHtcbiAgbGV0IGVzbGludERpciA9IG51bGxcbiAgbGV0IGxvY2F0aW9uVHlwZSA9IG51bGxcbiAgaWYgKGNvbmZpZy5nbG9iYWwudXNlR2xvYmFsRXNsaW50ICYmICFmYWxsYmFja0Zvckdsb2JhbCkge1xuICAgIGxvY2F0aW9uVHlwZSA9ICdnbG9iYWwnXG4gICAgY29uc3QgY29uZmlnR2xvYmFsID0gY2xlYW5QYXRoKGNvbmZpZy5nbG9iYWwuZ2xvYmFsTm9kZVBhdGgpXG4gICAgY29uc3QgcHJlZml4UGF0aCA9IGNvbmZpZ0dsb2JhbCB8fCBnZXROb2RlUHJlZml4UGF0aCgpXG4gICAgLy8gTlBNIG9uIFdpbmRvd3MgYW5kIFlhcm4gb24gYWxsIHBsYXRmb3Jtc1xuICAgIGVzbGludERpciA9IFBhdGguam9pbihwcmVmaXhQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ2VzbGludCcpXG4gICAgaWYgKCFpc0RpcmVjdG9yeShlc2xpbnREaXIpKSB7XG4gICAgICAvLyBOUE0gb24gcGxhdGZvcm1zIG90aGVyIHRoYW4gV2luZG93c1xuICAgICAgZXNsaW50RGlyID0gUGF0aC5qb2luKHByZWZpeFBhdGgsICdsaWInLCAnbm9kZV9tb2R1bGVzJywgJ2VzbGludCcpXG4gICAgfVxuICB9IGVsc2UgaWYgKCFjb25maWcuYWR2YW5jZWQubG9jYWxOb2RlTW9kdWxlcykge1xuICAgIGxvY2F0aW9uVHlwZSA9ICdsb2NhbCBwcm9qZWN0J1xuICAgIGVzbGludERpciA9IFBhdGguam9pbihtb2R1bGVzRGlyIHx8ICcnLCAnZXNsaW50JylcbiAgfSBlbHNlIGlmIChQYXRoLmlzQWJzb2x1dGUoY2xlYW5QYXRoKGNvbmZpZy5hZHZhbmNlZC5sb2NhbE5vZGVNb2R1bGVzKSkpIHtcbiAgICBsb2NhdGlvblR5cGUgPSAnYWR2YW5jZWQgc3BlY2lmaWVkJ1xuICAgIGVzbGludERpciA9IFBhdGguam9pbihjbGVhblBhdGgoY29uZmlnLmFkdmFuY2VkLmxvY2FsTm9kZU1vZHVsZXMpLCAnZXNsaW50JylcbiAgfSBlbHNlIHtcbiAgICBsb2NhdGlvblR5cGUgPSAnYWR2YW5jZWQgc3BlY2lmaWVkJ1xuICAgIGVzbGludERpciA9IFBhdGguam9pbihwcm9qZWN0UGF0aCB8fCAnJywgY2xlYW5QYXRoKGNvbmZpZy5hZHZhbmNlZC5sb2NhbE5vZGVNb2R1bGVzKSwgJ2VzbGludCcpXG4gIH1cblxuICBpZiAoaXNEaXJlY3RvcnkoZXNsaW50RGlyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBlc2xpbnREaXIsXG4gICAgICB0eXBlOiBsb2NhdGlvblR5cGUsXG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5nbG9iYWwudXNlR2xvYmFsRXNsaW50ICYmICFmYWxsYmFja0Zvckdsb2JhbCkge1xuICAgIGlmICghZmFsbGJhY2tGb3JHbG9iYWxFcnJvclRocm93bikge1xuICAgICAgLy8gVGhyb3cgdGhlIGVycm9yIG9ubHkgb25jZSB0byBwcmV2ZW50IHBlcmZvcm1hbmNlIGlzc3Vlc1xuICAgICAgZmFsbGJhY2tGb3JHbG9iYWxFcnJvclRocm93biA9IHRydWVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEdsb2JhbCBFU0xpbnQgaXMgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gb3RoZXIgRXNsaW50IGluc3RhbGxhdGlvbnMuLi5cbiAgICAgICAgUGxlYXNlIGVuc3VyZSB0aGUgZ2xvYmFsIE5vZGUgcGF0aCBpcyBzZXQgY29ycmVjdGx5LlxuICAgICAgICBJZiB5b3Ugd2FudGVkIHRvIHVzZSBhIGxvY2FsIGluc3RhbGxhdGlvbiBvZiBFc2xpbnQsIGRpc2FibGUgR2xvYmFsIEVzbGludCBvcHRpb24gaW4gdGhlIGxpbnRlci1lc2xpbnQgY29uZmlnLmApXG4gICAgfVxuICAgIHJldHVybiBmaW5kRVNMaW50RGlyZWN0b3J5KG1vZHVsZXNEaXIsIGNvbmZpZywgcHJvamVjdFBhdGgsIHRydWUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhdGg6IENhY2hlLkVTTElOVF9MT0NBTF9QQVRILFxuICAgIHR5cGU6ICdidW5kbGVkIGZhbGxiYWNrJyxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RVNMaW50RnJvbURpcmVjdG9yeShtb2R1bGVzRGlyLCBjb25maWcsIHByb2plY3RQYXRoKSB7XG4gIGNvbnN0IHsgcGF0aDogRVNMaW50RGlyZWN0b3J5IH0gPSBmaW5kRVNMaW50RGlyZWN0b3J5KG1vZHVsZXNEaXIsIGNvbmZpZywgcHJvamVjdFBhdGgpXG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1keW5hbWljLXJlcXVpcmVcbiAgICByZXR1cm4gcmVxdWlyZShFU0xpbnREaXJlY3RvcnkpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoY29uZmlnLmdsb2JhbC51c2VHbG9iYWxFc2xpbnQgJiYgZS5jb2RlID09PSAnTU9EVUxFX05PVF9GT1VORCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRVNMaW50IG5vdCBmb3VuZCwgdHJ5IHJlc3RhcnRpbmcgQXRvbSB0byBjbGVhciBjYWNoZXMuJylcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1keW5hbWljLXJlcXVpcmVcbiAgICByZXR1cm4gcmVxdWlyZShDYWNoZS5FU0xJTlRfTE9DQUxfUEFUSClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaE1vZHVsZXNQYXRoKG1vZHVsZXNEaXIpIHtcbiAgaWYgKENhY2hlLkxBU1RfTU9EVUxFU19QQVRIICE9PSBtb2R1bGVzRGlyKSB7XG4gICAgQ2FjaGUuTEFTVF9NT0RVTEVTX1BBVEggPSBtb2R1bGVzRGlyXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9QQVRIID0gbW9kdWxlc0RpciB8fCAnJ1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgIHJlcXVpcmUoJ21vZHVsZScpLk1vZHVsZS5faW5pdFBhdGhzKClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RVNMaW50SW5zdGFuY2UoZmlsZURpciwgY29uZmlnLCBwcm9qZWN0UGF0aCkge1xuICBjb25zdCBtb2R1bGVzRGlyID0gUGF0aC5kaXJuYW1lKGZpbmRDYWNoZWQoZmlsZURpciwgJ25vZGVfbW9kdWxlcy9lc2xpbnQnKSB8fCAnJylcbiAgcmVmcmVzaE1vZHVsZXNQYXRoKG1vZHVsZXNEaXIpXG4gIHJldHVybiBnZXRFU0xpbnRGcm9tRGlyZWN0b3J5KG1vZHVsZXNEaXIsIGNvbmZpZywgcHJvamVjdFBhdGgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdGb3JGaWxlKGVzbGludCwgZmlsZVBhdGgpIHtcbiAgY29uc3QgY2xpID0gbmV3IGVzbGludC5DTElFbmdpbmUoKVxuICB0cnkge1xuICAgIHJldHVybiBjbGkuZ2V0Q29uZmlnRm9yRmlsZShmaWxlUGF0aClcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIE5vIGNvbmZpZ3VyYXRpb24gd2FzIGZvdW5kXG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQYXRoKGZpbGVEaXIsIGZpbGVQYXRoLCBjb25maWcsIHByb2plY3RQYXRoKSB7XG4gIGNvbnN0IGlnbm9yZUZpbGUgPSBjb25maWcuYWR2YW5jZWQuZGlzYWJsZUVzbGludElnbm9yZSA/IG51bGwgOiBmaW5kQ2FjaGVkKGZpbGVEaXIsICcuZXNsaW50aWdub3JlJylcblxuICAvLyBJZiB3ZSBjYW4gZmluZCBhbiAuZXNsaW50aWdub3JlIGZpbGUsIHdlIGNhbiBzZXQgY3dkIHRoZXJlXG4gIC8vIChiZWNhdXNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIGF0IHRoZSBwcm9qZWN0IHJvb3QpXG4gIGlmIChpZ25vcmVGaWxlKSB7XG4gICAgY29uc3QgaWdub3JlRGlyID0gUGF0aC5kaXJuYW1lKGlnbm9yZUZpbGUpXG4gICAgcHJvY2Vzcy5jaGRpcihpZ25vcmVEaXIpXG4gICAgcmV0dXJuIFBhdGgucmVsYXRpdmUoaWdub3JlRGlyLCBmaWxlUGF0aClcbiAgfVxuICAvLyBPdGhlcndpc2UsIHdlJ2xsIHNldCB0aGUgY3dkIHRvIHRoZSBhdG9tIHByb2plY3Qgcm9vdCBhcyBsb25nIGFzIHRoYXQgZXhpc3RzXG4gIGlmIChwcm9qZWN0UGF0aCkge1xuICAgIHByb2Nlc3MuY2hkaXIocHJvamVjdFBhdGgpXG4gICAgcmV0dXJuIFBhdGgucmVsYXRpdmUocHJvamVjdFBhdGgsIGZpbGVQYXRoKVxuICB9XG4gIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgdGhlIGZpbGUgbG9jYXRpb24gaXRzZWxmXG4gIHByb2Nlc3MuY2hkaXIoZmlsZURpcilcbiAgcmV0dXJuIFBhdGguYmFzZW5hbWUoZmlsZVBhdGgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDTElFbmdpbmVPcHRpb25zKHR5cGUsIGNvbmZpZywgcnVsZXMsIGZpbGVQYXRoLCBmaWxlQ29uZmlnKSB7XG4gIGNvbnN0IGNsaUVuZ2luZUNvbmZpZyA9IHtcbiAgICBydWxlcyxcbiAgICBpZ25vcmU6ICFjb25maWcuYWR2YW5jZWQuZGlzYWJsZUVzbGludElnbm9yZSxcbiAgICBmaXg6IHR5cGUgPT09ICdmaXgnXG4gIH1cblxuICBjbGlFbmdpbmVDb25maWcucnVsZVBhdGhzID0gY29uZmlnLmFkdmFuY2VkLmVzbGludFJ1bGVzRGlycy5tYXAoKHBhdGgpID0+IHtcbiAgICBjb25zdCBydWxlc0RpciA9IGNsZWFuUGF0aChwYXRoKVxuICAgIGlmICghUGF0aC5pc0Fic29sdXRlKHJ1bGVzRGlyKSkge1xuICAgICAgcmV0dXJuIGZpbmRDYWNoZWQoUGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgcnVsZXNEaXIpXG4gICAgfVxuICAgIHJldHVybiBydWxlc0RpclxuICB9KS5maWx0ZXIocGF0aCA9PiBwYXRoKVxuXG4gIGlmIChmaWxlQ29uZmlnID09PSBudWxsICYmIGNvbmZpZy5nbG9iYWwuZXNsaW50cmNQYXRoKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYSBjb25maWd1cmF0aW9uIHVzZSB0aGUgZmFsbGJhY2sgZnJvbSB0aGUgc2V0dGluZ3NcbiAgICBjbGlFbmdpbmVDb25maWcuY29uZmlnRmlsZSA9IGNsZWFuUGF0aChjb25maWcuZ2xvYmFsLmVzbGludHJjUGF0aClcbiAgfVxuXG4gIHJldHVybiBjbGlFbmdpbmVDb25maWdcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IG9mIHJ1bGVzIHVzZWQgZm9yIGEgbGludCBqb2JcbiAqIEBwYXJhbSAge09iamVjdH0gY2xpRW5naW5lIFRoZSBDTElFbmdpbmUgaW5zdGFuY2UgdXNlZCBmb3IgdGhlIGxpbnQgam9iXG4gKiBAcmV0dXJuIHtNYXB9ICAgICAgICAgICAgICBBIE1hcCBvZiB0aGUgcnVsZXMgdXNlZCwgcnVsZSBuYW1lcyBhcyBrZXlzLCBydWxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIGFzIHRoZSBjb250ZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bGVzKGNsaUVuZ2luZSkge1xuICAvLyBQdWxsIHRoZSBsaXN0IG9mIHJ1bGVzIHVzZWQgZGlyZWN0bHkgZnJvbSB0aGUgQ0xJRW5naW5lXG4gIC8vIEFkZGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L3B1bGwvOTc4MlxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNsaUVuZ2luZSwgJ2dldFJ1bGVzJykpIHtcbiAgICByZXR1cm4gY2xpRW5naW5lLmdldFJ1bGVzKClcbiAgfVxuXG4gIC8vIEF0dGVtcHQgdG8gdXNlIHRoZSBpbnRlcm5hbCAodW5kb2N1bWVudGVkKSBgbGludGVyYCBpbnN0YW5jZSBhdHRhY2hlZCB0b1xuICAvLyB0aGUgQ0xJRW5naW5lIHRvIGdldCB0aGUgbG9hZGVkIHJ1bGVzIChpbmNsdWRpbmcgcGx1Z2luIHJ1bGVzKS5cbiAgLy8gQWRkZWQgaW4gRVNMaW50IHY0XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2xpRW5naW5lLCAnbGludGVyJykpIHtcbiAgICByZXR1cm4gY2xpRW5naW5lLmxpbnRlci5nZXRSdWxlcygpXG4gIH1cblxuICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBFU0xpbnQgZG9uJ3QgKGVhc2lseSkgc3VwcG9ydCBnZXR0aW5nIGEgbGlzdCBvZiBydWxlc1xuICByZXR1cm4gbmV3IE1hcCgpXG59XG5cbi8qKlxuICogR2l2ZW4gYW4gZXhpdGluZyBydWxlIGxpc3QgYW5kIGEgbmV3IHJ1bGUgbGlzdCwgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlXG4gKiBoYXZlIGJlZW4gY2hhbmdlcy5cbiAqIE5PVEU6IFRoaXMgb25seSBhY2NvdW50cyBmb3IgcHJlc2VuY2Ugb2YgdGhlIHJ1bGVzLCBjaGFuZ2VzIHRvIHRoZWlyIG1ldGFkYXRhXG4gKiBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudC5cbiAqIEBwYXJhbSAge01hcH0gbmV3UnVsZXMgICAgIEEgTWFwIG9mIHRoZSBuZXcgcnVsZXNcbiAqIEBwYXJhbSAge01hcH0gY3VycmVudFJ1bGVzIEEgTWFwIG9mIHRoZSBjdXJyZW50IHJ1bGVzXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGVyZSB3ZXJlIGNoYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZFJ1bGVzQ2hhbmdlKGN1cnJlbnRSdWxlcywgbmV3UnVsZXMpIHtcbiAgcmV0dXJuICEoY3VycmVudFJ1bGVzLnNpemUgPT09IG5ld1J1bGVzLnNpemVcbiAgICAmJiBBcnJheS5mcm9tKGN1cnJlbnRSdWxlcy5rZXlzKCkpLmV2ZXJ5KHJ1bGVJZCA9PiBuZXdSdWxlcy5oYXMocnVsZUlkKSkpXG59XG4iXX0=
\ No newline at end of file
diff --git a/dist/worker.js b/dist/worker.js
new file mode 100644
index 00000000..af4dce6a
--- /dev/null
+++ b/dist/worker.js
@@ -0,0 +1,133 @@
+"use strict";
+
+var _path = _interopRequireDefault(require("path"));
+
+var _atomLinter = require("atom-linter");
+
+var Helpers = _interopRequireWildcard(require("./worker-helpers"));
+
+function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* global emit */
+process.title = 'linter-eslint helper';
+const rulesMetadata = new Map();
+let shouldSendRules = false;
+
+function lintJob({
+ cliEngineOptions,
+ contents,
+ eslint,
+ filePath
+}) {
+ const cliEngine = new eslint.CLIEngine(cliEngineOptions);
+ const report = cliEngine.executeOnText(contents, filePath);
+ const rules = Helpers.getRules(cliEngine);
+ shouldSendRules = Helpers.didRulesChange(rulesMetadata, rules);
+
+ if (shouldSendRules) {
+ // Rebuild rulesMetadata
+ rulesMetadata.clear();
+ rules.forEach((properties, rule) => rulesMetadata.set(rule, properties));
+ }
+
+ return report;
+}
+
+function fixJob({
+ cliEngineOptions,
+ contents,
+ eslint,
+ filePath
+}) {
+ const report = lintJob({
+ cliEngineOptions,
+ contents,
+ eslint,
+ filePath
+ });
+ eslint.CLIEngine.outputFixes(report);
+
+ if (!report.results.length || !report.results[0].messages.length) {
+ return 'Linter-ESLint: Fix complete.';
+ }
+
+ return 'Linter-ESLint: Fix attempt complete, but linting errors remain.';
+}
+
+module.exports = async () => {
+ process.on('message', jobConfig => {
+ // We catch all worker errors so that we can create a separate error emitter
+ // for each emitKey, rather than adding multiple listeners for `task:error`
+ const {
+ contents,
+ type,
+ config,
+ filePath,
+ projectPath,
+ rules,
+ emitKey
+ } = jobConfig;
+
+ try {
+ if (config.advanced.disableFSCache) {
+ _atomLinter.FindCache.clear();
+ }
+
+ const fileDir = _path.default.dirname(filePath);
+
+ const eslint = Helpers.getESLintInstance(fileDir, config, projectPath);
+ const fileConfig = Helpers.getConfigForFile(eslint, filePath);
+
+ if (fileConfig === null && config.disabling.disableWhenNoEslintConfig) {
+ emit(emitKey, {
+ messages: []
+ });
+ return;
+ }
+
+ const relativeFilePath = Helpers.getRelativePath(fileDir, filePath, config, projectPath);
+ const cliEngineOptions = Helpers.getCLIEngineOptions(type, config, rules, relativeFilePath, fileConfig);
+ let response;
+
+ if (type === 'lint') {
+ const report = lintJob({
+ cliEngineOptions,
+ contents,
+ eslint,
+ filePath
+ });
+ response = {
+ messages: report.results.length ? report.results[0].messages : []
+ };
+
+ if (shouldSendRules) {
+ // You can't emit Maps, convert to Array of Arrays to send back.
+ response.updatedRules = Array.from(rulesMetadata);
+ }
+ } else if (type === 'fix') {
+ response = fixJob({
+ cliEngineOptions,
+ contents,
+ eslint,
+ filePath
+ });
+ } else if (type === 'debug') {
+ const modulesDir = _path.default.dirname((0, _atomLinter.findCached)(fileDir, 'node_modules/eslint') || '');
+
+ response = Helpers.findESLintDirectory(modulesDir, config, projectPath);
+ }
+
+ emit(emitKey, response);
+ } catch (workerErr) {
+ emit(`workerError:${emitKey}`, {
+ msg: workerErr.message,
+ stack: workerErr.stack
+ });
+ }
+ });
+};
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93b3JrZXIuanMiXSwibmFtZXMiOlsicHJvY2VzcyIsInRpdGxlIiwicnVsZXNNZXRhZGF0YSIsIk1hcCIsInNob3VsZFNlbmRSdWxlcyIsImxpbnRKb2IiLCJjbGlFbmdpbmVPcHRpb25zIiwiY29udGVudHMiLCJlc2xpbnQiLCJmaWxlUGF0aCIsImNsaUVuZ2luZSIsIkNMSUVuZ2luZSIsInJlcG9ydCIsImV4ZWN1dGVPblRleHQiLCJydWxlcyIsIkhlbHBlcnMiLCJnZXRSdWxlcyIsImRpZFJ1bGVzQ2hhbmdlIiwiY2xlYXIiLCJmb3JFYWNoIiwicHJvcGVydGllcyIsInJ1bGUiLCJzZXQiLCJmaXhKb2IiLCJvdXRwdXRGaXhlcyIsInJlc3VsdHMiLCJsZW5ndGgiLCJtZXNzYWdlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJvbiIsImpvYkNvbmZpZyIsInR5cGUiLCJjb25maWciLCJwcm9qZWN0UGF0aCIsImVtaXRLZXkiLCJhZHZhbmNlZCIsImRpc2FibGVGU0NhY2hlIiwiRmluZENhY2hlIiwiZmlsZURpciIsIlBhdGgiLCJkaXJuYW1lIiwiZ2V0RVNMaW50SW5zdGFuY2UiLCJmaWxlQ29uZmlnIiwiZ2V0Q29uZmlnRm9yRmlsZSIsImRpc2FibGluZyIsImRpc2FibGVXaGVuTm9Fc2xpbnRDb25maWciLCJlbWl0IiwicmVsYXRpdmVGaWxlUGF0aCIsImdldFJlbGF0aXZlUGF0aCIsImdldENMSUVuZ2luZU9wdGlvbnMiLCJyZXNwb25zZSIsInVwZGF0ZWRSdWxlcyIsIkFycmF5IiwiZnJvbSIsIm1vZHVsZXNEaXIiLCJmaW5kRVNMaW50RGlyZWN0b3J5Iiwid29ya2VyRXJyIiwibXNnIiwibWVzc2FnZSIsInN0YWNrIl0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7OztBQUpBO0FBTUFBLE9BQU8sQ0FBQ0MsS0FBUixHQUFnQixzQkFBaEI7QUFFQSxNQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBSixFQUF0QjtBQUNBLElB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QTRCRCxVQUE1QixFQUF3Q3RCLE1BQXhDLEVBQWdEQyxXQUFoRCxDQUFYO0FBQ0Q7O0FBQ0RhLE1BQUFBLElBQUksQ0FBQ1osT0FBRCxFQUFVZ0IsUUFBVixDQUFKO0FBQ0QsS0FwQ0QsQ0FvQ0UsT0FBT00sU0FBUCxFQUFrQjtBQUNsQlYsTUFBQUEsSUFBSSxDQUFFLGVBQWNaLE9BQVEsRUFBeEIsRUFBMkI7QUFBRXVCLFFBQUFBLEdBQUcsRUFBRUQsU0FBUyxDQUFDRSxPQUFqQjtBQUEwQkMsUUFBQUEsS0FBSyxFQUFFSCxTQUFTLENBQUNHO0FBQTNDLE9BQTNCLENBQUo7QUFDRDtBQUNGLEdBN0NEO0FBOENELENBL0NEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIGVtaXQgKi9cblxuaW1wb3J0IFBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IEZpbmRDYWNoZSwgZmluZENhY2hlZCB9IGZyb20gJ2F0b20tbGludGVyJ1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tICcuL3dvcmtlci1oZWxwZXJzJ1xuXG5wcm9jZXNzLnRpdGxlID0gJ2xpbnRlci1lc2xpbnQgaGVscGVyJ1xuXG5jb25zdCBydWxlc01ldGFkYXRhID0gbmV3IE1hcCgpXG5sZXQgc2hvdWxkU2VuZFJ1bGVzID0gZmFsc2VcblxuZnVuY3Rpb24gbGludEpvYih7IGNsaUVuZ2luZU9wdGlvbnMsIGNvbnRlbnRzLCBlc2xpbnQsIGZpbGVQYXRoIH0pIHtcbiAgY29uc3QgY2xpRW5naW5lID0gbmV3IGVzbGludC5DTElFbmdpbmUoY2xpRW5naW5lT3B0aW9ucylcbiAgY29uc3QgcmVwb3J0ID0gY2xpRW5naW5lLmV4ZWN1dGVPblRleHQoY29udGVudHMsIGZpbGVQYXRoKVxuICBjb25zdCBydWxlcyA9IEhlbHBlcnMuZ2V0UnVsZXMoY2xpRW5naW5lKVxuICBzaG91bGRTZW5kUnVsZXMgPSBIZWxwZXJzLmRpZFJ1bGVzQ2hhbmdlKHJ1bGVzTWV0YWRhdGEsIHJ1bGVzKVxuICBpZiAoc2hvdWxkU2VuZFJ1bGVzKSB7XG4gICAgLy8gUmVidWlsZCBydWxlc01ldGFkYXRhXG4gICAgcnVsZXNNZXRhZGF0YS5jbGVhcigpXG4gICAgcnVsZXMuZm9yRWFjaCgocHJvcGVydGllcywgcnVsZSkgPT4gcnVsZXNNZXRhZGF0YS5zZXQocnVsZSwgcHJvcGVydGllcykpXG4gIH1cbiAgcmV0dXJuIHJlcG9ydFxufVxuXG5mdW5jdGlvbiBmaXhKb2IoeyBjbGlFbmdpbmVPcHRpb25zLCBjb250ZW50cywgZXNsaW50LCBmaWxlUGF0aCB9KSB7XG4gIGNvbnN0IHJlcG9ydCA9IGxpbnRKb2IoeyBjbGlFbmdpbmVPcHRpb25zLCBjb250ZW50cywgZXNsaW50LCBmaWxlUGF0aCB9KVxuXG4gIGVzbGludC5DTElFbmdpbmUub3V0cHV0Rml4ZXMocmVwb3J0KVxuXG4gIGlmICghcmVwb3J0LnJlc3VsdHMubGVuZ3RoIHx8ICFyZXBvcnQucmVzdWx0c1swXS5tZXNzYWdlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJ0xpbnRlci1FU0xpbnQ6IEZpeCBjb21wbGV0ZS4nXG4gIH1cbiAgcmV0dXJuICdMaW50ZXItRVNMaW50OiBGaXggYXR0ZW1wdCBjb21wbGV0ZSwgYnV0IGxpbnRpbmcgZXJyb3JzIHJlbWFpbi4nXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKCkgPT4ge1xuICBwcm9jZXNzLm9uKCdtZXNzYWdlJywgKGpvYkNvbmZpZykgPT4ge1xuICAgIC8vIFdlIGNhdGNoIGFsbCB3b3JrZXIgZXJyb3JzIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBhIHNlcGFyYXRlIGVycm9yIGVtaXR0ZXJcbiAgICAvLyBmb3IgZWFjaCBlbWl0S2V5LCByYXRoZXIgdGhhbiBhZGRpbmcgbXVsdGlwbGUgbGlzdGVuZXJzIGZvciBgdGFzazplcnJvcmBcbiAgICBjb25zdCB7XG4gICAgICBjb250ZW50cywgdHlwZSwgY29uZmlnLCBmaWxlUGF0aCwgcHJvamVjdFBhdGgsIHJ1bGVzLCBlbWl0S2V5XG4gICAgfSA9IGpvYkNvbmZpZ1xuICAgIHRyeSB7XG4gICAgICBpZiAoY29uZmlnLmFkdmFuY2VkLmRpc2FibGVGU0NhY2hlKSB7XG4gICAgICAgIEZpbmRDYWNoZS5jbGVhcigpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBQYXRoLmRpcm5hbWUoZmlsZVBhdGgpXG4gICAgICBjb25zdCBlc2xpbnQgPSBIZWxwZXJzLmdldEVTTGludEluc3RhbmNlKGZpbGVEaXIsIGNvbmZpZywgcHJvamVjdFBhdGgpXG5cbiAgICAgIGNvbnN0IGZpbGVDb25maWcgPSBIZWxwZXJzLmdldENvbmZpZ0ZvckZpbGUoZXNsaW50LCBmaWxlUGF0aClcbiAgICAgIGlmIChmaWxlQ29uZmlnID09PSBudWxsICYmIGNvbmZpZy5kaXNhYmxpbmcuZGlzYWJsZVdoZW5Ob0VzbGludENvbmZpZykge1xuICAgICAgICBlbWl0KGVtaXRLZXksIHsgbWVzc2FnZXM6IFtdIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gSGVscGVycy5nZXRSZWxhdGl2ZVBhdGgoZmlsZURpciwgZmlsZVBhdGgsIGNvbmZpZywgcHJvamVjdFBhdGgpXG5cbiAgICAgIGNvbnN0IGNsaUVuZ2luZU9wdGlvbnMgPSBIZWxwZXJzXG4gICAgICAgIC5nZXRDTElFbmdpbmVPcHRpb25zKHR5cGUsIGNvbmZpZywgcnVsZXMsIHJlbGF0aXZlRmlsZVBhdGgsIGZpbGVDb25maWcpXG5cbiAgICAgIGxldCByZXNwb25zZVxuICAgICAgaWYgKHR5cGUgPT09ICdsaW50Jykge1xuICAgICAgICBjb25zdCByZXBvcnQgPSBsaW50Sm9iKHsgY2xpRW5naW5lT3B0aW9ucywgY29udGVudHMsIGVzbGludCwgZmlsZVBhdGggfSlcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgbWVzc2FnZXM6IHJlcG9ydC5yZXN1bHRzLmxlbmd0aCA/IHJlcG9ydC5yZXN1bHRzWzBdLm1lc3NhZ2VzIDogW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkU2VuZFJ1bGVzKSB7XG4gICAgICAgICAgLy8gWW91IGNhbid0IGVtaXQgTWFwcywgY29udmVydCB0byBBcnJheSBvZiBBcnJheXMgdG8gc2VuZCBiYWNrLlxuICAgICAgICAgIHJlc3BvbnNlLnVwZGF0ZWRSdWxlcyA9IEFycmF5LmZyb20ocnVsZXNNZXRhZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZml4Jykge1xuICAgICAgICByZXNwb25zZSA9IGZpeEpvYih7IGNsaUVuZ2luZU9wdGlvbnMsIGNvbnRlbnRzLCBlc2xpbnQsIGZpbGVQYXRoIH0pXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlc0RpciA9IFBhdGguZGlybmFtZShmaW5kQ2FjaGVkKGZpbGVEaXIsICdub2RlX21vZHVsZXMvZXNsaW50JykgfHwgJycpXG4gICAgICAgIHJlc3BvbnNlID0gSGVscGVycy5maW5kRVNMaW50RGlyZWN0b3J5KG1vZHVsZXNEaXIsIGNvbmZpZywgcHJvamVjdFBhdGgpXG4gICAgICB9XG4gICAgICBlbWl0KGVtaXRLZXksIHJlc3BvbnNlKVxuICAgIH0gY2F0Y2ggKHdvcmtlckVycikge1xuICAgICAgZW1pdChgd29ya2VyRXJyb3I6JHtlbWl0S2V5fWAsIHsgbXNnOiB3b3JrZXJFcnIubWVzc2FnZSwgc3RhY2s6IHdvcmtlckVyci5zdGFjayB9KVxuICAgIH1cbiAgfSlcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/package.json b/package.json
index b3566541..859de951 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "linter-eslint",
"main": "./dist/main.js",
- "version": "8.6.3",
+ "version": "8.6.4",
"description": "Lint JavaScript on the fly, using ESLint",
"repository": "https://github.com/AtomLinter/linter-eslint.git",
"license": "MIT",