UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

324 lines (314 loc) 41 kB
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 _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct"; import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator"; 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 _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf"; import _get from "@babel/runtime-corejs3/helpers/get"; import _inherits from "@babel/runtime-corejs3/helpers/inherits"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator"; 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 _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } import "core-js/modules/es.error.cause.js"; import "core-js/modules/es.array.join.js"; import "core-js/modules/es.array.push.js"; import "core-js/modules/es.number.constructor.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import "core-js/modules/es.string.replace.js"; import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array"; import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map"; import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with"; import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat"; 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; } /** * @file Manages method call to SOAP endpoint * @author Shinichi Tomita <shinichi.tomita@gmail.com> */ import HttpApi from './http-api'; import { isMapObject, isObject } from './util/function'; import { getBodySize } from './util/get-body-size'; import { isJWTToken } from './util/jwt'; /** * */ function getPropsSchema(schema, schemaDict) { if (schema.extends && schemaDict[schema.extends]) { var extendSchema = schemaDict[schema.extends]; return _objectSpread(_objectSpread({}, getPropsSchema(extendSchema, schemaDict)), schema.props); } return schema.props; } function isNillValue(value) { return value == null || isMapObject(value) && isMapObject(value.$) && value.$['xsi:nil'] === 'true'; } /** * */ export function castTypeUsingSchema(value, schema) { var schemaDict = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (_Array$isArray(schema)) { var _context; var nillable = schema.length === 2 && schema[0] === '?'; var schema_ = nillable ? schema[1] : schema[0]; if (value == null) { return nillable ? null : []; } return _mapInstanceProperty(_context = _Array$isArray(value) ? value : [value]).call(_context, function (v) { return castTypeUsingSchema(v, schema_, schemaDict); }); } else if (isMapObject(schema)) { var _context2; // if schema is Schema Definition, not schema element if ('type' in schema && 'props' in schema && isMapObject(schema.props)) { var props = getPropsSchema(schema, schemaDict); return castTypeUsingSchema(value, props, schemaDict); } var _nillable = '?' in schema; var _schema_ = '?' in schema ? schema['?'] : schema; if (_nillable && isNillValue(value)) { return null; } var obj = isMapObject(value) ? value : {}; return _reduceInstanceProperty(_context2 = _Object$keys(_schema_)).call(_context2, function (o, k) { var s = _schema_[k]; var v = obj[k]; var nillable = _Array$isArray(s) && s.length === 2 && s[0] === '?' || isMapObject(s) && '?' in s || typeof s === 'string' && _startsWithInstanceProperty(s).call(s, '?'); if (typeof v === 'undefined' && nillable) { return o; } return _objectSpread(_objectSpread({}, o), {}, _defineProperty({}, k, castTypeUsingSchema(v, s, schemaDict))); }, obj); } else { var _nillable2 = typeof schema === 'string' && _startsWithInstanceProperty(schema).call(schema, '?'); var type = typeof schema === 'string' ? _nillable2 ? schema.substring(1) : schema : 'any'; switch (type) { case 'string': return isNillValue(value) ? _nillable2 ? null : '' : String(value); case 'number': return isNillValue(value) ? _nillable2 ? null : 0 : Number(value); case 'boolean': return isNillValue(value) ? _nillable2 ? null : false : value === 'true'; case 'null': return null; default: { if (schemaDict[type]) { var cvalue = castTypeUsingSchema(value, schemaDict[type], schemaDict); var isEmpty = isMapObject(cvalue) && _Object$keys(cvalue).length === 0; return isEmpty && _nillable2 ? null : cvalue; } return value; } } } } /** * @private */ function lookupValue(obj, propRegExps) { var regexp = propRegExps.shift(); if (!regexp) { return obj; } if (isMapObject(obj)) { for (var _i = 0, _Object$keys2 = _Object$keys(obj); _i < _Object$keys2.length; _i++) { var prop = _Object$keys2[_i]; if (regexp.test(prop)) { return lookupValue(obj[prop], propRegExps); } } return null; } } /** * @private */ function toXML(name, value) { if (isObject(name)) { value = name; name = null; } if (_Array$isArray(value)) { return _mapInstanceProperty(value).call(value, function (v) { return toXML(name, v); }).join(''); } else { var attrs = []; if (value === null) { attrs.push('xsi:nil="true"'); value = ''; } else if (isMapObject(value)) { var elems = []; for (var _i2 = 0, _Object$keys3 = _Object$keys(value); _i2 < _Object$keys3.length; _i2++) { var k = _Object$keys3[_i2]; var v = value[k]; if (_startsWithInstanceProperty(k).call(k, '@')) { var _context3; var kk = k.substring(1); attrs.push(_concatInstanceProperty(_context3 = "".concat(kk, "=\"")).call(_context3, v, "\"")); } else { elems.push(toXML(k, v)); } } value = elems.join(''); } else { value = String(value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;'); } var startTag = name ? '<' + name + (attrs.length > 0 ? ' ' + attrs.join(' ') : '') + '>' : ''; var endTag = name ? '</' + name + '>' : ''; return startTag + value + endTag; } } /** * */ /** * Class for SOAP endpoint of Salesforce * * @protected * @class * @constructor * @param {Connection} conn - Connection instance * @param {Object} options - SOAP endpoint setting options * @param {String} options.endpointUrl - SOAP endpoint URL * @param {String} [options.xmlns] - XML namespace for method call (default is "urn:partner.soap.sforce.com") */ export var SOAP = /*#__PURE__*/function (_HttpApi) { function SOAP(conn, options) { var _this; _classCallCheck(this, SOAP); _this = _callSuper(this, SOAP, [conn, options]); if (_this._conn.accessToken && isJWTToken(_this._conn.accessToken)) { // We need to block SOAP requests with JWT tokens because the response is: // statusCode=500 | body="INVALID_SESSION_ID" (xml), which triggers session refresh and enters in an infinite loop throw new Error('SOAP API does not support JWT-based access tokens. You must disable the "Issue JSON Web Token (JWT)-based access tokens" setting in your Connected App or External Client App'); } _this._endpointUrl = options.endpointUrl; _this._xmlns = options.xmlns || 'urn:partner.soap.sforce.com'; return _this; } /** * Invoke SOAP call using method and arguments */ _inherits(SOAP, _HttpApi); return _createClass(SOAP, [{ key: "invoke", value: (function () { var _invoke = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, args, schema, schemaDict) { var res; return _regeneratorRuntime.wrap(function _callee$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return this.request({ method: 'POST', url: this._endpointUrl, headers: { 'Content-Type': 'text/xml', SOAPAction: '""' }, _message: _defineProperty({}, method, args) }); case 2: res = _context4.sent; return _context4.abrupt("return", schema ? castTypeUsingSchema(res, schema, schemaDict) : res); case 4: case "end": return _context4.stop(); } }, _callee, this); })); function invoke(_x, _x2, _x3, _x4) { return _invoke.apply(this, arguments); } return invoke; }() /** @override */) }, { key: "beforeSend", value: function beforeSend(request) { request.body = this._createEnvelope(request._message); var headers = request.headers || {}; var bodySize = getBodySize(request.body, request.headers); if (request.method === 'POST' && !('transfer-encoding' in headers) && !('content-length' in headers) && !!bodySize) { this._logger.debug("missing 'content-length' header, setting it to: ".concat(bodySize)); headers['content-length'] = String(bodySize); } request.headers = headers; } /** @override **/ }, { key: "isSessionExpired", value: function isSessionExpired(response) { return response.statusCode === 500 && /<faultcode>[a-zA-Z]+:INVALID_SESSION_ID<\/faultcode>/.test(response.body); } /** @override **/ }, { key: "parseError", value: function parseError(body) { var error = lookupValue(body, [/:Envelope$/, /:Body$/, /:Fault$/]); return { errorCode: error.faultcode, message: error.faultstring }; } /** @override **/ }, { key: "getResponseBody", value: (function () { var _getResponseBody = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(response) { var body; return _regeneratorRuntime.wrap(function _callee2$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return _superPropGet(SOAP, "getResponseBody", this, 3)([response]); case 2: body = _context5.sent; return _context5.abrupt("return", lookupValue(body, [/:Envelope$/, /:Body$/, /.+/])); case 4: case "end": return _context5.stop(); } }, _callee2, this); })); function getResponseBody(_x5) { return _getResponseBody.apply(this, arguments); } return getResponseBody; }() /** * @private */ ) }, { key: "_createEnvelope", value: function _createEnvelope(message) { var header = {}; var conn = this._conn; if (conn.accessToken) { header.SessionHeader = { sessionId: conn.accessToken }; } if (conn._callOptions) { header.CallOptions = conn._callOptions; } return ['<?xml version="1.0" encoding="UTF-8"?>', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"', ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"', ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">', '<soapenv:Header xmlns="' + this._xmlns + '">', toXML(header), '</soapenv:Header>', '<soapenv:Body xmlns="' + this._xmlns + '">', toXML(message), '</soapenv:Body>', '</soapenv:Envelope>'].join(''); } }]); }(HttpApi); export default SOAP; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIdHRwQXBpIiwiaXNNYXBPYmplY3QiLCJpc09iamVjdCIsImdldEJvZHlTaXplIiwiaXNKV1RUb2tlbiIsImdldFByb3BzU2NoZW1hIiwic2NoZW1hIiwic2NoZW1hRGljdCIsImV4dGVuZHMiLCJleHRlbmRTY2hlbWEiLCJfb2JqZWN0U3ByZWFkIiwicHJvcHMiLCJpc05pbGxWYWx1ZSIsInZhbHVlIiwiJCIsImNhc3RUeXBlVXNpbmdTY2hlbWEiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJfQXJyYXkkaXNBcnJheSIsIl9jb250ZXh0IiwibmlsbGFibGUiLCJzY2hlbWFfIiwiX21hcEluc3RhbmNlUHJvcGVydHkiLCJjYWxsIiwidiIsIl9jb250ZXh0MiIsIm9iaiIsIl9yZWR1Y2VJbnN0YW5jZVByb3BlcnR5IiwiX09iamVjdCRrZXlzIiwibyIsImsiLCJzIiwiX3N0YXJ0c1dpdGhJbnN0YW5jZVByb3BlcnR5IiwiX2RlZmluZVByb3BlcnR5IiwidHlwZSIsInN1YnN0cmluZyIsIlN0cmluZyIsIk51bWJlciIsImN2YWx1ZSIsImlzRW1wdHkiLCJsb29rdXBWYWx1ZSIsInByb3BSZWdFeHBzIiwicmVnZXhwIiwic2hpZnQiLCJfaSIsIl9PYmplY3Qka2V5czIiLCJwcm9wIiwidGVzdCIsInRvWE1MIiwibmFtZSIsImpvaW4iLCJhdHRycyIsInB1c2giLCJlbGVtcyIsIl9pMiIsIl9PYmplY3Qka2V5czMiLCJfY29udGV4dDMiLCJrayIsIl9jb25jYXRJbnN0YW5jZVByb3BlcnR5IiwiY29uY2F0IiwicmVwbGFjZSIsInN0YXJ0VGFnIiwiZW5kVGFnIiwiU09BUCIsIl9IdHRwQXBpIiwiY29ubiIsIm9wdGlvbnMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJfY29ubiIsImFjY2Vzc1Rva2VuIiwiRXJyb3IiLCJfZW5kcG9pbnRVcmwiLCJlbmRwb2ludFVybCIsIl94bWxucyIsInhtbG5zIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwiX2ludm9rZSIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwibWV0aG9kIiwiYXJncyIsInJlcyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0NCIsInByZXYiLCJuZXh0IiwicmVxdWVzdCIsInVybCIsImhlYWRlcnMiLCJTT0FQQWN0aW9uIiwiX21lc3NhZ2UiLCJzZW50IiwiYWJydXB0Iiwic3RvcCIsImludm9rZSIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiYXBwbHkiLCJiZWZvcmVTZW5kIiwiYm9keSIsIl9jcmVhdGVFbnZlbG9wZSIsImJvZHlTaXplIiwiX2xvZ2dlciIsImRlYnVnIiwiaXNTZXNzaW9uRXhwaXJlZCIsInJlc3BvbnNlIiwic3RhdHVzQ29kZSIsInBhcnNlRXJyb3IiLCJlcnJvciIsImVycm9yQ29kZSIsImZhdWx0Y29kZSIsIm1lc3NhZ2UiLCJmYXVsdHN0cmluZyIsIl9nZXRSZXNwb25zZUJvZHkiLCJfY2FsbGVlMiIsIl9jYWxsZWUyJCIsIl9jb250ZXh0NSIsIl9zdXBlclByb3BHZXQiLCJnZXRSZXNwb25zZUJvZHkiLCJfeDUiLCJoZWFkZXIiLCJTZXNzaW9uSGVhZGVyIiwic2Vzc2lvbklkIiwiX2NhbGxPcHRpb25zIiwiQ2FsbE9wdGlvbnMiXSwic291cmNlcyI6WyIuLi9zcmMvc29hcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIE1hbmFnZXMgbWV0aG9kIGNhbGwgdG8gU09BUCBlbmRwb2ludFxuICogQGF1dGhvciBTaGluaWNoaSBUb21pdGEgPHNoaW5pY2hpLnRvbWl0YUBnbWFpbC5jb20+XG4gKi9cbmltcG9ydCBIdHRwQXBpIGZyb20gJy4vaHR0cC1hcGknO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi9jb25uZWN0aW9uJztcbmltcG9ydCB7XG4gIFNjaGVtYSxcbiAgSHR0cFJlc3BvbnNlLFxuICBIdHRwUmVxdWVzdCxcbiAgU29hcFNjaGVtYSxcbiAgU29hcFNjaGVtYURlZixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBpc01hcE9iamVjdCwgaXNPYmplY3QgfSBmcm9tICcuL3V0aWwvZnVuY3Rpb24nO1xuaW1wb3J0IHsgZ2V0Qm9keVNpemUgfSBmcm9tICcuL3V0aWwvZ2V0LWJvZHktc2l6ZSc7XG5pbXBvcnQgeyBpc0pXVFRva2VuIH0gZnJvbSAnLi91dGlsL2p3dCc7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcHNTY2hlbWEoXG4gIHNjaGVtYTogU29hcFNjaGVtYURlZixcbiAgc2NoZW1hRGljdDogeyBbbmFtZTogc3RyaW5nXTogU29hcFNjaGVtYURlZiB9LFxuKTogU29hcFNjaGVtYURlZlsncHJvcHMnXSB7XG4gIGlmIChzY2hlbWEuZXh0ZW5kcyAmJiBzY2hlbWFEaWN0W3NjaGVtYS5leHRlbmRzXSkge1xuICAgIGNvbnN0IGV4dGVuZFNjaGVtYSA9IHNjaGVtYURpY3Rbc2NoZW1hLmV4dGVuZHNdO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5nZXRQcm9wc1NjaGVtYShleHRlbmRTY2hlbWEsIHNjaGVtYURpY3QpLFxuICAgICAgLi4uc2NoZW1hLnByb3BzLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHNjaGVtYS5wcm9wcztcbn1cblxuZnVuY3Rpb24gaXNOaWxsVmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgKGlzTWFwT2JqZWN0KHZhbHVlKSAmJlxuICAgICAgaXNNYXBPYmplY3QodmFsdWUuJCkgJiZcbiAgICAgIHZhbHVlLiRbJ3hzaTpuaWwnXSA9PT0gJ3RydWUnKVxuICApO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXN0VHlwZVVzaW5nU2NoZW1hKFxuICB2YWx1ZTogdW5rbm93bixcbiAgc2NoZW1hPzogU29hcFNjaGVtYSB8IFNvYXBTY2hlbWFEZWYsXG4gIHNjaGVtYURpY3Q6IHsgW25hbWU6IHN0cmluZ106IFNvYXBTY2hlbWFEZWYgfSA9IHt9LFxuKTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGNvbnN0IG5pbGxhYmxlID0gc2NoZW1hLmxlbmd0aCA9PT0gMiAmJiBzY2hlbWFbMF0gPT09ICc/JztcbiAgICBjb25zdCBzY2hlbWFfID0gbmlsbGFibGUgPyBzY2hlbWFbMV0gOiBzY2hlbWFbMF07XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuaWxsYWJsZSA/IG51bGwgOiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSkubWFwKCh2KSA9PlxuICAgICAgY2FzdFR5cGVVc2luZ1NjaGVtYSh2LCBzY2hlbWFfLCBzY2hlbWFEaWN0KSxcbiAgICApO1xuICB9IGVsc2UgaWYgKGlzTWFwT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAvLyBpZiBzY2hlbWEgaXMgU2NoZW1hIERlZmluaXRpb24sIG5vdCBzY2hlbWEgZWxlbWVudFxuICAgIGlmICgndHlwZScgaW4gc2NoZW1hICYmICdwcm9wcycgaW4gc2NoZW1hICYmIGlzTWFwT2JqZWN0KHNjaGVtYS5wcm9wcykpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gZ2V0UHJvcHNTY2hlbWEoc2NoZW1hIGFzIFNvYXBTY2hlbWFEZWYsIHNjaGVtYURpY3QpO1xuICAgICAgcmV0dXJuIGNhc3RUeXBlVXNpbmdTY2hlbWEodmFsdWUsIHByb3BzLCBzY2hlbWFEaWN0KTtcbiAgICB9XG4gICAgY29uc3QgbmlsbGFibGUgPSAnPycgaW4gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYV8gPVxuICAgICAgJz8nIGluIHNjaGVtYSA/IChzY2hlbWFbJz8nXSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA6IHNjaGVtYTtcbiAgICBpZiAobmlsbGFibGUgJiYgaXNOaWxsVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gaXNNYXBPYmplY3QodmFsdWUpID8gdmFsdWUgOiB7fTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hXykucmVkdWNlKChvLCBrKSA9PiB7XG4gICAgICBjb25zdCBzID0gc2NoZW1hX1trXTtcbiAgICAgIGNvbnN0IHYgPSBvYmpba107XG4gICAgICBjb25zdCBuaWxsYWJsZSA9XG4gICAgICAgIChBcnJheS5pc0FycmF5KHMpICYmIHMubGVuZ3RoID09PSAyICYmIHNbMF0gPT09ICc/JykgfHxcbiAgICAgICAgKGlzTWFwT2JqZWN0KHMpICYmICc/JyBpbiBzKSB8fFxuICAgICAgICAodHlwZW9mIHMgPT09ICdzdHJpbmcnICYmIHMuc3RhcnRzV2l0aCgnPycpKTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgJiYgbmlsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG87XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vLFxuICAgICAgICBba106IGNhc3RUeXBlVXNpbmdTY2hlbWEodiwgcywgc2NoZW1hRGljdCksXG4gICAgICB9O1xuICAgIH0sIG9iaik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbmlsbGFibGUgPSB0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJyAmJiBzY2hlbWEuc3RhcnRzV2l0aCgnPycpO1xuICAgIGNvbnN0IHR5cGUgPVxuICAgICAgdHlwZW9mIHNjaGVtYSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBuaWxsYWJsZVxuICAgICAgICAgID8gc2NoZW1hLnN1YnN0cmluZygxKVxuICAgICAgICAgIDogc2NoZW1hXG4gICAgICAgIDogJ2FueSc7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpID8gKG5pbGxhYmxlID8gbnVsbCA6ICcnKSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpID8gKG5pbGxhYmxlID8gbnVsbCA6IDApIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpXG4gICAgICAgICAgPyBuaWxsYWJsZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgOiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAoc2NoZW1hRGljdFt0eXBlXSkge1xuICAgICAgICAgIGNvbnN0IGN2YWx1ZSA9IGNhc3RUeXBlVXNpbmdTY2hlbWEoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHNjaGVtYURpY3RbdHlwZV0sXG4gICAgICAgICAgICBzY2hlbWFEaWN0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9XG4gICAgICAgICAgICBpc01hcE9iamVjdChjdmFsdWUpICYmIE9iamVjdC5rZXlzKGN2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgICAgIHJldHVybiBpc0VtcHR5ICYmIG5pbGxhYmxlID8gbnVsbCA6IGN2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgYXMgYW55O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvb2t1cFZhbHVlKG9iajogdW5rbm93biwgcHJvcFJlZ0V4cHM6IFJlZ0V4cFtdKTogdW5rbm93biB7XG4gIGNvbnN0IHJlZ2V4cCA9IHByb3BSZWdFeHBzLnNoaWZ0KCk7XG4gIGlmICghcmVnZXhwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoaXNNYXBPYmplY3Qob2JqKSkge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICBpZiAocmVnZXhwLnRlc3QocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIGxvb2t1cFZhbHVlKG9ialtwcm9wXSwgcHJvcFJlZ0V4cHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvWE1MKG5hbWU6IG9iamVjdCB8IHN0cmluZyB8IG51bGwsIHZhbHVlPzogYW55KTogc3RyaW5nIHtcbiAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgdmFsdWUgPSBuYW1lO1xuICAgIG5hbWUgPSBudWxsO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKHYpID0+IHRvWE1MKG5hbWUsIHYpKS5qb2luKCcnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhdHRycyA9IFtdO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgYXR0cnMucHVzaCgneHNpOm5pbD1cInRydWVcIicpO1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9IGVsc2UgaWYgKGlzTWFwT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgZWxlbXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlW2tdO1xuICAgICAgICBpZiAoay5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICBjb25zdCBrayA9IGsuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgIGF0dHJzLnB1c2goYCR7a2t9PVwiJHt2IGFzIHN0cmluZ31cImApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1zLnB1c2godG9YTUwoaywgdikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGVsZW1zLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAgICAgLnJlcGxhY2UoLycvZywgJyZhcG9zOycpO1xuICAgIH1cbiAgICBjb25zdCBzdGFydFRhZyA9IG5hbWVcbiAgICAgID8gJzwnICsgbmFtZSArIChhdHRycy5sZW5ndGggPiAwID8gJyAnICsgYXR0cnMuam9pbignICcpIDogJycpICsgJz4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGVuZFRhZyA9IG5hbWUgPyAnPC8nICsgbmFtZSArICc+JyA6ICcnO1xuICAgIHJldHVybiBzdGFydFRhZyArIHZhbHVlICsgZW5kVGFnO1xuICB9XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IHR5cGUgU09BUE9wdGlvbnMgPSB7XG4gIGVuZHBvaW50VXJsOiBzdHJpbmc7XG4gIHhtbG5zPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBDbGFzcyBmb3IgU09BUCBlbmRwb2ludCBvZiBTYWxlc2ZvcmNlXG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubiAtIENvbm5lY3Rpb24gaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gU09BUCBlbmRwb2ludCBzZXR0aW5nIG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmVuZHBvaW50VXJsIC0gU09BUCBlbmRwb2ludCBVUkxcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy54bWxuc10gLSBYTUwgbmFtZXNwYWNlIGZvciBtZXRob2QgY2FsbCAoZGVmYXVsdCBpcyBcInVybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbVwiKVxuICovXG5leHBvcnQgY2xhc3MgU09BUDxTIGV4dGVuZHMgU2NoZW1hPiBleHRlbmRzIEh0dHBBcGk8Uz4ge1xuICBfZW5kcG9pbnRVcmw6IHN0cmluZztcbiAgX3htbG5zOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29ubjogQ29ubmVjdGlvbjxTPiwgb3B0aW9uczogU09BUE9wdGlvbnMpIHtcbiAgICBzdXBlcihjb25uLCBvcHRpb25zKTtcbiAgICBpZiAodGhpcy5fY29ubi5hY2Nlc3NUb2tlbiAmJiBpc0pXVFRva2VuKHRoaXMuX2Nvbm4uYWNjZXNzVG9rZW4pKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGJsb2NrIFNPQVAgcmVxdWVzdHMgd2l0aCBKV1QgdG9rZW5zIGJlY2F1c2UgdGhlIHJlc3BvbnNlIGlzOlxuICAgICAgLy8gc3RhdHVzQ29kZT01MDAgfCBib2R5PVwiSU5WQUxJRF9TRVNTSU9OX0lEXCIgKHhtbCksIHdoaWNoIHRyaWdnZXJzIHNlc3Npb24gcmVmcmVzaCBhbmQgZW50ZXJzIGluIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIHRocm93IG5ldyBFcnJvcignU09BUCBBUEkgZG9lcyBub3Qgc3VwcG9ydCBKV1QtYmFzZWQgYWNjZXNzIHRva2Vucy4gWW91IG11c3QgZGlzYWJsZSB0aGUgXCJJc3N1ZSBKU09OIFdlYiBUb2tlbiAoSldUKS1iYXNlZCBhY2Nlc3MgdG9rZW5zXCIgc2V0dGluZyBpbiB5b3VyIENvbm5lY3RlZCBBcHAgb3IgRXh0ZXJuYWwgQ2xpZW50IEFwcCcpXG4gICAgfVxuICAgIHRoaXMuX2VuZHBvaW50VXJsID0gb3B0aW9ucy5lbmRwb2ludFVybDtcbiAgICB0aGlzLl94bWxucyA9IG9wdGlvbnMueG1sbnMgfHwgJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbSc7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIFNPQVAgY2FsbCB1c2luZyBtZXRob2QgYW5kIGFyZ3VtZW50c1xuICAgKi9cbiAgYXN5bmMgaW52b2tlKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGFyZ3M6IG9iamVjdCxcbiAgICBzY2hlbWE/OiBTb2FwU2NoZW1hIHwgU29hcFNjaGVtYURlZixcbiAgICBzY2hlbWFEaWN0PzogeyBbbmFtZTogc3RyaW5nXTogU29hcFNjaGVtYURlZiB9LFxuICApIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmw6IHRoaXMuX2VuZHBvaW50VXJsLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQveG1sJyxcbiAgICAgICAgU09BUEFjdGlvbjogJ1wiXCInLFxuICAgICAgfSxcbiAgICAgIF9tZXNzYWdlOiB7IFttZXRob2RdOiBhcmdzIH0sXG4gICAgfSBhcyBIdHRwUmVxdWVzdCk7XG4gICAgcmV0dXJuIHNjaGVtYSA/IGNhc3RUeXBlVXNpbmdTY2hlbWEocmVzLCBzY2hlbWEsIHNjaGVtYURpY3QpIDogcmVzO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqL1xuICBiZWZvcmVTZW5kKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0ICYgeyBfbWVzc2FnZTogb2JqZWN0IH0pIHtcbiAgICByZXF1ZXN0LmJvZHkgPSB0aGlzLl9jcmVhdGVFbnZlbG9wZShyZXF1ZXN0Ll9tZXNzYWdlKTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZXF1ZXN0LmhlYWRlcnMgfHwge307XG5cbiAgICBjb25zdCBib2R5U2l6ZSA9IGdldEJvZHlTaXplKHJlcXVlc3QuYm9keSwgcmVxdWVzdC5oZWFkZXJzKTtcblxuICAgIGlmIChcbiAgICAgIHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcgJiZcbiAgICAgICEoJ3RyYW5zZmVyLWVuY29kaW5nJyBpbiBoZWFkZXJzKSAmJlxuICAgICAgISgnY29udGVudC1sZW5ndGgnIGluIGhlYWRlcnMpICYmXG4gICAgICAhIWJvZHlTaXplXG4gICAgKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoXG4gICAgICAgIGBtaXNzaW5nICdjb250ZW50LWxlbmd0aCcgaGVhZGVyLCBzZXR0aW5nIGl0IHRvOiAke2JvZHlTaXplfWAsXG4gICAgICApO1xuICAgICAgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IFN0cmluZyhib2R5U2l6ZSk7XG4gICAgfVxuXG4gICAgcmVxdWVzdC5oZWFkZXJzID0gaGVhZGVycztcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGlzU2Vzc2lvbkV4cGlyZWQocmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xuICAgIHJldHVybiAoXG4gICAgICByZXNwb25zZS5zdGF0dXNDb2RlID09PSA1MDAgJiZcbiAgICAgIC88ZmF1bHRjb2RlPlthLXpBLVpdKzpJTlZBTElEX1NFU1NJT05fSUQ8XFwvZmF1bHRjb2RlPi8udGVzdChyZXNwb25zZS5ib2R5KVxuICAgICk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBwYXJzZUVycm9yKGJvZHk6IHN0cmluZykge1xuICAgIGNvbnN0IGVycm9yID0gbG9va3VwVmFsdWUoYm9keSwgWy86RW52ZWxvcGUkLywgLzpCb2R5JC8sIC86RmF1bHQkL10pIGFzIHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JDb2RlOiBlcnJvci5mYXVsdGNvZGUsXG4gICAgICBtZXNzYWdlOiBlcnJvci5mYXVsdHN0cmluZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgYXN5bmMgZ2V0UmVzcG9uc2VCb2R5KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgc3VwZXIuZ2V0UmVzcG9uc2VCb2R5KHJlc3BvbnNlKTtcbiAgICByZXR1cm4gbG9va3VwVmFsdWUoYm9keSwgWy86RW52ZWxvcGUkLywgLzpCb2R5JC8sIC8uKy9dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NyZWF0ZUVudmVsb3BlKG1lc3NhZ2U6IG9iamVjdCkge1xuICAgIGNvbnN0IGhlYWRlcjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBjb25zdCBjb25uID0gdGhpcy5fY29ubjtcbiAgICBpZiAoY29ubi5hY2Nlc3NUb2tlbikge1xuICAgICAgaGVhZGVyLlNlc3Npb25IZWFkZXIgPSB7IHNlc3Npb25JZDogY29ubi5hY2Nlc3NUb2tlbiB9O1xuICAgIH1cbiAgICBpZiAoY29ubi5fY2FsbE9wdGlvbnMpIHtcbiAgICAgIGhlYWRlci5DYWxsT3B0aW9ucyA9IGNvbm4uX2NhbGxPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PicsXG4gICAgICAnPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCInLFxuICAgICAgJyB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiJyxcbiAgICAgICcgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj4nLFxuICAgICAgJzxzb2FwZW52OkhlYWRlciB4bWxucz1cIicgKyB0aGlzLl94bWxucyArICdcIj4nLFxuICAgICAgdG9YTUwoaGVhZGVyKSxcbiAgICAgICc8L3NvYXBlbnY6SGVhZGVyPicsXG4gICAgICAnPHNvYXBlbnY6Qm9keSB4bWxucz1cIicgKyB0aGlzLl94bWxucyArICdcIj4nLFxuICAgICAgdG9YTUwobWVzc2FnZSksXG4gICAgICAnPC9zb2FwZW52OkJvZHk+JyxcbiAgICAgICc8L3NvYXBlbnY6RW52ZWxvcGU+JyxcbiAgICBdLmpvaW4oJycpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNPQVA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7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