@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.
@@ -1,137 +1,141 @@
1
- import { Model, PARENT, define, uid } from './model';
2
- const LOOKUP = new WeakMap();
3
- const KEYS = new Map();
1
+ import { Model, PARENT, define, uid } from "./model";
2
+ const LOOKUP = /* @__PURE__ */ new WeakMap();
3
+ const KEYS = /* @__PURE__ */ new Map();
4
4
  function key(T, upstream) {
5
- let K = KEYS.get(T);
6
- if (!K)
7
- KEYS.set(T, K = Symbol(typeof T == "symbol" ? "get " + T.description : String(T)));
8
- return upstream ? key(K) : K;
5
+ let K = KEYS.get(T);
6
+ if (!K)
7
+ KEYS.set(T, K = Symbol(
8
+ typeof T == "symbol" ? "get " + T.description : String(T)
9
+ ));
10
+ return upstream ? key(K) : K;
9
11
  }
10
12
  function keys(from, upstream) {
11
- const keys = new Set();
12
- do {
13
- keys.add(key(from, upstream));
14
- } while ((from = Object.getPrototypeOf(from)) !== Model);
15
- return keys;
13
+ const keys2 = /* @__PURE__ */ new Set();
14
+ do {
15
+ keys2.add(key(from, upstream));
16
+ } while ((from = Object.getPrototypeOf(from)) !== Model);
17
+ return keys2;
16
18
  }
17
19
  class Context {
18
- static get(from, callback) {
19
- const waiting = LOOKUP.get(from);
20
- if (waiting instanceof Context) {
21
- if (callback)
22
- callback(waiting);
23
- return waiting;
24
- }
25
- if (callback)
26
- if (waiting)
27
- waiting.push(callback);
28
- else
29
- LOOKUP.set(from, [callback]);
30
- }
31
- constructor(inputs) {
32
- this.layer = new Map();
33
- this.cleanup = new Set();
34
- if (inputs)
35
- this.include(inputs);
36
- }
37
- /** Run callback when a specified type is registered to a **child** context. */
38
- has(Type, callback) {
39
- define(this, key(Type, true), { value: callback });
20
+ constructor(inputs) {
21
+ this.layer = /* @__PURE__ */ new Map();
22
+ this.cleanup = /* @__PURE__ */ new Set();
23
+ if (inputs)
24
+ this.include(inputs);
25
+ }
26
+ static get(from, callback) {
27
+ const waiting = LOOKUP.get(from);
28
+ if (waiting instanceof Context) {
29
+ if (callback)
30
+ callback(waiting);
31
+ return waiting;
40
32
  }
41
- /** Find specified type registered to a parent context. Returns undefined if none are found. */
42
- get(Type) {
43
- const result = this[key(Type)];
44
- if (result === null)
45
- throw new Error(`Did find ${Type} in context, but multiple were defined.`);
46
- return result;
33
+ if (callback)
34
+ if (waiting)
35
+ waiting.push(callback);
36
+ else
37
+ LOOKUP.set(from, [callback]);
38
+ }
39
+ /** Run callback when a specified type is registered to a **child** context. */
40
+ has(Type, callback) {
41
+ define(this, key(Type, true), { value: callback });
42
+ }
43
+ /** Find specified type registered to a parent context. Returns undefined if none are found. */
44
+ get(Type) {
45
+ const result = this[key(Type)];
46
+ if (result === null)
47
+ throw new Error(`Did find ${Type} in context, but multiple were defined.`);
48
+ return result;
49
+ }
50
+ push(inputs) {
51
+ const next = Object.create(this);
52
+ next.layer = /* @__PURE__ */ new Map();
53
+ next.cleanup = /* @__PURE__ */ new Set();
54
+ if (inputs)
55
+ next.include(inputs);
56
+ return next;
57
+ }
58
+ pop() {
59
+ for (const key2 of Object.getOwnPropertySymbols(this))
60
+ delete this[key2];
61
+ this.cleanup.forEach((cb) => cb());
62
+ this.layer.clear();
63
+ }
64
+ include(inputs, forEach) {
65
+ const init = /* @__PURE__ */ new Map();
66
+ if (typeof inputs == "function" || inputs instanceof Model)
67
+ inputs = { 0: inputs };
68
+ Object.entries(inputs).forEach(([K, V]) => {
69
+ if (Model.is(V) || V instanceof Model)
70
+ return;
71
+ if (K && K != V)
72
+ V = `${V} (as '${K}')`;
73
+ throw new Error(
74
+ `Context may only include instance or class \`extends Model\` but got ${V}.`
75
+ );
76
+ });
77
+ for (const key2 in inputs) {
78
+ const input = inputs[key2];
79
+ const exists = this.layer.get(key2);
80
+ if (!exists) {
81
+ const instance = this.add(input);
82
+ this.layer.set(key2, input);
83
+ init.set(instance, true);
84
+ } else if (exists !== input) {
85
+ this.pop();
86
+ this.id = uid();
87
+ this.include(inputs);
88
+ }
47
89
  }
48
- push(inputs) {
49
- const next = Object.create(this);
50
- next.layer = new Map();
51
- next.cleanup = new Set();
52
- if (inputs)
53
- next.include(inputs);
54
- return next;
55
- }
56
- pop() {
57
- for (const key of Object.getOwnPropertySymbols(this))
58
- delete this[key];
59
- this.cleanup.forEach(cb => cb());
60
- this.layer.clear();
61
- }
62
- include(inputs, forEach) {
63
- const init = new Map();
64
- if (typeof inputs == "function" || inputs instanceof Model)
65
- inputs = { 0: inputs };
66
- Object.entries(inputs).forEach(([K, V]) => {
67
- if (Model.is(V) || V instanceof Model)
68
- return;
69
- if (K && K != V)
70
- V = `${V} (as '${K}')`;
71
- throw new Error(`Context may only include instance or class \`extends Model\` but got ${V}.`);
72
- });
73
- for (const key in inputs) {
74
- const input = inputs[key];
75
- const exists = this.layer.get(key);
76
- if (!exists) {
77
- const instance = this.add(input);
78
- this.layer.set(key, input);
79
- init.set(instance, true);
80
- }
81
- // Context must force-reset because inputs are no longer safe.
82
- else if (exists !== input) {
83
- this.pop();
84
- this.id = uid();
85
- this.include(inputs);
86
- }
87
- }
88
- for (const [model, explicit] of init) {
89
- model.set();
90
- if (typeof forEach == "function")
91
- forEach(model, explicit);
92
- else if (forEach && explicit)
93
- model.set(forEach);
94
- for (const [_key, value] of model)
95
- if (PARENT.get(value) === model) {
96
- this.add(value, true);
97
- init.set(value, false);
98
- }
90
+ for (const [model, explicit] of init) {
91
+ model.set();
92
+ if (typeof forEach == "function")
93
+ forEach(model, explicit);
94
+ else if (forEach && explicit)
95
+ model.set(forEach);
96
+ for (const [_key, value] of model)
97
+ if (PARENT.get(value) === model) {
98
+ this.add(value, true);
99
+ init.set(value, false);
99
100
  }
100
101
  }
101
- add(input, implicit) {
102
- let T;
103
- let I;
104
- if (typeof input == "function") {
105
- Model.is(input);
106
- T = input;
107
- I = new input();
108
- this.cleanup.add(() => I.set(null));
109
- }
110
- else {
111
- T = input.constructor;
112
- I = input;
113
- }
114
- keys(T, true).forEach(K => {
115
- const result = this[K];
116
- if (!result)
117
- return;
118
- const callback = result(I);
119
- if (callback)
120
- this.cleanup.add(callback);
121
- });
122
- keys(T).forEach(K => {
123
- const value = this.hasOwnProperty(K) ? null : I;
124
- if (value || this[K] !== I && !implicit)
125
- define(this, K, {
126
- configurable: true,
127
- value
128
- });
129
- });
130
- const waiting = LOOKUP.get(I);
131
- if (waiting instanceof Array)
132
- waiting.forEach(cb => cb(this));
133
- LOOKUP.set(I, this);
134
- return I;
102
+ }
103
+ add(input, implicit) {
104
+ let T;
105
+ let I;
106
+ if (typeof input == "function") {
107
+ Model.is(input);
108
+ T = input;
109
+ I = new input();
110
+ this.cleanup.add(() => I.set(null));
111
+ } else {
112
+ T = input.constructor;
113
+ I = input;
135
114
  }
115
+ keys(T, true).forEach((K) => {
116
+ const result = this[K];
117
+ if (!result)
118
+ return;
119
+ const callback = result(I);
120
+ if (callback)
121
+ this.cleanup.add(callback);
122
+ });
123
+ keys(T).forEach((K) => {
124
+ const value = this.hasOwnProperty(K) ? null : I;
125
+ if (value || this[K] !== I && !implicit)
126
+ define(this, K, {
127
+ configurable: true,
128
+ value
129
+ });
130
+ });
131
+ const waiting = LOOKUP.get(I);
132
+ if (waiting instanceof Array)
133
+ waiting.forEach((cb) => cb(this));
134
+ LOOKUP.set(I, this);
135
+ return I;
136
+ }
136
137
  }
137
- export { Context };
138
+ export {
139
+ Context
140
+ };
141
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnRleHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IE1vZGVsLCBQQVJFTlQsIGRlZmluZSwgdWlkIH0gZnJvbSAnLi9tb2RlbCc7XG5cbmNvbnN0IExPT0tVUCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBDb250ZXh0IHwgKChnb3Q6IENvbnRleHQpID0+IHZvaWQpW10+KCk7XG5jb25zdCBLRVlTID0gbmV3IE1hcDxzeW1ib2wgfCBNb2RlbC5UeXBlLCBzeW1ib2w+KCk7XG5cbmZ1bmN0aW9uIGtleShUOiBNb2RlbC5UeXBlIHwgc3ltYm9sLCB1cHN0cmVhbT86IGJvb2xlYW4pOiBzeW1ib2wge1xuICBsZXQgSyA9IEtFWVMuZ2V0KFQpO1xuXG4gIGlmKCFLKVxuICAgIEtFWVMuc2V0KFQsIEsgPSBTeW1ib2woXG4gICAgICB0eXBlb2YgVCA9PSBcInN5bWJvbFwiID8gXCJnZXQgXCIgKyBULmRlc2NyaXB0aW9uIDogU3RyaW5nKFQpXG4gICAgKSk7XG4gIFxuICByZXR1cm4gdXBzdHJlYW0gPyBrZXkoSykgOiBLO1xufVxuXG5mdW5jdGlvbiBrZXlzKGZyb206IE1vZGVsLlR5cGUsIHVwc3RyZWFtPzogYm9vbGVhbil7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN5bWJvbD4oKTtcblxuICBkbyB7XG4gICAga2V5cy5hZGQoa2V5KGZyb20sIHVwc3RyZWFtKSk7XG4gIH1cbiAgd2hpbGUoKGZyb20gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnJvbSkpICE9PSBNb2RlbCk7XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmRlY2xhcmUgbmFtZXNwYWNlIENvbnRleHQge1xuICB0eXBlIE11bHRpcGxlPFQgZXh0ZW5kcyBNb2RlbD4gPSB7XG4gICAgW2tleTogc3RyaW5nIHwgbnVtYmVyXTogTW9kZWwuSW5pdDxUPiB8IFQ7XG4gIH07XG5cbiAgdHlwZSBBY2NlcHQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID0gVCB8IE1vZGVsLkluaXQ8VD4gfCBNdWx0aXBsZTxUPjtcblxuICB0eXBlIEZvckVhY2ggPSAoYWRkZWQ6IE1vZGVsLCBleHBsaWNpdDogYm9vbGVhbikgPT4gdm9pZDtcblxuICB0eXBlIEV4cGVjdCA9IChtb2RlbDogTW9kZWwpID0+ICgoKSA9PiB2b2lkKSB8IHZvaWQ7XG59XG5cbmludGVyZmFjZSBDb250ZXh0IHtcbiAgW2tleTogc3ltYm9sXTogTW9kZWwgfCBDb250ZXh0LkV4cGVjdCB8IG51bGwgfCB1bmRlZmluZWQ7XG59XG5cbmNsYXNzIENvbnRleHQge1xuICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBNb2RlbD4ob246IE1vZGVsLCBjYWxsYmFjazogKChnb3Q6IENvbnRleHQpID0+IHZvaWQpKTogdm9pZDtcbiAgc3RhdGljIGdldDxUIGV4dGVuZHMgTW9kZWw+KG9uOiBNb2RlbCk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG4gIHN0YXRpYyBnZXQoZnJvbTogTW9kZWwsIGNhbGxiYWNrPzogKGdvdDogQ29udGV4dCkgPT4gdm9pZCl7XG4gICAgY29uc3Qgd2FpdGluZyA9IExPT0tVUC5nZXQoZnJvbSk7XG5cbiAgICBpZih3YWl0aW5nIGluc3RhbmNlb2YgQ29udGV4dCl7XG4gICAgICBpZihjYWxsYmFjaylcbiAgICAgICAgY2FsbGJhY2sod2FpdGluZyk7XG5cbiAgICAgIHJldHVybiB3YWl0aW5nO1xuICAgIH1cblxuICAgIGlmKGNhbGxiYWNrKVxuICAgICAgaWYod2FpdGluZykgXG4gICAgICAgIHdhaXRpbmcucHVzaChjYWxsYmFjayk7XG4gICAgICBlbHNlIFxuICAgICAgICBMT09LVVAuc2V0KGZyb20sIFtjYWxsYmFja10pO1xuICB9XG5cbiAgcHVibGljIGlkITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBsYXllciA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBNb2RlbCB8IE1vZGVsLlR5cGU+KCk7XG4gIHByb3RlY3RlZCBjbGVhbnVwID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0cz86IENvbnRleHQuQWNjZXB0KXtcbiAgICBpZihpbnB1dHMpXG4gICAgICB0aGlzLmluY2x1ZGUoaW5wdXRzKTtcbiAgfVxuXG4gIC8qKiBSdW4gY2FsbGJhY2sgd2hlbiBhIHNwZWNpZmllZCB0eXBlIGlzIHJlZ2lzdGVyZWQgdG8gYSAqKmNoaWxkKiogY29udGV4dC4gKi9cbiAgcHVibGljIGhhczxUIGV4dGVuZHMgTW9kZWw+KFR5cGU6IE1vZGVsLlR5cGU8VD4sIGNhbGxiYWNrOiAobW9kZWw6IFQpID0+IHZvaWQpe1xuICAgIGRlZmluZSh0aGlzLCBrZXkoVHlwZSwgdHJ1ZSksIHsgdmFsdWU6IGNhbGxiYWNrIH0pO1xuICB9XG5cbiAgLyoqIEZpbmQgc3BlY2lmaWVkIHR5cGUgcmVnaXN0ZXJlZCB0byBhIHBhcmVudCBjb250ZXh0LiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub25lIGFyZSBmb3VuZC4gKi9cbiAgcHVibGljIGdldDxUIGV4dGVuZHMgTW9kZWw+KFR5cGU6IE1vZGVsLlR5cGU8VD4pe1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNba2V5KFR5cGUpXTtcblxuICAgIGlmKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIGZpbmQgJHtUeXBlfSBpbiBjb250ZXh0LCBidXQgbXVsdGlwbGUgd2VyZSBkZWZpbmVkLmApO1xuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHB1c2goaW5wdXRzPzogQ29udGV4dC5BY2NlcHQpe1xuICAgIGNvbnN0IG5leHQgPSBPYmplY3QuY3JlYXRlKHRoaXMpIGFzIHRoaXM7XG5cbiAgICBuZXh0LmxheWVyID0gbmV3IE1hcCgpO1xuICAgIG5leHQuY2xlYW51cCA9IG5ldyBTZXQoKTtcblxuICAgIGlmKGlucHV0cylcbiAgICAgIG5leHQuaW5jbHVkZShpbnB1dHMpO1xuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICBwdWJsaWMgcG9wKCl7XG4gICAgZm9yKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRoaXMpKVxuICAgICAgZGVsZXRlICh0aGlzIGFzIGFueSlba2V5XTtcblxuICAgIHRoaXMuY2xlYW51cC5mb3JFYWNoKGNiID0+IGNiKCkpO1xuICAgIHRoaXMubGF5ZXIuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbmNsdWRlPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgaW5wdXRzOiBDb250ZXh0LkFjY2VwdDxUPixcbiAgICBmb3JFYWNoPzogQ29udGV4dC5Gb3JFYWNoIHwgTW9kZWwuQXNzaWduPFQ+XG4gICl7XG4gICAgY29uc3QgaW5pdCA9IG5ldyBNYXA8TW9kZWwsIGJvb2xlYW4+KCk7XG5cbiAgICBpZih0eXBlb2YgaW5wdXRzID09IFwiZnVuY3Rpb25cIiB8fCBpbnB1dHMgaW5zdGFuY2VvZiBNb2RlbClcbiAgICAgIGlucHV0cyA9IHsgMDogaW5wdXRzIH07XG5cbiAgICBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZvckVhY2goKFtLLCBWXTogW3N0cmluZywgdW5rbm93bl0pID0+IHtcbiAgICAgIGlmKE1vZGVsLmlzKFYpIHx8IFYgaW5zdGFuY2VvZiBNb2RlbClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBpZihLICYmIEsgIT0gVilcbiAgICAgICAgViA9IGAke1Z9IChhcyAnJHtLfScpYDtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29udGV4dCBtYXkgb25seSBpbmNsdWRlIGluc3RhbmNlIG9yIGNsYXNzIFxcYGV4dGVuZHMgTW9kZWxcXGAgYnV0IGdvdCAke1Z9LmBcbiAgICAgICk7XG4gICAgfSlcblxuICAgIGZvcihjb25zdCBrZXkgaW4gaW5wdXRzKXtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2tleV07XG4gICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmxheWVyLmdldChrZXkpO1xuXG4gICAgICBpZighZXhpc3RzKXtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmFkZChpbnB1dCk7XG5cbiAgICAgICAgdGhpcy5sYXllci5zZXQoa2V5LCBpbnB1dClcbiAgICAgICAgaW5pdC5zZXQoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgfVxuICAgICAgLy8gQ29udGV4dCBtdXN0IGZvcmNlLXJlc2V0IGJlY2F1c2UgaW5wdXRzIGFyZSBubyBsb25nZXIgc2FmZS5cbiAgICAgIGVsc2UgaWYoZXhpc3RzICE9PSBpbnB1dCl7ICAgIFxuICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB0aGlzLmlkID0gdWlkKCk7XG4gICAgICAgIHRoaXMuaW5jbHVkZShpbnB1dHMpO1xuICAgICAgfVxuICAgIH0gXG5cbiAgICBmb3IoY29uc3QgW21vZGVsLCBleHBsaWNpdF0gb2YgaW5pdCl7XG4gICAgICBtb2RlbC5zZXQoKTtcblxuICAgICAgaWYodHlwZW9mIGZvckVhY2ggPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3JFYWNoKG1vZGVsLCBleHBsaWNpdCk7XG4gICAgICBlbHNlIGlmKGZvckVhY2ggJiYgZXhwbGljaXQpXG4gICAgICAgIG1vZGVsLnNldChmb3JFYWNoKTtcblxuICAgICAgZm9yKGNvbnN0IFtfa2V5LCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKFBBUkVOVC5nZXQodmFsdWUgYXMgTW9kZWwpID09PSBtb2RlbCl7XG4gICAgICAgICAgdGhpcy5hZGQodmFsdWUgYXMgTW9kZWwsIHRydWUpO1xuICAgICAgICAgIGluaXQuc2V0KHZhbHVlIGFzIE1vZGVsLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgaW5wdXQ6IFQgfCBNb2RlbC5Jbml0PFQ+LFxuICAgIGltcGxpY2l0PzogYm9vbGVhbil7XG5cbiAgICBsZXQgVDogTW9kZWwuVHlwZTxUPjtcbiAgICBsZXQgSTogVDtcblxuICAgIGlmKHR5cGVvZiBpbnB1dCA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgTW9kZWwuaXMoaW5wdXQpO1xuXG4gICAgICBUID0gaW5wdXQ7XG4gICAgICBJID0gbmV3IGlucHV0KCkgYXMgVDtcbiAgICAgIHRoaXMuY2xlYW51cC5hZGQoKCkgPT4gSS5zZXQobnVsbCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIFQgPSBpbnB1dC5jb25zdHJ1Y3RvciBhcyBNb2RlbC5UeXBlPFQ+O1xuICAgICAgSSA9IGlucHV0O1xuICAgIH1cblxuICAgIGtleXMoVCwgdHJ1ZSkuZm9yRWFjaChLID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbS10gYXMgQ29udGV4dC5FeHBlY3QgfCB1bmRlZmluZWQ7XG4gIFxuICAgICAgaWYoIXJlc3VsdClcbiAgICAgICAgcmV0dXJuO1xuICBcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVzdWx0KEkpO1xuICAgICAgICBcbiAgICAgIGlmKGNhbGxiYWNrKVxuICAgICAgICB0aGlzLmNsZWFudXAuYWRkKGNhbGxiYWNrKTtcbiAgICB9KTtcblxuICAgIGtleXMoVCkuZm9yRWFjaChLID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5oYXNPd25Qcm9wZXJ0eShLKSA/IG51bGwgOiBJO1xuXG4gICAgICBpZih2YWx1ZSB8fCB0aGlzW0tdICE9PSBJICYmICFpbXBsaWNpdClcbiAgICAgICAgZGVmaW5lKHRoaXMsIEssIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB3YWl0aW5nID0gTE9PS1VQLmdldChJKTtcbiAgXG4gICAgaWYod2FpdGluZyBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgd2FpdGluZy5mb3JFYWNoKGNiID0+IGNiKHRoaXMpKTtcblxuICAgIExPT0tVUC5zZXQoSSwgdGhpcyk7XG5cbiAgICByZXR1cm4gSTtcbiAgfVxufVxuXG5leHBvcnQg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QUFDLFFBQU87QUFDVCxjQUFNLFdBQVcsS0FBSyxJQUFJLEtBQUs7QUFFL0IsYUFBSyxNQUFNLElBQUlBLE1BQUssS0FBSztBQUN6QixhQUFLLElBQUksVUFBVSxJQUFJO0FBQUEsTUFDekIsV0FFUSxXQUFXLE9BQU07QUFDdkIsYUFBSyxJQUFJO0FBQ1QsYUFBSyxLQUFLLElBQUk7QUFDZCxhQUFLLFFBQVEsTUFBTTtBQUFBLE1BQ3JCO0FBQUEsSUFDRjtBQUVBLGVBQVUsQ0FBQyxPQUFPLFFBQVEsS0FBSyxNQUFLO0FBQ2xDLFlBQU0sSUFBSTtBQUVWLFVBQUcsT0FBTyxXQUFXO0FBQ25CLGdCQUFRLE9BQU8sUUFBUTtBQUFBLGVBQ2pCLFdBQVc7QUFDakIsY0FBTSxJQUFJLE9BQU87QUFFbkIsaUJBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSztBQUN6QixZQUFHLE9BQU8sSUFBSSxLQUFjLE1BQU0sT0FBTTtBQUN0QyxlQUFLLElBQUksT0FBZ0IsSUFBSTtBQUM3QixlQUFLLElBQUksT0FBZ0IsS0FBSztBQUFBLFFBQ2hDO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUVVLElBQ1IsT0FDQSxVQUFtQjtBQUVuQixRQUFJO0FBQ0osUUFBSTtBQUVKLFFBQUcsT0FBTyxTQUFTLFlBQVc7QUFDNUIsWUFBTSxHQUFHLEtBQUs7QUFFZCxVQUFJO0FBQ0osVUFBSSxJQUFJLE1BQU07QUFDZCxXQUFLLFFBQVEsSUFBSSxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUM7QUFBQSxJQUNwQyxPQUNLO0FBQ0gsVUFBSSxNQUFNO0FBQ1YsVUFBSTtBQUFBLElBQ047QUFFQSxTQUFLLEdBQUcsSUFBSSxFQUFFLFFBQVEsT0FBSztBQUN6QixZQUFNLFNBQVMsS0FBSyxDQUFDO0FBRXJCLFVBQUcsQ0FBQztBQUNGO0FBRUYsWUFBTSxXQUFXLE9BQU8sQ0FBQztBQUV6QixVQUFHO0FBQ0QsYUFBSyxRQUFRLElBQUksUUFBUTtBQUFBLElBQzdCLENBQUM7QUFFRCxTQUFLLENBQUMsRUFBRSxRQUFRLE9BQUs7QUFDbkIsWUFBTSxRQUFRLEtBQUssZUFBZSxDQUFDLElBQUksT0FBTztBQUU5QyxVQUFHLFNBQVMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQzVCLGVBQU8sTUFBTSxHQUFHO0FBQUEsVUFDZCxjQUFjO0FBQUEsVUFDZDtBQUFBLFFBQ0YsQ0FBQztBQUFBLElBQ0wsQ0FBQztBQUVELFVBQU0sVUFBVSxPQUFPLElBQUksQ0FBQztBQUU1QixRQUFHLG1CQUFtQjtBQUNwQixjQUFRLFFBQVEsUUFBTSxHQUFHLElBQUksQ0FBQztBQUVoQyxXQUFPLElBQUksR0FBRyxJQUFJO0FBRWxCLFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwKICAibmFtZXMiOiBbImtleXMiLCAia2V5Il0KfQo=