@cartanova/qgrid-cli 2.3.2 → 2.3.4

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.
Files changed (26) hide show
  1. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +94 -278
  2. package/bundle/dist/application/qgrid/qgrid.frame.js +15 -5
  3. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +33 -12
  4. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +42 -98
  5. package/bundle/dist/utils/providers/anthropic/claude-session.js +54 -32
  6. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +7 -37
  7. package/bundle/dist/utils/providers/common/model-cost.js +3 -2
  8. package/bundle/dist/utils/providers/openai/codex-worker.js +1 -2
  9. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +19 -12
  10. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +235 -7
  11. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +152 -364
  12. package/bundle/src/application/qgrid/qgrid.frame.ts +38 -23
  13. package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +60 -0
  14. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +57 -16
  15. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +92 -340
  16. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +61 -188
  17. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +89 -62
  18. package/bundle/src/utils/providers/anthropic/claude-session.ts +71 -46
  19. package/bundle/src/utils/providers/anthropic/stream-json-adapter.test.ts +74 -30
  20. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +40 -102
  21. package/bundle/src/utils/providers/common/model-cost.test.ts +19 -1
  22. package/bundle/src/utils/providers/common/model-cost.ts +2 -1
  23. package/bundle/src/utils/providers/common/provider-dispatcher.ts +7 -4
  24. package/bundle/src/utils/providers/openai/codex-worker.ts +2 -8
  25. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +18 -11
  26. package/package.json +1 -1
@@ -121,7 +121,6 @@ var CodexAppServerWorker = class CodexAppServerWorker {
121
121
  await this.waitForLoginCompleted();
122
122
  this.ready = true;
123
123
  this.restartAttempts = 0;
124
- logger.info(`worker ${this.config.tokenName} ready`);
125
124
  }
126
125
  async startBrowserLogin() {
127
126
  await this.spawnAndInit();
@@ -477,4 +476,4 @@ var CodexAppServerWorker = class CodexAppServerWorker {
477
476
  //#endregion
478
477
  export { CodexAppServerWorker };
479
478
 
480
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgdHlwZSBUaHJlYWRJbmplY3RJdGVtc1BhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRJbmplY3RJdGVtc1BhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFBhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZFN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UdXJuU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVHVyblN0YXJ0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IENvZGV4UnBjQ2xpZW50IH0gZnJvbSBcIi4vY29kZXgtcnBjXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcImNvZGV4LXdvcmtlclwiXSk7XG5cbmNvbnN0IE1BWF9SRVNUQVJUX0FUVEVNUFRTID0gMztcbmNvbnN0IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TID0gMV8wMDA7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJDb25maWcge1xuICB0b2tlbklkOiBudW1iZXI7XG4gIHRva2VuTmFtZTogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbiAgcGxhblR5cGU/OiBzdHJpbmc7XG4gIHdvcmtlckluZGV4PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXF1ZXN0IHtcbiAgaW5wdXQ6IFR1cm5TdGFydFBhcmFtc1tcImlucHV0XCJdO1xuICBvdXRwdXRTY2hlbWE/OiBUdXJuU3RhcnRQYXJhbXNbXCJvdXRwdXRTY2hlbWFcIl07XG4gIGVmZm9ydD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIGRldmVsb3Blckluc3RydWN0aW9ucz86IHN0cmluZztcbiAgaGlzdG9yeT86IFRocmVhZEluamVjdEl0ZW1zUGFyYW1zW1wiaXRlbXNcIl07XG4gIHZlcmJvc2l0eT86IHN0cmluZztcbiAgcmVhc29uaW5nU3VtbWFyeT86IHN0cmluZztcbiAgc2VydmljZVRpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyblJlc3VsdCB7XG4gIHRleHQ6IHN0cmluZztcbiAgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgbW9kZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1DYWxsYmFja3Mge1xuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbkNvbXBsZXRlOiAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB2b2lkO1xuICBvbkVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBvblRocmVhZElkPzogKHRocmVhZElkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uVHVybklkPzogKHR1cm5JZDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG50eXBlIFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMgPSBQaWNrPFdvcmtlckNvbmZpZywgXCJhY2Nlc3NUb2tlblwiIHwgXCJhY2NvdW50SWRcIiB8IFwicGxhblR5cGVcIj47XG50eXBlIEFjdGl2ZVR1cm5BYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG5cbi8vIHRocmVhZC9zdGFydCDqs7XthrUg7Ji17IWYXG5jb25zdCBUSFJFQURfREVGQVVMVFMgPSB7XG4gIHNhbmRib3g6IFwicmVhZC1vbmx5XCIsXG4gIGFwcHJvdmFsUG9saWN5OiBcIm5ldmVyXCIsXG4gIGNvbmZpZzoge1xuICAgIGFwcHM6IHsgX2RlZmF1bHQ6IHsgZW5hYmxlZDogZmFsc2UsIGRlc3RydWN0aXZlX2VuYWJsZWQ6IGZhbHNlLCBvcGVuX3dvcmxkX2VuYWJsZWQ6IGZhbHNlIH0gfSxcbiAgfSxcbn0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+O1xuXG5jb25zdCBCQVNFX0lOU1RSVUNUSU9OUyA9XG4gIFwiWW91IGFyZSBhIGhlbHBmdWwgYXNzaXN0YW50LiBEbyBub3QgdXNlIGFueSB0b29scyBzdWNoIGFzIHNoZWxsLCBmaWxlIG9wZXJhdGlvbnMsIG9yIHdlYiBzZWFyY2guIFJlc3BvbmQgd2l0aCB0ZXh0IG9ubHkuXCI7XG5cbi8vIGNvZGV46rCAIOunpCDsmpTssq3sl5Ag7J6Q64+ZIOyjvOyehe2VmOuKlCDrgrTsnqUgdG9vbChzaGVsbC93ZWJfc2VhcmNoL3NwYXduX2FnZW50IOuTsSAxNOqwnCnqs7xcbi8vIGluc3RydWN0aW9uIOu4lOuhnShwZXJtaXNzaW9ucy9lbnZpcm9ubWVudF9jb250ZXh0L3NraWxscywgfjEwS0Ip7J2EIOu5hO2ZnOyEse2ZlFxuLy8gJENPREVYX0hPTUUvY29uZmlnLnRvbWwg66GcIOyNqOuEo+ycvOuptCBjb2RleCDrtoDtjIUg7IucIHNjYW5cbi8vIO2GteygnOu2iOqwgDogdXBkYXRlX3BsYW4vcmVxdWVzdF91c2VyX2lucHV0XG5jb25zdCBDT0RFWF9DT05GSUdfVE9NTCA9IGB3ZWJfc2VhcmNoID0gXCJkaXNhYmxlZFwiXG5pbmNsdWRlX3Blcm1pc3Npb25zX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2FwcHNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfZW52aXJvbm1lbnRfY29udGV4dCA9IGZhbHNlXG5cbltmZWF0dXJlc11cbnNoZWxsX3Rvb2wgPSBmYWxzZVxudG9vbF9zZWFyY2ggPSBmYWxzZVxudG9vbF9zdWdnZXN0ID0gZmFsc2Vcbm11bHRpX2FnZW50ID0gZmFsc2VcbmltYWdlX2dlbmVyYXRpb24gPSBmYWxzZVxuYXBwcyA9IGZhbHNlXG5wbHVnaW5zID0gZmFsc2VcblxuW3Rvb2xzXVxudmlld19pbWFnZSA9IGZhbHNlXG5cbltza2lsbHNdXG5pbmNsdWRlX2luc3RydWN0aW9ucyA9IGZhbHNlXG5gO1xuXG4vLyDilIDilIAgV29ya2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIge1xuICBwcml2YXRlIHByb2M6IENoaWxkUHJvY2VzcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJwYzogQ29kZXhScGNDbGllbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb2RleEhvbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZXN0YXJ0QXR0ZW1wdHMgPSAwO1xuICBwcml2YXRlIHJlYWR5ID0gZmFsc2U7XG4gIHByaXZhdGUgZGVzdHJveWVkID0gZmFsc2U7XG4gIHByaXZhdGUgYnVzeSA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGl2ZVR1cm5BYm9ydD86IEFjdGl2ZVR1cm5BYm9ydDtcbiAgYWN0aXZlID0gdHJ1ZTtcbiAgb25SZWFkeT86ICgpID0+IHZvaWQ7XG4gIC8vIHJlc3RhcnQg7IucIHJwYyDqsJ3ssrTqsIAg7IOI66GcIOyDneyEseuQmOuvgOuhnCwg7ZW465Ok65+s66W8IOuztOq0gO2WiOuLpOqwgCDrp6Qgc3Bhd27rp4jri6Qg7J6s67CU7J2465Sp7ZWc64ukLlxuICBzZXJ2ZXJSZXF1ZXN0SGFuZGxlcj86IChtZXRob2Q6IHN0cmluZywgcGFyYW1zOiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlKTogd29ya2VyIOqwgCDsg53shLHtlZwgdGhyZWFkIOuTpOydmCDrqZTtg4AuXG4gIC8vIGVwaGVtZXJhbCB0aHJlYWQg64qUIOydtCDtlITroZzshLjsiqQg66mU66qo66as7JeQ66eMIOyhtOyerO2VmOuvgOuhnCByZXN0YXJ0IOyLnCDsoITrtoAg66y07ZqoLlxuICBwcml2YXRlIHRocmVhZE1ldGEgPSBuZXcgTWFwPHN0cmluZywgeyBsYXN0VXNlZEF0OiBudW1iZXIgfT4oKTtcbiAgLy8gc3Bhd24g7Lm07Jq07YSwLiByZXN0YXJ0IOuniOuLpCDspp3qsIAg4oaSIGNvbnYg7ZW465Ok7J2YIGVwb2NoIOyZgCDrjIDsobDtlbQgc3RhbGUgdGhyZWFkIOqwkOyngC5cbiAgcHJpdmF0ZSBlcG9jaENvdW50ZXIgPSAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUSFJFQURfSURMRV9UVExfTVMgPSAxMCAqIDYwXzAwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1RIUkVBRFNfUEVSX1dPUktFUiA9IDE2O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBXb3JrZXJDb25maWcpIHtcbiAgICBjb25zdCBzdWZmaXggPSBjb25maWcud29ya2VySW5kZXggIT09IHVuZGVmaW5lZCA/IGAtJHtjb25maWcud29ya2VySW5kZXh9YCA6IFwiXCI7XG4gICAgdGhpcy5jb2RleEhvbWUgPSBgL3RtcC9xZ3JpZC1jb2RleC8ke2NvbmZpZy50b2tlbklkfSR7c3VmZml4fWA7XG4gIH1cblxuICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgYXN5bmMgc3Bhd25BbmRJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOyDiCBjb2RleCDtlITroZzshLjsiqQg4oaSIOq4sOyhtCBlcGhlbWVyYWwgdGhyZWFkIOyghOu2gCDrrLTtmqguIGVwb2NoIOymneqwgOuhnCBzdGFsZSDqsJDsp4AuXG4gICAgdGhpcy5lcG9jaENvdW50ZXIrKztcbiAgICB0aGlzLnRocmVhZE1ldGEuY2xlYXIoKTtcbiAgICBjb25zdCBjd2QgPSBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYDtcbiAgICBta2RpclN5bmMoY3dkLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBjb2RleCDrgrTsnqUgdG9vbC93ZWJfc2VhcmNoL2luc3RydWN0aW9uIOu4lOuhnSDruYTtmZzshLHtmZRcbiAgICB3cml0ZUZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9jb25maWcudG9tbGAsIENPREVYX0NPTkZJR19UT01MKTtcblxuICAgIHRoaXMucHJvYyA9IHNwYXduKFwiY29kZXhcIiwgW1wiYXBwLXNlcnZlclwiLCBcIi0tbGlzdGVuXCIsIFwic3RkaW86Ly9cIl0sIHtcbiAgICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgICBjd2QsXG4gICAgICBlbnY6IHtcbiAgICAgICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICAgICAgVE1QRElSOiBwcm9jZXNzLmVudi5UTVBESVIsXG4gICAgICAgIENPREVYX0hPTUU6IHRoaXMuY29kZXhIb21lLFxuICAgICAgICAvLyBlbnZpcm9ubWVudCDruYTtmZzshLHtmZQg4oaSIGhhc19lbnZpcm9ubWVudD1mYWxzZSDihpIgc2hlbGwvYXBwbHlfcGF0Y2gvdmlld19pbWFnZSDsoJzqsbBcbiAgICAgICAgQ09ERVhfRVhFQ19TRVJWRVJfVVJMOiBcIm5vbmVcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBleGl0ZWQgKGNvZGU9JHtjb2RlfSlgKTtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oXG4gICAgICAgIG5ldyBFcnJvcihgY29kZXggd29ya2VyIGV4aXRlZCB3aGlsZSB0dXJuIHdhcyBydW5uaW5nIChjb2RlPSR7Y29kZSA/PyBcInVua25vd25cIn0pYCksXG4gICAgICApO1xuICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgdGhpcy5ycGMgPSBudWxsO1xuICAgICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHRoaXMuc2NoZWR1bGVSZXN0YXJ0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJwYyA9IG5ldyBDb2RleFJwY0NsaWVudCh0aGlzLnByb2MpO1xuICAgIC8vIHJlc3RhcnQg7ZuE7JeQ64+EIHJlZnJlc2ggc2VydmVyLXJlcXVlc3Qg7ZW465Ok65+s66W8IOycoOyngCAo7JeG7Jy866m0IGNvZGV4IO2GoO2BsCDtmozsoIQg7Iuk7YyoIOKGkiBzZXNzaW9uIGV4cGlyZWQpXG4gICAgdGhpcy5iaW5kU2VydmVyUmVxdWVzdEhhbmRsZXIoKTtcblxuICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJpbml0aWFsaXplXCIsIHtcbiAgICAgIGNsaWVudEluZm86IHsgbmFtZTogXCJxZ3JpZFwiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSxcbiAgICAgIGNhcGFiaWxpdGllczogeyBleHBlcmltZW50YWxBcGk6IHRydWUgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2FpdEZvckxvZ2luQ29tcGxldGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKFwibG9naW4gdGltZW91dFwiKSksIDEyMF8wMDApO1xuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiYWNjb3VudC9sb2dpbi9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAocC5zdWNjZXNzKSByZXNvbHZlKCk7XG4gICAgICAgIGVsc2UgcmVqZWN0KG5ldyBFcnJvcihgbG9naW4gZmFpbGVkOiAke3AuZXJyb3IgPz8gXCJ1bmtub3duXCJ9YCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYyEucmVxdWVzdChcImFjY291bnQvbG9naW4vc3RhcnRcIiwge1xuICAgICAgdHlwZTogXCJjaGF0Z3B0QXV0aFRva2Vuc1wiLFxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuLFxuICAgICAgY2hhdGdwdEFjY291bnRJZDogdGhpcy5jb25maWcuYWNjb3VudElkLFxuICAgICAgLi4uKHRoaXMuY29uZmlnLnBsYW5UeXBlID8geyBjaGF0Z3B0UGxhblR5cGU6IHRoaXMuY29uZmlnLnBsYW5UeXBlIH0gOiB7fSksXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSByZWFkeWApO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRCcm93c2VyTG9naW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0PHsgYXV0aFVybDogc3RyaW5nIH0+KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRcIixcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIHN0YXJ0ZWRgKTtcbiAgICByZXR1cm4gcmVzdWx0LmF1dGhVcmw7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yQnJvd3NlckxvZ2luQ29tcGxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gYnJvd3NlciBsb2dpbiBjb21wbGV0ZWRgKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRNYW5hZ2VkQ3JlZGVudGlhbHMoKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nO1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICB9IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vYXV0aC5qc29uYCwgXCJ1dGYtOFwiKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY2Nlc3NUb2tlbjogcmF3LnRva2Vucz8uYWNjZXNzX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmF3LnRva2Vucz8ucmVmcmVzaF90b2tlbiA/PyBcIlwiLFxuICAgICAgICBpZFRva2VuOiByYXcudG9rZW5zPy5pZF90b2tlbixcbiAgICAgICAgYWNjb3VudElkOiByYXcudG9rZW5zPy5hY2NvdW50X2lkID8/IFwiXCIsXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4obmV3IEVycm9yKFwiY29kZXggd29ya2VyIHN0b3BwZWRcIikpO1xuICAgIHRoaXMucnBjPy5kZXN0cm95KCk7XG5cbiAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICB0aGlzLnByb2Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvYz8ua2lsbChcIlNJR0tJTExcIik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzXzAwMCk7XG4gICAgICAgIHRoaXMucHJvYyEub24oXCJleGl0XCIsICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkgJiYgIXRoaXMuZGVzdHJveWVkO1xuICB9XG4gIGdldCBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IHRva2VuSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5JZDtcbiAgfVxuICBnZXQgd29ya2VySW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMDtcbiAgfVxuICBnZXQgdG9rZW5OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRva2VuTmFtZTtcbiAgfVxuXG4gIGNhblJldXNlRm9yVG9rZW4oX3Rva2VuTmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPT09IGNyZWRlbnRpYWxzLmFjY291bnRJZCAmJlxuICAgICAgKHRoaXMuY29uZmlnLnBsYW5UeXBlID8/IHVuZGVmaW5lZCkgPT09IChjcmVkZW50aWFscy5wbGFuVHlwZSA/PyB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVRva2VuU3RhdGUodG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcudG9rZW5OYW1lID0gdG9rZW5OYW1lO1xuICAgIHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuID0gY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5jb25maWcuYWNjb3VudElkID0gY3JlZGVudGlhbHMuYWNjb3VudElkO1xuICAgIGlmIChjcmVkZW50aWFscy5wbGFuVHlwZSkge1xuICAgICAgdGhpcy5jb25maWcucGxhblR5cGUgPSBjcmVkZW50aWFscy5wbGFuVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLnBsYW5UeXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZXRSYXRlTGltaXRzKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgcmV0dXJuIHRoaXMucnBjLnJlcXVlc3QoXCJhY2NvdW50L3JhdGVMaW1pdHMvcmVhZFwiLCB7fSk7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgfTtcbiAgICBjb25zdCB7IHRocmVhZCwgbW9kZWw6IHRocmVhZE1vZGVsIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFRocmVhZFN0YXJ0UmVzcG9uc2U+KFxuICAgICAgXCJ0aHJlYWQvc3RhcnRcIixcbiAgICAgIHtcbiAgICAgICAgZXBoZW1lcmFsOiB0cnVlLFxuICAgICAgICBjd2Q6IGAke3RoaXMuY29kZXhIb21lfS9jd2RgLFxuICAgICAgICBiYXNlSW5zdHJ1Y3Rpb25zOiBCQVNFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zID8/IFwiXCIsXG4gICAgICAgIHNhbmRib3g6IFRIUkVBRF9ERUZBVUxUUy5zYW5kYm94LFxuICAgICAgICBhcHByb3ZhbFBvbGljeTogVEhSRUFEX0RFRkFVTFRTLmFwcHJvdmFsUG9saWN5LFxuICAgICAgICBjb25maWc6IHRocmVhZENvbmZpZyxcbiAgICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+LFxuICAgICk7XG5cbiAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZC5pZDtcbiAgICBpZiAocmVxLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInRocmVhZC9pbmplY3RfaXRlbXNcIiwge1xuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgaXRlbXM6IHJlcS5oaXN0b3J5LFxuICAgICAgfSBzYXRpc2ZpZXMgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMpO1xuICAgIH1cbiAgICB0aGlzLnRocmVhZE1ldGEuc2V0KHRocmVhZElkLCB7IGxhc3RVc2VkQXQ6IERhdGUubm93KCkgfSk7XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZCwgcmVxKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwpO1xuICAgIHJldHVybiB7IC4uLnJlc3VsdCwgdGhyZWFkSWQgfTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrcyxcbiAgICBleGlzdGluZ1RocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmc7XG4gICAgbGV0IG1vZGVsOiBzdHJpbmc7XG4gICAgaWYgKGV4aXN0aW5nVGhyZWFkSWQpIHtcbiAgICAgIHRocmVhZElkID0gZXhpc3RpbmdUaHJlYWRJZDtcbiAgICAgIG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHRocmVhZElkLCBtb2RlbCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUaHJlYWQocmVxKSk7XG4gICAgfVxuICAgIGNvbnN0IHsgdHVybklkIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgY2Iub25UdXJuSWQ/Lih0dXJuSWQpO1xuICAgIGF3YWl0IHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYik7XG4gICAgcmV0dXJuIHsgdGhyZWFkSWQgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aHJlYWQg7J6s7IKs7JqpIOyngOybkCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXQgZXBvY2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lcG9jaENvdW50ZXI7XG4gIH1cblxuICBoYXNUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRocmVhZE1ldGEuaGFzKHRocmVhZElkKTtcbiAgfVxuXG4gIC8vIGlkbGUgVFRMIOy0iOqzvCAvIOqwnOyImCDsg4HtlZwg7LSI6rO8IHRocmVhZCDrpbwg7KCV66asLiBjcmVhdGVUaHJlYWQg7KeB7KCEIGxhenkg7Zi47LacLlxuICAvLyBjb2RleCBlcGhlbWVyYWwgdGhyZWFkIOuKlCDrqoXsi5zsoIEgY2xvc2UgUlBDIOyXhuydtCDrp7Xsl5DshJwg7KCc6rGwIOKGkiDrjZQg7J207IOBIHR1cm4g7JWIIOuztOuDhC5cbiAgc3dlZXBJZGxlVGhyZWFkcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCBtZXRhXSBvZiB0aGlzLnRocmVhZE1ldGEpIHtcbiAgICAgIGlmIChub3cgLSBtZXRhLmxhc3RVc2VkQXQgPiBDb2RleEFwcFNlcnZlcldvcmtlci5USFJFQURfSURMRV9UVExfTVMpIHtcbiAgICAgICAgdGhpcy50aHJlYWRNZXRhLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNyZWF0ZVRocmVhZCDsp4HsoIQg7Zi47LacIOKGkiDsg4ggdGhyZWFkIDEg6rCc6rCAIOqzpyDstpTqsIDrkJzri6QuIOy2lOqwgCDtm4Tsl5Drj4QgTUFYIOulvCDrhJjsp4Ag7JWK64+E66GdXG4gICAgLy8gTUFYLTEg7J207ZWY66GcIOykhOyXrCDrkZTri6Qo6re4656Y7JW8IOyDneyEsSDsp4Htm4Qg7KCV7ZmV7Z6IIE1BWCkuIExSVTogbGFzdFVzZWRBdCDsmKTrpoTssKjsiJzsnLzroZwg7KCc6rGwLlxuICAgIGNvbnN0IGxpbWl0ID0gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuTUFYX1RIUkVBRFNfUEVSX1dPUktFUiAtIDE7XG4gICAgaWYgKHRoaXMudGhyZWFkTWV0YS5zaXplID4gbGltaXQpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLnRocmVhZE1ldGEuZW50cmllcygpXS50b1NvcnRlZChcbiAgICAgICAgKGEsIGIpID0+IGFbMV0ubGFzdFVzZWRBdCAtIGJbMV0ubGFzdFVzZWRBdCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvdmVyID0gdGhpcy50aHJlYWRNZXRhLnNpemUgLSBsaW1pdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ZlcjsgaSsrKSB0aGlzLnRocmVhZE1ldGEuZGVsZXRlKHNvcnRlZFtpXSFbMF0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGludGVycnVwdFR1cm4odGhyZWFkSWQ6IHN0cmluZywgdHVybklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0dXJuL2ludGVycnVwdFwiLCB7IHRocmVhZElkLCB0dXJuSWQgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgcHJpdmF0ZSBmYWlsQWN0aXZlVHVybihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zdCBhYm9ydCA9IHRoaXMuYWN0aXZlVHVybkFib3J0O1xuICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgIGFib3J0Py4oZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVHVybk5vdGlmaWNhdGlvbnModGhyZWFkSWQ6IHN0cmluZywgbW9kZWw6IHN0cmluZyk6IFByb21pc2U8VHVyblJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUdXJuUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGFib3J0OiBBY3RpdmVUdXJuQWJvcnQ7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVUdXJuQWJvcnQgPT09IGFib3J0KSB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoUmVzdWx0ID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOyLnCAudG90YWwg7J2AIOuMgO2ZlCDsoITssrQg64iE7KCB7J206528LCBjb2xkIOyYgOuNmCDsnbTsoIQgdHVybiDquYzsp4Ag7ISe7JesXG4gICAgICAgIC8vIOydtCDsmpTssq0g7J6Q7LK07J2YIGNhY2hlIOyggeykkeuloOydtCDtnazshJ3rkJzri6Qo7JiIOiB0dXJuMSBjb2xkIDAlICsgdHVybjIgOTAlIOKGkiA0OCUg66GcIOq4sOuhnSkuXG4gICAgICAgIC8vIC5sYXN0IOuKlCDsnbTrsoggdHVybiDrp4zsnZggdXNhZ2Ug6528IHJlcXVlc3RfbG9nIOqwgCDqt7gg7JqU7LKt7J2YIOyLpOygnCDthqDtgbDsnYQg7KCV7ZmV7Z6IIOuwmOyYge2VnOuLpC5cbiAgICAgICAgdXNhZ2UgPSBwLnRva2VuVXNhZ2UubGFzdDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgZHVyYXRpb25NcyA9IHAudHVybi5kdXJhdGlvbk1zID8/IDA7XG4gICAgICAgIGlmIChwLnR1cm4uc3RhdHVzID09PSBcImNvbXBsZXRlZFwiKSBmaW5pc2hXaXRoUmVzdWx0KHsgdGV4dCwgdXNhZ2UsIGR1cmF0aW9uTXMsIG1vZGVsIH0pO1xuICAgICAgICBlbHNlIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIixcbiAgICAgICAgICBcInR1cm4vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgICAgdGhpcy5ycGM/Lm9uTm90aWZpY2F0aW9uKG4sICgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aEVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBjYi5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhDb21wbGV0ZSA9IChyZXN1bHQ6IFR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhDb21wbGV0ZSh7IHRleHQsIHVzYWdlLCBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLCBtb2RlbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuICR7cC50dXJuLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocC50dXJuLmVycm9yKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJlcnJvclwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFwLndpbGxSZXRyeSkge1xuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYGNvZGV4IGVycm9yOiAke3AuZXJyb3IubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlc3RhcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8IHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICBpZiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPj0gTUFYX1JFU1RBUlRfQVRURU1QVFMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gbWF4IHJlc3RhcnQgYXR0ZW1wdHMgcmVhY2hlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzKys7XG4gICAgY29uc3QgYmFzZURlbGF5ID0gUkVTVEFSVF9CQUNLT0ZGX0JBU0VfTVMgKiAyICoqICh0aGlzLnJlc3RhcnRBdHRlbXB0cyAtIDEpO1xuICAgIGNvbnN0IHN0YWdnZXIgPSAodGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMCkgKiAyXzAwMDtcbiAgICBjb25zdCBkZWxheSA9IGJhc2VEZWxheSArIHN0YWdnZXI7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfVske3RoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDB9XSByZXN0YXJ0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLnJlc3RhcnRBdHRlbXB0c30pYCxcbiAgICApO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMub25SZWFkeT8uKCkpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IHJlc3RhcnQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZXN0YXJ0KCk7XG4gICAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFhQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBRW5E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
479
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgdHlwZSBUaHJlYWRJbmplY3RJdGVtc1BhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRJbmplY3RJdGVtc1BhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFBhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZFN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UdXJuU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVHVyblN0YXJ0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgU3RyZWFtQ2FsbGJhY2tzIGFzIENvbW1vblN0cmVhbUNhbGxiYWNrcyB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgQ29kZXhScGNDbGllbnQgfSBmcm9tIFwiLi9jb2RleC1ycGNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiY29kZXgtd29ya2VyXCJdKTtcblxuY29uc3QgTUFYX1JFU1RBUlRfQVRURU1QVFMgPSAzO1xuY29uc3QgUkVTVEFSVF9CQUNLT0ZGX0JBU0VfTVMgPSAxXzAwMDtcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckNvbmZpZyB7XG4gIHRva2VuSWQ6IG51bWJlcjtcbiAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBwbGFuVHlwZT86IHN0cmluZztcbiAgd29ya2VySW5kZXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyblJlcXVlc3Qge1xuICBpbnB1dDogVHVyblN0YXJ0UGFyYW1zW1wiaW5wdXRcIl07XG4gIG91dHB1dFNjaGVtYT86IFR1cm5TdGFydFBhcmFtc1tcIm91dHB1dFNjaGVtYVwiXTtcbiAgZWZmb3J0Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zPzogc3RyaW5nO1xuICBoaXN0b3J5PzogVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNbXCJpdGVtc1wiXTtcbiAgdmVyYm9zaXR5Pzogc3RyaW5nO1xuICByZWFzb25pbmdTdW1tYXJ5Pzogc3RyaW5nO1xuICBzZXJ2aWNlVGllcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVzdWx0IHtcbiAgdGV4dDogc3RyaW5nO1xuICB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93bjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBtb2RlbDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTdHJlYW1DYWxsYmFja3MgPSBDb21tb25TdHJlYW1DYWxsYmFja3M8VHVyblJlc3VsdD47XG5cbnR5cGUgUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyA9IFBpY2s8V29ya2VyQ29uZmlnLCBcImFjY2Vzc1Rva2VuXCIgfCBcImFjY291bnRJZFwiIHwgXCJwbGFuVHlwZVwiPjtcbnR5cGUgQWN0aXZlVHVybkFib3J0ID0gKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcblxuLy8gdGhyZWFkL3N0YXJ0IOqzte2GtSDsmLXshZhcbmNvbnN0IFRIUkVBRF9ERUZBVUxUUyA9IHtcbiAgc2FuZGJveDogXCJyZWFkLW9ubHlcIixcbiAgYXBwcm92YWxQb2xpY3k6IFwibmV2ZXJcIixcbiAgY29uZmlnOiB7XG4gICAgYXBwczogeyBfZGVmYXVsdDogeyBlbmFibGVkOiBmYWxzZSwgZGVzdHJ1Y3RpdmVfZW5hYmxlZDogZmFsc2UsIG9wZW5fd29ybGRfZW5hYmxlZDogZmFsc2UgfSB9LFxuICB9LFxufSBzYXRpc2ZpZXMgUGFydGlhbDxUaHJlYWRTdGFydFBhcmFtcz47XG5cbmNvbnN0IEJBU0VfSU5TVFJVQ1RJT05TID1cbiAgXCJZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQuIERvIG5vdCB1c2UgYW55IHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC4gUmVzcG9uZCB3aXRoIHRleHQgb25seS5cIjtcblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmNvbnN0IENPREVYX0NPTkZJR19UT01MID0gYHdlYl9zZWFyY2ggPSBcImRpc2FibGVkXCJcbmluY2x1ZGVfcGVybWlzc2lvbnNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfYXBwc19pbnN0cnVjdGlvbnMgPSBmYWxzZVxuaW5jbHVkZV9lbnZpcm9ubWVudF9jb250ZXh0ID0gZmFsc2VcblxuW2ZlYXR1cmVzXVxuc2hlbGxfdG9vbCA9IGZhbHNlXG50b29sX3NlYXJjaCA9IGZhbHNlXG50b29sX3N1Z2dlc3QgPSBmYWxzZVxubXVsdGlfYWdlbnQgPSBmYWxzZVxuaW1hZ2VfZ2VuZXJhdGlvbiA9IGZhbHNlXG5hcHBzID0gZmFsc2VcbnBsdWdpbnMgPSBmYWxzZVxuXG5bdG9vbHNdXG52aWV3X2ltYWdlID0gZmFsc2VcblxuW3NraWxsc11cbmluY2x1ZGVfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmA7XG5cbi8vIOKUgOKUgCBXb3JrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBDb2RleEFwcFNlcnZlcldvcmtlciB7XG4gIHByaXZhdGUgcHJvYzogQ2hpbGRQcm9jZXNzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnBjOiBDb2RleFJwY0NsaWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvZGV4SG9tZTogc3RyaW5nO1xuICBwcml2YXRlIHJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIHByaXZhdGUgcmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidXN5ID0gZmFsc2U7XG4gIHByaXZhdGUgYWN0aXZlVHVybkFib3J0PzogQWN0aXZlVHVybkFib3J0O1xuICBhY3RpdmUgPSB0cnVlO1xuICBvblJlYWR5PzogKCkgPT4gdm9pZDtcbiAgLy8gcmVzdGFydCDsi5wgcnBjIOqwneyytOqwgCDsg4jroZwg7IOd7ISx65CY66+A66GcLCDtlbjrk6Trn6zrpbwg67O06rSA7ZaI64uk6rCAIOunpCBzcGF3buuniOuLpCDsnqzrsJTsnbjrlKntlZzri6QuXG4gIHNlcnZlclJlcXVlc3RIYW5kbGVyPzogKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUpOiB3b3JrZXIg6rCAIOyDneyEse2VnCB0aHJlYWQg65Ok7J2YIOuplO2DgC5cbiAgLy8gZXBoZW1lcmFsIHRocmVhZCDripQg7J20IO2UhOuhnOyEuOyKpCDrqZTrqqjrpqzsl5Drp4wg7KG07J6s7ZWY66+A66GcIHJlc3RhcnQg7IucIOyghOu2gCDrrLTtmqguXG4gIHByaXZhdGUgdGhyZWFkTWV0YSA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3RVc2VkQXQ6IG51bWJlciB9PigpO1xuICAvLyBzcGF3biDsubTsmrTthLAuIHJlc3RhcnQg66eI64ukIOymneqwgCDihpIgY29udiDtlbjrk6TsnZggZXBvY2gg7JmAIOuMgOyhsO2VtCBzdGFsZSB0aHJlYWQg6rCQ7KeALlxuICBwcml2YXRlIGVwb2NoQ291bnRlciA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRIUkVBRF9JRExFX1RUTF9NUyA9IDEwICogNjBfMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfVEhSRUFEU19QRVJfV09SS0VSID0gMTY7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IFdvcmtlckNvbmZpZykge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGNvbmZpZy53b3JrZXJJbmRleCAhPT0gdW5kZWZpbmVkID8gYC0ke2NvbmZpZy53b3JrZXJJbmRleH1gIDogXCJcIjtcbiAgICB0aGlzLmNvZGV4SG9tZSA9IGAvdG1wL3FncmlkLWNvZGV4LyR7Y29uZmlnLnRva2VuSWR9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIGNvbnN0IGN3ZCA9IGAke3RoaXMuY29kZXhIb21lfS9jd2RgO1xuICAgIG1rZGlyU3luYyhjd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGNvZGV4IOuCtOyepSB0b29sL3dlYl9zZWFyY2gvaW5zdHJ1Y3Rpb24g67iU66GdIOu5hO2ZnOyEse2ZlFxuICAgIHdyaXRlRmlsZVN5bmMoYCR7dGhpcy5jb2RleEhvbWV9L2NvbmZpZy50b21sYCwgQ09ERVhfQ09ORklHX1RPTUwpO1xuXG4gICAgdGhpcy5wcm9jID0gc3Bhd24oXCJjb2RleFwiLCBbXCJhcHAtc2VydmVyXCIsIFwiLS1saXN0ZW5cIiwgXCJzdGRpbzovL1wiXSwge1xuICAgICAgc3RkaW86IFtcInBpcGVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgIGN3ZCxcbiAgICAgIGVudjoge1xuICAgICAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICAgICAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICAgICAgQ09ERVhfSE9NRTogdGhpcy5jb2RleEhvbWUsXG4gICAgICAgIC8vIGVudmlyb25tZW50IOu5hO2ZnOyEse2ZlCDihpIgaGFzX2Vudmlyb25tZW50PWZhbHNlIOKGkiBzaGVsbC9hcHBseV9wYXRjaC92aWV3X2ltYWdlIOygnOqxsFxuICAgICAgICBDT0RFWF9FWEVDX1NFUlZFUl9VUkw6IFwibm9uZVwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvYy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGV4aXRlZCAoY29kZT0ke2NvZGV9KWApO1xuICAgICAgdGhpcy5mYWlsQWN0aXZlVHVybihcbiAgICAgICAgbmV3IEVycm9yKGBjb2RleCB3b3JrZXIgZXhpdGVkIHdoaWxlIHR1cm4gd2FzIHJ1bm5pbmcgKGNvZGU9JHtjb2RlID8/IFwidW5rbm93blwifSlgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLnJwYyA9IG51bGw7XG4gICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhpcy5zY2hlZHVsZVJlc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucnBjID0gbmV3IENvZGV4UnBjQ2xpZW50KHRoaXMucHJvYyk7XG4gICAgLy8gcmVzdGFydCDtm4Tsl5Drj4QgcmVmcmVzaCBzZXJ2ZXItcmVxdWVzdCDtlbjrk6Trn6zrpbwg7Jyg7KeAICjsl4bsnLzrqbQgY29kZXgg7Yag7YGwIO2ajOyghCDsi6TtjKgg4oaSIHNlc3Npb24gZXhwaXJlZClcbiAgICB0aGlzLmJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcImluaXRpYWxpemVcIiwge1xuICAgICAgY2xpZW50SW5mbzogeyBuYW1lOiBcInFncmlkXCIsIHZlcnNpb246IFwiMS4wLjBcIiB9LFxuICAgICAgY2FwYWJpbGl0aWVzOiB7IGV4cGVyaW1lbnRhbEFwaTogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJsb2dpbiB0aW1lb3V0XCIpKSwgMTIwXzAwMCk7XG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJhY2NvdW50L2xvZ2luL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmIChwLnN1Y2Nlc3MpIHJlc29sdmUoKTtcbiAgICAgICAgZWxzZSByZWplY3QobmV3IEVycm9yKGBsb2dpbiBmYWlsZWQ6ICR7cC5lcnJvciA/PyBcInVua25vd25cIn1gKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zcGF3bkFuZEluaXQoKTtcblxuICAgIGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRBdXRoVG9rZW5zXCIsXG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy5jb25maWcuYWNjZXNzVG9rZW4sXG4gICAgICBjaGF0Z3B0QWNjb3VudElkOiB0aGlzLmNvbmZpZy5hY2NvdW50SWQsXG4gICAgICAuLi4odGhpcy5jb25maWcucGxhblR5cGUgPyB7IGNoYXRncHRQbGFuVHlwZTogdGhpcy5jb25maWcucGxhblR5cGUgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMud2FpdEZvckxvZ2luQ29tcGxldGVkKCk7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPSAwO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRCcm93c2VyTG9naW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0PHsgYXV0aFVybDogc3RyaW5nIH0+KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRcIixcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIHN0YXJ0ZWRgKTtcbiAgICByZXR1cm4gcmVzdWx0LmF1dGhVcmw7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yQnJvd3NlckxvZ2luQ29tcGxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gYnJvd3NlciBsb2dpbiBjb21wbGV0ZWRgKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRNYW5hZ2VkQ3JlZGVudGlhbHMoKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nO1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICB9IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vYXV0aC5qc29uYCwgXCJ1dGYtOFwiKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY2Nlc3NUb2tlbjogcmF3LnRva2Vucz8uYWNjZXNzX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmF3LnRva2Vucz8ucmVmcmVzaF90b2tlbiA/PyBcIlwiLFxuICAgICAgICBpZFRva2VuOiByYXcudG9rZW5zPy5pZF90b2tlbixcbiAgICAgICAgYWNjb3VudElkOiByYXcudG9rZW5zPy5hY2NvdW50X2lkID8/IFwiXCIsXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4obmV3IEVycm9yKFwiY29kZXggd29ya2VyIHN0b3BwZWRcIikpO1xuICAgIHRoaXMucnBjPy5kZXN0cm95KCk7XG5cbiAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICB0aGlzLnByb2Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvYz8ua2lsbChcIlNJR0tJTExcIik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzXzAwMCk7XG4gICAgICAgIHRoaXMucHJvYyEub24oXCJleGl0XCIsICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkgJiYgIXRoaXMuZGVzdHJveWVkO1xuICB9XG4gIGdldCBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IHRva2VuSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5JZDtcbiAgfVxuICBnZXQgd29ya2VySW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMDtcbiAgfVxuICBnZXQgdG9rZW5OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRva2VuTmFtZTtcbiAgfVxuXG4gIGNhblJldXNlRm9yVG9rZW4oX3Rva2VuTmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPT09IGNyZWRlbnRpYWxzLmFjY291bnRJZCAmJlxuICAgICAgKHRoaXMuY29uZmlnLnBsYW5UeXBlID8/IHVuZGVmaW5lZCkgPT09IChjcmVkZW50aWFscy5wbGFuVHlwZSA/PyB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVRva2VuU3RhdGUodG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcudG9rZW5OYW1lID0gdG9rZW5OYW1lO1xuICAgIHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuID0gY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5jb25maWcuYWNjb3VudElkID0gY3JlZGVudGlhbHMuYWNjb3VudElkO1xuICAgIGlmIChjcmVkZW50aWFscy5wbGFuVHlwZSkge1xuICAgICAgdGhpcy5jb25maWcucGxhblR5cGUgPSBjcmVkZW50aWFscy5wbGFuVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLnBsYW5UeXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZXRSYXRlTGltaXRzKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgcmV0dXJuIHRoaXMucnBjLnJlcXVlc3QoXCJhY2NvdW50L3JhdGVMaW1pdHMvcmVhZFwiLCB7fSk7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgfTtcbiAgICBjb25zdCB7IHRocmVhZCwgbW9kZWw6IHRocmVhZE1vZGVsIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFRocmVhZFN0YXJ0UmVzcG9uc2U+KFxuICAgICAgXCJ0aHJlYWQvc3RhcnRcIixcbiAgICAgIHtcbiAgICAgICAgZXBoZW1lcmFsOiB0cnVlLFxuICAgICAgICBjd2Q6IGAke3RoaXMuY29kZXhIb21lfS9jd2RgLFxuICAgICAgICBiYXNlSW5zdHJ1Y3Rpb25zOiBCQVNFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zID8/IFwiXCIsXG4gICAgICAgIHNhbmRib3g6IFRIUkVBRF9ERUZBVUxUUy5zYW5kYm94LFxuICAgICAgICBhcHByb3ZhbFBvbGljeTogVEhSRUFEX0RFRkFVTFRTLmFwcHJvdmFsUG9saWN5LFxuICAgICAgICBjb25maWc6IHRocmVhZENvbmZpZyxcbiAgICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+LFxuICAgICk7XG5cbiAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZC5pZDtcbiAgICBpZiAocmVxLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInRocmVhZC9pbmplY3RfaXRlbXNcIiwge1xuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgaXRlbXM6IHJlcS5oaXN0b3J5LFxuICAgICAgfSBzYXRpc2ZpZXMgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMpO1xuICAgIH1cbiAgICB0aGlzLnRocmVhZE1ldGEuc2V0KHRocmVhZElkLCB7IGxhc3RVc2VkQXQ6IERhdGUubm93KCkgfSk7XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZCwgcmVxKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwpO1xuICAgIHJldHVybiB7IC4uLnJlc3VsdCwgdGhyZWFkSWQgfTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrcyxcbiAgICBleGlzdGluZ1RocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmc7XG4gICAgbGV0IG1vZGVsOiBzdHJpbmc7XG4gICAgaWYgKGV4aXN0aW5nVGhyZWFkSWQpIHtcbiAgICAgIHRocmVhZElkID0gZXhpc3RpbmdUaHJlYWRJZDtcbiAgICAgIG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHRocmVhZElkLCBtb2RlbCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUaHJlYWQocmVxKSk7XG4gICAgfVxuICAgIGNvbnN0IHsgdHVybklkIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgY2Iub25UdXJuSWQ/Lih0dXJuSWQpO1xuICAgIGF3YWl0IHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYik7XG4gICAgcmV0dXJuIHsgdGhyZWFkSWQgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aHJlYWQg7J6s7IKs7JqpIOyngOybkCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXQgZXBvY2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lcG9jaENvdW50ZXI7XG4gIH1cblxuICBoYXNUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRocmVhZE1ldGEuaGFzKHRocmVhZElkKTtcbiAgfVxuXG4gIC8vIGlkbGUgVFRMIOy0iOqzvCAvIOqwnOyImCDsg4HtlZwg7LSI6rO8IHRocmVhZCDrpbwg7KCV66asLiBjcmVhdGVUaHJlYWQg7KeB7KCEIGxhenkg7Zi47LacLlxuICAvLyBjb2RleCBlcGhlbWVyYWwgdGhyZWFkIOuKlCDrqoXsi5zsoIEgY2xvc2UgUlBDIOyXhuydtCDrp7Xsl5DshJwg7KCc6rGwIOKGkiDrjZQg7J207IOBIHR1cm4g7JWIIOuztOuDhC5cbiAgc3dlZXBJZGxlVGhyZWFkcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCBtZXRhXSBvZiB0aGlzLnRocmVhZE1ldGEpIHtcbiAgICAgIGlmIChub3cgLSBtZXRhLmxhc3RVc2VkQXQgPiBDb2RleEFwcFNlcnZlcldvcmtlci5USFJFQURfSURMRV9UVExfTVMpIHtcbiAgICAgICAgdGhpcy50aHJlYWRNZXRhLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNyZWF0ZVRocmVhZCDsp4HsoIQg7Zi47LacIOKGkiDsg4ggdGhyZWFkIDEg6rCc6rCAIOqzpyDstpTqsIDrkJzri6QuIOy2lOqwgCDtm4Tsl5Drj4QgTUFYIOulvCDrhJjsp4Ag7JWK64+E66GdXG4gICAgLy8gTUFYLTEg7J207ZWY66GcIOykhOyXrCDrkZTri6Qo6re4656Y7JW8IOyDneyEsSDsp4Htm4Qg7KCV7ZmV7Z6IIE1BWCkuIExSVTogbGFzdFVzZWRBdCDsmKTrpoTssKjsiJzsnLzroZwg7KCc6rGwLlxuICAgIGNvbnN0IGxpbWl0ID0gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuTUFYX1RIUkVBRFNfUEVSX1dPUktFUiAtIDE7XG4gICAgaWYgKHRoaXMudGhyZWFkTWV0YS5zaXplID4gbGltaXQpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLnRocmVhZE1ldGEuZW50cmllcygpXS50b1NvcnRlZChcbiAgICAgICAgKGEsIGIpID0+IGFbMV0ubGFzdFVzZWRBdCAtIGJbMV0ubGFzdFVzZWRBdCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvdmVyID0gdGhpcy50aHJlYWRNZXRhLnNpemUgLSBsaW1pdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ZlcjsgaSsrKSB0aGlzLnRocmVhZE1ldGEuZGVsZXRlKHNvcnRlZFtpXSFbMF0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGludGVycnVwdFR1cm4odGhyZWFkSWQ6IHN0cmluZywgdHVybklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0dXJuL2ludGVycnVwdFwiLCB7IHRocmVhZElkLCB0dXJuSWQgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgcHJpdmF0ZSBmYWlsQWN0aXZlVHVybihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zdCBhYm9ydCA9IHRoaXMuYWN0aXZlVHVybkFib3J0O1xuICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgIGFib3J0Py4oZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVHVybk5vdGlmaWNhdGlvbnModGhyZWFkSWQ6IHN0cmluZywgbW9kZWw6IHN0cmluZyk6IFByb21pc2U8VHVyblJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUdXJuUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGFib3J0OiBBY3RpdmVUdXJuQWJvcnQ7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVUdXJuQWJvcnQgPT09IGFib3J0KSB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoUmVzdWx0ID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOyLnCAudG90YWwg7J2AIOuMgO2ZlCDsoITssrQg64iE7KCB7J206528LCBjb2xkIOyYgOuNmCDsnbTsoIQgdHVybiDquYzsp4Ag7ISe7JesXG4gICAgICAgIC8vIOydtCDsmpTssq0g7J6Q7LK07J2YIGNhY2hlIOyggeykkeuloOydtCDtnazshJ3rkJzri6Qo7JiIOiB0dXJuMSBjb2xkIDAlICsgdHVybjIgOTAlIOKGkiA0OCUg66GcIOq4sOuhnSkuXG4gICAgICAgIC8vIC5sYXN0IOuKlCDsnbTrsoggdHVybiDrp4zsnZggdXNhZ2Ug6528IHJlcXVlc3RfbG9nIOqwgCDqt7gg7JqU7LKt7J2YIOyLpOygnCDthqDtgbDsnYQg7KCV7ZmV7Z6IIOuwmOyYge2VnOuLpC5cbiAgICAgICAgdXNhZ2UgPSBwLnRva2VuVXNhZ2UubGFzdDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgZHVyYXRpb25NcyA9IHAudHVybi5kdXJhdGlvbk1zID8/IDA7XG4gICAgICAgIGlmIChwLnR1cm4uc3RhdHVzID09PSBcImNvbXBsZXRlZFwiKSBmaW5pc2hXaXRoUmVzdWx0KHsgdGV4dCwgdXNhZ2UsIGR1cmF0aW9uTXMsIG1vZGVsIH0pO1xuICAgICAgICBlbHNlIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIixcbiAgICAgICAgICBcInR1cm4vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgICAgdGhpcy5ycGM/Lm9uTm90aWZpY2F0aW9uKG4sICgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aEVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBjYi5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhDb21wbGV0ZSA9IChyZXN1bHQ6IFR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhDb21wbGV0ZSh7IHRleHQsIHVzYWdlLCBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLCBtb2RlbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuICR7cC50dXJuLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocC50dXJuLmVycm9yKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJlcnJvclwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFwLndpbGxSZXRyeSkge1xuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYGNvZGV4IGVycm9yOiAke3AuZXJyb3IubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlc3RhcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8IHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICBpZiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPj0gTUFYX1JFU1RBUlRfQVRURU1QVFMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gbWF4IHJlc3RhcnQgYXR0ZW1wdHMgcmVhY2hlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzKys7XG4gICAgY29uc3QgYmFzZURlbGF5ID0gUkVTVEFSVF9CQUNLT0ZGX0JBU0VfTVMgKiAyICoqICh0aGlzLnJlc3RhcnRBdHRlbXB0cyAtIDEpO1xuICAgIGNvbnN0IHN0YWdnZXIgPSAodGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMCkgKiAyXzAwMDtcbiAgICBjb25zdCBkZWxheSA9IGJhc2VEZWxheSArIHN0YWdnZXI7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfVske3RoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDB9XSByZXN0YXJ0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLnJlc3RhcnRBdHRlbXB0c30pYCxcbiAgICApO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMub25SZWFkeT8uKCkpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IHJlc3RhcnQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZXN0YXJ0KCk7XG4gICAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFjQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBRW5ELE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sMEJBQTBCO0FBc0NoQyxNQUFNLGtCQUFrQjtDQUN0QixTQUFTO0NBQ1QsZ0JBQWdCO0NBQ2hCLFFBQVEsRUFDTixNQUFNLEVBQUUsVUFBVTtFQUFFLFNBQVM7RUFBTyxxQkFBcUI7RUFBTyxvQkFB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
@@ -52,10 +52,14 @@ var OpenAIDispatcher = class OpenAIDispatcher {
52
52
  }
53
53
  async onTokenRemoved(id) {
54
54
  const workers = this.workerPool.get(id) ?? [];
55
+ const tokenName = workers[0]?.tokenName;
55
56
  this.workerPool.delete(id);
56
57
  await Promise.allSettled(workers.map((w) => w.kill()));
57
58
  if (this.getAllReadyActiveWorkers().length === 0) this.rejectAllQueued("NO_OPENAI_WORKERS");
58
- if (workers.length > 0) logger.info(`workers removed for token ${id}: ${workers.length}`);
59
+ if (workers.length > 0) {
60
+ const label = tokenName ?? `token ${id}`;
61
+ logger.info(`workers removed: ${label} (${workers.length})`);
62
+ }
59
63
  }
60
64
  async onTokenUpdated(id, name, credentials) {
61
65
  const existing = this.workerPool.get(id) ?? [];
@@ -65,7 +69,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
65
69
  }
66
70
  if (existing.every((w) => w.canReuseForToken(name, credentials))) {
67
71
  existing.forEach((w) => w.updateTokenState(name, credentials));
68
- logger.info(`workers updated in-place for token ${id} (${name})`);
72
+ logger.info(`workers updated in-place: ${name}`);
69
73
  this.drainQueue();
70
74
  return;
71
75
  }
@@ -74,18 +78,24 @@ var OpenAIDispatcher = class OpenAIDispatcher {
74
78
  await this.spawnWorkers(id, name, credentials);
75
79
  }
76
80
  onTokenDeactivated(id) {
77
- (this.workerPool.get(id) ?? []).forEach((w) => {
81
+ const workers = this.workerPool.get(id) ?? [];
82
+ const tokenName = workers[0]?.tokenName;
83
+ workers.forEach((w) => {
78
84
  w.active = false;
79
85
  });
80
86
  if (this.getAllReadyActiveWorkers().length === 0) this.rejectAllQueued("NO_ACTIVE_WORKERS");
81
- logger.info(`workers deactivated: token ${id}`);
87
+ const label = tokenName ?? `token ${id}`;
88
+ logger.info(`workers deactivated: ${label}`);
82
89
  }
83
90
  onTokenActivated(id) {
84
- (this.workerPool.get(id) ?? []).forEach((w) => {
91
+ const workers = this.workerPool.get(id) ?? [];
92
+ const tokenName = workers[0]?.tokenName;
93
+ workers.forEach((w) => {
85
94
  w.active = true;
86
95
  });
87
96
  this.drainQueue();
88
- logger.info(`workers activated: token ${id}`);
97
+ const label = tokenName ?? `token ${id}`;
98
+ logger.info(`workers activated: ${label}`);
89
99
  }
90
100
  async generate(req) {
91
101
  const reuseWorker = await this.acquireReuseWorker(req);
@@ -274,10 +284,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
274
284
  const worker = await this.spawnSingleWorker(tokenId, tokenName, credentials, i);
275
285
  if (worker) workers.push(worker);
276
286
  }
277
- if (workers.length > 0) {
278
- this.workerPool.set(tokenId, workers);
279
- logger.info(`${workers.length}/${WORKERS_PER_TOKEN} workers spawned for ${tokenName}`);
280
- }
287
+ if (workers.length > 0) this.workerPool.set(tokenId, workers);
281
288
  }
282
289
  async spawnSingleWorker(tokenId, tokenName, credentials, workerIndex) {
283
290
  const worker = new CodexAppServerWorker({
@@ -295,7 +302,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
295
302
  });
296
303
  try {
297
304
  await worker.initialize();
298
- logger.info(`worker spawned: ${tokenName}[${workerIndex}] (id=${tokenId + 1})`);
305
+ logger.info(`worker spawned: ${tokenName}[${workerIndex}]`);
299
306
  return worker;
300
307
  } catch (e) {
301
308
  logger.warn(`worker spawn failed: ${tokenName}[${workerIndex}]: ${e.message}`);
@@ -376,4 +383,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
376
383
  //#endregion
377
384
  export { OpenAIDispatcher };
378
385
 
379
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBDb2RleEFwcFNlcnZlcldvcmtlciwgdHlwZSBTdHJlYW1DYWxsYmFja3MsIHR5cGUgVHVyblJlcXVlc3QgfSBmcm9tIFwiLi9jb2RleC13b3JrZXJcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCB9IGZyb20gXCIuL29wZW5haS1yZWZyZXNoXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9wZW5haS1kaXNwYXRjaGVyXCJdKTtcblxuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImxvd1wiO1xuY29uc3QgTUFYX1dPUktFUlNfUEVSX1RPS0VOID0gNTtcbmNvbnN0IFdPUktFUlNfUEVSX1RPS0VOID0gTWF0aC5taW4oXG4gIE51bWJlcihwcm9jZXNzLmVudi5RR1JJRF9XT1JLRVJTX1BFUl9UT0tFTiA/PyAzKSxcbiAgTUFYX1dPUktFUlNfUEVSX1RPS0VOLFxuKTtcbmNvbnN0IFFVRVVFX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5jb25zdCBNQVhfUVVFVUVfU0laRSA9IDUwO1xuY29uc3QgU1BBV05fSU5URVJWQUxfTVMgPSA1MDA7XG5cbi8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlIOqzoOyglSkuIOuBhOuptCDquLDsobQgXCLrp6QgdHVybiDsg4ggdGhyZWFkICsgaGlzdG9yeSBpbmplY3RcIiDrj5nsnpEuXG5jb25zdCBUSFJFQURfUkVVU0VfRU5BQkxFRCA9IHByb2Nlc3MuZW52LlFHUklEX09QRU5BSV9USFJFQURfUkVVU0UgIT09IFwiZmFsc2VcIjtcbi8vIOyijO2RnCB3b3JrZXIg6rCAIGJ1c3kg7J28IOuVjCBmcmVlIOulvCDquLDri6TrpqzripQg7LWc64yAIOyLnOqwhC4g7LSI6rO8IOyLnCDsg4ggdGhyZWFkIOuhnCDtj7TrsLEuXG5jb25zdCBSRVVTRV9XT1JLRVJfV0FJVF9NUyA9IDVfMDAwO1xuY29uc3QgUkVVU0VfV09SS0VSX1BPTExfTVMgPSA1MDtcblxuLy8gd29ya2VySWQg7ZWp7ISxOiB0b2tlbklkIOyZgCB3b3JrZXJJbmRleCgwLi40KSDrpbwg7ZWY64KY7J2YIOyViOyglSDsiKvsnpDroZwg7J247L2U65SpLlxuZnVuY3Rpb24gbWFrZVdvcmtlcklkKHRva2VuSWQ6IG51bWJlciwgd29ya2VySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0b2tlbklkICogMTAgKyB3b3JrZXJJbmRleDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxudHlwZSBRdWV1ZUl0ZW0gPSB7XG4gIHJlc29sdmU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgYWJvcnRDbGVhbnVwPzogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgd29ya2VyUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBDb2RleEFwcFNlcnZlcldvcmtlcltdPigpO1xuICByckN1cnNvciA9IDA7XG4gIHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHtXT1JLRVJTX1BFUl9UT0tFTn0gd29ya2VycyBlYWNoKWAsXG4gICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIG9wZW5haVRva2Vucy5tYXAoYXN5bmMgKHQpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnModC5pZCwgdC5uYW1lLCB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzKTtcbiAgICAgICAgaWYgKCF0LmFjdGl2ZSkgdGhpcy5vblRva2VuRGVhY3RpdmF0ZWQodC5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIkRJU1BBVENIRVJfU0hVVERPV05cIik7XG4gICAgY29uc3Qga2lsbHMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkubWFwKCh3KSA9PiB3LmtpbGwoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGtpbGxzKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUb2tlbiBldmVudHMgKGZyb20gVG9rZW5TdWJzY3JpYmVyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBvblRva2VuQWRkZWQoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhpZCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHcpID0+IHcua2lsbCgpKSk7XG4gICAgaWYgKHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIk5PX09QRU5BSV9XT1JLRVJTXCIpO1xuICAgIH1cbiAgICBpZiAod29ya2Vycy5sZW5ndGggPiAwKSBsb2dnZXIuaW5mbyhgd29ya2VycyByZW1vdmVkIGZvciB0b2tlbiAke2lkfTogJHt3b3JrZXJzLmxlbmd0aH1gKTtcbiAgfVxuXG4gIGFzeW5jIG9uVG9rZW5VcGRhdGVkKGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBpZiAoZXhpc3RpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleGlzdGluZy5ldmVyeSgodykgPT4gdy5jYW5SZXVzZUZvclRva2VuKG5hbWUsIGNyZWRlbnRpYWxzKSkpIHtcbiAgICAgIGV4aXN0aW5nLmZvckVhY2goKHcpID0+IHcudXBkYXRlVG9rZW5TdGF0ZShuYW1lLCBjcmVkZW50aWFscykpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgdXBkYXRlZCBpbi1wbGFjZSBmb3IgdG9rZW4gJHtpZH0gKCR7bmFtZX0pYCk7XG4gICAgICB0aGlzLmRyYWluUXVldWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZXhpc3RpbmcubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscyk7XG4gIH1cblxuICBvblRva2VuRGVhY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICh0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXSkuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiTk9fQUNUSVZFX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIGRlYWN0aXZhdGVkOiB0b2tlbiAke2lkfWApO1xuICB9XG5cbiAgb25Ub2tlbkFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgKHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdKS5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5kcmFpblF1ZXVlKCk7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgYWN0aXZhdGVkOiB0b2tlbiAke2lkfWApO1xuICB9XG5cbiAgLy8g4pSA4pSAIEdlbmVyYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg6rK966GcOiDsooztkZwgd29ya2VyIOulvCDsoJDsnKDtlbQg6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJLlxuICAgIGNvbnN0IHJldXNlV29ya2VyID0gYXdhaXQgdGhpcy5hY3F1aXJlUmV1c2VXb3JrZXIocmVxKTtcbiAgICBpZiAocmV1c2VXb3JrZXIpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBg4oa7ICR7cmV1c2VXb3JrZXIudG9rZW5OYW1lfVske3JldXNlV29ya2VyLnRva2VuSWR9XSAocmV1c2UgdGhyZWFkLCAke3JlcS5tb2RlbH0pYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxLCByZXEucmV1c2UhLnRocmVhZElkKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5hY3F1aXJlSWRsZVdvcmtlcigpO1xuICAgIGlmICh3b3JrZXIpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3b3JrZXIudG9rZW5OYW1lfVske3dvcmtlci50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCh3KSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dy50b2tlbk5hbWV9WyR7dy50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0sIHF1ZXVlZClgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoKTtcbiAgICBpZiAod29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7d29ya2VyLnRva2VuTmFtZX1bJHt3b3JrZXIudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCh3KSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dy50b2tlbk5hbWV9WyR7dy50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0sIFtzdHJlYW1dLCBxdWV1ZWQpYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlU3RyZWFtVHVybih3LCByZXEsIGNiKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHJldXNlIOyijO2RnOqwgCDsnKDtmqjtlZjrqbQg6re4IHdvcmtlciDrpbwgYnVzeSDsoJDsnKDtlbQg67CY7ZmYLiDsl4bqsbDrgpgg7Y+067CxIOuMgOyDgeydtOuptCBudWxsLlxuICAvLyDtj7TrsLEg7IKs7JygOiDquLDriqUgb2ZmIC8g7KKM7ZGcIOyXhuydjCAvIHdvcmtlciDrtoDsnqzCt+yjveydjCAvIGVwb2NoIOu2iOydvOy5mChyZXN0YXJ0KSAvIHRocmVhZCDshozrqbggL1xuICAvLyAgICAgICAgICAgIGJ1c3kg64yA6riwIO2DgOyehOyVhOybgy4gbnVsbCDrsJjtmZgg7IucIO2YuOy2nOu2gOuKlCDsg4ggdGhyZWFkIOqyveuhnOuhnCDsp4TtlokuXG4gIGFzeW5jIGFjcXVpcmVSZXVzZVdvcmtlcihyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgaWYgKCFUSFJFQURfUkVVU0VfRU5BQkxFRCB8fCAhcmVxLnJldXNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdvcmtlcklkLCB0aHJlYWRJZCwgZXBvY2ggfSA9IHJlcS5yZXVzZTtcblxuICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuZmluZFdvcmtlckJ5SWQod29ya2VySWQpO1xuICAgIGlmICghd29ya2VyIHx8ICF3b3JrZXIuaXNSZWFkeSB8fCAhd29ya2VyLmFjdGl2ZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHdvcmtlci5lcG9jaCAhPT0gZXBvY2gpIHJldHVybiBudWxsO1xuICAgIGlmICghd29ya2VyLmhhc1RocmVhZCh0aHJlYWRJZCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUkVVU0VfV09SS0VSX1dBSVRfTVM7XG4gICAgZm9yICg7Oykge1xuICAgICAgLy8gcmVzdGFydChlcG9jaCDrs4Dqsr0pIC8gdGhyZWFkIOyGjOupuOydtCDrjIDquLAg7KSR7JeQIOuwnOyDne2VmOuptCDtj7TrsLEuXG4gICAgICBpZiAod29ya2VyLmVwb2NoICE9PSBlcG9jaCB8fCAhd29ya2VyLmhhc1RocmVhZCh0aHJlYWRJZCkpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHdvcmtlci50cnlBY3F1aXJlVHVybigpKSByZXR1cm4gd29ya2VyO1xuICAgICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHJldHVybiBudWxsO1xuICAgICAgYXdhaXQgc2xlZXAoUkVVU0VfV09SS0VSX1BPTExfTVMpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmRXb3JrZXJCeUlkKHdvcmtlcklkOiBudW1iZXIpOiBDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGwge1xuICAgIGZvciAoY29uc3Qgd29ya2VycyBvZiB0aGlzLndvcmtlclBvb2wudmFsdWVzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgdyBvZiB3b3JrZXJzKSB7XG4gICAgICAgIGlmIChtYWtlV29ya2VySWQody50b2tlbklkLCB3LndvcmtlckluZGV4KSA9PT0gd29ya2VySWQpIHJldHVybiB3O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQ6IHN0cmluZywgdHVybklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxXb3JrZXJzID0gWy4uLnRoaXMud29ya2VyUG9vbC52YWx1ZXMoKV0uZmxhdCgpLmZpbHRlcigodykgPT4gdy5pc1JlYWR5KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYWxsV29ya2Vycy5tYXAoKHcpID0+IHcuaW50ZXJydXB0VHVybih0aHJlYWRJZCwgdHVybklkKSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdvcmtlciBzZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vICDquLDrs7ggcm91bmQtcm9iaW5cbiAgLy8gVE9ETzog7LaU7ZuEIOuLpOuluCDslYzqs6DrpqzsppjsnLzroZwg67OA6rK9IOqwgOuKpe2VmOqyjCDsp4Dsm5BcbiAgYWNxdWlyZUlkbGVXb3JrZXIoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsIHtcbiAgICBjb25zdCBhbGxXb3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBpZiAoYWxsV29ya2Vycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsV29ya2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdyA9IGFsbFdvcmtlcnNbKHRoaXMucnJDdXJzb3IgKyBpKSAlIGFsbFdvcmtlcnMubGVuZ3RoXSE7XG4gICAgICBpZiAody50cnlBY3F1aXJlVHVybigpKSB7XG4gICAgICAgIHRoaXMucnJDdXJzb3IgPSAodGhpcy5yckN1cnNvciArIGkgKyAxKSAlIGFsbFdvcmtlcnMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSAmJiB3LmFjdGl2ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUXVldWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZW5xdWV1ZTxUPihleGVjdXRlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5PX09QRU5BSV9XT1JLRVJTXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID49IE1BWF9RVUVVRV9TSVpFKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIikpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBRdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHJlc29sdmU6ICh3b3JrZXIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgZXhlY3V0ZSkpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lcjogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUoaXRlbSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICAgICAgfSwgUVVFVUVfVElNRU9VVF9NUyksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVGcm9tUXVldWUoaXRlbTogUXVldWVJdGVtKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICBjb25zdCBpZHggPSB0aGlzLnF1ZXVlLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGlkeCAhPT0gLTEpIHRoaXMucXVldWUuc3BsaWNlKGlkeCwgMSk7XG4gIH1cblxuICByZWplY3RBbGxRdWV1ZWQocmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IocmVhc29uKTtcbiAgICB0aGlzLnF1ZXVlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgIGl0ZW0ucmVqZWN0KGVycik7XG4gICAgfSk7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICB9XG5cbiAgZHJhaW5RdWV1ZShyZWxlYXNlZFdvcmtlcj86IENvZGV4QXBwU2VydmVyV29ya2VyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgcmVsZWFzZWRXb3JrZXIgJiZcbiAgICAgIHRoaXMucXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgcmVsZWFzZWRXb3JrZXIuaXNSZWFkeSAmJlxuICAgICAgcmVsZWFzZWRXb3JrZXIuYWN0aXZlICYmXG4gICAgICByZWxlYXNlZFdvcmtlci50cnlBY3F1aXJlVHVybigpXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZS5zaGlmdCgpITtcbiAgICAgIG5leHQucmVzb2x2ZShyZWxlYXNlZFdvcmtlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy5hY3F1aXJlSWRsZVdvcmtlcigpO1xuICAgICAgaWYgKCF3b3JrZXIpIGJyZWFrO1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWUuc2hpZnQoKSE7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMuZHJhaW5RdWV1ZSh3b3JrZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJldXNlVGhyZWFkSWQg6rCAIOyeiOycvOuptCDquLDsobQgdGhyZWFkIOyXkCBkZWx0YShyZXVzZUlucHV0KeunjCwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7JeQIOyghOyytFxuICAvLyBwcm9tcHQoY29sZElucHV0KSArIGhpc3RvcnkgaW5qZWN0LiByZXVzZSDqsIAgZGlzcGF0Y2hlciDri6jsl5DshJwg7Y+067Cx65CY66m0IO2bhOyekOuhnCDrlqjslrTsp4Tri6QuXG4gIHByaXZhdGUgYnVpbGRUdXJuUmVxdWVzdChyZXE6IEdlbmVyYXRlUmVxdWVzdCwgcmV1c2VUaHJlYWRJZD86IHN0cmluZyk6IFR1cm5SZXF1ZXN0IHtcbiAgICBjb25zdCByZXVzaW5nID0gcmV1c2VUaHJlYWRJZCAhPT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dDogcmV1c2luZyAmJiByZXEucmV1c2VJbnB1dCA/IHJlcS5yZXVzZUlucHV0IDogcmVxLmNvbGRJbnB1dCxcbiAgICAgIGhpc3Rvcnk6IHJldXNpbmcgPyB1bmRlZmluZWQgOiByZXEuY29sZEhpc3RvcnksXG4gICAgICBkZXZlbG9wZXJJbnN0cnVjdGlvbnM6IHJlcS5zeXN0ZW1Qcm9tcHQsXG4gICAgICBvdXRwdXRTY2hlbWE6IHJlcS5vdXRwdXRTY2hlbWEsXG4gICAgICBlZmZvcnQ6IHJlcS5lZmZvcnQgPz8gREVGQVVMVF9FRkZPUlQsXG4gICAgICBtb2RlbDogcmVxLm1vZGVsLFxuICAgICAgdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5LFxuICAgICAgcmVhc29uaW5nU3VtbWFyeTogcmVxLnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICBzZXJ2aWNlVGllcjogcmVxLnNlcnZpY2VUaWVyLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuKHR1cm5SZXEsIHJldXNlVGhyZWFkSWQpO1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSxcbiAgICAgIHVzYWdlOiByZXN1bHQudXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICB3b3JrZXJJZDogbWFrZVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICB0aHJlYWRJZDogcmVzdWx0LnRocmVhZElkLFxuICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVN0cmVhbVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gICAgcmV1c2VUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHVyblJlcSA9IHRoaXMuYnVpbGRUdXJuUmVxdWVzdChyZXEsIHJldXNlVGhyZWFkSWQpO1xuICAgIC8vIHdvcmtlciDsnZggVHVyblJlc3VsdCDsl5AgdG9rZW5OYW1lL3RocmVhZENvb3JkIOulvCDrtpnsl6wg7IOB7JyEKEdlbmVyYXRlUmVzdWx0KeuhnCDsmKzrprDri6QuXG4gICAgLy8gdGhyZWFkSWQg64qUIOyDiCB0aHJlYWQg66m0IG9uVGhyZWFkSWQg66GcIO2ZleygleuQmOuvgOuhnCDrr7jrpqwg67O06rSA7ZW0IOuRkOqzoCBvbkNvbXBsZXRlIOuVjCDsnb3ripTri6QuXG4gICAgbGV0IHJlc29sdmVkVGhyZWFkSWQgPSByZXVzZVRocmVhZElkID8/IFwiXCI7XG4gICAgY29uc3Qgd3JhcHBlZENiOiBTdHJlYW1DYWxsYmFja3MgPSB7XG4gICAgICAuLi5jYixcbiAgICAgIG9uVGhyZWFkSWQ6ICh0aHJlYWRJZCkgPT4ge1xuICAgICAgICByZXNvbHZlZFRocmVhZElkID0gdGhyZWFkSWQ7XG4gICAgICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICBjYi5vbkNvbXBsZXRlKHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgICB3b3JrZXJJZDogbWFrZVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlc29sdmVkVGhyZWFkSWQsXG4gICAgICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmtlci5leGVjdXRlVHVyblN0cmVhbSh0dXJuUmVxLCB3cmFwcGVkQ2IsIHJldXNlVGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXduIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNwYXduV29ya2VycyhcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBXT1JLRVJTX1BFUl9UT0tFTjsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgaSk7XG4gICAgICBpZiAod29ya2VyKSB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCB3b3JrZXJzKTtcbiAgICAgIGxvZ2dlci5pbmZvKGAke3dvcmtlcnMubGVuZ3RofS8ke1dPUktFUlNfUEVSX1RPS0VOfSB3b3JrZXJzIHNwYXduZWQgZm9yICR7dG9rZW5OYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMuZHJhaW5RdWV1ZSgpO1xuXG4gICAgd29ya2VyLnNldFNlcnZlclJlcXVlc3RIYW5kbGVyKGFzeW5jIChtZXRob2QpID0+IHtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHNlcnZlci1yZXF1ZXN0OiAke21ldGhvZH1gKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JrZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3Rva2VuTmFtZX1bJHt3b3JrZXJJbmRleH1dIChpZD0ke3Rva2VuSWQgKyAxfSlgKTtcbiAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciBzcGF3biBmYWlsZWQ6ICR7dG9rZW5OYW1lfVske3dvcmtlckluZGV4fV06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBkYXRhOiB1bmtub3duOyBjYWNoZWRBdDogbnVtYmVyIH0+KCk7XG4gIHN0YXRpYyByZWFkb25seSBSQVRFX0xJTUlUU19DQUNIRV9UVEwgPSA2MF8wMDA7XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0cyh0b2tlbk5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IHRva2VuTmFtZSA/PyBcIl9kZWZhdWx0XCI7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTCkge1xuICAgICAgcmV0dXJuIGNhY2hlZC5kYXRhO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGNvbnN0IHdvcmtlciA9IHRva2VuTmFtZSA/IGFsbFdvcmtlcnMuZmluZCgodykgPT4gdy50b2tlbk5hbWUgPT09IHRva2VuTmFtZSkgOiBhbGxXb3JrZXJzWzBdO1xuICAgIGlmICghd29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJubyByZWFkeSBvcGVuYWkgd29ya2Vyc1wiKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgd29ya2VyLmdldFJhdGVMaW1pdHMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5zZXQoY2FjaGVLZXksIHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCkgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQXFCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsb0JBQW9CLENBQUM7QUFFeEQsTUFBTSxpQkFBaUI7QUFFdkIsTUFBTSxvQkFBb0IsS0FBSyxJQUM3QixPQUFPLFFBQVEsSUFBSSwyQkFBMkIsRUFBRSxFQUZwQixFQUk3QjtBQUNELE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sb0JBQW9CO0FBRzFCLE1BQU0sdUJBQXVCLFFBQVEsSUFBSSw4QkFBOEI7QUFFdkUsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx1QkFBdUI7QUFHN0IsU0FBUyxhQUFhLFNBQWlCLGFBQTZCO0FBQ2xFLFFBQU8sVUFBVSxLQUFLOztBQUd4QixTQUFTLE1BQU0sSUFBMkI7QUFDeEMsUUFBTyxJQUFJLFNBQVMsWUFBWSxXQUFXLFNBQVMsR0FBRyxDQUFDOztBQVUxRCxJQUFhLG1CQUFiLE1BQWEsaUJBQStDO0NBQzFELDZCQUFhLElBQUksS0FBcUM7Q0FDdEQsV0FBVztDQUNYLFFBQXFCLEVBQUU7Q0FFdkIsTUFBTSxRQUF1QjtFQUMzQixNQUFNLEVBQUUsU0FBUyxNQUFNLFdBQVcsU0FBUyxJQUFJO0VBQy9DLE1BQU0sZUFBZSxLQUFLLFFBQVEsTUFBTSxFQUFFLGFBQWEsU0FBUztBQUNoRSxTQUFPLEtBQ0wsWUFBWSxhQUFhLE9BQU8sa0JBQWtCLGtCQUFrQixnQkFDckU7QUFFRCxRQUFNLFFBQVEsV0FDWixhQUFhLElBQUksT0FBTyxNQUFNO0FBQzVCLFNBQU0sS0FBSyxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFpQztBQUN6RSxPQUFJLENBQUMsRUFBRSxPQUFRLE1BQUssbUJBQW1CLEVBQUUsR0FBRztJQUM1QyxDQUNIOztDQUdILE1BQU0sT0FBc0I7QUFDMUIsT0FBSyxnQkFBZ0Isc0JBQXNCO0VBQzNDLE1BQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxXQUFXLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sRUFBRSxNQUFNLENBQUM7QUFDdkUsUUFBTSxRQUFRLFdBQVcsTUFBTTtBQUMvQixPQUFLLFdBQVcsT0FBTzs7Q0FLekIsTUFBTSxhQUFhLElBQVksTUFBYyxhQUErQztBQUMxRixNQUFJLEtBQUssV0FBVyxJQUFJLEdBQUcsQ0FBRTtBQUM3QixRQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sWUFBWTs7Q0FHaEQsTUFBTSxlQUFlLElBQTJCO0VBQzlDLE1BQU0sVUFBVSxLQUFLLFdBQVcsSUFBSSxHQUFHLElBQUksRUFBRTtBQUM3QyxPQUFLLFdBQVcsT0FBTyxHQUFHO0FBQzFCLFFBQU0sUUFBUSxXQUFXLFFBQVEsS0FBSyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEQsTUFBSSxLQUFLLDBCQUEwQixDQUFDLFdBQVcsRUFDN0MsTUFBSyxnQkFBZ0Isb0JBQW9CO0FBRTNDLE1BQUksUUFBUSxTQUFTLEVBQUcsUUFBTyxLQUFLLDZCQUE2QixHQUFHLElBQUksUUFBUSxTQUFTOztDQUczRixNQUFNLGVBQWUsSUFBWSxNQUFjLGFBQStDO0VBQzVGLE1BQU0sV0FBVyxLQUFLLFdBQVcsSUFBSSxHQUFHLElBQUksRUFBRTtBQUM5QyxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLFNBQU0sS0FBSyxhQUFhLElBQUksTUFBTSxZQUFZO0FBQzlDOztBQUdGLE1BQUksU0FBUyxPQUFPLE1BQU0sRUFBRSxpQkFBaUIsTUFBTSxZQUFZLENBQUMsRUFBRTtBQUNoRSxZQUFTLFNBQVMsTUFBTSxFQUFFLGlCQUFpQixNQUFNLFlBQVksQ0FBQztBQUM5RCxVQUFPLEtBQUssc0NBQXNDLEdBQUcsSUFBSSxLQUFLLEdBQUc7QUFDakUsUUFBSyxZQUFZO0FBQ2pCOztBQUdGLE9BQUssV0FBVyxPQUFPLEdBQUc7QUFDMUIsUUFBTSxRQUFRLFdBQVcsU0FBUyxLQUFLLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN2RCxRQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sWUFBWTs7Q0FHaEQsbUJBQW1CLElBQWtCO0FBQ25DLEdBQUMsS0FBSyxXQUFXLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxTQUFTLE1BQU07QUFDN0MsS0FBRSxTQUFTO0lBQ1g7QUFDRixNQUFJLEtBQUssMEJBQTBCLENBQUMsV0FBVyxFQUM3QyxNQUFLLGdCQUFnQixvQkFBb0I7QUFFM0MsU0FBTyxLQUFLLDhCQUE4QixLQUFLOztDQUdqRCxpQkFBaUIsSUFBa0I7QUFDakMsR0FBQyxLQUFLLFdBQVcsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLFNBQVMsTUFBTTtBQUM3QyxLQUFFLFNBQVM7SUFDWDtBQUNGLE9BQUssWUFBWTtBQUNqQixTQUFPLEtBQUssNEJBQTRCLEtBQUs7O0NBSy9DLE1BQU0sU0FBUyxLQUErQztFQUU1RCxNQUFNLGNBQWMsTUFBTSxLQUFLLG1CQUFtQixJQUFJO0FBQ3RELE1BQUksYUFBYTtBQUNmLFVBQU8sS0FDTCxLQUFLLFlBQVksVUFBVSxHQUFHLFlBQVksUUFBUSxtQkFBbUIsSUFBSSxNQUFNLEdBQ2hGO0FBQ0QsVUFBTyxLQUFLLGtCQUFrQixjQUFjLE1BQzFDLEtBQUssWUFBWSxHQUFHLEtBQUssSUFBSSxNQUFPLFNBQVMsQ0FDOUM7O0VBR0gsTUFBTSxTQUFTLEtBQUssbUJBQW1CO0FBQ3ZDLE1BQUksUUFBUTtBQUNWLFVBQU8sS0FBSyxLQUFLLE9BQU8sVUFBVSxHQUFHLE9BQU8sUUFBUSxZQUFZLElBQUksTUFBTSxHQUFHO0FBQzdFLFVBQU8sS0FBSyxrQkFBa0IsU0FBUyxNQUFNLEtBQUssWUFBWSxHQUFHLElBQUksQ0FBQzs7QUFFeEUsU0FBTyxLQUFLLFNBQVMsTUFBTTtBQUN6QixVQUFPLEtBQUssS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFLFFBQVEsWUFBWSxJQUFJLE1BQU0sV0FBVztBQUMzRSxVQUFPLEtBQUssWUFBWSxHQUFHLElBQUk7SUFDL0I7O0NBR0osTUFBTSxlQUFlLEtBQXNCLElBQTRDO0VBQ3JGLE1BQU0sY0FBYyxNQUFNLEtBQUssbUJBQW1CLElBQUk7QUFDdEQsTUFBSSxhQUFhO0FBQ2YsVUFBTyxLQUFLLEtBQUssWUFBWSxVQUFVLEdBQUcsWUFBWSxRQUFRLDRCQUE0QjtBQUMxRixVQUFPLEtBQUssa0JBQWtCLGNBQWMsTUFDMUMsS0FBSyxrQkFBa0IsR0FBRyxLQUFLLElBQUksSUFBSSxNQUFPLFNBQVMsQ0FDeEQ7O0VBR0gsTUFBTSxTQUFTLEtBQUssbUJBQW1CO0FBQ3ZDLE1BQUksUUFBUTtBQUNWLFVBQU8sS0FBSyxLQUFLLE9BQU8sVUFBVSxHQUFHLE9BQU8sUUFBUSxZQUFZLElBQUksTUFBTSxhQUFhO0FBQ3ZGLFVBQU8sS0FBSyxrQkFBa0IsU0FBUyxNQUFNLEtBQUssa0JBQWtCLEdBQUcsS0FBSyxHQUFHLENBQUM7O0FBRWxGLFNBQU8sS0FBSyxTQUFTLE1BQU07QUFDekIsVUFBTyxLQUFLLEtBQUssRUFBRSxVQUFVLEdBQUcsRUFBRSxRQUFRLFlBQVksSUFBSSxNQUFNLHFCQUFxQjtBQUNyRixVQUFPLEtBQUssa0JBQWtCLEdBQUcsS0FBSyxHQUFHO0lBQ3pDOztDQU1KLE1BQU0sbUJBQW1CLEtBQTREO0FBQ25GLE1BQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLE1BQU8sUUFBTztFQUNoRCxNQUFNLEVBQUUsVUFBVSxVQUFVLFVBQVUsSUFBSTtFQUUxQyxNQUFNLFNBQVMsS0FBSyxlQUFlLFNBQVM7QUFDNUMsTUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLE9BQVEsUUFBTztBQUN6RCxNQUFJLE9BQU8sVUFBVSxNQUFPLFFBQU87QUFDbkMsTUFBSSxDQUFDLE9BQU8sVUFBVSxTQUFTLENBQUUsUUFBTztFQUV4QyxNQUFNLFdBQVcsS0FBSyxLQUFLLEdBQUc7QUFDOUIsV0FBUztBQUVQLE9BQUksT0FBTyxVQUFVLFNBQVMsQ0FBQyxPQUFPLFVBQVUsU0FBUyxDQUFFLFFBQU87QUFDbEUsT0FBSSxPQUFPLGdCQUFnQixDQUFFLFFBQU87QUFDcEMsT0FBSSxLQUFLLEtBQUssSUFBSSxTQUFVLFFBQU87QUFDbkMsU0FBTSxNQUFNLHFCQUFxQjs7O0NBSXJDLGVBQWUsVUFBK0M7QUFDNUQsT0FBSyxNQUFNLFdBQVcsS0FBSyxXQUFXLFFBQVEsQ0FDNUMsTUFBSyxNQUFNLEtBQUssUUFDZCxLQUFJLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxLQUFLLFNBQVUsUUFBTztBQUdwRSxTQUFPOztDQUdULE1BQU0sb0JBQW9CLFVBQWtCLFFBQStCO0VBQ3pFLE1BQU0sYUFBYSxDQUFDLEdBQUcsS0FBSyxXQUFXLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLE1BQU0sRUFBRSxRQUFRO0FBQ2hGLFFBQU0sUUFBUSxXQUFXLFdBQVcsS0FBSyxNQUFNLEVBQUUsY0FBYyxVQUFVLE9BQU8sQ0FBQyxDQUFDOztDQU1wRixvQkFBaUQ7RUFDL0MsTUFBTSxhQUFhLEtBQUssMEJBQTBCO0FBQ2xELE1BQUksV0FBVyxXQUFXLEVBQUcsUUFBTztBQUNwQyxPQUFLLElBQUksSUFBSSxHQUFHLElBQUksV0FBVyxRQUFRLEtBQUs7R0FDMUMsTUFBTSxJQUFJLFlBQVksS0FBSyxXQUFXLEtBQUssV0FBVztBQUN0RCxPQUFJLEVBQUUsZ0JBQWdCLEVBQUU7QUFDdEIsU0FBSyxZQUFZLEtBQUssV0FBVyxJQUFJLEtBQUssV0FBVztBQUNyRCxXQUFPOzs7QUFHWCxTQUFPOztDQUdULDJCQUFtRDtBQUNqRCxTQUFPLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPOztDQUtsRixRQUFXLFNBQW1FO0FBQzVFLE1BQUksS0FBSywwQkFBMEIsQ0FBQyxXQUFXLEVBQzdDLFFBQU8sUUFBUSx1QkFBTyxJQUFJLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsTUFBSSxLQUFLLE1BQU0sVUFBVSxlQUN2QixRQUFPLFFBQVEsdUJBQU8sSUFBSSxNQUFNLGNBQWMsQ0FBQztBQUdqRCxTQUFPLElBQUksU0FBWSxTQUFTLFdBQVc7R0FDekMsTUFBTSxPQUFrQjtJQUN0QixVQUFVLFdBQVc7QUFDbkIsa0JBQWEsS0FBSyxNQUFNO0FBQ3hCLFVBQUssZ0JBQWdCO0FBQ3JCLGFBQVEsU0FBUyxDQUNkLFdBQVcsS0FBSyxrQkFBa0IsUUFBUSxRQUFRLENBQUMsQ0FDbkQsS0FBSyxTQUFTLE9BQU87O0lBRTFCLFNBQVMsUUFBUTtBQUNmLGtCQUFhLEtBQUssTUFBTTtBQUN4QixVQUFLLGdCQUFnQjtBQUNyQixZQUFPLElBQUk7O0lBRWIsT0FBTyxpQkFBaUI7QUFDdEIsVUFBSyxnQkFBZ0IsS0FBSztBQUMxQiw0QkFBTyxJQUFJLE1BQU0sY0FBYyxDQUFDO09BQy9CLGlCQUFpQjtJQUNyQjtBQUVELFFBQUssTUFBTSxLQUFLLEtBQUs7SUFDckI7O0NBR0osZ0JBQWdCLE1BQXVCO0FBQ3JDLGVBQWEsS0FBSyxNQUFNO0FBQ3hCLE9BQUssZ0JBQWdCO0VBQ3JCLE1BQU0sTUFBTSxLQUFLLE1BQU0sUUFBUSxLQUFLO0FBQ3BDLE1BQUksUUFBUSxHQUFJLE1BQUssTUFBTSxPQUFPLEtBQUssRUFBRTs7Q0FHM0MsZ0JBQWdCLFFBQXNCO0VBQ3BDLE1BQU0sTUFBTSxJQUFJLE1BQU0sT0FBTztBQUM3QixPQUFLLE1BQU0sU0FBUyxTQUFTO0FBQzNCLGdCQUFhLEtBQUssTUFBTTtBQUN4QixRQUFLLGdCQUFnQjtBQUNyQixRQUFLLE9BQU8sSUFBSTtJQUNoQjtBQUNGLE9BQUssUUFBUSxFQUFFOztDQUdqQixXQUFXLGdCQUE2QztBQUN0RCxNQUNFLGtCQUNBLEtBQUssTUFBTSxTQUFTLEtBQ3BCLGVBQWUsV0FDZixlQUFlLFVBQ2YsZUFBZSxnQkFBZ0IsRUFDL0I7QUFFQSxHQURhLEtBQUssTUFBTSxPQUFPLENBQzFCLFFBQVEsZUFBZTtBQUM1Qjs7QUFHRixTQUFPLEtBQUssTUFBTSxTQUFTLEdBQUc7R0FDNUIsTUFBTSxTQUFTLEtBQUssbUJBQW1CO0FBQ3ZDLE9BQUksQ0FBQyxPQUFRO0FBRWIsR0FEYSxLQUFLLE1BQU0sT0FBTyxDQUMxQixRQUFRLE9BQU87OztDQU14QixNQUFNLGtCQUNKLFFBQ0EsU0FDWTtBQUNaLE1BQUk7QUFDRixVQUFPLE1BQU0sUUFBUSxPQUFPO1lBQ3BCO0FBQ1IsVUFBTyxhQUFhO0FBQ3BCLFFBQUssV0FBVyxPQUFPOzs7Q0FNM0IsaUJBQXlCLEtBQXNCLGVBQXFDO0VBQ2xGLE1BQU0sVUFBVSxrQkFBa0I7QUFDbEMsU0FBTztHQUNMLE9BQU8sV0FBVyxJQUFJLGFBQWEsSUFBSSxhQUFhLElBQUk7R0FDeEQsU0FBUyxVQUFVLFNBQVksSUFBSTtHQUNuQyx1QkFBdUIsSUFBSTtHQUMzQixjQUFjLElBQUk7R0FDbEIsUUFBUSxJQUFJLFVBQVU7R0FDdEIsT0FBTyxJQUFJO0dBQ1gsV0FBVyxJQUFJO0dBQ2Ysa0JBQWtCLElBQUk7R0FDdEIsYUFBYSxJQUFJO0dBQ2xCOztDQUdILE1BQU0sWUFDSixRQUNBLEtBQ0EsZUFDeUI7RUFDekIsTUFBTSxVQUFVLEtBQUssaUJBQWlCLEtBQUssY0FBYztFQUN6RCxNQUFNLFNBQVMsTUFBTSxPQUFPLFlBQVksU0FBUyxjQUFjO0FBQy9ELFNBQU87R0FDTCxNQUFNLE9BQU87R0FDYixXQUFXLE9BQU87R0FDbEIsT0FBTyxPQUFPO0dBQ2QsWUFBWSxPQUFPO0dBQ25CLE9BQU8sT0FBTztHQUNkLGFBQWE7SUFDWCxVQUFVLGFBQWEsT0FBTyxTQUFTLE9BQU8sWUFBWTtJQUMxRCxVQUFVLE9BQU87SUFDakIsT0FBTyxPQUFPO0lBQ2Y7R0FDRjs7Q0FHSCxNQUFNLGtCQUNKLFFBQ0EsS0FDQSxJQUNBLGVBQ2U7RUFDZixNQUFNLFVBQVUsS0FBSyxpQkFBaUIsS0FBSyxjQUFjO0VBR3pELElBQUksbUJBQW1CLGlCQUFpQjtFQUN4QyxNQUFNLFlBQTZCO0dBQ2pDLEdBQUc7R0FDSCxhQUFhLGFBQWE7QUFDeEIsdUJBQW1CO0FBQ25CLE9BQUcsYUFBYSxTQUFTOztHQUUzQixhQUFhLFdBQVc7QUFDdEIsT0FBRyxXQUFXO0tBQ1osR0FBRztLQUNILFdBQVcsT0FBTztLQUNsQixhQUFhO01BQ1gsVUFBVSxhQUFhLE9BQU8sU0FBUyxPQUFPLFlBQVk7TUFDMUQsVUFBVTtNQUNWLE9BQU8sT0FBTztNQUNmO0tBQ0YsQ0FBQzs7R0FFTDtBQUNELFFBQU0sT0FBTyxrQkFBa0IsU0FBUyxXQUFXLGNBQWM7O0NBS25FLE1BQU0sYUFDSixTQUNBLFdBQ0EsYUFDZTtFQUNmLE1BQU0sVUFBa0MsRUFBRTtBQUMxQyxPQUFLLElBQUksSUFBSSxHQUFHLElBQUksbUJBQW1CLEtBQUs7QUFDMUMsT0FBSSxJQUFJLEVBQUcsT0FBTSxNQUFNLGtCQUFrQjtHQUN6QyxNQUFNLFNBQVMsTUFBTSxLQUFLLGtCQUFrQixTQUFTLFdBQVcsYUFBYSxFQUFFO0FBQy9FLE9BQUksT0FBUSxTQUFRLEtBQUssT0FBTzs7QUFFbEMsTUFBSSxRQUFRLFNBQVMsR0FBRztBQUN0QixRQUFLLFdBQVcsSUFBSSxTQUFTLFFBQVE7QUFDckMsVUFBTyxLQUFLLEdBQUcsUUFBUSxPQUFPLEdBQUcsa0JBQWtCLHVCQUF1QixZQUFZOzs7Q0FJMUYsTUFBTSxrQkFDSixTQUNBLFdBQ0EsYUFDQSxhQUNzQztFQUN0QyxNQUFNLFNBQVMsSUFBSSxxQkFBcUI7R0FDdEM7R0FDQTtHQUNBLGFBQWEsWUFBWTtHQUN6QixXQUFXLFlBQVk7R0FDdkIsVUFBVSxZQUFZO0dBQ3RCO0dBQ0QsQ0FBQztBQUVGLFNBQU8sZ0JBQWdCLEtBQUssWUFBWTtBQUV4QyxTQUFPLHdCQUF3QixPQUFPLFdBQVc7QUFDL0MsT0FBSSxXQUFXLG9DQUNiLFFBQU8sK0JBQStCLFFBQVE7QUFFaEQsU0FBTSxJQUFJLE1BQU0sNkJBQTZCLFNBQVM7SUFDdEQ7QUFFRixNQUFJO0FBQ0YsU0FBTSxPQUFPLFlBQVk7QUFDekIsVUFBTyxLQUFLLG1CQUFtQixVQUFVLEdBQUcsWUFBWSxRQUFRLFVBQVUsRUFBRSxHQUFHO0FBQy9FLFVBQU87V0FDQSxHQUFHO0FBQ1YsVUFBTyxLQUFLLHdCQUF3QixVQUFVLEdBQUcsWUFBWSxLQUFNLEVBQVksVUFBVTtBQUN6RixTQUFNLE9BQU8sTUFBTSxDQUFDLFlBQVksR0FBRztBQUNuQyxVQUFPOzs7Q0FNWCxrQ0FBa0IsSUFBSSxLQUFrRDtDQUN4RSxPQUFnQix3QkFBd0I7Q0FFeEMsTUFBTSxjQUFjLFdBQXNDO0VBQ3hELE1BQU0sV0FBVyxhQUFhO0VBQzlCLE1BQU0sU0FBUyxLQUFLLGdCQUFnQixJQUFJLFNBQVM7QUFDakQsTUFBSSxVQUFVLEtBQUssS0FBSyxHQUFHLE9BQU8sV0FBVyxpQkFBaUIsc0JBQzVELFFBQU8sT0FBTztFQUdoQixNQUFNLGFBQWEsQ0FBQyxHQUFHLEtBQUssV0FBVyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxNQUFNLEVBQUUsUUFBUTtFQUNoRixNQUFNLFNBQVMsWUFBWSxXQUFXLE1BQU0sTUFBTSxFQUFFLGNBQWMsVUFBVSxHQUFHLFdBQVc7QUFDMUYsTUFBSSxDQUFDLE9BQVEsT0FBTSxJQUFJLE1BQU0sMEJBQTBCO0VBQ3ZELE1BQU0sT0FBTyxNQUFNLE9BQU8sZUFBZTtBQUN6QyxPQUFLLGdCQUFnQixJQUFJLFVBQVU7R0FBRTtHQUFNLFVBQVUsS0FBSyxLQUFLO0dBQUUsQ0FBQztBQUNsRSxTQUFPOztDQUtULGVBSVc7Q0FFWCxNQUFNLGtCQUFrQixNQUE0QztBQUNsRSxNQUFJLEtBQUssY0FBYztBQUNyQixRQUFLLGFBQWEsT0FBTyxNQUFNLENBQUMsWUFBWSxHQUFHO0FBQy9DLGdCQUFhLEtBQUssYUFBYSxNQUFNO0FBQ3JDLFFBQUssZUFBZTs7RUFJdEIsTUFBTSxTQUFTLElBQUkscUJBQXFCO0dBQ3RDLFNBRmEsS0FBSyxLQUFLO0dBR3ZCLFdBQVc7R0FDWCxhQUFhO0dBQ2IsV0FBVztHQUNaLENBQUM7RUFFRixNQUFNLFVBQVUsTUFBTSxPQUFPLG1CQUFtQjtBQVVoRCxPQUFLLGVBQWU7R0FBRTtHQUFRO0dBQU0sT0FSdEIsaUJBQWlCO0FBQzdCLFFBQUksS0FBSyxjQUFjLFdBQVcsUUFBUTtBQUN4QyxZQUFPLEtBQUssNkJBQTZCLEtBQUssa0JBQWtCO0FBQ2hFLFlBQU8sTUFBTSxDQUFDLFlBQVksR0FBRztBQUM3QixVQUFLLGVBQWU7O01BRXJCLElBQVE7R0FFZ0M7QUFDM0MsU0FBTyxFQUFFLFNBQVM7O0NBR3BCLElBQUksbUJBQWtDO0FBQ3BDLFNBQU8sS0FBSyxjQUFjLFFBQVE7O0NBR3BDLE1BQU0sdUJBS0g7QUFDRCxNQUFJLENBQUMsS0FBSyxhQUFjLE9BQU0sSUFBSSxNQUFNLG1CQUFtQjtFQUMzRCxNQUFNLEVBQUUsUUFBUSxVQUFVLEtBQUs7QUFFL0IsTUFBSTtBQUNGLFNBQU0sT0FBTyw2QkFBNkI7R0FDMUMsTUFBTSxRQUFRLE1BQU0sT0FBTyx3QkFBd0I7QUFDbkQsT0FBSSxDQUFDLE1BQU8sT0FBTSxJQUFJLE1BQU0seUNBQXlDO0FBQ3JFLFVBQU87WUFDQztBQUNSLGdCQUFhLE1BQU07QUFDbkIsUUFBSyxlQUFlO0FBQ3BCLFNBQU0sT0FBTyxNQUFNLENBQUMsWUFBWSxHQUFHOzs7Q0FNdkMsSUFBSSxjQUFzQjtBQUN4QixTQUFPLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDOztDQUc5QyxJQUFJLG1CQUEyQjtBQUM3QixTQUFPLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsTUFBTSxFQUFFLFFBQVEsQ0FBQzs7Q0FHdkUsSUFBSSxjQUFzQjtBQUN4QixTQUFPLEtBQUssTUFBTSJ9
386
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBDb2RleEFwcFNlcnZlcldvcmtlciwgdHlwZSBTdHJlYW1DYWxsYmFja3MsIHR5cGUgVHVyblJlcXVlc3QgfSBmcm9tIFwiLi9jb2RleC13b3JrZXJcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCB9IGZyb20gXCIuL29wZW5haS1yZWZyZXNoXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9wZW5haS1kaXNwYXRjaGVyXCJdKTtcblxuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImxvd1wiO1xuY29uc3QgTUFYX1dPUktFUlNfUEVSX1RPS0VOID0gNTtcbmNvbnN0IFdPUktFUlNfUEVSX1RPS0VOID0gTWF0aC5taW4oXG4gIE51bWJlcihwcm9jZXNzLmVudi5RR1JJRF9XT1JLRVJTX1BFUl9UT0tFTiA/PyAzKSxcbiAgTUFYX1dPUktFUlNfUEVSX1RPS0VOLFxuKTtcbmNvbnN0IFFVRVVFX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5jb25zdCBNQVhfUVVFVUVfU0laRSA9IDUwO1xuY29uc3QgU1BBV05fSU5URVJWQUxfTVMgPSA1MDA7XG5cbi8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlIOqzoOyglSkuIOuBhOuptCDquLDsobQgXCLrp6QgdHVybiDsg4ggdGhyZWFkICsgaGlzdG9yeSBpbmplY3RcIiDrj5nsnpEuXG5jb25zdCBUSFJFQURfUkVVU0VfRU5BQkxFRCA9IHByb2Nlc3MuZW52LlFHUklEX09QRU5BSV9USFJFQURfUkVVU0UgIT09IFwiZmFsc2VcIjtcbi8vIOyijO2RnCB3b3JrZXIg6rCAIGJ1c3kg7J28IOuVjCBmcmVlIOulvCDquLDri6TrpqzripQg7LWc64yAIOyLnOqwhC4g7LSI6rO8IOyLnCDsg4ggdGhyZWFkIOuhnCDtj7TrsLEuXG5jb25zdCBSRVVTRV9XT1JLRVJfV0FJVF9NUyA9IDVfMDAwO1xuY29uc3QgUkVVU0VfV09SS0VSX1BPTExfTVMgPSA1MDtcblxuLy8gd29ya2VySWQg7ZWp7ISxOiB0b2tlbklkIOyZgCB3b3JrZXJJbmRleCgwLi40KSDrpbwg7ZWY64KY7J2YIOyViOyglSDsiKvsnpDroZwg7J247L2U65SpLlxuZnVuY3Rpb24gbWFrZVdvcmtlcklkKHRva2VuSWQ6IG51bWJlciwgd29ya2VySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0b2tlbklkICogMTAgKyB3b3JrZXJJbmRleDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxudHlwZSBRdWV1ZUl0ZW0gPSB7XG4gIHJlc29sdmU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgYWJvcnRDbGVhbnVwPzogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgd29ya2VyUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBDb2RleEFwcFNlcnZlcldvcmtlcltdPigpO1xuICByckN1cnNvciA9IDA7XG4gIHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHtXT1JLRVJTX1BFUl9UT0tFTn0gd29ya2VycyBlYWNoKWAsXG4gICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIG9wZW5haVRva2Vucy5tYXAoYXN5bmMgKHQpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnModC5pZCwgdC5uYW1lLCB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzKTtcbiAgICAgICAgaWYgKCF0LmFjdGl2ZSkgdGhpcy5vblRva2VuRGVhY3RpdmF0ZWQodC5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIkRJU1BBVENIRVJfU0hVVERPV05cIik7XG4gICAgY29uc3Qga2lsbHMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkubWFwKCh3KSA9PiB3LmtpbGwoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGtpbGxzKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUb2tlbiBldmVudHMgKGZyb20gVG9rZW5TdWJzY3JpYmVyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBvblRva2VuQWRkZWQoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhpZCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHdvcmtlcnMubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQ6ICR7bGFiZWx9ICgke3dvcmtlcnMubGVuZ3RofSlgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnMoaWQsIG5hbWUsIGNyZWRlbnRpYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmcuZXZlcnkoKHcpID0+IHcuY2FuUmV1c2VGb3JUb2tlbihuYW1lLCBjcmVkZW50aWFscykpKSB7XG4gICAgICBleGlzdGluZy5mb3JFYWNoKCh3KSA9PiB3LnVwZGF0ZVRva2VuU3RhdGUobmFtZSwgY3JlZGVudGlhbHMpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHVwZGF0ZWQgaW4tcGxhY2U6ICR7bmFtZX1gKTtcbiAgICAgIHRoaXMuZHJhaW5RdWV1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMud29ya2VyUG9vbC5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChleGlzdGluZy5tYXAoKHcpID0+IHcua2lsbCgpKSk7XG4gICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnMoaWQsIG5hbWUsIGNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIG9uVG9rZW5EZWFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIk5PX0FDVElWRV9XT1JLRVJTXCIpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbCA9IHRva2VuTmFtZSA/PyBgdG9rZW4gJHtpZH1gO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIGRlYWN0aXZhdGVkOiAke2xhYmVsfWApO1xuICB9XG5cbiAgb25Ub2tlbkFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmRyYWluUXVldWUoKTtcbiAgICBjb25zdCBsYWJlbCA9IHRva2VuTmFtZSA/PyBgdG9rZW4gJHtpZH1gO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIGFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoKTtcbiAgICBpZiAod29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7d29ya2VyLnRva2VuTmFtZX1bJHt3b3JrZXIudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9KWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2Uod29ya2VyLCAodykgPT4gdGhpcy5leGVjdXRlVHVybih3LCByZXEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBxdWV1ZWQpYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlVHVybih3LCByZXEpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGVTdHJlYW0ocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJldXNlV29ya2VyID0gYXdhaXQgdGhpcy5hY3F1aXJlUmV1c2VXb3JrZXIocmVxKTtcbiAgICBpZiAocmV1c2VXb3JrZXIpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihrsgJHtyZXVzZVdvcmtlci50b2tlbk5hbWV9WyR7cmV1c2VXb3JrZXIudG9rZW5JZH1dIChyZXVzZSB0aHJlYWQsIFtzdHJlYW1dKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IsIHJlcS5yZXVzZSEudGhyZWFkSWQpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKCk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFJFVVNFX1dPUktFUl9XQUlUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIHJlc3RhcnQoZXBvY2gg67OA6rK9KSAvIHRocmVhZCDshozrqbjsnbQg64yA6riwIOykkeyXkCDrsJzsg53tlZjrqbQg7Y+067CxLlxuICAgICAgaWYgKHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHwgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkgcmV0dXJuIHdvcmtlcjtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSByZXR1cm4gbnVsbDtcbiAgICAgIGF3YWl0IHNsZWVwKFJFVVNFX1dPUktFUl9QT0xMX01TKTtcbiAgICB9XG4gIH1cblxuICBmaW5kV29ya2VyQnlJZCh3b3JrZXJJZDogbnVtYmVyKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHdvcmtlcnMgb2YgdGhpcy53b3JrZXJQb29sLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IHcgb2Ygd29ya2Vycykge1xuICAgICAgICBpZiAobWFrZVdvcmtlcklkKHcudG9rZW5JZCwgdy53b3JrZXJJbmRleCkgPT09IHdvcmtlcklkKSByZXR1cm4gdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsV29ya2VycyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGFsbFdvcmtlcnMubWFwKCh3KSA9PiB3LmludGVycnVwdFR1cm4odGhyZWFkSWQsIHR1cm5JZCkpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXb3JrZXIgc2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyAg6riw67O4IHJvdW5kLXJvYmluXG4gIC8vIFRPRE86IOy2lO2bhCDri6Trpbgg7JWM6rOg66as7KaY7Jy866GcIOuzgOqyvSDqsIDriqXtlZjqsowg7KeA7JuQXG4gIGFjcXVpcmVJZGxlV29ya2VyKCk6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgY29uc3QgYWxsV29ya2VycyA9IHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk7XG4gICAgaWYgKGFsbFdvcmtlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFdvcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHcgPSBhbGxXb3JrZXJzWyh0aGlzLnJyQ3Vyc29yICsgaSkgJSBhbGxXb3JrZXJzLmxlbmd0aF0hO1xuICAgICAgaWYgKHcudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLnJyQ3Vyc29yID0gKHRoaXMucnJDdXJzb3IgKyBpICsgMSkgJSBhbGxXb3JrZXJzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGVucXVldWU8VD4oZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAodGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJOT19PUEVOQUlfV09SS0VSU1wiKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+PSBNQVhfUVVFVUVfU0laRSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaXRlbTogUXVldWVJdGVtID0ge1xuICAgICAgICByZXNvbHZlOiAod29ya2VyKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsIGV4ZWN1dGUpKVxuICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVqZWN0OiAoZXJyKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGltZXI6IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVF1ZXVlKGl0ZW0pO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJTRVJWRVJfQlVTWVwiKSk7XG4gICAgICAgIH0sIFFVRVVFX1RJTUVPVVRfTVMpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRnJvbVF1ZXVlKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5xdWV1ZS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggIT09IC0xKSB0aGlzLnF1ZXVlLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgcmVqZWN0QWxsUXVldWVkKHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICBpdGVtLnJlamVjdChlcnIpO1xuICAgIH0pO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGRyYWluUXVldWUocmVsZWFzZWRXb3JrZXI/OiBDb2RleEFwcFNlcnZlcldvcmtlcik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHJlbGVhc2VkV29ya2VyICYmXG4gICAgICB0aGlzLnF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgIHJlbGVhc2VkV29ya2VyLmlzUmVhZHkgJiZcbiAgICAgIHJlbGVhc2VkV29ya2VyLmFjdGl2ZSAmJlxuICAgICAgcmVsZWFzZWRXb3JrZXIudHJ5QWNxdWlyZVR1cm4oKVxuICAgICkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWUuc2hpZnQoKSE7XG4gICAgICBuZXh0LnJlc29sdmUocmVsZWFzZWRXb3JrZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoKTtcbiAgICAgIGlmICghd29ya2VyKSBicmVhaztcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgbmV4dC5yZXNvbHZlKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBleGVjdXRlQW5kUmVsZWFzZTxUPihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIGV4ZWN1dGU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGUod29ya2VyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd29ya2VyLnJlbGVhc2VUdXJuKCk7XG4gICAgICB0aGlzLmRyYWluUXVldWUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXVzZVRocmVhZElkIOqwgCDsnojsnLzrqbQg6riw7KG0IHRocmVhZCDsl5AgZGVsdGEocmV1c2VJbnB1dCnrp4wsIOyXhuycvOuptCDsg4ggdGhyZWFkIOyXkCDsoITssrRcbiAgLy8gcHJvbXB0KGNvbGRJbnB1dCkgKyBoaXN0b3J5IGluamVjdC4gcmV1c2Ug6rCAIGRpc3BhdGNoZXIg64uo7JeQ7IScIO2PtOuwseuQmOuptCDtm4TsnpDroZwg65ao7Ja07KeE64ukLlxuICBwcml2YXRlIGJ1aWxkVHVyblJlcXVlc3QocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcpOiBUdXJuUmVxdWVzdCB7XG4gICAgY29uc3QgcmV1c2luZyA9IHJldXNlVGhyZWFkSWQgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHJldXNpbmcgJiYgcmVxLnJldXNlSW5wdXQgPyByZXEucmV1c2VJbnB1dCA6IHJlcS5jb2xkSW5wdXQsXG4gICAgICBoaXN0b3J5OiByZXVzaW5nID8gdW5kZWZpbmVkIDogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgb3V0cHV0U2NoZW1hOiByZXEub3V0cHV0U2NoZW1hLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgICAgbW9kZWw6IHJlcS5tb2RlbCxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgY29uc3QgdHVyblJlcSA9IHRoaXMuYnVpbGRUdXJuUmVxdWVzdChyZXEsIHJldXNlVGhyZWFkSWQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmtlci5leGVjdXRlVHVybih0dXJuUmVxLCByZXVzZVRocmVhZElkKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICB1c2FnZTogcmVzdWx0LnVzYWdlLFxuICAgICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgd29ya2VySWQ6IG1ha2VXb3JrZXJJZCh3b3JrZXIudG9rZW5JZCwgd29ya2VyLndvcmtlckluZGV4KSxcbiAgICAgICAgdGhyZWFkSWQ6IHJlc3VsdC50aHJlYWRJZCxcbiAgICAgICAgZXBvY2g6IHdvcmtlci5lcG9jaCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVTdHJlYW1UdXJuKFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgY2I6IEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHR1cm5SZXEgPSB0aGlzLmJ1aWxkVHVyblJlcXVlc3QocmVxLCByZXVzZVRocmVhZElkKTtcbiAgICAvLyB3b3JrZXIg7J2YIFR1cm5SZXN1bHQg7JeQIHRva2VuTmFtZS90aHJlYWRDb29yZCDrpbwg67aZ7JesIOyDgeychChHZW5lcmF0ZVJlc3VsdCnroZwg7Jis66aw64ukLlxuICAgIC8vIHRocmVhZElkIOuKlCDsg4ggdGhyZWFkIOuptCBvblRocmVhZElkIOuhnCDtmZXsoJXrkJjrr4DroZwg66+466asIOuztOq0gO2VtCDrkZDqs6Agb25Db21wbGV0ZSDrlYwg7J2964qU64ukLlxuICAgIGxldCByZXNvbHZlZFRocmVhZElkID0gcmV1c2VUaHJlYWRJZCA/PyBcIlwiO1xuICAgIGNvbnN0IHdyYXBwZWRDYjogU3RyZWFtQ2FsbGJhY2tzID0ge1xuICAgICAgLi4uY2IsXG4gICAgICBvblRocmVhZElkOiAodGhyZWFkSWQpID0+IHtcbiAgICAgICAgcmVzb2x2ZWRUaHJlYWRJZCA9IHRocmVhZElkO1xuICAgICAgICBjYi5vblRocmVhZElkPy4odGhyZWFkSWQpO1xuICAgICAgfSxcbiAgICAgIG9uQ29tcGxldGU6IChyZXN1bHQpID0+IHtcbiAgICAgICAgY2Iub25Db21wbGV0ZSh7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSxcbiAgICAgICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICAgICAgd29ya2VySWQ6IG1ha2VXb3JrZXJJZCh3b3JrZXIudG9rZW5JZCwgd29ya2VyLndvcmtlckluZGV4KSxcbiAgICAgICAgICAgIHRocmVhZElkOiByZXNvbHZlZFRocmVhZElkLFxuICAgICAgICAgICAgZXBvY2g6IHdvcmtlci5lcG9jaCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhd2FpdCB3b3JrZXIuZXhlY3V0ZVR1cm5TdHJlYW0odHVyblJlcSwgd3JhcHBlZENiLCByZXVzZVRocmVhZElkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTcGF3biDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBzcGF3bldvcmtlcnMoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgV09SS0VSU19QRVJfVE9LRU47IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSBhd2FpdCBzbGVlcChTUEFXTl9JTlRFUlZBTF9NUyk7XG4gICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLnNwYXduU2luZ2xlV29ya2VyKHRva2VuSWQsIHRva2VuTmFtZSwgY3JlZGVudGlhbHMsIGkpO1xuICAgICAgaWYgKHdvcmtlcikgd29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgfVxuICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIHRoaXMud29ya2VyUG9vbC5zZXQodG9rZW5JZCwgd29ya2Vycyk7XG4gIH1cblxuICBhc3luYyBzcGF3blNpbmdsZVdvcmtlcihcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHdvcmtlckluZGV4OiBudW1iZXIsXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQsXG4gICAgICB0b2tlbk5hbWUsXG4gICAgICBhY2Nlc3NUb2tlbjogY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sXG4gICAgICBhY2NvdW50SWQ6IGNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICAgIHBsYW5UeXBlOiBjcmVkZW50aWFscy5wbGFuVHlwZSxcbiAgICAgIHdvcmtlckluZGV4LFxuICAgIH0pO1xuXG4gICAgd29ya2VyLm9uUmVhZHkgPSAoKSA9PiB0aGlzLmRyYWluUXVldWUoKTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHJhdGVMaW1pdHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IGRhdGE6IHVua25vd247IGNhY2hlZEF0OiBudW1iZXIgfT4oKTtcbiAgc3RhdGljIHJlYWRvbmx5IFJBVEVfTElNSVRTX0NBQ0hFX1RUTCA9IDYwXzAwMDtcblxuICBhc3luYyBnZXRSYXRlTGltaXRzKHRva2VuTmFtZT86IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gdG9rZW5OYW1lID8/IFwiX2RlZmF1bHRcIjtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJhdGVMaW1pdHNDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC5jYWNoZWRBdCA8IE9wZW5BSURpc3BhdGNoZXIuUkFURV9MSU1JVFNfQ0FDSEVfVFRMKSB7XG4gICAgICByZXR1cm4gY2FjaGVkLmRhdGE7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsV29ya2VycyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSk7XG4gICAgY29uc3Qgd29ya2VyID0gdG9rZW5OYW1lID8gYWxsV29ya2Vycy5maW5kKCh3KSA9PiB3LnRva2VuTmFtZSA9PT0gdG9rZW5OYW1lKSA6IGFsbFdvcmtlcnNbMF07XG4gICAgaWYgKCF3b3JrZXIpIHRocm93IG5ldyBFcnJvcihcIm5vIHJlYWR5IG9wZW5haSB3b3JrZXJzXCIpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB3b3JrZXIuZ2V0UmF0ZUxpbWl0cygpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldChjYWNoZUtleSwgeyBkYXRhLCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBCcm93c2VyIGxvZ2luIGZsb3cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGVuZGluZ0xvZ2luOiB7XG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgc3RhcnRCcm93c2VyTG9naW4obmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IGF1dGhVcmw6IHN0cmluZyB9PiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0xvZ2luKSB7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbi53b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdMb2dpbi50aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcElkID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZDogdGVtcElkLFxuICAgICAgdG9rZW5OYW1lOiBuYW1lLFxuICAgICAgYWNjZXNzVG9rZW46IFwiXCIsXG4gICAgICBhY2NvdW50SWQ6IFwiXCIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBhdXRoVXJsID0gYXdhaXQgd29ya2VyLnN0YXJ0QnJvd3NlckxvZ2luKCk7XG5cbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0xvZ2luPy53b3JrZXIgPT09IHdvcmtlcikge1xuICAgICAgICBsb2dnZXIud2FybihgYnJvd3NlciBsb2dpbiB0aW1lb3V0IGZvciAke25hbWV9LCBraWxsaW5nIHdvcmtlcmApO1xuICAgICAgICB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgICAgfVxuICAgIH0sIDMwMF8wMDApO1xuXG4gICAgdGhpcy5wZW5kaW5nTG9naW4gPSB7IHdvcmtlciwgbmFtZSwgdGltZXIgfTtcbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBnZXQgcGVuZGluZ0xvZ2luTmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nTG9naW4/Lm5hbWUgPz8gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGNvbXBsZXRlQnJvd3NlckxvZ2luKCk6IFByb21pc2U8e1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgaWRUb2tlbj86IHN0cmluZztcbiAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGlmICghdGhpcy5wZW5kaW5nTG9naW4pIHRocm93IG5ldyBFcnJvcihcIm5vIHBlbmRpbmcgbG9naW5cIik7XG4gICAgY29uc3QgeyB3b3JrZXIsIHRpbWVyIH0gPSB0aGlzLnBlbmRpbmdMb2dpbjtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JrZXIud2FpdEZvckJyb3dzZXJMb2dpbkNvbXBsZXRlKCk7XG4gICAgICBjb25zdCBjcmVkcyA9IGF3YWl0IHdvcmtlci5yZWFkTWFuYWdlZENyZWRlbnRpYWxzKCk7XG4gICAgICBpZiAoIWNyZWRzKSB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gcmVhZCBjcmVkZW50aWFscyBhZnRlciBsb2dpblwiKTtcbiAgICAgIHJldHVybiBjcmVkcztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXQgd29ya2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gWy4uLnRoaXMud29ya2VyUG9vbC52YWx1ZXMoKV0uZmxhdCgpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCByZWFkeVdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHF1ZXVlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUubGVuZ3RoO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxvQkFBb0IsQ0FBQztBQUV4RCxNQUFNLGlCQUFpQjtBQUV2QixNQUFNLG9CQUFvQixLQUFLLElBQzdCLE9BQU8sUUFBUSxJQUFJLDJCQUEyQixFQUFFLEVBRnBCLEVBSTdCO0FBQ0QsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxvQkFBb0I7QUFHMUIsTUFBTSx1QkFBdUIsUUFBUSxJQUFJLDhCQUE4QjtBQUV2RSxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLHVCQUF1QjtBQUc3QixTQUFTLGFBQWEsU0FBaUIsYUFBNkI7QUFDbEUsUUFBTyxVQUFVLEtBQUs7O0FBR3hCLFNBQVMsTUFBTSxJQUEyQjtBQUN4QyxRQUFPLElBQUksU0FBUyxZQUFZLFdBQVcsU0FBUyxHQUFHLENBQUM7O0FBVTFELElBQWEsbUJBQWIsTUFBYSxpQkFBK0M7Q0FDMUQsNkJBQWEsSUFBSSxLQUFxQztDQUN0RCxXQUFXO0NBQ1gsUUFBcUIsRUFBRTtDQUV2QixNQUFNLFFBQXVCO0VBQzNCLE1BQU0sRUFBRSxTQUFTLE1BQU0sV0FB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