footprintjs 10.4.0 → 10.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -25
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/historyData.d.ts +6 -2
- package/dist/esm/lib/capture/historyData.js +18 -1
- package/dist/esm/lib/capture/historyNote.d.ts +2 -2
- package/dist/esm/lib/capture/historyNote.js +11 -6
- package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
- package/dist/esm/lib/capture/historyTypes.js +1 -1
- package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
- package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
- package/dist/esm/lib/capture/readSources.d.ts +20 -3
- package/dist/esm/lib/capture/readSources.js +41 -12
- package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
- package/dist/esm/lib/capture/sinkSettlement.js +10 -0
- package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
- package/dist/esm/lib/capture/sourceOwnership.js +133 -0
- package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
- package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
- package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
- package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
- package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
- package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
- package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +7 -0
- package/dist/esm/lib/capture/storedReadSourceCounts.js +82 -0
- package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
- package/dist/esm/lib/capture/storedReadSources.js +120 -0
- package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
- package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
- package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
- package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
- package/dist/esm/lib/engine/types.d.ts +2 -1
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +4 -0
- package/dist/esm/lib/memory/StageContext.js +40 -7
- package/dist/esm/lib/memory/frameTypes.d.ts +5 -0
- package/dist/esm/lib/memory/frameTypes.js +1 -1
- package/dist/esm/lib/memory/logAddress.d.ts +3 -0
- package/dist/esm/lib/memory/logAddress.js +7 -0
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
- package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
- package/dist/esm/lib/runner/captureHistory.js +16 -10
- package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
- package/dist/esm/lib/runner/readStoredCapture.js +3 -3
- package/dist/esm/lib/runner/recordSink.js +2 -10
- package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
- package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
- package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
- package/dist/esm/lib/sinks/indexedIO.js +96 -0
- package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
- package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
- package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
- package/dist/esm/lib/sinks/indexedScan.js +73 -0
- package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
- package/dist/esm/lib/sinks/indexedTypes.js +2 -0
- package/dist/esm/sinks.d.ts +2 -0
- package/dist/esm/sinks.js +2 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/historyData.js +21 -2
- package/dist/lib/capture/historyNote.js +9 -4
- package/dist/lib/capture/historyTypes.js +1 -1
- package/dist/lib/capture/nativeSourceAddress.js +19 -0
- package/dist/lib/capture/readSources.js +44 -13
- package/dist/lib/capture/sinkSettlement.js +14 -0
- package/dist/lib/capture/sourceOwnership.js +138 -0
- package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
- package/dist/lib/capture/sourceReadCounts.js +31 -0
- package/dist/lib/capture/sourceReferenceBudget.js +25 -0
- package/dist/lib/capture/storedReadSourceCounts.js +86 -0
- package/dist/lib/capture/storedReadSources.js +124 -0
- package/dist/lib/capture/storedSourceOwnership.js +104 -0
- package/dist/lib/engine/handlers/StageRunner.js +2 -1
- package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
- package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +40 -7
- package/dist/lib/memory/frameTypes.js +1 -1
- package/dist/lib/memory/logAddress.js +11 -0
- package/dist/lib/runner/ExecutionRuntime.js +65 -8
- package/dist/lib/runner/FlowChartExecutor.js +4 -2
- package/dist/lib/runner/captureHistory.js +15 -9
- package/dist/lib/runner/readStoredCapture.js +2 -2
- package/dist/lib/runner/recordSink.js +6 -14
- package/dist/lib/runner/storedCaptureAdmission.js +9 -7
- package/dist/lib/scope/ScopeFacade.js +2 -2
- package/dist/lib/sinks/indexedAdmission.js +85 -0
- package/dist/lib/sinks/indexedIO.js +106 -0
- package/dist/lib/sinks/indexedRecordFile.js +124 -0
- package/dist/lib/sinks/indexedScan.js +77 -0
- package/dist/lib/sinks/indexedTypes.js +3 -0
- package/dist/sinks.js +4 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/capture/historyData.d.ts +6 -2
- package/dist/types/lib/capture/historyNote.d.ts +2 -2
- package/dist/types/lib/capture/historyTypes.d.ts +1 -1
- package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
- package/dist/types/lib/capture/readSources.d.ts +20 -3
- package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
- package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
- package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
- package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
- package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
- package/dist/types/lib/capture/storedReadSourceCounts.d.ts +7 -0
- package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
- package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
- package/dist/types/lib/engine/types.d.ts +2 -1
- package/dist/types/lib/memory/StageContext.d.ts +4 -0
- package/dist/types/lib/memory/frameTypes.d.ts +5 -0
- package/dist/types/lib/memory/logAddress.d.ts +3 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
- package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
- package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
- package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
- package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
- package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
- package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
- package/dist/types/sinks.d.ts +2 -0
- package/package.json +1 -1
|
@@ -148,7 +148,9 @@ export class FlowChartExecutor {
|
|
|
148
148
|
}, this._currentRunId
|
|
149
149
|
? {
|
|
150
150
|
runId: this._currentRunId,
|
|
151
|
-
|
|
151
|
+
// This new heap/log owns only the resumed segment. The restored state is its base;
|
|
152
|
+
// its earlier writer/occurrences are not in this log.
|
|
153
|
+
...(overrides?.resume && { historyOmitted: true }),
|
|
152
154
|
}
|
|
153
155
|
: undefined);
|
|
154
156
|
}
|
|
@@ -873,4 +875,4 @@ function disposeOnThrow(armed, build) {
|
|
|
873
875
|
throw error;
|
|
874
876
|
}
|
|
875
877
|
}
|
|
876
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxrQkFBa0IsSUFBSSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBS3BILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRTdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQy9FLE9BQU8sRUFRTCxhQUFhLEdBQ2QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQStCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQTRCLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFpQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEQsT0FBTyxFQUF3QixnQkFBZ0IsRUFBRSxNQUFN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QUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5IH0pO1xuICpcbiAqICAgLy8gMi1wYXJhbSBmb3JtIChhY2NlcHRzIGEgU2NvcGVGYWN0b3J5IGRpcmVjdGx5LCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBteUZhY3RvcnkpO1xuICpcbiAqXG4gKiBUaGUgZXhlY3V0b3IgY29tcG9zZXMgZm91ciBtb2R1bGVzLCBvbmUgam9iIGVhY2ggKEY5KTogYGF0dGFjaC50c2AgKHdob1xuICogb2JzZXJ2ZXMgYSBydW4pLCBgcmVzdW1lLnRzYCAocGxhbiBhbmQgYW5ub3VuY2UgYSByZS1lbnRyeSksIGBjaGVja3BvaW50LnRzYFxuICogKHRoZSBwYXVzZSBjaGVja3BvaW50KSwgYHNuYXBzaG90LnRzYCAod2hhdCBgZ2V0U25hcHNob3QoKWAgc2VydmVzKS4gV2hhdFxuICogc3RheXMgaGVyZSBpcyB0aGUgcGVyLXJ1biBzdGF0ZSBhbmQgdGhlIHJ1biBsaWZlY3ljbGUgdGhhdCB0aHJlYWRzIGl0LlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTG9nT3V0Y29tZSwgTWV0YSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGFkbWl0UnVuRW52IH0gZnJvbSAnLi4vYXR0ZW1wdC9jb3JyZWxhdGlvbi5qcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxlZCB9IGZyb20gJy4uL2F0dGVtcHQvZGVhZGxpbmUuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHsgd2FybkRlYWRsaW5lVW5kZXJCdWRnZXQgfSBmcm9tICcuLi9idWRnZXQvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IGRldGFjaEFuZEZvcmdldCBhcyBfZGV0YWNoQW5kRm9yZ2V0LCBkZXRhY2hBbmRKb2luTGF0ZXIgYXMgX2RldGFjaEFuZEpvaW5MYXRlciB9IGZyb20gJy4uL2RldGFjaC9zcGF3bi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIFBhdXNlZFJlc3VsdCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIGRlZmF1bHRMb2dnZXIsXG59IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFRlcm1pbmFsRmFpbHVyZUNvbnRleHQsIE5hdGl2ZUZhaWx1cmVTdGF0ZSB9IGZyb20gJy4uL2Vycm9ycy90ZXJtaW5hbEZhaWx1cmUuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4uL21lbW9yeS9mcmFtZVR5cGVzLmpzJztcbmltcG9ydCB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IHJ1blBvbGljeSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRDaGVja3BvaW50LCBSZWRhY3Rpb25NYXJrcyB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBSdW5PYnNlcnZlcnMgfSBmcm9tICcuL2F0dGFjaC5qcyc7XG5pbXBvcnQgeyB0eXBlIENhcHR1cmVIaXN0b3J5TGVhc2UsIHBlcnNpc3RDYXB0dXJlSGlzdG9yeSB9IGZyb20gJy4vY2FwdHVyZUhpc3RvcnkuanMnO1xuaW1wb3J0IHsgYnVpbGRQYXVzZUNoZWNrcG9pbnQgfSBmcm9tICcuL2NoZWNrcG9pbnQuanMnO1xuaW1wb3J0IHsgdHlwZSBBcm1lZFJ1biwgYXJtUnVuIH0gZnJvbSAnLi9kZWFkbGluZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGFjaFJlY29yZGVyT3B0aW9ucywgT2JzZXJ2ZXJEcmFpblJlc3VsdCB9IGZyb20gJy4vRGVmZXJyZWRPYnNlcnZlclRpZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBSdW50aW1lU25hcHNob3QsIEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgdHlwZSBFeGVjdXRvckFyZ3MsIHR5cGUgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLCByZXNvbHZlRXhlY3V0b3JBcmdzIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IHR5cGUgUmVjb3JkRmx1c2hSZXN1bHQsIFJ1blJlY29yZCB9IGZyb20gJy4vcmVjb3JkU2luay5qcyc7XG5pbXBvcnQgeyBhbm5vdW5jZVJlc3VtZSwgcGxhblJlc3VtZSwgc2VlZENvdW50ZXJzIH0gZnJvbSAnLi9yZXN1bWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSdW5JZCB9IGZyb20gJy4vcnVuSWQuanMnO1xuaW1wb3J0IHsgc2VydmVkU25hcHNob3QgfSBmcm9tICcuL3NuYXBzaG90LmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5wdXQgfSBmcm9tICcuL3ZhbGlkYXRlSW5wdXQuanMnO1xuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciBhbmQgcGVyLXN0YWdlIHZpc2l0IGNvdW50cyAobG9vcEl0ZXJhdGlvbikg4oCUIHNoYXJlZCBCWVxuICAgKiAgUkVGRVJFTkNFIHdpdGggZXZlcnkgdHJhdmVyc2VyIG9mIHRoZSBydW47IHN1cnZpdmUgcGF1c2UvcmVzdW1lLCByZXNldCBvbiBydW4oKS4gKi9cbiAgcHJpdmF0ZSBfZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTtcbiAgcHJpdmF0ZSBfdmlzaXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogRnJlc2ggcGVyIHJ1bigpIGFuZCBwZXIgcmVzdW1lKCkg4oCUIHN0YW1wZWQgb24gZXZlcnkgVHJhdmVyc2FsQ29udGV4dCAoYHJ1bklkLnRzYCkuICovXG4gIHByaXZhdGUgX2N1cnJlbnRSdW5JZCA9ICcnO1xuICAvKiogV2hvIG9ic2VydmVzIHRoZSBydW4g4oCUIG5hcnJhdGl2ZSwgaW5saW5lIGxpc3RzLCBkZWZlcnJlZCB0aWVyIChgYXR0YWNoLnRzYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb2JzZXJ2ZXJzID0gbmV3IFJ1bk9ic2VydmVycygpO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHJ1bidzIE9ORSByZWRhY3Rpb24gcnVsZSAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSwgYnVpbHQgZnJlc2ggcGVyIGxlZy4gKi9cbiAgcHJpdmF0ZSByZWRhY3Rpb25SdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUoKTtcbiAgcHJpdmF0ZSBsYXN0Q2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIGB0cnVlYCBvbmNlIHJ1bigpIChvciBhIHJlc3VtZSkgZXhlY3V0ZWQgaGVyZS4gYHJlc3VtZSgpYCBicmFuY2hlcyBvbiBpdDpcbiAgICogdHJ1ZSDihpIgcmV1c2UgdGhlIHJ1bnRpbWUgKGV4ZWN1dGlvbiB0cmVlLCByZWNvcmRlcnMsIG5hcnJhdGl2ZSBhY2N1bXVsYXRlKTtcbiAgICogZmFsc2Ug4oaSIHNlZWQgYSBmcmVzaCBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgIChjcm9zcy1leGVjdXRvclxuICAgKiByZXN1bWUpLiBTZWUgYHRlc3QvbGliL3BhdXNlL2Nyb3NzLWV4ZWN1dG9yLXJlc3VtZS50ZXN0LnRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hhc1J1bkJlZm9yZSA9IGZhbHNlO1xuICAvKipcbiAgICogUmUtZW50cmFuY3kgZ3VhcmQ6IHJ1bigpL3Jlc3VtZSgpIG11dGF0ZSBwZXItcnVuIHN0YXRlICh0cmF2ZXJzZXIsIHJ1bklkLFxuICAgKiBjb3VudGVycywgY2hlY2twb2ludCwgcmVjb3JkZXJzKSDigJQgb25lIGV4ZWN1dG9yID0gb25lIGluLWZsaWdodCBleGVjdXRpb24uXG4gICAqIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuXG4gICAqL1xuICBwcml2YXRlIF9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICBwcml2YXRlIGNhcHR1cmVTaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSBjYXB0dXJlSGlzdG9yeUxlYXNlPzogQ2FwdHVyZUhpc3RvcnlMZWFzZTtcbiAgcHJpdmF0ZSBmYWlsdXJlU3RhdGUgPSBuZXcgTmF0aXZlRmFpbHVyZVN0YXRlKCk7XG5cbiAgLyoqIFNhZmUgbmF0aXZlIGNvbnRleHQgZm9yIHRoZSBsYXRlc3QgcmVqZWN0ZWQgbGVnOyB1bmRlZmluZWQgYmVmb3JlLCBkdXJpbmcsIGFmdGVyIHN1Y2Nlc3Mgb3IgcGF1c2UuICovXG4gIGdldEZhaWx1cmVDb250ZXh0KCk6IFRlcm1pbmFsRmFpbHVyZUNvbnRleHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVTdGF0ZS5yZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dDaGFydEFyZ3M6IEV4ZWN1dG9yQXJnczxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogVGhlIGNyYXNoLXNhZmUgcmVjb3JkIG9mIHRoZSBjdXJyZW50IHJ1biAoMTAuMSwgUDYpIOKAlCB0aGUgc2luayBldmVyeSBsb2cgb2YgdGhlIHJ1biB3cml0ZXMgdG8sIGl0c1xuICAgKiBhY2NvdW50aW5nIGFuZCBpdHMgZmFpbHVyZSBtb2RlLiBGcmVzaCBwZXIgYHJ1bigpYCBhbmQgcGVyIGZyZXNoLWV4ZWN1dG9yIHJlc3VtZTsgYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBrZWVwc1xuICAgKiBpdCwgYXMgaXQga2VlcHMgdGhlIHJvb3QgbG9nLiBBYnNlbnQgd2l0aG91dCBhIGBzaW5rYCBvcHRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlY29yZDogUnVuUmVjb3JkIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBGbG93Q2hhcnRFeGVjdXRvci5cbiAgICpcbiAgICogKipPcHRpb25zIG9iamVjdCBmb3JtKiogKHByZWZlcnJlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSwgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MgPSByZXNvbHZlRXhlY3V0b3JBcmdzKGZsb3dDaGFydCwgZmFjdG9yeU9yT3B0aW9ucyk7XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGU/OiB1bmtub3duLFxuICAgIGVudj86IGltcG9ydCgnLi4vZW5naW5lL3R5cGVzLmpzJykuRXhlY3V0aW9uRW52LFxuICAgIG1heERlcHRoPzogbnVtYmVyLFxuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzoge1xuICAgICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgICAgcHJlc2VydmVSZWNvcmRlcnM/OiBib29sZWFuO1xuICAgICAgZXhpc3RpbmdSdW50aW1lPzogSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICAgIC8qKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgKGByZXN1bWUudHNgKTsgdGhlIHRyYXZlcnNlciBzdGlsbCB3YWxrcyB0aGUgUkVBTCBjaGFydC4gKi9cbiAgICAgIHJlc3VtZT86IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT47XG4gICAgICAvKiogVGhlIHJlZGFjdGlvbiB0aGUgcGF1c2VkIHJ1biBoYWQgbWFkZSAobmFtZXMgb25seSkg4oCUIHRoZSByZXN1bWVkIGxlZydzIHJ1bGUgc3RhcnRzIGZyb20gaXQuICovXG4gICAgICByZWRhY3Rpb25NYXJrcz86IFJlZGFjdGlvbk1hcmtzO1xuICAgICAgLyoqIFRoZSBsZWcncyBjb3JyZWxhdGlvbiwgcmVzb2x2ZWQgZnJvbSBpdHMgZW52IGJlZm9yZSBhbnl0aGluZyBtb3ZlZCAoYHJlc29sdmVDb3JyZWxhdGlvbmApLiAqL1xuICAgICAgY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcbiAgICAgIC8qKiBUaGUgbGVnJ3MgcmVjb3JkICgxMC4xLCBQNik6IGl0cyBzaW5rLCBhbmQgdGhlIG1ldGEgYSBORVcgcm9vdCBsb2cgb3BlbnMgd2l0aC4gKi9cbiAgICAgIHJlY29yZD86IHsgbGluazogUnVuUmVjb3JkOyBtZXRhPzogTWV0YSB9O1xuICAgIH0sXG4gICk6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5mbG93Q2hhcnRBcmdzO1xuICAgIGNvbnN0IGZjID0gYXJncy5mbG93Q2hhcnQ7XG4gICAgY29uc3QgbmFycmF0aXZlRmxhZyA9IHRoaXMub2JzZXJ2ZXJzLnN0YXJ0TGVnKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSwgb3ZlcnJpZGVzPy5wcmVzZXJ2ZVJlY29yZGVycyA9PT0gdHJ1ZSk7XG5cbiAgICB0aGlzLnJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZSh0aGlzLnJlZGFjdGlvblBvbGljeSk7XG4gICAgLy8gQSByZXN1bWUgY29udGludWVzIHRoZSBwYXVzZWQgcnVuJ3MgcmVkYWN0aW9uOiBhIGNvcHkgbWFza2VkIGJlZm9yZSB0aGUgcGF1c2Ugc3RheXMgbWFza2VkLlxuICAgIGlmIChvdmVycmlkZXM/LnJlZGFjdGlvbk1hcmtzKSB0aGlzLnJlZGFjdGlvblJ1bGUucmVzdG9yZU1hcmtzKG92ZXJyaWRlcy5yZWRhY3Rpb25NYXJrcyk7XG4gICAgLy8gVGhlIHJlY29yZCBpcyBzZXJ2ZWQgdW5kZXIgdGhpcyBsZWcncyBydWxlIOKAlCBiZWZvcmUgdGhlIHJvb3QgbG9nIGJlbG93IG9wZW5zIChpdHMgYmFzZSwgaXRzIG1ldGEpLlxuICAgIG92ZXJyaWRlcz8ucmVjb3JkPy5saW5rLnVzZVJ1bGUodGhpcy5yZWRhY3Rpb25SdWxlKTtcbiAgICAvLyBPTkUgZmFjdG9yeTogdGhlIGJhc2UgZmFjdG9yeSwgdGhlbiBldmVyeSBzY29wZSBtb2RpZmllciAocmVjb3JkZXJzLFxuICAgIC8vIGRlZmVycmVkIHRhcCwgcmVkYWN0aW9uKSBpbiBhIGZsYXQgcGFzcyDigJQgc2VlIGBSdW5PYnNlcnZlcnNgLlxuICAgIGNvbnN0IHNjb3BlRmFjdG9yeSA9IHRoaXMub2JzZXJ2ZXJzLmNvbXBvc2VTY29wZUZhY3RvcnkoXG4gICAgICBhcmdzLnNjb3BlRmFjdG9yeSxcbiAgICAgIHRoaXMucmVkYWN0aW9uUG9saWN5LFxuICAgICAgdGhpcy5yZWRhY3Rpb25SdWxlLm1hcmtlZEtleXMoKSxcbiAgICAgIG92ZXJyaWRlcz8uY29ycmVsYXRpb24sXG4gICAgKTtcblxuICAgIC8vIFRoZSBmaXJzdCBzdGFnZSB0aGlzIHRyYXZlcnNhbCBydW5zOiB0aGUgcmVzdW1lJ3MgZW50cnksIGVsc2UgdGhlIGNoYXJ0IHJvb3QuXG4gICAgY29uc3QgZWZmZWN0aXZlUm9vdCA9IG92ZXJyaWRlcz8ucmVzdW1lPy5zdGFydCA/PyBmYy5yb290O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0ID0gb3ZlcnJpZGVzPy5pbml0aWFsQ29udGV4dCA/PyBhcmdzLmluaXRpYWxDb250ZXh0O1xuXG4gICAgLy8gVGhlIHJ1bidzIHBvbGljeSAoRjUpOiB0aGUgZGlhbHMsIHRoZSBydWxlIChpbnN0YWxsZWQgZXZlbiB3aXRob3V0IGFcbiAgICAvLyBwb2xpY3kg4oCUIHBlci1jYWxsIGBzZXRWYWx1ZShrLCB2LCB0cnVlKWAgbWFya3MgbGl2ZSBvbiBpdCkgYW5kIHRoZSBtaXJyb3JcbiAgICAvLyBmbGFnIChhIHJlZGFjdGVkIGhlYXAsIGtlcHQgb25seSB1bmRlciBhIHBvbGljeSksIE9ORSBmcm96ZW4gb2JqZWN0IHBlclxuICAgIC8vIGxlZyB0aGF0IGV2ZXJ5IGZyYW1lIG9mIHRoZSBydW4gaG9sZHMgYnkgcmVmZXJlbmNlLlxuICAgIGNvbnN0IHBvbGljeSA9IHJ1blBvbGljeShhcmdzLmRpYWxzLCB0aGlzLnJlZGFjdGlvblJ1bGUsIHRoaXMucmVkYWN0aW9uUG9saWN5ICE9PSB1bmRlZmluZWQpO1xuXG4gICAgbGV0IHJ1bnRpbWU6IEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgaWYgKG92ZXJyaWRlcz8uZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAvLyBTYW1lLWV4ZWN1dG9yIHJlc3VtZTogdGhlIHRyZWUgY29udGludWVzIGZyb20gdGhlIGxlYWY7IGdldFNuYXBzaG90KCkga2VlcHMgdGhlIGZ1bGwgdHJlZS5cbiAgICAgIHJ1bnRpbWUgPSBvdmVycmlkZXMuZXhpc3RpbmdSdW50aW1lO1xuICAgICAgcnVudGltZS5wcmVzZXJ2ZVNuYXBzaG90Um9vdCgpO1xuICAgICAgbGV0IGxlYWYgPSBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgICB3aGlsZSAobGVhZi5uZXh0KSBsZWFmID0gbGVhZi5uZXh0O1xuICAgICAgcnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbGVhZi5jcmVhdGVOZXh0KCcnLCBlZmZlY3RpdmVSb290Lm5hbWUsIGVmZmVjdGl2ZVJvb3QuaWQpO1xuICAgICAgcnVudGltZS51c2VQb2xpY3kocG9saWN5KTtcbiAgICAgIHJ1bnRpbWUucmVzdW1lUmVhZFNvdXJjZXModGhpcy5fY3VycmVudFJ1bklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVjb3JkID0gb3ZlcnJpZGVzPy5yZWNvcmQ7XG4gICAgICBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QubmFtZSxcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5pZCxcbiAgICAgICAgYXJncy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgICAgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQsXG4gICAgICAgIHBvbGljeSxcbiAgICAgICAgLy8gQSByb290IGxvZyB0aGF0IHdyaXRlcyB0byB0aGUgc2luayBvcGVucyBhdCBgW3J1bklkXWAg4oCUIHRoZSBhZGRyZXNzIHRoZSBlbmdpbmUgYmluZHMgaXQgdG8gYW55d2F5LlxuICAgICAgICByZWNvcmQgJiYge1xuICAgICAgICAgIHNpbms6IHJlY29yZC5saW5rLnNpbmssXG4gICAgICAgICAgYWRkcmVzczogeyBsb2dSdW5JZDogdGhpcy5fY3VycmVudFJ1bklkLCBkcmlsbFBhdGg6IFtdIH0sXG4gICAgICAgICAgLi4uKHJlY29yZC5tZXRhICYmIHsgbWV0YTogcmVjb3JkLm1ldGEgfSksXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuX2N1cnJlbnRSdW5JZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICAgICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWUgJiYgeyB1bmF2YWlsYWJsZTogJ3Jlc3VtZWQtc291cmNlLW93bmVyc2hpcCcgYXMgY29uc3QgfSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dC5mYWlsdXJlU3RhdGUgPSB0aGlzLmZhaWx1cmVTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgICAgLy8gQWx3YXlzIHRoZSBSRUFMIGNoYXJ0OyBhIHJlc3VtZSBvbmx5IG1vdmVzIHdoZXJlIHRoZSB0cmF2ZXJzYWwgU1RBUlRTLCBvbmNlLlxuICAgICAgICByb290OiBmYy5yb290LFxuICAgICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0ICYmIHsgZW50cnk6IG92ZXJyaWRlcy5yZXN1bWUuc3RhcnQgfSksXG4gICAgICAgIC4uLihvdmVycmlkZXM/LnJlc3VtZT8uc3RhcnRQZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogb3ZlcnJpZGVzLnJlc3VtZS5zdGFydFBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIC4uLihvdmVycmlkZXM/LnJlc3VtZSAmJiB7IHJlc3VtZTogb3ZlcnJpZGVzLnJlc3VtZSB9KSxcbiAgICAgICAgc3RhZ2VNYXA6IGZjLnN0YWdlTWFwLFxuICAgICAgICBzY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGUgPz8gYXJncy5yZWFkT25seUNvbnRleHQsXG4gICAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IGFyZ3MudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IGFyZ3Muc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IGZjLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgbG9nZ2VyOiBmYy5sb2dnZXIgPz8gZGVmYXVsdExvZ2dlcixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBleGVjdXRpb25FbnY6IGVudixcbiAgICAgICAgZmxvd1JlY29yZGVyczogdGhpcy5vYnNlcnZlcnMuZmxvd1JlY29yZGVyc0xpc3QoKSxcbiAgICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlcixcbiAgICAgICAgdmlzaXRDb3VudHM6IHRoaXMuX3Zpc2l0Q291bnRzLFxuICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICAuLi4ob3ZlcnJpZGVzPy5jb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uOiBvdmVycmlkZXMuY29ycmVsYXRpb24gfSksXG4gICAgICAgIC4uLihtYXhEZXB0aCAhPT0gdW5kZWZpbmVkICYmIHsgbWF4RGVwdGggfSksXG4gICAgICAgIC4uLihtYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgeyBtYXhJdGVyYXRpb25zIH0pLFxuICAgICAgfSk7XG4gICAgICBpZiAoKGFyZ3MuY2FwdHVyZUNvdmVyYWdlIHx8IHBvbGljeS5yZWFkU291cmNlcykgJiYgdGhpcy5fY3VycmVudFJ1bklkKSBydW50aW1lLmJlZ2luQ2FwdHVyZSh0aGlzLl9jdXJyZW50UnVuSWQpO1xuICAgICAgcmV0dXJuIHRyYXZlcnNlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSByZWZ1c2VkIGxlZyB3aG9zZSByb290IGxvZyBhbHJlYWR5IG9wZW5lZCBzYXlzIHNvOiBpdHMgcmVjb3JkIGlzIGNsb3NlZCwgbmV2ZXIgbGVmdCBsb29raW5nIGNyYXNoZWQuXG4gICAgICBpZiAob3ZlcnJpZGVzPy5yZWNvcmQgJiYgIW92ZXJyaWRlcy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgICAgcnVudGltZS5jbG9zZVJlY29yZCgnZmFpbGVkJywgeyBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLCBlcnJvcjogdGhpcy5jbG9zaW5nRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmVuYWJsZU5hcnJhdGl2ZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5IHRoYXQgYXBwbGllcyB0byBhbGwgc3RhZ2VzLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqL1xuICBzZXRSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJlZGFjdGlvblBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZShwb2xpY3kpO1xuICB9XG5cbiAgLyoqIFRoZSBgcmVhZFRyYWNraW5nYCBkaWFsIChzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy5yZWFkVHJhY2tpbmd9KS4gQ2FsbCBiZWZvcmUgcnVuKCkuICovXG4gIHNldFJlYWRUcmFja2luZyhtb2RlOiBSZWFkVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzID0geyAuLi50aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMsIHJlYWRUcmFja2luZzogbW9kZSB9O1xuICB9XG5cbiAgLyoqIFRoZSBgd3JpdGVUcmFja2luZ2AgZGlhbCAoc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMud3JpdGVUcmFja2luZ30pLiBDYWxsIGJlZm9yZSBydW4oKS4gKi9cbiAgc2V0V3JpdGVUcmFja2luZyhtb2RlOiBXcml0ZVRyYWNraW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscyA9IHsgLi4udGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzLCB3cml0ZVRyYWNraW5nOiBtb2RlIH07XG4gIH1cblxuICAvKiogVGhlIGBjb21taXRWYWx1ZXNgIGRpYWwgKHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLmNvbW1pdFZhbHVlc30pLiBDYWxsIGJlZm9yZSBydW4oKS4gKi9cbiAgc2V0Q29tbWl0VmFsdWVzKG1vZGU6IENvbW1pdFZhbHVlc01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMgPSB7IC4uLnRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscywgY29tbWl0VmFsdWVzOiBtb2RlIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkgZnJvbSB0aGVcbiAgICogbW9zdCByZWNlbnQgcnVuLiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMucmVkYWN0aW9uUnVsZS5yZXBvcnQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQYXVzZS9SZXN1bWUg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoZWNrcG9pbnQgZnJvbSB0aGUgbW9zdCByZWNlbnQgcGF1c2VkIGV4ZWN1dGlvbiwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIGxhc3QgcnVuIGNvbXBsZXRlZCB3aXRob3V0IHBhdXNpbmcuXG4gICAqXG4gICAqIEpTT04tc2VyaWFsaXphYmxlIChzdG9yZSBpdCBpbiBSZWRpcywgUG9zdGdyZXMsIGxvY2FsU3RvcmFnZeKApikgYW5kIGZ1bGx5XG4gICAqIERFVEFDSEVEIGZyb20gZW5naW5lIHN0YXRlIChgY2hlY2twb2ludC50c2ApOiBtdXRhdGluZyBvciBwZXJzaXN0aW5nIGl0XG4gICAqIGNhbm5vdCBhZmZlY3QgdGhlIGV4ZWN1dG9yLCBub3IgYSBsYXRlciByZXN1bWUgYSBjaGVja3BvaW50IHlvdSBzdG9yZWQuXG4gICAqIExFQU46IHdoYXQgYHJlc3VtZSgpYCByZWFkcyBhbmQgdGhlIHBhdXNlJ3Mgb3duIHJlY29yZCDigJQgaXRzIHNpemUgaXMgdGhlXG4gICAqIHN0YXRlJ3MsIG5ldmVyIHRoZSBydW4ncyBsZW5ndGguIFRoZSBydW4ncyBoaXN0b3J5IChleGVjdXRpb24gdHJlZSxcbiAgICogY29tbWl0IGxvZywgc3ViZmxvdyByZXN1bHRzKSBpcyB7QGxpbmsgZ2V0U25hcHNob3R9J3MuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gICAqIGlmIChleGVjdXRvci5pc1BhdXNlZCgpKSB7XG4gICAqICAgY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqICAgYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hlY2twb2ludCgpOiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9zdCByZWNlbnQgcnVuKCkgd2FzIHBhdXNlZCAoY2hlY2twb2ludCBhdmFpbGFibGUpLiAqL1xuICBpc1BhdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBjb21taXRzIGluIHRoZSBST09UIGxvZyBub3cuIE8oMSksIG5vIHNuYXBzaG90IG1hdGVyaWFsaXphdGlvbi5cbiAgICogTm90IGFuIGVtaXR0ZWQgZXZlbnQncyBzb3VyY2UgcG9zaXRpb246IGEgZGVmZXJyZWQgY2FsbGJhY2sgcnVucyBsYXRlclxuICAgKiBhbmQgYSBzdWJmbG93IG93bnMgYW5vdGhlciBsb2cuIFVzZSBFbWl0RXZlbnQuc291cmNlUG9zaXRpb24gZm9yIHRoYXQuXG4gICAqXG4gICAqIFJldHVybnMgMCBiZWZvcmUgYW55IHJ1bi4gQSBmcmVzaCBydW4gcmVzZXRzIHRoZSBsb2c7IGEgc2FtZS1leGVjdXRvclxuICAgKiByZXN1bWUgY29udGludWVzIGl0LiBBIGZyZXNoLWV4ZWN1dG9yIHJlc3VtZSBzdGFydHMgYSBuZXcgbG9jYWwgbG9nLlxuICAgKiBBbHdheXMgZXF1YWxzIGBnZXRTbmFwc2hvdCgpLmNvbW1pdExvZy5sZW5ndGhgICh0aGUgbG9nIGlzIHRoZVxuICAgKiBgRXZlbnRMb2dgJ3MgYGV4ZWN1dGlvbkhpc3RvcnlgOyB0aGUgc25hcHNob3Qgc2VydmVzIGEgZnJvemVuIGNvcHkpLlxuICAgKi9cbiAgZ2V0Q29tbWl0Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJ1bnRpbWU/LmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydCBmcm9tIGEgY2hlY2twb2ludC5cbiAgICpcbiAgICogUmVzdG9yZXMgdGhlIHNjb3BlIHN0YXRlLCBydW5zIHRoZSBwYXVzZWQgc3RhZ2UncyBgcmVzdW1lRm5gIHdpdGggdGhlIGlucHV0XG4gICAqIChhbiBgaW50ZXJydXB0KClgIHBhdXNlIHJlLXJ1bnMgdGhlIHN0YWdlIHdpdGggdGhlIGFuc3dlciksIHRoZW4gY29udGludWVzXG4gICAqIHdpdGggd2hhdGV2ZXIgcmFuIGFmdGVyIHRoYXQgc3RhZ2Ugb24gdGhlIHJ1biDigJQgaXRzIGBuZXh0YCwgb3IgaXRzXG4gICAqIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24sIGF0IGV2ZXJ5IGxldmVsIG9mIHRoZSBwYXVzZSBwYXRoLiBQYXJhbGxlbFxuICAgKiBzaWJsaW5ncyB0aGF0IHBhdXNlZCB0b2dldGhlciAoYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApIGFyZSBhc2tlZCBpblxuICAgKiB0dXJuOyB0aGUgam9pbiBydW5zIGFmdGVyIHRoZSBsYXN0IGFuc3dlci4gU2VlIGBSZXN1bWVFbnRyeWAuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGNvbWVzIGZyb20gYGdldENoZWNrcG9pbnQoKWAgb3IgZnJvbSBzdG9yYWdlLiBPbiB0aGUgU0FNRVxuICAgKiBleGVjdXRvciwgbmFycmF0aXZlL3JlY29yZGVyIHN0YXRlIGFjY3VtdWxhdGVzIGFjcm9zcyB0aGUgcGF1c2U7IG9uIGFcbiAgICogRlJFU0ggZXhlY3V0b3IgaXQgc3RhcnRzIGVtcHR5LiBBIGZyZXNoIGBydW5JZGAgZWl0aGVyIHdheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBQcm9jZXNzIEEg4oCUIGFmdGVyIGEgcGF1c2UsIHBlcnNpc3QgdGhlIGNoZWNrcG9pbnQ6XG4gICAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqXG4gICAqIC8vIFByb2Nlc3MgQiAocG9zc2libHkgZGlmZmVyZW50IHNlcnZlciwgc2FtZSBjaGFydCkg4oCUIHJlc3RvcmUgYW5kIHJlc3VtZTpcbiAgICogY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKGF3YWl0IHJlZGlzLmdldChgc2Vzc2lvbjoke2lkfWApKTtcbiAgICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5yZXN1bWUocmVzdG9yZWQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzdW1lKFxuICAgIGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gICAgcmVzdW1lSW5wdXQ/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQaWNrPFJ1bk9wdGlvbnMsICdzaWduYWwnIHwgJ2VudicgfCAnbWF4RGVwdGgnIHwgJ21heEl0ZXJhdGlvbnMnIHwgJ2RlYWRsaW5lJyB8ICd0aW1lb3V0TXMnPixcbiAgKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIHRoaXMuYXNzZXJ0SWRsZSgncmVzdW1lJyk7XG4gICAgdGhpcy5mYWlsdXJlU3RhdGUgPSBuZXcgTmF0aXZlRmFpbHVyZVN0YXRlKCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEV2ZXJ5IHJlZnVzYWwgaGFwcGVucyBpbiB0aGUgcGxhbiDigJQgYmVmb3JlIGFueSBzdGF0ZSBiZWxvdyBpcyB0b3VjaGVkLFxuICAgICAgLy8gc28gYSByZWplY3RlZCBjaGVja3BvaW50IGxlYXZlcyB0aGUgZXhlY3V0b3IgKGFuZCBpdHMgY2hlY2twb2ludCkgYXMgaXQgd2FzLlxuICAgICAgY29uc3QgcGxhbiA9IHBsYW5SZXN1bWUodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydCwgY2hlY2twb2ludCwgcmVzdW1lSW5wdXQpO1xuICAgICAgLy8gVGhlIHJlc3VtZWQgbGVnJ3MgZW52LCByZWFkIE9OQ0UsIGFuZCBpdHMgT1dOIGNvcnJlbGF0aW9uIOKAlCByZWZ1c2VkIGhlcmUsIGJlZm9yZSBhbnkgc3RhdGUgbW92ZXMuIE5ldmVyXG4gICAgICAvLyB0aGUgcGF1c2VkIGxlZydzOiB0aGUgY2hlY2twb2ludCBjYXJyaWVzIG5vbmUuXG4gICAgICBjb25zdCB7IGVudiwgY29ycmVsYXRpb24gfSA9IGFkbWl0UnVuRW52KG9wdGlvbnM/LmVudik7XG4gICAgICAvLyBNVVNUIHByZWNlZGUgdGhlIGNvdW50ZXIgcmVhZCBpbiBgYW5ub3VuY2VSZXN1bWVgIGFuZCB0aGUgdHJhdmVyc2VyLFxuICAgICAgLy8gd2hpY2ggdGFrZXMgYm90aCBjb3VudGVycyBCWSBSRUZFUkVOQ0UuXG4gICAgICBzZWVkQ291bnRlcnMocGxhbi5jaGVja3BvaW50LCB0aGlzLl9leGVjdXRpb25Db3VudGVyLCB0aGlzLl92aXNpdENvdW50cyk7XG4gICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBTYW1lIGV4ZWN1dG9yOiByZXVzZSB0aGUgcnVudGltZS4gRnJlc2ggZXhlY3V0b3I6IHNlZWQgYSBORVcgb25lIGZyb21cbiAgICAgIC8vIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYC4gRWl0aGVyIHdheSBhIE5FVyBydW5JZCAoYSBkaXN0aW5jdCBsb2dpY2FsIHJ1bikuXG4gICAgICBjb25zdCBleGlzdGluZ1J1bnRpbWUgPSB0aGlzLl9oYXNSdW5CZWZvcmVcbiAgICAgICAgPyAodGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faGFzUnVuQmVmb3JlID0gdHJ1ZTsgLy8gYW55IHBhdGggdGhhdCByZXN1bWVzIGNvdW50cyBhcyBhIHJ1blxuICAgICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuICAgICAgLy8gVGhlIHJlY29yZCAoUDYpOiB0aGUgc2FtZSBleGVjdXRvciBjb250aW51ZXMgaXRzIHJvb3QgbG9nLCBhbmQgaXRzIHNpbms7IGEgZnJlc2ggb25lIG9wZW5zIGEgbmV3IHJvb3QgbG9nLlxuICAgICAgY29uc3Qgc2lua09wdGlvbiA9IHRoaXMuZmxvd0NoYXJ0QXJncy5zaW5rO1xuICAgICAgY29uc3QgcmV1c2VkID0gZXhpc3RpbmdSdW50aW1lICYmIHRoaXMucmVjb3JkID8gdGhpcy5yZWNvcmQgOiB1bmRlZmluZWQ7XG4gICAgICByZXVzZWQ/LmJlZ2luTGVnKCk7XG4gICAgICBjb25zdCByZWNvcmQgPSBzaW5rT3B0aW9uICYmIChyZXVzZWQgPz8gbmV3IFJ1blJlY29yZChzaW5rT3B0aW9uKSk7XG4gICAgICBjb25zdCByZXN1bWVkRnJvbSA9IHBsYW4uY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb24/LnJ1bklkO1xuXG4gICAgICAvLyBBIHJlc3VtZWQgbGVnIGhhcyBpdHMgb3duIGRlYWRsaW5lIChwZXIgbGVnLCBsaWtlIHRoZSBsb29wIGJ1ZGdldCk6IG9ubHkgd2hhdCBpcyBwYXNzZWQgSEVSRS4gQXJtZWQgZnJvbSB0aGVcbiAgICAgIC8vIGVudiBhcyBhZG1pdHRlZCAoYGFkbWl0UnVuRW52YCwgb25lIHJlYWQpLCBzbyB0aGUgZGVhZGxpbmUgYW5kIHRoZSBjb3JyZWxhdGlvbiByZWFkIHRoZSBzYW1lIHNuYXBzaG90LlxuICAgICAgY29uc3QgYXJtZWQgPSBhcm1SdW4oe1xuICAgICAgICBzaWduYWw6IG9wdGlvbnM/LnNpZ25hbCxcbiAgICAgICAgdGltZW91dE1zOiBvcHRpb25zPy50aW1lb3V0TXMsXG4gICAgICAgIGRlYWRsaW5lOiBvcHRpb25zPy5kZWFkbGluZSxcbiAgICAgICAgZW52LFxuICAgICAgICAuLi4ocmVjb3JkPy5zdG9wU2lnbmFsICYmIHsgc3RvcDogcmVjb3JkLnN0b3BTaWduYWwgfSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMudHJhdmVyc2VyID0gZGlzcG9zZU9uVGhyb3coYXJtZWQsICgpID0+XG4gICAgICAgIHRoaXMuY3JlYXRlVHJhdmVyc2VyKGFybWVkLnNpZ25hbCwgdW5kZWZpbmVkLCBhcm1lZC5lbnYsIG9wdGlvbnM/Lm1heERlcHRoLCBvcHRpb25zPy5tYXhJdGVyYXRpb25zLCB7XG4gICAgICAgICAgLy8gQ2xvbmUtaW46IGBpbml0aWFsQ29udGV4dGAgc2VlZHMgdGhlIGZyZXNoIFNoYXJlZE1lbW9yeSB3aXRoIGFcbiAgICAgICAgICAvLyB0b3AtbGV2ZWwtb25seSBtZXJnZSDigJQgbmVzdGVkIG9iamVjdHMgd291bGQgYWxpYXMgdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQuXG4gICAgICAgICAgaW5pdGlhbENvbnRleHQ6IHN0cnVjdHVyZWRDbG9uZShwbGFuLmNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpLFxuICAgICAgICAgIHByZXNlcnZlUmVjb3JkZXJzOiB0cnVlLFxuICAgICAgICAgIC4uLihleGlzdGluZ1J1bnRpbWUgPyB7IGV4aXN0aW5nUnVudGltZSB9IDoge30pLFxuICAgICAgICAgIHJlc3VtZTogcGxhbi5lbnRyeSxcbiAgICAgICAgICAuLi4ocGxhbi5jaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzICYmIHsgcmVkYWN0aW9uTWFya3M6IHBsYW4uY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyB9KSxcbiAgICAgICAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgICAuLi4ocmVjb3JkICYmIHtcbiAgICAgICAgICAgIHJlY29yZDoge1xuICAgICAgICAgICAgICBsaW5rOiByZWNvcmQsXG4gICAgICAgICAgICAgIG1ldGE6IHRoaXMub3BlbmluZ01ldGEoY29ycmVsYXRpb24sIGFybWVkLmRlYWRsaW5lLCByZXN1bWVkRnJvbSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICAvLyBUaGUgc2FtZSByb290IGxvZyBnb2VzIG9uIHVuZGVyIHRoaXMgbGVnOiB0aGUgbGVnIGlzIG5vdGVkIGJlc2lkZSBpdCwgc28gdGhlIHN0b3JlZCByZWNvcmQgbmFtZXMgaXRzIHJ1bklkLlxuICAgICAgaWYgKHJlY29yZCAmJiBleGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgICAgZXhpc3RpbmdSdW50aW1lLm5vdGVSZWNvcmQoXG4gICAgICAgICAgJ3Jlc3VtZScsXG4gICAgICAgICAgcmVjb3JkLnNlcnZlKHtcbiAgICAgICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgICAgICAuLi4ocmVzdW1lZEZyb20gIT09IHVuZGVmaW5lZCAmJiB7IHJlc3VtZWRGcm9tIH0pLFxuICAgICAgICAgICAgLi4uKGNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb24gfSksXG4gICAgICAgICAgICAuLi4oYXJtZWQuZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiB7IGRlYWRsaW5lOiBhcm1lZC5kZWFkbGluZSB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVjb3JkID0gcmVjb3JkO1xuICAgICAgdGhpcy5jYXB0dXJlU2lnbmFsID1cbiAgICAgICAgdGhpcy5mbG93Q2hhcnRBcmdzLmNhcHR1cmVDb3ZlcmFnZSB8fCB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMucmVhZFNvdXJjZXMgPyBhcm1lZC5zaWduYWwgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBBIGZyZXNoLWV4ZWN1dG9yIHJlc3VtZSBhbHNvIHN0YXJ0cyBhIHNlZ21lbnQsIG5ldmVyIGEgbmV3bHkgb2JzZXJ2ZWQgd2hvbGUgd29ya2Zsb3cuXG4gICAgICAodGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEV4ZWN1dGlvblJ1bnRpbWUpLmNhcHR1cmU/LmxpbWl0KCdyZXN1bWVkLXNlZ21lbnQnKTtcbiAgICAgIC8vIEJlZm9yZSB0aGUgdHJhdmVyc2FsIG9uIHB1cnBvc2U6IGBvblJlc3VtZWAgcHJlY2VkZXMgYG9uUnVuU3RhcnRgLlxuICAgICAgZGlzcG9zZU9uVGhyb3coYXJtZWQsICgpID0+XG4gICAgICAgIGFubm91bmNlUmVzdW1lKHBsYW4sIHJlc3VtZUlucHV0LCB7XG4gICAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgICBleGVjdXRpb25Db3VudDogdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSxcbiAgICAgICAgICBvYnNlcnZlcnM6IHRoaXMub2JzZXJ2ZXJzLFxuICAgICAgICAgIC4uLihjb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uIH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uL2xvb2t1cCB0aHJvd3MgYWJvdmUgKG5vdGhpbmcgY2FuIGxlYWsgdGhlXG4gICAgICAvLyBmbGFnKTsgbm8gYXdhaXQgYmV0d2VlbiB0aGUgdG9wLW9mLW1ldGhvZCBjaGVjayBhbmQgaGVyZSwgc28gcmFjZS1mcmVlLlxuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2V0dGxlUmVjb3JkZWQoYXJtZWQsIHJlY29yZCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpIOKAlCBzYW1lIGJvdW5kYXJ5IGNvbnRyYWN0IGFzIHJ1bigpLlxuICAgICAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMucGF1c2VkT3JUaHJvdyhlcnJvcik7XG4gICAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgncGF1c2VkJyk7XG4gICAgICAgIHJldHVybiBwYXVzZWQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgICBhcm1lZC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChlcnJvcik7XG4gICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2ZhaWxlZCcsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGxlIG9mIGEgbGVnIHRoYXQgdGhyZXc6IGZsdXNoIHRoZSBkZWZlcnJlZCB0aWVyICh0aGUgT1VURVJNT1NUXG4gICAqIGhhbmRsZXIg4oCUIGEgcGF1c2UgcmUtdGhyb3dzIHRocm91Z2ggc3ViZmxvdyB0cmF2ZXJzZXJzIHdpdGhvdXQgZXhpdFxuICAgKiBldmVudHMsIHNvIHBlci10cmF2ZXJzZXIgaG9va3Mgd291bGQgbWlzcyBpdCksIHRoZW4gdHVybiBhIHBhdXNlIGludG8gYVxuICAgKiBkZXRhY2hlZCBjaGVja3BvaW50IChgY2hlY2twb2ludC50c2ApIGFuZCBhIGBQYXVzZWRSZXN1bHRgOyBhbnl0aGluZyBlbHNlXG4gICAqIGlzIHJldGhyb3duLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZWRPclRocm93KGVycm9yOiB1bmtub3duKTogUGF1c2VkUmVzdWx0IHtcbiAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgIGNvbnN0IHJlZGFjdGlvbk1hcmtzID0gdGhpcy5yZWRhY3Rpb25SdWxlLm1hcmtzRm9yQ2hlY2twb2ludCgpO1xuICAgICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBFeGVjdXRpb25SdW50aW1lO1xuICAgICAgY29uc3QgY2FwdHVyZSA9IHJ1bnRpbWUuY2FwdHVyZT8ucnVuSWQgPT09IHRoaXMuX2N1cnJlbnRSdW5JZCA/IHJ1bnRpbWUuY2FwdHVyZSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIENoZWNrcG9pbnQgY3JlYXRpb24gY2Fubm90IGRlcGVuZCBvbiBhIHByaW9yIHNlcnZlZFNuYXBzaG90KCkgdG8gbm90aWNlIGFjdGl2ZSByZWRhY3Rpb24uXG4gICAgICBpZiAoY2FwdHVyZSAmJiBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZ2V0UG9saWN5KCkucmVkYWN0aW9uPy5pc0luZXJ0KCkgPT09IGZhbHNlKVxuICAgICAgICBjYXB0dXJlLmxpbWl0KCdyZWRhY3Rpb24tYWN0aXZlJyk7XG4gICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gYnVpbGRQYXVzZUNoZWNrcG9pbnQoZXJyb3IsIHRoaXMudHJhdmVyc2VyLCB7XG4gICAgICAgIC4uLihjYXB0dXJlICYmIHsgY2FwdHVyZTogcnVudGltZS5jYXB0dXJlU25hcHNob3QocnVudGltZS5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCkgfSksXG4gICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50OiB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlLFxuICAgICAgICB2aXNpdENvdW50czogdGhpcy5fdmlzaXRDb3VudHMsXG4gICAgICAgIC4uLihyZWRhY3Rpb25NYXJrcyAmJiB7IHJlZGFjdGlvbk1hcmtzIH0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGxlIG9mIGEgbGVnIHRoYXQgd3JpdGVzIGl0cyByZWNvcmQgKDEwLjEsIFA2KSDigJQgdGhlIDEwLjAgc2V0dGxlIChgcnVuKClgIC8gYHJlc3VtZSgpYCksIHRoZW4gdGhlIHJvb3RcbiAgICogbG9nJ3MgY2xvc2luZyBlbnRyeSB3aXRoIGhvdyB0aGUgbGVnIGVuZGVkLCB0aGVuIChgZmx1c2g6ICdhdXRvJ2ApIHRoZSBhZGFwdGVyJ3MgZmx1c2gsIGFsbCBiZWZvcmUgdGhlIGxlZ1xuICAgKiBjb3VudHMgYXMgZmluaXNoZWQuIEEgbGVnIHdpdGhvdXQgYSBzaW5rIG5ldmVyIGNvbWVzIGhlcmU6IGl0cyBzZXR0bGUgaGFzIG5vIGV4dHJhIGF3YWl0LlxuICAgKlxuICAgKiBUaGUgbGVnJ3Mgb3duIGVycm9yIGFsd2F5cyB3aW5zLiBBIHJ1biB0aGF0IGZpbmlzaGVkIGJ1dCBsb3N0IGFuIGVudHJ5IHVuZGVyIGBvbkZhaWx1cmU6ICdmYWlsJ2AgcmVqZWN0cyB3aXRoXG4gICAqIHRoZSBgUmVjb3JkU2lua0Vycm9yYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2V0dGxlUmVjb3JkZWQoYXJtZWQ6IEFybWVkUnVuLCByZWNvcmQ6IFJ1blJlY29yZCk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0dGxlUmVjb3JkZWRMZWcoYXJtZWQsIHJlY29yZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgICBhcm1lZC5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGVSZWNvcmRlZExlZyhhcm1lZDogQXJtZWRSdW4sIHJlY29yZDogUnVuUmVjb3JkKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICBsZXQgb3V0Y29tZTogTG9nT3V0Y29tZTtcbiAgICBsZXQgcmVzdWx0OiBFeGVjdXRvclJlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmFpbHVyZTogeyBlcnJvcjogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpIOKAlCBzYW1lIGJvdW5kYXJ5IGNvbnRyYWN0IGFzIHJ1bigpLlxuICAgICAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgICAgb3V0Y29tZSA9ICdvayc7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGF1c2VkT3JUaHJvdyhlcnJvcik7XG4gICAgICAgICAgb3V0Y29tZSA9ICdwYXVzZWQnO1xuICAgICAgICB9IGNhdGNoICh0aHJvd246IHVua25vd24pIHtcbiAgICAgICAgICBmYWlsdXJlID0geyBlcnJvcjogdGhyb3duIH07XG4gICAgICAgICAgb3V0Y29tZSA9ICdmYWlsZWQnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBydW50aW1lLmNsb3NlUmVjb3JkKG91dGNvbWUsIHtcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgLi4uKGZhaWx1cmUgJiYgeyBlcnJvcjogdGhpcy5jbG9zaW5nRXJyb3IoZmFpbHVyZS5lcnJvcikgfSksXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdW5kZWQ6IGEgZmx1c2ggdGhhdCBuZXZlciBzZXR0bGVzIGlzIGEgbG9zcywgbmV2ZXIgYSBydW4gaGVsZCBvcGVuICh0aGUgdGltZSBsZWZ0LCBlbHNlIDMwIHMpLlxuICAgICAgaWYgKHJlY29yZC5mbHVzaE1vZGUgPT09ICdhdXRvJykgYXdhaXQgcmVjb3JkLmZsdXNoKGF1dG9GbHVzaE1zKGFybWVkLmRlYWRsaW5lKSwgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChlcnJvcik7XG4gICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2ZhaWxlZCcsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZSkge1xuICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuZmluaXNoKGZhaWx1cmUuZXJyb3IpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCBmYWlsdXJlLmVycm9yKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNhcHR1cmVIaXN0b3J5KHJ1bnRpbWUsIHJlY29yZCk7XG4gICAgICB0aHJvdyBmYWlsdXJlLmVycm9yO1xuICAgIH1cbiAgICBpZiAocmVjb3JkLmZhdGFsKSB7XG4gICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5maW5pc2gocmVjb3JkLmZhdGFsKTtcbiAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnZmFpbGVkJywgcmVjb3JkLmZhdGFsKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNhcHR1cmVIaXN0b3J5KHJ1bnRpbWUsIHJlY29yZCk7XG4gICAgICB0aHJvdyByZWNvcmQuZmF0YWw7XG4gICAgfVxuICAgIHRoaXMuZmluaXNoQ2FwdHVyZShvdXRjb21lID09PSAncGF1c2VkJyA/ICdwYXVzZWQnIDogJ2NvbXBsZXRlZCcpO1xuICAgIGF3YWl0IHRoaXMuc2F2ZUNhcHR1cmVIaXN0b3J5KHJ1bnRpbWUsIHJlY29yZCk7XG4gICAgaWYgKHJlY29yZC5mYXRhbCkge1xuICAgICAgLy8gVGhlIG5hdGl2ZSBwcmVmaXggYWxyZWFkeSBlbmRlZDsgYSBsYXRlciBzdG9yYWdlIHJlamVjdGlvbiBvd25zIG5vIHN1Y2Nlc3NmdWwgc3RhZ2UuXG4gICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5maW5pc2gocmVjb3JkLmZhdGFsKTtcbiAgICAgIHRocm93IHJlY29yZC5mYXRhbDtcbiAgICB9XG4gICAgdGhpcy5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcbiAgICByZXR1cm4gcmVzdWx0IGFzIEV4ZWN1dG9yUmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQ2FwdHVyZUhpc3RvcnkocnVudGltZTogRXhlY3V0aW9uUnVudGltZSwgcmVjb3JkOiBSdW5SZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXJlY29yZC5jYXB0dXJlT3B0aW9ucykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHRoaXMuY2FwdHVyZUhpc3RvcnlMZWFzZSA/Pz0geyBwZW5kaW5nOiBmYWxzZSB9O1xuICAgIHJldHVybiBwZXJzaXN0Q2FwdHVyZUhpc3RvcnkocnVudGltZSwgcmVjb3JkLCAoKSA9PiB0aGlzLmdldFNuYXBzaG90KCksIHRoaXMuY2FwdHVyZUhpc3RvcnlMZWFzZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaENhcHR1cmUoc3RhdHVzOiAnY29tcGxldGVkJyB8ICdwYXVzZWQnIHwgJ2ZhaWxlZCcsIGVycm9yPzogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY2FwdHVyZVNpZ25hbDtcbiAgICB0aGlzLmNhcHR1cmVTaWduYWwgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGNhcHR1cmUgPSBydW50aW1lLmNhcHR1cmU7XG4gICAgaWYgKCFjYXB0dXJlIHx8IGNhcHR1cmUucnVuSWQgIT09IHRoaXMuX2N1cnJlbnRSdW5JZCkgcmV0dXJuO1xuICAgIGNvbnN0IGNhbmNlbGxlZCA9IHN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgaXNDYW5jZWxsZWQoc2lnbmFsKSAmJiBlcnJvciA9PT0gc2lnbmFsPy5yZWFzb247XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgJiYgdGhpcy50cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLnNob3VsZEJyZWFrKSBjYXB0dXJlLmxpbWl0KCdleGVjdXRpb24tYnJva2VuJyk7XG4gICAgY2FwdHVyZS5lbmQoY2FuY2VsbGVkID8gJ2NhbmNlbGxlZCcgOiBzdGF0dXMsIHN0YXR1cyA9PT0gJ2ZhaWxlZCcgPyB0aGlzLmZhaWx1cmVTdGF0ZS5yZXN1bHQgOiB1bmRlZmluZWQpO1xuICAgIHJ1bnRpbWUucmVhZFNvdXJjZXM/LnNlYWwocnVudGltZS5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIG5ldyByb290IGxvZyBvcGVucyB3aXRoOiBuYW1lcyBhbmQgbnVtYmVycyB0aGUgcnVuIGFscmVhZHkgc2VydmVzIOKAlCB0aGUgcnVuLCB0aGUgY2hhcnQsIHRoZSBjb3JyZWxhdGlvbixcbiAgICogdGhlIGRlYWRsaW5lLCB0aGUgZGVjbGFyZWQgYnVkZ2V0LCBhbmQgdGhlIHJ1biBhIGZyZXNoLWV4ZWN1dG9yIHJlc3VtZSBjb250aW51ZXMuIFNlcnZlZCBieSB0aGUgcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuaW5nTWV0YShcbiAgICBjb3JyZWxhdGlvbjogUnVuQ29ycmVsYXRpb24gfCB1bmRlZmluZWQsXG4gICAgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICByZXN1bWVkRnJvbT86IHN0cmluZyxcbiAgKTogTWV0YSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQucm9vdDtcbiAgICBjb25zdCBidWRnZXRNcyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuYnVpbGRUaW1lU3RydWN0dXJlPy5idWRnZXRNcztcbiAgICByZXR1cm4ge1xuICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgIGNoYXJ0OiB7IGlkOiByb290LmlkLCBuYW1lOiByb290Lm5hbWUgfSxcbiAgICAgIC4uLihjb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uIH0pLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIC4uLihidWRnZXRNcyAhPT0gdW5kZWZpbmVkICYmIHsgYnVkZ2V0TXMgfSksXG4gICAgICAuLi4ocmVzdW1lZEZyb20gIT09IHVuZGVmaW5lZCAmJiB7IHJlc3VtZWRGcm9tIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIGNsb3NpbmcgZW50cnkncyBlcnJvcjogdGhlIHJ1bidzIFNFUlZFRCBmb3JtIG9mIGl0LCBpdHMgbmFtZSwgbWVzc2FnZSBhbmQgY29kZSBvbmx5IChuZXZlciBgcmF3YCkuICovXG4gIHByaXZhdGUgY2xvc2luZ0Vycm9yKGVycm9yOiB1bmtub3duKTogTWV0YSB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucmVkYWN0aW9uUnVsZS5zZXJ2ZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihpbmZvLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWU6IGluZm8ubmFtZSB9KSxcbiAgICAgIG1lc3NhZ2U6IGluZm8ubWVzc2FnZSxcbiAgICAgIC4uLihpbmZvLmNvZGUgIT09IHVuZGVmaW5lZCAmJiB7IGNvZGU6IGluZm8uY29kZSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSByZS1lbnRyYW5jeSBndWFyZDogb25lIGV4ZWN1dG9yID0gb25lIGluLWZsaWdodCBleGVjdXRpb24uICovXG4gIHByaXZhdGUgYXNzZXJ0SWRsZShtZXRob2Q6ICdydW4nIHwgJ3Jlc3VtZScpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNFeGVjdXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZsb3dDaGFydEV4ZWN1dG9yOiAke21ldGhvZH0oKSBjYWxsZWQgd2hpbGUgYW5vdGhlciBydW4oKS9yZXN1bWUoKSBpcyBpbiBmbGlnaHQgb24gdGhpcyBgICtcbiAgICAgICAgICAnZXhlY3V0b3IuIEFuIGV4ZWN1dG9yIGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsIGNoZWNrcG9pbnQpIOKAlCBjcmVhdGUgJyArXG4gICAgICAgICAgJ29uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFJlY29yZGVycyAodGhlIHJlZ2lzdGVyIGxpdmVzIGluIGBhdHRhY2gudHNgKSDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgU2NvcGVSZWNvcmRlciB0byBvYnNlcnZlIGRhdGEgb3BlcmF0aW9ucyAocmVhZHMsIHdyaXRlcywgY29tbWl0cylcbiAgICogb24gZXZlcnkgc3RhZ2Ugc2NvcGUuIENhbGwgYmVmb3JlIHJ1bigpLiAqKklkZW1wb3RlbnQgYnkgYGlkYCoqIChyZXBsYWNlZCxcbiAgICogbmV2ZXIgZHVwbGljYXRlZCkuIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIG1vdmVzIGl0IG9mZiB0aGUgaG90IHBhdGgg4oCUXG4gICAqIGRlbGl2ZXJlZCBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludDsgcmUtYXR0YWNoaW5nIGFuIGlkIG9uIHRoZVxuICAgKiBvdGhlciB0aWVyIFNXQVBTIHRpZXJzIChgZG9jcy9ndWlkZXMvb2JzZXJ2ZXJzLWRlZmVycmVkLm1kYCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpOyAvLyByZXBsYWNlcyBzYW1lIGlkXG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmF0dGFjaFNjb3BlKHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIHNjb3BlIFJlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRCDigJQgYm90aCBkZWxpdmVyeSB0aWVycy4gKi9cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZGV0YWNoU2NvcGUoaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBzY29wZSBSZWNvcmRlcnMgKGJvdGggdGllcnMpLiAqL1xuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5zY29wZUxpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLiBBdXRvbWF0aWNhbGx5XG4gICAqIGVuYWJsZXMgbmFycmF0aXZlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuIElkZW1wb3RlbnQgYnkgYGlkYDtcbiAgICogYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgYXMgZm9yIGBhdHRhY2hTY29wZVJlY29yZGVyYC5cbiAgICovXG4gIGF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlcjogRmxvd1JlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoRmxvdyhyZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBGbG93UmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElEIOKAlCBib3RoIGRlbGl2ZXJ5IHRpZXJzLiAqL1xuICBkZXRhY2hGbG93UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmRldGFjaEZsb3coaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzIChib3RoIHRpZXJzKS4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmZsb3dMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdG8gZXZlcnkgY2hhbm5lbCAoc2NvcGUsIGZsb3csIGVtaXQpIGl0IGhhcyBPV04gYG9uKmBcbiAgICogbWV0aG9kcyBmb3Ig4oCUIHByZWZlcnJlZCBvdmVyIHNpbmdsZS1jaGFubmVsIGNhbGxzLCB3aGVyZSBmb3JnZXR0aW5nIG9uZVxuICAgKiBzaWxlbnRseSBsb3NlcyBldmVudHMuIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgYWxsIGNoYW5uZWxzOyBhIGZsb3dcbiAgICogbWV0aG9kIGVuYWJsZXMgdGhlIG5hcnJhdGl2ZTsgYGRlbGl2ZXJ5YCBjb21lcyBmcm9tIHRoZSBvcHRpb25zIG9yIHRoZVxuICAgKiByZWNvcmRlcidzIG93biBmaWVsZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICogICBpZDogJ2F1ZGl0JyxcbiAgICogICBvbldyaXRlOiAoZSkgPT4gbG9nKCdzY29wZSB3cml0ZScsIGUua2V5KSxcbiAgICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nKCdyb3V0ZWQgdG8nLCBlLmNob3NlbiksXG4gICAqIH07XG4gICAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXI6IENvbWJpbmVkUmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5hdHRhY2hDb21iaW5lZChyZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGEgY29tYmluZWQgcmVjb3JkZXIgZnJvbSBldmVyeSBjaGFubmVsIGl0IHdhcyBhdHRhY2hlZCB0byAoc2FmZSBpZiBuZXZlciBhdHRhY2hlZCkuICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gICAgdGhpcy5kZXRhY2hGbG93UmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhbiBgRW1pdFJlY29yZGVyYCBmb3IgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBldmVudHMuIEl0IHJpZGVzXG4gICAqIHRoZSBzY29wZSBsaXN0LCBzbyBgb25FbWl0YCBmaXJlcyBleGFjdGx5IG9uY2UgcGVyIGV2ZW50LiBJZGVtcG90ZW50IGJ5IGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXIgYXMgU2NvcGVSZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGJ5IGlkLiBTYWZlIHRvIGNhbGwgaWYgbmV2ZXIgYXR0YWNoZWQuICovXG4gIGRldGFjaEVtaXRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIChib3RoIHRpZXJzKSB0aGF0IGltcGxlbWVudCBgb25FbWl0YC4gKi9cbiAgZ2V0RW1pdFJlY29yZGVycygpOiBFbWl0UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVSZWNvcmRlcnMoKS5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIDilIAgRGV0YWNoIChUNCkg4pSA4pSA4pSAXG4gIC8vIEJhcmUtZXhlY3V0b3IgZW50cnkgcG9pbnRzIGZvciBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgY2hhcnRzLiBGcm9tIGluc2lkZSBhXG4gIC8vIHN0YWdlIHVzZSBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYCAvIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgLFxuICAvLyB3aGljaCBtaW50IHJlZklkcyBmcm9tIHRoZSBjYWxsaW5nIHN0YWdlOyB0aGVzZSB1c2UgYF9fZXhlY3V0b3JfX2AuXG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCByZXR1cm4gYSBgRGV0YWNoSGFuZGxlYFxuICAgKiB0aGUgY2FsbGVyIGNhbiBgd2FpdCgpYCBvbiAoUHJvbWlzZSkgb3IgcmVhZCBgLnN0YXR1c2AgZnJvbSAoc3luYykuIFRoZVxuICAgKiBkcml2ZXIgaXMgUkVRVUlSRUQg4oCUIHRoZXJlIGlzIG5vIGxpYnJhcnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGV4ZWMgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IocGFyZW50Q2hhcnQpO1xuICAgKiBjb25zdCBoYW5kbGUgPSBleGVjLmRldGFjaEFuZEpvaW5MYXRlcihtaWNyb3Rhc2tCYXRjaERyaXZlciwgdGVsZW1ldHJ5Q2hhcnQsIHsgZXZlbnQ6ICd4JyB9KTtcbiAgICogYXdhaXQgaGFuZGxlLndhaXQoKTsgLy8gb3B0aW9uYWxcbiAgICogYGBgXG4gICAqL1xuICBkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUge1xuICAgIHJldHVybiBfZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIERJU0NBUkQgdGhlIGhhbmRsZSDigJQgZm9yXG4gICAqIGZpcmUtYW5kLWZvcmdldCBzaWRlIGVmZmVjdHMuIEEgY2hpbGQncyBlcnJvciBsYW5kcyBvbiB0aGUgZGlzY2FyZGVkIGhhbmRsZTtcbiAgICogZm9yIG9ic2VydmFibGUgZGV0YWNoIHByZWZlciBgZGV0YWNoQW5kSm9pbkxhdGVyYCArIGAud2FpdCgpLmNhdGNoKClgLlxuICAgKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQge1xuICAgIF9kZXRhY2hBbmRGb3JnZXQoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0b3Itb3duZWQgbmFycmF0aXZlIHZpZXc7IGAubWFwKGUgPT4gZS50ZXh0KWAgZm9yIGZsYXQgc3RyaW5ncy5cbiAgICogYGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zKWAgY29uZmlndXJlcyB0aGlzIHZpZXcuIEF0dGFjaGluZyBhIGZsb3cgcmVjb3JkZXJcbiAgICogYWxzbyBlbmFibGVzIGl0LCBidXQgdGhhdCByZWNvcmRlcidzIG9wdGlvbnMgYW5kIGVudHJpZXMgcmVtYWluIGluZGVwZW5kZW50XG4gICAqIChyZWFkIGFuIGF0dGFjaGVkIGBuYXJyYXRpdmUoKWAgaW5zdGFuY2Ugd2l0aCBgcmVjb3JkZXIuZ2V0RW50cmllcygpYCkuXG4gICAqIFNhbWUtZXhlY3V0b3IgcmVzdW1lIHJldGFpbnMgaGlzdG9yeTsgYSBmcmVzaCBleGVjdXRvciByZWNvcmRzIGl0cyByZXN1bWVkXG4gICAqIGxlZyBvbmx5LiBUaGUgaW50ZXJuYWwgbmFycmF0b3IgaXMgbm90IGFuIGF0dGFjaGVkIHNuYXBzaG90IHJlY29yZGVyIHJvdy5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcnMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmNvbWJpbmVkUmVjb3JkZXIuZ2V0RW50cmllcygpO1xuICAgIH1cbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXMubWFwKCh0ZXh0KSA9PiAoeyB0eXBlOiAnc3RhZ2UnIGFzIGNvbnN0LCB0ZXh0LCBkZXB0aDogMCB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgY2hhcnQuIFJlc29sdmVzIHdoZW4gdGhlIHJ1biBmaW5pc2hlcyDigJQgb3IgcGF1c2VzLCBpZiBhXG4gICAqIHBhdXNhYmxlIHN0YWdlIHJldHVybmVkIGRhdGEgKGNoZWNrIGBpc1BhdXNlZCgpYCBhZnRlcndhcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBgeyBpbnB1dCwgZW52IH1gIOKAlCBgaW5wdXRgIGlzIHRoZSBmcm96ZW4gYnVzaW5lc3MgaW5wdXRcbiAgICogICAocmVhZCBpbiBhIHN0YWdlIHZpYSBgc2NvcGUuJGdldEFyZ3MoKWApOyBgZW52YCBpcyBpbmZyYXN0cnVjdHVyZSBjb250ZXh0XG4gICAqICAgbGlrZSBgeyBzaWduYWwsIHRpbWVvdXRNcywgdHJhY2VJZCB9YCAocmVhZCB2aWEgYHNjb3BlLiRnZXRFbnYoKWApOyBgZGVhZGxpbmVgIC8gYHRpbWVvdXRNc2AgZ2l2ZSB0aGUgcnVuXG4gICAqICAgaXRzIGRlYWRsaW5lIChgZW52LmRlYWRsaW5lYCwgYHNjb3BlLiRhdHRlbXB0KCkudGltZUxlZnRNcygpYCkuXG4gICAqXG4gICAqIEFmdGVyIGl0IHJlc29sdmVzLCByZWFkIHJlc3VsdHMgb2ZmIHRoZSBleGVjdXRvcjpcbiAgICogLSBgZ2V0U25hcHNob3QoKWAg4oCUIGZ1bGwgc3RhdGUsIGNvbW1pdCBsb2csIGV4ZWN1dGlvbiB0cmVlLlxuICAgKiAtIGBnZXROYXJyYXRpdmVFbnRyaWVzKClgIOKAlCB0aGUgcGxhaW4tRW5nbGlzaCB0cmFjZSAoY2FsbCBgZW5hYmxlTmFycmF0aXZlKClgXG4gICAqICAgb3IgYXR0YWNoIGEgYG5hcnJhdGl2ZSgpYCByZWNvcmRlciBmaXJzdCkuXG4gICAqIC0gYGlzUGF1c2VkKClgIOKAlCB0cnVlIGlmIGEgc3RhZ2UgcGF1c2VkOyB0aGVuIHVzZSBgZ2V0Q2hlY2twb2ludCgpYCAvIGByZXN1bWUoKWAuXG4gICAqXG4gICAqIE9uZSBydW4gYXQgYSB0aW1lIHBlciBleGVjdXRvciDigJQgaXQgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycyxcbiAgICogY2hlY2twb2ludCkuIENyZWF0ZSBvbmUgZXhlY3V0b3IgcGVyIGNvbmN1cnJlbnQgcnVuLlxuICAgKi9cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIEEgZmFpbGVkIGVudHJ5IGxlYXZlcyBubyBzaWRlIGVmZmVjdHM6IHRoZSBndWFyZCBGSVJTVCAodGhlIGluLWZsaWdodFxuICAgIC8vIHJ1biBzdGF5cyB1bnRvdWNoZWQpLCB2YWxpZGF0aW9uIGJlZm9yZSB0aGUgdGltZW91dCB0aW1lciBleGlzdHMuXG4gICAgdGhpcy5hc3NlcnRJZGxlKCdydW4nKTtcbiAgICB0aGlzLmZhaWx1cmVTdGF0ZSA9IG5ldyBOYXRpdmVGYWlsdXJlU3RhdGUoKTtcbiAgICB0cnkge1xuICAgICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgICBpZiAodmFsaWRhdGVkSW5wdXQgJiYgdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSkge1xuICAgICAgICB2YWxpZGF0ZWRJbnB1dCA9IHZhbGlkYXRlSW5wdXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSwgdmFsaWRhdGVkSW5wdXQpO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGVudiwgcmVhZCBPTkNFLCBhbmQgdGhlIHJ1bidzIGNvcnJlbGF0aW9uLCBiZWZvcmUgYW55dGhpbmcgbW92ZXM6IGEgcmVmdXNlZCBgdHJhY2VwYXJlbnRgIGxlYXZlcyBub1xuICAgICAgLy8gc2lkZSBlZmZlY3QsIGFuZCB0aGUgc3RhZ2VzIHNlZSB0aGUgc2FtZSBzbmFwc2hvdCB0aGUgY29ycmVsYXRpb24gd2FzIHJlYWQgZnJvbSAoYGFkbWl0UnVuRW52YCkuXG4gICAgICBjb25zdCB7IGVudiwgY29ycmVsYXRpb24gfSA9IGFkbWl0UnVuRW52KG9wdGlvbnM/LmVudik7XG5cbiAgICAgIC8vIFRoZSBydW4ncyBvbmUgc2lnbmFsIGFuZCBpdHMgZGVhZGxpbmUgKGBhcm1SdW5gKTogYHNpZ25hbGAsIGBlbnYuc2lnbmFsYCwgYGRlYWRsaW5lYCAvIGB0aW1lb3V0TXNgIC9cbiAgICAgIC8vIGBlbnYuZGVhZGxpbmVgLCBjb21wb3NlZCBmcm9tIHRoZSBBRE1JVFRFRCBlbnYg4oCUIGFuZCBzdGFtcGVkIG9uIHRoZSBlbnYgc3RhZ2VzIHJlYWQuIEFybWVkIGFmdGVyIHRoZVxuICAgICAgLy8gYWRtaXNzaW9uLCBzbyBhIHJlZnVzZWQgYHRyYWNlcGFyZW50YCBsZWF2ZXMgbm8gdGltZXI7IGRpc3Bvc2VkIG9uIGV2ZXJ5IGV4aXQuXG4gICAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpOyAvLyByZWFkIEJFRk9SRSBhcm1pbmcsIHNvIGB0aW1lb3V0TXNgIGVxdWFsIHRvIHRoZSBkZWNsYXJlZCBidWRnZXQgbmV2ZXIgd2FybnNcbiAgICAgIC8vIFRoZSBydW4ncyByZWNvcmQgKFA2KTogYSBmcmVzaCBvbmUgcGVyIHJ1biDigJQgaXRzIGAnZmFpbCdgIHN0b3AgaXMgb25lIG1vcmUgc291cmNlIG9mIHRoZSBydW4ncyBzaWduYWwuXG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmZsb3dDaGFydEFyZ3Muc2luayAmJiBuZXcgUnVuUmVjb3JkKHRoaXMuZmxvd0NoYXJ0QXJncy5zaW5rKTtcbiAgICAgIGNvbnN0IGFybWVkID0gYXJtUnVuKHtcbiAgICAgICAgc2lnbmFsOiBvcHRpb25zPy5zaWduYWwsXG4gICAgICAgIHRpbWVvdXRNczogb3B0aW9ucz8udGltZW91dE1zLFxuICAgICAgICBkZWFkbGluZTogb3B0aW9ucz8uZGVhZGxpbmUsXG4gICAgICAgIGVudixcbiAgICAgICAgLi4uKHJlY29yZD8uc3RvcFNpZ25hbCAmJiB7IHN0b3A6IHJlY29yZC5zdG9wU2lnbmFsIH0pLFxuICAgICAgfSk7XG4gICAgICAvLyBBIGRlYWRsaW5lIHNob3J0ZXIgdGhhbiB0aGUgY2hhcnQncyBkZWNsYXJlZCBgLmJ1ZGdldChtcylgOiBhIGRldi1tb2RlIHdhcm5pbmcsIG9uY2UgcGVyIGNoYXJ0IChQNSkuXG4gICAgICBkaXNwb3NlT25UaHJvdyhhcm1lZCwgKCkgPT4gd2FybkRlYWRsaW5lVW5kZXJCdWRnZXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydCwgYXJtZWQuZGVhZGxpbmUsIHN0YXJ0ZWRBdCkpO1xuXG4gICAgICB0aGlzLm9ic2VydmVycy5jbGVhckZvclJ1bigpOyAvLyBubyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uXG4gICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTtcbiAgICAgIHRoaXMuX3Zpc2l0Q291bnRzID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuICAgICAgdGhpcy5faGFzUnVuQmVmb3JlID0gdHJ1ZTsgLy8gYSBsYXRlciByZXN1bWUoKSByZXVzZXMgdGhpcyBydW50aW1lXG4gICAgICB0aGlzLnRyYXZlcnNlciA9IGRpc3Bvc2VPblRocm93KGFybWVkLCAoKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZVRyYXZlcnNlcihhcm1lZC5zaWduYWwsIHZhbGlkYXRlZElucHV0LCBhcm1lZC5lbnYsIG9wdGlvbnM/Lm1heERlcHRoLCBvcHRpb25zPy5tYXhJdGVyYXRpb25zLCB7XG4gICAgICAgICAgLi4uKGNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb24gfSksXG4gICAgICAgICAgLi4uKHJlY29yZCAmJiB7IHJlY29yZDogeyBsaW5rOiByZWNvcmQsIG1ldGE6IHRoaXMub3BlbmluZ01ldGEoY29ycmVsYXRpb24sIGFybWVkLmRlYWRsaW5lKSB9IH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICAvLyBTZXQgb25jZSB0aGUgbGVnJ3MgdHJhdmVyc2VyIGV4aXN0cywgc28gYSBzbmFwc2hvdCBuZXZlciBwYWlycyBvbmUgcnVuJ3Mgc3RhdGUgd2l0aCBhbm90aGVyJ3Mgc2luayBzdGF0cy5cbiAgICAgIHRoaXMucmVjb3JkID0gcmVjb3JkO1xuICAgICAgdGhpcy5jYXB0dXJlU2lnbmFsID1cbiAgICAgICAgdGhpcy5mbG93Q2hhcnRBcmdzLmNhcHR1cmVDb3ZlcmFnZSB8fCB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMucmVhZFNvdXJjZXMgPyBhcm1lZC5zaWduYWwgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBBZnRlciBldmVyeSBzeW5jIHRocm93LCB3aXRoIG5vIGF3YWl0IHNpbmNlIHRoZSBndWFyZDogcmFjZS1mcmVlLlxuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2V0dGxlUmVjb3JkZWQoYXJtZWQsIHJlY29yZCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpOiBcIm9uZSBiZWF0IGJlaGluZFwiIG5ldmVyIGJlY29tZXMgXCJsb3N0IGF0IGV4aXRcIi5cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnY29tcGxldGVkJyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBjb25zdCBwYXVzZWQgPSB0aGlzLnBhdXNlZE9yVGhyb3coZXJyb3IpO1xuICAgICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ3BhdXNlZCcpO1xuICAgICAgICByZXR1cm4gcGF1c2VkO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgICAgYXJtZWQuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5maW5pc2goZXJyb3IpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGRlZmVycmVkLW9ic2VydmVyIGJhY2tsb2csIHRoZW4gYXdhaXQgYXN5bmMgbGlzdGVuZXIgY29tcGxldGlvbnNcbiAgICogdW5kZXIgYSBkZWFkbGluZSDigJQgY2FsbCBiZWZvcmUgYSBzZXJ2ZXJsZXNzIHByb2Nlc3MgZnJlZXplcyBvciBleGl0cy5cbiAgICogWmVyb3Mgd2hlbiBubyBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQ7IGBwZW5kaW5nID4gMGAgcmVwb3J0cyB3aGF0XG4gICAqIHdhcyBzdGlsbCBvdXRzdGFuZGluZyBhdCB0aGUgZGVhZGxpbmUuXG4gICAqL1xuICBkcmFpbk9ic2VydmVycyhvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8T2JzZXJ2ZXJEcmFpblJlc3VsdD4ge1xuICAgIGNvbnN0IHRpZXIgPSB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI7XG4gICAgaWYgKCF0aWVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogMCwgZmFpbGVkOiAwLCBwZW5kaW5nOiAwIH0pO1xuICAgIHJldHVybiB0aWVyLmRyYWluKG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHRoZSByZWNvcmQgc2luayAoMTAuMSwgUDYpOiBhd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCDigJQgZm9yIGFuIGV4ZWN1dG9yIGJ1aWx0IHdpdGhcbiAgICogYHNpbms6IHsgYWRhcHRlciwgZmx1c2g6ICdtYW51YWwnIH1gLCBvciBiZWZvcmUgYSBzZXJ2ZXJsZXNzIHByb2Nlc3MgZnJlZXplcy4gYHRpbWVvdXRNc2AgYm91bmRzIHRoZSB3YWl0OyBhXG4gICAqIGZsdXNoIHN0aWxsIHJ1bm5pbmcgdGhlbiBpcyBgcGVuZGluZ2AgKGFuZCBrZWVwcyBydW5uaW5nKS4gQSBmYWlsZWQgZmx1c2ggaXMgY291bnRlZCBvbiBgZ2V0U25hcHNob3QoKS5zaW5rYC5cbiAgICogRG9uZSBhdCBvbmNlIHdpdGhvdXQgYSBzaW5rLCBvciB3aXRoIGFuIGFkYXB0ZXIgdGhhdCBoYXMgbm8gYGZsdXNoYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzaW5rOiB7IGFkYXB0ZXI6IGZpbGVTaW5rKHBhdGgpLCBmbHVzaDogJ21hbnVhbCcgfSB9KTtcbiAgICogYXdhaXQgZXhlY3V0b3IucnVuKCk7XG4gICAqIGF3YWl0IGV4ZWN1dG9yLmZsdXNoUmVjb3JkKHsgdGltZW91dE1zOiAyXzAwMCB9KTtcbiAgICogYGBgXG4gICAqL1xuICBmbHVzaFJlY29yZChvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8UmVjb3JkRmx1c2hSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMucmVjb3JkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLmZsdXNoKG9wdHM/LnRpbWVvdXRNcyk7XG4gIH1cblxuICAvLyDilIDilIDilIAgSW50cm9zcGVjdGlvbiDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBgdHJ1ZWAgc2VydmVzIGBzaGFyZWRTdGF0ZWAgKGFuZCBlYWNoIHN1YmZsb3cnc1xuICAgKiAgIGBnbG9iYWxDb250ZXh0YCkgZnJvbSB0aGUgcmVkYWN0ZWQgbWlycm9yIOKAlCB0aGUgc2FmZSB2aWV3IHRvIGV4cG9ydC4gQVxuICAgKiAgIG5vLW9wIHdpdGhvdXQgYSByZWRhY3Rpb24gcG9saWN5LiBUaGUgY29tbWl0IGxvZyBpcyByZWRhY3RlZCBhdCB3cml0ZVxuICAgKiAgIHRpbWUgcmVnYXJkbGVzcy4gRGVmYXVsdCBgZmFsc2VgLlxuICAgKlxuICAgKiAqKlRyZWF0IGBzaGFyZWRTdGF0ZWAgYXMgUkVBRC1PTkxZLioqIEluIHByb2R1Y3Rpb24gaXQgaXMgYSBsaXZlIHZpZXcgb2ZcbiAgICogZW5naW5lIG1lbW9yeTsgaW4gZGV2IG1vZGUgYSBkZWVwLWZyb3plbiBjbG9uZSwgc28gYSBtdXRhdGlvbiB0aHJvd3MuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBSdW50aW1lU25hcHNob3Qge1xuICAgIHJldHVybiBzZXJ2ZWRTbmFwc2hvdCh0aGlzLnRyYXZlcnNlciwgdGhpcy5vYnNlcnZlcnMsIG9wdGlvbnMsIHRoaXMucmVjb3JkPy5zdGF0cygpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5vYnNlcnZlcnMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldE1hbmlmZXN0KCkgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZnVsbCBzcGVjIGZvciBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgc3ViZmxvdy5cbiAgICogUmVxdWlyZXMgYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIgdGhhdCBvYnNlcnZlZCB0aGUgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgZ2V0U3ViZmxvd1NwZWMoc3ViZmxvd0lkOiBzdHJpbmcpOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMub2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cblxuLyoqIEhvdyBsb25nIGEgcnVuJ3Mgb3duIGZsdXNoIG1heSB0YWtlOiB0aGUgcnVuJ3MgdGltZSBsZWZ0IChhdCBsZWFzdCAxIHMpLCBuZXZlciBwYXN0IHtAbGluayBBVVRPX0ZMVVNIX01TfS4gKi9cbmZ1bmN0aW9uIGF1dG9GbHVzaE1zKGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEFVVE9fRkxVU0hfTVMgOiBNYXRoLm1pbihBVVRPX0ZMVVNIX01TLCBNYXRoLm1heCgxXzAwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG59XG5cbi8qKiBUaGUgYm91bmQgb24gYSBydW4ncyBvd24gZmx1c2ggd2hlbiBpdCBoYXMgbm8gZGVhZGxpbmU6IDMwIHMuICovXG5jb25zdCBBVVRPX0ZMVVNIX01TID0gMzBfMDAwO1xuXG4vKiogUnVuIGBidWlsZGA7IGlmIGl0IHRocm93cywgcmVsZWFzZSB0aGUgYXJtZWQgcnVuIGZpcnN0IChubyBkZWFkbGluZSB0aW1lciBvdXRsaXZlcyBhIHJlZnVzZWQgZW50cnkpLiAqL1xuZnVuY3Rpb24gZGlzcG9zZU9uVGhyb3c8VD4oYXJtZWQ6IEFybWVkUnVuLCBidWlsZDogKCkgPT4gVCk6IFQge1xuICB0cnkge1xuICAgIHJldHVybiBidWlsZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFybWVkLmRpc3Bvc2UoKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl19
|
|
878
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxrQkFBa0IsSUFBSSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBS3BILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRTdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQy9FLE9BQU8sRUFRTCxhQUFhLEdBQ2QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQStCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQTRCLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFpQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEQsT0FBTyxFQUF3QixnQkFBZ0IsRUFBRSxNQUFN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QUNoQixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICpcbiAqIFRoZSBleGVjdXRvciBjb21wb3NlcyBmb3VyIG1vZHVsZXMsIG9uZSBqb2IgZWFjaCAoRjkpOiBgYXR0YWNoLnRzYCAod2hvXG4gKiBvYnNlcnZlcyBhIHJ1biksIGByZXN1bWUudHNgIChwbGFuIGFuZCBhbm5vdW5jZSBhIHJlLWVudHJ5KSwgYGNoZWNrcG9pbnQudHNgXG4gKiAodGhlIHBhdXNlIGNoZWNrcG9pbnQpLCBgc25hcHNob3QudHNgICh3aGF0IGBnZXRTbmFwc2hvdCgpYCBzZXJ2ZXMpLiBXaGF0XG4gKiBzdGF5cyBoZXJlIGlzIHRoZSBwZXItcnVuIHN0YXRlIGFuZCB0aGUgcnVuIGxpZmVjeWNsZSB0aGF0IHRocmVhZHMgaXQuXG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0OiBkYXRhLCBlbnY6IHsgdHJhY2VJZDogJ3JlcS0xMjMnIH0gfSk7XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlLCBMb2dPdXRjb21lLCBNZXRhIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgYWRtaXRSdW5FbnYgfSBmcm9tICcuLi9hdHRlbXB0L2NvcnJlbGF0aW9uLmpzJztcbmltcG9ydCB7IGlzQ2FuY2VsbGVkIH0gZnJvbSAnLi4vYXR0ZW1wdC9kZWFkbGluZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1bkNvcnJlbGF0aW9uIH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgeyB3YXJuRGVhZGxpbmVVbmRlckJ1ZGdldCB9IGZyb20gJy4uL2J1ZGdldC9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGV0YWNoQW5kRm9yZ2V0IGFzIF9kZXRhY2hBbmRGb3JnZXQsIGRldGFjaEFuZEpvaW5MYXRlciBhcyBfZGV0YWNoQW5kSm9pbkxhdGVyIH0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3JSZXN1bHQsXG4gIHR5cGUgUGF1c2VkUmVzdWx0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgZGVmYXVsdExvZ2dlcixcbn0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgVGVybWluYWxGYWlsdXJlQ29udGV4dCwgTmF0aXZlRmFpbHVyZVN0YXRlIH0gZnJvbSAnLi4vZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRUcmFja2luZ01vZGUsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgcnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuLi9yZWNvcmRlci9FbWl0UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB7IFJ1bk9ic2VydmVycyB9IGZyb20gJy4vYXR0YWNoLmpzJztcbmltcG9ydCB7IHR5cGUgQ2FwdHVyZUhpc3RvcnlMZWFzZSwgcGVyc2lzdENhcHR1cmVIaXN0b3J5IH0gZnJvbSAnLi9jYXB0dXJlSGlzdG9yeS5qcyc7XG5pbXBvcnQgeyBidWlsZFBhdXNlQ2hlY2twb2ludCB9IGZyb20gJy4vY2hlY2twb2ludC5qcyc7XG5pbXBvcnQgeyB0eXBlIEFybWVkUnVuLCBhcm1SdW4gfSBmcm9tICcuL2RlYWRsaW5lLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0YWNoUmVjb3JkZXJPcHRpb25zLCBPYnNlcnZlckRyYWluUmVzdWx0IH0gZnJvbSAnLi9EZWZlcnJlZE9ic2VydmVyVGllci5qcyc7XG5pbXBvcnQgeyB0eXBlIFJ1bnRpbWVTbmFwc2hvdCwgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgeyB0eXBlIEV4ZWN1dG9yQXJncywgdHlwZSBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMsIHJlc29sdmVFeGVjdXRvckFyZ3MgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWNvcmRGbHVzaFJlc3VsdCwgUnVuUmVjb3JkIH0gZnJvbSAnLi9yZWNvcmRTaW5rLmpzJztcbmltcG9ydCB7IGFubm91bmNlUmVzdW1lLCBwbGFuUmVzdW1lLCBzZWVkQ291bnRlcnMgfSBmcm9tICcuL3Jlc3VtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJ1bklkIH0gZnJvbSAnLi9ydW5JZC5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRTbmFwc2hvdCB9IGZyb20gJy4vc25hcHNob3QuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnB1dCB9IGZyb20gJy4vdmFsaWRhdGVJbnB1dC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGFuZCBwZXItc3RhZ2UgdmlzaXQgY291bnRzIChsb29wSXRlcmF0aW9uKSDigJQgc2hhcmVkIEJZXG4gICAqICBSRUZFUkVOQ0Ugd2l0aCBldmVyeSB0cmF2ZXJzZXIgb2YgdGhlIHJ1bjsgc3Vydml2ZSBwYXVzZS9yZXN1bWUsIHJlc2V0IG9uIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICBwcml2YXRlIF92aXNpdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBGcmVzaCBwZXIgcnVuKCkgYW5kIHBlciByZXN1bWUoKSDigJQgc3RhbXBlZCBvbiBldmVyeSBUcmF2ZXJzYWxDb250ZXh0IChgcnVuSWQudHNgKS4gKi9cbiAgcHJpdmF0ZSBfY3VycmVudFJ1bklkID0gJyc7XG4gIC8qKiBXaG8gb2JzZXJ2ZXMgdGhlIHJ1biDigJQgbmFycmF0aXZlLCBpbmxpbmUgbGlzdHMsIGRlZmVycmVkIHRpZXIgKGBhdHRhY2gudHNgKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvYnNlcnZlcnMgPSBuZXcgUnVuT2JzZXJ2ZXJzKCk7XG4gIHByaXZhdGUgcmVkYWN0aW9uUG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcnVuJ3MgT05FIHJlZGFjdGlvbiBydWxlIChgbWVtb3J5L3JlZGFjdGlvbi50c2ApLCBidWlsdCBmcmVzaCBwZXIgbGVnLiAqL1xuICBwcml2YXRlIHJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZSgpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgcnVuKCkgKG9yIGEgcmVzdW1lKSBleGVjdXRlZCBoZXJlLiBgcmVzdW1lKClgIGJyYW5jaGVzIG9uIGl0OlxuICAgKiB0cnVlIOKGkiByZXVzZSB0aGUgcnVudGltZSAoZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlIGFjY3VtdWxhdGUpO1xuICAgKiBmYWxzZSDihpIgc2VlZCBhIGZyZXNoIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWAgKGNyb3NzLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSkuIFNlZSBgdGVzdC9saWIvcGF1c2UvY3Jvc3MtZXhlY3V0b3ItcmVzdW1lLnRlc3QudHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFzUnVuQmVmb3JlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZS1lbnRyYW5jeSBndWFyZDogcnVuKCkvcmVzdW1lKCkgbXV0YXRlIHBlci1ydW4gc3RhdGUgKHRyYXZlcnNlciwgcnVuSWQsXG4gICAqIGNvdW50ZXJzLCBjaGVja3BvaW50LCByZWNvcmRlcnMpIOKAlCBvbmUgZXhlY3V0b3IgPSBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbi5cbiAgICogU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC5cbiAgICovXG4gIHByaXZhdGUgX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY2FwdHVyZVNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIGNhcHR1cmVIaXN0b3J5TGVhc2U/OiBDYXB0dXJlSGlzdG9yeUxlYXNlO1xuICBwcml2YXRlIGZhaWx1cmVTdGF0ZSA9IG5ldyBOYXRpdmVGYWlsdXJlU3RhdGUoKTtcblxuICAvKiogU2FmZSBuYXRpdmUgY29udGV4dCBmb3IgdGhlIGxhdGVzdCByZWplY3RlZCBsZWc7IHVuZGVmaW5lZCBiZWZvcmUsIGR1cmluZywgYWZ0ZXIgc3VjY2VzcyBvciBwYXVzZS4gKi9cbiAgZ2V0RmFpbHVyZUNvbnRleHQoKTogVGVybWluYWxGYWlsdXJlQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZVN0YXRlLnJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczogRXhlY3V0b3JBcmdzPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgb2YgdGhlIGN1cnJlbnQgcnVuICgxMC4xLCBQNikg4oCUIHRoZSBzaW5rIGV2ZXJ5IGxvZyBvZiB0aGUgcnVuIHdyaXRlcyB0bywgaXRzXG4gICAqIGFjY291bnRpbmcgYW5kIGl0cyBmYWlsdXJlIG1vZGUuIEZyZXNoIHBlciBgcnVuKClgIGFuZCBwZXIgZnJlc2gtZXhlY3V0b3IgcmVzdW1lOyBhIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGtlZXBzXG4gICAqIGl0LCBhcyBpdCBrZWVwcyB0aGUgcm9vdCBsb2cuIEFic2VudCB3aXRob3V0IGEgYHNpbmtgIG9wdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkOiBSdW5SZWNvcmQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogKioyLXBhcmFtIGZvcm0qKiAoYWxzbyBzdXBwb3J0ZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZsb3dDaGFydCAtIFRoZSBjb21waWxlZCBGbG93Q2hhcnQgcmV0dXJuZWQgYnkgYGZsb3dDaGFydCguLi4pLmJ1aWxkKClgXG4gICAqIEBwYXJhbSBmYWN0b3J5T3JPcHRpb25zIC0gQSBgU2NvcGVGYWN0b3J5PFRTY29wZT5gIE9SIGEgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+YCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgZmFjdG9yeU9yT3B0aW9ucz86IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT4sXG4gICkge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHJlc29sdmVFeGVjdXRvckFyZ3MoZmxvd0NoYXJ0LCBmYWN0b3J5T3JPcHRpb25zKTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMuanMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiB7XG4gICAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgICBwcmVzZXJ2ZVJlY29yZGVycz86IGJvb2xlYW47XG4gICAgICBleGlzdGluZ1J1bnRpbWU/OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgICAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYHJlc3VtZS50c2ApOyB0aGUgdHJhdmVyc2VyIHN0aWxsIHdhbGtzIHRoZSBSRUFMIGNoYXJ0LiAqL1xuICAgICAgcmVzdW1lPzogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbiAgICAgIC8qKiBUaGUgcmVkYWN0aW9uIHRoZSBwYXVzZWQgcnVuIGhhZCBtYWRlIChuYW1lcyBvbmx5KSDigJQgdGhlIHJlc3VtZWQgbGVnJ3MgcnVsZSBzdGFydHMgZnJvbSBpdC4gKi9cbiAgICAgIHJlZGFjdGlvbk1hcmtzPzogUmVkYWN0aW9uTWFya3M7XG4gICAgICAvKiogVGhlIGxlZydzIGNvcnJlbGF0aW9uLCByZXNvbHZlZCBmcm9tIGl0cyBlbnYgYmVmb3JlIGFueXRoaW5nIG1vdmVkIChgcmVzb2x2ZUNvcnJlbGF0aW9uYCkuICovXG4gICAgICBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuICAgICAgLyoqIFRoZSBsZWcncyByZWNvcmQgKDEwLjEsIFA2KTogaXRzIHNpbmssIGFuZCB0aGUgbWV0YSBhIE5FVyByb290IGxvZyBvcGVucyB3aXRoLiAqL1xuICAgICAgcmVjb3JkPzogeyBsaW5rOiBSdW5SZWNvcmQ7IG1ldGE/OiBNZXRhIH07XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5vYnNlcnZlcnMuc3RhcnRMZWcoZmMuZW5hYmxlTmFycmF0aXZlID8/IGZhbHNlLCBvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzID09PSB0cnVlKTtcblxuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKHRoaXMucmVkYWN0aW9uUG9saWN5KTtcbiAgICAvLyBBIHJlc3VtZSBjb250aW51ZXMgdGhlIHBhdXNlZCBydW4ncyByZWRhY3Rpb246IGEgY29weSBtYXNrZWQgYmVmb3JlIHRoZSBwYXVzZSBzdGF5cyBtYXNrZWQuXG4gICAgaWYgKG92ZXJyaWRlcz8ucmVkYWN0aW9uTWFya3MpIHRoaXMucmVkYWN0aW9uUnVsZS5yZXN0b3JlTWFya3Mob3ZlcnJpZGVzLnJlZGFjdGlvbk1hcmtzKTtcbiAgICAvLyBUaGUgcmVjb3JkIGlzIHNlcnZlZCB1bmRlciB0aGlzIGxlZydzIHJ1bGUg4oCUIGJlZm9yZSB0aGUgcm9vdCBsb2cgYmVsb3cgb3BlbnMgKGl0cyBiYXNlLCBpdHMgbWV0YSkuXG4gICAgb3ZlcnJpZGVzPy5yZWNvcmQ/LmxpbmsudXNlUnVsZSh0aGlzLnJlZGFjdGlvblJ1bGUpO1xuICAgIC8vIE9ORSBmYWN0b3J5OiB0aGUgYmFzZSBmYWN0b3J5LCB0aGVuIGV2ZXJ5IHNjb3BlIG1vZGlmaWVyIChyZWNvcmRlcnMsXG4gICAgLy8gZGVmZXJyZWQgdGFwLCByZWRhY3Rpb24pIGluIGEgZmxhdCBwYXNzIOKAlCBzZWUgYFJ1bk9ic2VydmVyc2AuXG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gdGhpcy5vYnNlcnZlcnMuY29tcG9zZVNjb3BlRmFjdG9yeShcbiAgICAgIGFyZ3Muc2NvcGVGYWN0b3J5LFxuICAgICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3ksXG4gICAgICB0aGlzLnJlZGFjdGlvblJ1bGUubWFya2VkS2V5cygpLFxuICAgICAgb3ZlcnJpZGVzPy5jb3JyZWxhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVGhlIGZpcnN0IHN0YWdlIHRoaXMgdHJhdmVyc2FsIHJ1bnM6IHRoZSByZXN1bWUncyBlbnRyeSwgZWxzZSB0aGUgY2hhcnQgcm9vdC5cbiAgICBjb25zdCBlZmZlY3RpdmVSb290ID0gb3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0ID8/IGZjLnJvb3Q7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQgPSBvdmVycmlkZXM/LmluaXRpYWxDb250ZXh0ID8/IGFyZ3MuaW5pdGlhbENvbnRleHQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSk6IHRoZSBkaWFscywgdGhlIHJ1bGUgKGluc3RhbGxlZCBldmVuIHdpdGhvdXQgYVxuICAgIC8vIHBvbGljeSDigJQgcGVyLWNhbGwgYHNldFZhbHVlKGssIHYsIHRydWUpYCBtYXJrcyBsaXZlIG9uIGl0KSBhbmQgdGhlIG1pcnJvclxuICAgIC8vIGZsYWcgKGEgcmVkYWN0ZWQgaGVhcCwga2VwdCBvbmx5IHVuZGVyIGEgcG9saWN5KSwgT05FIGZyb3plbiBvYmplY3QgcGVyXG4gICAgLy8gbGVnIHRoYXQgZXZlcnkgZnJhbWUgb2YgdGhlIHJ1biBob2xkcyBieSByZWZlcmVuY2UuXG4gICAgY29uc3QgcG9saWN5ID0gcnVuUG9saWN5KGFyZ3MuZGlhbHMsIHRoaXMucmVkYWN0aW9uUnVsZSwgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgIT09IHVuZGVmaW5lZCk7XG5cbiAgICBsZXQgcnVudGltZTogRXhlY3V0aW9uUnVudGltZTtcbiAgICBpZiAob3ZlcnJpZGVzPy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgIC8vIFNhbWUtZXhlY3V0b3IgcmVzdW1lOiB0aGUgdHJlZSBjb250aW51ZXMgZnJvbSB0aGUgbGVhZjsgZ2V0U25hcHNob3QoKSBrZWVwcyB0aGUgZnVsbCB0cmVlLlxuICAgICAgcnVudGltZSA9IG92ZXJyaWRlcy5leGlzdGluZ1J1bnRpbWU7XG4gICAgICBydW50aW1lLnByZXNlcnZlU25hcHNob3RSb290KCk7XG4gICAgICBsZXQgbGVhZiA9IHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICAgIHdoaWxlIChsZWFmLm5leHQpIGxlYWYgPSBsZWFmLm5leHQ7XG4gICAgICBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBsZWFmLmNyZWF0ZU5leHQoJycsIGVmZmVjdGl2ZVJvb3QubmFtZSwgZWZmZWN0aXZlUm9vdC5pZCk7XG4gICAgICBydW50aW1lLnVzZVBvbGljeShwb2xpY3kpO1xuICAgICAgcnVudGltZS5yZXN1bWVSZWFkU291cmNlcyh0aGlzLl9jdXJyZW50UnVuSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZWNvcmQgPSBvdmVycmlkZXM/LnJlY29yZDtcbiAgICAgIHJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZShcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5uYW1lLFxuICAgICAgICBlZmZlY3RpdmVSb290LmlkLFxuICAgICAgICBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgICBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCxcbiAgICAgICAgcG9saWN5LFxuICAgICAgICAvLyBBIHJvb3QgbG9nIHRoYXQgd3JpdGVzIHRvIHRoZSBzaW5rIG9wZW5zIGF0IGBbcnVuSWRdYCDigJQgdGhlIGFkZHJlc3MgdGhlIGVuZ2luZSBiaW5kcyBpdCB0byBhbnl3YXkuXG4gICAgICAgIHJlY29yZCAmJiB7XG4gICAgICAgICAgc2luazogcmVjb3JkLmxpbmsuc2luayxcbiAgICAgICAgICBhZGRyZXNzOiB7IGxvZ1J1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsIGRyaWxsUGF0aDogW10gfSxcbiAgICAgICAgICAuLi4ocmVjb3JkLm1ldGEgJiYgeyBtZXRhOiByZWNvcmQubWV0YSB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5fY3VycmVudFJ1bklkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgICAgICAgIC8vIFRoaXMgbmV3IGhlYXAvbG9nIG93bnMgb25seSB0aGUgcmVzdW1lZCBzZWdtZW50LiBUaGUgcmVzdG9yZWQgc3RhdGUgaXMgaXRzIGJhc2U7XG4gICAgICAgICAgICAgIC8vIGl0cyBlYXJsaWVyIHdyaXRlci9vY2N1cnJlbmNlcyBhcmUgbm90IGluIHRoaXMgbG9nLlxuICAgICAgICAgICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWUgJiYgeyBoaXN0b3J5T21pdHRlZDogdHJ1ZSB9KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSA9IHRoaXMuZmFpbHVyZVN0YXRlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0cmF2ZXJzZXIgPSBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgICAvLyBBbHdheXMgdGhlIFJFQUwgY2hhcnQ7IGEgcmVzdW1lIG9ubHkgbW92ZXMgd2hlcmUgdGhlIHRyYXZlcnNhbCBTVEFSVFMsIG9uY2UuXG4gICAgICAgIHJvb3Q6IGZjLnJvb3QsXG4gICAgICAgIC4uLihvdmVycmlkZXM/LnJlc3VtZT8uc3RhcnQgJiYgeyBlbnRyeTogb3ZlcnJpZGVzLnJlc3VtZS5zdGFydCB9KSxcbiAgICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lPy5zdGFydFBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBvdmVycmlkZXMucmVzdW1lLnN0YXJ0UGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lICYmIHsgcmVzdW1lOiBvdmVycmlkZXMucmVzdW1lIH0pLFxuICAgICAgICBzdGFnZU1hcDogZmMuc3RhZ2VNYXAsXG4gICAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiByZWFkT25seUNvbnRleHRPdmVycmlkZSA/PyBhcmdzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogYXJncy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogZmMuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgICBzaWduYWwsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogZW52LFxuICAgICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLm9ic2VydmVycy5mbG93UmVjb3JkZXJzTGlzdCgpLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLFxuICAgICAgICB2aXNpdENvdW50czogdGhpcy5fdmlzaXRDb3VudHMsXG4gICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgIC4uLihvdmVycmlkZXM/LmNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb246IG92ZXJyaWRlcy5jb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgLi4uKG1heERlcHRoICE9PSB1bmRlZmluZWQgJiYgeyBtYXhEZXB0aCB9KSxcbiAgICAgICAgLi4uKG1heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnMgfSksXG4gICAgICB9KTtcbiAgICAgIGlmICgoYXJncy5jYXB0dXJlQ292ZXJhZ2UgfHwgcG9saWN5LnJlYWRTb3VyY2VzKSAmJiB0aGlzLl9jdXJyZW50UnVuSWQpIHJ1bnRpbWUuYmVnaW5DYXB0dXJlKHRoaXMuX2N1cnJlbnRSdW5JZCk7XG4gICAgICByZXR1cm4gdHJhdmVyc2VyO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBBIHJlZnVzZWQgbGVnIHdob3NlIHJvb3QgbG9nIGFscmVhZHkgb3BlbmVkIHNheXMgc286IGl0cyByZWNvcmQgaXMgY2xvc2VkLCBuZXZlciBsZWZ0IGxvb2tpbmcgY3Jhc2hlZC5cbiAgICAgIGlmIChvdmVycmlkZXM/LnJlY29yZCAmJiAhb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZSkge1xuICAgICAgICBydW50aW1lLmNsb3NlUmVjb3JkKCdmYWlsZWQnLCB7IHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsIGVycm9yOiB0aGlzLmNsb3NpbmdFcnJvcihlcnJvcikgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBlbmFibGVOYXJyYXRpdmUob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZW5hYmxlTmFycmF0aXZlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIGByZWFkVHJhY2tpbmdgIGRpYWwgKHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLnJlYWRUcmFja2luZ30pLiBDYWxsIGJlZm9yZSBydW4oKS4gKi9cbiAgc2V0UmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMgPSB7IC4uLnRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscywgcmVhZFRyYWNraW5nOiBtb2RlIH07XG4gIH1cblxuICAvKiogVGhlIGB3cml0ZVRyYWNraW5nYCBkaWFsIChzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRXcml0ZVRyYWNraW5nKG1vZGU6IFdyaXRlVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzID0geyAuLi50aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMsIHdyaXRlVHJhY2tpbmc6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKiBUaGUgYGNvbW1pdFZhbHVlc2AgZGlhbCAoc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMuY29tbWl0VmFsdWVzfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRDb21taXRWYWx1ZXMobW9kZTogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscyA9IHsgLi4udGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzLCBjb21taXRWYWx1ZXM6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3Rpb25SdWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBhdXNlL1Jlc3VtZSDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hlY2twb2ludCBmcm9tIHRoZSBtb3N0IHJlY2VudCBwYXVzZWQgZXhlY3V0aW9uLCBvciBgdW5kZWZpbmVkYFxuICAgKiBpZiB0aGUgbGFzdCBydW4gY29tcGxldGVkIHdpdGhvdXQgcGF1c2luZy5cbiAgICpcbiAgICogSlNPTi1zZXJpYWxpemFibGUgKHN0b3JlIGl0IGluIFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdl4oCmKSBhbmQgZnVsbHlcbiAgICogREVUQUNIRUQgZnJvbSBlbmdpbmUgc3RhdGUgKGBjaGVja3BvaW50LnRzYCk6IG11dGF0aW5nIG9yIHBlcnNpc3RpbmcgaXRcbiAgICogY2Fubm90IGFmZmVjdCB0aGUgZXhlY3V0b3IsIG5vciBhIGxhdGVyIHJlc3VtZSBhIGNoZWNrcG9pbnQgeW91IHN0b3JlZC5cbiAgICogTEVBTjogd2hhdCBgcmVzdW1lKClgIHJlYWRzIGFuZCB0aGUgcGF1c2UncyBvd24gcmVjb3JkIOKAlCBpdHMgc2l6ZSBpcyB0aGVcbiAgICogc3RhdGUncywgbmV2ZXIgdGhlIHJ1bidzIGxlbmd0aC4gVGhlIHJ1bidzIGhpc3RvcnkgKGV4ZWN1dGlvbiB0cmVlLFxuICAgKiBjb21taXQgbG9nLCBzdWJmbG93IHJlc3VsdHMpIGlzIHtAbGluayBnZXRTbmFwc2hvdH0ncy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAgICogaWYgKGV4ZWN1dG9yLmlzUGF1c2VkKCkpIHtcbiAgICogICBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogICBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGVja3BvaW50KCk6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBtb3N0IHJlY2VudCBydW4oKSB3YXMgcGF1c2VkIChjaGVja3BvaW50IGF2YWlsYWJsZSkuICovXG4gIGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIFJPT1QgbG9nIG5vdy4gTygxKSwgbm8gc25hcHNob3QgbWF0ZXJpYWxpemF0aW9uLlxuICAgKiBOb3QgYW4gZW1pdHRlZCBldmVudCdzIHNvdXJjZSBwb3NpdGlvbjogYSBkZWZlcnJlZCBjYWxsYmFjayBydW5zIGxhdGVyXG4gICAqIGFuZCBhIHN1YmZsb3cgb3ducyBhbm90aGVyIGxvZy4gVXNlIEVtaXRFdmVudC5zb3VyY2VQb3NpdGlvbiBmb3IgdGhhdC5cbiAgICpcbiAgICogUmV0dXJucyAwIGJlZm9yZSBhbnkgcnVuLiBBIGZyZXNoIHJ1biByZXNldHMgdGhlIGxvZzsgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSBjb250aW51ZXMgaXQuIEEgZnJlc2gtZXhlY3V0b3IgcmVzdW1lIHN0YXJ0cyBhIG5ldyBsb2NhbCBsb2cuXG4gICAqIEFsd2F5cyBlcXVhbHMgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nLmxlbmd0aGAgKHRoZSBsb2cgaXMgdGhlXG4gICAqIGBFdmVudExvZ2AncyBgZXhlY3V0aW9uSGlzdG9yeWA7IHRoZSBzbmFwc2hvdCBzZXJ2ZXMgYSBmcm96ZW4gY29weSkuXG4gICAqL1xuICBnZXRDb21taXRDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcnVudGltZT8uZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIHJ1bnMgdGhlIHBhdXNlZCBzdGFnZSdzIGByZXN1bWVGbmAgd2l0aCB0aGUgaW5wdXRcbiAgICogKGFuIGBpbnRlcnJ1cHQoKWAgcGF1c2UgcmUtcnVucyB0aGUgc3RhZ2Ugd2l0aCB0aGUgYW5zd2VyKSwgdGhlbiBjb250aW51ZXNcbiAgICogd2l0aCB3aGF0ZXZlciByYW4gYWZ0ZXIgdGhhdCBzdGFnZSBvbiB0aGUgcnVuIOKAlCBpdHMgYG5leHRgLCBvciBpdHNcbiAgICogZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiwgYXQgZXZlcnkgbGV2ZWwgb2YgdGhlIHBhdXNlIHBhdGguIFBhcmFsbGVsXG4gICAqIHNpYmxpbmdzIHRoYXQgcGF1c2VkIHRvZ2V0aGVyIChgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCkgYXJlIGFza2VkIGluXG4gICAqIHR1cm47IHRoZSBqb2luIHJ1bnMgYWZ0ZXIgdGhlIGxhc3QgYW5zd2VyLiBTZWUgYFJlc3VtZUVudHJ5YC5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgY29tZXMgZnJvbSBgZ2V0Q2hlY2twb2ludCgpYCBvciBmcm9tIHN0b3JhZ2UuIE9uIHRoZSBTQU1FXG4gICAqIGV4ZWN1dG9yLCBuYXJyYXRpdmUvcmVjb3JkZXIgc3RhdGUgYWNjdW11bGF0ZXMgYWNyb3NzIHRoZSBwYXVzZTsgb24gYVxuICAgKiBGUkVTSCBleGVjdXRvciBpdCBzdGFydHMgZW1wdHkuIEEgZnJlc2ggYHJ1bklkYCBlaXRoZXIgd2F5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFByb2Nlc3MgQSDigJQgYWZ0ZXIgYSBwYXVzZSwgcGVyc2lzdCB0aGUgY2hlY2twb2ludDpcbiAgICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICpcbiAgICogLy8gUHJvY2VzcyBCIChwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyLCBzYW1lIGNoYXJ0KSDigJQgcmVzdG9yZSBhbmQgcmVzdW1lOlxuICAgKiBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShyZXN0b3JlZCwgeyBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXN1bWUoXG4gICAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgICByZXN1bWVJbnB1dD86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFBpY2s8UnVuT3B0aW9ucywgJ3NpZ25hbCcgfCAnZW52JyB8ICdtYXhEZXB0aCcgfCAnbWF4SXRlcmF0aW9ucycgfCAnZGVhZGxpbmUnIHwgJ3RpbWVvdXRNcyc+LFxuICApOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgdGhpcy5hc3NlcnRJZGxlKCdyZXN1bWUnKTtcbiAgICB0aGlzLmZhaWx1cmVTdGF0ZSA9IG5ldyBOYXRpdmVGYWlsdXJlU3RhdGUoKTtcbiAgICB0cnkge1xuICAgICAgLy8gRXZlcnkgcmVmdXNhbCBoYXBwZW5zIGluIHRoZSBwbGFuIOKAlCBiZWZvcmUgYW55IHN0YXRlIGJlbG93IGlzIHRvdWNoZWQsXG4gICAgICAvLyBzbyBhIHJlamVjdGVkIGNoZWNrcG9pbnQgbGVhdmVzIHRoZSBleGVjdXRvciAoYW5kIGl0cyBjaGVja3BvaW50KSBhcyBpdCB3YXMuXG4gICAgICBjb25zdCBwbGFuID0gcGxhblJlc3VtZSh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LCBjaGVja3BvaW50LCByZXN1bWVJbnB1dCk7XG4gICAgICAvLyBUaGUgcmVzdW1lZCBsZWcncyBlbnYsIHJlYWQgT05DRSwgYW5kIGl0cyBPV04gY29ycmVsYXRpb24g4oCUIHJlZnVzZWQgaGVyZSwgYmVmb3JlIGFueSBzdGF0ZSBtb3Zlcy4gTmV2ZXJcbiAgICAgIC8vIHRoZSBwYXVzZWQgbGVnJ3M6IHRoZSBjaGVja3BvaW50IGNhcnJpZXMgbm9uZS5cbiAgICAgIGNvbnN0IHsgZW52LCBjb3JyZWxhdGlvbiB9ID0gYWRtaXRSdW5FbnYob3B0aW9ucz8uZW52KTtcbiAgICAgIC8vIE1VU1QgcHJlY2VkZSB0aGUgY291bnRlciByZWFkIGluIGBhbm5vdW5jZVJlc3VtZWAgYW5kIHRoZSB0cmF2ZXJzZXIsXG4gICAgICAvLyB3aGljaCB0YWtlcyBib3RoIGNvdW50ZXJzIEJZIFJFRkVSRU5DRS5cbiAgICAgIHNlZWRDb3VudGVycyhwbGFuLmNoZWNrcG9pbnQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIHRoaXMuX3Zpc2l0Q291bnRzKTtcbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFNhbWUgZXhlY3V0b3I6IHJldXNlIHRoZSBydW50aW1lLiBGcmVzaCBleGVjdXRvcjogc2VlZCBhIE5FVyBvbmUgZnJvbVxuICAgICAgLy8gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgLiBFaXRoZXIgd2F5IGEgTkVXIHJ1bklkIChhIGRpc3RpbmN0IGxvZ2ljYWwgcnVuKS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nUnVudGltZSA9IHRoaXMuX2hhc1J1bkJlZm9yZVxuICAgICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhbnkgcGF0aCB0aGF0IHJlc3VtZXMgY291bnRzIGFzIGEgcnVuXG4gICAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7XG4gICAgICAvLyBUaGUgcmVjb3JkIChQNik6IHRoZSBzYW1lIGV4ZWN1dG9yIGNvbnRpbnVlcyBpdHMgcm9vdCBsb2csIGFuZCBpdHMgc2luazsgYSBmcmVzaCBvbmUgb3BlbnMgYSBuZXcgcm9vdCBsb2cuXG4gICAgICBjb25zdCBzaW5rT3B0aW9uID0gdGhpcy5mbG93Q2hhcnRBcmdzLnNpbms7XG4gICAgICBjb25zdCByZXVzZWQgPSBleGlzdGluZ1J1bnRpbWUgJiYgdGhpcy5yZWNvcmQgPyB0aGlzLnJlY29yZCA6IHVuZGVmaW5lZDtcbiAgICAgIHJldXNlZD8uYmVnaW5MZWcoKTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHNpbmtPcHRpb24gJiYgKHJldXNlZCA/PyBuZXcgUnVuUmVjb3JkKHNpbmtPcHRpb24pKTtcbiAgICAgIGNvbnN0IHJlc3VtZWRGcm9tID0gcGxhbi5jaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbj8ucnVuSWQ7XG5cbiAgICAgIC8vIEEgcmVzdW1lZCBsZWcgaGFzIGl0cyBvd24gZGVhZGxpbmUgKHBlciBsZWcsIGxpa2UgdGhlIGxvb3AgYnVkZ2V0KTogb25seSB3aGF0IGlzIHBhc3NlZCBIRVJFLiBBcm1lZCBmcm9tIHRoZVxuICAgICAgLy8gZW52IGFzIGFkbWl0dGVkIChgYWRtaXRSdW5FbnZgLCBvbmUgcmVhZCksIHNvIHRoZSBkZWFkbGluZSBhbmQgdGhlIGNvcnJlbGF0aW9uIHJlYWQgdGhlIHNhbWUgc25hcHNob3QuXG4gICAgICBjb25zdCBhcm1lZCA9IGFybVJ1bih7XG4gICAgICAgIHNpZ25hbDogb3B0aW9ucz8uc2lnbmFsLFxuICAgICAgICB0aW1lb3V0TXM6IG9wdGlvbnM/LnRpbWVvdXRNcyxcbiAgICAgICAgZGVhZGxpbmU6IG9wdGlvbnM/LmRlYWRsaW5lLFxuICAgICAgICBlbnYsXG4gICAgICAgIC4uLihyZWNvcmQ/LnN0b3BTaWduYWwgJiYgeyBzdG9wOiByZWNvcmQuc3RvcFNpZ25hbCB9KSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy50cmF2ZXJzZXIgPSBkaXNwb3NlT25UaHJvdyhhcm1lZCwgKCkgPT5cbiAgICAgICAgdGhpcy5jcmVhdGVUcmF2ZXJzZXIoYXJtZWQuc2lnbmFsLCB1bmRlZmluZWQsIGFybWVkLmVudiwgb3B0aW9ucz8ubWF4RGVwdGgsIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsIHtcbiAgICAgICAgICAvLyBDbG9uZS1pbjogYGluaXRpYWxDb250ZXh0YCBzZWVkcyB0aGUgZnJlc2ggU2hhcmVkTWVtb3J5IHdpdGggYVxuICAgICAgICAgIC8vIHRvcC1sZXZlbC1vbmx5IG1lcmdlIOKAlCBuZXN0ZWQgb2JqZWN0cyB3b3VsZCBhbGlhcyB0aGUgY2FsbGVyJ3MgY2hlY2twb2ludC5cbiAgICAgICAgICBpbml0aWFsQ29udGV4dDogc3RydWN0dXJlZENsb25lKHBsYW4uY2hlY2twb2ludC5zaGFyZWRTdGF0ZSksXG4gICAgICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICAgICAgLi4uKGV4aXN0aW5nUnVudGltZSA/IHsgZXhpc3RpbmdSdW50aW1lIH0gOiB7fSksXG4gICAgICAgICAgcmVzdW1lOiBwbGFuLmVudHJ5LFxuICAgICAgICAgIC4uLihwbGFuLmNoZWNrcG9pbnQucmVkYWN0aW9uTWFya3MgJiYgeyByZWRhY3Rpb25NYXJrczogcGxhbi5jaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzIH0pLFxuICAgICAgICAgIC4uLihjb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uIH0pLFxuICAgICAgICAgIC4uLihyZWNvcmQgJiYge1xuICAgICAgICAgICAgcmVjb3JkOiB7XG4gICAgICAgICAgICAgIGxpbms6IHJlY29yZCxcbiAgICAgICAgICAgICAgbWV0YTogdGhpcy5vcGVuaW5nTWV0YShjb3JyZWxhdGlvbiwgYXJtZWQuZGVhZGxpbmUsIHJlc3VtZWRGcm9tKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIC8vIFRoZSBzYW1lIHJvb3QgbG9nIGdvZXMgb24gdW5kZXIgdGhpcyBsZWc6IHRoZSBsZWcgaXMgbm90ZWQgYmVzaWRlIGl0LCBzbyB0aGUgc3RvcmVkIHJlY29yZCBuYW1lcyBpdHMgcnVuSWQuXG4gICAgICBpZiAocmVjb3JkICYmIGV4aXN0aW5nUnVudGltZSkge1xuICAgICAgICBleGlzdGluZ1J1bnRpbWUubm90ZVJlY29yZChcbiAgICAgICAgICAncmVzdW1lJyxcbiAgICAgICAgICByZWNvcmQuc2VydmUoe1xuICAgICAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgICAgIC4uLihyZXN1bWVkRnJvbSAhPT0gdW5kZWZpbmVkICYmIHsgcmVzdW1lZEZyb20gfSksXG4gICAgICAgICAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgICAgIC4uLihhcm1lZC5kZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmU6IGFybWVkLmRlYWRsaW5lIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgICB0aGlzLmNhcHR1cmVTaWduYWwgPVxuICAgICAgICB0aGlzLmZsb3dDaGFydEFyZ3MuY2FwdHVyZUNvdmVyYWdlIHx8IHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscy5yZWFkU291cmNlcyA/IGFybWVkLnNpZ25hbCA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEEgZnJlc2gtZXhlY3V0b3IgcmVzdW1lIGFsc28gc3RhcnRzIGEgc2VnbWVudCwgbmV2ZXIgYSBuZXdseSBvYnNlcnZlZCB3aG9sZSB3b3JrZmxvdy5cbiAgICAgICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgRXhlY3V0aW9uUnVudGltZSkuY2FwdHVyZT8ubGltaXQoJ3Jlc3VtZWQtc2VnbWVudCcpO1xuICAgICAgLy8gQmVmb3JlIHRoZSB0cmF2ZXJzYWwgb24gcHVycG9zZTogYG9uUmVzdW1lYCBwcmVjZWRlcyBgb25SdW5TdGFydGAuXG4gICAgICBkaXNwb3NlT25UaHJvdyhhcm1lZCwgKCkgPT5cbiAgICAgICAgYW5ub3VuY2VSZXN1bWUocGxhbiwgcmVzdW1lSW5wdXQsIHtcbiAgICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICAgIGV4ZWN1dGlvbkNvdW50OiB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlLFxuICAgICAgICAgIG9ic2VydmVyczogdGhpcy5vYnNlcnZlcnMsXG4gICAgICAgICAgLi4uKGNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb24gfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IEFGVEVSIGFsbCBzeW5jIHZhbGlkYXRpb24vbG9va3VwIHRocm93cyBhYm92ZSAobm90aGluZyBjYW4gbGVhayB0aGVcbiAgICAgIC8vIGZsYWcpOyBubyBhd2FpdCBiZXR3ZWVuIHRoZSB0b3Atb2YtbWV0aG9kIGNoZWNrIGFuZCBoZXJlLCBzbyByYWNlLWZyZWUuXG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZXR0bGVSZWNvcmRlZChhcm1lZCwgcmVjb3JkKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCkg4oCUIHNhbWUgYm91bmRhcnkgY29udHJhY3QgYXMgcnVuKCkuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2NvbXBsZXRlZCcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgcGF1c2VkID0gdGhpcy5wYXVzZWRPclRocm93KGVycm9yKTtcbiAgICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdwYXVzZWQnKTtcbiAgICAgICAgcmV0dXJuIHBhdXNlZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgICAgIGFybWVkLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuZmluaXNoKGVycm9yKTtcbiAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0bGUgb2YgYSBsZWcgdGhhdCB0aHJldzogZmx1c2ggdGhlIGRlZmVycmVkIHRpZXIgKHRoZSBPVVRFUk1PU1RcbiAgICogaGFuZGxlciDigJQgYSBwYXVzZSByZS10aHJvd3MgdGhyb3VnaCBzdWJmbG93IHRyYXZlcnNlcnMgd2l0aG91dCBleGl0XG4gICAqIGV2ZW50cywgc28gcGVyLXRyYXZlcnNlciBob29rcyB3b3VsZCBtaXNzIGl0KSwgdGhlbiB0dXJuIGEgcGF1c2UgaW50byBhXG4gICAqIGRldGFjaGVkIGNoZWNrcG9pbnQgKGBjaGVja3BvaW50LnRzYCkgYW5kIGEgYFBhdXNlZFJlc3VsdGA7IGFueXRoaW5nIGVsc2VcbiAgICogaXMgcmV0aHJvd24uXG4gICAqL1xuICBwcml2YXRlIHBhdXNlZE9yVGhyb3coZXJyb3I6IHVua25vd24pOiBQYXVzZWRSZXN1bHQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgY29uc3QgcmVkYWN0aW9uTWFya3MgPSB0aGlzLnJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50KCk7XG4gICAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgICBjb25zdCBjYXB0dXJlID0gcnVudGltZS5jYXB0dXJlPy5ydW5JZCA9PT0gdGhpcy5fY3VycmVudFJ1bklkID8gcnVudGltZS5jYXB0dXJlIDogdW5kZWZpbmVkO1xuICAgICAgLy8gQ2hlY2twb2ludCBjcmVhdGlvbiBjYW5ub3QgZGVwZW5kIG9uIGEgcHJpb3Igc2VydmVkU25hcHNob3QoKSB0byBub3RpY2UgYWN0aXZlIHJlZGFjdGlvbi5cbiAgICAgIGlmIChjYXB0dXJlICYmIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dC5nZXRQb2xpY3koKS5yZWRhY3Rpb24/LmlzSW5lcnQoKSA9PT0gZmFsc2UpXG4gICAgICAgIGNhcHR1cmUubGltaXQoJ3JlZGFjdGlvbi1hY3RpdmUnKTtcbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSBidWlsZFBhdXNlQ2hlY2twb2ludChlcnJvciwgdGhpcy50cmF2ZXJzZXIsIHtcbiAgICAgICAgLi4uKGNhcHR1cmUgJiYgeyBjYXB0dXJlOiBydW50aW1lLmNhcHR1cmVTbmFwc2hvdChydW50aW1lLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoKSB9KSxcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnQ6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUsXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cyxcbiAgICAgICAgLi4uKHJlZGFjdGlvbk1hcmtzICYmIHsgcmVkYWN0aW9uTWFya3MgfSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0bGUgb2YgYSBsZWcgdGhhdCB3cml0ZXMgaXRzIHJlY29yZCAoMTAuMSwgUDYpIOKAlCB0aGUgMTAuMCBzZXR0bGUgKGBydW4oKWAgLyBgcmVzdW1lKClgKSwgdGhlbiB0aGUgcm9vdFxuICAgKiBsb2cncyBjbG9zaW5nIGVudHJ5IHdpdGggaG93IHRoZSBsZWcgZW5kZWQsIHRoZW4gKGBmbHVzaDogJ2F1dG8nYCkgdGhlIGFkYXB0ZXIncyBmbHVzaCwgYWxsIGJlZm9yZSB0aGUgbGVnXG4gICAqIGNvdW50cyBhcyBmaW5pc2hlZC4gQSBsZWcgd2l0aG91dCBhIHNpbmsgbmV2ZXIgY29tZXMgaGVyZTogaXRzIHNldHRsZSBoYXMgbm8gZXh0cmEgYXdhaXQuXG4gICAqXG4gICAqIFRoZSBsZWcncyBvd24gZXJyb3IgYWx3YXlzIHdpbnMuIEEgcnVuIHRoYXQgZmluaXNoZWQgYnV0IGxvc3QgYW4gZW50cnkgdW5kZXIgYG9uRmFpbHVyZTogJ2ZhaWwnYCByZWplY3RzIHdpdGhcbiAgICogdGhlIGBSZWNvcmRTaW5rRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGVSZWNvcmRlZChhcm1lZDogQXJtZWRSdW4sIHJlY29yZDogUnVuUmVjb3JkKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXR0bGVSZWNvcmRlZExlZyhhcm1lZCwgcmVjb3JkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgIGFybWVkLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHRsZVJlY29yZGVkTGVnKGFybWVkOiBBcm1lZFJ1biwgcmVjb3JkOiBSdW5SZWNvcmQpOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgIGxldCBvdXRjb21lOiBMb2dPdXRjb21lO1xuICAgIGxldCByZXN1bHQ6IEV4ZWN1dG9yUmVzdWx0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBmYWlsdXJlOiB7IGVycm9yOiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCkg4oCUIHNhbWUgYm91bmRhcnkgY29udHJhY3QgYXMgcnVuKCkuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgICAgICBvdXRjb21lID0gJ29rJztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXVzZWRPclRocm93KGVycm9yKTtcbiAgICAgICAgICBvdXRjb21lID0gJ3BhdXNlZCc7XG4gICAgICAgIH0gY2F0Y2ggKHRocm93bjogdW5rbm93bikge1xuICAgICAgICAgIGZhaWx1cmUgPSB7IGVycm9yOiB0aHJvd24gfTtcbiAgICAgICAgICBvdXRjb21lID0gJ2ZhaWxlZCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJ1bnRpbWUuY2xvc2VSZWNvcmQob3V0Y29tZSwge1xuICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICAuLi4oZmFpbHVyZSAmJiB7IGVycm9yOiB0aGlzLmNsb3NpbmdFcnJvcihmYWlsdXJlLmVycm9yKSB9KSxcbiAgICAgIH0pO1xuICAgICAgLy8gQm91bmRlZDogYSBmbHVzaCB0aGF0IG5ldmVyIHNldHRsZXMgaXMgYSBsb3NzLCBuZXZlciBhIHJ1biBoZWxkIG9wZW4gKHRoZSB0aW1lIGxlZnQsIGVsc2UgMzAgcykuXG4gICAgICBpZiAocmVjb3JkLmZsdXNoTW9kZSA9PT0gJ2F1dG8nKSBhd2FpdCByZWNvcmQuZmx1c2goYXV0b0ZsdXNoTXMoYXJtZWQuZGVhZGxpbmUpLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuZmluaXNoKGVycm9yKTtcbiAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5maW5pc2goZmFpbHVyZS5lcnJvcik7XG4gICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2ZhaWxlZCcsIGZhaWx1cmUuZXJyb3IpO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FwdHVyZUhpc3RvcnkocnVudGltZSwgcmVjb3JkKTtcbiAgICAgIHRocm93IGZhaWx1cmUuZXJyb3I7XG4gICAgfVxuICAgIGlmIChyZWNvcmQuZmF0YWwpIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChyZWNvcmQuZmF0YWwpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCByZWNvcmQuZmF0YWwpO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FwdHVyZUhpc3RvcnkocnVudGltZSwgcmVjb3JkKTtcbiAgICAgIHRocm93IHJlY29yZC5mYXRhbDtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hDYXB0dXJlKG91dGNvbWUgPT09ICdwYXVzZWQnID8gJ3BhdXNlZCcgOiAnY29tcGxldGVkJyk7XG4gICAgYXdhaXQgdGhpcy5zYXZlQ2FwdHVyZUhpc3RvcnkocnVudGltZSwgcmVjb3JkKTtcbiAgICBpZiAocmVjb3JkLmZhdGFsKSB7XG4gICAgICAvLyBUaGUgbmF0aXZlIHByZWZpeCBhbHJlYWR5IGVuZGVkOyBhIGxhdGVyIHN0b3JhZ2UgcmVqZWN0aW9uIG93bnMgbm8gc3VjY2Vzc2Z1bCBzdGFnZS5cbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChyZWNvcmQuZmF0YWwpO1xuICAgICAgdGhyb3cgcmVjb3JkLmZhdGFsO1xuICAgIH1cbiAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgIHJldHVybiByZXN1bHQgYXMgRXhlY3V0b3JSZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNhdmVDYXB0dXJlSGlzdG9yeShydW50aW1lOiBFeGVjdXRpb25SdW50aW1lLCByZWNvcmQ6IFJ1blJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghcmVjb3JkLmNhcHR1cmVPcHRpb25zKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgdGhpcy5jYXB0dXJlSGlzdG9yeUxlYXNlID8/PSB7IHBlbmRpbmc6IGZhbHNlIH07XG4gICAgcmV0dXJuIHBlcnNpc3RDYXB0dXJlSGlzdG9yeShydW50aW1lLCByZWNvcmQsICgpID0+IHRoaXMuZ2V0U25hcHNob3QoKSwgdGhpcy5jYXB0dXJlSGlzdG9yeUxlYXNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQ2FwdHVyZShzdGF0dXM6ICdjb21wbGV0ZWQnIHwgJ3BhdXNlZCcgfCAnZmFpbGVkJywgZXJyb3I/OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5jYXB0dXJlU2lnbmFsO1xuICAgIHRoaXMuY2FwdHVyZVNpZ25hbCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgY2FwdHVyZSA9IHJ1bnRpbWUuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgfHwgY2FwdHVyZS5ydW5JZCAhPT0gdGhpcy5fY3VycmVudFJ1bklkKSByZXR1cm47XG4gICAgY29uc3QgY2FuY2VsbGVkID0gc3RhdHVzID09PSAnZmFpbGVkJyAmJiBpc0NhbmNlbGxlZChzaWduYWwpICYmIGVycm9yID09PSBzaWduYWw/LnJlYXNvbjtcbiAgICBpZiAoc3RhdHVzID09PSAnY29tcGxldGVkJyAmJiB0aGlzLnRyYXZlcnNlci5nZXRCcmVha1N0YXRlKCkuc2hvdWxkQnJlYWspIGNhcHR1cmUubGltaXQoJ2V4ZWN1dGlvbi1icm9rZW4nKTtcbiAgICBjYXB0dXJlLmVuZChjYW5jZWxsZWQgPyAnY2FuY2VsbGVkJyA6IHN0YXR1cywgc3RhdHVzID09PSAnZmFpbGVkJyA/IHRoaXMuZmFpbHVyZVN0YXRlLnJlc3VsdCA6IHVuZGVmaW5lZCk7XG4gICAgcnVudGltZS5yZWFkU291cmNlcz8uc2VhbChydW50aW1lLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGEgbmV3IHJvb3QgbG9nIG9wZW5zIHdpdGg6IG5hbWVzIGFuZCBudW1iZXJzIHRoZSBydW4gYWxyZWFkeSBzZXJ2ZXMg4oCUIHRoZSBydW4sIHRoZSBjaGFydCwgdGhlIGNvcnJlbGF0aW9uLFxuICAgKiB0aGUgZGVhZGxpbmUsIHRoZSBkZWNsYXJlZCBidWRnZXQsIGFuZCB0aGUgcnVuIGEgZnJlc2gtZXhlY3V0b3IgcmVzdW1lIGNvbnRpbnVlcy4gU2VydmVkIGJ5IHRoZSByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIG9wZW5pbmdNZXRhKFxuICAgIGNvcnJlbGF0aW9uOiBSdW5Db3JyZWxhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHJlc3VtZWRGcm9tPzogc3RyaW5nLFxuICApOiBNZXRhIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5yb290O1xuICAgIGNvbnN0IGJ1ZGdldE1zID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5idWlsZFRpbWVTdHJ1Y3R1cmU/LmJ1ZGdldE1zO1xuICAgIHJldHVybiB7XG4gICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgY2hhcnQ6IHsgaWQ6IHJvb3QuaWQsIG5hbWU6IHJvb3QubmFtZSB9LFxuICAgICAgLi4uKGNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb24gfSksXG4gICAgICAuLi4oZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiB7IGRlYWRsaW5lIH0pLFxuICAgICAgLi4uKGJ1ZGdldE1zICE9PSB1bmRlZmluZWQgJiYgeyBidWRnZXRNcyB9KSxcbiAgICAgIC4uLihyZXN1bWVkRnJvbSAhPT0gdW5kZWZpbmVkICYmIHsgcmVzdW1lZEZyb20gfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xvc2luZyBlbnRyeSdzIGVycm9yOiB0aGUgcnVuJ3MgU0VSVkVEIGZvcm0gb2YgaXQsIGl0cyBuYW1lLCBtZXNzYWdlIGFuZCBjb2RlIG9ubHkgKG5ldmVyIGByYXdgKS4gKi9cbiAgcHJpdmF0ZSBjbG9zaW5nRXJyb3IoZXJyb3I6IHVua25vd24pOiBNZXRhIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5yZWRhY3Rpb25SdWxlLnNlcnZlZEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGluZm8ubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogaW5mby5uYW1lIH0pLFxuICAgICAgbWVzc2FnZTogaW5mby5tZXNzYWdlLFxuICAgICAgLi4uKGluZm8uY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogaW5mby5jb2RlIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHJlLWVudHJhbmN5IGd1YXJkOiBvbmUgZXhlY3V0b3IgPSBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbi4gKi9cbiAgcHJpdmF0ZSBhc3NlcnRJZGxlKG1ldGhvZDogJ3J1bicgfCAncmVzdW1lJyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmxvd0NoYXJ0RXhlY3V0b3I6ICR7bWV0aG9kfSgpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzIGAgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIDilIAgUmVjb3JkZXJzICh0aGUgcmVnaXN0ZXIgbGl2ZXMgaW4gYGF0dGFjaC50c2ApIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBTY29wZVJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKVxuICAgKiBvbiBldmVyeSBzdGFnZSBzY29wZS4gQ2FsbCBiZWZvcmUgcnVuKCkuICoqSWRlbXBvdGVudCBieSBgaWRgKiogKHJlcGxhY2VkLFxuICAgKiBuZXZlciBkdXBsaWNhdGVkKS4gYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgbW92ZXMgaXQgb2ZmIHRoZSBob3QgcGF0aCDigJRcbiAgICogZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFzayBjaGVja3BvaW50OyByZS1hdHRhY2hpbmcgYW4gaWQgb24gdGhlXG4gICAqIG90aGVyIHRpZXIgU1dBUFMgdGllcnMgKGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcigpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHNhbWUgaWRcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoU2NvcGUocmVjb3JkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgc2NvcGUgUmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElEIOKAlCBib3RoIGRlbGl2ZXJ5IHRpZXJzLiAqL1xuICBkZXRhY2hTY29wZVJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5kZXRhY2hTY29wZShpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHNjb3BlIFJlY29yZGVycyAoYm90aCB0aWVycykuICovXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLnNjb3BlTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIEZsb3dSZWNvcmRlciB0byBvYnNlcnZlIGNvbnRyb2wgZmxvdyBldmVudHMuIEF1dG9tYXRpY2FsbHlcbiAgICogZW5hYmxlcyBuYXJyYXRpdmUuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS4gSWRlbXBvdGVudCBieSBgaWRgO1xuICAgKiBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBhcyBmb3IgYGF0dGFjaFNjb3BlUmVjb3JkZXJgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5hdHRhY2hGbG93KHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQg4oCUIGJvdGggZGVsaXZlcnkgdGllcnMuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZGV0YWNoRmxvdyhpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMgKGJvdGggdGllcnMpLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuZmxvd0xpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSByZWNvcmRlciB0byBldmVyeSBjaGFubmVsIChzY29wZSwgZmxvdywgZW1pdCkgaXQgaGFzIE9XTiBgb24qYFxuICAgKiBtZXRob2RzIGZvciDigJQgcHJlZmVycmVkIG92ZXIgc2luZ2xlLWNoYW5uZWwgY2FsbHMsIHdoZXJlIGZvcmdldHRpbmcgb25lXG4gICAqIHNpbGVudGx5IGxvc2VzIGV2ZW50cy4gSWRlbXBvdGVudCBieSBgaWRgIGFjcm9zcyBhbGwgY2hhbm5lbHM7IGEgZmxvd1xuICAgKiBtZXRob2QgZW5hYmxlcyB0aGUgbmFycmF0aXZlOyBgZGVsaXZlcnlgIGNvbWVzIGZyb20gdGhlIG9wdGlvbnMgb3IgdGhlXG4gICAqIHJlY29yZGVyJ3Mgb3duIGZpZWxkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmF0dGFjaENvbWJpbmVkKHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYSBjb21iaW5lZCByZWNvcmRlciBmcm9tIGV2ZXJ5IGNoYW5uZWwgaXQgd2FzIGF0dGFjaGVkIHRvIChzYWZlIGlmIG5ldmVyIGF0dGFjaGVkKS4gKi9cbiAgZGV0YWNoQ29tYmluZWRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgICB0aGlzLmRldGFjaEZsb3dSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGZvciBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGV2ZW50cy4gSXQgcmlkZXNcbiAgICogdGhlIHNjb3BlIGxpc3QsIHNvIGBvbkVtaXRgIGZpcmVzIGV4YWN0bHkgb25jZSBwZXIgZXZlbnQuIElkZW1wb3RlbnQgYnkgYGlkYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIoe1xuICAgKiAgIGlkOiAndG9rZW4tbWV0ZXInLFxuICAgKiAgIG9uRW1pdDogKGUpID0+IHtcbiAgICogICAgIGlmIChlLm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykgdHJhY2tUb2tlbnMoZS5wYXlsb2FkKTtcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hFbWl0UmVjb3JkZXIocmVjb3JkZXI6IEVtaXRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCByZWNvcmRlcnMgKGJvdGggdGllcnMpIHRoYXQgaW1wbGVtZW50IGBvbkVtaXRgLiAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTY29wZVJlY29yZGVycygpLmZpbHRlcihcbiAgICAgIChyKTogciBpcyBFbWl0UmVjb3JkZXIgPT4gdHlwZW9mIChyIGFzIHsgb25FbWl0PzogdW5rbm93biB9KS5vbkVtaXQgPT09ICdmdW5jdGlvbicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBEZXRhY2ggKFQ0KSDilIDilIDilIBcbiAgLy8gQmFyZS1leGVjdXRvciBlbnRyeSBwb2ludHMgZm9yIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBjaGFydHMuIEZyb20gaW5zaWRlIGFcbiAgLy8gc3RhZ2UgdXNlIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgIC8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAsXG4gIC8vIHdoaWNoIG1pbnQgcmVmSWRzIGZyb20gdGhlIGNhbGxpbmcgc3RhZ2U7IHRoZXNlIHVzZSBgX19leGVjdXRvcl9fYC5cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybiBhIGBEZXRhY2hIYW5kbGVgXG4gICAqIHRoZSBjYWxsZXIgY2FuIGB3YWl0KClgIG9uIChQcm9taXNlKSBvciByZWFkIGAuc3RhdHVzYCBmcm9tIChzeW5jKS4gVGhlXG4gICAqIGRyaXZlciBpcyBSRVFVSVJFRCDigJQgdGhlcmUgaXMgbm8gbGlicmFyeSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgZXhlYyA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihwYXJlbnRDaGFydCk7XG4gICAqIGNvbnN0IGhhbmRsZSA9IGV4ZWMuZGV0YWNoQW5kSm9pbkxhdGVyKG1pY3JvdGFza0JhdGNoRHJpdmVyLCB0ZWxlbWV0cnlDaGFydCwgeyBldmVudDogJ3gnIH0pO1xuICAgKiBhd2FpdCBoYW5kbGUud2FpdCgpOyAvLyBvcHRpb25hbFxuICAgKiBgYGBcbiAgICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIF9kZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgRElTQ0FSRCB0aGUgaGFuZGxlIOKAlCBmb3JcbiAgICogZmlyZS1hbmQtZm9yZ2V0IHNpZGUgZWZmZWN0cy4gQSBjaGlsZCdzIGVycm9yIGxhbmRzIG9uIHRoZSBkaXNjYXJkZWQgaGFuZGxlO1xuICAgKiBmb3Igb2JzZXJ2YWJsZSBkZXRhY2ggcHJlZmVyIGBkZXRhY2hBbmRKb2luTGF0ZXJgICsgYC53YWl0KCkuY2F0Y2goKWAuXG4gICAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgX2RldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRvci1vd25lZCBuYXJyYXRpdmUgdmlldzsgYC5tYXAoZSA9PiBlLnRleHQpYCBmb3IgZmxhdCBzdHJpbmdzLlxuICAgKiBgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnMpYCBjb25maWd1cmVzIHRoaXMgdmlldy4gQXR0YWNoaW5nIGEgZmxvdyByZWNvcmRlclxuICAgKiBhbHNvIGVuYWJsZXMgaXQsIGJ1dCB0aGF0IHJlY29yZGVyJ3Mgb3B0aW9ucyBhbmQgZW50cmllcyByZW1haW4gaW5kZXBlbmRlbnRcbiAgICogKHJlYWQgYW4gYXR0YWNoZWQgYG5hcnJhdGl2ZSgpYCBpbnN0YW5jZSB3aXRoIGByZWNvcmRlci5nZXRFbnRyaWVzKClgKS5cbiAgICogU2FtZS1leGVjdXRvciByZXN1bWUgcmV0YWlucyBoaXN0b3J5OyBhIGZyZXNoIGV4ZWN1dG9yIHJlY29yZHMgaXRzIHJlc3VtZWRcbiAgICogbGVnIG9ubHkuIFRoZSBpbnRlcm5hbCBuYXJyYXRvciBpcyBub3QgYW4gYXR0YWNoZWQgc25hcHNob3QgcmVjb3JkZXIgcm93LlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlRW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGlmICh0aGlzLm9ic2VydmVycy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuY29tYmluZWRSZWNvcmRlci5nZXRFbnRyaWVzKCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dTZW50ZW5jZXMgPSB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBjaGFydC4gUmVzb2x2ZXMgd2hlbiB0aGUgcnVuIGZpbmlzaGVzIOKAlCBvciBwYXVzZXMsIGlmIGFcbiAgICogcGF1c2FibGUgc3RhZ2UgcmV0dXJuZWQgZGF0YSAoY2hlY2sgYGlzUGF1c2VkKClgIGFmdGVyd2FyZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIGB7IGlucHV0LCBlbnYgfWAg4oCUIGBpbnB1dGAgaXMgdGhlIGZyb3plbiBidXNpbmVzcyBpbnB1dFxuICAgKiAgIChyZWFkIGluIGEgc3RhZ2UgdmlhIGBzY29wZS4kZ2V0QXJncygpYCk7IGBlbnZgIGlzIGluZnJhc3RydWN0dXJlIGNvbnRleHRcbiAgICogICBsaWtlIGB7IHNpZ25hbCwgdGltZW91dE1zLCB0cmFjZUlkIH1gIChyZWFkIHZpYSBgc2NvcGUuJGdldEVudigpYCk7IGBkZWFkbGluZWAgLyBgdGltZW91dE1zYCBnaXZlIHRoZSBydW5cbiAgICogICBpdHMgZGVhZGxpbmUgKGBlbnYuZGVhZGxpbmVgLCBgc2NvcGUuJGF0dGVtcHQoKS50aW1lTGVmdE1zKClgKS5cbiAgICpcbiAgICogQWZ0ZXIgaXQgcmVzb2x2ZXMsIHJlYWQgcmVzdWx0cyBvZmYgdGhlIGV4ZWN1dG9yOlxuICAgKiAtIGBnZXRTbmFwc2hvdCgpYCDigJQgZnVsbCBzdGF0ZSwgY29tbWl0IGxvZywgZXhlY3V0aW9uIHRyZWUuXG4gICAqIC0gYGdldE5hcnJhdGl2ZUVudHJpZXMoKWAg4oCUIHRoZSBwbGFpbi1FbmdsaXNoIHRyYWNlIChjYWxsIGBlbmFibGVOYXJyYXRpdmUoKWBcbiAgICogICBvciBhdHRhY2ggYSBgbmFycmF0aXZlKClgIHJlY29yZGVyIGZpcnN0KS5cbiAgICogLSBgaXNQYXVzZWQoKWAg4oCUIHRydWUgaWYgYSBzdGFnZSBwYXVzZWQ7IHRoZW4gdXNlIGBnZXRDaGVja3BvaW50KClgIC8gYHJlc3VtZSgpYC5cbiAgICpcbiAgICogT25lIHJ1biBhdCBhIHRpbWUgcGVyIGV4ZWN1dG9yIOKAlCBpdCBob2xkcyBwZXItcnVuIHN0YXRlIChydW5JZCwgcmVjb3JkZXJzLFxuICAgKiBjaGVja3BvaW50KS4gQ3JlYXRlIG9uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uXG4gICAqL1xuICBhc3luYyBydW4ob3B0aW9ucz86IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgLy8gQSBmYWlsZWQgZW50cnkgbGVhdmVzIG5vIHNpZGUgZWZmZWN0czogdGhlIGd1YXJkIEZJUlNUICh0aGUgaW4tZmxpZ2h0XG4gICAgLy8gcnVuIHN0YXlzIHVudG91Y2hlZCksIHZhbGlkYXRpb24gYmVmb3JlIHRoZSB0aW1lb3V0IHRpbWVyIGV4aXN0cy5cbiAgICB0aGlzLmFzc2VydElkbGUoJ3J1bicpO1xuICAgIHRoaXMuZmFpbHVyZVN0YXRlID0gbmV3IE5hdGl2ZUZhaWx1cmVTdGF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgdmFsaWRhdGVkSW5wdXQgPSBvcHRpb25zPy5pbnB1dDtcbiAgICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgZW52LCByZWFkIE9OQ0UsIGFuZCB0aGUgcnVuJ3MgY29ycmVsYXRpb24sIGJlZm9yZSBhbnl0aGluZyBtb3ZlczogYSByZWZ1c2VkIGB0cmFjZXBhcmVudGAgbGVhdmVzIG5vXG4gICAgICAvLyBzaWRlIGVmZmVjdCwgYW5kIHRoZSBzdGFnZXMgc2VlIHRoZSBzYW1lIHNuYXBzaG90IHRoZSBjb3JyZWxhdGlvbiB3YXMgcmVhZCBmcm9tIChgYWRtaXRSdW5FbnZgKS5cbiAgICAgIGNvbnN0IHsgZW52LCBjb3JyZWxhdGlvbiB9ID0gYWRtaXRSdW5FbnYob3B0aW9ucz8uZW52KTtcblxuICAgICAgLy8gVGhlIHJ1bidzIG9uZSBzaWduYWwgYW5kIGl0cyBkZWFkbGluZSAoYGFybVJ1bmApOiBgc2lnbmFsYCwgYGVudi5zaWduYWxgLCBgZGVhZGxpbmVgIC8gYHRpbWVvdXRNc2AgL1xuICAgICAgLy8gYGVudi5kZWFkbGluZWAsIGNvbXBvc2VkIGZyb20gdGhlIEFETUlUVEVEIGVudiDigJQgYW5kIHN0YW1wZWQgb24gdGhlIGVudiBzdGFnZXMgcmVhZC4gQXJtZWQgYWZ0ZXIgdGhlXG4gICAgICAvLyBhZG1pc3Npb24sIHNvIGEgcmVmdXNlZCBgdHJhY2VwYXJlbnRgIGxlYXZlcyBubyB0aW1lcjsgZGlzcG9zZWQgb24gZXZlcnkgZXhpdC5cbiAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7IC8vIHJlYWQgQkVGT1JFIGFybWluZywgc28gYHRpbWVvdXRNc2AgZXF1YWwgdG8gdGhlIGRlY2xhcmVkIGJ1ZGdldCBuZXZlciB3YXJuc1xuICAgICAgLy8gVGhlIHJ1bidzIHJlY29yZCAoUDYpOiBhIGZyZXNoIG9uZSBwZXIgcnVuIOKAlCBpdHMgYCdmYWlsJ2Agc3RvcCBpcyBvbmUgbW9yZSBzb3VyY2Ugb2YgdGhlIHJ1bidzIHNpZ25hbC5cbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuZmxvd0NoYXJ0QXJncy5zaW5rICYmIG5ldyBSdW5SZWNvcmQodGhpcy5mbG93Q2hhcnRBcmdzLnNpbmspO1xuICAgICAgY29uc3QgYXJtZWQgPSBhcm1SdW4oe1xuICAgICAgICBzaWduYWw6IG9wdGlvbnM/LnNpZ25hbCxcbiAgICAgICAgdGltZW91dE1zOiBvcHRpb25zPy50aW1lb3V0TXMsXG4gICAgICAgIGRlYWRsaW5lOiBvcHRpb25zPy5kZWFkbGluZSxcbiAgICAgICAgZW52LFxuICAgICAgICAuLi4ocmVjb3JkPy5zdG9wU2lnbmFsICYmIHsgc3RvcDogcmVjb3JkLnN0b3BTaWduYWwgfSksXG4gICAgICB9KTtcbiAgICAgIC8vIEEgZGVhZGxpbmUgc2hvcnRlciB0aGFuIHRoZSBjaGFydCdzIGRlY2xhcmVkIGAuYnVkZ2V0KG1zKWA6IGEgZGV2LW1vZGUgd2FybmluZywgb25jZSBwZXIgY2hhcnQgKFA1KS5cbiAgICAgIGRpc3Bvc2VPblRocm93KGFybWVkLCAoKSA9PiB3YXJuRGVhZGxpbmVVbmRlckJ1ZGdldCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LCBhcm1lZC5kZWFkbGluZSwgc3RhcnRlZEF0KSk7XG5cbiAgICAgIHRoaXMub2JzZXJ2ZXJzLmNsZWFyRm9yUnVuKCk7IC8vIG5vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb25cbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAgICAgdGhpcy5fdmlzaXRDb3VudHMgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7XG4gICAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhIGxhdGVyIHJlc3VtZSgpIHJldXNlcyB0aGlzIHJ1bnRpbWVcbiAgICAgIHRoaXMudHJhdmVyc2VyID0gZGlzcG9zZU9uVGhyb3coYXJtZWQsICgpID0+XG4gICAgICAgIHRoaXMuY3JlYXRlVHJhdmVyc2VyKGFybWVkLnNpZ25hbCwgdmFsaWRhdGVkSW5wdXQsIGFybWVkLmVudiwgb3B0aW9ucz8ubWF4RGVwdGgsIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsIHtcbiAgICAgICAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgICAuLi4ocmVjb3JkICYmIHsgcmVjb3JkOiB7IGxpbms6IHJlY29yZCwgbWV0YTogdGhpcy5vcGVuaW5nTWV0YShjb3JyZWxhdGlvbiwgYXJtZWQuZGVhZGxpbmUpIH0gfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIC8vIFNldCBvbmNlIHRoZSBsZWcncyB0cmF2ZXJzZXIgZXhpc3RzLCBzbyBhIHNuYXBzaG90IG5ldmVyIHBhaXJzIG9uZSBydW4ncyBzdGF0ZSB3aXRoIGFub3RoZXIncyBzaW5rIHN0YXRzLlxuICAgICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgICB0aGlzLmNhcHR1cmVTaWduYWwgPVxuICAgICAgICB0aGlzLmZsb3dDaGFydEFyZ3MuY2FwdHVyZUNvdmVyYWdlIHx8IHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscy5yZWFkU291cmNlcyA/IGFybWVkLnNpZ25hbCA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEFmdGVyIGV2ZXJ5IHN5bmMgdGhyb3csIHdpdGggbm8gYXdhaXQgc2luY2UgdGhlIGd1YXJkOiByYWNlLWZyZWUuXG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZXR0bGVSZWNvcmRlZChhcm1lZCwgcmVjb3JkKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCk6IFwib25lIGJlYXQgYmVoaW5kXCIgbmV2ZXIgYmVjb21lcyBcImxvc3QgYXQgZXhpdFwiLlxuICAgICAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMucGF1c2VkT3JUaHJvdyhlcnJvcik7XG4gICAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgncGF1c2VkJyk7XG4gICAgICAgIHJldHVybiBwYXVzZWQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgICBhcm1lZC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChlcnJvcik7XG4gICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2ZhaWxlZCcsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgYmFja2xvZywgdGhlbiBhd2FpdCBhc3luYyBsaXN0ZW5lciBjb21wbGV0aW9uc1xuICAgKiB1bmRlciBhIGRlYWRsaW5lIOKAlCBjYWxsIGJlZm9yZSBhIHNlcnZlcmxlc3MgcHJvY2VzcyBmcmVlemVzIG9yIGV4aXRzLlxuICAgKiBaZXJvcyB3aGVuIG5vIGRlZmVycmVkIG9ic2VydmVyIHdhcyBhdHRhY2hlZDsgYHBlbmRpbmcgPiAwYCByZXBvcnRzIHdoYXRcbiAgICogd2FzIHN0aWxsIG91dHN0YW5kaW5nIGF0IHRoZSBkZWFkbGluZS5cbiAgICovXG4gIGRyYWluT2JzZXJ2ZXJzKG9wdHM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTxPYnNlcnZlckRyYWluUmVzdWx0PiB7XG4gICAgY29uc3QgdGllciA9IHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcjtcbiAgICBpZiAoIXRpZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBkb25lOiAwLCBmYWlsZWQ6IDAsIHBlbmRpbmc6IDAgfSk7XG4gICAgcmV0dXJuIHRpZXIuZHJhaW4ob3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIHJlY29yZCBzaW5rICgxMC4xLCBQNik6IGF3YWl0IHRoZSBhZGFwdGVyJ3MgYGZsdXNoKClgIOKAlCBmb3IgYW4gZXhlY3V0b3IgYnVpbHQgd2l0aFxuICAgKiBgc2luazogeyBhZGFwdGVyLCBmbHVzaDogJ21hbnVhbCcgfWAsIG9yIGJlZm9yZSBhIHNlcnZlcmxlc3MgcHJvY2VzcyBmcmVlemVzLiBgdGltZW91dE1zYCBib3VuZHMgdGhlIHdhaXQ7IGFcbiAgICogZmx1c2ggc3RpbGwgcnVubmluZyB0aGVuIGlzIGBwZW5kaW5nYCAoYW5kIGtlZXBzIHJ1bm5pbmcpLiBBIGZhaWxlZCBmbHVzaCBpcyBjb3VudGVkIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLlxuICAgKiBEb25lIGF0IG9uY2Ugd2l0aG91dCBhIHNpbmssIG9yIHdpdGggYW4gYWRhcHRlciB0aGF0IGhhcyBubyBgZmx1c2hgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNpbms6IHsgYWRhcHRlcjogZmlsZVNpbmsocGF0aCksIGZsdXNoOiAnbWFudWFsJyB9IH0pO1xuICAgKiBhd2FpdCBleGVjdXRvci5ydW4oKTtcbiAgICogYXdhaXQgZXhlY3V0b3IuZmx1c2hSZWNvcmQoeyB0aW1lb3V0TXM6IDJfMDAwIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGZsdXNoUmVjb3JkKG9wdHM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5yZWNvcmQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBkb25lOiB0cnVlLCBmYWlsZWQ6IGZhbHNlLCBwZW5kaW5nOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuZmx1c2gob3B0cz8udGltZW91dE1zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIGB0cnVlYCBzZXJ2ZXMgYHNoYXJlZFN0YXRlYCAoYW5kIGVhY2ggc3ViZmxvdydzXG4gICAqICAgYGdsb2JhbENvbnRleHRgKSBmcm9tIHRoZSByZWRhY3RlZCBtaXJyb3Ig4oCUIHRoZSBzYWZlIHZpZXcgdG8gZXhwb3J0LiBBXG4gICAqICAgbm8tb3Agd2l0aG91dCBhIHJlZGFjdGlvbiBwb2xpY3kuIFRoZSBjb21taXQgbG9nIGlzIHJlZGFjdGVkIGF0IHdyaXRlXG4gICAqICAgdGltZSByZWdhcmRsZXNzLiBEZWZhdWx0IGBmYWxzZWAuXG4gICAqXG4gICAqICoqVHJlYXQgYHNoYXJlZFN0YXRlYCBhcyBSRUFELU9OTFkuKiogSW4gcHJvZHVjdGlvbiBpdCBpcyBhIGxpdmUgdmlldyBvZlxuICAgKiBlbmdpbmUgbWVtb3J5OyBpbiBkZXYgbW9kZSBhIGRlZXAtZnJvemVuIGNsb25lLCBzbyBhIG11dGF0aW9uIHRocm93cy5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHNlcnZlZFNuYXBzaG90KHRoaXMudHJhdmVyc2VyLCB0aGlzLm9ic2VydmVycywgb3B0aW9ucywgdGhpcy5yZWNvcmQ/LnN0YXRzKCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViZmxvdyBtYW5pZmVzdCBmcm9tIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyLlxuICAgKiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIG5vIE1hbmlmZXN0Rmxvd1JlY29yZGVyIGlzIGF0dGFjaGVkLlxuICAgKi9cbiAgZ2V0U3ViZmxvd01hbmlmZXN0KCk6IE1hbmlmZXN0RW50cnlbXSB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLm9ic2VydmVycy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5vYnNlcnZlcnMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldFNwZWMoc3ViZmxvd0lkKTtcbiAgfVxufVxuXG4vKiogSG93IGxvbmcgYSBydW4ncyBvd24gZmx1c2ggbWF5IHRha2U6IHRoZSBydW4ncyB0aW1lIGxlZnQgKGF0IGxlYXN0IDEgcyksIG5ldmVyIHBhc3Qge0BsaW5rIEFVVE9fRkxVU0hfTVN9LiAqL1xuZnVuY3Rpb24gYXV0b0ZsdXNoTXMoZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBkZWFkbGluZSA9PT0gdW5kZWZpbmVkID8gQVVUT19GTFVTSF9NUyA6IE1hdGgubWluKEFVVE9fRkxVU0hfTVMsIE1hdGgubWF4KDFfMDAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbn1cblxuLyoqIFRoZSBib3VuZCBvbiBhIHJ1bidzIG93biBmbHVzaCB3aGVuIGl0IGhhcyBubyBkZWFkbGluZTogMzAgcy4gKi9cbmNvbnN0IEFVVE9fRkxVU0hfTVMgPSAzMF8wMDA7XG5cbi8qKiBSdW4gYGJ1aWxkYDsgaWYgaXQgdGhyb3dzLCByZWxlYXNlIHRoZSBhcm1lZCBydW4gZmlyc3QgKG5vIGRlYWRsaW5lIHRpbWVyIG91dGxpdmVzIGEgcmVmdXNlZCBlbnRyeSkuICovXG5mdW5jdGlvbiBkaXNwb3NlT25UaHJvdzxUPihhcm1lZDogQXJtZWRSdW4sIGJ1aWxkOiAoKSA9PiBUKTogVCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJ1aWxkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXJtZWQuZGlzcG9zZSgpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXX0=
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { copyCaptureEvidence, validateAbsentEntries } from '../capture/absentEntries.js';
|
|
2
|
-
import { copyHistoryData,
|
|
2
|
+
import { copyHistoryData, historyDigest, historyEvidence, historyFailureReason } from '../capture/historyData.js';
|
|
3
|
+
import { historyNote } from '../capture/historyNote.js';
|
|
3
4
|
import { copyHistoryReceipt, copyHistoryTarget } from '../capture/historyTarget.js';
|
|
4
5
|
import { CAPTURE_HISTORY_NOTE, CAPTURE_RECEIPT_NOTE } from '../capture/historyTypes.js';
|
|
6
|
+
import { storedReadSources } from '../capture/storedReadSources.js';
|
|
5
7
|
/** Persist one terminal native root segment, without changing its memory-only engine observation. */
|
|
6
8
|
export async function persistCaptureHistory(runtime, record, snapshot, lease) {
|
|
7
9
|
const options = record.captureOptions;
|
|
8
10
|
if (!options)
|
|
9
11
|
return;
|
|
10
|
-
// Packet 4 must digest and acknowledge the source envelope before sources can be durable.
|
|
11
|
-
if (runtime.readSources) {
|
|
12
|
-
record.captureResult({ status: 'unknown', reason: 'source-history-not-included' });
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
12
|
if (lease.pending) {
|
|
16
13
|
record.captureResult({ status: 'unknown', reason: 'acknowledgement-pending' });
|
|
17
14
|
return;
|
|
@@ -29,11 +26,12 @@ export async function persistCaptureHistory(runtime, record, snapshot, lease) {
|
|
|
29
26
|
const note = view.capture;
|
|
30
27
|
if (!note || note.boundary.status === 'running')
|
|
31
28
|
return unknown('capture-unavailable');
|
|
32
|
-
const payload = copyCaptureEvidence(record.serve({
|
|
29
|
+
const payload = historyEvidence(copyCaptureEvidence(record.serve({
|
|
33
30
|
capture: note,
|
|
34
31
|
executionTree: view.executionTree,
|
|
35
32
|
...(view.recorders && { recorders: view.recorders }),
|
|
36
|
-
|
|
33
|
+
...(view.readSources && { readSources: view.readSources }),
|
|
34
|
+
}), options.maxBytes ?? 1024 * 1024));
|
|
37
35
|
const basis = copyHistoryData({
|
|
38
36
|
commitLog: view.commitLog,
|
|
39
37
|
...(view.initialState !== undefined && { initialState: record.captureInitialState(view.initialState) }),
|
|
@@ -56,6 +54,14 @@ export async function persistCaptureHistory(runtime, record, snapshot, lease) {
|
|
|
56
54
|
!copyHistoryTarget(evidence.target) ||
|
|
57
55
|
JSON.stringify(copyHistoryTarget(evidence.target)) !== JSON.stringify(target))
|
|
58
56
|
return unknown('evidence-refused');
|
|
57
|
+
if (view.readSources) {
|
|
58
|
+
// Preserve the version-1 producer stream, including historically masked protocol notes.
|
|
59
|
+
const admittedNote = historyNote(evidence.capture, target);
|
|
60
|
+
if (!admittedNote ||
|
|
61
|
+
admittedNote.version !== 2 ||
|
|
62
|
+
!storedReadSources(evidence.readSources, admittedNote, view.commitLog, basis.initialState, evidence.executionTree))
|
|
63
|
+
return unknown('evidence-refused');
|
|
64
|
+
}
|
|
59
65
|
runtime.noteRecord(CAPTURE_HISTORY_NOTE, evidence);
|
|
60
66
|
const delivered = await record.flush(options.timeoutMs ?? 10_000);
|
|
61
67
|
if (!active)
|
|
@@ -80,7 +86,7 @@ export async function persistCaptureHistory(runtime, record, snapshot, lease) {
|
|
|
80
86
|
}
|
|
81
87
|
catch (error) {
|
|
82
88
|
if (active)
|
|
83
|
-
unknown(error
|
|
89
|
+
unknown(historyFailureReason(error, 'evidence'));
|
|
84
90
|
}
|
|
85
91
|
};
|
|
86
92
|
try {
|
|
@@ -103,4 +109,4 @@ export async function persistCaptureHistory(runtime, record, snapshot, lease) {
|
|
|
103
109
|
clearTimeout(timer);
|
|
104
110
|
}
|
|
105
111
|
}
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZUhpc3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9jYXB0dXJlSGlzdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBU3hGLHFHQUFxRztBQUNyRyxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxPQUF5QixFQUN6QixNQUFpQixFQUNqQixRQUErQixFQUMvQixLQUEwQjtJQUUxQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTztJQUNyQiwwRkFBMEY7SUFDMUYsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLDZCQUE2QixFQUFFLENBQUMsQ0FBQztRQUNuRixPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSx5QkFBeUIsRUFBRSxDQUFDLENBQUM7UUFDL0UsT0FBTztJQUNULENBQUM7SUFDRCxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFB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LENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLE1BQU07Z0JBQ1IsT0FBTyxDQUNMLEtBQUssWUFBWSxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUM1RyxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztZQUNqQixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUNsQixLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN4QixDQUFDLENBQUM7WUFDRixJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM1QixLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDdEIsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDZixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ25CLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO29CQUNuQyxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDZixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgeyBjb3B5Q2FwdHVyZUV2aWRlbmNlLCB2YWxpZGF0ZUFic2VudEVudHJpZXMgfSBmcm9tICcuLi9jYXB0dXJlL2Fic2VudEVudHJpZXMuanMnO1xuaW1wb3J0IHsgY29weUhpc3RvcnlEYXRhLCBIaXN0b3J5RGF0YUVycm9yLCBoaXN0b3J5RGlnZXN0IH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5RGF0YS5qcyc7XG5pbXBvcnQgeyBjb3B5SGlzdG9yeVJlY2VpcHQsIGNvcHlIaXN0b3J5VGFyZ2V0IH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5VGFyZ2V0LmpzJztcbmltcG9ydCB7IENBUFRVUkVfSElTVE9SWV9OT1RFLCBDQVBUVVJFX1JFQ0VJUFRfTk9URSB9IGZyb20gJy4uL2NhcHR1cmUvaGlzdG9yeVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uUnVudGltZSwgUnVudGltZVNuYXBzaG90IH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUmVjb3JkIH0gZnJvbSAnLi9yZWNvcmRTaW5rLmpzJztcblxuLyoqIEBpbnRlcm5hbCBLZWVwcyBhIHRpbWVkLW91dCBvcGVyYXRpb24gbGVhc2VkIHVudGlsIGl0cyBhY3R1YWwgc2V0dGxlbWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZUhpc3RvcnlMZWFzZSB7XG4gIHBlbmRpbmc6IGJvb2xlYW47XG59XG5cbi8qKiBQZXJzaXN0IG9uZSB0ZXJtaW5hbCBuYXRpdmUgcm9vdCBzZWdtZW50LCB3aXRob3V0IGNoYW5naW5nIGl0cyBtZW1vcnktb25seSBlbmdpbmUgb2JzZXJ2YXRpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyc2lzdENhcHR1cmVIaXN0b3J5KFxuICBydW50aW1lOiBFeGVjdXRpb25SdW50aW1lLFxuICByZWNvcmQ6IFJ1blJlY29yZCxcbiAgc25hcHNob3Q6ICgpID0+IFJ1bnRpbWVTbmFwc2hvdCxcbiAgbGVhc2U6IENhcHR1cmVIaXN0b3J5TGVhc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlY29yZC5jYXB0dXJlT3B0aW9ucztcbiAgaWYgKCFvcHRpb25zKSByZXR1cm47XG4gIC8vIFBhY2tldCA0IG11c3QgZGlnZXN0IGFuZCBhY2tub3dsZWRnZSB0aGUgc291cmNlIGVudmVsb3BlIGJlZm9yZSBzb3VyY2VzIGNhbiBiZSBkdXJhYmxlLlxuICBpZiAocnVudGltZS5yZWFkU291cmNlcykge1xuICAgIHJlY29yZC5jYXB0dXJlUmVzdWx0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ3NvdXJjZS1oaXN0b3J5LW5vdC1pbmNsdWRlZCcgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChsZWFzZS5wZW5kaW5nKSB7XG4gICAgcmVjb3JkLmNhcHR1cmVSZXN1bHQoeyBzdGF0dXM6ICd1bmtub3duJywgcmVhc29uOiAnYWNrbm93bGVkZ2VtZW50LXBlbmRpbmcnIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBsZWFzZS5wZW5kaW5nID0gdHJ1ZTtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgbGV0IGFjdGl2ZSA9IHRydWU7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHVua25vd24gPSAocmVhc29uOiBzdHJpbmcpID0+IHJlY29yZC5jYXB0dXJlUmVzdWx0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbiB9KTtcbiAgY29uc3Qgd29yayA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFydW50aW1lLmNhcHR1cmUgfHwgcmVjb3JkLnN0YXRzKCkuZmFpbGVkID4gMCkgcmV0dXJuIHVua25vd24oJ3ByaW9yLWRlbGl2ZXJ5LWZhaWxlZCcpO1xuICAgICAgY29uc3QgdmlldyA9IHNuYXBzaG90KCk7XG4gICAgICBjb25zdCBub3RlID0gdmlldy5jYXB0dXJlO1xuICAgICAgaWYgKCFub3RlIHx8IG5vdGUuYm91bmRhcnkuc3RhdHVzID09PSAncnVubmluZycpIHJldHVybiB1bmtub3duKCdjYXB0dXJlLXVuYXZhaWxhYmxlJyk7XG4gICAgICBjb25zdCBwYXlsb2FkID0gY29weUNhcHR1cmVFdmlkZW5jZShcbiAgICAgICAgcmVjb3JkLnNlcnZlKHtcbiAgICAgICAgICBjYXB0dXJlOiBub3RlLFxuICAgICAgICAgIGV4ZWN1dGlvblRyZWU6IHZpZXcuZXhlY3V0aW9uVHJlZSxcbiAgICAgICAgICAuLi4odmlldy5yZWNvcmRlcnMgJiYgeyByZWNvcmRlcnM6IHZpZXcucmVjb3JkZXJzIH0pLFxuICAgICAgICB9KSxcbiAgICAgICAgb3B0aW9ucy5tYXhCeXRlcyA/PyAxMDI0ICogMTAyNCxcbiAgICAgICkgYXMgTWV0YTtcbiAgICAgIGNvbnN0IGJhc2lzID0gY29weUhpc3RvcnlEYXRhKFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0TG9nOiB2aWV3LmNvbW1pdExvZyxcbiAgICAgICAgICAuLi4odmlldy5pbml0aWFsU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB7IGluaXRpYWxTdGF0ZTogcmVjb3JkLmNhcHR1cmVJbml0aWFsU3RhdGUodmlldy5pbml0aWFsU3RhdGUpIH0pLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLm1heEJ5dGVzID8/IDEwMjQgKiAxMDI0LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGNvcHlIaXN0b3J5VGFyZ2V0KHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgZXZpZGVuY2VJZDogbm90ZS5ydW5JZCxcbiAgICAgICAgcnVuSWQ6IG5vdGUucnVuSWQsXG4gICAgICAgIGRpZ2VzdDogYXdhaXQgaGlzdG9yeURpZ2VzdCh7IGV2aWRlbmNlOiBwYXlsb2FkLCByZWNvcmQ6IGJhc2lzIH0pLFxuICAgICAgICBsb2dBZGRyZXNzOiBub3RlLmxvZ0FkZHJlc3MsXG4gICAgICAgIGNvbW1pdHM6IG5vdGUuY29tbWl0cyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gdW5rbm93bignY2FwdHVyZS11bmF2YWlsYWJsZScpO1xuICAgICAgY29uc3QgZXZpZGVuY2UgPSBjb3B5SGlzdG9yeURhdGEocmVjb3JkLnNlcnZlKHsgdGFyZ2V0LCAuLi5wYXlsb2FkIH0pLCBvcHRpb25zLm1heEJ5dGVzID8/IDEwMjQgKiAxMDI0KSBhcyBNZXRhO1xuICAgICAgLy8gQSByZWRhY3Rpb24gcnVsZSBtYXkgbWFzayBwcm90b2NvbCBmaWVsZHMgdG9vLiBTdWNoIGEgcmVjb3JkIGlzIG5vdCBlbGlnaWJsZSBmb3IgYWNrbm93bGVkZ2VtZW50LlxuICAgICAgaWYgKFxuICAgICAgICAhdmFsaWRhdGVBYnNlbnRFbnRyaWVzKGV2aWRlbmNlKSB8fFxuICAgICAgICAhY29weUhpc3RvcnlUYXJnZXQoZXZpZGVuY2UudGFyZ2V0KSB8fFxuICAgICAgICBKU09OLnN0cmluZ2lmeShjb3B5SGlzdG9yeVRhcmdldChldmlkZW5jZS50YXJnZXQpKSAhPT0gSlNPTi5zdHJpbmdpZnkodGFyZ2V0KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdW5rbm93bignZXZpZGVuY2UtcmVmdXNlZCcpO1xuICAgICAgcnVudGltZS5ub3RlUmVjb3JkKENBUFRVUkVfSElTVE9SWV9OT1RFLCBldmlkZW5jZSk7XG4gICAgICBjb25zdCBkZWxpdmVyZWQgPSBhd2FpdCByZWNvcmQuZmx1c2gob3B0aW9ucy50aW1lb3V0TXMgPz8gMTBfMDAwKTtcbiAgICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgICBpZiAoIWRlbGl2ZXJlZC5kb25lIHx8IHJlY29yZC5wZW5kaW5nQ2FwdHVyZURlbGl2ZXJpZXMgfHwgcmVjb3JkLnN0YXRzKCkuZmFpbGVkID4gMClcbiAgICAgICAgcmV0dXJuIHVua25vd24oJ2V2aWRlbmNlLWRlbGl2ZXJ5LXVua25vd24nKTtcbiAgICAgIGNvbnN0IHJlY2VpcHQgPSBjb3B5SGlzdG9yeVJlY2VpcHQoYXdhaXQgb3B0aW9ucy5hY2tub3dsZWRnZSh0YXJnZXQsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KSwgdGFyZ2V0KTtcbiAgICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgICBpZiAoIXJlY2VpcHQpIHJldHVybiB1bmtub3duKCdhY2tub3dsZWRnZW1lbnQtcmVmdXNlZCcpO1xuICAgICAgY29uc3Qgc2VydmVkUmVjZWlwdCA9IHJlY29yZC5zZXJ2ZSh7IC4uLnJlY2VpcHQgfSk7XG4gICAgICBpZiAoIWNvcHlIaXN0b3J5UmVjZWlwdChzZXJ2ZWRSZWNlaXB0LCB0YXJnZXQpKSByZXR1cm4gdW5rbm93bignYWNrbm93bGVkZ2VtZW50LXJlZnVzZWQnKTtcbiAgICAgIHJ1bnRpbWUubm90ZVJlY29yZChDQVBUVVJFX1JFQ0VJUFRfTk9URSwgc2VydmVkUmVjZWlwdCk7XG4gICAgICBjb25zdCBwZXJzaXN0ZWQgPSBhd2FpdCByZWNvcmQuZmx1c2gob3B0aW9ucy50aW1lb3V0TXMgPz8gMTBfMDAwKTtcbiAgICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgICBpZiAoIXBlcnNpc3RlZC5kb25lIHx8IHJlY29yZC5wZW5kaW5nQ2FwdHVyZURlbGl2ZXJpZXMgfHwgcmVjb3JkLnN0YXRzKCkuZmFpbGVkID4gMClcbiAgICAgICAgcmV0dXJuIHVua25vd24oJ3JlY2VpcHQtZGVsaXZlcnktdW5rbm93bicpO1xuICAgICAgcmVjb3JkLmNhcHR1cmVSZXN1bHQoeyBzdGF0dXM6ICdhY2tub3dsZWRnZWQnIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoYWN0aXZlKVxuICAgICAgICB1bmtub3duKFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgSGlzdG9yeURhdGFFcnJvciAmJiBlcnJvci5jb2RlID09PSAndG9vLWxhcmdlJyA/ICdldmlkZW5jZS10b28tbGFyZ2UnIDogJ2V2aWRlbmNlLXJlZnVzZWQnLFxuICAgICAgICApO1xuICAgIH1cbiAgfTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgd29yaygpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBsZWFzZS5wZW5kaW5nID0gZmFsc2U7XG4gICAgICB9KSxcbiAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIHVua25vd24oJ2Fja25vd2xlZGdlbWVudC10aW1lb3V0Jyk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXRNcyA/PyAxMF8wMDApO1xuICAgICAgfSksXG4gICAgXSk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlID0gZmFsc2U7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfVxufVxuIl19
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZUhpc3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9jYXB0dXJlSGlzdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFTcEUscUdBQXFHO0FBQ3JHLE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLE9BQXlCLEVBQ3pCLE1BQWlCLEVBQ2pCLFFBQStCLEVBQy9CLEtBQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdEMsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPO0lBQ3JCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSx5QkFBeUIsRUFBRSxDQUFDLENBQUM7UUFDL0UsT0FBTztJQUNULENBQUM7SUFDRCxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixJQUFJLEtBQWdE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QU8sRUFBRSxDQUFDO2dCQUNaLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQztTQUNILENBQUMsQ0FBQztJQUNMLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTWV0YSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGNvcHlDYXB0dXJlRXZpZGVuY2UsIHZhbGlkYXRlQWJzZW50RW50cmllcyB9IGZyb20gJy4uL2NhcHR1cmUvYWJzZW50RW50cmllcy5qcyc7XG5pbXBvcnQgeyBjb3B5SGlzdG9yeURhdGEsIGhpc3RvcnlEaWdlc3QsIGhpc3RvcnlFdmlkZW5jZSwgaGlzdG9yeUZhaWx1cmVSZWFzb24gfSBmcm9tICcuLi9jYXB0dXJlL2hpc3RvcnlEYXRhLmpzJztcbmltcG9ydCB7IGhpc3RvcnlOb3RlIH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5Tm90ZS5qcyc7XG5pbXBvcnQgeyBjb3B5SGlzdG9yeVJlY2VpcHQsIGNvcHlIaXN0b3J5VGFyZ2V0IH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5VGFyZ2V0LmpzJztcbmltcG9ydCB7IENBUFRVUkVfSElTVE9SWV9OT1RFLCBDQVBUVVJFX1JFQ0VJUFRfTk9URSB9IGZyb20gJy4uL2NhcHR1cmUvaGlzdG9yeVR5cGVzLmpzJztcbmltcG9ydCB7IHN0b3JlZFJlYWRTb3VyY2VzIH0gZnJvbSAnLi4vY2FwdHVyZS9zdG9yZWRSZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvblJ1bnRpbWUsIFJ1bnRpbWVTbmFwc2hvdCB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1blJlY29yZCB9IGZyb20gJy4vcmVjb3JkU2luay5qcyc7XG5cbi8qKiBAaW50ZXJuYWwgS2VlcHMgYSB0aW1lZC1vdXQgb3BlcmF0aW9uIGxlYXNlZCB1bnRpbCBpdHMgYWN0dWFsIHNldHRsZW1lbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVIaXN0b3J5TGVhc2Uge1xuICBwZW5kaW5nOiBib29sZWFuO1xufVxuXG4vKiogUGVyc2lzdCBvbmUgdGVybWluYWwgbmF0aXZlIHJvb3Qgc2VnbWVudCwgd2l0aG91dCBjaGFuZ2luZyBpdHMgbWVtb3J5LW9ubHkgZW5naW5lIG9ic2VydmF0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RDYXB0dXJlSGlzdG9yeShcbiAgcnVudGltZTogRXhlY3V0aW9uUnVudGltZSxcbiAgcmVjb3JkOiBSdW5SZWNvcmQsXG4gIHNuYXBzaG90OiAoKSA9PiBSdW50aW1lU25hcHNob3QsXG4gIGxlYXNlOiBDYXB0dXJlSGlzdG9yeUxlYXNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZWNvcmQuY2FwdHVyZU9wdGlvbnM7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuO1xuICBpZiAobGVhc2UucGVuZGluZykge1xuICAgIHJlY29yZC5jYXB0dXJlUmVzdWx0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ2Fja25vd2xlZGdlbWVudC1wZW5kaW5nJyB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGVhc2UucGVuZGluZyA9IHRydWU7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCBhY3RpdmUgPSB0cnVlO1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICBjb25zdCB1bmtub3duID0gKHJlYXNvbjogc3RyaW5nKSA9PiByZWNvcmQuY2FwdHVyZVJlc3VsdCh7IHN0YXR1czogJ3Vua25vd24nLCByZWFzb24gfSk7XG4gIGNvbnN0IHdvcmsgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghcnVudGltZS5jYXB0dXJlIHx8IHJlY29yZC5zdGF0cygpLmZhaWxlZCA+IDApIHJldHVybiB1bmtub3duKCdwcmlvci1kZWxpdmVyeS1mYWlsZWQnKTtcbiAgICAgIGNvbnN0IHZpZXcgPSBzbmFwc2hvdCgpO1xuICAgICAgY29uc3Qgbm90ZSA9IHZpZXcuY2FwdHVyZTtcbiAgICAgIGlmICghbm90ZSB8fCBub3RlLmJvdW5kYXJ5LnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSByZXR1cm4gdW5rbm93bignY2FwdHVyZS11bmF2YWlsYWJsZScpO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IGhpc3RvcnlFdmlkZW5jZShcbiAgICAgICAgY29weUNhcHR1cmVFdmlkZW5jZShcbiAgICAgICAgICByZWNvcmQuc2VydmUoe1xuICAgICAgICAgICAgY2FwdHVyZTogbm90ZSxcbiAgICAgICAgICAgIGV4ZWN1dGlvblRyZWU6IHZpZXcuZXhlY3V0aW9uVHJlZSxcbiAgICAgICAgICAgIC4uLih2aWV3LnJlY29yZGVycyAmJiB7IHJlY29yZGVyczogdmlldy5yZWNvcmRlcnMgfSksXG4gICAgICAgICAgICAuLi4odmlldy5yZWFkU291cmNlcyAmJiB7IHJlYWRTb3VyY2VzOiB2aWV3LnJlYWRTb3VyY2VzIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9wdGlvbnMubWF4Qnl0ZXMgPz8gMTAyNCAqIDEwMjQsXG4gICAgICAgICksXG4gICAgICApIGFzIE1ldGE7XG4gICAgICBjb25zdCBiYXNpcyA9IGNvcHlIaXN0b3J5RGF0YShcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdExvZzogdmlldy5jb21taXRMb2csXG4gICAgICAgICAgLi4uKHZpZXcuaW5pdGlhbFN0YXRlICE9PSB1bmRlZmluZWQgJiYgeyBpbml0aWFsU3RhdGU6IHJlY29yZC5jYXB0dXJlSW5pdGlhbFN0YXRlKHZpZXcuaW5pdGlhbFN0YXRlKSB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucy5tYXhCeXRlcyA/PyAxMDI0ICogMTAyNCxcbiAgICAgICk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBjb3B5SGlzdG9yeVRhcmdldCh7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIGV2aWRlbmNlSWQ6IG5vdGUucnVuSWQsXG4gICAgICAgIHJ1bklkOiBub3RlLnJ1bklkLFxuICAgICAgICBkaWdlc3Q6IGF3YWl0IGhpc3RvcnlEaWdlc3QoeyBldmlkZW5jZTogcGF5bG9hZCwgcmVjb3JkOiBiYXNpcyB9KSxcbiAgICAgICAgbG9nQWRkcmVzczogbm90ZS5sb2dBZGRyZXNzLFxuICAgICAgICBjb21taXRzOiBub3RlLmNvbW1pdHMsXG4gICAgICB9KTtcbiAgICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIHVua25vd24oJ2NhcHR1cmUtdW5hdmFpbGFibGUnKTtcbiAgICAgIGNvbnN0IGV2aWRlbmNlID0gY29weUhpc3RvcnlEYXRhKHJlY29yZC5zZXJ2ZSh7IHRhcmdldCwgLi4ucGF5bG9hZCB9KSwgb3B0aW9ucy5tYXhCeXRlcyA/PyAxMDI0ICogMTAyNCkgYXMgTWV0YTtcbiAgICAgIC8vIEEgcmVkYWN0aW9uIHJ1bGUgbWF5IG1hc2sgcHJvdG9jb2wgZmllbGRzIHRvby4gU3VjaCBhIHJlY29yZCBpcyBub3QgZWxpZ2libGUgZm9yIGFja25vd2xlZGdlbWVudC5cbiAgICAgIGlmIChcbiAgICAgICAgIXZhbGlkYXRlQWJzZW50RW50cmllcyhldmlkZW5jZSkgfHxcbiAgICAgICAgIWNvcHlIaXN0b3J5VGFyZ2V0KGV2aWRlbmNlLnRhcmdldCkgfHxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29weUhpc3RvcnlUYXJnZXQoZXZpZGVuY2UudGFyZ2V0KSkgIT09IEpTT04uc3RyaW5naWZ5KHRhcmdldClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVua25vd24oJ2V2aWRlbmNlLXJlZnVzZWQnKTtcbiAgICAgIGlmICh2aWV3LnJlYWRTb3VyY2VzKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSB2ZXJzaW9uLTEgcHJvZHVjZXIgc3RyZWFtLCBpbmNsdWRpbmcgaGlzdG9yaWNhbGx5IG1hc2tlZCBwcm90b2NvbCBub3Rlcy5cbiAgICAgICAgY29uc3QgYWRtaXR0ZWROb3RlID0gaGlzdG9yeU5vdGUoZXZpZGVuY2UuY2FwdHVyZSwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFhZG1pdHRlZE5vdGUgfHxcbiAgICAgICAgICBhZG1pdHRlZE5vdGUudmVyc2lvbiAhPT0gMiB8fFxuICAgICAgICAgICFzdG9yZWRSZWFkU291cmNlcyhcbiAgICAgICAgICAgIGV2aWRlbmNlLnJlYWRTb3VyY2VzLFxuICAgICAgICAgICAgYWRtaXR0ZWROb3RlLFxuICAgICAgICAgICAgdmlldy5jb21taXRMb2csXG4gICAgICAgICAgICAoYmFzaXMgYXMgeyBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS5pbml0aWFsU3RhdGUsXG4gICAgICAgICAgICBldmlkZW5jZS5leGVjdXRpb25UcmVlLFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiB1bmtub3duKCdldmlkZW5jZS1yZWZ1c2VkJyk7XG4gICAgICB9XG4gICAgICBydW50aW1lLm5vdGVSZWNvcmQoQ0FQVFVSRV9ISVNUT1JZX05PVEUsIGV2aWRlbmNlKTtcbiAgICAgIGNvbnN0IGRlbGl2ZXJlZCA9IGF3YWl0IHJlY29yZC5mbHVzaChvcHRpb25zLnRpbWVvdXRNcyA/PyAxMF8wMDApO1xuICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjtcbiAgICAgIGlmICghZGVsaXZlcmVkLmRvbmUgfHwgcmVjb3JkLnBlbmRpbmdDYXB0dXJlRGVsaXZlcmllcyB8fCByZWNvcmQuc3RhdHMoKS5mYWlsZWQgPiAwKVxuICAgICAgICByZXR1cm4gdW5rbm93bignZXZpZGVuY2UtZGVsaXZlcnktdW5rbm93bicpO1xuICAgICAgY29uc3QgcmVjZWlwdCA9IGNvcHlIaXN0b3J5UmVjZWlwdChhd2FpdCBvcHRpb25zLmFja25vd2xlZGdlKHRhcmdldCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pLCB0YXJnZXQpO1xuICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjtcbiAgICAgIGlmICghcmVjZWlwdCkgcmV0dXJuIHVua25vd24oJ2Fja25vd2xlZGdlbWVudC1yZWZ1c2VkJyk7XG4gICAgICBjb25zdCBzZXJ2ZWRSZWNlaXB0ID0gcmVjb3JkLnNlcnZlKHsgLi4ucmVjZWlwdCB9KTtcbiAgICAgIGlmICghY29weUhpc3RvcnlSZWNlaXB0KHNlcnZlZFJlY2VpcHQsIHRhcmdldCkpIHJldHVybiB1bmtub3duKCdhY2tub3dsZWRnZW1lbnQtcmVmdXNlZCcpO1xuICAgICAgcnVudGltZS5ub3RlUmVjb3JkKENBUFRVUkVfUkVDRUlQVF9OT1RFLCBzZXJ2ZWRSZWNlaXB0KTtcbiAgICAgIGNvbnN0IHBlcnNpc3RlZCA9IGF3YWl0IHJlY29yZC5mbHVzaChvcHRpb25zLnRpbWVvdXRNcyA/PyAxMF8wMDApO1xuICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjtcbiAgICAgIGlmICghcGVyc2lzdGVkLmRvbmUgfHwgcmVjb3JkLnBlbmRpbmdDYXB0dXJlRGVsaXZlcmllcyB8fCByZWNvcmQuc3RhdHMoKS5mYWlsZWQgPiAwKVxuICAgICAgICByZXR1cm4gdW5rbm93bigncmVjZWlwdC1kZWxpdmVyeS11bmtub3duJyk7XG4gICAgICByZWNvcmQuY2FwdHVyZVJlc3VsdCh7IHN0YXR1czogJ2Fja25vd2xlZGdlZCcgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChhY3RpdmUpIHVua25vd24oaGlzdG9yeUZhaWx1cmVSZWFzb24oZXJyb3IsICdldmlkZW5jZScpKTtcbiAgICB9XG4gIH07XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgIHdvcmsoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgbGVhc2UucGVuZGluZyA9IGZhbHNlO1xuICAgICAgfSksXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICB1bmtub3duKCdhY2tub3dsZWRnZW1lbnQtdGltZW91dCcpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0TXMgPz8gMTBfMDAwKTtcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { CommitBundle, StoredRecordLimits } from 'foottrace';
|
|
2
2
|
import type { CaptureHistoryReceipt } from '../capture/historyTypes.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { EngineReadSources, NativeCaptureObservation } from '../capture/readSources.js';
|
|
4
4
|
import type { StageSnapshot } from '../memory/frameTypes.js';
|
|
5
5
|
import type { RecorderSnapshot } from './ExecutionRuntime.js';
|
|
6
6
|
/** Engine history whose storage evidence matched. Channels and native limitations retain their original meanings. */
|
|
7
7
|
export interface StoredCaptureHistory {
|
|
8
8
|
readonly runId: string;
|
|
9
|
-
readonly capture:
|
|
9
|
+
readonly capture: NativeCaptureObservation;
|
|
10
|
+
/** Original memory observation covered by this history receipt, never storage authority by itself. */
|
|
11
|
+
readonly readSources?: EngineReadSources;
|
|
10
12
|
readonly executionTree: StageSnapshot;
|
|
11
13
|
/**
|
|
12
14
|
* Sorted literal paths of own undefined stageReads/stageWrites entries omitted by JSON.
|