@expressive/mvc 0.53.6 → 0.54.1

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/dist/esm/model.js CHANGED
@@ -1,278 +1,274 @@
1
- import { addListener, createEffect, event, pending, PENDING_KEYS, watch } from './control';
2
- export const define = Object.defineProperty;
3
- /** Register for all active models via string identifiers (usually unique). */
4
- const ID = new WeakMap();
5
- /** Internal state assigned to models. */
6
- const STATE = new WeakMap();
7
- /** External listeners for any given Model. */
8
- const NOTIFY = new WeakMap();
9
- /** Parent-child relationships. */
10
- const PARENT = new WeakMap();
11
- /** List of methods defined by a given type. */
12
- const METHODS = new WeakMap();
13
- /** Reference bound instance methods to real ones. */
14
- const METHOD = new WeakMap();
1
+ import { addListener, createEffect, event, pending, PENDING_KEYS, watch } from "./control";
2
+ const define = Object.defineProperty;
3
+ const ID = /* @__PURE__ */ new WeakMap();
4
+ const STATE = /* @__PURE__ */ new WeakMap();
5
+ const NOTIFY = /* @__PURE__ */ new WeakMap();
6
+ const PARENT = /* @__PURE__ */ new WeakMap();
7
+ const METHODS = /* @__PURE__ */ new WeakMap();
8
+ const METHOD = /* @__PURE__ */ new WeakMap();
15
9
  class Model {
16
- constructor(...args) {
17
- prepare(this);
18
- define(this, "is", { value: this });
19
- init(this, args);
20
- }
21
- get(arg1, arg2) {
22
- const self = this.is;
23
- if (typeof arg1 == "function") {
24
- let pending = new Set();
25
- return createEffect(self, (proxy) => {
26
- const cb = arg1.call(proxy, proxy, pending);
27
- return cb === null ? null : ((update) => {
28
- pending = PENDING_KEYS.get(self);
29
- if (typeof cb == "function")
30
- cb(update);
31
- });
32
- });
33
- }
34
- if (arg1 === undefined)
35
- return snapshot(self);
36
- if (typeof arg2 == "function")
37
- return addListener(self, arg2, arg1);
38
- return arg1 === null
39
- ? Object.isFrozen(STATE.get(self))
40
- : fetch(self, arg1, arg2);
41
- }
42
- set(arg1, arg2) {
43
- const self = this.is;
44
- if (typeof arg1 == "function")
45
- return addListener(self, key => {
46
- if (typeof key == "string")
47
- return arg1.call(self, key, self);
48
- });
49
- if (arg1 && typeof arg1 == "object") {
50
- const methods = METHODS.get(self.constructor);
51
- for (const key in arg1)
52
- if (methods.has(key))
53
- self[key] = arg1[key];
54
- else if (key in self)
55
- update(self, key, arg1[key], arg2 === true);
56
- }
57
- else
58
- event(self, arg1);
59
- return pending(self);
60
- }
61
- /**
62
- * Iterate over managed properties in this instance of Model.
63
- * Yeilds the key and current value for each property.
64
- */
65
- [Symbol.iterator]() {
66
- return Object.entries(STATE.get(this.is))[Symbol.iterator]();
67
- }
68
- /**
69
- * Create and activate a new instance of this model.
70
- *
71
- * **Important** - Unlike `new this(...)` - this method also activates state.
72
- *
73
- * @param args - arguments sent to constructor
74
- */
75
- static new(...args) {
76
- const instance = new this(...args);
77
- event(instance);
78
- return instance;
79
- }
80
- /**
81
- * Static equivalent of `x instanceof this`.
82
- * Determines if provided class is a subtype of this one.
83
- * If so, language server will make available all static
84
- * methods and properties of this class.
85
- */
86
- static is(maybe) {
87
- return maybe === this || typeof maybe == "function" && maybe.prototype instanceof this;
88
- }
89
- /**
90
- * Register a callback to run when any instance of this Model is updated.
91
- */
92
- static on(listener) {
93
- let notify = NOTIFY.get(this);
94
- if (!notify)
95
- NOTIFY.set(this, notify = new Set);
96
- notify.add(listener);
97
- return () => notify.delete(listener);
10
+ constructor(...args) {
11
+ prepare(this);
12
+ define(this, "is", { value: this });
13
+ init(this, args);
14
+ }
15
+ get(arg1, arg2) {
16
+ const self = this.is;
17
+ if (typeof arg1 == "function") {
18
+ let pending2 = /* @__PURE__ */ new Set();
19
+ return createEffect(self, (proxy) => {
20
+ const cb = arg1.call(proxy, proxy, pending2);
21
+ return cb === null ? null : (update2) => {
22
+ pending2 = PENDING_KEYS.get(self);
23
+ if (typeof cb == "function")
24
+ cb(update2);
25
+ };
26
+ });
98
27
  }
28
+ if (arg1 === void 0)
29
+ return snapshot(self);
30
+ if (typeof arg2 == "function")
31
+ return addListener(self, arg2, arg1);
32
+ return arg1 === null ? Object.isFrozen(STATE.get(self)) : fetch(self, arg1, arg2);
33
+ }
34
+ set(arg1, arg2) {
35
+ const self = this.is;
36
+ if (typeof arg1 == "function")
37
+ return addListener(self, (key) => {
38
+ if (typeof key == "string")
39
+ return arg1.call(self, key, self);
40
+ });
41
+ if (arg1 && typeof arg1 == "object") {
42
+ const methods = METHODS.get(self.constructor);
43
+ for (const key in arg1)
44
+ if (methods.has(key))
45
+ self[key] = arg1[key];
46
+ else if (key in self)
47
+ update(self, key, arg1[key], arg2 === true);
48
+ } else
49
+ event(self, arg1);
50
+ return pending(self);
51
+ }
52
+ /**
53
+ * Iterate over managed properties in this instance of Model.
54
+ * Yeilds the key and current value for each property.
55
+ */
56
+ [Symbol.iterator]() {
57
+ return Object.entries(STATE.get(this.is))[Symbol.iterator]();
58
+ }
59
+ /**
60
+ * Create and activate a new instance of this model.
61
+ *
62
+ * **Important** - Unlike `new this(...)` - this method also activates state.
63
+ *
64
+ * @param args - arguments sent to constructor
65
+ */
66
+ static new(...args) {
67
+ const instance = new this(...args);
68
+ event(instance);
69
+ return instance;
70
+ }
71
+ /**
72
+ * Static equivalent of `x instanceof this`.
73
+ * Determines if provided class is a subtype of this one.
74
+ * If so, language server will make available all static
75
+ * methods and properties of this class.
76
+ */
77
+ static is(maybe) {
78
+ return maybe === this || typeof maybe == "function" && maybe.prototype instanceof this;
79
+ }
80
+ /**
81
+ * Register a callback to run when any instance of this Model is updated.
82
+ */
83
+ static on(listener) {
84
+ let notify = NOTIFY.get(this);
85
+ if (!notify)
86
+ NOTIFY.set(this, notify = /* @__PURE__ */ new Set());
87
+ notify.add(listener);
88
+ return () => notify.delete(listener);
89
+ }
99
90
  }
100
91
  define(Model.prototype, "toString", {
101
- value() {
102
- return ID.get(this.is);
103
- }
92
+ value() {
93
+ return ID.get(this.is);
94
+ }
104
95
  });
105
96
  define(Model, "toString", {
106
- value() {
107
- return this.name;
108
- }
97
+ value() {
98
+ return this.name;
99
+ }
109
100
  });
110
- /** Apply instructions and inherited event listeners. Ensure class metadata is ready. */
111
101
  function prepare(model) {
112
- let T = model.constructor;
113
- if (T === Model)
114
- throw new Error("Cannot create base Model.");
115
- const chain = [];
116
- let keys = new Set();
117
- ID.set(model, `${T}-${uid()}`);
118
- while (T.name) {
119
- for (const cb of NOTIFY.get(T) || [])
120
- addListener(model, cb);
121
- if (T === Model)
122
- break;
123
- else
124
- chain.unshift(T);
125
- T = Object.getPrototypeOf(T);
102
+ let T = model.constructor;
103
+ if (T === Model)
104
+ throw new Error("Cannot create base Model.");
105
+ const chain = [];
106
+ let keys = /* @__PURE__ */ new Set();
107
+ ID.set(model, `${T}-${uid()}`);
108
+ while (T.name) {
109
+ for (const cb of NOTIFY.get(T) || [])
110
+ addListener(model, cb);
111
+ if (T === Model) break;
112
+ else chain.unshift(T);
113
+ T = Object.getPrototypeOf(T);
114
+ }
115
+ for (const type of chain) {
116
+ if (METHODS.has(type)) {
117
+ keys = METHODS.get(type);
118
+ continue;
126
119
  }
127
- for (const type of chain) {
128
- if (METHODS.has(type)) {
129
- keys = METHODS.get(type);
130
- continue;
131
- }
132
- METHODS.set(type, keys = new Set(keys));
133
- for (const [key, { value }] of Object.entries(Object.getOwnPropertyDescriptors(type.prototype))) {
134
- if (!value || key == "constructor")
135
- continue;
136
- function bind(method = value) {
137
- const value = method.bind(this.is);
138
- METHOD.set(value, method);
139
- define(this.is, key, { value, writable: true });
140
- return value;
141
- }
142
- keys.add(key);
143
- define(type.prototype, key, { get: bind, set: bind });
144
- }
120
+ METHODS.set(type, keys = new Set(keys));
121
+ for (const [key, { value }] of Object.entries(
122
+ Object.getOwnPropertyDescriptors(type.prototype)
123
+ )) {
124
+ let bind2 = function(method = value) {
125
+ const value2 = method.bind(this.is);
126
+ METHOD.set(value2, method);
127
+ define(this.is, key, { value: value2, writable: true });
128
+ return value2;
129
+ };
130
+ var bind = bind2;
131
+ if (!value || key == "constructor")
132
+ continue;
133
+ keys.add(key);
134
+ define(type.prototype, key, { get: bind2, set: bind2 });
145
135
  }
136
+ }
146
137
  }
147
- /**
148
- * Apply model arguemnts, run callbacks and observe properties.
149
- * Accumulate and handle cleanup events.
150
- **/
151
138
  function init(model, args) {
152
- const methods = METHODS.get(model.constructor);
153
- const state = {};
154
- STATE.set(model, state);
155
- args = args.flat().filter(arg => {
156
- if (typeof arg != "string")
157
- return true;
158
- ID.set(model, arg);
159
- });
160
- addListener(model, () => {
161
- if (!PARENT.has(model))
162
- PARENT.set(model, null);
163
- args.forEach((arg) => {
164
- const use = typeof arg == "function"
165
- ? arg.call(model, model)
166
- : arg;
167
- if (use instanceof Promise)
168
- use.catch(err => {
169
- console.error(`Async error in constructor for ${model}:`);
170
- console.error(err);
171
- });
172
- else if (typeof use == "function")
173
- addListener(model, use, null);
174
- else if (typeof use == "object")
175
- for (const key in use)
176
- if (key in model || methods.has(key))
177
- model[key] = use[key];
139
+ const methods = METHODS.get(model.constructor);
140
+ const state = {};
141
+ STATE.set(model, state);
142
+ args = args.flat().filter((arg) => {
143
+ if (typeof arg != "string")
144
+ return true;
145
+ ID.set(model, arg);
146
+ });
147
+ addListener(model, () => {
148
+ if (!PARENT.has(model))
149
+ PARENT.set(model, null);
150
+ args.forEach((arg) => {
151
+ const use = typeof arg == "function" ? arg.call(model, model) : arg;
152
+ if (use instanceof Promise)
153
+ use.catch((err) => {
154
+ console.error(`Async error in constructor for ${model}:`);
155
+ console.error(err);
178
156
  });
179
- for (const key in model) {
180
- const desc = Object.getOwnPropertyDescriptor(model, key);
181
- if ("value" in desc) {
182
- update(model, key, desc.value, true);
183
- define(model, key, {
184
- configurable: false,
185
- get() {
186
- return watch(this, key, state[key]);
187
- },
188
- set(value) {
189
- update(model, key, value);
190
- mayAdopt(model, value);
191
- }
192
- });
193
- }
194
- }
195
- addListener(model, () => {
196
- for (const [_, value] of model)
197
- if (value instanceof Model && PARENT.get(value) === model)
198
- value.set(null);
199
- Object.freeze(state);
200
- }, null);
201
- return null;
157
+ else if (typeof use == "function")
158
+ addListener(model, use, null);
159
+ else if (typeof use == "object") {
160
+ for (const key in use)
161
+ if (key in model || methods.has(key))
162
+ model[key] = use[key];
163
+ }
202
164
  });
165
+ for (const key in model) {
166
+ const desc = Object.getOwnPropertyDescriptor(model, key);
167
+ if ("value" in desc) {
168
+ update(model, key, desc.value, true);
169
+ define(model, key, {
170
+ configurable: false,
171
+ get() {
172
+ return watch(this, key, state[key]);
173
+ },
174
+ set(value) {
175
+ update(model, key, value);
176
+ mayAdopt(model, value);
177
+ }
178
+ });
179
+ }
180
+ }
181
+ addListener(model, () => {
182
+ for (const [_, value] of model)
183
+ if (value instanceof Model && PARENT.get(value) === model)
184
+ value.set(null);
185
+ Object.freeze(state);
186
+ }, null);
187
+ return null;
188
+ });
203
189
  }
204
190
  function mayAdopt(parent, child) {
205
- if (child instanceof Model && !PARENT.has(child)) {
206
- PARENT.set(child, parent);
207
- event(child);
208
- }
191
+ if (child instanceof Model && !PARENT.has(child)) {
192
+ PARENT.set(child, parent);
193
+ event(child);
194
+ }
209
195
  }
210
196
  function fetch(subject, property, required) {
211
- const state = STATE.get(subject);
212
- if (property in state || required === false) {
213
- const value = state[property];
214
- if (value !== undefined || !required)
215
- return value;
216
- }
217
- const error = new Error(`${subject}.${property} is not yet available.`);
218
- const promise = new Promise((resolve, reject) => {
219
- addListener(subject, key => {
220
- if (key === property) {
221
- resolve(state[key]);
222
- return null;
223
- }
224
- if (key === null)
225
- reject(new Error(`${subject} is destroyed.`));
226
- });
227
- });
228
- throw Object.assign(promise, {
229
- toString: () => String(error),
230
- name: "Suspense",
231
- message: error.message,
232
- stack: error.stack
197
+ const state = STATE.get(subject);
198
+ if (property in state || required === false) {
199
+ const value = state[property];
200
+ if (value !== void 0 || !required)
201
+ return value;
202
+ }
203
+ const error = new Error(`${subject}.${property} is not yet available.`);
204
+ const promise = new Promise((resolve, reject) => {
205
+ addListener(subject, (key) => {
206
+ if (key === property) {
207
+ resolve(state[key]);
208
+ return null;
209
+ }
210
+ if (key === null)
211
+ reject(new Error(`${subject} is destroyed.`));
233
212
  });
213
+ });
214
+ throw Object.assign(promise, {
215
+ toString: () => String(error),
216
+ name: "Suspense",
217
+ message: error.message,
218
+ stack: error.stack
219
+ });
234
220
  }
235
- /** Currently accumulating export. Stores real values of placeholder properties such as ref() or child models. */
236
221
  let EXPORT;
237
222
  function snapshot(model) {
238
- const values = {};
239
- let isNotRecursive;
240
- if (!EXPORT) {
241
- isNotRecursive = true;
242
- EXPORT = new Map([[model, values]]);
243
- }
244
- for (let [key, value] of model) {
245
- if (EXPORT.has(value))
246
- value = EXPORT.get(value);
247
- else if (value && typeof value == "object" && "get" in value && typeof value.get === "function")
248
- EXPORT.set(value, value = value.get());
249
- values[key] = value;
250
- }
251
- if (isNotRecursive)
252
- EXPORT = undefined;
253
- return Object.freeze(values);
223
+ const values = {};
224
+ let isNotRecursive;
225
+ if (!EXPORT) {
226
+ isNotRecursive = true;
227
+ EXPORT = /* @__PURE__ */ new Map([[model, values]]);
228
+ }
229
+ for (let [key, value] of model) {
230
+ if (EXPORT.has(value))
231
+ value = EXPORT.get(value);
232
+ else if (value && typeof value == "object" && "get" in value && typeof value.get === "function")
233
+ EXPORT.set(value, value = value.get());
234
+ values[key] = value;
235
+ }
236
+ if (isNotRecursive)
237
+ EXPORT = void 0;
238
+ return Object.freeze(values);
254
239
  }
255
240
  function update(subject, key, value, arg) {
256
- const state = STATE.get(subject);
257
- if (Object.isFrozen(state))
258
- throw new Error(`Tried to update ${String(key)} but ${subject} is destroyed.`);
259
- const previous = state[key];
260
- if (typeof arg == "function") {
261
- const out = arg.call(subject, value, previous);
262
- if (out === false)
263
- return false;
264
- if (typeof out == "function")
265
- value = out();
266
- }
267
- if (value === previous)
268
- return;
269
- state[key] = value;
270
- if (arg !== true)
271
- event(subject, key);
272
- return true;
241
+ const state = STATE.get(subject);
242
+ if (Object.isFrozen(state))
243
+ throw new Error(`Tried to update ${String(key)} but ${subject} is destroyed.`);
244
+ const previous = state[key];
245
+ if (typeof arg == "function") {
246
+ const out = arg.call(subject, value, previous);
247
+ if (out === false)
248
+ return false;
249
+ if (typeof out == "function")
250
+ value = out();
251
+ }
252
+ if (value === previous)
253
+ return;
254
+ state[key] = value;
255
+ if (arg !== true)
256
+ event(subject, key);
257
+ return true;
273
258
  }
274
- /** Random alphanumberic of length 6; always starts with a letter. */
275
259
  function uid() {
276
- return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();
260
+ return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();
277
261
  }
278
- export { event, fetch, mayAdopt, METHOD, Model, PARENT, STATE, uid, update, };
262
+ export {
263
+ METHOD,
264
+ Model,
265
+ PARENT,
266
+ STATE,
267
+ define,
268
+ event,
269
+ fetch,
270
+ mayAdopt,
271
+ uid,
272
+ update
273
+ };
274
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT25VcGRhdGUsIHBlbmRpbmcsIFBFTkRJTkdfS0VZUywgd2F0Y2ggfSBmcm9tICcuL2NvbnRyb2wnO1xuXG5leHBvcnQgY29uc3QgZGVmaW5lID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vKiogUmVnaXN0ZXIgZm9yIGFsbCBhY3RpdmUgbW9kZWxzIHZpYSBzdHJpbmcgaWRlbnRpZmllcnMgKHVzdWFsbHkgdW5pcXVlKS4gKi9cbmNvbnN0IElEID0gbmV3IFdlYWtNYXA8TW9kZWwsIHN0cmluZz4oKTtcblxuLyoqIEludGVybmFsIHN0YXRlIGFzc2lnbmVkIHRvIG1vZGVscy4gKi9cbmNvbnN0IFNUQVRFID0gbmV3IFdlYWtNYXA8TW9kZWwsIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHVua25vd24+PigpO1xuXG4vKiogRXh0ZXJuYWwgbGlzdGVuZXJzIGZvciBhbnkgZ2l2ZW4gTW9kZWwuICovXG5jb25zdCBOT1RJRlkgPSBuZXcgV2Vha01hcDxNb2RlbC5UeXBlLCBTZXQ8T25VcGRhdGU+PigpO1xuXG4vKiogUGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMuICovXG5jb25zdCBQQVJFTlQgPSBuZXcgV2Vha01hcDxNb2RlbCwgTW9kZWwgfCBudWxsPigpO1xuXG4vKiogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgYnkgYSBnaXZlbiB0eXBlLiAqL1xuY29uc3QgTUVUSE9EUyA9IG5ldyBXZWFrTWFwPE1vZGVsLlR5cGUsIFNldDxzdHJpbmc+PigpO1xuXG4vKiogUmVmZXJlbmNlIGJvdW5kIGluc3RhbmNlIG1ldGhvZHMgdG8gcmVhbCBvbmVzLiAqL1xuY29uc3QgTUVUSE9EID0gbmV3IFdlYWtNYXA8YW55LCBhbnk+KCk7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIE1vZGVsIHtcbiAgLyoqIEFueSB0eXBlIG9mIE1vZGVsLCB1c2luZyBvd24gY2xhc3MgY29uc3RydWN0b3IgYXMgaXRzIGlkZW50aWZpZXIuICovXG4gIHR5cGUgVHlwZTxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgIChhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSAmIHR5cGVvZiBNb2RlbDtcblxuICAvKiogQSBNb2RlbCBjb25zdHJ1Y3RvciwgYnV0IHdoaWNoIGlzIG5vdCBhYnN0cmFjdC4gKi9cbiAgdHlwZSBJbml0PFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKG5ldyAoLi4uYXJnczogTW9kZWwuQXJnczxUPikgPT4gVCkgJiBPbWl0PHR5cGVvZiBNb2RlbCwgbmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBNb2RlbCBjb25zdHJ1Y3RvciBjYWxsYmFjayAtIGlzIGNhbGxlZCB3aGVuIE1vZGVsIGZpbmlzaGVzIGludGlhbGl6aW5nLlxuICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgQ2FsbGJhY2s8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAodGhpczogVCwgdGhpc0FyZzogVCkgPT4gUHJvbWlzZTx2b2lkPiB8ICgoKSA9PiB2b2lkKSB8IEFzc2lnbjxUPiB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50ICovXG4gIHR5cGUgQXJndW1lbnQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID0gQXNzaWduPFQ+IHwgQ2FsbGJhY2s8VD4gfCBzdHJpbmcgfCB2b2lkO1xuXG4gIC8qKiBNb2RlbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi9cbiAgdHlwZSBBcmdzPFQgZXh0ZW5kcyBNb2RlbCA9IGFueT4gPSAoQXJndW1lbnQ8VD4gfCBBcmdzPFQ+KVtdO1xuXG4gIC8qKiBTdWJzZXQgb2YgYGtleW9mIFRgIHdoaWNoIGFyZSBub3QgbWV0aG9kcyBvciBkZWZpbmVkIGJ5IGJhc2UgTW9kZWwgVS4gKiovXG4gIHR5cGUgRmllbGQ8VD4gPSBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPjtcblxuICAvKiogQW55IHZhbGlkIGtleSBmb3IgbW9kZWwsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gRmllbGQ8VD4uICovXG4gIHR5cGUgRXZlbnQ8VD4gPSBGaWVsZDxUPiB8IChzdHJpbmcgJiB7fSkgfCBudW1iZXIgfCBzeW1ib2w7XG5cbiAgLyoqIE9iamVjdCBvdmVybGF5IHRvIG92ZXJyaWRlIHZhbHVlcyBhbmQgbWV0aG9kcyBvbiBhIG1vZGVsLiAqL1xuICB0eXBlIEFzc2lnbjxUPiA9IHtcbiAgICBbSyBpbiBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPl0/OlxuICAgICAgVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIFxuICAgICAgICA/ICh0aGlzOiBULCAuLi5hcmdzOiBBKSA9PiBSXG4gICAgICAgIDogVFtLXTtcbiAgfSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeHBvcnQvSW1wb3J0IGNvbXBhdGlibGUgdmFsdWUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgaW4gYSBNb2RlbC4gKi9cbiAgdHlwZSBFeHBvcnQ8Uj4gPSBSIGV4dGVuZHMgeyBnZXQoKTogaW5mZXIgVCB9ID8gVCA6IFI7XG5cbiAgLyoqIFZhbHVlIGZvciBhIHByb3BlcnR5IG1hbmFnZWQgYnkgYSBtb2RlbC4gKi9cbiAgdHlwZSBWYWx1ZTxUIGV4dGVuZHMgTW9kZWwsIEsgZXh0ZW5kcyBFdmVudDxUPj4gPVxuICAgIEsgZXh0ZW5kcyBrZXlvZiBUID8gRXhwb3J0PFRbS10+IDogdW5rbm93bjtcblxuICB0eXBlIE9uRXZlbnQ8VCBleHRlbmRzIE1vZGVsPiA9XG4gICAgKHRoaXM6IFQsIGtleTogdW5rbm93biwgc291cmNlOiBUKSA9PiAoKCkgPT4gdm9pZCkgfCB2b2lkIHwgbnVsbDtcblxuICB0eXBlIE9uVXBkYXRlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgKHRoaXM6IFQsIGtleTogSywgdGhpc0FyZzogSykgPT4gdm9pZDtcblxuICAvKipcbiAgICogVmFsdWVzIGZyb20gY3VycmVudCBzdGF0ZSBvZiBnaXZlbiBtb2RlbC5cbiAgICogRGlmZmVycyBmcm9tIGBWYWx1ZXNgIGFzIHZhbHVlcyBoZXJlIHdpbGwgZHJpbGxcbiAgICogaW50byBcInJlYWxcIiB2YWx1ZXMgaGVsZCBieSBleG90aWNzIGxpa2UgcmVmLk9iamVjdC5cbiAgICovXG4gIHR5cGUgU3RhdGU8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XTogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIE9iamVjdCBjb21wZXJhYmxlIHRvIGRhdGEgZm91bmQgaW4gVC4gKi9cbiAgdHlwZSBWYWx1ZXM8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XT86IEV4cG9ydDxUW1BdPiB9O1xuXG4gIC8qKiBFeG90aWMgdmFsdWUsIHdoZXJlIGFjdHVhbCB2YWx1ZSBpcyBjb250YWluZWQgd2l0aGluLiAqL1xuICB0eXBlIFJlZjxUID0gYW55PiA9IHtcbiAgICAobmV4dDogVCk6IHZvaWQ7XG4gICAgY3VycmVudDogVCB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBzdWJzY3JpYmVkIHRvIHBhcmVudCBhbmQgdXBkYXRlcyB3aGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IHN0YXRlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgYSBwcm94eSB3aGljaCBkZXRlY3RzIHByb3BlcnRpZXMgd2hpY2hcbiAgICogd2hlcmUgYWNjZXNzZWQsIGFuZCB0aHVzIGRlcGVuZGVkIHVwb24gdG8gc3RheSBjdXJyZW50LlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIFNldCBvZiBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgY2hhbmdlZCwgYW5kIGV2ZW50cyBmaXJlZCwgc2luY2UgbGFzdCB1cGRhdGUuXG4gICAqIFxuICAgKiBAcmV0dXJucyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBlZmZlY3QgaXMgc3RhbGUuXG4gICAqL1xuICB0eXBlIEVmZmVjdDxUPiA9ICh0aGlzOiBULCBjdXJyZW50OiBULCB1cGRhdGU6IFNldDxFdmVudDxUPj4pID0+XG4gICAgRWZmZWN0Q2FsbGJhY2sgfCBQcm9taXNlPHZvaWQ+IHwgbnVsbCB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZWZmZWN0LiBXaWxsIGJlIGNhbGxlZCB3aGVuIGVmZmVjdCBpcyBzdGFsZS5cbiAgICogXG4gICAqIEBwYXJhbSB1cGRhdGUgLSBgdHJ1ZWAgaWYgdXBkYXRlIGlzIHBlbmRpbmcsIGBmYWxzZWAgZWZmZWN0IGhhcyBiZWVuIGNhbmNlbGxlZCwgYG51bGxgIGlmIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgRWZmZWN0Q2FsbGJhY2sgPSAoKHVwZGF0ZTogYm9vbGVhbiB8IG51bGwpID0+IHZvaWQpO1xuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBpbml0aWFsaXplciwgd2lsbCBydW4gdXBvbiBpbnN0YW5jZSBjcmVhdGlvbi5cbiAgICogT3B0aW9uYWwgcmV0dXJuZWQgY2FsbGJhY2sgd2lsbCBydW4gd2hlbiBvbmNlIHVwb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgdHlwZSBJbnN0cnVjdGlvbjxUID0gYW55LCBNIGV4dGVuZHMgTW9kZWwgPSBhbnk+ID1cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbGxvdyBmb3IgbnVtYmVycy9zeW1ib2wgcHJvcGVydGllcz9cbiAgICAodGhpczogTSwga2V5OiBFeHRyYWN0PEZpZWxkPE0+LCBzdHJpbmc+LCB0aGlzQXJnOiBNLCBzdGF0ZTogU3RhdGU8TT4pID0+XG4gICAgICBEZXNjcmlwdG9yPFQ+IHwgKChzb3VyY2U6IE0pID0+IFQpIHwgdm9pZDtcblxuICB0eXBlIEdldHRlcjxUPiA9IChzb3VyY2U6IE1vZGVsKSA9PiBUO1xuICB0eXBlIFNldHRlcjxUPiA9ICh2YWx1ZTogVCwgcHJldmlvdXM6IFQpID0+IGJvb2xlYW4gfCB2b2lkIHwgKCgpID0+IFQpO1xuXG4gIHR5cGUgRGVzY3JpcHRvcjxUID0gYW55PiA9IHtcbiAgICBnZXQ/OiBHZXR0ZXI8VD4gfCBib29sZWFuO1xuICAgIHNldD86IFNldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgZW51bWVyYWJsZT86IGJvb2xlYW47XG4gICAgdmFsdWU/OiBUO1xuICB9XG59XG5cbmludGVyZmFjZSBNb2RlbCB7XG4gIC8qKlxuICAgKiBMb29wYmFjayB0byBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGluIGEgc3Vic2NyaWJlZCBjb250ZXh0LFxuICAgKiB0byBrZWVwIHdyaXRlIGFjY2VzcyB0byBgdGhpc2AgYWZ0ZXIgYSBkZXN0cnVjdHVyZS4gWW91IGNhbiB1c2UgaXQgdG8gcmVhZCB2YXJpYWJsZXMgc2lsZW50bHkgYXMgd2VsbC5cbiAgICoqL1xuICBpczogdGhpcztcbn1cblxuYWJzdHJhY3QgY2xhc3MgTW9kZWwge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxsIGN1cnJlbnQgdmFsdWVzIGZyb20gc3RhdGUuIEZsYXR0ZW5zIGFsbCBtb2RlbHMgYW5kIGV4b3RpYyB2YWx1ZXMgcmVjdXJzaXZlbHkuXG4gICAqIFxuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhbGwgdmFsdWVzIGZyb20gdGhpcyBtb2RlbC5cbiAgICoqL1xuICBnZXQoKTogTW9kZWwuU3RhdGU8dGhpcz47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGVmZmVjdCBGdW5jdGlvbiB0byBydW4sIGFuZCBhZ2FpbiB3aGVuZXZlciBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiAgICAgICAgICAgICAgIElmIGVmZmVjdCByZXR1cm5zIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb2NjdXJzIChzeW5jcm9ub3VzbHkpLFxuICAgKiAgICAgICAgICAgICAgIGVmZmVjdCBpcyBjYW5jZWxsZWQsIG9yIHBhcmVudCBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldChlZmZlY3Q6IE1vZGVsLkVmZmVjdDx0aGlzPik6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIGdldCB2YWx1ZSBvZi5cbiAgICogQHBhcmFtIHJlcXVpcmVkIC0gSWYgdHJ1ZSwgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyBWYWx1ZSBvZiBwcm9wZXJ0eS5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgTW9kZWwuRXZlbnQ8dGhpcz4+KGtleTogVCwgcmVxdWlyZWQ/OiBib29sZWFuKTogTW9kZWwuVmFsdWU8dGhpcywgVD47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBNb2RlbC5FdmVudDx0aGlzPj4oa2V5OiBULCBjYWxsYmFjazogTW9kZWwuT25VcGRhdGU8dGhpcywgVD4pOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBjaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbW9kZWwgaXMgZXhwaXJlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBtb2RlbCBpcyB0byBiZSBkZXN0cm95ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG5cbiAgZ2V0KGFyZzE/OiBNb2RlbC5FZmZlY3Q8dGhpcz4gfCBzdHJpbmcgfCBudWxsLCBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uVXBkYXRlPHRoaXMsIGFueT4pe1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzLmlzO1xuXG4gICAgaWYodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKXtcbiAgICAgIGxldCBwZW5kaW5nID0gbmV3IFNldDxNb2RlbC5FdmVudDx0aGlzPj4oKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUVmZmVjdChzZWxmLCAocHJveHkpID0+IHtcbiAgICAgICAgY29uc3QgY2IgPSBhcmcxLmNhbGwocHJveHksIHByb3h5LCBwZW5kaW5nKTtcblxuICAgICAgICByZXR1cm4gY2IgPT09IG51bGwgPyBudWxsIDogKCh1cGRhdGUpID0+IHtcbiAgICAgICAgICBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldChzZWxmKSE7XG4gICAgICAgICAgaWYodHlwZW9mIGNiID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGNiKHVwZGF0ZSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZihhcmcxID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gc25hcHNob3Qoc2VsZik7XG5cbiAgICBpZih0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwgYXJnMiwgYXJnMSlcblxuICAgIHJldHVybiBhcmcxID09PSBudWxsXG4gICAgICA/IE9iamVjdC5pc0Zyb3plbihTVEFURS5nZXQoc2VsZikpXG4gICAgICA6IGZldGNoKHNlbGYsIGFyZzEsIGFyZzIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIGB1bmRlZmluZWRgIGlmIHRoZXJlIG5vIHVwZGF0ZSBpcyBwZW5kaW5nLlxuICAgKiovXG4gIHNldCgpOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVXBkYXRlIG11bGl0cGxlIHByb3BlcnRpZXMgYXQgb25jZS4gTWVyZ2VzIGFyZ3VtZW50IHdpdGggY3VycmVudCBzdGF0ZS5cbiAgICogUHJvcGVydGllcyB3aGljaCBhcmUgbm90IG1hbmFnZWQgYnkgdGhpcyBtb2RlbCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gYXNzaWduIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBzaWxlbnQgLSBJZiBhbiB1cGRhdGUgZG9lcyBvY2N1ciwgbGlzdGVuZXJzIHdpbGwgbm90IGJlIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQsIGB1bmRlZmluZWRgIChpbW1lZGlhdGVseSkgaWYgYSBub29wLlxuICAgKi9cbiAgc2V0KGFzc2lnbjogTW9kZWwuQXNzaWduPHRoaXM+LCBzaWxlbnQ/OiBib29sZWFuKTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFB1c2ggYW4gdXBkYXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgYXNzb2NpYXRlZCBwcm9wZXJ0eS5cbiAgICogXG4gICAqIFVzZWZ1bCB3aGVyZSBhIHByb3BlcnR5IHZhbHVlIGludGVybmFsbHkgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lLlxuICAgKiBGb3IgZXhhbXBsZTogQW4gYXJyYXkgaGFzIHB1c2hlZCBhIG5ldyB2YWx1ZSwgb3IgYSBuZXN0ZWQgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogXG4gICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB0byBkaXNwYXRjaCBhcmJpdHJhcnkgZXZlbnRzLlxuICAgKiBTeW1ib2xzIGFyZSByZWNvbW1lbmRlZCBhcyBub24tcHJvcGVydHkgZXZlbnRzLCBob3dldmVyIHlvdSBjYW4gdXNlIGFueSBzdHJpbmcuXG4gICAqIElmIGRvaW5nIHNvLCBiZSBzdXJlIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBwcm9wZXJ0eSBuYW1lcyEgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpc1xuICAgKiB0byBwcmVmaXggYW4gZXZlbnQgd2l0aCBcIiFcIiBhbmQvb3IgdXNlIGRhc2gtY2FzZS4gZS5nLiBgc2V0KFwiIWV2ZW50XCIpYCBvciBgc2V0KFwibXktZXZlbnRcIilgLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IG9yIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICovXG4gIHNldChrZXk6IE1vZGVsLkV2ZW50PHRoaXM+KTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT47XG5cbiAgLyoqXG4gICAqIENhbGwgYSBmdW5jdGlvbiB3aGVuIHVwZGF0ZSBvY2N1cnMuXG4gICAqIFxuICAgKiBHaXZlbiBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGFzc2lnbm1lbnQgKHdoaWNoIGNoYW5nZXMgdmFsdWUpIG9yIGV4cGxpY2l0IGBzZXRgLlxuICAgKiBcbiAgICogVG8gcnVuIGxvZ2ljIG9uIGZpbmFsIHZhbHVlIG9ubHksIGNhbGxiYWNrIG1heSByZXR1cm4gYSBmdW5jdGlvbi4gVXNpbmcgdGhlIHNhbWVcbiAgICogZnVuY3Rpb24gZm9yIG9uZSBvciBtb3JlIGV2ZW50cyB3aWxsIGVuc3VyZSBpdCBpcyBjYWxsZWQgb25seSB3aGVuIGV2ZW50cyBhcmUgc2V0dGxlZC5cbiAgICogXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byByZW1vdmUgbGlzdGVuZXIuIFdpbGwgcmV0dXJuIGB0cnVlYCBpZiByZW1vdmVkLCBgZmFsc2VgIGlmIGluYWN0aXZlIGFscmVhZHkuXG4gICAqIFxuICAqL1xuICBzZXQoY2FsbGJhY2s6IE1vZGVsLk9uRXZlbnQ8dGhpcz4pOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWNsYXJlIGFuIGVuZCB0byB1cGRhdGVzLiBUaGlzIGV2ZW50IGlzIGZpbmFsIGFuZCB3aWxsIGZyZWV6ZSBzdGF0ZS5cbiAgICogVGhpcyBldmVudCBjYW4gYmUgd2F0Y2hlZCBmb3IgYXMgd2VsbCwgdG8gcnVuIGNsZWFudXAgbG9naWMgYW5kIGludGVybmFsbHkgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycy5cbiAgICogXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBgbnVsbGAgdG8gZW5kIHVwZGF0ZXMuXG4gICAqL1xuICBzZXQoc3RhdHVzOiBudWxsKTogdm9pZDtcblxuICBzZXQoXG4gICAgYXJnMT86IE1vZGVsLk9uRXZlbnQ8dGhpcz4gfCBNb2RlbC5Bc3NpZ248dGhpcz4gfCBNb2RlbC5FdmVudDx0aGlzPiB8IG51bGwsXG4gICAgYXJnMj86IHVua25vd24pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYodHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG5cbiAgICBpZihhcmcxICYmIHR5cGVvZiBhcmcxID09IFwib2JqZWN0XCIpe1xuICAgICAgY29uc3QgbWV0aG9kcyA9IE1FVEhPRFMuZ2V0KHNlbGYuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZSkhO1xuICAgIFxuICAgICAgZm9yKGNvbnN0IGtleSBpbiBhcmcxKVxuICAgICAgICBpZihtZXRob2RzLmhhcyhrZXkpKVxuICAgICAgICAgIHNlbGZba2V5IGFzIGtleW9mIHRoaXNdID0gYXJnMVtrZXldIGFzIGFueTtcbiAgICAgICAgZWxzZSBpZihrZXkgaW4gc2VsZilcbiAgICAgICAgICB1cGRhdGUoc2VsZiwga2V5LCBhcmcxW2tleV0sIGFyZzIgPT09IHRydWUpO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICBldmVudChzZWxmLCBhcmcxKTtcblxuICAgIHJldHVybiBwZW5kaW5nKHNlbGYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBtYW5hZ2VkIHByb3BlcnRpZXMgaW4gdGhpcyBpbnN0YW5jZSBvZiBNb2RlbC5cbiAgICogWWVpbGRzIHRoZSBrZXkgYW5kIGN1cnJlbnQgdmFsdWUgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAqL1xuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxbc3RyaW5nLCB1bmtub3duXT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhTVEFURS5nZXQodGhpcy5pcykhKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCBhY3RpdmF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLlxuICAgKiBcbiAgICogKipJbXBvcnRhbnQqKiAtIFVubGlrZSBgbmV3IHRoaXMoLi4uKWAgLSB0aGlzIG1ldGhvZCBhbHNvIGFjdGl2YXRlcyBzdGF0ZS5cbiAgICogXG4gICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHNlbnQgdG8gY29uc3RydWN0b3JcbiAgICovXG4gIHN0YXRpYyBuZXc8VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5Jbml0PFQ+LCAuLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KXtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIGV2ZW50KGluc3RhbmNlKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIGVxdWl2YWxlbnQgb2YgYHggaW5zdGFuY2VvZiB0aGlzYC5cbiAgICogRGV0ZXJtaW5lcyBpZiBwcm92aWRlZCBjbGFzcyBpcyBhIHN1YnR5cGUgb2YgdGhpcyBvbmUuXG4gICAqIElmIHNvLCBsYW5ndWFnZSBzZXJ2ZXIgd2lsbCBtYWtlIGF2YWlsYWJsZSBhbGwgc3RhdGljXG4gICAqIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhpcyBjbGFzcy5cbiAgICovXG4gIHN0YXRpYyBpczxUIGV4dGVuZHMgTW9kZWwuVHlwZT4odGhpczogVCwgbWF5YmU6IHVua25vd24pOiBtYXliZSBpcyBUIHtcbiAgICByZXR1cm4gbWF5YmUgPT09IHRoaXMgfHwgdHlwZW9mIG1heWJlID09IFwiZnVuY3Rpb25cIiAmJiBtYXliZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcnVuIHdoZW4gYW55IGluc3RhbmNlIG9mIHRoaXMgTW9kZWwgaXMgdXBkYXRlZC4gXG4gICAqL1xuICBzdGF0aWMgb248VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5UeXBlPFQ+LCBsaXN0ZW5lcjogTW9kZWwuT25FdmVudDxUPil7XG4gICAgbGV0IG5vdGlmeSA9IE5PVElGWS5nZXQodGhpcyk7XG5cbiAgICBpZighbm90aWZ5KVxuICAgICAgTk9USUZZLnNldCh0aGlzLCBub3RpZnkgPSBuZXcgU2V0KTtcblxuICAgIG5vdGlmeS5hZGQobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IG5vdGlmeS5kZWxldGUobGlzdGVuZXIpO1xuICB9XG59XG5cbmRlZmluZShNb2RlbC5wcm90b3R5cGUsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiBJRC5nZXQodGhpcy5pcyk7XG4gIH1cbn0pO1xuXG5kZWZpbmUoTW9kZWwsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn0pO1xuXG4vKiogQXBwbHkgaW5zdHJ1Y3Rpb25zIGFuZCBpbmhlcml0ZWQgZXZlbnQgbGlzdGVuZXJzLiBFbnN1cmUgY2xhc3MgbWV0YWRhdGEgaXMgcmVhZHkuICovXG5mdW5jdGlvbiBwcmVwYXJlKG1vZGVsOiBNb2RlbCl7XG4gIGxldCBUID0gbW9kZWwuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZTtcblxuICBpZihUID09PSBNb2RlbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGJhc2UgTW9kZWwuXCIpO1xuXG4gIGNvbnN0IGNoYWluID0gW10gYXMgTW9kZWwuVHlwZVtdO1xuICBsZXQga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIElELnNldChtb2RlbCwgYCR7VH0tJHt1aWQoKX1gKTtcblxuICB3aGlsZShULm5hbWUpe1xuICAgIGZvcihjb25zdCBjYiBvZiBOT1RJRlkuZ2V0KFQpIHx8IFtdKVxuICAgICAgYWRkTGlzdGVuZXIobW9kZWwsIGNiKTtcblxuICAgIGlmKFQgPT09IE1vZGVsKSBicmVhaztcbiAgICBlbHNlIGNoYWluLnVuc2hpZnQoVCk7XG5cbiAgICBUID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKFQpXG4gIH1cblxuICBmb3IoY29uc3QgdHlwZSBvZiBjaGFpbil7XG4gICAgaWYoTUVUSE9EUy5oYXModHlwZSkpe1xuICAgICAga2V5cyA9IE1FVEhPRFMuZ2V0KHR5cGUpITtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIE1FVEhPRFMuc2V0KHR5cGUsIGtleXMgPSBuZXcgU2V0KGtleXMpKTtcblxuICAgIGZvcihjb25zdCBba2V5LCB7IHZhbHVlIH1dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModHlwZS5wcm90b3R5cGUpXG4gICAgKSl7XG4gICAgICBpZighdmFsdWUgfHwga2V5ID09IFwiY29uc3RydWN0b3JcIilcbiAgICAgICAgY29udGludWU7XG4gICAgICBcbiAgICAgIGZ1bmN0aW9uIGJpbmQodGhpczogTW9kZWwsIG1ldGhvZCA9IHZhbHVlKXtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXRob2QuYmluZCh0aGlzLmlzKTtcbiAgICAgICAgXG4gICAgICAgIE1FVEhPRC5zZXQodmFsdWUsIG1ldGhvZCk7XG4gICAgICAgIGRlZmluZSh0aGlzLmlzLCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgZGVmaW5lKHR5cGUucHJvdG90eXBlLCBrZXksIHsgZ2V0OiBiaW5kLCBzZXQ6IGJpbmQgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBwbHkgbW9kZWwgYXJndWVtbnRzLCBydW4gY2FsbGJhY2tzIGFuZCBvYnNlcnZlIHByb3BlcnRpZXMuXG4gKiBBY2N1bXVsYXRlIGFuZCBoYW5kbGUgY2xlYW51cCBldmVudHMuXG4gKiovXG5mdW5jdGlvbiBpbml0KG1vZGVsOiBNb2RlbCwgYXJnczogTW9kZWwuQXJncyl7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChtb2RlbC5jb25zdHJ1Y3RvciBhcyBNb2RlbC5UeXBlKSE7XG4gIGNvbnN0IHN0YXRlID0ge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj47XG5cbiAgU1RBVEUuc2V0KG1vZGVsLCBzdGF0ZSk7XG5cbiAgYXJncyA9IGFyZ3MuZmxhdCgpLmZpbHRlcihhcmcgPT4ge1xuICAgIGlmKHR5cGVvZiBhcmcgIT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgSUQuc2V0KG1vZGVsLCBhcmcpO1xuICB9KTtcblxuICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgIGlmKCFQQVJFTlQuaGFzKG1vZGVsKSlcbiAgICAgIFBBUkVOVC5zZXQobW9kZWwsIG51bGwpO1xuICAgIFxuICAgIGFyZ3MuZm9yRWFjaCgoYXJnKSA9PiB7XG4gICAgICBjb25zdCB1c2UgPSB0eXBlb2YgYXJnID09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGFyZy5jYWxsKG1vZGVsLCBtb2RlbClcbiAgICAgICAgOiBhcmcgYXMgTW9kZWwuQXNzaWduPE1vZGVsPjtcblxuICAgICAgaWYodXNlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdXNlLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQXN5bmMgZXJyb3IgaW4gY29uc3RydWN0b3IgZm9yICR7bW9kZWx9OmApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmKHR5cGVvZiB1c2UgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgdXNlLCBudWxsKVxuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwib2JqZWN0XCIpXG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gdXNlKVxuICAgICAgICAgIGlmKGtleSBpbiBtb2RlbCB8fCBtZXRob2RzLmhhcyhrZXkpKVxuICAgICAgICAgICAgbW9kZWxba2V5IGFzIGtleW9mIE1vZGVsXSA9IHVzZVtrZXldIGFzIGFueTtcbiAgICB9KTtcblxuICAgIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuXG4gICAgICBpZihcInZhbHVlXCIgaW4gZGVzYyl7XG4gICAgICAgIHVwZGF0ZShtb2RlbCwga2V5LCBkZXNjLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgZGVmaW5lKG1vZGVsLCBrZXksIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIGdldCgpe1xuICAgICAgICAgICAgcmV0dXJuIHdhdGNoKHRoaXMsIGtleSwgc3RhdGVba2V5XSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQodmFsdWUpe1xuICAgICAgICAgICAgdXBkYXRlKG1vZGVsLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIG1heUFkb3B0KG1vZGVsLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgICAgZm9yKGNvbnN0IFtfLCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IG1vZGVsKVxuICAgICAgICAgIHZhbHVlLnNldChudWxsKTtcbiAgXG4gICAgICBPYmplY3QuZnJlZXplKHN0YXRlKTtcbiAgICB9LCBudWxsKTtcbiAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYXlBZG9wdChwYXJlbnQ6IE1vZGVsLCBjaGlsZDogdW5rbm93bil7XG4gIGlmKGNoaWxkIGluc3RhbmNlb2YgTW9kZWwgJiYgIVBBUkVOVC5oYXMoY2hpbGQpKXtcbiAgICBQQVJFTlQuc2V0KGNoaWxkLCBwYXJlbnQpO1xuICAgIGV2ZW50KGNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmZXRjaChzdWJqZWN0OiBNb2RlbCwgcHJvcGVydHk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuICBcbiAgaWYocHJvcGVydHkgaW4gc3RhdGUgfHwgcmVxdWlyZWQgPT09IGZhbHNlKXtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3ViamVjdH0uJHtwcm9wZXJ0eX0gaXMgbm90IHlldCBhdmFpbGFibGUuYCk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBrZXkgPT4ge1xuICAgICAgaWYoa2V5ID09PSBwcm9wZXJ0eSl7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihrZXkgPT09IG51bGwpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gIH0pO1xufVxuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgbW9kZWxzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gc25hcHNob3Q8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCk6IE1vZGVsLlN0YXRlPFQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge30gYXMgYW55O1xuICBsZXQgaXNOb3RSZWN1cnNpdmU7XG5cbiAgaWYoIUVYUE9SVCl7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1ttb2RlbCwgdmFsdWVzXV0pO1xuICB9XG5cbiAgZm9yKGxldCBba2V5LCB2YWx1ZV0gb2YgbW9kZWwpe1xuICAgIGlmKEVYUE9SVC5oYXModmFsdWUpKVxuICAgICAgdmFsdWUgPSBFWFBPUlQuZ2V0KHZhbHVlKTtcbiAgICBlbHNlIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIFwiZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgRVhQT1JULnNldCh2YWx1ZSwgdmFsdWUgPSB2YWx1ZS5nZXQoKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYoaXNOb3RSZWN1cnNpdmUpXG4gICAgRVhQT1JUID0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZTxUPihcbiAgc3ViamVjdDogTW9kZWwsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICB2YWx1ZTogVCxcbiAgYXJnPzogYm9vbGVhbiB8IE1vZGVsLlNldHRlcjxUPil7XG5cbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKE9iamVjdC5pc0Zyb3plbihzdGF0ZSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1cGRhdGUgJHtTdHJpbmcoa2V5KX0gYnV0ICR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiKXtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdmFsdWUgPSBvdXQoKTtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSBwcmV2aW91cylcbiAgICByZXR1cm47XG5cbiAgc3RhdGVba2V5XSA9IHZhbHVlO1xuXG4gIGlmKGFyZyAhPT0gdHJ1ZSlcbiAgICBldmVudChzdWJqZWN0LCBrZXkpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmFuZG9tIGFscGhhbnVtYmVyaWMgb2YgbGVuZ3RoIDY7IGFsd2F5cyBzdGFydHMgd2l0aCBhIGxldHRlci4gKi9cbmZ1bmN0aW9uIHVpZCgpe1xuICByZXR1cm4gKDAuMjc4ICsgTWF0aC5yYW5kb20oKSAqIDAuNzIyKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpLnRvVXBwZXJDYXNlKCk7XG59XG5cbmV4cG9ydCB7XG4gIGV2ZW50LFxuICBmZXRjaCxcbiAgbWF5QWRvcHQsXG4gIE1FVEhPRCxcbiAgTW9kZWwsXG4gIFBBUkVOVCxcbiAgU1RBVEUsXG4gIHVpZCxcbiAgdXBkYXRlLFxufSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsYUFBYSxjQUFjLE9BQWlCLFNBQVMsY0FBYyxhQUFhO0FBRWxGLE1BQU0sU0FBUyxPQUFPO0FBRzdCLE1BQU0sS0FBSyxvQkFBSSxRQUF1QjtBQUd0QyxNQUFNLFFBQVEsb0JBQUksUUFBMEQ7QUFHNUUsTUFBTSxTQUFTLG9CQUFJLFFBQW1DO0FBR3RELE1BQU0sU0FBUyxvQkFBSSxRQUE2QjtBQUdoRCxNQUFNLFVBQVUsb0JBQUksUUFBaUM7QUFHckQsTUFBTSxTQUFTLG9CQUFJLFFBQWtCO0FBbUhyQyxNQUFlLE1BQU07QUFBQSxFQUNuQixlQUFlLE1BQWlCO0FBQzlCLFlBQVEsSUFBSTtBQUNaLFdBQU8sTUFBTSxNQUFNLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDbEMsU0FBSyxNQUFNLElBQUk7QUFBQSxFQUNqQjtBQUFBLEVBcURBLElBQUksTUFBMkMsTUFBMkM7QUFDeEYsVUFBTSxPQUFPLEtBQUs7QUFFbEIsUUFBRyxPQUFPLFFBQVEsWUFBVztBQUMzQixVQUFJQSxXQUFVLG9CQUFJLElBQXVCO0FBRXpDLGFBQU8sYUFBYSxNQUFNLENBQUMsVUFBVTtBQUNuQyxjQUFNLEtBQUssS0FBSyxLQUFLLE9BQU8sT0FBT0EsUUFBTztBQUUxQyxlQUFPLE9BQU8sT0FBTyxPQUFRLENBQUNDLFlBQVc7QUFDdkMsVUFBQUQsV0FBVSxhQUFhLElBQUksSUFBSTtBQUMvQixjQUFHLE9BQU8sTUFBTTtBQUNkLGVBQUdDLE9BQU07QUFBQSxRQUNiO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUcsU0FBUztBQUNWLGFBQU8sU0FBUyxJQUFJO0FBRXRCLFFBQUcsT0FBTyxRQUFRO0FBQ2hCLGFBQU8sWUFBWSxNQUFNLE1BQU0sSUFBSTtBQUVyQyxXQUFPLFNBQVMsT0FDWixPQUFPLFNBQVMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUMvQixNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQUEsRUFDNUI7QUFBQSxFQXlEQSxJQUNFLE1BQ0EsTUFBZTtBQUVmLFVBQU0sT0FBTyxLQUFLO0FBRWxCLFFBQUcsT0FBTyxRQUFRO0FBQ2hCLGFBQU8sWUFBWSxNQUFNLFNBQU87QUFDOUIsWUFBRyxPQUFPLE9BQU87QUFDZixpQkFBTyxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxNQUNwQyxDQUFDO0FBRUgsUUFBRyxRQUFRLE9BQU8sUUFBUSxVQUFTO0FBQ2pDLFlBQU0sVUFBVSxRQUFRLElBQUksS0FBSyxXQUF5QjtBQUUxRCxpQkFBVSxPQUFPO0FBQ2YsWUFBRyxRQUFRLElBQUksR0FBRztBQUNoQixlQUFLLEdBQWlCLElBQUksS0FBSyxHQUFHO0FBQUEsaUJBQzVCLE9BQU87QUFDYixpQkFBTyxNQUFNLEtBQUssS0FBSyxHQUFHLEdBQUcsU0FBUyxJQUFJO0FBQUEsSUFDaEQ7QUFFRSxZQUFNLE1BQU0sSUFBSTtBQUVsQixXQUFPLFFBQVEsSUFBSTtBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLENBQUMsT0FBTyxRQUFRLElBQWlDO0FBQy9DLFdBQU8sT0FBTyxRQUFRLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBRSxFQUFFLE9BQU8sUUFBUSxFQUFFO0FBQUEsRUFDOUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsT0FBTyxPQUE2QyxNQUFvQjtBQUN0RSxVQUFNLFdBQVcsSUFBSSxLQUFLLEdBQUcsSUFBSTtBQUNqQyxVQUFNLFFBQVE7QUFDZCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsT0FBTyxHQUFrQyxPQUE0QjtBQUNuRSxXQUFPLFVBQVUsUUFBUSxPQUFPLFNBQVMsY0FBYyxNQUFNLHFCQUFxQjtBQUFBLEVBQ3BGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFPLEdBQXlDLFVBQTJCO0FBQ3pFLFFBQUksU0FBUyxPQUFPLElBQUksSUFBSTtBQUU1QixRQUFHLENBQUM7QUFDRixhQUFPLElBQUksTUFBTSxTQUFTLG9CQUFJLEtBQUc7QUFFbkMsV0FBTyxJQUFJLFFBQVE7QUFFbkIsV0FBTyxNQUFNLE9BQU8sT0FBTyxRQUFRO0FBQUEsRUFDckM7QUFDRjtBQUVBLE9BQU8sTUFBTSxXQUFXLFlBQVk7QUFBQSxFQUNsQyxRQUFPO0FBQ0wsV0FBTyxHQUFHLElBQUksS0FBSyxFQUFFO0FBQUEsRUFDdkI7QUFDRixDQUFDO0FBRUQsT0FBTyxPQUFPLFlBQVk7QUFBQSxFQUN4QixRQUFPO0FBQ0wsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUNGLENBQUM7QUFHRCxTQUFTLFFBQVEsT0FBYTtBQUM1QixNQUFJLElBQUksTUFBTTtBQUVkLE1BQUcsTUFBTTtBQUNQLFVBQU0sSUFBSSxNQUFNLDJCQUEyQjtBQUU3QyxRQUFNLFFBQVEsQ0FBQztBQUNmLE1BQUksT0FBTyxvQkFBSSxJQUFZO0FBRTNCLEtBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFO0FBRTdCLFNBQU0sRUFBRSxNQUFLO0FBQ1gsZUFBVSxNQUFNLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNoQyxrQkFBWSxPQUFPLEVBQUU7QUFFdkIsUUFBRyxNQUFNLE1BQU87QUFBQSxRQUNYLE9BQU0sUUFBUSxDQUFDO0FBRXBCLFFBQUksT0FBTyxlQUFlLENBQUM7QUFBQSxFQUM3QjtBQUVBLGFBQVUsUUFBUSxPQUFNO0FBQ3RCLFFBQUcsUUFBUSxJQUFJLElBQUksR0FBRTtBQUNuQixhQUFPLFFBQVEsSUFBSSxJQUFJO0FBQ3ZCO0FBQUEsSUFDRjtBQUVBLFlBQVEsSUFBSSxNQUFNLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQztBQUV0QyxlQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLE9BQU87QUFBQSxNQUNuQyxPQUFPLDBCQUEwQixLQUFLLFNBQVM7QUFBQSxJQUNqRCxHQUFFO0FBSUEsVUFBU0MsUUFBVCxTQUEyQixTQUFTLE9BQU07QUFDeEMsY0FBTUMsU0FBUSxPQUFPLEtBQUssS0FBSyxFQUFFO0FBRWpDLGVBQU8sSUFBSUEsUUFBTyxNQUFNO0FBQ3hCLGVBQU8sS0FBSyxJQUFJLEtBQUssRUFBRSxPQUFBQSxRQUFPLFVBQVUsS0FBSyxDQUFDO0FBRTlDLGVBQU9BO0FBQUEsTUFDVDtBQVBTLGlCQUFBRDtBQUhULFVBQUcsQ0FBQyxTQUFTLE9BQU87QUFDbEI7QUFXRixXQUFLLElBQUksR0FBRztBQUNaLGFBQU8sS0FBSyxXQUFXLEtBQUssRUFBRSxLQUFLQSxPQUFNLEtBQUtBLE1BQUssQ0FBQztBQUFBLElBQ3REO0FBQUEsRUFDRjtBQUNGO0FBTUEsU0FBUyxLQUFLLE9BQWMsTUFBaUI7QUFDM0MsUUFBTSxVQUFVLFFBQVEsSUFBSSxNQUFNLFdBQXlCO0FBQzNELFFBQU0sUUFBUSxDQUFDO0FBRWYsUUFBTSxJQUFJLE9BQU8sS0FBSztBQUV0QixTQUFPLEtBQUssS0FBSyxFQUFFLE9BQU8sU0FBTztBQUMvQixRQUFHLE9BQU8sT0FBTztBQUNmLGFBQU87QUFFVCxPQUFHLElBQUksT0FBTyxHQUFHO0FBQUEsRUFDbkIsQ0FBQztBQUVELGNBQVksT0FBTyxNQUFNO0FBQ3ZCLFFBQUcsQ0FBQyxPQUFPLElBQUksS0FBSztBQUNsQixhQUFPLElBQUksT0FBTyxJQUFJO0FBRXhCLFNBQUssUUFBUSxDQUFDLFFBQVE7QUFDcEIsWUFBTSxNQUFNLE9BQU8sT0FBTyxhQUN0QixJQUFJLEtBQUssT0FBTyxLQUFLLElBQ3JCO0FBRUosVUFBRyxlQUFlO0FBQ2hCLFlBQUksTUFBTSxTQUFPO0FBQ2Ysa0JBQVEsTUFBTSxrQ0FBa0MsS0FBSyxHQUFHO0FBQ3hELGtCQUFRLE1BQU0sR0FBRztBQUFBLFFBQ25CLENBQUM7QUFBQSxlQUNLLE9BQU8sT0FBTztBQUNwQixvQkFBWSxPQUFPLEtBQUssSUFBSTtBQUFBLGVBQ3RCLE9BQU8sT0FBTztBQUNwQixtQkFBVSxPQUFPO0FBQ2YsY0FBRyxPQUFPLFNBQVMsUUFBUSxJQUFJLEdBQUc7QUFDaEMsa0JBQU0sR0FBa0IsSUFBSSxJQUFJLEdBQUc7QUFBQTtBQUFBLElBQzNDLENBQUM7QUFFRCxlQUFVLE9BQU8sT0FBTTtBQUNyQixZQUFNLE9BQU8sT0FBTyx5QkFBeUIsT0FBTyxHQUFHO0FBRXZELFVBQUcsV0FBVyxNQUFLO0FBQ2pCLGVBQU8sT0FBTyxLQUFLLEtBQUssT0FBTyxJQUFJO0FBQ25DLGVBQU8sT0FBTyxLQUFLO0FBQUEsVUFDakIsY0FBYztBQUFBLFVBQ2QsTUFBSztBQUNILG1CQUFPLE1BQU0sTUFBTSxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQUEsVUFDcEM7QUFBQSxVQUNBLElBQUksT0FBTTtBQUNSLG1CQUFPLE9BQU8sS0FBSyxLQUFLO0FBQ3hCLHFCQUFTLE9BQU8sS0FBSztBQUFBLFVBQ3ZCO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFFQSxnQkFBWSxPQUFPLE1BQU07QUFDdkIsaUJBQVUsQ0FBQyxHQUFHLEtBQUssS0FBSztBQUN0QixZQUFHLGlCQUFpQixTQUFTLE9BQU8sSUFBSSxLQUFLLE1BQU07QUFDakQsZ0JBQU0sSUFBSSxJQUFJO0FBRWxCLGFBQU8sT0FBTyxLQUFLO0FBQUEsSUFDckIsR0FBRyxJQUFJO0FBRVAsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNIO0FBRUEsU0FBUyxTQUFTLFFBQWUsT0FBZTtBQUM5QyxNQUFHLGlCQUFpQixTQUFTLENBQUMsT0FBTyxJQUFJLEtBQUssR0FBRTtBQUM5QyxXQUFPLElBQUksT0FBTyxNQUFNO0FBQ3hCLFVBQU0sS0FBSztBQUFBLEVBQ2I7QUFDRjtBQUVBLFNBQVMsTUFBTSxTQUFnQixVQUFrQixVQUFtQjtBQUNsRSxRQUFNLFFBQVEsTUFBTSxJQUFJLE9BQU87QUFFL0IsTUFBRyxZQUFZLFNBQVMsYUFBYSxPQUFNO0FBQ3pDLFVBQU0sUUFBUSxNQUFNLFFBQVE7QUFFNUIsUUFBRyxVQUFVLFVBQWEsQ0FBQztBQUN6QixhQUFPO0FBQUEsRUFDWDtBQUVBLFFBQU0sUUFBUSxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksUUFBUSx3QkFBd0I7QUFDdEUsUUFBTSxVQUFVLElBQUksUUFBYSxDQUFDLFNBQVMsV0FBVztBQUNwRCxnQkFBWSxTQUFTLFNBQU87QUFDMUIsVUFBRyxRQUFRLFVBQVM7QUFDbEIsZ0JBQVEsTUFBTSxHQUFHLENBQUM7QUFDbEIsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFHLFFBQVE7QUFDVCxlQUFPLElBQUksTUFBTSxHQUFHLE9BQU8sZ0JBQWdCLENBQUM7QUFBQSxJQUNoRCxDQUFDO0FBQUEsRUFDSCxDQUFDO0FBRUQsUUFBTSxPQUFPLE9BQU8sU0FBUztBQUFBLElBQzNCLFVBQVUsTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUM1QixNQUFNO0FBQUEsSUFDTixTQUFTLE1BQU07QUFBQSxJQUNmLE9BQU8sTUFBTTtBQUFBLEVBQ2YsQ0FBQztBQUNIO0FBR0EsSUFBSTtBQUVKLFNBQVMsU0FBMEIsT0FBMEI7QUFDM0QsUUFBTSxTQUFTLENBQUM7QUFDaEIsTUFBSTtBQUVKLE1BQUcsQ0FBQyxRQUFPO0FBQ1QscUJBQWlCO0FBQ2pCLGFBQVMsb0JBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUFBLEVBQ3BDO0FBRUEsV0FBUSxDQUFDLEtBQUssS0FBSyxLQUFLLE9BQU07QUFDNUIsUUFBRyxPQUFPLElBQUksS0FBSztBQUNqQixjQUFRLE9BQU8sSUFBSSxLQUFLO0FBQUEsYUFDbEIsU0FBUyxPQUFPLFNBQVMsWUFBWSxTQUFTLFNBQVMsT0FBTyxNQUFNLFFBQVE7QUFDbEYsYUFBTyxJQUFJLE9BQU8sUUFBUSxNQUFNLElBQUksQ0FBQztBQUV2QyxXQUFPLEdBQUcsSUFBSTtBQUFBLEVBQ2hCO0FBRUEsTUFBRztBQUNELGFBQVM7QUFFWCxTQUFPLE9BQU8sT0FBTyxNQUFNO0FBQzdCO0FBRUEsU0FBUyxPQUNQLFNBQ0EsS0FDQSxPQUNBLEtBQWdDO0FBRWhDLFFBQU0sUUFBUSxNQUFNLElBQUksT0FBTztBQUUvQixNQUFHLE9BQU8sU0FBUyxLQUFLO0FBQ3RCLFVBQU0sSUFBSSxNQUFNLG1CQUFtQixPQUFPLEdBQUcsQ0FBQyxRQUFRLE9BQU8sZ0JBQWdCO0FBRS9FLFFBQU0sV0FBVyxNQUFNLEdBQUc7QUFFMUIsTUFBRyxPQUFPLE9BQU8sWUFBVztBQUMxQixVQUFNLE1BQU0sSUFBSSxLQUFLLFNBQVMsT0FBTyxRQUFRO0FBRTdDLFFBQUcsUUFBUTtBQUNULGFBQU87QUFFVCxRQUFHLE9BQU8sT0FBTztBQUNmLGNBQVEsSUFBSTtBQUFBLEVBQ2hCO0FBRUEsTUFBRyxVQUFVO0FBQ1g7QUFFRixRQUFNLEdBQUcsSUFBSTtBQUViLE1BQUcsUUFBUTtBQUNULFVBQU0sU0FBUyxHQUFHO0FBRXBCLFNBQU87QUFDVDtBQUdBLFNBQVMsTUFBSztBQUNaLFVBQVEsUUFBUSxLQUFLLE9BQU8sSUFBSSxPQUFPLFNBQVMsRUFBRSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUUsWUFBWTtBQUNsRjsiLAogICJuYW1lcyI6IFsicGVuZGluZyIsICJ1cGRhdGUiLCAiYmluZCIsICJ2YWx1ZSJdCn0K
package/dist/index.js CHANGED
@@ -974,3 +974,4 @@ function has(arg1, arg2) {
974
974
  set,
975
975
  use
976
976
  });
977
+ //# sourceMappingURL=index.js.map