UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

370 lines (355 loc) 39.3 kB
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; 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 _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct"; 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 _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray"; import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck"; import _createClass from "@babel/runtime-corejs3/helpers/createClass"; import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn"; import _get from "@babel/runtime-corejs3/helpers/get"; import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf"; import _inherits from "@babel/runtime-corejs3/helpers/inherits"; import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties"; import _typeof from "@babel/runtime-corejs3/helpers/typeof"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; var _excluded = ["nullValue"]; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { var _context8; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context8 = Object.prototype.toString.call(o)).call(_context8, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 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 _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat"; import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import "core-js/modules/es.error.cause.js"; import "core-js/modules/es.array.push.js"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import "core-js/modules/es.regexp.to-string.js"; import "core-js/modules/es.string.replace.js"; /** * @file Represents stream that handles Salesforce record as stream data * @author Shinichi Tomita <shinichi.tomita@gmail.com> */ import { Transform, PassThrough } from 'stream'; import { serializeCSVStream, parseCSVStream } from './csv'; import { concatStreamsAsDuplex } from './util/stream'; /** * type defs */ /** * @private */ function evalMapping(value, mapping) { if (typeof value === 'string') { var m = /^\$\{(\w+)\}$/.exec(value); if (m) { return mapping[m[1]]; } return value.replace(/\$\{(\w+)\}/g, function ($0, prop) { var v = mapping[prop]; return typeof v === 'undefined' || v === null ? '' : String(v); }); } return value; } /** * @private */ function convertRecordForSerialization(record) { var _context; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return _reduceInstanceProperty(_context = _Object$keys(record)).call(_context, function (rec, key) { var value = rec[key]; var urec; if (key === 'attributes') { // 'attributes' prop will be ignored urec = _objectSpread({}, rec); delete urec[key]; return urec; } else if (options.nullValue && value === null) { return _objectSpread(_objectSpread({}, rec), {}, _defineProperty({}, key, options.nullValue)); } else if (value !== null && _typeof(value) === 'object') { var _context2; var precord = convertRecordForSerialization(value, options); return _reduceInstanceProperty(_context2 = _Object$keys(precord)).call(_context2, function (prec, pkey) { var _context3; prec[_concatInstanceProperty(_context3 = "".concat(key, ".")).call(_context3, pkey)] = precord[pkey]; // eslint-disable-line no-param-reassign return prec; }, _objectSpread({}, rec)); } return rec; }, record); } /** * @private */ function createPipelineStream(s1, s2) { s1.pipe(s2); return concatStreamsAsDuplex(s1, s2, { writableObjectMode: true }); } /** * @private */ var CSVStreamConverter = { serialize: function serialize() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var nullValue = options.nullValue, csvOpts = _objectWithoutProperties(options, _excluded); return createPipelineStream( // eslint-disable-next-line no-use-before-define _mapInstanceProperty(RecordStream).call(RecordStream, function (record) { return convertRecordForSerialization(record, options); }), serializeCSVStream(csvOpts)); }, parse: function parse() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return parseCSVStream(options); } }; /** * @private */ var DataStreamConverters = { csv: CSVStreamConverter }; /** * Class for Record Stream * * @class * @constructor * @extends stream.Transform */ export var RecordStream = /*#__PURE__*/function (_PassThrough) { /** * */ function RecordStream() { var _this; _classCallCheck(this, RecordStream); _this = _callSuper(this, RecordStream, [{ objectMode: true }]); /* @override */ _defineProperty(_this, "addListener", _this.on); return _this; } /** * Get record stream of queried records applying the given mapping function */ _inherits(RecordStream, _PassThrough); return _createClass(RecordStream, [{ key: "map", value: function map(fn) { return this.pipe(_mapInstanceProperty(RecordStream).call(RecordStream, fn)); } /** * Get record stream of queried records, applying the given filter function */ }, { key: "filter", value: function filter(fn) { return this.pipe(_filterInstanceProperty(RecordStream).call(RecordStream, fn)); } /* @override */ }, { key: "on", value: function on(ev, fn) { return _get(_getPrototypeOf(RecordStream.prototype), "on", this).call(this, ev === 'record' ? 'data' : ev, fn); } }], [{ key: "map", value: /* --------------------------------------------------- */ /** * Create a record stream which maps records and pass them to downstream */ function map(fn) { var mapStream = new Transform({ objectMode: true, transform: function transform(record, enc, callback) { var rec = fn(record) || record; // if not returned record, use same record mapStream.push(rec); callback(); } }); return mapStream; } /** * Create mapping stream using given record template */ }, { key: "recordMapStream", value: function recordMapStream(record, noeval) { return _mapInstanceProperty(RecordStream).call(RecordStream, function (rec) { var mapped = { Id: rec.Id }; for (var _i = 0, _Object$keys2 = _Object$keys(record); _i < _Object$keys2.length; _i++) { var prop = _Object$keys2[_i]; mapped[prop] = noeval ? record[prop] : evalMapping(record[prop], rec); } return mapped; }); } /** * Create a record stream which filters records and pass them to downstream * * @param {RecordFilterFunction} fn - Record filtering function * @returns {RecordStream.Serializable} */ }, { key: "filter", value: function filter(fn) { var filterStream = new Transform({ objectMode: true, transform: function transform(record, enc, callback) { if (fn(record)) { filterStream.push(record); } callback(); } }); return filterStream; } }]); }(PassThrough); /** * @class RecordStream.Serializable * @extends {RecordStream} */ export var Serializable = /*#__PURE__*/function (_RecordStream2) { function Serializable() { var _context4; var _this2; _classCallCheck(this, Serializable); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this2 = _callSuper(this, Serializable, _concatInstanceProperty(_context4 = []).call(_context4, args)); _defineProperty(_this2, "_dataStreams", {}); return _this2; } _inherits(Serializable, _RecordStream2); return _createClass(Serializable, [{ key: "stream", value: /** * Get readable data stream which emits serialized record data */ function stream() { var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'csv'; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (this._dataStreams[type]) { return this._dataStreams[type]; } var converter = DataStreamConverters[type]; if (!converter) { throw new Error("Converting [".concat(type, "] data stream is not supported.")); } var dataStream = new PassThrough(); this.pipe(converter.serialize(options)).pipe(dataStream); this._dataStreams[type] = dataStream; return dataStream; } }]); }(RecordStream); /** * @class RecordStream.Parsable * @extends {RecordStream} */ export var Parsable = /*#__PURE__*/function (_RecordStream3) { function Parsable() { var _context5; var _this3; _classCallCheck(this, Parsable); for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } _this3 = _callSuper(this, Parsable, _concatInstanceProperty(_context5 = []).call(_context5, args)); _defineProperty(_this3, "_dataStreams", {}); _defineProperty(_this3, "_execParse", false); _defineProperty(_this3, "_incomings", []); /* @override */ _defineProperty(_this3, "addListener", _this3.on); return _this3; } _inherits(Parsable, _RecordStream3); return _createClass(Parsable, [{ key: "stream", value: /** * Get writable data stream which accepts serialized record data */ function stream() { var _this4 = this; var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'csv'; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (this._dataStreams[type]) { return this._dataStreams[type]; } var converter = DataStreamConverters[type]; if (!converter) { throw new Error("Converting [".concat(type, "] data stream is not supported.")); } var dataStream = new PassThrough(); var parserStream = converter.parse(options); parserStream.on('error', function (err) { return _this4.emit('error', err); }); parserStream.pipe(this).pipe(new PassThrough({ objectMode: true, highWaterMark: 500 * 1000 })); if (this._execParse) { dataStream.pipe(parserStream); } else { this._incomings.push([dataStream, parserStream]); } this._dataStreams[type] = dataStream; return dataStream; } /* @override */ }, { key: "on", value: function on(ev, fn) { if (ev === 'readable' || ev === 'record') { if (!this._execParse) { this._execParse = true; var _iterator = _createForOfIteratorHelper(this._incomings), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray(_step.value, 2), dataStream = _step$value[0], parserStream = _step$value[1]; dataStream.pipe(parserStream); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } } return _get(_getPrototypeOf(Parsable.prototype), "on", this).call(this, ev, fn); } }]); }(RecordStream); export default RecordStream; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUcmFuc2Zvcm0iLCJQYXNzVGhyb3VnaCIsInNlcmlhbGl6ZUNTVlN0cmVhbSIsInBhcnNlQ1NWU3RyZWFtIiwiY29uY2F0U3RyZWFtc0FzRHVwbGV4IiwiZXZhbE1hcHBpbmciLCJ2YWx1ZSIsIm1hcHBpbmciLCJtIiwiZXhlYyIsInJlcGxhY2UiLCIkMCIsInByb3AiLCJ2IiwiU3RyaW5nIiwiY29udmVydFJlY29yZEZvclNlcmlhbGl6YXRpb24iLCJyZWNvcmQiLCJfY29udGV4dCIsIm9wdGlvbnMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJfcmVkdWNlSW5zdGFuY2VQcm9wZXJ0eSIsIl9PYmplY3Qka2V5cyIsImNhbGwiLCJyZWMiLCJrZXkiLCJ1cmVjIiwiX29iamVjdFNwcmVhZCIsIm51bGxWYWx1ZSIsIl9kZWZpbmVQcm9wZXJ0eSIsIl90eXBlb2YiLCJfY29udGV4dDIiLCJwcmVjb3JkIiwicHJlYyIsInBrZXkiLCJfY29udGV4dDMiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsImNyZWF0ZVBpcGVsaW5lU3RyZWFtIiwiczEiLCJzMiIsInBpcGUiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJDU1ZTdHJlYW1Db252ZXJ0ZXIiLCJzZXJpYWxpemUiLCJjc3ZPcHRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiX21hcEluc3RhbmNlUHJvcGVydHkiLCJSZWNvcmRTdHJlYW0iLCJwYXJzZSIsIkRhdGFTdHJlYW1Db252ZXJ0ZXJzIiwiY3N2IiwiX1Bhc3NUaHJvdWdoIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY2FsbFN1cGVyIiwib2JqZWN0TW9kZSIsIm9uIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwibWFwIiwiZm4iLCJmaWx0ZXIiLCJfZmlsdGVySW5zdGFuY2VQcm9wZXJ0eSIsImV2IiwiX2dldCIsIl9nZXRQcm90b3R5cGVPZiIsInByb3RvdHlwZSIsIm1hcFN0cmVhbSIsInRyYW5zZm9ybSIsImVuYyIsImNhbGxiYWNrIiwicHVzaCIsInJlY29yZE1hcFN0cmVhbSIsIm5vZXZhbCIsIm1hcHBlZCIsIklkIiwiX2kiLCJfT2JqZWN0JGtleXMyIiwiZmlsdGVyU3RyZWFtIiwiU2VyaWFsaXphYmxlIiwiX1JlY29yZFN0cmVhbTIiLCJfY29udGV4dDQiLCJfdGhpczIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsInN0cmVhbSIsInR5cGUiLCJfZGF0YVN0cmVhbXMiLCJjb252ZXJ0ZXIiLCJFcnJvciIsImRhdGFTdHJlYW0iLCJQYXJzYWJsZSIsIl9SZWNvcmRTdHJlYW0zIiwiX2NvbnRleHQ1IiwiX3RoaXMzIiwiX2xlbjIiLCJfa2V5MiIsIl90aGlzNCIsInBhcnNlclN0cmVhbSIsImVyciIsImVtaXQiLCJoaWdoV2F0ZXJNYXJrIiwiX2V4ZWNQYXJzZSIsIl9pbmNvbWluZ3MiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwiX3N0ZXAkdmFsdWUiLCJfc2xpY2VkVG9BcnJheSIsImUiLCJmIl0sInNvdXJjZXMiOlsiLi4vc3JjL3JlY29yZC1zdHJlYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBSZXByZXNlbnRzIHN0cmVhbSB0aGF0IGhhbmRsZXMgU2FsZXNmb3JjZSByZWNvcmQgYXMgc3RyZWFtIGRhdGFcbiAqIEBhdXRob3IgU2hpbmljaGkgVG9taXRhIDxzaGluaWNoaS50b21pdGFAZ21haWwuY29tPlxuICovXG5pbXBvcnQgeyBSZWFkYWJsZSwgV3JpdGFibGUsIER1cGxleCwgVHJhbnNmb3JtLCBQYXNzVGhyb3VnaCB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBSZWNvcmQsIE9wdGlvbmFsIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVDU1ZTdHJlYW0sIHBhcnNlQ1NWU3RyZWFtIH0gZnJvbSAnLi9jc3YnO1xuaW1wb3J0IHsgY29uY2F0U3RyZWFtc0FzRHVwbGV4IH0gZnJvbSAnLi91dGlsL3N0cmVhbSc7XG5cbi8qKlxuICogdHlwZSBkZWZzXG4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZFN0cmVhbVNlcmlhbGl6ZU9wdGlvbiA9IHtcbiAgbnVsbFZhbHVlPzogYW55O1xufTtcblxuZXhwb3J0IHR5cGUgUmVjb3JkU3RyZWFtUGFyc2VPcHRpb24gPSB7fTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBldmFsTWFwcGluZyh2YWx1ZTogYW55LCBtYXBwaW5nOiB7IFtwcm9wOiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG0gPSAvXlxcJFxceyhcXHcrKVxcfSQvLmV4ZWModmFsdWUpO1xuICAgIGlmIChtKSB7XG4gICAgICByZXR1cm4gbWFwcGluZ1ttWzFdXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcJFxceyhcXHcrKVxcfS9nLCAoJDAsIHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHYgPSBtYXBwaW5nW3Byb3BdO1xuICAgICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyB8fCB2ID09PSBudWxsID8gJycgOiBTdHJpbmcodik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRSZWNvcmRGb3JTZXJpYWxpemF0aW9uKFxuICByZWNvcmQ6IFJlY29yZCxcbiAgb3B0aW9uczogeyBudWxsVmFsdWU/OiBib29sZWFuIH0gPSB7fSxcbik6IFJlY29yZCB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhyZWNvcmQpLnJlZHVjZSgocmVjOiBSZWNvcmQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSAocmVjIGFzIGFueSlba2V5XTtcbiAgICBsZXQgdXJlYzogUmVjb3JkO1xuICAgIGlmIChrZXkgPT09ICdhdHRyaWJ1dGVzJykge1xuICAgICAgLy8gJ2F0dHJpYnV0ZXMnIHByb3Agd2lsbCBiZSBpZ25vcmVkXG4gICAgICB1cmVjID0geyAuLi5yZWMgfTtcbiAgICAgIGRlbGV0ZSB1cmVjW2tleV07XG4gICAgICByZXR1cm4gdXJlYztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubnVsbFZhbHVlICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5yZWMsIFtrZXldOiBvcHRpb25zLm51bGxWYWx1ZSB9IGFzIFJlY29yZDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHByZWNvcmQgPSBjb252ZXJ0UmVjb3JkRm9yU2VyaWFsaXphdGlvbih2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMocHJlY29yZCkucmVkdWNlKFxuICAgICAgICAocHJlYzogUmVjb3JkLCBwa2V5KSA9PiB7XG4gICAgICAgICAgcHJlY1tgJHtrZXl9LiR7cGtleX1gXSA9IHByZWNvcmRbcGtleV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICByZXR1cm4gcHJlYztcbiAgICAgICAgfSxcbiAgICAgICAgeyAuLi5yZWMgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZWM7XG4gIH0sIHJlY29yZCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUGlwZWxpbmVTdHJlYW0oczE6IER1cGxleCwgczI6IER1cGxleCkge1xuICBzMS5waXBlKHMyKTtcbiAgcmV0dXJuIGNvbmNhdFN0cmVhbXNBc0R1cGxleChzMSwgczIsIHsgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlIH0pO1xufVxuXG50eXBlIFN0cmVhbUNvbnZlcnRlciA9IHtcbiAgc2VyaWFsaXplOiAob3B0aW9ucz86IFJlY29yZFN0cmVhbVNlcmlhbGl6ZU9wdGlvbikgPT4gRHVwbGV4O1xuICBwYXJzZTogKG9wdGlvbnM/OiBSZWNvcmRTdHJlYW1QYXJzZU9wdGlvbikgPT4gRHVwbGV4O1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBDU1ZTdHJlYW1Db252ZXJ0ZXI6IFN0cmVhbUNvbnZlcnRlciA9IHtcbiAgc2VyaWFsaXplKG9wdGlvbnM6IFJlY29yZFN0cmVhbVNlcmlhbGl6ZU9wdGlvbiA9IHt9KSB7XG4gICAgY29uc3QgeyBudWxsVmFsdWUsIC4uLmNzdk9wdHMgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIGNyZWF0ZVBpcGVsaW5lU3RyZWFtKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICBSZWNvcmRTdHJlYW0ubWFwKChyZWNvcmQpID0+XG4gICAgICAgIGNvbnZlcnRSZWNvcmRGb3JTZXJpYWxpemF0aW9uKHJlY29yZCwgb3B0aW9ucyksXG4gICAgICApLFxuICAgICAgc2VyaWFsaXplQ1NWU3RyZWFtKGNzdk9wdHMpLFxuICAgICk7XG4gIH0sXG4gIHBhcnNlKG9wdGlvbnM6IFJlY29yZFN0cmVhbVBhcnNlT3B0aW9uID0ge30pIHtcbiAgICByZXR1cm4gcGFyc2VDU1ZTdHJlYW0ob3B0aW9ucyk7XG4gIH0sXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERhdGFTdHJlYW1Db252ZXJ0ZXJzOiB7IFtrZXk6IHN0cmluZ106IFN0cmVhbUNvbnZlcnRlciB9ID0ge1xuICBjc3Y6IENTVlN0cmVhbUNvbnZlcnRlcixcbn07XG5cbi8qKlxuICogQ2xhc3MgZm9yIFJlY29yZCBTdHJlYW1cbiAqXG4gKiBAY2xhc3NcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgc3RyZWFtLlRyYW5zZm9ybVxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkU3RyZWFtPFIgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmQ+IGV4dGVuZHMgUGFzc1Rocm91Z2gge1xuICAvKipcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVjb3JkIHN0cmVhbSBvZiBxdWVyaWVkIHJlY29yZHMgYXBwbHlpbmcgdGhlIGdpdmVuIG1hcHBpbmcgZnVuY3Rpb25cbiAgICovXG4gIG1hcDxSUiBleHRlbmRzIFJlY29yZD4oZm46IChyZWM6IFIpID0+IE9wdGlvbmFsPFJSPikge1xuICAgIHJldHVybiB0aGlzLnBpcGUoUmVjb3JkU3RyZWFtLm1hcDxSLCBSUj4oZm4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVjb3JkIHN0cmVhbSBvZiBxdWVyaWVkIHJlY29yZHMsIGFwcGx5aW5nIHRoZSBnaXZlbiBmaWx0ZXIgZnVuY3Rpb25cbiAgICovXG4gIGZpbHRlcihmbjogKHJlYzogUikgPT4gYm9vbGVhbik6IER1cGxleCB7XG4gICAgcmV0dXJuIHRoaXMucGlwZShSZWNvcmRTdHJlYW0uZmlsdGVyPFI+KGZuKSk7XG4gIH1cblxuICAvKiBAb3ZlcnJpZGUgKi9cbiAgb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHJldHVybiBzdXBlci5vbihldiA9PT0gJ3JlY29yZCcgPyAnZGF0YScgOiBldiwgZm4pO1xuICB9XG5cbiAgLyogQG92ZXJyaWRlICovXG4gIGFkZExpc3RlbmVyID0gdGhpcy5vbjtcblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmVjb3JkIHN0cmVhbSB3aGljaCBtYXBzIHJlY29yZHMgYW5kIHBhc3MgdGhlbSB0byBkb3duc3RyZWFtXG4gICAqL1xuICBzdGF0aWMgbWFwPFIxIGV4dGVuZHMgUmVjb3JkID0gUmVjb3JkLCBSMiBleHRlbmRzIFJlY29yZCA9IFJlY29yZD4oXG4gICAgZm46IChyZWM6IFIxKSA9PiBPcHRpb25hbDxSMj4sXG4gICkge1xuICAgIGNvbnN0IG1hcFN0cmVhbSA9IG5ldyBUcmFuc2Zvcm0oe1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIHRyYW5zZm9ybShyZWNvcmQsIGVuYywgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgcmVjID0gZm4ocmVjb3JkKSB8fCByZWNvcmQ7IC8vIGlmIG5vdCByZXR1cm5lZCByZWNvcmQsIHVzZSBzYW1lIHJlY29yZFxuICAgICAgICBtYXBTdHJlYW0ucHVzaChyZWMpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwU3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBtYXBwaW5nIHN0cmVhbSB1c2luZyBnaXZlbiByZWNvcmQgdGVtcGxhdGVcbiAgICovXG4gIHN0YXRpYyByZWNvcmRNYXBTdHJlYW08XG4gICAgUjEgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmQsXG4gICAgUjIgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmRcbiAgPihyZWNvcmQ6IFIyLCBub2V2YWw/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIFJlY29yZFN0cmVhbS5tYXA8UjEsIFIyPigocmVjKSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWQ6IFJlY29yZCA9IHsgSWQ6IHJlYy5JZCB9O1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgICAgbWFwcGVkW3Byb3BdID0gbm9ldmFsID8gcmVjb3JkW3Byb3BdIDogZXZhbE1hcHBpbmcocmVjb3JkW3Byb3BdLCByZWMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcHBlZCBhcyBSMjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZWNvcmQgc3RyZWFtIHdoaWNoIGZpbHRlcnMgcmVjb3JkcyBhbmQgcGFzcyB0aGVtIHRvIGRvd25zdHJlYW1cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmRGaWx0ZXJGdW5jdGlvbn0gZm4gLSBSZWNvcmQgZmlsdGVyaW5nIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtSZWNvcmRTdHJlYW0uU2VyaWFsaXphYmxlfVxuICAgKi9cbiAgc3RhdGljIGZpbHRlcjxSMSBleHRlbmRzIFJlY29yZCA9IFJlY29yZD4oZm46IChyZWM6IFIxKSA9PiBib29sZWFuKTogRHVwbGV4IHtcbiAgICBjb25zdCBmaWx0ZXJTdHJlYW0gPSBuZXcgVHJhbnNmb3JtKHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICB0cmFuc2Zvcm0ocmVjb3JkLCBlbmMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChmbihyZWNvcmQpKSB7XG4gICAgICAgICAgZmlsdGVyU3RyZWFtLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyU3RyZWFtO1xuICB9XG59XG5cbi8qKlxuICogQGNsYXNzIFJlY29yZFN0cmVhbS5TZXJpYWxpemFibGVcbiAqIEBleHRlbmRzIHtSZWNvcmRTdHJlYW19XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemFibGU8UiBleHRlbmRzIFJlY29yZCA9IFJlY29yZD4gZXh0ZW5kcyBSZWNvcmRTdHJlYW08Uj4ge1xuICBfZGF0YVN0cmVhbXM6IHsgW3R5cGU6IHN0cmluZ106IER1cGxleCB9ID0ge307XG5cbiAgLyoqXG4gICAqIEdldCByZWFkYWJsZSBkYXRhIHN0cmVhbSB3aGljaCBlbWl0cyBzZXJpYWxpemVkIHJlY29yZCBkYXRhXG4gICAqL1xuICBzdHJlYW0odHlwZTogc3RyaW5nID0gJ2NzdicsIG9wdGlvbnM6IE9iamVjdCA9IHt9KTogRHVwbGV4IHtcbiAgICBpZiAodGhpcy5fZGF0YVN0cmVhbXNbdHlwZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhU3RyZWFtc1t0eXBlXTtcbiAgICB9XG4gICAgY29uc3QgY29udmVydGVyOiBPcHRpb25hbDxTdHJlYW1Db252ZXJ0ZXI+ID0gRGF0YVN0cmVhbUNvbnZlcnRlcnNbdHlwZV07XG4gICAgaWYgKCFjb252ZXJ0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udmVydGluZyBbJHt0eXBlfV0gZGF0YSBzdHJlYW0gaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YVN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgIHRoaXMucGlwZShjb252ZXJ0ZXIuc2VyaWFsaXplKG9wdGlvbnMpKS5waXBlKGRhdGFTdHJlYW0pO1xuICAgIHRoaXMuX2RhdGFTdHJlYW1zW3R5cGVdID0gZGF0YVN0cmVhbTtcbiAgICByZXR1cm4gZGF0YVN0cmVhbTtcbiAgfVxufVxuXG4vKipcbiAqIEBjbGFzcyBSZWNvcmRTdHJlYW0uUGFyc2FibGVcbiAqIEBleHRlbmRzIHtSZWNvcmRTdHJlYW19XG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzYWJsZTxSIGV4dGVuZHMgUmVjb3JkID0gUmVjb3JkPiBleHRlbmRzIFJlY29yZFN0cmVhbTxSPiB7XG4gIF9kYXRhU3RyZWFtczogeyBbdHlwZTogc3RyaW5nXTogRHVwbGV4IH0gPSB7fTtcbiAgX2V4ZWNQYXJzZTogYm9vbGVhbiA9IGZhbHNlO1xuICBfaW5jb21pbmdzOiBBcnJheTxbUmVhZGFibGUsIFdyaXRhYmxlXT4gPSBbXTtcblxuICAvKipcbiAgICogR2V0IHdyaXRhYmxlIGRhdGEgc3RyZWFtIHdoaWNoIGFjY2VwdHMgc2VyaWFsaXplZCByZWNvcmQgZGF0YVxuICAgKi9cbiAgc3RyZWFtKHR5cGU6IHN0cmluZyA9ICdjc3YnLCBvcHRpb25zOiBPYmplY3QgPSB7fSk6IER1cGxleCB7XG4gICAgaWYgKHRoaXMuX2RhdGFTdHJlYW1zW3R5cGVdKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YVN0cmVhbXNbdHlwZV07XG4gICAgfVxuICAgIGNvbnN0IGNvbnZlcnRlcjogT3B0aW9uYWw8U3RyZWFtQ29udmVydGVyPiA9IERhdGFTdHJlYW1Db252ZXJ0ZXJzW3R5cGVdO1xuICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnZlcnRpbmcgWyR7dHlwZX1dIGRhdGEgc3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBjb25zdCBwYXJzZXJTdHJlYW0gPSBjb252ZXJ0ZXIucGFyc2Uob3B0aW9ucyk7XG4gICAgcGFyc2VyU3RyZWFtLm9uKCdlcnJvcicsIChlcnIpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpKTtcbiAgICBwYXJzZXJTdHJlYW1cbiAgICAgIC5waXBlKHRoaXMpXG4gICAgICAucGlwZShuZXcgUGFzc1Rocm91Z2goeyBvYmplY3RNb2RlOiB0cnVlLCBoaWdoV2F0ZXJNYXJrOiA1MDAgKiAxMDAwIH0pKTtcbiAgICBpZiAodGhpcy5fZXhlY1BhcnNlKSB7XG4gICAgICBkYXRhU3RyZWFtLnBpcGUocGFyc2VyU3RyZWFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW5jb21pbmdzLnB1c2goW2RhdGFTdHJlYW0sIHBhcnNlclN0cmVhbV0pO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhU3RyZWFtc1t0eXBlXSA9IGRhdGFTdHJlYW07XG4gICAgcmV0dXJuIGRhdGFTdHJlYW07XG4gIH1cblxuICAvKiBAb3ZlcnJpZGUgKi9cbiAgb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gJ3JlY29yZCcpIHtcbiAgICAgIGlmICghdGhpcy5fZXhlY1BhcnNlKSB7XG4gICAgICAgIHRoaXMuX2V4ZWNQYXJzZSA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgW2RhdGFTdHJlYW0sIHBhcnNlclN0cmVhbV0gb2YgdGhpcy5faW5jb21pbmdzKSB7XG4gICAgICAgICAgZGF0YVN0cmVhbS5waXBlKHBhcnNlclN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLm9uKGV2LCBmbik7XG4gIH1cblxuICAvKiBAb3ZlcnJpZGUgKi9cbiAgYWRkTGlzdGVuZXIgPSB0aGlzLm9uO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSZWNvcmRTdHJlYW07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQXFDQSxTQUFTLEVBQUVDLFdBQVcsUUFBUSxRQUFRO0FBRTNFLFNBQVNDLGtCQUFrQixFQUFFQyxjQUFjLFFBQVEsT0FBTztBQUMxRCxTQUFTQyxxQkFBcUIsUUFBUSxlQUFlOztBQUVyRDtBQUNBO0FBQ0E7O0FBT0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsV0FBV0EsQ0FBQ0MsS0FBVSxFQUFFQyxPQUFtQyxFQUFFO0VBQ3BFLElBQUksT0FBT0QsS0FBSyxLQUFLLFFBQVEsRUFBRTtJQUM3QixJQUFNRSxDQUFDLEdBQUcsZUFBZSxDQUFDQyxJQUFJLENBQUNILEtBQUssQ0FBQztJQUNyQyxJQUFJRSxDQUFDLEVBQUU7TUFDTCxPQUFPRCxPQUFPLENBQUNDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QjtJQUNBLE9BQU9GLEtBQUssQ0FBQ0ksT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFDQyxFQUFFLEVBQUVDLElBQUksRUFBSztNQUNqRCxJQUFNQyxDQUFDLEdBQUdOLE9BQU8sQ0FBQ0ssSUFBSSxDQUFDO01BQ3ZCLE9BQU8sT0FBT0MsQ0FBQyxLQUFLLFdBQVcsSUFBSUEsQ0FBQyxLQUFLLElBQUksR0FBRyxFQUFFLEdBQUdDLE1BQU0sQ0FBQ0QsQ0FBQyxDQUFDO0lBQ2hFLENBQUMsQ0FBQztFQUNKO0VBQ0EsT0FBT1AsS0FBSztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVNTLDZCQUE2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