import "core-js/modules/es.error.cause.js"; import "core-js/modules/es.array.push.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.regexp.to-string.js"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"; import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each"; import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"; import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties"; import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property"; import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice"; import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from"; import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol"; import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method"; import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array"; import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator"; var _excluded = ["url", "body"]; function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && _getIteratorMethod(r) || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { var _context8; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context8 = {}.toString.call(r)).call(_context8, 8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import _Promise from "@babel/runtime-corejs3/core-js-stable/promise"; import _setTimeout from "@babel/runtime-corejs3/core-js-stable/set-timeout"; import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes"; import _keysInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/keys"; function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context6, _context7; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context6 = ownKeys(Object(t), !0)).call(_context6, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context7 = ownKeys(Object(t))).call(_context7, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; } import { Readable } from 'stream'; import fetch, { Response } from 'node-fetch'; import createHttpsProxyAgent from 'https-proxy-agent'; import { createHttpRequestHandlerStreams, executeWithTimeout, isRedirect, performRedirectRequest } from './request-helper'; import { getLogger } from './util/logger'; import is from '@sindresorhus/is'; /** * */ var defaults = {}; /** * */ export function setDefaults(defaults_) { defaults = defaults_; } /** * */ function startFetchRequest(_x, _x2, _x3, _x4, _x5) { return _startFetchRequest.apply(this, arguments); } /** * */ function _startFetchRequest() { _startFetchRequest = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(request, options, input, output, emitter) { var _options$retry$status, _options$retry, _options$retry$maxRet, _options$retry2, _options$retry$minTim, _options$retry3, _options$retry$timeou, _options$retry4, _options$retry$errorC, _options$retry5, _options$retry$method, _options$retry6, _options$timeout, _context4; var counter, logger, httpProxy, followRedirect, agent, url, body, rrequest, controller, retryCount, retryOpts, shouldRetryRequest, _fetchWithRetries, res, fetchTimeout, headers, _iterator, _step, headerName, response, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: counter = _args2.length > 5 && _args2[5] !== undefined ? _args2[5] : 0; logger = getLogger('fetch'); httpProxy = options.httpProxy, followRedirect = options.followRedirect; agent = httpProxy ? createHttpsProxyAgent(httpProxy) : undefined; url = request.url, body = request.body, rrequest = _objectWithoutProperties(request, _excluded); controller = new AbortController(); retryCount = 0; retryOpts = { statusCodes: (_options$retry$status = (_options$retry = options.retry) === null || _options$retry === void 0 ? void 0 : _options$retry.statusCodes) !== null && _options$retry$status !== void 0 ? _options$retry$status : [420, 429, 500, 502, 503, 504], maxRetries: (_options$retry$maxRet = (_options$retry2 = options.retry) === null || _options$retry2 === void 0 ? void 0 : _options$retry2.maxRetries) !== null && _options$retry$maxRet !== void 0 ? _options$retry$maxRet : 5, minTimeout: (_options$retry$minTim = (_options$retry3 = options.retry) === null || _options$retry3 === void 0 ? void 0 : _options$retry3.minTimeout) !== null && _options$retry$minTim !== void 0 ? _options$retry$minTim : 500, timeoutFactor: (_options$retry$timeou = (_options$retry4 = options.retry) === null || _options$retry4 === void 0 ? void 0 : _options$retry4.timeoutFactor) !== null && _options$retry$timeou !== void 0 ? _options$retry$timeou : 2, errorCodes: (_options$retry$errorC = (_options$retry5 = options.retry) === null || _options$retry5 === void 0 ? void 0 : _options$retry5.errorCodes) !== null && _options$retry$errorC !== void 0 ? _options$retry$errorC : ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ENETDOWN', 'ENETUNREACH', 'EHOSTDOWN', 'UND_ERR_SOCKET', 'ETIMEDOUT', 'EPIPE'], methods: (_options$retry$method = (_options$retry6 = options.retry) === null || _options$retry6 === void 0 ? void 0 : _options$retry6.methods) !== null && _options$retry$method !== void 0 ? _options$retry$method : ['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE'] }; shouldRetryRequest = function shouldRetryRequest(maxRetry, resOrErr) { var _context; if (!_includesInstanceProperty(_context = retryOpts.methods).call(_context, request.method)) return false; if (resOrErr instanceof Response) { var _context2; if (_includesInstanceProperty(_context2 = retryOpts.statusCodes).call(_context2, resOrErr.status)) { if (maxRetry === retryCount) { return false; } else { return true; } } return false; } else { var _retryOpts$errorCodes; if (maxRetry === retryCount) return false; // only retry on operational errors // https://github.com/node-fetch/node-fetch/blob/2.x/ERROR-HANDLING.md#error-handling-with-node-fetch if (resOrErr.name != 'FetchError') return false; if (is.nodeStream(body) && Readable.isDisturbed(body)) { logger.debug('Body of type stream was read, unable to retry request.'); return false; } if ('code' in resOrErr && resOrErr.code && retryOpts !== null && retryOpts !== void 0 && (_retryOpts$errorCodes = retryOpts.errorCodes) !== null && _retryOpts$errorCodes !== void 0 && _includesInstanceProperty(_retryOpts$errorCodes).call(_retryOpts$errorCodes, resOrErr.code)) return true; return false; } }; _fetchWithRetries = /*#__PURE__*/function () { var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var maxRetry, fetchOpts, _res, error, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: maxRetry = _args.length > 0 && _args[0] !== undefined ? _args[0] : retryOpts === null || retryOpts === void 0 ? void 0 : retryOpts.maxRetries; fetchOpts = _objectSpread(_objectSpread(_objectSpread({}, rrequest), input && /^(post|put|patch)$/i.test(request.method) ? { body: input } : {}), {}, { redirect: 'manual', signal: controller.signal, agent: agent }); _context3.prev = 2; _context3.next = 5; return fetch(url, fetchOpts); case 5: _res = _context3.sent; if (!shouldRetryRequest(retryOpts.maxRetries, _res)) { _context3.next = 16; break; } logger.debug("retrying for the ".concat(retryCount + 1, " time")); logger.debug('reason: statusCode match'); _context3.next = 11; return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount)); case 11: // NOTE: this event is only used by tests and will be removed at any time. // jsforce may switch to node's fetch which doesn't emit this event on retries. emitter.emit('retry', retryCount); retryCount++; _context3.next = 15; return _fetchWithRetries(maxRetry); case 15: return _context3.abrupt("return", _context3.sent); case 16: return _context3.abrupt("return", _res); case 19: _context3.prev = 19; _context3.t0 = _context3["catch"](2); logger.debug('Request failed'); error = _context3.t0; // request was canceled by consumer (AbortController), skip retry and rethrow. if (!(error.name === 'AbortError')) { _context3.next = 25; break; } throw error; case 25: if (!shouldRetryRequest(retryOpts.maxRetries, error)) { _context3.next = 33; break; } logger.debug("retrying for the ".concat(retryCount + 1, " time")); logger.debug("Error: ".concat(_context3.t0.message)); _context3.next = 30; return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount)); case 30: // NOTE: this event is only used by tests and will be removed at any time. // jsforce may switch to node's fetch which doesn't emit this event on retries. emitter.emit('retry', retryCount); retryCount++; return _context3.abrupt("return", _fetchWithRetries(maxRetry)); case 33: logger.debug('Skipping retry...'); if (!(maxRetry === retryCount)) { _context3.next = 38; break; } throw _context3.t0; case 38: throw _context3.t0; case 39: case "end": return _context3.stop(); } }, _callee, null, [[2, 19]]); })); return function fetchWithRetries() { return _ref.apply(this, arguments); }; }(); // Timeout after 5 minutes without a response // // node-fetch's default timeout is 0 and jsforce consumers can't set this when calling `Connection` methods so we set a long default at the fetch wrapper level. fetchTimeout = (_options$timeout = options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : 300000; _context5.prev = 11; _context5.next = 14; return executeWithTimeout(_fetchWithRetries, fetchTimeout, function () { return controller.abort(); }); case 14: res = _context5.sent; _context5.next = 21; break; case 17: _context5.prev = 17; _context5.t0 = _context5["catch"](11); emitter.emit('error', _context5.t0); return _context5.abrupt("return"); case 21: headers = {}; _iterator = _createForOfIteratorHelper(_keysInstanceProperty(_context4 = res.headers).call(_context4)); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { headerName = _step.value; headers[headerName.toLowerCase()] = res.headers.get(headerName); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } response = { statusCode: res.status, headers: headers }; if (!(followRedirect && isRedirect(response.statusCode))) { _context5.next = 28; break; } try { performRedirectRequest(request, response, followRedirect, counter, function (req) { return startFetchRequest(req, options, undefined, output, emitter, counter + 1); }); } catch (err) { emitter.emit('error', err); } return _context5.abrupt("return"); case 28: emitter.emit('response', response); res.body.pipe(output); case 30: case "end": return _context5.stop(); } }, _callee2, null, [[11, 17]]); })); return _startFetchRequest.apply(this, arguments); } export default function request(req) { var options_ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = _objectSpread(_objectSpread({}, defaults), options_); var _createHttpRequestHan = createHttpRequestHandlerStreams(req, options), input = _createHttpRequestHan.input, output = _createHttpRequestHan.output, stream = _createHttpRequestHan.stream; startFetchRequest(req, options, input, output, stream); return stream; } var sleep = function sleep(ms) { return new _Promise(function (r) { return _setTimeout(r, ms); }); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFkYWJsZSIsImZldGNoIiwiUmVzcG9uc2UiLCJjcmVhdGVIdHRwc1Byb3h5QWdlbnQiLCJjcmVhdGVIdHRwUmVxdWVzdEhhbmRsZXJTdHJlYW1zIiwiZXhlY3V0ZVdpdGhUaW1lb3V0IiwiaXNSZWRpcmVjdCIsInBlcmZvcm1SZWRpcmVjdFJlcXVlc3QiLCJnZXRMb2dnZXIiLCJpcyIsImRlZmF1bHRzIiwic2V0RGVmYXVsdHMiLCJkZWZhdWx0c18iLCJzdGFydEZldGNoUmVxdWVzdCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiX3N0YXJ0RmV0Y2hSZXF1ZXN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTIiLCJyZXF1ZXN0Iiwib3B0aW9ucyIsImlucHV0Iiwib3V0cHV0IiwiZW1pdHRlciIsIl9vcHRpb25zJHJldHJ5JHN0YXR1cyIsIl9vcHRpb25zJHJldHJ5IiwiX29wdGlvbnMkcmV0cnkkbWF4UmV0IiwiX29wdGlvbnMkcmV0cnkyIiwiX29wdGlvbnMkcmV0cnkkbWluVGltIiwiX29wdGlvbnMkcmV0cnkzIiwiX29wdGlvbnMkcmV0cnkkdGltZW91IiwiX29wdGlvbnMkcmV0cnk0IiwiX29wdGlvbnMkcmV0cnkkZXJyb3JDIiwiX29wdGlvbnMkcmV0cnk1IiwiX29wdGlvbnMkcmV0cnkkbWV0aG9kIiwiX29wdGlvbnMkcmV0cnk2IiwiX29wdGlvbnMkdGltZW91dCIsIl9jb250ZXh0NCIsImNvdW50ZXIiLCJsb2dnZXIiLCJodHRwUHJveHkiLCJmb2xsb3dSZWRpcmVjdCIsImFnZW50IiwidXJsIiwiYm9keSIsInJyZXF1ZXN0IiwiY29udHJvbGxlciIsInJldHJ5Q291bnQiLCJyZXRyeU9wdHMiLCJzaG91bGRSZXRyeVJlcXVlc3QiLCJfZmV0Y2hXaXRoUmV0cmllcyIsInJlcyIsImZldGNoVGltZW91dCIsImhlYWRlcnMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImhlYWRlck5hbWUiLCJyZXNwb25zZSIsIl9hcmdzMiIsIndyYXAiLCJfY2FsbGVlMiQiLCJfY29udGV4dDUiLCJwcmV2IiwibmV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIkFib3J0Q29udHJvbGxlciIsInN0YXR1c0NvZGVzIiwicmV0cnkiLCJtYXhSZXRyaWVzIiwibWluVGltZW91dCIsInRpbWVvdXRGYWN0b3IiLCJlcnJvckNvZGVzIiwibWV0aG9kcyIsIm1heFJldHJ5IiwicmVzT3JFcnIiLCJfY29udGV4dCIsIl9pbmNsdWRlc0luc3RhbmNlUHJvcGVydHkiLCJjYWxsIiwibWV0aG9kIiwiX2NvbnRleHQyIiwic3RhdHVzIiwiX3JldHJ5T3B0cyRlcnJvckNvZGVzIiwibmFtZSIsIm5vZGVTdHJlYW0iLCJpc0Rpc3R1cmJlZCIsImRlYnVnIiwiY29kZSIsImZldGNoV2l0aFJldHJpZXMiLCJfcmVmIiwiX2NhbGxlZSIsImZldGNoT3B0cyIsIl9yZXMiLCJlcnJvciIsIl9hcmdzIiwiX2NhbGxlZSQiLCJfY29udGV4dDMiLCJfb2JqZWN0U3ByZWFkIiwidGVzdCIsInJlZGlyZWN0Iiwic2lnbmFsIiwic2VudCIsImNvbmNhdCIsInNsZWVwIiwiTWF0aCIsInBvdyIsImVtaXQiLCJhYnJ1cHQiLCJ0MCIsIm1lc3NhZ2UiLCJzdG9wIiwidGltZW91dCIsImFib3J0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfa2V5c0luc3RhbmNlUHJvcGVydHkiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsInRvTG93ZXJDYXNlIiwiZ2V0IiwiZXJyIiwiZSIsImYiLCJzdGF0dXNDb2RlIiwicmVxIiwicGlwZSIsIm9wdGlvbnNfIiwiX2NyZWF0ZUh0dHBSZXF1ZXN0SGFuIiwic3RyZWFtIiwibXMiLCJfUHJvbWlzZSIsInIiLCJfc2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBEdXBsZXgsIFJlYWRhYmxlLCBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgZmV0Y2gsIHsgUmVzcG9uc2UsIFJlcXVlc3RJbml0LCBGZXRjaEVycm9yIH0gZnJvbSAnbm9kZS1mZXRjaCc7XG5pbXBvcnQgY3JlYXRlSHR0cHNQcm94eUFnZW50IGZyb20gJ2h0dHBzLXByb3h5LWFnZW50JztcbmltcG9ydCB7XG4gIGNyZWF0ZUh0dHBSZXF1ZXN0SGFuZGxlclN0cmVhbXMsXG4gIGV4ZWN1dGVXaXRoVGltZW91dCxcbiAgaXNSZWRpcmVjdCxcbiAgcGVyZm9ybVJlZGlyZWN0UmVxdWVzdCxcbn0gZnJvbSAnLi9yZXF1ZXN0LWhlbHBlcic7XG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL3V0aWwvbG9nZ2VyJztcbmltcG9ydCBpcyBmcm9tICdAc2luZHJlc29yaHVzL2lzJztcblxuLyoqXG4gKlxuICovXG5sZXQgZGVmYXVsdHM6IEh0dHBSZXF1ZXN0T3B0aW9ucyA9IHt9O1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0cyhkZWZhdWx0c186IEh0dHBSZXF1ZXN0T3B0aW9ucykge1xuICBkZWZhdWx0cyA9IGRlZmF1bHRzXztcbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEZldGNoUmVxdWVzdChcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3QsXG4gIG9wdGlvbnM6IEh0dHBSZXF1ZXN0T3B0aW9ucyxcbiAgaW5wdXQ6IFJlYWRhYmxlIHwgdW5kZWZpbmVkLFxuICBvdXRwdXQ6IFdyaXRhYmxlLFxuICBlbWl0dGVyOiBFdmVudEVtaXR0ZXIsXG4gIGNvdW50ZXI6IG51bWJlciA9IDAsXG4pIHtcbiAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKCdmZXRjaCcpO1xuICBjb25zdCB7IGh0dHBQcm94eSwgZm9sbG93UmVkaXJlY3QgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFnZW50ID0gaHR0cFByb3h5ID8gY3JlYXRlSHR0cHNQcm94eUFnZW50KGh0dHBQcm94eSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgdXJsLCBib2R5LCAuLi5ycmVxdWVzdCB9ID0gcmVxdWVzdDtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgY29uc3QgcmV0cnlPcHRzOiBSZXF1aXJlZDxIdHRwUmVxdWVzdE9wdGlvbnNbJ3JldHJ5J10+ID0ge1xuICAgIHN0YXR1c0NvZGVzOiBvcHRpb25zLnJldHJ5Py5zdGF0dXNDb2RlcyA/PyBbNDIwLCA0MjksIDUwMCwgNTAyLCA1MDMsIDUwNF0sXG4gICAgbWF4UmV0cmllczogb3B0aW9ucy5yZXRyeT8ubWF4UmV0cmllcyA/PyA1LFxuICAgIG1pblRpbWVvdXQ6IG9wdGlvbnMucmV0cnk/Lm1pblRpbWVvdXQgPz8gNTAwLFxuICAgIHRpbWVvdXRGYWN0b3I6IG9wdGlvbnMucmV0cnk/LnRpbWVvdXRGYWN0b3IgPz8gMixcbiAgICBlcnJvckNvZGVzOiBvcHRpb25zLnJldHJ5Py5lcnJvckNvZGVzID8/IFtcbiAgICAgICdFQ09OTlJFU0VUJyxcbiAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgJ0VOT1RGT1VORCcsXG4gICAgICAnRU5FVERPV04nLFxuICAgICAgJ0VORVRVTlJFQUNIJyxcbiAgICAgICdFSE9TVERPV04nLFxuICAgICAgJ1VORF9FUlJfU09DS0VUJyxcbiAgICAgICdFVElNRURPVVQnLFxuICAgICAgJ0VQSVBFJyxcbiAgICBdLFxuICAgIG1ldGhvZHM6IG9wdGlvbnMucmV0cnk/Lm1ldGhvZHMgPz8gW1xuICAgICAgJ0dFVCcsXG4gICAgICAnUFVUJyxcbiAgICAgICdIRUFEJyxcbiAgICAgICdPUFRJT05TJyxcbiAgICAgICdERUxFVEUnLFxuICAgIF0sXG4gIH07XG5cbiAgY29uc3Qgc2hvdWxkUmV0cnlSZXF1ZXN0ID0gKFxuICAgIG1heFJldHJ5OiBudW1iZXIsXG4gICAgcmVzT3JFcnI6IFJlc3BvbnNlIHwgRXJyb3IgfCBGZXRjaEVycm9yLFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXJldHJ5T3B0cy5tZXRob2RzLmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHJlc09yRXJyIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXRyeU9wdHMuc3RhdHVzQ29kZXMuaW5jbHVkZXMocmVzT3JFcnIuc3RhdHVzKSkge1xuICAgICAgICBpZiAobWF4UmV0cnkgPT09IHJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF4UmV0cnkgPT09IHJldHJ5Q291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gb25seSByZXRyeSBvbiBvcGVyYXRpb25hbCBlcnJvcnNcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL25vZGUtZmV0Y2gvYmxvYi8yLngvRVJST1ItSEFORExJTkcubWQjZXJyb3ItaGFuZGxpbmctd2l0aC1ub2RlLWZldGNoXG4gICAgICBpZiAocmVzT3JFcnIubmFtZSAhPSAnRmV0Y2hFcnJvcicpIHJldHVybiBmYWxzZTtcblxuICAgICAgaWYgKGlzLm5vZGVTdHJlYW0oYm9keSkgJiYgUmVhZGFibGUuaXNEaXN0dXJiZWQoYm9keSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdCb2R5IG9mIHR5cGUgc3RyZWFtIHdhcyByZWFkLCB1bmFibGUgdG8gcmV0cnkgcmVxdWVzdC4nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICdjb2RlJyBpbiByZXNPckVyciAmJlxuICAgICAgICByZXNPckVyci5jb2RlICYmXG4gICAgICAgIHJldHJ5T3B0cz8uZXJyb3JDb2Rlcz8uaW5jbHVkZXMocmVzT3JFcnIuY29kZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZmV0Y2hXaXRoUmV0cmllcyA9IGFzeW5jIChcbiAgICBtYXhSZXRyeSA9IHJldHJ5T3B0cz8ubWF4UmV0cmllcyxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgIGNvbnN0IGZldGNoT3B0czogUmVxdWVzdEluaXQgPSB7XG4gICAgICAuLi5ycmVxdWVzdCxcbiAgICAgIC4uLihpbnB1dCAmJiAvXihwb3N0fHB1dHxwYXRjaCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZClcbiAgICAgICAgPyB7IGJvZHk6IGlucHV0IH1cbiAgICAgICAgOiB7fSksXG4gICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgYWdlbnQsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIGZldGNoT3B0cyk7XG4gICAgICBpZiAoc2hvdWxkUmV0cnlSZXF1ZXN0KHJldHJ5T3B0cy5tYXhSZXRyaWVzLCByZXMpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmV0cnlpbmcgZm9yIHRoZSAke3JldHJ5Q291bnQgKyAxfSB0aW1lYCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygncmVhc29uOiBzdGF0dXNDb2RlIG1hdGNoJyk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoXG4gICAgICAgICAgcmV0cnlDb3VudCA9PT0gMFxuICAgICAgICAgICAgPyByZXRyeU9wdHMubWluVGltZW91dFxuICAgICAgICAgICAgOiByZXRyeU9wdHMubWluVGltZW91dCAqIHJldHJ5T3B0cy50aW1lb3V0RmFjdG9yICoqIHJldHJ5Q291bnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTk9URTogdGhpcyBldmVudCBpcyBvbmx5IHVzZWQgYnkgdGVzdHMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhdCBhbnkgdGltZS5cbiAgICAgICAgLy8ganNmb3JjZSBtYXkgc3dpdGNoIHRvIG5vZGUncyBmZXRjaCB3aGljaCBkb2Vzbid0IGVtaXQgdGhpcyBldmVudCBvbiByZXRyaWVzLlxuICAgICAgICBlbWl0dGVyLmVtaXQoJ3JldHJ5JywgcmV0cnlDb3VudCk7XG4gICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hXaXRoUmV0cmllcyhtYXhSZXRyeSk7XG4gICAgICB9XG4gICAgICAvLyBzaG91bGQgd2UgdGhyb3cgaGVyZSBpZiB0aGUgbWF4UmV0cnkgYWxyZWFkeSBoYXBwZW5lZCBhbmQgc3RpbGwgZ290IHRoZSBzYW1lIHN0YXR1c0NvZGU/XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGZhaWxlZCcpO1xuICAgICAgY29uc3QgZXJyb3IgPSBlcnIgYXMgRXJyb3IgfCBGZXRjaEVycm9yO1xuXG4gICAgICAvLyByZXF1ZXN0IHdhcyBjYW5jZWxlZCBieSBjb25zdW1lciAoQWJvcnRDb250cm9sbGVyKSwgc2tpcCByZXRyeSBhbmQgcmV0aHJvdy5cbiAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZXRyeVJlcXVlc3QocmV0cnlPcHRzLm1heFJldHJpZXMsIGVycm9yKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYHJldHJ5aW5nIGZvciB0aGUgJHtyZXRyeUNvdW50ICsgMX0gdGltZWApO1xuICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoXG4gICAgICAgICAgcmV0cnlDb3VudCA9PT0gMFxuICAgICAgICAgICAgPyByZXRyeU9wdHMubWluVGltZW91dFxuICAgICAgICAgICAgOiByZXRyeU9wdHMubWluVGltZW91dCAqIHJldHJ5T3B0cy50aW1lb3V0RmFjdG9yICoqIHJldHJ5Q291bnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTk9URTogdGhpcyBldmVudCBpcyBvbmx5IHVzZWQgYnkgdGVzdHMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhdCBhbnkgdGltZS5cbiAgICAgICAgLy8ganNmb3JjZSBtYXkgc3dpdGNoIHRvIG5vZGUncyBmZXRjaCB3aGljaCBkb2Vzbid0IGVtaXQgdGhpcyBldmVudCBvbiByZXRyaWVzLlxuICAgICAgICBlbWl0dGVyLmVtaXQoJ3JldHJ5JywgcmV0cnlDb3VudCk7XG4gICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICByZXR1cm4gZmV0Y2hXaXRoUmV0cmllcyhtYXhSZXRyeSk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgcmV0cnkuLi4nKTtcblxuICAgICAgaWYgKG1heFJldHJ5ID09PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgbGV0IHJlczogUmVzcG9uc2U7XG5cbiAgLy8gVGltZW91dCBhZnRlciA1IG1pbnV0ZXMgd2l0aG91dCBhIHJlc3BvbnNlXG4gIC8vXG4gIC8vIG5vZGUtZmV0Y2gncyBkZWZhdWx0IHRpbWVvdXQgaXMgMCBhbmQganNmb3JjZSBjb25zdW1lcnMgY2FuJ3Qgc2V0IHRoaXMgd2hlbiBjYWxsaW5nIGBDb25uZWN0aW9uYCBtZXRob2RzIHNvIHdlIHNldCBhIGxvbmcgZGVmYXVsdCBhdCB0aGUgZmV0Y2ggd3JhcHBlciBsZXZlbC5cbiAgY29uc3QgZmV0Y2hUaW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IDMwMF8wMDBcblxuICB0cnkge1xuICAgIHJlcyA9IGF3YWl0IGV4ZWN1dGVXaXRoVGltZW91dChmZXRjaFdpdGhSZXRyaWVzLCBmZXRjaFRpbWVvdXQsICgpID0+XG4gICAgICBjb250cm9sbGVyLmFib3J0KCksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZW1pdHRlci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIHJlcy5oZWFkZXJzLmtleXMoKSkge1xuICAgIGhlYWRlcnNbaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpXSA9IHJlcy5oZWFkZXJzLmdldChoZWFkZXJOYW1lKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IHtcbiAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzLFxuICAgIGhlYWRlcnMsXG4gIH07XG4gIGlmIChmb2xsb3dSZWRpcmVjdCAmJiBpc1JlZGlyZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBlcmZvcm1SZWRpcmVjdFJlcXVlc3QoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICBmb2xsb3dSZWRpcmVjdCxcbiAgICAgICAgY291bnRlcixcbiAgICAgICAgKHJlcSkgPT5cbiAgICAgICAgICBzdGFydEZldGNoUmVxdWVzdChcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICBlbWl0dGVyLFxuICAgICAgICAgICAgY291bnRlciArIDEsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGVtaXR0ZXIuZW1pdCgncmVzcG9uc2UnLCByZXNwb25zZSk7XG4gIHJlcy5ib2R5LnBpcGUob3V0cHV0KTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0KFxuICByZXE6IEh0dHBSZXF1ZXN0LFxuICBvcHRpb25zXzogSHR0cFJlcXVlc3RPcHRpb25zID0ge30sXG4pOiBEdXBsZXgge1xuICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0cywgLi4ub3B0aW9uc18gfTtcbiAgY29uc3QgeyBpbnB1dCwgb3V0cHV0LCBzdHJlYW0gfSA9IGNyZWF0ZUh0dHBSZXF1ZXN0SGFuZGxlclN0cmVhbXMoXG4gICAgcmVxLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHN0YXJ0RmV0Y2hSZXF1ZXN0KHJlcSwgb3B0aW9ucywgaW5wdXQsIG91dHB1dCwgc3RyZWFtKTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLFNBQWlCQSxRQUFRLFFBQWtCLFFBQVE7QUFDbkQsT0FBT0MsS0FBSyxJQUFJQyxRQUFRLFFBQWlDLFlBQVk7QUFDckUsT0FBT0MscUJBQXFCLE1BQU0sbUJBQW1CO0FBQ3JELFNBQ0VDLCtCQUErQixFQUMvQkMsa0JBQWtCLEVBQ2xCQyxVQUFVLEVBQ1ZDLHNCQUFzQixRQUNqQixrQkFBa0I7QUFFekIsU0FBU0MsU0FBUyxRQUFRLGVBQWU7QUFDekMsT0FBT0MsRUFBRSxNQUFNLGtCQUFrQjs7QUFFakM7QUFD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aUIsQ0FDZnlILEdBQUcsRUFDSDNHLE9BQU8sRUFDUDZDLFNBQVMsRUFDVDNDLE1BQU0sRUFDTkMsT0FBTyxFQUNQZSxPQUFPLEdBQUcsQ0FDWixDQUFDO1lBQUEsQ0FDTCxDQUFDO1VBQ0gsQ0FBQyxDQUFDLE9BQU9xRixHQUFHLEVBQUU7WUFDWnBHLE9BQU8sQ0FBQ3FGLElBQUksQ0FBQyxPQUFPLEVBQUVlLEdBQUcsQ0FBQztVQUM1QjtVQUFDLE9BQUE5RCxTQUFBLENBQUFnRCxNQUFBO1FBQUE7VUFHSHRGLE9BQU8sQ0FBQ3FGLElBQUksQ0FBQyxVQUFVLEVBQUVuRCxRQUFRLENBQUM7VUFDbENOLEdBQUcsQ0FBQ1AsSUFBSSxDQUFDb0YsSUFBSSxDQUFDMUcsTUFBTSxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUF1QyxTQUFBLENBQUFtRCxJQUFBO01BQUE7SUFBQSxHQUFBOUYsUUFBQTtFQUFBLENBQ3ZCO0VBQUEsT0FBQU4sa0JBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0FBQUE7QUFLRCxlQUFlLFNBQVNLLE9BQU9BLENBQzdCNEcsR0FBZ0IsRUFFUjtFQUFBLElBRFJFLFFBQTRCLEdBQUFuSCxTQUFBLENBQUFrRCxNQUFBLFFBQUFsRCxTQUFBLFFBQUFtRCxTQUFBLEdBQUFuRCxTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBRWpDLElBQU1NLE9BQU8sR0FBQStFLGFBQUEsQ0FBQUEsYUFBQSxLQUFRaEcsUUFBUSxHQUFLOEgsUUFBUSxDQUFFO0VBQzVDLElBQUFDLHFCQUFBLEdBQWtDckksK0JBQStCLENBQy9Ea0ksR0FBRyxFQUNIM0csT0FDRixDQUFDO0lBSE9DLEtBQUssR0FBQTZHLHFCQUFBLENBQUw3RyxLQUFLO0lBQUVDLE1BQU0sR0FBQTRHLHFCQUFBLENBQU41RyxNQUFNO0lBQUU2RyxNQUFNLEdBQUFELHFCQUFBLENBQU5DLE1BQU07RUFJN0I3SCxpQkFBaUIsQ0FBQ3lILEdBQUcsRUFBRTNHLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUU2RyxNQUFNLENBQUM7RUFDdEQsT0FBT0EsTUFBTTtBQUNmO0FBRUEsSUFBTTFCLEtBQUssR0FBRyxTQUFSQSxLQUFLQSxDQUFJMkIsRUFBVTtFQUFBLE9BQUssSUFBQUMsUUFBQSxDQUFZLFVBQUNDLENBQUM7SUFBQSxPQUFLQyxXQUFBLENBQVdELENBQUMsRUFBRUYsRUFBRSxDQUFDO0VBQUEsRUFBQztBQUFBIiwiaWdub3JlTGlzdCI6W119