@expressive/mvc 0.63.6 → 0.64.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/dist/esm/model.js CHANGED
@@ -1,4 +1,4 @@
1
- import { addListener, createEffect, event, pending, PENDING_KEYS, watch } from "./control";
1
+ import { addListener, createEffect, event, Observable, PENDING_KEYS } from "./control";
2
2
  const define = Object.defineProperty;
3
3
  const ID = /* @__PURE__ */ new WeakMap();
4
4
  const STATE = /* @__PURE__ */ new WeakMap();
@@ -12,14 +12,28 @@ class Model {
12
12
  define(this, "is", { value: this });
13
13
  init(this, args);
14
14
  }
15
+ [Observable](callback, required) {
16
+ const watch2 = /* @__PURE__ */ new Set();
17
+ const proxy = Object.create(this);
18
+ addListener(this, callback, watch2);
19
+ OBSERVER.set(proxy, (key, value) => {
20
+ if (value === void 0 && required)
21
+ throw new Error(`${this}.${key} is required in this context.`);
22
+ watch2.add(key);
23
+ if (value instanceof Object && Observable in value)
24
+ return value[Observable](callback, required);
25
+ return value;
26
+ });
27
+ return proxy;
28
+ }
15
29
  get(arg1, arg2) {
16
30
  const self = this.is;
17
31
  if (typeof arg1 == "function") {
18
- let pending2 = /* @__PURE__ */ new Set();
32
+ let pending = /* @__PURE__ */ new Set();
19
33
  return createEffect(self, (proxy) => {
20
- const cb = arg1.call(proxy, proxy, pending2);
34
+ const cb = arg1.call(proxy, proxy, pending);
21
35
  return cb === null ? null : (update2) => {
22
- pending2 = PENDING_KEYS.get(self);
36
+ pending = PENDING_KEYS.get(self);
23
37
  if (typeof cb == "function")
24
38
  cb(update2);
25
39
  };
@@ -27,23 +41,33 @@ class Model {
27
41
  }
28
42
  return arg1 === void 0 ? snapshot(self) : typeof arg2 == "function" ? addListener(self, arg2, arg1) : arg1 === null ? Object.isFrozen(STATE.get(self)) : fetch(self, arg1, arg2);
29
43
  }
30
- set(arg1, arg2) {
44
+ set(arg1, arg2, arg3) {
31
45
  const self = this.is;
32
46
  if (typeof arg1 == "function")
33
47
  return addListener(self, (key) => {
34
- if (typeof key == "string")
48
+ if (arg2 === key || arg2 === void 0 && typeof key == "string")
35
49
  return arg1.call(self, key, self);
36
50
  });
37
- if (typeof arg2 == "function")
38
- return addListener(self, (key) => {
39
- if (key === arg1)
40
- return arg2.call(self, key, self);
41
- });
42
51
  if (arg1 && typeof arg1 == "object")
43
52
  assign(self, arg1, arg2 === true);
44
- else
53
+ else if (!arg2)
45
54
  event(self, arg1);
46
- return pending(self);
55
+ else if (arg3)
56
+ manage(self, arg1, arg2);
57
+ else
58
+ update(self, arg1, arg2);
59
+ const pending = PENDING_KEYS.get(this);
60
+ if (pending)
61
+ return {
62
+ then: (res) => new Promise((res2) => {
63
+ const remove = addListener(this, (key) => {
64
+ if (key !== true) {
65
+ remove();
66
+ return res2.bind(null, Array.from(pending));
67
+ }
68
+ });
69
+ }).then(res)
70
+ };
47
71
  }
48
72
  /**
49
73
  * Iterate over managed properties in this instance of Model.
@@ -103,7 +127,7 @@ function assign(subject, data, silent) {
103
127
  else if (key in subject && key !== "is") {
104
128
  const desc = Object.getOwnPropertyDescriptor(subject, key);
105
129
  const set = desc && desc.set;
106
- set.call(subject, data[key], silent === true);
130
+ set.call(subject, data[key], silent);
107
131
  }
108
132
  }
109
133
  }
@@ -161,26 +185,10 @@ function init(model, args) {
161
185
  PARENT.set(model, null);
162
186
  for (const key in model) {
163
187
  const desc = Object.getOwnPropertyDescriptor(model, key);
164
- if ("value" in desc) {
165
- let set2 = function(value, silent) {
166
- update(model, key, value, silent);
167
- if (value instanceof Model && !PARENT.has(value)) {
168
- PARENT.set(value, model);
169
- event(value);
170
- }
171
- };
172
- var set = set2;
173
- set2(desc.value, true);
174
- define(model, key, {
175
- configurable: false,
176
- set: set2,
177
- get() {
178
- return watch(this, key, state[key]);
179
- }
180
- });
181
- }
188
+ if ("value" in desc)
189
+ manage(model, key, desc.value, true);
182
190
  }
183
- args.forEach((arg) => {
191
+ for (const arg of args) {
184
192
  const use = typeof arg == "function" ? arg.call(model, model) : arg;
185
193
  if (use instanceof Promise)
186
194
  use.catch((err) => {
@@ -191,7 +199,7 @@ function init(model, args) {
191
199
  addListener(model, use, null);
192
200
  else if (typeof use == "object")
193
201
  assign(model, use, true);
194
- });
202
+ }
195
203
  addListener(model, () => {
196
204
  for (const [_, value] of model)
197
205
  if (value instanceof Model && PARENT.get(value) === model)
@@ -201,6 +209,26 @@ function init(model, args) {
201
209
  return null;
202
210
  });
203
211
  }
212
+ function manage(target, key, value, silent) {
213
+ const state = STATE.get(target);
214
+ function get() {
215
+ return watch(this, key, state[key]);
216
+ }
217
+ function set(value2, silent2) {
218
+ update(target, key, value2, silent2);
219
+ if (value2 instanceof Model && !PARENT.has(value2)) {
220
+ PARENT.set(value2, target);
221
+ event(value2);
222
+ }
223
+ }
224
+ define(target, key, { set, get });
225
+ set(value, silent);
226
+ }
227
+ const OBSERVER = /* @__PURE__ */ new WeakMap();
228
+ function watch(from, key, value) {
229
+ const access = OBSERVER.get(from);
230
+ return access ? access(key, value) : value;
231
+ }
204
232
  function fetch(subject, property, required) {
205
233
  const state = STATE.get(subject);
206
234
  if (property in state || required === false) {
@@ -275,6 +303,7 @@ export {
275
303
  event,
276
304
  fetch,
277
305
  uid,
278
- update
306
+ update,
307
+ watch
279
308
  };
280
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT25VcGRhdGUsIHBlbmRpbmcsIFBFTkRJTkdfS0VZUywgd2F0Y2ggfSBmcm9tICcuL2NvbnRyb2wnO1xuXG5jb25zdCBkZWZpbmUgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8qKiBSZWdpc3RlciBmb3IgYWxsIGFjdGl2ZSBtb2RlbHMgdmlhIHN0cmluZyBpZGVudGlmaWVycyAodXN1YWxseSB1bmlxdWUpLiAqL1xuY29uc3QgSUQgPSBuZXcgV2Vha01hcDxNb2RlbCwgc3RyaW5nPigpO1xuXG4vKiogSW50ZXJuYWwgc3RhdGUgYXNzaWduZWQgdG8gbW9kZWxzLiAqL1xuY29uc3QgU1RBVEUgPSBuZXcgV2Vha01hcDxNb2RlbCwgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj4+KCk7XG5cbi8qKiBFeHRlcm5hbCBsaXN0ZW5lcnMgZm9yIGFueSBnaXZlbiBNb2RlbC4gKi9cbmNvbnN0IE5PVElGWSA9IG5ldyBXZWFrTWFwPE1vZGVsLlR5cGUsIFNldDxPblVwZGF0ZT4+KCk7XG5cbi8qKiBQYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy4gKi9cbmNvbnN0IFBBUkVOVCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBNb2RlbCB8IG51bGw+KCk7XG5cbi8qKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBieSBhIGdpdmVuIHR5cGUuICovXG5jb25zdCBNRVRIT0RTID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgTWFwPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IHZvaWQ+PigpO1xuXG4vKiogUmVmZXJlbmNlIGJvdW5kIGluc3RhbmNlIG1ldGhvZHMgdG8gcmVhbCBvbmVzLiAqL1xuY29uc3QgTUVUSE9EID0gbmV3IFdlYWtNYXA8YW55LCBhbnk+KCk7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIE1vZGVsIHtcbiAgLyoqIEFueSB0eXBlIG9mIE1vZGVsLCB1c2luZyBvd24gY2xhc3MgY29uc3RydWN0b3IgYXMgaXRzIGlkZW50aWZpZXIuICovXG4gIHR5cGUgVHlwZTxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgIChhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSAmIHR5cGVvZiBNb2RlbDtcblxuICAvKiogQSBNb2RlbCBjb25zdHJ1Y3RvciwgYnV0IHdoaWNoIGlzIG5vdCBhYnN0cmFjdC4gKi9cbiAgdHlwZSBJbml0PFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKG5ldyAoLi4uYXJnczogTW9kZWwuQXJnczxUPikgPT4gVCkgJiBPbWl0PHR5cGVvZiBNb2RlbCwgbmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBNb2RlbCBjb25zdHJ1Y3RvciBjYWxsYmFjayAtIGlzIGNhbGxlZCB3aGVuIE1vZGVsIGZpbmlzaGVzIGludGlhbGl6aW5nLlxuICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgQ2FsbGJhY2s8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAodGhpczogVCwgdGhpc0FyZzogVCkgPT4gUHJvbWlzZTx2b2lkPiB8ICgoKSA9PiB2b2lkKSB8IEFzc2lnbjxUPiB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50ICovXG4gIHR5cGUgQXJndW1lbnQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID0gQXNzaWduPFQ+IHwgQ2FsbGJhY2s8VD4gfCBzdHJpbmcgfCB2b2lkO1xuXG4gIC8qKiBNb2RlbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi9cbiAgdHlwZSBBcmdzPFQgZXh0ZW5kcyBNb2RlbCA9IGFueT4gPSAoQXJndW1lbnQ8VD4gfCBBcmdzPFQ+KVtdO1xuXG4gIC8qKiBTdWJzZXQgb2YgYGtleW9mIFRgIHdoaWNoIGFyZSBub3QgbWV0aG9kcyBvciBkZWZpbmVkIGJ5IGJhc2UgTW9kZWwgVS4gKiovXG4gIHR5cGUgRmllbGQ8VD4gPSBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPjtcblxuICAvKiogQW55IHZhbGlkIGtleSBmb3IgbW9kZWwsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gRmllbGQ8VD4uICovXG4gIHR5cGUgRXZlbnQ8VD4gPSBGaWVsZDxUPiB8IChzdHJpbmcgJiB7fSkgfCBudW1iZXIgfCBzeW1ib2w7XG5cbiAgLyoqIE9iamVjdCBvdmVybGF5IHRvIG92ZXJyaWRlIHZhbHVlcyBhbmQgbWV0aG9kcyBvbiBhIG1vZGVsLiAqL1xuICB0eXBlIEFzc2lnbjxUPiA9IHtcbiAgICBbSyBpbiBGaWVsZDxUPl0/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+IHtcbiAgICAgICAgICBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldChzZWxmKSE7XG4gICAgICAgICAgaWYodHlwZW9mIGNiID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGNiKHVwZGF0ZSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXJnMSA9PT0gdW5kZWZpbmVkID8gc25hcHNob3Qoc2VsZikgOlxuICAgICAgdHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiID8gYWRkTGlzdGVuZXIoc2VsZiwgYXJnMiwgYXJnMSkgOlxuICAgICAgYXJnMSA9PT0gbnVsbCA/IE9iamVjdC5pc0Zyb3plbihTVEFURS5nZXQoc2VsZikpIDpcbiAgICAgIGZldGNoKHNlbGYsIGFyZzEsIGFyZzIpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIGB1bmRlZmluZWRgIGlmIHRoZXJlIG5vIHVwZGF0ZSBpcyBwZW5kaW5nLlxuICAgKiovXG4gIHNldCgpOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVXBkYXRlIG11bGl0cGxlIHByb3BlcnRpZXMgYXQgb25jZS4gTWVyZ2VzIGFyZ3VtZW50IHdpdGggY3VycmVudCBzdGF0ZS5cbiAgICogUHJvcGVydGllcyB3aGljaCBhcmUgbm90IG1hbmFnZWQgYnkgdGhpcyBtb2RlbCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gYXNzaWduIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBzaWxlbnQgLSBJZiBhbiB1cGRhdGUgZG9lcyBvY2N1ciwgbGlzdGVuZXJzIHdpbGwgbm90IGJlIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQsIGB1bmRlZmluZWRgIChpbW1lZGlhdGVseSkgaWYgYSBub29wLlxuICAgKi9cbiAgc2V0KGFzc2lnbj86IE1vZGVsLkFzc2lnbjx0aGlzPiwgc2lsZW50PzogYm9vbGVhbik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQdXNoIGFuIHVwZGF0ZS4gVGhpcyB3aWxsIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFzc29jaWF0ZWQgcHJvcGVydHkuXG4gICAqIFxuICAgKiBVc2VmdWwgd2hlcmUgYSBwcm9wZXJ0eSB2YWx1ZSBpbnRlcm5hbGx5IGhhcyBjaGFuZ2VkLCBidXQgdGhlIG9iamVjdCBpcyB0aGUgc2FtZS5cbiAgICogRm9yIGV4YW1wbGU6IEFuIGFycmF5IGhhcyBwdXNoZWQgYSBuZXcgdmFsdWUsIG9yIGEgbmVzdGVkIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgdG8gZGlzcGF0Y2ggYXJiaXRyYXJ5IGV2ZW50cy5cbiAgICogU3ltYm9scyBhcmUgcmVjb21tZW5kZWQgYXMgbm9uLXByb3BlcnR5IGV2ZW50cywgaG93ZXZlciB5b3UgY2FuIHVzZSBhbnkgc3RyaW5nLlxuICAgKiBJZiBkb2luZyBzbywgYmUgc3VyZSB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggcHJvcGVydHkgbmFtZXMhIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXNcbiAgICogdG8gcHJlZml4IGFuIGV2ZW50IHdpdGggXCIhXCIgYW5kL29yIHVzZSBkYXNoLWNhc2UuIGUuZy4gYHNldChcIiFldmVudFwiKWAgb3IgYHNldChcIm15LWV2ZW50XCIpYC5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSBvciBldmVudCB0byBkaXNwYXRjaC5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQuXG4gICAqL1xuICBzZXQoa2V5OiBNb2RlbC5FdmVudDx0aGlzPik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+O1xuXG4gIC8qKlxuICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBcbiAgICogR2l2ZW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBhc3NpZ25tZW50ICh3aGljaCBjaGFuZ2VzIHZhbHVlKSBvciBleHBsaWNpdCBgc2V0YC5cbiAgICogXG4gICAqIFRvIHJ1biBsb2dpYyBvbiBmaW5hbCB2YWx1ZSBvbmx5LCBjYWxsYmFjayBtYXkgcmV0dXJuIGEgZnVuY3Rpb24uIFVzaW5nIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gcmVtb3ZlIGxpc3RlbmVyLiBXaWxsIHJldHVybiBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiBpbmFjdGl2ZSBhbHJlYWR5LlxuICAgKiBcbiAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+KTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBVbmxpa2UgYGdldGAsIHRoaXMgY2Fsc2wgc3luY2hyb25vdXNseSBhbmQgd2lsbCBmaXJlIGFzIG1hbnkgdGltZXMgYXMgdGhlIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsLCBjYWxsYmFjazogTW9kZWwuT25FdmVudDx0aGlzPik6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlY2xhcmUgYW4gZW5kIHRvIHVwZGF0ZXMuIFRoaXMgZXZlbnQgaXMgZmluYWwgYW5kIHdpbGwgZnJlZXplIHN0YXRlLlxuICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB3YXRjaGVkIGZvciBhcyB3ZWxsLCB0byBydW4gY2xlYW51cCBsb2dpYyBhbmQgaW50ZXJuYWxseSB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBlbmQgdXBkYXRlcy5cbiAgICovXG4gIHNldChzdGF0dXM6IG51bGwpOiB2b2lkO1xuXG4gIHNldChcbiAgICBhcmcxPzogTW9kZWwuT25FdmVudDx0aGlzPiB8IE1vZGVsLkFzc2lnbjx0aGlzPiB8IE1vZGVsLkV2ZW50PHRoaXM+IHwgbnVsbCxcbiAgICBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uRXZlbnQ8dGhpcz4pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYodHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG4gICAgICBcbiAgICBpZih0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYoa2V5ID09PSBhcmcxKVxuICAgICAgICAgIHJldHVybiBhcmcyLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pO1xuXG4gICAgaWYoYXJnMSAmJiB0eXBlb2YgYXJnMSA9PSBcIm9iamVjdFwiKVxuICAgICAgYXNzaWduKHNlbGYsIGFyZzEsIGFyZzIgPT09IHRydWUpO1xuICAgIGVsc2VcbiAgICAgIGV2ZW50KHNlbGYsIGFyZzEpO1xuXG4gICAgcmV0dXJuIHBlbmRpbmcoc2VsZik7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIG1hbmFnZWQgcHJvcGVydGllcyBpbiB0aGlzIGluc3RhbmNlIG9mIE1vZGVsLlxuICAgKiBZZWlsZHMgdGhlIGtleSBhbmQgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFtzdHJpbmcsIHVua25vd25dPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKFNUQVRFLmdldCh0aGlzLmlzKSEpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFjdGl2YXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuXG4gICAqIFxuICAgKiAqKkltcG9ydGFudCoqIC0gVW5saWtlIGBuZXcgdGhpcyguLi4pYCAtIHRoaXMgbWV0aG9kIGFsc28gYWN0aXZhdGVzIHN0YXRlLlxuICAgKiBcbiAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgc2VudCB0byBjb25zdHJ1Y3RvclxuICAgKi9cbiAgc3RhdGljIG5ldzxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLkluaXQ8VD4sIC4uLmFyZ3M6IE1vZGVsLkFyZ3M8VD4pe1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgZXZlbnQoaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgZXF1aXZhbGVudCBvZiBgeCBpbnN0YW5jZW9mIHRoaXNgLlxuICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICogSWYgc28sIGxhbmd1YWdlIHNlcnZlciB3aWxsIG1ha2UgYXZhaWxhYmxlIGFsbCBzdGF0aWNcbiAgICogbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGlzPFQgZXh0ZW5kcyBNb2RlbC5UeXBlPih0aGlzOiBULCBtYXliZTogdW5rbm93bik6IG1heWJlIGlzIFQge1xuICAgIHJldHVybiBtYXliZSA9PT0gdGhpcyB8fCB0eXBlb2YgbWF5YmUgPT0gXCJmdW5jdGlvblwiICYmIG1heWJlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBydW4gd2hlbiBhbnkgaW5zdGFuY2Ugb2YgdGhpcyBNb2RlbCBpcyB1cGRhdGVkLiBcbiAgICovXG4gIHN0YXRpYyBvbjxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLlR5cGU8VD4sIGxpc3RlbmVyOiBNb2RlbC5PbkV2ZW50PFQ+KXtcbiAgICBsZXQgbm90aWZ5ID0gTk9USUZZLmdldCh0aGlzKTtcblxuICAgIGlmKCFub3RpZnkpXG4gICAgICBOT1RJRlkuc2V0KHRoaXMsIG5vdGlmeSA9IG5ldyBTZXQpO1xuXG4gICAgbm90aWZ5LmFkZChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gbm90aWZ5LmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVmaW5lKE1vZGVsLnByb3RvdHlwZSwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIElELmdldCh0aGlzLmlzKTtcbiAgfVxufSk7XG5cbmRlZmluZShNb2RlbCwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGFzc2lnbihzdWJqZWN0OiBNb2RlbCwgZGF0YTogTW9kZWwuQXNzaWduPE1vZGVsPiwgc2lsZW50PzogYm9vbGVhbil7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChzdWJqZWN0LmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGUpITtcbiAgICBcbiAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICBjb25zdCBiaW5kID0gbWV0aG9kcy5nZXQoa2V5KTtcblxuICAgIGlmKGJpbmQpXG4gICAgICBiaW5kLmNhbGwoc3ViamVjdCwgZGF0YVtrZXldKTtcbiAgICBlbHNlIGlmKGtleSBpbiBzdWJqZWN0ICYmIGtleSAhPT0gXCJpc1wiKXtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN1YmplY3QsIGtleSkhO1xuICAgICAgY29uc3Qgc2V0ID0gZGVzYyAmJiBkZXNjLnNldCBhcyAodmFsdWU6IGFueSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcblxuICAgICAgc2V0LmNhbGwoc3ViamVjdCwgZGF0YVtrZXldLCBzaWxlbnQgPT09IHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQXBwbHkgaW5zdHJ1Y3Rpb25zIGFuZCBpbmhlcml0ZWQgZXZlbnQgbGlzdGVuZXJzLiBFbnN1cmUgY2xhc3MgbWV0YWRhdGEgaXMgcmVhZHkuICovXG5mdW5jdGlvbiBwcmVwYXJlKG1vZGVsOiBNb2RlbCl7XG4gIGxldCBUID0gbW9kZWwuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZTtcblxuICBpZihUID09PSBNb2RlbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGJhc2UgTW9kZWwuXCIpO1xuXG4gIGNvbnN0IGNoYWluID0gW10gYXMgTW9kZWwuVHlwZVtdO1xuICBsZXQga2V5cyA9IG5ldyBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4oKTtcblxuICBJRC5zZXQobW9kZWwsIGAke1R9LSR7dWlkKCl9YCk7XG5cbiAgd2hpbGUoVC5uYW1lKXtcbiAgICBmb3IoY29uc3QgY2Igb2YgTk9USUZZLmdldChUKSB8fCBbXSlcbiAgICAgIGFkZExpc3RlbmVyKG1vZGVsLCBjYik7XG5cbiAgICBpZihUID09PSBNb2RlbCkgYnJlYWs7XG4gICAgZWxzZSBjaGFpbi51bnNoaWZ0KFQpO1xuXG4gICAgVCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihUKVxuICB9XG5cbiAgZm9yKGNvbnN0IHR5cGUgb2YgY2hhaW4pe1xuICAgIGlmKE1FVEhPRFMuaGFzKHR5cGUpKXtcbiAgICAgIGtleXMgPSBNRVRIT0RTLmdldCh0eXBlKSE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBNRVRIT0RTLnNldCh0eXBlLCBrZXlzID0gbmV3IE1hcChrZXlzKSk7XG5cbiAgICBmb3IoY29uc3QgW2tleSwgeyB2YWx1ZSB9XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHR5cGUucHJvdG90eXBlKVxuICAgICkpe1xuICAgICAgaWYoIXZhbHVlIHx8IGtleSA9PSBcImNvbnN0cnVjdG9yXCIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICBmdW5jdGlvbiBiaW5kKHRoaXM6IE1vZGVsLCBvcmlnaW5hbD86IEZ1bmN0aW9uKXtcbiAgICAgICAgY29uc3QgeyBpcyB9ID0gdGhpcztcblxuICAgICAgICBpZihpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFvcmlnaW5hbClcbiAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgRnVuY3Rpb247XG5cbiAgICAgICAgY29uc3QgZm4gPSBvcmlnaW5hbCB8fCB2YWx1ZTtcbiAgICAgICAgY29uc3QgYm91bmQgPSBmbi5iaW5kKGlzKTtcbiAgICAgICAgXG4gICAgICAgIE1FVEhPRC5zZXQoYm91bmQsIGZuKTtcbiAgICAgICAgZGVmaW5lKGlzLCBrZXksIHsgdmFsdWU6IGJvdW5kLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICAgIH1cblxuICAgICAga2V5cy5zZXQoa2V5LCBiaW5kKTtcbiAgICAgIGRlZmluZSh0eXBlLnByb3RvdHlwZSwga2V5LCB7IGdldDogYmluZCwgc2V0OiBiaW5kIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwcGx5IG1vZGVsIGFyZ3VlbW50cywgcnVuIGNhbGxiYWNrcyBhbmQgb2JzZXJ2ZSBwcm9wZXJ0aWVzLlxuICogQWNjdW11bGF0ZSBhbmQgaGFuZGxlIGNsZWFudXAgZXZlbnRzLlxuICoqL1xuZnVuY3Rpb24gaW5pdChtb2RlbDogTW9kZWwsIGFyZ3M6IE1vZGVsLkFyZ3Mpe1xuICBjb25zdCBzdGF0ZSA9IHt9IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gIFNUQVRFLnNldChtb2RlbCwgc3RhdGUpO1xuXG4gIGFyZ3MgPSBhcmdzLmZsYXQoKS5maWx0ZXIoYXJnID0+IHtcbiAgICBpZih0eXBlb2YgYXJnICE9IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIElELnNldChtb2RlbCwgYXJnKTtcbiAgfSk7XG5cbiAgYWRkTGlzdGVuZXIobW9kZWwsICgpID0+IHtcbiAgICBpZighUEFSRU5ULmhhcyhtb2RlbCkpXG4gICAgICBQQVJFTlQuc2V0KG1vZGVsLCBudWxsKTtcblxuICAgIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuXG4gICAgICBpZihcInZhbHVlXCIgaW4gZGVzYyl7XG4gICAgICAgIGZ1bmN0aW9uIHNldCh2YWx1ZTogdW5rbm93biwgc2lsZW50PzogYm9vbGVhbil7XG4gICAgICAgICAgdXBkYXRlKG1vZGVsLCBrZXksIHZhbHVlLCBzaWxlbnQpO1xuICAgICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgIVBBUkVOVC5oYXModmFsdWUpKXtcbiAgICAgICAgICAgIFBBUkVOVC5zZXQodmFsdWUsIG1vZGVsKTtcbiAgICAgICAgICAgIGV2ZW50KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXQoZGVzYy52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGRlZmluZShtb2RlbCwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzZXQsXG4gICAgICAgICAgZ2V0KCl7XG4gICAgICAgICAgICByZXR1cm4gd2F0Y2godGhpcywga2V5LCBzdGF0ZVtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBhcmdzLmZvckVhY2goKGFyZykgPT4ge1xuICAgICAgY29uc3QgdXNlID0gdHlwZW9mIGFyZyA9PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBhcmcuY2FsbChtb2RlbCwgbW9kZWwpXG4gICAgICAgIDogYXJnIGFzIE1vZGVsLkFzc2lnbjxNb2RlbD47XG5cbiAgICAgIGlmKHVzZSBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgIHVzZS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFzeW5jIGVycm9yIGluIGNvbnN0cnVjdG9yIGZvciAke21vZGVsfTpgKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgYWRkTGlzdGVuZXIobW9kZWwsIHVzZSwgbnVsbClcbiAgICAgIGVsc2UgaWYodHlwZW9mIHVzZSA9PSBcIm9iamVjdFwiKVxuICAgICAgICBhc3NpZ24obW9kZWwsIHVzZSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgICAgZm9yKGNvbnN0IFtfLCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IG1vZGVsKVxuICAgICAgICAgIHZhbHVlLnNldChudWxsKTtcbiAgXG4gICAgICBPYmplY3QuZnJlZXplKHN0YXRlKTtcbiAgICB9LCBudWxsKTtcbiAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmZXRjaChzdWJqZWN0OiBNb2RlbCwgcHJvcGVydHk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuICBcbiAgaWYocHJvcGVydHkgaW4gc3RhdGUgfHwgcmVxdWlyZWQgPT09IGZhbHNlKXtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3ViamVjdH0uJHtwcm9wZXJ0eX0gaXMgbm90IHlldCBhdmFpbGFibGUuYCk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBrZXkgPT4ge1xuICAgICAgaWYoa2V5ID09PSBwcm9wZXJ0eSl7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihrZXkgPT09IG51bGwpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gIH0pO1xufVxuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgbW9kZWxzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gc25hcHNob3Q8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCk6IE1vZGVsLlN0YXRlPFQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge30gYXMgYW55O1xuICBsZXQgaXNOb3RSZWN1cnNpdmU7XG5cbiAgaWYoIUVYUE9SVCl7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1ttb2RlbCwgdmFsdWVzXV0pO1xuICB9XG5cbiAgZm9yKGxldCBba2V5LCB2YWx1ZV0gb2YgbW9kZWwpe1xuICAgIGlmKEVYUE9SVC5oYXModmFsdWUpKVxuICAgICAgdmFsdWUgPSBFWFBPUlQuZ2V0KHZhbHVlKTtcbiAgICBlbHNlIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIFwiZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgRVhQT1JULnNldCh2YWx1ZSwgdmFsdWUgPSB2YWx1ZS5nZXQoKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYoaXNOb3RSZWN1cnNpdmUpXG4gICAgRVhQT1JUID0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZTxUPihcbiAgc3ViamVjdDogTW9kZWwsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICB2YWx1ZTogVCxcbiAgYXJnPzogYm9vbGVhbiB8IE1vZGVsLlNldHRlcjxUPil7XG5cbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKE9iamVjdC5pc0Zyb3plbihzdGF0ZSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1cGRhdGUgJHtTdHJpbmcoa2V5KX0gYnV0ICR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiKXtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdmFsdWUgPSBvdXQoKTtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSBwcmV2aW91cyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBzdGF0ZVtrZXldID0gdmFsdWU7XG5cbiAgaWYoYXJnICE9PSB0cnVlKVxuICAgIGV2ZW50KHN1YmplY3QsIGtleSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBSYW5kb20gYWxwaGFudW1iZXJpYyBvZiBsZW5ndGggNjsgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbGV0dGVyLiAqL1xuZnVuY3Rpb24gdWlkKCl7XG4gIHJldHVybiAoMC4yNzggKyBNYXRoLnJhbmRvbSgpICogMC43MjIpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCkudG9VcHBlckNhc2UoKTtcbn1cblxuZXhwb3J0IHtcbiAgZXZlbnQsXG4gIGZldGNoLFxuICBNRVRIT0QsXG4gIE1vZGVsLFxuICBQQVJFTlQsXG4gIFNUQVRFLFxuICB1aWQsXG4gIHVwZGF0ZSxcbn0iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLGFBQWEsY0FBYyxPQUFpQixTQUFTLGNBQWMsYUFBYTtBQUV6RixNQUFNLFNBQVMsT0FBTztBQUd0QixNQUFNLEtBQUssb0JBQUksUUFBdUI7QUFHdEMsTUFBTSxRQUFRLG9CQUFJLFFBQTBEO0FBRzVFLE1BQU0sU0FBUyxvQkFBSSxRQUFtQztBQUd0RCxNQUFNLFNBQVMsb0JBQUksUUFBNkI7QUFHaEQsTUFBTSxVQUFVLG9CQUFJLFFBQXVEO0FBRzNFLE1BQU0sU0FBUyxvQkFBSSxRQUFrQjtBQW1IckMsTUFBZSxNQUFNO0FBQUEsRUFDbkIsZUFBZSxNQUFpQjtBQUM5QixZQUFRLElBQUk7QUFDWixXQUFPLE1BQU0sTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ2xDLFNBQUssTUFBTSxJQUFJO0FBQUEsRUFDakI7QUFBQSxFQXFEQSxJQUFJLE1BQTJDLE1BQTJDO0FBQ3hGLFVBQU0sT0FBTyxLQUFLO0FBRWxCLFFBQUcsT0FBTyxRQUFRLFlBQVc7QUFDM0IsVUFBSUEsV0FBVSxvQkFBSSxJQUF1QjtBQUV6QyxhQUFPLGFBQWEsTUFBTSxDQUFDLFVBQVU7QUFDbkMsY0FBTSxLQUFLLEtBQUssS0FBSyxPQUFPLE9BQU9BLFFBQU87QUFFMUMsZUFBTyxPQUFPLE9BQU8sT0FBUSxDQUFDQyxZQUFXO0FBQ3ZDLFVBQUFELFdBQVUsYUFBYSxJQUFJLElBQUk7QUFDL0IsY0FBRyxPQUFPLE1BQU07QUFDZCxlQUFHQyxPQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUNFLFNBQVMsU0FBWSxTQUFTLElBQUksSUFDbEMsT0FBTyxRQUFRLGFBQWEsWUFBWSxNQUFNLE1BQU0sSUFBSSxJQUN4RCxTQUFTLE9BQU8sT0FBTyxTQUFTLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFDL0MsTUFB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
309
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT2JzZXJ2YWJsZSwgT25VcGRhdGUsIFBFTkRJTkdfS0VZUyB9IGZyb20gJy4vY29udHJvbCc7XG5cbmNvbnN0IGRlZmluZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLyoqIFJlZ2lzdGVyIGZvciBhbGwgYWN0aXZlIG1vZGVscyB2aWEgc3RyaW5nIGlkZW50aWZpZXJzICh1c3VhbGx5IHVuaXF1ZSkuICovXG5jb25zdCBJRCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBzdHJpbmc+KCk7XG5cbi8qKiBJbnRlcm5hbCBzdGF0ZSBhc3NpZ25lZCB0byBtb2RlbHMuICovXG5jb25zdCBTVEFURSA9IG5ldyBXZWFrTWFwPE1vZGVsLCBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPj4oKTtcblxuLyoqIEV4dGVybmFsIGxpc3RlbmVycyBmb3IgYW55IGdpdmVuIE1vZGVsLiAqL1xuY29uc3QgTk9USUZZID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgU2V0PE9uVXBkYXRlPj4oKTtcblxuLyoqIFBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLiAqL1xuY29uc3QgUEFSRU5UID0gbmV3IFdlYWtNYXA8TW9kZWwsIE1vZGVsIHwgbnVsbD4oKTtcblxuLyoqIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGJ5IGEgZ2l2ZW4gdHlwZS4gKi9cbmNvbnN0IE1FVEhPRFMgPSBuZXcgV2Vha01hcDxNb2RlbC5UeXBlLCBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4+KCk7XG5cbi8qKiBSZWZlcmVuY2UgYm91bmQgaW5zdGFuY2UgbWV0aG9kcyB0byByZWFsIG9uZXMuICovXG5jb25zdCBNRVRIT0QgPSBuZXcgV2Vha01hcDxhbnksIGFueT4oKTtcblxuZGVjbGFyZSBuYW1lc3BhY2UgTW9kZWwge1xuICAvKiogQW55IHR5cGUgb2YgTW9kZWwsIHVzaW5nIG93biBjbGFzcyBjb25zdHJ1Y3RvciBhcyBpdHMgaWRlbnRpZmllci4gKi9cbiAgdHlwZSBUeXBlPFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpICYgdHlwZW9mIE1vZGVsO1xuXG4gIC8qKiBBIE1vZGVsIGNvbnN0cnVjdG9yLCBidXQgd2hpY2ggaXMgbm90IGFic3RyYWN0LiAqL1xuICB0eXBlIEluaXQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAobmV3ICguLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KSA9PiBUKSAmIE9taXQ8dHlwZW9mIE1vZGVsLCBuZXZlcj47XG5cbiAgLyoqXG4gICAqIE1vZGVsIGNvbnN0cnVjdG9yIGNhbGxiYWNrIC0gaXMgY2FsbGVkIHdoZW4gTW9kZWwgZmluaXNoZXMgaW50aWFsaXppbmcuXG4gICAqIFJldHVybmVkIGZ1bmN0aW9uIHdpbGwgcnVuIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBDYWxsYmFjazxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgICh0aGlzOiBULCB0aGlzQXJnOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgKCgpID0+IHZvaWQpIHwgQXNzaWduPFQ+IHwgdm9pZDtcblxuICAvKiogTW9kZWwgY29uc3RydWN0b3IgYXJndW1lbnQgKi9cbiAgdHlwZSBBcmd1bWVudDxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPSBBc3NpZ248VD4gfCBDYWxsYmFjazxUPiB8IHN0cmluZyB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAqL1xuICB0eXBlIEFyZ3M8VCBleHRlbmRzIE1vZGVsID0gYW55PiA9IChBcmd1bWVudDxUPiB8IEFyZ3M8VD4pW107XG5cbiAgLyoqIFN1YnNldCBvZiBga2V5b2YgVGAgd2hpY2ggYXJlIG5vdCBtZXRob2RzIG9yIGRlZmluZWQgYnkgYmFzZSBNb2RlbCBVLiAqKi9cbiAgdHlwZSBGaWVsZDxUPiA9IEV4Y2x1ZGU8a2V5b2YgVCwga2V5b2YgTW9kZWw+O1xuXG4gIC8qKiBBbnkgdmFsaWQga2V5IGZvciBtb2RlbCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBGaWVsZDxUPi4gKi9cbiAgdHlwZSBFdmVudDxUPiA9IEZpZWxkPFQ+IHwgKHN0cmluZyAmIHt9KSB8IG51bWJlciB8IHN5bWJvbDtcblxuICAvKiogT2JqZWN0IG92ZXJsYXkgdG8gb3ZlcnJpZGUgdmFsdWVzIGFuZCBtZXRob2RzIG9uIGEgbW9kZWwuICovXG4gIHR5cGUgQXNzaWduPFQ+ID0ge1xuICAgIFtLIGluIEZpZWxkPFQ+XT86XG4gICAgICBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgXG4gICAgICAgID8gKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgICAgOiBUW0tdO1xuICB9ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4cG9ydC9JbXBvcnQgY29tcGF0aWJsZSB2YWx1ZSBmb3IgYSBnaXZlbiBwcm9wZXJ0eSBpbiBhIE1vZGVsLiAqL1xuICB0eXBlIEV4cG9ydDxSPiA9IFIgZXh0ZW5kcyB7IGdldCgpOiBpbmZlciBUIH0gPyBUIDogUjtcblxuICAvKiogVmFsdWUgZm9yIGEgcHJvcGVydHkgbWFuYWdlZCBieSBhIG1vZGVsLiAqL1xuICB0eXBlIFZhbHVlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgSyBleHRlbmRzIGtleW9mIFQgPyBFeHBvcnQ8VFtLXT4gOiB1bmtub3duO1xuXG4gIHR5cGUgT25FdmVudDxUIGV4dGVuZHMgTW9kZWw+ID1cbiAgICAodGhpczogVCwga2V5OiB1bmtub3duLCBzb3VyY2U6IFQpID0+ICgoKSA9PiB2b2lkKSB8IHZvaWQgfCBudWxsO1xuXG4gIHR5cGUgT25VcGRhdGU8VCBleHRlbmRzIE1vZGVsLCBLIGV4dGVuZHMgRXZlbnQ8VD4+ID1cbiAgICAodGhpczogVCwga2V5OiBLLCB0aGlzQXJnOiBLKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgZnJvbSBjdXJyZW50IHN0YXRlIG9mIGdpdmVuIG1vZGVsLlxuICAgKiBEaWZmZXJzIGZyb20gYFZhbHVlc2AgYXMgdmFsdWVzIGhlcmUgd2lsbCBkcmlsbFxuICAgKiBpbnRvIFwicmVhbFwiIHZhbHVlcyBoZWxkIGJ5IGV4b3RpY3MgbGlrZSByZWYuT2JqZWN0LlxuICAgKi9cbiAgdHlwZSBTdGF0ZTxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dOiBFeHBvcnQ8VFtQXT4gfTtcblxuICAvKiogT2JqZWN0IGNvbXBlcmFibGUgdG8gZGF0YSBmb3VuZCBpbiBULiAqL1xuICB0eXBlIFZhbHVlczxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dPzogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIEV4b3RpYyB2YWx1ZSwgd2hlcmUgYWN0dWFsIHZhbHVlIGlzIGNvbnRhaW5lZCB3aXRoaW4uICovXG4gIHR5cGUgUmVmPFQgPSBhbnk+ID0ge1xuICAgIChuZXh0OiBUKTogdm9pZDtcbiAgICBjdXJyZW50OiBUIHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIHN1YnNjcmliZWQgdG8gcGFyZW50IGFuZCB1cGRhdGVzIHdoZW4gYWNjZXNzZWQgcHJvcGVydGllcyBjaGFuZ2UuXG4gICAqIFxuICAgKiBAcGFyYW0gY3VycmVudCAtIEN1cnJlbnQgc3RhdGUgb2YgdGhpcyBtb2RlbC4gVGhpcyBpcyBhIHByb3h5IHdoaWNoIGRldGVjdHMgcHJvcGVydGllcyB3aGljaFxuICAgKiB3aGVyZSBhY2Nlc3NlZCwgYW5kIHRodXMgZGVwZW5kZWQgdXBvbiB0byBzdGF5IGN1cnJlbnQuXG4gICAqIFxuICAgKiBAcGFyYW0gdXBkYXRlIC0gU2V0IG9mIHByb3BlcnRpZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkLCBhbmQgZXZlbnRzIGZpcmVkLCBzaW5jZSBsYXN0IHVwZGF0ZS5cbiAgICogXG4gICAqIEByZXR1cm5zIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGVmZmVjdCBpcyBzdGFsZS5cbiAgICovXG4gIHR5cGUgRWZmZWN0PFQ+ID0gKHRoaXM6IFQsIGN1cnJlbnQ6IFQsIHVwZGF0ZTogU2V0PEV2ZW50PFQ+PikgPT5cbiAgICBFZmZlY3RDYWxsYmFjayB8IFByb21pc2U8dm9pZD4gfCBudWxsIHwgdm9pZDtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5lZCBieSBlZmZlY3QuIFdpbGwgYmUgY2FsbGVkIHdoZW4gZWZmZWN0IGlzIHN0YWxlLlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIGB0cnVlYCBpZiB1cGRhdGUgaXMgcGVuZGluZywgYGZhbHNlYCBlZmZlY3QgaGFzIGJlZW4gY2FuY2VsbGVkLCBgbnVsbGAgaWYgbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBFZmZlY3RDYWxsYmFjayA9ICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCk7XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IGluaXRpYWxpemVyLCB3aWxsIHJ1biB1cG9uIGluc3RhbmNlIGNyZWF0aW9uLlxuICAgKiBPcHRpb25hbCByZXR1cm5lZCBjYWxsYmFjayB3aWxsIHJ1biB3aGVuIG9uY2UgdXBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICB0eXBlIEluc3RydWN0aW9uPFQgPSBhbnksIE0gZXh0ZW5kcyBNb2RlbCA9IGFueT4gPVxuICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGFsbG93IGZvciBudW1iZXJzL3N5bWJvbCBwcm9wZXJ0aWVzP1xuICAgICh0aGlzOiBNLCBrZXk6IEV4dHJhY3Q8RmllbGQ8TT4sIHN0cmluZz4sIHRoaXNBcmc6IE0sIHN0YXRlOiBTdGF0ZTxNPikgPT5cbiAgICAgIERlc2NyaXB0b3I8VD4gfCAoKHNvdXJjZTogTSkgPT4gVCkgfCB2b2lkO1xuXG4gIHR5cGUgR2V0dGVyPFQ+ID0gKHNvdXJjZTogTW9kZWwpID0+IFQ7XG4gIHR5cGUgU2V0dGVyPFQ+ID0gKHZhbHVlOiBULCBwcmV2aW91czogVCkgPT4gYm9vbGVhbiB8IHZvaWQgfCAoKCkgPT4gVCk7XG5cbiAgdHlwZSBEZXNjcmlwdG9yPFQgPSBhbnk+ID0ge1xuICAgIGdldD86IEdldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgc2V0PzogU2V0dGVyPFQ+IHwgYm9vbGVhbjtcbiAgICBlbnVtZXJhYmxlPzogYm9vbGVhbjtcbiAgICB2YWx1ZT86IFQ7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1vZGVsIHtcbiAgLyoqXG4gICAqIExvb3BiYWNrIHRvIGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaW4gYSBzdWJzY3JpYmVkIGNvbnRleHQsXG4gICAqIHRvIGtlZXAgd3JpdGUgYWNjZXNzIHRvIGB0aGlzYCBhZnRlciBhIGRlc3RydWN0dXJlLiBZb3UgY2FuIHVzZSBpdCB0byByZWFkIHZhcmlhYmxlcyBzaWxlbnRseSBhcyB3ZWxsLlxuICAgKiovXG4gIGlzOiB0aGlzO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBNb2RlbCBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIFtPYnNlcnZhYmxlXShjYWxsYmFjazogT25VcGRhdGUsIHJlcXVpcmVkPzogYm9vbGVhbil7XG4gICAgY29uc3Qgd2F0Y2ggPSBuZXcgU2V0PE1vZGVsLkV2ZW50PHRoaXM+PigpO1xuICAgIGNvbnN0IHByb3h5ID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICBcbiAgICBhZGRMaXN0ZW5lcih0aGlzLCBjYWxsYmFjaywgd2F0Y2gpO1xuICAgIE9CU0VSVkVSLnNldChwcm94eSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcmVxdWlyZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfS4ke2tleX0gaXMgcmVxdWlyZWQgaW4gdGhpcyBjb250ZXh0LmApO1xuXG4gICAgICB3YXRjaC5hZGQoa2V5KTtcblxuICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgT2JzZXJ2YWJsZSBpbiB2YWx1ZSlcbiAgICAgICAgcmV0dXJuIHZhbHVlW09ic2VydmFibGVdKGNhbGxiYWNrLCByZXF1aXJlZCk7XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm94eSBhcyB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1bGwgY3VycmVudCB2YWx1ZXMgZnJvbSBzdGF0ZS4gRmxhdHRlbnMgYWxsIG1vZGVscyBhbmQgZXhvdGljIHZhbHVlcyByZWN1cnNpdmVseS5cbiAgICogXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGFsbCB2YWx1ZXMgZnJvbSB0aGlzIG1vZGVsLlxuICAgKiovXG4gIGdldCgpOiBNb2RlbC5TdGF0ZTx0aGlzPjtcblxuICAvKipcbiAgICogUnVuIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBydW4gYXV0b21hdGljYWxseSB3aGVuIGFjY2Vzc2VkIHZhbHVlcyBjaGFuZ2UuXG4gICAqIFxuICAgKiBAcGFyYW0gZWZmZWN0IEZ1bmN0aW9uIHRvIHJ1biwgYW5kIGFnYWluIHdoZW5ldmVyIGFjY2Vzc2VkIHZhbHVlcyBjaGFuZ2UuXG4gICAqICAgICAgICAgICAgICAgSWYgZWZmZWN0IHJldHVybnMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGNoYW5nZSBvY2N1cnMgKHN5bmNyb25vdXNseSksXG4gICAqICAgICAgICAgICAgICAgZWZmZWN0IGlzIGNhbmNlbGxlZCwgb3IgcGFyZW50IG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0KGVmZmVjdDogTW9kZWwuRWZmZWN0PHRoaXM+KTogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogR2V0IHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gZ2V0IHZhbHVlIG9mLlxuICAgKiBAcGFyYW0gcmVxdWlyZWQgLSBJZiB0cnVlLCB3aWxsIHRocm93IGFuIGVycm9yIGlmIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIFZhbHVlIG9mIHByb3BlcnR5LlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBNb2RlbC5FdmVudDx0aGlzPj4oa2V5OiBULCByZXF1aXJlZD86IGJvb2xlYW4pOiBNb2RlbC5WYWx1ZTx0aGlzLCBUPjtcblxuICAvKipcbiAgICogUnVuIGEgZnVuY3Rpb24gd2hlbiBhIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIE1vZGVsLkV2ZW50PHRoaXM+PihrZXk6IFQsIGNhbGxiYWNrOiBNb2RlbC5PblVwZGF0ZTx0aGlzLCBUPik6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG1vZGVsIGlzIGV4cGlyZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gc3RhdHVzIC0gYG51bGxgIHRvIGNoZWNrIGlmIG1vZGVsIGlzIGV4cGlyZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBtb2RlbCBpcyBleHBpcmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGdldChzdGF0dXM6IG51bGwpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIG1vZGVsIGlzIHRvIGJlIGRlc3Ryb3llZC5cbiAgICogXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldChzdGF0dXM6IG51bGwsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcblxuICBnZXQoYXJnMT86IE1vZGVsLkVmZmVjdDx0aGlzPiB8IHN0cmluZyB8IG51bGwsIGFyZzI/OiBib29sZWFuIHwgTW9kZWwuT25VcGRhdGU8dGhpcywgYW55Pil7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgbGV0IHBlbmRpbmcgPSBuZXcgU2V0PE1vZGVsLkV2ZW50PHRoaXM+PigpO1xuXG4gICAgICByZXR1cm4gY3JlYXRlRWZmZWN0KHNlbGYsIChwcm94eSkgPT4ge1xuICAgICAgICBjb25zdCBjYiA9IGFyZzEuY2FsbChwcm94eSwgcHJveHksIHBlbmRpbmcpO1xuXG4gICAgICAgIHJldHVybiBjYiA9PT0gbnVsbCA/IG51bGwgOiAoKHVwZGF0ZSkgPT4ge1xuICAgICAgICAgIHBlbmRpbmcgPSBQRU5ESU5HX0tFWVMuZ2V0KHNlbGYpITtcbiAgICAgICAgICBpZih0eXBlb2YgY2IgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgY2IodXBkYXRlKTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBhcmcxID09PSB1bmRlZmluZWQgPyBzbmFwc2hvdChzZWxmKSA6XG4gICAgICB0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIgPyBhZGRMaXN0ZW5lcihzZWxmLCBhcmcyLCBhcmcxKSA6XG4gICAgICBhcmcxID09PSBudWxsID8gT2JqZWN0LmlzRnJvemVuKFNUQVRFLmdldChzZWxmKSkgOlxuICAgICAgZmV0Y2goc2VsZiwgYXJnMSwgYXJnMilcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogR2V0IHVwZGF0ZSBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyBvYmplY3Qgd2l0aCB1cGRhdGVkIHZhbHVlcywgYHVuZGVmaW5lZGAgaWYgdGhlcmUgbm8gdXBkYXRlIGlzIHBlbmRpbmcuXG4gICAqKi9cbiAgc2V0KCk6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsaXRwbGUgcHJvcGVydGllcyBhdCBvbmNlLiBNZXJnZXMgYXJndW1lbnQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICAgKiBQcm9wZXJ0aWVzIHdoaWNoIGFyZSBub3QgbWFuYWdlZCBieSB0aGlzIG1vZGVsIHdpbGwgYmUgaWdub3JlZC5cbiAgICogXG4gICAqIEBwYXJhbSBhc3NpZ24gLSBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHNpbGVudCAtIElmIGFuIHVwZGF0ZSBkb2VzIG9jY3VyLCBsaXN0ZW5lcnMgd2lsbCBub3QgYmUgcmVmcmVzaGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZCwgYHVuZGVmaW5lZGAgKGltbWVkaWF0ZWx5KSBpZiBhIG5vb3AuXG4gICAqL1xuICBzZXQoYXNzaWduPzogTW9kZWwuQXNzaWduPHRoaXM+LCBzaWxlbnQ/OiBib29sZWFuKTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFB1c2ggYW4gdXBkYXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgYXNzb2NpYXRlZCBwcm9wZXJ0eS5cbiAgICogXG4gICAqIFVzZWZ1bCB3aGVyZSBhIHByb3BlcnR5IHZhbHVlIGludGVybmFsbHkgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lLlxuICAgKiBGb3IgZXhhbXBsZTogQW4gYXJyYXkgaGFzIHB1c2hlZCBhIG5ldyB2YWx1ZSwgb3IgYSBuZXN0ZWQgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogXG4gICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB0byBkaXNwYXRjaCBhcmJpdHJhcnkgZXZlbnRzLlxuICAgKiBTeW1ib2xzIGFyZSByZWNvbW1lbmRlZCBhcyBub24tcHJvcGVydHkgZXZlbnRzLCBob3dldmVyIHlvdSBjYW4gdXNlIGFueSBzdHJpbmcuXG4gICAqIElmIGRvaW5nIHNvLCBiZSBzdXJlIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBwcm9wZXJ0eSBuYW1lcyEgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpc1xuICAgKiB0byBwcmVmaXggYW4gZXZlbnQgd2l0aCBcIiFcIiBhbmQvb3IgdXNlIGRhc2gtY2FzZS4gZS5nLiBgc2V0KFwiIWV2ZW50XCIpYCBvciBgc2V0KFwibXktZXZlbnRcIilgLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IG9yIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICovXG4gIHNldChrZXk6IE1vZGVsLkV2ZW50PHRoaXM+KTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT47XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGZvciBhIHByb3BlcnR5LiBUaGlzIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZSBhbmQgbm90aWZ5IGxpc3RlbmVycy5cbiAgICogXG4gICAqICoqVXNlIHdpdGggY2F1dGlvbiEqKiBLZXkgbm9yIHZhbHVlIGFyZSBjaGVja2VkIGZvciB2YWxpZGl0eS5cbiAgICogXG4gICAqIFRoaXMgaXMgbWVhbnQgZm9yIGFzc2lnbmluZyB2YWx1ZXMgcHJvZ3JhbW1hdGljYWxseSxcbiAgICogd2hlcmUgc2ltcGxlIGFzc2lnbm1lbnQgaXMgbm90IHByYWN0aWNhYmxlLlxuICAgKiBcbiAgICogRm9yIGV4YW1wbGU6IGAodGhpcyBhcyBhbnkpW215UHJvcGVydHldID0gdmFsdWU7YFxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHNldCB2YWx1ZSBmb3IuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldCBmb3IgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBpbml0IC0gSWYgdHJ1ZSwgbW9kZWwgd2lsbCBiZWdpbiB0byBtYW5hZ2UgdGhlIHByb3BlcnR5IGlmIGl0IGlzIG5vdCBhbHJlYWR5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICovXG4gIHNldChrZXk6IE1vZGVsLkV2ZW50PHRoaXM+LCB2YWx1ZTogdW5rbm93biwgaW5pdD86IGJvb2xlYW4pOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogXG4gICAqIEdpdmVuIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgYXNzaWdubWVudCAod2hpY2ggY2hhbmdlcyB2YWx1ZSkgb3IgZXhwbGljaXQgYHNldGAuXG4gICAqIFxuICAgKiBUbyBydW4gbG9naWMgb24gZmluYWwgdmFsdWUgb25seSwgY2FsbGJhY2sgbWF5IHJldHVybiBhIGZ1bmN0aW9uLiBVc2luZyB0aGUgc2FtZVxuICAgKiBmdW5jdGlvbiBmb3Igb25lIG9yIG1vcmUgZXZlbnRzIHdpbGwgZW5zdXJlIGl0IGlzIGNhbGxlZCBvbmx5IHdoZW4gZXZlbnRzIGFyZSBzZXR0bGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHVwZGF0ZSBvY2N1cnMuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIHJlbW92ZSBsaXN0ZW5lci4gV2lsbCByZXR1cm4gYHRydWVgIGlmIHJlbW92ZWQsIGBmYWxzZWAgaWYgaW5hY3RpdmUgYWxyZWFkeS5cbiAgICogXG4gICovXG4gIHNldChjYWxsYmFjazogTW9kZWwuT25FdmVudDx0aGlzPik6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENhbGwgYSBmdW5jdGlvbiB3aGVuIGEgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogVW5saWtlIGBnZXRgLCB0aGlzIGNhbHNsIHN5bmNocm9ub3VzbHkgYW5kIHdpbGwgZmlyZSBhcyBtYW55IHRpbWVzIGFzIHRoZSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSBldmVudCAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+LCBldmVudDogTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsKTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjbGFyZSBhbiBlbmQgdG8gdXBkYXRlcy4gVGhpcyBldmVudCBpcyBmaW5hbCBhbmQgd2lsbCBmcmVlemUgc3RhdGUuXG4gICAqIFRoaXMgZXZlbnQgY2FuIGJlIHdhdGNoZWQgZm9yIGFzIHdlbGwsIHRvIHJ1biBjbGVhbnVwIGxvZ2ljIGFuZCBpbnRlcm5hbGx5IHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMuXG4gICAqIFxuICAgKiBAcGFyYW0gc3RhdHVzIC0gYG51bGxgIHRvIGVuZCB1cGRhdGVzLlxuICAgKi9cbiAgc2V0KHN0YXR1czogbnVsbCk6IHZvaWQ7XG5cbiAgc2V0KFxuICAgIGFyZzE/OiBNb2RlbC5PbkV2ZW50PHRoaXM+IHwgTW9kZWwuQXNzaWduPHRoaXM+IHwgTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsLFxuICAgIGFyZzI/OiB1bmtub3duLFxuICAgIGFyZzM/OiBib29sZWFuKXtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzLmlzO1xuXG4gICAgaWYodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgcmV0dXJuIGFkZExpc3RlbmVyKHNlbGYsIGtleSA9PiB7XG4gICAgICAgIGlmKGFyZzIgPT09IGtleSB8fCBhcmcyID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG4gICAgICBcbiAgICBpZihhcmcxICYmIHR5cGVvZiBhcmcxID09IFwib2JqZWN0XCIpXG4gICAgICBhc3NpZ24oc2VsZiwgYXJnMSwgYXJnMiA9PT0gdHJ1ZSk7XG4gICAgZWxzZSBpZighYXJnMilcbiAgICAgIGV2ZW50KHNlbGYsIGFyZzEpO1xuICAgIGVsc2UgaWYoYXJnMylcbiAgICAgIG1hbmFnZShzZWxmLCBhcmcxIGFzIHN0cmluZyB8IG51bWJlciwgYXJnMik7XG4gICAgZWxzZVxuICAgICAgdXBkYXRlKHNlbGYsIGFyZzEgYXMgc3RyaW5nIHwgbnVtYmVyLCBhcmcyKVxuXG4gICAgY29uc3QgcGVuZGluZyA9IFBFTkRJTkdfS0VZUy5nZXQodGhpcyk7XG5cbiAgICBpZihwZW5kaW5nKVxuICAgICAgcmV0dXJuIDxQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPj4ge1xuICAgICAgICB0aGVuOiAocmVzKSA9PiBuZXcgUHJvbWlzZTxhbnk+KHJlcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlID0gYWRkTGlzdGVuZXIodGhpcywga2V5ID0+IHtcbiAgICAgICAgICAgIGlmKGtleSAhPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgIHJlbW92ZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzLmJpbmQobnVsbCwgQXJyYXkuZnJvbShwZW5kaW5nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLnRoZW4ocmVzKVxuICAgICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBtYW5hZ2VkIHByb3BlcnRpZXMgaW4gdGhpcyBpbnN0YW5jZSBvZiBNb2RlbC5cbiAgICogWWVpbGRzIHRoZSBrZXkgYW5kIGN1cnJlbnQgdmFsdWUgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAqL1xuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxbc3RyaW5nLCB1bmtub3duXT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhTVEFURS5nZXQodGhpcy5pcykhKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCBhY3RpdmF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLlxuICAgKiBcbiAgICogKipJbXBvcnRhbnQqKiAtIFVubGlrZSBgbmV3IHRoaXMoLi4uKWAgLSB0aGlzIG1ldGhvZCBhbHNvIGFjdGl2YXRlcyBzdGF0ZS5cbiAgICogXG4gICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHNlbnQgdG8gY29uc3RydWN0b3JcbiAgICovXG4gIHN0YXRpYyBuZXc8VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5Jbml0PFQ+LCAuLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KXtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIGV2ZW50KGluc3RhbmNlKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIGVxdWl2YWxlbnQgb2YgYHggaW5zdGFuY2VvZiB0aGlzYC5cbiAgICogRGV0ZXJtaW5lcyBpZiBwcm92aWRlZCBjbGFzcyBpcyBhIHN1YnR5cGUgb2YgdGhpcyBvbmUuXG4gICAqIElmIHNvLCBsYW5ndWFnZSBzZXJ2ZXIgd2lsbCBtYWtlIGF2YWlsYWJsZSBhbGwgc3RhdGljXG4gICAqIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhpcyBjbGFzcy5cbiAgICovXG4gIHN0YXRpYyBpczxUIGV4dGVuZHMgTW9kZWwuVHlwZT4odGhpczogVCwgbWF5YmU6IHVua25vd24pOiBtYXliZSBpcyBUIHtcbiAgICByZXR1cm4gbWF5YmUgPT09IHRoaXMgfHwgdHlwZW9mIG1heWJlID09IFwiZnVuY3Rpb25cIiAmJiBtYXliZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcnVuIHdoZW4gYW55IGluc3RhbmNlIG9mIHRoaXMgTW9kZWwgaXMgdXBkYXRlZC4gXG4gICAqL1xuICBzdGF0aWMgb248VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5UeXBlPFQ+LCBsaXN0ZW5lcjogTW9kZWwuT25FdmVudDxUPil7XG4gICAgbGV0IG5vdGlmeSA9IE5PVElGWS5nZXQodGhpcyk7XG5cbiAgICBpZighbm90aWZ5KVxuICAgICAgTk9USUZZLnNldCh0aGlzLCBub3RpZnkgPSBuZXcgU2V0KTtcblxuICAgIG5vdGlmeS5hZGQobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IG5vdGlmeS5kZWxldGUobGlzdGVuZXIpO1xuICB9XG59XG5cbmRlZmluZShNb2RlbC5wcm90b3R5cGUsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiBJRC5nZXQodGhpcy5pcyk7XG4gIH1cbn0pO1xuXG5kZWZpbmUoTW9kZWwsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBhc3NpZ24oc3ViamVjdDogTW9kZWwsIGRhdGE6IE1vZGVsLkFzc2lnbjxNb2RlbD4sIHNpbGVudD86IGJvb2xlYW4pe1xuICBjb25zdCBtZXRob2RzID0gTUVUSE9EUy5nZXQoc3ViamVjdC5jb25zdHJ1Y3RvciBhcyBNb2RlbC5UeXBlKSE7XG4gICAgXG4gIGZvcihjb25zdCBrZXkgaW4gZGF0YSl7XG4gICAgY29uc3QgYmluZCA9IG1ldGhvZHMuZ2V0KGtleSk7XG5cbiAgICBpZihiaW5kKVxuICAgICAgYmluZC5jYWxsKHN1YmplY3QsIGRhdGFba2V5XSk7XG4gICAgZWxzZSBpZihrZXkgaW4gc3ViamVjdCAmJiBrZXkgIT09IFwiaXNcIil7XG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBrZXkpITtcbiAgICAgIGNvbnN0IHNldCA9IGRlc2MgJiYgZGVzYy5zZXQgYXMgKHZhbHVlOiBhbnksIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAgIHNldC5jYWxsKHN1YmplY3QsIGRhdGFba2V5XSwgc2lsZW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFwcGx5IGluc3RydWN0aW9ucyBhbmQgaW5oZXJpdGVkIGV2ZW50IGxpc3RlbmVycy4gRW5zdXJlIGNsYXNzIG1ldGFkYXRhIGlzIHJlYWR5LiAqL1xuZnVuY3Rpb24gcHJlcGFyZShtb2RlbDogTW9kZWwpe1xuICBsZXQgVCA9IG1vZGVsLmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGU7XG5cbiAgaWYoVCA9PT0gTW9kZWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNyZWF0ZSBiYXNlIE1vZGVsLlwiKTtcblxuICBjb25zdCBjaGFpbiA9IFtdIGFzIE1vZGVsLlR5cGVbXTtcbiAgbGV0IGtleXMgPSBuZXcgTWFwPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IHZvaWQ+KCk7XG5cbiAgSUQuc2V0KG1vZGVsLCBgJHtUfS0ke3VpZCgpfWApO1xuXG4gIHdoaWxlKFQubmFtZSl7XG4gICAgZm9yKGNvbnN0IGNiIG9mIE5PVElGWS5nZXQoVCkgfHwgW10pXG4gICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgY2IpO1xuXG4gICAgaWYoVCA9PT0gTW9kZWwpIGJyZWFrO1xuICAgIGVsc2UgY2hhaW4udW5zaGlmdChUKTtcblxuICAgIFQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVClcbiAgfVxuXG4gIGZvcihjb25zdCB0eXBlIG9mIGNoYWluKXtcbiAgICBpZihNRVRIT0RTLmhhcyh0eXBlKSl7XG4gICAgICBrZXlzID0gTUVUSE9EUy5nZXQodHlwZSkhO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgTUVUSE9EUy5zZXQodHlwZSwga2V5cyA9IG5ldyBNYXAoa2V5cykpO1xuXG4gICAgZm9yKGNvbnN0IFtrZXksIHsgdmFsdWUgfV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0eXBlLnByb3RvdHlwZSlcbiAgICApKXtcbiAgICAgIGlmKCF2YWx1ZSB8fCBrZXkgPT0gXCJjb25zdHJ1Y3RvclwiKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIFxuICAgICAgZnVuY3Rpb24gYmluZCh0aGlzOiBNb2RlbCwgb3JpZ2luYWw/OiBGdW5jdGlvbil7XG4gICAgICAgIGNvbnN0IHsgaXMgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhb3JpZ2luYWwpXG4gICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIEZ1bmN0aW9uO1xuXG4gICAgICAgIGNvbnN0IGZuID0gb3JpZ2luYWwgfHwgdmFsdWU7XG4gICAgICAgIGNvbnN0IGJvdW5kID0gZm4uYmluZChpcyk7XG4gICAgICAgIFxuICAgICAgICBNRVRIT0Quc2V0KGJvdW5kLCBmbik7XG4gICAgICAgIGRlZmluZShpcywga2V5LCB7IHZhbHVlOiBib3VuZCwgd3JpdGFibGU6IHRydWUgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgICB9XG5cbiAgICAgIGtleXMuc2V0KGtleSwgYmluZCk7XG4gICAgICBkZWZpbmUodHlwZS5wcm90b3R5cGUsIGtleSwgeyBnZXQ6IGJpbmQsIHNldDogYmluZCB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSBtb2RlbCBhcmd1ZW1udHMsIHJ1biBjYWxsYmFja3MgYW5kIG9ic2VydmUgcHJvcGVydGllcy5cbiAqIEFjY3VtdWxhdGUgYW5kIGhhbmRsZSBjbGVhbnVwIGV2ZW50cy5cbiAqKi9cbmZ1bmN0aW9uIGluaXQobW9kZWw6IE1vZGVsLCBhcmdzOiBNb2RlbC5BcmdzKXtcbiAgY29uc3Qgc3RhdGUgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPjtcblxuICBTVEFURS5zZXQobW9kZWwsIHN0YXRlKTtcblxuICBhcmdzID0gYXJncy5mbGF0KCkuZmlsdGVyKGFyZyA9PiB7XG4gICAgaWYodHlwZW9mIGFyZyAhPSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBJRC5zZXQobW9kZWwsIGFyZyk7XG4gIH0pO1xuXG4gIGFkZExpc3RlbmVyKG1vZGVsLCAoKSA9PiB7XG4gICAgaWYoIVBBUkVOVC5oYXMobW9kZWwpKVxuICAgICAgUEFSRU5ULnNldChtb2RlbCwgbnVsbCk7XG5cbiAgICBmb3IoY29uc3Qga2V5IGluIG1vZGVsKXtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1vZGVsLCBrZXkpITtcblxuICAgICAgaWYoXCJ2YWx1ZVwiIGluIGRlc2MpXG4gICAgICAgIG1hbmFnZShtb2RlbCwga2V5LCBkZXNjLnZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBmb3IoY29uc3QgYXJnIG9mIGFyZ3Mpe1xuICAgICAgY29uc3QgdXNlID0gdHlwZW9mIGFyZyA9PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBhcmcuY2FsbChtb2RlbCwgbW9kZWwpXG4gICAgICAgIDogYXJnIGFzIE1vZGVsLkFzc2lnbjxNb2RlbD47XG5cbiAgICAgIGlmKHVzZSBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgIHVzZS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFzeW5jIGVycm9yIGluIGNvbnN0cnVjdG9yIGZvciAke21vZGVsfTpgKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgYWRkTGlzdGVuZXIobW9kZWwsIHVzZSwgbnVsbClcbiAgICAgIGVsc2UgaWYodHlwZW9mIHVzZSA9PSBcIm9iamVjdFwiKVxuICAgICAgICBhc3NpZ24obW9kZWwsIHVzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgYWRkTGlzdGVuZXIobW9kZWwsICgpID0+IHtcbiAgICAgIGZvcihjb25zdCBbXywgdmFsdWVdIG9mIG1vZGVsKVxuICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsICYmIFBBUkVOVC5nZXQodmFsdWUpID09PSBtb2RlbClcbiAgICAgICAgICB2YWx1ZS5zZXQobnVsbCk7XG4gIFxuICAgICAgT2JqZWN0LmZyZWV6ZShzdGF0ZSk7XG4gICAgfSwgbnVsbCk7XG4gIFxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFuYWdlKHRhcmdldDogTW9kZWwsIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55LCBzaWxlbnQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQodGFyZ2V0KSE7XG4gIFxuICBmdW5jdGlvbiBnZXQodGhpczogTW9kZWwpe1xuICAgIHJldHVybiB3YXRjaCh0aGlzLCBrZXksIHN0YXRlW2tleV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0KHZhbHVlOiB1bmtub3duLCBzaWxlbnQ/OiBib29sZWFuKXtcbiAgICB1cGRhdGUodGFyZ2V0LCBrZXksIHZhbHVlLCBzaWxlbnQpO1xuICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgIVBBUkVOVC5oYXModmFsdWUpKXtcbiAgICAgIFBBUkVOVC5zZXQodmFsdWUsIHRhcmdldCk7XG4gICAgICBldmVudCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVmaW5lKHRhcmdldCwga2V5LCB7IHNldCwgZ2V0IH0pO1xuICBzZXQodmFsdWUsIHNpbGVudCk7XG59XG5cbnR5cGUgUHJveHk8VCA9IGFueT4gPSAoa2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBUKSA9PiBUO1xuXG5jb25zdCBPQlNFUlZFUiA9IG5ldyBXZWFrTWFwPE1vZGVsLCBQcm94eT4oKTtcblxuZnVuY3Rpb24gd2F0Y2goZnJvbTogTW9kZWwsIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZT86IGFueSl7XG4gIGNvbnN0IGFjY2VzcyA9IE9CU0VSVkVSLmdldChmcm9tKTtcbiAgcmV0dXJuIGFjY2VzcyA/IGFjY2VzcyhrZXksIHZhbHVlKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBmZXRjaChzdWJqZWN0OiBNb2RlbCwgcHJvcGVydHk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuICBcbiAgaWYocHJvcGVydHkgaW4gc3RhdGUgfHwgcmVxdWlyZWQgPT09IGZhbHNlKXtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3ViamVjdH0uJHtwcm9wZXJ0eX0gaXMgbm90IHlldCBhdmFpbGFibGUuYCk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBrZXkgPT4ge1xuICAgICAgaWYoa2V5ID09PSBwcm9wZXJ0eSl7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihrZXkgPT09IG51bGwpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gIH0pO1xufVxuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgbW9kZWxzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gc25hcHNob3Q8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCk6IE1vZGVsLlN0YXRlPFQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge30gYXMgYW55O1xuICBsZXQgaXNOb3RSZWN1cnNpdmU7XG5cbiAgaWYoIUVYUE9SVCl7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1ttb2RlbCwgdmFsdWVzXV0pO1xuICB9XG5cbiAgZm9yKGxldCBba2V5LCB2YWx1ZV0gb2YgbW9kZWwpe1xuICAgIGlmKEVYUE9SVC5oYXModmFsdWUpKVxuICAgICAgdmFsdWUgPSBFWFBPUlQuZ2V0KHZhbHVlKTtcbiAgICBlbHNlIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIFwiZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgRVhQT1JULnNldCh2YWx1ZSwgdmFsdWUgPSB2YWx1ZS5nZXQoKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYoaXNOb3RSZWN1cnNpdmUpXG4gICAgRVhQT1JUID0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZTxUPihcbiAgc3ViamVjdDogTW9kZWwsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICB2YWx1ZTogVCxcbiAgYXJnPzogYm9vbGVhbiB8IE1vZGVsLlNldHRlcjxUPil7XG5cbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKE9iamVjdC5pc0Zyb3plbihzdGF0ZSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1cGRhdGUgJHtTdHJpbmcoa2V5KX0gYnV0ICR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiKXtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdmFsdWUgPSBvdXQoKTtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSBwcmV2aW91cyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBzdGF0ZVtrZXldID0gdmFsdWU7XG5cbiAgaWYoYXJnICE9PSB0cnVlKVxuICAgIGV2ZW50KHN1YmplY3QsIGtleSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBSYW5kb20gYWxwaGFudW1iZXJpYyBvZiBsZW5ndGggNjsgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbGV0dGVyLiAqL1xuZnVuY3Rpb24gdWlkKCl7XG4gIHJldHVybiAoMC4yNzggKyBNYXRoLnJhbmRvbSgpICogMC43MjIpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCkudG9VcHBlckNhc2UoKTtcbn1cblxuZXhwb3J0IHtcbiAgZXZlbnQsXG4gIGZldGNoLFxuICBNRVRIT0QsXG4gIE1vZGVsLFxuICBQQVJFTlQsXG4gIFNUQVRFLFxuICB1aWQsXG4gIHVwZGF0ZSxcbiAgd2F0Y2hcbn0iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLGFBQWEsY0FBYyxPQUFPLFlBQXNCLG9CQUFvQjtBQUVyRixNQUFNLFNBQVMsT0FBTztBQUd0QixNQUFNLEtBQUssb0JBQUksUUFBdUI7QUFHdEMsTUFBTSxRQUFRLG9CQUFJLFFBQTBEO0FBRzVFLE1BQU0sU0FBUyxvQkFBSSxRQUFtQztBQUd0RCxNQUFNLFNBQVMsb0JBQUksUUFBNkI7QUFHaEQsTUFBTSxVQUFVLG9CQUFJLFFBQXVEO0FBRzNFLE1BQU0sU0FBUyxvQkFBSSxRQUFrQjtBQW1IckMsTUFBZSxNQUE0QjtBQUFBLEVBQ3pDLGVBQWUsTUFBaUI7QUFDOUIsWUFBUSxJQUFJO0FBQ1osV0FBTyxNQUFNLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNsQyxTQUFLLE1BQU0sSUFBSTtBQUFBLEVBQ2pCO0FBQUEsRUFFQSxDQUFDLFVBQVUsRUFBRSxVQUFvQixVQUFtQjtBQUNsRCxVQUFNQSxTQUFRLG9CQUFJLElBQXVCO0FBQ3pDLFVBQU0sUUFBUSxPQUFPLE9BQU8sSUFBSTtBQUVoQyxnQkFBWSxNQUFNLFVBQVVBLE1BQUs7QUFDakMsYUFBUyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVU7QUFDbEMsVUFBRyxVQUFVLFVBQWE7QUFDeEIsY0FBTSxJQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksR0FBRywrQkFBK0I7QUFFL0QsTUFBQUEsT0FBTSxJQUFJLEdBQUc7QUFFYixVQUFHLGlCQUFpQixVQUFVLGNBQWM7QUFDMUMsZUFBTyxNQUFNLFVBQVUsRUFBRSxVQUFVLFFBQVE7QUFFN0MsYUFBTztBQUFBLElBQ1QsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFxREEsSUFBSSxNQUEyQyxNQUEyQztBQUN4RixVQUFNLE9BQU8sS0FBSztBQUVsQixRQUFHLE9BQU8sUUFBUSxZQUFXO0FBQzNCLFVBQUksVUFBVSxvQkFBSSxJQUF1QjtBQUV6QyxhQUFPLGFBQWEsTUFBTSxDQUFDLFVBQVU7QUFDbkMsY0FBTSxLQUFLLEtBQUssS0FBSyxPQUFPLE9BQU8sT0FBTztBQUUxQyxlQUFPLE9BQU8sT0FBTyxPQUFRLENBQUNDLFlBQVc7QUFDdkMsb0JBQVUsYUFBYSxJQUFJLElBQUk7QUFDL0IsY0FBRyxPQUFPLE1BQU07QUFDZCxlQUFHQSxPQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUNFLFNBQVMsU0FBWSxTQUFTLElBQUksSUFDbEMsT0FBTyxRQUFRLGFBQWEsWUFBWSxNQUFNLE1BQU0sSUFBSSxJQUN4RCxTQUFTLE9BQU8sT0FBTyxTQUFTLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFDL0MsTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUFBLEVBRTFCO0FBQUEsRUFtRkEsSUFDRSxNQUNBLE1BQ0EsTUFBZTtBQUVmLFVBQU0sT0FBTyxLQUFLO0FBRWxCLFFBQUcsT0FBTyxRQUFRO0FBQ2hCLGFBQU8sWUFBWSxNQUFNLFNBQU87QUFDOUIsWUFBRyxTQUFTLE9BQU8sU0FBUyxVQUFhLE9BQU8sT0FBTztBQUNyRCxpQkFBTyxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxNQUNwQyxDQUFDO0FBRUgsUUFBRyxRQUFRLE9BQU8sUUFBUTtBQUN4QixhQUFPLE1BQU0sTUFBTSxTQUFTLElBQUk7QUFBQSxhQUMxQixDQUFDO0FBQ1AsWUFBTSxNQUFNLElBQUk7QUFBQSxhQUNWO0FBQ04sYUFBTyxNQUFNLE1BQXlCLElBQUk7QUFBQTtBQUUxQyxhQUFPLE1BQU0sTUFBeUIsSUFBSTtBQUU1QyxVQUFNLFVBQVUsYUFBYSxJQUFJLElBQUk7QUFFckMsUUFBRztBQUNELGFBQTBDO0FBQUEsUUFDeEMsTUFBTSxDQUFDLFFBQVEsSUFBSSxRQUFhLENBQUFDLFNBQU87QUFDckMsZ0JBQU0sU0FBUyxZQUFZLE1BQU0sU0FBTztBQUN0QyxnQkFBRyxRQUFRLE1BQUs7QUFDZCxxQkFBTztBQUNQLHFCQUFPQSxLQUFJLEtBQUssTUFBTSxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQUEsWUFDM0M7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNILENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUNiO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxDQUFDLE9BQU8sUUFBUSxJQUFpQztBQUMvQyxXQUFPLE9BQU8sUUFBUSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUUsRUFBRSxPQUFPLFFBQVEsRUFBRTtBQUFBLEVBQzlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE9BQU8sT0FBNkMsTUFBb0I7QUFDdEUsVUFBTSxXQUFXLElBQUksS0FBSyxHQUFHLElBQUk7QUFDakMsVUFBTSxRQUFRO0FBQ2QsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQU8sR0FBa0MsT0FBNEI7QUFDbkUsV0FBTyxVQUFVLFFBQVEsT0FBTyxTQUFTLGNBQWMsTUFBTSxxQkFBcUI7QUFBQSxFQUNwRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxHQUF5QyxVQUEyQjtBQUN6RSxRQUFJLFNBQVMsT0FBTyxJQUFJLElBQUk7QUFFNUIsUUFBRyxDQUFDO0FBQ0YsYUFBTyxJQUFJLE1BQU0sU0FBUyxvQkFBSSxLQUFHO0FBRW5DLFdBQU8sSUFBSSxRQUFRO0FBRW5CLFdBQU8sTUFBTSxPQUFPLE9BQU8sUUFBUTtBQUFBLEVBQ3JDO0FBQ0Y7QUFFQSxPQUFPLE1BQU0sV0FBVyxZQUFZO0FBQUEsRUFDbEMsUUFBTztBQUNMLFdBQU8sR0FBRyxJQUFJLEtBQUssRUFBRTtBQUFBLEVBQ3ZCO0FBQ0YsQ0FBQztBQUVELE9BQU8sT0FBTyxZQUFZO0FBQUEsRUFDeEIsUUFBTztBQUNMLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDRixDQUFDO0FBRUQsU0FBUyxPQUFPLFNBQWdCLE1BQTJCLFFBQWlCO0FBQzFFLFFBQU0sVUFBVSxRQUFRLElBQUksUUFBUSxXQUF5QjtBQUU3RCxhQUFVLE9BQU8sTUFBSztBQUNwQixVQUFNLE9BQU8sUUFBUSxJQUFJLEdBQUc7QUFFNUIsUUFBRztBQUNELFdBQUssS0FBSyxTQUFTLEtBQUssR0FBRyxDQUFDO0FBQUEsYUFDdEIsT0FBTyxXQUFXLFFBQVEsTUFBSztBQUNyQyxZQUFNLE9BQU8sT0FBTyx5QkFBeUIsU0FBUyxHQUFHO0FBQ3pELFlBQU0sTUFBTSxRQUFRLEtBQUs7QUFFekIsVUFBSSxLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUcsTUFBTTtBQUFBLElBQ3JDO0FBQUEsRUFDRjtBQUNGO0FBR0EsU0FBUyxRQUFRLE9BQWE7QUFDNUIsTUFBSSxJQUFJLE1BQU07QUFFZCxNQUFHLE1BQU07QUFDUCxVQUFNLElBQUksTUFBTSwyQkFBMkI7QUFFN0MsUUFBTSxRQUFRLENBQUM7QUFDZixNQUFJLE9BQU8sb0JBQUksSUFBa0M7QUFFakQsS0FBRyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7QUFFN0IsU0FBTSxFQUFFLE1BQUs7QUFDWCxlQUFVLE1BQU0sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ2hDLGtCQUFZLE9BQU8sRUFBRTtBQUV2QixRQUFHLE1BQU0sTUFBTztBQUFBLFFBQ1gsT0FBTSxRQUFRLENBQUM7QUFFcEIsUUFBSSxPQUFPLGVBQWUsQ0FBQztBQUFBLEVBQzdCO0FBRUEsYUFBVSxRQUFRLE9BQU07QUFDdEIsUUFBRyxRQUFRLElBQUksSUFBSSxHQUFFO0FBQ25CLGFBQU8sUUFBUSxJQUFJLElBQUk7QUFDdkI7QUFBQSxJQUNGO0FBRUEsWUFBUSxJQUFJLE1BQU0sT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDO0FBRXRDLGVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssT0FBTztBQUFBLE1BQ25DLE9BQU8sMEJBQTBCLEtBQUssU0FBUztBQUFBLElBQ2pELEdBQUU7QUFJQSxVQUFTQyxRQUFULFNBQTJCLFVBQW9CO0FBQzdDLGNBQU0sRUFBRSxHQUFHLElBQUk7QUFFZixZQUFHLEdBQUcsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUM1QixpQkFBTztBQUVULGNBQU0sS0FBSyxZQUFZO0FBQ3ZCLGNBQU0sUUFBUSxHQUFHLEtBQUssRUFBRTtBQUV4QixlQUFPLElBQUksT0FBTyxFQUFFO0FBQ3BCLGVBQU8sSUFBSSxLQUFLLEVBQUUsT0FBTyxPQUFPLFVBQVUsS0FBSyxDQUFDO0FBRWhELGVBQU87QUFBQSxNQUNUO0FBYlMsaUJBQUFBO0FBSFQsVUFBRyxDQUFDLFNBQVMsT0FBTztBQUNsQjtBQWlCRixXQUFLLElBQUksS0FBS0EsS0FBSTtBQUNsQixhQUFPLEtBQUssV0FBVyxLQUFLLEVBQUUsS0FBS0EsT0FBTSxLQUFLQSxNQUFLLENBQUM7QUFBQSxJQUN0RDtBQUFBLEVBQ0Y7QUFDRjtBQU1BLFNBQVMsS0FBSyxPQUFjLE1BQWlCO0FBQzNDLFFBQU0sUUFBUSxDQUFDO0FBRWYsUUFBTSxJQUFJLE9BQU8sS0FBSztBQUV0QixTQUFPLEtBQUssS0FBSyxFQUFFLE9BQU8sU0FBTztBQUMvQixRQUFHLE9BQU8sT0FBTztBQUNmLGFBQU87QUFFVCxPQUFHLElBQUksT0FBTyxHQUFHO0FBQUEsRUFDbkIsQ0FBQztBQUVELGNBQVksT0FBTyxNQUFNO0FBQ3ZCLFFBQUcsQ0FBQyxPQUFPLElBQUksS0FBSztBQUNsQixhQUFPLElBQUksT0FBTyxJQUFJO0FBRXhCLGVBQVUsT0FBTyxPQUFNO0FBQ3JCLFlBQU0sT0FBTyxPQUFPLHlCQUF5QixPQUFPLEdBQUc7QUFFdkQsVUFBRyxXQUFXO0FBQ1osZUFBTyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQUk7QUFBQSxJQUN2QztBQUVBLGVBQVUsT0FBTyxNQUFLO0FBQ3BCLFlBQU0sTUFBTSxPQUFPLE9BQU8sYUFDdEIsSUFBSSxLQUFLLE9BQU8sS0FBSyxJQUNyQjtBQUVKLFVBQUcsZUFBZTtBQUNoQixZQUFJLE1BQU0sU0FBTztBQUNmLGtCQUFRLE1BQU0sa0NBQWtDLEtBQUssR0FBRztBQUN4RCxrQkFBUSxNQUFNLEdBQUc7QUFBQSxRQUNuQixDQUFDO0FBQUEsZUFDSyxPQUFPLE9BQU87QUFDcEIsb0JBQVksT0FBTyxLQUFLLElBQUk7QUFBQSxlQUN0QixPQUFPLE9BQU87QUFDcEIsZUFBTyxPQUFPLEtBQUssSUFBSTtBQUFBLElBQzNCO0FBRUEsZ0JBQVksT0FBTyxNQUFNO0FBQ3ZCLGlCQUFVLENBQUMsR0FBRyxLQUFLLEtBQUs7QUFDdEIsWUFBRyxpQkFBaUIsU0FBUyxPQUFPLElBQUksS0FBSyxNQUFNO0FBQ2pELGdCQUFNLElBQUksSUFBSTtBQUVsQixhQUFPLE9BQU8sS0FBSztBQUFBLElBQ3JCLEdBQUcsSUFBSTtBQUVQLFdBQU87QUFBQSxFQUNULENBQUM7QUFDSDtBQUVBLFNBQVMsT0FBTyxRQUFlLEtBQXNCLE9BQVksUUFBaUI7QUFDaEYsUUFBTSxRQUFRLE1BQU0sSUFBSSxNQUFNO0FBRTlCLFdBQVMsTUFBZ0I7QUFDdkIsV0FBTyxNQUFNLE1BQU0sS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQ3BDO0FBRUEsV0FBUyxJQUFJQyxRQUFnQkMsU0FBaUI7QUFDNUMsV0FBTyxRQUFRLEtBQUtELFFBQU9DLE9BQU07QUFDakMsUUFBR0Qsa0JBQWlCLFNBQVMsQ0FBQyxPQUFPLElBQUlBLE1BQUssR0FBRTtBQUM5QyxhQUFPLElBQUlBLFFBQU8sTUFBTTtBQUN4QixZQUFNQSxNQUFLO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLFFBQVEsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQ2hDLE1BQUksT0FBTyxNQUFNO0FBQ25CO0FBSUEsTUFBTSxXQUFXLG9CQUFJLFFBQXNCO0FBRTNDLFNBQVMsTUFBTSxNQUFhLEtBQXNCLE9BQVk7QUFDNUQsUUFBTSxTQUFTLFNBQVMsSUFBSSxJQUFJO0FBQ2hDLFNBQU8sU0FBUyxPQUFPLEtBQUssS0FBSyxJQUFJO0FBQ3ZDO0FBRUEsU0FBUyxNQUFNLFNBQWdCLFVBQWtCLFVBQW1CO0FBQ2xFLFFBQU0sUUFBUSxNQUFNLElBQUksT0FBTztBQUUvQixNQUFHLFlBQVksU0FBUyxhQUFhLE9BQU07QUFDekMsVUFBTSxRQUFRLE1BQU0sUUFBUTtBQUU1QixRQUFHLFVBQVUsVUFBYSxDQUFDO0FBQ3pCLGFBQU87QUFBQSxFQUNYO0FBRUEsUUFBTSxRQUFRLElBQUksTUFBTSxHQUFHLE9BQU8sSUFBSSxRQUFRLHdCQUF3QjtBQUN0RSxRQUFNLFVBQVUsSUFBSSxRQUFhLENBQUMsU0FBUyxXQUFXO0FBQ3BELGdCQUFZLFNBQVMsU0FBTztBQUMxQixVQUFHLFFBQVEsVUFBUztBQUNsQixnQkFBUSxNQUFNLEdBQUcsQ0FBQztBQUNsQixlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUcsUUFBUTtBQUNULGVBQU8sSUFBSSxNQUFNLEdBQUcsT0FBTyxnQkFBZ0IsQ0FBQztBQUFBLElBQ2hELENBQUM7QUFBQSxFQUNILENBQUM7QUFFRCxRQUFNLE9BQU8sT0FBTyxTQUFTO0FBQUEsSUFDM0IsVUFBVSxNQUFNLE9BQU8sS0FBSztBQUFBLElBQzVCLE1BQU07QUFBQSxJQUNOLFNBQVMsTUFBTTtBQUFBLElBQ2YsT0FBTyxNQUFNO0FBQUEsRUFDZixDQUFDO0FBQ0g7QUFHQSxJQUFJO0FBRUosU0FBUyxTQUEwQixPQUEwQjtBQUMzRCxRQUFNLFNBQVMsQ0FBQztBQUNoQixNQUFJO0FBRUosTUFBRyxDQUFDLFFBQU87QUFDVCxxQkFBaUI7QUFDakIsYUFBUyxvQkFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDcEM7QUFFQSxXQUFRLENBQUMsS0FBSyxLQUFLLEtBQUssT0FBTTtBQUM1QixRQUFHLE9BQU8sSUFBSSxLQUFLO0FBQ2pCLGNBQVEsT0FBTyxJQUFJLEtBQUs7QUFBQSxhQUNsQixTQUFTLE9BQU8sU0FBUyxZQUFZLFNBQVMsU0FBUyxPQUFPLE1BQU0sUUFBUTtBQUNsRixhQUFPLElBQUksT0FBTyxRQUFRLE1BQU0sSUFBSSxDQUFDO0FBRXZDLFdBQU8sR0FBRyxJQUFJO0FBQUEsRUFDaEI7QUFFQSxNQUFHO0FBQ0QsYUFBUztBQUVYLFNBQU8sT0FBTyxPQUFPLE1BQU07QUFDN0I7QUFFQSxTQUFTLE9BQ1AsU0FDQSxLQUNBLE9BQ0EsS0FBZ0M7QUFFaEMsUUFBTSxRQUFRLE1BQU0sSUFBSSxPQUFPO0FBRS9CLE1BQUcsT0FBTyxTQUFTLEtBQUs7QUFDdEIsVUFBTSxJQUFJLE1BQU0sbUJBQW1CLE9BQU8sR0FBRyxDQUFDLFFBQVEsT0FBTyxnQkFBZ0I7QUFFL0UsUUFBTSxXQUFXLE1BQU0sR0FBRztBQUUxQixNQUFHLE9BQU8sT0FBTyxZQUFXO0FBQzFCLFVBQU0sTUFBTSxJQUFJLEtBQUssU0FBUyxPQUFPLFFBQVE7QUFFN0MsUUFBRyxRQUFRO0FBQ1QsYUFBTztBQUVULFFBQUcsT0FBTyxPQUFPO0FBQ2YsY0FBUSxJQUFJO0FBQUEsRUFDaEI7QUFFQSxNQUFHLFVBQVUsWUFBWSxVQUFVO0FBQ2pDO0FBRUYsUUFBTSxHQUFHLElBQUk7QUFFYixNQUFHLFFBQVE7QUFDVCxVQUFNLFNBQVMsR0FBRztBQUVwQixTQUFPO0FBQ1Q7QUFHQSxTQUFTLE1BQUs7QUFDWixVQUFRLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxTQUFTLEVBQUUsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFlBQVk7QUFDbEY7IiwKICAibmFtZXMiOiBbIndhdGNoIiwgInVwZGF0ZSIsICJyZXMiLCAiYmluZCIsICJ2YWx1ZSIsICJzaWxlbnQiXQp9Cg==
package/dist/index.d.ts CHANGED
@@ -8,12 +8,15 @@
8
8
  * - `null` - terminal event; instance is expired.
9
9
  * @param source - Instance of Model for which update has occured.
10
10
  */
11
- type OnUpdate<T extends Model = any> = (this: T, key: unknown, source: T) => (() => void) | null | void;
12
- type OnAccess<T extends Model = any, R = unknown> = (from: T, key: string | number, value: R) => unknown;
13
- type Effect<T extends Model> = (this: T, proxy: T) => ((update: boolean | null) => void) | Promise<void> | null | void;
11
+ type OnUpdate<T extends Observable = any> = (this: T, key: unknown, source: T) => (() => void) | null | void;
12
+ type Effect<T extends Observable> = (this: T, proxy: T) => ((update: boolean | null) => void) | Promise<void> | null | void;
14
13
  type Event = number | string | null | boolean | symbol;
15
- declare function addListener<T extends Model>(subject: T, callback: OnUpdate<T>, select?: Event): () => boolean;
16
- declare function createProxy<T extends Model>(from: T, observer: OnAccess<T>): T;
14
+ interface Observable {
15
+ [Observable](callback: OnUpdate, required?: boolean): this;
16
+ }
17
+ declare const Observable: unique symbol;
18
+ declare function addListener<T extends Observable>(subject: T, callback: OnUpdate<T>, select?: Event | Set<Event>): () => boolean;
19
+ declare function event(subject: Observable, key?: string | number | symbol | null, silent?: boolean): void;
17
20
  /**
18
21
  * Create a side-effect which will update whenever values accessed change.
19
22
  * Callback is called immediately and whenever values are stale.
@@ -22,8 +25,8 @@ declare function createProxy<T extends Model>(from: T, observer: OnAccess<T>): T
22
25
  * @param callback - Function to invoke when values change.
23
26
  * @param requireValues - If `true` will throw if accessing a value which is `undefined`.
24
27
  */
25
- declare function createEffect<T extends Model>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;
26
- declare function createEffect<T extends Model>(target: T, callback: Effect<T>, recursive?: boolean): () => void;
28
+ declare function createEffect<T extends Observable>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;
29
+ declare function createEffect<T extends Observable>(target: T, callback: Effect<T>, recursive?: boolean): () => void;
27
30
 
28
31
  /** Reference bound instance methods to real ones. */
29
32
  declare const METHOD: WeakMap<any, any>;
@@ -112,8 +115,9 @@ interface Model {
112
115
  **/
113
116
  is: this;
114
117
  }
115
- declare abstract class Model {
118
+ declare abstract class Model implements Observable {
116
119
  constructor(...args: Model.Args);
120
+ [Observable](callback: OnUpdate, required?: boolean): this;
117
121
  /**
118
122
  * Pull current values from state. Flattens all models and exotic values recursively.
119
123
  *
@@ -189,6 +193,22 @@ declare abstract class Model {
189
193
  * @returns Promise resolves an array of keys updated.
190
194
  */
191
195
  set(key: Model.Event<this>): PromiseLike<Model.Event<this>[]>;
196
+ /**
197
+ * Set a value for a property. This will update the value and notify listeners.
198
+ *
199
+ * **Use with caution!** Key nor value are checked for validity.
200
+ *
201
+ * This is meant for assigning values programmatically,
202
+ * where simple assignment is not practicable.
203
+ *
204
+ * For example: `(this as any)[myProperty] = value;`
205
+ *
206
+ * @param key - Property to set value for.
207
+ * @param value - Value to set for property.
208
+ * @param init - If true, model will begin to manage the property if it is not already.
209
+ * @returns Promise resolves an array of keys updated.
210
+ */
211
+ set(key: Model.Event<this>, value: unknown, init?: boolean): PromiseLike<Model.Event<this>[]>;
192
212
  /**
193
213
  * Call a function when update occurs.
194
214
  *
@@ -206,10 +226,10 @@ declare abstract class Model {
206
226
  * Call a function when a property is updated.
207
227
  * Unlike `get`, this calsl synchronously and will fire as many times as the property is updated.
208
228
  *
209
- * @param key - Property to watch for updates.
210
229
  * @param callback - Function to call when property is updated.
230
+ * @param event - Property to watch for updates.
211
231
  */
212
- set(key: Model.Event<this> | null, callback: Model.OnEvent<this>): () => boolean;
232
+ set(callback: Model.OnEvent<this>, event: Model.Event<this> | null): () => boolean;
213
233
  /**
214
234
  * Declare an end to updates. This event is final and will freeze state.
215
235
  * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.
@@ -442,4 +462,4 @@ declare class Context {
442
462
  protected add<T extends Model>(input: T | Model.Init<T>, implicit?: boolean): T;
443
463
  }
444
464
 
445
- export { Context, METHOD, Model, addListener, createEffect, createProxy, Model as default, get, has, ref, set, use };
465
+ export { Context, METHOD, Model, Observable, addListener, createEffect, Model as default, event, get, has, ref, set, use };