@dbx-tools/appkit 0.9.40 → 0.9.43

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/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
6
- export const PACKAGE_VERSION = "0.9.40";
6
+ export const PACKAGE_VERSION = "0.9.43";
7
7
  export * as appkit from "./src/appkit.ts";
8
8
  export * as brandContext from "./src/brand-context.ts";
9
9
  export * as bundle from "./src/bundle.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
2
- export declare const PACKAGE_VERSION = "0.9.40";
2
+ export declare const PACKAGE_VERSION = "0.9.43";
3
3
  export * as appkit from "./src/appkit.ts";
4
4
  export * as brandContext from "./src/brand-context.ts";
5
5
  export * as bundle from "./src/bundle.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
5
- export const PACKAGE_VERSION = "0.9.40";
5
+ export const PACKAGE_VERSION = "0.9.43";
6
6
  export * as appkit from "./src/appkit.js";
7
7
  export * as brandContext from "./src/brand-context.js";
8
8
  export * as bundle from "./src/bundle.js";
@@ -22,4 +22,4 @@ export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES,
22
22
  export { LifecycleBridgePlugin, lifecycleBridge } from "./src/interceptor.js";
23
23
  export { SSL_MODES } from "./src/pgaddress.js";
24
24
  export { ToolRegistryPlugin } from "./src/tool-provider.js";
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsSSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXRcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40MFwiO1xuZXhwb3J0ICogYXMgYXBwa2l0IGZyb20gXCIuL3NyYy9hcHBraXQudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kQ29udGV4dCBmcm9tIFwiLi9zcmMvYnJhbmQtY29udGV4dC50c1wiO1xuZXhwb3J0ICogYXMgYnVuZGxlIGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3MgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgaW50ZXJjZXB0b3IgZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVJlc29sdmVyIGZyb20gXCIuL3NyYy9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuZXhwb3J0ICogYXMgbWlncmF0aW9uIGZyb20gXCIuL3NyYy9taWdyYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBnYWRkcmVzcyBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW5FeGVjdXRpb24gZnJvbSBcIi4vc3JjL3BsdWdpbi1leGVjdXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpblJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9wbHVnaW4tcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHByb3Zpc2lvbiBmcm9tIFwiLi9zcmMvcHJvdmlzaW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0b29sUHJvdmlkZXIgZnJvbSBcIi4vc3JjL3Rvb2wtcHJvdmlkZXIudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xraXRFbnRyaWVzIGZyb20gXCIuL3NyYy90b29sa2l0LWVudHJpZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0b0NvbmZpZ3VyZU1vZGUsIENyZWF0ZUFwcENvbmZpZywgRXhlY3V0aW9uQ29udGV4dExpa2UsIFdvcmtzcGFjZUNsaWVudExpa2UgfSBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgeyBidW5kbGVBcHBSZXNvdXJjZVNjaGVtYSwgZmxhdHRlbkFwcFlhbWxFbnYsIGZsYXR0ZW5BcHBFbnYsIGdldEJ1bmRsZVBhdGggfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1bmRsZVZhbGlkYXRlSnNvbiwgQ29uZmlnRmlsZSwgQ29uZmlnTWFwVmFsdWUsIENvbmZpZ1NvdXJjZSwgUmVzb2x2ZUNvbmZpZ1ZhbHVlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0IHsgQUNDRVNTX1RPS0VOX0hFQURFUiwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCBJREVOVElUWV9NT0RFUywgREVGQVVMVF9JREVOVElUWV9NT0RFIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IElkZW50aXR5TW9kZSwgSGVhZGVyQmVhcmluZyB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHsgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luLCBsaWZlY3ljbGVCcmlkZ2UgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGlmZWN5Y2xlRXZlbnQsIExpZmVjeWNsZUhhbmRsZXIsIFJlc29sdmVkQXBwRW52LCBCaW5kYWJsZVByb2Nlc3MsIEludGVyY2VwdG9yQ29udGV4dCwgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yUnVudGltZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVJlc29sdmVySW5wdXRzLCBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21pZ3JhdGlvbi50c1wiO1xuZXhwb3J0IHsgU1NMX01PREVTIH0gZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBTc2xNb2RlLCBQYXJzZWRBZGRyZXNzLCBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMgfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJ1blBsdWdpbkV4ZWN1dGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLWV4ZWN1dGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQbHVnaW5Db250ZXh0TGlrZSB9IGZyb20gXCIuL3NyYy9wbHVnaW4tcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB7IFRvb2xSZWdpc3RyeVBsdWdpbiB9IGZyb20gXCIuL3NyYy90b29sLXByb3ZpZGVyLnRzXCI7XG4iXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsSSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXRcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40M1wiO1xuZXhwb3J0ICogYXMgYXBwa2l0IGZyb20gXCIuL3NyYy9hcHBraXQudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kQ29udGV4dCBmcm9tIFwiLi9zcmMvYnJhbmQtY29udGV4dC50c1wiO1xuZXhwb3J0ICogYXMgYnVuZGxlIGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3MgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgaW50ZXJjZXB0b3IgZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVJlc29sdmVyIGZyb20gXCIuL3NyYy9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuZXhwb3J0ICogYXMgbWlncmF0aW9uIGZyb20gXCIuL3NyYy9taWdyYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBnYWRkcmVzcyBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW5FeGVjdXRpb24gZnJvbSBcIi4vc3JjL3BsdWdpbi1leGVjdXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpblJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9wbHVnaW4tcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHByb3Zpc2lvbiBmcm9tIFwiLi9zcmMvcHJvdmlzaW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0b29sUHJvdmlkZXIgZnJvbSBcIi4vc3JjL3Rvb2wtcHJvdmlkZXIudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xraXRFbnRyaWVzIGZyb20gXCIuL3NyYy90b29sa2l0LWVudHJpZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0b0NvbmZpZ3VyZU1vZGUsIENyZWF0ZUFwcENvbmZpZywgRXhlY3V0aW9uQ29udGV4dExpa2UsIFdvcmtzcGFjZUNsaWVudExpa2UgfSBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgeyBidW5kbGVBcHBSZXNvdXJjZVNjaGVtYSwgZmxhdHRlbkFwcFlhbWxFbnYsIGZsYXR0ZW5BcHBFbnYsIGdldEJ1bmRsZVBhdGggfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1bmRsZVZhbGlkYXRlSnNvbiwgQ29uZmlnRmlsZSwgQ29uZmlnTWFwVmFsdWUsIENvbmZpZ1NvdXJjZSwgUmVzb2x2ZUNvbmZpZ1ZhbHVlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0IHsgQUNDRVNTX1RPS0VOX0hFQURFUiwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCBJREVOVElUWV9NT0RFUywgREVGQVVMVF9JREVOVElUWV9NT0RFIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IElkZW50aXR5TW9kZSwgSGVhZGVyQmVhcmluZyB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHsgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luLCBsaWZlY3ljbGVCcmlkZ2UgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGlmZWN5Y2xlRXZlbnQsIExpZmVjeWNsZUhhbmRsZXIsIFJlc29sdmVkQXBwRW52LCBCaW5kYWJsZVByb2Nlc3MsIEludGVyY2VwdG9yQ29udGV4dCwgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yUnVudGltZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVJlc29sdmVySW5wdXRzLCBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21pZ3JhdGlvbi50c1wiO1xuZXhwb3J0IHsgU1NMX01PREVTIH0gZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBTc2xNb2RlLCBQYXJzZWRBZGRyZXNzLCBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMgfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJ1blBsdWdpbkV4ZWN1dGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLWV4ZWN1dGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQbHVnaW5Db250ZXh0TGlrZSB9IGZyb20gXCIuL3NyYy9wbHVnaW4tcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB7IFRvb2xSZWdpc3RyeVBsdWdpbiB9IGZyb20gXCIuL3NyYy90b29sLXByb3ZpZGVyLnRzXCI7XG4iXX0=
@@ -36,7 +36,7 @@
36
36
  */
37
37
  import { ConfigurationError, ExecutionError, getUsernameWithApiLookup, getWorkspaceClient, ValidationError, } from "@databricks/appkit";
38
38
  import { configUtils, projectUtils } from "@dbx-tools/core";
39
- import { asyncUtils, log, object, stringUtils } from "@dbx-tools/shared-core";
39
+ import { asyncUtils, log, object, options as sharedOptions, stringUtils, } from "@dbx-tools/shared-core";
40
40
  import { z } from "zod";
41
41
  import { toContext } from "./databricks.js";
42
42
  import { parseAddress, parseResourcePath, parseSslMode as parseNativeSslMode, SSL_MODES, } from "./pgaddress.js";
@@ -72,50 +72,61 @@ const DEFAULT_DATABASE = "databricks_postgres";
72
72
  * stay `string` so a newly added state does not fail the whole response.
73
73
  */
74
74
  const projectSchema = z.object({
75
- // Full resource path: `projects/{p}`.
76
- name: z.string().optional(),
75
+ name: z.string().optional().describe("Full resource path: projects/{p}."),
77
76
  });
78
77
  const endpointSchema = z.object({
79
- // Full resource path: `projects/{p}/branches/{b}/endpoints/{e}`.
80
- name: z.string().optional(),
81
- uid: z.string().optional(),
82
- // Server-side state. All connection info lives here - the spec block
83
- // only carries the desired configuration, not the runtime hostnames.
78
+ name: z
79
+ .string()
80
+ .optional()
81
+ .describe("Full resource path: projects/{p}/branches/{b}/endpoints/{e}."),
82
+ uid: z.string().optional().describe("Stable endpoint uid assigned by Lakebase."),
84
83
  status: z
85
84
  .object({
86
- endpoint_type: z.string().optional(),
87
- // Resolved hostnames; `hosts.host` is the writable primary.
85
+ endpoint_type: z
86
+ .string()
87
+ .optional()
88
+ .describe("Endpoint role, such as ENDPOINT_TYPE_READ_WRITE."),
88
89
  hosts: z
89
90
  .object({
90
- host: z.string().optional(),
91
- read_only_host: z.string().optional(),
91
+ host: z.string().optional().describe("Writable primary hostname."),
92
+ read_only_host: z
93
+ .string()
94
+ .optional()
95
+ .describe("Read-only replica hostname when present."),
92
96
  })
93
- .optional(),
94
- // Compute state: `INITIALIZING`, `STARTING`, `READY`, `IDLE`, ...
95
- current_state: z.string().optional(),
97
+ .optional()
98
+ .describe("Resolved hostnames. hosts.host is the writable primary."),
99
+ current_state: z
100
+ .string()
101
+ .optional()
102
+ .describe("Compute state: INITIALIZING, STARTING, READY, IDLE, and later values."),
96
103
  })
97
- .optional(),
104
+ .optional()
105
+ .describe("Server-side state. Runtime hostnames live here, not in the spec block."),
98
106
  });
99
107
  const branchSchema = z.object({
100
- // Full resource path: `projects/{p}/branches/{b}`.
101
- name: z.string().optional(),
108
+ name: z.string().optional().describe("Full resource path: projects/{p}/branches/{b}."),
102
109
  status: z
103
110
  .object({
104
- // True for the project's default branch (e.g. `production`).
105
- default: z.boolean().optional(),
106
- current_state: z.string().optional(),
111
+ default: z
112
+ .boolean()
113
+ .optional()
114
+ .describe("True for the project's default branch, such as production."),
115
+ current_state: z.string().optional().describe("Branch compute state reported by Lakebase."),
107
116
  })
108
117
  .optional(),
109
118
  });
110
119
  const databaseSchema = z.object({
111
- // Full resource path: `projects/{p}/branches/{b}/databases/{d}`.
112
- name: z.string().optional(),
120
+ name: z
121
+ .string()
122
+ .optional()
123
+ .describe("Full resource path: projects/{p}/branches/{b}/databases/{d}."),
113
124
  status: z
114
125
  .object({
115
- // Actual Postgres database name (used as `PGDATABASE`). May differ
116
- // from the resource id - e.g. resource `databricks-postgres`
117
- // surfaces as Postgres database `databricks_postgres`.
118
- postgres_database: z.string().optional(),
126
+ postgres_database: z
127
+ .string()
128
+ .optional()
129
+ .describe("Actual Postgres database name used as PGDATABASE. May differ from the resource id."),
119
130
  })
120
131
  .optional(),
121
132
  });
@@ -126,7 +137,10 @@ const databaseSchema = z.object({
126
137
  * cap is fine.
127
138
  */
128
139
  const listResponseSchema = z.object({
129
- next_page_token: z.string().optional(),
140
+ next_page_token: z
141
+ .string()
142
+ .optional()
143
+ .describe("AIP page token. Only the first page is consumed."),
130
144
  projects: z.array(projectSchema).optional(),
131
145
  branches: z.array(branchSchema).optional(),
132
146
  endpoints: z.array(endpointSchema).optional(),
@@ -137,13 +151,13 @@ const listResponseSchema = z.object({
137
151
  * `done: true` means terminal; check `error` before reading `response`.
138
152
  */
139
153
  const operationSchema = z.object({
140
- name: z.string().optional(),
141
- done: z.boolean().optional(),
142
- error: z.unknown().optional(),
143
- response: z.unknown().optional(),
154
+ name: z.string().optional().describe("Operation resource name."),
155
+ done: z.boolean().optional().describe("True when the operation is terminal."),
156
+ error: z.unknown().optional().describe("Error payload present when the operation failed."),
157
+ response: z.unknown().optional().describe("Result payload present when the operation succeeded."),
144
158
  });
145
159
  /** `PGPORT` must land inside the TCP port range. */
146
- const portSchema = z.coerce.number().int().min(1).max(configUtils.MAX_TCP_PORT);
160
+ const portSchema = sharedOptions.tcpPortSchema;
147
161
  /**
148
162
  * Validate a `PGPORT`-shaped value. Returns `undefined` when unset, and throws
149
163
  * a {@link ValidationError} naming `PGPORT` for anything that is not a TCP
@@ -204,7 +218,8 @@ export function pollDelay(attempt, baseMs, signal) {
204
218
  */
205
219
  export async function readLakebaseInputs(config) {
206
220
  const configOptions = { bundleProfile: config?.bundleProfile };
207
- const rawAddress = config?.endpoint ?? configUtils.resolveValue("LAKEBASE_ENDPOINT", configOptions);
221
+ const rawAddress = config?.endpoint ??
222
+ configUtils.resolveValue(sharedOptions.databricksEnvironmentNames.lakebaseEndpoint, configOptions);
208
223
  const parsed = parseAddress(rawAddress);
209
224
  const portEnv = parsePort(configUtils.resolveValue("PGPORT", configOptions));
210
225
  const sslModeEnv = parseSslMode(configUtils.resolveValue("PGSSLMODE", configOptions));
@@ -312,8 +327,9 @@ export async function resolveLakebaseConnection(config, signal) {
312
327
  * {@link applyLakebaseEnv} for the complete set a Postgres pool requires.
313
328
  */
314
329
  export function applyLakebaseToEnv(resolved) {
315
- if (resolved.endpoint)
316
- process.env.LAKEBASE_ENDPOINT ??= resolved.endpoint;
330
+ if (resolved.endpoint) {
331
+ process.env[sharedOptions.databricksEnvironmentNames.lakebaseEndpoint] ??= resolved.endpoint;
332
+ }
317
333
  if (resolved.host)
318
334
  process.env.PGHOST ??= resolved.host;
319
335
  if (resolved.database)
@@ -711,4 +727,4 @@ async function pickDatabase(ws, project, branch, signal) {
711
727
  logger.debug("autopg: resolved database", { database: choice });
712
728
  return choice;
713
729
  }
714
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsWUFBWSxJQUFJLGtCQUFrQixFQUNsQyxTQUFTLEdBR1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDL0MsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzFCLE1BQU0sZ0JBQWdCLEdBQVksU0FBUyxDQUFDO0FBQzVDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLDhEQUE4RDtBQUM5RCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDaEMsTUFBTSx5QkFBeUIsR0FBRyxDQUFD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ZSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQ1YsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLGtCQUFrQixDQUFDLGlCQUFpQixDQUN4QyxVQUFVLEVBQ1YsOEJBQThCLGdCQUFnQixxREFBcUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN0SCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNoRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIHJlc29sdmVyLlxuICpcbiAqIFJlYWRzIHRoZSBzYW1lIGVudiB2YXJzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBjb25zdW1lcyAoYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsIGBQR1BPUlRgLCBgUEdTU0xNT0RFYCwgYExBS0VCQVNFX0VORFBPSU5UYCkgYW5kIGZpbGxzIGluXG4gKiB3aGljaGV2ZXIgcGllY2VzIGFyZSBtaXNzaW5nIHVzaW5nIHRoZSBMYWtlYmFzZSBBdXRvc2NhbGluZyBSRVNUIEFQSVxuICogdW5kZXIgYC9hcGkvMi4wL3Bvc3RncmVzL2AgdmlhIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQuXG4gKlxuICogYExBS0VCQVNFX0VORFBPSU5UYCAoYW5kIGBjb25maWcuZW5kcG9pbnRgKSBhY2NlcHQgYW55dGhpbmdcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzIC0gY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuIFRoZSByZXNvbHZlciBsYXllcnNcbiAqIHdoYXRldmVyIHBpZWNlcyBmYWxsIG91dCBvZiBwYXJzaW5nIHVuZGVyIGV4cGxpY2l0IGNvbmZpZyAvIGVudlxuICogdmFsdWVzLCB0aGVuIGZpbGxzIHRoZSByZW1haW5pbmcgZ2FwcyB2aWEgdGhlIEFQSTpcbiAqXG4gKiAgIDEuIFJldmVyc2UtbG9va3VwOiB3aGVuIGEgaG9zdCBpcyBrbm93biBidXQgbm8gcmVzb3VyY2UgcGF0aCBpcyxcbiAqICAgICAgc2NhbiBwcm9qZWN0cyAtPiBicmFuY2hlcyAtPiBlbmRwb2ludHMgZm9yIGEgbWF0Y2hpbmdcbiAqICAgICAgYHN0YXR1cy5ob3N0cy5ob3N0YCBhbmQgcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL2VuZHBvaW50LlxuICogICAyLiBQaWNrOiB3aGVuIGEgcHJvamVjdCBpcyBrbm93biBidXQgY2hpbGQgcmVzb3VyY2VzIGFyZW4ndCwgcHJlZmVyXG4gKiAgICAgIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IChgc3RhdHVzLmRlZmF1bHRgLCBgRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFYCxcbiAqICAgICAgYGRhdGFicmlja3NfcG9zdGdyZXNgKSBhbmQgZmFsbCBiYWNrIHRvIFwidGhlIG9ubHkgb25lXCIgd2hlbiBhXG4gKiAgICAgIGxpc3RpbmcgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQuXG4gKiAgIDMuIEF1dG8tY3JlYXRlOiB3aGVuIG5vIHByb2plY3RzIGV4aXN0IGF0IGFsbCwgY3JlYXRlIG9uZSB3aG9zZVxuICogICAgICBpZCBkZWZhdWx0cyB0byBgcHJvamVjdC5uYW1lKClgIHNsdWdpZmllZCAob3ZlcnJpZGVcbiAqICAgICAgd2l0aCBgY29uZmlnLmF1dG9DcmVhdGU6IFwibXktaWRcImAgb3IgZGlzYWJsZSB3aXRoXG4gKiAgICAgIGBjb25maWcuYXV0b0NyZWF0ZTogZmFsc2VgKS4gVGhlIGNyZWF0ZSBjYWxsIGlzIGlkZW1wb3RlbnQgLSBhblxuICogICAgICBgQUxSRUFEWV9FWElTVFNgIHJlc3BvbnNlIGZyb20gYSBjb25jdXJyZW50IGJvb3QgaXMgdHJlYXRlZCBhc1xuICogICAgICBzdWNjZXNzLiBUaGVuIHBvbGwgdGhlIGRlZmF1bHQgZW5kcG9pbnQgdW50aWwgaXQgcmVwb3J0c1xuICogICAgICBgY3VycmVudF9zdGF0ZWAgYFJFQURZYCBvciBgSURMRWAuXG4gKlxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VUb0Vudn0gd3JpdGVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0b1xuICogYHByb2Nlc3MuZW52YCBzbyB0aGUgZG93bnN0cmVhbSBgbGFrZWJhc2VgIHBsdWdpbiBwaWNrcyB0aGVtIHVwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2FwaS93b3Jrc3BhY2UvcG9zdGdyZXNcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0VXNlcm5hbWVXaXRoQXBpTG9va3VwLFxuICBnZXRXb3Jrc3BhY2VDbGllbnQsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnVXRpbHMsIHByb2plY3RVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0b0NvbnRleHQgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLnRzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFkZHJlc3MsXG4gIHBhcnNlUmVzb3VyY2VQYXRoLFxuICBwYXJzZVNzbE1vZGUgYXMgcGFyc2VOYXRpdmVTc2xNb2RlLFxuICBTU0xfTU9ERVMsXG4gIHR5cGUgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzLFxuICB0eXBlIFNzbE1vZGUsXG59IGZyb20gXCIuL3BnYWRkcmVzcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibGFrZWJhc2UtcmVzb2x2ZXJcIik7XG5jb25zdCBBUElfQkFTRSA9IFwiL2FwaS8yLjAvcG9zdGdyZXNcIjtcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDU0MzI7XG5jb25zdCBERUZBVUxUX1NTTF9NT0RFOiBTc2xNb2RlID0gXCJyZXF1aXJlXCI7XG5jb25zdCBERUZBVUxUX1BHX1ZFUlNJT04gPSAxNztcbi8qKiBMYWtlYmFzZSBwcm9qZWN0IGlkczogYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGAuICovXG5jb25zdCBQUk9KRUNUX0lEX01BWF9MRU4gPSA2MztcbmNvbnN0IE9QRVJBVElPTl9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IE9QRVJBVElPTl9QT0xMX01TID0gMl8wMDA7XG5jb25zdCBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IEVORFBPSU5UX1JFQURZX1BPTExfTVMgPSAyXzAwMDtcbi8qKiBDZWlsaW5nIG9uIGEgc2luZ2xlIGJhY2tvZmYgc3RlcCwgc28gYSBsb25nIHdhaXQgc3RpbGwgcG9sbHMgcmVndWxhcmx5LiAqL1xuY29uc3QgUE9MTF9NQVhfREVMQVlfTVMgPSAxNV8wMDA7XG5jb25zdCBQT0xMX0JBQ0tPRkZfRkFDVE9SID0gMS41O1xuLyoqIEZyYWN0aW9uIG9mIGVhY2ggZGVsYXkgYXBwbGllZCBhcyArLy0gaml0dGVyLCBzbyBjb25jdXJyZW50IGJvb3RzIGRlc3luY2hyb25pemUuICovXG5jb25zdCBQT0xMX0pJVFRFUl9SQVRJTyA9IDAuMjtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmVuZHBvaW50X3R5cGVgIGZvciB0aGUgd3JpdGFibGUgcHJpbWFyeS4gKi9cbmNvbnN0IFJFQURfV1JJVEVfRU5EUE9JTlRfVFlQRSA9IFwiRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFXCI7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCB2YWx1ZXMgdGhhdCB3aWxsIGFjY2VwdCBhIGNvbm5lY3Rpb24uICovXG5jb25zdCBDT05ORUNUQUJMRV9FTkRQT0lOVF9TVEFURVMgPSBuZXcgU2V0KFtcIlJFQURZXCIsIFwiSURMRVwiXSk7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCBiZWZvcmUgYSBob3N0bmFtZSBpcyBtZWFuaW5nZnVsLiAqL1xuY29uc3QgSU5JVElBTElaSU5HX0VORFBPSU5UX1NUQVRFID0gXCJJTklUSUFMSVpJTkdcIjtcbi8qKiBMYWtlYmFzZSdzIG93biBkZWZhdWx0IFBvc3RncmVzIGRhdGFiYXNlIG5hbWUuICovXG5jb25zdCBERUZBVUxUX0RBVEFCQVNFID0gXCJkYXRhYnJpY2tzX3Bvc3RncmVzXCI7XG5cbi8qKlxuICogVXNlci1zdXBwbGllZCBMYWtlYmFzZSBpbnB1dHMgKGNvbmZpZyBvciBlbnYpIGJlZm9yZSBhbnkgQVBJIHJlc29sdXRpb24uXG4gKiBFeHRlbmRzIHtAbGluayBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHN9IHdpdGggcmVzb2x2ZXItb25seSBvcHRpb25zLlxuICoge0BsaW5rIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb259IGZpbGxzIGdhcHMgZnJvbSB0aGUgTGFrZWJhc2UgQVBJIHdoZW5cbiAqIGl0IGhhcyBlbm91Z2ggY29udGV4dCAodHlwaWNhbGx5IGEgYHByb2plY3RgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZVJlc29sdmVySW5wdXRzIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgLyoqIEF1dGgtcmVzb2x2ZWQgcHJvZmlsZSB1c2VkIG9ubHkgZm9yIERhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRpb24uICovXG4gIGJ1bmRsZVByb2ZpbGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGF0IHRvIGRvIHdoZW4gbm8gcHJvamVjdCBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZSBhdCBhbGwuXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb21cbiAgICogICB7QGxpbmsgcHJvamVjdC5uYW1lfSAodGhlIGhvc3QgcmVwbydzIGBwYWNrYWdlLmpzb25gXG4gICAqICAgbmFtZSkgc2x1Z2lmaWVkIHRvIExha2ViYXNlIGlkIGNvbnN0cmFpbnRzLCB0aGVuIGNyZWF0ZSBpdC5cbiAgICogLSBgc3RyaW5nYDogY3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCB0aGlzIGV4YWN0IGlkLlxuICAgKiAtIGBmYWxzZWA6IHNraXAgY3JlYXRpb24gYW5kIHRocm93IHdpdGggYSBjbGVhciBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgYXV0b0NyZWF0ZT86IHN0cmluZyB8IGZhbHNlO1xufVxuXG4vKiogRnVsbHktcmVzb2x2ZWQgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VDb25uZWN0aW9uIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgcG9ydDogbnVtYmVyO1xuICBzc2xNb2RlOiBTc2xNb2RlO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGZpZWxkIG9mIHRoZSBMYWtlYmFzZSBSRVNUIHBheWxvYWRzIGlzIG1vZGVsbGVkIGFzIG9wdGlvbmFsIGFuZFxuICogdmFsaWRhdGVkIGF0IHRoZSBib3VuZGFyeSByYXRoZXIgdGhhbiBhc3NlcnRlZCB3aXRoIGEgY2FzdDogdGhlIHBpY2tlcnMgYmVsb3dcbiAqIGJyYW5jaCBvbiBgc3RhdHVzLipgLCBhbmQgYSBzaGFwZSBjaGFuZ2UgdXBzdHJlYW0gc2hvdWxkIHN1cmZhY2UgYXMgb25lIGxvdWRcbiAqIGVycm9yIGhlcmUgaW5zdGVhZCBvZiBhbiBgdW5kZWZpbmVkYCB0aHJlZSBmcmFtZXMgYXdheS4gRW51bS1zaGFwZWQgZmllbGRzXG4gKiBzdGF5IGBzdHJpbmdgIHNvIGEgbmV3bHkgYWRkZWQgc3RhdGUgZG9lcyBub3QgZmFpbCB0aGUgd2hvbGUgcmVzcG9uc2UuXG4gKi9cbmNvbnN0IHByb2plY3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8vIEZ1bGwgcmVzb3VyY2UgcGF0aDogYHByb2plY3RzL3twfWAuXG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBQcm9qZWN0ID0gei5pbmZlcjx0eXBlb2YgcHJvamVjdFNjaGVtYT47XG5cbmNvbnN0IGVuZHBvaW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBGdWxsIHJlc291cmNlIHBhdGg6IGBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9L2VuZHBvaW50cy97ZX1gLlxuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvLyBTZXJ2ZXItc2lkZSBzdGF0ZS4gQWxsIGNvbm5lY3Rpb24gaW5mbyBsaXZlcyBoZXJlIC0gdGhlIHNwZWMgYmxvY2tcbiAgLy8gb25seSBjYXJyaWVzIHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24sIG5vdCB0aGUgcnVudGltZSBob3N0bmFtZXMuXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZW5kcG9pbnRfdHlwZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgLy8gUmVzb2x2ZWQgaG9zdG5hbWVzOyBgaG9zdHMuaG9zdGAgaXMgdGhlIHdyaXRhYmxlIHByaW1hcnkuXG4gICAgICBob3N0czogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICBob3N0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgcmVhZF9vbmx5X2hvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAvLyBDb21wdXRlIHN0YXRlOiBgSU5JVElBTElaSU5HYCwgYFNUQVJUSU5HYCwgYFJFQURZYCwgYElETEVgLCAuLi5cbiAgICAgIGN1cnJlbnRfc3RhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIEVuZHBvaW50ID0gei5pbmZlcjx0eXBlb2YgZW5kcG9pbnRTY2hlbWE+O1xuXG5jb25zdCBicmFuY2hTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8vIEZ1bGwgcmVzb3VyY2UgcGF0aDogYHByb2plY3RzL3twfS9icmFuY2hlcy97Yn1gLlxuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgLy8gVHJ1ZSBmb3IgdGhlIHByb2plY3QncyBkZWZhdWx0IGJyYW5jaCAoZS5nLiBgcHJvZHVjdGlvbmApLlxuICAgICAgZGVmYXVsdDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIGN1cnJlbnRfc3RhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIEJyYW5jaCA9IHouaW5mZXI8dHlwZW9mIGJyYW5jaFNjaGVtYT47XG5cbmNvbnN0IGRhdGFiYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBGdWxsIHJlc291cmNlIHBhdGg6IGBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9L2RhdGFiYXNlcy97ZH1gLlxuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgLy8gQWN0dWFsIFBvc3RncmVzIGRhdGFiYXNlIG5hbWUgKHVzZWQgYXMgYFBHREFUQUJBU0VgKS4gTWF5IGRpZmZlclxuICAgICAgLy8gZnJvbSB0aGUgcmVzb3VyY2UgaWQgLSBlLmcuIHJlc291cmNlIGBkYXRhYnJpY2tzLXBvc3RncmVzYFxuICAgICAgLy8gc3VyZmFjZXMgYXMgUG9zdGdyZXMgZGF0YWJhc2UgYGRhdGFicmlja3NfcG9zdGdyZXNgLlxuICAgICAgcG9zdGdyZXNfZGF0YWJhc2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIERhdGFiYXNlID0gei5pbmZlcjx0eXBlb2YgZGF0YWJhc2VTY2hlbWE+O1xuXG4vKipcbiAqIExha2ViYXNlIFJFU1QgbGlzdCByZXNwb25zZXMgZm9sbG93IHRoZSBHb29nbGUgQUlQIGNvbnZlbnRpb246XG4gKiBgeyA8cGx1cmFsLXJlc291cmNlPjogVFtdLCBuZXh0X3BhZ2VfdG9rZW4/OiBzdHJpbmcgfWAuIFdlIG9ubHkgcmVhZFxuICogdGhlIGZpcnN0IHBhZ2U7IGZvciBhdXRvLWNvbmZpZydzIFwicGljayBzb21ldGhpbmcgc2Vuc2libGVcIiBzZW1hbnRpY3MgdGhlXG4gKiBjYXAgaXMgZmluZS5cbiAqL1xuY29uc3QgbGlzdFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuZXh0X3BhZ2VfdG9rZW46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcHJvamVjdHM6IHouYXJyYXkocHJvamVjdFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgYnJhbmNoZXM6IHouYXJyYXkoYnJhbmNoU2NoZW1hKS5vcHRpb25hbCgpLFxuICBlbmRwb2ludHM6IHouYXJyYXkoZW5kcG9pbnRTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGRhdGFiYXNlczogei5hcnJheShkYXRhYmFzZVNjaGVtYSkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIExvbmctcnVubmluZyBvcGVyYXRpb24gZW52ZWxvcGUgcmV0dXJuZWQgYnkgbXV0YXRpbmcgUkVTVCBjYWxscy5cbiAqIGBkb25lOiB0cnVlYCBtZWFucyB0ZXJtaW5hbDsgY2hlY2sgYGVycm9yYCBiZWZvcmUgcmVhZGluZyBgcmVzcG9uc2VgLlxuICovXG5jb25zdCBvcGVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgZXJyb3I6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gIHJlc3BvbnNlOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxufSk7XG50eXBlIE9wZXJhdGlvbiA9IHouaW5mZXI8dHlwZW9mIG9wZXJhdGlvblNjaGVtYT47XG5cbi8qKiBgUEdQT1JUYCBtdXN0IGxhbmQgaW5zaWRlIHRoZSBUQ1AgcG9ydCByYW5nZS4gKi9cbmNvbnN0IHBvcnRTY2hlbWEgPSB6LmNvZXJjZS5udW1iZXIoKS5pbnQoKS5taW4oMSkubWF4KGNvbmZpZ1V0aWxzLk1BWF9UQ1BfUE9SVCk7XG5cbi8qKlxuICogVmFsaWRhdGUgYSBgUEdQT1JUYC1zaGFwZWQgdmFsdWUuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB1bnNldCwgYW5kIHRocm93c1xuICogYSB7QGxpbmsgVmFsaWRhdGlvbkVycm9yfSBuYW1pbmcgYFBHUE9SVGAgZm9yIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgVENQXG4gKiBwb3J0LCBzbyBhIHR5cG8gY2Fubm90IHJlYWNoIHRoZSBjb25uZWN0aW9uIHJlY29yZCBhcyBgTmFOYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG9ydCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IHBvcnRTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcIlBHUE9SVFwiLFxuICAgICAgdmFsdWUsXG4gICAgICBgYSBUQ1AgcG9ydCBiZXR3ZWVuIDEgYW5kICR7Y29uZmlnVXRpbHMuTUFYX1RDUF9QT1JUfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkLmRhdGE7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBgUEdTU0xNT0RFYC1zaGFwZWQgdmFsdWUuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB1bnNldCwgYW5kXG4gKiB0aHJvd3MgYSB7QGxpbmsgVmFsaWRhdGlvbkVycm9yfSBuYW1pbmcgYFBHU1NMTU9ERWAgZm9yIGFuIHVuc3VwcG9ydGVkIG1vZGVcbiAqIHJhdGhlciB0aGFuIGhhbmRpbmcgYHBnYCBhIHZhbHVlIGl0IHdpbGwgcmVqZWN0IGF0IGNvbm5lY3QgdGltZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3NsTW9kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogU3NsTW9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU5hdGl2ZVNzbE1vZGUodmFsdWUpO1xuICBpZiAocGFyc2VkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFwiUEdTU0xNT0RFXCIsIHZhbHVlLCBTU0xfTU9ERVMuam9pbihcIiwgXCIpKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIERlbGF5IGJlZm9yZSB0aGUgbmV4dCBwb2xsIGF0dGVtcHQ6IGV4cG9uZW50aWFsIGJhY2tvZmYgY2FwcGVkIGF0XG4gKiB7QGxpbmsgUE9MTF9NQVhfREVMQVlfTVN9LCBwbHVzIGppdHRlciBzbyBzZXZlcmFsIGFwcHMgYm9vdGluZyBhZ2FpbnN0IHRoZVxuICogc2FtZSB3b3Jrc3BhY2UgZG8gbm90IHJldHJ5IGluIGxvY2tzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFBvbGxEZWxheShhdHRlbXB0OiBudW1iZXIsIGJhc2VNczogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYmFja29mZiA9IE1hdGgubWluKGJhc2VNcyAqIFBPTExfQkFDS09GRl9GQUNUT1IgKiogYXR0ZW1wdCwgUE9MTF9NQVhfREVMQVlfTVMpO1xuICBjb25zdCBqaXR0ZXIgPSBiYWNrb2ZmICogUE9MTF9KSVRURVJfUkFUSU8gKiAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKTtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgucm91bmQoYmFja29mZiArIGppdHRlcikpO1xufVxuXG4vKipcbiAqIFdhaXQgb3V0IHtAbGluayBuZXh0UG9sbERlbGF5fSBiZWZvcmUgdGhlIG5leHQgYXR0ZW1wdC4gUmVqZWN0cyB3aXRoIHRoZVxuICogc2lnbmFsJ3MgcmVhc29uIHdoZW4gdGhlIGNhbGxlciBjYW5jZWxzIG1pZC13YWl0LCBzbyBhIHBvbGwgbG9vcCB1bndpbmRzXG4gKiBpbnN0ZWFkIG9mIGZpbmlzaGluZyBpdHMgYmFja29mZiBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxEZWxheShhdHRlbXB0OiBudW1iZXIsIGJhc2VNczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gYXN5bmNVdGlscy5zbGVlcChuZXh0UG9sbERlbGF5KGF0dGVtcHQsIGJhc2VNcyksIHNpZ25hbCk7XG59XG5cbi8qKlxuICogUHVsbCByZXNvbHZlciBpbnB1dHMgZnJvbSBgcHJvY2Vzcy5lbnZgLCBwYXJzZSB0aGUgYWRkcmVzcyBibG9iLCBhbmRcbiAqIGxheWVyIGV4cGxpY2l0IGNvbmZpZyBvbiB0b3Agd2l0aCB0aGlzIHByZWNlZGVuY2U6XG4gKlxuICogICBgY29uZmlnLjxmaWVsZD5gID4gYGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZWAgKHNoYXJlZCBjb25maWcgc291cmNlcykgPlxuICogICB3aGF0ZXZlciB7QGxpbmsgcGFyc2VBZGRyZXNzfSByZWNvdmVyZWQgZnJvbSB0aGVcbiAqICAgYGVuZHBvaW50YCAvIGBMQUtFQkFTRV9FTkRQT0lOVGAgYmxvYi5cbiAqXG4gKiBTZXQgYGNvbmZpZy5lbmRwb2ludGAgKG9yIGBMQUtFQkFTRV9FTkRQT0lOVGApIHRvIGFueSBpbnB1dFxuICoge0BsaW5rIHBhcnNlQWRkcmVzc30gdW5kZXJzdGFuZHM6IGNhbm9uaWNhbCByZXNvdXJjZSBwYXRocywgUG9zdGdyZXNcbiAqIFVSSXMsIGJhcmUgaG9zdG5hbWVzLCBvciBiYXJlIHByb2plY3QgaWRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZExha2ViYXNlSW5wdXRzKFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuKTogUHJvbWlzZTxMYWtlYmFzZVJlc29sdmVySW5wdXRzPiB7XG4gIGNvbnN0IGNvbmZpZ09wdGlvbnMgPSB7IGJ1bmRsZVByb2ZpbGU6IGNvbmZpZz8uYnVuZGxlUHJvZmlsZSB9O1xuICBjb25zdCByYXdBZGRyZXNzID1cbiAgICBjb25maWc/LmVuZHBvaW50ID8/IGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIkxBS0VCQVNFX0VORFBPSU5UXCIsIGNvbmZpZ09wdGlvbnMpO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUFkZHJlc3MocmF3QWRkcmVzcyk7XG4gIGNvbnN0IHBvcnRFbnYgPSBwYXJzZVBvcnQoY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlKFwiUEdQT1JUXCIsIGNvbmZpZ09wdGlvbnMpKTtcbiAgY29uc3Qgc3NsTW9kZUVudiA9IHBhcnNlU3NsTW9kZShjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXCJQR1NTTE1PREVcIiwgY29uZmlnT3B0aW9ucykpO1xuICBjb25zdCBjb25maWd1cmVkU3NsTW9kZSA9IHBhcnNlU3NsTW9kZShjb25maWc/LnNzbE1vZGUpO1xuICBjb25zdCBwYXJzZWRTc2xNb2RlID0gcGFyc2VTc2xNb2RlKHBhcnNlZC5zc2xNb2RlKTtcbiAgcmV0dXJuIHtcbiAgICBwcm9qZWN0OiBjb25maWc/LnByb2plY3QgPz8gcGFyc2VkLnByb2plY3QsXG4gICAgYnJhbmNoOiBjb25maWc/LmJyYW5jaCA/PyBwYXJzZWQuYnJhbmNoLFxuICAgIC8vIE9ubHkgY2Fub25pY2FsIGVuZHBvaW50IHJlc291cmNlIHBhdGhzIHN1cnZpdmUgaGVyZTsgVVJJcyBhbmRcbiAgICAvLyBiYXJlIGhvc3RuYW1lcyBzZXQgYGhvc3RgIGluc3RlYWQgYW5kIGxlYXZlIGBlbmRwb2ludGAgdW5kZWZpbmVkXG4gICAgLy8gdW50aWwgdGhlIFJFU1QgcmVzb2x2ZXIgZmlsbHMgaXQgaW4uXG4gICAgZW5kcG9pbnQ6IHBhcnNlZC5lbmRwb2ludCxcbiAgICBkYXRhYmFzZTpcbiAgICAgIGNvbmZpZz8uZGF0YWJhc2UgPz8gY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlKFwiUEdEQVRBQkFTRVwiLCBjb25maWdPcHRpb25zKSA/PyBwYXJzZWQuZGF0YWJhc2UsXG4gICAgaG9zdDogY29uZmlnPy5ob3N0ID8/IGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIlBHSE9TVFwiLCBjb25maWdPcHRpb25zKSA/PyBwYXJzZWQuaG9zdCxcbiAgICBwb3J0OiBjb25maWc/LnBvcnQgPz8gcG9ydEVudiA/PyBwYXJzZWQucG9ydCxcbiAgICBzc2xNb2RlOiBjb25maWd1cmVkU3NsTW9kZSA/PyBzc2xNb2RlRW52ID8/IHBhcnNlZFNzbE1vZGUsXG4gICAgYXV0b0NyZWF0ZTogY29uZmlnPy5hdXRvQ3JlYXRlLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBmdWxseS1wb3B1bGF0ZWQgUG9zdGdyZXMgY29ubmVjdGlvbiByZWNvcmQgZnJvbSBjb25maWcgKyBlbnYuXG4gKlxuICogUmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IG5ldHdvcmsgdHJhZmZpYyB3aGVuIGVudiBhbHJlYWR5IHN1cHBsaWVzXG4gKiBgZW5kcG9pbnRgLCBgaG9zdGAsIGFuZCBgZGF0YWJhc2VgLiBPdGhlcndpc2UgaXNzdWVzIFJFU1QgY2FsbHMgYW5kXG4gKiBtYXkgYXV0by1jcmVhdGUgYSBwcm9qZWN0IChzZWUgbW9kdWxlIGRvY3N0cmluZykuXG4gKlxuICogYHNpZ25hbGAgY2FuY2VscyBldmVyeSBSRVNUIGNhbGwgYW5kIGludGVyLXBvbGwgc2xlZXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGxha2ViYXNlUmVzb2x2ZXIgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGxha2ViYXNlUmVzb2x2ZXIucmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbihcbiAqICAgeyBhdXRvQ3JlYXRlOiBmYWxzZSB9LFxuICogICBBYm9ydFNpZ25hbC50aW1lb3V0KDYwXzAwMCksXG4gKiApO1xuICogbGFrZWJhc2VSZXNvbHZlci5hcHBseUxha2ViYXNlVG9FbnYocmVzb2x2ZWQpO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbihcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPExha2ViYXNlQ29ubmVjdGlvbj4ge1xuICBjb25zdCBpbnB1dHMgPSBhd2FpdCByZWFkTGFrZWJhc2VJbnB1dHMoY29uZmlnKTtcbiAgbGV0IHsgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgZGF0YWJhc2UsIGhvc3QgfSA9IGlucHV0cztcbiAgY29uc3QgcG9ydCA9IGlucHV0cy5wb3J0ID8/IERFRkFVTFRfUE9SVDtcbiAgY29uc3Qgc3NsTW9kZSA9IHBhcnNlU3NsTW9kZShpbnB1dHMuc3NsTW9kZSkgPz8gREVGQVVMVF9TU0xfTU9ERTtcblxuICAvLyBSZXNvdXJjZSBwYXRocyBtYXkgY2FycnkgcmVkdW5kYW50IGluZm87IGhhcnZlc3QgcHJvamVjdC9icmFuY2hcbiAgLy8gZnJvbSBhbnkgY2Fub25pY2FsIHBhdGggdGhhdCBzbnVjayBpbiB2aWEgUEdEQVRBQkFTRSBvciBzaW1pbGFyLlxuICBpZiAoZW5kcG9pbnQgJiYgKCFwcm9qZWN0IHx8ICFicmFuY2gpKSB7XG4gICAgY29uc3QgcGFyc2VkRW5kcG9pbnQgPSBwYXJzZUFkZHJlc3MoZW5kcG9pbnQpO1xuICAgIHByb2plY3QgPz89IHBhcnNlZEVuZHBvaW50LnByb2plY3Q7XG4gICAgYnJhbmNoID8/PSBwYXJzZWRFbmRwb2ludC5icmFuY2g7XG4gIH1cbiAgaWYgKGRhdGFiYXNlICYmICghcHJvamVjdCB8fCAhYnJhbmNoKSkge1xuICAgIGNvbnN0IHBhcnNlZERhdGFiYXNlID0gcGFyc2VBZGRyZXNzKGRhdGFiYXNlKTtcbiAgICBwcm9qZWN0ID8/PSBwYXJzZWREYXRhYmFzZS5wcm9qZWN0O1xuICAgIGJyYW5jaCA/Pz0gcGFyc2VkRGF0YWJhc2UuYnJhbmNoO1xuICAgIGlmIChwYXJzZWREYXRhYmFzZS5kYXRhYmFzZVJlc291cmNlSWQpIHtcbiAgICAgIGRhdGFiYXNlID0gcGFyc2VkRGF0YWJhc2UuZGF0YWJhc2VSZXNvdXJjZUlkO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFscmVhZHkgY29tcGxldGU6IHNraXAgZXZlcnkgUkVTVCBjYWxsLlxuICBpZiAoZW5kcG9pbnQgJiYgaG9zdCAmJiBkYXRhYmFzZSkge1xuICAgIHJldHVybiB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0LCBwb3J0LCBzc2xNb2RlIH07XG4gIH1cblxuICBjb25zdCB3cyA9IGdldFdvcmtzcGFjZUNsaWVudCh7fSk7XG5cbiAgLy8gSG9zdCBrbm93biBidXQgbm8gcmVzb3VyY2UgcGF0aDogc2NhbiB0aGUgd29ya3NwYWNlIHRvIGZpbmQgd2hpY2hcbiAgLy8gZW5kcG9pbnQgb3ducyB0aGlzIGhvc3Qgc28gd2UgY2FuIHBvcHVsYXRlIExBS0VCQVNFX0VORFBPSU5ULlxuICBpZiAoIXByb2plY3QgJiYgaG9zdCkge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgZmluZEVuZHBvaW50QnlIb3N0KHdzLCBob3N0LCBzaWduYWwpO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgcHJvamVjdCA9IGZvdW5kLnByb2plY3Q7XG4gICAgICBicmFuY2ggPSBmb3VuZC5icmFuY2g7XG4gICAgICBlbmRwb2ludCA/Pz0gZm91bmQuZW5kcG9pbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gTm8gcHJvamVjdCBhbnl3aGVyZSBpbiBjb25maWcvZW52L2FkZHJlc3M6IGxpc3QsIHBpY2ssIG9yIGNyZWF0ZS5cbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgcHJvamVjdCA9IGF3YWl0IHBpY2tPckNyZWF0ZVByb2plY3Qod3MsIGNvbmZpZz8uYXV0b0NyZWF0ZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGlmICghYnJhbmNoKSB7XG4gICAgYnJhbmNoID0gYXdhaXQgcGlja0JyYW5jaCh3cywgcHJvamVjdCwgc2lnbmFsKTtcbiAgfVxuXG4gIGlmICghZW5kcG9pbnQpIHtcbiAgICBjb25zdCBlcCA9IGF3YWl0IHBpY2tFbmRwb2ludCh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICAgIGVuZHBvaW50ID0gZXAubmFtZTtcbiAgICBob3N0ID8/PSBlcC5ob3N0O1xuICB9XG5cbiAgaWYgKCFob3N0ICYmIGVuZHBvaW50KSB7XG4gICAgY29uc3QgcGFyc2VkRW5kcG9pbnQgPSBwYXJzZUFkZHJlc3MoZW5kcG9pbnQpO1xuICAgIGlmIChwYXJzZWRFbmRwb2ludC5wcm9qZWN0ICYmIHBhcnNlZEVuZHBvaW50LmJyYW5jaCAmJiBwYXJzZWRFbmRwb2ludC5lbmRwb2ludElkKSB7XG4gICAgICBjb25zdCBlcCA9IGF3YWl0IHdhaXRFbmRwb2ludFJlYWR5KFxuICAgICAgICB3cyxcbiAgICAgICAgcGFyc2VkRW5kcG9pbnQucHJvamVjdCxcbiAgICAgICAgcGFyc2VkRW5kcG9pbnQuYnJhbmNoLFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5lbmRwb2ludElkLFxuICAgICAgICBzaWduYWwsXG4gICAgICApO1xuICAgICAgaG9zdCA9IGVwLnN0YXR1cz8uaG9zdHM/Lmhvc3Q7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHJlc29sdmVkIGhvc3QgZnJvbSBlbmRwb2ludFwiLCB7IGhvc3QgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkYXRhYmFzZSkge1xuICAgIGRhdGFiYXNlID0gYXdhaXQgcGlja0RhdGFiYXNlKHdzLCBwcm9qZWN0LCBicmFuY2gsIHNpZ25hbCk7XG4gIH1cblxuICByZXR1cm4geyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCwgcG9ydCwgc3NsTW9kZSB9O1xufVxuXG4vKipcbiAqIFdyaXRlIHJlc29sdmVkIHZhbHVlcyBiYWNrIHRvIGBwcm9jZXNzLmVudmAgc28gdGhlIGBsYWtlYmFzZWAgcGx1Z2luXG4gKiAod2hpY2ggcmVhZHMgZW52IGRpcmVjdGx5KSBwaWNrcyB0aGVtIHVwIGR1cmluZyBpdHMgb3duIGBzZXR1cCgpYC5cbiAqIEV4aXN0aW5nIGVudiB2YWx1ZXMgYXJlIHByZXNlcnZlZDsgb25seSBtaXNzaW5nIGtleXMgYXJlIGZpbGxlZCBpbixcbiAqIHdoaWNoIGtlZXBzIGV4cGxpY2l0IG92ZXJyaWRlcyBhdXRob3JpdGF0aXZlLlxuICpcbiAqIFRoaXMgZG9lcyBOT1Qgc2V0IGBQR1VTRVJgLCB3aGljaCBuZWVkcyBhbiBhd2FpdCAtIHNlZVxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VFbnZ9IGZvciB0aGUgY29tcGxldGUgc2V0IGEgUG9zdGdyZXMgcG9vbCByZXF1aXJlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uKTogdm9pZCB7XG4gIGlmIChyZXNvbHZlZC5lbmRwb2ludCkgcHJvY2Vzcy5lbnYuTEFLRUJBU0VfRU5EUE9JTlQgPz89IHJlc29sdmVkLmVuZHBvaW50O1xuICBpZiAocmVzb2x2ZWQuaG9zdCkgcHJvY2Vzcy5lbnYuUEdIT1NUID8/PSByZXNvbHZlZC5ob3N0O1xuICBpZiAocmVzb2x2ZWQuZGF0YWJhc2UpIHByb2Nlc3MuZW52LlBHREFUQUJBU0UgPz89IHJlc29sdmVkLmRhdGFiYXNlO1xuICBwcm9jZXNzLmVudi5QR1BPUlQgPz89IFN0cmluZyhyZXNvbHZlZC5wb3J0KTtcbiAgcHJvY2Vzcy5lbnYuUEdTU0xNT0RFID8/PSByZXNvbHZlZC5zc2xNb2RlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGNvbm5lY3Rpb24gQU5EIGFwcGx5IGV2ZXJ5IFBvc3RncmVzIGVudiB2YXIgYSBMYWtlYmFzZSBwb29sIG5lZWRzLFxuICogcmV0dXJuaW5nIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uIHBsdXMgdGhlIHVzZXJuYW1lIHRoYXQgd2FzIGFwcGxpZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgd2hvbGUgc2V0LCB3aGljaCBpcyB0aGUgcG9pbnQgb2YgaGF2aW5nIG9uZSBmdW5jdGlvbiBmb3IgaXQ6XG4gKiBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRocm93cyB1bmxlc3MgYExBS0VCQVNFX0VORFBPSU5UYCwgYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsICoqYW5kKiogYSB1c2VybmFtZSAoYFBHVVNFUmAsIG9yIGBEQVRBQlJJQ0tTX0NMSUVOVF9JRGAgZm9yIGFcbiAqIHNlcnZpY2UgcHJpbmNpcGFsKSBhcmUgYWxsIHByZXNlbnQsIGFuZCBhIERhdGFicmlja3MgQXBwIGBwb3N0Z3Jlc2AgcmVzb3VyY2VcbiAqIGJpbmRpbmcgc3VwcGxpZXMgb25seSB0aGUgZmlyc3QuIEFueXRoaW5nIHRoYXQgd2FudHMgYSB3b3JraW5nIHBvb2wgLSB0aGVcbiAqIGBsYWtlYmFzZWAgcGx1Z2luLCBvciBBcHBLaXQncyBQRVJTSVNURU5UIGNhY2hlLCB3aGljaCBxdWlldGx5IGRlZ3JhZGVzIHRvXG4gKiBpbi1tZW1vcnkgd2hlbiB0aGUgcG9vbCBjYW5ub3QgYmUgYnVpbHQgLSBuZWVkcyBhbGwgZm91ciwgc28gY2FsbGVycyBzaG91bGQgbm90XG4gKiBwYWlyIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdpdGggdGhlaXIgb3duIHVzZXJuYW1lIGxvb2t1cC5cbiAqXG4gKiBgUEdVU0VSYCBpcyBhcHBsaWVkIHdpdGggYD8/PWAgbGlrZSB0aGUgcmVzdCwgc28gYW4gZXhwbGljaXRseSBjb25maWd1cmVkIHZhbHVlXG4gKiBzdGF5cyBhdXRob3JpdGF0aXZlLiBUaGUgbG9va3VwIHJldHVybnMgYHVuZGVmaW5lZGAgcmF0aGVyIHRoYW4gdGhyb3dpbmcgd2hlbiBpdFxuICogY2Fubm90IGRldGVybWluZSBhIHVzZXIsIGxlYXZpbmcgdGhlIHBvb2wgdG8gcmVzb2x2ZSBpdHMgb3duLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gRW5vdWdoIGZvciBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRvIGJ1aWxkIGEgcG9vbC5cbiAqIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgbGFrZWJhc2VSZXNvbHZlci5hcHBseUxha2ViYXNlRW52KHsgYXV0b0NyZWF0ZTogZmFsc2UgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUxha2ViYXNlRW52KFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8eyByZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uOyB1c2VyPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKGNvbmZpZywgc2lnbmFsKTtcbiAgYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCh7fSk7XG4gIGlmICh1c2VyKSBwcm9jZXNzLmVudi5QR1VTRVIgPz89IHVzZXI7XG4gIHJldHVybiB7IHJlc29sdmVkLCAuLi4odXNlciA/IHsgdXNlciB9IDoge30pIH07XG59XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50ID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ya3NwYWNlQ2xpZW50PjtcblxuLyoqIFRoZSBTREsgYENvbnRleHRgIGFjY2VwdGVkIGJ5IHRoZSB3b3Jrc3BhY2UgY2xpZW50J3Mgb3duIGNvcHkgb2YgdGhlIFNESy4gKi9cbnR5cGUgQXBpUmVxdWVzdENvbnRleHQgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPFdvcmtzcGFjZUNsaWVudFtcImFwaUNsaWVudFwiXVtcInJlcXVlc3RcIl0+WzFdPjtcblxuLyoqXG4gKiBBZGFwdCBhbiB7QGxpbmsgQWJvcnRTaWduYWx9IGludG8gdGhlIGFwaSBjbGllbnQncyBjYW5jZWxsYXRpb24gY29udGV4dC5cbiAqIEFwcEtpdCByZXNvbHZlcyBhIGRpZmZlcmVudCBjb3B5IG9mIGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYCB0aGFuIHRoaXNcbiAqIHBhY2thZ2UgZG9lcywgYW5kIGBDb250ZXh0YCBjYXJyaWVzIGEgcHJpdmF0ZSBmaWVsZCwgc28gdGhlIHR3byBkZWNsYXJhdGlvbnNcbiAqIGFyZSBub21pbmFsbHkgaW5jb21wYXRpYmxlIGV2ZW4gdGhvdWdoIHRoZSBhcGkgY2xpZW50IG9ubHkgcmVhZHNcbiAqIGBjYW5jZWxsYXRpb25Ub2tlbmAgYW5kIGBsb2dnZXJgIG9mZiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXF1ZXN0Q29udGV4dChzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogQXBpUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2lnbmFsID8gKHRvQ29udGV4dChzaWduYWwpIGFzIHVua25vd24gYXMgQXBpUmVxdWVzdENvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgTGFrZWJhc2UgUkVTVCBib2R5LiBUaGUgZnVsbCBwYXlsb2FkIGlzIGxvZ2dlZCByYXRoZXIgdGhhbiB0aHJvd25cbiAqIHNvIGEgY2xpZW50IG5ldmVyIHJlY2VpdmVzIHVwc3RyZWFtIGRldGFpbC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VSZXNwb25zZTxUPihzY2hlbWE6IHouWm9kVHlwZTxUPiwgcGF0aDogc3RyaW5nLCBib2R5OiB1bmtub3duKTogVCB7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UoYm9keSk7XG4gIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IHVuZXhwZWN0ZWQgTGFrZWJhc2UgQVBJIHJlc3BvbnNlXCIsIHtcbiAgICBwYXRoLFxuICAgIGlzc3VlczogcGFyc2VkLmVycm9yLmlzc3VlcyxcbiAgfSk7XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkxha2ViYXNlIEFQSSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlXCIsIHsgY29udGV4dDogeyBwYXRoIH0gfSk7XG59XG5cbi8qKiBHRVQgaGVscGVyIHRoYXQgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkgYW5kIGZvcndhcmRzIGNhbmNlbGxhdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEpzb248VD4oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IHdzLmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgIHtcbiAgICAgIHBhdGgsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICByYXc6IGZhbHNlLFxuICAgIH0sXG4gICAgcmVxdWVzdENvbnRleHQoc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlUmVzcG9uc2Uoc2NoZW1hLCBwYXRoLCByZXMpO1xufVxuXG4vKiogUE9TVCBoZWxwZXIgZm9yIGNyZWF0ZSAvIG11dGF0ZSBjYWxsczsgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0SnNvbjxUPihcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGF0aDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgYm9keTogdW5rbm93bixcbiAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXMgPSBhd2FpdCB3cy5hcGlDbGllbnQucmVxdWVzdChcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHF1ZXJ5LFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0pLFxuICAgICAgcmF3OiBmYWxzZSxcbiAgICAgIHBheWxvYWQ6IGJvZHksXG4gICAgfSxcbiAgICByZXF1ZXN0Q29udGV4dChzaWduYWwpLFxuICApO1xuICByZXR1cm4gcGFyc2VSZXNwb25zZShzY2hlbWEsIHBhdGgsIHJlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9qZWN0cyh3czogV29ya3NwYWNlQ2xpZW50LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS9wcm9qZWN0c2AsIGxpc3RSZXNwb25zZVNjaGVtYSwgc2lnbmFsKTtcbiAgcmV0dXJuIHJlcy5wcm9qZWN0cyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdEJyYW5jaGVzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxCcmFuY2hbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmJyYW5jaGVzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RW5kcG9pbnRzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnRbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9lbmRwb2ludHNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZW5kcG9pbnRzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RGF0YWJhc2VzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RGF0YWJhc2VbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9kYXRhYmFzZXNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZGF0YWJhc2VzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgZW5kcG9pbnRJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnQ+IHtcbiAgcmV0dXJuIGdldEpzb24oXG4gICAgd3MsXG4gICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9L2VuZHBvaW50cy8ke2VuZHBvaW50SWR9YCxcbiAgICBlbmRwb2ludFNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG59XG5cbi8qKlxuICogU2NhbiB0aGUgd29ya3NwYWNlIGZvciBhbiBlbmRwb2ludCB3aG9zZSBgc3RhdHVzLmhvc3RzLmhvc3RgIG1hdGNoZXNcbiAqIHRoZSBwcm92aWRlZCBob3N0bmFtZS4gVXNlZCB0byByZWNvdmVyIHRoZSBvd25pbmcgcHJvamVjdC9icmFuY2gvXG4gKiBlbmRwb2ludCByZXNvdXJjZSBwYXRoIHdoZW4gdGhlIGNhbGxlciBvbmx5IHN1cHBsaWVkIGEgUG9zdGdyZXMgVVJJLlxuICpcbiAqIE8ocHJvamVjdHMgKiBicmFuY2hlcyAqIGVuZHBvaW50cykgLSBmaW5lIGZvciB0eXBpY2FsIHdvcmtzcGFjZXNcbiAqIChzaW5nbGUgZGlnaXRzIHBlciB0aWVyKTsgcGFnaW5hdGlvbiBpcyBpbnRlbnRpb25hbGx5IG5vdCBmb2xsb3dlZFxuICogc2luY2UgdGhpcyBpcyBhIGJlc3QtZWZmb3J0IGZhbGxiYWNrLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRW5kcG9pbnRCeUhvc3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIGhvc3Q6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgcHJvamVjdDogc3RyaW5nOyBicmFuY2g6IHN0cmluZzsgZW5kcG9pbnQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGxpc3RQcm9qZWN0cyh3cywgc2lnbmFsKTtcbiAgZm9yIChjb25zdCBwIG9mIHByb2plY3RzKSB7XG4gICAgY29uc3QgcHJvamVjdElkID0gcGFyc2VSZXNvdXJjZVBhdGgocC5uYW1lKS5wcm9qZWN0O1xuICAgIGlmICghcHJvamVjdElkKSBjb250aW51ZTtcbiAgICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IGxpc3RCcmFuY2hlcyh3cywgcHJvamVjdElkLCBzaWduYWwpO1xuICAgIGZvciAoY29uc3QgYiBvZiBicmFuY2hlcykge1xuICAgICAgY29uc3QgYnJhbmNoSWQgPSBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaDtcbiAgICAgIGlmICghYnJhbmNoSWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdElkLCBicmFuY2hJZCwgc2lnbmFsKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5ob3N0cz8uaG9zdCA9PT0gaG9zdCk7XG4gICAgICBpZiAobWF0Y2g/Lm5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBtYXRjaGVkIGVuZHBvaW50IGJ5IGhvc3RcIiwge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgZW5kcG9pbnQ6IG1hdGNoLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICAgICAgICBicmFuY2g6IGJyYW5jaElkLFxuICAgICAgICAgIGVuZHBvaW50OiBtYXRjaC5uYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IG5vIGVuZHBvaW50IG1hdGNoZWQgaG9zdFwiLCB7IGhvc3QgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHByb2plY3QgdG8gdXNlLCBvciBjcmVhdGUgb25lIHdoZW4gdGhlIHdvcmtzcGFjZSBpcyBlbXB0eS5cbiAqXG4gKiBTZWxlY3Rpb24gb3JkZXI6XG4gKiAxLiBFeGFjdGx5IG9uZSBwcm9qZWN0IGxpc3RlZCAtPiB1c2UgaXQuXG4gKiAyLiBaZXJvIHByb2plY3RzIEFORCBgYXV0b0NyZWF0ZSAhPT0gZmFsc2VgIC0+IGVuc3VyZSBhIHByb2plY3Qgd2l0aFxuICogICAgdGhlIHJlc29sdmVkIGlkIGV4aXN0cywgdGhlbiByZXR1cm4gaXRzIGlkLlxuICogMy4gWmVybyBwcm9qZWN0cyBBTkQgYGF1dG9DcmVhdGUgPT09IGZhbHNlYCAtPiB0aHJvdy5cbiAqIDQuIE11bHRpcGxlIHByb2plY3RzIC0+IHRocm93IHdpdGggdGhlIGNhbmRpZGF0ZSBsaXN0IChzZXRcbiAqICAgIGBjb25maWcucHJvamVjdGAgb3IgcGluIGEgcHJvamVjdCBpZCBpbiBgTEFLRUJBU0VfRU5EUE9JTlRgKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja09yQ3JlYXRlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgYXV0b0NyZWF0ZTogc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBsaXN0UHJvamVjdHMod3MsIHNpZ25hbCk7XG4gIGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBpZCA9IHBhcnNlUmVzb3VyY2VQYXRoKHByb2plY3RzWzBdIS5uYW1lKS5wcm9qZWN0O1xuICAgIGlmIChpZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiB1c2luZyBvbmx5IHByb2plY3RcIiwgeyBwcm9qZWN0OiBpZCB9KTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChhdXRvQ3JlYXRlID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiTGFrZWJhc2UgcHJvamVjdFwiLFxuICAgICAgICBcImF1dG9DcmVhdGUgaXMgZmFsc2U7IGNyZWF0ZSBhIHByb2plY3Qgb3Igc2V0IGNvbmZpZy5wcm9qZWN0IC8gTEFLRUJBU0VfRU5EUE9JTlQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGF1dG9DcmVhdGUgPz8gKGF3YWl0IGRlZmF1bHRQcm9qZWN0SWQoKSk7XG4gICAgcmV0dXJuIGVuc3VyZVByb2plY3Qod3MsIGlkLCBzaWduYWwpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBwcm9qZWN0c1xuICAgIC5tYXAoKHApID0+IHBhcnNlUmVzb3VyY2VQYXRoKHAubmFtZSkucHJvamVjdClcbiAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiBCb29sZWFuKGlkKSlcbiAgICAuam9pbihcIiwgXCIpO1xuICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgXCJMYWtlYmFzZVwiLFxuICAgIGBNdWx0aXBsZSBwcm9qZWN0cyBmb3VuZDsgc2V0IGNvbmZpZy5wcm9qZWN0IG9yIHBpbiBhIHByb2plY3QgaWQgaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICApO1xufVxuXG4vKipcbiAqIERlcml2ZSBhIExha2ViYXNlIHByb2plY3QgaWQgZnJvbSB0aGUgaG9zdCByZXBvJ3MgYHBhY2thZ2UuanNvbmBcbiAqIG5hbWUgKHZpYSB7QGxpbmsgcHJvamVjdC5uYW1lfSkgc2x1Z2lmaWVkIHRvIHNhdGlzZnkgdGhlXG4gKiBMYWtlYmFzZSBpZCBjb25zdHJhaW50IChgXlthLXpdW2EtejAtOS1dezAsNjF9W2EtejAtOV0kYCkuXG4gKlxuICogVGhyb3dzIHdoZW4gdGhlIHNsdWcgZW5kcyB1cCBlbXB0eSBvciBzdGFydHMgd2l0aCBhIGRpZ2l0LCBzaW5jZSB0aGVcbiAqIHNlcnZlciB3b3VsZCByZWplY3QgaXQgYW55d2F5IC0gY2FsbGVycyBzaG91bGQgcGFzcyBhbiBleHBsaWNpdFxuICogYGF1dG9DcmVhdGVgIGlkIGluIHRoYXQgY2FzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFByb2plY3RJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBuYW1lID0gcHJvamVjdFV0aWxzLm5hbWUoKTtcbiAgY29uc3Qgc2x1ZyA9IHN0cmluZ1V0aWxzLnRvU2x1Z1dpdGhPcHRpb25zKHsgbWF4TGVuZ3RoOiBQUk9KRUNUX0lEX01BWF9MRU4gfSwgbmFtZSk7XG4gIGlmICghc2x1ZyB8fCAhL15bYS16XS8udGVzdChzbHVnKSkge1xuICAgIGxvZ2dlci53YXJuKFwiYXV0b3BnOiBwcm9qZWN0IG5hbWUgZG9lcyBub3Qgc2x1Z2lmeSB0byBhIExha2ViYXNlIHByb2plY3QgaWRcIiwgeyBuYW1lIH0pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIFwiQ291bGQgbm90IGRlcml2ZSBhIHByb2plY3QgaWQgZnJvbSB0aGUgcGFja2FnZSBuYW1lOyBwYXNzIGF1dG9DcmVhdGUgZXhwbGljaXRseS5cIixcbiAgICApO1xuICB9XG4gIHJldHVybiBzbHVnO1xufVxuXG4vKipcbiAqIEVuc3VyZSBhIExha2ViYXNlIHByb2plY3Qgd2l0aCBgcHJvamVjdElkYCBleGlzdHMuIENyZWF0ZXMgaXQgYW5kXG4gKiB3YWl0cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb24gdG8gY29tcGxldGUuIEFuIGBBTFJFQURZX0VYSVNUU2BcbiAqIHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgc3VjY2VzcyAtIHNvbWVvbmUgZWxzZSAoYSBjb25jdXJyZW50IGJvb3QsXG4gKiBhIHNpYmxpbmcgcHJvY2Vzcykgd29uIHRoZSByYWNlIGFuZCB0aGUgcHJvamVjdCB3ZSB3YW50ZWQgaXMgbm93XG4gKiBzaXR0aW5nIHRoZXJlIHJlYWR5IGZvciBkb3duc3RyZWFtIHBpY2tlcnMuXG4gKlxuICogUHJvamVjdCBjcmVhdGlvbiB0eXBpY2FsbHkgcHJvdmlzaW9ucyBhIGRlZmF1bHQgYHByb2R1Y3Rpb25gIGJyYW5jaFxuICogYWxvbmdzaWRlOyBkb3duc3RyZWFtIHBpY2tlcnMgaGFuZGxlIHRoZSByZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVQcm9qZWN0KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsb2dnZXIud2FybihcImF1dG9wZzogbm8gcHJvamVjdHMgZm91bmQ7IGNyZWF0aW5nXCIsIHsgcHJvamVjdDogcHJvamVjdElkIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IG9wID0gYXdhaXQgcG9zdEpzb24oXG4gICAgICB3cyxcbiAgICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0c2AsXG4gICAgICBvcGVyYXRpb25TY2hlbWEsXG4gICAgICB7IHNwZWM6IHsgcGdfdmVyc2lvbjogREVGQVVMVF9QR19WRVJTSU9OIH0gfSxcbiAgICAgIHsgcHJvamVjdF9pZDogcHJvamVjdElkIH0sXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgICBhd2FpdCB3YWl0Rm9yT3BlcmF0aW9uKHdzLCBvcCwgc2lnbmFsKTtcbiAgICBsb2dnZXIuaW5mbyhcImF1dG9wZzogY3JlYXRlZCBwcm9qZWN0XCIsIHsgcHJvamVjdDogcHJvamVjdElkIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIWlzQWxyZWFkeUV4aXN0c0Vycm9yKGVycikpIHRocm93IGVycjtcbiAgICBsb2dnZXIuaW5mbyhcImF1dG9wZzogcHJvamVjdCBhbHJlYWR5IGV4aXN0cyAocmFjZSk7IHByb2NlZWRpbmdcIiwge1xuICAgICAgcHJvamVjdDogcHJvamVjdElkLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwcm9qZWN0SWQ7XG59XG5cbi8qKlxuICogUmVjb2duaXplIHRoZSBEYXRhYnJpY2tzIFNESydzIGBBTFJFQURZX0VYSVNUU2AgZmFpbHVyZSBtb2RlcyBzbyBhXG4gKiBsb3N0IHJhY2UgZHVyaW5nIGBlbnN1cmVQcm9qZWN0YCBiZWNvbWVzIGEgbm8tb3AgaW5zdGVhZCBvZiBhbiBlcnJvci5cbiAqXG4gKiBUaGUgU0RLIHRocm93cyBgQXBpRXJyb3IgeyBlcnJvckNvZGUsIHN0YXR1c0NvZGUgfWAgZm9yIHN0cnVjdHVyZWRcbiAqIHNlcnZlciBlcnJvcnMgYW5kIGBIdHRwRXJyb3IgeyBjb2RlIH1gIGZvciB0cmFuc3BvcnQtbGF5ZXIgNHh4LzV4eC5cbiAqIEJvdGggc3VyZmFjZSBhIGh1bWFuIG1lc3NhZ2UgdGhhdCBvZnRlbiBjYXJyaWVzIFwiYWxyZWFkeSBleGlzdHNcIiBzb1xuICogd2UgdXNlIHRoYXQgYXMgYSBmaW5hbCBmYWxsYmFjayBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5mdW5jdGlvbiBpc0FscmVhZHlFeGlzdHNFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlID0gZXJyb3IgYXMge1xuICAgIHN0YXR1c0NvZGU/OiBudW1iZXI7XG4gICAgY29kZT86IG51bWJlcjtcbiAgICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgfTtcbiAgaWYgKGUuc3RhdHVzQ29kZSA9PT0gNDA5IHx8IGUuY29kZSA9PT0gNDA5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGUuZXJyb3JDb2RlICYmIC9hbHJlYWR5Lj9leGlzdHMvaS50ZXN0KGUuZXJyb3JDb2RlKSkgcmV0dXJuIHRydWU7XG4gIGlmIChlLm1lc3NhZ2UgJiYgL2FscmVhZHkuP2V4aXN0cy9pLnRlc3QoZS5tZXNzYWdlKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZWR1Y2UgYSBMYWtlYmFzZSBvcGVyYXRpb24gZmFpbHVyZSB0byBhbiBlcnJvciBzYWZlIHRvIHByb3BhZ2F0ZTogdGhlXG4gKiBvcGVyYXRpb24gbmFtZSBwbHVzIHdoYXRldmVyIGNvZGUgdGhlIHBheWxvYWQgY2Fycmllcy4gVGhlIHBheWxvYWQgaXRzZWxmIGNhblxuICogZWNobyByZXF1ZXN0IGNvbnRleHQsIHNvIGl0IGdvZXMgdG8gdGhlIGxvZyBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBvcGVyYXRpb25GYWlsZWQob3BOYW1lOiBzdHJpbmcsIG9wRXJyb3I6IHVua25vd24pOiBFeGVjdXRpb25FcnJvciB7XG4gIGxvZ2dlci5lcnJvcihcImF1dG9wZzogb3BlcmF0aW9uIGZhaWxlZFwiLCB7IG9wZXJhdGlvbjogb3BOYW1lLCBlcnJvcjogb3BFcnJvciB9KTtcbiAgY29uc3QgY29kZSA9IG9iamVjdC5pc1JlY29yZChvcEVycm9yKSA/IChvcEVycm9yLmNvZGUgPz8gb3BFcnJvci5yZWFzb24pIDogdW5kZWZpbmVkO1xuICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKGBMYWtlYmFzZSBvcGVyYXRpb24gZmFpbGVkOiAke29wTmFtZX1gLCB7XG4gICAgY29udGV4dDoge1xuICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICBlcnJvckNvZGU6IHR5cGVvZiBjb2RlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBjb2RlID09PSBcIm51bWJlclwiID8gU3RyaW5nKGNvZGUpIDogXCJ1bmtub3duXCIsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUG9sbCBhIExha2ViYXNlIGxvbmctcnVubmluZyBvcGVyYXRpb24gdW50aWwgYGRvbmU6IHRydWVgLiBSZXR1cm5zXG4gKiB0aGUgZmluYWwgb3BlcmF0aW9uIGVudmVsb3BlICh3aGljaCBtYXkgY2FycnkgYHJlc3BvbnNlYCBvciBgZXJyb3JgKS5cbiAqXG4gKiBUaHJvd3Mgd2hlbjpcbiAqICAgLSB0aGUgcmVzcG9uc2UgY2FycmllcyBhbiBgZXJyb3JgIGZpZWxkO1xuICogICAtIGBvcC5uYW1lYCBpcyBtaXNzaW5nIChub3RoaW5nIHRvIHBvbGwpO1xuICogICAtIHRoZSB0aW1lb3V0IGVsYXBzZXMgYmVmb3JlIGBkb25lOiB0cnVlYDtcbiAqICAgLSBgc2lnbmFsYCBhYm9ydHMgbWlkLXdhaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JPcGVyYXRpb24oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIG9wOiBPcGVyYXRpb24sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxPcGVyYXRpb24+IHtcbiAgaWYgKG9wLmRvbmUpIHtcbiAgICBpZiAob3AuZXJyb3IpIHtcbiAgICAgIHRocm93IG9wZXJhdGlvbkZhaWxlZChvcC5uYW1lID8/IFwidW5rbm93blwiLCBvcC5lcnJvcik7XG4gICAgfVxuICAgIHJldHVybiBvcDtcbiAgfVxuICBjb25zdCBvcE5hbWUgPSBvcC5uYW1lO1xuICBpZiAoIW9wTmFtZSkge1xuICAgIHRocm93IEV4ZWN1dGlvbkVycm9yLm1pc3NpbmdEYXRhKFwib3BlcmF0aW9uIG5hbWVcIik7XG4gIH1cbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgT1BFUkFUSU9OX1RJTUVPVVRfTVM7IGF0dGVtcHQrKykge1xuICAgIGF3YWl0IHBvbGxEZWxheShhdHRlbXB0LCBPUEVSQVRJT05fUE9MTF9NUywgc2lnbmFsKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgZ2V0SnNvbih3cywgYCR7QVBJX0JBU0V9LyR7b3BOYW1lfWAsIG9wZXJhdGlvblNjaGVtYSwgc2lnbmFsKTtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IG9wZXJhdGlvbiBzdGF0dXNcIiwgeyBvcDogb3BOYW1lLCBkb25lOiBjdXJyZW50LmRvbmUgfSk7XG4gICAgaWYgKGN1cnJlbnQuZG9uZSkge1xuICAgICAgaWYgKGN1cnJlbnQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgb3BlcmF0aW9uRmFpbGVkKG9wTmFtZSwgY3VycmVudC5lcnJvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBMYWtlYmFzZSBvcGVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZTogJHtvcE5hbWV9YCwge1xuICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBvcE5hbWUsIHRpbWVvdXRNczogT1BFUkFUSU9OX1RJTUVPVVRfTVMgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUG9sbCBgZ2V0RW5kcG9pbnRgIHVudGlsIHRoZSBjb21wdXRlIHJlcG9ydHMgYSB1c2FibGVcbiAqIGBzdGF0dXMuY3VycmVudF9zdGF0ZWAuIGBSRUFEWWAgYW5kIGBJRExFYCBhcmUgYm90aCBhY2NlcHRhYmxlIC1cbiAqIGBJRExFYCBqdXN0IG1lYW5zIHRoZSBjb21wdXRlIGhhcyBzY2FsZWQgdG8gemVybyBidXQgYSBjb25uZWN0aW9uXG4gKiB3aWxsIHdha2UgaXQuIFJldHVybnMgdGhlIGZpbmFsIGVuZHBvaW50IHBheWxvYWQgKHdpdGggYGhvc3RzLmhvc3RgKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEVuZHBvaW50UmVhZHkoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIGVuZHBvaW50SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IGxhc3Q6IEVuZHBvaW50IHwgbnVsbCA9IG51bGw7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBEYXRlLm5vdygpIC0gc3RhcnQgPCBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TOyBhdHRlbXB0KyspIHtcbiAgICBsYXN0ID0gYXdhaXQgZ2V0RW5kcG9pbnQod3MsIHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnRJZCwgc2lnbmFsKTtcbiAgICBjb25zdCBzdGF0ZSA9IGxhc3Quc3RhdHVzPy5jdXJyZW50X3N0YXRlO1xuICAgIGlmIChzdGF0ZSAmJiBDT05ORUNUQUJMRV9FTkRQT0lOVF9TVEFURVMuaGFzKHN0YXRlKSkgcmV0dXJuIGxhc3Q7XG4gICAgaWYgKGxhc3Quc3RhdHVzPy5ob3N0cz8uaG9zdCAmJiBzdGF0ZSAhPT0gSU5JVElBTElaSU5HX0VORFBPSU5UX1NUQVRFKSB7XG4gICAgICAvLyBDb21wdXRlIGlzIGluIHNvbWUgb3RoZXIgc3RhdGUgKFNUQVJUSU5HLCBldGMuKSBidXQgaG9zdG5hbWUgaXNcbiAgICAgIC8vIGFscmVhZHkgcHVibGlzaGVkIC0gZ29vZCBlbm91Z2ggdG8gY29ubmVjdDsgbGFrZWJhc2UncyBPQXV0aFxuICAgICAgLy8gdG9rZW4gcmVxdWVzdCB3aWxsIHdha2UgaXQuXG4gICAgICByZXR1cm4gbGFzdDtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiB3YWl0aW5nIGZvciBlbmRwb2ludFwiLCB7IGVuZHBvaW50SWQsIHN0YXRlIH0pO1xuICAgIGF3YWl0IHBvbGxEZWxheShhdHRlbXB0LCBFTkRQT0lOVF9SRUFEWV9QT0xMX01TLCBzaWduYWwpO1xuICB9XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2UgZW5kcG9pbnQgZGlkIG5vdCBiZWNvbWUgcmVhZHk6ICR7ZW5kcG9pbnRJZH1gLCB7XG4gICAgY29udGV4dDoge1xuICAgICAgcHJvamVjdCxcbiAgICAgIGJyYW5jaCxcbiAgICAgIGVuZHBvaW50SWQsXG4gICAgICB0aW1lb3V0TXM6IEVORFBPSU5UX1JFQURZX1RJTUVPVVRfTVMsXG4gICAgICBsYXN0U3RhdGU6IGxhc3Q/LnN0YXR1cz8uY3VycmVudF9zdGF0ZSA/PyBcInVua25vd25cIixcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBkZWZhdWx0IGJyYW5jaCBmb3IgYSBwcm9qZWN0LiBQcmVmZXJzIHRoZSBicmFuY2ggZmxhZ2dlZFxuICogYHN0YXR1cy5kZWZhdWx0OiB0cnVlYCAoc2VydmVyLXNpZGUgZGVmYXVsdCwgdHlwaWNhbGx5IGBwcm9kdWN0aW9uYFxuICogdW5sZXNzIHRoZSBwcm9qZWN0IG93bmVyIGNoYW5nZWQgaXQpLiBGYWxscyBiYWNrIHRvIHRoZSBvbmx5IGJyYW5jaFxuICogd2hlbiB0aGVyZSdzIGV4YWN0bHkgb25lLiBPdGhlcndpc2UgdGhyb3dzIHdpdGggdGhlIGNhbmRpZGF0ZSBsaXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrQnJhbmNoKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYnJhbmNoZXMgPSBhd2FpdCBsaXN0QnJhbmNoZXMod3MsIHByb2plY3QsIHNpZ25hbCk7XG4gIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBMYWtlYmFzZSBicmFuY2ggaW4gcHJvamVjdCAnJHtwcm9qZWN0fSdgLFxuICAgICAgXCJUaGUgcHJvamVjdCBoYXMgbm8gYnJhbmNoZXM7IGNyZWF0ZSBvbmUgb3Igc2V0IGNvbmZpZy5icmFuY2guXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbGFnZ2VkID0gYnJhbmNoZXMuZmluZCgoYikgPT4gYi5zdGF0dXM/LmRlZmF1bHQgPT09IHRydWUpO1xuICBjb25zdCBjaG9pY2UgPVxuICAgIHBhcnNlUmVzb3VyY2VQYXRoKGZsYWdnZWQ/Lm5hbWUpLmJyYW5jaCA/P1xuICAgIChicmFuY2hlcy5sZW5ndGggPT09IDEgPyBwYXJzZVJlc291cmNlUGF0aChicmFuY2hlc1swXSEubmFtZSkuYnJhbmNoIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFjaG9pY2UpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gYnJhbmNoZXNcbiAgICAgIC5tYXAoKGIpID0+IHBhcnNlUmVzb3VyY2VQYXRoKGIubmFtZSkuYnJhbmNoKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gQm9vbGVhbihpZCkpXG4gICAgICAuam9pbihcIiwgXCIpO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIGBQcm9qZWN0ICcke3Byb2plY3R9JyBoYXMgbXVsdGlwbGUgYnJhbmNoZXMgYW5kIG5vbmUgbWFya2VkIGRlZmF1bHQ7IHNldCBjb25maWcuYnJhbmNoIG9yIGluY2x1ZGUgdGhlIGJyYW5jaCBpbiBMQUtFQkFTRV9FTkRQT0lOVC4gQ2FuZGlkYXRlczogJHtjYW5kaWRhdGVzfWAsXG4gICAgKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHJlc29sdmVkIGJyYW5jaFwiLCB7IHByb2plY3QsIGJyYW5jaDogY2hvaWNlIH0pO1xuICByZXR1cm4gY2hvaWNlO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHByaW1hcnkgZW5kcG9pbnQgZm9yIGEgKHByb2plY3QsIGJyYW5jaCkuIFByZWZlcnNcbiAqIGBzdGF0dXMuZW5kcG9pbnRfdHlwZSA9PT0gRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFYDsgZmFsbHMgYmFjayB0b1xuICogdGhlIG9ubHkgZW5kcG9pbnQgd2hlbiB0aGVyZSdzIGV4YWN0bHkgb25lLiBSZXR1cm5zIGB7IG5hbWUsIGhvc3QgfWBcbiAqIHNvIHRoZSBjYWxsZXIgY2FuIHBvcHVsYXRlIGJvdGggYExBS0VCQVNFX0VORFBPSU5UYCBhbmQgYFBHSE9TVGBcbiAqIGZyb20gYSBzaW5nbGUgY2FsbC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0VuZHBvaW50KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGhvc3Q/OiBzdHJpbmcgfT4ge1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0RW5kcG9pbnRzKHdzLCBwcm9qZWN0LCBicmFuY2gsIHNpZ25hbCk7XG4gIGlmIChlbmRwb2ludHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgTGFrZWJhc2UgZW5kcG9pbnQgaW4gJ3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9J2AsXG4gICAgICBcIlRoZSBicmFuY2ggaGFzIG5vIGVuZHBvaW50czsgY3JlYXRlIG9uZSBvciBzZXQgTEFLRUJBU0VfRU5EUE9JTlQuXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID1cbiAgICBlbmRwb2ludHMuZmluZCgoZSkgPT4gZS5zdGF0dXM/LmVuZHBvaW50X3R5cGUgPT09IFJFQURfV1JJVEVfRU5EUE9JTlRfVFlQRSkgPz9cbiAgICAoZW5kcG9pbnRzLmxlbmd0aCA9PT0gMSA/IGVuZHBvaW50c1swXSA6IHVuZGVmaW5lZCk7XG4gIGlmICghcHJpbWFyeT8ubmFtZSkge1xuICAgIGNvbnN0IG5hbWVzID0gZW5kcG9pbnRzLm1hcCgoZSkgPT4gZS5uYW1lKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJMYWtlYmFzZVwiLFxuICAgICAgYEJyYW5jaCBoYXMgbm8gcHJpbWFyeSByZWFkLXdyaXRlIGVuZHBvaW50OyBzZXQgTEFLRUJBU0VfRU5EUE9JTlQgb3IgY29uZmlnLmVuZHBvaW50LiBDYW5kaWRhdGVzOiAke25hbWVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICk7XG4gIH1cbiAgY29uc3QgaG9zdCA9IHByaW1hcnkuc3RhdHVzPy5ob3N0cz8uaG9zdDtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBlbmRwb2ludFwiLCB7IGVuZHBvaW50OiBwcmltYXJ5Lm5hbWUsIGhvc3QgfSk7XG4gIHJldHVybiB7IG5hbWU6IHByaW1hcnkubmFtZSwgaG9zdCB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGRlZmF1bHQgcG9zdGdyZXMgZGF0YWJhc2UgZm9yIGEgKHByb2plY3QsIGJyYW5jaCkuIFRoZVxuICogUG9zdGdyZXMgZGF0YWJhc2UgTkFNRSAoYHN0YXR1cy5wb3N0Z3Jlc19kYXRhYmFzZWApIGlzIHdoYXRcbiAqIGBQR0RBVEFCQVNFYCBuZWVkcyAtIHRoaXMgZGlmZmVycyBmcm9tIHRoZSByZXNvdXJjZSBpZCwgd2hpY2ggY2FuXG4gKiB1c2UgYSBkaWZmZXJlbnQgc2VwYXJhdG9yIChlLmcuIHJlc291cmNlIGBkYXRhYnJpY2tzLXBvc3RncmVzYFxuICogc3VyZmFjZXMgYXMgZGF0YWJhc2UgYGRhdGFicmlja3NfcG9zdGdyZXNgKS4gUHJlZmVyc1xuICogYGRhdGFicmlja3NfcG9zdGdyZXNgICh0aGUgTGFrZWJhc2UgZGVmYXVsdCksIG90aGVyd2lzZSB0aGUgb25seVxuICogZGF0YWJhc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tEYXRhYmFzZShcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkYXRhYmFzZXMgPSBhd2FpdCBsaXN0RGF0YWJhc2VzKHdzLCBwcm9qZWN0LCBicmFuY2gsIHNpZ25hbCk7XG4gIGlmIChkYXRhYmFzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgTGFrZWJhc2UgZGF0YWJhc2UgaW4gJ3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9J2AsXG4gICAgICBcIlRoZSBicmFuY2ggaGFzIG5vIGRhdGFiYXNlczsgY3JlYXRlIG9uZSBvciBzZXQgUEdEQVRBQkFTRS5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IG5hbWVzID0gZGF0YWJhc2VzXG4gICAgLm1hcCgoZCkgPT4gZC5zdGF0dXM/LnBvc3RncmVzX2RhdGFiYXNlKVxuICAgIC5maWx0ZXIoKG4pOiBuIGlzIHN0cmluZyA9PiBCb29sZWFuKG4pKTtcbiAgY29uc3QgY2hvaWNlID1cbiAgICBuYW1lcy5maW5kKChuKSA9PiBuID09PSBERUZBVUxUX0RBVEFCQVNFKSA/PyAobmFtZXMubGVuZ3RoID09PSAxID8gbmFtZXNbMF0gOiB1bmRlZmluZWQpO1xuICBpZiAoIWNob2ljZSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIGBNdWx0aXBsZSBkYXRhYmFzZXMgYW5kIG5vICcke0RFRkFVTFRfREFUQUJBU0V9Jzsgc2V0IFBHREFUQUJBU0Ugb3IgY29uZmlnLmRhdGFiYXNlLiBDYW5kaWRhdGVzOiAke25hbWVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBkYXRhYmFzZVwiLCB7IGRhdGFiYXNlOiBjaG9pY2UgfSk7XG4gIHJldHVybiBjaG9pY2U7XG59XG4iXX0=
730
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEdBQUcsRUFDSCxNQUFNLEVBQ04sT0FBTyxJQUFJLGFBQWEsRUFDeEIsV0FBVyxHQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsWUFBWSxJQUFJLGtCQUFrQixFQUNsQyxTQUFTLEdBR1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDL0MsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzFCLE1BQU0sZ0JBQWdCLEdBQVksU0FBUyxDQUFDO0FBQzVDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLDhEQUE4RDtBQUM5RCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDaEMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQzdDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLDhFQUE4RTtBQUM5RSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUNqQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyx1RkFBdUY7QUFDdkYsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFDOUIsZ0VBQWdFO0FBQ2hFLE1BQU0sd0JBQXdCLEdBQUcsMEJBQTBCLENBQUM7QUFDNUQsNEVBQTRFO0FBQzVFLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvRCx1RUFBdUU7QUFDdkUsTUFBTSwyQkFBMkIsR0FBRyxjQUFjLENBQUM7QUFDbkQscURBQXFEO0FBQ3JELE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUM7QUE0Qi9DOzs7Ozs7R0FNRztBQUNILE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDN0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUM7Q0FDMUUsQ0FBQyxDQUFDO0FBR0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QixJQUFJLEVBQUUsQ0FBQztTQUNKLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyw4REFBOEQsQ0FBQztJQUMzRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQztJQUNoRixNQUFNLEVBQUUsQ0FBQztTQUNOLE1BQU0sQ0FBQztRQUNOLGFBQWEsRUFBRSxDQUFDO2FBQ2IsTUFBTSxFQUFFO2FBQ1IsUUFBUSxFQUFFO2FBQ1YsUUFBUSxDQUFDLGtEQUFrRCxDQUFDO1FBQy9ELEtBQUssRUFBRSxDQUFDO2FBQ0wsTUFBTSxDQUFDO1lBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUM7WUFDbEUsY0FBYyxFQUFFLENBQUM7aUJBQ2QsTUFBTSxFQUFFO2lCQUNSLFFBQVEsRUFBRTtpQkFDVixRQUFRLENBQUMsMENBQTBDLENBQUM7U0FDeEQsQ0FBQzthQUNELFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyx5REFBeUQsQ0FBQztRQUN0RSxhQUFhLEVBQUUsQ0FBQzthQUNiLE1BQU0sRUFBRTthQUNSLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyx1RUFBdUUsQ0FBQztLQUNyRixDQUFDO1NBQ0QsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLHdFQUF3RSxDQUFDO0NBQ3RGLENBQUMsQ0FBQztBQUdILE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0RBQWdELENBQUM7SUFDdEYsTUFBTSxFQUFFLENBQUM7U0FDTixNQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsQ0FBQzthQUNQLE9BQU8sRUFBRTthQUNULFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyw0REFBNEQsQ0FBQztRQUN6RSxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQztLQUM1RixDQUFDO1NBQ0QsUUFBUSxFQUFFO0NBQ2QsQ0FBQyxDQUFDO0FBR0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QixJQUFJLEVBQUUsQ0FBQztTQUNKLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyw4REFBOEQsQ0FBQztJQUMzRSxNQUFNLEVBQUUsQ0FBQztTQUNOLE1BQU0sQ0FBQztRQUNOLGlCQUFpQixFQUFFLENBQUM7YUFDakIsTUFBTSxFQUFFO2FBQ1IsUUFBUSxFQUFFO2FBQ1YsUUFBUSxDQUNQLG9GQUFvRixDQUNyRjtLQUNKLENBQUM7U0FDRCxRQUFRLEVBQUU7Q0FDZCxDQUFDLENBQUM7QUFHSDs7Ozs7R0FLRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsQyxlQUFlLEVBQUUsQ0FBQztTQUNmLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyxrREFBa0QsQ0FBQztJQUMvRCxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDM0MsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzFDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUM3QyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDOUMsQ0FBQyxDQUFDO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQztJQUNoRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQztJQUM3RSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxrREFBa0QsQ0FBQztJQUMxRixRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxzREFBc0QsQ0FBQztDQUNsRyxDQUFDLENBQUM7QUFHSCxvREFBb0Q7QUFDcEQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQztBQUUvQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFrQztJQUMxRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUNoQyxRQUFRLEVBQ1IsS0FBSyxFQUNMLDRCQUE0QixXQUFXLENBQUMsWUFBWSxFQUFFLENBQ3ZELENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUF5QjtJQUNwRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixNQUFNLGVBQWUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFlLEVBQUUsTUFBYztJQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsSUFBSSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRixNQUFNLE1BQU0sR0FBRyxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBZSxFQUFFLE1BQWMsRUFBRSxNQUFvQjtJQUM3RSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxNQUErQjtJQUUvQixNQUFNLGFBQWEsR0FBRyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDL0QsTUFBTSxVQUFVLEdBQ2QsTUFBTSxFQUFFLFFBQVE7UUFDaEIsV0FBVyxDQUFDLFlBQVksQ0FDdEIsYUFBYSxDQUFDLDBCQUEwQixDQUFDLGdCQUFnQixFQUN6RCxhQUFhLENBQ2QsQ0FBQztJQUNKLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM3RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN0RixNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU87UUFDMUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU07UUFDdkMsZ0VBQWdFO1FBQ2hFLG1FQUFtRTtRQUNuRSx1Q0FBdUM7UUFDdkMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQ3pCLFFBQVEsRUFDTixNQUFNLEVBQUUsUUFBUSxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRO1FBQzlGLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJO1FBQ3RGLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSTtRQUM1QyxPQUFPLEVBQUUsaUJBQWlCLElBQUksVUFBVSxJQUFJLGFBQWE7UUFDekQsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVO0tBQy9CLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsTUFBK0IsRUFDL0IsTUFBb0I7SUFFcEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLGdCQUFnQixDQUFDO0lBRWpFLGtFQUFrRTtJQUNsRSxtRUFBbUU7SUFDbkUsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sS0FBSyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxjQUFjLENBQUMsTUFBTSxDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsT0FBTyxLQUFLLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDbkMsTUFBTSxLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN0QyxRQUFRLEdBQUcsY0FBYyxDQUFDLGtCQUFrQixDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVELE1BQU0sRUFBRSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLG9FQUFvRTtJQUNwRSxnRUFBZ0U7SUFDaEUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixNQUFNLEtBQUssR0FBRyxNQUFNLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFFBQVEsS0FBSyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRyxNQUFNLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxFQUFFLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0QsUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDbkIsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksY0FBYyxDQUFDLE9BQU8sSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqRixNQUFNLEVBQUUsR0FBRyxNQUFNLGlCQUFpQixDQUNoQyxFQUFFLEVBQ0YsY0FBYyxDQUFDLE9BQU8sRUFDdEIsY0FBYyxDQUFDLE1BQU0sRUFDckIsY0FBYyxDQUFDLFVBQVUsRUFDekIsTUFBTSxDQUNQLENBQUM7WUFDRixJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFFBQTRCO0lBQzdELElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLGdCQUFnQixDQUFDLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUMvRixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSTtRQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDeEQsSUFBSSxRQUFRLENBQUMsUUFBUTtRQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDcEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsT0FBTyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLE1BQStCLEVBQy9CLE1BQW9CO0lBRXBCLE1BQU0sUUFBUSxHQUFHLE1BQU0seUJBQXlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEQsSUFBSSxJQUFJO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQ3RDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBT0Q7Ozs7OztHQU1HO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBK0I7SUFDckQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFFLFNBQVMsQ0FBQyxNQUFNLENBQWtDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNsRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQUksTUFBb0IsRUFBRSxJQUFZLEVBQUUsSUFBYTtJQUN6RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksTUFBTSxDQUFDLE9BQU87UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDdkMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRTtRQUN2RCxJQUFJO1FBQ0osTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTTtLQUM1QixDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksY0FBYyxDQUFDLDhDQUE4QyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2xHLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsS0FBSyxVQUFVLE9BQU8sQ0FDcEIsRUFBbUIsRUFDbkIsSUFBWSxFQUNaLE1BQW9CLEVBQ3BCLE1BQW9CO0lBRXBCLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQ3BDO1FBQ0UsSUFBSTtRQUNKLE1BQU0sRUFBRSxLQUFLO1FBQ2IsT0FBTyxFQUFFLElBQUksT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUM7UUFDcEQsR0FBRyxFQUFFLEtBQUs7S0FDWCxFQUNELGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FDdkIsQ0FBQztJQUNGLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxLQUFLLFVBQVUsUUFBUSxDQUNyQixFQUFtQixFQUNuQixJQUFZLEVBQ1osTUFBb0IsRUFDcEIsSUFBYSxFQUNiLEtBQThCLEVBQzlCLE1BQW9CO0lBRXBCLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQ3BDO1FBQ0UsSUFBSTtRQUNKLE1BQU0sRUFBRSxNQUFNO1FBQ2QsS0FBSztRQUNMLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQztZQUNuQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkMsQ0FBQztRQUNGLEdBQUcsRUFBRSxLQUFLO1FBQ1YsT0FBTyxFQUFFLElBQUk7S0FDZCxFQUNELGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FDdkIsQ0FBQztJQUNGLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELEtBQUssVUFBVSxZQUFZLENBQUMsRUFBbUIsRUFBRSxNQUFvQjtJQUNuRSxNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRixPQUFPLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUN6QixFQUFtQixFQUNuQixPQUFlLEVBQ2YsTUFBb0I7SUFFcEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQ3ZCLEVBQUUsRUFDRixHQUFHLFFBQVEsYUFBYSxPQUFPLFdBQVcsRUFDMUMsa0JBQWtCLEVBQ2xCLE1BQU0sQ0FDUCxDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsRUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxNQUFvQjtJQUVwQixNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FDdkIsRUFBRSxFQUNGLEdBQUcsUUFBUSxhQUFhLE9BQU8sYUFBYSxNQUFNLFlBQVksRUFDOUQsa0JBQWtCLEVBQ2xCLE1BQU0sQ0FDUCxDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBRUQsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsRUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxNQUFvQjtJQUVwQixNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FDdkIsRUFBRSxFQUNGLEdBQUcsUUFBUSxhQUFhLE9BQU8sYUFBYSxNQUFNLFlBQVksRUFDOUQsa0JBQWtCLEVBQ2xCLE1BQU0sQ0FDUCxDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBRUQsS0FBSyxVQUFVLFdBQVcsQ0FDeEIsRUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxVQUFrQixFQUNsQixNQUFvQjtJQUVwQixPQUFPLE9BQU8sQ0FDWixFQUFFLEVBQ0YsR0FBRyxRQUFRLGFBQWEsT0FBTyxhQUFhLE1BQU0sY0FBYyxVQUFVLEVBQUUsRUFDNUUsY0FBYyxFQUNkLE1BQU0sQ0FDUCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUMvQixFQUFtQixFQUNuQixJQUFZLEVBQ1osTUFBb0I7SUFFcEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUztZQUFFLFNBQVM7UUFDekIsTUFBTSxRQUFRLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDbEQsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsU0FBUztZQUN4QixNQUFNLFNBQVMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2RSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDcEUsSUFBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUU7b0JBQy9DLElBQUk7b0JBQ0osUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNyQixDQUFDLENBQUM7Z0JBQ0gsT0FBTztvQkFDTCxPQUFPLEVBQUUsU0FBUztvQkFDbEIsTUFBTSxFQUFFLFFBQVE7b0JBQ2hCLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDckIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxLQUFLLFVBQVUsbUJBQW1CLENBQ2hDLEVBQW1CLEVBQ25CLFVBQXNDLEVBQ3RDLE1BQW9CO0lBRXBCLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN4RCxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMsa0JBQWtCLEVBQ2xCLGtGQUFrRixDQUNuRixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLFVBQVUsSUFBSSxDQUFDLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLFFBQVE7U0FDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDO1NBQzdDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxNQUFNLGtCQUFrQixDQUFDLGlCQUFpQixDQUN4QyxVQUFVLEVBQ1YscUdBQXFHLFVBQVUsRUFBRSxDQUNsSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEYsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RixNQUFNLGtCQUFrQixDQUFDLGlCQUFpQixDQUN4QyxVQUFVLEVBQ1Ysa0ZBQWtGLENBQ25GLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsRUFBbUIsRUFDbkIsU0FBaUIsRUFDakIsTUFBb0I7SUFFcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUN2QixFQUFFLEVBQ0YsR0FBRyxRQUFRLFdBQVcsRUFDdEIsZUFBZSxFQUNmLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFDNUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQ3pCLE1BQU0sQ0FDUCxDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7WUFBRSxNQUFNLEdBQUcsQ0FBQztRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxFQUFFO1lBQy9ELE9BQU8sRUFBRSxTQUFTO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLEtBQWM7SUFDMUMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsTUFBTSxDQUFDLEdBQUcsS0FLVCxDQUFDO0lBQ0YsSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN4RCxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyRSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsTUFBYyxFQUFFLE9BQWdCO0lBQ3ZELE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRixPQUFPLElBQUksY0FBYyxDQUFDLDhCQUE4QixNQUFNLEVBQUUsRUFBRTtRQUNoRSxPQUFPLEVBQUU7WUFDUCxTQUFTLEVBQUUsTUFBTTtZQUNqQixTQUFTLEVBQUUsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQzNGO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILEtBQUssVUFBVSxnQkFBZ0IsQ0FDN0IsRUFBbUIsRUFDbkIsRUFBYSxFQUNiLE1BQW9CO0lBRXBCLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLGVBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDdkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxjQUFjLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxHQUFHLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDM0UsTUFBTSxTQUFTLENBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsSUFBSSxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEYsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQixNQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxjQUFjLENBQUMsd0NBQXdDLE1BQU0sRUFBRSxFQUFFO1FBQ3pFLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFO0tBQ2hFLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FDOUIsRUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxVQUFrQixFQUNsQixNQUFvQjtJQUVwQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDekIsSUFBSSxJQUFJLEdBQW9CLElBQUksQ0FBQztJQUNqQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxHQUFHLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDaEYsSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQztRQUN6QyxJQUFJLEtBQUssSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksS0FBSyxLQUFLLDJCQUEyQixFQUFFLENBQUM7WUFDdEUsa0VBQWtFO1lBQ2xFLCtEQUErRDtZQUMvRCw4QkFBOEI7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsTUFBTSxJQUFJLGNBQWMsQ0FBQywyQ0FBMkMsVUFBVSxFQUFFLEVBQUU7UUFDaEYsT0FBTyxFQUFFO1lBQ1AsT0FBTztZQUNQLE1BQU07WUFDTixVQUFVO1lBQ1YsU0FBUyxFQUFFLHlCQUF5QjtZQUNwQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxhQUFhLElBQUksU0FBUztTQUNwRDtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxVQUFVLENBQ3ZCLEVBQW1CLEVBQ25CLE9BQWUsRUFDZixNQUFvQjtJQUVwQixNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QywrQkFBK0IsT0FBTyxHQUFHLEVBQ3pDLCtEQUErRCxDQUNoRSxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUNWLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNO1FBQ3ZDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sVUFBVSxHQUFHLFFBQVE7YUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO2FBQzVDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZCxNQUFNLGtCQUFrQixDQUFDLGlCQUFpQixDQUN4QyxVQUFVLEVBQ1YsWUFBWSxPQUFPLDhIQUE4SCxVQUFVLEVBQUUsQ0FDOUosQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUN6QixFQUFtQixFQUNuQixPQUFlLEVBQ2YsTUFBYyxFQUNkLE1BQW9CO0lBRXBCLE1BQU0sU0FBUyxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QyxrQ0FBa0MsT0FBTyxhQUFhLE1BQU0sR0FBRyxFQUMvRCxtRUFBbUUsQ0FDcEUsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FDWCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGFBQWEsS0FBSyx3QkFBd0IsQ0FBQztRQUMzRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbkIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxNQUFNLGtCQUFrQixDQUFDLGlCQUFpQixDQUN4QyxVQUFVLEVBQ1Ysb0dBQW9HLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdkgsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDekMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLEVBQW1CLEVBQ25CLE9BQWUsRUFDZixNQUFjLEVBQ2QsTUFBb0I7SUFFcEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxhQUFhLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkUsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sa0JBQWtCLENBQUMsZ0JBQWdCLENBQ3ZDLGtDQUFrQyxPQUFPLGFBQWEsTUFBTSxHQUFHLEVBQy9ELDREQUE0RCxDQUM3RCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLFNBQVM7U0FDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDO1NBQ3ZDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQ1YsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLGtCQUFrQixDQUFDLGlCQUFpQixDQUN4QyxVQUFVLEVBQ1YsOEJBQThCLGdCQUFnQixxREFBcUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN0SCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNoRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIHJlc29sdmVyLlxuICpcbiAqIFJlYWRzIHRoZSBzYW1lIGVudiB2YXJzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBjb25zdW1lcyAoYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsIGBQR1BPUlRgLCBgUEdTU0xNT0RFYCwgYExBS0VCQVNFX0VORFBPSU5UYCkgYW5kIGZpbGxzIGluXG4gKiB3aGljaGV2ZXIgcGllY2VzIGFyZSBtaXNzaW5nIHVzaW5nIHRoZSBMYWtlYmFzZSBBdXRvc2NhbGluZyBSRVNUIEFQSVxuICogdW5kZXIgYC9hcGkvMi4wL3Bvc3RncmVzL2AgdmlhIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQuXG4gKlxuICogYExBS0VCQVNFX0VORFBPSU5UYCAoYW5kIGBjb25maWcuZW5kcG9pbnRgKSBhY2NlcHQgYW55dGhpbmdcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzIC0gY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuIFRoZSByZXNvbHZlciBsYXllcnNcbiAqIHdoYXRldmVyIHBpZWNlcyBmYWxsIG91dCBvZiBwYXJzaW5nIHVuZGVyIGV4cGxpY2l0IGNvbmZpZyAvIGVudlxuICogdmFsdWVzLCB0aGVuIGZpbGxzIHRoZSByZW1haW5pbmcgZ2FwcyB2aWEgdGhlIEFQSTpcbiAqXG4gKiAgIDEuIFJldmVyc2UtbG9va3VwOiB3aGVuIGEgaG9zdCBpcyBrbm93biBidXQgbm8gcmVzb3VyY2UgcGF0aCBpcyxcbiAqICAgICAgc2NhbiBwcm9qZWN0cyAtPiBicmFuY2hlcyAtPiBlbmRwb2ludHMgZm9yIGEgbWF0Y2hpbmdcbiAqICAgICAgYHN0YXR1cy5ob3N0cy5ob3N0YCBhbmQgcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL2VuZHBvaW50LlxuICogICAyLiBQaWNrOiB3aGVuIGEgcHJvamVjdCBpcyBrbm93biBidXQgY2hpbGQgcmVzb3VyY2VzIGFyZW4ndCwgcHJlZmVyXG4gKiAgICAgIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IChgc3RhdHVzLmRlZmF1bHRgLCBgRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFYCxcbiAqICAgICAgYGRhdGFicmlja3NfcG9zdGdyZXNgKSBhbmQgZmFsbCBiYWNrIHRvIFwidGhlIG9ubHkgb25lXCIgd2hlbiBhXG4gKiAgICAgIGxpc3RpbmcgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQuXG4gKiAgIDMuIEF1dG8tY3JlYXRlOiB3aGVuIG5vIHByb2plY3RzIGV4aXN0IGF0IGFsbCwgY3JlYXRlIG9uZSB3aG9zZVxuICogICAgICBpZCBkZWZhdWx0cyB0byBgcHJvamVjdC5uYW1lKClgIHNsdWdpZmllZCAob3ZlcnJpZGVcbiAqICAgICAgd2l0aCBgY29uZmlnLmF1dG9DcmVhdGU6IFwibXktaWRcImAgb3IgZGlzYWJsZSB3aXRoXG4gKiAgICAgIGBjb25maWcuYXV0b0NyZWF0ZTogZmFsc2VgKS4gVGhlIGNyZWF0ZSBjYWxsIGlzIGlkZW1wb3RlbnQgLSBhblxuICogICAgICBgQUxSRUFEWV9FWElTVFNgIHJlc3BvbnNlIGZyb20gYSBjb25jdXJyZW50IGJvb3QgaXMgdHJlYXRlZCBhc1xuICogICAgICBzdWNjZXNzLiBUaGVuIHBvbGwgdGhlIGRlZmF1bHQgZW5kcG9pbnQgdW50aWwgaXQgcmVwb3J0c1xuICogICAgICBgY3VycmVudF9zdGF0ZWAgYFJFQURZYCBvciBgSURMRWAuXG4gKlxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VUb0Vudn0gd3JpdGVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0b1xuICogYHByb2Nlc3MuZW52YCBzbyB0aGUgZG93bnN0cmVhbSBgbGFrZWJhc2VgIHBsdWdpbiBwaWNrcyB0aGVtIHVwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2FwaS93b3Jrc3BhY2UvcG9zdGdyZXNcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0VXNlcm5hbWVXaXRoQXBpTG9va3VwLFxuICBnZXRXb3Jrc3BhY2VDbGllbnQsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnVXRpbHMsIHByb2plY3RVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBvcHRpb25zIGFzIHNoYXJlZE9wdGlvbnMsXG4gIHN0cmluZ1V0aWxzLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdG9Db250ZXh0IH0gZnJvbSBcIi4vZGF0YWJyaWNrcy50c1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VBZGRyZXNzLFxuICBwYXJzZVJlc291cmNlUGF0aCxcbiAgcGFyc2VTc2xNb2RlIGFzIHBhcnNlTmF0aXZlU3NsTW9kZSxcbiAgU1NMX01PREVTLFxuICB0eXBlIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyxcbiAgdHlwZSBTc2xNb2RlLFxufSBmcm9tIFwiLi9wZ2FkZHJlc3MudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImxha2ViYXNlLXJlc29sdmVyXCIpO1xuY29uc3QgQVBJX0JBU0UgPSBcIi9hcGkvMi4wL3Bvc3RncmVzXCI7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA1NDMyO1xuY29uc3QgREVGQVVMVF9TU0xfTU9ERTogU3NsTW9kZSA9IFwicmVxdWlyZVwiO1xuY29uc3QgREVGQVVMVF9QR19WRVJTSU9OID0gMTc7XG4vKiogTGFrZWJhc2UgcHJvamVjdCBpZHM6IGBeW2Etel1bYS16MC05LV17MCw2MX1bYS16MC05XSRgLiAqL1xuY29uc3QgUFJPSkVDVF9JRF9NQVhfTEVOID0gNjM7XG5jb25zdCBPUEVSQVRJT05fVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5jb25zdCBPUEVSQVRJT05fUE9MTF9NUyA9IDJfMDAwO1xuY29uc3QgRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5jb25zdCBFTkRQT0lOVF9SRUFEWV9QT0xMX01TID0gMl8wMDA7XG4vKiogQ2VpbGluZyBvbiBhIHNpbmdsZSBiYWNrb2ZmIHN0ZXAsIHNvIGEgbG9uZyB3YWl0IHN0aWxsIHBvbGxzIHJlZ3VsYXJseS4gKi9cbmNvbnN0IFBPTExfTUFYX0RFTEFZX01TID0gMTVfMDAwO1xuY29uc3QgUE9MTF9CQUNLT0ZGX0ZBQ1RPUiA9IDEuNTtcbi8qKiBGcmFjdGlvbiBvZiBlYWNoIGRlbGF5IGFwcGxpZWQgYXMgKy8tIGppdHRlciwgc28gY29uY3VycmVudCBib290cyBkZXN5bmNocm9uaXplLiAqL1xuY29uc3QgUE9MTF9KSVRURVJfUkFUSU8gPSAwLjI7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5lbmRwb2ludF90eXBlYCBmb3IgdGhlIHdyaXRhYmxlIHByaW1hcnkuICovXG5jb25zdCBSRUFEX1dSSVRFX0VORFBPSU5UX1RZUEUgPSBcIkVORFBPSU5UX1RZUEVfUkVBRF9XUklURVwiO1xuLyoqIEVuZHBvaW50IGBzdGF0dXMuY3VycmVudF9zdGF0ZWAgdmFsdWVzIHRoYXQgd2lsbCBhY2NlcHQgYSBjb25uZWN0aW9uLiAqL1xuY29uc3QgQ09OTkVDVEFCTEVfRU5EUE9JTlRfU1RBVEVTID0gbmV3IFNldChbXCJSRUFEWVwiLCBcIklETEVcIl0pO1xuLyoqIEVuZHBvaW50IGBzdGF0dXMuY3VycmVudF9zdGF0ZWAgYmVmb3JlIGEgaG9zdG5hbWUgaXMgbWVhbmluZ2Z1bC4gKi9cbmNvbnN0IElOSVRJQUxJWklOR19FTkRQT0lOVF9TVEFURSA9IFwiSU5JVElBTElaSU5HXCI7XG4vKiogTGFrZWJhc2UncyBvd24gZGVmYXVsdCBQb3N0Z3JlcyBkYXRhYmFzZSBuYW1lLiAqL1xuY29uc3QgREVGQVVMVF9EQVRBQkFTRSA9IFwiZGF0YWJyaWNrc19wb3N0Z3Jlc1wiO1xuXG4vKipcbiAqIFVzZXItc3VwcGxpZWQgTGFrZWJhc2UgaW5wdXRzIChjb25maWcgb3IgZW52KSBiZWZvcmUgYW55IEFQSSByZXNvbHV0aW9uLlxuICogRXh0ZW5kcyB7QGxpbmsgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzfSB3aXRoIHJlc29sdmVyLW9ubHkgb3B0aW9ucy5cbiAqIHtAbGluayByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9ufSBmaWxscyBnYXBzIGZyb20gdGhlIExha2ViYXNlIEFQSSB3aGVuXG4gKiBpdCBoYXMgZW5vdWdoIGNvbnRleHQgKHR5cGljYWxseSBhIGBwcm9qZWN0YCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VSZXNvbHZlcklucHV0cyBleHRlbmRzIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB7XG4gIC8qKiBBdXRoLXJlc29sdmVkIHByb2ZpbGUgdXNlZCBvbmx5IGZvciBEYXRhYnJpY2tzIGJ1bmRsZSB2YWxpZGF0aW9uLiAqL1xuICBidW5kbGVQcm9maWxlPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hhdCB0byBkbyB3aGVuIG5vIHByb2plY3QgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UgYXQgYWxsLlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogZGVyaXZlIGEgcHJvamVjdCBpZCBmcm9tXG4gICAqICAge0BsaW5rIHByb2plY3QubmFtZX0gKHRoZSBob3N0IHJlcG8ncyBgcGFja2FnZS5qc29uYFxuICAgKiAgIG5hbWUpIHNsdWdpZmllZCB0byBMYWtlYmFzZSBpZCBjb25zdHJhaW50cywgdGhlbiBjcmVhdGUgaXQuXG4gICAqIC0gYHN0cmluZ2A6IGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggdGhpcyBleGFjdCBpZC5cbiAgICogLSBgZmFsc2VgOiBza2lwIGNyZWF0aW9uIGFuZCB0aHJvdyB3aXRoIGEgY2xlYXIgZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIGF1dG9DcmVhdGU/OiBzdHJpbmcgfCBmYWxzZTtcbn1cblxuLyoqIEZ1bGx5LXJlc29sdmVkIExha2ViYXNlIFBvc3RncmVzIGNvbm5lY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlQ29ubmVjdGlvbiBleHRlbmRzIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB7XG4gIHBvcnQ6IG51bWJlcjtcbiAgc3NsTW9kZTogU3NsTW9kZTtcbn1cblxuLyoqXG4gKiBFdmVyeSBmaWVsZCBvZiB0aGUgTGFrZWJhc2UgUkVTVCBwYXlsb2FkcyBpcyBtb2RlbGxlZCBhcyBvcHRpb25hbCBhbmRcbiAqIHZhbGlkYXRlZCBhdCB0aGUgYm91bmRhcnkgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgd2l0aCBhIGNhc3Q6IHRoZSBwaWNrZXJzIGJlbG93XG4gKiBicmFuY2ggb24gYHN0YXR1cy4qYCwgYW5kIGEgc2hhcGUgY2hhbmdlIHVwc3RyZWFtIHNob3VsZCBzdXJmYWNlIGFzIG9uZSBsb3VkXG4gKiBlcnJvciBoZXJlIGluc3RlYWQgb2YgYW4gYHVuZGVmaW5lZGAgdGhyZWUgZnJhbWVzIGF3YXkuIEVudW0tc2hhcGVkIGZpZWxkc1xuICogc3RheSBgc3RyaW5nYCBzbyBhIG5ld2x5IGFkZGVkIHN0YXRlIGRvZXMgbm90IGZhaWwgdGhlIHdob2xlIHJlc3BvbnNlLlxuICovXG5jb25zdCBwcm9qZWN0U2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS5cIiksXG59KTtcbnR5cGUgUHJvamVjdCA9IHouaW5mZXI8dHlwZW9mIHByb2plY3RTY2hlbWE+O1xuXG5jb25zdCBlbmRwb2ludFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiRnVsbCByZXNvdXJjZSBwYXRoOiBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9L2VuZHBvaW50cy97ZX0uXCIpLFxuICB1aWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlN0YWJsZSBlbmRwb2ludCB1aWQgYXNzaWduZWQgYnkgTGFrZWJhc2UuXCIpLFxuICBzdGF0dXM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGVuZHBvaW50X3R5cGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIkVuZHBvaW50IHJvbGUsIHN1Y2ggYXMgRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFLlwiKSxcbiAgICAgIGhvc3RzOiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIldyaXRhYmxlIHByaW1hcnkgaG9zdG5hbWUuXCIpLFxuICAgICAgICAgIHJlYWRfb25seV9ob3N0OiB6XG4gICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAuZGVzY3JpYmUoXCJSZWFkLW9ubHkgcmVwbGljYSBob3N0bmFtZSB3aGVuIHByZXNlbnQuXCIpLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJSZXNvbHZlZCBob3N0bmFtZXMuIGhvc3RzLmhvc3QgaXMgdGhlIHdyaXRhYmxlIHByaW1hcnkuXCIpLFxuICAgICAgY3VycmVudF9zdGF0ZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQ29tcHV0ZSBzdGF0ZTogSU5JVElBTElaSU5HLCBTVEFSVElORywgUkVBRFksIElETEUsIGFuZCBsYXRlciB2YWx1ZXMuXCIpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJTZXJ2ZXItc2lkZSBzdGF0ZS4gUnVudGltZSBob3N0bmFtZXMgbGl2ZSBoZXJlLCBub3QgaW4gdGhlIHNwZWMgYmxvY2suXCIpLFxufSk7XG50eXBlIEVuZHBvaW50ID0gei5pbmZlcjx0eXBlb2YgZW5kcG9pbnRTY2hlbWE+O1xuXG5jb25zdCBicmFuY2hTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkZ1bGwgcmVzb3VyY2UgcGF0aDogcHJvamVjdHMve3B9L2JyYW5jaGVzL3tifS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZGVmYXVsdDogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIlRydWUgZm9yIHRoZSBwcm9qZWN0J3MgZGVmYXVsdCBicmFuY2gsIHN1Y2ggYXMgcHJvZHVjdGlvbi5cIiksXG4gICAgICBjdXJyZW50X3N0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJCcmFuY2ggY29tcHV0ZSBzdGF0ZSByZXBvcnRlZCBieSBMYWtlYmFzZS5cIiksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBCcmFuY2ggPSB6LmluZmVyPHR5cGVvZiBicmFuY2hTY2hlbWE+O1xuXG5jb25zdCBkYXRhYmFzZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiRnVsbCByZXNvdXJjZSBwYXRoOiBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9L2RhdGFiYXNlcy97ZH0uXCIpLFxuICBzdGF0dXM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIHBvc3RncmVzX2RhdGFiYXNlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJBY3R1YWwgUG9zdGdyZXMgZGF0YWJhc2UgbmFtZSB1c2VkIGFzIFBHREFUQUJBU0UuIE1heSBkaWZmZXIgZnJvbSB0aGUgcmVzb3VyY2UgaWQuXCIsXG4gICAgICAgICksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBEYXRhYmFzZSA9IHouaW5mZXI8dHlwZW9mIGRhdGFiYXNlU2NoZW1hPjtcblxuLyoqXG4gKiBMYWtlYmFzZSBSRVNUIGxpc3QgcmVzcG9uc2VzIGZvbGxvdyB0aGUgR29vZ2xlIEFJUCBjb252ZW50aW9uOlxuICogYHsgPHBsdXJhbC1yZXNvdXJjZT46IFRbXSwgbmV4dF9wYWdlX3Rva2VuPzogc3RyaW5nIH1gLiBXZSBvbmx5IHJlYWRcbiAqIHRoZSBmaXJzdCBwYWdlOyBmb3IgYXV0by1jb25maWcncyBcInBpY2sgc29tZXRoaW5nIHNlbnNpYmxlXCIgc2VtYW50aWNzIHRoZVxuICogY2FwIGlzIGZpbmUuXG4gKi9cbmNvbnN0IGxpc3RSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmV4dF9wYWdlX3Rva2VuOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJBSVAgcGFnZSB0b2tlbi4gT25seSB0aGUgZmlyc3QgcGFnZSBpcyBjb25zdW1lZC5cIiksXG4gIHByb2plY3RzOiB6LmFycmF5KHByb2plY3RTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGJyYW5jaGVzOiB6LmFycmF5KGJyYW5jaFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgZW5kcG9pbnRzOiB6LmFycmF5KGVuZHBvaW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICBkYXRhYmFzZXM6IHouYXJyYXkoZGF0YWJhc2VTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBMb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGVudmVsb3BlIHJldHVybmVkIGJ5IG11dGF0aW5nIFJFU1QgY2FsbHMuXG4gKiBgZG9uZTogdHJ1ZWAgbWVhbnMgdGVybWluYWw7IGNoZWNrIGBlcnJvcmAgYmVmb3JlIHJlYWRpbmcgYHJlc3BvbnNlYC5cbiAqL1xuY29uc3Qgb3BlcmF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJPcGVyYXRpb24gcmVzb3VyY2UgbmFtZS5cIiksXG4gIGRvbmU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyB0ZXJtaW5hbC5cIiksXG4gIGVycm9yOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgcGF5bG9hZCBwcmVzZW50IHdoZW4gdGhlIG9wZXJhdGlvbiBmYWlsZWQuXCIpLFxuICByZXNwb25zZTogei51bmtub3duKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlJlc3VsdCBwYXlsb2FkIHByZXNlbnQgd2hlbiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC5cIiksXG59KTtcbnR5cGUgT3BlcmF0aW9uID0gei5pbmZlcjx0eXBlb2Ygb3BlcmF0aW9uU2NoZW1hPjtcblxuLyoqIGBQR1BPUlRgIG11c3QgbGFuZCBpbnNpZGUgdGhlIFRDUCBwb3J0IHJhbmdlLiAqL1xuY29uc3QgcG9ydFNjaGVtYSA9IHNoYXJlZE9wdGlvbnMudGNwUG9ydFNjaGVtYTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGBQR1BPUlRgLXNoYXBlZCB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0LCBhbmQgdGhyb3dzXG4gKiBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG5hbWluZyBgUEdQT1JUYCBmb3IgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBUQ1BcbiAqIHBvcnQsIHNvIGEgdHlwbyBjYW5ub3QgcmVhY2ggdGhlIGNvbm5lY3Rpb24gcmVjb3JkIGFzIGBOYU5gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3J0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcG9ydFNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgIFwiUEdQT1JUXCIsXG4gICAgICB2YWx1ZSxcbiAgICAgIGBhIFRDUCBwb3J0IGJldHdlZW4gMSBhbmQgJHtjb25maWdVdGlscy5NQVhfVENQX1BPUlR9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZWQuZGF0YTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGBQR1NTTE1PREVgLXNoYXBlZCB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0LCBhbmRcbiAqIHRocm93cyBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG5hbWluZyBgUEdTU0xNT0RFYCBmb3IgYW4gdW5zdXBwb3J0ZWQgbW9kZVxuICogcmF0aGVyIHRoYW4gaGFuZGluZyBgcGdgIGEgdmFsdWUgaXQgd2lsbCByZWplY3QgYXQgY29ubmVjdCB0aW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTc2xNb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBTc2xNb2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTmF0aXZlU3NsTW9kZSh2YWx1ZSk7XG4gIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXCJQR1NTTE1PREVcIiwgdmFsdWUsIFNTTF9NT0RFUy5qb2luKFwiLCBcIikpO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogRGVsYXkgYmVmb3JlIHRoZSBuZXh0IHBvbGwgYXR0ZW1wdDogZXhwb25lbnRpYWwgYmFja29mZiBjYXBwZWQgYXRcbiAqIHtAbGluayBQT0xMX01BWF9ERUxBWV9NU30sIHBsdXMgaml0dGVyIHNvIHNldmVyYWwgYXBwcyBib290aW5nIGFnYWluc3QgdGhlXG4gKiBzYW1lIHdvcmtzcGFjZSBkbyBub3QgcmV0cnkgaW4gbG9ja3N0ZXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0UG9sbERlbGF5KGF0dGVtcHQ6IG51bWJlciwgYmFzZU1zOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBiYWNrb2ZmID0gTWF0aC5taW4oYmFzZU1zICogUE9MTF9CQUNLT0ZGX0ZBQ1RPUiAqKiBhdHRlbXB0LCBQT0xMX01BWF9ERUxBWV9NUyk7XG4gIGNvbnN0IGppdHRlciA9IGJhY2tvZmYgKiBQT0xMX0pJVFRFUl9SQVRJTyAqIChNYXRoLnJhbmRvbSgpICogMiAtIDEpO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChiYWNrb2ZmICsgaml0dGVyKSk7XG59XG5cbi8qKlxuICogV2FpdCBvdXQge0BsaW5rIG5leHRQb2xsRGVsYXl9IGJlZm9yZSB0aGUgbmV4dCBhdHRlbXB0LiBSZWplY3RzIHdpdGggdGhlXG4gKiBzaWduYWwncyByZWFzb24gd2hlbiB0aGUgY2FsbGVyIGNhbmNlbHMgbWlkLXdhaXQsIHNvIGEgcG9sbCBsb29wIHVud2luZHNcbiAqIGluc3RlYWQgb2YgZmluaXNoaW5nIGl0cyBiYWNrb2ZmIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbERlbGF5KGF0dGVtcHQ6IG51bWJlciwgYmFzZU1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luY1V0aWxzLnNsZWVwKG5leHRQb2xsRGVsYXkoYXR0ZW1wdCwgYmFzZU1zKSwgc2lnbmFsKTtcbn1cblxuLyoqXG4gKiBQdWxsIHJlc29sdmVyIGlucHV0cyBmcm9tIGBwcm9jZXNzLmVudmAsIHBhcnNlIHRoZSBhZGRyZXNzIGJsb2IsIGFuZFxuICogbGF5ZXIgZXhwbGljaXQgY29uZmlnIG9uIHRvcCB3aXRoIHRoaXMgcHJlY2VkZW5jZTpcbiAqXG4gKiAgIGBjb25maWcuPGZpZWxkPmAgPiBgY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlYCAoc2hhcmVkIGNvbmZpZyBzb3VyY2VzKSA+XG4gKiAgIHdoYXRldmVyIHtAbGluayBwYXJzZUFkZHJlc3N9IHJlY292ZXJlZCBmcm9tIHRoZVxuICogICBgZW5kcG9pbnRgIC8gYExBS0VCQVNFX0VORFBPSU5UYCBibG9iLlxuICpcbiAqIFNldCBgY29uZmlnLmVuZHBvaW50YCAob3IgYExBS0VCQVNFX0VORFBPSU5UYCkgdG8gYW55IGlucHV0XG4gKiB7QGxpbmsgcGFyc2VBZGRyZXNzfSB1bmRlcnN0YW5kczogY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTGFrZWJhc2VJbnB1dHMoXG4gIGNvbmZpZz86IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsXG4pOiBQcm9taXNlPExha2ViYXNlUmVzb2x2ZXJJbnB1dHM+IHtcbiAgY29uc3QgY29uZmlnT3B0aW9ucyA9IHsgYnVuZGxlUHJvZmlsZTogY29uZmlnPy5idW5kbGVQcm9maWxlIH07XG4gIGNvbnN0IHJhd0FkZHJlc3MgPVxuICAgIGNvbmZpZz8uZW5kcG9pbnQgPz9cbiAgICBjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXG4gICAgICBzaGFyZWRPcHRpb25zLmRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsXG4gICAgICBjb25maWdPcHRpb25zLFxuICAgICk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlQWRkcmVzcyhyYXdBZGRyZXNzKTtcbiAgY29uc3QgcG9ydEVudiA9IHBhcnNlUG9ydChjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXCJQR1BPUlRcIiwgY29uZmlnT3B0aW9ucykpO1xuICBjb25zdCBzc2xNb2RlRW52ID0gcGFyc2VTc2xNb2RlKGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIlBHU1NMTU9ERVwiLCBjb25maWdPcHRpb25zKSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRTc2xNb2RlID0gcGFyc2VTc2xNb2RlKGNvbmZpZz8uc3NsTW9kZSk7XG4gIGNvbnN0IHBhcnNlZFNzbE1vZGUgPSBwYXJzZVNzbE1vZGUocGFyc2VkLnNzbE1vZGUpO1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IGNvbmZpZz8ucHJvamVjdCA/PyBwYXJzZWQucHJvamVjdCxcbiAgICBicmFuY2g6IGNvbmZpZz8uYnJhbmNoID8/IHBhcnNlZC5icmFuY2gsXG4gICAgLy8gT25seSBjYW5vbmljYWwgZW5kcG9pbnQgcmVzb3VyY2UgcGF0aHMgc3Vydml2ZSBoZXJlOyBVUklzIGFuZFxuICAgIC8vIGJhcmUgaG9zdG5hbWVzIHNldCBgaG9zdGAgaW5zdGVhZCBhbmQgbGVhdmUgYGVuZHBvaW50YCB1bmRlZmluZWRcbiAgICAvLyB1bnRpbCB0aGUgUkVTVCByZXNvbHZlciBmaWxscyBpdCBpbi5cbiAgICBlbmRwb2ludDogcGFyc2VkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOlxuICAgICAgY29uZmlnPy5kYXRhYmFzZSA/PyBjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXCJQR0RBVEFCQVNFXCIsIGNvbmZpZ09wdGlvbnMpID8/IHBhcnNlZC5kYXRhYmFzZSxcbiAgICBob3N0OiBjb25maWc/Lmhvc3QgPz8gY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlKFwiUEdIT1NUXCIsIGNvbmZpZ09wdGlvbnMpID8/IHBhcnNlZC5ob3N0LFxuICAgIHBvcnQ6IGNvbmZpZz8ucG9ydCA/PyBwb3J0RW52ID8/IHBhcnNlZC5wb3J0LFxuICAgIHNzbE1vZGU6IGNvbmZpZ3VyZWRTc2xNb2RlID8/IHNzbE1vZGVFbnYgPz8gcGFyc2VkU3NsTW9kZSxcbiAgICBhdXRvQ3JlYXRlOiBjb25maWc/LmF1dG9DcmVhdGUsXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGZ1bGx5LXBvcHVsYXRlZCBQb3N0Z3JlcyBjb25uZWN0aW9uIHJlY29yZCBmcm9tIGNvbmZpZyArIGVudi5cbiAqXG4gKiBSZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQgbmV0d29yayB0cmFmZmljIHdoZW4gZW52IGFscmVhZHkgc3VwcGxpZXNcbiAqIGBlbmRwb2ludGAsIGBob3N0YCwgYW5kIGBkYXRhYmFzZWAuIE90aGVyd2lzZSBpc3N1ZXMgUkVTVCBjYWxscyBhbmRcbiAqIG1heSBhdXRvLWNyZWF0ZSBhIHByb2plY3QgKHNlZSBtb2R1bGUgZG9jc3RyaW5nKS5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIGV2ZXJ5IFJFU1QgY2FsbCBhbmQgaW50ZXItcG9sbCBzbGVlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbGFrZWJhc2VSZXNvbHZlciB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgbGFrZWJhc2VSZXNvbHZlci5yZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKFxuICogICB7IGF1dG9DcmVhdGU6IGZhbHNlIH0sXG4gKiAgIEFib3J0U2lnbmFsLnRpbWVvdXQoNjBfMDAwKSxcbiAqICk7XG4gKiBsYWtlYmFzZVJlc29sdmVyLmFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZCk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGNvbnN0IGlucHV0cyA9IGF3YWl0IHJlYWRMYWtlYmFzZUlucHV0cyhjb25maWcpO1xuICBsZXQgeyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCB9ID0gaW5wdXRzO1xuICBjb25zdCBwb3J0ID0gaW5wdXRzLnBvcnQgPz8gREVGQVVMVF9QT1JUO1xuICBjb25zdCBzc2xNb2RlID0gcGFyc2VTc2xNb2RlKGlucHV0cy5zc2xNb2RlKSA/PyBERUZBVUxUX1NTTF9NT0RFO1xuXG4gIC8vIFJlc291cmNlIHBhdGhzIG1heSBjYXJyeSByZWR1bmRhbnQgaW5mbzsgaGFydmVzdCBwcm9qZWN0L2JyYW5jaFxuICAvLyBmcm9tIGFueSBjYW5vbmljYWwgcGF0aCB0aGF0IHNudWNrIGluIHZpYSBQR0RBVEFCQVNFIG9yIHNpbWlsYXIuXG4gIGlmIChlbmRwb2ludCAmJiAoIXByb2plY3QgfHwgIWJyYW5jaCkpIHtcbiAgICBjb25zdCBwYXJzZWRFbmRwb2ludCA9IHBhcnNlQWRkcmVzcyhlbmRwb2ludCk7XG4gICAgcHJvamVjdCA/Pz0gcGFyc2VkRW5kcG9pbnQucHJvamVjdDtcbiAgICBicmFuY2ggPz89IHBhcnNlZEVuZHBvaW50LmJyYW5jaDtcbiAgfVxuICBpZiAoZGF0YWJhc2UgJiYgKCFwcm9qZWN0IHx8ICFicmFuY2gpKSB7XG4gICAgY29uc3QgcGFyc2VkRGF0YWJhc2UgPSBwYXJzZUFkZHJlc3MoZGF0YWJhc2UpO1xuICAgIHByb2plY3QgPz89IHBhcnNlZERhdGFiYXNlLnByb2plY3Q7XG4gICAgYnJhbmNoID8/PSBwYXJzZWREYXRhYmFzZS5icmFuY2g7XG4gICAgaWYgKHBhcnNlZERhdGFiYXNlLmRhdGFiYXNlUmVzb3VyY2VJZCkge1xuICAgICAgZGF0YWJhc2UgPSBwYXJzZWREYXRhYmFzZS5kYXRhYmFzZVJlc291cmNlSWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQWxyZWFkeSBjb21wbGV0ZTogc2tpcCBldmVyeSBSRVNUIGNhbGwuXG4gIGlmIChlbmRwb2ludCAmJiBob3N0ICYmIGRhdGFiYXNlKSB7XG4gICAgcmV0dXJuIHsgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgZGF0YWJhc2UsIGhvc3QsIHBvcnQsIHNzbE1vZGUgfTtcbiAgfVxuXG4gIGNvbnN0IHdzID0gZ2V0V29ya3NwYWNlQ2xpZW50KHt9KTtcblxuICAvLyBIb3N0IGtub3duIGJ1dCBubyByZXNvdXJjZSBwYXRoOiBzY2FuIHRoZSB3b3Jrc3BhY2UgdG8gZmluZCB3aGljaFxuICAvLyBlbmRwb2ludCBvd25zIHRoaXMgaG9zdCBzbyB3ZSBjYW4gcG9wdWxhdGUgTEFLRUJBU0VfRU5EUE9JTlQuXG4gIGlmICghcHJvamVjdCAmJiBob3N0KSB7XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kRW5kcG9pbnRCeUhvc3Qod3MsIGhvc3QsIHNpZ25hbCk7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICBwcm9qZWN0ID0gZm91bmQucHJvamVjdDtcbiAgICAgIGJyYW5jaCA9IGZvdW5kLmJyYW5jaDtcbiAgICAgIGVuZHBvaW50ID8/PSBmb3VuZC5lbmRwb2ludDtcbiAgICB9XG4gIH1cblxuICAvLyBObyBwcm9qZWN0IGFueXdoZXJlIGluIGNvbmZpZy9lbnYvYWRkcmVzczogbGlzdCwgcGljaywgb3IgY3JlYXRlLlxuICBpZiAoIXByb2plY3QpIHtcbiAgICBwcm9qZWN0ID0gYXdhaXQgcGlja09yQ3JlYXRlUHJvamVjdCh3cywgY29uZmlnPy5hdXRvQ3JlYXRlLCBzaWduYWwpO1xuICB9XG5cbiAgaWYgKCFicmFuY2gpIHtcbiAgICBicmFuY2ggPSBhd2FpdCBwaWNrQnJhbmNoKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICB9XG5cbiAgaWYgKCFlbmRwb2ludCkge1xuICAgIGNvbnN0IGVwID0gYXdhaXQgcGlja0VuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIHNpZ25hbCk7XG4gICAgZW5kcG9pbnQgPSBlcC5uYW1lO1xuICAgIGhvc3QgPz89IGVwLmhvc3Q7XG4gIH1cblxuICBpZiAoIWhvc3QgJiYgZW5kcG9pbnQpIHtcbiAgICBjb25zdCBwYXJzZWRFbmRwb2ludCA9IHBhcnNlQWRkcmVzcyhlbmRwb2ludCk7XG4gICAgaWYgKHBhcnNlZEVuZHBvaW50LnByb2plY3QgJiYgcGFyc2VkRW5kcG9pbnQuYnJhbmNoICYmIHBhcnNlZEVuZHBvaW50LmVuZHBvaW50SWQpIHtcbiAgICAgIGNvbnN0IGVwID0gYXdhaXQgd2FpdEVuZHBvaW50UmVhZHkoXG4gICAgICAgIHdzLFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5wcm9qZWN0LFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5icmFuY2gsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LmVuZHBvaW50SWQsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgICBob3N0ID0gZXAuc3RhdHVzPy5ob3N0cz8uaG9zdDtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgaG9zdCBmcm9tIGVuZHBvaW50XCIsIHsgaG9zdCB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWRhdGFiYXNlKSB7XG4gICAgZGF0YWJhc2UgPSBhd2FpdCBwaWNrRGF0YWJhc2Uod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgfVxuXG4gIHJldHVybiB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0LCBwb3J0LCBzc2xNb2RlIH07XG59XG5cbi8qKlxuICogV3JpdGUgcmVzb2x2ZWQgdmFsdWVzIGJhY2sgdG8gYHByb2Nlc3MuZW52YCBzbyB0aGUgYGxha2ViYXNlYCBwbHVnaW5cbiAqICh3aGljaCByZWFkcyBlbnYgZGlyZWN0bHkpIHBpY2tzIHRoZW0gdXAgZHVyaW5nIGl0cyBvd24gYHNldHVwKClgLlxuICogRXhpc3RpbmcgZW52IHZhbHVlcyBhcmUgcHJlc2VydmVkOyBvbmx5IG1pc3Npbmcga2V5cyBhcmUgZmlsbGVkIGluLFxuICogd2hpY2gga2VlcHMgZXhwbGljaXQgb3ZlcnJpZGVzIGF1dGhvcml0YXRpdmUuXG4gKlxuICogVGhpcyBkb2VzIE5PVCBzZXQgYFBHVVNFUmAsIHdoaWNoIG5lZWRzIGFuIGF3YWl0IC0gc2VlXG4gKiB7QGxpbmsgYXBwbHlMYWtlYmFzZUVudn0gZm9yIHRoZSBjb21wbGV0ZSBzZXQgYSBQb3N0Z3JlcyBwb29sIHJlcXVpcmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkOiBMYWtlYmFzZUNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgaWYgKHJlc29sdmVkLmVuZHBvaW50KSB7XG4gICAgcHJvY2Vzcy5lbnZbc2hhcmVkT3B0aW9ucy5kYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50XSA/Pz0gcmVzb2x2ZWQuZW5kcG9pbnQ7XG4gIH1cbiAgaWYgKHJlc29sdmVkLmhvc3QpIHByb2Nlc3MuZW52LlBHSE9TVCA/Pz0gcmVzb2x2ZWQuaG9zdDtcbiAgaWYgKHJlc29sdmVkLmRhdGFiYXNlKSBwcm9jZXNzLmVudi5QR0RBVEFCQVNFID8/PSByZXNvbHZlZC5kYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUEdQT1JUID8/PSBTdHJpbmcocmVzb2x2ZWQucG9ydCk7XG4gIHByb2Nlc3MuZW52LlBHU1NMTU9ERSA/Pz0gcmVzb2x2ZWQuc3NsTW9kZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjb25uZWN0aW9uIEFORCBhcHBseSBldmVyeSBQb3N0Z3JlcyBlbnYgdmFyIGEgTGFrZWJhc2UgcG9vbCBuZWVkcyxcbiAqIHJldHVybmluZyB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiBwbHVzIHRoZSB1c2VybmFtZSB0aGF0IHdhcyBhcHBsaWVkLlxuICpcbiAqIFRoaXMgaXMgdGhlIHdob2xlIHNldCwgd2hpY2ggaXMgdGhlIHBvaW50IG9mIGhhdmluZyBvbmUgZnVuY3Rpb24gZm9yIGl0OlxuICogYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCB0aHJvd3MgdW5sZXNzIGBMQUtFQkFTRV9FTkRQT0lOVGAsIGBQR0hPU1RgLFxuICogYFBHREFUQUJBU0VgLCAqKmFuZCoqIGEgdXNlcm5hbWUgKGBQR1VTRVJgLCBvciBgREFUQUJSSUNLU19DTElFTlRfSURgIGZvciBhXG4gKiBzZXJ2aWNlIHByaW5jaXBhbCkgYXJlIGFsbCBwcmVzZW50LCBhbmQgYSBEYXRhYnJpY2tzIEFwcCBgcG9zdGdyZXNgIHJlc291cmNlXG4gKiBiaW5kaW5nIHN1cHBsaWVzIG9ubHkgdGhlIGZpcnN0LiBBbnl0aGluZyB0aGF0IHdhbnRzIGEgd29ya2luZyBwb29sIC0gdGhlXG4gKiBgbGFrZWJhc2VgIHBsdWdpbiwgb3IgQXBwS2l0J3MgUEVSU0lTVEVOVCBjYWNoZSwgd2hpY2ggcXVpZXRseSBkZWdyYWRlcyB0b1xuICogaW4tbWVtb3J5IHdoZW4gdGhlIHBvb2wgY2Fubm90IGJlIGJ1aWx0IC0gbmVlZHMgYWxsIGZvdXIsIHNvIGNhbGxlcnMgc2hvdWxkIG5vdFxuICogcGFpciB7QGxpbmsgYXBwbHlMYWtlYmFzZVRvRW52fSB3aXRoIHRoZWlyIG93biB1c2VybmFtZSBsb29rdXAuXG4gKlxuICogYFBHVVNFUmAgaXMgYXBwbGllZCB3aXRoIGA/Pz1gIGxpa2UgdGhlIHJlc3QsIHNvIGFuIGV4cGxpY2l0bHkgY29uZmlndXJlZCB2YWx1ZVxuICogc3RheXMgYXV0aG9yaXRhdGl2ZS4gVGhlIGxvb2t1cCByZXR1cm5zIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHRocm93aW5nIHdoZW4gaXRcbiAqIGNhbm5vdCBkZXRlcm1pbmUgYSB1c2VyLCBsZWF2aW5nIHRoZSBwb29sIHRvIHJlc29sdmUgaXRzIG93bi5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbGFrZWJhc2VSZXNvbHZlciB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIC8vIEVub3VnaCBmb3IgYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCB0byBidWlsZCBhIHBvb2wuXG4gKiBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IGxha2ViYXNlUmVzb2x2ZXIuYXBwbHlMYWtlYmFzZUVudih7IGF1dG9DcmVhdGU6IGZhbHNlIH0pO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlMYWtlYmFzZUVudihcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgcmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbjsgdXNlcj86IHN0cmluZyB9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbihjb25maWcsIHNpZ25hbCk7XG4gIGFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZCk7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAoe30pO1xuICBpZiAodXNlcikgcHJvY2Vzcy5lbnYuUEdVU0VSID8/PSB1c2VyO1xuICByZXR1cm4geyByZXNvbHZlZCwgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSB9O1xufVxuXG50eXBlIFdvcmtzcGFjZUNsaWVudCA9IFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmtzcGFjZUNsaWVudD47XG5cbi8qKiBUaGUgU0RLIGBDb250ZXh0YCBhY2NlcHRlZCBieSB0aGUgd29ya3NwYWNlIGNsaWVudCdzIG93biBjb3B5IG9mIHRoZSBTREsuICovXG50eXBlIEFwaVJlcXVlc3RDb250ZXh0ID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxXb3Jrc3BhY2VDbGllbnRbXCJhcGlDbGllbnRcIl1bXCJyZXF1ZXN0XCJdPlsxXT47XG5cbi8qKlxuICogQWRhcHQgYW4ge0BsaW5rIEFib3J0U2lnbmFsfSBpbnRvIHRoZSBhcGkgY2xpZW50J3MgY2FuY2VsbGF0aW9uIGNvbnRleHQuXG4gKiBBcHBLaXQgcmVzb2x2ZXMgYSBkaWZmZXJlbnQgY29weSBvZiBgQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbGAgdGhhbiB0aGlzXG4gKiBwYWNrYWdlIGRvZXMsIGFuZCBgQ29udGV4dGAgY2FycmllcyBhIHByaXZhdGUgZmllbGQsIHNvIHRoZSB0d28gZGVjbGFyYXRpb25zXG4gKiBhcmUgbm9taW5hbGx5IGluY29tcGF0aWJsZSBldmVuIHRob3VnaCB0aGUgYXBpIGNsaWVudCBvbmx5IHJlYWRzXG4gKiBgY2FuY2VsbGF0aW9uVG9rZW5gIGFuZCBgbG9nZ2VyYCBvZmYgdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdENvbnRleHQoc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IEFwaVJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNpZ25hbCA/ICh0b0NvbnRleHQoc2lnbmFsKSBhcyB1bmtub3duIGFzIEFwaVJlcXVlc3RDb250ZXh0KSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIExha2ViYXNlIFJFU1QgYm9keS4gVGhlIGZ1bGwgcGF5bG9hZCBpcyBsb2dnZWQgcmF0aGVyIHRoYW4gdGhyb3duXG4gKiBzbyBhIGNsaWVudCBuZXZlciByZWNlaXZlcyB1cHN0cmVhbSBkZXRhaWwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUmVzcG9uc2U8VD4oc2NoZW1hOiB6LlpvZFR5cGU8VD4sIHBhdGg6IHN0cmluZywgYm9keTogdW5rbm93bik6IFQge1xuICBjb25zdCBwYXJzZWQgPSBzY2hlbWEuc2FmZVBhcnNlKGJvZHkpO1xuICBpZiAocGFyc2VkLnN1Y2Nlc3MpIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgbG9nZ2VyLmVycm9yKFwiYXV0b3BnOiB1bmV4cGVjdGVkIExha2ViYXNlIEFQSSByZXNwb25zZVwiLCB7XG4gICAgcGF0aCxcbiAgICBpc3N1ZXM6IHBhcnNlZC5lcnJvci5pc3N1ZXMsXG4gIH0pO1xuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJMYWtlYmFzZSBBUEkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCByZXNwb25zZVwiLCB7IGNvbnRleHQ6IHsgcGF0aCB9IH0pO1xufVxuXG4vKiogR0VUIGhlbHBlciB0aGF0IHZhbGlkYXRlcyB0aGUgSlNPTiBib2R5IGFuZCBmb3J3YXJkcyBjYW5jZWxsYXRpb24uICovXG5hc3luYyBmdW5jdGlvbiBnZXRKc29uPFQ+KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXMgPSBhd2FpdCB3cy5hcGlDbGllbnQucmVxdWVzdChcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoeyBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiIH0pLFxuICAgICAgcmF3OiBmYWxzZSxcbiAgICB9LFxuICAgIHJlcXVlc3RDb250ZXh0KHNpZ25hbCksXG4gICk7XG4gIHJldHVybiBwYXJzZVJlc3BvbnNlKHNjaGVtYSwgcGF0aCwgcmVzKTtcbn1cblxuLyoqIFBPU1QgaGVscGVyIGZvciBjcmVhdGUgLyBtdXRhdGUgY2FsbHM7IHZhbGlkYXRlcyB0aGUgSlNPTiBib2R5LiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEpzb248VD4oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIGJvZHk6IHVua25vd24sXG4gIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgd3MuYXBpQ2xpZW50LnJlcXVlc3QoXG4gICAge1xuICAgICAgcGF0aCxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBxdWVyeSxcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9KSxcbiAgICAgIHJhdzogZmFsc2UsXG4gICAgICBwYXlsb2FkOiBib2R5LFxuICAgIH0sXG4gICAgcmVxdWVzdENvbnRleHQoc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlUmVzcG9uc2Uoc2NoZW1hLCBwYXRoLCByZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0UHJvamVjdHMod3M6IFdvcmtzcGFjZUNsaWVudCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKHdzLCBgJHtBUElfQkFTRX0vcHJvamVjdHNgLCBsaXN0UmVzcG9uc2VTY2hlbWEsIHNpZ25hbCk7XG4gIHJldHVybiByZXMucHJvamVjdHMgPz8gW107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RCcmFuY2hlcyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8QnJhbmNoW10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlc2AsXG4gICAgbGlzdFJlc3BvbnNlU2NoZW1hLFxuICAgIHNpZ25hbCxcbiAgKTtcbiAgcmV0dXJuIHJlcy5icmFuY2hlcyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdEVuZHBvaW50cyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEVuZHBvaW50W10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0vZW5kcG9pbnRzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmVuZHBvaW50cyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERhdGFiYXNlcyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPERhdGFiYXNlW10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0vZGF0YWJhc2VzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmRhdGFiYXNlcyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RW5kcG9pbnQoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIGVuZHBvaW50SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gIHJldHVybiBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9lbmRwb2ludHMvJHtlbmRwb2ludElkfWAsXG4gICAgZW5kcG9pbnRTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xufVxuXG4vKipcbiAqIFNjYW4gdGhlIHdvcmtzcGFjZSBmb3IgYW4gZW5kcG9pbnQgd2hvc2UgYHN0YXR1cy5ob3N0cy5ob3N0YCBtYXRjaGVzXG4gKiB0aGUgcHJvdmlkZWQgaG9zdG5hbWUuIFVzZWQgdG8gcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL1xuICogZW5kcG9pbnQgcmVzb3VyY2UgcGF0aCB3aGVuIHRoZSBjYWxsZXIgb25seSBzdXBwbGllZCBhIFBvc3RncmVzIFVSSS5cbiAqXG4gKiBPKHByb2plY3RzICogYnJhbmNoZXMgKiBlbmRwb2ludHMpIC0gZmluZSBmb3IgdHlwaWNhbCB3b3Jrc3BhY2VzXG4gKiAoc2luZ2xlIGRpZ2l0cyBwZXIgdGllcik7IHBhZ2luYXRpb24gaXMgaW50ZW50aW9uYWxseSBub3QgZm9sbG93ZWRcbiAqIHNpbmNlIHRoaXMgaXMgYSBiZXN0LWVmZm9ydCBmYWxsYmFjay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZEVuZHBvaW50QnlIb3N0KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBob3N0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTx7IHByb2plY3Q6IHN0cmluZzsgYnJhbmNoOiBzdHJpbmc7IGVuZHBvaW50OiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBsaXN0UHJvamVjdHMod3MsIHNpZ25hbCk7XG4gIGZvciAoY29uc3QgcCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnN0IHByb2plY3RJZCA9IHBhcnNlUmVzb3VyY2VQYXRoKHAubmFtZSkucHJvamVjdDtcbiAgICBpZiAoIXByb2plY3RJZCkgY29udGludWU7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBhd2FpdCBsaXN0QnJhbmNoZXMod3MsIHByb2plY3RJZCwgc2lnbmFsKTtcbiAgICBmb3IgKGNvbnN0IGIgb2YgYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaElkID0gcGFyc2VSZXNvdXJjZVBhdGgoYi5uYW1lKS5icmFuY2g7XG4gICAgICBpZiAoIWJyYW5jaElkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RFbmRwb2ludHMod3MsIHByb2plY3RJZCwgYnJhbmNoSWQsIHNpZ25hbCk7XG4gICAgICBjb25zdCBtYXRjaCA9IGVuZHBvaW50cy5maW5kKChlKSA9PiBlLnN0YXR1cz8uaG9zdHM/Lmhvc3QgPT09IGhvc3QpO1xuICAgICAgaWYgKG1hdGNoPy5uYW1lKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogbWF0Y2hlZCBlbmRwb2ludCBieSBob3N0XCIsIHtcbiAgICAgICAgICBob3N0LFxuICAgICAgICAgIGVuZHBvaW50OiBtYXRjaC5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm9qZWN0OiBwcm9qZWN0SWQsXG4gICAgICAgICAgYnJhbmNoOiBicmFuY2hJZCxcbiAgICAgICAgICBlbmRwb2ludDogbWF0Y2gubmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBubyBlbmRwb2ludCBtYXRjaGVkIGhvc3RcIiwgeyBob3N0IH0pO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcm9qZWN0IHRvIHVzZSwgb3IgY3JlYXRlIG9uZSB3aGVuIHRoZSB3b3Jrc3BhY2UgaXMgZW1wdHkuXG4gKlxuICogU2VsZWN0aW9uIG9yZGVyOlxuICogMS4gRXhhY3RseSBvbmUgcHJvamVjdCBsaXN0ZWQgLT4gdXNlIGl0LlxuICogMi4gWmVybyBwcm9qZWN0cyBBTkQgYGF1dG9DcmVhdGUgIT09IGZhbHNlYCAtPiBlbnN1cmUgYSBwcm9qZWN0IHdpdGhcbiAqICAgIHRoZSByZXNvbHZlZCBpZCBleGlzdHMsIHRoZW4gcmV0dXJuIGl0cyBpZC5cbiAqIDMuIFplcm8gcHJvamVjdHMgQU5EIGBhdXRvQ3JlYXRlID09PSBmYWxzZWAgLT4gdGhyb3cuXG4gKiA0LiBNdWx0aXBsZSBwcm9qZWN0cyAtPiB0aHJvdyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdCAoc2V0XG4gKiAgICBgY29uZmlnLnByb2plY3RgIG9yIHBpbiBhIHByb2plY3QgaWQgaW4gYExBS0VCQVNFX0VORFBPSU5UYCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tPckNyZWF0ZVByb2plY3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIGF1dG9DcmVhdGU6IHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgbGlzdFByb2plY3RzKHdzLCBzaWduYWwpO1xuICBpZiAocHJvamVjdHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgaWQgPSBwYXJzZVJlc291cmNlUGF0aChwcm9qZWN0c1swXSEubmFtZSkucHJvamVjdDtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogdXNpbmcgb25seSBwcm9qZWN0XCIsIHsgcHJvamVjdDogaWQgfSk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9XG4gIGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoYXV0b0NyZWF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIkxha2ViYXNlIHByb2plY3RcIixcbiAgICAgICAgXCJhdXRvQ3JlYXRlIGlzIGZhbHNlOyBjcmVhdGUgYSBwcm9qZWN0IG9yIHNldCBjb25maWcucHJvamVjdCAvIExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBhdXRvQ3JlYXRlID8/IChhd2FpdCBkZWZhdWx0UHJvamVjdElkKCkpO1xuICAgIHJldHVybiBlbnN1cmVQcm9qZWN0KHdzLCBpZCwgc2lnbmFsKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGVzID0gcHJvamVjdHNcbiAgICAubWFwKChwKSA9PiBwYXJzZVJlc291cmNlUGF0aChwLm5hbWUpLnByb2plY3QpXG4gICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gQm9vbGVhbihpZCkpXG4gICAgLmpvaW4oXCIsIFwiKTtcbiAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgIFwiTGFrZWJhc2VcIixcbiAgICBgTXVsdGlwbGUgcHJvamVjdHMgZm91bmQ7IHNldCBjb25maWcucHJvamVjdCBvciBwaW4gYSBwcm9qZWN0IGlkIGluIExBS0VCQVNFX0VORFBPSU5ULiBDYW5kaWRhdGVzOiAke2NhbmRpZGF0ZXN9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYSBMYWtlYmFzZSBwcm9qZWN0IGlkIGZyb20gdGhlIGhvc3QgcmVwbydzIGBwYWNrYWdlLmpzb25gXG4gKiBuYW1lICh2aWEge0BsaW5rIHByb2plY3QubmFtZX0pIHNsdWdpZmllZCB0byBzYXRpc2Z5IHRoZVxuICogTGFrZWJhc2UgaWQgY29uc3RyYWludCAoYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGApLlxuICpcbiAqIFRocm93cyB3aGVuIHRoZSBzbHVnIGVuZHMgdXAgZW1wdHkgb3Igc3RhcnRzIHdpdGggYSBkaWdpdCwgc2luY2UgdGhlXG4gKiBzZXJ2ZXIgd291bGQgcmVqZWN0IGl0IGFueXdheSAtIGNhbGxlcnMgc2hvdWxkIHBhc3MgYW4gZXhwbGljaXRcbiAqIGBhdXRvQ3JlYXRlYCBpZCBpbiB0aGF0IGNhc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRQcm9qZWN0SWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZSA9IHByb2plY3RVdGlscy5uYW1lKCk7XG4gIGNvbnN0IHNsdWcgPSBzdHJpbmdVdGlscy50b1NsdWdXaXRoT3B0aW9ucyh7IG1heExlbmd0aDogUFJPSkVDVF9JRF9NQVhfTEVOIH0sIG5hbWUpO1xuICBpZiAoIXNsdWcgfHwgIS9eW2Etel0vLnRlc3Qoc2x1ZykpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogcHJvamVjdCBuYW1lIGRvZXMgbm90IHNsdWdpZnkgdG8gYSBMYWtlYmFzZSBwcm9qZWN0IGlkXCIsIHsgbmFtZSB9KTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBcIkNvdWxkIG5vdCBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb20gdGhlIHBhY2thZ2UgbmFtZTsgcGFzcyBhdXRvQ3JlYXRlIGV4cGxpY2l0bHkuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gc2x1Zztcbn1cblxuLyoqXG4gKiBFbnN1cmUgYSBMYWtlYmFzZSBwcm9qZWN0IHdpdGggYHByb2plY3RJZGAgZXhpc3RzLiBDcmVhdGVzIGl0IGFuZFxuICogd2FpdHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLiBBbiBgQUxSRUFEWV9FWElTVFNgXG4gKiByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHN1Y2Nlc3MgLSBzb21lb25lIGVsc2UgKGEgY29uY3VycmVudCBib290LFxuICogYSBzaWJsaW5nIHByb2Nlc3MpIHdvbiB0aGUgcmFjZSBhbmQgdGhlIHByb2plY3Qgd2Ugd2FudGVkIGlzIG5vd1xuICogc2l0dGluZyB0aGVyZSByZWFkeSBmb3IgZG93bnN0cmVhbSBwaWNrZXJzLlxuICpcbiAqIFByb2plY3QgY3JlYXRpb24gdHlwaWNhbGx5IHByb3Zpc2lvbnMgYSBkZWZhdWx0IGBwcm9kdWN0aW9uYCBicmFuY2hcbiAqIGFsb25nc2lkZTsgZG93bnN0cmVhbSBwaWNrZXJzIGhhbmRsZSB0aGUgcmVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbG9nZ2VyLndhcm4oXCJhdXRvcGc6IG5vIHByb2plY3RzIGZvdW5kOyBjcmVhdGluZ1wiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcCA9IGF3YWl0IHBvc3RKc29uKFxuICAgICAgd3MsXG4gICAgICBgJHtBUElfQkFTRX0vcHJvamVjdHNgLFxuICAgICAgb3BlcmF0aW9uU2NoZW1hLFxuICAgICAgeyBzcGVjOiB7IHBnX3ZlcnNpb246IERFRkFVTFRfUEdfVkVSU0lPTiB9IH0sXG4gICAgICB7IHByb2plY3RfaWQ6IHByb2plY3RJZCB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgYXdhaXQgd2FpdEZvck9wZXJhdGlvbih3cywgb3AsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IGNyZWF0ZWQgcHJvamVjdFwiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFpc0FscmVhZHlFeGlzdHNFcnJvcihlcnIpKSB0aHJvdyBlcnI7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IHByb2plY3QgYWxyZWFkeSBleGlzdHMgKHJhY2UpOyBwcm9jZWVkaW5nXCIsIHtcbiAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvamVjdElkO1xufVxuXG4vKipcbiAqIFJlY29nbml6ZSB0aGUgRGF0YWJyaWNrcyBTREsncyBgQUxSRUFEWV9FWElTVFNgIGZhaWx1cmUgbW9kZXMgc28gYVxuICogbG9zdCByYWNlIGR1cmluZyBgZW5zdXJlUHJvamVjdGAgYmVjb21lcyBhIG5vLW9wIGluc3RlYWQgb2YgYW4gZXJyb3IuXG4gKlxuICogVGhlIFNESyB0aHJvd3MgYEFwaUVycm9yIHsgZXJyb3JDb2RlLCBzdGF0dXNDb2RlIH1gIGZvciBzdHJ1Y3R1cmVkXG4gKiBzZXJ2ZXIgZXJyb3JzIGFuZCBgSHR0cEVycm9yIHsgY29kZSB9YCBmb3IgdHJhbnNwb3J0LWxheWVyIDR4eC81eHguXG4gKiBCb3RoIHN1cmZhY2UgYSBodW1hbiBtZXNzYWdlIHRoYXQgb2Z0ZW4gY2FycmllcyBcImFscmVhZHkgZXhpc3RzXCIgc29cbiAqIHdlIHVzZSB0aGF0IGFzIGEgZmluYWwgZmFsbGJhY2sgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gaXNBbHJlYWR5RXhpc3RzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZSA9IGVycm9yIGFzIHtcbiAgICBzdGF0dXNDb2RlPzogbnVtYmVyO1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG4gIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwOSB8fCBlLmNvZGUgPT09IDQwOSkgcmV0dXJuIHRydWU7XG4gIGlmIChlLmVycm9yQ29kZSAmJiAvYWxyZWFkeS4/ZXhpc3RzL2kudGVzdChlLmVycm9yQ29kZSkpIHJldHVybiB0cnVlO1xuICBpZiAoZS5tZXNzYWdlICYmIC9hbHJlYWR5Lj9leGlzdHMvaS50ZXN0KGUubWVzc2FnZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVkdWNlIGEgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWx1cmUgdG8gYW4gZXJyb3Igc2FmZSB0byBwcm9wYWdhdGU6IHRoZVxuICogb3BlcmF0aW9uIG5hbWUgcGx1cyB3aGF0ZXZlciBjb2RlIHRoZSBwYXlsb2FkIGNhcnJpZXMuIFRoZSBwYXlsb2FkIGl0c2VsZiBjYW5cbiAqIGVjaG8gcmVxdWVzdCBjb250ZXh0LCBzbyBpdCBnb2VzIHRvIHRoZSBsb2cgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gb3BlcmF0aW9uRmFpbGVkKG9wTmFtZTogc3RyaW5nLCBvcEVycm9yOiB1bmtub3duKTogRXhlY3V0aW9uRXJyb3Ige1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IG9wZXJhdGlvbiBmYWlsZWRcIiwgeyBvcGVyYXRpb246IG9wTmFtZSwgZXJyb3I6IG9wRXJyb3IgfSk7XG4gIGNvbnN0IGNvZGUgPSBvYmplY3QuaXNSZWNvcmQob3BFcnJvcikgPyAob3BFcnJvci5jb2RlID8/IG9wRXJyb3IucmVhc29uKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWxlZDogJHtvcE5hbWV9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgZXJyb3JDb2RlOiB0eXBlb2YgY29kZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY29kZSA9PT0gXCJudW1iZXJcIiA/IFN0cmluZyhjb2RlKSA6IFwidW5rbm93blwiLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYSBMYWtlYmFzZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIHVudGlsIGBkb25lOiB0cnVlYC4gUmV0dXJuc1xuICogdGhlIGZpbmFsIG9wZXJhdGlvbiBlbnZlbG9wZSAod2hpY2ggbWF5IGNhcnJ5IGByZXNwb25zZWAgb3IgYGVycm9yYCkuXG4gKlxuICogVGhyb3dzIHdoZW46XG4gKiAgIC0gdGhlIHJlc3BvbnNlIGNhcnJpZXMgYW4gYGVycm9yYCBmaWVsZDtcbiAqICAgLSBgb3AubmFtZWAgaXMgbWlzc2luZyAobm90aGluZyB0byBwb2xsKTtcbiAqICAgLSB0aGUgdGltZW91dCBlbGFwc2VzIGJlZm9yZSBgZG9uZTogdHJ1ZWA7XG4gKiAgIC0gYHNpZ25hbGAgYWJvcnRzIG1pZC13YWl0LlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yT3BlcmF0aW9uKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBvcDogT3BlcmF0aW9uLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8T3BlcmF0aW9uPiB7XG4gIGlmIChvcC5kb25lKSB7XG4gICAgaWYgKG9wLmVycm9yKSB7XG4gICAgICB0aHJvdyBvcGVyYXRpb25GYWlsZWQob3AubmFtZSA/PyBcInVua25vd25cIiwgb3AuZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gb3A7XG4gIH1cbiAgY29uc3Qgb3BOYW1lID0gb3AubmFtZTtcbiAgaWYgKCFvcE5hbWUpIHtcbiAgICB0aHJvdyBFeGVjdXRpb25FcnJvci5taXNzaW5nRGF0YShcIm9wZXJhdGlvbiBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IERhdGUubm93KCkgLSBzdGFydCA8IE9QRVJBVElPTl9USU1FT1VUX01TOyBhdHRlbXB0KyspIHtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgT1BFUkFUSU9OX1BPTExfTVMsIHNpZ25hbCk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS8ke29wTmFtZX1gLCBvcGVyYXRpb25TY2hlbWEsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBvcGVyYXRpb24gc3RhdHVzXCIsIHsgb3A6IG9wTmFtZSwgZG9uZTogY3VycmVudC5kb25lIH0pO1xuICAgIGlmIChjdXJyZW50LmRvbmUpIHtcbiAgICAgIGlmIChjdXJyZW50LmVycm9yKSB7XG4gICAgICAgIHRocm93IG9wZXJhdGlvbkZhaWxlZChvcE5hbWUsIGN1cnJlbnQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU6ICR7b3BOYW1lfWAsIHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogb3BOYW1lLCB0aW1lb3V0TXM6IE9QRVJBVElPTl9USU1FT1VUX01TIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYGdldEVuZHBvaW50YCB1bnRpbCB0aGUgY29tcHV0ZSByZXBvcnRzIGEgdXNhYmxlXG4gKiBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgLiBgUkVBRFlgIGFuZCBgSURMRWAgYXJlIGJvdGggYWNjZXB0YWJsZSAtXG4gKiBgSURMRWAganVzdCBtZWFucyB0aGUgY29tcHV0ZSBoYXMgc2NhbGVkIHRvIHplcm8gYnV0IGEgY29ubmVjdGlvblxuICogd2lsbCB3YWtlIGl0LiBSZXR1cm5zIHRoZSBmaW5hbCBlbmRwb2ludCBwYXlsb2FkICh3aXRoIGBob3N0cy5ob3N0YCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRFbmRwb2ludFJlYWR5KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBlbmRwb2ludElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCBsYXN0OiBFbmRwb2ludCB8IG51bGwgPSBudWxsO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUzsgYXR0ZW1wdCsrKSB7XG4gICAgbGFzdCA9IGF3YWl0IGdldEVuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50SWQsIHNpZ25hbCk7XG4gICAgY29uc3Qgc3RhdGUgPSBsYXN0LnN0YXR1cz8uY3VycmVudF9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgJiYgQ09OTkVDVEFCTEVfRU5EUE9JTlRfU1RBVEVTLmhhcyhzdGF0ZSkpIHJldHVybiBsYXN0O1xuICAgIGlmIChsYXN0LnN0YXR1cz8uaG9zdHM/Lmhvc3QgJiYgc3RhdGUgIT09IElOSVRJQUxJWklOR19FTkRQT0lOVF9TVEFURSkge1xuICAgICAgLy8gQ29tcHV0ZSBpcyBpbiBzb21lIG90aGVyIHN0YXRlIChTVEFSVElORywgZXRjLikgYnV0IGhvc3RuYW1lIGlzXG4gICAgICAvLyBhbHJlYWR5IHB1Ymxpc2hlZCAtIGdvb2QgZW5vdWdoIHRvIGNvbm5lY3Q7IGxha2ViYXNlJ3MgT0F1dGhcbiAgICAgIC8vIHRva2VuIHJlcXVlc3Qgd2lsbCB3YWtlIGl0LlxuICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogd2FpdGluZyBmb3IgZW5kcG9pbnRcIiwgeyBlbmRwb2ludElkLCBzdGF0ZSB9KTtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgRU5EUE9JTlRfUkVBRFlfUE9MTF9NUywgc2lnbmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIGVuZHBvaW50IGRpZCBub3QgYmVjb21lIHJlYWR5OiAke2VuZHBvaW50SWR9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHByb2plY3QsXG4gICAgICBicmFuY2gsXG4gICAgICBlbmRwb2ludElkLFxuICAgICAgdGltZW91dE1zOiBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TLFxuICAgICAgbGFzdFN0YXRlOiBsYXN0Py5zdGF0dXM/LmN1cnJlbnRfc3RhdGUgPz8gXCJ1bmtub3duXCIsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgZGVmYXVsdCBicmFuY2ggZm9yIGEgcHJvamVjdC4gUHJlZmVycyB0aGUgYnJhbmNoIGZsYWdnZWRcbiAqIGBzdGF0dXMuZGVmYXVsdDogdHJ1ZWAgKHNlcnZlci1zaWRlIGRlZmF1bHQsIHR5cGljYWxseSBgcHJvZHVjdGlvbmBcbiAqIHVubGVzcyB0aGUgcHJvamVjdCBvd25lciBjaGFuZ2VkIGl0KS4gRmFsbHMgYmFjayB0byB0aGUgb25seSBicmFuY2hcbiAqIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gT3RoZXJ3aXNlIHRocm93cyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0JyYW5jaChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJyYW5jaGVzID0gYXdhaXQgbGlzdEJyYW5jaGVzKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICBpZiAoYnJhbmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgTGFrZWJhc2UgYnJhbmNoIGluIHByb2plY3QgJyR7cHJvamVjdH0nYCxcbiAgICAgIFwiVGhlIHByb2plY3QgaGFzIG5vIGJyYW5jaGVzOyBjcmVhdGUgb25lIG9yIHNldCBjb25maWcuYnJhbmNoLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZmxhZ2dlZCA9IGJyYW5jaGVzLmZpbmQoKGIpID0+IGIuc3RhdHVzPy5kZWZhdWx0ID09PSB0cnVlKTtcbiAgY29uc3QgY2hvaWNlID1cbiAgICBwYXJzZVJlc291cmNlUGF0aChmbGFnZ2VkPy5uYW1lKS5icmFuY2ggPz9cbiAgICAoYnJhbmNoZXMubGVuZ3RoID09PSAxID8gcGFyc2VSZXNvdXJjZVBhdGgoYnJhbmNoZXNbMF0hLm5hbWUpLmJyYW5jaCA6IHVuZGVmaW5lZCk7XG4gIGlmICghY2hvaWNlKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGJyYW5jaGVzXG4gICAgICAubWFwKChiKSA9PiBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWQpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgUHJvamVjdCAnJHtwcm9qZWN0fScgaGFzIG11bHRpcGxlIGJyYW5jaGVzIGFuZCBub25lIG1hcmtlZCBkZWZhdWx0OyBzZXQgY29uZmlnLmJyYW5jaCBvciBpbmNsdWRlIHRoZSBicmFuY2ggaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICAgICk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBicmFuY2hcIiwgeyBwcm9qZWN0LCBicmFuY2g6IGNob2ljZSB9KTtcbiAgcmV0dXJuIGNob2ljZTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcmltYXJ5IGVuZHBvaW50IGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBQcmVmZXJzXG4gKiBgc3RhdHVzLmVuZHBvaW50X3R5cGUgPT09IEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWA7IGZhbGxzIGJhY2sgdG9cbiAqIHRoZSBvbmx5IGVuZHBvaW50IHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gUmV0dXJucyBgeyBuYW1lLCBob3N0IH1gXG4gKiBzbyB0aGUgY2FsbGVyIGNhbiBwb3B1bGF0ZSBib3RoIGBMQUtFQkFTRV9FTkRQT0lOVGAgYW5kIGBQR0hPU1RgXG4gKiBmcm9tIGEgc2luZ2xlIGNhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBob3N0Pzogc3RyaW5nIH0+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZW5kcG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGVuZHBvaW50IGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBlbmRwb2ludHM7IGNyZWF0ZSBvbmUgb3Igc2V0IExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJpbWFyeSA9XG4gICAgZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5lbmRwb2ludF90eXBlID09PSBSRUFEX1dSSVRFX0VORFBPSU5UX1RZUEUpID8/XG4gICAgKGVuZHBvaW50cy5sZW5ndGggPT09IDEgPyBlbmRwb2ludHNbMF0gOiB1bmRlZmluZWQpO1xuICBpZiAoIXByaW1hcnk/Lm5hbWUpIHtcbiAgICBjb25zdCBuYW1lcyA9IGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIGBCcmFuY2ggaGFzIG5vIHByaW1hcnkgcmVhZC13cml0ZSBlbmRwb2ludDsgc2V0IExBS0VCQVNFX0VORFBPSU5UIG9yIGNvbmZpZy5lbmRwb2ludC4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSBwcmltYXJ5LnN0YXR1cz8uaG9zdHM/Lmhvc3Q7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZW5kcG9pbnRcIiwgeyBlbmRwb2ludDogcHJpbWFyeS5uYW1lLCBob3N0IH0pO1xuICByZXR1cm4geyBuYW1lOiBwcmltYXJ5Lm5hbWUsIGhvc3QgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBkZWZhdWx0IHBvc3RncmVzIGRhdGFiYXNlIGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBUaGVcbiAqIFBvc3RncmVzIGRhdGFiYXNlIE5BTUUgKGBzdGF0dXMucG9zdGdyZXNfZGF0YWJhc2VgKSBpcyB3aGF0XG4gKiBgUEdEQVRBQkFTRWAgbmVlZHMgLSB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgcmVzb3VyY2UgaWQsIHdoaWNoIGNhblxuICogdXNlIGEgZGlmZmVyZW50IHNlcGFyYXRvciAoZS5nLiByZXNvdXJjZSBgZGF0YWJyaWNrcy1wb3N0Z3Jlc2BcbiAqIHN1cmZhY2VzIGFzIGRhdGFiYXNlIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkuIFByZWZlcnNcbiAqIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCAodGhlIExha2ViYXNlIGRlZmF1bHQpLCBvdGhlcndpc2UgdGhlIG9ubHlcbiAqIGRhdGFiYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrRGF0YWJhc2UoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGF0YWJhc2VzID0gYXdhaXQgbGlzdERhdGFiYXNlcyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZGF0YWJhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGRhdGFiYXNlIGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBkYXRhYmFzZXM7IGNyZWF0ZSBvbmUgb3Igc2V0IFBHREFUQUJBU0UuXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IGRhdGFiYXNlc1xuICAgIC5tYXAoKGQpID0+IGQuc3RhdHVzPy5wb3N0Z3Jlc19kYXRhYmFzZSlcbiAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSk7XG4gIGNvbnN0IGNob2ljZSA9XG4gICAgbmFtZXMuZmluZCgobikgPT4gbiA9PT0gREVGQVVMVF9EQVRBQkFTRSkgPz8gKG5hbWVzLmxlbmd0aCA9PT0gMSA/IG5hbWVzWzBdIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFjaG9pY2UpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgTXVsdGlwbGUgZGF0YWJhc2VzIGFuZCBubyAnJHtERUZBVUxUX0RBVEFCQVNFfSc7IHNldCBQR0RBVEFCQVNFIG9yIGNvbmZpZy5kYXRhYmFzZS4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZGF0YWJhc2VcIiwgeyBkYXRhYmFzZTogY2hvaWNlIH0pO1xuICByZXR1cm4gY2hvaWNlO1xufVxuIl19
package/package.json CHANGED
@@ -20,8 +20,8 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@databricks/appkit": "0.81.0",
23
- "@dbx-tools/projen": "^0.9.40",
24
- "@dbx-tools/test-polyglot": "^0.9.40",
23
+ "@dbx-tools/projen": "^0.9.43",
24
+ "@dbx-tools/test-polyglot": "^0.9.43",
25
25
  "@types/node": "^24.6.0",
26
26
  "typescript": "^5.9.3",
27
27
  "vitest": "3.2.4"
@@ -31,10 +31,10 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@databricks/sdk-experimental": "^0.17.0",
34
- "@dbx-tools/auth": "^0.9.40",
35
- "@dbx-tools/core": "^0.9.40",
36
- "@dbx-tools/lakebase": "^0.9.40",
37
- "@dbx-tools/shared-core": "^0.9.40",
34
+ "@dbx-tools/auth": "^0.9.43",
35
+ "@dbx-tools/core": "^0.9.43",
36
+ "@dbx-tools/lakebase": "^0.9.43",
37
+ "@dbx-tools/shared-core": "^0.9.43",
38
38
  "zod": "4.3.6"
39
39
  },
40
40
  "main": "./lib/index.js",
@@ -107,7 +107,7 @@
107
107
  "./package.json": "./package.json"
108
108
  }
109
109
  },
110
- "version": "0.9.40",
110
+ "version": "0.9.43",
111
111
  "types": "./lib/index.d.ts",
112
112
  "dbxToolsConfig": {
113
113
  "tags": [
@@ -43,7 +43,13 @@ import {
43
43
  ValidationError,
44
44
  } from "@databricks/appkit";
45
45
  import { configUtils, projectUtils } from "@dbx-tools/core";
46
- import { asyncUtils, log, object, stringUtils } from "@dbx-tools/shared-core";
46
+ import {
47
+ asyncUtils,
48
+ log,
49
+ object,
50
+ options as sharedOptions,
51
+ stringUtils,
52
+ } from "@dbx-tools/shared-core";
47
53
  import { z } from "zod";
48
54
 
49
55
  import { toContext } from "./databricks.ts";
@@ -115,56 +121,69 @@ export interface LakebaseConnection extends LakebaseConnectionInputs {
115
121
  * stay `string` so a newly added state does not fail the whole response.
116
122
  */
117
123
  const projectSchema = z.object({
118
- // Full resource path: `projects/{p}`.
119
- name: z.string().optional(),
124
+ name: z.string().optional().describe("Full resource path: projects/{p}."),
120
125
  });
121
126
  type Project = z.infer<typeof projectSchema>;
122
127
 
123
128
  const endpointSchema = z.object({
124
- // Full resource path: `projects/{p}/branches/{b}/endpoints/{e}`.
125
- name: z.string().optional(),
126
- uid: z.string().optional(),
127
- // Server-side state. All connection info lives here - the spec block
128
- // only carries the desired configuration, not the runtime hostnames.
129
+ name: z
130
+ .string()
131
+ .optional()
132
+ .describe("Full resource path: projects/{p}/branches/{b}/endpoints/{e}."),
133
+ uid: z.string().optional().describe("Stable endpoint uid assigned by Lakebase."),
129
134
  status: z
130
135
  .object({
131
- endpoint_type: z.string().optional(),
132
- // Resolved hostnames; `hosts.host` is the writable primary.
136
+ endpoint_type: z
137
+ .string()
138
+ .optional()
139
+ .describe("Endpoint role, such as ENDPOINT_TYPE_READ_WRITE."),
133
140
  hosts: z
134
141
  .object({
135
- host: z.string().optional(),
136
- read_only_host: z.string().optional(),
142
+ host: z.string().optional().describe("Writable primary hostname."),
143
+ read_only_host: z
144
+ .string()
145
+ .optional()
146
+ .describe("Read-only replica hostname when present."),
137
147
  })
138
- .optional(),
139
- // Compute state: `INITIALIZING`, `STARTING`, `READY`, `IDLE`, ...
140
- current_state: z.string().optional(),
148
+ .optional()
149
+ .describe("Resolved hostnames. hosts.host is the writable primary."),
150
+ current_state: z
151
+ .string()
152
+ .optional()
153
+ .describe("Compute state: INITIALIZING, STARTING, READY, IDLE, and later values."),
141
154
  })
142
- .optional(),
155
+ .optional()
156
+ .describe("Server-side state. Runtime hostnames live here, not in the spec block."),
143
157
  });
144
158
  type Endpoint = z.infer<typeof endpointSchema>;
145
159
 
146
160
  const branchSchema = z.object({
147
- // Full resource path: `projects/{p}/branches/{b}`.
148
- name: z.string().optional(),
161
+ name: z.string().optional().describe("Full resource path: projects/{p}/branches/{b}."),
149
162
  status: z
150
163
  .object({
151
- // True for the project's default branch (e.g. `production`).
152
- default: z.boolean().optional(),
153
- current_state: z.string().optional(),
164
+ default: z
165
+ .boolean()
166
+ .optional()
167
+ .describe("True for the project's default branch, such as production."),
168
+ current_state: z.string().optional().describe("Branch compute state reported by Lakebase."),
154
169
  })
155
170
  .optional(),
156
171
  });
157
172
  type Branch = z.infer<typeof branchSchema>;
158
173
 
159
174
  const databaseSchema = z.object({
160
- // Full resource path: `projects/{p}/branches/{b}/databases/{d}`.
161
- name: z.string().optional(),
175
+ name: z
176
+ .string()
177
+ .optional()
178
+ .describe("Full resource path: projects/{p}/branches/{b}/databases/{d}."),
162
179
  status: z
163
180
  .object({
164
- // Actual Postgres database name (used as `PGDATABASE`). May differ
165
- // from the resource id - e.g. resource `databricks-postgres`
166
- // surfaces as Postgres database `databricks_postgres`.
167
- postgres_database: z.string().optional(),
181
+ postgres_database: z
182
+ .string()
183
+ .optional()
184
+ .describe(
185
+ "Actual Postgres database name used as PGDATABASE. May differ from the resource id.",
186
+ ),
168
187
  })
169
188
  .optional(),
170
189
  });
@@ -177,7 +196,10 @@ type Database = z.infer<typeof databaseSchema>;
177
196
  * cap is fine.
178
197
  */
179
198
  const listResponseSchema = z.object({
180
- next_page_token: z.string().optional(),
199
+ next_page_token: z
200
+ .string()
201
+ .optional()
202
+ .describe("AIP page token. Only the first page is consumed."),
181
203
  projects: z.array(projectSchema).optional(),
182
204
  branches: z.array(branchSchema).optional(),
183
205
  endpoints: z.array(endpointSchema).optional(),
@@ -189,15 +211,15 @@ const listResponseSchema = z.object({
189
211
  * `done: true` means terminal; check `error` before reading `response`.
190
212
  */
191
213
  const operationSchema = z.object({
192
- name: z.string().optional(),
193
- done: z.boolean().optional(),
194
- error: z.unknown().optional(),
195
- response: z.unknown().optional(),
214
+ name: z.string().optional().describe("Operation resource name."),
215
+ done: z.boolean().optional().describe("True when the operation is terminal."),
216
+ error: z.unknown().optional().describe("Error payload present when the operation failed."),
217
+ response: z.unknown().optional().describe("Result payload present when the operation succeeded."),
196
218
  });
197
219
  type Operation = z.infer<typeof operationSchema>;
198
220
 
199
221
  /** `PGPORT` must land inside the TCP port range. */
200
- const portSchema = z.coerce.number().int().min(1).max(configUtils.MAX_TCP_PORT);
222
+ const portSchema = sharedOptions.tcpPortSchema;
201
223
 
202
224
  /**
203
225
  * Validate a `PGPORT`-shaped value. Returns `undefined` when unset, and throws
@@ -268,7 +290,11 @@ export async function readLakebaseInputs(
268
290
  ): Promise<LakebaseResolverInputs> {
269
291
  const configOptions = { bundleProfile: config?.bundleProfile };
270
292
  const rawAddress =
271
- config?.endpoint ?? configUtils.resolveValue("LAKEBASE_ENDPOINT", configOptions);
293
+ config?.endpoint ??
294
+ configUtils.resolveValue(
295
+ sharedOptions.databricksEnvironmentNames.lakebaseEndpoint,
296
+ configOptions,
297
+ );
272
298
  const parsed = parseAddress(rawAddress);
273
299
  const portEnv = parsePort(configUtils.resolveValue("PGPORT", configOptions));
274
300
  const sslModeEnv = parseSslMode(configUtils.resolveValue("PGSSLMODE", configOptions));
@@ -398,7 +424,9 @@ export async function resolveLakebaseConnection(
398
424
  * {@link applyLakebaseEnv} for the complete set a Postgres pool requires.
399
425
  */
400
426
  export function applyLakebaseToEnv(resolved: LakebaseConnection): void {
401
- if (resolved.endpoint) process.env.LAKEBASE_ENDPOINT ??= resolved.endpoint;
427
+ if (resolved.endpoint) {
428
+ process.env[sharedOptions.databricksEnvironmentNames.lakebaseEndpoint] ??= resolved.endpoint;
429
+ }
402
430
  if (resolved.host) process.env.PGHOST ??= resolved.host;
403
431
  if (resolved.database) process.env.PGDATABASE ??= resolved.database;
404
432
  process.env.PGPORT ??= String(resolved.port);