@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/context.js +130 -126
- package/dist/esm/control.js +165 -158
- package/dist/esm/index.js +22 -8
- package/dist/esm/instruction/get.js +84 -84
- package/dist/esm/instruction/has.js +73 -70
- package/dist/esm/instruction/ref.js +58 -55
- package/dist/esm/instruction/set.js +77 -80
- package/dist/esm/instruction/use.js +60 -55
- package/dist/esm/model.js +247 -251
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/package.json +4 -4
- package/dist/esm/context.test.js +0 -211
- package/dist/esm/control.test.js +0 -183
- package/dist/esm/instruction/get.test.js +0 -645
- package/dist/esm/instruction/has.test.js +0 -354
- package/dist/esm/instruction/ref.test.js +0 -281
- package/dist/esm/instruction/set.test.js +0 -527
- package/dist/esm/instruction/use.test.js +0 -305
- package/dist/esm/mocks.js +0 -20
- package/dist/esm/model.test.js +0 -1541
package/dist/esm/context.js
CHANGED
|
@@ -1,137 +1,141 @@
|
|
|
1
|
-
import { Model, PARENT, define, uid } from
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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 {
|
|
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=
|