footprintjs 9.45.0 → 9.46.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.
@@ -5,7 +5,7 @@
5
5
  * path inside the value I read, put this". The value it read is BORROWED —
6
6
  * before a stage's first staged write it is a bare reference into committed
7
7
  * shared memory, and committed state is immutable-after-swap (see
8
- * `StageContext.firstTouchState`). Editing it in place would corrupt every
8
+ * `RecordFrame · firstTouch`). Editing it in place would corrupt every
9
9
  * in-flight stage AND leave the commit log with nothing to record.
10
10
  *
11
11
  * So the write path never mutates. It COPIES the containers along the path
@@ -101,4 +101,4 @@ export function deleteInPath(root, segments) {
101
101
  copy[segment] = replaced;
102
102
  return copy;
103
103
  }
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJhbFdyaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgseUZBQXlGO0FBQ3pGLFNBQVMsYUFBYSxDQUFDLElBQWE7SUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLEdBQUksSUFBZ0MsRUFBRSxDQUFDO0lBQy9GLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQVMsT0FBTyxDQUFDLElBQWEsRUFBRSxPQUFlO0lBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFhLEVBQUUsUUFBMkIsRUFBRSxLQUFjO0lBQ2xGLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7O1FBQzFDLElBQWdDLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWEsRUFBRSxRQUEyQjtJQUNyRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxJQUFLLElBQWtCLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNyRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUksSUFBa0IsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBSSxJQUFnQyxFQUFFLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUUsSUFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLFFBQVEsS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDOztRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzlCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvc3RydWN0dXJhbFdyaXRlIC0tIEJ1aWxkIHRoZSBORVhUIHZhbHVlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGxhc3Qgb25lLlxuICpcbiAqIEV2ZXJ5IGRlZXAgd3JpdGUgdGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgaGFzIHRoZSBzYW1lIHNoYXBlOiBcImF0IHRoaXNcbiAqIHBhdGggaW5zaWRlIHRoZSB2YWx1ZSBJIHJlYWQsIHB1dCB0aGlzXCIuIFRoZSB2YWx1ZSBpdCByZWFkIGlzIEJPUlJPV0VEIOKAlFxuICogYmVmb3JlIGEgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgaXQgaXMgYSBiYXJlIHJlZmVyZW5jZSBpbnRvIGNvbW1pdHRlZFxuICogc2hhcmVkIG1lbW9yeSwgYW5kIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCAoc2VlXG4gKiBgU3RhZ2VDb250ZXh0LmZpcnN0VG91Y2hTdGF0ZWApLiBFZGl0aW5nIGl0IGluIHBsYWNlIHdvdWxkIGNvcnJ1cHQgZXZlcnlcbiAqIGluLWZsaWdodCBzdGFnZSBBTkQgbGVhdmUgdGhlIGNvbW1pdCBsb2cgd2l0aCBub3RoaW5nIHRvIHJlY29yZC5cbiAqXG4gKiBTbyB0aGUgd3JpdGUgcGF0aCBuZXZlciBtdXRhdGVzLiBJdCBDT1BJRVMgdGhlIGNvbnRhaW5lcnMgYWxvbmcgdGhlIHBhdGhcbiAqIChhbmQgb25seSB0aG9zZSkgYW5kIHJldHVybnMgYSBuZXcgcm9vdCwgbGVhdmluZyBldmVyeSB1bnRvdWNoZWQgc2libGluZ1xuICogc2hhcmVkIGJ5IHJlZmVyZW5jZSDigJQgdGhlIHNhbWUgemVyby1jbG9uZSBiYXJnYWluIHRoZSBmaXJzdC10b3VjaCB2aWV3XG4gKiBhbHJlYWR5IG1ha2VzLiBUaGUgYnVmZmVyIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB3aGF0IGl0IHN0YWdlcywgc28gdGhlXG4gKiBkZXRhY2hpbmcgaGFwcGVucyBvbmNlLCBhdCB0aGUgYm91bmRhcnkgdGhhdCBuZWVkcyBpdC5cbiAqL1xuXG4vKlxuICogVW50aWwgOS4yNC4wIHRoaXMgbW9kdWxlIGFsc28gb3duZWQgYHVud3JhcFByb3h5YCwgYSBKU09OIHJvdW5kLXRyaXAgb2ZcbiAqIGV2ZXJ5IEFTU0lHTkVEIHZhbHVlIOKAlCB0aGUgb25seSB3YXkgdGhlbiB0byBrZWVwIHRoZSBzY29wZSdzIG93biBQcm94aWVzXG4gKiBvdXQgb2YgdGhlIGJ1ZmZlci4gSXQgY29zdCBhIGBEYXRlYCBpdHMgdHlwZSBhbmQgYSBgTWFwYCBpdHMgbWVtYmVycywgYW5kXG4gKiBpdCBtYWRlIHRoZSB0cmFwIGFuZCBgJHNldFZhbHVlYCBzdG9yZSBkaWZmZXJlbnQgYnl0ZXMgZm9yIHRoZSBzYW1lIHZhbHVlXG4gKiAodGhlIG9sZCBsYW5kbWluZSAxKS4gVGhlIHNjb3BlJ3MgaGFuZGxlcyBhcmUgcmVjb2duaXNlZCBub3dcbiAqIChgaGFuZGxlcy50cyDCtyB1bndyYXBIYW5kbGVzYCwgTygxKSBlYWNoKSwgc28gdGhlIGFzc2lnbmVkIHZhbHVlIGdvZXMgdG9cbiAqIHRoZSBzaW5rIEFTIEFTU0lHTkVEIGFuZCB0aGUgYnVmZmVyJ3MgYHN0cnVjdHVyZWRDbG9uZWAgYXQgY29tbWl0IGlzIHRoZVxuICogb25lIGRldGFjaGluZyBzdGVwIOKAlCB0aGUgc2FtZSBsYXcgYCRzZXRWYWx1ZWAgaGFzIGFsd2F5cyBoYWQuXG4gKi9cblxuLyoqIFNoYWxsb3cgY29weSB0aGF0IHByZXNlcnZlcyBhcnJheS1uZXNzIOKAlCB0aGUgb25lIGNvbnRhaW5lciBjb3B5IHRoaXMgbW9kdWxlIG1ha2VzLiAqL1xuZnVuY3Rpb24gY29weUNvbnRhaW5lcihub2RlOiB1bmtub3duKTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBbLi4ubm9kZV07XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JykgcmV0dXJuIHsgLi4uKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gIC8vIE5vdCBhIGNvbnRhaW5lciAocHJpbWl0aXZlLCBudWxsLCB1bmRlZmluZWQpOiB0aGUgcGF0aCBjb250aW51ZXMgSU5UTyBpdCxcbiAgLy8gc28gaXQgYmVjb21lcyBhIGZyZXNoIG9iamVjdCDigJQgdGhlIHNhbWUgY29lcmNpb24gYG5hdGl2ZVNldGAgcGVyZm9ybXMuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqIEFuIGFycmF5IGluZGV4IHNlZ21lbnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNlZ21lbnQgbmFtZXMgYSBwcm9wZXJ0eS4gKi9cbmZ1bmN0aW9uIGluZGV4T2Yobm9kZTogdW5rbm93biwgc2VnbWVudDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpID0gTnVtYmVyKHNlZ21lbnQpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpKSAmJiBpID49IDAgPyBpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGNvcHkgb2YgYHJvb3RgIHdpdGggYHZhbHVlYCBhdCBgc2VnbWVudHNgLCBtdXRhdGluZyBub3RoaW5nLlxuICpcbiAqIENvbnRhaW5lcnMgb24gdGhlIHBhdGggYXJlIHNoYWxsb3ctY29waWVkIChhcnJheXMgc3RheSBhcnJheXMpOyBldmVyeXRoaW5nXG4gKiBvZmYgdGhlIHBhdGggaXMgc2hhcmVkIGJ5IHJlZmVyZW5jZS4gQW4gZW1wdHkgcGF0aCByZXR1cm5zIGB2YWx1ZWAgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SW5QYXRoKHJvb3Q6IHVua25vd24sIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBuZXh0ID0gY29weUNvbnRhaW5lcihyb290KTtcbiAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzWzBdO1xuICBjb25zdCBpbmRleCA9IGluZGV4T2YobmV4dCwgc2VnbWVudCk7XG4gIGNvbnN0IGNoaWxkID0gaW5kZXggIT09IHVuZGVmaW5lZCA/IG5leHRbaW5kZXhdIDogKG5leHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3NlZ21lbnRdO1xuICBjb25zdCByZXBsYWNlZCA9IHNldEluUGF0aChjaGlsZCwgc2VnbWVudHMuc2xpY2UoMSksIHZhbHVlKTtcbiAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIG5leHRbaW5kZXhdID0gcmVwbGFjZWQ7XG4gIGVsc2UgKG5leHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3NlZ21lbnRdID0gcmVwbGFjZWQ7XG4gIHJldHVybiBuZXh0O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGNvcHkgb2YgYHJvb3RgIHdpdGggdGhlIGtleSBhdCBgc2VnbWVudHNgIFJFTU9WRUQsIG11dGF0aW5nIG5vdGhpbmcuXG4gKlxuICogT24gYW4gYXJyYXkgdGhlIHNsb3QgaXMgcmVtb3ZlZCB3aXRoIGBzcGxpY2VgICh0aGUgYXJyYXkgc2hyaW5rcyDigJQgYGRlbGV0ZWBcbiAqIG9uIGFuIGFycmF5IGluZGV4IHdvdWxkIGxlYXZlIGEgaG9sZSwgd2hpY2ggY2Fubm90IHN1cnZpdmVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJvdW5kLXRyaXBzIGFzIHRoZSBzYW1lIHZhbHVlKS4gQSBwYXRoIHRoYXQgZG9lcyBub3RcbiAqIGV4aXN0IHJldHVybnMgdGhlIHJvb3QgdW5jaGFuZ2VkLCBieSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVJblBhdGgocm9vdDogdW5rbm93biwgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdW5rbm93biB7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChyb290ID09PSBudWxsIHx8IHR5cGVvZiByb290ICE9PSAnb2JqZWN0JykgcmV0dXJuIHJvb3Q7XG4gIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1swXTtcbiAgY29uc3QgaW5kZXggPSBpbmRleE9mKHJvb3QsIHNlZ21lbnQpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpbmRleCA+PSAocm9vdCBhcyB1bmtub3duW10pLmxlbmd0aCkgcmV0dXJuIHJvb3Q7XG4gICAgICBjb25zdCBjb3B5ID0gWy4uLihyb290IGFzIHVua25vd25bXSldO1xuICAgICAgY29weS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJvb3QsIHNlZ21lbnQpKSByZXR1cm4gcm9vdDtcbiAgICBjb25zdCBjb3B5ID0geyAuLi4ocm9vdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICBkZWxldGUgY29weVtzZWdtZW50XTtcbiAgICByZXR1cm4gY29weTtcbiAgfVxuICBjb25zdCBjaGlsZCA9IGluZGV4ICE9PSB1bmRlZmluZWQgPyAocm9vdCBhcyB1bmtub3duW10pW2luZGV4XSA6IChyb290IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtzZWdtZW50XTtcbiAgY29uc3QgcmVwbGFjZWQgPSBkZWxldGVJblBhdGgoY2hpbGQsIHNlZ21lbnRzLnNsaWNlKDEpKTtcbiAgaWYgKHJlcGxhY2VkID09PSBjaGlsZCkgcmV0dXJuIHJvb3Q7XG4gIGNvbnN0IGNvcHkgPSBjb3B5Q29udGFpbmVyKHJvb3QpO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgY29weVtpbmRleF0gPSByZXBsYWNlZDtcbiAgZWxzZSBjb3B5W3NlZ21lbnRdID0gcmVwbGFjZWQ7XG4gIHJldHVybiBjb3B5O1xufVxuIl19
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJhbFdyaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgseUZBQXlGO0FBQ3pGLFNBQVMsYUFBYSxDQUFDLElBQWE7SUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLEdBQUksSUFBZ0MsRUFBRSxDQUFDO0lBQy9GLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQVMsT0FBTyxDQUFDLElBQWEsRUFBRSxPQUFlO0lBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFhLEVBQUUsUUFBMkIsRUFBRSxLQUFjO0lBQ2xGLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7O1FBQzFDLElBQWdDLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWEsRUFBRSxRQUEyQjtJQUNyRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxJQUFLLElBQWtCLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNyRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUksSUFBa0IsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBSSxJQUFnQyxFQUFFLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUUsSUFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLFFBQVEsS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDOztRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzlCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvc3RydWN0dXJhbFdyaXRlIC0tIEJ1aWxkIHRoZSBORVhUIHZhbHVlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGxhc3Qgb25lLlxuICpcbiAqIEV2ZXJ5IGRlZXAgd3JpdGUgdGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgaGFzIHRoZSBzYW1lIHNoYXBlOiBcImF0IHRoaXNcbiAqIHBhdGggaW5zaWRlIHRoZSB2YWx1ZSBJIHJlYWQsIHB1dCB0aGlzXCIuIFRoZSB2YWx1ZSBpdCByZWFkIGlzIEJPUlJPV0VEIOKAlFxuICogYmVmb3JlIGEgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgaXQgaXMgYSBiYXJlIHJlZmVyZW5jZSBpbnRvIGNvbW1pdHRlZFxuICogc2hhcmVkIG1lbW9yeSwgYW5kIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCAoc2VlXG4gKiBgUmVjb3JkRnJhbWUgwrcgZmlyc3RUb3VjaGApLiBFZGl0aW5nIGl0IGluIHBsYWNlIHdvdWxkIGNvcnJ1cHQgZXZlcnlcbiAqIGluLWZsaWdodCBzdGFnZSBBTkQgbGVhdmUgdGhlIGNvbW1pdCBsb2cgd2l0aCBub3RoaW5nIHRvIHJlY29yZC5cbiAqXG4gKiBTbyB0aGUgd3JpdGUgcGF0aCBuZXZlciBtdXRhdGVzLiBJdCBDT1BJRVMgdGhlIGNvbnRhaW5lcnMgYWxvbmcgdGhlIHBhdGhcbiAqIChhbmQgb25seSB0aG9zZSkgYW5kIHJldHVybnMgYSBuZXcgcm9vdCwgbGVhdmluZyBldmVyeSB1bnRvdWNoZWQgc2libGluZ1xuICogc2hhcmVkIGJ5IHJlZmVyZW5jZSDigJQgdGhlIHNhbWUgemVyby1jbG9uZSBiYXJnYWluIHRoZSBmaXJzdC10b3VjaCB2aWV3XG4gKiBhbHJlYWR5IG1ha2VzLiBUaGUgYnVmZmVyIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB3aGF0IGl0IHN0YWdlcywgc28gdGhlXG4gKiBkZXRhY2hpbmcgaGFwcGVucyBvbmNlLCBhdCB0aGUgYm91bmRhcnkgdGhhdCBuZWVkcyBpdC5cbiAqL1xuXG4vKlxuICogVW50aWwgOS4yNC4wIHRoaXMgbW9kdWxlIGFsc28gb3duZWQgYHVud3JhcFByb3h5YCwgYSBKU09OIHJvdW5kLXRyaXAgb2ZcbiAqIGV2ZXJ5IEFTU0lHTkVEIHZhbHVlIOKAlCB0aGUgb25seSB3YXkgdGhlbiB0byBrZWVwIHRoZSBzY29wZSdzIG93biBQcm94aWVzXG4gKiBvdXQgb2YgdGhlIGJ1ZmZlci4gSXQgY29zdCBhIGBEYXRlYCBpdHMgdHlwZSBhbmQgYSBgTWFwYCBpdHMgbWVtYmVycywgYW5kXG4gKiBpdCBtYWRlIHRoZSB0cmFwIGFuZCBgJHNldFZhbHVlYCBzdG9yZSBkaWZmZXJlbnQgYnl0ZXMgZm9yIHRoZSBzYW1lIHZhbHVlXG4gKiAodGhlIG9sZCBsYW5kbWluZSAxKS4gVGhlIHNjb3BlJ3MgaGFuZGxlcyBhcmUgcmVjb2duaXNlZCBub3dcbiAqIChgaGFuZGxlcy50cyDCtyB1bndyYXBIYW5kbGVzYCwgTygxKSBlYWNoKSwgc28gdGhlIGFzc2lnbmVkIHZhbHVlIGdvZXMgdG9cbiAqIHRoZSBzaW5rIEFTIEFTU0lHTkVEIGFuZCB0aGUgYnVmZmVyJ3MgYHN0cnVjdHVyZWRDbG9uZWAgYXQgY29tbWl0IGlzIHRoZVxuICogb25lIGRldGFjaGluZyBzdGVwIOKAlCB0aGUgc2FtZSBsYXcgYCRzZXRWYWx1ZWAgaGFzIGFsd2F5cyBoYWQuXG4gKi9cblxuLyoqIFNoYWxsb3cgY29weSB0aGF0IHByZXNlcnZlcyBhcnJheS1uZXNzIOKAlCB0aGUgb25lIGNvbnRhaW5lciBjb3B5IHRoaXMgbW9kdWxlIG1ha2VzLiAqL1xuZnVuY3Rpb24gY29weUNvbnRhaW5lcihub2RlOiB1bmtub3duKTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBbLi4ubm9kZV07XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JykgcmV0dXJuIHsgLi4uKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gIC8vIE5vdCBhIGNvbnRhaW5lciAocHJpbWl0aXZlLCBudWxsLCB1bmRlZmluZWQpOiB0aGUgcGF0aCBjb250aW51ZXMgSU5UTyBpdCxcbiAgLy8gc28gaXQgYmVjb21lcyBhIGZyZXNoIG9iamVjdCDigJQgdGhlIHNhbWUgY29lcmNpb24gYG5hdGl2ZVNldGAgcGVyZm9ybXMuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqIEFuIGFycmF5IGluZGV4IHNlZ21lbnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNlZ21lbnQgbmFtZXMgYSBwcm9wZXJ0eS4gKi9cbmZ1bmN0aW9uIGluZGV4T2Yobm9kZTogdW5rbm93biwgc2VnbWVudDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpID0gTnVtYmVyKHNlZ21lbnQpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpKSAmJiBpID49IDAgPyBpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGNvcHkgb2YgYHJvb3RgIHdpdGggYHZhbHVlYCBhdCBgc2VnbWVudHNgLCBtdXRhdGluZyBub3RoaW5nLlxuICpcbiAqIENvbnRhaW5lcnMgb24gdGhlIHBhdGggYXJlIHNoYWxsb3ctY29waWVkIChhcnJheXMgc3RheSBhcnJheXMpOyBldmVyeXRoaW5nXG4gKiBvZmYgdGhlIHBhdGggaXMgc2hhcmVkIGJ5IHJlZmVyZW5jZS4gQW4gZW1wdHkgcGF0aCByZXR1cm5zIGB2YWx1ZWAgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SW5QYXRoKHJvb3Q6IHVua25vd24sIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBuZXh0ID0gY29weUNvbnRhaW5lcihyb290KTtcbiAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzWzBdO1xuICBjb25zdCBpbmRleCA9IGluZGV4T2YobmV4dCwgc2VnbWVudCk7XG4gIGNvbnN0IGNoaWxkID0gaW5kZXggIT09IHVuZGVmaW5lZCA/IG5leHRbaW5kZXhdIDogKG5leHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3NlZ21lbnRdO1xuICBjb25zdCByZXBsYWNlZCA9IHNldEluUGF0aChjaGlsZCwgc2VnbWVudHMuc2xpY2UoMSksIHZhbHVlKTtcbiAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIG5leHRbaW5kZXhdID0gcmVwbGFjZWQ7XG4gIGVsc2UgKG5leHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3NlZ21lbnRdID0gcmVwbGFjZWQ7XG4gIHJldHVybiBuZXh0O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGNvcHkgb2YgYHJvb3RgIHdpdGggdGhlIGtleSBhdCBgc2VnbWVudHNgIFJFTU9WRUQsIG11dGF0aW5nIG5vdGhpbmcuXG4gKlxuICogT24gYW4gYXJyYXkgdGhlIHNsb3QgaXMgcmVtb3ZlZCB3aXRoIGBzcGxpY2VgICh0aGUgYXJyYXkgc2hyaW5rcyDigJQgYGRlbGV0ZWBcbiAqIG9uIGFuIGFycmF5IGluZGV4IHdvdWxkIGxlYXZlIGEgaG9sZSwgd2hpY2ggY2Fubm90IHN1cnZpdmVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJvdW5kLXRyaXBzIGFzIHRoZSBzYW1lIHZhbHVlKS4gQSBwYXRoIHRoYXQgZG9lcyBub3RcbiAqIGV4aXN0IHJldHVybnMgdGhlIHJvb3QgdW5jaGFuZ2VkLCBieSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVJblBhdGgocm9vdDogdW5rbm93biwgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdW5rbm93biB7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChyb290ID09PSBudWxsIHx8IHR5cGVvZiByb290ICE9PSAnb2JqZWN0JykgcmV0dXJuIHJvb3Q7XG4gIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1swXTtcbiAgY29uc3QgaW5kZXggPSBpbmRleE9mKHJvb3QsIHNlZ21lbnQpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpbmRleCA+PSAocm9vdCBhcyB1bmtub3duW10pLmxlbmd0aCkgcmV0dXJuIHJvb3Q7XG4gICAgICBjb25zdCBjb3B5ID0gWy4uLihyb290IGFzIHVua25vd25bXSldO1xuICAgICAgY29weS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJvb3QsIHNlZ21lbnQpKSByZXR1cm4gcm9vdDtcbiAgICBjb25zdCBjb3B5ID0geyAuLi4ocm9vdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICBkZWxldGUgY29weVtzZWdtZW50XTtcbiAgICByZXR1cm4gY29weTtcbiAgfVxuICBjb25zdCBjaGlsZCA9IGluZGV4ICE9PSB1bmRlZmluZWQgPyAocm9vdCBhcyB1bmtub3duW10pW2luZGV4XSA6IChyb290IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtzZWdtZW50XTtcbiAgY29uc3QgcmVwbGFjZWQgPSBkZWxldGVJblBhdGgoY2hpbGQsIHNlZ21lbnRzLnNsaWNlKDEpKTtcbiAgaWYgKHJlcGxhY2VkID09PSBjaGlsZCkgcmV0dXJuIHJvb3Q7XG4gIGNvbnN0IGNvcHkgPSBjb3B5Q29udGFpbmVyKHJvb3QpO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgY29weVtpbmRleF0gPSByZXBsYWNlZDtcbiAgZWxzZSBjb3B5W3NlZ21lbnRdID0gcmVwbGFjZWQ7XG4gIHJldHVybiBjb3B5O1xufVxuIl19
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ /**
3
+ * RecordFrame — the record half of one stage's frame (C3, L3).
4
+ *
5
+ * What a stage's frame needs to READ and WRITE the record, and nothing about the stage inside a run:
6
+ * where it writes (its address), what it read first (the first-touch base), what it staged (the lazy
7
+ * transaction buffer), which keys it read (the readKeys list), and where a commit lands (live state,
8
+ * the redacted mirror, the log — through `recordCommit`). The engine's frame (`StageContext`, L4)
9
+ * composes one and keeps the rest: retention, diagnostics, the dev-mode warnings, the commit observer
10
+ * and the redaction verdict.
11
+ *
12
+ * THE LAW:
13
+ * 1. ADDRESS. The frame reads and writes at its address, a path prefix the engine computed and hands
14
+ * over as data (C2: `['runs', <id>]` or `[]`, the root). It moves only before the first write:
15
+ * the buffer keeps the address it was built at (the engine refuses a later move).
16
+ * 2. FIRST TOUCH. The committed generation the frame first touched — its first read OR first write —
17
+ * is held by reference, never cloned: the read view before the first write and the buffer's
18
+ * net-change diff base after it.
19
+ * 3. TWO TIERS. A read is served from the stage's own view (the buffer's working copy once the stage
20
+ * wrote, else the first-touch base); a key absent there is served from LIVE state (at the
21
+ * address, then the root). After the first write the buffer's diff base is first given a private
22
+ * copy at that path (`TransactionBuffer · detachBase`).
23
+ * 4. LAZY BUFFER. The buffer is built at the first write — on the first-touch base, at the address,
24
+ * under the encoding. A frame that never writes builds none, and its commit is the empty bundle.
25
+ * 5. READ KEYS. Under `writeProvenance: 'reads-prefix'` every noted read puts its user-level key
26
+ * (dotted for a nested path) on the frame's list, once, in order; each staged row carries a copy
27
+ * of the list as it stands when the row is staged.
28
+ * 6. COMMIT, RELEASE, DISCARD. `commit` takes the buffer's payload (none = the empty commit), then
29
+ * the names, and hands both to `recordCommit`. `release` drops the buffer and the base; a frame
30
+ * touched again re-anchors on the state as it stands then. The readKeys list survives a release,
31
+ * and goes with `discard` (a failed attempt never happened).
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.RecordFrame = void 0;
35
+ const pathOps_js_1 = require("./pathOps.js");
36
+ const recordCommit_js_1 = require("./recordCommit.js");
37
+ const TransactionBuffer_js_1 = require("./TransactionBuffer.js");
38
+ class RecordFrame {
39
+ /** Live committed state — the heap every frame of the run shares. */
40
+ state;
41
+ /** The log the frame's commits land on, when the run keeps one. */
42
+ log;
43
+ /** The redacted mirror the frame's commits land on, when the run keeps one ({@link useMirror}). */
44
+ _mirror;
45
+ /** Where the frame reads and writes (law 1). */
46
+ _address;
47
+ /** The two dials (law 4, 5); absent → the record's defaults. */
48
+ encoding;
49
+ /**
50
+ * The committed generation at the frame's FIRST touch (law 2) — held by REFERENCE, never cloned.
51
+ * See {@link firstTouch} for the algorithm and the immutability invariant that makes a bare
52
+ * reference safe.
53
+ */
54
+ base;
55
+ /** The stage's staged writes — built at its first write (law 4), released at commit. */
56
+ buffer;
57
+ /**
58
+ * Keys tracked-read so far, in order (law 5) — the source of each staged row's `readKeys`. Only
59
+ * allocated under `'reads-prefix'`; insertion-ordered (a Set) and monotonic, which is what makes
60
+ * "last write's prefix == union" hold in delta mode.
61
+ */
62
+ readKeys;
63
+ constructor(state, log, address = []) {
64
+ this.state = state;
65
+ this.log = log;
66
+ this._address = address;
67
+ }
68
+ /** Where the frame reads and writes (law 1). */
69
+ get address() {
70
+ return this._address;
71
+ }
72
+ /**
73
+ * Read and write at `address` from now on — before the frame's first write (law 1): the buffer keeps
74
+ * the address it was built at. The engine's one caller, `StageContext · useAddressOf`, refuses a move
75
+ * once the frame has staged.
76
+ */
77
+ useAddress(address) {
78
+ this._address = address;
79
+ }
80
+ /** The two dials the frame encodes under from its next buffer and its next read on (law 4, 5). */
81
+ useEncoding(encoding) {
82
+ this.encoding = encoding;
83
+ }
84
+ /** The redacted mirror, if the run keeps one. */
85
+ get mirror() {
86
+ return this._mirror;
87
+ }
88
+ /** Land every commit from now on on `mirror` too, with the scrubbed rows the log takes (`recordCommit`). */
89
+ useMirror(mirror) {
90
+ this._mirror = mirror;
91
+ }
92
+ /** The absolute path of `key` under `path`: the frame's address, then the path, then the key. */
93
+ at(path, key) {
94
+ // Every read and write builds one. The root's is the path and the key; under an address, an
95
+ // index loop — the double spread `[...address, ...path, key]` costs a third more per call
96
+ // (as `utils · pathUnder` found for the address and the path).
97
+ const address = this._address;
98
+ if (address.length === 0)
99
+ return [...path, key];
100
+ const out = new Array(address.length + path.length + 1);
101
+ for (let i = 0; i < address.length; i++)
102
+ out[i] = address[i];
103
+ for (let i = 0; i < path.length; i++)
104
+ out[address.length + i] = path[i];
105
+ out[out.length - 1] = key;
106
+ return out;
107
+ }
108
+ /**
109
+ * ── The first-touch base (#13) ───────────────────────────────────────────
110
+ *
111
+ * WHAT: returns the committed shared state as it was at this frame's FIRST touch (first read or
112
+ * first write), capturing the reference on first call. Serves two consumers: reads before the first
113
+ * write ({@link read}) and the transaction buffer's diff base ({@link getTransactionBuffer}).
114
+ *
115
+ * WHY A BARE REFERENCE IS SAFE — the invariant this rests on: committed state is
116
+ * immutable-after-swap. Every write to `SharedMemory` builds the NEXT generation and swaps it in
117
+ * (copy-on-write, 9.29.0: `applyPatch` via `nextGeneration`, and `setValue`/`updateValue` too) — it
118
+ * copies the root and the containers on each written path, shares the rest, and never edits a
119
+ * container of the generation a stage captured here. Holding the reference therefore gives this
120
+ * stage a stable snapshot at zero cost — no clone, which is the entire point of #13. The transaction
121
+ * buffer's net-change diff base rests on the same guarantee: it IS this view.
122
+ *
123
+ * WHY FIRST TOUCH, not first write: the pre-#13 eager engine cloned the state into the buffer at
124
+ * the stage's first ACCESS, anchoring both its snapshot reads and its commit baseline (the
125
+ * net-change diff base) there. #13's first cut anchored the lazy buffer at first WRITE — observably
126
+ * different when something else commits in the gap between this stage's first read and its first
127
+ * write. That gap is REACHABLE: fork siblings are namespace-isolated for run-scoped keys (each child
128
+ * writes under `runs/<childId>/`), but ROOT-level keys are shared — written via `setGlobal` from
129
+ * consumer scope code and, critically, by `SubflowInputMapper`'s output mapping
130
+ * (`parentContext.setGlobal`), which is exactly what runs when a subflow is a fork branch. A
131
+ * sibling's root-key commit landing in the gap would shift this stage's diff base, making its
132
+ * CommitBundle record a phantom change (or swallow a real one) relative to the eager engine.
133
+ * Anchoring the view at first touch restores the EXACT eager semantics — sequential AND parallel —
134
+ * at zero clone cost.
135
+ *
136
+ * Read visibility is two-tier, matching eager byte-for-byte: keys present in the view at first
137
+ * touch read repeatably from it; keys ABSENT from it fall back to LIVE state (the eager engine's
138
+ * exact fallback — a mid-flight sibling root-key write was always visible to reads, and stays
139
+ * visible; only the DIFF BASE is pinned).
140
+ */
141
+ firstTouch() {
142
+ if (!this.base) {
143
+ this.base = this.state.getState();
144
+ }
145
+ return this.base;
146
+ }
147
+ /**
148
+ * The transaction buffer, created lazily on the frame's FIRST WRITE (#13).
149
+ *
150
+ * Reads NEVER construct it: read-your-writes only matters once a staged write exists, so before that
151
+ * {@link read} serves from the first-touch base and {@link commit} records an empty bundle — all with
152
+ * ZERO `structuredClone`s of the shared state.
153
+ *
154
+ * The buffer's base is the FIRST-TOUCH view, NOT the live state at write time: under parallel forks
155
+ * a sibling may have committed between this frame's first read and this write, and the net-change
156
+ * diff base must stay anchored at first touch to match the eager engine — see {@link firstTouch}.
157
+ */
158
+ getTransactionBuffer() {
159
+ if (!this.buffer) {
160
+ // Per-write provenance (#P1): hand the buffer a live view of this frame's read prefix —
161
+ // evaluated AT EACH WRITE, so each staged op captures exactly the reads that preceded it.
162
+ const readKeysProvider = this.encoding?.writeProvenance === 'reads-prefix' ? () => [...(this.readKeys ?? [])] : undefined;
163
+ // The frame's address (9.30.0: the admitted record reads the containers there as where the
164
+ // stage writes, never as a value it read).
165
+ this.buffer = new TransactionBuffer_js_1.TransactionBuffer(this.firstTouch(), this.encoding?.commitValues, readKeysProvider, this._address);
166
+ }
167
+ return this.buffer;
168
+ }
169
+ /** Has the frame staged a write since its last release — does its buffer exist? */
170
+ get hasStaged() {
171
+ return this.buffer !== undefined;
172
+ }
173
+ /**
174
+ * The frame's read, mirroring the eager engine's read order byte-for-byte (law 3):
175
+ *
176
+ * 1. staged writes + first-touch snapshot — `buffer.get` over its workingCopy when the buffer
177
+ * exists, else `nativeGet` over the zero-clone first-touch base (the buffer's base IS that
178
+ * view, so the two tiers agree on content);
179
+ * 2. LIVE state via `SharedMemory · getValue` for keys absent from the snapshot — including its
180
+ * address→root fallback. The eager engine had this exact live fallback for snapshot-missing
181
+ * keys; byte-identity over purity. After the frame's first write such a value can be the very
182
+ * container the buffer's diff base holds at the path (the stage deleted or unset it, or
183
+ * replaced a container above it), so the base is detached there first
184
+ * (`TransactionBuffer · detachBase`): an in-place edit of the value (out of contract) written
185
+ * back is recorded, as on 9.28.0, whose base was a clone taken at the first write.
186
+ *
187
+ * Reads never construct the buffer (#13): a frame that never writes performs zero clones of the
188
+ * shared state.
189
+ */
190
+ read(path, key) {
191
+ const at = this.at(path, key);
192
+ const fromSnapshot = this.buffer ? this.buffer.get(at) : (0, pathOps_js_1.nativeGet)(this.firstTouch(), at);
193
+ if (typeof fromSnapshot !== 'undefined')
194
+ return fromSnapshot;
195
+ const live = this.state.getValue(this._address, path, key);
196
+ // Tier 2 after the first write: keep the diff base exact (see above).
197
+ if (this.buffer && live !== null && typeof live === 'object')
198
+ this.buffer.detachBase(at);
199
+ return live;
200
+ }
201
+ /** Put a tracked read's user-level key on the readKeys list (law 5) — a no-op unless the frame keeps one. */
202
+ noteRead(path, key) {
203
+ if (this.encoding?.writeProvenance === 'reads-prefix') {
204
+ (this.readKeys ??= new Set()).add(path.length > 0 ? [...path, key].join('.') : key);
205
+ }
206
+ }
207
+ /**
208
+ * Live committed state at `key`: at the frame's address, else at the root — never the stage's own
209
+ * view. Typed as `SharedMemory · getValue` types it, which `StageContext · getRoot` hands on.
210
+ */
211
+ readLive(key) {
212
+ return this.state.getValue(this._address, [], key);
213
+ }
214
+ /** Live committed state at `key` at the root — typed as `SharedMemory · getValue` (`StageContext · getGlobal`). */
215
+ readGlobal(key) {
216
+ return this.state.getValue([], [], key);
217
+ }
218
+ /** Did a staged op touch `path` — on it, above it or below it? (A report's question; never the hot path.) */
219
+ wasStaged(path) {
220
+ return this.buffer !== undefined && this.buffer.wasStaged(path);
221
+ }
222
+ /**
223
+ * The value at `path` in what the stage has seen — its working copy once it wrote, else its
224
+ * first-touch base — WITHOUT taking a private copy: for a report that only compares.
225
+ */
226
+ peek(path) {
227
+ return this.buffer ? this.buffer.peek(path) : (0, pathOps_js_1.nativeGet)(this.firstTouch(), path);
228
+ }
229
+ /** The value at `path` in the first-touch base — committed state as the frame first touched it. */
230
+ baseAt(path) {
231
+ return (0, pathOps_js_1.nativeGet)(this.firstTouch(), path);
232
+ }
233
+ /**
234
+ * Record what the frame staged (law 6): the buffer's payload first — none, the empty commit, when
235
+ * it staged nothing (#13: zero clones) — then the names (`stampOf()`), read once the payload is
236
+ * built, and both to `recordCommit`. User code can run while the payload is built (a getter on a
237
+ * staged value, which the net-change compare and the clone invoke); what it adds to the names —
238
+ * an untracked read, say — is on the bundle.
239
+ */
240
+ commit(stampOf) {
241
+ const payload = this.buffer?.commit();
242
+ (0, recordCommit_js_1.recordCommit)(payload, stampOf(), { state: this.state, mirror: this._mirror, log: this.log });
243
+ }
244
+ /**
245
+ * End the frame's hold on state (#13b, law 6): drop the buffer (its working copy and whatever private
246
+ * copies its reads took) and the first-touch base (a reference that pins one committed-state
247
+ * GENERATION). Both re-create lazily: a later read re-anchors on the CURRENT committed state, and a
248
+ * later write builds a fresh buffer on it — so a second commit diffs against the state after the
249
+ * first. Without the release, the execution tree — which retains every frame for the lifetime of
250
+ * the run — retains one state generation per executed stage (measured O(N²) before copy-on-write;
251
+ * a 500-iteration agent OOMed a default Node heap, backlog #18).
252
+ */
253
+ release() {
254
+ this.buffer = undefined;
255
+ this.base = undefined;
256
+ }
257
+ /**
258
+ * Throw away everything the frame staged and read (law 6): the buffer, the first-touch base (the next
259
+ * attempt re-anchors on committed state as it stands NOW) and the readKeys list — a discarded
260
+ * attempt's reads must never reach the next attempt's `TraceEntry.readKeys`, or a backward slice
261
+ * would follow an edge that no committed write ever had. Nothing is recorded.
262
+ */
263
+ discard() {
264
+ this.release();
265
+ this.readKeys = undefined;
266
+ }
267
+ }
268
+ exports.RecordFrame = RecordFrame;
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9SZWNvcmRGcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRzs7O0FBR0gsNkNBQXlDO0FBQ3pDLHVEQUFtRTtBQUVuRSxpRUFBMkQ7QUFhM0QsTUFBYSxXQUFXO0lBQ3RCLHFFQUFxRTtJQUM1RCxLQUFLLENBQWU7SUFDN0IsbUVBQW1FO0lBQzFELEdBQUcsQ0FBWTtJQUN4QixtR0FBbUc7SUFDM0YsT0FBTyxDQUFnQjtJQUMvQixnREFBZ0Q7SUFDeEMsUUFBUSxDQUFvQjtJQUNwQyxnRUFBZ0U7SUFDeEQsUUFBUSxDQUFrQjtJQUNsQzs7OztPQUlHO0lBQ0ssSUFBSSxDQUEyQjtJQUN2Qyx3RkFBd0Y7SUFDaEYsTUFBTSxDQUFxQjtJQUNuQzs7OztPQUlHO0lBQ0ssUUFBUSxDQUFlO0lBRS9CLFlBQVksS0FBbUIsRUFBRSxHQUFjLEVBQUUsVUFBNkIsRUFBRTtRQUM5RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLE9BQTBCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxrR0FBa0c7SUFDbEcsV0FBVyxDQUFDLFFBQXdCO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxpREFBaUQ7SUFDakQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENB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RjtBQTFQRCxrQ0EwUEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlY29yZEZyYW1lIOKAlCB0aGUgcmVjb3JkIGhhbGYgb2Ygb25lIHN0YWdlJ3MgZnJhbWUgKEMzLCBMMykuXG4gKlxuICogV2hhdCBhIHN0YWdlJ3MgZnJhbWUgbmVlZHMgdG8gUkVBRCBhbmQgV1JJVEUgdGhlIHJlY29yZCwgYW5kIG5vdGhpbmcgYWJvdXQgdGhlIHN0YWdlIGluc2lkZSBhIHJ1bjpcbiAqIHdoZXJlIGl0IHdyaXRlcyAoaXRzIGFkZHJlc3MpLCB3aGF0IGl0IHJlYWQgZmlyc3QgKHRoZSBmaXJzdC10b3VjaCBiYXNlKSwgd2hhdCBpdCBzdGFnZWQgKHRoZSBsYXp5XG4gKiB0cmFuc2FjdGlvbiBidWZmZXIpLCB3aGljaCBrZXlzIGl0IHJlYWQgKHRoZSByZWFkS2V5cyBsaXN0KSwgYW5kIHdoZXJlIGEgY29tbWl0IGxhbmRzIChsaXZlIHN0YXRlLFxuICogdGhlIHJlZGFjdGVkIG1pcnJvciwgdGhlIGxvZyDigJQgdGhyb3VnaCBgcmVjb3JkQ29tbWl0YCkuIFRoZSBlbmdpbmUncyBmcmFtZSAoYFN0YWdlQ29udGV4dGAsIEw0KVxuICogY29tcG9zZXMgb25lIGFuZCBrZWVwcyB0aGUgcmVzdDogcmV0ZW50aW9uLCBkaWFnbm9zdGljcywgdGhlIGRldi1tb2RlIHdhcm5pbmdzLCB0aGUgY29tbWl0IG9ic2VydmVyXG4gKiBhbmQgdGhlIHJlZGFjdGlvbiB2ZXJkaWN0LlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIEFERFJFU1MuIFRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIGF0IGl0cyBhZGRyZXNzLCBhIHBhdGggcHJlZml4IHRoZSBlbmdpbmUgY29tcHV0ZWQgYW5kIGhhbmRzXG4gKiAgICAgIG92ZXIgYXMgZGF0YSAoQzI6IGBbJ3J1bnMnLCA8aWQ+XWAgb3IgYFtdYCwgdGhlIHJvb3QpLiBJdCBtb3ZlcyBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGU6XG4gKiAgICAgIHRoZSBidWZmZXIga2VlcHMgdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0ICh0aGUgZW5naW5lIHJlZnVzZXMgYSBsYXRlciBtb3ZlKS5cbiAqICAgMi4gRklSU1QgVE9VQ0guIFRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgZnJhbWUgZmlyc3QgdG91Y2hlZCDigJQgaXRzIGZpcnN0IHJlYWQgT1IgZmlyc3Qgd3JpdGUg4oCUXG4gKiAgICAgIGlzIGhlbGQgYnkgcmVmZXJlbmNlLCBuZXZlciBjbG9uZWQ6IHRoZSByZWFkIHZpZXcgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBhbmQgdGhlIGJ1ZmZlcidzXG4gKiAgICAgIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIGFmdGVyIGl0LlxuICogICAzLiBUV08gVElFUlMuIEEgcmVhZCBpcyBzZXJ2ZWQgZnJvbSB0aGUgc3RhZ2UncyBvd24gdmlldyAodGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBvbmNlIHRoZSBzdGFnZVxuICogICAgICB3cm90ZSwgZWxzZSB0aGUgZmlyc3QtdG91Y2ggYmFzZSk7IGEga2V5IGFic2VudCB0aGVyZSBpcyBzZXJ2ZWQgZnJvbSBMSVZFIHN0YXRlIChhdCB0aGVcbiAqICAgICAgYWRkcmVzcywgdGhlbiB0aGUgcm9vdCkuIEFmdGVyIHRoZSBmaXJzdCB3cml0ZSB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGlzIGZpcnN0IGdpdmVuIGEgcHJpdmF0ZVxuICogICAgICBjb3B5IGF0IHRoYXQgcGF0aCAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKS5cbiAqICAgNC4gTEFaWSBCVUZGRVIuIFRoZSBidWZmZXIgaXMgYnVpbHQgYXQgdGhlIGZpcnN0IHdyaXRlIOKAlCBvbiB0aGUgZmlyc3QtdG91Y2ggYmFzZSwgYXQgdGhlIGFkZHJlc3MsXG4gKiAgICAgIHVuZGVyIHRoZSBlbmNvZGluZy4gQSBmcmFtZSB0aGF0IG5ldmVyIHdyaXRlcyBidWlsZHMgbm9uZSwgYW5kIGl0cyBjb21taXQgaXMgdGhlIGVtcHR5IGJ1bmRsZS5cbiAqICAgNS4gUkVBRCBLRVlTLiBVbmRlciBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZXZlcnkgbm90ZWQgcmVhZCBwdXRzIGl0cyB1c2VyLWxldmVsIGtleVxuICogICAgICAoZG90dGVkIGZvciBhIG5lc3RlZCBwYXRoKSBvbiB0aGUgZnJhbWUncyBsaXN0LCBvbmNlLCBpbiBvcmRlcjsgZWFjaCBzdGFnZWQgcm93IGNhcnJpZXMgYSBjb3B5XG4gKiAgICAgIG9mIHRoZSBsaXN0IGFzIGl0IHN0YW5kcyB3aGVuIHRoZSByb3cgaXMgc3RhZ2VkLlxuICogICA2LiBDT01NSVQsIFJFTEVBU0UsIERJU0NBUkQuIGBjb21taXRgIHRha2VzIHRoZSBidWZmZXIncyBwYXlsb2FkIChub25lID0gdGhlIGVtcHR5IGNvbW1pdCksIHRoZW5cbiAqICAgICAgdGhlIG5hbWVzLCBhbmQgaGFuZHMgYm90aCB0byBgcmVjb3JkQ29tbWl0YC4gYHJlbGVhc2VgIGRyb3BzIHRoZSBidWZmZXIgYW5kIHRoZSBiYXNlOyBhIGZyYW1lXG4gKiAgICAgIHRvdWNoZWQgYWdhaW4gcmUtYW5jaG9ycyBvbiB0aGUgc3RhdGUgYXMgaXQgc3RhbmRzIHRoZW4uIFRoZSByZWFkS2V5cyBsaXN0IHN1cnZpdmVzIGEgcmVsZWFzZSxcbiAqICAgICAgYW5kIGdvZXMgd2l0aCBgZGlzY2FyZGAgKGEgZmFpbGVkIGF0dGVtcHQgbmV2ZXIgaGFwcGVuZWQpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyB0eXBlIENvbW1pdFN0YW1wLCByZWNvcmRDb21taXQgfSBmcm9tICcuL3JlY29yZENvbW1pdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUsIFdyaXRlUHJvdmVuYW5jZU1vZGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBUaGUgdHdvIGRpYWxzIHRoYXQgc2hhcGUgYSBmcmFtZSdzIGJ5dGVzOiB0aGUgbG9nJ3MgdmFsdWUgZW5jb2RpbmcgYW5kIHRoZSBwZXItcm93IHJlYWQgcHJlZml4LlxuICogSGVsZCBieSByZWZlcmVuY2UgYW5kIHN3YXBwZWQgd2hvbGUgKGB1c2VFbmNvZGluZ2ApLCBuZXZlciBlZGl0ZWQg4oCUIHRoZSBlbmdpbmUgaGFuZHMgdGhlIHJ1bidzXG4gKiBmcm96ZW4gcG9saWN5IGl0c2VsZi4gQWJzZW50OiBgJ2Z1bGwnYCB2YWx1ZXMgYW5kIG5vIHJlYWQgcHJlZml4LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZEVuY29kaW5nIHtcbiAgcmVhZG9ubHkgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlO1xuICByZWFkb25seSB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWNvcmRGcmFtZSB7XG4gIC8qKiBMaXZlIGNvbW1pdHRlZCBzdGF0ZSDigJQgdGhlIGhlYXAgZXZlcnkgZnJhbWUgb2YgdGhlIHJ1biBzaGFyZXMuICovXG4gIHJlYWRvbmx5IHN0YXRlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKiBUaGUgbG9nIHRoZSBmcmFtZSdzIGNvbW1pdHMgbGFuZCBvbiwgd2hlbiB0aGUgcnVuIGtlZXBzIG9uZS4gKi9cbiAgcmVhZG9ubHkgbG9nPzogRXZlbnRMb2c7XG4gIC8qKiBUaGUgcmVkYWN0ZWQgbWlycm9yIHRoZSBmcmFtZSdzIGNvbW1pdHMgbGFuZCBvbiwgd2hlbiB0aGUgcnVuIGtlZXBzIG9uZSAoe0BsaW5rIHVzZU1pcnJvcn0pLiAqL1xuICBwcml2YXRlIF9taXJyb3I/OiBTaGFyZWRNZW1vcnk7XG4gIC8qKiBXaGVyZSB0aGUgZnJhbWUgcmVhZHMgYW5kIHdyaXRlcyAobGF3IDEpLiAqL1xuICBwcml2YXRlIF9hZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFRoZSB0d28gZGlhbHMgKGxhdyA0LCA1KTsgYWJzZW50IOKGkiB0aGUgcmVjb3JkJ3MgZGVmYXVsdHMuICovXG4gIHByaXZhdGUgZW5jb2Rpbmc/OiBSZWNvcmRFbmNvZGluZztcbiAgLyoqXG4gICAqIFRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiBhdCB0aGUgZnJhbWUncyBGSVJTVCB0b3VjaCAobGF3IDIpIOKAlCBoZWxkIGJ5IFJFRkVSRU5DRSwgbmV2ZXIgY2xvbmVkLlxuICAgKiBTZWUge0BsaW5rIGZpcnN0VG91Y2h9IGZvciB0aGUgYWxnb3JpdGhtIGFuZCB0aGUgaW1tdXRhYmlsaXR5IGludmFyaWFudCB0aGF0IG1ha2VzIGEgYmFyZVxuICAgKiByZWZlcmVuY2Ugc2FmZS5cbiAgICovXG4gIHByaXZhdGUgYmFzZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogVGhlIHN0YWdlJ3Mgc3RhZ2VkIHdyaXRlcyDigJQgYnVpbHQgYXQgaXRzIGZpcnN0IHdyaXRlIChsYXcgNCksIHJlbGVhc2VkIGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBidWZmZXI/OiBUcmFuc2FjdGlvbkJ1ZmZlcjtcbiAgLyoqXG4gICAqIEtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciwgaW4gb3JkZXIgKGxhdyA1KSDigJQgdGhlIHNvdXJjZSBvZiBlYWNoIHN0YWdlZCByb3cncyBgcmVhZEtleXNgLiBPbmx5XG4gICAqIGFsbG9jYXRlZCB1bmRlciBgJ3JlYWRzLXByZWZpeCdgOyBpbnNlcnRpb24tb3JkZXJlZCAoYSBTZXQpIGFuZCBtb25vdG9uaWMsIHdoaWNoIGlzIHdoYXQgbWFrZXNcbiAgICogXCJsYXN0IHdyaXRlJ3MgcHJlZml4ID09IHVuaW9uXCIgaG9sZCBpbiBkZWx0YSBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkS2V5cz86IFNldDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKHN0YXRlOiBTaGFyZWRNZW1vcnksIGxvZz86IEV2ZW50TG9nLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFdoZXJlIHRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIChsYXcgMSkuICovXG4gIGdldCBhZGRyZXNzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGFuZCB3cml0ZSBhdCBgYWRkcmVzc2AgZnJvbSBub3cgb24g4oCUIGJlZm9yZSB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSAobGF3IDEpOiB0aGUgYnVmZmVyIGtlZXBzXG4gICAqIHRoZSBhZGRyZXNzIGl0IHdhcyBidWlsdCBhdC4gVGhlIGVuZ2luZSdzIG9uZSBjYWxsZXIsIGBTdGFnZUNvbnRleHQgwrcgdXNlQWRkcmVzc09mYCwgcmVmdXNlcyBhIG1vdmVcbiAgICogb25jZSB0aGUgZnJhbWUgaGFzIHN0YWdlZC5cbiAgICovXG4gIHVzZUFkZHJlc3MoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLl9hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBUaGUgdHdvIGRpYWxzIHRoZSBmcmFtZSBlbmNvZGVzIHVuZGVyIGZyb20gaXRzIG5leHQgYnVmZmVyIGFuZCBpdHMgbmV4dCByZWFkIG9uIChsYXcgNCwgNSkuICovXG4gIHVzZUVuY29kaW5nKGVuY29kaW5nOiBSZWNvcmRFbmNvZGluZyk6IHZvaWQge1xuICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgfVxuXG4gIC8qKiBUaGUgcmVkYWN0ZWQgbWlycm9yLCBpZiB0aGUgcnVuIGtlZXBzIG9uZS4gKi9cbiAgZ2V0IG1pcnJvcigpOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9taXJyb3I7XG4gIH1cblxuICAvKiogTGFuZCBldmVyeSBjb21taXQgZnJvbSBub3cgb24gb24gYG1pcnJvcmAgdG9vLCB3aXRoIHRoZSBzY3J1YmJlZCByb3dzIHRoZSBsb2cgdGFrZXMgKGByZWNvcmRDb21taXRgKS4gKi9cbiAgdXNlTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fbWlycm9yID0gbWlycm9yO1xuICB9XG5cbiAgLyoqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIGBrZXlgIHVuZGVyIGBwYXRoYDogdGhlIGZyYW1lJ3MgYWRkcmVzcywgdGhlbiB0aGUgcGF0aCwgdGhlbiB0aGUga2V5LiAqL1xuICBhdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgLy8gRXZlcnkgcmVhZCBhbmQgd3JpdGUgYnVpbGRzIG9uZS4gVGhlIHJvb3QncyBpcyB0aGUgcGF0aCBhbmQgdGhlIGtleTsgdW5kZXIgYW4gYWRkcmVzcywgYW5cbiAgICAvLyBpbmRleCBsb29wIOKAlCB0aGUgZG91YmxlIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGgsIGtleV1gIGNvc3RzIGEgdGhpcmQgbW9yZSBwZXIgY2FsbFxuICAgIC8vIChhcyBgdXRpbHMgwrcgcGF0aFVuZGVyYCBmb3VuZCBmb3IgdGhlIGFkZHJlc3MgYW5kIHRoZSBwYXRoKS5cbiAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5fYWRkcmVzcztcbiAgICBpZiAoYWRkcmVzcy5sZW5ndGggPT09IDApIHJldHVybiBbLi4ucGF0aCwga2V5XTtcbiAgICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoICsgMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgb3V0W2FkZHJlc3MubGVuZ3RoICsgaV0gPSBwYXRoW2ldO1xuICAgIG91dFtvdXQubGVuZ3RoIC0gMV0gPSBrZXk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiDilIDilIAgVGhlIGZpcnN0LXRvdWNoIGJhc2UgKCMxMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqXG4gICAqIFdIQVQ6IHJldHVybnMgdGhlIGNvbW1pdHRlZCBzaGFyZWQgc3RhdGUgYXMgaXQgd2FzIGF0IHRoaXMgZnJhbWUncyBGSVJTVCB0b3VjaCAoZmlyc3QgcmVhZCBvclxuICAgKiBmaXJzdCB3cml0ZSksIGNhcHR1cmluZyB0aGUgcmVmZXJlbmNlIG9uIGZpcnN0IGNhbGwuIFNlcnZlcyB0d28gY29uc3VtZXJzOiByZWFkcyBiZWZvcmUgdGhlIGZpcnN0XG4gICAqIHdyaXRlICh7QGxpbmsgcmVhZH0pIGFuZCB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3MgZGlmZiBiYXNlICh7QGxpbmsgZ2V0VHJhbnNhY3Rpb25CdWZmZXJ9KS5cbiAgICpcbiAgICogV0hZIEEgQkFSRSBSRUZFUkVOQ0UgSVMgU0FGRSDigJQgdGhlIGludmFyaWFudCB0aGlzIHJlc3RzIG9uOiBjb21taXR0ZWQgc3RhdGUgaXNcbiAgICogaW1tdXRhYmxlLWFmdGVyLXN3YXAuIEV2ZXJ5IHdyaXRlIHRvIGBTaGFyZWRNZW1vcnlgIGJ1aWxkcyB0aGUgTkVYVCBnZW5lcmF0aW9uIGFuZCBzd2FwcyBpdCBpblxuICAgKiAoY29weS1vbi13cml0ZSwgOS4yOS4wOiBgYXBwbHlQYXRjaGAgdmlhIGBuZXh0R2VuZXJhdGlvbmAsIGFuZCBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgdG9vKSDigJQgaXRcbiAgICogY29waWVzIHRoZSByb290IGFuZCB0aGUgY29udGFpbmVycyBvbiBlYWNoIHdyaXR0ZW4gcGF0aCwgc2hhcmVzIHRoZSByZXN0LCBhbmQgbmV2ZXIgZWRpdHMgYVxuICAgKiBjb250YWluZXIgb2YgdGhlIGdlbmVyYXRpb24gYSBzdGFnZSBjYXB0dXJlZCBoZXJlLiBIb2xkaW5nIHRoZSByZWZlcmVuY2UgdGhlcmVmb3JlIGdpdmVzIHRoaXNcbiAgICogc3RhZ2UgYSBzdGFibGUgc25hcHNob3QgYXQgemVybyBjb3N0IOKAlCBubyBjbG9uZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiAjMTMuIFRoZSB0cmFuc2FjdGlvblxuICAgKiBidWZmZXIncyBuZXQtY2hhbmdlIGRpZmYgYmFzZSByZXN0cyBvbiB0aGUgc2FtZSBndWFyYW50ZWU6IGl0IElTIHRoaXMgdmlldy5cbiAgICpcbiAgICogV0hZIEZJUlNUIFRPVUNILCBub3QgZmlyc3Qgd3JpdGU6IHRoZSBwcmUtIzEzIGVhZ2VyIGVuZ2luZSBjbG9uZWQgdGhlIHN0YXRlIGludG8gdGhlIGJ1ZmZlciBhdFxuICAgKiB0aGUgc3RhZ2UncyBmaXJzdCBBQ0NFU1MsIGFuY2hvcmluZyBib3RoIGl0cyBzbmFwc2hvdCByZWFkcyBhbmQgaXRzIGNvbW1pdCBiYXNlbGluZSAodGhlXG4gICAqIG5ldC1jaGFuZ2UgZGlmZiBiYXNlKSB0aGVyZS4gIzEzJ3MgZmlyc3QgY3V0IGFuY2hvcmVkIHRoZSBsYXp5IGJ1ZmZlciBhdCBmaXJzdCBXUklURSDigJQgb2JzZXJ2YWJseVxuICAgKiBkaWZmZXJlbnQgd2hlbiBzb21ldGhpbmcgZWxzZSBjb21taXRzIGluIHRoZSBnYXAgYmV0d2VlbiB0aGlzIHN0YWdlJ3MgZmlyc3QgcmVhZCBhbmQgaXRzIGZpcnN0XG4gICAqIHdyaXRlLiBUaGF0IGdhcCBpcyBSRUFDSEFCTEU6IGZvcmsgc2libGluZ3MgYXJlIG5hbWVzcGFjZS1pc29sYXRlZCBmb3IgcnVuLXNjb3BlZCBrZXlzIChlYWNoIGNoaWxkXG4gICAqIHdyaXRlcyB1bmRlciBgcnVucy88Y2hpbGRJZD4vYCksIGJ1dCBST09ULWxldmVsIGtleXMgYXJlIHNoYXJlZCDigJQgd3JpdHRlbiB2aWEgYHNldEdsb2JhbGAgZnJvbVxuICAgKiBjb25zdW1lciBzY29wZSBjb2RlIGFuZCwgY3JpdGljYWxseSwgYnkgYFN1YmZsb3dJbnB1dE1hcHBlcmAncyBvdXRwdXQgbWFwcGluZ1xuICAgKiAoYHBhcmVudENvbnRleHQuc2V0R2xvYmFsYCksIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBydW5zIHdoZW4gYSBzdWJmbG93IGlzIGEgZm9yayBicmFuY2guIEFcbiAgICogc2libGluZydzIHJvb3Qta2V5IGNvbW1pdCBsYW5kaW5nIGluIHRoZSBnYXAgd291bGQgc2hpZnQgdGhpcyBzdGFnZSdzIGRpZmYgYmFzZSwgbWFraW5nIGl0c1xuICAgKiBDb21taXRCdW5kbGUgcmVjb3JkIGEgcGhhbnRvbSBjaGFuZ2UgKG9yIHN3YWxsb3cgYSByZWFsIG9uZSkgcmVsYXRpdmUgdG8gdGhlIGVhZ2VyIGVuZ2luZS5cbiAgICogQW5jaG9yaW5nIHRoZSB2aWV3IGF0IGZpcnN0IHRvdWNoIHJlc3RvcmVzIHRoZSBFWEFDVCBlYWdlciBzZW1hbnRpY3Mg4oCUIHNlcXVlbnRpYWwgQU5EIHBhcmFsbGVsIOKAlFxuICAgKiBhdCB6ZXJvIGNsb25lIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlzaWJpbGl0eSBpcyB0d28tdGllciwgbWF0Y2hpbmcgZWFnZXIgYnl0ZS1mb3ItYnl0ZToga2V5cyBwcmVzZW50IGluIHRoZSB2aWV3IGF0IGZpcnN0XG4gICAqIHRvdWNoIHJlYWQgcmVwZWF0YWJseSBmcm9tIGl0OyBrZXlzIEFCU0VOVCBmcm9tIGl0IGZhbGwgYmFjayB0byBMSVZFIHN0YXRlICh0aGUgZWFnZXIgZW5naW5lJ3NcbiAgICogZXhhY3QgZmFsbGJhY2sg4oCUIGEgbWlkLWZsaWdodCBzaWJsaW5nIHJvb3Qta2V5IHdyaXRlIHdhcyBhbHdheXMgdmlzaWJsZSB0byByZWFkcywgYW5kIHN0YXlzXG4gICAqIHZpc2libGU7IG9ubHkgdGhlIERJRkYgQkFTRSBpcyBwaW5uZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXJzdFRvdWNoKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuYmFzZSkge1xuICAgICAgdGhpcy5iYXNlID0gdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFuc2FjdGlvbiBidWZmZXIsIGNyZWF0ZWQgbGF6aWx5IG9uIHRoZSBmcmFtZSdzIEZJUlNUIFdSSVRFICgjMTMpLlxuICAgKlxuICAgKiBSZWFkcyBORVZFUiBjb25zdHJ1Y3QgaXQ6IHJlYWQteW91ci13cml0ZXMgb25seSBtYXR0ZXJzIG9uY2UgYSBzdGFnZWQgd3JpdGUgZXhpc3RzLCBzbyBiZWZvcmUgdGhhdFxuICAgKiB7QGxpbmsgcmVhZH0gc2VydmVzIGZyb20gdGhlIGZpcnN0LXRvdWNoIGJhc2UgYW5kIHtAbGluayBjb21taXR9IHJlY29yZHMgYW4gZW1wdHkgYnVuZGxlIOKAlCBhbGwgd2l0aFxuICAgKiBaRVJPIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiBUaGUgYnVmZmVyJ3MgYmFzZSBpcyB0aGUgRklSU1QtVE9VQ0ggdmlldywgTk9UIHRoZSBsaXZlIHN0YXRlIGF0IHdyaXRlIHRpbWU6IHVuZGVyIHBhcmFsbGVsIGZvcmtzXG4gICAqIGEgc2libGluZyBtYXkgaGF2ZSBjb21taXR0ZWQgYmV0d2VlbiB0aGlzIGZyYW1lJ3MgZmlyc3QgcmVhZCBhbmQgdGhpcyB3cml0ZSwgYW5kIHRoZSBuZXQtY2hhbmdlXG4gICAqIGRpZmYgYmFzZSBtdXN0IHN0YXkgYW5jaG9yZWQgYXQgZmlyc3QgdG91Y2ggdG8gbWF0Y2ggdGhlIGVhZ2VyIGVuZ2luZSDigJQgc2VlIHtAbGluayBmaXJzdFRvdWNofS5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKTogaGFuZCB0aGUgYnVmZmVyIGEgbGl2ZSB2aWV3IG9mIHRoaXMgZnJhbWUncyByZWFkIHByZWZpeCDigJRcbiAgICAgIC8vIGV2YWx1YXRlZCBBVCBFQUNIIFdSSVRFLCBzbyBlYWNoIHN0YWdlZCBvcCBjYXB0dXJlcyBleGFjdGx5IHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0LlxuICAgICAgY29uc3QgcmVhZEtleXNQcm92aWRlciA9XG4gICAgICAgIHRoaXMuZW5jb2Rpbmc/LndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcgPyAoKSA9PiBbLi4uKHRoaXMucmVhZEtleXMgPz8gW10pXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBmcmFtZSdzIGFkZHJlc3MgKDkuMzAuMDogdGhlIGFkbWl0dGVkIHJlY29yZCByZWFkcyB0aGUgY29udGFpbmVycyB0aGVyZSBhcyB3aGVyZSB0aGVcbiAgICAgIC8vIHN0YWdlIHdyaXRlcywgbmV2ZXIgYXMgYSB2YWx1ZSBpdCByZWFkKS5cbiAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFRyYW5zYWN0aW9uQnVmZmVyKFxuICAgICAgICB0aGlzLmZpcnN0VG91Y2goKSxcbiAgICAgICAgdGhpcy5lbmNvZGluZz8uY29tbWl0VmFsdWVzLFxuICAgICAgICByZWFkS2V5c1Byb3ZpZGVyLFxuICAgICAgICB0aGlzLl9hZGRyZXNzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqIEhhcyB0aGUgZnJhbWUgc3RhZ2VkIGEgd3JpdGUgc2luY2UgaXRzIGxhc3QgcmVsZWFzZSDigJQgZG9lcyBpdHMgYnVmZmVyIGV4aXN0PyAqL1xuICBnZXQgaGFzU3RhZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZSdzIHJlYWQsIG1pcnJvcmluZyB0aGUgZWFnZXIgZW5naW5lJ3MgcmVhZCBvcmRlciBieXRlLWZvci1ieXRlIChsYXcgMyk6XG4gICAqXG4gICAqICAgIDEuIHN0YWdlZCB3cml0ZXMgKyBmaXJzdC10b3VjaCBzbmFwc2hvdCDigJQgYGJ1ZmZlci5nZXRgIG92ZXIgaXRzIHdvcmtpbmdDb3B5IHdoZW4gdGhlIGJ1ZmZlclxuICAgKiAgICAgICBleGlzdHMsIGVsc2UgYG5hdGl2ZUdldGAgb3ZlciB0aGUgemVyby1jbG9uZSBmaXJzdC10b3VjaCBiYXNlICh0aGUgYnVmZmVyJ3MgYmFzZSBJUyB0aGF0XG4gICAqICAgICAgIHZpZXcsIHNvIHRoZSB0d28gdGllcnMgYWdyZWUgb24gY29udGVudCk7XG4gICAqICAgIDIuIExJVkUgc3RhdGUgdmlhIGBTaGFyZWRNZW1vcnkgwrcgZ2V0VmFsdWVgIGZvciBrZXlzIGFic2VudCBmcm9tIHRoZSBzbmFwc2hvdCDigJQgaW5jbHVkaW5nIGl0c1xuICAgKiAgICAgICBhZGRyZXNz4oaScm9vdCBmYWxsYmFjay4gVGhlIGVhZ2VyIGVuZ2luZSBoYWQgdGhpcyBleGFjdCBsaXZlIGZhbGxiYWNrIGZvciBzbmFwc2hvdC1taXNzaW5nXG4gICAqICAgICAgIGtleXM7IGJ5dGUtaWRlbnRpdHkgb3ZlciBwdXJpdHkuIEFmdGVyIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlIHN1Y2ggYSB2YWx1ZSBjYW4gYmUgdGhlIHZlcnlcbiAgICogICAgICAgY29udGFpbmVyIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgaG9sZHMgYXQgdGhlIHBhdGggKHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0IGl0LCBvclxuICAgKiAgICAgICByZXBsYWNlZCBhIGNvbnRhaW5lciBhYm92ZSBpdCksIHNvIHRoZSBiYXNlIGlzIGRldGFjaGVkIHRoZXJlIGZpcnN0XG4gICAqICAgICAgIChgVHJhbnNhY3Rpb25CdWZmZXIgwrcgZGV0YWNoQmFzZWApOiBhbiBpbi1wbGFjZSBlZGl0IG9mIHRoZSB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0KSB3cml0dGVuXG4gICAqICAgICAgIGJhY2sgaXMgcmVjb3JkZWQsIGFzIG9uIDkuMjguMCwgd2hvc2UgYmFzZSB3YXMgYSBjbG9uZSB0YWtlbiBhdCB0aGUgZmlyc3Qgd3JpdGUuXG4gICAqXG4gICAqIFJlYWRzIG5ldmVyIGNvbnN0cnVjdCB0aGUgYnVmZmVyICgjMTMpOiBhIGZyYW1lIHRoYXQgbmV2ZXIgd3JpdGVzIHBlcmZvcm1zIHplcm8gY2xvbmVzIG9mIHRoZVxuICAgKiBzaGFyZWQgc3RhdGUuXG4gICAqL1xuICByZWFkKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBhdCA9IHRoaXMuYXQocGF0aCwga2V5IGFzIHN0cmluZyk7XG4gICAgY29uc3QgZnJvbVNuYXBzaG90ID0gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5nZXQoYXQpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaCgpLCBhdCk7XG4gICAgaWYgKHR5cGVvZiBmcm9tU25hcHNob3QgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZnJvbVNuYXBzaG90O1xuICAgIGNvbnN0IGxpdmUgPSB0aGlzLnN0YXRlLmdldFZhbHVlKHRoaXMuX2FkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgLy8gVGllciAyIGFmdGVyIHRoZSBmaXJzdCB3cml0ZToga2VlcCB0aGUgZGlmZiBiYXNlIGV4YWN0IChzZWUgYWJvdmUpLlxuICAgIGlmICh0aGlzLmJ1ZmZlciAmJiBsaXZlICE9PSBudWxsICYmIHR5cGVvZiBsaXZlID09PSAnb2JqZWN0JykgdGhpcy5idWZmZXIuZGV0YWNoQmFzZShhdCk7XG4gICAgcmV0dXJuIGxpdmU7XG4gIH1cblxuICAvKiogUHV0IGEgdHJhY2tlZCByZWFkJ3MgdXNlci1sZXZlbCBrZXkgb24gdGhlIHJlYWRLZXlzIGxpc3QgKGxhdyA1KSDigJQgYSBuby1vcCB1bmxlc3MgdGhlIGZyYW1lIGtlZXBzIG9uZS4gKi9cbiAgbm90ZVJlYWQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW5jb2Rpbmc/LndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcpIHtcbiAgICAgICh0aGlzLnJlYWRLZXlzID8/PSBuZXcgU2V0KCkpLmFkZChwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIGNvbW1pdHRlZCBzdGF0ZSBhdCBga2V5YDogYXQgdGhlIGZyYW1lJ3MgYWRkcmVzcywgZWxzZSBhdCB0aGUgcm9vdCDigJQgbmV2ZXIgdGhlIHN0YWdlJ3Mgb3duXG4gICAqIHZpZXcuIFR5cGVkIGFzIGBTaGFyZWRNZW1vcnkgwrcgZ2V0VmFsdWVgIHR5cGVzIGl0LCB3aGljaCBgU3RhZ2VDb250ZXh0IMK3IGdldFJvb3RgIGhhbmRzIG9uLlxuICAgKi9cbiAgcmVhZExpdmUoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nZXRWYWx1ZSh0aGlzLl9hZGRyZXNzLCBbXSwga2V5KTtcbiAgfVxuXG4gIC8qKiBMaXZlIGNvbW1pdHRlZCBzdGF0ZSBhdCBga2V5YCBhdCB0aGUgcm9vdCDigJQgdHlwZWQgYXMgYFNoYXJlZE1lbW9yeSDCtyBnZXRWYWx1ZWAgKGBTdGFnZUNvbnRleHQgwrcgZ2V0R2xvYmFsYCkuICovXG4gIHJlYWRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nZXRWYWx1ZShbXSwgW10sIGtleSk7XG4gIH1cblxuICAvKiogRGlkIGEgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCDigJQgb24gaXQsIGFib3ZlIGl0IG9yIGJlbG93IGl0PyAoQSByZXBvcnQncyBxdWVzdGlvbjsgbmV2ZXIgdGhlIGhvdCBwYXRoLikgKi9cbiAgd2FzU3RhZ2VkKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmJ1ZmZlci53YXNTdGFnZWQocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIGF0IGBwYXRoYCBpbiB3aGF0IHRoZSBzdGFnZSBoYXMgc2VlbiDigJQgaXRzIHdvcmtpbmcgY29weSBvbmNlIGl0IHdyb3RlLCBlbHNlIGl0c1xuICAgKiBmaXJzdC10b3VjaCBiYXNlIOKAlCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weTogZm9yIGEgcmVwb3J0IHRoYXQgb25seSBjb21wYXJlcy5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLnBlZWsocGF0aCkgOiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoKCksIHBhdGgpO1xuICB9XG5cbiAgLyoqIFRoZSB2YWx1ZSBhdCBgcGF0aGAgaW4gdGhlIGZpcnN0LXRvdWNoIGJhc2Ug4oCUIGNvbW1pdHRlZCBzdGF0ZSBhcyB0aGUgZnJhbWUgZmlyc3QgdG91Y2hlZCBpdC4gKi9cbiAgYmFzZUF0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaCgpLCBwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hhdCB0aGUgZnJhbWUgc3RhZ2VkIChsYXcgNik6IHRoZSBidWZmZXIncyBwYXlsb2FkIGZpcnN0IOKAlCBub25lLCB0aGUgZW1wdHkgY29tbWl0LCB3aGVuXG4gICAqIGl0IHN0YWdlZCBub3RoaW5nICgjMTM6IHplcm8gY2xvbmVzKSDigJQgdGhlbiB0aGUgbmFtZXMgKGBzdGFtcE9mKClgKSwgcmVhZCBvbmNlIHRoZSBwYXlsb2FkIGlzXG4gICAqIGJ1aWx0LCBhbmQgYm90aCB0byBgcmVjb3JkQ29tbWl0YC4gVXNlciBjb2RlIGNhbiBydW4gd2hpbGUgdGhlIHBheWxvYWQgaXMgYnVpbHQgKGEgZ2V0dGVyIG9uIGFcbiAgICogc3RhZ2VkIHZhbHVlLCB3aGljaCB0aGUgbmV0LWNoYW5nZSBjb21wYXJlIGFuZCB0aGUgY2xvbmUgaW52b2tlKTsgd2hhdCBpdCBhZGRzIHRvIHRoZSBuYW1lcyDigJRcbiAgICogYW4gdW50cmFja2VkIHJlYWQsIHNheSDigJQgaXMgb24gdGhlIGJ1bmRsZS5cbiAgICovXG4gIGNvbW1pdChzdGFtcE9mOiAoKSA9PiBDb21taXRTdGFtcCk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmJ1ZmZlcj8uY29tbWl0KCk7XG4gICAgcmVjb3JkQ29tbWl0KHBheWxvYWQsIHN0YW1wT2YoKSwgeyBzdGF0ZTogdGhpcy5zdGF0ZSwgbWlycm9yOiB0aGlzLl9taXJyb3IsIGxvZzogdGhpcy5sb2cgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5kIHRoZSBmcmFtZSdzIGhvbGQgb24gc3RhdGUgKCMxM2IsIGxhdyA2KTogZHJvcCB0aGUgYnVmZmVyIChpdHMgd29ya2luZyBjb3B5IGFuZCB3aGF0ZXZlciBwcml2YXRlXG4gICAqIGNvcGllcyBpdHMgcmVhZHMgdG9vaykgYW5kIHRoZSBmaXJzdC10b3VjaCBiYXNlIChhIHJlZmVyZW5jZSB0aGF0IHBpbnMgb25lIGNvbW1pdHRlZC1zdGF0ZVxuICAgKiBHRU5FUkFUSU9OKS4gQm90aCByZS1jcmVhdGUgbGF6aWx5OiBhIGxhdGVyIHJlYWQgcmUtYW5jaG9ycyBvbiB0aGUgQ1VSUkVOVCBjb21taXR0ZWQgc3RhdGUsIGFuZCBhXG4gICAqIGxhdGVyIHdyaXRlIGJ1aWxkcyBhIGZyZXNoIGJ1ZmZlciBvbiBpdCDigJQgc28gYSBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgdGhlIHN0YXRlIGFmdGVyIHRoZVxuICAgKiBmaXJzdC4gV2l0aG91dCB0aGUgcmVsZWFzZSwgdGhlIGV4ZWN1dGlvbiB0cmVlIOKAlCB3aGljaCByZXRhaW5zIGV2ZXJ5IGZyYW1lIGZvciB0aGUgbGlmZXRpbWUgb2ZcbiAgICogdGhlIHJ1biDigJQgcmV0YWlucyBvbmUgc3RhdGUgZ2VuZXJhdGlvbiBwZXIgZXhlY3V0ZWQgc3RhZ2UgKG1lYXN1cmVkIE8oTsKyKSBiZWZvcmUgY29weS1vbi13cml0ZTtcbiAgICogYSA1MDAtaXRlcmF0aW9uIGFnZW50IE9PTWVkIGEgZGVmYXVsdCBOb2RlIGhlYXAsIGJhY2tsb2cgIzE4KS5cbiAgICovXG4gIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5iYXNlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGF3YXkgZXZlcnl0aGluZyB0aGUgZnJhbWUgc3RhZ2VkIGFuZCByZWFkIChsYXcgNik6IHRoZSBidWZmZXIsIHRoZSBmaXJzdC10b3VjaCBiYXNlICh0aGUgbmV4dFxuICAgKiBhdHRlbXB0IHJlLWFuY2hvcnMgb24gY29tbWl0dGVkIHN0YXRlIGFzIGl0IHN0YW5kcyBOT1cpIGFuZCB0aGUgcmVhZEtleXMgbGlzdCDigJQgYSBkaXNjYXJkZWRcbiAgICogYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgcmVhY2ggdGhlIG5leHQgYXR0ZW1wdCdzIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCwgb3IgYSBiYWNrd2FyZCBzbGljZVxuICAgKiB3b3VsZCBmb2xsb3cgYW4gZWRnZSB0aGF0IG5vIGNvbW1pdHRlZCB3cml0ZSBldmVyIGhhZC4gTm90aGluZyBpcyByZWNvcmRlZC5cbiAgICovXG4gIGRpc2NhcmQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWxlYXNlKCk7XG4gICAgdGhpcy5yZWFkS2V5cyA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Like a runtime heap with namespace isolation:
6
6
  * - A value is written at an ADDRESS — a path prefix the caller computed
7
- * (C2: the engine's frame decides it, `StageContext · address`) — and read
7
+ * (C2: the engine's frame decides it, `StageContext.ts · runAddress`) — and read
8
8
  * there first, then at the root
9
9
  * - Default values seed the root, and the container at an address when a
10
10
  * write creates it
@@ -83,4 +83,4 @@ class SharedMemory {
83
83
  }
84
84
  }
85
85
  exports.SharedMemory = SharedMemory;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7O0FBRUgsNkNBQXVFO0FBRXZFLHlDQUFxSDtBQUVySCxNQUFhLFlBQVk7SUFDZixPQUFPLEdBQTJCLEVBQUUsQ0FBQztJQUNyQyxjQUFjLENBQVc7SUFFakMsWUFBWSxhQUF1QixFQUFFLGNBQXdCO1FBQzNELElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUEsNkJBQWdCLEVBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdFLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEYsQ0FBQztJQUVELDJHQUEyRztJQUMzRyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDakYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELElBQUEsNEJBQWlCLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFBLHlCQUFjLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQVcsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBQSwrQkFBb0IsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBQSxxQkFBUSxFQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLE9BQTJCLEVBQUUsSUFBZSxFQUFFLEdBQVk7UUFDakUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFBLCtCQUFvQixFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUEseUJBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9FLE9BQU8sT0FBTyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUEseUJBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxVQUFVLENBQUMsU0FBc0IsRUFBRSxPQUFvQixFQUFFLEtBQW1CO1FBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSx5QkFBYyxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0Y7QUFsRUQsb0NBa0VDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaGFyZWRNZW1vcnkg4oCUIFRoZSBzaGFyZWQgc3RhdGUgY29udGFpbmVyIGZvciBhbGwgZmxvd2NoYXJ0IGV4ZWN1dGlvblxuICpcbiAqIExpa2UgYSBydW50aW1lIGhlYXAgd2l0aCBuYW1lc3BhY2UgaXNvbGF0aW9uOlxuICogLSBBIHZhbHVlIGlzIHdyaXR0ZW4gYXQgYW4gQUREUkVTUyDigJQgYSBwYXRoIHByZWZpeCB0aGUgY2FsbGVyIGNvbXB1dGVkXG4gKiAgIChDMjogdGhlIGVuZ2luZSdzIGZyYW1lIGRlY2lkZXMgaXQsIGBTdGFnZUNvbnRleHQgwrcgYWRkcmVzc2ApIOKAlCBhbmQgcmVhZFxuICogICB0aGVyZSBmaXJzdCwgdGhlbiBhdCB0aGUgcm9vdFxuICogLSBEZWZhdWx0IHZhbHVlcyBzZWVkIHRoZSByb290LCBhbmQgdGhlIGNvbnRhaW5lciBhdCBhbiBhZGRyZXNzIHdoZW4gYVxuICogICB3cml0ZSBjcmVhdGVzIGl0XG4gKiAtIEFjY2VwdHMgY29tbWl0IGJ1bmRsZXMgZnJvbSBUcmFuc2FjdGlvbkJ1ZmZlclxuICpcbiAqIENPUFktT04tV1JJVEUgKDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCk6XG4gKiBgY29udGV4dGAgaXMgYSBHRU5FUkFUSU9OLCBhbmQgYSBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gRXZlcnkgd3JpdGUg4oCUXG4gKiBgYXBwbHlQYXRjaGAgKGEgc3RhZ2UgY29tbWl0KSwgYHNldFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCDigJQgYnVpbGRzIHRoZSBuZXh0XG4gKiBnZW5lcmF0aW9uIGJ5IGNvcHlpbmcgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLFxuICogc2hhcmVzIGV2ZXJ5IG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQsIGFuZCBzd2Fwcy4gU28gYVxuICogZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIChpdHMgZmlyc3QtdG91Y2ggdmlldywgaXRzIHRyYW5zYWN0aW9uXG4gKiBidWZmZXIncyBkaWZmIGJhc2UpIHN0YXlzIGV4YWN0bHkgd2hhdCBpdCB3YXMsIGFuZCBhIHdyaXRlIGNvc3RzIE8od2hhdCBpdFxuICogd3JvdGUpLCBub3QgTyhzdGF0ZSkuXG4gKi9cblxuaW1wb3J0IHsgbWVyZ2VDb250ZXh0V2lucywgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldE5lc3RlZFZhbHVlLCBnZXRSdW5BbmRHbG9iYWxQYXRocywgbmV4dEdlbmVyYXRpb24sIHNldE5lc3RlZFZhbHVlLCB1cGRhdGVOZXN0ZWRWYWx1ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2hhcmVkTWVtb3J5IHtcbiAgcHJpdmF0ZSBjb250ZXh0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM/OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLCBpbml0aWFsQ29udGV4dD86IHVua25vd24pIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICBjb25zdCBzZWVkID0gbWVyZ2VDb250ZXh0V2lucyhpbml0aWFsQ29udGV4dCB8fCB7fSwgZGVmYXVsdFZhbHVlcyB8fCB7fSk7XG4gICAgLy8gRGV0YWNoZWQgT05DRSwgaGVyZTogYG1lcmdlQ29udGV4dFdpbnNgIGNvcGllcyBvbmx5IHRoZSB0b3AgbGV2ZWwsIHNvXG4gICAgLy8gdGhlIHNlZWQncyBuZXN0ZWQgdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIG9iamVjdHMuIEJlZm9yZSA5LjI5LjBcbiAgICAvLyB0aGUgZmlyc3QgY29tbWl0J3Mgd2hvbGUtc3RhdGUgY2xvbmUgZGV0YWNoZWQgdGhlbSAoYW5kIHVudGlsIHRoZW4gYVxuICAgIC8vIGNhbGxlciBtdXRhdGluZyBpdHMgYGluaXRpYWxDb250ZXh0YCBjaGFuZ2VkIGxpdmUgc3RhdGUgd2l0aCBubyByb3cpO1xuICAgIC8vIG5vdGhpbmcgcmUtY2xvbmVzIHRoZSBzdGF0ZSBhbnkgbW9yZSwgc28gdGhlIHNlZWQgaXMgZGV0YWNoZWQgYXRcbiAgICAvLyBjb25zdHJ1Y3Rpb24g4oCUIG9uZSBjbG9uZSBwZXIgcnVudGltZSwgbm90IG9uZSBwZXIgY29tbWl0LlxuICAgIHRoaXMuY29udGV4dCA9IE9iamVjdC5rZXlzKHNlZWQpLmxlbmd0aCA+IDAgPyBzdHJ1Y3R1cmVkQ2xvbmUoc2VlZCkgOiBzZWVkO1xuICB9XG5cbiAgLyoqIEdldHMgYSBjbG9uZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZXMuICovXG4gIGdldERlZmF1bHRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPyBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGVmYXVsdFZhbHVlcykgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVXBkYXRlcyBhIHZhbHVlIGF0IGBhZGRyZXNzYCArIGBwYXRoYCB1c2luZyBtZXJnZSBzZW1hbnRpY3MsIGFzIGEgbmV3IGdlbmVyYXRpb24gKHBhdGggY29weSArIHN3YXApLiAqL1xuICB1cGRhdGVWYWx1ZShhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm93bmVkUGF0aFRvKGFkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgdXBkYXRlTmVzdGVkVmFsdWUobmV4dCwgYWRkcmVzcywgcGF0aCwga2V5LCB2YWx1ZSwgdGhpcy5nZXREZWZhdWx0VmFsdWVzKCkpO1xuICAgIHRoaXMuY29udGV4dCA9IG5leHQ7XG4gIH1cblxuICAvKiogU2V0cyBhIHZhbHVlIGF0IGBhZGRyZXNzYCArIGBwYXRoYCB1c2luZyBvdmVyd3JpdGUgc2VtYW50aWNzLCBhcyBhIG5ldyBnZW5lcmF0aW9uIChwYXRoIGNvcHkgKyBzd2FwKS4gKi9cbiAgc2V0VmFsdWUoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vd25lZFBhdGhUbyhhZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIHNldE5lc3RlZFZhbHVlKG5leHQsIGFkZHJlc3MsIHBhdGgsIGtleSwgdmFsdWUsIHRoaXMuZ2V0RGVmYXVsdFZhbHVlcygpKTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29weSBvZiB0aGUgY3VycmVudCBnZW5lcmF0aW9uJ3Mgcm9vdCB3aG9zZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG9cbiAgICogYGtleWAgYXJlIG93bmVkIOKAlCB0aGUgaW4tcGxhY2UgaGVscGVycyBhYm92ZSB0aGVuIGVkaXQgb25seSBjb3BpZXMuXG4gICAqL1xuICBwcml2YXRlIG93bmVkUGF0aFRvKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgICBjb25zdCByb290ID0gb3duZWRSb290T2YodGhpcy5jb250ZXh0LCBvd25lZCk7XG4gICAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzLCBwYXRoKTtcbiAgICBvd25TcGluZShyb290LCBbLi4uKHJ1blBhdGggfHwgZ2xvYmFsUGF0aCksIGtleV0sIG93bmVkKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gdGhlIHN0b3JlLlxuICAgKiBMb29rcyB1cCBhdCBgYWRkcmVzc2AgZmlyc3QsIGZhbGxzIGJhY2sgdG8gdGhlIHJvb3QuXG4gICAqL1xuICBnZXRWYWx1ZShhZGRyZXNzPzogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg/OiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCB7IGdsb2JhbFBhdGgsIHJ1blBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3MsIHBhdGgpO1xuICAgIGNvbnN0IHZhbHVlID0gcnVuUGF0aCA/IGdldE5lc3RlZFZhbHVlKHRoaXMuY29udGV4dCwgcnVuUGF0aCwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogZ2V0TmVzdGVkVmFsdWUodGhpcy5jb250ZXh0LCBnbG9iYWxQYXRoLCBrZXkpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGVudGlyZSBzdGF0ZSBhcyBhIEpTT04gb2JqZWN0IOKAlCB0aGUgY3VycmVudCBnZW5lcmF0aW9uLCBieSByZWZlcmVuY2UuIE5ldmVyIG11dGF0ZSBpdC4gKi9cbiAgZ2V0U3RhdGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XG4gIH1cblxuICAvKiogQXBwbGllcyBhIGNvbW1pdCBidW5kbGUgZnJvbSBUcmFuc2FjdGlvbkJ1ZmZlcjogYnVpbGRzIHRoZSBuZXh0IGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluLiAqL1xuICBhcHBseVBhdGNoKG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dEdlbmVyYXRpb24odGhpcy5jb250ZXh0LCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlKTtcbiAgfVxufVxuIl19
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7O0FBRUgsNkNBQXVFO0FBRXZFLHlDQUFxSDtBQUVySCxNQUFhLFlBQVk7SUFDZixPQUFPLEdBQTJCLEVBQUUsQ0FBQztJQUNyQyxjQUFjLENBQVc7SUFFakMsWUFBWSxhQUF1QixFQUFFLGNBQXdCO1FBQzNELElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUEsNkJBQWdCLEVBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdFLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEYsQ0FBQztJQUVELDJHQUEyRztJQUMzRyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDakYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELElBQUEsNEJBQWlCLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFBLHlCQUFjLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQVcsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBQSwrQkFBb0IsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBQSxxQkFBUSxFQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLE9BQTJCLEVBQUUsSUFBZSxFQUFFLEdBQVk7UUFDakUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFBLCtCQUFvQixFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUEseUJBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9FLE9BQU8sT0FBTyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUEseUJBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxVQUFVLENBQUMsU0FBc0IsRUFBRSxPQUFvQixFQUFFLEtBQW1CO1FBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSx5QkFBYyxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0Y7QUFsRUQsb0NBa0VDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaGFyZWRNZW1vcnkg4oCUIFRoZSBzaGFyZWQgc3RhdGUgY29udGFpbmVyIGZvciBhbGwgZmxvd2NoYXJ0IGV4ZWN1dGlvblxuICpcbiAqIExpa2UgYSBydW50aW1lIGhlYXAgd2l0aCBuYW1lc3BhY2UgaXNvbGF0aW9uOlxuICogLSBBIHZhbHVlIGlzIHdyaXR0ZW4gYXQgYW4gQUREUkVTUyDigJQgYSBwYXRoIHByZWZpeCB0aGUgY2FsbGVyIGNvbXB1dGVkXG4gKiAgIChDMjogdGhlIGVuZ2luZSdzIGZyYW1lIGRlY2lkZXMgaXQsIGBTdGFnZUNvbnRleHQudHMgwrcgcnVuQWRkcmVzc2ApIOKAlCBhbmQgcmVhZFxuICogICB0aGVyZSBmaXJzdCwgdGhlbiBhdCB0aGUgcm9vdFxuICogLSBEZWZhdWx0IHZhbHVlcyBzZWVkIHRoZSByb290LCBhbmQgdGhlIGNvbnRhaW5lciBhdCBhbiBhZGRyZXNzIHdoZW4gYVxuICogICB3cml0ZSBjcmVhdGVzIGl0XG4gKiAtIEFjY2VwdHMgY29tbWl0IGJ1bmRsZXMgZnJvbSBUcmFuc2FjdGlvbkJ1ZmZlclxuICpcbiAqIENPUFktT04tV1JJVEUgKDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCk6XG4gKiBgY29udGV4dGAgaXMgYSBHRU5FUkFUSU9OLCBhbmQgYSBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gRXZlcnkgd3JpdGUg4oCUXG4gKiBgYXBwbHlQYXRjaGAgKGEgc3RhZ2UgY29tbWl0KSwgYHNldFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCDigJQgYnVpbGRzIHRoZSBuZXh0XG4gKiBnZW5lcmF0aW9uIGJ5IGNvcHlpbmcgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLFxuICogc2hhcmVzIGV2ZXJ5IG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQsIGFuZCBzd2Fwcy4gU28gYVxuICogZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIChpdHMgZmlyc3QtdG91Y2ggdmlldywgaXRzIHRyYW5zYWN0aW9uXG4gKiBidWZmZXIncyBkaWZmIGJhc2UpIHN0YXlzIGV4YWN0bHkgd2hhdCBpdCB3YXMsIGFuZCBhIHdyaXRlIGNvc3RzIE8od2hhdCBpdFxuICogd3JvdGUpLCBub3QgTyhzdGF0ZSkuXG4gKi9cblxuaW1wb3J0IHsgbWVyZ2VDb250ZXh0V2lucywgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldE5lc3RlZFZhbHVlLCBnZXRSdW5BbmRHbG9iYWxQYXRocywgbmV4dEdlbmVyYXRpb24sIHNldE5lc3RlZFZhbHVlLCB1cGRhdGVOZXN0ZWRWYWx1ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2hhcmVkTWVtb3J5IHtcbiAgcHJpdmF0ZSBjb250ZXh0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM/OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLCBpbml0aWFsQ29udGV4dD86IHVua25vd24pIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICBjb25zdCBzZWVkID0gbWVyZ2VDb250ZXh0V2lucyhpbml0aWFsQ29udGV4dCB8fCB7fSwgZGVmYXVsdFZhbHVlcyB8fCB7fSk7XG4gICAgLy8gRGV0YWNoZWQgT05DRSwgaGVyZTogYG1lcmdlQ29udGV4dFdpbnNgIGNvcGllcyBvbmx5IHRoZSB0b3AgbGV2ZWwsIHNvXG4gICAgLy8gdGhlIHNlZWQncyBuZXN0ZWQgdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIG9iamVjdHMuIEJlZm9yZSA5LjI5LjBcbiAgICAvLyB0aGUgZmlyc3QgY29tbWl0J3Mgd2hvbGUtc3RhdGUgY2xvbmUgZGV0YWNoZWQgdGhlbSAoYW5kIHVudGlsIHRoZW4gYVxuICAgIC8vIGNhbGxlciBtdXRhdGluZyBpdHMgYGluaXRpYWxDb250ZXh0YCBjaGFuZ2VkIGxpdmUgc3RhdGUgd2l0aCBubyByb3cpO1xuICAgIC8vIG5vdGhpbmcgcmUtY2xvbmVzIHRoZSBzdGF0ZSBhbnkgbW9yZSwgc28gdGhlIHNlZWQgaXMgZGV0YWNoZWQgYXRcbiAgICAvLyBjb25zdHJ1Y3Rpb24g4oCUIG9uZSBjbG9uZSBwZXIgcnVudGltZSwgbm90IG9uZSBwZXIgY29tbWl0LlxuICAgIHRoaXMuY29udGV4dCA9IE9iamVjdC5rZXlzKHNlZWQpLmxlbmd0aCA+IDAgPyBzdHJ1Y3R1cmVkQ2xvbmUoc2VlZCkgOiBzZWVkO1xuICB9XG5cbiAgLyoqIEdldHMgYSBjbG9uZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZXMuICovXG4gIGdldERlZmF1bHRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPyBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGVmYXVsdFZhbHVlcykgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVXBkYXRlcyBhIHZhbHVlIGF0IGBhZGRyZXNzYCArIGBwYXRoYCB1c2luZyBtZXJnZSBzZW1hbnRpY3MsIGFzIGEgbmV3IGdlbmVyYXRpb24gKHBhdGggY29weSArIHN3YXApLiAqL1xuICB1cGRhdGVWYWx1ZShhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm93bmVkUGF0aFRvKGFkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgdXBkYXRlTmVzdGVkVmFsdWUobmV4dCwgYWRkcmVzcywgcGF0aCwga2V5LCB2YWx1ZSwgdGhpcy5nZXREZWZhdWx0VmFsdWVzKCkpO1xuICAgIHRoaXMuY29udGV4dCA9IG5leHQ7XG4gIH1cblxuICAvKiogU2V0cyBhIHZhbHVlIGF0IGBhZGRyZXNzYCArIGBwYXRoYCB1c2luZyBvdmVyd3JpdGUgc2VtYW50aWNzLCBhcyBhIG5ldyBnZW5lcmF0aW9uIChwYXRoIGNvcHkgKyBzd2FwKS4gKi9cbiAgc2V0VmFsdWUoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vd25lZFBhdGhUbyhhZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIHNldE5lc3RlZFZhbHVlKG5leHQsIGFkZHJlc3MsIHBhdGgsIGtleSwgdmFsdWUsIHRoaXMuZ2V0RGVmYXVsdFZhbHVlcygpKTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29weSBvZiB0aGUgY3VycmVudCBnZW5lcmF0aW9uJ3Mgcm9vdCB3aG9zZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG9cbiAgICogYGtleWAgYXJlIG93bmVkIOKAlCB0aGUgaW4tcGxhY2UgaGVscGVycyBhYm92ZSB0aGVuIGVkaXQgb25seSBjb3BpZXMuXG4gICAqL1xuICBwcml2YXRlIG93bmVkUGF0aFRvKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgICBjb25zdCByb290ID0gb3duZWRSb290T2YodGhpcy5jb250ZXh0LCBvd25lZCk7XG4gICAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzLCBwYXRoKTtcbiAgICBvd25TcGluZShyb290LCBbLi4uKHJ1blBhdGggfHwgZ2xvYmFsUGF0aCksIGtleV0sIG93bmVkKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gdGhlIHN0b3JlLlxuICAgKiBMb29rcyB1cCBhdCBgYWRkcmVzc2AgZmlyc3QsIGZhbGxzIGJhY2sgdG8gdGhlIHJvb3QuXG4gICAqL1xuICBnZXRWYWx1ZShhZGRyZXNzPzogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg/OiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCB7IGdsb2JhbFBhdGgsIHJ1blBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3MsIHBhdGgpO1xuICAgIGNvbnN0IHZhbHVlID0gcnVuUGF0aCA/IGdldE5lc3RlZFZhbHVlKHRoaXMuY29udGV4dCwgcnVuUGF0aCwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogZ2V0TmVzdGVkVmFsdWUodGhpcy5jb250ZXh0LCBnbG9iYWxQYXRoLCBrZXkpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGVudGlyZSBzdGF0ZSBhcyBhIEpTT04gb2JqZWN0IOKAlCB0aGUgY3VycmVudCBnZW5lcmF0aW9uLCBieSByZWZlcmVuY2UuIE5ldmVyIG11dGF0ZSBpdC4gKi9cbiAgZ2V0U3RhdGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XG4gIH1cblxuICAvKiogQXBwbGllcyBhIGNvbW1pdCBidW5kbGUgZnJvbSBUcmFuc2FjdGlvbkJ1ZmZlcjogYnVpbGRzIHRoZSBuZXh0IGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluLiAqL1xuICBhcHBseVBhdGNoKG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dEdlbmVyYXRpb24odGhpcy5jb250ZXh0LCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlKTtcbiAgfVxufVxuIl19