@nlabs/arkhamjs 3.20.5 → 3.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +6 -0
- package/lib/Flux/Flux.js +347 -1002
- package/lib/Flux/Flux.test.js +717 -0
- package/lib/Flux/Flux.types.js +21 -2
- package/lib/constants/ArkhamConstants.js +39 -34
- package/lib/index.js +35 -51
- package/package.json +11 -11
package/lib/Flux/Flux.js
CHANGED
@@ -1,1037 +1,382 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
1
|
+
var __create = Object.create;
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
8
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
9
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
10
|
+
var __spreadValues = (a, b) => {
|
11
|
+
for (var prop in b || (b = {}))
|
12
|
+
if (__hasOwnProp.call(b, prop))
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
14
|
+
if (__getOwnPropSymbols)
|
15
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
16
|
+
if (__propIsEnum.call(b, prop))
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
18
|
+
}
|
19
|
+
return a;
|
20
|
+
};
|
21
|
+
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
22
|
+
var __objRest = (source, exclude) => {
|
23
|
+
var target = {};
|
24
|
+
for (var prop in source)
|
25
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
26
|
+
target[prop] = source[prop];
|
27
|
+
if (source != null && __getOwnPropSymbols)
|
28
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
29
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
30
|
+
target[prop] = source[prop];
|
31
|
+
}
|
32
|
+
return target;
|
33
|
+
};
|
34
|
+
var __export = (target, all) => {
|
35
|
+
for (var name in all)
|
36
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
37
|
+
};
|
38
|
+
var __reExport = (target, module2, copyDefault, desc) => {
|
39
|
+
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
40
|
+
for (let key of __getOwnPropNames(module2))
|
41
|
+
if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
|
42
|
+
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
43
|
+
}
|
44
|
+
return target;
|
45
|
+
};
|
46
|
+
var __toESM = (module2, isNodeMode) => {
|
47
|
+
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
48
|
+
};
|
49
|
+
var __toCommonJS = /* @__PURE__ */ ((cache) => {
|
50
|
+
return (module2, temp) => {
|
51
|
+
return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
|
52
|
+
};
|
53
|
+
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
|
54
|
+
var Flux_exports = {};
|
55
|
+
__export(Flux_exports, {
|
56
|
+
Flux: () => Flux,
|
57
|
+
FluxFramework: () => FluxFramework
|
27
58
|
});
|
28
|
-
|
29
|
-
|
30
|
-
require("
|
31
|
-
|
32
|
-
require("
|
33
|
-
|
34
|
-
require("
|
35
|
-
|
36
|
-
require("
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
require("core-js/modules/es.date.to-string.js");
|
49
|
-
|
50
|
-
require("core-js/modules/es.string.iterator.js");
|
51
|
-
|
52
|
-
require("core-js/modules/es.array.iterator.js");
|
53
|
-
|
54
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
55
|
-
|
56
|
-
require("core-js/modules/es.array.map.js");
|
57
|
-
|
58
|
-
require("core-js/modules/es.array.reduce.js");
|
59
|
-
|
60
|
-
require("core-js/modules/es.array.filter.js");
|
61
|
-
|
62
|
-
require("core-js/modules/es.object.define-property.js");
|
63
|
-
|
64
|
-
var _errorStackParser = _interopRequireDefault(require("error-stack-parser"));
|
65
|
-
|
66
|
-
var _events = require("events");
|
67
|
-
|
68
|
-
var _debounce = _interopRequireDefault(require("lodash/debounce"));
|
69
|
-
|
70
|
-
var _cloneDeep = _interopRequireDefault(require("lodash/fp/cloneDeep"));
|
71
|
-
|
72
|
-
var _get = _interopRequireDefault(require("lodash/fp/get"));
|
73
|
-
|
74
|
-
var _isEmpty = _interopRequireDefault(require("lodash/fp/isEmpty"));
|
75
|
-
|
76
|
-
var _merge = _interopRequireDefault(require("lodash/fp/merge"));
|
77
|
-
|
78
|
-
var _set = _interopRequireDefault(require("lodash/fp/set"));
|
79
|
-
|
80
|
-
var _ArkhamConstants = require("../constants/ArkhamConstants");
|
81
|
-
|
82
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
83
|
-
|
84
|
-
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; }
|
85
|
-
|
86
|
-
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) { _defineProperty(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; }
|
87
|
-
|
88
|
-
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
89
|
-
|
90
|
-
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
91
|
-
|
92
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
93
|
-
|
94
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
95
|
-
|
96
|
-
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
97
|
-
|
98
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
99
|
-
|
100
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
101
|
-
|
102
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
103
|
-
|
104
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
105
|
-
|
106
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
107
|
-
|
108
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
109
|
-
|
110
|
-
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
111
|
-
|
112
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
113
|
-
|
114
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
115
|
-
|
116
|
-
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
117
|
-
|
118
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
119
|
-
|
120
|
-
/**
|
121
|
-
* FluxFramework
|
122
|
-
* @type {EventEmitter}
|
123
|
-
*/
|
124
|
-
var FluxFramework = /*#__PURE__*/function (_EventEmitter) {
|
125
|
-
_inherits(FluxFramework, _EventEmitter);
|
126
|
-
|
127
|
-
var _super = _createSuper(FluxFramework);
|
128
|
-
|
129
|
-
// Public properties
|
130
|
-
// Private properties
|
131
|
-
|
132
|
-
/**
|
133
|
-
* Create a new instance of Flux. Note that the Flux object
|
134
|
-
* is a Singleton pattern, so only one should ever exist.
|
135
|
-
*
|
136
|
-
* @constructor
|
137
|
-
* @this {FluxFramework}
|
138
|
-
*/
|
139
|
-
function FluxFramework() {
|
140
|
-
var _this;
|
141
|
-
|
142
|
-
_classCallCheck(this, FluxFramework);
|
143
|
-
|
144
|
-
_this = _super.call(this); // Methods
|
145
|
-
|
146
|
-
_defineProperty(_assertThisInitialized(_this), "isInit", false);
|
147
|
-
|
148
|
-
_defineProperty(_assertThisInitialized(_this), "pluginTypes", ['preDispatch', 'postDispatch']);
|
149
|
-
|
150
|
-
_defineProperty(_assertThisInitialized(_this), "state", {});
|
151
|
-
|
152
|
-
_defineProperty(_assertThisInitialized(_this), "storeActions", {});
|
153
|
-
|
154
|
-
_defineProperty(_assertThisInitialized(_this), "defaultOptions", {
|
155
|
-
name: 'arkhamjs',
|
156
|
-
routerType: 'browser',
|
59
|
+
var import_error_stack_parser = __toESM(require("error-stack-parser"));
|
60
|
+
var import_events = require("events");
|
61
|
+
var import_debounce = __toESM(require("lodash/debounce"));
|
62
|
+
var import_cloneDeep = __toESM(require("lodash/fp/cloneDeep"));
|
63
|
+
var import_get = __toESM(require("lodash/fp/get"));
|
64
|
+
var import_isEmpty = __toESM(require("lodash/fp/isEmpty"));
|
65
|
+
var import_merge = __toESM(require("lodash/fp/merge"));
|
66
|
+
var import_set = __toESM(require("lodash/fp/set"));
|
67
|
+
var import_ArkhamConstants = require("../constants/ArkhamConstants");
|
68
|
+
class FluxFramework extends import_events.EventEmitter {
|
69
|
+
constructor() {
|
70
|
+
super();
|
71
|
+
this.isInit = false;
|
72
|
+
this.pluginTypes = ["preDispatch", "postDispatch"];
|
73
|
+
this.state = {};
|
74
|
+
this.storeActions = {};
|
75
|
+
this.defaultOptions = {
|
76
|
+
name: "arkhamjs",
|
77
|
+
routerType: "browser",
|
157
78
|
scrollToTop: true,
|
158
79
|
state: null,
|
159
80
|
storage: null,
|
160
81
|
storageWait: 300,
|
161
82
|
stores: [],
|
162
|
-
title:
|
83
|
+
title: "ArkhamJS"
|
84
|
+
};
|
85
|
+
this.middleware = {};
|
86
|
+
this.options = this.defaultOptions;
|
87
|
+
this.updateStorage = () => Promise.resolve(false);
|
88
|
+
this.addMiddleware = this.addMiddleware.bind(this);
|
89
|
+
this.addStores = this.addStores.bind(this);
|
90
|
+
this.clearAppData = this.clearAppData.bind(this);
|
91
|
+
this.clearMiddleware = this.clearMiddleware.bind(this);
|
92
|
+
this.deregister = this.deregister.bind(this);
|
93
|
+
this.dispatch = this.dispatch.bind(this);
|
94
|
+
this.getOptions = this.getOptions.bind(this);
|
95
|
+
this.getState = this.getState.bind(this);
|
96
|
+
this.getStore = this.getStore.bind(this);
|
97
|
+
this.init = this.init.bind(this);
|
98
|
+
this.off = this.off.bind(this);
|
99
|
+
this.register = this.register.bind(this);
|
100
|
+
this.removeMiddleware = this.removeMiddleware.bind(this);
|
101
|
+
this.removeStores = this.removeStores.bind(this);
|
102
|
+
this.reset = this.reset.bind(this);
|
103
|
+
this.setState = this.setState.bind(this);
|
104
|
+
this.pluginTypes.forEach((type) => this.middleware[`${type}List`] = []);
|
105
|
+
}
|
106
|
+
addMiddleware(middleware) {
|
107
|
+
middleware.forEach((middleObj) => {
|
108
|
+
if (!!middleObj && (typeof middleObj === "function" || typeof middleObj === "object")) {
|
109
|
+
const middleName = middleObj.name || "";
|
110
|
+
if (!middleName) {
|
111
|
+
throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");
|
112
|
+
}
|
113
|
+
this.pluginTypes.forEach((type) => {
|
114
|
+
const method = middleObj[type];
|
115
|
+
const plugin = { method, name: middleName };
|
116
|
+
this.middleware[`${type}List`] = this.addPlugin(type, plugin);
|
117
|
+
});
|
118
|
+
} else {
|
119
|
+
throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");
|
120
|
+
}
|
163
121
|
});
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
_defineProperty(_assertThisInitialized(_this), "updateStorage", function () {
|
170
|
-
return Promise.resolve(false);
|
122
|
+
}
|
123
|
+
clearAppData() {
|
124
|
+
Object.keys(this.storeActions).forEach((storeName) => {
|
125
|
+
const storeFn = this.storeActions[storeName];
|
126
|
+
this.state[storeFn.name] = (0, import_cloneDeep.default)(storeFn.initialState);
|
171
127
|
});
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
_this.getStore = _this.getStore.bind(_assertThisInitialized(_this));
|
182
|
-
_this.init = _this.init.bind(_assertThisInitialized(_this));
|
183
|
-
_this.off = _this.off.bind(_assertThisInitialized(_this));
|
184
|
-
_this.register = _this.register.bind(_assertThisInitialized(_this));
|
185
|
-
_this.removeMiddleware = _this.removeMiddleware.bind(_assertThisInitialized(_this));
|
186
|
-
_this.removeStores = _this.removeStores.bind(_assertThisInitialized(_this));
|
187
|
-
_this.reset = _this.reset.bind(_assertThisInitialized(_this));
|
188
|
-
_this.setState = _this.setState.bind(_assertThisInitialized(_this)); // Add middleware plugin types
|
189
|
-
|
190
|
-
_this.pluginTypes.forEach(function (type) {
|
191
|
-
return _this.middleware["".concat(type, "List")] = [];
|
128
|
+
const { name, storage } = this.options;
|
129
|
+
if (storage) {
|
130
|
+
return storage.setStorageData(name, this.state);
|
131
|
+
}
|
132
|
+
return Promise.resolve(true);
|
133
|
+
}
|
134
|
+
clearMiddleware() {
|
135
|
+
Object.keys(this.middleware).forEach((pluginType) => {
|
136
|
+
this.middleware[pluginType] = [];
|
192
137
|
});
|
193
|
-
|
194
|
-
return _this;
|
138
|
+
return true;
|
195
139
|
}
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
_createClass(FluxFramework, [{
|
204
|
-
key: "addMiddleware",
|
205
|
-
value: function addMiddleware(middleware) {
|
206
|
-
var _this2 = this;
|
207
|
-
|
208
|
-
middleware.forEach(function (middleObj) {
|
209
|
-
// Make sure middleware is either a class or object.
|
210
|
-
if (!!middleObj && (typeof middleObj === 'function' || _typeof(middleObj) === 'object')) {
|
211
|
-
var middleName = middleObj.name || '';
|
212
|
-
|
213
|
-
if (!middleName) {
|
214
|
-
throw Error('Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.');
|
215
|
-
} // Sort middleware plugins for efficiency
|
216
|
-
|
217
|
-
|
218
|
-
_this2.pluginTypes.forEach(function (type) {
|
219
|
-
var method = middleObj[type];
|
220
|
-
var plugin = {
|
221
|
-
method: method,
|
222
|
-
name: middleName
|
223
|
-
};
|
224
|
-
_this2.middleware["".concat(type, "List")] = _this2.addPlugin(type, plugin);
|
225
|
-
});
|
226
|
-
} else {
|
227
|
-
throw Error('Unknown middleware is not configured properly. Cannot add to Flux.');
|
228
|
-
}
|
229
|
-
});
|
140
|
+
removeStores(storeNames) {
|
141
|
+
storeNames.forEach((name) => this.deregister(name));
|
142
|
+
}
|
143
|
+
async dispatch(action, silent = false) {
|
144
|
+
if (!action) {
|
145
|
+
throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");
|
230
146
|
}
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
147
|
+
let clonedAction = (0, import_cloneDeep.default)(action);
|
148
|
+
const startTime = Date.now();
|
149
|
+
let stack = [];
|
150
|
+
try {
|
151
|
+
const stackProperty = "stackTraceLimit";
|
152
|
+
const { stackTraceLimit } = Error;
|
153
|
+
Error[stackProperty] = Infinity;
|
154
|
+
stack = import_error_stack_parser.default.parse(new Error());
|
155
|
+
Error[stackProperty] = stackTraceLimit;
|
156
|
+
} catch (error) {
|
157
|
+
}
|
158
|
+
const options = (0, import_cloneDeep.default)(this.options);
|
159
|
+
const appInfo = { duration: 0, options, stack };
|
160
|
+
const { postDispatchList = [], preDispatchList = [] } = this.middleware;
|
161
|
+
if (preDispatchList.length) {
|
162
|
+
clonedAction = await Promise.all(preDispatchList.map((plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo))).then((actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)).catch((error) => {
|
163
|
+
throw error;
|
246
164
|
});
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
165
|
+
}
|
166
|
+
const _a = clonedAction, { type } = _a, data = __objRest(_a, ["type"]);
|
167
|
+
if (!type || type === "") {
|
168
|
+
console.warn("ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:", data);
|
169
|
+
return Promise.resolve(clonedAction);
|
170
|
+
}
|
171
|
+
Object.keys(this.storeActions).forEach((storeName) => {
|
172
|
+
const storeFn = this.storeActions[storeName];
|
173
|
+
const state = (0, import_cloneDeep.default)(this.state[storeName]) || (0, import_cloneDeep.default)(storeFn.initialState) || {};
|
174
|
+
this.state[storeName] = (0, import_cloneDeep.default)(storeFn.action(type, data, state)) || state;
|
175
|
+
});
|
176
|
+
const { storage } = this.options;
|
177
|
+
if (storage) {
|
178
|
+
try {
|
179
|
+
await this.updateStorage();
|
180
|
+
} catch (error) {
|
253
181
|
}
|
254
|
-
|
255
|
-
return Promise.resolve(true);
|
256
182
|
}
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
}, {
|
264
|
-
key: "clearMiddleware",
|
265
|
-
value: function clearMiddleware() {
|
266
|
-
var _this4 = this;
|
267
|
-
|
268
|
-
// Set all store data to initial state
|
269
|
-
Object.keys(this.middleware).forEach(function (pluginType) {
|
270
|
-
_this4.middleware[pluginType] = [];
|
183
|
+
const endTime = +new Date();
|
184
|
+
const duration = endTime - startTime;
|
185
|
+
appInfo.duration = duration;
|
186
|
+
if (postDispatchList.length) {
|
187
|
+
clonedAction = await Promise.all(postDispatchList.map(async (plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo))).then((actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)).catch((error) => {
|
188
|
+
throw error;
|
271
189
|
});
|
272
|
-
return true;
|
273
190
|
}
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
* @param {array} storeNames An array of store names to remove from the framework.
|
278
|
-
*/
|
279
|
-
|
280
|
-
}, {
|
281
|
-
key: "removeStores",
|
282
|
-
value: function removeStores(storeNames) {
|
283
|
-
var _this5 = this;
|
284
|
-
|
285
|
-
storeNames.forEach(function (name) {
|
286
|
-
return _this5.deregister(name);
|
287
|
-
});
|
191
|
+
if (!silent) {
|
192
|
+
this.emit(type, clonedAction);
|
193
|
+
this.emit("arkhamjs", this.state);
|
288
194
|
}
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
value: function () {
|
301
|
-
var _dispatch = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(action) {
|
302
|
-
var _this6 = this;
|
303
|
-
|
304
|
-
var silent,
|
305
|
-
clonedAction,
|
306
|
-
startTime,
|
307
|
-
stack,
|
308
|
-
stackProperty,
|
309
|
-
stackTraceLimit,
|
310
|
-
options,
|
311
|
-
appInfo,
|
312
|
-
_this$middleware,
|
313
|
-
_this$middleware$post,
|
314
|
-
postDispatchList,
|
315
|
-
_this$middleware$preD,
|
316
|
-
preDispatchList,
|
317
|
-
_clonedAction,
|
318
|
-
type,
|
319
|
-
data,
|
320
|
-
storage,
|
321
|
-
endTime,
|
322
|
-
duration,
|
323
|
-
_args2 = arguments;
|
324
|
-
|
325
|
-
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
326
|
-
while (1) {
|
327
|
-
switch (_context2.prev = _context2.next) {
|
328
|
-
case 0:
|
329
|
-
silent = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : false;
|
330
|
-
|
331
|
-
if (action) {
|
332
|
-
_context2.next = 3;
|
333
|
-
break;
|
334
|
-
}
|
335
|
-
|
336
|
-
throw new Error('ArkhamJS Error: Flux.dispatch requires an action.');
|
337
|
-
|
338
|
-
case 3:
|
339
|
-
clonedAction = (0, _cloneDeep["default"])(action); // Log duration of dispatch
|
340
|
-
|
341
|
-
startTime = Date.now(); // Get stack
|
342
|
-
|
343
|
-
stack = [];
|
344
|
-
|
345
|
-
try {
|
346
|
-
stackProperty = 'stackTraceLimit';
|
347
|
-
stackTraceLimit = Error.stackTraceLimit;
|
348
|
-
Error[stackProperty] = Infinity;
|
349
|
-
stack = _errorStackParser["default"].parse(new Error());
|
350
|
-
Error[stackProperty] = stackTraceLimit;
|
351
|
-
} catch (error) {} // Get options
|
352
|
-
|
353
|
-
|
354
|
-
options = (0, _cloneDeep["default"])(this.options); // App info
|
355
|
-
|
356
|
-
appInfo = {
|
357
|
-
duration: 0,
|
358
|
-
options: options,
|
359
|
-
stack: stack
|
360
|
-
}; // Apply middleware before the action is processed
|
361
|
-
|
362
|
-
_this$middleware = this.middleware, _this$middleware$post = _this$middleware.postDispatchList, postDispatchList = _this$middleware$post === void 0 ? [] : _this$middleware$post, _this$middleware$preD = _this$middleware.preDispatchList, preDispatchList = _this$middleware$preD === void 0 ? [] : _this$middleware$preD;
|
363
|
-
|
364
|
-
if (!preDispatchList.length) {
|
365
|
-
_context2.next = 14;
|
366
|
-
break;
|
367
|
-
}
|
368
|
-
|
369
|
-
_context2.next = 13;
|
370
|
-
return Promise.all(preDispatchList.map(function (plugin) {
|
371
|
-
return plugin.method((0, _cloneDeep["default"])(clonedAction), (0, _cloneDeep["default"])(_this6.state), appInfo);
|
372
|
-
})).then(function (actions) {
|
373
|
-
return actions.reduce(function (updatedAction, action) {
|
374
|
-
return (0, _merge["default"])(updatedAction, action);
|
375
|
-
}, clonedAction);
|
376
|
-
})["catch"](function (error) {
|
377
|
-
throw error;
|
378
|
-
});
|
379
|
-
|
380
|
-
case 13:
|
381
|
-
clonedAction = _context2.sent;
|
382
|
-
|
383
|
-
case 14:
|
384
|
-
_clonedAction = clonedAction, type = _clonedAction.type, data = _objectWithoutProperties(_clonedAction, ["type"]); // Require a type
|
385
|
-
|
386
|
-
if (!(!type || type === '')) {
|
387
|
-
_context2.next = 18;
|
388
|
-
break;
|
389
|
-
}
|
390
|
-
|
391
|
-
console.warn('ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:', data);
|
392
|
-
return _context2.abrupt("return", Promise.resolve(clonedAction));
|
393
|
-
|
394
|
-
case 18:
|
395
|
-
// When an action comes in, it must be completely handled by all stores
|
396
|
-
Object.keys(this.storeActions).forEach(function (storeName) {
|
397
|
-
var storeFn = _this6.storeActions[storeName];
|
398
|
-
var state = (0, _cloneDeep["default"])(_this6.state[storeName]) || (0, _cloneDeep["default"])(storeFn.initialState) || {};
|
399
|
-
_this6.state[storeName] = (0, _cloneDeep["default"])(storeFn.action(type, data, state)) || state;
|
400
|
-
}); // Save cache in storage
|
401
|
-
|
402
|
-
storage = this.options.storage;
|
403
|
-
|
404
|
-
if (!storage) {
|
405
|
-
_context2.next = 28;
|
406
|
-
break;
|
407
|
-
}
|
408
|
-
|
409
|
-
_context2.prev = 21;
|
410
|
-
_context2.next = 24;
|
411
|
-
return this.updateStorage();
|
412
|
-
|
413
|
-
case 24:
|
414
|
-
_context2.next = 28;
|
415
|
-
break;
|
416
|
-
|
417
|
-
case 26:
|
418
|
-
_context2.prev = 26;
|
419
|
-
_context2.t0 = _context2["catch"](21);
|
420
|
-
|
421
|
-
case 28:
|
422
|
-
endTime = +new Date();
|
423
|
-
duration = endTime - startTime;
|
424
|
-
appInfo.duration = duration;
|
425
|
-
|
426
|
-
if (!postDispatchList.length) {
|
427
|
-
_context2.next = 35;
|
428
|
-
break;
|
429
|
-
}
|
430
|
-
|
431
|
-
_context2.next = 34;
|
432
|
-
return Promise.all(postDispatchList.map( /*#__PURE__*/function () {
|
433
|
-
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(plugin) {
|
434
|
-
return regeneratorRuntime.wrap(function _callee$(_context) {
|
435
|
-
while (1) {
|
436
|
-
switch (_context.prev = _context.next) {
|
437
|
-
case 0:
|
438
|
-
return _context.abrupt("return", plugin.method((0, _cloneDeep["default"])(clonedAction), (0, _cloneDeep["default"])(_this6.state), appInfo));
|
439
|
-
|
440
|
-
case 1:
|
441
|
-
case "end":
|
442
|
-
return _context.stop();
|
443
|
-
}
|
444
|
-
}
|
445
|
-
}, _callee);
|
446
|
-
}));
|
447
|
-
|
448
|
-
return function (_x2) {
|
449
|
-
return _ref.apply(this, arguments);
|
450
|
-
};
|
451
|
-
}())).then(function (actions) {
|
452
|
-
return actions.reduce(function (updatedAction, action) {
|
453
|
-
return (0, _merge["default"])(updatedAction, action);
|
454
|
-
}, clonedAction);
|
455
|
-
})["catch"](function (error) {
|
456
|
-
throw error;
|
457
|
-
});
|
458
|
-
|
459
|
-
case 34:
|
460
|
-
clonedAction = _context2.sent;
|
461
|
-
|
462
|
-
case 35:
|
463
|
-
if (!silent) {
|
464
|
-
this.emit(type, clonedAction);
|
465
|
-
}
|
466
|
-
|
467
|
-
return _context2.abrupt("return", Promise.resolve(clonedAction));
|
468
|
-
|
469
|
-
case 37:
|
470
|
-
case "end":
|
471
|
-
return _context2.stop();
|
472
|
-
}
|
473
|
-
}
|
474
|
-
}, _callee2, this, [[21, 26]]);
|
475
|
-
}));
|
476
|
-
|
477
|
-
function dispatch(_x) {
|
478
|
-
return _dispatch.apply(this, arguments);
|
479
|
-
}
|
480
|
-
|
481
|
-
return dispatch;
|
482
|
-
}()
|
483
|
-
/**
|
484
|
-
* Get the current Flux options.
|
485
|
-
*
|
486
|
-
* @returns {FluxOptions} the Flux options object.
|
487
|
-
*/
|
488
|
-
|
489
|
-
}, {
|
490
|
-
key: "getOptions",
|
491
|
-
value: function getOptions() {
|
492
|
-
return this.options;
|
195
|
+
return Promise.resolve(clonedAction);
|
196
|
+
}
|
197
|
+
getOptions() {
|
198
|
+
return this.options;
|
199
|
+
}
|
200
|
+
getState(path = "", defaultValue) {
|
201
|
+
let storeValue;
|
202
|
+
if (!path) {
|
203
|
+
storeValue = this.state || {};
|
204
|
+
} else {
|
205
|
+
storeValue = (0, import_get.default)(path, this.state);
|
493
206
|
}
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
key: "getState",
|
505
|
-
value: function getState() {
|
506
|
-
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
507
|
-
var defaultValue = arguments.length > 1 ? arguments[1] : undefined;
|
508
|
-
var storeValue;
|
509
|
-
|
510
|
-
if (!path) {
|
511
|
-
storeValue = this.state || {};
|
512
|
-
} else {
|
513
|
-
storeValue = (0, _get["default"])(path, this.state);
|
514
|
-
}
|
515
|
-
|
516
|
-
var value = storeValue ? (0, _cloneDeep["default"])(storeValue) : storeValue;
|
517
|
-
return value === undefined ? defaultValue : value;
|
207
|
+
const value = storeValue ? (0, import_cloneDeep.default)(storeValue) : storeValue;
|
208
|
+
return value === void 0 ? defaultValue : value;
|
209
|
+
}
|
210
|
+
getStore(name = "") {
|
211
|
+
return this.storeActions[name];
|
212
|
+
}
|
213
|
+
async init(options = {}, reset = false) {
|
214
|
+
if (reset) {
|
215
|
+
this.isInit = false;
|
216
|
+
this.reset(false);
|
518
217
|
}
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
* @param {string} name The name of the store.
|
523
|
-
* @returns {FluxStore} the store object.
|
524
|
-
*/
|
525
|
-
|
526
|
-
}, {
|
527
|
-
key: "getStore",
|
528
|
-
value: function getStore() {
|
529
|
-
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
530
|
-
return this.storeActions[name];
|
218
|
+
const updatedOptions = __spreadValues({}, options);
|
219
|
+
if (this.isInit) {
|
220
|
+
updatedOptions.name = this.options.name;
|
531
221
|
}
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
debug,
|
547
|
-
middleware,
|
548
|
-
name,
|
549
|
-
stores,
|
550
|
-
windowProperty,
|
551
|
-
_args3 = arguments;
|
552
|
-
|
553
|
-
return regeneratorRuntime.wrap(function _callee3$(_context3) {
|
554
|
-
while (1) {
|
555
|
-
switch (_context3.prev = _context3.next) {
|
556
|
-
case 0:
|
557
|
-
options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
|
558
|
-
reset = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : false;
|
559
|
-
|
560
|
-
// Should reset previous params
|
561
|
-
if (reset) {
|
562
|
-
this.isInit = false;
|
563
|
-
this.reset(false);
|
564
|
-
} // Set options
|
565
|
-
|
566
|
-
|
567
|
-
updatedOptions = _objectSpread({}, options);
|
568
|
-
|
569
|
-
if (this.isInit) {
|
570
|
-
// Remove the name from options if already initialized, otherwise the root app will not be able to access
|
571
|
-
// the state tree
|
572
|
-
updatedOptions.name = this.options.name;
|
573
|
-
}
|
574
|
-
|
575
|
-
this.options = _objectSpread(_objectSpread({}, this.defaultOptions), updatedOptions);
|
576
|
-
_this$options2 = this.options, debug = _this$options2.debug, middleware = _this$options2.middleware, name = _this$options2.name, stores = _this$options2.stores; // Update default store
|
577
|
-
|
578
|
-
_context3.prev = 7;
|
579
|
-
_context3.next = 10;
|
580
|
-
return this.useStorage(name);
|
581
|
-
|
582
|
-
case 10:
|
583
|
-
_context3.next = 16;
|
584
|
-
break;
|
585
|
-
|
586
|
-
case 12:
|
587
|
-
_context3.prev = 12;
|
588
|
-
_context3.t0 = _context3["catch"](7);
|
589
|
-
console.error('Arkham Error: There was an error while using storage.', name);
|
590
|
-
throw _context3.t0;
|
591
|
-
|
592
|
-
case 16:
|
593
|
-
if (!(!!stores && stores.length)) {
|
594
|
-
_context3.next = 26;
|
595
|
-
break;
|
596
|
-
}
|
597
|
-
|
598
|
-
_context3.prev = 17;
|
599
|
-
_context3.next = 20;
|
600
|
-
return this.addStores(stores);
|
601
|
-
|
602
|
-
case 20:
|
603
|
-
_context3.next = 26;
|
604
|
-
break;
|
605
|
-
|
606
|
-
case 22:
|
607
|
-
_context3.prev = 22;
|
608
|
-
_context3.t1 = _context3["catch"](17);
|
609
|
-
console.error('Arkham Error: There was an error while adding stores.', stores);
|
610
|
-
throw _context3.t1;
|
611
|
-
|
612
|
-
case 26:
|
613
|
-
if (!!middleware && middleware.length) {
|
614
|
-
this.addMiddleware(middleware);
|
615
|
-
}
|
616
|
-
|
617
|
-
windowProperty = 'arkhamjs';
|
618
|
-
|
619
|
-
if (debug) {
|
620
|
-
window[windowProperty] = this;
|
621
|
-
} else {
|
622
|
-
delete window[windowProperty];
|
623
|
-
}
|
624
|
-
|
625
|
-
this.isInit = true;
|
626
|
-
this.emit(_ArkhamConstants.ArkhamConstants.INIT);
|
627
|
-
return _context3.abrupt("return", this);
|
628
|
-
|
629
|
-
case 32:
|
630
|
-
case "end":
|
631
|
-
return _context3.stop();
|
632
|
-
}
|
633
|
-
}
|
634
|
-
}, _callee3, this, [[7, 12], [17, 22]]);
|
635
|
-
}));
|
636
|
-
|
637
|
-
function init() {
|
638
|
-
return _init.apply(this, arguments);
|
639
|
-
}
|
640
|
-
|
641
|
-
return init;
|
642
|
-
}()
|
643
|
-
/**
|
644
|
-
* Adds an initialization listener.
|
645
|
-
*
|
646
|
-
* @param {function} [listener] The callback associated with the subscribed event.
|
647
|
-
*/
|
648
|
-
|
649
|
-
}, {
|
650
|
-
key: "onInit",
|
651
|
-
value: function onInit(listener) {
|
652
|
-
this.on(_ArkhamConstants.ArkhamConstants.INIT, listener);
|
653
|
-
|
654
|
-
if (this.isInit) {
|
655
|
-
listener();
|
222
|
+
this.options = __spreadValues(__spreadValues({}, this.defaultOptions), updatedOptions);
|
223
|
+
const { debug, middleware, name, stores } = this.options;
|
224
|
+
try {
|
225
|
+
await this.useStorage(name);
|
226
|
+
} catch (error) {
|
227
|
+
console.error("Arkham Error: There was an error while using storage.", name);
|
228
|
+
throw error;
|
229
|
+
}
|
230
|
+
if (!!stores && stores.length) {
|
231
|
+
try {
|
232
|
+
await this.addStores(stores);
|
233
|
+
} catch (error) {
|
234
|
+
console.error("Arkham Error: There was an error while adding stores.", stores);
|
235
|
+
throw error;
|
656
236
|
}
|
657
237
|
}
|
658
|
-
|
659
|
-
|
660
|
-
*
|
661
|
-
* @param {function} [listener] The callback associated with the subscribed event.
|
662
|
-
*/
|
663
|
-
|
664
|
-
}, {
|
665
|
-
key: "offInit",
|
666
|
-
value: function offInit(listener) {
|
667
|
-
this.off(_ArkhamConstants.ArkhamConstants.INIT, listener);
|
238
|
+
if (!!middleware && middleware.length) {
|
239
|
+
this.addMiddleware(middleware);
|
668
240
|
}
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
*/
|
675
|
-
|
676
|
-
}, {
|
677
|
-
key: "off",
|
678
|
-
value: function off(eventType, listener) {
|
679
|
-
return this.removeListener(eventType, listener);
|
241
|
+
const windowProperty = "arkhamjs";
|
242
|
+
if (debug) {
|
243
|
+
window[windowProperty] = this;
|
244
|
+
} else {
|
245
|
+
delete window[windowProperty];
|
680
246
|
}
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
key: "on",
|
690
|
-
value: function on(eventType, listener) {
|
691
|
-
return this.addListener(eventType, listener);
|
247
|
+
this.isInit = true;
|
248
|
+
this.emit(import_ArkhamConstants.ArkhamConstants.INIT);
|
249
|
+
return this;
|
250
|
+
}
|
251
|
+
onInit(listener) {
|
252
|
+
this.on(import_ArkhamConstants.ArkhamConstants.INIT, listener);
|
253
|
+
if (this.isInit) {
|
254
|
+
listener();
|
692
255
|
}
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
case 0:
|
712
|
-
registeredStores = stores.map(function (store) {
|
713
|
-
return _this7.register(store);
|
714
|
-
}); // Save cache in session storage
|
715
|
-
|
716
|
-
_this$options3 = this.options, name = _this$options3.name, storage = _this$options3.storage;
|
717
|
-
|
718
|
-
if (!storage) {
|
719
|
-
_context4.next = 11;
|
720
|
-
break;
|
721
|
-
}
|
722
|
-
|
723
|
-
_context4.prev = 3;
|
724
|
-
_context4.next = 6;
|
725
|
-
return storage.setStorageData(name, this.state);
|
726
|
-
|
727
|
-
case 6:
|
728
|
-
_context4.next = 11;
|
729
|
-
break;
|
730
|
-
|
731
|
-
case 8:
|
732
|
-
_context4.prev = 8;
|
733
|
-
_context4.t0 = _context4["catch"](3);
|
734
|
-
throw _context4.t0;
|
735
|
-
|
736
|
-
case 11:
|
737
|
-
return _context4.abrupt("return", registeredStores);
|
738
|
-
|
739
|
-
case 12:
|
740
|
-
case "end":
|
741
|
-
return _context4.stop();
|
742
|
-
}
|
743
|
-
}
|
744
|
-
}, _callee4, this, [[3, 8]]);
|
745
|
-
}));
|
746
|
-
|
747
|
-
function addStores(_x3) {
|
748
|
-
return _addStores.apply(this, arguments);
|
256
|
+
}
|
257
|
+
offInit(listener) {
|
258
|
+
this.off(import_ArkhamConstants.ArkhamConstants.INIT, listener);
|
259
|
+
}
|
260
|
+
off(eventType, listener) {
|
261
|
+
return this.removeListener(eventType, listener);
|
262
|
+
}
|
263
|
+
on(eventType, listener) {
|
264
|
+
return this.addListener(eventType, listener);
|
265
|
+
}
|
266
|
+
async addStores(stores) {
|
267
|
+
const registeredStores = stores.map((store) => this.register(store));
|
268
|
+
const { name, storage } = this.options;
|
269
|
+
if (storage) {
|
270
|
+
try {
|
271
|
+
await storage.setStorageData(name, this.state);
|
272
|
+
} catch (error) {
|
273
|
+
throw error;
|
749
274
|
}
|
750
|
-
|
751
|
-
return addStores;
|
752
|
-
}()
|
753
|
-
/**
|
754
|
-
* Remove middleware from framework.
|
755
|
-
*
|
756
|
-
* @param {array} string middleware names to remove.
|
757
|
-
* @returns {Promise<object[]>} the class object(s).
|
758
|
-
*/
|
759
|
-
|
760
|
-
}, {
|
761
|
-
key: "removeMiddleware",
|
762
|
-
value: function removeMiddleware(names) {
|
763
|
-
var _this8 = this;
|
764
|
-
|
765
|
-
names.forEach(function (name) {
|
766
|
-
// Remove middleware plugins
|
767
|
-
_this8.pluginTypes.forEach(function (type) {
|
768
|
-
_this8.middleware["".concat(type, "List")] = _this8.removePlugin(type, name);
|
769
|
-
});
|
770
|
-
});
|
771
275
|
}
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
return regeneratorRuntime.wrap(function _callee5$(_context5) {
|
790
|
-
while (1) {
|
791
|
-
switch (_context5.prev = _context5.next) {
|
792
|
-
case 0:
|
793
|
-
clearStorage = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : true;
|
794
|
-
_this$options4 = this.options, name = _this$options4.name, storage = _this$options4.storage; // Clear persistent cache
|
795
|
-
|
796
|
-
if (!(storage && clearStorage)) {
|
797
|
-
_context5.next = 11;
|
798
|
-
break;
|
799
|
-
}
|
800
|
-
|
801
|
-
_context5.prev = 3;
|
802
|
-
_context5.next = 6;
|
803
|
-
return storage.setStorageData(name, {});
|
804
|
-
|
805
|
-
case 6:
|
806
|
-
_context5.next = 11;
|
807
|
-
break;
|
808
|
-
|
809
|
-
case 8:
|
810
|
-
_context5.prev = 8;
|
811
|
-
_context5.t0 = _context5["catch"](3);
|
812
|
-
throw _context5.t0;
|
813
|
-
|
814
|
-
case 11:
|
815
|
-
// Clear all properties
|
816
|
-
this.middleware = {};
|
817
|
-
this.options = _objectSpread({}, this.defaultOptions);
|
818
|
-
this.state = {};
|
819
|
-
this.storeActions = {};
|
820
|
-
this.isInit = false;
|
821
|
-
|
822
|
-
case 16:
|
823
|
-
case "end":
|
824
|
-
return _context5.stop();
|
825
|
-
}
|
826
|
-
}
|
827
|
-
}, _callee5, this, [[3, 8]]);
|
828
|
-
}));
|
829
|
-
|
830
|
-
function reset() {
|
831
|
-
return _reset.apply(this, arguments);
|
832
|
-
}
|
833
|
-
|
834
|
-
return reset;
|
835
|
-
}()
|
836
|
-
/**
|
837
|
-
* Sets the current state object.
|
838
|
-
*
|
839
|
-
* @param {string|array} [name] The name of the store to set. You can also use an array to specify a property path
|
840
|
-
* within the object.
|
841
|
-
* @param {any} [value] The value to set.
|
842
|
-
*/
|
843
|
-
|
844
|
-
}, {
|
845
|
-
key: "setState",
|
846
|
-
value: function setState() {
|
847
|
-
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
848
|
-
var value = arguments.length > 1 ? arguments[1] : undefined;
|
849
|
-
|
850
|
-
if (!!path) {
|
851
|
-
this.state = (0, _set["default"])(path, (0, _cloneDeep["default"])(value), this.state);
|
852
|
-
} // Update persistent cache
|
853
|
-
|
854
|
-
|
855
|
-
var storage = this.options.storage;
|
856
|
-
|
857
|
-
if (storage) {
|
858
|
-
return this.updateStorage();
|
276
|
+
return registeredStores;
|
277
|
+
}
|
278
|
+
removeMiddleware(names) {
|
279
|
+
names.forEach((name) => {
|
280
|
+
this.pluginTypes.forEach((type) => {
|
281
|
+
this.middleware[`${type}List`] = this.removePlugin(type, name);
|
282
|
+
});
|
283
|
+
});
|
284
|
+
}
|
285
|
+
async reset(clearStorage = true) {
|
286
|
+
const { name, storage } = this.options;
|
287
|
+
if (storage && clearStorage) {
|
288
|
+
try {
|
289
|
+
await storage.setStorageData(name, {});
|
290
|
+
} catch (error) {
|
291
|
+
throw error;
|
859
292
|
}
|
860
|
-
|
861
|
-
return Promise.resolve(false);
|
862
293
|
}
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
var exists = !!list.filter(function (obj) {
|
873
|
-
return obj.name === name;
|
874
|
-
}).length; // Do not add duplicate plugins
|
875
|
-
|
876
|
-
if (!exists) {
|
877
|
-
list.push({
|
878
|
-
method: method,
|
879
|
-
name: name
|
880
|
-
});
|
881
|
-
}
|
882
|
-
} else if (method !== undefined) {
|
883
|
-
throw Error("".concat(plugin.name, " middleware is not configured properly. Method is not a function."));
|
884
|
-
}
|
885
|
-
|
886
|
-
return list;
|
294
|
+
this.middleware = {};
|
295
|
+
this.options = __spreadValues({}, this.defaultOptions);
|
296
|
+
this.state = {};
|
297
|
+
this.storeActions = {};
|
298
|
+
this.isInit = false;
|
299
|
+
}
|
300
|
+
setState(path = "", value) {
|
301
|
+
if (!!path) {
|
302
|
+
this.state = (0, import_set.default)(path, (0, import_cloneDeep.default)(value), this.state);
|
887
303
|
}
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
892
|
-
delete this.storeActions[name];
|
893
|
-
delete this.state[name];
|
304
|
+
const { storage } = this.options;
|
305
|
+
if (storage) {
|
306
|
+
return this.updateStorage();
|
894
307
|
}
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
308
|
+
return Promise.resolve(false);
|
309
|
+
}
|
310
|
+
addPlugin(type, plugin) {
|
311
|
+
const list = this.middleware[`${type}List`] || [];
|
312
|
+
const { method, name } = plugin;
|
313
|
+
if (method && typeof method === "function") {
|
314
|
+
const exists = !!list.filter((obj) => obj.name === name).length;
|
315
|
+
if (!exists) {
|
316
|
+
list.push({ method, name });
|
900
317
|
}
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
if (!isFnc) {
|
905
|
-
throw Error("".concat(storeFn, " is not a store function. Cannot register with Flux."));
|
906
|
-
} // Create store object
|
907
|
-
|
908
|
-
|
909
|
-
var name = storeFn.name;
|
910
|
-
var initialState = storeFn();
|
911
|
-
var storeAction = {
|
912
|
-
action: storeFn,
|
913
|
-
initialState: storeFn(),
|
914
|
-
name: name
|
915
|
-
};
|
916
|
-
|
917
|
-
if (!(0, _isEmpty["default"])(name) && !this.storeActions[name]) {
|
918
|
-
// Save store object
|
919
|
-
this.storeActions[name] = storeAction; // Get default values
|
920
|
-
|
921
|
-
if (!this.state[name]) {
|
922
|
-
if (initialState) {
|
923
|
-
this.state[name] = (0, _cloneDeep["default"])(initialState);
|
924
|
-
} else {
|
925
|
-
this.state[name] = {};
|
926
|
-
}
|
927
|
-
}
|
928
|
-
} // Return store class
|
929
|
-
|
930
|
-
|
931
|
-
return this.storeActions[name];
|
318
|
+
} else if (method !== void 0) {
|
319
|
+
throw Error(`${plugin.name} middleware is not configured properly. Method is not a function.`);
|
932
320
|
}
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
321
|
+
return list;
|
322
|
+
}
|
323
|
+
deregister(name = "") {
|
324
|
+
delete this.storeActions[name];
|
325
|
+
delete this.state[name];
|
326
|
+
}
|
327
|
+
register(storeFn) {
|
328
|
+
if (!storeFn) {
|
329
|
+
throw Error("Store is undefined. Cannot register with Flux.");
|
330
|
+
}
|
331
|
+
const isFnc = typeof storeFn === "function";
|
332
|
+
if (!isFnc) {
|
333
|
+
throw Error(`${storeFn} is not a store function. Cannot register with Flux.`);
|
334
|
+
}
|
335
|
+
const { name } = storeFn;
|
336
|
+
const initialState = storeFn();
|
337
|
+
const storeAction = {
|
338
|
+
action: storeFn,
|
339
|
+
initialState: storeFn(),
|
340
|
+
name
|
341
|
+
};
|
342
|
+
if (!(0, import_isEmpty.default)(name) && !this.storeActions[name]) {
|
343
|
+
this.storeActions[name] = storeAction;
|
344
|
+
if (!this.state[name]) {
|
345
|
+
if (initialState) {
|
346
|
+
this.state[name] = (0, import_cloneDeep.default)(initialState);
|
347
|
+
} else {
|
348
|
+
this.state[name] = {};
|
349
|
+
}
|
350
|
+
}
|
941
351
|
}
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
_context6.next = 21;
|
958
|
-
break;
|
959
|
-
}
|
960
|
-
|
961
|
-
_context6.prev = 2;
|
962
|
-
_context6.t1 = state;
|
963
|
-
|
964
|
-
if (_context6.t1) {
|
965
|
-
_context6.next = 8;
|
966
|
-
break;
|
967
|
-
}
|
968
|
-
|
969
|
-
_context6.next = 7;
|
970
|
-
return storage.getStorageData(name);
|
971
|
-
|
972
|
-
case 7:
|
973
|
-
_context6.t1 = _context6.sent;
|
974
|
-
|
975
|
-
case 8:
|
976
|
-
_context6.t0 = _context6.t1;
|
977
|
-
|
978
|
-
if (_context6.t0) {
|
979
|
-
_context6.next = 11;
|
980
|
-
break;
|
981
|
-
}
|
982
|
-
|
983
|
-
_context6.t0 = {};
|
984
|
-
|
985
|
-
case 11:
|
986
|
-
this.state = _context6.t0;
|
987
|
-
this.updateStorage = (0, _debounce["default"])(function () {
|
988
|
-
return storage.setStorageData(name, _this9.state);
|
989
|
-
}, storageWait, {
|
990
|
-
leading: true,
|
991
|
-
trailing: true
|
992
|
-
});
|
993
|
-
_context6.next = 19;
|
994
|
-
break;
|
995
|
-
|
996
|
-
case 15:
|
997
|
-
_context6.prev = 15;
|
998
|
-
_context6.t2 = _context6["catch"](2);
|
999
|
-
console.error("ArkhamJS Error: Using storage, \"".concat(name, "\"."));
|
1000
|
-
throw _context6.t2;
|
1001
|
-
|
1002
|
-
case 19:
|
1003
|
-
_context6.next = 22;
|
1004
|
-
break;
|
1005
|
-
|
1006
|
-
case 21:
|
1007
|
-
this.state = state || {};
|
1008
|
-
|
1009
|
-
case 22:
|
1010
|
-
return _context6.abrupt("return", null);
|
1011
|
-
|
1012
|
-
case 23:
|
1013
|
-
case "end":
|
1014
|
-
return _context6.stop();
|
1015
|
-
}
|
1016
|
-
}
|
1017
|
-
}, _callee6, this, [[2, 15]]);
|
1018
|
-
}));
|
1019
|
-
|
1020
|
-
function useStorage(_x4) {
|
1021
|
-
return _useStorage.apply(this, arguments);
|
352
|
+
return this.storeActions[name];
|
353
|
+
}
|
354
|
+
removePlugin(type, name) {
|
355
|
+
const list = this.middleware[`${type}List`] || [];
|
356
|
+
return list.filter((obj) => obj.name !== name);
|
357
|
+
}
|
358
|
+
async useStorage(name) {
|
359
|
+
const { storage, state, storageWait } = this.options;
|
360
|
+
if (storage) {
|
361
|
+
try {
|
362
|
+
this.state = state || await storage.getStorageData(name) || {};
|
363
|
+
this.updateStorage = (0, import_debounce.default)(() => storage.setStorageData(name, this.state), storageWait, { leading: true, trailing: true });
|
364
|
+
} catch (error) {
|
365
|
+
console.error(`ArkhamJS Error: Using storage, "${name}".`);
|
366
|
+
throw error;
|
1022
367
|
}
|
1023
|
-
|
1024
|
-
|
1025
|
-
}
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
exports
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1037
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9GbHV4L0ZsdXgudHMiXSwibmFtZXMiOlsiRmx1eEZyYW1ld29yayIsIm5hbWUiLCJyb3V0ZXJUeXBlIiwic2Nyb2xsVG9Ub3AiLCJzdGF0ZSIsInN0b3JhZ2UiLCJzdG9yYWdlV2FpdCIsInN0b3JlcyIsInRpdGxlIiwiZGVmYXVsdE9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkZE1pZGRsZXdhcmUiLCJiaW5kIiwiYWRkU3RvcmVzIiwiY2xlYXJBcHBEYXRhIiwiY2xlYXJNaWRkbGV3YXJlIiwiZGVyZWdpc3RlciIsImRpc3BhdGNoIiwiZ2V0T3B0aW9ucyIsImdldFN0YXRlIiwiZ2V0U3RvcmUiLCJpbml0Iiwib2ZmIiwicmVnaXN0ZXIiLCJyZW1vdmVNaWRkbGV3YXJlIiwicmVtb3ZlU3RvcmVzIiwicmVzZXQiLCJzZXRTdGF0ZSIsInBsdWdpblR5cGVzIiwiZm9yRWFjaCIsInR5cGUiLCJtaWRkbGV3YXJlIiwibWlkZGxlT2JqIiwibWlkZGxlTmFtZSIsIkVycm9yIiwibWV0aG9kIiwicGx1Z2luIiwiYWRkUGx1Z2luIiwiT2JqZWN0Iiwia2V5cyIsInN0b3JlQWN0aW9ucyIsInN0b3JlTmFtZSIsInN0b3JlRm4iLCJpbml0aWFsU3RhdGUiLCJvcHRpb25zIiwic2V0U3RvcmFnZURhdGEiLCJwbHVnaW5UeXBlIiwic3RvcmVOYW1lcyIsImFjdGlvbiIsInNpbGVudCIsImNsb25lZEFjdGlvbiIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJzdGFjayIsInN0YWNrUHJvcGVydHkiLCJzdGFja1RyYWNlTGltaXQiLCJJbmZpbml0eSIsIkVycm9yU3RhY2tQYXJzZXIiLCJwYXJzZSIsImVycm9yIiwiYXBwSW5mbyIsImR1cmF0aW9uIiwicG9zdERpc3BhdGNoTGlzdCIsInByZURpc3BhdGNoTGlzdCIsImxlbmd0aCIsImFsbCIsIm1hcCIsInRoZW4iLCJhY3Rpb25zIiwicmVkdWNlIiwidXBkYXRlZEFjdGlvbiIsImRhdGEiLCJjb25zb2xlIiwid2FybiIsInVwZGF0ZVN0b3JhZ2UiLCJlbmRUaW1lIiwiZW1pdCIsInBhdGgiLCJkZWZhdWx0VmFsdWUiLCJzdG9yZVZhbHVlIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJpc0luaXQiLCJ1cGRhdGVkT3B0aW9ucyIsImRlYnVnIiwidXNlU3RvcmFnZSIsIndpbmRvd1Byb3BlcnR5Iiwid2luZG93IiwiQXJraGFtQ29uc3RhbnRzIiwiSU5JVCIsImxpc3RlbmVyIiwib24iLCJldmVudFR5cGUiLCJyZW1vdmVMaXN0ZW5lciIsImFkZExpc3RlbmVyIiwicmVnaXN0ZXJlZFN0b3JlcyIsInN0b3JlIiwibmFtZXMiLCJyZW1vdmVQbHVnaW4iLCJjbGVhclN0b3JhZ2UiLCJsaXN0IiwiZXhpc3RzIiwiZmlsdGVyIiwib2JqIiwicHVzaCIsImlzRm5jIiwic3RvcmVBY3Rpb24iLCJnZXRTdG9yYWdlRGF0YSIsImxlYWRpbmciLCJ0cmFpbGluZyIsIkV2ZW50RW1pdHRlciIsIkZsdXgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7SUFDYUEsYTs7Ozs7QUFHWDtBQUVBOztBQWVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0UsMkJBQWM7QUFBQTs7QUFBQTs7QUFDWiw4QkFEWSxDQUdaOztBQUhZLDZEQXpCSSxLQXlCSjs7QUFBQSxrRUF2QlUsQ0FBQyxhQUFELEVBQWdCLGNBQWhCLENBdUJWOztBQUFBLDREQXJCTyxFQXFCUDs7QUFBQSxtRUFwQmMsRUFvQmQ7O0FBQUEscUVBbkJ3QjtBQUNwQ0MsTUFBQUEsSUFBSSxFQUFFLFVBRDhCO0FBRXBDQyxNQUFBQSxVQUFVLEVBQUUsU0FG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QU1NLHFCQUFLRyxLQU5YO0FBT00scUJBQUt3RSxhQUFMLEdBQXFCLDBCQUNuQjtBQUFBLHlCQUFNdkUsT0FBTyxDQUFDeUMsY0FBUixDQUF1QjdDLElBQXZCLEVBQTZCLE1BQUksQ0FBQ0csS0FBbEMsQ0FBTjtBQUFBLGlCQURtQixFQUVuQkUsV0FGbUIsRUFHbkI7QUFBQ3dHLGtCQUFBQSxPQUFPLEVBQUUsSUFBVjtBQUFnQkMsa0JBQUFBLFFBQVEsRUFBRTtBQUExQixpQkFIbUIsQ0FBckI7QUFQTjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWFNckMsZ0JBQUFBLE9BQU8sQ0FBQ2IsS0FBUiw0Q0FBaUQ1RCxJQUFqRDtBQWJOOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQWlCSSxxQkFBS0csS0FBTCxHQUFhQSxLQUFLLElBQUksRUFBdEI7O0FBakJKO0FBQUEsa0RBb0JTLElBcEJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7Ozs7O0VBcmhCaUM0RyxvQjs7OztnQkFBdEJoSCxhLGNBQ2dCLEs7O0FBNGlCdEIsSUFBTWlILElBQW1CLEdBQUcsSUFBSWpILGFBQUosRUFBNUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IEVycm9yU3RhY2tQYXJzZXIgZnJvbSAnZXJyb3Itc3RhY2stcGFyc2VyJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9mcC9jbG9uZURlZXAnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZnAvZ2V0JztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9mcC9pc0VtcHR5JztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvZnAvbWVyZ2UnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2gvZnAvc2V0JztcblxuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMnO1xuaW1wb3J0IHtGbHV4QWN0aW9uLCBGbHV4TWlkZGxld2FyZVR5cGUsIEZsdXhPcHRpb25zLCBGbHV4UGx1Z2luVHlwZSwgRmx1eFN0b3JlfSBmcm9tICcuL0ZsdXgudHlwZXMnO1xuXG4vKipcbiAqIEZsdXhGcmFtZXdvcmtcbiAqIEB0eXBlIHtFdmVudEVtaXR0ZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBGbHV4RnJhbWV3b3JrIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIGluaXRGbHV4OiBib29sZWFuID0gZmFsc2U7XG4gIGlzSW5pdDogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBQdWJsaWMgcHJvcGVydGllc1xuICBwbHVnaW5UeXBlczogc3RyaW5nW10gPSBbJ3ByZURpc3BhdGNoJywgJ3Bvc3REaXNwYXRjaCddO1xuICAvLyBQcml2YXRlIHByb3BlcnRpZXNcbiAgcHJpdmF0ZSBzdGF0ZTogYW55ID0ge307XG4gIHByaXZhdGUgc3RvcmVBY3Rpb25zOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBkZWZhdWx0T3B0aW9uczogRmx1eE9wdGlvbnMgPSB7XG4gICAgbmFtZTogJ2Fya2hhbWpzJyxcbiAgICByb3V0ZXJUeXBlOiAnYnJvd3NlcicsXG4gICAgc2Nyb2xsVG9Ub3A6IHRydWUsXG4gICAgc3RhdGU6IG51bGwsXG4gICAgc3RvcmFnZTogbnVsbCxcbiAgICBzdG9yYWdlV2FpdDogMzAwLFxuICAgIHN0b3JlczogW10sXG4gICAgdGl0bGU6ICdBcmtoYW1KUydcbiAgfTtcbiAgcHJpdmF0ZSBtaWRkbGV3YXJlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGbHV4T3B0aW9ucyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgRmx1eC4gIE5vdGUgdGhhdCB0aGUgRmx1eCBvYmplY3RcbiAgICogaXMgYSBTaW5nbGV0b24gcGF0dGVybiwgc28gb25seSBvbmUgc2hvdWxkIGV2ZXIgZXhpc3QuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAdGhpcyB7Rmx1eEZyYW1ld29ya31cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBNZXRob2RzXG4gICAgdGhpcy5hZGRNaWRkbGV3YXJlID0gdGhpcy5hZGRNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRTdG9yZXMgPSB0aGlzLmFkZFN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xlYXJBcHBEYXRhID0gdGhpcy5jbGVhckFwcERhdGEuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyTWlkZGxld2FyZSA9IHRoaXMuY2xlYXJNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kZXJlZ2lzdGVyID0gdGhpcy5kZXJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0YXRlID0gdGhpcy5nZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0U3RvcmUgPSB0aGlzLmdldFN0b3JlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pbml0ID0gdGhpcy5pbml0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5vZmYgPSB0aGlzLm9mZi5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXIgPSB0aGlzLnJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVNaWRkbGV3YXJlID0gdGhpcy5yZW1vdmVNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVTdG9yZXMgPSB0aGlzLnJlbW92ZVN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVzZXQgPSB0aGlzLnJlc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEFkZCBtaWRkbGV3YXJlIHBsdWdpbiB0eXBlc1xuICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG1pZGRsZXdhcmUgdG8gZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBtaWRkbGV3YXJlIEFuIGFycmF5IG9mIG1pZGRsZXdhcmUgdG8gYWRkIHRvIHRoZSBmcmFtZXdvcmsuXG4gICAqL1xuICBhZGRNaWRkbGV3YXJlKG1pZGRsZXdhcmU6IEZsdXhNaWRkbGV3YXJlVHlwZVtdKTogdm9pZCB7XG4gICAgbWlkZGxld2FyZS5mb3JFYWNoKChtaWRkbGVPYmo6IEZsdXhNaWRkbGV3YXJlVHlwZSkgPT4ge1xuICAgICAgLy8gTWFrZSBzdXJlIG1pZGRsZXdhcmUgaXMgZWl0aGVyIGEgY2xhc3Mgb3Igb2JqZWN0LlxuICAgICAgaWYoISFtaWRkbGVPYmogJiYgKCh0eXBlb2YgbWlkZGxlT2JqID09PSAnZnVuY3Rpb24nKSB8fCAodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ29iamVjdCcpKSkge1xuICAgICAgICBjb25zdCBtaWRkbGVOYW1lOiBzdHJpbmcgPSBtaWRkbGVPYmoubmFtZSB8fCAnJztcblxuICAgICAgICBpZighbWlkZGxlTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIFJlcXVpcmVzIG5hbWUgcHJvcGVydHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgbWlkZGxld2FyZSBwbHVnaW5zIGZvciBlZmZpY2llbmN5XG4gICAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gbWlkZGxlT2JqW3R5cGVdO1xuICAgICAgICAgIGNvbnN0IHBsdWdpbjogRmx1eFBsdWdpblR5cGUgPSB7bWV0aG9kLCBuYW1lOiBtaWRkbGVOYW1lfTtcbiAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLmFkZFBsdWdpbih0eXBlLCBwbHVnaW4pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGFwcCBkYXRhIGZyb20gc3RvcmFnZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYXBwIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgY2xlYXJBcHBEYXRhKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNldCBhbGwgc3RvcmUgZGF0YSB0byBpbml0aWFsIHN0YXRlXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZUZuLm5hbWVdID0gY2xvbmVEZWVwKHN0b3JlRm4uaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIG1pZGRsZXdhcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG1pZGRsZXdhcmUgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgY2xlYXJNaWRkbGV3YXJlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNldCBhbGwgc3RvcmUgZGF0YSB0byBpbml0aWFsIHN0YXRlXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLm1pZGRsZXdhcmUpXG4gICAgICAuZm9yRWFjaCgocGx1Z2luVHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtwbHVnaW5UeXBlXSA9IFtdO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZS1yZWdpc3RlcnMgbmFtZWQgc3RvcmVzLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdG9yZU5hbWVzIEFuIGFycmF5IG9mIHN0b3JlIG5hbWVzIHRvIHJlbW92ZSBmcm9tIHRoZSBmcmFtZXdvcmsuXG4gICAqL1xuICByZW1vdmVTdG9yZXMoc3RvcmVOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBzdG9yZU5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4gdGhpcy5kZXJlZ2lzdGVyKG5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbiB0byBhbGwgc3RvcmVzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYWN0aW9uIHRvIGRpc3BhdGNoIHRvIGFsbCB0aGUgc3RvcmVzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudCBUbyBzaWxlbmNlIGFueSBldmVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aGVuIGFuZCBpZiB0aGUgYXBwIHNhdmVzIGRhdGEgdG8gc3RvcmFnZSwgcmV0dXJuaW5nXG4gICAqIHRoZSBhY3Rpb24uXG4gICAqL1xuICBhc3luYyBkaXNwYXRjaChhY3Rpb246IEZsdXhBY3Rpb24sIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiB7XG4gICAgaWYoIWFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmtoYW1KUyBFcnJvcjogRmx1eC5kaXNwYXRjaCByZXF1aXJlcyBhbiBhY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IGNsb25lZEFjdGlvbjogRmx1eEFjdGlvbiA9IGNsb25lRGVlcChhY3Rpb24pO1xuXG4gICAgLy8gTG9nIGR1cmF0aW9uIG9mIGRpc3BhdGNoXG4gICAgY29uc3Qgc3RhcnRUaW1lOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gICAgLy8gR2V0IHN0YWNrXG4gICAgbGV0IHN0YWNrID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhY2tQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YWNrVHJhY2VMaW1pdCc7XG4gICAgICBjb25zdCB7c3RhY2tUcmFjZUxpbWl0fTogYW55ID0gRXJyb3I7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IEluZmluaXR5O1xuICAgICAgc3RhY2sgPSBFcnJvclN0YWNrUGFyc2VyLnBhcnNlKG5ldyBFcnJvcigpKTtcbiAgICAgIEVycm9yW3N0YWNrUHJvcGVydHldID0gc3RhY2tUcmFjZUxpbWl0O1xuICAgIH0gY2F0Y2goZXJyb3IpIHt9XG5cbiAgICAvLyBHZXQgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjbG9uZURlZXAodGhpcy5vcHRpb25zKTtcblxuICAgIC8vIEFwcCBpbmZvXG4gICAgY29uc3QgYXBwSW5mbyA9IHtkdXJhdGlvbjogMCwgb3B0aW9ucywgc3RhY2t9O1xuXG4gICAgLy8gQXBwbHkgbWlkZGxld2FyZSBiZWZvcmUgdGhlIGFjdGlvbiBpcyBwcm9jZXNzZWRcbiAgICBjb25zdCB7cG9zdERpc3BhdGNoTGlzdCA9IFtdLCBwcmVEaXNwYXRjaExpc3QgPSBbXX0gPSB0aGlzLm1pZGRsZXdhcmU7XG5cbiAgICBpZihwcmVEaXNwYXRjaExpc3QubGVuZ3RoKSB7XG4gICAgICBjbG9uZWRBY3Rpb24gPSBhd2FpdCBQcm9taXNlXG4gICAgICAgIC5hbGwoXG4gICAgICAgICAgcHJlRGlzcGF0Y2hMaXN0Lm1hcCgocGx1Z2luOiBGbHV4UGx1Z2luVHlwZSkgPT4gcGx1Z2luLm1ldGhvZChcbiAgICAgICAgICAgIGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7dHlwZSwgLi4uZGF0YX0gPSBjbG9uZWRBY3Rpb247XG5cbiAgICAvLyBSZXF1aXJlIGEgdHlwZVxuICAgIGlmKCF0eXBlIHx8IHR5cGUgPT09ICcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fya2hhbUpTIFdhcm5pbmc6IEZsdXguZGlzcGF0Y2ggaXMgbWlzc2luZyBhbiBhY3Rpb24gdHlwZSBmb3IgdGhlIHBheWxvYWQ6JywgZGF0YSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhbiBhY3Rpb24gY29tZXMgaW4sIGl0IG11c3QgYmUgY29tcGxldGVseSBoYW5kbGVkIGJ5IGFsbCBzdG9yZXNcbiAgICBPYmplY3RcbiAgICAgIC5rZXlzKHRoaXMuc3RvcmVBY3Rpb25zKVxuICAgICAgLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlRm4gPSB0aGlzLnN0b3JlQWN0aW9uc1tzdG9yZU5hbWVdO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNsb25lRGVlcCh0aGlzLnN0YXRlW3N0b3JlTmFtZV0pIHx8IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSkgfHwge307XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVOYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmFjdGlvbih0eXBlLCBkYXRhLCBzdGF0ZSkpIHx8IHN0YXRlO1xuICAgICAgfSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHN0b3JhZ2VcbiAgICBjb25zdCB7c3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHt9XG4gICAgfVxuXG4gICAgY29uc3QgZW5kVGltZTogbnVtYmVyID0gKyhuZXcgRGF0ZSgpKTtcbiAgICBjb25zdCBkdXJhdGlvbjogbnVtYmVyID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICBhcHBJbmZvLmR1cmF0aW9uID0gZHVyYXRpb247XG5cbiAgICBpZihwb3N0RGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHBvc3REaXNwYXRjaExpc3QubWFwKFxuICAgICAgICAgICAgYXN5bmMgKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoY2xvbmVEZWVwKGNsb25lZEFjdGlvbiksIGNsb25lRGVlcCh0aGlzLnN0YXRlKSwgYXBwSW5mbylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKGFjdGlvbnMpID0+IGFjdGlvbnMucmVkdWNlKCh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pID0+XG4gICAgICAgICAgICBtZXJnZSh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pLCBjbG9uZWRBY3Rpb24pIGFzIEZsdXhBY3Rpb25cbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZW1pdCh0eXBlLCBjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmVkQWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgRmx1eCBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Rmx1eE9wdGlvbnN9IHRoZSBGbHV4IG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIChvcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlIGZvciBhbiBvYmplY3QsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBhbGwgc3RvcmVcbiAgICogICBvYmplY3RzLiBZb3UgY2FuIGFsc28gdXNlIGFuIGFycmF5IHRvIHNwZWNpZnkgYSBwcm9wZXJ0eSBwYXRoIHdpdGhpbiB0aGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2FueX0gW2RlZmF1bHRWYWx1ZV0gKG9wdGlvbmFsKSBBIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG51bGwuXG4gICAqIEByZXR1cm5zIHthbnl9IHRoZSBzdGF0ZSBvYmplY3Qgb3IgYSBwcm9wZXJ0eSB2YWx1ZSB3aXRoaW4uXG4gICAqL1xuICBnZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCBkZWZhdWx0VmFsdWU/KTogYW55IHtcbiAgICBsZXQgc3RvcmVWYWx1ZTtcblxuICAgIGlmKCFwYXRoKSB7XG4gICAgICBzdG9yZVZhbHVlID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVWYWx1ZSA9IGdldChwYXRoLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlVmFsdWUgPyBjbG9uZURlZXAoc3RvcmVWYWx1ZSkgOiBzdG9yZVZhbHVlO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RvcmUgb2JqZWN0IHJlZ2lzdGVyZWQgd2l0aCBGbHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3RvcmUuXG4gICAqIEByZXR1cm5zIHtGbHV4U3RvcmV9IHRoZSBzdG9yZSBvYmplY3QuXG4gICAqL1xuICBnZXRTdG9yZShuYW1lOiBzdHJpbmcgPSAnJyk6IEZsdXhTdG9yZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICovXG4gIGFzeW5jIGluaXQob3B0aW9uczogRmx1eE9wdGlvbnMgPSB7fSwgcmVzZXQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEZyYW1ld29yaz4ge1xuICAgIC8vIFNob3VsZCByZXNldCBwcmV2aW91cyBwYXJhbXNcbiAgICBpZihyZXNldCkge1xuICAgICAgdGhpcy5pc0luaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCBvcHRpb25zXG4gICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7Li4ub3B0aW9uc307XG5cbiAgICBpZih0aGlzLmlzSW5pdCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gb3B0aW9ucyBpZiBhbHJlYWR5IGluaXRpYWxpemVkLCBvdGhlcndpc2UgdGhlIHJvb3QgYXBwIHdpbGwgbm90IGJlIGFibGUgdG8gYWNjZXNzXG4gICAgICAvLyB0aGUgc3RhdGUgdHJlZVxuICAgICAgdXBkYXRlZE9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zLCAuLi51cGRhdGVkT3B0aW9uc307XG4gICAgY29uc3Qge2RlYnVnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yZXN9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gVXBkYXRlIGRlZmF1bHQgc3RvcmVcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51c2VTdG9yYWdlKG5hbWUpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVzaW5nIHN0b3JhZ2UuJywgbmFtZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZighIXN0b3JlcyAmJiBzdG9yZXMubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkZFN0b3JlcyhzdG9yZXMpO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhZGRpbmcgc3RvcmVzLicsIHN0b3Jlcyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKCEhbWlkZGxld2FyZSAmJiBtaWRkbGV3YXJlLmxlbmd0aCkge1xuICAgICAgdGhpcy5hZGRNaWRkbGV3YXJlKG1pZGRsZXdhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpbmRvd1Byb3BlcnR5OiBzdHJpbmcgPSAnYXJraGFtanMnO1xuXG4gICAgaWYoZGVidWcpIHtcbiAgICAgIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV0gPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgd2luZG93W3dpbmRvd1Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KEFya2hhbUNvbnN0YW50cy5JTklUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5pdGlhbGl6YXRpb24gbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvZmZJbml0KGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9mZihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byB1bnN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudFR5cGVdIEV2ZW50IHRvIHN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb24oZXZlbnRUeXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgbmV3IFN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVzIFN0b3JlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3RbXT59IHRoZSBjbGFzcyBvYmplY3QocykuXG4gICAqL1xuICBhc3luYyBhZGRTdG9yZXMoc3RvcmVzOiBhbnlbXSk6IFByb21pc2U8b2JqZWN0W10+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkU3RvcmVzOiBGbHV4U3RvcmVbXSA9IHN0b3Jlcy5tYXAoKHN0b3JlOiBGbHV4U3RvcmUpID0+IHRoaXMucmVnaXN0ZXIoc3RvcmUpKTtcblxuICAgIC8vIFNhdmUgY2FjaGUgaW4gc2Vzc2lvbiBzdG9yYWdlXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGNsYXNzZXNcbiAgICByZXR1cm4gcmVnaXN0ZXJlZFN0b3JlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbWlkZGxld2FyZSBmcm9tIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RyaW5nIG1pZGRsZXdhcmUgbmFtZXMgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3RbXT59IHRoZSBjbGFzcyBvYmplY3QocykuXG4gICAqL1xuICByZW1vdmVNaWRkbGV3YXJlKG5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIG5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgLy8gUmVtb3ZlIG1pZGRsZXdhcmUgcGx1Z2luc1xuICAgICAgdGhpcy5wbHVnaW5UeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5yZW1vdmVQbHVnaW4odHlwZSwgbmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgcmVzZXQoY2xlYXJTdG9yYWdlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIENsZWFyIHBlcnNpc3RlbnQgY2FjaGVcbiAgICBpZihzdG9yYWdlICYmIGNsZWFyU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB7fSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIGFsbCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5taWRkbGV3YXJlID0ge307XG4gICAgdGhpcy5vcHRpb25zID0gey4uLnRoaXMuZGVmYXVsdE9wdGlvbnN9O1xuICAgIHRoaXMuc3RhdGUgPSB7fTtcbiAgICB0aGlzLnN0b3JlQWN0aW9ucyA9IHt9O1xuICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBbbmFtZV0gVGhlIG5hbWUgb2YgdGhlIHN0b3JlIHRvIHNldC4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aFxuICAgKiB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFt2YWx1ZV0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHNldFN0YXRlKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdID0gJycsIHZhbHVlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYoISFwYXRoKSB7XG4gICAgICB0aGlzLnN0YXRlID0gc2V0KHBhdGgsIGNsb25lRGVlcCh2YWx1ZSksIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBwZXJzaXN0ZW50IGNhY2hlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQbHVnaW4odHlwZTogc3RyaW5nLCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcbiAgICBjb25zdCB7bWV0aG9kLCBuYW1lfSA9IHBsdWdpbjtcblxuICAgIGlmKG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBDaGVjayBpZiBwbHVnaW4gYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0czogYm9vbGVhbiA9ICEhbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lID09PSBuYW1lKS5sZW5ndGg7XG5cbiAgICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIHBsdWdpbnNcbiAgICAgIGlmKCFleGlzdHMpIHtcbiAgICAgICAgbGlzdC5wdXNoKHttZXRob2QsIG5hbWV9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3BsdWdpbi5uYW1lfSBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBNZXRob2QgaXMgbm90IGEgZnVuY3Rpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRlcmVnaXN0ZXIobmFtZTogc3RyaW5nID0gJycpOiB2b2lkIHtcbiAgICBkZWxldGUgdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuc3RhdGVbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyKHN0b3JlRm4pOiBGbHV4U3RvcmUge1xuICAgIGlmKCFzdG9yZUZuKSB7XG4gICAgICB0aHJvdyBFcnJvcignU3RvcmUgaXMgdW5kZWZpbmVkLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRm5jOiBib29sZWFuID0gdHlwZW9mIHN0b3JlRm4gPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZighaXNGbmMpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3N0b3JlRm59IGlzIG5vdCBhIHN0b3JlIGZ1bmN0aW9uLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LmApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdG9yZSBvYmplY3RcbiAgICBjb25zdCB7bmFtZX0gPSBzdG9yZUZuO1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogYW55ID0gc3RvcmVGbigpO1xuICAgIGNvbnN0IHN0b3JlQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiBzdG9yZUZuLFxuICAgICAgaW5pdGlhbFN0YXRlOiBzdG9yZUZuKCksXG4gICAgICBuYW1lXG4gICAgfTtcblxuICAgIGlmKCFpc0VtcHR5KG5hbWUpICYmICF0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSkge1xuICAgICAgLy8gU2F2ZSBzdG9yZSBvYmplY3RcbiAgICAgIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdID0gc3RvcmVBY3Rpb247XG5cbiAgICAgIC8vIEdldCBkZWZhdWx0IHZhbHVlc1xuICAgICAgaWYoIXRoaXMuc3RhdGVbbmFtZV0pIHtcbiAgICAgICAgaWYoaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IGNsb25lRGVlcChpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBzdG9yZSBjbGFzc1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGx1Z2luKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcblxuICAgIC8vIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHBsdWdpblxuICAgIHJldHVybiBsaXN0LmZpbHRlcigob2JqOiBGbHV4UGx1Z2luVHlwZSkgPT4gb2JqLm5hbWUgIT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yYWdlID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblxuICBwcml2YXRlIGFzeW5jIHVzZVN0b3JhZ2UobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge3N0b3JhZ2UsIHN0YXRlLCBzdG9yYWdlV2FpdH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDYWNoZVxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBhd2FpdCBzdG9yYWdlLmdldFN0b3JhZ2VEYXRhKG5hbWUpIHx8IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZVN0b3JhZ2UgPSBkZWJvdW5jZShcbiAgICAgICAgICAoKSA9PiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpLFxuICAgICAgICAgIHN0b3JhZ2VXYWl0LFxuICAgICAgICAgIHtsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZX1cbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQXJraGFtSlMgRXJyb3I6IFVzaW5nIHN0b3JhZ2UsIFwiJHtuYW1lfVwiLmApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGbHV4OiBGbHV4RnJhbWV3b3JrID0gbmV3IEZsdXhGcmFtZXdvcmsoKTtcbiJdfQ==
|
368
|
+
} else {
|
369
|
+
this.state = state || {};
|
370
|
+
}
|
371
|
+
return null;
|
372
|
+
}
|
373
|
+
}
|
374
|
+
FluxFramework.initFlux = false;
|
375
|
+
const Flux = new FluxFramework();
|
376
|
+
module.exports = __toCommonJS(Flux_exports);
|
377
|
+
// Annotate the CommonJS export names for ESM import in node:
|
378
|
+
0 && (module.exports = {
|
379
|
+
Flux,
|
380
|
+
FluxFramework
|
381
|
+
});
|
382
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBFcnJvclN0YWNrUGFyc2VyIGZyb20gJ2Vycm9yLXN0YWNrLXBhcnNlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvZnAvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2ZwL2dldCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvZnAvaXNFbXB0eSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL2ZwL21lcmdlJztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoL2ZwL3NldCc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuLyoqXG4gKiBGbHV4RnJhbWV3b3JrXG4gKiBAdHlwZSB7RXZlbnRFbWl0dGVyfVxuICovXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgcGx1Z2luVHlwZXM6IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXTtcbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc3RhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIHN0b3JlQWN0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0YXRlOiBudWxsLFxuICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogYW55ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZsdXguICBOb3RlIHRoYXQgdGhlIEZsdXggb2JqZWN0XG4gICAqIGlzIGEgU2luZ2xldG9uIHBhdHRlcm4sIHNvIG9ubHkgb25lIHNob3VsZCBldmVyIGV4aXN0LlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHRoaXMge0ZsdXhGcmFtZXdvcmt9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBZGQgbWlkZGxld2FyZSBwbHVnaW4gdHlwZXNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtaWRkbGV3YXJlIHRvIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbWlkZGxld2FyZSBBbiBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIGFkZCB0byB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSBtaWRkbGV3YXJlIGlzIGVpdGhlciBhIGNsYXNzIG9yIG9iamVjdC5cbiAgICAgIGlmKCEhbWlkZGxlT2JqICYmICgodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtaWRkbGVPYmogPT09ICdvYmplY3QnKSkpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG5cbiAgICAgICAgaWYoIW1pZGRsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IG1pZGRsZXdhcmUgcGx1Z2lucyBmb3IgZWZmaWNpZW5jeVxuICAgICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgICBjb25zdCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlID0ge21ldGhvZCwgbmFtZTogbWlkZGxlTmFtZX07XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5hZGRQbHVnaW4odHlwZSwgcGx1Z2luKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhcHAgZGF0YSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFwcCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVGbi5uYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtaWRkbGV3YXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtaWRkbGV3YXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyTWlkZGxld2FyZSgpOiBib29sZWFuIHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5taWRkbGV3YXJlKVxuICAgICAgLmZvckVhY2goKHBsdWdpblR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGUtcmVnaXN0ZXJzIG5hbWVkIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVOYW1lcyBBbiBhcnJheSBvZiBzdG9yZSBuYW1lcyB0byByZW1vdmUgZnJvbSB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gYWxsIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiB0byBkaXNwYXRjaCB0byBhbGwgdGhlIHN0b3Jlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBzaWxlbnQgVG8gc2lsZW5jZSBhbnkgZXZlbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBhbmQgaWYgdGhlIGFwcCBzYXZlcyBkYXRhIHRvIHN0b3JhZ2UsIHJldHVybmluZ1xuICAgKiB0aGUgYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGlzcGF0Y2goYWN0aW9uOiBGbHV4QWN0aW9uLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIGlmKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIExvZyBkdXJhdGlvbiBvZiBkaXNwYXRjaFxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdldCBzdGFja1xuICAgIGxldCBzdGFjayA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gRXJyb3JTdGFja1BhcnNlci5wYXJzZShuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgICB9IGNhdGNoKGVycm9yKSB7fVxuXG4gICAgLy8gR2V0IG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY2xvbmVEZWVwKHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBBcHAgaW5mb1xuICAgIGNvbnN0IGFwcEluZm8gPSB7ZHVyYXRpb246IDAsIG9wdGlvbnMsIHN0YWNrfTtcblxuICAgIC8vIEFwcGx5IG1pZGRsZXdhcmUgYmVmb3JlIHRoZSBhY3Rpb24gaXMgcHJvY2Vzc2VkXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYocHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHByZURpc3BhdGNoTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoXG4gICAgICAgICAgICBjbG9uZURlZXAoY2xvbmVkQWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoYWN0aW9ucykgPT4gYWN0aW9ucy5yZWR1Y2UoKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbikgPT5cbiAgICAgICAgICAgIG1lcmdlKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbiksIGNsb25lZEFjdGlvbikgYXMgRmx1eEFjdGlvblxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGUsIC4uLmRhdGF9ID0gY2xvbmVkQWN0aW9uO1xuXG4gICAgLy8gUmVxdWlyZSBhIHR5cGVcbiAgICBpZighdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYW4gYWN0aW9uIGNvbWVzIGluLCBpdCBtdXN0IGJlIGNvbXBsZXRlbHkgaGFuZGxlZCBieSBhbGwgc3RvcmVzXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZURlZXAodGhpcy5zdGF0ZVtzdG9yZU5hbWVdKSB8fCBjbG9uZURlZXAoc3RvcmVGbi5pbml0aWFsU3RhdGUpIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlW3N0b3JlTmFtZV0gPSBjbG9uZURlZXAoc3RvcmVGbi5hY3Rpb24odHlwZSwgZGF0YSwgc3RhdGUpKSB8fCBzdGF0ZTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2F2ZSBjYWNoZSBpbiBzdG9yYWdlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7fVxuICAgIH1cblxuICAgIGNvbnN0IGVuZFRpbWU6IG51bWJlciA9ICsobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZHVyYXRpb246IG51bWJlciA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgYXBwSW5mby5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG4gICAgaWYocG9zdERpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IFByb21pc2VcbiAgICAgICAgLmFsbChcbiAgICAgICAgICBwb3N0RGlzcGF0Y2hMaXN0Lm1hcChcbiAgICAgICAgICAgIGFzeW5jIChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PiBwbHVnaW4ubWV0aG9kKGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZighc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge0ZsdXhPcHRpb25zfSB0aGUgRmx1eCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGdldE9wdGlvbnMoKTogRmx1eE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IFtuYW1lXSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSBmb3IgYW4gb2JqZWN0LCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYWxsIHN0b3JlXG4gICAqICAgb2JqZWN0cy4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aCB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtkZWZhdWx0VmFsdWVdIChvcHRpb25hbCkgQSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBudWxsLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgc3RhdGUgb2JqZWN0IG9yIGEgcHJvcGVydHkgdmFsdWUgd2l0aGluLlxuICAgKi9cbiAgZ2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgZGVmYXVsdFZhbHVlPyk6IGFueSB7XG4gICAgbGV0IHN0b3JlVmFsdWU7XG5cbiAgICBpZighcGF0aCkge1xuICAgICAgc3RvcmVWYWx1ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlVmFsdWUgPSBnZXQocGF0aCwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZVZhbHVlID8gY2xvbmVEZWVwKHN0b3JlVmFsdWUpIDogc3RvcmVWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0b3JlIG9iamVjdCByZWdpc3RlcmVkIHdpdGggRmx1eC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Rmx1eFN0b3JlfSB0aGUgc3RvcmUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0U3RvcmUobmFtZTogc3RyaW5nID0gJycpOiBGbHV4U3RvcmUge1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICAvLyBTaG91bGQgcmVzZXQgcHJldmlvdXMgcGFyYW1zXG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgb3B0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIG9wdGlvbnMgaWYgYWxyZWFkeSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSByb290IGFwcCB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2Vzc1xuICAgICAgLy8gdGhlIHN0YXRlIHRyZWVcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHN0b3JlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1c2luZyBzdG9yYWdlLicsIG5hbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYoISFzdG9yZXMgJiYgc3RvcmVzLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRTdG9yZXMoc3RvcmVzKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXJraGFtIEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWRkaW5nIHN0b3Jlcy4nLCBzdG9yZXMpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighIW1pZGRsZXdhcmUgJiYgbWlkZGxld2FyZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcblxuICAgIGlmKGRlYnVnKSB7XG4gICAgICB3aW5kb3dbd2luZG93UHJvcGVydHldID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvbkluaXQobGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub24oQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcblxuICAgIGlmKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50VHlwZV0gRXZlbnQgdG8gdW5zdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9mZihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byBzdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBTdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0b3JlcyBTdG9yZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogYW55W10pOiBQcm9taXNlPG9iamVjdFtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHNlc3Npb24gc3RvcmFnZVxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBjbGFzc2VzXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgcmVtb3ZlTWlkZGxld2FyZShuYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBtaWRkbGV3YXJlIHBsdWdpbnNcbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMucmVtb3ZlUGx1Z2luKHR5cGUsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdHJpbmcgbWlkZGxld2FyZSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdFtdPn0gdGhlIGNsYXNzIG9iamVjdChzKS5cbiAgICovXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDbGVhciBwZXJzaXN0ZW50IGNhY2hlXG4gICAgaWYoc3RvcmFnZSAmJiBjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMubWlkZGxld2FyZSA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zfTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdG9yZUFjdGlvbnMgPSB7fTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBzZXQuIFlvdSBjYW4gYWxzbyB1c2UgYW4gYXJyYXkgdG8gc3BlY2lmeSBhIHByb3BlcnR5IHBhdGhcbiAgICogd2l0aGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCEhcGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldChwYXRoLCBjbG9uZURlZXAodmFsdWUpLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcGVyc2lzdGVudCBjYWNoZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGx1Z2luKHR5cGU6IHN0cmluZywgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgY29uc3Qge21ldGhvZCwgbmFtZX0gPSBwbHVnaW47XG5cbiAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSAhIWxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSA9PT0gbmFtZSkubGVuZ3RoO1xuXG4gICAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSBwbHVnaW5zXG4gICAgICBpZighZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtwbHVnaW4ubmFtZX0gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gTWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcihzdG9yZUZuKTogRmx1eFN0b3JlIHtcbiAgICBpZighc3RvcmVGbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1N0b3JlIGlzIHVuZGVmaW5lZC4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZuYzogYm9vbGVhbiA9IHR5cGVvZiBzdG9yZUZuID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYoIWlzRm5jKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtzdG9yZUZufSBpcyBub3QgYSBzdG9yZSBmdW5jdGlvbi4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC5gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RvcmUgb2JqZWN0XG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogc3RvcmVGbixcbiAgICAgIGluaXRpYWxTdGF0ZTogc3RvcmVGbigpLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZighaXNFbXB0eShuYW1lKSAmJiAhdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0pIHtcbiAgICAgIC8vIFNhdmUgc3RvcmUgb2JqZWN0XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIGlmKCF0aGlzLnN0YXRlW25hbWVdKSB7XG4gICAgICAgIGlmKGluaXRpYWxTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBjbG9uZURlZXAoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc3RvcmUgY2xhc3NcbiAgICByZXR1cm4gdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsdWdpbih0eXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG5cbiAgICAvLyByZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lICE9PSBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gQ2FjaGVcbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgYXdhaXQgc3RvcmFnZS5nZXRTdG9yYWdlRGF0YShuYW1lKSB8fCB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlID0gZGVib3VuY2UoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdCxcbiAgICAgICAgICB7bGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWV9XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFya2hhbUpTIEVycm9yOiBVc2luZyBzdG9yYWdlLCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7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
|