footprintjs 8.1.0 → 8.3.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 +3 -0
- package/dist/esm/lib/engine/handlers/NodeResolver.js +14 -4
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +137 -39
- package/dist/esm/lib/runner/FlowChartExecutor.js +110 -38
- package/dist/esm/lib/runner/checkpointSanitize.js +133 -0
- package/dist/lib/engine/handlers/NodeResolver.js +14 -4
- package/dist/lib/engine/traversal/FlowchartTraverser.js +137 -39
- package/dist/lib/runner/FlowChartExecutor.js +110 -38
- package/dist/lib/runner/checkpointSanitize.js +138 -0
- package/dist/types/lib/engine/handlers/NodeResolver.d.ts +9 -1
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +65 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +51 -0
- package/dist/types/lib/runner/checkpointSanitize.d.ts +44 -0
- package/package.json +6 -2
package/CLAUDE.md
CHANGED
|
@@ -176,6 +176,8 @@ if (executor.isPaused()) {
|
|
|
176
176
|
|
|
177
177
|
- `execute` returns data → pauses. Returns void → continues normally (conditional pause).
|
|
178
178
|
- Checkpoint is JSON-serializable — no functions, no class instances.
|
|
179
|
+
- Checkpoint is **deep-copied at creation** (one `structuredClone` of every field) — fully detached from engine state. Mutating a checkpoint you hold cannot corrupt the engine, and a same-executor resume cannot mutate a checkpoint you already persisted. `resume()` clones the checkpoint in too — the engine never holds a reference to your object.
|
|
180
|
+
- `getSnapshot().sharedState` is a zero-copy LIVE view in production — treat as read-only. Dev mode (`enableDevMode()`) returns a deep-frozen clone so consumer mutation throws.
|
|
179
181
|
- Checkpoints never capture recorder state: CROSS-executor resume (fresh executor from a stored checkpoint) starts with empty narrative — collect what you need before discarding the paused executor. SAME-executor resume preserves and accumulates narrative/recorder state (`preserveRecorders`). A fresh `runId` is generated for the resumed run either way.
|
|
180
182
|
- `FlowRecorder.onPause`/`onResume` and `Recorder.onPause`/`onResume` fire on both observer systems.
|
|
181
183
|
|
|
@@ -514,6 +516,7 @@ Gated diagnostics:
|
|
|
514
516
|
- **Empty-recorder warning** in `attachCombinedRecorder(r)` — catches `r` with no `on*` handler
|
|
515
517
|
- **Suspicious predicates** in `decide()` / `select()`
|
|
516
518
|
- **Snapshot integrity** in `getSubtreeSnapshot()`
|
|
519
|
+
- **Snapshot mutation guard** in `FlowChartExecutor.getSnapshot()` — `sharedState` becomes a deep-frozen CLONE (mutation throws); production returns the zero-copy live view (treat as read-only)
|
|
517
520
|
|
|
518
521
|
Convention: when adding a new dev-only check, gate on `isDevMode()` (from `scope/detectCircular.ts`). Do NOT use `process.env.NODE_ENV` inline — consumers control dev tooling centrally via `enableDevMode()`/`disableDevMode()`, and inline env checks break that contract.
|
|
519
522
|
|
|
@@ -9,9 +9,18 @@
|
|
|
9
9
|
export class NodeResolver {
|
|
10
10
|
deps;
|
|
11
11
|
nodeIdMap;
|
|
12
|
-
|
|
12
|
+
getEffectiveChildren;
|
|
13
|
+
constructor(deps, nodeIdMap,
|
|
14
|
+
/**
|
|
15
|
+
* Overlay-aware children accessor injected by the traverser. The DFS
|
|
16
|
+
* fallback resolves loop targets against the LIVE runtime shape — a node
|
|
17
|
+
* patched by a dynamic StageNode return carries its children in the
|
|
18
|
+
* traverser-local overlay, not on the shared built-chart node.
|
|
19
|
+
*/
|
|
20
|
+
getEffectiveChildren) {
|
|
13
21
|
this.deps = deps;
|
|
14
22
|
this.nodeIdMap = nodeIdMap ?? new Map();
|
|
23
|
+
this.getEffectiveChildren = getEffectiveChildren;
|
|
15
24
|
}
|
|
16
25
|
/**
|
|
17
26
|
* O(1) node lookup via pre-built ID map.
|
|
@@ -35,8 +44,9 @@ export class NodeResolver {
|
|
|
35
44
|
_dfs(nodeId, node) {
|
|
36
45
|
if (node.id === nodeId)
|
|
37
46
|
return node;
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
const children = this.getEffectiveChildren ? this.getEffectiveChildren(node) : node.children;
|
|
48
|
+
if (children) {
|
|
49
|
+
for (const child of children) {
|
|
40
50
|
const found = this._dfs(nodeId, child);
|
|
41
51
|
if (found)
|
|
42
52
|
return found;
|
|
@@ -87,4 +97,4 @@ export class NodeResolver {
|
|
|
87
97
|
};
|
|
88
98
|
}
|
|
89
99
|
}
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZVJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvTm9kZVJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFNSCxNQUFNLE9BQU8sWUFBWTtJQUtiO0lBSk8sU0FBUyxDQUF1QztJQUNoRCxvQkFBb0IsQ0FBNEU7SUFFakgsWUFDVSxJQUErQixFQUN2QyxTQUFnRDtJQUNoRDs7Ozs7T0FLRztJQUNILG9CQUErRjtRQVJ2RixTQUFJLEdBQUosSUFBSSxDQUEyQjtRQVV2QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxNQUFjLEVBQUUsU0FBbUM7UUFDOUQsa0ZBQWtGO1FBQ2xGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLElBQUksTUFBTTtnQkFBRSxPQUFPLE1BQU0sQ0FBQztRQUM1QixDQUFDO1FBRUQsK0VBQStFO1FBQy9FLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBNkI7UUFDeEQsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM3RixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsdUJBQXVCLENBQUMsSUFBNkI7UUFDbkQsMENBQTBDO1FBQzFDLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFeEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXJDLDJDQUEyQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBYSxDQUFDO1FBQzVGLElBQUksVUFBeUQsQ0FBQztRQUU5RCxLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNuQiw2Q0FBNkMsSUFBSSxDQUFDLElBQUksa0JBQWtCLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDaEcsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCwrRUFBK0U7UUFDL0UsdUVBQXVFO1FBQ3ZFLE9BQU87WUFDTCxHQUFHLFVBQVUsQ0FBQyxJQUFJO1lBQ2xCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEVBQUUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUNqQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7U0FDckYsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm9kZVJlc29sdmVyIOKAlCBERlMgbm9kZSBsb29rdXAgKyBzdWJmbG93IHJlZmVyZW5jZSByZXNvbHV0aW9uLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEZpbmQgbm9kZXMgYnkgSUQgdmlhIHJlY3Vyc2l2ZSBkZXB0aC1maXJzdCBzZWFyY2ggKGZvciBiYWNrLWVkZ2UvbG9vcCBzdXBwb3J0KVxuICogLSBSZXNvbHZlIHN1YmZsb3cgcmVmZXJlbmNlIG5vZGVzIHRvIGFjdHVhbCBzdWJmbG93IHN0cnVjdHVyZXNcbiAqIC0gRXZhbHVhdGUgZGVjaWRlcnMgdG8gZGV0ZXJtaW5lIG5leHQgbm9kZSBpbiBicmFuY2hpbmcgc2NlbmFyaW9zXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBOb2RlUmVzb2x2ZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZUlkTWFwOiBNYXA8c3RyaW5nLCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RWZmZWN0aXZlQ2hpbGRyZW4/OiAobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIG5vZGVJZE1hcD86IE1hcDxzdHJpbmcsIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PixcbiAgICAvKipcbiAgICAgKiBPdmVybGF5LWF3YXJlIGNoaWxkcmVuIGFjY2Vzc29yIGluamVjdGVkIGJ5IHRoZSB0cmF2ZXJzZXIuIFRoZSBERlNcbiAgICAgKiBmYWxsYmFjayByZXNvbHZlcyBsb29wIHRhcmdldHMgYWdhaW5zdCB0aGUgTElWRSBydW50aW1lIHNoYXBlIOKAlCBhIG5vZGVcbiAgICAgKiBwYXRjaGVkIGJ5IGEgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJuIGNhcnJpZXMgaXRzIGNoaWxkcmVuIGluIHRoZVxuICAgICAqIHRyYXZlcnNlci1sb2NhbCBvdmVybGF5LCBub3Qgb24gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlLlxuICAgICAqL1xuICAgIGdldEVmZmVjdGl2ZUNoaWxkcmVuPzogKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KSA9PiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICB0aGlzLm5vZGVJZE1hcCA9IG5vZGVJZE1hcCA/PyBuZXcgTWFwKCk7XG4gICAgdGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbiA9IGdldEVmZmVjdGl2ZUNoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIE8oMSkgbm9kZSBsb29rdXAgdmlhIHByZS1idWlsdCBJRCBtYXAuXG4gICAqIEZhbGxzIGJhY2sgdG8gREZTIGZyb20gc3RhcnROb2RlIChmb3IgZHluYW1pYyBub2RlcyBhZGRlZCBhdCBydW50aW1lXG4gICAqIG9yIHN1YmZsb3ctbG9jYWwgbG9va3VwcyB0aGF0IHVzZSBhbiBleHBsaWNpdCBzdGFydE5vZGUpLlxuICAgKi9cbiAgZmluZE5vZGVCeUlkKG5vZGVJZDogc3RyaW5nLCBzdGFydE5vZGU/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBGYXN0IHBhdGg6IE8oMSkgbWFwIGxvb2t1cCAob25seSB2YWxpZCBmb3Igcm9vdC1sZXZlbCBncmFwaCwgbm90IHN1YmZsb3ctbG9jYWwpXG4gICAgaWYgKCFzdGFydE5vZGUpIHtcbiAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubm9kZUlkTWFwLmdldChub2RlSWQpO1xuICAgICAgaWYgKG1hcHBlZCkgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogREZTIGZyb20gc3RhcnROb2RlIChzdWJmbG93LWxvY2FsIG9yIGR5bmFtaWMgbm9kZXMgbm90IGluIHRoZSBtYXApXG4gICAgcmV0dXJuIHRoaXMuX2Rmcyhub2RlSWQsIHN0YXJ0Tm9kZSA/PyB0aGlzLmRlcHMucm9vdCk7XG4gIH1cblxuICAvKipcbiAgICogREZTIHNlYXJjaCBmb3IgYSBub2RlIGJ5IElELlxuICAgKiBVc2VkIGFzIGZhbGxiYWNrIHdoZW4gdGhlIG5vZGUgaXMgbm90IGluIHRoZSBwcmUtYnVpbHQgbWFwLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGZzKG5vZGVJZDogc3RyaW5nLCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAobm9kZS5pZCA9PT0gbm9kZUlkKSByZXR1cm4gbm9kZTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbiA/IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4obm9kZSkgOiBub2RlLmNoaWxkcmVuO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX2Rmcyhub2RlSWQsIGNoaWxkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubmV4dCkge1xuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLl9kZnMobm9kZUlkLCBub2RlLm5leHQpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgc3ViZmxvdyByZWZlcmVuY2Ugbm9kZSB0byBpdHMgYWN0dWFsIHN0cnVjdHVyZS5cbiAgICpcbiAgICogUmVmZXJlbmNlIG5vZGVzIGFyZSBsaWdodHdlaWdodCBwbGFjZWhvbGRlcnMgKGlzU3ViZmxvd1Jvb3QgYnV0IG5vIGZuL2NoaWxkcmVuKS5cbiAgICogVGhlIGFjdHVhbCBzdHJ1Y3R1cmUgbGl2ZXMgaW4gdGhlIHN1YmZsb3dzIGRpY3Rpb25hcnkuXG4gICAqL1xuICByZXNvbHZlU3ViZmxvd1JlZmVyZW5jZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBBbHJlYWR5IGhhcyBzdHJ1Y3R1cmUg4oCUIG5vdCBhIHJlZmVyZW5jZVxuICAgIGlmIChub2RlLmZuIHx8IChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkpIHJldHVybiBub2RlO1xuXG4gICAgaWYgKCF0aGlzLmRlcHMuc3ViZmxvd3MpIHJldHVybiBub2RlO1xuXG4gICAgLy8gVHJ5IG11bHRpcGxlIGtleXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICAgIGNvbnN0IGtleXNUb1RyeSA9IFtub2RlLnN1YmZsb3dJZCwgbm9kZS5zdWJmbG93TmFtZSwgbm9kZS5uYW1lXS5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG4gICAgbGV0IHN1YmZsb3dEZWY6IHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfSB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNUb1RyeSkge1xuICAgICAgaWYgKHRoaXMuZGVwcy5zdWJmbG93c1trZXldKSB7XG4gICAgICAgIHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3Nba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzdWJmbG93RGVmKSB7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWJmbG93IG5vdCBmb3VuZCBpbiBkaWN0aW9uYXJ5IGZvciBub2RlICcke25vZGUubmFtZX0nICh0cmllZCBrZXlzOiAke2tleXNUb1RyeS5qb2luKCcsICcpfSlgLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHJlZmVyZW5jZSBtZXRhZGF0YSB3aXRoIGFjdHVhbCBzdHJ1Y3R1cmUuXG4gICAgLy8gaWQgY29tZXMgZnJvbSB0aGUgaW5uZXIgcm9vdCAodGhlIGFjdHVhbCBzdGFnZSBpZGVudGl0eSBmb3IgdHJhY2UgbWF0Y2hpbmcpLFxuICAgIC8vIG5vdCB0aGUgbW91bnQgbm9kZSAod2hpY2ggaXMgdGhlIHN1YmZsb3cgZW50cnkgcG9pbnQgaW4gdGhlIHBhcmVudCkuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1YmZsb3dEZWYucm9vdCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IG5vZGUuaXNTdWJmbG93Um9vdCxcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5zdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5zdWJmbG93TmFtZSxcbiAgICAgIGlkOiBzdWJmbG93RGVmLnJvb3QuaWQgfHwgbm9kZS5pZCxcbiAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyB8fCBzdWJmbG93RGVmLnJvb3Quc3ViZmxvd01vdW50T3B0aW9ucyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|