@dbx-tools/appkit-mastra 0.9.121 → 0.9.122
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 +22 -14
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/agents.d.ts +7 -3
- package/lib/src/agents.js +11 -6
- package/lib/src/config.d.ts +1 -1
- package/lib/src/config.js +2 -2
- package/lib/src/mlflow.js +5 -6
- package/lib/src/plugin.js +16 -4
- package/lib/src/remote-skills.d.ts +8 -9
- package/lib/src/remote-skills.js +43 -10
- package/lib/src/telemetry.js +3 -4
- package/lib/src/workspaces.d.ts +7 -5
- package/lib/src/workspaces.js +69 -11
- package/package.json +20 -17
- package/src/agents.ts +26 -9
- package/src/config.ts +2 -2
- package/src/mlflow.ts +4 -4
- package/src/plugin.ts +15 -3
- package/src/remote-skills.ts +53 -13
- package/src/telemetry.ts +2 -3
- package/src/workspaces.ts +80 -11
package/lib/src/telemetry.js
CHANGED
|
@@ -18,9 +18,8 @@
|
|
|
18
18
|
* @module
|
|
19
19
|
*/
|
|
20
20
|
import { StringDecoder } from "node:string_decoder";
|
|
21
|
-
import { appkit } from "@dbx-tools/appkit";
|
|
22
21
|
import { getRequestTags } from "@dbx-tools/appkit/request-tags";
|
|
23
|
-
import { json, log, object, stringUtils } from "@dbx-tools/shared-core";
|
|
22
|
+
import { environmentUtils, json, log, object, stringUtils } from "@dbx-tools/shared-core";
|
|
24
23
|
import { feedback, thread } from "@dbx-tools/shared-mastra";
|
|
25
24
|
import { context, createContextKey, SpanKind, trace } from "@opentelemetry/api";
|
|
26
25
|
import { getRPCMetadata, RPCType } from "@opentelemetry/core";
|
|
@@ -399,7 +398,7 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
|
|
|
399
398
|
}
|
|
400
399
|
const traceState = { tags: new Map() };
|
|
401
400
|
const traceRequestTime = Date.now();
|
|
402
|
-
if (!
|
|
401
|
+
if (!environmentUtils.isDatabricksAppEnv()) {
|
|
403
402
|
setChatTraceTag(traceState, MLFLOW_LOCAL_TAG, true);
|
|
404
403
|
}
|
|
405
404
|
for (const [name, value] of Object.entries(getRequestTags(req))) {
|
|
@@ -545,4 +544,4 @@ export function attachChatTurnTelemetry(app, options = {}) {
|
|
|
545
544
|
app.use((req, res, next) => chatTurnTelemetryMiddleware(req, res, next, options));
|
|
546
545
|
logger.info("chat turn telemetry middleware attached", options);
|
|
547
546
|
}
|
|
548
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFDM0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsdUJBQXVCLEdBQ3hCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hC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QUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUM3QixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsR0FBb0IsRUFDcEIsVUFBb0MsRUFBRTtJQUV0QyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEYsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5IGVhY2ggTWFzdHJhIGNoYXQgdHVybidzIHJlcXVlc3QvcmVzcG9uc2Ugb250byBpdHMgT1RlbCByb290IHNwYW5cbiAqIHNvIERhdGFicmlja3MtbWFuYWdlZCBNTGZsb3cgY2FuIGRpc3BsYXkgdGhlbS5cbiAqXG4gKiBXaHkgdGhpcyBleGlzdHM6IE1MZmxvdydzIFVDIGA8dGFyZ2V0Pl90cmFjZV91bmlmaWVkYCB2aWV3IHBpY2tzIHRoZVxuICogb25lIHNwYW4gd2hvc2UgYHBhcmVudF9zcGFuX2lkYCBpcyBlbXB0eSBhbmQgcmVhZHMgcmVxdWVzdC9yZXNwb25zZVxuICogZnJvbSBgbWxmbG93LnNwYW5JbnB1dHNgIC8gYG1sZmxvdy5zcGFuT3V0cHV0c2AgKG9yIHRoZSBgZ2VuX2FpLipgXG4gKiBlcXVpdmFsZW50cykgb24gVEhBVCBzcGFuIG9ubHkuIE1hc3RyYSByZWNvcmRzIHRoZSB0dXJuIG9uIGl0c1xuICogYGludm9rZV9hZ2VudGAgY2hpbGQgdW5kZXIgYG1hc3RyYS5hZ2VudF9ydW4uaW5wdXRgIC8gYC5vdXRwdXRgLCBrZXlzXG4gKiB0aGUgdmlldyBuZXZlciByZWFkcywgc28gY2hhdCB0cmFjZXMgYXJyaXZlIHdpdGggYm90aCBjb2x1bW5zIG51bGxcbiAqIGV2ZW4gd2hlbiB0aGUgc3BhbnMgdGhlbXNlbHZlcyBsb29rIGhlYWx0aHkuXG4gKlxuICogQXBwS2l0J3MgSFRUUCBpbnN0cnVtZW50YXRpb24gcmVjb3JkcyB0aGUgc2VydmVyIHNwYW4gaW4gT1RlbCBSUEMgbWV0YWRhdGEsXG4gKiB3aGljaCByZW1haW5zIGF2YWlsYWJsZSBldmVuIHdoZW4gRXhwcmVzcyBtYWtlcyBhIG1pZGRsZXdhcmUtbGF5ZXIgY2hpbGRcbiAqIGFjdGl2ZS4gV2hlbiBpbnN0cnVtZW50YXRpb24gaXMgdW5hdmFpbGFibGUsIHRoaXMgbW9kdWxlIGNyZWF0ZXMgb25lXG4gKiByZXF1ZXN0LWxpZmV0aW1lIHNlcnZlciBzcGFuIGFuZCBydW5zIE1hc3RyYSB1bmRlciBpdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgU3RyaW5nRGVjb2RlciB9IGZyb20gXCJub2RlOnN0cmluZ19kZWNvZGVyXCI7XG5cbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZ2V0UmVxdWVzdFRhZ3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQvcmVxdWVzdC10YWdzXCI7XG5pbXBvcnQgeyBqc29uLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZmVlZGJhY2ssIHRocmVhZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IGNvbnRleHQsIGNyZWF0ZUNvbnRleHRLZXksIFNwYW5LaW5kLCB0cmFjZSwgdHlwZSBTcGFuIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgZ2V0UlBDTWV0YWRhdGEsIFJQQ1R5cGUgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvY29yZVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBVU0VSX0VNQUlMX0hFQURFUiwgVVNFUl9JRF9IRUFERVIgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHtcbiAgZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSxcbiAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2UsXG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyxcbn0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQge1xuICBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSLFxuICBNTEZMT1dfQUdFTlRfVEFHLFxuICBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsXG4gIE1MRkxPV19HRU5JRV9UQUcsXG4gIE1MRkxPV19HRU5JRV9UQUdfQVRUUixcbiAgTUxGTE9XX0xPQ0FMX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5leHBvcnQge1xuICBNTEZMT1dfQUdFTlRfVEFHLFxuICBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsXG4gIEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIsXG4gIE1MRkxPV19HRU5JRV9UQUcsXG4gIE1MRkxPV19HRU5JRV9UQUdfQVRUUixcbiAgTUxGTE9XX0xPQ0FMX1RBRyxcbiAgTUxGTE9XX0xPQ0FMX1RBR19BVFRSLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHX0FUVFIsXG4gIE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgTUxGTE9XX1NQX0FVVEhfVEFHX0FUVFIsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvdGVsZW1ldHJ5XCIpO1xuXG4vKiogQ2FwIG9uIGVhY2ggcGF5bG9hZCBjb3BpZWQgb250byBhIHNwYW4sIHNvIG9uZSB0dXJuIGNhbm5vdCBibG9hdCB0aGUgZXhwb3J0LiAqL1xuZXhwb3J0IGNvbnN0IFRSQUNFX0lPX0xJTUlUID0gOF8wMDA7XG5cbi8qKiBCb3VuZCBmb3IgYSBub24tc3RyZWFtaW5nIGJvZHkgY2FwdHVyZWQgdGhyb3VnaCBgcmVzLmVuZGAgaW5zdGVhZCBvZiBgcmVzLmpzb25gLiAqL1xuY29uc3QgUkVTUE9OU0VfQk9EWV9MSU1JVCA9IFRSQUNFX0lPX0xJTUlUICogNDtcblxuLyoqIFRyYWNlciBzY29wZSB1c2VkIG9ubHkgd2hlbiBBcHBLaXQgZGlkIG5vdCBjcmVhdGUgYSByZWNvcmRpbmcgSFRUUCBzcGFuLiAqL1xuY29uc3QgQ0hBVF9UVVJOX1RSQUNFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhL3RlbGVtZXRyeVwiO1xuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIE1hc3RyYSBhZ2VudCBpbnZva2UgcGF0aHMgdGhhdCBjYXJyeSBhIGNoYXQgdHVybiBib2R5XG4gKiAoYG1lc3NhZ2VzYCkgYW5kIHN0cmVhbSBhbiBhc3Npc3RhbnQgYW5zd2VyLiBSZXN1bWUgLyBhcHByb3ZlIHZlcmJzXG4gKiBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZDogdGhlaXIgYm9kaWVzIGFyZSB0b29sIGRlY2lzaW9ucywgbm90IHRoZVxuICogdXNlciBwcm9tcHQsIGFuZCB0aGV5IHJhcmVseSBwcm9kdWNlIGEgZnJlc2ggYW5zd2VyIHdvcnRoIHN1cmZhY2luZy5cbiAqL1xuY29uc3QgQUdFTlRfVFVSTl9ST1VURSA9IC9eKD86XFwvYWdlbnRzXFwvW14vXStcXC8oPzpzdHJlYW18Z2VuZXJhdGUpKD86XFwvfCQpfFxcL2NoYXRcXC9bXi9dKyQpL2k7XG5cbi8qKiBBdHRyaWJ1dGUga2V5cyB0aGUgTUxmbG93IFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgcmVhZHMgZnJvbSB0aGUgcm9vdCBzcGFuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX0lOUFVUU19BVFRSID0gXCJtbGZsb3cuc3BhbklucHV0c1wiO1xuLyoqIFJvb3Qtc3BhbiBhdHRyaWJ1dGUgY29uc3VtZWQgYXMgY2hhdCBvdXRwdXQgYnkgTUxmbG93IHVuaWZpZWQgdHJhY2Ugdmlld3MuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSID0gXCJtbGZsb3cuc3Bhbk91dHB1dHNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVxdWVzdCBtZXNzYWdlcyByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfTUVTU0FHRVNfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0Lm1lc3NhZ2VzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlc3BvbnNlIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9SRVNQT05TRV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQucmVzcG9uc2VcIjtcbi8qKiBDcmVkZW50aWFsIG1vZGUgdXNlZCBieSBEYXRhYnJpY2tzIGNhbGxzIGluIHRoaXMgY2hhdCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfSURFTlRJVFlfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5pZGVudGl0eS5tb2RlXCI7XG4vKiogV2hldGhlciB0aGUgc3RyZWFtZWQgdHVybiBlbWl0dGVkIGEgR2VuaWUgdG9vbCBvciBwcm9ncmVzcyBldmVudC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0dFTklFX1VTRURfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5nZW5pZS51c2VkXCI7XG4vKipcbiAqIE1MZmxvdyBzcGFuLXR5cGUgYXR0cmlidXRlLiBEYXRhYnJpY2tzIG1hcHMgdGhpcyAob3IgYGdlbl9haS5vcGVyYXRpb24ubmFtZWApXG4gKiBvbnRvIHRoZSB0eXBlIGNoaXAgaW4gdGhlIGV4cGVyaW1lbnQgVUkuIEN1c3RvbSB2YWx1ZXMgc3VjaCBhcyBgR0VOSUVgIGFyZVxuICogYWxsb3dlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQVRUUiA9IFwibWxmbG93LnNwYW5UeXBlXCI7XG4vKiogR2VuQUkgc2VtYW50aWMtY29udmVudGlvbiBvcGVyYXRpb24gbmFtZSwgYW4gYWx0ZXJuYXRlIHNwYW4tdHlwZSBzb3VyY2UuICovXG5leHBvcnQgY29uc3QgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIgPSBcImdlbl9haS5vcGVyYXRpb24ubmFtZVwiO1xuLyoqXG4gKiBSb290LXNwYW4gdXNlciBpZCB0aGUgTUxmbG93IGV4cGVyaW1lbnQgVUkncyBVc2VyIGNvbHVtbiByZWFkcyBmcm9tIE9UZWxcbiAqIHRyYWNlcy4gUHJlZmVyIHRoZSBmb3J3YXJkZWQgZW1haWwgd2hlbiBwcmVzZW50IHNvIHRoZSBjb2x1bW4gaXMgaHVtYW4uXG4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfVVNFUl9BVFRSID0gXCJ1c2VyLmlkXCI7XG4vKiogUm9vdC1zcGFuIHNlc3Npb24gaWQgdGhhdCBlbmFibGVzIHRoZSBNTGZsb3cgU2Vzc2lvbnMgdGFiLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TRVNTSU9OX0FUVFIgPSBcInNlc3Npb24uaWRcIjtcbi8qKiBSb290LXNwYW4gdHlwZSBmb3IgYSBNYXN0cmEgYWdlbnQgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UID0gXCJBR0VOVFwiO1xuLyoqIFNwYW4gdHlwZSBmb3IgYW4gYGFza19nZW5pZWAgdG9vbCBjYWxsLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfR0VOSUUgPSBcIkdFTklFXCI7XG5cbi8qKiBSb290LXNwYW4gbWV0YWRhdGEga25vd24gYmVmb3JlIGEgY2hhdCByZXF1ZXN0IGlzIGRpc3BhdGNoZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGlkZW50aXR5PzpcbiAgICBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpO1xuICAvKiogSW5pdGlhbCB0cmFjZSB0YWdzIGRlcml2ZWQgZnJvbSB0aGUgaW5ib3VuZCByZXF1ZXN0LiAqL1xuICByZWFkb25seSB0YWdzPzpcbiAgICB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj5cbiAgICB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+KTtcbn1cblxuaW50ZXJmYWNlIFRyYWNlVGFyZ2V0IHtcbiAgc3BhbjogU3BhbjtcbiAgb3duZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDaGF0VHJhY2VTdGF0ZSB7XG4gIHJlYWRvbmx5IHRhZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGZpcnN0TW9kZWw/OiBzdHJpbmc7XG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBWYWx1ZXMgYWNjZXB0ZWQgYnkgcmVxdWVzdC1zY29wZWQgdHJhY2UtdGFnIGluamVjdGlvbiBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgQ2hhdFRyYWNlVGFnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG5jb25zdCBDSEFUX1RSQUNFX1NUQVRFX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvY2hhdC10cmFjZS1zdGF0ZVwiKTtcblxuLyoqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcblxuLyoqXG4gKiBNYXJrIHRoZSBhY3RpdmUgc3BhbiBhcyBhIEdlbmllIGNhbGwgc28gdGhlIGV4cGVyaW1lbnQgVUkgdHlwZXMgaXQgYEdFTklFYFxuICogYW5kIHRhZ3MgdGhlIHRyYWNlIGBnZW5pZT10cnVlYC4gU2FmZSBuby1vcCB3aGVuIG5vIHJlY29yZGluZyBzcGFuIGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW1wR2VuaWVUb29sU3BhbihzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogdm9pZCB7XG4gIGlmICghc3Bhbj8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgXCJleGVjdXRlX3Rvb2xcIik7XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SGVhZGVyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmcm9tTWV0aG9kID1cbiAgICB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfVVNFUl9BVFRSLCB1c2VyKTtcbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgcmVxdWVzdEhlYWRlcihyZXEsIHRocmVhZC5USFJFQURfSURfSEVBREVSKSA/PyByZXF1ZXN0UXVlcnkocmVxLCB0aHJlYWQuVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2V0Q2hhdFRyYWNlVGFnKHN0YXRlOiBDaGF0VHJhY2VTdGF0ZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogQ2hhdFRyYWNlVGFnVmFsdWUpOiB2b2lkIHtcbiAgY29uc3QgdGFnID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChuYW1lKTtcbiAgaWYgKCF0YWcpIHJldHVybjtcbiAgc3RhdGUudGFncy5zZXQodGFnLCBTdHJpbmcodmFsdWUpKTtcbn1cblxuLyoqIEluamVjdCBvbmUgTUxmbG93IHRyYWNlIHRhZyBpbnRvIHRoZSBhY3RpdmUgY2hhdCByZXF1ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVGFnKG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlID0gdHJ1ZSk6IHZvaWQge1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmIChzdGF0ZSkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG59XG5cbi8qKiBJbmplY3QgbXVsdGlwbGUgTUxmbG93IHRyYWNlIHRhZ3MgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZ3MoXG4gIHRhZ3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm47XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcoc3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG4vKiogUmVjb3JkIHRoZSBmaXJzdCBzZWxlY3RlZCBtb2RlbCBhcyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UncyBgYWdlbnRgIHRhZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZU1vZGVsKG1vZGVsSWQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gIGlmICghdmFsdWUpIHJldHVybjtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlIHx8IHN0YXRlLmZpcnN0TW9kZWwpIHJldHVybjtcbiAgc3RhdGUuZmlyc3RNb2RlbCA9IHZhbHVlO1xuICBzZXRDaGF0VHJhY2VUYWcoc3RhdGUsIE1MRkxPV19BR0VOVF9UQUcsIHZhbHVlKTtcbiAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKHNwYW4/LmlzUmVjb3JkaW5nKCkpIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19BR0VOVF9UQUdfQVRUUiwgdmFsdWUpO1xuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MoeyBbTUxGTE9XX0FHRU5UX1RBR106IHZhbHVlIH0pO1xufVxuXG4vKiogUmVjb3JkIHRoZSBiZXN0IHJlc29sdmVkIHVzZXIgaWRlbnRpZmllciBvbiB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VVc2VyKHVzZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodXNlcik7XG4gIGlmICghdmFsdWUpIHJldHVybjtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHN0YXRlLnVzZXIgPSB2YWx1ZTtcbn1cblxuLyoqIFJlY29yZCBvbmUgRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBtb2RlIHVzZWQgZHVyaW5nIHRoZSBhY3RpdmUgY2hhdCB0cmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZUF1dGgoYXV0aDogXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIik6IHZvaWQge1xuICByZWNvcmRBY3RpdmVUcmFjZVRhZyhhdXRoID09PSBcIm9ib1wiID8gTUxGTE9XX09CT19BVVRIX1RBRyA6IE1MRkxPV19TUF9BVVRIX1RBRyk7XG59XG5cbi8qKiBQdWJsaXNoIHRoZSB0dXJuJ3MgTUxmbG93IHRyYWNlIGlkIGJlZm9yZSB0aGUgaGFuZGxlciB3cml0ZXMgdGhlIGJvZHkuICovXG5mdW5jdGlvbiBzdGFtcE1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlLCBzcGFuOiBTcGFuKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICBpZiAoIXRyYWNlSWQgfHwgdHJhY2VJZCA9PT0gSU5WQUxJRF9UUkFDRV9JRCkgcmV0dXJuO1xuICByZXMuc2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIsIGB0ci0ke3RyYWNlSWR9YCk7XG59XG5cbi8qKiBSZXR1cm4gb25lIHJhdyBwcm9tcHQgd2hlbiB0aGUgcmVxdWVzdCBpcyBleGFjdGx5IG9uZSB0ZXh0LW9ubHkgdXNlciBtZXNzYWdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRleHRPbmx5Q2hhdElucHV0KG1lc3NhZ2VzOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG1lc3NhZ2VzIHx8IHVuZGVmaW5lZDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG1lc3NhZ2VzKSB8fCBtZXNzYWdlcy5sZW5ndGggIT09IDEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1swXTtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQobWVzc2FnZSkgfHwgbWVzc2FnZS5yb2xlICE9PSBcInVzZXJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlLmNvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLnBhcnRzKSA/PyB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UuY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIHRleHRGcm9tUGFydHModmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdGV4dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHZhbHVlKSB7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFydCkgfHwgcGFydC50eXBlICE9PSBcInRleHRcIiB8fCB0eXBlb2YgcGFydC50ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0ZXh0LnB1c2gocGFydC50ZXh0KTtcbiAgfVxuICBjb25zdCBqb2luZWQgPSB0ZXh0LmpvaW4oXCJcIik7XG4gIHJldHVybiBqb2luZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkKHZhbHVlOiB1bmtub3duLCBsaW1pdCA9IFRSQUNFX0lPX0xJTUlUKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKT8uc2xpY2UoMCwgbGltaXQpID8/IFN0cmluZyh2YWx1ZSkuc2xpY2UoMCwgbGltaXQpO1xufVxuXG5mdW5jdGlvbiBzc2VGcmFtZShsaW5lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGpzb24ucGFyc2UobGluZS5zbGljZSg1KSk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlVXNlc0dlbmllKHZhbHVlOiB1bmtub3duLCBkZXB0aCA9IDApOiBib29sZWFuIHtcbiAgaWYgKGRlcHRoID4gMykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5zb21lKChpdGVtKSA9PiB2YWx1ZVVzZXNHZW5pZShpdGVtLCBkZXB0aCArIDEpKTtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICB2YWx1ZS50eXBlID09PSBcImRhdGEtZ2VuaWUtcHJvZ3Jlc3NcIiB8fFxuICAgIHZhbHVlLnR5cGUgPT09IFwiYXNrX2dlbmllX2RvbmVcIiB8fFxuICAgIHZhbHVlLnRvb2xOYW1lID09PSBcImFza19nZW5pZVwiIHx8XG4gICAgdmFsdWUudG9vbF9uYW1lID09PSBcImFza19nZW5pZVwiIHx8XG4gICAgdmFsdWUubmFtZSA9PT0gXCJhc2tfZ2VuaWVcIlxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gW1wiZGF0YVwiLCBcImV2ZW50XCIsIFwicGF5bG9hZFwiXS5zb21lKChrZXkpID0+IHZhbHVlVXNlc0dlbmllKHZhbHVlW2tleV0sIGRlcHRoICsgMSkpO1xufVxuXG4vKiogUmV0dXJuIHRoZSBhc3Npc3RhbnQgdGV4dCBmcm9tIG9uZSBTU0UgbGluZSwgb3IgYW4gZW1wdHkgc3RyaW5nLiAqL1xuZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2VMaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKHNzZUZyYW1lKGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKGZyYW1lKSB8fCBmcmFtZS50eXBlICE9PSBcInRleHQtZGVsdGFcIikgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHRleHQgPVxuICAgIHR5cGVvZiBmcmFtZS5kZWx0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBmcmFtZS5kZWx0YVxuICAgICAgOiBvYmplY3QuaXNSZWNvcmQoZnJhbWUucGF5bG9hZClcbiAgICAgICAgPyBmcmFtZS5wYXlsb2FkLnRleHRcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIiA/IHRleHQgOiBcIlwiO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIHRoZSBhc3Npc3RhbnQncyBhbnN3ZXIgb3V0IG9mIGFuIEFJIFNESyBTU0UgdHJhbnNjcmlwdC5cbiAqXG4gKiBUaGUgYWdlbnQgc3RyZWFtcyBpdHMgcmVwbHkgYXMgYHRleHQtZGVsdGFgIGZyYW1lc1xuICogKGBkYXRhOiB7XCJ0eXBlXCI6XCJ0ZXh0LWRlbHRhXCIsXCJwYXlsb2FkXCI6e1widGV4dFwiOlwiLi4uXCJ9fWApLCBzbyB0aGUgZnVsbFxuICogYW5zd2VyIG9ubHkgZXZlciBleGlzdHMgYXMgZGVsdGFzIG9uIHRoZSB3aXJlIGFuZCBoYXMgdG8gYmVcbiAqIHJlYXNzZW1ibGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGJvZHkuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VMaW5lKGxpbmUpO1xuICAgIGlmICh0ZXh0KSBwYXJ0cy5wdXNoKHRleHQpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuLyoqIFJlYWQgdGhlIGZpbmFsIGFzc2lzdGFudCB0ZXh0IGZyb20gYSBub24tc3RyZWFtaW5nIE1hc3RyYSByZXNwb25zZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKGJvZHkpIHx8IHR5cGVvZiBib2R5LnRleHQgIT09IFwic3RyaW5nXCIpIHJldHVybiBcIlwiO1xuICByZXR1cm4gYm9keS50ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuLyoqIEluY3JlbWVudGFsbHkgYXNzZW1ibGUgVVRGLTggU1NFIHRleHQgd2hpbGUgcmV0YWluaW5nIGEgYm91bmRlZCBKU09OIGZhbGxiYWNrLiAqL1xuY2xhc3MgQXNzaXN0YW50UmVzcG9uc2VDb2xsZWN0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihcInV0ZjhcIik7XG4gIHByaXZhdGUgYW5zd2VyID0gXCJcIjtcbiAgcHJpdmF0ZSBib2R5ID0gXCJcIjtcbiAgcHJpdmF0ZSBwZW5kaW5nTGluZSA9IFwiXCI7XG4gIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnZW5pZSA9IGZhbHNlO1xuXG4gIHdyaXRlKGNodW5rOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2h1bmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgdGhpcy5jb25zdW1lKFxuICAgICAgICB0aGlzLmRlY29kZXIud3JpdGUoQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5jb25zdW1lKHRoaXMuZGVjb2Rlci5lbmQoKSk7XG4gICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lKTtcbiAgICB0aGlzLnBlbmRpbmdMaW5lID0gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gIH1cblxuICByYXdCb2R5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYm9keS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG4gIH1cblxuICB1c2VkR2VuaWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuaWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMuYm9keS5sZW5ndGggPCBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLmJvZHkgKz0gdGV4dC5zbGljZSgwLCBSRVNQT05TRV9CT0RZX0xJTUlUIC0gdGhpcy5ib2R5Lmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0xpbmUgKz0gdGV4dDtcbiAgICBsZXQgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB3aGlsZSAobmV3bGluZSA+PSAwKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoMCwgbmV3bGluZSkucmVwbGFjZSgvXFxyJC8sIFwiXCIpKTtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKG5ld2xpbmUgKyAxKTtcbiAgICAgIG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlbmRpbmdMaW5lLmxlbmd0aCA+IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKC1SRVNQT05TRV9CT0RZX0xJTUlUKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTc2VMaW5lKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gc3NlRnJhbWUobGluZSk7XG4gICAgdGhpcy5nZW5pZSB8fD0gdmFsdWVVc2VzR2VuaWUoZnJhbWUpO1xuICAgIGlmICh0aGlzLmFuc3dlci5sZW5ndGggPj0gVFJBQ0VfSU9fTElNSVQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5hbnN3ZXIgKz0gdGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCAtIHRoaXMuYW5zd2VyLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGpzb25BbnN3ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Kc29uKGpzb24ucGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHsgdGFnczogbmV3IE1hcCgpIH07XG4gIGNvbnN0IHRyYWNlUmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICBpZiAoIWFwcGtpdC5pc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfTE9DQUxfVEFHLCB0cnVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0UmVxdWVzdFRhZ3MocmVxKSkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGluaXRpYWxUYWdzID0gdHlwZW9mIG9wdGlvbnMudGFncyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50YWdzKHJlcSkgOiBvcHRpb25zLnRhZ3M7XG4gIGlmIChpbml0aWFsVGFncykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVGFncykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0YXJnZXQuc3Bhbik7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgbGV0IHJlcXVlc3RQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgcmVxdWVzdFByZXZpZXcgPSB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0O1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX01FU1NBR0VTX0FUVFIsIGZ1bGxJbnB1dCk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCByZXF1ZXN0UHJldmlldy5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkOiB0YXJnZXRUcmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogRGF0ZS5ub3coKSAtIHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgdGFncyxcbiAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zdGFsbCB7QGxpbmsgY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlfSBvbiBhIE1hc3RyYSBFeHByZXNzIHN1Yi1hcHAuXG4gKlxuICogQ2FsbCBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0KClgIHNvIHRoZSBsYXllciBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudFxuICogcm91dGVzLiBTYWZlIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5OiB3aGVuIG5vIHJlY29yZGluZyB0cmFjZXIgaXMgcmVnaXN0ZXJlZCxcbiAqIHRoZSBtaWRkbGV3YXJlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeShcbiAgYXBwOiBleHByZXNzLkV4cHJlc3MsXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpKTtcbiAgbG9nZ2VyLmluZm8oXCJjaGF0IHR1cm4gdGVsZW1ldHJ5IG1pZGRsZXdhcmUgYXR0YWNoZWRcIiwgb3B0aW9ucyk7XG59XG4iXX0=
|
|
547
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLDJCQUEyQixHQUM1QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQiw0QkFBNEIsRUFDNUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix3QkFB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UUFDN0IsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEdBQW9CLEVBQ3BCLFVBQW9DLEVBQUU7SUFFdEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weSBlYWNoIE1hc3RyYSBjaGF0IHR1cm4ncyByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gaXRzIE9UZWwgcm9vdCBzcGFuXG4gKiBzbyBEYXRhYnJpY2tzLW1hbmFnZWQgTUxmbG93IGNhbiBkaXNwbGF5IHRoZW0uXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBNTGZsb3cncyBVQyBgPHRhcmdldD5fdHJhY2VfdW5pZmllZGAgdmlldyBwaWNrcyB0aGVcbiAqIG9uZSBzcGFuIHdob3NlIGBwYXJlbnRfc3Bhbl9pZGAgaXMgZW1wdHkgYW5kIHJlYWRzIHJlcXVlc3QvcmVzcG9uc2VcbiAqIGZyb20gYG1sZmxvdy5zcGFuSW5wdXRzYCAvIGBtbGZsb3cuc3Bhbk91dHB1dHNgIChvciB0aGUgYGdlbl9haS4qYFxuICogZXF1aXZhbGVudHMpIG9uIFRIQVQgc3BhbiBvbmx5LiBNYXN0cmEgcmVjb3JkcyB0aGUgdHVybiBvbiBpdHNcbiAqIGBpbnZva2VfYWdlbnRgIGNoaWxkIHVuZGVyIGBtYXN0cmEuYWdlbnRfcnVuLmlucHV0YCAvIGAub3V0cHV0YCwga2V5c1xuICogdGhlIHZpZXcgbmV2ZXIgcmVhZHMsIHNvIGNoYXQgdHJhY2VzIGFycml2ZSB3aXRoIGJvdGggY29sdW1ucyBudWxsXG4gKiBldmVuIHdoZW4gdGhlIHNwYW5zIHRoZW1zZWx2ZXMgbG9vayBoZWFsdGh5LlxuICpcbiAqIEFwcEtpdCdzIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHJlY29yZHMgdGhlIHNlcnZlciBzcGFuIGluIE9UZWwgUlBDIG1ldGFkYXRhLFxuICogd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgZXZlbiB3aGVuIEV4cHJlc3MgbWFrZXMgYSBtaWRkbGV3YXJlLWxheWVyIGNoaWxkXG4gKiBhY3RpdmUuIFdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIG1vZHVsZSBjcmVhdGVzIG9uZVxuICogcmVxdWVzdC1saWZldGltZSBzZXJ2ZXIgc3BhbiBhbmQgcnVucyBNYXN0cmEgdW5kZXIgaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiO1xuXG5pbXBvcnQgeyBnZXRSZXF1ZXN0VGFncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC9yZXF1ZXN0LXRhZ3NcIjtcbmltcG9ydCB7IGVudmlyb25tZW50VXRpbHMsIGpzb24sIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgY29udGV4dCwgY3JlYXRlQ29udGV4dEtleSwgU3BhbktpbmQsIHRyYWNlLCB0eXBlIFNwYW4gfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgeyBnZXRSUENNZXRhZGF0YSwgUlBDVHlwZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IFVTRVJfRU1BSUxfSEVBREVSLCBVU0VSX0lEX0hFQURFUiB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlLFxuICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7XG4gIEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIsXG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmV4cG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfTE9DQUxfVEFHX0FUVFIsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUcsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsXG59IGZyb20gXCIuL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS90ZWxlbWV0cnlcIik7XG5cbi8qKiBDYXAgb24gZWFjaCBwYXlsb2FkIGNvcGllZCBvbnRvIGEgc3Bhbiwgc28gb25lIHR1cm4gY2Fubm90IGJsb2F0IHRoZSBleHBvcnQuICovXG5leHBvcnQgY29uc3QgVFJBQ0VfSU9fTElNSVQgPSA4XzAwMDtcblxuLyoqIEJvdW5kIGZvciBhIG5vbi1zdHJlYW1pbmcgYm9keSBjYXB0dXJlZCB0aHJvdWdoIGByZXMuZW5kYCBpbnN0ZWFkIG9mIGByZXMuanNvbmAuICovXG5jb25zdCBSRVNQT05TRV9CT0RZX0xJTUlUID0gVFJBQ0VfSU9fTElNSVQgKiA0O1xuXG4vKiogVHJhY2VyIHNjb3BlIHVzZWQgb25seSB3aGVuIEFwcEtpdCBkaWQgbm90IGNyZWF0ZSBhIHJlY29yZGluZyBIVFRQIHNwYW4uICovXG5jb25zdCBDSEFUX1RVUk5fVFJBQ0VSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvdGVsZW1ldHJ5XCI7XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgTWFzdHJhIGFnZW50IGludm9rZSBwYXRocyB0aGF0IGNhcnJ5IGEgY2hhdCB0dXJuIGJvZHlcbiAqIChgbWVzc2FnZXNgKSBhbmQgc3RyZWFtIGFuIGFzc2lzdGFudCBhbnN3ZXIuIFJlc3VtZSAvIGFwcHJvdmUgdmVyYnNcbiAqIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkOiB0aGVpciBib2RpZXMgYXJlIHRvb2wgZGVjaXNpb25zLCBub3QgdGhlXG4gKiB1c2VyIHByb21wdCwgYW5kIHRoZXkgcmFyZWx5IHByb2R1Y2UgYSBmcmVzaCBhbnN3ZXIgd29ydGggc3VyZmFjaW5nLlxuICovXG5jb25zdCBBR0VOVF9UVVJOX1JPVVRFID0gL14oPzpcXC9hZ2VudHNcXC9bXi9dK1xcLyg/OnN0cmVhbXxnZW5lcmF0ZSkoPzpcXC98JCl8XFwvY2hhdFxcL1teL10rJCkvaTtcblxuLyoqIEF0dHJpYnV0ZSBrZXlzIHRoZSBNTGZsb3cgVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldyByZWFkcyBmcm9tIHRoZSByb290IHNwYW4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuSW5wdXRzXCI7XG4vKiogUm9vdC1zcGFuIGF0dHJpYnV0ZSBjb25zdW1lZCBhcyBjaGF0IG91dHB1dCBieSBNTGZsb3cgdW5pZmllZCB0cmFjZSB2aWV3cy4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuT3V0cHV0c1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXF1ZXN0IG1lc3NhZ2VzIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9NRVNTQUdFU19BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQubWVzc2FnZXNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVzcG9uc2UgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX1JFU1BPTlNFX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5yZXNwb25zZVwiO1xuLyoqIENyZWRlbnRpYWwgbW9kZSB1c2VkIGJ5IERhdGFicmlja3MgY2FsbHMgaW4gdGhpcyBjaGF0IHR1cm4uICovXG5leHBvcnQgY29uc3QgQ0hBVF9JREVOVElUWV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmlkZW50aXR5Lm1vZGVcIjtcbi8qKiBXaGV0aGVyIHRoZSBzdHJlYW1lZCB0dXJuIGVtaXR0ZWQgYSBHZW5pZSB0b29sIG9yIHByb2dyZXNzIGV2ZW50LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfR0VOSUVfVVNFRF9BVFRSID0gXCJhcHBraXQubWFzdHJhLmdlbmllLnVzZWRcIjtcbi8qKlxuICogTUxmbG93IHNwYW4tdHlwZSBhdHRyaWJ1dGUuIERhdGFicmlja3MgbWFwcyB0aGlzIChvciBgZ2VuX2FpLm9wZXJhdGlvbi5uYW1lYClcbiAqIG9udG8gdGhlIHR5cGUgY2hpcCBpbiB0aGUgZXhwZXJpbWVudCBVSS4gQ3VzdG9tIHZhbHVlcyBzdWNoIGFzIGBHRU5JRWAgYXJlXG4gKiBhbGxvd2VkLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BVFRSID0gXCJtbGZsb3cuc3BhblR5cGVcIjtcbi8qKiBHZW5BSSBzZW1hbnRpYy1jb252ZW50aW9uIG9wZXJhdGlvbiBuYW1lLCBhbiBhbHRlcm5hdGUgc3Bhbi10eXBlIHNvdXJjZS4gKi9cbmV4cG9ydCBjb25zdCBHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiA9IFwiZ2VuX2FpLm9wZXJhdGlvbi5uYW1lXCI7XG4vKipcbiAqIFJvb3Qtc3BhbiB1c2VyIGlkIHRoZSBNTGZsb3cgZXhwZXJpbWVudCBVSSdzIFVzZXIgY29sdW1uIHJlYWRzIGZyb20gT1RlbFxuICogdHJhY2VzLiBQcmVmZXIgdGhlIGZvcndhcmRlZCBlbWFpbCB3aGVuIHByZXNlbnQgc28gdGhlIGNvbHVtbiBpcyBodW1hbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19VU0VSX0FUVFIgPSBcInVzZXIuaWRcIjtcbi8qKiBSb290LXNwYW4gc2Vzc2lvbiBpZCB0aGF0IGVuYWJsZXMgdGhlIE1MZmxvdyBTZXNzaW9ucyB0YWIuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NFU1NJT05fQVRUUiA9IFwic2Vzc2lvbi5pZFwiO1xuLyoqIFJvb3Qtc3BhbiB0eXBlIGZvciBhIE1hc3RyYSBhZ2VudCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQgPSBcIkFHRU5UXCI7XG4vKiogU3BhbiB0eXBlIGZvciBhbiBgYXNrX2dlbmllYCB0b29sIGNhbGwuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSA9IFwiR0VOSUVcIjtcblxuLyoqIFJvb3Qtc3BhbiBtZXRhZGF0YSBrbm93biBiZWZvcmUgYSBjaGF0IHJlcXVlc3QgaXMgZGlzcGF0Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OlxuICAgIFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIC8qKiBJbml0aWFsIHRyYWNlIHRhZ3MgZGVyaXZlZCBmcm9tIHRoZSBpbmJvdW5kIHJlcXVlc3QuICovXG4gIHJlYWRvbmx5IHRhZ3M/OlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+PlxuICAgIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4pO1xufVxuXG5pbnRlcmZhY2UgVHJhY2VUYXJnZXQge1xuICBzcGFuOiBTcGFuO1xuICBvd25lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENoYXRUcmFjZVN0YXRlIHtcbiAgcmVhZG9ubHkgdGFnczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZmlyc3RNb2RlbD86IHN0cmluZztcbiAgdXNlcj86IHN0cmluZztcbn1cblxuLyoqIFZhbHVlcyBhY2NlcHRlZCBieSByZXF1ZXN0LXNjb3BlZCB0cmFjZS10YWcgaW5qZWN0aW9uIGhlbHBlcnMuICovXG5leHBvcnQgdHlwZSBDaGF0VHJhY2VUYWdWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbmNvbnN0IENIQVRfVFJBQ0VfU1RBVEVfS0VZID0gY3JlYXRlQ29udGV4dEtleShcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9jaGF0LXRyYWNlLXN0YXRlXCIpO1xuXG4vKiogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy4gKi9cbmNvbnN0IElOVkFMSURfVFJBQ0VfSUQgPSBcIjBcIi5yZXBlYXQoMzIpO1xuXG4vKipcbiAqIE1hcmsgdGhlIGFjdGl2ZSBzcGFuIGFzIGEgR2VuaWUgY2FsbCBzbyB0aGUgZXhwZXJpbWVudCBVSSB0eXBlcyBpdCBgR0VOSUVgXG4gKiBhbmQgdGFncyB0aGUgdHJhY2UgYGdlbmllPXRydWVgLiBTYWZlIG5vLW9wIHdoZW4gbm8gcmVjb3JkaW5nIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbXBHZW5pZVRvb2xTcGFuKHNwYW46IFNwYW4gfCB1bmRlZmluZWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCkpOiB2b2lkIHtcbiAgaWYgKCFzcGFuPy5pc1JlY29yZGluZygpKSByZXR1cm47XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSk7XG4gIHNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImV4ZWN1dGVfdG9vbFwiKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0dFTklFX1RBR19BVFRSLCBcInRydWVcIik7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZyb21NZXRob2QgPVxuICAgIHR5cGVvZiByZXEuaGVhZGVyID09PSBcImZ1bmN0aW9uXCIgPyBzdHJpbmdVdGlscy50cmltVG9OdWxsKHJlcS5oZWFkZXIobmFtZSkpIDogdW5kZWZpbmVkO1xuICBpZiAoZnJvbU1ldGhvZCkgcmV0dXJuIGZyb21NZXRob2Q7XG4gIGNvbnN0IHJhdyA9IHJlcS5oZWFkZXJzPy5bbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdW5kZWZpbmVkKSA/PyB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RRdWVyeShyZXE6IGV4cHJlc3MuUmVxdWVzdCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gcmVxLnF1ZXJ5Py5bbmFtZV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzdGFtcE1sZmxvd0FjdG9yKHNwYW46IFNwYW4sIHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0VNQUlMX0hFQURFUikgPz8gcmVxdWVzdEhlYWRlcihyZXEsIFVTRVJfSURfSEVBREVSKTtcbiAgaWYgKHVzZXIpIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHVzZXIpO1xuICBjb25zdCBzZXNzaW9uID1cbiAgICByZXF1ZXN0SGVhZGVyKHJlcSwgdGhyZWFkLlRIUkVBRF9JRF9IRUFERVIpID8/IHJlcXVlc3RRdWVyeShyZXEsIHRocmVhZC5USFJFQURfSURfUVVFUlkpO1xuICBpZiAoc2Vzc2lvbikgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NFU1NJT05fQVRUUiwgc2Vzc2lvbik7XG4gIHJldHVybiB1c2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjZUlkKHNwYW46IFNwYW4gfCB1bmRlZmluZWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IHNwYW4/LnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlICE9PSBJTlZBTElEX1RSQUNFX0lEID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk6IENoYXRUcmFjZVN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRleHQuYWN0aXZlKCkuZ2V0VmFsdWUoQ0hBVF9UUkFDRV9TVEFURV9LRVkpIGFzIENoYXRUcmFjZVN0YXRlIHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzZXRDaGF0VHJhY2VUYWcoc3RhdGU6IENoYXRUcmFjZVN0YXRlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSk6IHZvaWQge1xuICBjb25zdCB0YWcgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG5hbWUpO1xuICBpZiAoIXRhZykgcmV0dXJuO1xuICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xufVxuXG4vKiogSW5qZWN0IG9uZSBNTGZsb3cgdHJhY2UgdGFnIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWcobmFtZTogc3RyaW5nLCB2YWx1ZTogQ2hhdFRyYWNlVGFnVmFsdWUgPSB0cnVlKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzZXRDaGF0VHJhY2VUYWcoc3RhdGUsIG5hbWUsIHZhbHVlKTtcbn1cblxuLyoqIEluamVjdCBtdWx0aXBsZSBNTGZsb3cgdHJhY2UgdGFncyBpbnRvIHRoZSBhY3RpdmUgY2hhdCByZXF1ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVGFncyhcbiAgdGFnczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pixcbik6IHZvaWQge1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmICghc3RhdGUpIHJldHVybjtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKiBSZWNvcmQgdGhlIGZpcnN0IHNlbGVjdGVkIG1vZGVsIGFzIHRoZSBhY3RpdmUgY2hhdCB0cmFjZSdzIGBhZ2VudGAgdGFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwobW9kZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChtb2RlbElkKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmICghc3RhdGUgfHwgc3RhdGUuZmlyc3RNb2RlbCkgcmV0dXJuO1xuICBzdGF0ZS5maXJzdE1vZGVsID0gdmFsdWU7XG4gIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgTUxGTE9XX0FHRU5UX1RBRywgdmFsdWUpO1xuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpO1xuICBpZiAoc3Bhbj8uaXNSZWNvcmRpbmcoKSkgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0FHRU5UX1RBR19BVFRSLCB2YWx1ZSk7XG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfQUdFTlRfVEFHXTogdmFsdWUgfSk7XG59XG5cbi8qKiBSZWNvcmQgdGhlIGJlc3QgcmVzb2x2ZWQgdXNlciBpZGVudGlmaWVyIG9uIHRoZSBhY3RpdmUgY2hhdCB0cmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVVzZXIodXNlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh1c2VyKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmIChzdGF0ZSkgc3RhdGUudXNlciA9IHZhbHVlO1xufVxuXG4vKiogUmVjb3JkIG9uZSBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIG1vZGUgdXNlZCBkdXJpbmcgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChhdXRoOiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTogdm9pZCB7XG4gIHJlY29yZEFjdGl2ZVRyYWNlVGFnKGF1dGggPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHKTtcbn1cblxuLyoqIFB1Ymxpc2ggdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgYmVmb3JlIHRoZSBoYW5kbGVyIHdyaXRlcyB0aGUgYm9keS4gKi9cbmZ1bmN0aW9uIHN0YW1wTWxmbG93VHJhY2VJZChyZXM6IGV4cHJlc3MuUmVzcG9uc2UsIHNwYW46IFNwYW4pOiB2b2lkIHtcbiAgaWYgKHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICBjb25zdCB0cmFjZUlkID0gc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gIHJlcy5zZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUiwgYHRyLSR7dHJhY2VJZH1gKTtcbn1cblxuLyoqIFJldHVybiBvbmUgcmF3IHByb21wdCB3aGVuIHRoZSByZXF1ZXN0IGlzIGV4YWN0bHkgb25lIHRleHQtb25seSB1c2VyIG1lc3NhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gdGV4dE9ubHlDaGF0SW5wdXQobWVzc2FnZXM6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIG1lc3NhZ2VzID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZXMgfHwgdW5kZWZpbmVkO1xuICBpZiAoIUFycmF5LmlzQXJyYXkobWVzc2FnZXMpIHx8IG1lc3NhZ2VzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzWzBdO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChtZXNzYWdlKSB8fCBtZXNzYWdlLnJvbGUgIT09IFwidXNlclwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG1lc3NhZ2UuY29udGVudCB8fCB1bmRlZmluZWQ7XG4gIHJldHVybiB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UucGFydHMpID8/IHRleHRGcm9tUGFydHMobWVzc2FnZS5jb250ZW50KTtcbn1cblxuZnVuY3Rpb24gdGV4dEZyb21QYXJ0cyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB0ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgdmFsdWUpIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChwYXJ0KSB8fCBwYXJ0LnR5cGUgIT09IFwidGV4dFwiIHx8IHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHQucHVzaChwYXJ0LnRleHQpO1xuICB9XG4gIGNvbnN0IGpvaW5lZCA9IHRleHQuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZCB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWQodmFsdWU6IHVua25vd24sIGxpbWl0ID0gVFJBQ0VfSU9fTElNSVQpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpPy5zbGljZSgwLCBsaW1pdCkgPz8gU3RyaW5nKHZhbHVlKS5zbGljZSgwLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIHNzZUZyYW1lKGxpbmU6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ganNvbi5wYXJzZShsaW5lLnNsaWNlKDUpKTtcbn1cblxuZnVuY3Rpb24gdmFsdWVVc2VzR2VuaWUodmFsdWU6IHVua25vd24sIGRlcHRoID0gMCk6IGJvb2xlYW4ge1xuICBpZiAoZGVwdGggPiAzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnNvbWUoKGl0ZW0pID0+IHZhbHVlVXNlc0dlbmllKGl0ZW0sIGRlcHRoICsgMSkpO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHZhbHVlLnR5cGUgPT09IFwiZGF0YS1nZW5pZS1wcm9ncmVzc1wiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJhc2tfZ2VuaWVfZG9uZVwiIHx8XG4gICAgdmFsdWUudG9vbE5hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS50b29sX25hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS5uYW1lID09PSBcImFza19nZW5pZVwiXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBbXCJkYXRhXCIsIFwiZXZlbnRcIiwgXCJwYXlsb2FkXCJdLnNvbWUoKGtleSkgPT4gdmFsdWVVc2VzR2VuaWUodmFsdWVba2V5XSwgZGVwdGggKyAxKSk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGFzc2lzdGFudCB0ZXh0IGZyb20gb25lIFNTRSBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcuICovXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoc3NlRnJhbWUobGluZSkpO1xufVxuXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZnJhbWUpIHx8IGZyYW1lLnR5cGUgIT09IFwidGV4dC1kZWx0YVwiKSByZXR1cm4gXCJcIjtcbiAgY29uc3QgdGV4dCA9XG4gICAgdHlwZW9mIGZyYW1lLmRlbHRhID09PSBcInN0cmluZ1wiXG4gICAgICA/IGZyYW1lLmRlbHRhXG4gICAgICA6IG9iamVjdC5pc1JlY29yZChmcmFtZS5wYXlsb2FkKVxuICAgICAgICA/IGZyYW1lLnBheWxvYWQudGV4dFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiID8gdGV4dCA6IFwiXCI7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgdGhlIGFzc2lzdGFudCdzIGFuc3dlciBvdXQgb2YgYW4gQUkgU0RLIFNTRSB0cmFuc2NyaXB0LlxuICpcbiAqIFRoZSBhZ2VudCBzdHJlYW1zIGl0cyByZXBseSBhcyBgdGV4dC1kZWx0YWAgZnJhbWVzXG4gKiAoYGRhdGE6IHtcInR5cGVcIjpcInRleHQtZGVsdGFcIixcInBheWxvYWRcIjp7XCJ0ZXh0XCI6XCIuLi5cIn19YCksIHNvIHRoZSBmdWxsXG4gKiBhbnN3ZXIgb25seSBldmVyIGV4aXN0cyBhcyBkZWx0YXMgb24gdGhlIHdpcmUgYW5kIGhhcyB0byBiZVxuICogcmVhc3NlbWJsZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgYm9keS5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZSk7XG4gICAgaWYgKHRleHQpIHBhcnRzLnB1c2godGV4dCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIikuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUmVhZCB0aGUgZmluYWwgYXNzaXN0YW50IHRleHQgZnJvbSBhIG5vbi1zdHJlYW1pbmcgTWFzdHJhIHJlc3BvbnNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tSnNvbihib2R5OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQoYm9keSkgfHwgdHlwZW9mIGJvZHkudGV4dCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBib2R5LnRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogSW5jcmVtZW50YWxseSBhc3NlbWJsZSBVVEYtOCBTU0UgdGV4dCB3aGlsZSByZXRhaW5pbmcgYSBib3VuZGVkIEpTT04gZmFsbGJhY2suICovXG5jbGFzcyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKTtcbiAgcHJpdmF0ZSBhbnN3ZXIgPSBcIlwiO1xuICBwcml2YXRlIGJvZHkgPSBcIlwiO1xuICBwcml2YXRlIHBlbmRpbmdMaW5lID0gXCJcIjtcbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdlbmllID0gZmFsc2U7XG5cbiAgd3JpdGUoY2h1bms6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjaHVuayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoXG4gICAgICAgIHRoaXMuZGVjb2Rlci53cml0ZShCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZmluaXNoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnN1bWUodGhpcy5kZWNvZGVyLmVuZCgpKTtcbiAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUpO1xuICAgIHRoaXMucGVuZGluZ0xpbmUgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgfVxuXG4gIHJhd0JvZHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbiAgfVxuXG4gIHVzZWRHZW5pZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZW5pZTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICBpZiAodGhpcy5ib2R5Lmxlbmd0aCA8IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMuYm9keSArPSB0ZXh0LnNsaWNlKDAsIFJFU1BPTlNFX0JPRFlfTElNSVQgLSB0aGlzLmJvZHkubGVuZ3RoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nTGluZSArPSB0ZXh0O1xuICAgIGxldCBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZS5zbGljZSgwLCBuZXdsaW5lKS5yZXBsYWNlKC9cXHIkLywgXCJcIikpO1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVuZGluZ0xpbmUubGVuZ3RoID4gUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoLVJFU1BPTlNFX0JPRFlfTElNSVQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVNzZUxpbmUobGluZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZnJhbWUgPSBzc2VGcmFtZShsaW5lKTtcbiAgICB0aGlzLmdlbmllIHx8PSB2YWx1ZVVzZXNHZW5pZShmcmFtZSk7XG4gICAgaWYgKHRoaXMuYW5zd2VyLmxlbmd0aCA+PSBUUkFDRV9JT19MSU1JVCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lKTtcbiAgICB0aGlzLmFuc3dlciArPSB0ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUIC0gdGhpcy5hbnN3ZXIubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUganNvbkFuc3dlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oanNvbi5wYXJzZSh0aGlzLmJvZHkpKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgc3BhbiBNTGZsb3cgdHJlYXRzIGFzIHRoZSByZXF1ZXN0IHJvb3QuXG4gKlxuICogT1RlbCBIVFRQIGluc3RydW1lbnRhdGlvbiBzdG9yZXMgaXRzIHNlcnZlciBzcGFuIGluIFJQQyBtZXRhZGF0YS4gVGhhdCBzcGFuXG4gKiB3aW5zIG92ZXIgYW4gYWN0aXZlIEV4cHJlc3MgY2hpbGQuIElmIG5vIHJlY29yZGluZyBsb2NhbCBzcGFuIGV4aXN0cywgY3JlYXRlXG4gKiBvbmUgdW5kZXIgdGhlIGN1cnJlbnQgY29udGV4dCBzbyBlbmFibGVkIFczQyBwcm9wYWdhdGlvbiByZW1haW5zIGludGFjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRyYWNlVGFyZ2V0KCk6IFRyYWNlVGFyZ2V0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYWN0aXZlQ29udGV4dCA9IGNvbnRleHQuYWN0aXZlKCk7XG4gIGlmIChkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlKCkpIHtcbiAgICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICAgIFwibWFzdHJhLmNoYXRfdHVyblwiLFxuICAgICAge1xuICAgICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBbQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUl06IHRydWUsXG4gICAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgICAgW0dFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSXTogXCJpbnZva2VfYWdlbnRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cmFjZS5kZWxldGVTcGFuKGFjdGl2ZUNvbnRleHQpLFxuICAgICk7XG4gICAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICAgIHNwYW4uZW5kKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyBzcGFuLCBvd25lZDogdHJ1ZSB9O1xuICB9XG5cbiAgY29uc3QgcnBjID0gZ2V0UlBDTWV0YWRhdGEoYWN0aXZlQ29udGV4dCk7XG4gIGlmIChycGM/LnR5cGUgPT09IFJQQ1R5cGUuSFRUUCAmJiBycGMuc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgcmV0dXJuIHsgc3BhbjogcnBjLnNwYW4sIG93bmVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgYWN0aXZlID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpO1xuICBpZiAoYWN0aXZlPy5pc1JlY29yZGluZygpKSByZXR1cm4geyBzcGFuOiBhY3RpdmUsIG93bmVkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRUcmFjZXIoQ0hBVF9UVVJOX1RSQUNFUikuc3RhcnRTcGFuKFxuICAgIFwibWFzdHJhLmNoYXRfdHVyblwiLFxuICAgIHtcbiAgICAgIGtpbmQ6IFNwYW5LaW5kLlNFUlZFUixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICBbTUxGTE9XX1NQQU5fVFlQRV9BVFRSXTogTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCxcbiAgICAgICAgW0dFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSXTogXCJpbnZva2VfYWdlbnRcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY3RpdmVDb250ZXh0LFxuICApO1xuICBpZiAoIXNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHNwYW4uZW5kKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBzcGFuLCBvd25lZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIEV4cHJlc3MgbWlkZGxld2FyZSB0aGF0IHN0YW1wcyBjaGF0IHR1cm4gSS9PIG9udG8gdGhlIGV4cG9ydGVkIE9UZWwgcm9vdC5cbiAqXG4gKiBUZWUgYHJlcy53cml0ZWAsIGByZXMuanNvbmAsIGFuZCBgcmVzLmVuZGAgaW5zdGVhZCBvZiBsaXN0ZW5pbmcgZm9yIGBmaW5pc2hgOlxuICogSFRUUCBpbnN0cnVtZW50YXRpb24gZW5kcyBpdHMgc2VydmVyIHNwYW4gb24gZmluaXNoLCBhbmQgYXR0cmlidXRlcyBzZXRcbiAqIGFmdGVyIGEgc3BhbiBlbmRzIG5ldmVyIHJlYWNoIHRoZSBleHBvcnRlci5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIE1hc3RyYSBzdWItYXBwIHNlZXMpLCBlLmcuXG4gKiBgL2FnZW50cy9zdXBwb3J0L3N0cmVhbWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmUoXG4gIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uLFxuICBvcHRpb25zOiBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBpZiAocmVxLm1ldGhvZCAhPT0gXCJQT1NUXCIgfHwgIUFHRU5UX1RVUk5fUk9VVEUudGVzdChyZXEucGF0aCkpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldCA9IHJlc29sdmVUcmFjZVRhcmdldCgpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdGFyZ2V0VHJhY2VJZCA9IHRyYWNlSWQodGFyZ2V0LnNwYW4pO1xuICBpZiAoIXRhcmdldFRyYWNlSWQpIHtcbiAgICBpZiAodGFyZ2V0Lm93bmVkKSB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRyYWNlU3RhdGU6IENoYXRUcmFjZVN0YXRlID0geyB0YWdzOiBuZXcgTWFwKCkgfTtcbiAgY29uc3QgdHJhY2VSZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG4gIGlmICghZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfTE9DQUxfVEFHLCB0cnVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0UmVxdWVzdFRhZ3MocmVxKSkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGluaXRpYWxUYWdzID0gdHlwZW9mIG9wdGlvbnMudGFncyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50YWdzKHJlcSkgOiBvcHRpb25zLnRhZ3M7XG4gIGlmIChpbml0aWFsVGFncykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVGFncykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0YXJnZXQuc3Bhbik7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgbGV0IHJlcXVlc3RQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgcmVxdWVzdFByZXZpZXcgPSB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0O1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX01FU1NBR0VTX0FUVFIsIGZ1bGxJbnB1dCk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCByZXF1ZXN0UHJldmlldy5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkOiB0YXJnZXRUcmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogRGF0ZS5ub3coKSAtIHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgdGFncyxcbiAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zdGFsbCB7QGxpbmsgY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlfSBvbiBhIE1hc3RyYSBFeHByZXNzIHN1Yi1hcHAuXG4gKlxuICogQ2FsbCBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0KClgIHNvIHRoZSBsYXllciBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudFxuICogcm91dGVzLiBTYWZlIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5OiB3aGVuIG5vIHJlY29yZGluZyB0cmFjZXIgaXMgcmVnaXN0ZXJlZCxcbiAqIHRoZSBtaWRkbGV3YXJlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeShcbiAgYXBwOiBleHByZXNzLkV4cHJlc3MsXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpKTtcbiAgbG9nZ2VyLmluZm8oXCJjaGF0IHR1cm4gdGVsZW1ldHJ5IG1pZGRsZXdhcmUgYXR0YWNoZWRcIiwgb3B0aW9ucyk7XG59XG4iXX0=
|
package/lib/src/workspaces.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { pluginRegistry } from "@dbx-tools/appkit";
|
|
|
15
15
|
import { type PathMatchInput } from "@dbx-tools/path";
|
|
16
16
|
import { type CacheableFileSystemOperation } from "@dbx-tools/shared-fs";
|
|
17
17
|
import type { RequestContext } from "@mastra/core/request-context";
|
|
18
|
+
import { type InlineSkill } from "@mastra/core/skills";
|
|
18
19
|
import { Workspace, type SkillsResolver, type WorkspaceConfig, type WorkspaceFilesystem, type WorkspaceSandbox, type WorkspaceSandboxResolver } from "@mastra/core/workspace";
|
|
19
20
|
import type { LocalSkillMount } from "./remote-skills.ts";
|
|
20
21
|
/** Per-request context for workspace path resolvers. */
|
|
@@ -96,13 +97,12 @@ export interface DatabricksWorkspaceOptions extends Omit<WorkspaceConfig, "files
|
|
|
96
97
|
/** Add user-scoped `/tmp` only when no configured Databricks path mounts writable. */
|
|
97
98
|
fallbackToTmp?: boolean;
|
|
98
99
|
/**
|
|
99
|
-
* Extra
|
|
100
|
-
*
|
|
101
|
-
* storage at stable virtual paths (see `remote-skills.ts`). Databricks-hosted
|
|
102
|
-
* remote skills need no entry here because the built-in Assistant mount
|
|
103
|
-
* already scans them.
|
|
100
|
+
* Extra local skill trees mounted read-only for file access. The plugin also
|
|
101
|
+
* converts them to native agent-level skills without workspace scanning.
|
|
104
102
|
*/
|
|
105
103
|
extraSkillMounts?: LocalSkillMount[];
|
|
104
|
+
/** Skill names provided directly to agents and excluded from workspace search. */
|
|
105
|
+
excludeSkillNames?: readonly string[];
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
108
108
|
* Default Databricks paths for shared and current-user Agent Skills.
|
|
@@ -139,3 +139,5 @@ export declare function databricksWorkspace(options?: DatabricksWorkspaceOptions
|
|
|
139
139
|
* Resolve default and caller-provided Databricks paths in priority order.
|
|
140
140
|
*/
|
|
141
141
|
export declare function resolveDatabricksWorkspacePaths(options?: Pick<DatabricksWorkspaceOptions, "assistantPaths" | "paths">): DatabricksWorkspacePathValue[];
|
|
142
|
+
/** Convert fast local or in-memory skill trees into native agent-level skills. */
|
|
143
|
+
export declare function inlineSkillsFromLocalMounts(mounts: readonly LocalSkillMount[]): Promise<InlineSkill[]>;
|