PDF_Generation_and_Automation/node_modules/jsforce/browser/connection.js
2025-08-24 12:01:08 +05:30

2300 lines
240 KiB
JavaScript

import _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct";
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 _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 _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 _Symbol$toPrimitive from "@babel/runtime-corejs3/core-js-stable/symbol/to-primitive";
import _typeof from "@babel/runtime-corejs3/helpers/typeof";
import _toConsumableArray from "@babel/runtime-corejs3/helpers/toConsumableArray";
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties";
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 _inherits from "@babel/runtime-corejs3/helpers/inherits";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray";
var _excluded = ["Id", "type", "attributes"],
_excluded2 = ["Id", "type", "attributes"],
_excluded3 = ["Id", "type", "attributes"],
_excluded4 = ["Id", "type", "attributes"];
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[_Symbol$toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
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 _context59; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context59 = {}.toString.call(r)).call(_context59, 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; }
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 _context57, _context58; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context57 = ownKeys(Object(t), !0)).call(_context57, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context58 = ownKeys(Object(t))).call(_context58, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
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; })(); }
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with";
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
import _parseInt from "@babel/runtime-corejs3/core-js-stable/parse-int";
import _JSON$stringify from "@babel/runtime-corejs3/core-js-stable/json/stringify";
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 _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import _Object$entries from "@babel/runtime-corejs3/core-js-stable/object/entries";
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.join.js";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.number.constructor.js";
import "core-js/modules/es.object.keys.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.match.js";
import "core-js/modules/es.string.replace.js";
/**
*
*/
import { EventEmitter } from 'events';
import jsforce from './jsforce';
import Transport, { CanvasTransport, XdProxyTransport, HttpProxyTransport } from './transport';
import { getLogger } from './util/logger';
import OAuth2 from './oauth2';
import Cache from './cache';
import HttpApi from './http-api';
import SessionRefreshDelegate from './session-refresh-delegate';
import Query from './query';
import SObject from './sobject';
import QuickAction from './quick-action';
import Process from './process';
import { formatDate } from './util/formatter';
import FormData from 'form-data';
/**
* type definitions
*/
/**
*
*/
var defaultConnectionConfig = {
loginUrl: 'https://login.salesforce.com',
instanceUrl: '',
version: '50.0',
logLevel: 'NONE',
maxRequest: 10
};
/**
*
*/
function esc(str) {
return String(str || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
/**
*
*/
function parseSignedRequest(sr) {
if (typeof sr === 'string') {
if (_startsWithInstanceProperty(sr).call(sr, '{')) {
// might be JSON
return JSON.parse(sr);
} // might be original base64-encoded signed request
var msg = sr.split('.').pop(); // retrieve latter part
if (!msg) {
throw new Error('Invalid signed request');
}
var json = Buffer.from(msg, 'base64').toString('utf-8');
return JSON.parse(json);
}
return sr;
}
/** @private **/
function parseIdUrl(url) {
var _context;
var _url$split$slice = _sliceInstanceProperty(_context = url.split('/')).call(_context, -2),
_url$split$slice2 = _slicedToArray(_url$split$slice, 2),
organizationId = _url$split$slice2[0],
id = _url$split$slice2[1];
return {
id: id,
organizationId: organizationId,
url: url
};
}
/**
* Session Refresh delegate function for OAuth2 authz code flow
* @private
*/
function oauthRefreshFn(_x, _x2) {
return _oauthRefreshFn.apply(this, arguments);
}
/**
* Session Refresh delegate function for username/password login
* @private
*/
function _oauthRefreshFn() {
_oauthRefreshFn = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee37(conn, callback) {
var res, userInfo;
return _regeneratorRuntime.wrap(function _callee37$(_context56) {
while (1) switch (_context56.prev = _context56.next) {
case 0:
_context56.prev = 0;
if (conn.refreshToken) {
_context56.next = 3;
break;
}
throw new Error('No refresh token found in the connection');
case 3:
_context56.next = 5;
return conn.oauth2.refreshToken(conn.refreshToken);
case 5:
res = _context56.sent;
userInfo = parseIdUrl(res.id);
conn._establish({
instanceUrl: res.instance_url,
accessToken: res.access_token,
userInfo: userInfo
});
callback(undefined, res.access_token, res);
_context56.next = 18;
break;
case 11:
_context56.prev = 11;
_context56.t0 = _context56["catch"](0);
if (!(_context56.t0 instanceof Error)) {
_context56.next = 17;
break;
}
callback(_context56.t0);
_context56.next = 18;
break;
case 17:
throw _context56.t0;
case 18:
case "end":
return _context56.stop();
}
}, _callee37, null, [[0, 11]]);
}));
return _oauthRefreshFn.apply(this, arguments);
}
function createUsernamePasswordRefreshFn(username, password) {
return /*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(conn, callback) {
return _regeneratorRuntime.wrap(function _callee$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
_context2.next = 3;
return conn.login(username, password);
case 3:
if (conn.accessToken) {
_context2.next = 5;
break;
}
throw new Error('Access token not found after login');
case 5:
callback(null, conn.accessToken);
_context2.next = 15;
break;
case 8:
_context2.prev = 8;
_context2.t0 = _context2["catch"](0);
if (!(_context2.t0 instanceof Error)) {
_context2.next = 14;
break;
}
callback(_context2.t0);
_context2.next = 15;
break;
case 14:
throw _context2.t0;
case 15:
case "end":
return _context2.stop();
}
}, _callee, null, [[0, 8]]);
}));
return function (_x3, _x4) {
return _ref.apply(this, arguments);
};
}();
}
/**
* @private
*/
function toSaveResult(err) {
return {
success: false,
errors: [err]
};
}
/**
*
*/
function raiseNoModuleError(name) {
var _context3;
throw new Error(_concatInstanceProperty(_context3 = "API module '".concat(name, "' is not loaded, load 'jsforce/api/")).call(_context3, name, "' explicitly"));
}
/*
* Constant of maximum records num in DML operation (update/delete)
*/
var MAX_DML_COUNT = 200;
/**
*
*/
export var Connection = /*#__PURE__*/function (_EventEmitter) {
/**
*
*/
function Connection() {
var _this;
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Connection);
_this = _callSuper(this, Connection);
_defineProperty(_this, "limitInfo", {});
_defineProperty(_this, "sobjects", {});
/**
* Synonym of Connection#create()
*/
_defineProperty(_this, "insert", _this.create);
/**
* Synonym of Connection#destroy()
*/
_defineProperty(_this, "delete", _this.destroy);
/**
* Synonym of Connection#destroy()
*/
_defineProperty(_this, "del", _this.destroy);
/**
* Module which manages process rules and approval processes
*/
_defineProperty(_this, "process", new Process(_this));
var loginUrl = config.loginUrl,
instanceUrl = config.instanceUrl,
version = config.version,
oauth2 = config.oauth2,
maxRequest = config.maxRequest,
logLevel = config.logLevel,
proxyUrl = config.proxyUrl,
httpProxy = config.httpProxy;
_this.loginUrl = loginUrl || defaultConnectionConfig.loginUrl;
_this.instanceUrl = instanceUrl || defaultConnectionConfig.instanceUrl;
if (_this.isLightningInstance()) {
throw new Error('lightning URLs are not valid as instance URLs');
}
_this.version = version || defaultConnectionConfig.version;
_this.oauth2 = oauth2 instanceof OAuth2 ? oauth2 : new OAuth2(_objectSpread({
loginUrl: _this.loginUrl,
proxyUrl: proxyUrl,
httpProxy: httpProxy
}, oauth2));
var refreshFn = config.refreshFn;
if (!refreshFn && _this.oauth2.clientId) {
refreshFn = oauthRefreshFn;
}
if (refreshFn) {
_this._refreshDelegate = new SessionRefreshDelegate(_this, refreshFn);
}
_this._maxRequest = maxRequest || defaultConnectionConfig.maxRequest;
_this._logger = logLevel ? Connection._logger.createInstance(logLevel) : Connection._logger;
_this._logLevel = logLevel;
_this._transport = proxyUrl ? new XdProxyTransport(proxyUrl) : httpProxy ? new HttpProxyTransport(httpProxy) : new Transport();
_this._callOptions = config.callOptions;
_this.cache = new Cache();
var describeCacheKey = function describeCacheKey(type) {
return type ? "describe.".concat(type) : 'describe';
};
var describe = Connection.prototype.describe;
_this.describe = _this.cache.createCachedFunction(describe, _this, {
key: describeCacheKey,
strategy: 'NOCACHE'
});
_this.describe$ = _this.cache.createCachedFunction(describe, _this, {
key: describeCacheKey,
strategy: 'HIT'
});
_this.describe$$ = _this.cache.createCachedFunction(describe, _this, {
key: describeCacheKey,
strategy: 'IMMEDIATE'
});
_this.describeSObject = _this.describe;
_this.describeSObject$ = _this.describe$;
_this.describeSObject$$ = _this.describe$$;
var describeGlobal = Connection.prototype.describeGlobal;
_this.describeGlobal = _this.cache.createCachedFunction(describeGlobal, _this, {
key: 'describeGlobal',
strategy: 'NOCACHE'
});
_this.describeGlobal$ = _this.cache.createCachedFunction(describeGlobal, _this, {
key: 'describeGlobal',
strategy: 'HIT'
});
_this.describeGlobal$$ = _this.cache.createCachedFunction(describeGlobal, _this, {
key: 'describeGlobal',
strategy: 'IMMEDIATE'
});
var accessToken = config.accessToken,
refreshToken = config.refreshToken,
sessionId = config.sessionId,
serverUrl = config.serverUrl,
signedRequest = config.signedRequest;
_this._establish({
accessToken: accessToken,
refreshToken: refreshToken,
instanceUrl: instanceUrl,
sessionId: sessionId,
serverUrl: serverUrl,
signedRequest: signedRequest
});
jsforce.emit('connection:new', _this);
return _this;
}
/* @private */
_inherits(Connection, _EventEmitter);
return _createClass(Connection, [{
key: "analytics",
get:
// describe: (name: string) => Promise<DescribeSObjectResult>;
// describeGlobal: () => Promise<DescribeGlobalResult>;
// API libs are not instantiated here so that core module to remain without dependencies to them
// It is responsible for developers to import api libs explicitly if they are using 'jsforce/core' instead of 'jsforce'.
function get() {
return raiseNoModuleError('analytics');
}
}, {
key: "apex",
get: function get() {
return raiseNoModuleError('apex');
}
}, {
key: "bulk",
get: function get() {
return raiseNoModuleError('bulk');
}
}, {
key: "bulk2",
get: function get() {
return raiseNoModuleError('bulk2');
}
}, {
key: "chatter",
get: function get() {
return raiseNoModuleError('chatter');
}
}, {
key: "metadata",
get: function get() {
return raiseNoModuleError('metadata');
}
}, {
key: "soap",
get: function get() {
return raiseNoModuleError('soap');
}
}, {
key: "streaming",
get: function get() {
return raiseNoModuleError('streaming');
}
}, {
key: "tooling",
get: function get() {
return raiseNoModuleError('tooling');
}
}, {
key: "_establish",
value: function _establish(options) {
var _context4;
var accessToken = options.accessToken,
refreshToken = options.refreshToken,
instanceUrl = options.instanceUrl,
sessionId = options.sessionId,
serverUrl = options.serverUrl,
signedRequest = options.signedRequest,
userInfo = options.userInfo;
this.instanceUrl = serverUrl ? _sliceInstanceProperty(_context4 = serverUrl.split('/')).call(_context4, 0, 3).join('/') : instanceUrl || this.instanceUrl;
this.accessToken = sessionId || accessToken || this.accessToken;
this.refreshToken = refreshToken || this.refreshToken;
if (this.refreshToken && !this._refreshDelegate) {
throw new Error('Refresh token is specified without oauth2 client information or refresh function');
}
var signedRequestObject = signedRequest && parseSignedRequest(signedRequest);
if (signedRequestObject) {
this.accessToken = signedRequestObject.client.oauthToken;
if (CanvasTransport.supported) {
this._transport = new CanvasTransport(signedRequestObject);
}
}
this.userInfo = userInfo || this.userInfo;
this._sessionType = sessionId ? 'soap' : 'oauth2';
this._resetInstance();
}
/* @priveate */
}, {
key: "_clearSession",
value: function _clearSession() {
this.accessToken = null;
this.refreshToken = null;
this.instanceUrl = defaultConnectionConfig.instanceUrl;
this.userInfo = null;
this._sessionType = null;
}
/* @priveate */
}, {
key: "_resetInstance",
value: function _resetInstance() {
var _this2 = this;
this.limitInfo = {};
this.sobjects = {};
// TODO impl cache
this.cache.clear();
this.cache.get('describeGlobal').removeAllListeners('value');
this.cache.get('describeGlobal').on('value', function (_ref2) {
var result = _ref2.result;
if (result) {
var _iterator = _createForOfIteratorHelper(result.sobjects),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var so = _step.value;
_this2.sobject(so.name);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
});
/*
if (this.tooling) {
this.tooling._resetInstance();
}
*/
}
/**
* Authorize the connection using OAuth2 flow.
* Typically, just pass the code returned from authorization server in the first argument to complete authorization.
* If you want to authorize with grant types other than `authorization_code`, you can also pass params object with the grant type.
*
* @returns {Promise<UserInfo>} An object that contains the user ID, org ID and identity URL.
*
*/
}, {
key: "authorize",
value: (function () {
var _authorize = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(codeOrParams) {
var _context5;
var params,
res,
userInfo,
_args2 = arguments;
return _regeneratorRuntime.wrap(function _callee2$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
params = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {};
_context6.next = 3;
return this.oauth2.requestToken(codeOrParams, params);
case 3:
res = _context6.sent;
userInfo = parseIdUrl(res.id);
this._establish({
instanceUrl: res.instance_url,
accessToken: res.access_token,
refreshToken: res.refresh_token,
userInfo: userInfo
});
this._logger.debug(_concatInstanceProperty(_context5 = "<login> completed. user id = ".concat(userInfo.id, ", org id = ")).call(_context5, userInfo.organizationId));
return _context6.abrupt("return", userInfo);
case 8:
case "end":
return _context6.stop();
}
}, _callee2, this);
}));
function authorize(_x5) {
return _authorize.apply(this, arguments);
}
return authorize;
}()
/**
*
*/
)
}, {
key: "login",
value: (function () {
var _login = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(username, password) {
var _this$oauth;
return _regeneratorRuntime.wrap(function _callee3$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
this._refreshDelegate = new SessionRefreshDelegate(this, createUsernamePasswordRefreshFn(username, password));
if (!((_this$oauth = this.oauth2) !== null && _this$oauth !== void 0 && _this$oauth.clientId && this.oauth2.clientSecret)) {
_context7.next = 3;
break;
}
return _context7.abrupt("return", this.loginByOAuth2(username, password));
case 3:
return _context7.abrupt("return", this.loginBySoap(username, password));
case 4:
case "end":
return _context7.stop();
}
}, _callee3, this);
}));
function login(_x6, _x7) {
return _login.apply(this, arguments);
}
return login;
}()
/**
* Login by OAuth2 username & password flow
*/
)
}, {
key: "loginByOAuth2",
value: (function () {
var _loginByOAuth = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(username, password) {
var _context8;
var res, userInfo;
return _regeneratorRuntime.wrap(function _callee4$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
_context9.next = 2;
return this.oauth2.authenticate(username, password);
case 2:
res = _context9.sent;
userInfo = parseIdUrl(res.id);
this._establish({
instanceUrl: res.instance_url,
accessToken: res.access_token,
userInfo: userInfo
});
this._logger.info(_concatInstanceProperty(_context8 = "<login> completed. user id = ".concat(userInfo.id, ", org id = ")).call(_context8, userInfo.organizationId));
return _context9.abrupt("return", userInfo);
case 7:
case "end":
return _context9.stop();
}
}, _callee4, this);
}));
function loginByOAuth2(_x8, _x9) {
return _loginByOAuth.apply(this, arguments);
}
return loginByOAuth2;
}()
/**
*
*/
)
}, {
key: "loginBySoap",
value: (function () {
var _loginBySoap = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(username, password) {
var _context10, _context11;
var body, soapLoginEndpoint, response, m, faultstring, serverUrl, sessionId, userId, organizationId, idUrl, userInfo;
return _regeneratorRuntime.wrap(function _callee5$(_context12) {
while (1) switch (_context12.prev = _context12.next) {
case 0:
if (!(!username || !password)) {
_context12.next = 2;
break;
}
return _context12.abrupt("return", _Promise.reject(new Error('no username password given')));
case 2:
body = ['<se:Envelope xmlns:se="http://schemas.xmlsoap.org/soap/envelope/">', '<se:Header/>', '<se:Body>', '<login xmlns="urn:partner.soap.sforce.com">', "<username>".concat(esc(username), "</username>"), "<password>".concat(esc(password), "</password>"), '</login>', '</se:Body>', '</se:Envelope>'].join('');
soapLoginEndpoint = [this.loginUrl, 'services/Soap/u', this.version].join('/');
_context12.next = 6;
return this._transport.httpRequest({
method: 'POST',
url: soapLoginEndpoint,
body: body,
headers: {
'Content-Type': 'text/xml',
SOAPAction: '""'
}
});
case 6:
response = _context12.sent;
if (!(response.statusCode >= 400)) {
_context12.next = 11;
break;
}
m = response.body.match(/<faultstring>([^<]+)<\/faultstring>/);
faultstring = m && m[1];
throw new Error(faultstring || response.body);
case 11:
if (!response.body.match(/<passwordExpired>true<\/passwordExpired>/g)) {
_context12.next = 13;
break;
}
throw new Error('Unable to login because the used password has expired.');
case 13:
this._logger.debug("SOAP response = ".concat(response.body));
m = response.body.match(/<serverUrl>([^<]+)<\/serverUrl>/);
serverUrl = m && m[1];
m = response.body.match(/<sessionId>([^<]+)<\/sessionId>/);
sessionId = m && m[1];
m = response.body.match(/<userId>([^<]+)<\/userId>/);
userId = m && m[1];
m = response.body.match(/<organizationId>([^<]+)<\/organizationId>/);
organizationId = m && m[1];
if (!(!serverUrl || !sessionId || !userId || !organizationId)) {
_context12.next = 24;
break;
}
throw new Error('could not extract session information from login response');
case 24:
idUrl = [this.loginUrl, 'id', organizationId, userId].join('/');
userInfo = {
id: userId,
organizationId: organizationId,
url: idUrl
};
this._establish({
serverUrl: _sliceInstanceProperty(_context10 = serverUrl.split('/')).call(_context10, 0, 3).join('/'),
sessionId: sessionId,
userInfo: userInfo
});
this._logger.info(_concatInstanceProperty(_context11 = "<login> completed. user id = ".concat(userId, ", org id = ")).call(_context11, organizationId));
return _context12.abrupt("return", userInfo);
case 29:
case "end":
return _context12.stop();
}
}, _callee5, this);
}));
function loginBySoap(_x10, _x11) {
return _loginBySoap.apply(this, arguments);
}
return loginBySoap;
}()
/**
* Logout the current session
*/
)
}, {
key: "logout",
value: (function () {
var _logout = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(revoke) {
return _regeneratorRuntime.wrap(function _callee6$(_context13) {
while (1) switch (_context13.prev = _context13.next) {
case 0:
this._refreshDelegate = undefined;
if (!(this._sessionType === 'oauth2')) {
_context13.next = 3;
break;
}
return _context13.abrupt("return", this.logoutByOAuth2(revoke));
case 3:
return _context13.abrupt("return", this.logoutBySoap(revoke));
case 4:
case "end":
return _context13.stop();
}
}, _callee6, this);
}));
function logout(_x12) {
return _logout.apply(this, arguments);
}
return logout;
}()
/**
* Logout the current session by revoking access token via OAuth2 session revoke
*/
)
}, {
key: "logoutByOAuth2",
value: (function () {
var _logoutByOAuth = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(revoke) {
var token;
return _regeneratorRuntime.wrap(function _callee7$(_context14) {
while (1) switch (_context14.prev = _context14.next) {
case 0:
token = revoke ? this.refreshToken : this.accessToken;
if (!token) {
_context14.next = 4;
break;
}
_context14.next = 4;
return this.oauth2.revokeToken(token);
case 4:
// Destroy the session bound to this connection
this._clearSession();
this._resetInstance();
case 6:
case "end":
return _context14.stop();
}
}, _callee7, this);
}));
function logoutByOAuth2(_x13) {
return _logoutByOAuth.apply(this, arguments);
}
return logoutByOAuth2;
}()
/**
* Logout the session by using SOAP web service API
*/
)
}, {
key: "logoutBySoap",
value: (function () {
var _logoutBySoap = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8(revoke) {
var _context15;
var body, response, m, faultstring;
return _regeneratorRuntime.wrap(function _callee8$(_context16) {
while (1) switch (_context16.prev = _context16.next) {
case 0:
body = ['<se:Envelope xmlns:se="http://schemas.xmlsoap.org/soap/envelope/">', '<se:Header>', '<SessionHeader xmlns="urn:partner.soap.sforce.com">', "<sessionId>".concat(esc(revoke ? this.refreshToken : this.accessToken), "</sessionId>"), '</SessionHeader>', '</se:Header>', '<se:Body>', '<logout xmlns="urn:partner.soap.sforce.com"/>', '</se:Body>', '</se:Envelope>'].join('');
_context16.next = 3;
return this._transport.httpRequest({
method: 'POST',
url: [this.instanceUrl, 'services/Soap/u', this.version].join('/'),
body: body,
headers: {
'Content-Type': 'text/xml',
SOAPAction: '""'
}
});
case 3:
response = _context16.sent;
this._logger.debug(_concatInstanceProperty(_context15 = "SOAP statusCode = ".concat(response.statusCode, ", response = ")).call(_context15, response.body));
if (!(response.statusCode >= 400)) {
_context16.next = 9;
break;
}
m = response.body.match(/<faultstring>([^<]+)<\/faultstring>/);
faultstring = m && m[1];
throw new Error(faultstring || response.body);
case 9:
// Destroy the session bound to this connection
this._clearSession();
this._resetInstance();
case 11:
case "end":
return _context16.stop();
}
}, _callee8, this);
}));
function logoutBySoap(_x14) {
return _logoutBySoap.apply(this, arguments);
}
return logoutBySoap;
}()
/**
* Send REST API request with given HTTP request info, with connected session information.
*
* Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe')
* , relative path from root ('/services/data/v32.0/sobjects/Account/describe')
* , or relative path from version root ('/sobjects/Account/describe').
*/
)
}, {
key: "request",
value: function request(_request) {
var _this3 = this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// if request is simple string, regard it as url in GET method
var request_ = typeof _request === 'string' ? {
method: 'GET',
url: _request
} : _request;
// if url is given in relative path, prepend base url or instance url before.
request_ = _objectSpread(_objectSpread({}, request_), {}, {
url: this._normalizeUrl(request_.url)
});
var httpApi = new HttpApi(this, options);
// log api usage and its quota
httpApi.on('response', function (response) {
if (response.headers && response.headers['sforce-limit-info']) {
var apiUsage = response.headers['sforce-limit-info'].match(/api-usage=(\d+)\/(\d+)/);
if (apiUsage) {
_this3.limitInfo = {
apiUsage: {
used: _parseInt(apiUsage[1], 10),
limit: _parseInt(apiUsage[2], 10)
}
};
}
}
});
return httpApi.request(request_);
}
/**
* Send HTTP GET request
*
* Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe')
* , relative path from root ('/services/data/v32.0/sobjects/Account/describe')
* , or relative path from version root ('/sobjects/Account/describe').
*/
}, {
key: "requestGet",
value: function requestGet(url, options) {
var request = {
method: 'GET',
url: url
};
return this.request(request, options);
}
/**
* Send HTTP POST request with JSON body, with connected session information
*
* Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe')
* , relative path from root ('/services/data/v32.0/sobjects/Account/describe')
* , or relative path from version root ('/sobjects/Account/describe').
*/
}, {
key: "requestPost",
value: function requestPost(url, body, options) {
var request = {
method: 'POST',
url: url,
body: _JSON$stringify(body),
headers: {
'content-type': 'application/json'
}
};
return this.request(request, options);
}
/**
* Send HTTP PUT request with JSON body, with connected session information
*
* Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe')
* , relative path from root ('/services/data/v32.0/sobjects/Account/describe')
* , or relative path from version root ('/sobjects/Account/describe').
*/
}, {
key: "requestPut",
value: function requestPut(url, body, options) {
var request = {
method: 'PUT',
url: url,
body: _JSON$stringify(body),
headers: {
'content-type': 'application/json'
}
};
return this.request(request, options);
}
/**
* Send HTTP PATCH request with JSON body
*
* Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe')
* , relative path from root ('/services/data/v32.0/sobjects/Account/describe')
* , or relative path from version root ('/sobjects/Account/describe').
*/
}, {
key: "requestPatch",
value: function requestPatch(url, body, options) {
var request = {
method: 'PATCH',
url: url,
body: _JSON$stringify(body),
headers: {
'content-type': 'application/json'
}
};
return this.request(request, options);
}
/**
* Send HTTP DELETE request
*
* Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe')
* , relative path from root ('/services/data/v32.0/sobjects/Account/describe')
* , or relative path from version root ('/sobjects/Account/describe').
*/
}, {
key: "requestDelete",
value: function requestDelete(url, options) {
var request = {
method: 'DELETE',
url: url
};
return this.request(request, options);
}
/** @private **/
}, {
key: "_baseUrl",
value: function _baseUrl() {
return [this.instanceUrl, 'services/data', "v".concat(this.version)].join('/');
}
/**
* Convert path to absolute url
* @private
*/
}, {
key: "_normalizeUrl",
value: function _normalizeUrl(url) {
if (_startsWithInstanceProperty(url).call(url, '/')) {
if (_startsWithInstanceProperty(url).call(url, this.instanceUrl + '/services/')) {
return url;
}
if (_startsWithInstanceProperty(url).call(url, '/services/')) {
return this.instanceUrl + url;
}
return this._baseUrl() + url;
}
return url;
}
/**
*
*/
}, {
key: "query",
value: function query(soql, options) {
return new Query(this, soql, options);
}
/**
* Execute search by SOSL
*
* @param {String} sosl - SOSL string
* @param {Callback.<Array.<RecordResult>>} [callback] - Callback function
* @returns {Promise.<Array.<RecordResult>>}
*/
}, {
key: "search",
value: function search(sosl) {
var url = this._baseUrl() + '/search?q=' + encodeURIComponent(sosl);
return this.request(url);
}
/**
*
*/
}, {
key: "queryMore",
value: function queryMore(locator, options) {
return new Query(this, {
locator: locator
}, options);
}
/* */
}, {
key: "_ensureVersion",
value: function _ensureVersion(majorVersion) {
var versions = this.version.split('.');
return _parseInt(versions[0], 10) >= majorVersion;
}
/* */
}, {
key: "_supports",
value: function _supports(feature) {
switch (feature) {
case 'sobject-collection':
// sobject collection is available only in API ver 42.0+
return this._ensureVersion(42);
default:
return false;
}
}
/**
* Retrieve specified records
*/
}, {
key: "retrieve",
value: function () {
var _retrieve = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee9(type, ids) {
var options,
_args9 = arguments;
return _regeneratorRuntime.wrap(function _callee9$(_context17) {
while (1) switch (_context17.prev = _context17.next) {
case 0:
options = _args9.length > 2 && _args9[2] !== undefined ? _args9[2] : {};
return _context17.abrupt("return", _Array$isArray(ids) ?
// check the version whether SObject collection API is supported (42.0)
this._ensureVersion(42) ? this._retrieveMany(type, ids, options) : this._retrieveParallel(type, ids, options) : this._retrieveSingle(type, ids, options));
case 2:
case "end":
return _context17.stop();
}
}, _callee9, this);
}));
function retrieve(_x15, _x16) {
return _retrieve.apply(this, arguments);
}
return retrieve;
}() /** @private */
}, {
key: "_retrieveSingle",
value: (function () {
var _retrieveSingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee10(type, id, options) {
var url, fields, headers;
return _regeneratorRuntime.wrap(function _callee10$(_context18) {
while (1) switch (_context18.prev = _context18.next) {
case 0:
if (id) {
_context18.next = 2;
break;
}
throw new Error('Invalid record ID. Specify valid record ID value');
case 2:
url = [this._baseUrl(), 'sobjects', type, id].join('/');
fields = options.fields, headers = options.headers;
if (fields) {
url += "?fields=".concat(fields.join(','));
}
return _context18.abrupt("return", this.request({
method: 'GET',
url: url,
headers: headers
}));
case 6:
case "end":
return _context18.stop();
}
}, _callee10, this);
}));
function _retrieveSingle(_x17, _x18, _x19) {
return _retrieveSingle2.apply(this, arguments);
}
return _retrieveSingle;
}() /** @private */)
}, {
key: "_retrieveParallel",
value: (function () {
var _retrieveParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee11(type, ids, options) {
var _this4 = this;
return _regeneratorRuntime.wrap(function _callee11$(_context19) {
while (1) switch (_context19.prev = _context19.next) {
case 0:
if (!(ids.length > this._maxRequest)) {
_context19.next = 2;
break;
}
throw new Error('Exceeded max limit of concurrent call');
case 2:
return _context19.abrupt("return", _Promise.all(_mapInstanceProperty(ids).call(ids, function (id) {
return _this4._retrieveSingle(type, id, options).catch(function (err) {
if (options.allOrNone || err.errorCode !== 'NOT_FOUND') {
throw err;
}
return null;
});
})));
case 3:
case "end":
return _context19.stop();
}
}, _callee11, this);
}));
function _retrieveParallel(_x20, _x21, _x22) {
return _retrieveParallel2.apply(this, arguments);
}
return _retrieveParallel;
}() /** @private */)
}, {
key: "_retrieveMany",
value: (function () {
var _retrieveMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee12(type, ids, options) {
var _context20;
var url, fields;
return _regeneratorRuntime.wrap(function _callee12$(_context21) {
while (1) switch (_context21.prev = _context21.next) {
case 0:
if (!(ids.length === 0)) {
_context21.next = 2;
break;
}
return _context21.abrupt("return", []);
case 2:
url = [this._baseUrl(), 'composite', 'sobjects', type].join('/');
_context21.t0 = options.fields;
if (_context21.t0) {
_context21.next = 10;
break;
}
_context21.t1 = _mapInstanceProperty;
_context21.next = 8;
return this.describe$(type);
case 8:
_context21.t2 = _context20 = _context21.sent.fields;
_context21.t0 = (0, _context21.t1)(_context21.t2).call(_context20, function (field) {
return field.name;
});
case 10:
fields = _context21.t0;
return _context21.abrupt("return", this.request({
method: 'POST',
url: url,
body: _JSON$stringify({
ids: ids,
fields: fields
}),
headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, {
'content-type': 'application/json'
})
}));
case 12:
case "end":
return _context21.stop();
}
}, _callee12, this);
}));
function _retrieveMany(_x23, _x24, _x25) {
return _retrieveMany2.apply(this, arguments);
}
return _retrieveMany;
}()
/**
* Create records
*/
)
}, {
key: "create",
value: (
/**
* @param type
* @param records
* @param options
*/
function () {
var _create = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee13(type, records) {
var options,
ret,
_args13 = arguments;
return _regeneratorRuntime.wrap(function _callee13$(_context22) {
while (1) switch (_context22.prev = _context22.next) {
case 0:
options = _args13.length > 2 && _args13[2] !== undefined ? _args13[2] : {};
if (!_Array$isArray(records)) {
_context22.next = 14;
break;
}
if (!this._ensureVersion(42)) {
_context22.next = 8;
break;
}
_context22.next = 5;
return this._createMany(type, records, options);
case 5:
_context22.t1 = _context22.sent;
_context22.next = 11;
break;
case 8:
_context22.next = 10;
return this._createParallel(type, records, options);
case 10:
_context22.t1 = _context22.sent;
case 11:
_context22.t0 = _context22.t1;
_context22.next = 17;
break;
case 14:
_context22.next = 16;
return this._createSingle(type, records, options);
case 16:
_context22.t0 = _context22.sent;
case 17:
ret = _context22.t0;
return _context22.abrupt("return", ret);
case 19:
case "end":
return _context22.stop();
}
}, _callee13, this);
}));
function create(_x26, _x27) {
return _create.apply(this, arguments);
}
return create;
}() /** @private */)
}, {
key: "_createSingle",
value: (function () {
var _createSingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee14(type, record, options) {
var Id, rtype, attributes, rec, sobjectType, url, contentType, body, _context23, form;
return _regeneratorRuntime.wrap(function _callee14$(_context24) {
while (1) switch (_context24.prev = _context24.next) {
case 0:
Id = record.Id, rtype = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded);
sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype;
if (sobjectType) {
_context24.next = 4;
break;
}
throw new Error('No SObject Type defined in record');
case 4:
url = [this._baseUrl(), 'sobjects', sobjectType].join('/');
if (options !== null && options !== void 0 && options.multipartFileFields) {
// Send the record as a multipart/form-data request. Useful for fields containing large binary blobs.
form = new FormData(); // Extract the fields requested to be sent separately from the JSON
_forEachInstanceProperty(_context23 = _Object$entries(options.multipartFileFields)).call(_context23, function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
fieldName = _ref4[0],
fileDetails = _ref4[1];
form.append(fieldName, Buffer.from(rec[fieldName], 'base64'), fileDetails);
delete rec[fieldName];
});
// Serialize the remaining fields as JSON
form.append(type, _JSON$stringify(rec), {
contentType: 'application/json'
});
contentType = form.getHeaders()['content-type']; // This is necessary to ensure the 'boundary' is present
body = form;
} else {
// Default behavior: send the request as JSON
contentType = 'application/json';
body = _JSON$stringify(rec);
}
return _context24.abrupt("return", this.request({
method: 'POST',
url: url,
body: body,
headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, {
'content-type': contentType
})
}));
case 7:
case "end":
return _context24.stop();
}
}, _callee14, this);
}));
function _createSingle(_x28, _x29, _x30) {
return _createSingle2.apply(this, arguments);
}
return _createSingle;
}() /** @private */)
}, {
key: "_createParallel",
value: (function () {
var _createParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee15(type, records, options) {
var _this5 = this;
return _regeneratorRuntime.wrap(function _callee15$(_context25) {
while (1) switch (_context25.prev = _context25.next) {
case 0:
if (!(records.length > this._maxRequest)) {
_context25.next = 2;
break;
}
throw new Error('Exceeded max limit of concurrent call');
case 2:
return _context25.abrupt("return", _Promise.all(_mapInstanceProperty(records).call(records, function (record) {
return _this5._createSingle(type, record, options).catch(function (err) {
// be aware that allOrNone in parallel mode will not revert the other successful requests
// it only raises error when met at least one failed request.
if (options.allOrNone || !err.errorCode) {
throw err;
}
return toSaveResult(err);
});
})));
case 3:
case "end":
return _context25.stop();
}
}, _callee15, this);
}));
function _createParallel(_x31, _x32, _x33) {
return _createParallel2.apply(this, arguments);
}
return _createParallel;
}() /** @private */)
}, {
key: "_createMany",
value: (function () {
var _createMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee16(type, records, options) {
var _context26, _records, url;
return _regeneratorRuntime.wrap(function _callee16$(_context27) {
while (1) switch (_context27.prev = _context27.next) {
case 0:
if (!(records.length === 0)) {
_context27.next = 2;
break;
}
return _context27.abrupt("return", _Promise.resolve([]));
case 2:
if (!(records.length > MAX_DML_COUNT && options.allowRecursive)) {
_context27.next = 16;
break;
}
_context27.t0 = _concatInstanceProperty(_context26 = []);
_context27.t1 = _context26;
_context27.t2 = _toConsumableArray;
_context27.next = 8;
return this._createMany(type, _sliceInstanceProperty(records).call(records, 0, MAX_DML_COUNT), options);
case 8:
_context27.t3 = _context27.sent;
_context27.t4 = (0, _context27.t2)(_context27.t3);
_context27.t5 = _toConsumableArray;
_context27.next = 13;
return this._createMany(type, _sliceInstanceProperty(records).call(records, MAX_DML_COUNT), options);
case 13:
_context27.t6 = _context27.sent;
_context27.t7 = (0, _context27.t5)(_context27.t6);
return _context27.abrupt("return", _context27.t0.call.call(_context27.t0, _context27.t1, _context27.t4, _context27.t7));
case 16:
_records = _mapInstanceProperty(records).call(records, function (record) {
var Id = record.Id,
rtype = record.type,
attributes = record.attributes,
rec = _objectWithoutProperties(record, _excluded2);
var sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype;
if (!sobjectType) {
throw new Error('No SObject Type defined in record');
}
return _objectSpread({
attributes: {
type: sobjectType
}
}, rec);
});
url = [this._baseUrl(), 'composite', 'sobjects'].join('/');
return _context27.abrupt("return", this.request({
method: 'POST',
url: url,
body: _JSON$stringify({
allOrNone: options.allOrNone || false,
records: _records
}),
headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, {
'content-type': 'application/json'
})
}));
case 19:
case "end":
return _context27.stop();
}
}, _callee16, this);
}));
function _createMany(_x34, _x35, _x36) {
return _createMany2.apply(this, arguments);
}
return _createMany;
}())
}, {
key: "update",
value:
/**
* @param type
* @param records
* @param options
*/
function update(type, records) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return _Array$isArray(records) ?
// check the version whether SObject collection API is supported (42.0)
this._ensureVersion(42) ? this._updateMany(type, records, options) : this._updateParallel(type, records, options) : this._updateSingle(type, records, options);
}
/** @private */
}, {
key: "_updateSingle",
value: (function () {
var _updateSingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee17(type, record, options) {
var id, rtype, attributes, rec, sobjectType, url;
return _regeneratorRuntime.wrap(function _callee17$(_context28) {
while (1) switch (_context28.prev = _context28.next) {
case 0:
id = record.Id, rtype = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded3);
if (id) {
_context28.next = 3;
break;
}
throw new Error('Record id is not found in record.');
case 3:
sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype;
if (sobjectType) {
_context28.next = 6;
break;
}
throw new Error('No SObject Type defined in record');
case 6:
url = [this._baseUrl(), 'sobjects', sobjectType, id].join('/');
return _context28.abrupt("return", this.request({
method: 'PATCH',
url: url,
body: _JSON$stringify(rec),
headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, {
'content-type': 'application/json'
})
}, {
noContentResponse: {
id: id,
success: true,
errors: []
}
}));
case 8:
case "end":
return _context28.stop();
}
}, _callee17, this);
}));
function _updateSingle(_x37, _x38, _x39) {
return _updateSingle2.apply(this, arguments);
}
return _updateSingle;
}() /** @private */)
}, {
key: "_updateParallel",
value: (function () {
var _updateParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee18(type, records, options) {
var _this6 = this;
return _regeneratorRuntime.wrap(function _callee18$(_context29) {
while (1) switch (_context29.prev = _context29.next) {
case 0:
if (!(records.length > this._maxRequest)) {
_context29.next = 2;
break;
}
throw new Error('Exceeded max limit of concurrent call');
case 2:
return _context29.abrupt("return", _Promise.all(_mapInstanceProperty(records).call(records, function (record) {
return _this6._updateSingle(type, record, options).catch(function (err) {
// be aware that allOrNone in parallel mode will not revert the other successful requests
// it only raises error when met at least one failed request.
if (options.allOrNone || !err.errorCode) {
throw err;
}
return toSaveResult(err);
});
})));
case 3:
case "end":
return _context29.stop();
}
}, _callee18, this);
}));
function _updateParallel(_x40, _x41, _x42) {
return _updateParallel2.apply(this, arguments);
}
return _updateParallel;
}() /** @private */)
}, {
key: "_updateMany",
value: (function () {
var _updateMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee19(type, records, options) {
var _context30, _records, url;
return _regeneratorRuntime.wrap(function _callee19$(_context31) {
while (1) switch (_context31.prev = _context31.next) {
case 0:
if (!(records.length === 0)) {
_context31.next = 2;
break;
}
return _context31.abrupt("return", []);
case 2:
if (!(records.length > MAX_DML_COUNT && options.allowRecursive)) {
_context31.next = 16;
break;
}
_context31.t0 = _concatInstanceProperty(_context30 = []);
_context31.t1 = _context30;
_context31.t2 = _toConsumableArray;
_context31.next = 8;
return this._updateMany(type, _sliceInstanceProperty(records).call(records, 0, MAX_DML_COUNT), options);
case 8:
_context31.t3 = _context31.sent;
_context31.t4 = (0, _context31.t2)(_context31.t3);
_context31.t5 = _toConsumableArray;
_context31.next = 13;
return this._updateMany(type, _sliceInstanceProperty(records).call(records, MAX_DML_COUNT), options);
case 13:
_context31.t6 = _context31.sent;
_context31.t7 = (0, _context31.t5)(_context31.t6);
return _context31.abrupt("return", _context31.t0.call.call(_context31.t0, _context31.t1, _context31.t4, _context31.t7));
case 16:
_records = _mapInstanceProperty(records).call(records, function (record) {
var id = record.Id,
rtype = record.type,
attributes = record.attributes,
rec = _objectWithoutProperties(record, _excluded4);
if (!id) {
throw new Error('Record id is not found in record.');
}
var sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype;
if (!sobjectType) {
throw new Error('No SObject Type defined in record');
}
return _objectSpread({
id: id,
attributes: {
type: sobjectType
}
}, rec);
});
url = [this._baseUrl(), 'composite', 'sobjects'].join('/');
return _context31.abrupt("return", this.request({
method: 'PATCH',
url: url,
body: _JSON$stringify({
allOrNone: options.allOrNone || false,
records: _records
}),
headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, {
'content-type': 'application/json'
})
}));
case 19:
case "end":
return _context31.stop();
}
}, _callee19, this);
}));
function _updateMany(_x43, _x44, _x45) {
return _updateMany2.apply(this, arguments);
}
return _updateMany;
}()
/**
* Upsert records
*/
)
}, {
key: "upsert",
value: (
/**
*
* @param type
* @param records
* @param extIdField
* @param options
*/
function () {
var _upsert = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee20(type, records, extIdField) {
var options,
_args20 = arguments;
return _regeneratorRuntime.wrap(function _callee20$(_context32) {
while (1) switch (_context32.prev = _context32.next) {
case 0:
options = _args20.length > 3 && _args20[3] !== undefined ? _args20[3] : {};
return _context32.abrupt("return", _Array$isArray(records) ?
// check the version whether SObject collection API is supported (46.0)
this._ensureVersion(46) ? this._upsertMany(type, records, extIdField, options) : this._upsertParallel(type, records, extIdField, options) : this._upsertParallel(type, records, extIdField, options));
case 2:
case "end":
return _context32.stop();
}
}, _callee20, this);
}));
function upsert(_x46, _x47, _x48) {
return _upsert.apply(this, arguments);
}
return upsert;
}() /** @private */)
}, {
key: "_upsertMany",
value: (function () {
var _upsertMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee21(type, records, extIdField) {
var options,
_context33,
_records,
url,
_args21 = arguments;
return _regeneratorRuntime.wrap(function _callee21$(_context35) {
while (1) switch (_context35.prev = _context35.next) {
case 0:
options = _args21.length > 3 && _args21[3] !== undefined ? _args21[3] : {};
if (!(records.length === 0)) {
_context35.next = 3;
break;
}
return _context35.abrupt("return", []);
case 3:
if (!(records.length > MAX_DML_COUNT && options.allowRecursive)) {
_context35.next = 17;
break;
}
_context35.t0 = _concatInstanceProperty(_context33 = []);
_context35.t1 = _context33;
_context35.t2 = _toConsumableArray;
_context35.next = 9;
return this._upsertMany(type, _sliceInstanceProperty(records).call(records, 0, MAX_DML_COUNT), extIdField, options);
case 9:
_context35.t3 = _context35.sent;
_context35.t4 = (0, _context35.t2)(_context35.t3);
_context35.t5 = _toConsumableArray;
_context35.next = 14;
return this._upsertMany(type, _sliceInstanceProperty(records).call(records, MAX_DML_COUNT), extIdField, options);
case 14:
_context35.t6 = _context35.sent;
_context35.t7 = (0, _context35.t5)(_context35.t6);
return _context35.abrupt("return", _context35.t0.call.call(_context35.t0, _context35.t1, _context35.t4, _context35.t7));
case 17:
_records = _mapInstanceProperty(records).call(records, function (recordItem) {
var _context34;
var extId = recordItem[extIdField],
recordType = recordItem.type,
attributes = recordItem.attributes,
rec = _objectWithoutProperties(recordItem, _mapInstanceProperty(_context34 = [extIdField, "type", "attributes"]).call(_context34, _toPropertyKey));
var sobjectType = recordType || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || type;
if (!extId) {
throw new Error('External ID is not found in record.');
}
if (!sobjectType) {
throw new Error('No SObject Type defined in record');
}
return _objectSpread(_defineProperty(_defineProperty({}, extIdField, extId), "attributes", {
type: sobjectType
}), rec);
});
url = [this._baseUrl(), 'composite', 'sobjects', type, extIdField].join('/');
return _context35.abrupt("return", this.request({
method: 'PATCH',
url: url,
body: _JSON$stringify({
allOrNone: options.allOrNone || false,
records: _records
}),
headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, {
'content-type': 'application/json'
})
}));
case 20:
case "end":
return _context35.stop();
}
}, _callee21, this);
}));
function _upsertMany(_x49, _x50, _x51) {
return _upsertMany2.apply(this, arguments);
}
return _upsertMany;
}() /** @private */)
}, {
key: "_upsertParallel",
value: (function () {
var _upsertParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee22(type, records, extIdField) {
var _this7 = this;
var options,
isArray,
_records,
results,
_args22 = arguments;
return _regeneratorRuntime.wrap(function _callee22$(_context37) {
while (1) switch (_context37.prev = _context37.next) {
case 0:
options = _args22.length > 3 && _args22[3] !== undefined ? _args22[3] : {};
isArray = _Array$isArray(records);
_records = _Array$isArray(records) ? records : [records];
if (!(_records.length > this._maxRequest)) {
_context37.next = 5;
break;
}
throw new Error('Exceeded max limit of concurrent call');
case 5:
_context37.next = 7;
return _Promise.all(_mapInstanceProperty(_records).call(_records, function (record) {
var _context36;
var extId = record[extIdField],
rtype = record.type,
attributes = record.attributes,
rec = _objectWithoutProperties(record, _mapInstanceProperty(_context36 = [extIdField, "type", "attributes"]).call(_context36, _toPropertyKey));
var url = [_this7._baseUrl(), 'sobjects', type, extIdField, extId].join('/');
return _this7.request({
method: 'PATCH',
url: url,
body: _JSON$stringify(rec),
headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, {
'content-type': 'application/json'
})
}, {
noContentResponse: {
success: true,
errors: []
}
}).catch(function (err) {
// Be aware that `allOrNone` option in upsert method
// will not revert the other successful requests.
// It only raises error when met at least one failed request.
if (!isArray || options.allOrNone || !err.errorCode) {
throw err;
}
return toSaveResult(err);
});
}));
case 7:
results = _context37.sent;
return _context37.abrupt("return", isArray ? results : results[0]);
case 9:
case "end":
return _context37.stop();
}
}, _callee22, this);
}));
function _upsertParallel(_x52, _x53, _x54) {
return _upsertParallel2.apply(this, arguments);
}
return _upsertParallel;
}()
/**
* Delete records
*/
)
}, {
key: "destroy",
value: (
/**
* @param type
* @param ids
* @param options
*/
function () {
var _destroy = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee23(type, ids) {
var options,
_args23 = arguments;
return _regeneratorRuntime.wrap(function _callee23$(_context38) {
while (1) switch (_context38.prev = _context38.next) {
case 0:
options = _args23.length > 2 && _args23[2] !== undefined ? _args23[2] : {};
return _context38.abrupt("return", _Array$isArray(ids) ?
// check the version whether SObject collection API is supported (42.0)
this._ensureVersion(42) ? this._destroyMany(type, ids, options) : this._destroyParallel(type, ids, options) : this._destroySingle(type, ids, options));
case 2:
case "end":
return _context38.stop();
}
}, _callee23, this);
}));
function destroy(_x55, _x56) {
return _destroy.apply(this, arguments);
}
return destroy;
}() /** @private */)
}, {
key: "_destroySingle",
value: (function () {
var _destroySingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee24(type, id, options) {
var url;
return _regeneratorRuntime.wrap(function _callee24$(_context39) {
while (1) switch (_context39.prev = _context39.next) {
case 0:
url = [this._baseUrl(), 'sobjects', type, id].join('/');
return _context39.abrupt("return", this.request({
method: 'DELETE',
url: url,
headers: options.headers || {}
}, {
noContentResponse: {
id: id,
success: true,
errors: []
}
}));
case 2:
case "end":
return _context39.stop();
}
}, _callee24, this);
}));
function _destroySingle(_x57, _x58, _x59) {
return _destroySingle2.apply(this, arguments);
}
return _destroySingle;
}() /** @private */)
}, {
key: "_destroyParallel",
value: (function () {
var _destroyParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee25(type, ids, options) {
var _this8 = this;
return _regeneratorRuntime.wrap(function _callee25$(_context40) {
while (1) switch (_context40.prev = _context40.next) {
case 0:
if (!(ids.length > this._maxRequest)) {
_context40.next = 2;
break;
}
throw new Error('Exceeded max limit of concurrent call');
case 2:
return _context40.abrupt("return", _Promise.all(_mapInstanceProperty(ids).call(ids, function (id) {
return _this8._destroySingle(type, id, options).catch(function (err) {
// Be aware that `allOrNone` option in parallel mode
// will not revert the other successful requests.
// It only raises error when met at least one failed request.
if (options.allOrNone || !err.errorCode) {
throw err;
}
return toSaveResult(err);
});
})));
case 3:
case "end":
return _context40.stop();
}
}, _callee25, this);
}));
function _destroyParallel(_x60, _x61, _x62) {
return _destroyParallel2.apply(this, arguments);
}
return _destroyParallel;
}() /** @private */)
}, {
key: "_destroyMany",
value: (function () {
var _destroyMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee26(type, ids, options) {
var _context41, url;
return _regeneratorRuntime.wrap(function _callee26$(_context42) {
while (1) switch (_context42.prev = _context42.next) {
case 0:
if (!(ids.length === 0)) {
_context42.next = 2;
break;
}
return _context42.abrupt("return", []);
case 2:
if (!(ids.length > MAX_DML_COUNT && options.allowRecursive)) {
_context42.next = 16;
break;
}
_context42.t0 = _concatInstanceProperty(_context41 = []);
_context42.t1 = _context41;
_context42.t2 = _toConsumableArray;
_context42.next = 8;
return this._destroyMany(type, _sliceInstanceProperty(ids).call(ids, 0, MAX_DML_COUNT), options);
case 8:
_context42.t3 = _context42.sent;
_context42.t4 = (0, _context42.t2)(_context42.t3);
_context42.t5 = _toConsumableArray;
_context42.next = 13;
return this._destroyMany(type, _sliceInstanceProperty(ids).call(ids, MAX_DML_COUNT), options);
case 13:
_context42.t6 = _context42.sent;
_context42.t7 = (0, _context42.t5)(_context42.t6);
return _context42.abrupt("return", _context42.t0.call.call(_context42.t0, _context42.t1, _context42.t4, _context42.t7));
case 16:
url = [this._baseUrl(), 'composite', 'sobjects?ids='].join('/') + ids.join(',');
if (options.allOrNone) {
url += '&allOrNone=true';
}
return _context42.abrupt("return", this.request({
method: 'DELETE',
url: url,
headers: options.headers || {}
}));
case 19:
case "end":
return _context42.stop();
}
}, _callee26, this);
}));
function _destroyMany(_x63, _x64, _x65) {
return _destroyMany2.apply(this, arguments);
}
return _destroyMany;
}())
}, {
key: "describe",
value: (
/**
* Describe SObject metadata
*/
function () {
var _describe = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee27(type) {
var url, body;
return _regeneratorRuntime.wrap(function _callee27$(_context43) {
while (1) switch (_context43.prev = _context43.next) {
case 0:
url = [this._baseUrl(), 'sobjects', type, 'describe'].join('/');
_context43.next = 3;
return this.request(url);
case 3:
body = _context43.sent;
return _context43.abrupt("return", body);
case 5:
case "end":
return _context43.stop();
}
}, _callee27, this);
}));
function describe(_x66) {
return _describe.apply(this, arguments);
}
return describe;
}()
/**
* Describe global SObjects
*/
)
}, {
key: "describeGlobal",
value: (function () {
var _describeGlobal = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee28() {
var url, body;
return _regeneratorRuntime.wrap(function _callee28$(_context44) {
while (1) switch (_context44.prev = _context44.next) {
case 0:
url = "".concat(this._baseUrl(), "/sobjects");
_context44.next = 3;
return this.request(url);
case 3:
body = _context44.sent;
return _context44.abrupt("return", body);
case 5:
case "end":
return _context44.stop();
}
}, _callee28, this);
}));
function describeGlobal() {
return _describeGlobal.apply(this, arguments);
}
return describeGlobal;
}()
/**
* Get SObject instance
*/
)
}, {
key: "sobject",
value: function sobject(type) {
var so = this.sobjects[type] || new SObject(this, type);
this.sobjects[type] = so;
return so;
}
/**
* Get identity information of current user
*/
}, {
key: "identity",
value: (function () {
var _identity = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee29() {
var _this$userInfo;
var options,
url,
_res,
res,
_args29 = arguments;
return _regeneratorRuntime.wrap(function _callee29$(_context45) {
while (1) switch (_context45.prev = _context45.next) {
case 0:
options = _args29.length > 0 && _args29[0] !== undefined ? _args29[0] : {};
url = (_this$userInfo = this.userInfo) === null || _this$userInfo === void 0 ? void 0 : _this$userInfo.url;
if (url) {
_context45.next = 7;
break;
}
_context45.next = 5;
return this.request({
method: 'GET',
url: this._baseUrl(),
headers: options.headers
});
case 5:
_res = _context45.sent;
url = _res.identity;
case 7:
url += '?format=json';
if (this.accessToken) {
url += "&oauth_token=".concat(encodeURIComponent(this.accessToken));
}
_context45.next = 11;
return this.request({
method: 'GET',
url: url
});
case 11:
res = _context45.sent;
this.userInfo = {
id: res.user_id,
organizationId: res.organization_id,
url: res.id
};
return _context45.abrupt("return", res);
case 14:
case "end":
return _context45.stop();
}
}, _callee29, this);
}));
function identity() {
return _identity.apply(this, arguments);
}
return identity;
}()
/**
* List recently viewed records
*/
)
}, {
key: "recent",
value: (function () {
var _recent = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee30(type, limit) {
var url, _yield$this$request, recentItems;
return _regeneratorRuntime.wrap(function _callee30$(_context46) {
while (1) switch (_context46.prev = _context46.next) {
case 0:
/* eslint-disable no-param-reassign */
if (typeof type === 'number') {
limit = type;
type = undefined;
}
if (!type) {
_context46.next = 8;
break;
}
url = [this._baseUrl(), 'sobjects', type].join('/');
_context46.next = 5;
return this.request(url);
case 5:
_yield$this$request = _context46.sent;
recentItems = _yield$this$request.recentItems;
return _context46.abrupt("return", limit ? _sliceInstanceProperty(recentItems).call(recentItems, 0, limit) : recentItems);
case 8:
url = "".concat(this._baseUrl(), "/recent");
if (limit) {
url += "?limit=".concat(limit);
}
return _context46.abrupt("return", this.request(url));
case 11:
case "end":
return _context46.stop();
}
}, _callee30, this);
}));
function recent(_x67, _x68) {
return _recent.apply(this, arguments);
}
return recent;
}()
/**
* Retrieve updated records
*/
)
}, {
key: "updated",
value: (function () {
var _updated = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee31(type, start, end) {
var url, body;
return _regeneratorRuntime.wrap(function _callee31$(_context47) {
while (1) switch (_context47.prev = _context47.next) {
case 0:
/* eslint-disable no-param-reassign */
url = [this._baseUrl(), 'sobjects', type, 'updated'].join('/');
if (typeof start === 'string') {
start = new Date(start);
}
start = formatDate(start);
url += "?start=".concat(encodeURIComponent(start));
if (typeof end === 'string') {
end = new Date(end);
}
end = formatDate(end);
url += "&end=".concat(encodeURIComponent(end));
_context47.next = 9;
return this.request(url);
case 9:
body = _context47.sent;
return _context47.abrupt("return", body);
case 11:
case "end":
return _context47.stop();
}
}, _callee31, this);
}));
function updated(_x69, _x70, _x71) {
return _updated.apply(this, arguments);
}
return updated;
}()
/**
* Retrieve deleted records
*/
)
}, {
key: "deleted",
value: (function () {
var _deleted = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee32(type, start, end) {
var url, body;
return _regeneratorRuntime.wrap(function _callee32$(_context48) {
while (1) switch (_context48.prev = _context48.next) {
case 0:
/* eslint-disable no-param-reassign */
url = [this._baseUrl(), 'sobjects', type, 'deleted'].join('/');
if (typeof start === 'string') {
start = new Date(start);
}
start = formatDate(start);
url += "?start=".concat(encodeURIComponent(start));
if (typeof end === 'string') {
end = new Date(end);
}
end = formatDate(end);
url += "&end=".concat(encodeURIComponent(end));
_context48.next = 9;
return this.request(url);
case 9:
body = _context48.sent;
return _context48.abrupt("return", body);
case 11:
case "end":
return _context48.stop();
}
}, _callee32, this);
}));
function deleted(_x72, _x73, _x74) {
return _deleted.apply(this, arguments);
}
return deleted;
}()
/**
* Returns a list of all tabs
*/
)
}, {
key: "tabs",
value: (function () {
var _tabs = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee33() {
var url, body;
return _regeneratorRuntime.wrap(function _callee33$(_context49) {
while (1) switch (_context49.prev = _context49.next) {
case 0:
url = [this._baseUrl(), 'tabs'].join('/');
_context49.next = 3;
return this.request(url);
case 3:
body = _context49.sent;
return _context49.abrupt("return", body);
case 5:
case "end":
return _context49.stop();
}
}, _callee33, this);
}));
function tabs() {
return _tabs.apply(this, arguments);
}
return tabs;
}()
/**
* Returns current system limit in the organization
*/
)
}, {
key: "limits",
value: (function () {
var _limits = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee34() {
var url, body;
return _regeneratorRuntime.wrap(function _callee34$(_context50) {
while (1) switch (_context50.prev = _context50.next) {
case 0:
url = [this._baseUrl(), 'limits'].join('/');
_context50.next = 3;
return this.request(url);
case 3:
body = _context50.sent;
return _context50.abrupt("return", body);
case 5:
case "end":
return _context50.stop();
}
}, _callee34, this);
}));
function limits() {
return _limits.apply(this, arguments);
}
return limits;
}()
/**
* Returns a theme info
*/
)
}, {
key: "theme",
value: (function () {
var _theme = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee35() {
var url, body;
return _regeneratorRuntime.wrap(function _callee35$(_context51) {
while (1) switch (_context51.prev = _context51.next) {
case 0:
url = [this._baseUrl(), 'theme'].join('/');
_context51.next = 3;
return this.request(url);
case 3:
body = _context51.sent;
return _context51.abrupt("return", body);
case 5:
case "end":
return _context51.stop();
}
}, _callee35, this);
}));
function theme() {
return _theme.apply(this, arguments);
}
return theme;
}()
/**
* Returns all registered global quick actions
*/
)
}, {
key: "quickActions",
value: (function () {
var _quickActions = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee36() {
var body;
return _regeneratorRuntime.wrap(function _callee36$(_context52) {
while (1) switch (_context52.prev = _context52.next) {
case 0:
_context52.next = 2;
return this.request('/quickActions');
case 2:
body = _context52.sent;
return _context52.abrupt("return", body);
case 4:
case "end":
return _context52.stop();
}
}, _callee36, this);
}));
function quickActions() {
return _quickActions.apply(this, arguments);
}
return quickActions;
}()
/**
* Get reference for specified global quick action
*/
)
}, {
key: "quickAction",
value: function quickAction(actionName) {
return new QuickAction(this, "/quickActions/".concat(actionName));
}
}, {
key: "isLightningInstance",
value: function isLightningInstance() {
var _context53, _context54, _context55;
return _includesInstanceProperty(_context53 = this.instanceUrl).call(_context53, '.lightning.force.com') || _includesInstanceProperty(_context54 = this.instanceUrl).call(_context54, '.lightning.crmforce.mil') || _includesInstanceProperty(_context55 = this.instanceUrl).call(_context55, '.lightning.sfcrmapps.cn');
}
}]);
}(EventEmitter);
_defineProperty(Connection, "_logger", getLogger('connection'));
export default Connection;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJqc2ZvcmNlIiwiVHJhbnNwb3J0IiwiQ2FudmFzVHJhbnNwb3J0IiwiWGRQcm94eVRyYW5zcG9ydCIsIkh0dHBQcm94eVRyYW5zcG9ydCIsImdldExvZ2dlciIsIk9BdXRoMiIsIkNhY2hlIiwiSHR0cEFwaSIsIlNlc3Npb25SZWZyZXNoRGVsZWdhdGUiLCJRdWVyeSIsIlNPYmplY3QiLCJRdWlja0FjdGlvbiIsIlByb2Nlc3MiLCJmb3JtYXREYXRlIiwiRm9ybURhdGEiLCJkZWZhdWx0Q29ubmVjdGlvbkNvbmZpZyIsImxvZ2luVXJsIiwiaW5zdGFuY2VVcmwiLCJ2ZXJzaW9uIiwibG9nTGV2ZWwiLCJtYXhSZXF1ZXN0IiwiZXNjIiwic3RyIiwiU3RyaW5nIiwicmVwbGFjZSIsInBhcnNlU2lnbmVkUmVxdWVzdCIsInNyIiwiX3N0YXJ0c1dpdGhJbnN0YW5jZVByb3BlcnR5IiwiY2FsbCIsIkpTT04iLCJwYXJzZSIsIm1zZyIsInNwbGl0IiwicG9wIiwiRXJyb3IiLCJqc29uIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwicGFyc2VJZFVybCIsInVybCIsIl9jb250ZXh0IiwiX3VybCRzcGxpdCRzbGljZSIsIl9zbGljZUluc3RhbmNlUHJvcGVydHkiLCJfdXJsJHNwbGl0JHNsaWNlMiIsIl9zbGljZWRUb0FycmF5Iiwib3JnYW5pemF0aW9uSWQiLCJpZCIsIm9hdXRoUmVmcmVzaEZuIiwiX3giLCJfeDIiLCJfb2F1dGhSZWZyZXNoRm4iLCJhcHBseSIsImFyZ3VtZW50cyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlMzciLCJjb25uIiwiY2FsbGJhY2siLCJyZXMiLCJ1c2VySW5mbyIsIndyYXAiLCJfY2FsbGVlMzckIiwiX2NvbnRleHQ1NiIsInByZXYiLCJuZXh0IiwicmVmcmVzaFRva2VuIiwib2F1dGgyIiwic2VudCIsIl9lc3RhYmxpc2giLCJpbnN0YW5jZV91cmwiLCJhY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsInVuZGVmaW5lZCIsInQwIiwic3RvcCIsImNyZWF0ZVVzZXJuYW1lUGFzc3dvcmRSZWZyZXNoRm4iLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiX3JlZiIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0MiIsImxvZ2luIiwiX3gzIiwiX3g0IiwidG9TYXZlUmVzdWx0IiwiZXJyIiwic3VjY2VzcyIsImVycm9ycyIsInJhaXNlTm9Nb2R1bGVFcnJvciIsIm5hbWUiLCJfY29udGV4dDMiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsIk1BWF9ETUxfQ09VTlQiLCJDb25uZWN0aW9uIiwiX0V2ZW50RW1pdHRlciIsIl90aGlzIiwiY29uZmlnIiwibGVuZ3RoIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NhbGxTdXBlciIsIl9kZWZpbmVQcm9wZXJ0eSIsImNyZWF0ZSIsImRlc3Ryb3kiLCJwcm94eVVybCIsImh0dHBQcm94eSIsImlzTGlnaHRuaW5nSW5zdGFuY2UiLCJfb2JqZWN0U3ByZWFkIiwicmVmcmVzaEZuIiwiY2xpZW50SWQiLCJfcmVmcmVzaERlbGVnYXRlIiwiX21heFJlcXVlc3QiLCJfbG9nZ2VyIiwiY3JlYXRlSW5zdGFuY2UiLCJfbG9nTGV2ZWwiLCJfdHJhbnNwb3J0IiwiX2NhbGxPcHRpb25zIiwiY2FsbE9wdGlvbnMiLCJjYWNoZSIsImRlc2NyaWJlQ2FjaGVLZXkiLCJ0eXBlIiwiZGVzY3JpYmUiLCJwcm90b3R5cGUiLCJjcmVhdGVDYWNoZWRGdW5jdGlvbiIsImtleSIsInN0cmF0ZWd5IiwiZGVzY3JpYmUkIiwiZGVzY3JpYmUkJCIsImRlc2NyaWJlU09iamVjdCIsImRlc2NyaWJlU09iamVjdCQiLCJkZXNjcmliZVNPYmplY3QkJCIsImRlc2NyaWJlR2xvYmFsIiwiZGVzY3JpYmVHbG9iYWwkIiwiZGVzY3JpYmVHbG9iYWwkJCIsInNlc3Npb25JZCIsInNlcnZlclVybCIsInNpZ25lZFJlcXVlc3QiLCJlbWl0IiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwiZ2V0IiwidmFsdWUiLCJvcHRpb25zIiwiX2NvbnRleHQ0Iiwiam9pbiIsInNpZ25lZFJlcXVlc3RPYmplY3QiLCJjbGllbnQiLCJvYXV0aFRva2VuIiwic3VwcG9ydGVkIiwiX3Nlc3Npb25UeXBlIiwiX3Jlc2V0SW5zdGFuY2UiLCJfY2xlYXJTZXNzaW9uIiwiX3RoaXMyIiwibGltaXRJbmZvIiwic29iamVjdHMiLCJjbGVhciIsInJlbW92ZUFsbExpc3RlbmVycyIsIm9uIiwiX3JlZjIiLCJyZXN1bHQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwic28iLCJzb2JqZWN0IiwiZSIsImYiLCJfYXV0aG9yaXplIiwiX2NhbGxlZTIiLCJjb2RlT3JQYXJhbXMiLCJfY29udGV4dDUiLCJwYXJhbXMiLCJfYXJnczIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDYiLCJyZXF1ZXN0VG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiZGVidWciLCJhYnJ1cHQiLCJhdXRob3JpemUiLCJfeDUiLCJfbG9naW4iLCJfY2FsbGVlMyIsIl90aGlzJG9hdXRoIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQ3IiwiY2xpZW50U2VjcmV0IiwibG9naW5CeU9BdXRoMiIsImxvZ2luQnlTb2FwIiwiX3g2IiwiX3g3IiwiX2xvZ2luQnlPQXV0aCIsIl9jYWxsZWU0IiwiX2NvbnRleHQ4IiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ5IiwiYXV0aGVudGljYXRlIiwiaW5mbyIsIl94OCIsIl94OSIsIl9sb2dpbkJ5U29hcCIsIl9jYWxsZWU1IiwiX2NvbnRleHQxMCIsIl9jb250ZXh0MTEiLCJib2R5Iiwic29hcExvZ2luRW5kcG9pbnQiLCJyZXNwb25zZSIsIm0iLCJmYXVsdHN0cmluZyIsInVzZXJJZCIsImlkVXJsIiwiX2NhbGxlZTUkIiwiX2NvbnRleHQxMiIsIl9Qcm9taXNlIiwicmVqZWN0IiwiaHR0cFJlcXVlc3QiLCJtZXRob2QiLCJoZWFkZXJzIiwiU09BUEFjdGlvbiIsInN0YXR1c0NvZGUiLCJtYXRjaCIsIl94MTAiLCJfeDExIiwiX2xvZ291dCIsIl9jYWxsZWU2IiwicmV2b2tlIiwiX2NhbGxlZTYkIiwiX2NvbnRleHQxMyIsImxvZ291dEJ5T0F1dGgyIiwibG9nb3V0QnlTb2FwIiwibG9nb3V0IiwiX3gxMiIsIl9sb2dvdXRCeU9BdXRoIiwiX2NhbGxlZTciLCJ0b2tlbiIsIl9jYWxsZWU3JCIsIl9jb250ZXh0MTQiLCJyZXZva2VUb2tlbiIsIl94MTMiLCJfbG9nb3V0QnlTb2FwIiwiX2NhbGxlZTgiLCJfY29udGV4dDE1IiwiX2NhbGxlZTgkIiwiX2NvbnRleHQxNiIsIl94MTQiLCJyZXF1ZXN0IiwiX3RoaXMzIiwicmVxdWVzdF8iLCJfbm9ybWFsaXplVXJsIiwiaHR0cEFwaSIsImFwaVVzYWdlIiwidXNlZCIsIl9wYXJzZUludCIsImxpbWl0IiwicmVxdWVzdEdldCIsInJlcXVlc3RQb3N0IiwiX0pTT04kc3RyaW5naWZ5IiwicmVxdWVzdFB1dCIsInJlcXVlc3RQYXRjaCIsInJlcXVlc3REZWxldGUiLCJfYmFzZVVybCIsInF1ZXJ5Iiwic29xbCIsInNlYXJjaCIsInNvc2wiLCJlbmNvZGVVUklDb21wb25lbnQiLCJxdWVyeU1vcmUiLCJsb2NhdG9yIiwiX2Vuc3VyZVZlcnNpb24iLCJtYWpvclZlcnNpb24iLCJ2ZXJzaW9ucyIsIl9zdXBwb3J0cyIsImZlYXR1cmUiLCJfcmV0cmlldmUiLCJfY2FsbGVlOSIsImlkcyIsIl9hcmdzOSIsIl9jYWxsZWU5JCIsIl9jb250ZXh0MTciLCJfQXJyYXkkaXNBcnJheSIsIl9yZXRyaWV2ZU1hbnkiLCJfcmV0cmlldmVQYXJhbGxlbCIsIl9yZXRyaWV2ZVNpbmdsZSIsInJldHJpZXZlIiwiX3gxNSIsIl94MTYiLCJfcmV0cmlldmVTaW5nbGUyIiwiX2NhbGxlZTEwIiwiZmllbGRzIiwiX2NhbGxlZTEwJCIsIl9jb250ZXh0MTgiLCJfeDE3IiwiX3gxOCIsIl94MTkiLCJfcmV0cmlldmVQYXJhbGxlbDIiLCJfY2FsbGVlMTEiLCJfdGhpczQiLCJfY2FsbGVlMTEkIiwiX2NvbnRleHQxOSIsImFsbCIsIl9tYXBJbnN0YW5jZVByb3BlcnR5IiwiY2F0Y2giLCJhbGxPck5vbmUiLCJlcnJvckNvZGUiLCJfeDIwIiwiX3gyMSIsIl94MjIiLCJfcmV0cmlldmVNYW55MiIsIl9jYWxsZWUxMiIsIl9jb250ZXh0MjAiLCJfY2FsbGVlMTIkIiwiX2NvbnRleHQyMSIsInQxIiwidDIiLCJmaWVsZCIsIl94MjMiLCJfeDI0IiwiX3gyNSIsIl9jcmVhdGUiLCJfY2FsbGVlMTMiLCJyZWNvcmRzIiwicmV0IiwiX2FyZ3MxMyIsIl9jYWxsZWUxMyQiLCJfY29udGV4dDIyIiwiX2NyZWF0ZU1hbnkiLCJfY3JlYXRlUGFyYWxsZWwiLCJfY3JlYXRlU2luZ2xlIiwiX3gyNiIsIl94MjciLCJfY3JlYXRlU2luZ2xlMiIsIl9jYWxsZWUxNCIsInJlY29yZCIsIklkIiwicnR5cGUiLCJhdHRyaWJ1dGVzIiwicmVjIiwic29iamVjdFR5cGUiLCJjb250ZW50VHlwZSIsIl9jb250ZXh0MjMiLCJmb3JtIiwiX2NhbGxlZTE0JCIsIl9jb250ZXh0MjQiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJtdWx0aXBhcnRGaWxlRmllbGRzIiwiX2ZvckVhY2hJbnN0YW5jZVByb3BlcnR5IiwiX09iamVjdCRlbnRyaWVzIiwiX3JlZjMiLCJfcmVmNCIsImZpZWxkTmFtZSIsImZpbGVEZXRhaWxzIiwiYXBwZW5kIiwiZ2V0SGVhZGVycyIsIl94MjgiLCJfeDI5IiwiX3gzMCIsIl9jcmVhdGVQYXJhbGxlbDIiLCJfY2FsbGVlMTUiLCJfdGhpczUiLCJfY2FsbGVlMTUkIiwiX2NvbnRleHQyNSIsIl94MzEiLCJfeDMyIiwiX3gzMyIsIl9jcmVhdGVNYW55MiIsIl9jYWxsZWUxNiIsIl9jb250ZXh0MjYiLCJfcmVjb3JkcyIsIl9jYWxsZWUxNiQiLCJfY29udGV4dDI3IiwicmVzb2x2ZSIsImFsbG93UmVjdXJzaXZlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwidDMiLCJ0NCIsInQ1IiwidDYiLCJ0NyIsIl9leGNsdWRlZDIiLCJfeDM0IiwiX3gzNSIsIl94MzYiLCJ1cGRhdGUiLCJfdXBkYXRlTWFueSIsIl91cGRhdGVQYXJhbGxlbCIsIl91cGRhdGVTaW5nbGUiLCJfdXBkYXRlU2luZ2xlMiIsIl9jYWxsZWUxNyIsIl9jYWxsZWUxNyQiLCJfY29udGV4dDI4IiwiX2V4Y2x1ZGVkMyIsIm5vQ29udGVudFJlc3BvbnNlIiwiX3gzNyIsIl94MzgiLCJfeDM5IiwiX3VwZGF0ZVBhcmFsbGVsMiIsIl9jYWxsZWUxOCIsIl90aGlzNiIsIl9jYWxsZWUxOCQiLCJfY29udGV4dDI5IiwiX3g0MCIsIl94NDEiLCJfeDQyIiwiX3VwZGF0ZU1hbnkyIiwiX2NhbGxlZTE5IiwiX2NvbnRleHQzMCIsIl9jYWxsZWUxOSQiLCJfY29udGV4dDMxIiwiX2V4Y2x1ZGVkNCIsIl94NDMiLCJfeDQ0IiwiX3g0NSIsIl91cHNlcnQiLCJfY2FsbGVlMjAiLCJleHRJZEZpZWxkIiwiX2FyZ3MyMCIsIl9jYWxsZWUyMCQiLCJfY29udGV4dDMyIiwiX3Vwc2VydE1hbnkiLCJfdXBzZXJ0UGFyYWxsZWwiLCJ1cHNlcnQiLCJfeDQ2IiwiX3g0NyIsIl94NDgiLCJfdXBzZXJ0TWFueTIiLCJfY2FsbGVlMjEiLCJfY29udGV4dDMzIiwiX2FyZ3MyMSIsIl9jYWxsZWUyMSQiLCJfY29udGV4dDM1IiwicmVjb3JkSXRlbSIsIl9jb250ZXh0MzQiLCJleHRJZCIsInJlY29yZFR5cGUiLCJfdG9Qcm9wZXJ0eUtleSIsIl94NDkiLCJfeDUwIiwiX3g1MSIsIl91cHNlcnRQYXJhbGxlbDIiLCJfY2FsbGVlMjIiLCJfdGhpczciLCJpc0FycmF5IiwicmVzdWx0cyIsIl9hcmdzMjIiLCJfY2FsbGVlMjIkIiwiX2NvbnRleHQzNyIsIl9jb250ZXh0MzYiLCJfeDUyIiwiX3g1MyIsIl94NTQiLCJfZGVzdHJveSIsIl9jYWxsZWUyMyIsIl9hcmdzMjMiLCJfY2FsbGVlMjMkIiwiX2NvbnRleHQzOCIsIl9kZXN0cm95TWFueSIsIl9kZXN0cm95UGFyYWxsZWwiLCJfZGVzdHJveVNpbmdsZSIsIl94NTUiLCJfeDU2IiwiX2Rlc3Ryb3lTaW5nbGUyIiwiX2NhbGxlZTI0IiwiX2NhbGxlZTI0JCIsIl9jb250ZXh0MzkiLCJfeDU3IiwiX3g1OCIsIl94NTkiLCJfZGVzdHJveVBhcmFsbGVsMiIsIl9jYWxsZWUyNSIsIl90aGlzOCIsIl9jYWxsZWUyNSQiLCJfY29udGV4dDQwIiwiX3g2MCIsIl94NjEiLCJfeDYyIiwiX2Rlc3Ryb3lNYW55MiIsIl9jYWxsZWUyNiIsIl9jb250ZXh0NDEiLCJfY2FsbGVlMjYkIiwiX2NvbnRleHQ0MiIsIl94NjMiLCJfeDY0IiwiX3g2NSIsIl9kZXNjcmliZSIsIl9jYWxsZWUyNyIsIl9jYWxsZWUyNyQiLCJfY29udGV4dDQzIiwiX3g2NiIsIl9kZXNjcmliZUdsb2JhbCIsIl9jYWxsZWUyOCIsIl9jYWxsZWUyOCQiLCJfY29udGV4dDQ0IiwiX2lkZW50aXR5IiwiX2NhbGxlZTI5IiwiX3RoaXMkdXNlckluZm8iLCJfcmVzIiwiX2FyZ3MyOSIsIl9jYWxsZWUyOSQiLCJfY29udGV4dDQ1IiwiaWRlbnRpdHkiLCJ1c2VyX2lkIiwib3JnYW5pemF0aW9uX2lkIiwiX3JlY2VudCIsIl9jYWxsZWUzMCIsIl95aWVsZCR0aGlzJHJlcXVlc3QiLCJyZWNlbnRJdGVtcyIsIl9jYWxsZWUzMCQiLCJfY29udGV4dDQ2IiwicmVjZW50IiwiX3g2NyIsIl94NjgiLCJfdXBkYXRlZCIsIl9jYWxsZWUzMSIsInN0YXJ0IiwiZW5kIiwiX2NhbGxlZTMxJCIsIl9jb250ZXh0NDciLCJEYXRlIiwidXBkYXRlZCIsIl94NjkiLCJfeDcwIiwiX3g3MSIsIl9kZWxldGVkIiwiX2NhbGxlZTMyIiwiX2NhbGxlZTMyJCIsIl9jb250ZXh0NDgiLCJkZWxldGVkIiwiX3g3MiIsIl94NzMiLCJfeDc0IiwiX3RhYnMiLCJfY2FsbGVlMzMiLCJfY2FsbGVlMzMkIiwiX2NvbnRleHQ0OSIsInRhYnMiLCJfbGltaXRzIiwiX2NhbGxlZTM0IiwiX2NhbGxlZTM0JCIsIl9jb250ZXh0NTAiLCJsaW1pdHMiLCJfdGhlbWUiLCJfY2FsbGVlMzUiLCJfY2FsbGVlMzUkIiwiX2NvbnRleHQ1MSIsInRoZW1lIiwiX3F1aWNrQWN0aW9ucyIsIl9jYWxsZWUzNiIsIl9jYWxsZWUzNiQiLCJfY29udGV4dDUyIiwicXVpY2tBY3Rpb25zIiwicXVpY2tBY3Rpb24iLCJhY3Rpb25OYW1lIiwiX2NvbnRleHQ1MyIsIl9jb250ZXh0NTQiLCJfY29udGV4dDU1IiwiX2luY2x1ZGVzSW5zdGFuY2VQcm9wZXJ0eSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBqc2ZvcmNlIGZyb20gJy4vanNmb3JjZSc7XG5pbXBvcnQge1xuICBIdHRwUmVxdWVzdCxcbiAgSHR0cFJlc3BvbnNlLFxuICBDYWxsYmFjayxcbiAgUmVjb3JkLFxuICBTYXZlUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG4gIERlc2NyaWJlR2xvYmFsUmVzdWx0LFxuICBEZXNjcmliZVNPYmplY3RSZXN1bHQsXG4gIERlc2NyaWJlVGFiLFxuICBEZXNjcmliZVRoZW1lLFxuICBEZXNjcmliZVF1aWNrQWN0aW9uUmVzdWx0LFxuICBVcGRhdGVkUmVzdWx0LFxuICBEZWxldGVkUmVzdWx0LFxuICBTZWFyY2hSZXN1bHQsXG4gIE9yZ2FuaXphdGlvbkxpbWl0c0luZm8sXG4gIE9wdGlvbmFsLFxuICBTaWduZWRSZXF1ZXN0T2JqZWN0LFxuICBTYXZlRXJyb3IsXG4gIERtbE9wdGlvbnMsXG4gIFJldHJpZXZlT3B0aW9ucyxcbiAgU2NoZW1hLFxuICBTT2JqZWN0TmFtZXMsXG4gIFNPYmplY3RJbnB1dFJlY29yZCxcbiAgU09iamVjdFVwZGF0ZVJlY29yZCxcbiAgU09iamVjdEZpZWxkTmFtZXMsXG4gIFVzZXJJbmZvLFxuICBJZGVudGl0eUluZm8sXG4gIExpbWl0SW5mbyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBTdHJlYW1Qcm9taXNlIH0gZnJvbSAnLi91dGlsL3Byb21pc2UnO1xuaW1wb3J0IFRyYW5zcG9ydCwge1xuICBDYW52YXNUcmFuc3BvcnQsXG4gIFhkUHJveHlUcmFuc3BvcnQsXG4gIEh0dHBQcm94eVRyYW5zcG9ydCxcbn0gZnJvbSAnLi90cmFuc3BvcnQnO1xuaW1wb3J0IHsgTG9nZ2VyLCBnZXRMb2dnZXIgfSBmcm9tICcuL3V0aWwvbG9nZ2VyJztcbmltcG9ydCB7IExvZ0xldmVsQ29uZmlnIH0gZnJvbSAnLi91dGlsL2xvZ2dlcic7XG5pbXBvcnQgT0F1dGgyLCB7IFRva2VuUmVzcG9uc2UgfSBmcm9tICcuL29hdXRoMic7XG5pbXBvcnQgeyBPQXV0aDJDb25maWcgfSBmcm9tICcuL29hdXRoMic7XG5pbXBvcnQgQ2FjaGUsIHsgQ2FjaGVkRnVuY3Rpb24gfSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCBIdHRwQXBpIGZyb20gJy4vaHR0cC1hcGknO1xuaW1wb3J0IFNlc3Npb25SZWZyZXNoRGVsZWdhdGUsIHtcbiAgU2Vzc2lvblJlZnJlc2hGdW5jLFxufSBmcm9tICcuL3Nlc3Npb24tcmVmcmVzaC1kZWxlZ2F0ZSc7XG5pbXBvcnQgUXVlcnkgZnJvbSAnLi9xdWVyeSc7XG5pbXBvcnQgeyBRdWVyeU9wdGlvbnMgfSBmcm9tICcuL3F1ZXJ5JztcbmltcG9ydCBTT2JqZWN0IGZyb20gJy4vc29iamVjdCc7XG5pbXBvcnQgUXVpY2tBY3Rpb24gZnJvbSAnLi9xdWljay1hY3Rpb24nO1xuaW1wb3J0IFByb2Nlc3MgZnJvbSAnLi9wcm9jZXNzJztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuL3V0aWwvZm9ybWF0dGVyJztcbmltcG9ydCBBbmFseXRpY3MgZnJvbSAnLi9hcGkvYW5hbHl0aWNzJztcbmltcG9ydCBBcGV4IGZyb20gJy4vYXBpL2FwZXgnO1xuaW1wb3J0IHsgQnVsayB9IGZyb20gJy4vYXBpL2J1bGsnO1xuaW1wb3J0IHsgQnVsa1YyIH0gZnJvbSAnLi9hcGkvYnVsazInO1xuaW1wb3J0IENoYXR0ZXIgZnJvbSAnLi9hcGkvY2hhdHRlcic7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSAnLi9hcGkvbWV0YWRhdGEnO1xuaW1wb3J0IFNvYXBBcGkgZnJvbSAnLi9hcGkvc29hcCc7XG5pbXBvcnQgU3RyZWFtaW5nIGZyb20gJy4vYXBpL3N0cmVhbWluZyc7XG5pbXBvcnQgVG9vbGluZyBmcm9tICcuL2FwaS90b29saW5nJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuXG4vKipcbiAqIHR5cGUgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29ubmVjdGlvbkNvbmZpZzxTIGV4dGVuZHMgU2NoZW1hID0gU2NoZW1hPiA9IHtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgbG9naW5Vcmw/OiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIGluc3RhbmNlVXJsPzogc3RyaW5nO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHNlcnZlclVybD86IHN0cmluZztcbiAgc2lnbmVkUmVxdWVzdD86IHN0cmluZztcbiAgb2F1dGgyPzogT0F1dGgyIHwgT0F1dGgyQ29uZmlnO1xuICBtYXhSZXF1ZXN0PzogbnVtYmVyO1xuICBwcm94eVVybD86IHN0cmluZztcbiAgaHR0cFByb3h5Pzogc3RyaW5nO1xuICBsb2dMZXZlbD86IExvZ0xldmVsQ29uZmlnO1xuICBjYWxsT3B0aW9ucz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWZyZXNoRm4/OiBTZXNzaW9uUmVmcmVzaEZ1bmM8Uz47XG59O1xuXG5leHBvcnQgdHlwZSBDb25uZWN0aW9uRXN0YWJsaXNoT3B0aW9ucyA9IHtcbiAgYWNjZXNzVG9rZW4/OiBPcHRpb25hbDxzdHJpbmc+O1xuICByZWZyZXNoVG9rZW4/OiBPcHRpb25hbDxzdHJpbmc+O1xuICBpbnN0YW5jZVVybD86IE9wdGlvbmFsPHN0cmluZz47XG4gIHNlc3Npb25JZD86IE9wdGlvbmFsPHN0cmluZz47XG4gIHNlcnZlclVybD86IE9wdGlvbmFsPHN0cmluZz47XG4gIHNpZ25lZFJlcXVlc3Q/OiBPcHRpb25hbDxzdHJpbmcgfCBTaWduZWRSZXF1ZXN0T2JqZWN0PjtcbiAgdXNlckluZm8/OiBPcHRpb25hbDxVc2VySW5mbz47XG59O1xuXG4vKipcbiAqXG4gKi9cbmNvbnN0IGRlZmF1bHRDb25uZWN0aW9uQ29uZmlnOiB7XG4gIGxvZ2luVXJsOiBzdHJpbmc7XG4gIGluc3RhbmNlVXJsOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgbG9nTGV2ZWw6IExvZ0xldmVsQ29uZmlnO1xuICBtYXhSZXF1ZXN0OiBudW1iZXI7XG59ID0ge1xuICBsb2dpblVybDogJ2h0dHBzOi8vbG9naW4uc2FsZXNmb3JjZS5jb20nLFxuICBpbnN0YW5jZVVybDogJycsXG4gIHZlcnNpb246ICc1MC4wJyxcbiAgbG9nTGV2ZWw6ICdOT05FJyxcbiAgbWF4UmVxdWVzdDogMTAsXG59O1xuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGVzYyhzdHI6IE9wdGlvbmFsPHN0cmluZz4pOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKHN0ciB8fCAnJylcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBwYXJzZVNpZ25lZFJlcXVlc3Qoc3I6IHN0cmluZyB8IE9iamVjdCk6IFNpZ25lZFJlcXVlc3RPYmplY3Qge1xuICBpZiAodHlwZW9mIHNyID09PSAnc3RyaW5nJykge1xuICAgIGlmIChzci5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgIC8vIG1pZ2h0IGJlIEpTT05cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHNyKTtcbiAgICB9IC8vIG1pZ2h0IGJlIG9yaWdpbmFsIGJhc2U2NC1lbmNvZGVkIHNpZ25lZCByZXF1ZXN0XG4gICAgY29uc3QgbXNnID0gc3Iuc3BsaXQoJy4nKS5wb3AoKTsgLy8gcmV0cmlldmUgbGF0dGVyIHBhcnRcbiAgICBpZiAoIW1zZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25lZCByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShtc2csICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgfVxuICByZXR1cm4gc3IgYXMgU2lnbmVkUmVxdWVzdE9iamVjdDtcbn1cblxuLyoqIEBwcml2YXRlICoqL1xuZnVuY3Rpb24gcGFyc2VJZFVybCh1cmw6IHN0cmluZykge1xuICBjb25zdCBbb3JnYW5pemF0aW9uSWQsIGlkXSA9IHVybC5zcGxpdCgnLycpLnNsaWNlKC0yKTtcbiAgcmV0dXJuIHsgaWQsIG9yZ2FuaXphdGlvbklkLCB1cmwgfTtcbn1cblxuLyoqXG4gKiBTZXNzaW9uIFJlZnJlc2ggZGVsZWdhdGUgZnVuY3Rpb24gZm9yIE9BdXRoMiBhdXRoeiBjb2RlIGZsb3dcbiAqIEBwcml2YXRlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9hdXRoUmVmcmVzaEZuPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICBjb25uOiBDb25uZWN0aW9uPFM+LFxuICBjYWxsYmFjazogQ2FsbGJhY2s8c3RyaW5nLCBUb2tlblJlc3BvbnNlPixcbikge1xuICB0cnkge1xuICAgIGlmICghY29ubi5yZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiB0aGUgY29ubmVjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCByZXMgPSBhd2FpdCBjb25uLm9hdXRoMi5yZWZyZXNoVG9rZW4oY29ubi5yZWZyZXNoVG9rZW4pO1xuICAgIGNvbnN0IHVzZXJJbmZvID0gcGFyc2VJZFVybChyZXMuaWQpO1xuICAgIGNvbm4uX2VzdGFibGlzaCh7XG4gICAgICBpbnN0YW5jZVVybDogcmVzLmluc3RhbmNlX3VybCxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXMuYWNjZXNzX3Rva2VuLFxuICAgICAgdXNlckluZm8sXG4gICAgfSk7XG4gICAgY2FsbGJhY2sodW5kZWZpbmVkLCByZXMuYWNjZXNzX3Rva2VuLCByZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXNzaW9uIFJlZnJlc2ggZGVsZWdhdGUgZnVuY3Rpb24gZm9yIHVzZXJuYW1lL3Bhc3N3b3JkIGxvZ2luXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVVc2VybmFtZVBhc3N3b3JkUmVmcmVzaEZuPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICB1c2VybmFtZTogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nLFxuKSB7XG4gIHJldHVybiBhc3luYyAoXG4gICAgY29ubjogQ29ubmVjdGlvbjxTPixcbiAgICBjYWxsYmFjazogQ2FsbGJhY2s8c3RyaW5nLCBUb2tlblJlc3BvbnNlPixcbiAgKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbm4ubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgIGlmICghY29ubi5hY2Nlc3NUb2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY2VzcyB0b2tlbiBub3QgZm91bmQgYWZ0ZXIgbG9naW4nKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGNvbm4uYWNjZXNzVG9rZW4pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvU2F2ZVJlc3VsdChlcnI6IFNhdmVFcnJvcik6IFNhdmVSZXN1bHQge1xuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGVycm9yczogW2Vycl0sXG4gIH07XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gcmFpc2VOb01vZHVsZUVycm9yKG5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBUEkgbW9kdWxlICcke25hbWV9JyBpcyBub3QgbG9hZGVkLCBsb2FkICdqc2ZvcmNlL2FwaS8ke25hbWV9JyBleHBsaWNpdGx5YCxcbiAgKTtcbn1cblxuLypcbiAqIENvbnN0YW50IG9mIG1heGltdW0gcmVjb3JkcyBudW0gaW4gRE1MIG9wZXJhdGlvbiAodXBkYXRlL2RlbGV0ZSlcbiAqL1xuY29uc3QgTUFYX0RNTF9DT1VOVCA9IDIwMDtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbjxTIGV4dGVuZHMgU2NoZW1hID0gU2NoZW1hPiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBfbG9nZ2VyID0gZ2V0TG9nZ2VyKCdjb25uZWN0aW9uJyk7XG5cbiAgdmVyc2lvbjogc3RyaW5nO1xuICBsb2dpblVybDogc3RyaW5nO1xuICBpbnN0YW5jZVVybDogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbjogT3B0aW9uYWw8c3RyaW5nPjtcbiAgcmVmcmVzaFRva2VuOiBPcHRpb25hbDxzdHJpbmc+O1xuICB1c2VySW5mbzogT3B0aW9uYWw8VXNlckluZm8+O1xuICBsaW1pdEluZm86IExpbWl0SW5mbyA9IHt9O1xuICBvYXV0aDI6IE9BdXRoMjtcbiAgc29iamVjdHM6IHsgW04gaW4gU09iamVjdE5hbWVzPFM+XT86IFNPYmplY3Q8UywgTj4gfSA9IHt9O1xuICBjYWNoZTogQ2FjaGU7XG4gIF9jYWxsT3B0aW9uczogT3B0aW9uYWw8eyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0+O1xuICBfbWF4UmVxdWVzdDogbnVtYmVyO1xuICBfbG9nZ2VyOiBMb2dnZXI7XG4gIF9sb2dMZXZlbDogT3B0aW9uYWw8TG9nTGV2ZWxDb25maWc+O1xuICBfdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG4gIF9zZXNzaW9uVHlwZTogT3B0aW9uYWw8J3NvYXAnIHwgJ29hdXRoMic+O1xuICBfcmVmcmVzaERlbGVnYXRlOiBPcHRpb25hbDxTZXNzaW9uUmVmcmVzaERlbGVnYXRlPFM+PjtcblxuICAvLyBkZXNjcmliZTogKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxEZXNjcmliZVNPYmplY3RSZXN1bHQ+O1xuICBkZXNjcmliZSQ6IENhY2hlZEZ1bmN0aW9uPChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8RGVzY3JpYmVTT2JqZWN0UmVzdWx0Pj47XG4gIGRlc2NyaWJlJCQ6IENhY2hlZEZ1bmN0aW9uPChuYW1lOiBzdHJpbmcpID0+IERlc2NyaWJlU09iamVjdFJlc3VsdD47XG4gIGRlc2NyaWJlU09iamVjdDogKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxEZXNjcmliZVNPYmplY3RSZXN1bHQ+O1xuICBkZXNjcmliZVNPYmplY3QkOiBDYWNoZWRGdW5jdGlvbjxcbiAgICAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPERlc2NyaWJlU09iamVjdFJlc3VsdD5cbiAgPjtcbiAgZGVzY3JpYmVTT2JqZWN0JCQ6IENhY2hlZEZ1bmN0aW9uPChuYW1lOiBzdHJpbmcpID0+IERlc2NyaWJlU09iamVjdFJlc3VsdD47XG4gIC8vIGRlc2NyaWJlR2xvYmFsOiAoKSA9PiBQcm9taXNlPERlc2NyaWJlR2xvYmFsUmVzdWx0PjtcbiAgZGVzY3JpYmVHbG9iYWwkOiBDYWNoZWRGdW5jdGlvbjwoKSA9PiBQcm9taXNlPERlc2NyaWJlR2xvYmFsUmVzdWx0Pj47XG4gIGRlc2NyaWJlR2xvYmFsJCQ6IENhY2hlZEZ1bmN0aW9uPCgpID0+IERlc2NyaWJlR2xvYmFsUmVzdWx0PjtcblxuICAvLyBBUEkgbGlicyBhcmUgbm90IGluc3RhbnRpYXRlZCBoZXJlIHNvIHRoYXQgY29yZSBtb2R1bGUgdG8gcmVtYWluIHdpdGhvdXQgZGVwZW5kZW5jaWVzIHRvIHRoZW1cbiAgLy8gSXQgaXMgcmVzcG9uc2libGUgZm9yIGRldmVsb3BlcnMgdG8gaW1wb3J0IGFwaSBsaWJzIGV4cGxpY2l0bHkgaWYgdGhleSBhcmUgdXNpbmcgJ2pzZm9yY2UvY29yZScgaW5zdGVhZCBvZiAnanNmb3JjZScuXG4gIGdldCBhbmFseXRpY3MoKTogQW5hbHl0aWNzPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCdhbmFseXRpY3MnKTtcbiAgfVxuXG4gIGdldCBhcGV4KCk6IEFwZXg8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ2FwZXgnKTtcbiAgfVxuXG4gIGdldCBidWxrKCk6IEJ1bGs8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ2J1bGsnKTtcbiAgfVxuXG4gIGdldCBidWxrMigpOiBCdWxrVjI8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ2J1bGsyJyk7XG4gIH1cblxuICBnZXQgY2hhdHRlcigpOiBDaGF0dGVyPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCdjaGF0dGVyJyk7XG4gIH1cblxuICBnZXQgbWV0YWRhdGEoKTogTWV0YWRhdGE8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ21ldGFkYXRhJyk7XG4gIH1cblxuICBnZXQgc29hcCgpOiBTb2FwQXBpPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCdzb2FwJyk7XG4gIH1cblxuICBnZXQgc3RyZWFtaW5nKCk6IFN0cmVhbWluZzxTPiB7XG4gICAgcmV0dXJuIHJhaXNlTm9Nb2R1bGVFcnJvcignc3RyZWFtaW5nJyk7XG4gIH1cblxuICBnZXQgdG9vbGluZygpOiBUb29saW5nPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCd0b29saW5nJyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29ubmVjdGlvbkNvbmZpZzxTPiA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7XG4gICAgICBsb2dpblVybCxcbiAgICAgIGluc3RhbmNlVXJsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIG9hdXRoMixcbiAgICAgIG1heFJlcXVlc3QsXG4gICAgICBsb2dMZXZlbCxcbiAgICAgIHByb3h5VXJsLFxuICAgICAgaHR0cFByb3h5LFxuICAgIH0gPSBjb25maWc7XG4gICAgdGhpcy5sb2dpblVybCA9IGxvZ2luVXJsIHx8IGRlZmF1bHRDb25uZWN0aW9uQ29uZmlnLmxvZ2luVXJsO1xuICAgIHRoaXMuaW5zdGFuY2VVcmwgPSBpbnN0YW5jZVVybCB8fCBkZWZhdWx0Q29ubmVjdGlvbkNvbmZpZy5pbnN0YW5jZVVybDtcblxuICAgIGlmICh0aGlzLmlzTGlnaHRuaW5nSW5zdGFuY2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaWdodG5pbmcgVVJMcyBhcmUgbm90IHZhbGlkIGFzIGluc3RhbmNlIFVSTHMnKTtcbiAgICB9XG5cbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uIHx8IGRlZmF1bHRDb25uZWN0aW9uQ29uZmlnLnZlcnNpb247XG4gICAgdGhpcy5vYXV0aDIgPVxuICAgICAgb2F1dGgyIGluc3RhbmNlb2YgT0F1dGgyXG4gICAgICAgID8gb2F1dGgyXG4gICAgICAgIDogbmV3IE9BdXRoMih7XG4gICAgICAgICAgICBsb2dpblVybDogdGhpcy5sb2dpblVybCxcbiAgICAgICAgICAgIHByb3h5VXJsLFxuICAgICAgICAgICAgaHR0cFByb3h5LFxuICAgICAgICAgICAgLi4ub2F1dGgyLFxuICAgICAgICAgIH0pO1xuICAgIGxldCByZWZyZXNoRm4gPSBjb25maWcucmVmcmVzaEZuO1xuICAgIGlmICghcmVmcmVzaEZuICYmIHRoaXMub2F1dGgyLmNsaWVudElkKSB7XG4gICAgICByZWZyZXNoRm4gPSBvYXV0aFJlZnJlc2hGbjtcbiAgICB9XG4gICAgaWYgKHJlZnJlc2hGbikge1xuICAgICAgdGhpcy5fcmVmcmVzaERlbGVnYXRlID0gbmV3IFNlc3Npb25SZWZyZXNoRGVsZWdhdGUodGhpcywgcmVmcmVzaEZuKTtcbiAgICB9XG4gICAgdGhpcy5fbWF4UmVxdWVzdCA9IG1heFJlcXVlc3QgfHwgZGVmYXVsdENvbm5lY3Rpb25Db25maWcubWF4UmVxdWVzdDtcbiAgICB0aGlzLl9sb2dnZXIgPSBsb2dMZXZlbFxuICAgICAgPyBDb25uZWN0aW9uLl9sb2dnZXIuY3JlYXRlSW5zdGFuY2UobG9nTGV2ZWwpXG4gICAgICA6IENvbm5lY3Rpb24uX2xvZ2dlcjtcbiAgICB0aGlzLl9sb2dMZXZlbCA9IGxvZ0xldmVsO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHByb3h5VXJsXG4gICAgICA/IG5ldyBYZFByb3h5VHJhbnNwb3J0KHByb3h5VXJsKVxuICAgICAgOiBodHRwUHJveHlcbiAgICAgID8gbmV3IEh0dHBQcm94eVRyYW5zcG9ydChodHRwUHJveHkpXG4gICAgICA6IG5ldyBUcmFuc3BvcnQoKTtcbiAgICB0aGlzLl9jYWxsT3B0aW9ucyA9IGNvbmZpZy5jYWxsT3B0aW9ucztcbiAgICB0aGlzLmNhY2hlID0gbmV3IENhY2hlKCk7XG4gICAgY29uc3QgZGVzY3JpYmVDYWNoZUtleSA9ICh0eXBlPzogc3RyaW5nKSA9PlxuICAgICAgdHlwZSA/IGBkZXNjcmliZS4ke3R5cGV9YCA6ICdkZXNjcmliZSc7XG4gICAgY29uc3QgZGVzY3JpYmUgPSBDb25uZWN0aW9uLnByb3RvdHlwZS5kZXNjcmliZTtcbiAgICB0aGlzLmRlc2NyaWJlID0gdGhpcy5jYWNoZS5jcmVhdGVDYWNoZWRGdW5jdGlvbihkZXNjcmliZSwgdGhpcywge1xuICAgICAga2V5OiBkZXNjcmliZUNhY2hlS2V5LFxuICAgICAgc3RyYXRlZ3k6ICdOT0NBQ0hFJyxcbiAgICB9KTtcbiAgICB0aGlzLmRlc2NyaWJlJCA9IHRoaXMuY2FjaGUuY3JlYXRlQ2FjaGVkRnVuY3Rpb24oZGVzY3JpYmUsIHRoaXMsIHtcbiAgICAgIGtleTogZGVzY3JpYmVDYWNoZUtleSxcbiAgICAgIHN0cmF0ZWd5OiAnSElUJyxcbiAgICB9KTtcbiAgICB0aGlzLmRlc2NyaWJlJCQgPSB0aGlzLmNhY2hlLmNyZWF0ZUNhY2hlZEZ1bmN0aW9uKGRlc2NyaWJlLCB0aGlzLCB7XG4gICAgICBrZXk6IGRlc2NyaWJlQ2FjaGVLZXksXG4gICAgICBzdHJhdGVneTogJ0lNTUVESUFURScsXG4gICAgfSkgYXMgYW55O1xuICAgIHRoaXMuZGVzY3JpYmVTT2JqZWN0ID0gdGhpcy5kZXNjcmliZTtcbiAgICB0aGlzLmRlc2NyaWJlU09iamVjdCQgPSB0aGlzLmRlc2NyaWJlJDtcbiAgICB0aGlzLmRlc2NyaWJlU09iamVjdCQkID0gdGhpcy5kZXNjcmliZSQkO1xuICAgIGNvbnN0IGRlc2NyaWJlR2xvYmFsID0gQ29ubmVjdGlvbi5wcm90b3R5cGUuZGVzY3JpYmVHbG9iYWw7XG4gICAgdGhpcy5kZXNjcmliZUdsb2JhbCA9IHRoaXMuY2FjaGUuY3JlYXRlQ2FjaGVkRnVuY3Rpb24oXG4gICAgICBkZXNjcmliZUdsb2JhbCxcbiAgICAgIHRoaXMsXG4gICAgICB7IGtleTogJ2Rlc2NyaWJlR2xvYmFsJywgc3RyYXRlZ3k6ICdOT0NBQ0hFJyB9LFxuICAgICk7XG4gICAgdGhpcy5kZXNjcmliZUdsb2JhbCQgPSB0aGlzLmNhY2hlLmNyZWF0ZUNhY2hlZEZ1bmN0aW9uKFxuICAgICAgZGVzY3JpYmVHbG9iYWwsXG4gICAgICB0aGlzLFxuICAgICAgeyBrZXk6ICdkZXNjcmliZUdsb2JhbCcsIHN0cmF0ZWd5OiAnSElUJyB9LFxuICAgICk7XG4gICAgdGhpcy5kZXNjcmliZUdsb2JhbCQkID0gdGhpcy5jYWNoZS5jcmVhdGVDYWNoZWRGdW5jdGlvbihcbiAgICAgIGRlc2NyaWJlR2xvYmFsLFxuICAgICAgdGhpcyxcbiAgICAgIHsga2V5OiAnZGVzY3JpYmVHbG9iYWwnLCBzdHJhdGVneTogJ0lNTUVESUFURScgfSxcbiAgICApIGFzIGFueTtcbiAgICBjb25zdCB7XG4gICAgICBhY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHNlcnZlclVybCxcbiAgICAgIHNpZ25lZFJlcXVlc3QsXG4gICAgfSA9IGNvbmZpZztcbiAgICB0aGlzLl9lc3RhYmxpc2goe1xuICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW4sXG4gICAgICBpbnN0YW5jZVVybCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHNlcnZlclVybCxcbiAgICAgIHNpZ25lZFJlcXVlc3QsXG4gICAgfSk7XG5cbiAgICBqc2ZvcmNlLmVtaXQoJ2Nvbm5lY3Rpb246bmV3JywgdGhpcyk7XG4gIH1cblxuICAvKiBAcHJpdmF0ZSAqL1xuICBfZXN0YWJsaXNoKG9wdGlvbnM6IENvbm5lY3Rpb25Fc3RhYmxpc2hPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW4sXG4gICAgICBpbnN0YW5jZVVybCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHNlcnZlclVybCxcbiAgICAgIHNpZ25lZFJlcXVlc3QsXG4gICAgICB1c2VySW5mbyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLmluc3RhbmNlVXJsID0gc2VydmVyVXJsXG4gICAgICA/IHNlcnZlclVybC5zcGxpdCgnLycpLnNsaWNlKDAsIDMpLmpvaW4oJy8nKVxuICAgICAgOiBpbnN0YW5jZVVybCB8fCB0aGlzLmluc3RhbmNlVXJsO1xuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBzZXNzaW9uSWQgfHwgYWNjZXNzVG9rZW4gfHwgdGhpcy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbiB8fCB0aGlzLnJlZnJlc2hUb2tlbjtcbiAgICBpZiAodGhpcy5yZWZyZXNoVG9rZW4gJiYgIXRoaXMuX3JlZnJlc2hEZWxlZ2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmVmcmVzaCB0b2tlbiBpcyBzcGVjaWZpZWQgd2l0aG91dCBvYXV0aDIgY2xpZW50IGluZm9ybWF0aW9uIG9yIHJlZnJlc2ggZnVuY3Rpb24nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVkUmVxdWVzdE9iamVjdCA9XG4gICAgICBzaWduZWRSZXF1ZXN0ICYmIHBhcnNlU2lnbmVkUmVxdWVzdChzaWduZWRSZXF1ZXN0KTtcbiAgICBpZiAoc2lnbmVkUmVxdWVzdE9iamVjdCkge1xuICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHNpZ25lZFJlcXVlc3RPYmplY3QuY2xpZW50Lm9hdXRoVG9rZW47XG4gICAgICBpZiAoQ2FudmFzVHJhbnNwb3J0LnN1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgQ2FudmFzVHJhbnNwb3J0KHNpZ25lZFJlcXVlc3RPYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVzZXJJbmZvID0gdXNlckluZm8gfHwgdGhpcy51c2VySW5mbztcbiAgICB0aGlzLl9zZXNzaW9uVHlwZSA9IHNlc3Npb25JZCA/ICdzb2FwJyA6ICdvYXV0aDInO1xuICAgIHRoaXMuX3Jlc2V0SW5zdGFuY2UoKTtcbiAgfVxuXG4gIC8qIEBwcml2ZWF0ZSAqL1xuICBfY2xlYXJTZXNzaW9uKCkge1xuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBudWxsO1xuICAgIHRoaXMucmVmcmVzaFRva2VuID0gbnVsbDtcbiAgICB0aGlzLmluc3RhbmNlVXJsID0gZGVmYXVsdENvbm5lY3Rpb25Db25maWcuaW5zdGFuY2VVcmw7XG4gICAgdGhpcy51c2VySW5mbyA9IG51bGw7XG4gICAgdGhpcy5fc2Vzc2lvblR5cGUgPSBudWxsO1xuICB9XG5cbiAgLyogQHByaXZlYXRlICovXG4gIF9yZXNldEluc3RhbmNlKCkge1xuICAgIHRoaXMubGltaXRJbmZvID0ge307XG4gICAgdGhpcy5zb2JqZWN0cyA9IHt9O1xuICAgIC8vIFRPRE8gaW1wbCBjYWNoZVxuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmNhY2hlLmdldCgnZGVzY3JpYmVHbG9iYWwnKS5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3ZhbHVlJyk7XG4gICAgdGhpcy5jYWNoZS5nZXQoJ2Rlc2NyaWJlR2xvYmFsJykub24oJ3ZhbHVlJywgKHsgcmVzdWx0IH0pID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBzbyBvZiByZXN1bHQuc29iamVjdHMpIHtcbiAgICAgICAgICB0aGlzLnNvYmplY3Qoc28ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICAvKlxuICAgIGlmICh0aGlzLnRvb2xpbmcpIHtcbiAgICAgIHRoaXMudG9vbGluZy5fcmVzZXRJbnN0YW5jZSgpO1xuICAgIH1cbiAgICAqL1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZSB0aGUgY29ubmVjdGlvbiB1c2luZyBPQXV0aDIgZmxvdy5cbiAgICogVHlwaWNhbGx5LCBqdXN0IHBhc3MgdGhlIGNvZGUgcmV0dXJuZWQgZnJvbSBhdXRob3JpemF0aW9uIHNlcnZlciBpbiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY29tcGxldGUgYXV0aG9yaXphdGlvbi5cbiAgICogSWYgeW91IHdhbnQgdG8gYXV0aG9yaXplIHdpdGggZ3JhbnQgdHlwZXMgb3RoZXIgdGhhbiBgYXV0aG9yaXphdGlvbl9jb2RlYCwgeW91IGNhbiBhbHNvIHBhc3MgcGFyYW1zIG9iamVjdCB3aXRoIHRoZSBncmFudCB0eXBlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxVc2VySW5mbz59IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyIElELCBvcmcgSUQgYW5kIGlkZW50aXR5IFVSTC5cbiAgICpcbiAgICovXG4gIGFzeW5jIGF1dGhvcml6ZShcbiAgICBjb2RlT3JQYXJhbXM6IHN0cmluZyB8IHsgZ3JhbnRfdHlwZTogc3RyaW5nOyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgcGFyYW1zOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPFVzZXJJbmZvPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vYXV0aDIucmVxdWVzdFRva2VuKGNvZGVPclBhcmFtcywgcGFyYW1zKTtcbiAgICBjb25zdCB1c2VySW5mbyA9IHBhcnNlSWRVcmwocmVzLmlkKTtcbiAgICB0aGlzLl9lc3RhYmxpc2goe1xuICAgICAgaW5zdGFuY2VVcmw6IHJlcy5pbnN0YW5jZV91cmwsXG4gICAgICBhY2Nlc3NUb2tlbjogcmVzLmFjY2Vzc190b2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzLnJlZnJlc2hfdG9rZW4sXG4gICAgICB1c2VySW5mbyxcbiAgICB9KTtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoXG4gICAgICBgPGxvZ2luPiBjb21wbGV0ZWQuIHVzZXIgaWQgPSAke3VzZXJJbmZvLmlkfSwgb3JnIGlkID0gJHt1c2VySW5mby5vcmdhbml6YXRpb25JZH1gLFxuICAgICk7XG4gICAgcmV0dXJuIHVzZXJJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIHRoaXMuX3JlZnJlc2hEZWxlZ2F0ZSA9IG5ldyBTZXNzaW9uUmVmcmVzaERlbGVnYXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGNyZWF0ZVVzZXJuYW1lUGFzc3dvcmRSZWZyZXNoRm4odXNlcm5hbWUsIHBhc3N3b3JkKSxcbiAgICApO1xuICAgIGlmICh0aGlzLm9hdXRoMj8uY2xpZW50SWQgJiYgdGhpcy5vYXV0aDIuY2xpZW50U2VjcmV0KSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2dpbkJ5T0F1dGgyKHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvZ2luQnlTb2FwKHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gYnkgT0F1dGgyIHVzZXJuYW1lICYgcGFzc3dvcmQgZmxvd1xuICAgKi9cbiAgYXN5bmMgbG9naW5CeU9BdXRoMih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub2F1dGgyLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAgIGNvbnN0IHVzZXJJbmZvID0gcGFyc2VJZFVybChyZXMuaWQpO1xuICAgIHRoaXMuX2VzdGFibGlzaCh7XG4gICAgICBpbnN0YW5jZVVybDogcmVzLmluc3RhbmNlX3VybCxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXMuYWNjZXNzX3Rva2VuLFxuICAgICAgdXNlckluZm8sXG4gICAgfSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oXG4gICAgICBgPGxvZ2luPiBjb21wbGV0ZWQuIHVzZXIgaWQgPSAke3VzZXJJbmZvLmlkfSwgb3JnIGlkID0gJHt1c2VySW5mby5vcmdhbml6YXRpb25JZH1gLFxuICAgICk7XG4gICAgcmV0dXJuIHVzZXJJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBhc3luYyBsb2dpbkJ5U29hcCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIGlmICghdXNlcm5hbWUgfHwgIXBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdubyB1c2VybmFtZSBwYXNzd29yZCBnaXZlbicpKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IFtcbiAgICAgICc8c2U6RW52ZWxvcGUgeG1sbnM6c2U9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPicsXG4gICAgICAnPHNlOkhlYWRlci8+JyxcbiAgICAgICc8c2U6Qm9keT4nLFxuICAgICAgJzxsb2dpbiB4bWxucz1cInVybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbVwiPicsXG4gICAgICBgPHVzZXJuYW1lPiR7ZXNjKHVzZXJuYW1lKX08L3VzZXJuYW1lPmAsXG4gICAgICBgPHBhc3N3b3JkPiR7ZXNjKHBhc3N3b3JkKX08L3Bhc3N3b3JkPmAsXG4gICAgICAnPC9sb2dpbj4nLFxuICAgICAgJzwvc2U6Qm9keT4nLFxuICAgICAgJzwvc2U6RW52ZWxvcGU+JyxcbiAgICBdLmpvaW4oJycpO1xuXG4gICAgY29uc3Qgc29hcExvZ2luRW5kcG9pbnQgPSBbXG4gICAgICB0aGlzLmxvZ2luVXJsLFxuICAgICAgJ3NlcnZpY2VzL1NvYXAvdScsXG4gICAgICB0aGlzLnZlcnNpb24sXG4gICAgXS5qb2luKCcvJyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl90cmFuc3BvcnQuaHR0cFJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmw6IHNvYXBMb2dpbkVuZHBvaW50LFxuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCcsXG4gICAgICAgIFNPQVBBY3Rpb246ICdcIlwiJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgbGV0IG07XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICBtID0gcmVzcG9uc2UuYm9keS5tYXRjaCgvPGZhdWx0c3RyaW5nPihbXjxdKyk8XFwvZmF1bHRzdHJpbmc+Lyk7XG4gICAgICBjb25zdCBmYXVsdHN0cmluZyA9IG0gJiYgbVsxXTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihmYXVsdHN0cmluZyB8fCByZXNwb25zZS5ib2R5KTtcbiAgICB9XG4gICAgLy8gdGhlIEFQSSB3aWxsIHJldHVybiAyMDAgYW5kIGEgcmVzdHJpY2VkIHRva2VuIHdoZW4gdXNpbmcgYW4gZXhwaXJlZCBwYXNzd29yZDpcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5zYWxlc2ZvcmNlLmNvbS9kb2NzL2F0bGFzLmVuLXVzLmFwaS5tZXRhL2FwaS9zZm9yY2VfYXBpX2NhbGxzX2xvZ2luX2xvZ2lucmVzdWx0Lmh0bVxuICAgIC8vXG4gICAgLy8gd2UgbmVlZCB0byB0aHJvdyBoZXJlIHRvIGF2b2lkIGEgcG9zc2libGUgaW5maW5pdGUgbG9vcCB3aXRoIHNlc3Npb24gcmVmcmVzaCB3aGVyZTpcbiAgICAvLyAgMS4gbG9naW4gaGFwcGVucywgYHRoaXMuYWNjZXNzVG9rZW5gIGlzIHNldCB0byB0aGUgcmVzdHJpY3RlZCB0b2tlblxuICAgIC8vICAyLiByZXF1ZXN0cyBoYXBwZW4sIGdldCBiYWNrIDQwMVxuICAgIC8vICAzLiB0cmlnZ2VyIHNlc3Npb24tcmVmcmVzaCAodXNlcm5hbWUvcGFzc3dvcmQgbG9naW4gaGFzIGEgZGVmYXVsdCBzZXNzaW9uIHJlZnJlc2ggZGVsZWdhdGUgZnVuY3Rpb24pXG4gICAgLy8gIDQuIGdldHMgc3R1Y2sgcmVmcmVzaGluZyBhIHJlc3RyaWN0ZWQgdG9rZW5cbiAgICBpZiAocmVzcG9uc2UuYm9keS5tYXRjaCgvPHBhc3N3b3JkRXhwaXJlZD50cnVlPFxcL3Bhc3N3b3JkRXhwaXJlZD4vZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvZ2luIGJlY2F1c2UgdGhlIHVzZWQgcGFzc3dvcmQgaGFzIGV4cGlyZWQuJylcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKGBTT0FQIHJlc3BvbnNlID0gJHtyZXNwb25zZS5ib2R5fWApO1xuICAgIG0gPSByZXNwb25zZS5ib2R5Lm1hdGNoKC88c2VydmVyVXJsPihbXjxdKyk8XFwvc2VydmVyVXJsPi8pO1xuICAgIGNvbnN0IHNlcnZlclVybCA9IG0gJiYgbVsxXTtcbiAgICBtID0gcmVzcG9uc2UuYm9keS5tYXRjaCgvPHNlc3Npb25JZD4oW148XSspPFxcL3Nlc3Npb25JZD4vKTtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBtICYmIG1bMV07XG4gICAgbSA9IHJlc3BvbnNlLmJvZHkubWF0Y2goLzx1c2VySWQ+KFtePF0rKTxcXC91c2VySWQ+Lyk7XG4gICAgY29uc3QgdXNlcklkID0gbSAmJiBtWzFdO1xuICAgIG0gPSByZXNwb25zZS5ib2R5Lm1hdGNoKC88b3JnYW5pemF0aW9uSWQ+KFtePF0rKTxcXC9vcmdhbml6YXRpb25JZD4vKTtcbiAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9IG0gJiYgbVsxXTtcbiAgICBpZiAoIXNlcnZlclVybCB8fCAhc2Vzc2lvbklkIHx8ICF1c2VySWQgfHwgIW9yZ2FuaXphdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdjb3VsZCBub3QgZXh0cmFjdCBzZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gbG9naW4gcmVzcG9uc2UnLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaWRVcmwgPSBbdGhpcy5sb2dpblVybCwgJ2lkJywgb3JnYW5pemF0aW9uSWQsIHVzZXJJZF0uam9pbignLycpO1xuICAgIGNvbnN0IHVzZXJJbmZvID0geyBpZDogdXNlcklkLCBvcmdhbml6YXRpb25JZCwgdXJsOiBpZFVybCB9O1xuICAgIHRoaXMuX2VzdGFibGlzaCh7XG4gICAgICBzZXJ2ZXJVcmw6IHNlcnZlclVybC5zcGxpdCgnLycpLnNsaWNlKDAsIDMpLmpvaW4oJy8nKSxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJJbmZvLFxuICAgIH0pO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFxuICAgICAgYDxsb2dpbj4gY29tcGxldGVkLiB1c2VyIGlkID0gJHt1c2VySWR9LCBvcmcgaWQgPSAke29yZ2FuaXphdGlvbklkfWAsXG4gICAgKTtcbiAgICByZXR1cm4gdXNlckluZm87XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIGFzeW5jIGxvZ291dChyZXZva2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fcmVmcmVzaERlbGVnYXRlID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9zZXNzaW9uVHlwZSA9PT0gJ29hdXRoMicpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvZ291dEJ5T0F1dGgyKHJldm9rZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvZ291dEJ5U29hcChyZXZva2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCB0aGUgY3VycmVudCBzZXNzaW9uIGJ5IHJldm9raW5nIGFjY2VzcyB0b2tlbiB2aWEgT0F1dGgyIHNlc3Npb24gcmV2b2tlXG4gICAqL1xuICBhc3luYyBsb2dvdXRCeU9BdXRoMihyZXZva2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSByZXZva2UgPyB0aGlzLnJlZnJlc2hUb2tlbiA6IHRoaXMuYWNjZXNzVG9rZW47XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoMi5yZXZva2VUb2tlbih0b2tlbik7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgdGhlIHNlc3Npb24gYm91bmQgdG8gdGhpcyBjb25uZWN0aW9uXG4gICAgdGhpcy5fY2xlYXJTZXNzaW9uKCk7XG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCB0aGUgc2Vzc2lvbiBieSB1c2luZyBTT0FQIHdlYiBzZXJ2aWNlIEFQSVxuICAgKi9cbiAgYXN5bmMgbG9nb3V0QnlTb2FwKHJldm9rZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBib2R5ID0gW1xuICAgICAgJzxzZTpFbnZlbG9wZSB4bWxuczpzZT1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+JyxcbiAgICAgICc8c2U6SGVhZGVyPicsXG4gICAgICAnPFNlc3Npb25IZWFkZXIgeG1sbnM9XCJ1cm46cGFydG5lci5zb2FwLnNmb3JjZS5jb21cIj4nLFxuICAgICAgYDxzZXNzaW9uSWQ+JHtlc2MoXG4gICAgICAgIHJldm9rZSA/IHRoaXMucmVmcmVzaFRva2VuIDogdGhpcy5hY2Nlc3NUb2tlbixcbiAgICAgICl9PC9zZXNzaW9uSWQ+YCxcbiAgICAgICc8L1Nlc3Npb25IZWFkZXI+JyxcbiAgICAgICc8L3NlOkhlYWRlcj4nLFxuICAgICAgJzxzZTpCb2R5PicsXG4gICAgICAnPGxvZ291dCB4bWxucz1cInVybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbVwiLz4nLFxuICAgICAgJzwvc2U6Qm9keT4nLFxuICAgICAgJzwvc2U6RW52ZWxvcGU+JyxcbiAgICBdLmpvaW4oJycpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fdHJhbnNwb3J0Lmh0dHBSZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiBbdGhpcy5pbnN0YW5jZVVybCwgJ3NlcnZpY2VzL1NvYXAvdScsIHRoaXMudmVyc2lvbl0uam9pbignLycpLFxuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCcsXG4gICAgICAgIFNPQVBBY3Rpb246ICdcIlwiJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKFxuICAgICAgYFNPQVAgc3RhdHVzQ29kZSA9ICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0sIHJlc3BvbnNlID0gJHtyZXNwb25zZS5ib2R5fWAsXG4gICAgKTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgIGNvbnN0IG0gPSByZXNwb25zZS5ib2R5Lm1hdGNoKC88ZmF1bHRzdHJpbmc+KFtePF0rKTxcXC9mYXVsdHN0cmluZz4vKTtcbiAgICAgIGNvbnN0IGZhdWx0c3RyaW5nID0gbSAmJiBtWzFdO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZhdWx0c3RyaW5nIHx8IHJlc3BvbnNlLmJvZHkpO1xuICAgIH1cbiAgICAvLyBEZXN0cm95IHRoZSBzZXNzaW9uIGJvdW5kIHRvIHRoaXMgY29ubmVjdGlvblxuICAgIHRoaXMuX2NsZWFyU2Vzc2lvbigpO1xuICAgIHRoaXMuX3Jlc2V0SW5zdGFuY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIFJFU1QgQVBJIHJlcXVlc3Qgd2l0aCBnaXZlbiBIVFRQIHJlcXVlc3QgaW5mbywgd2l0aCBjb25uZWN0ZWQgc2Vzc2lvbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogRW5kcG9pbnQgVVJMIGNhbiBiZSBhYnNvbHV0ZSBVUkwgKCdodHRwczovL25hMS5zYWxlc2ZvcmNlLmNvbS9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIHJlbGF0aXZlIHBhdGggZnJvbSByb290ICgnL3NlcnZpY2VzL2RhdGEvdjMyLjAvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpXG4gICAqICwgb3IgcmVsYXRpdmUgcGF0aCBmcm9tIHZlcnNpb24gcm9vdCAoJy9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJykuXG4gICAqL1xuICByZXF1ZXN0PFIgPSB1bmtub3duPihcbiAgICByZXF1ZXN0OiBzdHJpbmcgfCBIdHRwUmVxdWVzdCxcbiAgICBvcHRpb25zOiBPYmplY3QgPSB7fSxcbiAgKTogU3RyZWFtUHJvbWlzZTxSPiB7XG4gICAgLy8gaWYgcmVxdWVzdCBpcyBzaW1wbGUgc3RyaW5nLCByZWdhcmQgaXQgYXMgdXJsIGluIEdFVCBtZXRob2RcbiAgICBsZXQgcmVxdWVzdF86IEh0dHBSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJyA/IHsgbWV0aG9kOiAnR0VUJywgdXJsOiByZXF1ZXN0IH0gOiByZXF1ZXN0O1xuICAgIC8vIGlmIHVybCBpcyBnaXZlbiBpbiByZWxhdGl2ZSBwYXRoLCBwcmVwZW5kIGJhc2UgdXJsIG9yIGluc3RhbmNlIHVybCBiZWZvcmUuXG4gICAgcmVxdWVzdF8gPSB7XG4gICAgICAuLi5yZXF1ZXN0XyxcbiAgICAgIHVybDogdGhpcy5fbm9ybWFsaXplVXJsKHJlcXVlc3RfLnVybCksXG4gICAgfTtcbiAgICBjb25zdCBodHRwQXBpID0gbmV3IEh0dHBBcGkodGhpcywgb3B0aW9ucyk7XG4gICAgLy8gbG9nIGFwaSB1c2FnZSBhbmQgaXRzIHF1b3RhXG4gICAgaHR0cEFwaS5vbigncmVzcG9uc2UnLCAocmVzcG9uc2U6IEh0dHBSZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1snc2ZvcmNlLWxpbWl0LWluZm8nXSkge1xuICAgICAgICBjb25zdCBhcGlVc2FnZSA9IHJlc3BvbnNlLmhlYWRlcnNbJ3Nmb3JjZS1saW1pdC1pbmZvJ10ubWF0Y2goXG4gICAgICAgICAgL2FwaS11c2FnZT0oXFxkKylcXC8oXFxkKykvLFxuICAgICAgICApO1xuICAgICAgICBpZiAoYXBpVXNhZ2UpIHtcbiAgICAgICAgICB0aGlzLmxpbWl0SW5mbyA9IHtcbiAgICAgICAgICAgIGFwaVVzYWdlOiB7XG4gICAgICAgICAgICAgIHVzZWQ6IHBhcnNlSW50KGFwaVVzYWdlWzFdLCAxMCksXG4gICAgICAgICAgICAgIGxpbWl0OiBwYXJzZUludChhcGlVc2FnZVsyXSwgMTApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGh0dHBBcGkucmVxdWVzdDxSPihyZXF1ZXN0Xyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBIVFRQIEdFVCByZXF1ZXN0XG4gICAqXG4gICAqIEVuZHBvaW50IFVSTCBjYW4gYmUgYWJzb2x1dGUgVVJMICgnaHR0cHM6Ly9uYTEuc2FsZXNmb3JjZS5jb20vc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCByZWxhdGl2ZSBwYXRoIGZyb20gcm9vdCAoJy9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIG9yIHJlbGF0aXZlIHBhdGggZnJvbSB2ZXJzaW9uIHJvb3QgKCcvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpLlxuICAgKi9cbiAgcmVxdWVzdEdldDxSID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHsgbWV0aG9kOiAnR0VUJywgdXJsIH07XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxSPihyZXF1ZXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIEhUVFAgUE9TVCByZXF1ZXN0IHdpdGggSlNPTiBib2R5LCB3aXRoIGNvbm5lY3RlZCBzZXNzaW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEVuZHBvaW50IFVSTCBjYW4gYmUgYWJzb2x1dGUgVVJMICgnaHR0cHM6Ly9uYTEuc2FsZXNmb3JjZS5jb20vc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCByZWxhdGl2ZSBwYXRoIGZyb20gcm9vdCAoJy9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIG9yIHJlbGF0aXZlIHBhdGggZnJvbSB2ZXJzaW9uIHJvb3QgKCcvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpLlxuICAgKi9cbiAgcmVxdWVzdFBvc3Q8UiA9IHVua25vd24+KHVybDogc3RyaW5nLCBib2R5OiBPYmplY3QsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Uj4ocmVxdWVzdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBIVFRQIFBVVCByZXF1ZXN0IHdpdGggSlNPTiBib2R5LCB3aXRoIGNvbm5lY3RlZCBzZXNzaW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEVuZHBvaW50IFVSTCBjYW4gYmUgYWJzb2x1dGUgVVJMICgnaHR0cHM6Ly9uYTEuc2FsZXNmb3JjZS5jb20vc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCByZWxhdGl2ZSBwYXRoIGZyb20gcm9vdCAoJy9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIG9yIHJlbGF0aXZlIHBhdGggZnJvbSB2ZXJzaW9uIHJvb3QgKCcvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpLlxuICAgKi9cbiAgcmVxdWVzdFB1dDxSPih1cmw6IHN0cmluZywgYm9keTogT2JqZWN0LCBvcHRpb25zPzogT2JqZWN0KSB7XG4gICAgY29uc3QgcmVxdWVzdDogSHR0cFJlcXVlc3QgPSB7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Uj4ocmVxdWVzdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBIVFRQIFBBVENIIHJlcXVlc3Qgd2l0aCBKU09OIGJvZHlcbiAgICpcbiAgICogRW5kcG9pbnQgVVJMIGNhbiBiZSBhYnNvbHV0ZSBVUkwgKCdodHRwczovL25hMS5zYWxlc2ZvcmNlLmNvbS9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIHJlbGF0aXZlIHBhdGggZnJvbSByb290ICgnL3NlcnZpY2VzL2RhdGEvdjMyLjAvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpXG4gICAqICwgb3IgcmVsYXRpdmUgcGF0aCBmcm9tIHZlcnNpb24gcm9vdCAoJy9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJykuXG4gICAqL1xuICByZXF1ZXN0UGF0Y2g8UiA9IHVua25vd24+KHVybDogc3RyaW5nLCBib2R5OiBPYmplY3QsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIHVybCxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFI+KHJlcXVlc3QsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgSFRUUCBERUxFVEUgcmVxdWVzdFxuICAgKlxuICAgKiBFbmRwb2ludCBVUkwgY2FuIGJlIGFic29sdXRlIFVSTCAoJ2h0dHBzOi8vbmExLnNhbGVzZm9yY2UuY29tL3NlcnZpY2VzL2RhdGEvdjMyLjAvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpXG4gICAqICwgcmVsYXRpdmUgcGF0aCBmcm9tIHJvb3QgKCcvc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCBvciByZWxhdGl2ZSBwYXRoIGZyb20gdmVyc2lvbiByb290ICgnL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKS5cbiAgICovXG4gIHJlcXVlc3REZWxldGU8Uj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHsgbWV0aG9kOiAnREVMRVRFJywgdXJsIH07XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxSPihyZXF1ZXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqKi9cbiAgX2Jhc2VVcmwoKSB7XG4gICAgcmV0dXJuIFt0aGlzLmluc3RhbmNlVXJsLCAnc2VydmljZXMvZGF0YScsIGB2JHt0aGlzLnZlcnNpb259YF0uam9pbignLycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgcGF0aCB0byBhYnNvbHV0ZSB1cmxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ub3JtYWxpemVVcmwodXJsOiBzdHJpbmcpIHtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHRoaXMuaW5zdGFuY2VVcmwgKyAnL3NlcnZpY2VzLycpKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgICB9XG4gICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy9zZXJ2aWNlcy8nKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZVVybCArIHVybDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9iYXNlVXJsKCkgKyB1cmw7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHF1ZXJ5PFQgZXh0ZW5kcyBSZWNvcmQ+KFxuICAgIHNvcWw6IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxRdWVyeU9wdGlvbnM+LFxuICApOiBRdWVyeTxTLCBTT2JqZWN0TmFtZXM8Uz4sIFQsICdRdWVyeVJlc3VsdCc+IHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5PFMsIFNPYmplY3ROYW1lczxTPiwgVCwgJ1F1ZXJ5UmVzdWx0Jz4odGhpcywgc29xbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBzZWFyY2ggYnkgU09TTFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc29zbCAtIFNPU0wgc3RyaW5nXG4gICAqIEBwYXJhbSB7Q2FsbGJhY2suPEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlLjxBcnJheS48UmVjb3JkUmVzdWx0Pj59XG4gICAqL1xuICBzZWFyY2goc29zbDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5fYmFzZVVybCgpICsgJy9zZWFyY2g/cT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNvc2wpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8U2VhcmNoUmVzdWx0Pih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBxdWVyeU1vcmU8VCBleHRlbmRzIFJlY29yZD4obG9jYXRvcjogc3RyaW5nLCBvcHRpb25zPzogUXVlcnlPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeTxTLCBTT2JqZWN0TmFtZXM8Uz4sIFQsICdRdWVyeVJlc3VsdCc+KFxuICAgICAgdGhpcyxcbiAgICAgIHsgbG9jYXRvciB9LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyogKi9cbiAgX2Vuc3VyZVZlcnNpb24obWFqb3JWZXJzaW9uOiBudW1iZXIpIHtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IHRoaXMudmVyc2lvbi5zcGxpdCgnLicpO1xuICAgIHJldHVybiBwYXJzZUludCh2ZXJzaW9uc1swXSwgMTApID49IG1ham9yVmVyc2lvbjtcbiAgfVxuXG4gIC8qICovXG4gIF9zdXBwb3J0cyhmZWF0dXJlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGZlYXR1cmUpIHtcbiAgICAgIGNhc2UgJ3NvYmplY3QtY29sbGVjdGlvbic6IC8vIHNvYmplY3QgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgb25seSBpbiBBUEkgdmVyIDQyLjArXG4gICAgICAgIHJldHVybiB0aGlzLl9lbnN1cmVWZXJzaW9uKDQyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgc3BlY2lmaWVkIHJlY29yZHNcbiAgICovXG4gIHJldHJpZXZlPE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWRzOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFJldHJpZXZlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZWNvcmQ+O1xuICByZXRyaWV2ZTxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+PihcbiAgICB0eXBlOiBOLFxuICAgIGlkczogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IFJldHJpZXZlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZWNvcmRbXT47XG4gIHJldHJpZXZlPE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWRzOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogUmV0cmlldmVPcHRpb25zLFxuICApOiBQcm9taXNlPFJlY29yZCB8IFJlY29yZFtdPjtcbiAgYXN5bmMgcmV0cmlldmUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgb3B0aW9uczogUmV0cmlldmVPcHRpb25zID0ge30sXG4gICkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlkcylcbiAgICAgID8gLy8gY2hlY2sgdGhlIHZlcnNpb24gd2hldGhlciBTT2JqZWN0IGNvbGxlY3Rpb24gQVBJIGlzIHN1cHBvcnRlZCAoNDIuMClcbiAgICAgICAgdGhpcy5fZW5zdXJlVmVyc2lvbig0MilcbiAgICAgICAgPyB0aGlzLl9yZXRyaWV2ZU1hbnkodHlwZSwgaWRzLCBvcHRpb25zKVxuICAgICAgICA6IHRoaXMuX3JldHJpZXZlUGFyYWxsZWwodHlwZSwgaWRzLCBvcHRpb25zKVxuICAgICAgOiB0aGlzLl9yZXRyaWV2ZVNpbmdsZSh0eXBlLCBpZHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF9yZXRyaWV2ZVNpbmdsZSh0eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJldHJpZXZlT3B0aW9ucykge1xuICAgIGlmICghaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZWNvcmQgSUQuIFNwZWNpZnkgdmFsaWQgcmVjb3JkIElEIHZhbHVlJyk7XG4gICAgfVxuICAgIGxldCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlLCBpZF0uam9pbignLycpO1xuICAgIGNvbnN0IHsgZmllbGRzLCBoZWFkZXJzIH0gPSBvcHRpb25zO1xuICAgIGlmIChmaWVsZHMpIHtcbiAgICAgIHVybCArPSBgP2ZpZWxkcz0ke2ZpZWxkcy5qb2luKCcsJyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh7IG1ldGhvZDogJ0dFVCcsIHVybCwgaGVhZGVycyB9KTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfcmV0cmlldmVQYXJhbGxlbChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zOiBSZXRyaWV2ZU9wdGlvbnMsXG4gICkge1xuICAgIGlmIChpZHMubGVuZ3RoID4gdGhpcy5fbWF4UmVxdWVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlZWRlZCBtYXggbGltaXQgb2YgY29uY3VycmVudCBjYWxsJyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkcy5tYXAoKGlkKSA9PlxuICAgICAgICB0aGlzLl9yZXRyaWV2ZVNpbmdsZSh0eXBlLCBpZCwgb3B0aW9ucykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGlmIChvcHRpb25zLmFsbE9yTm9uZSB8fCBlcnIuZXJyb3JDb2RlICE9PSAnTk9UX0ZPVU5EJykge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX3JldHJpZXZlTWFueSh0eXBlOiBzdHJpbmcsIGlkczogc3RyaW5nW10sIG9wdGlvbnM6IFJldHJpZXZlT3B0aW9ucykge1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IFt0aGlzLl9iYXNlVXJsKCksICdjb21wb3NpdGUnLCAnc29iamVjdHMnLCB0eXBlXS5qb2luKCcvJyk7XG4gICAgY29uc3QgZmllbGRzID1cbiAgICAgIG9wdGlvbnMuZmllbGRzIHx8XG4gICAgICAoYXdhaXQgdGhpcy5kZXNjcmliZSQodHlwZSkpLmZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5uYW1lKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpZHMsIGZpZWxkcyB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSByZWNvcmRzXG4gICAqL1xuICBjcmVhdGU8XG4gICAgTiBleHRlbmRzIFNPYmplY3ROYW1lczxTPixcbiAgICBJbnB1dFJlY29yZCBleHRlbmRzIFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPiA9IFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPlxuICA+KFxuICAgIHR5cGU6IE4sXG4gICAgcmVjb3JkczogSW5wdXRSZWNvcmRbXSxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICBjcmVhdGU8XG4gICAgTiBleHRlbmRzIFNPYmplY3ROYW1lczxTPixcbiAgICBJbnB1dFJlY29yZCBleHRlbmRzIFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPiA9IFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPlxuICA+KHR5cGU6IE4sIHJlY29yZDogSW5wdXRSZWNvcmQsIG9wdGlvbnM/OiBEbWxPcHRpb25zKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgY3JlYXRlPFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgSW5wdXRSZWNvcmQgZXh0ZW5kcyBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4gPSBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IElucHV0UmVjb3JkIHwgSW5wdXRSZWNvcmRbXSxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPjtcbiAgLyoqXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByZWNvcmRzXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgcmV0ID0gQXJyYXkuaXNBcnJheShyZWNvcmRzKVxuICAgICAgPyAvLyBjaGVjayB0aGUgdmVyc2lvbiB3aGV0aGVyIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgaXMgc3VwcG9ydGVkICg0Mi4wKVxuICAgICAgICB0aGlzLl9lbnN1cmVWZXJzaW9uKDQyKVxuICAgICAgICA/IGF3YWl0IHRoaXMuX2NyZWF0ZU1hbnkodHlwZSwgcmVjb3Jkcywgb3B0aW9ucylcbiAgICAgICAgOiBhd2FpdCB0aGlzLl9jcmVhdGVQYXJhbGxlbCh0eXBlLCByZWNvcmRzLCBvcHRpb25zKVxuICAgICAgOiBhd2FpdCB0aGlzLl9jcmVhdGVTaW5nbGUodHlwZSwgcmVjb3Jkcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfY3JlYXRlU2luZ2xlKHR5cGU6IHN0cmluZywgcmVjb3JkOiBSZWNvcmQsIG9wdGlvbnM6IERtbE9wdGlvbnMpIHtcbiAgICBjb25zdCB7IElkLCB0eXBlOiBydHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgY29uc3Qgc29iamVjdFR5cGUgPSB0eXBlIHx8IGF0dHJpYnV0ZXM/LnR5cGUgfHwgcnR5cGU7XG4gICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTT2JqZWN0IFR5cGUgZGVmaW5lZCBpbiByZWNvcmQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgc29iamVjdFR5cGVdLmpvaW4oJy8nKTtcbiAgICBsZXQgY29udGVudFR5cGUsIGJvZHk7XG5cbiAgICBpZiAob3B0aW9ucz8ubXVsdGlwYXJ0RmlsZUZpZWxkcykge1xuICAgICAgLy8gU2VuZCB0aGUgcmVjb3JkIGFzIGEgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0LiBVc2VmdWwgZm9yIGZpZWxkcyBjb250YWluaW5nIGxhcmdlIGJpbmFyeSBibG9icy5cbiAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIGZpZWxkcyByZXF1ZXN0ZWQgdG8gYmUgc2VudCBzZXBhcmF0ZWx5IGZyb20gdGhlIEpTT05cbiAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMubXVsdGlwYXJ0RmlsZUZpZWxkcykuZm9yRWFjaChcbiAgICAgICAgKFtmaWVsZE5hbWUsIGZpbGVEZXRhaWxzXSkgPT4ge1xuICAgICAgICAgIGZvcm0uYXBwZW5kKFxuICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgQnVmZmVyLmZyb20ocmVjW2ZpZWxkTmFtZV0sICdiYXNlNjQnKSxcbiAgICAgICAgICAgIGZpbGVEZXRhaWxzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZGVsZXRlIHJlY1tmaWVsZE5hbWVdO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBhcyBKU09OXG4gICAgICBmb3JtLmFwcGVuZCh0eXBlLCBKU09OLnN0cmluZ2lmeShyZWMpLCB7XG4gICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KTtcbiAgICAgIGNvbnRlbnRUeXBlID0gZm9ybS5nZXRIZWFkZXJzKClbJ2NvbnRlbnQtdHlwZSddOyAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlICdib3VuZGFyeScgaXMgcHJlc2VudFxuICAgICAgYm9keSA9IGZvcm07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgYmVoYXZpb3I6IHNlbmQgdGhlIHJlcXVlc3QgYXMgSlNPTlxuICAgICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVjKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogYm9keSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICdjb250ZW50LXR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX2NyZWF0ZVBhcmFsbGVsKHR5cGU6IHN0cmluZywgcmVjb3JkczogUmVjb3JkW10sIG9wdGlvbnM6IERtbE9wdGlvbnMpIHtcbiAgICBpZiAocmVjb3Jkcy5sZW5ndGggPiB0aGlzLl9tYXhSZXF1ZXN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VlZGVkIG1heCBsaW1pdCBvZiBjb25jdXJyZW50IGNhbGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT5cbiAgICAgICAgdGhpcy5fY3JlYXRlU2luZ2xlKHR5cGUsIHJlY29yZCwgb3B0aW9ucykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIC8vIGJlIGF3YXJlIHRoYXQgYWxsT3JOb25lIGluIHBhcmFsbGVsIG1vZGUgd2lsbCBub3QgcmV2ZXJ0IHRoZSBvdGhlciBzdWNjZXNzZnVsIHJlcXVlc3RzXG4gICAgICAgICAgLy8gaXQgb25seSByYWlzZXMgZXJyb3Igd2hlbiBtZXQgYXQgbGVhc3Qgb25lIGZhaWxlZCByZXF1ZXN0LlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbE9yTm9uZSB8fCAhZXJyLmVycm9yQ29kZSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdG9TYXZlUmVzdWx0KGVycik7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF9jcmVhdGVNYW55KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICByZWNvcmRzOiBSZWNvcmRbXSxcbiAgICBvcHRpb25zOiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHRbXT4ge1xuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgfVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IE1BWF9ETUxfQ09VTlQgJiYgb3B0aW9ucy5hbGxvd1JlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uKGF3YWl0IHRoaXMuX2NyZWF0ZU1hbnkoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZWNvcmRzLnNsaWNlKDAsIE1BWF9ETUxfQ09VTlQpLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICkpLFxuICAgICAgICAuLi4oYXdhaXQgdGhpcy5fY3JlYXRlTWFueShcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHJlY29yZHMuc2xpY2UoTUFYX0RNTF9DT1VOVCksXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSksXG4gICAgICBdO1xuICAgIH1cbiAgICBjb25zdCBfcmVjb3JkcyA9IHJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHsgSWQsIHR5cGU6IHJ0eXBlLCBhdHRyaWJ1dGVzLCAuLi5yZWMgfSA9IHJlY29yZDtcbiAgICAgIGNvbnN0IHNvYmplY3RUeXBlID0gdHlwZSB8fCBhdHRyaWJ1dGVzPy50eXBlIHx8IHJ0eXBlO1xuICAgICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNPYmplY3QgVHlwZSBkZWZpbmVkIGluIHJlY29yZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgYXR0cmlidXRlczogeyB0eXBlOiBzb2JqZWN0VHlwZSB9LCAuLi5yZWMgfTtcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnY29tcG9zaXRlJywgJ3NvYmplY3RzJ10uam9pbignLycpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmwsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGFsbE9yTm9uZTogb3B0aW9ucy5hbGxPck5vbmUgfHwgZmFsc2UsXG4gICAgICAgIHJlY29yZHM6IF9yZWNvcmRzLFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihvcHRpb25zLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5vbnltIG9mIENvbm5lY3Rpb24jY3JlYXRlKClcbiAgICovXG4gIGluc2VydCA9IHRoaXMuY3JlYXRlO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcmVjb3Jkc1xuICAgKi9cbiAgdXBkYXRlPFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgVXBkYXRlUmVjb3JkIGV4dGVuZHMgU09iamVjdFVwZGF0ZVJlY29yZDxTLCBOPiA9IFNPYmplY3RVcGRhdGVSZWNvcmQ8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IFVwZGF0ZVJlY29yZFtdLFxuICAgIG9wdGlvbnM/OiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHRbXT47XG4gIHVwZGF0ZTxcbiAgICBOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+LFxuICAgIFVwZGF0ZVJlY29yZCBleHRlbmRzIFNPYmplY3RVcGRhdGVSZWNvcmQ8UywgTj4gPSBTT2JqZWN0VXBkYXRlUmVjb3JkPFMsIE4+XG4gID4odHlwZTogTiwgcmVjb3JkOiBVcGRhdGVSZWNvcmQsIG9wdGlvbnM/OiBEbWxPcHRpb25zKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgdXBkYXRlPFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgVXBkYXRlUmVjb3JkIGV4dGVuZHMgU09iamVjdFVwZGF0ZVJlY29yZDxTLCBOPiA9IFNPYmplY3RVcGRhdGVSZWNvcmQ8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IFVwZGF0ZVJlY29yZCB8IFVwZGF0ZVJlY29yZFtdLFxuICAgIG9wdGlvbnM/OiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHQgfCBTYXZlUmVzdWx0W10+O1xuICAvKipcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIHJlY29yZHNcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIHVwZGF0ZTxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+PihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVjb3JkcylcbiAgICAgID8gLy8gY2hlY2sgdGhlIHZlcnNpb24gd2hldGhlciBTT2JqZWN0IGNvbGxlY3Rpb24gQVBJIGlzIHN1cHBvcnRlZCAoNDIuMClcbiAgICAgICAgdGhpcy5fZW5zdXJlVmVyc2lvbig0MilcbiAgICAgICAgPyB0aGlzLl91cGRhdGVNYW55KHR5cGUsIHJlY29yZHMsIG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5fdXBkYXRlUGFyYWxsZWwodHlwZSwgcmVjb3Jkcywgb3B0aW9ucylcbiAgICAgIDogdGhpcy5fdXBkYXRlU2luZ2xlKHR5cGUsIHJlY29yZHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF91cGRhdGVTaW5nbGUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZDogUmVjb3JkLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgSWQ6IGlkLCB0eXBlOiBydHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgaWYgKCFpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNvcmQgaWQgaXMgbm90IGZvdW5kIGluIHJlY29yZC4nKTtcbiAgICB9XG4gICAgY29uc3Qgc29iamVjdFR5cGUgPSB0eXBlIHx8IGF0dHJpYnV0ZXM/LnR5cGUgfHwgcnR5cGU7XG4gICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTT2JqZWN0IFR5cGUgZGVmaW5lZCBpbiByZWNvcmQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgc29iamVjdFR5cGUsIGlkXS5qb2luKCcvJyk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgICB1cmwsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlYyksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4ob3B0aW9ucy5oZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbm9Db250ZW50UmVzcG9uc2U6IHsgaWQsIHN1Y2Nlc3M6IHRydWUsIGVycm9yczogW10gfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfdXBkYXRlUGFyYWxsZWwodHlwZTogc3RyaW5nLCByZWNvcmRzOiBSZWNvcmRbXSwgb3B0aW9uczogRG1sT3B0aW9ucykge1xuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IHRoaXMuX21heFJlcXVlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZWVkZWQgbWF4IGxpbWl0IG9mIGNvbmN1cnJlbnQgY2FsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICByZWNvcmRzLm1hcCgocmVjb3JkKSA9PlxuICAgICAgICB0aGlzLl91cGRhdGVTaW5nbGUodHlwZSwgcmVjb3JkLCBvcHRpb25zKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgLy8gYmUgYXdhcmUgdGhhdCBhbGxPck5vbmUgaW4gcGFyYWxsZWwgbW9kZSB3aWxsIG5vdCByZXZlcnQgdGhlIG90aGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdHNcbiAgICAgICAgICAvLyBpdCBvbmx5IHJhaXNlcyBlcnJvciB3aGVuIG1ldCBhdCBsZWFzdCBvbmUgZmFpbGVkIHJlcXVlc3QuXG4gICAgICAgICAgaWYgKG9wdGlvbnMuYWxsT3JOb25lIHx8ICFlcnIuZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0b1NhdmVSZXN1bHQoZXJyKTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX3VwZGF0ZU1hbnkoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IFJlY29yZFtdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdFtdPiB7XG4gICAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IE1BWF9ETUxfQ09VTlQgJiYgb3B0aW9ucy5hbGxvd1JlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uKGF3YWl0IHRoaXMuX3VwZGF0ZU1hbnkoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZWNvcmRzLnNsaWNlKDAsIE1BWF9ETUxfQ09VTlQpLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICkpLFxuICAgICAgICAuLi4oYXdhaXQgdGhpcy5fdXBkYXRlTWFueShcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHJlY29yZHMuc2xpY2UoTUFYX0RNTF9DT1VOVCksXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSksXG4gICAgICBdO1xuICAgIH1cbiAgICBjb25zdCBfcmVjb3JkcyA9IHJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHsgSWQ6IGlkLCB0eXBlOiBydHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjb3JkIGlkIGlzIG5vdCBmb3VuZCBpbiByZWNvcmQuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzb2JqZWN0VHlwZSA9IHR5cGUgfHwgYXR0cmlidXRlcz8udHlwZSB8fCBydHlwZTtcbiAgICAgIGlmICghc29iamVjdFR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTT2JqZWN0IFR5cGUgZGVmaW5lZCBpbiByZWNvcmQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGlkLCBhdHRyaWJ1dGVzOiB7IHR5cGU6IHNvYmplY3RUeXBlIH0sIC4uLnJlYyB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHVybCA9IFt0aGlzLl9iYXNlVXJsKCksICdjb21wb3NpdGUnLCAnc29iamVjdHMnXS5qb2luKCcvJyk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICB1cmwsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGFsbE9yTm9uZTogb3B0aW9ucy5hbGxPck5vbmUgfHwgZmFsc2UsXG4gICAgICAgIHJlY29yZHM6IF9yZWNvcmRzLFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihvcHRpb25zLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcmVjb3Jkc1xuICAgKi9cbiAgdXBzZXJ0PFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgSW5wdXRSZWNvcmQgZXh0ZW5kcyBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4gPSBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4sXG4gICAgRmllbGROYW1lcyBleHRlbmRzIFNPYmplY3RGaWVsZE5hbWVzPFMsIE4+ID0gU09iamVjdEZpZWxkTmFtZXM8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IElucHV0UmVjb3JkW10sXG4gICAgZXh0SWRGaWVsZDogRmllbGROYW1lcyxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHRbXT47XG4gIHVwc2VydDxcbiAgICBOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+LFxuICAgIElucHV0UmVjb3JkIGV4dGVuZHMgU09iamVjdElucHV0UmVjb3JkPFMsIE4+ID0gU09iamVjdElucHV0UmVjb3JkPFMsIE4+LFxuICAgIEZpZWxkTmFtZXMgZXh0ZW5kcyBTT2JqZWN0RmllbGROYW1lczxTLCBOPiA9IFNPYmplY3RGaWVsZE5hbWVzPFMsIE4+XG4gID4oXG4gICAgdHlwZTogTixcbiAgICByZWNvcmQ6IElucHV0UmVjb3JkLFxuICAgIGV4dElkRmllbGQ6IEZpZWxkTmFtZXMsXG4gICAgb3B0aW9ucz86IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PjtcbiAgdXBzZXJ0PFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgSW5wdXRSZWNvcmQgZXh0ZW5kcyBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4gPSBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4sXG4gICAgRmllbGROYW1lcyBleHRlbmRzIFNPYmplY3RGaWVsZE5hbWVzPFMsIE4+ID0gU09iamVjdEZpZWxkTmFtZXM8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IElucHV0UmVjb3JkIHwgSW5wdXRSZWNvcmRbXSxcbiAgICBleHRJZEZpZWxkOiBGaWVsZE5hbWVzLFxuICAgIG9wdGlvbnM/OiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdCB8IFVwc2VydFJlc3VsdFtdPjtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByZWNvcmRzXG4gICAqIEBwYXJhbSBleHRJZEZpZWxkXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBhc3luYyB1cHNlcnQoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdLFxuICAgIGV4dElkRmllbGQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBEbWxPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdCB8IFNhdmVSZXN1bHRbXT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlY29yZHMpXG4gICAgPyAvLyBjaGVjayB0aGUgdmVyc2lvbiB3aGV0aGVyIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgaXMgc3VwcG9ydGVkICg0Ni4wKVxuICAgICAgdGhpcy5fZW5zdXJlVmVyc2lvbig0NilcbiAgICAgID8gdGhpcy5fdXBzZXJ0TWFueSh0eXBlLCByZWNvcmRzLCBleHRJZEZpZWxkLCBvcHRpb25zKVxuICAgICAgOiB0aGlzLl91cHNlcnRQYXJhbGxlbCh0eXBlLCByZWNvcmRzLCBleHRJZEZpZWxkLCBvcHRpb25zKVxuICAgIDogdGhpcy5fdXBzZXJ0UGFyYWxsZWwodHlwZSwgcmVjb3JkcywgZXh0SWRGaWVsZCwgb3B0aW9ucyk7XG59XG5cbi8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfdXBzZXJ0TWFueShcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcmVjb3JkczogUmVjb3JkIHwgUmVjb3JkW10sXG4gICAgZXh0SWRGaWVsZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IE1BWF9ETUxfQ09VTlQgJiYgb3B0aW9ucy5hbGxvd1JlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uKChhd2FpdCB0aGlzLl91cHNlcnRNYW55KFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVjb3Jkcy5zbGljZSgwLCBNQVhfRE1MX0NPVU5UKSxcbiAgICAgICAgICBleHRJZEZpZWxkLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICkpIGFzIFNhdmVSZXN1bHRbXSksXG4gICAgICAgIC4uLigoYXdhaXQgdGhpcy5fdXBzZXJ0TWFueSh0eXBlLCByZWNvcmRzLnNsaWNlKE1BWF9ETUxfQ09VTlQpLCBleHRJZEZpZWxkLCBvcHRpb25zKSkgYXMgU2F2ZVJlc3VsdFtdKSxcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IF9yZWNvcmRzID0gcmVjb3Jkcy5tYXAoKHJlY29yZEl0ZW06IFJlY29yZCkgPT4ge1xuICAgICAgY29uc3QgeyBbZXh0SWRGaWVsZF06IGV4dElkLCB0eXBlOiByZWNvcmRUeXBlLCBhdHRyaWJ1dGVzLCAuLi5yZWMgfSA9IHJlY29yZEl0ZW07XG4gICAgICBjb25zdCBzb2JqZWN0VHlwZSA9IHJlY29yZFR5cGUgfHwgYXR0cmlidXRlcz8udHlwZSB8fCB0eXBlO1xuICAgICAgaWYgKCFleHRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4dGVybmFsIElEIGlzIG5vdCBmb3VuZCBpbiByZWNvcmQuJyk7XG4gICAgICB9IFxuICAgICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNPYmplY3QgVHlwZSBkZWZpbmVkIGluIHJlY29yZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgW2V4dElkRmllbGRdOiBleHRJZCwgYXR0cmlidXRlczogeyB0eXBlOiBzb2JqZWN0VHlwZSB9LCAuLi5yZWMgfTtcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgW3RoaXMuX2Jhc2VVcmwoKSwgJ2NvbXBvc2l0ZScsICdzb2JqZWN0cycsIHR5cGUsIGV4dElkRmllbGRdLmpvaW4oJy8nKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIHVybCxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYWxsT3JOb25lOiBvcHRpb25zLmFsbE9yTm9uZSB8fCBmYWxzZSxcbiAgICAgICAgcmVjb3JkczogX3JlY29yZHMsXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF91cHNlcnRQYXJhbGxlbChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcmVjb3JkczogUmVjb3JkIHwgUmVjb3JkW10sXG4gICAgZXh0SWRGaWVsZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocmVjb3Jkcyk7XG4gICAgY29uc3QgX3JlY29yZHMgPSBBcnJheS5pc0FycmF5KHJlY29yZHMpID8gcmVjb3JkcyA6IFtyZWNvcmRzXTtcbiAgICBpZiAoX3JlY29yZHMubGVuZ3RoID4gdGhpcy5fbWF4UmVxdWVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlZWRlZCBtYXggbGltaXQgb2YgY29uY3VycmVudCBjYWxsJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIF9yZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgW2V4dElkRmllbGRdOiBleHRJZCwgdHlwZTogcnR5cGUsIGF0dHJpYnV0ZXMsIC4uLnJlYyB9ID0gcmVjb3JkO1xuICAgICAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlLCBleHRJZEZpZWxkLCBleHRJZF0uam9pbihcbiAgICAgICAgICAnLycsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8U2F2ZVJlc3VsdD4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVjKSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbm9Db250ZW50UmVzcG9uc2U6IHsgc3VjY2VzczogdHJ1ZSwgZXJyb3JzOiBbXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIC8vIEJlIGF3YXJlIHRoYXQgYGFsbE9yTm9uZWAgb3B0aW9uIGluIHVwc2VydCBtZXRob2RcbiAgICAgICAgICAvLyB3aWxsIG5vdCByZXZlcnQgdGhlIG90aGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdHMuXG4gICAgICAgICAgLy8gSXQgb25seSByYWlzZXMgZXJyb3Igd2hlbiBtZXQgYXQgbGVhc3Qgb25lIGZhaWxlZCByZXF1ZXN0LlxuICAgICAgICAgIGlmICghaXNBcnJheSB8fCBvcHRpb25zLmFsbE9yTm9uZSB8fCAhZXJyLmVycm9yQ29kZSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdG9TYXZlUmVzdWx0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gaXNBcnJheSA/IHJlc3VsdHMgOiByZXN1bHRzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSByZWNvcmRzXG4gICAqL1xuICBkZXN0cm95PE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICBkZXN0cm95PE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgZGVzdHJveTxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+PihcbiAgICB0eXBlOiBOLFxuICAgIGlkczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdCB8IFNhdmVSZXN1bHRbXT47XG4gIC8qKlxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiBAcGFyYW0gaWRzXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBhc3luYyBkZXN0cm95KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaWRzKVxuICAgICAgPyAvLyBjaGVjayB0aGUgdmVyc2lvbiB3aGV0aGVyIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgaXMgc3VwcG9ydGVkICg0Mi4wKVxuICAgICAgICB0aGlzLl9lbnN1cmVWZXJzaW9uKDQyKVxuICAgICAgICA/IHRoaXMuX2Rlc3Ryb3lNYW55KHR5cGUsIGlkcywgb3B0aW9ucylcbiAgICAgICAgOiB0aGlzLl9kZXN0cm95UGFyYWxsZWwodHlwZSwgaWRzLCBvcHRpb25zKVxuICAgICAgOiB0aGlzLl9kZXN0cm95U2luZ2xlKHR5cGUsIGlkcywgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX2Rlc3Ryb3lTaW5nbGUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0PiB7XG4gICAgY29uc3QgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgdHlwZSwgaWRdLmpvaW4oJy8nKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB1cmwsXG4gICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB7fSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5vQ29udGVudFJlc3BvbnNlOiB7IGlkLCBzdWNjZXNzOiB0cnVlLCBlcnJvcnM6IFtdIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX2Rlc3Ryb3lQYXJhbGxlbCh0eXBlOiBzdHJpbmcsIGlkczogc3RyaW5nW10sIG9wdGlvbnM6IERtbE9wdGlvbnMpIHtcbiAgICBpZiAoaWRzLmxlbmd0aCA+IHRoaXMuX21heFJlcXVlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZWVkZWQgbWF4IGxpbWl0IG9mIGNvbmN1cnJlbnQgY2FsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZHMubWFwKChpZCkgPT5cbiAgICAgICAgdGhpcy5fZGVzdHJveVNpbmdsZSh0eXBlLCBpZCwgb3B0aW9ucykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIC8vIEJlIGF3YXJlIHRoYXQgYGFsbE9yTm9uZWAgb3B0aW9uIGluIHBhcmFsbGVsIG1vZGVcbiAgICAgICAgICAvLyB3aWxsIG5vdCByZXZlcnQgdGhlIG90aGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdHMuXG4gICAgICAgICAgLy8gSXQgb25seSByYWlzZXMgZXJyb3Igd2hlbiBtZXQgYXQgbGVhc3Qgb25lIGZhaWxlZCByZXF1ZXN0LlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbE9yTm9uZSB8fCAhZXJyLmVycm9yQ29kZSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdG9TYXZlUmVzdWx0KGVycik7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF9kZXN0cm95TWFueShcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zOiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHRbXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChpZHMubGVuZ3RoID4gTUFYX0RNTF9DT1VOVCAmJiBvcHRpb25zLmFsbG93UmVjdXJzaXZlKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICAuLi4oYXdhaXQgdGhpcy5fZGVzdHJveU1hbnkoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBpZHMuc2xpY2UoMCwgTUFYX0RNTF9DT1VOVCksXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSksXG4gICAgICAgIC4uLihhd2FpdCB0aGlzLl9kZXN0cm95TWFueSh0eXBlLCBpZHMuc2xpY2UoTUFYX0RNTF9DT1VOVCksIG9wdGlvbnMpKSxcbiAgICAgIF07XG4gICAgfVxuICAgIGxldCB1cmwgPVxuICAgICAgW3RoaXMuX2Jhc2VVcmwoKSwgJ2NvbXBvc2l0ZScsICdzb2JqZWN0cz9pZHM9J10uam9pbignLycpICsgaWRzLmpvaW4oJywnKTtcbiAgICBpZiAob3B0aW9ucy5hbGxPck5vbmUpIHtcbiAgICAgIHVybCArPSAnJmFsbE9yTm9uZT10cnVlJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIHx8IHt9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bm9ueW0gb2YgQ29ubmVjdGlvbiNkZXN0cm95KClcbiAgICovXG4gIGRlbGV0ZSA9IHRoaXMuZGVzdHJveTtcblxuICAvKipcbiAgICogU3lub255bSBvZiBDb25uZWN0aW9uI2Rlc3Ryb3koKVxuICAgKi9cbiAgZGVsID0gdGhpcy5kZXN0cm95O1xuXG4gIC8qKlxuICAgKiBEZXNjcmliZSBTT2JqZWN0IG1ldGFkYXRhXG4gICAqL1xuICBhc3luYyBkZXNjcmliZSh0eXBlOiBzdHJpbmcpOiBQcm9taXNlPERlc2NyaWJlU09iamVjdFJlc3VsdD4ge1xuICAgIGNvbnN0IHVybCA9IFt0aGlzLl9iYXNlVXJsKCksICdzb2JqZWN0cycsIHR5cGUsICdkZXNjcmliZSddLmpvaW4oJy8nKTtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgRGVzY3JpYmVTT2JqZWN0UmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlIGdsb2JhbCBTT2JqZWN0c1xuICAgKi9cbiAgYXN5bmMgZGVzY3JpYmVHbG9iYWwoKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5fYmFzZVVybCgpfS9zb2JqZWN0c2A7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwpO1xuICAgIHJldHVybiBib2R5IGFzIERlc2NyaWJlR2xvYmFsUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTT2JqZWN0IGluc3RhbmNlXG4gICAqL1xuICBzb2JqZWN0PE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KHR5cGU6IHN0cmluZ3xOKTogU09iamVjdDxTLCBOPjtcbiAgc29iamVjdDxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+Pih0eXBlOiBOIHwgc3RyaW5nKTogU09iamVjdDxTLCBOPiB7XG4gICAgY29uc3Qgc28gPSB0aGlzLnNvYmplY3RzW3R5cGUgYXMgTl0gfHwgbmV3IFNPYmplY3QodGhpcywgdHlwZSBhcyBOKTtcbiAgICB0aGlzLnNvYmplY3RzW3R5cGUgYXMgTl0gPSBzbztcbiAgICByZXR1cm4gc287XG4gIH1cblxuICAvKipcbiAgICogR2V0IGlkZW50aXR5IGluZm9ybWF0aW9uIG9mIGN1cnJlbnQgdXNlclxuICAgKi9cbiAgYXN5bmMgaWRlbnRpdHkob3B0aW9uczogeyBoZWFkZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHt9KSB7XG4gICAgbGV0IHVybCA9IHRoaXMudXNlckluZm8/LnVybDtcbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0PHsgaWRlbnRpdHk6IHN0cmluZyB9Pih7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHVybDogdGhpcy5fYmFzZVVybCgpLFxuICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgICB9KTtcbiAgICAgIHVybCA9IHJlcy5pZGVudGl0eTtcbiAgICB9XG4gICAgdXJsICs9ICc/Zm9ybWF0PWpzb24nO1xuICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICB1cmwgKz0gYCZvYXV0aF90b2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFjY2Vzc1Rva2VuKX1gO1xuICAgIH1cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8SWRlbnRpdHlJbmZvPih7IG1ldGhvZDogJ0dFVCcsIHVybCB9KTtcbiAgICB0aGlzLnVzZXJJbmZvID0ge1xuICAgICAgaWQ6IHJlcy51c2VyX2lkLFxuICAgICAgb3JnYW5pemF0aW9uSWQ6IHJlcy5vcmdhbml6YXRpb25faWQsXG4gICAgICB1cmw6IHJlcy5pZCxcbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCByZWNlbnRseSB2aWV3ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVjZW50KHR5cGU/OiBzdHJpbmcgfCBudW1iZXIsIGxpbWl0PzogbnVtYmVyKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBsaW1pdCA9IHR5cGU7XG4gICAgICB0eXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdXJsO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlXS5qb2luKCcvJyk7XG4gICAgICBjb25zdCB7IHJlY2VudEl0ZW1zIH0gPSBhd2FpdCB0aGlzLnJlcXVlc3Q8eyByZWNlbnRJdGVtczogUmVjb3JkW10gfT4oXG4gICAgICAgIHVybCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbGltaXQgPyByZWNlbnRJdGVtcy5zbGljZSgwLCBsaW1pdCkgOiByZWNlbnRJdGVtcztcbiAgICB9XG4gICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybCgpfS9yZWNlbnRgO1xuICAgIGlmIChsaW1pdCkge1xuICAgICAgdXJsICs9IGA/bGltaXQ9JHtsaW1pdH1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFJlY29yZFtdPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlZChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgc3RhcnQ6IHN0cmluZyB8IERhdGUsXG4gICAgZW5kOiBzdHJpbmcgfCBEYXRlLFxuICApOiBQcm9taXNlPFVwZGF0ZWRSZXN1bHQ+IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgIGxldCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlLCAndXBkYXRlZCddLmpvaW4oJy8nKTtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgc3RhcnQgPSBuZXcgRGF0ZShzdGFydCk7XG4gICAgfVxuICAgIHN0YXJ0ID0gZm9ybWF0RGF0ZShzdGFydCk7XG4gICAgdXJsICs9IGA/c3RhcnQ9JHtlbmNvZGVVUklDb21wb25lbnQoc3RhcnQpfWA7XG4gICAgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmQgPSBuZXcgRGF0ZShlbmQpO1xuICAgIH1cbiAgICBlbmQgPSBmb3JtYXREYXRlKGVuZCk7XG4gICAgdXJsICs9IGAmZW5kPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGVuZCl9YDtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgVXBkYXRlZFJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZWQoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHN0YXJ0OiBzdHJpbmcgfCBEYXRlLFxuICAgIGVuZDogc3RyaW5nIHwgRGF0ZSxcbiAgKTogUHJvbWlzZTxEZWxldGVkUmVzdWx0PiB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICBsZXQgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgdHlwZSwgJ2RlbGV0ZWQnXS5qb2luKCcvJyk7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN0YXJ0ID0gbmV3IERhdGUoc3RhcnQpO1xuICAgIH1cbiAgICBzdGFydCA9IGZvcm1hdERhdGUoc3RhcnQpO1xuICAgIHVybCArPSBgP3N0YXJ0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHN0YXJ0KX1gO1xuXG4gICAgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmQgPSBuZXcgRGF0ZShlbmQpO1xuICAgIH1cbiAgICBlbmQgPSBmb3JtYXREYXRlKGVuZCk7XG4gICAgdXJsICs9IGAmZW5kPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGVuZCl9YDtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgRGVsZXRlZFJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGFic1xuICAgKi9cbiAgYXN5bmMgdGFicygpOiBQcm9taXNlPERlc2NyaWJlVGFiW10+IHtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAndGFicyddLmpvaW4oJy8nKTtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgRGVzY3JpYmVUYWJbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnQgc3lzdGVtIGxpbWl0IGluIHRoZSBvcmdhbml6YXRpb25cbiAgICovXG4gIGFzeW5jIGxpbWl0cygpOiBQcm9taXNlPE9yZ2FuaXphdGlvbkxpbWl0c0luZm8+IHtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnbGltaXRzJ10uam9pbignLycpO1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB0aGlzLnJlcXVlc3QodXJsKTtcbiAgICByZXR1cm4gYm9keSBhcyBPcmdhbml6YXRpb25MaW1pdHNJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB0aGVtZSBpbmZvXG4gICAqL1xuICBhc3luYyB0aGVtZSgpOiBQcm9taXNlPERlc2NyaWJlVGhlbWU+IHtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAndGhlbWUnXS5qb2luKCcvJyk7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwpO1xuICAgIHJldHVybiBib2R5IGFzIERlc2NyaWJlVGhlbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCBnbG9iYWwgcXVpY2sgYWN0aW9uc1xuICAgKi9cbiAgYXN5bmMgcXVpY2tBY3Rpb25zKCk6IFByb21pc2U8RGVzY3JpYmVRdWlja0FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucmVxdWVzdCgnL3F1aWNrQWN0aW9ucycpO1xuICAgIHJldHVybiBib2R5IGFzIERlc2NyaWJlUXVpY2tBY3Rpb25SZXN1bHRbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVmZXJlbmNlIGZvciBzcGVjaWZpZWQgZ2xvYmFsIHF1aWNrIGFjdGlvblxuICAgKi9cbiAgcXVpY2tBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nKTogUXVpY2tBY3Rpb248Uz4ge1xuICAgIHJldHVybiBuZXcgUXVpY2tBY3Rpb24odGhpcywgYC9xdWlja0FjdGlvbnMvJHthY3Rpb25OYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZHVsZSB3aGljaCBtYW5hZ2VzIHByb2Nlc3MgcnVsZXMgYW5kIGFwcHJvdmFsIHByb2Nlc3Nlc1xuICAgKi9cbiAgcHJvY2VzcyA9IG5ldyBQcm9jZXNzKHRoaXMpO1xuXG4gIHByaXZhdGUgaXNMaWdodG5pbmdJbnN0YW5jZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pbnN0YW5jZVVybC5pbmNsdWRlcygnLmxpZ2h0bmluZy5mb3JjZS5jb20nKSB8fFxuICAgICAgdGhpcy5pbnN0YW5jZVVybC5pbmNsdWRlcygnLmxpZ2h0bmluZy5jcm1mb3JjZS5taWwnKSB8fFxuICAgICAgdGhpcy5pbnN0YW5jZVVybC5pbmNsdWRlcygnLmxpZ2h0bmluZy5zZmNybWFwcHMuY24nKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29ubmVjdGlvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsWUFBWSxRQUFRLFFBQVE7QUFDckMsT0FBT0MsT0FBTyxNQUFNLFdBQVc7QUFnQy9CLE9BQU9DLFNBQVMsSUFDZEMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixRQUNiLGFBQWE7QUFDcEIsU0FBaUJDLFNBQVMsUUFBUSxlQUFlO0FBRWpELE9BQU9DLE1BQU0sTUFBeUIsVUFBVTtBQUVoRCxPQUFPQyxLQUFLLE1BQTBCLFNBQVM7QUFDL0MsT0FBT0MsT0FBTyxNQUFNLFlBQVk7QUFDaEMsT0FBT0Msc0JBQXNCLE1BRXRCLDRCQUE0QjtBQUNuQyxPQUFPQyxLQUFLLE1BQU0sU0FBUztBQUUzQixPQUFPQyxPQUFPLE1BQU0sV0FBVztBQUMvQixPQUFPQyxXQUFXLE1BQU0sZ0JBQWdCO0FBQ3hDLE9BQU9DLE9BQU8sTUFBTSxXQUFXO0FBQy9CLFNBQVNDLFVBQVUsUUFBUSxrQkFBa0I7QUFVN0MsT0FBT0MsUUFBUSxNQUFNLFdBQVc7O0FBRWhDO0FBQ0E7QUFDQTs7QUE2QkE7QUFDQTtBQUNBO0FBQ0EsSUFBTUMsdUJBTUwsR0FBRztFQUNGQyxRQUFRLEVBQUUsOEJBQThCO0VBQ3hDQyxXQUFXLEVBQUUsRUFBRTtFQUNmQyxP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