footprintjs 9.23.1 → 9.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/lib/reactive/arrayTraps.js +4 -3
- package/dist/esm/lib/reactive/createTypedScope.js +17 -21
- package/dist/esm/lib/reactive/liveView.d.ts +42 -3
- package/dist/esm/lib/reactive/liveView.js +61 -5
- package/dist/esm/lib/reactive/writeTraps.d.ts +2 -1
- package/dist/esm/lib/reactive/writeTraps.js +1 -1
- package/dist/lib/reactive/arrayTraps.js +3 -2
- package/dist/lib/reactive/createTypedScope.js +16 -20
- package/dist/lib/reactive/liveView.js +64 -6
- package/dist/lib/reactive/writeTraps.js +1 -1
- package/dist/types/lib/reactive/liveView.d.ts +42 -3
- package/dist/types/lib/reactive/writeTraps.d.ts +2 -1
- package/package.json +1 -1
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
* `liveView.ts`), over an {@link elementSink}. A fix lands in a leaf once.
|
|
60
60
|
*/
|
|
61
61
|
import { shouldWrapWithProxy } from './allowlist.js';
|
|
62
|
-
import { liveGetTrap, liveInspectionTraps, liveObject } from './liveView.js';
|
|
62
|
+
import { liveGetTrap, liveInspectionTraps, liveObject, MemberCache } from './liveView.js';
|
|
63
63
|
import { unwrapProxy } from './structuralWrite.js';
|
|
64
64
|
import { elementSink, sinkDeleteTrap, sinkSetTrap } from './writeTraps.js';
|
|
65
65
|
/** Methods that mutate the array in-place. We intercept and copy-on-write. */
|
|
@@ -200,9 +200,10 @@ function wrapElementMember(value, sink, path, visited) {
|
|
|
200
200
|
* law the nested and terminal object proxies follow (liveView.ts).
|
|
201
201
|
*/
|
|
202
202
|
function createElementProxy(raw, sink, segments, visited) {
|
|
203
|
+
const members = new MemberCache();
|
|
203
204
|
const live = () => liveObject(raw, sink.readAt(segments));
|
|
204
205
|
return new Proxy(raw, {
|
|
205
|
-
get: liveGetTrap(live, segments, (value, path) => wrapElementMember(value, sink, path, visited)),
|
|
206
|
+
get: liveGetTrap(live, segments, (value, path) => wrapElementMember(value, sink, path, visited), members),
|
|
206
207
|
set: sinkSetTrap(sink, segments),
|
|
207
208
|
deleteProperty: sinkDeleteTrap(sink, segments),
|
|
208
209
|
...liveInspectionTraps(live),
|
|
@@ -257,4 +258,4 @@ export function createArrayProxy(getCurrent, commit) {
|
|
|
257
258
|
getOwnPropertyDescriptor: (_target, prop) => Object.getOwnPropertyDescriptor(read(), prop),
|
|
258
259
|
});
|
|
259
260
|
}
|
|
260
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlUcmFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvYXJyYXlUcmFwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFrQixXQUFXLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNGLDhFQUE4RTtBQUM5RSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQy9CLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sWUFBWTtDQUNiLENBQUMsQ0FBQztBQUtILGdGQUFnRjtBQUVoRjtzRUFDc0U7QUFDdEUsU0FBUyxPQUFPLENBQUMsT0FBa0IsRUFBRSxJQUFxQjtJQUN4RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdGLENBQUM7QUFFRCx1R0FBdUc7QUFDdkcsU0FB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RSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3hELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0ZBQWdGO1FBQy9GLENBQUM7UUFDRCxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUk7WUFDMUIsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUM7UUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsd0JBQXdCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDO0tBQzNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2FycmF5VHJhcHMgLS0gQXJyYXkgbXV0YXRpb24gaW50ZXJjZXB0aW9uIHZpYSBQcm94eS5cbiAqXG4gKiBXaGVuIHNjb3BlLml0ZW1zIGlzIGFuIGFycmF5LCB3ZSByZXR1cm4gYSBQcm94eSB0aGF0IGludGVyY2VwdHMgbXV0YXRpbmdcbiAqIG1ldGhvZHMgKHB1c2gsIHBvcCwgc3BsaWNlLCBldGMuKSBBTkQgaW5kZXhlZCBhY2Nlc3MuIEVhY2ggbXV0YXRpb246XG4gKiAxLiBDbG9uZXMgdGhlIGN1cnJlbnQgYXJyYXlcbiAqIDIuIEFwcGxpZXMgdGhlIG11dGF0aW9uIHRvIHRoZSBjbG9uZVxuICogMy4gQ29tbWl0cyB0aGUgbmV3IGFycmF5IHZpYSB0aGUgY29tbWl0IGNhbGxiYWNrXG4gKlxuICogTm9uLW11dGF0aW5nIG1ldGhvZHMgKG1hcCwgZmlsdGVyLCBmb3JFYWNoLCBldGMuKSBwYXNzIHRocm91Z2ggdG8gdGhlXG4gKiBjdXJyZW50IGFycmF5IHNuYXBzaG90IHdpdGhvdXQgaW50ZXJjZXB0aW9uLlxuICpcbiAqIFRoZSBvcmlnaW5hbCBhcnJheSBpbiBzdGF0ZSBpcyBORVZFUiBtdXRhdGVkIGRpcmVjdGx5IC0tIGFsbCB3cml0ZXMgZ29cbiAqIHRocm91Z2ggdGhlIGNvbW1pdCBjYWxsYmFjayB3aGljaCBjYWxscyBzZXRWYWx1ZS91cGRhdGVWYWx1ZS5cbiAqXG4gKiDilIDilIAgT25seSB0aGUgQVNTSUdORUQgdmFsdWUgaXMgdW53cmFwcGVkICg5LjIzLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogTGFuZG1pbmUgMSBzYXlzIHRoZSBzZXQgdHJhcCBKU09OLXJvdW5kLXRyaXBzIHRoZSB2YWx1ZSB0aGUgY2FsbGVyIGhhbmRlZFxuICogaW4uIEZvciBhbiBhcnJheSB0aGF0IGlzIHRoZSBpbmRleC1hc3NpZ25lZCBlbGVtZW50LCBhIG11dGF0aW5nIG1ldGhvZCdzXG4gKiBhcmd1bWVudHMgKGBwdXNoKHgpYCwgYHNwbGljZShpLCBuLCAuLi5pdGVtcylgLCBgZmlsbCh4KWApLCBvciB0aGUgbGVhZiBhblxuICogZWxlbWVudCBwcm94eSB3cml0ZXMg4oCUIGFuZCBpdCBpcyB1bndyYXBwZWQgSEVSRSwgYXQgdGhlIHRyYXAgdGhhdCByZWNlaXZlc1xuICogaXQuIFRoZSByZWJ1aWx0IGFycmF5IGlzIGhhbmRlZCB0byBgY29tbWl0YCBhcyBpdCBpczogZXZlcnkgc2libGluZyB0aGVcbiAqIGNhbGxlciBkaWQgbm90IHRvdWNoIHBhc3NlcyB0aHJvdWdoIGJ5IHJlZmVyZW5jZSwgYERhdGVgcyBhbmQgYE1hcGBzXG4gKiBpbnRhY3QuIFVudGlsIDkuMjMuMCB0aGUgY29tbWl0IGNhbGxiYWNrcyByb3VuZC10cmlwcGVkIHRoZSBXSE9MRSByZWJ1aWx0XG4gKiBhcnJheSwgd2hpY2ggc3RyaW5naWZpZWQgdW50b3VjaGVkIHNpYmxpbmdzIGFuZCB3YXMgTyhOKSBwZXIgZWxlbWVudCB3cml0ZS5cbiAqIFRoZSBvbmUgdGhpbmcgdGhlIHJvdW5kLXRyaXAgdXNlZCB0byBkbyBmb3IgdGhlIGFycmF5J3Mgb3duIHNoYXBlIOKAlCBhblxuICogZW1wdGllZCBvciBza2lwcGVkIHNsb3QgYmVjYW1lIGBudWxsYCwgSlNPTidzIG9ubHkgc3BlbGxpbmcgZm9yIGEgaG9sZSDigJRcbiAqIGlzIG5vdyBkb25lIGV4cGxpY2l0bHkgYnkgdGhlIHRyYXBzIHRoYXQgY2FuIGNyZWF0ZSBvbmUgKGBkZWxldGUgYXJyW2ldYCxcbiAqIGBhcnJbaV0gPSB2YCBwYXN0IHRoZSBlbmQsIGBhcnIubGVuZ3RoID0gbmAgZ3Jvd3RoKS5cbiAqXG4gKiDilIDilIAgSW5kZXhlZCBhY2Nlc3MgaXMgcGFydCBvZiB0aGUgY2hhaW4gKDkuMjIuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBgYXJyW2ldYCB1c2VkIHRvIGhhbmQgYmFjayB0aGUgUkFXIGVsZW1lbnQsIHdoaWNoIGJyb2tlIHRoZSBwcm94eSBjaGFpbiBhdFxuICogZXhhY3RseSB0aGUgcG9pbnQgdXNlcnMgd3JpdGUgdGhyb3VnaCBpdDogYG9yZGVyLmxpbmVzWzBdLnF0eSA9IDRgIHdhcyBhblxuICogaW4tcGxhY2UgbXV0YXRpb24gb2YgYSBib3Jyb3dlZCByZWFkIOKAlCBubyB0cmFwLCBubyB0cmFjZSByb3csIG5vIGNvbW1pdC5cbiAqIEJlZm9yZSB0aGUgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgdGhhdCBib3Jyb3dlZCB2YWx1ZSBJUyBjb21taXR0ZWRcbiAqIHNoYXJlZCBtZW1vcnksIHNvIHRoZSBtdXRhdGlvbiBtb3ZlZCBzdGF0ZSB3aGlsZSB0aGUgbG9nIHN0YXllZCBlbXB0eTsgYWZ0ZXJcbiAqIGl0LCB0aGUgbXV0YXRpb24gbGFuZGVkIGluIHRoZSBwcml2YXRlIGJ1ZmZlciBjbG9uZSBhbmQgd2FzIGRyb3BwZWQuIFNhbWVcbiAqIGV4cHJlc3Npb24sIHR3byBzaWxlbnQgb3V0Y29tZXMuXG4gKlxuICogTm93IGFuIGluZGV4ZWQgcmVhZCBvZiBhIHdyYXBwYWJsZSBlbGVtZW50IHJldHVybnMgYW4gRUxFTUVOVCBQUk9YWSB0aGF0XG4gKiBhY2N1bXVsYXRlcyB0aGUgcGF0aCBpbnNpZGUgdGhlIGVsZW1lbnQgYW5kLCBvbiB3cml0ZSwgcmVidWlsZHMgdGhlIGFycmF5XG4gKiBpbW11dGFibHkgKGBzdHJ1Y3R1cmFsV3JpdGUuc2V0SW5QYXRoYCwgYmVoaW5kIGB3cml0ZVRyYXBzLmVsZW1lbnRTaW5rYClcbiAqIGFuZCBoYW5kcyB0aGUgd2hvbGUgbmV3IGFycmF5IHRvIGBjb21taXRgIOKAlCB0aGUgc2FtZSBmdW5uZWwgYHB1c2hgIGFscmVhZHlcbiAqIHVzZWQuIE9uZSB3cml0ZSBwYXRoIGZvciB0aGUgd2hvbGUgYXJyYXksIHdoYXRldmVyIGRlcHRoIGl0IGlzIGFkZHJlc3NlZCBhdC5cbiAqXG4gKiDilIDilIAgV2hhdCBpcyBzdGlsbCBOT1Qgc2VlbiAoYnkgZGVzaWduKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIEVsZW1lbnRzIHJlYWNoZWQgV0lUSE9VVCBhbiBpbmRleCDigJQgYGZpbmQoKWAsIGBmaWx0ZXIoKWAsIGBmb3LigKZvZmAsXG4gKiBgZm9yRWFjaGAsIGRlc3RydWN0dXJpbmcg4oCUIGFyZSBoYW5kZWQgYmFjayByYXcsIGJlY2F1c2Ugd3JhcHBpbmcgdGhlbSB3b3VsZFxuICogbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXQgb2YgZXZlcnkgcmVhZCBtZXRob2QgKGBtYXBgIHdvdWxkIGJ1aWxkIGFuIGFycmF5XG4gKiBvZiBwcm94aWVzKSBmb3IgYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LiBNdXRhdGluZyBvbmUgb2YgdGhvc2UgaXNcbiAqIG5vdCBsb3N0IGluIHNpbGVuY2UgZWl0aGVyOiBgU3RhZ2VDb250ZXh0YCBjb21wYXJlcyB3aGF0IGEgc3RhZ2UgUkVBRCB3aXRoXG4gKiB3aGF0IHRoZSB2YWx1ZSBob2xkcyBhdCBjb21taXQgYW5kLCBpbiBkZXYgbW9kZSwgd2FybnMgd2l0aCB0aGUgZXhhY3QgcGF0aC5cbiAqIFNlZSBzcmMvbGliL3JlYWN0aXZlL1JFQURNRS5tZC5cbiAqXG4gKiDilIDilIAgU2hhcGUgKDkuMjMuMSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBgY3JlYXRlQXJyYXlQcm94eWAgYW5kIGBjcmVhdGVFbGVtZW50UHJveHlgIGFyZSBPUkNIRVNUUkFUT1JTOiB0aGV5IHdpcmVcbiAqIHRyYXBzIGFuZCBob2xkIHRoZSBjYWNoZXMuIEV2ZXJ5IHRyYXAgYm9keSBpcyBhIG5hbWVkIGxlYWYgYmVsb3cg4oCUIG9uZVxuICogY29uY2VybiBlYWNoIOKAlCBhbmQgdGhlIGVsZW1lbnQgcHJveHkncyBzZXQvZGVsZXRlL2dldCB0cmFwcyBhcmUgdGhlIFNBTUVcbiAqIGxlYXZlcyB0aGUgbmVzdGVkIGFuZCB0ZXJtaW5hbCBvYmplY3QgcHJveGllcyB1c2UgKGB3cml0ZVRyYXBzLnRzYCxcbiAqIGBsaXZlVmlldy50c2ApLCBvdmVyIGFuIHtAbGluayBlbGVtZW50U2lua30uIEEgZml4IGxhbmRzIGluIGEgbGVhZiBvbmNlLlxuICovXG5cbmltcG9ydCB7IHNob3VsZFdyYXBXaXRoUHJveHkgfSBmcm9tICcuL2FsbG93bGlzdC5qcyc7XG5pbXBvcnQgeyBsaXZlR2V0VHJhcCwgbGl2ZUluc3BlY3Rpb25UcmFwcywgbGl2ZU9iamVjdCB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgdW53cmFwUHJveHkgfSBmcm9tICcuL3N0cnVjdHVyYWxXcml0ZS5qcyc7XG5pbXBvcnQgeyB0eXBlIFdyaXRlU2luaywgZWxlbWVudFNpbmssIHNpbmtEZWxldGVUcmFwLCBzaW5rU2V0VHJhcCB9IGZyb20gJy4vd3JpdGVUcmFwcy5qcyc7XG5cbi8qKiBNZXRob2RzIHRoYXQgbXV0YXRlIHRoZSBhcnJheSBpbi1wbGFjZS4gV2UgaW50ZXJjZXB0IGFuZCBjb3B5LW9uLXdyaXRlLiAqL1xuY29uc3QgTVVUQVRJTkdfTUVUSE9EUyA9IG5ldyBTZXQoW1xuICAncHVzaCcsXG4gICdwb3AnLFxuICAnc2hpZnQnLFxuICAndW5zaGlmdCcsXG4gICdzcGxpY2UnLFxuICAnc29ydCcsXG4gICdyZXZlcnNlJyxcbiAgJ2ZpbGwnLFxuICAnY29weVdpdGhpbicsXG5dKTtcblxudHlwZSBSZWFkID0gKCkgPT4gdW5rbm93bltdO1xudHlwZSBXcml0ZSA9IChuZXh0OiB1bmtub3duW10pID0+IHZvaWQ7XG5cbi8vIC0tIExlYXZlczogcmVhZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBXSFkgYE51bWJlcihwcm9wKWA6IHRoZSBoaXN0b3JpY2FsIHJlYWRpbmcgb2YgYW4gaW5kZXggbmFtZSDigJQgYCcwMSdgIGFuZFxuICogIGAnJ2AgYWRkcmVzcyBzbG90cyAxIGFuZCAwLCBhcyB0aGV5IGFsd2F5cyBoYXZlLiBJbiByYW5nZSBvbmx5LiAqL1xuZnVuY3Rpb24gaW5kZXhJbihjdXJyZW50OiB1bmtub3duW10sIHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHByb3ApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGN1cnJlbnQubGVuZ3RoID8gaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBBIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4IG5hbWVkIGJ5IGBwcm9wYCAoYW55IHJhbmdlIOKAlCBhIHdyaXRlIHBhc3QgdGhlIGVuZCBncm93cyB0aGUgYXJyYXkpLiAqL1xuZnVuY3Rpb24gaW5kZXhOYW1lZChwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpbmRleCA9IE51bWJlcihwcm9wKTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoaW5kZXgpICYmIGluZGV4ID49IDAgPyBpbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFdIWTogYSBub24tbXV0YXRpbmcgcmVhZCBhbnN3ZXJzIGZyb20gdGhlIENVUlJFTlQgYXJyYXksIG5ldmVyIHRoZVxuICogIGNyZWF0aW9uLXRpbWUgdGFyZ2V0IOKAlCBhIG1ldGhvZCBpcyBib3VuZCB0byBpdCwgYW55dGhpbmcgZWxzZSByZWFkIG9mZiBpdC4gKi9cbmZ1bmN0aW9uIGJvdW5kTWVtYmVyKGN1cnJlbnQ6IHVua25vd25bXSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdW5rbm93biB7XG4gIGNvbnN0IHZhbCA9IChjdXJyZW50IGFzIGFueSlbcHJvcF07XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nID8gdmFsLmJpbmQoY3VycmVudCkgOiB2YWw7XG59XG5cbnR5cGUgRWxlbWVudENhY2hlID0gTWFwPG51bWJlciwgeyByZWY6IHVua25vd247IHByb3h5OiB1bmtub3duIH0+O1xuXG4vKiogV0hZIHRoZSBjYWNoZTogcmVhZGluZyBgbGluZXNbaV0ucXR5YCBpbiBhIGxvb3AgbXVzdCBub3QgYWxsb2NhdGUgYSBwcm94eVxuICogIHBlciByZWFkLCBhbmQgYGxpbmVzWzBdID09PSBsaW5lc1swXWAgbXVzdCBob2xkIHdpdGhpbiBhIHN0YWdlLiBWYWxpZGF0ZWQgYnlcbiAqICByYXcgaWRlbnRpdHkg4oCUIGEgY29tbWl0IHJlcGxhY2VzIHRoZSBhcnJheSwgdGhlIHJlZiBjaGVjayBtaXNzZXMsIGFuZCBhXG4gKiAgZnJlc2ggcHJveHkgaXMgYnVpbHQgb3ZlciB0aGUgbmV3IGVsZW1lbnQuIEEgcHJpbWl0aXZlIGlzIGhhbmRlZCBiYWNrIHJhdy4gKi9cbmZ1bmN0aW9uIGNhY2hlZEVsZW1lbnQoY2FjaGU6IEVsZW1lbnRDYWNoZSwgZWxlbWVudDogdW5rbm93biwgaW5kZXg6IG51bWJlciwgcmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlKTogdW5rbm93biB7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eShlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChpbmRleCk7XG4gIGlmIChjYWNoZWQgJiYgY2FjaGVkLnJlZiA9PT0gZWxlbWVudCkgcmV0dXJuIGNhY2hlZC5wcm94eTtcbiAgY29uc3Qgd3JhcHBlZCA9IHdyYXBFbGVtZW50TWVtYmVyKGVsZW1lbnQsIGVsZW1lbnRTaW5rKHJlYWQsIHdyaXRlLCBpbmRleCksIFtdLCBuZXcgU2V0PG9iamVjdD4oKSk7XG4gIGNhY2hlLnNldChpbmRleCwgeyByZWY6IGVsZW1lbnQsIHByb3h5OiB3cmFwcGVkIH0pO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuLy8gLS0gTGVhdmVzOiB3cml0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFNsb3RzIGZyb20gdGhlIGN1cnJlbnQgZW5kIHVwIHRvIChub3QgaW5jbHVkaW5nKSBgdXBUb2AgYmVjb21lIGBudWxsYCDigJRcbiAqICB0aGUgSlNPTiBzcGVsbGluZyBvZiBhIGhvbGUsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLWFycmF5IHJvdW5kLXRyaXAgdXNlZFxuICogIHRvIHByb2R1Y2UgZm9yIHRoZW0uIE5vLW9wIHdoZW4gYHVwVG9gIGlzIHdpdGhpbiB0aGUgYXJyYXkuICovXG5mdW5jdGlvbiBmaWxsSG9sZXMoYXJyOiB1bmtub3duW10sIHVwVG86IG51bWJlcik6IHZvaWQge1xuICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aDsgaSA8IHVwVG87IGkrKykgYXJyW2ldID0gbnVsbDtcbn1cblxuLyoqIFdIWTogYSBtdXRhdGluZyBtZXRob2QgcnVucyBvbiBhIENPUFksIHdpdGggaXRzIGFyZ3VtZW50cyB1bndyYXBwZWQgKHRoZXlcbiAqICBhcmUgdGhlIGFzc2lnbmVkIHZhbHVlczsgYSBudW1iZXIgb3IgYSBjb21wYXJhdG9yIHBhc3NlcyB0aHJvdWdoKSwgYW5kIHRoZVxuICogIGNvcHkgaXMgY29tbWl0dGVkIHdob2xlLiBUaGUgYXJyYXkgaW4gc3RhdGUgaXMgbmV2ZXIgdG91Y2hlZC4gKi9cbmZ1bmN0aW9uIG11dGF0aW5nTWV0aG9kKHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgbmFtZTogc3RyaW5nKTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gICAgY29uc3QgcmVzdWx0ID0gKGNsb25lIGFzIGFueSlbbmFtZV0oLi4uYXJncy5tYXAodW53cmFwUHJveHkpKTtcbiAgICB3cml0ZShjbG9uZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuLyoqIGBhcnJbaV0gPSB2YDogY29weSwgYG51bGxgIHRoZSBzbG90cyBhIHdyaXRlIHBhc3QgdGhlIGVuZCBza2lwcywgcGxhY2UgdGhlIHVud3JhcHBlZCB2YWx1ZSwgY29tbWl0LiAqL1xuZnVuY3Rpb24gc2V0SW5kZXgocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBpbmRleDogbnVtYmVyLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBjbG9uZSA9IFsuLi5yZWFkKCldO1xuICBmaWxsSG9sZXMoY2xvbmUsIGluZGV4KTtcbiAgY2xvbmVbaW5kZXhdID0gdW53cmFwUHJveHkodmFsdWUpO1xuICB3cml0ZShjbG9uZSk7XG59XG5cbi8qKiBgYXJyLmxlbmd0aCA9IG5gOiBjb3B5LCBgbnVsbGAgdGhlIHNsb3RzIGdyb3d0aCBhZGRzLCB0cnVuY2F0ZSBvciBleHRlbmQsIGNvbW1pdC4gKi9cbmZ1bmN0aW9uIHNldExlbmd0aChyZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGZpbGxIb2xlcyhjbG9uZSwgbGVuZ3RoKTtcbiAgY2xvbmUubGVuZ3RoID0gbGVuZ3RoO1xuICB3cml0ZShjbG9uZSk7XG59XG5cbi8qKiBXSFk6IHdpdGhvdXQgdGhpcyB0cmFwIGBkZWxldGUgaXRlbXNbMl1gIHJlYWNoZXMgdGhlIFJBVyBhcnJheSBjYXB0dXJlZFxuICogIGFzIHRoZSBwcm94eSB0YXJnZXQg4oCUIGNvbW1pdHRlZCBzdGF0ZSwgbm8gY29tbWl0IHJlY29yZC4gSlMgYGRlbGV0ZWAgb24gYW5cbiAqICBpbmRleCBsZWF2ZXMgdGhlIHNsb3QgZW1wdHkgYW5kIHRoZSBsZW5ndGggdW5jaGFuZ2VkLCBhbmQgc28gZG9lcyB0aGlzOlxuICogIHRoZSBlbXB0aWVkIHNsb3QgY29tbWl0cyBhcyBgbnVsbGAsIEpTT04ncyBvbmx5IHNwZWxsaW5nIGZvciBhIGhvbGUuICovXG5mdW5jdGlvbiBkZWxldGVTbG90KHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGNvbnN0IGluZGV4ID0gdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnID8gTnVtYmVyKHByb3ApIDogTmFOO1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGNsb25lLmxlbmd0aCkgY2xvbmVbaW5kZXhdID0gbnVsbDtcbiAgZWxzZSBkZWxldGUgKGNsb25lIGFzIGFueSlbcHJvcF07XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLy8gLS0gTGVhdmVzOiB0aGUgY2hhaW4gYmVsb3cgYW4gZWxlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFdIWTogYW4gYXJyYXkgYW55d2hlcmUgYmVsb3cgYSBzaW5rJ3Mgcm9vdCBpcyBPTkUgd3JpdGUgcGF0aCDigJQgaXQgcmVhZHNcbiAqIHRocm91Z2ggdGhlIHNpbmsgYW5kIGNvbW1pdHMgdGhlIFdIT0xFIG5ldyBhcnJheSBiYWNrIHRocm91Z2ggaXQsIHNvXG4gKiBgcHVzaGAgdGhyZWUgbGV2ZWxzIGRvd24gYW5kIGBhcnJbaV0ueCA9IHZgIGF0IHRoZSB0b3Agc2hhcmUgYSBmdW5uZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVByb3h5QXQoc2luazogV3JpdGVTaW5rLCBwYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd25bXSB7XG4gIHJldHVybiBjcmVhdGVBcnJheVByb3h5KFxuICAgICgpID0+IChzaW5rLnJlYWRBdChwYXRoKSBhcyB1bmtub3duW10pID8/IFtdLFxuICAgIChuZXh0KSA9PiBzaW5rLnB1dChwYXRoLCBuZXh0KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBXcmFwIGEgdmFsdWUgcmVhZCBvdXQgb2YgYW4gZWxlbWVudDogYXJyYXlzIGJlY29tZSBhcnJheSBwcm94aWVzIHdob3NlXG4gKiBjb21taXRzIHJvdXRlIGJhY2sgdGhyb3VnaCB0aGUgb3duaW5nIGFycmF5LCBwbGFpbiBvYmplY3RzIGJlY29tZSBlbGVtZW50XG4gKiBwcm94aWVzIG9uZSBsZXZlbCBkZWVwZXIsIGV2ZXJ5dGhpbmcgZWxzZSBpcyByZXR1cm5lZCBhcy1pcy4gQSB2YWx1ZSBhbHJlYWR5XG4gKiBvbiB0aGUgYWNjZXNzIGNoYWluIChhIGN5Y2xlKSBpcyByZXR1cm5lZCByYXcg4oCUIHRoZSBzYW1lIGJhY2stZWRnZSB0aGVcbiAqIG5lc3RlZC1vYmplY3QgdGVybWluYWwgcHJveHkgdGFrZXMuXG4gKi9cbmZ1bmN0aW9uIHdyYXBFbGVtZW50TWVtYmVyKHZhbHVlOiB1bmtub3duLCBzaW5rOiBXcml0ZVNpbmssIHBhdGg6IHN0cmluZ1tdLCB2aXNpdGVkOiBTZXQ8b2JqZWN0Pik6IHVua25vd24ge1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmICh2aXNpdGVkLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IGJyYW5jaCA9IG5ldyBTZXQodmlzaXRlZCk7XG4gIGJyYW5jaC5hZGQodmFsdWUgYXMgb2JqZWN0KTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIHBhdGgpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBicmFuY2gpO1xufVxuXG4vLyAtLSBPcmNoZXN0cmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFByb3h5IG92ZXIgb25lIE9CSkVDVCBlbGVtZW50IChvciBhbiBvYmplY3QgbmVzdGVkIGluc2lkZSBvbmUpLCBjYXJyeWluZyB0aGVcbiAqIHBhdGggZnJvbSB0aGUgZWxlbWVudCBkb3duIHRvIGl0LiBSZWFkcyByZWN1cnNlOyB3cml0ZXMgZ28gYmFjayBvdXQgdGhyb3VnaFxuICogdGhlIG93bmluZyBhcnJheSdzIGNvbW1pdCBjYWxsYmFjayAodGhlIHtAbGluayBlbGVtZW50U2lua30pLlxuICpcbiAqIFJFQURTIEFSRSBMSVZFLiBFdmVyeSB3cml0ZSByZWJ1aWxkcyB0aGUgYXJyYXkgaW1tdXRhYmx5LCBzbyB0aGUgb2JqZWN0IHRoZVxuICogcHJveHkgd2FzIGNyZWF0ZWQgb3ZlciBpcyB0aGUgUFJFLXdyaXRlIGVsZW1lbnQgZm9yIGV2ZXIgYWZ0ZXI7IGEgaGVsZFxuICogaGFuZGxlIHRoYXQgcmVhZCBmcm9tIGl0IHNhdyBpdHMgb3duIHdyaXRlcyB2YW5pc2ggKGBsaW5lLm4gKz0gMWAgdHdpY2VcbiAqIGdhdmUgMiwgYGxpbmUudG90YWwgPSBsaW5lLnF0eSAqIDEwYCB1c2VkIHRoZSBvbGQgYHF0eWAsIGAneCcgaW4gbGluZWAgd2FzXG4gKiBmYWxzZSByaWdodCBhZnRlciBgbGluZS54ID0gMWApLiBFdmVyeSB0cmFwIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgZWxlbWVudFxuICogdGhyb3VnaCB0aGUgc2luayBmaXJzdCwgYW5kIGZhbGxzIGJhY2sgdG8gdGhlIGNhcHR1cmVkIG9iamVjdCBvbmx5IHdoZW5cbiAqIHRoZSBwYXRoIG5vIGxvbmdlciBleGlzdHMgKHRoZSBzbG90IHdhcyBlbXB0aWVkIG9yIHRoZSBhcnJheSBzaHJhbmspIOKAlCB0aGVcbiAqIHNhbWUgcmVhZC15b3VyLXdyaXRlcyB0aGUgYXJyYXkgcHJveHkgaXRzZWxmIGhhcyBhbHdheXMgaGFkLCBhbmQgdGhlIHNhbWVcbiAqIGxhdyB0aGUgbmVzdGVkIGFuZCB0ZXJtaW5hbCBvYmplY3QgcHJveGllcyBmb2xsb3cgKGxpdmVWaWV3LnRzKS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFByb3h5KFxuICByYXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdmlzaXRlZDogU2V0PG9iamVjdD4sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbGl2ZSA9ICgpID0+IGxpdmVPYmplY3QocmF3LCBzaW5rLnJlYWRBdChzZWdtZW50cykpO1xuICByZXR1cm4gbmV3IFByb3h5KHJhdywge1xuICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsICh2YWx1ZSwgcGF0aCkgPT4gd3JhcEVsZW1lbnRNZW1iZXIodmFsdWUsIHNpbmssIHBhdGgsIHZpc2l0ZWQpKSxcbiAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm94eSBvdmVyIGFuIGFycmF5IHRoYXQgaW50ZXJjZXB0cyBtdXRhdGluZyBvcGVyYXRpb25zLlxuICpcbiAqIFRoZSBhY3R1YWwgY3VycmVudCBhcnJheSBpcyB0aGUgUHJveHkgdGFyZ2V0OiBOb2RlLmpzIGNvbnNvbGUubG9nIGluc3BlY3RzXG4gKiB0aGUgdGFyZ2V0IGRpcmVjdGx5IChieXBhc3NlcyBQcm94eSB0cmFwcyksIHNvIHRoZSByZWFsIGFycmF5IHNob3dzIGNvcnJlY3RcbiAqIHZhbHVlcy4gVGhlIHRhcmdldCByZWZlcmVuY2UgaXMgZml4ZWQgYXQgY3JlYXRpb24gdGltZSDigJQgYWZ0ZXIgbXV0YXRpb25zLFxuICogdGhlIHByb3h5IHJldHVybnMgYSBuZXcgcHJveHkgKHZpYSBjYWNoZSBpbnZhbGlkYXRpb24pIHdpdGggdGhlIGZyZXNoIGFycmF5XG4gKiBhcyB0YXJnZXQuXG4gKlxuICogQHBhcmFtIGdldEN1cnJlbnQgLSBSZXR1cm5zIHRoZSBjdXJyZW50IGFycmF5IHNuYXBzaG90IGZyb20gc3RhdGVcbiAqIEBwYXJhbSBjb21taXQgLSBDYWxsZWQgd2l0aCB0aGUgbmV3IGFycmF5IGFmdGVyIGEgbXV0YXRpb24gKHRyaWdnZXJzIHNldFZhbHVlKVxuICogQHJldHVybnMgUHJveGllZCBhcnJheSB3aXRoIGNvcHktb24td3JpdGUgc2VtYW50aWNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcnJheVByb3h5PFQ+KGdldEN1cnJlbnQ6ICgpID0+IFRbXSwgY29tbWl0OiAobmV3QXJyYXk6IFRbXSkgPT4gdm9pZCk6IFRbXSB7XG4gIGNvbnN0IHRhcmdldCA9IGdldEN1cnJlbnQoKSBhcyBUW107XG4gIGNvbnN0IHJlYWQgPSBnZXRDdXJyZW50IGFzIHVua25vd24gYXMgUmVhZDtcbiAgY29uc3Qgd3JpdGUgPSBjb21taXQgYXMgdW5rbm93biBhcyBXcml0ZTtcbiAgY29uc3QgZWxlbWVudHM6IEVsZW1lbnRDYWNoZSA9IG5ldyBNYXAoKTtcblxuICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgIGdldChfdGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnICYmIE1VVEFUSU5HX01FVEhPRFMuaGFzKHByb3ApKSByZXR1cm4gbXV0YXRpbmdNZXRob2QocmVhZCwgd3JpdGUsIHByb3ApO1xuICAgICAgY29uc3QgY3VycmVudCA9IHJlYWQoKTtcbiAgICAgIGlmIChwcm9wID09PSAnbGVuZ3RoJykgcmV0dXJuIGN1cnJlbnQubGVuZ3RoO1xuICAgICAgY29uc3QgaW5kZXggPSBpbmRleEluKGN1cnJlbnQsIHByb3ApO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWRFbGVtZW50KGVsZW1lbnRzLCBjdXJyZW50W2luZGV4XSwgaW5kZXgsIHJlYWQsIHdyaXRlKTtcbiAgICAgIGlmIChwcm9wID09PSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpKSByZXR1cm4gKCkgPT4gY3VycmVudDtcbiAgICAgIHJldHVybiBib3VuZE1lbWJlcihjdXJyZW50LCBwcm9wKTtcbiAgICB9LFxuICAgIHNldChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgY29uc3QgaW5kZXggPSBpbmRleE5hbWVkKHByb3ApO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHNldEluZGV4KHJlYWQsIHdyaXRlLCBpbmRleCwgdmFsdWUpO1xuICAgICAgZWxzZSBpZiAocHJvcCA9PT0gJ2xlbmd0aCcgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgc2V0TGVuZ3RoKHJlYWQsIHdyaXRlLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IG90aGVyIHNldCBpcyBpZ25vcmVkIChhbiBleHBhbmRvIG9uIGFuIGFycmF5IGlzIG91dCBvZiBjb250cmFjdCDigJQgUkVBRE1FKVxuICAgIH0sXG4gICAgZGVsZXRlUHJvcGVydHkoX3RhcmdldCwgcHJvcCkge1xuICAgICAgZGVsZXRlU2xvdChyZWFkLCB3cml0ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIHByb3ApID0+IFJlZmxlY3QuaGFzKHJlYWQoKSwgcHJvcCksXG4gICAgb3duS2V5czogKCkgPT4gUmVmbGVjdC5vd25LZXlzKHJlYWQoKSksXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAoX3RhcmdldCwgcHJvcCkgPT4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWFkKCksIHByb3ApLFxuICB9KTtcbn1cbiJdfQ==
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlUcmFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvYXJyYXlUcmFwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBa0IsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRiw4RUFBOEU7QUFDOUUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsTUFBTTtJQUNOLFlBQVk7Q0FDYixDQUFDLENBQUM7QUFLSCxnRkFBZ0Y7QUFFaEY7c0VBQ3NFO0FBQ3RFLFNBQVMsT0FBTyxDQUFDLE9BQWtCLEVBQUUsSUFBcUI7SUFDeEQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM3RixDQUFDO0FBRUQsdUdBQXVH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LEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxLQUFLLFNBQVM7Z0JBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN4RCxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RixPQUFPLElBQUksQ0FBQyxDQUFDLGdGQUFnRjtRQUMvRixDQUFDO1FBQ0QsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJO1lBQzFCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLHdCQUF3QixFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQztLQUMzRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9hcnJheVRyYXBzIC0tIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbiB2aWEgUHJveHkuXG4gKlxuICogV2hlbiBzY29wZS5pdGVtcyBpcyBhbiBhcnJheSwgd2UgcmV0dXJuIGEgUHJveHkgdGhhdCBpbnRlcmNlcHRzIG11dGF0aW5nXG4gKiBtZXRob2RzIChwdXNoLCBwb3AsIHNwbGljZSwgZXRjLikgQU5EIGluZGV4ZWQgYWNjZXNzLiBFYWNoIG11dGF0aW9uOlxuICogMS4gQ2xvbmVzIHRoZSBjdXJyZW50IGFycmF5XG4gKiAyLiBBcHBsaWVzIHRoZSBtdXRhdGlvbiB0byB0aGUgY2xvbmVcbiAqIDMuIENvbW1pdHMgdGhlIG5ldyBhcnJheSB2aWEgdGhlIGNvbW1pdCBjYWxsYmFja1xuICpcbiAqIE5vbi1tdXRhdGluZyBtZXRob2RzIChtYXAsIGZpbHRlciwgZm9yRWFjaCwgZXRjLikgcGFzcyB0aHJvdWdoIHRvIHRoZVxuICogY3VycmVudCBhcnJheSBzbmFwc2hvdCB3aXRob3V0IGludGVyY2VwdGlvbi5cbiAqXG4gKiBUaGUgb3JpZ2luYWwgYXJyYXkgaW4gc3RhdGUgaXMgTkVWRVIgbXV0YXRlZCBkaXJlY3RseSAtLSBhbGwgd3JpdGVzIGdvXG4gKiB0aHJvdWdoIHRoZSBjb21taXQgY2FsbGJhY2sgd2hpY2ggY2FsbHMgc2V0VmFsdWUvdXBkYXRlVmFsdWUuXG4gKlxuICog4pSA4pSAIE9ubHkgdGhlIEFTU0lHTkVEIHZhbHVlIGlzIHVud3JhcHBlZCAoOS4yMy4wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIExhbmRtaW5lIDEgc2F5cyB0aGUgc2V0IHRyYXAgSlNPTi1yb3VuZC10cmlwcyB0aGUgdmFsdWUgdGhlIGNhbGxlciBoYW5kZWRcbiAqIGluLiBGb3IgYW4gYXJyYXkgdGhhdCBpcyB0aGUgaW5kZXgtYXNzaWduZWQgZWxlbWVudCwgYSBtdXRhdGluZyBtZXRob2Qnc1xuICogYXJndW1lbnRzIChgcHVzaCh4KWAsIGBzcGxpY2UoaSwgbiwgLi4uaXRlbXMpYCwgYGZpbGwoeClgKSwgb3IgdGhlIGxlYWYgYW5cbiAqIGVsZW1lbnQgcHJveHkgd3JpdGVzIOKAlCBhbmQgaXQgaXMgdW53cmFwcGVkIEhFUkUsIGF0IHRoZSB0cmFwIHRoYXQgcmVjZWl2ZXNcbiAqIGl0LiBUaGUgcmVidWlsdCBhcnJheSBpcyBoYW5kZWQgdG8gYGNvbW1pdGAgYXMgaXQgaXM6IGV2ZXJ5IHNpYmxpbmcgdGhlXG4gKiBjYWxsZXIgZGlkIG5vdCB0b3VjaCBwYXNzZXMgdGhyb3VnaCBieSByZWZlcmVuY2UsIGBEYXRlYHMgYW5kIGBNYXBgc1xuICogaW50YWN0LiBVbnRpbCA5LjIzLjAgdGhlIGNvbW1pdCBjYWxsYmFja3Mgcm91bmQtdHJpcHBlZCB0aGUgV0hPTEUgcmVidWlsdFxuICogYXJyYXksIHdoaWNoIHN0cmluZ2lmaWVkIHVudG91Y2hlZCBzaWJsaW5ncyBhbmQgd2FzIE8oTikgcGVyIGVsZW1lbnQgd3JpdGUuXG4gKiBUaGUgb25lIHRoaW5nIHRoZSByb3VuZC10cmlwIHVzZWQgdG8gZG8gZm9yIHRoZSBhcnJheSdzIG93biBzaGFwZSDigJQgYW5cbiAqIGVtcHRpZWQgb3Igc2tpcHBlZCBzbG90IGJlY2FtZSBgbnVsbGAsIEpTT04ncyBvbmx5IHNwZWxsaW5nIGZvciBhIGhvbGUg4oCUXG4gKiBpcyBub3cgZG9uZSBleHBsaWNpdGx5IGJ5IHRoZSB0cmFwcyB0aGF0IGNhbiBjcmVhdGUgb25lIChgZGVsZXRlIGFycltpXWAsXG4gKiBgYXJyW2ldID0gdmAgcGFzdCB0aGUgZW5kLCBgYXJyLmxlbmd0aCA9IG5gIGdyb3d0aCkuXG4gKlxuICog4pSA4pSAIEluZGV4ZWQgYWNjZXNzIGlzIHBhcnQgb2YgdGhlIGNoYWluICg5LjIyLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGFycltpXWAgdXNlZCB0byBoYW5kIGJhY2sgdGhlIFJBVyBlbGVtZW50LCB3aGljaCBicm9rZSB0aGUgcHJveHkgY2hhaW4gYXRcbiAqIGV4YWN0bHkgdGhlIHBvaW50IHVzZXJzIHdyaXRlIHRocm91Z2ggaXQ6IGBvcmRlci5saW5lc1swXS5xdHkgPSA0YCB3YXMgYW5cbiAqIGluLXBsYWNlIG11dGF0aW9uIG9mIGEgYm9ycm93ZWQgcmVhZCDigJQgbm8gdHJhcCwgbm8gdHJhY2Ugcm93LCBubyBjb21taXQuXG4gKiBCZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIHRoYXQgYm9ycm93ZWQgdmFsdWUgSVMgY29tbWl0dGVkXG4gKiBzaGFyZWQgbWVtb3J5LCBzbyB0aGUgbXV0YXRpb24gbW92ZWQgc3RhdGUgd2hpbGUgdGhlIGxvZyBzdGF5ZWQgZW1wdHk7IGFmdGVyXG4gKiBpdCwgdGhlIG11dGF0aW9uIGxhbmRlZCBpbiB0aGUgcHJpdmF0ZSBidWZmZXIgY2xvbmUgYW5kIHdhcyBkcm9wcGVkLiBTYW1lXG4gKiBleHByZXNzaW9uLCB0d28gc2lsZW50IG91dGNvbWVzLlxuICpcbiAqIE5vdyBhbiBpbmRleGVkIHJlYWQgb2YgYSB3cmFwcGFibGUgZWxlbWVudCByZXR1cm5zIGFuIEVMRU1FTlQgUFJPWFkgdGhhdFxuICogYWNjdW11bGF0ZXMgdGhlIHBhdGggaW5zaWRlIHRoZSBlbGVtZW50IGFuZCwgb24gd3JpdGUsIHJlYnVpbGRzIHRoZSBhcnJheVxuICogaW1tdXRhYmx5IChgc3RydWN0dXJhbFdyaXRlLnNldEluUGF0aGAsIGJlaGluZCBgd3JpdGVUcmFwcy5lbGVtZW50U2lua2ApXG4gKiBhbmQgaGFuZHMgdGhlIHdob2xlIG5ldyBhcnJheSB0byBgY29tbWl0YCDigJQgdGhlIHNhbWUgZnVubmVsIGBwdXNoYCBhbHJlYWR5XG4gKiB1c2VkLiBPbmUgd3JpdGUgcGF0aCBmb3IgdGhlIHdob2xlIGFycmF5LCB3aGF0ZXZlciBkZXB0aCBpdCBpcyBhZGRyZXNzZWQgYXQuXG4gKlxuICog4pSA4pSAIFdoYXQgaXMgc3RpbGwgTk9UIHNlZW4gKGJ5IGRlc2lnbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBFbGVtZW50cyByZWFjaGVkIFdJVEhPVVQgYW4gaW5kZXgg4oCUIGBmaW5kKClgLCBgZmlsdGVyKClgLCBgZm9y4oCmb2ZgLFxuICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nIOKAlCBhcmUgaGFuZGVkIGJhY2sgcmF3LCBiZWNhdXNlIHdyYXBwaW5nIHRoZW0gd291bGRcbiAqIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0IG9mIGV2ZXJ5IHJlYWQgbWV0aG9kIChgbWFwYCB3b3VsZCBidWlsZCBhbiBhcnJheVxuICogb2YgcHJveGllcykgZm9yIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gTXV0YXRpbmcgb25lIG9mIHRob3NlIGlzXG4gKiBub3QgbG9zdCBpbiBzaWxlbmNlIGVpdGhlcjogYFN0YWdlQ29udGV4dGAgY29tcGFyZXMgd2hhdCBhIHN0YWdlIFJFQUQgd2l0aFxuICogd2hhdCB0aGUgdmFsdWUgaG9sZHMgYXQgY29tbWl0IGFuZCwgaW4gZGV2IG1vZGUsIHdhcm5zIHdpdGggdGhlIGV4YWN0IHBhdGguXG4gKiBTZWUgc3JjL2xpYi9yZWFjdGl2ZS9SRUFETUUubWQuXG4gKlxuICog4pSA4pSAIFNoYXBlICg5LjIzLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGNyZWF0ZUFycmF5UHJveHlgIGFuZCBgY3JlYXRlRWxlbWVudFByb3h5YCBhcmUgT1JDSEVTVFJBVE9SUzogdGhleSB3aXJlXG4gKiB0cmFwcyBhbmQgaG9sZCB0aGUgY2FjaGVzLiBFdmVyeSB0cmFwIGJvZHkgaXMgYSBuYW1lZCBsZWFmIGJlbG93IOKAlCBvbmVcbiAqIGNvbmNlcm4gZWFjaCDigJQgYW5kIHRoZSBlbGVtZW50IHByb3h5J3Mgc2V0L2RlbGV0ZS9nZXQgdHJhcHMgYXJlIHRoZSBTQU1FXG4gKiBsZWF2ZXMgdGhlIG5lc3RlZCBhbmQgdGVybWluYWwgb2JqZWN0IHByb3hpZXMgdXNlIChgd3JpdGVUcmFwcy50c2AsXG4gKiBgbGl2ZVZpZXcudHNgKSwgb3ZlciBhbiB7QGxpbmsgZWxlbWVudFNpbmt9LiBBIGZpeCBsYW5kcyBpbiBhIGxlYWYgb25jZS5cbiAqL1xuXG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgbGl2ZUdldFRyYXAsIGxpdmVJbnNwZWN0aW9uVHJhcHMsIGxpdmVPYmplY3QsIE1lbWJlckNhY2hlIH0gZnJvbSAnLi9saXZlVmlldy5qcyc7XG5pbXBvcnQgeyB1bndyYXBQcm94eSB9IGZyb20gJy4vc3RydWN0dXJhbFdyaXRlLmpzJztcbmltcG9ydCB7IHR5cGUgV3JpdGVTaW5rLCBlbGVtZW50U2luaywgc2lua0RlbGV0ZVRyYXAsIHNpbmtTZXRUcmFwIH0gZnJvbSAnLi93cml0ZVRyYXBzLmpzJztcblxuLyoqIE1ldGhvZHMgdGhhdCBtdXRhdGUgdGhlIGFycmF5IGluLXBsYWNlLiBXZSBpbnRlcmNlcHQgYW5kIGNvcHktb24td3JpdGUuICovXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnLFxuICAnZmlsbCcsXG4gICdjb3B5V2l0aGluJyxcbl0pO1xuXG50eXBlIFJlYWQgPSAoKSA9PiB1bmtub3duW107XG50eXBlIFdyaXRlID0gKG5leHQ6IHVua25vd25bXSkgPT4gdm9pZDtcblxuLy8gLS0gTGVhdmVzOiByZWFkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFdIWSBgTnVtYmVyKHByb3ApYDogdGhlIGhpc3RvcmljYWwgcmVhZGluZyBvZiBhbiBpbmRleCBuYW1lIOKAlCBgJzAxJ2AgYW5kXG4gKiAgYCcnYCBhZGRyZXNzIHNsb3RzIDEgYW5kIDAsIGFzIHRoZXkgYWx3YXlzIGhhdmUuIEluIHJhbmdlIG9ubHkuICovXG5mdW5jdGlvbiBpbmRleEluKGN1cnJlbnQ6IHVua25vd25bXSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIocHJvcCk7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgY3VycmVudC5sZW5ndGggPyBpbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgaW5kZXggbmFtZWQgYnkgYHByb3BgIChhbnkgcmFuZ2Ug4oCUIGEgd3JpdGUgcGFzdCB0aGUgZW5kIGdyb3dzIHRoZSBhcnJheSkuICovXG5mdW5jdGlvbiBpbmRleE5hbWVkKHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHByb3ApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCA/IGluZGV4IDogdW5kZWZpbmVkO1xufVxuXG4vKiogV0hZOiBhIG5vbi1tdXRhdGluZyByZWFkIGFuc3dlcnMgZnJvbSB0aGUgQ1VSUkVOVCBhcnJheSwgbmV2ZXIgdGhlXG4gKiAgY3JlYXRpb24tdGltZSB0YXJnZXQg4oCUIGEgbWV0aG9kIGlzIGJvdW5kIHRvIGl0LCBhbnl0aGluZyBlbHNlIHJlYWQgb2ZmIGl0LiAqL1xuZnVuY3Rpb24gYm91bmRNZW1iZXIoY3VycmVudDogdW5rbm93bltdLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgY29uc3QgdmFsID0gKGN1cnJlbnQgYXMgYW55KVtwcm9wXTtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgPyB2YWwuYmluZChjdXJyZW50KSA6IHZhbDtcbn1cblxudHlwZSBFbGVtZW50Q2FjaGUgPSBNYXA8bnVtYmVyLCB7IHJlZjogdW5rbm93bjsgcHJveHk6IHVua25vd24gfT47XG5cbi8qKiBXSFkgdGhlIGNhY2hlOiByZWFkaW5nIGBsaW5lc1tpXS5xdHlgIGluIGEgbG9vcCBtdXN0IG5vdCBhbGxvY2F0ZSBhIHByb3h5XG4gKiAgcGVyIHJlYWQsIGFuZCBgbGluZXNbMF0gPT09IGxpbmVzWzBdYCBtdXN0IGhvbGQgd2l0aGluIGEgc3RhZ2UuIFZhbGlkYXRlZCBieVxuICogIHJhdyBpZGVudGl0eSDigJQgYSBjb21taXQgcmVwbGFjZXMgdGhlIGFycmF5LCB0aGUgcmVmIGNoZWNrIG1pc3NlcywgYW5kIGFcbiAqICBmcmVzaCBwcm94eSBpcyBidWlsdCBvdmVyIHRoZSBuZXcgZWxlbWVudC4gQSBwcmltaXRpdmUgaXMgaGFuZGVkIGJhY2sgcmF3LiAqL1xuZnVuY3Rpb24gY2FjaGVkRWxlbWVudChjYWNoZTogRWxlbWVudENhY2hlLCBlbGVtZW50OiB1bmtub3duLCBpbmRleDogbnVtYmVyLCByZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUpOiB1bmtub3duIHtcbiAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGluZGV4KTtcbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucmVmID09PSBlbGVtZW50KSByZXR1cm4gY2FjaGVkLnByb3h5O1xuICBjb25zdCB3cmFwcGVkID0gd3JhcEVsZW1lbnRNZW1iZXIoZWxlbWVudCwgZWxlbWVudFNpbmsocmVhZCwgd3JpdGUsIGluZGV4KSwgW10sIG5ldyBTZXQ8b2JqZWN0PigpKTtcbiAgY2FjaGUuc2V0KGluZGV4LCB7IHJlZjogZWxlbWVudCwgcHJveHk6IHdyYXBwZWQgfSk7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG4vLyAtLSBMZWF2ZXM6IHdyaXRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2xvdHMgZnJvbSB0aGUgY3VycmVudCBlbmQgdXAgdG8gKG5vdCBpbmNsdWRpbmcpIGB1cFRvYCBiZWNvbWUgYG51bGxgIOKAlFxuICogIHRoZSBKU09OIHNwZWxsaW5nIG9mIGEgaG9sZSwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtYXJyYXkgcm91bmQtdHJpcCB1c2VkXG4gKiAgdG8gcHJvZHVjZSBmb3IgdGhlbS4gTm8tb3Agd2hlbiBgdXBUb2AgaXMgd2l0aGluIHRoZSBhcnJheS4gKi9cbmZ1bmN0aW9uIGZpbGxIb2xlcyhhcnI6IHVua25vd25bXSwgdXBUbzogbnVtYmVyKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoOyBpIDwgdXBUbzsgaSsrKSBhcnJbaV0gPSBudWxsO1xufVxuXG4vKiogV0hZOiBhIG11dGF0aW5nIG1ldGhvZCBydW5zIG9uIGEgQ09QWSwgd2l0aCBpdHMgYXJndW1lbnRzIHVud3JhcHBlZCAodGhleVxuICogIGFyZSB0aGUgYXNzaWduZWQgdmFsdWVzOyBhIG51bWJlciBvciBhIGNvbXBhcmF0b3IgcGFzc2VzIHRocm91Z2gpLCBhbmQgdGhlXG4gKiAgY29weSBpcyBjb21taXR0ZWQgd2hvbGUuIFRoZSBhcnJheSBpbiBzdGF0ZSBpcyBuZXZlciB0b3VjaGVkLiAqL1xuZnVuY3Rpb24gbXV0YXRpbmdNZXRob2QocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBuYW1lOiBzdHJpbmcpOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgICBjb25zdCByZXN1bHQgPSAoY2xvbmUgYXMgYW55KVtuYW1lXSguLi5hcmdzLm1hcCh1bndyYXBQcm94eSkpO1xuICAgIHdyaXRlKGNsb25lKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKiogYGFycltpXSA9IHZgOiBjb3B5LCBgbnVsbGAgdGhlIHNsb3RzIGEgd3JpdGUgcGFzdCB0aGUgZW5kIHNraXBzLCBwbGFjZSB0aGUgdW53cmFwcGVkIHZhbHVlLCBjb21taXQuICovXG5mdW5jdGlvbiBzZXRJbmRleChyZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUsIGluZGV4OiBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGZpbGxIb2xlcyhjbG9uZSwgaW5kZXgpO1xuICBjbG9uZVtpbmRleF0gPSB1bndyYXBQcm94eSh2YWx1ZSk7XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLyoqIGBhcnIubGVuZ3RoID0gbmA6IGNvcHksIGBudWxsYCB0aGUgc2xvdHMgZ3Jvd3RoIGFkZHMsIHRydW5jYXRlIG9yIGV4dGVuZCwgY29tbWl0LiAqL1xuZnVuY3Rpb24gc2V0TGVuZ3RoKHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgZmlsbEhvbGVzKGNsb25lLCBsZW5ndGgpO1xuICBjbG9uZS5sZW5ndGggPSBsZW5ndGg7XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLyoqIFdIWTogd2l0aG91dCB0aGlzIHRyYXAgYGRlbGV0ZSBpdGVtc1syXWAgcmVhY2hlcyB0aGUgUkFXIGFycmF5IGNhcHR1cmVkXG4gKiAgYXMgdGhlIHByb3h5IHRhcmdldCDigJQgY29tbWl0dGVkIHN0YXRlLCBubyBjb21taXQgcmVjb3JkLiBKUyBgZGVsZXRlYCBvbiBhblxuICogIGluZGV4IGxlYXZlcyB0aGUgc2xvdCBlbXB0eSBhbmQgdGhlIGxlbmd0aCB1bmNoYW5nZWQsIGFuZCBzbyBkb2VzIHRoaXM6XG4gKiAgdGhlIGVtcHRpZWQgc2xvdCBjb21taXRzIGFzIGBudWxsYCwgSlNPTidzIG9ubHkgc3BlbGxpbmcgZm9yIGEgaG9sZS4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVNsb3QocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB2b2lkIHtcbiAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgY29uc3QgaW5kZXggPSB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgPyBOdW1iZXIocHJvcCkgOiBOYU47XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgY2xvbmUubGVuZ3RoKSBjbG9uZVtpbmRleF0gPSBudWxsO1xuICBlbHNlIGRlbGV0ZSAoY2xvbmUgYXMgYW55KVtwcm9wXTtcbiAgd3JpdGUoY2xvbmUpO1xufVxuXG4vLyAtLSBMZWF2ZXM6IHRoZSBjaGFpbiBiZWxvdyBhbiBlbGVtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogV0hZOiBhbiBhcnJheSBhbnl3aGVyZSBiZWxvdyBhIHNpbmsncyByb290IGlzIE9ORSB3cml0ZSBwYXRoIOKAlCBpdCByZWFkc1xuICogdGhyb3VnaCB0aGUgc2luayBhbmQgY29tbWl0cyB0aGUgV0hPTEUgbmV3IGFycmF5IGJhY2sgdGhyb3VnaCBpdCwgc29cbiAqIGBwdXNoYCB0aHJlZSBsZXZlbHMgZG93biBhbmQgYGFycltpXS54ID0gdmAgYXQgdGhlIHRvcCBzaGFyZSBhIGZ1bm5lbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5UHJveHlBdChzaW5rOiBXcml0ZVNpbmssIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIGNyZWF0ZUFycmF5UHJveHkoXG4gICAgKCkgPT4gKHNpbmsucmVhZEF0KHBhdGgpIGFzIHVua25vd25bXSkgPz8gW10sXG4gICAgKG5leHQpID0+IHNpbmsucHV0KHBhdGgsIG5leHQpLFxuICApO1xufVxuXG4vKipcbiAqIFdyYXAgYSB2YWx1ZSByZWFkIG91dCBvZiBhbiBlbGVtZW50OiBhcnJheXMgYmVjb21lIGFycmF5IHByb3hpZXMgd2hvc2VcbiAqIGNvbW1pdHMgcm91dGUgYmFjayB0aHJvdWdoIHRoZSBvd25pbmcgYXJyYXksIHBsYWluIG9iamVjdHMgYmVjb21lIGVsZW1lbnRcbiAqIHByb3hpZXMgb25lIGxldmVsIGRlZXBlciwgZXZlcnl0aGluZyBlbHNlIGlzIHJldHVybmVkIGFzLWlzLiBBIHZhbHVlIGFscmVhZHlcbiAqIG9uIHRoZSBhY2Nlc3MgY2hhaW4gKGEgY3ljbGUpIGlzIHJldHVybmVkIHJhdyDigJQgdGhlIHNhbWUgYmFjay1lZGdlIHRoZVxuICogbmVzdGVkLW9iamVjdCB0ZXJtaW5hbCBwcm94eSB0YWtlcy5cbiAqL1xuZnVuY3Rpb24gd3JhcEVsZW1lbnRNZW1iZXIodmFsdWU6IHVua25vd24sIHNpbms6IFdyaXRlU2luaywgcGF0aDogc3RyaW5nW10sIHZpc2l0ZWQ6IFNldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgYnJhbmNoID0gbmV3IFNldCh2aXNpdGVkKTtcbiAgYnJhbmNoLmFkZCh2YWx1ZSBhcyBvYmplY3QpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50UHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgsIGJyYW5jaCk7XG59XG5cbi8vIC0tIE9yY2hlc3RyYXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUHJveHkgb3ZlciBvbmUgT0JKRUNUIGVsZW1lbnQgKG9yIGFuIG9iamVjdCBuZXN0ZWQgaW5zaWRlIG9uZSksIGNhcnJ5aW5nIHRoZVxuICogcGF0aCBmcm9tIHRoZSBlbGVtZW50IGRvd24gdG8gaXQuIFJlYWRzIHJlY3Vyc2U7IHdyaXRlcyBnbyBiYWNrIG91dCB0aHJvdWdoXG4gKiB0aGUgb3duaW5nIGFycmF5J3MgY29tbWl0IGNhbGxiYWNrICh0aGUge0BsaW5rIGVsZW1lbnRTaW5rfSkuXG4gKlxuICogUkVBRFMgQVJFIExJVkUuIEV2ZXJ5IHdyaXRlIHJlYnVpbGRzIHRoZSBhcnJheSBpbW11dGFibHksIHNvIHRoZSBvYmplY3QgdGhlXG4gKiBwcm94eSB3YXMgY3JlYXRlZCBvdmVyIGlzIHRoZSBQUkUtd3JpdGUgZWxlbWVudCBmb3IgZXZlciBhZnRlcjsgYSBoZWxkXG4gKiBoYW5kbGUgdGhhdCByZWFkIGZyb20gaXQgc2F3IGl0cyBvd24gd3JpdGVzIHZhbmlzaCAoYGxpbmUubiArPSAxYCB0d2ljZVxuICogZ2F2ZSAyLCBgbGluZS50b3RhbCA9IGxpbmUucXR5ICogMTBgIHVzZWQgdGhlIG9sZCBgcXR5YCwgYCd4JyBpbiBsaW5lYCB3YXNcbiAqIGZhbHNlIHJpZ2h0IGFmdGVyIGBsaW5lLnggPSAxYCkuIEV2ZXJ5IHRyYXAgdGhlcmVmb3JlIHJlc29sdmVzIHRoZSBlbGVtZW50XG4gKiB0aHJvdWdoIHRoZSBzaW5rIGZpcnN0LCBhbmQgZmFsbHMgYmFjayB0byB0aGUgY2FwdHVyZWQgb2JqZWN0IG9ubHkgd2hlblxuICogdGhlIHBhdGggbm8gbG9uZ2VyIGV4aXN0cyAodGhlIHNsb3Qgd2FzIGVtcHRpZWQgb3IgdGhlIGFycmF5IHNocmFuaykg4oCUIHRoZVxuICogc2FtZSByZWFkLXlvdXItd3JpdGVzIHRoZSBhcnJheSBwcm94eSBpdHNlbGYgaGFzIGFsd2F5cyBoYWQsIGFuZCB0aGUgc2FtZVxuICogbGF3IHRoZSBuZXN0ZWQgYW5kIHRlcm1pbmFsIG9iamVjdCBwcm94aWVzIGZvbGxvdyAobGl2ZVZpZXcudHMpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50UHJveHkoXG4gIHJhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0Pixcbik6IHVua25vd24ge1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KHJhdywgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgcmV0dXJuIG5ldyBQcm94eShyYXcsIHtcbiAgICBnZXQ6IGxpdmVHZXRUcmFwKGxpdmUsIHNlZ21lbnRzLCAodmFsdWUsIHBhdGgpID0+IHdyYXBFbGVtZW50TWVtYmVyKHZhbHVlLCBzaW5rLCBwYXRoLCB2aXNpdGVkKSwgbWVtYmVycyksXG4gICAgc2V0OiBzaW5rU2V0VHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgZGVsZXRlUHJvcGVydHk6IHNpbmtEZWxldGVUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAuLi5saXZlSW5zcGVjdGlvblRyYXBzKGxpdmUpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJveHkgb3ZlciBhbiBhcnJheSB0aGF0IGludGVyY2VwdHMgbXV0YXRpbmcgb3BlcmF0aW9ucy5cbiAqXG4gKiBUaGUgYWN0dWFsIGN1cnJlbnQgYXJyYXkgaXMgdGhlIFByb3h5IHRhcmdldDogTm9kZS5qcyBjb25zb2xlLmxvZyBpbnNwZWN0c1xuICogdGhlIHRhcmdldCBkaXJlY3RseSAoYnlwYXNzZXMgUHJveHkgdHJhcHMpLCBzbyB0aGUgcmVhbCBhcnJheSBzaG93cyBjb3JyZWN0XG4gKiB2YWx1ZXMuIFRoZSB0YXJnZXQgcmVmZXJlbmNlIGlzIGZpeGVkIGF0IGNyZWF0aW9uIHRpbWUg4oCUIGFmdGVyIG11dGF0aW9ucyxcbiAqIHRoZSBwcm94eSByZXR1cm5zIGEgbmV3IHByb3h5ICh2aWEgY2FjaGUgaW52YWxpZGF0aW9uKSB3aXRoIHRoZSBmcmVzaCBhcnJheVxuICogYXMgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBnZXRDdXJyZW50IC0gUmV0dXJucyB0aGUgY3VycmVudCBhcnJheSBzbmFwc2hvdCBmcm9tIHN0YXRlXG4gKiBAcGFyYW0gY29tbWl0IC0gQ2FsbGVkIHdpdGggdGhlIG5ldyBhcnJheSBhZnRlciBhIG11dGF0aW9uICh0cmlnZ2VycyBzZXRWYWx1ZSlcbiAqIEByZXR1cm5zIFByb3hpZWQgYXJyYXkgd2l0aCBjb3B5LW9uLXdyaXRlIHNlbWFudGljc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJyYXlQcm94eTxUPihnZXRDdXJyZW50OiAoKSA9PiBUW10sIGNvbW1pdDogKG5ld0FycmF5OiBUW10pID0+IHZvaWQpOiBUW10ge1xuICBjb25zdCB0YXJnZXQgPSBnZXRDdXJyZW50KCkgYXMgVFtdO1xuICBjb25zdCByZWFkID0gZ2V0Q3VycmVudCBhcyB1bmtub3duIGFzIFJlYWQ7XG4gIGNvbnN0IHdyaXRlID0gY29tbWl0IGFzIHVua25vd24gYXMgV3JpdGU7XG4gIGNvbnN0IGVsZW1lbnRzOiBFbGVtZW50Q2FjaGUgPSBuZXcgTWFwKCk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBNVVRBVElOR19NRVRIT0RTLmhhcyhwcm9wKSkgcmV0dXJuIG11dGF0aW5nTWV0aG9kKHJlYWQsIHdyaXRlLCBwcm9wKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSByZWFkKCk7XG4gICAgICBpZiAocHJvcCA9PT0gJ2xlbmd0aCcpIHJldHVybiBjdXJyZW50Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhJbihjdXJyZW50LCBwcm9wKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkRWxlbWVudChlbGVtZW50cywgY3VycmVudFtpbmRleF0sIGluZGV4LCByZWFkLCB3cml0ZSk7XG4gICAgICBpZiAocHJvcCA9PT0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSkgcmV0dXJuICgpID0+IGN1cnJlbnQ7XG4gICAgICByZXR1cm4gYm91bmRNZW1iZXIoY3VycmVudCwgcHJvcCk7XG4gICAgfSxcbiAgICBzZXQoX3RhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhOYW1lZChwcm9wKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSBzZXRJbmRleChyZWFkLCB3cml0ZSwgaW5kZXgsIHZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKHByb3AgPT09ICdsZW5ndGgnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHNldExlbmd0aChyZWFkLCB3cml0ZSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGFueSBvdGhlciBzZXQgaXMgaWdub3JlZCAoYW4gZXhwYW5kbyBvbiBhbiBhcnJheSBpcyBvdXQgb2YgY29udHJhY3Qg4oCUIFJFQURNRSlcbiAgICB9LFxuICAgIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIHByb3ApIHtcbiAgICAgIGRlbGV0ZVNsb3QocmVhZCwgd3JpdGUsIHByb3ApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBwcm9wKSA9PiBSZWZsZWN0LmhhcyhyZWFkKCksIHByb3ApLFxuICAgIG93bktleXM6ICgpID0+IFJlZmxlY3Qub3duS2V5cyhyZWFkKCkpLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKF90YXJnZXQsIHByb3ApID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVhZCgpLCBwcm9wKSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
import { nativeGet as lodashGet } from '../memory/pathOps.js';
|
|
17
17
|
import { shouldWrapWithProxy } from './allowlist.js';
|
|
18
18
|
import { arrayProxyAt } from './arrayTraps.js';
|
|
19
|
-
import { liveGetTrap, liveInspectionTraps, liveObject } from './liveView.js';
|
|
19
|
+
import { cachedMember, liveGetTrap, liveInspectionTraps, liveObject, MemberCache } from './liveView.js';
|
|
20
20
|
import { unwrapProxy } from './structuralWrite.js';
|
|
21
21
|
import { BREAK_SETTER, EXECUTOR_INTERNAL_METHODS, IS_TYPED_SCOPE, SCOPE_METHOD_NAMES } from './types.js';
|
|
22
22
|
import { rootKeySink, sinkDeleteTrap, sinkSetTrap } from './writeTraps.js';
|
|
@@ -102,7 +102,8 @@ function silentlyKnownKey(target, key) {
|
|
|
102
102
|
//
|
|
103
103
|
// Both factories are ORCHESTRATORS (9.23.1): reads are `liveView.ts`, writes
|
|
104
104
|
// are `writeTraps.ts` over a `rootKeySink`, and the ONE thing each decides
|
|
105
|
-
// itself is what a child member becomes — the cycle policy.
|
|
105
|
+
// itself is what a child member becomes — the cycle policy. Each holds its
|
|
106
|
+
// own per-member proxy cache (9.23.2, `liveView.ts · cachedMember`).
|
|
106
107
|
//
|
|
107
108
|
// Cycle safety: an immutable Set<object> of ancestor objects is passed down
|
|
108
109
|
// each access chain. Each branch gets its own copy (new Set(parent)) so
|
|
@@ -114,6 +115,7 @@ function silentlyKnownKey(target, key) {
|
|
|
114
115
|
// anywhere past the cycle edge is handed back raw.
|
|
115
116
|
function createTerminalProxy(obj, sink, segments, visited = new Set()) {
|
|
116
117
|
visited.add(obj);
|
|
118
|
+
const members = new MemberCache();
|
|
117
119
|
const live = () => liveObject(obj, sink.readAt(segments));
|
|
118
120
|
const child = (value, path) => {
|
|
119
121
|
if (!shouldWrapWithProxy(value))
|
|
@@ -127,7 +129,7 @@ function createTerminalProxy(obj, sink, segments, visited = new Set()) {
|
|
|
127
129
|
return createTerminalProxy(value, sink, path, visited);
|
|
128
130
|
};
|
|
129
131
|
return new Proxy(obj, {
|
|
130
|
-
get: liveGetTrap(live, segments, child),
|
|
132
|
+
get: liveGetTrap(live, segments, child, members),
|
|
131
133
|
set: sinkSetTrap(sink, segments),
|
|
132
134
|
deleteProperty: sinkDeleteTrap(sink, segments),
|
|
133
135
|
...liveInspectionTraps(live),
|
|
@@ -137,6 +139,7 @@ function createNestedProxy(obj, sink, segments, ancestors = new Set()) {
|
|
|
137
139
|
// Reads are LIVE (9.22.0): a held proxy reads its own writes, `'x' in o`
|
|
138
140
|
// and `Object.keys(o)` see them, and `o.b = o.a * 10` uses the new `a`.
|
|
139
141
|
// The captured object answers only when the path is gone — see liveView.ts.
|
|
142
|
+
const members = new MemberCache();
|
|
140
143
|
const live = () => liveObject(obj, sink.readAt(segments));
|
|
141
144
|
const child = (value, path) => {
|
|
142
145
|
if (!shouldWrapWithProxy(value))
|
|
@@ -150,7 +153,7 @@ function createNestedProxy(obj, sink, segments, ancestors = new Set()) {
|
|
|
150
153
|
return createNestedProxy(value, sink, path, new Set(ancestors).add(value));
|
|
151
154
|
};
|
|
152
155
|
return new Proxy(obj, {
|
|
153
|
-
get: liveGetTrap(live, segments, child),
|
|
156
|
+
get: liveGetTrap(live, segments, child, members),
|
|
154
157
|
set: sinkSetTrap(sink, segments),
|
|
155
158
|
deleteProperty: sinkDeleteTrap(sink, segments),
|
|
156
159
|
...liveInspectionTraps(live),
|
|
@@ -199,31 +202,24 @@ function internalRead(target, state, prop) {
|
|
|
199
202
|
return STATE_KEY;
|
|
200
203
|
}
|
|
201
204
|
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
205
|
+
* A wrappable state value becomes the array or nested proxy for its key;
|
|
206
|
+
* anything else is handed back raw. `scope.k === scope.k` holds within a
|
|
207
|
+
* stage through the same per-member cache every object proxy uses
|
|
208
|
+
* (`liveView.ts · cachedMember`): a write to the key drops the entry (the
|
|
209
|
+
* sink does it), a commit swaps the value and the ref check misses — either
|
|
210
|
+
* way the next read builds a fresh proxy over the new value.
|
|
206
211
|
*/
|
|
207
|
-
function cachedChildProxy(state, key, value, build) {
|
|
208
|
-
const cached = state.childCache.get(key);
|
|
209
|
-
if (cached && cached.ref === value)
|
|
210
|
-
return cached.proxy;
|
|
211
|
-
const proxy = build();
|
|
212
|
-
state.childCache.set(key, { ref: value, proxy });
|
|
213
|
-
return proxy;
|
|
214
|
-
}
|
|
215
|
-
/** A wrappable state value becomes the array or nested proxy for its key; anything else is handed back raw. */
|
|
216
212
|
function wrapStateValue(target, readSilent, state, key, value) {
|
|
217
213
|
if (value === null || value === undefined || typeof value !== 'object')
|
|
218
214
|
return value;
|
|
219
215
|
if (!shouldWrapWithProxy(value))
|
|
220
216
|
return value; // Date, Map, class instance, frozen …
|
|
221
|
-
return
|
|
217
|
+
return cachedMember(state.childCache, key, value, () => {
|
|
222
218
|
const sink = rootKeySink(target, readSilent, key, state.childCache);
|
|
223
219
|
if (Array.isArray(value))
|
|
224
220
|
return arrayProxyAt(sink, []);
|
|
225
221
|
return createNestedProxy(value, sink, [], new Set([value]));
|
|
226
|
-
});
|
|
222
|
+
}, []);
|
|
227
223
|
}
|
|
228
224
|
/** WHY: a `$`-name can never be a state key — the write is refused, not shadowed; every other assignment
|
|
229
225
|
* stores the unwrapped value (landmine 1) and drops the key's cached proxy. */
|
|
@@ -258,7 +254,7 @@ function stateKeys(target) {
|
|
|
258
254
|
* @returns A Proxy with typed property access and $-prefixed methods
|
|
259
255
|
*/
|
|
260
256
|
export function createTypedScope(target, options) {
|
|
261
|
-
const state = { breakFn: options?.breakPipeline, childCache: new
|
|
257
|
+
const state = { breakFn: options?.breakPipeline, childCache: new MemberCache() };
|
|
262
258
|
// Bind the silent read once — the nested/array proxies resolve their live view through it.
|
|
263
259
|
const readSilent = (target.getValueSilent ?? target.getValue).bind(target);
|
|
264
260
|
return new Proxy(target, {
|
|
@@ -296,4 +292,4 @@ export function createTypedScope(target, options) {
|
|
|
296
292
|
},
|
|
297
293
|
});
|
|
298
294
|
}
|
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6RyxPQUFPLEVBQWtCLFdBQVcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNM0YsTUFBTSxhQUFhLEdBQWlDO0lBQ2xELFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFlLEVBQUUsRUFBRTtRQUNoQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekMsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMs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S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9jcmVhdGVUeXBlZFNjb3BlIC0tIENvcmUgUHJveHkgZmFjdG9yeSBmb3IgVHlwZWRTY29wZTxUPi5cbiAqXG4gKiBXcmFwcyBhIFJlYWN0aXZlVGFyZ2V0IChTY29wZUZhY2FkZSkgaW4gYSBQcm94eSB0aGF0IHByb3ZpZGVzOlxuICogLSBUeXBlZCBwcm9wZXJ0eSBhY2Nlc3M6IHNjb3BlLmNyZWRpdFRpZXIgKHJlYWQpLCBzY29wZS5jcmVkaXRUaWVyID0gJ0EnICh3cml0ZSlcbiAqIC0gRGVlcCB3cml0ZSBpbnRlcmNlcHRpb246IHNjb3BlLmN1c3RvbWVyLmFkZHJlc3MuemlwID0gJzkwMjEwJ1xuICogLSBBcnJheSBtdXRhdGlvbiBpbnRlcmNlcHRpb246IHNjb3BlLml0ZW1zLnB1c2goJ25ldycpXG4gKiAtICQtcHJlZml4ZWQgZXNjYXBlIGhhdGNoZXM6ICRnZXRWYWx1ZSwgJHNldFZhbHVlLCAkcmVhZCwgJGdldEFyZ3MsIGV0Yy5cbiAqXG4gKiBSZWFkIHNlbWFudGljczogdG9wLWxldmVsIGdldCBjYWxscyBnZXRWYWx1ZSgpIChmaXJlcyBvblJlYWQgT05DRSkuXG4gKiAgIE5lc3RlZCBnZXQgdHJhcHMgbmF2aWdhdGUgaW4tbWVtb3J5IC0tIG5vIGFkZGl0aW9uYWwgb25SZWFkLlxuICpcbiAqIFdyaXRlIHNlbWFudGljczogdG9wLWxldmVsIHNldCBjYWxscyBzZXRWYWx1ZSgpLiBOZXN0ZWQgc2V0IGNhbGxzXG4gKiAgIHVwZGF0ZVZhbHVlKCkgd2l0aCBhIHBhcnRpYWwgb2JqZWN0IGJ1aWx0IGZyb20gdGhlIGFjY3VtdWxhdGVkIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0IGFzIGxvZGFzaEdldCB9IGZyb20gJy4uL21lbW9yeS9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHNob3VsZFdyYXBXaXRoUHJveHkgfSBmcm9tICcuL2FsbG93bGlzdC5qcyc7XG5pbXBvcnQgeyBhcnJheVByb3h5QXQgfSBmcm9tICcuL2FycmF5VHJhcHMuanMnO1xuaW1wb3J0IHsgbGl2ZUdldFRyYXAsIGxpdmVJbnNwZWN0aW9uVHJhcHMsIGxpdmVPYmplY3QgfSBmcm9tICcuL2xpdmVWaWV3LmpzJztcbmltcG9ydCB7IHVud3JhcFByb3h5IH0gZnJvbSAnLi9zdHJ1Y3R1cmFsV3JpdGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdGl2ZU9wdGlvbnMsIFJlYWN0aXZlVGFyZ2V0LCBUeXBlZFNjb3BlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBCUkVBS19TRVRURVIsIEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMsIElTX1RZUEVEX1NDT1BFLCBTQ09QRV9NRVRIT0RfTkFNRVMgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgV3JpdGVTaW5rLCByb290S2V5U2luaywgc2lua0RlbGV0ZVRyYXAsIHNpbmtTZXRUcmFwIH0gZnJvbSAnLi93cml0ZVRyYXBzLmpzJztcblxuLy8gLS0gJC1tZXRob2Qgcm91dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIE1ldGhvZFJvdXRlciA9ICh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRzOiBSZWFjdGl2ZVN0YXRlKSA9PiB1bmtub3duO1xuXG5jb25zdCBNRVRIT0RfUk9VVEVTOiBSZWNvcmQ8c3RyaW5nLCBNZXRob2RSb3V0ZXI+ID0ge1xuICAkZ2V0VmFsdWU6ICh0KSA9PiB0LmdldFZhbHVlLmJpbmQodCksXG4gICRzZXRWYWx1ZTogKHQpID0+IHQuc2V0VmFsdWUuYmluZCh0KSxcbiAgJHVwZGF0ZTogKHQpID0+IHQudXBkYXRlVmFsdWUuYmluZCh0KSxcbiAgJGRlbGV0ZTogKHQpID0+IHQuZGVsZXRlVmFsdWUuYmluZCh0KSxcbiAgJHJlYWQ6ICh0KSA9PiAoZG90UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdEtleSA9IGRvdFBhdGguc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IHQuZ2V0VmFsdWUocm9vdEtleSk7XG4gICAgaWYgKCFkb3RQYXRoLmluY2x1ZGVzKCcuJykpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHZhbHVlLCBkb3RQYXRoLnNsaWNlKHJvb3RLZXkubGVuZ3RoICsgMSkpO1xuICB9LFxuICAkZ2V0QXJnczogKHQpID0+IHQuZ2V0QXJncy5iaW5kKHQpLFxuICAkZ2V0RW52OiAodCkgPT4gdC5nZXRFbnYuYmluZCh0KSxcbiAgJGRlYnVnOiAodCkgPT4gdC5hZGREZWJ1Z0luZm8uYmluZCh0KSxcbiAgJGxvZzogKHQpID0+IHQuYWRkRGVidWdNZXNzYWdlLmJpbmQodCksXG4gICRlcnJvcjogKHQpID0+IHQuYWRkRXJyb3JJbmZvLmJpbmQodCksXG4gICRtZXRyaWM6ICh0KSA9PiB0LmFkZE1ldHJpYy5iaW5kKHQpLFxuICAkZXZhbDogKHQpID0+IHQuYWRkRXZhbC5iaW5kKHQpLFxuICAkYXR0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuYXR0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZGV0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuZGV0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZ2V0U2NvcGVSZWNvcmRlcnM6ICh0KSA9PiB0LmdldFNjb3BlUmVjb3JkZXJzLmJpbmQodCksXG4gICRiYXRjaEFycmF5OiAodCkgPT4gKGtleTogc3RyaW5nLCBmbjogKGFycjogdW5rbm93bltdKSA9PiB2b2lkKSA9PiB7XG4gICAgLy8gT25lIGdldFZhbHVlIOKAlCBmaXJlcyBvblJlYWQgb25jZVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0LmdldFZhbHVlKGtleSk7XG4gICAgLy8gQ2xvbmUgb25jZSDigJQgREVFUCAob3Igc3RhcnQgZW1wdHkgaWYgbWlzc2luZy9ub24tYXJyYXkpLiBUaGUgcmVhZCBpc1xuICAgIC8vIEJPUlJPV0VEOiBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIGl0IGlzIGNvbW1pdHRlZCBzaGFyZWRcbiAgICAvLyBtZW1vcnkgaXRzZWxmLCBzbyBhIHNoYWxsb3cgYFsuLi5jdXJyZW50XWAgaGFuZGVkIHRoZSBzdGFnZSB0aGVcbiAgICAvLyBjb21taXR0ZWQgRUxFTUVOVFMgYW5kIGBhcnJbMF0ubiA9IDlgIGVkaXRlZCBjb21taXR0ZWQgc3RhdGUgaW4gcGxhY2VcbiAgICAvLyB3aXRoIG5vIHRyYWNlIHJvdyAoYW5kIHRoZSBsYXp5IGJ1ZmZlcidzIGJhc2Ugd2FzIHRoZW4gdGFrZW4gQUZURVIgdGhlXG4gICAgLy8gZWRpdCwgc28gdGhlIG5ldC1jaGFuZ2UgZmlsdGVyIHNhdyBub3RoaW5nKS4gU3RhdGUgdmFsdWVzIHN1cnZpdmVcbiAgICAvLyBgc3RydWN0dXJlZENsb25lYCBieSBjb250cmFjdCwgc28gdGhlIHdvcmtpbmcgY29weSBpcyBhIGZ1bGwgY29weS5cbiAgICBjb25zdCBjbG9uZTogdW5rbm93bltdID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IHN0cnVjdHVyZWRDbG9uZShjdXJyZW50KSA6IFtdO1xuICAgIC8vIFVzZXIgYXBwbGllcyBhbGwgbXV0YXRpb25zIHRvIHRoZSBwbGFpbiBjbG9uZSDigJQgbm8gUHJveHksIG5vIHBlci1tdXRhdGlvbiBjb21taXRcbiAgICBmbihjbG9uZSk7XG4gICAgLy8gT25lIHNldFZhbHVlIOKAlCBmaXJlcyBvbldyaXRlIG9uY2Ugd2l0aCB0aGUgZmluYWwgYXJyYXlcbiAgICB0LnNldFZhbHVlKGtleSwgY2xvbmUpO1xuICB9LFxuICAkYnJlYWs6IChfdCwgb3B0cykgPT4gKHJlYXNvbj86IHN0cmluZykgPT4ge1xuICAgIGlmICghb3B0cy5icmVha0ZuKSB0aHJvdyBuZXcgRXJyb3IoJyRicmVhaygpIGlzIG5vdCBhdmFpbGFibGUgb3V0c2lkZSBzdGFnZSBleGVjdXRpb24nKTtcbiAgICBvcHRzLmJyZWFrRm4ocmVhc29uKTtcbiAgfSxcbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgRW1pdCBjaGFubmVsIChQaGFzZSAzKS4gUm91dGVzIHRvIFNjb3BlRmFjYWRlLmVtaXRFdmVudFxuICAvLyB3aGljaCBoYW5kbGVzIGZhc3QtcGF0aCwgZW5yaWNobWVudCwgcmVkYWN0aW9uLCBhbmQgZXJyb3IgaXNvbGF0aW9uLlxuICAkZW1pdDogKHQpID0+IHQuZW1pdEV2ZW50LmJpbmQodCksXG4gIC8vIERldGFjaCAoVDQpIOKAlCBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0cy4gRGVsZWdhdGVzIHRvIFNjb3BlRmFjYWRlXG4gIC8vIHdoaWNoIG1pbnRlZCByZWZJZHMgZnJvbSBydW50aW1lU3RhZ2VJZC5cbiAgJGRldGFjaEFuZEpvaW5MYXRlcjogKHQpID0+IHQuZGV0YWNoQW5kSm9pbkxhdGVyLmJpbmQodCksXG4gICRkZXRhY2hBbmRGb3JnZXQ6ICh0KSA9PiB0LmRldGFjaEFuZEZvcmdldC5iaW5kKHQpLFxuICAkdG9SYXc6ICh0KSA9PiAoKSA9PiB0LFxufTtcblxuLy8gLS0gR3VhcmQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIHRvIHByZXZlbnQgUHJveHkgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgUHJvbWlzZSxcbi8vIGJyZWFraW5nIGluc3RhbmNlb2YgY2hlY2tzLCBvciBjb25mdXNpbmcgdGVzdCBtYXRjaGVycy5cblxuY29uc3QgR1VBUkRfUFJPUFM6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+ID0ge1xuICB0aGVuOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgUHJvbWlzZSBkZXRlY3Rpb25cbiAgYXN5bW1ldHJpY01hdGNoOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgdml0ZXN0L2plc3QgbWF0Y2hlciBjb25mdXNpb25cbiAgY29uc3RydWN0b3I6IE9iamVjdCwgLy8gc2FmZSBwcm90b3R5cGVcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdUeXBlZFNjb3BlJyxcbn07XG5cbi8vIC0tIFNpbGVudCBleGlzdGVuY2UgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBEb2VzIHRoaXMga2V5IGV4aXN0IGluIHN0YXRlLCBhbnN3ZXJlZCB3aXRoIE5PIHRyYWNraW5nIHNpZGUgZWZmZWN0IGF0IGFsbD9cbiAqXG4gKiBgZ2V0U3RhdGVLZXlzKClgIGlzIHRoZSBvbmx5IGluc3BlY3Rpb24gYSBTY29wZUZhY2FkZSBhbnN3ZXJzIHdpdGhvdXQgcm91dGluZ1xuICogdGhyb3VnaCB0aGUgdHJhY2tlZCByZWFkIHBhdGguIGBoYXNLZXkoKWAgZGVsaWJlcmF0ZWx5IERPRVMgcm91dGUgdGhyb3VnaCBpdDpcbiAqIGAnaycgaW4gc2NvcGVgIGlzIGEgcmVhbCBxdWVzdGlvbiBhYm91dCBzdGF0ZSB0aGF0IGEgc3RhZ2UgY2FuIGJyYW5jaCBvbiwgc29cbiAqIGl0IHJlZ2lzdGVycyBhcyBhIHJlYWQg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoaXMgcHJvYmUgbXVzdCBub3QgdXNlIGl0LlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdGFyZ2V0IG9mZmVycyBubyBzaWxlbnQgYW5zd2VyOyBjYWxsZXJzIG11c3RcbiAqIHRoZW4gY2hvb3NlIGRlbGliZXJhdGVseSByYXRoZXIgdGhhbiBhc3N1bWUuXG4gKi9cbmZ1bmN0aW9uIHNpbGVudGx5S25vd25LZXkodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKGtleSk7XG59XG5cbi8vIC0tIE11dGFibGUgc3RhdGUgcGVyIHByb3h5IGluc3RhbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIFJlYWN0aXZlU3RhdGUge1xuICBicmVha0ZuPzogKHJlYXNvbj86IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhY2hlOiB0b3AtbGV2ZWwga2V5IC0+IHsgcmF3IG9iamVjdCByZWYsIGNoaWxkIHByb3h5IH0gKi9cbiAgY2hpbGRDYWNoZTogTWFwPHN0cmluZywgeyByZWY6IG9iamVjdDsgcHJveHk6IG9iamVjdCB9Pjtcbn1cblxuLy8gLS0gTmVzdGVkIGNoaWxkIHByb3hpZXMgKGZvciBkZWVwIHdyaXRlIGludGVyY2VwdGlvbikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBCb3RoIGZhY3RvcmllcyBhcmUgT1JDSEVTVFJBVE9SUyAoOS4yMy4xKTogcmVhZHMgYXJlIGBsaXZlVmlldy50c2AsIHdyaXRlc1xuLy8gYXJlIGB3cml0ZVRyYXBzLnRzYCBvdmVyIGEgYHJvb3RLZXlTaW5rYCwgYW5kIHRoZSBPTkUgdGhpbmcgZWFjaCBkZWNpZGVzXG4vLyBpdHNlbGYgaXMgd2hhdCBhIGNoaWxkIG1lbWJlciBiZWNvbWVzIOKAlCB0aGUgY3ljbGUgcG9saWN5LlxuLy9cbi8vIEN5Y2xlIHNhZmV0eTogYW4gaW1tdXRhYmxlIFNldDxvYmplY3Q+IG9mIGFuY2VzdG9yIG9iamVjdHMgaXMgcGFzc2VkIGRvd25cbi8vIGVhY2ggYWNjZXNzIGNoYWluLiBFYWNoIGJyYW5jaCBnZXRzIGl0cyBvd24gY29weSAobmV3IFNldChwYXJlbnQpKSBzb1xuLy8gc2NvcGUueC5mcmllbmQgYW5kIHNjb3BlLnguY293b3JrZXIgZG9uJ3QgcG9sbHV0ZSBlYWNoIG90aGVyJ3MgdHJhY2tpbmcuXG4vLyBXaGVuIGEgY2hpbGQgdmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgYW5jZXN0b3Igc2V0LCB3ZSd2ZSBoaXQgYSBjeWNsZS5cbi8vIEF0IHRoZSBjeWNsZSBicmVhazogcmV0dXJuIGEgdGVybWluYWwgcHJveHkgdGhhdCB0cmFja3Mgd3JpdGVzIChzZXQgdHJhcFxuLy8gc3RpbGwgYnVpbGRzIHBhdGggKyBjb21taXRzIHRocm91Z2ggdGhlIHNpbmspIGJ1dCBkb2Vzbid0IHJlY3Vyc2UgcmVhZHNcbi8vIGZ1cnRoZXIuIFRoZSB0ZXJtaW5hbCBjaGFpbiBzaGFyZXMgT05FIG11dGFibGUgYHZpc2l0ZWRgIHNldDogYSB2YWx1ZSBzZWVuXG4vLyBhbnl3aGVyZSBwYXN0IHRoZSBjeWNsZSBlZGdlIGlzIGhhbmRlZCBiYWNrIHJhdy5cblxuZnVuY3Rpb24gY3JlYXRlVGVybWluYWxQcm94eShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2luazogV3JpdGVTaW5rLFxuICBzZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHZpc2l0ZWQ6IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpLFxuKTogdW5rbm93biB7XG4gIHZpc2l0ZWQuYWRkKG9iaik7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgY29uc3QgY2hpbGQgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIC8vIEFuIGFycmF5IHBhc3QgdGhlIGN5Y2xlIGVkZ2Ugc3RpbGwgZ2V0cyBjb3B5LW9uLXdyaXRlIGludGVyY2VwdGlvbiDigJRcbiAgICAvLyBpdCBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIHJvb3Qga2V5LCB0aGUgc2FtZSBsYXcgYXMgdGhlIG5lc3RlZCBwcm94eS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgdmlzaXRlZCk7XG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQpLFxuICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICAvLyBSZWFkcyBhcmUgTElWRSAoOS4yMi4wKTogYSBoZWxkIHByb3h5IHJlYWRzIGl0cyBvd24gd3JpdGVzLCBgJ3gnIGluIG9gXG4gIC8vIGFuZCBgT2JqZWN0LmtleXMobylgIHNlZSB0aGVtLCBhbmQgYG8uYiA9IG8uYSAqIDEwYCB1c2VzIHRoZSBuZXcgYGFgLlxuICAvLyBUaGUgY2FwdHVyZWQgb2JqZWN0IGFuc3dlcnMgb25seSB3aGVuIHRoZSBwYXRoIGlzIGdvbmUg4oCUIHNlZSBsaXZlVmlldy50cy5cbiAgY29uc3QgbGl2ZSA9ICgpID0+IGxpdmVPYmplY3Qob2JqLCBzaW5rLnJlYWRBdChzZWdtZW50cykpO1xuICBjb25zdCBjaGlsZCA9ICh2YWx1ZTogdW5rbm93biwgcGF0aDogc3RyaW5nW10pOiB1bmtub3duID0+IHtcbiAgICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgLy8gQW4gYXJyYXkgY29tbWl0cyBhcyBhIGBzZXRgIG9mIHRoZSBST09UIEtFWSAocmVhY3RpdmUvUkVBRE1FLm1kLCBsYXcgMylcbiAgICAvLyDigJQgdGhlIHNpbmsncyB2ZXJiLCB3aGF0ZXZlciBkZXB0aCB0aGUgYXJyYXkgc2l0cyBhdC5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUgYXMgb2JqZWN0KSkgcmV0dXJuIGNyZWF0ZVRlcm1pbmFsUHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgpO1xuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgbmV3IFNldChhbmNlc3RvcnMpLmFkZCh2YWx1ZSBhcyBvYmplY3QpKTtcbiAgfTtcbiAgcmV0dXJuIG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQ6IGxpdmVHZXRUcmFwKGxpdmUsIHNlZ21lbnRzLCBjaGlsZCksXG4gICAgc2V0OiBzaW5rU2V0VHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgZGVsZXRlUHJvcGVydHk6IHNpbmtEZWxldGVUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAuLi5saXZlSW5zcGVjdGlvblRyYXBzKGxpdmUpLFxuICB9KTtcbn1cblxuLy8gLS0gVG9wLWxldmVsIGxlYXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIGBpbnRlcm5hbFJlYWRgIGFuc3dlcmVkIG5vdGhpbmc6IHRoZSBuYW1lIGlzIGEgc3RhdGUga2V5IGFuZCBtdXN0IGJlIHJlYWQgKHRyYWNrZWQpIGZyb20gdGhlIHRhcmdldC4gKi9cbmNvbnN0IFNUQVRFX0tFWTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnc3RhdGUta2V5Jyk7XG5cbi8qKlxuICogV0hZOiB0aGUgbmFtZXMgdGhlIHNjb3BlIGFuc3dlcnMgSVRTRUxGIOKAlCBpbnRlcm5hbCBzeW1ib2xzLCB0aGUgZ3VhcmRcbiAqIHByb3BlcnRpZXMsIE5vZGUncyBpbnNwZWN0IGhvb2ssIHRoZSBgJGAtbWV0aG9kcywgdGhlIGV4ZWN1dG9yJ3MgYWxsb3dsaXN0ZWRcbiAqIHBhc3MtdGhyb3VnaHMgKGBhdHRhY2hTY29wZVJlY29yZGVyYCwgYG5vdGlmeVN0YWdlU3RhcnRgLCDigKYsIGNhbGxlZCBkaXJlY3RseVxuICogb24gdGhlIHNjb3BlKSBhbmQgdGhlIEpTT04gcHJvYmUg4oCUIG11c3QgbmV2ZXIgYmVjb21lIHRyYWNrZWQgcmVhZHM7XG4gKiBldmVyeXRoaW5nIGVsc2UgaXMgYSBzdGF0ZSBrZXkgYW5kIGlzIGxlZnQgdG8gdGhlIGNhbGxlci5cbiAqXG4gKiBUaGUgcHJvYmU6IGBKU09OLnN0cmluZ2lmeWAgYXNrcyBFVkVSWSB2YWx1ZSBmb3IgYSBgdG9KU09OYCBtZXRob2QuIFRoYXRcbiAqIHF1ZXN0aW9uIGNvbWVzIGZyb20gdGhlIHJ1bnRpbWUsIG5vdCB0aGUgc3RhZ2UgYXV0aG9yLCBzbyBpdCBtdXN0IG5vdCBlbnRlclxuICogdGhlIHJlYWQgc2V0LiBBIHN0YXRlIGtleSBsaXRlcmFsbHkgY2FsbGVkICd0b0pTT04nIGlzIGxlZ2FsOiB3aGVuIGl0IEVYSVNUU1xuICogdGhpcyBpcyBhIGdlbnVpbmUgcmVhZCBhbmQgc3RheXMgdHJhY2tlZCwgYW5kIHdoZW4gdGhlIHRhcmdldCBjYW5ub3QgYW5zd2VyXG4gKiBzaWxlbnRseSwgdHJ1dGggd2lucyBvdmVyIG5vaXNlIOKAlCBmYWxsIHRocm91Z2guXG4gKi9cbmZ1bmN0aW9uIGludGVybmFsUmVhZCh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdW5rbm93biB7XG4gIGlmIChwcm9wID09PSBJU19UWVBFRF9TQ09QRSkgcmV0dXJuIHRydWU7XG4gIGlmIChwcm9wID09PSBCUkVBS19TRVRURVIpIHtcbiAgICByZXR1cm4gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICBzdGF0ZS5icmVha0ZuID0gZm47XG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgICBpZiAocHJvcCA9PT0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSkgcmV0dXJuICgpID0+IHRhcmdldC5nZXRWYWx1ZSgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkpIHJldHVybiBNRVRIT0RfUk9VVEVTW3Byb3BdPy4odGFyZ2V0LCBzdGF0ZSk7XG4gIGlmIChFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTLmhhcyhwcm9wKSAmJiB0eXBlb2YgKHRhcmdldCBhcyBhbnkpW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuICh0YXJnZXQgYXMgYW55KVtwcm9wXS5iaW5kKHRhcmdldCk7XG4gIH1cbiAgaWYgKHByb3AgPT09ICd0b0pTT04nICYmIHNpbGVudGx5S25vd25LZXkodGFyZ2V0LCBwcm9wKSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBTVEFURV9LRVk7XG59XG5cbi8qKlxuICogV0hZIHRoZSBjYWNoZTogYHNjb3BlLmsgPT09IHNjb3BlLmtgIG11c3QgaG9sZCB3aXRoaW4gYSBzdGFnZSBhbmQgYSByZXBlYXRlZFxuICogcmVhZCBvZiBhbiB1bmNoYW5nZWQgdmFsdWUgbXVzdCBub3QgYWxsb2NhdGU7IGEgd3JpdGUgdG8gdGhlIGtleSBkcm9wcyB0aGVcbiAqIGVudHJ5ICh0aGUgc2luayBkb2VzIGl0KSwgYSBjb21taXQgc3dhcHMgdGhlIHZhbHVlIGFuZCB0aGUgcmVmIGNoZWNrXG4gKiBtaXNzZXMg4oCUIGVpdGhlciB3YXkgdGhlIG5leHQgcmVhZCBidWlsZHMgYSBmcmVzaCBwcm94eSBvdmVyIHRoZSBuZXcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlZENoaWxkUHJveHkoc3RhdGU6IFJlYWN0aXZlU3RhdGUsIGtleTogc3RyaW5nLCB2YWx1ZTogb2JqZWN0LCBidWlsZDogKCkgPT4gb2JqZWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY2FjaGVkID0gc3RhdGUuY2hpbGRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucmVmID09PSB2YWx1ZSkgcmV0dXJuIGNhY2hlZC5wcm94eTtcbiAgY29uc3QgcHJveHkgPSBidWlsZCgpO1xuICBzdGF0ZS5jaGlsZENhY2hlLnNldChrZXksIHsgcmVmOiB2YWx1ZSwgcHJveHkgfSk7XG4gIHJldHVybiBwcm94eTtcbn1cblxuLyoqIEEgd3JhcHBhYmxlIHN0YXRlIHZhbHVlIGJlY29tZXMgdGhlIGFycmF5IG9yIG5lc3RlZCBwcm94eSBmb3IgaXRzIGtleTsgYW55dGhpbmcgZWxzZSBpcyBoYW5kZWQgYmFjayByYXcuICovXG5mdW5jdGlvbiB3cmFwU3RhdGVWYWx1ZShcbiAgdGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCxcbiAgcmVhZFNpbGVudDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duLFxuICBzdGF0ZTogUmVhY3RpdmVTdGF0ZSxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlOyAvLyBEYXRlLCBNYXAsIGNsYXNzIGluc3RhbmNlLCBmcm96ZW4g4oCmXG4gIHJldHVybiBjYWNoZWRDaGlsZFByb3h5KHN0YXRlLCBrZXksIHZhbHVlLCAoKSA9PiB7XG4gICAgY29uc3Qgc2luayA9IHJvb3RLZXlTaW5rKHRhcmdldCwgcmVhZFNpbGVudCwga2V5LCBzdGF0ZS5jaGlsZENhY2hlKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgW10pIGFzIHVua25vd24gYXMgb2JqZWN0O1xuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgW10sIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWVdKSkgYXMgb2JqZWN0O1xuICB9KTtcbn1cblxuLyoqIFdIWTogYSBgJGAtbmFtZSBjYW4gbmV2ZXIgYmUgYSBzdGF0ZSBrZXkg4oCUIHRoZSB3cml0ZSBpcyByZWZ1c2VkLCBub3Qgc2hhZG93ZWQ7IGV2ZXJ5IG90aGVyIGFzc2lnbm1lbnRcbiAqICBzdG9yZXMgdGhlIHVud3JhcHBlZCB2YWx1ZSAobGFuZG1pbmUgMSkgYW5kIGRyb3BzIHRoZSBrZXkncyBjYWNoZWQgcHJveHkuICovXG5mdW5jdGlvbiBhc3NpZ25TdGF0ZUtleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKGtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke2tleX1cIiAtLSBpdCBjb25mbGljdHMgd2l0aCBhIHJlc2VydmVkIFR5cGVkU2NvcGUgbWV0aG9kLiBSZW5hbWUgdGhlIHN0YXRlIGtleSB0byBhdm9pZCAkLXByZWZpeGVkIG5hbWVzLmAsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc2V0VmFsdWUoa2V5LCB1bndyYXBQcm94eSh2YWx1ZSkpO1xuICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShrZXkpO1xufVxuXG4vKiogRG9lcyB0aGUga2V5IGV4aXN0IOKAlCBhbnN3ZXJlZCB3aXRob3V0IGEgdHJhY2tlZCByZWFkIHdoZXJldmVyIHRoZSB0YXJnZXQgY2FuOyBgZ2V0VmFsdWVgIGlzIHRoZSBsYXN0IHJlc29ydC4gKi9cbmZ1bmN0aW9uIGtub3duS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuaGFzS2V5KSByZXR1cm4gdGFyZ2V0Lmhhc0tleShrZXkpO1xuICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhrZXkpO1xuICByZXR1cm4gdGFyZ2V0LmdldFZhbHVlKGtleSkgIT09IHVuZGVmaW5lZDsgLy8gZmFsbGJhY2s6IGZpcmVzIG9uUmVhZCAoYWNjZXB0YWJsZSBkZWdyYWRhdGlvbilcbn1cblxuLyoqIEV2ZXJ5IHN0YXRlIGtleSDigJQgc2lsZW50bHkgd2hlcmUgdGhlIHRhcmdldCBjYW4sIGVsc2UgZnJvbSBhIHdob2xlLXN0YXRlIHJlYWQuICovXG5mdW5jdGlvbiBzdGF0ZUtleXModGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCk7XG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0LmdldFZhbHVlKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzbmFwc2hvdCAmJiB0eXBlb2Ygc25hcHNob3QgPT09ICdvYmplY3QnID8gT2JqZWN0LmtleXMoc25hcHNob3QpIDogW107XG59XG5cbi8vIC0tIFRvcC1sZXZlbCBwcm94eSAodGhlIG1haW4gVHlwZWRTY29wZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVHlwZWRTY29wZTxUPiBwcm94eSB3cmFwcGluZyBhIFJlYWN0aXZlVGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdW5kZXJseWluZyBzY29wZSAoU2NvcGVGYWNhZGUgb3IgYW55IFJlYWN0aXZlVGFyZ2V0KVxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChicmVha1BpcGVsaW5lIGluamVjdGlvbilcbiAqIEByZXR1cm5zIEEgUHJveHkgd2l0aCB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgYW5kICQtcHJlZml4ZWQgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRpb25zPzogUmVhY3RpdmVPcHRpb25zKTogVHlwZWRTY29wZTxUPiB7XG4gIGNvbnN0IHN0YXRlOiBSZWFjdGl2ZVN0YXRlID0geyBicmVha0ZuOiBvcHRpb25zPy5icmVha1BpcGVsaW5lLCBjaGlsZENhY2hlOiBuZXcgTWFwKCkgfTtcbiAgLy8gQmluZCB0aGUgc2lsZW50IHJlYWQgb25jZSDigJQgdGhlIG5lc3RlZC9hcnJheSBwcm94aWVzIHJlc29sdmUgdGhlaXIgbGl2ZSB2aWV3IHRocm91Z2ggaXQuXG4gIGNvbnN0IHJlYWRTaWxlbnQgPSAodGFyZ2V0LmdldFZhbHVlU2lsZW50ID8/IHRhcmdldC5nZXRWYWx1ZSkuYmluZCh0YXJnZXQpO1xuXG4gIHJldHVybiBuZXcgUHJveHkodGFyZ2V0IGFzIHVua25vd24gYXMgVHlwZWRTY29wZTxUPiwge1xuICAgIGdldChfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGNvbnN0IGFuc3dlcmVkID0gaW50ZXJuYWxSZWFkKHRhcmdldCwgc3RhdGUsIHByb3ApO1xuICAgICAgaWYgKGFuc3dlcmVkICE9PSBTVEFURV9LRVkpIHJldHVybiBhbnN3ZXJlZDtcbiAgICAgIC8vIEEgc3RhdGUga2V5OiBPTkUgdHJhY2tlZCByZWFkIChmaXJlcyBvblJlYWQgb25jZSksIHRoZW4gdGhlIHdyYXBwZXIuXG4gICAgICByZXR1cm4gd3JhcFN0YXRlVmFsdWUodGFyZ2V0LCByZWFkU2lsZW50LCBzdGF0ZSwgcHJvcCBhcyBzdHJpbmcsIHRhcmdldC5nZXRWYWx1ZShwcm9wIGFzIHN0cmluZykpO1xuICAgIH0sXG4gICAgc2V0KF9wcm94eVRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIGFzc2lnblN0YXRlS2V5KHRhcmdldCwgc3RhdGUsIHByb3AsIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgZGVsZXRlUHJvcGVydHkoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHRhcmdldC5kZWxldGVWYWx1ZShwcm9wKTtcbiAgICAgIHN0YXRlLmNoaWxkQ2FjaGUuZGVsZXRlKHByb3ApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBoYXMoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKTtcbiAgICAgIHJldHVybiBTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApIHx8IGtub3duS2V5KHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbiAgICBvd25LZXlzOiAoKSA9PiBzdGF0ZUtleXModGFyZ2V0KSxcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnIHx8IFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkpIHJldHVybiB1bmRlZmluZWQ7IC8vICQtbWV0aG9kcyBhcmUgbm9uLWVudW1lcmFibGVcbiAgICAgIGlmICgha25vd25LZXkodGFyZ2V0LCBwcm9wKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfTsgLy8gdGhlIHZhbHVlIGlzIGZldGNoZWQgdmlhIHRoZSBnZXQgdHJhcFxuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pHLE9BQU8sRUFBa0IsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQWUsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxPQUFPLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25DLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMs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SUFBSSxDQUFDLENBQUM7WUFDekIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJO1lBQ3BCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtnQkFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0YsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDaEMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLElBQUk7WUFDekMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQyxDQUFDLCtCQUErQjtZQUMvRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7UUFDM0csQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2NyZWF0ZVR5cGVkU2NvcGUgLS0gQ29yZSBQcm94eSBmYWN0b3J5IGZvciBUeXBlZFNjb3BlPFQ+LlxuICpcbiAqIFdyYXBzIGEgUmVhY3RpdmVUYXJnZXQgKFNjb3BlRmFjYWRlKSBpbiBhIFByb3h5IHRoYXQgcHJvdmlkZXM6XG4gKiAtIFR5cGVkIHByb3BlcnR5IGFjY2Vzczogc2NvcGUuY3JlZGl0VGllciAocmVhZCksIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgKHdyaXRlKVxuICogLSBEZWVwIHdyaXRlIGludGVyY2VwdGlvbjogc2NvcGUuY3VzdG9tZXIuYWRkcmVzcy56aXAgPSAnOTAyMTAnXG4gKiAtIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbjogc2NvcGUuaXRlbXMucHVzaCgnbmV3JylcbiAqIC0gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlczogJGdldFZhbHVlLCAkc2V0VmFsdWUsICRyZWFkLCAkZ2V0QXJncywgZXRjLlxuICpcbiAqIFJlYWQgc2VtYW50aWNzOiB0b3AtbGV2ZWwgZ2V0IGNhbGxzIGdldFZhbHVlKCkgKGZpcmVzIG9uUmVhZCBPTkNFKS5cbiAqICAgTmVzdGVkIGdldCB0cmFwcyBuYXZpZ2F0ZSBpbi1tZW1vcnkgLS0gbm8gYWRkaXRpb25hbCBvblJlYWQuXG4gKlxuICogV3JpdGUgc2VtYW50aWNzOiB0b3AtbGV2ZWwgc2V0IGNhbGxzIHNldFZhbHVlKCkuIE5lc3RlZCBzZXQgY2FsbHNcbiAqICAgdXBkYXRlVmFsdWUoKSB3aXRoIGEgcGFydGlhbCBvYmplY3QgYnVpbHQgZnJvbSB0aGUgYWNjdW11bGF0ZWQgcGF0aC5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgbG9kYXNoR2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmltcG9ydCB7IGFycmF5UHJveHlBdCB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5pbXBvcnQgeyBjYWNoZWRNZW1iZXIsIGxpdmVHZXRUcmFwLCBsaXZlSW5zcGVjdGlvblRyYXBzLCBsaXZlT2JqZWN0LCBNZW1iZXJDYWNoZSB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgdW53cmFwUHJveHkgfSBmcm9tICcuL3N0cnVjdHVyYWxXcml0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVNpbmssIHJvb3RLZXlTaW5rLCBzaW5rRGVsZXRlVHJhcCwgc2lua1NldFRyYXAgfSBmcm9tICcuL3dyaXRlVHJhcHMuanMnO1xuXG4vLyAtLSAkLW1ldGhvZCByb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgTWV0aG9kUm91dGVyID0gKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdHM6IFJlYWN0aXZlU3RhdGUpID0+IHVua25vd247XG5cbmNvbnN0IE1FVEhPRF9ST1VURVM6IFJlY29yZDxzdHJpbmcsIE1ldGhvZFJvdXRlcj4gPSB7XG4gICRnZXRWYWx1ZTogKHQpID0+IHQuZ2V0VmFsdWUuYmluZCh0KSxcbiAgJHNldFZhbHVlOiAodCkgPT4gdC5zZXRWYWx1ZS5iaW5kKHQpLFxuICAkdXBkYXRlOiAodCkgPT4gdC51cGRhdGVWYWx1ZS5iaW5kKHQpLFxuICAkZGVsZXRlOiAodCkgPT4gdC5kZWxldGVWYWx1ZS5iaW5kKHQpLFxuICAkcmVhZDogKHQpID0+IChkb3RQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290S2V5ID0gZG90UGF0aC5zcGxpdCgnLicpWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gdC5nZXRWYWx1ZShyb290S2V5KTtcbiAgICBpZiAoIWRvdFBhdGguaW5jbHVkZXMoJy4nKSkgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBsb2Rhc2hHZXQodmFsdWUsIGRvdFBhdGguc2xpY2Uocm9vdEtleS5sZW5ndGggKyAxKSk7XG4gIH0sXG4gICRnZXRBcmdzOiAodCkgPT4gdC5nZXRBcmdzLmJpbmQodCksXG4gICRnZXRFbnY6ICh0KSA9PiB0LmdldEVudi5iaW5kKHQpLFxuICAkZGVidWc6ICh0KSA9PiB0LmFkZERlYnVnSW5mby5iaW5kKHQpLFxuICAkbG9nOiAodCkgPT4gdC5hZGREZWJ1Z01lc3NhZ2UuYmluZCh0KSxcbiAgJGVycm9yOiAodCkgPT4gdC5hZGRFcnJvckluZm8uYmluZCh0KSxcbiAgJG1ldHJpYzogKHQpID0+IHQuYWRkTWV0cmljLmJpbmQodCksXG4gICRldmFsOiAodCkgPT4gdC5hZGRFdmFsLmJpbmQodCksXG4gICRhdHRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5hdHRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRkZXRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5kZXRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRnZXRTY29wZVJlY29yZGVyczogKHQpID0+IHQuZ2V0U2NvcGVSZWNvcmRlcnMuYmluZCh0KSxcbiAgJGJhdGNoQXJyYXk6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpID0+IHtcbiAgICAvLyBPbmUgZ2V0VmFsdWUg4oCUIGZpcmVzIG9uUmVhZCBvbmNlXG4gICAgY29uc3QgY3VycmVudCA9IHQuZ2V0VmFsdWUoa2V5KTtcbiAgICAvLyBDbG9uZSBvbmNlIOKAlCBERUVQIChvciBzdGFydCBlbXB0eSBpZiBtaXNzaW5nL25vbi1hcnJheSkuIFRoZSByZWFkIGlzXG4gICAgLy8gQk9SUk9XRUQ6IGJlZm9yZSB0aGUgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgaXQgaXMgY29tbWl0dGVkIHNoYXJlZFxuICAgIC8vIG1lbW9yeSBpdHNlbGYsIHNvIGEgc2hhbGxvdyBgWy4uLmN1cnJlbnRdYCBoYW5kZWQgdGhlIHN0YWdlIHRoZVxuICAgIC8vIGNvbW1pdHRlZCBFTEVNRU5UUyBhbmQgYGFyclswXS5uID0gOWAgZWRpdGVkIGNvbW1pdHRlZCBzdGF0ZSBpbiBwbGFjZVxuICAgIC8vIHdpdGggbm8gdHJhY2Ugcm93IChhbmQgdGhlIGxhenkgYnVmZmVyJ3MgYmFzZSB3YXMgdGhlbiB0YWtlbiBBRlRFUiB0aGVcbiAgICAvLyBlZGl0LCBzbyB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIgc2F3IG5vdGhpbmcpLiBTdGF0ZSB2YWx1ZXMgc3Vydml2ZVxuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgIGJ5IGNvbnRyYWN0LCBzbyB0aGUgd29ya2luZyBjb3B5IGlzIGEgZnVsbCBjb3B5LlxuICAgIGNvbnN0IGNsb25lOiB1bmtub3duW10gPSBBcnJheS5pc0FycmF5KGN1cnJlbnQpID8gc3RydWN0dXJlZENsb25lKGN1cnJlbnQpIDogW107XG4gICAgLy8gVXNlciBhcHBsaWVzIGFsbCBtdXRhdGlvbnMgdG8gdGhlIHBsYWluIGNsb25lIOKAlCBubyBQcm94eSwgbm8gcGVyLW11dGF0aW9uIGNvbW1pdFxuICAgIGZuKGNsb25lKTtcbiAgICAvLyBPbmUgc2V0VmFsdWUg4oCUIGZpcmVzIG9uV3JpdGUgb25jZSB3aXRoIHRoZSBmaW5hbCBhcnJheVxuICAgIHQuc2V0VmFsdWUoa2V5LCBjbG9uZSk7XG4gIH0sXG4gICRicmVhazogKF90LCBvcHRzKSA9PiAocmVhc29uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFvcHRzLmJyZWFrRm4pIHRocm93IG5ldyBFcnJvcignJGJyZWFrKCkgaXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIHN0YWdlIGV4ZWN1dGlvbicpO1xuICAgIG9wdHMuYnJlYWtGbihyZWFzb24pO1xuICB9LFxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpLiBSb3V0ZXMgdG8gU2NvcGVGYWNhZGUuZW1pdEV2ZW50XG4gIC8vIHdoaWNoIGhhbmRsZXMgZmFzdC1wYXRoLCBlbnJpY2htZW50LCByZWRhY3Rpb24sIGFuZCBlcnJvciBpc29sYXRpb24uXG4gICRlbWl0OiAodCkgPT4gdC5lbWl0RXZlbnQuYmluZCh0KSxcbiAgLy8gRGV0YWNoIChUNCkg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnRzLiBEZWxlZ2F0ZXMgdG8gU2NvcGVGYWNhZGVcbiAgLy8gd2hpY2ggbWludGVkIHJlZklkcyBmcm9tIHJ1bnRpbWVTdGFnZUlkLlxuICAkZGV0YWNoQW5kSm9pbkxhdGVyOiAodCkgPT4gdC5kZXRhY2hBbmRKb2luTGF0ZXIuYmluZCh0KSxcbiAgJGRldGFjaEFuZEZvcmdldDogKHQpID0+IHQuZGV0YWNoQW5kRm9yZ2V0LmJpbmQodCksXG4gICR0b1JhdzogKHQpID0+ICgpID0+IHQsXG59O1xuXG4vLyAtLSBHdWFyZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGVzZSBtdXN0IGJlIGhhbmRsZWQgdG8gcHJldmVudCBQcm94eSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBQcm9taXNlLFxuLy8gYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MsIG9yIGNvbmZ1c2luZyB0ZXN0IG1hdGNoZXJzLlxuXG5jb25zdCBHVUFSRF9QUk9QUzogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gPSB7XG4gIHRoZW46IHVuZGVmaW5lZCwgLy8gcHJldmVudCBQcm9taXNlIGRldGVjdGlvblxuICBhc3ltbWV0cmljTWF0Y2g6IHVuZGVmaW5lZCwgLy8gcHJldmVudCB2aXRlc3QvamVzdCBtYXRjaGVyIGNvbmZ1c2lvblxuICBjb25zdHJ1Y3RvcjogT2JqZWN0LCAvLyBzYWZlIHByb3RvdHlwZVxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ1R5cGVkU2NvcGUnLFxufTtcblxuLy8gLS0gU2lsZW50IGV4aXN0ZW5jZSBjaGVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIERvZXMgdGhpcyBrZXkgZXhpc3QgaW4gc3RhdGUsIGFuc3dlcmVkIHdpdGggTk8gdHJhY2tpbmcgc2lkZSBlZmZlY3QgYXQgYWxsP1xuICpcbiAqIGBnZXRTdGF0ZUtleXMoKWAgaXMgdGhlIG9ubHkgaW5zcGVjdGlvbiBhIFNjb3BlRmFjYWRlIGFuc3dlcnMgd2l0aG91dCByb3V0aW5nXG4gKiB0aHJvdWdoIHRoZSB0cmFja2VkIHJlYWQgcGF0aC4gYGhhc0tleSgpYCBkZWxpYmVyYXRlbHkgRE9FUyByb3V0ZSB0aHJvdWdoIGl0OlxuICogYCdrJyBpbiBzY29wZWAgaXMgYSByZWFsIHF1ZXN0aW9uIGFib3V0IHN0YXRlIHRoYXQgYSBzdGFnZSBjYW4gYnJhbmNoIG9uLCBzb1xuICogaXQgcmVnaXN0ZXJzIGFzIGEgcmVhZCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhpcyBwcm9iZSBtdXN0IG5vdCB1c2UgaXQuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB0YXJnZXQgb2ZmZXJzIG5vIHNpbGVudCBhbnN3ZXI7IGNhbGxlcnMgbXVzdFxuICogdGhlbiBjaG9vc2UgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIGFzc3VtZS5cbiAqL1xuZnVuY3Rpb24gc2lsZW50bHlLbm93bktleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCkuaW5jbHVkZXMoa2V5KTtcbn1cblxuLy8gLS0gTXV0YWJsZSBzdGF0ZSBwZXIgcHJveHkgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgUmVhY3RpdmVTdGF0ZSB7XG4gIGJyZWFrRm4/OiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogVGhlIHRvcC1sZXZlbCBrZXkncyBjaGlsZCBwcm94eSwgdmFsaWRhdGVkIGJ5IHJhdyBpZGVudGl0eSAoYGxpdmVWaWV3LnRzIMK3IGNhY2hlZE1lbWJlcmApOyBhIHNpbmsgZHJvcHMgdGhlIGtleSBvbiB3cml0ZS4gKi9cbiAgY2hpbGRDYWNoZTogTWVtYmVyQ2FjaGU7XG59XG5cbi8vIC0tIE5lc3RlZCBjaGlsZCBwcm94aWVzIChmb3IgZGVlcCB3cml0ZSBpbnRlcmNlcHRpb24pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gQm90aCBmYWN0b3JpZXMgYXJlIE9SQ0hFU1RSQVRPUlMgKDkuMjMuMSk6IHJlYWRzIGFyZSBgbGl2ZVZpZXcudHNgLCB3cml0ZXNcbi8vIGFyZSBgd3JpdGVUcmFwcy50c2Agb3ZlciBhIGByb290S2V5U2lua2AsIGFuZCB0aGUgT05FIHRoaW5nIGVhY2ggZGVjaWRlc1xuLy8gaXRzZWxmIGlzIHdoYXQgYSBjaGlsZCBtZW1iZXIgYmVjb21lcyDigJQgdGhlIGN5Y2xlIHBvbGljeS4gRWFjaCBob2xkcyBpdHNcbi8vIG93biBwZXItbWVtYmVyIHByb3h5IGNhY2hlICg5LjIzLjIsIGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKS5cbi8vXG4vLyBDeWNsZSBzYWZldHk6IGFuIGltbXV0YWJsZSBTZXQ8b2JqZWN0PiBvZiBhbmNlc3RvciBvYmplY3RzIGlzIHBhc3NlZCBkb3duXG4vLyBlYWNoIGFjY2VzcyBjaGFpbi4gRWFjaCBicmFuY2ggZ2V0cyBpdHMgb3duIGNvcHkgKG5ldyBTZXQocGFyZW50KSkgc29cbi8vIHNjb3BlLnguZnJpZW5kIGFuZCBzY29wZS54LmNvd29ya2VyIGRvbid0IHBvbGx1dGUgZWFjaCBvdGhlcidzIHRyYWNraW5nLlxuLy8gV2hlbiBhIGNoaWxkIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGFuY2VzdG9yIHNldCwgd2UndmUgaGl0IGEgY3ljbGUuXG4vLyBBdCB0aGUgY3ljbGUgYnJlYWs6IHJldHVybiBhIHRlcm1pbmFsIHByb3h5IHRoYXQgdHJhY2tzIHdyaXRlcyAoc2V0IHRyYXBcbi8vIHN0aWxsIGJ1aWxkcyBwYXRoICsgY29tbWl0cyB0aHJvdWdoIHRoZSBzaW5rKSBidXQgZG9lc24ndCByZWN1cnNlIHJlYWRzXG4vLyBmdXJ0aGVyLiBUaGUgdGVybWluYWwgY2hhaW4gc2hhcmVzIE9ORSBtdXRhYmxlIGB2aXNpdGVkYCBzZXQ6IGEgdmFsdWUgc2VlblxuLy8gYW55d2hlcmUgcGFzdCB0aGUgY3ljbGUgZWRnZSBpcyBoYW5kZWQgYmFjayByYXcuXG5cbmZ1bmN0aW9uIGNyZWF0ZVRlcm1pbmFsUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICB2aXNpdGVkLmFkZChvYmopO1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgY29uc3QgY2hpbGQgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIC8vIEFuIGFycmF5IHBhc3QgdGhlIGN5Y2xlIGVkZ2Ugc3RpbGwgZ2V0cyBjb3B5LW9uLXdyaXRlIGludGVyY2VwdGlvbiDigJRcbiAgICAvLyBpdCBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIHJvb3Qga2V5LCB0aGUgc2FtZSBsYXcgYXMgdGhlIG5lc3RlZCBwcm94eS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgdmlzaXRlZCk7XG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQsIG1lbWJlcnMpLFxuICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICAvLyBSZWFkcyBhcmUgTElWRSAoOS4yMi4wKTogYSBoZWxkIHByb3h5IHJlYWRzIGl0cyBvd24gd3JpdGVzLCBgJ3gnIGluIG9gXG4gIC8vIGFuZCBgT2JqZWN0LmtleXMobylgIHNlZSB0aGVtLCBhbmQgYG8uYiA9IG8uYSAqIDEwYCB1c2VzIHRoZSBuZXcgYGFgLlxuICAvLyBUaGUgY2FwdHVyZWQgb2JqZWN0IGFuc3dlcnMgb25seSB3aGVuIHRoZSBwYXRoIGlzIGdvbmUg4oCUIHNlZSBsaXZlVmlldy50cy5cbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChvYmosIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIGNvbnN0IGNoaWxkID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAvLyBBbiBhcnJheSBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIFJPT1QgS0VZIChyZWFjdGl2ZS9SRUFETUUubWQsIGxhdyAzKVxuICAgIC8vIOKAlCB0aGUgc2luaydzIHZlcmIsIHdoYXRldmVyIGRlcHRoIHRoZSBhcnJheSBzaXRzIGF0LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGFycmF5UHJveHlBdChzaW5rLCBwYXRoKTtcbiAgICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCk7XG4gICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBuZXcgU2V0KGFuY2VzdG9ycykuYWRkKHZhbHVlIGFzIG9iamVjdCkpO1xuICB9O1xuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsIGNoaWxkLCBtZW1iZXJzKSxcbiAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gIH0pO1xufVxuXG4vLyAtLSBUb3AtbGV2ZWwgbGVhdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogYGludGVybmFsUmVhZGAgYW5zd2VyZWQgbm90aGluZzogdGhlIG5hbWUgaXMgYSBzdGF0ZSBrZXkgYW5kIG11c3QgYmUgcmVhZCAodHJhY2tlZCkgZnJvbSB0aGUgdGFyZ2V0LiAqL1xuY29uc3QgU1RBVEVfS0VZOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdzdGF0ZS1rZXknKTtcblxuLyoqXG4gKiBXSFk6IHRoZSBuYW1lcyB0aGUgc2NvcGUgYW5zd2VycyBJVFNFTEYg4oCUIGludGVybmFsIHN5bWJvbHMsIHRoZSBndWFyZFxuICogcHJvcGVydGllcywgTm9kZSdzIGluc3BlY3QgaG9vaywgdGhlIGAkYC1tZXRob2RzLCB0aGUgZXhlY3V0b3IncyBhbGxvd2xpc3RlZFxuICogcGFzcy10aHJvdWdocyAoYGF0dGFjaFNjb3BlUmVjb3JkZXJgLCBgbm90aWZ5U3RhZ2VTdGFydGAsIOKApiwgY2FsbGVkIGRpcmVjdGx5XG4gKiBvbiB0aGUgc2NvcGUpIGFuZCB0aGUgSlNPTiBwcm9iZSDigJQgbXVzdCBuZXZlciBiZWNvbWUgdHJhY2tlZCByZWFkcztcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhIHN0YXRlIGtleSBhbmQgaXMgbGVmdCB0byB0aGUgY2FsbGVyLlxuICpcbiAqIFRoZSBwcm9iZTogYEpTT04uc3RyaW5naWZ5YCBhc2tzIEVWRVJZIHZhbHVlIGZvciBhIGB0b0pTT05gIG1ldGhvZC4gVGhhdFxuICogcXVlc3Rpb24gY29tZXMgZnJvbSB0aGUgcnVudGltZSwgbm90IHRoZSBzdGFnZSBhdXRob3IsIHNvIGl0IG11c3Qgbm90IGVudGVyXG4gKiB0aGUgcmVhZCBzZXQuIEEgc3RhdGUga2V5IGxpdGVyYWxseSBjYWxsZWQgJ3RvSlNPTicgaXMgbGVnYWw6IHdoZW4gaXQgRVhJU1RTXG4gKiB0aGlzIGlzIGEgZ2VudWluZSByZWFkIGFuZCBzdGF5cyB0cmFja2VkLCBhbmQgd2hlbiB0aGUgdGFyZ2V0IGNhbm5vdCBhbnN3ZXJcbiAqIHNpbGVudGx5LCB0cnV0aCB3aW5zIG92ZXIgbm9pc2Ug4oCUIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaW50ZXJuYWxSZWFkKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgaWYgKHByb3AgPT09IElTX1RZUEVEX1NDT1BFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHByb3AgPT09IEJSRUFLX1NFVFRFUikge1xuICAgIHJldHVybiAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgIHN0YXRlLmJyZWFrRm4gPSBmbjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICAgIGlmIChwcm9wID09PSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpKSByZXR1cm4gKCkgPT4gdGFyZ2V0LmdldFZhbHVlKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIE1FVEhPRF9ST1VURVNbcHJvcF0/Lih0YXJnZXQsIHN0YXRlKTtcbiAgaWYgKEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMuaGFzKHByb3ApICYmIHR5cGVvZiAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdLmJpbmQodGFyZ2V0KTtcbiAgfVxuICBpZiAocHJvcCA9PT0gJ3RvSlNPTicgJiYgc2lsZW50bHlLbm93bktleSh0YXJnZXQsIHByb3ApID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIFNUQVRFX0tFWTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwYWJsZSBzdGF0ZSB2YWx1ZSBiZWNvbWVzIHRoZSBhcnJheSBvciBuZXN0ZWQgcHJveHkgZm9yIGl0cyBrZXk7XG4gKiBhbnl0aGluZyBlbHNlIGlzIGhhbmRlZCBiYWNrIHJhdy4gYHNjb3BlLmsgPT09IHNjb3BlLmtgIGhvbGRzIHdpdGhpbiBhXG4gKiBzdGFnZSB0aHJvdWdoIHRoZSBzYW1lIHBlci1tZW1iZXIgY2FjaGUgZXZlcnkgb2JqZWN0IHByb3h5IHVzZXNcbiAqIChgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCk6IGEgd3JpdGUgdG8gdGhlIGtleSBkcm9wcyB0aGUgZW50cnkgKHRoZVxuICogc2luayBkb2VzIGl0KSwgYSBjb21taXQgc3dhcHMgdGhlIHZhbHVlIGFuZCB0aGUgcmVmIGNoZWNrIG1pc3NlcyDigJQgZWl0aGVyXG4gKiB3YXkgdGhlIG5leHQgcmVhZCBidWlsZHMgYSBmcmVzaCBwcm94eSBvdmVyIHRoZSBuZXcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHdyYXBTdGF0ZVZhbHVlKFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4gIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7IC8vIERhdGUsIE1hcCwgY2xhc3MgaW5zdGFuY2UsIGZyb3plbiDigKZcbiAgcmV0dXJuIGNhY2hlZE1lbWJlcihcbiAgICBzdGF0ZS5jaGlsZENhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzaW5rID0gcm9vdEtleVNpbmsodGFyZ2V0LCByZWFkU2lsZW50LCBrZXksIHN0YXRlLmNoaWxkQ2FjaGUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIFtdKTtcbiAgICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgW10sIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWVdKSk7XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcbn1cblxuLyoqIFdIWTogYSBgJGAtbmFtZSBjYW4gbmV2ZXIgYmUgYSBzdGF0ZSBrZXkg4oCUIHRoZSB3cml0ZSBpcyByZWZ1c2VkLCBub3Qgc2hhZG93ZWQ7IGV2ZXJ5IG90aGVyIGFzc2lnbm1lbnRcbiAqICBzdG9yZXMgdGhlIHVud3JhcHBlZCB2YWx1ZSAobGFuZG1pbmUgMSkgYW5kIGRyb3BzIHRoZSBrZXkncyBjYWNoZWQgcHJveHkuICovXG5mdW5jdGlvbiBhc3NpZ25TdGF0ZUtleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKGtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke2tleX1cIiAtLSBpdCBjb25mbGljdHMgd2l0aCBhIHJlc2VydmVkIFR5cGVkU2NvcGUgbWV0aG9kLiBSZW5hbWUgdGhlIHN0YXRlIGtleSB0byBhdm9pZCAkLXByZWZpeGVkIG5hbWVzLmAsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc2V0VmFsdWUoa2V5LCB1bndyYXBQcm94eSh2YWx1ZSkpO1xuICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShrZXkpO1xufVxuXG4vKiogRG9lcyB0aGUga2V5IGV4aXN0IOKAlCBhbnN3ZXJlZCB3aXRob3V0IGEgdHJhY2tlZCByZWFkIHdoZXJldmVyIHRoZSB0YXJnZXQgY2FuOyBgZ2V0VmFsdWVgIGlzIHRoZSBsYXN0IHJlc29ydC4gKi9cbmZ1bmN0aW9uIGtub3duS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuaGFzS2V5KSByZXR1cm4gdGFyZ2V0Lmhhc0tleShrZXkpO1xuICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhrZXkpO1xuICByZXR1cm4gdGFyZ2V0LmdldFZhbHVlKGtleSkgIT09IHVuZGVmaW5lZDsgLy8gZmFsbGJhY2s6IGZpcmVzIG9uUmVhZCAoYWNjZXB0YWJsZSBkZWdyYWRhdGlvbilcbn1cblxuLyoqIEV2ZXJ5IHN0YXRlIGtleSDigJQgc2lsZW50bHkgd2hlcmUgdGhlIHRhcmdldCBjYW4sIGVsc2UgZnJvbSBhIHdob2xlLXN0YXRlIHJlYWQuICovXG5mdW5jdGlvbiBzdGF0ZUtleXModGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCk7XG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0LmdldFZhbHVlKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzbmFwc2hvdCAmJiB0eXBlb2Ygc25hcHNob3QgPT09ICdvYmplY3QnID8gT2JqZWN0LmtleXMoc25hcHNob3QpIDogW107XG59XG5cbi8vIC0tIFRvcC1sZXZlbCBwcm94eSAodGhlIG1haW4gVHlwZWRTY29wZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVHlwZWRTY29wZTxUPiBwcm94eSB3cmFwcGluZyBhIFJlYWN0aXZlVGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdW5kZXJseWluZyBzY29wZSAoU2NvcGVGYWNhZGUgb3IgYW55IFJlYWN0aXZlVGFyZ2V0KVxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChicmVha1BpcGVsaW5lIGluamVjdGlvbilcbiAqIEByZXR1cm5zIEEgUHJveHkgd2l0aCB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgYW5kICQtcHJlZml4ZWQgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRpb25zPzogUmVhY3RpdmVPcHRpb25zKTogVHlwZWRTY29wZTxUPiB7XG4gIGNvbnN0IHN0YXRlOiBSZWFjdGl2ZVN0YXRlID0geyBicmVha0ZuOiBvcHRpb25zPy5icmVha1BpcGVsaW5lLCBjaGlsZENhY2hlOiBuZXcgTWVtYmVyQ2FjaGUoKSB9O1xuICAvLyBCaW5kIHRoZSBzaWxlbnQgcmVhZCBvbmNlIOKAlCB0aGUgbmVzdGVkL2FycmF5IHByb3hpZXMgcmVzb2x2ZSB0aGVpciBsaXZlIHZpZXcgdGhyb3VnaCBpdC5cbiAgY29uc3QgcmVhZFNpbGVudCA9ICh0YXJnZXQuZ2V0VmFsdWVTaWxlbnQgPz8gdGFyZ2V0LmdldFZhbHVlKS5iaW5kKHRhcmdldCk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQgYXMgdW5rbm93biBhcyBUeXBlZFNjb3BlPFQ+LCB7XG4gICAgZ2V0KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgY29uc3QgYW5zd2VyZWQgPSBpbnRlcm5hbFJlYWQodGFyZ2V0LCBzdGF0ZSwgcHJvcCk7XG4gICAgICBpZiAoYW5zd2VyZWQgIT09IFNUQVRFX0tFWSkgcmV0dXJuIGFuc3dlcmVkO1xuICAgICAgLy8gQSBzdGF0ZSBrZXk6IE9ORSB0cmFja2VkIHJlYWQgKGZpcmVzIG9uUmVhZCBvbmNlKSwgdGhlbiB0aGUgd3JhcHBlci5cbiAgICAgIHJldHVybiB3cmFwU3RhdGVWYWx1ZSh0YXJnZXQsIHJlYWRTaWxlbnQsIHN0YXRlLCBwcm9wIGFzIHN0cmluZywgdGFyZ2V0LmdldFZhbHVlKHByb3AgYXMgc3RyaW5nKSk7XG4gICAgfSxcbiAgICBzZXQoX3Byb3h5VGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykgYXNzaWduU3RhdGVLZXkodGFyZ2V0LCBzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eShfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgdGFyZ2V0LmRlbGV0ZVZhbHVlKHByb3ApO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhcyhfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApO1xuICAgICAgcmV0dXJuIFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkgfHwga25vd25LZXkodGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxuICAgIG93bktleXM6ICgpID0+IHN0YXRlS2V5cyh0YXJnZXQpLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycgfHwgU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gJC1tZXRob2RzIGFyZSBub24tZW51bWVyYWJsZVxuICAgICAgaWYgKCFrbm93bktleSh0YXJnZXQsIHByb3ApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9OyAvLyB0aGUgdmFsdWUgaXMgZmV0Y2hlZCB2aWEgdGhlIGdldCB0cmFwXG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -11,9 +11,47 @@
|
|
|
11
11
|
* captured object only when the path is gone or no longer holds an object.
|
|
12
12
|
*
|
|
13
13
|
* The READ side of every object proxy lives here — {@link liveObject},
|
|
14
|
-
* {@link liveGetTrap}, {@link liveInspectionTraps}
|
|
14
|
+
* {@link liveGetTrap}, {@link liveInspectionTraps}, and the ONE per-member
|
|
15
|
+
* proxy cache {@link cachedMember} (9.23.2); the WRITE side is
|
|
15
16
|
* `writeTraps.ts`. A factory only wires them (9.23.1).
|
|
16
17
|
*/
|
|
18
|
+
/**
|
|
19
|
+
* A proxy per member NAME under one parent proxy, validated by the raw
|
|
20
|
+
* member's identity. The map is allocated on the FIRST insert: an element
|
|
21
|
+
* proxy over `{ id, n }` reads only primitives and must not pay for one
|
|
22
|
+
* (10,000 of them in the naive re-read loop — measured, `bench/nested-reads.ts`).
|
|
23
|
+
*/
|
|
24
|
+
export declare class MemberCache {
|
|
25
|
+
private entries?;
|
|
26
|
+
/** The proxy cached under `prop`, if it was built over exactly this raw `value`. */
|
|
27
|
+
hit(prop: string, value: object): unknown;
|
|
28
|
+
remember(prop: string, value: object, proxy: unknown): void;
|
|
29
|
+
/** Forget `prop` — a write replaced its value, so the next read must build over the new one. */
|
|
30
|
+
delete(prop: string): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* WHY the cache: `o.arr === o.arr` must hold within a stage, and
|
|
34
|
+
* `for (i < N) s.k.arr[i]` must build ONE array proxy — whose element cache
|
|
35
|
+
* then serves every index — not N (the 9.22.0 perf review, finding 4: the
|
|
36
|
+
* nested get trap built a fresh array proxy, with a fresh empty element
|
|
37
|
+
* cache, on every `.arr`). The top-level scope has cached its child proxies
|
|
38
|
+
* this way since before 9.22.0; this is that leaf, shared by all four.
|
|
39
|
+
*
|
|
40
|
+
* Validated by IDENTITY, invalidated by replacement: every write through a
|
|
41
|
+
* proxy rebuilds the containers on its path (`structuralWrite.setInPath`),
|
|
42
|
+
* so after `s.k.arr[0].n = 1` the raw `arr` is a new array, the ref check
|
|
43
|
+
* misses, and the next read builds a proxy over the NEW value. A hit can
|
|
44
|
+
* never be stale — every proxy reads live (`liveGetTrap`), so the cached one
|
|
45
|
+
* and a fresh one answer the same.
|
|
46
|
+
*
|
|
47
|
+
* Keyed by NAME under THIS parent, never by the raw value alone: a diamond
|
|
48
|
+
* (one array under `k.a` and `k.b`) needs two proxies, each bound to its own
|
|
49
|
+
* path and sink. Only what `build` actually WRAPPED is kept — a member handed
|
|
50
|
+
* back raw (a `Date`, a frozen object, a cycle edge) is not worth an entry.
|
|
51
|
+
* `build` is the caller's stable child step, not a closure made per read: a
|
|
52
|
+
* hit allocates nothing, and a primitive member skips the cache entirely.
|
|
53
|
+
*/
|
|
54
|
+
export declare function cachedMember(cache: MemberCache, prop: string, value: unknown, build: (value: unknown, path: string[]) => unknown, segments: readonly string[]): unknown;
|
|
17
55
|
/** The object at `segments` under the current root, or `raw` when it is gone. */
|
|
18
56
|
export declare function liveObject(raw: Record<string, unknown>, current: unknown): Record<string, unknown>;
|
|
19
57
|
/**
|
|
@@ -21,9 +59,10 @@ export declare function liveObject(raw: Record<string, unknown>, current: unknow
|
|
|
21
59
|
* `constructor`, and the JSON law — serializing a proxied value equals
|
|
22
60
|
* serializing the raw one, `jsonProjection.ts`) must be the same three lines
|
|
23
61
|
* on every object proxy; any other member is handed to `child` with its full
|
|
24
|
-
* path
|
|
62
|
+
* path — through the parent's {@link cachedMember} — and only THAT step
|
|
63
|
+
* differs per factory (the cycle policy).
|
|
25
64
|
*/
|
|
26
|
-
export declare function liveGetTrap(live: () => Record<string, unknown>, segments: readonly string[], child: (value: unknown, path: string[]) => unknown): ProxyHandler<object>['get'];
|
|
65
|
+
export declare function liveGetTrap(live: () => Record<string, unknown>, segments: readonly string[], child: (value: unknown, path: string[]) => unknown, members: MemberCache): ProxyHandler<object>['get'];
|
|
27
66
|
/**
|
|
28
67
|
* The three inspection traps (`in`, `Object.keys`, descriptors) answered from
|
|
29
68
|
* the live object. The one Proxy invariant that could bite — a non-extensible
|
|
@@ -11,10 +11,65 @@
|
|
|
11
11
|
* captured object only when the path is gone or no longer holds an object.
|
|
12
12
|
*
|
|
13
13
|
* The READ side of every object proxy lives here — {@link liveObject},
|
|
14
|
-
* {@link liveGetTrap}, {@link liveInspectionTraps}
|
|
14
|
+
* {@link liveGetTrap}, {@link liveInspectionTraps}, and the ONE per-member
|
|
15
|
+
* proxy cache {@link cachedMember} (9.23.2); the WRITE side is
|
|
15
16
|
* `writeTraps.ts`. A factory only wires them (9.23.1).
|
|
16
17
|
*/
|
|
17
18
|
import { toJSONView } from './jsonProjection.js';
|
|
19
|
+
/**
|
|
20
|
+
* A proxy per member NAME under one parent proxy, validated by the raw
|
|
21
|
+
* member's identity. The map is allocated on the FIRST insert: an element
|
|
22
|
+
* proxy over `{ id, n }` reads only primitives and must not pay for one
|
|
23
|
+
* (10,000 of them in the naive re-read loop — measured, `bench/nested-reads.ts`).
|
|
24
|
+
*/
|
|
25
|
+
export class MemberCache {
|
|
26
|
+
entries;
|
|
27
|
+
/** The proxy cached under `prop`, if it was built over exactly this raw `value`. */
|
|
28
|
+
hit(prop, value) {
|
|
29
|
+
const cached = this.entries?.get(prop);
|
|
30
|
+
return cached !== undefined && cached.ref === value ? cached.proxy : undefined;
|
|
31
|
+
}
|
|
32
|
+
remember(prop, value, proxy) {
|
|
33
|
+
(this.entries ??= new Map()).set(prop, { ref: value, proxy });
|
|
34
|
+
}
|
|
35
|
+
/** Forget `prop` — a write replaced its value, so the next read must build over the new one. */
|
|
36
|
+
delete(prop) {
|
|
37
|
+
this.entries?.delete(prop);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* WHY the cache: `o.arr === o.arr` must hold within a stage, and
|
|
42
|
+
* `for (i < N) s.k.arr[i]` must build ONE array proxy — whose element cache
|
|
43
|
+
* then serves every index — not N (the 9.22.0 perf review, finding 4: the
|
|
44
|
+
* nested get trap built a fresh array proxy, with a fresh empty element
|
|
45
|
+
* cache, on every `.arr`). The top-level scope has cached its child proxies
|
|
46
|
+
* this way since before 9.22.0; this is that leaf, shared by all four.
|
|
47
|
+
*
|
|
48
|
+
* Validated by IDENTITY, invalidated by replacement: every write through a
|
|
49
|
+
* proxy rebuilds the containers on its path (`structuralWrite.setInPath`),
|
|
50
|
+
* so after `s.k.arr[0].n = 1` the raw `arr` is a new array, the ref check
|
|
51
|
+
* misses, and the next read builds a proxy over the NEW value. A hit can
|
|
52
|
+
* never be stale — every proxy reads live (`liveGetTrap`), so the cached one
|
|
53
|
+
* and a fresh one answer the same.
|
|
54
|
+
*
|
|
55
|
+
* Keyed by NAME under THIS parent, never by the raw value alone: a diamond
|
|
56
|
+
* (one array under `k.a` and `k.b`) needs two proxies, each bound to its own
|
|
57
|
+
* path and sink. Only what `build` actually WRAPPED is kept — a member handed
|
|
58
|
+
* back raw (a `Date`, a frozen object, a cycle edge) is not worth an entry.
|
|
59
|
+
* `build` is the caller's stable child step, not a closure made per read: a
|
|
60
|
+
* hit allocates nothing, and a primitive member skips the cache entirely.
|
|
61
|
+
*/
|
|
62
|
+
export function cachedMember(cache, prop, value, build, segments) {
|
|
63
|
+
if (value === null || typeof value !== 'object')
|
|
64
|
+
return build(value, [...segments, prop]);
|
|
65
|
+
const hit = cache.hit(prop, value);
|
|
66
|
+
if (hit !== undefined)
|
|
67
|
+
return hit;
|
|
68
|
+
const proxy = build(value, [...segments, prop]);
|
|
69
|
+
if (proxy !== value)
|
|
70
|
+
cache.remember(prop, value, proxy);
|
|
71
|
+
return proxy;
|
|
72
|
+
}
|
|
18
73
|
/** The object at `segments` under the current root, or `raw` when it is gone. */
|
|
19
74
|
export function liveObject(raw, current) {
|
|
20
75
|
return current !== null && typeof current === 'object' && !Array.isArray(current)
|
|
@@ -26,9 +81,10 @@ export function liveObject(raw, current) {
|
|
|
26
81
|
* `constructor`, and the JSON law — serializing a proxied value equals
|
|
27
82
|
* serializing the raw one, `jsonProjection.ts`) must be the same three lines
|
|
28
83
|
* on every object proxy; any other member is handed to `child` with its full
|
|
29
|
-
* path
|
|
84
|
+
* path — through the parent's {@link cachedMember} — and only THAT step
|
|
85
|
+
* differs per factory (the cycle policy).
|
|
30
86
|
*/
|
|
31
|
-
export function liveGetTrap(live, segments, child) {
|
|
87
|
+
export function liveGetTrap(live, segments, child, members) {
|
|
32
88
|
return (_target, prop) => {
|
|
33
89
|
const raw = live();
|
|
34
90
|
if (typeof prop === 'symbol')
|
|
@@ -39,7 +95,7 @@ export function liveGetTrap(live, segments, child) {
|
|
|
39
95
|
return Object;
|
|
40
96
|
if (prop === 'toJSON')
|
|
41
97
|
return () => toJSONView(raw);
|
|
42
|
-
return
|
|
98
|
+
return cachedMember(members, prop, raw[prop], child, segments);
|
|
43
99
|
};
|
|
44
100
|
}
|
|
45
101
|
/**
|
|
@@ -66,4 +122,4 @@ export function liveInspectionTraps(live) {
|
|
|
66
122
|
},
|
|
67
123
|
};
|
|
68
124
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZVZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL2xpdmVWaWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUE0QixFQUFFLE9BQWdCO0lBQ3ZFLE9BQU8sT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUMvRSxDQUFDLENBQUUsT0FBbUM7UUFDdEMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNWLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixJQUFtQyxFQUNuQyxRQUEyQixFQUMzQixLQUFrRDtJQUVsRCxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQVEsR0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssaUJBQWlCO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDcEUsSUFBSSxJQUFJLEtBQUssYUFBYTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFDLElBQUksSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxJQUFrQjtJQUVsQixPQUFPO1FBQ0wsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJO1lBQ2QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELE9BQU8sQ0FBQyxNQUFNO1lBQ1osT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0Qsd0JBQXdCLENBQUMsTUFBTSxFQUFFLElBQUk7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUFFLE9BQU8sTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakUsT0FBTyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3JHLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvbGl2ZVZpZXcg4oCUIHdoYXQgYSBwcm94eSBzdGFuZHMgZm9yLCBBUyBJVCBTVEFORFMgTk9XLlxuICpcbiAqIEV2ZXJ5IHdyaXRlIHRocm91Z2ggdGhlIHR5cGVkIHNjb3BlIHJlYnVpbGRzIHRoZSByb290IGltbXV0YWJseVxuICogKGBzdHJ1Y3R1cmFsV3JpdGUuc2V0SW5QYXRoYCwgYSBmcmVzaCBtZXJnZSksIHNvIHRoZSBvYmplY3QgYSBwcm94eSB3YXNcbiAqIGNyZWF0ZWQgb3ZlciBpcyB0aGUgUFJFLXdyaXRlIHZhbHVlIGZvciBldmVyIGFmdGVyLiBBIGhlbGQgcHJveHkgdGhhdCByZWFkXG4gKiBmcm9tIGl0IHNhdyBpdHMgb3duIHdyaXRlcyB2YW5pc2g6IGBvLnggKz0gMWAgdHdpY2UgZ2F2ZSAyLCBgby5iID0gby5hICogMTBgXG4gKiB1c2VkIHRoZSBvbGQgYGFgLCBgJ3gnIGluIG9gIHdhcyBmYWxzZSByaWdodCBhZnRlciBgby54ID0gMWAgKDkuMjIuMCDigJQgZmlyc3RcbiAqIGZvdW5kIG9uIGVsZW1lbnQgcHJveGllcywgdGhlbiB0aGUgc2FtZSByb290IG9uIG5lc3RlZCBhbmQgdGVybWluYWwgb25lcykuXG4gKiBTbyBldmVyeSByZWFkIHRyYXAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgQ1VSUkVOVCB2YWx1ZSBhbmQgZmFsbHMgYmFjayB0byB0aGVcbiAqIGNhcHR1cmVkIG9iamVjdCBvbmx5IHdoZW4gdGhlIHBhdGggaXMgZ29uZSBvciBubyBsb25nZXIgaG9sZHMgYW4gb2JqZWN0LlxuICpcbiAqIFRoZSBSRUFEIHNpZGUgb2YgZXZlcnkgb2JqZWN0IHByb3h5IGxpdmVzIGhlcmUg4oCUIHtAbGluayBsaXZlT2JqZWN0fSxcbiAqIHtAbGluayBsaXZlR2V0VHJhcH0sIHtAbGluayBsaXZlSW5zcGVjdGlvblRyYXBzfTsgdGhlIFdSSVRFIHNpZGUgaXNcbiAqIGB3cml0ZVRyYXBzLnRzYC4gQSBmYWN0b3J5IG9ubHkgd2lyZXMgdGhlbSAoOS4yMy4xKS5cbiAqL1xuXG5pbXBvcnQgeyB0b0pTT05WaWV3IH0gZnJvbSAnLi9qc29uUHJvamVjdGlvbi5qcyc7XG5cbi8qKiBUaGUgb2JqZWN0IGF0IGBzZWdtZW50c2AgdW5kZXIgdGhlIGN1cnJlbnQgcm9vdCwgb3IgYHJhd2Agd2hlbiBpdCBpcyBnb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVPYmplY3QocmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgY3VycmVudDogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIGN1cnJlbnQgIT09IG51bGwgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGN1cnJlbnQpXG4gICAgPyAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA6IHJhdztcbn1cblxuLyoqXG4gKiBXSFkgb25lIGdldCB0cmFwOiB0aGUgbmFtZXMgYSBwcm94eSBhbnN3ZXJzIElUU0VMRiAocHJvbWlzZS9tYXRjaGVyIGd1YXJkcyxcbiAqIGBjb25zdHJ1Y3RvcmAsIGFuZCB0aGUgSlNPTiBsYXcg4oCUIHNlcmlhbGl6aW5nIGEgcHJveGllZCB2YWx1ZSBlcXVhbHNcbiAqIHNlcmlhbGl6aW5nIHRoZSByYXcgb25lLCBganNvblByb2plY3Rpb24udHNgKSBtdXN0IGJlIHRoZSBzYW1lIHRocmVlIGxpbmVzXG4gKiBvbiBldmVyeSBvYmplY3QgcHJveHk7IGFueSBvdGhlciBtZW1iZXIgaXMgaGFuZGVkIHRvIGBjaGlsZGAgd2l0aCBpdHMgZnVsbFxuICogcGF0aCwgYW5kIG9ubHkgVEhBVCBzdGVwIGRpZmZlcnMgcGVyIGZhY3RvcnkgKHRoZSBjeWNsZSBwb2xpY3kpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl2ZUdldFRyYXAoXG4gIGxpdmU6ICgpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGNoaWxkOiAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKSA9PiB1bmtub3duLFxuKTogUHJveHlIYW5kbGVyPG9iamVjdD5bJ2dldCddIHtcbiAgcmV0dXJuIChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgY29uc3QgcmF3ID0gbGl2ZSgpO1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiAocmF3IGFzIGFueSlbcHJvcF07XG4gICAgaWYgKHByb3AgPT09ICd0aGVuJyB8fCBwcm9wID09PSAnYXN5bW1ldHJpY01hdGNoJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuIE9iamVjdDtcbiAgICBpZiAocHJvcCA9PT0gJ3RvSlNPTicpIHJldHVybiAoKSA9PiB0b0pTT05WaWV3KHJhdyk7XG4gICAgcmV0dXJuIGNoaWxkKHJhd1twcm9wXSwgWy4uLnNlZ21lbnRzLCBwcm9wXSk7XG4gIH07XG59XG5cbi8qKlxuICogVGhlIHRocmVlIGluc3BlY3Rpb24gdHJhcHMgKGBpbmAsIGBPYmplY3Qua2V5c2AsIGRlc2NyaXB0b3JzKSBhbnN3ZXJlZCBmcm9tXG4gKiB0aGUgbGl2ZSBvYmplY3QuIFRoZSBvbmUgUHJveHkgaW52YXJpYW50IHRoYXQgY291bGQgYml0ZSDigJQgYSBub24tZXh0ZW5zaWJsZVxuICogdGFyZ2V0IG11c3QgcmVwb3J0IGV4YWN0bHkgaXRzIG93biBrZXlzLCBhbmQgYSBwcm9wZXJ0eSB0aGUgdGFyZ2V0IGxhY2tzXG4gKiBtdXN0IGJlIHJlcG9ydGVkIGNvbmZpZ3VyYWJsZSDigJQgaXMgaG9ub3VyZWQ6IHRoZSBhbGxvd2xpc3QgYWxyZWFkeSByZWZ1c2VzXG4gKiBmcm96ZW4gYW5kIHNlYWxlZCB2YWx1ZXMsIHNvIHRoZSBgcHJldmVudEV4dGVuc2lvbnNgLW9ubHkgY29ybmVyIGFuc3dlcnNcbiAqIGZyb20gdGhlIHRhcmdldCwgYW5kIGEgbGl2ZSBkZXNjcmlwdG9yIGlzIGFsd2F5cyByZXBvcnRlZCBjb25maWd1cmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXZlSW5zcGVjdGlvblRyYXBzKFxuICBsaXZlOiAoKSA9PiBvYmplY3QsXG4pOiBQaWNrPFByb3h5SGFuZGxlcjxvYmplY3Q+LCAnaGFzJyB8ICdvd25LZXlzJyB8ICdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InPiB7XG4gIHJldHVybiB7XG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKE9iamVjdC5pc0V4dGVuc2libGUodGFyZ2V0KSA/IGxpdmUoKSA6IHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbiAgICBvd25LZXlzKHRhcmdldCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuaXNFeHRlbnNpYmxlKHRhcmdldCkgPyBsaXZlKCkgOiB0YXJnZXQpO1xuICAgIH0sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKHRhcmdldCkpIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCk7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihsaXZlKCksIHByb3ApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlID8geyAuLi5kZXNjcmlwdG9yLCBjb25maWd1cmFibGU6IHRydWUgfSA6IGRlc2NyaXB0b3I7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZVZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL2xpdmVWaWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDZCxPQUFPLENBQWdEO0lBRS9ELG9GQUFvRjtJQUNwRixHQUFHLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDakYsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEtBQWM7UUFDbEQsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsTUFBTSxDQUFDLElBQVk7UUFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEtBQWtCLEVBQ2xCLElBQVksRUFDWixLQUFjLEVBQ2QsS0FBa0QsRUFDbEQsUUFBMkI7SUFFM0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxL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RUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDckcsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9saXZlVmlldyDigJQgd2hhdCBhIHByb3h5IHN0YW5kcyBmb3IsIEFTIElUIFNUQU5EUyBOT1cuXG4gKlxuICogRXZlcnkgd3JpdGUgdGhyb3VnaCB0aGUgdHlwZWQgc2NvcGUgcmVidWlsZHMgdGhlIHJvb3QgaW1tdXRhYmx5XG4gKiAoYHN0cnVjdHVyYWxXcml0ZS5zZXRJblBhdGhgLCBhIGZyZXNoIG1lcmdlKSwgc28gdGhlIG9iamVjdCBhIHByb3h5IHdhc1xuICogY3JlYXRlZCBvdmVyIGlzIHRoZSBQUkUtd3JpdGUgdmFsdWUgZm9yIGV2ZXIgYWZ0ZXIuIEEgaGVsZCBwcm94eSB0aGF0IHJlYWRcbiAqIGZyb20gaXQgc2F3IGl0cyBvd24gd3JpdGVzIHZhbmlzaDogYG8ueCArPSAxYCB0d2ljZSBnYXZlIDIsIGBvLmIgPSBvLmEgKiAxMGBcbiAqIHVzZWQgdGhlIG9sZCBgYWAsIGAneCcgaW4gb2Agd2FzIGZhbHNlIHJpZ2h0IGFmdGVyIGBvLnggPSAxYCAoOS4yMi4wIOKAlCBmaXJzdFxuICogZm91bmQgb24gZWxlbWVudCBwcm94aWVzLCB0aGVuIHRoZSBzYW1lIHJvb3Qgb24gbmVzdGVkIGFuZCB0ZXJtaW5hbCBvbmVzKS5cbiAqIFNvIGV2ZXJ5IHJlYWQgdHJhcCByZXNvbHZlcyB0aHJvdWdoIHRoZSBDVVJSRU5UIHZhbHVlIGFuZCBmYWxscyBiYWNrIHRvIHRoZVxuICogY2FwdHVyZWQgb2JqZWN0IG9ubHkgd2hlbiB0aGUgcGF0aCBpcyBnb25lIG9yIG5vIGxvbmdlciBob2xkcyBhbiBvYmplY3QuXG4gKlxuICogVGhlIFJFQUQgc2lkZSBvZiBldmVyeSBvYmplY3QgcHJveHkgbGl2ZXMgaGVyZSDigJQge0BsaW5rIGxpdmVPYmplY3R9LFxuICoge0BsaW5rIGxpdmVHZXRUcmFwfSwge0BsaW5rIGxpdmVJbnNwZWN0aW9uVHJhcHN9LCBhbmQgdGhlIE9ORSBwZXItbWVtYmVyXG4gKiBwcm94eSBjYWNoZSB7QGxpbmsgY2FjaGVkTWVtYmVyfSAoOS4yMy4yKTsgdGhlIFdSSVRFIHNpZGUgaXNcbiAqIGB3cml0ZVRyYXBzLnRzYC4gQSBmYWN0b3J5IG9ubHkgd2lyZXMgdGhlbSAoOS4yMy4xKS5cbiAqL1xuXG5pbXBvcnQgeyB0b0pTT05WaWV3IH0gZnJvbSAnLi9qc29uUHJvamVjdGlvbi5qcyc7XG5cbi8qKlxuICogQSBwcm94eSBwZXIgbWVtYmVyIE5BTUUgdW5kZXIgb25lIHBhcmVudCBwcm94eSwgdmFsaWRhdGVkIGJ5IHRoZSByYXdcbiAqIG1lbWJlcidzIGlkZW50aXR5LiBUaGUgbWFwIGlzIGFsbG9jYXRlZCBvbiB0aGUgRklSU1QgaW5zZXJ0OiBhbiBlbGVtZW50XG4gKiBwcm94eSBvdmVyIGB7IGlkLCBuIH1gIHJlYWRzIG9ubHkgcHJpbWl0aXZlcyBhbmQgbXVzdCBub3QgcGF5IGZvciBvbmVcbiAqICgxMCwwMDAgb2YgdGhlbSBpbiB0aGUgbmFpdmUgcmUtcmVhZCBsb29wIOKAlCBtZWFzdXJlZCwgYGJlbmNoL25lc3RlZC1yZWFkcy50c2ApLlxuICovXG5leHBvcnQgY2xhc3MgTWVtYmVyQ2FjaGUge1xuICBwcml2YXRlIGVudHJpZXM/OiBNYXA8c3RyaW5nLCB7IHJlZjogb2JqZWN0OyBwcm94eTogdW5rbm93biB9PjtcblxuICAvKiogVGhlIHByb3h5IGNhY2hlZCB1bmRlciBgcHJvcGAsIGlmIGl0IHdhcyBidWlsdCBvdmVyIGV4YWN0bHkgdGhpcyByYXcgYHZhbHVlYC4gKi9cbiAgaGl0KHByb3A6IHN0cmluZywgdmFsdWU6IG9iamVjdCk6IHVua25vd24ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZW50cmllcz8uZ2V0KHByb3ApO1xuICAgIHJldHVybiBjYWNoZWQgIT09IHVuZGVmaW5lZCAmJiBjYWNoZWQucmVmID09PSB2YWx1ZSA/IGNhY2hlZC5wcm94eSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlbWVtYmVyKHByb3A6IHN0cmluZywgdmFsdWU6IG9iamVjdCwgcHJveHk6IHVua25vd24pOiB2b2lkIHtcbiAgICAodGhpcy5lbnRyaWVzID8/PSBuZXcgTWFwKCkpLnNldChwcm9wLCB7IHJlZjogdmFsdWUsIHByb3h5IH0pO1xuICB9XG5cbiAgLyoqIEZvcmdldCBgcHJvcGAg4oCUIGEgd3JpdGUgcmVwbGFjZWQgaXRzIHZhbHVlLCBzbyB0aGUgbmV4dCByZWFkIG11c3QgYnVpbGQgb3ZlciB0aGUgbmV3IG9uZS4gKi9cbiAgZGVsZXRlKHByb3A6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcz8uZGVsZXRlKHByb3ApO1xuICB9XG59XG5cbi8qKlxuICogV0hZIHRoZSBjYWNoZTogYG8uYXJyID09PSBvLmFycmAgbXVzdCBob2xkIHdpdGhpbiBhIHN0YWdlLCBhbmRcbiAqIGBmb3IgKGkgPCBOKSBzLmsuYXJyW2ldYCBtdXN0IGJ1aWxkIE9ORSBhcnJheSBwcm94eSDigJQgd2hvc2UgZWxlbWVudCBjYWNoZVxuICogdGhlbiBzZXJ2ZXMgZXZlcnkgaW5kZXgg4oCUIG5vdCBOICh0aGUgOS4yMi4wIHBlcmYgcmV2aWV3LCBmaW5kaW5nIDQ6IHRoZVxuICogbmVzdGVkIGdldCB0cmFwIGJ1aWx0IGEgZnJlc2ggYXJyYXkgcHJveHksIHdpdGggYSBmcmVzaCBlbXB0eSBlbGVtZW50XG4gKiBjYWNoZSwgb24gZXZlcnkgYC5hcnJgKS4gVGhlIHRvcC1sZXZlbCBzY29wZSBoYXMgY2FjaGVkIGl0cyBjaGlsZCBwcm94aWVzXG4gKiB0aGlzIHdheSBzaW5jZSBiZWZvcmUgOS4yMi4wOyB0aGlzIGlzIHRoYXQgbGVhZiwgc2hhcmVkIGJ5IGFsbCBmb3VyLlxuICpcbiAqIFZhbGlkYXRlZCBieSBJREVOVElUWSwgaW52YWxpZGF0ZWQgYnkgcmVwbGFjZW1lbnQ6IGV2ZXJ5IHdyaXRlIHRocm91Z2ggYVxuICogcHJveHkgcmVidWlsZHMgdGhlIGNvbnRhaW5lcnMgb24gaXRzIHBhdGggKGBzdHJ1Y3R1cmFsV3JpdGUuc2V0SW5QYXRoYCksXG4gKiBzbyBhZnRlciBgcy5rLmFyclswXS5uID0gMWAgdGhlIHJhdyBgYXJyYCBpcyBhIG5ldyBhcnJheSwgdGhlIHJlZiBjaGVja1xuICogbWlzc2VzLCBhbmQgdGhlIG5leHQgcmVhZCBidWlsZHMgYSBwcm94eSBvdmVyIHRoZSBORVcgdmFsdWUuIEEgaGl0IGNhblxuICogbmV2ZXIgYmUgc3RhbGUg4oCUIGV2ZXJ5IHByb3h5IHJlYWRzIGxpdmUgKGBsaXZlR2V0VHJhcGApLCBzbyB0aGUgY2FjaGVkIG9uZVxuICogYW5kIGEgZnJlc2ggb25lIGFuc3dlciB0aGUgc2FtZS5cbiAqXG4gKiBLZXllZCBieSBOQU1FIHVuZGVyIFRISVMgcGFyZW50LCBuZXZlciBieSB0aGUgcmF3IHZhbHVlIGFsb25lOiBhIGRpYW1vbmRcbiAqIChvbmUgYXJyYXkgdW5kZXIgYGsuYWAgYW5kIGBrLmJgKSBuZWVkcyB0d28gcHJveGllcywgZWFjaCBib3VuZCB0byBpdHMgb3duXG4gKiBwYXRoIGFuZCBzaW5rLiBPbmx5IHdoYXQgYGJ1aWxkYCBhY3R1YWxseSBXUkFQUEVEIGlzIGtlcHQg4oCUIGEgbWVtYmVyIGhhbmRlZFxuICogYmFjayByYXcgKGEgYERhdGVgLCBhIGZyb3plbiBvYmplY3QsIGEgY3ljbGUgZWRnZSkgaXMgbm90IHdvcnRoIGFuIGVudHJ5LlxuICogYGJ1aWxkYCBpcyB0aGUgY2FsbGVyJ3Mgc3RhYmxlIGNoaWxkIHN0ZXAsIG5vdCBhIGNsb3N1cmUgbWFkZSBwZXIgcmVhZDogYVxuICogaGl0IGFsbG9jYXRlcyBub3RoaW5nLCBhbmQgYSBwcmltaXRpdmUgbWVtYmVyIHNraXBzIHRoZSBjYWNoZSBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlZE1lbWJlcihcbiAgY2FjaGU6IE1lbWJlckNhY2hlLFxuICBwcm9wOiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duLFxuICBidWlsZDogKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSkgPT4gdW5rbm93bixcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gYnVpbGQodmFsdWUsIFsuLi5zZWdtZW50cywgcHJvcF0pO1xuICBjb25zdCBoaXQgPSBjYWNoZS5oaXQocHJvcCwgdmFsdWUpO1xuICBpZiAoaGl0ICE9PSB1bmRlZmluZWQpIHJldHVybiBoaXQ7XG4gIGNvbnN0IHByb3h5ID0gYnVpbGQodmFsdWUsIFsuLi5zZWdtZW50cywgcHJvcF0pO1xuICBpZiAocHJveHkgIT09IHZhbHVlKSBjYWNoZS5yZW1lbWJlcihwcm9wLCB2YWx1ZSwgcHJveHkpO1xuICByZXR1cm4gcHJveHk7XG59XG5cbi8qKiBUaGUgb2JqZWN0IGF0IGBzZWdtZW50c2AgdW5kZXIgdGhlIGN1cnJlbnQgcm9vdCwgb3IgYHJhd2Agd2hlbiBpdCBpcyBnb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVPYmplY3QocmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgY3VycmVudDogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIGN1cnJlbnQgIT09IG51bGwgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGN1cnJlbnQpXG4gICAgPyAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA6IHJhdztcbn1cblxuLyoqXG4gKiBXSFkgb25lIGdldCB0cmFwOiB0aGUgbmFtZXMgYSBwcm94eSBhbnN3ZXJzIElUU0VMRiAocHJvbWlzZS9tYXRjaGVyIGd1YXJkcyxcbiAqIGBjb25zdHJ1Y3RvcmAsIGFuZCB0aGUgSlNPTiBsYXcg4oCUIHNlcmlhbGl6aW5nIGEgcHJveGllZCB2YWx1ZSBlcXVhbHNcbiAqIHNlcmlhbGl6aW5nIHRoZSByYXcgb25lLCBganNvblByb2plY3Rpb24udHNgKSBtdXN0IGJlIHRoZSBzYW1lIHRocmVlIGxpbmVzXG4gKiBvbiBldmVyeSBvYmplY3QgcHJveHk7IGFueSBvdGhlciBtZW1iZXIgaXMgaGFuZGVkIHRvIGBjaGlsZGAgd2l0aCBpdHMgZnVsbFxuICogcGF0aCDigJQgdGhyb3VnaCB0aGUgcGFyZW50J3Mge0BsaW5rIGNhY2hlZE1lbWJlcn0g4oCUIGFuZCBvbmx5IFRIQVQgc3RlcFxuICogZGlmZmVycyBwZXIgZmFjdG9yeSAodGhlIGN5Y2xlIHBvbGljeSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXZlR2V0VHJhcChcbiAgbGl2ZTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgY2hpbGQ6ICh2YWx1ZTogdW5rbm93biwgcGF0aDogc3RyaW5nW10pID0+IHVua25vd24sXG4gIG1lbWJlcnM6IE1lbWJlckNhY2hlLFxuKTogUHJveHlIYW5kbGVyPG9iamVjdD5bJ2dldCddIHtcbiAgcmV0dXJuIChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgY29uc3QgcmF3ID0gbGl2ZSgpO1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiAocmF3IGFzIGFueSlbcHJvcF07XG4gICAgaWYgKHByb3AgPT09ICd0aGVuJyB8fCBwcm9wID09PSAnYXN5bW1ldHJpY01hdGNoJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuIE9iamVjdDtcbiAgICBpZiAocHJvcCA9PT0gJ3RvSlNPTicpIHJldHVybiAoKSA9PiB0b0pTT05WaWV3KHJhdyk7XG4gICAgcmV0dXJuIGNhY2hlZE1lbWJlcihtZW1iZXJzLCBwcm9wLCByYXdbcHJvcF0sIGNoaWxkLCBzZWdtZW50cyk7XG4gIH07XG59XG5cbi8qKlxuICogVGhlIHRocmVlIGluc3BlY3Rpb24gdHJhcHMgKGBpbmAsIGBPYmplY3Qua2V5c2AsIGRlc2NyaXB0b3JzKSBhbnN3ZXJlZCBmcm9tXG4gKiB0aGUgbGl2ZSBvYmplY3QuIFRoZSBvbmUgUHJveHkgaW52YXJpYW50IHRoYXQgY291bGQgYml0ZSDigJQgYSBub24tZXh0ZW5zaWJsZVxuICogdGFyZ2V0IG11c3QgcmVwb3J0IGV4YWN0bHkgaXRzIG93biBrZXlzLCBhbmQgYSBwcm9wZXJ0eSB0aGUgdGFyZ2V0IGxhY2tzXG4gKiBtdXN0IGJlIHJlcG9ydGVkIGNvbmZpZ3VyYWJsZSDigJQgaXMgaG9ub3VyZWQ6IHRoZSBhbGxvd2xpc3QgYWxyZWFkeSByZWZ1c2VzXG4gKiBmcm96ZW4gYW5kIHNlYWxlZCB2YWx1ZXMsIHNvIHRoZSBgcHJldmVudEV4dGVuc2lvbnNgLW9ubHkgY29ybmVyIGFuc3dlcnNcbiAqIGZyb20gdGhlIHRhcmdldCwgYW5kIGEgbGl2ZSBkZXNjcmlwdG9yIGlzIGFsd2F5cyByZXBvcnRlZCBjb25maWd1cmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXZlSW5zcGVjdGlvblRyYXBzKFxuICBsaXZlOiAoKSA9PiBvYmplY3QsXG4pOiBQaWNrPFByb3h5SGFuZGxlcjxvYmplY3Q+LCAnaGFzJyB8ICdvd25LZXlzJyB8ICdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InPiB7XG4gIHJldHVybiB7XG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKE9iamVjdC5pc0V4dGVuc2libGUodGFyZ2V0KSA/IGxpdmUoKSA6IHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbiAgICBvd25LZXlzKHRhcmdldCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuaXNFeHRlbnNpYmxlKHRhcmdldCkgPyBsaXZlKCkgOiB0YXJnZXQpO1xuICAgIH0sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKHRhcmdldCkpIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCk7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihsaXZlKCksIHByb3ApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlID8geyAuLi5kZXNjcmlwdG9yLCBjb25maWd1cmFibGU6IHRydWUgfSA6IGRlc2NyaXB0b3I7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|