UNPKG

use-stomp

Version:

react provider, class decorator, and a hook for websockets using the stomp protocol

404 lines (324 loc) 53.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); require("core-js/modules/es.array.concat"); require("core-js/modules/es.array.filter"); require("core-js/modules/es.array.for-each"); require("core-js/modules/es.array.iterator"); require("core-js/modules/es.map"); require("core-js/modules/es.object.get-own-property-descriptor"); require("core-js/modules/es.object.to-string"); require("core-js/modules/es.set"); require("core-js/modules/es.string.iterator"); require("core-js/modules/web.dom-collections.for-each"); require("core-js/modules/web.dom-collections.iterator"); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _sockjsClient = _interopRequireDefault(require("sockjs-client")); var _uuid = require("uuid"); var _stomp = _interopRequireDefault(require("./stomp")); var _webSocketConfigs = require("./webSocketConfigs"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var _self = self; var ctx = { WEBSOCKET: null, WEBSOCKET_AUTH_HEADER: '', WEBSOCKET_CONNECTION: _webSocketConfigs.States.DISCONNECTED, WEBSOCKET_HEADER: '', WEBSOCKET_EXPLICIT_DISCONNECT: false, WEBSOCKET_URL: '', WEBSOCKET_STATE: {}, WEBSOCKET_PORTS: new Map(), WEBSOCKET_CHANNELS: new Map(), WEBSOCKET_RECONNECT_COUNT: 0, WEBSOCKET_RECONNECT_INTERVAL: null, WEBSOCKET_RECONNECT_INTERVAL_MS: 10000, WEBSOCKET_RECONNECT_MAX_ATTEMPTS: 10, WEBSOCKET_SUBSCRIPTIONS: new Map(), WEBSOCKET_VISIBLE_TABS: new Set() }; function packageMessage(message) { try { return (0, _typeof2.default)(message) === 'object' && message !== null ? JSON.stringify(message) : message; } catch (e) { return message; } } function parseMessage(message) { try { var parsed = JSON.parse(message); return (0, _typeof2.default)(parsed) === 'object' && parsed !== null && parsed.content ? parsed.content : parsed; } catch (e) { return message; } } var broadcast = function broadcast(type, payload) { ctx.WEBSOCKET_PORTS.forEach(function (port, id) { emit(id, type, payload); }); }; var emit = function emit(id, type, payload) { var onlyVisible = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; if (ctx.WEBSOCKET_PORTS.has(id)) { // if (!onlyVisible || ctx.WEBSOCKET_VISIBLE_TABS.has(id)) { ctx.WEBSOCKET_PORTS.get(id).postMessage({ type: type, payload: payload }); } }; var onConnected = function onConnected() { console.log('[use-stomp::ws::connected]'); resubscribeAll(); setState(_webSocketConfigs.States.CONNECTED); }; var onChannelMessage = function onChannelMessage(channel) { return function (msg) { var message = parseMessage(msg.body); if ((message === null || message === void 0 ? void 0 : message.status) === 'END') { disconnect(); } else { // if (isAnyTabVisible()) { ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel).forEach(function (id) { emit(id, _webSocketConfigs.Events.MESSAGE, { channel: channel, message: message }); }); // } else { // } } }; }; var onChannelMessageSync = function onChannelMessageSync(channel) { return function (msg) { var message = parseMessage(msg.body); if ((message === null || message === void 0 ? void 0 : message.status) === 'END') { disconnect(); } else { ctx.WEBSOCKET_STATE[channel] = [].concat((0, _toConsumableArray2.default)(ctx.WEBSOCKET_STATE[channel] || []), [{ id: (0, _uuid.v4)(), message: message }]); (ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel) || []).forEach(function (id) { emit(id, _webSocketConfigs.Events.MESSAGE, { channel: channel, message: ctx.WEBSOCKET_STATE[channel] }); }); } }; }; var onDismissSync = function onDismissSync(e) { ctx.WEBSOCKET_STATE[e.data.payload.channel] = ctx.WEBSOCKET_STATE[e.data.payload.channel].filter(function (message) { return message.id !== e.data.payload.id; }); (ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel) || []).forEach(function (id) { emit(id, _webSocketConfigs.Events.MESSAGE, { channel: e.data.payload.channel, message: ctx.WEBSOCKET_STATE[e.data.payload.channel] }); }); }; var onDisconnected = function onDisconnected() { console.log('[use-stomp::ws::disconnected]'); setState(_webSocketConfigs.States.DISCONNECTED); if (!ctx.WEBSOCKET_EXPLICIT_DISCONNECT && !ctx.WEBSOCKET_RECONNECT_INTERVAL && !ctx.WEBSOCKET_RECONNECT_COUNT) { ctx.WEBSOCKET_RECONNECT_COUNT = 1; var maxAttempts = ctx.WEBSOCKET_RECONNECT_MAX_ATTEMPTS; var reconnect = function reconnect() { console.log('[use-stomp::ws::reconnecting]', "".concat(ctx.WEBSOCKET_RECONNECT_COUNT, " / ").concat(maxAttempts)); var hasMaxAttempts = ctx.WEBSOCKET_RECONNECT_COUNT > maxAttempts; var canTerminate = isConnected() || hasMaxAttempts; if (canTerminate) { console.log('[use-stomp::ws::reconnected]'); clearInterval(ctx.WEBSOCKET_RECONNECT_INTERVAL); ctx.WEBSOCKET_RECONNECT_COUNT = 0; ctx.WEBSOCKET_RECONNECT_INTERVAL = null; } else if (!isConnecting() && !isConnected() && !hasMaxAttempts) { ctx.WEBSOCKET_RECONNECT_COUNT = ctx.WEBSOCKET_RECONNECT_COUNT + 1; connect(); } }; ctx.WEBSOCKET_RECONNECT_INTERVAL = setInterval(reconnect, ctx.WEBSOCKET_RECONNECT_INTERVAL_MS); reconnect(); } }; var onError = function onError(e) { broadcast(_webSocketConfigs.Events.ERROR, e); }; var isConnected = function isConnected() { return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.CONNECTED; }; var isConnecting = function isConnecting() { return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.CONNECTING; }; var isDisconnected = function isDisconnected() { return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.DISCONNECTED; }; var isDisconnecting = function isDisconnecting() { return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.DISCONNECTING; }; var isAnyTabVisible = function isAnyTabVisible() { return ctx.WEBSOCKET_VISIBLE_TABS.size > 0; }; var connect = function connect() { if (isConnecting() || isConnected() || isDisconnecting()) { return; } disconnect(); setState(_webSocketConfigs.States.CONNECTING); ctx.WEBSOCKET = _stomp.default.over(new _sockjsClient.default(ctx.WEBSOCKET_URL, null, {})); ctx.WEBSOCKET.connect(ctx.WEBSOCKET_AUTH_HEADER ? { Authorization: ctx.WEBSOCKET_AUTH_HEADER } : ctx.WEBSOCKET_HEADER, onConnected, onDisconnected, onError); }; var disconnect = function disconnect() { if (isDisconnecting() || isDisconnected()) { return; } ctx.WEBSOCKET_EXPLICIT_DISCONNECT = true; setState(_webSocketConfigs.States.DISCONNECTING); unsubscribeAll(); if (ctx.WEBSOCKET) { ctx.WEBSOCKET.disconnect(function () { ctx.WEBSOCKET_EXPLICIT_DISCONNECT = false; }); } setState(_webSocketConfigs.States.DISCONNECTED); }; var testDisconnect = function testDisconnect() { if (isConnected() && !(isDisconnected() || isDisconnecting())) { setState(_webSocketConfigs.States.DISCONNECTING); unsubscribeAll(); if (ctx.WEBSOCKET) { ctx.WEBSOCKET.disconnect(); } setState(_webSocketConfigs.States.DISCONNECTED); } }; var resubscribeAll = function resubscribeAll() { var _ctx$WEBSOCKET, _ctx$WEBSOCKET2; if ((_ctx$WEBSOCKET = ctx.WEBSOCKET) !== null && _ctx$WEBSOCKET !== void 0 && _ctx$WEBSOCKET.subscribe && (_ctx$WEBSOCKET2 = ctx.WEBSOCKET) !== null && _ctx$WEBSOCKET2 !== void 0 && _ctx$WEBSOCKET2.connected && isConnected()) { ctx.WEBSOCKET_CHANNELS.forEach(function (subscription, channel) { ctx.WEBSOCKET_CHANNELS.set(channel, ctx.WEBSOCKET.subscribe(channel, onChannelMessage(channel))); }); } }; var subscribe = function subscribe(e) { if (isConnected() && !ctx.WEBSOCKET_CHANNELS.has(e.data.payload.channel)) { ctx.WEBSOCKET_CHANNELS.set(e.data.payload.channel, ctx.WEBSOCKET.subscribe(e.data.payload.channel, onChannelMessage(e.data.payload.channel))); } // if channel has no subscriptions, set it as an array and add id if (!ctx.WEBSOCKET_SUBSCRIPTIONS.has(e.data.payload.channel)) { ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [e.data.payload.id]); } else { // if channel does exist, update the ids to include id ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [].concat((0, _toConsumableArray2.default)(ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel)), [e.data.payload.id])); } }; var subscribeSync = function subscribeSync(e) { if (isConnected() && !ctx.WEBSOCKET_CHANNELS.has(e.data.payload.channel)) { ctx.WEBSOCKET_CHANNELS.set(e.data.payload.channel, ctx.WEBSOCKET.subscribe(e.data.payload.channel, onChannelMessageSync(e.data.payload.channel))); } // if channel has no subscriptions, set it as an array and add id if (!ctx.WEBSOCKET_SUBSCRIPTIONS.has(e.data.payload.channel)) { ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [e.data.payload.id]); } else { // if channel does exist, update the ids to include id ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [].concat((0, _toConsumableArray2.default)(ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel)), [e.data.payload.id])); } }; var sendMessage = function sendMessage(e) { if (ctx.WEBSOCKET && isConnected()) { ctx.WEBSOCKET.send(e.data.payload.channel, null, packageMessage(e.data.payload.message)); } }; var setAuthHeader = function setAuthHeader(e) { ctx.WEBSOCKET_AUTH_HEADER = e.data.payload; }; var setHeader = function setHeader(e) { ctx.WEBSOCKET_HEADER = e.data.payload; }; var setUrl = function setUrl(e) { ctx.WEBSOCKET_URL = e.data.payload; }; var setVisibility = function setVisibility(e) { var visible = e.data.payload.visibility; var current = ctx.WEBSOCKET_VISIBLE_TABS.has(e.data.payload.id); if (visible && !current) { ctx.WEBSOCKET_VISIBLE_TABS.add(e.data.payload.id); } if (!visible && current) { ctx.WEBSOCKET_VISIBLE_TABS.delete(e.data.payload.id); } }; var setState = function setState(state) { ctx.WEBSOCKET_CONNECTION = state; broadcast(_webSocketConfigs.Events.CONNECTION, ctx.WEBSOCKET_CONNECTION); }; var unregister = function unregister(e) { ctx.WEBSOCKET_PORTS.delete(e.data.payload.id); ctx.WEBSOCKET_VISIBLE_TABS.delete(e.data.payload.id); ctx.WEBSOCKET_SUBSCRIPTIONS.forEach(function (ids, channel) { unsubscribe(_objectSpread(_objectSpread({}, e), {}, { data: { payload: _objectSpread(_objectSpread({}, e.data.payload), {}, { channel: channel }) } })); }); }; var unsubscribe = function unsubscribe(e) { var uuid = e.data.payload.id; var channel = e.data.payload.channel; if (ctx.WEBSOCKET_SUBSCRIPTIONS.has(channel)) { var ids = ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel).filter(function (name, callable) { callable.displayName = name; Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, { value: name })); return callable; }("ids", function (id) { return id !== uuid; })); if (!ids.length) { ctx.WEBSOCKET_SUBSCRIPTIONS.delete(channel); ctx.WEBSOCKET_CHANNELS.get(channel).unsubscribe(); ctx.WEBSOCKET_CHANNELS.delete(channel); } else { ctx.WEBSOCKET_SUBSCRIPTIONS.set(channel, ids); } } }; var unsubscribeAll = function unsubscribeAll() { ctx.WEBSOCKET_CHANNELS.forEach(function (subscription, channel) { subscription.unsubscribe(); ctx.WEBSOCKET_CHANNELS.delete(channel); ctx.WEBSOCKET_SUBSCRIPTIONS.delete(channel); }); }; _self.addEventListener('connect', function (e) { var port = e.ports[0]; var register = function register(e) { ctx.WEBSOCKET_PORTS.set(e.data.payload.id, port); ctx.WEBSOCKET_RECONNECT_INTERVAL_MS = e.data.payload.reconnectInterval; ctx.WEBSOCKET_RECONNECT_MAX_ATTEMPTS = e.data.payload.reconnectMaxAttempts; if (e.data.payload.visible) { ctx.WEBSOCKET_VISIBLE_TABS.add(e.data.payload.id); } }; port.addEventListener('message', function (e) { var _messageBroker; var messageBroker = (_messageBroker = {}, (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.CONNECT, connect), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.DISMISS_SYNC, onDismissSync), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.DISCONNECT, disconnect), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.REGISTER, register), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SEND_MESSAGE, sendMessage), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_AUTH_HEADER, setAuthHeader), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_HEADER, setHeader), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_URL, setUrl), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_VISIBILITY, setVisibility), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SUBSCRIBE, subscribe), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SUBSCRIBE_SYNC, subscribeSync), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.TEST_DISCONNECT, testDisconnect), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.UNREGISTER, unregister), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.UNSUBSCRIBE, unsubscribe), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.UNSUBSCRIBE_SYNC, unsubscribe), _messageBroker); if (messageBroker[e.data.type]) { messageBroker[e.data.type](e); } }); port.start(); console.log('[use-stomp::port::connected]'); port.postMessage({ type: _webSocketConfigs.Events.CONNECTION, payload: ctx.WEBSOCKET_CONNECTION }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJTb2NrZXRXb3JrZXJJbnN0YW5jZS50cyJdLCJuYW1lcyI6WyJfc2VsZiIsInNlbGYiLCJjdHgiLCJXRUJTT0NLRVQiLCJXRUJTT0NLRVRfQVVUSF9IRUFERVIiLCJXRUJTT0NLRVRfQ09OTkVDVElPTiIsIlN0YXRlcyIsIkRJU0NPTk5FQ1RFRCIsIldFQlNPQ0tFVF9IRUFERVIiLCJXRUJTT0NLRVRfRVhQTElDSVRfRElTQ09OTkVDVCIsIldFQlNPQ0tFVF9VUkwiLCJXRUJTT0NLRVRfU1RBVEUiLCJXRUJTT0NLRVRfUE9SVFMiLCJNYXAiLCJXRUJTT0NLRVRfQ0hBTk5FTFMiLCJXRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UIiwiV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCIsIldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUxfTVMiLCJXRUJTT0NLRVRfUkVDT05ORUNUX01BWF9BVFRFTVBUUyIsIldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TIiwiV0VCU09DS0VUX1ZJU0lCTEVfVEFCUyIsIlNldCIsInBhY2thZ2VNZXNzYWdlIiwibWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwicGFyc2VNZXNzYWdlIiwicGFyc2VkIiwicGFyc2UiLCJjb250ZW50IiwiYnJvYWRjYXN0IiwidHlwZSIsInBheWxvYWQiLCJmb3JFYWNoIiwicG9ydCIsImlkIiwiZW1pdCIsIm9ubHlWaXNpYmxlIiwiaGFzIiwiZ2V0IiwicG9zdE1lc3NhZ2UiLCJvbkNvbm5lY3RlZCIsImNvbnNvbGUiLCJsb2ciLCJyZXN1YnNjcmliZUFsbCIsInNldFN0YXRlIiwiQ09OTkVDVEVEIiwib25DaGFubmVsTWVzc2FnZSIsImNoYW5uZWwiLCJtc2ciLCJib2R5Iiwic3RhdHVzIiwiZGlzY29ubmVjdCIsIkV2ZW50cyIsIk1FU1NBR0UiLCJvbkNoYW5uZWxNZXNzYWdlU3luYyIsIm9uRGlzbWlzc1N5bmMiLCJkYXRhIiwiZmlsdGVyIiwib25EaXNjb25uZWN0ZWQiLCJtYXhBdHRlbXB0cyIsInJlY29ubmVjdCIsImhhc01heEF0dGVtcHRzIiwiY2FuVGVybWluYXRlIiwiaXNDb25uZWN0ZWQiLCJjbGVhckludGVydmFsIiwiaXNDb25uZWN0aW5nIiwiY29ubmVjdCIsInNldEludGVydmFsIiwib25FcnJvciIsIkVSUk9SIiwiQ09OTkVDVElORyIsImlzRGlzY29ubmVjdGVkIiwiaXNEaXNjb25uZWN0aW5nIiwiRElTQ09OTkVDVElORyIsImlzQW55VGFiVmlzaWJsZSIsInNpemUiLCJTdG9tcCIsIm92ZXIiLCJTb2NrSlMiLCJBdXRob3JpemF0aW9uIiwidW5zdWJzY3JpYmVBbGwiLCJ0ZXN0RGlzY29ubmVjdCIsInN1YnNjcmliZSIsImNvbm5lY3RlZCIsInN1YnNjcmlwdGlvbiIsInNldCIsInN1YnNjcmliZVN5bmMiLCJzZW5kTWVzc2FnZSIsInNlbmQiLCJzZXRBdXRoSGVhZGVyIiwic2V0SGVhZGVyIiwic2V0VXJsIiwic2V0VmlzaWJpbGl0eSIsInZpc2libGUiLCJ2aXNpYmlsaXR5IiwiY3VycmVudCIsImFkZCIsImRlbGV0ZSIsInN0YXRlIiwiQ09OTkVDVElPTiIsInVucmVnaXN0ZXIiLCJpZHMiLCJ1bnN1YnNjcmliZSIsInV1aWQiLCJsZW5ndGgiLCJhZGRFdmVudExpc3RlbmVyIiwicG9ydHMiLCJyZWdpc3RlciIsInJlY29ubmVjdEludGVydmFsIiwicmVjb25uZWN0TWF4QXR0ZW1wdHMiLCJtZXNzYWdlQnJva2VyIiwiQ09OTkVDVCIsIkRJU01JU1NfU1lOQyIsIkRJU0NPTk5FQ1QiLCJSRUdJU1RFUiIsIlNFTkRfTUVTU0FHRSIsIlNFVF9BVVRIX0hFQURFUiIsIlNFVF9IRUFERVIiLCJTRVRfVVJMIiwiU0VUX1ZJU0lCSUxJVFkiLCJTVUJTQ1JJQkUiLCJTVUJTQ1JJQkVfU1lOQyIsIlRFU1RfRElTQ09OTkVDVCIsIlVOUkVHSVNURVIiLCJVTlNVQlNDUklCRSIsIlVOU1VCU0NSSUJFX1NZTkMiLCJzdGFydCJdLCJtYXBwaW5ncyI6Ijs7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OUQsVUFITixpREFJZEMseUJBQU84RCxRQUpPLEVBSUlQLFFBSkosaURBS2R2RCx5QkFBTytELFlBTE8sRUFLUTVCLFdBTFIsaURBTWRuQyx5QkFBT2dFLGVBTk8sRUFNVzNCLGFBTlgsaURBT2RyQyx5QkFBT2lFLFVBUE8sRUFPTTNCLFNBUE4saURBUWR0Qyx5QkFBT2tFLE9BUk8sRUFRRzNCLE1BUkgsaURBU2R2Qyx5QkFBT21FLGNBVE8sRUFTVTNCLGFBVFYsaURBVWR4Qyx5QkFBT29FLFNBVk8sRUFVS3RDLFNBVkwsaURBV2Q5Qix5QkFBT3FFLGNBWE8sRUFXVW5DLGFBWFYsaURBWWRsQyx5QkFBT3NFLGVBWk8sRUFZV3pDLGNBWlgsaURBYWQ3Qix5QkFBT3VFLFVBYk8sRUFhTXZCLFVBYk4saURBY2RoRCx5QkFBT3dFLFdBZE8sRUFjT3RCLFdBZFAsaURBZWRsRCx5QkFBT3lFLGdCQWZPLEVBZVl2QixXQWZaLGtCQUFuQjs7QUFrQkEsUUFBSVEsYUFBYSxDQUFDdEYsQ0FBQyxDQUFDZ0MsSUFBRixDQUFPMUIsSUFBUixDQUFqQixFQUFnQztBQUM1QmdGLE1BQUFBLGFBQWEsQ0FBQ3RGLENBQUMsQ0FBQ2dDLElBQUYsQ0FBTzFCLElBQVIsQ0FBYixDQUEyQk4sQ0FBM0I7QUFDSDtBQUNKLEdBdEJEO0FBd0JBUyxFQUFBQSxJQUFJLENBQUM2RixLQUFMO0FBRUFyRixFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSw4QkFBWjtBQUVBVCxFQUFBQSxJQUFJLENBQUNNLFdBQUwsQ0FBaUI7QUFDYlQsSUFBQUEsSUFBSSxFQUFFc0IseUJBQU8rQyxVQURBO0FBRWJwRSxJQUFBQSxPQUFPLEVBQUUvQixHQUFHLENBQUNHO0FBRkEsR0FBakI7QUFJSCxDQTlDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb2NrSlMgZnJvbSAnc29ja2pzLWNsaWVudCc7XG5pbXBvcnQgdHlwZSB7Q2xpZW50LCBTdWJzY3JpcHRpb259IGZyb20gJ3N0b21wanMnO1xuaW1wb3J0IHt2NH0gZnJvbSAndXVpZCc7XG5cbmltcG9ydCBTdG9tcCBmcm9tICcuL3N0b21wJztcbmltcG9ydCB7RXZlbnRzLCBTdGF0ZXN9IGZyb20gJy4vd2ViU29ja2V0Q29uZmlncyc7XG5cbnR5cGUgV0VCU09DS0VUX0NPTk5FQ1RJT04gPSB7XG4gICAgV0VCU09DS0VUOiBDbGllbnQ7XG4gICAgV0VCU09DS0VUX0FVVEhfSEVBREVSOiBzdHJpbmc7XG4gICAgV0VCU09DS0VUX0NPTk5FQ1RJT046IHN0cmluZztcbiAgICBXRUJTT0NLRVRfRVhQTElDSVRfRElTQ09OTkVDVDogYm9vbGVhbjtcbiAgICBXRUJTT0NLRVRfSEVBREVSOiBzdHJpbmc7XG4gICAgV0VCU09DS0VUX1VSTDogc3RyaW5nO1xuICAgIFdFQlNPQ0tFVF9TVEFURToge1xuICAgICAgICBbY2hhbm5lbDogc3RyaW5nXToge2lkOiBzdHJpbmc7IG1lc3NhZ2U6IGFueX1bXTtcbiAgICB9O1xuICAgIFdFQlNPQ0tFVF9QT1JUUzogTWFwPHN0cmluZywgTWVzc2FnZVBvcnQ+O1xuICAgIFdFQlNPQ0tFVF9DSEFOTkVMUzogTWFwPHN0cmluZywgU3Vic2NyaXB0aW9uPjtcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UOiBudW1iZXI7XG4gICAgV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTDogTm9kZUpTLlRpbWVyO1xuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUxfTVM6IG51bWJlcjtcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX01BWF9BVFRFTVBUUzogbnVtYmVyO1xuICAgIFdFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgV0VCU09DS0VUX1ZJU0lCTEVfVEFCUzogU2V0PHN0cmluZz47XG59O1xuXG5pbnRlcmZhY2UgU2hhcmVkV29ya2VyR2xvYmFsU2NvcGUge1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgbGlzdGVuZXI6IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkLFxuICAgICAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zXG4gICAgKTogdm9pZDtcbiAgICBvbmNvbm5lY3Q6IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkO1xuICAgIHdzOiBDbGllbnQ7XG59XG5cbmNvbnN0IF9zZWxmOiBTaGFyZWRXb3JrZXJHbG9iYWxTY29wZSA9IHNlbGYgYXMgYW55O1xuXG5jb25zdCBjdHg6IFdFQlNPQ0tFVF9DT05ORUNUSU9OID0ge1xuICAgIFdFQlNPQ0tFVDogbnVsbCxcbiAgICBXRUJTT0NLRVRfQVVUSF9IRUFERVI6ICcnLFxuICAgIFdFQlNPQ0tFVF9DT05ORUNUSU9OOiBTdGF0ZXMuRElTQ09OTkVDVEVELFxuICAgIFdFQlNPQ0tFVF9IRUFERVI6ICcnLFxuICAgIFdFQlNPQ0tFVF9FWFBMSUNJVF9ESVNDT05ORUNUOiBmYWxzZSxcbiAgICBXRUJTT0NLRVRfVVJMOiAnJyxcbiAgICBXRUJTT0NLRVRfU1RBVEU6IHt9LFxuICAgIFdFQlNPQ0tFVF9QT1JUUzogbmV3IE1hcCgpLFxuICAgIFdFQlNPQ0tFVF9DSEFOTkVMUzogbmV3IE1hcCgpLFxuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQ6IDAsXG4gICAgV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTDogbnVsbCxcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMX01TOiAxMDAwMCxcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX01BWF9BVFRFTVBUUzogMTAsXG4gICAgV0VCU09DS0VUX1NVQlNDUklQVElPTlM6IG5ldyBNYXAoKSxcbiAgICBXRUJTT0NLRVRfVklTSUJMRV9UQUJTOiBuZXcgU2V0KClcbn07XG5cbmZ1bmN0aW9uIHBhY2thZ2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09ICdvYmplY3QnICYmIG1lc3NhZ2UgIT09IG51bGxcbiAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSlcbiAgICAgICAgICAgIDogbWVzc2FnZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiBwYXJzZWQgIT09IG51bGwgJiYgcGFyc2VkLmNvbnRlbnRcbiAgICAgICAgICAgID8gcGFyc2VkLmNvbnRlbnRcbiAgICAgICAgICAgIDogcGFyc2VkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufVxuXG5jb25zdCBicm9hZGNhc3QgPSAodHlwZSwgcGF5bG9hZCkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfUE9SVFMuZm9yRWFjaCgocG9ydCwgaWQpID0+IHtcbiAgICAgICAgZW1pdChpZCwgdHlwZSwgcGF5bG9hZCk7XG4gICAgfSk7XG59O1xuXG5jb25zdCBlbWl0ID0gKGlkLCB0eXBlLCBwYXlsb2FkLCBvbmx5VmlzaWJsZSA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKGN0eC5XRUJTT0NLRVRfUE9SVFMuaGFzKGlkKSkge1xuICAgICAgICAvLyBpZiAoIW9ubHlWaXNpYmxlIHx8IGN0eC5XRUJTT0NLRVRfVklTSUJMRV9UQUJTLmhhcyhpZCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9QT1JUUy5nZXQoaWQpLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmNvbnN0IG9uQ29ubmVjdGVkID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdbdXNlLXN0b21wOjp3czo6Y29ubmVjdGVkXScpO1xuXG4gICAgcmVzdWJzY3JpYmVBbGwoKTtcblxuICAgIHNldFN0YXRlKFN0YXRlcy5DT05ORUNURUQpO1xufTtcblxuY29uc3Qgb25DaGFubmVsTWVzc2FnZSA9IChjaGFubmVsKSA9PiAobXNnKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHBhcnNlTWVzc2FnZShtc2cuYm9keSk7XG5cbiAgICBpZiAobWVzc2FnZT8uc3RhdHVzID09PSAnRU5EJykge1xuICAgICAgICBkaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgKGlzQW55VGFiVmlzaWJsZSgpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5nZXQoY2hhbm5lbCkuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGVtaXQoaWQsIEV2ZW50cy5NRVNTQUdFLCB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vIH1cbiAgICB9XG59O1xuXG5jb25zdCBvbkNoYW5uZWxNZXNzYWdlU3luYyA9IChjaGFubmVsKSA9PiAobXNnKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHBhcnNlTWVzc2FnZShtc2cuYm9keSk7XG5cbiAgICBpZiAobWVzc2FnZT8uc3RhdHVzID09PSAnRU5EJykge1xuICAgICAgICBkaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9TVEFURVtjaGFubmVsXSA9IFtcbiAgICAgICAgICAgIC4uLihjdHguV0VCU09DS0VUX1NUQVRFW2NoYW5uZWxdIHx8IFtdKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogdjQoKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG5cbiAgICAgICAgKGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5nZXQoY2hhbm5lbCkgfHwgW10pLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICBlbWl0KGlkLCBFdmVudHMuTUVTU0FHRSwge1xuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogY3R4LldFQlNPQ0tFVF9TVEFURVtjaGFubmVsXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmNvbnN0IG9uRGlzbWlzc1N5bmMgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfU1RBVEVbZS5kYXRhLnBheWxvYWQuY2hhbm5lbF0gPSBjdHguV0VCU09DS0VUX1NUQVRFW1xuICAgICAgICBlLmRhdGEucGF5bG9hZC5jaGFubmVsXG4gICAgXS5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UuaWQgIT09IGUuZGF0YS5wYXlsb2FkLmlkKTtcblxuICAgIChjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuZ2V0KGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpIHx8IFtdKS5mb3JFYWNoKFxuICAgICAgICAoaWQpID0+IHtcbiAgICAgICAgICAgIGVtaXQoaWQsIEV2ZW50cy5NRVNTQUdFLCB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbDogZS5kYXRhLnBheWxvYWQuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjdHguV0VCU09DS0VUX1NUQVRFW2UuZGF0YS5wYXlsb2FkLmNoYW5uZWxdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5jb25zdCBvbkRpc2Nvbm5lY3RlZCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnW3VzZS1zdG9tcDo6d3M6OmRpc2Nvbm5lY3RlZF0nKTtcblxuICAgIHNldFN0YXRlKFN0YXRlcy5ESVNDT05ORUNURUQpO1xuXG4gICAgaWYgKFxuICAgICAgICAhY3R4LldFQlNPQ0tFVF9FWFBMSUNJVF9ESVNDT05ORUNUICYmXG4gICAgICAgICFjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCAmJlxuICAgICAgICAhY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlRcbiAgICApIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQgPSAxO1xuXG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfTUFYX0FUVEVNUFRTO1xuXG4gICAgICAgIGNvbnN0IHJlY29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdbdXNlLXN0b21wOjp3czo6cmVjb25uZWN0aW5nXScsXG4gICAgICAgICAgICAgICAgYCR7Y3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlR9IC8gJHttYXhBdHRlbXB0c31gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNNYXhBdHRlbXB0cyA9IGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UID4gbWF4QXR0ZW1wdHM7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhblRlcm1pbmF0ZSA9IGlzQ29ubmVjdGVkKCkgfHwgaGFzTWF4QXR0ZW1wdHM7XG5cbiAgICAgICAgICAgIGlmIChjYW5UZXJtaW5hdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW3VzZS1zdG9tcDo6d3M6OnJlY29ubmVjdGVkXScpO1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUwpO1xuICAgICAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UID0gMDtcbiAgICAgICAgICAgICAgICBjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nvbm5lY3RpbmcoKSAmJiAhaXNDb25uZWN0ZWQoKSAmJiAhaGFzTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgICAgICBjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9DT1VOVCA9XG4gICAgICAgICAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UICsgMTtcbiAgICAgICAgICAgICAgICBjb25uZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUwgPSBzZXRJbnRlcnZhbChcbiAgICAgICAgICAgIHJlY29ubmVjdCxcbiAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMX01TXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVjb25uZWN0KCk7XG4gICAgfVxufTtcblxuY29uc3Qgb25FcnJvciA9IChlKSA9PiB7XG4gICAgYnJvYWRjYXN0KEV2ZW50cy5FUlJPUiwgZSk7XG59O1xuXG5jb25zdCBpc0Nvbm5lY3RlZCA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkNPTk5FQ1RFRDtcbmNvbnN0IGlzQ29ubmVjdGluZyA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkNPTk5FQ1RJTkc7XG5jb25zdCBpc0Rpc2Nvbm5lY3RlZCA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkRJU0NPTk5FQ1RFRDtcbmNvbnN0IGlzRGlzY29ubmVjdGluZyA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkRJU0NPTk5FQ1RJTkc7XG5jb25zdCBpc0FueVRhYlZpc2libGUgPSAoKSA9PiBjdHguV0VCU09DS0VUX1ZJU0lCTEVfVEFCUy5zaXplID4gMDtcblxuY29uc3QgY29ubmVjdCA9ICgpID0+IHtcbiAgICBpZiAoaXNDb25uZWN0aW5nKCkgfHwgaXNDb25uZWN0ZWQoKSB8fCBpc0Rpc2Nvbm5lY3RpbmcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlzY29ubmVjdCgpO1xuXG4gICAgc2V0U3RhdGUoU3RhdGVzLkNPTk5FQ1RJTkcpO1xuXG4gICAgY3R4LldFQlNPQ0tFVCA9IFN0b21wLm92ZXIobmV3IFNvY2tKUyhjdHguV0VCU09DS0VUX1VSTCwgbnVsbCwge30pKTtcblxuICAgIChjdHguV0VCU09DS0VULmNvbm5lY3QgYXMgYW55KShcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9BVVRIX0hFQURFUlxuICAgICAgICAgICAgPyB7QXV0aG9yaXphdGlvbjogY3R4LldFQlNPQ0tFVF9BVVRIX0hFQURFUn1cbiAgICAgICAgICAgIDogY3R4LldFQlNPQ0tFVF9IRUFERVIsXG4gICAgICAgIG9uQ29ubmVjdGVkLFxuICAgICAgICBvbkRpc2Nvbm5lY3RlZCxcbiAgICAgICAgb25FcnJvclxuICAgICk7XG59O1xuXG5jb25zdCBkaXNjb25uZWN0ID0gKCkgPT4ge1xuICAgIGlmIChpc0Rpc2Nvbm5lY3RpbmcoKSB8fCBpc0Rpc2Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdHguV0VCU09DS0VUX0VYUExJQ0lUX0RJU0NPTk5FQ1QgPSB0cnVlO1xuXG4gICAgc2V0U3RhdGUoU3RhdGVzLkRJU0NPTk5FQ1RJTkcpO1xuICAgIHVuc3Vic2NyaWJlQWxsKCk7XG5cbiAgICBpZiAoY3R4LldFQlNPQ0tFVCkge1xuICAgICAgICAoY3R4LldFQlNPQ0tFVC5kaXNjb25uZWN0IGFzIGFueSkoKCkgPT4ge1xuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9FWFBMSUNJVF9ESVNDT05ORUNUID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFN0YXRlKFN0YXRlcy5ESVNDT05ORUNURUQpO1xufTtcblxuY29uc3QgdGVzdERpc2Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgaWYgKGlzQ29ubmVjdGVkKCkgJiYgIShpc0Rpc2Nvbm5lY3RlZCgpIHx8IGlzRGlzY29ubmVjdGluZygpKSkge1xuICAgICAgICBzZXRTdGF0ZShTdGF0ZXMuRElTQ09OTkVDVElORyk7XG4gICAgICAgIHVuc3Vic2NyaWJlQWxsKCk7XG5cbiAgICAgICAgaWYgKGN0eC5XRUJTT0NLRVQpIHtcbiAgICAgICAgICAgIChjdHguV0VCU09DS0VULmRpc2Nvbm5lY3QgYXMgYW55KSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0U3RhdGUoU3RhdGVzLkRJU0NPTk5FQ1RFRCk7XG4gICAgfVxufTtcblxuY29uc3QgcmVzdWJzY3JpYmVBbGwgPSAoKSA9PiB7XG4gICAgaWYgKGN0eC5XRUJTT0NLRVQ/LnN1YnNjcmliZSAmJiBjdHguV0VCU09DS0VUPy5jb25uZWN0ZWQgJiYgaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICBjdHguV0VCU09DS0VUX0NIQU5ORUxTLmZvckVhY2goKHN1YnNjcmlwdGlvbiwgY2hhbm5lbCkgPT4ge1xuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9DSEFOTkVMUy5zZXQoXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBjdHguV0VCU09DS0VULnN1YnNjcmliZShjaGFubmVsLCBvbkNoYW5uZWxNZXNzYWdlKGNoYW5uZWwpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuY29uc3Qgc3Vic2NyaWJlID0gKGUpID0+IHtcbiAgICBpZiAoaXNDb25uZWN0ZWQoKSAmJiAhY3R4LldFQlNPQ0tFVF9DSEFOTkVMUy5oYXMoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9DSEFOTkVMUy5zZXQoXG4gICAgICAgICAgICBlLmRhdGEucGF5bG9hZC5jaGFubmVsLFxuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBvbkNoYW5uZWxNZXNzYWdlKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIGlmIGNoYW5uZWwgaGFzIG5vIHN1YnNjcmlwdGlvbnMsIHNldCBpdCBhcyBhbiBhcnJheSBhbmQgYWRkIGlkXG4gICAgaWYgKCFjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuaGFzKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuaWRcbiAgICAgICAgXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgY2hhbm5lbCBkb2VzIGV4aXN0LCB1cGRhdGUgdGhlIGlkcyB0byBpbmNsdWRlIGlkXG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgLi4uY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmdldChlLmRhdGEucGF5bG9hZC5jaGFubmVsKSxcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmlkXG4gICAgICAgIF0pO1xuICAgIH1cbn07XG5cbmNvbnN0IHN1YnNjcmliZVN5bmMgPSAoZSkgPT4ge1xuICAgIGlmIChpc0Nvbm5lY3RlZCgpICYmICFjdHguV0VCU09DS0VUX0NIQU5ORUxTLmhhcyhlLmRhdGEucGF5bG9hZC5jaGFubmVsKSkge1xuICAgICAgICBjdHguV0VCU09DS0VUX0NIQU5ORUxTLnNldChcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwsXG4gICAgICAgICAgICBjdHguV0VCU09DS0VULnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICBlLmRhdGEucGF5bG9hZC5jaGFubmVsLFxuICAgICAgICAgICAgICAgIG9uQ2hhbm5lbE1lc3NhZ2VTeW5jKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIGlmIGNoYW5uZWwgaGFzIG5vIHN1YnNjcmlwdGlvbnMsIHNldCBpdCBhcyBhbiBhcnJheSBhbmQgYWRkIGlkXG4gICAgaWYgKCFjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuaGFzKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuaWRcbiAgICAgICAgXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgY2hhbm5lbCBkb2VzIGV4aXN0LCB1cGRhdGUgdGhlIGlkcyB0byBpbmNsdWRlIGlkXG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgLi4uY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmdldChlLmRhdGEucGF5bG9hZC5jaGFubmVsKSxcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmlkXG4gICAgICAgIF0pO1xuICAgIH1cbn07XG5cbmNvbnN0IHNlbmRNZXNzYWdlID0gKGUpID0+IHtcbiAgICBpZiAoY3R4LldFQlNPQ0tFVCAmJiBpc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVQuc2VuZChcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFja2FnZU1lc3NhZ2UoZS5kYXRhLnBheWxvYWQubWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5jb25zdCBzZXRBdXRoSGVhZGVyID0gKGUpID0+IHtcbiAgICBjdHguV0VCU09DS0VUX0FVVEhfSEVBREVSID0gZS5kYXRhLnBheWxvYWQ7XG59O1xuXG5jb25zdCBzZXRIZWFkZXIgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfSEVBREVSID0gZS5kYXRhLnBheWxvYWQ7XG59O1xuXG5jb25zdCBzZXRVcmwgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfVVJMID0gZS5kYXRhLnBheWxvYWQ7XG59O1xuXG5jb25zdCBzZXRWaXNpYmlsaXR5ID0gKGUpID0+IHtcbiAgICBjb25zdCB2aXNpYmxlID0gZS5kYXRhLnBheWxvYWQudmlzaWJpbGl0eTtcbiAgICBjb25zdCBjdXJyZW50ID0gY3R4LldFQlNPQ0tFVF9WSVNJQkxFX1RBQlMuaGFzKGUuZGF0YS5wYXlsb2FkLmlkKTtcblxuICAgIGlmICh2aXNpYmxlICYmICFjdXJyZW50KSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfVklTSUJMRV9UQUJTLmFkZChlLmRhdGEucGF5bG9hZC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKCF2aXNpYmxlICYmIGN1cnJlbnQpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9WSVNJQkxFX1RBQlMuZGVsZXRlKGUuZGF0YS5wYXlsb2FkLmlkKTtcbiAgICB9XG59O1xuXG5jb25zdCBzZXRTdGF0ZSA9IChzdGF0ZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9IHN0YXRlO1xuICAgIGJyb2FkY2FzdChFdmVudHMuQ09OTkVDVElPTiwgY3R4LldFQlNPQ0tFVF9DT05ORUNUSU9OKTtcbn07XG5cbmNvbnN0IHVucmVnaXN0ZXIgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfUE9SVFMuZGVsZXRlKGUuZGF0YS5wYXlsb2FkLmlkKTtcbiAgICBjdHguV0VCU09DS0VUX1ZJU0lCTEVfVEFCUy5kZWxldGUoZS5kYXRhLnBheWxvYWQuaWQpO1xuXG4gICAgY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmZvckVhY2goKGlkcywgY2hhbm5lbCkgPT4ge1xuICAgICAgICB1bnN1YnNjcmliZSh7XG4gICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgZGF