@dbx-tools/appkit-generator 0.9.139 → 0.9.140

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-generator";
6
- export const PACKAGE_VERSION = "0.9.139";
6
+ export const PACKAGE_VERSION = "0.9.140";
7
7
  export * as assets from "./src/assets.ts";
8
8
  export * as config from "./src/config.ts";
9
9
  export * as dashboard from "./src/dashboard.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-generator";
2
- export declare const PACKAGE_VERSION = "0.9.139";
2
+ export declare const PACKAGE_VERSION = "0.9.140";
3
3
  export * as assets from "./src/assets.ts";
4
4
  export * as config from "./src/config.ts";
5
5
  export * as dashboard from "./src/dashboard.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-generator";
5
- export const PACKAGE_VERSION = "0.9.139";
5
+ export const PACKAGE_VERSION = "0.9.140";
6
6
  export * as assets from "./src/assets.js";
7
7
  export * as config from "./src/config.js";
8
8
  export * as dashboard from "./src/dashboard.js";
@@ -27,4 +27,4 @@ export { GeneratorOperations } from "./src/operations.js";
27
27
  export { GeneratorPlugin, generator } from "./src/plugin.js";
28
28
  export { DEFAULT_MAX_SOURCES, DEFAULT_SOURCE_MAX_LENGTH, MAX_SOURCES, MAX_SOURCE_MAX_LENGTH, ASSET_HTML_MAX_LENGTH } from "./src/research.js";
29
29
  export { GENERATE_BRAND_TOOL_DESCRIPTION, GeneratedBrandProfileSchema } from "./src/schema.js";
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd4RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU1RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUtqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUcxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU5SSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LWdlbmVyYXRvclwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjEzOVwiO1xuZXhwb3J0ICogYXMgYXNzZXRzIGZyb20gXCIuL3NyYy9hc3NldHMudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkYXNoYm9hcmQgZnJvbSBcIi4vc3JjL2Rhc2hib2FyZC50c1wiO1xuZXhwb3J0ICogYXMgZGF0YSBmcm9tIFwiLi9zcmMvZGF0YS50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBnZW5lcmF0ZSBmcm9tIFwiLi9zcmMvZ2VuZXJhdGUudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMga3BpIGZyb20gXCIuL3NyYy9rcGkudHNcIjtcbmV4cG9ydCAqIGFzIG5hbWVzcGFjZSBmcm9tIFwiLi9zcmMvbmFtZXNwYWNlLnRzXCI7XG5leHBvcnQgKiBhcyBvcGVyYXRpb25zIGZyb20gXCIuL3NyYy9vcGVyYXRpb25zLnRzXCI7XG5leHBvcnQgKiBhcyBwYWxldHRlIGZyb20gXCIuL3NyYy9wYWxldHRlLnRzXCI7XG5leHBvcnQgKiBhcyBwbGFuIGZyb20gXCIuL3NyYy9wbGFuLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcmVzZWFyY2ggZnJvbSBcIi4vc3JjL3Jlc2VhcmNoLnRzXCI7XG5leHBvcnQgKiBhcyBzY2hlbWEgZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3RydWN0dXJlZCBmcm9tIFwiLi9zcmMvc3RydWN0dXJlZC50c1wiO1xuZXhwb3J0ICogYXMgd29ya2Zsb3cgZnJvbSBcIi4vc3JjL3dvcmtmbG93LnRzXCI7XG5leHBvcnQgdHlwZSB7IERpc2NvdmVyZWRCcmFuZEFzc2V0cywgRGlzY292ZXJlZE1vYmlsZUFwcFZpc3VhbHMgfSBmcm9tIFwiLi9zcmMvYXNzZXRzLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTkVSQVRPUl9USU1FT1VUX01TLCBHRU5FUkFUT1JfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuZXJhdG9yUGx1Z2luQ29uZmlnLCBSZXNvbHZlZEdlbmVyYXRvckNvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ3JlYXRlR2VuZXJhdG9yRGFzaGJvYXJkSW5wdXQgfSBmcm9tIFwiLi9zcmMvZGFzaGJvYXJkLnRzXCI7XG5leHBvcnQgeyBCUkFORF9DQUNIRV9UVExfU0VDT05EUywgQlJBTkRfQ0FDSEVfVkVSU0lPTiwgQlJBTkRfR0VORVJBVElPTl9BVFRFTVBUUyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZEV4ZWN1dGVDb25maWcsIEJyYW5kRXhlY3V0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB7IEJSQU5EX1NZTlRIRVNJU19JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuZXJhdGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnJhbmRTeW50aGVzaXNJbnB1dCwgQnJhbmRTeW50aGVzaXplciwgR2VuZXJhdGVCcmFuZFBhY2thZ2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2dlbmVyYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IENyZWF0ZUdlbmVyYXRvckdlbmllSW5wdXQgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzZWFyY2hLcGlzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9rcGkudHNcIjtcbmV4cG9ydCB0eXBlIHsgUHJvdmlzaW9uU2NoZW1hSW5wdXQsIEdlbmVyYXRvcklkZW50aXR5IH0gZnJvbSBcIi4vc3JjL25hbWVzcGFjZS50c1wiO1xuZXhwb3J0IHsgR2VuZXJhdG9yT3BlcmF0aW9ucyB9IGZyb20gXCIuL3NyYy9vcGVyYXRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmVyYXRvck9wZXJhdGlvbnNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29wZXJhdGlvbnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGxhbkdlbmVyYXRvckRhdGFJbnB1dCB9IGZyb20gXCIuL3NyYy9wbGFuLnRzXCI7XG5leHBvcnQgeyBHZW5lcmF0b3JQbHVnaW4sIGdlbmVyYXRvciB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTUFYX1NPVVJDRVMsIERFRkFVTFRfU09VUkNFX01BWF9MRU5HVEgsIE1BWF9TT1VSQ0VTLCBNQVhfU09VUkNFX01BWF9MRU5HVEgsIEFTU0VUX0hUTUxfTUFYX0xFTkdUSCB9IGZyb20gXCIuL3NyYy9yZXNlYXJjaC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZFJlc2VhcmNoQ2xpZW50LCBCcmFuZFJlc2VhcmNoT3B0aW9ucywgQnJhbmRQcm9ncmVzc1JlcG9ydGVyLCBCcmFuZFJlc2VhcmNoU291cmNlLCBCcmFuZFJlc2VhcmNoLCBCcmFuZFJlc2VhcmNoVmlzdWFsSW1hZ2UsIEJyYW5kUmVzZWFyY2hWaXN1YWxSZWZlcmVuY2UgfSBmcm9tIFwiLi9zcmMvcmVzZWFyY2gudHNcIjtcbmV4cG9ydCB7IEdFTkVSQVRFX0JSQU5EX1RPT0xfREVTQ1JJUFRJT04sIEdlbmVyYXRlZEJyYW5kUHJvZmlsZVNjaGVtYSB9IGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuZXJhdGVkQnJhbmRQcm9maWxlIH0gZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkR2VuZXJhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3RydWN0dXJlZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZW5lcmF0b3JXb3JrZmxvd09wZXJhdGlvbnMsIEdlbmVyYXRvcldvcmtmbG93T3B0aW9ucywgR2VuZXJhdG9yV29ya2Zsb3cgfSBmcm9tIFwiLi9zcmMvd29ya2Zsb3cudHNcIjtcbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd4RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU1RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUtqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUcxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU5SSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LWdlbmVyYXRvclwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE0MFwiO1xuZXhwb3J0ICogYXMgYXNzZXRzIGZyb20gXCIuL3NyYy9hc3NldHMudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkYXNoYm9hcmQgZnJvbSBcIi4vc3JjL2Rhc2hib2FyZC50c1wiO1xuZXhwb3J0ICogYXMgZGF0YSBmcm9tIFwiLi9zcmMvZGF0YS50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBnZW5lcmF0ZSBmcm9tIFwiLi9zcmMvZ2VuZXJhdGUudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMga3BpIGZyb20gXCIuL3NyYy9rcGkudHNcIjtcbmV4cG9ydCAqIGFzIG5hbWVzcGFjZSBmcm9tIFwiLi9zcmMvbmFtZXNwYWNlLnRzXCI7XG5leHBvcnQgKiBhcyBvcGVyYXRpb25zIGZyb20gXCIuL3NyYy9vcGVyYXRpb25zLnRzXCI7XG5leHBvcnQgKiBhcyBwYWxldHRlIGZyb20gXCIuL3NyYy9wYWxldHRlLnRzXCI7XG5leHBvcnQgKiBhcyBwbGFuIGZyb20gXCIuL3NyYy9wbGFuLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcmVzZWFyY2ggZnJvbSBcIi4vc3JjL3Jlc2VhcmNoLnRzXCI7XG5leHBvcnQgKiBhcyBzY2hlbWEgZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3RydWN0dXJlZCBmcm9tIFwiLi9zcmMvc3RydWN0dXJlZC50c1wiO1xuZXhwb3J0ICogYXMgd29ya2Zsb3cgZnJvbSBcIi4vc3JjL3dvcmtmbG93LnRzXCI7XG5leHBvcnQgdHlwZSB7IERpc2NvdmVyZWRCcmFuZEFzc2V0cywgRGlzY292ZXJlZE1vYmlsZUFwcFZpc3VhbHMgfSBmcm9tIFwiLi9zcmMvYXNzZXRzLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTkVSQVRPUl9USU1FT1VUX01TLCBHRU5FUkFUT1JfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuZXJhdG9yUGx1Z2luQ29uZmlnLCBSZXNvbHZlZEdlbmVyYXRvckNvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ3JlYXRlR2VuZXJhdG9yRGFzaGJvYXJkSW5wdXQgfSBmcm9tIFwiLi9zcmMvZGFzaGJvYXJkLnRzXCI7XG5leHBvcnQgeyBCUkFORF9DQUNIRV9UVExfU0VDT05EUywgQlJBTkRfQ0FDSEVfVkVSU0lPTiwgQlJBTkRfR0VORVJBVElPTl9BVFRFTVBUUyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZEV4ZWN1dGVDb25maWcsIEJyYW5kRXhlY3V0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB7IEJSQU5EX1NZTlRIRVNJU19JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuZXJhdGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnJhbmRTeW50aGVzaXNJbnB1dCwgQnJhbmRTeW50aGVzaXplciwgR2VuZXJhdGVCcmFuZFBhY2thZ2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2dlbmVyYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IENyZWF0ZUdlbmVyYXRvckdlbmllSW5wdXQgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzZWFyY2hLcGlzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9rcGkudHNcIjtcbmV4cG9ydCB0eXBlIHsgUHJvdmlzaW9uU2NoZW1hSW5wdXQsIEdlbmVyYXRvcklkZW50aXR5IH0gZnJvbSBcIi4vc3JjL25hbWVzcGFjZS50c1wiO1xuZXhwb3J0IHsgR2VuZXJhdG9yT3BlcmF0aW9ucyB9IGZyb20gXCIuL3NyYy9vcGVyYXRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmVyYXRvck9wZXJhdGlvbnNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29wZXJhdGlvbnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGxhbkdlbmVyYXRvckRhdGFJbnB1dCB9IGZyb20gXCIuL3NyYy9wbGFuLnRzXCI7XG5leHBvcnQgeyBHZW5lcmF0b3JQbHVnaW4sIGdlbmVyYXRvciB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTUFYX1NPVVJDRVMsIERFRkFVTFRfU09VUkNFX01BWF9MRU5HVEgsIE1BWF9TT1VSQ0VTLCBNQVhfU09VUkNFX01BWF9MRU5HVEgsIEFTU0VUX0hUTUxfTUFYX0xFTkdUSCB9IGZyb20gXCIuL3NyYy9yZXNlYXJjaC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZFJlc2VhcmNoQ2xpZW50LCBCcmFuZFJlc2VhcmNoT3B0aW9ucywgQnJhbmRQcm9ncmVzc1JlcG9ydGVyLCBCcmFuZFJlc2VhcmNoU291cmNlLCBCcmFuZFJlc2VhcmNoLCBCcmFuZFJlc2VhcmNoVmlzdWFsSW1hZ2UsIEJyYW5kUmVzZWFyY2hWaXN1YWxSZWZlcmVuY2UgfSBmcm9tIFwiLi9zcmMvcmVzZWFyY2gudHNcIjtcbmV4cG9ydCB7IEdFTkVSQVRFX0JSQU5EX1RPT0xfREVTQ1JJUFRJT04sIEdlbmVyYXRlZEJyYW5kUHJvZmlsZVNjaGVtYSB9IGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuZXJhdGVkQnJhbmRQcm9maWxlIH0gZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkR2VuZXJhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3RydWN0dXJlZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZW5lcmF0b3JXb3JrZmxvd09wZXJhdGlvbnMsIEdlbmVyYXRvcldvcmtmbG93T3B0aW9ucywgR2VuZXJhdG9yV29ya2Zsb3cgfSBmcm9tIFwiLi9zcmMvd29ya2Zsb3cudHNcIjtcbiJdfQ==
@@ -45,18 +45,37 @@ function mobileStoreQuery(request, platform) {
45
45
  return `site:${site} ${JSON.stringify(subject)} official app`;
46
46
  }
47
47
  /** Find one matching store page and download representative images. */
48
- async function researchMobileStore(request, platform, client, signal) {
48
+ async function researchMobileStore(request, platform, client, onProgress, signal) {
49
+ const platformName = platform === "ios" ? "the iOS App Store" : "Google Play";
49
50
  try {
51
+ await onProgress?.({
52
+ type: "progress",
53
+ stage: "visuals",
54
+ message: `Searching ${platformName} for visual references`,
55
+ });
50
56
  const search = await client.search({ query: mobileStoreQuery(request, platform) }, signal);
51
57
  const expectedHost = platform === "ios" ? "apps.apple.com" : "play.google.com";
52
58
  const pageUrl = search.citations
53
59
  .map(({ url }) => publicHttpsUrl(url))
54
60
  .find((url) => url && new URL(url).hostname === expectedHost);
55
- if (!pageUrl)
61
+ if (!pageUrl) {
62
+ await onProgress?.({
63
+ type: "progress",
64
+ stage: "visuals",
65
+ message: `No matching app found on ${platformName}`,
66
+ });
56
67
  return undefined;
68
+ }
69
+ await onProgress?.({
70
+ type: "progress",
71
+ stage: "visuals",
72
+ message: `Reading the ${platformName} listing`,
73
+ });
57
74
  const page = await fetchAssetPage(client, { url: pageUrl, maxLength: ASSET_HTML_MAX_LENGTH }, signal);
58
75
  const discovered = discoverMobileAppVisuals(page.content, page.url);
59
- const images = await Promise.all(discovered.imageUrls.slice(0, 4).map(async (url) => {
76
+ const imageUrls = discovered.imageUrls.slice(0, 4);
77
+ let completedImages = 0;
78
+ const images = await Promise.all(imageUrls.map(async (url) => {
60
79
  try {
61
80
  const image = await client.fetchImage({ url }, signal);
62
81
  return {
@@ -73,6 +92,16 @@ async function researchMobileStore(request, platform, client, signal) {
73
92
  });
74
93
  return { url };
75
94
  }
95
+ finally {
96
+ completedImages += 1;
97
+ await onProgress?.({
98
+ type: "progress",
99
+ stage: "visuals",
100
+ message: `Reviewed ${completedImages} of ${imageUrls.length} images from ${platformName}`,
101
+ current: completedImages,
102
+ total: imageUrls.length,
103
+ });
104
+ }
76
105
  }));
77
106
  return {
78
107
  platform,
@@ -86,6 +115,11 @@ async function researchMobileStore(request, platform, client, signal) {
86
115
  platform,
87
116
  error: errorUtils.toError(error),
88
117
  });
118
+ await onProgress?.({
119
+ type: "progress",
120
+ stage: "visuals",
121
+ message: `Could not read ${platformName}; continuing without it`,
122
+ });
89
123
  return undefined;
90
124
  }
91
125
  }
@@ -168,10 +202,20 @@ export async function researchBrand(request, client, options = {}, signal) {
168
202
  stage: "search",
169
203
  message: `Searching for official ${subject} brand sources`,
170
204
  });
205
+ const searchPromise = client
206
+ .search({ query: brandResearchQuery(request) }, signal)
207
+ .then(async (result) => {
208
+ await options.onProgress?.({
209
+ type: "progress",
210
+ stage: "search",
211
+ message: `Found ${result.citations.length} candidate web sources`,
212
+ });
213
+ return result;
214
+ });
171
215
  const [search, iosReference, androidReference] = await Promise.all([
172
- client.search({ query: brandResearchQuery(request) }, signal),
173
- researchMobileStore(request, "ios", client, signal),
174
- researchMobileStore(request, "android", client, signal),
216
+ searchPromise,
217
+ researchMobileStore(request, "ios", client, options.onProgress, signal),
218
+ researchMobileStore(request, "android", client, options.onProgress, signal),
175
219
  ]);
176
220
  const visualReferences = [iosReference, androidReference].filter((reference) => reference !== undefined);
177
221
  await options.onProgress?.({
@@ -232,4 +276,4 @@ export async function researchBrand(request, client, options = {}, signal) {
232
276
  visualReferences,
233
277
  };
234
278
  }
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVzZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFjSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkQsT0FBTyxFQUNMLG1CQUFtQixHQUtwQixNQUFNLGFBQWEsQ0FBQztBQUVyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsMkRBQTJEO0FBQzNELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUVyQywyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRS9DLG9GQUFvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUM7QUFFNUMsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztBQTZEL0MsNEZBQTRGO0FBQzVGLFNBQVMsY0FBYyxDQUNyQixNQUEyQixFQUMzQixPQUFpQyxFQUNqQyxNQUFvQjtJQUVwQixPQUFPLE1BQU0sQ0FBQyxjQUFjO1FBQzFCLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7UUFDeEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxNQUFNLFVBQVUsa0JBQWtCLENB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QU0sQ0FDUCxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQWMsRUFBRSxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUU7Z0JBQzdDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDakIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2FBQ2pDLENBQUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQztLQUNILENBQUMsQ0FBQztJQUNILE1BQU0sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pCLElBQUksRUFBRSxVQUFVO1FBQ2hCLEtBQUssRUFBRSxRQUFRO1FBQ2YsT0FBTyxFQUFFLFlBQVk7WUFDbkIsQ0FBQyxDQUFDLDZCQUE2QjtZQUMvQixDQUFDLENBQUMsMENBQTBDO0tBQy9DLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLE9BQU87UUFDUCxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRztRQUNsRCxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25FLGdCQUFnQjtLQUNqQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJhbmQgcmVzZWFyY2ggY29tcG9zZWQgZnJvbSB0aGUgd2ViLXNlYXJjaCBwbHVnaW4ncyBzZWFyY2ggYW5kIGZldGNoXG4gKiBvcGVyYXRpb25zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFdlYkFzc2V0UGFnZUZldGNoUmVxdWVzdCxcbiAgV2ViSW1hZ2VGZXRjaFJlcXVlc3QsXG4gIFdlYkltYWdlRmV0Y2hSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC13ZWItc2VhcmNoL2ZldGNoXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFdlYkZldGNoUmVxdWVzdCxcbiAgV2ViRmV0Y2hSZXN1bHQsXG4gIFdlYlNlYXJjaENpdGF0aW9uLFxuICBXZWJTZWFyY2hSZXF1ZXN0LFxuICBXZWJTZWFyY2hSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC13ZWItc2VhcmNoL3NjaGVtYVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBkaXNjb3Zlck1vYmlsZUFwcFZpc3VhbHMgfSBmcm9tIFwiLi9hc3NldHMudHNcIjtcbmltcG9ydCB7XG4gIGJyYW5kUmVxdWVzdFN1YmplY3QsXG4gIHR5cGUgQnJhbmRHZW5lcmF0aW9uUHJvZ3Jlc3NFdmVudCxcbiAgdHlwZSBCcmFuZEdlbmVyYXRpb25SZXF1ZXN0LFxuICB0eXBlIEJyYW5kUGFja2FnZVNvdXJjZSxcbiAgdHlwZSBCcmFuZFZpc3VhbFJlZmVyZW5jZSxcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJicmFuZC9yZXNlYXJjaFwiKTtcblxuLyoqIERlZmF1bHQgbnVtYmVyIG9mIGNpdGVkIHBhZ2VzIGZldGNoZWQgZm9yIG9uZSBicmFuZC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9TT1VSQ0VTID0gNDtcblxuLyoqIERlZmF1bHQgY2hhcmFjdGVyIGNhcCBmb3IgZWFjaCBmZXRjaGVkIHBhZ2UgZXhjZXJwdC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NPVVJDRV9NQVhfTEVOR1RIID0gOF8wMDA7XG5cbi8qKiBVcHBlciBib3VuZCB0aGF0IHByZXZlbnRzIG9uZSByZXF1ZXN0IGZyb20gZmFubmluZyBvdXQgYWNyb3NzIHRvbyBtYW55IHNpdGVzLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TT1VSQ0VTID0gODtcblxuLyoqIFVwcGVyIGJvdW5kIG9uIHJlYWRhYmxlIGNoYXJhY3RlcnMgcmV0YWluZWQgZnJvbSBvbmUgZmV0Y2hlZCBwYWdlLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TT1VSQ0VfTUFYX0xFTkdUSCA9IDIwXzAwMDtcblxuLyoqIE1hcmt1cCBjYXAgdXNlZCBmb3Igb2ZmaWNpYWwgYW5kIG1vYmlsZSBwYWdlIGFzc2V0IGRpc2NvdmVyeS4gKi9cbmV4cG9ydCBjb25zdCBBU1NFVF9IVE1MX01BWF9MRU5HVEggPSAxXzUwMF8wMDA7XG5cbi8qKiBTZWFyY2ggYW5kIGZldGNoIG9wZXJhdGlvbnMgc3VwcGxpZWQgYnkgdGhlIHJlZ2lzdGVyZWQgd2ViLXNlYXJjaCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEJyYW5kUmVzZWFyY2hDbGllbnQge1xuICAvKiogU2VhcmNoIHRoZSB3ZWIgYW5kIHJldHVybiBhIHN5bnRoZXNpemVkIGFuc3dlciB3aXRoIGNpdGF0aW9ucy4gKi9cbiAgc2VhcmNoKHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+O1xuICAvKiogRmV0Y2ggb25lIGNpdGVkIHBhZ2UgYXMgdGV4dCBvciBIVE1MLiAqL1xuICBmZXRjaChyZXF1ZXN0OiBXZWJGZXRjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD47XG4gIC8qKiBGZXRjaCBleHBhbmRlZCBtYXJrdXAgZm9yIGRldGVybWluaXN0aWMgaW4tcHJvY2VzcyBhc3NldCBkaXNjb3ZlcnkuICovXG4gIGZldGNoQXNzZXRQYWdlPyhyZXF1ZXN0OiBXZWJBc3NldFBhZ2VGZXRjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD47XG4gIC8qKiBGZXRjaCBvbmUgaW1hZ2UgZm9yIG11bHRpbW9kYWwgcmVzZWFyY2ggYW5kIHBhY2thZ2UgZXhwb3J0LiAqL1xuICBmZXRjaEltYWdlKHJlcXVlc3Q6IFdlYkltYWdlRmV0Y2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViSW1hZ2VGZXRjaFJlc3VsdD47XG59XG5cbi8qKiBSZXNlYXJjaCBvcHRpb25zIGNvbnRyb2xsaW5nIGJvdW5kZWQgcGFnZSByZWFkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJhbmRSZXNlYXJjaE9wdGlvbnMge1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgdW5pcXVlIHNvdXJjZXMgdG8gZmV0Y2guICovXG4gIG1heFNvdXJjZXM/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRleHQgY2hhcmFjdGVycyByZXRhaW5lZCBmcm9tIGVhY2ggc291cmNlLiAqL1xuICBzb3VyY2VNYXhMZW5ndGg/OiBudW1iZXI7XG4gIC8qKiBSZWNlaXZlcyBvYnNlcnZhYmxlIHdvcmtmbG93IHByb2dyZXNzLiAqL1xuICBvblByb2dyZXNzPzogQnJhbmRQcm9ncmVzc1JlcG9ydGVyO1xufVxuXG4vKiogQ2FsbGJhY2sgcmVjZWl2aW5nIG9uZSB2YWxpZGF0ZWQgd29ya2Zsb3cgcHJvZ3Jlc3MgZXZlbnQuICovXG5leHBvcnQgdHlwZSBCcmFuZFByb2dyZXNzUmVwb3J0ZXIgPSAoZXZlbnQ6IEJyYW5kR2VuZXJhdGlvblByb2dyZXNzRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKiogT25lIHNlbGVjdGVkIHNvdXJjZSBhbmQgdGhlIHRleHQgbWFkZSBhdmFpbGFibGUgdG8gc3ludGhlc2lzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmFuZFJlc2VhcmNoU291cmNlIGV4dGVuZHMgQnJhbmRQYWNrYWdlU291cmNlIHtcbiAgLyoqIFJlYWRhYmxlIHBhZ2UgdGV4dCwgb21pdHRlZCB3aGVuIHRoZSBmZXRjaCBmYWlsZWQuICovXG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBTZWFyY2ggYW5zd2VyLCBmZXRjaGVkIHNvdXJjZXMsIGFuZCBvZmZpY2lhbC1wYWdlIG1hcmt1cCB1c2VkIGJ5IGdlbmVyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEJyYW5kUmVzZWFyY2gge1xuICAvKiogV2ViLXNlYXJjaCBtb2RlbCdzIGV2aWRlbmNlIHN1bW1hcnkuICovXG4gIGFuc3dlcjogc3RyaW5nO1xuICAvKiogRW5kcG9pbnQgb3IgZmFsbGJhY2sgdGhhdCByYW4gdGhlIHdlYiBzZWFyY2guICovXG4gIG1vZGVsOiBzdHJpbmc7XG4gIC8qKiBTZWxlY3RlZCBhbmQgZGVkdXBsaWNhdGVkIGNpdGF0aW9ucy4gKi9cbiAgc291cmNlczogQnJhbmRSZXNlYXJjaFNvdXJjZVtdO1xuICAvKiogVVJMIG9mIHRoZSBmaXJzdCBzb3VyY2Ugc2VsZWN0ZWQgYXMgdGhlIGxpa2VseSBvZmZpY2lhbCBwYWdlLiAqL1xuICBvZmZpY2lhbFBhZ2VVcmw6IHN0cmluZztcbiAgLyoqIFJhdyBtYXJrdXAgdXNlZCBvbmx5IGZvciBkZXRlcm1pbmlzdGljIGFzc2V0IGRpc2NvdmVyeS4gKi9cbiAgb2ZmaWNpYWxQYWdlSHRtbD86IHN0cmluZztcbiAgLyoqIGlPUyBhbmQgQW5kcm9pZCBhcHAtc3RvcmUgcmVmZXJlbmNlcyB1c2VkIGFzIHN1cHBsZW1lbnRhbCB2aXN1YWwgcmVzZWFyY2guICovXG4gIHZpc3VhbFJlZmVyZW5jZXM6IEJyYW5kUmVzZWFyY2hWaXN1YWxSZWZlcmVuY2VbXTtcbn1cblxuLyoqIEZldGNoZWQgaW1hZ2UgcmV0YWluZWQgaW4gbWVtb3J5IGZvciBtdWx0aW1vZGFsIHN5bnRoZXNpcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJhbmRSZXNlYXJjaFZpc3VhbEltYWdlIHtcbiAgdXJsOiBzdHJpbmc7XG4gIGNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICBkYXRhPzogVWludDhBcnJheTtcbn1cblxuLyoqIE1vYmlsZS1zdG9yZSBwYWdlIHBsdXMgZG93bmxvYWRlZCB2aXN1YWwgcmVmZXJlbmNlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJhbmRSZXNlYXJjaFZpc3VhbFJlZmVyZW5jZSBleHRlbmRzIE9taXQ8QnJhbmRWaXN1YWxSZWZlcmVuY2UsIFwiaW1hZ2VzXCI+IHtcbiAgaW1hZ2VzOiBCcmFuZFJlc2VhcmNoVmlzdWFsSW1hZ2VbXTtcbn1cblxuLyoqIFVzZSBleHBhbmRlZCBhc3NldCBtYXJrdXAgd2hlbiBzdXBwbGllZCwgcmV0YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBkaXJlY3QgY2xpZW50cy4gKi9cbmZ1bmN0aW9uIGZldGNoQXNzZXRQYWdlKFxuICBjbGllbnQ6IEJyYW5kUmVzZWFyY2hDbGllbnQsXG4gIHJlcXVlc3Q6IFdlYkFzc2V0UGFnZUZldGNoUmVxdWVzdCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PiB7XG4gIHJldHVybiBjbGllbnQuZmV0Y2hBc3NldFBhZ2VcbiAgICA/IGNsaWVudC5mZXRjaEFzc2V0UGFnZShyZXF1ZXN0LCBzaWduYWwpXG4gICAgOiBjbGllbnQuZmV0Y2goeyAuLi5yZXF1ZXN0LCBmb3JtYXQ6IFwiaHRtbFwiIH0sIHNpZ25hbCk7XG59XG5cbi8qKiBCdWlsZCB0aGUgZm9jdXNlZCwgZmlyc3QtcGFydHkgc2VhcmNoIHJlcXVlc3QgZm9yIGEgYnJhbmQuICovXG5leHBvcnQgZnVuY3Rpb24gYnJhbmRSZXNlYXJjaFF1ZXJ5KHJlcXVlc3Q6IEJyYW5kR2VuZXJhdGlvblJlcXVlc3QpOiBzdHJpbmcge1xuICBjb25zdCBzdWJqZWN0ID0gYnJhbmRSZXF1ZXN0U3ViamVjdChyZXF1ZXN0KTtcbiAgY29uc3Qgd2Vic2l0ZSA9IHJlcXVlc3Qud2Vic2l0ZSA/IGAgVGhlIGtub3duIG9mZmljaWFsIHdlYnNpdGUgaXMgJHtyZXF1ZXN0LndlYnNpdGV9LmAgOiBcIlwiO1xuICByZXR1cm4gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgUmVzZWFyY2ggdGhlIG9mZmljaWFsIGJyYW5kIGlkZW50aXR5IGFuZCBkZXNpZ24gZGlyZWN0aW9uIGZvciBcIiR7c3ViamVjdH1cIi4ke3dlYnNpdGV9XG4gICAgVGhlIGJyb2FkZXIgYnJpZWYgaXM6ICR7cmVxdWVzdC5wcm9tcHQgPz8gc3ViamVjdH0uXG4gICAgUHJlZmVyIGZpcnN0LXBhcnR5IHNvdXJjZXMgYW5kIGNpdGUgdGhlIG9mZmljaWFsIHdlYnNpdGUgZmlyc3QuIElkZW50aWZ5XG4gICAgdGhlIGNhbm9uaWNhbCBhbmQgc2hvcnQgbmFtZXMsIGN1cnJlbnQgdGFnbGluZSwgcGxhaW4tbGFuZ3VhZ2VcbiAgICBkZXNjcmlwdGlvbiwgYXVkaWVuY2VzLCB3cml0aW5nIHRvbmUsIGJyYW5kIGNvbG9ycyBhcyBoZXggdmFsdWVzLFxuICAgIHR5cG9ncmFwaHksIGRvY3VtZW50YXRpb24sIHNvdXJjZSByZXBvc2l0b3J5LCBsb2dvLCBpY29uLCBhbmQgZmF2aWNvbi5cbiAgICBEaXN0aW5ndWlzaCBkb2N1bWVudGVkIGZhY3RzIGZyb20gcmVhc29uYWJsZSB2aXN1YWwgaW5mZXJlbmNlcy5cbiAgYCk7XG59XG5cbi8qKiBCdWlsZCBhIHRhcmdldGVkIG1vYmlsZS1zdG9yZSBzZWFyY2ggcXVlcnkgZm9yIHZpc3VhbCByZWZlcmVuY2VzLiAqL1xuZnVuY3Rpb24gbW9iaWxlU3RvcmVRdWVyeShcbiAgcmVxdWVzdDogQnJhbmRHZW5lcmF0aW9uUmVxdWVzdCxcbiAgcGxhdGZvcm06IEJyYW5kVmlzdWFsUmVmZXJlbmNlW1wicGxhdGZvcm1cIl0sXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdWJqZWN0ID0gYnJhbmRSZXF1ZXN0U3ViamVjdChyZXF1ZXN0KTtcbiAgY29uc3Qgc2l0ZSA9IHBsYXRmb3JtID09PSBcImlvc1wiID8gXCJhcHBzLmFwcGxlLmNvbVwiIDogXCJwbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwc1wiO1xuICByZXR1cm4gYHNpdGU6JHtzaXRlfSAke0pTT04uc3RyaW5naWZ5KHN1YmplY3QpfSBvZmZpY2lhbCBhcHBgO1xufVxuXG4vKiogRmluZCBvbmUgbWF0Y2hpbmcgc3RvcmUgcGFnZSBhbmQgZG93bmxvYWQgcmVwcmVzZW50YXRpdmUgaW1hZ2VzLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZWFyY2hNb2JpbGVTdG9yZShcbiAgcmVxdWVzdDogQnJhbmRHZW5lcmF0aW9uUmVxdWVzdCxcbiAgcGxhdGZvcm06IEJyYW5kVmlzdWFsUmVmZXJlbmNlW1wicGxhdGZvcm1cIl0sXG4gIGNsaWVudDogQnJhbmRSZXNlYXJjaENsaWVudCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEJyYW5kUmVzZWFyY2hWaXN1YWxSZWZlcmVuY2UgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZWFyY2ggPSBhd2FpdCBjbGllbnQuc2VhcmNoKHsgcXVlcnk6IG1vYmlsZVN0b3JlUXVlcnkocmVxdWVzdCwgcGxhdGZvcm0pIH0sIHNpZ25hbCk7XG4gICAgY29uc3QgZXhwZWN0ZWRIb3N0ID0gcGxhdGZvcm0gPT09IFwiaW9zXCIgPyBcImFwcHMuYXBwbGUuY29tXCIgOiBcInBsYXkuZ29vZ2xlLmNvbVwiO1xuICAgIGNvbnN0IHBhZ2VVcmwgPSBzZWFyY2guY2l0YXRpb25zXG4gICAgICAubWFwKCh7IHVybCB9KSA9PiBwdWJsaWNIdHRwc1VybCh1cmwpKVxuICAgICAgLmZpbmQoKHVybCkgPT4gdXJsICYmIG5ldyBVUkwodXJsKS5ob3N0bmFtZSA9PT0gZXhwZWN0ZWRIb3N0KTtcbiAgICBpZiAoIXBhZ2VVcmwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoQXNzZXRQYWdlKFxuICAgICAgY2xpZW50LFxuICAgICAgeyB1cmw6IHBhZ2VVcmwsIG1heExlbmd0aDogQVNTRVRfSFRNTF9NQVhfTEVOR1RIIH0sXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gZGlzY292ZXJNb2JpbGVBcHBWaXN1YWxzKHBhZ2UuY29udGVudCwgcGFnZS51cmwpO1xuICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZGlzY292ZXJlZC5pbWFnZVVybHMuc2xpY2UoMCwgNCkubWFwKGFzeW5jICh1cmwpOiBQcm9taXNlPEJyYW5kUmVzZWFyY2hWaXN1YWxJbWFnZT4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgY2xpZW50LmZldGNoSW1hZ2UoeyB1cmwgfSwgc2lnbmFsKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXJsOiBpbWFnZS51cmwsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogaW1hZ2UuY29udGVudFR5cGUsXG4gICAgICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXCJtb2JpbGUtaW1hZ2UtZmV0Y2gtZmFpbGVkXCIsIHtcbiAgICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgdXJsIH07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgYXBwTmFtZTogZGlzY292ZXJlZC5hcHBOYW1lLFxuICAgICAgcGFnZVVybDogcGFnZS51cmwsXG4gICAgICBpbWFnZXMsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2FybihcIm1vYmlsZS1zdG9yZS1yZXNlYXJjaC1mYWlsZWRcIiwge1xuICAgICAgcGxhdGZvcm0sXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBSZXR1cm4gYSBub3JtYWxpemVkIHB1YmxpYyBIVFRQUyBVUkwgb3IgYHVuZGVmaW5lZGAuICovXG5mdW5jdGlvbiBwdWJsaWNIdHRwc1VybCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHZhbHVlKTtcbiAgICByZXR1cm4gdXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiID8gdXJsLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIENvbXB1dGUgYSBzbWFsbCBmaXJzdC1wYXJ0eSBsaWtlbGlob29kIHNjb3JlIHdoaWxlIHByZXNlcnZpbmcgc2VhcmNoIG9yZGVyLiAqL1xuZnVuY3Rpb24gc291cmNlU2NvcmUoXG4gIGNpdGF0aW9uOiBXZWJTZWFyY2hDaXRhdGlvbixcbiAgcmVxdWVzdDogQnJhbmRHZW5lcmF0aW9uUmVxdWVzdCxcbiAgaW5kZXg6IG51bWJlcixcbik6IG51bWJlciB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoY2l0YXRpb24udXJsKTtcbiAgY29uc3Qgc3ViamVjdCA9IGJyYW5kUmVxdWVzdFN1YmplY3QocmVxdWVzdCk7XG4gIGNvbnN0IGtub3duV2Vic2l0ZSA9IHJlcXVlc3Qud2Vic2l0ZSA/IG5ldyBVUkwocmVxdWVzdC53ZWJzaXRlKSA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBzdWJqZWN0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXpcXGRdL2csIFwiXCIpO1xuICBjb25zdCBub3JtYWxpemVkSG9zdCA9IHVybC5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16XFxkXS9nLCBcIlwiKTtcbiAgY29uc3Qgc2FtZUtub3duT3JpZ2luID0ga25vd25XZWJzaXRlPy5vcmlnaW4gPT09IHVybC5vcmlnaW4gPyAxXzAwMCA6IDA7XG4gIGNvbnN0IGhvc3RNYXRjaGVzTmFtZSA9XG4gICAgbm9ybWFsaXplZE5hbWUubGVuZ3RoID49IDMgJiZcbiAgICAobm9ybWFsaXplZEhvc3QuaW5jbHVkZXMobm9ybWFsaXplZE5hbWUpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKG5vcm1hbGl6ZWRIb3N0KSlcbiAgICAgID8gMTAwXG4gICAgICA6IDA7XG4gIGNvbnN0IHRpdGxlTWF0Y2hlc05hbWUgPSBjaXRhdGlvbi50aXRsZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdWJqZWN0LnRvTG93ZXJDYXNlKCkpID8gMTAgOiAwO1xuICByZXR1cm4gc2FtZUtub3duT3JpZ2luICsgaG9zdE1hdGNoZXNOYW1lICsgdGl0bGVNYXRjaGVzTmFtZSAtIGluZGV4O1xufVxuXG4vKiogU2VsZWN0IHVuaXF1ZSBIVFRQUyBjaXRhdGlvbnMgYW5kIHB1dCB0aGUgbGlrZWx5IG9mZmljaWFsIHBhZ2UgZmlyc3QuICovXG5mdW5jdGlvbiBzZWxlY3RTb3VyY2VzKFxuICBjaXRhdGlvbnM6IHJlYWRvbmx5IFdlYlNlYXJjaENpdGF0aW9uW10sXG4gIHJlcXVlc3Q6IEJyYW5kR2VuZXJhdGlvblJlcXVlc3QsXG4gIG1heFNvdXJjZXM6IG51bWJlcixcbik6IFdlYlNlYXJjaENpdGF0aW9uW10ge1xuICBjb25zdCBzdWJqZWN0ID0gYnJhbmRSZXF1ZXN0U3ViamVjdChyZXF1ZXN0KTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IHJlcXVlc3Qud2Vic2l0ZVxuICAgID8gW3sgdXJsOiByZXF1ZXN0LndlYnNpdGUsIHRpdGxlOiBgJHtzdWJqZWN0fSBvZmZpY2lhbCB3ZWJzaXRlYCB9LCAuLi5jaXRhdGlvbnNdXG4gICAgOiBbLi4uY2l0YXRpb25zXTtcbiAgY29uc3QgdW5pcXVlID0gbmV3IE1hcDxzdHJpbmcsIFdlYlNlYXJjaENpdGF0aW9uPigpO1xuICBmb3IgKGNvbnN0IGNpdGF0aW9uIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBjb25zdCB1cmwgPSBwdWJsaWNIdHRwc1VybChjaXRhdGlvbi51cmwpO1xuICAgIGlmICh1cmwgJiYgIXVuaXF1ZS5oYXModXJsKSkgdW5pcXVlLnNldCh1cmwsIHsgLi4uY2l0YXRpb24sIHVybCB9KTtcbiAgfVxuICByZXR1cm4gWy4uLnVuaXF1ZS52YWx1ZXMoKV1cbiAgICAubWFwKChjaXRhdGlvbiwgaW5kZXgpID0+ICh7IGNpdGF0aW9uLCBzY29yZTogc291cmNlU2NvcmUoY2l0YXRpb24sIHJlcXVlc3QsIGluZGV4KSB9KSlcbiAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0LnNjb3JlIC0gbGVmdC5zY29yZSlcbiAgICAuc2xpY2UoMCwgbWF4U291cmNlcylcbiAgICAubWFwKCh7IGNpdGF0aW9uIH0pID0+IGNpdGF0aW9uKTtcbn1cblxuLyoqIEZldGNoIG9uZSBjaXRhdGlvbiBhcyByZWFkYWJsZSB0ZXh0IHdpdGhvdXQgZmFpbGluZyB0aGUgd2hvbGUgcmVzZWFyY2ggcGFzcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoU291cmNlKFxuICBjbGllbnQ6IEJyYW5kUmVzZWFyY2hDbGllbnQsXG4gIGNpdGF0aW9uOiBXZWJTZWFyY2hDaXRhdGlvbixcbiAgc291cmNlTWF4TGVuZ3RoOiBudW1iZXIsXG4gIG9uQ29tcGxldGU6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8QnJhbmRSZXNlYXJjaFNvdXJjZT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBjbGllbnQuZmV0Y2goXG4gICAgICB7IHVybDogY2l0YXRpb24udXJsLCBmb3JtYXQ6IFwidGV4dFwiLCBtYXhMZW5ndGg6IHNvdXJjZU1heExlbmd0aCB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNpdGF0aW9uLFxuICAgICAgdXJsOiBwYWdlLnVybCxcbiAgICAgIC4uLihwYWdlLnRpdGxlID8geyB0aXRsZTogcGFnZS50aXRsZSB9IDoge30pLFxuICAgICAgZmV0Y2hlZDogdHJ1ZSxcbiAgICAgIGNvbnRlbnQ6IHBhZ2UuY29udGVudCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci53YXJuKFwic291cmNlLWZldGNoLWZhaWxlZFwiLCB7XG4gICAgICB1cmw6IGNpdGF0aW9uLnVybCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICAgIHJldHVybiB7IC4uLmNpdGF0aW9uLCBmZXRjaGVkOiBmYWxzZSB9O1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IG9uQ29tcGxldGUoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlYXJjaCBmb3IgYSBicmFuZCwgZmV0Y2ggYSBib3VuZGVkIHNldCBvZiBjaXRlZCBwYWdlcywgYW5kIHJldGFpbiB0aGUgZmlyc3RcbiAqIHBhZ2UncyBtYXJrdXAgZm9yIGxvZ28gYW5kIGZhdmljb24gZGlzY292ZXJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzZWFyY2hCcmFuZChcbiAgcmVxdWVzdDogQnJhbmRHZW5lcmF0aW9uUmVxdWVzdCxcbiAgY2xpZW50OiBCcmFuZFJlc2VhcmNoQ2xpZW50LFxuICBvcHRpb25zOiBCcmFuZFJlc2VhcmNoT3B0aW9ucyA9IHt9LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8QnJhbmRSZXNlYXJjaD4ge1xuICBjb25zdCBzdWJqZWN0ID0gYnJhbmRSZXF1ZXN0U3ViamVjdChyZXF1ZXN0KTtcbiAgY29uc3QgbWF4U291cmNlcyA9IE1hdGgubWluKE1hdGgubWF4KDEsIG9wdGlvbnMubWF4U291cmNlcyA/PyBERUZBVUxUX01BWF9TT1VSQ0VTKSwgTUFYX1NPVVJDRVMpO1xuICBjb25zdCBzb3VyY2VNYXhMZW5ndGggPSBNYXRoLm1heChcbiAgICAxLFxuICAgIE1hdGgubWluKG9wdGlvbnMuc291cmNlTWF4TGVuZ3RoID8/IERFRkFVTFRfU09VUkNFX01BWF9MRU5HVEgsIE1BWF9TT1VSQ0VfTUFYX0xFTkdUSCksXG4gICk7XG4gIGF3YWl0IG9wdGlvbnMub25Qcm9ncmVzcz8uKHtcbiAgICB0eXBlOiBcInByb2dyZXNzXCIsXG4gICAgc3RhZ2U6IFwic2VhcmNoXCIsXG4gICAgbWVzc2FnZTogYFNlYXJjaGluZyBmb3Igb2ZmaWNpYWwgJHtzdWJqZWN0fSBicmFuZCBzb3VyY2VzYCxcbiAgfSk7XG4gIGNvbnN0IFtzZWFyY2gsIGlvc1JlZmVyZW5jZSwgYW5kcm9pZFJlZmVyZW5jZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgY2xpZW50LnNlYXJjaCh7IHF1ZXJ5OiBicmFuZFJlc2VhcmNoUXVlcnkocmVxdWVzdCkgfSwgc2lnbmFsKSxcbiAgICByZXNlYXJjaE1vYmlsZVN0b3JlKHJlcXVlc3QsIFwiaW9zXCIsIGNsaWVudCwgc2lnbmFsKSxcbiAgICByZXNlYXJjaE1vYmlsZVN0b3JlKHJlcXVlc3QsIFwiYW5kcm9pZFwiLCBjbGllbnQsIHNpZ25hbCksXG4gIF0pO1xuICBjb25zdCB2aXN1YWxSZWZlcmVuY2VzID0gW2lvc1JlZmVyZW5jZSwgYW5kcm9pZFJlZmVyZW5jZV0uZmlsdGVyKFxuICAgIChyZWZlcmVuY2UpOiByZWZlcmVuY2UgaXMgQnJhbmRSZXNlYXJjaFZpc3VhbFJlZmVyZW5jZSA9PiByZWZlcmVuY2UgIT09IHVuZGVmaW5lZCxcbiAgKTtcbiAgYXdhaXQgb3B0aW9ucy5vblByb2dyZXNzPy4oe1xuICAgIHR5cGU6IFwicHJvZ3Jlc3NcIixcbiAgICBzdGFnZTogXCJ2aXN1YWxzXCIsXG4gICAgbWVzc2FnZTogYFJldmlld2VkICR7dmlzdWFsUmVmZXJlbmNlcy5sZW5ndGh9IG1vYmlsZSBhcHAgcmVmZXJlbmNlc2AsXG4gICAgY3VycmVudDogdmlzdWFsUmVmZXJlbmNlcy5sZW5ndGgsXG4gICAgdG90YWw6IDIsXG4gIH0pO1xuICBjb25zdCBjaXRhdGlvbnMgPSBzZWxlY3RTb3VyY2VzKHNlYXJjaC5jaXRhdGlvbnMsIHJlcXVlc3QsIG1heFNvdXJjZXMpO1xuICBpZiAoY2l0YXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQnJhbmQgcmVzZWFyY2ggZm9yIFwiJHtzdWJqZWN0fVwiIHJldHVybmVkIG5vIHB1YmxpYyBIVFRQUyBzb3VyY2VzIHRvIGZldGNoLmApO1xuICB9XG4gIGxldCBjb21wbGV0ZWRTb3VyY2VzID0gMDtcbiAgYXdhaXQgb3B0aW9ucy5vblByb2dyZXNzPy4oe1xuICAgIHR5cGU6IFwicHJvZ3Jlc3NcIixcbiAgICBzdGFnZTogXCJmZXRjaFwiLFxuICAgIG1lc3NhZ2U6IGBSZWFkaW5nIDAgb2YgJHtjaXRhdGlvbnMubGVuZ3RofSBzb3VyY2VzYCxcbiAgICBjdXJyZW50OiAwLFxuICAgIHRvdGFsOiBjaXRhdGlvbnMubGVuZ3RoLFxuICB9KTtcblxuICBjb25zdCBvZmZpY2lhbCA9IGNpdGF0aW9uc1swXTtcbiAgY29uc3QgW3NvdXJjZXMsIG9mZmljaWFsSHRtbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgUHJvbWlzZS5hbGwoXG4gICAgICBjaXRhdGlvbnMubWFwKChjaXRhdGlvbikgPT5cbiAgICAgICAgZmV0Y2hTb3VyY2UoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIGNpdGF0aW9uLFxuICAgICAgICAgIHNvdXJjZU1heExlbmd0aCxcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb21wbGV0ZWRTb3VyY2VzICs9IDE7XG4gICAgICAgICAgICBhd2FpdCBvcHRpb25zLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgICAgICAgIHR5cGU6IFwicHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgc3RhZ2U6IFwiZmV0Y2hcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFJlYWQgJHtjb21wbGV0ZWRTb3VyY2VzfSBvZiAke2NpdGF0aW9ucy5sZW5ndGh9IHNvdXJjZXNgLFxuICAgICAgICAgICAgICBjdXJyZW50OiBjb21wbGV0ZWRTb3VyY2VzLFxuICAgICAgICAgICAgICB0b3RhbDogY2l0YXRpb25zLmxlbmd0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICAgIGZldGNoQXNzZXRQYWdlKFxuICAgICAgY2xpZW50LFxuICAgICAge1xuICAgICAgICB1cmw6IG9mZmljaWFsLnVybCxcbiAgICAgICAgbWF4TGVuZ3RoOiBBU1NFVF9IVE1MX01BWF9MRU5HVEgsXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgICkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcIm9mZmljaWFsLXBhZ2UtaHRtbC1mZXRjaC1mYWlsZWRcIiwge1xuICAgICAgICB1cmw6IG9mZmljaWFsLnVybCxcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSksXG4gIF0pO1xuICBhd2FpdCBvcHRpb25zLm9uUHJvZ3Jlc3M/Lih7XG4gICAgdHlwZTogXCJwcm9ncmVzc1wiLFxuICAgIHN0YWdlOiBcImFzc2V0c1wiLFxuICAgIG1lc3NhZ2U6IG9mZmljaWFsSHRtbFxuICAgICAgPyBcIkZvdW5kIG9mZmljaWFsIHBhZ2UgYXJ0d29ya1wiXG4gICAgICA6IFwiVXNpbmcgdGhlIG9mZmljaWFsIHNpdGUgZmF2aWNvbiBmYWxsYmFja1wiLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGFuc3dlcjogc2VhcmNoLmFuc3dlcixcbiAgICBtb2RlbDogc2VhcmNoLm1vZGVsLFxuICAgIHNvdXJjZXMsXG4gICAgb2ZmaWNpYWxQYWdlVXJsOiBvZmZpY2lhbEh0bWw/LnVybCA/PyBvZmZpY2lhbC51cmwsXG4gICAgLi4uKG9mZmljaWFsSHRtbCA/IHsgb2ZmaWNpYWxQYWdlSHRtbDogb2ZmaWNpYWxIdG1sLmNvbnRlbnQgfSA6IHt9KSxcbiAgICB2aXN1YWxSZWZlcmVuY2VzLFxuICB9O1xufVxuIl19
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVzZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFjSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkQsT0FBTyxFQUNMLG1CQUFtQixHQUtwQixNQUFNLGFBQWEsQ0FBQztBQUVyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsMkRBQTJEO0FBQzNELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUVyQywyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRS9DLG9GQUFvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUM7QUFFNUMsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztBQTZEL0MsNEZBQTRGO0FBQzVGLFNBQVMsY0FBYyxDQUNyQixNQUEyQixFQUMzQixPQUFpQyxFQUNqQyxNQUFvQjtJQUVwQixPQUFPLE1BQU0sQ0FBQyxjQUFjO1FBQzFCLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7UUFDeEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBK0I7SUFDaEUsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsa0NBQWtDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVGLE9BQU8sV0FBVyxDQUFDLGFBQWEsQ0FBQztxRUFDa0MsT0FBTyxLQUFLLE9BQU87NEJBQzVELE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTzs7Ozs7O0dBTWxELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsU0FBUyxnQkFBZ0IsQ0FDdkIsT0FBK0IsRUFDL0IsUUFBMEM7SUFFMUMsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxJQUFJLEdBQUcsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDO0lBQ2xGLE9BQU8sUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO0FBQ2hFLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxPQUErQixFQUMvQixRQUEwQyxFQUMxQyxNQUEyQixFQUMzQixVQUFrQyxFQUNsQyxNQUFvQjtJQUVwQixNQUFNLFlBQVksR0FBRyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQzlFLElBQUksQ0FBQztRQUNILE1BQU0sVUFBVSxFQUFFLENBQUM7WUFDakIsSUFBSSxFQUFFLFVBQVU7WUFDaEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsT0FBTyxFQUFFLGFBQWEsWUFBWSx3QkFBd0I7U0FDM0QsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNGLE1BQU0sWUFBWSxHQUFHLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUMvRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUzthQUM3QixHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sVUFBVSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxVQUFVO2dCQUNoQixLQUFLLEVBQUUsU0FBUztnQkFDaEIsT0FBTyxFQUFFLDRCQUE0QixZQUFZLEVBQUU7YUFDcEQsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sVUFBVSxFQUFFLENBQUM7WUFDakIsSUFBSSxFQUFFLFVBQVU7WUFDaEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsT0FBTyxFQUFFLGVBQWUsWUFBWSxVQUFVO1NBQy9DLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sY0FBYyxDQUMvQixNQUFNLEVBQ04sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxFQUNsRCxNQUFNLENBQ1AsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDeEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUM5QixTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQXFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2RCxPQUFPO29CQUNMLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztvQkFDZCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDakIsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7b0JBQ3ZDLFFBQVE7b0JBQ1IsR0FBRztvQkFDSCxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7aUJBQ2pDLENBQUMsQ0FBQztnQkFDSCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDakIsQ0FBQztvQkFBUyxDQUFDO2dCQUNULGVBQWUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sVUFBVSxFQUFFLENBQUM7b0JBQ2pCLElBQUksRUFBRSxVQUFVO29CQUNoQixLQUFLLEVBQUUsU0FBUztvQkFDaEIsT0FBTyxFQUFFLFlBQVksZUFBZSxPQUFPLFNBQVMsQ0FBQyxNQUFNLGdCQUFnQixZQUFZLEVBQUU7b0JBQ3pGLE9BQU8sRUFBRSxlQUFlO29CQUN4QixLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU07aUJBQ3hCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTztZQUNMLFFBQVE7WUFDUixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2pCLE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFO1lBQzFDLFFBQVE7WUFDUixLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEVBQUUsQ0FBQztZQUNqQixJQUFJLEVBQUUsVUFBVTtZQUNoQixLQUFLLEVBQUUsU0FBUztZQUNoQixPQUFPLEVBQUUsa0JBQWtCLFlBQVkseUJBQXlCO1NBQ2pFLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsMkRBQTJEO0FBQzNELFNBQVMsY0FBYyxDQUFDLEtBQWE7SUFDbkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLFNBQVMsV0FBVyxDQUNsQixRQUEyQixFQUMzQixPQUErQixFQUMvQixLQUFhO0lBRWIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzVFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRSxNQUFNLGVBQWUsR0FBRyxZQUFZLEVBQUUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sZUFBZSxHQUNuQixjQUFjLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDMUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLEdBQUc7UUFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsT0FBTyxlQUFlLEdBQUcsZUFBZSxHQUFHLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUN0RSxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLFNBQVMsYUFBYSxDQUNwQixTQUF1QyxFQUN2QyxPQUErQixFQUMvQixVQUFrQjtJQUVsQixNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTztRQUNoQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sbUJBQW1CLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBQ3BELEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDeEIsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3RGLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUMvQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQztTQUNwQixHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLEtBQUssVUFBVSxXQUFXLENBQ3hCLE1BQTJCLEVBQzNCLFFBQTJCLEVBQzNCLGVBQXVCLEVBQ3ZCLFVBQXNDLEVBQ3RDLE1BQW9CO0lBRXBCLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FDN0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsRUFDakUsTUFBTSxDQUNQLENBQUM7UUFDRixPQUFPO1lBQ0wsR0FBRyxRQUFRO1lBQ1gsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVDLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDakMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUNqQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsR0FBRyxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3pDLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxPQUErQixFQUMvQixNQUEyQixFQUMzQixVQUFnQyxFQUFFLEVBQ2xDLE1BQW9CO0lBRXBCLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQzlCLENBQUMsRUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLElBQUkseUJBQXlCLEVBQUUscUJBQXFCLENBQUMsQ0FDdEYsQ0FBQztJQUNGLE1BQU0sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pCLElBQUksRUFBRSxVQUFVO1FBQ2hCLEtBQUssRUFBRSxRQUFRO1FBQ2YsT0FBTyxFQUFFLDBCQUEwQixPQUFPLGdCQUFnQjtLQUMzRCxDQUFDLENBQUM7SUFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNO1NBQ3pCLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztTQUN0RCxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JCLE1BQU0sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLElBQUksRUFBRSxVQUFVO1lBQ2hCLEtBQUssRUFBRSxRQUFRO1lBQ2YsT0FBTyxFQUFFLFNBQVMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLHdCQUF3QjtTQUNsRSxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2pFLGFBQWE7UUFDYixtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQztRQUN2RSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQztLQUM1RSxDQUFDLENBQUM7SUFDSCxNQUFNLGdCQUFnQixHQUFHLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUM5RCxDQUFDLFNBQVMsRUFBNkMsRUFBRSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQ2xGLENBQUM7SUFDRixNQUFNLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QixJQUFJLEVBQUUsVUFBVTtRQUNoQixLQUFLLEVBQUUsU0FBUztRQUNoQixPQUFPLEVBQUUsWUFBWSxnQkFBZ0IsQ0FBQyxNQUFNLHdCQUF3QjtRQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtRQUNoQyxLQUFLLEVBQUUsQ0FBQztLQUNULENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN2RSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsT0FBTyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUN6QixNQUFNLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QixJQUFJLEVBQUUsVUFBVTtRQUNoQixLQUFLLEVBQUUsT0FBTztRQUNkLE9BQU8sRUFBRSxnQkFBZ0IsU0FBUyxDQUFDLE1BQU0sVUFBVTtRQUNuRCxPQUFPLEVBQUUsQ0FBQztRQUNWLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTTtLQUN4QixDQUFDLENBQUM7SUFFSCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDekIsV0FBVyxDQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsZUFBZSxFQUNmLEtBQUssSUFBSSxFQUFFO1lBQ1QsZ0JBQWdCLElBQUksQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsT0FBTyxFQUFFLFFBQVEsZ0JBQWdCLE9BQU8sU0FBUyxDQUFDLE1BQU0sVUFBVTtnQkFDbEUsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNO2FBQ3hCLENBQUMsQ0FBQztRQUNMLENBQUMsRUFDRCxNQUFNLENBQ1AsQ0FDRixDQUNGO1FBQ0QsY0FBYyxDQUNaLE1BQU0sRUFDTjtZQUNFLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztZQUNqQixTQUFTLEVBQUUscUJBQXFCO1NBQ2pDLEVBQ0QsTUFBTSxDQUNQLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRTtnQkFDN0MsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO2dCQUNqQixLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDakMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDO0tBQ0gsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekIsSUFBSSxFQUFFLFVBQVU7UUFDaEIsS0FBSyxFQUFFLFFBQVE7UUFDZixPQUFPLEVBQUUsWUFBWTtZQUNuQixDQUFDLENBQUMsNkJBQTZCO1lBQy9CLENBQUMsQ0FBQywwQ0FBMEM7S0FDL0MsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDbkIsT0FBTztRQUNQLGVBQWUsRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHO1FBQ2xELEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkUsZ0JBQWdCO0tBQ2pCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcmFuZCByZXNlYXJjaCBjb21wb3NlZCBmcm9tIHRoZSB3ZWItc2VhcmNoIHBsdWdpbidzIHNlYXJjaCBhbmQgZmV0Y2hcbiAqIG9wZXJhdGlvbnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgV2ViQXNzZXRQYWdlRmV0Y2hSZXF1ZXN0LFxuICBXZWJJbWFnZUZldGNoUmVxdWVzdCxcbiAgV2ViSW1hZ2VGZXRjaFJlc3VsdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2gvZmV0Y2hcIjtcbmltcG9ydCB0eXBlIHtcbiAgV2ViRmV0Y2hSZXF1ZXN0LFxuICBXZWJGZXRjaFJlc3VsdCxcbiAgV2ViU2VhcmNoQ2l0YXRpb24sXG4gIFdlYlNlYXJjaFJlcXVlc3QsXG4gIFdlYlNlYXJjaFJlc3VsdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2gvc2NoZW1hXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGRpc2NvdmVyTW9iaWxlQXBwVmlzdWFscyB9IGZyb20gXCIuL2Fzc2V0cy50c1wiO1xuaW1wb3J0IHtcbiAgYnJhbmRSZXF1ZXN0U3ViamVjdCxcbiAgdHlwZSBCcmFuZEdlbmVyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIEJyYW5kR2VuZXJhdGlvblJlcXVlc3QsXG4gIHR5cGUgQnJhbmRQYWNrYWdlU291cmNlLFxuICB0eXBlIEJyYW5kVmlzdWFsUmVmZXJlbmNlLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImJyYW5kL3Jlc2VhcmNoXCIpO1xuXG4vKiogRGVmYXVsdCBudW1iZXIgb2YgY2l0ZWQgcGFnZXMgZmV0Y2hlZCBmb3Igb25lIGJyYW5kLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX1NPVVJDRVMgPSA0O1xuXG4vKiogRGVmYXVsdCBjaGFyYWN0ZXIgY2FwIGZvciBlYWNoIGZldGNoZWQgcGFnZSBleGNlcnB0LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU09VUkNFX01BWF9MRU5HVEggPSA4XzAwMDtcblxuLyoqIFVwcGVyIGJvdW5kIHRoYXQgcHJldmVudHMgb25lIHJlcXVlc3QgZnJvbSBmYW5uaW5nIG91dCBhY3Jvc3MgdG9vIG1hbnkgc2l0ZXMuICovXG5leHBvcnQgY29uc3QgTUFYX1NPVVJDRVMgPSA4O1xuXG4vKiogVXBwZXIgYm91bmQgb24gcmVhZGFibGUgY2hhcmFjdGVycyByZXRhaW5lZCBmcm9tIG9uZSBmZXRjaGVkIHBhZ2UuICovXG5leHBvcnQgY29uc3QgTUFYX1NPVVJDRV9NQVhfTEVOR1RIID0gMjBfMDAwO1xuXG4vKiogTWFya3VwIGNhcCB1c2VkIGZvciBvZmZpY2lhbCBhbmQgbW9iaWxlIHBhZ2UgYXNzZXQgZGlzY292ZXJ5LiAqL1xuZXhwb3J0IGNvbnN0IEFTU0VUX0hUTUxfTUFYX0xFTkdUSCA9IDFfNTAwXzAwMDtcblxuLyoqIFNlYXJjaCBhbmQgZmV0Y2ggb3BlcmF0aW9ucyBzdXBwbGllZCBieSB0aGUgcmVnaXN0ZXJlZCB3ZWItc2VhcmNoIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJhbmRSZXNlYXJjaENsaWVudCB7XG4gIC8qKiBTZWFyY2ggdGhlIHdlYiBhbmQgcmV0dXJuIGEgc3ludGhlc2l6ZWQgYW5zd2VyIHdpdGggY2l0YXRpb25zLiAqL1xuICBzZWFyY2gocmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD47XG4gIC8qKiBGZXRjaCBvbmUgY2l0ZWQgcGFnZSBhcyB0ZXh0IG9yIEhUTUwuICovXG4gIGZldGNoKHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PjtcbiAgLyoqIEZldGNoIGV4cGFuZGVkIG1hcmt1cCBmb3IgZGV0ZXJtaW5pc3RpYyBpbi1wcm9jZXNzIGFzc2V0IGRpc2NvdmVyeS4gKi9cbiAgZmV0Y2hBc3NldFBhZ2U/KHJlcXVlc3Q6IFdlYkFzc2V0UGFnZUZldGNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PjtcbiAgLyoqIEZldGNoIG9uZSBpbWFnZSBmb3IgbXVsdGltb2RhbCByZXNlYXJjaCBhbmQgcGFja2FnZSBleHBvcnQuICovXG4gIGZldGNoSW1hZ2UocmVxdWVzdDogV2ViSW1hZ2VGZXRjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJJbWFnZUZldGNoUmVzdWx0Pjtcbn1cblxuLyoqIFJlc2VhcmNoIG9wdGlvbnMgY29udHJvbGxpbmcgYm91bmRlZCBwYWdlIHJlYWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmFuZFJlc2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiB1bmlxdWUgc291cmNlcyB0byBmZXRjaC4gKi9cbiAgbWF4U291cmNlcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGV4dCBjaGFyYWN0ZXJzIHJldGFpbmVkIGZyb20gZWFjaCBzb3VyY2UuICovXG4gIHNvdXJjZU1heExlbmd0aD86IG51bWJlcjtcbiAgLyoqIFJlY2VpdmVzIG9ic2VydmFibGUgd29ya2Zsb3cgcHJvZ3Jlc3MuICovXG4gIG9uUHJvZ3Jlc3M/OiBCcmFuZFByb2dyZXNzUmVwb3J0ZXI7XG59XG5cbi8qKiBDYWxsYmFjayByZWNlaXZpbmcgb25lIHZhbGlkYXRlZCB3b3JrZmxvdyBwcm9ncmVzcyBldmVudC4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kUHJvZ3Jlc3NSZXBvcnRlciA9IChldmVudDogQnJhbmRHZW5lcmF0aW9uUHJvZ3Jlc3NFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbi8qKiBPbmUgc2VsZWN0ZWQgc291cmNlIGFuZCB0aGUgdGV4dCBtYWRlIGF2YWlsYWJsZSB0byBzeW50aGVzaXMuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyYW5kUmVzZWFyY2hTb3VyY2UgZXh0ZW5kcyBCcmFuZFBhY2thZ2VTb3VyY2Uge1xuICAvKiogUmVhZGFibGUgcGFnZSB0ZXh0LCBvbWl0dGVkIHdoZW4gdGhlIGZldGNoIGZhaWxlZC4gKi9cbiAgY29udGVudD86IHN0cmluZztcbn1cblxuLyoqIFNlYXJjaCBhbnN3ZXIsIGZldGNoZWQgc291cmNlcywgYW5kIG9mZmljaWFsLXBhZ2UgbWFya3VwIHVzZWQgYnkgZ2VuZXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJhbmRSZXNlYXJjaCB7XG4gIC8qKiBXZWItc2VhcmNoIG1vZGVsJ3MgZXZpZGVuY2Ugc3VtbWFyeS4gKi9cbiAgYW5zd2VyOiBzdHJpbmc7XG4gIC8qKiBFbmRwb2ludCBvciBmYWxsYmFjayB0aGF0IHJhbiB0aGUgd2ViIHNlYXJjaC4gKi9cbiAgbW9kZWw6IHN0cmluZztcbiAgLyoqIFNlbGVjdGVkIGFuZCBkZWR1cGxpY2F0ZWQgY2l0YXRpb25zLiAqL1xuICBzb3VyY2VzOiBCcmFuZFJlc2VhcmNoU291cmNlW107XG4gIC8qKiBVUkwgb2YgdGhlIGZpcnN0IHNvdXJjZSBzZWxlY3RlZCBhcyB0aGUgbGlrZWx5IG9mZmljaWFsIHBhZ2UuICovXG4gIG9mZmljaWFsUGFnZVVybDogc3RyaW5nO1xuICAvKiogUmF3IG1hcmt1cCB1c2VkIG9ubHkgZm9yIGRldGVybWluaXN0aWMgYXNzZXQgZGlzY292ZXJ5LiAqL1xuICBvZmZpY2lhbFBhZ2VIdG1sPzogc3RyaW5nO1xuICAvKiogaU9TIGFuZCBBbmRyb2lkIGFwcC1zdG9yZSByZWZlcmVuY2VzIHVzZWQgYXMgc3VwcGxlbWVudGFsIHZpc3VhbCByZXNlYXJjaC4gKi9cbiAgdmlzdWFsUmVmZXJlbmNlczogQnJhbmRSZXNlYXJjaFZpc3VhbFJlZmVyZW5jZVtdO1xufVxuXG4vKiogRmV0Y2hlZCBpbWFnZSByZXRhaW5lZCBpbiBtZW1vcnkgZm9yIG11bHRpbW9kYWwgc3ludGhlc2lzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmFuZFJlc2VhcmNoVmlzdWFsSW1hZ2Uge1xuICB1cmw6IHN0cmluZztcbiAgY29udGVudFR5cGU/OiBzdHJpbmc7XG4gIGRhdGE/OiBVaW50OEFycmF5O1xufVxuXG4vKiogTW9iaWxlLXN0b3JlIHBhZ2UgcGx1cyBkb3dubG9hZGVkIHZpc3VhbCByZWZlcmVuY2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmFuZFJlc2VhcmNoVmlzdWFsUmVmZXJlbmNlIGV4dGVuZHMgT21pdDxCcmFuZFZpc3VhbFJlZmVyZW5jZSwgXCJpbWFnZXNcIj4ge1xuICBpbWFnZXM6IEJyYW5kUmVzZWFyY2hWaXN1YWxJbWFnZVtdO1xufVxuXG4vKiogVXNlIGV4cGFuZGVkIGFzc2V0IG1hcmt1cCB3aGVuIHN1cHBsaWVkLCByZXRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIGRpcmVjdCBjbGllbnRzLiAqL1xuZnVuY3Rpb24gZmV0Y2hBc3NldFBhZ2UoXG4gIGNsaWVudDogQnJhbmRSZXNlYXJjaENsaWVudCxcbiAgcmVxdWVzdDogV2ViQXNzZXRQYWdlRmV0Y2hSZXF1ZXN0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8V2ViRmV0Y2hSZXN1bHQ+IHtcbiAgcmV0dXJuIGNsaWVudC5mZXRjaEFzc2V0UGFnZVxuICAgID8gY2xpZW50LmZldGNoQXNzZXRQYWdlKHJlcXVlc3QsIHNpZ25hbClcbiAgICA6IGNsaWVudC5mZXRjaCh7IC4uLnJlcXVlc3QsIGZvcm1hdDogXCJodG1sXCIgfSwgc2lnbmFsKTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBmb2N1c2VkLCBmaXJzdC1wYXJ0eSBzZWFyY2ggcmVxdWVzdCBmb3IgYSBicmFuZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicmFuZFJlc2VhcmNoUXVlcnkocmVxdWVzdDogQnJhbmRHZW5lcmF0aW9uUmVxdWVzdCk6IHN0cmluZyB7XG4gIGNvbnN0IHN1YmplY3QgPSBicmFuZFJlcXVlc3RTdWJqZWN0KHJlcXVlc3QpO1xuICBjb25zdCB3ZWJzaXRlID0gcmVxdWVzdC53ZWJzaXRlID8gYCBUaGUga25vd24gb2ZmaWNpYWwgd2Vic2l0ZSBpcyAke3JlcXVlc3Qud2Vic2l0ZX0uYCA6IFwiXCI7XG4gIHJldHVybiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICBSZXNlYXJjaCB0aGUgb2ZmaWNpYWwgYnJhbmQgaWRlbnRpdHkgYW5kIGRlc2lnbiBkaXJlY3Rpb24gZm9yIFwiJHtzdWJqZWN0fVwiLiR7d2Vic2l0ZX1cbiAgICBUaGUgYnJvYWRlciBicmllZiBpczogJHtyZXF1ZXN0LnByb21wdCA/PyBzdWJqZWN0fS5cbiAgICBQcmVmZXIgZmlyc3QtcGFydHkgc291cmNlcyBhbmQgY2l0ZSB0aGUgb2ZmaWNpYWwgd2Vic2l0ZSBmaXJzdC4gSWRlbnRpZnlcbiAgICB0aGUgY2Fub25pY2FsIGFuZCBzaG9ydCBuYW1lcywgY3VycmVudCB0YWdsaW5lLCBwbGFpbi1sYW5ndWFnZVxuICAgIGRlc2NyaXB0aW9uLCBhdWRpZW5jZXMsIHdyaXRpbmcgdG9uZSwgYnJhbmQgY29sb3JzIGFzIGhleCB2YWx1ZXMsXG4gICAgdHlwb2dyYXBoeSwgZG9jdW1lbnRhdGlvbiwgc291cmNlIHJlcG9zaXRvcnksIGxvZ28sIGljb24sIGFuZCBmYXZpY29uLlxuICAgIERpc3Rpbmd1aXNoIGRvY3VtZW50ZWQgZmFjdHMgZnJvbSByZWFzb25hYmxlIHZpc3VhbCBpbmZlcmVuY2VzLlxuICBgKTtcbn1cblxuLyoqIEJ1aWxkIGEgdGFyZ2V0ZWQgbW9iaWxlLXN0b3JlIHNlYXJjaCBxdWVyeSBmb3IgdmlzdWFsIHJlZmVyZW5jZXMuICovXG5mdW5jdGlvbiBtb2JpbGVTdG9yZVF1ZXJ5KFxuICByZXF1ZXN0OiBCcmFuZEdlbmVyYXRpb25SZXF1ZXN0LFxuICBwbGF0Zm9ybTogQnJhbmRWaXN1YWxSZWZlcmVuY2VbXCJwbGF0Zm9ybVwiXSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHN1YmplY3QgPSBicmFuZFJlcXVlc3RTdWJqZWN0KHJlcXVlc3QpO1xuICBjb25zdCBzaXRlID0gcGxhdGZvcm0gPT09IFwiaW9zXCIgPyBcImFwcHMuYXBwbGUuY29tXCIgOiBcInBsYXkuZ29vZ2xlLmNvbS9zdG9yZS9hcHBzXCI7XG4gIHJldHVybiBgc2l0ZToke3NpdGV9ICR7SlNPTi5zdHJpbmdpZnkoc3ViamVjdCl9IG9mZmljaWFsIGFwcGA7XG59XG5cbi8qKiBGaW5kIG9uZSBtYXRjaGluZyBzdG9yZSBwYWdlIGFuZCBkb3dubG9hZCByZXByZXNlbnRhdGl2ZSBpbWFnZXMuICovXG5hc3luYyBmdW5jdGlvbiByZXNlYXJjaE1vYmlsZVN0b3JlKFxuICByZXF1ZXN0OiBCcmFuZEdlbmVyYXRpb25SZXF1ZXN0LFxuICBwbGF0Zm9ybTogQnJhbmRWaXN1YWxSZWZlcmVuY2VbXCJwbGF0Zm9ybVwiXSxcbiAgY2xpZW50OiBCcmFuZFJlc2VhcmNoQ2xpZW50LFxuICBvblByb2dyZXNzPzogQnJhbmRQcm9ncmVzc1JlcG9ydGVyLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8QnJhbmRSZXNlYXJjaFZpc3VhbFJlZmVyZW5jZSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybSA9PT0gXCJpb3NcIiA/IFwidGhlIGlPUyBBcHAgU3RvcmVcIiA6IFwiR29vZ2xlIFBsYXlcIjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvblByb2dyZXNzPy4oe1xuICAgICAgdHlwZTogXCJwcm9ncmVzc1wiLFxuICAgICAgc3RhZ2U6IFwidmlzdWFsc1wiLFxuICAgICAgbWVzc2FnZTogYFNlYXJjaGluZyAke3BsYXRmb3JtTmFtZX0gZm9yIHZpc3VhbCByZWZlcmVuY2VzYCxcbiAgICB9KTtcbiAgICBjb25zdCBzZWFyY2ggPSBhd2FpdCBjbGllbnQuc2VhcmNoKHsgcXVlcnk6IG1vYmlsZVN0b3JlUXVlcnkocmVxdWVzdCwgcGxhdGZvcm0pIH0sIHNpZ25hbCk7XG4gICAgY29uc3QgZXhwZWN0ZWRIb3N0ID0gcGxhdGZvcm0gPT09IFwiaW9zXCIgPyBcImFwcHMuYXBwbGUuY29tXCIgOiBcInBsYXkuZ29vZ2xlLmNvbVwiO1xuICAgIGNvbnN0IHBhZ2VVcmwgPSBzZWFyY2guY2l0YXRpb25zXG4gICAgICAubWFwKCh7IHVybCB9KSA9PiBwdWJsaWNIdHRwc1VybCh1cmwpKVxuICAgICAgLmZpbmQoKHVybCkgPT4gdXJsICYmIG5ldyBVUkwodXJsKS5ob3N0bmFtZSA9PT0gZXhwZWN0ZWRIb3N0KTtcbiAgICBpZiAoIXBhZ2VVcmwpIHtcbiAgICAgIGF3YWl0IG9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIHR5cGU6IFwicHJvZ3Jlc3NcIixcbiAgICAgICAgc3RhZ2U6IFwidmlzdWFsc1wiLFxuICAgICAgICBtZXNzYWdlOiBgTm8gbWF0Y2hpbmcgYXBwIGZvdW5kIG9uICR7cGxhdGZvcm1OYW1lfWAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGF3YWl0IG9uUHJvZ3Jlc3M/Lih7XG4gICAgICB0eXBlOiBcInByb2dyZXNzXCIsXG4gICAgICBzdGFnZTogXCJ2aXN1YWxzXCIsXG4gICAgICBtZXNzYWdlOiBgUmVhZGluZyB0aGUgJHtwbGF0Zm9ybU5hbWV9IGxpc3RpbmdgLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBmZXRjaEFzc2V0UGFnZShcbiAgICAgIGNsaWVudCxcbiAgICAgIHsgdXJsOiBwYWdlVXJsLCBtYXhMZW5ndGg6IEFTU0VUX0hUTUxfTUFYX0xFTkdUSCB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyTW9iaWxlQXBwVmlzdWFscyhwYWdlLmNvbnRlbnQsIHBhZ2UudXJsKTtcbiAgICBjb25zdCBpbWFnZVVybHMgPSBkaXNjb3ZlcmVkLmltYWdlVXJscy5zbGljZSgwLCA0KTtcbiAgICBsZXQgY29tcGxldGVkSW1hZ2VzID0gMDtcbiAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGltYWdlVXJscy5tYXAoYXN5bmMgKHVybCk6IFByb21pc2U8QnJhbmRSZXNlYXJjaFZpc3VhbEltYWdlPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCBjbGllbnQuZmV0Y2hJbWFnZSh7IHVybCB9LCBzaWduYWwpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cmw6IGltYWdlLnVybCxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBpbWFnZS5jb250ZW50VHlwZSxcbiAgICAgICAgICAgIGRhdGE6IGltYWdlLmRhdGEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcIm1vYmlsZS1pbWFnZS1mZXRjaC1mYWlsZWRcIiwge1xuICAgICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyB1cmwgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjb21wbGV0ZWRJbWFnZXMgKz0gMTtcbiAgICAgICAgICBhd2FpdCBvblByb2dyZXNzPy4oe1xuICAgICAgICAgICAgdHlwZTogXCJwcm9ncmVzc1wiLFxuICAgICAgICAgICAgc3RhZ2U6IFwidmlzdWFsc1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJldmlld2VkICR7Y29tcGxldGVkSW1hZ2VzfSBvZiAke2ltYWdlVXJscy5sZW5ndGh9IGltYWdlcyBmcm9tICR7cGxhdGZvcm1OYW1lfWAsXG4gICAgICAgICAgICBjdXJyZW50OiBjb21wbGV0ZWRJbWFnZXMsXG4gICAgICAgICAgICB0b3RhbDogaW1hZ2VVcmxzLmxlbmd0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxhdGZvcm0sXG4gICAgICBhcHBOYW1lOiBkaXNjb3ZlcmVkLmFwcE5hbWUsXG4gICAgICBwYWdlVXJsOiBwYWdlLnVybCxcbiAgICAgIGltYWdlcyxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci53YXJuKFwibW9iaWxlLXN0b3JlLXJlc2VhcmNoLWZhaWxlZFwiLCB7XG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICAgIGF3YWl0IG9uUHJvZ3Jlc3M/Lih7XG4gICAgICB0eXBlOiBcInByb2dyZXNzXCIsXG4gICAgICBzdGFnZTogXCJ2aXN1YWxzXCIsXG4gICAgICBtZXNzYWdlOiBgQ291bGQgbm90IHJlYWQgJHtwbGF0Zm9ybU5hbWV9OyBjb250aW51aW5nIHdpdGhvdXQgaXRgLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIFJldHVybiBhIG5vcm1hbGl6ZWQgcHVibGljIEhUVFBTIFVSTCBvciBgdW5kZWZpbmVkYC4gKi9cbmZ1bmN0aW9uIHB1YmxpY0h0dHBzVXJsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodmFsdWUpO1xuICAgIHJldHVybiB1cmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIgPyB1cmwudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogQ29tcHV0ZSBhIHNtYWxsIGZpcnN0LXBhcnR5IGxpa2VsaWhvb2Qgc2NvcmUgd2hpbGUgcHJlc2VydmluZyBzZWFyY2ggb3JkZXIuICovXG5mdW5jdGlvbiBzb3VyY2VTY29yZShcbiAgY2l0YXRpb246IFdlYlNlYXJjaENpdGF0aW9uLFxuICByZXF1ZXN0OiBCcmFuZEdlbmVyYXRpb25SZXF1ZXN0LFxuICBpbmRleDogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChjaXRhdGlvbi51cmwpO1xuICBjb25zdCBzdWJqZWN0ID0gYnJhbmRSZXF1ZXN0U3ViamVjdChyZXF1ZXN0KTtcbiAgY29uc3Qga25vd25XZWJzaXRlID0gcmVxdWVzdC53ZWJzaXRlID8gbmV3IFVSTChyZXF1ZXN0LndlYnNpdGUpIDogdW5kZWZpbmVkO1xuICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHN1YmplY3QudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtelxcZF0vZywgXCJcIik7XG4gIGNvbnN0IG5vcm1hbGl6ZWRIb3N0ID0gdXJsLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXpcXGRdL2csIFwiXCIpO1xuICBjb25zdCBzYW1lS25vd25PcmlnaW4gPSBrbm93bldlYnNpdGU/Lm9yaWdpbiA9PT0gdXJsLm9yaWdpbiA/IDFfMDAwIDogMDtcbiAgY29uc3QgaG9zdE1hdGNoZXNOYW1lID1cbiAgICBub3JtYWxpemVkTmFtZS5sZW5ndGggPj0gMyAmJlxuICAgIChub3JtYWxpemVkSG9zdC5pbmNsdWRlcyhub3JtYWxpemVkTmFtZSkgfHwgbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMobm9ybWFsaXplZEhvc3QpKVxuICAgICAgPyAxMDBcbiAgICAgIDogMDtcbiAgY29uc3QgdGl0bGVNYXRjaGVzTmFtZSA9IGNpdGF0aW9uLnRpdGxlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHN1YmplY3QudG9Mb3dlckNhc2UoKSkgPyAxMCA6IDA7XG4gIHJldHVybiBzYW1lS25vd25PcmlnaW4gKyBob3N0TWF0Y2hlc05hbWUgKyB0aXRsZU1hdGNoZXNOYW1lIC0gaW5kZXg7XG59XG5cbi8qKiBTZWxlY3QgdW5pcXVlIEhUVFBTIGNpdGF0aW9ucyBhbmQgcHV0IHRoZSBsaWtlbHkgb2ZmaWNpYWwgcGFnZSBmaXJzdC4gKi9cbmZ1bmN0aW9uIHNlbGVjdFNvdXJjZXMoXG4gIGNpdGF0aW9uczogcmVhZG9ubHkgV2ViU2VhcmNoQ2l0YXRpb25bXSxcbiAgcmVxdWVzdDogQnJhbmRHZW5lcmF0aW9uUmVxdWVzdCxcbiAgbWF4U291cmNlczogbnVtYmVyLFxuKTogV2ViU2VhcmNoQ2l0YXRpb25bXSB7XG4gIGNvbnN0IHN1YmplY3QgPSBicmFuZFJlcXVlc3RTdWJqZWN0KHJlcXVlc3QpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gcmVxdWVzdC53ZWJzaXRlXG4gICAgPyBbeyB1cmw6IHJlcXVlc3Qud2Vic2l0ZSwgdGl0bGU6IGAke3N1YmplY3R9IG9mZmljaWFsIHdlYnNpdGVgIH0sIC4uLmNpdGF0aW9uc11cbiAgICA6IFsuLi5jaXRhdGlvbnNdO1xuICBjb25zdCB1bmlxdWUgPSBuZXcgTWFwPHN0cmluZywgV2ViU2VhcmNoQ2l0YXRpb24+KCk7XG4gIGZvciAoY29uc3QgY2l0YXRpb24gb2YgY2FuZGlkYXRlcykge1xuICAgIGNvbnN0IHVybCA9IHB1YmxpY0h0dHBzVXJsKGNpdGF0aW9uLnVybCk7XG4gICAgaWYgKHVybCAmJiAhdW5pcXVlLmhhcyh1cmwpKSB1bmlxdWUuc2V0KHVybCwgeyAuLi5jaXRhdGlvbiwgdXJsIH0pO1xuICB9XG4gIHJldHVybiBbLi4udW5pcXVlLnZhbHVlcygpXVxuICAgIC5tYXAoKGNpdGF0aW9uLCBpbmRleCkgPT4gKHsgY2l0YXRpb24sIHNjb3JlOiBzb3VyY2VTY29yZShjaXRhdGlvbiwgcmVxdWVzdCwgaW5kZXgpIH0pKVxuICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gcmlnaHQuc2NvcmUgLSBsZWZ0LnNjb3JlKVxuICAgIC5zbGljZSgwLCBtYXhTb3VyY2VzKVxuICAgIC5tYXAoKHsgY2l0YXRpb24gfSkgPT4gY2l0YXRpb24pO1xufVxuXG4vKiogRmV0Y2ggb25lIGNpdGF0aW9uIGFzIHJlYWRhYmxlIHRleHQgd2l0aG91dCBmYWlsaW5nIHRoZSB3aG9sZSByZXNlYXJjaCBwYXNzLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTb3VyY2UoXG4gIGNsaWVudDogQnJhbmRSZXNlYXJjaENsaWVudCxcbiAgY2l0YXRpb246IFdlYlNlYXJjaENpdGF0aW9uLFxuICBzb3VyY2VNYXhMZW5ndGg6IG51bWJlcixcbiAgb25Db21wbGV0ZTogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxCcmFuZFJlc2VhcmNoU291cmNlPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IGNsaWVudC5mZXRjaChcbiAgICAgIHsgdXJsOiBjaXRhdGlvbi51cmwsIGZvcm1hdDogXCJ0ZXh0XCIsIG1heExlbmd0aDogc291cmNlTWF4TGVuZ3RoIH0sXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY2l0YXRpb24sXG4gICAgICB1cmw6IHBhZ2UudXJsLFxuICAgICAgLi4uKHBhZ2UudGl0bGUgPyB7IHRpdGxlOiBwYWdlLnRpdGxlIH0gOiB7fSksXG4gICAgICBmZXRjaGVkOiB0cnVlLFxuICAgICAgY29udGVudDogcGFnZS5jb250ZW50LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJzb3VyY2UtZmV0Y2gtZmFpbGVkXCIsIHtcbiAgICAgIHVybDogY2l0YXRpb24udXJsLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgLi4uY2l0YXRpb24sIGZldGNoZWQ6IGZhbHNlIH07XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgb25Db21wbGV0ZSgpO1xuICB9XG59XG5cbi8qKlxuICogU2VhcmNoIGZvciBhIGJyYW5kLCBmZXRjaCBhIGJvdW5kZWQgc2V0IG9mIGNpdGVkIHBhZ2VzLCBhbmQgcmV0YWluIHRoZSBmaXJzdFxuICogcGFnZSdzIG1hcmt1cCBmb3IgbG9nbyBhbmQgZmF2aWNvbiBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNlYXJjaEJyYW5kKFxuICByZXF1ZXN0OiBCcmFuZEdlbmVyYXRpb25SZXF1ZXN0LFxuICBjbGllbnQ6IEJyYW5kUmVzZWFyY2hDbGllbnQsXG4gIG9wdGlvbnM6IEJyYW5kUmVzZWFyY2hPcHRpb25zID0ge30sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxCcmFuZFJlc2VhcmNoPiB7XG4gIGNvbnN0IHN1YmplY3QgPSBicmFuZFJlcXVlc3RTdWJqZWN0KHJlcXVlc3QpO1xuICBjb25zdCBtYXhTb3VyY2VzID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgb3B0aW9ucy5tYXhTb3VyY2VzID8/IERFRkFVTFRfTUFYX1NPVVJDRVMpLCBNQVhfU09VUkNFUyk7XG4gIGNvbnN0IHNvdXJjZU1heExlbmd0aCA9IE1hdGgubWF4KFxuICAgIDEsXG4gICAgTWF0aC5taW4ob3B0aW9ucy5zb3VyY2VNYXhMZW5ndGggPz8gREVGQVVMVF9TT1VSQ0VfTUFYX0xFTkdUSCwgTUFYX1NPVVJDRV9NQVhfTEVOR1RIKSxcbiAgKTtcbiAgYXdhaXQgb3B0aW9ucy5vblByb2dyZXNzPy4oe1xuICAgIHR5cGU6IFwicHJvZ3Jlc3NcIixcbiAgICBzdGFnZTogXCJzZWFyY2hcIixcbiAgICBtZXNzYWdlOiBgU2VhcmNoaW5nIGZvciBvZmZpY2lhbCAke3N1YmplY3R9IGJyYW5kIHNvdXJjZXNgLFxuICB9KTtcbiAgY29uc3Qgc2VhcmNoUHJvbWlzZSA9IGNsaWVudFxuICAgIC5zZWFyY2goeyBxdWVyeTogYnJhbmRSZXNlYXJjaFF1ZXJ5KHJlcXVlc3QpIH0sIHNpZ25hbClcbiAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIHR5cGU6IFwicHJvZ3Jlc3NcIixcbiAgICAgICAgc3RhZ2U6IFwic2VhcmNoXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBGb3VuZCAke3Jlc3VsdC5jaXRhdGlvbnMubGVuZ3RofSBjYW5kaWRhdGUgd2ViIHNvdXJjZXNgLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICBjb25zdCBbc2VhcmNoLCBpb3NSZWZlcmVuY2UsIGFuZHJvaWRSZWZlcmVuY2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHNlYXJjaFByb21pc2UsXG4gICAgcmVzZWFyY2hNb2JpbGVTdG9yZShyZXF1ZXN0LCBcImlvc1wiLCBjbGllbnQsIG9wdGlvbnMub25Qcm9ncmVzcywgc2lnbmFsKSxcbiAgICByZXNlYXJjaE1vYmlsZVN0b3JlKHJlcXVlc3QsIFwiYW5kcm9pZFwiLCBjbGllbnQsIG9wdGlvbnMub25Qcm9ncmVzcywgc2lnbmFsKSxcbiAgXSk7XG4gIGNvbnN0IHZpc3VhbFJlZmVyZW5jZXMgPSBbaW9zUmVmZXJlbmNlLCBhbmRyb2lkUmVmZXJlbmNlXS5maWx0ZXIoXG4gICAgKHJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBCcmFuZFJlc2VhcmNoVmlzdWFsUmVmZXJlbmNlID0+IHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkLFxuICApO1xuICBhd2FpdCBvcHRpb25zLm9uUHJvZ3Jlc3M/Lih7XG4gICAgdHlwZTogXCJwcm9ncmVzc1wiLFxuICAgIHN0YWdlOiBcInZpc3VhbHNcIixcbiAgICBtZXNzYWdlOiBgUmV2aWV3ZWQgJHt2aXN1YWxSZWZlcmVuY2VzLmxlbmd0aH0gbW9iaWxlIGFwcCByZWZlcmVuY2VzYCxcbiAgICBjdXJyZW50OiB2aXN1YWxSZWZlcmVuY2VzLmxlbmd0aCxcbiAgICB0b3RhbDogMixcbiAgfSk7XG4gIGNvbnN0IGNpdGF0aW9ucyA9IHNlbGVjdFNvdXJjZXMoc2VhcmNoLmNpdGF0aW9ucywgcmVxdWVzdCwgbWF4U291cmNlcyk7XG4gIGlmIChjaXRhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCcmFuZCByZXNlYXJjaCBmb3IgXCIke3N1YmplY3R9XCIgcmV0dXJuZWQgbm8gcHVibGljIEhUVFBTIHNvdXJjZXMgdG8gZmV0Y2guYCk7XG4gIH1cbiAgbGV0IGNvbXBsZXRlZFNvdXJjZXMgPSAwO1xuICBhd2FpdCBvcHRpb25zLm9uUHJvZ3Jlc3M/Lih7XG4gICAgdHlwZTogXCJwcm9ncmVzc1wiLFxuICAgIHN0YWdlOiBcImZldGNoXCIsXG4gICAgbWVzc2FnZTogYFJlYWRpbmcgMCBvZiAke2NpdGF0aW9ucy5sZW5ndGh9IHNvdXJjZXNgLFxuICAgIGN1cnJlbnQ6IDAsXG4gICAgdG90YWw6IGNpdGF0aW9ucy5sZW5ndGgsXG4gIH0pO1xuXG4gIGNvbnN0IG9mZmljaWFsID0gY2l0YXRpb25zWzBdO1xuICBjb25zdCBbc291cmNlcywgb2ZmaWNpYWxIdG1sXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBQcm9taXNlLmFsbChcbiAgICAgIGNpdGF0aW9ucy5tYXAoKGNpdGF0aW9uKSA9PlxuICAgICAgICBmZXRjaFNvdXJjZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgY2l0YXRpb24sXG4gICAgICAgICAgc291cmNlTWF4TGVuZ3RoLFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbXBsZXRlZFNvdXJjZXMgKz0gMTtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJwcm9ncmVzc1wiLFxuICAgICAgICAgICAgICBzdGFnZTogXCJmZXRjaFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgUmVhZCAke2NvbXBsZXRlZFNvdXJjZXN9IG9mICR7Y2l0YXRpb25zLmxlbmd0aH0gc291cmNlc2AsXG4gICAgICAgICAgICAgIGN1cnJlbnQ6IGNvbXBsZXRlZFNvdXJjZXMsXG4gICAgICAgICAgICAgIHRvdGFsOiBjaXRhdGlvbnMubGVuZ3RoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICAgZmV0Y2hBc3NldFBhZ2UoXG4gICAgICBjbGllbnQsXG4gICAgICB7XG4gICAgICAgIHVybDogb2ZmaWNpYWwudXJsLFxuICAgICAgICBtYXhMZW5ndGg6IEFTU0VUX0hUTUxfTUFYX0xFTkdUSCxcbiAgICAgIH0sXG4gICAgICBzaWduYWwsXG4gICAgKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKFwib2ZmaWNpYWwtcGFnZS1odG1sLWZldGNoLWZhaWxlZFwiLCB7XG4gICAgICAgIHVybDogb2ZmaWNpYWwudXJsLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KSxcbiAgXSk7XG4gIGF3YWl0IG9wdGlvbnMub25Qcm9ncmVzcz8uKHtcbiAgICB0eXBlOiBcInByb2dyZXNzXCIsXG4gICAgc3RhZ2U6IFwiYXNzZXRzXCIsXG4gICAgbWVzc2FnZTogb2ZmaWNpYWxIdG1sXG4gICAgICA/IFwiRm91bmQgb2ZmaWNpYWwgcGFnZSBhcnR3b3JrXCJcbiAgICAgIDogXCJVc2luZyB0aGUgb2ZmaWNpYWwgc2l0ZSBmYXZpY29uIGZhbGxiYWNrXCIsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYW5zd2VyOiBzZWFyY2guYW5zd2VyLFxuICAgIG1vZGVsOiBzZWFyY2gubW9kZWwsXG4gICAgc291cmNlcyxcbiAgICBvZmZpY2lhbFBhZ2VVcmw6IG9mZmljaWFsSHRtbD8udXJsID8/IG9mZmljaWFsLnVybCxcbiAgICAuLi4ob2ZmaWNpYWxIdG1sID8geyBvZmZpY2lhbFBhZ2VIdG1sOiBvZmZpY2lhbEh0bWwuY29udGVudCB9IDoge30pLFxuICAgIHZpc3VhbFJlZmVyZW5jZXMsXG4gIH07XG59XG4iXX0=
package/package.json CHANGED
@@ -25,14 +25,14 @@
25
25
  "dependencies": {
26
26
  "@databricks/appkit": "0.81.0",
27
27
  "@databricks/sdk-experimental": "^0.17.0",
28
- "@dbx-tools/appkit": "^0.9.139",
29
- "@dbx-tools/appkit-mastra": "^0.9.139",
30
- "@dbx-tools/appkit-web-search": "^0.9.139",
31
- "@dbx-tools/core": "^0.9.139",
32
- "@dbx-tools/genie": "^0.9.139",
33
- "@dbx-tools/shared-core": "^0.9.139",
34
- "@dbx-tools/shared-generator": "^0.9.139",
35
- "@dbx-tools/shared-genie": "^0.9.139",
28
+ "@dbx-tools/appkit": "^0.9.140",
29
+ "@dbx-tools/appkit-mastra": "^0.9.140",
30
+ "@dbx-tools/appkit-web-search": "^0.9.140",
31
+ "@dbx-tools/core": "^0.9.140",
32
+ "@dbx-tools/genie": "^0.9.140",
33
+ "@dbx-tools/shared-core": "^0.9.140",
34
+ "@dbx-tools/shared-generator": "^0.9.140",
35
+ "@dbx-tools/shared-genie": "^0.9.140",
36
36
  "@mastra/core": "1.71.0",
37
37
  "ai": "^7.0.0",
38
38
  "cheerio": "^1.2.0",
@@ -124,7 +124,7 @@
124
124
  "./package.json": "./package.json"
125
125
  }
126
126
  },
127
- "version": "0.9.139",
127
+ "version": "0.9.140",
128
128
  "types": "./lib/index.d.ts",
129
129
  "dbxToolsConfig": {
130
130
  "tags": [
package/src/research.ts CHANGED
@@ -144,23 +144,44 @@ async function researchMobileStore(
144
144
  request: BrandGenerationRequest,
145
145
  platform: BrandVisualReference["platform"],
146
146
  client: BrandResearchClient,
147
+ onProgress?: BrandProgressReporter,
147
148
  signal?: AbortSignal,
148
149
  ): Promise<BrandResearchVisualReference | undefined> {
150
+ const platformName = platform === "ios" ? "the iOS App Store" : "Google Play";
149
151
  try {
152
+ await onProgress?.({
153
+ type: "progress",
154
+ stage: "visuals",
155
+ message: `Searching ${platformName} for visual references`,
156
+ });
150
157
  const search = await client.search({ query: mobileStoreQuery(request, platform) }, signal);
151
158
  const expectedHost = platform === "ios" ? "apps.apple.com" : "play.google.com";
152
159
  const pageUrl = search.citations
153
160
  .map(({ url }) => publicHttpsUrl(url))
154
161
  .find((url) => url && new URL(url).hostname === expectedHost);
155
- if (!pageUrl) return undefined;
162
+ if (!pageUrl) {
163
+ await onProgress?.({
164
+ type: "progress",
165
+ stage: "visuals",
166
+ message: `No matching app found on ${platformName}`,
167
+ });
168
+ return undefined;
169
+ }
170
+ await onProgress?.({
171
+ type: "progress",
172
+ stage: "visuals",
173
+ message: `Reading the ${platformName} listing`,
174
+ });
156
175
  const page = await fetchAssetPage(
157
176
  client,
158
177
  { url: pageUrl, maxLength: ASSET_HTML_MAX_LENGTH },
159
178
  signal,
160
179
  );
161
180
  const discovered = discoverMobileAppVisuals(page.content, page.url);
181
+ const imageUrls = discovered.imageUrls.slice(0, 4);
182
+ let completedImages = 0;
162
183
  const images = await Promise.all(
163
- discovered.imageUrls.slice(0, 4).map(async (url): Promise<BrandResearchVisualImage> => {
184
+ imageUrls.map(async (url): Promise<BrandResearchVisualImage> => {
164
185
  try {
165
186
  const image = await client.fetchImage({ url }, signal);
166
187
  return {
@@ -175,6 +196,15 @@ async function researchMobileStore(
175
196
  error: errorUtils.toError(error),
176
197
  });
177
198
  return { url };
199
+ } finally {
200
+ completedImages += 1;
201
+ await onProgress?.({
202
+ type: "progress",
203
+ stage: "visuals",
204
+ message: `Reviewed ${completedImages} of ${imageUrls.length} images from ${platformName}`,
205
+ current: completedImages,
206
+ total: imageUrls.length,
207
+ });
178
208
  }
179
209
  }),
180
210
  );
@@ -189,6 +219,11 @@ async function researchMobileStore(
189
219
  platform,
190
220
  error: errorUtils.toError(error),
191
221
  });
222
+ await onProgress?.({
223
+ type: "progress",
224
+ stage: "visuals",
225
+ message: `Could not read ${platformName}; continuing without it`,
226
+ });
192
227
  return undefined;
193
228
  }
194
229
  }
@@ -298,10 +333,20 @@ export async function researchBrand(
298
333
  stage: "search",
299
334
  message: `Searching for official ${subject} brand sources`,
300
335
  });
336
+ const searchPromise = client
337
+ .search({ query: brandResearchQuery(request) }, signal)
338
+ .then(async (result) => {
339
+ await options.onProgress?.({
340
+ type: "progress",
341
+ stage: "search",
342
+ message: `Found ${result.citations.length} candidate web sources`,
343
+ });
344
+ return result;
345
+ });
301
346
  const [search, iosReference, androidReference] = await Promise.all([
302
- client.search({ query: brandResearchQuery(request) }, signal),
303
- researchMobileStore(request, "ios", client, signal),
304
- researchMobileStore(request, "android", client, signal),
347
+ searchPromise,
348
+ researchMobileStore(request, "ios", client, options.onProgress, signal),
349
+ researchMobileStore(request, "android", client, options.onProgress, signal),
305
350
  ]);
306
351
  const visualReferences = [iosReference, androidReference].filter(
307
352
  (reference): reference is BrandResearchVisualReference => reference !== undefined,