@dbx-tools/appkit-mastra 0.6.8 → 0.6.10
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 +49 -2
- package/index.ts +14 -26
- package/lib/index.d.ts +14 -26
- package/lib/index.js +13 -26
- package/lib/src/config.d.ts +21 -0
- package/lib/src/config.js +5 -1
- package/lib/src/databricks-aitools.d.ts +73 -0
- package/lib/src/databricks-aitools.js +152 -0
- package/lib/src/filesystems.d.ts +52 -170
- package/lib/src/filesystems.js +168 -888
- package/lib/src/plugin.js +14 -2
- package/lib/src/remote-skills.d.ts +4 -4
- package/lib/src/remote-skills.js +63 -35
- package/lib/src/workspaces.d.ts +4 -0
- package/lib/src/workspaces.js +37 -13
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -10
- package/src/config.ts +27 -0
- package/src/databricks-aitools.ts +216 -0
- package/src/filesystems.ts +225 -970
- package/src/plugin.ts +14 -1
- package/src/remote-skills.ts +69 -38
- package/src/workspaces.ts +41 -16
package/lib/src/config.js
CHANGED
|
@@ -132,6 +132,10 @@ export const MASTRA_CONFIG_SCHEMA = {
|
|
|
132
132
|
type: ["string", "array", "object"],
|
|
133
133
|
description: "Remote Agent-Skill sources provisioned at startup (GitHub owner/repo, git/GitLab URL, or a direct SKILL.md/archive URL). Prefers the optional `skills` npm CLI, else a direct fetch; fails startup on error unless failOnError:false. Written to the Databricks user Assistant skills folder, or a local temp dir when no workspace is writable.",
|
|
134
134
|
},
|
|
135
|
+
databricksAITools: {
|
|
136
|
+
type: ["boolean", "string", "object"],
|
|
137
|
+
description: 'Fold Databricks AI Tools skills (databricks aitools) into agents as extra local skill paths. false (default) off; "auto" runs the databricks CLI when installed and logs-and-continues otherwise; true requires the CLI and fails startup otherwise. An object selects skills, experimental, or path.',
|
|
138
|
+
},
|
|
135
139
|
storage: {
|
|
136
140
|
type: ["boolean", "object"],
|
|
137
141
|
description: "PostgresStore for Mastra threads / messages. `true` reuses the `lakebase` plugin's pool, an object opens a dedicated store. Auto-enabled when the `lakebase` plugin is registered.",
|
|
@@ -218,4 +222,4 @@ export const MASTRA_CONFIG_SCHEMA = {
|
|
|
218
222
|
},
|
|
219
223
|
},
|
|
220
224
|
};
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQVE1Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNCO0lBQzNELHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixnQkFBNkMsRUFDN0MsZUFBd0I7SUFF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M0IsV0FBVyxFQUNULDRKQUE0SjtTQUMvSjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDO1lBQ25DLFdBQVcsRUFDVCxxV0FBcVc7U0FDeFc7UUFDRCxTQUFTLEVBQUU7WUFDVCxJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7WUFDeEIsV0FBVyxFQUNULHFPQUFxTztTQUN4TztRQUNELEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULDBJQUEwSTtTQUM3STtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGx1Z2luIGNvbmZpZ3VyYXRpb24gdHlwZXMgYW5kIHNoYXJlZCBgUmVxdWVzdENvbnRleHRgIGtleXMuXG4gKlxuICogT3ducyB0aGUgdHlwZWQge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZ30gKHRoZSBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXRcbiAqIGNvbmZpZykgYW5kIHtAbGluayBNQVNUUkFfQ09ORklHX1NDSEVNQX0sIHRoZSBKU09OIFNjaGVtYSB0aGUgbWFuaWZlc3RcbiAqIHB1Ymxpc2hlcyBmb3IgaXQgc28gc2NhZmZvbGRpbmcgdG9vbHMgYW5kIGFnZW50cyBjYW4gcmVhZCB0aGUgb3B0aW9uIHNldC5cbiAqXG4gKiBQcmVjZWRlbmNlIHBlciBmaWVsZCBpcyBleHBsaWNpdCBwbHVnaW4gY29uZmlnLCB0aGVuIHRoZSBlbnZpcm9ubWVudFxuICogdmFyaWFibGUgbmFtZWQgb24gdGhlIGZpZWxkLCB0aGVuIGEgYnVpbHQtaW4gZGVmYXVsdC5cbiAqXG4gKiBLZXB0IGluIGEgbGVhZiBtb2R1bGUgc28gYHBsdWdpbi50c2AsIGBzZXJ2ZXIudHNgLCBgbW9kZWwudHNgLCBhbmRcbiAqIGBtZW1vcnkudHNgIGNhbiBpbXBvcnQgdGhlbSB3aXRob3V0IGNyZWF0aW5nIGEgY3ljbGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQsIHR5cGUgQmFzZVBsdWdpbkNvbmZpZywgdHlwZSBDb25maWdTY2hlbWEgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQnJhbmRDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIE1BU1RSQV9USFJFQURfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgUGdWZWN0b3JDb25maWcsIFBvc3RncmVzU3RvcmVDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhVG9vbHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB0eXBlIHsgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFJZGVudGl0eU1vZGUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVTa2lsbHNPcHRpb24gfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcmVzb2x2ZWQgQXBwS2l0IHVzZXIuIGBtb2RlbC50c2AgcmVhZHMgaXQgdG8gbWludCB1c2VyLXNjb3BlZFxuICogRGF0YWJyaWNrcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9LRVkgPSBcIm1hc3RyYV9fdXNlclwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyBmb3IgQXBwS2l0IHVzZXIgbWV0YWRhdGEgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFN1cmZhY2VkIGFzIHRyYWNlIG1ldGFkYXRhIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyB0cmFjZXMgYXJlIGZpbHRlcmFibGUgYnkgd2hvXG4gKiBpc3N1ZWQgdGhlIHJlcXVlc3Qgd2l0aG91dCBsZWFraW5nIHRoZSBmdWxsIHVzZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfTkFNRV9LRVkgPSBcIm1hc3RyYV9fdXNlck5hbWVcIjtcbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9FTUFJTF9LRVkgPSBcIm1hc3RyYV9fdXNlckVtYWlsXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIHRoZSBwZXItSFRUUC1yZXF1ZXN0IGlkIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBSZWFkcyBgWC1SZXF1ZXN0LUlkYCBmcm9tIHRoZSBpbmNvbWluZ1xuICogaGVhZGVycyB3aGVuIHByZXNlbnQgKHNvIGFuIHVwc3RyZWFtIGxvYWQgYmFsYW5jZXIgLyBBUEkgZ2F0ZXdheVxuICogY2FuIGtlZXAgaXRzIHRyYWNlIGNvcnJlbGF0aW9uKSwgZmFsbHMgYmFjayB0byBhIGZyZXNobHkgbWludGVkXG4gKiBVVUlELiBFY2hvZWQgYmFjayBvbiB0aGUgcmVzcG9uc2UgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IHNwYW4gdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIGxvZ3MgYW5kIHRyYWNlcyBzaGFyZSBhXG4gKiBqb2luIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9SRVFVRVNUX0lEX0tFWSA9IFwibWFzdHJhX19yZXF1ZXN0SWRcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgT0F1dGggc2NvcGVzIHBhcnNlZCBmcm9tIHRoZSBmb3J3YXJkZWRcbiAqIGFjY2VzcyB0b2tlbiBieSB7QGxpbmsgTWFzdHJhU2VydmVyLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzfS5cbiAqIFdvcmtzcGFjZSBtb3VudHMgdGhhdCB0b3VjaCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcyByZXF1aXJlXG4gKiBgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIGluIHRoaXMgbGlzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9TQ09QRVNfS0VZID0gXCJtYXN0cmFfX3Njb3Blc1wiO1xuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB3ZSB3YW50IE1hc3RyYSB0byBleHRyYWN0XG4gKiBhcyBtZXRhZGF0YSBvbiBldmVyeSBvYnNlcnZhYmlsaXR5IHNwYW4gKGFnZW50IHJ1bnMsIG1vZGVsIGNhbGxzLFxuICogdG9vbCBpbnZvY2F0aW9ucywgd29ya2Zsb3cgc3RlcHMpLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIGh0dHBzOi8vbWFzdHJhLmFpL2RvY3Mvb2JzZXJ2YWJpbGl0eS90cmFjaW5nL292ZXJ2aWV3I2F1dG9tYXRpYy1tZXRhZGF0YS1mcm9tLXJlcXVlc3Rjb250ZXh0fTpcbiAqIHBhc3NlZCB2ZXJiYXRpbSBpbnRvIGBPYnNlcnZhYmlsaXR5LmNvbmZpZ3NbKl0ucmVxdWVzdENvbnRleHRLZXlzYCxcbiAqIHNvIGFueSBrZXkgbGlzdGVkIGhlcmUgaXMgcmVhZCBmcm9tIGBSZXF1ZXN0Q29udGV4dGAgYXQgdHJhY2VcbiAqIHN0YXJ0IGFuZCBhdHRhY2hlZCBhcyBzY2FsYXIgc3BhbiBtZXRhZGF0YS4gS2VlcCB0aGUgc2V0IHRvIHBsYWluXG4gKiBzY2FsYXJzIC0gbmV2ZXIgaW5jbHVkZSB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSAoaXQgY2FycmllcyB0aGVcbiAqIGZ1bGwgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggYSBgV29ya3NwYWNlQ2xpZW50YCByZWZlcmVuY2UpLlxuICpcbiAqIE9yZGVyIGlzIHB1cmVseSBjb3NtZXRpYzsgTWFzdHJhIGRlLWR1cGVzIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIC8vIE1vZGVsIG92ZXJyaWRlIGtleSBpcyBvd25lZCBieSBgc2VydmluZy50c2A7IHNwZWxsZWQgaW5saW5lIGhlcmVcbiAgLy8gc28gdGhpcyBtb2R1bGUgc3RheXMgbGVhZi1sZXZlbCAobm8gY3ljbGVzIHdpdGggYHNlcnZpbmcudHNgKS5cbiAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG5dO1xuXG4vKiogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHBsdXMgdGhlIGNhbm9uaWNhbCB1c2VyIGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBpZGVudGl0eSBmb3IgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0OiB0aGUgT0JPIHVzZXIgaWQgb24gYVxuICogdXNlci1zY29wZWQgY2FsbCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgd2hpY2ggaXMgbm90IGFsd2F5cyB3aG9zZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWxcbiAqIHJ1bnMgaXQuIEFuIE9CTyBjb250ZXh0J3Mgb3duIHVzZXIgaWQgaXMgYXV0aG9yaXRhdGl2ZS4gVW5kZXIgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCwgZXZlcnkgY2FsbGVyIHNoYXJlcyBvbmUgY3JlZGVudGlhbCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlkIGlzXG4gKiB3aGF0IGtlZXBzIG1lbW9yeSB0aHJlYWRzIGFuZCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2VzIGRpc3RpbmN0OyB0aGUgc2VydmljZVxuICogcHJpbmNpcGFsIGlkIGlzIHRoZSBmbG9vciB3aGVuIG5vIHVzZXIgd2FzIGZvcndhcmRlZC5cbiAqXG4gKiBUaGlzIHJ1bGUgaGFzIHRvIGJlIGlkZW50aWNhbCBldmVyeXdoZXJlIGEgY2FjaGUga2V5IGlzIGJ1aWx0LCBzbyBib3RoIHRoZVxuICogd3JpdGUgc2lkZSAodGhlIGBSZXF1ZXN0Q29udGV4dGAgdXNlciBzdGFtcGVkIGJ5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmApXG4gKiBhbmQgdGhlIHJlYWQgc2lkZSAodGhlIHBsdWdpbidzIG93biBBcHBLaXQgcm91dGVzLCB3aGljaCBoYXZlIGEgcmVxdWVzdCBidXRcbiAqIG5vIGBSZXF1ZXN0Q29udGV4dGApIGRlcml2ZSB0aGVpciBrZXkgZnJvbSB0aGlzIG9uZSBmdW5jdGlvbi4gV2hlbiB0aGUgdHdvXG4gKiBkaXNhZ3JlZWQsIGEgY2hhcnQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgd2FzIHJlYWQgYmFjayB1bmRlclxuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIGFuZCB0aGUgZW1iZWQgcm91dGUgYW5zd2VyZWQgNDA0LCB3aGljaCB0aGUgY2hhdCBVSVxuICogcmVuZGVycyBhcyBhbiBleHBpcmVkIGNoYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlZFVzZXJJZChcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlLFxuICBmb3J3YXJkZWRVc2VySWQ/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCkgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG4gIHJldHVybiBmb3J3YXJkZWRVc2VySWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChleGVjdXRpb25Db250ZXh0KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBldmVyeSBwZXItdXNlciBjYWNoZSBlbnRyeSBpcyBuYW1lc3BhY2VkIHVuZGVyLCBzbyBhbiBPQk8gcmVzdWx0XG4gKiBjYW5ub3QgYmUgcmVhZCBiYWNrIGJ5IGFub3RoZXIgY2FsbGVyLlxuICpcbiAqIFByZWZlcnMgdGhlIHtAbGluayBVc2VyfSB0aGF0IHtAbGluayBNYXN0cmFTZXJ2ZXJ9IHN0YW1wcyBvbiB0aGUgcmVxdWVzdFxuICogY29udGV4dCwgd2hvc2UgaWQgYWxyZWFkeSBmb2xsb3dzIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfS4gVGhlIE1DUCB0cmFuc3BvcnRcbiAqIHJvdXRlcyBkbyBub3QgdGhyZWFkIHRoYXQgY29udGV4dCBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyB0aG9zZSBmYWxsIGJhY2sgdG9cbiAqIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0ICh0aGUgYWN0aXZlIE9CTyBzY29wZSwgb3IgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCkuIEEgY2FsbGVyIGhvbGRpbmcgYW4gZXhwcmVzcyByZXF1ZXN0IHNob3VsZCBidWlsZCBpdHMga2V5IGZyb21cbiAqIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSBpbnN0ZWFkLCBzbyB0aGUgZm9yd2FyZGVkIHVzZXIgaXMgbm90IGxvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdXNlcj8uaWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCkpO1xufVxuXG4vKiogUGdWZWN0b3IgY29uZmlnIHdpdGggYW4gb3B0aW9uYWwgTWFzdHJhIHN0b3JlIGlkLiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnID0gUGdWZWN0b3JDb25maWcgJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXIgZXhwb3N1cmVcbiAqICh7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLm1jcH0pLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDsgdGhlIG9iamVjdFxuICogZm9ybSBvbmx5IG5lZWRzIHRvIHNldCB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhTWNwQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNlcnZlciBpZCB1c2VkIGluIHRoZSByb3V0ZSBwYXRoIChgL21jcC88c2VydmVySWQ+Ly4uLmApIGFuZCBhcyB0aGVcbiAgICogTUNQIHJlZ2lzdHJ5IGlkLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKi9cbiAgc2VydmVySWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gRGVmYXVsdHMgdG8gYFwiPGRpc3BsYXlOYW1lPiBNQ1BcImAuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTZW1hbnRpYyB2ZXJzaW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjEuMC4wXCJgLiAqL1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhcyBhbiBgYXNrXzxhZ2VudElkPmAgTUNQIHRvb2wuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCAtIHRoaXMgaXMgdGhlIFwibGV2ZXJhZ2UgdGhlIE1hc3RyYSBhZ2VudHMgb3ZlclxuICAgKiBNQ1BcIiBiZWhhdmlvciBtb3N0IGNhbGxlcnMgd2FudC5cbiAgICovXG4gIGFnZW50cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbHNvIGV4cG9zZSB0aGUgcGx1Z2luJ3MgYW1iaWVudCB0b29scyAodGhlIGJ1aWx0LWluIGByZW5kZXJfZGF0YWBcbiAgICogcGx1cyBhbnl0aGluZyBpbiBgY29uZmlnLnRvb2xzYCkgYXMgTUNQIHRvb2xzLiBEZWZhdWx0cyB0byBgZmFsc2VgOlxuICAgKiB0aGUgYW1iaWVudCB0b29scyBhc3N1bWUgYW4gaW4tcHJvY2VzcyBjaGF0IHR1cm4gKHRoZXkgcHVibGlzaFxuICAgKiB3cml0ZXIgZXZlbnRzIHRoZSBjaGF0IFVJIGNvbnN1bWVzKSwgc28gdGhleSBhcmVuJ3QgdXNlZnVsIHRvIGFcbiAgICogc3RhbmRhbG9uZSBNQ1AgY2xpZW50LiBUdXJuIHRoaXMgb24gb25seSB3aGVuIHRob3NlIHRvb2xzIGFyZSBzYWZlXG4gICAqIHRvIGNhbGwgb3V0LW9mLWJhbmQuXG4gICAqL1xuICB0b29scz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFeHRyYSB0b29scyB0byBleHBvc2Ugb3ZlciBNQ1AgYmV5b25kIHRoZSBhZ2VudCAvIGFtYmllbnQgc2V0cy5cbiAgICogVXNlIHRoaXMgZm9yIHRvb2xzIHdyaXR0ZW4gc3BlY2lmaWNhbGx5IGZvciBNQ1AgY29uc3VtZXJzLlxuICAgKi9cbiAgZXh0cmFUb29scz86IE1hc3RyYVRvb2xzO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBhY2NlcHRlZCBieSB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogTWFzdHJhIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGlkLiBEZWZhdWx0cyB0byBgXCJkYXRhYnJpY2tzXCJgOyBubyBlbnYgZmFsbGJhY2suICovXG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcy9tZXNzYWdlcy4gYHRydWVgIHJldXNlcyB0aGVcbiAgICogYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sOyBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IFBvc3RncmVzU3RvcmVDb25maWc7XG4gIC8qKlxuICAgKiBQZ1ZlY3RvciBzdG9yZSBmb3IgTWFzdHJhIG1lbW9yeSByZWNhbGwuIGB0cnVlYCByZXVzZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZztcbiAgLyoqXG4gICAqIENvZGUtZGVmaW5lZCBhZ2VudHMuIEFjY2VwdHMgdGhyZWUgc2hhcGVzIGZvciBjb252ZW5pZW5jZTpcbiAgICpcbiAgICogLSAqKlJlY29yZCoqOiBgeyBhbmFseXN0OiBkZWYsIGhlbHBlcjogZGVmIH1gIC0ga2V5cyBiZWNvbWUgdGhlXG4gICAqICAgcmVnaXN0ZXJlZCBpZHMgYW5kIHRoZSBmaXJzdCBrZXkgaXMgdGhlIGRlZmF1bHQuXG4gICAqIC0gKipTaW5nbGUgZGVmaW5pdGlvbioqOiBgZGVmYCAtIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgXCJkZWZhdWx0XCJgIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpIGFuZFxuICAgKiAgIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHRoZSBkZWZhdWx0IGFnZW50LlxuICAgKiAtICoqQXJyYXkqKjogYFtkZWYxLCBkZWYyXWAgLSBlYWNoIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgYWdlbnRfJHtpfWAgd2hlbiBgbmFtZWAgaXMgb21pdHRlZCk7XG4gICAqICAgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IGJlY29tZXMgYSBNYXN0cmEgYEFnZW50YCByZWFjaGFibGUgYXRcbiAgICogYC9hcGkvPHBsdWdpbj4vcm91dGUvY2hhdC88aWQ+YCAodGhlIGNoYXQgcm91dGUgYWxzbyBtYXRjaGVzXG4gICAqIGA6YWdlbnRJZGApLiBXaGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHksIHRoZSBwbHVnaW5cbiAgICogcmVnaXN0ZXJzIGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlXG4gICAqIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBleGFtcGxlIFNpbmdsZS1hZ2VudCBzaG9ydGhhbmRcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIEFycmF5XG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBbXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiYW5hbHlzdFwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiaGVscGVyXCIsIGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICBdLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFJlY29yZCAoZXhwbGljaXQgaWRzKVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czoge1xuICAgKiAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgIH0sXG4gICAqICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbltdO1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzcHJlYWQgaW50byBldmVyeSByZWdpc3RlcmVkIGFnZW50J3MgdG9vbHMgcmVjb3JkO1xuICAgKiBwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleSBjb2xsaXNpb24uIFVzZSBmb3IgYSBzbWFsbCBzaGFyZWRcbiAgICogbGlicmFyeTsgZm9yIHBlci1hZ2VudCB0b29scyBzZXQgYGFnZW50c1tpZF0udG9vbHNgIGluc3RlYWQuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzO1xuICAvKipcbiAgICogQWdlbnQgaWQgdXNlZCB3aGVuIHRoZSBjbGllbnQgZG9lc24ndCBzcGVjaWZ5IG9uZSAodGhlIGJhcmUsXG4gICAqIHVuLXN1ZmZpeGVkIGhpc3RvcnkgLyBzdWdnZXN0aW9ucyByb3V0ZXMgcmVzb2x2ZSB0byBpdCkuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBrZXkgaW4gYGFnZW50c2AgKG9yIGBcImRlZmF1bHRcImAgd2hlblxuICAgKiBgYWdlbnRzYCBpcyBvbWl0dGVkKS4gTXVzdCBtYXRjaCBhbiBpZCBpbiBgYWdlbnRzYCB3aGVuIGJvdGggYXJlXG4gICAqIHNldDsgYSBtaXNtYXRjaCB0aHJvd3MgYXQgc2V0dXAgd2l0aCB0aGUgYXZhaWxhYmxlIGNhbmRpZGF0ZXMuXG4gICAqL1xuICBkZWZhdWx0QWdlbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbHVnaW4tbGV2ZWwgZGVmYXVsdCBtb2RlbCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzXG4gICAqIG93biBgbW9kZWxgLiBNaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICAgKlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBPQk8gYXV0by1yZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgdGhyb3VnaCB2ZXJiYXRpbS4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBhdXRoXG4gICAqICAgb3IgYHByb3ZpZGVySWRgLlxuICAgKlxuICAgKiBSZXNvbHV0aW9uIG9yZGVyIHBlciBhZ2VudDogYGRlZi5tb2RlbGAg4oaSIGBkZWZhdWx0TW9kZWxgIOKGklxuICAgKiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIOKGkiBidWlsdC1pbiBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICAgKiByZXNvbHZlci5cbiAgICovXG4gIGRlZmF1bHRNb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyAoYFwiY2xhdWRlIHNvbm5ldFwiYCkgYWdhaW5zdCB0aGUgd29ya3NwYWNlJ3NcbiAgICogTW9kZWwgU2VydmluZyBlbmRwb2ludHMuIERlZmF1bHRzIHRvIGB0cnVlYDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB0byByZXF1aXJlIGV4YWN0IGVuZHBvaW50IG5hbWVzIGV2ZXJ5d2hlcmUuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgZm9yIHRoZSBmdXp6eSBtYXRjaGVyLCAwIChleGFjdCkgdG8gMSAoYW55dGhpbmcpLlxuICAgKiBEZWZhdWx0cyB0byBgMC40YDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBMb3dlciB2YWx1ZXMgcmVqZWN0IGxvb3NlIG1hdGNoZXM7IHJhaXNlIGl0IGlmIHlvdSBoYXZlIGEgc3ByYXdsaW5nXG4gICAqIGVuZHBvaW50IGNhdGFsb2d1ZSB3aXRoIHNpbWlsYXItbG9va2luZyBuYW1lcy5cbiAgICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBEZWZhdWx0cyB0byA1IG1pbnV0ZXM7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogVGhlIGNhY2hlIGlzIHBlciB3b3Jrc3BhY2UgaG9zdCBhbmQgc2hhcmVkIGFjcm9zcyB1c2VyczsgY29uY3VycmVudFxuICAgKiBjYWxsZXJzIGNvYWxlc2NlIG9uIGEgc2luZ2xlIGluLWZsaWdodCBmZXRjaC5cbiAgICovXG4gIG1vZGVsQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIExldCBjbGllbnRzIHBpY2sgdGhlIGJhY2tpbmcgZW5kcG9pbnQgcGVyIHJlcXVlc3QuIERlZmF1bHRzIHRvIGB0cnVlYDtcbiAgICogbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBSZWFkcyB0aGUgYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIHRoZSBgP21vZGVsPWAgcXVlcnkgc3RyaW5nLCBvciBhXG4gICAqIGBtb2RlbGAgYm9keSBmaWVsZCwgaW4gdGhhdCBvcmRlci4gRGlzYWJsZSB3aGVuIHJ1bm5pbmcgbXVsdGktdGVuYW50XG4gICAqIHdoZXJlIHVudHJ1c3RlZCBjbGllbnRzIHNob3VsZG4ndCBjaG9vc2UgdGhlIGVuZHBvaW50LlxuICAgKi9cbiAgbW9kZWxPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcmlvcml0eS1vcmRlcmVkIGxpc3Qgb2YgZW5kcG9pbnQgbmFtZXMgdHJpZWQgKmZpcnN0KiB3aGVuIG5vXG4gICAqIGFnZW50IC8gcGx1Z2luIC8gZW52IC8gcmVxdWVzdC1vdmVycmlkZSBtb2RlbCBpZCBpcyBzZXQsIGFoZWFkIG9mXG4gICAqIHRoZSBkeW5hbWljIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLiBUaGUgcmVzb2x2ZXIgcGlja3MgdGhlXG4gICAqIGZpcnN0IGlkIHRoYXQgaXMgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgd29ya3NwYWNlJ3NcbiAgICogYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZy5cbiAgICpcbiAgICogV2hlbiB1bnNldCwgcmVzb2x1dGlvbiBpcyBkcml2ZW4gYnkgdGhlIGxpdmUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAgICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXM6IGVuZHBvaW50cyBhcmUgY2xhc3NpZmllZCBpbnRvXG4gICAqIGNoYXQgY2xhc3NlcyAoYGNsYXNzaWZ5RW5kcG9pbnRzYCkgYW5kIHdhbGtlZCBiZXN0LWZpcnN0XG4gICAqIChDaGF0VGhpbmtpbmcgLT4gQ2hhdEJhbGFuY2VkIC0+IENoYXRGYXN0KSwgd2l0aCB0aGUgc21hbGwgYnVpbHQtaW5cbiAgICogYEZBTExCQUNLX01PREVMX0lEU2AgbGlzdCBhcyB0aGUgZmxvb3Igd2hlbiB0aGUgY2F0YWxvZ3VlIGNhbid0IGJlXG4gICAqIHJlYWQuIFNldCB0aGlzIHRvXG4gICAqIHBpbiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgdG8gYW4gYXBwcm92ZWQgc3Vic2V0LCBvciB0byBwdXQgY3VzdG9tXG4gICAqIGVuZHBvaW50cyBpbiBmcm9udCBvZiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbEZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKGRlZmF1bHQpLCBldmVyeSBhZ2VudCBnZXRzIGEgYnVpbHQtaW4gaW5wdXRcbiAgICogcHJvY2Vzc29yIHRoYXQgc3RyaXBzIGBjaGFydElkYCBmaWVsZHMgZnJvbSBwcmlvciBhc3Npc3RhbnRcbiAgICogdG9vbC1pbnZvY2F0aW9uIHJlc3VsdHMgYmVmb3JlIHRoZXkgcmVhY2ggdGhlIG1vZGVsLiBUaGlzXG4gICAqIHByZXZlbnRzIHRoZSBtb2RlbCBmcm9tIHJldXNpbmcgdHVybi1zY29wZWQgY2hhcnRJZHMgaXQgc2Vlc1xuICAgKiBpbiBtZW1vcnkgcmVjYWxsICh3aGljaCB3b3VsZCBsZWF2ZSBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzXG4gICAqIHBvaW50aW5nIGF0IHdyaXRlciBldmVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QpLlxuICAgKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvcHQgb3V0IC0gdXNlZnVsIGlmIGEgbm9uLWRlZmF1bHQgYWdlbnRcbiAgICogbmVlZHMgZnVsbCB2aXNpYmlsaXR5IGludG8gcHJpb3IgY2hhcnRJZHMgKGUuZy4gYW4gYXVkaXRcbiAgICogYWdlbnQgcmVhc29uaW5nIGFib3V0IGNoYXJ0IGxpbmVhZ2UpLlxuICAgKi9cbiAgc3RyaXBTdGFsZUNoYXJ0cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICAgKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCB0aHJvd2F3YXlcbiAgICogY2xvc2VycywgZXhjZXNzaXZlIGhlZGdpbmcpLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogdXNlIHRoZSBidWlsdC1pblxuICAgKiAgIGBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OU2AgZnJvbSBgYWdlbnRzLnRzYC5cbiAgICogLSBgc3RyaW5nYDogcmVwbGFjZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSBzdXBwbGllZCBibG9jay5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIGVudGlyZWx5IChhZ2VudHMgc2VlIG9ubHkgdGhlaXIgYmVzcG9rZVxuICAgKiAgIGBpbnN0cnVjdGlvbnNgKS5cbiAgICpcbiAgICogQXBwZW5kZWQgKG5vdCBwcmVwZW5kZWQpIHNvIHRoZSBhZ2VudCdzIHJvbGUgYW5kIHJ1bGVzIGNvbWUgZmlyc3RcbiAgICogYW5kIHRoZSBzdHlsZSBibG9jayBsZWFucyBvbiB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMuXG4gICAqL1xuICBzdHlsZUluc3RydWN0aW9ucz86IHN0cmluZyB8IGZhbHNlO1xuICAvKipcbiAgICogR2VuaWUgc3BhY2VzIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIGNhbiBkZWxlZ2F0ZSB0by4gT25lIE1hc3RyYVxuICAgKiB0b29sIGlzIHJlZ2lzdGVyZWQgcGVyIGFsaWFzIChgZ2VuaWVgIGZvciB0aGUgd2VsbC1rbm93blxuICAgKiBgZGVmYXVsdGAgYWxpYXMsIGBnZW5pZV88YWxpYXM+YCBvdGhlcndpc2UpLiBFYWNoIHRvb2wgc3BpbnNcbiAgICogdXAgYSBwZXItcXVlc3Rpb24gR2VuaWUgc3ViLWFnZW50IHRoYXQgcnVucyBEYXRhYnJpY2tzXG4gICAqIFwiYWdlbnQgbW9kZVwiIGFnYWluc3QgdGhlIHNwYWNlLCBicm9hZGNhc3RzIHdpcmUgZXZlbnRzIHRvIHRoZVxuICAgKiBVSSwgZmV0Y2hlcyBzdGF0ZW1lbnQgcm93cyBmb3Igbm9uLWVtcHR5IHJlc3VsdHMsIGFuZCByZXR1cm5zXG4gICAqIGEgYChzdHJpbmcgfCBkYXRhIHwgY2hhcnQpW11gIHN1bW1hcnkgdGhlIGhvc3QgVUkgcmVuZGVyc1xuICAgKiBpbmxpbmUuXG4gICAqXG4gICAqIEVudHJpZXMgYWNjZXB0IGVpdGhlciBhIGZ1bGwge0BsaW5rIEdlbmllU3BhY2VDb25maWd9IG9iamVjdFxuICAgKiBvciBhIGJhcmUgYHNwYWNlX2lkYCBzdHJpbmcgd2hlbiBubyBleHRyYXMgYXJlIG5lZWRlZDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBnZW5pZVNwYWNlczoge1xuICAgKiAgICAgZGVmYXVsdDogXCIwMWVmMGQzYzBlMWIxZjRhOGQyYzNlNGY1YTZiN2M4ZFwiLFxuICAgKiAgICAgZm9yZWNhc3RzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIndlZWtseSBkZW1hbmQgZm9yZWNhc3RzXCIgfSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlYWNoIHRoZSBzcGFjZXMgZnJvbSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgdmlhXG4gICAqIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgOyB0aGUgcmVzdWx0aW5nIHRvb2xzIGFjY2VwdFxuICAgKiBgeyBjb250ZW50LCBjb252ZXJzYXRpb25JZD8gfWAgYW5kIHJldHVybiBhIGh5ZHJhdGVkIHN1bW1hcnkuXG4gICAqXG4gICAqICoqRmFsbGJhY2sgZGlzY292ZXJ5KiogKGhpZ2hlc3QgcHJlY2VkZW5jZSBmaXJzdCk6IGlmIHRoaXNcbiAgICogZmllbGQgaXMgb21pdHRlZCwgdGhlIEdlbmllIGFnZW50IGFsc28gcGlja3MgdXAgc3BhY2VzIGZyb21cbiAgICogKDEpIHRoZSBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2VcbiAgICogd2hlbiByZWdpc3RlcmVkLCBhbmQgKDIpIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGBcbiAgICogZW52IHZhciAocmVnaXN0ZXJlZCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzKS4gVGhpcyBrZWVwc1xuICAgKiBleGlzdGluZyBBcHBLaXQgZGVwbG95bWVudHMgd29ya2luZyB3aXRob3V0IHJlc3RhdGluZyB0aGVcbiAgICogc3BhY2VzIGNvbmZpZyBpbiB0d28gcGxhY2VzLlxuICAgKi9cbiAgZ2VuaWVTcGFjZXM/OiBHZW5pZVNwYWNlc0NvbmZpZztcbiAgLyoqXG4gICAqIFRUTCBmb3IgdGhlIGluLW1lbW9yeSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZSwgaW5cbiAgICogbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuIFRoZSBHZW5pZSBhZ2VudCBjYWxsc1xuICAgKiBgY2xpZW50LmdlbmllLmdldFNwYWNlKC4uLilgIG9uIGV2ZXJ5IGNvbGQtc3RhcnQgdG8gZ2V0IHRoZVxuICAgKiB0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkOyBjYWNoZWQgcmVzcG9uc2VzIHNraXAgdGhlXG4gICAqIHJvdW5kLXRyaXAgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZVxuICAgKiBpbi1mbGlnaHQgZmV0Y2guIERyb3AgdG8gYSBzbWFsbGVyIHZhbHVlIHdoZW4gYW5hbHlzdHMgYXJlXG4gICAqIGFjdGl2ZWx5IGVkaXRpbmcgc3BhY2UgbWV0YWRhdGEgYW5kIHlvdSB3YW50IGNoYW5nZXMgdmlzaWJsZVxuICAgKiB3aXRoaW4gc2Vjb25kczsgcmFpc2UgaXQgdG8gYW1vcnRpc2UgdGhlIHJvdW5kLXRyaXAgd2hlblxuICAgKiBzcGFjZSBtZXRhZGF0YSBpcyBlZmZlY3RpdmVseSBmcm96ZW4uXG4gICAqXG4gICAqIEJhY2tlZCBieSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYCwgc28gdGhlIGNhY2hlIHBhcnRpY2lwYXRlc1xuICAgKiBpbiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSBhbmQgYmVuZWZpdHMgZnJvbVxuICAgKiBMYWtlYmFzZSBwZXJzaXN0ZW5jZSB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAgICovXG4gIGdlbmllU3BhY2VDYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuLiBPbmUgc3RlcCA9IG9uZVxuICAgKiByb3VuZC10cmlwIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIChhIHRvb2wgY2FsbCBjb25zdW1lcyBhXG4gICAqIHN0ZXAsIHRoZSBmaW5hbC10ZXh0IHJlcGx5IGNvbnN1bWVzIG9uZSB0b28pLiBBcHBsaWVzIHRvXG4gICAqIGV2ZXJ5IGFnZW50IHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c31cbiAgICogLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFyZW4ndCBzdXJmYWNlZCB5ZXQgYmVjYXVzZSB0aGUgc2FtZVxuICAgKiBjZWlsaW5nIGhhcyBiZWVuIHN1ZmZpY2llbnQgYWNyb3NzIGV2ZXJ5IHdvcmtsb2FkIHdlJ3ZlIHJ1bi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTfSAoMjUpLCBzaXplZCB0byBmaXRcbiAgICogYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWAgY2FsbHNcbiAgICogKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICAgKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gICAqIGFuc3dlcmluZy4gTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZiA1IHdvdWxkXG4gICAqIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIGFmdGVyIDItMyB0b29sIGNhbGxzLCBzb1xuICAgKiBleHBsaWNpdGx5IHJhaXNpbmcgdGhlIGNlaWxpbmcgaGVyZSBpcyB3aGF0IGxldHMgdGhlXG4gICAqIGFnZW50LW1vZGUgbG9vcCBwbGF5IG91dC5cbiAgICpcbiAgICogTG93ZXIgd2hlbiBhbiB1bnVzdWFsbHkgc2xvdyBvciBleHBlbnNpdmUgbW9kZWwgbWFrZXMgbG9uZ1xuICAgKiB0dXJucyB1bmFmZm9yZGFibGU7IHJhaXNlIGZvciBleHBsb3JhdG9yeSB3b3JrbG9hZHMgdGhhdCBuZWVkXG4gICAqIHRvIGRyaWxsIGRlZXAgaW50byBhIGRhdGFzZXQgd2l0aGluIGEgc2luZ2xlIHR1cm4uXG4gICAqL1xuICBhZ2VudE1heFN0ZXBzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2lyZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICogYEBtYXN0cmEvb3RlbC1icmlkZ2VgLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogb24gb25seSB3aGVuXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgb3JcbiAgICogICBgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVGAgaXMgc2V0LiBXaGVuIHVuc2V0LCB0aGVcbiAgICogICBicmlkZ2UgaXMgc2tpcHBlZCBzbyBNYXN0cmEgZG9lcyBub3QgbG9nXG4gICAqICAgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIG9uIHRoZSBub29wIHRyYWNlci5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uIGV2ZW4gd2l0aG91dCBhbiBPVExQIGVuZHBvaW50LlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi5cbiAgICovXG4gIG9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuICAvKipcbiAgICogTG9nIHVzZXIgZmVlZGJhY2sgKHRodW1icyB1cC9kb3duICsgZnJlZWZvcm0gY29tbWVudHMpIHRvIE1MZmxvdyBhc1xuICAgKiB0cmFjZSBhc3Nlc3NtZW50cywgYW5kIHN1cmZhY2UgdGhlIGZlZWRiYWNrIGNvbnRyb2xzIGluIHRoZSBjaGF0IFVJLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogZW5hYmxlZCBvbmx5IHdoZW4gTUxmbG93IHRyYWNpbmcgaXNcbiAgICogICB3aXJlZCAtIGFuIE9UTFAgZXhwb3J0ZXIgZW5kcG9pbnQgaXMgc2V0IGFuZCBhbiBNTGZsb3cgZXhwZXJpbWVudFxuICAgKiAgIGlzIG5hbWVkICh0aGUgc2FtZSBzaWduYWxzIHRoZSBvYnNlcnZhYmlsaXR5IHBpcGVsaW5lIG5lZWRzIHRvXG4gICAqICAgc2hpcCB0cmFjZXMgdG8gTUxmbG93KS4gT3RoZXJ3aXNlIG9mZiwgc2luY2UgdGhlcmUnZCBiZSBubyB0cmFjZVxuICAgKiAgIHRvIGF0dGFjaCBmZWVkYmFjayB0by5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uLiBGZWVkYmFjayBjb250cm9scyBzaG93IGFuZCB3cml0ZXMgYXJlIGF0dGVtcHRlZFxuICAgKiAgIHJlZ2FyZGxlc3Mgb2YgZW52IGRldGVjdGlvbiAodXNlIHdoZW4gdGhlIGVudiBpcyBjb25maWd1cmVkIGluIGFcbiAgICogICB3YXkgdGhlIGF1dG8tcHJvYmUgZG9lc24ndCByZWNvZ25pemUpLlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi4gTm8gdHJhY2UtaWQgaGVhZGVyLCBubyBmZWVkYmFjayByb3V0ZSwgbm8gVUkuXG4gICAqXG4gICAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHVybidzIE1MZmxvdyB0cmFjZSB2aWEgdGhlIE9wZW5UZWxlbWV0cnlcbiAgICogdHJhY2UgaWQgdGhlIHNlcnZlciBzdGFtcHMgb24gZWFjaCByZXNwb25zZTsgc2VlIGBtbGZsb3cudHNgLlxuICAgKi9cbiAgZmVlZGJhY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogRXhwb3NlIHRoZSBwbHVnaW4ncyBhZ2VudHMgKGFuZCBvcHRpb25hbGx5IHRvb2xzKSBhcyBhIE1hc3RyYSBNQ1BcbiAgICogc2VydmVyIHNvIGV4dGVybmFsIE1DUCBjbGllbnRzIC0gQ2xhdWRlIERlc2t0b3AsIEN1cnNvciwgdGhlIE1hc3RyYVxuICAgKiBwbGF5Z3JvdW5kLCBvciBhbm90aGVyIGFnZW50IC0gY2FuIGNhbGwgdGhlbSBvdmVyIHRoZSBzdGFuZGFyZCBNQ1BcbiAgICogdHJhbnNwb3J0cy4gRW5hYmxlZCBieSBkZWZhdWx0IChhZ2VudHMgb25seSk6IHdyYXBwaW5nIHRoZVxuICAgKiBhbHJlYWR5LXJlZ2lzdGVyZWQgYWdlbnRzIGNvc3RzIG5vdGhpbmcgZXh0cmEsIHNvIHRoZSBlbmRwb2ludCBpcyBvblxuICAgKiBvdXQgb2YgdGhlIGJveDsgb25seSB0aGUgYW1iaWVudCB0b29scyAod2hpY2ggYXNzdW1lIGFuIGluLXByb2Nlc3NcbiAgICogY2hhdCB0dXJuKSBzdGF5IG9mZiB1bmxlc3MgZXhwbGljaXRseSBvcHRlZCBpbi5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCkgLyBgdHJ1ZWA6IGV4cG9zZSBldmVyeSByZWdpc3RlcmVkIGFnZW50IGFzXG4gICAqICAgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sIHVuZGVyIGEgc2VydmVyIHdob3NlIGlkIGlzIHRoZSBwbHVnaW5cbiAgICogICBuYW1lLlxuICAgKiAtIGBmYWxzZWA6IG5vIE1DUCBlbmRwb2ludHMuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1jcENvbmZpZ306IGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIHNlcnZlciBpZCxcbiAgICogICBhZHZlcnRpc2VkIG1ldGFkYXRhLCBhbmQgd2hpY2ggYWdlbnRzIC8gdG9vbHMgYXJlIGV4cG9zZWQuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIHN0b2NrIE1hc3RyYSBNQ1Agcm91dGVzIG1vdW50IHVuZGVyIHRoZSBwbHVnaW4nc1xuICAgKiBiYXNlIHBhdGggKG5vIGJlc3Bva2Ugcm91dGUgaXMgYWRkZWQgLSB0aGUgc2VydmVyIGlzIGhhbmRlZCB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdmlhIGBtY3BTZXJ2ZXJzYCwgd2hpY2ggYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzKTpcbiAgICpcbiAgICogLSBTdHJlYW1hYmxlIEhUVFA6IGBQT1NUIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vbWNwYFxuICAgKiAtIFNTRSAobGVnYWN5KTogICAgYEdFVCAgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9zc2VgXG4gICAqICAgICAgICAgICAgICAgICAgICBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21lc3NhZ2VzYFxuICAgKlxuICAgKiBSZXF1ZXN0cyBydW4gdW5kZXIgdGhlIHNhbWUgQXBwS2l0IE9CTyBzY29wZSBhcyB0aGUgY2hhdCByb3V0ZXMsIHNvXG4gICAqIGFuIGFnZW50IGludm9rZWQgb3ZlciBNQ1AgcmVzb2x2ZXMgaXRzIG1vZGVsIGFuZCB0b29scyBhcyB0aGVcbiAgICogY2FsbGluZyB1c2VyLlxuICAgKi9cbiAgbWNwPzogYm9vbGVhbiB8IE1hc3RyYU1jcENvbmZpZztcbiAgLyoqXG4gICAqIEhvdyBtdWNoIG9mIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBtYW5hZ2VtZW50IEFQSSBpcyByZWFjaGFibGVcbiAgICogdGhyb3VnaCB0aGUgcGx1Z2luIG1vdW50LiBgQG1hc3RyYS9leHByZXNzYCByZWdpc3RlcnMgaXRzIGZ1bGwgcm91dGVcbiAgICogdGFibGUgKGFnZW50IGluZmVyZW5jZSBwbHVzIGFkbWluIC8gbXV0YXRpbmcgcm91dGVzOiBkaXJlY3QgdG9vbFxuICAgKiBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnkgcmVhZC93cml0ZSwgdGVsZW1ldHJ5LCBsb2dzLFxuICAgKiBzY29yZXMpLiBBcHBLaXQgYWxyZWFkeSBhdXRoZW50aWNhdGVzIGV2ZXJ5IHJlcXVlc3QgYXMgdGhlIE9CTyB1c2VyLFxuICAgKiBidXQgbm90aGluZyB0aGVyZSByZXN0cmljdHMgKndoaWNoKiBvZiB0aG9zZSBvcGVyYXRpb25zIHRoZSBicm93c2VyXG4gICAqIGNsaWVudCBtYXkgaW52b2tlLlxuICAgKlxuICAgKiAtIGBcInNjb3BlZFwiYCAoZGVmYXVsdCk6IG9ubHkgdGhlIHJvdXRlcyB0aGUgY2hhdCBjbGllbnQgbGVnaXRpbWF0ZWx5XG4gICAqICAgbmVlZHMgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhIC0gYWdlbnQgaW5mZXJlbmNlXG4gICAqICAgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCksIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpc1xuICAgKiAgIHBsdWdpbidzIG93biBPQk8tIGFuZCByZXNvdXJjZS1zY29wZWQgYC9yb3V0ZS8qYCByb3V0ZXMgKGhpc3RvcnkgL1xuICAgKiAgIHRocmVhZHMpLCBhbmQsIHdoZW4ge0BsaW5rIG1jcH0gaXMgZW5hYmxlZCwgdGhlIE1DUCB0cmFuc3BvcnQuXG4gICAqICAgRXZlcnl0aGluZyBlbHNlICh0b29sIGV4ZWN1dGlvbiwgd29ya2Zsb3cgY29udHJvbCwgcmF3IG1lbW9yeSxcbiAgICogICB0ZWxlbWV0cnksIGxvZ3MsIHNjb3JlcywgYW5kIG90aGVyIG11dGF0aW9ucykgaXMgcmVqZWN0ZWQgd2l0aFxuICAgKiAgIGA0MDNgIGJlZm9yZSBpdCByZWFjaGVzIE1hc3RyYS5cbiAgICogLSBgXCJmdWxsXCJgOiBkaXNwYXRjaCB0aGUgZW50aXJlIHN0b2NrIE1hc3RyYSBBUEkuIFVzZSBvbmx5IGZvciBhXG4gICAqICAgdHJ1c3RlZCBmaXJzdC1wYXJ0eSBjb25zb2xlIHRoYXQgZ2VudWluZWx5IG5lZWRzIHRoZSBtYW5hZ2VtZW50XG4gICAqICAgc3VyZmFjZS5cbiAgICovXG4gIGFwaUFjY2Vzcz86IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqXG4gICAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgdGhlIGFnZW50cycgd29ya3NwYWNlIGNhbGxzIHJ1biBhczogdGhlXG4gICAqIHNlcnZpbmctZW5kcG9pbnQgY2F0YWxvZ3VlIGJlaGluZCB0aGUgbW9kZWwgcGlja2VyLCBHZW5pZSBzdWdnZXN0aW9ucyxcbiAgICogYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaCBiZWhpbmQgYSBgW2RhdGE6PGlkPl1gXG4gICAqIGVtYmVkLiBGYWxscyBiYWNrIHRvIGBNQVNUUkFfR0VOSUVfSURFTlRJVFlgLCB0aGVuIGBcInVzZXJcImAuXG4gICAqXG4gICAqIE9uLWJlaGFsZi1vZiAoT0JPKSBhdXRoIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBtZW1iZXIgb2YgdGhlXG4gICAqIFdPUktTUEFDRSwgbm90IGp1c3Qgb2YgdGhlIERhdGFicmlja3MgYWNjb3VudC4gQW4gYXBwIHNoYXJlZCB3aXRoIGFuXG4gICAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIGJlIG9wZW5lZCBieSBzb21lb25lIHdob3NlIHRva2VuIGlzIHZhbGlkIGJ1dCB3aG9zZVxuICAgKiBldmVyeSB3b3Jrc3BhY2UgY2FsbCBmYWlscyB3aXRoIGBVbmF1dGhvcml6ZWQgYWNjZXNzIHRvIE9yZzogPGlkPmAgLSBhbmRcbiAgICogZ3JhbnRpbmcgd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwgc2luY2UgYSB3b3Jrc3BhY2VcbiAgICogY2FwcyBtZW1iZXJzaGlwIHdlbGwgYmVsb3cgdGhlIHNpemUgb2YgYSBsYXJnZSBhY2NvdW50J3MgdXNlciBncm91cC4gVGhlXG4gICAqIGFwcCdzIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLlxuICAgKlxuICAgKiAtIGBcInVzZXJcImAgKGRlZmF1bHQpOiBhbHdheXMgT0JPLiBQZXItdXNlciBhdHRyaWJ1dGlvbiwgYW5kIEdlbmllIC8gVW5pdHlcbiAgICogICBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW4gZXZlcnkgY2FsbGVyIGlzIGFcbiAgICogICB3b3Jrc3BhY2UgbWVtYmVyLCBhbmQgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIHRoaXMgb3B0aW9uIGV4aXN0ZWQuXG4gICAqIC0gYFwic2VydmljZS1wcmluY2lwYWxcImA6IGFsd2F5cyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLiBOZWVkcyBubyBPQk9cbiAgICogICBzY29wZXMgYW5kIHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwLCBhdCB0aGUgY29zdCBvZlxuICAgKiAgIHBlci11c2VyIGF0dHJpYnV0aW9uIGluIEdlbmllIC8gVW5pdHkgQ2F0YWxvZy5cbiAgICpcbiAgICogYFwic2VydmljZS1wcmluY2lwYWxcImAgY2hhbmdlcyBvbmx5IHRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwuIE1lbW9yeVxuICAgKiB0aHJlYWRzLCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGEgc3RpbGwga2V5IG9mZiB0aGVcbiAgICogZm9yd2FyZGVkIHVzZXIsIHNvIGNhbGxlcnMgc2hhcmluZyB0aGUgc2VydmljZSBwcmluY2lwYWwncyBkYXRhIGFjY2VzcyBrZWVwXG4gICAqIHNlcGFyYXRlIGNvbnZlcnNhdGlvbnMgYW5kIGNhbm5vdCByZWFkIGVhY2ggb3RoZXIncyB0aHJlYWRzIG9yIGNoYXJ0cy5cbiAgICpcbiAgICogQGV4YW1wbGUgQW4gYXBwIGFueSBhY2NvdW50IHVzZXIgY2FuIG9wZW5cbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJzZXJ2aWNlLXByaW5jaXBhbFwiLCBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBzcGFjZUlkIH0gfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2VuaWVJZGVudGl0eT86IE1hc3RyYUlkZW50aXR5TW9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJyYW5kIGNvbnRleHQgYXBwbGllZCB0byBjaGFydHMgcHJvZHVjZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAqIGByZW5kZXJfZGF0YWAgLyBgcHJlcGFyZV9jaGFydGAgdG9vbHMuIFdoZW4gc2V0LCB0aGUgY2hhcnQgcGxhbm5lcidzXG4gICAqIEVjaGFydHMgb3V0cHV0IGlzIHRoZW1lZCB3aXRoIHRoZSBicmFuZCdzIHBhbGV0dGUgKHNlcmllcyBjb2xvcnMgZGVyaXZlZFxuICAgKiBmcm9tIGBjb2xvcnMucHJpbWFyeWAgLyBgY29sb3JzLmFjY2VudGApIGFuZCBzYW5zIGZvbnRcbiAgICogKGB0eXBvZ3JhcGh5LnNhbnNgKSBpbnN0ZWFkIG9mIEVjaGFydHMnIGRlZmF1bHRzLiBPbWl0IGZvciB0aGUgZGVmYXVsdFxuICAgKiBFY2hhcnRzIGxvb2suXG4gICAqXG4gICAqIFBhc3MgdGhlIHBvcnRhYmxlIHtAbGluayBCcmFuZENvbnRleHR9IHNoYXJlZCBhY3Jvc3MgdGhlIFVJIGFuZFxuICAgKiBsaWJyYXJpZXMgKGUuZy4gYGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHRgIGZyb20gYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgLFxuICAgKiBvciBhIGN1c3RvbWVyIGJyYW5kKSAtIHRoZSBzYW1lIG9iamVjdCB0aGUgZW1haWwgYWRkLW9uIGFuZCB0aGUgVUlcbiAgICogYEJyYW5kUHJvdmlkZXJgIGNvbnN1bWUsIHNvIGEgaG9zdCB0aGVtZXMgY2hhcnRzLCBlbWFpbCwgYW5kIFVJIGZyb20gb25lXG4gICAqIHNvdXJjZS5cbiAgICovXG4gIGJyYW5kPzogQnJhbmRDb250ZXh0O1xuICAvKipcbiAgICogUmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgbWF0ZXJpYWxpemVkIG9uY2UgYXQgYXBwIHN0YXJ0dXAuIEEgc2luZ2xlXG4gICAqIHNvdXJjZSwgYSBsaXN0LCBvciBhIGB7IHNvdXJjZXMsIGZhaWxPbkVycm9yPywgLi4uIH1gIGJhZy5cbiAgICpcbiAgICogRWFjaCBzb3VyY2UgaXMgYSBHaXRIdWIgYG93bmVyL3JlcG9gLCBhIGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZGlyZWN0XG4gICAqIGBTS0lMTC5tZGAgLyBhcmNoaXZlIGRvd25sb2FkIFVSTC4gUmVzb2x1dGlvbiBwcmVmZXJzIHRoZSBPUFRJT05BTCBgc2tpbGxzYFxuICAgKiBucG0gQ0xJIChhIHBlZXIgZGVwKSB3aGljaCBpcyBjb3BpZWQgaW50byBhIHRlbXAgZGlyIGFuZCB0aGVuIHBlcnNpc3RlZDtcbiAgICogd2l0aG91dCBpdCwgYSBVUkwgc291cmNlIGlzIGZldGNoZWQgZGlyZWN0bHkuIEEgc291cmNlIHRoYXQgcmVzb2x2ZXNcbiAgICogdGhyb3VnaCBuZWl0aGVyIGZhaWxzIHN0YXJ0dXAgdW5sZXNzIGBmYWlsT25FcnJvcjogZmFsc2VgLlxuICAgKlxuICAgKiBQcm92aXNpb25lZCBza2lsbHMgYXJlIHdyaXR0ZW4gdG8gdGhlIERhdGFicmlja3MgdXNlcidzIEFzc2lzdGFudCBza2lsbHNcbiAgICogZm9sZGVyIChgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLCB0aGUgXCJzYXZlIHRoaXMgYXMgYSBza2lsbFwiXG4gICAqIHRhcmdldCkgc28gdGhleSBwZXJzaXN0IGFuZCBhcmUgcGlja2VkIHVwIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzXG4gICAqIG1vdW50LiBXaXRoIG5vIHdyaXRhYmxlIHdvcmtzcGFjZSwgdGhleSBnbyB0byBhIGxvY2FsIHRlbXAgZGlyIGluc3RlYWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7IHJlbW90ZVNraWxsczogXCJ2ZXJjZWwtbGFicy9hZ2VudC1za2lsbHNcIiB9KTtcbiAgICogbWFzdHJhKHtcbiAgICogICByZW1vdGVTa2lsbHM6IHtcbiAgICogICAgIHNvdXJjZXM6IFtcInZlcmNlbC1sYWJzL2FnZW50LXNraWxsc1wiLCBcImh0dHBzOi8vZXhhbXBsZS5jb20vc2tpbGwubWRcIl0sXG4gICAqICAgICBmYWlsT25FcnJvcjogZmFsc2UsXG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3RlU2tpbGxzPzogUmVtb3RlU2tpbGxzT3B0aW9uO1xufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHB1Ymxpc2hlZCBvbiB0aGUgbWFuaWZlc3QncyBgY29uZmlnLnNjaGVtYWAsIG1pcnJvcmluZyB0aGVcbiAqIGRvY3VtZW50ZWQgZGVmYXVsdHMgYW5kIGVudmlyb25tZW50IGZhbGxiYWNrcyBvZiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfS5cbiAqXG4gKiBDb3ZlcnMgdGhlIEpTT04tZXhwcmVzc2libGUgb3B0aW9ucyBvbmx5LiBgYWdlbnRzYCwgYHRvb2xzYCwgYW5kIGFcbiAqIGBkZWZhdWx0TW9kZWxgIHBhc3NlZCBhcyBhIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50YCBhcmUgY29kZS1kZWZpbmVkXG4gKiAoZnVuY3Rpb25zIC8gY2xhc3MgaW5zdGFuY2VzKSwgc28gdGhleSBjYXJyeSBubyBzY2hlbWEgZW50cnk7IHRoZVxuICogYGRlZmF1bHRNb2RlbGAgcHJvcGVydHkgYmVsb3cgZGVzY3JpYmVzIGl0cyBzdHJpbmcgZm9ybS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9DT05GSUdfU0NIRU1BOiBDb25maWdTY2hlbWEgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBwcm92aWRlcklkOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246ICdNYXN0cmEgT3BlbkFJLWNvbXBhdGlibGUgcHJvdmlkZXIgaWQuIERlZmF1bHRzIHRvIFwiZGF0YWJyaWNrc1wiLicsXG4gICAgfSxcbiAgICByZW1vdGVTa2lsbHM6IHtcbiAgICAgIHR5cGU6IFtcInN0cmluZ1wiLCBcImFycmF5XCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgcHJvdmlzaW9uZWQgYXQgc3RhcnR1cCAoR2l0SHViIG93bmVyL3JlcG8sIGdpdC9HaXRMYWIgVVJMLCBvciBhIGRpcmVjdCBTS0lMTC5tZC9hcmNoaXZlIFVSTCkuIFByZWZlcnMgdGhlIG9wdGlvbmFsIGBza2lsbHNgIG5wbSBDTEksIGVsc2UgYSBkaXJlY3QgZmV0Y2g7IGZhaWxzIHN0YXJ0dXAgb24gZXJyb3IgdW5sZXNzIGZhaWxPbkVycm9yOmZhbHNlLiBXcml0dGVuIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIgQXNzaXN0YW50IHNraWxscyBmb2xkZXIsIG9yIGEgbG9jYWwgdGVtcCBkaXIgd2hlbiBubyB3b3Jrc3BhY2UgaXMgd3JpdGFibGUuXCIsXG4gICAgfSxcbiAgICBzdG9yYWdlOiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9zdGdyZXNTdG9yZSBmb3IgTWFzdHJhIHRocmVhZHMgLyBtZXNzYWdlcy4gYHRydWVgIHJldXNlcyB0aGUgYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sLCBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuIEF1dG8tZW5hYmxlZCB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLlwiLFxuICAgIH0sXG4gICAgbWVtb3J5OiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUGdWZWN0b3Igc3RvcmUgZm9yIE1hc3RyYSBzZW1hbnRpYyByZWNhbGwuIGB0cnVlYCByZXVzZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbCwgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRBZ2VudDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFnZW50IGlkIHVzZWQgd2hlbiB0aGUgY2xpZW50IG5hbWVzIG5vbmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCByZWdpc3RlcmVkIGFnZW50LCBlbHNlIHRoZSBidWlsdC1pbiBgZGVmYXVsdGAuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTZXJ2aW5nIGVuZHBvaW50IGFwcGxpZWQgdG8gZXZlcnkgYWdlbnQgdGhhdCBvbWl0cyBpdHMgb3duIG1vZGVsLiBGYWxscyBiYWNrIHRvIERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FLCB0aGVuIHRoZSBhdXRvLXJlc29sdmVkIGNhdGFsb2d1ZS5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRNb2RlbEZhbGxiYWNrczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJpb3JpdHktb3JkZXJlZCBlbmRwb2ludCBuYW1lcyB0cmllZCBiZWZvcmUgdGhlIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBlbHNlIHBpbnMgYSBtb2RlbC5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlNYXRjaDoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSB3b3Jrc3BhY2UgY2F0YWxvZ3VlLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eVRocmVzaG9sZDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGZvciB0aGUgZnV6enkgbWF0Y2hlciwgMCAoZXhhY3QpIHRvIDEgKGFueXRoaW5nKS4gRGVmYXVsdHMgdG8gMC40LlwiLFxuICAgIH0sXG4gICAgbW9kZWxDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVFRMIGluIG1zIGZvciB0aGUgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgcGVyIHdvcmtzcGFjZSBob3N0LiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXCIsXG4gICAgfSxcbiAgICBtb2RlbE92ZXJyaWRlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhvbm9yIGEgcGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGUgZnJvbSB0aGUgWC1NYXN0cmEtTW9kZWwgaGVhZGVyLCA/bW9kZWw9IHF1ZXJ5LCBvciBhIGBtb2RlbGAgYm9keSBmaWVsZC4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgdHlwZTogW1wic3RyaW5nXCIsIFwib2JqZWN0XCJdIH0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJHZW5pZSBzcGFjZXMgdGhlIGFnZW50cyBjYW4gZGVsZWdhdGUgdG8sIGtleWVkIGJ5IGFsaWFzICh0aGUgdG9vbC1uYW1lIHN1ZmZpeCkuIEVhY2ggdmFsdWUgaXMgYSBzcGFjZSBpZCBvciBgeyBzcGFjZUlkLCBoaW50IH1gLiBGYWxscyBiYWNrIHRvIHRoZSBgZ2VuaWVgIHBsdWdpbidzIG93biBgc3BhY2VzYCBjb25maWcsIHRoZW4gREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzLlwiLFxuICAgIH0sXG4gICAgZ2VuaWVTcGFjZUNhY2hlVHRsTXM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUVEwgaW4gbXMgZm9yIHRoZSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZS4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLlwiLFxuICAgIH0sXG4gICAgYWdlbnRNYXhTdGVwczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk1heGltdW0gTExNIHN0ZXBzIGVhY2ggYWdlbnQgZ2V0cyBwZXIgdHVybiAoYSB0b29sIGNhbGwgYW5kIHRoZSBmaW5hbCByZXBseSBlYWNoIGNvbnN1bWUgb25lKS4gRGVmYXVsdHMgdG8gMjUuXCIsXG4gICAgfSxcbiAgICBzdHJpcFN0YWxlQ2hhcnRzOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlN0cmlwIGNoYXJ0SWRzIGZyb20gcmVjYWxsZWQgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBzbyB0aGUgbW9kZWwgY2Fubm90IHJldXNlIGEgdHVybi1zY29wZWQgY2hhcnQgbWFya2VyLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgc3R5bGVJbnN0cnVjdGlvbnM6IHtcbiAgICAgIHR5cGU6IFtcInN0cmluZ1wiLCBcImJvb2xlYW5cIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBBIHN0cmluZyByZXBsYWNlcyB0aGUgYnVpbHQtaW4gYmxvY2ssIGBmYWxzZWAgZGlzYWJsZXMgaXQuXCIsXG4gICAgfSxcbiAgICBvYnNlcnZhYmlsaXR5OiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkJyaWRnZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBPVGVsIHBpcGVsaW5lLiBEZWZhdWx0cyB0byBvbiBvbmx5IHdoZW4gT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UIG9yIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQgaXMgc2V0LlwiLFxuICAgIH0sXG4gICAgZmVlZGJhY2s6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTG9nIHRodW1icyAvIGNvbW1lbnQgYXNzZXNzbWVudHMgdG8gTUxmbG93IGFuZCBzdXJmYWNlIHRoZSBmZWVkYmFjayBjb250cm9scy4gRGVmYXVsdHMgdG8gb24gb25seSB3aGVuIGFuIE9UTFAgZW5kcG9pbnQgYW5kIE1MRkxPV19FWFBFUklNRU5UX0lEIG9yIE1MRkxPV19FWFBFUklNRU5UX05BTUUgYXJlIHNldC5cIixcbiAgICB9LFxuICAgIG1jcDoge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkV4cG9zZSB0aGUgcmVnaXN0ZXJlZCBhZ2VudHMgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGFnZW50cy1vbmx5OyBhbiBvYmplY3QgdHVuZXMgdGhlIHNlcnZlciBpZCwgYWR2ZXJ0aXNlZCBtZXRhZGF0YSwgYW5kIHdoZXRoZXIgYW1iaWVudCB0b29scyBhcmUgZXhwb3NlZC5cIixcbiAgICB9LFxuICAgIGdlbmllSWRlbnRpdHk6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJ1c2VyXCIsIFwic2VydmljZS1wcmluY2lwYWxcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1doaWNoIERhdGFicmlja3MgaWRlbnRpdHkgdGhlIGFnZW50c1xcJyB3b3Jrc3BhY2UgY2FsbHMgKHNlcnZpbmcgY2F0YWxvZ3VlLCBHZW5pZSwgc3RhdGVtZW50IGV4ZWN1dGlvbikgcnVuIGFzLiBcInVzZXJcIiAoZGVmYXVsdCkgaXMgYWx3YXlzIE9CTywgc28gY2FsbGVycyBtdXN0IGJlIHdvcmtzcGFjZSBtZW1iZXJzOyBcInNlcnZpY2UtcHJpbmNpcGFsXCIgYWx3YXlzIHVzZXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCwgc28gYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCB3b3JrcywgYXQgdGhlIGNvc3Qgb2YgcGVyLXVzZXIgYXR0cmlidXRpb24uIEZhbGxzIGJhY2sgdG8gTUFTVFJBX0dFTklFX0lERU5USVRZLicsXG4gICAgfSxcbiAgICBhcGlBY2Nlc3M6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJzY29wZWRcIiwgXCJmdWxsXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgbXVjaCBvZiB0aGUgc3RvY2sgQG1hc3RyYS9leHByZXNzIEFQSSBpcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW91bnQuIFwic2NvcGVkXCIgKGRlZmF1bHQpIGFsbG93cyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpcyBwbHVnaW5cXCdzIG93biByb3V0ZXMsIGFuZCBNQ1A7IFwiZnVsbFwiIGRpc3BhdGNoZXMgdGhlIGVudGlyZSBtYW5hZ2VtZW50IHN1cmZhY2UuJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9ydGFibGUgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGdlbmVyYXRlZCBjaGFydHMgKHNlcmllcyBwYWxldHRlIGZyb20gY29sb3JzLnByaW1hcnkgLyBjb2xvcnMuYWNjZW50LCBiYXNlIGZvbnQgZnJvbSB0eXBvZ3JhcGh5LnNhbnMpLlwiLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQVM1Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNCO0lBQzNELHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixnQkFBNkMsRUFDN0MsZUFBd0I7SUFF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LEVBQUUsU0FBUztZQUNmLFdBQVcsRUFDVCxxTEFBcUw7U0FDeEw7UUFDRCxHQUFHLEVBQUU7WUFDSCxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO1lBQzNCLFdBQVcsRUFDVCw0SkFBNEo7U0FDL0o7UUFDRCxhQUFhLEVBQUU7WUFDYixJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQztZQUNuQyxXQUFXLEVBQ1QscVdBQXFXO1NBQ3hXO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLFFBQVE7WUFDZCxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO1lBQ3hCLFdBQVcsRUFDVCxxT0FBcU87U0FDeE87UUFDRCxLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFDVCwwSUFBMEk7U0FDN0k7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBsdWdpbiBjb25maWd1cmF0aW9uIHR5cGVzIGFuZCBzaGFyZWQgYFJlcXVlc3RDb250ZXh0YCBrZXlzLlxuICpcbiAqIE93bnMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWd9ICh0aGUgcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0XG4gKiBjb25maWcpIGFuZCB7QGxpbmsgTUFTVFJBX0NPTkZJR19TQ0hFTUF9LCB0aGUgSlNPTiBTY2hlbWEgdGhlIG1hbmlmZXN0XG4gKiBwdWJsaXNoZXMgZm9yIGl0IHNvIHNjYWZmb2xkaW5nIHRvb2xzIGFuZCBhZ2VudHMgY2FuIHJlYWQgdGhlIG9wdGlvbiBzZXQuXG4gKlxuICogUHJlY2VkZW5jZSBwZXIgZmllbGQgaXMgZXhwbGljaXQgcGx1Z2luIGNvbmZpZywgdGhlbiB0aGUgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlIG5hbWVkIG9uIHRoZSBmaWVsZCwgdGhlbiBhIGJ1aWx0LWluIGRlZmF1bHQuXG4gKlxuICogS2VwdCBpbiBhIGxlYWYgbW9kdWxlIHNvIGBwbHVnaW4udHNgLCBgc2VydmVyLnRzYCwgYG1vZGVsLnRzYCwgYW5kXG4gKiBgbWVtb3J5LnRzYCBjYW4gaW1wb3J0IHRoZW0gd2l0aG91dCBjcmVhdGluZyBhIGN5Y2xlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIEJhc2VQbHVnaW5Db25maWcsIHR5cGUgQ29uZmlnU2NoZW1hIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50Q29uZmlnIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IFBnVmVjdG9yQ29uZmlnLCBQb3N0Z3Jlc1N0b3JlQ29uZmlnIH0gZnJvbSBcIkBtYXN0cmEvcGdcIjtcblxuaW1wb3J0IHR5cGUgeyBNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVRvb2xzIH0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NBSVRvb2xzT3B0aW9uIH0gZnJvbSBcIi4vZGF0YWJyaWNrcy1haXRvb2xzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEdlbmllU3BhY2VzQ29uZmlnIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhSWRlbnRpdHlNb2RlIH0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB0eXBlIHsgUmVtb3RlU2tpbGxzT3B0aW9uIH0gZnJvbSBcIi4vcmVtb3RlLXNraWxscy50c1wiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5IHVuZGVyIHdoaWNoIHtAbGluayBNYXN0cmFTZXJ2ZXJ9IHN0b3JlcyB0aGVcbiAqIHJlc29sdmVkIEFwcEtpdCB1c2VyLiBgbW9kZWwudHNgIHJlYWRzIGl0IHRvIG1pbnQgdXNlci1zY29wZWRcbiAqIERhdGFicmlja3MgdG9rZW5zLlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfS0VZID0gXCJtYXN0cmFfX3VzZXJcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleXMgZm9yIEFwcEtpdCB1c2VyIG1ldGFkYXRhIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBTdXJmYWNlZCBhcyB0cmFjZSBtZXRhZGF0YSB2aWFcbiAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gc28gdHJhY2VzIGFyZSBmaWx0ZXJhYmxlIGJ5IHdob1xuICogaXNzdWVkIHRoZSByZXF1ZXN0IHdpdGhvdXQgbGVha2luZyB0aGUgZnVsbCB1c2VyIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9VU0VSX05BTUVfS0VZID0gXCJtYXN0cmFfX3VzZXJOYW1lXCI7XG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfRU1BSUxfS0VZID0gXCJtYXN0cmFfX3VzZXJFbWFpbFwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5IGZvciB0aGUgcGVyLUhUVFAtcmVxdWVzdCBpZCBzdGFtcGVkIGJ5XG4gKiB7QGxpbmsgTWFzdHJhU2VydmVyfS4gUmVhZHMgYFgtUmVxdWVzdC1JZGAgZnJvbSB0aGUgaW5jb21pbmdcbiAqIGhlYWRlcnMgd2hlbiBwcmVzZW50IChzbyBhbiB1cHN0cmVhbSBsb2FkIGJhbGFuY2VyIC8gQVBJIGdhdGV3YXlcbiAqIGNhbiBrZWVwIGl0cyB0cmFjZSBjb3JyZWxhdGlvbiksIGZhbGxzIGJhY2sgdG8gYSBmcmVzaGx5IG1pbnRlZFxuICogVVVJRC4gRWNob2VkIGJhY2sgb24gdGhlIHJlc3BvbnNlIGFuZCBzdXJmYWNlZCBvbiBldmVyeSBzcGFuIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyBsb2dzIGFuZCB0cmFjZXMgc2hhcmUgYVxuICogam9pbiBrZXkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfUkVRVUVTVF9JRF9LRVkgPSBcIm1hc3RyYV9fcmVxdWVzdElkXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIE9BdXRoIHNjb3BlcyBwYXJzZWQgZnJvbSB0aGUgZm9yd2FyZGVkXG4gKiBhY2Nlc3MgdG9rZW4gYnkge0BsaW5rIE1hc3RyYVNlcnZlci5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3Blc30uXG4gKiBXb3Jrc3BhY2UgbW91bnRzIHRoYXQgdG91Y2ggRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZXMgcmVxdWlyZVxuICogYHdvcmtzcGFjZWAgb3IgYGFsbC1hcGlzYCBpbiB0aGlzIGxpc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfU0NPUEVTX0tFWSA9IFwibWFzdHJhX19zY29wZXNcIjtcblxuLyoqXG4gKiBDYW5vbmljYWwgbGlzdCBvZiBgUmVxdWVzdENvbnRleHRgIGtleXMgd2Ugd2FudCBNYXN0cmEgdG8gZXh0cmFjdFxuICogYXMgbWV0YWRhdGEgb24gZXZlcnkgb2JzZXJ2YWJpbGl0eSBzcGFuIChhZ2VudCBydW5zLCBtb2RlbCBjYWxscyxcbiAqIHRvb2wgaW52b2NhdGlvbnMsIHdvcmtmbG93IHN0ZXBzKS5cbiAqXG4gKiBNaXJyb3JzIHtAbGluayBodHRwczovL21hc3RyYS5haS9kb2NzL29ic2VydmFiaWxpdHkvdHJhY2luZy9vdmVydmlldyNhdXRvbWF0aWMtbWV0YWRhdGEtZnJvbS1yZXF1ZXN0Y29udGV4dH06XG4gKiBwYXNzZWQgdmVyYmF0aW0gaW50byBgT2JzZXJ2YWJpbGl0eS5jb25maWdzWypdLnJlcXVlc3RDb250ZXh0S2V5c2AsXG4gKiBzbyBhbnkga2V5IGxpc3RlZCBoZXJlIGlzIHJlYWQgZnJvbSBgUmVxdWVzdENvbnRleHRgIGF0IHRyYWNlXG4gKiBzdGFydCBhbmQgYXR0YWNoZWQgYXMgc2NhbGFyIHNwYW4gbWV0YWRhdGEuIEtlZXAgdGhlIHNldCB0byBwbGFpblxuICogc2NhbGFycyAtIG5ldmVyIGluY2x1ZGUge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX0gKGl0IGNhcnJpZXMgdGhlXG4gKiBmdWxsIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCB3aXRoIGEgYFdvcmtzcGFjZUNsaWVudGAgcmVmZXJlbmNlKS5cbiAqXG4gKiBPcmRlciBpcyBwdXJlbHkgY29zbWV0aWM7IE1hc3RyYSBkZS1kdXBlcyBpbnRlcm5hbGx5LlxuICovXG5leHBvcnQgY29uc3QgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgTUFTVFJBX1JFUVVFU1RfSURfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICAvLyBNb2RlbCBvdmVycmlkZSBrZXkgaXMgb3duZWQgYnkgYHNlcnZpbmcudHNgOyBzcGVsbGVkIGlubGluZSBoZXJlXG4gIC8vIHNvIHRoaXMgbW9kdWxlIHN0YXlzIGxlYWYtbGV2ZWwgKG5vIGN5Y2xlcyB3aXRoIGBzZXJ2aW5nLnRzYCkuXG4gIFwibWFzdHJhX19tb2RlbF9vdmVycmlkZVwiLFxuXTtcblxuLyoqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCBwbHVzIHRoZSBjYW5vbmljYWwgdXNlciBpZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlciB7XG4gIGlkOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbkNvbnRleHQ6IGFwcGtpdC5FeGVjdXRpb25Db250ZXh0TGlrZTtcbn1cblxuLyoqXG4gKiBDYW5vbmljYWwgaWRlbnRpdHkgZm9yIGFuIEFwcEtpdCBleGVjdXRpb24gY29udGV4dDogdGhlIE9CTyB1c2VyIGlkIG9uIGFcbiAqIHVzZXItc2NvcGVkIGNhbGwsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBpZCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRpb25Db250ZXh0VXNlcklkKGNvbnRleHQ6IGFwcGtpdC5FeGVjdXRpb25Db250ZXh0TGlrZSk6IHN0cmluZyB7XG4gIHJldHVybiBcInVzZXJJZFwiIGluIGNvbnRleHQgPyBjb250ZXh0LnVzZXJJZCA6IGNvbnRleHQuc2VydmljZVVzZXJJZDtcbn1cblxuLyoqXG4gKiBXaG8gYSB0dXJuIGlzIEFUVFJJQlVURUQgdG8sIHdoaWNoIGlzIG5vdCBhbHdheXMgd2hvc2UgRGF0YWJyaWNrcyBjcmVkZW50aWFsXG4gKiBydW5zIGl0LiBBbiBPQk8gY29udGV4dCdzIG93biB1c2VyIGlkIGlzIGF1dGhvcml0YXRpdmUuIFVuZGVyIHRoZSBzZXJ2aWNlXG4gKiBwcmluY2lwYWwsIGV2ZXJ5IGNhbGxlciBzaGFyZXMgb25lIGNyZWRlbnRpYWwsIHNvIHRoZSBmb3J3YXJkZWQgdXNlciBpZCBpc1xuICogd2hhdCBrZWVwcyBtZW1vcnkgdGhyZWFkcyBhbmQgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlcyBkaXN0aW5jdDsgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCBpZCBpcyB0aGUgZmxvb3Igd2hlbiBubyB1c2VyIHdhcyBmb3J3YXJkZWQuXG4gKlxuICogVGhpcyBydWxlIGhhcyB0byBiZSBpZGVudGljYWwgZXZlcnl3aGVyZSBhIGNhY2hlIGtleSBpcyBidWlsdCwgc28gYm90aCB0aGVcbiAqIHdyaXRlIHNpZGUgKHRoZSBgUmVxdWVzdENvbnRleHRgIHVzZXIgc3RhbXBlZCBieSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgKVxuICogYW5kIHRoZSByZWFkIHNpZGUgKHRoZSBwbHVnaW4ncyBvd24gQXBwS2l0IHJvdXRlcywgd2hpY2ggaGF2ZSBhIHJlcXVlc3QgYnV0XG4gKiBubyBgUmVxdWVzdENvbnRleHRgKSBkZXJpdmUgdGhlaXIga2V5IGZyb20gdGhpcyBvbmUgZnVuY3Rpb24uIFdoZW4gdGhlIHR3b1xuICogZGlzYWdyZWVkLCBhIGNoYXJ0IHdyaXR0ZW4gdW5kZXIgdGhlIGZvcndhcmRlZCB1c2VyIGlkIHdhcyByZWFkIGJhY2sgdW5kZXJcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBpZCBhbmQgdGhlIGVtYmVkIHJvdXRlIGFuc3dlcmVkIDQwNCwgd2hpY2ggdGhlIGNoYXQgVUlcbiAqIHJlbmRlcnMgYXMgYW4gZXhwaXJlZCBjaGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dHJpYnV0ZWRVc2VySWQoXG4gIGV4ZWN1dGlvbkNvbnRleHQ6IGFwcGtpdC5FeGVjdXRpb25Db250ZXh0TGlrZSxcbiAgZm9yd2FyZGVkVXNlcklkPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgaWYgKFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQpIHJldHVybiBleGVjdXRpb25Db250ZXh0VXNlcklkKGV4ZWN1dGlvbkNvbnRleHQpO1xuICByZXR1cm4gZm9yd2FyZGVkVXNlcklkID8/IGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgZXZlcnkgcGVyLXVzZXIgY2FjaGUgZW50cnkgaXMgbmFtZXNwYWNlZCB1bmRlciwgc28gYW4gT0JPIHJlc3VsdFxuICogY2Fubm90IGJlIHJlYWQgYmFjayBieSBhbm90aGVyIGNhbGxlci5cbiAqXG4gKiBQcmVmZXJzIHRoZSB7QGxpbmsgVXNlcn0gdGhhdCB7QGxpbmsgTWFzdHJhU2VydmVyfSBzdGFtcHMgb24gdGhlIHJlcXVlc3RcbiAqIGNvbnRleHQsIHdob3NlIGlkIGFscmVhZHkgZm9sbG93cyB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0uIFRoZSBNQ1AgdHJhbnNwb3J0XG4gKiByb3V0ZXMgZG8gbm90IHRocmVhZCB0aGF0IGNvbnRleHQgaW50byB0b29sIGV4ZWN1dGlvbiwgc28gdGhvc2UgZmFsbCBiYWNrIHRvXG4gKiB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCAodGhlIGFjdGl2ZSBPQk8gc2NvcGUsIG9yIHRoZSBzZXJ2aWNlXG4gKiBwcmluY2lwYWwpLiBBIGNhbGxlciBob2xkaW5nIGFuIGV4cHJlc3MgcmVxdWVzdCBzaG91bGQgYnVpbGQgaXRzIGtleSBmcm9tXG4gKiB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0gaW5zdGVhZCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlzIG5vdCBsb3N0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHVzZXI/LmlkID8/IGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpKTtcbn1cblxuLyoqIFBnVmVjdG9yIGNvbmZpZyB3aXRoIGFuIG9wdGlvbmFsIE1hc3RyYSBzdG9yZSBpZC4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZyA9IFBnVmVjdG9yQ29uZmlnICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIHRoZSBvcHRpb25hbCBNQ1Agc2VydmVyIGV4cG9zdXJlXG4gKiAoe0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5tY3B9KS4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw7IHRoZSBvYmplY3RcbiAqIGZvcm0gb25seSBuZWVkcyB0byBzZXQgd2hhdCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYU1jcENvbmZpZyB7XG4gIC8qKlxuICAgKiBTZXJ2ZXIgaWQgdXNlZCBpbiB0aGUgcm91dGUgcGF0aCAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSBhbmQgYXMgdGhlXG4gICAqIE1DUCByZWdpc3RyeSBpZC4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIHJlZ2lzdGVyZWQgbmFtZS5cbiAgICovXG4gIHNlcnZlcklkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjxkaXNwbGF5TmFtZT4gTUNQXCJgLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogU2VtYW50aWMgdmVyc2lvbiBhZHZlcnRpc2VkIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBgXCIxLjAuMFwiYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogRXhwb3NlIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgYXMgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAgLSB0aGlzIGlzIHRoZSBcImxldmVyYWdlIHRoZSBNYXN0cmEgYWdlbnRzIG92ZXJcbiAgICogTUNQXCIgYmVoYXZpb3IgbW9zdCBjYWxsZXJzIHdhbnQuXG4gICAqL1xuICBhZ2VudHM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxzbyBleHBvc2UgdGhlIHBsdWdpbidzIGFtYmllbnQgdG9vbHMgKHRoZSBidWlsdC1pbiBgcmVuZGVyX2RhdGFgXG4gICAqIHBsdXMgYW55dGhpbmcgaW4gYGNvbmZpZy50b29sc2ApIGFzIE1DUCB0b29scy4gRGVmYXVsdHMgdG8gYGZhbHNlYDpcbiAgICogdGhlIGFtYmllbnQgdG9vbHMgYXNzdW1lIGFuIGluLXByb2Nlc3MgY2hhdCB0dXJuICh0aGV5IHB1Ymxpc2hcbiAgICogd3JpdGVyIGV2ZW50cyB0aGUgY2hhdCBVSSBjb25zdW1lcyksIHNvIHRoZXkgYXJlbid0IHVzZWZ1bCB0byBhXG4gICAqIHN0YW5kYWxvbmUgTUNQIGNsaWVudC4gVHVybiB0aGlzIG9uIG9ubHkgd2hlbiB0aG9zZSB0b29scyBhcmUgc2FmZVxuICAgKiB0byBjYWxsIG91dC1vZi1iYW5kLlxuICAgKi9cbiAgdG9vbHM/OiBib29sZWFuO1xuICAvKipcbiAgICogRXh0cmEgdG9vbHMgdG8gZXhwb3NlIG92ZXIgTUNQIGJleW9uZCB0aGUgYWdlbnQgLyBhbWJpZW50IHNldHMuXG4gICAqIFVzZSB0aGlzIGZvciB0b29scyB3cml0dGVuIHNwZWNpZmljYWxseSBmb3IgTUNQIGNvbnN1bWVycy5cbiAgICovXG4gIGV4dHJhVG9vbHM/OiBNYXN0cmFUb29scztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gYWNjZXB0ZWQgYnkgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIE1hc3RyYSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBpZC4gRGVmYXVsdHMgdG8gYFwiZGF0YWJyaWNrc1wiYDsgbm8gZW52IGZhbGxiYWNrLiAqL1xuICBwcm92aWRlcklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUG9zdGdyZXNTdG9yZSBmb3IgTWFzdHJhIHRocmVhZHMvbWVzc2FnZXMuIGB0cnVlYCByZXVzZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBQb3N0Z3Jlc1N0b3JlQ29uZmlnO1xuICAvKipcbiAgICogUGdWZWN0b3Igc3RvcmUgZm9yIE1hc3RyYSBtZW1vcnkgcmVjYWxsLiBgdHJ1ZWAgcmV1c2VzIHRoZVxuICAgKiBgbGFrZWJhc2VgIHBsdWdpbidzIHBvb2w7IGFuIG9iamVjdCBvcGVucyBhIGRlZGljYXRlZCBzdG9yZS5cbiAgICovXG4gIG1lbW9yeT86IGJvb2xlYW4gfCBNYXN0cmFNZW1vcnlDb25maWc7XG4gIC8qKlxuICAgKiBDb2RlLWRlZmluZWQgYWdlbnRzLiBBY2NlcHRzIHRocmVlIHNoYXBlcyBmb3IgY29udmVuaWVuY2U6XG4gICAqXG4gICAqIC0gKipSZWNvcmQqKjogYHsgYW5hbHlzdDogZGVmLCBoZWxwZXI6IGRlZiB9YCAtIGtleXMgYmVjb21lIHRoZVxuICAgKiAgIHJlZ2lzdGVyZWQgaWRzIGFuZCB0aGUgZmlyc3Qga2V5IGlzIHRoZSBkZWZhdWx0LlxuICAgKiAtICoqU2luZ2xlIGRlZmluaXRpb24qKjogYGRlZmAgLSByZWdpc3RlcmVkIHVuZGVyXG4gICAqICAgYHNsdWdpZnkoZGVmLm5hbWUpYCAob3IgYFwiZGVmYXVsdFwiYCB3aGVuIGBuYW1lYCBpcyBvbWl0dGVkKSBhbmRcbiAgICogICBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyB0aGUgZGVmYXVsdCBhZ2VudC5cbiAgICogLSAqKkFycmF5Kio6IGBbZGVmMSwgZGVmMl1gIC0gZWFjaCByZWdpc3RlcmVkIHVuZGVyXG4gICAqICAgYHNsdWdpZnkoZGVmLm5hbWUpYCAob3IgYGFnZW50XyR7aX1gIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpO1xuICAgKiAgIHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgZGVmYXVsdC5cbiAgICpcbiAgICogRWFjaCBlbnRyeSBiZWNvbWVzIGEgTWFzdHJhIGBBZ2VudGAgcmVhY2hhYmxlIGF0XG4gICAqIGAvYXBpLzxwbHVnaW4+L3JvdXRlL2NoYXQvPGlkPmAgKHRoZSBjaGF0IHJvdXRlIGFsc28gbWF0Y2hlc1xuICAgKiBgOmFnZW50SWRgKS4gV2hlbiBgYWdlbnRzYCBpcyBvbWl0dGVkIGVudGlyZWx5LCB0aGUgcGx1Z2luXG4gICAqIHJlZ2lzdGVycyBhIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdCBzbyB0aGUgYmFyZVxuICAgKiBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IGVuZHBvaW50LlxuICAgKlxuICAgKiBAZXhhbXBsZSBTaW5nbGUtYWdlbnQgc2hvcnRoYW5kXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBjcmVhdGVBZ2VudCh7IGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBBcnJheVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czogW1xuICAgKiAgICAgY3JlYXRlQWdlbnQoeyBuYW1lOiBcImFuYWx5c3RcIiwgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgICAgY3JlYXRlQWdlbnQoeyBuYW1lOiBcImhlbHBlclwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgXSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBSZWNvcmQgKGV4cGxpY2l0IGlkcylcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IHtcbiAgICogICAgIGFuYWx5c3Q6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgICAgaGVscGVyOiBjcmVhdGVBZ2VudCh7IGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICB9LFxuICAgKiAgIGRlZmF1bHRBZ2VudDogXCJhbmFseXN0XCIsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFnZW50cz86IFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj4gfCBNYXN0cmFBZ2VudERlZmluaXRpb24gfCBNYXN0cmFBZ2VudERlZmluaXRpb25bXTtcbiAgLyoqXG4gICAqIEFtYmllbnQgdG9vbHMgc3ByZWFkIGludG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCdzIHRvb2xzIHJlY29yZDtcbiAgICogcGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXkgY29sbGlzaW9uLiBVc2UgZm9yIGEgc21hbGwgc2hhcmVkXG4gICAqIGxpYnJhcnk7IGZvciBwZXItYWdlbnQgdG9vbHMgc2V0IGBhZ2VudHNbaWRdLnRvb2xzYCBpbnN0ZWFkLlxuICAgKi9cbiAgdG9vbHM/OiBNYXN0cmFUb29scztcbiAgLyoqXG4gICAqIEFnZW50IGlkIHVzZWQgd2hlbiB0aGUgY2xpZW50IGRvZXNuJ3Qgc3BlY2lmeSBvbmUgKHRoZSBiYXJlLFxuICAgKiB1bi1zdWZmaXhlZCBoaXN0b3J5IC8gc3VnZ2VzdGlvbnMgcm91dGVzIHJlc29sdmUgdG8gaXQpLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgZmlyc3Qga2V5IGluIGBhZ2VudHNgIChvciBgXCJkZWZhdWx0XCJgIHdoZW5cbiAgICogYGFnZW50c2AgaXMgb21pdHRlZCkuIE11c3QgbWF0Y2ggYW4gaWQgaW4gYGFnZW50c2Agd2hlbiBib3RoIGFyZVxuICAgKiBzZXQ7IGEgbWlzbWF0Y2ggdGhyb3dzIGF0IHNldHVwIHdpdGggdGhlIGF2YWlsYWJsZSBjYW5kaWRhdGVzLlxuICAgKi9cbiAgZGVmYXVsdEFnZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGx1Z2luLWxldmVsIGRlZmF1bHQgbW9kZWwgYXBwbGllZCB0byBldmVyeSBhZ2VudCB0aGF0IG9taXRzIGl0c1xuICAgKiBvd24gYG1vZGVsYC4gTWlycm9ycyBBcHBLaXQncyBgYWdlbnRzKHsgZGVmYXVsdE1vZGVsIH0pYC5cbiAgICpcbiAgICogLSBgc3RyaW5nYDogc2hvcnRoYW5kIGZvciBcInVzZSB0aGUgT0JPIGF1dG8tcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiYCkuXG4gICAqIC0gQW55IG90aGVyIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50PE1hc3RyYU1vZGVsQ29uZmlnPmA6IHBhc3NlZFxuICAgKiAgIHRocm91Z2ggdmVyYmF0aW0uIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYXV0aFxuICAgKiAgIG9yIGBwcm92aWRlcklkYC5cbiAgICpcbiAgICogUmVzb2x1dGlvbiBvcmRlciBwZXIgYWdlbnQ6IGBkZWYubW9kZWxgIOKGkiBgZGVmYXVsdE1vZGVsYCDihpJcbiAgICogYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCDihpIgYnVpbHQtaW4gYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAgICogcmVzb2x2ZXIuXG4gICAqL1xuICBkZWZhdWx0TW9kZWw/OiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHwgc3RyaW5nO1xuICAvKipcbiAgICogRnV6enktbWF0Y2ggbG9vc2UgbW9kZWwgbmFtZXMgKGBcImNsYXVkZSBzb25uZXRcImApIGFnYWluc3QgdGhlIHdvcmtzcGFjZSdzXG4gICAqIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgdG8gcmVxdWlyZSBleGFjdCBlbmRwb2ludCBuYW1lcyBldmVyeXdoZXJlLlxuICAgKi9cbiAgbW9kZWxGdXp6eU1hdGNoPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGZvciB0aGUgZnV6enkgbWF0Y2hlciwgMCAoZXhhY3QpIHRvIDEgKGFueXRoaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYDAuNGA7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogTG93ZXIgdmFsdWVzIHJlamVjdCBsb29zZSBtYXRjaGVzOyByYWlzZSBpdCBpZiB5b3UgaGF2ZSBhIHNwcmF3bGluZ1xuICAgKiBlbmRwb2ludCBjYXRhbG9ndWUgd2l0aCBzaW1pbGFyLWxvb2tpbmcgbmFtZXMuXG4gICAqL1xuICBtb2RlbEZ1enp5VGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICogVFRMIGZvciB0aGUgaW4tbWVtb3J5IHNlcnZpbmctZW5kcG9pbnRzIGxpc3QgY2FjaGUsIGluIG1pbGxpc2Vjb25kcy5cbiAgICogRGVmYXVsdHMgdG8gNSBtaW51dGVzOyBubyBlbnYgZmFsbGJhY2suXG4gICAqXG4gICAqIFRoZSBjYWNoZSBpcyBwZXIgd29ya3NwYWNlIGhvc3QgYW5kIHNoYXJlZCBhY3Jvc3MgdXNlcnM7IGNvbmN1cnJlbnRcbiAgICogY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZSBpbi1mbGlnaHQgZmV0Y2guXG4gICAqL1xuICBtb2RlbENhY2hlVHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBMZXQgY2xpZW50cyBwaWNrIHRoZSBiYWNraW5nIGVuZHBvaW50IHBlciByZXF1ZXN0LiBEZWZhdWx0cyB0byBgdHJ1ZWA7XG4gICAqIG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogUmVhZHMgdGhlIGBYLU1hc3RyYS1Nb2RlbGAgaGVhZGVyLCB0aGUgYD9tb2RlbD1gIHF1ZXJ5IHN0cmluZywgb3IgYVxuICAgKiBgbW9kZWxgIGJvZHkgZmllbGQsIGluIHRoYXQgb3JkZXIuIERpc2FibGUgd2hlbiBydW5uaW5nIG11bHRpLXRlbmFudFxuICAgKiB3aGVyZSB1bnRydXN0ZWQgY2xpZW50cyBzaG91bGRuJ3QgY2hvb3NlIHRoZSBlbmRwb2ludC5cbiAgICovXG4gIG1vZGVsT3ZlcnJpZGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUHJpb3JpdHktb3JkZXJlZCBsaXN0IG9mIGVuZHBvaW50IG5hbWVzIHRyaWVkICpmaXJzdCogd2hlbiBub1xuICAgKiBhZ2VudCAvIHBsdWdpbiAvIGVudiAvIHJlcXVlc3Qtb3ZlcnJpZGUgbW9kZWwgaWQgaXMgc2V0LCBhaGVhZCBvZlxuICAgKiB0aGUgZHluYW1pYyBzY29yZS1jbGFzc2lmaWVkIGNhdGFsb2d1ZS4gVGhlIHJlc29sdmVyIHBpY2tzIHRoZVxuICAgKiBmaXJzdCBpZCB0aGF0IGlzIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZSdzXG4gICAqIGAvc2VydmluZy1lbmRwb2ludHNgIGxpc3RpbmcuXG4gICAqXG4gICAqIFdoZW4gdW5zZXQsIHJlc29sdXRpb24gaXMgZHJpdmVuIGJ5IHRoZSBsaXZlIEZvdW5kYXRpb24gTW9kZWwgQVBJXG4gICAqIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzOiBlbmRwb2ludHMgYXJlIGNsYXNzaWZpZWQgaW50b1xuICAgKiBjaGF0IGNsYXNzZXMgKGBjbGFzc2lmeUVuZHBvaW50c2ApIGFuZCB3YWxrZWQgYmVzdC1maXJzdFxuICAgKiAoQ2hhdFRoaW5raW5nIC0+IENoYXRCYWxhbmNlZCAtPiBDaGF0RmFzdCksIHdpdGggdGhlIHNtYWxsIGJ1aWx0LWluXG4gICAqIGBGQUxMQkFDS19NT0RFTF9JRFNgIGxpc3QgYXMgdGhlIGZsb29yIHdoZW4gdGhlIGNhdGFsb2d1ZSBjYW4ndCBiZVxuICAgKiByZWFkLiBTZXQgdGhpcyB0b1xuICAgKiBwaW4gYSByZWd1bGF0ZWQgd29ya3NwYWNlIHRvIGFuIGFwcHJvdmVkIHN1YnNldCwgb3IgdG8gcHV0IGN1c3RvbVxuICAgKiBlbmRwb2ludHMgaW4gZnJvbnQgb2YgdGhlIGF1dG8tY2xhc3NpZmllZCBjYXRhbG9ndWUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxGYWxsYmFja3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIChkZWZhdWx0KSwgZXZlcnkgYWdlbnQgZ2V0cyBhIGJ1aWx0LWluIGlucHV0XG4gICAqIHByb2Nlc3NvciB0aGF0IHN0cmlwcyBgY2hhcnRJZGAgZmllbGRzIGZyb20gcHJpb3IgYXNzaXN0YW50XG4gICAqIHRvb2wtaW52b2NhdGlvbiByZXN1bHRzIGJlZm9yZSB0aGV5IHJlYWNoIHRoZSBtb2RlbC4gVGhpc1xuICAgKiBwcmV2ZW50cyB0aGUgbW9kZWwgZnJvbSByZXVzaW5nIHR1cm4tc2NvcGVkIGNoYXJ0SWRzIGl0IHNlZXNcbiAgICogaW4gbWVtb3J5IHJlY2FsbCAod2hpY2ggd291bGQgbGVhdmUgYFtjaGFydDo8aWQ+XWAgbWFya2Vyc1xuICAgKiBwb2ludGluZyBhdCB3cml0ZXIgZXZlbnRzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0KS5cbiAgICpcbiAgICogU2V0IHRvIGBmYWxzZWAgdG8gb3B0IG91dCAtIHVzZWZ1bCBpZiBhIG5vbi1kZWZhdWx0IGFnZW50XG4gICAqIG5lZWRzIGZ1bGwgdmlzaWJpbGl0eSBpbnRvIHByaW9yIGNoYXJ0SWRzIChlLmcuIGFuIGF1ZGl0XG4gICAqIGFnZW50IHJlYXNvbmluZyBhYm91dCBjaGFydCBsaW5lYWdlKS5cbiAgICovXG4gIHN0cmlwU3RhbGVDaGFydHM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAgICogY29tbW9uIExMTS1pc21zIChlbSBkYXNoZXMsIGVtb2ppcywgc3ljb3BoYW50aWMgb3BlbmVycywgdGhyb3dhd2F5XG4gICAqIGNsb3NlcnMsIGV4Y2Vzc2l2ZSBoZWRnaW5nKS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IHVzZSB0aGUgYnVpbHQtaW5cbiAgICogICBgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlNgIGZyb20gYGFnZW50cy50c2AuXG4gICAqIC0gYHN0cmluZ2A6IHJlcGxhY2UgdGhlIGRlZmF1bHQgd2l0aCB0aGUgc3VwcGxpZWQgYmxvY2suXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBlbnRpcmVseSAoYWdlbnRzIHNlZSBvbmx5IHRoZWlyIGJlc3Bva2VcbiAgICogICBgaW5zdHJ1Y3Rpb25zYCkuXG4gICAqXG4gICAqIEFwcGVuZGVkIChub3QgcHJlcGVuZGVkKSBzbyB0aGUgYWdlbnQncyByb2xlIGFuZCBydWxlcyBjb21lIGZpcnN0XG4gICAqIGFuZCB0aGUgc3R5bGUgYmxvY2sgbGVhbnMgb24gdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzLlxuICAgKi9cbiAgc3R5bGVJbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBmYWxzZTtcbiAgLyoqXG4gICAqIEdlbmllIHNwYWNlcyB0aGlzIHBsdWdpbidzIGFnZW50cyBjYW4gZGVsZWdhdGUgdG8uIE9uZSBNYXN0cmFcbiAgICogdG9vbCBpcyByZWdpc3RlcmVkIHBlciBhbGlhcyAoYGdlbmllYCBmb3IgdGhlIHdlbGwta25vd25cbiAgICogYGRlZmF1bHRgIGFsaWFzLCBgZ2VuaWVfPGFsaWFzPmAgb3RoZXJ3aXNlKS4gRWFjaCB0b29sIHNwaW5zXG4gICAqIHVwIGEgcGVyLXF1ZXN0aW9uIEdlbmllIHN1Yi1hZ2VudCB0aGF0IHJ1bnMgRGF0YWJyaWNrc1xuICAgKiBcImFnZW50IG1vZGVcIiBhZ2FpbnN0IHRoZSBzcGFjZSwgYnJvYWRjYXN0cyB3aXJlIGV2ZW50cyB0byB0aGVcbiAgICogVUksIGZldGNoZXMgc3RhdGVtZW50IHJvd3MgZm9yIG5vbi1lbXB0eSByZXN1bHRzLCBhbmQgcmV0dXJuc1xuICAgKiBhIGAoc3RyaW5nIHwgZGF0YSB8IGNoYXJ0KVtdYCBzdW1tYXJ5IHRoZSBob3N0IFVJIHJlbmRlcnNcbiAgICogaW5saW5lLlxuICAgKlxuICAgKiBFbnRyaWVzIGFjY2VwdCBlaXRoZXIgYSBmdWxsIHtAbGluayBHZW5pZVNwYWNlQ29uZmlnfSBvYmplY3RcbiAgICogb3IgYSBiYXJlIGBzcGFjZV9pZGAgc3RyaW5nIHdoZW4gbm8gZXh0cmFzIGFyZSBuZWVkZWQ6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgZ2VuaWVTcGFjZXM6IHtcbiAgICogICAgIGRlZmF1bHQ6IFwiMDFlZjBkM2MwZTFiMWY0YThkMmMzZTRmNWE2YjdjOGRcIixcbiAgICogICAgIGZvcmVjYXN0czogeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiwgaGludDogXCJ3ZWVrbHkgZGVtYW5kIGZvcmVjYXN0c1wiIH0sXG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZWFjaCB0aGUgc3BhY2VzIGZyb20gYW4gYWdlbnQncyBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIHZpYVxuICAgKiBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYDsgdGhlIHJlc3VsdGluZyB0b29scyBhY2NlcHRcbiAgICogYHsgY29udGVudCwgY29udmVyc2F0aW9uSWQ/IH1gIGFuZCByZXR1cm4gYSBoeWRyYXRlZCBzdW1tYXJ5LlxuICAgKlxuICAgKiAqKkZhbGxiYWNrIGRpc2NvdmVyeSoqIChoaWdoZXN0IHByZWNlZGVuY2UgZmlyc3QpOiBpZiB0aGlzXG4gICAqIGZpZWxkIGlzIG9taXR0ZWQsIHRoZSBHZW5pZSBhZ2VudCBhbHNvIHBpY2tzIHVwIHNwYWNlcyBmcm9tXG4gICAqICgxKSB0aGUgQXBwS2l0IGBnZW5pZSh7IHNwYWNlczogeyAuLi4gfSB9KWAgcGx1Z2luIGluc3RhbmNlXG4gICAqIHdoZW4gcmVnaXN0ZXJlZCwgYW5kICgyKSB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgXG4gICAqIGVudiB2YXIgKHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGBkZWZhdWx0YCBhbGlhcykuIFRoaXMga2VlcHNcbiAgICogZXhpc3RpbmcgQXBwS2l0IGRlcGxveW1lbnRzIHdvcmtpbmcgd2l0aG91dCByZXN0YXRpbmcgdGhlXG4gICAqIHNwYWNlcyBjb25maWcgaW4gdHdvIHBsYWNlcy5cbiAgICovXG4gIGdlbmllU3BhY2VzPzogR2VuaWVTcGFjZXNDb25maWc7XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgR2VuaWUgc3BhY2UgbWV0YWRhdGEgY2FjaGUsIGluXG4gICAqIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLiBUaGUgR2VuaWUgYWdlbnQgY2FsbHNcbiAgICogYGNsaWVudC5nZW5pZS5nZXRTcGFjZSguLi4pYCBvbiBldmVyeSBjb2xkLXN0YXJ0IHRvIGdldCB0aGVcbiAgICogdGl0bGUgLyBkZXNjcmlwdGlvbiAvIHdhcmVob3VzZSBpZDsgY2FjaGVkIHJlc3BvbnNlcyBza2lwIHRoZVxuICAgKiByb3VuZC10cmlwIGFuZCBjb25jdXJyZW50IGNhbGxlcnMgY29hbGVzY2Ugb24gYSBzaW5nbGVcbiAgICogaW4tZmxpZ2h0IGZldGNoLiBEcm9wIHRvIGEgc21hbGxlciB2YWx1ZSB3aGVuIGFuYWx5c3RzIGFyZVxuICAgKiBhY3RpdmVseSBlZGl0aW5nIHNwYWNlIG1ldGFkYXRhIGFuZCB5b3Ugd2FudCBjaGFuZ2VzIHZpc2libGVcbiAgICogd2l0aGluIHNlY29uZHM7IHJhaXNlIGl0IHRvIGFtb3J0aXNlIHRoZSByb3VuZC10cmlwIHdoZW5cbiAgICogc3BhY2UgbWV0YWRhdGEgaXMgZWZmZWN0aXZlbHkgZnJvemVuLlxuICAgKlxuICAgKiBCYWNrZWQgYnkgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAsIHNvIHRoZSBjYWNoZSBwYXJ0aWNpcGF0ZXNcbiAgICogaW4gdGVsZW1ldHJ5IHNwYW5zIChgY2FjaGUuZ2V0T3JFeGVjdXRlYCkgYW5kIGJlbmVmaXRzIGZyb21cbiAgICogTGFrZWJhc2UgcGVyc2lzdGVuY2Ugd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgd2lyZWQgdXAuXG4gICAqL1xuICBnZW5pZVNwYWNlQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gTExNIHN0ZXBzIGVhY2ggYWdlbnQgZ2V0cyBwZXIgdHVybi4gT25lIHN0ZXAgPSBvbmVcbiAgICogcm91bmQtdHJpcCB0byB0aGUgdW5kZXJseWluZyBtb2RlbCAoYSB0b29sIGNhbGwgY29uc3VtZXMgYVxuICAgKiBzdGVwLCB0aGUgZmluYWwtdGV4dCByZXBseSBjb25zdW1lcyBvbmUgdG9vKS4gQXBwbGllcyB0b1xuICAgKiBldmVyeSBhZ2VudCByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9XG4gICAqIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhcmVuJ3Qgc3VyZmFjZWQgeWV0IGJlY2F1c2UgdGhlIHNhbWVcbiAgICogY2VpbGluZyBoYXMgYmVlbiBzdWZmaWNpZW50IGFjcm9zcyBldmVyeSB3b3JrbG9hZCB3ZSd2ZSBydW4uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0FHRU5UX01BWF9TVEVQU30gKDI1KSwgc2l6ZWQgdG8gZml0XG4gICAqIGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgIGNhbGxzXG4gICAqICsgYHByZXBhcmVfY2hhcnRgIHBlciBkYXRhc2V0ICsgdGhlIGZpbmFsLXRleHQgcmVwbHkpIHdpdGhcbiAgICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICAgKiBhbnN3ZXJpbmcuIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2YgNSB3b3VsZFxuICAgKiBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBhZnRlciAyLTMgdG9vbCBjYWxscywgc29cbiAgICogZXhwbGljaXRseSByYWlzaW5nIHRoZSBjZWlsaW5nIGhlcmUgaXMgd2hhdCBsZXRzIHRoZVxuICAgKiBhZ2VudC1tb2RlIGxvb3AgcGxheSBvdXQuXG4gICAqXG4gICAqIExvd2VyIHdoZW4gYW4gdW51c3VhbGx5IHNsb3cgb3IgZXhwZW5zaXZlIG1vZGVsIG1ha2VzIGxvbmdcbiAgICogdHVybnMgdW5hZmZvcmRhYmxlOyByYWlzZSBmb3IgZXhwbG9yYXRvcnkgd29ya2xvYWRzIHRoYXQgbmVlZFxuICAgKiB0byBkcmlsbCBkZWVwIGludG8gYSBkYXRhc2V0IHdpdGhpbiBhIHNpbmdsZSB0dXJuLlxuICAgKi9cbiAgYWdlbnRNYXhTdGVwcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdpcmUgTWFzdHJhIHNwYW5zIGludG8gQXBwS2l0J3MgZ2xvYmFsIE9UZWwgcGlwZWxpbmUgdmlhXG4gICAqIGBAbWFzdHJhL290ZWwtYnJpZGdlYC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCwgYXV0byk6IG9uIG9ubHkgd2hlblxuICAgKiAgIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIG9yXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlRgIGlzIHNldC4gV2hlbiB1bnNldCwgdGhlXG4gICAqICAgYnJpZGdlIGlzIHNraXBwZWQgc28gTWFzdHJhIGRvZXMgbm90IGxvZ1xuICAgKiAgIGBbT3RlbEJyaWRnZV0gTm8gT1RFTCBzcGFuIGZvdW5kYCBvbiB0aGUgbm9vcCB0cmFjZXIuXG4gICAqIC0gYHRydWVgOiBmb3JjZSBvbiBldmVuIHdpdGhvdXQgYW4gT1RMUCBlbmRwb2ludC5cbiAgICogLSBgZmFsc2VgOiBmb3JjZSBvZmYuXG4gICAqL1xuICBvYnNlcnZhYmlsaXR5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIExvZyB1c2VyIGZlZWRiYWNrICh0aHVtYnMgdXAvZG93biArIGZyZWVmb3JtIGNvbW1lbnRzKSB0byBNTGZsb3cgYXNcbiAgICogdHJhY2UgYXNzZXNzbWVudHMsIGFuZCBzdXJmYWNlIHRoZSBmZWVkYmFjayBjb250cm9scyBpbiB0aGUgY2hhdCBVSS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCwgYXV0byk6IGVuYWJsZWQgb25seSB3aGVuIE1MZmxvdyB0cmFjaW5nIGlzXG4gICAqICAgd2lyZWQgLSBhbiBPVExQIGV4cG9ydGVyIGVuZHBvaW50IGlzIHNldCBhbmQgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICogICBpcyBuYW1lZCAodGhlIHNhbWUgc2lnbmFscyB0aGUgb2JzZXJ2YWJpbGl0eSBwaXBlbGluZSBuZWVkcyB0b1xuICAgKiAgIHNoaXAgdHJhY2VzIHRvIE1MZmxvdykuIE90aGVyd2lzZSBvZmYsIHNpbmNlIHRoZXJlJ2QgYmUgbm8gdHJhY2VcbiAgICogICB0byBhdHRhY2ggZmVlZGJhY2sgdG8uXG4gICAqIC0gYHRydWVgOiBmb3JjZSBvbi4gRmVlZGJhY2sgY29udHJvbHMgc2hvdyBhbmQgd3JpdGVzIGFyZSBhdHRlbXB0ZWRcbiAgICogICByZWdhcmRsZXNzIG9mIGVudiBkZXRlY3Rpb24gKHVzZSB3aGVuIHRoZSBlbnYgaXMgY29uZmlndXJlZCBpbiBhXG4gICAqICAgd2F5IHRoZSBhdXRvLXByb2JlIGRvZXNuJ3QgcmVjb2duaXplKS5cbiAgICogLSBgZmFsc2VgOiBmb3JjZSBvZmYuIE5vIHRyYWNlLWlkIGhlYWRlciwgbm8gZmVlZGJhY2sgcm91dGUsIG5vIFVJLlxuICAgKlxuICAgKiBGZWVkYmFjayBhdHRhY2hlcyB0byBhIHR1cm4ncyBNTGZsb3cgdHJhY2UgdmlhIHRoZSBPcGVuVGVsZW1ldHJ5XG4gICAqIHRyYWNlIGlkIHRoZSBzZXJ2ZXIgc3RhbXBzIG9uIGVhY2ggcmVzcG9uc2U7IHNlZSBgbWxmbG93LnRzYC5cbiAgICovXG4gIGZlZWRiYWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEV4cG9zZSB0aGUgcGx1Z2luJ3MgYWdlbnRzIChhbmQgb3B0aW9uYWxseSB0b29scykgYXMgYSBNYXN0cmEgTUNQXG4gICAqIHNlcnZlciBzbyBleHRlcm5hbCBNQ1AgY2xpZW50cyAtIENsYXVkZSBEZXNrdG9wLCBDdXJzb3IsIHRoZSBNYXN0cmFcbiAgICogcGxheWdyb3VuZCwgb3IgYW5vdGhlciBhZ2VudCAtIGNhbiBjYWxsIHRoZW0gb3ZlciB0aGUgc3RhbmRhcmQgTUNQXG4gICAqIHRyYW5zcG9ydHMuIEVuYWJsZWQgYnkgZGVmYXVsdCAoYWdlbnRzIG9ubHkpOiB3cmFwcGluZyB0aGVcbiAgICogYWxyZWFkeS1yZWdpc3RlcmVkIGFnZW50cyBjb3N0cyBub3RoaW5nIGV4dHJhLCBzbyB0aGUgZW5kcG9pbnQgaXMgb25cbiAgICogb3V0IG9mIHRoZSBib3g7IG9ubHkgdGhlIGFtYmllbnQgdG9vbHMgKHdoaWNoIGFzc3VtZSBhbiBpbi1wcm9jZXNzXG4gICAqIGNoYXQgdHVybikgc3RheSBvZmYgdW5sZXNzIGV4cGxpY2l0bHkgb3B0ZWQgaW4uXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpIC8gYHRydWVgOiBleHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhc1xuICAgKiAgIGFuIGBhc2tfPGFnZW50SWQ+YCBNQ1AgdG9vbCB1bmRlciBhIHNlcnZlciB3aG9zZSBpZCBpcyB0aGUgcGx1Z2luXG4gICAqICAgbmFtZS5cbiAgICogLSBgZmFsc2VgOiBubyBNQ1AgZW5kcG9pbnRzLlxuICAgKiAtIHtAbGluayBNYXN0cmFNY3BDb25maWd9OiBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIgaWQsXG4gICAqICAgYWR2ZXJ0aXNlZCBtZXRhZGF0YSwgYW5kIHdoaWNoIGFnZW50cyAvIHRvb2xzIGFyZSBleHBvc2VkLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBzdG9jayBNYXN0cmEgTUNQIHJvdXRlcyBtb3VudCB1bmRlciB0aGUgcGx1Z2luJ3NcbiAgICogYmFzZSBwYXRoIChubyBiZXNwb2tlIHJvdXRlIGlzIGFkZGVkIC0gdGhlIHNlcnZlciBpcyBoYW5kZWQgdG8gdGhlXG4gICAqIGBNYXN0cmFgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHdoaWNoIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyk6XG4gICAqXG4gICAqIC0gU3RyZWFtYWJsZSBIVFRQOiBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21jcGBcbiAgICogLSBTU0UgKGxlZ2FjeSk6ICAgIGBHRVQgIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vc3NlYFxuICAgKiAgICAgICAgICAgICAgICAgICAgYFBPU1QgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9tZXNzYWdlc2BcbiAgICpcbiAgICogUmVxdWVzdHMgcnVuIHVuZGVyIHRoZSBzYW1lIEFwcEtpdCBPQk8gc2NvcGUgYXMgdGhlIGNoYXQgcm91dGVzLCBzb1xuICAgKiBhbiBhZ2VudCBpbnZva2VkIG92ZXIgTUNQIHJlc29sdmVzIGl0cyBtb2RlbCBhbmQgdG9vbHMgYXMgdGhlXG4gICAqIGNhbGxpbmcgdXNlci5cbiAgICovXG4gIG1jcD86IGJvb2xlYW4gfCBNYXN0cmFNY3BDb25maWc7XG4gIC8qKlxuICAgKiBIb3cgbXVjaCBvZiB0aGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2AgbWFuYWdlbWVudCBBUEkgaXMgcmVhY2hhYmxlXG4gICAqIHRocm91Z2ggdGhlIHBsdWdpbiBtb3VudC4gYEBtYXN0cmEvZXhwcmVzc2AgcmVnaXN0ZXJzIGl0cyBmdWxsIHJvdXRlXG4gICAqIHRhYmxlIChhZ2VudCBpbmZlcmVuY2UgcGx1cyBhZG1pbiAvIG11dGF0aW5nIHJvdXRlczogZGlyZWN0IHRvb2xcbiAgICogZXhlY3V0aW9uLCB3b3JrZmxvdyBjb250cm9sLCByYXcgbWVtb3J5IHJlYWQvd3JpdGUsIHRlbGVtZXRyeSwgbG9ncyxcbiAgICogc2NvcmVzKS4gQXBwS2l0IGFscmVhZHkgYXV0aGVudGljYXRlcyBldmVyeSByZXF1ZXN0IGFzIHRoZSBPQk8gdXNlcixcbiAgICogYnV0IG5vdGhpbmcgdGhlcmUgcmVzdHJpY3RzICp3aGljaCogb2YgdGhvc2Ugb3BlcmF0aW9ucyB0aGUgYnJvd3NlclxuICAgKiBjbGllbnQgbWF5IGludm9rZS5cbiAgICpcbiAgICogLSBgXCJzY29wZWRcImAgKGRlZmF1bHQpOiBvbmx5IHRoZSByb3V0ZXMgdGhlIGNoYXQgY2xpZW50IGxlZ2l0aW1hdGVseVxuICAgKiAgIG5lZWRzIGFyZSBkaXNwYXRjaGVkIHRvIE1hc3RyYSAtIGFnZW50IGluZmVyZW5jZVxuICAgKiAgIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICogICBwbHVnaW4ncyBvd24gT0JPLSBhbmQgcmVzb3VyY2Utc2NvcGVkIGAvcm91dGUvKmAgcm91dGVzIChoaXN0b3J5IC9cbiAgICogICB0aHJlYWRzKSwgYW5kLCB3aGVuIHtAbGluayBtY3B9IGlzIGVuYWJsZWQsIHRoZSBNQ1AgdHJhbnNwb3J0LlxuICAgKiAgIEV2ZXJ5dGhpbmcgZWxzZSAodG9vbCBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnksXG4gICAqICAgdGVsZW1ldHJ5LCBsb2dzLCBzY29yZXMsIGFuZCBvdGhlciBtdXRhdGlvbnMpIGlzIHJlamVjdGVkIHdpdGhcbiAgICogICBgNDAzYCBiZWZvcmUgaXQgcmVhY2hlcyBNYXN0cmEuXG4gICAqIC0gYFwiZnVsbFwiYDogZGlzcGF0Y2ggdGhlIGVudGlyZSBzdG9jayBNYXN0cmEgQVBJLiBVc2Ugb25seSBmb3IgYVxuICAgKiAgIHRydXN0ZWQgZmlyc3QtcGFydHkgY29uc29sZSB0aGF0IGdlbnVpbmVseSBuZWVkcyB0aGUgbWFuYWdlbWVudFxuICAgKiAgIHN1cmZhY2UuXG4gICAqL1xuICBhcGlBY2Nlc3M/OiBcInNjb3BlZFwiIHwgXCJmdWxsXCI7XG4gIC8qKlxuICAgKiBXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IHRoZSBhZ2VudHMnIHdvcmtzcGFjZSBjYWxscyBydW4gYXM6IHRoZVxuICAgKiBzZXJ2aW5nLWVuZHBvaW50IGNhdGFsb2d1ZSBiZWhpbmQgdGhlIG1vZGVsIHBpY2tlciwgR2VuaWUgc3VnZ2VzdGlvbnMsXG4gICAqIGBhc2tfZ2VuaWVgLCBhbmQgdGhlIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2ggYmVoaW5kIGEgYFtkYXRhOjxpZD5dYFxuICAgKiBlbWJlZC4gRmFsbHMgYmFjayB0byBgTUFTVFJBX0dFTklFX0lERU5USVRZYCwgdGhlbiBgXCJ1c2VyXCJgLlxuICAgKlxuICAgKiBPbi1iZWhhbGYtb2YgKE9CTykgYXV0aCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGJlIGEgbWVtYmVyIG9mIHRoZVxuICAgKiBXT1JLU1BBQ0UsIG5vdCBqdXN0IG9mIHRoZSBEYXRhYnJpY2tzIGFjY291bnQuIEFuIGFwcCBzaGFyZWQgd2l0aCBhblxuICAgKiBhY2NvdW50LWxldmVsIGdyb3VwIGNhbiBiZSBvcGVuZWQgYnkgc29tZW9uZSB3aG9zZSB0b2tlbiBpcyB2YWxpZCBidXQgd2hvc2VcbiAgICogZXZlcnkgd29ya3NwYWNlIGNhbGwgZmFpbHMgd2l0aCBgVW5hdXRob3JpemVkIGFjY2VzcyB0byBPcmc6IDxpZD5gIC0gYW5kXG4gICAqIGdyYW50aW5nIHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIG5vdCBhbHdheXMgcG9zc2libGUsIHNpbmNlIGEgd29ya3NwYWNlXG4gICAqIGNhcHMgbWVtYmVyc2hpcCB3ZWxsIGJlbG93IHRoZSBzaXplIG9mIGEgbGFyZ2UgYWNjb3VudCdzIHVzZXIgZ3JvdXAuIFRoZVxuICAgKiBhcHAncyBzZXJ2aWNlIHByaW5jaXBhbCBhbHJlYWR5IGhvbGRzIHRoZSBncmFudHMgdGhlIGFwcCB3YXMgZGVwbG95ZWQgd2l0aC5cbiAgICpcbiAgICogLSBgXCJ1c2VyXCJgIChkZWZhdWx0KTogYWx3YXlzIE9CTy4gUGVyLXVzZXIgYXR0cmlidXRpb24sIGFuZCBHZW5pZSAvIFVuaXR5XG4gICAqICAgQ2F0YWxvZyByb3cgZmlsdGVycyBhcHBseSBwZXIgdXNlci4gQ29ycmVjdCB3aGVuIGV2ZXJ5IGNhbGxlciBpcyBhXG4gICAqICAgd29ya3NwYWNlIG1lbWJlciwgYW5kIHVuY2hhbmdlZCBmcm9tIGJlZm9yZSB0aGlzIG9wdGlvbiBleGlzdGVkLlxuICAgKiAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgOiBhbHdheXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbC4gTmVlZHMgbm8gT0JPXG4gICAqICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCwgYXQgdGhlIGNvc3Qgb2ZcbiAgICogICBwZXItdXNlciBhdHRyaWJ1dGlvbiBpbiBHZW5pZSAvIFVuaXR5IENhdGFsb2cuXG4gICAqXG4gICAqIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgIGNoYW5nZXMgb25seSB0aGUgRGF0YWJyaWNrcyBDUkVERU5USUFMLiBNZW1vcnlcbiAgICogdGhyZWFkcywgdGhlIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhIHN0aWxsIGtleSBvZmYgdGhlXG4gICAqIGZvcndhcmRlZCB1c2VyLCBzbyBjYWxsZXJzIHNoYXJpbmcgdGhlIHNlcnZpY2UgcHJpbmNpcGFsJ3MgZGF0YSBhY2Nlc3Mga2VlcFxuICAgKiBzZXBhcmF0ZSBjb252ZXJzYXRpb25zIGFuZCBjYW5ub3QgcmVhZCBlYWNoIG90aGVyJ3MgdGhyZWFkcyBvciBjaGFydHMuXG4gICAqXG4gICAqIEBleGFtcGxlIEFuIGFwcCBhbnkgYWNjb3VudCB1c2VyIGNhbiBvcGVuXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7IGdlbmllSWRlbnRpdHk6IFwic2VydmljZS1wcmluY2lwYWxcIiwgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogc3BhY2VJZCB9IH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmllSWRlbnRpdHk/OiBNYXN0cmFJZGVudGl0eU1vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBicmFuZCBjb250ZXh0IGFwcGxpZWQgdG8gY2hhcnRzIHByb2R1Y2VkIGJ5IHRoZSBidWlsdC1pblxuICAgKiBgcmVuZGVyX2RhdGFgIC8gYHByZXBhcmVfY2hhcnRgIHRvb2xzLiBXaGVuIHNldCwgdGhlIGNoYXJ0IHBsYW5uZXInc1xuICAgKiBFY2hhcnRzIG91dHB1dCBpcyB0aGVtZWQgd2l0aCB0aGUgYnJhbmQncyBwYWxldHRlIChzZXJpZXMgY29sb3JzIGRlcml2ZWRcbiAgICogZnJvbSBgY29sb3JzLnByaW1hcnlgIC8gYGNvbG9ycy5hY2NlbnRgKSBhbmQgc2FucyBmb250XG4gICAqIChgdHlwb2dyYXBoeS5zYW5zYCkgaW5zdGVhZCBvZiBFY2hhcnRzJyBkZWZhdWx0cy4gT21pdCBmb3IgdGhlIGRlZmF1bHRcbiAgICogRWNoYXJ0cyBsb29rLlxuICAgKlxuICAgKiBQYXNzIHRoZSBwb3J0YWJsZSB7QGxpbmsgQnJhbmRDb250ZXh0fSBzaGFyZWQgYWNyb3NzIHRoZSBVSSBhbmRcbiAgICogbGlicmFyaWVzIChlLmcuIGBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0YCBmcm9tIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCxcbiAgICogb3IgYSBjdXN0b21lciBicmFuZCkgLSB0aGUgc2FtZSBvYmplY3QgdGhlIGVtYWlsIGFkZC1vbiBhbmQgdGhlIFVJXG4gICAqIGBCcmFuZFByb3ZpZGVyYCBjb25zdW1lLCBzbyBhIGhvc3QgdGhlbWVzIGNoYXJ0cywgZW1haWwsIGFuZCBVSSBmcm9tIG9uZVxuICAgKiBzb3VyY2UuXG4gICAqL1xuICBicmFuZD86IEJyYW5kQ29udGV4dDtcbiAgLyoqXG4gICAqIFJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIG1hdGVyaWFsaXplZCBvbmNlIGF0IGFwcCBzdGFydHVwLiBBIHNpbmdsZVxuICAgKiBzb3VyY2UsIGEgbGlzdCwgb3IgYSBgeyBzb3VyY2VzLCBmYWlsT25FcnJvcj8sIC4uLiB9YCBiYWcuXG4gICAqXG4gICAqIEVhY2ggc291cmNlIGlzIGEgR2l0SHViIGBvd25lci9yZXBvYCwgYSBnaXQgLyBHaXRMYWIgVVJMLCBvciBhIGRpcmVjdFxuICAgKiBgU0tJTEwubWRgIC8gYXJjaGl2ZSBkb3dubG9hZCBVUkwuIFJlc29sdXRpb24gcHJlZmVycyB0aGUgT1BUSU9OQUwgYHNraWxsc2BcbiAgICogbnBtIENMSSAoYSBwZWVyIGRlcCkgd2hpY2ggaXMgY29waWVkIGludG8gYSB0ZW1wIGRpciBhbmQgdGhlbiBwZXJzaXN0ZWQ7XG4gICAqIHdpdGhvdXQgaXQsIGEgVVJMIHNvdXJjZSBpcyBmZXRjaGVkIGRpcmVjdGx5LiBBIHNvdXJjZSB0aGF0IHJlc29sdmVzXG4gICAqIHRocm91Z2ggbmVpdGhlciBmYWlscyBzdGFydHVwIHVubGVzcyBgZmFpbE9uRXJyb3I6IGZhbHNlYC5cbiAgICpcbiAgICogUHJvdmlzaW9uZWQgc2tpbGxzIGFyZSB3cml0dGVuIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIncyBBc3Npc3RhbnQgc2tpbGxzXG4gICAqIGZvbGRlciAoYC9Vc2Vycy88ZW1haWw+Ly5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICAgKiB0YXJnZXQpIHNvIHRoZXkgcGVyc2lzdCBhbmQgYXJlIHBpY2tlZCB1cCBieSB0aGUgYnVpbHQtaW4gQXNzaXN0YW50LXNraWxsc1xuICAgKiBtb3VudC4gV2l0aCBubyB3cml0YWJsZSB3b3Jrc3BhY2UsIHRoZXkgZ28gdG8gYSBsb2NhbCB0ZW1wIGRpciBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoeyByZW1vdGVTa2lsbHM6IFwidmVyY2VsLWxhYnMvYWdlbnQtc2tpbGxzXCIgfSk7XG4gICAqIG1hc3RyYSh7XG4gICAqICAgcmVtb3RlU2tpbGxzOiB7XG4gICAqICAgICBzb3VyY2VzOiBbXCJ2ZXJjZWwtbGFicy9hZ2VudC1za2lsbHNcIiwgXCJodHRwczovL2V4YW1wbGUuY29tL3NraWxsLm1kXCJdLFxuICAgKiAgICAgZmFpbE9uRXJyb3I6IGZhbHNlLFxuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW90ZVNraWxscz86IFJlbW90ZVNraWxsc09wdGlvbjtcblxuICAvKipcbiAgICogRm9sZCBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxscyAoYGRhdGFicmlja3MgYWl0b29sc2ApIGludG8gZXZlcnlcbiAgICogZGVmYXVsdC13b3Jrc3BhY2UgYWdlbnQgYXMgZXh0cmEgbG9jYWwgc2tpbGwgc2NhbiBwYXRocy5cbiAgICpcbiAgICogYGZhbHNlYCAoZGVmYXVsdCkgb2ZmOyBgXCJhdXRvXCJgIHJ1bnMgdGhlIGBkYXRhYnJpY2tzYCBDTEkgd2hlbiBpdCdzXG4gICAqIGluc3RhbGxlZCBhbmQgbG9ncy1hbmQtY29udGludWVzIHdoZW4gaXQgaXNuJ3QgKG5ldmVyIGZhaWxzIHN0YXJ0dXApO1xuICAgKiBgdHJ1ZWAgcmVxdWlyZXMgdGhlIENMSSBhbmQgZmFpbHMgc3RhcnR1cCBvdGhlcndpc2UuIFBhc3MgYW4gb3B0aW9ucyBiYWcgdG9cbiAgICogc2VsZWN0IGBza2lsbHNgLCBpbmNsdWRlIGBleHBlcmltZW50YWxgIHNraWxscywgb3Igc2V0IGFuIGV4cGxpY2l0IGBwYXRoYC5cbiAgICpcbiAgICogUnVucyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGwgLS1wYXRoIDxkaXI+YCB0byBtYXRlcmlhbGl6ZSBhIHJlc29sdmVkLFxuICAgKiBhZ2VudC1hZ25vc3RpYyBzZXQgKGA8bmFtZT4vU0tJTEwubWRgIHRyZWVzKSBpbnRvIGEgdGVtcCBkaXIgdGhlIGFnZW50c1xuICAgKiB0aGVuIHNjYW4uIFRoZSBDTEkgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZGF0YWJyaWNrc0FJVG9vbHM6IFwiYXV0b1wiIH0pO1xuICAgKiBtYXN0cmEoeyBkYXRhYnJpY2tzQUlUb29sczogeyBza2lsbHM6IFtcImRhdGFicmlja3MtY29yZVwiLCBcImRhdGFicmlja3Mtam9ic1wiXSB9IH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGRhdGFicmlja3NBSVRvb2xzPzogRGF0YWJyaWNrc0FJVG9vbHNPcHRpb247XG59XG5cbi8qKlxuICogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYCwgbWlycm9yaW5nIHRoZVxuICogZG9jdW1lbnRlZCBkZWZhdWx0cyBhbmQgZW52aXJvbm1lbnQgZmFsbGJhY2tzIG9mIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWd9LlxuICpcbiAqIENvdmVycyB0aGUgSlNPTi1leHByZXNzaWJsZSBvcHRpb25zIG9ubHkuIGBhZ2VudHNgLCBgdG9vbHNgLCBhbmQgYVxuICogYGRlZmF1bHRNb2RlbGAgcGFzc2VkIGFzIGEgTWFzdHJhIGBEeW5hbWljQXJndW1lbnRgIGFyZSBjb2RlLWRlZmluZWRcbiAqIChmdW5jdGlvbnMgLyBjbGFzcyBpbnN0YW5jZXMpLCBzbyB0aGV5IGNhcnJ5IG5vIHNjaGVtYSBlbnRyeTsgdGhlXG4gKiBgZGVmYXVsdE1vZGVsYCBwcm9wZXJ0eSBiZWxvdyBkZXNjcmliZXMgaXRzIHN0cmluZyBmb3JtLlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX0NPTkZJR19TQ0hFTUE6IENvbmZpZ1NjaGVtYSA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgcHJvcGVydGllczoge1xuICAgIHByb3ZpZGVySWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hc3RyYSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBpZC4gRGVmYXVsdHMgdG8gXCJkYXRhYnJpY2tzXCIuJyxcbiAgICB9LFxuICAgIHJlbW90ZVNraWxsczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYXJyYXlcIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJSZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBwcm92aXNpb25lZCBhdCBzdGFydHVwIChHaXRIdWIgb3duZXIvcmVwbywgZ2l0L0dpdExhYiBVUkwsIG9yIGEgZGlyZWN0IFNLSUxMLm1kL2FyY2hpdmUgVVJMKS4gUHJlZmVycyB0aGUgb3B0aW9uYWwgYHNraWxsc2AgbnBtIENMSSwgZWxzZSBhIGRpcmVjdCBmZXRjaDsgZmFpbHMgc3RhcnR1cCBvbiBlcnJvciB1bmxlc3MgZmFpbE9uRXJyb3I6ZmFsc2UuIFdyaXR0ZW4gdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzIGZvbGRlciwgb3IgYSBsb2NhbCB0ZW1wIGRpciB3aGVuIG5vIHdvcmtzcGFjZSBpcyB3cml0YWJsZS5cIixcbiAgICB9LFxuICAgIGRhdGFicmlja3NBSVRvb2xzOiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwic3RyaW5nXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdGb2xkIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzIChkYXRhYnJpY2tzIGFpdG9vbHMpIGludG8gYWdlbnRzIGFzIGV4dHJhIGxvY2FsIHNraWxsIHBhdGhzLiBmYWxzZSAoZGVmYXVsdCkgb2ZmOyBcImF1dG9cIiBydW5zIHRoZSBkYXRhYnJpY2tzIENMSSB3aGVuIGluc3RhbGxlZCBhbmQgbG9ncy1hbmQtY29udGludWVzIG90aGVyd2lzZTsgdHJ1ZSByZXF1aXJlcyB0aGUgQ0xJIGFuZCBmYWlscyBzdGFydHVwIG90aGVyd2lzZS4gQW4gb2JqZWN0IHNlbGVjdHMgc2tpbGxzLCBleHBlcmltZW50YWwsIG9yIHBhdGguJyxcbiAgICB9LFxuICAgIHN0b3JhZ2U6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcyAvIG1lc3NhZ2VzLiBgdHJ1ZWAgcmV1c2VzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbidzIHBvb2wsIGFuIG9iamVjdCBvcGVucyBhIGRlZGljYXRlZCBzdG9yZS4gQXV0by1lbmFibGVkIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuXCIsXG4gICAgfSxcbiAgICBtZW1vcnk6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQZ1ZlY3RvciBzdG9yZSBmb3IgTWFzdHJhIHNlbWFudGljIHJlY2FsbC4gYHRydWVgIHJldXNlcyB0aGUgYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sLCBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuIEF1dG8tZW5hYmxlZCB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLlwiLFxuICAgIH0sXG4gICAgZGVmYXVsdEFnZW50OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQWdlbnQgaWQgdXNlZCB3aGVuIHRoZSBjbGllbnQgbmFtZXMgbm9uZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYWdlbnQsIGVsc2UgdGhlIGJ1aWx0LWluIGBkZWZhdWx0YC5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRNb2RlbDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlNlcnZpbmcgZW5kcG9pbnQgYXBwbGllZCB0byBldmVyeSBhZ2VudCB0aGF0IG9taXRzIGl0cyBvd24gbW9kZWwuIEZhbGxzIGJhY2sgdG8gREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUUsIHRoZW4gdGhlIGF1dG8tcmVzb2x2ZWQgY2F0YWxvZ3VlLlwiLFxuICAgIH0sXG4gICAgZGVmYXVsdE1vZGVsRmFsbGJhY2tzOiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQcmlvcml0eS1vcmRlcmVkIGVuZHBvaW50IG5hbWVzIHRyaWVkIGJlZm9yZSB0aGUgc2NvcmUtY2xhc3NpZmllZCBjYXRhbG9ndWUgd2hlbiBub3RoaW5nIGVsc2UgcGlucyBhIG1vZGVsLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eU1hdGNoOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1enp5LW1hdGNoIGxvb3NlIG1vZGVsIG5hbWVzIGFnYWluc3QgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBtb2RlbEZ1enp5VGhyZXNob2xkOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgZm9yIHRoZSBmdXp6eSBtYXRjaGVyLCAwIChleGFjdCkgdG8gMSAoYW55dGhpbmcpLiBEZWZhdWx0cyB0byAwLjQuXCIsXG4gICAgfSxcbiAgICBtb2RlbENhY2hlVHRsTXM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJUVEwgaW4gbXMgZm9yIHRoZSBzZXJ2aW5nLWVuZHBvaW50cyBsaXN0IGNhY2hlLCBwZXIgd29ya3NwYWNlIGhvc3QuIERlZmF1bHRzIHRvIDUgbWludXRlcy5cIixcbiAgICB9LFxuICAgIG1vZGVsT3ZlcnJpZGU6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiSG9ub3IgYSBwZXItcmVxdWVzdCBtb2RlbCBvdmVycmlkZSBmcm9tIHRoZSBYLU1hc3RyYS1Nb2RlbCBoZWFkZXIsID9tb2RlbD0gcXVlcnksIG9yIGEgYG1vZGVsYCBib2R5IGZpZWxkLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgZ2VuaWVTcGFjZXM6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogeyB0eXBlOiBbXCJzdHJpbmdcIiwgXCJvYmplY3RcIl0gfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkdlbmllIHNwYWNlcyB0aGUgYWdlbnRzIGNhbiBkZWxlZ2F0ZSB0bywga2V5ZWQgYnkgYWxpYXMgKHRoZSB0b29sLW5hbWUgc3VmZml4KS4gRWFjaCB2YWx1ZSBpcyBhIHNwYWNlIGlkIG9yIGB7IHNwYWNlSWQsIGhpbnQgfWAuIEZhbGxzIGJhY2sgdG8gdGhlIGBnZW5pZWAgcGx1Z2luJ3Mgb3duIGBzcGFjZXNgIGNvbmZpZywgdGhlbiBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEIHVuZGVyIHRoZSBgZGVmYXVsdGAgYWxpYXMuXCIsXG4gICAgfSxcbiAgICBnZW5pZVNwYWNlQ2FjaGVUdGxNczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRUTCBpbiBtcyBmb3IgdGhlIEdlbmllIHNwYWNlIG1ldGFkYXRhIGNhY2hlLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXCIsXG4gICAgfSxcbiAgICBhZ2VudE1heFN0ZXBzOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuIChhIHRvb2wgY2FsbCBhbmQgdGhlIGZpbmFsIHJlcGx5IGVhY2ggY29uc3VtZSBvbmUpLiBEZWZhdWx0cyB0byAyNS5cIixcbiAgICB9LFxuICAgIHN0cmlwU3RhbGVDaGFydHM6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU3RyaXAgY2hhcnRJZHMgZnJvbSByZWNhbGxlZCBhc3Npc3RhbnQgdG9vbCByZXN1bHRzIHNvIHRoZSBtb2RlbCBjYW5ub3QgcmV1c2UgYSB0dXJuLXNjb3BlZCBjaGFydCBtYXJrZXIuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBzdHlsZUluc3RydWN0aW9uczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYm9vbGVhblwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlN0eWxlIGd1YXJkcmFpbHMgYXBwZW5kZWQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuIEEgc3RyaW5nIHJlcGxhY2VzIHRoZSBidWlsdC1pbiBibG9jaywgYGZhbHNlYCBkaXNhYmxlcyBpdC5cIixcbiAgICB9LFxuICAgIG9ic2VydmFiaWxpdHk6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQnJpZGdlIE1hc3RyYSBzcGFucyBpbnRvIEFwcEtpdCdzIE9UZWwgcGlwZWxpbmUuIERlZmF1bHRzIHRvIG9uIG9ubHkgd2hlbiBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQgb3IgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVCBpcyBzZXQuXCIsXG4gICAgfSxcbiAgICBmZWVkYmFjazoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJMb2cgdGh1bWJzIC8gY29tbWVudCBhc3Nlc3NtZW50cyB0byBNTGZsb3cgYW5kIHN1cmZhY2UgdGhlIGZlZWRiYWNrIGNvbnRyb2xzLiBEZWZhdWx0cyB0byBvbiBvbmx5IHdoZW4gYW4gT1RMUCBlbmRwb2ludCBhbmQgTUxGTE9XX0VYUEVSSU1FTlRfSUQgb3IgTUxGTE9XX0VYUEVSSU1FTlRfTkFNRSBhcmUgc2V0LlwiLFxuICAgIH0sXG4gICAgbWNwOiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRXhwb3NlIHRoZSByZWdpc3RlcmVkIGFnZW50cyBvdmVyIE1DUC4gRGVmYXVsdHMgdG8gYWdlbnRzLW9ubHk7IGFuIG9iamVjdCB0dW5lcyB0aGUgc2VydmVyIGlkLCBhZHZlcnRpc2VkIG1ldGFkYXRhLCBhbmQgd2hldGhlciBhbWJpZW50IHRvb2xzIGFyZSBleHBvc2VkLlwiLFxuICAgIH0sXG4gICAgZ2VuaWVJZGVudGl0eToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IFtcInVzZXJcIiwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnV2hpY2ggRGF0YWJyaWNrcyBpZGVudGl0eSB0aGUgYWdlbnRzXFwnIHdvcmtzcGFjZSBjYWxscyAoc2VydmluZyBjYXRhbG9ndWUsIEdlbmllLCBzdGF0ZW1lbnQgZXhlY3V0aW9uKSBydW4gYXMuIFwidXNlclwiIChkZWZhdWx0KSBpcyBhbHdheXMgT0JPLCBzbyBjYWxsZXJzIG11c3QgYmUgd29ya3NwYWNlIG1lbWJlcnM7IFwic2VydmljZS1wcmluY2lwYWxcIiBhbHdheXMgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLCBzbyBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwIHdvcmtzLCBhdCB0aGUgY29zdCBvZiBwZXItdXNlciBhdHRyaWJ1dGlvbi4gRmFsbHMgYmFjayB0byBNQVNUUkFfR0VOSUVfSURFTlRJVFkuJyxcbiAgICB9LFxuICAgIGFwaUFjY2Vzczoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IFtcInNjb3BlZFwiLCBcImZ1bGxcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0hvdyBtdWNoIG9mIHRoZSBzdG9jayBAbWFzdHJhL2V4cHJlc3MgQVBJIGlzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtb3VudC4gXCJzY29wZWRcIiAoZGVmYXVsdCkgYWxsb3dzIGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGlzIHBsdWdpblxcJ3Mgb3duIHJvdXRlcywgYW5kIE1DUDsgXCJmdWxsXCIgZGlzcGF0Y2hlcyB0aGUgZW50aXJlIG1hbmFnZW1lbnQgc3VyZmFjZS4nLFxuICAgIH0sXG4gICAgYnJhbmQ6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQb3J0YWJsZSBicmFuZCBjb250ZXh0IGFwcGxpZWQgdG8gZ2VuZXJhdGVkIGNoYXJ0cyAoc2VyaWVzIHBhbGV0dGUgZnJvbSBjb2xvcnMucHJpbWFyeSAvIGNvbG9ycy5hY2NlbnQsIGJhc2UgZm9udCBmcm9tIHR5cG9ncmFwaHkuc2FucykuXCIsXG4gICAgfSxcbiAgfSxcbn07XG4iXX0=
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup provisioning of Databricks AI Tools skills for a Mastra workspace.
|
|
3
|
+
*
|
|
4
|
+
* Databricks AI Tools (`databricks aitools`) are Databricks-owned Agent-Skill
|
|
5
|
+
* (`SKILL.md`) trees installed and kept up to date through the Databricks CLI.
|
|
6
|
+
* {@link provisionDatabricksAITools} shells out to the CLI
|
|
7
|
+
* (`databricks aitools install --path <dir>`) to materialize a resolved,
|
|
8
|
+
* agent-agnostic skill set into a directory, then hands it to Mastra as an
|
|
9
|
+
* extra LOCAL skill scan path - so an agent gets first-class Databricks skills
|
|
10
|
+
* without anyone hand-copying `SKILL.md` files. It never reimplements the CLI's
|
|
11
|
+
* sourcing; the CLI is the source of truth.
|
|
12
|
+
*
|
|
13
|
+
* The option is `false | true | "auto" | DatabricksAIToolsOptions`:
|
|
14
|
+
*
|
|
15
|
+
* - `false` (default) - off.
|
|
16
|
+
* - `"auto"` - run the CLI when it's installed; if the `databricks` CLI isn't
|
|
17
|
+
* available, log and move on (never fails startup). The "on if the CLI is
|
|
18
|
+
* around" default.
|
|
19
|
+
* - `true` (`"require"`) - require the CLI: fail startup (subject to
|
|
20
|
+
* `failOnError`) when it isn't available or produces nothing.
|
|
21
|
+
* - an options bag for a specific `skills` subset, `experimental` skills, an
|
|
22
|
+
* explicit output `path`, or a custom `cli` path.
|
|
23
|
+
*
|
|
24
|
+
* @module
|
|
25
|
+
*/
|
|
26
|
+
/** How aggressively to enable Databricks AI Tools skills. */
|
|
27
|
+
export type DatabricksAIToolsMode = "auto" | "require";
|
|
28
|
+
/** Options for {@link provisionDatabricksAITools}. */
|
|
29
|
+
export interface DatabricksAIToolsOptions {
|
|
30
|
+
/**
|
|
31
|
+
* `"auto"` (default) runs the CLI when installed and logs-and-continues when
|
|
32
|
+
* it isn't; `"require"` fails startup when the CLI can't supply skills.
|
|
33
|
+
*/
|
|
34
|
+
mode?: DatabricksAIToolsMode;
|
|
35
|
+
/** Install only these skill names (comma/space list or array). */
|
|
36
|
+
skills?: string | string[];
|
|
37
|
+
/** Include experimental skills when the CLI has to fetch. */
|
|
38
|
+
experimental?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Explicit directory to materialize skills into with the CLI. Defaults to a
|
|
41
|
+
* fresh {@link localFS.tmpFS} root.
|
|
42
|
+
*/
|
|
43
|
+
path?: string;
|
|
44
|
+
/** Absolute path to the `databricks` CLI. Defaults to `databricks` on PATH. */
|
|
45
|
+
cli?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Fail app startup when required skills can't be provisioned. Defaults to
|
|
48
|
+
* `true` for `mode: "require"` and `false` for `"auto"`.
|
|
49
|
+
*/
|
|
50
|
+
failOnError?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/** The `databricksAITools` config option: a toggle, `"auto"`, or an options bag. */
|
|
53
|
+
export type DatabricksAIToolsOption = boolean | "auto" | DatabricksAIToolsOptions;
|
|
54
|
+
/** What {@link provisionDatabricksAITools} resolved. */
|
|
55
|
+
export interface ProvisionedDatabricksAITools {
|
|
56
|
+
/** Extra LOCAL skill scan paths to hand Mastra. Empty when disabled/unresolved. */
|
|
57
|
+
localSkillPaths: string[];
|
|
58
|
+
/** How the skills were sourced, for logging. */
|
|
59
|
+
source?: "cli";
|
|
60
|
+
}
|
|
61
|
+
/** Normalize the `databricksAITools` option into a flat options bag, or `undefined` when off. */
|
|
62
|
+
export declare function normalizeDatabricksAIToolsOption(option: DatabricksAIToolsOption | undefined): DatabricksAIToolsOptions | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Materialize Databricks AI Tools skills at app startup and return them as
|
|
65
|
+
* extra local skill scan paths.
|
|
66
|
+
*
|
|
67
|
+
* Resolution: reuse the installed global tree when present (no CLI call) unless
|
|
68
|
+
* `refresh`/`skills`/`path` ask for a fresh CLI materialization; otherwise run
|
|
69
|
+
* `databricks aitools install --path <dir> --skills-only` when the CLI resolves.
|
|
70
|
+
* A `"require"` provision that yields nothing fails startup unless
|
|
71
|
+
* `failOnError: false`.
|
|
72
|
+
*/
|
|
73
|
+
export declare function provisionDatabricksAITools(option: DatabricksAIToolsOption | undefined): Promise<ProvisionedDatabricksAITools>;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup provisioning of Databricks AI Tools skills for a Mastra workspace.
|
|
3
|
+
*
|
|
4
|
+
* Databricks AI Tools (`databricks aitools`) are Databricks-owned Agent-Skill
|
|
5
|
+
* (`SKILL.md`) trees installed and kept up to date through the Databricks CLI.
|
|
6
|
+
* {@link provisionDatabricksAITools} shells out to the CLI
|
|
7
|
+
* (`databricks aitools install --path <dir>`) to materialize a resolved,
|
|
8
|
+
* agent-agnostic skill set into a directory, then hands it to Mastra as an
|
|
9
|
+
* extra LOCAL skill scan path - so an agent gets first-class Databricks skills
|
|
10
|
+
* without anyone hand-copying `SKILL.md` files. It never reimplements the CLI's
|
|
11
|
+
* sourcing; the CLI is the source of truth.
|
|
12
|
+
*
|
|
13
|
+
* The option is `false | true | "auto" | DatabricksAIToolsOptions`:
|
|
14
|
+
*
|
|
15
|
+
* - `false` (default) - off.
|
|
16
|
+
* - `"auto"` - run the CLI when it's installed; if the `databricks` CLI isn't
|
|
17
|
+
* available, log and move on (never fails startup). The "on if the CLI is
|
|
18
|
+
* around" default.
|
|
19
|
+
* - `true` (`"require"`) - require the CLI: fail startup (subject to
|
|
20
|
+
* `failOnError`) when it isn't available or produces nothing.
|
|
21
|
+
* - an options bag for a specific `skills` subset, `experimental` skills, an
|
|
22
|
+
* explicit output `path`, or a custom `cli` path.
|
|
23
|
+
*
|
|
24
|
+
* @module
|
|
25
|
+
*/
|
|
26
|
+
import { existsSync } from "node:fs";
|
|
27
|
+
import { exec } from "@dbx-tools/core";
|
|
28
|
+
import { localFS } from "@dbx-tools/fs";
|
|
29
|
+
import { error, log, string } from "@dbx-tools/shared-core";
|
|
30
|
+
const logger = log.logger("mastra/databricks-aitools");
|
|
31
|
+
/** The Databricks CLI binary name; resolved on `PATH`. */
|
|
32
|
+
const DATABRICKS_CLI = "databricks";
|
|
33
|
+
/** Stable temp directory the CLI's skill tree is rebuilt into each boot. */
|
|
34
|
+
const SKILLS_CACHE_DIR = "databricks-aitools";
|
|
35
|
+
/* ------------------------------- helpers ------------------------------- */
|
|
36
|
+
/** Normalize the `databricksAITools` option into a flat options bag, or `undefined` when off. */
|
|
37
|
+
export function normalizeDatabricksAIToolsOption(option) {
|
|
38
|
+
if (option === undefined || option === false)
|
|
39
|
+
return undefined;
|
|
40
|
+
if (option === true)
|
|
41
|
+
return { mode: "require" };
|
|
42
|
+
if (option === "auto")
|
|
43
|
+
return { mode: "auto" };
|
|
44
|
+
return { mode: option.mode ?? "auto", ...option };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Materialize Databricks AI Tools skills at app startup and return them as
|
|
48
|
+
* extra local skill scan paths.
|
|
49
|
+
*
|
|
50
|
+
* Resolution: reuse the installed global tree when present (no CLI call) unless
|
|
51
|
+
* `refresh`/`skills`/`path` ask for a fresh CLI materialization; otherwise run
|
|
52
|
+
* `databricks aitools install --path <dir> --skills-only` when the CLI resolves.
|
|
53
|
+
* A `"require"` provision that yields nothing fails startup unless
|
|
54
|
+
* `failOnError: false`.
|
|
55
|
+
*/
|
|
56
|
+
export async function provisionDatabricksAITools(option) {
|
|
57
|
+
const options = normalizeDatabricksAIToolsOption(option);
|
|
58
|
+
const empty = { localSkillPaths: [] };
|
|
59
|
+
if (!options)
|
|
60
|
+
return empty;
|
|
61
|
+
const mode = options.mode ?? "auto";
|
|
62
|
+
const failOnError = options.failOnError ?? mode === "require";
|
|
63
|
+
try {
|
|
64
|
+
// The `databricks` CLI is the source of truth. When it's resolvable, run
|
|
65
|
+
// `databricks aitools install --path <dir>` to materialize a fresh,
|
|
66
|
+
// agent-agnostic skill set into a dir Mastra can scan.
|
|
67
|
+
const cliPath = await resolveCli(options.cli);
|
|
68
|
+
if (cliPath) {
|
|
69
|
+
const dir = await materializeViaCli(cliPath, options);
|
|
70
|
+
if (dir)
|
|
71
|
+
return { localSkillPaths: [dir], source: "cli" };
|
|
72
|
+
}
|
|
73
|
+
// CLI not installed (or produced nothing). "auto" logs and moves on;
|
|
74
|
+
// "require" fails startup unless `failOnError: false`.
|
|
75
|
+
if (failOnError) {
|
|
76
|
+
throw new Error(`Databricks AI Tools required but the "${DATABRICKS_CLI}" CLI is not available. Install the Databricks CLI (\`databricks aitools install\`), or set databricksAITools: "auto".`);
|
|
77
|
+
}
|
|
78
|
+
logger.info("databricks CLI not available; skipping AI Tools skills");
|
|
79
|
+
return empty;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (failOnError) {
|
|
83
|
+
throw new Error(`failed to provision Databricks AI Tools skills: ${error.errorMessage(err)}`, { cause: error.toError(err) });
|
|
84
|
+
}
|
|
85
|
+
logger.warn("skipped", { error: error.errorMessage(err) });
|
|
86
|
+
return empty;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** Resolve the `databricks` CLI, returning its invocation path or `undefined`. */
|
|
90
|
+
async function resolveCli(cli) {
|
|
91
|
+
const command = string.trimToNull(cli) ?? DATABRICKS_CLI;
|
|
92
|
+
try {
|
|
93
|
+
const result = await exec.spawn(command, ["aitools", "version"], {
|
|
94
|
+
stdout: "capture",
|
|
95
|
+
stderr: "capture",
|
|
96
|
+
check: false,
|
|
97
|
+
});
|
|
98
|
+
if (result.exitCode === 0)
|
|
99
|
+
return command;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// CLI absent or `aitools` unsupported - caller falls back / fails.
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run `databricks aitools install --path <dir>` to materialize a resolved,
|
|
108
|
+
* agent-agnostic skill set into a directory (writes `<name>/SKILL.md` trees,
|
|
109
|
+
* no agents, no state) Mastra can then scan.
|
|
110
|
+
*/
|
|
111
|
+
async function materializeViaCli(cli, options) {
|
|
112
|
+
const explicit = string.trimToNull(options.path);
|
|
113
|
+
let dir;
|
|
114
|
+
if (explicit) {
|
|
115
|
+
// An explicit path is the caller's to own - install straight into it.
|
|
116
|
+
await installSkills(cli, options, explicit);
|
|
117
|
+
dir = explicit;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// The resolved skill set is the same on almost every boot, so rebuild ONE
|
|
121
|
+
// stable temp tree rather than leaving a fresh scratch dir behind each
|
|
122
|
+
// time. The CLI writes into a throwaway root that only replaces the stable
|
|
123
|
+
// one on success, so a failed install keeps the previous skills usable.
|
|
124
|
+
const stable = await localFS.rebuildFS(SKILLS_CACHE_DIR, (scratch) => installSkills(cli, options, scratch.root));
|
|
125
|
+
dir = stable.root;
|
|
126
|
+
}
|
|
127
|
+
if (!existsSync(dir))
|
|
128
|
+
return undefined;
|
|
129
|
+
logger.debug("materialized aitools skills via CLI", {
|
|
130
|
+
path: dir,
|
|
131
|
+
skills: string.parseList(options.skills),
|
|
132
|
+
});
|
|
133
|
+
return dir;
|
|
134
|
+
}
|
|
135
|
+
/** Run `databricks aitools install --path <dir>`, failing loudly on a non-zero exit. */
|
|
136
|
+
async function installSkills(cli, options, dir) {
|
|
137
|
+
const args = ["aitools", "install", "--path", dir];
|
|
138
|
+
const skills = string.parseList(options.skills);
|
|
139
|
+
if (skills.length > 0)
|
|
140
|
+
args.push("--skills", skills.join(","));
|
|
141
|
+
if (options.experimental)
|
|
142
|
+
args.push("--experimental");
|
|
143
|
+
const result = await exec.spawn(cli, args, {
|
|
144
|
+
stdout: "capture",
|
|
145
|
+
stderr: "capture",
|
|
146
|
+
check: false,
|
|
147
|
+
});
|
|
148
|
+
if (result.exitCode !== 0) {
|
|
149
|
+
throw new Error(`databricks aitools install failed (exit ${result.exitCode}): ${result.stderr || result.stdout}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1haXRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFicmlja3MtYWl0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFFdkQsMERBQTBEO0FBQzFELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQyw0RUFBNEU7QUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQztBQTJDOUMsNkVBQTZFO0FBRTdFLGlHQUFpRztBQUNqRyxNQUFNLFVBQVUsZ0NBQWdDLENBQzlDLE1BQTJDO0lBRTNDLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9ELElBQUksTUFBTSxLQUFLLElBQUk7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2hELElBQUksTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FD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ekMsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFLFNBQVM7UUFDakIsS0FBSyxFQUFFLEtBQUs7S0FDYixDQUFDLENBQUM7SUFDSCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyQ0FBMkMsTUFBTSxDQUFDLFFBQVEsTUFBTSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDakcsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFydHVwIHByb3Zpc2lvbmluZyBvZiBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxscyBmb3IgYSBNYXN0cmEgd29ya3NwYWNlLlxuICpcbiAqIERhdGFicmlja3MgQUkgVG9vbHMgKGBkYXRhYnJpY2tzIGFpdG9vbHNgKSBhcmUgRGF0YWJyaWNrcy1vd25lZCBBZ2VudC1Ta2lsbFxuICogKGBTS0lMTC5tZGApIHRyZWVzIGluc3RhbGxlZCBhbmQga2VwdCB1cCB0byBkYXRlIHRocm91Z2ggdGhlIERhdGFicmlja3MgQ0xJLlxuICoge0BsaW5rIHByb3Zpc2lvbkRhdGFicmlja3NBSVRvb2xzfSBzaGVsbHMgb3V0IHRvIHRoZSBDTElcbiAqIChgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGwgLS1wYXRoIDxkaXI+YCkgdG8gbWF0ZXJpYWxpemUgYSByZXNvbHZlZCxcbiAqIGFnZW50LWFnbm9zdGljIHNraWxsIHNldCBpbnRvIGEgZGlyZWN0b3J5LCB0aGVuIGhhbmRzIGl0IHRvIE1hc3RyYSBhcyBhblxuICogZXh0cmEgTE9DQUwgc2tpbGwgc2NhbiBwYXRoIC0gc28gYW4gYWdlbnQgZ2V0cyBmaXJzdC1jbGFzcyBEYXRhYnJpY2tzIHNraWxsc1xuICogd2l0aG91dCBhbnlvbmUgaGFuZC1jb3B5aW5nIGBTS0lMTC5tZGAgZmlsZXMuIEl0IG5ldmVyIHJlaW1wbGVtZW50cyB0aGUgQ0xJJ3NcbiAqIHNvdXJjaW5nOyB0aGUgQ0xJIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGguXG4gKlxuICogVGhlIG9wdGlvbiBpcyBgZmFsc2UgfCB0cnVlIHwgXCJhdXRvXCIgfCBEYXRhYnJpY2tzQUlUb29sc09wdGlvbnNgOlxuICpcbiAqIC0gYGZhbHNlYCAoZGVmYXVsdCkgLSBvZmYuXG4gKiAtIGBcImF1dG9cImAgLSBydW4gdGhlIENMSSB3aGVuIGl0J3MgaW5zdGFsbGVkOyBpZiB0aGUgYGRhdGFicmlja3NgIENMSSBpc24ndFxuICogICBhdmFpbGFibGUsIGxvZyBhbmQgbW92ZSBvbiAobmV2ZXIgZmFpbHMgc3RhcnR1cCkuIFRoZSBcIm9uIGlmIHRoZSBDTEkgaXNcbiAqICAgYXJvdW5kXCIgZGVmYXVsdC5cbiAqIC0gYHRydWVgIChgXCJyZXF1aXJlXCJgKSAtIHJlcXVpcmUgdGhlIENMSTogZmFpbCBzdGFydHVwIChzdWJqZWN0IHRvXG4gKiAgIGBmYWlsT25FcnJvcmApIHdoZW4gaXQgaXNuJ3QgYXZhaWxhYmxlIG9yIHByb2R1Y2VzIG5vdGhpbmcuXG4gKiAtIGFuIG9wdGlvbnMgYmFnIGZvciBhIHNwZWNpZmljIGBza2lsbHNgIHN1YnNldCwgYGV4cGVyaW1lbnRhbGAgc2tpbGxzLCBhblxuICogICBleHBsaWNpdCBvdXRwdXQgYHBhdGhgLCBvciBhIGN1c3RvbSBgY2xpYCBwYXRoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBsb2NhbEZTIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGVycm9yLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvZGF0YWJyaWNrcy1haXRvb2xzXCIpO1xuXG4vKiogVGhlIERhdGFicmlja3MgQ0xJIGJpbmFyeSBuYW1lOyByZXNvbHZlZCBvbiBgUEFUSGAuICovXG5jb25zdCBEQVRBQlJJQ0tTX0NMSSA9IFwiZGF0YWJyaWNrc1wiO1xuXG4vKiogU3RhYmxlIHRlbXAgZGlyZWN0b3J5IHRoZSBDTEkncyBza2lsbCB0cmVlIGlzIHJlYnVpbHQgaW50byBlYWNoIGJvb3QuICovXG5jb25zdCBTS0lMTFNfQ0FDSEVfRElSID0gXCJkYXRhYnJpY2tzLWFpdG9vbHNcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIEhvdyBhZ2dyZXNzaXZlbHkgdG8gZW5hYmxlIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzLiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc0FJVG9vbHNNb2RlID0gXCJhdXRvXCIgfCBcInJlcXVpcmVcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBwcm92aXNpb25EYXRhYnJpY2tzQUlUb29sc30uICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NBSVRvb2xzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBgXCJhdXRvXCJgIChkZWZhdWx0KSBydW5zIHRoZSBDTEkgd2hlbiBpbnN0YWxsZWQgYW5kIGxvZ3MtYW5kLWNvbnRpbnVlcyB3aGVuXG4gICAqIGl0IGlzbid0OyBgXCJyZXF1aXJlXCJgIGZhaWxzIHN0YXJ0dXAgd2hlbiB0aGUgQ0xJIGNhbid0IHN1cHBseSBza2lsbHMuXG4gICAqL1xuICBtb2RlPzogRGF0YWJyaWNrc0FJVG9vbHNNb2RlO1xuICAvKiogSW5zdGFsbCBvbmx5IHRoZXNlIHNraWxsIG5hbWVzIChjb21tYS9zcGFjZSBsaXN0IG9yIGFycmF5KS4gKi9cbiAgc2tpbGxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBJbmNsdWRlIGV4cGVyaW1lbnRhbCBza2lsbHMgd2hlbiB0aGUgQ0xJIGhhcyB0byBmZXRjaC4gKi9cbiAgZXhwZXJpbWVudGFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEV4cGxpY2l0IGRpcmVjdG9yeSB0byBtYXRlcmlhbGl6ZSBza2lsbHMgaW50byB3aXRoIHRoZSBDTEkuIERlZmF1bHRzIHRvIGFcbiAgICogZnJlc2gge0BsaW5rIGxvY2FsRlMudG1wRlN9IHJvb3QuXG4gICAqL1xuICBwYXRoPzogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgYGRhdGFicmlja3NgIENMSS4gRGVmYXVsdHMgdG8gYGRhdGFicmlja3NgIG9uIFBBVEguICovXG4gIGNsaT86IHN0cmluZztcbiAgLyoqXG4gICAqIEZhaWwgYXBwIHN0YXJ0dXAgd2hlbiByZXF1aXJlZCBza2lsbHMgY2FuJ3QgYmUgcHJvdmlzaW9uZWQuIERlZmF1bHRzIHRvXG4gICAqIGB0cnVlYCBmb3IgYG1vZGU6IFwicmVxdWlyZVwiYCBhbmQgYGZhbHNlYCBmb3IgYFwiYXV0b1wiYC5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqIFRoZSBgZGF0YWJyaWNrc0FJVG9vbHNgIGNvbmZpZyBvcHRpb246IGEgdG9nZ2xlLCBgXCJhdXRvXCJgLCBvciBhbiBvcHRpb25zIGJhZy4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NBSVRvb2xzT3B0aW9uID0gYm9vbGVhbiB8IFwiYXV0b1wiIHwgRGF0YWJyaWNrc0FJVG9vbHNPcHRpb25zO1xuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uRGF0YWJyaWNrc0FJVG9vbHN9IHJlc29sdmVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25lZERhdGFicmlja3NBSVRvb2xzIHtcbiAgLyoqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgdG8gaGFuZCBNYXN0cmEuIEVtcHR5IHdoZW4gZGlzYWJsZWQvdW5yZXNvbHZlZC4gKi9cbiAgbG9jYWxTa2lsbFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEhvdyB0aGUgc2tpbGxzIHdlcmUgc291cmNlZCwgZm9yIGxvZ2dpbmcuICovXG4gIHNvdXJjZT86IFwiY2xpXCI7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBOb3JtYWxpemUgdGhlIGBkYXRhYnJpY2tzQUlUb29sc2Agb3B0aW9uIGludG8gYSBmbGF0IG9wdGlvbnMgYmFnLCBvciBgdW5kZWZpbmVkYCB3aGVuIG9mZi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhYnJpY2tzQUlUb29sc09wdGlvbihcbiAgb3B0aW9uOiBEYXRhYnJpY2tzQUlUb29sc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IERhdGFicmlja3NBSVRvb2xzT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCB8fCBvcHRpb24gPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob3B0aW9uID09PSB0cnVlKSByZXR1cm4geyBtb2RlOiBcInJlcXVpcmVcIiB9O1xuICBpZiAob3B0aW9uID09PSBcImF1dG9cIikgcmV0dXJuIHsgbW9kZTogXCJhdXRvXCIgfTtcbiAgcmV0dXJuIHsgbW9kZTogb3B0aW9uLm1vZGUgPz8gXCJhdXRvXCIsIC4uLm9wdGlvbiB9O1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzIGF0IGFwcCBzdGFydHVwIGFuZCByZXR1cm4gdGhlbSBhc1xuICogZXh0cmEgbG9jYWwgc2tpbGwgc2NhbiBwYXRocy5cbiAqXG4gKiBSZXNvbHV0aW9uOiByZXVzZSB0aGUgaW5zdGFsbGVkIGdsb2JhbCB0cmVlIHdoZW4gcHJlc2VudCAobm8gQ0xJIGNhbGwpIHVubGVzc1xuICogYHJlZnJlc2hgL2Bza2lsbHNgL2BwYXRoYCBhc2sgZm9yIGEgZnJlc2ggQ0xJIG1hdGVyaWFsaXphdGlvbjsgb3RoZXJ3aXNlIHJ1blxuICogYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsIC0tcGF0aCA8ZGlyPiAtLXNraWxscy1vbmx5YCB3aGVuIHRoZSBDTEkgcmVzb2x2ZXMuXG4gKiBBIGBcInJlcXVpcmVcImAgcHJvdmlzaW9uIHRoYXQgeWllbGRzIG5vdGhpbmcgZmFpbHMgc3RhcnR1cCB1bmxlc3NcbiAqIGBmYWlsT25FcnJvcjogZmFsc2VgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uRGF0YWJyaWNrc0FJVG9vbHMoXG4gIG9wdGlvbjogRGF0YWJyaWNrc0FJVG9vbHNPcHRpb24gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFByb3Zpc2lvbmVkRGF0YWJyaWNrc0FJVG9vbHM+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IG5vcm1hbGl6ZURhdGFicmlja3NBSVRvb2xzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZERhdGFicmlja3NBSVRvb2xzID0geyBsb2NhbFNraWxsUGF0aHM6IFtdIH07XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIGVtcHR5O1xuXG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGUgPz8gXCJhdXRvXCI7XG4gIGNvbnN0IGZhaWxPbkVycm9yID0gb3B0aW9ucy5mYWlsT25FcnJvciA/PyBtb2RlID09PSBcInJlcXVpcmVcIjtcblxuICB0cnkge1xuICAgIC8vIFRoZSBgZGF0YWJyaWNrc2AgQ0xJIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGguIFdoZW4gaXQncyByZXNvbHZhYmxlLCBydW5cbiAgICAvLyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGwgLS1wYXRoIDxkaXI+YCB0byBtYXRlcmlhbGl6ZSBhIGZyZXNoLFxuICAgIC8vIGFnZW50LWFnbm9zdGljIHNraWxsIHNldCBpbnRvIGEgZGlyIE1hc3RyYSBjYW4gc2Nhbi5cbiAgICBjb25zdCBjbGlQYXRoID0gYXdhaXQgcmVzb2x2ZUNsaShvcHRpb25zLmNsaSk7XG4gICAgaWYgKGNsaVBhdGgpIHtcbiAgICAgIGNvbnN0IGRpciA9IGF3YWl0IG1hdGVyaWFsaXplVmlhQ2xpKGNsaVBhdGgsIG9wdGlvbnMpO1xuICAgICAgaWYgKGRpcikgcmV0dXJuIHsgbG9jYWxTa2lsbFBhdGhzOiBbZGlyXSwgc291cmNlOiBcImNsaVwiIH07XG4gICAgfVxuXG4gICAgLy8gQ0xJIG5vdCBpbnN0YWxsZWQgKG9yIHByb2R1Y2VkIG5vdGhpbmcpLiBcImF1dG9cIiBsb2dzIGFuZCBtb3ZlcyBvbjtcbiAgICAvLyBcInJlcXVpcmVcIiBmYWlscyBzdGFydHVwIHVubGVzcyBgZmFpbE9uRXJyb3I6IGZhbHNlYC5cbiAgICBpZiAoZmFpbE9uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERhdGFicmlja3MgQUkgVG9vbHMgcmVxdWlyZWQgYnV0IHRoZSBcIiR7REFUQUJSSUNLU19DTEl9XCIgQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEluc3RhbGwgdGhlIERhdGFicmlja3MgQ0xJIChcXGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbFxcYCksIG9yIHNldCBkYXRhYnJpY2tzQUlUb29sczogXCJhdXRvXCIuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiZGF0YWJyaWNrcyBDTEkgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgQUkgVG9vbHMgc2tpbGxzXCIpO1xuICAgIHJldHVybiBlbXB0eTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGZhaWxPbkVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gcHJvdmlzaW9uIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzOiAke2Vycm9yLmVycm9yTWVzc2FnZShlcnIpfWAsXG4gICAgICAgIHsgY2F1c2U6IGVycm9yLnRvRXJyb3IoZXJyKSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCJza2lwcGVkXCIsIHsgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiBlbXB0eTtcbiAgfVxufVxuXG4vKiogUmVzb2x2ZSB0aGUgYGRhdGFicmlja3NgIENMSSwgcmV0dXJuaW5nIGl0cyBpbnZvY2F0aW9uIHBhdGggb3IgYHVuZGVmaW5lZGAuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2xpKGNsaTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29tbWFuZCA9IHN0cmluZy50cmltVG9OdWxsKGNsaSkgPz8gREFUQUJSSUNLU19DTEk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYy5zcGF3bihjb21tYW5kLCBbXCJhaXRvb2xzXCIsIFwidmVyc2lvblwiXSwge1xuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgICBjaGVjazogZmFsc2UsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCkgcmV0dXJuIGNvbW1hbmQ7XG4gIH0gY2F0Y2gge1xuICAgIC8vIENMSSBhYnNlbnQgb3IgYGFpdG9vbHNgIHVuc3VwcG9ydGVkIC0gY2FsbGVyIGZhbGxzIGJhY2sgLyBmYWlscy5cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJ1biBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGwgLS1wYXRoIDxkaXI+YCB0byBtYXRlcmlhbGl6ZSBhIHJlc29sdmVkLFxuICogYWdlbnQtYWdub3N0aWMgc2tpbGwgc2V0IGludG8gYSBkaXJlY3RvcnkgKHdyaXRlcyBgPG5hbWU+L1NLSUxMLm1kYCB0cmVlcyxcbiAqIG5vIGFnZW50cywgbm8gc3RhdGUpIE1hc3RyYSBjYW4gdGhlbiBzY2FuLlxuICovXG5hc3luYyBmdW5jdGlvbiBtYXRlcmlhbGl6ZVZpYUNsaShcbiAgY2xpOiBzdHJpbmcsXG4gIG9wdGlvbnM6IERhdGFicmlja3NBSVRvb2xzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gc3RyaW5nLnRyaW1Ub051bGwob3B0aW9ucy5wYXRoKTtcbiAgbGV0IGRpcjogc3RyaW5nO1xuXG4gIGlmIChleHBsaWNpdCkge1xuICAgIC8vIEFuIGV4cGxpY2l0IHBhdGggaXMgdGhlIGNhbGxlcidzIHRvIG93biAtIGluc3RhbGwgc3RyYWlnaHQgaW50byBpdC5cbiAgICBhd2FpdCBpbnN0YWxsU2tpbGxzKGNsaSwgb3B0aW9ucywgZXhwbGljaXQpO1xuICAgIGRpciA9IGV4cGxpY2l0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZSByZXNvbHZlZCBza2lsbCBzZXQgaXMgdGhlIHNhbWUgb24gYWxtb3N0IGV2ZXJ5IGJvb3QsIHNvIHJlYnVpbGQgT05FXG4gICAgLy8gc3RhYmxlIHRlbXAgdHJlZSByYXRoZXIgdGhhbiBsZWF2aW5nIGEgZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIGVhY2hcbiAgICAvLyB0aW1lLiBUaGUgQ0xJIHdyaXRlcyBpbnRvIGEgdGhyb3dhd2F5IHJvb3QgdGhhdCBvbmx5IHJlcGxhY2VzIHRoZSBzdGFibGVcbiAgICAvLyBvbmUgb24gc3VjY2Vzcywgc28gYSBmYWlsZWQgaW5zdGFsbCBrZWVwcyB0aGUgcHJldmlvdXMgc2tpbGxzIHVzYWJsZS5cbiAgICBjb25zdCBzdGFibGUgPSBhd2FpdCBsb2NhbEZTLnJlYnVpbGRGUyhTS0lMTFNfQ0FDSEVfRElSLCAoc2NyYXRjaCkgPT5cbiAgICAgIGluc3RhbGxTa2lsbHMoY2xpLCBvcHRpb25zLCBzY3JhdGNoLnJvb3QpLFxuICAgICk7XG4gICAgZGlyID0gc3RhYmxlLnJvb3Q7XG4gIH1cblxuICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbG9nZ2VyLmRlYnVnKFwibWF0ZXJpYWxpemVkIGFpdG9vbHMgc2tpbGxzIHZpYSBDTElcIiwge1xuICAgIHBhdGg6IGRpcixcbiAgICBza2lsbHM6IHN0cmluZy5wYXJzZUxpc3Qob3B0aW9ucy5za2lsbHMpLFxuICB9KTtcbiAgcmV0dXJuIGRpcjtcbn1cblxuLyoqIFJ1biBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGwgLS1wYXRoIDxkaXI+YCwgZmFpbGluZyBsb3VkbHkgb24gYSBub24temVybyBleGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFNraWxscyhcbiAgY2xpOiBzdHJpbmcsXG4gIG9wdGlvbnM6IERhdGFicmlja3NBSVRvb2xzT3B0aW9ucyxcbiAgZGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJncyA9IFtcImFpdG9vbHNcIiwgXCJpbnN0YWxsXCIsIFwiLS1wYXRoXCIsIGRpcl07XG4gIGNvbnN0IHNraWxscyA9IHN0cmluZy5wYXJzZUxpc3Qob3B0aW9ucy5za2lsbHMpO1xuICBpZiAoc2tpbGxzLmxlbmd0aCA+IDApIGFyZ3MucHVzaChcIi0tc2tpbGxzXCIsIHNraWxscy5qb2luKFwiLFwiKSk7XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbCkgYXJncy5wdXNoKFwiLS1leHBlcmltZW50YWxcIik7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYy5zcGF3bihjbGksIGFyZ3MsIHtcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgY2hlY2s6IGZhbHNlLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbCBmYWlsZWQgKGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9KTogJHtyZXN1bHQuc3RkZXJyIHx8IHJlc3VsdC5zdGRvdXR9YCxcbiAgICApO1xuICB9XG59XG4iXX0=
|