footprintjs 9.6.0 → 9.7.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/CLAUDE.md +2 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +10 -1
- package/dist/esm/lib/memory/SharedMemory.js +1 -1
- package/dist/esm/lib/memory/StageContext.js +40 -3
- package/dist/esm/lib/memory/TransactionBuffer.js +166 -9
- package/dist/esm/lib/memory/commitLogUtils.js +71 -1
- package/dist/esm/lib/memory/index.js +1 -1
- package/dist/esm/lib/memory/pathOps.js +28 -1
- package/dist/esm/lib/memory/types.js +1 -1
- package/dist/esm/lib/memory/utils.js +29 -3
- package/dist/esm/lib/runner/ExecutionRuntime.js +19 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +22 -1
- package/dist/esm/trace.js +6 -3
- package/dist/index.js +1 -1
- package/dist/lib/engine/handlers/SubflowExecutor.js +10 -1
- package/dist/lib/memory/SharedMemory.js +1 -1
- package/dist/lib/memory/StageContext.js +40 -3
- package/dist/lib/memory/TransactionBuffer.js +166 -9
- package/dist/lib/memory/commitLogUtils.js +73 -2
- package/dist/lib/memory/index.js +1 -1
- package/dist/lib/memory/pathOps.js +30 -2
- package/dist/lib/memory/types.js +1 -1
- package/dist/lib/memory/utils.js +28 -2
- package/dist/lib/runner/ExecutionRuntime.js +19 -1
- package/dist/lib/runner/FlowChartExecutor.js +22 -1
- package/dist/trace.js +7 -3
- package/dist/types/index.d.ts +17 -0
- package/dist/types/lib/memory/SharedMemory.d.ts +2 -5
- package/dist/types/lib/memory/StageContext.d.ts +23 -1
- package/dist/types/lib/memory/TransactionBuffer.d.ts +70 -10
- package/dist/types/lib/memory/commitLogUtils.d.ts +28 -0
- package/dist/types/lib/memory/index.d.ts +1 -1
- package/dist/types/lib/memory/pathOps.d.ts +10 -0
- package/dist/types/lib/memory/types.d.ts +56 -3
- package/dist/types/lib/memory/utils.d.ts +21 -6
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +23 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +41 -3
- package/dist/types/trace.d.ts +1 -1
- package/package.json +1 -1
|
@@ -29,9 +29,12 @@ class TransactionBuffer {
|
|
|
29
29
|
updatePatch = {};
|
|
30
30
|
opTrace = [];
|
|
31
31
|
redactedPaths = new Set();
|
|
32
|
-
|
|
32
|
+
/** Commit-value encoding policy (#13c-B). `'full'` = historical bytes. */
|
|
33
|
+
commitValues;
|
|
34
|
+
constructor(base, commitValues = 'full') {
|
|
33
35
|
this.baseSnapshot = structuredClone(base);
|
|
34
36
|
this.workingCopy = structuredClone(base);
|
|
37
|
+
this.commitValues = commitValues;
|
|
35
38
|
}
|
|
36
39
|
/** Hard overwrite at the specified path. */
|
|
37
40
|
set(path, value, shouldRedact = false) {
|
|
@@ -42,6 +45,25 @@ class TransactionBuffer {
|
|
|
42
45
|
}
|
|
43
46
|
this.opTrace.push({ path: (0, utils_js_1.normalisePath)(path), verb: 'set' });
|
|
44
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Explicit key deletion at the specified path (#13c-B; absorbs backlog B8).
|
|
50
|
+
*
|
|
51
|
+
* Stages EXACTLY the same buffer mutations as `set(path, undefined)` —
|
|
52
|
+
* `workingCopy`/`overwritePatch` get an own `undefined` at the path (the
|
|
53
|
+
* historical flattening, preserving read behavior and the dedup diff base
|
|
54
|
+
* across modes) — but records the op verb as `'delete'`. At commit:
|
|
55
|
+
* `'full'` mode maps it back to a `'set'` trace entry (byte-identical to
|
|
56
|
+
* today); `'delta'` mode emits a real `'delete'` entry whose replay
|
|
57
|
+
* REMOVES the key instead of leaving `key: undefined` behind.
|
|
58
|
+
*/
|
|
59
|
+
delete(path, shouldRedact = false) {
|
|
60
|
+
(0, pathOps_js_1.nativeSet)(this.workingCopy, path, undefined);
|
|
61
|
+
(0, pathOps_js_1.nativeSet)(this.overwritePatch, path, undefined);
|
|
62
|
+
if (shouldRedact) {
|
|
63
|
+
this.redactedPaths.add((0, utils_js_1.normalisePath)(path));
|
|
64
|
+
}
|
|
65
|
+
this.opTrace.push({ path: (0, utils_js_1.normalisePath)(path), verb: 'delete' });
|
|
66
|
+
}
|
|
45
67
|
/** Deep union merge at the specified path. */
|
|
46
68
|
merge(path, value, shouldRedact = false) {
|
|
47
69
|
const existing = (0, pathOps_js_1.nativeGet)(this.workingCopy, path) ?? {};
|
|
@@ -104,10 +126,11 @@ class TransactionBuffer {
|
|
|
104
126
|
* commit-indexed slider stable while making the highlight truthful.
|
|
105
127
|
*
|
|
106
128
|
* ── KNOWN LIMITATIONS / FUTURE ──────────────────────────────────────────
|
|
107
|
-
* • Explicit key DELETION
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
129
|
+
* • Explicit key DELETION under the default 'full' mode is still
|
|
130
|
+
* flattened to set-of-`undefined` (a removed key cannot be expressed
|
|
131
|
+
* in MemoryPatch alone). CLOSED under `commitValues: 'delta'` (#13c-B):
|
|
132
|
+
* {@link delete} stages a distinct op and the bundle carries a real
|
|
133
|
+
* `delete` trace verb whose replay removes the key.
|
|
111
134
|
* • Array-merge dedup in {@link deepSmartMerge} still uses reference equality
|
|
112
135
|
* (`new Set`), so deep-equal *objects* in a merged array are not deduped.
|
|
113
136
|
* Orthogonal to this change; tracked separately.
|
|
@@ -115,7 +138,7 @@ class TransactionBuffer {
|
|
|
115
138
|
* Resets the buffer to empty state after commit.
|
|
116
139
|
*/
|
|
117
140
|
commit() {
|
|
118
|
-
const payload = this.toChangeOnlyPayload();
|
|
141
|
+
const payload = this.commitValues === 'delta' ? this.toDeltaPayload() : this.toChangeOnlyPayload();
|
|
119
142
|
this.overwritePatch = {};
|
|
120
143
|
this.updatePatch = {};
|
|
121
144
|
this.opTrace.length = 0;
|
|
@@ -134,6 +157,11 @@ class TransactionBuffer {
|
|
|
134
157
|
* surviving `merge` paths copy their accumulated delta from `updatePatch` —
|
|
135
158
|
* preserving the set-vs-merge verb so replay ({@link applySmartMerge}) is
|
|
136
159
|
* byte-for-byte identical to recording only the real changes.
|
|
160
|
+
*
|
|
161
|
+
* This is the DEFAULT (`commitValues: 'full'`) payload — byte-identical to
|
|
162
|
+
* the historical behavior, including flattening staged `delete` ops into
|
|
163
|
+
* `set`-of-`undefined` trace entries. The delta encoding lives in
|
|
164
|
+
* {@link toDeltaPayload}.
|
|
137
165
|
*/
|
|
138
166
|
toChangeOnlyPayload() {
|
|
139
167
|
const overwrite = {};
|
|
@@ -146,18 +174,147 @@ class TransactionBuffer {
|
|
|
146
174
|
const after = (0, pathOps_js_1.nativeGet)(this.workingCopy, segments);
|
|
147
175
|
if ((0, utils_js_1.deepEqual)(before, after))
|
|
148
176
|
continue; // no-op or write-then-revert → no net change
|
|
149
|
-
|
|
177
|
+
// Historical flattening: an explicit delete commits as set-of-undefined.
|
|
178
|
+
trace.push(op.verb === 'delete' ? { path: op.path, verb: 'set' } : op);
|
|
150
179
|
survivingPaths.add(op.path);
|
|
151
|
-
if (op.verb === '
|
|
180
|
+
if (op.verb === 'merge') {
|
|
181
|
+
(0, pathOps_js_1.nativeSet)(updates, segments, structuredClone((0, pathOps_js_1.nativeGet)(this.updatePatch, segments)));
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
152
184
|
(0, pathOps_js_1.nativeSet)(overwrite, segments, structuredClone((0, pathOps_js_1.nativeGet)(this.overwritePatch, segments)));
|
|
153
185
|
}
|
|
186
|
+
}
|
|
187
|
+
const redactedPaths = new Set([...this.redactedPaths].filter((path) => survivingPaths.has(path)));
|
|
188
|
+
return { overwrite, updates, redactedPaths, trace };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Delta-encoded payload (`commitValues: 'delta'`, #13c-B) — same net-change
|
|
192
|
+
* filter as {@link toChangeOnlyPayload}, two encoding differences:
|
|
193
|
+
*
|
|
194
|
+
* 1. **One trace entry per surviving path** (the §2.5 dedup rule — `append`
|
|
195
|
+
* is NOT idempotent on replay, so duplicate entries would multiply
|
|
196
|
+
* tails). The verb is resolved from the path's op mix + base→final
|
|
197
|
+
* relationship; entries are ordered by each path's LAST touch,
|
|
198
|
+
* preserving last-writer-wins for nested/overlapping paths.
|
|
199
|
+
* 2. **Verb resolution per path**:
|
|
200
|
+
* - last op `'delete'` AND final value gone → `delete` (the path stays
|
|
201
|
+
* enumerated in `overwrite` with `undefined` for key-set consumers);
|
|
202
|
+
* - ONLY `'merge'` ops → `merge` with the accumulated `updatePatch`
|
|
203
|
+
* delta (replaying the accumulated delta once ≡ the full mode's
|
|
204
|
+
* k sequential replays — `deepSmartMerge` is reference-idempotent
|
|
205
|
+
* within one replay pass);
|
|
206
|
+
* - otherwise (`set`/mixed): the committed value is computed by
|
|
207
|
+
* replaying the path's op sequence EXACTLY the way `applySmartMerge`
|
|
208
|
+
* replays the full-mode bundle ({@link replayPathVerbs}) — for
|
|
209
|
+
* pure-set paths that is simply the last set value; for mixed
|
|
210
|
+
* set+merge interleavings it reproduces the full mode's quirk of
|
|
211
|
+
* applying the ACCUMULATED merge delta at every merge position
|
|
212
|
+
* (which can differ from the buffer's read-your-writes view; parity
|
|
213
|
+
* with the `'full'` mode's committed state is the contract). If base
|
|
214
|
+
* and that value are arrays and base is a STRICT PREFIX → `append`
|
|
215
|
+
* storing only the tail; else `set` storing the full value.
|
|
216
|
+
*
|
|
217
|
+
* Losslessness never depends on detection succeeding — every fallback is
|
|
218
|
+
* today's full-value `set`.
|
|
219
|
+
*/
|
|
220
|
+
toDeltaPayload() {
|
|
221
|
+
const overwrite = {};
|
|
222
|
+
const updates = {};
|
|
223
|
+
const trace = [];
|
|
224
|
+
const survivingPaths = new Set();
|
|
225
|
+
// Path → its op-verb sequence, ordered by LAST touch (delete +
|
|
226
|
+
// re-insert moves a re-touched path to the end of the Map's insertion
|
|
227
|
+
// order — preserving last-writer-wins for nested/overlapping paths).
|
|
228
|
+
const byPath = new Map();
|
|
229
|
+
for (const op of this.opTrace) {
|
|
230
|
+
const prev = byPath.get(op.path);
|
|
231
|
+
if (prev) {
|
|
232
|
+
prev.push(op.verb);
|
|
233
|
+
byPath.delete(op.path);
|
|
234
|
+
byPath.set(op.path, prev);
|
|
235
|
+
}
|
|
154
236
|
else {
|
|
237
|
+
byPath.set(op.path, [op.verb]);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
for (const [path, verbs] of byPath) {
|
|
241
|
+
const segments = path.split(utils_js_1.DELIM);
|
|
242
|
+
const before = (0, pathOps_js_1.nativeGet)(this.baseSnapshot, segments);
|
|
243
|
+
const after = (0, pathOps_js_1.nativeGet)(this.workingCopy, segments);
|
|
244
|
+
if ((0, utils_js_1.deepEqual)(before, after))
|
|
245
|
+
continue; // no-op or write-then-revert → no net change (same filter as 'full')
|
|
246
|
+
survivingPaths.add(path);
|
|
247
|
+
const lastVerb = verbs[verbs.length - 1];
|
|
248
|
+
if (lastVerb === 'delete' && after === undefined) {
|
|
249
|
+
// Real deletion — replay removes the key. Keep the path enumerated
|
|
250
|
+
// in `overwrite` (undefined) so Object.keys consumers see it.
|
|
251
|
+
trace.push({ path, verb: 'delete' });
|
|
252
|
+
(0, pathOps_js_1.nativeSet)(overwrite, segments, undefined);
|
|
253
|
+
}
|
|
254
|
+
else if (verbs.every((v) => v === 'merge')) {
|
|
255
|
+
trace.push({ path, verb: 'merge' });
|
|
155
256
|
(0, pathOps_js_1.nativeSet)(updates, segments, structuredClone((0, pathOps_js_1.nativeGet)(this.updatePatch, segments)));
|
|
156
257
|
}
|
|
258
|
+
else {
|
|
259
|
+
// Committed-equivalent value: replay this path's op sequence the way
|
|
260
|
+
// applySmartMerge replays the FULL-mode bundle, so both modes commit
|
|
261
|
+
// byte-identical state (see the method JSDoc).
|
|
262
|
+
const committed = this.replayPathVerbs(before, segments, verbs);
|
|
263
|
+
if (isStrictArrayPrefix(before, committed)) {
|
|
264
|
+
trace.push({ path, verb: 'append' });
|
|
265
|
+
(0, pathOps_js_1.nativeSet)(overwrite, segments, structuredClone(committed.slice(before.length)));
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
trace.push({ path, verb: 'set' });
|
|
269
|
+
(0, pathOps_js_1.nativeSet)(overwrite, segments, structuredClone(committed));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
157
272
|
}
|
|
158
273
|
const redactedPaths = new Set([...this.redactedPaths].filter((path) => survivingPaths.has(path)));
|
|
159
274
|
return { overwrite, updates, redactedPaths, trace };
|
|
160
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* Replay ONE path's op-verb sequence against its base value, exactly the
|
|
278
|
+
* way `applySmartMerge` replays the corresponding full-mode bundle: every
|
|
279
|
+
* `set`/`delete` position applies the LAST staged overwrite value (the
|
|
280
|
+
* bag holds one value per path — last writer wins), every `merge`
|
|
281
|
+
* position applies the ACCUMULATED `updatePatch` delta. This reproduces
|
|
282
|
+
* the full mode's committed value for any interleaving — including the
|
|
283
|
+
* mixed set+merge quirk where the accumulated delta re-applies pre-set
|
|
284
|
+
* merge keys (full-mode replay semantics, kept for byte-parity across
|
|
285
|
+
* modes; property-tested in delta-replay-equivalence).
|
|
286
|
+
*/
|
|
287
|
+
replayPathVerbs(before, segments, verbs) {
|
|
288
|
+
const setValue = (0, pathOps_js_1.nativeGet)(this.overwritePatch, segments);
|
|
289
|
+
const mergeDelta = (0, pathOps_js_1.nativeGet)(this.updatePatch, segments);
|
|
290
|
+
let value = before;
|
|
291
|
+
for (const verb of verbs) {
|
|
292
|
+
value = verb === 'merge' ? (0, utils_js_1.deepSmartMerge)(value ?? {}, mergeDelta) : setValue;
|
|
293
|
+
}
|
|
294
|
+
return value;
|
|
295
|
+
}
|
|
161
296
|
}
|
|
162
297
|
exports.TransactionBuffer = TransactionBuffer;
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRzs7O0FBRUgsNkNBQW9FO0FBRXBFLHlDQUE2RTtBQUU3RSxNQUFhLGlCQUFpQjtJQUNYLFlBQVksQ0FBTTtJQUMzQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUE4QyxFQUFFLENBQUM7SUFDeEQsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFMUMsWUFBWSxJQUFTO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCw0Q0FBNEM7SUFDNUMsR0FBRyxDQUFDLElBQXlCLEVBQUUsS0FBVSxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQzdELElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFBLHdCQUFhLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxFQUFFLElBQUks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RSxDQUFDO2dCQUN0QixJQUFBLHNCQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFBLHNCQUFJLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUE1SkQsOENBNEpDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1ZmZlciDigJQgUGVyLXN0YWdlIFNUQUdJTkcgYnVmZmVyIGZvciBzdGF0ZSBtdXRhdGlvbnNcbiAqXG4gKiBXaGF0IGl0IElTOiBhIHN0YWdpbmcgYnVmZmVyIHdpdGggcmVhZC15b3VyLXdyaXRlcyBhbmQgbmV0LWNoYW5nZSBjb21taXRzLlxuICogLSBDaGFuZ2VzIGFyZSBzdGFnZWQgaGVyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uIGFuZCBmbHVzaGVkIHRvXG4gKiAgIFNoYXJlZE1lbW9yeSBpbiBPTkUgYmF0Y2ggcGVyIHN0YWdlIChgY29tbWl0KClgKSDigJQgb3RoZXIgc3RhZ2VzIGFuZFxuICogICBwYXJhbGxlbCBzaWJsaW5ncyBuZXZlciBvYnNlcnZlIGEgc3RhZ2UncyBoYWxmLWZpbmlzaGVkIHdyaXRlcy5cbiAqIC0gUmVhZC1hZnRlci13cml0ZSBjb25zaXN0ZW5jeSB3aXRoaW4gYSBzdGFnZSDigJQgYSBzdGFnZSBzZWVzIGl0cyBvd25cbiAqICAgc3RhZ2VkIHdyaXRlcyBpbW1lZGlhdGVseS5cbiAqIC0gYGNvbW1pdCgpYCByZWNvcmRzIHRoZSBzdGFnZSdzIE5FVCBjaGFuZ2UgKHNlZSB7QGxpbmsgY29tbWl0fSksIHBsdXMgYW5cbiAqICAgb3BlcmF0aW9uIHRyYWNlIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS5cbiAqXG4gKiBXaGF0IGl0IGlzIE5PVDogYSByb2xsYmFjayBtZWNoYW5pc20uIERlc3BpdGUgdGhlIG5hbWUsIHRoZXJlIGlzIG5vXG4gKiBhYm9ydC9yb2xsYmFjayBwYXRoIOKAlCB3aGVuIGEgc3RhZ2UgVEhST1dTLCB0aGUgZW5naW5lIHN0aWxsIGNvbW1pdHNcbiAqIGV2ZXJ5dGhpbmcgc3RhZ2VkIHNvIGZhciBiZWZvcmUgcmUtdGhyb3dpbmcgKGNvbW1pdC1vbi1lcnJvciBpblxuICogYEZsb3djaGFydFRyYXZlcnNlcmApLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBhdWRpdCB0cmFpbCBtdXN0IHJlY29yZFxuICogd2hhdCB0aGUgZmFpbGluZyBzdGFnZSBjaGFuZ2VkLiBEbyBub3QgcmVseSBvbiBcInN0YWdlIGZhaWxlZCDihpIgaXRzXG4gKiB3cml0ZXMgdmFuaXNoZWRcIi5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBkZWVwU21hcnRNZXJnZSwgREVMSU0sIG5vcm1hbGlzZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoYmFzZTogYW55KSB7XG4gICAgdGhpcy5iYXNlU25hcHNob3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgfVxuXG4gIC8qKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgc3RydWN0dXJlZENsb25lKHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnc2V0JyB9KTtcbiAgfVxuXG4gIC8qKiBEZWVwIHVuaW9uIG1lcmdlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoLCBkZWVwU21hcnRNZXJnZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgpID8/IHt9LCB2YWx1ZSkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChwYXRoKSk7XG4gICAgfVxuICAgIHRoaXMub3BUcmFjZS5wdXNoKHsgcGF0aDogbm9ybWFsaXNlUGF0aChwYXRoKSwgdmVyYjogJ21lcmdlJyB9KTtcbiAgfVxuXG4gIC8qKiBSZWFkIGN1cnJlbnQgdmFsdWUgYXQgcGF0aCAoaW5jbHVkZXMgdW5jb21taXR0ZWQgY2hhbmdlcykuICovXG4gIGdldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpIHtcbiAgICByZXR1cm4gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiBpcyBzdGlsbCB1bnJlcHJlc2VudGFibGUgaW4gTWVtb3J5UGF0Y2ggKGEgcmVtb3ZlZFxuICAgKiAgICAga2V5IGNhbm5vdCBiZSBleHByZXNzZWQpLiBTZXR0aW5nIGEga2V5IHRvIGB1bmRlZmluZWRgIGlzIHRyZWF0ZWQgYXMgYVxuICAgKiAgICAgY2hhbmdlICh2YWx1ZSBkaWZmZXJzIGZyb20gYmFzZSksIG5vdCBhIGRlbGV0aW9uLiBUcmFja2VkIGZvciBhIGZ1dHVyZVxuICAgKiAgICAgYGRlbGV0ZWAgdmVyYi5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG5cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkIG92ZXJ3cml0ZSAvIHVwZGF0ZXMgLyB0cmFjZSBrZWVwaW5nIE9OTFkgcGF0aHMgd2hvc2UgZmluYWwgdmFsdWVcbiAgICogZGlmZmVycyBmcm9tIHRoZSBiYXNlIHZhbHVlIOKAlCBpLmUuIHRoZSBzdGFnZSdzIG5ldCBjaGFuZ2UuIFNlZVxuICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXIuY29tbWl0fSBmb3IgdGhlIHJhdGlvbmFsZS5cbiAgICpcbiAgICogUGF0aHMgYXJlIGNvbXBhcmVkIGF0IHRoZSBleGFjdCBncmFudWxhcml0eSB0aGV5IHdlcmUgd3JpdHRlbiAoZWFjaCB0cmFjZVxuICAgKiBlbnRyeSdzIHBhdGgpLCBhZ2FpbnN0IGB3b3JraW5nQ29weWAgKGZpbmFsKSB2cyBgYmFzZVNuYXBzaG90YCAoc3RhcnQpLlxuICAgKiBTdXJ2aXZpbmcgYHNldGAgcGF0aHMgY29weSB0aGVpciBmaW5hbCB2YWx1ZSBmcm9tIGBvdmVyd3JpdGVQYXRjaGA7XG4gICAqIHN1cnZpdmluZyBgbWVyZ2VgIHBhdGhzIGNvcHkgdGhlaXIgYWNjdW11bGF0ZWQgZGVsdGEgZnJvbSBgdXBkYXRlUGF0Y2hgIOKAlFxuICAgKiBwcmVzZXJ2aW5nIHRoZSBzZXQtdnMtbWVyZ2UgdmVyYiBzbyByZXBsYXkgKHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9KSBpc1xuICAgKiBieXRlLWZvci1ieXRlIGlkZW50aWNhbCB0byByZWNvcmRpbmcgb25seSB0aGUgcmVhbCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3Qgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXM6IE1lbW9yeVBhdGNoID0ge307XG4gICAgY29uc3QgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdID0gW107XG4gICAgY29uc3Qgc3Vydml2aW5nUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIGlmIChkZWVwRXF1YWwoYmVmb3JlLCBhZnRlcikpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKG9wKTtcbiAgICAgIHN1cnZpdmluZ1BhdGhzLmFkZChvcC5wYXRoKTtcbiAgICAgIGlmIChvcC52ZXJiID09PSAnc2V0Jykge1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQoWy4uLnRoaXMucmVkYWN0ZWRQYXRoc10uZmlsdGVyKChwYXRoKSA9PiBzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpKTtcbiAgICByZXR1cm4geyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlIH07XG4gIH1cbn1cbiJdfQ==
|
|
298
|
+
/**
|
|
299
|
+
* Append-detection predicate (#13c-B §2.2): both values are arrays, the
|
|
300
|
+
* final is strictly longer, and the base is a structural prefix of the
|
|
301
|
+
* final. Element compares short-circuit on reference identity (`deepEqual`'s
|
|
302
|
+
* `===` fast path) before walking structure, and bail at the first mismatch
|
|
303
|
+
* — worst case one structural compare of the base array, strictly cheaper
|
|
304
|
+
* than the full-value `structuredClone` the fallback pays.
|
|
305
|
+
*
|
|
306
|
+
* `before === undefined` (first write) fails `Array.isArray` → `set`, which
|
|
307
|
+
* keeps the first write as the causal anchor for "who initialized this key".
|
|
308
|
+
*/
|
|
309
|
+
function isStrictArrayPrefix(before, after) {
|
|
310
|
+
if (!Array.isArray(before) || !Array.isArray(after))
|
|
311
|
+
return false;
|
|
312
|
+
if (after.length <= before.length)
|
|
313
|
+
return false;
|
|
314
|
+
for (let i = 0; i < before.length; i++) {
|
|
315
|
+
if (!(0, utils_js_1.deepEqual)(before[i], after[i]))
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRzs7O0FBRUgsNkNBQW9FO0FBRXBFLHlDQUE2RTtBQVE3RSxNQUFhLGlCQUFpQjtJQUNYLFlBQVksQ0FBTTtJQUMzQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUFxQyxFQUFFLENBQUM7SUFDL0MsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUMsMEVBQTBFO0lBQ3pELFlBQVksQ0FBbUI7SUFFaEQsWUFBWSxJQUFTLEVBQUUsZUFBaUMsTUFBTTtRQUM1RCxJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEdBQUcsQ0FBQyxJQUF5QixFQUFFLEtBQVUsRUFBRSxZQUFZLEdBQUcsS0FBSztRQUM3RCxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNE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LEtBQUssQ0FBQztJQUNwRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1ZmZlciDigJQgUGVyLXN0YWdlIFNUQUdJTkcgYnVmZmVyIGZvciBzdGF0ZSBtdXRhdGlvbnNcbiAqXG4gKiBXaGF0IGl0IElTOiBhIHN0YWdpbmcgYnVmZmVyIHdpdGggcmVhZC15b3VyLXdyaXRlcyBhbmQgbmV0LWNoYW5nZSBjb21taXRzLlxuICogLSBDaGFuZ2VzIGFyZSBzdGFnZWQgaGVyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uIGFuZCBmbHVzaGVkIHRvXG4gKiAgIFNoYXJlZE1lbW9yeSBpbiBPTkUgYmF0Y2ggcGVyIHN0YWdlIChgY29tbWl0KClgKSDigJQgb3RoZXIgc3RhZ2VzIGFuZFxuICogICBwYXJhbGxlbCBzaWJsaW5ncyBuZXZlciBvYnNlcnZlIGEgc3RhZ2UncyBoYWxmLWZpbmlzaGVkIHdyaXRlcy5cbiAqIC0gUmVhZC1hZnRlci13cml0ZSBjb25zaXN0ZW5jeSB3aXRoaW4gYSBzdGFnZSDigJQgYSBzdGFnZSBzZWVzIGl0cyBvd25cbiAqICAgc3RhZ2VkIHdyaXRlcyBpbW1lZGlhdGVseS5cbiAqIC0gYGNvbW1pdCgpYCByZWNvcmRzIHRoZSBzdGFnZSdzIE5FVCBjaGFuZ2UgKHNlZSB7QGxpbmsgY29tbWl0fSksIHBsdXMgYW5cbiAqICAgb3BlcmF0aW9uIHRyYWNlIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS5cbiAqXG4gKiBXaGF0IGl0IGlzIE5PVDogYSByb2xsYmFjayBtZWNoYW5pc20uIERlc3BpdGUgdGhlIG5hbWUsIHRoZXJlIGlzIG5vXG4gKiBhYm9ydC9yb2xsYmFjayBwYXRoIOKAlCB3aGVuIGEgc3RhZ2UgVEhST1dTLCB0aGUgZW5naW5lIHN0aWxsIGNvbW1pdHNcbiAqIGV2ZXJ5dGhpbmcgc3RhZ2VkIHNvIGZhciBiZWZvcmUgcmUtdGhyb3dpbmcgKGNvbW1pdC1vbi1lcnJvciBpblxuICogYEZsb3djaGFydFRyYXZlcnNlcmApLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBhdWRpdCB0cmFpbCBtdXN0IHJlY29yZFxuICogd2hhdCB0aGUgZmFpbGluZyBzdGFnZSBjaGFuZ2VkLiBEbyBub3QgcmVseSBvbiBcInN0YWdlIGZhaWxlZCDihpIgaXRzXG4gKiB3cml0ZXMgdmFuaXNoZWRcIi5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBkZWVwU21hcnRNZXJnZSwgREVMSU0sIG5vcm1hbGlzZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqIE9wLWxldmVsIHZlcmJzIHN0YWdlZCBpbnRvIGBvcFRyYWNlYC4gYCdkZWxldGUnYCBpcyBzdGFnZWQgZGlzdGluY3RseSBzb1xuICogIGRlbHRhLW1vZGUgY29tbWl0cyAoIzEzYy1CKSBjYW4gZW1pdCBhIHJlYWwgYGRlbGV0ZWAgdHJhY2UgZW50cnk7IHVuZGVyXG4gKiAgdGhlIGRlZmF1bHQgYCdmdWxsJ2AgbW9kZSBpdCBjb21taXRzIGFzIGAnc2V0J2AgKG9mIGB1bmRlZmluZWRgKSDigJRcbiAqICBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLiAqL1xudHlwZSBPcFZlcmIgPSAnc2V0JyB8ICdtZXJnZScgfCAnZGVsZXRlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYiB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBDb21taXQtdmFsdWUgZW5jb2RpbmcgcG9saWN5ICgjMTNjLUIpLiBgJ2Z1bGwnYCA9IGhpc3RvcmljYWwgYnl0ZXMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlO1xuXG4gIGNvbnN0cnVjdG9yKGJhc2U6IGFueSwgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnKSB7XG4gICAgdGhpcy5iYXNlU25hcHNob3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlcyA9IGNvbW1pdFZhbHVlcztcbiAgfVxuXG4gIC8qKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgc3RydWN0dXJlZENsb25lKHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnc2V0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCBrZXkgZGVsZXRpb24gYXQgdGhlIHNwZWNpZmllZCBwYXRoICgjMTNjLUI7IGFic29yYnMgYmFja2xvZyBCOCkuXG4gICAqXG4gICAqIFN0YWdlcyBFWEFDVExZIHRoZSBzYW1lIGJ1ZmZlciBtdXRhdGlvbnMgYXMgYHNldChwYXRoLCB1bmRlZmluZWQpYCDigJRcbiAgICogYHdvcmtpbmdDb3B5YC9gb3ZlcndyaXRlUGF0Y2hgIGdldCBhbiBvd24gYHVuZGVmaW5lZGAgYXQgdGhlIHBhdGggKHRoZVxuICAgKiBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcsIHByZXNlcnZpbmcgcmVhZCBiZWhhdmlvciBhbmQgdGhlIGRlZHVwIGRpZmYgYmFzZVxuICAgKiBhY3Jvc3MgbW9kZXMpIOKAlCBidXQgcmVjb3JkcyB0aGUgb3AgdmVyYiBhcyBgJ2RlbGV0ZSdgLiBBdCBjb21taXQ6XG4gICAqIGAnZnVsbCdgIG1vZGUgbWFwcyBpdCBiYWNrIHRvIGEgYCdzZXQnYCB0cmFjZSBlbnRyeSAoYnl0ZS1pZGVudGljYWwgdG9cbiAgICogdG9kYXkpOyBgJ2RlbHRhJ2AgbW9kZSBlbWl0cyBhIHJlYWwgYCdkZWxldGUnYCBlbnRyeSB3aG9zZSByZXBsYXlcbiAgICogUkVNT1ZFUyB0aGUga2V5IGluc3RlYWQgb2YgbGVhdmluZyBga2V5OiB1bmRlZmluZWRgIGJlaGluZC5cbiAgICovXG4gIGRlbGV0ZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdW5kZWZpbmVkKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnZGVsZXRlJyB9KTtcbiAgfVxuXG4gIC8qKiBEZWVwIHVuaW9uIG1lcmdlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoLCBkZWVwU21hcnRNZXJnZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgpID8/IHt9LCB2YWx1ZSkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChwYXRoKSk7XG4gICAgfVxuICAgIHRoaXMub3BUcmFjZS5wdXNoKHsgcGF0aDogbm9ybWFsaXNlUGF0aChwYXRoKSwgdmVyYjogJ21lcmdlJyB9KTtcbiAgfVxuXG4gIC8qKiBSZWFkIGN1cnJlbnQgdmFsdWUgYXQgcGF0aCAoaW5jbHVkZXMgdW5jb21taXR0ZWQgY2hhbmdlcykuICovXG4gIGdldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpIHtcbiAgICByZXR1cm4gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcblxuICAgIHRoaXMub3ZlcndyaXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLnVwZGF0ZVBhdGNoID0ge307XG4gICAgdGhpcy5vcFRyYWNlLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5yZWRhY3RlZFBhdGhzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBvdmVyd3JpdGUgLyB1cGRhdGVzIC8gdHJhY2Uga2VlcGluZyBPTkxZIHBhdGhzIHdob3NlIGZpbmFsIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSB2YWx1ZSDigJQgaS5lLiB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlLiBTZWVcbiAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdH0gZm9yIHRoZSByYXRpb25hbGUuXG4gICAqXG4gICAqIFBhdGhzIGFyZSBjb21wYXJlZCBhdCB0aGUgZXhhY3QgZ3JhbnVsYXJpdHkgdGhleSB3ZXJlIHdyaXR0ZW4gKGVhY2ggdHJhY2VcbiAgICogZW50cnkncyBwYXRoKSwgYWdhaW5zdCBgd29ya2luZ0NvcHlgIChmaW5hbCkgdnMgYGJhc2VTbmFwc2hvdGAgKHN0YXJ0KS5cbiAgICogU3Vydml2aW5nIGBzZXRgIHBhdGhzIGNvcHkgdGhlaXIgZmluYWwgdmFsdWUgZnJvbSBgb3ZlcndyaXRlUGF0Y2hgO1xuICAgKiBzdXJ2aXZpbmcgYG1lcmdlYCBwYXRocyBjb3B5IHRoZWlyIGFjY3VtdWxhdGVkIGRlbHRhIGZyb20gYHVwZGF0ZVBhdGNoYCDigJRcbiAgICogcHJlc2VydmluZyB0aGUgc2V0LXZzLW1lcmdlIHZlcmIgc28gcmVwbGF5ICh7QGxpbmsgYXBwbHlTbWFydE1lcmdlfSkgaXNcbiAgICogYnl0ZS1mb3ItYnl0ZSBpZGVudGljYWwgdG8gcmVjb3JkaW5nIG9ubHkgdGhlIHJlYWwgY2hhbmdlcy5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgREVGQVVMVCAoYGNvbW1pdFZhbHVlczogJ2Z1bGwnYCkgcGF5bG9hZCDigJQgYnl0ZS1pZGVudGljYWwgdG9cbiAgICogdGhlIGhpc3RvcmljYWwgYmVoYXZpb3IsIGluY2x1ZGluZyBmbGF0dGVuaW5nIHN0YWdlZCBgZGVsZXRlYCBvcHMgaW50b1xuICAgKiBgc2V0YC1vZi1gdW5kZWZpbmVkYCB0cmFjZSBlbnRyaWVzLiBUaGUgZGVsdGEgZW5jb2RpbmcgbGl2ZXMgaW5cbiAgICoge0BsaW5rIHRvRGVsdGFQYXlsb2FkfS5cbiAgICovXG4gIHByaXZhdGUgdG9DaGFuZ2VPbmx5UGF5bG9hZCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoID0ge307XG4gICAgY29uc3QgdXBkYXRlczogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgICBjb25zdCB0cmFjZTogVHJhY2VFbnRyeVtdID0gW107XG4gICAgY29uc3Qgc3Vydml2aW5nUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIGlmIChkZWVwRXF1YWwoYmVmb3JlLCBhZnRlcikpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICAvLyBIaXN0b3JpY2FsIGZsYXR0ZW5pbmc6IGFuIGV4cGxpY2l0IGRlbGV0ZSBjb21taXRzIGFzIHNldC1vZi11bmRlZmluZWQuXG4gICAgICB0cmFjZS5wdXNoKG9wLnZlcmIgPT09ICdkZWxldGUnID8geyBwYXRoOiBvcC5wYXRoLCB2ZXJiOiAnc2V0JyB9IDogb3ApO1xuICAgICAgc3Vydml2aW5nUGF0aHMuYWRkKG9wLnBhdGgpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0KFsuLi50aGlzLnJlZGFjdGVkUGF0aHNdLmZpbHRlcigocGF0aCkgPT4gc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSk7XG4gICAgcmV0dXJuIHsgb3ZlcndyaXRlLCB1cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0d28gZW5jb2RpbmcgZGlmZmVyZW5jZXM6XG4gICAqXG4gICAqIDEuICoqT25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCoqICh0aGUgwqcyLjUgZGVkdXAgcnVsZSDigJQgYGFwcGVuZGBcbiAgICogICAgaXMgTk9UIGlkZW1wb3RlbnQgb24gcmVwbGF5LCBzbyBkdXBsaWNhdGUgZW50cmllcyB3b3VsZCBtdWx0aXBseVxuICAgKiAgICB0YWlscykuIFRoZSB2ZXJiIGlzIHJlc29sdmVkIGZyb20gdGhlIHBhdGgncyBvcCBtaXggKyBiYXNl4oaSZmluYWxcbiAgICogICAgcmVsYXRpb25zaGlwOyBlbnRyaWVzIGFyZSBvcmRlcmVkIGJ5IGVhY2ggcGF0aCdzIExBU1QgdG91Y2gsXG4gICAqICAgIHByZXNlcnZpbmcgbGFzdC13cml0ZXItd2lucyBmb3IgbmVzdGVkL292ZXJsYXBwaW5nIHBhdGhzLlxuICAgKiAyLiAqKlZlcmIgcmVzb2x1dGlvbiBwZXIgcGF0aCoqOlxuICAgKiAgICAtIGxhc3Qgb3AgYCdkZWxldGUnYCBBTkQgZmluYWwgdmFsdWUgZ29uZSDihpIgYGRlbGV0ZWAgKHRoZSBwYXRoIHN0YXlzXG4gICAqICAgICAgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYCB3aXRoIGB1bmRlZmluZWRgIGZvciBrZXktc2V0IGNvbnN1bWVycyk7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YSAocmVwbGF5aW5nIHRoZSBhY2N1bXVsYXRlZCBkZWx0YSBvbmNlIOKJoSB0aGUgZnVsbCBtb2RlJ3NcbiAgICogICAgICBrIHNlcXVlbnRpYWwgcmVwbGF5cyDigJQgYGRlZXBTbWFydE1lcmdlYCBpcyByZWZlcmVuY2UtaWRlbXBvdGVudFxuICAgKiAgICAgIHdpdGhpbiBvbmUgcmVwbGF5IHBhc3MpO1xuICAgKiAgICAtIG90aGVyd2lzZSAoYHNldGAvbWl4ZWQpOiB0aGUgY29tbWl0dGVkIHZhbHVlIGlzIGNvbXB1dGVkIGJ5XG4gICAqICAgICAgcmVwbGF5aW5nIHRoZSBwYXRoJ3Mgb3Agc2VxdWVuY2UgRVhBQ1RMWSB0aGUgd2F5IGBhcHBseVNtYXJ0TWVyZ2VgXG4gICAqICAgICAgcmVwbGF5cyB0aGUgZnVsbC1tb2RlIGJ1bmRsZSAoe0BsaW5rIHJlcGxheVBhdGhWZXJic30pIOKAlCBmb3JcbiAgICogICAgICBwdXJlLXNldCBwYXRocyB0aGF0IGlzIHNpbXBseSB0aGUgbGFzdCBzZXQgdmFsdWU7IGZvciBtaXhlZFxuICAgKiAgICAgIHNldCttZXJnZSBpbnRlcmxlYXZpbmdzIGl0IHJlcHJvZHVjZXMgdGhlIGZ1bGwgbW9kZSdzIHF1aXJrIG9mXG4gICAqICAgICAgYXBwbHlpbmcgdGhlIEFDQ1VNVUxBVEVEIG1lcmdlIGRlbHRhIGF0IGV2ZXJ5IG1lcmdlIHBvc2l0aW9uXG4gICAqICAgICAgKHdoaWNoIGNhbiBkaWZmZXIgZnJvbSB0aGUgYnVmZmVyJ3MgcmVhZC15b3VyLXdyaXRlcyB2aWV3OyBwYXJpdHlcbiAgICogICAgICB3aXRoIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgY29tbWl0dGVkIHN0YXRlIGlzIHRoZSBjb250cmFjdCkuIElmIGJhc2VcbiAgICogICAgICBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZCBiYXNlIGlzIGEgU1RSSUNUIFBSRUZJWCDihpIgYGFwcGVuZGBcbiAgICogICAgICBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGAgc3RvcmluZyB0aGUgZnVsbCB2YWx1ZS5cbiAgICpcbiAgICogTG9zc2xlc3NuZXNzIG5ldmVyIGRlcGVuZHMgb24gZGV0ZWN0aW9uIHN1Y2NlZWRpbmcg4oCUIGV2ZXJ5IGZhbGxiYWNrIGlzXG4gICAqIHRvZGF5J3MgZnVsbC12YWx1ZSBgc2V0YC5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKToge1xuICAgIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gICAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG4gICAgcmVkYWN0ZWRQYXRoczogU2V0PHN0cmluZz47XG4gICAgdHJhY2U6IFRyYWNlRW50cnlbXTtcbiAgfSB7XG4gICAgY29uc3Qgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXM6IE1lbW9yeVBhdGNoID0ge307XG4gICAgY29uc3QgdHJhY2U6IFRyYWNlRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IHN1cnZpdmluZ1BhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAvLyBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgK1xuICAgIC8vIHJlLWluc2VydCBtb3ZlcyBhIHJlLXRvdWNoZWQgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBNYXAncyBpbnNlcnRpb25cbiAgICAvLyBvcmRlciDigJQgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMpLlxuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBPcFZlcmJbXT4oKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnB1c2gob3AudmVyYik7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIFtvcC52ZXJiXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgdmVyYnNdIG9mIGJ5UGF0aCkge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KERFTElNKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBpZiAoZGVlcEVxdWFsKGJlZm9yZSwgYWZ0ZXIpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2UgKHNhbWUgZmlsdGVyIGFzICdmdWxsJylcblxuICAgICAgc3Vydml2aW5nUGF0aHMuYWRkKHBhdGgpO1xuICAgICAgY29uc3QgbGFzdFZlcmIgPSB2ZXJic1t2ZXJicy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0VmVyYiA9PT0gJ2RlbGV0ZScgJiYgYWZ0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBSZWFsIGRlbGV0aW9uIOKAlCByZXBsYXkgcmVtb3ZlcyB0aGUga2V5LiBLZWVwIHRoZSBwYXRoIGVudW1lcmF0ZWRcbiAgICAgICAgLy8gaW4gYG92ZXJ3cml0ZWAgKHVuZGVmaW5lZCkgc28gT2JqZWN0LmtleXMgY29uc3VtZXJzIHNlZSBpdC5cbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdkZWxldGUnIH0pO1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2UgaWYgKHZlcmJzLmV2ZXJ5KCh2KSA9PiB2ID09PSAnbWVyZ2UnKSkge1xuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ21lcmdlJyB9KTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDb21taXR0ZWQtZXF1aXZhbGVudCB2YWx1ZTogcmVwbGF5IHRoaXMgcGF0aCdzIG9wIHNlcXVlbmNlIHRoZSB3YXlcbiAgICAgICAgLy8gYXBwbHlTbWFydE1lcmdlIHJlcGxheXMgdGhlIEZVTEwtbW9kZSBidW5kbGUsIHNvIGJvdGggbW9kZXMgY29tbWl0XG4gICAgICAgIC8vIGJ5dGUtaWRlbnRpY2FsIHN0YXRlIChzZWUgdGhlIG1ldGhvZCBKU0RvYykuXG4gICAgICAgIGNvbnN0IGNvbW1pdHRlZCA9IHRoaXMucmVwbGF5UGF0aFZlcmJzKGJlZm9yZSwgc2VnbWVudHMsIHZlcmJzKTtcbiAgICAgICAgaWYgKGlzU3RyaWN0QXJyYXlQcmVmaXgoYmVmb3JlLCBjb21taXR0ZWQpKSB7XG4gICAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdhcHBlbmQnIH0pO1xuICAgICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKChjb21taXR0ZWQgYXMgdW5rbm93bltdKS5zbGljZSgoYmVmb3JlIGFzIHVua25vd25bXSkubGVuZ3RoKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JyB9KTtcbiAgICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShjb21taXR0ZWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0KFsuLi50aGlzLnJlZGFjdGVkUGF0aHNdLmZpbHRlcigocGF0aCkgPT4gc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSk7XG4gICAgcmV0dXJuIHsgb3ZlcndyaXRlLCB1cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheSBPTkUgcGF0aCdzIG9wLXZlcmIgc2VxdWVuY2UgYWdhaW5zdCBpdHMgYmFzZSB2YWx1ZSwgZXhhY3RseSB0aGVcbiAgICogd2F5IGBhcHBseVNtYXJ0TWVyZ2VgIHJlcGxheXMgdGhlIGNvcnJlc3BvbmRpbmcgZnVsbC1tb2RlIGJ1bmRsZTogZXZlcnlcbiAgICogYHNldGAvYGRlbGV0ZWAgcG9zaXRpb24gYXBwbGllcyB0aGUgTEFTVCBzdGFnZWQgb3ZlcndyaXRlIHZhbHVlICh0aGVcbiAgICogYmFnIGhvbGRzIG9uZSB2YWx1ZSBwZXIgcGF0aCDigJQgbGFzdCB3cml0ZXIgd2lucyksIGV2ZXJ5IGBtZXJnZWBcbiAgICogcG9zaXRpb24gYXBwbGllcyB0aGUgQUNDVU1VTEFURUQgYHVwZGF0ZVBhdGNoYCBkZWx0YS4gVGhpcyByZXByb2R1Y2VzXG4gICAqIHRoZSBmdWxsIG1vZGUncyBjb21taXR0ZWQgdmFsdWUgZm9yIGFueSBpbnRlcmxlYXZpbmcg4oCUIGluY2x1ZGluZyB0aGVcbiAgICogbWl4ZWQgc2V0K21lcmdlIHF1aXJrIHdoZXJlIHRoZSBhY2N1bXVsYXRlZCBkZWx0YSByZS1hcHBsaWVzIHByZS1zZXRcbiAgICogbWVyZ2Uga2V5cyAoZnVsbC1tb2RlIHJlcGxheSBzZW1hbnRpY3MsIGtlcHQgZm9yIGJ5dGUtcGFyaXR5IGFjcm9zc1xuICAgKiBtb2RlczsgcHJvcGVydHktdGVzdGVkIGluIGRlbHRhLXJlcGxheS1lcXVpdmFsZW5jZSkuXG4gICAqL1xuICBwcml2YXRlIHJlcGxheVBhdGhWZXJicyhiZWZvcmU6IHVua25vd24sIHNlZ21lbnRzOiBzdHJpbmdbXSwgdmVyYnM6IE9wVmVyYltdKTogdW5rbm93biB7XG4gICAgY29uc3Qgc2V0VmFsdWUgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBjb25zdCBtZXJnZURlbHRhID0gX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cyk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gYmVmb3JlO1xuICAgIGZvciAoY29uc3QgdmVyYiBvZiB2ZXJicykge1xuICAgICAgdmFsdWUgPSB2ZXJiID09PSAnbWVyZ2UnID8gZGVlcFNtYXJ0TWVyZ2UodmFsdWUgPz8ge30sIG1lcmdlRGVsdGEpIDogc2V0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEFwcGVuZC1kZXRlY3Rpb24gcHJlZGljYXRlICgjMTNjLUIgwqcyLjIpOiBib3RoIHZhbHVlcyBhcmUgYXJyYXlzLCB0aGVcbiAqIGZpbmFsIGlzIHN0cmljdGx5IGxvbmdlciwgYW5kIHRoZSBiYXNlIGlzIGEgc3RydWN0dXJhbCBwcmVmaXggb2YgdGhlXG4gKiBmaW5hbC4gRWxlbWVudCBjb21wYXJlcyBzaG9ydC1jaXJjdWl0IG9uIHJlZmVyZW5jZSBpZGVudGl0eSAoYGRlZXBFcXVhbGAnc1xuICogYD09PWAgZmFzdCBwYXRoKSBiZWZvcmUgd2Fsa2luZyBzdHJ1Y3R1cmUsIGFuZCBiYWlsIGF0IHRoZSBmaXJzdCBtaXNtYXRjaFxuICog4oCUIHdvcnN0IGNhc2Ugb25lIHN0cnVjdHVyYWwgY29tcGFyZSBvZiB0aGUgYmFzZSBhcnJheSwgc3RyaWN0bHkgY2hlYXBlclxuICogdGhhbiB0aGUgZnVsbC12YWx1ZSBgc3RydWN0dXJlZENsb25lYCB0aGUgZmFsbGJhY2sgcGF5cy5cbiAqXG4gKiBgYmVmb3JlID09PSB1bmRlZmluZWRgIChmaXJzdCB3cml0ZSkgZmFpbHMgYEFycmF5LmlzQXJyYXlgIOKGkiBgc2V0YCwgd2hpY2hcbiAqIGtlZXBzIHRoZSBmaXJzdCB3cml0ZSBhcyB0aGUgY2F1c2FsIGFuY2hvciBmb3IgXCJ3aG8gaW5pdGlhbGl6ZWQgdGhpcyBrZXlcIi5cbiAqL1xuZnVuY3Rpb24gaXNTdHJpY3RBcnJheVByZWZpeChiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKTogYmVmb3JlIGlzIHVua25vd25bXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShiZWZvcmUpIHx8ICFBcnJheS5pc0FycmF5KGFmdGVyKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYWZ0ZXIubGVuZ3RoIDw9IGJlZm9yZS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiZWZvcmUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWRlZXBFcXVhbChiZWZvcmVbaV0sIGFmdGVyW2ldKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl19
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
* These helpers provide type-safe queries without (b: any) casts.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.findLastWriter = exports.findCommits = exports.findCommit = void 0;
|
|
9
|
+
exports.commitValueAt = exports.findLastWriter = exports.findCommits = exports.findCommit = void 0;
|
|
10
|
+
const pathOps_js_1 = require("./pathOps.js");
|
|
11
|
+
const utils_js_1 = require("./utils.js");
|
|
10
12
|
/** Find the first commit by stageId, optionally filtering by a written key. */
|
|
11
13
|
function findCommit(commitLog, stageId, key) {
|
|
12
14
|
return commitLog.find((b) => b.stageId === stageId && (!key || b.trace.some((t) => t.path === key)));
|
|
@@ -28,4 +30,73 @@ function findLastWriter(commitLog, key, beforeIdx) {
|
|
|
28
30
|
return undefined;
|
|
29
31
|
}
|
|
30
32
|
exports.findLastWriter = findLastWriter;
|
|
31
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Reconstruct the FULL value of `key` as of commit array index `idx`
|
|
35
|
+
* (inclusive) — the migration helper for the "read `bundle.overwrite[key]`
|
|
36
|
+
* as the full value written" pattern (#13c-B).
|
|
37
|
+
*
|
|
38
|
+
* Under `commitValues: 'delta'`, an `append` bundle's `overwrite[key]` holds
|
|
39
|
+
* only the TAIL of the array; this helper folds the verbs back together:
|
|
40
|
+
* it scans `commitLog[0..idx]` for trace entries on `key`, anchors at the
|
|
41
|
+
* latest full-value write (`set` — or `delete`, which resets to absent), and
|
|
42
|
+
* replays forward (`append` → concat, `merge` → `deepSmartMerge`) — exactly
|
|
43
|
+
* the per-key slice of `applySmartMerge`'s replay, O(key's commit span)
|
|
44
|
+
* instead of a full `materialise()`.
|
|
45
|
+
*
|
|
46
|
+
* Works on full-mode logs too (every `set` is its own anchor — equivalent to
|
|
47
|
+
* `findLastWriter(...).overwrite[key]`).
|
|
48
|
+
*
|
|
49
|
+
* @param key Matched against `TraceEntry.path` exactly (same contract as
|
|
50
|
+
* `findLastWriter`) — DELIM-joined for nested paths.
|
|
51
|
+
* @param idx CommitBundle ARRAY index (the `bundle.idx` position),
|
|
52
|
+
* inclusive. NOT the executionIndex from a runtimeStageId.
|
|
53
|
+
* @returns The reconstructed value (a detached clone), or `undefined` when
|
|
54
|
+
* the key was never written in `commitLog[0..idx]` or its last write was a
|
|
55
|
+
* delete. Caveat: values derived purely from the run's INITIAL state (no
|
|
56
|
+
* `set` anchor in the log — e.g. merges onto a seeded key) fold from
|
|
57
|
+
* absent; the commit log alone cannot see the pre-run base (the same blind
|
|
58
|
+
* spot `findLastWriter` has).
|
|
59
|
+
*/
|
|
60
|
+
function commitValueAt(commitLog, idx, key) {
|
|
61
|
+
const end = Math.min(idx, commitLog.length - 1);
|
|
62
|
+
const segs = key.split(utils_js_1.DELIM);
|
|
63
|
+
// Collect every trace entry touching the key (in order) up to `end`.
|
|
64
|
+
const touches = [];
|
|
65
|
+
for (let i = 0; i <= end; i++) {
|
|
66
|
+
for (const t of commitLog[i].trace) {
|
|
67
|
+
if (t.path === key)
|
|
68
|
+
touches.push({ verb: t.verb, bundle: commitLog[i] });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (touches.length === 0)
|
|
72
|
+
return undefined;
|
|
73
|
+
// Anchor at the latest entry that fully determines the value on its own.
|
|
74
|
+
let start = 0;
|
|
75
|
+
for (let i = touches.length - 1; i >= 0; i--) {
|
|
76
|
+
if (touches[i].verb === 'set' || touches[i].verb === 'delete') {
|
|
77
|
+
start = i;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Fold forward from the anchor — the per-key slice of applySmartMerge.
|
|
82
|
+
let value;
|
|
83
|
+
for (let i = start; i < touches.length; i++) {
|
|
84
|
+
const { verb, bundle } = touches[i];
|
|
85
|
+
if (verb === 'set') {
|
|
86
|
+
value = structuredClone((0, pathOps_js_1.nativeGet)(bundle.overwrite, segs));
|
|
87
|
+
}
|
|
88
|
+
else if (verb === 'delete') {
|
|
89
|
+
value = undefined;
|
|
90
|
+
}
|
|
91
|
+
else if (verb === 'append') {
|
|
92
|
+
const tail = structuredClone((0, pathOps_js_1.nativeGet)(bundle.overwrite, segs));
|
|
93
|
+
value = Array.isArray(value) && Array.isArray(tail) ? [...value, ...tail] : tail;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
value = (0, utils_js_1.deepSmartMerge)(value, structuredClone((0, pathOps_js_1.nativeGet)(bundle.updates, segs)));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
exports.commitValueAt = commitValueAt;
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVILDZDQUF5QztBQUV6Qyx5Q0FBbUQ7QUFFbkQsK0VBQStFO0FBQy9FLFNBQWdCLFVBQVUsQ0FBQyxTQUF5QixFQUFFLE9BQWUsRUFBRSxHQUFZO0lBQ2pGLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkcsQ0FBQztBQUZELGdDQUVDO0FBRUQsbUNBQW1DO0FBQ25DLFNBQWdCLFdBQVcsQ0FBQyxTQUF5QixFQUFFLE9BQWU7SUFDcEUsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFGRCxrQ0FFQztBQUVELHlFQUF5RTtBQUN6RSxTQUFnQixjQUFjLENBQUMsU0FBeUIsRUFBRSxHQUFXLEVBQUUsU0FBa0I7SUFDdkYsTUFBTSxHQUFHLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVB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RUFBRSxlQUFlLENBQUMsSUFBQSxzQkFBUyxFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBdENELHNDQXNDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZWQgdXRpbGl0aWVzIGZvciBxdWVyeWluZyB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBUaGUgY29tbWl0TG9nIGlzIGFuIG9yZGVyZWQgYXJyYXkgb2YgQ29tbWl0QnVuZGxlIOKAlCBvbmUgcGVyIHN0YWdlIGNvbW1pdC5cbiAqIFRoZXNlIGhlbHBlcnMgcHJvdmlkZSB0eXBlLXNhZmUgcXVlcmllcyB3aXRob3V0IChiOiBhbnkpIGNhc3RzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcFNtYXJ0TWVyZ2UsIERFTElNIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBGaW5kIHRoZSBmaXJzdCBjb21taXQgYnkgc3RhZ2VJZCwgb3B0aW9uYWxseSBmaWx0ZXJpbmcgYnkgYSB3cml0dGVuIGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0KGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIHN0YWdlSWQ6IHN0cmluZywga2V5Pzogc3RyaW5nKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbW1pdExvZy5maW5kKChiKSA9PiBiLnN0YWdlSWQgPT09IHN0YWdlSWQgJiYgKCFrZXkgfHwgYi50cmFjZS5zb21lKCh0KSA9PiB0LnBhdGggPT09IGtleSkpKTtcbn1cblxuLyoqIEZpbmQgYWxsIGNvbW1pdHMgYnkgc3RhZ2VJZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0cyhjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcpOiBDb21taXRCdW5kbGVbXSB7XG4gIHJldHVybiBjb21taXRMb2cuZmlsdGVyKChiKSA9PiBiLnN0YWdlSWQgPT09IHN0YWdlSWQpO1xufVxuXG4vKiogRmluZCB0aGUgbGFzdCBjb21taXQgdGhhdCB3cm90ZSBhIHNwZWNpZmljIGtleSAoZm9yIGJhY2t0cmFja2luZykuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwga2V5OiBzdHJpbmcsIGJlZm9yZUlkeD86IG51bWJlcik6IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVuZCA9IGJlZm9yZUlkeCA/PyBjb21taXRMb2cubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gZW5kIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoY29tbWl0TG9nW2ldLnRyYWNlLnNvbWUoKHQpID0+IHQucGF0aCA9PT0ga2V5KSkge1xuICAgICAgcmV0dXJuIGNvbW1pdExvZ1tpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWNvbnN0cnVjdCB0aGUgRlVMTCB2YWx1ZSBvZiBga2V5YCBhcyBvZiBjb21taXQgYXJyYXkgaW5kZXggYGlkeGBcbiAqIChpbmNsdXNpdmUpIOKAlCB0aGUgbWlncmF0aW9uIGhlbHBlciBmb3IgdGhlIFwicmVhZCBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYFxuICogYXMgdGhlIGZ1bGwgdmFsdWUgd3JpdHRlblwiIHBhdHRlcm4gKCMxM2MtQikuXG4gKlxuICogVW5kZXIgYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsIGFuIGBhcHBlbmRgIGJ1bmRsZSdzIGBvdmVyd3JpdGVba2V5XWAgaG9sZHNcbiAqIG9ubHkgdGhlIFRBSUwgb2YgdGhlIGFycmF5OyB0aGlzIGhlbHBlciBmb2xkcyB0aGUgdmVyYnMgYmFjayB0b2dldGhlcjpcbiAqIGl0IHNjYW5zIGBjb21taXRMb2dbMC4uaWR4XWAgZm9yIHRyYWNlIGVudHJpZXMgb24gYGtleWAsIGFuY2hvcnMgYXQgdGhlXG4gKiBsYXRlc3QgZnVsbC12YWx1ZSB3cml0ZSAoYHNldGAg4oCUIG9yIGBkZWxldGVgLCB3aGljaCByZXNldHMgdG8gYWJzZW50KSwgYW5kXG4gKiByZXBsYXlzIGZvcndhcmQgKGBhcHBlbmRgIOKGkiBjb25jYXQsIGBtZXJnZWAg4oaSIGBkZWVwU21hcnRNZXJnZWApIOKAlCBleGFjdGx5XG4gKiB0aGUgcGVyLWtleSBzbGljZSBvZiBgYXBwbHlTbWFydE1lcmdlYCdzIHJlcGxheSwgTyhrZXkncyBjb21taXQgc3BhbilcbiAqIGluc3RlYWQgb2YgYSBmdWxsIGBtYXRlcmlhbGlzZSgpYC5cbiAqXG4gKiBXb3JrcyBvbiBmdWxsLW1vZGUgbG9ncyB0b28gKGV2ZXJ5IGBzZXRgIGlzIGl0cyBvd24gYW5jaG9yIOKAlCBlcXVpdmFsZW50IHRvXG4gKiBgZmluZExhc3RXcml0ZXIoLi4uKS5vdmVyd3JpdGVba2V5XWApLlxuICpcbiAqIEBwYXJhbSBrZXkgIE1hdGNoZWQgYWdhaW5zdCBgVHJhY2VFbnRyeS5wYXRoYCBleGFjdGx5IChzYW1lIGNvbnRyYWN0IGFzXG4gKiAgIGBmaW5kTGFzdFdyaXRlcmApIOKAlCBERUxJTS1qb2luZWQgZm9yIG5lc3RlZCBwYXRocy5cbiAqIEBwYXJhbSBpZHggIENvbW1pdEJ1bmRsZSBBUlJBWSBpbmRleCAodGhlIGBidW5kbGUuaWR4YCBwb3NpdGlvbiksXG4gKiAgIGluY2x1c2l2ZS4gTk9UIHRoZSBleGVjdXRpb25JbmRleCBmcm9tIGEgcnVudGltZVN0YWdlSWQuXG4gKiBAcmV0dXJucyBUaGUgcmVjb25zdHJ1Y3RlZCB2YWx1ZSAoYSBkZXRhY2hlZCBjbG9uZSksIG9yIGB1bmRlZmluZWRgIHdoZW5cbiAqICAgdGhlIGtleSB3YXMgbmV2ZXIgd3JpdHRlbiBpbiBgY29tbWl0TG9nWzAuLmlkeF1gIG9yIGl0cyBsYXN0IHdyaXRlIHdhcyBhXG4gKiAgIGRlbGV0ZS4gQ2F2ZWF0OiB2YWx1ZXMgZGVyaXZlZCBwdXJlbHkgZnJvbSB0aGUgcnVuJ3MgSU5JVElBTCBzdGF0ZSAobm9cbiAqICAgYHNldGAgYW5jaG9yIGluIHRoZSBsb2cg4oCUIGUuZy4gbWVyZ2VzIG9udG8gYSBzZWVkZWQga2V5KSBmb2xkIGZyb21cbiAqICAgYWJzZW50OyB0aGUgY29tbWl0IGxvZyBhbG9uZSBjYW5ub3Qgc2VlIHRoZSBwcmUtcnVuIGJhc2UgKHRoZSBzYW1lIGJsaW5kXG4gKiAgIHNwb3QgYGZpbmRMYXN0V3JpdGVyYCBoYXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0VmFsdWVBdChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBpZHg6IG51bWJlciwga2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oaWR4LCBjb21taXRMb2cubGVuZ3RoIC0gMSk7XG4gIGNvbnN0IHNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuXG4gIC8vIENvbGxlY3QgZXZlcnkgdHJhY2UgZW50cnkgdG91Y2hpbmcgdGhlIGtleSAoaW4gb3JkZXIpIHVwIHRvIGBlbmRgLlxuICBjb25zdCB0b3VjaGVzOiB7IHZlcmI6IHN0cmluZzsgYnVuZGxlOiBDb21taXRCdW5kbGUgfVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgZm9yIChjb25zdCB0IG9mIGNvbW1pdExvZ1tpXS50cmFjZSkge1xuICAgICAgaWYgKHQucGF0aCA9PT0ga2V5KSB0b3VjaGVzLnB1c2goeyB2ZXJiOiB0LnZlcmIsIGJ1bmRsZTogY29tbWl0TG9nW2ldIH0pO1xuICAgIH1cbiAgfVxuICBpZiAodG91Y2hlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gQW5jaG9yIGF0IHRoZSBsYXRlc3QgZW50cnkgdGhhdCBmdWxseSBkZXRlcm1pbmVzIHRoZSB2YWx1ZSBvbiBpdHMgb3duLlxuICBsZXQgc3RhcnQgPSAwO1xuICBmb3IgKGxldCBpID0gdG91Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmICh0b3VjaGVzW2ldLnZlcmIgPT09ICdzZXQnIHx8IHRvdWNoZXNbaV0udmVyYiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvbGQgZm9yd2FyZCBmcm9tIHRoZSBhbmNob3Ig4oCUIHRoZSBwZXIta2V5IHNsaWNlIG9mIGFwcGx5U21hcnRNZXJnZS5cbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgeyB2ZXJiLCBidW5kbGUgfSA9IHRvdWNoZXNbaV07XG4gICAgaWYgKHZlcmIgPT09ICdzZXQnKSB7XG4gICAgICB2YWx1ZSA9IHN0cnVjdHVyZWRDbG9uZShuYXRpdmVHZXQoYnVuZGxlLm92ZXJ3cml0ZSwgc2VncykpO1xuICAgIH0gZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodmVyYiA9PT0gJ2FwcGVuZCcpIHtcbiAgICAgIGNvbnN0IHRhaWwgPSBzdHJ1Y3R1cmVkQ2xvbmUobmF0aXZlR2V0KGJ1bmRsZS5vdmVyd3JpdGUsIHNlZ3MpKTtcbiAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh0YWlsKSA/IFsuLi52YWx1ZSwgLi4udGFpbF0gOiB0YWlsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGRlZXBTbWFydE1lcmdlKHZhbHVlLCBzdHJ1Y3R1cmVkQ2xvbmUobmF0aXZlR2V0KGJ1bmRsZS51cGRhdGVzLCBzZWdzKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG4iXX0=
|
package/dist/lib/memory/index.js
CHANGED
|
@@ -34,4 +34,4 @@ Object.defineProperty(exports, "redactPatch", { enumerable: true, get: function
|
|
|
34
34
|
Object.defineProperty(exports, "setNestedValue", { enumerable: true, get: function () { return utils_js_1.setNestedValue; } });
|
|
35
35
|
Object.defineProperty(exports, "updateNestedValue", { enumerable: true, get: function () { return utils_js_1.updateNestedValue; } });
|
|
36
36
|
Object.defineProperty(exports, "updateValue", { enumerable: true, get: function () { return utils_js_1.updateValue; } });
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQTBCO0FBQzFCOzs7OztHQUtHOzs7QUFFSCxVQUFVO0FBQ1YsbUVBQStEO0FBQXRELDZIQUFBLG1CQUFtQixPQUFBO0FBQzVCLDZDQUF5QztBQUFoQyx1R0FBQSxRQUFRLE9BQUE7QUFDakIscURBQWlEO0FBQXhDLCtHQUFBLFlBQVksT0FBQTtBQUNyQixxREFBaUQ7QUFBeEMsK0dBQUEsWUFBWSxPQUFBO0FBQ3JCLCtEQUEyRDtBQUFsRCx5SEFBQSxpQkFBaUIsT0FBQTtBQWtCMUIsdUNBQXlFO0FBQWhFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsa0hBQUEsc0JBQXNCLE9BQUE7QUFFcEQsWUFBWTtBQUNaLHVDQVdvQjtBQVZsQiwyR0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxjQUFjLE9BQUE7QUFDZCxpR0FBQSxLQUFLLE9BQUE7QUFDTCwwR0FBQSxjQUFjLE9BQUE7QUFDZCxnSEFBQSxvQkFBb0IsT0FBQTtBQUNwQix5R0FBQSxhQUFhLE9BQUE7QUFDYix1R0FBQSxXQUFXLE9BQUE7QUFDWCwwR0FBQSxjQUFjLE9BQUE7QUFDZCw2R0FBQSxpQkFBaUIsT0FBQTtBQUNqQix1R0FBQSxXQUFXLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuLyoqXG4gKiBtZW1vcnkvIOKAlCBGb3VuZGF0aW9uIGxpYnJhcnkgKHplcm8gZXh0ZXJuYWwgZGVwcylcbiAqXG4gKiBUcmFuc2FjdGlvbmFsIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICogYXRvbWljIGNvbW1pdHMsIGFuZCBldmVudC1zb3VyY2VkIHRpbWUtdHJhdmVsLlxuICovXG5cbi8vIENsYXNzZXNcbmV4cG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmV4cG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbmV4cG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5cbi8vIFR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEJ1bmRsZSxcbiAgQ29tbWl0VmFsdWVzTW9kZSxcbiAgRmxvd0NvbnRyb2xUeXBlLFxuICBGbG93TWVzc2FnZSxcbiAgTWVtb3J5UGF0Y2gsXG4gIFJlYWRTdW1tYXJ5TWFya2VyLFxuICBSZWFkVHJhY2tpbmdNb2RlLFxuICBSZXRlbnRpb25Qb2xpY3ksXG4gIFNjb3BlRmFjdG9yeSxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgVHJhY2VFbnRyeSxcbiAgV3JpdGVTdW1tYXJ5TWFya2VyLFxuICBXcml0ZVRyYWNraW5nTW9kZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgeyBSRUFEX1BSRVZJRVdfTEVOR1RILCBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFV0aWxpdGllc1xuZXhwb3J0IHtcbiAgYXBwbHlTbWFydE1lcmdlLFxuICBkZWVwU21hcnRNZXJnZSxcbiAgREVMSU0sXG4gIGdldE5lc3RlZFZhbHVlLFxuICBnZXRSdW5BbmRHbG9iYWxQYXRocyxcbiAgbm9ybWFsaXNlUGF0aCxcbiAgcmVkYWN0UGF0Y2gsXG4gIHNldE5lc3RlZFZhbHVlLFxuICB1cGRhdGVOZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlVmFsdWUsXG59IGZyb20gJy4vdXRpbHMuanMnO1xuIl19
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
24
24
|
*/
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.mergeContextWins = exports.nativeHas = exports.nativeSet = exports.nativeGet = void 0;
|
|
26
|
+
exports.mergeContextWins = exports.nativeHas = exports.nativeDelete = exports.nativeSet = exports.nativeGet = void 0;
|
|
27
27
|
const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
|
|
28
28
|
function toSegments(path) {
|
|
29
29
|
return Array.isArray(path) ? path : path.split('.');
|
|
@@ -71,6 +71,34 @@ function nativeSet(obj, path, value) {
|
|
|
71
71
|
return obj;
|
|
72
72
|
}
|
|
73
73
|
exports.nativeSet = nativeSet;
|
|
74
|
+
/**
|
|
75
|
+
* Remove the own property at `path` in `obj` (the replay primitive for the
|
|
76
|
+
* `delete` commit verb, #13c-B). No-op when any intermediate segment is
|
|
77
|
+
* missing — deleting an absent key has nothing to remove.
|
|
78
|
+
*
|
|
79
|
+
* Security: same DENIED + hasOwnProperty discipline as nativeGet — every
|
|
80
|
+
* segment is checked, so `nativeDelete(obj, '__proto__x')` and
|
|
81
|
+
* prototype-chain walks are inert.
|
|
82
|
+
*/
|
|
83
|
+
function nativeDelete(obj, path) {
|
|
84
|
+
const segs = toSegments(path);
|
|
85
|
+
let curr = obj;
|
|
86
|
+
for (let i = 0; i < segs.length - 1; i++) {
|
|
87
|
+
const seg = segs[i];
|
|
88
|
+
if (DENIED.has(String(seg)))
|
|
89
|
+
return;
|
|
90
|
+
if (curr == null || typeof curr !== 'object' || !Object.prototype.hasOwnProperty.call(curr, seg))
|
|
91
|
+
return;
|
|
92
|
+
curr = curr[seg];
|
|
93
|
+
}
|
|
94
|
+
const last = segs[segs.length - 1];
|
|
95
|
+
if (DENIED.has(String(last)))
|
|
96
|
+
return;
|
|
97
|
+
if (curr != null && typeof curr === 'object') {
|
|
98
|
+
delete curr[last];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.nativeDelete = nativeDelete;
|
|
74
102
|
/** Returns true if `obj` has an own property at every segment of `path`. */
|
|
75
103
|
function nativeHas(obj, path) {
|
|
76
104
|
const segs = toSegments(path);
|
|
@@ -119,4 +147,4 @@ function mergeContextWins(dst, src) {
|
|
|
119
147
|
return out;
|
|
120
148
|
}
|
|
121
149
|
exports.mergeContextWins = mergeContextWins;
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHOzs7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSxTQUFTLFVBQVUsQ0FBQyxJQUFrQztJQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQzFFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJ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QUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLHlEQUF5RDtZQUN6RCxJQUNFLE1BQU0sS0FBSyxJQUFJO2dCQUNmLE9BQU8sTUFBTSxLQUFLLFFBQVE7Z0JBQzFCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJO2dCQUNqQixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRO2dCQUM1QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ3hCLENBQUM7Z0JBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsNkJBQTZCO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQTFCRCw0Q0EwQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFNlY3VyaXR5IGNvbnRyYWN0OiBhbGwgZnVuY3Rpb25zIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlLXBvbGx1dGlvbiBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbi1yZWFkIGF0dGFja3MuIFRoZSBERU5JRUQgc2V0IGJsb2NrcyB0aGUgdGhyZWUgY2Fub25pY2FsXG4gKiBwb2xsdXRpb24gdmVjdG9ycyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKSBvbiBldmVyeSBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0ICDigJQgREVOSUVEIGNoZWNrIG9ubHkgYXQgZWFjaCBzZWdtZW50LiBObyBoYXNPd25Qcm9wZXJ0eVxuICogICAgIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHdyaXRpbmcgYWx3YXlzIGNyZWF0ZXMgYW4gT1dOIHByb3BlcnR5IG9uIGBjdXJyYCxcbiAqICAgICB3aGljaCBjYW5ub3QgcG9sbHV0ZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogICAtIG5hdGl2ZUdldCAvIG5hdGl2ZUhhcyDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgICBSZWFkcyBmb2xsb3cgdGhlIHByb3RvdHlwZSBjaGFpbiBieSBkZWZhdWx0IChicmFja2V0IG5vdGF0aW9uKSwgc28gdGhlXG4gKiAgICAgaGFzT3duUHJvcGVydHkgZ3VhcmQgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsZWFraW5nIGluaGVyaXRlZCB2YWx1ZXNcbiAqICAgICAoZS5nLiBPYmplY3QucHJvdG90eXBlLCBPYmplY3QgY29uc3RydWN0b3IsIHRvU3RyaW5nKS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBEbyBOT1QgXCJmaXhcIiB0aGUgbmF0aXZlU2V0IGFzeW1tZXRyeSBieSBhZGRpbmcgaGFzT3duUHJvcGVydHkg4oCUIGl0IGlzXG4gKiBpbnRlbnRpb25hbCBhbmQgd291bGQgYnJlYWsgcGF0aCBjcmVhdGlvbiBmb3IgbmV3IGludGVybWVkaWF0ZSBub2Rlcy5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBoYXMgYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHNlZ21lbnQgb2YgYHBhdGhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUhhcyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWdzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpIDwgc2Vncy5sZW5ndGggLSAxKSBjdXJyID0gY3VycltzZWdzW2ldXTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIG1lcmdlIHdoZXJlIGRlc3RpbmF0aW9uIHdpbnMgZm9yIGFueSBkZWZpbmVkIHZhbHVlLlxuICogRmlsbHMgbWlzc2luZyBrZXlzIGZyb20gYHNyY2AsIGJ1dCBuZXZlciBvdmVyd3JpdGVzIGRlZmluZWQga2V5cyBpbiBgZHN0YC5cbiAqIEFycmF5cyBhcmUgbm90IHJlY3Vyc2VkIOKAlCBkc3QgYXJyYXkgYWx3YXlzIHdpbnMgd2hlbiBwcmVzZW50LlxuICpcbiAqIFJlcGxhY2VzOiBgbWVyZ2VXaXRoKGRzdCwgc3JjLCAob2JqVmFsdWUpID0+IG9ialZhbHVlICE9PSB1bmRlZmluZWQgPyBvYmpWYWx1ZSA6IHVuZGVmaW5lZClgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnRleHRXaW5zKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHJldHVybiBkc3QgIT09IHVuZGVmaW5lZCA/IGRzdCA6IHNyYztcbiAgfVxuICBjb25zdCBvdXQ6IGFueSA9IGRzdCAhPSBudWxsICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8geyAuLi5kc3QgfSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgaWYgKERFTklFRC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgZHN0VmFsID0gb3V0W2tleV07XG4gICAgaWYgKGRzdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkc3Qgd2luczsgcmVjdXJzZSBvbmx5IGlmIGJvdGggc2lkZXMgYXJlIHBsYWluIG9iamVjdHNcbiAgICAgIGlmIChcbiAgICAgICAgZHN0VmFsICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBkc3RWYWwgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRzdFZhbCkgJiZcbiAgICAgICAgc3JjW2tleV0gIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNyY1trZXldID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShzcmNba2V5XSlcbiAgICAgICkge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQ29udGV4dFdpbnMoZHN0VmFsLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGtlZXAgZHN0VmFsIHVuY2hhbmdlZFxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHOzs7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSxTQUFTLFVBQVUsQ0FBQyxJQUFrQztJQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQzFFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJ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QztZQUN6Qix5REFBeUQ7WUFDekQsSUFDRSxNQUFNLEtBQUssSUFBSTtnQkFDZixPQUFPLE1BQU0sS0FBSyxRQUFRO2dCQUMxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSTtnQkFDakIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUExQkQsNENBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwYXRoT3BzLnRzIOKAlCBOYXRpdmUgbmVzdGVkLXBhdGggaGVscGVycyAocmVwbGFjZXMgbG9kYXNoLmdldC9zZXQvaGFzL21lcmdld2l0aClcbiAqXG4gKiBTZWN1cml0eSBjb250cmFjdDogYWxsIGZ1bmN0aW9ucyBndWFyZCBhZ2FpbnN0IHByb3RvdHlwZS1wb2xsdXRpb24gYW5kXG4gKiBwcm90b3R5cGUtY2hhaW4tcmVhZCBhdHRhY2tzLiBUaGUgREVOSUVEIHNldCBibG9ja3MgdGhlIHRocmVlIGNhbm9uaWNhbFxuICogcG9sbHV0aW9uIHZlY3RvcnMgKF9fcHJvdG9fXywgY29uc3RydWN0b3IsIHByb3RvdHlwZSkgb24gZXZlcnkgZnVuY3Rpb24uXG4gKlxuICogSW50ZW50aW9uYWwgYXN5bW1ldHJ5OlxuICogICAtIG5hdGl2ZVNldCAg4oCUIERFTklFRCBjaGVjayBvbmx5IGF0IGVhY2ggc2VnbWVudC4gTm8gaGFzT3duUHJvcGVydHlcbiAqICAgICBjaGVjayBpcyBuZWVkZWQgYmVjYXVzZSB3cml0aW5nIGFsd2F5cyBjcmVhdGVzIGFuIE9XTiBwcm9wZXJ0eSBvbiBgY3VycmAsXG4gKiAgICAgd2hpY2ggY2Fubm90IHBvbGx1dGUgdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAqICAgLSBuYXRpdmVHZXQgLyBuYXRpdmVIYXMg4oCUIERFTklFRCBjaGVjayArIGhhc093blByb3BlcnR5IGF0IGV2ZXJ5IHN0ZXAuXG4gKiAgICAgUmVhZHMgZm9sbG93IHRoZSBwcm90b3R5cGUgY2hhaW4gYnkgZGVmYXVsdCAoYnJhY2tldCBub3RhdGlvbiksIHNvIHRoZVxuICogICAgIGhhc093blByb3BlcnR5IGd1YXJkIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgbGVha2luZyBpbmhlcml0ZWQgdmFsdWVzXG4gKiAgICAgKGUuZy4gT2JqZWN0LnByb3RvdHlwZSwgT2JqZWN0IGNvbnN0cnVjdG9yLCB0b1N0cmluZykuXG4gKiAgIC0gbWVyZ2VDb250ZXh0V2lucyDigJQgREVOSUVEIGNoZWNrIG9ubHk7IE9iamVjdC5rZXlzKCkgaXMgb3duLWVudW1lcmFibGUtb25seVxuICogICAgIGJ5IHNwZWMgc28gcHJvdG90eXBlIGtleXMgbmV2ZXIgYXBwZWFyIGluIHRoZSBpdGVyYXRpb24uXG4gKlxuICogRG8gTk9UIFwiZml4XCIgdGhlIG5hdGl2ZVNldCBhc3ltbWV0cnkgYnkgYWRkaW5nIGhhc093blByb3BlcnR5IOKAlCBpdCBpc1xuICogaW50ZW50aW9uYWwgYW5kIHdvdWxkIGJyZWFrIHBhdGggY3JlYXRpb24gZm9yIG5ldyBpbnRlcm1lZGlhdGUgbm9kZXMuXG4gKlxuICogUGF0aHMgbWF5IGJlIGRvdC1ub3RhdGlvbiBzdHJpbmdzIG9yIHByZS1zcGxpdCAoc3RyaW5nfG51bWJlcilbXSBhcnJheXMuXG4gKi9cblxuY29uc3QgREVOSUVEID0gbmV3IFNldChbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXSk7XG5cbmZ1bmN0aW9uIHRvU2VnbWVudHMocGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLnNwbGl0KCcuJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBhdCBgcGF0aGAgaW4gYG9iamAsIHJldHVybmluZyBgZGVmYXVsdFZhbHVlYCBpZiBhYnNlbnQuXG4gKlxuICogU2VjdXJpdHk6IGVhY2ggcGF0aCBzZWdtZW50IGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgREVOSUVEIGxpc3QgYW5kIHJlcXVpcmVzXG4gKiBhbiBvd24gcHJvcGVydHkgYXQgZXZlcnkgc3RlcCwgcHJldmVudGluZyBwcm90b3R5cGUtY2hhaW4gcmVhZHMuXG4gKiBlLmcuIG5hdGl2ZUdldCh7fSwgJ19fcHJvdG9fXycpIGFuZCBuYXRpdmVHZXQoe30sICdjb25zdHJ1Y3RvcicpIGJvdGggcmV0dXJuXG4gKiBgZGVmYXVsdFZhbHVlYCBpbnN0ZWFkIG9mIGxlYWtpbmcgT2JqZWN0LnByb3RvdHlwZSAvIHRoZSBPYmplY3QgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVHZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2Vncykge1xuICAgIGlmIChjdXJyID09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKHNlZykpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgY3VyciA9IGN1cnJbc2VnXTtcbiAgfVxuICByZXR1cm4gY3VyciA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogY3Vycjtcbn1cblxuLyoqIE11dGF0ZSBgb2JqYCwgc2V0dGluZyBgdmFsdWVgIGF0IGBwYXRoYCAoY3JlYXRlcyBpbnRlcm1lZGlhdGUgb2JqZWN0cykuIFJldHVybnMgYG9iamAuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlU2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgayA9IHNlZ3NbaV07XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGspKSkgcmV0dXJuIG9iajtcbiAgICBpZiAoY3VycltrXSA9PSBudWxsIHx8IHR5cGVvZiBjdXJyW2tdICE9PSAnb2JqZWN0Jykge1xuICAgICAgY3VycltrXSA9IHR5cGVvZiBzZWdzW2kgKyAxXSA9PT0gJ251bWJlcicgPyBbXSA6IHt9O1xuICAgIH1cbiAgICBjdXJyID0gY3VycltrXTtcbiAgfVxuICBjb25zdCBsYXN0ID0gc2Vnc1tzZWdzLmxlbmd0aCAtIDFdO1xuICBpZiAoREVOSUVELmhhcyhTdHJpbmcobGFzdCkpKSByZXR1cm4gb2JqO1xuICBjdXJyW2xhc3RdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBvd24gcHJvcGVydHkgYXQgYHBhdGhgIGluIGBvYmpgICh0aGUgcmVwbGF5IHByaW1pdGl2ZSBmb3IgdGhlXG4gKiBgZGVsZXRlYCBjb21taXQgdmVyYiwgIzEzYy1CKS4gTm8tb3Agd2hlbiBhbnkgaW50ZXJtZWRpYXRlIHNlZ21lbnQgaXNcbiAqIG1pc3Npbmcg4oCUIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaGFzIG5vdGhpbmcgdG8gcmVtb3ZlLlxuICpcbiAqIFNlY3VyaXR5OiBzYW1lIERFTklFRCArIGhhc093blByb3BlcnR5IGRpc2NpcGxpbmUgYXMgbmF0aXZlR2V0IOKAlCBldmVyeVxuICogc2VnbWVudCBpcyBjaGVja2VkLCBzbyBgbmF0aXZlRGVsZXRlKG9iaiwgJ19fcHJvdG9fX1x1MDAxZngnKWAgYW5kXG4gKiBwcm90b3R5cGUtY2hhaW4gd2Fsa3MgYXJlIGluZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlRGVsZXRlKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHNlZyA9IHNlZ3NbaV07XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKHNlZykpKSByZXR1cm47XG4gICAgaWYgKGN1cnIgPT0gbnVsbCB8fCB0eXBlb2YgY3VyciAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm47XG4gICAgY3VyciA9IGN1cnJbc2VnXTtcbiAgfVxuICBjb25zdCBsYXN0ID0gc2Vnc1tzZWdzLmxlbmd0aCAtIDFdO1xuICBpZiAoREVOSUVELmhhcyhTdHJpbmcobGFzdCkpKSByZXR1cm47XG4gIGlmIChjdXJyICE9IG51bGwgJiYgdHlwZW9mIGN1cnIgPT09ICdvYmplY3QnKSB7XG4gICAgZGVsZXRlIGN1cnJbbGFzdF07XG4gIH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBoYXMgYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHNlZ21lbnQgb2YgYHBhdGhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUhhcyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWdzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpIDwgc2Vncy5sZW5ndGggLSAxKSBjdXJyID0gY3VycltzZWdzW2ldXTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIG1lcmdlIHdoZXJlIGRlc3RpbmF0aW9uIHdpbnMgZm9yIGFueSBkZWZpbmVkIHZhbHVlLlxuICogRmlsbHMgbWlzc2luZyBrZXlzIGZyb20gYHNyY2AsIGJ1dCBuZXZlciBvdmVyd3JpdGVzIGRlZmluZWQga2V5cyBpbiBgZHN0YC5cbiAqIEFycmF5cyBhcmUgbm90IHJlY3Vyc2VkIOKAlCBkc3QgYXJyYXkgYWx3YXlzIHdpbnMgd2hlbiBwcmVzZW50LlxuICpcbiAqIFJlcGxhY2VzOiBgbWVyZ2VXaXRoKGRzdCwgc3JjLCAob2JqVmFsdWUpID0+IG9ialZhbHVlICE9PSB1bmRlZmluZWQgPyBvYmpWYWx1ZSA6IHVuZGVmaW5lZClgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnRleHRXaW5zKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHJldHVybiBkc3QgIT09IHVuZGVmaW5lZCA/IGRzdCA6IHNyYztcbiAgfVxuICBjb25zdCBvdXQ6IGFueSA9IGRzdCAhPSBudWxsICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8geyAuLi5kc3QgfSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgaWYgKERFTklFRC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgZHN0VmFsID0gb3V0W2tleV07XG4gICAgaWYgKGRzdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkc3Qgd2luczsgcmVjdXJzZSBvbmx5IGlmIGJvdGggc2lkZXMgYXJlIHBsYWluIG9iamVjdHNcbiAgICAgIGlmIChcbiAgICAgICAgZHN0VmFsICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBkc3RWYWwgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRzdFZhbCkgJiZcbiAgICAgICAgc3JjW2tleV0gIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNyY1trZXldID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShzcmNba2V5XSlcbiAgICAgICkge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQ29udGV4dFdpbnMoZHN0VmFsLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGtlZXAgZHN0VmFsIHVuY2hhbmdlZFxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|