footprintjs 9.46.0 → 9.47.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/AGENTS.md +4 -3
- package/CLAUDE.md +8 -8
- package/README.md +1 -1
- package/dist/advanced.js +95 -90
- package/dist/esm/advanced.d.ts +16 -10
- package/dist/esm/advanced.js +14 -9
- package/dist/esm/index.d.ts +4 -2
- package/dist/esm/index.js +5 -3
- package/dist/esm/lib/decide/evaluator.js +2 -2
- package/dist/esm/lib/decide/evidence.js +2 -2
- package/dist/esm/lib/engine/handlers/servedPause.js +2 -2
- package/dist/esm/lib/memory/EventLog.d.ts +1 -1
- package/dist/esm/lib/memory/EventLog.js +2 -2
- package/dist/esm/lib/memory/RecordFrame.d.ts +41 -6
- package/dist/esm/lib/memory/RecordFrame.js +36 -5
- package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/esm/lib/memory/SharedMemory.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +21 -14
- package/dist/esm/lib/memory/StageContext.js +36 -74
- package/dist/esm/lib/memory/borrowedMutation.d.ts +1 -1
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/honesty.d.ts +4 -3
- package/dist/esm/lib/memory/honesty.js +5 -4
- package/dist/esm/lib/memory/index.d.ts +4 -2
- package/dist/esm/lib/memory/index.js +6 -4
- package/dist/esm/lib/memory/placeholders.d.ts +23 -28
- package/dist/esm/lib/memory/placeholders.js +24 -29
- package/dist/esm/lib/memory/recordCommit.d.ts +5 -3
- package/dist/esm/lib/memory/recordCommit.js +7 -5
- package/dist/esm/lib/memory/redaction.d.ts +78 -40
- package/dist/esm/lib/memory/redaction.js +130 -64
- package/dist/esm/lib/memory/runAddress.d.ts +20 -0
- package/dist/esm/lib/memory/runAddress.js +25 -0
- package/dist/esm/lib/memory/scrub.d.ts +53 -0
- package/dist/esm/lib/memory/scrub.js +74 -0
- package/dist/esm/lib/memory/utils.d.ts +3 -3
- package/dist/esm/lib/memory/utils.js +4 -4
- package/dist/esm/lib/memory/verbs.d.ts +1 -1
- package/dist/esm/lib/memory/verbs.js +2 -2
- package/dist/esm/trace.d.ts +2 -0
- package/dist/esm/trace.js +3 -2
- package/dist/esm/write.d.ts +47 -0
- package/dist/esm/write.js +46 -0
- package/dist/index.js +5 -3
- package/dist/lib/decide/evaluator.js +3 -3
- package/dist/lib/decide/evidence.js +3 -3
- package/dist/lib/engine/handlers/servedPause.js +3 -3
- package/dist/lib/memory/EventLog.js +2 -2
- package/dist/lib/memory/RecordFrame.js +36 -5
- package/dist/lib/memory/SharedMemory.js +2 -2
- package/dist/lib/memory/StageContext.js +42 -80
- package/dist/lib/memory/borrowedMutation.js +2 -2
- package/dist/lib/memory/honesty.js +5 -4
- package/dist/lib/memory/index.js +6 -4
- package/dist/lib/memory/placeholders.js +25 -30
- package/dist/lib/memory/recordCommit.js +9 -7
- package/dist/lib/memory/redaction.js +144 -75
- package/dist/lib/memory/runAddress.js +29 -0
- package/dist/lib/memory/scrub.js +79 -0
- package/dist/lib/memory/utils.js +4 -4
- package/dist/lib/memory/verbs.js +2 -2
- package/dist/trace.js +6 -4
- package/dist/types/advanced.d.ts +16 -10
- package/dist/types/index.d.ts +4 -2
- package/dist/types/lib/memory/EventLog.d.ts +1 -1
- package/dist/types/lib/memory/RecordFrame.d.ts +41 -6
- package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +21 -14
- package/dist/types/lib/memory/borrowedMutation.d.ts +1 -1
- package/dist/types/lib/memory/honesty.d.ts +4 -3
- package/dist/types/lib/memory/index.d.ts +4 -2
- package/dist/types/lib/memory/placeholders.d.ts +23 -28
- package/dist/types/lib/memory/recordCommit.d.ts +5 -3
- package/dist/types/lib/memory/redaction.d.ts +78 -40
- package/dist/types/lib/memory/runAddress.d.ts +20 -0
- package/dist/types/lib/memory/scrub.d.ts +53 -0
- package/dist/types/lib/memory/utils.d.ts +3 -3
- package/dist/types/lib/memory/verbs.d.ts +1 -1
- package/dist/types/trace.d.ts +2 -0
- package/dist/types/write.d.ts +47 -0
- package/dist/write.js +52 -0
- package/package.json +15 -1
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* What a stage's frame needs to READ and WRITE the record, and nothing about the stage inside a run:
|
|
5
5
|
* where it writes (its address), what it read first (the first-touch base), what it staged (the lazy
|
|
6
|
-
* transaction buffer)
|
|
7
|
-
* the
|
|
8
|
-
*
|
|
9
|
-
* and the redaction
|
|
6
|
+
* transaction buffer) and which of it the log must not show (the scrub of each write), which keys it
|
|
7
|
+
* read (the readKeys list), and where a commit lands (live state, the redacted mirror, the log —
|
|
8
|
+
* through `recordCommit`). The engine's frame (`StageContext`, L4) composes one and keeps the rest:
|
|
9
|
+
* retention, diagnostics, the dev-mode warnings, the commit observer and the redaction DECISION —
|
|
10
|
+
* which value is secret (`redaction.ts · decideWrite`); the frame writes the bytes it is handed (C4).
|
|
10
11
|
*
|
|
11
12
|
* THE LAW:
|
|
12
13
|
* 1. ADDRESS. The frame reads and writes at its address, a path prefix the engine computed and hands
|
|
@@ -28,6 +29,12 @@
|
|
|
28
29
|
* the names, and hands both to `recordCommit`. `release` drops the buffer and the base; a frame
|
|
29
30
|
* touched again re-anchors on the state as it stands then. The readKeys list survives a release,
|
|
30
31
|
* and goes with `discard` (a failed attempt never happened).
|
|
32
|
+
* 7. WRITE. `write(path, value, verb, scrub?)` is the one way to stage: `set`, `merge` or `delete`
|
|
33
|
+
* at an absolute path (the address already joined — `at`), with the bytes of a redaction
|
|
34
|
+
* verdict. `whole` → the log and the mirror carry `LOG_PLACEHOLDER` at the path; `fields` → at
|
|
35
|
+
* each field inside the value (a literal key and, when dotted, the nested path) — wherever it
|
|
36
|
+
* holds a value at commit (`scrub.ts`). No scrub → the value as it is. The frame never decides
|
|
37
|
+
* a scrub, and nothing outside it reaches its buffer.
|
|
31
38
|
*/
|
|
32
39
|
import { nativeGet } from './pathOps.js';
|
|
33
40
|
import { recordCommit } from './recordCommit.js';
|
|
@@ -151,6 +158,8 @@ export class RecordFrame {
|
|
|
151
158
|
* The buffer's base is the FIRST-TOUCH view, NOT the live state at write time: under parallel forks
|
|
152
159
|
* a sibling may have committed between this frame's first read and this write, and the net-change
|
|
153
160
|
* diff base must stay anchored at first touch to match the eager engine — see {@link firstTouch}.
|
|
161
|
+
*
|
|
162
|
+
* Private since C4: every write goes through {@link write}, so the scrub travels with the op.
|
|
154
163
|
*/
|
|
155
164
|
getTransactionBuffer() {
|
|
156
165
|
if (!this.buffer) {
|
|
@@ -163,6 +172,28 @@ export class RecordFrame {
|
|
|
163
172
|
}
|
|
164
173
|
return this.buffer;
|
|
165
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Stage one write (law 7): `verb` at `path` — an absolute path, the address already joined
|
|
177
|
+
* ({@link at}) — and the bytes of its redaction verdict. The first write builds the buffer (law 4).
|
|
178
|
+
*
|
|
179
|
+
* The scrub registers paths, never values: `whole` marks the op's own path, `fields` each field
|
|
180
|
+
* inside the value (a literal key and, when dotted, the nested path); `recordCommit` puts the
|
|
181
|
+
* log's placeholder wherever one of them holds a value at commit, for the mirror and the log only
|
|
182
|
+
* (`scrub.ts`). Live state takes the value as it is. A path marked by a write that the net-change
|
|
183
|
+
* filter drops goes with it.
|
|
184
|
+
*/
|
|
185
|
+
write(path, value, verb, scrub) {
|
|
186
|
+
const buffer = this.getTransactionBuffer();
|
|
187
|
+
const whole = scrub?.whole === true;
|
|
188
|
+
if (verb === 'merge')
|
|
189
|
+
buffer.merge(path, value, whole);
|
|
190
|
+
else if (verb === 'delete')
|
|
191
|
+
buffer.delete(path, whole);
|
|
192
|
+
else
|
|
193
|
+
buffer.set(path, value, whole);
|
|
194
|
+
if (scrub?.fields !== undefined)
|
|
195
|
+
buffer.markRedactedFields(path, scrub.fields);
|
|
196
|
+
}
|
|
166
197
|
/** Has the frame staged a write since its last release — does its buffer exist? */
|
|
167
198
|
get hasStaged() {
|
|
168
199
|
return this.buffer !== undefined;
|
|
@@ -262,4 +293,4 @@ export class RecordFrame {
|
|
|
262
293
|
this.readKeys = undefined;
|
|
263
294
|
}
|
|
264
295
|
}
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9SZWNvcmRGcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBR0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQW9CLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBYTNELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLHFFQUFxRTtJQUM1RCxLQUFLLENBQWU7SUFDN0IsbUVBQW1FO0lBQzFELEdBQUcsQ0FBWTtJQUN4QixtR0FBbUc7SUFDM0YsT0FBTyxDQUFnQjtJQUMvQixnREFBZ0Q7SUFDeEMsUUFBUSxDQUFvQjtJQUNwQyxnRUFBZ0U7SUFDeEQsUUFBUSxDQUFrQjtJQUNsQzs7OztPQUlHO0lBQ0ssSUFBSSxDQUEyQjtJQUN2Qyx3RkFBd0Y7SUFDaEYsTUFBTSxDQUFxQjtJQUNuQzs7OztPQUlHO0lBQ0ssUUFBUSxDQUFlO0lBRS9CLFlBQVksS0FBbUIsRUFBRSxHQUFjLEVBQUUsVUFBNkIsRUFBRTtRQUM5RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLE9BQTBCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxrR0FBa0c7SUFDbEcsV0FBVyxDQUFDLFFB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QUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVjb3JkRnJhbWUg4oCUIHRoZSByZWNvcmQgaGFsZiBvZiBvbmUgc3RhZ2UncyBmcmFtZSAoQzMsIEwzKS5cbiAqXG4gKiBXaGF0IGEgc3RhZ2UncyBmcmFtZSBuZWVkcyB0byBSRUFEIGFuZCBXUklURSB0aGUgcmVjb3JkLCBhbmQgbm90aGluZyBhYm91dCB0aGUgc3RhZ2UgaW5zaWRlIGEgcnVuOlxuICogd2hlcmUgaXQgd3JpdGVzIChpdHMgYWRkcmVzcyksIHdoYXQgaXQgcmVhZCBmaXJzdCAodGhlIGZpcnN0LXRvdWNoIGJhc2UpLCB3aGF0IGl0IHN0YWdlZCAodGhlIGxhenlcbiAqIHRyYW5zYWN0aW9uIGJ1ZmZlciksIHdoaWNoIGtleXMgaXQgcmVhZCAodGhlIHJlYWRLZXlzIGxpc3QpLCBhbmQgd2hlcmUgYSBjb21taXQgbGFuZHMgKGxpdmUgc3RhdGUsXG4gKiB0aGUgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbG9nIOKAlCB0aHJvdWdoIGByZWNvcmRDb21taXRgKS4gVGhlIGVuZ2luZSdzIGZyYW1lIChgU3RhZ2VDb250ZXh0YCwgTDQpXG4gKiBjb21wb3NlcyBvbmUgYW5kIGtlZXBzIHRoZSByZXN0OiByZXRlbnRpb24sIGRpYWdub3N0aWNzLCB0aGUgZGV2LW1vZGUgd2FybmluZ3MsIHRoZSBjb21taXQgb2JzZXJ2ZXJcbiAqIGFuZCB0aGUgcmVkYWN0aW9uIHZlcmRpY3QuXG4gKlxuICogVEhFIExBVzpcbiAqICAgMS4gQUREUkVTUy4gVGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgYXQgaXRzIGFkZHJlc3MsIGEgcGF0aCBwcmVmaXggdGhlIGVuZ2luZSBjb21wdXRlZCBhbmQgaGFuZHNcbiAqICAgICAgb3ZlciBhcyBkYXRhIChDMjogYFsncnVucycsIDxpZD5dYCBvciBgW11gLCB0aGUgcm9vdCkuIEl0IG1vdmVzIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZTpcbiAqICAgICAgdGhlIGJ1ZmZlciBrZWVwcyB0aGUgYWRkcmVzcyBpdCB3YXMgYnVpbHQgYXQgKHRoZSBlbmdpbmUgcmVmdXNlcyBhIGxhdGVyIG1vdmUpLlxuICogICAyLiBGSVJTVCBUT1VDSC4gVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBmcmFtZSBmaXJzdCB0b3VjaGVkIOKAlCBpdHMgZmlyc3QgcmVhZCBPUiBmaXJzdCB3cml0ZSDigJRcbiAqICAgICAgaXMgaGVsZCBieSByZWZlcmVuY2UsIG5ldmVyIGNsb25lZDogdGhlIHJlYWQgdmlldyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGFuZCB0aGUgYnVmZmVyJ3NcbiAqICAgICAgbmV0LWNoYW5nZSBkaWZmIGJhc2UgYWZ0ZXIgaXQuXG4gKiAgIDMuIFRXTyBUSUVSUy4gQSByZWFkIGlzIHNlcnZlZCBmcm9tIHRoZSBzdGFnZSdzIG93biB2aWV3ICh0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IG9uY2UgdGhlIHN0YWdlXG4gKiAgICAgIHdyb3RlLCBlbHNlIHRoZSBmaXJzdC10b3VjaCBiYXNlKTsgYSBrZXkgYWJzZW50IHRoZXJlIGlzIHNlcnZlZCBmcm9tIExJVkUgc3RhdGUgKGF0IHRoZVxuICogICAgICBhZGRyZXNzLCB0aGVuIHRoZSByb290KS4gQWZ0ZXIgdGhlIGZpcnN0IHdyaXRlIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgaXMgZmlyc3QgZ2l2ZW4gYSBwcml2YXRlXG4gKiAgICAgIGNvcHkgYXQgdGhhdCBwYXRoIChgVHJhbnNhY3Rpb25CdWZmZXIgwrcgZGV0YWNoQmFzZWApLlxuICogICA0LiBMQVpZIEJVRkZFUi4gVGhlIGJ1ZmZlciBpcyBidWlsdCBhdCB0aGUgZmlyc3Qgd3JpdGUg4oCUIG9uIHRoZSBmaXJzdC10b3VjaCBiYXNlLCBhdCB0aGUgYWRkcmVzcyxcbiAqICAgICAgdW5kZXIgdGhlIGVuY29kaW5nLiBBIGZyYW1lIHRoYXQgbmV2ZXIgd3JpdGVzIGJ1aWxkcyBub25lLCBhbmQgaXRzIGNvbW1pdCBpcyB0aGUgZW1wdHkgYnVuZGxlLlxuICogICA1LiBSRUFEIEtFWVMuIFVuZGVyIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBldmVyeSBub3RlZCByZWFkIHB1dHMgaXRzIHVzZXItbGV2ZWwga2V5XG4gKiAgICAgIChkb3R0ZWQgZm9yIGEgbmVzdGVkIHBhdGgpIG9uIHRoZSBmcmFtZSdzIGxpc3QsIG9uY2UsIGluIG9yZGVyOyBlYWNoIHN0YWdlZCByb3cgY2FycmllcyBhIGNvcHlcbiAqICAgICAgb2YgdGhlIGxpc3QgYXMgaXQgc3RhbmRzIHdoZW4gdGhlIHJvdyBpcyBzdGFnZWQuXG4gKiAgIDYuIENPTU1JVCwgUkVMRUFTRSwgRElTQ0FSRC4gYGNvbW1pdGAgdGFrZXMgdGhlIGJ1ZmZlcidzIHBheWxvYWQgKG5vbmUgPSB0aGUgZW1wdHkgY29tbWl0KSwgdGhlblxuICogICAgICB0aGUgbmFtZXMsIGFuZCBoYW5kcyBib3RoIHRvIGByZWNvcmRDb21taXRgLiBgcmVsZWFzZWAgZHJvcHMgdGhlIGJ1ZmZlciBhbmQgdGhlIGJhc2U7IGEgZnJhbWVcbiAqICAgICAgdG91Y2hlZCBhZ2FpbiByZS1hbmNob3JzIG9uIHRoZSBzdGF0ZSBhcyBpdCBzdGFuZHMgdGhlbi4gVGhlIHJlYWRLZXlzIGxpc3Qgc3Vydml2ZXMgYSByZWxlYXNlLFxuICogICAgICBhbmQgZ29lcyB3aXRoIGBkaXNjYXJkYCAoYSBmYWlsZWQgYXR0ZW1wdCBuZXZlciBoYXBwZW5lZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbWl0U3RhbXAsIHJlY29yZENvbW1pdCB9IGZyb20gJy4vcmVjb3JkQ29tbWl0LmpzJztcbmltcG9ydCB0eXBlIHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSB0d28gZGlhbHMgdGhhdCBzaGFwZSBhIGZyYW1lJ3MgYnl0ZXM6IHRoZSBsb2cncyB2YWx1ZSBlbmNvZGluZyBhbmQgdGhlIHBlci1yb3cgcmVhZCBwcmVmaXguXG4gKiBIZWxkIGJ5IHJlZmVyZW5jZSBhbmQgc3dhcHBlZCB3aG9sZSAoYHVzZUVuY29kaW5nYCksIG5ldmVyIGVkaXRlZCDigJQgdGhlIGVuZ2luZSBoYW5kcyB0aGUgcnVuJ3NcbiAqIGZyb3plbiBwb2xpY3kgaXRzZWxmLiBBYnNlbnQ6IGAnZnVsbCdgIHZhbHVlcyBhbmQgbm8gcmVhZCBwcmVmaXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRW5jb2Rpbmcge1xuICByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY29yZEZyYW1lIHtcbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGUgaGVhcCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIHNoYXJlcy4gKi9cbiAgcmVhZG9ubHkgc3RhdGU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBsb2cgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICByZWFkb25seSBsb2c/OiBFdmVudExvZztcbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lICh7QGxpbmsgdXNlTWlycm9yfSkuICovXG4gIHByaXZhdGUgX21pcnJvcj86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFdoZXJlIHRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIChsYXcgMSkuICovXG4gIHByaXZhdGUgX2FkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIHR3byBkaWFscyAobGF3IDQsIDUpOyBhYnNlbnQg4oaSIHRoZSByZWNvcmQncyBkZWZhdWx0cy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGluZz86IFJlY29yZEVuY29kaW5nO1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGF0IHRoZSBmcmFtZSdzIEZJUlNUIHRvdWNoIChsYXcgMikg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuXG4gICAqIFNlZSB7QGxpbmsgZmlyc3RUb3VjaH0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50IHRoYXQgbWFrZXMgYSBiYXJlXG4gICAqIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgc3RhZ2UncyBzdGFnZWQgd3JpdGVzIOKAlCBidWlsdCBhdCBpdHMgZmlyc3Qgd3JpdGUgKGxhdyA0KSwgcmVsZWFzZWQgYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogS2V5cyB0cmFja2VkLXJlYWQgc28gZmFyLCBpbiBvcmRlciAobGF3IDUpIOKAlCB0aGUgc291cmNlIG9mIGVhY2ggc3RhZ2VkIHJvdydzIGByZWFkS2V5c2AuIE9ubHlcbiAgICogYWxsb2NhdGVkIHVuZGVyIGAncmVhZHMtcHJlZml4J2A7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICAgKiBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRLZXlzPzogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGU6IFNoYXJlZE1lbW9yeSwgbG9nPzogRXZlbnRMb2csIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5fYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgKGxhdyAxKS4gKi9cbiAgZ2V0IGFkZHJlc3MoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW5kIHdyaXRlIGF0IGBhZGRyZXNzYCBmcm9tIG5vdyBvbiDigJQgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlIChsYXcgMSk6IHRoZSBidWZmZXIga2VlcHNcbiAgICogdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0LiBUaGUgZW5naW5lJ3Mgb25lIGNhbGxlciwgYFN0YWdlQ29udGV4dCDCtyB1c2VBZGRyZXNzT2ZgLCByZWZ1c2VzIGEgbW92ZVxuICAgKiBvbmNlIHRoZSBmcmFtZSBoYXMgc3RhZ2VkLlxuICAgKi9cbiAgdXNlQWRkcmVzcyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFRoZSB0d28gZGlhbHMgdGhlIGZyYW1lIGVuY29kZXMgdW5kZXIgZnJvbSBpdHMgbmV4dCBidWZmZXIgYW5kIGl0cyBuZXh0IHJlYWQgb24gKGxhdyA0LCA1KS4gKi9cbiAgdXNlRW5jb2RpbmcoZW5jb2Rpbmc6IFJlY29yZEVuY29kaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB9XG5cbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IsIGlmIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICBnZXQgbWlycm9yKCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21pcnJvcjtcbiAgfVxuXG4gIC8qKiBMYW5kIGV2ZXJ5IGNvbW1pdCBmcm9tIG5vdyBvbiBvbiBgbWlycm9yYCB0b28sIHdpdGggdGhlIHNjcnViYmVkIHJvd3MgdGhlIGxvZyB0YWtlcyAoYHJlY29yZENvbW1pdGApLiAqL1xuICB1c2VNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogVGhlIGFic29sdXRlIHBhdGggb2YgYGtleWAgdW5kZXIgYHBhdGhgOiB0aGUgZnJhbWUncyBhZGRyZXNzLCB0aGVuIHRoZSBwYXRoLCB0aGVuIHRoZSBrZXkuICovXG4gIGF0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyBFdmVyeSByZWFkIGFuZCB3cml0ZSBidWlsZHMgb25lLiBUaGUgcm9vdCdzIGlzIHRoZSBwYXRoIGFuZCB0aGUga2V5OyB1bmRlciBhbiBhZGRyZXNzLCBhblxuICAgIC8vIGluZGV4IGxvb3Ag4oCUIHRoZSBkb3VibGUgc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aCwga2V5XWAgY29zdHMgYSB0aGlyZCBtb3JlIHBlciBjYWxsXG4gICAgLy8gKGFzIGB1dGlscyDCtyBwYXRoVW5kZXJgIGZvdW5kIGZvciB0aGUgYWRkcmVzcyBhbmQgdGhlIHBhdGgpLlxuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLl9hZGRyZXNzO1xuICAgIGlmIChhZGRyZXNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmc+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGggKyAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGtleTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggYmFzZSAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBmcmFtZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIG9yXG4gICAqIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC4gU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogd3JpdGUgKHtAbGluayByZWFkfSkgYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZCBzdGF0ZSBpc1xuICAgKiBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZSBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluXG4gICAqIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWEgYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdFxuICAgKiBjb3BpZXMgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlciBlZGl0cyBhXG4gICAqIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpc1xuICAgKiBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlcidzIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGUgc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0XG4gICAqIHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGVcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3RcbiAgICogd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmUgbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGRcbiAgICogd3JpdGVzIHVuZGVyIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYSBgc2V0R2xvYmFsYCBmcm9tXG4gICAqIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieSBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nXG4gICAqIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQVxuICAgKiBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLCBtYWtpbmcgaXRzXG4gICAqIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKSByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLlxuICAgKiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXMgdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUXG4gICAqIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnQgaW4gdGhlIHZpZXcgYXQgZmlyc3RcbiAgICogdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXQgZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUnc1xuICAgKiBleGFjdCBmYWxsYmFjayDigJQgYSBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmQgc3RheXNcbiAgICogdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2goKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5iYXNlKSB7XG4gICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZyYW1lJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZCB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0XG4gICAqIHtAbGluayByZWFkfSBzZXJ2ZXMgZnJvbSB0aGUgZmlyc3QtdG91Y2ggYmFzZSBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhbiBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoXG4gICAqIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGUgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3NcbiAgICogYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXMgZnJhbWUncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZGlmZiBiYXNlIG11c3Qgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWUge0BsaW5rIGZpcnN0VG91Y2h9LlxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTogVHJhbnNhY3Rpb25CdWZmZXIge1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIC8vIFBlci13cml0ZSBwcm92ZW5hbmNlICgjUDEpOiBoYW5kIHRoZSBidWZmZXIgYSBsaXZlIHZpZXcgb2YgdGhpcyBmcmFtZSdzIHJlYWQgcHJlZml4IOKAlFxuICAgICAgLy8gZXZhbHVhdGVkIEFUIEVBQ0ggV1JJVEUsIHNvIGVhY2ggc3RhZ2VkIG9wIGNhcHR1cmVzIGV4YWN0bHkgdGhlIHJlYWRzIHRoYXQgcHJlY2VkZWQgaXQuXG4gICAgICBjb25zdCByZWFkS2V5c1Byb3ZpZGVyID1cbiAgICAgICAgdGhpcy5lbmNvZGluZz8ud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4JyA/ICgpID0+IFsuLi4odGhpcy5yZWFkS2V5cyA/PyBbXSldIDogdW5kZWZpbmVkO1xuICAgICAgLy8gVGhlIGZyYW1lJ3MgYWRkcmVzcyAoOS4zMC4wOiB0aGUgYWRtaXR0ZWQgcmVjb3JkIHJlYWRzIHRoZSBjb250YWluZXJzIHRoZXJlIGFzIHdoZXJlIHRoZVxuICAgICAgLy8gc3RhZ2Ugd3JpdGVzLCBuZXZlciBhcyBhIHZhbHVlIGl0IHJlYWQpLlxuICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWZmZXIoXG4gICAgICAgIHRoaXMuZmlyc3RUb3VjaCgpLFxuICAgICAgICB0aGlzLmVuY29kaW5nPy5jb21taXRWYWx1ZXMsXG4gICAgICAgIHJlYWRLZXlzUHJvdmlkZXIsXG4gICAgICAgIHRoaXMuX2FkZHJlc3MsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gIH1cblxuICAvKiogSGFzIHRoZSBmcmFtZSBzdGFnZWQgYSB3cml0ZSBzaW5jZSBpdHMgbGFzdCByZWxlYXNlIOKAlCBkb2VzIGl0cyBidWZmZXIgZXhpc3Q/ICovXG4gIGdldCBoYXNTdGFnZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZyYW1lJ3MgcmVhZCwgbWlycm9yaW5nIHRoZSBlYWdlciBlbmdpbmUncyByZWFkIG9yZGVyIGJ5dGUtZm9yLWJ5dGUgKGxhdyAzKTpcbiAgICpcbiAgICogICAgMS4gc3RhZ2VkIHdyaXRlcyArIGZpcnN0LXRvdWNoIHNuYXBzaG90IOKAlCBgYnVmZmVyLmdldGAgb3ZlciBpdHMgd29ya2luZ0NvcHkgd2hlbiB0aGUgYnVmZmVyXG4gICAqICAgICAgIGV4aXN0cywgZWxzZSBgbmF0aXZlR2V0YCBvdmVyIHRoZSB6ZXJvLWNsb25lIGZpcnN0LXRvdWNoIGJhc2UgKHRoZSBidWZmZXIncyBiYXNlIElTIHRoYXRcbiAgICogICAgICAgdmlldywgc28gdGhlIHR3byB0aWVycyBhZ3JlZSBvbiBjb250ZW50KTtcbiAgICogICAgMi4gTElWRSBzdGF0ZSB2aWEgYFNoYXJlZE1lbW9yeSDCtyBnZXRWYWx1ZWAgZm9yIGtleXMgYWJzZW50IGZyb20gdGhlIHNuYXBzaG90IOKAlCBpbmNsdWRpbmcgaXRzXG4gICAqICAgICAgIGFkZHJlc3PihpJyb290IGZhbGxiYWNrLiBUaGUgZWFnZXIgZW5naW5lIGhhZCB0aGlzIGV4YWN0IGxpdmUgZmFsbGJhY2sgZm9yIHNuYXBzaG90LW1pc3NpbmdcbiAgICogICAgICAga2V5czsgYnl0ZS1pZGVudGl0eSBvdmVyIHB1cml0eS4gQWZ0ZXIgdGhlIGZyYW1lJ3MgZmlyc3Qgd3JpdGUgc3VjaCBhIHZhbHVlIGNhbiBiZSB0aGUgdmVyeVxuICAgKiAgICAgICBjb250YWluZXIgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBob2xkcyBhdCB0aGUgcGF0aCAodGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXQgaXQsIG9yXG4gICAqICAgICAgIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0KSwgc28gdGhlIGJhc2UgaXMgZGV0YWNoZWQgdGhlcmUgZmlyc3RcbiAgICogICAgICAgKGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBkZXRhY2hCYXNlYCk6IGFuIGluLXBsYWNlIGVkaXQgb2YgdGhlIHZhbHVlIChvdXQgb2YgY29udHJhY3QpIHdyaXR0ZW5cbiAgICogICAgICAgYmFjayBpcyByZWNvcmRlZCwgYXMgb24gOS4yOC4wLCB3aG9zZSBiYXNlIHdhcyBhIGNsb25lIHRha2VuIGF0IHRoZSBmaXJzdCB3cml0ZS5cbiAgICpcbiAgICogUmVhZHMgbmV2ZXIgY29uc3RydWN0IHRoZSBidWZmZXIgKCMxMyk6IGEgZnJhbWUgdGhhdCBuZXZlciB3cml0ZXMgcGVyZm9ybXMgemVybyBjbG9uZXMgb2YgdGhlXG4gICAqIHNoYXJlZCBzdGF0ZS5cbiAgICovXG4gIHJlYWQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGF0ID0gdGhpcy5hdChwYXRoLCBrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBmcm9tU25hcHNob3QgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChhdCkgOiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoKCksIGF0KTtcbiAgICBpZiAodHlwZW9mIGZyb21TbmFwc2hvdCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmcm9tU25hcHNob3Q7XG4gICAgY29uc3QgbGl2ZSA9IHRoaXMuc3RhdGUuZ2V0VmFsdWUodGhpcy5fYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICAvLyBUaWVyIDIgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlOiBrZWVwIHRoZSBkaWZmIGJhc2UgZXhhY3QgKHNlZSBhYm92ZSkuXG4gICAgaWYgKHRoaXMuYnVmZmVyICYmIGxpdmUgIT09IG51bGwgJiYgdHlwZW9mIGxpdmUgPT09ICdvYmplY3QnKSB0aGlzLmJ1ZmZlci5kZXRhY2hCYXNlKGF0KTtcbiAgICByZXR1cm4gbGl2ZTtcbiAgfVxuXG4gIC8qKiBQdXQgYSB0cmFja2VkIHJlYWQncyB1c2VyLWxldmVsIGtleSBvbiB0aGUgcmVhZEtleXMgbGlzdCAobGF3IDUpIOKAlCBhIG5vLW9wIHVubGVzcyB0aGUgZnJhbWUga2VlcHMgb25lLiAqL1xuICBub3RlUmVhZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbmNvZGluZz8ud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4Jykge1xuICAgICAgKHRoaXMucmVhZEtleXMgPz89IG5ldyBTZXQoKSkuYWRkKHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgY29tbWl0dGVkIHN0YXRlIGF0IGBrZXlgOiBhdCB0aGUgZnJhbWUncyBhZGRyZXNzLCBlbHNlIGF0IHRoZSByb290IOKAlCBuZXZlciB0aGUgc3RhZ2UncyBvd25cbiAgICogdmlldy4gVHlwZWQgYXMgYFNoYXJlZE1lbW9yeSDCtyBnZXRWYWx1ZWAgdHlwZXMgaXQsIHdoaWNoIGBTdGFnZUNvbnRleHQgwrcgZ2V0Um9vdGAgaGFuZHMgb24uXG4gICAqL1xuICByZWFkTGl2ZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFZhbHVlKHRoaXMuX2FkZHJlc3MsIFtdLCBrZXkpO1xuICB9XG5cbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIGF0IGBrZXlgIGF0IHRoZSByb290IOKAlCB0eXBlZCBhcyBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCAoYFN0YWdlQ29udGV4dCDCtyBnZXRHbG9iYWxgKS4gKi9cbiAgcmVhZEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFZhbHVlKFtdLCBbXSwga2V5KTtcbiAgfVxuXG4gIC8qKiBEaWQgYSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgIOKAlCBvbiBpdCwgYWJvdmUgaXQgb3IgYmVsb3cgaXQ/IChBIHJlcG9ydCdzIHF1ZXN0aW9uOyBuZXZlciB0aGUgaG90IHBhdGguKSAqL1xuICB3YXNTdGFnZWQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYnVmZmVyLndhc1N0YWdlZChwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgYXQgYHBhdGhgIGluIHdoYXQgdGhlIHN0YWdlIGhhcyBzZWVuIOKAlCBpdHMgd29ya2luZyBjb3B5IG9uY2UgaXQgd3JvdGUsIGVsc2UgaXRzXG4gICAqIGZpcnN0LXRvdWNoIGJhc2Ug4oCUIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5OiBmb3IgYSByZXBvcnQgdGhhdCBvbmx5IGNvbXBhcmVzLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIucGVlayhwYXRoKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgcGF0aCk7XG4gIH1cblxuICAvKiogVGhlIHZhbHVlIGF0IGBwYXRoYCBpbiB0aGUgZmlyc3QtdG91Y2ggYmFzZSDigJQgY29tbWl0dGVkIHN0YXRlIGFzIHRoZSBmcmFtZSBmaXJzdCB0b3VjaGVkIGl0LiAqL1xuICBiYXNlQXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoKCksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB3aGF0IHRoZSBmcmFtZSBzdGFnZWQgKGxhdyA2KTogdGhlIGJ1ZmZlcidzIHBheWxvYWQgZmlyc3Qg4oCUIG5vbmUsIHRoZSBlbXB0eSBjb21taXQsIHdoZW5cbiAgICogaXQgc3RhZ2VkIG5vdGhpbmcgKCMxMzogemVybyBjbG9uZXMpIOKAlCB0aGVuIHRoZSBuYW1lcyAoYHN0YW1wT2YoKWApLCByZWFkIG9uY2UgdGhlIHBheWxvYWQgaXNcbiAgICogYnVpbHQsIGFuZCBib3RoIHRvIGByZWNvcmRDb21taXRgLiBVc2VyIGNvZGUgY2FuIHJ1biB3aGlsZSB0aGUgcGF5bG9hZCBpcyBidWlsdCAoYSBnZXR0ZXIgb24gYVxuICAgKiBzdGFnZWQgdmFsdWUsIHdoaWNoIHRoZSBuZXQtY2hhbmdlIGNvbXBhcmUgYW5kIHRoZSBjbG9uZSBpbnZva2UpOyB3aGF0IGl0IGFkZHMgdG8gdGhlIG5hbWVzIOKAlFxuICAgKiBhbiB1bnRyYWNrZWQgcmVhZCwgc2F5IOKAlCBpcyBvbiB0aGUgYnVuZGxlLlxuICAgKi9cbiAgY29tbWl0KHN0YW1wT2Y6ICgpID0+IENvbW1pdFN0YW1wKTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYnVmZmVyPy5jb21taXQoKTtcbiAgICByZWNvcmRDb21taXQocGF5bG9hZCwgc3RhbXBPZigpLCB7IHN0YXRlOiB0aGlzLnN0YXRlLCBtaXJyb3I6IHRoaXMuX21pcnJvciwgbG9nOiB0aGlzLmxvZyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIGZyYW1lJ3MgaG9sZCBvbiBzdGF0ZSAoIzEzYiwgbGF3IDYpOiBkcm9wIHRoZSBidWZmZXIgKGl0cyB3b3JraW5nIGNvcHkgYW5kIHdoYXRldmVyIHByaXZhdGVcbiAgICogY29waWVzIGl0cyByZWFkcyB0b29rKSBhbmQgdGhlIGZpcnN0LXRvdWNoIGJhc2UgKGEgcmVmZXJlbmNlIHRoYXQgcGlucyBvbmUgY29tbWl0dGVkLXN0YXRlXG4gICAqIEdFTkVSQVRJT04pLiBCb3RoIHJlLWNyZWF0ZSBsYXppbHk6IGEgbGF0ZXIgcmVhZCByZS1hbmNob3JzIG9uIHRoZSBDVVJSRU5UIGNvbW1pdHRlZCBzdGF0ZSwgYW5kIGFcbiAgICogbGF0ZXIgd3JpdGUgYnVpbGRzIGEgZnJlc2ggYnVmZmVyIG9uIGl0IOKAlCBzbyBhIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCB0aGUgc3RhdGUgYWZ0ZXIgdGhlXG4gICAqIGZpcnN0LiBXaXRob3V0IHRoZSByZWxlYXNlLCB0aGUgZXhlY3V0aW9uIHRyZWUg4oCUIHdoaWNoIHJldGFpbnMgZXZlcnkgZnJhbWUgZm9yIHRoZSBsaWZldGltZSBvZlxuICAgKiB0aGUgcnVuIOKAlCByZXRhaW5zIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZCBzdGFnZSAobWVhc3VyZWQgTyhOwrIpIGJlZm9yZSBjb3B5LW9uLXdyaXRlO1xuICAgKiBhIDUwMC1pdGVyYXRpb24gYWdlbnQgT09NZWQgYSBkZWZhdWx0IE5vZGUgaGVhcCwgYmFja2xvZyAjMTgpLlxuICAgKi9cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJhc2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYXdheSBldmVyeXRoaW5nIHRoZSBmcmFtZSBzdGFnZWQgYW5kIHJlYWQgKGxhdyA2KTogdGhlIGJ1ZmZlciwgdGhlIGZpcnN0LXRvdWNoIGJhc2UgKHRoZSBuZXh0XG4gICAqIGF0dGVtcHQgcmUtYW5jaG9ycyBvbiBjb21taXR0ZWQgc3RhdGUgYXMgaXQgc3RhbmRzIE5PVykgYW5kIHRoZSByZWFkS2V5cyBsaXN0IOKAlCBhIGRpc2NhcmRlZFxuICAgKiBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciByZWFjaCB0aGUgbmV4dCBhdHRlbXB0J3MgYFRyYWNlRW50cnkucmVhZEtleXNgLCBvciBhIGJhY2t3YXJkIHNsaWNlXG4gICAqIHdvdWxkIGZvbGxvdyBhbiBlZGdlIHRoYXQgbm8gY29tbWl0dGVkIHdyaXRlIGV2ZXIgaGFkLiBOb3RoaW5nIGlzIHJlY29yZGVkLlxuICAgKi9cbiAgZGlzY2FyZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbGVhc2UoKTtcbiAgICB0aGlzLnJlYWRLZXlzID0gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9SZWNvcmRGcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUlILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQThCM0QsTUFBTSxPQUFPLFdBQVc7SUFDdEIscUVBQXFFO0lBQzVELEtBQUssQ0FBZTtJQUM3QixtRUFBbUU7SUFDMUQsR0FBRyxDQUFZO0lBQ3hCLG1HQUFtRztJQUMzRixPQUFPLENBQWdCO0lBQy9CLGdEQUFnRDtJQUN4QyxRQUFRLENBQW9CO0lBQ3BDLGdFQUFnRTtJQUN4RCxRQUFRLENBQWtCO0lBQ2xDOzs7O09BSUc7SUFDSyxJQUFJLENBQTJCO0lBQ3ZDLHdGQUF3RjtJQUNoRixNQUFNLENBQXFCO0lBQ25DOzs7O09BSUc7SUFDSyxRQUFRLENBQWU7SUFFL0IsWUFBWSxLQUFtQixFQUFFLEdBQWMsRUFBRSxVQUE2QixFQUFFO1FBQzlFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsT0FBMEI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxXQUFX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LENBQUM7SUFDbkYsQ0FBQztJQUVELG1HQUFtRztJQUNuRyxNQUFNLENBQUMsSUFBeUI7UUFDOUIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsT0FBMEI7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIG9mIG9uZSBzdGFnZSdzIGZyYW1lIChDMywgTDMpLlxuICpcbiAqIFdoYXQgYSBzdGFnZSdzIGZyYW1lIG5lZWRzIHRvIFJFQUQgYW5kIFdSSVRFIHRoZSByZWNvcmQsIGFuZCBub3RoaW5nIGFib3V0IHRoZSBzdGFnZSBpbnNpZGUgYSBydW46XG4gKiB3aGVyZSBpdCB3cml0ZXMgKGl0cyBhZGRyZXNzKSwgd2hhdCBpdCByZWFkIGZpcnN0ICh0aGUgZmlyc3QtdG91Y2ggYmFzZSksIHdoYXQgaXQgc3RhZ2VkICh0aGUgbGF6eVxuICogdHJhbnNhY3Rpb24gYnVmZmVyKSBhbmQgd2hpY2ggb2YgaXQgdGhlIGxvZyBtdXN0IG5vdCBzaG93ICh0aGUgc2NydWIgb2YgZWFjaCB3cml0ZSksIHdoaWNoIGtleXMgaXRcbiAqIHJlYWQgKHRoZSByZWFkS2V5cyBsaXN0KSwgYW5kIHdoZXJlIGEgY29tbWl0IGxhbmRzIChsaXZlIHN0YXRlLCB0aGUgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbG9nIOKAlFxuICogdGhyb3VnaCBgcmVjb3JkQ29tbWl0YCkuIFRoZSBlbmdpbmUncyBmcmFtZSAoYFN0YWdlQ29udGV4dGAsIEw0KSBjb21wb3NlcyBvbmUgYW5kIGtlZXBzIHRoZSByZXN0OlxuICogcmV0ZW50aW9uLCBkaWFnbm9zdGljcywgdGhlIGRldi1tb2RlIHdhcm5pbmdzLCB0aGUgY29tbWl0IG9ic2VydmVyIGFuZCB0aGUgcmVkYWN0aW9uIERFQ0lTSU9OIOKAlFxuICogd2hpY2ggdmFsdWUgaXMgc2VjcmV0IChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCk7IHRoZSBmcmFtZSB3cml0ZXMgdGhlIGJ5dGVzIGl0IGlzIGhhbmRlZCAoQzQpLlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIEFERFJFU1MuIFRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIGF0IGl0cyBhZGRyZXNzLCBhIHBhdGggcHJlZml4IHRoZSBlbmdpbmUgY29tcHV0ZWQgYW5kIGhhbmRzXG4gKiAgICAgIG92ZXIgYXMgZGF0YSAoQzI6IGBbJ3J1bnMnLCA8aWQ+XWAgb3IgYFtdYCwgdGhlIHJvb3QpLiBJdCBtb3ZlcyBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGU6XG4gKiAgICAgIHRoZSBidWZmZXIga2VlcHMgdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0ICh0aGUgZW5naW5lIHJlZnVzZXMgYSBsYXRlciBtb3ZlKS5cbiAqICAgMi4gRklSU1QgVE9VQ0guIFRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgZnJhbWUgZmlyc3QgdG91Y2hlZCDigJQgaXRzIGZpcnN0IHJlYWQgT1IgZmlyc3Qgd3JpdGUg4oCUXG4gKiAgICAgIGlzIGhlbGQgYnkgcmVmZXJlbmNlLCBuZXZlciBjbG9uZWQ6IHRoZSByZWFkIHZpZXcgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBhbmQgdGhlIGJ1ZmZlcidzXG4gKiAgICAgIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIGFmdGVyIGl0LlxuICogICAzLiBUV08gVElFUlMuIEEgcmVhZCBpcyBzZXJ2ZWQgZnJvbSB0aGUgc3RhZ2UncyBvd24gdmlldyAodGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBvbmNlIHRoZSBzdGFnZVxuICogICAgICB3cm90ZSwgZWxzZSB0aGUgZmlyc3QtdG91Y2ggYmFzZSk7IGEga2V5IGFic2VudCB0aGVyZSBpcyBzZXJ2ZWQgZnJvbSBMSVZFIHN0YXRlIChhdCB0aGVcbiAqICAgICAgYWRkcmVzcywgdGhlbiB0aGUgcm9vdCkuIEFmdGVyIHRoZSBmaXJzdCB3cml0ZSB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGlzIGZpcnN0IGdpdmVuIGEgcHJpdmF0ZVxuICogICAgICBjb3B5IGF0IHRoYXQgcGF0aCAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKS5cbiAqICAgNC4gTEFaWSBCVUZGRVIuIFRoZSBidWZmZXIgaXMgYnVpbHQgYXQgdGhlIGZpcnN0IHdyaXRlIOKAlCBvbiB0aGUgZmlyc3QtdG91Y2ggYmFzZSwgYXQgdGhlIGFkZHJlc3MsXG4gKiAgICAgIHVuZGVyIHRoZSBlbmNvZGluZy4gQSBmcmFtZSB0aGF0IG5ldmVyIHdyaXRlcyBidWlsZHMgbm9uZSwgYW5kIGl0cyBjb21taXQgaXMgdGhlIGVtcHR5IGJ1bmRsZS5cbiAqICAgNS4gUkVBRCBLRVlTLiBVbmRlciBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZXZlcnkgbm90ZWQgcmVhZCBwdXRzIGl0cyB1c2VyLWxldmVsIGtleVxuICogICAgICAoZG90dGVkIGZvciBhIG5lc3RlZCBwYXRoKSBvbiB0aGUgZnJhbWUncyBsaXN0LCBvbmNlLCBpbiBvcmRlcjsgZWFjaCBzdGFnZWQgcm93IGNhcnJpZXMgYSBjb3B5XG4gKiAgICAgIG9mIHRoZSBsaXN0IGFzIGl0IHN0YW5kcyB3aGVuIHRoZSByb3cgaXMgc3RhZ2VkLlxuICogICA2LiBDT01NSVQsIFJFTEVBU0UsIERJU0NBUkQuIGBjb21taXRgIHRha2VzIHRoZSBidWZmZXIncyBwYXlsb2FkIChub25lID0gdGhlIGVtcHR5IGNvbW1pdCksIHRoZW5cbiAqICAgICAgdGhlIG5hbWVzLCBhbmQgaGFuZHMgYm90aCB0byBgcmVjb3JkQ29tbWl0YC4gYHJlbGVhc2VgIGRyb3BzIHRoZSBidWZmZXIgYW5kIHRoZSBiYXNlOyBhIGZyYW1lXG4gKiAgICAgIHRvdWNoZWQgYWdhaW4gcmUtYW5jaG9ycyBvbiB0aGUgc3RhdGUgYXMgaXQgc3RhbmRzIHRoZW4uIFRoZSByZWFkS2V5cyBsaXN0IHN1cnZpdmVzIGEgcmVsZWFzZSxcbiAqICAgICAgYW5kIGdvZXMgd2l0aCBgZGlzY2FyZGAgKGEgZmFpbGVkIGF0dGVtcHQgbmV2ZXIgaGFwcGVuZWQpLlxuICogICA3LiBXUklURS4gYHdyaXRlKHBhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yj8pYCBpcyB0aGUgb25lIHdheSB0byBzdGFnZTogYHNldGAsIGBtZXJnZWAgb3IgYGRlbGV0ZWBcbiAqICAgICAgYXQgYW4gYWJzb2x1dGUgcGF0aCAodGhlIGFkZHJlc3MgYWxyZWFkeSBqb2luZWQg4oCUIGBhdGApLCB3aXRoIHRoZSBieXRlcyBvZiBhIHJlZGFjdGlvblxuICogICAgICB2ZXJkaWN0LiBgd2hvbGVgIOKGkiB0aGUgbG9nIGFuZCB0aGUgbWlycm9yIGNhcnJ5IGBMT0dfUExBQ0VIT0xERVJgIGF0IHRoZSBwYXRoOyBgZmllbGRzYCDihpIgYXRcbiAqICAgICAgZWFjaCBmaWVsZCBpbnNpZGUgdGhlIHZhbHVlIChhIGxpdGVyYWwga2V5IGFuZCwgd2hlbiBkb3R0ZWQsIHRoZSBuZXN0ZWQgcGF0aCkg4oCUIHdoZXJldmVyIGl0XG4gKiAgICAgIGhvbGRzIGEgdmFsdWUgYXQgY29tbWl0IChgc2NydWIudHNgKS4gTm8gc2NydWIg4oaSIHRoZSB2YWx1ZSBhcyBpdCBpcy4gVGhlIGZyYW1lIG5ldmVyIGRlY2lkZXNcbiAqICAgICAgYSBzY3J1YiwgYW5kIG5vdGhpbmcgb3V0c2lkZSBpdCByZWFjaGVzIGl0cyBidWZmZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPcFZlcmIgfSBmcm9tICcuL2RlbHRhRW5jb2RpbmcuanMnO1xuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbWl0U3RhbXAsIHJlY29yZENvbW1pdCB9IGZyb20gJy4vcmVjb3JkQ29tbWl0LmpzJztcbmltcG9ydCB0eXBlIHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSB0d28gZGlhbHMgdGhhdCBzaGFwZSBhIGZyYW1lJ3MgYnl0ZXM6IHRoZSBsb2cncyB2YWx1ZSBlbmNvZGluZyBhbmQgdGhlIHBlci1yb3cgcmVhZCBwcmVmaXguXG4gKiBIZWxkIGJ5IHJlZmVyZW5jZSBhbmQgc3dhcHBlZCB3aG9sZSAoYHVzZUVuY29kaW5nYCksIG5ldmVyIGVkaXRlZCDigJQgdGhlIGVuZ2luZSBoYW5kcyB0aGUgcnVuJ3NcbiAqIGZyb3plbiBwb2xpY3kgaXRzZWxmLiBBYnNlbnQ6IGAnZnVsbCdgIHZhbHVlcyBhbmQgbm8gcmVhZCBwcmVmaXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRW5jb2Rpbmcge1xuICByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuLyoqXG4gKiBXaGF0IGEgc3RhZ2UgY2FuIHN0YWdlIChsYXcgNykg4oCUIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBvcCB2ZXJicyAoYGRlbHRhRW5jb2RpbmcudHMgwrcgT3BWZXJiYCksIG9uZVxuICogdW5pb24uIGBhcHBlbmRgIGlzIG5vdCBvbmU6IGl0IGlzIGhvdyB0aGUgbG9nIGVuY29kZXMgYSBncm93biBhcnJheSAoYCdkZWx0YSdgKS5cbiAqL1xuZXhwb3J0IHR5cGUgV3JpdGVWZXJiID0gT3BWZXJiO1xuXG4vKipcbiAqIFRoZSBieXRlcyBvZiBhIHJlZGFjdGlvbiB2ZXJkaWN0IGZvciBvbmUgd3JpdGUgKGxhdyA3KTogd2hpY2ggb2YgaXQgdGhlIGNvbW1pdCBsb2cgYW5kIHRoZSByZWRhY3RlZFxuICogbWlycm9yIG11c3Qgbm90IHNob3cuIFRoZSBlbmdpbmUgZGVjaWRlcyBpdCAoYHJlZGFjdGlvbi50cyDCtyBkZWNpZGVXcml0ZWApOyB0aGUgZnJhbWUgb25seSB3cml0ZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVTY3J1YiB7XG4gIC8qKiBUaGUgd2hvbGUgdmFsdWU6IGBMT0dfUExBQ0VIT0xERVJgIGF0IHRoZSB3cml0ZSdzIHBhdGguICovXG4gIHJlYWRvbmx5IHdob2xlPzogYm9vbGVhbjtcbiAgLyoqIERvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlLCByZWxhdGl2ZSB0byBpdDogYExPR19QTEFDRUhPTERFUmAgYXQgZWFjaCBvbmUgdGhhdCBob2xkcyBhIHZhbHVlLiAqL1xuICByZWFkb25seSBmaWVsZHM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY29yZEZyYW1lIHtcbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGUgaGVhcCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIHNoYXJlcy4gKi9cbiAgcmVhZG9ubHkgc3RhdGU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBsb2cgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICByZWFkb25seSBsb2c/OiBFdmVudExvZztcbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lICh7QGxpbmsgdXNlTWlycm9yfSkuICovXG4gIHByaXZhdGUgX21pcnJvcj86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFdoZXJlIHRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIChsYXcgMSkuICovXG4gIHByaXZhdGUgX2FkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIHR3byBkaWFscyAobGF3IDQsIDUpOyBhYnNlbnQg4oaSIHRoZSByZWNvcmQncyBkZWZhdWx0cy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGluZz86IFJlY29yZEVuY29kaW5nO1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGF0IHRoZSBmcmFtZSdzIEZJUlNUIHRvdWNoIChsYXcgMikg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuXG4gICAqIFNlZSB7QGxpbmsgZmlyc3RUb3VjaH0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50IHRoYXQgbWFrZXMgYSBiYXJlXG4gICAqIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgc3RhZ2UncyBzdGFnZWQgd3JpdGVzIOKAlCBidWlsdCBhdCBpdHMgZmlyc3Qgd3JpdGUgKGxhdyA0KSwgcmVsZWFzZWQgYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogS2V5cyB0cmFja2VkLXJlYWQgc28gZmFyLCBpbiBvcmRlciAobGF3IDUpIOKAlCB0aGUgc291cmNlIG9mIGVhY2ggc3RhZ2VkIHJvdydzIGByZWFkS2V5c2AuIE9ubHlcbiAgICogYWxsb2NhdGVkIHVuZGVyIGAncmVhZHMtcHJlZml4J2A7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICAgKiBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRLZXlzPzogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGU6IFNoYXJlZE1lbW9yeSwgbG9nPzogRXZlbnRMb2csIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5fYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgKGxhdyAxKS4gKi9cbiAgZ2V0IGFkZHJlc3MoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW5kIHdyaXRlIGF0IGBhZGRyZXNzYCBmcm9tIG5vdyBvbiDigJQgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlIChsYXcgMSk6IHRoZSBidWZmZXIga2VlcHNcbiAgICogdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0LiBUaGUgZW5naW5lJ3Mgb25lIGNhbGxlciwgYFN0YWdlQ29udGV4dCDCtyB1c2VBZGRyZXNzT2ZgLCByZWZ1c2VzIGEgbW92ZVxuICAgKiBvbmNlIHRoZSBmcmFtZSBoYXMgc3RhZ2VkLlxuICAgKi9cbiAgdXNlQWRkcmVzcyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFRoZSB0d28gZGlhbHMgdGhlIGZyYW1lIGVuY29kZXMgdW5kZXIgZnJvbSBpdHMgbmV4dCBidWZmZXIgYW5kIGl0cyBuZXh0IHJlYWQgb24gKGxhdyA0LCA1KS4gKi9cbiAgdXNlRW5jb2RpbmcoZW5jb2Rpbmc6IFJlY29yZEVuY29kaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB9XG5cbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IsIGlmIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICBnZXQgbWlycm9yKCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21pcnJvcjtcbiAgfVxuXG4gIC8qKiBMYW5kIGV2ZXJ5IGNvbW1pdCBmcm9tIG5vdyBvbiBvbiBgbWlycm9yYCB0b28sIHdpdGggdGhlIHNjcnViYmVkIHJvd3MgdGhlIGxvZyB0YWtlcyAoYHJlY29yZENvbW1pdGApLiAqL1xuICB1c2VNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogVGhlIGFic29sdXRlIHBhdGggb2YgYGtleWAgdW5kZXIgYHBhdGhgOiB0aGUgZnJhbWUncyBhZGRyZXNzLCB0aGVuIHRoZSBwYXRoLCB0aGVuIHRoZSBrZXkuICovXG4gIGF0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyBFdmVyeSByZWFkIGFuZCB3cml0ZSBidWlsZHMgb25lLiBUaGUgcm9vdCdzIGlzIHRoZSBwYXRoIGFuZCB0aGUga2V5OyB1bmRlciBhbiBhZGRyZXNzLCBhblxuICAgIC8vIGluZGV4IGxvb3Ag4oCUIHRoZSBkb3VibGUgc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aCwga2V5XWAgY29zdHMgYSB0aGlyZCBtb3JlIHBlciBjYWxsXG4gICAgLy8gKGFzIGB1dGlscyDCtyBwYXRoVW5kZXJgIGZvdW5kIGZvciB0aGUgYWRkcmVzcyBhbmQgdGhlIHBhdGgpLlxuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLl9hZGRyZXNzO1xuICAgIGlmIChhZGRyZXNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmc+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGggKyAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGtleTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggYmFzZSAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBmcmFtZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIG9yXG4gICAqIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC4gU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogd3JpdGUgKHtAbGluayByZWFkfSkgYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZCBzdGF0ZSBpc1xuICAgKiBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZSBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluXG4gICAqIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWEgYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdFxuICAgKiBjb3BpZXMgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlciBlZGl0cyBhXG4gICAqIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpc1xuICAgKiBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlcidzIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGUgc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0XG4gICAqIHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGVcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3RcbiAgICogd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmUgbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGRcbiAgICogd3JpdGVzIHVuZGVyIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYSBgc2V0R2xvYmFsYCBmcm9tXG4gICAqIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieSBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nXG4gICAqIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQVxuICAgKiBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLCBtYWtpbmcgaXRzXG4gICAqIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKSByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLlxuICAgKiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXMgdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUXG4gICAqIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnQgaW4gdGhlIHZpZXcgYXQgZmlyc3RcbiAgICogdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXQgZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUnc1xuICAgKiBleGFjdCBmYWxsYmFjayDigJQgYSBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmQgc3RheXNcbiAgICogdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2goKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5iYXNlKSB7XG4gICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZyYW1lJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZCB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0XG4gICAqIHtAbGluayByZWFkfSBzZXJ2ZXMgZnJvbSB0aGUgZmlyc3QtdG91Y2ggYmFzZSBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhbiBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoXG4gICAqIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGUgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3NcbiAgICogYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXMgZnJhbWUncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZGlmZiBiYXNlIG11c3Qgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWUge0BsaW5rIGZpcnN0VG91Y2h9LlxuICAgKlxuICAgKiBQcml2YXRlIHNpbmNlIEM0OiBldmVyeSB3cml0ZSBnb2VzIHRocm91Z2gge0BsaW5rIHdyaXRlfSwgc28gdGhlIHNjcnViIHRyYXZlbHMgd2l0aCB0aGUgb3AuXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKTogaGFuZCB0aGUgYnVmZmVyIGEgbGl2ZSB2aWV3IG9mIHRoaXMgZnJhbWUncyByZWFkIHByZWZpeCDigJRcbiAgICAgIC8vIGV2YWx1YXRlZCBBVCBFQUNIIFdSSVRFLCBzbyBlYWNoIHN0YWdlZCBvcCBjYXB0dXJlcyBleGFjdGx5IHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0LlxuICAgICAgY29uc3QgcmVhZEtleXNQcm92aWRlciA9XG4gICAgICAgIHRoaXMuZW5jb2Rpbmc/LndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcgPyAoKSA9PiBbLi4uKHRoaXMucmVhZEtleXMgPz8gW10pXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBmcmFtZSdzIGFkZHJlc3MgKDkuMzAuMDogdGhlIGFkbWl0dGVkIHJlY29yZCByZWFkcyB0aGUgY29udGFpbmVycyB0aGVyZSBhcyB3aGVyZSB0aGVcbiAgICAgIC8vIHN0YWdlIHdyaXRlcywgbmV2ZXIgYXMgYSB2YWx1ZSBpdCByZWFkKS5cbiAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFRyYW5zYWN0aW9uQnVmZmVyKFxuICAgICAgICB0aGlzLmZpcnN0VG91Y2goKSxcbiAgICAgICAgdGhpcy5lbmNvZGluZz8uY29tbWl0VmFsdWVzLFxuICAgICAgICByZWFkS2V5c1Byb3ZpZGVyLFxuICAgICAgICB0aGlzLl9hZGRyZXNzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWdlIG9uZSB3cml0ZSAobGF3IDcpOiBgdmVyYmAgYXQgYHBhdGhgIOKAlCBhbiBhYnNvbHV0ZSBwYXRoLCB0aGUgYWRkcmVzcyBhbHJlYWR5IGpvaW5lZFxuICAgKiAoe0BsaW5rIGF0fSkg4oCUIGFuZCB0aGUgYnl0ZXMgb2YgaXRzIHJlZGFjdGlvbiB2ZXJkaWN0LiBUaGUgZmlyc3Qgd3JpdGUgYnVpbGRzIHRoZSBidWZmZXIgKGxhdyA0KS5cbiAgICpcbiAgICogVGhlIHNjcnViIHJlZ2lzdGVycyBwYXRocywgbmV2ZXIgdmFsdWVzOiBgd2hvbGVgIG1hcmtzIHRoZSBvcCdzIG93biBwYXRoLCBgZmllbGRzYCBlYWNoIGZpZWxkXG4gICAqIGluc2lkZSB0aGUgdmFsdWUgKGEgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoKTsgYHJlY29yZENvbW1pdGAgcHV0cyB0aGVcbiAgICogbG9nJ3MgcGxhY2Vob2xkZXIgd2hlcmV2ZXIgb25lIG9mIHRoZW0gaG9sZHMgYSB2YWx1ZSBhdCBjb21taXQsIGZvciB0aGUgbWlycm9yIGFuZCB0aGUgbG9nIG9ubHlcbiAgICogKGBzY3J1Yi50c2ApLiBMaXZlIHN0YXRlIHRha2VzIHRoZSB2YWx1ZSBhcyBpdCBpcy4gQSBwYXRoIG1hcmtlZCBieSBhIHdyaXRlIHRoYXQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZmlsdGVyIGRyb3BzIGdvZXMgd2l0aCBpdC5cbiAgICovXG4gIHdyaXRlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiB1bmtub3duLCB2ZXJiOiBXcml0ZVZlcmIsIHNjcnViPzogV3JpdGVTY3J1Yik6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBjb25zdCB3aG9sZSA9IHNjcnViPy53aG9sZSA9PT0gdHJ1ZTtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgYnVmZmVyLm1lcmdlKHBhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUocGF0aCwgd2hvbGUpO1xuICAgIGVsc2UgYnVmZmVyLnNldChwYXRoLCB2YWx1ZSwgd2hvbGUpO1xuICAgIGlmIChzY3J1Yj8uZmllbGRzICE9PSB1bmRlZmluZWQpIGJ1ZmZlci5tYXJrUmVkYWN0ZWRGaWVsZHMocGF0aCwgc2NydWIuZmllbGRzKTtcbiAgfVxuXG4gIC8qKiBIYXMgdGhlIGZyYW1lIHN0YWdlZCBhIHdyaXRlIHNpbmNlIGl0cyBsYXN0IHJlbGVhc2Ug4oCUIGRvZXMgaXRzIGJ1ZmZlciBleGlzdD8gKi9cbiAgZ2V0IGhhc1N0YWdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJhbWUncyByZWFkLCBtaXJyb3JpbmcgdGhlIGVhZ2VyIGVuZ2luZSdzIHJlYWQgb3JkZXIgYnl0ZS1mb3ItYnl0ZSAobGF3IDMpOlxuICAgKlxuICAgKiAgICAxLiBzdGFnZWQgd3JpdGVzICsgZmlyc3QtdG91Y2ggc25hcHNob3Qg4oCUIGBidWZmZXIuZ2V0YCBvdmVyIGl0cyB3b3JraW5nQ29weSB3aGVuIHRoZSBidWZmZXJcbiAgICogICAgICAgZXhpc3RzLCBlbHNlIGBuYXRpdmVHZXRgIG92ZXIgdGhlIHplcm8tY2xvbmUgZmlyc3QtdG91Y2ggYmFzZSAodGhlIGJ1ZmZlcidzIGJhc2UgSVMgdGhhdFxuICAgKiAgICAgICB2aWV3LCBzbyB0aGUgdHdvIHRpZXJzIGFncmVlIG9uIGNvbnRlbnQpO1xuICAgKiAgICAyLiBMSVZFIHN0YXRlIHZpYSBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCBmb3Iga2V5cyBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3Qg4oCUIGluY2x1ZGluZyBpdHNcbiAgICogICAgICAgYWRkcmVzc+KGknJvb3QgZmFsbGJhY2suIFRoZSBlYWdlciBlbmdpbmUgaGFkIHRoaXMgZXhhY3QgbGl2ZSBmYWxsYmFjayBmb3Igc25hcHNob3QtbWlzc2luZ1xuICAgKiAgICAgICBrZXlzOyBieXRlLWlkZW50aXR5IG92ZXIgcHVyaXR5LiBBZnRlciB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSBzdWNoIGEgdmFsdWUgY2FuIGJlIHRoZSB2ZXJ5XG4gICAqICAgICAgIGNvbnRhaW5lciB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGhvbGRzIGF0IHRoZSBwYXRoICh0aGUgc3RhZ2UgZGVsZXRlZCBvciB1bnNldCBpdCwgb3JcbiAgICogICAgICAgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQpLCBzbyB0aGUgYmFzZSBpcyBkZXRhY2hlZCB0aGVyZSBmaXJzdFxuICAgKiAgICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKTogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGUgdmFsdWUgKG91dCBvZiBjb250cmFjdCkgd3JpdHRlblxuICAgKiAgICAgICBiYWNrIGlzIHJlY29yZGVkLCBhcyBvbiA5LjI4LjAsIHdob3NlIGJhc2Ugd2FzIGEgY2xvbmUgdGFrZW4gYXQgdGhlIGZpcnN0IHdyaXRlLlxuICAgKlxuICAgKiBSZWFkcyBuZXZlciBjb25zdHJ1Y3QgdGhlIGJ1ZmZlciAoIzEzKTogYSBmcmFtZSB0aGF0IG5ldmVyIHdyaXRlcyBwZXJmb3JtcyB6ZXJvIGNsb25lcyBvZiB0aGVcbiAgICogc2hhcmVkIHN0YXRlLlxuICAgKi9cbiAgcmVhZChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgYXQgPSB0aGlzLmF0KHBhdGgsIGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGZyb21TbmFwc2hvdCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuZ2V0KGF0KSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgYXQpO1xuICAgIGlmICh0eXBlb2YgZnJvbVNuYXBzaG90ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZyb21TbmFwc2hvdDtcbiAgICBjb25zdCBsaXZlID0gdGhpcy5zdGF0ZS5nZXRWYWx1ZSh0aGlzLl9hZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIC8vIFRpZXIgMiBhZnRlciB0aGUgZmlyc3Qgd3JpdGU6IGtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCAoc2VlIGFib3ZlKS5cbiAgICBpZiAodGhpcy5idWZmZXIgJiYgbGl2ZSAhPT0gbnVsbCAmJiB0eXBlb2YgbGl2ZSA9PT0gJ29iamVjdCcpIHRoaXMuYnVmZmVyLmRldGFjaEJhc2UoYXQpO1xuICAgIHJldHVybiBsaXZlO1xuICB9XG5cbiAgLyoqIFB1dCBhIHRyYWNrZWQgcmVhZCdzIHVzZXItbGV2ZWwga2V5IG9uIHRoZSByZWFkS2V5cyBsaXN0IChsYXcgNSkg4oCUIGEgbm8tb3AgdW5sZXNzIHRoZSBmcmFtZSBrZWVwcyBvbmUuICovXG4gIG5vdGVSZWFkKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVuY29kaW5nPy53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnKSB7XG4gICAgICAodGhpcy5yZWFkS2V5cyA/Pz0gbmV3IFNldCgpKS5hZGQocGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSBjb21taXR0ZWQgc3RhdGUgYXQgYGtleWA6IGF0IHRoZSBmcmFtZSdzIGFkZHJlc3MsIGVsc2UgYXQgdGhlIHJvb3Qg4oCUIG5ldmVyIHRoZSBzdGFnZSdzIG93blxuICAgKiB2aWV3LiBUeXBlZCBhcyBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCB0eXBlcyBpdCwgd2hpY2ggYFN0YWdlQ29udGV4dCDCtyBnZXRSb290YCBoYW5kcyBvbi5cbiAgICovXG4gIHJlYWRMaXZlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZ2V0VmFsdWUodGhpcy5fYWRkcmVzcywgW10sIGtleSk7XG4gIH1cblxuICAvKiogTGl2ZSBjb21taXR0ZWQgc3RhdGUgYXQgYGtleWAgYXQgdGhlIHJvb3Qg4oCUIHR5cGVkIGFzIGBTaGFyZWRNZW1vcnkgwrcgZ2V0VmFsdWVgIChgU3RhZ2VDb250ZXh0IMK3IGdldEdsb2JhbGApLiAqL1xuICByZWFkR2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZ2V0VmFsdWUoW10sIFtdLCBrZXkpO1xuICB9XG5cbiAgLyoqIERpZCBhIHN0YWdlZCBvcCB0b3VjaCBgcGF0aGAg4oCUIG9uIGl0LCBhYm92ZSBpdCBvciBiZWxvdyBpdD8gKEEgcmVwb3J0J3MgcXVlc3Rpb247IG5ldmVyIHRoZSBob3QgcGF0aC4pICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5idWZmZXIud2FzU3RhZ2VkKHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBhdCBgcGF0aGAgaW4gd2hhdCB0aGUgc3RhZ2UgaGFzIHNlZW4g4oCUIGl0cyB3b3JraW5nIGNvcHkgb25jZSBpdCB3cm90ZSwgZWxzZSBpdHNcbiAgICogZmlyc3QtdG91Y2ggYmFzZSDigJQgV0lUSE9VVCB0YWtpbmcgYSBwcml2YXRlIGNvcHk6IGZvciBhIHJlcG9ydCB0aGF0IG9ubHkgY29tcGFyZXMuXG4gICAqL1xuICBwZWVrKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5wZWVrKHBhdGgpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaCgpLCBwYXRoKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmFsdWUgYXQgYHBhdGhgIGluIHRoZSBmaXJzdC10b3VjaCBiYXNlIOKAlCBjb21taXR0ZWQgc3RhdGUgYXMgdGhlIGZyYW1lIGZpcnN0IHRvdWNoZWQgaXQuICovXG4gIGJhc2VBdChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHdoYXQgdGhlIGZyYW1lIHN0YWdlZCAobGF3IDYpOiB0aGUgYnVmZmVyJ3MgcGF5bG9hZCBmaXJzdCDigJQgbm9uZSwgdGhlIGVtcHR5IGNvbW1pdCwgd2hlblxuICAgKiBpdCBzdGFnZWQgbm90aGluZyAoIzEzOiB6ZXJvIGNsb25lcykg4oCUIHRoZW4gdGhlIG5hbWVzIChgc3RhbXBPZigpYCksIHJlYWQgb25jZSB0aGUgcGF5bG9hZCBpc1xuICAgKiBidWlsdCwgYW5kIGJvdGggdG8gYHJlY29yZENvbW1pdGAuIFVzZXIgY29kZSBjYW4gcnVuIHdoaWxlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0IChhIGdldHRlciBvbiBhXG4gICAqIHN0YWdlZCB2YWx1ZSwgd2hpY2ggdGhlIG5ldC1jaGFuZ2UgY29tcGFyZSBhbmQgdGhlIGNsb25lIGludm9rZSk7IHdoYXQgaXQgYWRkcyB0byB0aGUgbmFtZXMg4oCUXG4gICAqIGFuIHVudHJhY2tlZCByZWFkLCBzYXkg4oCUIGlzIG9uIHRoZSBidW5kbGUuXG4gICAqL1xuICBjb21taXQoc3RhbXBPZjogKCkgPT4gQ29tbWl0U3RhbXApOiB2b2lkIHtcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5idWZmZXI/LmNvbW1pdCgpO1xuICAgIHJlY29yZENvbW1pdChwYXlsb2FkLCBzdGFtcE9mKCksIHsgc3RhdGU6IHRoaXMuc3RhdGUsIG1pcnJvcjogdGhpcy5fbWlycm9yLCBsb2c6IHRoaXMubG9nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgZnJhbWUncyBob2xkIG9uIHN0YXRlICgjMTNiLCBsYXcgNik6IGRyb3AgdGhlIGJ1ZmZlciAoaXRzIHdvcmtpbmcgY29weSBhbmQgd2hhdGV2ZXIgcHJpdmF0ZVxuICAgKiBjb3BpZXMgaXRzIHJlYWRzIHRvb2spIGFuZCB0aGUgZmlyc3QtdG91Y2ggYmFzZSAoYSByZWZlcmVuY2UgdGhhdCBwaW5zIG9uZSBjb21taXR0ZWQtc3RhdGVcbiAgICogR0VORVJBVElPTikuIEJvdGggcmUtY3JlYXRlIGxhemlseTogYSBsYXRlciByZWFkIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlLCBhbmQgYVxuICAgKiBsYXRlciB3cml0ZSBidWlsZHMgYSBmcmVzaCBidWZmZXIgb24gaXQg4oCUIHNvIGEgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHRoZSBzdGF0ZSBhZnRlciB0aGVcbiAgICogZmlyc3QuIFdpdGhvdXQgdGhlIHJlbGVhc2UsIHRoZSBleGVjdXRpb24gdHJlZSDigJQgd2hpY2ggcmV0YWlucyBldmVyeSBmcmFtZSBmb3IgdGhlIGxpZmV0aW1lIG9mXG4gICAqIHRoZSBydW4g4oCUIHJldGFpbnMgb25lIHN0YXRlIGdlbmVyYXRpb24gcGVyIGV4ZWN1dGVkIHN0YWdlIChtZWFzdXJlZCBPKE7CsikgYmVmb3JlIGNvcHktb24td3JpdGU7XG4gICAqIGEgNTAwLWl0ZXJhdGlvbiBhZ2VudCBPT01lZCBhIGRlZmF1bHQgTm9kZSBoZWFwLCBiYWNrbG9nICMxOCkuXG4gICAqL1xuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYmFzZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhlIGZyYW1lIHN0YWdlZCBhbmQgcmVhZCAobGF3IDYpOiB0aGUgYnVmZmVyLCB0aGUgZmlyc3QtdG91Y2ggYmFzZSAodGhlIG5leHRcbiAgICogYXR0ZW1wdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhcyBpdCBzdGFuZHMgTk9XKSBhbmQgdGhlIHJlYWRLZXlzIGxpc3Qg4oCUIGEgZGlzY2FyZGVkXG4gICAqIGF0dGVtcHQncyByZWFkcyBtdXN0IG5ldmVyIHJlYWNoIHRoZSBuZXh0IGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIG9yIGEgYmFja3dhcmQgc2xpY2VcbiAgICogd291bGQgZm9sbG93IGFuIGVkZ2UgdGhhdCBubyBjb21taXR0ZWQgd3JpdGUgZXZlciBoYWQuIE5vdGhpbmcgaXMgcmVjb3JkZWQuXG4gICAqL1xuICBkaXNjYXJkKCk6IHZvaWQge1xuICAgIHRoaXMucmVsZWFzZSgpO1xuICAgIHRoaXMucmVhZEtleXMgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Like a runtime heap with namespace isolation:
|
|
5
5
|
* - A value is written at an ADDRESS — a path prefix the caller computed
|
|
6
|
-
* (C2: the engine's frame decides it, `
|
|
6
|
+
* (C2: the engine's frame decides it, `runAddress.ts · runAddress`) — and read
|
|
7
7
|
* there first, then at the root
|
|
8
8
|
* - Default values seed the root, and the container at an address when a
|
|
9
9
|
* write creates it
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Like a runtime heap with namespace isolation:
|
|
5
5
|
* - A value is written at an ADDRESS — a path prefix the caller computed
|
|
6
|
-
* (C2: the engine's frame decides it, `
|
|
6
|
+
* (C2: the engine's frame decides it, `runAddress.ts · runAddress`) — and read
|
|
7
7
|
* there first, then at the root
|
|
8
8
|
* - Default values seed the root, and the container at an address when a
|
|
9
9
|
* write creates it
|
|
@@ -79,4 +79,4 @@ export class SharedMemory {
|
|
|
79
79
|
this.context = nextGeneration(this.context, updates, overwrite, trace);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXJILE1BQU0sT0FBTyxZQUFZO0lBQ2YsT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDckMsY0FBYyxDQUFXO0lBRWpDLFlBQVksYUFBdUIsRUFBRSxjQUF3QjtRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRixDQUFDO0lBRUQsMkdBQTJHO0lBQzNHLFdBQVcsQ0FBQyxPQUEwQixFQUFFLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUEyQixFQUFFLElBQWUsRUFBRSxHQUFZO1FBQ2pFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0UsT0FBTyxPQUFPLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxzR0FBc0c7SUFDdEcsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsa0dBQWtHO0lBQ2xHLFVBQVUsQ0FBQyxTQUFzQixFQUFFLE9BQW9CLEVBQUUsS0FBbUI7UUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkTWVtb3J5IOKAlCBUaGUgc2hhcmVkIHN0YXRlIGNvbnRhaW5lciBmb3IgYWxsIGZsb3djaGFydCBleGVjdXRpb25cbiAqXG4gKiBMaWtlIGEgcnVudGltZSBoZWFwIHdpdGggbmFtZXNwYWNlIGlzb2xhdGlvbjpcbiAqIC0gQSB2YWx1ZSBpcyB3cml0dGVuIGF0IGFuIEFERFJFU1Mg4oCUIGEgcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZFxuICogICAoQzI6IHRoZSBlbmdpbmUncyBmcmFtZSBkZWNpZGVzIGl0LCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkg4oCUIGFuZCByZWFkXG4gKiAgIHRoZXJlIGZpcnN0LCB0aGVuIGF0IHRoZSByb290XG4gKiAtIERlZmF1bHQgdmFsdWVzIHNlZWQgdGhlIHJvb3QsIGFuZCB0aGUgY29udGFpbmVyIGF0IGFuIGFkZHJlc3Mgd2hlbiBhXG4gKiAgIHdyaXRlIGNyZWF0ZXMgaXRcbiAqIC0gQWNjZXB0cyBjb21taXQgYnVuZGxlcyBmcm9tIFRyYW5zYWN0aW9uQnVmZmVyXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKTpcbiAqIGBjb250ZXh0YCBpcyBhIEdFTkVSQVRJT04sIGFuZCBhIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBFdmVyeSB3cml0ZSDigJRcbiAqIGBhcHBseVBhdGNoYCAoYSBzdGFnZSBjb21taXQpLCBgc2V0VmFsdWVgLCBgdXBkYXRlVmFsdWVgIOKAlCBidWlsZHMgdGhlIG5leHRcbiAqIGdlbmVyYXRpb24gYnkgY29weWluZyB0aGUgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gZWFjaCB3cml0dGVuIHBhdGgsXG4gKiBzaGFyZXMgZXZlcnkgb3RoZXIgc3VidHJlZSB3aXRoIHRoZSBnZW5lcmF0aW9uIGJlZm9yZSBpdCwgYW5kIHN3YXBzLiBTbyBhXG4gKiBnZW5lcmF0aW9uIGEgc3RhZ2UgY2FwdHVyZWQgKGl0cyBmaXJzdC10b3VjaCB2aWV3LCBpdHMgdHJhbnNhY3Rpb25cbiAqIGJ1ZmZlcidzIGRpZmYgYmFzZSkgc3RheXMgZXhhY3RseSB3aGF0IGl0IHdhcywgYW5kIGEgd3JpdGUgY29zdHMgTyh3aGF0IGl0XG4gKiB3cm90ZSksIG5vdCBPKHN0YXRlKS5cbiAqL1xuXG5pbXBvcnQgeyBtZXJnZUNvbnRleHRXaW5zLCBvd25lZFJvb3RPZiwgb3duU3BpbmUgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmVzdGVkVmFsdWUsIGdldFJ1bkFuZEdsb2JhbFBhdGhzLCBuZXh0R2VuZXJhdGlvbiwgc2V0TmVzdGVkVmFsdWUsIHVwZGF0ZU5lc3RlZFZhbHVlIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGFyZWRNZW1vcnkge1xuICBwcml2YXRlIGNvbnRleHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlcz86IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlcz86IHVua25vd24sIGluaXRpYWxDb250ZXh0PzogdW5rbm93bikge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VmFsdWVzO1xuICAgIGNvbnN0IHNlZWQgPSBtZXJnZUNvbnRleHRXaW5zKGluaXRpYWxDb250ZXh0IHx8IHt9LCBkZWZhdWx0VmFsdWVzIHx8IHt9KTtcbiAgICAvLyBEZXRhY2hlZCBPTkNFLCBoZXJlOiBgbWVyZ2VDb250ZXh0V2luc2AgY29waWVzIG9ubHkgdGhlIHRvcCBsZXZlbCwgc29cbiAgICAvLyB0aGUgc2VlZCdzIG5lc3RlZCB2YWx1ZXMgYXJlIHRoZSBjYWxsZXIncyBvd24gb2JqZWN0cy4gQmVmb3JlIDkuMjkuMFxuICAgIC8vIHRoZSBmaXJzdCBjb21taXQncyB3aG9sZS1zdGF0ZSBjbG9uZSBkZXRhY2hlZCB0aGVtIChhbmQgdW50aWwgdGhlbiBhXG4gICAgLy8gY2FsbGVyIG11dGF0aW5nIGl0cyBgaW5pdGlhbENvbnRleHRgIGNoYW5nZWQgbGl2ZSBzdGF0ZSB3aXRoIG5vIHJvdyk7XG4gICAgLy8gbm90aGluZyByZS1jbG9uZXMgdGhlIHN0YXRlIGFueSBtb3JlLCBzbyB0aGUgc2VlZCBpcyBkZXRhY2hlZCBhdFxuICAgIC8vIGNvbnN0cnVjdGlvbiDigJQgb25lIGNsb25lIHBlciBydW50aW1lLCBub3Qgb25lIHBlciBjb21taXQuXG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmtleXMoc2VlZCkubGVuZ3RoID4gMCA/IHN0cnVjdHVyZWRDbG9uZShzZWVkKSA6IHNlZWQ7XG4gIH1cblxuICAvKiogR2V0cyBhIGNsb25lIG9mIHRoZSBkZWZhdWx0IHZhbHVlcy4gKi9cbiAgZ2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlcyA/IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9kZWZhdWx0VmFsdWVzKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBVcGRhdGVzIGEgdmFsdWUgYXQgYGFkZHJlc3NgICsgYHBhdGhgIHVzaW5nIG1lcmdlIHNlbWFudGljcywgYXMgYSBuZXcgZ2VuZXJhdGlvbiAocGF0aCBjb3B5ICsgc3dhcCkuICovXG4gIHVwZGF0ZVZhbHVlKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3duZWRQYXRoVG8oYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICB1cGRhdGVOZXN0ZWRWYWx1ZShuZXh0LCBhZGRyZXNzLCBwYXRoLCBrZXksIHZhbHVlLCB0aGlzLmdldERlZmF1bHRWYWx1ZXMoKSk7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dDtcbiAgfVxuXG4gIC8qKiBTZXRzIGEgdmFsdWUgYXQgYGFkZHJlc3NgICsgYHBhdGhgIHVzaW5nIG92ZXJ3cml0ZSBzZW1hbnRpY3MsIGFzIGEgbmV3IGdlbmVyYXRpb24gKHBhdGggY29weSArIHN3YXApLiAqL1xuICBzZXRWYWx1ZShhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm93bmVkUGF0aFRvKGFkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgc2V0TmVzdGVkVmFsdWUobmV4dCwgYWRkcmVzcywgcGF0aCwga2V5LCB2YWx1ZSwgdGhpcy5nZXREZWZhdWx0VmFsdWVzKCkpO1xuICAgIHRoaXMuY29udGV4dCA9IG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBjb3B5IG9mIHRoZSBjdXJyZW50IGdlbmVyYXRpb24ncyByb290IHdob3NlIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0b1xuICAgKiBga2V5YCBhcmUgb3duZWQg4oCUIHRoZSBpbi1wbGFjZSBoZWxwZXJzIGFib3ZlIHRoZW4gZWRpdCBvbmx5IGNvcGllcy5cbiAgICovXG4gIHByaXZhdGUgb3duZWRQYXRoVG8oYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IHJvb3QgPSBvd25lZFJvb3RPZih0aGlzLmNvbnRleHQsIG93bmVkKTtcbiAgICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3MsIHBhdGgpO1xuICAgIG93blNwaW5lKHJvb3QsIFsuLi4ocnVuUGF0aCB8fCBnbG9iYWxQYXRoKSwga2V5XSwgb3duZWQpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgdmFsdWUgZnJvbSB0aGUgc3RvcmUuXG4gICAqIExvb2tzIHVwIGF0IGBhZGRyZXNzYCBmaXJzdCwgZmFsbHMgYmFjayB0byB0aGUgcm9vdC5cbiAgICovXG4gIGdldFZhbHVlKGFkZHJlc3M/OiByZWFkb25seSBzdHJpbmdbXSwgcGF0aD86IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHsgZ2xvYmFsUGF0aCwgcnVuUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzcywgcGF0aCk7XG4gICAgY29uc3QgdmFsdWUgPSBydW5QYXRoID8gZ2V0TmVzdGVkVmFsdWUodGhpcy5jb250ZXh0LCBydW5QYXRoLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiBnZXROZXN0ZWRWYWx1ZSh0aGlzLmNvbnRleHQsIGdsb2JhbFBhdGgsIGtleSk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgZW50aXJlIHN0YXRlIGFzIGEgSlNPTiBvYmplY3Qg4oCUIHRoZSBjdXJyZW50IGdlbmVyYXRpb24sIGJ5IHJlZmVyZW5jZS4gTmV2ZXIgbXV0YXRlIGl0LiAqL1xuICBnZXRTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgfVxuXG4gIC8qKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSBmcm9tIFRyYW5zYWN0aW9uQnVmZmVyOiBidWlsZHMgdGhlIG5leHQgZ2VuZXJhdGlvbiBhbmQgc3dhcHMgaXQgaW4uICovXG4gIGFwcGx5UGF0Y2gob3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdXBkYXRlczogTWVtb3J5UGF0Y2gsIHRyYWNlOiBUcmFjZUVudHJ5W10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0R2VuZXJhdGlvbih0aGlzLmNvbnRleHQsIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UpO1xuICB9XG59XG4iXX0=
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Like a stack frame in a compiler/runtime:
|
|
5
5
|
* - A RecordFrame — the record half (C3): the heap, the address, the
|
|
6
|
-
* first-touch base, the lazy transaction buffer
|
|
6
|
+
* first-touch base, the lazy transaction buffer and every write's scrub
|
|
7
|
+
* (C4), the readKeys list
|
|
7
8
|
* - Links to parent/child/next contexts (call stack frames)
|
|
8
9
|
* - What belongs to a stage inside a run: retention of reads and writes, the
|
|
9
|
-
* redaction
|
|
10
|
+
* redaction decision per write (`redaction.ts · decideWrite`) and where the
|
|
11
|
+
* frame writes (`runAddress.ts`), the dev-mode warnings, the commit observer
|
|
10
12
|
* - DiagnosticCollector for logs, errors, metrics
|
|
11
13
|
*/
|
|
12
14
|
import { type DiagnosticChannel, DiagnosticCollector } from './DiagnosticCollector.js';
|
|
@@ -206,10 +208,10 @@ export declare class StageContext {
|
|
|
206
208
|
* and stores nothing under `'off'` (entry skipped entirely — nothing to
|
|
207
209
|
* leak). A field-level verdict scrubs a clone BEFORE the dial sees it, so
|
|
208
210
|
* a summary preview can never show the secret either. The verdict is the
|
|
209
|
-
* one `stageWrite`
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
* `
|
|
211
|
+
* one `stageWrite` decided BEFORE staging, carried to commit with the
|
|
212
|
+
* value. The staged write itself is unaffected — redaction of the
|
|
213
|
+
* committed payload is the record frame's scrub of that write
|
|
214
|
+
* (`RecordFrame · write`, then `scrub.ts` at commit).
|
|
213
215
|
*/
|
|
214
216
|
private trackWrite;
|
|
215
217
|
/**
|
|
@@ -243,14 +245,19 @@ export declare class StageContext {
|
|
|
243
245
|
/**
|
|
244
246
|
* THE ONE FUNNEL every staged write passes through — facade writes AND
|
|
245
247
|
* the paths that bypass the facade (subflow seed, `outputMapper`
|
|
246
|
-
* merge-back, resume re-seed).
|
|
247
|
-
*
|
|
248
|
-
*
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
248
|
+
* merge-back, resume re-seed). Two owners (C4): the run's rule DECIDES,
|
|
249
|
+
* the record frame WRITES the verdict's bytes, in four steps
|
|
250
|
+
* (`redaction.ts`, "The write decision"):
|
|
251
|
+
* 1. the verdict — `decideWrite`, under the rule active as the write begins;
|
|
252
|
+
* 2. identity inheritance — `inheritByIdentity`, against this frame's
|
|
253
|
+
* selected reads as they stand after step 1;
|
|
254
|
+
* 3. the bytes — `RecordFrame · write`, the op and its scrub (the whole
|
|
255
|
+
* value, or the fields inside it);
|
|
256
|
+
* 4. the marks — `markStagedWrite`, only once the write staged, so a
|
|
257
|
+
* write that fails to stage marks nothing.
|
|
258
|
+
* Each step reads the rule (and the selected reads) when it acts, as this
|
|
259
|
+
* funnel always did. Returns the verdict so the caller retains and reports
|
|
260
|
+
* under the same decision.
|
|
254
261
|
*/
|
|
255
262
|
private stageWrite;
|
|
256
263
|
/**
|