@decaf-ts/for-nest 0.11.2-refactor.8 → 0.11.2-refactor.9

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/dist/for-nest.cjs CHANGED
@@ -2118,7 +2118,13 @@
2118
2118
  const asModel = typeof resolved !== "string" && isModelConstructor(resolved);
2119
2119
  const token = asModel ? modelServiceToken(resolved) : core.injectableServiceKey(resolved);
2120
2120
  registerProvider(token, () => {
2121
- if (asModel) return core.ModelService.forModel(resolved);
2121
+ if (asModel) {
2122
+ try {
2123
+ return core.Service.get(resolved);
2124
+ } catch {
2125
+ return core.ModelService.forModel(resolved);
2126
+ }
2127
+ }
2122
2128
  return typeof resolved === "string" ? core.Service.get(resolved) : core.Service.get(resolved);
2123
2129
  });
2124
2130
  return common.Inject(token)(target, propertyKey, parameterIndex);
@@ -2459,4 +2465,4 @@
2459
2465
  exports.resolvePersistenceMethod = resolvePersistenceMethod;
2460
2466
  exports.runMigrations = runMigrations;
2461
2467
  });
2462
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvb3ZlcnJpZGVzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9vdmVycmlkZXMvaGVscGVycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaU9wZXJhdGlvbkZyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaVBhcmFtc0Zyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmQm9keS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmUGFyYW1zLnRzIiwiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2V4cG9zZS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2NvbnRyb2xsZXItY29uZmlnLnRzIiwiLi4vc3JjL2F1dGgvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dC50cyIsIi4uL3NyYy9hdXRoL0F1dGhJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9hdXRoL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy91dGlscy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC91dGlscy50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aEhhbmRsZXIudHMiLCIuLi9zcmMvYXV0aC9EZWNhZkF1dGhNb2R1bGUudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZkhhbmRsZXJFeGVjdXRvci50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmUmVzcG9uc2VJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9jb250cm9sbGVycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlci50cyIsIi4uL3NyYy9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL0Zyb21Nb2RlbENvbnRyb2xsZXIudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRGVjYWZNb2RlbE1vZHVsZS50cyIsIi4uL3NyYy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXJyb3JzL2NvcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvdGhyb3R0bGluZy50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvRGVjYWZFcnJvckZpbHRlci50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9Td2FnZ2VyQ3VzdG9tVUkudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJCdWlsZGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIiwiLi4vc3JjL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9jb3JlLW1vZHVsZS50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL2NvbnN0YW50LnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvdXRpbHMudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9FdmVudHNDb250cm9sbGVyLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvRGVjYWZTdHJlYW1Nb2R1bGUudHMiLCIuLi9zcmMvbW9kdWxlLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUNPUkFUT1JTX1BSRUZJWCA9IFwic3dhZ2dlclwiO1xuZXhwb3J0IGNvbnN0IERFQ09SQVRPUlMgPSB7XG4gIEFQSV9PUEVSQVRJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlPcGVyYXRpb25gLFxuICBBUElfUkVTUE9OU0U6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlSZXNwb25zZWAsXG4gIEFQSV9QUk9EVUNFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVByb2R1Y2VzYCxcbiAgQVBJX0NPTlNVTUVTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ29uc3VtZXNgLFxuICBBUElfVEFHUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVVzZVRhZ3NgLFxuICBBUElfQ0FMTEJBQ0tTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ2FsbGJhY2tzYCxcbiAgQVBJX1BBUkFNRVRFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlQYXJhbWV0ZXJzYCxcbiAgQVBJX0hFQURFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlIZWFkZXJzYCxcbiAgQVBJX01PREVMX1BST1BFUlRJRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlNb2RlbFByb3BlcnRpZXNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc0FycmF5YCxcbiAgQVBJX1NFQ1VSSVRZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2VjdXJpdHlgLFxuICBBUElfRVhDTFVERV9FTkRQT0lOVDogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVFbmRwb2ludGAsXG4gIEFQSV9FWENMVURFX0NPTlRST0xMRVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeGNsdWRlQ29udHJvbGxlcmAsXG4gIEFQSV9FWFRSQV9NT0RFTFM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRyYU1vZGVsc2AsXG4gIEFQSV9FWFRFTlNJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRlbnNpb25gLFxuICBBUElfU0NIRU1BOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2NoZW1hYCxcbiAgQVBJX0RFRkFVTFRfR0VUVEVSOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRGVmYXVsdEdldHRlcmAsXG4gIEFQSV9MSU5LOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTGlua2AsXG59O1xuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNVbmRlZmluZWQsIG5lZ2F0ZSwgcGlja0J5IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25zdHJ1Y3RvciA9ICh2YWw6IGFueSk6IGJvb2xlYW4gPT4gdmFsID09PSBcImNvbnN0cnVjdG9yXCI7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfRkFDVE9SWV9OQU1FID0gXCJfT1BFTkFQSV9NRVRBREFUQV9GQUNUT1JZXCI7XG5cbmV4cG9ydCBjb25zdCBNRVRIT0RfTUVUQURBVEEgPSBcIm1ldGhvZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICB7IG92ZXJyaWRlRXhpc3RpbmcgfSA9IHsgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZSB9XG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgaWYgKHByZXZWYWx1ZSAmJiAhb3ZlcnJpZGVFeGlzdGluZykge1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHsgLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YSB9LFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGEsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xhc3NEZWNvcmF0b3I8VCBleHRlbmRzIEFycmF5PGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUID0gW10gYXMgYW55XG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IFtdO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgWy4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGFdLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAodGFyZ2V0Py5jb25zdHJ1Y3RvciBhcyBhbnkpPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FIGFzIGFueV0/LigpW1xuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgIF0/LnR5cGUgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNaXhlZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVFxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBsZXQgbWV0YWRhdGFzOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgICAgbWV0YWRhdGFzID0gWy4uLnByZXZpb3VzTWV0YWRhdGEsIC4uLm1ldGFkYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPVxuICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSkgfHwge307XG4gICAgICAgIG1ldGFkYXRhcyA9IHsgLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGEgfTtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IHt9O1xuICAgICAgbWV0YWRhdGFzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c01ldGFkYXRhKSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhcywgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRhZGF0YTogVCxcbiAgaW5pdGlhbDogUGFydGlhbDxUPlxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICB0YXJnZXQ6IG9iamVjdCB8IEZ1bmN0aW9uLFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGNvbnN0IHBhcmFtT3B0aW9ucyA9IHtcbiAgICAgIC4uLmluaXRpYWwsXG4gICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgIH07XG5cbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUywgZGVzY3JpcHRvci52YWx1ZSkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldC5wcm90b3R5cGUpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eUtleSBvZiBwcm9wZXJ0eUtleXMpIHtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKHByb3BlcnR5S2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuXG4gICAgICBpZiAoIW1ldGhvZERlc2NyaXB0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQXBpTWV0aG9kID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcbiAgICAgICAgTUVUSE9EX01FVEFEQVRBLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzQXBpTWV0aG9kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVJc0FycmF5VHVwbGUoXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgaW5wdXQ6IEZ1bmN0aW9uIHwgW0Z1bmN0aW9uXSB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGlzQXJyYXlGbGFnOiBib29sZWFuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgcmV0dXJuIFtpbnB1dCBhcyBGdW5jdGlvbiwgaXNBcnJheUZsYWddO1xuICB9XG4gIGNvbnN0IGlzSW5wdXRBcnJheSA9IGlzQXJyYXkoaW5wdXQpO1xuICBjb25zdCB0eXBlID0gaXNJbnB1dEFycmF5ID8gaW5wdXRbMF0gOiBpbnB1dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpc1N0cmluZywgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRUeXBlSXNBcnJheVR1cGxlLCBNRVRBREFUQV9GQUNUT1JZX05BTUUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVudW1BbGxvd2VkVHlwZXMsXG4gIEVudW1TY2hlbWFBdHRyaWJ1dGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbiAgU3dhZ2dlckVudW1UeXBlLFxufSBmcm9tIFwiLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNVbmRlZmluZWQgPSAob2JqOiBhbnkpOiBvYmogaXMgdW5kZWZpbmVkID0+XG4gIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKFxuICBlbnVtVHlwZTogU3dhZ2dlckVudW1UeXBlIHwgKCgpID0+IFN3YWdnZXJFbnVtVHlwZSlcbik6IHN0cmluZ1tdIHwgbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIGVudW1UeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZ2V0RW51bVZhbHVlcyhlbnVtVHlwZSgpKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGVudW1UeXBlKSkge1xuICAgIHJldHVybiBlbnVtVHlwZSBhcyBzdHJpbmdbXTtcbiAgfVxuICBpZiAodHlwZW9mIGVudW1UeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIEVudW1zIHdpdGggbnVtZXJpYyB2YWx1ZXNcbiAgLy8gICBlbnVtIFNpemUge1xuICAvLyAgICAgU01BTEwgPSAxLFxuICAvLyAgICAgQklHID0gMlxuICAvLyAgIH1cbiAgLy8gYXJlIHRyYW5zcGlsZWQgdG8gaW5jbHVkZSBhIHJldmVyc2UgbWFwcGluZ1xuICAvLyAgIGNvbnN0IFNpemUgPSB7XG4gIC8vICAgICBcIjFcIjogXCJTTUFMTFwiLFxuICAvLyAgICAgXCIyXCI6IFwiQklHXCIsXG4gIC8vICAgICBcIlNNQUxMXCI6IDEsXG4gIC8vICAgICBcIkJJR1wiOiAyLFxuICAvLyAgIH1cbiAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAubWFwKCh2YWx1ZTogYW55KSA9PiB2YWx1ZS50b1N0cmluZygpKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhbnVtZXJpY1ZhbHVlcy5pbmNsdWRlcyhrZXkpKVxuICAgIC5tYXAoKGtleSkgPT4gZW51bVR5cGVba2V5IGFzIGFueV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVR5cGUodmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIge1xuICBjb25zdCBoYXNTdHJpbmcgPSB2YWx1ZXMuZmlsdGVyKGlzU3RyaW5nKS5sZW5ndGggPiAwO1xuICByZXR1cm4gaGFzU3RyaW5nID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lc3QganMgY29kZVxuICAgICAgICB0YXJnZXQ/LmNvbnN0cnVjdG9yPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FXT8uKClbcHJvcGVydHlLZXldPy50eXBlID8/XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBEZWZhdWx0IHRvIG9wdGlvbmFsIHVubGVzcyBAcmVxdWlyZWQoKSBpcyB1c2VkXG4gICAgICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG4gIH0pIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgPSBTY2hlbWFPYmplY3RNZXRhZGF0YSAmIHtcbiAgXCJ4LWVudW1OYW1lc1wiPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMYXp5IGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBmb3Igd2hpY2ggdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICAgKiBjYW4gYmUgdXNlZCBhcyBhbiBpZFxuICAgKlxuICAgKiBVc2UgdG9nZXRoZXIgd2l0aCBAQXBpRGVmYXVsdEdldHRlciBvbiB0aGUgZ2V0dGVyIHJvdXRlIG9mIHRoZSB0eXBlXG4gICAqIHRvIGdlbmVyYXRlIE9wZW5BUEkgbGluayBvYmplY3RzXG4gICAqXG4gICAqIEBzZWUgW1N3YWdnZXIgbGluayBvYmplY3RzXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2xpbmtzLylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgbGluaz86ICgpID0+IFR5cGU8dW5rbm93bj4gfCBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5T3B0aW9ucyA9XG4gIHwgQXBpUHJvcGVydHlDb21tb25PcHRpb25zXG4gIHwgKEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyAmIHtcbiAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICBlbnVtU2NoZW1hPzogRW51bVNjaGVtYUF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbmNvbnN0IGlzRW51bUFycmF5ID0gKFxuICBvcHRzOiBBcGlQcm9wZXJ0eU9wdGlvbnNcbik6IG9wdHMgaXMge1xuICBpc0FycmF5OiB0cnVlO1xuICBlbnVtOiBFbnVtQWxsb3dlZFR5cGVzO1xuICB0eXBlOiBhbnk7XG4gIGl0ZW1zOiBhbnk7XG59ID0+IChvcHRzLmlzQXJyYXkgJiYgXCJlbnVtXCIgaW4gb3B0cyAmJiBvcHRzLmVudW0gIT09IHVuZGVmaW5lZCkgYXMgYm9vbGVhbjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQcm9wZXJ0eShcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9LFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICBjb25zdCBbdHlwZSwgaXNBcnJheV0gPSBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICAgIG9wdGlvbnMudHlwZSxcbiAgICBvcHRpb25zLmlzQXJyYXkgYXMgYW55XG4gICk7XG4gIG9wdGlvbnMgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0eXBlLFxuICAgIGlzQXJyYXksXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zO1xuXG4gIGlmIChpc0VudW1BcnJheShvcHRpb25zKSkge1xuICAgIG9wdGlvbnMudHlwZSA9IFwiYXJyYXlcIjtcblxuICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBnZXRFbnVtVmFsdWVzKG9wdGlvbnMuZW51bSk7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IGdldEVudW1UeXBlKGVudW1WYWx1ZXMpLFxuICAgICAgZW51bTogZW51bVZhbHVlcyxcbiAgICB9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgZGVsZXRlIG9wdGlvbnMuZW51bTtcbiAgfSBlbHNlIGlmIChcImVudW1cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuZW51bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcblxuICAgIG9wdGlvbnMuZW51bSA9IGVudW1WYWx1ZXM7XG4gICAgb3B0aW9ucy50eXBlID0gZ2V0RW51bVR5cGUoZW51bVZhbHVlcyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnR5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuICAgIG9wdGlvbnMuaXRlbXMgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGVbMF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoXG4gICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFUyxcbiAgICBvcHRpb25zLFxuICAgIG92ZXJyaWRlRXhpc3RpbmdcbiAgKTtcbn1cbiIsImltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLCBHZXRdLFxuICAgIFBPU1Q6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgUG9zdF0sXG4gICAgUFVUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIFB1dF0sXG4gICAgUEFUQ0g6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUGF0Y2hdLFxuICAgIERFTEVURTogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aCA/IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIFwiYnVsa1wiIGFzIGFueSwgY3J1ZE9wIGFzIGFueSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrVGFyZ2V0KFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6XG4gIHwgeyBraW5kOiBcImNydWRcIiB8IFwic3RhdGVtZW50XCIgfCBcInF1ZXJ5XCIgfCBcImJ1bGtcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICBjb25zdCBzdGF0ZW1lbnRUYXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCI6IFwic3RhdGVtZW50XCIsXG4gICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgfTtcblxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJxdWVyeVwiLCB2YWx1ZTogbm9ybWFsaXplZC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKSB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdGVtZW50VmFsdWUgPSBzdGF0ZW1lbnRUYXJnZXRzW25vcm1hbGl6ZWRdO1xuICBpZiAoc3RhdGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInN0YXRlbWVudFwiLCB2YWx1ZTogc3RhdGVtZW50VmFsdWUgfTtcbiAgfVxuXG4gIGlmICh2ZXJiID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImNydWRcIiwgdmFsdWU6IE9wZXJhdGlvbktleXMuUkVBRCB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpUGFyYW0gYXMgQXBpUGFyYW1EZWMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgc2V0IG9mIFN3YWdnZXIgYEBBcGlQYXJhbWAgZGVjb3JhdG9ycyBnZW5lcmF0ZWQgZnJvbSBhIHR5cGVkIHNwZWNpZmljYXRpb24gYXJyYXkuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIGVhY2ggZW50cnkgb2YgdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBpbnRvIGEgY29ycmVzcG9uZGluZyBgQEFwaVBhcmFtKClgIGRlY29yYXRvciAoZGVmYXVsdGluZyBgZGVzY3JpcHRpb25gLCBgcmVxdWlyZWRgLCBhbmQgYHR5cGVgIHdoZW4gb21pdHRlZCkgYW5kIGNvbXBvc2VzIHRoZW0gaW50byBhIHNpbmdsZSBkZWNvcmF0b3IgdmlhIE5lc3QncyBgYXBwbHlEZWNvcmF0b3JzYC4gVXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIHJ1bnRpbWUgcm91dGUgcGFyYW1zIHdpdGggT3BlbkFQSSBkb2N1bWVudGF0aW9uIGluIGEgY29uY2lzZSwgZGVjbGFyYXRpdmUgd2F5LlxuICogQHBhcmFtIHtBcGlQYXJhbVtdfSBbcHJvcHM9W11dIEFycmF5IGRlc2NyaWJpbmcgcGF0aCBwYXJhbWV0ZXJzIHRvIGJlIGRvY3VtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHNbXS5uYW1lIFRoZSBwYXJhbWV0ZXIncyBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHJvdXRlIHRlbXBsYXRlIChlLmcuLCBgOmlkYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BzW10uZGVzY3JpcHRpb25dIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXI7IGRlZmF1bHRzIHRvIGBcIlBhdGggcGFyYW1ldGVyOiA8bmFtZT5cImAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wc1tdLnJlcXVpcmVkPXRydWVdIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZDsgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBbcHJvcHNbXS50eXBlPVN0cmluZ10gQ29uc3RydWN0b3IvdHlwZSB1c2VkIGJ5IFN3YWdnZXIgdG8gaW5mZXIgc2NoZW1hIChlLmcuLCBgU3RyaW5nYCwgYE51bWJlcmAsIGBVVUlEYCwgY3VzdG9tIGNsYXNzKS5cbiAqIEByZXR1cm4ge2FueX0gQSBjb21wb3NlZCBkZWNvcmF0b3IgYXBwbHlpbmcgYWxsIGdlbmVyYXRlZCBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXQgbWV0aG9kIG9yIGNvbnRyb2xsZXIuXG4gKiBAZnVuY3Rpb24gQXBpUGFyYW1zRnJvbU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWwoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBkZWNvcmF0b3JzID0gcHJvcHMubWFwKChwKSA9PlxuICAgIEFwaVBhcmFtRGVjKHtcbiAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uID8/IGBQYXRoIHBhcmFtZXRlcjogJHtwLm5hbWV9YCxcbiAgICAgIHJlcXVpcmVkOiBwLnJlcXVpcmVkID8/IHRydWUsXG4gICAgICAvLyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHR5cGU6IHAudHlwZSA/PyBTdHJpbmcsXG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNvcmF0b3JzKTtcbn1cbiIsImltcG9ydCB7XG4gIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VzdG9tIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGluc3RhbnRpYXRlcyBpdCB1c2luZyB0aGUgTW9kZWwgY29uc3RydWN0b3JcbiAqIGZvdW5kIG9uIHRoZSBjb250cm9sbGVyLiBIYW5kbGVzIGJvdGggc2luZ2xlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlY2FmQm9keSA9IGNyZWF0ZVBhcmFtRGVjb3JhdG9yKFxuICAoZGF0YTogdW5rbm93biwgY3R4OiBFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keTtcblxuICAgIC8vIFRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyIHdpbGwgaGF2ZSAnTW9kZWxDb25zdHInIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjdHguZ2V0Q2xhc3MoKTtcbiAgICAvLyBXZSBhY2Nlc3MgdGhlIHN0YXRpYyBwcm9wZXJ0eSB3ZSB3aWxsIGFkZCB0byB0aGUgRHluYW1pY01vZGVsQ29udHJvbGxlclxuICAgIGNvbnN0IE1vZGVsQ29uc3RyID0gKGNvbnRyb2xsZXIgYXMgYW55KS5jbGFzcztcblxuICAgIGlmICghTW9kZWxDb25zdHIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxuICAgICAgICBgTW9kZWxDb25zdHJ1Y3RvciBub3QgZm91bmQgb24gY29udHJvbGxlciAke2NvbnRyb2xsZXIubmFtZX0uIEVuc3VyZSB0aGUgY29udHJvbGxlciB3YXMgY3JlYXRlZCB2aWEgRnJvbU1vZGVsQ29udHJvbGxlci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYm9keSkgcmV0dXJuIGJvZHk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkubWFwKChpdGVtKSA9PiBuZXcgTW9kZWxDb25zdHIoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWxDb25zdHIoYm9keSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXJhbURlY29yYXRvciwgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZQYXJhbVByb3BzLCBEZWNhZkFwaVByb3BlcnR5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjdXN0b20gTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBleHRyYWN0cyBhbmQgcmV0dXJucyByb3V0ZSBwYXJhbWV0ZXJzIG9yZGVyZWQgYnkgYSBzcGVjaWZpYyBrZXkgc2VxdWVuY2UuXG4gKiBAc3VtbWFyeSBUaGUgYE9yZGVyZWRQYXJhbXNgIGRlY29yYXRvciByZWFkcyB0aGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0J3MgYHBhcmFtc2Agb2JqZWN0LCBvcHRpb25hbGx5IG9yZGVycyBpdCBhY2NvcmRpbmcgdG8gYSBwcm92aWRlZCBsaXN0IG9mIHBhcmFtZXRlciBuYW1lcywgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcmFtcywgdGhlIG9yZGVyZWQgdmFsdWVzLCBhbmQgdGhlIGFwcGxpZWQgb3JkZXIgbGlzdC4gVGhpcyBlbnN1cmVzIGRldGVybWluaXN0aWMgcGFyYW1ldGVyIGFjY2VzcyBmb3Igcm91dGVzIHdpdGggbXVsdGlwbGUgcGF0aCBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIHtzdHJpbmdbXX0gVE9yZGVyIC0gUmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzLlxuICogQHBhcmFtIHtUT3JkZXIgfCB1bmRlZmluZWR9IG9yZGVyIEFuIG9wdGlvbmFsIGFycmF5IHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlciBuYW1lcycgZGVzaXJlZCBvcmRlci4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBgcmVxLnBhcmFtc2Agb2JqZWN0LlxuICogQHBhcmFtIHtFeGVjdXRpb25Db250ZXh0fSBjdHggVGhlIE5lc3RKUyBleGVjdXRpb24gY29udGV4dCwgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICogQHJldHVybiB7RGVjYWZQYXJhbVByb3BzfSBBbiBvYmplY3QgY29udGFpbmluZzpcbiAqIC0gYG9yaWdpbmFsYDogdGhlIHJhdyBwYXJhbWV0ZXIgbWFwIGZyb20gYHJlcS5wYXJhbXNgO1xuICogLSBgb3JkZXJlZGA6IGFuIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlIHJlcXVlc3RlZCBvcmRlcjtcbiAqIC0gYG9yZGVyYDogdGhlIGVmZmVjdGl2ZSBvcmRlciBsaXN0IHVzZWQuXG4gKiBAZnVuY3Rpb24gT3JkZXJlZFBhcmFtc1xuICovXG5jb25zdCBPcmRlcmVkUGFyYW1zID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChvcmRlcjogc3RyaW5nW10gfCB1bmRlZmluZWQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IERlY2FmUGFyYW1Qcm9wcyA9PiB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChyZXE/LnBhcmFtcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBvcmRlckxpc3QgPSBvcmRlciA/PyBPYmplY3Qua2V5cyhvcmlnaW5hbCk7XG4gICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyTGlzdC5tYXAoKGspID0+IG9yaWdpbmFsW2tdKTtcbiAgICByZXR1cm4geyByYXc6IG9yaWdpbmFsLCB2YWx1ZXNJbk9yZGVyOiBvcmRlcmVkLCBrZXlzSW5PcmRlcjogb3JkZXJMaXN0IH07XG4gIH1cbik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgaGlnaGVyLWxldmVsIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgbGV2ZXJhZ2VzIGBPcmRlcmVkUGFyYW1zYCB0byBleHRyYWN0IHJvdXRlIHBhcmFtZXRlcnMgaW4gYSBzcGVjaWZpYyBvcmRlciBkZXJpdmVkIGZyb20gYSBsaXN0IG9mIGBBcGlQYXJhbWAgZGVmaW5pdGlvbnMuXG4gKiBAc3VtbWFyeSBgRGVjYWZQYXJhbXNgIGNvbXB1dGVzIHRoZSBvcmRlciBvZiByb3V0ZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgQXBpUGFyYW1bXWAgc3BlY2lmaWNhdGlvbiAodXNpbmcgZWFjaCBlbGVtZW504oCZcyBgbmFtZWApLCB0aGVuIGFwcGxpZXMgYE9yZGVyZWRQYXJhbXMob3JkZXIpYCBhcyBhIHBhcmFtZXRlciBkZWNvcmF0b3IuIFRoaXMgZW5hYmxlcyBwYXJhbWV0ZXItbGV2ZWwgYmluZGluZyB0aGF0IHJlbWFpbnMgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGVkIEFQSSBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucyB3aG9zZSBgbmFtZWAgZmllbGRzIGRldGVybWluZSB0aGUgcGFyYW1ldGVyIGV4dHJhY3Rpb24gb3JkZXIuXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IEEgTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBjb250cm9sbGVyIG1ldGhvZCBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlY2FmUGFyYW1zKFxuICBwcm9wczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIGNvbnN0IG9yZGVyID0gcHJvcHMubWFwKChwKSA9PiBwLm5hbWUpO1xuICByZXR1cm4gT3JkZXJlZFBhcmFtcyhvcmRlcik7XG59XG5cbmV4cG9ydCBjb25zdCBEZWNhZlF1ZXJ5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChfOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxLnF1ZXJ5ID8/IHt9O1xuXG4gICAgY29uc3QgcGFyc2VkOiBhbnkgPSB7IC4uLnF1ZXJ5IH07XG5cbiAgICAvLyBQYXJzZSBsaW1pdCAmIG9mZnNldFxuICAgIGlmIChwYXJzZWQubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQubGltaXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5saW1pdCA9IG47XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZC5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQub2Zmc2V0KTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBwYXJzZWQub2Zmc2V0ID0gbjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBib29rbWFyayBvbmx5IGlmIG51bWVyaWNcbiAgICBpZiAocGFyc2VkLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG4gPSBOdW1iZXIocGFyc2VkLmJvb2ttYXJrKTtcbiAgICAgIHBhcnNlZC5ib29rbWFyayA9IE51bWJlci5pc05hTihuKSA/IHBhcnNlZC5ib29rbWFyayA6IG47XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEFkYXB0ZXJGbGFncywgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9NT0RVTEVfT1BUSU9OUyA9IFwiRGVjYWZNb2R1bGVPcHRpb25zXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQURBUFRFUl9JRCA9IFwiRGVjYWZBZGFwdGVyXCI7XG5leHBvcnQgY29uc3QgREVDQUZfVEFTS19TRVJWSUNFX0lEID0gXCJEZWNhZlRhc2tTZXJ2aWNlXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9ST1VURSA9IFwiRGVjYWZSb3V0ZVwiO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0hBTkRMRVJTID0gU3ltYm9sKFwiRGVjYWZIYW5kbGVyc1wiKTtcbmV4cG9ydCBjb25zdCBERUNBRl9FWFBPU0UgPSBcIkRlY2FmRXhwb3NlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgPSBcIkRlY2FmQ29udHJvbGxlckNvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgREVDQUZfQ09OVEVYVF9LRVkgPSBTeW1ib2woXCJkZWNhZjpjb250ZXh0XCIpO1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckZsYWdzPExPRyBleHRlbmRzIExvZ2dlciA9IExvZ2dlcj4gPVxuICBBZGFwdGVyRmxhZ3M8TE9HPiAmIHtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGVjYWZTZXJ2ZXJDdHggPSBDb250ZXh0PERlY2FmU2VydmVyRmxhZ3M+O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3NlKC4uLmZsYXZvdXJzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gZXhwb3NlKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgREVDQUZfRVhQT1NFLFxuICAgICAgKGZsYXZvdXJzLmxlbmd0aCA/IGZsYXZvdXJzIDogdHJ1ZSkgYXMgYW55XG4gICAgKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENsYXNzIGRlY29yYXRvciB0aGF0IGF0dGFjaGVzIGEge0BsaW5rIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWd9IHRvIGEgTW9kZWwsXG4gKiBzbyBgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUoKWAgY2FuIHBhc3MgaXQgdG8gYE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlKClgLlxuICpcbiAqIFRoZSBwZXItbW9kZWwgY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBtb2R1bGUtbGV2ZWwgYGNvbnRyb2xsZXJDb25maWdgXG4gKiBvcHRpb24gaW4gYERlY2FmTW9kdWxlT3B0aW9uc2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBAY29udHJvbGxlckNvbmZpZyh7IGFsbG93R3JvdXBpbmdRdWVyaWVzOiB0cnVlLCBhbGxvd0J1bGtTdGF0ZW1lbnQ6IHsgY3JlYXRlOiB0cnVlLCByZWFkOiB0cnVlLCB1cGRhdGU6IGZhbHNlLCBkZWxldGU6IHRydWUgfSB9KVxuICogQG1vZGVsKClcbiAqIGNsYXNzIE9yZGVyIGV4dGVuZHMgTW9kZWw8T3JkZXI+IHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBGYWN0b3J5IGNvbmZpZ3VyYXRpb24ga25vYnMgKGFsbG93U3RhdGVtZW50bGVzc1F1ZXJ5LCBhbGxvd0dyb3VwaW5nUXVlcmllcywgYWxsb3dCdWxrU3RhdGVtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWcoY29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KHRhcmdldCwgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIGNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgQVVUSF9IQU5ETEVSID0gU3ltYm9sKFwiQVVUSF9IQU5ETEVSXCIpO1xuZXhwb3J0IGNvbnN0IEFVVEhfTUVUQV9LRVkgPSBcImF1dGg6bWV0YVwiO1xuZXhwb3J0IGNvbnN0IElTX1BVQkxJQ19LRVkgPSBcImlzUHVibGljXCI7XG5leHBvcnQgY29uc3QgUkVRVUlSRURfUk9MRVNfS0VZID0gXCJyZXF1aXJlZFJvbGVzXCI7XG5leHBvcnQgY29uc3QgU0tJUF9NT0RFTF9ST0xFU19LRVkgPSBcInNraXBNb2RlbFJvbGVzXCI7XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSRVFVRVNUIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RDb250ZXh0PFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIFJlcXVlc3RDb250ZXh0PFJlcXVlc3Q+IHtcbiAgdXVpZCA9IFVVSUQuaW5zdGFuY2UuZ2VuZXJhdGUoKTtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFJFUVVFU1QpIHByaXZhdGUgcmVhZG9ubHkgcmVxOiBSZXF1ZXN0KSB7XG4gICAgc3VwZXIoXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnNPZjogKHJlcXVlc3Q6IFJlcXVlc3QpID0+IChyZXF1ZXN0IGFzIGFueSk/LmhlYWRlcnMgfHwgdW5kZWZpbmVkLFxuICAgICAgfSBhcyBhbnksXG4gICAgICByZXFcbiAgICApO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJoZWFkZXJzXCIgYXMgYW55KTtcbiAgfVxuXG4gIHB1dChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pIHtcbiAgICBsZXQgb3ZlcnJpZGVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG92ZXJyaWRlcyA9IHRoaXMuZ2V0KFwib3ZlcnJpZGVzXCIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIG92ZXJyaWRlcyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuYWNjdW11bGF0ZSh7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5hc3NpZ24ob3ZlcnJpZGVzLCByZWNvcmQpLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0b3IgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7XG4gIEFVVEhfSEFORExFUixcbiAgQVVUSF9NRVRBX0tFWSxcbiAgSVNfUFVCTElDX0tFWSxcbiAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIX0hBTkRMRVIpIHByaXZhdGUgcmVhZG9ubHkgYXV0aEhhbmRsZXI/OiBBdXRoSGFuZGxlclxuICApIHt9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KFxuICAgIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBuZXh0OiBDYWxsSGFuZGxlclxuICApOiBQcm9taXNlPE9ic2VydmFibGU8YW55Pj4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuXG4gICAgY29uc3QgaXNQdWJsaWMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxib29sZWFuPihJU19QVUJMSUNfS0VZLCBbXG4gICAgICBjdHguZ2V0SGFuZGxlcigpLFxuICAgICAgY3R4LmdldENsYXNzKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBtb2RlbE5hbWUgPVxuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihcbiAgICAgICAgQVVUSF9NRVRBX0tFWSxcbiAgICAgICAgY3R4LmdldEhhbmRsZXIoKVxuICAgICAgKSA/P1xuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihBVVRIX01FVEFfS0VZLCBjdHguZ2V0Q2xhc3MoKSk7XG5cbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICAgICAgW2N0eC5nZXRIYW5kbGVyKCksIGN0eC5nZXRDbGFzcygpXVxuICAgICk7XG5cbiAgICBjb25zdCBza2lwTW9kZWxSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KFxuICAgICAgU0tJUF9NT0RFTF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU1vZGVsID0gc2tpcE1vZGVsUm9sZXMgPyB1bmRlZmluZWQgOiBtb2RlbE5hbWU7XG5cbiAgICBsb2cudmVyYm9zZShgSW50ZXJjZXB0ZWQgcmVxdWVzdCR7bW9kZWxOYW1lID8gYCBmb3IgJHttb2RlbE5hbWV9YCA6IFwiXCJ9YCk7XG5cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUHVibGljIHJvdXRlIOKAlCBza2lwcGluZyBhdXRoYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmF1dGhIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhIYW5kbGVyLmF1dGhvcml6ZShcbiAgICAgICAgY3R4LFxuICAgICAgICBlZmZlY3RpdmVNb2RlbCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgICAgcmVxdWlyZWRSb2xlcyxcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKGBObyBhdXRoIGhhbmRsZXIgcmVnaXN0ZXJlZGApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybWVycyBydW4gQUZURVIgYXV0aCBzbyB0aGV5IGNhbiByZWFkIGF1dGgtcG9wdWxhdGVkIGZpZWxkc1xuICAgIC8vIChlLmcuIGB1c2VyYCkgZnJvbSB0aGUgY29udGV4dCBhbmQgbWFwIHRoZW0gdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzXG4gICAgLy8gKGUuZy4gYFVVSURgIGZvciBSYW1BZGFwdGVyJ3MgQGNyZWF0ZWRCeS9AdXBkYXRlZEJ5IGhhbmRsZXJzKS5cbiAgICBhd2FpdCB0aGlzLmFwcGx5VHJhbnNmb3JtZXJzKCk7XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcInVzZXJcIiBhcyBhbnkpO1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbiA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0T3JVbmRlZmluZWQoXG4gICAgICBcIm9yZ2FuaXphdGlvblwiIGFzIGFueVxuICAgICk7XG4gICAgaWYgKHVzZXIgfHwgb3JnYW5pemF0aW9uKSB7XG4gICAgICBjb25zdCBjdXJyZW50TG9nID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXQoXCJsb2dnZXJcIiBhcyBhbnkpO1xuICAgICAgY29uc3QgY2hpbGRMb2cgPSBjdXJyZW50TG9nLmZvcih7IHVzZXIsIG9yZ2FuaXphdGlvbiB9KTtcbiAgICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZSh7IGxvZ2dlcjogY2hpbGRMb2cgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5VHJhbnNmb3JtZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZsYXZvdXJzID0gQWRhcHRlci5mbGF2b3Vyc1RvVHJhbnNmb3JtKCk7XG4gICAgaWYgKCFmbGF2b3VycykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBmbGF2b3VyIG9mIGZsYXZvdXJzKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoXG4gICAgICAgIGZsYXZvdXJcbiAgICAgICkgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT47XG4gICAgICBpZiAoIXRyYW5zZm9ybWVyKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gKHRyYW5zZm9ybWVyIGFzIGFueSkuZnJvbVxuICAgICAgICA/IHRyYW5zZm9ybWVyXG4gICAgICAgIDogbmV3ICh0cmFuc2Zvcm1lciBhcyBhbnkpKCk7XG4gICAgICBjb25zdCBmcm9tID0gYXdhaXQgaW5zdGFuY2UuZnJvbSh0aGlzLnJlcXVlc3RDb250ZXh0KTtcbiAgICAgIGlmIChmcm9tKSB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoZnJvbSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseURlY29yYXRvcnMsIFNldE1ldGFkYXRhLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFwaUJlYXJlckF1dGgsIEFwaVNlY3VyaXR5IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgQVVUSF9NRVRBX0tFWSwgSVNfUFVCTElDX0tFWSwgUkVRVUlSRURfUk9MRVNfS0VZIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGgobW9kZWw/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICBjb25zdCByZXNvdXJjZSA9IG1vZGVsXG4gICAgPyB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbW9kZWxcbiAgICAgIDogbW9kZWwubmFtZVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkZWNzID0gW0FwaUJlYXJlckF1dGgoKSwgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcildO1xuICBpZiAocmVzb3VyY2UpIGRlY3MucHVzaChTZXRNZXRhZGF0YShBVVRIX01FVEFfS0VZLCByZXNvdXJjZSkpO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVibGljKCkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFNldE1ldGFkYXRhKElTX1BVQkxJQ19LRVksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVpcmVSb2xlcyguLi5yb2xlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhcbiAgICBBcGlTZWN1cml0eShcImJlYXJlclwiKSxcbiAgICBTZXRNZXRhZGF0YShSRVFVSVJFRF9ST0xFU19LRVksIHJvbGVzKSxcbiAgICBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKVxuICApO1xufVxuIiwiaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbi8qKlxuICogTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHZlcmIgLSBIVFRQIHZlcmIgdG8gYmUgY29udmVydGVkIChlLmcuIEdFVCwgUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKS5cbiAqIEByZXR1cm5zIEEgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYi5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYiBpcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXBwZWRcbiAqIHRvIGEgTmVzdEpTIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEh0dHBWZXJiVG9EZWNvcmF0b3IoXG4gIHZlcmI6IEh0dHBWZXJic1xuKTogKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxIdHRwVmVyYnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3I+ID0ge1xuICAgIEdFVDogR2V0LFxuICAgIFBPU1Q6IFBvc3QsXG4gICAgUFVUOiBQdXQsXG4gICAgUEFUQ0g6IFBhdGNoLFxuICAgIERFTEVURTogRGVsZXRlLFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvciA9IGh0dHBUb0NydWRbdmVyYl07XG5cbiAgaWYgKCFkZWNvcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCBIVFRQIHZlcmIgXCIke3ZlcmJ9XCIuIE5vIE5lc3RKUyBkZWNvcmF0b3IgbWFwcGluZyB3YXMgZm91bmQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuIiwiaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgdHlwZSBEZWNvcmF0b3JCdW5kbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBEZWNhZkFwaVByb3BlcnR5LFxuICB0eXBlIERlY2FmUGFyYW1Qcm9wcyxcbiAgRGVjYWZQYXJhbXMsXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFJlcG8sXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIdHRwVmVyYlRvRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy91dGlsc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5jb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChyb3V0ZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgcmV0dXJuIHJvdXRlUGF0aFxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwKSA9PiBwLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgIC5tYXAoKHApID0+IHAuc2xpY2UoMSkpO1xufTtcblxuY29uc3QgYXBpUGFyYW1TcGVjID0gKG5hbWU6IHN0cmluZyk6IERlY2FmQXBpUHJvcGVydHkgPT4gKHtcbiAgbmFtZSxcbiAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbn0pO1xuXG5mdW5jdGlvbiB0b0RlY2FmRXJyb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyb3I7XG4gIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWAgOiBmYWxsYmFja01lc3NhZ2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaURlY29yYXRvcnMoXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgcm91dGVQYXRoOiBzdHJpbmcsXG4gIGh0dHBWZXJiOiBIdHRwVmVyYnMsXG4gIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4pOiBEZWNvcmF0b3JCdW5kbGUge1xuICBjb25zdCBOZXN0SHR0cFJvdXRlRGVjID0gSHR0cFZlcmJUb0RlY29yYXRvcihodHRwVmVyYik7XG4gIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcChhcGlQYXJhbVNwZWMpO1xuXG4gIGNvbnN0IHN3YWdnZXJRdWVyeVBhcmFtcyA9IFtdO1xuICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgc3dhZ2dlclF1ZXJ5UGFyYW1zLnB1c2goXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1ldGhvZDogW1xuICAgICAgTmVzdEh0dHBSb3V0ZURlYyhyb3V0ZVBhdGgpLFxuICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoQXBpUGFyYW0pLFxuICAgICAgLi4uc3dhZ2dlclF1ZXJ5UGFyYW1zLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgYWNjb3JkaW5nIHRvIFwiJHttZXRob2ROYW1lfVwiLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuYCxcbiAgICAgIH0pLFxuICAgIF0sXG4gICAgcGFyYW1zOiBbRGVjYWZQYXJhbXMoYXBpUGF0aFBhcmFtcyksIFF1ZXJ5KCldLCAvLyAsIERlY2FmQm9keSgpXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXBpRGVjb3JhdG9ycyhcbiAgdGFyZ2V0OiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yLFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JCdW5kbGVcbikge1xuICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgZGVjb3JhdG9ycy5tZXRob2QuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICBkZWNvcmF0b3JzLnBhcmFtcz8uZm9yRWFjaCgoZCwgaW5kZXgpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VNZXRob2Q8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgcGVyc2lzdGVuY2U6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4sXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbik6IGFueSB7XG4gIGlmIChwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSkge1xuICAgIHJldHVybiB0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgOiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpO1xuXG4gIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlSGFuZGxlcjxUPihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICB0aGlzOiBEZWNhZk1vZGVsQ29udHJvbGxlcjxhbnk+LFxuICAgIHBhdGhQYXJhbXM6IERlY2FmUGFyYW1Qcm9wcyxcbiAgICBxdWVyeVBhcmFtczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbG9nOiBMb2dnZXIgPSB0aGlzLmxvZy5mb3IobWV0aG9kTmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgSW52b2tpbmcgcGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIGdpdmVuIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocGF0aFBhcmFtcy52YWx1ZXNJbk9yZGVyKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0LCBvZmZzZXQgfSA9IHF1ZXJ5UGFyYW1zO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZChcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSh0aGlzLmN0eCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyB0b0RlY2FmRXJyb3IoZSwgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHtcbiAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgaGFuZGxlcj86IFR5cGU8QXV0aEhhbmRsZXI+O1xufTtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICBvcHRpb25zOiBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge31cbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBEeW5hbWljTW9kdWxlW1wicHJvdmlkZXJzXCJdID0gW1xuICAgICAgQXV0aEludGVyY2VwdG9yLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBVVRIX0hBTkRMRVIsXG4gICAgICAgIHVzZUNsYXNzOiBvcHRpb25zLmhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICAgIChwcm92aWRlcnMgYXMgYW55W10pLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgIHVzZUV4aXN0aW5nOiBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkF1dGhNb2R1bGUsXG4gICAgICBnbG9iYWw6IG9wdGlvbnMuZ2xvYmFsID8/IGZhbHNlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0czogW0F1dGhJbnRlcmNlcHRvciwgQVVUSF9IQU5ETEVSXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBEZWNhZlJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUNBRl9IQU5ETEVSUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QsXG4gKiBwcm92aWRpbmcgdGhlbSB3aXRoIGEgc2hhcmVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fS5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgYW5kIGV4ZWN1dGluZ1xuICogYSBzZXF1ZW5jZSBvZiByZXF1ZXN0IGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIHNhbWUgcmVxdWVzdC1zY29wZWQgY29udGV4dCxcbiAqIGFsbG93aW5nIGNvb3JkaW5hdGVkIHByb2Nlc3Npbmcgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbWV0YWRhdGEgZXh0cmFjdGlvbiwgYXVkaXRpbmcsXG4gKiBhbmQgY3VzdG9tIHBpcGVsaW5lIGJlaGF2aW9yLiBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgdmlhIHRoZSB7QGxpbmsgREVDQUZfSEFORExFUlN9IHRva2VuLFxuICogZW5zdXJpbmcgZXh0ZW5zaWJpbGl0eSBhbmQgbG9vc2UgY291cGxpbmcuXG4gKlxuICogQGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBFeGFtcGxlIGhhbmRsZXI6XG4gKiBjbGFzcyBBdXRoSGFuZGxlciBpbXBsZW1lbnRzIERlY2FmUmVxdWVzdEhhbmRsZXIge1xuICogICBhc3luYyBoYW5kbGUoY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgcmVxOiBSZXF1ZXN0KSB7XG4gKiAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl07XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gTXlTZXJ2aWNlLmRvU29tZXRoaW5nKHRva2VuKTtcbiAqICAgICBjb250ZXh0LnNldChcIm15LWtleVwiLCByZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gRXhlY3V0b3IgdXNhZ2UgaW4gYSByZXF1ZXN0OlxuICogYXdhaXQgZXhlY3V0b3IuZXhlYyhyZXF1ZXN0KTtcbiAqIC8vIEFsbCBoYW5kbGVycyB3aWxsIHJ1biBpbiBzZXF1ZW5jZVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckFcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQlxuICpcbiAqICAgICBDbGllbnQtPj5FeGVjdXRvcjogZXhlYyhyZXEpXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQTogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQS0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQjogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQi0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItLT4+Q2xpZW50OiBwcm9jZXNzaW5nIGZpbmlzaGVkXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfSEFORExFUlMpIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IERlY2FmUmVxdWVzdEhhbmRsZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHRcbiAgKSB7fVxuXG4gIGFzeW5jIGV4ZWMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZIYW5kbGVyRXhlY3V0b3IubmFtZSkuZm9yKHRoaXMuZXhlYyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLmNvbnRleHQudXVpZH0gcnVubmluZyAke3RoaXMuaGFuZGxlcnMubGVuZ3RofSBoYW5kbGVycyBmb3IgcmVxdWVzdCAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUodGhpcy5jb250ZXh0LCByZXEsIHJlcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGN0eDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge31cblxuICBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXNwb25zZSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpLnBpcGUoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmN0eC50b1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IERlY2FmQ29udHJvbGxlciBhcyBIdHRwRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb250cm9sbGVyPFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIENPTlRFWFQgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIEh0dHBEZWNhZkNvbnRyb2xsZXI8UmVxdWVzdCwgYW55LCBEZWNhZlJlcXVlc3RDb250ZXh0PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8Qz4ge1xuICBwcml2YXRlIF9wZXJzaXN0ZW5jZT86IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgX25hbWUpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8TT47XG5cbiAgcGVyc2lzdGVuY2UoY3R4PzogQ29udGV4dDxhbnk+KTogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPE0+Pih0aGlzLmNsYXNzKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICAgKSBhcyBNb2RlbFNlcnZpY2U8TT47XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmNsYXNzKSBhcyBSZXBvPE0+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVDdHggPSBjdHggPz8gdGhpcy5jbGllbnRDb250ZXh0O1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IGFjdGl2ZUN0eC50b092ZXJyaWRlcygpO1xuXG4gICAgcmV0dXJuIGN0eFxuICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnlcbiAgICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZS5vdmVycmlkZShvdmVycmlkZXMpXG4gICAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2UuZm9yKG92ZXJyaWRlcylcbiAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbCwgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvY29uc3RhbnRzXCI7XG5cbmNvbnN0IGR0b0NhY2hlID0gbmV3IE1hcDxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PlxuPigpO1xuXG4vKipcbiAqIEJ1aWxkcyBhIE5lc3QvU3dhZ2dlciBEVE8gY2xhc3MgZm9yIHRoZSBnaXZlbiBtb2RlbCBhbmQgQ1JVRCBvcGVyYXRpb24uXG4gKlxuICogUnVsZXM6XG4gKiAgLSBPbmx5IENSRUFURSBhbmQgVVBEQVRFIChhbmQgdGhlaXIgYnVsayB2YXJpYW50cykgcHJvZHVjZSBhIERUTztcbiAqICAgIGFsbCBvdGhlciBvcGVyYXRpb25zIHJldHVybiB0aGUgb3JpZ2luYWwgbW9kZWwgY2xhc3MgdW5jaGFuZ2VkLlxuICogIC0gQGdlbmVyYXRlZCgpIHByb3BlcnRpZXMgKGNyZWF0ZWRBdCwgdXBkYXRlZEF0LCBjcmVhdGVkQnksIHVwZGF0ZWRCeSxcbiAqICAgIHV1aWQsIHZlcnNpb24sIEBjb21wb3NlZCBwa3MsIOKApikgYXJlICoqbmV2ZXIqKiBleHBvc2VkIGluIGFueSBEVE8uXG4gKiAgLSBUaGUgQHBrKCkgcHJvcGVydHk6XG4gKiAgICAgIOKAoiBVUERBVEUg4oCTIGFsd2F5cyBpbmNsdWRlZC5cbiAqICAgICAg4oCiIENSRUFURSAg4oCTIGluY2x1ZGVkIG9ubHkgd2hlbiB0aGUgcGsgaXMgTk9UIGF1dG8tZ2VuZXJhdGVkXG4gKiAgICAgICAgICAgICAgICAgIChjaGVja2VkIHZpYSBNb2RlbC5wa1Byb3BzKCkuZ2VuZXJhdGVkIEFORCBNb2RlbC5nZW5lcmF0ZWQoKSkuXG4gKiAgLSBSZWxhdGlvbiBwcm9wZXJ0aWVzIChAb25lVG9PbmUsIEBvbmVUb01hbnksIOKApik6XG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBuZXN0ZWQgYXMgRHRvRm9yKENSRUFURSwgUmVsYXRlZE1vZGVsKS4gV2hlbiB0aGUgcmVsYXRpb25cbiAqICAgICAgICAgICAgICAgICAgY3JlYXRlcyBhIGNpcmN1bGFyIHJlZmVyZW5jZSAobW9kZWwgQSDihpIgbW9kZWwgQiDihpIgbW9kZWwgQSksXG4gKiAgICAgICAgICAgICAgICAgIHRoZSBiYWNrLXJlZmVyZW5jZSB1c2VzIHRoZSByZWxhdGVkIG1vZGVsJ3MgUEsgdHlwZVxuICogICAgICAgICAgICAgICAgICAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrIHRoZSBjeWNsZS5cbiAqICAgICAg4oCiIFVQREFURSAg4oCTIHVuaW9uIG9mIER0b0ZvcihVUERBVEUsIFJlbGF0ZWRNb2RlbCkgKipvcioqIHRoZVxuICogICAgICAgICAgICAgICAgICByZWxhdGVkIG1vZGVsJ3MgcHJpbWFyeS1rZXkgdHlwZSAoc3RyaW5nIC8gaW50ZWdlciksXG4gKiAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhIFN3YWdnZXIgb25lT2YuIENpcmN1bGFyIGJhY2stcmVmZXJlbmNlc1xuICogICAgICAgICAgICAgICAgICBvbWl0IHRoZSBEVE8gJHJlZiBhbmQgb25seSBpbmNsdWRlIHRoZSBQSyB0eXBlLlxuICpcbiAqIE1ldGFkYXRhLnByb3BlcnRpZXMoKSBub3cgcmV0dXJucyBBTEwgcHJvcGVydGllcyBhY3Jvc3MgdGhlIHByb3RvdHlwZSBjaGFpbixcbiAqIHNvIERUTyBpbmhlcml0YW5jZSBpcyBubyBsb25nZXIgbmVlZGVkOyBldmVyeSBEVE8gaXMgYSBmbGF0IGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRHRvRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG9wOiBPcGVyYXRpb25LZXlzLFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gIHN0YWNrOiBTZXQ8Q29uc3RydWN0b3I8YW55Pj4gPSBuZXcgU2V0KClcbik6IENvbnN0cnVjdG9yPGFueT4ge1xuICBpZiAoIVRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cy5pbmNsdWRlcyhvcCkpIHtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGdldER0b0NhY2hlKG9wKTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1vZGVsKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBpc1VwZGF0ZU9wID0gW1xuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICBdLmluY2x1ZGVzKG9wIGFzIGFueSk7XG5cbiAgY2xhc3MgRHluYW1pY0RUTyB7fVxuICBjYWNoZS5zZXQobW9kZWwsIER5bmFtaWNEVE8pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgJHt0b1Bhc2NhbENhc2UobW9kZWwubmFtZSl9JHt0b1Bhc2NhbENhc2Uob3ApfURUT2AsXG4gIH0pO1xuXG4gIGNvbnN0IHBrUHJvcCA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBNb2RlbC5wayhtb2RlbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSkoKTtcblxuICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBwa1Byb3AgPyBNb2RlbC5wa1Byb3BzKG1vZGVsIGFzIGFueSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrRGVzaWduVHlwZSA9IHBrUHJvcFxuICAgID8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcGtQcm9wIGFzIHN0cmluZylcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtUeXBlSXNOdW1lcmljID1cbiAgICBwa0Rlc2lnblR5cGUgPT09IE51bWJlciB8fCBwa0Rlc2lnblR5cGUgPT09IEJpZ0ludDtcbiAgY29uc3QgcGtJc0dlbmVyYXRlZCA9XG4gICAgISFwa1Byb3BzTWV0YWRhdGE/LmdlbmVyYXRlZCB8fFxuICAgIChwa1Byb3BcbiAgICAgID8gTW9kZWwuZ2VuZXJhdGVkQnlTZXF1ZW5jZShtb2RlbCBhcyBhbnksIHBrUHJvcCBhcyBhbnkpIHx8XG4gICAgICAgIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcGtQcm9wIGFzIHN0cmluZykgfHxcbiAgICAgICAgcGtUeXBlSXNOdW1lcmljXG4gICAgICA6IGZhbHNlKTtcblxuICBjb25zdCBhbGxQcm9wcyA9IEFycmF5LmZyb20obmV3IFNldChNZXRhZGF0YS5wcm9wZXJ0aWVzKG1vZGVsKSB8fCBbXSkpO1xuICBjb25zdCByZWxhdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkgYXMgc3RyaW5nW10pIHx8IFtdKTtcbiAgY29uc3Qgc2NhbGFyUHJvcHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIGFsbFByb3BzKSB7XG4gICAgaWYgKCFwcm9wKSBjb250aW51ZTtcbiAgICBpZiAocmVsYXRpb25zLmhhcyhwcm9wKSkgY29udGludWU7XG5cbiAgICBpZiAocHJvcCA9PT0gcGtQcm9wICYmICFpc1VwZGF0ZU9wICYmIHBrSXNHZW5lcmF0ZWQpIGNvbnRpbnVlO1xuICAgIGlmIChwcm9wICE9PSBwa1Byb3AgJiYgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgc2NhbGFyUHJvcHMucHVzaChwcm9wKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBzY2FsYXJQcm9wcykge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIXZhbGlkYXRpb24/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG4gICAgY29uc3QgdHlwZUhpbnQgPVxuICAgICAgZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSA/P1xuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICB9O1xuICAgIGlmICh0eXBlSGludCkgYXBpT3B0aW9ucy50eXBlID0gdHlwZUhpbnQ7XG5cbiAgICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApID8/IHR5cGVIaW50O1xuICAgIGlmICh0eXBlb2YgZGVzaWduVHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBkZXNpZ25UeXBlLFxuICAgICAgICBEeW5hbWljRFRPLnByb3RvdHlwZSxcbiAgICAgICAgcHJvcFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHJlbGF0aW9ucykge1xuICAgIGNvbnN0IHJlbGF0aW9uTWV0YSA9IE1ldGFkYXRhLnJlbGF0aW9ucyhtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBpZiAoIXJlbGF0aW9uTWV0YSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE1ldGFkYXRhIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID1cbiAgICAgIHJlbGF0aW9uTWV0YS5jbGFzcyBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgIGlmICh0eXBlb2YgcmVsYXRpb25UeXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXJlbGF0aW9uVHlwZS5uYW1lKSB7XG4gICAgICByZWxhdGlvblR5cGUgPSAocmVsYXRpb25UeXBlIGFzIGFueSkoKTtcbiAgICB9XG4gICAgaWYgKCFyZWxhdGlvblR5cGUgfHwgdHlwZW9mIHJlbGF0aW9uVHlwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVHlwZSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGlmICghTW9kZWwuZ2V0KHJlbGF0aW9uVHlwZS5uYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgY29uc3QgaXNBcnJheSA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLkxJU1RdO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG5cbiAgICAvLyBEZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlOiBpZiB0aGUgcmVsYXRlZCBtb2RlbCBpcyBhbHJlYWR5IGluIHRoZVxuICAgIC8vIHJlY3Vyc2lvbiBzdGFjaywgdXNlIHRoZSBQSyB0eXBlIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrXG4gICAgLy8gdGhlIGN5Y2xlLiBUaGlzIHByZXZlbnRzIEBuZXN0anMvc3dhZ2dlcidzIFNjaGVtYU9iamVjdEZhY3RvcnkgZnJvbVxuICAgIC8vIGluZmluaXRlbHkgcmVjdXJzaW5nIHdoZW4gZXhwbG9yaW5nIHRoZSBzY2hlbWFzLlxuICAgIGNvbnN0IGlzQ2lyY3VsYXIgPSBzdGFjay5oYXMocmVsYXRpb25UeXBlKTtcblxuICAgIGlmIChpc0NpcmN1bGFyKSB7XG4gICAgICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICAgICAgYWRkUmVsYXRpb25Qa1JlZihEeW5hbWljRFRPLCByZWxhdGlvbiwgcGtUeXBlTmFtZSwgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbkR0byA9IER0b0ZvcihvcCwgcmVsYXRpb25UeXBlLCBuZXcgU2V0KHN0YWNrKS5hZGQobW9kZWwpKTtcblxuICAgIGlmIChpc1VwZGF0ZU9wKSB7XG4gICAgICBhZGRSZWxhdGlvblVwZGF0ZShcbiAgICAgICAgRHluYW1pY0RUTyxcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIHJlbGF0aW9uVHlwZSxcbiAgICAgICAgcmVsYXRpb25EdG8sXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIGlzUmVxdWlyZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFJlbGF0aW9uKER5bmFtaWNEVE8sIHJlbGF0aW9uLCByZWxhdGlvbkR0bywgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIER5bmFtaWNEVE87XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgIHR5cGU6IHJlbGF0aW9uRHRvLFxuICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIGlzQXJyYXksXG4gIH07XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiByZWxhdGlvbkR0byxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgcmVsYXRpb24gcHJvcGVydHkgdGhhdCB1c2VzIHRoZSBQSyB0eXBlIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZlxuICogYSBmdWxsIERUTyBjbGFzcy4gVXNlZCB0byBicmVhayBjaXJjdWxhciByZWZlcmVuY2VzIChlLmcuIEN1c3RvbWVyIOKGkiBPcmRlciDihpIgQ3VzdG9tZXIpLlxuICovXG5mdW5jdGlvbiBhZGRSZWxhdGlvblBrUmVmKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICBwa1R5cGVOYW1lOiBzdHJpbmcsXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IHBrVHlwZU5hbWUgfSwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZywgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpO1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogKHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nKSxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb25VcGRhdGUoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PixcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGV4dHJhTW9kZWxzID1cbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUywgRHRvQ2xhc3MpIHx8IFtdO1xuICBpZiAoIWV4dHJhTW9kZWxzLmluY2x1ZGVzKHJlbGF0aW9uRHRvKSkge1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsXG4gICAgICBbLi4uZXh0cmFNb2RlbHMsIHJlbGF0aW9uRHRvXSxcbiAgICAgIER0b0NsYXNzXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGR0b1JlZiA9IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke3JlbGF0aW9uRHRvLm5hbWV9YDtcbiAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgY29uc3Qgb25lT2ZJdGVtcyA9IFt7ICRyZWY6IGR0b1JlZiB9LCB7IHR5cGU6IHBrVHlwZU5hbWUgfV07XG5cbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSk7XG5cbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IE9iamVjdCxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IE1vZGVsLnBrUHJvcHMocmVsYXRpb25UeXBlIGFzIGFueSk7XG4gICAgY29uc3QgcGtUeXBlID0gcGtQcm9wc01ldGFkYXRhPy50eXBlO1xuICAgIGlmIChwa1R5cGUgPT09IE51bWJlciB8fCBwa1R5cGUgPT09IEJpZ0ludCkgcmV0dXJuIFwiaW50ZWdlclwiO1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGlmIChNb2RlbC5nZW5lcmF0ZWQoY3VycmVudCwgcHJvcCBhcyBhbnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihjdXJyZW50LCBwcm9wIGFzIGFueSk7XG4gICAgaWYgKHZhbGlkYXRpb24pIHJldHVybiB2YWxpZGF0aW9uIGFzIGFueTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbDogQ29uc3RydWN0b3I8YW55PiwgcHJvcDogc3RyaW5nKTogYW55IHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEudHlwZShjdXJyZW50LCBwcm9wKTtcbiAgICBpZiAodHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXREdG9DYWNoZShcbiAgb3A6IE9wZXJhdGlvbktleXNcbik6IFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj4ge1xuICBpZiAoIWR0b0NhY2hlLmhhcyhvcCkpIHtcbiAgICBkdG9DYWNoZS5zZXQob3AsIG5ldyBXZWFrTWFwKCkpO1xuICB9XG4gIHJldHVybiBkdG9DYWNoZS5nZXQob3ApITtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIENvbnRleHRPZiwgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG4oQWRhcHRlciBhcyBhbnkpLnRyYW5zZm9ybWVyRm9yID0gZnVuY3Rpb24gdG9Db250ZXh0RmxhZ3M8XG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4sXG4+KGFkYXB0ZXI6IEEgfCBzdHJpbmcpOiBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8Q29udGV4dE9mPEE+Pj4ge1xuICBjb25zdCBhbGlhcyA9XG4gICAgdHlwZW9mIGFkYXB0ZXIgPT09IFwic3RyaW5nXCIgPyBhZGFwdGVyIDogKGFkYXB0ZXIuYWxpYXMgYXMgc3RyaW5nKTtcbiAgcmV0dXJuIE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSwgYWxpYXMpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQWRhcHRlciBhcyBhbnkpLmZsYXZvdXJzVG9UcmFuc2Zvcm0gPSBmdW5jdGlvbiByZXF1ZXN0VHJhbnNmb3JtZXJzKCk6XG4gIHwgc3RyaW5nW11cbiAgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihDb250ZXh0IGFzIGFueSkucHJvdG90eXBlLnRvUmVzcG9uc2UgPSBmdW5jdGlvbiB0b1Jlc3BvbnNlPFxuICBSRVMgZXh0ZW5kcyB7IGhlYWRlcjogYW55IH0sXG4+KHRoaXM6IENvbnRleHQsIHJlczogUkVTKTogUkVTIHtcbiAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZygpO1xuICBpZiAocGVuZGluZykgcmVzLmhlYWRlcihcIngtcGVuZGluZy10YXNrXCIsIEpTT04uc3RyaW5naWZ5KHBlbmRpbmcpKTtcbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEJ1aWxkZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4uL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZGVjb3JhdG9yc1wiO1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIEF1dGgobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICAgIGRlY29yYXRlQ2xhc3MoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgfVxufVxuXG5jb25zdCBwcm90b3R5cGUgPSBNb2RlbEJ1aWxkZXIucHJvdG90eXBlIGFzIE1vZGVsQnVpbGRlcjxhbnk+ICYge1xuICBBdXRoOiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSA9PiBNb2RlbEJ1aWxkZXI8YW55Pjtcbn07XG5cbmlmICghcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MpIHtcbiAgcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MgPSBmdW5jdGlvbiAoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcikge1xuICAgIGlmICghKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMgPSBbXTtcbiAgICB9XG4gICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzLnB1c2goZGVjb3JhdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxucHJvdG90eXBlLkF1dGggPSBmdW5jdGlvbiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3MoQXV0aChtb2RlbCkpO1xufTtcblxuaWYgKCEocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQpIHtcbiAgY29uc3Qgb3JpZ2luYWxCdWlsZCA9IHByb3RvdHlwZS5idWlsZDtcbiAgcHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXN1bHQgPSBvcmlnaW5hbEJ1aWxkLmNhbGwodGhpcyk7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9ICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycztcbiAgICBpZiAoZGVjb3JhdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRlZCA9IGRlY29yYXRvcihyZXN1bHQgYXMgYW55KSBhcyB0eXBlb2YgcmVzdWx0IHwgdm9pZDtcbiAgICAgICAgaWYgKGRlY29yYXRlZCkge1xuICAgICAgICAgIHJlc3VsdCA9IGRlY29yYXRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQgPSB0cnVlO1xufVxuIiwiaW1wb3J0IHtcbiAgQ29udHJvbGxlcixcbiAgUGFyYW0sXG4gIFF1ZXJ5LFxuICBSZXNwb25zZSxcbiAgU2V0TWV0YWRhdGEsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpTm90Rm91bmRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG4gIEFwaVRhZ3MsXG4gIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSxcbiAgZ2V0U2NoZW1hUGF0aCxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIHR5cGUgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcsIHRvS2ViYWJDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEFwaU9wZXJhdGlvbkZyb21Nb2RlbCxcbiAgQXBpUGFyYW1zRnJvbU1vZGVsLFxuICB0eXBlIERlY2FmQXBpUHJvcGVydHksXG4gIERlY2FmQm9keSxcbiAgRGVjYWZRdWVyeSxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgREVDQUZfUk9VVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTS0lQX01PREVMX1JPTEVTX0tFWSB9IGZyb20gXCIuLi9hdXRoL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aCwgUHVibGljLCBSZXF1aXJlUm9sZXMgfSBmcm9tIFwiLi4vYXV0aC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IER0b0ZvciB9IGZyb20gXCIuLi9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlclwiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LFxuICB0eXBlIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcsXG4gIHR5cGUgQXV0aENvbmZpZyxcbiAgdHlwZSBTZXJ2ZXJSb3V0ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIEZyb21Nb2RlbENvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuXG4gIHByaXZhdGUgc3RhdGljIHRvRGVjYWZFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBmYWxsYmFja01lc3NhZ2U6IHN0cmluZ1xuICApOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICA6IGZhbGxiYWNrTWVzc2FnZVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UGVyc2lzdGVuY2U8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPFQ+PihNb2RlbENsYXp6KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoTW9kZWxDbGF6eikgYXMgTW9kZWxTZXJ2aWNlPFQ+O1xuICAgICAgfSBjYXRjaCAoZTI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoTW9kZWxDbGF6eikgYXMgUmVwbzxUPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICAgIHByZWZpeDogc3RyaW5nID0gUGVyc2lzdGVuY2VLZXlzLlFVRVJZXG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgcmVwbzogUmVwbzxUPiA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcbiAgICBjb25zdCBxdWVyeU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIHsgZmllbGRzPzogc3RyaW5nW10gfCB1bmRlZmluZWQgfT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICByZXBvLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoUGVyc2lzdGVuY2VLZXlzLlFVRVJZKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNvbnN0IHJvdXRlTWV0aG9kczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHBlcnNpc3RlbmNlLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoREVDQUZfUk9VVEUpXG4gICAgICApID8/IHt9O1xuXG4gICAgY2xhc3MgUXVlcnlDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIHBhcmFtc10gb2YgT2JqZWN0LmVudHJpZXMocm91dGVNZXRob2RzKSkge1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3BhcmFtcy5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChRdWVyeUNvbnRyb2xsZXIsIG1ldGhvZE5hbWUsIGhhbmRsZXIpO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihwYXJhbXMuaHR0cE1ldGhvZCBhcyBIdHRwVmVyYnMpKFxuICAgICAgICByb3V0ZVBhdGggfHwgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIHBhcmFtcy5odHRwTWV0aG9kXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBbXG4gICAgICAgIGh0dHBEZWNvcmF0b3IsXG4gICAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBvYmpWYWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJ5TWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IG9ialZhbHVlcy5maWVsZHMgPz8gW107XG4gICAgICBjb25zdCByb3V0ZVBhdGggPSBbcHJlZml4LCBtZXRob2ROYW1lLCAuLi5maWVsZHMubWFwKChmKSA9PiBgOiR7Zn1gKV1cbiAgICAgICAgLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudCAmJiBzZWdtZW50LnRyaW0oKSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApIGFzIGFueTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgaGFuZGxlcik7XG5cbiAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKFwiR0VUXCIgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgcm91dGVQYXRoIHx8IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICBcIkdFVFwiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBbXG4gICAgICAgIGh0dHBEZWNvcmF0b3IsXG4gICAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUXVlcnlDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZTxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8VD4sXG4gICAgbW9kdWxlQ29uZmlnT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4sXG4gICAgZ2xvYmFsRGVmYXVsdHM/OiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+XG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgbG9nID0gRnJvbU1vZGVsQ29udHJvbGxlci5sb2cuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoTW9kZWxDb25zdHIpO1xuICAgIGNvbnN0IHJvdXRlUGF0aCA9IHRvS2ViYWJDYXNlKHRhYmxlTmFtZSk7XG4gICAgY29uc3QgbW9kZWxDbGF6ek5hbWUgPSBNb2RlbENvbnN0ci5uYW1lO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRQZXJzaXN0ZW5jZShNb2RlbENvbnN0cik7XG5cbiAgICAvLyBXaGVuIHBlcnNpc3RlbmNlIGlzIGEgTW9kZWxTZXJ2aWNlLCB0aGUgQHF1ZXJ5L0Byb3V0ZSBtZXRhZGF0YSBsaXZlcyBvblxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIHJlcG9zaXRvcnkgY2xhc3MgKGN1c3RvbSByZXBvKSwgbm90IG9uIE1vZGVsU2VydmljZSBpdHNlbGYuXG4gICAgLy8gUGFzcyB0aGUgcmVwbyB0byB0aGUgZmFjdG9yeSBzbyBhZGRDb21wbGV4UXVlcmllcygpIGNhbiBkaXNjb3ZlciB0aGVtLlxuICAgIGNvbnN0IGZhY3RvcnlQZXJzaXN0ZW5jZSA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcblxuICAgIGNvbnN0IGRlY29yYXRvckNvbmZpZyA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX0NPTlRST0xMRVJfQ09ORklHKVxuICAgICkgYXMgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtb2R1bGVPdmVycmlkZSA9IG1vZHVsZUNvbmZpZ092ZXJyaWRlcz8uW01vZGVsQ29uc3RyLm5hbWVdO1xuICAgIGNvbnN0IG1lcmdlZENvbmZpZzogTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyA9IHtcbiAgICAgIC4uLihnbG9iYWxEZWZhdWx0cyB8fCB7fSksXG4gICAgICAuLi4oZGVjb3JhdG9yQ29uZmlnIHx8IHt9KSxcbiAgICAgIC4uLihtb2R1bGVPdmVycmlkZSB8fCB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IEZhY3RvcnlDb250cm9sbGVyID0gTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGU8VD4oXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIGZhY3RvcnlQZXJzaXN0ZW5jZSxcbiAgICAgIG1lcmdlZENvbmZpZ1xuICAgICk7XG4gICAgY29uc3QgZmFjdG9yeVJvdXRlcyA9IChGYWN0b3J5Q29udHJvbGxlciBhcyBhbnkpLl9fcm91dGVzX18gYXNcbiAgICAgIHwgU2VydmVyUm91dGVbXVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7XG4gICAgICBnZXRQSyxcbiAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICBwYXRoOiBwa1BhdGgsXG4gICAgfSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsKE1vZGVsQ29uc3RyKTtcblxuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBjb250cm9sbGVyIGZvciBtb2RlbDogJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke2ZhY3RvcnlSb3V0ZXM/Lmxlbmd0aCA/PyAwfSBmYWN0b3J5IHJvdXRlc2BcbiAgICApO1xuXG4gICAgY29uc3QgYXV0aENvbmZpZzogQXV0aENvbmZpZyB8IHVuZGVmaW5lZCA9IG1lcmdlZENvbmZpZy5hdXRoO1xuXG4gICAgZnVuY3Rpb24gYXBwbHlDbGFzc0F1dGgodGFyZ2V0OiBhbnkpIHtcbiAgICAgIGlmIChhdXRoQ29uZmlnPy5wdWJsaWMpIHtcbiAgICAgICAgUHVibGljKCkodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXV0aENvbmZpZz8ucm9sZXM/Lmxlbmd0aCkge1xuICAgICAgICBSZXF1aXJlUm9sZXMoLi4uYXV0aENvbmZpZy5yb2xlcykodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEF1dGgoTW9kZWxDb25zdHIpKHRhcmdldCk7XG4gICAgICB9XG4gICAgICBpZiAoYXV0aENvbmZpZz8uc2tpcE1vZGVsUm9sZXMpIHtcbiAgICAgICAgU2V0TWV0YWRhdGEoU0tJUF9NT0RFTF9ST0xFU19LRVksIHRydWUpKHRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQENvbnRyb2xsZXIocm91dGVQYXRoKVxuICAgIEBBcGlUYWdzKG1vZGVsQ2xhenpOYW1lKVxuICAgIEBBcGlFeHRyYU1vZGVscyhNb2RlbENvbnN0cilcbiAgICBjbGFzcyBEeW5hbWljTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgcHJpdmF0ZSByZWFkb25seSBwazogc3RyaW5nID0gTW9kZWwucGsoTW9kZWxDb25zdHIpIGFzIHN0cmluZztcblxuICAgICAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgY2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRHluYW1pY01vZGVsQ29udHJvbGxlci5uYW1lKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJlZ2lzdGVyaW5nIGR5bmFtaWMgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7dGhpcy5jbGFzcy5uYW1lfSByb3V0ZTogLyR7cm91dGVQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUNsYXNzQXV0aChEeW5hbWljTW9kZWxDb250cm9sbGVyKTtcblxuICAgIGlmIChmYWN0b3J5Um91dGVzKSB7XG4gICAgICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBbLi4uZmFjdG9yeVJvdXRlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhU2VnbWVudHMgPSBhLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3QgYlNlZ21lbnRzID0gYi5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGFQYXJhbUNvdW50ID0gYVNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBiUGFyYW1Db3VudCA9IGJTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYUxpdGVyYWxDb3VudCA9IGFTZWdtZW50cy5sZW5ndGggLSBhUGFyYW1Db3VudDtcbiAgICAgICAgY29uc3QgYkxpdGVyYWxDb3VudCA9IGJTZWdtZW50cy5sZW5ndGggLSBiUGFyYW1Db3VudDtcbiAgICAgICAgaWYgKGFMaXRlcmFsQ291bnQgIT09IGJMaXRlcmFsQ291bnQpXG4gICAgICAgICAgcmV0dXJuIGJMaXRlcmFsQ291bnQgLSBhTGl0ZXJhbENvdW50O1xuICAgICAgICBpZiAoYVBhcmFtQ291bnQgIT09IGJQYXJhbUNvdW50KSByZXR1cm4gYVBhcmFtQ291bnQgLSBiUGFyYW1Db3VudDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWRSb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9XG4gICAgICAgICAgcm91dGUuaW1wbGVtZW50YXRpb24/Lm5hbWUgfHwgcm91dGUubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IEZyb21Nb2RlbENvbnRyb2xsZXIubWF0Y2hSb3V0ZShcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIHBrUGF0aCxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIGdldFBLLFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVnaXN0cmF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbWV0aG9kTmFtZTogcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBkZWNvcmF0b3JzLFxuICAgICAgICAgIHBhcmFtRGVjb3JhdG9ycyxcbiAgICAgICAgfSA9IHJlZ2lzdHJhdGlvbjtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihyb3V0ZS5tZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgICAgIHJvdXRlLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIikgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgICByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXSxcbiAgICAgICAgICAgIHBhcmFtRGVjb3JhdG9yc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gRHluYW1pY01vZGVsQ29udHJvbGxlciBhcyBhbnk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W107XG4gICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhNb2RlbENsYXp6KSBhcyBrZXlvZiBNb2RlbDxhbnk+O1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgTW9kZWxDbGF6eixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuQ09NUE9TRUQsIHBrKVxuICAgICk7XG4gICAgY29uc3QgY29tcG9zZWRLZXlzID0gY29tcG9zZWQ/LmFyZ3MgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVLZXlzID1cbiAgICAgIEFycmF5LmlzQXJyYXkoY29tcG9zZWRLZXlzKSAmJiBjb21wb3NlZEtleXMubGVuZ3RoID4gMFxuICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChbLi4uY29tcG9zZWRLZXlzXSkpXG4gICAgICAgIDogQXJyYXkuZnJvbShuZXcgU2V0KFtwa10pKTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eikgPz8gXCJcIjtcbiAgICBjb25zdCBwYXRoID0gYDoke3VuaXF1ZUtleXMuam9pbihcIi86XCIpfWA7XG4gICAgY29uc3QgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gdW5pcXVlS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZToga2V5LFxuICAgICAgICBkZXNjcmlwdGlvbjogTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eiwga2V5KSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PlxuICAgICAgICBjb21wb3NlZD8uc2VwYXJhdG9yID8gcGFyYW1zLmpvaW4oY29tcG9zZWQuc2VwYXJhdG9yKSA6IHBhcmFtcy5qb2luKFwiXCIpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByb3V0ZVBhcmFtRGVjb3JhdG9ycyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuICAgIHJldHVybiBwYXRoXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZmxhdE1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKlwiKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlZmluZU1ldGhvZChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSB8fCB0YXJnZXQsIG1ldGhvZE5hbWUsIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LFxuICAgICAgbWV0aG9kTmFtZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhcHBseURlY29yYXRvcnMoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIG1ldGhvZERlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7XG4gICAgICBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjtcbiAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgfT4gPSBbXVxuICApIHtcbiAgICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kTmFtZSk7XG4gICAgbWV0aG9kRGVjb3JhdG9ycy5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gICAgcGFyYW1EZWNvcmF0b3JzLmZvckVhY2goKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PlxuICAgICAgZGVjb3JhdG9yKHByb3RvLCBtZXRob2ROYW1lLCBpbmRleClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hSb3V0ZShcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgcm91dGU6IFNlcnZlclJvdXRlLFxuICAgIHBrUGF0aDogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTpcbiAgICB8IHtcbiAgICAgICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgICAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueTtcbiAgICAgICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPjtcbiAgICAgICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7XG4gICAgICAgICAgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG4gICAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgfT47XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXRoIH0gPSByb3V0ZTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gICAgY29uc3QgaGFuZGxlciA9IHJvdXRlLmltcGxlbWVudGF0aW9uIGFzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDcmVhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1JlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZUFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXNcbiAgICAgICAgKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0RlbGV0ZURlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllc1xuICAgICAgICApLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgcGtQYXRoXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPVxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgcGtQYXRoXG4gICAgICAgICksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIC4uLnJvdXRlUGFyYW1zLm1hcCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+ICh7XG4gICAgICAgICAgICBkZWNvcmF0b3IsXG4gICAgICAgICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID1cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21wb3NlZCBQSyBmYWxsYmFjayByb3V0ZXMgKGZpbHRlckVtcHR5KSDigJQgcGF0aCBkaWZmZXJzIGZyb20gcGtQYXRoXG4gICAgY29uc3QgZmFsbGJhY2tTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgaXNBbGxQYXJhbXMgPVxuICAgICAgZmFsbGJhY2tTZWdtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICBmYWxsYmFja1NlZ21lbnRzLmV2ZXJ5KChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBpZiAoaXNBbGxQYXJhbXMgJiYgbm9ybWFsaXplZFBhdGggIT09IHBrUGF0aCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tBcGlQcm9wcyA9IGZhbGxiYWNrU2VnbWVudHNcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXJgLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3VmZml4ID0gZmFsbGJhY2tTZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLmpvaW4oXCJBbmRcIik7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHJlYWRCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGB1cGRhdGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoXG4gICAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgICAgZmFsbGJhY2tBcGlQcm9wcyxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoXG4gICAgICAgICAgKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgICAgLi4ucm91dGVQYXJhbXMubWFwKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT4gKHtcbiAgICAgICAgICAgICAgZGVjb3JhdG9yLFxuICAgICAgICAgICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGBkZWxldGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoXG4gICAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgICAgZmFsbGJhY2tBcGlQcm9wcyxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoXG4gICAgICAgICAgKSxcbiAgICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInN0YXRlbWVudFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcIm1ldGhvZFwiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwiYXJnc1wiKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImZpbmRPbmVCeVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQllcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVtZW50Um91dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICAgIFwicGFnaW5hdGVCeS86a2V5LzpwYWdlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZLFxuICAgICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgICBcImZpbmRPbmVCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlksXG4gICAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICAgIFwiY291bnRPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLFxuICAgICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgICBcImF2Z09mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GLFxuICAgICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgICAgXCJncm91cE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEtleSA9IHN0YXRlbWVudFJvdXRlc1tub3JtYWxpemVkUGF0aF07XG4gICAgaWYgKHN0YXRlbWVudEtleSAmJiBtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRNZXRob2ROYW1lKG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgc3RhdGVtZW50S2V5XG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgY29uc3QgcXVlcnlNZXRob2QgPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF07XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIHF1ZXJ5TWV0aG9kLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgICBxdWVyeU1ldGhvZCxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICBcIkdFVFwiLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jb21wbGV4UXVlcnlQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3Qga25vd25QcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICBcImxpc3RCeVwiLFxuICAgICAgXCJmaW5kQnlcIixcbiAgICAgIFwiZmluZEJ5UGFnaW5hdGVcIixcbiAgICAgIFwiZmluZE9uZUJ5XCIsXG4gICAgICBcInBhZ2luYXRlQnlcIixcbiAgICAgIFwiZmluZFwiLFxuICAgICAgXCJwYWdlXCIsXG4gICAgICBcImNvdW50T2ZcIixcbiAgICAgIFwibWF4T2ZcIixcbiAgICAgIFwibWluT2ZcIixcbiAgICAgIFwiYXZnT2ZcIixcbiAgICAgIFwic3VtT2ZcIixcbiAgICAgIFwiZGlzdGluY3RPZlwiLFxuICAgICAgXCJncm91cE9mXCIsXG4gICAgICBcInN0YXRlbWVudFwiLFxuICAgICAgXCJidWxrXCIsXG4gICAgICBcInF1ZXJ5XCIsXG4gICAgXSk7XG4gICAgaWYgKFxuICAgICAgcGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpICYmXG4gICAgICAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInN0YXRlbWVudC9cIikgJiZcbiAgICAgICFrbm93blByZWZpeGVzLmhhcyhwYXRoU2VnbWVudHNbMF0pXG4gICAgKSB7XG4gICAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gcGF0aFNlZ21lbnRzXG4gICAgICAgIC5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgICAgIC5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIFwiJHttZXRob2ROYW1lfVwiLmAgfSksXG4gICAgICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5cIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT5cbiAgKSB7XG4gICAgcmV0dXJuIHsgbWV0aG9kTmFtZSwgaGFuZGxlciwgZGVjb3JhdG9ycywgcGFyYW1EZWNvcmF0b3JzIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRNZXRob2ROYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlyc3RTZWdtZW50ID0gcGF0aC5zcGxpdChcIi9cIilbMF07XG4gICAgcmV0dXJuIGZpcnN0U2VnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb21wbGV4UXVlcnlQYXJhbXMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBjb25zdCBwYXJhbXM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogUGFyYW0obmFtZSkgYXMgYW55LCBpbmRleDogaSB9KTtcbiAgICB9KTtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IHNlZ21lbnRzLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIobWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXhRdWVyeShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGNvbXBsZXhRdWVyeSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZGVidWcoYEludm9raW5nIGN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cImApO1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKSkuZm9yKFxuICAgICAgICAgIGNvbXBsZXhRdWVyeVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgY29uc3Qgc3ByZWFkQXJncyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubm9ybWFsaXplUXVlcnlBcmdzKGFyZ3MpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcGVyc2lzdGVuY2U/LnJlcG8gJiZcbiAgICAgICAgICB0eXBlb2YgcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVyc2lzdGVuY2U/LnF1ZXJ5ICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5xdWVyeSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnF1ZXJ5KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2Uuc3RhdGVtZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChsb2cpIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0UXVlcnlBcmdzKGFyZ3M6IGFueVtdKTogYW55W10ge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFyZ3M7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdCAmJiB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShsYXN0KSkge1xuICAgICAgY29uc3QgcXVlcnlPYmogPSBhcmdzLnBvcCgpO1xuICAgICAgY29uc3QgaGFzRGlyZWN0aW9uID0gcXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNMaW1pdCA9IHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNPZmZzZXQgPSBxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaGFzRGlyZWN0aW9uICYmICFoYXNMaW1pdCAmJiAhaGFzT2Zmc2V0KSByZXR1cm4gYXJncztcbiAgICAgIGNvbnN0IGV4dHJhczogYW55W10gPSBbXTtcbiAgICAgIGlmIChoYXNEaXJlY3Rpb24pIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmRpcmVjdGlvbik7XG4gICAgICBlbHNlIGlmIChoYXNMaW1pdCB8fCBoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICBpZiAoaGFzTGltaXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmxpbWl0KTtcbiAgICAgIGlmIChoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgICByZXR1cm4gWy4uLmFyZ3MsIC4uLmV4dHJhc107XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbm9ybWFsaXplUXVlcnlBcmdzKGFyZ3M6IGFueVtdKTogYW55W10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBGcm9tTW9kZWxDb250cm9sbGVyLmV4dHJhY3RRdWVyeUFyZ3MoYXJncyk7XG4gICAgaWYgKG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbm9ybWFsaXplZDtcblxuICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkW25vcm1hbGl6ZWQubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFsYXN0IHx8IHR5cGVvZiBsYXN0ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobGFzdCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5T2JqID0gbGFzdCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGhhc1F1ZXJ5RmllbGRzID1cbiAgICAgIHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmouYm9va21hcmsgIT09IHVuZGVmaW5lZDtcblxuICAgIGlmICghaGFzUXVlcnlGaWVsZHMpIHtcbiAgICAgIG5vcm1hbGl6ZWQucG9wKCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICBub3JtYWxpemVkLnBvcCgpO1xuICAgIGlmIChxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLmRpcmVjdGlvbik7XG4gICAgaWYgKHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgaWYgKHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmoub2Zmc2V0KTtcbiAgICBpZiAocXVlcnlPYmouYm9va21hcmsgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLmJvb2ttYXJrKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNyZWF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUE9TVFwiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuQ1JFQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsQ2xhenpOYW1lfS5gIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICAgIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa1JlYWREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyBieSBpZHMuYCB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJpZHNcIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IFwiYXJyYXlcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa1VwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmVwbGFjZSBleGlzdGluZyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIHdpdGggbmV3IHBheWxvYWRzLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yIHJlcGxhY2luZyBleGlzdGluZyByZWNvcmRzIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICRyZWY6IGdldFNjaGVtYVBhdGgoRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0cikpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa0RlbGV0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkRFTEVURVwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgRGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUFVUXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmVwbGFjZSBhbiBleGlzdGluZyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgd2l0aCBhIG5ldyBwYXlsb2FkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yIHJlcGxhY2luZyBhbiBleGlzdGluZyByZWNvcmQgb2YgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICB0eXBlOiBEdG9Gb3IoT3BlcmF0aW9uS2V5cy5VUERBVEUsIE1vZGVsQ29uc3RyKSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlbGV0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkRFTEVURVwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50RGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJzdGF0ZW1lbnQvOm1ldGhvZC8qYXJnc1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBFeGVjdXRlcyBhIHByZXBhcmVkIHN0YXRlbWVudCBvbiAke21vZGVsQ2xhenpOYW1lfS5gLFxuICAgICAgfSksXG4gICAgICBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwibWV0aG9kXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgdG8gZXhlY3V0ZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwiYXJnc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcImNvbmNhdGVuYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGNhbiBhY2NlcHRcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBsaXN0ZWQgZm91bmQuYCB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc3RhdGVtZW50S2V5OiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgYmFzZTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGF0aCksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3Jkcy5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBiYXNlLnB1c2goQXBpUGFyYW0oeyBuYW1lLCBkZXNjcmlwdGlvbjogYFRoZSAke25hbWV9IHBhcmFtZXRlcmAgfSkpO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlclwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwicGFnZSBudW1iZXJcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImJvb2ttYXJrXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcImJvb2ttYXJrIGZvciBjdXJzb3IgcGFnaW5hdGlvblwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiZmluZE9uZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kQnkvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiB8fFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GXG4gICAgKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IGZvciAke21vZGVsQ2xhenpOYW1lfS5gLFxuICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRikge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYERpc3RpbmN0IHZhbHVlcyBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgICAgICB0eXBlOiBbU3RyaW5nXSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVyeURlY29yYXRvcnMoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICAgIGh0dHBWZXJiOiBzdHJpbmcsXG4gICAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgZXh0cmFjdFBhdGhQYXJhbXMgPSAocDogc3RyaW5nKTogc3RyaW5nW10gPT5cbiAgICAgIHBcbiAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgICAgICAubWFwKChzKSA9PiBzLnNsaWNlKDEpKTtcblxuICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuXG4gICAgaWYgKGh0dHBWZXJiID09PSBcIkdFVFwiICYmIGluY2x1ZGVRdWVyeVBhcmFtcykge1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemVcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmtcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29yYXRvcnM7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgUHJvdmlkZXIgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE1vZGVsU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRnJvbU1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuL0Zyb21Nb2RlbENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZUZvcihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgQE1vZHVsZSh7fSlcbiAgY2xhc3MgRGVjYWZNb2RlbE1vZHVsZSB7XG4gICAgc3RhdGljIHJlYWRvbmx5IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmTW9kZWxNb2R1bGUubmFtZSkuZm9yKGZsYXZvdXIpO1xuXG4gICAgc3RhdGljIGNyZWF0ZU1vZGVsU2VydmljZXM8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICAgIG1vZGVsczogTW9kZWxDb25zdHJ1Y3RvcjxUPltdXG4gICAgKTogUHJvdmlkZXJbXSB7XG4gICAgICByZXR1cm4gbW9kZWxzLm1hcCgobW9kZWwpID0+ICh7XG4gICAgICAgIHByb3ZpZGU6IGAke21vZGVsLm5hbWV9U2VydmljZWAsXG4gICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc0V4cG9zZWQoXG4gICAgICBtb2RlbDogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgZXhwb3N1cmU/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgc3RyaW5nW10+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4cG9zdXJlPy5bbW9kZWwubmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHR5cGVvZiBvdmVycmlkZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgID8gb3ZlcnJpZGVcbiAgICAgICAgICA6IE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KERFQ0FGX0VYUE9TRSkpO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmbGF2b3VyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9yUm9vdChcbiAgICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM6IFBhcnRpYWw8RGVjYWZNb2R1bGVPcHRpb25zPiA9IHt9XG4gICAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0aW5nIGNvbnRyb2xsZXJzIGZvciBmbGF2b3VyLi4uYCk7XG5cbiAgICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKS5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICB0aGlzLmlzRXhwb3NlZChtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUpXG4gICAgICApO1xuXG4gICAgICAvLyBDb250cm9sbGVycyBhbHdheXMgcmVseSBvbiBhIGJhY2tpbmcgTW9kZWxTZXJ2aWNlLCBldmVuIHdoZW4gTmVzdCBwcm92aWRlcnNcbiAgICAgIC8vIGFyZSBub3QgYXV0by1yZWdpc3RlcmVkLiBXYXJtIHRoZSBzaW5nbGV0b24gcmVnaXN0cnkgaGVyZSBzbyBzaHV0ZG93biBjYW5cbiAgICAgIC8vIHNlZSB0aGUgbGl2ZSBzZXJ2aWNlcyBjcmVhdGVkIGZvciB0aGUgZ2VuZXJhdGVkIGNvbnRyb2xsZXJzLlxuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiB0cmFja2VkTW9kZWxzKSBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KTtcblxuICAgICAgbGV0IG1vZGVsU2VydmljZXM6IFByb3ZpZGVyW10gPSBbXTtcbiAgICAgIGlmIChvcHRpb25zLmF1dG9TZXJ2aWNlcykge1xuICAgICAgICBsb2cuaW5mbyhcIkF1dG8tc2VydmljZXMgZW5hYmxlZC4gSW5pdGlhbGl6aW5nIHNlcnZpY2UgZ2VuZXJhdGlvbi5cIik7XG4gICAgICAgIG1vZGVsU2VydmljZXMgPSB0aGlzLmNyZWF0ZU1vZGVsU2VydmljZXModHJhY2tlZE1vZGVscyk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBBdXRvLXNlcnZpY2VzIGNvbXBsZXRlZC4gJHttb2RlbFNlcnZpY2VzLmxlbmd0aH0gc2VydmljZXMgaW5pdGlhbGl6ZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBnbG9iYWxEZWZhdWx0czogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPiA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMuYWdncmVnYXRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBnbG9iYWxEZWZhdWx0cy5hbGxvd0dyb3VwaW5nUXVlcmllcyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKChtb2RlbCkgPT5cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckNvbmZpZywgZ2xvYmFsRGVmYXVsdHMpXG4gICAgICApO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRlZCAke2NvbnRyb2xsZXJzLmxlbmd0aH0gY29udHJvbGxlcnNgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kdWxlOiBEZWNhZk1vZGVsTW9kdWxlLFxuICAgICAgICBjb250cm9sbGVycyxcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgLi4ubW9kZWxTZXJ2aWNlcyxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIE9iamVjdC5hc3NpZ24oRGVjYWZNb2RlbE1vZHVsZSwgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYERlY2FmTW9kdWxlJHtmbGF2b3VyfWAsXG4gIH0pO1xuICByZXR1cm4gRGVjYWZNb2RlbE1vZHVsZTtcbn1cbiIsImltcG9ydCB7XG4gIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyxcbiAgSW5qZWN0YWJsZUNvbmZpZyxcbiAgSW5qZWN0YWJsZXNLZXlzLFxuICBJbmplY3RPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIERlY29yYXRpb24sIERlY29yYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3RhYmxlKFxuICAgICAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgY2ZnPzogSW5qZWN0YWJsZUNvbmZpZ1xuICAgICkge1xuICAgICAgY2ZnID1cbiAgICAgICAgY2ZnIHx8XG4gICAgICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIGNhdGVnb3J5IGFzIFJlY29yZDxhbnksIGFueT4sXG4gICAgICAgICAgICAgIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKTtcbiAgICAgIHJldHVybiBJbmplY3RhYmxlKHtcbiAgICAgICAgc2NvcGU6IGNmZy5zaW5nbGV0b24gPyBTY29wZS5ERUZBVUxUIDogU2NvcGUuUkVRVUVTVCxcbiAgICAgICAgZHVyYWJsZTogY2ZnLnNpbmdsZXRvbiA/IHVuZGVmaW5lZCA6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0KFxuICAgICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgY2ZnOiBJbmplY3RPcHRpb25zXG4gICAgKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaW5uZXJOZXN0SW5qZWN0KFxuICAgICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICAgIGRlc2NyaXB0b3I/OiBhbnlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gSW5qZWN0KGNhdGVnb3J5IHx8ICh0YXJnZXQgYXMgQ29uc3RydWN0b3IpKShcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpXG4gIC5leHRlbmQoXG4gICAgQXBpUHJvcGVydHkoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgKVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4aW11bTogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5EZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbmltdW06IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heExlbmd0aERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4TGVuZ3RoOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5MZW5ndGhEZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbkxlbmd0aDogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlRZUEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gdHlwZURlYyhcbiAgICAgIHR5cGU6XG4gICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXVxuICAgICAgICB8IENvbnN0cnVjdG9yXG4gICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuICAgICkge1xuICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4gICAgICAgIHR5cGUgPSBBcnJheS5pc0FycmF5KHR5cGUpID8gdHlwZVswXSA6IHR5cGU7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICF0eXBlLm5hbWUpXG4gICAgICAgICAgdHlwZSA9ICh0eXBlIGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgfSkodGFyZ2V0LCBwcm9wKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTElTVClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBsaXN0RGVjKFxuLy8gICAgICAgY2xheno6XG4vLyAgICAgICAgIHwgQ29uc3RydWN0b3Jcbi8vICAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4vLyAgICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXSxcbi8vICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbi8vICAgICAgIGNvbGxlY3Rpb246IFwiQXJyYXlcIiB8IFwiU2V0XCIgPSBcIkFycmF5XCJcbi8vICAgICApIHtcbi8vICAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuLy8gICAgICAgICBjbGF6eiA9IEFycmF5LmlzQXJyYXkoY2xhenopID8gY2xhenpbMF0gOiBjbGF6ejtcbi8vICAgICAgICAgaWYgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lKVxuLy8gICAgICAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuLy8gICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBbY2xhenogYXMgYW55XSB9KSh0YXJnZXQsIHByb3ApO1xuLy8gICAgICAgfTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vIC8vXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuICAuZXh0ZW5kKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkYXRlRGVjKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlLXRpbWVcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAvLyBleGFtcGxlOiBwYXJzZURhdGUoZm9ybWF0LCBuZXcgRGF0ZSgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5FTlVNKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9wdGlvbkRlYyhvcHRpb25zOiBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IE9iamVjdC52YWx1ZXMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBlbnVtOiBvcHRzLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUEFUVEVSTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBwYXR0ZXJuRGVjKHBhdDogUmVnRXhwIHwgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBwYXR0ZXJuOiB0eXBlb2YgcGF0ID09PSBcInN0cmluZ1wiID8gcGF0IDogcGF0LnNvdXJjZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1uRGVjKG5hbWU6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uRGVjKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5BVVRIKS5leHRlbmQoeyBkZWNvcmF0b3I6IEF1dGggfSkuYXBwbHkoKTtcbiIsImltcG9ydCB7IEZvcmJpZGRlbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3JzRXJyb3IgZXh0ZW5kcyBGb3JiaWRkZW5FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIENvcnNFcnJvci5uYW1lKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBUb01hbnlSZXF1ZXN0c0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciApIHtcbiAgICBzdXBlcihUb01hbnlSZXF1ZXN0c0Vycm9yLm5hbWUsIG1zZyAsIDQyOSk7XG4gIH1cbn0iLCJpbXBvcnQge1xuICBBcmd1bWVudHNIb3N0LFxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBDYXRjaCxcbiAgQ29uZmxpY3RFeGNlcHRpb24sXG4gIEV4Y2VwdGlvbkZpbHRlcixcbiAgRm9yYmlkZGVuRXhjZXB0aW9uLFxuICBIdHRwRXhjZXB0aW9uLFxuICBJbmplY3RhYmxlLFxuICBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgT3B0aW9uYWwsXG4gIFVuYXV0aG9yaXplZEV4Y2VwdGlvbixcbiAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb250ZXh0SWRGYWN0b3J5LCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50LCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IsIEZvcmJpZGRlbkVycm9yLCBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUb01hbnlSZXF1ZXN0c0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy90aHJvdHRsaW5nXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0TG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyB3ZWxsLWtub3duIE5lc3RKUyBgSHR0cEV4Y2VwdGlvbmAgc3ViY2xhc3NlcyAoYXMgZ3VhcmRzLCBwaXBlcywgb3JcbiAqIG90aGVyIGZyYW1ld29yay1sZXZlbCBjb2RlIHdvdWxkIHRocm93IHRoZW0pIG9udG8gdGhlIGVxdWl2YWxlbnQgZGVjYWYtdHMgYEJhc2VFcnJvcmAuXG4gKiBAc3VtbWFyeSBPbmx5IGBCYXNlRXJyb3JgIGluc3RhbmNlcyBjYXJyeSB0aGUgYC5jb2RlYCB0aGUgcmVzcG9uc2UgYm9keSByZWxpZXMgb24sIHNvXG4gKiB3aXRob3V0IHRoaXMgbWFwIGV2ZXJ5IG5vbi1kZWNhZiBleGNlcHRpb24g4oCUIGluY2x1ZGluZyBwZXJmZWN0bHkgbGVnaXRpbWF0ZSBvbmVzIGxpa2UgYVxuICogZ3VhcmQncyBgRm9yYmlkZGVuRXhjZXB0aW9uYCDigJQgd291bGQgYmUgZmxhdHRlbmVkIGludG8gYSBnZW5lcmljIDUwMCBgSW50ZXJuYWxFcnJvcmAuXG4gKi9cbmNvbnN0IEhUVFBfRVhDRVBUSU9OX1RPX0RFQ0FGX0VSUk9SID0gbmV3IE1hcDxcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gSHR0cEV4Y2VwdGlvbixcbiAgKG1zZzogc3RyaW5nKSA9PiBCYXNlRXJyb3Jcbj4oW1xuICBbVW5hdXRob3JpemVkRXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1zZyldLFxuICBbRm9yYmlkZGVuRXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgRm9yYmlkZGVuRXJyb3IobXNnKV0sXG4gIFtCYWRSZXF1ZXN0RXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQmFkUmVxdWVzdEVycm9yKG1zZyldLFxuICBbQ29uZmxpY3RFeGNlcHRpb24sIChtc2cpID0+IG5ldyBDb25mbGljdEVycm9yKG1zZyldLFxuICBbVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgKG1zZykgPT4gbmV3IFZhbGlkYXRpb25FcnJvcihtc2cpXSxcbl0pO1xuXG5AQ2F0Y2goKVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZHVsZVJlZj86IE1vZHVsZVJlZikge31cblxuICBhc3luYyBjYXRjaChleGNlcHRpb246IEVycm9yLCBob3N0OiBBcmd1bWVudHNIb3N0KSB7XG4gICAgY29uc3QgY3R4ID0gaG9zdC5zd2l0Y2hUb0h0dHAoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGN0eC5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBjdHguZ2V0UmVxdWVzdCgpO1xuXG4gICAgY29uc3QgaXNQcm9kdWN0aW9uID0gTG9nZ2VkRW52aXJvbm1lbnQuZW52ID09PSBcInByb2R1Y3Rpb25cIjtcbiAgICBsZXQgc3RhdHVzQ29kZTtcblxuICAgIGlmIChcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8XG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yXG4gICAgKSB7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICBzdGF0dXNDb2RlID0gKGV4Y2VwdGlvbiBhcyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKS5nZXRTdGF0dXMoKTtcbiAgICB9IGVsc2UgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgQmFzZUVycm9yKSkge1xuICAgICAgY29uc3QgdG9EZWNhZkVycm9yID0gdGhpcy5kZWNhZkVycm9yRm9yKGV4Y2VwdGlvbik7XG4gICAgICBpZiAodG9EZWNhZkVycm9yKSB7XG4gICAgICAgIGV4Y2VwdGlvbiA9IHRvRGVjYWZFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKChleGNlcHRpb24gYXMgYW55KS5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEh0dHBFeGNlcHRpb24pIHtcbiAgICAgICAgLy8gQSByZWNvZ25pemVkIGJ1dCB1bm1hcHBlZCBIdHRwRXhjZXB0aW9uIChlLmcuIHRocm93biBieSBhIGd1YXJkIG9yXG4gICAgICAgIC8vIHBpcGUpIOKAlCBwcmVzZXJ2ZSBpdHMgcmVhbCBzdGF0dXMgaW5zdGVhZCBvZiBmbGF0dGVuaW5nIGl0IHRvIDUwMC5cbiAgICAgICAgc3RhdHVzQ29kZSA9IGV4Y2VwdGlvbi5nZXRTdGF0dXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBJbnRlcm5hbEVycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ0Vycm9yKHJlcXVlc3QsIGV4Y2VwdGlvbik7XG5cbiAgICByZXNwb25zZS5zdGF0dXMoKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSkuanNvbih7XG4gICAgICBzdGF0dXM6IChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUsXG4gICAgICBlcnJvcjogaXNQcm9kdWN0aW9uID8gZXhjZXB0aW9uLm5hbWUgOiBleGNlcHRpb24ubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcGF0aDogcmVxdWVzdC51cmwsXG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgZGVjYWYtdHMgYEJhc2VFcnJvcmAgY29uc3RydWN0b3IgbWFwcGVkIHRvIHRoaXMgZXhjZXB0aW9uJ3MgdHlwZSwgaWYgYW55LlxuICAgKiBAc3VtbWFyeSBXYWxrcyBgSFRUUF9FWENFUFRJT05fVE9fREVDQUZfRVJST1JgIHdpdGggYGluc3RhbmNlb2ZgIChyYXRoZXIgdGhhbiBhIHN0cmFpZ2h0XG4gICAqIGBNYXAuZ2V0YCkgc28gc3ViY2xhc3NlcyBvZiBhIG1hcHBlZCBleGNlcHRpb24gYXJlIG1hdGNoZWQgdG9vLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlY2FmRXJyb3JGb3IoXG4gICAgZXhjZXB0aW9uOiBFcnJvclxuICApOiAoKG1zZzogc3RyaW5nKSA9PiBCYXNlRXJyb3IpIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBmYWN0b3J5XSBvZiBIVFRQX0VYQ0VQVElPTl9UT19ERUNBRl9FUlJPUikge1xuICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIHR5cGUpIHJldHVybiBmYWN0b3J5O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIHRoZSBleGNlcHRpb24gd2l0aG91dCBldmVyIGxldHRpbmcgbG9nZ2luZyBmYWlsdXJlcyBibG9jayB0aGUgcmVzcG9uc2UuXG4gICAqIEBzdW1tYXJ5IEEgZ3VhcmQgKG9yIG1pZGRsZXdhcmUvQ09SUyBjaGVjaykgY2FuIHRocm93IGJlZm9yZSBhbnkgZGVjYWYtYXdhcmUgcHJvdmlkZXIgcmFuLFxuICAgKiBzbyB0aGUgcmVxdWVzdC1ib3VuZCBDb250ZXh0IG1heSBub3QgZXhpc3QgeWV0IOKAlCBvciB0aGUgcmVzb2x2ZWQgbG9nZ2VyJ3MgYC5lcnJvcigpYCBpdHNlbGZcbiAgICogY291bGQgdGhyb3cgKGJyb2tlbiB0cmFuc3BvcnQsIGZvcm1hdHRlciBidWcsIGV0Yy4pLiBFaXRoZXIgd2F5IHRoZSBjbGllbnQtZmFjaW5nIGVycm9yXG4gICAqIHJlc3BvbnNlIGJlbG93IG11c3Qgc3RpbGwgZ28gb3V0LCBzbyBldmVyeSBmYWlsdXJlIG1vZGUgaGVyZSBpcyBzd2FsbG93ZWQsIGZhbGxpbmcgYmFjayB0b1xuICAgKiB0aGUgcGxhaW4gYExvZ2dpbmcuZ2V0KClgIGxvZ2dlciBhbmQsIGFzIGEgbGFzdCByZXNvcnQsIGRvaW5nIG5vdGhpbmcgYXQgYWxsLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvZ0Vycm9yKFxuICAgIHJlcXVlc3Q6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgZXhjZXB0aW9uOiBFcnJvclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gYFVuaGFuZGxlZCBlcnJvciBvbiAke3JlcXVlc3Q/Lm1ldGhvZH0gJHtyZXF1ZXN0Py51cmx9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nID0gYXdhaXQgdGhpcy5yZXNvbHZlTG9nZ2VyKHJlcXVlc3QpO1xuICAgICAgbG9nLmVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBMb2dnaW5nLmdldCgpLmVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbG9nZ2luZyBpcyB1bmF2YWlsYWJsZSDigJQgdGhlIHJlc3BvbnNlIGlzIHN0aWxsIHNlbnQgYmVsb3dcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBsb2dnZXIgYm91bmQgdG8gdGhlIG9yaWdpbmF0aW5nIHJlcXVlc3QncyBkZWNhZi10cyBDb250ZXh0LlxuICAgKiBAc3VtbWFyeSBHbG9iYWwgZmlsdGVycyBhcmUgc2luZ2xldG9ucywgc28gdGhlIHJlcXVlc3Qtc2NvcGVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fVxuICAgKiAoYW5kIHRoZSBjbGllbnQvdXNlci1ib3VuZCBsb2dnZXIgaXQgY2FycmllcykgY2FuJ3QgYmUgY29uc3RydWN0b3ItaW5qZWN0ZWQuIEluc3RlYWQsIHRoaXNcbiAgICogbG9va3MgdXAgdGhlIHNhbWUgcmVxdWVzdCdzIGNvbnRleHQgaWQgYW5kIHJlLXJlc29sdmVzIHRoZSBhbHJlYWR5LWFjY3VtdWxhdGVkIGluc3RhbmNlXG4gICAqIHRocm91Z2ggYE1vZHVsZVJlZmAuIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgYExvZ2dpbmcuZ2V0KClgIGxvZ2dlciB3aGVuIHRoZSBmaWx0ZXIgd2Fzbid0XG4gICAqIGNvbnN0cnVjdGVkIHdpdGggYSBgTW9kdWxlUmVmYCAoZS5nLiBtYW51YWxseSBgbmV3YCdkKSBvciBubyByZXF1ZXN0LXNjb3BlZCBjb250ZXh0IGV4aXN0c1xuICAgKiBmb3IgdGhpcyByZXF1ZXN0IChlLmcuIHRoZSBlcnJvciBoYXBwZW5lZCBiZWZvcmUgYW55IGRlY2FmLWF3YXJlIHByb3ZpZGVyIHJhbiwgYXMgaXMgdGhlXG4gICAqIGNhc2Ugd2hlbiBhIGd1YXJkIHJlamVjdHMgdGhlIHJlcXVlc3QgYmVmb3JlIGludGVyY2VwdG9ycyBnZXQgdG8gYmluZCB0aGUgY2xpZW50LXNjb3BlZFxuICAgKiBsb2dnZXIgb250byB0aGUgQ29udGV4dCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUxvZ2dlcihcbiAgICByZXF1ZXN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVxdWVzdExvZ2dlcj4ge1xuICAgIGlmICh0aGlzLm1vZHVsZVJlZikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dElkID0gQ29udGV4dElkRmFjdG9yeS5nZXRCeVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gYXdhaXQgdGhpcy5tb2R1bGVSZWYucmVzb2x2ZShcbiAgICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgIGNvbnRleHRJZCxcbiAgICAgICAgICB7IHN0cmljdDogZmFsc2UgfVxuICAgICAgICApO1xuICAgICAgICBpZiAocmVxdWVzdENvbnRleHQ/LmxvZ2dlcikgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmxvZ2dlcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBubyByZXF1ZXN0LXNjb3BlZCBjb250ZXh0IGJvdW5kIGZvciB0aGlzIHJlcXVlc3Qg4oCUIGZhbGwgYmFjayBiZWxvd1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTG9nZ2luZy5nZXQoKSBhcyB1bmtub3duIGFzIFJlcXVlc3RMb2dnZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG4vLyBObyBNb2R1bGVSZWYgYXZhaWxhYmxlIGF0IGRlY29yYXRpb24gdGltZSwgc28gdGhpcyBpbnN0YW5jZSBmYWxscyBiYWNrIHRvXG4vLyBMb2dnaW5nLmdldCgpIHJhdGhlciB0aGFuIHRoZSByZXF1ZXN0LWJvdW5kIGNvbnRleHQgbG9nZ2VyOyBwcmVmZXJcbi8vIE5lc3RCb290c3RyYXBlci51c2VHbG9iYWxGaWx0ZXJzKCkgZm9yIGNvbnRleHQtYXdhcmUgZXJyb3IgbG9nZ2luZy5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkZpbHRlcigpIHtcbiAgcmV0dXJuIFVzZUZpbHRlcnMobmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZIZWFkZXJzKCkge1xuICByZXR1cm4gVXNlSW50ZXJjZXB0b3JzKERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvcik7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VjdXJpdHlTY2hlbWVPYmplY3QgfSBmcm9tIFwiLi4vLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJJY29uRmlsZVBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgcGF0aDogc3RyaW5nO1xuICBhdXRoPzogU2VjdXJpdHlTY2hlbWVPYmplY3Q7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIGV4dHJhTW9kZWxzPzogQ29uc3RydWN0b3JbXTtcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgU1dBR0dFUl9VSV9DT05TVEFOVFM6IFN3YWdnZXJPcHRpb25zID0ge1xuICB0aXRsZTogXCJTd2FnZ2VyIHwgT3BlbkFQSSBTcGVjaWZpY2F0aW9uIChPQVMpXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkaXplZCBmb3JtYXQgZm9yIGRlc2NyaWJpbmcgUkVTVGZ1bCBBUElzXCIsXG4gIHZlcnNpb246IFwiMC4wLjFcIixcbiAgcGF0aDogXCJkb2NzXCIsXG4gIGZhdmljb25GaWxlUGF0aDogXCJcIixcbiAgdG9wYmFySWNvbkZpbGVQYXRoOiBcIlwiLFxuICBhdXRoOiB7XG4gICAgdHlwZTogXCJodHRwXCIsXG4gICAgc2NoZW1lOiBcImJlYXJlclwiLFxuICAgIGJlYXJlckZvcm1hdDogXCJKV1RcIixcbiAgICBuYW1lOiBcIkF1dGhvcml6YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJFbnRlciBKV1QgdG9rZW5cIixcbiAgICBpbjogXCJoZWFkZXJcIixcbiAgfSxcbiAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gIHRvcGJhckJnQ29sb3I6IFwiIzAwMDAwMFwiLFxufTtcbiIsImltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyVUlPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTd2FnZ2VyQ3VzdG9tVUkge1xuICByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zO1xuICAvLyBwcml2YXRlIHJlYWRvbmx5IGFzc2V0c1BhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgLy8gICBfX2Rpcm5hbWUsXG4gIC8vICAgXCIuLlwiLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIndvcmtkb2NzXCIsXG4gIC8vICAgXCJhc3NldHNcIlxuICAvLyApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN3YWdnZXJVSU9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGN1c3RvbUNTUygpIHtcbiAgICBsZXQgY3NzID0gXCJcIjtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKSB7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMudG9wYmFySWNvblBhdGgpO1xuICAgICAgY3NzICs9IGAudG9wYmFyLXdyYXBwZXIgeyBjb250ZW50OiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwke2ltZ30nKTsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IGF1dG87IH1cXG5gO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY3NzICtcbiAgICAgIGBcbiAgICAgICAgLnRvcGJhci13cmFwcGVyIHN2ZyB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuICAgICAgICAuc3dhZ2dlci11aSAudG9wYmFyIHsgYmFja2dyb3VuZC1jb2xvcjogJHt0aGlzLm9wdGlvbnMudG9wYmFyQmdDb2xvciB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy50b3BiYXJCZ0NvbG9yfTsgfVxuICAgICAgYFxuICAgICk7XG4gIH1cblxuICBnZXRDdXN0b21PcHRpb25zKCkge1xuICAgIGNvbnN0IGZhdmljb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmZhdmljb25QYXRoKSB7XG4gICAgICBmYXZpY29uW1wiY3VzdG9tZmF2SWNvblwiXSA9IHRoaXMuYjY0KHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgLi4uZmF2aWNvbixcbiAgICAgIGN1c3RvbUNzczogdGhpcy5jdXN0b21DU1MoKSxcbiAgICAgIHN3YWdnZXJPcHRpb25zOiB7XG4gICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBiNjQoZmlsZTogc3RyaW5nLCBpbWc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy5hc3NldHNQYXRoIHx8IFwiXCIsIGZpbGUpO1xuICAgIGNvbnN0IGI2NCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZzogXCJiYXNlNjRcIiB9KTtcbiAgICByZXR1cm4gaW1nID8gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBiNjQgOiBiNjQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElOZXN0QXBwbGljYXRpb24gfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERvY3VtZW50QnVpbGRlciwgU3dhZ2dlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IFN3YWdnZXJDdXN0b21VSSB9IGZyb20gXCIuL1N3YWdnZXJDdXN0b21VSVwiO1xuaW1wb3J0IHsgU1dBR0dFUl9VSV9DT05TVEFOVFMsIFN3YWdnZXJPcHRpb25zIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogSU5lc3RBcHBsaWNhdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFN3YWdnZXJPcHRpb25zXG4gICkge31cblxuICBwcml2YXRlIGNyZWF0ZURvY3VtZW50KCkge1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5vcHRpb25zLnBhdGhcbiAgICAgID8gdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uICtcbiAgICAgICAgXCJcIiArXG4gICAgICAgIGA8YnI+PGJyPjxhIGhyZWY9XCIke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9XCI+T3BlbkFQSSBKU09OIFNwZWM8L2E+IHwgYCArXG4gICAgICAgIGA8YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofVwiPk9wZW5BUEkgWUFNTCBTcGVjPC9hPmBcbiAgICAgIDogdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3QgY29uZmlnID0gbmV3IERvY3VtZW50QnVpbGRlcigpXG4gICAgICAuc2V0VGl0bGUodGhpcy5vcHRpb25zLnRpdGxlKVxuICAgICAgLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgICAgLnNldFZlcnNpb24odGhpcy5vcHRpb25zLnZlcnNpb24gfHwgXCIwLjAuMVwiKVxuICAgICAgLmFkZEJlYXJlckF1dGgodGhpcy5vcHRpb25zLmF1dGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMuYXV0aClcbiAgICAgIC5idWlsZCgpO1xuXG4gICAgcmV0dXJuIFN3YWdnZXJNb2R1bGUuY3JlYXRlRG9jdW1lbnQodGhpcy5hcHAsIGNvbmZpZywge1xuICAgICAgZXh0cmFNb2RlbHM6IHRoaXMub3B0aW9ucy5leHRyYU1vZGVscyB8fCBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB8IFwiYXBwbGljYXRpb24veC15YW1sXCIsXG4gICAgYm9keUZhY3Rvcnk6ICgpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBodHRwQWRhcHRlciA9IHRoaXMuYXBwLmdldEh0dHBBZGFwdGVyKCkgYXMgYW55O1xuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gICAgaHR0cEFkYXB0ZXIuZ2V0KHBhdGgsIChfcmVxOiBhbnksIHJlczogYW55KSA9PiB7XG4gICAgICBodHRwQWRhcHRlci5yZXBseShyZXMsIGJvZHlGYWN0b3J5KCksIDIwMCwge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldHVwU3dhZ2dlcigpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuY3JlYXRlRG9jdW1lbnQoKTtcbiAgICBjb25zdCBzd2FnZ2VyVUkgPSBuZXcgU3dhZ2dlckN1c3RvbVVJKHtcbiAgICAgIHRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGUsXG4gICAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRoaXMub3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogdGhpcy5vcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uUGF0aDogdGhpcy5vcHRpb25zLmZhdmljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckljb25QYXRoOiB0aGlzLm9wdGlvbnMudG9wYmFySWNvbkZpbGVQYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogdGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgfSk7XG4gICAgU3dhZ2dlck1vZHVsZS5zZXR1cChcbiAgICAgIHRoaXMub3B0aW9ucy5wYXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnBhdGgsXG4gICAgICB0aGlzLmFwcCxcbiAgICAgIGRvY3VtZW50LFxuICAgICAge1xuICAgICAgICAuLi5zd2FnZ2VyVUkuZ2V0Q3VzdG9tT3B0aW9ucygpLFxuICAgICAgICBqc29uRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB5YW1sRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgICAgdGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgKCkgPT4gZG9jdW1lbnRcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgICAgKCkgPT4gWUFNTC5zdHJpbmdpZnkoZG9jdW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgZ2V0VmVyc2lvbigpIHtcbiAgLy8gICAvLyBjb25zdCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgLy8gICAvLyBjb25zdCB7dmVyc2lvbn0gPSByZXF1aXJlKHBhY2thZ2VKc29uKTtcbiAgLy8gICByZXR1cm4gXCJ2ZXJzaW9uXCI7XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7XG4gIElOZXN0QXBwbGljYXRpb24sXG4gIExvZ2dlcixcbiAgTmVzdEludGVyY2VwdG9yLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE1vZHVsZVJlZiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgU3dhZ2dlckJ1aWxkZXIgfSBmcm9tIFwiLi9vcGVuYXBpXCI7XG5pbXBvcnQgeyBDb3JzT3B0aW9ucyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL2V4dGVybmFsL2NvcnMtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IENvcnNFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRGVmaW5lcyBhbGwgY3VzdG9taXphYmxlIHBhcmFtZXRlcnMgZm9yIFN3YWdnZXIgc2V0dXAuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBkZXZlbG9wZXJzIHRvIGN1c3RvbWl6ZSBob3cgU3dhZ2dlciBVSSBpcyBjb25maWd1cmVkXG4gKiB3aXRoaW4gdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi4gSXQgaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgdGl0bGVzLCBwYXRocyxcbiAqIGNvbG9yIHNjaGVtZXMsIGFuZCBhc3NldCBwYXRocyB0byB0YWlsb3IgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgZGlzcGxheWVkIGluIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBzaG93biBiZWxvdyB0aGUgdGl0bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEFQSSB2ZXJzaW9uIGRpc3BsYXllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCBwYXRoIHdoZXJlIFN3YWdnZXIgd2lsbCBiZSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwZXJzaXN0QXV0aG9yaXphdGlvbl0gLSBXaGV0aGVyIGF1dGhvcml6YXRpb24gdG9rZW5zIHBlcnNpc3QgYWNyb3NzIHJlbG9hZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Fzc2V0c1BhdGhdIC0gUGF0aCB0byBjdXN0b20gYXNzZXRzIGZvciBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJCZ0NvbG9yXSAtIEN1c3RvbSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgU3dhZ2dlciB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJJY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGljb24gZGlzcGxheWVkIGluIHRoZSB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmYXZpY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGZhdmljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclNldHVwT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkuanNvblxuICAgKi9cbiAgb3BlbkFwaUpzb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBmbHVlbnQsIHN0YXRpYyBib290c3RyYXAgY2xhc3MgZm9yIGluaXRpYWxpemluZyBhbmQgY29uZmlndXJpbmcgYSBOZXN0SlMgYXBwbGljYXRpb24uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTmVzdEJvb3RzdHJhcGVyYCBjbGFzcyBwcm92aWRlcyBhIGNoYWluYWJsZSBBUEkgZm9yIGNvbmZpZ3VyaW5nXG4gKiBhIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gSXQgaW5jbHVkZXMgYnVpbHQtaW4gbWV0aG9kcyBmb3IgZW5hYmxpbmdcbiAqIENPUlMsIEhlbG1ldCBzZWN1cml0eSwgU3dhZ2dlciBkb2N1bWVudGF0aW9uLCBnbG9iYWwgcGlwZXMsIGZpbHRlcnMsXG4gKiBpbnRlcmNlcHRvcnMsIGFuZCBzdGFydGluZyB0aGUgc2VydmVyLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvbW90ZXMgY29uc2lzdGVuY3kgYW5kIHJlZHVjZXMgcmVwZXRpdGl2ZSBzZXR1cCBjb2RlXG4gKiBhY3Jvc3MgbXVsdGlwbGUgTmVzdEpTIHByb2plY3RzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTmVzdEZhY3RvcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tIFwiLi9hcHAubW9kdWxlXCI7XG4gKiBpbXBvcnQgeyBNeUxvZ2dlciB9IGZyb20gXCIuL015TG9nZ2VyXCI7XG4gKiBpbXBvcnQgeyBOZXN0Qm9vdHN0cmFwZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1uZXN0XCI7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICogICBjb25zdCBhcHAgPSBhd2FpdCBOZXN0RmFjdG9yeS5jcmVhdGUoQXBwTW9kdWxlKTtcbiAqXG4gKiAgIGF3YWl0IE5lc3RCb290c3RyYXBlclxuICogICAgIC5pbml0aWFsaXplKGFwcClcbiAqICAgICAuZW5hYmxlTG9nZ2VyKG5ldyBNeUxvZ2dlcigpKVxuICogICAgIC5lbmFibGVDb3JzKFtcImh0dHA6Ly9sb2NhbGhvc3Q6NDIwMFwiXSlcbiAqICAgICAudXNlSGVsbWV0KClcbiAqICAgICAuc2V0dXBTd2FnZ2VyKHtcbiAqICAgICAgIHRpdGxlOiBcIk9wZW5BUEkgYnkgVHJhZGVNYXJr4oSiXCIsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogXCJUcmFkZU1hcmvihKIgQVBJIGRvY3VtZW50YXRpb25cIixcbiAqICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAqICAgICAgIHBhdGg6IFwiYXBpXCIsXG4gKiAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAqICAgICAgIHRvcGJhckJnQ29sb3I6IFwiIzJDM0U1MFwiLFxuICogICAgICAgdG9wYmFySWNvblBhdGg6IFwiL2Fzc2V0cy9sb2dvLnN2Z1wiLFxuICogICAgICAgZmF2aWNvblBhdGg6IFwiL2Fzc2V0cy9mYXZpY29uLmljb1wiXG4gKiAgICAgfSlcbiAqICAgICAudXNlR2xvYmFsRmlsdGVycygpXG4gKiAgICAgLnVzZUdsb2JhbFBpcGVzKC4uLilcbiAqICAgICAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLilcbiAqICAgICAuc3RhcnQoMzAwMCk7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKCk7XG4gKiBgYGBcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTmVzdEJvb3RzdHJhcGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYXBwOiBJTmVzdEFwcGxpY2F0aW9uO1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvZ2dlciBpbnN0YW5jZSwgY3JlYXRpbmcgYSBkZWZhdWx0IG9uZSBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbnN1cmVzIHRoYXQgYSB2YWxpZCBgTG9nZ2VyYCBpbnN0YW5jZSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAqIGZvciBsb2dnaW5nIGJvb3RzdHJhcC1yZWxhdGVkIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBhY3RpdmUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGxvZ2dlcigpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB7XG4gICAgICAvLyBmYWxsYmFja1xuICAgICAgdGhpcy5fbG9nZ2VyID0gbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEluaXRpYWxpemVzIHRoZSBib290c3RyYXBwZXIgd2l0aCBhIGdpdmVuIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQmluZHMgdGhlIHByb3ZpZGVkIE5lc3RKUyBhcHAgaW5zdGFuY2UgdG8gdGhlIGJvb3RzdHJhcHBlciwgZW5hYmxpbmdcbiAgICogY2hhaW5lZCBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7SU5lc3RBcHBsaWNhdGlvbn0gYXBwIC0gVGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZSB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShhcHA6IElOZXN0QXBwbGljYXRpb24pIHtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBvciByZXBsYWNlcyB0aGUgZ2xvYmFsIGxvZ2dlciBmb3IgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgYSBjdXN0b20gbG9nZ2VyIGlzIHByb3ZpZGVkLCBpdCByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIuIE90aGVyd2lzZSxcbiAgICogYSBuZXcgbG9nZ2VyIG5hbWVkIGBcIk5lc3RCb290c3RyYXBcImAgaXMgdXNlZC4gVGhpcyBsb2dnZXIgaXMgYWxzbyByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtMb2dnZXJ9IFtjdXN0b21Mb2dnZXJdIC0gT3B0aW9uYWwgY3VzdG9tIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlTG9nZ2VyKGN1c3RvbUxvZ2dlcj86IExvZ2dlcikge1xuICAgIHRoaXMuX2xvZ2dlciA9IGN1c3RvbUxvZ2dlciB8fCBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB0aGlzLmFwcC51c2VMb2dnZXIodGhpcy5fbG9nZ2VyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUykgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQWxsb3dzIGRlZmluaW5nIGVpdGhlciBhIHdpbGRjYXJkIG9yaWdpbiAoYFwiKlwiYCkgb3IgYSBsaXN0IG9mIGFsbG93ZWQgb3JpZ2lucy5cbiAgICogQXV0b21hdGljYWxseSBhY2NlcHRzIGxvY2FsIGRldmVsb3BtZW50IHJlcXVlc3RzIGFuZCB0aG9zZSB3aXRob3V0IG9yaWdpbiBoZWFkZXJzLlxuICAgKiBUaHJvd3MgYSBgQ29yc0Vycm9yYCBmb3IgdW5hdXRob3JpemVkIG9yaWdpbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7JyonIHwgc3RyaW5nW119IFtvcmlnaW5zPVtdXSAtIExpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zIG9yIGBcIipcImAgdG8gYWxsb3cgYWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWxsb3dNZXRob2RzPVsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddXSAtIEFsbG93ZWQgSFRUUCBtZXRob2RzLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUNvcnMoXG4gICAgb3JpZ2luczogXCIqXCIgfCBzdHJpbmdbXSA9IFtdLFxuICAgIGFsbG93TWV0aG9kczogc3RyaW5nW10gPSBbXCJHRVRcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCJdXG4gICkge1xuICAgIGNvbnN0IGFsbG93ZWRPcmlnaW5zID1cbiAgICAgIG9yaWdpbnMgPT09IFwiKlwiID8gXCIqXCIgOiBvcmlnaW5zLm1hcCgobykgPT4gby50cmltKCkudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBjb25zdCBjb3JzT3B0aW9uczogQ29yc09wdGlvbnMgPSB7XG4gICAgICBvcmlnaW46IChvcmlnaW4sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIC8vIEFsbG93IHJlcXVlc3Qgd2l0aG91dCBvcmlnaW4uLi5cbiAgICAgICAgaWYgKCFvcmlnaW4pIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWxsb3dlZE9yaWdpbnMgPT09IFwiKlwiIHx8XG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkoYWxsb3dlZE9yaWdpbnMpICYmXG4gICAgICAgICAgICBhbGxvd2VkT3JpZ2lucy5pbmNsdWRlcyhvcmlnaW4udG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG5ldyBDb3JzRXJyb3IoYE9yaWdpbiAke29yaWdpbn0gbm90IGFsbG93ZWRgKSk7XG4gICAgICB9LFxuICAgICAgY3JlZGVudGlhbHM6IHRydWUsXG4gICAgICBtZXRob2RzOiBhbGxvd01ldGhvZHMuam9pbihcIixcIiksXG4gICAgfTtcblxuICAgIHRoaXMuYXBwLmVuYWJsZUNvcnMoY29yc09wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBcHBsaWVzIHRoZSBIZWxtZXQgbWlkZGxld2FyZSBmb3IgZW5oYW5jZWQgc2VjdXJpdHkuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIER5bmFtaWNhbGx5IGxvYWRzIHRoZSBgaGVsbWV0YCBwYWNrYWdlIGlmIGF2YWlsYWJsZSBhbmQgcmVnaXN0ZXJzIGl0XG4gICAqIGFzIG1pZGRsZXdhcmUgdG8gaW1wcm92ZSBIVFRQIGhlYWRlciBzZWN1cml0eS4gSWYgbm90IGluc3RhbGxlZCwgbG9ncyBhIHdhcm5pbmdcbiAgICogYW5kIGNvbnRpbnVlcyBleGVjdXRpb24gd2l0aG91dCB0aHJvd2luZyBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXNzZWQgdG8gSGVsbWV0LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUhlbG1ldChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgaGVsbWV0ID0gcmVxdWlyZShcImhlbG1ldFwiKTsgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5XG4gICAgICB0aGlzLmFwcC51c2UoaGVsbWV0KG9wdGlvbnMpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkhlbG1ldCBtaWRkbGV3YXJlIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJIZWxtZXQgbm90IGluc3RhbGxlZC4gU2tpcHBpbmcgbWlkZGxld2FyZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbmZpZ3VyZXMgYW5kIGluaXRpYWxpemVzIFN3YWdnZXIgVUkgZm9yIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBVc2VzIHRoZSBgU3dhZ2dlckJ1aWxkZXJgIHV0aWxpdHkgdG8gY29uZmlndXJlIEFQSSBkb2N1bWVudGF0aW9uXG4gICAqIHdpdGggZGV0YWlsZWQgY3VzdG9taXphdGlvbiBmb3IgdGl0bGUsIHZlcnNpb24sIHBhdGhzLCBhbmQgY29sb3JzLlxuICAgKiBTd2FnZ2VyIGlzIGF1dG9tYXRpY2FsbHkgZXhwb3NlZCBhdCB0aGUgY29uZmlndXJlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge1N3YWdnZXJTZXR1cE9wdGlvbnN9IG9wdGlvbnMgLSBTd2FnZ2VyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBzZXR1cFN3YWdnZXIob3B0aW9uczogU3dhZ2dlclNldHVwT3B0aW9ucykge1xuICAgIGNvbnN0IHN3YWdnZXIgPSBuZXcgU3dhZ2dlckJ1aWxkZXIodGhpcy5hcHAsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICBwYXRoOiBvcHRpb25zLnBhdGggfHwgXCJhcGlcIixcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiBvcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBhc3NldHNQYXRoOiBvcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uRmlsZVBhdGg6IG9wdGlvbnMuZmF2aWNvblBhdGgsXG4gICAgICB0b3BiYXJJY29uRmlsZVBhdGg6IG9wdGlvbnMudG9wYmFySWNvblBhdGgsXG4gICAgICB0b3BiYXJCZ0NvbG9yOiBvcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgICBvcGVuQXBpSnNvblBhdGg6IG9wdGlvbnMub3BlbkFwaUpzb25QYXRoLFxuICAgICAgb3BlbkFwaVlhbWxQYXRoOiBvcHRpb25zLm9wZW5BcGlZYW1sUGF0aCxcbiAgICB9KTtcbiAgICBzd2FnZ2VyLnNldHVwU3dhZ2dlcigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIHZhbGlkYXRpb24gcGlwZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuYWJsZXMgcmVxdWVzdCBwYXlsb2FkIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uIGdsb2JhbGx5IGFjcm9zc1xuICAgKiB0aGUgZW50aXJlIE5lc3RKUyBhcHBsaWNhdGlvbi4gTXVsdGlwbGUgcGlwZXMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXJcbiAgICogZm9yIG1vZHVsYXIgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QaXBlVHJhbnNmb3JtW119IHBpcGVzIC0gUGlwZSBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIgZ2xvYmFsbHkuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzOiBQaXBlVHJhbnNmb3JtW10pIHtcbiAgICBpZiAocGlwZXMubGVuZ3RoID4gMCkgdGhpcy5hcHAudXNlR2xvYmFsUGlwZXMoLi4ucGlwZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIGV4Y2VwdGlvbiBmaWx0ZXJzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZCwgaXQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBkZWZhdWx0XG4gICAqIHNldCBvZiBzdGFuZGFyZCBleGNlcHRpb24gZmlsdGVycyBmb3IgY29tbW9uIGVycm9yIHR5cGVzIGxpa2VcbiAgICogYEh0dHBFeGNlcHRpb25gLCBgVmFsaWRhdGlvbkV4Y2VwdGlvbmAsIGBDb25mbGljdEV4Y2VwdGlvbmAsIGFuZCBvdGhlcnMuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGBEZWNhZkV4Y2VwdGlvbkZpbHRlcmAgaXMgY29uc3RydWN0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24nc1xuICAgKiBgTW9kdWxlUmVmYCBzbyBpdCBjYW4gcmVzb2x2ZSB0aGUgcmVxdWVzdC1zY29wZWQgYERlY2FmUmVxdWVzdENvbnRleHRgIChhbmRcbiAgICogaXRzIGNsaWVudC1ib3VuZCBsb2dnZXIpIGZvciB0aGUgcmVxdWVzdCB0aGF0IHRocmV3LCBpbnN0ZWFkIG9mIGxvZ2dpbmdcbiAgICogdGhyb3VnaCB0aGUgZ2VuZXJpYyBnbG9iYWwgbG9nZ2VyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLkV4Y2VwdGlvbkZpbHRlcltdfSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSBnbG9iYWxseS5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgdGhpcy5hcHAudXNlR2xvYmFsRmlsdGVycyhcbiAgICAgIC4uLihmaWx0ZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBmaWx0ZXJzXG4gICAgICAgIDogW25ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcih0aGlzLmFwcC5nZXQoTW9kdWxlUmVmLCB7IHN0cmljdDogZmFsc2UgfSkpXSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiBOZXN0SW50ZXJjZXB0b3JbXSkge1xuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMuYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdGFydHMgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBvcnQgYW5kIGhvc3QuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIExpc3RlbnMgb24gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBvcHRpb25hbGx5IGEgaG9zdC4gT25jZSBzdGFydGVkLFxuICAgKiBsb2dzIHRoZSBhcHBsaWNhdGlvbiBVUkwgZm9yIGVhc3kgYWNjZXNzLiBUaGUgc3RhcnR1cCBwcm9jZXNzIHJlc29sdmVzXG4gICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MzAwMF0gLSBQb3J0IG51bWJlciB0byBsaXN0ZW4gb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaG9zdF0gLSBPcHRpb25hbCBob3N0IG9yIElQIGFkZHJlc3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHtib29sZWFufSBbbG9nPXRydWVdIC0gV2hldGhlciB0byBsb2cgdGhlIGFwcGxpY2F0aW9uIFVSTCB1cG9uIHN0YXJ0dXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoXG4gICAgcG9ydDogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDAsXG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGxvZzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QgYXMgYW55KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5hcHAuZ2V0VXJsKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+agCBBcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0OiAke3VybH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2FsbEhhbmRsZXIsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgRGVmYXVsdEFkYXB0ZXJGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJGbGFncyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogSW50ZXJjZXB0b3IgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyBhbGwgcmVnaXN0ZXJlZCBEZWNhZiByZXF1ZXN0IGhhbmRsZXJzXG4gKiBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGlzIGludm9rZWQuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yfSBpbnRlZ3JhdGVzIHRoZSBEZWNhZiByZXF1ZXN0LWhhbmRsaW5nIHBpcGVsaW5lXG4gKiBpbnRvIE5lc3RKUycgaW50ZXJjZXB0b3IgbWVjaGFuaXNtLiBCZWZvcmUgcGFzc2luZyBleGVjdXRpb24gdG8gdGhlIG5leHQgaGFuZGxlciBpbiB0aGVcbiAqIE5lc3RKUyBjaGFpbiwgaXQgZGVsZWdhdGVzIHJlcXVlc3QgcHJvY2Vzc2luZyB0byB0aGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSwgd2hpY2hcbiAqIHNlcXVlbnRpYWxseSBydW5zIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMuIFRoaXMgYWxsb3dzXG4gKiBiZWhhdmlvcnMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbG9nZ2luZywgdGVuYW50IHJlc29sdXRpb24sIG9yIG1ldGFkYXRhIGVucmljaG1lbnRcbiAqIHRvIG9jY3VyIHByaW9yIHRvIGNvbnRyb2xsZXIgZXhlY3V0aW9uLlxuICpcbiAqIEBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFwcGx5IGdsb2JhbGx5OlxuICogYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyhuZXcgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKGV4ZWN1dG9yKSk7XG4gKlxuICogLy8gT3IgaW4gYSBtb2R1bGU6XG4gKiBATW9kdWxlKHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gKiAgICAge1xuICogICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICogICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAqICAgICB9LFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBJbnRlcmNlcHRvclxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgQ29udHJvbGxlclxuICpcbiAqICAgICBDbGllbnQtPj5JbnRlcmNlcHRvcjogSFRUUCBSZXF1ZXN0XG4gKiAgICAgSW50ZXJjZXB0b3ItPj5FeGVjdXRvcjogZXhlYyhyZXF1ZXN0KVxuICogICAgIEV4ZWN1dG9yLS0+PkludGVyY2VwdG9yOiBoYW5kbGVycyBjb21wbGV0ZWRcbiAqICAgICBJbnRlcmNlcHRvci0+PkNvbnRyb2xsZXI6IG5leHQuaGFuZGxlKClcbiAqICAgICBDb250cm9sbGVyLS0+PkNsaWVudDogUmVzcG9uc2VcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhlY3V0b3I6IERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gICkge31cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29udGV4dHVhbGl6ZShyZXE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgICBjb25zdCBmbGFnczogRGVjYWZTZXJ2ZXJGbGFncyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgaXAgPSBleHRyYWN0SXAocmVxKTtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih7IGlwIH0pO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWAsXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWdzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcikge1xuICAgIGNvbnN0IHJlcSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcyA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IpLmZvcih0aGlzLmludGVyY2VwdCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0dWFsaXplKHJlcSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGNvbnRleHR1YWxpemVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWMocmVxLCByZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBleGVjdXRvcnMgZmluaXNoZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0SXAocmVxOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gIGZ1bmN0aW9uIHBhcnNlSXBIZWFkZXIodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pWzBdO1xuICB9XG4gIHJldHVybiAoXG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LWZvcndhcmRlZC1mb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LXJlYWwtaXBcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLUZvcndhcmRlZC1Gb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLVJlYWwtSVBcIl0pID8/XG4gICAgcmVxLmlwXG4gICk7XG59XG4iLCJpbXBvcnQgeyBJbmplY3QgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBpbmplY3RhYmxlU2VydmljZUtleSxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvc2l0b3J5IGFzIENvcmVSZXBvc2l0b3J5LFxuICBTZXJ2aWNlIGFzIENvcmVTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkZhY3RvcnlQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogc3RyaW5nO1xuICB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duO1xufTtcblxuY29uc3QgcGVuZGluZ1Byb3ZpZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEZWNhZkZhY3RvcnlQcm92aWRlcj4oKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRHJhaW5zIHRoZSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBieSB7QGxpbmsgU2VydmljZX0ve0BsaW5rIFJlcG9zaXRvcnl9IHVzYWdlcy5cbiAqIEBzdW1tYXJ5IENvbnN1bWVkIGJ5IHtAbGluayBEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdH0gdG8gd2lyZSB0aGUgdG9rZW5zIHRoYXQgdGhvc2UgcGFyYW1ldGVyXG4gKiBkZWNvcmF0b3JzIHJlZmVyZW5jZSBiYWNrIGludG8gTmVzdCdzIERJIGNvbnRhaW5lciwgc2luY2UgYSBwYXJhbWV0ZXIgZGVjb3JhdG9yIGFsb25lIGNhbm5vdFxuICogc3VwcGx5IGEgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTogRGVjYWZGYWN0b3J5UHJvdmlkZXJbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHBlbmRpbmdQcm92aWRlcnMudmFsdWVzKCkpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHRva2VuOiBzdHJpbmcsIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBlbmRpbmdQcm92aWRlcnMuaGFzKHRva2VuKSkgcmV0dXJuO1xuICBwZW5kaW5nUHJvdmlkZXJzLnNldCh0b2tlbiwgeyBwcm92aWRlOiB0b2tlbiwgdXNlRmFjdG9yeSB9KTtcbn1cblxuZnVuY3Rpb24gaXNNb2RlbENvbnN0cnVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29uc3RydWN0b3I8YW55PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBNb2RlbDtcbn1cblxuZnVuY3Rpb24gbW9kZWxTZXJ2aWNlVG9rZW4obW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bW9kZWwubmFtZX1TZXJ2aWNlYDtcbn1cblxuZnVuY3Rpb24gbW9kZWxSZXBvc2l0b3J5VG9rZW4oXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gZmxhdm91ciA/IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeUAke2ZsYXZvdXJ9YCA6IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeWA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYgc2VydmljZS5cbiAqIEBzdW1tYXJ5IFRyYW5zbGF0ZXMgZGVjYWYncyBzZXJ2aWNlIHJlc29sdXRpb24gQVBJcyBpbnRvIGEgTmVzdCBgQEluamVjdCgpYCBjYWxsOlxuICogLSBgQFNlcnZpY2UoU29tZU1vZGVsKWAgaW5qZWN0cyB0aGUgYE1vZGVsU2VydmljZTxTb21lTW9kZWw+YCBzaW5nbGV0b24gZm9yIHRoYXQgbW9kZWxcbiAqICAgKHZpYSB7QGxpbmsgTW9kZWxTZXJ2aWNlLmZvck1vZGVsfSkuXG4gKiAtIGBAU2VydmljZShTb21lU2VydmljZUNsYXNzKWAgb3IgYEBTZXJ2aWNlKFwiYWxpYXNcIilgIGluamVjdHMgdGhlIG1hdGNoaW5nIGBAc2VydmljZSgpYC1kZWNvcmF0ZWRcbiAqICAgZGVjYWYge0BsaW5rIENvcmVTZXJ2aWNlfSAodmlhIHtAbGluayBDb3JlU2VydmljZS5nZXR9KS5cbiAqIC0gYEBTZXJ2aWNlKClgIGluZmVycyB0aGUgcGFyYW1ldGVyJ3MgdHlwZSBmcm9tIGVtaXR0ZWQgY29uc3RydWN0b3IgbWV0YWRhdGEgYW5kIHJlc29sdmVzIGl0IHRoZVxuICogICBzYW1lIHdheSwgcHJvdmlkZWQgdGhlIHBhcmFtZXRlciBpcyB0eXBlZCBhcyBhIGNvbmNyZXRlIGNsYXNzIChnZW5lcmljcyBsaWtlIGBNb2RlbFNlcnZpY2U8WD5gXG4gKiAgIGFyZSBlcmFzZWQgYXQgcnVudGltZSwgc28gdGhlIG1vZGVsLXNlcnZpY2UgZm9ybSBhbHdheXMgcmVxdWlyZXMgYW4gZXhwbGljaXQgYXJndW1lbnQpLlxuICogQHBhcmFtIGtleSB0aGUgbW9kZWwgY2xhc3MsIHNlcnZpY2UgY2xhc3MsIG9yIGFsaWFzIHRvIHJlc29sdmUuIE9taXQgdG8gaW5mZXIgZnJvbSB0aGUgcGFyYW1ldGVyIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXJ2aWNlKGtleT86IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBsZXQgcmVzb2x2ZWQ6IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPSBrZXk7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgcGFyYW1UeXBlczogYW55W10gPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIHJlc29sdmVkID0gcGFyYW1UeXBlc1twYXJhbWV0ZXJJbmRleF07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQFNlcnZpY2UoKSBjb3VsZCBub3QgZGV0ZXJtaW5lIGFuIGluamVjdGlvbiB0eXBlIGZvciBwYXJhbWV0ZXIgJHtwYXJhbWV0ZXJJbmRleH0gb2YgJHsodGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4pLm5hbWV9LiBQcm92aWRlIGFuIGV4cGxpY2l0IGFyZ3VtZW50LCBlLmcuIEBTZXJ2aWNlKFNvbWVTZXJ2aWNlKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFzTW9kZWwgPSB0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIgJiYgaXNNb2RlbENvbnN0cnVjdG9yKHJlc29sdmVkKTtcbiAgICBjb25zdCB0b2tlbiA9IGFzTW9kZWxcbiAgICAgID8gbW9kZWxTZXJ2aWNlVG9rZW4ocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55PilcbiAgICAgIDogaW5qZWN0YWJsZVNlcnZpY2VLZXkocmVzb2x2ZWQgYXMgc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik7XG5cbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiB7XG4gICAgICBpZiAoYXNNb2RlbCkgcmV0dXJuIE1vZGVsU2VydmljZS5mb3JNb2RlbChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQpXG4gICAgICAgIDogQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHtAbGluayBDb3JlUmVwb3NpdG9yeX0gZm9yIGBtb2RlbGAuXG4gKiBAc3VtbWFyeSBVbmxpa2Uge0BsaW5rIFNlcnZpY2V9LCBgbW9kZWxgIGlzIGFsd2F5cyB0cmVhdGVkIGFzIGEgTW9kZWwgY2xhc3M6IHRoZSBzYW1lIGNsYXNzIHBhc3NlZFxuICogdG8gYEBTZXJ2aWNlKG1vZGVsKWAgYW5kIGBAUmVwb3NpdG9yeShtb2RlbClgIHJlc29sdmVzIHRvIHR3byBkaWZmZXJlbnQgaW5qZWN0ZWQgb2JqZWN0cyAoYVxuICogYE1vZGVsU2VydmljZTxNPmAgdnMgYSBgUmVwb3NpdG9yeTxNPmAgcmVzcGVjdGl2ZWx5KSwgdmlhIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsIGNsYXNzIHRvIHJlc29sdmUgYSByZXBvc2l0b3J5IGZvci5cbiAqIEBwYXJhbSBmbGF2b3VyIG9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcywgZm9yd2FyZGVkIHRvIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXBvc2l0b3J5KFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBtb2RlbFJlcG9zaXRvcnlUb2tlbihtb2RlbCwgZmxhdm91cik7XG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4gQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWwsIGZsYXZvdXIpKTtcbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBEeW5hbWljTW9kdWxlLFxuICBHbG9iYWwsXG4gIEluamVjdCxcbiAgTW9kdWxlLFxuICBPbkFwcGxpY2F0aW9uU2h1dGRvd24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SLCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUNBRl9BREFQVEVSX0lELFxuICBERUNBRl9IQU5ETEVSUyxcbiAgREVDQUZfTU9EVUxFX09QVElPTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxufSBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlU2VydmljZSwgU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG4gIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxDT05GLCBBREFQVEVSIGV4dGVuZHMgQWRhcHRlcjxDT05GLCBhbnksIGFueSwgYW55Pj5cbiAgaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByaXZhdGUgc3RhdGljIF9wZXJzaXN0ZW5jZT86IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IHBlcnNpc3RlbmNlKCk6IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJQZXJzaXN0ZW5jZSBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikgdGhpcy5fbG9nZ2VyID0gTG9nZ2luZy5mb3IoRGVjYWZDb3JlTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9NT0RVTEVfT1BUSU9OUylcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uczxDT05GLCBBREFQVEVSPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVJlZjogTW9kdWxlUmVmXG4gICkge31cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICBjb25zdCBkZWNhZlByb3ZpZGVycyA9IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpO1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQ29yZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9LFxuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX0FEQVBURVJfSUQsIHVzZVZhbHVlOiB0aGlzLnBlcnNpc3RlbmNlPy5jbGllbnQgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+XG4gICAgICAgICAgICBvcHRpb25zLmhhbmRsZXJzPy5tYXAoKEgpID0+IHtcbiAgICAgICAgICAgICAgbG9nLmluZm8oYFJlZ2lzdGVyZWQgcmVxdWVzdCBoYW5kbGVyOiAke0gubmFtZX1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIKCk7XG4gICAgICAgICAgICB9KSA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMsXG4gICAgICBdLFxuICAgICAgZXhwb3J0czogW1xuICAgICAgICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbiAgICAgICAgREVDQUZfQURBUFRFUl9JRCxcbiAgICAgICAgREVDQUZfSEFORExFUlMsXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycy5tYXAoKHByb3ZpZGVyKSA9PiBwcm92aWRlci5wcm92aWRlKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBib290UGVyc2lzdGVuY2UoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290UGVyc2lzdGVuY2UpO1xuXG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSkge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IG9wdGlvbnMuY29uZi5tYXAoKFtjb250ciwgY2ZnLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICBjb25zdCBwb3NzaWJsZSA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGlmICghcG9zc2libGUpIHJldHVybiBbY29udHIsIGNmZ107XG4gICAgICAgIHJldHVybiBbY29udHIsIGNmZywgLi4uYXJnc107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gbmV3IFBlcnNpc3RlbmNlU2VydmljZSgpO1xuICAgICAgYXdhaXQgdGhpcy5fcGVyc2lzdGVuY2UuYm9vdCh0cmltbWVkKTtcbiAgICAgIGNvbnN0IGNsaWVudHMgPSB0aGlzLl9wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IG9wdGlvbnMuY29uZltpXTtcbiAgICAgICAgY29uc3QgcG9zc2libGVUcmFuc2YgPSBjLnNsaWNlKDIsIGMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHRyYW5zZm9ybWVyID0gcG9zc2libGVUcmFuc2YucG9wKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdHJhbnNmb3JtZXIgfHxcbiAgICAgICAgICAhKHRyYW5zZm9ybWVyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGNvbnRyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihjbGllbnRzW2ldLmZsYXZvdXIpO1xuICAgICAgICAgIGlmICghY29udHIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYE5vIHRyYW5zZm9ybWVyIGZvdW5kIGZvciBmbGF2b3VyICR7Y2xpZW50c1tpXS5mbGF2b3VyfS4geW91IHNob3VsZCBlaXRoZXIgQHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciBvciBwcm92aWRlIGEgdHJhbnNmb3JtZXIgaW4gdGhlIGNvbmZpZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gKGNvbnRyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICAgICAgID8gY29udHJcbiAgICAgICAgICAgICAgOiBuZXcgKGNvbnRyIGFzIENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+PikoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBib290IHRyYW5zZm9ybWVyIGZvciAke2NsaWVudHNbaV0uZmxhdm91cn06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIoY2xpZW50c1tpXS5mbGF2b3VyKSh0cmFuc2Zvcm1lcik7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhcInBlcnNpc3RlbmNlIGxheWVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKTtcblxuICAgICAgaWYgKG9wdGlvbnMuaW5pdGlhbGl6YXRpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXRpYWxpemF0aW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb246ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIG9uQXBwbGljYXRpb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBEZWNhZkNvcmVNb2R1bGUubG9nLmZvcih0aGlzLm9uQXBwbGljYXRpb25TaHV0ZG93bik7XG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIHRoaXMubW9kdWxlUmVmLmdldDxhbnk+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiBhZGFwdGVycylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJHthZGFwdGVyLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgYXdhaXQgYWRhcHRlci5zaHV0ZG93bigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFNlcnZpY2Uuc2h1dGRvd24oKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlc2AsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyA9IFN5bWJvbChcbiAgXCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlNcIlxuKTtcbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3M6IGFueVtdKTogdW5rbm93bltdIHtcbiAgY29uc3QgW21vZGVsQ29uc3RyLCBvcGVyYXRpb24sIGlkLCBwYXlsb2FkXSA9IGFyZ3M7XG5cbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxDb25zdHI/Lm5hbWUgPz8gbW9kZWxDb25zdHI7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFBheWxvYWQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpXG4gICAgPyBwYXlsb2FkLm1hcCgoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZS5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGUuc2VyaWFsaXplKCk7XG5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgUGF5bG9hZCBpdGVtIGZvciAke21vZGVsTmFtZX0gZG9lcyBub3QgaGF2ZSBzZXJpYWxpemUgbWV0aG9kIGFuZCBpcyBhbiAke3R5cGVvZiBlfSwgYXR0ZW1wdGluZyB0byBzdHJpbmdpZnkgZGlyZWN0bHkuIEl0ZW06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09IFwic3RyaW5nXCIgPyBlIDogSlNPTi5zdHJpbmdpZnkoZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHNlcmlhbGl6ZSBwYXlsb2FkIGZvciAke21vZGVsTmFtZX06ICR7ZXJyfWApO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHBheWxvYWQuc2VyaWFsaXplKClcbiAgICAgIDogdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBwYXlsb2FkXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cbiAgY29uc29sZS5kZWJ1ZyhcbiAgICBgTm9ybWFsaXplZCBldmVudCByZXNwb25zZSBmb3IgbW9kZWwgJHttb2RlbE5hbWV9LCBvcGVyYXRpb24gJHtvcGVyYXRpb259LCBpZCAke2lkfTpgLFxuICAgIHNlcmlhbGl6ZWRQYXlsb2FkXG4gICk7XG5cbiAgcmV0dXJuIFttb2RlbE5hbWUsIG9wZXJhdGlvbiwgaWQsIHNlcmlhbGl6ZWRQYXlsb2FkXTtcbn1cbiIsImltcG9ydCB7IERlY2FmQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBPYnNlcnZlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgSW5qZWN0LCBNZXNzYWdlRXZlbnQsIFF1ZXJ5LCBTc2UgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGludGVydmFsLCBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVFdmVudFJlc3BvbnNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbkBDb250cm9sbGVyKClcbmV4cG9ydCBjbGFzcyBFdmVudHNDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZDb250cm9sbGVyPERlY2FmU2VydmVyQ3R4PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQEluamVjdChMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMpIGZsYXZvdXJzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0LCBFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuICAgIHRoaXMuYWRhcHRlcnMgPSBmbGF2b3Vycy5tYXAoKGZsYXZvdXIpID0+IChBZGFwdGVyIGFzIGFueSkuZ2V0KGZsYXZvdXIpKTsgLy8gY2hhbmdlIHRvIEFkYXB0ZXIuY2FjaGUoXCJcIilcbiAgfVxuXG4gIEBTc2UoKVxuICBsaXN0ZW4oKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgY29uc3QgZXZlbnRzJCA9IG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZlcklkID1cbiAgICAgICAgYEItJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ3JlYXRpbmcgU1NFIG9ic2VydmVyOiAke29ic2VydmVySWR9IGZvciBjbGllbnQgJHt0aGlzLmNsaWVudENvbnRleHQudXVpZH1gXG4gICAgICApO1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICBvYnNlcnZlcklkID0gb2JzZXJ2ZXJJZDtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IHJlY2VpdmVkIHJlZnJlc2ggZXZlbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyB0eXBlOiBcIm1lc3NhZ2VcIiwgZGF0YSB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gZXZlbnQgcHVzaGVkIHRvIGNsaWVudGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGxvZ2dlci52ZXJib3NlKFxuICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBhY3Jvc3MgJHt0aGlzLmFkYXB0ZXJzLmxlbmd0aH0gYWRhcHRlcihzKWBcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWdpc3RlciBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENsZWFuaW5nIHVwIFNTRSBvYnNlcnZlciAke29ic2VydmVySWR9YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgVW5yZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGZyb20gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgZHVyaW5nIGNsZWFudXAgb2Ygb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDE1MDAwO1xuICAgIGNvbnN0IGhlYXJ0YmVhdCQgPSBpbnRlcnZhbChIRUFSVEJFQVRfSU5URVJWQUxfTVMpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJTZW5kaW5nIGhlYXJ0YmVhdFwiKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKFxuICAgICAgICAoKTogTWVzc2FnZUV2ZW50ID0+ICh7XG4gICAgICAgICAgdHlwZTogXCJoZWFydGJlYXRcIixcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBtZXJnZShldmVudHMkLCBoZWFydGJlYXQkKTtcbiAgfVxuXG4gIEBTc2UoXCIvOm1vZGVsXCIpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbGlzdGVuRm9yTW9kZWwoQFF1ZXJ5KFwibW9kZWxcIikgbW9kZWw6IHN0cmluZyk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGRhdGE6IGFyZ3MgfSBhcyBhbnkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihgRmFpbGVkIHRvIG9ic2VydmUgZXZlbnQ6ICR7ZS5tZXNzYWdlIHx8IGV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBFdmVudHNDb250cm9sbGVyIH0gZnJvbSBcIi4vRXZlbnRzQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmU3RyZWFtTW9kdWxlIHtcbiAgc3RhdGljIGZvckZsYXZvdXJzKFxuICAgIGZsYXZvdXJzOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmcgPSBcImV2ZW50c1wiXG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgY29udHJvbGxlcnM6IFtFdmVudHNDb250cm9sbGVyXSxcbiAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgUm91dGVyTW9kdWxlLnJlZ2lzdGVyKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKSxcbiAgICAgICAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMsXG4gICAgICAgICAgdXNlVmFsdWU6IGZsYXZvdXJzID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBGb3J3YXJkUmVmZXJlbmNlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZkNvcmVNb2R1bGUgfSBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0TW9kdWxlRm9yIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWwvaW5kZXhcIjtcbmltcG9ydCB7IERlY2FmU3RyZWFtTW9kdWxlIH0gZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZHVsZSB7XG4gIHN0YXRpYyBhc3luYyBmb3JSb290QXN5bmMoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8RHluYW1pY01vZHVsZT4ge1xuICAgIGNvbnN0IHsgYXV0b0NvbnRyb2xsZXJzLCBhdXRvU2VydmljZXMgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgYXdhaXQgRGVjYWZDb3JlTW9kdWxlLmJvb3RQZXJzaXN0ZW5jZShvcHRpb25zKTtcbiAgICBjb25zdCBmbGF2b3VycyA9IGFkYXB0ZXJzLm1hcCgoYWRhcHRlcikgPT4gYWRhcHRlci5mbGF2b3VyKTtcblxuICAgIGNvbnN0IGltcG9ydHM6XG4gICAgICB8IChcbiAgICAgICAgICB8IER5bmFtaWNNb2R1bGVcbiAgICAgICAgICB8IFR5cGU8YW55PlxuICAgICAgICAgIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPlxuICAgICAgICAgIHwgRm9yd2FyZFJlZmVyZW5jZTxhbnk+XG4gICAgICAgIClbXVxuICAgICAgfCB1bmRlZmluZWQgPSBbRGVjYWZDb3JlTW9kdWxlLmZvclJvb3Qob3B0aW9ucyldO1xuXG4gICAgaWYgKGF1dG9Db250cm9sbGVycykge1xuICAgICAgICBmbGF2b3Vycy5mb3JFYWNoKChmbGF2b3VyKSA9PiB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICAgICAgZ2V0TW9kdWxlRm9yKGZsYXZvdXIpLmZvclJvb3QoZmxhdm91ciwge1xuICAgICAgICAgICAgICBhdXRvU2VydmljZXMsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJFeHBvc3VyZTogb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJDb25maWc6IG9wdGlvbnMuY29udHJvbGxlckNvbmZpZyxcbiAgICAgICAgICAgICAgYWdncmVnYXRpb25zOiBvcHRpb25zLmFnZ3JlZ2F0aW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vYnNlcnZlck9wdGlvbnM/LmVuYWJsZU9ic2VydmVyRXZlbnRzKSB7XG4gICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgIERlY2FmU3RyZWFtTW9kdWxlLmZvckZsYXZvdXJzKFxuICAgICAgICAgIG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zLm9ic2VydmVyRmxhdm91cnMgfHwgZmxhdm91cnNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZHVsZSxcbiAgICAgIGltcG9ydHM6IGltcG9ydHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWlncmF0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHt9XG4iLCJpbXBvcnQge01vZGVsfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge0ludGVybmFsRXJyb3J9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtSZXBvc2l0b3J5fSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9Gb3JNb2RlbChtb2RlbDogc3RyaW5nKSB7XG5cdGNvbnN0IG0gPSBNb2RlbC5nZXQobW9kZWwpO1xuXHRpZiAoIW0pXG5cdFx0dGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBmaW5kIHJlcG9zaXRvcnkgZm9yICR7bW9kZWx9YClcblx0Y29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cdHJldHVybiByZXBvO1xufSIsIi8qKlxuICogQG1vZHVsZSBmb3ItbmVzdFxuICogQGRlc2NyaXB0aW9uIFRoaXMgbW9kdWxlIHNlcnZlcyBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHRzLXdvcmtzcGFjZSBsaWJyYXJ5LiBJdCBhZ2dyZWdhdGVzIGFuZCBleHBvcnRzXG4gKiBmdW5jdGlvbmFsaXR5IGZyb20gdmFyaW91cyBzdWJtb2R1bGVzIGFuZCB1dGlsaXRpZXMgd2l0aGluIHRoZSBwcm9qZWN0LlxuICpcbiAqIFRoZSBtb2R1bGUgaW5jbHVkZXM6XG4gKiAxLiBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgXCIuL3V0aWxzXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGVzZSBsaWtlbHkgY29udGFpbiBoZWxwZXIgZnVuY3Rpb25zLCBjb21tb24gdHlwZXMsIGFuZCBzaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2plY3QuXG4gKiAgICAtIE1heSBpbmNsdWRlIG9wZXJhdGlvbnMgZm9yIGRhdGEgbWFuaXB1bGF0aW9uLCB0eXBlIGNoZWNraW5nLCBvciBvdGhlciBnZW5lcmFsLXB1cnBvc2UgdXRpbGl0aWVzLlxuICpcbiAqIDIuIEEgbmFtZXNwYWNlIGFuZCByZWxhdGVkIHR5cGVzIGZyb20gdGhlIFwiLi9uYW1lc3BhY2VcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoaXMgY291bGQgY29udGFpbiBkb21haW4tc3BlY2lmaWMgY29kZSBvciBhIGNvbGxlY3Rpb24gb2YgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LlxuICogICAgLSBNaWdodCBpbmNsdWRlIGludGVyZmFjZXMsIHR5cGVzLCBvciBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGNvcmUgY29uY2VwdHMgaW4gdGhlIGxpYnJhcnkuXG4gKlxuICogMy4gQSBWRVJTSU9OIGNvbnN0YW50OlxuICogICAgLSBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqICAgIC0gVXNlZnVsIGZvciB2ZXJzaW9uIGNoZWNraW5nIGFuZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICpcbiAqIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIGEgY2xlYW4gYW5kIG9yZ2FuaXplZCBleHBvcnQgb2YgdGhlIG1vZHVsZSdzIGZ1bmN0aW9uYWxpdHksIGFsbG93aW5nIGNvbnN1bWVyc1xuICogdG8gZWFzaWx5IGltcG9ydCBhbmQgdXNlIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IGFzIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IFwiLi9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRpb25cIjsgLy8gb24gdG9wIG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL292ZXJyaWRlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVxdWVzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb250cm9sbGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG4vLyBleHBvcnQgKiBmcm9tIFwiLi93ZWJob29rc1wiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdHMtd29ya3NwYWNlIG1vZHVsZS5cbiAqIFRoZSBhY3R1YWwgdmVyc2lvbiBudW1iZXIgaXMgcmVwbGFjZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb21taXQgaGFzaCBvZiB0aGUgbW9kdWxlIGJ1aWxkLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGdpdCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb21taXQgaGFzaCBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgQ09NTUlUXG4gKi9cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgZnVsbCB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW12ZXIgdmVyc2lvbiBhbmQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLlxuICogVGhlIGJ1aWxkIHJlcGxhY2VzIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgYDx2ZXJzaW9uPi08Y29tbWl0PmAgdmFsdWUgYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IEZVTExfVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24odHJ1ZSk7XG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24oZmFsc2UpO1xuIl0sIm5hbWVzIjpbIkRFQ09SQVRPUlNfUFJFRklYIiwiREVDT1JBVE9SUyIsIkFQSV9PUEVSQVRJT04iLCJBUElfUkVTUE9OU0UiLCJBUElfUFJPRFVDRVMiLCJBUElfQ09OU1VNRVMiLCJBUElfVEFHUyIsIkFQSV9DQUxMQkFDS1MiLCJBUElfUEFSQU1FVEVSUyIsIkFQSV9IRUFERVJTIiwiQVBJX01PREVMX1BST1BFUlRJRVMiLCJBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSIsIkFQSV9TRUNVUklUWSIsIkFQSV9FWENMVURFX0VORFBPSU5UIiwiQVBJX0VYQ0xVREVfQ09OVFJPTExFUiIsIkFQSV9FWFRSQV9NT0RFTFMiLCJBUElfRVhURU5TSU9OIiwiQVBJX1NDSEVNQSIsIkFQSV9ERUZBVUxUX0dFVFRFUiIsIkFQSV9MSU5LIiwiaXNDb25zdHJ1Y3RvciIsInZhbCIsIk1FVEFEQVRBX0ZBQ1RPUllfTkFNRSIsIk1FVEhPRF9NRVRBREFUQSIsImNyZWF0ZU1ldGhvZERlY29yYXRvciIsIm1ldGFrZXkiLCJtZXRhZGF0YSIsIm92ZXJyaWRlRXhpc3RpbmciLCJ0YXJnZXQiLCJrZXkiLCJkZXNjcmlwdG9yIiwicHJldlZhbHVlIiwiUmVmbGVjdCIsImdldE1ldGFkYXRhIiwidmFsdWUiLCJkZWZpbmVNZXRhZGF0YSIsImNyZWF0ZUNsYXNzRGVjb3JhdG9yIiwiY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IiLCJwcm9wZXJ0eUtleSIsInByb3BlcnRpZXMiLCJpbmNsdWRlcyIsImV4aXN0aW5nTWV0YWRhdGEiLCJuZXdNZXRhZGF0YSIsInBpY2tCeSIsIm5lZ2F0ZSIsImlzVW5kZWZpbmVkIiwibWV0YWRhdGFUb1NhdmUiLCJ0eXBlIiwiY29uc3RydWN0b3IiLCJjcmVhdGVNaXhlZERlY29yYXRvciIsIm1ldGFkYXRhcyIsIkFycmF5IiwiaXNBcnJheSIsInByZXZpb3VzTWV0YWRhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJjcmVhdGVQYXJhbURlY29yYXRvciIsImluaXRpYWwiLCJwYXJhbU9wdGlvbnMiLCJwYXJhbWV0ZXJzIiwicHJvcGVydHlLZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsIm1ldGhvZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJpc0FwaU1ldGhvZCIsImhhc01ldGFkYXRhIiwiZ2V0VHlwZUlzQXJyYXlUdXBsZSIsImlucHV0IiwiaXNBcnJheUZsYWciLCJpc0lucHV0QXJyYXkiLCJvYmoiLCJnZXRFbnVtVmFsdWVzIiwiZW51bVR5cGUiLCJudW1lcmljVmFsdWVzIiwidmFsdWVzIiwiZmlsdGVyIiwibWFwIiwidG9TdHJpbmciLCJrZXlzIiwiZ2V0RW51bVR5cGUiLCJoYXNTdHJpbmciLCJpc1N0cmluZyIsImxlbmd0aCIsInJlcXVpcmVkIiwiaXNFbnVtQXJyYXkiLCJvcHRzIiwiZW51bSIsInVuZGVmaW5lZCIsIkFwaVByb3BlcnR5Iiwib3B0aW9ucyIsImNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yIiwiZW51bVZhbHVlcyIsIml0ZW1zIiwiQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiTW9kZWxDb25zdHJ1Y3RvciIsInZlcmIiLCJwYXRoIiwiaHR0cFRvQ3J1ZCIsIkdFVCIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiR2V0IiwiUE9TVCIsIkNSRUFURSIsIlBvc3QiLCJQVVQiLCJVUERBVEUiLCJQdXQiLCJQQVRDSCIsIlBhdGNoIiwiREVMRVRFIiwiRGVsZXRlIiwiY3J1ZE9wIiwiSHR0cE1ldGhvZERlY29yYXRvciIsInJlc29sdmVCbG9ja1RhcmdldCIsImNvcmVJc09wZXJhdGlvbkJsb2NrZWQiLCJraW5kIiwiYXBwbHkiLCJBcGlFeGNsdWRlRW5kcG9pbnQiLCJCdWxrQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiUkVBRF9BTEwiLCJDUkVBVEVfQUxMIiwiVVBEQVRFX0FMTCIsIkRFTEVURV9BTEwiLCJub3JtYWxpemVkIiwicmVwbGFjZSIsInN0YXRlbWVudFRhcmdldHMiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJMSVNUX0JZIiwiUEFHRV9CWSIsIkZJTkQiLCJQQUdFIiwiRklORF9PTkVfQlkiLCJGSU5EX0JZIiwiQ09VTlRfT0YiLCJNQVhfT0YiLCJNSU5fT0YiLCJBVkdfT0YiLCJTVU1fT0YiLCJESVNUSU5DVF9PRiIsIkdST1VQX09GIiwic3RhcnRzV2l0aCIsInN0YXRlbWVudFZhbHVlIiwiQXBpUGFyYW1zRnJvbU1vZGVsIiwicHJvcHMiLCJkZWNvcmF0b3JzIiwicCIsIkFwaVBhcmFtRGVjIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiU3RyaW5nIiwiYXBwbHlEZWNvcmF0b3JzIiwiRGVjYWZCb2R5IiwiZGF0YSIsImN0eCIsInJlcXVlc3QiLCJzd2l0Y2hUb0h0dHAiLCJnZXRSZXF1ZXN0IiwiYm9keSIsImNvbnRyb2xsZXIiLCJnZXRDbGFzcyIsIk1vZGVsQ29uc3RyIiwiY2xhc3MiLCJJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIiwiaXRlbSIsIk9yZGVyZWRQYXJhbXMiLCJvcmRlciIsInJlcSIsIm9yaWdpbmFsIiwicGFyYW1zIiwib3JkZXJMaXN0Iiwib3JkZXJlZCIsImsiLCJyYXciLCJ2YWx1ZXNJbk9yZGVyIiwia2V5c0luT3JkZXIiLCJEZWNhZlBhcmFtcyIsIkRlY2FmUXVlcnkiLCJfIiwicXVlcnkiLCJwYXJzZWQiLCJsaW1pdCIsIm4iLCJOdW1iZXIiLCJpc05hTiIsIm9mZnNldCIsImJvb2ttYXJrIiwiREVDQUZfTU9EVUxFX09QVElPTlMiLCJERUNBRl9BREFQVEVSX0lEIiwiREVDQUZfVEFTS19TRVJWSUNFX0lEIiwiREVDQUZfUk9VVEUiLCJERUNBRl9IQU5ETEVSUyIsIlN5bWJvbCIsIkRFQ0FGX0VYUE9TRSIsIkRFQ0FGX0NPTlRST0xMRVJfQ09ORklHIiwiREVDQUZfQ09OVEVYVF9LRVkiLCJleHBvc2UiLCJmbGF2b3VycyIsIk1ldGFkYXRhIiwic2V0IiwiY29udHJvbGxlckNvbmZpZyIsImNvbmZpZyIsImNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IiLCJBVVRIX0hBTkRMRVIiLCJBVVRIX01FVEFfS0VZIiwiSVNfUFVCTElDX0tFWSIsIlJFUVVJUkVEX1JPTEVTX0tFWSIsIlNLSVBfTU9ERUxfUk9MRVNfS0VZIiwiRGVjYWZSZXF1ZXN0Q29udGV4dCIsIlJlcXVlc3RDb250ZXh0Iiwic3VwZXIiLCJoZWFkZXJzT2YiLCJoZWFkZXJzIiwidGhpcyIsInV1aWQiLCJVVUlEIiwiaW5zdGFuY2UiLCJnZW5lcmF0ZSIsImdldE9yVW5kZWZpbmVkIiwicHV0IiwicmVjb3JkIiwib3ZlcnJpZGVzIiwiZ2V0IiwiZSIsImFjY3VtdWxhdGUiLCJfX2RlY29yYXRlIiwiSW5qZWN0YWJsZSIsInNjb3BlIiwiU2NvcGUiLCJSRVFVRVNUIiwiX19wYXJhbSIsIkluamVjdCIsIkF1dGhJbnRlcmNlcHRvciIsInJlZmxlY3RvciIsInJlcXVlc3RDb250ZXh0IiwiYXV0aEhhbmRsZXIiLCJpbnRlcmNlcHQiLCJuZXh0IiwibG9nIiwiTG9nZ2luZyIsImZvciIsImlzUHVibGljIiwiZ2V0QWxsQW5kT3ZlcnJpZGUiLCJnZXRIYW5kbGVyIiwibW9kZWxOYW1lIiwicmVxdWlyZWRSb2xlcyIsInNraXBNb2RlbFJvbGVzIiwiZWZmZWN0aXZlTW9kZWwiLCJ2ZXJib3NlIiwiZGVidWciLCJhdXRob3JpemUiLCJhcHBseVRyYW5zZm9ybWVycyIsInVzZXIiLCJvcmdhbml6YXRpb24iLCJjdXJyZW50TG9nIiwiY2hpbGRMb2ciLCJsb2dnZXIiLCJoYW5kbGUiLCJBZGFwdGVyIiwiZmxhdm91cnNUb1RyYW5zZm9ybSIsImZsYXZvdXIiLCJ0cmFuc2Zvcm1lciIsInRyYW5zZm9ybWVyRm9yIiwiZnJvbSIsIk9wdGlvbmFsIiwiUmVmbGVjdG9yIiwiQXV0aCIsIm1vZGVsIiwicmVzb3VyY2UiLCJkZWNzIiwiQXBpQmVhcmVyQXV0aCIsIlVzZUludGVyY2VwdG9ycyIsInB1c2giLCJTZXRNZXRhZGF0YSIsIlB1YmxpYyIsIlJlcXVpcmVSb2xlcyIsInJvbGVzIiwiQXBpU2VjdXJpdHkiLCJIdHRwVmVyYlRvRGVjb3JhdG9yIiwiZGVjb3JhdG9yIiwiVW5zdXBwb3J0ZWRFcnJvciIsImV4dHJhY3RQYXRoUGFyYW1zIiwicm91dGVQYXRoIiwic3BsaXQiLCJzbGljZSIsImFwaVBhcmFtU3BlYyIsInRvRGVjYWZFcnJvciIsImVycm9yIiwiZmFsbGJhY2tNZXNzYWdlIiwiQmFzZUVycm9yIiwiSW50ZXJuYWxFcnJvciIsIkVycm9yIiwibWVzc2FnZSIsImdldEFwaURlY29yYXRvcnMiLCJtZXRob2ROYW1lIiwiaHR0cFZlcmIiLCJpbmNsdWRlUXVlcnlQYXJhbXMiLCJOZXN0SHR0cFJvdXRlRGVjIiwiYXBpUGF0aFBhcmFtcyIsInN3YWdnZXJRdWVyeVBhcmFtcyIsIkFwaVF1ZXJ5IiwiT3JkZXJEaXJlY3Rpb24iLCJtZXRob2QiLCJBcGlQYXJhbSIsIkFwaU9wZXJhdGlvbiIsInN1bW1hcnkiLCJBcGlPa1Jlc3BvbnNlIiwiQXBpTm9Db250ZW50UmVzcG9uc2UiLCJRdWVyeSIsImFwcGx5QXBpRGVjb3JhdG9ycyIsInByb3RvIiwiZm9yRWFjaCIsImQiLCJpbmRleCIsInJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZCIsInBlcnNpc3RlbmNlIiwiYXJncyIsIk1vZGVsU2VydmljZSIsInN0YXRlbWVudCIsImNyZWF0ZVJvdXRlSGFuZGxlciIsImFzeW5jIiwicGF0aFBhcmFtcyIsInF1ZXJ5UGFyYW1zIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpcmVjdGlvbiIsImRlZmluZVJvdXRlTWV0aG9kIiwiQ29udHJvbGxlckNsYXNzIiwiaGFuZGxlciIsImRlZmluZVByb3BlcnR5Iiwid3JpdGFibGUiLCJEZWNhZkF1dGhIYW5kbGVyIiwiQXV0aEhhbmRsZXIiLCJwYXJzZVJlcXVlc3QiLCJ1c2VyUm9sZSIsImF1dGhvcml6YXRpb24iLCJleHRyYWN0RnJvbUF1dGgiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJEZWNhZlJvbGVBdXRoSGFuZGxlciIsIkRlY2FmQXV0aE1vZHVsZSIsIkRlY2FmQXV0aE1vZHVsZV8xIiwiZm9yUm9vdCIsInByb3ZpZGVycyIsInByb3ZpZGUiLCJ1c2VDbGFzcyIsImdsb2JhbCIsIkFQUF9JTlRFUkNFUFRPUiIsInVzZUV4aXN0aW5nIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1vZHVsZSIsIkRlY2FmSGFuZGxlckV4ZWN1dG9yIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3JfMSIsImhhbmRsZXJzIiwiY29udGV4dCIsImV4ZWMiLCJyZXMiLCJ1cmwiLCJEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IiLCJyZXNwb25zZSIsImdldFJlc3BvbnNlIiwicGlwZSIsInRhcCIsInRvUmVzcG9uc2UiLCJEZWNhZkNvbnRyb2xsZXIiLCJIdHRwRGVjYWZDb250cm9sbGVyIiwiY2xpZW50Q29udGV4dCIsIl9uYW1lIiwiRGVjYWZNb2RlbENvbnRyb2xsZXIiLCJfcGVyc2lzdGVuY2UiLCJTZXJ2aWNlIiwiZ2V0U2VydmljZSIsIlJlcG9zaXRvcnkiLCJmb3JNb2RlbCIsImFjdGl2ZUN0eCIsInRvT3ZlcnJpZGVzIiwib3ZlcnJpZGUiLCJkdG9DYWNoZSIsIk1hcCIsIkR0b0ZvciIsIm9wIiwic3RhY2siLCJTZXQiLCJUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMiLCJjYWNoZSIsImdldER0b0NhY2hlIiwiY2FjaGVkIiwiaXNVcGRhdGVPcCIsIkR5bmFtaWNEVE8iLCJ0b1Bhc2NhbENhc2UiLCJwa1Byb3AiLCJNb2RlbCIsInBrIiwicGtQcm9wc01ldGFkYXRhIiwicGtQcm9wcyIsInBrRGVzaWduVHlwZSIsInBrVHlwZUlzTnVtZXJpYyIsIkJpZ0ludCIsInBrSXNHZW5lcmF0ZWQiLCJnZW5lcmF0ZWQiLCJnZW5lcmF0ZWRCeVNlcXVlbmNlIiwiaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlIiwiYWxsUHJvcHMiLCJyZWxhdGlvbnMiLCJzY2FsYXJQcm9wcyIsInByb3AiLCJoYXMiLCJ2YWxpZGF0aW9uIiwiZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlIiwiaXNSZXF1aXJlZCIsIlZhbGlkYXRpb25LZXlzIiwiUkVRVUlSRUQiLCJ0eXBlSGludCIsImdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZSIsImFwaU9wdGlvbnMiLCJkZXNpZ25UeXBlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsInJlbGF0aW9uIiwicmVsYXRpb25NZXRhIiwicmVsYXRpb25UeXBlIiwibWV0YSIsInZhbGlkYXRpb25Gb3IiLCJMSVNUIiwiaXNDaXJjdWxhciIsInBrVHlwZU5hbWUiLCJnZXRQa09wZW5BcGlUeXBlIiwiYWRkUmVsYXRpb25Qa1JlZiIsInJlbGF0aW9uRHRvIiwiYWRkIiwiYWRkUmVsYXRpb25VcGRhdGUiLCJhZGRSZWxhdGlvbiIsIkR0b0NsYXNzIiwiZXh0cmFNb2RlbHMiLCJkdG9SZWYiLCJvbmVPZkl0ZW1zIiwiJHJlZiIsIm9uZU9mIiwicGtUeXBlIiwiY3VycmVudCIsIkZ1bmN0aW9uIiwiZ2V0UHJvdG90eXBlT2YiLCJXZWFrTWFwIiwidG9Db250ZXh0RmxhZ3MiLCJhZGFwdGVyIiwiYWxpYXMiLCJiaW5kIiwicmVxdWVzdFRyYW5zZm9ybWVycyIsIkNvbnRleHQiLCJwZW5kaW5nIiwiaGVhZGVyIiwiTW9kZWxCdWlsZGVyIiwiZGVjb3JhdGVDbGFzcyIsIl9jbGFzc0RlY29yYXRvcnMiLCJfX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCIsIm9yaWdpbmFsQnVpbGQiLCJidWlsZCIsInJlc3VsdCIsImNhbGwiLCJkZWNvcmF0ZWQiLCJGcm9tTW9kZWxDb250cm9sbGVyIiwiZ2V0UGVyc2lzdGVuY2UiLCJNb2RlbENsYXp6IiwiZTIiLCJjcmVhdGVRdWVyeVJvdXRlc0Zyb21SZXBvc2l0b3J5IiwicHJlZml4IiwiUGVyc2lzdGVuY2VLZXlzIiwiUVVFUlkiLCJyZXBvIiwicXVlcnlNZXRob2RzIiwicm91dGVNZXRob2RzIiwiUXVlcnlDb250cm9sbGVyIiwiZW50cmllcyIsInNlZ21lbnQiLCJ0cmltIiwiam9pbiIsImNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIiLCJkZWZpbmVNZXRob2QiLCJodHRwRGVjb3JhdG9yIiwiaHR0cE1ldGhvZCIsImdldFF1ZXJ5RGVjb3JhdG9ycyIsIm9ialZhbHVlcyIsImZpZWxkcyIsImYiLCJjcmVhdGUiLCJtb2R1bGVDb25maWdPdmVycmlkZXMiLCJnbG9iYWxEZWZhdWx0cyIsInRhYmxlTmFtZSIsInRvS2ViYWJDYXNlIiwibW9kZWxDbGF6ek5hbWUiLCJmYWN0b3J5UGVyc2lzdGVuY2UiLCJkZWNvcmF0b3JDb25maWciLCJtb2R1bGVPdmVycmlkZSIsIm1lcmdlZENvbmZpZyIsIkZhY3RvcnlDb250cm9sbGVyIiwiTW9kZWxDb250cm9sbGVyRmFjdG9yeSIsImZhY3RvcnlSb3V0ZXMiLCJfX3JvdXRlc19fIiwiZ2V0UEsiLCJhcGlQcm9wZXJ0aWVzIiwicGtQYXRoIiwiZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsIiwiYXV0aENvbmZpZyIsImF1dGgiLCJhcHBseUNsYXNzQXV0aCIsInB1YmxpYyIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXIiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyXzEiLCJpbmZvIiwiQ29udHJvbGxlciIsIkFwaVRhZ3MiLCJBcGlFeHRyYU1vZGVscyIsInNvcnRlZFJvdXRlcyIsInNvcnQiLCJhIiwiYiIsImFTZWdtZW50cyIsIkJvb2xlYW4iLCJiU2VnbWVudHMiLCJhUGFyYW1Db3VudCIsInMiLCJiUGFyYW1Db3VudCIsImFMaXRlcmFsQ291bnQiLCJiTGl0ZXJhbENvdW50Iiwicm91dGUiLCJpbXBsZW1lbnRhdGlvbiIsInRvTG93ZXJDYXNlIiwicmVnaXN0cmF0aW9uIiwibWF0Y2hSb3V0ZSIsInJlZ2lzdGVyZWRNZXRob2ROYW1lIiwicGFyYW1EZWNvcmF0b3JzIiwiY29tcG9zZWQiLCJEQktleXMiLCJDT01QT1NFRCIsImNvbXBvc2VkS2V5cyIsInVuaXF1ZUtleXMiLCJzZXBhcmF0b3IiLCJyb3V0ZVBhcmFtRGVjb3JhdG9ycyIsInBhcmFtSW5kZXgiLCJmbGF0TWFwIiwiUGFyYW0iLCJtZXRob2REZWNvcmF0b3JzIiwibm9ybWFsaXplZFBhdGgiLCJjcmVhdGVSZWdpc3RyYXRpb24iLCJjcmVhdGVDcmVhdGVEZWNvcmF0b3JzIiwiUmVzcG9uc2UiLCJwYXNzdGhyb3VnaCIsImJ1bGtDcmVhdGVEZWNvcmF0b3JzIiwiYnVsa1JlYWREZWNvcmF0b3JzIiwiYnVsa1VwZGF0ZURlY29yYXRvcnMiLCJidWxrRGVsZXRlRGVjb3JhdG9ycyIsInJlYWREZWNvcmF0b3JzIiwicm91dGVQYXJhbXMiLCJ1cGRhdGVEZWNvcmF0b3JzIiwiZGVsZXRlRGVjb3JhdG9ycyIsImZhbGxiYWNrU2VnbWVudHMiLCJpc0FsbFBhcmFtcyIsImV2ZXJ5IiwiZmFsbGJhY2tBcGlQcm9wcyIsInN1ZmZpeCIsInN0YXRlbWVudERlY29yYXRvcnMiLCJzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMiLCJzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyIsInN0YXRlbWVudFJvdXRlcyIsInN0YXRlbWVudEtleSIsInN0YXRlbWVudE1ldGhvZE5hbWUiLCJxdWVyeU1ldGhvZCIsImNvbXBsZXhRdWVyeVBhcmFtcyIsInBhdGhTZWdtZW50cyIsImtub3duUHJlZml4ZXMiLCJmaXJzdFNlZ21lbnQiLCJzZWdtZW50cyIsInNlZyIsImkiLCJjb21wbGV4UXVlcnkiLCJsb2dDdHgiLCJzcHJlYWRBcmdzIiwibm9ybWFsaXplUXVlcnlBcmdzIiwiZXh0cmFjdFF1ZXJ5QXJncyIsImxhc3QiLCJxdWVyeU9iaiIsInBvcCIsImhhc0RpcmVjdGlvbiIsImhhc0xpbWl0IiwiaGFzT2Zmc2V0IiwiZXh0cmFzIiwiaGFzUXVlcnlGaWVsZHMiLCJBcGlCb2R5IiwiQXBpQ3JlYXRlZFJlc3BvbnNlIiwic2NoZW1hIiwiZ2V0U2NoZW1hUGF0aCIsIkFwaUJhZFJlcXVlc3RSZXNwb25zZSIsIkFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSIsIkFwaU5vdEZvdW5kUmVzcG9uc2UiLCJiYXNlIiwiZ2V0TW9kdWxlRm9yIiwiRGVjYWZNb2RlbE1vZHVsZSIsIkRlY2FmTW9kZWxNb2R1bGVfMSIsImNyZWF0ZU1vZGVsU2VydmljZXMiLCJtb2RlbHMiLCJ1c2VGYWN0b3J5IiwiaXNFeHBvc2VkIiwiZXhwb3N1cmUiLCJ0cmFja2VkTW9kZWxzIiwiY29udHJvbGxlckV4cG9zdXJlIiwibW9kZWxTZXJ2aWNlcyIsImF1dG9TZXJ2aWNlcyIsImFnZ3JlZ2F0aW9ucyIsImFsbG93R3JvdXBpbmdRdWVyaWVzIiwiY29udHJvbGxlcnMiLCJEZWNvcmF0aW9uIiwiSW5qZWN0YWJsZXNLZXlzIiwiSU5KRUNUQUJMRSIsImV4dGVuZCIsIm5lc3RJbmplY3RhYmxlIiwiY2F0ZWdvcnkiLCJjZmciLCJEZWZhdWx0SW5qZWN0YWJsZXNDb25maWciLCJzaW5nbGV0b24iLCJERUZBVUxUIiwiZHVyYWJsZSIsIklOSkVDVCIsIm5lc3RJbmplY3QiLCJpbm5lck5lc3RJbmplY3QiLCJNQVgiLCJtYXhEZWMiLCJtYXgiLCJtYXhpbXVtIiwiTUlOIiwibWluRGVjIiwibWluIiwibWluaW11bSIsIk1BWF9MRU5HVEgiLCJtYXhMZW5ndGhEZWMiLCJtYXhMZW5ndGgiLCJNSU5fTEVOR1RIIiwibWluTGVuZ3RoRGVjIiwibWluTGVuZ3RoIiwiVFlQRSIsInR5cGVEZWMiLCJEQVRFIiwiZGF0ZURlYyIsImZvcm1hdCIsIkVOVU0iLCJvcHRpb25EZWMiLCJQQVRURVJOIiwicGF0dGVybkRlYyIsInBhdCIsInBhdHRlcm4iLCJzb3VyY2UiLCJDT0xVTU4iLCJjb2x1bW5EZWMiLCJEZWNvcmF0aW9uS2V5cyIsIkRFU0NSSVBUSU9OIiwiZGVzY3JpcHRpb25EZWMiLCJBVVRIIiwiQ29yc0Vycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJtc2ciLCJUb01hbnlSZXF1ZXN0c0Vycm9yIiwiSFRUUF9FWENFUFRJT05fVE9fREVDQUZfRVJST1IiLCJVbmF1dGhvcml6ZWRFeGNlcHRpb24iLCJGb3JiaWRkZW5FeGNlcHRpb24iLCJCYWRSZXF1ZXN0RXhjZXB0aW9uIiwiQmFkUmVxdWVzdEVycm9yIiwiQ29uZmxpY3RFeGNlcHRpb24iLCJDb25mbGljdEVycm9yIiwiVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiIsIlZhbGlkYXRpb25FcnJvciIsIkRlY2FmRXhjZXB0aW9uRmlsdGVyIiwibW9kdWxlUmVmIiwiZXhjZXB0aW9uIiwiaG9zdCIsImlzUHJvZHVjdGlvbiIsIkxvZ2dlZEVudmlyb25tZW50IiwiZW52Iiwic3RhdHVzQ29kZSIsIk5vdEZvdW5kRXhjZXB0aW9uIiwiTm90QWNjZXB0YWJsZUV4Y2VwdGlvbiIsImdldFN0YXR1cyIsImRlY2FmRXJyb3JGb3IiLCJzdGF0dXMiLCJIdHRwRXhjZXB0aW9uIiwibG9nRXJyb3IiLCJjb2RlIiwianNvbiIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImZhY3RvcnkiLCJyZXNvbHZlTG9nZ2VyIiwiY29udGV4dElkIiwiQ29udGV4dElkRmFjdG9yeSIsImdldEJ5UmVxdWVzdCIsInJlc29sdmUiLCJzdHJpY3QiLCJDYXRjaCIsIk1vZHVsZVJlZiIsIlVzZURlY2FmRmlsdGVyIiwiVXNlRmlsdGVycyIsIlVzZURlY2FmSGVhZGVycyIsIlNXQUdHRVJfVUlfQ09OU1RBTlRTIiwidGl0bGUiLCJ2ZXJzaW9uIiwiZmF2aWNvbkZpbGVQYXRoIiwidG9wYmFySWNvbkZpbGVQYXRoIiwic2NoZW1lIiwiYmVhcmVyRm9ybWF0IiwiaW4iLCJwZXJzaXN0QXV0aG9yaXphdGlvbiIsInRvcGJhckJnQ29sb3IiLCJTd2FnZ2VyQ3VzdG9tVUkiLCJjdXN0b21DU1MiLCJjc3MiLCJ0b3BiYXJJY29uUGF0aCIsImltZyIsImI2NCIsImdldEN1c3RvbU9wdGlvbnMiLCJmYXZpY29uIiwiZmF2aWNvblBhdGgiLCJjdXN0b21TaXRlVGl0bGUiLCJjdXN0b21Dc3MiLCJzd2FnZ2VyT3B0aW9ucyIsImZpbGUiLCJmaWxlUGF0aCIsImFzc2V0c1BhdGgiLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsIlN3YWdnZXJCdWlsZGVyIiwiYXBwIiwiY3JlYXRlRG9jdW1lbnQiLCJvcGVuQXBpSnNvblBhdGgiLCJvcGVuQXBpWWFtbFBhdGgiLCJEb2N1bWVudEJ1aWxkZXIiLCJzZXRUaXRsZSIsInNldERlc2NyaXB0aW9uIiwic2V0VmVyc2lvbiIsImFkZEJlYXJlckF1dGgiLCJTd2FnZ2VyTW9kdWxlIiwicmVnaXN0ZXJPcGVuQXBpUm91dGUiLCJjb250ZW50VHlwZSIsImJvZHlGYWN0b3J5IiwiaHR0cEFkYXB0ZXIiLCJnZXRIdHRwQWRhcHRlciIsIl9yZXEiLCJyZXBseSIsInNldHVwU3dhZ2dlciIsImRvY3VtZW50Iiwic3dhZ2dlclVJIiwic2V0dXAiLCJqc29uRG9jdW1lbnRVcmwiLCJ5YW1sRG9jdW1lbnRVcmwiLCJZQU1MIiwiTmVzdEJvb3RzdHJhcGVyIiwiX2xvZ2dlciIsIkxvZ2dlciIsImluaXRpYWxpemUiLCJlbmFibGVMb2dnZXIiLCJjdXN0b21Mb2dnZXIiLCJ1c2VMb2dnZXIiLCJlbmFibGVDb3JzIiwib3JpZ2lucyIsImFsbG93TWV0aG9kcyIsImFsbG93ZWRPcmlnaW5zIiwibyIsImNvcnNPcHRpb25zIiwib3JpZ2luIiwiY2FsbGJhY2siLCJjcmVkZW50aWFscyIsIm1ldGhvZHMiLCJ1c2VIZWxtZXQiLCJoZWxtZXQiLCJyZXF1aXJlIiwidXNlIiwid2FybiIsInN3YWdnZXIiLCJ1c2VHbG9iYWxQaXBlcyIsInBpcGVzIiwidXNlR2xvYmFsRmlsdGVycyIsImZpbHRlcnMiLCJ1c2VHbG9iYWxJbnRlcmNlcHRvcnMiLCJpbnRlcmNlcHRvcnMiLCJzdGFydCIsInBvcnQiLCJwcm9jZXNzIiwiUE9SVCIsImxpc3RlbiIsInRoZW4iLCJnZXRVcmwiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JfMSIsImV4ZWN1dG9yIiwiY29udGV4dHVhbGl6ZSIsImZsYWdzIiwiaXAiLCJleHRyYWN0SXAiLCJEZWZhdWx0QWRhcHRlckZsYWdzIiwib3BlcmF0aW9uIiwicGFyc2VJcEhlYWRlciIsImNhbmRpZGF0ZSIsInBlbmRpbmdQcm92aWRlcnMiLCJnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMiLCJyZWdpc3RlclByb3ZpZGVyIiwidG9rZW4iLCJpc01vZGVsQ29uc3RydWN0b3IiLCJtb2RlbFNlcnZpY2VUb2tlbiIsIm1vZGVsUmVwb3NpdG9yeVRva2VuIiwicGFyYW1ldGVySW5kZXgiLCJyZXNvbHZlZCIsInBhcmFtVHlwZXMiLCJhc01vZGVsIiwiaW5qZWN0YWJsZVNlcnZpY2VLZXkiLCJDb3JlU2VydmljZSIsIkNvcmVSZXBvc2l0b3J5IiwiRGVjYWZDb3JlTW9kdWxlIiwiRGVjYWZDb3JlTW9kdWxlXzEiLCJkZWNhZlByb3ZpZGVycyIsInVzZVZhbHVlIiwiY2xpZW50IiwiSCIsInByb3ZpZGVyIiwiYm9vdFBlcnNpc3RlbmNlIiwidHJpbW1lZCIsImNvbmYiLCJjb250ciIsInBvc3NpYmxlIiwiUGVyc2lzdGVuY2VTZXJ2aWNlIiwiYm9vdCIsImNsaWVudHMiLCJjIiwicG9zc2libGVUcmFuc2YiLCJyZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIiLCJpbml0aWFsaXphdGlvbiIsIm9uQXBwbGljYXRpb25TaHV0ZG93biIsImFkYXB0ZXJzIiwic2h1dGRvd24iLCJHbG9iYWwiLCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMiLCJub3JtYWxpemVFdmVudFJlc3BvbnNlIiwibW9kZWxDb25zdHIiLCJpZCIsInBheWxvYWQiLCJzZXJpYWxpemVkUGF5bG9hZCIsInNlcmlhbGl6ZSIsImNvbnNvbGUiLCJlcnIiLCJFdmVudHNDb250cm9sbGVyIiwiRXZlbnRzQ29udHJvbGxlcl8xIiwiZXZlbnRzJCIsIk9ic2VydmFibGUiLCJvYnNlcnZlciIsIm9ic2VydmVySWQiLCJNYXRoIiwicmFuZG9tIiwidG9VcHBlckNhc2UiLCJjYiIsInJlZnJlc2giLCJQcm9taXNlIiwiYWRhcHRlck5hbWUiLCJvYnNlcnZlIiwidW5PYnNlcnZlIiwiSEVBUlRCRUFUX0lOVEVSVkFMX01TIiwiaGVhcnRiZWF0JCIsImludGVydmFsIiwidHMiLCJtZXJnZSIsImxpc3RlbkZvck1vZGVsIiwiU3NlIiwiRGVjYWZTdHJlYW1Nb2R1bGUiLCJEZWNhZlN0cmVhbU1vZHVsZV8xIiwiZm9yRmxhdm91cnMiLCJpbXBvcnRzIiwiUm91dGVyTW9kdWxlIiwicmVnaXN0ZXIiLCJEZWNhZk1vZHVsZSIsIkRlY2FmTW9kdWxlXzEiLCJmb3JSb290QXN5bmMiLCJhdXRvQ29udHJvbGxlcnMiLCJvYnNlcnZlck9wdGlvbnMiLCJlbmFibGVPYnNlcnZlckV2ZW50cyIsIm9ic2VydmVyRmxhdm91cnMiLCJydW5NaWdyYXRpb25zIiwicmVwb0Zvck1vZGVsIiwibSIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJhbGxvd1JlcmVnaXN0cmF0aW9uIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBTyxNQUFNQSxvQkFBb0I7SUFDMUIsTUFBTUMsYUFBYTtRQUN4QkMsZUFBZSxHQUFHRjtRQUNsQkcsY0FBYyxHQUFHSDtRQUNqQkksY0FBYyxHQUFHSjtRQUNqQkssY0FBYyxHQUFHTDtRQUNqQk0sVUFBVSxHQUFHTjtRQUNiTyxlQUFlLEdBQUdQO1FBQ2xCUSxnQkFBZ0IsR0FBR1I7UUFDbkJTLGFBQWEsR0FBR1Q7UUFDaEJVLHNCQUFzQixHQUFHVjtRQUN6QlcsNEJBQTRCLEdBQUdYO1FBQy9CWSxjQUFjLEdBQUdaO1FBQ2pCYSxzQkFBc0IsR0FBR2I7UUFDekJjLHdCQUF3QixHQUFHZDtRQUMzQmUsa0JBQWtCLEdBQUdmO1FBQ3JCZ0IsZUFBZSxHQUFHaEI7UUFDbEJpQixZQUFZLEdBQUdqQjtRQUNma0Isb0JBQW9CLEdBQUdsQjtRQUN2Qm1CLFVBQVUsR0FBR25COztJQ2hCUixNQUFNb0IsZ0JBQWlCQyxPQUFzQkEsUUFBUTtJQUNyRCxNQUFNQyx3QkFBd0I7SUFFOUIsTUFBTUMsa0JBQWtCO0lBRXpCLFNBQVVDLHNCQUNkQyxTQUNBQyxXQUNBQyxrQkFBRUEsb0JBQXFCO1FBQUVBLGtCQUFrQjs7UUFFM0MsT0FBTyxDQUNMQyxRQUNBQyxLQUNBQztZQUVBLFdBQVdKLGFBQWEsVUFBVTtnQkFDaEMsTUFBTUssWUFBWUMsUUFBUUMsWUFBWVIsU0FBU0ssV0FBV0k7Z0JBQzFELElBQUlILGNBQWNKLGtCQUFrQjtvQkFDbEMsT0FBT0c7QUFDVDtnQkFDQUUsUUFBUUcsZUFDTlYsU0FDQTt1QkFBS007dUJBQWNMO21CQUNuQkksV0FBV0k7Z0JBRWIsT0FBT0o7QUFDVDtZQUNBRSxRQUFRRyxlQUFlVixTQUFTQyxVQUFVSSxXQUFXSTtZQUNyRCxPQUFPSjs7QUFFWDthQUVnQk0scUJBQ2RYLFNBQ0FDLFdBQWM7UUFFZCxPQUFRRTtZQUNOLE1BQU1HLFlBQVlDLFFBQVFDLFlBQVlSLFNBQVNHLFdBQVc7WUFDMURJLFFBQVFHLGVBQWVWLFNBQVMsS0FBSU0sY0FBY0wsWUFBV0U7WUFDN0QsT0FBT0E7O0FBRVg7SUFFTSxTQUFVUywwQkFDZFosU0FDQUMsVUFDQUMsbUJBQW1CO1FBRW5CLE9BQUEsQ0FBU0MsUUFBZ0JVO1lBQ3ZCLE1BQU1DLGFBQ0pQLFFBQVFDLFlBQVloQyxXQUFXVSw0QkFBNEJpQixXQUFXO1lBRXhFLE1BQU1DLE1BQU0sSUFBSVM7WUFDaEIsS0FBS0MsV0FBV0MsU0FBU1gsTUFBTTtnQkFDN0JHLFFBQVFHLGVBQ05sQyxXQUFXVSw0QkFDWCxLQUFJNEIsWUFBWSxJQUFJRCxpQkFDcEJWO0FBRUo7WUFDQSxNQUFNYSxtQkFBbUJULFFBQVFDLFlBQVlSLFNBQVNHLFFBQVFVO1lBQzlELElBQUlHLGtCQUFrQjtnQkFDcEIsTUFBTUMsY0FBY0MsT0FBQUEsT0FBT2pCLFVBQVVrQixPQUFBQSxPQUFPQyxPQUFBQTtnQkFDNUMsTUFBTUMsaUJBQWlCbkIsbUJBQ25CO3VCQUNLYzt1QkFDQUM7b0JBRUw7dUJBQ0tBO3VCQUNBRDs7Z0JBR1RULFFBQVFHLGVBQWVWLFNBQVNxQixnQkFBZ0JsQixRQUFRVTtBQUMxRCxtQkFBTztnQkFDTCxNQUFNUyxPQUNIbkIsUUFBUW9CLGNBQXNCMUIsMkJBQzdCZ0IsY0FDQ1MsUUFBUWYsUUFBUUMsWUFBWSxlQUFlTCxRQUFRVTtnQkFFeEROLFFBQVFHLGVBQ05WLFNBQ0E7b0JBQ0VzQjt1QkFDR0osY0FBT2pCLFVBQVVrQixPQUFBQSxPQUFPQyxPQUFBQTttQkFFN0JqQixRQUNBVTtBQUVKO0FBQ0Q7QUFDSDtJQUVNLFNBQVVXLHFCQUNkeEIsU0FDQUM7UUFFQSxPQUFPLENBQ0xFLFFBQ0FDLEtBQ0FDO1lBRUEsSUFBSUEsWUFBWTtnQkFDZCxJQUFJb0I7Z0JBQ0osSUFBSUMsTUFBTUMsUUFBUTFCLFdBQVc7b0JBQzNCLE1BQU0yQixtQkFDSnJCLFFBQVFDLFlBQVlSLFNBQVNLLFdBQVdJLFVBQVU7b0JBQ3BEZ0IsWUFBWSxLQUFJRyxxQkFBcUIzQjtBQUN2Qyx1QkFBTztvQkFDTCxNQUFNMkIsbUJBQ0pyQixRQUFRQyxZQUFZUixTQUFTSyxXQUFXSSxVQUFVLENBQUE7b0JBQ3BEZ0IsWUFBWTsyQkFBS0c7MkJBQXFCM0I7O0FBQ3hDO2dCQUNBTSxRQUFRRyxlQUFlVixTQUFTeUIsV0FBV3BCLFdBQVdJO2dCQUN0RCxPQUFPSjtBQUNUO1lBRUEsSUFBSW9CO1lBQ0osSUFBSUMsTUFBTUMsUUFBUTFCLFdBQVc7Z0JBQzNCLE1BQU0yQixtQkFBbUJyQixRQUFRQyxZQUFZUixTQUFTRyxXQUFXO2dCQUNqRXNCLFlBQVksS0FBSUcscUJBQXFCM0I7QUFDdkMsbUJBQU87Z0JBQ0wsTUFBTTJCLG1CQUFtQnJCLFFBQVFDLFlBQVlSLFNBQVNHLFdBQVcsQ0FBQTtnQkFDakVzQixZQUFZSSxPQUFPQyxPQUFPRCxPQUFPQyxPQUFPLElBQUlGLG1CQUFtQjNCO0FBQ2pFO1lBQ0FNLFFBQVFHLGVBQWVWLFNBQVN5QixXQUFXdEI7WUFDM0MsT0FBT0E7O0FBRVg7SUFFTSxTQUFVNEIscUJBQ2Q5QixVQUNBK0I7UUFFQSxPQUFPLENBRUw3QixRQUNBQyxLQUNBQztZQUVBLE1BQU00QixlQUFlO21CQUNoQkQ7bUJBQ0FkLGNBQU9qQixVQUFVa0IsT0FBQUEsT0FBT0MsT0FBQUE7O1lBRzdCLElBQUlmLFlBQVk7Z0JBQ2QsTUFBTTZCLGFBQ0ozQixRQUFRQyxZQUFZaEMsV0FBV08sZ0JBQWdCc0IsV0FBV0ksVUFBVTtnQkFDdEVGLFFBQVFHLGVBQ05sQyxXQUFXTyxnQkFDWCxLQUFJbUQsWUFBWUQsZ0JBQ2hCNUIsV0FBV0k7Z0JBRWIsT0FBT0o7QUFDVDtZQUVBLFdBQVdGLFdBQVcsVUFBVTtnQkFDOUIsT0FBT0E7QUFDVDtZQUVBLE1BQU1nQyxlQUFlTixPQUFPTyxvQkFBb0JqQyxPQUFPa0M7WUFFdkQsS0FBSyxNQUFNeEIsZUFBZXNCLGNBQWM7Z0JBQ3RDLElBQUl4QyxjQUFja0IsY0FBYztvQkFDOUI7QUFDRjtnQkFFQSxNQUFNeUIsbUJBQW1CVCxPQUFPVSx5QkFDOUJwQyxPQUFPa0MsV0FDUHhCO2dCQUdGLEtBQUt5QixrQkFBa0I7b0JBQ3JCO0FBQ0Y7Z0JBRUEsTUFBTUUsY0FBY2pDLFFBQVFrQyxZQUMxQjNDLGlCQUNBd0MsaUJBQWlCN0I7Z0JBR25CLEtBQUsrQixhQUFhO29CQUNoQjtBQUNGO2dCQUVBLE1BQU1OLGFBQ0ozQixRQUFRQyxZQUNOaEMsV0FBV08sZ0JBQ1h1RCxpQkFBaUI3QixVQUNkO2dCQUNQRixRQUFRRyxlQUNObEMsV0FBV08sZ0JBQ1gsS0FBSW1ELFlBQVlELGdCQUNoQkssaUJBQWlCN0I7QUFFckI7O0FBRUo7YUFFZ0JpQyxvQkFFZEMsT0FDQUM7UUFHQSxLQUFLRCxPQUFPO1lBQ1YsT0FBTyxFQUFDQSxPQUFvQkM7QUFDOUI7UUFDQSxJQUFJQSxhQUFhO1lBRWYsT0FBTyxFQUFDRCxPQUFtQkM7QUFDN0I7UUFDQSxNQUFNQyxlQUFlbEIsT0FBQUEsUUFBUWdCO1FBQzdCLE1BQU1yQixPQUFPdUIsZUFBZUYsTUFBTSxLQUFLQTtRQUV2QyxPQUFPLEVBQUNyQixNQUFrQnVCO0FBQzVCO0lDaE5PLE1BQU16QixjQUFlMEIsY0FDbkJBLFFBQVE7SUFFWCxTQUFVQyxjQUNkQztRQUVBLFdBQVdBLGFBQWEsWUFBWTtZQUNsQyxPQUFPRCxjQUFjQztBQUN2QjtRQUVBLElBQUl0QixNQUFNQyxRQUFRcUIsV0FBVztZQUMzQixPQUFPQTtBQUNUO1FBQ0EsV0FBV0EsYUFBYSxVQUFVO1lBQ2hDLE9BQU87QUFDVDtRQWFBLE1BQU1DLGdCQUFnQnBCLE9BQU9xQixPQUFPRixVQUNqQ0csT0FBUTFDLGdCQUFpQkEsVUFBVSxVQUNuQzJDLElBQUszQyxTQUFlQSxNQUFNNEM7UUFFN0IsT0FBT3hCLE9BQU95QixLQUFLTixVQUNoQkcsT0FBUS9DLFFBQVM2QyxjQUFjbEMsU0FBU1gsTUFDeENnRCxJQUFLaEQsT0FBUTRDLFNBQVM1QztBQUMzQjtJQUVNLFNBQVVtRCxZQUFZTDtRQUMxQixNQUFNTSxZQUFZTixPQUFPQyxPQUFPTSxPQUFBQSxVQUFVQyxTQUFTO1FBQ25ELE9BQU9GLFlBQVksV0FBVztBQUNoQztJQUVNLFNBQVU1Qyx3QkFDZFosU0FDQUMsVUFDQUMsbUJBQW1CO1FBRW5CLE9BQUEsQ0FBU0MsUUFBZ0JVO1lBQ3ZCLE1BQU1DLGFBQ0pQLFFBQVFDLFlBQVloQyxXQUFXVSw0QkFBNEJpQixXQUFXO1lBRXhFLE1BQU1DLE1BQU0sSUFBSVM7WUFDaEIsS0FBS0MsV0FBV0MsU0FBU1gsTUFBTTtnQkFDN0JHLFFBQVFHLGVBQ05sQyxXQUFXVSw0QkFDWCxLQUFJNEIsWUFBWSxJQUFJRCxpQkFDcEJWO0FBRUo7WUFDQSxNQUFNYSxtQkFBbUJULFFBQVFDLFlBQVlSLFNBQVNHLFFBQVFVO1lBQzlELElBQUlHLGtCQUFrQjtnQkFDcEIsTUFBTUMsY0FBY0MsT0FBQUEsT0FBT2pCLFVBQVVrQixPQUFBQSxPQUFPQztnQkFDNUMsTUFBTUMsaUJBQWlCbkIsbUJBQ25CO3VCQUNLYzt1QkFDQUM7b0JBRUw7dUJBQ0tBO3VCQUNBRDs7Z0JBR1RULFFBQVFHLGVBQWVWLFNBQVNxQixnQkFBZ0JsQixRQUFRVTtBQUMxRCxtQkFBTztnQkFDTCxNQUFNUyxPQUVKbkIsUUFBUW9CLGNBQWMxQiwyQkFBMkJnQixjQUFjUyxRQUMvRGYsUUFBUUMsWUFBWSxlQUFlTCxRQUFRVTtnQkFFN0NOLFFBQVFHLGVBQ05WLFNBQ0E7b0JBQ0VzQjtvQkFDQXFDLFVBQVU7dUJBQ1B6QyxjQUFPakIsVUFBVWtCLE9BQUFBLE9BQU9DO21CQUU3QmpCLFFBQ0FVO0FBRUo7QUFDRDtBQUNIO0lBd0JBLE1BQU0rQyxjQUNKQyxRQU1JQSxLQUFLbEMsV0FBVyxVQUFVa0MsUUFBUUEsS0FBS0MsU0FBU0M7SUFLaEQsU0FBVUMsWUFDZEMsVUFBOEI7UUFFOUIsT0FBT0MsMkJBQTJCRDtBQUNwQztJQUVNLFNBQVVDLDJCQUNkRCxVQUE4QixJQUM5Qi9ELG1CQUFtQjtRQUVuQixPQUFPb0IsTUFBTUssV0FBV2Usb0JBQ3RCdUIsUUFBUTNDLE1BQ1IyQyxRQUFRdEM7UUFFVnNDLFVBQVU7ZUFDTEE7WUFDSDNDO1lBQ0FLOztRQUdGLElBQUlpQyxZQUFZSyxVQUFVO1lBQ3hCQSxRQUFRM0MsT0FBTztZQUVmLE1BQU02QyxhQUFhcEIsY0FBY2tCLFFBQVFIO1lBQ3pDRyxRQUFRRyxRQUFRO2dCQUNkOUMsTUFBTWlDLFlBQVlZO2dCQUNsQkwsTUFBTUs7O21CQUdERixRQUFRSDtBQUNqQixlQUFPLElBQUksVUFBVUcsV0FBV0EsUUFBUUgsU0FBU0MsV0FBVztZQUMxRCxNQUFNSSxhQUFhcEIsY0FBY2tCLFFBQVFIO1lBRXpDRyxRQUFRSCxPQUFPSztZQUNmRixRQUFRM0MsT0FBT2lDLFlBQVlZO0FBQzdCO1FBRUEsSUFBSXpDLE1BQU1DLFFBQVFzQyxRQUFRM0MsT0FBTztZQUMvQjJDLFFBQVEzQyxPQUFPO1lBQ2YyQyxRQUFRRyxRQUFRO2dCQUNkOUMsTUFBTTtnQkFDTjhDLE9BQU87b0JBQ0w5QyxNQUFNMkMsUUFBUTNDLEtBQUs7OztBQUd6QjtRQUVBLE9BQU9WLHdCQUNMcEMsV0FBV1Msc0JBQ1hnRixTQUNBL0Q7QUFFSjthQ2hLZ0JtRSxzQkFDZEMsa0JBQ0FDLE1BQ0FDO1FBRUEsTUFBTUMsYUFHRjtZQUNGQyxLQUFLLEVBQUNDLGFBQUFBLGNBQWNDLE1BQU1DO1lBQzFCQyxNQUFNLEVBQUNILGFBQUFBLGNBQWNJLFFBQVFDO1lBQzdCQyxLQUFLLEVBQUNOLGFBQUFBLGNBQWNPLFFBQVFDO1lBQzVCQyxPQUFPLEVBQUNULGFBQUFBLGNBQWNPLFFBQVFHO1lBQzlCQyxRQUFRLEVBQUNYLGFBQUFBLGNBQWNXLFFBQVFDOztRQUdqQyxPQUFPQyxRQUFRQyx1QkFBdUJoQixXQUFXRjtRQUNqRCxNQUFNcEUsU0FBU3VGLG1CQUFtQm5CLE1BQU1DO1FBQ3hDLE9BQU9yRSxTQUNId0YsS0FBQUEsbUJBQXVCckIsa0JBQWtCbkUsT0FBT3lGLE1BQWF6RixPQUFPTSxTQUNsRW9GLFdBQUFBLE1BQU1DLFFBQUFBLHdCQUNORCxXQUFBQSxNQUFNSixvQkFBb0JqQixTQUM1Qm1CLEtBQUFBLG1CQUF1QnJCLGtCQUFrQmtCLFVBQ3ZDSyxXQUFBQSxNQUFNQyxRQUFBQSx3QkFDTkQsaUJBQU1KLG9CQUFvQmpCO0FBQ2xDO2FBU2dCdUIsMEJBQ2R6QixrQkFDQUMsTUFDQUM7UUFFQSxNQUFNQyxhQUdGO1lBQ0ZDLEtBQUssRUFBQ3NCLGFBQUFBLHNCQUFzQkMsVUFBVXBCO1lBQ3RDQyxNQUFNLEVBQUNrQixhQUFBQSxzQkFBc0JFLFlBQVlsQjtZQUN6Q0MsS0FBSyxFQUFDZSxhQUFBQSxzQkFBc0JHLFlBQVloQjtZQUN4Q0MsT0FBTyxFQUFDWSxhQUFBQSxzQkFBc0JHLFlBQVlkO1lBQzFDQyxRQUFRLEVBQUNVLGFBQUFBLHNCQUFzQkksWUFBWWI7O1FBRzdDLE9BQU9DLFFBQVFDLHVCQUF1QmhCLFdBQVdGO1FBQ2pELE1BQU1wRSxTQUFTcUUsT0FBT2tCLG1CQUFtQm5CLE1BQU1DLFFBQVFUO1FBQ3ZELE9BQU81RCxTQUNId0YsS0FBQUEsbUJBQXVCckIsa0JBQWtCbkUsT0FBT3lGLE1BQWF6RixPQUFPTSxTQUNsRW9GLFdBQUFBLE1BQU1DLFFBQUFBLHdCQUNORCxXQUFBQSxNQUFNSixvQkFBb0JqQixTQUM1Qm1CLHdCQUF1QnJCLGtCQUFrQixRQUFla0IsVUFDdERLLFdBQUFBLE1BQU1DLFFBQUFBLHdCQUNORCxpQkFBTUosb0JBQW9CakI7QUFDbEM7SUFDQSxTQUFTa0IsbUJBQ1BuQixNQUNBQztRQUlBLEtBQUtBLE1BQU0sT0FBT1Q7UUFFbEIsTUFBTXNDLGFBQWE3QixLQUFLOEIsUUFBUSxjQUFjO1FBQzlDLE1BQU1DLG1CQUEyQztZQUMvQyxlQUFlQyxLQUFBQSxzQkFBc0JDO1lBQ3JDLHlCQUF5QkQsS0FBQUEsc0JBQXNCRTtZQUMvQyxlQUFlRixLQUFBQSxzQkFBc0JHO1lBQ3JDLGVBQWVILEtBQUFBLHNCQUFzQkk7WUFDckMseUJBQXlCSixLQUFBQSxzQkFBc0JLO1lBQy9DLHNCQUFzQkwsS0FBQUEsc0JBQXNCTTtZQUM1QywyQkFBMkI7WUFDM0Isa0JBQWtCTixLQUFBQSxzQkFBc0JPO1lBQ3hDLGdCQUFnQlAsS0FBQUEsc0JBQXNCUTtZQUN0QyxnQkFBZ0JSLEtBQUFBLHNCQUFzQlM7WUFDdEMsZ0JBQWdCVCxLQUFBQSxzQkFBc0JVO1lBQ3RDLGdCQUFnQlYsS0FBQUEsc0JBQXNCVztZQUN0QyxxQkFBcUJYLEtBQUFBLHNCQUFzQlk7WUFDM0Msa0JBQWtCWixLQUFBQSxzQkFBc0JhOztRQUcxQyxJQUFJaEIsV0FBV2lCLFdBQVcsV0FBVztZQUNuQyxPQUFPO2dCQUFFMUIsTUFBTTtnQkFBU25GLE9BQU80RixXQUFXQyxRQUFRLFlBQVk7O0FBQ2hFO1FBRUEsTUFBTWlCLGlCQUFpQmhCLGlCQUFpQkY7UUFDeEMsSUFBSWtCLGdCQUFnQjtZQUNsQixPQUFPO2dCQUFFM0IsTUFBTTtnQkFBYW5GLE9BQU84Rzs7QUFDckM7UUFFQSxJQUFJaEQsU0FBUyxTQUFTOEIsZUFBZSxJQUFJO1lBQ3ZDLE9BQU87Z0JBQUVULE1BQU07Z0JBQVFuRixPQUFPa0UsYUFBQUEsY0FBY0M7O0FBQzlDO1FBRUEsT0FBT2I7QUFDVDtJQ25ITSxTQUFVeUQsbUJBQ2RDLFFBQTRCO1FBRTVCLE1BQU1DLGFBQWFELE1BQU1yRSxJQUFLdUUsS0FDNUJDLFFBQUFBLFNBQVk7WUFDVkMsTUFBTUYsRUFBRUU7WUFDUkMsYUFBYUgsRUFBRUcsZUFBZSxtQkFBbUJILEVBQUVFO1lBQ25EbEUsVUFBVWdFLEVBQUVoRSxZQUFZO1lBRXhCckMsTUFBTXFHLEVBQUVyRyxRQUFReUc7O1FBR3BCLE9BQU9DLE9BQUFBLG1CQUFtQk47QUFDNUI7SUNsQk8sTUFBTU8sWUFBWWxHLE9BQUFBLHFCQUN2QixDQUFDbUcsTUFBZUM7UUFDZCxNQUFNQyxVQUFVRCxJQUFJRSxlQUFlQztRQUNuQyxNQUFNQyxPQUFPSCxRQUFRRztRQUdyQixNQUFNQyxhQUFhTCxJQUFJTTtRQUV2QixNQUFNQyxjQUFlRixXQUFtQkc7UUFFeEMsS0FBS0QsYUFBYTtZQUNoQixNQUFNLElBQUlFLE9BQUFBLDZCQUNSLDRDQUE0Q0osV0FBV1g7QUFFM0Q7UUFFQSxLQUFLVSxNQUFNLE9BQU9BO1FBRWxCLElBQUk3RyxNQUFNQyxRQUFRNEcsT0FBTztZQUN2QixPQUFPQSxLQUFLbkYsSUFBS3lGLFFBQVMsSUFBSUgsWUFBWUc7QUFDNUM7UUFFQSxPQUFPLElBQUlILFlBQVlIOztJQ2xCM0IsTUFBTU8sZ0JBQWdCL0csT0FBQUEscUJBQ3BCLENBQUNnSCxPQUE2Qlo7UUFDNUIsTUFBTWEsTUFBTWIsSUFBSUUsZUFBZUM7UUFDL0IsTUFBTVcsV0FBWUQsS0FBS0UsVUFBVTtRQUNqQyxNQUFNQyxZQUFZSixTQUFTbEgsT0FBT3lCLEtBQUsyRjtRQUN2QyxNQUFNRyxVQUFVRCxVQUFVL0YsSUFBS2lHLEtBQU1KLFNBQVNJO1FBQzlDLE9BQU87WUFBRUMsS0FBS0w7WUFBVU0sZUFBZUg7WUFBU0ksYUFBYUw7OztJQVUzRCxTQUFVTSxZQUNkaEMsUUFBNEI7UUFFNUIsTUFBTXNCLFFBQVF0QixNQUFNckUsSUFBS3VFLEtBQU1BLEVBQUVFO1FBQ2pDLE9BQU9pQixjQUFjQztBQUN2QjtJQUVPLE1BQU1XLGFBQWEzSCxPQUFBQSxxQkFDeEIsQ0FBQzRILEdBQVl4QjtRQUNYLE1BQU1hLE1BQU1iLElBQUlFLGVBQWVDO1FBQy9CLE1BQU1zQixRQUFRWixJQUFJWSxTQUFTLENBQUE7UUFFM0IsTUFBTUMsU0FBYztlQUFLRDs7UUFHekIsSUFBSUMsT0FBT0MsVUFBVS9GLFdBQVc7WUFDOUIsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9DO1lBQ3hCLEtBQUtFLE9BQU9DLE1BQU1GLElBQUlGLE9BQU9DLFFBQVFDO0FBQ3ZDO1FBRUEsSUFBSUYsT0FBT0ssV0FBV25HLFdBQVc7WUFDL0IsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9LO1lBQ3hCLEtBQUtGLE9BQU9DLE1BQU1GLElBQUlGLE9BQU9LLFNBQVNIO0FBQ3hDO1FBR0EsSUFBSUYsT0FBT00sYUFBYXBHLFdBQVc7WUFDakMsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9NO1lBQ3hCTixPQUFPTSxXQUFXSCxPQUFPQyxNQUFNRixLQUFLRixPQUFPTSxXQUFXSjtBQUN4RDtRQUVBLE9BQU9GOztJQzFESixNQUFNTyx1QkFBdUI7SUFDN0IsTUFBTUMsbUJBQW1CO0lBQ3pCLE1BQU1DLHdCQUF3QjtJQUU5QixNQUFNQyxjQUFjO1VBQ2RDLGlCQUFpQkMsT0FBTztJQUM5QixNQUFNQyxlQUFlO0lBQ3JCLE1BQU1DLDBCQUEwQjtVQUUxQkMsb0JBQW9CSCxPQUFPO0lDUmxDLFNBQVVJLFVBQVVDO1FBQ3hCLE9BQU8sU0FBU0QsT0FBTzFLO1lBQ3JCNEssV0FBQUEsU0FBU0MsSUFDUDdLLFFBQ0F1SyxjQUNDSSxTQUFTcEgsU0FBU29ILFdBQVc7WUFFaEMsT0FBTzNLO0FBQ1Q7QUFDRjtJQ1FNLFNBQVU4SyxpQkFBaUJDO1FBQy9CLE9BQU8sU0FBU0MsMEJBQTBCaEw7WUFDeEM0SyxXQUFBQSxTQUFTQyxJQUFJN0ssUUFBUXdLLHlCQUF5Qk87WUFDOUMsT0FBTy9LO0FBQ1Q7QUFDRjtVQzFCYWlMLGVBQWVYLE9BQU87SUFDNUIsTUFBTVksZ0JBQWdCO0lBQ3RCLE1BQU1DLGdCQUFnQjtJQUN0QixNQUFNQyxxQkFBcUI7SUFDM0IsTUFBTUMsdUJBQXVCO0lDS3ZCQyxRQUFBQSxzQkFBTixNQUFNQSw0QkFHSEM7UUFJUixXQUFBbkssQ0FBNkJ5SDtZQUMzQjJDLE1BQ0U7Z0JBQ0VDLFdBQVl4RCxXQUFzQkEsU0FBaUJ5RCxXQUFXOUg7ZUFFaEVpRjtZQUwwQzhDLEtBQUE5QyxNQUFBQTtZQUg5QzhDLEtBQUFDLE9BQU9DLFVBQUtDLFNBQVNDO1lBVW5CSixLQUFLMUQsVUFBVVk7QUFDakI7UUFFQSxXQUFJNkM7WUFDRixPQUFPQyxLQUFLSyxlQUFlO0FBQzdCO1FBRUEsR0FBQUMsQ0FBSUM7WUFDRixJQUFJQztZQUNKO2dCQUNFQSxZQUFZUixLQUFLUyxJQUFJO0FBQ3ZCLGNBQUUsT0FBT0M7Z0JBQ1BGLFlBQVksQ0FBQTtBQUNkO1lBRUFSLEtBQUtXLFdBQVc7Z0JBQ2RILFdBQVd6SyxPQUFPQyxPQUFPd0ssV0FBV0Q7O0FBRXhDOztJQWhDV1osUUFBQUEsc0JBQW1CaUIsaUJBQUEsRUFEL0JDLE9BQUFBLFdBQVc7UUFBRUMsT0FBT0MsT0FBQUEsTUFBTUM7UUFRWkMsTUFBQUEsUUFBQSxHQUFBQyxjQUFPRixPQUFBQSxnRUFQVHJCO0lDbUJBd0IsUUFBQUEsa0JBQU4sTUFBTUE7UUFDWCxXQUFBMUwsQ0FDbUIyTCxXQUNFQyxnQkFDZ0NDO1lBRmxDdEIsS0FBQW9CLFlBQUFBO1lBQ0VwQixLQUFBcUIsaUJBQUFBO1lBQ2dDckIsS0FBQXNCLGNBQUFBO0FBQ2xEO1FBRUgsZUFBTUMsQ0FDSmxGLEtBQ0FtRjtZQUVBLE1BQU1DLE1BQU1DLFFBQUFBLFFBQVFDLElBQUkzQixNQUFhMkIsSUFBSTNCLEtBQUt1QjtZQUU5QyxNQUFNSyxXQUFXNUIsS0FBS29CLFVBQVVTLGtCQUEyQnJDLGVBQWUsRUFDeEVuRCxJQUFJeUYsY0FDSnpGLElBQUlNO1lBR04sTUFBTW9GLFlBQ0ovQixLQUFLb0IsVUFBVVgsSUFDYmxCLGVBQ0FsRCxJQUFJeUYsaUJBRU45QixLQUFLb0IsVUFBVVgsSUFBMEJsQixlQUFlbEQsSUFBSU07WUFFOUQsTUFBTXFGLGdCQUFnQmhDLEtBQUtvQixVQUFVUyxrQkFDbkNwQyxvQkFDQSxFQUFDcEQsSUFBSXlGLGNBQWN6RixJQUFJTTtZQUd6QixNQUFNc0YsaUJBQWlCakMsS0FBS29CLFVBQVVTLGtCQUNwQ25DLHNCQUNBLEVBQUNyRCxJQUFJeUYsY0FBY3pGLElBQUlNO1lBR3pCLE1BQU11RixpQkFBaUJELGlCQUFpQmhLLFlBQVk4SjtZQUVwRE4sSUFBSVUsUUFBUSxzQkFBc0JKLFlBQVksUUFBUUEsY0FBYztZQUVwRSxJQUFJSCxVQUFVO2dCQUNaSCxJQUFJVyxNQUFNO0FBQ1osbUJBQU8sSUFBSXBDLEtBQUtzQixhQUFhO3NCQUNyQnRCLEtBQUtzQixZQUFZZSxVQUNyQmhHLEtBQ0E2RixnQkFDQUYsZUFDQWhDLEtBQUtxQjtBQUVULG1CQUFPO2dCQUNMSSxJQUFJVyxNQUFNO0FBQ1o7a0JBS01wQyxLQUFLc0M7WUFFWCxNQUFNQyxPQUFPdkMsS0FBS3FCLGVBQWVoQixlQUFlO1lBQ2hELE1BQU1tQyxlQUFleEMsS0FBS3FCLGVBQWVoQixlQUN2QztZQUVGLElBQUlrQyxRQUFRQyxjQUFjO2dCQUN4QixNQUFNQyxhQUFhekMsS0FBS3FCLGVBQWVaLElBQUk7Z0JBQzNDLE1BQU1pQyxXQUFXRCxXQUFXZCxJQUFJO29CQUFFWTtvQkFBTUM7O2dCQUN4Q3hDLEtBQUtxQixlQUFlVixXQUFXO29CQUFFZ0MsUUFBUUQ7O0FBQzNDO1lBRUEsT0FBT2xCLEtBQUtvQjtBQUNkO1FBRVUsdUJBQU1OO1lBQ2QsTUFBTXRELFdBQVc2RCxLQUFBQSxRQUFRQztZQUN6QixLQUFLOUQsVUFBVTtZQUVmLEtBQUssTUFBTStELFdBQVcvRCxVQUFVO2dCQUM5QixNQUFNZ0UsY0FBY0gsS0FBQUEsUUFBUUksZUFDMUJGO2dCQUVGLEtBQUtDLGFBQWE7Z0JBQ2xCLE1BQU03QyxXQUFZNkMsWUFBb0JFLE9BQ2xDRixjQUNBLElBQUtBO2dCQUNULE1BQU1FLGFBQWEvQyxTQUFTK0MsS0FBS2xELEtBQUtxQjtnQkFDdEMsSUFBSTZCLE1BQU1sRCxLQUFLcUIsZUFBZVYsV0FBV3VDO0FBQzNDO0FBQ0Y7O0lBckZXL0IsUUFBQUEsa0JBQWVQLGlCQUFBLEVBRDNCQyxPQUFBQSxXQUFXO1FBQUVDLE9BQU9DLE9BQUFBLE1BQU1DO1FBS3RCQyxjQUFBLEdBQUFrQyxPQUFBQSxhQUFZbEMsTUFBQUEsUUFBQSxHQUFBQyxjQUFPNUIsd0RBRlE4RCxPQUFBQSxXQUNPekQsUUFBQUEscUJBQW1CNUosYUFIN0NvTDtJQ3JCUCxTQUFVa0MsS0FBS0M7UUFDbkIsTUFBTUMsV0FBV0QsZUFDTkEsVUFBVSxXQUNmQSxRQUNBQSxNQUFNdkgsT0FDUjlEO1FBQ0osTUFBTXVMLE9BQU8sRUFBQ0MsUUFBQUEsaUJBQWlCQyxPQUFBQSxnQkFBZ0J2QyxRQUFBQTtRQUMvQyxJQUFJb0MsVUFBVUMsS0FBS0csS0FBS0MsT0FBQUEsWUFBWXJFLGVBQWVnRTtRQUNuRCxPQUFPckgsT0FBQUEsbUJBQW1Cc0g7QUFDNUI7YUFFZ0JLO1FBQ2QsT0FBTzNILHVCQUFnQjBILE9BQUFBLFlBQVlwRSxlQUFlO0FBQ3BEO0lBRU0sU0FBVXNFLGdCQUFnQkM7UUFDOUIsT0FBTzdILE9BQUFBLGdCQUNMOEgsb0JBQVksV0FDWkosT0FBQUEsWUFBWW5FLG9CQUFvQnNFLFFBQ2hDTCx1QkFBZ0J2QyxRQUFBQTtBQUVwQjtJQ2ZNLFNBQVU4QyxvQkFDZHhMO1FBRUEsTUFBTUUsYUFBb0U7WUFDeEVDLEtBQUtHLE9BQUFBO1lBQ0xDLE1BQU1FLE9BQUFBO1lBQ05DLEtBQUtFLE9BQUFBO1lBQ0xDLE9BQU9DLE9BQUFBO1lBQ1BDLFFBQVFDLE9BQUFBOztRQUdWLE1BQU15SyxZQUFZdkwsV0FBV0Y7UUFFN0IsS0FBS3lMLFdBQVc7WUFDZCxNQUFNLElBQUlDLEtBQUFBLGlCQUNSLDBCQUEwQjFMO0FBRTlCO1FBRUEsT0FBT3lMO0FBQ1Q7SUNOQSxNQUFNRSxvQkFBcUJDLGFBQ2xCQSxVQUNKQyxNQUFNLEtBQ05qTixPQUFRd0UsS0FBTUEsRUFBRUwsV0FBVyxNQUMzQmxFLElBQUt1RSxLQUFNQSxFQUFFMEksTUFBTTtJQUd4QixNQUFNQyxlQUFnQnpJLFNBQVk7UUFDaENBO1FBQ0FDLGFBQWEsR0FBR0Q7UUFDaEJsRSxVQUFVO1FBQ1ZyQyxNQUFNeUc7O0lBR1IsU0FBU3dJLGFBQWFDLE9BQWdCQztRQUNwQyxJQUFJRCxpQkFBaUJFLGFBQUFBLFdBQVcsT0FBT0Y7UUFDdkMsT0FBTyxJQUFJRyxhQUFBQSxjQUNUSCxpQkFBaUJJLFFBQVEsR0FBR0gsb0JBQW9CRCxNQUFNSyxZQUFZSjtBQUV0RTtJQUVNLFNBQVVLLGlCQUNkQyxZQUNBWixXQUNBYSxVQUNBQyxxQkFBOEI7UUFFOUIsTUFBTUMsbUJBQW1CbkIsb0JBQW9CaUI7UUFDN0MsTUFBTUcsZ0JBQWdCakIsa0JBQWtCQyxXQUFXL00sSUFBSWtOO1FBRXZELE1BQU1jLHFCQUFxQjtRQUMzQixJQUFJSixhQUFhLFNBQVNDLG9CQUFvQjtZQUM1Q0csbUJBQW1CM0IsS0FDakI0QixpQkFBUztnQkFDUHhKLE1BQU07Z0JBQ05sRSxVQUFVO2dCQUNWRyxNQUFNd04sS0FBQUE7Z0JBQ054SixhQUFhO2dCQUVmdUosUUFBQUEsU0FBUztnQkFDUHhKLE1BQU07Z0JBQ05sRSxVQUFVO2dCQUNWbUUsYUFBYTtnQkFFZnVKLFFBQUFBLFNBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVm1FLGFBQWE7O0FBR25CO1FBRUEsT0FBTztZQUNMeUosUUFBUSxFQUNOTCxpQkFBaUJmLGVBQ2RnQixjQUFjL04sSUFBSW9PLHNCQUNsQkosb0JBQ0hLLHFCQUFhO2dCQUNYQyxTQUFTLHdDQUF3Q1g7Z0JBRW5EWSxzQkFBYztnQkFDWjdKLGFBQWE7Z0JBRWY4Siw2QkFBcUI7Z0JBQ25COUosYUFBYTs7WUFHakJvQixRQUFRLEVBQUNPLFlBQVkwSCxnQkFBZ0JVLE9BQUFBOztBQUV6QztJQUVNLFNBQVVDLG1CQUNkM1IsUUFDQTRRLFlBQ0ExUSxZQUNBcUg7UUFFQSxNQUFNcUssUUFBUTVSLFFBQVFrQyxhQUFhbEM7UUFDbkN1SCxXQUFXNkosT0FBT1MsUUFBU0MsS0FBTUEsRUFBRUYsT0FBT2hCLFlBQVkxUTtRQUN0RHFILFdBQVd3QixRQUFROEksUUFBUSxDQUFDQyxHQUFHQyxVQUFVRCxFQUFFRixPQUFPaEIsWUFBWW1CO0FBQ2hFO0lBRU0sU0FBVUMseUJBQ2RDLGFBQ0FyQixlQUNHc0I7UUFFSCxJQUFJRCx1QkFBdUJFLEtBQUFBLGNBQWM7WUFDdkMsY0FBZUYsWUFBb0JyQixnQkFBZ0IsYUFDOUNxQixZQUFvQnJCLGVBQWVzQixRQUNwQ0QsWUFBWUcsVUFBVXhCLGVBQWVzQjtBQUMzQztRQUVBLFdBQVlELFlBQW9CckIsZ0JBQWdCLFlBQzlDLE9BQVFxQixZQUFvQnJCLGVBQWVzQjtRQUU3QyxNQUFNLElBQUkxQixhQUFBQSxjQUNSLHVCQUF1QkksNEJBQTRCcUIsYUFBYTdRLGFBQWFzRztBQUVqRjtJQUVNLFNBQVUySyxtQkFBc0J6QjtRQUNwQyxPQUFPMEIsZUFFTEMsWUFDQUM7WUFFQSxNQUFNcEYsTUFBY3pCLEtBQUt5QixJQUFJRSxJQUFJc0Q7WUFFakM7Z0JBQ0V4RCxJQUFJVyxNQUNGLGdDQUFnQzZDLGlDQUFpQzZCLEtBQUtDLFVBQVVILFdBQVduSjtnQkFFN0YsT0FBTXVKLFdBQUVBLFdBQVNoSixPQUFFQSxPQUFLSSxRQUFFQSxVQUFXeUk7Z0JBQ3JDLGFBQWFSLHlCQUNYckcsS0FBS3NHLFlBQVl0RyxLQUFLM0QsTUFDdEI0SSxlQUNHMkIsV0FBV25KLGVBQ2R1SixXQUNBaEosT0FDQUk7QUFFSixjQUFFLE9BQU9zQztnQkFDUGUsSUFBSWlELE1BQU0saUJBQWlCTyxzQkFBc0J2RTtnQkFDakQsTUFBTStELGFBQWEvRCxHQUFHLGlCQUFpQnVFO0FBQ3pDO0FBQ0Y7QUFDRjthQUVnQmdDLGtCQUNkQyxpQkFDQWpDLFlBQ0FrQztRQUVBcFIsT0FBT3FSLGVBQ0xGLGdCQUFnQjNRLGFBQWEyUSxpQkFDN0JqQyxZQUNBO1lBQ0V0USxPQUFPd1M7WUFDUEUsVUFBVTs7UUFJZCxPQUFPdFIsT0FBT1UseUJBQ1p5USxnQkFBZ0IzUSxhQUFhMlEsaUJBQzdCakM7QUFFSjtJQ2pLTSxNQUFPcUMseUJBQXlCQyxPQUFBQTtRQUsxQixZQUFBQyxDQUFhdEs7WUFDckIsTUFBTXVLLFdBQVd2SyxJQUFJNkMsUUFBUTJILGVBQWVwRCxNQUFNLEtBQUs7WUFDdkQsT0FBT21EO0FBQ1Q7UUFFVSxlQUFBRSxDQUFnQnRMO1lBQ3hCLE1BQU1hLE1BQU1iLElBQUlFLGVBQWVDO1lBQy9CLE1BQU1pTCxXQUFXekgsS0FBS3dILGFBQWF0SztZQUNuQyxLQUFLdUssVUFBVSxNQUFNLElBQUlHLEtBQUFBLG1CQUFtQjtZQUM1QyxPQUFPO2dCQUFFckYsTUFBTWtGO2dCQUFVMUQsT0FBTyxFQUFDMEQ7O0FBQ25DOztJQVFJLE1BQU9JLDZCQUE2QlA7O0lDdkI3QlEsUUFBQUEsa0JBQWVDLG9CQUFyQixNQUFNRDtRQUNYLGNBQU9FLENBQ0w3UCxVQUFrQztZQUVsQyxNQUFNOFAsWUFBd0MsRUFDNUM5RyxRQUFBQTtZQUdGLElBQUloSixRQUFRZ1AsU0FBUztnQkFDbkJjLFVBQVV0RSxLQUFLeEwsUUFBUWdQO2dCQUN2QmMsVUFBVXRFLEtBQUs7b0JBQ2J1RSxTQUFTNUk7b0JBQ1Q2SSxVQUFVaFEsUUFBUWdQOztBQUV0QjtZQUVBLElBQUloUCxRQUFRaVEsUUFBUTtnQkFDakJILFVBQW9CdEUsS0FBSztvQkFDeEJ1RSxTQUFTRyxPQUFBQTtvQkFDVEMsYUFBYW5ILFFBQUFBOztBQUVqQjtZQUVBLE9BQU87Z0JBQ0xvSCxRQUFRUjtnQkFDUkssUUFBUWpRLFFBQVFpUSxVQUFVO2dCQUMxQkg7Z0JBQ0FPLFNBQVMsRUFBQ3JILFFBQUFBLGlCQUFpQjdCOztBQUUvQjs7SUE3Qld3SSxRQUFBQSxrQkFBZUMsb0JBQUFuSCxNQUFBQSxXQUFBLEVBRDNCNkgsT0FBQUEsT0FBTyxDQUFBLE1BQ0tYOztJQ3NDQVksUUFBQUEsdUJBQW9CQyx5QkFBMUIsTUFBTUQ7UUFDWCxXQUFBalQsQ0FDMkNtVCxVQUN4QkM7WUFEd0I3SSxLQUFBNEksV0FBQUE7WUFDeEI1SSxLQUFBNkksVUFBQUE7QUFDaEI7UUFFSCxVQUFNQyxDQUFLNUwsS0FBYzZMO1lBQ3ZCLE1BQU10SCxNQUFNQyxRQUFBQSxRQUFRQyxJQUFJZ0gsdUJBQXFCNU0sTUFBTTRGLElBQUkzQixLQUFLOEk7WUFDNURySCxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLNkksUUFBUTVJLGdCQUFnQkQsS0FBSzRJLFNBQVNoUiwrQkFBK0JzRixJQUFJdUksVUFBVXZJLElBQUk4TDtZQUV6RyxLQUFLLE1BQU03QixXQUFXbkgsS0FBSzRJLFVBQVU7c0JBQzdCekIsUUFBUXZFLE9BQU81QyxLQUFLNkksU0FBUzNMLEtBQUs2TDtBQUMxQztBQUNGOztJQWRXTCxRQUFBQSx1QkFBb0JDLHlCQUFBL0gsTUFBQUEsV0FBQSxFQURoQ0MsT0FBQUEsV0FBVztRQUFFQyxPQUFPQyxPQUFBQSxNQUFNQztRQUd0QkMsTUFBQUEsUUFBQSxHQUFBQyxjQUFPeEMsaUVBQ2tCaUIsa0NBSGpCK0k7SUN6Q0FPLFFBQUFBLDJCQUFOLE1BQU1BO1FBQ1gsV0FBQXhULENBQXNCNEc7WUFBQTJELEtBQUEzRCxNQUFBQTtBQUEyQjtRQUVqRCxTQUFBa0YsQ0FBVXNILFNBQTJCckg7WUFDbkMsSUFBSTBILFdBQVdMLFFBQVF0TSxlQUFlNE07WUFFdEMsT0FBTzNILEtBQUtvQixTQUFTd0csS0FFbkJDLEtBQUFBLElBQUtqTjtnQkFDSDhNLFdBQVdsSixLQUFLM0QsSUFBSWlOLFdBQVdKOztBQUdyQzs7SUFaV0QsUUFBQUEsMkJBQXdCckksaUJBQUEsRUFEcENDLDZEQUU0QmxCLGtDQURoQnNKO0lDSVAsTUFBZ0JNLHdCQUdaQyxPQUFBQTtRQUNSLFdBQUEvVCxDQUNxQmdVLGVBQ25CQztZQUVBN0osTUFBTTRKO1lBSGF6SixLQUFBeUosZ0JBQUFBO0FBSXJCOztJQUdJLE1BQWdCRSw2QkFHWko7UUFHUixXQUFBOVQsQ0FDOEJnVSxlQUM1QkM7WUFFQTdKLE1BQU00SixlQUFlQztZQUhPMUosS0FBQXlKLGdCQUFBQTtBQUk5QjtRQUlBLFdBQUFuRCxDQUFZaks7WUFDVixLQUFLMkQsS0FBSzRKLGNBQ1I7Z0JBQ0U1SixLQUFLNEosZUFBZUMsS0FBQUEsUUFBUXBKLElBQXFCVCxLQUFLbkQ7QUFDeEQsY0FBRTtnQkFDQTtvQkFDRW1ELEtBQUs0SixlQUFlcEQsS0FBQUEsYUFBYXNELFdBQy9COUosS0FBS25EO0FBRVQsa0JBQUU7b0JBQ0FtRCxLQUFLNEosZUFBZUcsS0FBQUEsV0FBV0MsU0FBU2hLLEtBQUtuRDtBQUMvQztBQUNGO1lBRUYsTUFBTW9OLFlBQVk1TixPQUFPMkQsS0FBS3lKO1lBQzlCLE1BQU1qSixZQUFZeUosVUFBVUM7WUFFNUIsT0FBTzdOLE1BQ0gyRCxLQUFLNEosd0JBQXdCRyxLQUFBQSxhQUMzQi9KLEtBQUs0SixhQUFhTyxTQUFTM0osYUFDM0JSLEtBQUs0SixhQUFhakksSUFBSW5CLGFBQ3hCUixLQUFLNEo7QUFDWDs7SUNuREYsTUFBTVEsV0FBVyxJQUFJQztJQThCZixTQUFVQyxPQUNkQyxJQUNBakgsT0FDQWtILFFBQStCLElBQUlDO1FBRW5DLEtBQUtDLEtBQUFBLHlCQUF5QnpWLFNBQVNzVixLQUFLO1lBQzFDLE9BQU9qSDtBQUNUO1FBRUEsTUFBTXFILFFBQVFDLFlBQVlMO1FBQzFCLE1BQU1NLFNBQVNGLE1BQU1sSyxJQUFJNkM7UUFDekIsSUFBSXVILFFBQVEsT0FBT0E7UUFFbkIsTUFBTUMsYUFBYSxFQUNqQmpTLGFBQUFBLGNBQWNPLFFBQ2RjLGFBQUFBLHNCQUFzQkcsYUFDdEJwRixTQUFTc1Y7UUFFWCxNQUFNUTtRQUNOSixNQUFNekwsSUFBSW9FLE9BQU95SDtRQUVqQmhWLE9BQU9xUixlQUFlMkQsWUFBWSxRQUFRO1lBQ3hDcFcsT0FBTyxHQUFHcVcsUUFBQUEsYUFBYTFILE1BQU12SCxRQUFRaVAsUUFBQUEsYUFBYVQ7O1FBR3BELE1BQU1VLFNBQVM7WUFDYjtnQkFDRSxPQUFPQyxvQkFBQUEsTUFBTUMsR0FBRzdIO0FBQ2xCLGNBQUU7Z0JBQ0EsT0FBT3JMO0FBQ1Q7QUFDRCxVQU5jO1FBUWYsTUFBTW1ULGtCQUFrQkgsU0FBU0Msb0JBQUFBLE1BQU1HLFFBQVEvSCxTQUFnQnJMO1FBQy9ELE1BQU1xVCxlQUFlTCxTQUNqQnhXLFFBQVFDLFlBQVksZUFBZTRPLE1BQU0vTSxXQUFXMFUsVUFDcERoVDtRQUNKLE1BQU1zVCxrQkFDSkQsaUJBQWlCcE4sVUFBVW9OLGlCQUFpQkU7UUFDOUMsTUFBTUMsa0JBQ0ZMLGlCQUFpQk0sY0FDbEJULFNBQ0dDLDBCQUFNUyxvQkFBb0JySSxPQUFjMkgsV0FDeENXLHFDQUFxQ3RJLE9BQU8ySCxXQUM1Q00sa0JBQ0E7UUFFTixNQUFNTSxXQUFXalcsTUFBTXNOLEtBQUssSUFBSXVILElBQUl4TCxXQUFBQSxTQUFTakssV0FBV3NPLFVBQVU7UUFDbEUsTUFBTXdJLFlBQVksSUFBSXJCLElBQWFTLG9CQUFBQSxNQUFNWSxVQUFVeEksVUFBdUI7UUFDMUUsTUFBTXlJLGNBQXdCO1FBRTlCLEtBQUssTUFBTUMsUUFBUUgsVUFBVTtZQUMzQixLQUFLRyxNQUFNO1lBQ1gsSUFBSUYsVUFBVUcsSUFBSUQsT0FBTztZQUV6QixJQUFJQSxTQUFTZixXQUFXSCxjQUFjVyxlQUFlO1lBQ3JELElBQUlPLFNBQVNmLFVBQVVXLHFDQUFxQ3RJLE9BQU8wSSxPQUNqRTtZQUVGRCxZQUFZcEksS0FBS3FJO0FBQ25CO1FBRUEsS0FBSyxNQUFNQSxRQUFRRCxhQUFhO1lBQzlCLE1BQU1HLGFBQWFDLCtCQUErQjdJLE9BQU8wSTtZQUN6RCxNQUFNSSxlQUFlRixhQUFhRyxvQkFBQUEsZUFBZUM7WUFDakQsTUFBTUMsV0FDSkMseUJBQXlCbEosT0FBTzBJLFNBQ2hDdlgsUUFBUUMsWUFBWSxlQUFlNE8sTUFBTS9NLFdBQVd5VjtZQUV0RCxNQUFNUyxhQUFnRDtnQkFDcEQ1VSxVQUFVdVU7O1lBRVosSUFBSUcsVUFBVUUsV0FBV2pYLE9BQU8rVztZQUVoQ3JVLFlBQVl1VSxXQUFadlUsQ0FBd0I2UyxXQUFXeFUsV0FBV3lWO1lBRTlDLE1BQU1VLGFBQ0pqWSxRQUFRQyxZQUFZLGVBQWU0TyxNQUFNL00sV0FBV3lWLFNBQVNPO1lBQy9ELFdBQVdHLGVBQWUsYUFBYTtnQkFDckNqWSxRQUFRRyxlQUNOLGVBQ0E4WCxZQUNBM0IsV0FBV3hVLFdBQ1h5VjtBQUVKO1lBRUFqVyxPQUFPcVIsZUFBZTJELFdBQVd4VSxXQUFXeVYsTUFBTTtnQkFDaERyWCxPQUFPc0Q7Z0JBQ1BvUCxVQUFVO2dCQUNWc0YsWUFBWTtnQkFDWkMsY0FBYzs7QUFFbEI7UUFFQSxLQUFLLE1BQU1DLFlBQVlmLFdBQVc7WUFDaEMsTUFBTWdCLGVBQWU3TixXQUFBQSxTQUFTNk0sVUFBVXhJLE9BQU91SjtZQUMvQyxLQUFLQyxjQUFjO2dCQUNqQixNQUFNLElBQUlqSSxhQUFBQSxjQUFjLHlCQUF5QmdJO0FBQ25EO1lBRUEsSUFBSUUsZUFDRkQsYUFBYWpRO1lBQ2YsV0FBV2tRLGlCQUFpQixlQUFlQSxhQUFhaFIsTUFBTTtnQkFDNURnUixlQUFnQkE7QUFDbEI7WUFDQSxLQUFLQSx1QkFBdUJBLGlCQUFpQixZQUFZO2dCQUN2RCxNQUFNLElBQUlsSSxhQUFBQSxjQUFjLHFCQUFxQmdJO0FBQy9DO1lBQ0EsS0FBSzNCLG9CQUFBQSxNQUFNekssSUFBSXNNLGFBQWFoUixPQUFPO2dCQUNqQztBQUNGO1lBRUEsTUFBTWlSLE9BQU8vTixXQUFBQSxTQUFTZ08sY0FBYzNKLE9BQU91SjtZQUMzQyxNQUFNaFgsWUFBYW1YLE9BQWVYLG9CQUFBQSxlQUFlYTtZQUNqRCxNQUFNZCxlQUFnQlksT0FBZVgsb0JBQUFBLGVBQWVDO1lBTXBELE1BQU1hLGFBQWEzQyxNQUFNeUIsSUFBSWM7WUFFN0IsSUFBSUksWUFBWTtnQkFDZCxNQUFNQyxhQUFhQyxpQkFBaUJOO2dCQUNwQ08saUJBQWlCdkMsWUFBWThCLFVBQVVPLFlBQVl2WCxTQUFTdVc7Z0JBQzVEO0FBQ0Y7WUFFQSxNQUFNbUIsY0FBY2pELE9BQU9DLElBQUl3QyxjQUFjLElBQUl0QyxJQUFJRCxPQUFPZ0QsSUFBSWxLO1lBRWhFLElBQUl3SCxZQUFZO2dCQUNkMkMsa0JBQ0UxQyxZQUNBOEIsVUFDQUUsY0FDQVEsYUFDQTFYLFNBQ0F1VztBQUVKLG1CQUFPO2dCQUNMc0IsWUFBWTNDLFlBQVk4QixVQUFVVSxhQUFhMVgsU0FBU3VXO0FBQzFEO0FBQ0Y7UUFFQSxPQUFPckI7QUFDVDtJQUVBLFNBQVMyQyxZQUNQQyxVQUNBZCxVQUNBVSxhQUNBMVgsU0FDQXVXO1FBRUEsTUFBTUssYUFBZ0Q7WUFDcERqWCxNQUFNK1g7WUFDTjFWLFVBQVV1VTtZQUNWdlc7O1FBRUZxQyxZQUFZdVUsV0FBWnZVLENBQXdCeVYsU0FBU3BYLFdBQVdzVztRQUM1Q3BZLFFBQVFHLGVBQ04sZUFDQWlCLFVBQVVELFFBQVEyWCxhQUNsQkksU0FBU3BYLFdBQ1RzVztRQUVGOVcsT0FBT3FSLGVBQWV1RyxTQUFTcFgsV0FBV3NXLFVBQVU7WUFDbERsWSxPQUFPc0Q7WUFDUG9QLFVBQVU7WUFDVnNGLFlBQVk7WUFDWkMsY0FBYzs7QUFFbEI7SUFNQSxTQUFTVSxpQkFDUEssVUFDQWQsVUFDQU8sWUFDQXZYLFNBQ0F1VztRQUVBLE1BQU1LLGFBQWdENVcsVUFDakQ7WUFBRUwsTUFBTTtZQUFTOEMsT0FBTztnQkFBRTlDLE1BQU00WDs7WUFBY3ZWLFVBQVV1VTtZQUN4RDtZQUFFNVcsTUFBTTRYLGVBQWUsWUFBWWxQLFNBQVNqQztZQUFRcEUsVUFBVXVVOztRQUNuRWxVLFlBQVl1VSxXQUFadlUsQ0FBd0J5VixTQUFTcFgsV0FBV3NXO1FBQzVDcFksUUFBUUcsZUFDTixlQUNBaUIsVUFBVUQsUUFBU3dYLGVBQWUsWUFBWWxQLFNBQVNqQyxRQUN2RDBSLFNBQVNwWCxXQUNUc1c7UUFFRjlXLE9BQU9xUixlQUFldUcsU0FBU3BYLFdBQVdzVyxVQUFVO1lBQ2xEbFksT0FBT3NEO1lBQ1BvUCxVQUFVO1lBQ1ZzRixZQUFZO1lBQ1pDLGNBQWM7O0FBRWxCO0lBRUEsU0FBU2Esa0JBQ1BFLFVBQ0FkLFVBQ0FFLGNBQ0FRLGFBQ0ExWCxTQUNBdVc7UUFFQSxNQUFNd0IsY0FDSm5aLFFBQVFDLFlBQVloQyxXQUFXYyxrQkFBa0JtYSxhQUFhO1FBQ2hFLEtBQUtDLFlBQVkzWSxTQUFTc1ksY0FBYztZQUN0QzlZLFFBQVFHLGVBQ05sQyxXQUFXYyxrQkFDWCxLQUFJb2EsYUFBYUwsZUFDakJJO0FBRUo7UUFFQSxNQUFNRSxTQUFTLHdCQUF3Qk4sWUFBWXhSO1FBQ25ELE1BQU1xUixhQUFhQyxpQkFBaUJOO1FBQ3BDLE1BQU1lLGFBQWEsRUFBQztZQUFFQyxNQUFNRjtXQUFVO1lBQUVyWSxNQUFNNFg7O1FBRTlDLE1BQU1YLGFBQWdENVcsVUFDakQ7WUFBRUwsTUFBTTtZQUFTcUMsVUFBVXVVO1lBQVk0QixPQUFPRjtZQUM5QztZQUFFdFksTUFBTU87WUFBUThCLFVBQVV1VTtZQUFZNEIsT0FBT0Y7O1FBRWxENVYsWUFBWXVVLFdBQVp2VSxDQUF3QnlWLFNBQVNwWCxXQUFXc1c7UUFDNUNwWSxRQUFRRyxlQUNOLGVBQ0FpQixVQUFVRCxRQUFRRyxRQUNsQjRYLFNBQVNwWCxXQUNUc1c7UUFFRjlXLE9BQU9xUixlQUFldUcsU0FBU3BYLFdBQVdzVyxVQUFVO1lBQ2xEbFksT0FBT3NEO1lBQ1BvUCxVQUFVO1lBQ1ZzRixZQUFZO1lBQ1pDLGNBQWM7O0FBRWxCO0lBRUEsU0FBU1MsaUJBQWlCTjtRQUN4QjtZQUNFLE1BQU0zQixrQkFBa0JGLG9CQUFBQSxNQUFNRyxRQUFRMEI7WUFDdEMsTUFBTWtCLFNBQVM3QyxpQkFBaUI1VjtZQUNoQyxJQUFJeVksV0FBVy9QLFVBQVUrUCxXQUFXekMsUUFBUSxPQUFPO1lBQ25ELE9BQU87QUFDVCxVQUFFO1lBQ0EsT0FBTztBQUNUO0FBQ0Y7SUFFQSxTQUFTSSxxQ0FDUHRJLE9BQ0EwSTtRQUVBLElBQUlrQyxVQUFlNUs7UUFDbkIsT0FBTzRLLFdBQVdBLFlBQVluWSxVQUFVbVksWUFBWUMsVUFBVTtZQUM1RCxJQUFJakQsMEJBQU1RLFVBQVV3QyxTQUFTbEMsT0FBYyxPQUFPO1lBQ2xEa0MsVUFBVW5ZLE9BQU9xWSxlQUFlRjtBQUNsQztRQUNBLE9BQU87QUFDVDtJQUVBLFNBQVMvQiwrQkFDUDdJLE9BQ0EwSTtRQUVBLElBQUlrQyxVQUFlNUs7UUFDbkIsT0FBTzRLLFdBQVdBLFlBQVluWSxVQUFVbVksWUFBWUMsVUFBVTtZQUM1RCxNQUFNakMsYUFBYWpOLFdBQUFBLFNBQVNnTyxjQUFjaUIsU0FBU2xDO1lBQ25ELElBQUlFLFlBQVksT0FBT0E7WUFDdkJnQyxVQUFVblksT0FBT3FZLGVBQWVGO0FBQ2xDO1FBQ0EsT0FBT2pXO0FBQ1Q7SUFFQSxTQUFTdVUseUJBQXlCbEosT0FBeUIwSTtRQUN6RCxJQUFJa0MsVUFBZTVLO1FBQ25CLE9BQU80SyxXQUFXQSxZQUFZblksVUFBVW1ZLFlBQVlDLFVBQVU7WUFDNUQsTUFBTTNZLE9BQU95SixXQUFBQSxTQUFTekosS0FBSzBZLFNBQVNsQztZQUNwQyxJQUFJeFcsTUFBTSxPQUFPQTtZQUNqQjBZLFVBQVVuWSxPQUFPcVksZUFBZUY7QUFDbEM7UUFDQSxPQUFPalc7QUFDVDtJQUVBLFNBQVMyUyxZQUNQTDtRQUVBLEtBQUtILFNBQVM2QixJQUFJMUIsS0FBSztZQUNyQkgsU0FBU2xMLElBQUlxTCxJQUFJLElBQUk4RDtBQUN2QjtRQUNBLE9BQU9qRSxTQUFTM0osSUFBSThKO0FBQ3RCO0lDaFZDMUgsS0FBQUEsUUFBZ0JJLGlCQUFpQixTQUFTcUwsZUFFekNDO1FBQ0EsTUFBTUMsZUFDR0QsWUFBWSxXQUFXQSxVQUFXQSxRQUFRQztRQUNuRCxPQUFPdlAsV0FBQUEsU0FBUyxZQUFZTixPQUFPZ0QsSUFBSSxpQkFBaUI2TTtBQUMxRCxNQUFFQyxLQUFLNUwsS0FBQUE7SUFFTkEsS0FBQUEsUUFBZ0JDLHNCQUFzQixTQUFTNEw7UUFHOUMsTUFBTTFCLE9BQU8vTixXQUFBQSxTQUFTLFlBQVlOLE9BQU9nRCxJQUFJO1FBQzdDLEtBQUtxTCxNQUFNLE9BQU8vVTtRQUNsQixPQUFPbEMsT0FBT3lCLEtBQUt3VjtBQUNyQixNQUFFeUIsS0FBSzVMLEtBQUFBO0lBRU44TCxLQUFBQSxRQUFnQnBZLFVBQVUrUyxhQUFhLFNBQVNBLFdBRWhDUDtRQUNmLE1BQU02RixVQUFVNU8sS0FBSzRPO1FBQ3JCLElBQUlBLFNBQVM3RixJQUFJOEYsT0FBTyxrQkFBa0IvSCxLQUFLQyxVQUFVNkg7UUFDekQsT0FBTzdGO0FBQ1Q7SUNkQSxNQUFNeFMsWUFBWXVZLG9CQUFBQSxhQUFhdlk7SUFJL0IsS0FBS0EsVUFBVXdZLGVBQWU7UUFDNUJ4WSxVQUFVd1ksZ0JBQWdCLFNBQVU3SztZQUNsQyxLQUFNbEUsS0FBYWdQLGtCQUFrQjtnQkFDbENoUCxLQUFhZ1AsbUJBQW1CO0FBQ25DO1lBQ0NoUCxLQUFhZ1AsaUJBQWlCckwsS0FBS087WUFDcEMsT0FBT2xFO0FBQ1Q7QUFDRjtJQUVBekosVUFBVThNLE9BQU8sU0FBVUM7UUFDekIsT0FBT3RELEtBQUsrTyxjQUFjMUwsS0FBS0M7QUFDakM7SUFFQSxLQUFNL00sVUFBa0IwWSw0QkFBNEI7UUFDbEQsTUFBTUMsZ0JBQWdCM1ksVUFBVTRZO1FBQ2hDNVksVUFBVTRZLFFBQVE7WUFDaEIsSUFBSUMsU0FBU0YsY0FBY0csS0FBS3JQO1lBQ2hDLE1BQU1wRSxhQUFjb0UsS0FBYWdQO1lBQ2pDLElBQUlwVCxZQUFZaEUsUUFBUTtnQkFDdEIsS0FBSyxNQUFNc00sYUFBYXRJLFlBQVk7b0JBQ2xDLE1BQU0wVCxZQUFZcEwsVUFBVWtMO29CQUM1QixJQUFJRSxXQUFXO3dCQUNiRixTQUFTRTtBQUNYO0FBQ0Y7QUFDRjtZQUNBLE9BQU9GO0FBQ1Q7UUFDQzdZLFVBQWtCMFksNkJBQTZCO0FBQ2xEOztVQ2tCYU07O1lBQ2F2UCxLQUFBeUIsTUFBTUMsUUFBQUEsUUFBUUMsSUFBSTROLG9CQUFvQnhUO0FBQU07UUFFNUQsbUJBQU8wSSxDQUNiQyxPQUNBQztZQUVBLElBQUlELGlCQUFpQkUsYUFBQUEsV0FBVyxPQUFPRjtZQUN2QyxPQUFPLElBQUlHLGFBQUFBLGNBQ1RILGlCQUFpQkksUUFDYixHQUFHSCxvQkFBb0JELE1BQU1LLFlBQzdCSjtBQUVSO1FBRUEscUJBQU82SyxDQUNMQztZQUVBO2dCQUNFLE9BQU81RixLQUFBQSxRQUFRcEosSUFBcUJnUDtBQUN0QyxjQUFFLE9BQU8vTztnQkFDUDtvQkFDRSxPQUFPOEYsS0FBQUEsYUFBYXNELFdBQVcyRjtBQUNqQyxrQkFBRSxPQUFPQztvQkFDUCxPQUFPM0YsS0FBQUEsV0FBV0MsU0FBU3lGO0FBQzdCO0FBQ0Y7QUFDRjtRQUVBLHNDQUFPRSxDQUNMckosYUFDQXNKLFNBQWlCQyxLQUFBQSxnQkFBZ0JDO1lBRWpDLE1BQU1DLE9BQ0p6Six1QkFBdUJFLEtBQUFBLGVBQWVGLFlBQVl5SixPQUFPeko7WUFDM0QsTUFBTTBKLGVBQ0ovUSxXQUFBQSxTQUFTd0IsSUFDUHNQLEtBQUt0YSxhQUNMd0osV0FBQUEsU0FBUzNLLElBQUl1YixLQUFBQSxnQkFBZ0JDLFdBQzFCLENBQUE7WUFFUCxNQUFNRyxlQUNKaFIsb0JBQVN3QixJQUNQNkYsWUFBWTdRLGFBQ1p3SixXQUFBQSxTQUFTM0ssSUFBSW1LLGlCQUNWLENBQUE7WUFFUCxNQUFNeVIsd0JBQXdCdkc7Z0JBQzVCLFNBQWE7b0JBQ1gsTUFBTSxJQUFJOUUsYUFBQUEsY0FBYztBQUMxQjtnQkFDQSxXQUFBcFAsQ0FBWWdVLGVBQW9DMU47b0JBQzlDOEQsTUFBTTRKLGVBQWUxTjtBQUN2Qjs7WUFHRixLQUFLLE9BQU9rSixZQUFZN0gsV0FBV3JILE9BQU9vYSxRQUFRRixlQUFlO2dCQUMvRCxNQUFNNUwsWUFBWSxFQUFDakgsT0FBTzFFLEtBQUs4QixRQUFRLGNBQWMsTUFDbERuRCxPQUFRK1ksV0FBb0JBLFdBQVdBLFFBQVFDLFFBQy9DQyxLQUFLO2dCQUVSLE1BQU1uSixVQUFVb0ksb0JBQW9CZ0IsMEJBQ2xDdEw7Z0JBRUZzSyxvQkFBb0JpQixhQUFhTixpQkFBaUJqTCxZQUFZa0M7Z0JBRTlELE1BQU1zSixnQkFBZ0J4TSxvQkFBb0I3RyxPQUFPc1QsV0FBM0J6TSxDQUNwQkksYUFBYXBNO2dCQUVmLE1BQU0yRCxhQUFhMlQsb0JBQW9Cb0IsbUJBQ3JDMUwsWUFDQVosV0FDQWpILE9BQU9zVDtnQkFFVG5CLG9CQUFvQnJULGdCQUFnQmdVLGlCQUFpQmpMLFlBQVksRUFDL0R3TCxrQkFDRzdVO0FBRVA7WUFFQSxLQUFLLE9BQU9xSixZQUFZMkwsY0FBYzdhLE9BQU9vYSxRQUFRSCxlQUFlO2dCQUNsRSxNQUFNYSxTQUFTRCxVQUFVQyxVQUFVO2dCQUNuQyxNQUFNeE0sWUFBWSxFQUFDdUwsUUFBUTNLLGVBQWU0TCxPQUFPdlosSUFBS3daLEtBQU0sSUFBSUEsT0FDN0R6WixPQUFRK1ksV0FBWUEsV0FBV0EsUUFBUUMsUUFDdkNDLEtBQUs7Z0JBRVIsTUFBTW5KLFVBQVVvSSxvQkFBb0JnQiwwQkFDbEN0TDtnQkFFRnNLLG9CQUFvQmlCLGFBQWFOLGlCQUFpQmpMLFlBQVlrQztnQkFFOUQsTUFBTXNKLGdCQUFnQnhNLG9CQUFvQixNQUFwQkEsQ0FDcEJJLGFBQWFwTTtnQkFFZixNQUFNMkQsYUFBYTJULG9CQUFvQm9CLG1CQUNyQzFMLFlBQ0FaLFdBQ0EsT0FDQTtnQkFFRmtMLG9CQUFvQnJULGdCQUFnQmdVLGlCQUFpQmpMLFlBQVksRUFDL0R3TCxrQkFDRzdVO0FBRVA7WUFFQSxPQUFPc1U7QUFDVDtRQUVPLGFBQUFhLENBQ0xuVSxhQUNBb1UsdUJBQ0FDO1lBRUEsTUFBTXhQLE1BQU04TixvQkFBb0I5TixJQUFJRSxJQUFJNE4sb0JBQW9Cd0I7WUFDNUQsTUFBTUcsWUFBWWhHLG9CQUFBQSxNQUFNZ0csVUFBVXRVO1lBQ2xDLE1BQU15SCxZQUFZOE0sUUFBQUEsWUFBWUQ7WUFDOUIsTUFBTUUsaUJBQWlCeFUsWUFBWWI7WUFDbkMsTUFBTXVLLGNBQWNpSixvQkFBb0JDLGVBQWU1UztZQUt2RCxNQUFNeVUscUJBQ0ovSyx1QkFBdUJFLEtBQUFBLGVBQWVGLFlBQVl5SixPQUFPeko7WUFFM0QsTUFBTWdMLGtCQUFrQnJTLFdBQUFBLFNBQVN3QixJQUMvQjdELGFBQ0FxQyxvQkFBUzNLLElBQUl1SztZQUVmLE1BQU0wUyxpQkFBaUJQLHdCQUF3QnBVLFlBQVliO1lBQzNELE1BQU15VixlQUE2QzttQkFDN0NQLGtCQUFrQixDQUFBO21CQUNsQkssbUJBQW1CLENBQUE7bUJBQ25CQyxrQkFBa0IsQ0FBQTs7WUFHeEIsTUFBTUUsb0JBQW9CQyxPQUFBQSx1QkFBdUJYLE9BQy9DblUsYUFDQXlVLG9CQUNBRztZQUVGLE1BQU1HLGdCQUFpQkYsa0JBQTBCRztZQUlqRCxPQUFNQyxPQUNKQSxPQUFLQyxlQUNMQSxlQUNBcFosTUFBTXFaLFVBQ0p4QyxvQkFBb0J5Qyw0QkFBNEJwVjtZQUVwRDZFLElBQUlXLE1BQ0Ysa0NBQWtDZ1AsdUJBQXVCTyxlQUFlL1osVUFBVTtZQUdwRixNQUFNcWEsYUFBcUNULGFBQWFVO1lBRXhELFNBQVNDLGVBQWU5ZDtnQkFDdEIsSUFBSTRkLFlBQVlHLFFBQVE7b0JBQ3RCdk8sU0FBU3hQO0FBQ1gsdUJBQU8sSUFBSTRkLFlBQVlsTyxPQUFPbk0sUUFBUTtvQkFDcENrTSxnQkFBZ0JtTyxXQUFXbE8sTUFBM0JELENBQWtDelA7QUFDcEMsdUJBQU87b0JBQ0xnUCxLQUFLekcsWUFBTHlHLENBQWtCaFA7QUFDcEI7Z0JBQ0EsSUFBSTRkLFlBQVloUSxnQkFBZ0I7b0JBQzlCMkIsT0FBQUEsWUFBWWxFLHNCQUFzQixLQUFsQ2tFLENBQXdDdlA7QUFDMUM7QUFDRjtZQUVBLElBR01nZSx5QkFBc0JDLDJCQUg1QixNQUdNRCwrQkFBK0IxSTtnQkFHekIsZ0JBQVc7b0JBQ25CLE9BQU8vTTtBQUNUO2dCQUVBLFNBQWE7b0JBQ1gsT0FBT0E7QUFDVDtnQkFFQSxXQUFBbkgsQ0FBWWdVO29CQUNWNUosTUFBTTRKLGVBQWU2SSx5QkFBdUJ2VztvQkFYN0JpRSxLQUFBbUwsS0FBYUQsMEJBQU1DLEdBQUd2TztvQkFZckM2RSxJQUFJOFEsS0FDRiw2Q0FBNkN2UyxLQUFLbkQsTUFBTWQsZ0JBQWdCc0k7QUFFNUU7O1lBaEJJZ08seUJBQXNCQywyQkFBQTFSLGlCQUFBLEVBSDNCNFIsT0FBQUEsV0FBV25PLFlBQ1hvTyxRQUFBQSxRQUFRckIsaUJBQ1JzQixRQUFBQSxlQUFlOVYsc0RBWWErQyxrQ0FYdkIwUztZQW1CTkYsZUFBZUU7WUFFZixJQUFJVixlQUFlO2dCQUNqQixNQUFNZ0IsZUFBZSxLQUFJaEIsZ0JBQWVpQixLQUFLLENBQUNDLEdBQUdDO29CQUMvQyxNQUFNQyxZQUFZRixFQUFFbmEsS0FBSzRMLE1BQU0sS0FBS2pOLE9BQU8yYjtvQkFDM0MsTUFBTUMsWUFBWUgsRUFBRXBhLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFPMmI7b0JBQzNDLE1BQU1FLGNBQWNILFVBQVUxYixPQUFROGIsS0FBTUEsRUFBRTNYLFdBQVcsTUFBTTVEO29CQUMvRCxNQUFNd2IsY0FBY0gsVUFBVTViLE9BQVE4YixLQUFNQSxFQUFFM1gsV0FBVyxNQUFNNUQ7b0JBQy9ELE1BQU15YixnQkFBZ0JOLFVBQVVuYixTQUFTc2I7b0JBQ3pDLE1BQU1JLGdCQUFnQkwsVUFBVXJiLFNBQVN3YjtvQkFDekMsSUFBSUMsa0JBQWtCQyxlQUNwQixPQUFPQSxnQkFBZ0JEO29CQUN6QixJQUFJSCxnQkFBZ0JFLGFBQWEsT0FBT0YsY0FBY0U7b0JBQ3RELE9BQU87O2dCQUdULEtBQUssTUFBTUcsU0FBU1osY0FBYztvQkFDaEMsTUFBTTFOLGFBQ0pzTyxNQUFNQyxnQkFBZ0J6WCxRQUFRd1gsTUFBTTlOLE9BQU9nTztvQkFDN0MsTUFBTUMsZUFBZW5FLG9CQUFvQm9FLFdBQ3ZDMU8sWUFDQXNPLE9BQ0F4QixRQUNBRCxlQUNBRCxPQUNBalYsYUFDQXdVO29CQUVGLEtBQUtzQyxjQUFjO29CQUVuQixPQUNFek8sWUFBWTJPLHNCQUFvQnpNLFNBQ2hDQSxTQUFPdkwsWUFDUEEsWUFBVWlZLGlCQUNWQSxtQkFDRUg7b0JBRUosTUFBTW5mLGFBQWFnYixvQkFBb0JpQixhQUNyQzZCLHdCQUNBdUIsc0JBQ0F6TTtvQkFHRixJQUFJNVMsWUFBWTt3QkFDZCxNQUFNa2MsZ0JBQWdCeE0sb0JBQW9Cc1AsTUFBTTlOLE9BQTFCeEIsQ0FDcEJzUCxNQUFNN2EsS0FBSzhCLFFBQVEsY0FBYyxPQUFPdkM7d0JBRTFDc1gsb0JBQW9CclQsZ0JBQ2xCbVcsd0JBQ0F1QixzQkFDQSxFQUFDbkQsa0JBQWtCN1UsY0FDbkJpWTtBQUVKO0FBQ0Y7QUFDRjtZQUVBLE9BQU94QjtBQUNUO1FBRUEsa0NBQU9MLENBQ0x2QztZQU9BLE1BQU10RSxLQUFLRCxvQkFBQUEsTUFBTUMsR0FBR3NFO1lBQ3BCLE1BQU1xRSxXQUFXN1Usb0JBQVN3QixJQUN4QmdQLFlBQ0F4USxvQkFBUzNLLElBQUl5ZixhQUFBQSxPQUFPQyxVQUFVN0k7WUFFaEMsTUFBTThJLGVBQWVILFVBQVV2TixRQUFRO1lBRXZDLE1BQU0yTixhQUNKdGUsTUFBTUMsUUFBUW9lLGlCQUFpQkEsYUFBYXJjLFNBQVMsSUFDakRoQyxNQUFNc04sS0FBSyxJQUFJdUgsSUFBSSxLQUFJd0osbUJBQ3ZCcmUsTUFBTXNOLEtBQUssSUFBSXVILElBQUksRUFBQ1U7WUFFMUIsTUFBTW5QLGNBQWNpRCxXQUFBQSxTQUFTakQsWUFBWXlULGVBQWU7WUFDeEQsTUFBTS9XLE9BQU8sSUFBSXdiLFdBQVc1RCxLQUFLO1lBQ2pDLE1BQU13QixnQkFBb0NvQyxXQUFXNWMsSUFBS2hELFFBQ2pEO2dCQUNMeUgsTUFBTXpIO2dCQUNOMEgsYUFBYWlELFdBQUFBLFNBQVNqRCxZQUFZeVQsWUFBWW5iO2dCQUM5Q3VELFVBQVU7Z0JBQ1ZyQyxNQUFNeUc7O1lBSVYsT0FBTztnQkFDTHZEO2dCQUNBc0Q7Z0JBQ0E4VjtnQkFDQUQsT0FBTyxJQUFJelUsV0FDVDBXLFVBQVVLLFlBQVkvVyxPQUFPa1QsS0FBS3dELFNBQVNLLGFBQWEvVyxPQUFPa1QsS0FBSzs7QUFFMUU7UUFFUSwyQkFBTzhELENBQ2IxYjtZQUVBLElBQUkyYixhQUFhO1lBQ2pCLE9BQU8zYixLQUNKNEwsTUFBTSxLQUNOak4sT0FBTzJiLFNBQ1BzQixRQUFTbEU7Z0JBQ1IsSUFBSUEsUUFBUTVVLFdBQVcsTUFBTTtvQkFDM0IsT0FBTyxFQUNMO3dCQUFFMEksV0FBV3FRLE9BQUFBLE1BQU1uRSxRQUFRN0wsTUFBTTt3QkFBWTZCLE9BQU9pTzs7QUFFeEQ7Z0JBQ0EsSUFBSWpFLFFBQVE1VSxXQUFXLE1BQU07b0JBQzNCLE9BQU8sRUFDTDt3QkFBRTBJLFdBQVdxUSxPQUFBQSxNQUFNbkUsUUFBUTdMLE1BQU07d0JBQVk2QixPQUFPaU87O0FBRXhEO2dCQUNBLE9BQU87O0FBRWI7UUFFUSxtQkFBTzdELENBQ2JuYyxRQUNBNFEsWUFDQWtDO1lBRUFwUixPQUFPcVIsZUFBZS9TLE9BQU9rQyxhQUFhbEMsUUFBUTRRLFlBQVk7Z0JBQzVEdFEsT0FBT3dTO2dCQUNQRSxVQUFVO2dCQUNWdUYsY0FBYztnQkFDZEQsWUFBWTs7WUFHZCxPQUFPNVcsT0FBT1UseUJBQ1pwQyxPQUFPa0MsYUFBYWxDLFFBQ3BCNFE7QUFFSjtRQUVRLHNCQUFPL0ksQ0FDYjdILFFBQ0E0USxZQUNBdVAsa0JBQ0FYLGtCQUdLO1lBRUwsTUFBTTVOLFFBQVE1UixRQUFRa0MsYUFBYWxDO1lBQ25DLE1BQU1FLGFBQWF3QixPQUFPVSx5QkFBeUJ3UCxPQUFPaEI7WUFDMUR1UCxpQkFBaUJ0TyxRQUFTQyxLQUFNQSxFQUFFRixPQUFPaEIsWUFBWTFRO1lBQ3JEc2YsZ0JBQWdCM04sUUFBUSxFQUFHaEMsc0JBQVdrQyxrQkFDcENsQyxVQUFVK0IsT0FBT2hCLFlBQVltQjtBQUVqQztRQUVRLGlCQUFPdU4sQ0FDYjFPLFlBQ0FzTyxPQUNBeEIsUUFDQUQsZUFDQUQsT0FDQWpWLGFBQ0F3VTtZQVlBLE9BQU0zTCxRQUFFQSxRQUFNL00sTUFBRUEsUUFBUzZhO1lBQ3pCLE1BQU1rQixpQkFBaUIvYixLQUFLOEIsUUFBUSxjQUFjO1lBQ2xELE1BQU0yTSxVQUFVb00sTUFBTUM7WUFFdEIsSUFBSS9OLFdBQVcsVUFBVWdQLG1CQUFtQixJQUFJO2dCQUM5QyxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLFVBQ0F2TixTQUNBb0ksb0JBQW9Cb0YsdUJBQXVCL1gsYUFBYXdVLGlCQUN4RCxFQUNFO29CQUFFbE4sV0FBVy9IO29CQUFvQmlLLE9BQU87bUJBQ3hDO29CQUFFbEMsV0FBVzBRLE9BQUFBLFNBQVM7d0JBQUVDLGFBQWE7O29CQUFnQnpPLE9BQU87O0FBR2xFO1lBRUEsSUFBSVgsV0FBVyxVQUFVZ1AsbUJBQW1CLFFBQVE7Z0JBQ2xELE9BQU9sRixvQkFBb0JtRixtQkFDekIsYUFDQXZOLFNBQ0FvSSxvQkFBb0J1RixxQkFBcUJsWSxhQUFhd1UsaUJBQ3RELEVBQ0U7b0JBQUVsTixXQUFXL0g7b0JBQW9CaUssT0FBTzttQkFDeEM7b0JBQUVsQyxXQUFXMFEsT0FBQUEsU0FBUzt3QkFBRUMsYUFBYTs7b0JBQWdCek8sT0FBTzs7QUFHbEU7WUFFQSxJQUFJWCxXQUFXLFNBQVNnUCxtQkFBbUIsUUFBUTtnQkFDakQsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixXQUNBdk4sU0FDQW9JLG9CQUFvQndGLG1CQUFtQm5ZLGFBQWF3VSxpQkFDcEQsRUFBQztvQkFBRWxOLFdBQVc2QixhQUFNO29CQUFlSyxPQUFPOztBQUU5QztZQUVBLElBQUlYLFdBQVcsU0FBU2dQLG1CQUFtQixRQUFRO2dCQUNqRCxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F2TixTQUNBb0ksb0JBQW9CeUYscUJBQ2xCcFksYUFDQXdVLGdCQUNBVSxnQkFFRixFQUNFO29CQUFFNU4sV0FBVy9IO29CQUFvQmlLLE9BQU87bUJBQ3hDO29CQUFFbEMsV0FBVzBRLE9BQUFBLFNBQVM7d0JBQUVDLGFBQWE7O29CQUFnQnpPLE9BQU87O0FBR2xFO1lBRUEsSUFBSVgsV0FBVyxZQUFZZ1AsbUJBQW1CLFFBQVE7Z0JBQ3BELE9BQU9sRixvQkFBb0JtRixtQkFDekIsYUFDQXZOLFNBQ0FvSSxvQkFBb0IwRixxQkFDbEJyWSxhQUNBd1UsZ0JBQ0FVLGdCQUVGLEVBQ0U7b0JBQUU1TixXQUFXNkIsT0FBQUEsTUFBTTtvQkFBZUssT0FBTzttQkFDekM7b0JBQUVsQyxXQUFXMFEsT0FBQUEsU0FBUzt3QkFBRUMsYUFBYTs7b0JBQWdCek8sT0FBTzs7QUFHbEU7WUFFQSxJQUFJWCxXQUFXLFNBQVNnUCxtQkFBbUIxQyxRQUFRO2dCQUNqRCxPQUFPeEMsb0JBQW9CbUYsbUJBQ3pCLFFBQ0F2TixTQUNBb0ksb0JBQW9CMkYsZUFDbEJ0WSxhQUNBd1UsZ0JBQ0FVLGVBQ0FDLFNBRUZ4QyxvQkFBb0I2RSxxQkFBcUJLO0FBRTdDO1lBRUEsSUFBSWhQLFdBQVcsU0FBU2dQLG1CQUFtQjFDLFFBQVE7Z0JBQ2pELE1BQU1vRCxjQUNKNUYsb0JBQW9CNkUscUJBQXFCSztnQkFDM0MsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixVQUNBdk4sU0FDQW9JLG9CQUFvQjZGLGlCQUNsQnhZLGFBQ0F3VSxnQkFDQVUsZUFDQUMsU0FFRixFQUNFO29CQUFFN04sV0FBVy9IO29CQUFvQmlLLE9BQU87c0JBQ3JDK08sWUFBWTdkLElBQUksRUFBRzRNLHNCQUFXa0MsbUJBQU87b0JBQ3RDbEM7b0JBQ0FrQyxPQUFPQSxRQUFROztBQUl2QjtZQUVBLElBQUlYLFdBQVcsWUFBWWdQLG1CQUFtQjFDLFFBQVE7Z0JBQ3BELE1BQU1vRCxjQUNKNUYsb0JBQW9CNkUscUJBQXFCSztnQkFDM0MsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixVQUNBdk4sU0FDQW9JLG9CQUFvQjhGLGlCQUNsQnpZLGFBQ0F3VSxnQkFDQVUsZUFDQUMsU0FFRm9EO0FBRUo7WUFHQSxNQUFNRyxtQkFBbUJiLGVBQWVuUSxNQUFNLEtBQUtqTixPQUFPMmI7WUFDMUQsTUFBTXVDLGNBQ0pELGlCQUFpQjFkLFNBQVMsS0FDMUIwZCxpQkFBaUJFLE1BQU9yQyxLQUFNQSxFQUFFM1gsV0FBVztZQUM3QyxJQUFJK1osZUFBZWQsbUJBQW1CMUMsUUFBUTtnQkFDNUMsTUFBTTBELG1CQUFtQkgsaUJBQ3RCaGUsSUFBSzZiLEtBQU1BLEVBQUU1TyxNQUFNLElBQ25Cak4sSUFBS3lFLFNBQUk7b0JBQ1JBO29CQUNBQyxhQUFhLEdBQUdEO29CQUNoQmxFLFVBQVU7b0JBQ1ZyQyxNQUFNeUc7O2dCQUVWLE1BQU15WixTQUFTSixpQkFBaUJoZSxJQUFLNmIsS0FBTUEsRUFBRTVPLE1BQU0sSUFBSStMLEtBQUs7Z0JBQzVELE1BQU02RSxjQUNKNUYsb0JBQW9CNkUscUJBQXFCSztnQkFDM0MsSUFBSWhQLFdBQVcsT0FBTztvQkFDcEIsT0FBTzhKLG9CQUFvQm1GLG1CQUN6QixTQUFTZ0IsVUFDVHZPLFNBQ0FvSSxvQkFBb0IyRixlQUNsQnRZLGFBQ0F3VSxnQkFDQXFFLGtCQUNBaEIsaUJBRUZVO0FBRUo7Z0JBQ0EsSUFBSTFQLFdBQVcsT0FBTztvQkFDcEIsT0FBTzhKLG9CQUFvQm1GLG1CQUN6QixXQUFXZ0IsVUFDWHZPLFNBQ0FvSSxvQkFBb0I2RixpQkFDbEJ4WSxhQUNBd1UsZ0JBQ0FxRSxrQkFDQWhCLGlCQUVGLEVBQ0U7d0JBQUV2USxXQUFXL0g7d0JBQW9CaUssT0FBTzswQkFDckMrTyxZQUFZN2QsSUFBSSxFQUFHNE0sc0JBQVdrQyxtQkFBTzt3QkFDdENsQzt3QkFDQWtDLE9BQU9BLFFBQVE7O0FBSXZCO2dCQUNBLElBQUlYLFdBQVcsVUFBVTtvQkFDdkIsT0FBTzhKLG9CQUFvQm1GLG1CQUN6QixXQUFXZ0IsVUFDWHZPLFNBQ0FvSSxvQkFBb0I4RixpQkFDbEJ6WSxhQUNBd1UsZ0JBQ0FxRSxrQkFDQWhCLGlCQUVGVTtBQUVKO0FBQ0Y7WUFFQSxJQUFJMVAsV0FBVyxTQUFTZ1AsbUJBQW1CLDJCQUEyQjtnQkFDcEUsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixhQUNBdk4sU0FDQW9JLG9CQUFvQm9HLG9CQUFvQi9ZLGFBQWF3VSxpQkFDckQsRUFDRTtvQkFBRWxOLFdBQVdxUSxPQUFBQSxNQUFNO29CQUFrQm5PLE9BQU87bUJBQzVDO29CQUFFbEMsV0FBV3FRLE9BQUFBLE1BQU07b0JBQWdCbk8sT0FBTzttQkFDMUM7b0JBQUVsQyxXQUFXdEc7b0JBQXFCd0ksT0FBTzs7QUFHL0M7WUFFQSxJQUFJWCxXQUFXLFNBQVNnUCxtQkFBbUIseUJBQXlCO2dCQUNsRSxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F2TixTQUNBb0ksb0JBQW9CcUcsNEJBQ2xCaFosYUFDQXdVLGdCQUNBcUQsZ0JBQ0EvWixLQUFBQSxzQkFBc0JLLGNBRXhCd1Usb0JBQW9Cc0csd0JBQXdCcEI7QUFFaEQ7WUFFQSxNQUFNcUIsa0JBQTBDO2dCQUM5QyxlQUFlcGIsS0FBQUEsc0JBQXNCQztnQkFDckMseUJBQXlCRCxLQUFBQSxzQkFBc0JFO2dCQUMvQyxlQUFlRixLQUFBQSxzQkFBc0JHO2dCQUNyQyxlQUFlSCxLQUFBQSxzQkFBc0JJO2dCQUNyQyx5QkFBeUJKLEtBQUFBLHNCQUFzQks7Z0JBQy9DLHNCQUFzQkwsS0FBQUEsc0JBQXNCTTtnQkFDNUMsa0JBQWtCTixLQUFBQSxzQkFBc0JPO2dCQUN4QyxnQkFBZ0JQLEtBQUFBLHNCQUFzQlE7Z0JBQ3RDLGdCQUFnQlIsS0FBQUEsc0JBQXNCUztnQkFDdEMsZ0JBQWdCVCxLQUFBQSxzQkFBc0JVO2dCQUN0QyxnQkFBZ0JWLEtBQUFBLHNCQUFzQlc7Z0JBQ3RDLHFCQUFxQlgsS0FBQUEsc0JBQXNCWTtnQkFDM0Msa0JBQWtCWixLQUFBQSxzQkFBc0JhOztZQUcxQyxNQUFNd2EsZUFBZUQsZ0JBQWdCckI7WUFDckMsSUFBSXNCLGdCQUFnQnRRLFdBQVcsT0FBTztnQkFDcEMsT0FBTzhKLG9CQUFvQm1GLG1CQUN6Qm5GLG9CQUFvQnlHLG9CQUFvQnZCLGlCQUN4Q3ROLFNBQ0FvSSxvQkFBb0JxRyw0QkFDbEJoWixhQUNBd1UsZ0JBQ0FxRCxnQkFDQXNCLGVBRUZ4RyxvQkFBb0JzRyx3QkFBd0JwQjtBQUVoRDtZQUVBLElBQUloUCxXQUFXLFNBQVNnUCxlQUFlalosV0FBVyxXQUFXO2dCQUMzRCxNQUFNeWEsY0FBY3hCLGVBQWVqYSxRQUFRLFlBQVksSUFBSThKLE1BQU0sS0FBSztnQkFDdEUsT0FBT2lMLG9CQUFvQm1GLG1CQUN6QnVCLGFBQ0E5TyxTQUNBb0ksb0JBQW9Cb0IsbUJBQ2xCc0YsYUFDQXhCLGdCQUNBLE9BQ0EsT0FFRmxGLG9CQUFvQjJHLG1CQUFtQnpCO0FBRTNDO1lBRUEsTUFBTTBCLGVBQWUxQixlQUFlblEsTUFBTSxLQUFLak4sT0FBTzJiO1lBQ3RELE1BQU1vRCxnQkFBZ0IsSUFBSTNMLElBQVksRUFDcEMsVUFDQSxVQUNBLGtCQUNBLGFBQ0EsY0FDQSxRQUNBLFFBQ0EsV0FDQSxTQUNBLFNBQ0EsU0FDQSxTQUNBLGNBQ0EsV0FDQSxhQUNBLFFBQ0E7WUFFRixJQUNFMEwsYUFBYXZlLFNBQVMsTUFDckI2YyxlQUFlalosV0FBVyxjQUMxQmlaLGVBQWVqWixXQUFXLGtCQUMxQjRhLGNBQWNuSyxJQUFJa0ssYUFBYSxLQUNoQztnQkFDQSxNQUFNOVEsZ0JBQWdCOFEsYUFDbkI5ZSxPQUFROGIsS0FBTUEsRUFBRTNYLFdBQVcsTUFDM0JsRSxJQUFLNmIsS0FBTUEsRUFBRTVPLE1BQU0sSUFDbkJqTixJQUFLeUUsU0FBSTtvQkFDUkE7b0JBQ0FDLGFBQWEsR0FBR0Q7b0JBQ2hCbEUsVUFBVTtvQkFDVnJDLE1BQU15Rzs7Z0JBR1YsT0FBT3NULG9CQUFvQm1GLG1CQUN6QnpQLFlBQ0FrQyxTQUNBLEtBQ0s5QixjQUFjL04sSUFBS3VFLEtBQU02SixRQUFBQSxTQUFTN0osS0FDckM4SixRQUFBQSxhQUFhO29CQUFFQyxTQUFTLDJCQUEyQlg7b0JBQ25EWSxzQkFBYztvQkFBRTdKLGFBQWE7b0JBQzdCOEosNkJBQXFCO29CQUNuQjlKLGFBQWE7c0JBR2pCdVQsb0JBQW9CNkUscUJBQXFCSztBQUU3QztZQUVBLE9BQU94YztBQUNUO1FBRVEseUJBQU95YyxDQUNielAsWUFDQWtDLFNBQ0F2TCxZQUNBaVk7WUFFQSxPQUFPO2dCQUFFNU87Z0JBQVlrQztnQkFBU3ZMO2dCQUFZaVk7O0FBQzVDO1FBRVEsMEJBQU9tQyxDQUFvQnRkO1lBQ2pDLE1BQU0yZCxlQUFlM2QsS0FBSzRMLE1BQU0sS0FBSztZQUNyQyxPQUFPK1I7QUFDVDtRQUVRLDhCQUFPUixDQUNibmQ7WUFFQSxNQUFNNGQsV0FBVzVkLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFROGIsS0FBTUEsRUFBRTNYLFdBQVc7WUFDNUQsTUFBTTRCLFNBQWtFO1lBQ3hFa1osU0FBU3BRLFFBQVEsQ0FBQ3FRLEtBQUtDO2dCQUNyQixNQUFNemEsT0FBT3dhLElBQUkvYixRQUFRLEtBQUs7Z0JBQzlCNEMsT0FBT3VHLEtBQUs7b0JBQUVPLFdBQVdxUSxPQUFBQSxNQUFNeFk7b0JBQWNxSyxPQUFPb1E7OztZQUV0RCxJQUNFOWQsS0FBSzhDLFdBQVcsY0FDaEI5QyxLQUFLOEMsV0FBVyxrQkFDaEI5QyxLQUFLOEMsV0FBVyxZQUNoQjlDLEtBQUs4QyxXQUFXLFVBQ2hCO2dCQUNBNEIsT0FBT3VHLEtBQUs7b0JBQUVPLFdBQVd0RztvQkFBcUJ3SSxPQUFPa1EsU0FBUzFlOztBQUNoRTtZQUNBLE9BQU93RjtBQUNUO1FBRVEseUJBQU84WSxDQUNieGQ7WUFFQSxNQUFNNGQsV0FBVzVkLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFROGIsS0FBTUEsRUFBRTNYLFdBQVc7WUFDNUQsTUFBTTRCLFNBQWtFO1lBQ3hFa1osU0FBU3BRLFFBQVEsQ0FBQ3FRLEtBQUtDO2dCQUNyQixNQUFNemEsT0FBT3dhLElBQUkvYixRQUFRLEtBQUs7Z0JBQzlCNEMsT0FBT3VHLEtBQUs7b0JBQUVPLFdBQVdxUSxPQUFBQSxNQUFNeFk7b0JBQWNxSyxPQUFPb1E7OztZQUV0RCxJQUFJOWQsS0FBSzhDLFdBQVcsV0FBVztnQkFDN0I0QixPQUFPdUcsS0FBSztvQkFBRU8sV0FBV3RHO29CQUFxQndJLE9BQU9rUSxTQUFTMWU7O0FBQ2hFO1lBQ0EsT0FBT3dGO0FBQ1Q7UUFFUSxnQ0FBT21ULENBQTBCdEw7WUFDdkMsT0FBTzBCLGVBQWU4UCxnQkFFakJsUTtnQkFFSCxNQUFNOUUsTUFBV3pCLEtBQUt5QixLQUFLRSxNQUFNOFU7Z0JBQ2pDO29CQUNFLElBQUloVixLQUFLQSxJQUFJVyxNQUFNLDBCQUEwQjZDO29CQUM3QyxPQUFNNUksS0FBRUEsY0FBZTJELEtBQUswVyxPQUFPLElBQUl6UixZQUFZLE9BQU90RCxJQUN4RDhVO29CQUVGLE1BQU1uUSxjQUFjdEcsS0FBS3NHLFlBQVlqSztvQkFDckMsTUFBTXNhLGFBQWFwSCxvQkFBb0JxSCxtQkFBbUJyUTtvQkFDMUQsSUFDRUQsYUFBYXlKLGVBQ056SixZQUFZeUosS0FBSzlLLGdCQUFnQixZQUN4Qzt3QkFDQSxPQUFPcUIsWUFBWXlKLEtBQUs5SyxlQUFlMFI7QUFDekM7b0JBQ0EsV0FBV3JRLFlBQVlyQixnQkFBZ0IsWUFBWTt3QkFDakQsT0FBT3FCLFlBQVlyQixlQUFlMFI7QUFDcEM7b0JBQ0EsSUFBSXJRLGFBQWF4SSxnQkFBZ0J3SSxZQUFZeEksVUFBVSxZQUFZO3dCQUNqRSxPQUFPd0ksWUFBWXhJLE1BQU1tSCxlQUFlMFI7QUFDMUM7b0JBQ0EsV0FBV3JRLFlBQVlHLGNBQWMsWUFBWTt3QkFDL0MsT0FBT0gsWUFBWUcsVUFBVXhCLGVBQWUwUixZQUFZdGE7QUFDMUQ7b0JBQ0EsTUFBTSxJQUFJd0ksYUFBQUEsY0FDUix1QkFBdUJJLDRCQUE0QnFCLGFBQWE3USxhQUFhc0c7QUFFakYsa0JBQUUsT0FBTzJFO29CQUNQLElBQUllLEtBQUtBLElBQUlpRCxNQUFNLGlCQUFpQk8sc0JBQXNCdkU7b0JBQzFELE1BQU02TyxvQkFBb0I5SyxhQUN4Qi9ELEdBQ0EsaUJBQWlCdUU7QUFFckI7QUFDRjtBQUNGO1FBRVEsdUJBQU80UixDQUFpQnRRO1lBQzlCLElBQUlBLEtBQUszTyxXQUFXLEdBQUcsT0FBTzJPO1lBQzlCLE1BQU11USxPQUFPdlEsS0FBS0EsS0FBSzNPLFNBQVM7WUFDaEMsSUFBSWtmLGVBQWVBLFNBQVMsYUFBYWxoQixNQUFNQyxRQUFRaWhCLE9BQU87Z0JBQzVELE1BQU1DLFdBQVd4USxLQUFLeVE7Z0JBQ3RCLE1BQU1DLGVBQWVGLFNBQVMvUCxjQUFjL087Z0JBQzVDLE1BQU1pZixXQUFXSCxTQUFTL1ksVUFBVS9GO2dCQUNwQyxNQUFNa2YsWUFBWUosU0FBUzNZLFdBQVduRztnQkFDdEMsS0FBS2dmLGlCQUFpQkMsYUFBYUMsV0FBVyxPQUFPNVE7Z0JBQ3JELE1BQU02USxTQUFnQjtnQkFDdEIsSUFBSUgsY0FBY0csT0FBT3pULEtBQUtvVCxTQUFTL1AsaUJBQ2xDLElBQUlrUSxZQUFZQyxXQUFXQyxPQUFPelQsS0FBSzFMO2dCQUM1QyxJQUFJaWYsVUFBVUUsT0FBT3pULEtBQUtvVCxTQUFTL1k7Z0JBQ25DLElBQUltWixXQUFXQyxPQUFPelQsS0FBS29ULFNBQVMzWTtnQkFDcEMsT0FBTyxLQUFJbUksU0FBUzZRO0FBQ3RCO1lBQ0EsT0FBTzdRO0FBQ1Q7UUFFUSx5QkFBT3FRLENBQW1CclE7WUFDaEMsTUFBTWhNLGFBQWFnVixvQkFBb0JzSCxpQkFBaUJ0UTtZQUN4RCxJQUFJaE0sV0FBVzNDLFdBQVcsR0FBRyxPQUFPMkM7WUFFcEMsTUFBTXVjLE9BQU92YyxXQUFXQSxXQUFXM0MsU0FBUztZQUM1QyxLQUFLa2YsZUFBZUEsU0FBUyxZQUFZbGhCLE1BQU1DLFFBQVFpaEIsT0FBTztnQkFDNUQsT0FBT3ZjO0FBQ1Q7WUFFQSxNQUFNd2MsV0FBV0Q7WUFDakIsTUFBTU8saUJBQ0pOLFNBQVMvUCxjQUFjL08sYUFDdkI4ZSxTQUFTL1ksVUFBVS9GLGFBQ25COGUsU0FBUzNZLFdBQVduRyxhQUNwQjhlLFNBQVMxWSxhQUFhcEc7WUFFeEIsS0FBS29mLGdCQUFnQjtnQkFDbkI5YyxXQUFXeWM7Z0JBQ1gsT0FBT3pjO0FBQ1Q7WUFFQUEsV0FBV3ljO1lBQ1gsSUFBSUQsU0FBUy9QLGNBQWMvTyxXQUFXc0MsV0FBV29KLEtBQUtvVCxTQUFTL1A7WUFDL0QsSUFBSStQLFNBQVMvWSxVQUFVL0YsV0FBV3NDLFdBQVdvSixLQUFLb1QsU0FBUy9ZO1lBQzNELElBQUkrWSxTQUFTM1ksV0FBV25HLFdBQVdzQyxXQUFXb0osS0FBS29ULFNBQVMzWTtZQUM1RCxJQUFJMlksU0FBUzFZLGFBQWFwRyxXQUFXc0MsV0FBV29KLEtBQUtvVCxTQUFTMVk7WUFDOUQsT0FBTzlEO0FBQ1Q7UUFFUSw2QkFBT29hLENBQ2IvWCxhQUNBd1U7WUFFQSxPQUFPLEVBQ0w3WSxzQkFBc0JxRSxhQUFhLFNBQ25DK0ksUUFBQUEsYUFBYTtnQkFBRUMsU0FBUyxnQkFBZ0J3TDtnQkFDeENrRyxnQkFBUTtnQkFDTnRiLGFBQWEsZUFBZW9WO2dCQUM1QjViLE1BQU04VSxPQUFPelIsMkJBQWNJLFFBQVEyRDtnQkFFckMyYSwyQkFBbUI7Z0JBQ2pCdmIsYUFBYSxHQUFHb1Y7Z0JBQ2hCb0csUUFBUTtvQkFBRXpKLE1BQU0wSixRQUFBQSxjQUFjN2E7O2dCQUVoQzhhLDhCQUFzQjtnQkFBRTFiLGFBQWE7Z0JBQ3JDMmIsdUNBQStCO2dCQUM3QjNiLGFBQWE7O0FBR25CO1FBRVEsMkJBQU84WSxDQUNibFksYUFDQXdVO1lBRUEsT0FBTyxFQUNMN1ksc0JBQXNCcUUsYUFBYSxRQUFRLFNBQzNDK0ksUUFBQUEsYUFBYTtnQkFBRUMsU0FBUyxnQkFBZ0J3TDtnQkFDeENrRyxnQkFBUTtnQkFDTnRiLGFBQWEsZUFBZW9WO2dCQUM1Qm9HLFFBQVE7b0JBQ05oaUIsTUFBTTtvQkFDTjhDLE9BQU87d0JBQUV5VixNQUFNMEosUUFBQUEsY0FBYzdhOzs7Z0JBR2pDMmEsMkJBQW1CO2dCQUNqQnZiLGFBQWEsR0FBR29WO2dCQUNoQm9HLFFBQVE7b0JBQ05oaUIsTUFBTTtvQkFDTjhDLE9BQU87d0JBQUV5VixNQUFNMEosUUFBQUEsY0FBYzdhOzs7Z0JBR2pDOGEsOEJBQXNCO2dCQUFFMWIsYUFBYTtnQkFDckMyYix1Q0FBK0I7Z0JBQzdCM2IsYUFBYTs7QUFHbkI7UUFFUSx5QkFBTytZLENBQ2JuWSxhQUNBd1U7WUFFQSxPQUFPLEVBQ0w3WSxzQkFBc0JxRSxhQUFhLE9BQU8sU0FDMUMrSSxRQUFBQSxhQUFhO2dCQUFFQyxTQUFTLFlBQVl3TDtnQkFDcEM3TCxRQUFBQSxTQUFTO2dCQUFFeEosTUFBTTtnQkFBT2xFLFVBQVU7Z0JBQU1yQyxNQUFNO2dCQUM5Q3FRLHNCQUFjO2dCQUNaN0osYUFBYSxHQUFHb1Y7Z0JBQ2hCb0csUUFBUTtvQkFDTmhpQixNQUFNO29CQUNOOEMsT0FBTzt3QkFBRXlWLE1BQU0wSixRQUFBQSxjQUFjN2E7OztnQkFHakNnYiw0QkFBb0I7Z0JBQ2xCNWIsYUFBYSxNQUFNb1Y7O0FBR3pCO1FBRVEsMkJBQU80RCxDQUNicFksYUFDQXdVLGdCQUNBVTtZQUVBLE9BQU8sRUFDTHZaLHNCQUFzQnFFLGFBQWEsT0FBTyxTQUMxQ2xCLG1CQUFtQm9XLGdCQUNuQm5NLHFCQUFhO2dCQUNYQyxTQUFTLG9CQUFvQndMO2dCQUUvQmtHLGdCQUFRO2dCQUNOdGIsYUFBYSw2Q0FBNkNvVjtnQkFDMURvRyxRQUFRO29CQUNOaGlCLE1BQU07b0JBQ051WSxNQUFNMEosUUFBQUEsY0FBY25OLE9BQU96UixhQUFBQSxjQUFjTyxRQUFRd0Q7O2dCQUdyRGlKLHNCQUFjO2dCQUNaN0osYUFBYSxHQUFHb1Y7Z0JBQ2hCb0csUUFBUTtvQkFDTmhpQixNQUFNO29CQUNOOEMsT0FBTzt3QkFBRXlWLE1BQU0wSixRQUFBQSxjQUFjN2E7OztnQkFHakNnYiw0QkFBb0I7Z0JBQ2xCNWIsYUFBYSxNQUFNb1Y7Z0JBRXJCc0csOEJBQXNCO2dCQUFFMWIsYUFBYTs7QUFFekM7UUFFUSwyQkFBT2laLENBQ2JyWSxhQUNBd1UsZ0JBQ0FVO1lBRUEsT0FBTyxFQUNMdlosc0JBQXNCcUUsYUFBYSxVQUFVLFNBQzdDbEIsbUJBQW1Cb1csZ0JBQ25Cbk0sUUFBQUEsYUFBYTtnQkFBRUMsU0FBUyxVQUFVd0w7Z0JBQ2xDN0wsUUFBQUEsU0FBUztnQkFBRXhKLE1BQU07Z0JBQU9sRSxVQUFVO2dCQUFNckMsTUFBTTtnQkFDOUNxUSxzQkFBYztnQkFDWjdKLGFBQWEsR0FBR29WO2dCQUNoQm9HLFFBQVE7b0JBQ05oaUIsTUFBTTtvQkFDTjhDLE9BQU87d0JBQUV5VixNQUFNMEosUUFBQUEsY0FBYzdhOzs7Z0JBR2pDZ2IsNEJBQW9CO2dCQUNsQjViLGFBQWEsTUFBTW9WOztBQUd6QjtRQUVRLHFCQUFPOEQsQ0FDYnRZLGFBQ0F3VSxnQkFDQVUsZUFDQUM7WUFFQSxPQUFPLEVBQ0x4WixzQkFBc0JxRSxhQUFhLE9BQU9tVixTQUMxQ3JXLG1CQUFtQm9XLGdCQUNuQm5NLFFBQUFBLGFBQWE7Z0JBQUVDLFNBQVMsY0FBY3dMO2dCQUN0Q3ZMLHNCQUFjO2dCQUNaN0osYUFBYSxHQUFHb1Y7Z0JBQ2hCb0csUUFBUTtvQkFBRXpKLE1BQU0wSixRQUFBQSxjQUFjN2E7O2dCQUVoQ2diLDRCQUFvQjtnQkFDbEI1YixhQUFhLE1BQU1vVjs7QUFHekI7UUFFUSx1QkFBT2dFLENBQ2J4WSxhQUNBd1UsZ0JBQ0FVLGVBQ0FDO1lBRUEsT0FBTyxFQUNMeFosc0JBQXNCcUUsYUFBYSxPQUFPbVYsU0FDMUNyVyxtQkFBbUJvVyxnQkFDbkJuTSxxQkFBYTtnQkFDWEMsU0FBUyx1QkFBdUJ3TDtnQkFFbENrRyxnQkFBUTtnQkFDTnRiLGFBQWEsK0NBQStDb1Y7Z0JBQzVENWIsTUFBTThVLE9BQU96UiwyQkFBY08sUUFBUXdEO2dCQUVyQ2lKLHNCQUFjO2dCQUNaN0osYUFBYSxHQUFHb1Y7Z0JBQ2hCb0csUUFBUTtvQkFBRXpKLE1BQU0wSixRQUFBQSxjQUFjN2E7O2dCQUVoQ2diLDRCQUFvQjtnQkFDbEI1YixhQUFhLE1BQU1vVjtnQkFFckJzRyw4QkFBc0I7Z0JBQUUxYixhQUFhOztBQUV6QztRQUVRLHVCQUFPcVosQ0FDYnpZLGFBQ0F3VSxnQkFDQVUsZUFDQUM7WUFFQSxPQUFPLEVBQ0x4WixzQkFBc0JxRSxhQUFhLFVBQVVtVixTQUM3Q3JXLG1CQUFtQm9XLGdCQUNuQm5NLFFBQUFBLGFBQWE7Z0JBQUVDLFNBQVMsWUFBWXdMO2dCQUNwQ3ZMLHNCQUFjO2dCQUNaN0osYUFBYSxHQUFHb1Y7Z0JBQ2hCb0csUUFBUTtvQkFBRXpKLE1BQU0wSixRQUFBQSxjQUFjN2E7O2dCQUVoQ2diLDRCQUFvQjtnQkFDbEI1YixhQUFhLE1BQU1vVjs7QUFHekI7UUFFUSwwQkFBT3VFLENBQ2IvWSxhQUNBd1U7WUFFQSxPQUFPLEVBQ0w3WSxzQkFBc0JxRSxhQUFhLE9BQU8sNEJBQzFDK0kscUJBQWE7Z0JBQ1hDLFNBQVMsb0NBQW9Dd0w7Z0JBRS9DMUwsaUJBQVM7Z0JBQ1AzSixNQUFNO2dCQUNOQyxhQUFhO2dCQUVmMEosaUJBQVM7Z0JBQ1AzSixNQUFNO2dCQUNOQyxhQUNFO2dCQUVKdUosaUJBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVkcsTUFBTXdOLEtBQUFBO2dCQUNOeEosYUFBYTtnQkFFZnVKLGlCQUFTO2dCQUNQeEosTUFBTTtnQkFDTmxFLFVBQVU7Z0JBQ1ZtRSxhQUFhO2dCQUVmdUosaUJBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVm1FLGFBQWE7Z0JBRWY2SixRQUFBQSxjQUFjO2dCQUFFN0osYUFBYSxHQUFHb1Y7Z0JBQ2hDd0csNEJBQW9CO2dCQUNsQjViLGFBQWEsTUFBTW9WOztBQUd6QjtRQUVRLGtDQUFPd0UsQ0FDYmhaLGFBQ0F3VSxnQkFDQTFZLE1BQ0FxZDtZQUVBLE1BQU04QixPQUE2RCxFQUNqRXRmLHNCQUFzQnFFLGFBQWEsT0FBT2xFLE9BQzFDaU4sUUFBQUEsYUFBYTtnQkFBRUMsU0FBUyxZQUFZd0w7Z0JBQ3BDdkwsc0JBQWM7Z0JBQ1o3SixhQUFhLEdBQUdvVjs7WUFJcEIsTUFBTWtGLFdBQVc1ZCxLQUFLNEwsTUFBTSxLQUFLak4sT0FBUThiLEtBQU1BLEVBQUUzWCxXQUFXO1lBQzVEOGEsU0FBU3BRLFFBQVNxUTtnQkFDaEIsTUFBTXhhLE9BQU93YSxJQUFJL2IsUUFBUSxLQUFLO2dCQUM5QnFkLEtBQUtsVSxLQUFLK0IsaUJBQVM7b0JBQUUzSjtvQkFBTUMsYUFBYSxPQUFPRDs7O1lBR2pELElBQ0VyRCxLQUFLOEMsV0FBVyxjQUNoQjlDLEtBQUs4QyxXQUFXLGtCQUNoQjlDLEtBQUs4QyxXQUFXLFlBQ2hCOUMsS0FBSzhDLFdBQVcsVUFDaEI7Z0JBQ0FxYyxLQUFLbFUsS0FDSDRCLGlCQUFTO29CQUNQeEosTUFBTTtvQkFDTmxFLFVBQVU7b0JBQ1ZHLE1BQU13TixLQUFBQTtvQkFDTnhKLGFBQWE7O0FBR25CO1lBQ0EsSUFBSXRELEtBQUs4QyxXQUFXLGtCQUFrQjlDLEtBQUs4QyxXQUFXLFVBQVU7Z0JBQzlEcWMsS0FBS2xVLEtBQ0g0QixpQkFBUztvQkFBRXhKLE1BQU07b0JBQVNsRSxVQUFVO29CQUFPbUUsYUFBYTtvQkFDeER1SixRQUFBQSxTQUFTO29CQUNQeEosTUFBTTtvQkFDTmxFLFVBQVU7b0JBQ1ZtRSxhQUFhO29CQUVmdUosUUFBQUEsU0FBUztvQkFDUHhKLE1BQU07b0JBQ05sRSxVQUFVO29CQUNWbUUsYUFBYTs7QUFHbkI7WUFFQSxJQUFJdEQsS0FBSzhDLFdBQVcsaUJBQWlCOUMsS0FBSzhDLFdBQVcsWUFBWTtnQkFDL0RxYyxLQUFLbFUsS0FDSGlVLDRCQUFvQjtvQkFDbEI1YixhQUFhLE1BQU1vVjs7QUFHekI7WUFFQSxJQUNFMkUsaUJBQWlCcmIsS0FBQUEsc0JBQXNCTyxZQUN2QzhhLGlCQUFpQnJiLEtBQUFBLHNCQUFzQlUsVUFDdkMyYSxpQkFBaUJyYixLQUFBQSxzQkFBc0JXLFFBQ3ZDO2dCQUNBd2MsS0FBS2xVLEtBQ0hrQyxzQkFBYztvQkFDWjdKLGFBQWEsY0FBY29WO29CQUMzQjViLE1BQU0wSTs7QUFHWjtZQUNBLElBQUk2WCxpQkFBaUJyYixLQUFBQSxzQkFBc0JZLGFBQWE7Z0JBQ3REdWMsS0FBS2xVLEtBQ0hrQyxzQkFBYztvQkFDWjdKLGFBQWEsdUJBQXVCb1Y7b0JBQ3BDNWIsTUFBTSxFQUFDeUc7O0FBR2I7WUFFQSxPQUFPNGI7QUFDVDtRQUVRLHlCQUFPbEgsQ0FDYjFMLFlBQ0FaLFdBQ0FhLFVBQ0FDLHFCQUE4QjtZQUU5QixNQUFNZixvQkFBcUJ2SSxLQUN6QkEsRUFDR3lJLE1BQU0sS0FDTmpOLE9BQVE4YixLQUFNQSxFQUFFM1gsV0FBVyxNQUMzQmxFLElBQUs2YixLQUFNQSxFQUFFNU8sTUFBTTtZQUV4QixNQUFNYyxnQkFBZ0JqQixrQkFBa0JDLFdBQVcvTSxJQUFLeUUsU0FBSTtnQkFDMURBO2dCQUNBQyxhQUFhLEdBQUdEO2dCQUNoQmxFLFVBQVU7Z0JBQ1ZyQyxNQUFNeUc7O1lBR1IsTUFBTUwsYUFBbUUsS0FDcEV5SixjQUFjL04sSUFBS3VFLEtBQU02SixRQUFBQSxTQUFTN0osS0FDckM4SixRQUFBQSxhQUFhO2dCQUFFQyxTQUFTLDJCQUEyQlg7Z0JBQ25EWSxzQkFBYztnQkFBRTdKLGFBQWE7Z0JBQzdCOEosNkJBQXFCO2dCQUNuQjlKLGFBQWE7O1lBSWpCLElBQUlrSixhQUFhLFNBQVNDLG9CQUFvQjtnQkFDNUN2SixXQUFXK0gsS0FDVDRCLGlCQUFTO29CQUNQeEosTUFBTTtvQkFDTmxFLFVBQVU7b0JBQ1ZHLE1BQU13TixLQUFBQTtvQkFDTnhKLGFBQWE7b0JBRWZ1SixRQUFBQSxTQUFTO29CQUNQeEosTUFBTTtvQkFDTmxFLFVBQVU7b0JBQ1ZtRSxhQUFhO29CQUVmdUosUUFBQUEsU0FBUztvQkFDUHhKLE1BQU07b0JBQ05sRSxVQUFVO29CQUNWbUUsYUFBYTs7QUFHbkI7WUFFQSxPQUFPSjtBQUNUOztJQ3h0Q0ksU0FBVWtjLGFBQWEvVTs7UUFFM0IsSUFBTWdWLG1CQUFOLE1BQU1BOzs7OztnQkFDWS9YLEtBQUF5QixNQUFNQyxRQUFBQSxRQUFRQyxJQUFJcVcsbUJBQWlCamMsTUFBTTRGLElBQUlvQjtBQUFTO1lBRXRFLDBCQUFPa1YsQ0FDTEM7Z0JBRUEsT0FBT0EsT0FBTzVnQixJQUFLZ00sVUFBSztvQkFDdEI0RSxTQUFTLEdBQUc1RSxNQUFNdkg7b0JBQ2xCb2MsWUFBWSxNQUFNM1IsS0FBQUEsYUFBYXdELFNBQVMxRzs7QUFFNUM7WUFFQSxnQkFBTzhVLENBQ0w5VSxPQUNBK1U7Z0JBRUEsTUFBTWxPLFdBQVdrTyxXQUFXL1UsTUFBTXZIO2dCQUNsQyxNQUFNcEgsZUFDR3dWLGFBQWEsY0FDaEJBLFdBQ0FsTCxXQUFBQSxTQUFTd0IsSUFBSTZDLE9BQU9yRSxXQUFBQSxTQUFTM0ssSUFBSXNLO2dCQUV2QyxXQUFXakssVUFBVSxhQUFhLE9BQU87Z0JBQ3pDLElBQUlBLFVBQVUsTUFBTSxPQUFPO2dCQUMzQixJQUFJaUIsTUFBTUMsUUFBUWxCLFFBQVEsT0FBT0EsTUFBTU0sU0FBUzhOO2dCQUNoRCxPQUFPO0FBQ1Q7WUFFQSxjQUFPaUYsQ0FDTGpGLFNBQ0E1SyxVQUF1QztnQkFFdkMsTUFBTXNKLE1BQU16QixLQUFLeUIsSUFBSUUsSUFBSTNCLEtBQUtnSTtnQkFDOUJ2RyxJQUFJOFEsS0FBSztnQkFFVCxNQUFNK0YsZ0JBQWdCelYsS0FBQUEsUUFBUXFWLE9BQU9uVixTQUFTMUwsT0FBUWlNLFNBQ3BEdEQsS0FBS29ZLFVBQVU5VSxPQUFPbkwsUUFBUW9nQjtnQkFNaEMsS0FBSyxNQUFNalYsU0FBU2dWLGVBQWU5UixLQUFBQSxhQUFhd0QsU0FBUzFHO2dCQUV6RCxJQUFJa1YsZ0JBQTRCO2dCQUNoQyxJQUFJcmdCLFFBQVFzZ0IsY0FBYztvQkFDeEJoWCxJQUFJOFEsS0FBSztvQkFDVGlHLGdCQUFnQnhZLEtBQUtpWSxvQkFBb0JLO29CQUN6QzdXLElBQUk4USxLQUNGLDRCQUE0QmlHLGNBQWM1Z0I7QUFFOUM7Z0JBRUEsTUFBTXFaLGlCQUF3RCxDQUFBO2dCQUM5RCxJQUFJOVksUUFBUXVnQixpQkFBaUIsT0FBTztvQkFDbEN6SCxlQUFlMEgsdUJBQXVCO0FBQ3hDO2dCQUVBLE1BQU1DLGNBQWNOLGNBQWNoaEIsSUFBS2dNLFNBQ3JDaU0sb0JBQW9Cd0IsT0FBT3pOLE9BQU9uTCxRQUFRZ0gsa0JBQWtCOFI7Z0JBRTlEeFAsSUFBSThRLEtBQUssYUFBYXFHLFlBQVloaEI7Z0JBRWxDLE9BQU87b0JBQ0wyUSxRQUFReVA7b0JBQ1JZO29CQUNBM1EsV0FBVyxLQUNOdVE7O0FBR1Q7O1FBdEVJVCxtQkFBZ0JDLHFCQUFBcFgsaUJBQUEsRUFEckI2SCxPQUFBQSxPQUFPLENBQUEsTUFDRnNQO1FBd0VOaGlCLE9BQU9DLE9BQU8raEIsa0JBQWtCLFFBQVE7WUFDdENwakIsT0FBTyxjQUFjb087O1FBRXZCLE9BQU9nVjtBQUNUO0lDM0VBYyxXQUFBQSxXQUFXbFgsSUFBSW1YLHFCQUFBQSxnQkFBZ0JDLFlBQzVCQyxPQUFPO1FBQ045VSxXQUFXLFNBQVMrVSxlQUNsQkMsVUFDQUM7WUFFQUEsTUFDRUEsZUFDUUQsYUFBYSxXQUNqQm5qQixPQUFPQyxPQUNMa2pCLFVBQ0FFLHFCQUFBQSw0QkFFRkE7WUFDTixPQUFPdlksa0JBQVc7Z0JBQ2hCQyxPQUFPcVksSUFBSUUsWUFBWXRZLE9BQUFBLE1BQU11WSxVQUFVdlksT0FBQUEsTUFBTUM7Z0JBQzdDdVksU0FBU0osSUFBSUUsWUFBWXBoQixZQUFZOztBQUV6QztPQUVEOEI7SUFFSDhlLFdBQUFBLFdBQVdsWCxJQUFJbVgscUJBQUFBLGdCQUFnQlUsUUFDNUJSLE9BQU87UUFDTjlVLFdBQVcsU0FBU3VWLFdBQ2xCUCxVQUVBQztZQUVBLE9BQU8sU0FBU08sZ0JBQ2RybEIsUUFDQVUsYUFDQVI7Z0JBRUEsT0FBTzJNLE9BQUFBLE9BQU9nWSxZQUFhN2tCLE9BQXBCNk0sQ0FDTDdNLFFBQ0FVLGFBQ0FSO0FBRUo7QUFDRjtPQUVEd0Y7SUFFSDhlLFdBQUFBLFdBQVdsWCxJQUFJMEssb0JBQUFBLGVBQWVDLFVBQzNCME0sT0FDQzlnQixZQUFZO1FBQ1ZMLFVBQVU7UUFHYmtDO0lBRUg4ZSxXQUFBQSxXQUFXbFgsSUFBSTBLLG9CQUFBQSxlQUFlc04sS0FDM0JYLE9BQU87UUFDTjlVLFdBQVcsU0FBUzBWLE9BQU9DO1lBQ3pCLE9BQU8zaEIsWUFBWTtnQkFBRTRoQixTQUFTRDtnQkFBS2hpQixVQUFVOztBQUMvQztPQUVEa0M7SUFFSDhlLFdBQUFBLFdBQVdsWCxJQUFJMEssb0JBQUFBLGVBQWUwTixLQUMzQmYsT0FBTztRQUNOOVUsV0FBVyxTQUFTOFYsT0FBT0M7WUFDekIsT0FBTy9oQixZQUFZO2dCQUFFZ2lCLFNBQVNEO2dCQUFLcGlCLFVBQVU7O0FBQy9DO09BRURrQztJQUVIOGUsV0FBQUEsV0FBV2xYLElBQUkwSyxvQkFBQUEsZUFBZThOLFlBQzNCbkIsT0FBTztRQUNOOVUsV0FBVyxTQUFTa1csYUFBYVA7WUFDL0IsT0FBTzNoQixZQUFZO2dCQUFFbWlCLFdBQVdSO2dCQUFLaGlCLFVBQVU7O0FBQ2pEO09BRURrQztJQUVIOGUsV0FBQUEsV0FBV2xYLElBQUkwSyxvQkFBQUEsZUFBZWlPLFlBQzNCdEIsT0FBTztRQUNOOVUsV0FBVyxTQUFTcVcsYUFBYU47WUFDL0IsT0FBTy9oQixZQUFZO2dCQUFFc2lCLFdBQVdQO2dCQUFLcGlCLFVBQVU7O0FBQ2pEO09BRURrQztJQUVIOGUsV0FBQUEsV0FBV2xYLElBQUkwSyxvQkFBQUEsZUFBZW9PLE1BQzNCekIsT0FBTztRQUNOOVUsV0FBVyxTQUFTd1csUUFDbEJsbEI7WUFLQSxPQUFPLENBQUNuQixRQUFnQjJYO2dCQUN0QnhXLE9BQU9JLE1BQU1DLFFBQVFMLFFBQVFBLEtBQUssS0FBS0E7Z0JBQ3ZDLFdBQVdBLFNBQVMsZUFBZUEsS0FBS3VHLE1BQ3RDdkcsT0FBUUE7Z0JBQ1YsT0FBTzBDLFlBQVk7b0JBQ2pCMUMsTUFBTUE7b0JBQ05xQyxVQUFVO2tCQUZMSyxDQUdKN0QsUUFBUTJYOztBQUVmO09BRURqUztJQXNCSDhlLFdBQUFBLFdBQVdsWCxJQUFJMEssb0JBQUFBLGVBQWVzTyxNQUMzQjNCLE9BQU87UUFFTjlVLFdBQVcsU0FBUzBXLFFBQVFDO1lBQzFCLE9BQU8zaUIsWUFBWTtnQkFDakIxQyxNQUFNeUc7Z0JBQ040ZSxRQUFRO2dCQUNSaGpCLFVBQVU7O0FBR2Q7T0FFRGtDO0lBRUg4ZSxXQUFBQSxXQUFXbFgsSUFBSTBLLG9CQUFBQSxlQUFleU8sTUFDM0I5QixPQUFPO1FBQ045VSxXQUFXLFNBQVM2VyxVQUFVNWlCO1lBQzVCLE1BQU1KLE9BQU9uQyxNQUFNQyxRQUFRc0MsV0FBV0EsVUFBVXBDLE9BQU9xQixPQUFPZTtZQUM5RCxPQUFPRCxZQUFZO2dCQUNqQkYsTUFBTUQ7Z0JBQ05GLFVBQVU7O0FBRWQ7T0FFRGtDO0lBRUg4ZSxXQUFBQSxXQUFXbFgsSUFBSTBLLG9CQUFBQSxlQUFlMk8sU0FDM0JoQyxPQUFPO1FBQ045VSxXQUFXLFNBQVMrVyxXQUFXQztZQUM3QixPQUFPaGpCLFlBQVk7Z0JBQ2pCaWpCLGdCQUFnQkQsUUFBUSxXQUFXQSxNQUFNQSxJQUFJRTtnQkFDN0N2akIsVUFBVTs7QUFFZDtPQUVEa0M7SUFFSDhlLFdBQUFBLFdBQVdsWCxJQUFJa08sS0FBQUEsZ0JBQWdCd0wsUUFDNUJyQyxPQUFPO1FBQ045VSxXQUFXLFNBQVNvWCxVQUFVdmY7WUFDNUIsT0FBTzdELFlBQVk7Z0JBQ2pCNkQsTUFBTUE7Z0JBQ05sRSxVQUFVOztBQUVkO09BRURrQztJQUVIOGUsV0FBQUEsV0FBV2xYLElBQUk0WixXQUFBQSxlQUFlQyxhQUMzQnhDLE9BQU87UUFDTjlVLFdBQVcsU0FBU3VYLGVBQWV6ZjtZQUNqQyxPQUFPOUQsWUFBWTtnQkFDakI4RCxhQUFhQTtnQkFDYm5FLFVBQVU7O0FBRWQ7T0FFRGtDO0lBRUg4ZSxXQUFBQSxXQUFXbFgsSUFBSWtPLHFCQUFnQjZMLE1BQU0xQyxPQUFPO1FBQUU5VSxXQUFXYjtPQUFRdEo7SUNuTTNELE1BQU80aEIsa0JBQWtCQyxLQUFBQTtRQUM3QixXQUFBbm1CLENBQVlvbUI7WUFDVmhjLE1BQU1nYyxLQUFLRixVQUFVNWY7QUFDdkI7O0lDSEksTUFBTytmLDRCQUE0QmxYLGFBQUFBO1FBQ3ZDLFdBQUFuUCxDQUFZb21CO1lBQ1ZoYyxNQUFNaWMsb0JBQW9CL2YsTUFBTThmLEtBQU07QUFDeEM7O0lDK0JGLE1BQU1FLGdDQUFnQyxJQUFJMVIsSUFHeEMsRUFDQSxFQUFDMlIsT0FBQUEsdUJBQXdCSCxPQUFRLElBQUlqVSxLQUFBQSxtQkFBbUJpVSxRQUN4RCxFQUFDSSxPQUFBQSxvQkFBcUJKLE9BQVEsSUFBSUQsS0FBQUEsZUFBZUMsUUFDakQsRUFBQ0ssT0FBQUEscUJBQXNCTCxPQUFRLElBQUlNLGFBQUFBLGdCQUFnQk4sUUFDbkQsRUFBQ08sT0FBQUEsbUJBQW9CUCxPQUFRLElBQUlRLGFBQUFBLGNBQWNSLFFBQy9DLEVBQUNTLE9BQUFBLDhCQUErQlQsT0FBUSxJQUFJVSxhQUFBQSxnQkFBZ0JWO0lBS2pEVyxRQUFBQSx1QkFBTixNQUFNQTtRQUNYLFdBQUEvbUIsQ0FBMkNnbkI7WUFBQXpjLEtBQUF5YyxZQUFBQTtBQUF3QjtRQUVuRSxXQUFNLENBQU1DLFdBQWtCQztZQUM1QixNQUFNdGdCLE1BQU1zZ0IsS0FBS3BnQjtZQUNqQixNQUFNMk0sV0FBVzdNLElBQUk4TTtZQUNyQixNQUFNN00sVUFBVUQsSUFBSUc7WUFFcEIsTUFBTW9nQixlQUFlQywwQkFBa0JDLFFBQVE7WUFDL0MsSUFBSUM7WUFFSixJQUNFTCxxQkFBcUJNLE9BQUFBLHFCQUNyQk4scUJBQXFCdlksS0FBQUEsa0JBQ3JCO2dCQUNBdVksWUFBWSxJQUFJTyxPQUFBQSx1QkFBdUJQLFVBQVUzWDtnQkFDakRnWSxhQUFjTCxVQUFxQ1E7QUFDckQsbUJBQU8sTUFBTVIscUJBQXFCOVgsYUFBQUEsWUFBWTtnQkFDNUMsTUFBTUgsZUFBZXpFLEtBQUttZCxjQUFjVDtnQkFDeEMsSUFBSWpZLGNBQWM7b0JBQ2hCaVksWUFBWWpZLGFBQWFpWSxVQUFVM1g7QUFDckMsdUJBQU8sSUFBSzJYLFVBQWtCVSxXQUFXLEtBQUs7b0JBQzVDVixZQUFZLElBQUlaLG9CQUFvQlksVUFBVTNYO0FBQ2hELHVCQUFPLElBQUkyWCxxQkFBcUJXLE9BQUFBLGVBQWU7b0JBRzdDTixhQUFhTCxVQUFVUTtBQUN6Qix1QkFBTztvQkFDTFIsWUFBWSxJQUFJN1gsYUFBQUEsY0FBYzZYLFVBQVUzWDtBQUMxQztBQUNGO2tCQUVNL0UsS0FBS3NkLFNBQVNoaEIsU0FBU29nQjtZQUU3QnhULFNBQVNrVSxPQUFRVixVQUF3QmEsUUFBUVIsWUFBWVMsS0FBSztnQkFDaEVKLFFBQVNWLFVBQXdCYSxRQUFRUjtnQkFDekNyWSxPQUFPa1ksZUFBZUYsVUFBVTNnQixPQUFPMmdCLFVBQVUzWDtnQkFDakQwWSxZQUFXLElBQUlDLE1BQU9DO2dCQUN0QmpsQixNQUFNNEQsUUFBUTBNO2dCQUNkdkQsUUFBUW5KLFFBQVFtSjs7QUFFcEI7UUFPVSxhQUFBMFgsQ0FDUlQ7WUFFQSxLQUFLLE9BQU9sbkIsTUFBTW9vQixZQUFZN0IsK0JBQStCO2dCQUMzRCxJQUFJVyxxQkFBcUJsbkIsTUFBTSxPQUFPb29CO0FBQ3hDO1lBQ0EsT0FBTzNsQjtBQUNUO1FBVVUsY0FBTXFsQixDQUNkaGhCLFNBQ0FvZ0I7WUFFQSxNQUFNM1gsVUFBVSxzQkFBc0J6SSxTQUFTbUosVUFBVW5KLFNBQVMwTTtZQUNsRTtnQkFDRSxNQUFNdkgsWUFBWXpCLEtBQUs2ZCxjQUFjdmhCO2dCQUNyQ21GLElBQUlpRCxNQUFNSyxTQUFTMlg7QUFDckIsY0FBRTtnQkFDQTtvQkFDRWhiLFFBQUFBLFFBQVFqQixNQUFNaUUsTUFBTUssU0FBUzJYO0FBQy9CLGtCQUFFLE9BRUY7QUFDRjtBQUNGO1FBYVUsbUJBQU1tQixDQUNkdmhCO1lBRUEsSUFBSTBELEtBQUt5YyxXQUFXO2dCQUNsQjtvQkFDRSxNQUFNcUIsWUFBWUMsT0FBQUEsaUJBQWlCQyxhQUFhMWhCO29CQUNoRCxNQUFNK0UsdUJBQXVCckIsS0FBS3ljLFVBQVV3QixRQUMxQ3RlLFFBQUFBLHFCQUNBbWUsV0FDQTt3QkFBRUksUUFBUTs7b0JBRVosSUFBSTdjLGdCQUFnQnNCLFFBQVEsT0FBT3RCLGVBQWVzQjtBQUNwRCxrQkFBRSxPQUVGO0FBQ0Y7WUFDQSxPQUFPakIsUUFBQUEsUUFBUWpCO0FBQ2pCOztJQTlHVytiLFFBQUFBLHVCQUFvQjViLGlCQUFBLEVBRmhDdWQsZ0JBQ0F0ZCxxQkFFY0ksY0FBQSxHQUFBa0MsT0FBQUEscURBQTBDaWIsdUJBRDVDNUI7YUMxQ0c2QjtRQUNkLE9BQU9DLE9BQUFBLFdBQVcsSUFBSTlCLFFBQUFBO0FBQ3hCO2FBRWdCK0I7UUFDZCxPQUFPN2EsT0FBQUEsZ0JBQWdCdUYsUUFBQUE7QUFDekI7SUNpQk8sTUFBTXVWLHVCQUF1QztRQUNsREMsT0FBTztRQUNQemlCLGFBQWE7UUFDYjBpQixTQUFTO1FBQ1RobUIsTUFBTTtRQUNOaW1CLGlCQUFpQjtRQUNqQkMsb0JBQW9CO1FBQ3BCMU0sTUFBTTtZQUNKMWMsTUFBTTtZQUNOcXBCLFFBQVE7WUFDUkMsY0FBYztZQUNkL2lCLE1BQU07WUFDTkMsYUFBYTtZQUNiK2lCLElBQUk7O1FBRU5DLHNCQUFzQjtRQUN0QkMsZUFBZTs7VUNoQ0pDO1FBVVgsV0FBQXpwQixDQUFZMEM7WUFDVjZILEtBQUs3SCxVQUFVO21CQUNWQTs7QUFFUDtRQUVRLFNBQUFnbkI7WUFDTixJQUFJQyxNQUFNO1lBQ1YsSUFBSXBmLEtBQUs3SCxRQUFRa25CLGdCQUFnQjtnQkFDL0IsTUFBTUMsTUFBTXRmLEtBQUt1ZixJQUFJdmYsS0FBSzdILFFBQVFrbkI7Z0JBQ2xDRCxPQUFPLHlEQUF5REU7QUFDbEU7WUFDQSxPQUNFRixNQUNBLDBHQUU0Q3BmLEtBQUs3SCxRQUFROG1CLGlCQUFpQlQscUJBQXFCUztBQUduRztRQUVBLGdCQUFBTztZQUNFLE1BQU1DLFVBQStCLENBQUE7WUFDckMsSUFBSXpmLEtBQUs3SCxRQUFRdW5CLGFBQWE7Z0JBQzVCRCxRQUFRLG1CQUFtQnpmLEtBQUt1ZixJQUFJdmYsS0FBSzdILFFBQVF1bkIsYUFBYTtBQUNoRTtZQUVBLE9BQU87Z0JBQ0xDLGlCQUFpQjNmLEtBQUs3SCxRQUFRc21CO21CQUMzQmdCO2dCQUNIRyxXQUFXNWYsS0FBS21mO2dCQUNoQlUsZ0JBQWdCO29CQUNkYixzQkFBc0JoZixLQUFLN0gsUUFBUTZtQjs7O0FBR3pDO1FBRUEsR0FBQU8sQ0FBSU8sTUFBY1IsTUFBZTtZQUMvQixNQUFNUyxXQUFXcm5CLGdCQUFLNFgsS0FBS3RRLEtBQUs3SCxRQUFRNm5CLGNBQWMsSUFBSUY7WUFDMUQsTUFBTVAsTUFBTVUsR0FBQUEsYUFBYUYsVUFBVTtnQkFBRUcsVUFBVTs7WUFDL0MsT0FBT1osTUFBTSwyQkFBMkJDLE1BQU1BO0FBQ2hEOztVQzNEV1k7UUFDWCxXQUFBMXFCLENBQ21CMnFCLEtBQ0Fqb0I7WUFEQTZILEtBQUFvZ0IsTUFBQUE7WUFDQXBnQixLQUFBN0gsVUFBQUE7QUFDaEI7UUFFSyxjQUFBa29CO1lBQ04sTUFBTXJrQixjQUFjZ0UsS0FBSzdILFFBQVFPLE9BQzdCc0gsS0FBSzdILFFBQVE2RCxjQUNiLEtBQ0Esb0JBQW9CZ0UsS0FBSzdILFFBQVFtb0IsOENBQ2pDLFlBQVl0Z0IsS0FBSzdILFFBQVFvb0IsMkNBQ3pCdmdCLEtBQUs3SCxRQUFRNkQ7WUFFakIsTUFBTW9ELFVBQVMsSUFBSW9oQixRQUFBQSxpQkFDaEJDLFNBQVN6Z0IsS0FBSzdILFFBQVFzbUIsT0FDdEJpQyxlQUFlMWtCLGFBQ2Yya0IsV0FBVzNnQixLQUFLN0gsUUFBUXVtQixXQUFXLFNBQ25Da0MsY0FBYzVnQixLQUFLN0gsUUFBUStaLFFBQVFzTSxxQkFBcUJ0TSxNQUN4RC9DO1lBRUgsT0FBTzBSLFFBQUFBLGNBQWNSLGVBQWVyZ0IsS0FBS29nQixLQUFLaGhCLFFBQVE7Z0JBQ3BEd08sYUFBYTVOLEtBQUs3SCxRQUFReVYsZUFBZTs7QUFFN0M7UUFFUSxvQkFBQWtULENBQ05wb0IsTUFDQXFvQixhQUNBQztZQUVBLEtBQUt0b0IsTUFBTTtZQUVYLE1BQU11b0IsY0FBY2poQixLQUFLb2dCLElBQUljO1lBQzdCeG9CLE9BQU9BLEtBQUs4QyxXQUFXLE9BQU85QyxPQUFPLElBQUlBO1lBQ3pDdW9CLFlBQVl4Z0IsSUFBSS9ILE1BQU0sQ0FBQ3lvQixNQUFXcFk7Z0JBQ2hDa1ksWUFBWUcsTUFBTXJZLEtBQUtpWSxlQUFlLEtBQUs7b0JBQ3pDLGdCQUFnQkQ7OztBQUd0QjtRQUVPLFlBQUFNO1lBQ0wsTUFBTUMsV0FBV3RoQixLQUFLcWdCO1lBQ3RCLE1BQU1rQixZQUFZLElBQUlyQyxnQkFBZ0I7Z0JBQ3BDVCxPQUFPemUsS0FBSzdILFFBQVFzbUI7Z0JBQ3BCL2xCLE1BQU1zSCxLQUFLN0gsUUFBUU8sUUFBUThsQixxQkFBcUI5bEI7Z0JBQ2hEc21CLHNCQUFzQmhmLEtBQUs3SCxRQUFRNm1CLHdCQUF3QjtnQkFDM0RnQixZQUFZaGdCLEtBQUs3SCxRQUFRNm5CO2dCQUN6Qk4sYUFBYTFmLEtBQUs3SCxRQUFRd21CO2dCQUMxQlUsZ0JBQWdCcmYsS0FBSzdILFFBQVF5bUI7Z0JBQzdCSyxlQUFlamYsS0FBSzdILFFBQVE4bUI7O1lBRTlCNEIsc0JBQWNXLE1BQ1p4aEIsS0FBSzdILFFBQVFPLFFBQVE4bEIscUJBQXFCOWxCLE1BQzFDc0gsS0FBS29nQixLQUNMa0IsVUFDQTttQkFDS0MsVUFBVS9CO2dCQUNiaUMsaUJBQWlCemhCLEtBQUs3SCxRQUFRbW9CLGtCQUMxQixHQUFHdGdCLEtBQUs3SCxRQUFRbW9CLG9CQUNoQnJvQjtnQkFDSnlwQixpQkFBaUIxaEIsS0FBSzdILFFBQVFvb0Isa0JBQzFCLEdBQUd2Z0IsS0FBSzdILFFBQVFvb0Isb0JBQ2hCdG9COztZQUlSK0gsS0FBSzhnQixxQkFDSDlnQixLQUFLN0gsUUFBUW1vQixpQkFDYixvQkFDQSxNQUFNZ0I7WUFHUnRoQixLQUFLOGdCLHFCQUNIOWdCLEtBQUs3SCxRQUFRb29CLGlCQUNiLHNCQUNBLE1BQU1vQixLQUFLNWEsVUFBVXVhO0FBRXpCOztVQ2lCV007UUFjSCxpQkFBV2pmO1lBQ2pCLEtBQUszQyxLQUFLNmhCLFNBQVM7Z0JBRWpCN2hCLEtBQUs2aEIsVUFBVSxJQUFJQyxPQUFBQSxPQUFPO0FBQzVCO1lBQ0EsT0FBTzloQixLQUFLNmhCO0FBQ2Q7UUFhQSxpQkFBT0UsQ0FBVzNCO1lBQ2hCcGdCLEtBQUtvZ0IsTUFBTUE7WUFDWCxPQUFPcGdCO0FBQ1Q7UUFjQSxtQkFBT2dpQixDQUFhQztZQUNsQmppQixLQUFLNmhCLFVBQVVJLGdCQUFnQixJQUFJSCxPQUFBQSxPQUFPO1lBQzFDOWhCLEtBQUtvZ0IsSUFBSThCLFVBQVVsaUIsS0FBSzZoQjtZQUN4QixPQUFPN2hCO0FBQ1Q7UUFnQkEsaUJBQU9taUIsQ0FDTEMsVUFBMEIsSUFDMUJDLGVBQXlCLEVBQUMsT0FBTyxRQUFRLE9BQU87WUFFaEQsTUFBTUMsaUJBQ0pGLFlBQVksTUFBTSxNQUFNQSxRQUFROXFCLElBQUtpckIsS0FBTUEsRUFBRWxTLE9BQU9vRDtZQUV0RCxNQUFNK08sY0FBMkI7Z0JBQy9CQyxRQUFRLENBQUNBLFFBQVFDO29CQUVmLEtBQUtELFFBQVEsT0FBT0MsU0FBUyxNQUFNO29CQUVuQyxJQUNFSixtQkFBbUIsT0FDbEIxc0IsTUFBTUMsUUFBUXlzQixtQkFDYkEsZUFBZXJ0QixTQUFTd3RCLE9BQU9oUCxnQkFDakM7d0JBQ0EsT0FBT2lQLFNBQVMsTUFBTTtBQUN4QjtvQkFFQUEsU0FBUyxJQUFJL0csVUFBVSxVQUFVOEc7O2dCQUVuQ0UsYUFBYTtnQkFDYkMsU0FBU1AsYUFBYS9SLEtBQUs7O1lBRzdCdFEsS0FBS29nQixJQUFJK0IsV0FBV0s7WUFDcEIsT0FBT3hpQjtBQUNUO1FBY0EsZ0JBQU82aUIsQ0FBVTFxQjtZQUNmO2dCQUVFLE1BQU0ycUIsU0FBU0MsUUFBUTtnQkFDdkIvaUIsS0FBS29nQixJQUFJNEMsSUFBSUYsT0FBTzNxQjtnQkFDcEI2SCxLQUFLMkMsT0FBT2xCLElBQUk7QUFDbEIsY0FBRTtnQkFDQXpCLEtBQUsyQyxPQUFPc2dCLEtBQUs7QUFDbkI7WUFFQSxPQUFPampCO0FBQ1Q7UUFjQSxtQkFBT3FoQixDQUFhbHBCO1lBQ2xCLE1BQU0rcUIsVUFBVSxJQUFJL0MsZUFBZW5nQixLQUFLb2dCLEtBQUs7Z0JBQzNDM0IsT0FBT3RtQixRQUFRc21CO2dCQUNmemlCLGFBQWE3RCxRQUFRNkQ7Z0JBQ3JCMGlCLFNBQVN2bUIsUUFBUXVtQjtnQkFDakJobUIsTUFBTVAsUUFBUU8sUUFBUTtnQkFDdEJzbUIsc0JBQXNCN21CLFFBQVE2bUIsd0JBQXdCO2dCQUN0RGdCLFlBQVk3bkIsUUFBUTZuQjtnQkFDcEJyQixpQkFBaUJ4bUIsUUFBUXVuQjtnQkFDekJkLG9CQUFvQnptQixRQUFRa25CO2dCQUM1QkosZUFBZTltQixRQUFROG1CO2dCQUN2QnFCLGlCQUFpQm5vQixRQUFRbW9CO2dCQUN6QkMsaUJBQWlCcG9CLFFBQVFvb0I7O1lBRTNCMkMsUUFBUTdCO1lBQ1IsT0FBT3JoQjtBQUNUO1FBY0EscUJBQU9takIsSUFBa0JDO1lBQ3ZCLElBQUlBLE1BQU14ckIsU0FBUyxHQUFHb0ksS0FBS29nQixJQUFJK0Msa0JBQWtCQztZQUNqRCxPQUFPcGpCO0FBQ1Q7UUFrQkEsdUJBQU9xakIsSUFBb0JDO1lBQ3pCdGpCLEtBQUtvZ0IsSUFBSWlELG9CQUNIQyxRQUFRMXJCLFNBQVMsSUFDakIwckIsVUFDQSxFQUFDLElBQUk5RyxRQUFBQSxxQkFBcUJ4YyxLQUFLb2dCLElBQUkzZixJQUFJMmQsa0JBQVc7Z0JBQUVGLFFBQVE7O1lBRWxFLE9BQU9sZTtBQUNUO1FBY0EsNEJBQU91akIsSUFBeUJDO1lBQzlCLElBQUlBLGFBQWE1ckIsU0FBUyxHQUN4Qm9JLEtBQUtvZ0IsSUFBSW1ELHlCQUF5QkM7WUFDcEMsT0FBT3hqQjtBQUNUO1FBZ0JBLGtCQUFheWpCLENBQ1hDLE9BQWV4bEIsT0FBT3lsQixRQUFRN0csSUFBSThHLFNBQVMsS0FDM0NqSCxPQUEyQjFrQixXQUMzQndKLE1BQWU7WUFFZnpCLEtBQUtvZ0IsSUFBSXlELE9BQU9ILE1BQU0vRyxNQUFhbUgsS0FBS25kO2dCQUN0QyxJQUFJbEYsS0FBSztvQkFDUCxNQUFNdUgsWUFBWWhKLEtBQUtvZ0IsSUFBSTJEO29CQUMzQi9qQixLQUFLMkMsT0FBT2xCLElBQUksaUNBQWlDdUg7QUFDbkQ7O0FBRUo7OztJQzFSV2diLFFBQUFBLGlDQUE4QkMsbUNBQXBDLE1BQU1EO1FBQ1gsV0FBQXZ1QixDQUNxQjRMLGdCQUNBNmlCO1lBREFsa0IsS0FBQXFCLGlCQUFBQTtZQUNBckIsS0FBQWtrQixXQUFBQTtBQUNsQjtRQUVPLG1CQUFNQyxDQUFjam5CO1lBQzVCLE1BQU02QyxVQUFVN0MsSUFBSTZDO1lBQ3BCLE1BQU1xa0IsUUFBMEI7Z0JBQzlCcmtCLFNBQVNBO2dCQUNUUyxXQUFXLENBQUE7O1lBR2IsTUFBTTZqQixLQUFLQyxVQUFVcG5CO1lBQ3JCLE1BQU15RixTQUFTakIsUUFBQUEsUUFBUWpCLE1BQU1rQixJQUFJO2dCQUFFMGlCOztZQUVuQ3JrQixLQUFLcUIsZUFBZVYsV0FDbEI1SyxPQUFPQyxPQUNMLENBQUEsR0FDQXV1QiwwQkFDQTtnQkFDRTVoQjtnQkFDQThhLFdBQVcsSUFBSUM7Z0JBQ2Y4RyxXQUFXLEdBQUd0bkIsSUFBSXVJLFVBQVV2SSxJQUFJOEw7ZUFFbENvYjtBQUdOO1FBRUEsZUFBTTdpQixDQUFVc0gsU0FBMkJySDtZQUN6QyxNQUFNdEUsTUFBTTJMLFFBQVF0TSxlQUFlQztZQUNuQyxNQUFNdU0sTUFBTUYsUUFBUXRNLGVBQWU0TTtZQUNuQyxNQUFNMUgsTUFBTUMsUUFBQUEsUUFBUUMsSUFBSXNpQixrQ0FBZ0N0aUIsSUFBSTNCLEtBQUt1QjtZQUNqRUUsSUFBSVcsTUFDRixXQUFXcEMsS0FBS3FCLGVBQWVwQixtQkFBbUIvQyxJQUFJdUksVUFBVXZJLElBQUk4TDtrQkFFaEVoSixLQUFLbWtCLGNBQWNqbkI7WUFDekJ1RSxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLcUIsZUFBZXBCLGtDQUFrQy9DLElBQUl1SSxVQUFVdkksSUFBSThMO2tCQUcvRWhKLEtBQUtra0IsU0FBU3BiLEtBQUs1TCxLQUFLNkw7WUFDOUJ0SCxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLcUIsZUFBZXBCLHNDQUFzQy9DLElBQUl1SSxVQUFVdkksSUFBSThMO1lBRXpGLE9BQU94SCxLQUFLb0I7QUFDZDs7SUEvQ1dvaEIsUUFBQUEsaUNBQThCQyxtQ0FBQXJqQixNQUFBQSxXQUFBLEVBRDFDQyxPQUFBQSxXQUFXO1FBQUVDLE9BQU9DLE9BQUFBLE1BQU1DO2dEQUdZckIsUUFBQUEscUJBQ04rSSxtQ0FIcEJzYjtJQWtEYixTQUFTTSxVQUFVcG5CO1FBQ2pCLE1BQU02QyxVQUFVN0MsSUFBSTZDO1FBQ3BCLFNBQVMwa0IsY0FBYzl2QjtZQUNyQixLQUFLQSxPQUFPLE9BQU9zRDtZQUNuQixNQUFNeXNCLFlBQVk5dUIsTUFBTUMsUUFBUWxCLFNBQVNBLE1BQU0sS0FBS0E7WUFDcEQsT0FBTyt2QixVQUNKcGdCLE1BQU0sS0FDTmhOLElBQUs4WSxXQUFZQSxRQUFRQyxRQUN6QmhaLE9BQU8yYixTQUFTO0FBQ3JCO1FBQ0EsT0FDRXlSLGNBQWMxa0IsVUFBVSx1QkFDeEIwa0IsY0FBYzFrQixVQUFVLGlCQUN4QjBrQixjQUFjMWtCLFVBQVUsdUJBQ3hCMGtCLGNBQWMxa0IsVUFBVSxpQkFDeEI3QyxJQUFJbW5CO0FBRVI7SUMvR0EsTUFBTU0sbUJBQW1CLElBQUl0YTthQVFidWE7UUFDZCxPQUFPaHZCLE1BQU1zTixLQUFLeWhCLGlCQUFpQnZ0QjtBQUNyQztJQUVBLFNBQVN5dEIsaUJBQWlCQyxPQUFlM007UUFDdkMsSUFBSXdNLGlCQUFpQjFZLElBQUk2WSxRQUFRO1FBQ2pDSCxpQkFBaUJ6bEIsSUFBSTRsQixPQUFPO1lBQUU1YyxTQUFTNGM7WUFBTzNNOztBQUNoRDtJQUVBLFNBQVM0TSxtQkFBbUJwd0I7UUFDMUIsY0FBY0EsVUFBVSxjQUFjQSxNQUFNNEIscUJBQXFCMlUsb0JBQUFBO0FBQ25FO0lBRUEsU0FBUzhaLGtCQUFrQjFoQjtRQUN6QixPQUFPLEdBQUdBLE1BQU12SDtBQUNsQjtJQUVBLFNBQVNrcEIscUJBQ1AzaEIsT0FDQVA7UUFFQSxPQUFPQSxVQUFVLEdBQUdPLE1BQU12SCxrQkFBa0JnSCxZQUFZLEdBQUdPLE1BQU12SDtBQUNuRTtJQWNNLFNBQVU4TixRQUFRdlY7UUFDdEIsT0FBTyxDQUNMRCxRQUNBVSxhQUNBbXdCO1lBRUEsSUFBSUMsV0FBa0Q3d0I7WUFDdEQsV0FBVzZ3QixhQUFhLGFBQWE7Z0JBQ25DLE1BQU1DLGFBQ0ozd0IsUUFBUUMsWUFBWSxxQkFBcUJMLFdBQVc7Z0JBQ3REOHdCLFdBQVdDLFdBQVdGO0FBQ3hCO1lBQ0EsV0FBV0MsYUFBYSxhQUFhO2dCQUNuQyxNQUFNLElBQUl0Z0IsYUFBQUEsY0FDUixrRUFBa0VxZ0IscUJBQXNCN3dCLE9BQTRCMEg7QUFFeEg7WUFFQSxNQUFNc3BCLGlCQUFpQkYsYUFBYSxZQUFZSixtQkFBbUJJO1lBQ25FLE1BQU1MLFFBQVFPLFVBQ1ZMLGtCQUFrQkcsWUFDbEJHLEtBQUFBLHFCQUFxQkg7WUFFekJOLGlCQUFpQkMsT0FBTztnQkFDdEIsSUFBSU8sU0FBUyxPQUFPN2UsS0FBQUEsYUFBYXdELFNBQVNtYjtnQkFDMUMsY0FBY0EsYUFBYSxXQUN2QkksS0FBQUEsUUFBWTlrQixJQUFJMGtCLFlBQ2hCSSxLQUFBQSxRQUFZOWtCLElBQUkwa0I7O1lBR3RCLE9BQU9qa0IsT0FBQUEsT0FBTzRqQixNQUFQNWpCLENBQWM3TSxRQUFRVSxhQUFhbXdCOztBQUU5QztJQVVNLFNBQVVuYixXQUNkekcsT0FDQVA7UUFFQSxPQUFPLENBQ0wxTyxRQUNBVSxhQUNBbXdCO1lBRUEsTUFBTUosUUFBUUcscUJBQXFCM2hCLE9BQU9QO1lBQzFDOGhCLGlCQUFpQkMsT0FBTyxNQUFNVSxLQUFBQSxXQUFleGIsU0FBUzFHLE9BQU9QO1lBQzdELE9BQU83QixPQUFBQSxPQUFPNGpCLE1BQVA1akIsQ0FBYzdNLFFBQVFVLGFBQWFtd0I7O0FBRTlDOztJQ3JGYU8sUUFBQUEsa0JBQU4sTUFBTUE7Ozs7UUFPRCxzQkFBV25mO1lBQ25CLEtBQUt0RyxLQUFLNEosY0FDUixNQUFNLElBQUkvRSxhQUFBQSxjQUFjO1lBQzFCLE9BQU83RSxLQUFLNEo7QUFDZDtRQUVVLGNBQVduSTtZQUNuQixLQUFLekIsS0FBSzZoQixTQUFTN2hCLEtBQUs2aEIsVUFBVW5nQixnQkFBUUMsSUFBSStqQjtZQUM5QyxPQUFPMWxCLEtBQUs2aEI7QUFDZDtRQUVBLFdBQUFwc0IsQ0FFbUIwQyxTQUNBc2tCO1lBREF6YyxLQUFBN0gsVUFBQUE7WUFDQTZILEtBQUF5YyxZQUFBQTtBQUNoQjtRQUVILGNBQU96VSxDQUFRN1A7WUFDYixNQUFNc0osTUFBTXpCLEtBQUt5QixJQUFJRSxJQUFJM0IsS0FBS2dJO1lBQzlCLE1BQU0yZCxpQkFBaUJmO1lBQ3ZCLE9BQU87Z0JBQ0xyYyxRQUFRbWQ7Z0JBQ1J6ZCxXQUFXLEVBQ1Q7b0JBQUVDLFNBQVM1SjtvQkFBc0JzbkIsVUFBVXp0QjttQkFDM0M7b0JBQUUrUCxTQUFTM0o7b0JBQWtCcW5CLFVBQVU1bEIsS0FBS3NHLGFBQWF1ZjttQkFDekQ7b0JBQ0UzZCxTQUFTeEo7b0JBQ1R5WixZQUFZLE1BQ1ZoZ0IsUUFBUXlRLFVBQVV0UixJQUFLd3VCO3dCQUNyQnJrQixJQUFJOFEsS0FBSywrQkFBK0J1VCxFQUFFL3BCO3dCQUMxQyxPQUFPLElBQUkrcEI7MEJBQ1A7bUJBRVZubUIsUUFBQUEscUJBQ0ErSSxRQUFBQSxzQkFDQTtvQkFDRVIsU0FBU0csT0FBQUE7b0JBQ1RGLFVBQVU2YixRQUFBQTtzQkFFVDJCO2dCQUVMbmQsU0FBUyxFQUNQbEssc0JBQ0FDLGtCQUNBRyxnQkFDQWlCLFFBQUFBLHFCQUNBK0ksUUFBQUEseUJBQ0dpZCxlQUFlcnVCLElBQUt5dUIsWUFBYUEsU0FBUzdkOztBQUduRDtRQUVBLDRCQUFhOGQsQ0FDWDd0QjtZQUVBLE1BQU1zSixNQUFNekIsS0FBS3lCLElBQUlFLElBQUkzQixLQUFLZ21CO1lBRTlCLEtBQUtobUIsS0FBSzRKLGNBQWM7Z0JBQ3RCLE1BQU1xYyxVQUFVOXRCLFFBQVErdEIsS0FBSzV1QixJQUFJLEVBQUU2dUIsT0FBT2hOLFFBQVE1UztvQkFDaEQsTUFBTTZmLFdBQVc3ZixLQUFLeVE7b0JBQ3RCLEtBQUtvUCxVQUFVLE9BQU8sRUFBQ0QsT0FBT2hOO29CQUM5QixPQUFPLEVBQUNnTixPQUFPaE4sUUFBUTVTOztnQkFFekJ2RyxLQUFLNEosZUFBZSxJQUFJeWM7c0JBQ2xCcm1CLEtBQUs0SixhQUFhMGMsS0FBS0w7Z0JBQzdCLE1BQU1NLFVBQVV2bUIsS0FBSzRKLGFBQWFpYztnQkFDbEMsS0FBSyxJQUFJclAsSUFBSSxHQUFHQSxJQUFJK1AsUUFBUTN1QixRQUFRNGUsS0FBSztvQkFDdkMsTUFBTWdRLElBQUlydUIsUUFBUSt0QixLQUFLMVA7b0JBQ3ZCLE1BQU1pUSxpQkFBaUJELEVBQUVqaUIsTUFBTSxHQUFHaWlCLEVBQUU1dUI7b0JBQ3BDLElBQUlvTCxjQUFjeWpCLGVBQWV6UDtvQkFDakMsS0FDR2hVLGdCQUNDQSxZQUFpREUsTUFDbkQ7d0JBQ0EsTUFBTWlqQixRQUFRdGpCLEtBQUFBLFFBQVFJLGVBQWVzakIsUUFBUS9QLEdBQUd6VDt3QkFDaEQsS0FBS29qQixPQUNILE1BQU0sSUFBSXRoQixhQUFBQSxjQUNSLG9DQUFvQzBoQixRQUFRL1AsR0FBR3pUO3dCQUVuRDs0QkFDRUMsY0FBZW1qQixNQUEyQ2pqQixPQUN0RGlqQixRQUNBLElBQUtBO0FBQ1gsMEJBQUUsT0FBT3psQjs0QkFDUCxNQUFNLElBQUltRSxhQUFBQSxjQUNSLGtDQUFrQzBoQixRQUFRL1AsR0FBR3pULFlBQVlyQztBQUU3RDtBQUNGO29CQUNBZ21CLE9BQUFBLDRCQUE0QkgsUUFBUS9QLEdBQUd6VCxRQUF2QzJqQixDQUFnRDFqQjtBQUNsRDtnQkFDQXZCLElBQUk4USxLQUFLO2dCQUVULElBQUlwYSxRQUFRd3VCLGdCQUFnQjtvQkFDMUI7OEJBQ1F4dUIsUUFBUXd1QjtBQUNoQixzQkFBRSxPQUFPam1CO3dCQUNQLE1BQU0sSUFBSW1FLGFBQUFBLGNBQWMscUNBQXFDbkU7QUFDL0Q7QUFDRjtBQUNGO1lBRUEsT0FBT1YsS0FBS3NHLFlBQVl1ZjtBQUMxQjtRQUVBLDJCQUFNZTtZQUNKLE1BQU1ubEIsTUFBTWlrQixrQkFBZ0Jqa0IsSUFBSUUsSUFBSTNCLEtBQUs0bUI7WUFDekMsTUFBTUMsV0FDSjdtQixLQUFLeWMsVUFBVWhjLElBQVNsQztZQUMxQixLQUFLLE1BQU1nUSxXQUFXc1ksVUFDcEI7Z0JBQ0UsSUFBSXRZLFNBQVM7b0JBQ1g5TSxJQUFJOFEsS0FBSyxpQkFBaUJoRSxRQUFRaFg7MEJBQzVCZ1gsUUFBUXVZO0FBQ2hCO0FBQ0YsY0FBRSxPQUFPcG1CO2dCQUNQZSxJQUFJaUQsTUFBTSxrQ0FBa0NoRTtBQUM5QztZQUNGO3NCQUNRbUosS0FBQUEsUUFBUWlkO0FBQ2hCLGNBQUUsT0FBT3BtQjtnQkFDUGUsSUFBSWlELE1BQU0sK0JBQStCaEU7QUFDM0M7QUFDRjs7SUFsSVcra0IsUUFBQUEsa0JBQWVDLG9CQUFBOWtCLE1BQUFBLFdBQUEsRUFGM0JtbUIsaUJBQ0F0ZSxPQUFBQSxPQUFPLENBQUEsSUFvQkh4SCxNQUFBQSxRQUFBLEdBQUFDLGNBQU81Qyx3RUFFb0I4Zix1QkFyQm5CcUg7SUM5Qk4sTUFBTXVCLDhCQUE4QnJvQixPQUN6QztJQ0RJLFNBQVVzb0IsdUJBQXVCMWdCO1FBQ3JDLE9BQU8yZ0IsYUFBYTFDLFdBQVcyQyxJQUFJQyxXQUFXN2dCO1FBRTlDLE1BQU14RSxZQUFZbWxCLGFBQWFuckIsUUFBUW1yQjtRQUV2QyxNQUFNRyxvQkFBb0J6eEIsTUFBTUMsUUFBUXV4QixXQUNwQ0EsUUFBUTl2QixJQUFLb0o7WUFDWDtnQkFDRSxXQUFXQSxFQUFFNG1CLGNBQWMsWUFBWSxPQUFPNW1CLEVBQUU0bUI7Z0JBRWhEQyxRQUFRdEUsS0FDTixvQkFBb0JsaEIsNkRBQTZEckIsOENBQThDQTtnQkFFakksY0FBY0EsTUFBTSxXQUFXQSxJQUFJb0csS0FBS0MsVUFBVXJHO0FBQ3BELGNBQUUsT0FBTzhtQjtnQkFDUEQsUUFBUXRFLEtBQUssbUNBQW1DbGhCLGNBQWN5bEI7Z0JBQzlELE9BQU92dkI7QUFDVDthQUVGbXZCLGtCQUFrQkEsUUFBUUUsY0FBYyxhQUN0Q0YsUUFBUUUscUJBQ0RGLFlBQVksV0FDakJBLFVBQ0F0Z0IsS0FBS0MsVUFBVXFnQjtRQUV2QkcsUUFBUW5sQixNQUNOLHVDQUF1Q0wsd0JBQXdCeWlCLGlCQUFpQjJDLE9BQ2hGRTtRQUdGLE9BQU8sRUFBQ3RsQixXQUFXeWlCLFdBQVcyQyxJQUFJRTtBQUNwQzs7SUNuQmFJLFFBQUFBLG1CQUFnQkMscUJBQXRCLE1BQU1ELHlCQUF5QmxlO1FBR3BDLFdBQUE5VCxDQUNFZ1UsZUFDcUN6SztZQUVyQ2EsTUFBTTRKLGVBQWVpZSxtQkFBaUIzckI7WUFDdENpRSxLQUFLNm1CLFdBQVc3bkIsU0FBUzFILElBQUt5TCxXQUFhRixhQUFnQnBDLElBQUlzQztBQUNqRTtRQUdBLE1BQUE4Z0I7WUFDRSxNQUFNbGhCLFNBQVNqQixRQUFBQSxRQUFRQyxJQUFJK2xCLG1CQUFpQjNyQjtZQUU1QyxNQUFNNHJCLFVBQVUsSUFBSUMsZ0JBQTBCQztnQkFDNUMsTUFBTUMsYUFDSixLQUFLQyxLQUFLQyxTQUFTendCLFNBQVMsSUFBSWdOLE1BQU0sR0FBRyxLQUFLMGpCO2dCQUVoRHRsQixPQUFPNFAsS0FDTCwwQkFBMEJ1Vix5QkFBeUI5bkIsS0FBS3lKLGNBQWN4SjtnQkFFeEUsTUFBTWlvQixLQUFLLElBQUE7b0JBQUssV0FBQXp5Qjt3QkFDZHVLLEtBQUE4bkIsYUFBYUE7QUFhZjtvQkFaRSxPQUFBSyxJQUFXNWhCO3dCQUNUNUQsT0FBT1AsTUFDTCxnQkFBZ0JwQyxLQUFLOG5CO3dCQUV2QixPQUFPTSxRQUFRbkssVUFBVTZGLEtBQUs7NEJBQzVCLE1BQU0xbkIsT0FBTzZxQix1QkFBdUIxZ0I7NEJBQ3BDc2hCLFNBQVNybUIsS0FBSztnQ0FBRWhNLE1BQU07Z0NBQVc0Rzs7NEJBQ2pDdUcsT0FBT1AsTUFDTCxnQkFBZ0JwQyxLQUFLOG5COztBQUczQjs7Z0JBR0ZubEIsT0FBT1IsUUFDTCx3QkFBd0IybEIscUJBQXFCOW5CLEtBQUs2bUIsU0FBU2p2QjtnQkFFN0QsS0FBSyxNQUFNMlcsV0FBV3ZPLEtBQUs2bUIsVUFBVTtvQkFDbkMsTUFBTXdCLGNBQWM5WixTQUFTOVksYUFBYXNHLFFBQVE7b0JBQ2xEO3dCQUNFNEcsT0FBT1AsTUFDTCx3QkFBd0IwbEIseUJBQXlCTzt3QkFFbkQ5WixRQUFRK1osUUFBUUo7QUFDbEIsc0JBQUUsT0FBT3huQjt3QkFDUGlDLE9BQU9QLE1BQ0wsK0JBQStCMGxCLHlCQUF5Qk8sZ0JBQWdCM25CLEdBQUdxRSxXQUFXckU7d0JBRXhGaUMsT0FBTytCLE1BQU1oRTtBQUNmO0FBQ0Y7Z0JBRUEsT0FBTztvQkFDTGlDLE9BQU9QLE1BQU0sNEJBQTRCMGxCO29CQUV6QyxLQUFLLE1BQU12WixXQUFXdk8sS0FBSzZtQixVQUFVO3dCQUNuQyxNQUFNd0IsY0FBYzlaLFNBQVM5WSxhQUFhc0csUUFBUTt3QkFDbEQ7NEJBQ0U0RyxPQUFPUCxNQUNMLDBCQUEwQjBsQiwyQkFBMkJPOzRCQUV2RDlaLFFBQVFnYSxVQUFVTDtBQUNwQiwwQkFBRSxPQUFPeG5COzRCQUNQaUMsT0FBT1AsTUFDTCxxQ0FBcUMwbEIseUJBQXlCTyxnQkFBZ0IzbkIsR0FBR3FFLFdBQVdyRTs0QkFFOUZpQyxPQUFPK0IsTUFBTWhFO0FBQ2Y7QUFDRjs7O1lBSUosTUFBTThuQix3QkFBd0I7WUFDOUIsTUFBTUMsYUFBYUMsS0FBQUEsU0FBU0YsdUJBQXVCcGYsS0FDakRDLFVBQUFBLElBQUk7Z0JBQ0YxRyxPQUFPUCxNQUFNO2dCQUVmOUssVUFBQUEsSUFDRSxPQUFBO2dCQUNFOUIsTUFBTTtnQkFDTjRHLE1BQU07b0JBQ0p1c0IsS0FBSSxJQUFJakwsTUFBT0M7OztZQU12QixPQUFPaUwsS0FBQUEsTUFBTWpCLFNBQVNjO0FBQ3hCO1FBSUEsY0FBQUksQ0FBK0J2bEI7WUFDN0IsTUFBTVgsU0FBU2pCLFFBQUFBLFFBQVFDLElBQUkrbEIsbUJBQWlCM3JCO1lBRTVDLE9BQU8sSUFBSTZyQixLQUFBQSxXQUEwQkM7Z0JBQ25DLE1BQU1LLEtBQUssSUFBQTtvQkFDVCxPQUFBQyxJQUFXNWhCO3dCQUNULE9BQU82aEIsUUFBUW5LLFVBQVU2RixLQUFLOzRCQUM1QitELFNBQVNybUIsS0FBSztnQ0FBRXBGLE1BQU1tSzs7O0FBRTFCOztnQkFHRjtvQkFDRSxLQUFLLE1BQU1nSSxXQUFXdk8sS0FBSzZtQixVQUFVO3dCQUNuQ3RZLFFBQVErWixRQUFRSjtBQUNsQjtBQUNGLGtCQUFFLE9BQU94bkI7b0JBQ1BtbkIsU0FBU25qQixNQUFNLDRCQUE0QmhFLEVBQUVxRSxXQUFXckU7QUFDMUQ7Z0JBRUEsT0FBTztvQkFDTDt3QkFDRSxLQUFLLE1BQU02TixXQUFXdk8sS0FBSzZtQixVQUFVOzRCQUNuQ3RZLFFBQVFnYSxVQUFVTDtBQUNwQjtBQUNGLHNCQUFFLE9BQU94bkI7d0JBQ1BpQyxPQUFPK0IsTUFBTWhFO0FBQ2Y7OztBQUdOOztJQWxIQUUsTUFBQUEsV0FBQSxFQURDa29CLDBJQUNTbEIsS0FBQUEsZUFnRlRILHlCQUFBbHhCLFdBQUEsVUFBQTtJQUlEcUssTUFBQUEsV0FBQSxFQUZDa29CLE9BQUFBLElBQUksWUFFVzduQixNQUFBQSxRQUFBLEdBQUE4RSxhQUFNLCtJQUF5QjZoQixLQUFBQSxlQThCOUNILHlCQUFBbHhCLFdBQUEsa0JBQUE7SUE5SFVreEIsUUFBQUEsbUJBQWdCQyxxQkFBQTltQixNQUFBQSxXQUFBLEVBRDVCNFIscUJBTUl2UixNQUFBQSxRQUFBLEdBQUFDLGNBQU84bEIsdUVBRE9ybkIsUUFBQUEscUJBQW1CL0osWUFKekI2eEI7O0lDTEFzQixRQUFBQSxvQkFBaUJDLHNCQUF2QixNQUFNRDtRQUNYLGtCQUFPRSxDQUNManFCLFVBQ0F0RyxPQUFlO1lBRWYsT0FBTztnQkFDTDZQLFFBQVF5Z0I7Z0JBQ1JwUSxhQUFhLEVBQUM2TyxRQUFBQTtnQkFDZHlCLFNBQVMsRUFDUEMsT0FBQUEsYUFBYUMsU0FBUyxFQUNwQjtvQkFDRTF3QixNQUFNQSxLQUFLOEIsUUFBUSxPQUFPO29CQUMxQitOLFFBQVF5Z0I7O2dCQUlkL2dCLFdBQVcsRUFDVHRJLFFBQUFBLHFCQUNBO29CQUNFdUksU0FBUzhlO29CQUNUcEIsVUFBVTVtQixZQUFZOzs7QUFJOUI7O0lBeEJXK3BCLFFBQUFBLG9CQUFpQkMsc0JBQUFwb0IsTUFBQUEsV0FBQSxFQUQ3QjZILE9BQUFBLE9BQU8sQ0FBQSxNQUNLc2dCOztJQ0lBTSxRQUFBQSxjQUFXQyxnQkFBakIsTUFBTUQ7UUFDWCx5QkFBYUUsQ0FDWHB4QjtZQUVBLE9BQU1xeEIsaUJBQUVBLGlCQUFlL1EsY0FBRUEsZ0JBQWlCdGdCO1lBRTFDLE1BQU0wdUIsaUJBQ0VwQix3QkFBZ0JPLGdCQUFnQjd0QjtZQUN4QyxNQUFNNkcsV0FBVzZuQixTQUFTdnZCLElBQUtpWCxXQUFZQSxRQUFReEw7WUFFbkQsTUFBTW1tQixVQU9VLEVBQUN6RCxRQUFBQSxnQkFBZ0J6ZCxRQUFRN1A7WUFFekMsSUFBSXF4QixpQkFBaUI7Z0JBQ2pCeHFCLFNBQVNrSCxRQUFTbkQ7b0JBQ2hCbW1CLFFBQVF2bEIsS0FDTm1VLGFBQWEvVSxTQUFTaUYsUUFBUWpGLFNBQVM7d0JBQ3JDMFY7d0JBQ0FGLG9CQUFvQnBnQixRQUFRb2dCO3dCQUM1QnBaLGtCQUFrQmhILFFBQVFnSDt3QkFDMUJ1WixjQUFjdmdCLFFBQVF1Z0I7OztBQUk5QjtZQUVGLElBQUl2Z0IsUUFBUXN4QixpQkFBaUJDLHNCQUFzQjtnQkFDakRSLFFBQVF2bEIsS0FDTm9sQixRQUFBQSxrQkFBa0JFLFlBQ2hCOXdCLFFBQVFzeEIsZ0JBQWdCRSxvQkFBb0IzcUI7QUFHbEQ7WUFFQSxPQUFPO2dCQUNMdUosUUFBUStnQjtnQkFDUkosU0FBU0E7O0FBRWI7O0lBNUNXRyxRQUFBQSxjQUFXQyxnQkFBQTFvQixNQUFBQSxXQUFBLEVBRHZCNkgsT0FBQUEsT0FBTyxDQUFBLE1BQ0s0Z0I7SUErQ04xaUIsZUFBZWlqQixpQkFBZ0M7SUN0RGhELFNBQVVDLGFBQWF2bUI7UUFDNUIsTUFBTXdtQixJQUFJNWUsb0JBQUFBLE1BQU16SyxJQUFJNkM7UUFDcEIsS0FBS3dtQixHQUNKLE1BQU0sSUFBSWpsQixhQUFBQSxjQUFjLGlDQUFpQ3ZCO1FBQzFELE1BQU15TSxPQUFPaEcsS0FBQUEsV0FBV0MsU0FBUzhmO1FBQ2pDLE9BQU8vWjtBQUNSO0lDc0NPLE1BQU1nYSxVQUFVO0lBUWhCLE1BQU1DLFNBQVM7SUFRZixNQUFNQyxlQUFlO0lBRXJCLE1BQU1DLGVBQWU7SUFFNUJqckIsV0FBQUEsU0FBU2tyQixvQkFBb0I7SUFDN0JsckIsV0FBQUEsU0FBU21yQixnQkFBZ0JGLGNBQWNIO0lBQ3ZDOXFCLFdBQUFBLFNBQVNrckIsb0JBQW9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9
2468
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvb3ZlcnJpZGVzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9vdmVycmlkZXMvaGVscGVycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaU9wZXJhdGlvbkZyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaVBhcmFtc0Zyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmQm9keS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmUGFyYW1zLnRzIiwiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2V4cG9zZS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2NvbnRyb2xsZXItY29uZmlnLnRzIiwiLi4vc3JjL2F1dGgvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dC50cyIsIi4uL3NyYy9hdXRoL0F1dGhJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9hdXRoL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy91dGlscy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC91dGlscy50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aEhhbmRsZXIudHMiLCIuLi9zcmMvYXV0aC9EZWNhZkF1dGhNb2R1bGUudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZkhhbmRsZXJFeGVjdXRvci50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmUmVzcG9uc2VJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9jb250cm9sbGVycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlci50cyIsIi4uL3NyYy9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL0Zyb21Nb2RlbENvbnRyb2xsZXIudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRGVjYWZNb2RlbE1vZHVsZS50cyIsIi4uL3NyYy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXJyb3JzL2NvcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvdGhyb3R0bGluZy50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvRGVjYWZFcnJvckZpbHRlci50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9Td2FnZ2VyQ3VzdG9tVUkudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJCdWlsZGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIiwiLi4vc3JjL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9jb3JlLW1vZHVsZS50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL2NvbnN0YW50LnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvdXRpbHMudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9FdmVudHNDb250cm9sbGVyLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvRGVjYWZTdHJlYW1Nb2R1bGUudHMiLCIuLi9zcmMvbW9kdWxlLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUNPUkFUT1JTX1BSRUZJWCA9IFwic3dhZ2dlclwiO1xuZXhwb3J0IGNvbnN0IERFQ09SQVRPUlMgPSB7XG4gIEFQSV9PUEVSQVRJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlPcGVyYXRpb25gLFxuICBBUElfUkVTUE9OU0U6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlSZXNwb25zZWAsXG4gIEFQSV9QUk9EVUNFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVByb2R1Y2VzYCxcbiAgQVBJX0NPTlNVTUVTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ29uc3VtZXNgLFxuICBBUElfVEFHUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVVzZVRhZ3NgLFxuICBBUElfQ0FMTEJBQ0tTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ2FsbGJhY2tzYCxcbiAgQVBJX1BBUkFNRVRFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlQYXJhbWV0ZXJzYCxcbiAgQVBJX0hFQURFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlIZWFkZXJzYCxcbiAgQVBJX01PREVMX1BST1BFUlRJRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlNb2RlbFByb3BlcnRpZXNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc0FycmF5YCxcbiAgQVBJX1NFQ1VSSVRZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2VjdXJpdHlgLFxuICBBUElfRVhDTFVERV9FTkRQT0lOVDogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVFbmRwb2ludGAsXG4gIEFQSV9FWENMVURFX0NPTlRST0xMRVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeGNsdWRlQ29udHJvbGxlcmAsXG4gIEFQSV9FWFRSQV9NT0RFTFM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRyYU1vZGVsc2AsXG4gIEFQSV9FWFRFTlNJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRlbnNpb25gLFxuICBBUElfU0NIRU1BOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2NoZW1hYCxcbiAgQVBJX0RFRkFVTFRfR0VUVEVSOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRGVmYXVsdEdldHRlcmAsXG4gIEFQSV9MSU5LOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTGlua2AsXG59O1xuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNVbmRlZmluZWQsIG5lZ2F0ZSwgcGlja0J5IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25zdHJ1Y3RvciA9ICh2YWw6IGFueSk6IGJvb2xlYW4gPT4gdmFsID09PSBcImNvbnN0cnVjdG9yXCI7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfRkFDVE9SWV9OQU1FID0gXCJfT1BFTkFQSV9NRVRBREFUQV9GQUNUT1JZXCI7XG5cbmV4cG9ydCBjb25zdCBNRVRIT0RfTUVUQURBVEEgPSBcIm1ldGhvZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICB7IG92ZXJyaWRlRXhpc3RpbmcgfSA9IHsgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZSB9XG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgaWYgKHByZXZWYWx1ZSAmJiAhb3ZlcnJpZGVFeGlzdGluZykge1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHsgLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YSB9LFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGEsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xhc3NEZWNvcmF0b3I8VCBleHRlbmRzIEFycmF5PGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUID0gW10gYXMgYW55XG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IFtdO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgWy4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGFdLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAodGFyZ2V0Py5jb25zdHJ1Y3RvciBhcyBhbnkpPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FIGFzIGFueV0/LigpW1xuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgIF0/LnR5cGUgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNaXhlZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVFxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBsZXQgbWV0YWRhdGFzOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgICAgbWV0YWRhdGFzID0gWy4uLnByZXZpb3VzTWV0YWRhdGEsIC4uLm1ldGFkYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPVxuICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSkgfHwge307XG4gICAgICAgIG1ldGFkYXRhcyA9IHsgLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGEgfTtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IHt9O1xuICAgICAgbWV0YWRhdGFzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c01ldGFkYXRhKSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhcywgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRhZGF0YTogVCxcbiAgaW5pdGlhbDogUGFydGlhbDxUPlxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICB0YXJnZXQ6IG9iamVjdCB8IEZ1bmN0aW9uLFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGNvbnN0IHBhcmFtT3B0aW9ucyA9IHtcbiAgICAgIC4uLmluaXRpYWwsXG4gICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgIH07XG5cbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUywgZGVzY3JpcHRvci52YWx1ZSkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldC5wcm90b3R5cGUpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eUtleSBvZiBwcm9wZXJ0eUtleXMpIHtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKHByb3BlcnR5S2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuXG4gICAgICBpZiAoIW1ldGhvZERlc2NyaXB0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQXBpTWV0aG9kID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcbiAgICAgICAgTUVUSE9EX01FVEFEQVRBLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzQXBpTWV0aG9kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVJc0FycmF5VHVwbGUoXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgaW5wdXQ6IEZ1bmN0aW9uIHwgW0Z1bmN0aW9uXSB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGlzQXJyYXlGbGFnOiBib29sZWFuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgcmV0dXJuIFtpbnB1dCBhcyBGdW5jdGlvbiwgaXNBcnJheUZsYWddO1xuICB9XG4gIGNvbnN0IGlzSW5wdXRBcnJheSA9IGlzQXJyYXkoaW5wdXQpO1xuICBjb25zdCB0eXBlID0gaXNJbnB1dEFycmF5ID8gaW5wdXRbMF0gOiBpbnB1dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpc1N0cmluZywgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRUeXBlSXNBcnJheVR1cGxlLCBNRVRBREFUQV9GQUNUT1JZX05BTUUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVudW1BbGxvd2VkVHlwZXMsXG4gIEVudW1TY2hlbWFBdHRyaWJ1dGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbiAgU3dhZ2dlckVudW1UeXBlLFxufSBmcm9tIFwiLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNVbmRlZmluZWQgPSAob2JqOiBhbnkpOiBvYmogaXMgdW5kZWZpbmVkID0+XG4gIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKFxuICBlbnVtVHlwZTogU3dhZ2dlckVudW1UeXBlIHwgKCgpID0+IFN3YWdnZXJFbnVtVHlwZSlcbik6IHN0cmluZ1tdIHwgbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIGVudW1UeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZ2V0RW51bVZhbHVlcyhlbnVtVHlwZSgpKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGVudW1UeXBlKSkge1xuICAgIHJldHVybiBlbnVtVHlwZSBhcyBzdHJpbmdbXTtcbiAgfVxuICBpZiAodHlwZW9mIGVudW1UeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIEVudW1zIHdpdGggbnVtZXJpYyB2YWx1ZXNcbiAgLy8gICBlbnVtIFNpemUge1xuICAvLyAgICAgU01BTEwgPSAxLFxuICAvLyAgICAgQklHID0gMlxuICAvLyAgIH1cbiAgLy8gYXJlIHRyYW5zcGlsZWQgdG8gaW5jbHVkZSBhIHJldmVyc2UgbWFwcGluZ1xuICAvLyAgIGNvbnN0IFNpemUgPSB7XG4gIC8vICAgICBcIjFcIjogXCJTTUFMTFwiLFxuICAvLyAgICAgXCIyXCI6IFwiQklHXCIsXG4gIC8vICAgICBcIlNNQUxMXCI6IDEsXG4gIC8vICAgICBcIkJJR1wiOiAyLFxuICAvLyAgIH1cbiAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAubWFwKCh2YWx1ZTogYW55KSA9PiB2YWx1ZS50b1N0cmluZygpKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhbnVtZXJpY1ZhbHVlcy5pbmNsdWRlcyhrZXkpKVxuICAgIC5tYXAoKGtleSkgPT4gZW51bVR5cGVba2V5IGFzIGFueV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVR5cGUodmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIge1xuICBjb25zdCBoYXNTdHJpbmcgPSB2YWx1ZXMuZmlsdGVyKGlzU3RyaW5nKS5sZW5ndGggPiAwO1xuICByZXR1cm4gaGFzU3RyaW5nID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lc3QganMgY29kZVxuICAgICAgICB0YXJnZXQ/LmNvbnN0cnVjdG9yPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FXT8uKClbcHJvcGVydHlLZXldPy50eXBlID8/XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBEZWZhdWx0IHRvIG9wdGlvbmFsIHVubGVzcyBAcmVxdWlyZWQoKSBpcyB1c2VkXG4gICAgICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG4gIH0pIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgPSBTY2hlbWFPYmplY3RNZXRhZGF0YSAmIHtcbiAgXCJ4LWVudW1OYW1lc1wiPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMYXp5IGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBmb3Igd2hpY2ggdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICAgKiBjYW4gYmUgdXNlZCBhcyBhbiBpZFxuICAgKlxuICAgKiBVc2UgdG9nZXRoZXIgd2l0aCBAQXBpRGVmYXVsdEdldHRlciBvbiB0aGUgZ2V0dGVyIHJvdXRlIG9mIHRoZSB0eXBlXG4gICAqIHRvIGdlbmVyYXRlIE9wZW5BUEkgbGluayBvYmplY3RzXG4gICAqXG4gICAqIEBzZWUgW1N3YWdnZXIgbGluayBvYmplY3RzXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2xpbmtzLylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgbGluaz86ICgpID0+IFR5cGU8dW5rbm93bj4gfCBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5T3B0aW9ucyA9XG4gIHwgQXBpUHJvcGVydHlDb21tb25PcHRpb25zXG4gIHwgKEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyAmIHtcbiAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICBlbnVtU2NoZW1hPzogRW51bVNjaGVtYUF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbmNvbnN0IGlzRW51bUFycmF5ID0gKFxuICBvcHRzOiBBcGlQcm9wZXJ0eU9wdGlvbnNcbik6IG9wdHMgaXMge1xuICBpc0FycmF5OiB0cnVlO1xuICBlbnVtOiBFbnVtQWxsb3dlZFR5cGVzO1xuICB0eXBlOiBhbnk7XG4gIGl0ZW1zOiBhbnk7XG59ID0+IChvcHRzLmlzQXJyYXkgJiYgXCJlbnVtXCIgaW4gb3B0cyAmJiBvcHRzLmVudW0gIT09IHVuZGVmaW5lZCkgYXMgYm9vbGVhbjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQcm9wZXJ0eShcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9LFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICBjb25zdCBbdHlwZSwgaXNBcnJheV0gPSBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICAgIG9wdGlvbnMudHlwZSxcbiAgICBvcHRpb25zLmlzQXJyYXkgYXMgYW55XG4gICk7XG4gIG9wdGlvbnMgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0eXBlLFxuICAgIGlzQXJyYXksXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zO1xuXG4gIGlmIChpc0VudW1BcnJheShvcHRpb25zKSkge1xuICAgIG9wdGlvbnMudHlwZSA9IFwiYXJyYXlcIjtcblxuICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBnZXRFbnVtVmFsdWVzKG9wdGlvbnMuZW51bSk7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IGdldEVudW1UeXBlKGVudW1WYWx1ZXMpLFxuICAgICAgZW51bTogZW51bVZhbHVlcyxcbiAgICB9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgZGVsZXRlIG9wdGlvbnMuZW51bTtcbiAgfSBlbHNlIGlmIChcImVudW1cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuZW51bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcblxuICAgIG9wdGlvbnMuZW51bSA9IGVudW1WYWx1ZXM7XG4gICAgb3B0aW9ucy50eXBlID0gZ2V0RW51bVR5cGUoZW51bVZhbHVlcyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnR5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuICAgIG9wdGlvbnMuaXRlbXMgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGVbMF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoXG4gICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFUyxcbiAgICBvcHRpb25zLFxuICAgIG92ZXJyaWRlRXhpc3RpbmdcbiAgKTtcbn1cbiIsImltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLCBHZXRdLFxuICAgIFBPU1Q6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgUG9zdF0sXG4gICAgUFVUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIFB1dF0sXG4gICAgUEFUQ0g6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUGF0Y2hdLFxuICAgIERFTEVURTogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aCA/IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIFwiYnVsa1wiIGFzIGFueSwgY3J1ZE9wIGFzIGFueSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrVGFyZ2V0KFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6XG4gIHwgeyBraW5kOiBcImNydWRcIiB8IFwic3RhdGVtZW50XCIgfCBcInF1ZXJ5XCIgfCBcImJ1bGtcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICBjb25zdCBzdGF0ZW1lbnRUYXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCI6IFwic3RhdGVtZW50XCIsXG4gICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgfTtcblxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJxdWVyeVwiLCB2YWx1ZTogbm9ybWFsaXplZC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKSB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdGVtZW50VmFsdWUgPSBzdGF0ZW1lbnRUYXJnZXRzW25vcm1hbGl6ZWRdO1xuICBpZiAoc3RhdGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInN0YXRlbWVudFwiLCB2YWx1ZTogc3RhdGVtZW50VmFsdWUgfTtcbiAgfVxuXG4gIGlmICh2ZXJiID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImNydWRcIiwgdmFsdWU6IE9wZXJhdGlvbktleXMuUkVBRCB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpUGFyYW0gYXMgQXBpUGFyYW1EZWMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgc2V0IG9mIFN3YWdnZXIgYEBBcGlQYXJhbWAgZGVjb3JhdG9ycyBnZW5lcmF0ZWQgZnJvbSBhIHR5cGVkIHNwZWNpZmljYXRpb24gYXJyYXkuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIGVhY2ggZW50cnkgb2YgdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBpbnRvIGEgY29ycmVzcG9uZGluZyBgQEFwaVBhcmFtKClgIGRlY29yYXRvciAoZGVmYXVsdGluZyBgZGVzY3JpcHRpb25gLCBgcmVxdWlyZWRgLCBhbmQgYHR5cGVgIHdoZW4gb21pdHRlZCkgYW5kIGNvbXBvc2VzIHRoZW0gaW50byBhIHNpbmdsZSBkZWNvcmF0b3IgdmlhIE5lc3QncyBgYXBwbHlEZWNvcmF0b3JzYC4gVXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIHJ1bnRpbWUgcm91dGUgcGFyYW1zIHdpdGggT3BlbkFQSSBkb2N1bWVudGF0aW9uIGluIGEgY29uY2lzZSwgZGVjbGFyYXRpdmUgd2F5LlxuICogQHBhcmFtIHtBcGlQYXJhbVtdfSBbcHJvcHM9W11dIEFycmF5IGRlc2NyaWJpbmcgcGF0aCBwYXJhbWV0ZXJzIHRvIGJlIGRvY3VtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHNbXS5uYW1lIFRoZSBwYXJhbWV0ZXIncyBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHJvdXRlIHRlbXBsYXRlIChlLmcuLCBgOmlkYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BzW10uZGVzY3JpcHRpb25dIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXI7IGRlZmF1bHRzIHRvIGBcIlBhdGggcGFyYW1ldGVyOiA8bmFtZT5cImAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wc1tdLnJlcXVpcmVkPXRydWVdIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZDsgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBbcHJvcHNbXS50eXBlPVN0cmluZ10gQ29uc3RydWN0b3IvdHlwZSB1c2VkIGJ5IFN3YWdnZXIgdG8gaW5mZXIgc2NoZW1hIChlLmcuLCBgU3RyaW5nYCwgYE51bWJlcmAsIGBVVUlEYCwgY3VzdG9tIGNsYXNzKS5cbiAqIEByZXR1cm4ge2FueX0gQSBjb21wb3NlZCBkZWNvcmF0b3IgYXBwbHlpbmcgYWxsIGdlbmVyYXRlZCBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXQgbWV0aG9kIG9yIGNvbnRyb2xsZXIuXG4gKiBAZnVuY3Rpb24gQXBpUGFyYW1zRnJvbU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWwoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBkZWNvcmF0b3JzID0gcHJvcHMubWFwKChwKSA9PlxuICAgIEFwaVBhcmFtRGVjKHtcbiAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uID8/IGBQYXRoIHBhcmFtZXRlcjogJHtwLm5hbWV9YCxcbiAgICAgIHJlcXVpcmVkOiBwLnJlcXVpcmVkID8/IHRydWUsXG4gICAgICAvLyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHR5cGU6IHAudHlwZSA/PyBTdHJpbmcsXG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNvcmF0b3JzKTtcbn1cbiIsImltcG9ydCB7XG4gIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VzdG9tIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGluc3RhbnRpYXRlcyBpdCB1c2luZyB0aGUgTW9kZWwgY29uc3RydWN0b3JcbiAqIGZvdW5kIG9uIHRoZSBjb250cm9sbGVyLiBIYW5kbGVzIGJvdGggc2luZ2xlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlY2FmQm9keSA9IGNyZWF0ZVBhcmFtRGVjb3JhdG9yKFxuICAoZGF0YTogdW5rbm93biwgY3R4OiBFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keTtcblxuICAgIC8vIFRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyIHdpbGwgaGF2ZSAnTW9kZWxDb25zdHInIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjdHguZ2V0Q2xhc3MoKTtcbiAgICAvLyBXZSBhY2Nlc3MgdGhlIHN0YXRpYyBwcm9wZXJ0eSB3ZSB3aWxsIGFkZCB0byB0aGUgRHluYW1pY01vZGVsQ29udHJvbGxlclxuICAgIGNvbnN0IE1vZGVsQ29uc3RyID0gKGNvbnRyb2xsZXIgYXMgYW55KS5jbGFzcztcblxuICAgIGlmICghTW9kZWxDb25zdHIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxuICAgICAgICBgTW9kZWxDb25zdHJ1Y3RvciBub3QgZm91bmQgb24gY29udHJvbGxlciAke2NvbnRyb2xsZXIubmFtZX0uIEVuc3VyZSB0aGUgY29udHJvbGxlciB3YXMgY3JlYXRlZCB2aWEgRnJvbU1vZGVsQ29udHJvbGxlci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYm9keSkgcmV0dXJuIGJvZHk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkubWFwKChpdGVtKSA9PiBuZXcgTW9kZWxDb25zdHIoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWxDb25zdHIoYm9keSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXJhbURlY29yYXRvciwgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZQYXJhbVByb3BzLCBEZWNhZkFwaVByb3BlcnR5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjdXN0b20gTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBleHRyYWN0cyBhbmQgcmV0dXJucyByb3V0ZSBwYXJhbWV0ZXJzIG9yZGVyZWQgYnkgYSBzcGVjaWZpYyBrZXkgc2VxdWVuY2UuXG4gKiBAc3VtbWFyeSBUaGUgYE9yZGVyZWRQYXJhbXNgIGRlY29yYXRvciByZWFkcyB0aGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0J3MgYHBhcmFtc2Agb2JqZWN0LCBvcHRpb25hbGx5IG9yZGVycyBpdCBhY2NvcmRpbmcgdG8gYSBwcm92aWRlZCBsaXN0IG9mIHBhcmFtZXRlciBuYW1lcywgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcmFtcywgdGhlIG9yZGVyZWQgdmFsdWVzLCBhbmQgdGhlIGFwcGxpZWQgb3JkZXIgbGlzdC4gVGhpcyBlbnN1cmVzIGRldGVybWluaXN0aWMgcGFyYW1ldGVyIGFjY2VzcyBmb3Igcm91dGVzIHdpdGggbXVsdGlwbGUgcGF0aCBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIHtzdHJpbmdbXX0gVE9yZGVyIC0gUmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzLlxuICogQHBhcmFtIHtUT3JkZXIgfCB1bmRlZmluZWR9IG9yZGVyIEFuIG9wdGlvbmFsIGFycmF5IHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlciBuYW1lcycgZGVzaXJlZCBvcmRlci4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBgcmVxLnBhcmFtc2Agb2JqZWN0LlxuICogQHBhcmFtIHtFeGVjdXRpb25Db250ZXh0fSBjdHggVGhlIE5lc3RKUyBleGVjdXRpb24gY29udGV4dCwgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICogQHJldHVybiB7RGVjYWZQYXJhbVByb3BzfSBBbiBvYmplY3QgY29udGFpbmluZzpcbiAqIC0gYG9yaWdpbmFsYDogdGhlIHJhdyBwYXJhbWV0ZXIgbWFwIGZyb20gYHJlcS5wYXJhbXNgO1xuICogLSBgb3JkZXJlZGA6IGFuIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlIHJlcXVlc3RlZCBvcmRlcjtcbiAqIC0gYG9yZGVyYDogdGhlIGVmZmVjdGl2ZSBvcmRlciBsaXN0IHVzZWQuXG4gKiBAZnVuY3Rpb24gT3JkZXJlZFBhcmFtc1xuICovXG5jb25zdCBPcmRlcmVkUGFyYW1zID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChvcmRlcjogc3RyaW5nW10gfCB1bmRlZmluZWQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IERlY2FmUGFyYW1Qcm9wcyA9PiB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChyZXE/LnBhcmFtcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBvcmRlckxpc3QgPSBvcmRlciA/PyBPYmplY3Qua2V5cyhvcmlnaW5hbCk7XG4gICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyTGlzdC5tYXAoKGspID0+IG9yaWdpbmFsW2tdKTtcbiAgICByZXR1cm4geyByYXc6IG9yaWdpbmFsLCB2YWx1ZXNJbk9yZGVyOiBvcmRlcmVkLCBrZXlzSW5PcmRlcjogb3JkZXJMaXN0IH07XG4gIH1cbik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgaGlnaGVyLWxldmVsIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgbGV2ZXJhZ2VzIGBPcmRlcmVkUGFyYW1zYCB0byBleHRyYWN0IHJvdXRlIHBhcmFtZXRlcnMgaW4gYSBzcGVjaWZpYyBvcmRlciBkZXJpdmVkIGZyb20gYSBsaXN0IG9mIGBBcGlQYXJhbWAgZGVmaW5pdGlvbnMuXG4gKiBAc3VtbWFyeSBgRGVjYWZQYXJhbXNgIGNvbXB1dGVzIHRoZSBvcmRlciBvZiByb3V0ZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgQXBpUGFyYW1bXWAgc3BlY2lmaWNhdGlvbiAodXNpbmcgZWFjaCBlbGVtZW504oCZcyBgbmFtZWApLCB0aGVuIGFwcGxpZXMgYE9yZGVyZWRQYXJhbXMob3JkZXIpYCBhcyBhIHBhcmFtZXRlciBkZWNvcmF0b3IuIFRoaXMgZW5hYmxlcyBwYXJhbWV0ZXItbGV2ZWwgYmluZGluZyB0aGF0IHJlbWFpbnMgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGVkIEFQSSBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucyB3aG9zZSBgbmFtZWAgZmllbGRzIGRldGVybWluZSB0aGUgcGFyYW1ldGVyIGV4dHJhY3Rpb24gb3JkZXIuXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IEEgTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBjb250cm9sbGVyIG1ldGhvZCBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlY2FmUGFyYW1zKFxuICBwcm9wczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIGNvbnN0IG9yZGVyID0gcHJvcHMubWFwKChwKSA9PiBwLm5hbWUpO1xuICByZXR1cm4gT3JkZXJlZFBhcmFtcyhvcmRlcik7XG59XG5cbmV4cG9ydCBjb25zdCBEZWNhZlF1ZXJ5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChfOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxLnF1ZXJ5ID8/IHt9O1xuXG4gICAgY29uc3QgcGFyc2VkOiBhbnkgPSB7IC4uLnF1ZXJ5IH07XG5cbiAgICAvLyBQYXJzZSBsaW1pdCAmIG9mZnNldFxuICAgIGlmIChwYXJzZWQubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQubGltaXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5saW1pdCA9IG47XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZC5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQub2Zmc2V0KTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBwYXJzZWQub2Zmc2V0ID0gbjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBib29rbWFyayBvbmx5IGlmIG51bWVyaWNcbiAgICBpZiAocGFyc2VkLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG4gPSBOdW1iZXIocGFyc2VkLmJvb2ttYXJrKTtcbiAgICAgIHBhcnNlZC5ib29rbWFyayA9IE51bWJlci5pc05hTihuKSA/IHBhcnNlZC5ib29rbWFyayA6IG47XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEFkYXB0ZXJGbGFncywgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9NT0RVTEVfT1BUSU9OUyA9IFwiRGVjYWZNb2R1bGVPcHRpb25zXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQURBUFRFUl9JRCA9IFwiRGVjYWZBZGFwdGVyXCI7XG5leHBvcnQgY29uc3QgREVDQUZfVEFTS19TRVJWSUNFX0lEID0gXCJEZWNhZlRhc2tTZXJ2aWNlXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9ST1VURSA9IFwiRGVjYWZSb3V0ZVwiO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0hBTkRMRVJTID0gU3ltYm9sKFwiRGVjYWZIYW5kbGVyc1wiKTtcbmV4cG9ydCBjb25zdCBERUNBRl9FWFBPU0UgPSBcIkRlY2FmRXhwb3NlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgPSBcIkRlY2FmQ29udHJvbGxlckNvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgREVDQUZfQ09OVEVYVF9LRVkgPSBTeW1ib2woXCJkZWNhZjpjb250ZXh0XCIpO1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckZsYWdzPExPRyBleHRlbmRzIExvZ2dlciA9IExvZ2dlcj4gPVxuICBBZGFwdGVyRmxhZ3M8TE9HPiAmIHtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGVjYWZTZXJ2ZXJDdHggPSBDb250ZXh0PERlY2FmU2VydmVyRmxhZ3M+O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3NlKC4uLmZsYXZvdXJzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gZXhwb3NlKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgREVDQUZfRVhQT1NFLFxuICAgICAgKGZsYXZvdXJzLmxlbmd0aCA/IGZsYXZvdXJzIDogdHJ1ZSkgYXMgYW55XG4gICAgKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENsYXNzIGRlY29yYXRvciB0aGF0IGF0dGFjaGVzIGEge0BsaW5rIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWd9IHRvIGEgTW9kZWwsXG4gKiBzbyBgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUoKWAgY2FuIHBhc3MgaXQgdG8gYE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlKClgLlxuICpcbiAqIFRoZSBwZXItbW9kZWwgY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBtb2R1bGUtbGV2ZWwgYGNvbnRyb2xsZXJDb25maWdgXG4gKiBvcHRpb24gaW4gYERlY2FmTW9kdWxlT3B0aW9uc2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBAY29udHJvbGxlckNvbmZpZyh7IGFsbG93R3JvdXBpbmdRdWVyaWVzOiB0cnVlLCBhbGxvd0J1bGtTdGF0ZW1lbnQ6IHsgY3JlYXRlOiB0cnVlLCByZWFkOiB0cnVlLCB1cGRhdGU6IGZhbHNlLCBkZWxldGU6IHRydWUgfSB9KVxuICogQG1vZGVsKClcbiAqIGNsYXNzIE9yZGVyIGV4dGVuZHMgTW9kZWw8T3JkZXI+IHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBGYWN0b3J5IGNvbmZpZ3VyYXRpb24ga25vYnMgKGFsbG93U3RhdGVtZW50bGVzc1F1ZXJ5LCBhbGxvd0dyb3VwaW5nUXVlcmllcywgYWxsb3dCdWxrU3RhdGVtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWcoY29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KHRhcmdldCwgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIGNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgQVVUSF9IQU5ETEVSID0gU3ltYm9sKFwiQVVUSF9IQU5ETEVSXCIpO1xuZXhwb3J0IGNvbnN0IEFVVEhfTUVUQV9LRVkgPSBcImF1dGg6bWV0YVwiO1xuZXhwb3J0IGNvbnN0IElTX1BVQkxJQ19LRVkgPSBcImlzUHVibGljXCI7XG5leHBvcnQgY29uc3QgUkVRVUlSRURfUk9MRVNfS0VZID0gXCJyZXF1aXJlZFJvbGVzXCI7XG5leHBvcnQgY29uc3QgU0tJUF9NT0RFTF9ST0xFU19LRVkgPSBcInNraXBNb2RlbFJvbGVzXCI7XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSRVFVRVNUIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RDb250ZXh0PFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIFJlcXVlc3RDb250ZXh0PFJlcXVlc3Q+IHtcbiAgdXVpZCA9IFVVSUQuaW5zdGFuY2UuZ2VuZXJhdGUoKTtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFJFUVVFU1QpIHByaXZhdGUgcmVhZG9ubHkgcmVxOiBSZXF1ZXN0KSB7XG4gICAgc3VwZXIoXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnNPZjogKHJlcXVlc3Q6IFJlcXVlc3QpID0+IChyZXF1ZXN0IGFzIGFueSk/LmhlYWRlcnMgfHwgdW5kZWZpbmVkLFxuICAgICAgfSBhcyBhbnksXG4gICAgICByZXFcbiAgICApO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJoZWFkZXJzXCIgYXMgYW55KTtcbiAgfVxuXG4gIHB1dChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pIHtcbiAgICBsZXQgb3ZlcnJpZGVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG92ZXJyaWRlcyA9IHRoaXMuZ2V0KFwib3ZlcnJpZGVzXCIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIG92ZXJyaWRlcyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuYWNjdW11bGF0ZSh7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5hc3NpZ24ob3ZlcnJpZGVzLCByZWNvcmQpLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0b3IgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7XG4gIEFVVEhfSEFORExFUixcbiAgQVVUSF9NRVRBX0tFWSxcbiAgSVNfUFVCTElDX0tFWSxcbiAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIX0hBTkRMRVIpIHByaXZhdGUgcmVhZG9ubHkgYXV0aEhhbmRsZXI/OiBBdXRoSGFuZGxlclxuICApIHt9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KFxuICAgIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBuZXh0OiBDYWxsSGFuZGxlclxuICApOiBQcm9taXNlPE9ic2VydmFibGU8YW55Pj4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuXG4gICAgY29uc3QgaXNQdWJsaWMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxib29sZWFuPihJU19QVUJMSUNfS0VZLCBbXG4gICAgICBjdHguZ2V0SGFuZGxlcigpLFxuICAgICAgY3R4LmdldENsYXNzKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBtb2RlbE5hbWUgPVxuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihcbiAgICAgICAgQVVUSF9NRVRBX0tFWSxcbiAgICAgICAgY3R4LmdldEhhbmRsZXIoKVxuICAgICAgKSA/P1xuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihBVVRIX01FVEFfS0VZLCBjdHguZ2V0Q2xhc3MoKSk7XG5cbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICAgICAgW2N0eC5nZXRIYW5kbGVyKCksIGN0eC5nZXRDbGFzcygpXVxuICAgICk7XG5cbiAgICBjb25zdCBza2lwTW9kZWxSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KFxuICAgICAgU0tJUF9NT0RFTF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU1vZGVsID0gc2tpcE1vZGVsUm9sZXMgPyB1bmRlZmluZWQgOiBtb2RlbE5hbWU7XG5cbiAgICBsb2cudmVyYm9zZShgSW50ZXJjZXB0ZWQgcmVxdWVzdCR7bW9kZWxOYW1lID8gYCBmb3IgJHttb2RlbE5hbWV9YCA6IFwiXCJ9YCk7XG5cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUHVibGljIHJvdXRlIOKAlCBza2lwcGluZyBhdXRoYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmF1dGhIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhIYW5kbGVyLmF1dGhvcml6ZShcbiAgICAgICAgY3R4LFxuICAgICAgICBlZmZlY3RpdmVNb2RlbCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgICAgcmVxdWlyZWRSb2xlcyxcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKGBObyBhdXRoIGhhbmRsZXIgcmVnaXN0ZXJlZGApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybWVycyBydW4gQUZURVIgYXV0aCBzbyB0aGV5IGNhbiByZWFkIGF1dGgtcG9wdWxhdGVkIGZpZWxkc1xuICAgIC8vIChlLmcuIGB1c2VyYCkgZnJvbSB0aGUgY29udGV4dCBhbmQgbWFwIHRoZW0gdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzXG4gICAgLy8gKGUuZy4gYFVVSURgIGZvciBSYW1BZGFwdGVyJ3MgQGNyZWF0ZWRCeS9AdXBkYXRlZEJ5IGhhbmRsZXJzKS5cbiAgICBhd2FpdCB0aGlzLmFwcGx5VHJhbnNmb3JtZXJzKCk7XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcInVzZXJcIiBhcyBhbnkpO1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbiA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0T3JVbmRlZmluZWQoXG4gICAgICBcIm9yZ2FuaXphdGlvblwiIGFzIGFueVxuICAgICk7XG4gICAgaWYgKHVzZXIgfHwgb3JnYW5pemF0aW9uKSB7XG4gICAgICBjb25zdCBjdXJyZW50TG9nID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXQoXCJsb2dnZXJcIiBhcyBhbnkpO1xuICAgICAgY29uc3QgY2hpbGRMb2cgPSBjdXJyZW50TG9nLmZvcih7IHVzZXIsIG9yZ2FuaXphdGlvbiB9KTtcbiAgICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZSh7IGxvZ2dlcjogY2hpbGRMb2cgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5VHJhbnNmb3JtZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZsYXZvdXJzID0gQWRhcHRlci5mbGF2b3Vyc1RvVHJhbnNmb3JtKCk7XG4gICAgaWYgKCFmbGF2b3VycykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBmbGF2b3VyIG9mIGZsYXZvdXJzKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoXG4gICAgICAgIGZsYXZvdXJcbiAgICAgICkgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT47XG4gICAgICBpZiAoIXRyYW5zZm9ybWVyKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gKHRyYW5zZm9ybWVyIGFzIGFueSkuZnJvbVxuICAgICAgICA/IHRyYW5zZm9ybWVyXG4gICAgICAgIDogbmV3ICh0cmFuc2Zvcm1lciBhcyBhbnkpKCk7XG4gICAgICBjb25zdCBmcm9tID0gYXdhaXQgaW5zdGFuY2UuZnJvbSh0aGlzLnJlcXVlc3RDb250ZXh0KTtcbiAgICAgIGlmIChmcm9tKSB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoZnJvbSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseURlY29yYXRvcnMsIFNldE1ldGFkYXRhLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFwaUJlYXJlckF1dGgsIEFwaVNlY3VyaXR5IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgQVVUSF9NRVRBX0tFWSwgSVNfUFVCTElDX0tFWSwgUkVRVUlSRURfUk9MRVNfS0VZIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGgobW9kZWw/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICBjb25zdCByZXNvdXJjZSA9IG1vZGVsXG4gICAgPyB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbW9kZWxcbiAgICAgIDogbW9kZWwubmFtZVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkZWNzID0gW0FwaUJlYXJlckF1dGgoKSwgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcildO1xuICBpZiAocmVzb3VyY2UpIGRlY3MucHVzaChTZXRNZXRhZGF0YShBVVRIX01FVEFfS0VZLCByZXNvdXJjZSkpO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVibGljKCkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFNldE1ldGFkYXRhKElTX1BVQkxJQ19LRVksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVpcmVSb2xlcyguLi5yb2xlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhcbiAgICBBcGlTZWN1cml0eShcImJlYXJlclwiKSxcbiAgICBTZXRNZXRhZGF0YShSRVFVSVJFRF9ST0xFU19LRVksIHJvbGVzKSxcbiAgICBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKVxuICApO1xufVxuIiwiaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbi8qKlxuICogTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHZlcmIgLSBIVFRQIHZlcmIgdG8gYmUgY29udmVydGVkIChlLmcuIEdFVCwgUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKS5cbiAqIEByZXR1cm5zIEEgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYi5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYiBpcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXBwZWRcbiAqIHRvIGEgTmVzdEpTIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEh0dHBWZXJiVG9EZWNvcmF0b3IoXG4gIHZlcmI6IEh0dHBWZXJic1xuKTogKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxIdHRwVmVyYnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3I+ID0ge1xuICAgIEdFVDogR2V0LFxuICAgIFBPU1Q6IFBvc3QsXG4gICAgUFVUOiBQdXQsXG4gICAgUEFUQ0g6IFBhdGNoLFxuICAgIERFTEVURTogRGVsZXRlLFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvciA9IGh0dHBUb0NydWRbdmVyYl07XG5cbiAgaWYgKCFkZWNvcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCBIVFRQIHZlcmIgXCIke3ZlcmJ9XCIuIE5vIE5lc3RKUyBkZWNvcmF0b3IgbWFwcGluZyB3YXMgZm91bmQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuIiwiaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgdHlwZSBEZWNvcmF0b3JCdW5kbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBEZWNhZkFwaVByb3BlcnR5LFxuICB0eXBlIERlY2FmUGFyYW1Qcm9wcyxcbiAgRGVjYWZQYXJhbXMsXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFJlcG8sXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIdHRwVmVyYlRvRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy91dGlsc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5jb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChyb3V0ZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgcmV0dXJuIHJvdXRlUGF0aFxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwKSA9PiBwLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgIC5tYXAoKHApID0+IHAuc2xpY2UoMSkpO1xufTtcblxuY29uc3QgYXBpUGFyYW1TcGVjID0gKG5hbWU6IHN0cmluZyk6IERlY2FmQXBpUHJvcGVydHkgPT4gKHtcbiAgbmFtZSxcbiAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbn0pO1xuXG5mdW5jdGlvbiB0b0RlY2FmRXJyb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyb3I7XG4gIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWAgOiBmYWxsYmFja01lc3NhZ2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaURlY29yYXRvcnMoXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgcm91dGVQYXRoOiBzdHJpbmcsXG4gIGh0dHBWZXJiOiBIdHRwVmVyYnMsXG4gIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4pOiBEZWNvcmF0b3JCdW5kbGUge1xuICBjb25zdCBOZXN0SHR0cFJvdXRlRGVjID0gSHR0cFZlcmJUb0RlY29yYXRvcihodHRwVmVyYik7XG4gIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcChhcGlQYXJhbVNwZWMpO1xuXG4gIGNvbnN0IHN3YWdnZXJRdWVyeVBhcmFtcyA9IFtdO1xuICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgc3dhZ2dlclF1ZXJ5UGFyYW1zLnB1c2goXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1ldGhvZDogW1xuICAgICAgTmVzdEh0dHBSb3V0ZURlYyhyb3V0ZVBhdGgpLFxuICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoQXBpUGFyYW0pLFxuICAgICAgLi4uc3dhZ2dlclF1ZXJ5UGFyYW1zLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgYWNjb3JkaW5nIHRvIFwiJHttZXRob2ROYW1lfVwiLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuYCxcbiAgICAgIH0pLFxuICAgIF0sXG4gICAgcGFyYW1zOiBbRGVjYWZQYXJhbXMoYXBpUGF0aFBhcmFtcyksIFF1ZXJ5KCldLCAvLyAsIERlY2FmQm9keSgpXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXBpRGVjb3JhdG9ycyhcbiAgdGFyZ2V0OiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yLFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JCdW5kbGVcbikge1xuICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgZGVjb3JhdG9ycy5tZXRob2QuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICBkZWNvcmF0b3JzLnBhcmFtcz8uZm9yRWFjaCgoZCwgaW5kZXgpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VNZXRob2Q8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgcGVyc2lzdGVuY2U6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4sXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbik6IGFueSB7XG4gIGlmIChwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSkge1xuICAgIHJldHVybiB0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgOiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpO1xuXG4gIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlSGFuZGxlcjxUPihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICB0aGlzOiBEZWNhZk1vZGVsQ29udHJvbGxlcjxhbnk+LFxuICAgIHBhdGhQYXJhbXM6IERlY2FmUGFyYW1Qcm9wcyxcbiAgICBxdWVyeVBhcmFtczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbG9nOiBMb2dnZXIgPSB0aGlzLmxvZy5mb3IobWV0aG9kTmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgSW52b2tpbmcgcGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIGdpdmVuIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocGF0aFBhcmFtcy52YWx1ZXNJbk9yZGVyKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0LCBvZmZzZXQgfSA9IHF1ZXJ5UGFyYW1zO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZChcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSh0aGlzLmN0eCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyB0b0RlY2FmRXJyb3IoZSwgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHtcbiAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgaGFuZGxlcj86IFR5cGU8QXV0aEhhbmRsZXI+O1xufTtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICBvcHRpb25zOiBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge31cbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBEeW5hbWljTW9kdWxlW1wicHJvdmlkZXJzXCJdID0gW1xuICAgICAgQXV0aEludGVyY2VwdG9yLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBVVRIX0hBTkRMRVIsXG4gICAgICAgIHVzZUNsYXNzOiBvcHRpb25zLmhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICAgIChwcm92aWRlcnMgYXMgYW55W10pLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgIHVzZUV4aXN0aW5nOiBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkF1dGhNb2R1bGUsXG4gICAgICBnbG9iYWw6IG9wdGlvbnMuZ2xvYmFsID8/IGZhbHNlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0czogW0F1dGhJbnRlcmNlcHRvciwgQVVUSF9IQU5ETEVSXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBEZWNhZlJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUNBRl9IQU5ETEVSUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QsXG4gKiBwcm92aWRpbmcgdGhlbSB3aXRoIGEgc2hhcmVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fS5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgYW5kIGV4ZWN1dGluZ1xuICogYSBzZXF1ZW5jZSBvZiByZXF1ZXN0IGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIHNhbWUgcmVxdWVzdC1zY29wZWQgY29udGV4dCxcbiAqIGFsbG93aW5nIGNvb3JkaW5hdGVkIHByb2Nlc3Npbmcgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbWV0YWRhdGEgZXh0cmFjdGlvbiwgYXVkaXRpbmcsXG4gKiBhbmQgY3VzdG9tIHBpcGVsaW5lIGJlaGF2aW9yLiBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgdmlhIHRoZSB7QGxpbmsgREVDQUZfSEFORExFUlN9IHRva2VuLFxuICogZW5zdXJpbmcgZXh0ZW5zaWJpbGl0eSBhbmQgbG9vc2UgY291cGxpbmcuXG4gKlxuICogQGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBFeGFtcGxlIGhhbmRsZXI6XG4gKiBjbGFzcyBBdXRoSGFuZGxlciBpbXBsZW1lbnRzIERlY2FmUmVxdWVzdEhhbmRsZXIge1xuICogICBhc3luYyBoYW5kbGUoY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgcmVxOiBSZXF1ZXN0KSB7XG4gKiAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl07XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gTXlTZXJ2aWNlLmRvU29tZXRoaW5nKHRva2VuKTtcbiAqICAgICBjb250ZXh0LnNldChcIm15LWtleVwiLCByZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gRXhlY3V0b3IgdXNhZ2UgaW4gYSByZXF1ZXN0OlxuICogYXdhaXQgZXhlY3V0b3IuZXhlYyhyZXF1ZXN0KTtcbiAqIC8vIEFsbCBoYW5kbGVycyB3aWxsIHJ1biBpbiBzZXF1ZW5jZVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckFcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQlxuICpcbiAqICAgICBDbGllbnQtPj5FeGVjdXRvcjogZXhlYyhyZXEpXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQTogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQS0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQjogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQi0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItLT4+Q2xpZW50OiBwcm9jZXNzaW5nIGZpbmlzaGVkXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfSEFORExFUlMpIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IERlY2FmUmVxdWVzdEhhbmRsZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHRcbiAgKSB7fVxuXG4gIGFzeW5jIGV4ZWMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZIYW5kbGVyRXhlY3V0b3IubmFtZSkuZm9yKHRoaXMuZXhlYyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLmNvbnRleHQudXVpZH0gcnVubmluZyAke3RoaXMuaGFuZGxlcnMubGVuZ3RofSBoYW5kbGVycyBmb3IgcmVxdWVzdCAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUodGhpcy5jb250ZXh0LCByZXEsIHJlcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGN0eDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge31cblxuICBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXNwb25zZSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpLnBpcGUoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmN0eC50b1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IERlY2FmQ29udHJvbGxlciBhcyBIdHRwRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb250cm9sbGVyPFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIENPTlRFWFQgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIEh0dHBEZWNhZkNvbnRyb2xsZXI8UmVxdWVzdCwgYW55LCBEZWNhZlJlcXVlc3RDb250ZXh0PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8Qz4ge1xuICBwcml2YXRlIF9wZXJzaXN0ZW5jZT86IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgX25hbWUpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8TT47XG5cbiAgcGVyc2lzdGVuY2UoY3R4PzogQ29udGV4dDxhbnk+KTogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPE0+Pih0aGlzLmNsYXNzKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICAgKSBhcyBNb2RlbFNlcnZpY2U8TT47XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmNsYXNzKSBhcyBSZXBvPE0+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVDdHggPSBjdHggPz8gdGhpcy5jbGllbnRDb250ZXh0O1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IGFjdGl2ZUN0eC50b092ZXJyaWRlcygpO1xuXG4gICAgcmV0dXJuIGN0eFxuICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnlcbiAgICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZS5vdmVycmlkZShvdmVycmlkZXMpXG4gICAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2UuZm9yKG92ZXJyaWRlcylcbiAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbCwgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvY29uc3RhbnRzXCI7XG5cbmNvbnN0IGR0b0NhY2hlID0gbmV3IE1hcDxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PlxuPigpO1xuXG4vKipcbiAqIEJ1aWxkcyBhIE5lc3QvU3dhZ2dlciBEVE8gY2xhc3MgZm9yIHRoZSBnaXZlbiBtb2RlbCBhbmQgQ1JVRCBvcGVyYXRpb24uXG4gKlxuICogUnVsZXM6XG4gKiAgLSBPbmx5IENSRUFURSBhbmQgVVBEQVRFIChhbmQgdGhlaXIgYnVsayB2YXJpYW50cykgcHJvZHVjZSBhIERUTztcbiAqICAgIGFsbCBvdGhlciBvcGVyYXRpb25zIHJldHVybiB0aGUgb3JpZ2luYWwgbW9kZWwgY2xhc3MgdW5jaGFuZ2VkLlxuICogIC0gQGdlbmVyYXRlZCgpIHByb3BlcnRpZXMgKGNyZWF0ZWRBdCwgdXBkYXRlZEF0LCBjcmVhdGVkQnksIHVwZGF0ZWRCeSxcbiAqICAgIHV1aWQsIHZlcnNpb24sIEBjb21wb3NlZCBwa3MsIOKApikgYXJlICoqbmV2ZXIqKiBleHBvc2VkIGluIGFueSBEVE8uXG4gKiAgLSBUaGUgQHBrKCkgcHJvcGVydHk6XG4gKiAgICAgIOKAoiBVUERBVEUg4oCTIGFsd2F5cyBpbmNsdWRlZC5cbiAqICAgICAg4oCiIENSRUFURSAg4oCTIGluY2x1ZGVkIG9ubHkgd2hlbiB0aGUgcGsgaXMgTk9UIGF1dG8tZ2VuZXJhdGVkXG4gKiAgICAgICAgICAgICAgICAgIChjaGVja2VkIHZpYSBNb2RlbC5wa1Byb3BzKCkuZ2VuZXJhdGVkIEFORCBNb2RlbC5nZW5lcmF0ZWQoKSkuXG4gKiAgLSBSZWxhdGlvbiBwcm9wZXJ0aWVzIChAb25lVG9PbmUsIEBvbmVUb01hbnksIOKApik6XG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBuZXN0ZWQgYXMgRHRvRm9yKENSRUFURSwgUmVsYXRlZE1vZGVsKS4gV2hlbiB0aGUgcmVsYXRpb25cbiAqICAgICAgICAgICAgICAgICAgY3JlYXRlcyBhIGNpcmN1bGFyIHJlZmVyZW5jZSAobW9kZWwgQSDihpIgbW9kZWwgQiDihpIgbW9kZWwgQSksXG4gKiAgICAgICAgICAgICAgICAgIHRoZSBiYWNrLXJlZmVyZW5jZSB1c2VzIHRoZSByZWxhdGVkIG1vZGVsJ3MgUEsgdHlwZVxuICogICAgICAgICAgICAgICAgICAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrIHRoZSBjeWNsZS5cbiAqICAgICAg4oCiIFVQREFURSAg4oCTIHVuaW9uIG9mIER0b0ZvcihVUERBVEUsIFJlbGF0ZWRNb2RlbCkgKipvcioqIHRoZVxuICogICAgICAgICAgICAgICAgICByZWxhdGVkIG1vZGVsJ3MgcHJpbWFyeS1rZXkgdHlwZSAoc3RyaW5nIC8gaW50ZWdlciksXG4gKiAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhIFN3YWdnZXIgb25lT2YuIENpcmN1bGFyIGJhY2stcmVmZXJlbmNlc1xuICogICAgICAgICAgICAgICAgICBvbWl0IHRoZSBEVE8gJHJlZiBhbmQgb25seSBpbmNsdWRlIHRoZSBQSyB0eXBlLlxuICpcbiAqIE1ldGFkYXRhLnByb3BlcnRpZXMoKSBub3cgcmV0dXJucyBBTEwgcHJvcGVydGllcyBhY3Jvc3MgdGhlIHByb3RvdHlwZSBjaGFpbixcbiAqIHNvIERUTyBpbmhlcml0YW5jZSBpcyBubyBsb25nZXIgbmVlZGVkOyBldmVyeSBEVE8gaXMgYSBmbGF0IGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRHRvRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG9wOiBPcGVyYXRpb25LZXlzLFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gIHN0YWNrOiBTZXQ8Q29uc3RydWN0b3I8YW55Pj4gPSBuZXcgU2V0KClcbik6IENvbnN0cnVjdG9yPGFueT4ge1xuICBpZiAoIVRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cy5pbmNsdWRlcyhvcCkpIHtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGdldER0b0NhY2hlKG9wKTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1vZGVsKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBpc1VwZGF0ZU9wID0gW1xuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICBdLmluY2x1ZGVzKG9wIGFzIGFueSk7XG5cbiAgY2xhc3MgRHluYW1pY0RUTyB7fVxuICBjYWNoZS5zZXQobW9kZWwsIER5bmFtaWNEVE8pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgJHt0b1Bhc2NhbENhc2UobW9kZWwubmFtZSl9JHt0b1Bhc2NhbENhc2Uob3ApfURUT2AsXG4gIH0pO1xuXG4gIGNvbnN0IHBrUHJvcCA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBNb2RlbC5wayhtb2RlbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSkoKTtcblxuICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBwa1Byb3AgPyBNb2RlbC5wa1Byb3BzKG1vZGVsIGFzIGFueSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrRGVzaWduVHlwZSA9IHBrUHJvcFxuICAgID8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcGtQcm9wIGFzIHN0cmluZylcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtUeXBlSXNOdW1lcmljID1cbiAgICBwa0Rlc2lnblR5cGUgPT09IE51bWJlciB8fCBwa0Rlc2lnblR5cGUgPT09IEJpZ0ludDtcbiAgY29uc3QgcGtJc0dlbmVyYXRlZCA9XG4gICAgISFwa1Byb3BzTWV0YWRhdGE/LmdlbmVyYXRlZCB8fFxuICAgIChwa1Byb3BcbiAgICAgID8gTW9kZWwuZ2VuZXJhdGVkQnlTZXF1ZW5jZShtb2RlbCBhcyBhbnksIHBrUHJvcCBhcyBhbnkpIHx8XG4gICAgICAgIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcGtQcm9wIGFzIHN0cmluZykgfHxcbiAgICAgICAgcGtUeXBlSXNOdW1lcmljXG4gICAgICA6IGZhbHNlKTtcblxuICBjb25zdCBhbGxQcm9wcyA9IEFycmF5LmZyb20obmV3IFNldChNZXRhZGF0YS5wcm9wZXJ0aWVzKG1vZGVsKSB8fCBbXSkpO1xuICBjb25zdCByZWxhdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkgYXMgc3RyaW5nW10pIHx8IFtdKTtcbiAgY29uc3Qgc2NhbGFyUHJvcHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIGFsbFByb3BzKSB7XG4gICAgaWYgKCFwcm9wKSBjb250aW51ZTtcbiAgICBpZiAocmVsYXRpb25zLmhhcyhwcm9wKSkgY29udGludWU7XG5cbiAgICBpZiAocHJvcCA9PT0gcGtQcm9wICYmICFpc1VwZGF0ZU9wICYmIHBrSXNHZW5lcmF0ZWQpIGNvbnRpbnVlO1xuICAgIGlmIChwcm9wICE9PSBwa1Byb3AgJiYgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgc2NhbGFyUHJvcHMucHVzaChwcm9wKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBzY2FsYXJQcm9wcykge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIXZhbGlkYXRpb24/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG4gICAgY29uc3QgdHlwZUhpbnQgPVxuICAgICAgZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSA/P1xuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICB9O1xuICAgIGlmICh0eXBlSGludCkgYXBpT3B0aW9ucy50eXBlID0gdHlwZUhpbnQ7XG5cbiAgICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApID8/IHR5cGVIaW50O1xuICAgIGlmICh0eXBlb2YgZGVzaWduVHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBkZXNpZ25UeXBlLFxuICAgICAgICBEeW5hbWljRFRPLnByb3RvdHlwZSxcbiAgICAgICAgcHJvcFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHJlbGF0aW9ucykge1xuICAgIGNvbnN0IHJlbGF0aW9uTWV0YSA9IE1ldGFkYXRhLnJlbGF0aW9ucyhtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBpZiAoIXJlbGF0aW9uTWV0YSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE1ldGFkYXRhIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID1cbiAgICAgIHJlbGF0aW9uTWV0YS5jbGFzcyBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgIGlmICh0eXBlb2YgcmVsYXRpb25UeXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXJlbGF0aW9uVHlwZS5uYW1lKSB7XG4gICAgICByZWxhdGlvblR5cGUgPSAocmVsYXRpb25UeXBlIGFzIGFueSkoKTtcbiAgICB9XG4gICAgaWYgKCFyZWxhdGlvblR5cGUgfHwgdHlwZW9mIHJlbGF0aW9uVHlwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVHlwZSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGlmICghTW9kZWwuZ2V0KHJlbGF0aW9uVHlwZS5uYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgY29uc3QgaXNBcnJheSA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLkxJU1RdO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG5cbiAgICAvLyBEZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlOiBpZiB0aGUgcmVsYXRlZCBtb2RlbCBpcyBhbHJlYWR5IGluIHRoZVxuICAgIC8vIHJlY3Vyc2lvbiBzdGFjaywgdXNlIHRoZSBQSyB0eXBlIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrXG4gICAgLy8gdGhlIGN5Y2xlLiBUaGlzIHByZXZlbnRzIEBuZXN0anMvc3dhZ2dlcidzIFNjaGVtYU9iamVjdEZhY3RvcnkgZnJvbVxuICAgIC8vIGluZmluaXRlbHkgcmVjdXJzaW5nIHdoZW4gZXhwbG9yaW5nIHRoZSBzY2hlbWFzLlxuICAgIGNvbnN0IGlzQ2lyY3VsYXIgPSBzdGFjay5oYXMocmVsYXRpb25UeXBlKTtcblxuICAgIGlmIChpc0NpcmN1bGFyKSB7XG4gICAgICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICAgICAgYWRkUmVsYXRpb25Qa1JlZihEeW5hbWljRFRPLCByZWxhdGlvbiwgcGtUeXBlTmFtZSwgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbkR0byA9IER0b0ZvcihvcCwgcmVsYXRpb25UeXBlLCBuZXcgU2V0KHN0YWNrKS5hZGQobW9kZWwpKTtcblxuICAgIGlmIChpc1VwZGF0ZU9wKSB7XG4gICAgICBhZGRSZWxhdGlvblVwZGF0ZShcbiAgICAgICAgRHluYW1pY0RUTyxcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIHJlbGF0aW9uVHlwZSxcbiAgICAgICAgcmVsYXRpb25EdG8sXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIGlzUmVxdWlyZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFJlbGF0aW9uKER5bmFtaWNEVE8sIHJlbGF0aW9uLCByZWxhdGlvbkR0bywgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIER5bmFtaWNEVE87XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgIHR5cGU6IHJlbGF0aW9uRHRvLFxuICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIGlzQXJyYXksXG4gIH07XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiByZWxhdGlvbkR0byxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgcmVsYXRpb24gcHJvcGVydHkgdGhhdCB1c2VzIHRoZSBQSyB0eXBlIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZlxuICogYSBmdWxsIERUTyBjbGFzcy4gVXNlZCB0byBicmVhayBjaXJjdWxhciByZWZlcmVuY2VzIChlLmcuIEN1c3RvbWVyIOKGkiBPcmRlciDihpIgQ3VzdG9tZXIpLlxuICovXG5mdW5jdGlvbiBhZGRSZWxhdGlvblBrUmVmKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICBwa1R5cGVOYW1lOiBzdHJpbmcsXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IHBrVHlwZU5hbWUgfSwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZywgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpO1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogKHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nKSxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb25VcGRhdGUoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PixcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGV4dHJhTW9kZWxzID1cbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUywgRHRvQ2xhc3MpIHx8IFtdO1xuICBpZiAoIWV4dHJhTW9kZWxzLmluY2x1ZGVzKHJlbGF0aW9uRHRvKSkge1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsXG4gICAgICBbLi4uZXh0cmFNb2RlbHMsIHJlbGF0aW9uRHRvXSxcbiAgICAgIER0b0NsYXNzXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGR0b1JlZiA9IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke3JlbGF0aW9uRHRvLm5hbWV9YDtcbiAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgY29uc3Qgb25lT2ZJdGVtcyA9IFt7ICRyZWY6IGR0b1JlZiB9LCB7IHR5cGU6IHBrVHlwZU5hbWUgfV07XG5cbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSk7XG5cbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IE9iamVjdCxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IE1vZGVsLnBrUHJvcHMocmVsYXRpb25UeXBlIGFzIGFueSk7XG4gICAgY29uc3QgcGtUeXBlID0gcGtQcm9wc01ldGFkYXRhPy50eXBlO1xuICAgIGlmIChwa1R5cGUgPT09IE51bWJlciB8fCBwa1R5cGUgPT09IEJpZ0ludCkgcmV0dXJuIFwiaW50ZWdlclwiO1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGlmIChNb2RlbC5nZW5lcmF0ZWQoY3VycmVudCwgcHJvcCBhcyBhbnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihjdXJyZW50LCBwcm9wIGFzIGFueSk7XG4gICAgaWYgKHZhbGlkYXRpb24pIHJldHVybiB2YWxpZGF0aW9uIGFzIGFueTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbDogQ29uc3RydWN0b3I8YW55PiwgcHJvcDogc3RyaW5nKTogYW55IHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEudHlwZShjdXJyZW50LCBwcm9wKTtcbiAgICBpZiAodHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXREdG9DYWNoZShcbiAgb3A6IE9wZXJhdGlvbktleXNcbik6IFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj4ge1xuICBpZiAoIWR0b0NhY2hlLmhhcyhvcCkpIHtcbiAgICBkdG9DYWNoZS5zZXQob3AsIG5ldyBXZWFrTWFwKCkpO1xuICB9XG4gIHJldHVybiBkdG9DYWNoZS5nZXQob3ApITtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIENvbnRleHRPZiwgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG4oQWRhcHRlciBhcyBhbnkpLnRyYW5zZm9ybWVyRm9yID0gZnVuY3Rpb24gdG9Db250ZXh0RmxhZ3M8XG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4sXG4+KGFkYXB0ZXI6IEEgfCBzdHJpbmcpOiBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8Q29udGV4dE9mPEE+Pj4ge1xuICBjb25zdCBhbGlhcyA9XG4gICAgdHlwZW9mIGFkYXB0ZXIgPT09IFwic3RyaW5nXCIgPyBhZGFwdGVyIDogKGFkYXB0ZXIuYWxpYXMgYXMgc3RyaW5nKTtcbiAgcmV0dXJuIE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSwgYWxpYXMpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQWRhcHRlciBhcyBhbnkpLmZsYXZvdXJzVG9UcmFuc2Zvcm0gPSBmdW5jdGlvbiByZXF1ZXN0VHJhbnNmb3JtZXJzKCk6XG4gIHwgc3RyaW5nW11cbiAgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihDb250ZXh0IGFzIGFueSkucHJvdG90eXBlLnRvUmVzcG9uc2UgPSBmdW5jdGlvbiB0b1Jlc3BvbnNlPFxuICBSRVMgZXh0ZW5kcyB7IGhlYWRlcjogYW55IH0sXG4+KHRoaXM6IENvbnRleHQsIHJlczogUkVTKTogUkVTIHtcbiAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZygpO1xuICBpZiAocGVuZGluZykgcmVzLmhlYWRlcihcIngtcGVuZGluZy10YXNrXCIsIEpTT04uc3RyaW5naWZ5KHBlbmRpbmcpKTtcbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEJ1aWxkZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4uL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZGVjb3JhdG9yc1wiO1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIEF1dGgobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICAgIGRlY29yYXRlQ2xhc3MoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgfVxufVxuXG5jb25zdCBwcm90b3R5cGUgPSBNb2RlbEJ1aWxkZXIucHJvdG90eXBlIGFzIE1vZGVsQnVpbGRlcjxhbnk+ICYge1xuICBBdXRoOiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSA9PiBNb2RlbEJ1aWxkZXI8YW55Pjtcbn07XG5cbmlmICghcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MpIHtcbiAgcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MgPSBmdW5jdGlvbiAoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcikge1xuICAgIGlmICghKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMgPSBbXTtcbiAgICB9XG4gICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzLnB1c2goZGVjb3JhdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxucHJvdG90eXBlLkF1dGggPSBmdW5jdGlvbiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3MoQXV0aChtb2RlbCkpO1xufTtcblxuaWYgKCEocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQpIHtcbiAgY29uc3Qgb3JpZ2luYWxCdWlsZCA9IHByb3RvdHlwZS5idWlsZDtcbiAgcHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXN1bHQgPSBvcmlnaW5hbEJ1aWxkLmNhbGwodGhpcyk7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9ICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycztcbiAgICBpZiAoZGVjb3JhdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRlZCA9IGRlY29yYXRvcihyZXN1bHQgYXMgYW55KSBhcyB0eXBlb2YgcmVzdWx0IHwgdm9pZDtcbiAgICAgICAgaWYgKGRlY29yYXRlZCkge1xuICAgICAgICAgIHJlc3VsdCA9IGRlY29yYXRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQgPSB0cnVlO1xufVxuIiwiaW1wb3J0IHtcbiAgQ29udHJvbGxlcixcbiAgUGFyYW0sXG4gIFF1ZXJ5LFxuICBSZXNwb25zZSxcbiAgU2V0TWV0YWRhdGEsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpTm90Rm91bmRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG4gIEFwaVRhZ3MsXG4gIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSxcbiAgZ2V0U2NoZW1hUGF0aCxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIHR5cGUgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcsIHRvS2ViYWJDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEFwaU9wZXJhdGlvbkZyb21Nb2RlbCxcbiAgQXBpUGFyYW1zRnJvbU1vZGVsLFxuICB0eXBlIERlY2FmQXBpUHJvcGVydHksXG4gIERlY2FmQm9keSxcbiAgRGVjYWZRdWVyeSxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgREVDQUZfUk9VVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTS0lQX01PREVMX1JPTEVTX0tFWSB9IGZyb20gXCIuLi9hdXRoL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aCwgUHVibGljLCBSZXF1aXJlUm9sZXMgfSBmcm9tIFwiLi4vYXV0aC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IER0b0ZvciB9IGZyb20gXCIuLi9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlclwiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LFxuICB0eXBlIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcsXG4gIHR5cGUgQXV0aENvbmZpZyxcbiAgdHlwZSBTZXJ2ZXJSb3V0ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIEZyb21Nb2RlbENvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuXG4gIHByaXZhdGUgc3RhdGljIHRvRGVjYWZFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBmYWxsYmFja01lc3NhZ2U6IHN0cmluZ1xuICApOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICA6IGZhbGxiYWNrTWVzc2FnZVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UGVyc2lzdGVuY2U8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPFQ+PihNb2RlbENsYXp6KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoTW9kZWxDbGF6eikgYXMgTW9kZWxTZXJ2aWNlPFQ+O1xuICAgICAgfSBjYXRjaCAoZTI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoTW9kZWxDbGF6eikgYXMgUmVwbzxUPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICAgIHByZWZpeDogc3RyaW5nID0gUGVyc2lzdGVuY2VLZXlzLlFVRVJZXG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgcmVwbzogUmVwbzxUPiA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcbiAgICBjb25zdCBxdWVyeU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIHsgZmllbGRzPzogc3RyaW5nW10gfCB1bmRlZmluZWQgfT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICByZXBvLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoUGVyc2lzdGVuY2VLZXlzLlFVRVJZKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNvbnN0IHJvdXRlTWV0aG9kczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHBlcnNpc3RlbmNlLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoREVDQUZfUk9VVEUpXG4gICAgICApID8/IHt9O1xuXG4gICAgY2xhc3MgUXVlcnlDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIHBhcmFtc10gb2YgT2JqZWN0LmVudHJpZXMocm91dGVNZXRob2RzKSkge1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3BhcmFtcy5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChRdWVyeUNvbnRyb2xsZXIsIG1ldGhvZE5hbWUsIGhhbmRsZXIpO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihwYXJhbXMuaHR0cE1ldGhvZCBhcyBIdHRwVmVyYnMpKFxuICAgICAgICByb3V0ZVBhdGggfHwgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIHBhcmFtcy5odHRwTWV0aG9kXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBbXG4gICAgICAgIGh0dHBEZWNvcmF0b3IsXG4gICAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBvYmpWYWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJ5TWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IG9ialZhbHVlcy5maWVsZHMgPz8gW107XG4gICAgICBjb25zdCByb3V0ZVBhdGggPSBbcHJlZml4LCBtZXRob2ROYW1lLCAuLi5maWVsZHMubWFwKChmKSA9PiBgOiR7Zn1gKV1cbiAgICAgICAgLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudCAmJiBzZWdtZW50LnRyaW0oKSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApIGFzIGFueTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgaGFuZGxlcik7XG5cbiAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKFwiR0VUXCIgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgcm91dGVQYXRoIHx8IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICBcIkdFVFwiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBbXG4gICAgICAgIGh0dHBEZWNvcmF0b3IsXG4gICAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUXVlcnlDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZTxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8VD4sXG4gICAgbW9kdWxlQ29uZmlnT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4sXG4gICAgZ2xvYmFsRGVmYXVsdHM/OiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+XG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgbG9nID0gRnJvbU1vZGVsQ29udHJvbGxlci5sb2cuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoTW9kZWxDb25zdHIpO1xuICAgIGNvbnN0IHJvdXRlUGF0aCA9IHRvS2ViYWJDYXNlKHRhYmxlTmFtZSk7XG4gICAgY29uc3QgbW9kZWxDbGF6ek5hbWUgPSBNb2RlbENvbnN0ci5uYW1lO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRQZXJzaXN0ZW5jZShNb2RlbENvbnN0cik7XG5cbiAgICAvLyBXaGVuIHBlcnNpc3RlbmNlIGlzIGEgTW9kZWxTZXJ2aWNlLCB0aGUgQHF1ZXJ5L0Byb3V0ZSBtZXRhZGF0YSBsaXZlcyBvblxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIHJlcG9zaXRvcnkgY2xhc3MgKGN1c3RvbSByZXBvKSwgbm90IG9uIE1vZGVsU2VydmljZSBpdHNlbGYuXG4gICAgLy8gUGFzcyB0aGUgcmVwbyB0byB0aGUgZmFjdG9yeSBzbyBhZGRDb21wbGV4UXVlcmllcygpIGNhbiBkaXNjb3ZlciB0aGVtLlxuICAgIGNvbnN0IGZhY3RvcnlQZXJzaXN0ZW5jZSA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcblxuICAgIGNvbnN0IGRlY29yYXRvckNvbmZpZyA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX0NPTlRST0xMRVJfQ09ORklHKVxuICAgICkgYXMgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtb2R1bGVPdmVycmlkZSA9IG1vZHVsZUNvbmZpZ092ZXJyaWRlcz8uW01vZGVsQ29uc3RyLm5hbWVdO1xuICAgIGNvbnN0IG1lcmdlZENvbmZpZzogTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyA9IHtcbiAgICAgIC4uLihnbG9iYWxEZWZhdWx0cyB8fCB7fSksXG4gICAgICAuLi4oZGVjb3JhdG9yQ29uZmlnIHx8IHt9KSxcbiAgICAgIC4uLihtb2R1bGVPdmVycmlkZSB8fCB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IEZhY3RvcnlDb250cm9sbGVyID0gTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGU8VD4oXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIGZhY3RvcnlQZXJzaXN0ZW5jZSxcbiAgICAgIG1lcmdlZENvbmZpZ1xuICAgICk7XG4gICAgY29uc3QgZmFjdG9yeVJvdXRlcyA9IChGYWN0b3J5Q29udHJvbGxlciBhcyBhbnkpLl9fcm91dGVzX18gYXNcbiAgICAgIHwgU2VydmVyUm91dGVbXVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7XG4gICAgICBnZXRQSyxcbiAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICBwYXRoOiBwa1BhdGgsXG4gICAgfSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsKE1vZGVsQ29uc3RyKTtcblxuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBjb250cm9sbGVyIGZvciBtb2RlbDogJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke2ZhY3RvcnlSb3V0ZXM/Lmxlbmd0aCA/PyAwfSBmYWN0b3J5IHJvdXRlc2BcbiAgICApO1xuXG4gICAgY29uc3QgYXV0aENvbmZpZzogQXV0aENvbmZpZyB8IHVuZGVmaW5lZCA9IG1lcmdlZENvbmZpZy5hdXRoO1xuXG4gICAgZnVuY3Rpb24gYXBwbHlDbGFzc0F1dGgodGFyZ2V0OiBhbnkpIHtcbiAgICAgIGlmIChhdXRoQ29uZmlnPy5wdWJsaWMpIHtcbiAgICAgICAgUHVibGljKCkodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXV0aENvbmZpZz8ucm9sZXM/Lmxlbmd0aCkge1xuICAgICAgICBSZXF1aXJlUm9sZXMoLi4uYXV0aENvbmZpZy5yb2xlcykodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEF1dGgoTW9kZWxDb25zdHIpKHRhcmdldCk7XG4gICAgICB9XG4gICAgICBpZiAoYXV0aENvbmZpZz8uc2tpcE1vZGVsUm9sZXMpIHtcbiAgICAgICAgU2V0TWV0YWRhdGEoU0tJUF9NT0RFTF9ST0xFU19LRVksIHRydWUpKHRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQENvbnRyb2xsZXIocm91dGVQYXRoKVxuICAgIEBBcGlUYWdzKG1vZGVsQ2xhenpOYW1lKVxuICAgIEBBcGlFeHRyYU1vZGVscyhNb2RlbENvbnN0cilcbiAgICBjbGFzcyBEeW5hbWljTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgcHJpdmF0ZSByZWFkb25seSBwazogc3RyaW5nID0gTW9kZWwucGsoTW9kZWxDb25zdHIpIGFzIHN0cmluZztcblxuICAgICAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgY2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRHluYW1pY01vZGVsQ29udHJvbGxlci5uYW1lKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJlZ2lzdGVyaW5nIGR5bmFtaWMgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7dGhpcy5jbGFzcy5uYW1lfSByb3V0ZTogLyR7cm91dGVQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUNsYXNzQXV0aChEeW5hbWljTW9kZWxDb250cm9sbGVyKTtcblxuICAgIGlmIChmYWN0b3J5Um91dGVzKSB7XG4gICAgICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBbLi4uZmFjdG9yeVJvdXRlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhU2VnbWVudHMgPSBhLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3QgYlNlZ21lbnRzID0gYi5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGFQYXJhbUNvdW50ID0gYVNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBiUGFyYW1Db3VudCA9IGJTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYUxpdGVyYWxDb3VudCA9IGFTZWdtZW50cy5sZW5ndGggLSBhUGFyYW1Db3VudDtcbiAgICAgICAgY29uc3QgYkxpdGVyYWxDb3VudCA9IGJTZWdtZW50cy5sZW5ndGggLSBiUGFyYW1Db3VudDtcbiAgICAgICAgaWYgKGFMaXRlcmFsQ291bnQgIT09IGJMaXRlcmFsQ291bnQpXG4gICAgICAgICAgcmV0dXJuIGJMaXRlcmFsQ291bnQgLSBhTGl0ZXJhbENvdW50O1xuICAgICAgICBpZiAoYVBhcmFtQ291bnQgIT09IGJQYXJhbUNvdW50KSByZXR1cm4gYVBhcmFtQ291bnQgLSBiUGFyYW1Db3VudDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWRSb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9XG4gICAgICAgICAgcm91dGUuaW1wbGVtZW50YXRpb24/Lm5hbWUgfHwgcm91dGUubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IEZyb21Nb2RlbENvbnRyb2xsZXIubWF0Y2hSb3V0ZShcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIHBrUGF0aCxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIGdldFBLLFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVnaXN0cmF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbWV0aG9kTmFtZTogcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBkZWNvcmF0b3JzLFxuICAgICAgICAgIHBhcmFtRGVjb3JhdG9ycyxcbiAgICAgICAgfSA9IHJlZ2lzdHJhdGlvbjtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihyb3V0ZS5tZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgICAgIHJvdXRlLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIikgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgICByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXSxcbiAgICAgICAgICAgIHBhcmFtRGVjb3JhdG9yc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gRHluYW1pY01vZGVsQ29udHJvbGxlciBhcyBhbnk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W107XG4gICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhNb2RlbENsYXp6KSBhcyBrZXlvZiBNb2RlbDxhbnk+O1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgTW9kZWxDbGF6eixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuQ09NUE9TRUQsIHBrKVxuICAgICk7XG4gICAgY29uc3QgY29tcG9zZWRLZXlzID0gY29tcG9zZWQ/LmFyZ3MgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVLZXlzID1cbiAgICAgIEFycmF5LmlzQXJyYXkoY29tcG9zZWRLZXlzKSAmJiBjb21wb3NlZEtleXMubGVuZ3RoID4gMFxuICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChbLi4uY29tcG9zZWRLZXlzXSkpXG4gICAgICAgIDogQXJyYXkuZnJvbShuZXcgU2V0KFtwa10pKTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eikgPz8gXCJcIjtcbiAgICBjb25zdCBwYXRoID0gYDoke3VuaXF1ZUtleXMuam9pbihcIi86XCIpfWA7XG4gICAgY29uc3QgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gdW5pcXVlS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZToga2V5LFxuICAgICAgICBkZXNjcmlwdGlvbjogTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eiwga2V5KSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PlxuICAgICAgICBjb21wb3NlZD8uc2VwYXJhdG9yID8gcGFyYW1zLmpvaW4oY29tcG9zZWQuc2VwYXJhdG9yKSA6IHBhcmFtcy5qb2luKFwiXCIpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByb3V0ZVBhcmFtRGVjb3JhdG9ycyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuICAgIHJldHVybiBwYXRoXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZmxhdE1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKlwiKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlZmluZU1ldGhvZChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSB8fCB0YXJnZXQsIG1ldGhvZE5hbWUsIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LFxuICAgICAgbWV0aG9kTmFtZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhcHBseURlY29yYXRvcnMoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIG1ldGhvZERlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7XG4gICAgICBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjtcbiAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgfT4gPSBbXVxuICApIHtcbiAgICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kTmFtZSk7XG4gICAgbWV0aG9kRGVjb3JhdG9ycy5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gICAgcGFyYW1EZWNvcmF0b3JzLmZvckVhY2goKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PlxuICAgICAgZGVjb3JhdG9yKHByb3RvLCBtZXRob2ROYW1lLCBpbmRleClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hSb3V0ZShcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgcm91dGU6IFNlcnZlclJvdXRlLFxuICAgIHBrUGF0aDogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTpcbiAgICB8IHtcbiAgICAgICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgICAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueTtcbiAgICAgICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPjtcbiAgICAgICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7XG4gICAgICAgICAgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG4gICAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgfT47XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXRoIH0gPSByb3V0ZTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gICAgY29uc3QgaGFuZGxlciA9IHJvdXRlLmltcGxlbWVudGF0aW9uIGFzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDcmVhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1JlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZUFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXNcbiAgICAgICAgKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0RlbGV0ZURlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllc1xuICAgICAgICApLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgcGtQYXRoXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPVxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgcGtQYXRoXG4gICAgICAgICksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIC4uLnJvdXRlUGFyYW1zLm1hcCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+ICh7XG4gICAgICAgICAgICBkZWNvcmF0b3IsXG4gICAgICAgICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID1cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21wb3NlZCBQSyBmYWxsYmFjayByb3V0ZXMgKGZpbHRlckVtcHR5KSDigJQgcGF0aCBkaWZmZXJzIGZyb20gcGtQYXRoXG4gICAgY29uc3QgZmFsbGJhY2tTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgaXNBbGxQYXJhbXMgPVxuICAgICAgZmFsbGJhY2tTZWdtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICBmYWxsYmFja1NlZ21lbnRzLmV2ZXJ5KChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBpZiAoaXNBbGxQYXJhbXMgJiYgbm9ybWFsaXplZFBhdGggIT09IHBrUGF0aCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tBcGlQcm9wcyA9IGZhbGxiYWNrU2VnbWVudHNcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXJgLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3VmZml4ID0gZmFsbGJhY2tTZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLmpvaW4oXCJBbmRcIik7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHJlYWRCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGB1cGRhdGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoXG4gICAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgICAgZmFsbGJhY2tBcGlQcm9wcyxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoXG4gICAgICAgICAgKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgICAgLi4ucm91dGVQYXJhbXMubWFwKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT4gKHtcbiAgICAgICAgICAgICAgZGVjb3JhdG9yLFxuICAgICAgICAgICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGBkZWxldGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoXG4gICAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgICAgZmFsbGJhY2tBcGlQcm9wcyxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoXG4gICAgICAgICAgKSxcbiAgICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInN0YXRlbWVudFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcIm1ldGhvZFwiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwiYXJnc1wiKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImZpbmRPbmVCeVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQllcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVtZW50Um91dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICAgIFwicGFnaW5hdGVCeS86a2V5LzpwYWdlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZLFxuICAgICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgICBcImZpbmRPbmVCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlksXG4gICAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICAgIFwiY291bnRPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLFxuICAgICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgICBcImF2Z09mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GLFxuICAgICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgICAgXCJncm91cE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEtleSA9IHN0YXRlbWVudFJvdXRlc1tub3JtYWxpemVkUGF0aF07XG4gICAgaWYgKHN0YXRlbWVudEtleSAmJiBtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRNZXRob2ROYW1lKG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgc3RhdGVtZW50S2V5XG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgY29uc3QgcXVlcnlNZXRob2QgPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF07XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIHF1ZXJ5TWV0aG9kLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgICBxdWVyeU1ldGhvZCxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICBcIkdFVFwiLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jb21wbGV4UXVlcnlQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3Qga25vd25QcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICBcImxpc3RCeVwiLFxuICAgICAgXCJmaW5kQnlcIixcbiAgICAgIFwiZmluZEJ5UGFnaW5hdGVcIixcbiAgICAgIFwiZmluZE9uZUJ5XCIsXG4gICAgICBcInBhZ2luYXRlQnlcIixcbiAgICAgIFwiZmluZFwiLFxuICAgICAgXCJwYWdlXCIsXG4gICAgICBcImNvdW50T2ZcIixcbiAgICAgIFwibWF4T2ZcIixcbiAgICAgIFwibWluT2ZcIixcbiAgICAgIFwiYXZnT2ZcIixcbiAgICAgIFwic3VtT2ZcIixcbiAgICAgIFwiZGlzdGluY3RPZlwiLFxuICAgICAgXCJncm91cE9mXCIsXG4gICAgICBcInN0YXRlbWVudFwiLFxuICAgICAgXCJidWxrXCIsXG4gICAgICBcInF1ZXJ5XCIsXG4gICAgXSk7XG4gICAgaWYgKFxuICAgICAgcGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpICYmXG4gICAgICAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInN0YXRlbWVudC9cIikgJiZcbiAgICAgICFrbm93blByZWZpeGVzLmhhcyhwYXRoU2VnbWVudHNbMF0pXG4gICAgKSB7XG4gICAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gcGF0aFNlZ21lbnRzXG4gICAgICAgIC5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgICAgIC5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIFwiJHttZXRob2ROYW1lfVwiLmAgfSksXG4gICAgICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5cIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT5cbiAgKSB7XG4gICAgcmV0dXJuIHsgbWV0aG9kTmFtZSwgaGFuZGxlciwgZGVjb3JhdG9ycywgcGFyYW1EZWNvcmF0b3JzIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRNZXRob2ROYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlyc3RTZWdtZW50ID0gcGF0aC5zcGxpdChcIi9cIilbMF07XG4gICAgcmV0dXJuIGZpcnN0U2VnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb21wbGV4UXVlcnlQYXJhbXMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBjb25zdCBwYXJhbXM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogUGFyYW0obmFtZSkgYXMgYW55LCBpbmRleDogaSB9KTtcbiAgICB9KTtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IHNlZ21lbnRzLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIobWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXhRdWVyeShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGNvbXBsZXhRdWVyeSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZGVidWcoYEludm9raW5nIGN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cImApO1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKSkuZm9yKFxuICAgICAgICAgIGNvbXBsZXhRdWVyeVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgY29uc3Qgc3ByZWFkQXJncyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubm9ybWFsaXplUXVlcnlBcmdzKGFyZ3MpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcGVyc2lzdGVuY2U/LnJlcG8gJiZcbiAgICAgICAgICB0eXBlb2YgcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVyc2lzdGVuY2U/LnF1ZXJ5ICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5xdWVyeSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnF1ZXJ5KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2Uuc3RhdGVtZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChsb2cpIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0UXVlcnlBcmdzKGFyZ3M6IGFueVtdKTogYW55W10ge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFyZ3M7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdCAmJiB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShsYXN0KSkge1xuICAgICAgY29uc3QgcXVlcnlPYmogPSBhcmdzLnBvcCgpO1xuICAgICAgY29uc3QgaGFzRGlyZWN0aW9uID0gcXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNMaW1pdCA9IHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNPZmZzZXQgPSBxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaGFzRGlyZWN0aW9uICYmICFoYXNMaW1pdCAmJiAhaGFzT2Zmc2V0KSByZXR1cm4gYXJncztcbiAgICAgIGNvbnN0IGV4dHJhczogYW55W10gPSBbXTtcbiAgICAgIGlmIChoYXNEaXJlY3Rpb24pIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmRpcmVjdGlvbik7XG4gICAgICBlbHNlIGlmIChoYXNMaW1pdCB8fCBoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICBpZiAoaGFzTGltaXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmxpbWl0KTtcbiAgICAgIGlmIChoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgICByZXR1cm4gWy4uLmFyZ3MsIC4uLmV4dHJhc107XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbm9ybWFsaXplUXVlcnlBcmdzKGFyZ3M6IGFueVtdKTogYW55W10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBGcm9tTW9kZWxDb250cm9sbGVyLmV4dHJhY3RRdWVyeUFyZ3MoYXJncyk7XG4gICAgaWYgKG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbm9ybWFsaXplZDtcblxuICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkW25vcm1hbGl6ZWQubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFsYXN0IHx8IHR5cGVvZiBsYXN0ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobGFzdCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5T2JqID0gbGFzdCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGhhc1F1ZXJ5RmllbGRzID1cbiAgICAgIHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmouYm9va21hcmsgIT09IHVuZGVmaW5lZDtcblxuICAgIGlmICghaGFzUXVlcnlGaWVsZHMpIHtcbiAgICAgIG5vcm1hbGl6ZWQucG9wKCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICBub3JtYWxpemVkLnBvcCgpO1xuICAgIGlmIChxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLmRpcmVjdGlvbik7XG4gICAgaWYgKHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgaWYgKHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmoub2Zmc2V0KTtcbiAgICBpZiAocXVlcnlPYmouYm9va21hcmsgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLmJvb2ttYXJrKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNyZWF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUE9TVFwiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuQ1JFQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsQ2xhenpOYW1lfS5gIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICAgIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa1JlYWREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyBieSBpZHMuYCB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJpZHNcIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IFwiYXJyYXlcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa1VwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmVwbGFjZSBleGlzdGluZyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIHdpdGggbmV3IHBheWxvYWRzLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yIHJlcGxhY2luZyBleGlzdGluZyByZWNvcmRzIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICRyZWY6IGdldFNjaGVtYVBhdGgoRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0cikpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa0RlbGV0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkRFTEVURVwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgRGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUFVUXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmVwbGFjZSBhbiBleGlzdGluZyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgd2l0aCBhIG5ldyBwYXlsb2FkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yIHJlcGxhY2luZyBhbiBleGlzdGluZyByZWNvcmQgb2YgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICB0eXBlOiBEdG9Gb3IoT3BlcmF0aW9uS2V5cy5VUERBVEUsIE1vZGVsQ29uc3RyKSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlbGV0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkRFTEVURVwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50RGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJzdGF0ZW1lbnQvOm1ldGhvZC8qYXJnc1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBFeGVjdXRlcyBhIHByZXBhcmVkIHN0YXRlbWVudCBvbiAke21vZGVsQ2xhenpOYW1lfS5gLFxuICAgICAgfSksXG4gICAgICBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwibWV0aG9kXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgdG8gZXhlY3V0ZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwiYXJnc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcImNvbmNhdGVuYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGNhbiBhY2NlcHRcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBsaXN0ZWQgZm91bmQuYCB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc3RhdGVtZW50S2V5OiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgYmFzZTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGF0aCksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3Jkcy5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBiYXNlLnB1c2goQXBpUGFyYW0oeyBuYW1lLCBkZXNjcmlwdGlvbjogYFRoZSAke25hbWV9IHBhcmFtZXRlcmAgfSkpO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlclwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwicGFnZSBudW1iZXJcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImJvb2ttYXJrXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcImJvb2ttYXJrIGZvciBjdXJzb3IgcGFnaW5hdGlvblwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiZmluZE9uZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kQnkvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiB8fFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GXG4gICAgKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IGZvciAke21vZGVsQ2xhenpOYW1lfS5gLFxuICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRikge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYERpc3RpbmN0IHZhbHVlcyBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgICAgICB0eXBlOiBbU3RyaW5nXSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVyeURlY29yYXRvcnMoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICAgIGh0dHBWZXJiOiBzdHJpbmcsXG4gICAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgZXh0cmFjdFBhdGhQYXJhbXMgPSAocDogc3RyaW5nKTogc3RyaW5nW10gPT5cbiAgICAgIHBcbiAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgICAgICAubWFwKChzKSA9PiBzLnNsaWNlKDEpKTtcblxuICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuXG4gICAgaWYgKGh0dHBWZXJiID09PSBcIkdFVFwiICYmIGluY2x1ZGVRdWVyeVBhcmFtcykge1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemVcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmtcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29yYXRvcnM7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgUHJvdmlkZXIgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE1vZGVsU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRnJvbU1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuL0Zyb21Nb2RlbENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZUZvcihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgQE1vZHVsZSh7fSlcbiAgY2xhc3MgRGVjYWZNb2RlbE1vZHVsZSB7XG4gICAgc3RhdGljIHJlYWRvbmx5IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmTW9kZWxNb2R1bGUubmFtZSkuZm9yKGZsYXZvdXIpO1xuXG4gICAgc3RhdGljIGNyZWF0ZU1vZGVsU2VydmljZXM8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICAgIG1vZGVsczogTW9kZWxDb25zdHJ1Y3RvcjxUPltdXG4gICAgKTogUHJvdmlkZXJbXSB7XG4gICAgICByZXR1cm4gbW9kZWxzLm1hcCgobW9kZWwpID0+ICh7XG4gICAgICAgIHByb3ZpZGU6IGAke21vZGVsLm5hbWV9U2VydmljZWAsXG4gICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc0V4cG9zZWQoXG4gICAgICBtb2RlbDogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgZXhwb3N1cmU/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgc3RyaW5nW10+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4cG9zdXJlPy5bbW9kZWwubmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHR5cGVvZiBvdmVycmlkZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgID8gb3ZlcnJpZGVcbiAgICAgICAgICA6IE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KERFQ0FGX0VYUE9TRSkpO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmbGF2b3VyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9yUm9vdChcbiAgICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM6IFBhcnRpYWw8RGVjYWZNb2R1bGVPcHRpb25zPiA9IHt9XG4gICAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0aW5nIGNvbnRyb2xsZXJzIGZvciBmbGF2b3VyLi4uYCk7XG5cbiAgICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKS5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICB0aGlzLmlzRXhwb3NlZChtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUpXG4gICAgICApO1xuXG4gICAgICAvLyBDb250cm9sbGVycyBhbHdheXMgcmVseSBvbiBhIGJhY2tpbmcgTW9kZWxTZXJ2aWNlLCBldmVuIHdoZW4gTmVzdCBwcm92aWRlcnNcbiAgICAgIC8vIGFyZSBub3QgYXV0by1yZWdpc3RlcmVkLiBXYXJtIHRoZSBzaW5nbGV0b24gcmVnaXN0cnkgaGVyZSBzbyBzaHV0ZG93biBjYW5cbiAgICAgIC8vIHNlZSB0aGUgbGl2ZSBzZXJ2aWNlcyBjcmVhdGVkIGZvciB0aGUgZ2VuZXJhdGVkIGNvbnRyb2xsZXJzLlxuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiB0cmFja2VkTW9kZWxzKSBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KTtcblxuICAgICAgbGV0IG1vZGVsU2VydmljZXM6IFByb3ZpZGVyW10gPSBbXTtcbiAgICAgIGlmIChvcHRpb25zLmF1dG9TZXJ2aWNlcykge1xuICAgICAgICBsb2cuaW5mbyhcIkF1dG8tc2VydmljZXMgZW5hYmxlZC4gSW5pdGlhbGl6aW5nIHNlcnZpY2UgZ2VuZXJhdGlvbi5cIik7XG4gICAgICAgIG1vZGVsU2VydmljZXMgPSB0aGlzLmNyZWF0ZU1vZGVsU2VydmljZXModHJhY2tlZE1vZGVscyk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBBdXRvLXNlcnZpY2VzIGNvbXBsZXRlZC4gJHttb2RlbFNlcnZpY2VzLmxlbmd0aH0gc2VydmljZXMgaW5pdGlhbGl6ZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBnbG9iYWxEZWZhdWx0czogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPiA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMuYWdncmVnYXRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBnbG9iYWxEZWZhdWx0cy5hbGxvd0dyb3VwaW5nUXVlcmllcyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKChtb2RlbCkgPT5cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckNvbmZpZywgZ2xvYmFsRGVmYXVsdHMpXG4gICAgICApO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRlZCAke2NvbnRyb2xsZXJzLmxlbmd0aH0gY29udHJvbGxlcnNgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kdWxlOiBEZWNhZk1vZGVsTW9kdWxlLFxuICAgICAgICBjb250cm9sbGVycyxcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgLi4ubW9kZWxTZXJ2aWNlcyxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIE9iamVjdC5hc3NpZ24oRGVjYWZNb2RlbE1vZHVsZSwgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYERlY2FmTW9kdWxlJHtmbGF2b3VyfWAsXG4gIH0pO1xuICByZXR1cm4gRGVjYWZNb2RlbE1vZHVsZTtcbn1cbiIsImltcG9ydCB7XG4gIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyxcbiAgSW5qZWN0YWJsZUNvbmZpZyxcbiAgSW5qZWN0YWJsZXNLZXlzLFxuICBJbmplY3RPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIERlY29yYXRpb24sIERlY29yYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3RhYmxlKFxuICAgICAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgY2ZnPzogSW5qZWN0YWJsZUNvbmZpZ1xuICAgICkge1xuICAgICAgY2ZnID1cbiAgICAgICAgY2ZnIHx8XG4gICAgICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIGNhdGVnb3J5IGFzIFJlY29yZDxhbnksIGFueT4sXG4gICAgICAgICAgICAgIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKTtcbiAgICAgIHJldHVybiBJbmplY3RhYmxlKHtcbiAgICAgICAgc2NvcGU6IGNmZy5zaW5nbGV0b24gPyBTY29wZS5ERUZBVUxUIDogU2NvcGUuUkVRVUVTVCxcbiAgICAgICAgZHVyYWJsZTogY2ZnLnNpbmdsZXRvbiA/IHVuZGVmaW5lZCA6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0KFxuICAgICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgY2ZnOiBJbmplY3RPcHRpb25zXG4gICAgKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaW5uZXJOZXN0SW5qZWN0KFxuICAgICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICAgIGRlc2NyaXB0b3I/OiBhbnlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gSW5qZWN0KGNhdGVnb3J5IHx8ICh0YXJnZXQgYXMgQ29uc3RydWN0b3IpKShcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpXG4gIC5leHRlbmQoXG4gICAgQXBpUHJvcGVydHkoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgKVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4aW11bTogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5EZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbmltdW06IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heExlbmd0aERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4TGVuZ3RoOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5MZW5ndGhEZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbkxlbmd0aDogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlRZUEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gdHlwZURlYyhcbiAgICAgIHR5cGU6XG4gICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXVxuICAgICAgICB8IENvbnN0cnVjdG9yXG4gICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuICAgICkge1xuICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4gICAgICAgIHR5cGUgPSBBcnJheS5pc0FycmF5KHR5cGUpID8gdHlwZVswXSA6IHR5cGU7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICF0eXBlLm5hbWUpXG4gICAgICAgICAgdHlwZSA9ICh0eXBlIGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgfSkodGFyZ2V0LCBwcm9wKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTElTVClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBsaXN0RGVjKFxuLy8gICAgICAgY2xheno6XG4vLyAgICAgICAgIHwgQ29uc3RydWN0b3Jcbi8vICAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4vLyAgICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXSxcbi8vICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbi8vICAgICAgIGNvbGxlY3Rpb246IFwiQXJyYXlcIiB8IFwiU2V0XCIgPSBcIkFycmF5XCJcbi8vICAgICApIHtcbi8vICAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuLy8gICAgICAgICBjbGF6eiA9IEFycmF5LmlzQXJyYXkoY2xhenopID8gY2xhenpbMF0gOiBjbGF6ejtcbi8vICAgICAgICAgaWYgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lKVxuLy8gICAgICAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuLy8gICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBbY2xhenogYXMgYW55XSB9KSh0YXJnZXQsIHByb3ApO1xuLy8gICAgICAgfTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vIC8vXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuICAuZXh0ZW5kKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkYXRlRGVjKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlLXRpbWVcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAvLyBleGFtcGxlOiBwYXJzZURhdGUoZm9ybWF0LCBuZXcgRGF0ZSgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5FTlVNKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9wdGlvbkRlYyhvcHRpb25zOiBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IE9iamVjdC52YWx1ZXMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBlbnVtOiBvcHRzLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUEFUVEVSTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBwYXR0ZXJuRGVjKHBhdDogUmVnRXhwIHwgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBwYXR0ZXJuOiB0eXBlb2YgcGF0ID09PSBcInN0cmluZ1wiID8gcGF0IDogcGF0LnNvdXJjZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1uRGVjKG5hbWU6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uRGVjKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5BVVRIKS5leHRlbmQoeyBkZWNvcmF0b3I6IEF1dGggfSkuYXBwbHkoKTtcbiIsImltcG9ydCB7IEZvcmJpZGRlbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3JzRXJyb3IgZXh0ZW5kcyBGb3JiaWRkZW5FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIENvcnNFcnJvci5uYW1lKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBUb01hbnlSZXF1ZXN0c0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciApIHtcbiAgICBzdXBlcihUb01hbnlSZXF1ZXN0c0Vycm9yLm5hbWUsIG1zZyAsIDQyOSk7XG4gIH1cbn0iLCJpbXBvcnQge1xuICBBcmd1bWVudHNIb3N0LFxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBDYXRjaCxcbiAgQ29uZmxpY3RFeGNlcHRpb24sXG4gIEV4Y2VwdGlvbkZpbHRlcixcbiAgRm9yYmlkZGVuRXhjZXB0aW9uLFxuICBIdHRwRXhjZXB0aW9uLFxuICBJbmplY3RhYmxlLFxuICBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgT3B0aW9uYWwsXG4gIFVuYXV0aG9yaXplZEV4Y2VwdGlvbixcbiAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb250ZXh0SWRGYWN0b3J5LCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50LCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IsIEZvcmJpZGRlbkVycm9yLCBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUb01hbnlSZXF1ZXN0c0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy90aHJvdHRsaW5nXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0TG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyB3ZWxsLWtub3duIE5lc3RKUyBgSHR0cEV4Y2VwdGlvbmAgc3ViY2xhc3NlcyAoYXMgZ3VhcmRzLCBwaXBlcywgb3JcbiAqIG90aGVyIGZyYW1ld29yay1sZXZlbCBjb2RlIHdvdWxkIHRocm93IHRoZW0pIG9udG8gdGhlIGVxdWl2YWxlbnQgZGVjYWYtdHMgYEJhc2VFcnJvcmAuXG4gKiBAc3VtbWFyeSBPbmx5IGBCYXNlRXJyb3JgIGluc3RhbmNlcyBjYXJyeSB0aGUgYC5jb2RlYCB0aGUgcmVzcG9uc2UgYm9keSByZWxpZXMgb24sIHNvXG4gKiB3aXRob3V0IHRoaXMgbWFwIGV2ZXJ5IG5vbi1kZWNhZiBleGNlcHRpb24g4oCUIGluY2x1ZGluZyBwZXJmZWN0bHkgbGVnaXRpbWF0ZSBvbmVzIGxpa2UgYVxuICogZ3VhcmQncyBgRm9yYmlkZGVuRXhjZXB0aW9uYCDigJQgd291bGQgYmUgZmxhdHRlbmVkIGludG8gYSBnZW5lcmljIDUwMCBgSW50ZXJuYWxFcnJvcmAuXG4gKi9cbmNvbnN0IEhUVFBfRVhDRVBUSU9OX1RPX0RFQ0FGX0VSUk9SID0gbmV3IE1hcDxcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gSHR0cEV4Y2VwdGlvbixcbiAgKG1zZzogc3RyaW5nKSA9PiBCYXNlRXJyb3Jcbj4oW1xuICBbVW5hdXRob3JpemVkRXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1zZyldLFxuICBbRm9yYmlkZGVuRXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgRm9yYmlkZGVuRXJyb3IobXNnKV0sXG4gIFtCYWRSZXF1ZXN0RXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQmFkUmVxdWVzdEVycm9yKG1zZyldLFxuICBbQ29uZmxpY3RFeGNlcHRpb24sIChtc2cpID0+IG5ldyBDb25mbGljdEVycm9yKG1zZyldLFxuICBbVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgKG1zZykgPT4gbmV3IFZhbGlkYXRpb25FcnJvcihtc2cpXSxcbl0pO1xuXG5AQ2F0Y2goKVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZHVsZVJlZj86IE1vZHVsZVJlZikge31cblxuICBhc3luYyBjYXRjaChleGNlcHRpb246IEVycm9yLCBob3N0OiBBcmd1bWVudHNIb3N0KSB7XG4gICAgY29uc3QgY3R4ID0gaG9zdC5zd2l0Y2hUb0h0dHAoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGN0eC5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBjdHguZ2V0UmVxdWVzdCgpO1xuXG4gICAgY29uc3QgaXNQcm9kdWN0aW9uID0gTG9nZ2VkRW52aXJvbm1lbnQuZW52ID09PSBcInByb2R1Y3Rpb25cIjtcbiAgICBsZXQgc3RhdHVzQ29kZTtcblxuICAgIGlmIChcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8XG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yXG4gICAgKSB7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICBzdGF0dXNDb2RlID0gKGV4Y2VwdGlvbiBhcyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKS5nZXRTdGF0dXMoKTtcbiAgICB9IGVsc2UgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgQmFzZUVycm9yKSkge1xuICAgICAgY29uc3QgdG9EZWNhZkVycm9yID0gdGhpcy5kZWNhZkVycm9yRm9yKGV4Y2VwdGlvbik7XG4gICAgICBpZiAodG9EZWNhZkVycm9yKSB7XG4gICAgICAgIGV4Y2VwdGlvbiA9IHRvRGVjYWZFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKChleGNlcHRpb24gYXMgYW55KS5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEh0dHBFeGNlcHRpb24pIHtcbiAgICAgICAgLy8gQSByZWNvZ25pemVkIGJ1dCB1bm1hcHBlZCBIdHRwRXhjZXB0aW9uIChlLmcuIHRocm93biBieSBhIGd1YXJkIG9yXG4gICAgICAgIC8vIHBpcGUpIOKAlCBwcmVzZXJ2ZSBpdHMgcmVhbCBzdGF0dXMgaW5zdGVhZCBvZiBmbGF0dGVuaW5nIGl0IHRvIDUwMC5cbiAgICAgICAgc3RhdHVzQ29kZSA9IGV4Y2VwdGlvbi5nZXRTdGF0dXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBJbnRlcm5hbEVycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ0Vycm9yKHJlcXVlc3QsIGV4Y2VwdGlvbik7XG5cbiAgICByZXNwb25zZS5zdGF0dXMoKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSkuanNvbih7XG4gICAgICBzdGF0dXM6IChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUsXG4gICAgICBlcnJvcjogaXNQcm9kdWN0aW9uID8gZXhjZXB0aW9uLm5hbWUgOiBleGNlcHRpb24ubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcGF0aDogcmVxdWVzdC51cmwsXG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgZGVjYWYtdHMgYEJhc2VFcnJvcmAgY29uc3RydWN0b3IgbWFwcGVkIHRvIHRoaXMgZXhjZXB0aW9uJ3MgdHlwZSwgaWYgYW55LlxuICAgKiBAc3VtbWFyeSBXYWxrcyBgSFRUUF9FWENFUFRJT05fVE9fREVDQUZfRVJST1JgIHdpdGggYGluc3RhbmNlb2ZgIChyYXRoZXIgdGhhbiBhIHN0cmFpZ2h0XG4gICAqIGBNYXAuZ2V0YCkgc28gc3ViY2xhc3NlcyBvZiBhIG1hcHBlZCBleGNlcHRpb24gYXJlIG1hdGNoZWQgdG9vLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlY2FmRXJyb3JGb3IoXG4gICAgZXhjZXB0aW9uOiBFcnJvclxuICApOiAoKG1zZzogc3RyaW5nKSA9PiBCYXNlRXJyb3IpIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBmYWN0b3J5XSBvZiBIVFRQX0VYQ0VQVElPTl9UT19ERUNBRl9FUlJPUikge1xuICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIHR5cGUpIHJldHVybiBmYWN0b3J5O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIHRoZSBleGNlcHRpb24gd2l0aG91dCBldmVyIGxldHRpbmcgbG9nZ2luZyBmYWlsdXJlcyBibG9jayB0aGUgcmVzcG9uc2UuXG4gICAqIEBzdW1tYXJ5IEEgZ3VhcmQgKG9yIG1pZGRsZXdhcmUvQ09SUyBjaGVjaykgY2FuIHRocm93IGJlZm9yZSBhbnkgZGVjYWYtYXdhcmUgcHJvdmlkZXIgcmFuLFxuICAgKiBzbyB0aGUgcmVxdWVzdC1ib3VuZCBDb250ZXh0IG1heSBub3QgZXhpc3QgeWV0IOKAlCBvciB0aGUgcmVzb2x2ZWQgbG9nZ2VyJ3MgYC5lcnJvcigpYCBpdHNlbGZcbiAgICogY291bGQgdGhyb3cgKGJyb2tlbiB0cmFuc3BvcnQsIGZvcm1hdHRlciBidWcsIGV0Yy4pLiBFaXRoZXIgd2F5IHRoZSBjbGllbnQtZmFjaW5nIGVycm9yXG4gICAqIHJlc3BvbnNlIGJlbG93IG11c3Qgc3RpbGwgZ28gb3V0LCBzbyBldmVyeSBmYWlsdXJlIG1vZGUgaGVyZSBpcyBzd2FsbG93ZWQsIGZhbGxpbmcgYmFjayB0b1xuICAgKiB0aGUgcGxhaW4gYExvZ2dpbmcuZ2V0KClgIGxvZ2dlciBhbmQsIGFzIGEgbGFzdCByZXNvcnQsIGRvaW5nIG5vdGhpbmcgYXQgYWxsLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvZ0Vycm9yKFxuICAgIHJlcXVlc3Q6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgZXhjZXB0aW9uOiBFcnJvclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gYFVuaGFuZGxlZCBlcnJvciBvbiAke3JlcXVlc3Q/Lm1ldGhvZH0gJHtyZXF1ZXN0Py51cmx9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nID0gYXdhaXQgdGhpcy5yZXNvbHZlTG9nZ2VyKHJlcXVlc3QpO1xuICAgICAgbG9nLmVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBMb2dnaW5nLmdldCgpLmVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbG9nZ2luZyBpcyB1bmF2YWlsYWJsZSDigJQgdGhlIHJlc3BvbnNlIGlzIHN0aWxsIHNlbnQgYmVsb3dcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBsb2dnZXIgYm91bmQgdG8gdGhlIG9yaWdpbmF0aW5nIHJlcXVlc3QncyBkZWNhZi10cyBDb250ZXh0LlxuICAgKiBAc3VtbWFyeSBHbG9iYWwgZmlsdGVycyBhcmUgc2luZ2xldG9ucywgc28gdGhlIHJlcXVlc3Qtc2NvcGVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fVxuICAgKiAoYW5kIHRoZSBjbGllbnQvdXNlci1ib3VuZCBsb2dnZXIgaXQgY2FycmllcykgY2FuJ3QgYmUgY29uc3RydWN0b3ItaW5qZWN0ZWQuIEluc3RlYWQsIHRoaXNcbiAgICogbG9va3MgdXAgdGhlIHNhbWUgcmVxdWVzdCdzIGNvbnRleHQgaWQgYW5kIHJlLXJlc29sdmVzIHRoZSBhbHJlYWR5LWFjY3VtdWxhdGVkIGluc3RhbmNlXG4gICAqIHRocm91Z2ggYE1vZHVsZVJlZmAuIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgYExvZ2dpbmcuZ2V0KClgIGxvZ2dlciB3aGVuIHRoZSBmaWx0ZXIgd2Fzbid0XG4gICAqIGNvbnN0cnVjdGVkIHdpdGggYSBgTW9kdWxlUmVmYCAoZS5nLiBtYW51YWxseSBgbmV3YCdkKSBvciBubyByZXF1ZXN0LXNjb3BlZCBjb250ZXh0IGV4aXN0c1xuICAgKiBmb3IgdGhpcyByZXF1ZXN0IChlLmcuIHRoZSBlcnJvciBoYXBwZW5lZCBiZWZvcmUgYW55IGRlY2FmLWF3YXJlIHByb3ZpZGVyIHJhbiwgYXMgaXMgdGhlXG4gICAqIGNhc2Ugd2hlbiBhIGd1YXJkIHJlamVjdHMgdGhlIHJlcXVlc3QgYmVmb3JlIGludGVyY2VwdG9ycyBnZXQgdG8gYmluZCB0aGUgY2xpZW50LXNjb3BlZFxuICAgKiBsb2dnZXIgb250byB0aGUgQ29udGV4dCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUxvZ2dlcihcbiAgICByZXF1ZXN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVxdWVzdExvZ2dlcj4ge1xuICAgIGlmICh0aGlzLm1vZHVsZVJlZikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dElkID0gQ29udGV4dElkRmFjdG9yeS5nZXRCeVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gYXdhaXQgdGhpcy5tb2R1bGVSZWYucmVzb2x2ZShcbiAgICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgIGNvbnRleHRJZCxcbiAgICAgICAgICB7IHN0cmljdDogZmFsc2UgfVxuICAgICAgICApO1xuICAgICAgICBpZiAocmVxdWVzdENvbnRleHQ/LmxvZ2dlcikgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmxvZ2dlcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBubyByZXF1ZXN0LXNjb3BlZCBjb250ZXh0IGJvdW5kIGZvciB0aGlzIHJlcXVlc3Qg4oCUIGZhbGwgYmFjayBiZWxvd1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTG9nZ2luZy5nZXQoKSBhcyB1bmtub3duIGFzIFJlcXVlc3RMb2dnZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG4vLyBObyBNb2R1bGVSZWYgYXZhaWxhYmxlIGF0IGRlY29yYXRpb24gdGltZSwgc28gdGhpcyBpbnN0YW5jZSBmYWxscyBiYWNrIHRvXG4vLyBMb2dnaW5nLmdldCgpIHJhdGhlciB0aGFuIHRoZSByZXF1ZXN0LWJvdW5kIGNvbnRleHQgbG9nZ2VyOyBwcmVmZXJcbi8vIE5lc3RCb290c3RyYXBlci51c2VHbG9iYWxGaWx0ZXJzKCkgZm9yIGNvbnRleHQtYXdhcmUgZXJyb3IgbG9nZ2luZy5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkZpbHRlcigpIHtcbiAgcmV0dXJuIFVzZUZpbHRlcnMobmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZIZWFkZXJzKCkge1xuICByZXR1cm4gVXNlSW50ZXJjZXB0b3JzKERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvcik7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VjdXJpdHlTY2hlbWVPYmplY3QgfSBmcm9tIFwiLi4vLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJJY29uRmlsZVBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgcGF0aDogc3RyaW5nO1xuICBhdXRoPzogU2VjdXJpdHlTY2hlbWVPYmplY3Q7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIGV4dHJhTW9kZWxzPzogQ29uc3RydWN0b3JbXTtcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgU1dBR0dFUl9VSV9DT05TVEFOVFM6IFN3YWdnZXJPcHRpb25zID0ge1xuICB0aXRsZTogXCJTd2FnZ2VyIHwgT3BlbkFQSSBTcGVjaWZpY2F0aW9uIChPQVMpXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkaXplZCBmb3JtYXQgZm9yIGRlc2NyaWJpbmcgUkVTVGZ1bCBBUElzXCIsXG4gIHZlcnNpb246IFwiMC4wLjFcIixcbiAgcGF0aDogXCJkb2NzXCIsXG4gIGZhdmljb25GaWxlUGF0aDogXCJcIixcbiAgdG9wYmFySWNvbkZpbGVQYXRoOiBcIlwiLFxuICBhdXRoOiB7XG4gICAgdHlwZTogXCJodHRwXCIsXG4gICAgc2NoZW1lOiBcImJlYXJlclwiLFxuICAgIGJlYXJlckZvcm1hdDogXCJKV1RcIixcbiAgICBuYW1lOiBcIkF1dGhvcml6YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJFbnRlciBKV1QgdG9rZW5cIixcbiAgICBpbjogXCJoZWFkZXJcIixcbiAgfSxcbiAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gIHRvcGJhckJnQ29sb3I6IFwiIzAwMDAwMFwiLFxufTtcbiIsImltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyVUlPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTd2FnZ2VyQ3VzdG9tVUkge1xuICByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zO1xuICAvLyBwcml2YXRlIHJlYWRvbmx5IGFzc2V0c1BhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgLy8gICBfX2Rpcm5hbWUsXG4gIC8vICAgXCIuLlwiLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIndvcmtkb2NzXCIsXG4gIC8vICAgXCJhc3NldHNcIlxuICAvLyApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN3YWdnZXJVSU9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGN1c3RvbUNTUygpIHtcbiAgICBsZXQgY3NzID0gXCJcIjtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKSB7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMudG9wYmFySWNvblBhdGgpO1xuICAgICAgY3NzICs9IGAudG9wYmFyLXdyYXBwZXIgeyBjb250ZW50OiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwke2ltZ30nKTsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IGF1dG87IH1cXG5gO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY3NzICtcbiAgICAgIGBcbiAgICAgICAgLnRvcGJhci13cmFwcGVyIHN2ZyB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuICAgICAgICAuc3dhZ2dlci11aSAudG9wYmFyIHsgYmFja2dyb3VuZC1jb2xvcjogJHt0aGlzLm9wdGlvbnMudG9wYmFyQmdDb2xvciB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy50b3BiYXJCZ0NvbG9yfTsgfVxuICAgICAgYFxuICAgICk7XG4gIH1cblxuICBnZXRDdXN0b21PcHRpb25zKCkge1xuICAgIGNvbnN0IGZhdmljb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmZhdmljb25QYXRoKSB7XG4gICAgICBmYXZpY29uW1wiY3VzdG9tZmF2SWNvblwiXSA9IHRoaXMuYjY0KHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgLi4uZmF2aWNvbixcbiAgICAgIGN1c3RvbUNzczogdGhpcy5jdXN0b21DU1MoKSxcbiAgICAgIHN3YWdnZXJPcHRpb25zOiB7XG4gICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBiNjQoZmlsZTogc3RyaW5nLCBpbWc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy5hc3NldHNQYXRoIHx8IFwiXCIsIGZpbGUpO1xuICAgIGNvbnN0IGI2NCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZzogXCJiYXNlNjRcIiB9KTtcbiAgICByZXR1cm4gaW1nID8gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBiNjQgOiBiNjQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElOZXN0QXBwbGljYXRpb24gfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERvY3VtZW50QnVpbGRlciwgU3dhZ2dlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IFN3YWdnZXJDdXN0b21VSSB9IGZyb20gXCIuL1N3YWdnZXJDdXN0b21VSVwiO1xuaW1wb3J0IHsgU1dBR0dFUl9VSV9DT05TVEFOVFMsIFN3YWdnZXJPcHRpb25zIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogSU5lc3RBcHBsaWNhdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFN3YWdnZXJPcHRpb25zXG4gICkge31cblxuICBwcml2YXRlIGNyZWF0ZURvY3VtZW50KCkge1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5vcHRpb25zLnBhdGhcbiAgICAgID8gdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uICtcbiAgICAgICAgXCJcIiArXG4gICAgICAgIGA8YnI+PGJyPjxhIGhyZWY9XCIke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9XCI+T3BlbkFQSSBKU09OIFNwZWM8L2E+IHwgYCArXG4gICAgICAgIGA8YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofVwiPk9wZW5BUEkgWUFNTCBTcGVjPC9hPmBcbiAgICAgIDogdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3QgY29uZmlnID0gbmV3IERvY3VtZW50QnVpbGRlcigpXG4gICAgICAuc2V0VGl0bGUodGhpcy5vcHRpb25zLnRpdGxlKVxuICAgICAgLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgICAgLnNldFZlcnNpb24odGhpcy5vcHRpb25zLnZlcnNpb24gfHwgXCIwLjAuMVwiKVxuICAgICAgLmFkZEJlYXJlckF1dGgodGhpcy5vcHRpb25zLmF1dGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMuYXV0aClcbiAgICAgIC5idWlsZCgpO1xuXG4gICAgcmV0dXJuIFN3YWdnZXJNb2R1bGUuY3JlYXRlRG9jdW1lbnQodGhpcy5hcHAsIGNvbmZpZywge1xuICAgICAgZXh0cmFNb2RlbHM6IHRoaXMub3B0aW9ucy5leHRyYU1vZGVscyB8fCBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB8IFwiYXBwbGljYXRpb24veC15YW1sXCIsXG4gICAgYm9keUZhY3Rvcnk6ICgpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBodHRwQWRhcHRlciA9IHRoaXMuYXBwLmdldEh0dHBBZGFwdGVyKCkgYXMgYW55O1xuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gICAgaHR0cEFkYXB0ZXIuZ2V0KHBhdGgsIChfcmVxOiBhbnksIHJlczogYW55KSA9PiB7XG4gICAgICBodHRwQWRhcHRlci5yZXBseShyZXMsIGJvZHlGYWN0b3J5KCksIDIwMCwge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldHVwU3dhZ2dlcigpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuY3JlYXRlRG9jdW1lbnQoKTtcbiAgICBjb25zdCBzd2FnZ2VyVUkgPSBuZXcgU3dhZ2dlckN1c3RvbVVJKHtcbiAgICAgIHRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGUsXG4gICAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRoaXMub3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogdGhpcy5vcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uUGF0aDogdGhpcy5vcHRpb25zLmZhdmljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckljb25QYXRoOiB0aGlzLm9wdGlvbnMudG9wYmFySWNvbkZpbGVQYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogdGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgfSk7XG4gICAgU3dhZ2dlck1vZHVsZS5zZXR1cChcbiAgICAgIHRoaXMub3B0aW9ucy5wYXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnBhdGgsXG4gICAgICB0aGlzLmFwcCxcbiAgICAgIGRvY3VtZW50LFxuICAgICAge1xuICAgICAgICAuLi5zd2FnZ2VyVUkuZ2V0Q3VzdG9tT3B0aW9ucygpLFxuICAgICAgICBqc29uRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB5YW1sRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgICAgdGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgKCkgPT4gZG9jdW1lbnRcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgICAgKCkgPT4gWUFNTC5zdHJpbmdpZnkoZG9jdW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgZ2V0VmVyc2lvbigpIHtcbiAgLy8gICAvLyBjb25zdCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgLy8gICAvLyBjb25zdCB7dmVyc2lvbn0gPSByZXF1aXJlKHBhY2thZ2VKc29uKTtcbiAgLy8gICByZXR1cm4gXCJ2ZXJzaW9uXCI7XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7XG4gIElOZXN0QXBwbGljYXRpb24sXG4gIExvZ2dlcixcbiAgTmVzdEludGVyY2VwdG9yLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE1vZHVsZVJlZiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgU3dhZ2dlckJ1aWxkZXIgfSBmcm9tIFwiLi9vcGVuYXBpXCI7XG5pbXBvcnQgeyBDb3JzT3B0aW9ucyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL2V4dGVybmFsL2NvcnMtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IENvcnNFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRGVmaW5lcyBhbGwgY3VzdG9taXphYmxlIHBhcmFtZXRlcnMgZm9yIFN3YWdnZXIgc2V0dXAuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBkZXZlbG9wZXJzIHRvIGN1c3RvbWl6ZSBob3cgU3dhZ2dlciBVSSBpcyBjb25maWd1cmVkXG4gKiB3aXRoaW4gdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi4gSXQgaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgdGl0bGVzLCBwYXRocyxcbiAqIGNvbG9yIHNjaGVtZXMsIGFuZCBhc3NldCBwYXRocyB0byB0YWlsb3IgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgZGlzcGxheWVkIGluIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBzaG93biBiZWxvdyB0aGUgdGl0bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEFQSSB2ZXJzaW9uIGRpc3BsYXllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCBwYXRoIHdoZXJlIFN3YWdnZXIgd2lsbCBiZSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwZXJzaXN0QXV0aG9yaXphdGlvbl0gLSBXaGV0aGVyIGF1dGhvcml6YXRpb24gdG9rZW5zIHBlcnNpc3QgYWNyb3NzIHJlbG9hZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Fzc2V0c1BhdGhdIC0gUGF0aCB0byBjdXN0b20gYXNzZXRzIGZvciBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJCZ0NvbG9yXSAtIEN1c3RvbSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgU3dhZ2dlciB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJJY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGljb24gZGlzcGxheWVkIGluIHRoZSB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmYXZpY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGZhdmljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclNldHVwT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkuanNvblxuICAgKi9cbiAgb3BlbkFwaUpzb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBmbHVlbnQsIHN0YXRpYyBib290c3RyYXAgY2xhc3MgZm9yIGluaXRpYWxpemluZyBhbmQgY29uZmlndXJpbmcgYSBOZXN0SlMgYXBwbGljYXRpb24uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTmVzdEJvb3RzdHJhcGVyYCBjbGFzcyBwcm92aWRlcyBhIGNoYWluYWJsZSBBUEkgZm9yIGNvbmZpZ3VyaW5nXG4gKiBhIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gSXQgaW5jbHVkZXMgYnVpbHQtaW4gbWV0aG9kcyBmb3IgZW5hYmxpbmdcbiAqIENPUlMsIEhlbG1ldCBzZWN1cml0eSwgU3dhZ2dlciBkb2N1bWVudGF0aW9uLCBnbG9iYWwgcGlwZXMsIGZpbHRlcnMsXG4gKiBpbnRlcmNlcHRvcnMsIGFuZCBzdGFydGluZyB0aGUgc2VydmVyLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvbW90ZXMgY29uc2lzdGVuY3kgYW5kIHJlZHVjZXMgcmVwZXRpdGl2ZSBzZXR1cCBjb2RlXG4gKiBhY3Jvc3MgbXVsdGlwbGUgTmVzdEpTIHByb2plY3RzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTmVzdEZhY3RvcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tIFwiLi9hcHAubW9kdWxlXCI7XG4gKiBpbXBvcnQgeyBNeUxvZ2dlciB9IGZyb20gXCIuL015TG9nZ2VyXCI7XG4gKiBpbXBvcnQgeyBOZXN0Qm9vdHN0cmFwZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1uZXN0XCI7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICogICBjb25zdCBhcHAgPSBhd2FpdCBOZXN0RmFjdG9yeS5jcmVhdGUoQXBwTW9kdWxlKTtcbiAqXG4gKiAgIGF3YWl0IE5lc3RCb290c3RyYXBlclxuICogICAgIC5pbml0aWFsaXplKGFwcClcbiAqICAgICAuZW5hYmxlTG9nZ2VyKG5ldyBNeUxvZ2dlcigpKVxuICogICAgIC5lbmFibGVDb3JzKFtcImh0dHA6Ly9sb2NhbGhvc3Q6NDIwMFwiXSlcbiAqICAgICAudXNlSGVsbWV0KClcbiAqICAgICAuc2V0dXBTd2FnZ2VyKHtcbiAqICAgICAgIHRpdGxlOiBcIk9wZW5BUEkgYnkgVHJhZGVNYXJr4oSiXCIsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogXCJUcmFkZU1hcmvihKIgQVBJIGRvY3VtZW50YXRpb25cIixcbiAqICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAqICAgICAgIHBhdGg6IFwiYXBpXCIsXG4gKiAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAqICAgICAgIHRvcGJhckJnQ29sb3I6IFwiIzJDM0U1MFwiLFxuICogICAgICAgdG9wYmFySWNvblBhdGg6IFwiL2Fzc2V0cy9sb2dvLnN2Z1wiLFxuICogICAgICAgZmF2aWNvblBhdGg6IFwiL2Fzc2V0cy9mYXZpY29uLmljb1wiXG4gKiAgICAgfSlcbiAqICAgICAudXNlR2xvYmFsRmlsdGVycygpXG4gKiAgICAgLnVzZUdsb2JhbFBpcGVzKC4uLilcbiAqICAgICAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLilcbiAqICAgICAuc3RhcnQoMzAwMCk7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKCk7XG4gKiBgYGBcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTmVzdEJvb3RzdHJhcGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYXBwOiBJTmVzdEFwcGxpY2F0aW9uO1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvZ2dlciBpbnN0YW5jZSwgY3JlYXRpbmcgYSBkZWZhdWx0IG9uZSBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbnN1cmVzIHRoYXQgYSB2YWxpZCBgTG9nZ2VyYCBpbnN0YW5jZSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAqIGZvciBsb2dnaW5nIGJvb3RzdHJhcC1yZWxhdGVkIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBhY3RpdmUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGxvZ2dlcigpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB7XG4gICAgICAvLyBmYWxsYmFja1xuICAgICAgdGhpcy5fbG9nZ2VyID0gbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEluaXRpYWxpemVzIHRoZSBib290c3RyYXBwZXIgd2l0aCBhIGdpdmVuIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQmluZHMgdGhlIHByb3ZpZGVkIE5lc3RKUyBhcHAgaW5zdGFuY2UgdG8gdGhlIGJvb3RzdHJhcHBlciwgZW5hYmxpbmdcbiAgICogY2hhaW5lZCBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7SU5lc3RBcHBsaWNhdGlvbn0gYXBwIC0gVGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZSB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShhcHA6IElOZXN0QXBwbGljYXRpb24pIHtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBvciByZXBsYWNlcyB0aGUgZ2xvYmFsIGxvZ2dlciBmb3IgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgYSBjdXN0b20gbG9nZ2VyIGlzIHByb3ZpZGVkLCBpdCByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIuIE90aGVyd2lzZSxcbiAgICogYSBuZXcgbG9nZ2VyIG5hbWVkIGBcIk5lc3RCb290c3RyYXBcImAgaXMgdXNlZC4gVGhpcyBsb2dnZXIgaXMgYWxzbyByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtMb2dnZXJ9IFtjdXN0b21Mb2dnZXJdIC0gT3B0aW9uYWwgY3VzdG9tIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlTG9nZ2VyKGN1c3RvbUxvZ2dlcj86IExvZ2dlcikge1xuICAgIHRoaXMuX2xvZ2dlciA9IGN1c3RvbUxvZ2dlciB8fCBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB0aGlzLmFwcC51c2VMb2dnZXIodGhpcy5fbG9nZ2VyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUykgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQWxsb3dzIGRlZmluaW5nIGVpdGhlciBhIHdpbGRjYXJkIG9yaWdpbiAoYFwiKlwiYCkgb3IgYSBsaXN0IG9mIGFsbG93ZWQgb3JpZ2lucy5cbiAgICogQXV0b21hdGljYWxseSBhY2NlcHRzIGxvY2FsIGRldmVsb3BtZW50IHJlcXVlc3RzIGFuZCB0aG9zZSB3aXRob3V0IG9yaWdpbiBoZWFkZXJzLlxuICAgKiBUaHJvd3MgYSBgQ29yc0Vycm9yYCBmb3IgdW5hdXRob3JpemVkIG9yaWdpbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7JyonIHwgc3RyaW5nW119IFtvcmlnaW5zPVtdXSAtIExpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zIG9yIGBcIipcImAgdG8gYWxsb3cgYWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWxsb3dNZXRob2RzPVsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddXSAtIEFsbG93ZWQgSFRUUCBtZXRob2RzLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUNvcnMoXG4gICAgb3JpZ2luczogXCIqXCIgfCBzdHJpbmdbXSA9IFtdLFxuICAgIGFsbG93TWV0aG9kczogc3RyaW5nW10gPSBbXCJHRVRcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCJdXG4gICkge1xuICAgIGNvbnN0IGFsbG93ZWRPcmlnaW5zID1cbiAgICAgIG9yaWdpbnMgPT09IFwiKlwiID8gXCIqXCIgOiBvcmlnaW5zLm1hcCgobykgPT4gby50cmltKCkudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBjb25zdCBjb3JzT3B0aW9uczogQ29yc09wdGlvbnMgPSB7XG4gICAgICBvcmlnaW46IChvcmlnaW4sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIC8vIEFsbG93IHJlcXVlc3Qgd2l0aG91dCBvcmlnaW4uLi5cbiAgICAgICAgaWYgKCFvcmlnaW4pIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWxsb3dlZE9yaWdpbnMgPT09IFwiKlwiIHx8XG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkoYWxsb3dlZE9yaWdpbnMpICYmXG4gICAgICAgICAgICBhbGxvd2VkT3JpZ2lucy5pbmNsdWRlcyhvcmlnaW4udG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG5ldyBDb3JzRXJyb3IoYE9yaWdpbiAke29yaWdpbn0gbm90IGFsbG93ZWRgKSk7XG4gICAgICB9LFxuICAgICAgY3JlZGVudGlhbHM6IHRydWUsXG4gICAgICBtZXRob2RzOiBhbGxvd01ldGhvZHMuam9pbihcIixcIiksXG4gICAgfTtcblxuICAgIHRoaXMuYXBwLmVuYWJsZUNvcnMoY29yc09wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBcHBsaWVzIHRoZSBIZWxtZXQgbWlkZGxld2FyZSBmb3IgZW5oYW5jZWQgc2VjdXJpdHkuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIER5bmFtaWNhbGx5IGxvYWRzIHRoZSBgaGVsbWV0YCBwYWNrYWdlIGlmIGF2YWlsYWJsZSBhbmQgcmVnaXN0ZXJzIGl0XG4gICAqIGFzIG1pZGRsZXdhcmUgdG8gaW1wcm92ZSBIVFRQIGhlYWRlciBzZWN1cml0eS4gSWYgbm90IGluc3RhbGxlZCwgbG9ncyBhIHdhcm5pbmdcbiAgICogYW5kIGNvbnRpbnVlcyBleGVjdXRpb24gd2l0aG91dCB0aHJvd2luZyBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXNzZWQgdG8gSGVsbWV0LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUhlbG1ldChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgaGVsbWV0ID0gcmVxdWlyZShcImhlbG1ldFwiKTsgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5XG4gICAgICB0aGlzLmFwcC51c2UoaGVsbWV0KG9wdGlvbnMpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkhlbG1ldCBtaWRkbGV3YXJlIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJIZWxtZXQgbm90IGluc3RhbGxlZC4gU2tpcHBpbmcgbWlkZGxld2FyZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbmZpZ3VyZXMgYW5kIGluaXRpYWxpemVzIFN3YWdnZXIgVUkgZm9yIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBVc2VzIHRoZSBgU3dhZ2dlckJ1aWxkZXJgIHV0aWxpdHkgdG8gY29uZmlndXJlIEFQSSBkb2N1bWVudGF0aW9uXG4gICAqIHdpdGggZGV0YWlsZWQgY3VzdG9taXphdGlvbiBmb3IgdGl0bGUsIHZlcnNpb24sIHBhdGhzLCBhbmQgY29sb3JzLlxuICAgKiBTd2FnZ2VyIGlzIGF1dG9tYXRpY2FsbHkgZXhwb3NlZCBhdCB0aGUgY29uZmlndXJlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge1N3YWdnZXJTZXR1cE9wdGlvbnN9IG9wdGlvbnMgLSBTd2FnZ2VyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBzZXR1cFN3YWdnZXIob3B0aW9uczogU3dhZ2dlclNldHVwT3B0aW9ucykge1xuICAgIGNvbnN0IHN3YWdnZXIgPSBuZXcgU3dhZ2dlckJ1aWxkZXIodGhpcy5hcHAsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICBwYXRoOiBvcHRpb25zLnBhdGggfHwgXCJhcGlcIixcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiBvcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBhc3NldHNQYXRoOiBvcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uRmlsZVBhdGg6IG9wdGlvbnMuZmF2aWNvblBhdGgsXG4gICAgICB0b3BiYXJJY29uRmlsZVBhdGg6IG9wdGlvbnMudG9wYmFySWNvblBhdGgsXG4gICAgICB0b3BiYXJCZ0NvbG9yOiBvcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgICBvcGVuQXBpSnNvblBhdGg6IG9wdGlvbnMub3BlbkFwaUpzb25QYXRoLFxuICAgICAgb3BlbkFwaVlhbWxQYXRoOiBvcHRpb25zLm9wZW5BcGlZYW1sUGF0aCxcbiAgICB9KTtcbiAgICBzd2FnZ2VyLnNldHVwU3dhZ2dlcigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIHZhbGlkYXRpb24gcGlwZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuYWJsZXMgcmVxdWVzdCBwYXlsb2FkIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uIGdsb2JhbGx5IGFjcm9zc1xuICAgKiB0aGUgZW50aXJlIE5lc3RKUyBhcHBsaWNhdGlvbi4gTXVsdGlwbGUgcGlwZXMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXJcbiAgICogZm9yIG1vZHVsYXIgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QaXBlVHJhbnNmb3JtW119IHBpcGVzIC0gUGlwZSBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIgZ2xvYmFsbHkuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzOiBQaXBlVHJhbnNmb3JtW10pIHtcbiAgICBpZiAocGlwZXMubGVuZ3RoID4gMCkgdGhpcy5hcHAudXNlR2xvYmFsUGlwZXMoLi4ucGlwZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIGV4Y2VwdGlvbiBmaWx0ZXJzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZCwgaXQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBkZWZhdWx0XG4gICAqIHNldCBvZiBzdGFuZGFyZCBleGNlcHRpb24gZmlsdGVycyBmb3IgY29tbW9uIGVycm9yIHR5cGVzIGxpa2VcbiAgICogYEh0dHBFeGNlcHRpb25gLCBgVmFsaWRhdGlvbkV4Y2VwdGlvbmAsIGBDb25mbGljdEV4Y2VwdGlvbmAsIGFuZCBvdGhlcnMuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGBEZWNhZkV4Y2VwdGlvbkZpbHRlcmAgaXMgY29uc3RydWN0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24nc1xuICAgKiBgTW9kdWxlUmVmYCBzbyBpdCBjYW4gcmVzb2x2ZSB0aGUgcmVxdWVzdC1zY29wZWQgYERlY2FmUmVxdWVzdENvbnRleHRgIChhbmRcbiAgICogaXRzIGNsaWVudC1ib3VuZCBsb2dnZXIpIGZvciB0aGUgcmVxdWVzdCB0aGF0IHRocmV3LCBpbnN0ZWFkIG9mIGxvZ2dpbmdcbiAgICogdGhyb3VnaCB0aGUgZ2VuZXJpYyBnbG9iYWwgbG9nZ2VyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLkV4Y2VwdGlvbkZpbHRlcltdfSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSBnbG9iYWxseS5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgdGhpcy5hcHAudXNlR2xvYmFsRmlsdGVycyhcbiAgICAgIC4uLihmaWx0ZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBmaWx0ZXJzXG4gICAgICAgIDogW25ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcih0aGlzLmFwcC5nZXQoTW9kdWxlUmVmLCB7IHN0cmljdDogZmFsc2UgfSkpXSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiBOZXN0SW50ZXJjZXB0b3JbXSkge1xuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMuYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdGFydHMgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBvcnQgYW5kIGhvc3QuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIExpc3RlbnMgb24gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBvcHRpb25hbGx5IGEgaG9zdC4gT25jZSBzdGFydGVkLFxuICAgKiBsb2dzIHRoZSBhcHBsaWNhdGlvbiBVUkwgZm9yIGVhc3kgYWNjZXNzLiBUaGUgc3RhcnR1cCBwcm9jZXNzIHJlc29sdmVzXG4gICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MzAwMF0gLSBQb3J0IG51bWJlciB0byBsaXN0ZW4gb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaG9zdF0gLSBPcHRpb25hbCBob3N0IG9yIElQIGFkZHJlc3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHtib29sZWFufSBbbG9nPXRydWVdIC0gV2hldGhlciB0byBsb2cgdGhlIGFwcGxpY2F0aW9uIFVSTCB1cG9uIHN0YXJ0dXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoXG4gICAgcG9ydDogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDAsXG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGxvZzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QgYXMgYW55KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5hcHAuZ2V0VXJsKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+agCBBcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0OiAke3VybH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2FsbEhhbmRsZXIsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgRGVmYXVsdEFkYXB0ZXJGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJGbGFncyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogSW50ZXJjZXB0b3IgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyBhbGwgcmVnaXN0ZXJlZCBEZWNhZiByZXF1ZXN0IGhhbmRsZXJzXG4gKiBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGlzIGludm9rZWQuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yfSBpbnRlZ3JhdGVzIHRoZSBEZWNhZiByZXF1ZXN0LWhhbmRsaW5nIHBpcGVsaW5lXG4gKiBpbnRvIE5lc3RKUycgaW50ZXJjZXB0b3IgbWVjaGFuaXNtLiBCZWZvcmUgcGFzc2luZyBleGVjdXRpb24gdG8gdGhlIG5leHQgaGFuZGxlciBpbiB0aGVcbiAqIE5lc3RKUyBjaGFpbiwgaXQgZGVsZWdhdGVzIHJlcXVlc3QgcHJvY2Vzc2luZyB0byB0aGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSwgd2hpY2hcbiAqIHNlcXVlbnRpYWxseSBydW5zIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMuIFRoaXMgYWxsb3dzXG4gKiBiZWhhdmlvcnMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbG9nZ2luZywgdGVuYW50IHJlc29sdXRpb24sIG9yIG1ldGFkYXRhIGVucmljaG1lbnRcbiAqIHRvIG9jY3VyIHByaW9yIHRvIGNvbnRyb2xsZXIgZXhlY3V0aW9uLlxuICpcbiAqIEBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFwcGx5IGdsb2JhbGx5OlxuICogYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyhuZXcgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKGV4ZWN1dG9yKSk7XG4gKlxuICogLy8gT3IgaW4gYSBtb2R1bGU6XG4gKiBATW9kdWxlKHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gKiAgICAge1xuICogICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICogICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAqICAgICB9LFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBJbnRlcmNlcHRvclxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgQ29udHJvbGxlclxuICpcbiAqICAgICBDbGllbnQtPj5JbnRlcmNlcHRvcjogSFRUUCBSZXF1ZXN0XG4gKiAgICAgSW50ZXJjZXB0b3ItPj5FeGVjdXRvcjogZXhlYyhyZXF1ZXN0KVxuICogICAgIEV4ZWN1dG9yLS0+PkludGVyY2VwdG9yOiBoYW5kbGVycyBjb21wbGV0ZWRcbiAqICAgICBJbnRlcmNlcHRvci0+PkNvbnRyb2xsZXI6IG5leHQuaGFuZGxlKClcbiAqICAgICBDb250cm9sbGVyLS0+PkNsaWVudDogUmVzcG9uc2VcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhlY3V0b3I6IERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gICkge31cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29udGV4dHVhbGl6ZShyZXE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgICBjb25zdCBmbGFnczogRGVjYWZTZXJ2ZXJGbGFncyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgaXAgPSBleHRyYWN0SXAocmVxKTtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih7IGlwIH0pO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWAsXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWdzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcikge1xuICAgIGNvbnN0IHJlcSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcyA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IpLmZvcih0aGlzLmludGVyY2VwdCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0dWFsaXplKHJlcSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGNvbnRleHR1YWxpemVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWMocmVxLCByZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBleGVjdXRvcnMgZmluaXNoZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0SXAocmVxOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gIGZ1bmN0aW9uIHBhcnNlSXBIZWFkZXIodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pWzBdO1xuICB9XG4gIHJldHVybiAoXG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LWZvcndhcmRlZC1mb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LXJlYWwtaXBcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLUZvcndhcmRlZC1Gb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLVJlYWwtSVBcIl0pID8/XG4gICAgcmVxLmlwXG4gICk7XG59XG4iLCJpbXBvcnQgeyBJbmplY3QgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBpbmplY3RhYmxlU2VydmljZUtleSxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvc2l0b3J5IGFzIENvcmVSZXBvc2l0b3J5LFxuICBTZXJ2aWNlIGFzIENvcmVTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkZhY3RvcnlQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogc3RyaW5nO1xuICB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duO1xufTtcblxuY29uc3QgcGVuZGluZ1Byb3ZpZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEZWNhZkZhY3RvcnlQcm92aWRlcj4oKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRHJhaW5zIHRoZSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBieSB7QGxpbmsgU2VydmljZX0ve0BsaW5rIFJlcG9zaXRvcnl9IHVzYWdlcy5cbiAqIEBzdW1tYXJ5IENvbnN1bWVkIGJ5IHtAbGluayBEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdH0gdG8gd2lyZSB0aGUgdG9rZW5zIHRoYXQgdGhvc2UgcGFyYW1ldGVyXG4gKiBkZWNvcmF0b3JzIHJlZmVyZW5jZSBiYWNrIGludG8gTmVzdCdzIERJIGNvbnRhaW5lciwgc2luY2UgYSBwYXJhbWV0ZXIgZGVjb3JhdG9yIGFsb25lIGNhbm5vdFxuICogc3VwcGx5IGEgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTogRGVjYWZGYWN0b3J5UHJvdmlkZXJbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHBlbmRpbmdQcm92aWRlcnMudmFsdWVzKCkpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHRva2VuOiBzdHJpbmcsIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBlbmRpbmdQcm92aWRlcnMuaGFzKHRva2VuKSkgcmV0dXJuO1xuICBwZW5kaW5nUHJvdmlkZXJzLnNldCh0b2tlbiwgeyBwcm92aWRlOiB0b2tlbiwgdXNlRmFjdG9yeSB9KTtcbn1cblxuZnVuY3Rpb24gaXNNb2RlbENvbnN0cnVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29uc3RydWN0b3I8YW55PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBNb2RlbDtcbn1cblxuZnVuY3Rpb24gbW9kZWxTZXJ2aWNlVG9rZW4obW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bW9kZWwubmFtZX1TZXJ2aWNlYDtcbn1cblxuZnVuY3Rpb24gbW9kZWxSZXBvc2l0b3J5VG9rZW4oXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gZmxhdm91ciA/IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeUAke2ZsYXZvdXJ9YCA6IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeWA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYgc2VydmljZS5cbiAqIEBzdW1tYXJ5IFRyYW5zbGF0ZXMgZGVjYWYncyBzZXJ2aWNlIHJlc29sdXRpb24gQVBJcyBpbnRvIGEgTmVzdCBgQEluamVjdCgpYCBjYWxsOlxuICogLSBgQFNlcnZpY2UoU29tZU1vZGVsKWAgaW5qZWN0cyB0aGUgbWF0Y2hpbmcgYEBzZXJ2aWNlKFNvbWVNb2RlbClgIGRlY2FmIHNlcnZpY2Ugd2hlbiBvbmUgaXNcbiAqICAgcmVnaXN0ZXJlZDsgb3RoZXJ3aXNlIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGBNb2RlbFNlcnZpY2U8U29tZU1vZGVsPmAgc2luZ2xldG9uXG4gKiAgICh2aWEge0BsaW5rIE1vZGVsU2VydmljZS5mb3JNb2RlbH0pLlxuICogLSBgQFNlcnZpY2UoU29tZVNlcnZpY2VDbGFzcylgIG9yIGBAU2VydmljZShcImFsaWFzXCIpYCBpbmplY3RzIHRoZSBtYXRjaGluZyBgQHNlcnZpY2UoKWAtZGVjb3JhdGVkXG4gKiAgIGRlY2FmIHtAbGluayBDb3JlU2VydmljZX0gKHZpYSB7QGxpbmsgQ29yZVNlcnZpY2UuZ2V0fSkuXG4gKiAtIGBAU2VydmljZSgpYCBpbmZlcnMgdGhlIHBhcmFtZXRlcidzIHR5cGUgZnJvbSBlbWl0dGVkIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGFuZCByZXNvbHZlcyBpdCB0aGVcbiAqICAgc2FtZSB3YXksIHByb3ZpZGVkIHRoZSBwYXJhbWV0ZXIgaXMgdHlwZWQgYXMgYSBjb25jcmV0ZSBjbGFzcyAoZ2VuZXJpY3MgbGlrZSBgTW9kZWxTZXJ2aWNlPFg+YFxuICogICBhcmUgZXJhc2VkIGF0IHJ1bnRpbWUsIHNvIHRoZSBtb2RlbC1zZXJ2aWNlIGZvcm0gYWx3YXlzIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGFyZ3VtZW50KS5cbiAqIEBwYXJhbSBrZXkgdGhlIG1vZGVsIGNsYXNzLCBzZXJ2aWNlIGNsYXNzLCBvciBhbGlhcyB0byByZXNvbHZlLiBPbWl0IHRvIGluZmVyIGZyb20gdGhlIHBhcmFtZXRlciB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2VydmljZShrZXk/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IHJlc29sdmVkOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0ga2V5O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHBhcmFtVHlwZXM6IGFueVtdID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIHRhcmdldCkgfHwgW107XG4gICAgICByZXNvbHZlZCA9IHBhcmFtVHlwZXNbcGFyYW1ldGVySW5kZXhdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEBTZXJ2aWNlKCkgY291bGQgbm90IGRldGVybWluZSBhbiBpbmplY3Rpb24gdHlwZSBmb3IgcGFyYW1ldGVyICR7cGFyYW1ldGVySW5kZXh9IG9mICR7KHRhcmdldCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KS5uYW1lfS4gUHJvdmlkZSBhbiBleHBsaWNpdCBhcmd1bWVudCwgZS5nLiBAU2VydmljZShTb21lU2VydmljZSkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhc01vZGVsID0gdHlwZW9mIHJlc29sdmVkICE9PSBcInN0cmluZ1wiICYmIGlzTW9kZWxDb25zdHJ1Y3RvcihyZXNvbHZlZCk7XG4gICAgY29uc3QgdG9rZW4gPSBhc01vZGVsXG4gICAgICA/IG1vZGVsU2VydmljZVRva2VuKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pXG4gICAgICA6IGluamVjdGFibGVTZXJ2aWNlS2V5KHJlc29sdmVkIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pO1xuXG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4ge1xuICAgICAgaWYgKGFzTW9kZWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmVkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkKVxuICAgICAgICA6IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiB7QGxpbmsgQ29yZVJlcG9zaXRvcnl9IGZvciBgbW9kZWxgLlxuICogQHN1bW1hcnkgVW5saWtlIHtAbGluayBTZXJ2aWNlfSwgYG1vZGVsYCBpcyBhbHdheXMgdHJlYXRlZCBhcyBhIE1vZGVsIGNsYXNzOiB0aGUgc2FtZSBjbGFzcyBwYXNzZWRcbiAqIHRvIGBAU2VydmljZShtb2RlbClgIGFuZCBgQFJlcG9zaXRvcnkobW9kZWwpYCByZXNvbHZlcyB0byB0d28gZGlmZmVyZW50IGluamVjdGVkIG9iamVjdHMgKGFcbiAqIGBNb2RlbFNlcnZpY2U8TT5gIHZzIGEgYFJlcG9zaXRvcnk8TT5gIHJlc3BlY3RpdmVseSksIHZpYSB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBjbGFzcyB0byByZXNvbHZlIGEgcmVwb3NpdG9yeSBmb3IuXG4gKiBAcGFyYW0gZmxhdm91ciBvcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIvYWxpYXMsIGZvcndhcmRlZCB0byB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVwb3NpdG9yeShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRva2VuID0gbW9kZWxSZXBvc2l0b3J5VG9rZW4obW9kZWwsIGZsYXZvdXIpO1xuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IENvcmVSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsLCBmbGF2b3VyKSk7XG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgRHluYW1pY01vZHVsZSxcbiAgR2xvYmFsLFxuICBJbmplY3QsXG4gIE1vZHVsZSxcbiAgT25BcHBsaWNhdGlvblNodXRkb3duLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiwgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVDQUZfQURBUFRFUl9JRCxcbiAgREVDQUZfSEFORExFUlMsXG4gIERFQ0FGX01PRFVMRV9PUFRJT05TLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbn0gZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3RcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBQZXJzaXN0ZW5jZVNlcnZpY2UsIFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxuICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbkBHbG9iYWwoKVxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkNvcmVNb2R1bGU8Q09ORiwgQURBUFRFUiBleHRlbmRzIEFkYXB0ZXI8Q09ORiwgYW55LCBhbnksIGFueT4+XG4gIGltcGxlbWVudHMgT25BcHBsaWNhdGlvblNodXRkb3duXG57XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICBwcml2YXRlIHN0YXRpYyBfcGVyc2lzdGVuY2U/OiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PjtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBwZXJzaXN0ZW5jZSgpOiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiUGVyc2lzdGVuY2Ugc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmQ29yZU1vZHVsZSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfTU9EVUxFX09QVElPTlMpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnM8Q09ORiwgQURBUFRFUj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZWY6IE1vZHVsZVJlZlxuICApIHt9XG5cbiAgc3RhdGljIGZvclJvb3Qob3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgY29uc3QgZGVjYWZQcm92aWRlcnMgPSBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkNvcmVNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9NT0RVTEVfT1BUSU9OUywgdXNlVmFsdWU6IG9wdGlvbnMgfSxcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9BREFQVEVSX0lELCB1c2VWYWx1ZTogdGhpcy5wZXJzaXN0ZW5jZT8uY2xpZW50IH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PlxuICAgICAgICAgICAgb3B0aW9ucy5oYW5kbGVycz8ubWFwKChIKSA9PiB7XG4gICAgICAgICAgICAgIGxvZy5pbmZvKGBSZWdpc3RlcmVkIHJlcXVlc3QgaGFuZGxlcjogJHtILm5hbWV9YCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSCgpO1xuICAgICAgICAgICAgfSkgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICAgIHVzZUNsYXNzOiBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLFxuICAgICAgXSxcbiAgICAgIGV4cG9ydHM6IFtcbiAgICAgICAgREVDQUZfTU9EVUxFX09QVElPTlMsXG4gICAgICAgIERFQ0FGX0FEQVBURVJfSUQsXG4gICAgICAgIERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMubWFwKChwcm92aWRlcikgPT4gcHJvdmlkZXIucHJvdmlkZSksXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgYm9vdFBlcnNpc3RlbmNlKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYm9vdFBlcnNpc3RlbmNlKTtcblxuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBvcHRpb25zLmNvbmYubWFwKChbY29udHIsIGNmZywgLi4uYXJnc10pID0+IHtcbiAgICAgICAgY29uc3QgcG9zc2libGUgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXBvc3NpYmxlKSByZXR1cm4gW2NvbnRyLCBjZmddO1xuICAgICAgICByZXR1cm4gW2NvbnRyLCBjZmcsIC4uLmFyZ3NdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IG5ldyBQZXJzaXN0ZW5jZVNlcnZpY2UoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3BlcnNpc3RlbmNlLmJvb3QodHJpbW1lZCk7XG4gICAgICBjb25zdCBjbGllbnRzID0gdGhpcy5fcGVyc2lzdGVuY2UuY2xpZW50O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbmZbaV07XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlVHJhbnNmID0gYy5zbGljZSgyLCBjLmxlbmd0aCk7XG4gICAgICAgIGxldCB0cmFuc2Zvcm1lciA9IHBvc3NpYmxlVHJhbnNmLnBvcCgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRyYW5zZm9ybWVyIHx8XG4gICAgICAgICAgISh0cmFuc2Zvcm1lciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBjb250ciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoY2xpZW50c1tpXS5mbGF2b3VyKTtcbiAgICAgICAgICBpZiAoIWNvbnRyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBObyB0cmFuc2Zvcm1lciBmb3VuZCBmb3IgZmxhdm91ciAke2NsaWVudHNbaV0uZmxhdm91cn0uIHlvdSBzaG91bGQgZWl0aGVyIEByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgb3IgcHJvdmlkZSBhIHRyYW5zZm9ybWVyIGluIHRoZSBjb25maWdgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lciA9IChjb250ciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICAgICAgICA/IGNvbnRyXG4gICAgICAgICAgICAgIDogbmV3IChjb250ciBhcyBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55Pj4pKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gYm9vdCB0cmFuc2Zvcm1lciBmb3IgJHtjbGllbnRzW2ldLmZsYXZvdXJ9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyKGNsaWVudHNbaV0uZmxhdm91cikodHJhbnNmb3JtZXIpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oXCJwZXJzaXN0ZW5jZSBsYXllciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcIik7XG5cbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0aWFsaXphdGlvbigpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIGFwcGxpY2F0aW9uOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gIH1cblxuICBhc3luYyBvbkFwcGxpY2F0aW9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gRGVjYWZDb3JlTW9kdWxlLmxvZy5mb3IodGhpcy5vbkFwcGxpY2F0aW9uU2h1dGRvd24pO1xuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICB0aGlzLm1vZHVsZVJlZi5nZXQ8YW55PihERUNBRl9BREFQVEVSX0lEKTtcbiAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgYWRhcHRlcnMpXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICAgIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICR7YWRhcHRlci50b1N0cmluZygpfWApO1xuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBhcHBsaWNhdGlvbmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBTZXJ2aWNlLnNodXRkb3duKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gc2VydmljZXNgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgPSBTeW1ib2woXG4gIFwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTXCJcbik7XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzOiBhbnlbXSk6IHVua25vd25bXSB7XG4gIGNvbnN0IFttb2RlbENvbnN0ciwgb3BlcmF0aW9uLCBpZCwgcGF5bG9hZF0gPSBhcmdzO1xuXG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsQ29uc3RyPy5uYW1lID8/IG1vZGVsQ29uc3RyO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWRQYXlsb2FkID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKVxuICAgID8gcGF5bG9hZC5tYXAoKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGUuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBlLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBheWxvYWQgaXRlbSBmb3IgJHttb2RlbE5hbWV9IGRvZXMgbm90IGhhdmUgc2VyaWFsaXplIG1ldGhvZCBhbmQgaXMgYW4gJHt0eXBlb2YgZX0sIGF0dGVtcHRpbmcgdG8gc3RyaW5naWZ5IGRpcmVjdGx5LiBJdGVtOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSBcInN0cmluZ1wiID8gZSA6IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBzZXJpYWxpemUgcGF5bG9hZCBmb3IgJHttb2RlbE5hbWV9OiAke2Vycn1gKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIDogcGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZC5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXlsb2FkLnNlcmlhbGl6ZSgpXG4gICAgICA6IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gcGF5bG9hZFxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gIGNvbnNvbGUuZGVidWcoXG4gICAgYE5vcm1hbGl6ZWQgZXZlbnQgcmVzcG9uc2UgZm9yIG1vZGVsICR7bW9kZWxOYW1lfSwgb3BlcmF0aW9uICR7b3BlcmF0aW9ufSwgaWQgJHtpZH06YCxcbiAgICBzZXJpYWxpemVkUGF5bG9hZFxuICApO1xuXG4gIHJldHVybiBbbW9kZWxOYW1lLCBvcGVyYXRpb24sIGlkLCBzZXJpYWxpemVkUGF5bG9hZF07XG59XG4iLCJpbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQWRhcHRlciwgT2JzZXJ2ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIEluamVjdCwgTWVzc2FnZUV2ZW50LCBRdWVyeSwgU3NlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRXZlbnRSZXNwb25zZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5AQ29udHJvbGxlcigpXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29udHJvbGxlciBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxEZWNhZlNlcnZlckN0eD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBJbmplY3QoTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTKSBmbGF2b3Vyczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcbiAgICB0aGlzLmFkYXB0ZXJzID0gZmxhdm91cnMubWFwKChmbGF2b3VyKSA9PiAoQWRhcHRlciBhcyBhbnkpLmdldChmbGF2b3VyKSk7IC8vIGNoYW5nZSB0byBBZGFwdGVyLmNhY2hlKFwiXCIpXG4gIH1cblxuICBAU3NlKClcbiAgbGlzdGVuKCk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIGNvbnN0IGV2ZW50cyQgPSBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJJZCA9XG4gICAgICAgIGBCLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYENyZWF0aW5nIFNTRSBvYnNlcnZlcjogJHtvYnNlcnZlcklkfSBmb3IgY2xpZW50ICR7dGhpcy5jbGllbnRDb250ZXh0LnV1aWR9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgb2JzZXJ2ZXJJZCA9IG9ic2VydmVySWQ7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSByZWNlaXZlZCByZWZyZXNoIGV2ZW50YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJncyk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogXCJtZXNzYWdlXCIsIGRhdGEgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IGV2ZW50IHB1c2hlZCB0byBjbGllbnRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gYWNyb3NzICR7dGhpcy5hZGFwdGVycy5sZW5ndGh9IGFkYXB0ZXIocylgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVnaXN0ZXIgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmluZyB1cCBTU0Ugb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfWApO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFVucmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBmcm9tIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFpbGVkIGR1cmluZyBjbGVhbnVwIG9mIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxNTAwMDtcbiAgICBjb25zdCBoZWFydGJlYXQkID0gaW50ZXJ2YWwoSEVBUlRCRUFUX0lOVEVSVkFMX01TKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgKCk6IE1lc3NhZ2VFdmVudCA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiaGVhcnRiZWF0XCIsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoZXZlbnRzJCwgaGVhcnRiZWF0JCk7XG4gIH1cblxuICBAU3NlKFwiLzptb2RlbFwiKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGxpc3RlbkZvck1vZGVsKEBRdWVyeShcIm1vZGVsXCIpIG1vZGVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBkYXRhOiBhcmdzIH0gYXMgYW55KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoYEZhaWxlZCB0byBvYnNlcnZlIGV2ZW50OiAke2UubWVzc2FnZSB8fCBlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRXZlbnRzQ29udHJvbGxlciB9IGZyb20gXCIuL0V2ZW50c0NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZlN0cmVhbU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JGbGF2b3VycyhcbiAgICBmbGF2b3Vyczogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nID0gXCJldmVudHNcIlxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzOiBbRXZlbnRzQ29udHJvbGxlcl0sXG4gICAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJvdXRlck1vZHVsZS5yZWdpc3RlcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIiksXG4gICAgICAgICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTLFxuICAgICAgICAgIHVzZVZhbHVlOiBmbGF2b3VycyA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldE1vZHVsZUZvciB9IGZyb20gXCIuL2RlY2FmLW1vZGVsL2luZGV4XCI7XG5pbXBvcnQgeyBEZWNhZlN0cmVhbU1vZHVsZSB9IGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycywgYXV0b1NlcnZpY2VzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIGF3YWl0IERlY2FmQ29yZU1vZHVsZS5ib290UGVyc2lzdGVuY2Uob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91cnMgPSBhZGFwdGVycy5tYXAoKGFkYXB0ZXIpID0+IGFkYXB0ZXIuZmxhdm91cik7XG5cbiAgICBjb25zdCBpbXBvcnRzOlxuICAgICAgfCAoXG4gICAgICAgICAgfCBEeW5hbWljTW9kdWxlXG4gICAgICAgICAgfCBUeXBlPGFueT5cbiAgICAgICAgICB8IFByb21pc2U8RHluYW1pY01vZHVsZT5cbiAgICAgICAgICB8IEZvcndhcmRSZWZlcmVuY2U8YW55PlxuICAgICAgICApW11cbiAgICAgIHwgdW5kZWZpbmVkID0gW0RlY2FmQ29yZU1vZHVsZS5mb3JSb290KG9wdGlvbnMpXTtcblxuICAgIGlmIChhdXRvQ29udHJvbGxlcnMpIHtcbiAgICAgICAgZmxhdm91cnMuZm9yRWFjaCgoZmxhdm91cikgPT4ge1xuICAgICAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgICAgIGdldE1vZHVsZUZvcihmbGF2b3VyKS5mb3JSb290KGZsYXZvdXIsIHtcbiAgICAgICAgICAgICAgYXV0b1NlcnZpY2VzLFxuICAgICAgICAgICAgICBjb250cm9sbGVyRXhwb3N1cmU6IG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlLFxuICAgICAgICAgICAgICBjb250cm9sbGVyQ29uZmlnOiBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uczogb3B0aW9ucy5hZ2dyZWdhdGlvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zPy5lbmFibGVPYnNlcnZlckV2ZW50cykge1xuICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICBEZWNhZlN0cmVhbU1vZHVsZS5mb3JGbGF2b3VycyhcbiAgICAgICAgICBvcHRpb25zLm9ic2VydmVyT3B0aW9ucy5vYnNlcnZlckZsYXZvdXJzIHx8IGZsYXZvdXJzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7fVxuIiwiaW1wb3J0IHtNb2RlbH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbEVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7UmVwb3NpdG9yeX0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvRm9yTW9kZWwobW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBtID0gTW9kZWwuZ2V0KG1vZGVsKTtcblx0aWYgKCFtKVxuXHRcdHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApXG5cdGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXHRyZXR1cm4gcmVwbztcbn0iLCIvKipcbiAqIEBtb2R1bGUgZm9yLW5lc3RcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB0cy13b3Jrc3BhY2UgbGlicmFyeS4gSXQgYWdncmVnYXRlcyBhbmQgZXhwb3J0c1xuICogZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgdXRpbGl0aWVzIHdpdGhpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBUaGUgbW9kdWxlIGluY2x1ZGVzOlxuICogMS4gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIFwiLi91dGlsc1wiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhlc2UgbGlrZWx5IGNvbnRhaW4gaGVscGVyIGZ1bmN0aW9ucywgY29tbW9uIHR5cGVzLCBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuICogICAgLSBNYXkgaW5jbHVkZSBvcGVyYXRpb25zIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgdHlwZSBjaGVja2luZywgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdGllcy5cbiAqXG4gKiAyLiBBIG5hbWVzcGFjZSBhbmQgcmVsYXRlZCB0eXBlcyBmcm9tIHRoZSBcIi4vbmFtZXNwYWNlXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGlzIGNvdWxkIGNvbnRhaW4gZG9tYWluLXNwZWNpZmljIGNvZGUgb3IgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cbiAqICAgIC0gTWlnaHQgaW5jbHVkZSBpbnRlcmZhY2VzLCB0eXBlcywgb3IgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBjb3JlIGNvbmNlcHRzIGluIHRoZSBsaWJyYXJ5LlxuICpcbiAqIDMuIEEgVkVSU0lPTiBjb25zdGFudDpcbiAqICAgIC0gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiAgICAtIFVzZWZ1bCBmb3IgdmVyc2lvbiBjaGVja2luZyBhbmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIGNsZWFuIGFuZCBvcmdhbml6ZWQgZXhwb3J0IG9mIHRoZSBtb2R1bGUncyBmdW5jdGlvbmFsaXR5LCBhbGxvd2luZyBjb25zdW1lcnNcbiAqIHRvIGVhc2lseSBpbXBvcnQgYW5kIHVzZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeSBhcyBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCBcIi4vZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7IC8vIG9uIHRvcCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXV0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmFjdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udHJvbGxlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuLy8gZXhwb3J0ICogZnJvbSBcIi4vd2ViaG9va3NcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKHRydWUpO1xuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKGZhbHNlKTtcbiJdLCJuYW1lcyI6WyJERUNPUkFUT1JTX1BSRUZJWCIsIkRFQ09SQVRPUlMiLCJBUElfT1BFUkFUSU9OIiwiQVBJX1JFU1BPTlNFIiwiQVBJX1BST0RVQ0VTIiwiQVBJX0NPTlNVTUVTIiwiQVBJX1RBR1MiLCJBUElfQ0FMTEJBQ0tTIiwiQVBJX1BBUkFNRVRFUlMiLCJBUElfSEVBREVSUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTIiwiQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVkiLCJBUElfU0VDVVJJVFkiLCJBUElfRVhDTFVERV9FTkRQT0lOVCIsIkFQSV9FWENMVURFX0NPTlRST0xMRVIiLCJBUElfRVhUUkFfTU9ERUxTIiwiQVBJX0VYVEVOU0lPTiIsIkFQSV9TQ0hFTUEiLCJBUElfREVGQVVMVF9HRVRURVIiLCJBUElfTElOSyIsImlzQ29uc3RydWN0b3IiLCJ2YWwiLCJNRVRBREFUQV9GQUNUT1JZX05BTUUiLCJNRVRIT0RfTUVUQURBVEEiLCJjcmVhdGVNZXRob2REZWNvcmF0b3IiLCJtZXRha2V5IiwibWV0YWRhdGEiLCJvdmVycmlkZUV4aXN0aW5nIiwidGFyZ2V0Iiwia2V5IiwiZGVzY3JpcHRvciIsInByZXZWYWx1ZSIsIlJlZmxlY3QiLCJnZXRNZXRhZGF0YSIsInZhbHVlIiwiZGVmaW5lTWV0YWRhdGEiLCJjcmVhdGVDbGFzc0RlY29yYXRvciIsImNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJleGlzdGluZ01ldGFkYXRhIiwibmV3TWV0YWRhdGEiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIm1ldGFkYXRhVG9TYXZlIiwidHlwZSIsImNvbnN0cnVjdG9yIiwiY3JlYXRlTWl4ZWREZWNvcmF0b3IiLCJtZXRhZGF0YXMiLCJBcnJheSIsImlzQXJyYXkiLCJwcmV2aW91c01ldGFkYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiY3JlYXRlUGFyYW1EZWNvcmF0b3IiLCJpbml0aWFsIiwicGFyYW1PcHRpb25zIiwicGFyYW1ldGVycyIsInByb3BlcnR5S2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJtZXRob2REZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNBcGlNZXRob2QiLCJoYXNNZXRhZGF0YSIsImdldFR5cGVJc0FycmF5VHVwbGUiLCJpbnB1dCIsImlzQXJyYXlGbGFnIiwiaXNJbnB1dEFycmF5Iiwib2JqIiwiZ2V0RW51bVZhbHVlcyIsImVudW1UeXBlIiwibnVtZXJpY1ZhbHVlcyIsInZhbHVlcyIsImZpbHRlciIsIm1hcCIsInRvU3RyaW5nIiwia2V5cyIsImdldEVudW1UeXBlIiwiaGFzU3RyaW5nIiwiaXNTdHJpbmciLCJsZW5ndGgiLCJyZXF1aXJlZCIsImlzRW51bUFycmF5Iiwib3B0cyIsImVudW0iLCJ1bmRlZmluZWQiLCJBcGlQcm9wZXJ0eSIsIm9wdGlvbnMiLCJjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvciIsImVudW1WYWx1ZXMiLCJpdGVtcyIsIkFwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIk1vZGVsQ29uc3RydWN0b3IiLCJ2ZXJiIiwicGF0aCIsImh0dHBUb0NydWQiLCJHRVQiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkdldCIsIlBPU1QiLCJDUkVBVEUiLCJQb3N0IiwiUFVUIiwiVVBEQVRFIiwiUHV0IiwiUEFUQ0giLCJQYXRjaCIsIkRFTEVURSIsIkRlbGV0ZSIsImNydWRPcCIsIkh0dHBNZXRob2REZWNvcmF0b3IiLCJyZXNvbHZlQmxvY2tUYXJnZXQiLCJjb3JlSXNPcGVyYXRpb25CbG9ja2VkIiwia2luZCIsImFwcGx5IiwiQXBpRXhjbHVkZUVuZHBvaW50IiwiQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIlJFQURfQUxMIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwibm9ybWFsaXplZCIsInJlcGxhY2UiLCJzdGF0ZW1lbnRUYXJnZXRzIiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiTElTVF9CWSIsIlBBR0VfQlkiLCJGSU5EIiwiUEFHRSIsIkZJTkRfT05FX0JZIiwiRklORF9CWSIsIkNPVU5UX09GIiwiTUFYX09GIiwiTUlOX09GIiwiQVZHX09GIiwiU1VNX09GIiwiRElTVElOQ1RfT0YiLCJHUk9VUF9PRiIsInN0YXJ0c1dpdGgiLCJzdGF0ZW1lbnRWYWx1ZSIsIkFwaVBhcmFtc0Zyb21Nb2RlbCIsInByb3BzIiwiZGVjb3JhdG9ycyIsInAiLCJBcGlQYXJhbURlYyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlN0cmluZyIsImFwcGx5RGVjb3JhdG9ycyIsIkRlY2FmQm9keSIsImRhdGEiLCJjdHgiLCJyZXF1ZXN0Iiwic3dpdGNoVG9IdHRwIiwiZ2V0UmVxdWVzdCIsImJvZHkiLCJjb250cm9sbGVyIiwiZ2V0Q2xhc3MiLCJNb2RlbENvbnN0ciIsImNsYXNzIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIsIml0ZW0iLCJPcmRlcmVkUGFyYW1zIiwib3JkZXIiLCJyZXEiLCJvcmlnaW5hbCIsInBhcmFtcyIsIm9yZGVyTGlzdCIsIm9yZGVyZWQiLCJrIiwicmF3IiwidmFsdWVzSW5PcmRlciIsImtleXNJbk9yZGVyIiwiRGVjYWZQYXJhbXMiLCJEZWNhZlF1ZXJ5IiwiXyIsInF1ZXJ5IiwicGFyc2VkIiwibGltaXQiLCJuIiwiTnVtYmVyIiwiaXNOYU4iLCJvZmZzZXQiLCJib29rbWFyayIsIkRFQ0FGX01PRFVMRV9PUFRJT05TIiwiREVDQUZfQURBUFRFUl9JRCIsIkRFQ0FGX1RBU0tfU0VSVklDRV9JRCIsIkRFQ0FGX1JPVVRFIiwiREVDQUZfSEFORExFUlMiLCJTeW1ib2wiLCJERUNBRl9FWFBPU0UiLCJERUNBRl9DT05UUk9MTEVSX0NPTkZJRyIsIkRFQ0FGX0NPTlRFWFRfS0VZIiwiZXhwb3NlIiwiZmxhdm91cnMiLCJNZXRhZGF0YSIsInNldCIsImNvbnRyb2xsZXJDb25maWciLCJjb25maWciLCJjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yIiwiQVVUSF9IQU5ETEVSIiwiQVVUSF9NRVRBX0tFWSIsIklTX1BVQkxJQ19LRVkiLCJSRVFVSVJFRF9ST0xFU19LRVkiLCJTS0lQX01PREVMX1JPTEVTX0tFWSIsIkRlY2FmUmVxdWVzdENvbnRleHQiLCJSZXF1ZXN0Q29udGV4dCIsInN1cGVyIiwiaGVhZGVyc09mIiwiaGVhZGVycyIsInRoaXMiLCJ1dWlkIiwiVVVJRCIsImluc3RhbmNlIiwiZ2VuZXJhdGUiLCJnZXRPclVuZGVmaW5lZCIsInB1dCIsInJlY29yZCIsIm92ZXJyaWRlcyIsImdldCIsImUiLCJhY2N1bXVsYXRlIiwiX19kZWNvcmF0ZSIsIkluamVjdGFibGUiLCJzY29wZSIsIlNjb3BlIiwiUkVRVUVTVCIsIl9fcGFyYW0iLCJJbmplY3QiLCJBdXRoSW50ZXJjZXB0b3IiLCJyZWZsZWN0b3IiLCJyZXF1ZXN0Q29udGV4dCIsImF1dGhIYW5kbGVyIiwiaW50ZXJjZXB0IiwibmV4dCIsImxvZyIsIkxvZ2dpbmciLCJmb3IiLCJpc1B1YmxpYyIsImdldEFsbEFuZE92ZXJyaWRlIiwiZ2V0SGFuZGxlciIsIm1vZGVsTmFtZSIsInJlcXVpcmVkUm9sZXMiLCJza2lwTW9kZWxSb2xlcyIsImVmZmVjdGl2ZU1vZGVsIiwidmVyYm9zZSIsImRlYnVnIiwiYXV0aG9yaXplIiwiYXBwbHlUcmFuc2Zvcm1lcnMiLCJ1c2VyIiwib3JnYW5pemF0aW9uIiwiY3VycmVudExvZyIsImNoaWxkTG9nIiwibG9nZ2VyIiwiaGFuZGxlIiwiQWRhcHRlciIsImZsYXZvdXJzVG9UcmFuc2Zvcm0iLCJmbGF2b3VyIiwidHJhbnNmb3JtZXIiLCJ0cmFuc2Zvcm1lckZvciIsImZyb20iLCJPcHRpb25hbCIsIlJlZmxlY3RvciIsIkF1dGgiLCJtb2RlbCIsInJlc291cmNlIiwiZGVjcyIsIkFwaUJlYXJlckF1dGgiLCJVc2VJbnRlcmNlcHRvcnMiLCJwdXNoIiwiU2V0TWV0YWRhdGEiLCJQdWJsaWMiLCJSZXF1aXJlUm9sZXMiLCJyb2xlcyIsIkFwaVNlY3VyaXR5IiwiSHR0cFZlcmJUb0RlY29yYXRvciIsImRlY29yYXRvciIsIlVuc3VwcG9ydGVkRXJyb3IiLCJleHRyYWN0UGF0aFBhcmFtcyIsInJvdXRlUGF0aCIsInNwbGl0Iiwic2xpY2UiLCJhcGlQYXJhbVNwZWMiLCJ0b0RlY2FmRXJyb3IiLCJlcnJvciIsImZhbGxiYWNrTWVzc2FnZSIsIkJhc2VFcnJvciIsIkludGVybmFsRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJnZXRBcGlEZWNvcmF0b3JzIiwibWV0aG9kTmFtZSIsImh0dHBWZXJiIiwiaW5jbHVkZVF1ZXJ5UGFyYW1zIiwiTmVzdEh0dHBSb3V0ZURlYyIsImFwaVBhdGhQYXJhbXMiLCJzd2FnZ2VyUXVlcnlQYXJhbXMiLCJBcGlRdWVyeSIsIk9yZGVyRGlyZWN0aW9uIiwibWV0aG9kIiwiQXBpUGFyYW0iLCJBcGlPcGVyYXRpb24iLCJzdW1tYXJ5IiwiQXBpT2tSZXNwb25zZSIsIkFwaU5vQ29udGVudFJlc3BvbnNlIiwiUXVlcnkiLCJhcHBseUFwaURlY29yYXRvcnMiLCJwcm90byIsImZvckVhY2giLCJkIiwiaW5kZXgiLCJyZXNvbHZlUGVyc2lzdGVuY2VNZXRob2QiLCJwZXJzaXN0ZW5jZSIsImFyZ3MiLCJNb2RlbFNlcnZpY2UiLCJzdGF0ZW1lbnQiLCJjcmVhdGVSb3V0ZUhhbmRsZXIiLCJhc3luYyIsInBhdGhQYXJhbXMiLCJxdWVyeVBhcmFtcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaXJlY3Rpb24iLCJkZWZpbmVSb3V0ZU1ldGhvZCIsIkNvbnRyb2xsZXJDbGFzcyIsImhhbmRsZXIiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiRGVjYWZBdXRoSGFuZGxlciIsIkF1dGhIYW5kbGVyIiwicGFyc2VSZXF1ZXN0IiwidXNlclJvbGUiLCJhdXRob3JpemF0aW9uIiwiZXh0cmFjdEZyb21BdXRoIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiRGVjYWZSb2xlQXV0aEhhbmRsZXIiLCJEZWNhZkF1dGhNb2R1bGUiLCJEZWNhZkF1dGhNb2R1bGVfMSIsImZvclJvb3QiLCJwcm92aWRlcnMiLCJwcm92aWRlIiwidXNlQ2xhc3MiLCJnbG9iYWwiLCJBUFBfSU5URVJDRVBUT1IiLCJ1c2VFeGlzdGluZyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2R1bGUiLCJEZWNhZkhhbmRsZXJFeGVjdXRvciIsIkRlY2FmSGFuZGxlckV4ZWN1dG9yXzEiLCJoYW5kbGVycyIsImNvbnRleHQiLCJleGVjIiwicmVzIiwidXJsIiwiRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIiwicmVzcG9uc2UiLCJnZXRSZXNwb25zZSIsInBpcGUiLCJ0YXAiLCJ0b1Jlc3BvbnNlIiwiRGVjYWZDb250cm9sbGVyIiwiSHR0cERlY2FmQ29udHJvbGxlciIsImNsaWVudENvbnRleHQiLCJfbmFtZSIsIkRlY2FmTW9kZWxDb250cm9sbGVyIiwiX3BlcnNpc3RlbmNlIiwiU2VydmljZSIsImdldFNlcnZpY2UiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJhY3RpdmVDdHgiLCJ0b092ZXJyaWRlcyIsIm92ZXJyaWRlIiwiZHRvQ2FjaGUiLCJNYXAiLCJEdG9Gb3IiLCJvcCIsInN0YWNrIiwiU2V0IiwiVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIiwiY2FjaGUiLCJnZXREdG9DYWNoZSIsImNhY2hlZCIsImlzVXBkYXRlT3AiLCJEeW5hbWljRFRPIiwidG9QYXNjYWxDYXNlIiwicGtQcm9wIiwiTW9kZWwiLCJwayIsInBrUHJvcHNNZXRhZGF0YSIsInBrUHJvcHMiLCJwa0Rlc2lnblR5cGUiLCJwa1R5cGVJc051bWVyaWMiLCJCaWdJbnQiLCJwa0lzR2VuZXJhdGVkIiwiZ2VuZXJhdGVkIiwiZ2VuZXJhdGVkQnlTZXF1ZW5jZSIsImlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZSIsImFsbFByb3BzIiwicmVsYXRpb25zIiwic2NhbGFyUHJvcHMiLCJwcm9wIiwiaGFzIiwidmFsaWRhdGlvbiIsImdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZSIsImlzUmVxdWlyZWQiLCJWYWxpZGF0aW9uS2V5cyIsIlJFUVVJUkVEIiwidHlwZUhpbnQiLCJnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UiLCJhcGlPcHRpb25zIiwiZGVzaWduVHlwZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJyZWxhdGlvbiIsInJlbGF0aW9uTWV0YSIsInJlbGF0aW9uVHlwZSIsIm1ldGEiLCJ2YWxpZGF0aW9uRm9yIiwiTElTVCIsImlzQ2lyY3VsYXIiLCJwa1R5cGVOYW1lIiwiZ2V0UGtPcGVuQXBpVHlwZSIsImFkZFJlbGF0aW9uUGtSZWYiLCJyZWxhdGlvbkR0byIsImFkZCIsImFkZFJlbGF0aW9uVXBkYXRlIiwiYWRkUmVsYXRpb24iLCJEdG9DbGFzcyIsImV4dHJhTW9kZWxzIiwiZHRvUmVmIiwib25lT2ZJdGVtcyIsIiRyZWYiLCJvbmVPZiIsInBrVHlwZSIsImN1cnJlbnQiLCJGdW5jdGlvbiIsImdldFByb3RvdHlwZU9mIiwiV2Vha01hcCIsInRvQ29udGV4dEZsYWdzIiwiYWRhcHRlciIsImFsaWFzIiwiYmluZCIsInJlcXVlc3RUcmFuc2Zvcm1lcnMiLCJDb250ZXh0IiwicGVuZGluZyIsImhlYWRlciIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQiLCJvcmlnaW5hbEJ1aWxkIiwiYnVpbGQiLCJyZXN1bHQiLCJjYWxsIiwiZGVjb3JhdGVkIiwiRnJvbU1vZGVsQ29udHJvbGxlciIsImdldFBlcnNpc3RlbmNlIiwiTW9kZWxDbGF6eiIsImUyIiwiY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeSIsInByZWZpeCIsIlBlcnNpc3RlbmNlS2V5cyIsIlFVRVJZIiwicmVwbyIsInF1ZXJ5TWV0aG9kcyIsInJvdXRlTWV0aG9kcyIsIlF1ZXJ5Q29udHJvbGxlciIsImVudHJpZXMiLCJzZWdtZW50IiwidHJpbSIsImpvaW4iLCJjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyIiwiZGVmaW5lTWV0aG9kIiwiaHR0cERlY29yYXRvciIsImh0dHBNZXRob2QiLCJnZXRRdWVyeURlY29yYXRvcnMiLCJvYmpWYWx1ZXMiLCJmaWVsZHMiLCJmIiwiY3JlYXRlIiwibW9kdWxlQ29uZmlnT3ZlcnJpZGVzIiwiZ2xvYmFsRGVmYXVsdHMiLCJ0YWJsZU5hbWUiLCJ0b0tlYmFiQ2FzZSIsIm1vZGVsQ2xhenpOYW1lIiwiZmFjdG9yeVBlcnNpc3RlbmNlIiwiZGVjb3JhdG9yQ29uZmlnIiwibW9kdWxlT3ZlcnJpZGUiLCJtZXJnZWRDb25maWciLCJGYWN0b3J5Q29udHJvbGxlciIsIk1vZGVsQ29udHJvbGxlckZhY3RvcnkiLCJmYWN0b3J5Um91dGVzIiwiX19yb3V0ZXNfXyIsImdldFBLIiwiYXBpUHJvcGVydGllcyIsInBrUGF0aCIsImdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbCIsImF1dGhDb25maWciLCJhdXRoIiwiYXBwbHlDbGFzc0F1dGgiLCJwdWJsaWMiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyIiwiRHluYW1pY01vZGVsQ29udHJvbGxlcl8xIiwiaW5mbyIsIkNvbnRyb2xsZXIiLCJBcGlUYWdzIiwiQXBpRXh0cmFNb2RlbHMiLCJzb3J0ZWRSb3V0ZXMiLCJzb3J0IiwiYSIsImIiLCJhU2VnbWVudHMiLCJCb29sZWFuIiwiYlNlZ21lbnRzIiwiYVBhcmFtQ291bnQiLCJzIiwiYlBhcmFtQ291bnQiLCJhTGl0ZXJhbENvdW50IiwiYkxpdGVyYWxDb3VudCIsInJvdXRlIiwiaW1wbGVtZW50YXRpb24iLCJ0b0xvd2VyQ2FzZSIsInJlZ2lzdHJhdGlvbiIsIm1hdGNoUm91dGUiLCJyZWdpc3RlcmVkTWV0aG9kTmFtZSIsInBhcmFtRGVjb3JhdG9ycyIsImNvbXBvc2VkIiwiREJLZXlzIiwiQ09NUE9TRUQiLCJjb21wb3NlZEtleXMiLCJ1bmlxdWVLZXlzIiwic2VwYXJhdG9yIiwicm91dGVQYXJhbURlY29yYXRvcnMiLCJwYXJhbUluZGV4IiwiZmxhdE1hcCIsIlBhcmFtIiwibWV0aG9kRGVjb3JhdG9ycyIsIm5vcm1hbGl6ZWRQYXRoIiwiY3JlYXRlUmVnaXN0cmF0aW9uIiwiY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyIsIlJlc3BvbnNlIiwicGFzc3Rocm91Z2giLCJidWxrQ3JlYXRlRGVjb3JhdG9ycyIsImJ1bGtSZWFkRGVjb3JhdG9ycyIsImJ1bGtVcGRhdGVEZWNvcmF0b3JzIiwiYnVsa0RlbGV0ZURlY29yYXRvcnMiLCJyZWFkRGVjb3JhdG9ycyIsInJvdXRlUGFyYW1zIiwidXBkYXRlRGVjb3JhdG9ycyIsImRlbGV0ZURlY29yYXRvcnMiLCJmYWxsYmFja1NlZ21lbnRzIiwiaXNBbGxQYXJhbXMiLCJldmVyeSIsImZhbGxiYWNrQXBpUHJvcHMiLCJzdWZmaXgiLCJzdGF0ZW1lbnREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXRQYXJhbXMiLCJzdGF0ZW1lbnRSb3V0ZXMiLCJzdGF0ZW1lbnRLZXkiLCJzdGF0ZW1lbnRNZXRob2ROYW1lIiwicXVlcnlNZXRob2QiLCJjb21wbGV4UXVlcnlQYXJhbXMiLCJwYXRoU2VnbWVudHMiLCJrbm93blByZWZpeGVzIiwiZmlyc3RTZWdtZW50Iiwic2VnbWVudHMiLCJzZWciLCJpIiwiY29tcGxleFF1ZXJ5IiwibG9nQ3R4Iiwic3ByZWFkQXJncyIsIm5vcm1hbGl6ZVF1ZXJ5QXJncyIsImV4dHJhY3RRdWVyeUFyZ3MiLCJsYXN0IiwicXVlcnlPYmoiLCJwb3AiLCJoYXNEaXJlY3Rpb24iLCJoYXNMaW1pdCIsImhhc09mZnNldCIsImV4dHJhcyIsImhhc1F1ZXJ5RmllbGRzIiwiQXBpQm9keSIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsInNjaGVtYSIsImdldFNjaGVtYVBhdGgiLCJBcGlCYWRSZXF1ZXN0UmVzcG9uc2UiLCJBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiYmFzZSIsImdldE1vZHVsZUZvciIsIkRlY2FmTW9kZWxNb2R1bGUiLCJEZWNhZk1vZGVsTW9kdWxlXzEiLCJjcmVhdGVNb2RlbFNlcnZpY2VzIiwibW9kZWxzIiwidXNlRmFjdG9yeSIsImlzRXhwb3NlZCIsImV4cG9zdXJlIiwidHJhY2tlZE1vZGVscyIsImNvbnRyb2xsZXJFeHBvc3VyZSIsIm1vZGVsU2VydmljZXMiLCJhdXRvU2VydmljZXMiLCJhZ2dyZWdhdGlvbnMiLCJhbGxvd0dyb3VwaW5nUXVlcmllcyIsImNvbnRyb2xsZXJzIiwiRGVjb3JhdGlvbiIsIkluamVjdGFibGVzS2V5cyIsIklOSkVDVEFCTEUiLCJleHRlbmQiLCJuZXN0SW5qZWN0YWJsZSIsImNhdGVnb3J5IiwiY2ZnIiwiRGVmYXVsdEluamVjdGFibGVzQ29uZmlnIiwic2luZ2xldG9uIiwiREVGQVVMVCIsImR1cmFibGUiLCJJTkpFQ1QiLCJuZXN0SW5qZWN0IiwiaW5uZXJOZXN0SW5qZWN0IiwiTUFYIiwibWF4RGVjIiwibWF4IiwibWF4aW11bSIsIk1JTiIsIm1pbkRlYyIsIm1pbiIsIm1pbmltdW0iLCJNQVhfTEVOR1RIIiwibWF4TGVuZ3RoRGVjIiwibWF4TGVuZ3RoIiwiTUlOX0xFTkdUSCIsIm1pbkxlbmd0aERlYyIsIm1pbkxlbmd0aCIsIlRZUEUiLCJ0eXBlRGVjIiwiREFURSIsImRhdGVEZWMiLCJmb3JtYXQiLCJFTlVNIiwib3B0aW9uRGVjIiwiUEFUVEVSTiIsInBhdHRlcm5EZWMiLCJwYXQiLCJwYXR0ZXJuIiwic291cmNlIiwiQ09MVU1OIiwiY29sdW1uRGVjIiwiRGVjb3JhdGlvbktleXMiLCJERVNDUklQVElPTiIsImRlc2NyaXB0aW9uRGVjIiwiQVVUSCIsIkNvcnNFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwibXNnIiwiVG9NYW55UmVxdWVzdHNFcnJvciIsIkhUVFBfRVhDRVBUSU9OX1RPX0RFQ0FGX0VSUk9SIiwiVW5hdXRob3JpemVkRXhjZXB0aW9uIiwiRm9yYmlkZGVuRXhjZXB0aW9uIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsIkJhZFJlcXVlc3RFcnJvciIsIkNvbmZsaWN0RXhjZXB0aW9uIiwiQ29uZmxpY3RFcnJvciIsIlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24iLCJWYWxpZGF0aW9uRXJyb3IiLCJEZWNhZkV4Y2VwdGlvbkZpbHRlciIsIm1vZHVsZVJlZiIsImV4Y2VwdGlvbiIsImhvc3QiLCJpc1Byb2R1Y3Rpb24iLCJMb2dnZWRFbnZpcm9ubWVudCIsImVudiIsInN0YXR1c0NvZGUiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIk5vdEFjY2VwdGFibGVFeGNlcHRpb24iLCJnZXRTdGF0dXMiLCJkZWNhZkVycm9yRm9yIiwic3RhdHVzIiwiSHR0cEV4Y2VwdGlvbiIsImxvZ0Vycm9yIiwiY29kZSIsImpzb24iLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJmYWN0b3J5IiwicmVzb2x2ZUxvZ2dlciIsImNvbnRleHRJZCIsIkNvbnRleHRJZEZhY3RvcnkiLCJnZXRCeVJlcXVlc3QiLCJyZXNvbHZlIiwic3RyaWN0IiwiQ2F0Y2giLCJNb2R1bGVSZWYiLCJVc2VEZWNhZkZpbHRlciIsIlVzZUZpbHRlcnMiLCJVc2VEZWNhZkhlYWRlcnMiLCJTV0FHR0VSX1VJX0NPTlNUQU5UUyIsInRpdGxlIiwidmVyc2lvbiIsImZhdmljb25GaWxlUGF0aCIsInRvcGJhckljb25GaWxlUGF0aCIsInNjaGVtZSIsImJlYXJlckZvcm1hdCIsImluIiwicGVyc2lzdEF1dGhvcml6YXRpb24iLCJ0b3BiYXJCZ0NvbG9yIiwiU3dhZ2dlckN1c3RvbVVJIiwiY3VzdG9tQ1NTIiwiY3NzIiwidG9wYmFySWNvblBhdGgiLCJpbWciLCJiNjQiLCJnZXRDdXN0b21PcHRpb25zIiwiZmF2aWNvbiIsImZhdmljb25QYXRoIiwiY3VzdG9tU2l0ZVRpdGxlIiwiY3VzdG9tQ3NzIiwic3dhZ2dlck9wdGlvbnMiLCJmaWxlIiwiZmlsZVBhdGgiLCJhc3NldHNQYXRoIiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJTd2FnZ2VyQnVpbGRlciIsImFwcCIsImNyZWF0ZURvY3VtZW50Iiwib3BlbkFwaUpzb25QYXRoIiwib3BlbkFwaVlhbWxQYXRoIiwiRG9jdW1lbnRCdWlsZGVyIiwic2V0VGl0bGUiLCJzZXREZXNjcmlwdGlvbiIsInNldFZlcnNpb24iLCJhZGRCZWFyZXJBdXRoIiwiU3dhZ2dlck1vZHVsZSIsInJlZ2lzdGVyT3BlbkFwaVJvdXRlIiwiY29udGVudFR5cGUiLCJib2R5RmFjdG9yeSIsImh0dHBBZGFwdGVyIiwiZ2V0SHR0cEFkYXB0ZXIiLCJfcmVxIiwicmVwbHkiLCJzZXR1cFN3YWdnZXIiLCJkb2N1bWVudCIsInN3YWdnZXJVSSIsInNldHVwIiwianNvbkRvY3VtZW50VXJsIiwieWFtbERvY3VtZW50VXJsIiwiWUFNTCIsIk5lc3RCb290c3RyYXBlciIsIl9sb2dnZXIiLCJMb2dnZXIiLCJpbml0aWFsaXplIiwiZW5hYmxlTG9nZ2VyIiwiY3VzdG9tTG9nZ2VyIiwidXNlTG9nZ2VyIiwiZW5hYmxlQ29ycyIsIm9yaWdpbnMiLCJhbGxvd01ldGhvZHMiLCJhbGxvd2VkT3JpZ2lucyIsIm8iLCJjb3JzT3B0aW9ucyIsIm9yaWdpbiIsImNhbGxiYWNrIiwiY3JlZGVudGlhbHMiLCJtZXRob2RzIiwidXNlSGVsbWV0IiwiaGVsbWV0IiwicmVxdWlyZSIsInVzZSIsIndhcm4iLCJzd2FnZ2VyIiwidXNlR2xvYmFsUGlwZXMiLCJwaXBlcyIsInVzZUdsb2JhbEZpbHRlcnMiLCJmaWx0ZXJzIiwidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3JzIiwic3RhcnQiLCJwb3J0IiwicHJvY2VzcyIsIlBPUlQiLCJsaXN0ZW4iLCJ0aGVuIiwiZ2V0VXJsIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXzEiLCJleGVjdXRvciIsImNvbnRleHR1YWxpemUiLCJmbGFncyIsImlwIiwiZXh0cmFjdElwIiwiRGVmYXVsdEFkYXB0ZXJGbGFncyIsIm9wZXJhdGlvbiIsInBhcnNlSXBIZWFkZXIiLCJjYW5kaWRhdGUiLCJwZW5kaW5nUHJvdmlkZXJzIiwiZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIiwicmVnaXN0ZXJQcm92aWRlciIsInRva2VuIiwiaXNNb2RlbENvbnN0cnVjdG9yIiwibW9kZWxTZXJ2aWNlVG9rZW4iLCJtb2RlbFJlcG9zaXRvcnlUb2tlbiIsInBhcmFtZXRlckluZGV4IiwicmVzb2x2ZWQiLCJwYXJhbVR5cGVzIiwiYXNNb2RlbCIsImluamVjdGFibGVTZXJ2aWNlS2V5IiwiQ29yZVNlcnZpY2UiLCJDb3JlUmVwb3NpdG9yeSIsIkRlY2FmQ29yZU1vZHVsZSIsIkRlY2FmQ29yZU1vZHVsZV8xIiwiZGVjYWZQcm92aWRlcnMiLCJ1c2VWYWx1ZSIsImNsaWVudCIsIkgiLCJwcm92aWRlciIsImJvb3RQZXJzaXN0ZW5jZSIsInRyaW1tZWQiLCJjb25mIiwiY29udHIiLCJwb3NzaWJsZSIsIlBlcnNpc3RlbmNlU2VydmljZSIsImJvb3QiLCJjbGllbnRzIiwiYyIsInBvc3NpYmxlVHJhbnNmIiwicmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIiwiaW5pdGlhbGl6YXRpb24iLCJvbkFwcGxpY2F0aW9uU2h1dGRvd24iLCJhZGFwdGVycyIsInNodXRkb3duIiwiR2xvYmFsIiwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIiwibm9ybWFsaXplRXZlbnRSZXNwb25zZSIsIm1vZGVsQ29uc3RyIiwiaWQiLCJwYXlsb2FkIiwic2VyaWFsaXplZFBheWxvYWQiLCJzZXJpYWxpemUiLCJjb25zb2xlIiwiZXJyIiwiRXZlbnRzQ29udHJvbGxlciIsIkV2ZW50c0NvbnRyb2xsZXJfMSIsImV2ZW50cyQiLCJPYnNlcnZhYmxlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlcklkIiwiTWF0aCIsInJhbmRvbSIsInRvVXBwZXJDYXNlIiwiY2IiLCJyZWZyZXNoIiwiUHJvbWlzZSIsImFkYXB0ZXJOYW1lIiwib2JzZXJ2ZSIsInVuT2JzZXJ2ZSIsIkhFQVJUQkVBVF9JTlRFUlZBTF9NUyIsImhlYXJ0YmVhdCQiLCJpbnRlcnZhbCIsInRzIiwibWVyZ2UiLCJsaXN0ZW5Gb3JNb2RlbCIsIlNzZSIsIkRlY2FmU3RyZWFtTW9kdWxlIiwiRGVjYWZTdHJlYW1Nb2R1bGVfMSIsImZvckZsYXZvdXJzIiwiaW1wb3J0cyIsIlJvdXRlck1vZHVsZSIsInJlZ2lzdGVyIiwiRGVjYWZNb2R1bGUiLCJEZWNhZk1vZHVsZV8xIiwiZm9yUm9vdEFzeW5jIiwiYXV0b0NvbnRyb2xsZXJzIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW5hYmxlT2JzZXJ2ZXJFdmVudHMiLCJvYnNlcnZlckZsYXZvdXJzIiwicnVuTWlncmF0aW9ucyIsInJlcG9Gb3JNb2RlbCIsIm0iLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiYWxsb3dSZXJlZ2lzdHJhdGlvbiIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQU8sTUFBTUEsb0JBQW9CO0lBQzFCLE1BQU1DLGFBQWE7UUFDeEJDLGVBQWUsR0FBR0Y7UUFDbEJHLGNBQWMsR0FBR0g7UUFDakJJLGNBQWMsR0FBR0o7UUFDakJLLGNBQWMsR0FBR0w7UUFDakJNLFVBQVUsR0FBR047UUFDYk8sZUFBZSxHQUFHUDtRQUNsQlEsZ0JBQWdCLEdBQUdSO1FBQ25CUyxhQUFhLEdBQUdUO1FBQ2hCVSxzQkFBc0IsR0FBR1Y7UUFDekJXLDRCQUE0QixHQUFHWDtRQUMvQlksY0FBYyxHQUFHWjtRQUNqQmEsc0JBQXNCLEdBQUdiO1FBQ3pCYyx3QkFBd0IsR0FBR2Q7UUFDM0JlLGtCQUFrQixHQUFHZjtRQUNyQmdCLGVBQWUsR0FBR2hCO1FBQ2xCaUIsWUFBWSxHQUFHakI7UUFDZmtCLG9CQUFvQixHQUFHbEI7UUFDdkJtQixVQUFVLEdBQUduQjs7SUNoQlIsTUFBTW9CLGdCQUFpQkMsT0FBc0JBLFFBQVE7SUFDckQsTUFBTUMsd0JBQXdCO0lBRTlCLE1BQU1DLGtCQUFrQjtJQUV6QixTQUFVQyxzQkFDZEMsU0FDQUMsV0FDQUMsa0JBQUVBLG9CQUFxQjtRQUFFQSxrQkFBa0I7O1FBRTNDLE9BQU8sQ0FDTEMsUUFDQUMsS0FDQUM7WUFFQSxXQUFXSixhQUFhLFVBQVU7Z0JBQ2hDLE1BQU1LLFlBQVlDLFFBQVFD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