sonamu 0.7.35 → 0.7.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@ import { createMockSSEFactory, DB, isDaemonServer } from "../index.js";
9
9
  import { applyCacheHeaders, CachePresets } from "../cache-control/cache-control.js";
10
10
  import { toFastifyCompressOption } from "../compress/compress.js";
11
11
  import { Naite } from "../naite/naite.js";
12
- import { exists } from "../utils/fs-utils.js";
12
+ import { exists, fileExists } from "../utils/fs-utils.js";
13
13
  import { getSecrets } from "./secret.js";
14
14
  class SonamuClass {
15
15
  isInitialized = false;
@@ -523,7 +523,7 @@ class SonamuClass {
523
523
  }
524
524
  // 정적 파일이 존재할 경우, 정적 파일을 먼저 서빙해야함
525
525
  const filePath = path.join(webDistPath, request.url);
526
- if (await exists(filePath)) {
526
+ if (await fileExists(filePath)) {
527
527
  const content = await fs.readFile(filePath);
528
528
  return reply.type(mimeLookup(filePath) || "application/octet-stream").send(content);
529
529
  }
@@ -937,4 +937,4 @@ class SonamuClass {
937
937
  }
938
938
  export const Sonamu = new SonamuClass();
939
939
 
940
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB0eXBlIHsgRmFzdGlmeUluc3RhbmNlLCBGYXN0aWZ5UmVwbHksIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB0eXBlIHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXIsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSBcImh0dHBcIjtcbmltcG9ydCB7IGxvb2t1cCBhcyBtaW1lTG9va3VwIH0gZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5LCBEQiwgaXNEYWVtb25TZXJ2ZXIgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVDb25maWcsIENhY2hlTWFuYWdlciB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHsgYXBwbHlDYWNoZUhlYWRlcnMsIENhY2hlUHJlc2V0cyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVDb250cm9sQ29uZmlnLCBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIH0gZnJvbSBcIi4uL2NvbXByZXNzL2NvbXByZXNzXCI7XG5pbXBvcnQgdHlwZSB7IENvbXByZXNzT3B0aW9ucyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vZGljdC90eXBlc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU3luY2VyIH0gZnJvbSBcIi4uL3N5bmNlci9zeW5jZXJcIjtcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUNvbmZpZywgU29uYW11U2VydmVyT3B0aW9ucywgU29uYW11VGFza09wdGlvbnMgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQXV0aENvbnRleHQsIENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB7XG4gICAgaWYgKHRoaXMuX3dvcmtmbG93cyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWUoY2hhbGsuY3lhbihgU29uYW11LmluaXQke2ZvclRlc3RpbmcgPyBcIiBmb3IgdGVzdGluZ1wiIDogXCJcIn1gKSk7XG4gICAgfVxuXG4gICAgLy8gQVBJIOujqO2KuCDtjKjsiqRcbiAgICBjb25zdCB7IGZpbmRBcGlSb290UGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvdXRpbHNcIik7XG4gICAgdGhpcy5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoID8/IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7ISk7KCV7J2EIOuhnOuUqe2VmOuKlCDqsoPrtoDthLAg7Iuc7J6RXG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMuY2xpZW50ID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuXG4gICAgLy8g66Gc6rmFIOyEpOyglVxuICAgIGNvbnN0IHsgY29uZmlndXJlTG9nVGFwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbG9nZ2VyL2NvbmZpZ3VyZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyZUxvZ1RhcGUoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2dnaW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gREIg66Gc65OcXG4gICAgY29uc3QgeyBEQiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZGJcIik7XG4gICAgdGhpcy5kYkNvbmZpZyA9IERCLmdlbmVyYXRlREJDb25maWcodGhpcy5jb25maWcuZGF0YWJhc2UpO1xuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJEQiBDb25maWcgTG9hZGVkIVwiKSk7XG4gICAgfVxuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIC8vIO2FjOyKpO2KuOyXkOyEnOuPhCBFbnRpdHkg7KCV67O064qUIO2VhOyalO2VqeuLiOuLpC5cbiAgICAvLyB1cHNlcnTqsIAg7KCc64yA66GcIOyekeuPme2VmOugpOuptCBlbnRpdHnsnZggdW5pcXVlIGluZGV4IOygleuztOqwgCDtlYTsmpTtlZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gQ2FjaGUg7LSI6riw7ZmUXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ2FjaGUodGhpcy5jb25maWcuc2VydmVyLmNhY2hlLCBmb3JUZXN0aW5nKTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXMgLyBXb3JrZmxvd3MgLyBUZW1wbGF0ZXMgLyBTU1IgUm91dGVzXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBjb25zdCB7IFRlbXBsYXRlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVtcGxhdGVcIik7XG4gICAgYXdhaXQgVGVtcGxhdGVNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRTU1JSb3V0ZXMoKTtcblxuICAgIGNvbnN0IHsgaXNMb2NhbCwgaXNUZXN0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rOyXkOyEnOuKlCDsvZTrk5wg7IOd7ISx7J2EIOychO2VtCBCaW9tZSDshYvsl4XsnbQg7ZWE7JqU7ZWoICjtmITsnqwgYXBpUm9vdFBhdGgg7KCE64us7ZWY7JesIOyLpO2WiSlcbiAgICAgIChhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9mb3JtYXR0ZXJcIikpLnNldHVwQmlvbWUodGhpcy5hcGlSb290UGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpc0hvdFJlbG9hZFNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpICYmICFpc1Rlc3QoKSAmJiBpc0hvdFJlbG9hZFNlcnZlcigpICYmIGVuYWJsZVN5bmMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmMoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZUVuZChjaGFsay5jeWFuKFwiU29uYW11LmluaXRcIikpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlcnZlcihpbml0T3B0aW9ucz86IHsgZW5hYmxlU3luYz86IGJvb2xlYW47IGRvU2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChpbml0T3B0aW9ucz8uZG9TaWxlbnQsIGluaXRPcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IHsgZGVmYXVsdDogZmFzdGlmeSB9ID0gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCB7IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAbG9ndGFwZS9mYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHNlcnZlciA9IGZhc3RpZnkoe1xuICAgICAgLi4ub3B0aW9ucy5mYXN0aWZ5LFxuICAgICAgbG9nZ2VyOlxuICAgICAgICB0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZVxuICAgICAgICAgID8gZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jb25maWcubG9nZ2luZz8uZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgaWYgKCFvcHRpb25zLnBsdWdpbnM/LnNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCByZXF1aXJlcyBzZXNzaW9uIHBsdWdpbi4gUGxlYXNlIGFkZCBwbHVnaW5zLnNlc3Npb24gY29uZmlndXJhdGlvbi5cIik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8g66Gc7LusL+2UhOuhnOuNleyFmCDtmZjqsr0g67aE6riwXG4gICAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbih0aGlzLmFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgICBjb25zdCBoYXNXZWIgPSBhd2FpdCBleGlzdHMod2ViUGF0aCk7XG5cbiAgICAvLyDsoITsl60gY29tcHJlc3Mg7Ji17IWYIOqzhOyCsCAocm91dGUuY29tcHJlc3M6IHRydWXsnbwg65WMIOyCrOyaqSlcbiAgICBjb25zdCBwbHVnaW5Db21wcmVzcyA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5jb21wcmVzcztcbiAgICBjb25zdCBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHBsdWdpbkNvbXByZXNzXG4gICAgICA/IHBsdWdpbkNvbXByZXNzID09PSB0cnVlXG4gICAgICAgID8geyB0aHJlc2hvbGQ6IDEwMjQsIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdGhyZXNob2xkOiBwbHVnaW5Db21wcmVzcy50aHJlc2hvbGQsXG4gICAgICAgICAgICBlbmNvZGluZ3M6IHBsdWdpbkNvbXByZXNzLmVuY29kaW5ncyxcbiAgICAgICAgICAgIGN1c3RvbVR5cGVzOiBwbHVnaW5Db21wcmVzcy5jdXN0b21UeXBlcyxcbiAgICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rCDqsJzrsJwg7ZmY6rK9OiBWaXRlIERldiBTZXJ2ZXIgKyDthrXtlakg7ZW465Ok65+sXG4gICAgICBpZiAoaGFzV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBWaXRlRGV2U2VydmVyKHNlcnZlciwgd2ViUGF0aCwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9OiDqsJzrs4QgQVBJIOudvOyasO2KuCArIOygleyggSDtjIzsnbwg7ISc67mZXG4gICAgICBmb3IgKGNvbnN0IGFwaSBvZiB0aGlzLnN5bmNlci5hcGlzKSB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcsIGdsb2JhbENvbXByZXNzT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBWaXRlRGV2U2VydmVyIO2DgOyeheydhCDrj5nsoIHsnLzroZwg66Gc65Oc7ZW07JW8IO2VqFxuICBwcml2YXRlIHZpdGVTZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFZpdGVEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICB3ZWJQYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIGdsb2JhbENvbXByZXNzT3B0aW9ucz86IENvbXByZXNzT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcblxuICAgIHRoaXMudml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKHtcbiAgICAgIHJvb3Q6IHdlYlBhdGgsXG4gICAgICBzZXJ2ZXI6IHtcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6IHRydWUsXG4gICAgICAgIGhtcjoge1xuICAgICAgICAgIHNlcnZlcjogc2VydmVyLnNlcnZlcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gVml0ZSBtaWRkbGV3YXJlIOuTseuhnSAoVml0ZSDsl5DshYsg7LKY66asKVxuICAgIHNlcnZlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAvLyBBUEnsmYAgU29uYW11IFVJ64qUIEZhc3RpZnkg65287Jqw7Yq46rCAIOyymOumrO2VmOuPhOuhnSBza2lwXG4gICAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSB8fCByZXEudXJsPy5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgLy8g64KY66i47KeA64qUIFZpdGUgbWlkZGxld2FyZeuhnCDsoITri6xcbiAgICAgIHJldHVybiB0aGlzLnZpdGVTZXJ2ZXIubWlkZGxld2FyZXMocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgLy8gQVBJIOuPmeyggSDrnbzsmrDtjIUgKGNhdGNoLWFsbCDsoITsl5Ag65Ox66GdKVxuICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKGFwaS5vcHRpb25zLmNvbXByZXNzLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBjb25zdCB7IGdldFNTUlJvdXRlcywgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnLCB0aGlzLnZpdGVTZXJ2ZXIpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENTUiBmYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIvKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlIGFzIEVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgIHJldHVybiAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIOyEnOuyhCDsooXro4wg7IucIFZpdGXrj4Qg7KKF66OMXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMudml0ZVNlcnZlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHVwU3RhdGljV2ViU2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgX3dlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOqyveuhnCDrqoXtmZXtmZQ6IGFwaS9wdWJsaWMvd2ViLCBhcGkvZGlzdC9zc3JcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInB1YmxpY1wiLCBcIndlYlwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiKTtcbiAgICBjb25zdCBzc3JFbnRyeVBhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpO1xuICAgIGNvbnN0IHNzclJvdXRlc1BhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJyb3V0ZXMuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMod2ViRGlzdFBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgV2ViIGRpc3Qgbm90IGZvdW5kOiAke3dlYkRpc3RQYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiBlbnRyeSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgIGNvbnN0IHNzckF2YWlsYWJsZSA9IGF3YWl0IGV4aXN0cyhzc3JFbnRyeVBhdGgpO1xuXG4gICAgaWYgKCFzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiBlbnRyeSBub3QgZm91bmQ6ICR7c3NyRW50cnlQYXRofWApO1xuICAgICAgY29uc29sZS53YXJuKFwiICBTU1Igd2lsbCBiZSBkaXNhYmxlZC4gT25seSBDU1Igd2lsbCB3b3JrLlwiKTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOuhnOuTnCAocHJvZHVjdGlvbuyXkOyEnOunjCwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOydmCBzc3Ivcm91dGVzLnRzKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoc3NyUm91dGVzUGF0aCkpIHtcbiAgICAgICAgLy8gdHMtbG9hZGVy652866m0IFwiZmlsZTovL1wi66GcIOyLnOyeke2VmOuKlCBmdWxseS1yZXNvbHZlZCBwYXRo66eMIOuwm+q4sOyXkCDsnbTrpbwg7LKY66as7ZW07KO864qUIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZW07JW8IO2WiOqyoOyngOunjCxcbiAgICAgICAgLy8g7Jes6riw64qUIO2UhOuhnOuNleyFmCDtmZjqsr3sl5DshJwgbG9hZGVyIOyXhuydtCDrj4zslYTqsIDquLAg65WM66y47JeQIFwi7KeE7KecIGpzIO2MjOydvFwi7J2YIFwi6re464OlXCIg7KCI64yA6rK966Gc66W8IOuwlOuhnCBpbXBvcnTtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgICAvLyDsnbQg64K07Jqp7J2AIOydtCDtlajsiJgg64K07JeQ7IScIOyVhOuemOyXkCDrgpjsmKwg64uk66W4IGltcG9ydCDtmLjstpzsl5Drj4Qg64+Z7J287ZWY6rKMIOyggeyaqeuQqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgaW1wb3J0KHNzclJvdXRlc1BhdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKckyBTU1Igcm91dGVzIGxvYWRlZFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiByb3V0ZXMgbm90IGZvdW5kOiAke3NzclJvdXRlc1BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g66Gk66eBIOyXheuNsOydtO2KuCDrjIDsnZE6IGFzc2V0IGhhc2gg67aI7J287LmYIOyLnCDtmITsnqwg67KE7KCEIOyngeygkSDshJzruZlcbiAgICBzZXJ2ZXIuZ2V0KFwiL2Fzc2V0cy86ZmlsZW5hbWVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRGaWxlID0gKHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9KS5maWxlbmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJhc3NldHNcIik7XG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke3JlcXVlc3RlZEZpbGV9YDtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg6rKw7KCVXG4gICAgICBjb25zdCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCA9ICgpOiBDYWNoZUNvbnRyb2xDb25maWcgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFzc2V0c1wiLFxuICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgcGF0aDogYXNzZXRQYXRoLFxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOygleydmCDtlbjrk6Trn6wg7Jqw7ISgXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6riw67O46rCSOiBpbW11dGFibGVcbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICB9O1xuXG4gICAgICAvLyBpbmRleC0qLmpzIOuYkOuKlCBpbmRleC0qLmNzcyDsmpTssq3snbgg6rK97JqwXG4gICAgICBpZiAoL15pbmRleC1bYS1mMC05XStcXC4oanN8Y3NzKSQvLnRlc3QocmVxdWVzdGVkRmlsZSkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gcmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgcmVxdWVzdGVkRmlsZSk7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSByZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogZXh0ID09PSBcImNzc1wiID8gXCJ0ZXh0L2Nzc1wiIDogXCJcIik7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuY29kZSg0MDQpLnNlbmQoXCJOb3QgZm91bmRcIik7XG4gICAgfSk7XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICBjb25zdCB7IHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL3JlbmRlcmVyXCIpO1xuICAgICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24ocm91dGUuY29tcHJlc3MgPz8gdHJ1ZSwgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7cm91dGUucGF0aH1gKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcpO1xuXG4gICAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1NSIG9yIFN0YXRpYyBGaWxlIEZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIipcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAvYXBpLCAvc29uYW11LXVp64qUIDQwNCDqt7jrjIDroZxcbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpIHx8IHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgICAgcmVwbHkuY29kZSg0MDQpLnNlbmQoeyBlcnJvcjogXCJOb3QgRm91bmRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIHJlcXVlc3QudXJsKTtcbiAgICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXBseS50eXBlKG1pbWVMb29rdXAoZmlsZVBhdGgpIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpLnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1IgZmFsbGJhY2s6IGluZGV4Lmh0bWwg7ISc67mZXG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpO1xuICAgICAgICByZXR1cm4gcmVwbHkudHlwZShcInRleHQvaHRtbFwiKS5zZW5kKGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4UGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKckyBTdGF0aWMgd2ViIHNlcnZlciBjb25maWd1cmVkIHdpdGggJHtzc3JBdmFpbGFibGUgPyBcIlNTUlwiIDogXCJDU1Igb25seVwifSBzdXBwb3J0YCk7XG4gIH1cblxuICBjcmVhdGVBcGlIYW5kbGVyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIChhcGkub3B0aW9ucy5ndWFyZHMgPz8gW10pLmV2ZXJ5KChndWFyZCkgPT4gY29uZmlnLmd1YXJkSGFuZGxlcihndWFyZCwgcmVxdWVzdCwgYXBpKSk7XG5cbiAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXrs7TroZwgem9kIOyKpO2CpOuniCDruYzrk5xcbiAgICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgIGNvbnN0IHdoaWNoID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIiA/IFwicXVlcnlcIiA6IFwiYm9keVwiO1xuICAgICAgbGV0IHJlcUJvZHk6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgIH07XG4gICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgY29uc3QgeyBVcGxvYWRlZEZpbGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiKTtcbiAgICAgIGNvbnN0IHVwbG9hZGVkOiB7XG4gICAgICAgIGZpbGVzOiBJbnN0YW5jZVR5cGU8dHlwZW9mIFVwbG9hZGVkRmlsZT5bXTtcbiAgICAgIH0gPSB7XG4gICAgICAgIGZpbGVzOiBbXSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIFVwbG9hZGVkRmlsZT5bXSxcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSAocmVxdWVzdFt3aGljaF0gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICAvLyDsl4XroZzrk5wg7Ji17IWY7J20IOyeiOuKlCDqsr3smrAg7YyM7Yq466GcIOu2hOumrO2VmOyXrCBmaWxlIOuYkOuKlCBmaWVsZOuhnCDqtazrtoQg7LKY66asXG4gICAgICAgICAgLy8gZmlsZeydgCBVcGxvYWRlZEZpbGUg7J247Iqk7YS07Iqk66GcIOuzgO2ZmFxuICAgICAgICAgIC8vIGZpZWxk64qUIGJvZHnsl5Ag7LaU6rCAXG4gICAgICAgICAgY29uc3QgcGFydHMgPSByZXF1ZXN0LnBhcnRzKHtcbiAgICAgICAgICAgIGxpbWl0czogYXBpLnVwbG9hZE9wdGlvbnMubGltaXRzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRm9ybURhdGHsnZggZmllbGTrk6TsnYQg7J6E7Iuc66GcIOyggOyepVxuICAgICAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGUgPSBuZXcgVXBsb2FkZWRGaWxlKHBhcnQpO1xuICAgICAgICAgICAgICAvLyBDUklUSUNBTDog7YyM7J28IOyKpO2KuOumvOydhCDsponsi5wgY29uc3VtZe2VtOyVvCDri6TsnYwgcGFydOuhnCDrhJjslrTqsIgg7IiYIOyeiOydjFxuICAgICAgICAgICAgICAvLyDsnbQg7Zi47Lac7J20IOyXhuycvOuptCDsooXsooUgbXVsdGlwYXJ0IO2MjOyLseydtCBwZW5kaW5nIOyDge2DnOuhnCDtg4DsnoTslYTsm4Mg67Cc7IOdXG4gICAgICAgICAgICAgIGF3YWl0IHVwbG9hZGVkRmlsZS50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICB1cGxvYWRlZC5maWxlcy5wdXNoKHVwbG9hZGVkRmlsZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICBjb25zdCBxcyA9IGF3YWl0IGltcG9ydChcInFzXCIpO1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHFzLmRlZmF1bHQucGFyc2UoZmllbGRzKTtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgICByZXFCb2R5ID0gZmFzdGlmeUNhc3RlcihSZXFUeXBlKS5wYXJzZShib2R5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udGVudC1UeXBlXG4gICAgICByZXBseS50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICBjb25zdCBhcGlDYWNoZUNvbmZpZyA9IHRoaXMuZ2V0QXBpQ2FjaGVDb250cm9sKGFwaSwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgIGlmIChhcGlDYWNoZUNvbmZpZykge1xuICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb250ZXh0IOyDneyEsVxuICAgICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICBjb250ZXh0LmZpbGVzID0gdXBsb2FkZWQuZmlsZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIOuqqOuNuCDrqZTshozrk5wgYXJncyDsg53shLHtlZjsl6wg7Zi47LacXG4gICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXFCb2R5W3BhcmFtLm5hbWVdO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCBjb250ZXh0LCByZXBseSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVUkzsl5DshJwgcGF0aCBwYXJhbXPrpbwg7LaU7Lac7ZWp64uI64ukLlxuICAgKiDsmIg6IHBhdHRlcm49XCIvYWRtaW4vY29tcGFuaWVzLzpjb21wYW55SWRcIiwgdXJsPVwiL2FkbWluL2NvbXBhbmllcy8xMjNcIiDihpIgeyBjb21wYW55SWQ6IFwiMTIzXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0UGF0aFBhcmFtcyhwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdXJsLnNwbGl0KFwiP1wiKVswXS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwYXR0ZXJuUGFydHNbaV0uc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgcGFyYW1zW3BhdHRlcm5QYXJ0c1tpXS5zbGljZSgxKV0gPSB1cmxQYXJ0c1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBUEkg7J2R64u17JeQIOyggeyaqe2VoCBDYWNoZS1Db250cm9sIOyEpOygleydhCDqsrDsoJXtlanri4jri6QuXG4gICAqIOyasOyEoOyInOychDog6rCc67OEIOyngOyglSA+IGNhY2hlQ29udHJvbEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpQ2FjaGVDb250cm9sKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApIHtcbiAgICAvLyDrjbDsvZTroIjsnbTthLAg7ISk7KCVIOyasOyEoFxuICAgIGlmIChhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLy8g7KCE7JetIO2VuOuTpOufrFxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpXCIsXG4gICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIHBhdGg6IHJlcXVlc3Qucm91dGVPcHRpb25zPy51cmwgPz8gcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBhcGksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTU1LsmqkgQVBJIO2YuOy2nCAoSFRUUCDsmKTrsoTtl6Trk5wg7JeG7J20IOyngeygkSDtmLjstpwpXG4gICAqIGNyZWF0ZUFwaUhhbmRsZXLsnZgg66Gc7KeB7J2EIOyerOyCrOyaqe2VmOuQmCwgcmVxdWVzdCDtjIzsi7Eg64yA7IugIHBhcmFtcyDsp4HsoJEg7IKs7JqpXG4gICAqL1xuICBhc3luYyBpbnZva2VBcGlGb3JTU1IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFNTUuyXkOyEnCDri6TslpHtlZwg7YOA7J6F7J2YIHBhcmFtc+ulvCDrsJvslYTslbwg7ZWoXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gQ29udGV4dCDsg53shLEgKOq4sOyhtCDrqZTshozrk5wg7J6s7IKs7JqpKVxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQoY29uZmlnLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICBsZXQgcGFyYW1zSW5kZXggPSAwO1xuICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgfSk7XG5cbiAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCBjb250ZXh0LCByZXBseSk7XG4gIH1cblxuICBhc3luYyBpbnZva2VNb2RlbE1ldGhvZChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgICBjb250ZXh0OiBDb250ZXh0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdO1xuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBtb2RlbOydgCDrqqjrjbgg7J247Iqk7YS07Iqk7J2066+A66GcIOuplOyEnOuTnCDtmLjstpwg6rCA64qlXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICAgIG5haXRlU3RvcmU6IE5haXRlLmNyZWF0ZVN0b3JlKCksXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICB1c2VyOiByZXF1ZXN0LnVzZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhc3Nwb3J0OiB7XG4gICAgICAgICAgICAgIGxvZ2luOiByZXF1ZXN0LmxvZ2luLmJpbmQocmVxdWVzdCkgYXMgQXV0aENvbnRleHRbXCJwYXNzcG9ydFwiXVtcImxvZ2luXCJdLFxuICAgICAgICAgICAgICBsb2dvdXQ6IHJlcXVlc3QubG9nb3V0LmJpbmQocmVxdWVzdCkgYXMgQXV0aENvbnRleHRbXCJwYXNzcG9ydFwiXVtcImxvZ291dFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICApLFxuICAgICAgKSksXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy4gICAgXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSBhcyAoXCJiclwiIHwgXCJnemlwXCIgfCBcImRlZmxhdGVcIilbXSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwbHVnaW5zLmNvbXByZXNzID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4ucGx1Z2lucy5jb21wcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICAgIHNlc3Npb246IFwiQGZhc3RpZnkvc2VjdXJlLXNlc3Npb25cIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oa2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLCBwbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckF1dGgoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gICAgb3B0aW9uczogTm9uTnVsbGFibGU8U29uYW11U2VydmVyT3B0aW9uc1tcImF1dGhcIl0+LFxuICApIHtcbiAgICAvLyBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IGZhc3RpZnlQYXNzcG9ydCA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9wYXNzcG9ydFwiKSkuZGVmYXVsdDtcbiAgICBzZXJ2ZXIucmVnaXN0ZXIoZmFzdGlmeVBhc3Nwb3J0LmluaXRpYWxpemUoKSk7XG4gICAgc2VydmVyLnJlZ2lzdGVyKGZhc3RpZnlQYXNzcG9ydC5zZWN1cmVTZXNzaW9uKCkpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlclNlcmlhbGl6ZXIoYXN5bmMgKHVzZXIsIF9yZXF1ZXN0KSA9PiB1c2VyKTtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJEZXNlcmlhbGl6ZXIoYXN5bmMgKHNlcmlhbGl6ZWQsIF9yZXF1ZXN0KSA9PiBzZXJpYWxpemVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlclNlcmlhbGl6ZXIob3B0aW9ucy51c2VyU2VyaWFsaXplcik7XG4gICAgICBmYXN0aWZ5UGFzc3BvcnQucmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyKG9wdGlvbnMudXNlckRlc2VyaWFsaXplcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7J20IOyXhuycvOuptCDsupDsi5wg67mE7Zmc7ISx7ZmUXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZihudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsl5Ag65Sw6528IENhY2hlTWFuYWdlciDsg53shLFcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLl93b3JrZmxvd3MgPSBuZXcgV29ya2Zsb3dNYW5hZ2VyKERCLmdldERCQ29uZmlnKFwid1wiKSk7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlV29ya2VyID0gb3B0aW9ucy5lbmFibGVXb3JrZXIgPz8gaXNEYWVtb25TZXJ2ZXIoKTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbmN1cnJlbmN5OiBvcy5jcHVzKCkubGVuZ3RoIC0gMSxcbiAgICAgIHVzZVB1YlN1YjogdHJ1ZSxcbiAgICAgIGxpc3RlbkRlbGF5OiA1MDAsXG4gICAgfTtcblxuICAgIGlmIChlbmFibGVXb3JrZXIpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dzLnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLnN0YXJ0V29ya2VyKCk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLl93b3JrZmxvd3M/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2NhY2hlPy5kaXNjb25uZWN0KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICBsb2d0YXBlRGlzcG9zZSgpLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJkaXNwb3NlIiwibG9ndGFwZURpc3Bvc2UiLCJhc3NlcnQiLCJBc3luY0xvY2FsU3RvcmFnZSIsImZzIiwibG9va3VwIiwibWltZUxvb2t1cCIsIm9zIiwicGF0aCIsImNyZWF0ZU1vY2tTU0VGYWN0b3J5IiwiREIiLCJpc0RhZW1vblNlcnZlciIsImFwcGx5Q2FjaGVIZWFkZXJzIiwiQ2FjaGVQcmVzZXRzIiwidG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24iLCJOYWl0ZSIsImV4aXN0cyIsImdldFNlY3JldHMiLCJTb25hbXVDbGFzcyIsImlzSW5pdGlhbGl6ZWQiLCJhc3luY0xvY2FsU3RvcmFnZSIsImdldENvbnRleHQiLCJzdG9yZSIsImdldFN0b3JlIiwiY29udGV4dCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInJlcXVlc3QiLCJyZXBseSIsImhlYWRlcnMiLCJjcmVhdGVTU0UiLCJzY2hlbWEiLCJuYWl0ZVN0b3JlIiwiTWFwIiwiRXJyb3IiLCJfYXBpUm9vdFBhdGgiLCJhcGlSb290UGF0aCIsImFwcFJvb3RQYXRoIiwic3BsaXQiLCJzZXAiLCJzbGljZSIsImpvaW4iLCJfZGJDb25maWciLCJkYkNvbmZpZyIsIl9zeW5jZXIiLCJzeW5jZXIiLCJfY29uZmlnIiwiY29uZmlnIiwic2VjcmV0cyIsIl9zdG9yYWdlIiwic3RvcmFnZSIsIl9jYWNoZSIsImNhY2hlIiwiX3dvcmtmbG93cyIsIndvcmtmbG93cyIsIndhdGNoZXIiLCJwZW5kaW5nRmlsZXMiLCJobXJTdGFydFRpbWUiLCJzZXJ2ZXIiLCJpbml0Rm9yVGVzdGluZyIsImluaXQiLCJ1bmRlZmluZWQiLCJkb1NpbGVudCIsImVuYWJsZVN5bmMiLCJmb3JUZXN0aW5nIiwiY2hhbGsiLCJkZWZhdWx0IiwiY29uc29sZSIsInRpbWUiLCJjeWFuIiwiZmluZEFwaVJvb3RQYXRoIiwibG9hZENvbmZpZyIsImRhdGFiYXNlIiwiZGVmYXVsdE9wdGlvbnMiLCJjbGllbnQiLCJjb25maWd1cmVMb2dUYXBlIiwibG9nZ2luZyIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsImluaXRpYWxpemVDYWNoZSIsImluaXRpYWxpemVXb3JrZmxvd3MiLCJ0YXNrcyIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiVGVtcGxhdGVNYW5hZ2VyIiwiYXV0b2xvYWRTU1JSb3V0ZXMiLCJpc0xvY2FsIiwiaXNUZXN0Iiwic2V0dXBCaW9tZSIsImlzSG90UmVsb2FkU2VydmVyIiwic3luYyIsInN0YXJ0V2F0Y2hlciIsInRpbWVFbmQiLCJjcmVhdGVTZXJ2ZXIiLCJpbml0T3B0aW9ucyIsIm9wdGlvbnMiLCJmYXN0aWZ5IiwiZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIiLCJsb2dnZXIiLCJjYXRlZ29yeSIsImZhc3RpZnlDYXRlZ29yeSIsIlN0b3JhZ2VNYW5hZ2VyIiwicGx1Z2lucyIsInJlZ2lzdGVyUGx1Z2lucyIsImF1dGgiLCJzZXNzaW9uIiwicmVnaXN0ZXJBdXRoIiwid2l0aEZhc3RpZnkiLCJhcGlDb25maWciLCJib290IiwidGltZXpvbmUiLCJhcGkiLCJmb3JtYXRJblRpbWVab25lIiwiSVNPX0RBVEVfUkVHRVgiLCJEQVRFX0ZPUk1BVCIsInNldFJlcGx5U2VyaWFsaXplciIsInBheWxvYWQiLCJKU09OIiwic3RyaW5naWZ5IiwiX2tleSIsInZhbHVlIiwidGVzdCIsIkRhdGUiLCJnZXQiLCJyb3V0ZSIsInByZWZpeCIsIl9yZXF1ZXN0IiwiX3JlcGx5IiwiYXBpcyIsInNvbmFtdVVJQXBpUGx1Z2luIiwicmVnaXN0ZXIiLCJ3ZWJQYXRoIiwiaGFzV2ViIiwicGx1Z2luQ29tcHJlc3MiLCJjb21wcmVzcyIsImdsb2JhbENvbXByZXNzT3B0aW9ucyIsInRocmVzaG9sZCIsImVuY29kaW5ncyIsImN1c3RvbVR5cGVzIiwic2V0dXBWaXRlRGV2U2VydmVyIiwibW9kZWxzIiwibW9kZWxOYW1lIiwibWV0aG9kIiwiaHR0cE1ldGhvZCIsInVybCIsImhhbmRsZXIiLCJjcmVhdGVBcGlIYW5kbGVyIiwic2V0dXBTdGF0aWNXZWJTZXJ2ZXIiLCJ2aXRlU2VydmVyIiwidml0ZSIsInJvb3QiLCJtaWRkbGV3YXJlTW9kZSIsImhtciIsImFwcFR5cGUiLCJ1c2UiLCJyZXEiLCJyZXMiLCJuZXh0Iiwic3RhcnRzV2l0aCIsIm1pZGRsZXdhcmVzIiwiZ2V0U1NSUm91dGVzIiwicmVuZGVyU1NSIiwic3NyUm91dGVzIiwicGFyYW1zIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJodG1sIiwidHlwZSIsInRlbXBsYXRlIiwicmVhZEZpbGUiLCJ0cmFuc2Zvcm1JbmRleEh0bWwiLCJlIiwic3NyRml4U3RhY2t0cmFjZSIsImVycm9yIiwic3RhdHVzIiwibWVzc2FnZSIsImFkZEhvb2siLCJjbG9zZSIsIl93ZWJQYXRoIiwid2ViRGlzdFBhdGgiLCJzc3JQYXRoIiwic3NyRW50cnlQYXRoIiwic3NyUm91dGVzUGF0aCIsIndhcm4iLCJzc3JBdmFpbGFibGUiLCJyZXF1ZXN0ZWRGaWxlIiwiZmlsZW5hbWUiLCJhc3NldHNEaXIiLCJhc3NldFBhdGgiLCJnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCIsImNhY2hlUmVxIiwiY2FjaGVDb250cm9sSGFuZGxlciIsInJlc3VsdCIsImltbXV0YWJsZSIsImV4dCIsInBvcCIsImZpbGVzIiwicmVhZGRpciIsImN1cnJlbnRGaWxlIiwiZmluZCIsImYiLCJlbmRzV2l0aCIsImZpbGVQYXRoIiwiY29udGVudCIsInNlbmQiLCJpbmNsdWRlcyIsImNvZGUiLCJjc3JDYWNoZVJlcSIsImNzckNhY2hlQ29uZmlnIiwiaW5kZXhQYXRoIiwiZ3VhcmRzIiwiZXZlcnkiLCJndWFyZCIsImd1YXJkSGFuZGxlciIsImdldFpvZE9iamVjdEZyb21BcGkiLCJSZXFUeXBlIiwidHlwZXMiLCJ3aGljaCIsInJlcUJvZHkiLCJVcGxvYWRlZEZpbGUiLCJ1cGxvYWRlZCIsImJvZHkiLCJ1cGxvYWRPcHRpb25zIiwicGFydHMiLCJsaW1pdHMiLCJmaWVsZHMiLCJwYXJ0IiwidXBsb2FkZWRGaWxlIiwidG9CdWZmZXIiLCJwdXNoIiwiZmllbGRuYW1lIiwiU3RyaW5nIiwicXMiLCJwYXJzZWQiLCJwYXJzZSIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RpZnlDYXN0ZXIiLCJab2RFcnJvciIsImh1bWFuaXplWm9kRXJyb3IiLCJtZXNzYWdlcyIsIm1hcCIsImlzc3VlIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsInpvZEVycm9yIiwiY29udGVudFR5cGUiLCJhcGlDYWNoZUNvbmZpZyIsImdldEFwaUNhY2hlQ29udHJvbCIsImNyZWF0ZUNvbnRleHQiLCJBcGlQYXJhbVR5cGUiLCJhcmdzIiwicGFyYW1ldGVycyIsInBhcmFtIiwiaXNDb250ZXh0IiwibmFtZSIsImludm9rZU1vZGVsTWV0aG9kIiwicGF0dGVybiIsInBhdHRlcm5QYXJ0cyIsImZpbHRlciIsIkJvb2xlYW4iLCJ1cmxQYXJ0cyIsImkiLCJsZW5ndGgiLCJjYWNoZUNvbnRyb2wiLCJyb3V0ZU9wdGlvbnMiLCJpbnZva2VBcGlGb3JTU1IiLCJwYXJhbXNJbmRleCIsIm1vZGVsIiwicnVuIiwibWV0aG9kTmFtZSIsImFwcGx5IiwiY3JlYXRlU1NFRmFjdG9yeSIsIl9ldmVudHMiLCJzb2NrZXQiLCJiaW5kIiwibG9jYWxlIiwiZGV0ZWN0TG9jYWxlIiwiaTE4biIsInN1cHBvcnRlZExvY2FsZXMiLCJkZWZhdWx0TG9jYWxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb250ZXh0UHJvdmlkZXIiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJwYXNzcG9ydCIsImxvZ2luIiwibG9nb3V0IiwiYWNjZXB0TGFuZ3VhZ2UiLCJzdXBwb3J0ZWQiLCJsYW5ncyIsImxhbmciLCJ0cmltIiwid2F0Y2hQYXRoIiwiY2hva2lkYXIiLCJ3YXRjaCIsImlnbm9yZWQiLCJzdGF0cyIsImlzRmlsZSIsInBlcnNpc3RlbnQiLCJpZ25vcmVJbml0aWFsIiwib24iLCJldmVudCIsImFic29sdXRlUGF0aCIsImlzQ29uZmlnVHMiLCJyZWxhdGl2ZVBhdGgiLCJyZXBsYWNlIiwiYm9sZCIsImJsdWUiLCJraWxsIiwicGlkIiwiaGFuZGxlRmlsZUNoYW5nZSIsInJ1blNjcmlwdCIsImZuIiwiZGVzdHJveSIsImNvbXByZXNzUGx1Z2luIiwicGx1Z2luc01vZHVsZXMiLCJjb3JzIiwiZm9ybWJvZHkiLCJtdWx0aXBhcnQiLCJzc2UiLCJzdGF0aWMiLCJyZWdpc3RlclBsdWdpbiIsImtleSIsInBsdWdpbk5hbWUiLCJvcHRpb24iLCJlbnRyaWVzIiwiY3VzdG9tIiwiZmFzdGlmeVBhc3Nwb3J0IiwiaW5pdGlhbGl6ZSIsInNlY3VyZVNlc3Npb24iLCJyZWdpc3RlclVzZXJTZXJpYWxpemVyIiwicmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyIiwic2VyaWFsaXplZCIsInVzZXJTZXJpYWxpemVyIiwidXNlckRlc2VyaWFsaXplciIsInNldENhY2hlTWFuYWdlclJlZiIsImNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIiLCJjcmVhdGVDYWNoZU1hbmFnZXIiLCJXb3JrZmxvd01hbmFnZXIiLCJnZXREQkNvbmZpZyIsImVuYWJsZVdvcmtlciIsImRlZmF1bHRXb3JrZXJPcHRpb25zIiwiY29uY3VycmVuY3kiLCJjcHVzIiwidXNlUHViU3ViIiwibGlzdGVuRGVsYXkiLCJzZXR1cFdvcmtlciIsIndvcmtlck9wdGlvbnMiLCJwb3J0IiwibGlzdGVuIiwiaG9zdCIsImxpZmVjeWNsZSIsIm9uU2h1dGRvd24iLCJzaHV0ZG93biIsImV4aXQiLCJlcnIiLCJvbkVycm9yIiwic2V0RXJyb3JIYW5kbGVyIiwidGhlbiIsInN0YXJ0V29ya2VyIiwib25TdGFydCIsImNhdGNoIiwicmVkIiwibm93IiwicmVsYXRpdmUiLCJzeW5jRnJvbVdhdGNoZXIiLCJmaW5pc2hITVIiLCJyZW5ld0NoZWNrc3VtcyIsImVuZFRpbWUiLCJ0b3RhbFRpbWUiLCJjZW50ZXJUZXh0IiwiYWxsIiwibXNnIiwid2hpdGUiLCJibGFjayIsImJnR3JlZW4iLCJCYXNlTW9kZWwiLCJhbGxTZXR0bGVkIiwiZGlzY29ubmVjdCIsIlNvbmFtdSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBV0MsY0FBYyxRQUFRLG1CQUFtQjtBQUM3RCxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUdoRCxPQUFPQyxRQUFRLG1CQUFjO0FBRTdCLFNBQVNDLFVBQVVDLFVBQVUsUUFBUSxhQUFhO0FBQ2xELE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFFeEIsU0FBU0Msb0JBQW9CLEVBQUVDLEVBQUUsRUFBRUMsY0FBYyxRQUFRLGNBQUs7QUFFOUQsU0FBU0MsaUJBQWlCLEVB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
940
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB0eXBlIHsgRmFzdGlmeUluc3RhbmNlLCBGYXN0aWZ5UmVwbHksIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB0eXBlIHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXIsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSBcImh0dHBcIjtcbmltcG9ydCB7IGxvb2t1cCBhcyBtaW1lTG9va3VwIH0gZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5LCBEQiwgaXNEYWVtb25TZXJ2ZXIgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVDb25maWcsIENhY2hlTWFuYWdlciB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHsgYXBwbHlDYWNoZUhlYWRlcnMsIENhY2hlUHJlc2V0cyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVDb250cm9sQ29uZmlnLCBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIH0gZnJvbSBcIi4uL2NvbXByZXNzL2NvbXByZXNzXCI7XG5pbXBvcnQgdHlwZSB7IENvbXByZXNzT3B0aW9ucyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vZGljdC90eXBlc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU3luY2VyIH0gZnJvbSBcIi4uL3N5bmNlci9zeW5jZXJcIjtcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZXhpc3RzLCBmaWxlRXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUNvbmZpZywgU29uYW11U2VydmVyT3B0aW9ucywgU29uYW11VGFza09wdGlvbnMgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQXV0aENvbnRleHQsIENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB7XG4gICAgaWYgKHRoaXMuX3dvcmtmbG93cyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWUoY2hhbGsuY3lhbihgU29uYW11LmluaXQke2ZvclRlc3RpbmcgPyBcIiBmb3IgdGVzdGluZ1wiIDogXCJcIn1gKSk7XG4gICAgfVxuXG4gICAgLy8gQVBJIOujqO2KuCDtjKjsiqRcbiAgICBjb25zdCB7IGZpbmRBcGlSb290UGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvdXRpbHNcIik7XG4gICAgdGhpcy5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoID8/IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7ISk7KCV7J2EIOuhnOuUqe2VmOuKlCDqsoPrtoDthLAg7Iuc7J6RXG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMuY2xpZW50ID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuXG4gICAgLy8g66Gc6rmFIOyEpOyglVxuICAgIGNvbnN0IHsgY29uZmlndXJlTG9nVGFwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbG9nZ2VyL2NvbmZpZ3VyZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyZUxvZ1RhcGUoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2dnaW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gREIg66Gc65OcXG4gICAgY29uc3QgeyBEQiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZGJcIik7XG4gICAgdGhpcy5kYkNvbmZpZyA9IERCLmdlbmVyYXRlREJDb25maWcodGhpcy5jb25maWcuZGF0YWJhc2UpO1xuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJEQiBDb25maWcgTG9hZGVkIVwiKSk7XG4gICAgfVxuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIC8vIO2FjOyKpO2KuOyXkOyEnOuPhCBFbnRpdHkg7KCV67O064qUIO2VhOyalO2VqeuLiOuLpC5cbiAgICAvLyB1cHNlcnTqsIAg7KCc64yA66GcIOyekeuPme2VmOugpOuptCBlbnRpdHnsnZggdW5pcXVlIGluZGV4IOygleuztOqwgCDtlYTsmpTtlZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gQ2FjaGUg7LSI6riw7ZmUXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ2FjaGUodGhpcy5jb25maWcuc2VydmVyLmNhY2hlLCBmb3JUZXN0aW5nKTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXMgLyBXb3JrZmxvd3MgLyBUZW1wbGF0ZXMgLyBTU1IgUm91dGVzXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBjb25zdCB7IFRlbXBsYXRlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVtcGxhdGVcIik7XG4gICAgYXdhaXQgVGVtcGxhdGVNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRTU1JSb3V0ZXMoKTtcblxuICAgIGNvbnN0IHsgaXNMb2NhbCwgaXNUZXN0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rOyXkOyEnOuKlCDsvZTrk5wg7IOd7ISx7J2EIOychO2VtCBCaW9tZSDshYvsl4XsnbQg7ZWE7JqU7ZWoICjtmITsnqwgYXBpUm9vdFBhdGgg7KCE64us7ZWY7JesIOyLpO2WiSlcbiAgICAgIChhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9mb3JtYXR0ZXJcIikpLnNldHVwQmlvbWUodGhpcy5hcGlSb290UGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpc0hvdFJlbG9hZFNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpICYmICFpc1Rlc3QoKSAmJiBpc0hvdFJlbG9hZFNlcnZlcigpICYmIGVuYWJsZVN5bmMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmMoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZUVuZChjaGFsay5jeWFuKFwiU29uYW11LmluaXRcIikpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlcnZlcihpbml0T3B0aW9ucz86IHsgZW5hYmxlU3luYz86IGJvb2xlYW47IGRvU2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChpbml0T3B0aW9ucz8uZG9TaWxlbnQsIGluaXRPcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IHsgZGVmYXVsdDogZmFzdGlmeSB9ID0gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCB7IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAbG9ndGFwZS9mYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHNlcnZlciA9IGZhc3RpZnkoe1xuICAgICAgLi4ub3B0aW9ucy5mYXN0aWZ5LFxuICAgICAgbG9nZ2VyOlxuICAgICAgICB0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZVxuICAgICAgICAgID8gZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jb25maWcubG9nZ2luZz8uZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgaWYgKCFvcHRpb25zLnBsdWdpbnM/LnNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCByZXF1aXJlcyBzZXNzaW9uIHBsdWdpbi4gUGxlYXNlIGFkZCBwbHVnaW5zLnNlc3Npb24gY29uZmlndXJhdGlvbi5cIik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8g66Gc7LusL+2UhOuhnOuNleyFmCDtmZjqsr0g67aE6riwXG4gICAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbih0aGlzLmFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgICBjb25zdCBoYXNXZWIgPSBhd2FpdCBleGlzdHMod2ViUGF0aCk7XG5cbiAgICAvLyDsoITsl60gY29tcHJlc3Mg7Ji17IWYIOqzhOyCsCAocm91dGUuY29tcHJlc3M6IHRydWXsnbwg65WMIOyCrOyaqSlcbiAgICBjb25zdCBwbHVnaW5Db21wcmVzcyA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5jb21wcmVzcztcbiAgICBjb25zdCBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHBsdWdpbkNvbXByZXNzXG4gICAgICA/IHBsdWdpbkNvbXByZXNzID09PSB0cnVlXG4gICAgICAgID8geyB0aHJlc2hvbGQ6IDEwMjQsIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdGhyZXNob2xkOiBwbHVnaW5Db21wcmVzcy50aHJlc2hvbGQsXG4gICAgICAgICAgICBlbmNvZGluZ3M6IHBsdWdpbkNvbXByZXNzLmVuY29kaW5ncyxcbiAgICAgICAgICAgIGN1c3RvbVR5cGVzOiBwbHVnaW5Db21wcmVzcy5jdXN0b21UeXBlcyxcbiAgICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rCDqsJzrsJwg7ZmY6rK9OiBWaXRlIERldiBTZXJ2ZXIgKyDthrXtlakg7ZW465Ok65+sXG4gICAgICBpZiAoaGFzV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBWaXRlRGV2U2VydmVyKHNlcnZlciwgd2ViUGF0aCwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9OiDqsJzrs4QgQVBJIOudvOyasO2KuCArIOygleyggSDtjIzsnbwg7ISc67mZXG4gICAgICBmb3IgKGNvbnN0IGFwaSBvZiB0aGlzLnN5bmNlci5hcGlzKSB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcsIGdsb2JhbENvbXByZXNzT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBWaXRlRGV2U2VydmVyIO2DgOyeheydhCDrj5nsoIHsnLzroZwg66Gc65Oc7ZW07JW8IO2VqFxuICBwcml2YXRlIHZpdGVTZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFZpdGVEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICB3ZWJQYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIGdsb2JhbENvbXByZXNzT3B0aW9ucz86IENvbXByZXNzT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcblxuICAgIHRoaXMudml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKHtcbiAgICAgIHJvb3Q6IHdlYlBhdGgsXG4gICAgICBzZXJ2ZXI6IHtcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6IHRydWUsXG4gICAgICAgIGhtcjoge1xuICAgICAgICAgIHNlcnZlcjogc2VydmVyLnNlcnZlcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gVml0ZSBtaWRkbGV3YXJlIOuTseuhnSAoVml0ZSDsl5DshYsg7LKY66asKVxuICAgIHNlcnZlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAvLyBBUEnsmYAgU29uYW11IFVJ64qUIEZhc3RpZnkg65287Jqw7Yq46rCAIOyymOumrO2VmOuPhOuhnSBza2lwXG4gICAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSB8fCByZXEudXJsPy5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgLy8g64KY66i47KeA64qUIFZpdGUgbWlkZGxld2FyZeuhnCDsoITri6xcbiAgICAgIHJldHVybiB0aGlzLnZpdGVTZXJ2ZXIubWlkZGxld2FyZXMocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgLy8gQVBJIOuPmeyggSDrnbzsmrDtjIUgKGNhdGNoLWFsbCDsoITsl5Ag65Ox66GdKVxuICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKGFwaS5vcHRpb25zLmNvbXByZXNzLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBjb25zdCB7IGdldFNTUlJvdXRlcywgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnLCB0aGlzLnZpdGVTZXJ2ZXIpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENTUiBmYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIvKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlIGFzIEVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgIHJldHVybiAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIOyEnOuyhCDsooXro4wg7IucIFZpdGXrj4Qg7KKF66OMXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMudml0ZVNlcnZlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHVwU3RhdGljV2ViU2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgX3dlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOqyveuhnCDrqoXtmZXtmZQ6IGFwaS9wdWJsaWMvd2ViLCBhcGkvZGlzdC9zc3JcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInB1YmxpY1wiLCBcIndlYlwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiKTtcbiAgICBjb25zdCBzc3JFbnRyeVBhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpO1xuICAgIGNvbnN0IHNzclJvdXRlc1BhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJyb3V0ZXMuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMod2ViRGlzdFBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgV2ViIGRpc3Qgbm90IGZvdW5kOiAke3dlYkRpc3RQYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiBlbnRyeSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgIGNvbnN0IHNzckF2YWlsYWJsZSA9IGF3YWl0IGV4aXN0cyhzc3JFbnRyeVBhdGgpO1xuXG4gICAgaWYgKCFzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiBlbnRyeSBub3QgZm91bmQ6ICR7c3NyRW50cnlQYXRofWApO1xuICAgICAgY29uc29sZS53YXJuKFwiICBTU1Igd2lsbCBiZSBkaXNhYmxlZC4gT25seSBDU1Igd2lsbCB3b3JrLlwiKTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOuhnOuTnCAocHJvZHVjdGlvbuyXkOyEnOunjCwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOydmCBzc3Ivcm91dGVzLnRzKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoc3NyUm91dGVzUGF0aCkpIHtcbiAgICAgICAgLy8gdHMtbG9hZGVy652866m0IFwiZmlsZTovL1wi66GcIOyLnOyeke2VmOuKlCBmdWxseS1yZXNvbHZlZCBwYXRo66eMIOuwm+q4sOyXkCDsnbTrpbwg7LKY66as7ZW07KO864qUIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZW07JW8IO2WiOqyoOyngOunjCxcbiAgICAgICAgLy8g7Jes6riw64qUIO2UhOuhnOuNleyFmCDtmZjqsr3sl5DshJwgbG9hZGVyIOyXhuydtCDrj4zslYTqsIDquLAg65WM66y47JeQIFwi7KeE7KecIGpzIO2MjOydvFwi7J2YIFwi6re464OlXCIg7KCI64yA6rK966Gc66W8IOuwlOuhnCBpbXBvcnTtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgICAvLyDsnbQg64K07Jqp7J2AIOydtCDtlajsiJgg64K07JeQ7IScIOyVhOuemOyXkCDrgpjsmKwg64uk66W4IGltcG9ydCDtmLjstpzsl5Drj4Qg64+Z7J287ZWY6rKMIOyggeyaqeuQqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgaW1wb3J0KHNzclJvdXRlc1BhdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKckyBTU1Igcm91dGVzIGxvYWRlZFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiByb3V0ZXMgbm90IGZvdW5kOiAke3NzclJvdXRlc1BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g66Gk66eBIOyXheuNsOydtO2KuCDrjIDsnZE6IGFzc2V0IGhhc2gg67aI7J287LmYIOyLnCDtmITsnqwg67KE7KCEIOyngeygkSDshJzruZlcbiAgICBzZXJ2ZXIuZ2V0KFwiL2Fzc2V0cy86ZmlsZW5hbWVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRGaWxlID0gKHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9KS5maWxlbmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJhc3NldHNcIik7XG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke3JlcXVlc3RlZEZpbGV9YDtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg6rKw7KCVXG4gICAgICBjb25zdCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCA9ICgpOiBDYWNoZUNvbnRyb2xDb25maWcgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFzc2V0c1wiLFxuICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgcGF0aDogYXNzZXRQYXRoLFxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOygleydmCDtlbjrk6Trn6wg7Jqw7ISgXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6riw67O46rCSOiBpbW11dGFibGVcbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICB9O1xuXG4gICAgICAvLyBpbmRleC0qLmpzIOuYkOuKlCBpbmRleC0qLmNzcyDsmpTssq3snbgg6rK97JqwXG4gICAgICBpZiAoL15pbmRleC1bYS1mMC05XStcXC4oanN8Y3NzKSQvLnRlc3QocmVxdWVzdGVkRmlsZSkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gcmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgcmVxdWVzdGVkRmlsZSk7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSByZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogZXh0ID09PSBcImNzc1wiID8gXCJ0ZXh0L2Nzc1wiIDogXCJcIik7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuY29kZSg0MDQpLnNlbmQoXCJOb3QgZm91bmRcIik7XG4gICAgfSk7XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICBjb25zdCB7IHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL3JlbmRlcmVyXCIpO1xuICAgICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24ocm91dGUuY29tcHJlc3MgPz8gdHJ1ZSwgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7cm91dGUucGF0aH1gKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcpO1xuXG4gICAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1NSIG9yIFN0YXRpYyBGaWxlIEZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIipcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAvYXBpLCAvc29uYW11LXVp64qUIDQwNCDqt7jrjIDroZxcbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpIHx8IHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgICAgcmVwbHkuY29kZSg0MDQpLnNlbmQoeyBlcnJvcjogXCJOb3QgRm91bmRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIHJlcXVlc3QudXJsKTtcbiAgICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKGZpbGVQYXRoKSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NSIGZhbGxiYWNrOiBpbmRleC5odG1sIOyEnOu5mVxuICAgICAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIikuc2VuZChhd2FpdCBmcy5yZWFkRmlsZShpbmRleFBhdGgsIFwidXRmLThcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinJMgU3RhdGljIHdlYiBzZXJ2ZXIgY29uZmlndXJlZCB3aXRoICR7c3NyQXZhaWxhYmxlID8gXCJTU1JcIiA6IFwiQ1NSIG9ubHlcIn0gc3VwcG9ydGApO1xuICB9XG5cbiAgY3JlYXRlQXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICBjb25zdCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSA9IGF3YWl0IGltcG9ydChcIi4vY29kZS1jb252ZXJ0ZXJzXCIpO1xuICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICB9O1xuICAgICAgLy8g7YyM7J28IOyXheuhnOuTnCDsnojripQg6rK97JqwIOyehOyLnCDrjbDsnbTthLBcbiAgICAgIGNvbnN0IHsgVXBsb2FkZWRGaWxlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIik7XG4gICAgICBjb25zdCB1cGxvYWRlZDoge1xuICAgICAgICBmaWxlczogSW5zdGFuY2VUeXBlPHR5cGVvZiBVcGxvYWRlZEZpbGU+W107XG4gICAgICB9ID0ge1xuICAgICAgICBmaWxlczogW10gYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBVcGxvYWRlZEZpbGU+W10sXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib2R5ID0gKHJlcXVlc3Rbd2hpY2hdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjO2KuOuhnCDrtoTrpqztlZjsl6wgZmlsZSDrmJDripQgZmllbGTroZwg6rWs67aEIOyymOumrFxuICAgICAgICAgIC8vIGZpbGXsnYAgVXBsb2FkZWRGaWxlIOyduOyKpO2EtOyKpOuhnCDrs4DtmZhcbiAgICAgICAgICAvLyBmaWVsZOuKlCBib2R57JeQIOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHBhcnRzID0gcmVxdWVzdC5wYXJ0cyh7XG4gICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEZvcm1EYXRh7J2YIGZpZWxk65Ok7J2EIOyehOyLnOuhnCDsoIDsnqVcbiAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgdXBsb2FkZWRGaWxlID0gbmV3IFVwbG9hZGVkRmlsZShwYXJ0KTtcbiAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgLy8g7J20IO2YuOy2nOydtCDsl4bsnLzrqbQg7KKF7KKFIG11bHRpcGFydCDtjIzsi7HsnbQgcGVuZGluZyDsg4Htg5zroZwg7YOA7J6E7JWE7JuDIOuwnOyDnVxuICAgICAgICAgICAgICBhd2FpdCB1cGxvYWRlZEZpbGUudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgdXBsb2FkZWQuZmlsZXMucHVzaCh1cGxvYWRlZEZpbGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHFz66GcIOykkeyyqSDqtazsobAg7YyM7IuxOiBwYXJhbXNbY2F0ZWdvcnldIOKGkiB7IHBhcmFtczogeyBjYXRlZ29yeTogXCJ0ZXN0XCIgfSB9XG4gICAgICAgICAgY29uc3QgcXMgPSBhd2FpdCBpbXBvcnQoXCJxc1wiKTtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5LCBwYXJzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24obWVzc2FnZXMgYXMgTG9jYWxpemVkU3RyaW5nLCB7XG4gICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgY29uc3QgYXBpQ2FjaGVDb25maWcgPSB0aGlzLmdldEFwaUNhY2hlQ29udHJvbChhcGksIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGFwaUNhY2hlQ29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udGV4dCDsg53shLFcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQoY29uZmlnLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAgIC8vIOyXheuhnOuTnCDsmLXshZjsnbQg7J6I64qUIOqyveyasCDtjIzsnbwg642w7J207YSw66W8IENvbnRleHTsl5Ag7LaU6rCAXG4gICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgY29udGV4dC5maWxlcyA9IHVwbG9hZGVkLmZpbGVzO1xuICAgICAgfVxuXG4gICAgICAvLyDrqqjrjbgg66mU7IaM65OcIGFyZ3Mg7IOd7ISx7ZWY7JesIO2YuOy2nFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmludm9rZU1vZGVsTWV0aG9kKGFwaSwgYXJncywgY29udGV4dCwgcmVwbHkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBTU1Lsl5DshJwg64uk7JaR7ZWcIO2DgOyeheydmCBwYXJhbXPrpbwg67Cb7JWE7JW8IO2VqFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zW3BhcmFtc0luZGV4KytdO1xuICAgIH0pO1xuXG4gICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgIHJldHVybiB0aGlzLmludm9rZU1vZGVsTWV0aG9kKGFwaSwgYXJncywgY29udGV4dCwgcmVwbHkpO1xuICB9XG5cbiAgYXN5bmMgaW52b2tlTW9kZWxNZXRob2QoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICAgY29udGV4dDogQ29udGV4dCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbW9kZWzsnYAg66qo6424IOyduOyKpO2EtOyKpOydtOuvgOuhnCDrqZTshJzrk5wg7Zi47LacIOqwgOuKpVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKG1vZGVsIGFzIGFueSlbYXBpLm1ldGhvZE5hbWVdLmFwcGx5KG1vZGVsLCBhcmdzKTtcbiAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQ29udGV4dChcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxDb250ZXh0PiB7XG4gICAgLy8gY3JlYXRlU1NFRmFjdG9yeSDtlajsiJjsl5Ag66+466asIHJlcXVlc3TsnZggc29ja2V06rO8IHJlcGx566W8IOuwlOyduOuUqS5cbiAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gKDxUIGV4dGVuZHMgWm9kT2JqZWN0PihcbiAgICAgIF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgX2V2ZW50czogVCxcbiAgICApID0+IGNyZWF0ZVNTRUZhY3RvcnkoX3JlcXVlc3Quc29ja2V0LCBfcmVwbHksIF9ldmVudHMpKS5iaW5kKG51bGwsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIC8vIGxvY2FsZSDqsJDsp4BcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgdGhpcy5kZXRlY3RMb2NhbGUocmVxdWVzdC5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdLCB0aGlzLmNvbmZpZy5pMThuLnN1cHBvcnRlZExvY2FsZXMpID8/XG4gICAgICB0aGlzLmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGU7XG5cbiAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0ge1xuICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgLy8gYXV0aFxuICAgICAgICAgICAgdXNlcjogcmVxdWVzdC51c2VyID8/IG51bGwsXG4gICAgICAgICAgICBwYXNzcG9ydDoge1xuICAgICAgICAgICAgICBsb2dpbjogcmVxdWVzdC5sb2dpbi5iaW5kKHJlcXVlc3QpIGFzIEF1dGhDb250ZXh0W1wicGFzc3BvcnRcIl1bXCJsb2dpblwiXSxcbiAgICAgICAgICAgICAgbG9nb3V0OiByZXF1ZXN0LmxvZ291dC5iaW5kKHJlcXVlc3QpIGFzIEF1dGhDb250ZXh0W1wicGFzc3BvcnRcIl1bXCJsb2dvdXRcIl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseSxcbiAgICAgICAgKSxcbiAgICAgICkpLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdhdGNoUGF0aCA9IFtwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJzcmNcIildO1xuXG4gICAgY29uc3QgY2hva2lkYXIgPSAoYXdhaXQgaW1wb3J0KFwiY2hva2lkYXJcIikpLmRlZmF1bHQ7XG4gICAgdGhpcy53YXRjaGVyID0gY2hva2lkYXIud2F0Y2god2F0Y2hQYXRoLCB7XG4gICAgICBpZ25vcmVkOiAocGF0aCwgc3RhdHMpID0+XG4gICAgICAgICEhc3RhdHM/LmlzRmlsZSgpICYmICFwYXRoLmVuZHNXaXRoKFwiLnRzXCIpICYmICFwYXRoLmVuZHNXaXRoKFwiLmpzb25cIiksXG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMud2F0Y2hlci5vbihcImFsbFwiLCBhc3luYyAoZXZlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aCh0aGlzLmFwaVJvb3RQYXRoKSxcbiAgICAgICAgXCJGaWxlIHBhdGggaXMgbm90IHdpdGhpbiB0aGUgQVBJIHJvb3QgcGF0aFwiLFxuICAgICAgKTtcblxuICAgICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gc29uYW11LmNvbmZpZy50cyDrs4Dqsr0g7IucIOyerOyLnOyekVxuICAgICAgICBjb25zdCBpc0NvbmZpZ1RzID0gZmlsZVBhdGggPT09IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG5cbiAgICAgICAgaWYgKGlzQ29uZmlnVHMpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKHRoaXMuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICAgICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX0gLSBSZXN0YXJ0aW5nLi4uYCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIFwiU0lHVVNSMlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpbGVDaGFuZ2UoZXZlbnQsIGFic29sdXRlUGF0aCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuICAgIFxuICAqL1xuICBhc3luYyBydW5TY3JpcHQoZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgcGx1Z2luczogU29uYW11U2VydmVyT3B0aW9uc1tcInBsdWdpbnNcIl0pIHtcbiAgICBpZiAoIXBsdWdpbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wcmVzcyDtlIzrn6zqt7jsnbjsnYAg64uk66W4IO2UjOufrOq3uOyduOuztOuLpCDrqLzsoIAg65Ox66Gd65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAgICBpZiAocGx1Z2lucy5jb21wcmVzcykge1xuICAgICAgY29uc3QgY29tcHJlc3NQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvY29tcHJlc3NcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgICBzZXNzaW9uOiBcIkBmYXN0aWZ5L3NlY3VyZS1zZXNzaW9uXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgLy8gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCBmYXN0aWZ5UGFzc3BvcnQgPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvcGFzc3BvcnRcIikpLmRlZmF1bHQ7XG4gICAgc2VydmVyLnJlZ2lzdGVyKGZhc3RpZnlQYXNzcG9ydC5pbml0aWFsaXplKCkpO1xuICAgIHNlcnZlci5yZWdpc3RlcihmYXN0aWZ5UGFzc3BvcnQuc2VjdXJlU2Vzc2lvbigpKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKGFzeW5jICh1c2VyLCBfcmVxdWVzdCkgPT4gdXNlcik7XG4gICAgICBmYXN0aWZ5UGFzc3BvcnQucmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyKGFzeW5jIChzZXJpYWxpemVkLCBfcmVxdWVzdCkgPT4gc2VyaWFsaXplZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKG9wdGlvbnMudXNlclNlcmlhbGl6ZXIpO1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlckRlc2VyaWFsaXplcihvcHRpb25zLnVzZXJEZXNlcmlhbGl6ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUNhY2hlKGNvbmZpZzogQ2FjaGVDb25maWcgfCB1bmRlZmluZWQsIGZvclRlc3Rpbmc6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IHNldENhY2hlTWFuYWdlclJlZiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvZGVjb3JhdG9yXCIpO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnCDrqZTrqqjrpqwg65Oc65287J2067KEIOyekOuPmSDsgqzsmqlcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgY29uc3QgeyBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleydtCDsl4bsnLzrqbQg7LqQ7IucIOu5hO2ZnOyEse2ZlFxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7JeQIOuUsOudvCBDYWNoZU1hbmFnZXIg7IOd7ISxXG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVDYWNoZU1hbmFnZXIoY29uZmlnKTtcbiAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy5fd29ya2Zsb3dzID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRmlsZUNoYW5nZShldmVudDogc3RyaW5nLCBmaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7LKrIOuyiOynuCDtjIzsnbzsnbTrqbQgSE1SIOyLnOyekSDsi5zqsIQg6riw66GdXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5obXJTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdGaWxlcy5wdXNoKGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9YCkpO1xuXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luY0Zyb21XYXRjaGVyKGV2ZW50LCBmaWxlUGF0aCk7XG5cbiAgICAvLyDsspjrpqwg7JmE66OM65CcIO2MjOydvOydhCDrjIDquLAg66qp66Gd7JeQ7IScIOygnOqxsFxuICAgIHRoaXMucGVuZGluZ0ZpbGVzID0gdGhpcy5wZW5kaW5nRmlsZXMuc2xpY2UoMSk7XG5cbiAgICAvLyDrqqjrk6Ag7YyM7J28IOyymOumrOqwgCDsmYTro4zrkJjrqbQg7LWc7KKFIOuplOyLnOyngCDstpzroKVcbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaEhNUigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluaXNoSE1SKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLnJlbmV3Q2hlY2tzdW1zKCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBlbmRUaW1lIC0gdGhpcy5obXJTdGFydFRpbWU7XG4gICAgY29uc3QgW2NoYWxrLCB7IGNlbnRlclRleHQgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQsXG4gICAgICBpbXBvcnQoXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIiksXG4gICAgXSk7XG4gICAgY29uc3QgbXNnID0gYEhNUiBEb25lISAke2NoYWxrLmJvbGQud2hpdGUoYCR7dG90YWxUaW1lfW1zYCl9YDtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChtc2cpKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgQmFzZU1vZGVsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCIpO1xuICAgIC8vIOuovOyggCDsspjrpqztlbTslbztlaguXG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgdGhpcy5fd29ya2Zsb3dzPy5kZXN0cm95KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLl9jYWNoZT8uZGlzY29ubmVjdCgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy53YXRjaGVyPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgbG9ndGFwZURpc3Bvc2UoKSxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG4iXSwibmFtZXMiOlsiZGlzcG9zZSIsImxvZ3RhcGVEaXNwb3NlIiwiYXNzZXJ0IiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJmcyIsImxvb2t1cCIsIm1pbWVMb29rdXAiLCJvcyIsInBhdGgiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIkRCIiwiaXNEYWVtb25TZXJ2ZXIiLCJhcHBseUNhY2hlSGVhZGVycyIsIkNhY2hlUHJlc2V0cyIsInRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIiwiTmFpdGUiLCJleGlzdHMiLCJmaWxlRXhpc3RzIiwiZ2V0U2VjcmV0cyIsIlNvbmFtdUNsYXNzIiwiaXNJbml0aWFsaXplZCIsImFzeW5jTG9jYWxTdG9yYWdlIiwiZ2V0Q29udGV4dCIsInN0b3JlIiwiZ2V0U3RvcmUiLCJjb250ZXh0IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwicmVxdWVzdCIsInJlcGx5IiwiaGVhZGVycyIsImNyZWF0ZVNTRSIsInNjaGVtYSIsIm5haXRlU3RvcmUiLCJNYXAiLCJFcnJvciIsIl9hcGlSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiYXBwUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIl9kYkNvbmZpZyIsImRiQ29uZmlnIiwiX3N5bmNlciIsInN5bmNlciIsIl9jb25maWciLCJjb25maWciLCJzZWNyZXRzIiwiX3N0b3JhZ2UiLCJzdG9yYWdlIiwiX2NhY2hlIiwiY2FjaGUiLCJfd29ya2Zsb3dzIiwid29ya2Zsb3dzIiwid2F0Y2hlciIsInBlbmRpbmdGaWxlcyIsImhtclN0YXJ0VGltZSIsInNlcnZlciIsImluaXRGb3JUZXN0aW5nIiwiaW5pdCIsInVuZGVmaW5lZCIsImRvU2lsZW50IiwiZW5hYmxlU3luYyIsImZvclRlc3RpbmciLCJjaGFsayIsImRlZmF1bHQiLCJjb25zb2xlIiwidGltZSIsImN5YW4iLCJmaW5kQXBpUm9vdFBhdGgiLCJsb2FkQ29uZmlnIiwiZGF0YWJhc2UiLCJkZWZhdWx0T3B0aW9ucyIsImNsaWVudCIsImNvbmZpZ3VyZUxvZ1RhcGUiLCJsb2dnaW5nIiwiZ2VuZXJhdGVEQkNvbmZpZyIsImxvZyIsImdyZWVuIiwiRW50aXR5TWFuYWdlciIsImF1dG9sb2FkIiwiaW5pdGlhbGl6ZUNhY2hlIiwiaW5pdGlhbGl6ZVdvcmtmbG93cyIsInRhc2tzIiwiU3luY2VyIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJUZW1wbGF0ZU1hbmFnZXIiLCJhdXRvbG9hZFNTUlJvdXRlcyIsImlzTG9jYWwiLCJpc1Rlc3QiLCJzZXR1cEJpb21lIiwiaXNIb3RSZWxvYWRTZXJ2ZXIiLCJzeW5jIiwic3RhcnRXYXRjaGVyIiwidGltZUVuZCIsImNyZWF0ZVNlcnZlciIsImluaXRPcHRpb25zIiwib3B0aW9ucyIsImZhc3RpZnkiLCJnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciIsImxvZ2dlciIsImNhdGVnb3J5IiwiZmFzdGlmeUNhdGVnb3J5IiwiU3RvcmFnZU1hbmFnZXIiLCJwbHVnaW5zIiwicmVnaXN0ZXJQbHVnaW5zIiwiYXV0aCIsInNlc3Npb24iLCJyZWdpc3RlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwic29uYW11VUlBcGlQbHVnaW4iLCJyZWdpc3RlciIsIndlYlBhdGgiLCJoYXNXZWIiLCJwbHVnaW5Db21wcmVzcyIsImNvbXByZXNzIiwiZ2xvYmFsQ29tcHJlc3NPcHRpb25zIiwidGhyZXNob2xkIiwiZW5jb2RpbmdzIiwiY3VzdG9tVHlwZXMiLCJzZXR1cFZpdGVEZXZTZXJ2ZXIiLCJtb2RlbHMiLCJtb2RlbE5hbWUiLCJtZXRob2QiLCJodHRwTWV0aG9kIiwidXJsIiwiaGFuZGxlciIsImNyZWF0ZUFwaUhhbmRsZXIiLCJzZXR1cFN0YXRpY1dlYlNlcnZlciIsInZpdGVTZXJ2ZXIiLCJ2aXRlIiwicm9vdCIsIm1pZGRsZXdhcmVNb2RlIiwiaG1yIiwiYXBwVHlwZSIsInVzZSIsInJlcSIsInJlcyIsIm5leHQiLCJzdGFydHNXaXRoIiwibWlkZGxld2FyZXMiLCJnZXRTU1JSb3V0ZXMiLCJyZW5kZXJTU1IiLCJzc3JSb3V0ZXMiLCJwYXJhbXMiLCJleHRyYWN0UGF0aFBhcmFtcyIsImh0bWwiLCJ0eXBlIiwidGVtcGxhdGUiLCJyZWFkRmlsZSIsInRyYW5zZm9ybUluZGV4SHRtbCIsImUiLCJzc3JGaXhTdGFja3RyYWNlIiwiZXJyb3IiLCJzdGF0dXMiLCJtZXNzYWdlIiwiYWRkSG9vayIsImNsb3NlIiwiX3dlYlBhdGgiLCJ3ZWJEaXN0UGF0aCIsInNzclBhdGgiLCJzc3JFbnRyeVBhdGgiLCJzc3JSb3V0ZXNQYXRoIiwid2FybiIsInNzckF2YWlsYWJsZSIsInJlcXVlc3RlZEZpbGUiLCJmaWxlbmFtZSIsImFzc2V0c0RpciIsImFzc2V0UGF0aCIsImdldENhY2hlQ29udHJvbEZvckFzc2V0IiwiY2FjaGVSZXEiLCJjYWNoZUNvbnRyb2xIYW5kbGVyIiwicmVzdWx0IiwiaW1tdXRhYmxlIiwiZXh0IiwicG9wIiwiZmlsZXMiLCJyZWFkZGlyIiwiY3VycmVudEZpbGUiLCJmaW5kIiwiZiIsImVuZHNXaXRoIiwiZmlsZVBhdGgiLCJjb250ZW50Iiwic2VuZCIsImluY2x1ZGVzIiwiY29kZSIsImNzckNhY2hlUmVxIiwiY3NyQ2FjaGVDb25maWciLCJpbmRleFBhdGgiLCJndWFyZHMiLCJldmVyeSIsImd1YXJkIiwiZ3VhcmRIYW5kbGVyIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaSIsIlJlcVR5cGUiLCJ0eXBlcyIsIndoaWNoIiwicmVxQm9keSIsIlVwbG9hZGVkRmlsZSIsInVwbG9hZGVkIiwiYm9keSIsInVwbG9hZE9wdGlvbnMiLCJwYXJ0cyIsImxpbWl0cyIsImZpZWxkcyIsInBhcnQiLCJ1cGxvYWRlZEZpbGUiLCJ0b0J1ZmZlciIsInB1c2giLCJmaWVsZG5hbWUiLCJTdHJpbmciLCJxcyIsInBhcnNlZCIsInBhcnNlIiwiT2JqZWN0IiwiYXNzaWduIiwiZmFzdGlmeUNhc3RlciIsIlpvZEVycm9yIiwiaHVtYW5pemVab2RFcnJvciIsIm1lc3NhZ2VzIiwibWFwIiwiaXNzdWUiLCJCYWRSZXF1ZXN0RXhjZXB0aW9uIiwiem9kRXJyb3IiLCJjb250ZW50VHlwZSIsImFwaUNhY2hlQ29uZmlnIiwiZ2V0QXBpQ2FjaGVDb250cm9sIiwiY3JlYXRlQ29udGV4dCIsIkFwaVBhcmFtVHlwZSIsImFyZ3MiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJpc0NvbnRleHQiLCJuYW1lIiwiaW52b2tlTW9kZWxNZXRob2QiLCJwYXR0ZXJuIiwicGF0dGVyblBhcnRzIiwiZmlsdGVyIiwiQm9vbGVhbiIsInVybFBhcnRzIiwiaSIsImxlbmd0aCIsImNhY2hlQ29udHJvbCIsInJvdXRlT3B0aW9ucyIsImludm9rZUFwaUZvclNTUiIsInBhcmFtc0luZGV4IiwibW9kZWwiLCJydW4iLCJtZXRob2ROYW1lIiwiYXBwbHkiLCJjcmVhdGVTU0VGYWN0b3J5IiwiX2V2ZW50cyIsInNvY2tldCIsImJpbmQiLCJsb2NhbGUiLCJkZXRlY3RMb2NhbGUiLCJpMThuIiwic3VwcG9ydGVkTG9jYWxlcyIsImRlZmF1bHRMb2NhbGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNvbnRleHRQcm92aWRlciIsImNyZWF0ZVN0b3JlIiwidXNlciIsInBhc3Nwb3J0IiwibG9naW4iLCJsb2dvdXQiLCJhY2NlcHRMYW5ndWFnZSIsInN1cHBvcnRlZCIsImxhbmdzIiwibGFuZyIsInRyaW0iLCJ3YXRjaFBhdGgiLCJjaG9raWRhciIsIndhdGNoIiwiaWdub3JlZCIsInN0YXRzIiwiaXNGaWxlIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsInJlbGF0aXZlUGF0aCIsInJlcGxhY2UiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwicnVuU2NyaXB0IiwiZm4iLCJkZXN0cm95IiwiY29tcHJlc3NQbHVnaW4iLCJwbHVnaW5zTW9kdWxlcyIsImNvcnMiLCJmb3JtYm9keSIsIm11bHRpcGFydCIsInNzZSIsInN0YXRpYyIsInJlZ2lzdGVyUGx1Z2luIiwia2V5IiwicGx1Z2luTmFtZSIsIm9wdGlvbiIsImVudHJpZXMiLCJjdXN0b20iLCJmYXN0aWZ5UGFzc3BvcnQiLCJpbml0aWFsaXplIiwic2VjdXJlU2Vzc2lvbiIsInJlZ2lzdGVyVXNlclNlcmlhbGl6ZXIiLCJyZWdpc3RlclVzZXJEZXNlcmlhbGl6ZXIiLCJzZXJpYWxpemVkIiwidXNlclNlcmlhbGl6ZXIiLCJ1c2VyRGVzZXJpYWxpemVyIiwic2V0Q2FjaGVNYW5hZ2VyUmVmIiwiY3JlYXRlVGVzdENhY2hlTWFuYWdlciIsImNyZWF0ZUNhY2hlTWFuYWdlciIsIldvcmtmbG93TWFuYWdlciIsImdldERCQ29uZmlnIiwiZW5hYmxlV29ya2VyIiwiZGVmYXVsdFdvcmtlck9wdGlvbnMiLCJjb25jdXJyZW5jeSIsImNwdXMiLCJ1c2VQdWJTdWIiLCJsaXN0ZW5EZWxheSIsInNldHVwV29ya2VyIiwid29ya2VyT3B0aW9ucyIsInBvcnQiLCJsaXN0ZW4iLCJob3N0IiwibGlmZWN5Y2xlIiwib25TaHV0ZG93biIsInNodXRkb3duIiwiZXhpdCIsImVyciIsIm9uRXJyb3IiLCJzZXRFcnJvckhhbmRsZXIiLCJ0aGVuIiwic3RhcnRXb3JrZXIiLCJvblN0YXJ0IiwiY2F0Y2giLCJyZWQiLCJub3ciLCJyZWxhdGl2ZSIsInN5bmNGcm9tV2F0Y2hlciIsImZpbmlzaEhNUiIsInJlbmV3Q2hlY2tzdW1zIiwiZW5kVGltZSIsInRvdGFsVGltZSIsImNlbnRlclRleHQiLCJhbGwiLCJtc2ciLCJ3aGl0ZSIsImJsYWNrIiwiYmdHcmVlbiIsIkJhc2VNb2RlbCIsImFsbFNldHRsZWQiLCJkaXNjb25uZWN0IiwiU29uYW11Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXQyxjQUFjLFFBQVEsbUJBQW1CO0FBQzdELE9BQU9DLFlBQVksU0FBUztBQUM1QixTQUFTQyxpQkFBaUIsUUFBUSxjQUFjO0FBR2hELE9BQU9DLFFBQVEsbUJBQWM7QUFFN0IsU0FBU0MsVUFBVUMsVUFBVSxRQUFRLGFBQWE7QUFDbEQsT0FBT0MsUUFBUSxLQUFLO0FBQ3BCLE9BQU9DLFVBQVUsT0FBTztBQUV4QixTQUFTQyxvQkFBb0IsRUFBRUMsRUFBRSxFQUFFQyxjQUFjLFFB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
@@ -6,6 +6,7 @@ import { type PathLike } from "fs";
6
6
  * @returns
7
7
  */
8
8
  export declare function exists(path: PathLike): Promise<boolean>;
9
+ export declare function fileExists(path: PathLike): Promise<boolean>;
9
10
  /**
10
11
  * 파일을 복사하면서 `from "sonamu"` import를 sonamu.shared.ts 경로로 치환합니다.
11
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAI9C;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
1
+ {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAI9C;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAGD,wBAAsB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
@@ -1,5 +1,5 @@
1
1
  import { constants } from "fs";
2
- import { access, readFile, writeFile } from "node:fs/promises";
2
+ import { access, readFile, stat, writeFile } from "node:fs/promises";
3
3
  import path, { dirname } from "path";
4
4
  /**
5
5
  * fs/promises에는 exists가 없어요. 대신 access가 있습니다.
@@ -14,6 +14,15 @@ import path, { dirname } from "path";
14
14
  return false;
15
15
  }
16
16
  }
17
+ // 디렉토리가 아니라 파일만 존재하는지 확인합니다.
18
+ export async function fileExists(path) {
19
+ try {
20
+ const stats = await stat(path);
21
+ return stats.isFile();
22
+ } catch {
23
+ return false;
24
+ }
25
+ }
17
26
  /**
18
27
  * 파일을 복사하면서 `from "sonamu"` import를 sonamu.shared.ts 경로로 치환합니다.
19
28
  *
@@ -49,4 +58,4 @@ import path, { dirname } from "path";
49
58
  return true;
50
59
  }
51
60
 
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9mcy11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdGFudHMsIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGFjY2VzcywgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5cbi8qKlxuICogZnMvcHJvbWlzZXPsl5DripQgZXhpc3Rz6rCAIOyXhuyWtOyalC4g64yA7IugIGFjY2Vzc+qwgCDsnojsirXri4jri6QuXG4gKiDqt7zrjbAg7JaY64qUIOyduO2EsO2OmOydtOyKpOqwgCDsk7DquLAg67aI7Y647ZW07JqULiDqt7jrnpjshJwg6rCQ7Iu47KO87JeI7Iq164uI64ukLlxuICogQHBhcmFtIHBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdHMocGF0aDogUGF0aExpa2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhY2Nlc3MocGF0aCwgY29uc3RhbnRzLkZfT0spO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiDtjIzsnbzsnYQg67O17IKs7ZWY66m07IScIGBmcm9tIFwic29uYW11XCJgIGltcG9ydOulvCBzb25hbXUuc2hhcmVkLnRzIOqyveuhnOuhnCDsuZjtmZjtlanri4jri6QuXG4gKlxuICogd2Vi7J2064KYIGFwcCDrk7Hsl5DripQgc29uYW11IO2MqO2CpOyngOqwgCDsl4bsnLzrr4DroZwsIO2VqOq7mCDrs7XsgqzrkJjripQgc29uYW11LnNoYXJlZC50c+yXkOyEnCDqsIDsoLjsmKTrj4TroZ0g67OA7ZmY7ZWp64uI64ukLlxuICog64yA7IOBIO2MjOydvOydmCDsnITsuZjsl5Ag65Sw6528IOyDgeuMgCDqsr3roZzqsIAg64us65287KeR64uI64ukOlxuICogLSBzZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkLnRzIOKGkiAuL3NvbmFtdS5zaGFyZWRcbiAqIC0gc2VydmljZXMvdXNlci91c2VyLnR5cGVzLnRzIOKGkiAuLi9zb25hbXUuc2hhcmVkXG4gKiAtIGkxOG4va28udHMg4oaSIC4uL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWRcbiAqXG4gKiBAcGFyYW0gZnJvbVBhdGgg7JuQ67O4IO2MjOydvCDqsr3roZxcbiAqIEBwYXJhbSB0b1BhdGgg64yA7IOBIO2MjOydvCDqsr3roZxcbiAqIEByZXR1cm5zIO2MjOydvOydhCDsjbzsnLzrqbQgdHJ1ZSwg6rG064SI65uw7JeI7Jy866m0IGZhbHNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKFxuICBmcm9tUGF0aDogc3RyaW5nLFxuICB0b1BhdGg6IHN0cmluZyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIShhd2FpdCBleGlzdHMoZnJvbVBhdGgpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG9sZEZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGZyb21QYXRoKSkudG9TdHJpbmcoKTtcblxuICBjb25zdCBuZXdGaWxlQ29udGVudCA9ICgoKSA9PiB7XG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDtla3sg4Ege2Jhc2V9L3NyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRz7JeQIOychOy5mO2VqeuLiOuLpC5cbiAgICAvLyB0b1BhdGjsl5DshJwgL3NyYy/rpbwg7LC+7JWEIHNlcnZpY2VzIOuUlOugie2GoOumrCDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICAgIGNvbnN0IHNyY01hdGNoID0gdG9QYXRoLm1hdGNoKC9eKC4rXFwvc3JjKVxcLy8pO1xuICAgIGlmICghc3JjTWF0Y2gpIHtcbiAgICAgIC8vIC9zcmMv6rCAIOyXhuycvOuptCDrs4DtmZgg7JeG7J20IOq3uOuMgOuhnCDrsJjtmZhcbiAgICAgIHJldHVybiBvbGRGaWxlQ29udGVudDtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlc0RpciA9IHBhdGguam9pbihzcmNNYXRjaFsxXSwgXCJzZXJ2aWNlc1wiKTtcbiAgICBjb25zdCBmaWxlRGlyID0gZGlybmFtZSh0b1BhdGgpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZmlsZURpciwgc2VydmljZXNEaXIpO1xuICAgIGNvbnN0IHNoYXJlZFBhdGggPSByZWxhdGl2ZVBhdGggPT09IFwiXCIgPyBcIi4vc29uYW11LnNoYXJlZFwiIDogYCR7cmVsYXRpdmVQYXRofS9zb25hbXUuc2hhcmVkYDtcblxuICAgIHJldHVybiBvbGRGaWxlQ29udGVudC5yZXBsYWNlKC9mcm9tIFwic29uYW11KFxcL2RpY3QpP1wiL2csIGBmcm9tIFwiJHtzaGFyZWRQYXRofVwiYCk7XG4gIH0pKCk7XG5cbiAgYXdhaXQgd3JpdGVGaWxlKHRvUGF0aCwgbmV3RmlsZUNvbnRlbnQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLCJuYW1lcyI6WyJjb25zdGFudHMiLCJhY2Nlc3MiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzIiwiRl9PSyIsImNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQiLCJmcm9tUGF0aCIsInRvUGF0aCIsIm9sZEZpbGVDb250ZW50IiwidG9TdHJpbmciLCJuZXdGaWxlQ29udGVudCIsInNyY01hdGNoIiwibWF0Y2giLCJzZXJ2aWNlc0RpciIsImpvaW4iLCJmaWxlRGlyIiwicmVsYXRpdmVQYXRoIiwicmVsYXRpdmUiLCJzaGFyZWRQYXRoIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxRQUF1QixLQUFLO0FBQzlDLFNBQVNDLE1BQU0sRUFBRUMsUUFBUSxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDMUQsT0FBT0MsUUFBUUMsT0FBTyxRQUFRLE9BQU87QUFFckM7Ozs7O0NBS0MsR0FDRCxPQUFPLGVBQWVDLE9BQU9GLElBQWM7SUFDekMsSUFBSTtRQUNGLE1BQU1ILE9BQU9HLE1BQU1KLFVBQVVPLElBQUk7UUFDakMsT0FBTztJQUNULEVBQUUsT0FBTTtRQUNOLE9BQU87SUFDVDtBQUNGO0FBRUE7Ozs7Ozs7Ozs7OztDQVlDLEdBQ0QsT0FBTyxlQUFlQyxnQ0FDcEJDLFFBQWdCLEVBQ2hCQyxNQUFjO0lBRWQsSUFBSSxDQUFFLE1BQU1KLE9BQU9HLFdBQVk7UUFDN0IsT0FBTztJQUNUO0lBRUEsTUFBTUUsaUJBQWlCLEFBQUMsQ0FBQSxNQUFNVCxTQUFTTyxTQUFRLEVBQUdHLFFBQVE7SUFFMUQsTUFBTUMsaUJBQWlCLEFBQUMsQ0FBQTtRQUN0QixvRUFBb0U7UUFDcEUsOENBQThDO1FBQzlDLE1BQU1DLFdBQVdKLE9BQU9LLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUNELFVBQVU7WUFDYiwwQkFBMEI7WUFDMUIsT0FBT0g7UUFDVDtRQUVBLE1BQU1LLGNBQWNaLEtBQUthLElBQUksQ0FBQ0gsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUMzQyxNQUFNSSxVQUFVYixRQUFRSztRQUN4QixNQUFNUyxlQUFlZixLQUFLZ0IsUUFBUSxDQUFDRixTQUFTRjtRQUM1QyxNQUFNSyxhQUFhRixpQkFBaUIsS0FBSyxvQkFBb0IsR0FBR0EsYUFBYSxjQUFjLENBQUM7UUFFNUYsT0FBT1IsZUFBZVcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRUQsV0FBVyxDQUFDLENBQUM7SUFDakYsQ0FBQTtJQUVBLE1BQU1sQixVQUFVTyxRQUFRRztJQUN4QixPQUFPO0FBQ1QifQ==
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9mcy11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdGFudHMsIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGFjY2VzcywgcmVhZEZpbGUsIHN0YXQsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5cbi8qKlxuICogZnMvcHJvbWlzZXPsl5DripQgZXhpc3Rz6rCAIOyXhuyWtOyalC4g64yA7IugIGFjY2Vzc+qwgCDsnojsirXri4jri6QuXG4gKiDqt7zrjbAg7JaY64qUIOyduO2EsO2OmOydtOyKpOqwgCDsk7DquLAg67aI7Y647ZW07JqULiDqt7jrnpjshJwg6rCQ7Iu47KO87JeI7Iq164uI64ukLlxuICogQHBhcmFtIHBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdHMocGF0aDogUGF0aExpa2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhY2Nlc3MocGF0aCwgY29uc3RhbnRzLkZfT0spO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8g65SU66CJ7Yag66as6rCAIOyVhOuLiOudvCDtjIzsnbzrp4wg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlRXhpc3RzKHBhdGg6IFBhdGhMaWtlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICog7YyM7J287J2EIOuzteyCrO2VmOuptOyEnCBgZnJvbSBcInNvbmFtdVwiYCBpbXBvcnTrpbwgc29uYW11LnNoYXJlZC50cyDqsr3roZzroZwg7LmY7ZmY7ZWp64uI64ukLlxuICpcbiAqIHdlYuydtOuCmCBhcHAg65Ox7JeQ64qUIHNvbmFtdSDtjKjtgqTsp4DqsIAg7JeG7Jy866+A66GcLCDtlajqu5gg67O17IKs65CY64qUIHNvbmFtdS5zaGFyZWQudHPsl5DshJwg6rCA7KC47Jik64+E66GdIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOuMgOyDgSDtjIzsnbzsnZgg7JyE7LmY7JeQIOuUsOudvCDsg4HrjIAg6rK966Gc6rCAIOuLrOudvOynkeuLiOuLpDpcbiAqIC0gc2VydmljZXMvc29uYW11LmdlbmVyYXRlZC50cyDihpIgLi9zb25hbXUuc2hhcmVkXG4gKiAtIHNlcnZpY2VzL3VzZXIvdXNlci50eXBlcy50cyDihpIgLi4vc29uYW11LnNoYXJlZFxuICogLSBpMThuL2tvLnRzIOKGkiAuLi9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkXG4gKlxuICogQHBhcmFtIGZyb21QYXRoIOybkOuzuCDtjIzsnbwg6rK966GcXG4gKiBAcGFyYW0gdG9QYXRoIOuMgOyDgSDtjIzsnbwg6rK966GcXG4gKiBAcmV0dXJucyDtjIzsnbzsnYQg7I287Jy866m0IHRydWUsIOqxtOuEiOubsOyXiOycvOuptCBmYWxzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChcbiAgZnJvbVBhdGg6IHN0cmluZyxcbiAgdG9QYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGZyb21QYXRoKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvbGRGaWxlQ29udGVudCA9IChhd2FpdCByZWFkRmlsZShmcm9tUGF0aCkpLnRvU3RyaW5nKCk7XG5cbiAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSAoKCkgPT4ge1xuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg7ZWt7IOBIHtiYXNlfS9zcmMvc2VydmljZXMvc29uYW11LnNoYXJlZC50c+yXkCDsnITsuZjtlanri4jri6QuXG4gICAgLy8gdG9QYXRo7JeQ7IScIC9zcmMv66W8IOywvuyVhCBzZXJ2aWNlcyDrlJTroInthqDrpqwg6rK966Gc66W8IOqzhOyCsO2VqeuLiOuLpC5cbiAgICBjb25zdCBzcmNNYXRjaCA9IHRvUGF0aC5tYXRjaCgvXiguK1xcL3NyYylcXC8vKTtcbiAgICBpZiAoIXNyY01hdGNoKSB7XG4gICAgICAvLyAvc3JjL+qwgCDsl4bsnLzrqbQg67OA7ZmYIOyXhuydtCDqt7jrjIDroZwg67CY7ZmYXG4gICAgICByZXR1cm4gb2xkRmlsZUNvbnRlbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZXNEaXIgPSBwYXRoLmpvaW4oc3JjTWF0Y2hbMV0sIFwic2VydmljZXNcIik7XG4gICAgY29uc3QgZmlsZURpciA9IGRpcm5hbWUodG9QYXRoKTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGZpbGVEaXIsIHNlcnZpY2VzRGlyKTtcbiAgICBjb25zdCBzaGFyZWRQYXRoID0gcmVsYXRpdmVQYXRoID09PSBcIlwiID8gXCIuL3NvbmFtdS5zaGFyZWRcIiA6IGAke3JlbGF0aXZlUGF0aH0vc29uYW11LnNoYXJlZGA7XG5cbiAgICByZXR1cm4gb2xkRmlsZUNvbnRlbnQucmVwbGFjZSgvZnJvbSBcInNvbmFtdShcXC9kaWN0KT9cIi9nLCBgZnJvbSBcIiR7c2hhcmVkUGF0aH1cImApO1xuICB9KSgpO1xuXG4gIGF3YWl0IHdyaXRlRmlsZSh0b1BhdGgsIG5ld0ZpbGVDb250ZW50KTtcbiAgcmV0dXJuIHRydWU7XG59XG4iXSwibmFtZXMiOlsiY29uc3RhbnRzIiwiYWNjZXNzIiwicmVhZEZpbGUiLCJzdGF0Iiwid3JpdGVGaWxlIiwicGF0aCIsImRpcm5hbWUiLCJleGlzdHMiLCJGX09LIiwiZmlsZUV4aXN0cyIsInN0YXRzIiwiaXNGaWxlIiwiY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZCIsImZyb21QYXRoIiwidG9QYXRoIiwib2xkRmlsZUNvbnRlbnQiLCJ0b1N0cmluZyIsIm5ld0ZpbGVDb250ZW50Iiwic3JjTWF0Y2giLCJtYXRjaCIsInNlcnZpY2VzRGlyIiwiam9pbiIsImZpbGVEaXIiLCJyZWxhdGl2ZVBhdGgiLCJyZWxhdGl2ZSIsInNoYXJlZFBhdGgiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxTQUFTLFFBQXVCLEtBQUs7QUFDOUMsU0FBU0MsTUFBTSxFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ2hFLE9BQU9DLFFBQVFDLE9BQU8sUUFBUSxPQUFPO0FBRXJDOzs7OztDQUtDLEdBQ0QsT0FBTyxlQUFlQyxPQUFPRixJQUFjO0lBQ3pDLElBQUk7UUFDRixNQUFNSixPQUFPSSxNQUFNTCxVQUFVUSxJQUFJO1FBQ2pDLE9BQU87SUFDVCxFQUFFLE9BQU07UUFDTixPQUFPO0lBQ1Q7QUFDRjtBQUVBLDZCQUE2QjtBQUM3QixPQUFPLGVBQWVDLFdBQVdKLElBQWM7SUFDN0MsSUFBSTtRQUNGLE1BQU1LLFFBQVEsTUFBTVAsS0FBS0U7UUFDekIsT0FBT0ssTUFBTUMsTUFBTTtJQUNyQixFQUFFLE9BQU07UUFDTixPQUFPO0lBQ1Q7QUFDRjtBQUVBOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUNELE9BQU8sZUFBZUMsZ0NBQ3BCQyxRQUFnQixFQUNoQkMsTUFBYztJQUVkLElBQUksQ0FBRSxNQUFNUCxPQUFPTSxXQUFZO1FBQzdCLE9BQU87SUFDVDtJQUVBLE1BQU1FLGlCQUFpQixBQUFDLENBQUEsTUFBTWIsU0FBU1csU0FBUSxFQUFHRyxRQUFRO0lBRTFELE1BQU1DLGlCQUFpQixBQUFDLENBQUE7UUFDdEIsb0VBQW9FO1FBQ3BFLDhDQUE4QztRQUM5QyxNQUFNQyxXQUFXSixPQUFPSyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDRCxVQUFVO1lBQ2IsMEJBQTBCO1lBQzFCLE9BQU9IO1FBQ1Q7UUFFQSxNQUFNSyxjQUFjZixLQUFLZ0IsSUFBSSxDQUFDSCxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQzNDLE1BQU1JLFVBQVVoQixRQUFRUTtRQUN4QixNQUFNUyxlQUFlbEIsS0FBS21CLFFBQVEsQ0FBQ0YsU0FBU0Y7UUFDNUMsTUFBTUssYUFBYUYsaUJBQWlCLEtBQUssb0JBQW9CLEdBQUdBLGFBQWEsY0FBYyxDQUFDO1FBRTVGLE9BQU9SLGVBQWVXLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUVELFdBQVcsQ0FBQyxDQUFDO0lBQ2pGLENBQUE7SUFFQSxNQUFNckIsVUFBVVUsUUFBUUc7SUFDeEIsT0FBTztBQUNUIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.7.35",
3
+ "version": "0.7.36",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -111,10 +111,10 @@
111
111
  "vitest": "^4.0.10",
112
112
  "exceljs": "^4.4.0",
113
113
  "zod": "^4.1.12",
114
+ "@sonamu-kit/ts-loader": "^2.1.3",
114
115
  "@sonamu-kit/hmr-runner": "^0.1.1",
115
- "@sonamu-kit/tasks": "^0.1.3",
116
116
  "@sonamu-kit/hmr-hook": "^0.4.1",
117
- "@sonamu-kit/ts-loader": "^2.1.3"
117
+ "@sonamu-kit/tasks": "^0.1.3"
118
118
  },
119
119
  "devDependencies": {
120
120
  "@biomejs/biome": "^2.3.10",
package/src/api/sonamu.ts CHANGED
@@ -22,7 +22,7 @@ import type { StorageManager } from "../storage/storage-manager";
22
22
  import type { Syncer } from "../syncer/syncer";
23
23
  import type { WorkflowManager } from "../tasks/workflow-manager";
24
24
  import type { SonamuFastifyConfig } from "../types/types";
25
- import { exists } from "../utils/fs-utils";
25
+ import { exists, fileExists } from "../utils/fs-utils";
26
26
  import type { AbsolutePath } from "../utils/path-utils";
27
27
  import type { SonamuConfig, SonamuServerOptions, SonamuTaskOptions } from "./config";
28
28
  import type { AuthContext, Context } from "./context";
@@ -653,7 +653,7 @@ class SonamuClass {
653
653
 
654
654
  // 정적 파일이 존재할 경우, 정적 파일을 먼저 서빙해야함
655
655
  const filePath = path.join(webDistPath, request.url);
656
- if (await exists(filePath)) {
656
+ if (await fileExists(filePath)) {
657
657
  const content = await fs.readFile(filePath);
658
658
  return reply.type(mimeLookup(filePath) || "application/octet-stream").send(content);
659
659
  }
@@ -1,5 +1,5 @@
1
1
  import { constants, type PathLike } from "fs";
2
- import { access, readFile, writeFile } from "fs/promises";
2
+ import { access, readFile, stat, writeFile } from "fs/promises";
3
3
  import path, { dirname } from "path";
4
4
 
5
5
  /**
@@ -17,6 +17,16 @@ export async function exists(path: PathLike): Promise<boolean> {
17
17
  }
18
18
  }
19
19
 
20
+ // 디렉토리가 아니라 파일만 존재하는지 확인합니다.
21
+ export async function fileExists(path: PathLike): Promise<boolean> {
22
+ try {
23
+ const stats = await stat(path);
24
+ return stats.isFile();
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+
20
30
  /**
21
31
  * 파일을 복사하면서 `from "sonamu"` import를 sonamu.shared.ts 경로로 치환합니다.
22
32
  *