sliftutils 1.7.88 → 1.7.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/dist/treeSummary.ts.cache +2 -2
  3. package/index.d.ts +679 -300
  4. package/misc/dist/environment.ts.cache +2 -2
  5. package/misc/dist/getSecret.ts.cache +2 -2
  6. package/misc/dist/strings.ts.cache +2 -2
  7. package/misc/dist/zip.ts.cache +2 -2
  8. package/misc/https/dist/certs.ts.cache +2 -2
  9. package/misc/https/dist/cloudflareHelpers.ts.cache +2 -2
  10. package/misc/https/dist/dns.ts.cache +2 -2
  11. package/misc/https/dist/hostServer.ts.cache +49 -21
  12. package/misc/https/dist/hostsFile.ts.cache +82 -0
  13. package/misc/https/dist/httpsCerts.ts.cache +2 -2
  14. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  15. package/misc/https/hostServer.d.ts +6 -2
  16. package/misc/https/hostServer.ts +52 -19
  17. package/misc/https/hostsFile.d.ts +7 -0
  18. package/misc/https/hostsFile.ts +66 -0
  19. package/package.json +1 -1
  20. package/render-utils/dist/observer.tsx.cache +2 -2
  21. package/storage/ArchivesDisk.d.ts +3 -6
  22. package/storage/ArchivesDisk.ts +26 -2
  23. package/storage/BulkDatabase2/BulkDatabaseReader.ts +1 -1
  24. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
  25. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
  26. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
  27. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +3 -3
  28. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
  29. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
  30. package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
  31. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
  32. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
  33. package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
  34. package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
  35. package/storage/IArchives.d.ts +37 -24
  36. package/storage/IArchives.ts +47 -62
  37. package/storage/LogMap.d.ts +56 -0
  38. package/storage/LogMap.ts +220 -0
  39. package/storage/archiveHelpers.d.ts +36 -0
  40. package/storage/archiveHelpers.ts +103 -0
  41. package/storage/backblaze.d.ts +7 -12
  42. package/storage/backblaze.ts +53 -48
  43. package/storage/dist/ArchivesDisk.ts.cache +29 -3
  44. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  45. package/storage/dist/IArchives.ts.cache +17 -53
  46. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  47. package/storage/dist/JSONStorage.ts.cache +2 -2
  48. package/storage/dist/LogMap.ts.cache +212 -0
  49. package/storage/dist/PendingManager.tsx.cache +2 -2
  50. package/storage/dist/TransactionStorage.ts.cache +2 -2
  51. package/storage/dist/archiveHelpers.ts.cache +87 -0
  52. package/storage/dist/backblaze.ts.cache +59 -45
  53. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  54. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  55. package/storage/remoteStorage/ArchivesDelayed.d.ts +66 -0
  56. package/storage/remoteStorage/ArchivesDelayed.ts +237 -0
  57. package/storage/remoteStorage/ArchivesRemote.d.ts +5 -6
  58. package/storage/remoteStorage/ArchivesRemote.ts +26 -5
  59. package/storage/remoteStorage/ArchivesUrl.d.ts +2 -5
  60. package/storage/remoteStorage/ArchivesUrl.ts +2 -2
  61. package/storage/remoteStorage/accessPage.tsx +12 -0
  62. package/storage/remoteStorage/blobStore.d.ts +162 -189
  63. package/storage/remoteStorage/blobStore.ts +495 -952
  64. package/storage/remoteStorage/bucketDisk.d.ts +24 -3
  65. package/storage/remoteStorage/bucketDisk.ts +56 -22
  66. package/storage/remoteStorage/certTrustModal.d.ts +1 -0
  67. package/storage/remoteStorage/certTrustModal.tsx +48 -0
  68. package/storage/remoteStorage/cliArgs.d.ts +2 -0
  69. package/storage/remoteStorage/cliArgs.ts +5 -0
  70. package/storage/remoteStorage/createArchives.d.ts +8 -7
  71. package/storage/remoteStorage/createArchives.ts +65 -26
  72. package/storage/remoteStorage/deployTakeover.ts +1 -1
  73. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +220 -0
  74. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +26 -6
  75. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +3 -3
  76. package/storage/remoteStorage/dist/accessPage.tsx.cache +13 -3
  77. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  78. package/storage/remoteStorage/dist/blobStore.ts.cache +484 -966
  79. package/storage/remoteStorage/dist/bucketDisk.ts.cache +60 -29
  80. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +55 -0
  81. package/storage/remoteStorage/dist/cliArgs.ts.cache +9 -4
  82. package/storage/remoteStorage/dist/createArchives.ts.cache +64 -27
  83. package/storage/remoteStorage/dist/deployTakeover.ts.cache +5 -5
  84. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +286 -0
  85. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  86. package/storage/remoteStorage/dist/remoteConfig.ts.cache +122 -56
  87. package/storage/remoteStorage/dist/serverConfig.ts.cache +4 -4
  88. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -11
  89. package/storage/remoteStorage/dist/sourcesList.ts.cache +3 -6
  90. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  91. package/storage/remoteStorage/dist/storageController.ts.cache +33 -36
  92. package/storage/remoteStorage/dist/storageServer.ts.cache +27 -7
  93. package/storage/remoteStorage/dist/storageServerCli.ts.cache +7 -3
  94. package/storage/remoteStorage/dist/storageServerState.ts.cache +138 -707
  95. package/storage/remoteStorage/dist/storeConfig.ts.cache +52 -0
  96. package/storage/remoteStorage/dist/storePlan.ts.cache +110 -81
  97. package/storage/remoteStorage/dist/storeSources.ts.cache +51 -0
  98. package/storage/remoteStorage/dist/storeSync.ts.cache +651 -0
  99. package/storage/remoteStorage/dist/validation.ts.cache +14 -4
  100. package/storage/remoteStorage/intermediateManagement.d.ts +12 -0
  101. package/storage/remoteStorage/intermediateManagement.ts +264 -0
  102. package/storage/remoteStorage/remoteConfig.d.ts +32 -0
  103. package/storage/remoteStorage/remoteConfig.ts +115 -50
  104. package/storage/remoteStorage/serverConfig.d.ts +1 -1
  105. package/storage/remoteStorage/serverConfig.ts +1 -1
  106. package/storage/remoteStorage/sourceWrapper.ts +4 -8
  107. package/storage/remoteStorage/sourcesList.d.ts +0 -2
  108. package/storage/remoteStorage/sourcesList.ts +0 -3
  109. package/storage/remoteStorage/spec.md +18 -4
  110. package/storage/remoteStorage/storageController.d.ts +10 -0
  111. package/storage/remoteStorage/storageController.ts +37 -41
  112. package/storage/remoteStorage/storageServer.d.ts +2 -0
  113. package/storage/remoteStorage/storageServer.ts +28 -4
  114. package/storage/remoteStorage/storageServerCli.ts +5 -1
  115. package/storage/remoteStorage/storageServerState.d.ts +39 -26
  116. package/storage/remoteStorage/storageServerState.ts +149 -669
  117. package/storage/remoteStorage/storeConfig.d.ts +30 -0
  118. package/storage/remoteStorage/storeConfig.ts +62 -0
  119. package/storage/remoteStorage/storePlan.d.ts +29 -17
  120. package/storage/remoteStorage/storePlan.ts +112 -85
  121. package/storage/remoteStorage/storeSources.d.ts +11 -0
  122. package/storage/remoteStorage/storeSources.ts +47 -0
  123. package/storage/remoteStorage/storeSync.d.ts +53 -0
  124. package/storage/remoteStorage/storeSync.ts +632 -0
  125. package/storage/remoteStorage/validation.d.ts +2 -0
  126. package/storage/remoteStorage/validation.ts +10 -0
@@ -1,4 +1,4 @@
1
- "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
1
+ "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -22,6 +22,22 @@ const DEFAULT_LOW_SPACE_THRESHOLD_BYTES = 25 * 1024 ** 3;
22
22
  const DISK_SPACE_CHECK_INTERVAL_MS = 15 * 60 * 1000;
23
23
  // Below this fraction of the warn threshold, we start rejecting writes so the server itself doesn't tip the machine into instability. Reads/deletes still work so users can free space.
24
24
  const HARD_REJECT_FRACTION = 0.1;
25
+ // This machine's LAN (internal) IPv4 - the address other machines on the same network reach us at. Used with --internal, where the ip-domain is based on the internal address instead of our public one.
26
+ function getInternalIP() {
27
+ let candidates = [];
28
+ for (let addrs of Object.values(os_1.default.networkInterfaces())) {
29
+ for (let addr of addrs || []) {
30
+ if (addr.family !== "IPv4" || addr.internal)
31
+ continue;
32
+ candidates.push(addr.address);
33
+ }
34
+ }
35
+ if (!candidates.length) {
36
+ throw new Error(`--internal was set, but no non-loopback IPv4 network interface was found to use as the internal address`);
37
+ }
38
+ // Prefer a private-range address (the actual LAN ip) over any other non-loopback interface
39
+ return candidates.find(ip => /^(10\.|192\.168\.|172\.(1[6-9]|2\d|3[01])\.)/.test(ip)) || candidates[0];
40
+ }
25
41
  function formatBytes(bytes) {
26
42
  return `${(bytes / 1024 ** 3).toFixed(2)} GiB`;
27
43
  }
@@ -57,11 +73,12 @@ async function hostStorageServer(config) {
57
73
  let { url, folder } = config;
58
74
  let { address: domain, port } = (0, ArchivesRemote_1.parseStorageUrl)(url);
59
75
  let rootDomain = domain.split(".").slice(-2).join(".");
60
- let externalIP = (await (0, networking_1.getExternalIP)()).trim();
76
+ // With --internal the ip-domain is based on our LAN address; otherwise on our external ip
77
+ let ip = config.internal ? getInternalIP() : (await (0, networking_1.getExternalIP)()).trim();
61
78
  // The subdomain must be an ip domain: the domain's A record points at exactly one machine, so a dynamic name would let the same script run on two servers and silently fight over it. Encoding the IP makes that mistake fail loudly - the wrong machine's domain just doesn't match.
62
- let allowedDomains = [`127-0-0-1.${rootDomain}`, `${externalIP.replaceAll(".", "-")}.${rootDomain}`];
79
+ let allowedDomains = [`127-0-0-1.${rootDomain}`, `${ip.replaceAll(".", "-")}.${rootDomain}`];
63
80
  if (!allowedDomains.includes(domain)) {
64
- throw new Error(`The storage server domain is based on the machine's IP (the subdomain is the IP with dots replaced by dashes). Expected ${allowedDomains.join(" or ")}, was ${domain}. Your external IP is ${externalIP}.`);
81
+ throw new Error(`The storage server domain is based on the machine's ${config.internal ? "INTERNAL (LAN)" : "external"} IP (the subdomain is the IP with dots replaced by dashes). Expected ${allowedDomains.join(" or ")}, was ${domain}. This machine's ${config.internal ? "internal" : "external"} IP is ${ip}.`);
65
82
  }
66
83
  await promises_1.default.mkdir(folder, { recursive: true });
67
84
  let lowSpaceThreshold = (_a = config.lowSpaceThresholdBytes) !== null && _a !== void 0 ? _a : DEFAULT_LOW_SPACE_THRESHOLD_BYTES;
@@ -69,7 +86,7 @@ async function hostStorageServer(config) {
69
86
  domain,
70
87
  port,
71
88
  rootDomain,
72
- sshTarget: `${os_1.default.userInfo().username}@${externalIP}`,
89
+ sshTarget: `${os_1.default.userInfo().username}@${ip}`,
73
90
  serverCommand: `node ${getGrantAccessCliPath()} --url ${url}`,
74
91
  folder: path_1.default.resolve(folder),
75
92
  });
@@ -93,6 +110,9 @@ async function hostStorageServer(config) {
93
110
  domain,
94
111
  port,
95
112
  setDNSRecord: true,
113
+ publicIp: ip,
114
+ internal: config.internal,
115
+ selfSigned: config.selfSigned,
96
116
  portFallback: {
97
117
  getAcquireDelay: deployTakeover_1.getMainPortAcquireDelay,
98
118
  onPortInUse: async () => {
@@ -115,5 +135,5 @@ async function hostStorageServer(config) {
115
135
  });
116
136
  }
117
137
  exports.hostStorageServer = hostStorageServer;
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0b3JhZ2VTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO0FBRXBDLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsMkRBQThCO0FBQzlCLG1FQUFnRTtBQUNoRSwrREFBK0Q7QUFDL0QsaUZBQThFO0FBQzlFLDREQUF5RDtBQUN6RCwyREFBOEQ7QUFDOUQsaURBQTRIO0FBQzVILHFEQUFrSDtBQUNsSCxxREFBbUQ7QUFDbkQscUVBQXFFO0FBQ3JFLHdCQUFzQjtBQUV0QixNQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ3pELE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEQsd0xBQXdMO0FBQ3hMLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBYWpDLFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDOUIsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNuRCxDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxNQUE2QztJQUN2RSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNuQyxJQUFJLEtBQUssR0FBRyxNQUFNLGtCQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxJQUFJLFNBQVMsR0FBRyxTQUFTLEdBQUcsb0JBQW9CLENBQUM7SUFDakQsSUFBSSxJQUFJLElB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QixNQUFNLElBQUEscUNBQW9CLEdBQUUsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsV0FBVyxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFOztnQkFDdkMsSUFBSSxVQUFVO29CQUFFLE9BQU87Z0JBQ3ZCLElBQUEsaUNBQWtCLEVBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xDLElBQUEsMkJBQVUsRUFBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxTQUFTLEdBQUcsSUFBQSxvQ0FBbUIsR0FBRSxDQUFDO2dCQUN0QyxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixhQUFhLCtCQUErQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsd0hBQXdILENBQUMsQ0FBQztvQkFDck8sSUFBQSxvQ0FBcUIsRUFBQyxhQUFhLENBQUMsQ0FBQztnQkFDekMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFBLE1BQUMsS0FBZ0MsRUFBQyxLQUFLLGtEQUFJLENBQUM7WUFDaEQsQ0FBQztTQUNKO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQTdERCw4Q0E2REMiLCJzb3VyY2VzQ29udGVudCI6WyJwcm9jZXNzLmVudi5OT0RFX0VOViA9IFwicHJvZHVjdGlvblwiO1xuXG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzcCBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgZ2V0RXh0ZXJuYWxJUCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL25ldHdvcmtpbmdcIjtcbmltcG9ydCB7IFJlcXVpcmVDb250cm9sbGVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9yZXF1aXJlL1JlcXVpcmVDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBob3N0U2VydmVyIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvaG9zdFNlcnZlclwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgc2V0U3RvcmFnZVNlcnZlckNvbmZpZywgc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24sIGFkZEV4dHJhTGlzdGVuUG9ydCwgcmVtb3ZlRXh0cmFMaXN0ZW5Qb3J0IH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5pbXBvcnQgeyBkZXRlY3REZXBsb3lUYWtlb3Zlciwgc2V0QWx0UG9ydCwgZ2V0QWx0UG9ydExpc3RlbkVuZCwgZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkgfSBmcm9tIFwiLi9kZXBsb3lUYWtlb3ZlclwiO1xuaW1wb3J0IHsgcGFyc2VTdG9yYWdlVXJsIH0gZnJvbSBcIi4vQXJjaGl2ZXNSZW1vdGVcIjtcbi8vIEltcG9ydCBicm93c2VyIGNvZGUsIHNvIGl0IGlzIGFsbG93ZWQgdG8gYmUgcmVxdWlyZWQgYnkgdGhlIGNsaWVudFxuaW1wb3J0IFwiLi9hY2Nlc3NQYWdlXCI7XG5cbmNvbnN0IERFRkFVTFRfTE9XX1NQQUNFX1RIUkVTSE9MRF9CWVRFUyA9IDI1ICogMTAyNCAqKiAzO1xuY29uc3QgRElTS19TUEFDRV9DSEVDS19JTlRFUlZBTF9NUyA9IDE1ICogNjAgKiAxMDAwO1xuLy8gQmVsb3cgdGhpcyBmcmFjdGlvbiBvZiB0aGUgd2FybiB0aHJlc2hvbGQsIHdlIHN0YXJ0IHJlamVjdGluZyB3cml0ZXMgc28gdGhlIHNlcnZlciBpdHNlbGYgZG9lc24ndCB0aXAgdGhlIG1hY2hpbmUgaW50byBpbnN0YWJpbGl0eS4gUmVhZHMvZGVsZXRlcyBzdGlsbCB3b3JrIHNvIHVzZXJzIGNhbiBmcmVlIHNwYWNlLlxuY29uc3QgSEFSRF9SRUpFQ1RfRlJBQ1RJT04gPSAwLjE7XG5cbi8vIFRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIsIGFzIGEgbGlicmFyeSBmdW5jdGlvbjogY29uc3VtZXJzIGNhbGwgaG9zdFN0b3JhZ2VTZXJ2ZXIoKSBmcm9tIHRoZWlyIG93biBwcm9jZXNzIHRvIHN0YXJ0IGhvc3RpbmcgKG9yIHVzZSB0aGUgc3RvcmFnZXNlcnZlciBiaW4sIHNlZSBzdG9yYWdlU2VydmVyQ2xpLnRzKS4gVGhlIGdyYW50QWNjZXNzLmpzIGJvb3RzdHJhcCAobmV4dCB0byB0aGlzIGZpbGUpIGlzIHdoYXQgdGhlIGFjY2VzcyBwYWdlJ3Mgc2hvd24gU1NIIGNvbW1hbmQgcG9pbnRzIGF0LlxuXG5leHBvcnQgdHlwZSBIb3N0U3RvcmFnZVNlcnZlckNvbmZpZyA9IHtcbiAgICAvLyBGdWxsIFVSTCBvZiB0aGlzIHN0b3JhZ2Ugc2VydmVyLCBlLmcuIFwiaHR0cHM6Ly8xLTItMy00LmV4YW1wbGUuY29tOjQ0NDRcIi4gVGhlIHN1YmRvbWFpbiBtdXN0IGJlIGFuIGlwIGRvbWFpbiAtIHRoaXMgbWFjaGluZSdzIGV4dGVybmFsIElQIHdpdGggZGFzaGVzLCBvciAxMjctMC0wLTEgZm9yIGxvY2FsIHRlc3RpbmcgKHNlZSB0aGUgdmFsaWRhdGlvbiBpbiBob3N0U3RvcmFnZVNlcnZlcikuIFRoZSBkb21haW4gYW5kIHBvcnQgYXJlIGV4dHJhY3RlZCBmcm9tIGl0IChidWNrZXQgcm91dGluZyBVUkxzIGNsaWVudHMgdXNlIGxvb2sgbGlrZVxuICAgIC8vIGh0dHBzOi8vMS0yLTMtNC5leGFtcGxlLmNvbTo0NDQ0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPi9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb24pLlxuICAgIHVybDogc3RyaW5nO1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8vIFdoZW4gZnJlZSBzcGFjZSBvbiB0aGUgZm9sZGVyJ3MgZHJpdmUgZHJvcHMgYmVsb3cgdGhpcyBtYW55IGJ5dGVzLCB0aGUgc2VydmVyIGNvbnNvbGUuZXJyb3JzIGV2ZXJ5IDE1IG1pbnV0ZXMuIEJlbG93IDEwJSBvZiBpdCwgdGhlIHNlcnZlciBhbHNvIHJlamVjdHMgd3JpdGUgb3BlcmF0aW9ucyAoY3JlYXRpbmcgZmlsZXMsIGxhcmdlIHVwbG9hZHMsIG5ldyBidWNrZXRzKSDigJQgcmVhZHMsIGZpbmRJbmZvLCBhbmQgZGVsZXRlcyBzdGlsbCB3b3JrIHNvIHRoZSB1c2VyIGNhbiBmcmVlIHNwYWNlLiBEZWZhdWx0IDI1IEdpQi5cbiAgICBsb3dTcGFjZVRocmVzaG9sZEJ5dGVzPzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQgKiogMykudG9GaXhlZCgyKX0gR2lCYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tEaXNrU3BhY2UoY29uZmlnOiB7IGZvbGRlcjogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHsgZm9sZGVyLCB0aHJlc2hvbGQgfSA9IGNvbmZpZztcbiAgICBsZXQgc3RhdHMgPSBhd2FpdCBmc3Auc3RhdGZzKGZvbGRlcik7XG4gICAgbGV0IGZyZWUgPSBOdW1iZXIoc3RhdHMuYmF2YWlsKSAqIE51bWJlcihzdGF0cy5ic2l6ZSk7XG4gICAgbGV0IGhhcmRMaW1pdCA9IHRocmVzaG9sZCAqIEhBUkRfUkVKRUNUX0ZSQUNUSU9OO1xuICAgIGlmIChmcmVlID49IHRocmVzaG9sZCkge1xuICAgICAgICBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbih1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB1bmRlciA9IHRocmVzaG9sZCAtIGZyZWU7XG4gICAgbGV0IHJlamVjdGluZyA9IGZyZWUgPCBoYXJkTGltaXQ7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFN0b3JhZ2UgZm9sZGVyICR7Zm9sZGVyfSBpcyBsb3cgb24gZGlzazogJHtmb3JtYXRCeXRlcyhmcmVlKX0gZnJlZWBcbiAgICAgICAgKyBgICh3YXJuIHRocmVzaG9sZCAke2Zvcm1hdEJ5dGVzKHRocmVzaG9sZCl9LCAke2Zvcm1hdEJ5dGVzKHVuZGVyKX0gdW5kZXI7YFxuICAgICAgICArIGAgaGFyZC1yZWplY3QgdGhyZXNob2xkICR7Zm9ybWF0Qnl0ZXMoaGFyZExpbWl0KX0ke3JlamVjdGluZyA/IFwiLCBSRUFDSEVEIOKAlCB3cml0ZSBvcHMgbm93IHJlamVjdGVkXCIgOiBcIlwifSkuYFxuICAgICk7XG4gICAgaWYgKHJlamVjdGluZykge1xuICAgICAgICBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbihcbiAgICAgICAgICAgIGBTdG9yYWdlIHNlcnZlciBpcyBvdXQgb2YgZGlzayBzcGFjZTogb25seSAke2Zvcm1hdEJ5dGVzKGZyZWUpfSBmcmVlIG9uICR7Zm9sZGVyfWBcbiAgICAgICAgICAgICsgYCAoaGFyZC1yZWplY3QgdGhyZXNob2xkICR7Zm9ybWF0Qnl0ZXMoaGFyZExpbWl0KX0sIHdhcm4gdGhyZXNob2xkICR7Zm9ybWF0Qnl0ZXModGhyZXNob2xkKX0pLmBcbiAgICAgICAgICAgICsgYCBXcml0ZSBvcGVyYXRpb25zIChjcmVhdGUvYXBwZW5kL25ldyBidWNrZXQpIGFyZSByZWplY3RlZDsgcmVhZHMsIGZpbmRJbmZvLCBhbmQgZGVsZXRlcyBzdGlsbCB3b3JrIOKAlCBwbGVhc2UgZnJlZSBzcGFjZS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24odW5kZWZpbmVkKTtcbiAgICB9XG59XG5cbi8vIEZ1bGwgcGF0aCB0byB0aGUgZ3JhbnRBY2Nlc3MgQ0xJIGJvb3RzdHJhcCB0aGF0IGxpdmVzIG5leHQgdG8gdGhpcyBmaWxlLiBUaGUgU1NIIGNvbW1hbmQgc2hvd24gb24gdGhlIGFjY2VzcyBwYWdlIGludm9rZXMgaXQgdmlhIGBub2RlIDxwYXRoPiAuLi5gIChmb3VuZCB0aHJvdWdoIF9fZGlybmFtZSBzbyBjb25zdW1lcnMgZG9uJ3QgaGF2ZSB0byBrbm93IHdoZXJlIG91ciBzb3VyY2UgbGl2ZXMpLlxuZnVuY3Rpb24gZ2V0R3JhbnRBY2Nlc3NDbGlQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiZ3JhbnRBY2Nlc3MuanNcIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBob3N0U3RvcmFnZVNlcnZlcihjb25maWc6IEhvc3RTdG9yYWdlU2VydmVyQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHsgdXJsLCBmb2xkZXIgfSA9IGNvbmZpZztcbiAgICBsZXQgeyBhZGRyZXNzOiBkb21haW4sIHBvcnQgfSA9IHBhcnNlU3RvcmFnZVVybCh1cmwpO1xuICAgIGxldCByb290RG9tYWluID0gZG9tYWluLnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG4gICAgbGV0IGV4dGVybmFsSVAgPSAoYXdhaXQgZ2V0RXh0ZXJuYWxJUCgpKS50cmltKCk7XG4gICAgLy8gVGhlIHN1YmRvbWFpbiBtdXN0IGJlIGFuIGlwIGRvbWFpbjogdGhlIGRvbWFpbidzIEEgcmVjb3JkIHBvaW50cyBhdCBleGFjdGx5IG9uZSBtYWNoaW5lLCBzbyBhIGR5bmFtaWMgbmFtZSB3b3VsZCBsZXQgdGhlIHNhbWUgc2NyaXB0IHJ1biBvbiB0d28gc2VydmVycyBhbmQgc2lsZW50bHkgZmlnaHQgb3ZlciBpdC4gRW5jb2RpbmcgdGhlIElQIG1ha2VzIHRoYXQgbWlzdGFrZSBmYWlsIGxvdWRseSAtIHRoZSB3cm9uZyBtYWNoaW5lJ3MgZG9tYWluIGp1c3QgZG9lc24ndCBtYXRjaC5cbiAgICBsZXQgYWxsb3dlZERvbWFpbnMgPSBbYDEyNy0wLTAtMS4ke3Jvb3REb21haW59YCwgYCR7ZXh0ZXJuYWxJUC5yZXBsYWNlQWxsKFwiLlwiLCBcIi1cIil9LiR7cm9vdERvbWFpbn1gXTtcbiAgICBpZiAoIWFsbG93ZWREb21haW5zLmluY2x1ZGVzKGRvbWFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RvcmFnZSBzZXJ2ZXIgZG9tYWluIGlzIGJhc2VkIG9uIHRoZSBtYWNoaW5lJ3MgSVAgKHRoZSBzdWJkb21haW4gaXMgdGhlIElQIHdpdGggZG90cyByZXBsYWNlZCBieSBkYXNoZXMpLiBFeHBlY3RlZCAke2FsbG93ZWREb21haW5zLmpvaW4oXCIgb3IgXCIpfSwgd2FzICR7ZG9tYWlufS4gWW91ciBleHRlcm5hbCBJUCBpcyAke2V4dGVybmFsSVB9LmApO1xuICAgIH1cbiAgICBhd2FpdCBmc3AubWtkaXIoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbG93U3BhY2VUaHJlc2hvbGQgPSBjb25maWcubG93U3BhY2VUaHJlc2hvbGRCeXRlcyA/PyBERUZBVUxUX0xPV19TUEFDRV9USFJFU0hPTERfQllURVM7XG4gICAgc2V0U3RvcmFnZVNlcnZlckNvbmZpZyh7XG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgcG9ydCxcbiAgICAgICAgcm9vdERvbWFpbixcbiAgICAgICAgc3NoVGFyZ2V0OiBgJHtvcy51c2VySW5mbygpLnVzZXJuYW1lfUAke2V4dGVybmFsSVB9YCxcbiAgICAgICAgc2VydmVyQ29tbWFuZDogYG5vZGUgJHtnZXRHcmFudEFjY2Vzc0NsaVBhdGgoKX0gLS11cmwgJHt1cmx9YCxcbiAgICAgICAgZm9sZGVyOiBwYXRoLnJlc29sdmUoZm9sZGVyKSxcbiAgICB9KTtcblxuICAgIFJlcXVpcmVDb250cm9sbGVyLmFsbG93QWxsTm9kZU1vZHVsZXMoKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5leHBvc2UoUmVxdWlyZUNvbnRyb2xsZXIpO1xuICAgIFNvY2tldEZ1bmN0aW9uLmV4cG9zZShSZW1vdGVTdG9yYWdlQ29udHJvbGxlcik7XG4gICAgLy8gRXZlcnkgSFRUUCBwYXRoIGdvZXMgdGhyb3VnaCBodHRwRW50cnk6IC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vLi4uIHNlcnZlcyBwdWJsaWMgYnVja2V0IGZpbGVzLCBldmVyeXRoaW5nIGVsc2Ugc2VydmVzIHRoZSBhY2Nlc3MgcGFnZSAodGhlIHBhdGggaXMgdGhlIGFjY291bnQgbmFtZSwgc2VlIGFjY2Vzc1BhZ2UudHN4KS4gQSBmdWxsIFVSTCwgc28gdGhlIHBhZ2UgcmVzb2x2ZXMgbW9kdWxlcyBmcm9tIHRoZSBvcmlnaW4gcm9vdCBldmVuIHdoZW4gc2VydmVkIGF0IC9hY2NvdW50TmFtZSAoYSByZWxhdGl2ZSByZXF1aXJlIHdvdWxkIHJlc29sdmUgaW5zaWRlIHRoZSBhY2NvdW50IHBhdGgpLlxuICAgIC8vIFRoZSBtb2R1bGUgcGF0aCBpcyByZXNvbHZlZCBzZXJ2ZXItc2lkZSBhZ2FpbnN0IGl0cyB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggaXMgdGhlIEhPU1QgYXBwbGljYXRpb24ncyBmb2xkZXIgLSBzbyBpdCBpcyBjb21wdXRlZCBmcm9tIHdoZXJlIHRoaXMgZmlsZSBhY3R1YWxseSBpcywgaW5zdGVhZCBvZiBhc3N1bWluZyB0aGUgc3RvcmFnZSBzZXJ2ZXIgcnVucyBmcm9tIGluc2lkZSBzbGlmdHV0aWxzIChpbiBhIGhvc3QgYXBwIGl0IGxpdmVzIHVuZGVyIG5vZGVfbW9kdWxlcy9zbGlmdHV0aWxzKS5cbiAgICBsZXQgYWNjZXNzUGFnZVBhdGggPSBcIi4vXCIgKyBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiYWNjZXNzUGFnZS50c3hcIikpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5zZXREZWZhdWx0SFRUUENhbGwoUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFwiaHR0cEVudHJ5XCIsIHtcbiAgICAgICAgcmVxdWlyZUNhbGxzOiBbYGh0dHBzOi8vJHtkb21haW59OiR7cG9ydH0vJHthY2Nlc3NQYWdlUGF0aH1gXSxcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWwgY2hlY2sgc28gYSBzZXJ2ZXIgc3RhcnRpbmcgdW5kZXItbGltaXQgaW1tZWRpYXRlbHkgcmVqZWN0cyB3cml0ZXM7IHRoZW4ga2VlcCBjaGVja2luZyBldmVyeSAxNSBtaW51dGVzIHNvIHJlY292ZXJ5IChmcmVlZCBkaXNrIHNwYWNlKSBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseS5cbiAgICBhd2FpdCBjaGVja0Rpc2tTcGFjZSh7IGZvbGRlciwgdGhyZXNob2xkOiBsb3dTcGFjZVRocmVzaG9sZCB9KTtcbiAgICBsZXQgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHZvaWQgY2hlY2tEaXNrU3BhY2UoeyBmb2xkZXIsIHRocmVzaG9sZDogbG93U3BhY2VUaHJlc2hvbGQgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoYERpc2sgc3BhY2UgY2hlY2sgZmFpbGVkIGZvciAke2ZvbGRlcn06YCwgZSkpO1xuICAgIH0sIERJU0tfU1BBQ0VfQ0hFQ0tfSU5URVJWQUxfTVMpO1xuICAgIChpbnRlcnZhbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG5cbiAgICBhd2FpdCBob3N0U2VydmVyKHtcbiAgICAgICAgZG9tYWluLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzZXRETlNSZWNvcmQ6IHRydWUsXG4gICAgICAgIHBvcnRGYWxsYmFjazoge1xuICAgICAgICAgICAgZ2V0QWNxdWlyZURlbGF5OiBnZXRNYWluUG9ydEFjcXVpcmVEZWxheSxcbiAgICAgICAgICAgIG9uUG9ydEluVXNlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGV0ZWN0RGVwbG95VGFrZW92ZXIoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkxpc3RlbmluZzogKGxpc3RlbmluZ1BvcnQsIGlzTWFpblBvcnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUG9ydCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGFkZEV4dHJhTGlzdGVuUG9ydChsaXN0ZW5pbmdQb3J0KTtcbiAgICAgICAgICAgICAgICBzZXRBbHRQb3J0KGxpc3RlbmluZ1BvcnQpO1xuICAgICAgICAgICAgICAgIGxldCBsaXN0ZW5FbmQgPSBnZXRBbHRQb3J0TGlzdGVuRW5kKCk7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBbHRlcm5hdGUgcG9ydCAke2xpc3RlbmluZ1BvcnR9IHJlYWNoZWQgaXRzIGVuZCBvZiBsaWZlIGF0ICR7bmV3IERhdGUobGlzdGVuRW5kKS50b0lTT1N0cmluZygpfTsgaXQgbm8gbG9uZ2VyIGNvdW50cyBhcyBvbmUgb2Ygb3VyIGFkZHJlc3NlcyAodGhlIHNvY2tldCBpdHNlbGYgc3RheXMgYm91bmQsIGFzIHRoZSBtYWluLXBvcnQgcmVsYXkgZm9yd2FyZHMgaW50byBpdClgKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0cmFMaXN0ZW5Qb3J0KGxpc3RlbmluZ1BvcnQpO1xuICAgICAgICAgICAgICAgIH0sIE1hdGgubWF4KDAsIGxpc3RlbkVuZCAtIERhdGUubm93KCkpKTtcbiAgICAgICAgICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiJdfQ==
119
- /* _JS_SOURCE_HASH = "83117826c86c99fc2e93c16a8a182374c940690834d995f183d16d928eb6de5c"; */
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0b3JhZ2VTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO0FBRXBDLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsMkRBQThCO0FBQzlCLG1FQUFnRTtBQUNoRSwrREFBK0Q7QUFDL0QsaUZBQThFO0FBQzlFLDREQUF5RDtBQUN6RCwyREFBOEQ7QUFDOUQsaURBQTRIO0FBQzVILHFEQUFrSDtBQUNsSCxxREFBbUQ7QUFDbkQscUVBQXFFO0FBQ3JFLHdCQUFzQjtBQUV0QixNQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ3pELE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEQsd0xBQXdMO0FBQ3hMLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRWpDLHlNQUF5TTtBQUN6TSxTQUFTLGFBQWE7SUFDbEIsSUFBSSxVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQzlCLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEQsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxTQUFTO1lBQ3RELFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHlHQUF5RyxDQUFDLENBQUM7SUFDL0gsQ0FBQztJQUNELDJGQUEyRjtJQUMzRixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyw4Q0FBOEMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0csQ0FBQztBQWlCRCxTQUFTLFdBQVcsQ0FBQyxLQUFhO0lBQzlCLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDbkQsQ0FBQztBQUVELEtBQUssVUFBVSxjQUFjLENBQUMsTUFBNkM7SUFDdkUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDbkMsSUFBSSxLQUFLLEdBQUcsTUFBTSxrQkFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsSUFBSSxTQUFTLEdBQUcsU0FBUyxHQUFHLG9CQUFvQixDQUFDO0lBQ2pELElBQUksSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3BCLElBQUEsc0NBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsT0FBTztJQUNYLENBQUM7SUFDRCxJQUFJLEtBQUssR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQzdCLElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUM7SUFDakMsT0FBTyxDQUFDLEtBQUssQ0FDVCxrQkFBa0IsTUFBTSxvQkFBb0IsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPO1VBQ2xFLG9CQUFvQixXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTO1VBQzFFLDBCQUEwQixXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQ2pILENBQUM7SUFDRixJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ1osSUFBQSxzQ0FBdUIsRUFDbkIsNkNBQTZDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUU7Y0FDaEYsMkJBQTJCLFdBQVcsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSTtjQUMvRix5SEFBeUgsQ0FDOUgsQ0FBQztJQUNOLENBQUM7U0FBTSxDQUFDO1FBQ0osSUFBQSxzQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0FBQ0wsQ0FBQztBQUVELHVPQUF1TztBQUN2TyxTQUFTLHFCQUFxQjtJQUMxQixPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVNLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxNQUErQjs7SUFDbkUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDN0IsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBQSxnQ0FBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELDBGQUEwRjtJQUMxRixJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUEsMEJBQWEsR0FBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUUsc1JBQXNSO0lBQ3RSLElBQUksY0FBYyxHQUFHLENBQUMsYUFBYSxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDN0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsVUFBVSx3RUFBd0UsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxNQUFNLG9CQUFvQixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFULENBQUM7SUFDRCxNQUFNLGtCQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLElBQUksaUJBQWlCLEdBQUcsTUFBQSxNQUFNLENBQUMsc0JBQXNCLG1DQUFJLGlDQUFpQyxDQUFDO0lBQzNGLElBQUEscUNBQXNCLEVBQUM7UUFDbkIsTUFBTTtRQUNOLElBQUk7UUFDSixVQUFVO1FBQ1YsU0FBUyxFQUFFLEdBQUcsWUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUU7UUFDNUMsYUFBYSxFQUFFLFFBQVEscUJBQXFCLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDN0QsTUFBTSxFQUFFLGNBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0tBQy9CLENBQUMsQ0FBQztJQUVILHFDQUFpQixDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDeEMsK0JBQWMsQ0FBQyxNQUFNLENBQUMscUNBQWlCLENBQUMsQ0FBQztJQUN6QywrQkFBYyxDQUFDLE1BQU0sQ0FBQywyQ0FBdUIsQ0FBQyxDQUFDO0lBQy9DLDZWQUE2VjtJQUM3VixpU0FBaVM7SUFDalMsSUFBSSxjQUFjLEdBQUcsSUFBSSxHQUFHLGNBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZILCtCQUFjLENBQUMsa0JBQWtCLENBQUMsMkNBQXVCLEVBQUUsV0FBVyxFQUFFO1FBQ3BFLFlBQVksRUFBRSxDQUFDLFdBQVcsTUFBTSxJQUFJLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztLQUNoRSxDQUFDLENBQUM7SUFFSCw0S0FBNEs7SUFDNUssTUFBTSxjQUFjLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUMvRCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQzVCLEtBQUssY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2FBQ3hELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDakMsTUFBQSxNQUFDLFFBQW1DLEVBQUMsS0FBSyxrREFBSSxDQUFDO0lBRS9DLE1BQU0sSUFBQSx1QkFBVSxFQUFDO1FBQ2IsTUFBTTtRQUNOLElBQUk7UUFDSixZQUFZLEVBQUUsSUFBSTtRQUNsQixRQUFRLEVBQUUsRUFBRTtRQUNaLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsWUFBWSxFQUFFO1lBQ1YsZUFBZSxFQUFFLHdDQUF1QjtZQUN4QyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBQSxxQ0FBb0IsR0FBRSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxXQUFXLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEVBQUU7O2dCQUN2QyxJQUFJLFVBQVU7b0JBQUUsT0FBTztnQkFDdkIsSUFBQSxpQ0FBa0IsRUFBQyxhQUFhLENBQUMsQ0FBQztnQkFDbEMsSUFBQSwyQkFBVSxFQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLFNBQVMsR0FBRyxJQUFBLG9DQUFtQixHQUFFLENBQUM7Z0JBQ3RDLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLGFBQWEsK0JBQStCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSx3SEFBd0gsQ0FBQyxDQUFDO29CQUNyTyxJQUFBLG9DQUFxQixFQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE1BQUEsTUFBQyxLQUFnQyxFQUFDLEtBQUssa0RBQUksQ0FBQztZQUNoRCxDQUFDO1NBQ0o7S0FDSixDQUFDLENBQUM7QUFDUCxDQUFDO0FBakVELDhDQWlFQyIsInNvdXJjZXNDb250ZW50IjpbInByb2Nlc3MuZW52Lk5PREVfRU5WID0gXCJwcm9kdWN0aW9uXCI7XG5cbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnNwIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBnZXRFeHRlcm5hbElQIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbmV0d29ya2luZ1wiO1xuaW1wb3J0IHsgUmVxdWlyZUNvbnRyb2xsZXIgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3JlcXVpcmUvUmVxdWlyZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGhvc3RTZXJ2ZXIgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9ob3N0U2VydmVyXCI7XG5pbXBvcnQgeyBSZW1vdGVTdG9yYWdlQ29udHJvbGxlciB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBzZXRTdG9yYWdlU2VydmVyQ29uZmlnLCBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbiwgYWRkRXh0cmFMaXN0ZW5Qb3J0LCByZW1vdmVFeHRyYUxpc3RlblBvcnQgfSBmcm9tIFwiLi9zZXJ2ZXJDb25maWdcIjtcbmltcG9ydCB7IGRldGVjdERlcGxveVRha2VvdmVyLCBzZXRBbHRQb3J0LCBnZXRBbHRQb3J0TGlzdGVuRW5kLCBnZXRNYWluUG9ydEFjcXVpcmVEZWxheSB9IGZyb20gXCIuL2RlcGxveVRha2VvdmVyXCI7XG5pbXBvcnQgeyBwYXJzZVN0b3JhZ2VVcmwgfSBmcm9tIFwiLi9BcmNoaXZlc1JlbW90ZVwiO1xuLy8gSW1wb3J0IGJyb3dzZXIgY29kZSwgc28gaXQgaXMgYWxsb3dlZCB0byBiZSByZXF1aXJlZCBieSB0aGUgY2xpZW50XG5pbXBvcnQgXCIuL2FjY2Vzc1BhZ2VcIjtcblxuY29uc3QgREVGQVVMVF9MT1dfU1BBQ0VfVEhSRVNIT0xEX0JZVEVTID0gMjUgKiAxMDI0ICoqIDM7XG5jb25zdCBESVNLX1NQQUNFX0NIRUNLX0lOVEVSVkFMX01TID0gMTUgKiA2MCAqIDEwMDA7XG4vLyBCZWxvdyB0aGlzIGZyYWN0aW9uIG9mIHRoZSB3YXJuIHRocmVzaG9sZCwgd2Ugc3RhcnQgcmVqZWN0aW5nIHdyaXRlcyBzbyB0aGUgc2VydmVyIGl0c2VsZiBkb2Vzbid0IHRpcCB0aGUgbWFjaGluZSBpbnRvIGluc3RhYmlsaXR5LiBSZWFkcy9kZWxldGVzIHN0aWxsIHdvcmsgc28gdXNlcnMgY2FuIGZyZWUgc3BhY2UuXG5jb25zdCBIQVJEX1JFSkVDVF9GUkFDVElPTiA9IDAuMTtcblxuLy8gVGhpcyBtYWNoaW5lJ3MgTEFOIChpbnRlcm5hbCkgSVB2NCAtIHRoZSBhZGRyZXNzIG90aGVyIG1hY2hpbmVzIG9uIHRoZSBzYW1lIG5ldHdvcmsgcmVhY2ggdXMgYXQuIFVzZWQgd2l0aCAtLWludGVybmFsLCB3aGVyZSB0aGUgaXAtZG9tYWluIGlzIGJhc2VkIG9uIHRoZSBpbnRlcm5hbCBhZGRyZXNzIGluc3RlYWQgb2Ygb3VyIHB1YmxpYyBvbmUuXG5mdW5jdGlvbiBnZXRJbnRlcm5hbElQKCk6IHN0cmluZyB7XG4gICAgbGV0IGNhbmRpZGF0ZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgYWRkcnMgb2YgT2JqZWN0LnZhbHVlcyhvcy5uZXR3b3JrSW50ZXJmYWNlcygpKSkge1xuICAgICAgICBmb3IgKGxldCBhZGRyIG9mIGFkZHJzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoYWRkci5mYW1pbHkgIT09IFwiSVB2NFwiIHx8IGFkZHIuaW50ZXJuYWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGFkZHIuYWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYC0taW50ZXJuYWwgd2FzIHNldCwgYnV0IG5vIG5vbi1sb29wYmFjayBJUHY0IG5ldHdvcmsgaW50ZXJmYWNlIHdhcyBmb3VuZCB0byB1c2UgYXMgdGhlIGludGVybmFsIGFkZHJlc3NgKTtcbiAgICB9XG4gICAgLy8gUHJlZmVyIGEgcHJpdmF0ZS1yYW5nZSBhZGRyZXNzICh0aGUgYWN0dWFsIExBTiBpcCkgb3ZlciBhbnkgb3RoZXIgbm9uLWxvb3BiYWNrIGludGVyZmFjZVxuICAgIHJldHVybiBjYW5kaWRhdGVzLmZpbmQoaXAgPT4gL14oMTBcXC58MTkyXFwuMTY4XFwufDE3MlxcLigxWzYtOV18MlxcZHwzWzAxXSlcXC4pLy50ZXN0KGlwKSkgfHwgY2FuZGlkYXRlc1swXTtcbn1cblxuLy8gVGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZlciwgYXMgYSBsaWJyYXJ5IGZ1bmN0aW9uOiBjb25zdW1lcnMgY2FsbCBob3N0U3RvcmFnZVNlcnZlcigpIGZyb20gdGhlaXIgb3duIHByb2Nlc3MgdG8gc3RhcnQgaG9zdGluZyAob3IgdXNlIHRoZSBzdG9yYWdlc2VydmVyIGJpbiwgc2VlIHN0b3JhZ2VTZXJ2ZXJDbGkudHMpLiBUaGUgZ3JhbnRBY2Nlc3MuanMgYm9vdHN0cmFwIChuZXh0IHRvIHRoaXMgZmlsZSkgaXMgd2hhdCB0aGUgYWNjZXNzIHBhZ2UncyBzaG93biBTU0ggY29tbWFuZCBwb2ludHMgYXQuXG5cbmV4cG9ydCB0eXBlIEhvc3RTdG9yYWdlU2VydmVyQ29uZmlnID0ge1xuICAgIC8vIEZ1bGwgVVJMIG9mIHRoaXMgc3RvcmFnZSBzZXJ2ZXIsIGUuZy4gXCJodHRwczovLzEtMi0zLTQuZXhhbXBsZS5jb206NDQ0NFwiLiBUaGUgc3ViZG9tYWluIG11c3QgYmUgYW4gaXAgZG9tYWluIC0gdGhpcyBtYWNoaW5lJ3MgZXh0ZXJuYWwgSVAgd2l0aCBkYXNoZXMsIG9yIDEyNy0wLTAtMSBmb3IgbG9jYWwgdGVzdGluZyAoc2VlIHRoZSB2YWxpZGF0aW9uIGluIGhvc3RTdG9yYWdlU2VydmVyKS4gVGhlIGRvbWFpbiBhbmQgcG9ydCBhcmUgZXh0cmFjdGVkIGZyb20gaXQgKGJ1Y2tldCByb3V0aW5nIFVSTHMgY2xpZW50cyB1c2UgbG9vayBsaWtlXG4gICAgLy8gaHR0cHM6Ly8xLTItMy00LmV4YW1wbGUuY29tOjQ0NDQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvbikuXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgZm9sZGVyOiBzdHJpbmc7XG4gICAgLy8gV2hlbiBmcmVlIHNwYWNlIG9uIHRoZSBmb2xkZXIncyBkcml2ZSBkcm9wcyBiZWxvdyB0aGlzIG1hbnkgYnl0ZXMsIHRoZSBzZXJ2ZXIgY29uc29sZS5lcnJvcnMgZXZlcnkgMTUgbWludXRlcy4gQmVsb3cgMTAlIG9mIGl0LCB0aGUgc2VydmVyIGFsc28gcmVqZWN0cyB3cml0ZSBvcGVyYXRpb25zIChjcmVhdGluZyBmaWxlcywgbGFyZ2UgdXBsb2FkcywgbmV3IGJ1Y2tldHMpIOKAlCByZWFkcywgZmluZEluZm8sIGFuZCBkZWxldGVzIHN0aWxsIHdvcmsgc28gdGhlIHVzZXIgY2FuIGZyZWUgc3BhY2UuIERlZmF1bHQgMjUgR2lCLlxuICAgIGxvd1NwYWNlVGhyZXNob2xkQnl0ZXM/OiBudW1iZXI7XG4gICAgLy8gTEFOLW9ubHkgbW9kZTogZG8gTk9UIGZvcndhcmQgcG9ydHMgKG5vIFVQblAvTkFUIG1hcHBpbmcpLCBhbmQgdGhlIGlwLWRvbWFpbiBtdXN0IGJlIGJhc2VkIG9uIHRoaXMgbWFjaGluZSdzIElOVEVSTkFMIGlwdjQgKGl0cyBMQU4gYWRkcmVzcykgaW5zdGVhZCBvZiBpdHMgZXh0ZXJuYWwgaXAuIEZvciBhIHNlcnZlciBvdGhlciBtYWNoaW5lcyBvbmx5IHJlYWNoIG92ZXIgdGhlIGxvY2FsIG5ldHdvcmsuXG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIC8vIFNlcnZlIGEgc2VsZi1zaWduZWQgVExTIGNlcnQgc2lnbmVkIGJ5IHRoaXMgbWFjaGluZSdzIENBLCBpbnN0ZWFkIG9mIG9idGFpbmluZyBhIHJlYWwgKEFDTUUvQ2xvdWRmbGFyZSkgY2VydGlmaWNhdGUuIEZvciBhIGRvbWFpbiB3ZSBkb24ndCBjb250cm9sIEROUyBmb3IuIENsaWVudHMgdHJ1c3QgaXQgYnkgdHJ1c3Rpbmcgb3VyIENBLCBvciBieSB2aXNpdGluZyB0aGUgc2VydmVyIG9uY2UgYW5kIGFjY2VwdGluZyB0aGUgY2VydGlmaWNhdGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgc2VsZlNpZ25lZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCAqKiAzKS50b0ZpeGVkKDIpfSBHaUJgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0Rpc2tTcGFjZShjb25maWc6IHsgZm9sZGVyOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBmb2xkZXIsIHRocmVzaG9sZCB9ID0gY29uZmlnO1xuICAgIGxldCBzdGF0cyA9IGF3YWl0IGZzcC5zdGF0ZnMoZm9sZGVyKTtcbiAgICBsZXQgZnJlZSA9IE51bWJlcihzdGF0cy5iYXZhaWwpICogTnVtYmVyKHN0YXRzLmJzaXplKTtcbiAgICBsZXQgaGFyZExpbWl0ID0gdGhyZXNob2xkICogSEFSRF9SRUpFQ1RfRlJBQ1RJT047XG4gICAgaWYgKGZyZWUgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgIHNldFdyaXRlc1JlamVjdGVkUmVhc29uKHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHVuZGVyID0gdGhyZXNob2xkIC0gZnJlZTtcbiAgICBsZXQgcmVqZWN0aW5nID0gZnJlZSA8IGhhcmRMaW1pdDtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU3RvcmFnZSBmb2xkZXIgJHtmb2xkZXJ9IGlzIGxvdyBvbiBkaXNrOiAke2Zvcm1hdEJ5dGVzKGZyZWUpfSBmcmVlYFxuICAgICAgICArIGAgKHdhcm4gdGhyZXNob2xkICR7Zm9ybWF0Qnl0ZXModGhyZXNob2xkKX0sICR7Zm9ybWF0Qnl0ZXModW5kZXIpfSB1bmRlcjtgXG4gICAgICAgICsgYCBoYXJkLXJlamVjdCB0aHJlc2hvbGQgJHtmb3JtYXRCeXRlcyhoYXJkTGltaXQpfSR7cmVqZWN0aW5nID8gXCIsIFJFQUNIRUQg4oCUIHdyaXRlIG9wcyBub3cgcmVqZWN0ZWRcIiA6IFwiXCJ9KS5gXG4gICAgKTtcbiAgICBpZiAocmVqZWN0aW5nKSB7XG4gICAgICAgIHNldFdyaXRlc1JlamVjdGVkUmVhc29uKFxuICAgICAgICAgICAgYFN0b3JhZ2Ugc2VydmVyIGlzIG91dCBvZiBkaXNrIHNwYWNlOiBvbmx5ICR7Zm9ybWF0Qnl0ZXMoZnJlZSl9IGZyZWUgb24gJHtmb2xkZXJ9YFxuICAgICAgICAgICAgKyBgIChoYXJkLXJlamVjdCB0aHJlc2hvbGQgJHtmb3JtYXRCeXRlcyhoYXJkTGltaXQpfSwgd2FybiB0aHJlc2hvbGQgJHtmb3JtYXRCeXRlcyh0aHJlc2hvbGQpfSkuYFxuICAgICAgICAgICAgKyBgIFdyaXRlIG9wZXJhdGlvbnMgKGNyZWF0ZS9hcHBlbmQvbmV3IGJ1Y2tldCkgYXJlIHJlamVjdGVkOyByZWFkcywgZmluZEluZm8sIGFuZCBkZWxldGVzIHN0aWxsIHdvcmsg4oCUIHBsZWFzZSBmcmVlIHNwYWNlLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbih1bmRlZmluZWQpO1xuICAgIH1cbn1cblxuLy8gRnVsbCBwYXRoIHRvIHRoZSBncmFudEFjY2VzcyBDTEkgYm9vdHN0cmFwIHRoYXQgbGl2ZXMgbmV4dCB0byB0aGlzIGZpbGUuIFRoZSBTU0ggY29tbWFuZCBzaG93biBvbiB0aGUgYWNjZXNzIHBhZ2UgaW52b2tlcyBpdCB2aWEgYG5vZGUgPHBhdGg+IC4uLmAgKGZvdW5kIHRocm91Z2ggX19kaXJuYW1lIHNvIGNvbnN1bWVycyBkb24ndCBoYXZlIHRvIGtub3cgd2hlcmUgb3VyIHNvdXJjZSBsaXZlcykuXG5mdW5jdGlvbiBnZXRHcmFudEFjY2Vzc0NsaVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKF9fZGlybmFtZSwgXCJncmFudEFjY2Vzcy5qc1wiKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhvc3RTdG9yYWdlU2VydmVyKGNvbmZpZzogSG9zdFN0b3JhZ2VTZXJ2ZXJDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyB1cmwsIGZvbGRlciB9ID0gY29uZmlnO1xuICAgIGxldCB7IGFkZHJlc3M6IGRvbWFpbiwgcG9ydCB9ID0gcGFyc2VTdG9yYWdlVXJsKHVybCk7XG4gICAgbGV0IHJvb3REb21haW4gPSBkb21haW4uc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcbiAgICAvLyBXaXRoIC0taW50ZXJuYWwgdGhlIGlwLWRvbWFpbiBpcyBiYXNlZCBvbiBvdXIgTEFOIGFkZHJlc3M7IG90aGVyd2lzZSBvbiBvdXIgZXh0ZXJuYWwgaXBcbiAgICBsZXQgaXAgPSBjb25maWcuaW50ZXJuYWwgPyBnZXRJbnRlcm5hbElQKCkgOiAoYXdhaXQgZ2V0RXh0ZXJuYWxJUCgpKS50cmltKCk7XG4gICAgLy8gVGhlIHN1YmRvbWFpbiBtdXN0IGJlIGFuIGlwIGRvbWFpbjogdGhlIGRvbWFpbidzIEEgcmVjb3JkIHBvaW50cyBhdCBleGFjdGx5IG9uZSBtYWNoaW5lLCBzbyBhIGR5bmFtaWMgbmFtZSB3b3VsZCBsZXQgdGhlIHNhbWUgc2NyaXB0IHJ1biBvbiB0d28gc2VydmVycyBhbmQgc2lsZW50bHkgZmlnaHQgb3ZlciBpdC4gRW5jb2RpbmcgdGhlIElQIG1ha2VzIHRoYXQgbWlzdGFrZSBmYWlsIGxvdWRseSAtIHRoZSB3cm9uZyBtYWNoaW5lJ3MgZG9tYWluIGp1c3QgZG9lc24ndCBtYXRjaC5cbiAgICBsZXQgYWxsb3dlZERvbWFpbnMgPSBbYDEyNy0wLTAtMS4ke3Jvb3REb21haW59YCwgYCR7aXAucmVwbGFjZUFsbChcIi5cIiwgXCItXCIpfS4ke3Jvb3REb21haW59YF07XG4gICAgaWYgKCFhbGxvd2VkRG9tYWlucy5pbmNsdWRlcyhkb21haW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHN0b3JhZ2Ugc2VydmVyIGRvbWFpbiBpcyBiYXNlZCBvbiB0aGUgbWFjaGluZSdzICR7Y29uZmlnLmludGVybmFsID8gXCJJTlRFUk5BTCAoTEFOKVwiIDogXCJleHRlcm5hbFwifSBJUCAodGhlIHN1YmRvbWFpbiBpcyB0aGUgSVAgd2l0aCBkb3RzIHJlcGxhY2VkIGJ5IGRhc2hlcykuIEV4cGVjdGVkICR7YWxsb3dlZERvbWFpbnMuam9pbihcIiBvciBcIil9LCB3YXMgJHtkb21haW59LiBUaGlzIG1hY2hpbmUncyAke2NvbmZpZy5pbnRlcm5hbCA/IFwiaW50ZXJuYWxcIiA6IFwiZXh0ZXJuYWxcIn0gSVAgaXMgJHtpcH0uYCk7XG4gICAgfVxuICAgIGF3YWl0IGZzcC5ta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBsb3dTcGFjZVRocmVzaG9sZCA9IGNvbmZpZy5sb3dTcGFjZVRocmVzaG9sZEJ5dGVzID8/IERFRkFVTFRfTE9XX1NQQUNFX1RIUkVTSE9MRF9CWVRFUztcbiAgICBzZXRTdG9yYWdlU2VydmVyQ29uZmlnKHtcbiAgICAgICAgZG9tYWluLFxuICAgICAgICBwb3J0LFxuICAgICAgICByb290RG9tYWluLFxuICAgICAgICBzc2hUYXJnZXQ6IGAke29zLnVzZXJJbmZvKCkudXNlcm5hbWV9QCR7aXB9YCxcbiAgICAgICAgc2VydmVyQ29tbWFuZDogYG5vZGUgJHtnZXRHcmFudEFjY2Vzc0NsaVBhdGgoKX0gLS11cmwgJHt1cmx9YCxcbiAgICAgICAgZm9sZGVyOiBwYXRoLnJlc29sdmUoZm9sZGVyKSxcbiAgICB9KTtcblxuICAgIFJlcXVpcmVDb250cm9sbGVyLmFsbG93QWxsTm9kZU1vZHVsZXMoKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5leHBvc2UoUmVxdWlyZUNvbnRyb2xsZXIpO1xuICAgIFNvY2tldEZ1bmN0aW9uLmV4cG9zZShSZW1vdGVTdG9yYWdlQ29udHJvbGxlcik7XG4gICAgLy8gRXZlcnkgSFRUUCBwYXRoIGdvZXMgdGhyb3VnaCBodHRwRW50cnk6IC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vLi4uIHNlcnZlcyBwdWJsaWMgYnVja2V0IGZpbGVzLCBldmVyeXRoaW5nIGVsc2Ugc2VydmVzIHRoZSBhY2Nlc3MgcGFnZSAodGhlIHBhdGggaXMgdGhlIGFjY291bnQgbmFtZSwgc2VlIGFjY2Vzc1BhZ2UudHN4KS4gQSBmdWxsIFVSTCwgc28gdGhlIHBhZ2UgcmVzb2x2ZXMgbW9kdWxlcyBmcm9tIHRoZSBvcmlnaW4gcm9vdCBldmVuIHdoZW4gc2VydmVkIGF0IC9hY2NvdW50TmFtZSAoYSByZWxhdGl2ZSByZXF1aXJlIHdvdWxkIHJlc29sdmUgaW5zaWRlIHRoZSBhY2NvdW50IHBhdGgpLlxuICAgIC8vIFRoZSBtb2R1bGUgcGF0aCBpcyByZXNvbHZlZCBzZXJ2ZXItc2lkZSBhZ2FpbnN0IGl0cyB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggaXMgdGhlIEhPU1QgYXBwbGljYXRpb24ncyBmb2xkZXIgLSBzbyBpdCBpcyBjb21wdXRlZCBmcm9tIHdoZXJlIHRoaXMgZmlsZSBhY3R1YWxseSBpcywgaW5zdGVhZCBvZiBhc3N1bWluZyB0aGUgc3RvcmFnZSBzZXJ2ZXIgcnVucyBmcm9tIGluc2lkZSBzbGlmdHV0aWxzIChpbiBhIGhvc3QgYXBwIGl0IGxpdmVzIHVuZGVyIG5vZGVfbW9kdWxlcy9zbGlmdHV0aWxzKS5cbiAgICBsZXQgYWNjZXNzUGFnZVBhdGggPSBcIi4vXCIgKyBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiYWNjZXNzUGFnZS50c3hcIikpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5zZXREZWZhdWx0SFRUUENhbGwoUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFwiaHR0cEVudHJ5XCIsIHtcbiAgICAgICAgcmVxdWlyZUNhbGxzOiBbYGh0dHBzOi8vJHtkb21haW59OiR7cG9ydH0vJHthY2Nlc3NQYWdlUGF0aH1gXSxcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWwgY2hlY2sgc28gYSBzZXJ2ZXIgc3RhcnRpbmcgdW5kZXItbGltaXQgaW1tZWRpYXRlbHkgcmVqZWN0cyB3cml0ZXM7IHRoZW4ga2VlcCBjaGVja2luZyBldmVyeSAxNSBtaW51dGVzIHNvIHJlY292ZXJ5IChmcmVlZCBkaXNrIHNwYWNlKSBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseS5cbiAgICBhd2FpdCBjaGVja0Rpc2tTcGFjZSh7IGZvbGRlciwgdGhyZXNob2xkOiBsb3dTcGFjZVRocmVzaG9sZCB9KTtcbiAgICBsZXQgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHZvaWQgY2hlY2tEaXNrU3BhY2UoeyBmb2xkZXIsIHRocmVzaG9sZDogbG93U3BhY2VUaHJlc2hvbGQgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoYERpc2sgc3BhY2UgY2hlY2sgZmFpbGVkIGZvciAke2ZvbGRlcn06YCwgZSkpO1xuICAgIH0sIERJU0tfU1BBQ0VfQ0hFQ0tfSU5URVJWQUxfTVMpO1xuICAgIChpbnRlcnZhbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG5cbiAgICBhd2FpdCBob3N0U2VydmVyKHtcbiAgICAgICAgZG9tYWluLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzZXRETlNSZWNvcmQ6IHRydWUsXG4gICAgICAgIHB1YmxpY0lwOiBpcCxcbiAgICAgICAgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCxcbiAgICAgICAgc2VsZlNpZ25lZDogY29uZmlnLnNlbGZTaWduZWQsXG4gICAgICAgIHBvcnRGYWxsYmFjazoge1xuICAgICAgICAgICAgZ2V0QWNxdWlyZURlbGF5OiBnZXRNYWluUG9ydEFjcXVpcmVEZWxheSxcbiAgICAgICAgICAgIG9uUG9ydEluVXNlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGV0ZWN0RGVwbG95VGFrZW92ZXIoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkxpc3RlbmluZzogKGxpc3RlbmluZ1BvcnQsIGlzTWFpblBvcnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUG9ydCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGFkZEV4dHJhTGlzdGVuUG9ydChsaXN0ZW5pbmdQb3J0KTtcbiAgICAgICAgICAgICAgICBzZXRBbHRQb3J0KGxpc3RlbmluZ1BvcnQpO1xuICAgICAgICAgICAgICAgIGxldCBsaXN0ZW5FbmQgPSBnZXRBbHRQb3J0TGlzdGVuRW5kKCk7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBbHRlcm5hdGUgcG9ydCAke2xpc3RlbmluZ1BvcnR9IHJlYWNoZWQgaXRzIGVuZCBvZiBsaWZlIGF0ICR7bmV3IERhdGUobGlzdGVuRW5kKS50b0lTT1N0cmluZygpfTsgaXQgbm8gbG9uZ2VyIGNvdW50cyBhcyBvbmUgb2Ygb3VyIGFkZHJlc3NlcyAodGhlIHNvY2tldCBpdHNlbGYgc3RheXMgYm91bmQsIGFzIHRoZSBtYWluLXBvcnQgcmVsYXkgZm9yd2FyZHMgaW50byBpdClgKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0cmFMaXN0ZW5Qb3J0KGxpc3RlbmluZ1BvcnQpO1xuICAgICAgICAgICAgICAgIH0sIE1hdGgubWF4KDAsIGxpc3RlbkVuZCAtIERhdGUubm93KCkpKTtcbiAgICAgICAgICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiJdfQ==
139
+ /* _JS_SOURCE_HASH = "333d9bdcaea0a50224e7eaee9ea2f77f03da4f95589b72d688b74706524a0678"; */
@@ -1,4 +1,4 @@
1
- "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  const storageServer_1 = require("./storageServer");
4
4
  const cliArgs_1 = require("./cliArgs");
@@ -28,11 +28,15 @@ async function main() {
28
28
  url,
29
29
  folder,
30
30
  lowSpaceThresholdBytes,
31
+ // Do not forward ports, and base the ip-domain on our internal LAN ip instead of our external ip (for LAN-only servers behind a NAT we can't/won't open)
32
+ internal: (0, cliArgs_1.getFlag)("internal"),
33
+ // Serve a self-signed TLS cert signed by this machine's CA instead of getting a real (ACME) one - for servers without a Cloudflare-managed domain. Clients trust it by trusting the CA, or by visiting the server once and accepting the certificate.
34
+ selfSigned: (0, cliArgs_1.getFlag)("selfSigned"),
31
35
  });
32
36
  }
33
37
  main().catch(e => {
34
38
  console.error(e);
35
39
  process.exit(1);
36
40
  });
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlckNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0b3JhZ2VTZXJ2ZXJDbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtREFBb0Q7QUFDcEQsdUNBQW1DO0FBRW5DLDhGQUE4RjtBQUU5RixPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDdkMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6RCxDQUFDLENBQUMsQ0FBQztBQUNILE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQyxDQUFDO0FBRUgsS0FBSyxVQUFVLElBQUk7SUFDZixJQUFJLEdBQUcsR0FBRyxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsSUFBSSxDQUFDLEdBQUc7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7SUFDNUYsSUFBSSxNQUFNLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQ3hGLElBQUksc0JBQTBDLENBQUM7SUFDL0MsSUFBSSxpQkFBaUIsR0FBRyxJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNwRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDcEIsc0JBQXNCLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztRQUM1QyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBQSxpQ0FBaUIsRUFBQztRQUNwQixHQUFHO1FBQ0gsTUFBTTtRQUNOLHNCQUFzQjtLQUN6QixDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaG9zdFN0b3JhZ2VTZXJ2ZXIgfSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbi8vIEhvc3RzIGEgc3RvcmFnZSBzZXJ2ZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lICh2aWEgdGhlIHN0b3JhZ2VzZXJ2ZXIgYmluLCBzZWUgcGFja2FnZS5qc29uKS5cblxucHJvY2Vzcy5vbihcInVuaGFuZGxlZFJlamVjdGlvblwiLCAoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uOlwiLCBlcnJvcik7XG59KTtcbnByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLCAoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5jYXVnaHQgZXhjZXB0aW9uOlwiLCBlcnJvcik7XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgICBsZXQgdXJsID0gZ2V0QXJnKFwidXJsXCIpO1xuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoYC0tdXJsIGlzIHJlcXVpcmVkIChleDogLS11cmwgaHR0cHM6Ly9zdG9yYWdlLmV4YW1wbGUuY29tOjQ0NDQpYCk7XG4gICAgbGV0IGZvbGRlciA9IGdldEFyZyhcImZvbGRlclwiKTtcbiAgICBpZiAoIWZvbGRlcikgdGhyb3cgbmV3IEVycm9yKGAtLWZvbGRlciBpcyByZXF1aXJlZCAodGhlIGZvbGRlciBhbGwgZGF0YSBpcyBzdG9yZWQgaW4pYCk7XG4gICAgbGV0IGxvd1NwYWNlVGhyZXNob2xkQnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbG93U3BhY2VUaHJlc2hvbGQgPSBnZXRBcmcoXCJsb3dTcGFjZVRocmVzaG9sZFwiKTtcbiAgICBpZiAobG93U3BhY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgbG93U3BhY2VUaHJlc2hvbGRCeXRlcyA9ICtsb3dTcGFjZVRocmVzaG9sZDtcbiAgICAgICAgaWYgKGlzTmFOKGxvd1NwYWNlVGhyZXNob2xkQnl0ZXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYC0tbG93U3BhY2VUaHJlc2hvbGQgbXVzdCBiZSBhIG51bWJlciBvZiBieXRlcywgd2FzICR7SlNPTi5zdHJpbmdpZnkobG93U3BhY2VUaHJlc2hvbGQpfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgaG9zdFN0b3JhZ2VTZXJ2ZXIoe1xuICAgICAgICB1cmwsXG4gICAgICAgIGZvbGRlcixcbiAgICAgICAgbG93U3BhY2VUaHJlc2hvbGRCeXRlcyxcbiAgICB9KTtcbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG4iXX0//=
38
- /* _JS_SOURCE_HASH = "91d8a145cdce64ce31ec5f501945a4e439be44d4411fda9245ab3a76871ccb87"; */
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlckNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0b3JhZ2VTZXJ2ZXJDbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtREFBb0Q7QUFDcEQsdUNBQTRDO0FBRTVDLDhGQUE4RjtBQUU5RixPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDdkMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6RCxDQUFDLENBQUMsQ0FBQztBQUNILE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQyxDQUFDO0FBRUgsS0FBSyxVQUFVLElBQUk7SUFDZixJQUFJLEdBQUcsR0FBRyxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsSUFBSSxDQUFDLEdBQUc7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7SUFDNUYsSUFBSSxNQUFNLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQ3hGLElBQUksc0JBQTBDLENBQUM7SUFDL0MsSUFBSSxpQkFBaUIsR0FBRyxJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNwRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDcEIsc0JBQXNCLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztRQUM1QyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBQSxpQ0FBaUIsRUFBQztRQUNwQixHQUFHO1FBQ0gsTUFBTTtRQUNOLHNCQUFzQjtRQUN0Qix5SkFBeUo7UUFDekosUUFBUSxFQUFFLElBQUEsaUJBQU8sRUFBQyxVQUFVLENBQUM7UUFDN0Isc1BBQXNQO1FBQ3RQLFVBQVUsRUFBRSxJQUFBLGlCQUFPLEVBQUMsWUFBWSxDQUFDO0tBQ3BDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob3N0U3RvcmFnZVNlcnZlciB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJcIjtcbmltcG9ydCB7IGdldEFyZywgZ2V0RmxhZyB9IGZyb20gXCIuL2NsaUFyZ3NcIjtcblxuLy8gSG9zdHMgYSBzdG9yYWdlIHNlcnZlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKHZpYSB0aGUgc3RvcmFnZXNlcnZlciBiaW4sIHNlZSBwYWNrYWdlLmpzb24pLlxuXG5wcm9jZXNzLm9uKFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsIChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb246XCIsIGVycm9yKTtcbn0pO1xucHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJVbmNhdWdodCBleGNlcHRpb246XCIsIGVycm9yKTtcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIGxldCB1cmwgPSBnZXRBcmcoXCJ1cmxcIik7XG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcihgLS11cmwgaXMgcmVxdWlyZWQgKGV4OiAtLXVybCBodHRwczovL3N0b3JhZ2UuZXhhbXBsZS5jb206NDQ0NClgKTtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB0aHJvdyBuZXcgRXJyb3IoYC0tZm9sZGVyIGlzIHJlcXVpcmVkICh0aGUgZm9sZGVyIGFsbCBkYXRhIGlzIHN0b3JlZCBpbilgKTtcbiAgICBsZXQgbG93U3BhY2VUaHJlc2hvbGRCeXRlczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsb3dTcGFjZVRocmVzaG9sZCA9IGdldEFyZyhcImxvd1NwYWNlVGhyZXNob2xkXCIpO1xuICAgIGlmIChsb3dTcGFjZVRocmVzaG9sZCkge1xuICAgICAgICBsb3dTcGFjZVRocmVzaG9sZEJ5dGVzID0gK2xvd1NwYWNlVGhyZXNob2xkO1xuICAgICAgICBpZiAoaXNOYU4obG93U3BhY2VUaHJlc2hvbGRCeXRlcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgLS1sb3dTcGFjZVRocmVzaG9sZCBtdXN0IGJlIGEgbnVtYmVyIG9mIGJ5dGVzLCB3YXMgJHtKU09OLnN0cmluZ2lmeShsb3dTcGFjZVRocmVzaG9sZCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBob3N0U3RvcmFnZVNlcnZlcih7XG4gICAgICAgIHVybCxcbiAgICAgICAgZm9sZGVyLFxuICAgICAgICBsb3dTcGFjZVRocmVzaG9sZEJ5dGVzLFxuICAgICAgICAvLyBEbyBub3QgZm9yd2FyZCBwb3J0cywgYW5kIGJhc2UgdGhlIGlwLWRvbWFpbiBvbiBvdXIgaW50ZXJuYWwgTEFOIGlwIGluc3RlYWQgb2Ygb3VyIGV4dGVybmFsIGlwIChmb3IgTEFOLW9ubHkgc2VydmVycyBiZWhpbmQgYSBOQVQgd2UgY2FuJ3Qvd29uJ3Qgb3BlbilcbiAgICAgICAgaW50ZXJuYWw6IGdldEZsYWcoXCJpbnRlcm5hbFwiKSxcbiAgICAgICAgLy8gU2VydmUgYSBzZWxmLXNpZ25lZCBUTFMgY2VydCBzaWduZWQgYnkgdGhpcyBtYWNoaW5lJ3MgQ0EgaW5zdGVhZCBvZiBnZXR0aW5nIGEgcmVhbCAoQUNNRSkgb25lIC0gZm9yIHNlcnZlcnMgd2l0aG91dCBhIENsb3VkZmxhcmUtbWFuYWdlZCBkb21haW4uIENsaWVudHMgdHJ1c3QgaXQgYnkgdHJ1c3RpbmcgdGhlIENBLCBvciBieSB2aXNpdGluZyB0aGUgc2VydmVyIG9uY2UgYW5kIGFjY2VwdGluZyB0aGUgY2VydGlmaWNhdGUuXG4gICAgICAgIHNlbGZTaWduZWQ6IGdldEZsYWcoXCJzZWxmU2lnbmVkXCIpLFxuICAgIH0pO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcbiJdfQ=//=
42
+ /* _JS_SOURCE_HASH = "864a13df5159808c0df9ae94e067b40daaba22b7dff0745325980181a8539d1a"; */