@dbx-tools/shared-core 0.9.32 → 0.9.36

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/shared-core";
6
- export const PACKAGE_VERSION = "0.9.32";
6
+ export const PACKAGE_VERSION = "0.9.36";
7
7
  export * as asyncUtils from "./src/async-utils.ts";
8
8
  export * as brandUtils from "./src/brand-utils.ts";
9
9
  export * as environmentUtils from "./src/environment-utils.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
2
- export declare const PACKAGE_VERSION = "0.9.32";
2
+ export declare const PACKAGE_VERSION = "0.9.36";
3
3
  export * as asyncUtils from "./src/async-utils.ts";
4
4
  export * as brandUtils from "./src/brand-utils.ts";
5
5
  export * as environmentUtils from "./src/environment-utils.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/shared-core";
5
- export const PACKAGE_VERSION = "0.9.32";
5
+ export const PACKAGE_VERSION = "0.9.36";
6
6
  export * as asyncUtils from "./src/async-utils.js";
7
7
  export * as brandUtils from "./src/brand-utils.js";
8
8
  export * as environmentUtils from "./src/environment-utils.js";
@@ -21,4 +21,4 @@ export * as stringUtils from "./src/string-utils.js";
21
21
  export * as token from "./src/token.js";
22
22
  export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand-utils.js";
23
23
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER } from "./src/token.js";
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBWS9KLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4zMlwiO1xuZXhwb3J0ICogYXMgYXN5bmNVdGlscyBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kVXRpbHMgZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBlbnZpcm9ubWVudFV0aWxzIGZyb20gXCIuL3NyYy9lbnZpcm9ubWVudC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZXJyb3JVdGlscyBmcm9tIFwiLi9zcmMvZXJyb3ItdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWN1dGlvbiBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgaGFzaCBmcm9tIFwiLi9zcmMvaGFzaC50c1wiO1xuZXhwb3J0ICogYXMgaHR0cCBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0ICogYXMganNvbiBmcm9tIFwiLi9zcmMvanNvbi50c1wiO1xuZXhwb3J0ICogYXMgbG9nIGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0ICogYXMgcGF0dGVybiBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0ICogYXMgcHJlZGljYXRlIGZyb20gXCIuL3NyYy9wcmVkaWNhdGUudHNcIjtcbmV4cG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIHRva2VuIGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBDb25jdXJyZW50RXJyb3JNb2RlLCBNYXBDb25jdXJyZW50T3B0aW9ucywgUG9sbENvbnRleHQsIFBvbGxQcm9kdWNlciwgUG9sbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfQlJBTkRfQVNTRVRTLCBCcmFuZEFzc2V0U2V0U2NoZW1hLCBCcmFuZENvbG9yc1NjaGVtYSwgQnJhbmRWb2ljZVNjaGVtYSwgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQsIEJyYW5kQXNzZXRTZXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXJyb3JDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvblJlc3VsdCwgRXhlY3V0b3IsIEV4ZWN1dGlvbkZhaWx1cmUsIFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1lbW9pemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2Z1bmN0aW9uLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlckxpa2UgfSBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2dMZXZlbCwgTG9nZ2VyIH0gZnJvbSBcIi4vc3JjL2xvZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVcmxMaWtlLCBJcFZlcnNpb24sIFBhcnNlZElwLCBDaWRyLCBVcmxCdWlsZGVyLCBQYXJzZUVtYWlsc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcXVlbmNlLCBDb250YWluZXIsIENvbGxlY3Rpb24sIE9uZU9yTWFueSwgTmFtZUxpa2UsIE5vbkZ1bmN0aW9uS2V5cywgU2VyaWFsaXphYmxlUHJpbWl0aXZlLCBTZXJpYWxpemFibGVWYWx1ZSwgVG9OdW1iZXJPcHRpb25zLCBUb0RhdGVPcHRpb25zLCBUb0R1cmF0aW9uT3B0aW9ucywgRGVlcEVxdWFsQ29tcGFyYXRvciB9IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcmVkaWNhdGVGdW5jdGlvbiwgVHlwZVByZWRpY2F0ZUZ1bmN0aW9uLCBQcmVkaWNhdGVJbnB1dCwgUHJlZGljYXRlIH0gZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbml6ZU9wdGlvbnMsIEtleU9wdGlvbnMsIElkZW50aWZpZXJPcHRpb25zLCBEZWRlbnRPcHRpb25zLCBEZXNjcmlwdGlvbiB9IGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiB9IGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBWS9KLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4zNlwiO1xuZXhwb3J0ICogYXMgYXN5bmNVdGlscyBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kVXRpbHMgZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBlbnZpcm9ubWVudFV0aWxzIGZyb20gXCIuL3NyYy9lbnZpcm9ubWVudC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZXJyb3JVdGlscyBmcm9tIFwiLi9zcmMvZXJyb3ItdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWN1dGlvbiBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgaGFzaCBmcm9tIFwiLi9zcmMvaGFzaC50c1wiO1xuZXhwb3J0ICogYXMgaHR0cCBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0ICogYXMganNvbiBmcm9tIFwiLi9zcmMvanNvbi50c1wiO1xuZXhwb3J0ICogYXMgbG9nIGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0ICogYXMgcGF0dGVybiBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0ICogYXMgcHJlZGljYXRlIGZyb20gXCIuL3NyYy9wcmVkaWNhdGUudHNcIjtcbmV4cG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIHRva2VuIGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBDb25jdXJyZW50RXJyb3JNb2RlLCBNYXBDb25jdXJyZW50T3B0aW9ucywgUG9sbENvbnRleHQsIFBvbGxQcm9kdWNlciwgUG9sbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfQlJBTkRfQVNTRVRTLCBCcmFuZEFzc2V0U2V0U2NoZW1hLCBCcmFuZENvbG9yc1NjaGVtYSwgQnJhbmRWb2ljZVNjaGVtYSwgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQsIEJyYW5kQXNzZXRTZXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXJyb3JDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvblJlc3VsdCwgRXhlY3V0b3IsIEV4ZWN1dGlvbkZhaWx1cmUsIFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1lbW9pemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2Z1bmN0aW9uLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlckxpa2UgfSBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2dMZXZlbCwgTG9nZ2VyIH0gZnJvbSBcIi4vc3JjL2xvZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVcmxMaWtlLCBJcFZlcnNpb24sIFBhcnNlZElwLCBDaWRyLCBVcmxCdWlsZGVyLCBQYXJzZUVtYWlsc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcXVlbmNlLCBDb250YWluZXIsIENvbGxlY3Rpb24sIE9uZU9yTWFueSwgTmFtZUxpa2UsIE5vbkZ1bmN0aW9uS2V5cywgU2VyaWFsaXphYmxlUHJpbWl0aXZlLCBTZXJpYWxpemFibGVWYWx1ZSwgVG9OdW1iZXJPcHRpb25zLCBUb0RhdGVPcHRpb25zLCBUb0R1cmF0aW9uT3B0aW9ucywgRGVlcEVxdWFsQ29tcGFyYXRvciB9IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcmVkaWNhdGVGdW5jdGlvbiwgVHlwZVByZWRpY2F0ZUZ1bmN0aW9uLCBQcmVkaWNhdGVJbnB1dCwgUHJlZGljYXRlIH0gZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbml6ZU9wdGlvbnMsIEtleU9wdGlvbnMsIElkZW50aWZpZXJPcHRpb25zLCBEZWRlbnRPcHRpb25zLCBEZXNjcmlwdGlvbiB9IGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiB9IGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuIl19
package/lib/src/object.js CHANGED
@@ -1182,4 +1182,4 @@ export function deepEqual(a, b, comparator) {
1182
1182
  }
1183
1183
  return true;
1184
1184
  }
1185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUE0Qkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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Q0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hFLElBQ0UsQ0FBQyxTQUFTLENBQ1AsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbEMsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbkMsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlcGVuZGVuY3ktZnJlZSBvYmplY3QgKyBpdGVyYWJsZSB1dGlsaXRpZXMuXG4gKlxuICogVmFsdWUgZ3VhcmRzIC8gY29lcmNpb25zIC8gc2hhcGUgdHlwZXM6IHtAbGluayBpc1JlY29yZH0gbmFycm93cyBwYXJzZWQgSlNPTlxuICogdG8gYSByZWNvcmQsIHtAbGluayB0b051bWJlcn0gY29lcmNlcyBhIGhhbmQtdHlwZWQgbnVtZXJhbCwge0BsaW5rIHRvQm9vbGVhbn1cbiAqIGNvZXJjZXMgbG9vc2UgdHJ1dGh5L2ZhbHN5IHZhbHVlcywge0BsaW5rIHRvRHVyYXRpb259IHBhcnNlcyBgMWgzMG1gIC9cbiAqIGAyIG1pbGxpc2Vjb25kc2AgdG8gbWlsbGlzLCB7QGxpbmsgdG9EYXRlfSBjb2VyY2VzIGEgZGF0ZS9JU08gc3RyaW5nL2Vwb2NoXG4gKiBudW1iZXIvcmVsYXRpdmUgZHVyYXRpb24gKGB0b0RhdGVgIGFuZCBgdG9EdXJhdGlvbmAgZmFsbCBiYWNrIHRvIGVhY2ggb3RoZXIsIHNvXG4gKiBlaXRoZXIgYWNjZXB0cyBib3RoIHJlYWRpbmdzKSwge0BsaW5rIG9wdGlvbmFsfVxuICogc3ByZWFkcyBhIGZpZWxkIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50LCB7QGxpbmsgZGVlcEVxdWFsfSBjb21wYXJlc1xuICogc3RydWN0dXJhbGx5LCB7QGxpbmsgaXNTZXJpYWxpemFibGVWYWx1ZX0gcmVqZWN0cyBhbnl0aGluZyBhIEpTT04gcm91bmQgdHJpcFxuICogd291bGQgbG9zZSBvciBjb2VyY2UsIHtAbGluayB0b1N0YWJsZUtleX0gY2Fub25pY2FsaXplcyBhIHZhbHVlIHNvIGFuIGlkZW50aXR5XG4gKiBjYW4gYmUgZGVyaXZlZCBmcm9tIGl0LCBhbmQge0BsaW5rIE5hbWVMaWtlfS97QGxpbmsgTm9uRnVuY3Rpb25LZXlzfSBkZXNjcmliZVxuICogb2JqZWN0IHNoYXBlcy5cbiAqXG4gKiBJdGVyYWJsZSBoZWxwZXJzOiB7QGxpbmsgZ2VuZXJhdG9yfSBmbGF0dGVucyBtaXhlZCBhcmd1bWVudHM7IHtAbGluayBzZXF1ZW5jZX1cbiAqIHdyYXBzIHNvdXJjZShzKSBpbiBhIGxhenksIGBBcnJheWAtY29tcGF0aWJsZSB7QGxpbmsgU2VxdWVuY2V9LiBFdmVyeVxuICogdHJhbnNmb3JtL3Rlcm1pbmFsIGlzIGEgc3RhbmRhbG9uZSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gcGxhaW4ge0BsaW5rXG4gKiBDb250YWluZXJ9cyAoc2VlIHtAbGluayBtYXB9LCB7QGxpbmsgZmlsdGVyfSwge0BsaW5rIGdyb3VwfSwgLi4uKTsgdGhlIHtAbGlua1xuICogU2VxdWVuY2V9IG1ldGhvZHMgYXJlIHRoaW4gZm9yd2FyZGVycyBvdmVyIHRoZW0gc28gdGhlIHNhbWUgbG9naWMgYmFja3MgYm90aFxuICogdGhlIGZyZWUtZnVuY3Rpb24gYW5kIHRoZSBmbHVlbnQvY2hhaW5lZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBMYXp5IHNlcXVlbmNlIG92ZXIgaXRlcmFibGUgc291cmNlKHMpLiBTZWUge0BsaW5rIHNlcXVlbmNlfS4gKi9cbmV4cG9ydCB0eXBlIFNlcXVlbmNlPFQ+ID0gU2VxdWVuY2VJbXBsPFQ+O1xuXG50eXBlIFNlcXVlbmNlU291cmNlPFQ+ID1cbiAgSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPiB8IE9uZU9yTWFueTxUPiB8IEV4dHJhY3Q8VCwgc3RyaW5nPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBub24tc2NhbGFyIHtAbGluayBJdGVyYWJsZX0gLSBvbmUgdG8gdHJlYXQgYXMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci4ge0BsaW5rIGlzQ29udGFpbmVyfSBuYXJyb3dzIHRvIHRoaXMsIGV4Y2x1ZGluZyBzdHJpbmdzLFxuICogYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucy4ge0BsaW5rIENvbGxlY3Rpb259IGlzIHRoZSBlYWdlcmx5LVxuICogc2l6ZWQgc3Vic2V0LiBUaGUgZWxlbWVudCBkZWZhdWx0cyB0byBgdW5rbm93bmAgc28gYW55IGBDb2xsZWN0aW9uYCBpc1xuICogYXNzaWduYWJsZSB0byBhIGJhcmUgYENvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRhaW5lcjxUID0gdW5rbm93bj4gPSBJdGVyYWJsZTxUPjtcblxuLyoqXG4gKiBBIGJ1aWx0LWluLCBlYWdlcmx5LXNpemVkIHtAbGluayBDb250YWluZXJ9OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9ICh3aG9zZSAqdmFsdWVzKiBhcmUgYFRgIC0gYSBNYXAgaXRlcmF0ZXMgYFtrZXksIHZhbHVlXWAgZW50cmllcyxcbiAqIHNvIGl0cyBlbGVtZW50IHR5cGUgZGlmZmVycywgYnV0IGl0cyB2YWx1ZSB0eXBlIGlzIGBUYCkuIEFsbCBzaGFyZSBhIGNoZWFwXG4gKiBlbXB0aW5lc3MgY2hlY2sgKHtAbGluayBpc0VtcHR5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb248VD4gPSBSZWFkb25seUFycmF5PFQ+IHwgUmVhZG9ubHlTZXQ8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPjtcblxuLyoqIE5vbi1lbXB0eSB0dXBsZSB1c2VkIHdoZXJlIGFuIEFQSSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWUuICovXG5leHBvcnQgdHlwZSBPbmVPck1hbnk8VD4gPSBbVCwgLi4uVFtdXTtcblxuLyoqIE5hcnJvdyBhIHJlYWRvbmx5IGFycmF5IHRvIGEgbm9uLWVtcHR5IHtAbGluayBPbmVPck1hbnl9IHR1cGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lT3JNYW55PFQgPSB1bmtub3duPih2YWx1ZTogcmVhZG9ubHkgVFtdKTogdmFsdWUgaXMgT25lT3JNYW55PFQ+IHtcbiAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7XG59XG5cbi8qKiBBIHNvdXJjZSBhY2NlcHRlZCBieSBhIHZhcmlhZGljIG9wOiBhIHtAbGluayBDb250YWluZXJ9IG9mIGBUYCwgb3Igbm90aGluZy4gKi9cbnR5cGUgU291cmNlPFQ+ID0gQ29udGFpbmVyPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbGVtZW50IHR5cGUgb2YgYSB7QGxpbmsgZ3JvdXB9IGJ1Y2tldCBhcnJheTogd2hlbiB0aGUgcHJlZGljYXRlIGBQYCBpcyBhIHR5cGVcbiAqIGd1YXJkIChgdmFsdWUgaXMgU2ApLCB0aGUgYnVja2V0IGlzIG5hcnJvd2VkIHRvIGBTICYgVGA7IG90aGVyd2lzZSBpdCBzdGF5cyBgVGAuXG4gKi9cbnR5cGUgR3JvdXBWYWx1ZTxULCBQPiA9IFAgZXh0ZW5kcyAodmFsdWU6IGFueSwgLi4ucmVzdDogYW55W10pID0+IHZhbHVlIGlzIGluZmVyIFMgPyBTICYgVCA6IFQ7XG5cbi8qKiBBIG1hcCBvZiBncm91cCBuYW1lIC0+IHByZWRpY2F0ZSwgYXMgYWNjZXB0ZWQgYnkge0BsaW5rIGdyb3VwfS4gKi9cbnR5cGUgR3JvdXBQcmVkaWNhdGVzPFQ+ID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBhIHtAbGluayBDb2xsZWN0aW9ufTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfS4gTmFycm93cyBgdmFsdWVgIHNvIGl0cyBlbGVtZW50L3ZhbHVlIHR5cGUgaXMgdHJlYXRlZCBhcyBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCAob3IgTWFwIHZhbHVlKSB0eXBlIGFzc2VydGVkIGZvciB0aGUgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb2xsZWN0aW9ufTxgVGA+KSBmb3IgYVxuICogICBidWlsdC1pbiBhcnJheS9zZXQvbWFwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbGxlY3Rpb248VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXA7XG59XG5cbi8qKlxuICogYHRydWVgIHdoZW4gYSB7QGxpbmsgQ29sbGVjdGlvbn0gaGFzIG5vIGVsZW1lbnRzLiBVc2VzIGBsZW5ndGhgIGZvciBhcnJheXNcbiAqIGFuZCBgc2l6ZWAgZm9yIHtAbGluayBTZXR9L3tAbGluayBNYXB9LlxuICpcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIC0gVGhlIGFycmF5LCBzZXQsIG9yIG1hcCB0byB0ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjx1bmtub3duPiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zPzogeyByZWN1cnNpdmU/OiBib29sZWFuIH0sXG4pOiBib29sZWFuIHtcbiAgZnVuY3Rpb24gdmlzaXQodmFsdWU6IHVua25vd24sIHNlZW4/OiBTZXQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChzZWVuPy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHNlZW4/LmFkZCh2YWx1ZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMCB8fCAoc2VlbiA/IHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNpemUgPT09IDAgfHwgKHNlZW4gPyBbLi4udmFsdWVdLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB2YWx1ZS5zaXplID09PSAwIHx8XG4gICAgICAgICAgKHNlZW4gPyBbLi4udmFsdWUudmFsdWVzKCldLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHNlZW4pIHtcbiAgICAgICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gdmlzaXQoKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBzZWVuKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZpc2l0KGNvbGxlY3Rpb24sIG9wdGlvbnM/LnJlY3Vyc2l2ZSA/IG5ldyBTZXQoKSA6IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNvdXJjZSB0byBhbiBpdGVyYWJsZSBvZiBpdHMgYFRgIHZhbHVlcywgc28gTWFwcyBhcmUgdHJlYXRlZFxuICogdW5pZm9ybWx5IHdpdGggYXJyYXlzL3NldHM6IGEge0BsaW5rIE1hcH0geWllbGRzIGl0cyAqdmFsdWVzKiAobWF0Y2hpbmdcbiAqIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYCksIGFueSBvdGhlciBpdGVyYWJsZSB5aWVsZHMgaXRzZWxmLiBUaGlzXG4gKiBpcyB3aGF0IHtAbGluayBzZXF1ZW5jZX0gY29uc3VtZXMsIHNvIGEgYE1hcGAgY29udHJpYnV0ZXMgdmFsdWVzIGV2ZXJ5d2hlcmVcbiAqIHJhdGhlciB0aGFuIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZXM8VD4oc291cmNlOiBJdGVyYWJsZTxUPiB8IFJlYWRvbmx5TWFwPHVua25vd24sIFQ+KTogSXRlcmFibGU8VD4ge1xuICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWFwID8gc291cmNlLnZhbHVlcygpIDogKHNvdXJjZSBhcyBJdGVyYWJsZTxUPik7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29udGFpbmVyfSAtIGFuIGl0ZXJhYmxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb2xsZWN0aW9uXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgdmFsdWVzIHRoYXQgYXJlIHRlY2huaWNhbGx5IGl0ZXJhYmxlIGJ1dCBzaG91bGQgYmVcbiAqIHRyZWF0ZWQgYXMgc2NhbGFycyBoZXJlIC0gc3RyaW5ncywgYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucyAtXG4gKiBzbyBhIGxvbmUgc3RyaW5nIGlzIG5ldmVyIHNwcmVhZCBjaGFyYWN0ZXItYnktY2hhcmFjdGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGl0ZXJhYmxlLlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCAobmFycm93aW5nIGB2YWx1ZWAgdG8ge0BsaW5rIENvbnRhaW5lcn08YFRgPikgZm9yIGEgbm9uLXN0cmluZ1xuICogICBpdGVyYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRhaW5lcjxUPiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpICYmXG4gICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyBbU3ltYm9sLml0ZXJhdG9yXT86IHVua25vd24gfSlbU3ltYm9sLml0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNlcXVlbmNlU291cmNlczxUPiguLi5zb3VyY2VzOiBTZXF1ZW5jZVNvdXJjZTxUPltdKTogSXRlcmFibGU8VD5bXSB7XG4gIGNvbnN0IHNvdXJjZUl0ZXJhYmxlczogSXRlcmFibGU8VD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IChpc0NvbGxlY3Rpb24oc291cmNlKSAmJiBpc0VtcHR5KHNvdXJjZSkpKSBjb250aW51ZTtcbiAgICBzb3VyY2VJdGVyYWJsZXMucHVzaChpc0NvbnRhaW5lcjxUPihzb3VyY2UpID8gdmFsdWVzKHNvdXJjZSkgOiBbc291cmNlIGFzIFRdKTtcbiAgfVxuICByZXR1cm4gc291cmNlSXRlcmFibGVzO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIG5lc3RlZCBhcnJheXMgZm9yIHtAbGluayBmbGF0fS4gTm9uLWFycmF5IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBhXG4gKiBzaW5nbGUtZWxlbWVudCBpdGVyYWJsZTsgZGVwdGggZGVjcmVtZW50cyBwZXIgYXJyYXkgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5WYWx1ZSh2YWx1ZTogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IEl0ZXJhYmxlPHVua25vd24+IHtcbiAgaWYgKGRlcHRoID4gMCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG5leHREZXB0aCA9IE51bWJlci5pc0Zpbml0ZShkZXB0aCkgPyBkZXB0aCAtIDEgOiBkZXB0aDtcbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHlpZWxkKiBmbGF0dGVuVmFsdWUoaXRlbSwgbmV4dERlcHRoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gW3ZhbHVlXTtcbn1cblxuLyoqIFdyYXAgYSBwZXItZWxlbWVudCB0cmFuc2Zvcm0gKGVhY2ggZWxlbWVudCAtPiBhbiBpdGVyYWJsZSkgYXMgYSBsYXp5IHtAbGluayBTZXF1ZW5jZX0uICovXG5mdW5jdGlvbiBkZXJpdmU8VCwgVT4oXG4gIHNvdXJjZTogSXRlcmFibGU8VD4sXG4gIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IEl0ZXJhYmxlPFU+LFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvdXJjZSkgeWllbGQqIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIExpa2Uge0BsaW5rIGRlcml2ZX0sIGJ1dCB5aWVsZHMgb25lIHZhbHVlIHBlciBzb3VyY2UgZWxlbWVudCAobm8gd3JhcHBlciBpdGVyYWJsZSkuICovXG5mdW5jdGlvbiBkZXJpdmVPbmU8VCwgVT4oc291cmNlOiBJdGVyYWJsZTxUPiwgZm46ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSk6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLm1hcGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gbWFwIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsZWQgcGVyIGVsZW1lbnQgd2l0aCBpdHMgaW5kZXg7IGl0cyByZXN1bHQgaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcDxULCBVPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUsXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmVPbmUoc2VxdWVuY2Uoc291cmNlKSwgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIEEgdHlwZS1ndWFyZCBwcmVkaWNhdGUgbmFycm93cyB0aGUgcmVzdWx0aW5nIGVsZW1lbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBmaWx0ZXIgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBLZWVwcyBlbGVtZW50cyBmb3Igd2hpY2ggaXQgcmV0dXJucyBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTZXF1ZW5jZTxTPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogU2VxdWVuY2U8VD4ge1xuICByZXR1cm4gZGVyaXZlKHNlcXVlbmNlKHNvdXJjZSksIGZ1bmN0aW9uKiAodmFsdWUsIGluZGV4KSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSB5aWVsZCB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzIGFuZCB5aWVsZHMgb25seSBlbGVtZW50cyB0aGF0IGFyZSBub3QgYG51bGxgIG9yXG4gKiBgdW5kZWZpbmVkYCwgbmFycm93aW5nIHRoZSBlbGVtZW50IHR5cGUgdG8ge0BsaW5rIE5vbk51bGxhYmxlfTxgVGA+LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk51bGw8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxOb25OdWxsYWJsZTxUPj4ge1xuICByZXR1cm4gZmlsdGVyKHNlcXVlbmNlKC4uLnNvdXJjZXMpLCAodmFsdWUpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiA9PiB2YWx1ZSAhPSBudWxsKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRNYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gUmV0dXJucyBhIHZhbHVlIG9yIGFycmF5IG9mIHZhbHVlcywgZmxhdHRlbmVkIG9uZSBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgeWllbGQqIHJlc3VsdDtcbiAgICBlbHNlIHlpZWxkIHJlc3VsdCBhcyBVO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIChhcnJheXMgb25seSkuIGBkZXB0aGAgbGVhZHMgc28gdGhlXG4gKiBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljOyB1c2UgYGRlcHRoIDwgMWAgZm9yIGEgbm8tb3AgcGFzc3Rocm91Z2guXG4gKlxuICogQHBhcmFtIGRlcHRoIC0gSG93IG1hbnkgYXJyYXkgbGV2ZWxzIHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUsIHRoZW4gZmxhdHRlbiAobnVsbGlzaCBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXQ8VD4oZGVwdGg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICBpZiAoZGVwdGggPCAxKSByZXR1cm4gc3JjO1xuICByZXR1cm4gZGVyaXZlKHNyYywgKHZhbHVlKSA9PiBmbGF0dGVuVmFsdWUodmFsdWUsIGRlcHRoKSkgYXMgU2VxdWVuY2U8VD47XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzLCB0aGVuIGxhemlseSB5aWVsZHMgdmFsdWVzIGluIGVuY291bnRlciBvcmRlcixcbiAqIHNraXBwaW5nIGEgdmFsdWUgb25seSB3aGVuIGFuIGVxdWFsIG9uZSB3YXMgYWxyZWFkeSB5aWVsZGVkIChgU2V0YCAvXG4gKiBTYW1lVmFsdWVaZXJvKS4gVW5pcXVlbmVzcyBpcyBjaGVja2VkIHBlciBlbGVtZW50IGFzIGl0IGlzIGNvbnN1bWVkLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RpbmN0PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxUPigpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGBzb3VyY2VgLCB0aGVuIGVhY2ggYXBwZW5kZWQgYGl0ZW1gIGluIG9yZGVyIChhcnJheXMgc3ByZWFkIG9uZSBsZXZlbCksXG4gKiBtaXJyb3JpbmcgYEFycmF5LnByb3RvdHlwZS5jb25jYXRgLiBgaXRlbXNgIGFyZSBzY2FsYXIgdmFsdWVzL2FycmF5cywgbm90XG4gKiBjb250YWluZXJzLCBzbyBgc291cmNlYCBzdGF5cyBhIHNpbmdsZSBsZWFkaW5nIGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgbGVhZGluZyBjb250YWluZXIgKG51bGxpc2ggeWllbGRzIGp1c3QgdGhlIGl0ZW1zKS5cbiAqIEBwYXJhbSBpdGVtcyAtIFZhbHVlcyAob3IgYXJyYXlzIG9mIHZhbHVlcykgYXBwZW5kZWQgYWZ0ZXIgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW11cbik6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2Uoc291cmNlKTtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICB5aWVsZCogc3JjO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB5aWVsZCogaXRlbTtcbiAgICAgICAgZWxzZSB5aWVsZCBpdGVtIGFzIFQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGF0IG1vc3QgYGNvdW50YCBlbGVtZW50cyBmcm9tIHRoZSBmcm9udCBvZiB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMuXG4gKiBgY291bnRgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBjb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHlpZWxkIChgPD0gMGAgeWllbGRzIG5vbmUpLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFrZTxUPihjb3VudDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgaWYgKGNvdW50IDw9IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgdGFrZW4gPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICAgIGlmICgrK3Rha2VuID49IGNvdW50KSByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU3BsaXRzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIG9uZSBhcnJheSBwZXIgbmFtZWQgcHJlZGljYXRlLiBDb25zdW1lc1xuICogdGhlIGlucHV0IG9uY2UsIHJvdXRpbmcgZWFjaCBlbGVtZW50IHRvIHRoZSBGSVJTVCBwcmVkaWNhdGUgaXQgc2F0aXNmaWVzIChzb1xuICogZ3JvdXBzIGFyZSBkaXNqb2ludCk7IGVsZW1lbnRzIG1hdGNoaW5nIG5vIHByZWRpY2F0ZSBhcmUgZHJvcHBlZC4gVHlwZS1ndWFyZFxuICogcHJlZGljYXRlcyBuYXJyb3cgdGhlaXIgZ3JvdXAncyBlbGVtZW50IHR5cGUgKHNlZSB7QGxpbmsgR3JvdXBWYWx1ZX0pLlxuICogYHByZWRpY2F0ZXNgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEB0eXBlUGFyYW0gRyAtIFRoZSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUuXG4gKiBAcGFyYW0gcHJlZGljYXRlcyAtIE5hbWVkIHByZWRpY2F0ZXM7IGV2YWx1YXRlZCBpbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMsIGVhY2ggYW4gYXJyYXkgb2YgaXRzIGdyb3VwJ3MgZWxlbWVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY29uc3QgeyBzdHJpbmdzLCBmbnMgfSA9IGdyb3VwKHsgc3RyaW5nczogaXNTdHJpbmcsIGZuczogaXNGdW5jdGlvbiB9LCB4cyk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cDxULCBHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihcbiAgcHJlZGljYXRlczogRyxcbiAgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W11cbik6IHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByZWRpY2F0ZXMpIGFzIChrZXlvZiBHKVtdO1xuICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxrZXlvZiBHLCBUW10+KGtleXMubWFwKChrZXkpID0+IFtrZXksIFtdXSkpO1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKC4uLnNvdXJjZXMpKSB7XG4gICAgY29uc3QgaSA9IGluZGV4Kys7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHByZWRpY2F0ZXNba2V5XSEodmFsdWUsIGkpKSB7XG4gICAgICAgIGJ1Y2tldHMuZ2V0KGtleSkhLnB1c2godmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICByZXN1bHRba2V5XSA9IGJ1Y2tldHMuZ2V0KGtleSkhIGFzIEdyb3VwVmFsdWU8VCwgR1t0eXBlb2Yga2V5XT5bXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kTGFzdGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuIEEgdHlwZSBndWFyZCBuYXJyb3dzIHRoZSByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtYXRjaDogVCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIG1hdGNoID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIGVsZW1lbnRzIHVudGlsIGEgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW5kZXg8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAsIG92ZXIgYSBzaW5nbGVcbiAqIHtAbGluayBDb250YWluZXJ9LiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2ggPSAtMTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSBtYXRjaCA9IGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuc29tZWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb21lPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIFNob3J0LWNpcmN1aXRzIG9uIHRoZSBmaXJzdCBmYWlsdXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoPFQ+KHNvdXJjZTogU291cmNlPFQ+LCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgY2FsbGJhY2sodmFsdWUsIGluZGV4KyspO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuYXRgIG92ZXIgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogTm9uLW5lZ2F0aXZlIGluZGljZXMgc2NhbiBsYXppbHk7IG5lZ2F0aXZlIGluZGljZXMgbWF0ZXJpYWxpemUgZmlyc3QuIGBpbmRleGBcbiAqIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBpbmRleCAtIFplcm8tYmFzZWQgcG9zaXRpb247IG5lZ2F0aXZlIGNvdW50cyBmcm9tIHRoZSBlbmQuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdDxUPihpbmRleDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHRvQXJyYXkoc3JjKS5hdChpbmRleCk7XG4gIGxldCBpID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICBpZiAoaSsrID09PSBpbmRleCkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBOb3JtYWxpemUgb25lIHZhbHVlIG9yIGFuIGV4aXN0aW5nIHZhbHVlIGxpc3QgaW50byBhIHZhbHVlIGxpc3QuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PbmVPck1hbnk8VD4oaW5wdXQ6IFQgfCBPbmVPck1hbnk8VD4pOiBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBzaW5nbGUtcGFzc1xuICogc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogcmVhZG9ubHkgVFtdIHtcbiAgcmV0dXJuIFsuLi5zZXF1ZW5jZSguLi5zb3VyY2VzKV07XG59XG5cbi8qKlxuICogTGF6eSBpdGVyYWJsZSBzZXF1ZW5jZSB3aXRoIGBBcnJheWAtY29tcGF0aWJsZSB0cmFuc2Zvcm1zIGFuZCB0ZXJtaW5hbFxuICogbWV0aG9kcy4gU2luZ2xlLXBhc3MgYnkgZGVmYXVsdDsgY2FsbCB7QGxpbmsgU2VxdWVuY2VJbXBsLmNhY2hlfSB0byByZXRhaW5cbiAqIHB1bGxlZCB2YWx1ZXMgZm9yIHJlLWl0ZXJhdGlvbi4gQnVpbHQgZm9yIGdlbmVyYXRvcnMgYW5kIG90aGVyIHNvdXJjZXMgd2hlcmVcbiAqIGEgc2Vjb25kIHBhc3MgaXMgbm90IGd1YXJhbnRlZWQuXG4gKlxuICogVGhlIG1ldGhvZHMgZm9yd2FyZCB0byB0aGUgc3RhbmRhbG9uZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSAtIHNlZSBlYWNoXG4gKiBtZXRob2QncyBgQHNlZWAgLSBzbyB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgY2hhaW5lZCBzdHlsZXMgc2hhcmUgb25lIGltcGwuXG4gKi9cbmNsYXNzIFNlcXVlbmNlSW1wbDxUPiB7XG4gIHByaXZhdGUgaXRlcmF0b3I/OiBJdGVyYXRvcjxUPjtcbiAgcHJpdmF0ZSBleGhhdXN0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBUW10gfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHsgcmVhZG9ubHkgZXhoYXVzdGVkPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuZXhoYXVzdGVkID0gc3RhdGUuZXhoYXVzdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvbmNlLCBjcmVhdGluZyB0aGUgaXRlcmF0b3Igb24gZmlyc3QgdXNlLiAqL1xuICBwcml2YXRlIHB1bGwoKTogSXRlcmF0b3JSZXN1bHQ8VD4ge1xuICAgIHRoaXMuaXRlcmF0b3IgPz89IHRoaXMuc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGlmICghdGhpcy5jYWNoaW5nKSB7XG4gICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgIGZvciAobGV0IG5leHQgPSB0aGlzLnB1bGwoKTsgIW5leHQuZG9uZTsgbmV4dCA9IHRoaXMucHVsbCgpKSB7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhY2hlZDogaXRlcmF0ZSBsaWtlIGEgbGlzdC4gQWx3YXlzIHJlcGxheSB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YXJ0LFxuICAgICAgLy8gZXh0ZW5kaW5nIGl0IGZyb20gdGhlIHNvdXJjZSBvbiBkZW1hbmQgdW50aWwgZXhoYXVzdGVkLiBBIGJyb2tlbiBsb29wXG4gICAgICAvLyBsZWF2ZXMgdGhlIGJ1ZmZlciBpbnRhY3QsIHNvIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMgb3ZlciBmcm9tIHRoZVxuICAgICAgLy8gYmVnaW5uaW5nLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIhO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGluZGV4IDwgYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcltpbmRleCsrXSE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gobmV4dC52YWx1ZSk7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG1hcH0gKi9cbiAgbWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIG1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmlsdGVyfSAqL1xuICBmaWx0ZXI8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogU2VxdWVuY2U8Uz47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZpbHRlcih0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG5vbk51bGx9ICovXG4gIG5vbk51bGwoKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgICByZXR1cm4gbm9uTnVsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0TWFwfSAqL1xuICBmbGF0TWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+KTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBmbGF0TWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0fSAqL1xuICBmbGF0KGRlcHRoID0gMSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmxhdChkZXB0aCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZGlzdGluY3R9ICovXG4gIGRpc3RpbmN0KCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZGlzdGluY3QodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgY29uY2F0fSAqL1xuICBjb25jYXQoLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gY29uY2F0KHRoaXMsIC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgeWllbGRzIHRoaXMgc2VxdWVuY2UgZm9sbG93ZWQgYnkgZWFjaCBpdGVyYWJsZSBgc291cmNlYCBpbiBvcmRlci5cbiAgICogTGlrZSB7QGxpbmsgY29uY2F0fSwgYnV0IGZvciBpdGVyYWJsZSBzb3VyY2VzIChnZW5lcmF0b3JzLCBvdGhlciBzZXF1ZW5jZXMsXG4gICAqIGBTZXRgLCBgTWFwYCwgZXRjLikgcmF0aGVyIHRoYW4gc2NhbGFyIHZhbHVlcyBvciBhcnJheXMuIEEge0BsaW5rIE1hcH1cbiAgICogc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHNlcXVlbmNlfVxuICAgKi9cbiAgam9pbiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAgIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyh0aGlzLCAuLi5zb3VyY2VzKTtcbiAgICByZXR1cm4gc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSA/IHRoaXMgOiBzZXF1ZW5jZSguLi5zb3VyY2VJdGVyYWJsZXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHRha2V9ICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGFrZShjb3VudCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZ3JvdXB9ICovXG4gIGdyb3VwPEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KHByZWRpY2F0ZXM6IEcpOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gICAgcmV0dXJuIGdyb3VwKHByZWRpY2F0ZXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYWNoZWQsIHJlLWl0ZXJhYmxlIHZpZXcgb2YgdGhpcyBzZXF1ZW5jZS4gQW4gYWxyZWFkeS1jYWNoaW5nXG4gICAqIHNlcXVlbmNlIHJldHVybnMgaXRzZWxmOyBvdGhlcndpc2UgdGhpcyBvbmUtcGFzcyBzZXF1ZW5jZSBpcyB3cmFwcGVkIGluIGFcbiAgICogbmV3IGluc3RhbmNlIHRoYXQgcmV0YWlucyBwdWxsZWQgdmFsdWVzLiBJdGVyYXRlIHRoZSByZXR1cm5lZCBpbnN0YW5jZSwgbm90XG4gICAqIHRoZSBvcmlnaW5hbCwgdG8gYXZvaWQgY29tcGV0aW5nIGZvciB0aGUgc2FtZSBzaW5nbGUtcGFzcyBzb3VyY2UuXG4gICAqL1xuICBjYWNoZSgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGluZyA/IHRoaXMgOiBuZXcgU2VxdWVuY2VJbXBsKHRoaXMsIFtdKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kfSAqL1xuICBmaW5kPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmQodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdH0gKi9cbiAgZmluZExhc3Q8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRJbmRleH0gKi9cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3RJbmRleH0gKi9cbiAgZmluZExhc3RJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBzb21lfSAqL1xuICBzb21lKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvbWUodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBldmVyeX0gKHRoZSBgUyBleHRlbmRzIFRgIG92ZXJsb2FkIG5hcnJvd3MgYXQgY29tcGlsZSB0aW1lIG9ubHkpLiAqL1xuICBldmVyeTxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiB0aGlzIGlzIFNlcXVlbmNlPFM+O1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZXJ5KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZm9yRWFjaH0gKi9cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZm9yRWFjaCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgYXR9ICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYXQoaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBzZXF1ZW5jZSBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBhIHNpbmdsZS1wYXNzIHNvdXJjZTsgYVxuICAgKiBjYWNoZWQsIGV4aGF1c3RlZCBzZXF1ZW5jZSBjb3BpZXMgaXRzIGJ1ZmZlciBkaXJlY3RseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgdG9BcnJheX1cbiAgICovXG4gIHRvQXJyYXkoKTogcmVhZG9ubHkgVFtdIHtcbiAgICBpZiAodGhpcy5jYWNoaW5nICYmIHRoaXMuZXhoYXVzdGVkKSByZXR1cm4gWy4uLnRoaXMuYnVmZmVyIV07XG4gICAgcmV0dXJuIHRvQXJyYXkodGhpcyk7XG4gIH1cbn1cblxuLyoqIFNoYXJlZCBlbXB0eSBzZXF1ZW5jZSBzaW5nbGV0b24sIHJldXNhYmxlIGZvciBhbnkgZWxlbWVudCB0eXBlLiAqL1xuY29uc3QgZW1wdHlTZXF1ZW5jZTogU2VxdWVuY2U8bmV2ZXI+ID0gbmV3IFNlcXVlbmNlSW1wbChbXSwgdW5kZWZpbmVkLCB7XG4gIGV4aGF1c3RlZDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIFdyYXAgb25lIG9yIG1vcmUgaXRlcmFibGUgYHNvdXJjZXNgIGluIGEgc2luZ2xlIGxhenkge0BsaW5rIFNlcXVlbmNlfSxcbiAqIGl0ZXJhdGVkIGluIG9yZGVyLiBgbnVsbGAvYHVuZGVmaW5lZGAgc291cmNlcyBhcmUgc2tpcHBlZDsgd2hlbiBub3RoaW5nXG4gKiByZW1haW5zIChldmVyeSBzb3VyY2Ugb21pdHRlZCwgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW4gZW1wdHkgYXJyYXkgL1xuICogYFNldGAgLyBgTWFwYCksIHtAbGluayBlbXB0eVNlcXVlbmNlfSBpcyByZXR1cm5lZC4gVGhlIHJlc3VsdCBpcyBzaW5nbGUtcGFzc1xuICogLSBjYWxsIGAuY2FjaGUoKWAgdG8gbWFrZSBpdCByZS1pdGVyYWJsZS5cbiAqXG4gKiBBIHtAbGluayBNYXB9IHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzIChzZWUge0BsaW5rIHZhbHVlc30pLCBjb25zaXN0ZW50XG4gKiB3aXRoIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHNvdXJjZXMgLSBJdGVyYWJsZXMgdG8gY29uY2F0ZW5hdGUsIGluIG9yZGVyIChgTWFwYCBzb3VyY2VzIHVzZSB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2U8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgLy8gU2tpcCBudWxsaXNoIHNvdXJjZXMgYW5kIGtub3duLWVtcHR5IGNvbGxlY3Rpb25zOyBub3JtYWxpemUgdGhlIHJlc3QgdG9cbiAgLy8gdGhlaXIgdmFsdWVzIHNvIGEgTWFwIGNvbnRyaWJ1dGVzIHZhbHVlcyByYXRoZXIgdGhhbiBba2V5LCB2YWx1ZV0gZW50cmllcy5cbiAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKC4uLnNvdXJjZXMpO1xuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIC8vIFJldXNlIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFzLWlzIHJhdGhlciB0aGFuIHJlLXdyYXBwaW5nIGl0LlxuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG9ubHkgPSBzb3VyY2VJdGVyYWJsZXNbMF0hO1xuICAgIHJldHVybiBvbmx5IGluc3RhbmNlb2YgU2VxdWVuY2VJbXBsID8gKG9ubHkgYXMgU2VxdWVuY2U8VD4pIDogbmV3IFNlcXVlbmNlSW1wbChvbmx5LCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBuZXcgU2VxdWVuY2VJbXBsKFxuICAgIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlSXRlcmFibGVzKSB5aWVsZCogc291cmNlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBhIG1peCBvZiBzaW5nbGUgaXRlbXMgYW5kIGl0ZXJhYmxlcyBpbnRvIG9uZSBsYXp5IHtAbGluayBHZW5lcmF0b3J9LlxuICpcbiAqIEFyZ3VtZW50cyBhcmUgZW1pdHRlZCBpbiBvcmRlcjogYG51bGxgL2B1bmRlZmluZWRgIGFyZSBza2lwcGVkLCBub24tc3RyaW5nXG4gKiBpdGVyYWJsZXMgKHBlciB7QGxpbmsgaXNDb250YWluZXJ9KSBhcmUgeWllbGRlZCBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZFxuICogYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIHN0cmluZ3MpIGlzIHlpZWxkZWQgYXMgYSBzaW5nbGUgaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci5cbiAqIEBwYXJhbSBpdGVtcyAtIEl0ZW1zIGFuZC9vciBpdGVyYWJsZXMgdG8gZmxhdHRlbiwgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvdmVyIHRoZSBmbGF0dGVuZWQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2VuZXJhdG9yPFQ+KFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBJdGVyYWJsZTxUPiB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IEdlbmVyYXRvcjxUPiB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0NvbnRhaW5lcihpdGVtKSkge1xuICAgICAgeWllbGQqIGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JqZWN0IHZhbHVlIGd1YXJkcywgY29lcmNpb25zLCBhbmQgc3RydWN0dXJhbCBlcXVhbGl0eVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNaW5pbWFsIHNoYXBlIGZvciBvYmplY3RzIHRoYXQgZXhwb3NlIGFuIG9wdGlvbmFsIGBuYW1lYCAoZS5nLiBBcHBLaXQgcGx1Z2lucykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVMaWtlIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqIFByb3BlcnR5IGtleXMgb2YgYFRgIHdob3NlIHZhbHVlcyBhcmUgbm90IGNhbGxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgTm9uRnVuY3Rpb25LZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBOYXJyb3cgYHZhbHVlYCB0byBhIHBsYWluIChub24tYXJyYXkpIG9iamVjdC4gVXNlIGFzIGEgdHlwZSBndWFyZFxuICogYmVmb3JlIGluZGV4aW5nIGludG8gLyBtdXRhdGluZyBwYXJzZWQgSlNPTiBzbyB0aGUgYWNjZXNzIGlzXG4gKiB0eXBlLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc1JlY29yZChwYXJzZWQpKSBwYXJzZWQuZm9vID0gMTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqIEEgSlNPTiBzY2FsYXIuIGB1bmRlZmluZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgLSBgSlNPTi5zdHJpbmdpZnlgIGRyb3BzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbi8qKlxuICogQW55IHZhbHVlIHRoYXQgc3Vydml2ZXMgYSBgSlNPTi5zdHJpbmdpZnlgL2BKU09OLnBhcnNlYCByb3VuZCB0cmlwIHVuY2hhbmdlZC5cbiAqXG4gKiBVc2UgaXQgaW5zdGVhZCBvZiBgdW5rbm93bmAgb24gYSBib3VuZGFyeSB0aGF0IHdpbGwgc2VyaWFsaXplIGl0cyBpbnB1dCAtIGFcbiAqIG1lc3NhZ2UgcGF5bG9hZCwgYSBjYWNoZSBlbnRyeSwgYSBjb25maWcgYmxvYiB3cml0dGVuIHRvIGRpc2sgLSBzbyBhIGBEYXRlYCxcbiAqIGEgYE1hcGAsIG9yIGEgY2xhc3MgaW5zdGFuY2UgaXMgYSBjb21waWxlIGVycm9yIGF0IHRoZSBjYWxsIHNpdGUgcmF0aGVyIHRoYW4gYVxuICogcmVjZWl2ZXIgcXVpZXRseSBnZXR0aW5nIGEgc3RyaW5nIG9yIGB7fWAuIHtAbGluayBpc1NlcmlhbGl6YWJsZVZhbHVlfSBpcyB0aGVcbiAqIHJ1bnRpbWUgaGFsZiwgZm9yIGlucHV0IHRoZSBjb21waWxlciBjYW5ub3Qgdm91Y2ggZm9yLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9XG4gIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSB8IFNlcmlhbGl6YWJsZVZhbHVlW10gfCB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6YWJsZVZhbHVlIH07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGB2YWx1ZWAgc3Vydml2ZXMgYSBKU09OIHJvdW5kIHRyaXAgd2l0aCBubyBsb3NzIGFuZCBubyBjb2VyY2lvbi5cbiAqXG4gKiBTdHJpY3RlciB0aGFuIFwiYEpTT04uc3RyaW5naWZ5YCBkaWQgbm90IHRocm93XCIsIGJlY2F1c2UgdGhhdCBzdWNjZWVkcyB3aGlsZVxuICogc2lsZW50bHkgQ0hBTkdJTkcgdGhlIHZhbHVlOiBhIGBEYXRlYCBiZWNvbWVzIGEgc3RyaW5nLCBgTmFOYCBhbmQgYEluZmluaXR5YFxuICogYmVjb21lIGBudWxsYCwgYSBgTWFwYCBiZWNvbWVzIGB7fWAsIGFuZCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzIGZyb20gYW4gb2JqZWN0XG4gKiBvciB0dXJucyBpbnRvIGBudWxsYCBpbnNpZGUgYW4gYXJyYXkuIEVhY2ggb2YgdGhvc2UgcmVhY2hlcyB0aGUgZmFyIHNpZGUgYXNcbiAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgd2FzIHNlbnQsIHNvIGFsbCBvZiB0aGVtIGFyZSByZWplY3RlZCBoZXJlLlxuICpcbiAqIFJlamVjdGVkOiBub24tZmluaXRlIG51bWJlcnMsIGB1bmRlZmluZWRgLCBmdW5jdGlvbnMsIHN5bWJvbHMsIGJpZ2ludHMsIGNsYXNzXG4gKiBpbnN0YW5jZXMgYW5kIGFueXRoaW5nIGVsc2Ugd2l0aCBhIHByb3RvdHlwZSBvdGhlciB0aGFuIGBPYmplY3QucHJvdG90eXBlYCBvclxuICogYG51bGxgIChgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgYFJlZ0V4cGAsIGBCdWZmZXJgKSwgYW5kIGFueSBvYmplY3QgZ3JhcGhcbiAqIGNvbnRhaW5pbmcgYSBjeWNsZS4gQWNjZXB0ZWQ6IHN0cmluZ3MsIGJvb2xlYW5zLCBgbnVsbGAsIGZpbml0ZSBudW1iZXJzLCBwbGFpblxuICogb2JqZWN0cywgYXJyYXlzLCBhbmQgbmVzdGluZ3Mgb2YgdGhvc2UuXG4gKlxuICogTmFycm93cyB0byB7QGxpbmsgU2VyaWFsaXphYmxlVmFsdWV9IHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgYWxzbyBzZXJ2ZXNcbiAqIGFzIHRoZSB2YWxpZGF0b3IgZm9yIHVudHJ1c3RlZCBpbnB1dCAtIGEgcmVxdWVzdCBib2R5LCBhIGRlY29kZWQgbm90aWZpY2F0aW9uXG4gKiBwYXlsb2FkIC0gd2hlcmUgdGhlIGFuc3dlciBzaG91bGQgYmUgYSA0MDAgYW5kIG5vdCBhIHRocm93LiBOZXZlciB0aHJvd3MuXG4gKlxuICogRGlzdGluY3QgZnJvbSB7QGxpbmsgZGVlcEVxdWFsfSdzIG5vdGlvbiBvZiBjb21wYXJhYmxlOiB0aGF0IG9uZSBIQU5ETEVTXG4gKiBgRGF0ZWAvYE1hcGAvYFNldGAgc3RydWN0dXJhbGx5LCB3aGlsZSB0aGlzIG9uZSByZWplY3RzIHRoZW0gcHJlY2lzZWx5IGJlY2F1c2VcbiAqIEpTT04gY2Fubm90IGNhcnJ5IHRoZW0uXG4gKlxuICogQHBhcmFtIGFuY2VzdG9ycyBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYTogWzEsIFwieFwiLCBudWxsXSB9KTsgLy8gdHJ1ZVxuICogaXNTZXJpYWxpemFibGVWYWx1ZSh7IGF0OiBuZXcgRGF0ZSgpIH0pOyAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBhIHN0cmluZ1xuICogaXNTZXJpYWxpemFibGVWYWx1ZShOdW1iZXIuTmFOKTsgICAgICAgICAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcmlhbGl6YWJsZVZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHZhbHVlIGlzIFNlcmlhbGl6YWJsZVZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICA/IHZhbHVlLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSlcbiAgICA6IE9iamVjdC52YWx1ZXModmFsdWUpLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIHN0cmluZyBmb3IgYSBzdHJ1Y3R1cmVkIHZhbHVlLCBmb3IgZGVyaXZpbmcgYSBTVEFCTEUgSURFTlRJVFkgZnJvbVxuICogaXQgLSBhbiBhZHZpc29yeS1sb2NrIGlkLCBhIGNoYW5uZWwgbmFtZSwgYSBjYWNoZSBrZXkuXG4gKlxuICogVGhlIGd1YXJhbnRlZSBpcyB0d28td2F5LCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHNhZmUgdG8gaGFzaDogdmFsdWVzIHRoYXRcbiAqIHNob3VsZCBzaGFyZSBhbiBpZGVudGl0eSBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZyAob2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdFxuICogbWF0dGVyKSwgYW5kIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYXJlIG5ldmVyIGNvbmZsYXRlZC4gRXZlcnkgdG9rZW4gY2Fycmllc1xuICogaXRzIHR5cGUsIHNvIGAxYCBhbmQgYFwiMVwiYCBkaWZmZXI7IGEgc3RyaW5nIGNhcnJpZXMgaXRzIGxlbmd0aCwgc29cbiAqIGBbXCJhXCIsIFwiYmNcIl1gIGFuZCBgW1wiYWJcIiwgXCJjXCJdYCBkaWZmZXI7IGFycmF5cyBrZWVwIG9yZGVyIHdoaWxlIG9iamVjdCBrZXlzXG4gKiBhcmUgc29ydGVkLlxuICpcbiAqIGBKU09OLnN0cmluZ2lmeWAgY2Fubm90IGRvIHRoaXMgam9iIC0ga2V5IG9yZGVyIGxlYWtzIGluLCBgdW5kZWZpbmVkYCB2YW5pc2hlcyxcbiAqIGAxYCBhbmQgYFwiMVwiYCBjb2xsaWRlIGFmdGVyIHF1b3RpbmcgaXMgc3RyaXBwZWQsIGFuZCBhIGN5Y2xlIHRocm93cyBhXG4gKiBgVHlwZUVycm9yYCBuYW1pbmcgbmVpdGhlciB0aGUgdmFsdWUgbm9yIHRoZSBjYWxsZXIncyBpbnRlbnQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHN0cmljdCB3aGVyZSBhIHNpbGVudCBhbnN3ZXIgd291bGQgYmUgYSBXUk9ORyBpZGVudGl0eSByYXRoZXJcbiAqIHRoYW4gYSBtaXNzaW5nIG9uZSwgc2luY2UgdHdvIGNhbGxlcnMgZGlzYWdyZWVpbmcgYWJvdXQgYSBsb2NrIG9yIGEgY2hhbm5lbCBpc1xuICogaW52aXNpYmxlIHVudGlsIGl0IGNvcnJ1cHRzIHNvbWV0aGluZy4gVGhyb3dzIGBUeXBlRXJyb3JgIG9uIGEgY3ljbGUsIG9uIGFcbiAqIG5vbi1maW5pdGUgbnVtYmVyIChgTmFOYCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLCBzbyBpdCBjYW5ub3QgaGF2ZSBhIHN0YWJsZVxuICogaWRlbnRpdHkpLCBhbmQgb24gYSBgZnVuY3Rpb25gIG9yIGBzeW1ib2xgIChubyBtZWFuaW5nZnVsIHZhbHVlIGlkZW50aXR5KS5cbiAqIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgYXJlIGFjY2VwdGVkIGFzIGRpc3RpbmN0IHRva2Vucy5cbiAqXG4gKiBgRGF0ZWAgaXMgY2Fub25pY2FsaXplZCBieSBpbnN0YW50LCB1bmxpa2UgdGhlIGhhc2ggY2Fub25pY2FsaXplciBpblxuICogYC4vaGFzaC50c2AsIHdoaWNoIGZvbGRzIGV2ZXJ5IGBEYXRlYCBvbnRvIG9uZSB0b2tlbi4gUHJlZmVyIHRoaXMgZnVuY3Rpb24gd2hlblxuICogZGlzdGluY3RuZXNzIGlzIGEgY29ycmVjdG5lc3MgcmVxdWlyZW1lbnQ7IHByZWZlciBgaGFzaC5mbnZIYXNoYCB3aGVuIGEgc2hvcnQsXG4gKiBjb2xsaXNpb24tdG9sZXJhbnQgZGlnZXN0IGlzIGVub3VnaC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2Fub25pY2FsaXplLlxuICogQHBhcmFtIHNlZW4gLSBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b1N0YWJsZUtleSh7IGE6IDEsIGI6IDIgfSkgPT09IHRvU3RhYmxlS2V5KHsgYjogMiwgYTogMSB9KTsgLy8gdHJ1ZVxuICogdG9TdGFibGVLZXkoMSkgIT09IHRvU3RhYmxlS2V5KFwiMVwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFibGVLZXkodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAvLyBMZW5ndGgtcHJlZml4ZWQgc28gY29uY2F0ZW5hdGVkIG5laWdoYm91cnMgY2Fubm90IGJlIHJlLXNwbGl0XG4gICAgICAvLyBkaWZmZXJlbnRseTogYFtcImFcIixcImJjXCJdYCBhbmQgYFtcImFiXCIsXCJjXCJdYCBtdXN0IG5vdCBhZ3JlZS5cbiAgICAgIHJldHVybiBgc3RyaW5nOiR7dmFsdWUubGVuZ3RofToke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBgYm9vbGVhbjoke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIGBiaWdpbnQ6JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIHJlcXVpcmUgZmluaXRlIG51bWJlcnNcIik7XG4gICAgICAvLyBgLTAgPT09IDBgIGJ1dCB0aGV5IHN0cmluZ2lmeSBkaWZmZXJlbnRseSwgc28gcGljayBvbmUgc3BlbGxpbmcuXG4gICAgICByZXR1cm4gYG51bWJlcjoke09iamVjdC5pcyh2YWx1ZSwgLTApID8gXCItMFwiIDogdmFsdWV9YDtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFibGUga2V5cyBjYW5ub3QgY29udGFpbiBjeWNsZXNcIik7XG4gICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gYGRhdGU6JHt2YWx1ZS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgYXJyYXk6WyR7dmFsdWUubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgLy8gU29ydGVkIGJ5IGNhbm9uaWNhbCBmb3JtLCBzbyBpbnNlcnRpb24gb3JkZXIgZG9lcyBub3QgbGVhay5cbiAgICAgICAgICByZXR1cm4gYHNldDpbJHtbLi4udmFsdWVdXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSlcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzOiBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+ID1cbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgICAgICByZXR1cm4gYCR7dmFsdWUgaW5zdGFuY2VvZiBNYXAgPyBcIm1hcFwiIDogXCJvYmplY3RcIn06eyR7Wy4uLmVudHJpZXNdXG4gICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IGAke3RvU3RhYmxlS2V5KGtleSwgc2Vlbil9PSR7dG9TdGFibGVLZXkoaXRlbSwgc2Vlbil9YClcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oXCIsXCIpfX1gO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5kZWxldGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc3RhYmxlIGtleSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGB7IFtrZXldOiB2YWx1ZSB9YCB3aGVuIGB2YWx1ZWAgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgIC0gc28gYW5cbiAqIGFic2VudCBvcHRpb25hbCBmaWVsZCBzdGF5cyBBQlNFTlQgd2hlbiBzcHJlYWQsIHJhdGhlciB0aGFuIGJlY29taW5nIGFuXG4gKiBleHBsaWNpdCBgdW5kZWZpbmVkYCB0aGF0IGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlc2AgcmVqZWN0cy5cbiAqXG4gKiBTcGVsbGluZyB0aGF0IGlubGluZSBjb3N0cyBhIHJlcGVhdGVkLCBkb3VibGUtZXZhbHVhdGVkIHRlcm5hcnkgcGVyIGZpZWxkXG4gKiAoYC4uLih2ID8geyBrZXk6IHYgfSA6IHt9KWApLCB3aGljaCBpcyBob3cgY29uZmlnIHJlc29sdmVycyBlbmQgdXAgY29tcHV0aW5nXG4gKiB0aGUgc2FtZSB2YWx1ZSB0d2ljZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogcmV0dXJuIHtcbiAqICAgLi4ub3B0aW9uYWwoXCJhcHBJZFwiLCBjb25maWd1cmVkQXBwSWQpLFxuICogICAuLi5vcHRpb25hbChcImVuZHBvaW50XCIsIGNvbmZpZy5lbmRwb2ludCksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWw8SyBleHRlbmRzIHN0cmluZywgVj4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFYgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPEssIFY+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAoeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8SywgVj4pO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b051bWJlcn0uXG4gKlxuICogQm90aCBzd2l0Y2hlcyB0dXJuIE9GRiBhIGxlbmllbmN5IHRoYXQgaXMgaGVscGZ1bCBmb3IgYSBoYW5kLXR5cGVkIHNldHRpbmcgYnV0XG4gKiB3cm9uZyB3aGVuIHRoZSBzdHJpbmcncyBvdGhlciBjaGFyYWN0ZXJzIGNhcnJ5IG1lYW5pbmcuIHtAbGluayB0b0RhdGV9IGFuZFxuICoge0BsaW5rIHRvRHVyYXRpb259IGRpc2FibGUgYm90aCwgc2luY2UgYSBzcGFjZSBpbnNpZGUgYDIwMjYgMDggMDJgIGlzIGEgZmllbGRcbiAqIHNlcGFyYXRvciBhbmQgYSBwZXJjZW50IGhhcyBubyBlcG9jaCBvciBtaWxsaXNlY29uZCByZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvTnVtYmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGludGVybmFsIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkLCBzbyBgXCIxLDAwMFwiYCBhbmRcbiAgICogYFwiMSAwMDBcImAgcmVhZCBhcyBgMTAwMGAuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogUGxhY2VtZW50IGlzIG5vdCB2YWxpZGF0ZWQgd2hlbiBlbmFibGVkLCBzbyBgXCIxLDAwLDBcImAgYWxzbyByZWFkcyBhcyBgMTAwMGAuXG4gICAqIERpc2FibGUgaXQgd2hlbiB3aGl0ZXNwYWNlIG9yIGEgY29tbWEgZGVsaW1pdHMgRklFTERTIHJhdGhlciB0aGFuIGdyb3VwaW5nXG4gICAqIGRpZ2l0cywgYmVjYXVzZSBzdHJpcHBpbmcgdGhlbSBzaWxlbnRseSBmdXNlcyB0aG9zZSBmaWVsZHMgaW50byBvbmUgbnVtYmVyLlxuICAgKi9cbiAgc2VwYXJhdG9ycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdHJhaWxpbmcgcGVyY2VudCBzaWduIGRpdmlkZXMgdGhlIHJlc3VsdCBieSBgMTAwYCwgc28gYFwiMjUlXCJgIHJlYWRzXG4gICAqIGFzIGAwLjI1YC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBEaXNhYmxlIGl0IHdoZXJlIGEgcGVyY2VudGFnZSBoYXMgbm8gbWVhbmluZywgc28gYFwiMjUlXCJgIGlzIGEgbWlzcyByYXRoZXJcbiAgICogdGhhbiBhIG51bWJlciB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBhd2F5IGZyb20gd2hhdCB0aGUgdGV4dCBzYXlzLlxuICAgKi9cbiAgcGVyY2VudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgbnVtZXJpYyB2YWx1ZSB0byBhIHJlYWwsIEZJTklURSBgbnVtYmVyYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdFxuICogY2FycmllcyBubyBudW1lcmljIG1lYW5pbmcuXG4gKlxuICogVGhlIG9uZSBwbGFjZSBhIGhhbmQtdHlwZWQgbnVtYmVyIGlzIGludGVycHJldGVkLCBhbG9uZ3NpZGUge0BsaW5rIHRvQm9vbGVhbn0sXG4gKiB7QGxpbmsgdG9EYXRlfSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS4gUmVhY2ggZm9yIGl0IGluc3RlYWQgb2YgYE51bWJlcih4KWAgb3IgYVxuICogaGFuZC1yb2xsZWQgbnVtZXJpYyByZWdleDogYmFyZSBgTnVtYmVyYCBtYXBzIGBcIlwiYCwgYG51bGxgLCBgW11gLCBhbmRcbiAqIHdoaXRlc3BhY2UgdG8gYDBgIGFuZCBhbnl0aGluZyBlbHNlIHRvIGBOYU5gLCBzbyBhIGNhbGxlciBoYXMgdG8gcmUtY2hlY2sgdGhlXG4gKiByZXN1bHQgZXZlcnkgdGltZSwgYW5kIGFkIGhvYyByZWdleGVzIHRlbmQgdG8gZHJpZnQgaW4gd2hhdCB0aGV5IGFjY2VwdC5cbiAqXG4gKiBBY2NlcHRzOiBhIGZpbml0ZSBgbnVtYmVyYDsgYSBgYmlnaW50YDsgb3IgYSBkZWNpbWFsIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsXG4gKiBsZWFkaW5nIHNpZ24sIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciB0aGUgc2lnbixcbiAqIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgKGBcIjEsMDAwXCJgLCBgXCIxIDAwMFwiYCksIGEgYmFyZSBmcmFjdGlvbiAoYFwiLjVcImApLCBhXG4gKiB0cmFpbGluZyBwb2ludCAoYFwiMS5cImApLCBzY2llbnRpZmljIG5vdGF0aW9uIChgXCIxZTNcImApLCBhbmQgYW4gb3B0aW9uYWxcbiAqIHRyYWlsaW5nIHBlcmNlbnQgc2lnbiAoYFwiMjUlXCJgLCBgXCIxLjUgJVwiYCkuIEEgdHJhaWxpbmcgYCVgIGRpdmlkZXMgdGhlIHBhcnNlZFxuICogdmFsdWUgYnkgYDEwMGAsIHNvIGBcIjI1JVwiYCBiZWNvbWVzIGAwLjI1YC5cbiAqXG4gKiBTZXBhcmF0b3JzIGFyZSBzdHJpcHBlZCB3aXRob3V0IHZhbGlkYXRpbmcgdGhlaXIgcGxhY2VtZW50LCBzbyBgXCIxLDAwLDBcImAgcmVhZHNcbiAqIGFzIGAxMDAwYDsgdGhpcyBpcyBhIGNvZXJjaW9uIGZvciBoYW5kLXR5cGVkIGNvbmZpZ3VyYXRpb24sIG5vdCBhIGxvY2FsZS1hd2FyZVxuICogdmFsaWRhdG9yLiBBbnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgYE5hTmAsIGBJbmZpbml0eWAsIGFuIGVtcHR5IG9yXG4gKiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBhIGJvb2xlYW4sIG11bHRpcGxlIHNpZ25zLFxuICogbWFsZm9ybWVkIGV4cG9uZW50cywgbWlzcGxhY2VkIHBlcmNlbnQgc2lnbnMsIG9yIGBcIjEycHhcImAsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiB0aHJvd2luZywgbWF0Y2hpbmcgdGhlIG90aGVyIGNvZXJjaW9ucywgc28gaXRcbiAqIGNvbXBvc2VzIG5hdHVyYWxseSB3aXRoIGA/P2AgZmFsbGJhY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b051bWJlcihcIjEsMDAwXCIpOyAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiIC0yLjUgXCIpOyAgLy8gLTIuNVxuICogdG9OdW1iZXIoXCIxZTNcIik7ICAgICAvLyAxMDAwXG4gKiB0b051bWJlcihcIjEyLjUgJVwiKTsgIC8vIDAuMTI1XG4gKiB0b051bWJlcihcIlwiKTsgICAgICAgIC8vIHVuZGVmaW5lZCAgKE51bWJlcihcIlwiKSB3b3VsZCBiZSAwKVxuICogdG9OdW1iZXIoXCIxMnB4XCIpOyAgICAvLyB1bmRlZmluZWRcbiAqIHRvTnVtYmVyKFwiMSAwMDBcIiwgeyBzZXBhcmF0b3JzOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9OdW1iZXJPcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gdG9OdW1iZXIoTnVtYmVyKHZhbHVlKSwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gU3RyaXAgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciBhIGxlYWRpbmcgc2lnbiwgZGlnaXQtZ3JvdXBcbiAgICAvLyBzZXBhcmF0b3JzIChib3RoIGAsYCBhbmQgdGhlIHNwYWNlIGluIGBcIjEgMDAwXCJgKSwgbGVhdmluZyBhIGJhcmUgbnVtZXJhbCBmb3JcbiAgICAvLyB0aGUgc2hhcGUgdGVzdCBiZWxvdyB0byBhY2NlcHQgb3IgcmVqZWN0LlxuICAgIGNvbnN0IHRleHQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgb3B0aW9ucy5zZXBhcmF0b3JzID09PSBmYWxzZSA/IC8oXlxccyt8XFxzKyQpL2cgOiAvKF5cXHMrfFxccyskfCg/PD1eWystXSlcXHMrfCg/PD1cXGQpXFxzK3wsKS9nLFxuICAgICAgXCJcIixcbiAgICApO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL14oWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSglKT8kL2kpO1xuICAgICAgaWYgKG1hdGNoICYmICEobWF0Y2hbMl0gJiYgb3B0aW9ucy5wZXJjZW50ID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHRvTnVtYmVyKG1hdGNoWzJdID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBib3hlZCBgTnVtYmVyYCwgb3IgYW55dGhpbmcgd2l0aCBhIG51bWVyaWMgYHRvU3RyaW5nYC4gYFN0cmluZyh2YWx1ZSlgXG4gICAgLy8gcm91dGVzIGl0IGJhY2sgdGhyb3VnaCB0aGUgc3RyaW5nIGJyYW5jaCwgd2hpY2ggcmVqZWN0cyB3aGF0IGlzIG5vdCBudW1lcmljLlxuICAgIHJldHVybiB0b051bWJlcihTdHJpbmcodmFsdWUpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGJvb2xlYW4taXNoIHZhbHVlIHRvIGEgcmVhbCBgYm9vbGVhbmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGl0IGNhbid0IGJlIGludGVycHJldGVkLiBSZWNvZ25pemVzIGB0cnVlYC9gdGAvYG9uYC9gMWAvYHllc2AvYHlgXG4gKiBhbmQgdGhlaXIgbmVnYXRpdmVzIChjYXNlLSBhbmQgd2hpdGVzcGFjZS1pbnNlbnNpdGl2ZSBmb3Igc3RyaW5ncyksIGFzXG4gKiB3ZWxsIGFzIHRoZSBudW1iZXJzIGAxYCBhbmQgYDBgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IFwidHJ1ZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcInRcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib25cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMVwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5ZXNcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdmFsdWUgPT09IFwiZmFsc2VcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9mZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIwXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5vXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMYXJnZXN0IHZhbHVlIHJlYWQgYXMgZXBvY2ggU0VDT05EUyByYXRoZXIgdGhhbiBtaWxsaXNlY29uZHMuXG4gKlxuICogYDFlMTFgIHNlY29uZHMgaXMgdGhlIHllYXIgNTEzOCBhbmQgYDFlMTFgIG1zIGlzIDE5NzMtMDMtMDMsIHNvIGV2ZXJ5IHZhbHVlIGFcbiAqIGNhbGxlciByZWFsaXN0aWNhbGx5IG1lYW5zIGFzIG1pbGxpcyBpcyBhYm92ZSB0aGUgbGluZSBhbmQgZXZlcnkgdmFsdWUgdGhleVxuICogbWVhbiBhcyBzZWNvbmRzIGlzIGJlbG93IGl0LiBUaGUgYW1iaWd1aXR5IGlzIHVuYXZvaWRhYmxlIC0gdGhlIHR3byB1bml0cyBzaGFyZVxuICogYSBudW1iZXIgbGluZSAtIHNvIHRoZSBzcGxpdCBpcyBwbGFjZWQgd2hlcmUgbmVpdGhlciBzaWRlIGhhcyBhIHBsYXVzaWJsZVxuICogY2xhaW0uXG4gKi9cbmNvbnN0IFNFQ09ORFNfQ0VJTElORyA9IDFlMTE7XG5cbi8qKlxuICogQSBudW1iZXIgZm9yIHtAbGluayB0b0RhdGV9IGFuZCB7QGxpbmsgdG9EdXJhdGlvbn0sIHJlYWQgd2l0aCBub25lIG9mXG4gKiB7QGxpbmsgdG9OdW1iZXJ9J3Mgc3RyaW5nIGxlbmllbmNpZXMuXG4gKlxuICogQm90aCBsZW5pZW5jaWVzIGFyZSBhY3RpdmVseSBoYXJtZnVsIGhlcmUuIEEgc3BhY2Ugb3IgY29tbWEgc2VwYXJhdGVzIEZJRUxEUyBpblxuICogYSBkYXRlIChgMjAyNiAwOCAwMmAgd291bGQgZnVzZSBpbnRvIHRoZSBlcG9jaCBgMjAyNjA4MDJgKSwgYW5kIGEgcGVyY2VudGFnZSBoYXNcbiAqIG5vIHJlYWRpbmcgYXMgYW4gaW5zdGFudCBvciBhIGxlbmd0aCBvZiB0aW1lLCBzbyBgMjUlYCBtdXN0IGJlIGEgbWlzcyByYXRoZXJcbiAqIHRoYW4gYDI1MG1zYC5cbiAqL1xuZnVuY3Rpb24gdG9CYXJlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlLCB7IHNlcGFyYXRvcnM6IGZhbHNlLCBwZXJjZW50OiBmYWxzZSB9KTtcbn1cblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9EYXRlfS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc306IGVhY2ggZnVuY3Rpb24gY2FuIGZhbGwgYmFjayB0byB0aGVcbiAqIG90aGVyLCBzbyBlYWNoIGhhcyBvbmUgc3dpdGNoIHR1cm5pbmcgdGhhdCBmYWxsYmFjayBvZmYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9EYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24gaXMgcmVhZCBhcyBhbiBpbnN0YW50IHJlbGF0aXZlIHRvXG4gICAqIG5vdywgc28gYC03ZGAgYW5kIGA3IGRheXMgYWdvYCBiZWNvbWUgYG5vdyAtIDcgZGF5c2AuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiB0aGUgdmFsdWUgbXVzdCBiZSBhIHJlYWwgZGF0ZSBhbmQgYSByZWxhdGl2ZSBleHByZXNzaW9uXG4gICAqIHNob3VsZCBiZSBhIG1pc3MgLSBhIHN0b3JlZCB0aW1lc3RhbXAsIGEgdXNlci1zdXBwbGllZCBgRGF0ZWAgaGVhZGVyLCBhblxuICAgKiBgZXhwaXJlc19hdGAgZmllbGQgLSBzaW5jZSBhIGR1cmF0aW9uIHNpbGVudGx5IHJlc29sdmluZyBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gICAqIGNsb2NrIG1ha2VzIHRoZSBzYW1lIGlucHV0IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBvbiBldmVyeSBjYWxsLiBBbHNvIHdoYXRcbiAgICoge0BsaW5rIHRvRHVyYXRpb259IHBhc3NlcyB3aGVuIGl0IHJlY3Vyc2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBib3VuY2UgYSB2YWx1ZVxuICAgKiBiZXR3ZWVuIHRoZW0gZm9yZXZlci5cbiAgICovXG4gIHBhcnNlRHVyYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0R1cmF0aW9ufS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0RhdGVPcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvdGhlcixcbiAqIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRGF0ZX0gdmFsdWUgaXMgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdywgc29cbiAgICogYDIwMjYtMDgtMDJgIGJlY29tZXMgaG93ZXZlciBsb25nIHVudGlsIChvciBzaW5jZSkgdGhhdCBpbnN0YW50LiBEZWZhdWx0cyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIGlzIG1lYW5pbmdmdWwgLSBhIHRpbWVvdXQsIGEgcG9sbFxuICAgKiBpbnRlcnZhbCwgYSBjYWNoZSBUVEwgLSBiZWNhdXNlIGEgZGF0ZSB3b3VsZCBvdGhlcndpc2UgeWllbGQgYSBwbGF1c2libGUgYnV0XG4gICAqIHdyb25nIG51bWJlciB0aGF0IGFsc28gZHJpZnRzIHdpdGggdGhlIGNsb2NrLiBBbHNvIHdoYXQge0BsaW5rIHRvRGF0ZX0gcGFzc2VzXG4gICAqIHdoZW4gaXQgcmVjdXJzZXMuXG4gICAqL1xuICBwYXJzZURhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGR1cmF0aW9uIHRvIE1JTExJU0VDT05EUywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGxlbmllbnQsIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSB0eXBlZCBieSBoYW5kIGludG8gZW52IHZhcnMsXG4gKiBDTEkgZmxhZ3MsIGFuZCBjb25maWcgZmlsZXM6IHdoaXRlc3BhY2UgYmV0d2VlbiBhbW91bnQgYW5kIHVuaXQgaXMgb3B0aW9uYWwgYW5kXG4gKiB1bmxpbWl0ZWQsIHVuaXRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBwbHVyYWxzIGFuZCB0aGUgY29tbW9uIGFiYnJldmlhdGlvbnMgYXJlXG4gKiBlcXVpdmFsZW50IChgMm1zYCA9PT0gYDIgbWlsbGlzZWNvbmRzYCwgYDFoYCA9PT0gYDEgaHJgID09PSBgMSBIb3VyYCksIGBhbmRgIGFuZFxuICogdGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGlnbm9yZWQgKGAxLDUwMCBtc2AsIGAxIGhvdXIgYW5kIDMwIG1pbnV0ZXNgKSwgYW5kXG4gKiB0ZXJtcyBjb21wb3NlIChgMWgzMG1gKS4gQSBwbGFpbiBgbnVtYmVyYCBwYXNzZXMgdGhyb3VnaCBhcyBtaWxsaXNlY29uZHMuXG4gKlxuICogU2lnbnMgYXJlIHN1cHBvcnRlZCBzbyBhIGR1cmF0aW9uIGNhbiBleHByZXNzIGFuIE9GRlNFVCByYXRoZXIgdGhhbiBvbmx5IGFcbiAqIGxlbmd0aDogYSBsZWFkaW5nIGAtYCAob3IgYSB0cmFpbGluZyBgYWdvYCkgbWFrZXMgdGhlIHJlc3VsdCBuZWdhdGl2ZSwgYW5kIGFuXG4gKiB1bnNpZ25lZCB0ZXJtIGluaGVyaXRzIHRoZSBwcmV2aW91cyB0ZXJtJ3Mgc2lnbiwgc28gYC0xaDMwbWAgaXMgLTkwIG1pbnV0ZXNcbiAqIHJhdGhlciB0aGFuIC02MCArIDMwLiB7QGxpbmsgdG9EYXRlfSB1c2VzIHRoYXQgdG8gdHVybiBgLTdkYCAvIGA3IGRheXMgYWdvYFxuICogaW50byBhbiBpbnN0YW50IHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBBbiBVTktOT1dOIHVuaXQgZmFpbHMgdGhlIHdob2xlIHBhcnNlIHJhdGhlciB0aGFuIGJlaW5nIHNraXBwZWQgLSBgMSBmb3J0bmlnaHRgXG4gKiByZXR1cm5pbmcgYDFgIHNpbGVudGx5IHdvdWxkIGJlIHdvcnNlIHRoYW4gcmV0dXJuaW5nIG5vdGhpbmcgLSB3aGljaCBpcyBhbHNvXG4gKiB3aGF0IGtlZXBzIHtAbGluayB0b0RhdGV9IGZyb20gbWlzdGFraW5nIGAxIEphbiAyMDI2YCBmb3IgYSBkdXJhdGlvbi5cbiAqXG4gKiBBIHZhbHVlIHRoYXQgaXMgbm90IGEgZHVyYXRpb24gYXQgYWxsIGlzIG9mZmVyZWQgdG8ge0BsaW5rIHRvRGF0ZX0gYW5kLCB3aGVuIGl0XG4gKiBJUyBhIGRhdGUsIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIG1ha2VzIHRoZVxuICogdHdvIGZ1bmN0aW9ucyBpbnZlcnNlczogYSBwYXN0IGluc3RhbnQgaXMgbmVnYXRpdmUsIGEgZnV0dXJlIG9uZSBwb3NpdGl2ZS5cbiAqIGBvcHRpb25zLnBhcnNlRGF0ZTogZmFsc2VgIHR1cm5zIHRoYXQgb2ZmIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIG1ha2VzXG4gKiBzZW5zZSAtIHNlZSB7QGxpbmsgVG9EdXJhdGlvbk9wdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0R1cmF0aW9uKFwiMzBzXCIpOyAgICAgICAgICAgICAgICAgICAgLy8gMzBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMSBob3VyIDMwIG1pbnV0ZXNcIik7ICAgICAgLy8gNV80MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiLTcgZGF5c1wiKTsgICAgICAgICAgICAgICAgLy8gLTYwNF84MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMiB3ZWVrcyBhZ29cIik7ICAgICAgICAgICAgLy8gLTFfMjA5XzYwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgICAgICAvLyBtcyBmcm9tIG5vdyB0byB0aGF0IGluc3RhbnRcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIsIHsgcGFyc2VEYXRlOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0R1cmF0aW9uKFwic29vblwiKTsgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0R1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0R1cmF0aW9uT3B0aW9ucyA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gQSBiYXJlIG51bWJlciBpcyBhbHJlYWR5IG1pbGxpc2Vjb25kcywgdGhlIHNhbWUgcmVhZGluZyBgdG9EYXRlYCBnaXZlcyBhblxuICAvLyBlcG9jaCB2YWx1ZSwgc28gdGhpcyBtdXN0IHJ1biBiZWZvcmUgYW55IGRhdGUgaW50ZXJwcmV0YXRpb24uXG4gIGNvbnN0IG51bSA9IHRvQmFyZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cbiAgbGV0IHRleHQgPSB2YWx1ZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2VBbGwoL1ssX10vZywgXCJcIilcbiAgICAucmVwbGFjZUFsbCgvXFxiYW5kXFxiL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG4gIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJhZ29cIikpIHtcbiAgICBuZWdhdGUgPSB0cnVlO1xuICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIC1cImFnb1wiLmxlbmd0aCk7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXmluXFxiLywgXCJcIikudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGVybXMgPSBbLi4udGV4dC5tYXRjaEFsbChEVVJBVElPTl9URVJNKV07XG4gIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBtYXRjaGVkIHRlcm1zIG11c3QgYmUgc2VwYXJhdG9ycyBvbmx5OyBvdGhlcndpc2UgdGhlXG4gIC8vIHN0cmluZyBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IG1lcmVseSBDT05UQUlOUyBhIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudC5cbiAgbGV0IGxlZnRvdmVyID0gdGV4dDtcbiAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSBsZWZ0b3ZlciA9IGxlZnRvdmVyLnJlcGxhY2UodGVybVswXSwgXCIgXCIpO1xuICBpZiAobGVmdG92ZXIudHJpbSgpKSB7XG4gICAgLy8gQSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQgaW5zaWRlIG90aGVyIHRleHQgaXMgdXN1YWxseSBhIERBVEUgLSBgXCIyMDI2LTA4LTAyXCJgXG4gICAgLy8gbWF0Y2hlcyB0d28gdGVybXMgYW5kIGxlYXZlcyBzZXBhcmF0b3JzIGJlaGluZC5cbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgbGV0IHRvdGFsID0gMDtcbiAgbGV0IHNpZ24gPSAxO1xuICBmb3IgKGNvbnN0IFssIGV4cGxpY2l0U2lnbiwgYW1vdW50LCB1bml0XSBvZiB0ZXJtcykge1xuICAgIGlmIChleHBsaWNpdFNpZ24pIHNpZ24gPSBleHBsaWNpdFNpZ24gPT09IFwiLVwiID8gLTEgOiAxO1xuICAgIGNvbnN0IHVuaXRNcyA9IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQpID8/IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQucmVwbGFjZSgvcyQvLCBcIlwiKSk7XG4gICAgaWYgKHVuaXRNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICAgIH1cbiAgICB0b3RhbCArPSBzaWduICogTnVtYmVyKGFtb3VudCkgKiB1bml0TXM7XG4gIH1cbiAgcmV0dXJuIG5lZ2F0ZSA/IC10b3RhbCA6IHRvdGFsO1xufVxuXG4vKipcbiAqIEEgZGF0ZSByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93IChgZGF0ZSAtIG5vd2ApLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gYW5kIHtAbGluayB0b0RhdGV9IGludmVyc2VzIG9mIGVhY2ggb3RoZXIuIFJlY3Vyc2VzIHdpdGhcbiAqIGR1cmF0aW9uIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kIGZvcnRoXG4gKiBmb3JldmVyLlxuICovXG5mdW5jdGlvbiBkYXRlQXNEdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7XG4gIHJldHVybiBkYXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZGF0ZS1pc2ggdmFsdWUgdG8gYSByZWFsIGBEYXRlYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuIEFjY2VwdHMsIGluIHRoaXMgb3JkZXI6XG4gKlxuICogICAtIGEgYERhdGVgIChwYXNzZWQgdGhyb3VnaDsgYW4gaW52YWxpZCBvbmUgaXMgYSBtaXNzKTtcbiAqICAgLSBhbiBlcG9jaCBOVU1CRVIgb3IgbnVtZXJpYyBzdHJpbmcsIGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIChzZWVcbiAqICAgICB7QGxpbmsgU0VDT05EU19DRUlMSU5HfSk7XG4gKiAgIC0gYG5vd2AgKGFuZCBpdHMgYHRvZGF5YCBzcGVsbGluZyksIGZvciB0aGUgY3VycmVudCBpbnN0YW50O1xuICogICAtIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24sIHJlc29sdmVkIFJFTEFUSVZFIFRPIE5PVywgc28gYC03ZGAsXG4gKiAgICAgYDcgZGF5cyBhZ29gLCBhbmQgYGluIDMwIG1pbnV0ZXNgIGFyZSBhbGwgdmFsaWQgaW5zdGFudHM7XG4gKiAgIC0gYW55dGhpbmcgYERhdGUucGFyc2VgIHVuZGVyc3RhbmRzIChgMjAyNi0wOC0wMmAsIGFuIElTTy9VVEMgaW5zdGFudCkuXG4gKlxuICogVGhlIGVwb2NoIHVuaXQgaW5mZXJlbmNlIGlzIHRoZSByZWFzb24gdGhpcyBleGlzdHMgcmF0aGVyIHRoYW5cbiAqIGBuZXcgRGF0ZSh2YWx1ZSlgOiBhIGJhcmUgZXBvY2ggYXJyaXZlcyBhcyBhIFNUUklORyBmcm9tIGFuIGVudiB2YXIgb3IgYSBDTElcbiAqIGZsYWcgYXMgb2Z0ZW4gYXMgaXQgYXJyaXZlcyBhcyBhIG51bWJlciAoYGRhdGUgKyVzYCwgYSBKU09OIGZpZWxkLCBhIGNvcGllZCBsb2dcbiAqIGxpbmUpLCBhbmQgYERhdGUucGFyc2UoXCIxNzg1Njk3ODk5XCIpYCByZWFkcyB0aGF0IGFzIGEgWUVBUiwgc2lsZW50bHkgbGFuZGluZ1xuICogMS43IGJpbGxpb24geWVhcnMgb3V0LiBOdW1lcmljIHN0cmluZ3MgYXJlIHRoZXJlZm9yZSByb3V0ZWQgdG8gdGhlIGVwb2NoIHBhdGgsXG4gKiBuZXZlciB0byBgRGF0ZS5wYXJzZWAuXG4gKlxuICogVGhlIGR1cmF0aW9uIGZhbGxiYWNrIHJ1bnMgTEFTVCwgYWZ0ZXIgYERhdGUucGFyc2VgLCBzbyBhIHJlYWwgZGF0ZSBpcyBuZXZlclxuICogbWlzdGFrZW4gZm9yIGFuIG9mZnNldC4gYG9wdGlvbnMucGFyc2VEdXJhdGlvbjogZmFsc2VgIHJlbW92ZXMgaXQgZW50aXJlbHkgd2hlblxuICogdGhlIHZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgaW5zdGFudCAtIHNlZSB7QGxpbmsgVG9EYXRlT3B0aW9uc30uXG4gKlxuICogTGlrZSB7QGxpbmsgdG9Cb29sZWFufSB0aGlzIE5FVkVSIHRocm93cyBhbmQgcmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHVuaW50ZXJwcmV0YWJsZSwgc28gYSBjYWxsZXIgZGVjaWRlcyB3aGV0aGVyIGEgYmFkIHZhbHVlIGlzIGZhdGFsLCBhIHdhcm5pbmcsXG4gKiBvciBhIGZhbGxiYWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0RhdGUoXCJub3dcIik7ICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW50XG4gKiB0b0RhdGUoXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgLy8gMjAyNi0wOC0wMlQwMDowMDowMC4wMDBaXG4gKiB0b0RhdGUoXCIxNzg1Njk3ODk5XCIpOyAgICAgICAgLy8gc2Vjb25kcyAtPiAyMDI2LTA4LTAyVC4uLlxuICogdG9EYXRlKDE3ODU2OTc4OTkwMDApOyAgICAgICAvLyBtaWxsaXMgIC0+IHRoZSBzYW1lIGluc3RhbnRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIpOyAgICAgICAvLyBub3cgLSAzMGRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0RhdGVPcHRpb25zID0ge30pOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXBvY2hNcyA9IHRvRXBvY2hNcyh2YWx1ZSk7XG4gIGlmIChlcG9jaE1zICE9PSB1bmRlZmluZWQpIHJldHVybiBmcm9tTXMoZXBvY2hNcyk7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXh0ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0ID09PSBcIm5vd1wiIHx8IHRleHQgPT09IFwidG9kYXlcIikgcmV0dXJuIG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSByZXR1cm4gbmV3IERhdGUocGFyc2VkKTtcblxuICBpZiAob3B0aW9ucy5wYXJzZUR1cmF0aW9uID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gUmVjdXJzZXMgd2l0aCBkYXRlIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kXG4gIC8vIGZvcnRoIGZvcmV2ZXIuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSwgeyBwYXJzZURhdGU6IGZhbHNlIH0pO1xuICByZXR1cm4gb2Zmc2V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZyb21NcyhEYXRlLm5vdygpICsgb2Zmc2V0TXMpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKlxuICogRXBvY2ggbWlsbGlzZWNvbmRzIGZvciBhIG51bWVyaWMgdmFsdWUvc3RyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBvbmUsXG4gKiBhcHBseWluZyB0aGUgc2Vjb25kcy12cy1taWxsaXMgaW5mZXJlbmNlIGF0IHtAbGluayBTRUNPTkRTX0NFSUxJTkd9LlxuICovXG5mdW5jdGlvbiB0b0Vwb2NoTXModmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBudW1lcmljID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguYWJzKG51bWVyaWMpIDwgU0VDT05EU19DRUlMSU5HID8gbnVtZXJpYyAqIDEwMDAgOiBudW1lcmljO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcC1lcXVhbGl0eSB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBjb21wYXJhdG9yLlxuICpcbiAqIHtAbGluayBkZWVwRXF1YWx9IG1pcnJvcnMgdGhlIHNlbWFudGljcyBvZiB0aGUgYGZhc3QtZGVlcC1lcXVhbGBcbiAqIHBhY2thZ2UgKGhhbmRsZWQ6IG5lc3RlZCBwbGFpbiBvYmplY3RzL2FycmF5cywgYE1hcGAsIGBTZXRgLCBgRGF0ZWAsXG4gKiBgUmVnRXhwYCwgdHlwZWQgYXJyYXlzLCBgTmFOYCwgYW5kIGArMGAvYC0wYCB0cmVhdGVkIGFzIGVxdWFsKSBidXQgaXNcbiAqIGRlcGVuZGVuY3ktZnJlZSBzbyBgQGRieC10b29scy9zaGFyZWQtY29yZWAga2VlcHMgbm8gcnVudGltZSBkZXBzLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgY29tcGFyYXRvcmAgc2hvcnQtY2lyY3VpdHMgdGhlIHN0cnVjdHVyYWwgd2FsayBhdCBhbnlcbiAqIG5vZGU6IHJldHVybiBgdHJ1ZWAvYGZhbHNlYCB0byBmb3JjZSB0aGUgcmVzdWx0IGZvciB0aGF0IHBhaXIsIG9yXG4gKiBgdW5kZWZpbmVkYCB0byBkZWZlciB0byB0aGUgYnVpbHQtaW4gY29tcGFyaXNvbi4gSXQgaXMgaW52b2tlZCBmb3IgdGhlXG4gKiByb290IHBhaXIgYW5kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIG5lc3RlZCBwYWlyLCBzbyBhIGNhbGxlciBjYW4sIGUuZy4sXG4gKiBjb21wYXJlIHR3byBkb21haW4gb2JqZWN0cyBieSBpZCB3aGlsZSBsZXR0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBmYWxsXG4gKiBiYWNrIHRvIHN0cnVjdHVyYWwgZXF1YWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKFsxLCAyXSwgWzEsIDJdKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKGEsIGIsICh4LCB5KSA9PlxuICogICBpc0VudGl0eSh4KSAmJiBpc0VudGl0eSh5KSA/IHguaWQgPT09IHkuaWQgOiB1bmRlZmluZWQpO1xuICovXG5leHBvcnQgdHlwZSBEZWVwRXF1YWxDb21wYXJhdG9yID0gKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbi8qKiBDb21wYXJlIG5lc3RlZCB2YWx1ZXMgc3RydWN0dXJhbGx5IHdpdGggYW4gb3B0aW9uYWwgcmVjdXJzaXZlIG92ZXJyaWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
1185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUE0Qkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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Q0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hFLElBQ0UsQ0FBQyxTQUFTLENBQ1AsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbEMsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbkMsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlcGVuZGVuY3ktZnJlZSBvYmplY3QgKyBpdGVyYWJsZSB1dGlsaXRpZXMuXG4gKlxuICogVmFsdWUgZ3VhcmRzIC8gY29lcmNpb25zIC8gc2hhcGUgdHlwZXM6IHtAbGluayBpc1JlY29yZH0gbmFycm93cyBwYXJzZWQgSlNPTlxuICogdG8gYSByZWNvcmQsIHtAbGluayB0b051bWJlcn0gY29lcmNlcyBhIGhhbmQtdHlwZWQgbnVtZXJhbCwge0BsaW5rIHRvQm9vbGVhbn1cbiAqIGNvZXJjZXMgbG9vc2UgdHJ1dGh5L2ZhbHN5IHZhbHVlcywge0BsaW5rIHRvRHVyYXRpb259IHBhcnNlcyBgMWgzMG1gIC9cbiAqIGAyIG1pbGxpc2Vjb25kc2AgdG8gbWlsbGlzLCB7QGxpbmsgdG9EYXRlfSBjb2VyY2VzIGEgZGF0ZS9JU08gc3RyaW5nL2Vwb2NoXG4gKiBudW1iZXIvcmVsYXRpdmUgZHVyYXRpb24gKGB0b0RhdGVgIGFuZCBgdG9EdXJhdGlvbmAgZmFsbCBiYWNrIHRvIGVhY2ggb3RoZXIsIHNvXG4gKiBlaXRoZXIgYWNjZXB0cyBib3RoIHJlYWRpbmdzKSwge0BsaW5rIG9wdGlvbmFsfVxuICogc3ByZWFkcyBhIGZpZWxkIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50LCB7QGxpbmsgZGVlcEVxdWFsfSBjb21wYXJlc1xuICogc3RydWN0dXJhbGx5LCB7QGxpbmsgaXNTZXJpYWxpemFibGVWYWx1ZX0gcmVqZWN0cyBhbnl0aGluZyBhIEpTT04gcm91bmQgdHJpcFxuICogd291bGQgbG9zZSBvciBjb2VyY2UsIHtAbGluayB0b1N0YWJsZUtleX0gY2Fub25pY2FsaXplcyBhIHZhbHVlIHNvIGFuIGlkZW50aXR5XG4gKiBjYW4gYmUgZGVyaXZlZCBmcm9tIGl0LCBhbmQge0BsaW5rIE5hbWVMaWtlfS97QGxpbmsgTm9uRnVuY3Rpb25LZXlzfSBkZXNjcmliZVxuICogb2JqZWN0IHNoYXBlcy5cbiAqXG4gKiBJdGVyYWJsZSBoZWxwZXJzOiB7QGxpbmsgZ2VuZXJhdG9yfSBmbGF0dGVucyBtaXhlZCBhcmd1bWVudHM7IHtAbGluayBzZXF1ZW5jZX1cbiAqIHdyYXBzIHNvdXJjZShzKSBpbiBhIGxhenksIGBBcnJheWAtY29tcGF0aWJsZSB7QGxpbmsgU2VxdWVuY2V9LiBFdmVyeVxuICogdHJhbnNmb3JtL3Rlcm1pbmFsIGlzIGEgc3RhbmRhbG9uZSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gcGxhaW4ge0BsaW5rXG4gKiBDb250YWluZXJ9cyAoc2VlIHtAbGluayBtYXB9LCB7QGxpbmsgZmlsdGVyfSwge0BsaW5rIGdyb3VwfSwgLi4uKTsgdGhlIHtAbGlua1xuICogU2VxdWVuY2V9IG1ldGhvZHMgYXJlIHRoaW4gZm9yd2FyZGVycyBvdmVyIHRoZW0gc28gdGhlIHNhbWUgbG9naWMgYmFja3MgYm90aFxuICogdGhlIGZyZWUtZnVuY3Rpb24gYW5kIHRoZSBmbHVlbnQvY2hhaW5lZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBMYXp5IHNlcXVlbmNlIG92ZXIgaXRlcmFibGUgc291cmNlKHMpLiBTZWUge0BsaW5rIHNlcXVlbmNlfS4gKi9cbmV4cG9ydCB0eXBlIFNlcXVlbmNlPFQ+ID0gU2VxdWVuY2VJbXBsPFQ+O1xuXG50eXBlIFNlcXVlbmNlU291cmNlPFQ+ID1cbiAgSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPiB8IE9uZU9yTWFueTxUPiB8IEV4dHJhY3Q8VCwgc3RyaW5nPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBub24tc2NhbGFyIHtAbGluayBJdGVyYWJsZX0gLSBvbmUgdG8gdHJlYXQgYXMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci4ge0BsaW5rIGlzQ29udGFpbmVyfSBuYXJyb3dzIHRvIHRoaXMsIGV4Y2x1ZGluZyBzdHJpbmdzLFxuICogYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucy4ge0BsaW5rIENvbGxlY3Rpb259IGlzIHRoZSBlYWdlcmx5LVxuICogc2l6ZWQgc3Vic2V0LiBUaGUgZWxlbWVudCBkZWZhdWx0cyB0byBgdW5rbm93bmAgc28gYW55IGBDb2xsZWN0aW9uYCBpc1xuICogYXNzaWduYWJsZSB0byBhIGJhcmUgYENvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRhaW5lcjxUID0gdW5rbm93bj4gPSBJdGVyYWJsZTxUPjtcblxuLyoqXG4gKiBBIGJ1aWx0LWluLCBlYWdlcmx5LXNpemVkIHtAbGluayBDb250YWluZXJ9OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9ICh3aG9zZSAqdmFsdWVzKiBhcmUgYFRgIC0gYSBNYXAgaXRlcmF0ZXMgYFtrZXksIHZhbHVlXWAgZW50cmllcyxcbiAqIHNvIGl0cyBlbGVtZW50IHR5cGUgZGlmZmVycywgYnV0IGl0cyB2YWx1ZSB0eXBlIGlzIGBUYCkuIEFsbCBzaGFyZSBhIGNoZWFwXG4gKiBlbXB0aW5lc3MgY2hlY2sgKHtAbGluayBpc0VtcHR5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb248VD4gPSBSZWFkb25seUFycmF5PFQ+IHwgUmVhZG9ubHlTZXQ8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPjtcblxuLyoqIE5vbi1lbXB0eSB0dXBsZSB1c2VkIHdoZXJlIGFuIEFQSSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWUuICovXG5leHBvcnQgdHlwZSBPbmVPck1hbnk8VD4gPSBbVCwgLi4uVFtdXTtcblxuLyoqIE5hcnJvdyBhIHJlYWRvbmx5IGFycmF5IHRvIGEgbm9uLWVtcHR5IHtAbGluayBPbmVPck1hbnl9IHR1cGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lT3JNYW55PFQgPSB1bmtub3duPih2YWx1ZTogcmVhZG9ubHkgVFtdKTogdmFsdWUgaXMgT25lT3JNYW55PFQ+IHtcbiAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7XG59XG5cbi8qKiBBIHNvdXJjZSBhY2NlcHRlZCBieSBhIHZhcmlhZGljIG9wOiBhIHtAbGluayBDb250YWluZXJ9IG9mIGBUYCwgb3Igbm90aGluZy4gKi9cbnR5cGUgU291cmNlPFQ+ID0gQ29udGFpbmVyPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbGVtZW50IHR5cGUgb2YgYSB7QGxpbmsgZ3JvdXB9IGJ1Y2tldCBhcnJheTogd2hlbiB0aGUgcHJlZGljYXRlIGBQYCBpcyBhIHR5cGVcbiAqIGd1YXJkIChgdmFsdWUgaXMgU2ApLCB0aGUgYnVja2V0IGlzIG5hcnJvd2VkIHRvIGBTICYgVGA7IG90aGVyd2lzZSBpdCBzdGF5cyBgVGAuXG4gKi9cbnR5cGUgR3JvdXBWYWx1ZTxULCBQPiA9IFAgZXh0ZW5kcyAodmFsdWU6IGFueSwgLi4ucmVzdDogYW55W10pID0+IHZhbHVlIGlzIGluZmVyIFMgPyBTICYgVCA6IFQ7XG5cbi8qKiBBIG1hcCBvZiBncm91cCBuYW1lIC0+IHByZWRpY2F0ZSwgYXMgYWNjZXB0ZWQgYnkge0BsaW5rIGdyb3VwfS4gKi9cbnR5cGUgR3JvdXBQcmVkaWNhdGVzPFQ+ID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBhIHtAbGluayBDb2xsZWN0aW9ufTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfS4gTmFycm93cyBgdmFsdWVgIHNvIGl0cyBlbGVtZW50L3ZhbHVlIHR5cGUgaXMgdHJlYXRlZCBhcyBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCAob3IgTWFwIHZhbHVlKSB0eXBlIGFzc2VydGVkIGZvciB0aGUgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb2xsZWN0aW9ufTxgVGA+KSBmb3IgYVxuICogICBidWlsdC1pbiBhcnJheS9zZXQvbWFwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbGxlY3Rpb248VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXA7XG59XG5cbi8qKlxuICogYHRydWVgIHdoZW4gYSB7QGxpbmsgQ29sbGVjdGlvbn0gaGFzIG5vIGVsZW1lbnRzLiBVc2VzIGBsZW5ndGhgIGZvciBhcnJheXNcbiAqIGFuZCBgc2l6ZWAgZm9yIHtAbGluayBTZXR9L3tAbGluayBNYXB9LlxuICpcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIC0gVGhlIGFycmF5LCBzZXQsIG9yIG1hcCB0byB0ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjx1bmtub3duPiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zPzogeyByZWN1cnNpdmU/OiBib29sZWFuIH0sXG4pOiBib29sZWFuIHtcbiAgZnVuY3Rpb24gdmlzaXQodmFsdWU6IHVua25vd24sIHNlZW4/OiBTZXQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChzZWVuPy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHNlZW4/LmFkZCh2YWx1ZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMCB8fCAoc2VlbiA/IHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNpemUgPT09IDAgfHwgKHNlZW4gPyBbLi4udmFsdWVdLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB2YWx1ZS5zaXplID09PSAwIHx8XG4gICAgICAgICAgKHNlZW4gPyBbLi4udmFsdWUudmFsdWVzKCldLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHNlZW4pIHtcbiAgICAgICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gdmlzaXQoKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBzZWVuKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZpc2l0KGNvbGxlY3Rpb24sIG9wdGlvbnM/LnJlY3Vyc2l2ZSA/IG5ldyBTZXQoKSA6IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNvdXJjZSB0byBhbiBpdGVyYWJsZSBvZiBpdHMgYFRgIHZhbHVlcywgc28gTWFwcyBhcmUgdHJlYXRlZFxuICogdW5pZm9ybWx5IHdpdGggYXJyYXlzL3NldHM6IGEge0BsaW5rIE1hcH0geWllbGRzIGl0cyAqdmFsdWVzKiAobWF0Y2hpbmdcbiAqIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYCksIGFueSBvdGhlciBpdGVyYWJsZSB5aWVsZHMgaXRzZWxmLiBUaGlzXG4gKiBpcyB3aGF0IHtAbGluayBzZXF1ZW5jZX0gY29uc3VtZXMsIHNvIGEgYE1hcGAgY29udHJpYnV0ZXMgdmFsdWVzIGV2ZXJ5d2hlcmVcbiAqIHJhdGhlciB0aGFuIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZXM8VD4oc291cmNlOiBJdGVyYWJsZTxUPiB8IFJlYWRvbmx5TWFwPHVua25vd24sIFQ+KTogSXRlcmFibGU8VD4ge1xuICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWFwID8gc291cmNlLnZhbHVlcygpIDogKHNvdXJjZSBhcyBJdGVyYWJsZTxUPik7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29udGFpbmVyfSAtIGFuIGl0ZXJhYmxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb2xsZWN0aW9uXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgdmFsdWVzIHRoYXQgYXJlIHRlY2huaWNhbGx5IGl0ZXJhYmxlIGJ1dCBzaG91bGQgYmVcbiAqIHRyZWF0ZWQgYXMgc2NhbGFycyBoZXJlIC0gc3RyaW5ncywgYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucyAtXG4gKiBzbyBhIGxvbmUgc3RyaW5nIGlzIG5ldmVyIHNwcmVhZCBjaGFyYWN0ZXItYnktY2hhcmFjdGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGl0ZXJhYmxlLlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCAobmFycm93aW5nIGB2YWx1ZWAgdG8ge0BsaW5rIENvbnRhaW5lcn08YFRgPikgZm9yIGEgbm9uLXN0cmluZ1xuICogICBpdGVyYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRhaW5lcjxUPiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpICYmXG4gICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyBbU3ltYm9sLml0ZXJhdG9yXT86IHVua25vd24gfSlbU3ltYm9sLml0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNlcXVlbmNlU291cmNlczxUPiguLi5zb3VyY2VzOiBTZXF1ZW5jZVNvdXJjZTxUPltdKTogSXRlcmFibGU8VD5bXSB7XG4gIGNvbnN0IHNvdXJjZUl0ZXJhYmxlczogSXRlcmFibGU8VD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IChpc0NvbGxlY3Rpb24oc291cmNlKSAmJiBpc0VtcHR5KHNvdXJjZSkpKSBjb250aW51ZTtcbiAgICBzb3VyY2VJdGVyYWJsZXMucHVzaChpc0NvbnRhaW5lcjxUPihzb3VyY2UpID8gdmFsdWVzKHNvdXJjZSkgOiBbc291cmNlIGFzIFRdKTtcbiAgfVxuICByZXR1cm4gc291cmNlSXRlcmFibGVzO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIG5lc3RlZCBhcnJheXMgZm9yIHtAbGluayBmbGF0fS4gTm9uLWFycmF5IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBhXG4gKiBzaW5nbGUtZWxlbWVudCBpdGVyYWJsZTsgZGVwdGggZGVjcmVtZW50cyBwZXIgYXJyYXkgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5WYWx1ZSh2YWx1ZTogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IEl0ZXJhYmxlPHVua25vd24+IHtcbiAgaWYgKGRlcHRoID4gMCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG5leHREZXB0aCA9IE51bWJlci5pc0Zpbml0ZShkZXB0aCkgPyBkZXB0aCAtIDEgOiBkZXB0aDtcbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHlpZWxkKiBmbGF0dGVuVmFsdWUoaXRlbSwgbmV4dERlcHRoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gW3ZhbHVlXTtcbn1cblxuLyoqIFdyYXAgYSBwZXItZWxlbWVudCB0cmFuc2Zvcm0gKGVhY2ggZWxlbWVudCAtPiBhbiBpdGVyYWJsZSkgYXMgYSBsYXp5IHtAbGluayBTZXF1ZW5jZX0uICovXG5mdW5jdGlvbiBkZXJpdmU8VCwgVT4oXG4gIHNvdXJjZTogSXRlcmFibGU8VD4sXG4gIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IEl0ZXJhYmxlPFU+LFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvdXJjZSkgeWllbGQqIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIExpa2Uge0BsaW5rIGRlcml2ZX0sIGJ1dCB5aWVsZHMgb25lIHZhbHVlIHBlciBzb3VyY2UgZWxlbWVudCAobm8gd3JhcHBlciBpdGVyYWJsZSkuICovXG5mdW5jdGlvbiBkZXJpdmVPbmU8VCwgVT4oc291cmNlOiBJdGVyYWJsZTxUPiwgZm46ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSk6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLm1hcGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gbWFwIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsZWQgcGVyIGVsZW1lbnQgd2l0aCBpdHMgaW5kZXg7IGl0cyByZXN1bHQgaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcDxULCBVPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUsXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmVPbmUoc2VxdWVuY2Uoc291cmNlKSwgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIEEgdHlwZS1ndWFyZCBwcmVkaWNhdGUgbmFycm93cyB0aGUgcmVzdWx0aW5nIGVsZW1lbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBmaWx0ZXIgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBLZWVwcyBlbGVtZW50cyBmb3Igd2hpY2ggaXQgcmV0dXJucyBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTZXF1ZW5jZTxTPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogU2VxdWVuY2U8VD4ge1xuICByZXR1cm4gZGVyaXZlKHNlcXVlbmNlKHNvdXJjZSksIGZ1bmN0aW9uKiAodmFsdWUsIGluZGV4KSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSB5aWVsZCB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzIGFuZCB5aWVsZHMgb25seSBlbGVtZW50cyB0aGF0IGFyZSBub3QgYG51bGxgIG9yXG4gKiBgdW5kZWZpbmVkYCwgbmFycm93aW5nIHRoZSBlbGVtZW50IHR5cGUgdG8ge0BsaW5rIE5vbk51bGxhYmxlfTxgVGA+LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk51bGw8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxOb25OdWxsYWJsZTxUPj4ge1xuICByZXR1cm4gZmlsdGVyKHNlcXVlbmNlKC4uLnNvdXJjZXMpLCAodmFsdWUpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiA9PiB2YWx1ZSAhPSBudWxsKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRNYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gUmV0dXJucyBhIHZhbHVlIG9yIGFycmF5IG9mIHZhbHVlcywgZmxhdHRlbmVkIG9uZSBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgeWllbGQqIHJlc3VsdDtcbiAgICBlbHNlIHlpZWxkIHJlc3VsdCBhcyBVO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIChhcnJheXMgb25seSkuIGBkZXB0aGAgbGVhZHMgc28gdGhlXG4gKiBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljOyB1c2UgYGRlcHRoIDwgMWAgZm9yIGEgbm8tb3AgcGFzc3Rocm91Z2guXG4gKlxuICogQHBhcmFtIGRlcHRoIC0gSG93IG1hbnkgYXJyYXkgbGV2ZWxzIHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUsIHRoZW4gZmxhdHRlbiAobnVsbGlzaCBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXQ8VD4oZGVwdGg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICBpZiAoZGVwdGggPCAxKSByZXR1cm4gc3JjO1xuICByZXR1cm4gZGVyaXZlKHNyYywgKHZhbHVlKSA9PiBmbGF0dGVuVmFsdWUodmFsdWUsIGRlcHRoKSkgYXMgU2VxdWVuY2U8VD47XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzLCB0aGVuIGxhemlseSB5aWVsZHMgdmFsdWVzIGluIGVuY291bnRlciBvcmRlcixcbiAqIHNraXBwaW5nIGEgdmFsdWUgb25seSB3aGVuIGFuIGVxdWFsIG9uZSB3YXMgYWxyZWFkeSB5aWVsZGVkIChgU2V0YCAvXG4gKiBTYW1lVmFsdWVaZXJvKS4gVW5pcXVlbmVzcyBpcyBjaGVja2VkIHBlciBlbGVtZW50IGFzIGl0IGlzIGNvbnN1bWVkLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RpbmN0PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxUPigpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGBzb3VyY2VgLCB0aGVuIGVhY2ggYXBwZW5kZWQgYGl0ZW1gIGluIG9yZGVyIChhcnJheXMgc3ByZWFkIG9uZSBsZXZlbCksXG4gKiBtaXJyb3JpbmcgYEFycmF5LnByb3RvdHlwZS5jb25jYXRgLiBgaXRlbXNgIGFyZSBzY2FsYXIgdmFsdWVzL2FycmF5cywgbm90XG4gKiBjb250YWluZXJzLCBzbyBgc291cmNlYCBzdGF5cyBhIHNpbmdsZSBsZWFkaW5nIGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgbGVhZGluZyBjb250YWluZXIgKG51bGxpc2ggeWllbGRzIGp1c3QgdGhlIGl0ZW1zKS5cbiAqIEBwYXJhbSBpdGVtcyAtIFZhbHVlcyAob3IgYXJyYXlzIG9mIHZhbHVlcykgYXBwZW5kZWQgYWZ0ZXIgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW11cbik6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2Uoc291cmNlKTtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICB5aWVsZCogc3JjO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB5aWVsZCogaXRlbTtcbiAgICAgICAgZWxzZSB5aWVsZCBpdGVtIGFzIFQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGF0IG1vc3QgYGNvdW50YCBlbGVtZW50cyBmcm9tIHRoZSBmcm9udCBvZiB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMuXG4gKiBgY291bnRgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBjb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHlpZWxkIChgPD0gMGAgeWllbGRzIG5vbmUpLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFrZTxUPihjb3VudDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgaWYgKGNvdW50IDw9IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgdGFrZW4gPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICAgIGlmICgrK3Rha2VuID49IGNvdW50KSByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU3BsaXRzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIG9uZSBhcnJheSBwZXIgbmFtZWQgcHJlZGljYXRlLiBDb25zdW1lc1xuICogdGhlIGlucHV0IG9uY2UsIHJvdXRpbmcgZWFjaCBlbGVtZW50IHRvIHRoZSBGSVJTVCBwcmVkaWNhdGUgaXQgc2F0aXNmaWVzIChzb1xuICogZ3JvdXBzIGFyZSBkaXNqb2ludCk7IGVsZW1lbnRzIG1hdGNoaW5nIG5vIHByZWRpY2F0ZSBhcmUgZHJvcHBlZC4gVHlwZS1ndWFyZFxuICogcHJlZGljYXRlcyBuYXJyb3cgdGhlaXIgZ3JvdXAncyBlbGVtZW50IHR5cGUgKHNlZSB7QGxpbmsgR3JvdXBWYWx1ZX0pLlxuICogYHByZWRpY2F0ZXNgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEB0eXBlUGFyYW0gRyAtIFRoZSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUuXG4gKiBAcGFyYW0gcHJlZGljYXRlcyAtIE5hbWVkIHByZWRpY2F0ZXM7IGV2YWx1YXRlZCBpbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMsIGVhY2ggYW4gYXJyYXkgb2YgaXRzIGdyb3VwJ3MgZWxlbWVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY29uc3QgeyBzdHJpbmdzLCBmbnMgfSA9IGdyb3VwKHsgc3RyaW5nczogaXNTdHJpbmcsIGZuczogaXNGdW5jdGlvbiB9LCB4cyk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cDxULCBHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihcbiAgcHJlZGljYXRlczogRyxcbiAgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W11cbik6IHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByZWRpY2F0ZXMpIGFzIChrZXlvZiBHKVtdO1xuICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxrZXlvZiBHLCBUW10+KGtleXMubWFwKChrZXkpID0+IFtrZXksIFtdXSkpO1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKC4uLnNvdXJjZXMpKSB7XG4gICAgY29uc3QgaSA9IGluZGV4Kys7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHByZWRpY2F0ZXNba2V5XSEodmFsdWUsIGkpKSB7XG4gICAgICAgIGJ1Y2tldHMuZ2V0KGtleSkhLnB1c2godmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICByZXN1bHRba2V5XSA9IGJ1Y2tldHMuZ2V0KGtleSkhIGFzIEdyb3VwVmFsdWU8VCwgR1t0eXBlb2Yga2V5XT5bXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kTGFzdGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuIEEgdHlwZSBndWFyZCBuYXJyb3dzIHRoZSByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtYXRjaDogVCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIG1hdGNoID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIGVsZW1lbnRzIHVudGlsIGEgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW5kZXg8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAsIG92ZXIgYSBzaW5nbGVcbiAqIHtAbGluayBDb250YWluZXJ9LiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2ggPSAtMTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSBtYXRjaCA9IGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuc29tZWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb21lPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIFNob3J0LWNpcmN1aXRzIG9uIHRoZSBmaXJzdCBmYWlsdXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoPFQ+KHNvdXJjZTogU291cmNlPFQ+LCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgY2FsbGJhY2sodmFsdWUsIGluZGV4KyspO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuYXRgIG92ZXIgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogTm9uLW5lZ2F0aXZlIGluZGljZXMgc2NhbiBsYXppbHk7IG5lZ2F0aXZlIGluZGljZXMgbWF0ZXJpYWxpemUgZmlyc3QuIGBpbmRleGBcbiAqIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBpbmRleCAtIFplcm8tYmFzZWQgcG9zaXRpb247IG5lZ2F0aXZlIGNvdW50cyBmcm9tIHRoZSBlbmQuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdDxUPihpbmRleDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHRvQXJyYXkoc3JjKS5hdChpbmRleCk7XG4gIGxldCBpID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICBpZiAoaSsrID09PSBpbmRleCkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBOb3JtYWxpemUgb25lIHZhbHVlIG9yIGFuIGV4aXN0aW5nIHZhbHVlIGxpc3QgaW50byBhIHZhbHVlIGxpc3QuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PbmVPck1hbnk8VD4oaW5wdXQ6IFQgfCBPbmVPck1hbnk8VD4pOiBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBzaW5nbGUtcGFzc1xuICogc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogcmVhZG9ubHkgVFtdIHtcbiAgcmV0dXJuIFsuLi5zZXF1ZW5jZSguLi5zb3VyY2VzKV07XG59XG5cbi8qKlxuICogTGF6eSBpdGVyYWJsZSBzZXF1ZW5jZSB3aXRoIGBBcnJheWAtY29tcGF0aWJsZSB0cmFuc2Zvcm1zIGFuZCB0ZXJtaW5hbFxuICogbWV0aG9kcy4gU2luZ2xlLXBhc3MgYnkgZGVmYXVsdDsgY2FsbCB7QGxpbmsgU2VxdWVuY2VJbXBsLmNhY2hlfSB0byByZXRhaW5cbiAqIHB1bGxlZCB2YWx1ZXMgZm9yIHJlLWl0ZXJhdGlvbi4gQnVpbHQgZm9yIGdlbmVyYXRvcnMgYW5kIG90aGVyIHNvdXJjZXMgd2hlcmVcbiAqIGEgc2Vjb25kIHBhc3MgaXMgbm90IGd1YXJhbnRlZWQuXG4gKlxuICogVGhlIG1ldGhvZHMgZm9yd2FyZCB0byB0aGUgc3RhbmRhbG9uZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSAtIHNlZSBlYWNoXG4gKiBtZXRob2QncyBgQHNlZWAgLSBzbyB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgY2hhaW5lZCBzdHlsZXMgc2hhcmUgb25lIGltcGwuXG4gKi9cbmNsYXNzIFNlcXVlbmNlSW1wbDxUPiB7XG4gIHByaXZhdGUgaXRlcmF0b3I/OiBJdGVyYXRvcjxUPjtcbiAgcHJpdmF0ZSBleGhhdXN0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBUW10gfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHsgcmVhZG9ubHkgZXhoYXVzdGVkPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuZXhoYXVzdGVkID0gc3RhdGUuZXhoYXVzdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvbmNlLCBjcmVhdGluZyB0aGUgaXRlcmF0b3Igb24gZmlyc3QgdXNlLiAqL1xuICBwcml2YXRlIHB1bGwoKTogSXRlcmF0b3JSZXN1bHQ8VD4ge1xuICAgIHRoaXMuaXRlcmF0b3IgPz89IHRoaXMuc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGlmICghdGhpcy5jYWNoaW5nKSB7XG4gICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgIGZvciAobGV0IG5leHQgPSB0aGlzLnB1bGwoKTsgIW5leHQuZG9uZTsgbmV4dCA9IHRoaXMucHVsbCgpKSB7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhY2hlZDogaXRlcmF0ZSBsaWtlIGEgbGlzdC4gQWx3YXlzIHJlcGxheSB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YXJ0LFxuICAgICAgLy8gZXh0ZW5kaW5nIGl0IGZyb20gdGhlIHNvdXJjZSBvbiBkZW1hbmQgdW50aWwgZXhoYXVzdGVkLiBBIGJyb2tlbiBsb29wXG4gICAgICAvLyBsZWF2ZXMgdGhlIGJ1ZmZlciBpbnRhY3QsIHNvIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMgb3ZlciBmcm9tIHRoZVxuICAgICAgLy8gYmVnaW5uaW5nLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIhO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGluZGV4IDwgYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcltpbmRleCsrXSE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gobmV4dC52YWx1ZSk7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG1hcH0gKi9cbiAgbWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIG1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmlsdGVyfSAqL1xuICBmaWx0ZXI8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogU2VxdWVuY2U8Uz47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZpbHRlcih0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG5vbk51bGx9ICovXG4gIG5vbk51bGwoKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgICByZXR1cm4gbm9uTnVsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0TWFwfSAqL1xuICBmbGF0TWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+KTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBmbGF0TWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0fSAqL1xuICBmbGF0KGRlcHRoID0gMSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmxhdChkZXB0aCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZGlzdGluY3R9ICovXG4gIGRpc3RpbmN0KCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZGlzdGluY3QodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgY29uY2F0fSAqL1xuICBjb25jYXQoLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gY29uY2F0KHRoaXMsIC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgeWllbGRzIHRoaXMgc2VxdWVuY2UgZm9sbG93ZWQgYnkgZWFjaCBpdGVyYWJsZSBgc291cmNlYCBpbiBvcmRlci5cbiAgICogTGlrZSB7QGxpbmsgY29uY2F0fSwgYnV0IGZvciBpdGVyYWJsZSBzb3VyY2VzIChnZW5lcmF0b3JzLCBvdGhlciBzZXF1ZW5jZXMsXG4gICAqIGBTZXRgLCBgTWFwYCwgZXRjLikgcmF0aGVyIHRoYW4gc2NhbGFyIHZhbHVlcyBvciBhcnJheXMuIEEge0BsaW5rIE1hcH1cbiAgICogc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHNlcXVlbmNlfVxuICAgKi9cbiAgam9pbiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAgIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyh0aGlzLCAuLi5zb3VyY2VzKTtcbiAgICByZXR1cm4gc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSA/IHRoaXMgOiBzZXF1ZW5jZSguLi5zb3VyY2VJdGVyYWJsZXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHRha2V9ICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGFrZShjb3VudCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZ3JvdXB9ICovXG4gIGdyb3VwPEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KHByZWRpY2F0ZXM6IEcpOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gICAgcmV0dXJuIGdyb3VwKHByZWRpY2F0ZXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYWNoZWQsIHJlLWl0ZXJhYmxlIHZpZXcgb2YgdGhpcyBzZXF1ZW5jZS4gQW4gYWxyZWFkeS1jYWNoaW5nXG4gICAqIHNlcXVlbmNlIHJldHVybnMgaXRzZWxmOyBvdGhlcndpc2UgdGhpcyBvbmUtcGFzcyBzZXF1ZW5jZSBpcyB3cmFwcGVkIGluIGFcbiAgICogbmV3IGluc3RhbmNlIHRoYXQgcmV0YWlucyBwdWxsZWQgdmFsdWVzLiBJdGVyYXRlIHRoZSByZXR1cm5lZCBpbnN0YW5jZSwgbm90XG4gICAqIHRoZSBvcmlnaW5hbCwgdG8gYXZvaWQgY29tcGV0aW5nIGZvciB0aGUgc2FtZSBzaW5nbGUtcGFzcyBzb3VyY2UuXG4gICAqL1xuICBjYWNoZSgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGluZyA/IHRoaXMgOiBuZXcgU2VxdWVuY2VJbXBsKHRoaXMsIFtdKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kfSAqL1xuICBmaW5kPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmQodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdH0gKi9cbiAgZmluZExhc3Q8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRJbmRleH0gKi9cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3RJbmRleH0gKi9cbiAgZmluZExhc3RJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBzb21lfSAqL1xuICBzb21lKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvbWUodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBldmVyeX0gKHRoZSBgUyBleHRlbmRzIFRgIG92ZXJsb2FkIG5hcnJvd3MgYXQgY29tcGlsZSB0aW1lIG9ubHkpLiAqL1xuICBldmVyeTxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiB0aGlzIGlzIFNlcXVlbmNlPFM+O1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZXJ5KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZm9yRWFjaH0gKi9cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZm9yRWFjaCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgYXR9ICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYXQoaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBzZXF1ZW5jZSBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBhIHNpbmdsZS1wYXNzIHNvdXJjZTsgYVxuICAgKiBjYWNoZWQsIGV4aGF1c3RlZCBzZXF1ZW5jZSBjb3BpZXMgaXRzIGJ1ZmZlciBkaXJlY3RseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgdG9BcnJheX1cbiAgICovXG4gIHRvQXJyYXkoKTogcmVhZG9ubHkgVFtdIHtcbiAgICBpZiAodGhpcy5jYWNoaW5nICYmIHRoaXMuZXhoYXVzdGVkKSByZXR1cm4gWy4uLnRoaXMuYnVmZmVyIV07XG4gICAgcmV0dXJuIHRvQXJyYXkodGhpcyk7XG4gIH1cbn1cblxuLyoqIFNoYXJlZCBlbXB0eSBzZXF1ZW5jZSBzaW5nbGV0b24sIHJldXNhYmxlIGZvciBhbnkgZWxlbWVudCB0eXBlLiAqL1xuY29uc3QgZW1wdHlTZXF1ZW5jZTogU2VxdWVuY2U8bmV2ZXI+ID0gbmV3IFNlcXVlbmNlSW1wbChbXSwgdW5kZWZpbmVkLCB7XG4gIGV4aGF1c3RlZDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIFdyYXAgb25lIG9yIG1vcmUgaXRlcmFibGUgYHNvdXJjZXNgIGluIGEgc2luZ2xlIGxhenkge0BsaW5rIFNlcXVlbmNlfSxcbiAqIGl0ZXJhdGVkIGluIG9yZGVyLiBgbnVsbGAvYHVuZGVmaW5lZGAgc291cmNlcyBhcmUgc2tpcHBlZDsgd2hlbiBub3RoaW5nXG4gKiByZW1haW5zIChldmVyeSBzb3VyY2Ugb21pdHRlZCwgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW4gZW1wdHkgYXJyYXkgL1xuICogYFNldGAgLyBgTWFwYCksIHtAbGluayBlbXB0eVNlcXVlbmNlfSBpcyByZXR1cm5lZC4gVGhlIHJlc3VsdCBpcyBzaW5nbGUtcGFzc1xuICogLSBjYWxsIGAuY2FjaGUoKWAgdG8gbWFrZSBpdCByZS1pdGVyYWJsZS5cbiAqXG4gKiBBIHtAbGluayBNYXB9IHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzIChzZWUge0BsaW5rIHZhbHVlc30pLCBjb25zaXN0ZW50XG4gKiB3aXRoIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHNvdXJjZXMgLSBJdGVyYWJsZXMgdG8gY29uY2F0ZW5hdGUsIGluIG9yZGVyIChgTWFwYCBzb3VyY2VzIHVzZSB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2U8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgLy8gU2tpcCBudWxsaXNoIHNvdXJjZXMgYW5kIGtub3duLWVtcHR5IGNvbGxlY3Rpb25zOyBub3JtYWxpemUgdGhlIHJlc3QgdG9cbiAgLy8gdGhlaXIgdmFsdWVzIHNvIGEgTWFwIGNvbnRyaWJ1dGVzIHZhbHVlcyByYXRoZXIgdGhhbiBba2V5LCB2YWx1ZV0gZW50cmllcy5cbiAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKC4uLnNvdXJjZXMpO1xuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIC8vIFJldXNlIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFzLWlzIHJhdGhlciB0aGFuIHJlLXdyYXBwaW5nIGl0LlxuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG9ubHkgPSBzb3VyY2VJdGVyYWJsZXNbMF0hO1xuICAgIHJldHVybiBvbmx5IGluc3RhbmNlb2YgU2VxdWVuY2VJbXBsID8gKG9ubHkgYXMgU2VxdWVuY2U8VD4pIDogbmV3IFNlcXVlbmNlSW1wbChvbmx5LCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBuZXcgU2VxdWVuY2VJbXBsKFxuICAgIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlSXRlcmFibGVzKSB5aWVsZCogc291cmNlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBhIG1peCBvZiBzaW5nbGUgaXRlbXMgYW5kIGl0ZXJhYmxlcyBpbnRvIG9uZSBsYXp5IHtAbGluayBHZW5lcmF0b3J9LlxuICpcbiAqIEFyZ3VtZW50cyBhcmUgZW1pdHRlZCBpbiBvcmRlcjogYG51bGxgL2B1bmRlZmluZWRgIGFyZSBza2lwcGVkLCBub24tc3RyaW5nXG4gKiBpdGVyYWJsZXMgKHBlciB7QGxpbmsgaXNDb250YWluZXJ9KSBhcmUgeWllbGRlZCBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZFxuICogYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIHN0cmluZ3MpIGlzIHlpZWxkZWQgYXMgYSBzaW5nbGUgaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci5cbiAqIEBwYXJhbSBpdGVtcyAtIEl0ZW1zIGFuZC9vciBpdGVyYWJsZXMgdG8gZmxhdHRlbiwgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvdmVyIHRoZSBmbGF0dGVuZWQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2VuZXJhdG9yPFQ+KFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBJdGVyYWJsZTxUPiB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IEdlbmVyYXRvcjxUPiB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0NvbnRhaW5lcihpdGVtKSkge1xuICAgICAgeWllbGQqIGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JqZWN0IHZhbHVlIGd1YXJkcywgY29lcmNpb25zLCBhbmQgc3RydWN0dXJhbCBlcXVhbGl0eVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNaW5pbWFsIHNoYXBlIGZvciBvYmplY3RzIHRoYXQgZXhwb3NlIGFuIG9wdGlvbmFsIGBuYW1lYCAoZS5nLiBBcHBLaXQgcGx1Z2lucykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVMaWtlIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqIFByb3BlcnR5IGtleXMgb2YgYFRgIHdob3NlIHZhbHVlcyBhcmUgbm90IGNhbGxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgTm9uRnVuY3Rpb25LZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBOYXJyb3cgYHZhbHVlYCB0byBhIHBsYWluIChub24tYXJyYXkpIG9iamVjdC4gVXNlIGFzIGEgdHlwZSBndWFyZFxuICogYmVmb3JlIGluZGV4aW5nIGludG8gLyBtdXRhdGluZyBwYXJzZWQgSlNPTiBzbyB0aGUgYWNjZXNzIGlzXG4gKiB0eXBlLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc1JlY29yZChwYXJzZWQpKSBwYXJzZWQuZm9vID0gMTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqIEEgSlNPTiBzY2FsYXIuIGB1bmRlZmluZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgLSBgSlNPTi5zdHJpbmdpZnlgIGRyb3BzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbi8qKlxuICogQW55IHZhbHVlIHRoYXQgc3Vydml2ZXMgYSBgSlNPTi5zdHJpbmdpZnlgL2BKU09OLnBhcnNlYCByb3VuZCB0cmlwIHVuY2hhbmdlZC5cbiAqXG4gKiBVc2UgaXQgaW5zdGVhZCBvZiBgdW5rbm93bmAgb24gYSBib3VuZGFyeSB0aGF0IHdpbGwgc2VyaWFsaXplIGl0cyBpbnB1dCAtIGFcbiAqIG1lc3NhZ2UgcGF5bG9hZCwgYSBjYWNoZSBlbnRyeSwgYSBjb25maWcgYmxvYiB3cml0dGVuIHRvIGRpc2sgLSBzbyBhIGBEYXRlYCxcbiAqIGEgYE1hcGAsIG9yIGEgY2xhc3MgaW5zdGFuY2UgaXMgYSBjb21waWxlIGVycm9yIGF0IHRoZSBjYWxsIHNpdGUgcmF0aGVyIHRoYW4gYVxuICogcmVjZWl2ZXIgcXVpZXRseSBnZXR0aW5nIGEgc3RyaW5nIG9yIGB7fWAuIHtAbGluayBpc1NlcmlhbGl6YWJsZVZhbHVlfSBpcyB0aGVcbiAqIHJ1bnRpbWUgaGFsZiwgZm9yIGlucHV0IHRoZSBjb21waWxlciBjYW5ub3Qgdm91Y2ggZm9yLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9XG4gIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSB8IFNlcmlhbGl6YWJsZVZhbHVlW10gfCB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6YWJsZVZhbHVlIH07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGB2YWx1ZWAgc3Vydml2ZXMgYSBKU09OIHJvdW5kIHRyaXAgd2l0aCBubyBsb3NzIGFuZCBubyBjb2VyY2lvbi5cbiAqXG4gKiBTdHJpY3RlciB0aGFuIFwiYEpTT04uc3RyaW5naWZ5YCBkaWQgbm90IHRocm93XCIsIGJlY2F1c2UgdGhhdCBzdWNjZWVkcyB3aGlsZVxuICogc2lsZW50bHkgQ0hBTkdJTkcgdGhlIHZhbHVlOiBhIGBEYXRlYCBiZWNvbWVzIGEgc3RyaW5nLCBgTmFOYCBhbmQgYEluZmluaXR5YFxuICogYmVjb21lIGBudWxsYCwgYSBgTWFwYCBiZWNvbWVzIGB7fWAsIGFuZCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzIGZyb20gYW4gb2JqZWN0XG4gKiBvciB0dXJucyBpbnRvIGBudWxsYCBpbnNpZGUgYW4gYXJyYXkuIEVhY2ggb2YgdGhvc2UgcmVhY2hlcyB0aGUgZmFyIHNpZGUgYXNcbiAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgd2FzIHNlbnQsIHNvIGFsbCBvZiB0aGVtIGFyZSByZWplY3RlZCBoZXJlLlxuICpcbiAqIFJlamVjdGVkOiBub24tZmluaXRlIG51bWJlcnMsIGB1bmRlZmluZWRgLCBmdW5jdGlvbnMsIHN5bWJvbHMsIGJpZ2ludHMsIGNsYXNzXG4gKiBpbnN0YW5jZXMgYW5kIGFueXRoaW5nIGVsc2Ugd2l0aCBhIHByb3RvdHlwZSBvdGhlciB0aGFuIGBPYmplY3QucHJvdG90eXBlYCBvclxuICogYG51bGxgIChgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgYFJlZ0V4cGAsIGBCdWZmZXJgKSwgYW5kIGFueSBvYmplY3QgZ3JhcGhcbiAqIGNvbnRhaW5pbmcgYSBjeWNsZS4gQWNjZXB0ZWQ6IHN0cmluZ3MsIGJvb2xlYW5zLCBgbnVsbGAsIGZpbml0ZSBudW1iZXJzLCBwbGFpblxuICogb2JqZWN0cywgYXJyYXlzLCBhbmQgbmVzdGluZ3Mgb2YgdGhvc2UuXG4gKlxuICogTmFycm93cyB0byB7QGxpbmsgU2VyaWFsaXphYmxlVmFsdWV9IHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgYWxzbyBzZXJ2ZXNcbiAqIGFzIHRoZSB2YWxpZGF0b3IgZm9yIHVudHJ1c3RlZCBpbnB1dCAtIGEgcmVxdWVzdCBib2R5LCBhIGRlY29kZWQgbm90aWZpY2F0aW9uXG4gKiBwYXlsb2FkIC0gd2hlcmUgdGhlIGFuc3dlciBzaG91bGQgYmUgYSA0MDAgYW5kIG5vdCBhIHRocm93LiBOZXZlciB0aHJvd3MuXG4gKlxuICogRGlzdGluY3QgZnJvbSB7QGxpbmsgZGVlcEVxdWFsfSdzIG5vdGlvbiBvZiBjb21wYXJhYmxlOiB0aGF0IG9uZSBIQU5ETEVTXG4gKiBgRGF0ZWAvYE1hcGAvYFNldGAgc3RydWN0dXJhbGx5LCB3aGlsZSB0aGlzIG9uZSByZWplY3RzIHRoZW0gcHJlY2lzZWx5IGJlY2F1c2VcbiAqIEpTT04gY2Fubm90IGNhcnJ5IHRoZW0uXG4gKlxuICogQHBhcmFtIGFuY2VzdG9ycyBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYTogWzEsIFwieFwiLCBudWxsXSB9KTsgLy8gdHJ1ZVxuICogaXNTZXJpYWxpemFibGVWYWx1ZSh7IGF0OiBuZXcgRGF0ZSgpIH0pOyAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBhIHN0cmluZ1xuICogaXNTZXJpYWxpemFibGVWYWx1ZShOdW1iZXIuTmFOKTsgICAgICAgICAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcmlhbGl6YWJsZVZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHZhbHVlIGlzIFNlcmlhbGl6YWJsZVZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICA/IHZhbHVlLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSlcbiAgICA6IE9iamVjdC52YWx1ZXModmFsdWUpLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIHN0cmluZyBmb3IgYSBzdHJ1Y3R1cmVkIHZhbHVlLCBmb3IgZGVyaXZpbmcgYSBTVEFCTEUgSURFTlRJVFkgZnJvbVxuICogaXQgLSBhbiBhZHZpc29yeS1sb2NrIGlkLCBhIGNoYW5uZWwgbmFtZSwgYSBjYWNoZSBrZXkuXG4gKlxuICogVGhlIGd1YXJhbnRlZSBpcyB0d28td2F5LCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHNhZmUgdG8gaGFzaDogdmFsdWVzIHRoYXRcbiAqIHNob3VsZCBzaGFyZSBhbiBpZGVudGl0eSBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZyAob2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdFxuICogbWF0dGVyKSwgYW5kIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYXJlIG5ldmVyIGNvbmZsYXRlZC4gRXZlcnkgdG9rZW4gY2Fycmllc1xuICogaXRzIHR5cGUsIHNvIGAxYCBhbmQgYFwiMVwiYCBkaWZmZXI7IGEgc3RyaW5nIGNhcnJpZXMgaXRzIGxlbmd0aCwgc29cbiAqIGBbXCJhXCIsIFwiYmNcIl1gIGFuZCBgW1wiYWJcIiwgXCJjXCJdYCBkaWZmZXI7IGFycmF5cyBrZWVwIG9yZGVyIHdoaWxlIG9iamVjdCBrZXlzXG4gKiBhcmUgc29ydGVkLlxuICpcbiAqIGBKU09OLnN0cmluZ2lmeWAgY2Fubm90IGRvIHRoaXMgam9iIC0ga2V5IG9yZGVyIGxlYWtzIGluLCBgdW5kZWZpbmVkYCB2YW5pc2hlcyxcbiAqIGAxYCBhbmQgYFwiMVwiYCBjb2xsaWRlIGFmdGVyIHF1b3RpbmcgaXMgc3RyaXBwZWQsIGFuZCBhIGN5Y2xlIHRocm93cyBhXG4gKiBgVHlwZUVycm9yYCBuYW1pbmcgbmVpdGhlciB0aGUgdmFsdWUgbm9yIHRoZSBjYWxsZXIncyBpbnRlbnQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHN0cmljdCB3aGVyZSBhIHNpbGVudCBhbnN3ZXIgd291bGQgYmUgYSBXUk9ORyBpZGVudGl0eSByYXRoZXJcbiAqIHRoYW4gYSBtaXNzaW5nIG9uZSwgc2luY2UgdHdvIGNhbGxlcnMgZGlzYWdyZWVpbmcgYWJvdXQgYSBsb2NrIG9yIGEgY2hhbm5lbCBpc1xuICogaW52aXNpYmxlIHVudGlsIGl0IGNvcnJ1cHRzIHNvbWV0aGluZy4gVGhyb3dzIGBUeXBlRXJyb3JgIG9uIGEgY3ljbGUsIG9uIGFcbiAqIG5vbi1maW5pdGUgbnVtYmVyIChgTmFOYCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLCBzbyBpdCBjYW5ub3QgaGF2ZSBhIHN0YWJsZVxuICogaWRlbnRpdHkpLCBhbmQgb24gYSBgZnVuY3Rpb25gIG9yIGBzeW1ib2xgIChubyBtZWFuaW5nZnVsIHZhbHVlIGlkZW50aXR5KS5cbiAqIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgYXJlIGFjY2VwdGVkIGFzIGRpc3RpbmN0IHRva2Vucy5cbiAqXG4gKiBgRGF0ZWAgaXMgY2Fub25pY2FsaXplZCBieSBpbnN0YW50LCB1bmxpa2UgdGhlIGhhc2ggY2Fub25pY2FsaXplciBpblxuICogYC4vaGFzaC50c2AsIHdoaWNoIGZvbGRzIGV2ZXJ5IGBEYXRlYCBvbnRvIG9uZSB0b2tlbi4gUHJlZmVyIHRoaXMgZnVuY3Rpb24gd2hlblxuICogZGlzdGluY3RuZXNzIGlzIGEgY29ycmVjdG5lc3MgcmVxdWlyZW1lbnQ7IHByZWZlciBgaGFzaC5mbnZIYXNoYCB3aGVuIGEgc2hvcnQsXG4gKiBjb2xsaXNpb24tdG9sZXJhbnQgZGlnZXN0IGlzIGVub3VnaC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2Fub25pY2FsaXplLlxuICogQHBhcmFtIHNlZW4gLSBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b1N0YWJsZUtleSh7IGE6IDEsIGI6IDIgfSkgPT09IHRvU3RhYmxlS2V5KHsgYjogMiwgYTogMSB9KTsgLy8gdHJ1ZVxuICogdG9TdGFibGVLZXkoMSkgIT09IHRvU3RhYmxlS2V5KFwiMVwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFibGVLZXkodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAvLyBMZW5ndGgtcHJlZml4ZWQgc28gY29uY2F0ZW5hdGVkIG5laWdoYm91cnMgY2Fubm90IGJlIHJlLXNwbGl0XG4gICAgICAvLyBkaWZmZXJlbnRseTogYFtcImFcIixcImJjXCJdYCBhbmQgYFtcImFiXCIsXCJjXCJdYCBtdXN0IG5vdCBhZ3JlZS5cbiAgICAgIHJldHVybiBgc3RyaW5nOiR7dmFsdWUubGVuZ3RofToke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBgYm9vbGVhbjoke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIGBiaWdpbnQ6JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIHJlcXVpcmUgZmluaXRlIG51bWJlcnNcIik7XG4gICAgICAvLyBgLTAgPT09IDBgIGJ1dCB0aGV5IHN0cmluZ2lmeSBkaWZmZXJlbnRseSwgc28gcGljayBvbmUgc3BlbGxpbmcuXG4gICAgICByZXR1cm4gYG51bWJlcjoke09iamVjdC5pcyh2YWx1ZSwgLTApID8gXCItMFwiIDogdmFsdWV9YDtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFibGUga2V5cyBjYW5ub3QgY29udGFpbiBjeWNsZXNcIik7XG4gICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gYGRhdGU6JHt2YWx1ZS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgYXJyYXk6WyR7dmFsdWUubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgLy8gU29ydGVkIGJ5IGNhbm9uaWNhbCBmb3JtLCBzbyBpbnNlcnRpb24gb3JkZXIgZG9lcyBub3QgbGVhay5cbiAgICAgICAgICByZXR1cm4gYHNldDpbJHtbLi4udmFsdWVdXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSlcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzOiBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+ID1cbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgICAgICByZXR1cm4gYCR7dmFsdWUgaW5zdGFuY2VvZiBNYXAgPyBcIm1hcFwiIDogXCJvYmplY3RcIn06eyR7Wy4uLmVudHJpZXNdXG4gICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IGAke3RvU3RhYmxlS2V5KGtleSwgc2Vlbil9PSR7dG9TdGFibGVLZXkoaXRlbSwgc2Vlbil9YClcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oXCIsXCIpfX1gO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5kZWxldGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc3RhYmxlIGtleSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGB7IFtrZXldOiB2YWx1ZSB9YCB3aGVuIGB2YWx1ZWAgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgIC0gc28gYW5cbiAqIGFic2VudCBvcHRpb25hbCBmaWVsZCBzdGF5cyBBQlNFTlQgd2hlbiBzcHJlYWQsIHJhdGhlciB0aGFuIGJlY29taW5nIGFuXG4gKiBleHBsaWNpdCBgdW5kZWZpbmVkYCB0aGF0IGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlc2AgcmVqZWN0cy5cbiAqXG4gKiBTcGVsbGluZyB0aGF0IGlubGluZSBjb3N0cyBhIHJlcGVhdGVkLCBkb3VibGUtZXZhbHVhdGVkIHRlcm5hcnkgcGVyIGZpZWxkXG4gKiAoYC4uLih2ID8geyBrZXk6IHYgfSA6IHt9KWApLCB3aGljaCBpcyBob3cgY29uZmlnIHJlc29sdmVycyBlbmQgdXAgY29tcHV0aW5nXG4gKiB0aGUgc2FtZSB2YWx1ZSB0d2ljZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogcmV0dXJuIHtcbiAqICAgLi4ub3B0aW9uYWwoXCJhcHBJZFwiLCBjb25maWd1cmVkQXBwSWQpLFxuICogICAuLi5vcHRpb25hbChcImVuZHBvaW50XCIsIGNvbmZpZy5lbmRwb2ludCksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWw8SyBleHRlbmRzIHN0cmluZywgVj4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFYgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPEssIFY+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAoeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8SywgVj4pO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b051bWJlcn0uXG4gKlxuICogQm90aCBzd2l0Y2hlcyB0dXJuIE9GRiBhIGxlbmllbmN5IHRoYXQgaXMgaGVscGZ1bCBmb3IgYSBoYW5kLXR5cGVkIHNldHRpbmcgYnV0XG4gKiB3cm9uZyB3aGVuIHRoZSBzdHJpbmcncyBvdGhlciBjaGFyYWN0ZXJzIGNhcnJ5IG1lYW5pbmcuIHtAbGluayB0b0RhdGV9IGFuZFxuICoge0BsaW5rIHRvRHVyYXRpb259IGRpc2FibGUgYm90aCwgc2luY2UgYSBzcGFjZSBpbnNpZGUgYDIwMjYgMDggMDJgIGlzIGEgZmllbGRcbiAqIHNlcGFyYXRvciBhbmQgYSBwZXJjZW50IGhhcyBubyBlcG9jaCBvciBtaWxsaXNlY29uZCByZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvTnVtYmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGludGVybmFsIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkLCBzbyBgXCIxLDAwMFwiYCBhbmRcbiAgICogYFwiMSAwMDBcImAgcmVhZCBhcyBgMTAwMGAuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogUGxhY2VtZW50IGlzIG5vdCB2YWxpZGF0ZWQgd2hlbiBlbmFibGVkLCBzbyBgXCIxLDAwLDBcImAgYWxzbyByZWFkcyBhcyBgMTAwMGAuXG4gICAqIERpc2FibGUgaXQgd2hlbiB3aGl0ZXNwYWNlIG9yIGEgY29tbWEgZGVsaW1pdHMgRklFTERTIHJhdGhlciB0aGFuIGdyb3VwaW5nXG4gICAqIGRpZ2l0cywgYmVjYXVzZSBzdHJpcHBpbmcgdGhlbSBzaWxlbnRseSBmdXNlcyB0aG9zZSBmaWVsZHMgaW50byBvbmUgbnVtYmVyLlxuICAgKi9cbiAgc2VwYXJhdG9ycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdHJhaWxpbmcgcGVyY2VudCBzaWduIGRpdmlkZXMgdGhlIHJlc3VsdCBieSBgMTAwYCwgc28gYFwiMjUlXCJgIHJlYWRzXG4gICAqIGFzIGAwLjI1YC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBEaXNhYmxlIGl0IHdoZXJlIGEgcGVyY2VudGFnZSBoYXMgbm8gbWVhbmluZywgc28gYFwiMjUlXCJgIGlzIGEgbWlzcyByYXRoZXJcbiAgICogdGhhbiBhIG51bWJlciB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBhd2F5IGZyb20gd2hhdCB0aGUgdGV4dCBzYXlzLlxuICAgKi9cbiAgcGVyY2VudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgbnVtZXJpYyB2YWx1ZSB0byBhIHJlYWwsIEZJTklURSBgbnVtYmVyYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdFxuICogY2FycmllcyBubyBudW1lcmljIG1lYW5pbmcuXG4gKlxuICogVGhlIG9uZSBwbGFjZSBhIGhhbmQtdHlwZWQgbnVtYmVyIGlzIGludGVycHJldGVkLCBhbG9uZ3NpZGUge0BsaW5rIHRvQm9vbGVhbn0sXG4gKiB7QGxpbmsgdG9EYXRlfSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS4gUmVhY2ggZm9yIGl0IGluc3RlYWQgb2YgYE51bWJlcih4KWAgb3IgYVxuICogaGFuZC1yb2xsZWQgbnVtZXJpYyByZWdleDogYmFyZSBgTnVtYmVyYCBtYXBzIGBcIlwiYCwgYG51bGxgLCBgW11gLCBhbmRcbiAqIHdoaXRlc3BhY2UgdG8gYDBgIGFuZCBhbnl0aGluZyBlbHNlIHRvIGBOYU5gLCBzbyBhIGNhbGxlciBoYXMgdG8gcmUtY2hlY2sgdGhlXG4gKiByZXN1bHQgZXZlcnkgdGltZSwgYW5kIGFkIGhvYyByZWdleGVzIHRlbmQgdG8gZHJpZnQgaW4gd2hhdCB0aGV5IGFjY2VwdC5cbiAqXG4gKiBBY2NlcHRzOiBhIGZpbml0ZSBgbnVtYmVyYDsgYSBgYmlnaW50YDsgb3IgYSBkZWNpbWFsIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsXG4gKiBsZWFkaW5nIHNpZ24sIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciB0aGUgc2lnbixcbiAqIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgKGBcIjEsMDAwXCJgLCBgXCIxIDAwMFwiYCksIGEgYmFyZSBmcmFjdGlvbiAoYFwiLjVcImApLCBhXG4gKiB0cmFpbGluZyBwb2ludCAoYFwiMS5cImApLCBzY2llbnRpZmljIG5vdGF0aW9uIChgXCIxZTNcImApLCBhbmQgYW4gb3B0aW9uYWxcbiAqIHRyYWlsaW5nIHBlcmNlbnQgc2lnbiAoYFwiMjUlXCJgLCBgXCIxLjUgJVwiYCkuIEEgdHJhaWxpbmcgYCVgIGRpdmlkZXMgdGhlIHBhcnNlZFxuICogdmFsdWUgYnkgYDEwMGAsIHNvIGBcIjI1JVwiYCBiZWNvbWVzIGAwLjI1YC5cbiAqXG4gKiBTZXBhcmF0b3JzIGFyZSBzdHJpcHBlZCB3aXRob3V0IHZhbGlkYXRpbmcgdGhlaXIgcGxhY2VtZW50LCBzbyBgXCIxLDAwLDBcImAgcmVhZHNcbiAqIGFzIGAxMDAwYDsgdGhpcyBpcyBhIGNvZXJjaW9uIGZvciBoYW5kLXR5cGVkIGNvbmZpZ3VyYXRpb24sIG5vdCBhIGxvY2FsZS1hd2FyZVxuICogdmFsaWRhdG9yLiBBbnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgYE5hTmAsIGBJbmZpbml0eWAsIGFuIGVtcHR5IG9yXG4gKiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBhIGJvb2xlYW4sIG11bHRpcGxlIHNpZ25zLFxuICogbWFsZm9ybWVkIGV4cG9uZW50cywgbWlzcGxhY2VkIHBlcmNlbnQgc2lnbnMsIG9yIGBcIjEycHhcImAsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiB0aHJvd2luZywgbWF0Y2hpbmcgdGhlIG90aGVyIGNvZXJjaW9ucywgc28gaXRcbiAqIGNvbXBvc2VzIG5hdHVyYWxseSB3aXRoIGA/P2AgZmFsbGJhY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b051bWJlcihcIjEsMDAwXCIpOyAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiIC0yLjUgXCIpOyAgLy8gLTIuNVxuICogdG9OdW1iZXIoXCIxZTNcIik7ICAgICAvLyAxMDAwXG4gKiB0b051bWJlcihcIjEyLjUgJVwiKTsgIC8vIDAuMTI1XG4gKiB0b051bWJlcihcIlwiKTsgICAgICAgIC8vIHVuZGVmaW5lZCAgKE51bWJlcihcIlwiKSB3b3VsZCBiZSAwKVxuICogdG9OdW1iZXIoXCIxMnB4XCIpOyAgICAvLyB1bmRlZmluZWRcbiAqIHRvTnVtYmVyKFwiMSAwMDBcIiwgeyBzZXBhcmF0b3JzOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9OdW1iZXJPcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gdG9OdW1iZXIoTnVtYmVyKHZhbHVlKSwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gU3RyaXAgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciBhIGxlYWRpbmcgc2lnbiwgZGlnaXQtZ3JvdXBcbiAgICAvLyBzZXBhcmF0b3JzIChib3RoIGAsYCBhbmQgdGhlIHNwYWNlIGluIGBcIjEgMDAwXCJgKSwgbGVhdmluZyBhIGJhcmUgbnVtZXJhbCBmb3JcbiAgICAvLyB0aGUgc2hhcGUgdGVzdCBiZWxvdyB0byBhY2NlcHQgb3IgcmVqZWN0LlxuICAgIGNvbnN0IHRleHQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgb3B0aW9ucy5zZXBhcmF0b3JzID09PSBmYWxzZSA/IC8oXlxccyt8XFxzKyQpL2cgOiAvKF5cXHMrfFxccyskfCg/PD1eWystXSlcXHMrfCg/PD1cXGQpXFxzK3wsKS9nLFxuICAgICAgXCJcIixcbiAgICApO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL14oWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSglKT8kL2kpO1xuICAgICAgaWYgKG1hdGNoICYmICEobWF0Y2hbMl0gJiYgb3B0aW9ucy5wZXJjZW50ID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHRvTnVtYmVyKG1hdGNoWzJdID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBib3hlZCBgTnVtYmVyYCwgb3IgYW55dGhpbmcgd2l0aCBhIG51bWVyaWMgYHRvU3RyaW5nYC4gYFN0cmluZyh2YWx1ZSlgXG4gICAgLy8gcm91dGVzIGl0IGJhY2sgdGhyb3VnaCB0aGUgc3RyaW5nIGJyYW5jaCwgd2hpY2ggcmVqZWN0cyB3aGF0IGlzIG5vdCBudW1lcmljLlxuICAgIHJldHVybiB0b051bWJlcihTdHJpbmcodmFsdWUpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGJvb2xlYW4taXNoIHZhbHVlIHRvIGEgcmVhbCBgYm9vbGVhbmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGl0IGNhbid0IGJlIGludGVycHJldGVkLiBSZWNvZ25pemVzIGB0cnVlYC9gdGAvYG9uYC9gMWAvYHllc2AvYHlgXG4gKiBhbmQgdGhlaXIgbmVnYXRpdmVzIChjYXNlLSBhbmQgd2hpdGVzcGFjZS1pbnNlbnNpdGl2ZSBmb3Igc3RyaW5ncyksIGFzXG4gKiB3ZWxsIGFzIHRoZSBudW1iZXJzIGAxYCBhbmQgYDBgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IFwidHJ1ZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcInRcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib25cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMVwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5ZXNcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdmFsdWUgPT09IFwiZmFsc2VcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9mZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIwXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5vXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMYXJnZXN0IHZhbHVlIHJlYWQgYXMgZXBvY2ggU0VDT05EUyByYXRoZXIgdGhhbiBtaWxsaXNlY29uZHMuXG4gKlxuICogYDFlMTFgIHNlY29uZHMgaXMgdGhlIHllYXIgNTEzOCBhbmQgYDFlMTFgIG1zIGlzIDE5NzMtMDMtMDMsIHNvIGV2ZXJ5IHZhbHVlIGFcbiAqIGNhbGxlciByZWFsaXN0aWNhbGx5IG1lYW5zIGFzIG1pbGxpcyBpcyBhYm92ZSB0aGUgbGluZSBhbmQgZXZlcnkgdmFsdWUgdGhleVxuICogbWVhbiBhcyBzZWNvbmRzIGlzIGJlbG93IGl0LiBUaGUgYW1iaWd1aXR5IGlzIHVuYXZvaWRhYmxlIC0gdGhlIHR3byB1bml0cyBzaGFyZVxuICogYSBudW1iZXIgbGluZSAtIHNvIHRoZSBzcGxpdCBpcyBwbGFjZWQgd2hlcmUgbmVpdGhlciBzaWRlIGhhcyBhIHBsYXVzaWJsZVxuICogY2xhaW0uXG4gKi9cbmNvbnN0IFNFQ09ORFNfQ0VJTElORyA9IDFlMTE7XG5cbi8qKlxuICogQSBudW1iZXIgZm9yIHtAbGluayB0b0RhdGV9IGFuZCB7QGxpbmsgdG9EdXJhdGlvbn0sIHJlYWQgd2l0aCBub25lIG9mXG4gKiB7QGxpbmsgdG9OdW1iZXJ9J3Mgc3RyaW5nIGxlbmllbmNpZXMuXG4gKlxuICogQm90aCBsZW5pZW5jaWVzIGFyZSBhY3RpdmVseSBoYXJtZnVsIGhlcmUuIEEgc3BhY2Ugb3IgY29tbWEgc2VwYXJhdGVzIEZJRUxEUyBpblxuICogYSBkYXRlIChgMjAyNiAwOCAwMmAgd291bGQgZnVzZSBpbnRvIHRoZSBlcG9jaCBgMjAyNjA4MDJgKSwgYW5kIGEgcGVyY2VudGFnZSBoYXNcbiAqIG5vIHJlYWRpbmcgYXMgYW4gaW5zdGFudCBvciBhIGxlbmd0aCBvZiB0aW1lLCBzbyBgMjUlYCBtdXN0IGJlIGEgbWlzcyByYXRoZXJcbiAqIHRoYW4gYDI1MG1zYC5cbiAqL1xuZnVuY3Rpb24gdG9CYXJlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlLCB7IHNlcGFyYXRvcnM6IGZhbHNlLCBwZXJjZW50OiBmYWxzZSB9KTtcbn1cblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9EYXRlfS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc306IGVhY2ggZnVuY3Rpb24gY2FuIGZhbGwgYmFjayB0byB0aGVcbiAqIG90aGVyLCBzbyBlYWNoIGhhcyBvbmUgc3dpdGNoIHR1cm5pbmcgdGhhdCBmYWxsYmFjayBvZmYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9EYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24gaXMgcmVhZCBhcyBhbiBpbnN0YW50IHJlbGF0aXZlIHRvXG4gICAqIG5vdywgc28gYC03ZGAgYW5kIGA3IGRheXMgYWdvYCBiZWNvbWUgYG5vdyAtIDcgZGF5c2AuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiB0aGUgdmFsdWUgbXVzdCBiZSBhIHJlYWwgZGF0ZSBhbmQgYSByZWxhdGl2ZSBleHByZXNzaW9uXG4gICAqIHNob3VsZCBiZSBhIG1pc3MgLSBhIHN0b3JlZCB0aW1lc3RhbXAsIGEgdXNlci1zdXBwbGllZCBgRGF0ZWAgaGVhZGVyLCBhblxuICAgKiBgZXhwaXJlc19hdGAgZmllbGQgLSBzaW5jZSBhIGR1cmF0aW9uIHNpbGVudGx5IHJlc29sdmluZyBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gICAqIGNsb2NrIG1ha2VzIHRoZSBzYW1lIGlucHV0IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBvbiBldmVyeSBjYWxsLiBBbHNvIHdoYXRcbiAgICoge0BsaW5rIHRvRHVyYXRpb259IHBhc3NlcyB3aGVuIGl0IHJlY3Vyc2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBib3VuY2UgYSB2YWx1ZVxuICAgKiBiZXR3ZWVuIHRoZW0gZm9yZXZlci5cbiAgICovXG4gIHBhcnNlRHVyYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0R1cmF0aW9ufS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0RhdGVPcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvdGhlcixcbiAqIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRGF0ZX0gdmFsdWUgaXMgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdywgc29cbiAgICogYDIwMjYtMDgtMDJgIGJlY29tZXMgaG93ZXZlciBsb25nIHVudGlsIChvciBzaW5jZSkgdGhhdCBpbnN0YW50LiBEZWZhdWx0cyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIGlzIG1lYW5pbmdmdWwgLSBhIHRpbWVvdXQsIGEgcG9sbFxuICAgKiBpbnRlcnZhbCwgYSBjYWNoZSBUVEwgLSBiZWNhdXNlIGEgZGF0ZSB3b3VsZCBvdGhlcndpc2UgeWllbGQgYSBwbGF1c2libGUgYnV0XG4gICAqIHdyb25nIG51bWJlciB0aGF0IGFsc28gZHJpZnRzIHdpdGggdGhlIGNsb2NrLiBBbHNvIHdoYXQge0BsaW5rIHRvRGF0ZX0gcGFzc2VzXG4gICAqIHdoZW4gaXQgcmVjdXJzZXMuXG4gICAqL1xuICBwYXJzZURhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGR1cmF0aW9uIHRvIE1JTExJU0VDT05EUywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGxlbmllbnQsIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSB0eXBlZCBieSBoYW5kIGludG8gZW52IHZhcnMsXG4gKiBDTEkgZmxhZ3MsIGFuZCBjb25maWcgZmlsZXM6IHdoaXRlc3BhY2UgYmV0d2VlbiBhbW91bnQgYW5kIHVuaXQgaXMgb3B0aW9uYWwgYW5kXG4gKiB1bmxpbWl0ZWQsIHVuaXRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBwbHVyYWxzIGFuZCB0aGUgY29tbW9uIGFiYnJldmlhdGlvbnMgYXJlXG4gKiBlcXVpdmFsZW50IChgMm1zYCA9PT0gYDIgbWlsbGlzZWNvbmRzYCwgYDFoYCA9PT0gYDEgaHJgID09PSBgMSBIb3VyYCksIGBhbmRgIGFuZFxuICogdGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGlnbm9yZWQgKGAxLDUwMCBtc2AsIGAxIGhvdXIgYW5kIDMwIG1pbnV0ZXNgKSwgYW5kXG4gKiB0ZXJtcyBjb21wb3NlIChgMWgzMG1gKS4gQSBwbGFpbiBgbnVtYmVyYCBwYXNzZXMgdGhyb3VnaCBhcyBtaWxsaXNlY29uZHMuXG4gKlxuICogU2lnbnMgYXJlIHN1cHBvcnRlZCBzbyBhIGR1cmF0aW9uIGNhbiBleHByZXNzIGFuIE9GRlNFVCByYXRoZXIgdGhhbiBvbmx5IGFcbiAqIGxlbmd0aDogYSBsZWFkaW5nIGAtYCAob3IgYSB0cmFpbGluZyBgYWdvYCkgbWFrZXMgdGhlIHJlc3VsdCBuZWdhdGl2ZSwgYW5kIGFuXG4gKiB1bnNpZ25lZCB0ZXJtIGluaGVyaXRzIHRoZSBwcmV2aW91cyB0ZXJtJ3Mgc2lnbiwgc28gYC0xaDMwbWAgaXMgLTkwIG1pbnV0ZXNcbiAqIHJhdGhlciB0aGFuIC02MCArIDMwLiB7QGxpbmsgdG9EYXRlfSB1c2VzIHRoYXQgdG8gdHVybiBgLTdkYCAvIGA3IGRheXMgYWdvYFxuICogaW50byBhbiBpbnN0YW50IHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBBbiBVTktOT1dOIHVuaXQgZmFpbHMgdGhlIHdob2xlIHBhcnNlIHJhdGhlciB0aGFuIGJlaW5nIHNraXBwZWQgLSBgMSBmb3J0bmlnaHRgXG4gKiByZXR1cm5pbmcgYDFgIHNpbGVudGx5IHdvdWxkIGJlIHdvcnNlIHRoYW4gcmV0dXJuaW5nIG5vdGhpbmcgLSB3aGljaCBpcyBhbHNvXG4gKiB3aGF0IGtlZXBzIHtAbGluayB0b0RhdGV9IGZyb20gbWlzdGFraW5nIGAxIEphbiAyMDI2YCBmb3IgYSBkdXJhdGlvbi5cbiAqXG4gKiBBIHZhbHVlIHRoYXQgaXMgbm90IGEgZHVyYXRpb24gYXQgYWxsIGlzIG9mZmVyZWQgdG8ge0BsaW5rIHRvRGF0ZX0gYW5kLCB3aGVuIGl0XG4gKiBJUyBhIGRhdGUsIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIG1ha2VzIHRoZVxuICogdHdvIGZ1bmN0aW9ucyBpbnZlcnNlczogYSBwYXN0IGluc3RhbnQgaXMgbmVnYXRpdmUsIGEgZnV0dXJlIG9uZSBwb3NpdGl2ZS5cbiAqIGBvcHRpb25zLnBhcnNlRGF0ZTogZmFsc2VgIHR1cm5zIHRoYXQgb2ZmIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIG1ha2VzXG4gKiBzZW5zZSAtIHNlZSB7QGxpbmsgVG9EdXJhdGlvbk9wdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0R1cmF0aW9uKFwiMzBzXCIpOyAgICAgICAgICAgICAgICAgICAgLy8gMzBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMSBob3VyIDMwIG1pbnV0ZXNcIik7ICAgICAgLy8gNV80MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiLTcgZGF5c1wiKTsgICAgICAgICAgICAgICAgLy8gLTYwNF84MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMiB3ZWVrcyBhZ29cIik7ICAgICAgICAgICAgLy8gLTFfMjA5XzYwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgICAgICAvLyBtcyBmcm9tIG5vdyB0byB0aGF0IGluc3RhbnRcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIsIHsgcGFyc2VEYXRlOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0R1cmF0aW9uKFwic29vblwiKTsgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0R1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0R1cmF0aW9uT3B0aW9ucyA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gQSBiYXJlIG51bWJlciBpcyBhbHJlYWR5IG1pbGxpc2Vjb25kcywgdGhlIHNhbWUgcmVhZGluZyBgdG9EYXRlYCBnaXZlcyBhblxuICAvLyBlcG9jaCB2YWx1ZSwgc28gdGhpcyBtdXN0IHJ1biBiZWZvcmUgYW55IGRhdGUgaW50ZXJwcmV0YXRpb24uXG4gIGNvbnN0IG51bSA9IHRvQmFyZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cbiAgbGV0IHRleHQgPSB2YWx1ZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2VBbGwoL1ssX10vZywgXCJcIilcbiAgICAucmVwbGFjZUFsbCgvXFxiYW5kXFxiL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG4gIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJhZ29cIikpIHtcbiAgICBuZWdhdGUgPSB0cnVlO1xuICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIC1cImFnb1wiLmxlbmd0aCk7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXmluXFxiLywgXCJcIikudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGVybXMgPSBbLi4udGV4dC5tYXRjaEFsbChEVVJBVElPTl9URVJNKV07XG4gIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBtYXRjaGVkIHRlcm1zIG11c3QgYmUgc2VwYXJhdG9ycyBvbmx5OyBvdGhlcndpc2UgdGhlXG4gIC8vIHN0cmluZyBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IG1lcmVseSBDT05UQUlOUyBhIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudC5cbiAgbGV0IGxlZnRvdmVyID0gdGV4dDtcbiAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSBsZWZ0b3ZlciA9IGxlZnRvdmVyLnJlcGxhY2UodGVybVswXSwgXCIgXCIpO1xuICBpZiAobGVmdG92ZXIudHJpbSgpKSB7XG4gICAgLy8gQSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQgaW5zaWRlIG90aGVyIHRleHQgaXMgdXN1YWxseSBhIERBVEUgLSBgXCIyMDI2LTA4LTAyXCJgXG4gICAgLy8gbWF0Y2hlcyB0d28gdGVybXMgYW5kIGxlYXZlcyBzZXBhcmF0b3JzIGJlaGluZC5cbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgbGV0IHRvdGFsID0gMDtcbiAgbGV0IHNpZ24gPSAxO1xuICBmb3IgKGNvbnN0IFssIGV4cGxpY2l0U2lnbiwgYW1vdW50LCB1bml0XSBvZiB0ZXJtcykge1xuICAgIGlmIChleHBsaWNpdFNpZ24pIHNpZ24gPSBleHBsaWNpdFNpZ24gPT09IFwiLVwiID8gLTEgOiAxO1xuICAgIGNvbnN0IHVuaXRNcyA9IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQhKSA/PyBEVVJBVElPTl9VTklUX01TLmdldCh1bml0IS5yZXBsYWNlKC9zJC8sIFwiXCIpKTtcbiAgICBpZiAodW5pdE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gICAgfVxuICAgIHRvdGFsICs9IHNpZ24gKiBOdW1iZXIoYW1vdW50ISkgKiB1bml0TXM7XG4gIH1cbiAgcmV0dXJuIG5lZ2F0ZSA/IC10b3RhbCA6IHRvdGFsO1xufVxuXG4vKipcbiAqIEEgZGF0ZSByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93IChgZGF0ZSAtIG5vd2ApLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gYW5kIHtAbGluayB0b0RhdGV9IGludmVyc2VzIG9mIGVhY2ggb3RoZXIuIFJlY3Vyc2VzIHdpdGhcbiAqIGR1cmF0aW9uIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kIGZvcnRoXG4gKiBmb3JldmVyLlxuICovXG5mdW5jdGlvbiBkYXRlQXNEdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7XG4gIHJldHVybiBkYXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZGF0ZS1pc2ggdmFsdWUgdG8gYSByZWFsIGBEYXRlYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuIEFjY2VwdHMsIGluIHRoaXMgb3JkZXI6XG4gKlxuICogICAtIGEgYERhdGVgIChwYXNzZWQgdGhyb3VnaDsgYW4gaW52YWxpZCBvbmUgaXMgYSBtaXNzKTtcbiAqICAgLSBhbiBlcG9jaCBOVU1CRVIgb3IgbnVtZXJpYyBzdHJpbmcsIGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIChzZWVcbiAqICAgICB7QGxpbmsgU0VDT05EU19DRUlMSU5HfSk7XG4gKiAgIC0gYG5vd2AgKGFuZCBpdHMgYHRvZGF5YCBzcGVsbGluZyksIGZvciB0aGUgY3VycmVudCBpbnN0YW50O1xuICogICAtIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24sIHJlc29sdmVkIFJFTEFUSVZFIFRPIE5PVywgc28gYC03ZGAsXG4gKiAgICAgYDcgZGF5cyBhZ29gLCBhbmQgYGluIDMwIG1pbnV0ZXNgIGFyZSBhbGwgdmFsaWQgaW5zdGFudHM7XG4gKiAgIC0gYW55dGhpbmcgYERhdGUucGFyc2VgIHVuZGVyc3RhbmRzIChgMjAyNi0wOC0wMmAsIGFuIElTTy9VVEMgaW5zdGFudCkuXG4gKlxuICogVGhlIGVwb2NoIHVuaXQgaW5mZXJlbmNlIGlzIHRoZSByZWFzb24gdGhpcyBleGlzdHMgcmF0aGVyIHRoYW5cbiAqIGBuZXcgRGF0ZSh2YWx1ZSlgOiBhIGJhcmUgZXBvY2ggYXJyaXZlcyBhcyBhIFNUUklORyBmcm9tIGFuIGVudiB2YXIgb3IgYSBDTElcbiAqIGZsYWcgYXMgb2Z0ZW4gYXMgaXQgYXJyaXZlcyBhcyBhIG51bWJlciAoYGRhdGUgKyVzYCwgYSBKU09OIGZpZWxkLCBhIGNvcGllZCBsb2dcbiAqIGxpbmUpLCBhbmQgYERhdGUucGFyc2UoXCIxNzg1Njk3ODk5XCIpYCByZWFkcyB0aGF0IGFzIGEgWUVBUiwgc2lsZW50bHkgbGFuZGluZ1xuICogMS43IGJpbGxpb24geWVhcnMgb3V0LiBOdW1lcmljIHN0cmluZ3MgYXJlIHRoZXJlZm9yZSByb3V0ZWQgdG8gdGhlIGVwb2NoIHBhdGgsXG4gKiBuZXZlciB0byBgRGF0ZS5wYXJzZWAuXG4gKlxuICogVGhlIGR1cmF0aW9uIGZhbGxiYWNrIHJ1bnMgTEFTVCwgYWZ0ZXIgYERhdGUucGFyc2VgLCBzbyBhIHJlYWwgZGF0ZSBpcyBuZXZlclxuICogbWlzdGFrZW4gZm9yIGFuIG9mZnNldC4gYG9wdGlvbnMucGFyc2VEdXJhdGlvbjogZmFsc2VgIHJlbW92ZXMgaXQgZW50aXJlbHkgd2hlblxuICogdGhlIHZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgaW5zdGFudCAtIHNlZSB7QGxpbmsgVG9EYXRlT3B0aW9uc30uXG4gKlxuICogTGlrZSB7QGxpbmsgdG9Cb29sZWFufSB0aGlzIE5FVkVSIHRocm93cyBhbmQgcmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHVuaW50ZXJwcmV0YWJsZSwgc28gYSBjYWxsZXIgZGVjaWRlcyB3aGV0aGVyIGEgYmFkIHZhbHVlIGlzIGZhdGFsLCBhIHdhcm5pbmcsXG4gKiBvciBhIGZhbGxiYWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0RhdGUoXCJub3dcIik7ICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW50XG4gKiB0b0RhdGUoXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgLy8gMjAyNi0wOC0wMlQwMDowMDowMC4wMDBaXG4gKiB0b0RhdGUoXCIxNzg1Njk3ODk5XCIpOyAgICAgICAgLy8gc2Vjb25kcyAtPiAyMDI2LTA4LTAyVC4uLlxuICogdG9EYXRlKDE3ODU2OTc4OTkwMDApOyAgICAgICAvLyBtaWxsaXMgIC0+IHRoZSBzYW1lIGluc3RhbnRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIpOyAgICAgICAvLyBub3cgLSAzMGRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0RhdGVPcHRpb25zID0ge30pOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXBvY2hNcyA9IHRvRXBvY2hNcyh2YWx1ZSk7XG4gIGlmIChlcG9jaE1zICE9PSB1bmRlZmluZWQpIHJldHVybiBmcm9tTXMoZXBvY2hNcyk7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXh0ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0ID09PSBcIm5vd1wiIHx8IHRleHQgPT09IFwidG9kYXlcIikgcmV0dXJuIG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSByZXR1cm4gbmV3IERhdGUocGFyc2VkKTtcblxuICBpZiAob3B0aW9ucy5wYXJzZUR1cmF0aW9uID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gUmVjdXJzZXMgd2l0aCBkYXRlIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kXG4gIC8vIGZvcnRoIGZvcmV2ZXIuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSwgeyBwYXJzZURhdGU6IGZhbHNlIH0pO1xuICByZXR1cm4gb2Zmc2V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZyb21NcyhEYXRlLm5vdygpICsgb2Zmc2V0TXMpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKlxuICogRXBvY2ggbWlsbGlzZWNvbmRzIGZvciBhIG51bWVyaWMgdmFsdWUvc3RyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBvbmUsXG4gKiBhcHBseWluZyB0aGUgc2Vjb25kcy12cy1taWxsaXMgaW5mZXJlbmNlIGF0IHtAbGluayBTRUNPTkRTX0NFSUxJTkd9LlxuICovXG5mdW5jdGlvbiB0b0Vwb2NoTXModmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBudW1lcmljID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguYWJzKG51bWVyaWMpIDwgU0VDT05EU19DRUlMSU5HID8gbnVtZXJpYyAqIDEwMDAgOiBudW1lcmljO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcC1lcXVhbGl0eSB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBjb21wYXJhdG9yLlxuICpcbiAqIHtAbGluayBkZWVwRXF1YWx9IG1pcnJvcnMgdGhlIHNlbWFudGljcyBvZiB0aGUgYGZhc3QtZGVlcC1lcXVhbGBcbiAqIHBhY2thZ2UgKGhhbmRsZWQ6IG5lc3RlZCBwbGFpbiBvYmplY3RzL2FycmF5cywgYE1hcGAsIGBTZXRgLCBgRGF0ZWAsXG4gKiBgUmVnRXhwYCwgdHlwZWQgYXJyYXlzLCBgTmFOYCwgYW5kIGArMGAvYC0wYCB0cmVhdGVkIGFzIGVxdWFsKSBidXQgaXNcbiAqIGRlcGVuZGVuY3ktZnJlZSBzbyBgQGRieC10b29scy9zaGFyZWQtY29yZWAga2VlcHMgbm8gcnVudGltZSBkZXBzLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgY29tcGFyYXRvcmAgc2hvcnQtY2lyY3VpdHMgdGhlIHN0cnVjdHVyYWwgd2FsayBhdCBhbnlcbiAqIG5vZGU6IHJldHVybiBgdHJ1ZWAvYGZhbHNlYCB0byBmb3JjZSB0aGUgcmVzdWx0IGZvciB0aGF0IHBhaXIsIG9yXG4gKiBgdW5kZWZpbmVkYCB0byBkZWZlciB0byB0aGUgYnVpbHQtaW4gY29tcGFyaXNvbi4gSXQgaXMgaW52b2tlZCBmb3IgdGhlXG4gKiByb290IHBhaXIgYW5kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIG5lc3RlZCBwYWlyLCBzbyBhIGNhbGxlciBjYW4sIGUuZy4sXG4gKiBjb21wYXJlIHR3byBkb21haW4gb2JqZWN0cyBieSBpZCB3aGlsZSBsZXR0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBmYWxsXG4gKiBiYWNrIHRvIHN0cnVjdHVyYWwgZXF1YWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKFsxLCAyXSwgWzEsIDJdKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKGEsIGIsICh4LCB5KSA9PlxuICogICBpc0VudGl0eSh4KSAmJiBpc0VudGl0eSh5KSA/IHguaWQgPT09IHkuaWQgOiB1bmRlZmluZWQpO1xuICovXG5leHBvcnQgdHlwZSBEZWVwRXF1YWxDb21wYXJhdG9yID0gKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbi8qKiBDb21wYXJlIG5lc3RlZCB2YWx1ZXMgc3RydWN0dXJhbGx5IHdpdGggYW4gb3B0aW9uYWwgcmVjdXJzaXZlIG92ZXJyaWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
@@ -79,6 +79,8 @@ export declare function toSlug(...values: unknown[]): string;
79
79
  * cheap `??` / `if (x)` cascade.
80
80
  */
81
81
  export declare function trimToNull(value: unknown): string | null;
82
+ /** Trim `value` and return `undefined` when no non-empty string remains. */
83
+ export declare function trimToUndefined(value: unknown): string | undefined;
82
84
  /**
83
85
  * Normalize a config list that may arrive as an array or as a single
84
86
  * comma/whitespace-separated string: split, apply `transform`, drop empties,
@@ -167,6 +167,10 @@ export function trimToNull(value) {
167
167
  const trimmed = value.trim();
168
168
  return trimmed ? trimmed : null;
169
169
  }
170
+ /** Trim `value` and return `undefined` when no non-empty string remains. */
171
+ export function trimToUndefined(value) {
172
+ return trimToNull(value) ?? undefined;
173
+ }
170
174
  // Config lists arrive either already split (an array) or as one env-var string
171
175
  // with entries separated by commas and/or whitespace.
172
176
  const LIST_SEPARATOR_REGEXP = /[\s,]+/;
@@ -521,4 +525,4 @@ export function toLabel(value, options) {
521
525
  export function capitalize(value) {
522
526
  return value ? value.charAt(0).toUpperCase() + value.slice(1) : value;
523
527
  }
524
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlEL0MsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsaURBQWlELENBQUM7QUFDckYsTUFBTSxnQ0FBZ0MsR0FBRyxlQUFlLENBQUM7QUFDekQsTUFBTSxrQkFBa0IsR0FBNEQ7SUFDbEYsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsNkVBQTZFO0lBQzdFLCtEQUErRDtJQUMvRCxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUM7QUFDRixNQUFNLFVBQVUsR0FBRyxvREFBb0QsQ0FBQztBQUN4RSxNQUFNLFlBQVksR0FBRywwRUFBMEUsQ0FBQztBQUVoRyxNQUFNLGlCQUFpQixH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TyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhLEVBQUUsT0FBeUI7SUFDOUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBzdHJpbmcgdG9vbGtpdDogdG9rZW5pemF0aW9uLCBpZGVudGlmaWVyIC8gc2x1Z1xuICogZ2VuZXJhdGlvbiAod2l0aCBoYXNoLXN1ZmZpeCBjb2xsaXNpb24gcmVzaXN0YW5jZSksIEhUTUwgZXNjYXBpbmcsXG4gKiBoZWFkZXItdmFsdWUgdHJpbW1pbmcsIGFuZCBhIG5lc3RlZCBkZXNjcmlwdGlvbi10cmVlIHJlbmRlcmVyIGZvclxuICogbG9uZy1mb3JtIExMTSBwcm9tcHQgLyB0b29sLWRlc2NyaXB0aW9uIHRleHQuIERlcGVuZHMgb25seSBvbiB0aGVcbiAqIGxvY2FsIHtAbGluayBmbnZIYXNoV2l0aE9wdGlvbnN9IGZvciBkZXRlcm1pbmlzdGljIGhhc2ggc3VmZml4ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBmbnZIYXNoV2l0aE9wdGlvbnMgfSBmcm9tIFwiLi9oYXNoLnRzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB7QGxpbmsgdG9rZW5pemVXaXRoT3B0aW9uc30uIEFsbCBkZWZhdWx0IG9mZiBleGNlcHRcbiAqIGBjYW1lbENhc2VgLlxuICpcbiAqIC0gYGRpc3RpbmN0YCAtIGRyb3AgZHVwbGljYXRlIHRva2VucyAoZmlyc3Qgb2NjdXJyZW5jZSB3aW5zKS5cbiAqIC0gYGxvd2VyQ2FzZWAgLSBsb3dlcmNhc2UgZXZlcnkgdG9rZW4uXG4gKiAtIGBjYXBpdGFsaXplYCAtIHVwcGVyLWNhc2UgZWFjaCB0b2tlbidzIGZpcnN0IGxldHRlciAodGhlblxuICogICB7QGxpbmsgVE9LRU5JWkVfT1ZFUlJJREVTfSBmaXggdXAgYGFpYCAtPiBgQUlgLCBgZnNgIC0+IGBGU2AsIGFuZFxuICogICBgdjJgIC0+IGBWMmApLlxuICogLSBgb21pdFVyaVNjaGVtZWAgLSBzdHJpcCBhIGxlYWRpbmcgYHNjaGVtZTovL2AgYmVmb3JlIHRva2VuaXppbmcuXG4gKiAtIGBvbWl0RW1haWxEb21haW5gIC0ga2VlcCBvbmx5IHRoZSBsb2NhbCBwYXJ0IG9mIGFuIGVtYWlsLlxuICogLSBgY2FtZWxDYXNlYCAtIHNwbGl0IG9uIGNhbWVsQ2FzZSBib3VuZGFyaWVzIC8gZGlnaXQgcnVucyAvIGFjcm9ueW1zXG4gKiAgIChkZWZhdWx0IGB0cnVlYCk7IHdoZW4gYGZhbHNlYCwgc3BsaXQgb25seSBvbiBub24tYWxwaGFudW1lcmljcy5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW5pemVPcHRpb25zID0ge1xuICBkaXN0aW5jdD86IGJvb2xlYW47XG4gIGxvd2VyQ2FzZT86IGJvb2xlYW47XG4gIGNhcGl0YWxpemU/OiBib29sZWFuO1xuICBvbWl0VXJpU2NoZW1lPzogYm9vbGVhbjtcbiAgb21pdEVtYWlsRG9tYWluPzogYm9vbGVhbjtcbiAgY2FtZWxDYXNlPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogVG9rZW5pemF0aW9uIGFuZCBvdmVyZmxvdyBjb250cm9scyBmb3IgbG93ZXJjYXNlIGtleXMgYW5kIHNsdWdzLiBUaGUgZGVmYXVsdFxuICogbGVuZ3RoIGlzIHVubGltaXRlZDsgb3ZlcmZsb3cgdXNlcyBhIHNpeC1jaGFyYWN0ZXIgaGFzaCB1bmxlc3Mgb3ZlcnJpZGRlbi5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5T3B0aW9ucyA9IE9taXQ8VG9rZW5pemVPcHRpb25zLCBcImxvd2VyQ2FzZVwiIHwgXCJjYXBpdGFsaXplXCI+ICYge1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIHRydW5jYXRlU3RyYXRlZ3k/OiBcImhhc2hcIiB8IFwidHJpbVwiIHwgXCJlbXB0eVwiO1xuICB0cnVuY2F0ZUhhc2hMZW5ndGg/OiBudW1iZXI7XG59O1xuXG4vKioge0BsaW5rIEtleU9wdGlvbnN9IHBsdXMgdGhlIHRva2VuIGRlbGltaXRlciB1c2VkIGJ5IGlkZW50aWZpZXIgZ2VuZXJhdGlvbi4gKi9cbmV4cG9ydCB0eXBlIElkZW50aWZpZXJPcHRpb25zID0gS2V5T3B0aW9ucyAmIHtcbiAgZGVsaW1pdGVyPzogc3RyaW5nO1xufTtcblxuLyoqIExlYWRpbmcgYW5kIHRyYWlsaW5nIGJsYW5rLWxpbmUgaGFuZGxpbmcgZm9yIHtAbGluayBkZWRlbnR9LiAqL1xuZXhwb3J0IHR5cGUgRGVkZW50T3B0aW9ucyA9IHtcbiAgLyoqIFJlbW92ZSBsZWFkaW5nIGJsYW5rIGxpbmVzIGFmdGVyIGluZGVudGF0aW9uIG5vcm1hbGl6YXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgdHJpbVN0YXJ0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlbW92ZSB0cmFpbGluZyBibGFuayBsaW5lcyBhZnRlciBpbmRlbnRhdGlvbiBub3JtYWxpemF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICB0cmltRW5kPzogYm9vbGVhbjtcbiAgLyoqIFJlbW92ZSBzcGFjZXMgYW5kIHRhYnMgZnJvbSBlYWNoIGxpbmUgZW5kLiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIHRyaW1MaW5lRW5kPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSBSZXF1aXJlZDxUb2tlbml6ZU9wdGlvbnM+O1xudHlwZSBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0gUmVxdWlyZWQ8XG4gIElkZW50aWZpZXJPcHRpb25zICYgUGljazxUb2tlbml6ZU9wdGlvbnMsIFwibG93ZXJDYXNlXCIgfCBcImNhcGl0YWxpemVcIj5cbj47XG5cbi8vIEEgbGVhZGluZyBgdmAvYFZgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGRpZ2l0cyAoYSB2ZXJzaW9uIG1hcmtlciBsaWtlXG4vLyBgdjJgKSBpcyBrZXB0IGFzIE9ORSB0b2tlbiBpbnN0ZWFkIG9mIHNwbGl0dGluZyBpbnRvIGB2YCArIGAyYDsgaXQgbGVhZHMgdGhlXG4vLyBhbHRlcm5hdGlvbiBzbyBpdCB3aW5zIG92ZXIgdGhlIGdlbmVyaWMgbGV0dGVyIC8gZGlnaXQgcnVucy4gRXZlcnl0aGluZyBlbHNlXG4vLyBpcyB0aGUgdXN1YWwgY2FtZWxDYXNlIHdvcmQgLyBudW1iZXIgLyBhbGwtY2Fwcy1hY3JvbnltIHNwbGl0LlxuY29uc3QgVE9LRU5JWkVfQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvW3ZWXVswLTldK3xbQS1aXT9bYS16XSt8WzAtOV0rfFtBLVpdKyg/IVthLXpdKS9nO1xuY29uc3QgVE9LRU5JWkVfTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFAgPSAvW2EtekEtWjAtOV0rL2c7XG5jb25zdCBUT0tFTklaRV9PVkVSUklERVM6ICgodG9rZW46IHN0cmluZywgb3B0aW9uczogVG9rZW5pemVPcHRpb25zKSA9PiBzdHJpbmcpW10gPSBbXG4gICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgIGlmICghb3B0aW9ucy5jYXBpdGFsaXplKSByZXR1cm4gdG9rZW47XG4gICAgY29uc3QgbG93ZXIgPSB0b2tlbi50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlciA9PT0gXCJhaVwiKSByZXR1cm4gXCJBSVwiO1xuICAgIGlmIChsb3dlciA9PT0gXCJmc1wiKSByZXR1cm4gXCJGU1wiO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfSxcbiAgLy8gVmVyc2lvbiBtYXJrZXIgYHYyYCAtPiBgVjJgIHdoZW4gY2FwaXRhbGl6aW5nICh0aGUgbGVhZGluZyBgdmAgdXBwZXJjYXNlcyxcbiAgLy8gdGhlIGRpZ2l0cyBzdGF5KSwgc28gaXQgcmVhZHMgYXMgb25lIHVuaXQgcmF0aGVyIHRoYW4gXCJWIDJcIi5cbiAgKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuY2FwaXRhbGl6ZSAmJiAvXnZbMC05XSskLy50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIGBWJHt0b2tlbi5zbGljZSgxKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG4gIH0sXG5dO1xuY29uc3QgVVJJX1JFR0VYUCA9IC9eKFthLXpBLVpdW2EtekEtWjAtOSsuLV0qKT86XFwvXFwvKFteXFxzLz8jXVteXFxzXSopPyQvO1xuY29uc3QgRU1BSUxfUkVHRVhQID0gL14oW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSspQChbYS16QS1aMC05LV0rKD86XFwuW2EtekEtWjAtOS1dKykrKSQvO1xuXG5jb25zdCBUT0tFTklaRV9ERUZBVUxUUzogUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSB7XG4gIGRpc3RpbmN0OiBmYWxzZSxcbiAgbG93ZXJDYXNlOiBmYWxzZSxcbiAgY2FwaXRhbGl6ZTogZmFsc2UsXG4gIG9taXRVcmlTY2hlbWU6IGZhbHNlLFxuICBvbWl0RW1haWxEb21haW46IGZhbHNlLFxuICBjYW1lbENhc2U6IHRydWUsXG59O1xuXG5jb25zdCBJREVOVElGSUVSX0RFRkFVTFRTOiBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0ge1xuICAuLi5UT0tFTklaRV9ERUZBVUxUUyxcbiAgbG93ZXJDYXNlOiB0cnVlLFxuICBtYXhMZW5ndGg6IEluZmluaXR5LFxuICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgdHJ1bmNhdGVIYXNoTGVuZ3RoOiA2LFxuICBkZWxpbWl0ZXI6IFwiLVwiLFxufTtcblxuLyoqIFlpZWxkIG5vcm1hbGl6ZWQgdG9rZW5zIHVzaW5nIGV4cGxpY2l0IGNhc2luZywgVVJJLCBlbWFpbCwgYW5kIGRlZHVwbGljYXRpb24gcnVsZXMuICovXG5leHBvcnQgZnVuY3Rpb24qIHRva2VuaXplV2l0aE9wdGlvbnMoXG4gIG9wdGlvbnM6IFRva2VuaXplT3B0aW9ucyxcbiAgLi4udmFsdWVzOiB1bmtub3duW11cbik6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3Qgb3B0czogUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSB7IC4uLlRPS0VOSVpFX0RFRkFVTFRTLCAuLi5vcHRpb25zIH07XG4gIGNvbnN0IHNlZW4gPSBvcHRzLmRpc3RpbmN0ID8gbmV3IFNldDxzdHJpbmc+KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlZ2V4cCA9IG9wdHMuY2FtZWxDYXNlID8gVE9LRU5JWkVfQ0FNRUxfQ0FTRV9SRUdFWFAgOiBUT0tFTklaRV9OT05fQUxQSEFOVU1FUklDX1JFR0VYUDtcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICBsZXQgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgaWYgKCFzdHJpbmdWYWx1ZSkgY29udGludWU7XG4gICAgaWYgKG9wdHMub21pdFVyaVNjaGVtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzdHJpbmdWYWx1ZS5tYXRjaChVUklfUkVHRVhQKTtcbiAgICAgIGlmIChtYXRjaCkgc3RyaW5nVmFsdWUgPSBtYXRjaFsyXSA/PyBcIlwiO1xuICAgIH1cbiAgICBpZiAob3B0cy5vbWl0RW1haWxEb21haW4pIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nVmFsdWUubWF0Y2goRU1BSUxfUkVHRVhQKTtcbiAgICAgIGlmIChtYXRjaCkgc3RyaW5nVmFsdWUgPSBtYXRjaFsxXSA/PyBcIlwiO1xuICAgIH1cbiAgICBpZiAoIXN0cmluZ1ZhbHVlKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHRva2VuTWF0Y2ggb2Ygc3RyaW5nVmFsdWUubWF0Y2hBbGwocmVnZXhwKSkge1xuICAgICAgbGV0IHRva2VuID0gdG9rZW5NYXRjaFswXSE7XG4gICAgICBpZiAob3B0cy5sb3dlckNhc2UpIHRva2VuID0gdG9rZW4udG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChvcHRzLmNhcGl0YWxpemUpIHRva2VuID0gY2FwaXRhbGl6ZSh0b2tlbik7XG4gICAgICBpZiAoIXRva2VuKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2YgVE9LRU5JWkVfT1ZFUlJJREVTKSB7XG4gICAgICAgIHRva2VuID0gb3ZlcnJpZGUodG9rZW4sIG9wdHMpO1xuICAgICAgICBpZiAoIXRva2VuKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICghdG9rZW4gfHwgc2Vlbj8uaGFzKHRva2VuKSkgY29udGludWU7XG4gICAgICBzZWVuPy5hZGQodG9rZW4pO1xuICAgICAgeWllbGQgdG9rZW47XG4gICAgfVxuICB9XG59XG5cbi8qKiBZaWVsZCBub3JtYWxpemVkIHRva2VucyB1c2luZyB0aGUgZGVmYXVsdCB0b2tlbml6YXRpb24gcnVsZXMuICovXG5leHBvcnQgZnVuY3Rpb24qIHRva2VuaXplKC4uLnZhbHVlczogdW5rbm93bltdKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICB5aWVsZCogdG9rZW5pemVXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBKb2luIHRva2VuaXplZCB2YWx1ZXMgd2l0aCBgZGVsaW1pdGVyYC4gV2hlbiB0aGUgbmV4dCB0b2tlbiB3b3VsZCBwdXNoIHRoZVxuICogcmVzdWx0IG92ZXIgYG1heExlbmd0aGA6IGB0cmltYCBzdG9wcyBhZGRpbmc7IGBlbXB0eWAgcmV0dXJucyBgXCJcImA7IGBoYXNoYFxuICogYXBwZW5kcyBhIGRpZ2VzdCBvZiBhY2NlcHRlZCB0b2tlbnMgcGx1cyB0aGUgb3ZlcmZsb3cgdG9rZW4gaWYgdGhlIHJlc3VsdFxuICogc3RpbGwgZml0cywgb3RoZXJ3aXNlIGBcIlwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSWRlbnRpZmllcldpdGhPcHRpb25zKG9wdGlvbnM6IElkZW50aWZpZXJPcHRpb25zLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdHM6IFJlc29sdmVkSWRlbnRpZmllck9wdGlvbnMgPSB7XG4gICAgLi4uSURFTlRJRklFUl9ERUZBVUxUUyxcbiAgICAuLi5vcHRpb25zLFxuICAgIGxvd2VyQ2FzZTogdHJ1ZSxcbiAgfTtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbml6ZVdpdGhPcHRpb25zKG9wdHMsIC4uLnZhbHVlcykpIHtcbiAgICBjb25zdCBzZXBMZW5ndGggPSB0b2tlbnMubGVuZ3RoID4gMCA/IG9wdHMuZGVsaW1pdGVyLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IGN1cnJlbnRMZW5ndGggKyBzZXBMZW5ndGggKyB0b2tlbi5sZW5ndGg7XG5cbiAgICBpZiAobmV4dExlbmd0aCA+IG9wdHMubWF4TGVuZ3RoKSB7XG4gICAgICBpZiAob3B0cy50cnVuY2F0ZVN0cmF0ZWd5ID09PSBcImVtcHR5XCIpIHJldHVybiBcIlwiO1xuICAgICAgaWYgKG9wdHMudHJ1bmNhdGVTdHJhdGVneSA9PT0gXCJ0cmltXCIpIGJyZWFrO1xuXG4gICAgICBjb25zdCBoYXNoID0gZGlnZXN0VG9rZW5zKG9wdHMudHJ1bmNhdGVIYXNoTGVuZ3RoLCB0b2tlbnMsIHRva2VuKTtcbiAgICAgIGlmIChjdXJyZW50TGVuZ3RoICsgc2VwTGVuZ3RoICsgaGFzaC5sZW5ndGggPD0gb3B0cy5tYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRva2Vucy5sZW5ndGggPiAwID8gdG9rZW5zLmpvaW4ob3B0cy5kZWxpbWl0ZXIpICsgb3B0cy5kZWxpbWl0ZXIgKyBoYXNoIDogaGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICBjdXJyZW50TGVuZ3RoID0gbmV4dExlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnMuam9pbihvcHRzLmRlbGltaXRlcik7XG59XG5cbi8qKiBDb252ZXJ0IGFyYml0cmFyeSB2YWx1ZXMgaW50byBhIG5vcm1hbGl6ZWQgY2FtZWwtY2FzZSBpZGVudGlmaWVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSWRlbnRpZmllciguLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBTbHVnaWZpZWQgaWRlbnRpZmllcjogc2FtZSBydWxlcyBhcyB7QGxpbmsgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnN9IHdpdGggdGhlXG4gKiBkZWxpbWl0ZXIgZm9yY2VkIHRvIGAtYC4gQWNjZXB0cyB7QGxpbmsgS2V5T3B0aW9uc30gc28gY2FsbGVycyBjYW5ub3RcbiAqIG92ZXJyaWRlIHRoZSBkZWxpbWl0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NsdWdXaXRoT3B0aW9ucyhvcHRpb25zOiBLZXlPcHRpb25zLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IC4uLm9wdGlvbnMsIGRlbGltaXRlcjogXCItXCIgfSwgLi4udmFsdWVzKTtcbn1cblxuLyoqIENvbnZlcnQgYXJiaXRyYXJ5IHZhbHVlcyBpbnRvIGEgbm9ybWFsaXplZCBoeXBoZW4tZGVsaW1pdGVkIHNsdWcuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbHVnKC4uLnZhbHVlczogdW5rbm93bltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvU2x1Z1dpdGhPcHRpb25zKHt9LCAuLi52YWx1ZXMpO1xufVxuXG4vKipcbiAqIFRyaW0gYHZhbHVlYCBhbmQgcmV0dXJuIGBudWxsYCBmb3Igbm9uLXN0cmluZ3MsIGB1bmRlZmluZWRgLCBvclxuICogc3RyaW5ncyB0aGF0IGFyZSBlbXB0eSBhZnRlciB0cmltbWluZy4gTGV0cyBjYWxsIHNpdGVzIGNvbGxhcHNlIHRoZVxuICogY29tbW9uXG4gKlxuICogYGBgdHNcbiAqIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiICYmIHYudHJpbSgpID8gdi50cmltKCkgOiBudWxsXG4gKiBgYGBcbiAqXG4gKiBkYW5jZSBpbnRvIGEgc2luZ2xlIGhlbHBlci4gVXNlZnVsIGZvciBIVFRQIGhlYWRlciAvIHF1ZXJ5IC8gZm9ybVxuICogZXh0cmFjdG9ycyB3aGVyZSBkb3duc3RyZWFtIGNvZGUgd2FudHMgYHN0cmluZyB8IG51bGxgIHRvIGRyaXZlIGFcbiAqIGNoZWFwIGA/P2AgLyBgaWYgKHgpYCBjYXNjYWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVRvTnVsbCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWQgPyB0cmltbWVkIDogbnVsbDtcbn1cblxuLy8gQ29uZmlnIGxpc3RzIGFycml2ZSBlaXRoZXIgYWxyZWFkeSBzcGxpdCAoYW4gYXJyYXkpIG9yIGFzIG9uZSBlbnYtdmFyIHN0cmluZ1xuLy8gd2l0aCBlbnRyaWVzIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kL29yIHdoaXRlc3BhY2UuXG5jb25zdCBMSVNUX1NFUEFSQVRPUl9SRUdFWFAgPSAvW1xccyxdKy87XG5cbi8qKlxuICogTm9ybWFsaXplIGEgY29uZmlnIGxpc3QgdGhhdCBtYXkgYXJyaXZlIGFzIGFuIGFycmF5IG9yIGFzIGEgc2luZ2xlXG4gKiBjb21tYS93aGl0ZXNwYWNlLXNlcGFyYXRlZCBzdHJpbmc6IHNwbGl0LCBhcHBseSBgdHJhbnNmb3JtYCwgZHJvcCBlbXB0aWVzLFxuICogYW5kIGRlLWR1cGxpY2F0ZSAoZmlyc3Qgb2NjdXJyZW5jZSB3aW5zKS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaGFwZSBldmVyeSBhbGxvdy1saXN0IC8gZmFsbGJhY2stb3JkZXIgc2V0dGluZyBpbiB0aGlzIHJlcG9cbiAqIHRha2VzLCBiZWNhdXNlIHRoZSBzYW1lIHZhbHVlIGNhbiBjb21lIGZyb20gdHlwZWQgY29uZmlnIChgc3RyaW5nW11gKSBvciBmcm9tXG4gKiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYFwiYSwgYiBjXCJgKS4gUGFzcyBgdHJhbnNmb3JtYCB0byBub3JtYWxpemUgZW50cmllc1xuICogYXMgdGhleSBhcmUgcmVhZDsgaXQgZGVmYXVsdHMgdG8gdHJpbW1pbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlTGlzdChcImRvY3MuZXhhbXBsZS5jb20sICouZGF0YWJyaWNrcy5jb21cIik7XG4gKiBwYXJzZUxpc3QocHJvY2Vzcy5lbnYuTU9ERUxfRkFMTEJBQ0tTKTtcbiAqIHBhcnNlTGlzdChyYXcsIG5vcm1hbGl6ZVVybFBhdHRlcm4pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0KFxuICByYXc6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgdHJhbnNmb3JtOiAoZW50cnk6IHN0cmluZykgPT4gc3RyaW5nID0gKGVudHJ5KSA9PiBlbnRyeS50cmltKCksXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudHJpZXMgPVxuICAgIHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIgPyByYXcuc3BsaXQoTElTVF9TRVBBUkFUT1JfUkVHRVhQKSA6IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IFtdO1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRyYW5zZm9ybShlbnRyeSk7XG4gICAgaWYgKCFub3JtYWxpemVkIHx8IHNlZW4uaGFzKG5vcm1hbGl6ZWQpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChub3JtYWxpemVkKTtcbiAgICBvdXQucHVzaChub3JtYWxpemVkKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIHtAbGluayB0cmltVG9OdWxsfSB3aXRoIGFuIGVtcHR5LXN0cmluZyBtaXNzIGluc3RlYWQgb2YgYG51bGxgLCBmb3IgY2FsbGVyc1xuICogdGhhdCBidWlsZCBhIHN0cmluZyB1bmNvbmRpdGlvbmFsbHkgYW5kIHRyZWF0IFwiYWJzZW50XCIgYXMgXCJcIi5cbiAqXG4gKiBSZWFkaW5nIGxvb3NlbHktdHlwZWQgSlNPTiBpcyB0aGUgbW90aXZhdGluZyBjYXNlOiBhIGZpZWxkIHRoYXQgc2hvdWxkIGJlIGFcbiAqIHN0cmluZyBtYXkgYmUgbWlzc2luZyBvciB0aGUgd3JvbmcgdHlwZSwgYW5kIHRoZSBjYWxsZXIgd2FudHMgYFwiXCJgIHJhdGhlclxuICogdGhhbiBhIG51bGwgY2hlY2sgYXQgZXZlcnkgYWNjZXNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0aXRsZSA9IHRyaW1Ub0VtcHR5KHJlY29yZC50aXRsZSk7IC8vIGFsd2F5cyBhIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVRvRW1wdHkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gdHJpbVRvTnVsbCh2YWx1ZSkgPz8gXCJcIjtcbn1cblxuLyoqXG4gKiBUcmltIHRoZSBmaXJzdCB1c2FibGUgc3RyaW5nIG91dCBvZiBgdmFsdWVgLiBSZXR1cm5zIGBudWxsYCB3aGVuXG4gKiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBgbnVsbGAsIGFuIGVtcHR5IHN0cmluZywgb3IgYW4gYXJyYXkgd2hvc2VcbiAqIGZpcnN0IHN0cmluZyBtZW1iZXIgaXMgZW1wdHkuIE1pcnJvcnMgaG93IEV4cHJlc3MgLyBOb2RlIGhlYWRlclxuICogYWNjZXNzb3JzIGV4cG9zZSBzaW5nbGUgdnMuIHJlcGVhdGVkIGhlYWRlcnMgLSB0aGUgZmlyc3RcbiAqIG5vbi1lbXB0eSBlbnRyeSB3aW5zLCBldmVyeXRoaW5nIGVsc2UgaXMgaWdub3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0Tm9uRW1wdHkodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gdHJpbVRvTnVsbChpdGVtKTtcbiAgICAgIGlmICh0cmltbWVkKSByZXR1cm4gdHJpbW1lZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHRyaW1Ub051bGwodmFsdWUpO1xufVxuXG4vKipcbiAqIEVzY2FwZSB0aGUgZml2ZSBjaGFyYWN0ZXJzIHNpZ25pZmljYW50IGluIEhUTUwgdGV4dCBhbmRcbiAqIGRvdWJsZS1xdW90ZWQgYXR0cmlidXRlIHZhbHVlcyAoYCZgLCBgPGAsIGA+YCwgYFwiYCwgYCdgKSBzbyBhblxuICogdW50cnVzdGVkIHN0cmluZyBjYW4gYmUgaW50ZXJwb2xhdGVkIGludG8gbWFya3VwIHdpdGhvdXQgYnJlYWtpbmdcbiAqIG91dCBvZiBpdHMgY29udGV4dC4gYCZgIGlzIHJlcGxhY2VkIGZpcnN0IHNvIGFtcGVyc2FuZHMgaW50cm9kdWNlZFxuICogYnkgdGhlIGxhdGVyIHJlcGxhY2VtZW50cyBhcmVuJ3QgZG91YmxlLWVzY2FwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWVcbiAgICAucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG4gICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG4gICAgLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpXG4gICAgLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpXG4gICAgLnJlcGxhY2UoLycvZywgXCImIzM5O1wiKTtcbn1cblxuLyoqXG4gKiBTbHVnaWZ5IGB2YWx1ZWAgKHVzaW5nIHRoZSBzdGFuZGFyZCB7QGxpbmsgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnN9XG4gKiB0b2tlbml6ZXIgKyBkZWxpbWl0ZXIgcnVsZXMpIGFuZCAqKmFsd2F5cyoqIHN1ZmZpeCBhIHNob3J0XG4gKiBkZXRlcm1pbmlzdGljIGhhc2guIFVzZSB3aGVuIHlvdSBuZWVkIGEgc3RhYmxlLCBzbHVnaWZpZWQgaWQgdGhhdFxuICogaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYWNyb3NzIGRlc2NyaXB0aW9ucyBzaGFyaW5nIHRoZSBzYW1lXG4gKiBsZWFkaW5nIHRva2VucyAodG9vbCBpZHMsIGNhY2hlIGtleXMsIGV0Yy4pLlxuICpcbiAqIEJlaGF2aW91ciBkaWZmZXJzIGZyb20gYHRvSWRlbnRpZmllcldpdGhPcHRpb25zKHsgbWF4TGVuZ3RoLFxuICogdHJ1bmNhdGVTdHJhdGVneTogXCJoYXNoXCIgfSlgOiB0aGF0IGhlbHBlciBvbmx5IGFwcGVuZHMgYSBoYXNoIHdoZW5cbiAqIHRoZSBzbHVnICpvdmVyZmxvd3MqIGBtYXhMZW5ndGhgLiBUaGlzIGhlbHBlciBhcHBlbmRzIGEgaGFzaFxuICogdW5jb25kaXRpb25hbGx5IHNvIHRoZSByZXN1bHQgaXMgY29sbGlzaW9uLXJlc2lzdGFudCBldmVuIGZvclxuICogc2hvcnQgaW5wdXRzLiBUaGUgaGFzaCBpcyBjb21wdXRlZCBvdmVyIHRoZSByYXcgYHZhbHVlYCBzbyB0d29cbiAqIGRlc2NyaXB0aW9ucyBwcm9kdWNpbmcgdGhlIHNhbWUgc2x1ZyBzdGlsbCBnZXQgZGlmZmVyZW50IGlkcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBTb3VyY2Ugc3RyaW5nICh0eXBpY2FsbHkgYSB0b29sL2FnZW50IGRlc2NyaXB0aW9uKS5cbiAqIEBwYXJhbSBvcHRpb25zLmRlbGltaXRlciAtIFRva2VuIHNlcGFyYXRvciAoZGVmYXVsdCBgXCJfXCJgKS5cbiAqIEBwYXJhbSBvcHRpb25zLnNsdWdNYXhMZW5ndGggLSBDYXAgb24gdGhlIHNsdWcgcG9ydGlvbiAodGhlIHBhcnRcbiAqICAgYmVmb3JlIHRoZSBoYXNoKS4gRGVmYXVsdCAzMi5cbiAqIEBwYXJhbSBvcHRpb25zLmhhc2hMZW5ndGggLSBMZW5ndGggb2YgdGhlIHN1ZmZpeCBwcm9kdWNlZCBieVxuICogICB7QGxpbmsgZm52SGFzaFdpdGhPcHRpb25zfSAoQ3JvY2tmb3JkLXN0eWxlIGJhc2UtMzIgYWxwaGFiZXQsIG1heCA3XG4gKiAgIGNoYXJzKS4gRGVmYXVsdCA2LlxuICogQHBhcmFtIG9wdGlvbnMuZmFsbGJhY2tQcmVmaXggLSBQcmVmaXggdXNlZCB3aGVuIHRoZSBzbHVnIGlzIGVtcHR5XG4gKiAgIChlLmcuIHB1bmN0dWF0aW9uLW9ubHkgaW5wdXQpLiBEZWZhdWx0IGBcImlkXCJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9VbmlxdWVTbHVnKFxuICB2YWx1ZTogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgZGVsaW1pdGVyPzogc3RyaW5nO1xuICAgIHNsdWdNYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgaGFzaExlbmd0aD86IG51bWJlcjtcbiAgICBmYWxsYmFja1ByZWZpeD86IHN0cmluZztcbiAgfSA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGVsaW1pdGVyID0gb3B0aW9ucy5kZWxpbWl0ZXIgPz8gXCJfXCI7XG4gIGNvbnN0IHNsdWdNYXhMZW5ndGggPSBvcHRpb25zLnNsdWdNYXhMZW5ndGggPz8gMzI7XG4gIGNvbnN0IGhhc2hMZW5ndGggPSBvcHRpb25zLmhhc2hMZW5ndGggPz8gNjtcbiAgY29uc3QgZmFsbGJhY2tQcmVmaXggPSBvcHRpb25zLmZhbGxiYWNrUHJlZml4ID8/IFwiaWRcIjtcbiAgY29uc3Qgc2x1ZyA9IHRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgIHsgZGVsaW1pdGVyLCBtYXhMZW5ndGg6IHNsdWdNYXhMZW5ndGgsIHRydW5jYXRlU3RyYXRlZ3k6IFwidHJpbVwiIH0sXG4gICAgdmFsdWUsXG4gICk7XG4gIGNvbnN0IHN1ZmZpeCA9IGZudkhhc2hXaXRoT3B0aW9ucyh7IGxlbmd0aDogaGFzaExlbmd0aCB9LCB2YWx1ZSk7XG4gIHJldHVybiBzbHVnID8gYCR7c2x1Z30ke2RlbGltaXRlcn0ke3N1ZmZpeH1gIDogYCR7ZmFsbGJhY2tQcmVmaXh9JHtkZWxpbWl0ZXJ9JHtzdWZmaXh9YDtcbn1cblxuZnVuY3Rpb24gZGlnZXN0VG9rZW5zKGxlbmd0aDogbnVtYmVyLCBwYXJ0czogcmVhZG9ubHkgc3RyaW5nW10sIGV4dHJhPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGNvbWJpbmVkID0gXCJcIjtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSBjb21iaW5lZCArPSBwYXJ0ICsgXCJcXDBcIjtcbiAgaWYgKGV4dHJhICE9PSB1bmRlZmluZWQpIGNvbWJpbmVkICs9IGV4dHJhICsgXCJcXDBcIjtcbiAgcmV0dXJuIGZudkhhc2hXaXRoT3B0aW9ucyh7IGxlbmd0aCB9LCBjb21iaW5lZCk7XG59XG5cbi8qKlxuICogQSBub2RlIGluIHRoZSBkZXNjcmlwdGlvbiB0cmVlIGNvbnN1bWVkIGJ5IHtAbGluayB0b0Rlc2NyaXB0aW9ufS5cbiAqXG4gKiAtIGBzdHJpbmdgIC0gYSB0ZXh0IHBhcmFncmFwaC5cbiAqIC0gYERlc2NyaXB0aW9uW11gIC0gYSBzZXF1ZW5jZSBvZiBzdGFja2VkIGJsb2NrcyBhdCB0aGUgc2FtZSBsZXZlbFxuICogICAobm8gbGlzdCBtYXJrZXJzKS4gUGxhaW4gdGV4dCBhZGphY2VudCB0byBhIGxpc3QgKGVpdGhlciBkaXJlY3Rpb24pXG4gKiAgIGZsdXNoZXMgdG9nZXRoZXIgc28gdGhlIHByb3NlIHJlYWRzIGFzIGEgbGVhZC1pbiBvciB0cmFpbGluZ1xuICogICBzdW1tYXJ5LiBUd28gdGV4dCBwYXJhZ3JhcGhzLCB0d28gYWRqYWNlbnQgbGlzdHMsIGFuZCBhbnl0aGluZ1xuICogICB0b3VjaGluZyBhIG1hcCBnZXQgYSBibGFuay1saW5lIGJyZWFrLlxuICogLSBgeyBidWxsZXRzOiBbLi4uXSB9YCAvIGB7IG51bWJlcmVkOiBbLi4uXSB9YCAtIGV4cGxpY2l0IGxpc3QuIEFcbiAqICAgbGlzdCBvZiBvbmUgYmFyZSBzdHJpbmcgZHJvcHMgaXRzIG1hcmtlciAoYC1gIC8gYDEuYCk7IGEgbGlzdCBvZlxuICogICBvbmUgaXRlbSB3aXRoIG5lc3RlZCBjaGlsZHJlbiBrZWVwcyBpdHMgbWFya2VyIGFzIHRoZSB2aXN1YWwgYW5jaG9yXG4gKiAgIGZvciB0aGUgaW5kZW50ZWQgY2hpbGRyZW4uXG4gKiAtIGFueSBvdGhlciBvYmplY3QgLSBoZWFkZXJzIG1hcDogZWFjaCBrZXkgYmVjb21lcyBhIGBIZWFkZXI6YCBsaW5lXG4gKiAgIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBhbmQgdGhlIHJlbmRlcmVkIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBEZXNjcmlwdGlvbiA9IHN0cmluZyB8IHJlYWRvbmx5IERlc2NyaXB0aW9uW10gfCB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IERlc2NyaXB0aW9uIH07XG5cbmNvbnN0IExJU1RfS0VZUyA9IFtcImJ1bGxldHNcIiwgXCJudW1iZXJlZFwiXSBhcyBjb25zdDtcbnR5cGUgTGlzdEtpbmQgPSAodHlwZW9mIExJU1RfS0VZUylbbnVtYmVyXTtcblxuLyoqXG4gKiBGb3JtYXQgYSBuZXN0ZWQgZGVzY3JpcHRpb24gdHJlZSBhcyBhIE1hcmtkb3duLWlzaCBzdHJpbmcgc3VpdGFibGVcbiAqIGZvciBhbiBMTE0gc3lzdGVtIHByb21wdCwgWm9kIGAuZGVzY3JpYmUoKWAgYmxvY2ssIE1hc3RyYSB0b29sXG4gKiBkZXNjcmlwdGlvbiwgb3IgYW55IG90aGVyIGxvbmctZm9ybSB0ZXh0IGRlc3RpbmF0aW9uLlxuICpcbiAqIEV2ZXJ5IHN0cmluZyBzZWN0aW9uIGlzIGRlZGVudGVkIChjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlIHN0cmlwcGVkKSxcbiAqIHJpZ2h0LXRyaW1tZWQgbGluZSBieSBsaW5lLCBhbmQgZnJlZWQgb2YgbGVhZGluZyAvIHRyYWlsaW5nIGJsYW5rXG4gKiBsaW5lcywgc28gY2FsbGVycyBjYW4gd3JpdGUgbXVsdGktbGluZSB0ZW1wbGF0ZSBsaXRlcmFscyBpbmRlbnRlZFxuICogbmF0dXJhbGx5IGluIHNvdXJjZSB3aXRob3V0IGxlYWtpbmcgdGhhdCBpbmRlbnRhdGlvbiBpbnRvIHRoZVxuICogY29uc3VtZXItZmFjaW5nIG91dHB1dC4gUGxhaW4tc3RyaW5nIGlucHV0cyBmbG93IHRocm91Z2ggdW5jaGFuZ2VkXG4gKiBhcGFydCBmcm9tIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gcGFzcywgc28gYSBzaW5nbGUgbXVsdGktbGluZVxuICogdGVtcGxhdGUgbGl0ZXJhbCB3b3JrcyBkaXJlY3RseTpcbiAqXG4gKiBgYGB0c1xuICogdG9EZXNjcmlwdGlvbihgXG4gKiAgIEFzayB0aGUgR2VuaWUgc3BhY2UgXCIke2FsaWFzfVwiIGEgcXVlc3Rpb24uXG4gKiAgIFBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzLlxuICogYCk7XG4gKiAvLyBBc2sgdGhlIEdlbmllIHNwYWNlIFwiZGVmYXVsdFwiIGEgcXVlc3Rpb24uXG4gKiAvLyBQYXNzIHRoZSBhbnN3ZXIgdGhyb3VnaCBhcy1pcy5cbiAqXG4gKiB0b0Rlc2NyaXB0aW9uKFtcbiAqICAgYFxuICogICAgIEFzayB0aGUgR2VuaWUgc3BhY2UgYSBxdWVzdGlvbi5cbiAqICAgICBQaHJhc2UgaXQgZnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlLlxuICogICBgLFxuICogICB7IGJ1bGxldHM6IFtcbiAqICAgICBbXCJQYXNzIHRoZSBhbnN3ZXIgdGhyb3VnaCBhcy1pc1wiLCB7IG51bWJlcmVkOiBbXCJpdGVtXCIsIFwiaXRlbVwiXSB9XSxcbiAqICAgXX0sXG4gKiAgIHsgSW5zdHJ1Y3Rpb25zOiBcIlJlcGx5IHdpdGggdGhlIFNRTCBvbmx5LlwiIH0sXG4gKiBdKTtcbiAqIC8vIEFzayB0aGUgR2VuaWUgc3BhY2UgYSBxdWVzdGlvbi5cbiAqIC8vIFBocmFzZSBpdCBmcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUuXG4gKiAvLyAtIFBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzXG4gKiAvLyAgIDEuIGl0ZW1cbiAqIC8vICAgMi4gaXRlbVxuICogLy9cbiAqIC8vIEluc3RydWN0aW9uczpcbiAqIC8vXG4gKiAvLyBSZXBseSB3aXRoIHRoZSBTUUwgb25seS5cbiAqIGBgYFxuICpcbiAqIFNlZSB7QGxpbmsgRGVzY3JpcHRpb259IGZvciB0aGUgbm9kZSBncmFtbWFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EZXNjcmlwdGlvbihub2RlOiBEZXNjcmlwdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiByZW5kZXJCbG9jayhub2RlLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9bIFxcdF0rJC9nbSwgXCJcIilcbiAgICAucmVwbGFjZSgvXFxuKyQvLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQmxvY2sobm9kZTogRGVzY3JpcHRpb24sIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gIGlmICh0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHByZXBlbmRQYWQoZGVkZW50KG5vZGUpLCBwYWQpO1xuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkgcmV0dXJuIHJlbmRlclNlcXVlbmNlKG5vZGUsIHBhZCk7XG4gIGNvbnN0IGtpbmQgPSBsaXN0S2luZChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGtpbmQpIHtcbiAgICByZXR1cm4gcmVuZGVyTGlzdCgobm9kZSBhcyBSZWNvcmQ8TGlzdEtpbmQsIHJlYWRvbmx5IERlc2NyaXB0aW9uW10+KVtraW5kXSwgcGFkLCBraW5kKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyTWFwKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgRGVzY3JpcHRpb24+LCBwYWQpO1xufVxuXG4vKipcbiAqIFJpZ2h0LXN0cmlwIGV2ZXJ5IGxpbmUsIHJlbW92ZSBjb21tb24gaW5kZW50YXRpb24sIGFuZCBvcHRpb25hbGx5IHRyaW1cbiAqIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGJsYW5rIGxpbmVzLiBXaGl0ZXNwYWNlLW9ubHkgbGluZXMgbm9ybWFsaXplIHRvIGVtcHR5XG4gKiBsaW5lcywgbWF0Y2hpbmcgY29tbW9uIGRlZGVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWRlbnRMaW5lcyh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM6IERlZGVudE9wdGlvbnMgPSB7fSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gW107XG4gIGNvbnN0IHsgdHJpbVN0YXJ0ID0gdHJ1ZSwgdHJpbUVuZCA9IHRydWUsIHRyaW1MaW5lRW5kID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gKHRyaW1MaW5lRW5kID8gbGluZS5yZXBsYWNlKC9bIFxcdF0rJC8sIFwiXCIpIDogbGluZSkpO1xuICBsZXQgbWluID0gSW5maW5pdHk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1hdGNoID0gL15bIFxcdF0qLy5leGVjKGxpbmUpO1xuICAgIGNvbnN0IHdpZHRoID0gbWF0Y2ggPyBtYXRjaFswXS5sZW5ndGggOiAwO1xuICAgIGlmICh3aWR0aCA8IG1pbikgbWluID0gd2lkdGg7XG4gIH1cbiAgY29uc3Qgc3RyaXBwZWQgPVxuICAgIG1pbiA9PT0gSW5maW5pdHkgfHwgbWluID09PSAwID8gbGluZXMgOiBsaW5lcy5tYXAoKGxpbmUpID0+IChsaW5lID8gbGluZS5zbGljZShtaW4pIDogXCJcIikpO1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgZW5kID0gc3RyaXBwZWQubGVuZ3RoO1xuICBpZiAodHJpbVN0YXJ0KSB7XG4gICAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmICFzdHJpcHBlZFtzdGFydF0hLnRyaW0oKSkgc3RhcnQgKz0gMTtcbiAgfVxuICBpZiAodHJpbUVuZCkge1xuICAgIHdoaWxlIChlbmQgPiBzdGFydCAmJiAhc3RyaXBwZWRbZW5kIC0gMV0hLnRyaW0oKSkgZW5kIC09IDE7XG4gIH1cbiAgcmV0dXJuIHN0cmlwcGVkLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuXG4vKiogSm9pbiB7QGxpbmsgZGVkZW50TGluZXN9LCB0cmltbWluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBibGFuayBsaW5lcyBieSBkZWZhdWx0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZGVudCh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM6IERlZGVudE9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiBkZWRlbnRMaW5lcyh0ZXh0LCBvcHRpb25zKS5qb2luKFwiXFxuXCIpO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBpcyB0cmVhdGVkIGFzIGEgdHlwZWQgbGlzdCBvbmx5IHdoZW4gaXQgaGFzIGV4YWN0bHkgb25lXG4gKiBvd24ga2V5LCB0aGF0IGtleSBpcyBgYnVsbGV0c2Agb3IgYG51bWJlcmVkYCwgYW5kIHRoZSB2YWx1ZSBpcyBhblxuICogYXJyYXkuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhIGhlYWRlcnMgbWFwIC0gc28gY2FsbGVycyB3YW50aW5nIGFcbiAqIHNpbmdsZSBoZWFkZXIgbGl0ZXJhbGx5IG5hbWVkIGBidWxsZXRzYCBvciBgbnVtYmVyZWRgIGNhbiB1c2UgYVxuICogbXVsdGkta2V5IG1hcCBvciByZW5hbWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RLaW5kKG5vZGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTGlzdEtpbmQgfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBudWxsO1xuICBjb25zdCBrZXkgPSBrZXlzWzBdITtcbiAgaWYgKChMSVNUX0tFWVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGtleSkgJiYgQXJyYXkuaXNBcnJheShub2RlW2tleV0pKSB7XG4gICAgcmV0dXJuIGtleSBhcyBMaXN0S2luZDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJlcGVuZFBhZCh0ZXh0OiBzdHJpbmcsIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gXCJcIjtcbiAgaWYgKCFwYWQpIHJldHVybiB0ZXh0O1xuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5tYXAoKGxpbmUpID0+IChsaW5lID8gcGFkICsgbGluZSA6IFwiXCIpKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTZXF1ZW5jZShpdGVtczogcmVhZG9ubHkgRGVzY3JpcHRpb25bXSwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZW5kZXJlZDogeyB0ZXh0OiBzdHJpbmc7IG5vZGU6IERlc2NyaXB0aW9uIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCB0ZXh0ID0gcmVuZGVyQmxvY2soaXRlbSwgcGFkKTtcbiAgICBpZiAoIXRleHQpIGNvbnRpbnVlO1xuICAgIHJlbmRlcmVkLnB1c2goeyB0ZXh0LCBub2RlOiBpdGVtIH0pO1xuICB9XG4gIGlmIChyZW5kZXJlZC5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICBsZXQgb3V0ID0gcmVuZGVyZWRbMF0hLnRleHQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBzZXAgPSBuZWVkc0JsYW5rTGluZUJldHdlZW4ocmVuZGVyZWRbaSAtIDFdIS5ub2RlLCByZW5kZXJlZFtpXSEubm9kZSkgPyBcIlxcblxcblwiIDogXCJcXG5cIjtcbiAgICBvdXQgKz0gc2VwICsgcmVuZGVyZWRbaV0hLnRleHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBNYXBzIGFsd2F5cyBjcmVhdGUgdGhlaXIgb3duIHNlY3Rpb24gYm91bmRhcnkgKGEgYEhlYWRlcjpgIGxpbmUgcGx1c1xuICogYSBibGFuayBsaW5lIGJlZm9yZSB0aGUgYm9keSksIHNvIGFueXRoaW5nIHRvdWNoaW5nIGEgbWFwIGdldHMgYVxuICogYmxhbmstbGluZSBicmVhay4gUGxhaW4gdGV4dCBhZGphY2VudCB0byBhIHR5cGVkIGxpc3QgZmx1c2hlc1xuICogdG9nZXRoZXIgaW4gZWl0aGVyIGRpcmVjdGlvbjogdGV4dC1iZWZvcmUtbGlzdCByZWFkcyBhcyBhIGxlYWQtaW4sXG4gKiB0ZXh0LWFmdGVyLWxpc3QgYXMgYSB0cmFpbGluZyBzdW1tYXJ5LiBUd28gdGV4dCBwYXJhZ3JhcGhzIGFuZCB0d29cbiAqIGFkamFjZW50IGxpc3RzIGJvdGggZ2V0IGEgYmxhbmstbGluZSBicmVhayBmb3IgbGVnaWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gbmVlZHNCbGFua0xpbmVCZXR3ZWVuKHByZXY6IERlc2NyaXB0aW9uLCBjdXJyOiBEZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICBpZiAoaXNNYXAocHJldikgfHwgaXNNYXAoY3VycikpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcmV2SXNUZXh0ID0gdHlwZW9mIHByZXYgPT09IFwic3RyaW5nXCI7XG4gIGNvbnN0IGN1cnJJc1RleHQgPSB0eXBlb2YgY3VyciA9PT0gXCJzdHJpbmdcIjtcbiAgaWYgKHByZXZJc1RleHQgIT09IGN1cnJJc1RleHQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBub2RlIGlzIGEgaGVhZGVycyBtYXAgd2hlbiBpdCBpcyBhIG5vbi1hcnJheSwgbm9uLWxpc3Qgb2JqZWN0LlxuICogYGJ1bGxldHNgIC8gYG51bWJlcmVkYCBzaW5nbGUta2V5IG9iamVjdHMgYXJlIHRoZSBvbmx5IHN0cnVjdHVyZWRcbiAqIG9iamVjdHMgdGhhdCBhcmVuJ3QgbWFwcy5cbiAqL1xuZnVuY3Rpb24gaXNNYXAobm9kZTogRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGxpc3RLaW5kKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMaXN0KGl0ZW1zOiByZWFkb25seSBEZXNjcmlwdGlvbltdLCBwYWQ6IHN0cmluZywga2luZDogTGlzdEtpbmQpOiBzdHJpbmcge1xuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgaXRlbXNbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcHJlcGVuZFBhZChpdGVtc1swXSwgcGFkKTtcbiAgfVxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXSE7XG4gICAgY29uc3QgbWFya2VyID0ga2luZCA9PT0gXCJidWxsZXRzXCIgPyBcIi0gXCIgOiBgJHtpICsgMX0uIGA7XG4gICAgY29uc3QgYm9keSA9IHJlbmRlckJsb2NrKGl0ZW0sIFwiXCIpO1xuICAgIGNvbnN0IGJvZHlMaW5lcyA9IGJvZHkuc3BsaXQoXCJcXG5cIik7XG4gICAgbGluZXMucHVzaChgJHtwYWR9JHttYXJrZXJ9JHtib2R5TGluZXNbMF0gPz8gXCJcIn1gKTtcbiAgICBjb25zdCBjb250aW51YXRpb24gPSBwYWQgKyBcIiBcIi5yZXBlYXQobWFya2VyLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGJvZHlMaW5lcy5zbGljZSgxKSkge1xuICAgICAgbGluZXMucHVzaChsaW5lID8gYCR7Y29udGludWF0aW9ufSR7bGluZX1gIDogXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJNYXAobm9kZTogUmVjb3JkPHN0cmluZywgRGVzY3JpcHRpb24+LCBwYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtoZWFkZXIsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGJvZHkgPSByZW5kZXJCbG9jayh2YWx1ZSwgcGFkKTtcbiAgICBpZiAoIWJvZHkgJiYgIWhlYWRlci50cmltKCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRlckxpbmUgPSBoZWFkZXIudHJpbSgpID8gYCR7cGFkfSR7aGVhZGVyfTpgIDogXCJcIjtcbiAgICBwYXJ0cy5wdXNoKGJvZHkgPyBgJHtoZWFkZXJMaW5lfVxcblxcbiR7Ym9keX1gIDogaGVhZGVyTGluZSk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcXG5cXG5cIik7XG59XG5cbi8qKlxuICogRm9ybWF0IGEgY291bnQgd2l0aCBpdHMgbm91biwgcGx1cmFsaXppbmcgKG5haXZlIGArc2ApIHVubGVzcyB0aGUgY291bnQgaXMgMTpcbiAqIGBwbHVyYWxpemUoMSwgXCJiYXJyZWxcIilgIC0+IGBcIjEgYmFycmVsXCJgLCBgcGx1cmFsaXplKDMsIFwiYmFycmVsXCIpYCAtPlxuICogYFwiMyBiYXJyZWxzXCJgLiBDb2xsYXBzZXMgdGhlIGAke259IG5vdW4ke24gPT09IDEgPyBcIlwiIDogXCJzXCJ9YCBpZGlvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdXJhbGl6ZShjb3VudDogbnVtYmVyLCBub3VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y291bnR9ICR7bm91bn0ke2NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifWA7XG59XG5cbi8qKlxuICogVGl0bGUtY2FzZSBhIHNuYWtlIC8ga2ViYWIgLyBjYW1lbCBpZGVudGlmaWVyIGludG8gYSBodW1hbi1yZWFkYWJsZSBsYWJlbDpcbiAqIHRva2VuaXplIChsb3dlcmNhc2VkLCBjYXBpdGFsaXplZCksIHRoZW4gam9pbiB3aXRoIHNwYWNlcy4gRmFsbHMgYmFjayB0b1xuICogdGhlIHJhdyBgdmFsdWVgIHdoZW4gaXQgeWllbGRzIG5vIHRva2VucyAoZS5nLiBwdW5jdHVhdGlvbi1vbmx5IGlucHV0KS5cbiAqIGBiZ2VfbGFyZ2VfZW5gIC0+IGBcIkJnZSBMYXJnZSBFblwiYCwgYHByb21wdElkYCAtPiBgXCJQcm9tcHQgSWRcImAuXG4gKlxuICogVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBcImh1bWFuaXplIGEgY29sdW1uIC8gZmllbGQgbmFtZVwiIGlkaW9tIC1cbiAqIHJldXNlZCBieSB0aGUgY2hhdCBkYXRhLWdyaWQgaGVhZGVycyBhbmQgdGhlIGV4cG9ydCByZW5kZXJlci4gRXh0cmFcbiAqIHtAbGluayBUb2tlbml6ZU9wdGlvbnN9IChlLmcuIGBjYW1lbENhc2U6IGZhbHNlYCkgbWVyZ2Ugb3ZlciB0aGUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0xhYmVsKHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBUb2tlbml6ZU9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB0b2tlbnMgPSBbLi4udG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSwgY2FwaXRhbGl6ZTogdHJ1ZSwgLi4ub3B0aW9ucyB9LCB2YWx1ZSldO1xuICByZXR1cm4gdG9rZW5zLmxlbmd0aCA+IDAgPyB0b2tlbnMuam9pbihcIiBcIikgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBVcHBlci1jYXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHZhbHVlYCwgbGVhdmluZyB0aGUgcmVzdCB1bnRvdWNoZWQuXG4gKiBgXCJ3b3JraW5nXCJgIC0+IGBcIldvcmtpbmdcImAuIENvbGxhcHNlcyB0aGVcbiAqIGBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKWAgaWRpb20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPyB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpIDogdmFsdWU7XG59XG4iXX0=
528
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlEL0MsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsaURBQWlELENBQUM7QUFDckYsTUFBTSxnQ0FBZ0MsR0FBRyxlQUFlLENBQUM7QUFDekQsTUFBTSxrQkFBa0IsR0FBNEQ7SUFDbEYsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsNkVBQTZFO0lBQzdFLCtEQUErRDtJQUMvRCxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUM7QUFDRixNQUFNLFVBQVUsR0FBRyxvREFBb0QsQ0FBQztBQUN4RSxNQUFNLFlBQVksR0FBRywwRUFBMEUsQ0FBQztBQUVoRyxNQUFNLGlCQUFpQixH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QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQ25ELE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYSxFQUFFLE9BQXlCO0lBQzlELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEcsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgc3RyaW5nIHRvb2xraXQ6IHRva2VuaXphdGlvbiwgaWRlbnRpZmllciAvIHNsdWdcbiAqIGdlbmVyYXRpb24gKHdpdGggaGFzaC1zdWZmaXggY29sbGlzaW9uIHJlc2lzdGFuY2UpLCBIVE1MIGVzY2FwaW5nLFxuICogaGVhZGVyLXZhbHVlIHRyaW1taW5nLCBhbmQgYSBuZXN0ZWQgZGVzY3JpcHRpb24tdHJlZSByZW5kZXJlciBmb3JcbiAqIGxvbmctZm9ybSBMTE0gcHJvbXB0IC8gdG9vbC1kZXNjcmlwdGlvbiB0ZXh0LiBEZXBlbmRzIG9ubHkgb24gdGhlXG4gKiBsb2NhbCB7QGxpbmsgZm52SGFzaFdpdGhPcHRpb25zfSBmb3IgZGV0ZXJtaW5pc3RpYyBoYXNoIHN1ZmZpeGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZm52SGFzaFdpdGhPcHRpb25zIH0gZnJvbSBcIi4vaGFzaC50c1wiO1xuXG4vKipcbiAqIE9wdGlvbnMgY29udHJvbGxpbmcge0BsaW5rIHRva2VuaXplV2l0aE9wdGlvbnN9LiBBbGwgZGVmYXVsdCBvZmYgZXhjZXB0XG4gKiBgY2FtZWxDYXNlYC5cbiAqXG4gKiAtIGBkaXN0aW5jdGAgLSBkcm9wIGR1cGxpY2F0ZSB0b2tlbnMgKGZpcnN0IG9jY3VycmVuY2Ugd2lucykuXG4gKiAtIGBsb3dlckNhc2VgIC0gbG93ZXJjYXNlIGV2ZXJ5IHRva2VuLlxuICogLSBgY2FwaXRhbGl6ZWAgLSB1cHBlci1jYXNlIGVhY2ggdG9rZW4ncyBmaXJzdCBsZXR0ZXIgKHRoZW5cbiAqICAge0BsaW5rIFRPS0VOSVpFX09WRVJSSURFU30gZml4IHVwIGBhaWAgLT4gYEFJYCwgYGZzYCAtPiBgRlNgLCBhbmRcbiAqICAgYHYyYCAtPiBgVjJgKS5cbiAqIC0gYG9taXRVcmlTY2hlbWVgIC0gc3RyaXAgYSBsZWFkaW5nIGBzY2hlbWU6Ly9gIGJlZm9yZSB0b2tlbml6aW5nLlxuICogLSBgb21pdEVtYWlsRG9tYWluYCAtIGtlZXAgb25seSB0aGUgbG9jYWwgcGFydCBvZiBhbiBlbWFpbC5cbiAqIC0gYGNhbWVsQ2FzZWAgLSBzcGxpdCBvbiBjYW1lbENhc2UgYm91bmRhcmllcyAvIGRpZ2l0IHJ1bnMgLyBhY3Jvbnltc1xuICogICAoZGVmYXVsdCBgdHJ1ZWApOyB3aGVuIGBmYWxzZWAsIHNwbGl0IG9ubHkgb24gbm9uLWFscGhhbnVtZXJpY3MuXG4gKi9cbmV4cG9ydCB0eXBlIFRva2VuaXplT3B0aW9ucyA9IHtcbiAgZGlzdGluY3Q/OiBib29sZWFuO1xuICBsb3dlckNhc2U/OiBib29sZWFuO1xuICBjYXBpdGFsaXplPzogYm9vbGVhbjtcbiAgb21pdFVyaVNjaGVtZT86IGJvb2xlYW47XG4gIG9taXRFbWFpbERvbWFpbj86IGJvb2xlYW47XG4gIGNhbWVsQ2FzZT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFRva2VuaXphdGlvbiBhbmQgb3ZlcmZsb3cgY29udHJvbHMgZm9yIGxvd2VyY2FzZSBrZXlzIGFuZCBzbHVncy4gVGhlIGRlZmF1bHRcbiAqIGxlbmd0aCBpcyB1bmxpbWl0ZWQ7IG92ZXJmbG93IHVzZXMgYSBzaXgtY2hhcmFjdGVyIGhhc2ggdW5sZXNzIG92ZXJyaWRkZW4uXG4gKi9cbmV4cG9ydCB0eXBlIEtleU9wdGlvbnMgPSBPbWl0PFRva2VuaXplT3B0aW9ucywgXCJsb3dlckNhc2VcIiB8IFwiY2FwaXRhbGl6ZVwiPiAmIHtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICB0cnVuY2F0ZVN0cmF0ZWd5PzogXCJoYXNoXCIgfCBcInRyaW1cIiB8IFwiZW1wdHlcIjtcbiAgdHJ1bmNhdGVIYXNoTGVuZ3RoPzogbnVtYmVyO1xufTtcblxuLyoqIHtAbGluayBLZXlPcHRpb25zfSBwbHVzIHRoZSB0b2tlbiBkZWxpbWl0ZXIgdXNlZCBieSBpZGVudGlmaWVyIGdlbmVyYXRpb24uICovXG5leHBvcnQgdHlwZSBJZGVudGlmaWVyT3B0aW9ucyA9IEtleU9wdGlvbnMgJiB7XG4gIGRlbGltaXRlcj86IHN0cmluZztcbn07XG5cbi8qKiBMZWFkaW5nIGFuZCB0cmFpbGluZyBibGFuay1saW5lIGhhbmRsaW5nIGZvciB7QGxpbmsgZGVkZW50fS4gKi9cbmV4cG9ydCB0eXBlIERlZGVudE9wdGlvbnMgPSB7XG4gIC8qKiBSZW1vdmUgbGVhZGluZyBibGFuayBsaW5lcyBhZnRlciBpbmRlbnRhdGlvbiBub3JtYWxpemF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIHRyaW1TdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZW1vdmUgdHJhaWxpbmcgYmxhbmsgbGluZXMgYWZ0ZXIgaW5kZW50YXRpb24gbm9ybWFsaXphdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgdHJpbUVuZD86IGJvb2xlYW47XG4gIC8qKiBSZW1vdmUgc3BhY2VzIGFuZCB0YWJzIGZyb20gZWFjaCBsaW5lIGVuZC4gRGVmYXVsdHMgdG8gYHRydWVgLiAqL1xuICB0cmltTGluZUVuZD86IGJvb2xlYW47XG59O1xuXG50eXBlIFJlc29sdmVkVG9rZW5pemVPcHRpb25zID0gUmVxdWlyZWQ8VG9rZW5pemVPcHRpb25zPjtcbnR5cGUgUmVzb2x2ZWRJZGVudGlmaWVyT3B0aW9ucyA9IFJlcXVpcmVkPFxuICBJZGVudGlmaWVyT3B0aW9ucyAmIFBpY2s8VG9rZW5pemVPcHRpb25zLCBcImxvd2VyQ2FzZVwiIHwgXCJjYXBpdGFsaXplXCI+XG4+O1xuXG4vLyBBIGxlYWRpbmcgYHZgL2BWYCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBkaWdpdHMgKGEgdmVyc2lvbiBtYXJrZXIgbGlrZVxuLy8gYHYyYCkgaXMga2VwdCBhcyBPTkUgdG9rZW4gaW5zdGVhZCBvZiBzcGxpdHRpbmcgaW50byBgdmAgKyBgMmA7IGl0IGxlYWRzIHRoZVxuLy8gYWx0ZXJuYXRpb24gc28gaXQgd2lucyBvdmVyIHRoZSBnZW5lcmljIGxldHRlciAvIGRpZ2l0IHJ1bnMuIEV2ZXJ5dGhpbmcgZWxzZVxuLy8gaXMgdGhlIHVzdWFsIGNhbWVsQ2FzZSB3b3JkIC8gbnVtYmVyIC8gYWxsLWNhcHMtYWNyb255bSBzcGxpdC5cbmNvbnN0IFRPS0VOSVpFX0NBTUVMX0NBU0VfUkVHRVhQID0gL1t2Vl1bMC05XSt8W0EtWl0/W2Etel0rfFswLTldK3xbQS1aXSsoPyFbYS16XSkvZztcbmNvbnN0IFRPS0VOSVpFX05PTl9BTFBIQU5VTUVSSUNfUkVHRVhQID0gL1thLXpBLVowLTldKy9nO1xuY29uc3QgVE9LRU5JWkVfT1ZFUlJJREVTOiAoKHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IFRva2VuaXplT3B0aW9ucykgPT4gc3RyaW5nKVtdID0gW1xuICAodG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgICBpZiAoIW9wdGlvbnMuY2FwaXRhbGl6ZSkgcmV0dXJuIHRva2VuO1xuICAgIGNvbnN0IGxvd2VyID0gdG9rZW4udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXIgPT09IFwiYWlcIikgcmV0dXJuIFwiQUlcIjtcbiAgICBpZiAobG93ZXIgPT09IFwiZnNcIikgcmV0dXJuIFwiRlNcIjtcbiAgICByZXR1cm4gdG9rZW47XG4gIH0sXG4gIC8vIFZlcnNpb24gbWFya2VyIGB2MmAgLT4gYFYyYCB3aGVuIGNhcGl0YWxpemluZyAodGhlIGxlYWRpbmcgYHZgIHVwcGVyY2FzZXMsXG4gIC8vIHRoZSBkaWdpdHMgc3RheSksIHNvIGl0IHJlYWRzIGFzIG9uZSB1bml0IHJhdGhlciB0aGFuIFwiViAyXCIuXG4gICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgIGlmIChvcHRpb25zLmNhcGl0YWxpemUgJiYgL152WzAtOV0rJC8udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiBgViR7dG9rZW4uc2xpY2UoMSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9LFxuXTtcbmNvbnN0IFVSSV9SRUdFWFAgPSAvXihbYS16QS1aXVthLXpBLVowLTkrLi1dKik/OlxcL1xcLyhbXlxccy8/I11bXlxcc10qKT8kLztcbmNvbnN0IEVNQUlMX1JFR0VYUCA9IC9eKFthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKUAoW2EtekEtWjAtOS1dKyg/OlxcLlthLXpBLVowLTktXSspKykkLztcblxuY29uc3QgVE9LRU5JWkVfREVGQVVMVFM6IFJlc29sdmVkVG9rZW5pemVPcHRpb25zID0ge1xuICBkaXN0aW5jdDogZmFsc2UsXG4gIGxvd2VyQ2FzZTogZmFsc2UsXG4gIGNhcGl0YWxpemU6IGZhbHNlLFxuICBvbWl0VXJpU2NoZW1lOiBmYWxzZSxcbiAgb21pdEVtYWlsRG9tYWluOiBmYWxzZSxcbiAgY2FtZWxDYXNlOiB0cnVlLFxufTtcblxuY29uc3QgSURFTlRJRklFUl9ERUZBVUxUUzogUmVzb2x2ZWRJZGVudGlmaWVyT3B0aW9ucyA9IHtcbiAgLi4uVE9LRU5JWkVfREVGQVVMVFMsXG4gIGxvd2VyQ2FzZTogdHJ1ZSxcbiAgbWF4TGVuZ3RoOiBJbmZpbml0eSxcbiAgdHJ1bmNhdGVTdHJhdGVneTogXCJoYXNoXCIsXG4gIHRydW5jYXRlSGFzaExlbmd0aDogNixcbiAgZGVsaW1pdGVyOiBcIi1cIixcbn07XG5cbi8qKiBZaWVsZCBub3JtYWxpemVkIHRva2VucyB1c2luZyBleHBsaWNpdCBjYXNpbmcsIFVSSSwgZW1haWwsIGFuZCBkZWR1cGxpY2F0aW9uIHJ1bGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiB0b2tlbml6ZVdpdGhPcHRpb25zKFxuICBvcHRpb25zOiBUb2tlbml6ZU9wdGlvbnMsXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGNvbnN0IG9wdHM6IFJlc29sdmVkVG9rZW5pemVPcHRpb25zID0geyAuLi5UT0tFTklaRV9ERUZBVUxUUywgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBzZWVuID0gb3B0cy5kaXN0aW5jdCA/IG5ldyBTZXQ8c3RyaW5nPigpIDogdW5kZWZpbmVkO1xuICBjb25zdCByZWdleHAgPSBvcHRzLmNhbWVsQ2FzZSA/IFRPS0VOSVpFX0NBTUVMX0NBU0VfUkVHRVhQIDogVE9LRU5JWkVfTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFA7XG5cbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgbGV0IHN0cmluZ1ZhbHVlID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xuICAgIGlmICghc3RyaW5nVmFsdWUpIGNvbnRpbnVlO1xuICAgIGlmIChvcHRzLm9taXRVcmlTY2hlbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nVmFsdWUubWF0Y2goVVJJX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2gpIHN0cmluZ1ZhbHVlID0gbWF0Y2hbMl0gPz8gXCJcIjtcbiAgICB9XG4gICAgaWYgKG9wdHMub21pdEVtYWlsRG9tYWluKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHN0cmluZ1ZhbHVlLm1hdGNoKEVNQUlMX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2gpIHN0cmluZ1ZhbHVlID0gbWF0Y2hbMV0gPz8gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFzdHJpbmdWYWx1ZSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0b2tlbk1hdGNoIG9mIHN0cmluZ1ZhbHVlLm1hdGNoQWxsKHJlZ2V4cCkpIHtcbiAgICAgIGxldCB0b2tlbiA9IHRva2VuTWF0Y2hbMF0hO1xuICAgICAgaWYgKG9wdHMubG93ZXJDYXNlKSB0b2tlbiA9IHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAob3B0cy5jYXBpdGFsaXplKSB0b2tlbiA9IGNhcGl0YWxpemUodG9rZW4pO1xuICAgICAgaWYgKCF0b2tlbikgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IG92ZXJyaWRlIG9mIFRPS0VOSVpFX09WRVJSSURFUykge1xuICAgICAgICB0b2tlbiA9IG92ZXJyaWRlKHRva2VuLCBvcHRzKTtcbiAgICAgICAgaWYgKCF0b2tlbikgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoIXRva2VuIHx8IHNlZW4/Lmhhcyh0b2tlbikpIGNvbnRpbnVlO1xuICAgICAgc2Vlbj8uYWRkKHRva2VuKTtcbiAgICAgIHlpZWxkIHRva2VuO1xuICAgIH1cbiAgfVxufVxuXG4vKiogWWllbGQgbm9ybWFsaXplZCB0b2tlbnMgdXNpbmcgdGhlIGRlZmF1bHQgdG9rZW5pemF0aW9uIHJ1bGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiB0b2tlbml6ZSguLi52YWx1ZXM6IHVua25vd25bXSk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgeWllbGQqIHRva2VuaXplV2l0aE9wdGlvbnMoe30sIC4uLnZhbHVlcyk7XG59XG5cbi8qKlxuICogSm9pbiB0b2tlbml6ZWQgdmFsdWVzIHdpdGggYGRlbGltaXRlcmAuIFdoZW4gdGhlIG5leHQgdG9rZW4gd291bGQgcHVzaCB0aGVcbiAqIHJlc3VsdCBvdmVyIGBtYXhMZW5ndGhgOiBgdHJpbWAgc3RvcHMgYWRkaW5nOyBgZW1wdHlgIHJldHVybnMgYFwiXCJgOyBgaGFzaGBcbiAqIGFwcGVuZHMgYSBkaWdlc3Qgb2YgYWNjZXB0ZWQgdG9rZW5zIHBsdXMgdGhlIG92ZXJmbG93IHRva2VuIGlmIHRoZSByZXN1bHRcbiAqIHN0aWxsIGZpdHMsIG90aGVyd2lzZSBgXCJcImAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhvcHRpb25zOiBJZGVudGlmaWVyT3B0aW9ucywgLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICBjb25zdCBvcHRzOiBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0ge1xuICAgIC4uLklERU5USUZJRVJfREVGQVVMVFMsXG4gICAgLi4ub3B0aW9ucyxcbiAgICBsb3dlckNhc2U6IHRydWUsXG4gIH07XG4gIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRMZW5ndGggPSAwO1xuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5pemVXaXRoT3B0aW9ucyhvcHRzLCAuLi52YWx1ZXMpKSB7XG4gICAgY29uc3Qgc2VwTGVuZ3RoID0gdG9rZW5zLmxlbmd0aCA+IDAgPyBvcHRzLmRlbGltaXRlci5sZW5ndGggOiAwO1xuICAgIGNvbnN0IG5leHRMZW5ndGggPSBjdXJyZW50TGVuZ3RoICsgc2VwTGVuZ3RoICsgdG9rZW4ubGVuZ3RoO1xuXG4gICAgaWYgKG5leHRMZW5ndGggPiBvcHRzLm1heExlbmd0aCkge1xuICAgICAgaWYgKG9wdHMudHJ1bmNhdGVTdHJhdGVneSA9PT0gXCJlbXB0eVwiKSByZXR1cm4gXCJcIjtcbiAgICAgIGlmIChvcHRzLnRydW5jYXRlU3RyYXRlZ3kgPT09IFwidHJpbVwiKSBicmVhaztcblxuICAgICAgY29uc3QgaGFzaCA9IGRpZ2VzdFRva2VucyhvcHRzLnRydW5jYXRlSGFzaExlbmd0aCwgdG9rZW5zLCB0b2tlbik7XG4gICAgICBpZiAoY3VycmVudExlbmd0aCArIHNlcExlbmd0aCArIGhhc2gubGVuZ3RoIDw9IG9wdHMubWF4TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0b2tlbnMubGVuZ3RoID4gMCA/IHRva2Vucy5qb2luKG9wdHMuZGVsaW1pdGVyKSArIG9wdHMuZGVsaW1pdGVyICsgaGFzaCA6IGhhc2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgY3VycmVudExlbmd0aCA9IG5leHRMZW5ndGg7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zLmpvaW4ob3B0cy5kZWxpbWl0ZXIpO1xufVxuXG4vKiogQ29udmVydCBhcmJpdHJhcnkgdmFsdWVzIGludG8gYSBub3JtYWxpemVkIGNhbWVsLWNhc2UgaWRlbnRpZmllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0lkZW50aWZpZXIoLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoe30sIC4uLnZhbHVlcyk7XG59XG5cbi8qKlxuICogU2x1Z2lmaWVkIGlkZW50aWZpZXI6IHNhbWUgcnVsZXMgYXMge0BsaW5rIHRvSWRlbnRpZmllcldpdGhPcHRpb25zfSB3aXRoIHRoZVxuICogZGVsaW1pdGVyIGZvcmNlZCB0byBgLWAuIEFjY2VwdHMge0BsaW5rIEtleU9wdGlvbnN9IHNvIGNhbGxlcnMgY2Fubm90XG4gKiBvdmVycmlkZSB0aGUgZGVsaW1pdGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbHVnV2l0aE9wdGlvbnMob3B0aW9uczogS2V5T3B0aW9ucywgLi4udmFsdWVzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyAuLi5vcHRpb25zLCBkZWxpbWl0ZXI6IFwiLVwiIH0sIC4uLnZhbHVlcyk7XG59XG5cbi8qKiBDb252ZXJ0IGFyYml0cmFyeSB2YWx1ZXMgaW50byBhIG5vcm1hbGl6ZWQgaHlwaGVuLWRlbGltaXRlZCBzbHVnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU2x1ZyguLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b1NsdWdXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBUcmltIGB2YWx1ZWAgYW5kIHJldHVybiBgbnVsbGAgZm9yIG5vbi1zdHJpbmdzLCBgdW5kZWZpbmVkYCwgb3JcbiAqIHN0cmluZ3MgdGhhdCBhcmUgZW1wdHkgYWZ0ZXIgdHJpbW1pbmcuIExldHMgY2FsbCBzaXRlcyBjb2xsYXBzZSB0aGVcbiAqIGNvbW1vblxuICpcbiAqIGBgYHRzXG4gKiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiB2LnRyaW0oKSA/IHYudHJpbSgpIDogbnVsbFxuICogYGBgXG4gKlxuICogZGFuY2UgaW50byBhIHNpbmdsZSBoZWxwZXIuIFVzZWZ1bCBmb3IgSFRUUCBoZWFkZXIgLyBxdWVyeSAvIGZvcm1cbiAqIGV4dHJhY3RvcnMgd2hlcmUgZG93bnN0cmVhbSBjb2RlIHdhbnRzIGBzdHJpbmcgfCBudWxsYCB0byBkcml2ZSBhXG4gKiBjaGVhcCBgPz9gIC8gYGlmICh4KWAgY2FzY2FkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1Ub051bGwodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gIHJldHVybiB0cmltbWVkID8gdHJpbW1lZCA6IG51bGw7XG59XG5cbi8qKiBUcmltIGB2YWx1ZWAgYW5kIHJldHVybiBgdW5kZWZpbmVkYCB3aGVuIG5vIG5vbi1lbXB0eSBzdHJpbmcgcmVtYWlucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltVG9VbmRlZmluZWQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHJpbVRvTnVsbCh2YWx1ZSkgPz8gdW5kZWZpbmVkO1xufVxuXG4vLyBDb25maWcgbGlzdHMgYXJyaXZlIGVpdGhlciBhbHJlYWR5IHNwbGl0IChhbiBhcnJheSkgb3IgYXMgb25lIGVudi12YXIgc3RyaW5nXG4vLyB3aXRoIGVudHJpZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQvb3Igd2hpdGVzcGFjZS5cbmNvbnN0IExJU1RfU0VQQVJBVE9SX1JFR0VYUCA9IC9bXFxzLF0rLztcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBjb25maWcgbGlzdCB0aGF0IG1heSBhcnJpdmUgYXMgYW4gYXJyYXkgb3IgYXMgYSBzaW5nbGVcbiAqIGNvbW1hL3doaXRlc3BhY2Utc2VwYXJhdGVkIHN0cmluZzogc3BsaXQsIGFwcGx5IGB0cmFuc2Zvcm1gLCBkcm9wIGVtcHRpZXMsXG4gKiBhbmQgZGUtZHVwbGljYXRlIChmaXJzdCBvY2N1cnJlbmNlIHdpbnMpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNoYXBlIGV2ZXJ5IGFsbG93LWxpc3QgLyBmYWxsYmFjay1vcmRlciBzZXR0aW5nIGluIHRoaXMgcmVwb1xuICogdGFrZXMsIGJlY2F1c2UgdGhlIHNhbWUgdmFsdWUgY2FuIGNvbWUgZnJvbSB0eXBlZCBjb25maWcgKGBzdHJpbmdbXWApIG9yIGZyb21cbiAqIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIChgXCJhLCBiIGNcImApLiBQYXNzIGB0cmFuc2Zvcm1gIHRvIG5vcm1hbGl6ZSBlbnRyaWVzXG4gKiBhcyB0aGV5IGFyZSByZWFkOyBpdCBkZWZhdWx0cyB0byB0cmltbWluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VMaXN0KFwiZG9jcy5leGFtcGxlLmNvbSwgKi5kYXRhYnJpY2tzLmNvbVwiKTtcbiAqIHBhcnNlTGlzdChwcm9jZXNzLmVudi5NT0RFTF9GQUxMQkFDS1MpO1xuICogcGFyc2VMaXN0KHJhdywgbm9ybWFsaXplVXJsUGF0dGVybik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3QoXG4gIHJhdzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsLFxuICB0cmFuc2Zvcm06IChlbnRyeTogc3RyaW5nKSA9PiBzdHJpbmcgPSAoZW50cnkpID0+IGVudHJ5LnRyaW0oKSxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW50cmllcyA9XG4gICAgdHlwZW9mIHJhdyA9PT0gXCJzdHJpbmdcIiA/IHJhdy5zcGxpdChMSVNUX1NFUEFSQVRPUl9SRUdFWFApIDogQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogW107XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdHJhbnNmb3JtKGVudHJ5KTtcbiAgICBpZiAoIW5vcm1hbGl6ZWQgfHwgc2Vlbi5oYXMobm9ybWFsaXplZCkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKG5vcm1hbGl6ZWQpO1xuICAgIG91dC5wdXNoKG5vcm1hbGl6ZWQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICoge0BsaW5rIHRyaW1Ub051bGx9IHdpdGggYW4gZW1wdHktc3RyaW5nIG1pc3MgaW5zdGVhZCBvZiBgbnVsbGAsIGZvciBjYWxsZXJzXG4gKiB0aGF0IGJ1aWxkIGEgc3RyaW5nIHVuY29uZGl0aW9uYWxseSBhbmQgdHJlYXQgXCJhYnNlbnRcIiBhcyBcIlwiLlxuICpcbiAqIFJlYWRpbmcgbG9vc2VseS10eXBlZCBKU09OIGlzIHRoZSBtb3RpdmF0aW5nIGNhc2U6IGEgZmllbGQgdGhhdCBzaG91bGQgYmUgYVxuICogc3RyaW5nIG1heSBiZSBtaXNzaW5nIG9yIHRoZSB3cm9uZyB0eXBlLCBhbmQgdGhlIGNhbGxlciB3YW50cyBgXCJcImAgcmF0aGVyXG4gKiB0aGFuIGEgbnVsbCBjaGVjayBhdCBldmVyeSBhY2Nlc3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRpdGxlID0gdHJpbVRvRW1wdHkocmVjb3JkLnRpdGxlKTsgLy8gYWx3YXlzIGEgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltVG9FbXB0eSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiB0cmltVG9OdWxsKHZhbHVlKSA/PyBcIlwiO1xufVxuXG4vKipcbiAqIFRyaW0gdGhlIGZpcnN0IHVzYWJsZSBzdHJpbmcgb3V0IG9mIGB2YWx1ZWAuIFJldHVybnMgYG51bGxgIHdoZW5cbiAqIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGBudWxsYCwgYW4gZW1wdHkgc3RyaW5nLCBvciBhbiBhcnJheSB3aG9zZVxuICogZmlyc3Qgc3RyaW5nIG1lbWJlciBpcyBlbXB0eS4gTWlycm9ycyBob3cgRXhwcmVzcyAvIE5vZGUgaGVhZGVyXG4gKiBhY2Nlc3NvcnMgZXhwb3NlIHNpbmdsZSB2cy4gcmVwZWF0ZWQgaGVhZGVycyAtIHRoZSBmaXJzdFxuICogbm9uLWVtcHR5IGVudHJ5IHdpbnMsIGV2ZXJ5dGhpbmcgZWxzZSBpcyBpZ25vcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3ROb25FbXB0eSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB0cmltVG9OdWxsKGl0ZW0pO1xuICAgICAgaWYgKHRyaW1tZWQpIHJldHVybiB0cmltbWVkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gdHJpbVRvTnVsbCh2YWx1ZSk7XG59XG5cbi8qKlxuICogRXNjYXBlIHRoZSBmaXZlIGNoYXJhY3RlcnMgc2lnbmlmaWNhbnQgaW4gSFRNTCB0ZXh0IGFuZFxuICogZG91YmxlLXF1b3RlZCBhdHRyaWJ1dGUgdmFsdWVzIChgJmAsIGA8YCwgYD5gLCBgXCJgLCBgJ2ApIHNvIGFuXG4gKiB1bnRydXN0ZWQgc3RyaW5nIGNhbiBiZSBpbnRlcnBvbGF0ZWQgaW50byBtYXJrdXAgd2l0aG91dCBicmVha2luZ1xuICogb3V0IG9mIGl0cyBjb250ZXh0LiBgJmAgaXMgcmVwbGFjZWQgZmlyc3Qgc28gYW1wZXJzYW5kcyBpbnRyb2R1Y2VkXG4gKiBieSB0aGUgbGF0ZXIgcmVwbGFjZW1lbnRzIGFyZW4ndCBkb3VibGUtZXNjYXBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcbiAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcbiAgICAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcbiAgICAucmVwbGFjZSgvJy9nLCBcIiYjMzk7XCIpO1xufVxuXG4vKipcbiAqIFNsdWdpZnkgYHZhbHVlYCAodXNpbmcgdGhlIHN0YW5kYXJkIHtAbGluayB0b0lkZW50aWZpZXJXaXRoT3B0aW9uc31cbiAqIHRva2VuaXplciArIGRlbGltaXRlciBydWxlcykgYW5kICoqYWx3YXlzKiogc3VmZml4IGEgc2hvcnRcbiAqIGRldGVybWluaXN0aWMgaGFzaC4gVXNlIHdoZW4geW91IG5lZWQgYSBzdGFibGUsIHNsdWdpZmllZCBpZCB0aGF0XG4gKiBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgZGVzY3JpcHRpb25zIHNoYXJpbmcgdGhlIHNhbWVcbiAqIGxlYWRpbmcgdG9rZW5zICh0b29sIGlkcywgY2FjaGUga2V5cywgZXRjLikuXG4gKlxuICogQmVoYXZpb3VyIGRpZmZlcnMgZnJvbSBgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyBtYXhMZW5ndGgsXG4gKiB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIiB9KWA6IHRoYXQgaGVscGVyIG9ubHkgYXBwZW5kcyBhIGhhc2ggd2hlblxuICogdGhlIHNsdWcgKm92ZXJmbG93cyogYG1heExlbmd0aGAuIFRoaXMgaGVscGVyIGFwcGVuZHMgYSBoYXNoXG4gKiB1bmNvbmRpdGlvbmFsbHkgc28gdGhlIHJlc3VsdCBpcyBjb2xsaXNpb24tcmVzaXN0YW50IGV2ZW4gZm9yXG4gKiBzaG9ydCBpbnB1dHMuIFRoZSBoYXNoIGlzIGNvbXB1dGVkIG92ZXIgdGhlIHJhdyBgdmFsdWVgIHNvIHR3b1xuICogZGVzY3JpcHRpb25zIHByb2R1Y2luZyB0aGUgc2FtZSBzbHVnIHN0aWxsIGdldCBkaWZmZXJlbnQgaWRzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFNvdXJjZSBzdHJpbmcgKHR5cGljYWxseSBhIHRvb2wvYWdlbnQgZGVzY3JpcHRpb24pLlxuICogQHBhcmFtIG9wdGlvbnMuZGVsaW1pdGVyIC0gVG9rZW4gc2VwYXJhdG9yIChkZWZhdWx0IGBcIl9cImApLlxuICogQHBhcmFtIG9wdGlvbnMuc2x1Z01heExlbmd0aCAtIENhcCBvbiB0aGUgc2x1ZyBwb3J0aW9uICh0aGUgcGFydFxuICogICBiZWZvcmUgdGhlIGhhc2gpLiBEZWZhdWx0IDMyLlxuICogQHBhcmFtIG9wdGlvbnMuaGFzaExlbmd0aCAtIExlbmd0aCBvZiB0aGUgc3VmZml4IHByb2R1Y2VkIGJ5XG4gKiAgIHtAbGluayBmbnZIYXNoV2l0aE9wdGlvbnN9IChDcm9ja2ZvcmQtc3R5bGUgYmFzZS0zMiBhbHBoYWJldCwgbWF4IDdcbiAqICAgY2hhcnMpLiBEZWZhdWx0IDYuXG4gKiBAcGFyYW0gb3B0aW9ucy5mYWxsYmFja1ByZWZpeCAtIFByZWZpeCB1c2VkIHdoZW4gdGhlIHNsdWcgaXMgZW1wdHlcbiAqICAgKGUuZy4gcHVuY3R1YXRpb24tb25seSBpbnB1dCkuIERlZmF1bHQgYFwiaWRcImAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VuaXF1ZVNsdWcoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgc2x1Z01heExlbmd0aD86IG51bWJlcjtcbiAgICBoYXNoTGVuZ3RoPzogbnVtYmVyO1xuICAgIGZhbGxiYWNrUHJlZml4Pzogc3RyaW5nO1xuICB9ID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZWxpbWl0ZXIgPSBvcHRpb25zLmRlbGltaXRlciA/PyBcIl9cIjtcbiAgY29uc3Qgc2x1Z01heExlbmd0aCA9IG9wdGlvbnMuc2x1Z01heExlbmd0aCA/PyAzMjtcbiAgY29uc3QgaGFzaExlbmd0aCA9IG9wdGlvbnMuaGFzaExlbmd0aCA/PyA2O1xuICBjb25zdCBmYWxsYmFja1ByZWZpeCA9IG9wdGlvbnMuZmFsbGJhY2tQcmVmaXggPz8gXCJpZFwiO1xuICBjb25zdCBzbHVnID0gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoXG4gICAgeyBkZWxpbWl0ZXIsIG1heExlbmd0aDogc2x1Z01heExlbmd0aCwgdHJ1bmNhdGVTdHJhdGVneTogXCJ0cmltXCIgfSxcbiAgICB2YWx1ZSxcbiAgKTtcbiAgY29uc3Qgc3VmZml4ID0gZm52SGFzaFdpdGhPcHRpb25zKHsgbGVuZ3RoOiBoYXNoTGVuZ3RoIH0sIHZhbHVlKTtcbiAgcmV0dXJuIHNsdWcgPyBgJHtzbHVnfSR7ZGVsaW1pdGVyfSR7c3VmZml4fWAgOiBgJHtmYWxsYmFja1ByZWZpeH0ke2RlbGltaXRlcn0ke3N1ZmZpeH1gO1xufVxuXG5mdW5jdGlvbiBkaWdlc3RUb2tlbnMobGVuZ3RoOiBudW1iZXIsIHBhcnRzOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY29tYmluZWQgPSBcIlwiO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIGNvbWJpbmVkICs9IHBhcnQgKyBcIlxcMFwiO1xuICBpZiAoZXh0cmEgIT09IHVuZGVmaW5lZCkgY29tYmluZWQgKz0gZXh0cmEgKyBcIlxcMFwiO1xuICByZXR1cm4gZm52SGFzaFdpdGhPcHRpb25zKHsgbGVuZ3RoIH0sIGNvbWJpbmVkKTtcbn1cblxuLyoqXG4gKiBBIG5vZGUgaW4gdGhlIGRlc2NyaXB0aW9uIHRyZWUgY29uc3VtZWQgYnkge0BsaW5rIHRvRGVzY3JpcHRpb259LlxuICpcbiAqIC0gYHN0cmluZ2AgLSBhIHRleHQgcGFyYWdyYXBoLlxuICogLSBgRGVzY3JpcHRpb25bXWAgLSBhIHNlcXVlbmNlIG9mIHN0YWNrZWQgYmxvY2tzIGF0IHRoZSBzYW1lIGxldmVsXG4gKiAgIChubyBsaXN0IG1hcmtlcnMpLiBQbGFpbiB0ZXh0IGFkamFjZW50IHRvIGEgbGlzdCAoZWl0aGVyIGRpcmVjdGlvbilcbiAqICAgZmx1c2hlcyB0b2dldGhlciBzbyB0aGUgcHJvc2UgcmVhZHMgYXMgYSBsZWFkLWluIG9yIHRyYWlsaW5nXG4gKiAgIHN1bW1hcnkuIFR3byB0ZXh0IHBhcmFncmFwaHMsIHR3byBhZGphY2VudCBsaXN0cywgYW5kIGFueXRoaW5nXG4gKiAgIHRvdWNoaW5nIGEgbWFwIGdldCBhIGJsYW5rLWxpbmUgYnJlYWsuXG4gKiAtIGB7IGJ1bGxldHM6IFsuLi5dIH1gIC8gYHsgbnVtYmVyZWQ6IFsuLi5dIH1gIC0gZXhwbGljaXQgbGlzdC4gQVxuICogICBsaXN0IG9mIG9uZSBiYXJlIHN0cmluZyBkcm9wcyBpdHMgbWFya2VyIChgLWAgLyBgMS5gKTsgYSBsaXN0IG9mXG4gKiAgIG9uZSBpdGVtIHdpdGggbmVzdGVkIGNoaWxkcmVuIGtlZXBzIGl0cyBtYXJrZXIgYXMgdGhlIHZpc3VhbCBhbmNob3JcbiAqICAgZm9yIHRoZSBpbmRlbnRlZCBjaGlsZHJlbi5cbiAqIC0gYW55IG90aGVyIG9iamVjdCAtIGhlYWRlcnMgbWFwOiBlYWNoIGtleSBiZWNvbWVzIGEgYEhlYWRlcjpgIGxpbmVcbiAqICAgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIGFuZCB0aGUgcmVuZGVyZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIERlc2NyaXB0aW9uID0gc3RyaW5nIHwgcmVhZG9ubHkgRGVzY3JpcHRpb25bXSB8IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogRGVzY3JpcHRpb24gfTtcblxuY29uc3QgTElTVF9LRVlTID0gW1wiYnVsbGV0c1wiLCBcIm51bWJlcmVkXCJdIGFzIGNvbnN0O1xudHlwZSBMaXN0S2luZCA9ICh0eXBlb2YgTElTVF9LRVlTKVtudW1iZXJdO1xuXG4vKipcbiAqIEZvcm1hdCBhIG5lc3RlZCBkZXNjcmlwdGlvbiB0cmVlIGFzIGEgTWFya2Rvd24taXNoIHN0cmluZyBzdWl0YWJsZVxuICogZm9yIGFuIExMTSBzeXN0ZW0gcHJvbXB0LCBab2QgYC5kZXNjcmliZSgpYCBibG9jaywgTWFzdHJhIHRvb2xcbiAqIGRlc2NyaXB0aW9uLCBvciBhbnkgb3RoZXIgbG9uZy1mb3JtIHRleHQgZGVzdGluYXRpb24uXG4gKlxuICogRXZlcnkgc3RyaW5nIHNlY3Rpb24gaXMgZGVkZW50ZWQgKGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2Ugc3RyaXBwZWQpLFxuICogcmlnaHQtdHJpbW1lZCBsaW5lIGJ5IGxpbmUsIGFuZCBmcmVlZCBvZiBsZWFkaW5nIC8gdHJhaWxpbmcgYmxhbmtcbiAqIGxpbmVzLCBzbyBjYWxsZXJzIGNhbiB3cml0ZSBtdWx0aS1saW5lIHRlbXBsYXRlIGxpdGVyYWxzIGluZGVudGVkXG4gKiBuYXR1cmFsbHkgaW4gc291cmNlIHdpdGhvdXQgbGVha2luZyB0aGF0IGluZGVudGF0aW9uIGludG8gdGhlXG4gKiBjb25zdW1lci1mYWNpbmcgb3V0cHV0LiBQbGFpbi1zdHJpbmcgaW5wdXRzIGZsb3cgdGhyb3VnaCB1bmNoYW5nZWRcbiAqIGFwYXJ0IGZyb20gdGhlIHNhbWUgbm9ybWFsaXphdGlvbiBwYXNzLCBzbyBhIHNpbmdsZSBtdWx0aS1saW5lXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHdvcmtzIGRpcmVjdGx5OlxuICpcbiAqIGBgYHRzXG4gKiB0b0Rlc2NyaXB0aW9uKGBcbiAqICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIgYSBxdWVzdGlvbi5cbiAqICAgUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXMuXG4gKiBgKTtcbiAqIC8vIEFzayB0aGUgR2VuaWUgc3BhY2UgXCJkZWZhdWx0XCIgYSBxdWVzdGlvbi5cbiAqIC8vIFBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzLlxuICpcbiAqIHRvRGVzY3JpcHRpb24oW1xuICogICBgXG4gKiAgICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBhIHF1ZXN0aW9uLlxuICogICAgIFBocmFzZSBpdCBmcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUuXG4gKiAgIGAsXG4gKiAgIHsgYnVsbGV0czogW1xuICogICAgIFtcIlBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzXCIsIHsgbnVtYmVyZWQ6IFtcIml0ZW1cIiwgXCJpdGVtXCJdIH1dLFxuICogICBdfSxcbiAqICAgeyBJbnN0cnVjdGlvbnM6IFwiUmVwbHkgd2l0aCB0aGUgU1FMIG9ubHkuXCIgfSxcbiAqIF0pO1xuICogLy8gQXNrIHRoZSBHZW5pZSBzcGFjZSBhIHF1ZXN0aW9uLlxuICogLy8gUGhyYXNlIGl0IGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZS5cbiAqIC8vIC0gUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXNcbiAqIC8vICAgMS4gaXRlbVxuICogLy8gICAyLiBpdGVtXG4gKiAvL1xuICogLy8gSW5zdHJ1Y3Rpb25zOlxuICogLy9cbiAqIC8vIFJlcGx5IHdpdGggdGhlIFNRTCBvbmx5LlxuICogYGBgXG4gKlxuICogU2VlIHtAbGluayBEZXNjcmlwdGlvbn0gZm9yIHRoZSBub2RlIGdyYW1tYXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rlc2NyaXB0aW9uKG5vZGU6IERlc2NyaXB0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbmRlckJsb2NrKG5vZGUsIFwiXCIpXG4gICAgLnJlcGxhY2UoL1sgXFx0XSskL2dtLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9cXG4rJC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJCbG9jayhub2RlOiBEZXNjcmlwdGlvbiwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcHJlcGVuZFBhZChkZWRlbnQobm9kZSksIHBhZCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSByZXR1cm4gcmVuZGVyU2VxdWVuY2Uobm9kZSwgcGFkKTtcbiAgY29uc3Qga2luZCA9IGxpc3RLaW5kKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoa2luZCkge1xuICAgIHJldHVybiByZW5kZXJMaXN0KChub2RlIGFzIFJlY29yZDxMaXN0S2luZCwgcmVhZG9ubHkgRGVzY3JpcHRpb25bXT4pW2tpbmRdLCBwYWQsIGtpbmQpO1xuICB9XG4gIHJldHVybiByZW5kZXJNYXAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCBEZXNjcmlwdGlvbj4sIHBhZCk7XG59XG5cbi8qKlxuICogUmlnaHQtc3RyaXAgZXZlcnkgbGluZSwgcmVtb3ZlIGNvbW1vbiBpbmRlbnRhdGlvbiwgYW5kIG9wdGlvbmFsbHkgdHJpbVxuICogbGVhZGluZyBhbmQgdHJhaWxpbmcgYmxhbmsgbGluZXMuIFdoaXRlc3BhY2Utb25seSBsaW5lcyBub3JtYWxpemUgdG8gZW1wdHlcbiAqIGxpbmVzLCBtYXRjaGluZyBjb21tb24gZGVkZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZGVudExpbmVzKHRleHQ6IHN0cmluZywgb3B0aW9uczogRGVkZW50T3B0aW9ucyA9IHt9KTogc3RyaW5nW10ge1xuICBpZiAoIXRleHQpIHJldHVybiBbXTtcbiAgY29uc3QgeyB0cmltU3RhcnQgPSB0cnVlLCB0cmltRW5kID0gdHJ1ZSwgdHJpbUxpbmVFbmQgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIikubWFwKChsaW5lKSA9PiAodHJpbUxpbmVFbmQgPyBsaW5lLnJlcGxhY2UoL1sgXFx0XSskLywgXCJcIikgOiBsaW5lKSk7XG4gIGxldCBtaW4gPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKCFsaW5lLnRyaW0oKSkgY29udGludWU7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlsgXFx0XSovLmV4ZWMobGluZSk7XG4gICAgY29uc3Qgd2lkdGggPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgaWYgKHdpZHRoIDwgbWluKSBtaW4gPSB3aWR0aDtcbiAgfVxuICBjb25zdCBzdHJpcHBlZCA9XG4gICAgbWluID09PSBJbmZpbml0eSB8fCBtaW4gPT09IDAgPyBsaW5lcyA6IGxpbmVzLm1hcCgobGluZSkgPT4gKGxpbmUgPyBsaW5lLnNsaWNlKG1pbikgOiBcIlwiKSk7XG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBlbmQgPSBzdHJpcHBlZC5sZW5ndGg7XG4gIGlmICh0cmltU3RhcnQpIHtcbiAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgIXN0cmlwcGVkW3N0YXJ0XSEudHJpbSgpKSBzdGFydCArPSAxO1xuICB9XG4gIGlmICh0cmltRW5kKSB7XG4gICAgd2hpbGUgKGVuZCA+IHN0YXJ0ICYmICFzdHJpcHBlZFtlbmQgLSAxXSEudHJpbSgpKSBlbmQgLT0gMTtcbiAgfVxuICByZXR1cm4gc3RyaXBwZWQuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbi8qKiBKb2luIHtAbGluayBkZWRlbnRMaW5lc30sIHRyaW1taW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGJsYW5rIGxpbmVzIGJ5IGRlZmF1bHQuICovXG5leHBvcnQgZnVuY3Rpb24gZGVkZW50KHRleHQ6IHN0cmluZywgb3B0aW9uczogRGVkZW50T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgcmV0dXJuIGRlZGVudExpbmVzKHRleHQsIG9wdGlvbnMpLmpvaW4oXCJcXG5cIik7XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGlzIHRyZWF0ZWQgYXMgYSB0eXBlZCBsaXN0IG9ubHkgd2hlbiBpdCBoYXMgZXhhY3RseSBvbmVcbiAqIG93biBrZXksIHRoYXQga2V5IGlzIGBidWxsZXRzYCBvciBgbnVtYmVyZWRgLCBhbmQgdGhlIHZhbHVlIGlzIGFuXG4gKiBhcnJheS4gRXZlcnl0aGluZyBlbHNlIGlzIGEgaGVhZGVycyBtYXAgLSBzbyBjYWxsZXJzIHdhbnRpbmcgYVxuICogc2luZ2xlIGhlYWRlciBsaXRlcmFsbHkgbmFtZWQgYGJ1bGxldHNgIG9yIGBudW1iZXJlZGAgY2FuIHVzZSBhXG4gKiBtdWx0aS1rZXkgbWFwIG9yIHJlbmFtZS5cbiAqL1xuZnVuY3Rpb24gbGlzdEtpbmQobm9kZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBMaXN0S2luZCB8IG51bGwge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobm9kZSk7XG4gIGlmIChrZXlzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGtleSA9IGtleXNbMF0hO1xuICBpZiAoKExJU1RfS0VZUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoa2V5KSAmJiBBcnJheS5pc0FycmF5KG5vZGVba2V5XSkpIHtcbiAgICByZXR1cm4ga2V5IGFzIExpc3RLaW5kO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBwcmVwZW5kUGFkKHRleHQ6IHN0cmluZywgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXRleHQpIHJldHVybiBcIlwiO1xuICBpZiAoIXBhZCkgcmV0dXJuIHRleHQ7XG4gIHJldHVybiB0ZXh0XG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLm1hcCgobGluZSkgPT4gKGxpbmUgPyBwYWQgKyBsaW5lIDogXCJcIikpXG4gICAgLmpvaW4oXCJcXG5cIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlcXVlbmNlKGl0ZW1zOiByZWFkb25seSBEZXNjcmlwdGlvbltdLCBwYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlbmRlcmVkOiB7IHRleHQ6IHN0cmluZzsgbm9kZTogRGVzY3JpcHRpb24gfVtdID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IHRleHQgPSByZW5kZXJCbG9jayhpdGVtLCBwYWQpO1xuICAgIGlmICghdGV4dCkgY29udGludWU7XG4gICAgcmVuZGVyZWQucHVzaCh7IHRleHQsIG5vZGU6IGl0ZW0gfSk7XG4gIH1cbiAgaWYgKHJlbmRlcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gIGxldCBvdXQgPSByZW5kZXJlZFswXSEudGV4dDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCByZW5kZXJlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNlcCA9IG5lZWRzQmxhbmtMaW5lQmV0d2VlbihyZW5kZXJlZFtpIC0gMV0hLm5vZGUsIHJlbmRlcmVkW2ldIS5ub2RlKSA/IFwiXFxuXFxuXCIgOiBcIlxcblwiO1xuICAgIG91dCArPSBzZXAgKyByZW5kZXJlZFtpXSEudGV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE1hcHMgYWx3YXlzIGNyZWF0ZSB0aGVpciBvd24gc2VjdGlvbiBib3VuZGFyeSAoYSBgSGVhZGVyOmAgbGluZSBwbHVzXG4gKiBhIGJsYW5rIGxpbmUgYmVmb3JlIHRoZSBib2R5KSwgc28gYW55dGhpbmcgdG91Y2hpbmcgYSBtYXAgZ2V0cyBhXG4gKiBibGFuay1saW5lIGJyZWFrLiBQbGFpbiB0ZXh0IGFkamFjZW50IHRvIGEgdHlwZWQgbGlzdCBmbHVzaGVzXG4gKiB0b2dldGhlciBpbiBlaXRoZXIgZGlyZWN0aW9uOiB0ZXh0LWJlZm9yZS1saXN0IHJlYWRzIGFzIGEgbGVhZC1pbixcbiAqIHRleHQtYWZ0ZXItbGlzdCBhcyBhIHRyYWlsaW5nIHN1bW1hcnkuIFR3byB0ZXh0IHBhcmFncmFwaHMgYW5kIHR3b1xuICogYWRqYWNlbnQgbGlzdHMgYm90aCBnZXQgYSBibGFuay1saW5lIGJyZWFrIGZvciBsZWdpYmlsaXR5LlxuICovXG5mdW5jdGlvbiBuZWVkc0JsYW5rTGluZUJldHdlZW4ocHJldjogRGVzY3JpcHRpb24sIGN1cnI6IERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gIGlmIChpc01hcChwcmV2KSB8fCBpc01hcChjdXJyKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByZXZJc1RleHQgPSB0eXBlb2YgcHJldiA9PT0gXCJzdHJpbmdcIjtcbiAgY29uc3QgY3VycklzVGV4dCA9IHR5cGVvZiBjdXJyID09PSBcInN0cmluZ1wiO1xuICBpZiAocHJldklzVGV4dCAhPT0gY3VycklzVGV4dCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIG5vZGUgaXMgYSBoZWFkZXJzIG1hcCB3aGVuIGl0IGlzIGEgbm9uLWFycmF5LCBub24tbGlzdCBvYmplY3QuXG4gKiBgYnVsbGV0c2AgLyBgbnVtYmVyZWRgIHNpbmdsZS1rZXkgb2JqZWN0cyBhcmUgdGhlIG9ubHkgc3RydWN0dXJlZFxuICogb2JqZWN0cyB0aGF0IGFyZW4ndCBtYXBzLlxuICovXG5mdW5jdGlvbiBpc01hcChub2RlOiBEZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbGlzdEtpbmQobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpc3QoaXRlbXM6IHJlYWRvbmx5IERlc2NyaXB0aW9uW10sIHBhZDogc3RyaW5nLCBraW5kOiBMaXN0S2luZCk6IHN0cmluZyB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICBpZiAoaXRlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBpdGVtc1swXSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBwcmVwZW5kUGFkKGl0ZW1zWzBdLCBwYWQpO1xuICB9XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldITtcbiAgICBjb25zdCBtYXJrZXIgPSBraW5kID09PSBcImJ1bGxldHNcIiA/IFwiLSBcIiA6IGAke2kgKyAxfS4gYDtcbiAgICBjb25zdCBib2R5ID0gcmVuZGVyQmxvY2soaXRlbSwgXCJcIik7XG4gICAgY29uc3QgYm9keUxpbmVzID0gYm9keS5zcGxpdChcIlxcblwiKTtcbiAgICBsaW5lcy5wdXNoKGAke3BhZH0ke21hcmtlcn0ke2JvZHlMaW5lc1swXSA/PyBcIlwifWApO1xuICAgIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHBhZCArIFwiIFwiLnJlcGVhdChtYXJrZXIubGVuZ3RoKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYm9keUxpbmVzLnNsaWNlKDEpKSB7XG4gICAgICBsaW5lcy5wdXNoKGxpbmUgPyBgJHtjb250aW51YXRpb259JHtsaW5lfWAgOiBcIlwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck1hcChub2RlOiBSZWNvcmQ8c3RyaW5nLCBEZXNjcmlwdGlvbj4sIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2hlYWRlciwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgY29uc3QgYm9keSA9IHJlbmRlckJsb2NrKHZhbHVlLCBwYWQpO1xuICAgIGlmICghYm9keSAmJiAhaGVhZGVyLnRyaW0oKSkgY29udGludWU7XG4gICAgY29uc3QgaGVhZGVyTGluZSA9IGhlYWRlci50cmltKCkgPyBgJHtwYWR9JHtoZWFkZXJ9OmAgOiBcIlwiO1xuICAgIHBhcnRzLnB1c2goYm9keSA/IGAke2hlYWRlckxpbmV9XFxuXFxuJHtib2R5fWAgOiBoZWFkZXJMaW5lKTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlxcblxcblwiKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBjb3VudCB3aXRoIGl0cyBub3VuLCBwbHVyYWxpemluZyAobmFpdmUgYCtzYCkgdW5sZXNzIHRoZSBjb3VudCBpcyAxOlxuICogYHBsdXJhbGl6ZSgxLCBcImJhcnJlbFwiKWAgLT4gYFwiMSBiYXJyZWxcImAsIGBwbHVyYWxpemUoMywgXCJiYXJyZWxcIilgIC0+XG4gKiBgXCIzIGJhcnJlbHNcImAuIENvbGxhcHNlcyB0aGUgYCR7bn0gbm91biR7biA9PT0gMSA/IFwiXCIgOiBcInNcIn1gIGlkaW9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1cmFsaXplKGNvdW50OiBudW1iZXIsIG5vdW46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjb3VudH0gJHtub3VufSR7Y291bnQgPT09IDEgPyBcIlwiIDogXCJzXCJ9YDtcbn1cblxuLyoqXG4gKiBUaXRsZS1jYXNlIGEgc25ha2UgLyBrZWJhYiAvIGNhbWVsIGlkZW50aWZpZXIgaW50byBhIGh1bWFuLXJlYWRhYmxlIGxhYmVsOlxuICogdG9rZW5pemUgKGxvd2VyY2FzZWQsIGNhcGl0YWxpemVkKSwgdGhlbiBqb2luIHdpdGggc3BhY2VzLiBGYWxscyBiYWNrIHRvXG4gKiB0aGUgcmF3IGB2YWx1ZWAgd2hlbiBpdCB5aWVsZHMgbm8gdG9rZW5zIChlLmcuIHB1bmN0dWF0aW9uLW9ubHkgaW5wdXQpLlxuICogYGJnZV9sYXJnZV9lbmAgLT4gYFwiQmdlIExhcmdlIEVuXCJgLCBgcHJvbXB0SWRgIC0+IGBcIlByb21wdCBJZFwiYC5cbiAqXG4gKiBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIFwiaHVtYW5pemUgYSBjb2x1bW4gLyBmaWVsZCBuYW1lXCIgaWRpb20gLVxuICogcmV1c2VkIGJ5IHRoZSBjaGF0IGRhdGEtZ3JpZCBoZWFkZXJzIGFuZCB0aGUgZXhwb3J0IHJlbmRlcmVyLiBFeHRyYVxuICoge0BsaW5rIFRva2VuaXplT3B0aW9uc30gKGUuZy4gYGNhbWVsQ2FzZTogZmFsc2VgKSBtZXJnZSBvdmVyIHRoZSBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGFiZWwodmFsdWU6IHN0cmluZywgb3B0aW9ucz86IFRva2VuaXplT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VucyA9IFsuLi50b2tlbml6ZVdpdGhPcHRpb25zKHsgbG93ZXJDYXNlOiB0cnVlLCBjYXBpdGFsaXplOiB0cnVlLCAuLi5vcHRpb25zIH0sIHZhbHVlKV07XG4gIHJldHVybiB0b2tlbnMubGVuZ3RoID4gMCA/IHRva2Vucy5qb2luKFwiIFwiKSA6IHZhbHVlO1xufVxuXG4vKipcbiAqIFVwcGVyLWNhc2UgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgdmFsdWVgLCBsZWF2aW5nIHRoZSByZXN0IHVudG91Y2hlZC5cbiAqIGBcIndvcmtpbmdcImAgLT4gYFwiV29ya2luZ1wiYC4gQ29sbGFwc2VzIHRoZVxuICogYHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpYCBpZGlvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcGl0YWxpemUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZSA/IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkgOiB2YWx1ZTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -19,9 +19,7 @@
19
19
  "projen": "projen"
20
20
  },
21
21
  "devDependencies": {
22
- "@dbx-tools/test-polyglot": "^0.9.32",
23
- "@types/bun": "1.3.14",
24
- "@types/node": "^24.6.0",
22
+ "@dbx-tools/test-polyglot": "^0.9.36",
25
23
  "typescript": "^5.9.3"
26
24
  },
27
25
  "dependencies": {
@@ -42,6 +40,10 @@
42
40
  "types": "./lib/src/async-utils.d.ts",
43
41
  "default": "./lib/src/async-utils.js"
44
42
  },
43
+ "./brand-utils": {
44
+ "types": "./lib/src/brand-utils.d.ts",
45
+ "default": "./lib/src/brand-utils.js"
46
+ },
45
47
  "./environment-utils": {
46
48
  "types": "./lib/src/environment-utils.d.ts",
47
49
  "default": "./lib/src/environment-utils.js"
@@ -50,6 +52,10 @@
50
52
  "types": "./lib/src/error-utils.d.ts",
51
53
  "default": "./lib/src/error-utils.js"
52
54
  },
55
+ "./execution": {
56
+ "types": "./lib/src/execution.d.ts",
57
+ "default": "./lib/src/execution.js"
58
+ },
53
59
  "./function-utils": {
54
60
  "types": "./lib/src/function-utils.d.ts",
55
61
  "default": "./lib/src/function-utils.js"
@@ -58,23 +64,52 @@
58
64
  "types": "./lib/src/hash.d.ts",
59
65
  "default": "./lib/src/hash.js"
60
66
  },
67
+ "./http": {
68
+ "types": "./lib/src/http.d.ts",
69
+ "default": "./lib/src/http.js"
70
+ },
71
+ "./json": {
72
+ "types": "./lib/src/json.d.ts",
73
+ "default": "./lib/src/json.js"
74
+ },
61
75
  "./log": {
62
76
  "types": "./lib/src/log.d.ts",
63
77
  "default": "./lib/src/log.js"
64
78
  },
79
+ "./net": {
80
+ "types": "./lib/src/net.d.ts",
81
+ "default": "./lib/src/net.js"
82
+ },
65
83
  "./object": {
66
84
  "types": "./lib/src/object.d.ts",
67
85
  "default": "./lib/src/object.js"
68
86
  },
87
+ "./pattern": {
88
+ "types": "./lib/src/pattern.d.ts",
89
+ "default": "./lib/src/pattern.js"
90
+ },
91
+ "./predicate": {
92
+ "types": "./lib/src/predicate.d.ts",
93
+ "default": "./lib/src/predicate.js"
94
+ },
69
95
  "./string-utils": {
70
96
  "types": "./lib/src/string-utils.d.ts",
71
97
  "default": "./lib/src/string-utils.js"
72
98
  },
99
+ "./token": {
100
+ "types": "./lib/src/token.d.ts",
101
+ "default": "./lib/src/token.js"
102
+ },
73
103
  "./package.json": "./package.json"
74
104
  }
75
105
  },
76
- "version": "0.9.32",
106
+ "version": "0.9.36",
77
107
  "types": "./lib/index.d.ts",
108
+ "dbxToolsConfig": {
109
+ "tags": [
110
+ "shared"
111
+ ]
112
+ },
78
113
  "type": "module",
79
114
  "exports": {
80
115
  ".": {
@@ -85,6 +120,10 @@
85
120
  "types": "./lib/src/async-utils.d.ts",
86
121
  "default": "./lib/src/async-utils.js"
87
122
  },
123
+ "./brand-utils": {
124
+ "types": "./lib/src/brand-utils.d.ts",
125
+ "default": "./lib/src/brand-utils.js"
126
+ },
88
127
  "./environment-utils": {
89
128
  "types": "./lib/src/environment-utils.d.ts",
90
129
  "default": "./lib/src/environment-utils.js"
@@ -93,6 +132,10 @@
93
132
  "types": "./lib/src/error-utils.d.ts",
94
133
  "default": "./lib/src/error-utils.js"
95
134
  },
135
+ "./execution": {
136
+ "types": "./lib/src/execution.d.ts",
137
+ "default": "./lib/src/execution.js"
138
+ },
96
139
  "./function-utils": {
97
140
  "types": "./lib/src/function-utils.d.ts",
98
141
  "default": "./lib/src/function-utils.js"
@@ -101,18 +144,42 @@
101
144
  "types": "./lib/src/hash.d.ts",
102
145
  "default": "./lib/src/hash.js"
103
146
  },
147
+ "./http": {
148
+ "types": "./lib/src/http.d.ts",
149
+ "default": "./lib/src/http.js"
150
+ },
151
+ "./json": {
152
+ "types": "./lib/src/json.d.ts",
153
+ "default": "./lib/src/json.js"
154
+ },
104
155
  "./log": {
105
156
  "types": "./lib/src/log.d.ts",
106
157
  "default": "./lib/src/log.js"
107
158
  },
159
+ "./net": {
160
+ "types": "./lib/src/net.d.ts",
161
+ "default": "./lib/src/net.js"
162
+ },
108
163
  "./object": {
109
164
  "types": "./lib/src/object.d.ts",
110
165
  "default": "./lib/src/object.js"
111
166
  },
167
+ "./pattern": {
168
+ "types": "./lib/src/pattern.d.ts",
169
+ "default": "./lib/src/pattern.js"
170
+ },
171
+ "./predicate": {
172
+ "types": "./lib/src/predicate.d.ts",
173
+ "default": "./lib/src/predicate.js"
174
+ },
112
175
  "./string-utils": {
113
176
  "types": "./lib/src/string-utils.d.ts",
114
177
  "default": "./lib/src/string-utils.js"
115
178
  },
179
+ "./token": {
180
+ "types": "./lib/src/token.d.ts",
181
+ "default": "./lib/src/token.js"
182
+ },
116
183
  "./package.json": "./package.json"
117
184
  },
118
185
  "files": [
@@ -120,10 +187,5 @@
120
187
  "src",
121
188
  "lib"
122
189
  ],
123
- "dbxToolsConfig": {
124
- "tags": [
125
- "shared"
126
- ]
127
- },
128
190
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"bunx projen\"."
129
191
  }
package/src/object.ts CHANGED
@@ -1290,11 +1290,11 @@ export function toDuration(value: unknown, options: ToDurationOptions = {}): num
1290
1290
  let sign = 1;
1291
1291
  for (const [, explicitSign, amount, unit] of terms) {
1292
1292
  if (explicitSign) sign = explicitSign === "-" ? -1 : 1;
1293
- const unitMs = DURATION_UNIT_MS.get(unit) ?? DURATION_UNIT_MS.get(unit.replace(/s$/, ""));
1293
+ const unitMs = DURATION_UNIT_MS.get(unit!) ?? DURATION_UNIT_MS.get(unit!.replace(/s$/, ""));
1294
1294
  if (unitMs === undefined) {
1295
1295
  return options.parseDate === false ? undefined : dateAsDuration(value);
1296
1296
  }
1297
- total += sign * Number(amount) * unitMs;
1297
+ total += sign * Number(amount!) * unitMs;
1298
1298
  }
1299
1299
  return negate ? -total : total;
1300
1300
  }
@@ -226,6 +226,11 @@ export function trimToNull(value: unknown): string | null {
226
226
  return trimmed ? trimmed : null;
227
227
  }
228
228
 
229
+ /** Trim `value` and return `undefined` when no non-empty string remains. */
230
+ export function trimToUndefined(value: unknown): string | undefined {
231
+ return trimToNull(value) ?? undefined;
232
+ }
233
+
229
234
  // Config lists arrive either already split (an array) or as one env-var string
230
235
  // with entries separated by commas and/or whitespace.
231
236
  const LIST_SEPARATOR_REGEXP = /[\s,]+/;