sliftutils 1.7.9 → 1.7.11

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 (92) hide show
  1. package/bin/storageserver.js +4 -0
  2. package/{teststorage → examplestorage}/browser.tsx +18 -22
  3. package/{teststorage/server.ts → examplestorage/exampleserver.ts} +4 -6
  4. package/index.d.ts +770 -84
  5. package/misc/dist/environment.ts.cache +3 -3
  6. package/misc/dist/getSecret.ts.cache +139 -0
  7. package/misc/dist/strings.ts.cache +13 -0
  8. package/misc/dist/zip.ts.cache +9 -0
  9. package/misc/getSecret.ts +38 -16
  10. package/misc/https/cloudflareHelpers.d.ts +19 -0
  11. package/misc/https/cloudflareHelpers.ts +69 -0
  12. package/misc/https/dist/certs.ts.cache +115 -179
  13. package/misc/https/dist/cloudflareHelpers.ts.cache +68 -0
  14. package/misc/https/dist/dns.ts.cache +112 -100
  15. package/misc/https/dist/hostServer.ts.cache +130 -0
  16. package/misc/https/dist/httpsCerts.ts.cache +24 -5
  17. package/misc/https/dist/persistentLocalStorage.ts.cache +3 -2
  18. package/misc/https/dns.d.ts +41 -8
  19. package/misc/https/dns.ts +104 -106
  20. package/misc/https/hostServer.d.ts +0 -3
  21. package/misc/https/hostServer.ts +12 -8
  22. package/package.json +3 -2
  23. package/render-utils/dist/observer.tsx.cache +3 -2
  24. package/spec.txt +0 -55
  25. package/storage/ArchivesDisk.d.ts +67 -0
  26. package/storage/ArchivesDisk.ts +369 -0
  27. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +1242 -0
  28. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +513 -0
  29. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +352 -0
  30. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +306 -0
  31. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +435 -0
  32. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +58 -0
  33. package/storage/BulkDatabase2/dist/blockCache.ts.cache +179 -0
  34. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +149 -0
  35. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +101 -0
  36. package/storage/BulkDatabase2/dist/streamLog.ts.cache +227 -0
  37. package/storage/BulkDatabase2/dist/syncClient.ts.cache +104 -0
  38. package/storage/IArchives.d.ts +127 -1
  39. package/storage/IArchives.ts +201 -1
  40. package/storage/backblaze.d.ts +29 -2
  41. package/storage/backblaze.ts +214 -78
  42. package/storage/dist/ArchivesDisk.ts.cache +373 -0
  43. package/storage/dist/FileFolderAPI.tsx.cache +508 -65
  44. package/storage/dist/IArchives.ts.cache +44 -0
  45. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +8 -2
  46. package/storage/dist/JSONStorage.ts.cache +6 -2
  47. package/storage/dist/PendingManager.tsx.cache +1 -1
  48. package/storage/dist/TransactionStorage.ts.cache +231 -92
  49. package/storage/dist/backblaze.ts.cache +797 -0
  50. package/storage/dist/fileSystemPointer.ts.cache +36 -3
  51. package/storage/dist/remoteFileStorage.ts.cache +495 -0
  52. package/storage/remoteStorage/ArchivesRemote.d.ts +34 -18
  53. package/storage/remoteStorage/ArchivesRemote.ts +85 -65
  54. package/storage/remoteStorage/ArchivesUrl.d.ts +48 -0
  55. package/storage/remoteStorage/ArchivesUrl.ts +86 -0
  56. package/storage/remoteStorage/accessPage.tsx +111 -28
  57. package/storage/remoteStorage/blobStore.d.ts +128 -25
  58. package/storage/remoteStorage/blobStore.ts +757 -290
  59. package/storage/remoteStorage/cliArgs.d.ts +1 -0
  60. package/storage/remoteStorage/cliArgs.ts +9 -0
  61. package/storage/remoteStorage/createArchives.d.ts +85 -0
  62. package/storage/remoteStorage/createArchives.ts +612 -0
  63. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +197 -0
  64. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +85 -0
  65. package/storage/remoteStorage/dist/accessPage.tsx.cache +222 -0
  66. package/storage/remoteStorage/dist/blobStore.ts.cache +837 -0
  67. package/storage/remoteStorage/dist/cliArgs.ts.cache +16 -0
  68. package/storage/remoteStorage/dist/createArchives.ts.cache +610 -0
  69. package/storage/remoteStorage/dist/remoteConfig.ts.cache +206 -0
  70. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +223 -0
  71. package/storage/remoteStorage/dist/storageController.ts.cache +500 -0
  72. package/storage/remoteStorage/dist/storageServer.ts.cache +106 -0
  73. package/storage/remoteStorage/dist/storageServerCli.ts.cache +39 -0
  74. package/storage/remoteStorage/dist/storageServerState.ts.cache +518 -0
  75. package/storage/remoteStorage/grantAccess.js +4 -0
  76. package/storage/remoteStorage/grantAccessCli.d.ts +1 -0
  77. package/storage/remoteStorage/grantAccessCli.ts +27 -0
  78. package/storage/remoteStorage/remoteConfig.d.ts +29 -0
  79. package/storage/remoteStorage/remoteConfig.ts +194 -0
  80. package/storage/remoteStorage/sourceWrapper.d.ts +41 -0
  81. package/storage/remoteStorage/sourceWrapper.ts +223 -0
  82. package/storage/remoteStorage/spec.md +31 -0
  83. package/storage/remoteStorage/storageController.d.ts +30 -27
  84. package/storage/remoteStorage/storageController.ts +297 -159
  85. package/storage/remoteStorage/storageServer.d.ts +6 -0
  86. package/storage/remoteStorage/storageServer.ts +88 -94
  87. package/storage/remoteStorage/storageServerCli.d.ts +1 -0
  88. package/storage/remoteStorage/storageServerCli.ts +38 -0
  89. package/storage/remoteStorage/storageServerState.d.ts +43 -0
  90. package/storage/remoteStorage/storageServerState.ts +540 -0
  91. package/testsite/server.ts +0 -2
  92. package/yarn.lock +11 -6
@@ -1,4 +1,4 @@
1
- "use strict";
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";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
29
- exports.getHTTPSCert = void 0;
29
+ exports.generateCert = exports.normalizeCertToPEM = exports.parseCert = exports.getAccountKey = exports.getHTTPSCert = void 0;
30
30
  const dns_1 = require("./dns");
31
31
  const caching_1 = require("socket-function/src/caching");
32
32
  const forge = __importStar(require("node-forge"));
@@ -37,6 +37,17 @@ const misc_1 = require("socket-function/src/misc");
37
37
  const batching_1 = require("socket-function/src/batching");
38
38
  const fs_1 = __importDefault(require("fs"));
39
39
  const persistentLocalStorage_1 = require("./persistentLocalStorage");
40
+ // For example:
41
+ /*
42
+ let domain = "querysubtest.com";
43
+ await loadIdentityCA(domain);
44
+
45
+ let listenPublic = false;
46
+ let port = 9823;
47
+ let localDomain = "127-0-0-1." + domain;
48
+ await addRecord("A", localDomain, "127.0.0.1");
49
+ let keyCert = await getHTTPSCert(domain);
50
+ */
40
51
  // Expire EXPIRATION_THRESHOLD% of the way through the certificate's lifetime
41
52
  const EXPIRATION_THRESHOLD = 0.4;
42
53
  /** NOTE: We also generate the domain *.domain */
@@ -44,6 +55,10 @@ exports.getHTTPSCert = (0, caching_1.cache)(async (domain) => {
44
55
  if (!domain.endsWith(".")) {
45
56
  domain = domain + ".";
46
57
  }
58
+ // No matter what, reset this from the in-memory cache in an hour. This is fine. We'll just see the cache on disk and see that it hasn't expired. Or we might see that it has expired, and then we will get the new value.
59
+ setTimeout(() => {
60
+ exports.getHTTPSCert.clear(domain);
61
+ }, misc_1.timeInHour);
47
62
  let keyCert;
48
63
  let path = domain + ".cert";
49
64
  try {
@@ -68,7 +83,7 @@ exports.getHTTPSCert = (0, caching_1.cache)(async (domain) => {
68
83
  if (keyCert) {
69
84
  return keyCert;
70
85
  }
71
- const accountKey = await getAccountKey(domain);
86
+ const accountKey = await (0, exports.getAccountKey)(domain);
72
87
  let altDomains = [];
73
88
  // altDomains.push("noproxy." + domain);
74
89
  // // NOTE: Allowing local access is just an optimization, not to avoid having to forward ports
@@ -107,9 +122,11 @@ const getAccountKey = async function getAccountKey(domain) {
107
122
  }
108
123
  return secret;
109
124
  };
125
+ exports.getAccountKey = getAccountKey;
110
126
  function parseCert(PEMorDER) {
111
127
  return forge.pki.certificateFromPem(normalizeCertToPEM(PEMorDER));
112
128
  }
129
+ exports.parseCert = parseCert;
113
130
  function normalizeCertToPEM(PEMorDER) {
114
131
  if (PEMorDER.toString().startsWith("-----BEGIN CERTIFICATE-----")) {
115
132
  return PEMorDER.toString();
@@ -117,6 +134,7 @@ function normalizeCertToPEM(PEMorDER) {
117
134
  PEMorDER = PEMorDER.toString("base64");
118
135
  return "-----BEGIN CERTIFICATE-----\n" + PEMorDER + "\n-----END CERTIFICATE-----";
119
136
  }
137
+ exports.normalizeCertToPEM = normalizeCertToPEM;
120
138
  async function generateCert(config) {
121
139
  let { accountKey, domain } = config;
122
140
  console.log((0, logColors_1.magenta)(`Generating new cert for ${domain}`));
@@ -177,5 +195,6 @@ async function generateCert(config) {
177
195
  cert: cert,
178
196
  };
179
197
  }
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNDZXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImh0dHBzQ2VydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwrQkFBdUU7QUFDdkUseURBQTBEO0FBQzFELGtEQUFvQztBQUNwQyw4REFBK0I7QUFDL0Isd0VBQXdFO0FBQ3hFLGtFQUFtRjtBQUNuRixtREFBd0Q7QUFDeEQsMkRBQXFEO0FBQ3JELDRDQUFvQjtBQUNwQixxRUFBdUQ7QUFHdkQsNkVBQTZFO0FBQzdFLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRWpDLGlEQUFpRDtBQUNwQyxRQUFBLFlBQVksR0FBRyxJQUFBLGVBQUssRUFBQyxLQUFLLEVBQUUsTUFBYyxFQUEwQyxFQUFFO0lBQy9GLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksT0FBa0QsQ0FBQztJQUN2RCxJQUFJLElBQUksR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBRTVCLElBQUksQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFrQyxDQUFDO0lBQ3pGLENBQUM7SUFBQyxXQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ1gsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNWLHlFQUF5RTtRQUN6RSwyQkFBMkI7UUFDM0IsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLGNBQWMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLElB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LFVBQVU7UUFDbkIsR0FBRyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUU7UUFDOUIsSUFBSSxFQUFFLElBQUk7S0FDYixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgYWRkUmVjb3JkLCBkZWxldGVSZWNvcmQsIGdldFJlY29yZHMsIHNldFJlY29yZCB9IGZyb20gXCIuL2Ruc1wiO1xuaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgKiBhcyBmb3JnZSBmcm9tIFwibm9kZS1mb3JnZVwiO1xuaW1wb3J0IGFjbWUgZnJvbSBcImFjbWUtY2xpZW50XCI7XG5pbXBvcnQgeyBtYWdlbnRhLCByZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZVRpbWUsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZ2V0S2V5U3RvcmUgfSBmcm9tIFwiLi9wZXJzaXN0ZW50TG9jYWxTdG9yYWdlXCI7XG5cblxuLy8gRXhwaXJlIEVYUElSQVRJT05fVEhSRVNIT0xEJSBvZiB0aGUgd2F5IHRocm91Z2ggdGhlIGNlcnRpZmljYXRlJ3MgbGlmZXRpbWVcbmNvbnN0IEVYUElSQVRJT05fVEhSRVNIT0xEID0gMC40O1xuXG4vKiogTk9URTogV2UgYWxzbyBnZW5lcmF0ZSB0aGUgZG9tYWluICouZG9tYWluICovXG5leHBvcnQgY29uc3QgZ2V0SFRUUFNDZXJ0ID0gY2FjaGUoYXN5bmMgKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfT4gPT4ge1xuICAgIGlmICghZG9tYWluLmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICBkb21haW4gPSBkb21haW4gKyBcIi5cIjtcbiAgICB9XG4gICAgbGV0IGtleUNlcnQ6IHsga2V5OiBzdHJpbmc7IGNlcnQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCBwYXRoID0gZG9tYWluICsgXCIuY2VydFwiO1xuXG4gICAgdHJ5IHtcbiAgICAgICAga2V5Q2VydCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKSkgYXMgeyBrZXk6IHN0cmluZzsgY2VydDogc3RyaW5nIH07XG4gICAgfSBjYXRjaCB7IH1cbiAgICBpZiAoa2V5Q2VydCkge1xuICAgICAgICAvLyBJZiA0MCUgb2YgdGhlIGxpZmV0aW1lIGhhcyBwYXNzZWQsIHJlbmV3IGl0IChoYXMgdG8gYmUgPCB0aGUgdGhyZXNob2xkXG4gICAgICAgIC8vICBpbiBFZGdlQ2VydENvbnRyb2xsZXIpLlxuICAgICAgICBsZXQgY2VydE9iaiA9IHBhcnNlQ2VydChrZXlDZXJ0LmNlcnQpO1xuICAgICAgICBsZXQgZXhwaXJhdGlvblRpbWUgPSArbmV3IERhdGUoY2VydE9iai52YWxpZGl0eS5ub3RBZnRlcik7XG4gICAgICAgIGxldCBjcmVhdGVUaW1lID0gK25ldyBEYXRlKGNlcnRPYmoudmFsaWRpdHkubm90QmVmb3JlKTtcbiAgICAgICAgbGV0IHJlbmV3RGF0ZSA9IGNyZWF0ZVRpbWUgKyAoZXhwaXJhdGlvblRpbWUgLSBjcmVhdGVUaW1lKSAqIEVYUElSQVRJT05fVEhSRVNIT0xEO1xuICAgICAgICBpZiAocmVuZXdEYXRlIDwgRGF0ZS5ub3coKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWFnZW50YShgUmVuZXdpbmcgZG9tYWluICR7ZG9tYWlufSAocmVuZXcgdGFyZ2V0IGlzICR7Zm9ybWF0RGF0ZVRpbWUocmVuZXdEYXRlKX0pLmApKTtcbiAgICAgICAgICAgIGtleUNlcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBObyBjZXJ0IGZvdW5kIGZvciBkb21haW4gJHtkb21haW59LCBnZW5lcmF0aW5nIHNob3J0bHkuYCkpO1xuICAgIH1cbiAgICBpZiAoa2V5Q2VydCkge1xuICAgICAgICByZXR1cm4ga2V5Q2VydDtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NvdW50S2V5ID0gYXdhaXQgZ2V0QWNjb3VudEtleShkb21haW4pO1xuICAgIGxldCBhbHREb21haW5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gYWx0RG9tYWlucy5wdXNoKFwibm9wcm94eS5cIiArIGRvbWFpbik7XG4gICAgLy8gLy8gTk9URTogQWxsb3dpbmcgbG9jYWwgYWNjZXNzIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uLCBub3QgdG8gYXZvaWQgaGF2aW5nIHRvIGZvcndhcmQgcG9ydHNcbiAgICAvLyAvLyAgKHVubGVzcyB5b3UgdHlwZSAxMjctMC0wLTEuZG9tYWluIGludG8gdGhlIGJyb3dzZXIuLi4gdGhlbiBJIGd1ZXNzIHlvdSBkb24ndCBoYXZlIHRvIGZvcndhcmQgcG9ydHM/KVxuICAgIC8vIGFsdERvbWFpbnMucHVzaChcIjEyNy0wLTAtMS5cIiArIGRvbWFpbik7XG5cbiAgICAvLyBOT1RFOiBJIGZvcmdldCB3aHkgd2Ugd2VyZSBub3QgYWxsb3dpbmcgd2lsZGNhcmQgZG9tYWlucy4gSSB0aGluayBpdCB3YXMgdG8gcHJldmVudFxuICAgIC8vICBhbnkgSFRUUFMgZG9tYWlucyBmcm9tIGltcGVyc29uYXRpbmcgc2VydmVycy4gQnV0Li4uIHNlcnZlcnMgaGF2ZSB0d28gbGV2ZWxzLCBzbyB0aGF0IGlzbid0XG4gICAgLy8gIGFuIGlzc3VlLiBBbmQgZXZlbiBpZiB0aGV5IGRpZG4ndCB0aGV5IHN0b3JlIHRoZWlyIHB1YmxpYyBrZXkgaW4gdGhlaXIgZG9tYWluLCBzbyB5b3VcbiAgICAvLyAgY2FuJ3QgcmVhbGx5IGltcGVyc29uYXRlIHRoZW0gYW55d2F5cy4uLlxuICAgIC8vICAtIEFORCwgd2UgbmVlZCB0aGlzIGZvciBJUCB0eXBlIEEgcmVjb3Jkcywgd2hpY2guLi4gd2UgbmVlZCB0byBwaWNrIHRoZSBzZXJ2ZXIgd2Ugd2FudFxuICAgIC8vICAgICAgdG8gY29ubmVjdCB0by5cbiAgICBhbHREb21haW5zLnB1c2goXCIqLlwiICsgZG9tYWluKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGtleUNlcnQgPSBhd2FpdCBnZW5lcmF0ZUNlcnQoeyBhY2NvdW50S2V5LCBkb21haW4sIGFsdERvbWFpbnMgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoU3RyaW5nKGUpLmluY2x1ZGVzKFwiYXV0aG9yaXphdGlvbiBtdXN0IGJlIHBlbmRpbmdcIikpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBdXRob3JpemF0aW9uIGFwcGVhcnMgdG8gYmUgcGVuZGluZywgd2FpdGluZyAyIG1pbnV0ZXMgZm9yIG90aGVyIHByb2Nlc3MgdG8gY3JlYXRlIGNlcnRpZmljYXRlYCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSh0aW1lSW5NaW51dGUgKiAyKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZXRIVFRQU0NlcnQoZG9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aCwgSlNPTi5zdHJpbmdpZnkoa2V5Q2VydCkpO1xuICAgIHJldHVybiBrZXlDZXJ0O1xufSk7XG5cblxuY29uc3QgZ2V0QWNjb3VudEtleSA9IGFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRLZXkoZG9tYWluOiBzdHJpbmcpIHtcbiAgICBsZXQgYWNjb3VudEtleSA9IGdldEtleVN0b3JlPHN0cmluZz4oZG9tYWluLCBcImxldHNFbmNyeXB0QWNjb3VudEtleVwiKTtcbiAgICBsZXQgc2VjcmV0ID0gYXdhaXQgYWNjb3VudEtleS5nZXQoKTtcbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgICAvLyBTaG91bGQgb25seSBIQVBQRU4gT05DRSwgRVZFUiFcbiAgICAgICAgY29uc29sZS5lcnJvcihyZWQoYEdlbmVyYXRpbmcgbmV3IGxldHNlbmNyeXB0IGFjY291bnQga2V5YCkpO1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gZm9yZ2UucGtpLnJzYS5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgICAgc2VjcmV0ID0gZm9yZ2UucGtpLnByaXZhdGVLZXlUb1BlbShrZXlQYWlyLnByaXZhdGVLZXkpO1xuICAgICAgICBhd2FpdCBhY2NvdW50S2V5LnNldChzZWNyZXQpO1xuICAgIH1cbiAgICByZXR1cm4gc2VjcmV0O1xufTtcblxuXG5mdW5jdGlvbiBwYXJzZUNlcnQoUEVNb3JERVI6IHN0cmluZyB8IEJ1ZmZlcikge1xuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVGcm9tUGVtKG5vcm1hbGl6ZUNlcnRUb1BFTShQRU1vckRFUikpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDZXJ0VG9QRU0oUEVNb3JERVI6IHN0cmluZyB8IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgaWYgKFBFTW9yREVSLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVwiKSkge1xuICAgICAgICByZXR1cm4gUEVNb3JERVIudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgUEVNb3JERVIgPSBQRU1vckRFUi50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgICByZXR1cm4gXCItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cXG5cIiArIFBFTW9yREVSICsgXCJcXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXCI7XG59XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDZXJ0KGNvbmZpZzoge1xuICAgIGFjY291bnRLZXk6IHN0cmluZztcbiAgICBkb21haW46IHN0cmluZztcbiAgICBhbHREb21haW5zPzogc3RyaW5nW107XG59KTogUHJvbWlzZTx7XG4gICAgZG9tYWluczogc3RyaW5nW107XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY2VydDogc3RyaW5nO1xufT4ge1xuICAgIGxldCB7IGFjY291bnRLZXksIGRvbWFpbiB9ID0gY29uZmlnO1xuXG4gICAgY29uc29sZS5sb2cobWFnZW50YShgR2VuZXJhdGluZyBuZXcgY2VydCBmb3IgJHtkb21haW59YCkpO1xuXG4gICAgbGV0IGRvbWFpbkxpc3QgPSBbZG9tYWluLCAuLi5jb25maWcuYWx0RG9tYWlucyB8fCBbXV07XG4gICAgLy8gU3RyaXAgdHJhaWxpbmcgXCIuXCJcbiAgICBkb21haW5MaXN0ID0gZG9tYWluTGlzdC5tYXAoeCA9PiB4LmVuZHNXaXRoKFwiLlwiKSA/IHguc2xpY2UoMCwgLTEpIDogeCk7XG5cbiAgICBjb25zdCBbY2VydGlmaWNhdGVLZXksIGNlcnRpZmljYXRlQ3NyXSA9IGF3YWl0IGFjbWUuZm9yZ2UuY3JlYXRlQ3NyKHtcbiAgICAgICAgY29tbW9uTmFtZTogZG9tYWluTGlzdFswXSxcbiAgICAgICAgYWx0TmFtZXM6IGRvbWFpbkxpc3Quc2xpY2UoMSksXG4gICAgfSk7XG5cbiAgICAvLyBTby4uLiBhY21lLWNsaWVudCBpcyBmaW5lLiBKdXN0IHJlLWltcGxlbWVudCB0aGUgXCJhdXRvXCIgbW9kZSBvdXJzZWx2ZXMsIHRvIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgaXQuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IGFjbWUuQ2xpZW50KHtcbiAgICAgICAgZGlyZWN0b3J5VXJsOiBhY21lLmRpcmVjdG9yeS5sZXRzZW5jcnlwdC5wcm9kdWN0aW9uLFxuICAgICAgICBhY2NvdW50S2V5OiBhY2NvdW50S2V5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWNjb3VudFBheWxvYWQgPSB7XG4gICAgICAgIHRlcm1zT2ZTZXJ2aWNlQWdyZWVkOiB0cnVlLFxuICAgICAgICBjb250YWN0OiBbYG1haWx0bzpkZXZvcHNAcGVyc3BlY3RhbmFseXRpY3MuY29tYF0sXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5nZXRBY2NvdW50VXJsKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5jcmVhdGVBY2NvdW50KGFjY291bnRQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmRlclBheWxvYWQgPSB7XG4gICAgICAgIGlkZW50aWZpZXJzOiBkb21haW5MaXN0Lm1hcChkb21haW4gPT4gKHsgdHlwZTogXCJkbnNcIiwgdmFsdWU6IGRvbWFpbiB9KSksXG4gICAgfTtcbiAgICBjb25zdCBvcmRlciA9IGF3YWl0IGNsaWVudC5jcmVhdGVPcmRlcihvcmRlclBheWxvYWQpO1xuICAgIGNvbnN0IGF1dGhvcml6YXRpb25zID0gYXdhaXQgY2xpZW50LmdldEF1dGhvcml6YXRpb25zKG9yZGVyKTtcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0aG9yaXphdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoYXV0aG9yaXphdGlvbnMpfWApO1xuXG4gICAgZm9yIChsZXQgYXV0aCBvZiBhdXRob3JpemF0aW9ucykge1xuICAgICAgICBpZiAoYXV0aC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEF1dGhvcml6YXRpb24gYWxyZWFkeSB2YWxpZCBmb3IgJHthdXRoLmlkZW50aWZpZXIudmFsdWV9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0aG9yaXphdGlvbiBmb3IgJHtKU09OLnN0cmluZ2lmeShhdXRoKX1gKTtcblxuICAgICAgICAvLyBPbmx5IHVzZSBETlMgYXV0aG9yaXphdGlvblxuICAgICAgICBsZXQgY2hhbGxlbmdlID0gYXV0aC5jaGFsbGVuZ2VzLmZpbmQoeCA9PiB4LnR5cGUgPT09IFwiZG5zLTAxXCIpO1xuICAgICAgICBpZiAoIWNoYWxsZW5nZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gRE5TIGNoYWxsZW5nZSBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlBdXRob3JpemF0aW9uID0gYXdhaXQgY2xpZW50LmdldENoYWxsZW5nZUtleUF1dGhvcml6YXRpb24oY2hhbGxlbmdlKTtcblxuICAgICAgICBsZXQgaG9zdG5hbWUgPSBhdXRoLmlkZW50aWZpZXIudmFsdWU7XG4gICAgICAgIGxldCBjaGFsbGVuZ2VSZWNvcmROYW1lID0gXCJfYWNtZS1jaGFsbGVuZ2UuXCIgKyBob3N0bmFtZSArIFwiLlwiO1xuICAgICAgICBhd2FpdCBzZXRSZWNvcmQoXCJUWFRcIiwgY2hhbGxlbmdlUmVjb3JkTmFtZSwga2V5QXV0aG9yaXphdGlvbik7XG5cbiAgICAgICAgYXdhaXQgY2xpZW50LmNvbXBsZXRlQ2hhbGxlbmdlKGNoYWxsZW5nZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDaGFsbGVuZ2UgY29tcGxldGVkYCk7XG5cbiAgICAgICAgYXdhaXQgY2xpZW50LndhaXRGb3JWYWxpZFN0YXR1cyhjaGFsbGVuZ2UpO1xuICAgICAgICBjb25zb2xlLmxvZyhgU3RhdHVzIG9mIG9yZGVyIGlzIHZhbGlkYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxpemVkID0gYXdhaXQgY2xpZW50LmZpbmFsaXplT3JkZXIob3JkZXIsIGNlcnRpZmljYXRlQ3NyKTtcbiAgICBjb25zb2xlLmxvZyhgT3JkZXIgZmluYWxpemVkYCk7XG5cbiAgICBsZXQgY2VydCA9IGF3YWl0IGNsaWVudC5nZXRDZXJ0aWZpY2F0ZShmaW5hbGl6ZWQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRvbWFpbnM6IGRvbWFpbkxpc3QsXG4gICAgICAgIGtleTogY2VydGlmaWNhdGVLZXkudG9TdHJpbmcoKSxcbiAgICAgICAgY2VydDogY2VydCxcbiAgICB9O1xufVxuIl19
181
- /* _JS_SOURCE_HASH = "4d56068f29ee3700832b43eb0cee884139d4fe1f48558129ee9da54ea1825056"; */
198
+ exports.generateCert = generateCert;
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNDZXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImh0dHBzQ2VydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwrQkFBdUU7QUFDdkUseURBQTBEO0FBQzFELGtEQUFvQztBQUNwQyw4REFBK0I7QUFDL0Isd0VBQXdFO0FBQ3hFLGtFQUFtRjtBQUNuRixtREFBb0U7QUFDcEUsMkRBQXFEO0FBQ3JELDRDQUFvQjtBQUNwQixxRUFBdUQ7QUFFdkQsZUFBZTtBQUNmOzs7Ozs7Ozs7RUFTRTtBQUVGLDZFQUE2RTtBQUM3RSxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUVqQyxpREFBaUQ7QUFDcEMsUUFBQSxZQUFZLEdBQUcsSUFBQSxlQUFLLEVBQUMsS0FBSyxFQUFFLE1BQWMsRUFBMEMsRUFBRTtJQUMvRixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQzFCLENBQUM7SUFFRCwyTkFBMk47SUFDM04sVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNaLG9CQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUMsRUFBRSxpQkFBVSxDQUFDLENBQUM7SUFFZixJQUFJLE9BQWtELENBQUM7SUFDdkQsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBa0MsQ0FBQztJQUN6RixDQUFDO0lBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztJQUNYLElBQUksT0FBTyxFQUFFLENBQUM7UUFDVix5RUFBeUU7UUFDekUsMkJBQTJCO1FBQzNCLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxJQUFJLFNBQVMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7UUFDbEYsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFBLG1CQUFPLEVBQUMsbUJBQW1CLE1BQU0scUJBQXFCLElBQUEsdUJBQWMsRUFBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsRyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBQSxtQkFBTyxFQUFDLDRCQUE0QixNQUFNLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEscUJBQWEsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUMvQyxJQUFJLFVBQVUsR0FBYSxFQUFFLENBQUM7SUFFOUIsd0NBQXdDO0lBQ3hDLCtGQUErRjtJQUMvRiwyR0FBMkc7SUFDM0csMENBQTBDO0lBRTFDLHNGQUFzRjtJQUN0RiwrRkFBK0Y7SUFDL0YseUZBQXlGO0lBQ3pGLDRDQUE0QztJQUM1QywwRkFBMEY7SUFDMUYsc0JBQXNCO0lBQ3RCLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBRS9CLElBQUksQ0FBQztRQUNELE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLENBQUM7WUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnR0FBZ0csQ0FBQyxDQUFDO1lBQzlHLE1BQU0sSUFBQSxnQkFBSyxFQUFDLG1CQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUIsT0FBTyxNQUFNLElBQUEsb0JBQVksRUFBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUM7SUFDWixDQUFDO0lBQ0QsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUMsQ0FBQyxDQUFDO0FBR0ksTUFBTSxhQUFhLEdBQUcsS0FBSyxVQUFVLGFBQWEsQ0FBQyxNQUFjO0lBQ3BFLElBQUksVUFBVSxHQUFHLElBQUEsb0NBQVcsRUFBUyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUN0RSxJQUFJLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNwQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDVixpQ0FBaUM7UUFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFBLGVBQUcsRUFBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDaEQsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxNQUFNLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQVhXLFFBQUEsYUFBYSxpQkFXeEI7QUFHRixTQUFnQixTQUFTLENBQUMsUUFBeUI7SUFDL0MsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUZELDhCQUVDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsUUFBeUI7SUFDeEQsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsT0FBTywrQkFBK0IsR0FBRyxRQUFRLEdBQUcsNkJBQTZCLENBQUM7QUFDdEYsQ0FBQztBQU5ELGdEQU1DO0FBR00sS0FBSyxVQUFVLFlBQVksQ0FBQyxNQUlsQztJQUtHLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRXBDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBQSxtQkFBTyxFQUFDLDJCQUEyQixNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFMUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELHFCQUFxQjtJQUNyQixVQUFVLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLEdBQUcsTUFBTSxxQkFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDaEUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDekIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ2hDLENBQUMsQ0FBQztJQUVILHdHQUF3RztJQUN4RyxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLFlBQVksRUFBRSxxQkFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVTtRQUNuRCxVQUFVLEVBQUUsVUFBVTtLQUN6QixDQUFDLENBQUM7SUFFSCxNQUFNLGNBQWMsR0FBRztRQUNuQixvQkFBb0IsRUFBRSxJQUFJO1FBQzFCLE9BQU8sRUFBRSxDQUFDLHFDQUFxQyxDQUFDO0tBQ25ELENBQUM7SUFFRixJQUFJLENBQUM7UUFDRCxNQUFNLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRztRQUNqQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQzFFLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxjQUFjLEdBQUcsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFMUUsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLFNBQVM7UUFDYixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbEUsNkJBQTZCO1FBQzdCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxNQUFNLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDckMsSUFBSSxtQkFBbUIsR0FBRyxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQzlELE1BQU0sSUFBQSxlQUFTLEVBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFOUQsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNwRSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsSUFBSSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELE9BQU87UUFDSCxPQUFPLEVBQUUsVUFBVTtRQUNuQixHQUFHLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRTtRQUM5QixJQUFJLEVBQUUsSUFBSTtLQUNiLENBQUM7QUFDTixDQUFDO0FBaEZELG9DQWdGQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgYWRkUmVjb3JkLCBkZWxldGVSZWNvcmQsIGdldFJlY29yZHMsIHNldFJlY29yZCB9IGZyb20gXCIuL2Ruc1wiO1xuaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgKiBhcyBmb3JnZSBmcm9tIFwibm9kZS1mb3JnZVwiO1xuaW1wb3J0IGFjbWUgZnJvbSBcImFjbWUtY2xpZW50XCI7XG5pbXBvcnQgeyBtYWdlbnRhLCByZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZVRpbWUsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgdGltZUluSG91ciwgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZ2V0S2V5U3RvcmUgfSBmcm9tIFwiLi9wZXJzaXN0ZW50TG9jYWxTdG9yYWdlXCI7XG5cbi8vIEZvciBleGFtcGxlOlxuLypcbmxldCBkb21haW4gPSBcInF1ZXJ5c3VidGVzdC5jb21cIjtcbmF3YWl0IGxvYWRJZGVudGl0eUNBKGRvbWFpbik7XG5cbmxldCBsaXN0ZW5QdWJsaWMgPSBmYWxzZTtcbmxldCBwb3J0ID0gOTgyMztcbmxldCBsb2NhbERvbWFpbiA9IFwiMTI3LTAtMC0xLlwiICsgZG9tYWluO1xuYXdhaXQgYWRkUmVjb3JkKFwiQVwiLCBsb2NhbERvbWFpbiwgXCIxMjcuMC4wLjFcIik7XG5sZXQga2V5Q2VydCA9IGF3YWl0IGdldEhUVFBTQ2VydChkb21haW4pO1xuKi9cblxuLy8gRXhwaXJlIEVYUElSQVRJT05fVEhSRVNIT0xEJSBvZiB0aGUgd2F5IHRocm91Z2ggdGhlIGNlcnRpZmljYXRlJ3MgbGlmZXRpbWVcbmNvbnN0IEVYUElSQVRJT05fVEhSRVNIT0xEID0gMC40O1xuXG4vKiogTk9URTogV2UgYWxzbyBnZW5lcmF0ZSB0aGUgZG9tYWluICouZG9tYWluICovXG5leHBvcnQgY29uc3QgZ2V0SFRUUFNDZXJ0ID0gY2FjaGUoYXN5bmMgKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfT4gPT4ge1xuICAgIGlmICghZG9tYWluLmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICBkb21haW4gPSBkb21haW4gKyBcIi5cIjtcbiAgICB9XG5cbiAgICAvLyBObyBtYXR0ZXIgd2hhdCwgcmVzZXQgdGhpcyBmcm9tIHRoZSBpbi1tZW1vcnkgY2FjaGUgaW4gYW4gaG91ci4gVGhpcyBpcyBmaW5lLiBXZSdsbCBqdXN0IHNlZSB0aGUgY2FjaGUgb24gZGlzayBhbmQgc2VlIHRoYXQgaXQgaGFzbid0IGV4cGlyZWQuIE9yIHdlIG1pZ2h0IHNlZSB0aGF0IGl0IGhhcyBleHBpcmVkLCBhbmQgdGhlbiB3ZSB3aWxsIGdldCB0aGUgbmV3IHZhbHVlLiBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZ2V0SFRUUFNDZXJ0LmNsZWFyKGRvbWFpbik7XG4gICAgfSwgdGltZUluSG91cik7XG5cbiAgICBsZXQga2V5Q2VydDogeyBrZXk6IHN0cmluZzsgY2VydDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHBhdGggPSBkb21haW4gKyBcIi5jZXJ0XCI7XG5cbiAgICB0cnkge1xuICAgICAgICBrZXlDZXJ0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKSBhcyB7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfTtcbiAgICB9IGNhdGNoIHsgfVxuICAgIGlmIChrZXlDZXJ0KSB7XG4gICAgICAgIC8vIElmIDQwJSBvZiB0aGUgbGlmZXRpbWUgaGFzIHBhc3NlZCwgcmVuZXcgaXQgKGhhcyB0byBiZSA8IHRoZSB0aHJlc2hvbGRcbiAgICAgICAgLy8gIGluIEVkZ2VDZXJ0Q29udHJvbGxlcikuXG4gICAgICAgIGxldCBjZXJ0T2JqID0gcGFyc2VDZXJ0KGtleUNlcnQuY2VydCk7XG4gICAgICAgIGxldCBleHBpcmF0aW9uVGltZSA9ICtuZXcgRGF0ZShjZXJ0T2JqLnZhbGlkaXR5Lm5vdEFmdGVyKTtcbiAgICAgICAgbGV0IGNyZWF0ZVRpbWUgPSArbmV3IERhdGUoY2VydE9iai52YWxpZGl0eS5ub3RCZWZvcmUpO1xuICAgICAgICBsZXQgcmVuZXdEYXRlID0gY3JlYXRlVGltZSArIChleHBpcmF0aW9uVGltZSAtIGNyZWF0ZVRpbWUpICogRVhQSVJBVElPTl9USFJFU0hPTEQ7XG4gICAgICAgIGlmIChyZW5ld0RhdGUgPCBEYXRlLm5vdygpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBSZW5ld2luZyBkb21haW4gJHtkb21haW59IChyZW5ldyB0YXJnZXQgaXMgJHtmb3JtYXREYXRlVGltZShyZW5ld0RhdGUpfSkuYCkpO1xuICAgICAgICAgICAga2V5Q2VydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYE5vIGNlcnQgZm91bmQgZm9yIGRvbWFpbiAke2RvbWFpbn0sIGdlbmVyYXRpbmcgc2hvcnRseS5gKSk7XG4gICAgfVxuICAgIGlmIChrZXlDZXJ0KSB7XG4gICAgICAgIHJldHVybiBrZXlDZXJ0O1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRLZXkgPSBhd2FpdCBnZXRBY2NvdW50S2V5KGRvbWFpbik7XG4gICAgbGV0IGFsdERvbWFpbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBhbHREb21haW5zLnB1c2goXCJub3Byb3h5LlwiICsgZG9tYWluKTtcbiAgICAvLyAvLyBOT1RFOiBBbGxvd2luZyBsb2NhbCBhY2Nlc3MgaXMganVzdCBhbiBvcHRpbWl6YXRpb24sIG5vdCB0byBhdm9pZCBoYXZpbmcgdG8gZm9yd2FyZCBwb3J0c1xuICAgIC8vIC8vICAodW5sZXNzIHlvdSB0eXBlIDEyNy0wLTAtMS5kb21haW4gaW50byB0aGUgYnJvd3Nlci4uLiB0aGVuIEkgZ3Vlc3MgeW91IGRvbid0IGhhdmUgdG8gZm9yd2FyZCBwb3J0cz8pXG4gICAgLy8gYWx0RG9tYWlucy5wdXNoKFwiMTI3LTAtMC0xLlwiICsgZG9tYWluKTtcblxuICAgIC8vIE5PVEU6IEkgZm9yZ2V0IHdoeSB3ZSB3ZXJlIG5vdCBhbGxvd2luZyB3aWxkY2FyZCBkb21haW5zLiBJIHRoaW5rIGl0IHdhcyB0byBwcmV2ZW50XG4gICAgLy8gIGFueSBIVFRQUyBkb21haW5zIGZyb20gaW1wZXJzb25hdGluZyBzZXJ2ZXJzLiBCdXQuLi4gc2VydmVycyBoYXZlIHR3byBsZXZlbHMsIHNvIHRoYXQgaXNuJ3RcbiAgICAvLyAgYW4gaXNzdWUuIEFuZCBldmVuIGlmIHRoZXkgZGlkbid0IHRoZXkgc3RvcmUgdGhlaXIgcHVibGljIGtleSBpbiB0aGVpciBkb21haW4sIHNvIHlvdVxuICAgIC8vICBjYW4ndCByZWFsbHkgaW1wZXJzb25hdGUgdGhlbSBhbnl3YXlzLi4uXG4gICAgLy8gIC0gQU5ELCB3ZSBuZWVkIHRoaXMgZm9yIElQIHR5cGUgQSByZWNvcmRzLCB3aGljaC4uLiB3ZSBuZWVkIHRvIHBpY2sgdGhlIHNlcnZlciB3ZSB3YW50XG4gICAgLy8gICAgICB0byBjb25uZWN0IHRvLlxuICAgIGFsdERvbWFpbnMucHVzaChcIiouXCIgKyBkb21haW4pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAga2V5Q2VydCA9IGF3YWl0IGdlbmVyYXRlQ2VydCh7IGFjY291bnRLZXksIGRvbWFpbiwgYWx0RG9tYWlucyB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChTdHJpbmcoZSkuaW5jbHVkZXMoXCJhdXRob3JpemF0aW9uIG11c3QgYmUgcGVuZGluZ1wiKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEF1dGhvcml6YXRpb24gYXBwZWFycyB0byBiZSBwZW5kaW5nLCB3YWl0aW5nIDIgbWludXRlcyBmb3Igb3RoZXIgcHJvY2VzcyB0byBjcmVhdGUgY2VydGlmaWNhdGVgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KHRpbWVJbk1pbnV0ZSAqIDIpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldEhUVFBTQ2VydChkb21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLCBKU09OLnN0cmluZ2lmeShrZXlDZXJ0KSk7XG4gICAgcmV0dXJuIGtleUNlcnQ7XG59KTtcblxuXG5leHBvcnQgY29uc3QgZ2V0QWNjb3VudEtleSA9IGFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRLZXkoZG9tYWluOiBzdHJpbmcpIHtcbiAgICBsZXQgYWNjb3VudEtleSA9IGdldEtleVN0b3JlPHN0cmluZz4oZG9tYWluLCBcImxldHNFbmNyeXB0QWNjb3VudEtleVwiKTtcbiAgICBsZXQgc2VjcmV0ID0gYXdhaXQgYWNjb3VudEtleS5nZXQoKTtcbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgICAvLyBTaG91bGQgb25seSBIQVBQRU4gT05DRSwgRVZFUiFcbiAgICAgICAgY29uc29sZS5lcnJvcihyZWQoYEdlbmVyYXRpbmcgbmV3IGxldHNlbmNyeXB0IGFjY291bnQga2V5YCkpO1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gZm9yZ2UucGtpLnJzYS5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgICAgc2VjcmV0ID0gZm9yZ2UucGtpLnByaXZhdGVLZXlUb1BlbShrZXlQYWlyLnByaXZhdGVLZXkpO1xuICAgICAgICBhd2FpdCBhY2NvdW50S2V5LnNldChzZWNyZXQpO1xuICAgIH1cbiAgICByZXR1cm4gc2VjcmV0O1xufTtcblxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDZXJ0KFBFTW9yREVSOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICByZXR1cm4gZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbVBlbShub3JtYWxpemVDZXJ0VG9QRU0oUEVNb3JERVIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNlcnRUb1BFTShQRU1vckRFUjogc3RyaW5nIHwgQnVmZmVyKTogc3RyaW5nIHtcbiAgICBpZiAoUEVNb3JERVIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXCIpKSB7XG4gICAgICAgIHJldHVybiBQRU1vckRFUi50b1N0cmluZygpO1xuICAgIH1cbiAgICBQRU1vckRFUiA9IFBFTW9yREVSLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIHJldHVybiBcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcblwiICsgUEVNb3JERVIgKyBcIlxcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cIjtcbn1cblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDZXJ0KGNvbmZpZzoge1xuICAgIGFjY291bnRLZXk6IHN0cmluZztcbiAgICBkb21haW46IHN0cmluZztcbiAgICBhbHREb21haW5zPzogc3RyaW5nW107XG59KTogUHJvbWlzZTx7XG4gICAgZG9tYWluczogc3RyaW5nW107XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY2VydDogc3RyaW5nO1xufT4ge1xuICAgIGxldCB7IGFjY291bnRLZXksIGRvbWFpbiB9ID0gY29uZmlnO1xuXG4gICAgY29uc29sZS5sb2cobWFnZW50YShgR2VuZXJhdGluZyBuZXcgY2VydCBmb3IgJHtkb21haW59YCkpO1xuXG4gICAgbGV0IGRvbWFpbkxpc3QgPSBbZG9tYWluLCAuLi5jb25maWcuYWx0RG9tYWlucyB8fCBbXV07XG4gICAgLy8gU3RyaXAgdHJhaWxpbmcgXCIuXCJcbiAgICBkb21haW5MaXN0ID0gZG9tYWluTGlzdC5tYXAoeCA9PiB4LmVuZHNXaXRoKFwiLlwiKSA/IHguc2xpY2UoMCwgLTEpIDogeCk7XG5cbiAgICBjb25zdCBbY2VydGlmaWNhdGVLZXksIGNlcnRpZmljYXRlQ3NyXSA9IGF3YWl0IGFjbWUuZm9yZ2UuY3JlYXRlQ3NyKHtcbiAgICAgICAgY29tbW9uTmFtZTogZG9tYWluTGlzdFswXSxcbiAgICAgICAgYWx0TmFtZXM6IGRvbWFpbkxpc3Quc2xpY2UoMSksXG4gICAgfSk7XG5cbiAgICAvLyBTby4uLiBhY21lLWNsaWVudCBpcyBmaW5lLiBKdXN0IHJlLWltcGxlbWVudCB0aGUgXCJhdXRvXCIgbW9kZSBvdXJzZWx2ZXMsIHRvIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgaXQuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IGFjbWUuQ2xpZW50KHtcbiAgICAgICAgZGlyZWN0b3J5VXJsOiBhY21lLmRpcmVjdG9yeS5sZXRzZW5jcnlwdC5wcm9kdWN0aW9uLFxuICAgICAgICBhY2NvdW50S2V5OiBhY2NvdW50S2V5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWNjb3VudFBheWxvYWQgPSB7XG4gICAgICAgIHRlcm1zT2ZTZXJ2aWNlQWdyZWVkOiB0cnVlLFxuICAgICAgICBjb250YWN0OiBbYG1haWx0bzpkZXZvcHNAcGVyc3BlY3RhbmFseXRpY3MuY29tYF0sXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5nZXRBY2NvdW50VXJsKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5jcmVhdGVBY2NvdW50KGFjY291bnRQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmRlclBheWxvYWQgPSB7XG4gICAgICAgIGlkZW50aWZpZXJzOiBkb21haW5MaXN0Lm1hcChkb21haW4gPT4gKHsgdHlwZTogXCJkbnNcIiwgdmFsdWU6IGRvbWFpbiB9KSksXG4gICAgfTtcbiAgICBjb25zdCBvcmRlciA9IGF3YWl0IGNsaWVudC5jcmVhdGVPcmRlcihvcmRlclBheWxvYWQpO1xuICAgIGNvbnN0IGF1dGhvcml6YXRpb25zID0gYXdhaXQgY2xpZW50LmdldEF1dGhvcml6YXRpb25zKG9yZGVyKTtcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0aG9yaXphdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoYXV0aG9yaXphdGlvbnMpfWApO1xuXG4gICAgZm9yIChsZXQgYXV0aCBvZiBhdXRob3JpemF0aW9ucykge1xuICAgICAgICBpZiAoYXV0aC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEF1dGhvcml6YXRpb24gYWxyZWFkeSB2YWxpZCBmb3IgJHthdXRoLmlkZW50aWZpZXIudmFsdWV9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0aG9yaXphdGlvbiBmb3IgJHtKU09OLnN0cmluZ2lmeShhdXRoKX1gKTtcblxuICAgICAgICAvLyBPbmx5IHVzZSBETlMgYXV0aG9yaXphdGlvblxuICAgICAgICBsZXQgY2hhbGxlbmdlID0gYXV0aC5jaGFsbGVuZ2VzLmZpbmQoeCA9PiB4LnR5cGUgPT09IFwiZG5zLTAxXCIpO1xuICAgICAgICBpZiAoIWNoYWxsZW5nZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gRE5TIGNoYWxsZW5nZSBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlBdXRob3JpemF0aW9uID0gYXdhaXQgY2xpZW50LmdldENoYWxsZW5nZUtleUF1dGhvcml6YXRpb24oY2hhbGxlbmdlKTtcblxuICAgICAgICBsZXQgaG9zdG5hbWUgPSBhdXRoLmlkZW50aWZpZXIudmFsdWU7XG4gICAgICAgIGxldCBjaGFsbGVuZ2VSZWNvcmROYW1lID0gXCJfYWNtZS1jaGFsbGVuZ2UuXCIgKyBob3N0bmFtZSArIFwiLlwiO1xuICAgICAgICBhd2FpdCBzZXRSZWNvcmQoXCJUWFRcIiwgY2hhbGxlbmdlUmVjb3JkTmFtZSwga2V5QXV0aG9yaXphdGlvbik7XG5cbiAgICAgICAgYXdhaXQgY2xpZW50LmNvbXBsZXRlQ2hhbGxlbmdlKGNoYWxsZW5nZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDaGFsbGVuZ2UgY29tcGxldGVkYCk7XG5cbiAgICAgICAgYXdhaXQgY2xpZW50LndhaXRGb3JWYWxpZFN0YXR1cyhjaGFsbGVuZ2UpO1xuICAgICAgICBjb25zb2xlLmxvZyhgU3RhdHVzIG9mIG9yZGVyIGlzIHZhbGlkYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxpemVkID0gYXdhaXQgY2xpZW50LmZpbmFsaXplT3JkZXIob3JkZXIsIGNlcnRpZmljYXRlQ3NyKTtcbiAgICBjb25zb2xlLmxvZyhgT3JkZXIgZmluYWxpemVkYCk7XG5cbiAgICBsZXQgY2VydCA9IGF3YWl0IGNsaWVudC5nZXRDZXJ0aWZpY2F0ZShmaW5hbGl6ZWQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRvbWFpbnM6IGRvbWFpbkxpc3QsXG4gICAgICAgIGtleTogY2VydGlmaWNhdGVLZXkudG9TdHJpbmcoKSxcbiAgICAgICAgY2VydDogY2VydCxcbiAgICB9O1xufVxuIl19
200
+ /* _JS_SOURCE_HASH = "084f601d346362ed5f0c9543c3fa3c94cc41cf830ff204cdd42953a7e701ea26"; */
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
6
  //exports.getKeyStore = void 0;
7
+ module.allowclient = true;
7
8
  const misc_1 = require("socket-function/src/misc");
8
9
  const fs_1 = __importDefault(require("fs"));
9
10
  const os_1 = __importDefault(require("os"));
@@ -41,5 +42,5 @@ function getKeyStore(appName, key) {
41
42
  }
42
43
  }
43
44
  exports.getKeyStore = getKeyStore;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVudExvY2FsU3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBlcnNpc3RlbnRMb2NhbFN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQWtEO0FBQ2xELDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFJcEIsU0FBZ0IsV0FBVyxDQUFJLE9BQWUsRUFBRSxHQUFXO0lBSXZELElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsSUFBSSxJQUFJLEdBQUcsWUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsRSxPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLFFBQVEsR0FBdUIsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLENBQUM7b0JBQUMsUUFBUSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFFBQVE7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQWU7Z0JBQ2YsWUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBZTtnQkFDZixZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBNYXliZVByb21pc2UgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy90eXBlc1wiO1xuaW1wb3J0IHsgY2FjaGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlTdG9yZTxUPihhcHBOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKToge1xuICAgIGdldCgpOiBNYXliZVByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gICAgc2V0KHZhbHVlOiBUIHwgbnVsbCk6IE1heWJlUHJvbWlzZTx2b2lkPjtcbn0ge1xuICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICBsZXQgcGF0aCA9IG9zLmhvbWVkaXIoKSArIGAva2V5c3RvcmVfJHthcHBOYW1lfV9gICsga2V5ICsgXCIuanNvblwiO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50czogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7IGNvbnRlbnRzID0gZnMucmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTsgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnRzKSBhcyBUO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGgsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsZXQganNvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFqc29uKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pIGFzIFQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHZhbHVlOiBUIHwgbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59Il19
45
- /* _JS_SOURCE_HASH = "fab658bfd6afe5a0e23dd617216d46662e36d867c7ac2a1d0b56d0ac77e47290"; */
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVudExvY2FsU3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBlcnNpc3RlbnRMb2NhbFN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsbURBQWtEO0FBQ2xELDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFHcEIsU0FBZ0IsV0FBVyxDQUFJLE9BQWUsRUFBRSxHQUFXO0lBSXZELElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsSUFBSSxJQUFJLEdBQUcsWUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsRSxPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLFFBQVEsR0FBdUIsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLENBQUM7b0JBQUMsUUFBUSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFFBQVE7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQWU7Z0JBQ2YsWUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBZTtnQkFDZixZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleVN0b3JlPFQ+KGFwcE5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiB7XG4gICAgZ2V0KCk6IFQgfCB1bmRlZmluZWQ7XG4gICAgc2V0KHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQ7XG59IHtcbiAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgbGV0IHBhdGggPSBvcy5ob21lZGlyKCkgKyBgL2tleXN0b3JlXyR7YXBwTmFtZX1fYCArIGtleSArIFwiLmpzb25cIjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0cnkgeyBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIik7IH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50cykgYXMgVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghanNvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKSBhcyBUO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==
46
+ /* _JS_SOURCE_HASH = "58cffcfad7122960997b72d8b4809ea1c8f4b8d638bf51c327f012d95d941526"; */
@@ -1,18 +1,51 @@
1
+ /** Parses our tag back out; 0 (i.e. always stale) when it's absent or unparseable. */
2
+ export declare function freshnessTime(comment?: string): number;
3
+ export declare const hasDNSWritePermissions: {
4
+ (): Promise<boolean>;
5
+ reset(): void;
6
+ set(newValue: Promise<boolean>): void;
7
+ };
8
+ export declare const getZoneId: {
9
+ (key: string): Promise<string>;
10
+ clear(key: string): void;
11
+ clearAll(): void;
12
+ forceSet(key: string, value: Promise<string>): void;
13
+ getAllKeys(): string[];
14
+ get(key: string): Promise<string> | undefined;
15
+ };
1
16
  export declare function getRecordsRaw(type: string, key: string): Promise<{
2
17
  id: string;
3
18
  type: string;
4
19
  name: string;
5
20
  content: string;
6
21
  proxied: boolean;
22
+ modified_on: string;
23
+ comment?: string | undefined;
7
24
  }[]>;
25
+ /** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database
26
+ * transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs
27
+ * aren't usable in our setup, and because it lets "remove others + assert target" happen
28
+ * without a window where the name resolves to nothing. */
29
+ export declare function batchRecords(zoneId: string, batch: {
30
+ deletes?: {
31
+ id: string;
32
+ }[];
33
+ patches?: {
34
+ id: string;
35
+ comment?: string;
36
+ }[];
37
+ posts?: {
38
+ type: string;
39
+ name: string;
40
+ content: string;
41
+ ttl: number;
42
+ proxied: boolean;
43
+ comment?: string;
44
+ }[];
45
+ }): Promise<void>;
8
46
  export declare function getRecords(type: string, key: string): Promise<string[]>;
9
47
  export declare function deleteRecord(type: string, key: string, value: string): Promise<void>;
10
- /** Removes all existing records (unless the record is already present) */
11
- export declare function setRecord(type: string, key: string, value: string, proxied?: "proxied"): Promise<void>;
48
+ /** Removes all existing records (unless the record is already present and fresh) */
49
+ export declare function setRecord(type: string, key: string, value: string, proxied?: "proxied", staleAfter?: number): Promise<void>;
12
50
  /** Keeps existing records */
13
- export declare function addRecord(type: string, key: string, value: string, proxied?: "proxied"): Promise<void>;
14
- /** Provide Cloudflare credentials directly (an API token, or a path to a file containing one), instead of relying on ./cloudflare.json */
15
- export declare function setCloudflareCredentials(config: {
16
- key?: string;
17
- path?: string;
18
- }): void;
51
+ export declare function addRecord(type: string, key: string, value: string, proxied?: "proxied", staleAfter?: number): Promise<void>;
package/misc/https/dns.ts CHANGED
@@ -1,15 +1,48 @@
1
- import { httpsRequest } from "socket-function/src/https";
2
1
  import { cache, lazy } from "socket-function/src/caching";
3
- import fs from "fs";
4
2
  import { delay } from "socket-function/src/batching";
5
3
  import { SocketFunction } from "socket-function/SocketFunction";
4
+ import { isNode, timeInDay } from "socket-function/src/misc";
5
+ import { magenta } from "socket-function/src/formatting/logColors";
6
+ import { cloudflareCall, cloudflareGETCall, cloudflarePOSTCall, getCloudflareCreds } from "./cloudflareHelpers";
6
7
 
7
8
  const DNS_TTLSeconds = {
8
9
  "TXT": 60,
9
10
  "A": 60,
10
11
  };
11
12
 
12
- const getZoneId = cache(async (rootDomain: string): Promise<string> => {
13
+ const DNS_REFRESH_STALE_AFTER = timeInDay;
14
+
15
+ // We stamp our own "last asserted" time into the record's comment, because Cloudflare's
16
+ // modified_on can only be moved by an actual content change - and re-asserting an already
17
+ // correct record has no content change to make (a create errors with 81058, a no-op edit
18
+ // doesn't bump the timestamp). Reading freshness from text we control sidesteps that entirely,
19
+ // and lets us refresh a stale-but-correct record in place instead of deleting and recreating it.
20
+ const FRESHNESS_REGEX = /<set on:[^>]*>/;
21
+
22
+ /** Strips any prior freshness tag and appends a new one, preserving other comment text. */
23
+ function stampFreshness(comment?: string): string {
24
+ let base = (comment ?? "").replace(FRESHNESS_REGEX, "").trim();
25
+ let stamp = `<set on: ${new Date().toString()}>`;
26
+ return base ? `${base} ${stamp}` : stamp;
27
+ }
28
+ /** Parses our tag back out; 0 (i.e. always stale) when it's absent or unparseable. */
29
+ export function freshnessTime(comment?: string): number {
30
+ let match = FRESHNESS_REGEX.exec(comment ?? "");
31
+ if (!match) return 0;
32
+ return new Date(match[0].replace("<set on:", "").replace(">", "").trim()).getTime() || 0;
33
+ }
34
+
35
+ export const hasDNSWritePermissions = lazy(async () => {
36
+ if (!isNode()) return false;
37
+ try {
38
+ await getCloudflareCreds();
39
+ return true;
40
+ } catch {
41
+ return false;
42
+ }
43
+ });
44
+
45
+ export const getZoneId = cache(async (rootDomain: string): Promise<string> => {
13
46
  let zones = await cloudflareGETCall<{ id: string; name: string }[]>("/zones", {});
14
47
  let selected = zones.find(x => x.name === rootDomain);
15
48
  if (!selected) {
@@ -34,8 +67,35 @@ export async function getRecordsRaw(type: string, key: string) {
34
67
  name: string;
35
68
  content: string;
36
69
  proxied: boolean;
70
+ modified_on: string;
71
+ // Omitted by Cloudflare when the record has no comment.
72
+ comment?: string;
37
73
  }[]>(`/zones/${zoneId}/dns_records`);
38
- return results.filter(x => x.type === type && x.name === key);
74
+ // DNS names are case-insensitive and Cloudflare returns them lowercased, so a mixed-case key
75
+ // (e.g. a machine id subdomain) would never match an exact-case compare - match lowercased.
76
+ let keyLower = key.toLowerCase();
77
+ return results.filter(x => x.type === type && x.name.toLowerCase() === keyLower);
78
+ }
79
+
80
+ /** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database
81
+ * transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs
82
+ * aren't usable in our setup, and because it lets "remove others + assert target" happen
83
+ * without a window where the name resolves to nothing. */
84
+ export async function batchRecords(zoneId: string, batch: {
85
+ deletes?: { id: string }[];
86
+ patches?: { id: string; comment?: string }[];
87
+ posts?: { type: string; name: string; content: string; ttl: number; proxied: boolean; comment?: string }[];
88
+ }) {
89
+ let payload: { [key: string]: unknown } = {};
90
+ if (batch.deletes && batch.deletes.length > 0) payload.deletes = batch.deletes;
91
+ if (batch.patches && batch.patches.length > 0) payload.patches = batch.patches;
92
+ if (batch.posts && batch.posts.length > 0) payload.posts = batch.posts;
93
+ try {
94
+ await cloudflarePOSTCall(`/zones/${zoneId}/dns_records/batch`, payload);
95
+ } catch (error) {
96
+ console.error(`Error updating DNS records:`, { error: error, batch });
97
+ throw new Error(`Error updating DNS records. ${JSON.stringify(batch)}. Error: ${error}`);
98
+ }
39
99
  }
40
100
  export async function getRecords(type: string, key: string) {
41
101
  if (key.endsWith(".")) key = key.slice(0, -1);
@@ -59,121 +119,59 @@ export async function deleteRecord(type: string, key: string, value: string) {
59
119
  await cloudflareCall(`/zones/${zoneId}/dns_records/${value.id}`, Buffer.from([]), "DELETE");
60
120
  }
61
121
  }
62
- /** Removes all existing records (unless the record is already present) */
63
- export async function setRecord(type: string, key: string, value: string, proxied?: "proxied") {
64
- let stack = new Error();
122
+ /** Removes all existing records (unless the record is already present and fresh) */
123
+ export async function setRecord(type: string, key: string, value: string, proxied?: "proxied", staleAfter = DNS_REFRESH_STALE_AFTER) {
65
124
  if (key.endsWith(".")) key = key.slice(0, -1);
66
125
  let zoneId = await getZoneId(getRootDomain(key));
67
126
  let prevValues = await getRecordsRaw(type, key);
68
- // NOTE: Apparently if we try to update by just changing proxied, cloudflare complains and
69
- // says "an identical record already exists", even though it doesn't, we changed the proxied value...
70
- if (prevValues.some(x => x.content === value)) return;
127
+ let existing = prevValues.find(x => x.content === value);
128
+ let others = prevValues.filter(x => x.content !== value);
71
129
 
72
- console.log(`Removing previous records of ${type} for ${key} ${JSON.stringify(prevValues.map(x => x.content))}`);
73
- let didDeletions = false;
74
- for (let value of prevValues) {
75
- didDeletions = true;
76
- await cloudflareCall(`/zones/${zoneId}/dns_records/${value.id}`, Buffer.from([]), "DELETE");
77
- }
130
+ // Already correct and recently asserted - a prior run also cleaned up the other records,
131
+ // so there is nothing left to do.
132
+ if (existing && Date.now() - freshnessTime(existing.comment) < staleAfter) return;
78
133
 
79
- console.log(`Setting ${type} record for ${key} to ${value} (previously had ${JSON.stringify(prevValues.map(x => x.content))})`);
80
- const ttl = DNS_TTLSeconds[type as "A"] || 60;
81
- await cloudflarePOSTCall(`/zones/${zoneId}/dns_records`, {
82
- type: type,
83
- name: key,
84
- content: value,
85
- ttl,
86
- proxied: proxied === "proxied",
134
+ // A single atomic batch: drop the wrong records, and either refresh the existing record's
135
+ // comment in place or create it - so the name is never left resolving to nothing.
136
+ let ttl = DNS_TTLSeconds[type as "A"] || 60;
137
+ let comment = stampFreshness(existing?.comment);
138
+ console.log(magenta(`Setting ${type} record for ${key} to ${value} (previously had ${JSON.stringify(prevValues.map(x => x.content))})`));
139
+ await batchRecords(zoneId, {
140
+ deletes: others.map(x => ({ id: x.id })),
141
+ patches: existing ? [{ id: existing.id, comment }] : [],
142
+ posts: existing ? [] : [{ type, name: key, content: value, ttl, proxied: proxied === "proxied", comment }],
87
143
  });
88
- // NOTE: Apparently... even if the record didn't exist, we still have to wait...
89
- console.log(`Waiting ${ttl} seconds for DNS to propagate...`);
90
- await delay(ttl * 1000);
91
- console.log(`Done waiting for DNS to update.`);
92
-
144
+ // Only a brand new record needs to propagate; an in-place comment refresh doesn't change the answer.
145
+ if (!existing) {
146
+ console.log(`Waiting ${ttl} seconds for DNS to propagate...`);
147
+ for (let ttlLeft = ttl; ttlLeft > 0; ttlLeft--) {
148
+ await delay(1000);
149
+ console.log(`${ttlLeft} seconds left...`);
150
+ }
151
+ console.log(`Done waiting for DNS to update.`);
152
+ }
93
153
  }
94
154
  /** Keeps existing records */
95
- export async function addRecord(type: string, key: string, value: string, proxied?: "proxied") {
155
+ export async function addRecord(type: string, key: string, value: string, proxied?: "proxied", staleAfter = DNS_REFRESH_STALE_AFTER) {
96
156
  if (key.endsWith(".")) key = key.slice(0, -1);
97
157
  let zoneId = await getZoneId(getRootDomain(key));
98
158
  let prevValues = await getRecordsRaw(type, key);
99
- // NOTE: Apparently if we try to update by just changing proxied, cloudflare complains and
100
- // says "an identical record already exists", even though it doesn't, we changed the proxied value...
101
- if (prevValues.some(x => x.content === value)) return;
159
+ let existing = prevValues.find(x => x.content === value);
160
+ if (existing && Date.now() - freshnessTime(existing.comment) < staleAfter) return;
161
+
162
+ // Same single-batch flow as setRecord, minus the deletes (we keep sibling records here).
163
+ let ttl = DNS_TTLSeconds[type as "A"] || 60;
164
+ let comment = stampFreshness(existing?.comment);
102
165
  console.log(`Adding ${type} record for ${key} to ${value} (previously had ${JSON.stringify(prevValues.map(x => x.content))})`);
103
- const ttl = DNS_TTLSeconds[type as "A"] || 60;
104
- await cloudflarePOSTCall(`/zones/${zoneId}/dns_records`, {
105
- type: type,
106
- name: key,
107
- content: value,
108
- ttl,
109
- proxied: proxied === "proxied",
166
+ await batchRecords(zoneId, {
167
+ patches: existing ? [{ id: existing.id, comment }] : [],
168
+ posts: existing ? [] : [{ type, name: key, content: value, ttl, proxied: proxied === "proxied", comment }],
110
169
  });
170
+ if (existing) return;
111
171
  console.log(`Waiting ${ttl} seconds for DNS to propagate...`);
112
- await delay(ttl * 1000);
113
- console.log(`Done waiting for DNS to update.`);
114
- }
115
-
116
-
117
- let credsOverride: { key: string } | undefined;
118
- /** Provide Cloudflare credentials directly (an API token, or a path to a file containing one), instead of relying on ./cloudflare.json */
119
- export function setCloudflareCredentials(config: { key?: string; path?: string }) {
120
- let key = config.key;
121
- if (!key && config.path) {
122
- key = fs.readFileSync(config.path, "utf8").trim();
123
- }
124
- if (!key) {
125
- throw new Error(`Must provide either key or path in setCloudflareCredentials, received ${JSON.stringify(Object.keys(config))}`);
126
- }
127
- credsOverride = { key };
128
- }
129
-
130
- const getCloudflareCredsFromFile = lazy(async (): Promise<{ key: string; }> => {
131
- const path = "cloudflare.json";
132
- if (!fs.existsSync(path)) {
133
- throw new Error(`Must add cloudflare.json file to root of project (or call setCloudflareCredentials).`);
134
- }
135
- let creds = JSON.parse(fs.readFileSync(path, "utf8")) as { key: string; };
136
- return {
137
- key: creds.key,
138
- };
139
- });
140
- async function getCloudflareCreds() {
141
- return credsOverride || await getCloudflareCredsFromFile();
142
- }
143
-
144
- async function cloudflareGETCall<T>(path: string, params?: { [key: string]: string }): Promise<T> {
145
- let url = new URL(`https://api.cloudflare.com/client/v4` + path);
146
- for (let key in params) {
147
- url.searchParams.set(key, params[key]);
148
- }
149
- let creds = await getCloudflareCreds();
150
- let result = await httpsRequest(url.toString(), [], "GET", undefined, {
151
- headers: {
152
- "Content-Type": "application/json",
153
- "Authorization": `Bearer ${creds.key}`,
154
- }
155
- });
156
- let result2 = JSON.parse(result.toString()) as { result: unknown; success: boolean; errors: { code: number; message: string }[] };
157
- if (!result2.success) {
158
- throw new Error(`Cloudflare call failed: ${result2.errors.map(x => x.message).join(", ")}`);
172
+ for (let ttlLeft = ttl; ttlLeft > 0; ttlLeft--) {
173
+ await delay(1000);
174
+ console.log(`${ttlLeft} seconds left...`);
159
175
  }
160
- return result2.result as T;
161
- }
162
- async function cloudflarePOSTCall<T>(path: string, params: { [key: string]: unknown }): Promise<T> {
163
- return await cloudflareCall(path, Buffer.from(JSON.stringify(params)), "POST");
176
+ console.log(`Done waiting for DNS to update.`);
164
177
  }
165
- async function cloudflareCall<T>(path: string, payload: Buffer, method: string): Promise<T> {
166
- let url = new URL(`https://api.cloudflare.com/client/v4` + path);
167
- let creds = await getCloudflareCreds();
168
- let result = await httpsRequest(url.toString(), payload, method, undefined, {
169
- headers: {
170
- "Content-Type": "application/json",
171
- "Authorization": `Bearer ${creds.key}`,
172
- }
173
- });
174
- let result2 = JSON.parse(result.toString()) as { result: unknown; success: boolean; errors: { code: number; message: string }[] };
175
- if (!result2.success) {
176
- throw new Error(`Cloudflare call failed: ${result2.errors.map(x => x.message).join(", ")}`);
177
- }
178
- return result2.result as T;
179
- }
@@ -2,9 +2,6 @@ export type HostServerConfig = {
2
2
  /** Full domain to host on (e.g. "testsite.example.com"). The HTTPS cert is created for this domain and *.domain, so using a subdomain never touches the root domain (beyond its _acme-challenge TXT record). */
3
3
  domain: string;
4
4
  port: number;
5
- /** Cloudflare API token (or a path to a file containing one). If neither is given, ./cloudflare.json is used. */
6
- cloudflareApiToken?: string;
7
- cloudflareApiTokenPath?: string;
8
5
  /** Creates an unproxied A record pointing domain at this machine (publicIp, or our detected external IP) */
9
6
  setDNSRecord?: boolean;
10
7
  publicIp?: string;
@@ -5,9 +5,9 @@ import { timeInMinute } from "socket-function/src/misc";
5
5
  import { delay } from "socket-function/src/batching";
6
6
  import { getExternalIP } from "socket-function/src/networking";
7
7
  import { magenta } from "socket-function/src/formatting/logColors";
8
- import { getThreadKeyCert, loadIdentityCA } from "./certs";
8
+ import { getOwnMachineId, getThreadKeyCert, loadIdentityCA } from "./certs";
9
9
  import { generateCert, getAccountKey, parseCert } from "./httpsCerts";
10
- import { setCloudflareCredentials, setRecord } from "./dns";
10
+ import { setRecord } from "./dns";
11
11
 
12
12
  // Renew somewhere randomly between 40% and 60% of the way through the cert lifetime. The random threshold staggers parallel processes on the same machine, so usually one process renews early, and the others see the renewed cert on disk (we re-read the disk before every renewal check) and never renew themselves.
13
13
  const RENEW_THRESHOLD_MIN = 0.4;
@@ -21,9 +21,8 @@ export type HostServerConfig = {
21
21
  /** Full domain to host on (e.g. "testsite.example.com"). The HTTPS cert is created for this domain and *.domain, so using a subdomain never touches the root domain (beyond its _acme-challenge TXT record). */
22
22
  domain: string;
23
23
  port: number;
24
- /** Cloudflare API token (or a path to a file containing one). If neither is given, ./cloudflare.json is used. */
25
- cloudflareApiToken?: string;
26
- cloudflareApiTokenPath?: string;
24
+
25
+ // TODO: Eventually we should support running without Cloudflare API tokens. It's annoying though as the user will have to create a self-signed certificate and then they'll have to go through and trust it everywhere, and a lot of the stuff is transparent, and so it'll have to be non-transparent, getting the user to go to the page that owns the domain and trust it from there. It's much better just make a Cloudflare account. You can buy a domain for $15 a year, and then you can use it for GitHub pages to host your own site and do all kinds of things just like any other real site.
27
26
  /** Creates an unproxied A record pointing domain at this machine (publicIp, or our detected external IP) */
28
27
  setDNSRecord?: boolean;
29
28
  publicIp?: string;
@@ -33,9 +32,6 @@ export type HostServerConfig = {
33
32
  /** Hosts a SocketFunction server on a real domain, with an automatically created and renewed Let's Encrypt HTTPS certificate (cached in the home folder, shared between processes on the machine). Expose your controllers (and any RequireController setup) before calling this. Returns the mounted nodeId. */
34
33
  export async function hostServer(config: HostServerConfig): Promise<string> {
35
34
  let { domain, port } = config;
36
- if (config.cloudflareApiToken || config.cloudflareApiTokenPath) {
37
- setCloudflareCredentials({ key: config.cloudflareApiToken, path: config.cloudflareApiTokenPath });
38
- }
39
35
  // The identity CA always lives on the root domain (nodeIds are threadHash.machineHash.root.tld)
40
36
  let rootDomain = domain.split(".").slice(-2).join(".");
41
37
  await loadIdentityCA(rootDomain);
@@ -56,6 +52,7 @@ export async function hostServer(config: HostServerConfig): Promise<string> {
56
52
 
57
53
  let nodeId = await SocketFunction.mount({
58
54
  public: true,
55
+ autoForwardPort: true,
59
56
  port,
60
57
  ...getThreadKeyCert(rootDomain),
61
58
  SNICerts: {
@@ -63,6 +60,13 @@ export async function hostServer(config: HostServerConfig): Promise<string> {
63
60
  callback(keyCert);
64
61
  certListeners.push(callback);
65
62
  },
63
+ [getOwnMachineId(rootDomain) + "." + rootDomain]: async callback => {
64
+ let threadCert = await getThreadKeyCert(rootDomain);
65
+ callback({
66
+ key: threadCert.key,
67
+ cert: threadCert.cert,
68
+ });
69
+ },
66
70
  },
67
71
  allowHostnames: config.allowHostnames,
68
72
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.7.9",
3
+ "version": "1.7.11",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -33,6 +33,7 @@
33
33
  "bin": {
34
34
  "filehoster": "./bin/filehoster.js",
35
35
  "autohost": "./bin/autohost.js",
36
+ "storageserver": "./bin/storageserver.js",
36
37
  "build-nodejs": "./builders/nodeJSBuildRun.js",
37
38
  "buildnodejs": "./builders/nodeJSBuildRun.js",
38
39
  "build-extension": "./builders/extensionBuildRun.js",
@@ -56,7 +57,7 @@
56
57
  "node-forge": "https://github.com/sliftist/forge#e618181b469b07bdc70b968b0391beb8ef5fecd6",
57
58
  "preact-old-types": "^10.28.1",
58
59
  "shell-quote": "^1.8.3",
59
- "socket-function": "^1.2.4",
60
+ "socket-function": "^1.2.16",
60
61
  "typenode": "^6.6.1",
61
62
  "typesafecss": "*",
62
63
  "ws": "^8.18.3",
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.observer = void 0;
4
+ module.allowclient = true;
4
5
  const mobx_1 = require("mobx");
5
6
  const measure_1 = require("socket-function/src/profiling/measure");
6
7
  let globalConstructOrder = 1;
@@ -32,5 +33,5 @@ function observer(Constructor) {
32
33
  };
33
34
  }
34
35
  exports.observer = observer;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJvYnNlcnZlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0JBQTRDO0FBQzVDLG1FQUFxRTtBQUVyRSxJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUM3QixTQUFnQixRQUFRLENBU3BCLFdBQWM7SUFFZCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQzVCLE9BQU8sS0FBTSxTQUFRLFdBQVc7UUFBekI7O1lBR0gsYUFBUSxHQUFHLElBQUksZUFBUSxDQUFDLFVBQVUsSUFBSSxJQUFJLG9CQUFvQixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQ3JFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztRQWNQLENBQUM7UUFsQkcsYUFBYTtRQUNiLE1BQU0sS0FBSyxJQUFJLEtBQUssT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUk5QyxvQkFBb0I7O1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsTUFBQSxLQUFLLENBQUMsb0JBQW9CLG9EQUFJLENBQUM7UUFDbkMsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQVc7WUFDakIsSUFBSSxNQUE2QixDQUFDO1lBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDckIsSUFBQSxzQkFBWSxFQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLEdBQUksS0FBSyxDQUFDLE1BQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxDQUFDLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDO0FBaENELDRCQWdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHByZWFjdCBmcm9tIFwicHJlYWN0XCI7XG5pbXBvcnQgeyBvYnNlcnZhYmxlLCBSZWFjdGlvbiB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgeyBtZWFzdXJlQmxvY2sgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9wcm9maWxpbmcvbWVhc3VyZVwiO1xuXG5sZXQgZ2xvYmFsQ29uc3RydWN0T3JkZXIgPSAxO1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVyPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICAgIG5ldyguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgICAgIHJlbmRlcigpOiBwcmVhY3QuQ29tcG9uZW50Q2hpbGQ7XG4gICAgICAgICAgICBmb3JjZVVwZGF0ZShjYWxsYmFjaz86ICgpID0+IHZvaWQpOiB2b2lkO1xuICAgICAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQ/KCk6IHZvaWQ7XG4gICAgICAgIH1cbiAgICB9XG4+KFxuICAgIENvbnN0cnVjdG9yOiBUXG4pIHtcbiAgICBsZXQgbmFtZSA9IENvbnN0cnVjdG9yLm5hbWU7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQ29uc3RydWN0b3Ige1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXRpYyBnZXQgbmFtZSgpIHsgcmV0dXJuIENvbnN0cnVjdG9yLm5hbWU7IH1cbiAgICAgICAgcmVhY3Rpb24gPSBuZXcgUmVhY3Rpb24oYHJlbmRlci4ke25hbWV9LiR7Z2xvYmFsQ29uc3RydWN0T3JkZXIrK31gLCAoKSA9PiB7XG4gICAgICAgICAgICBzdXBlci5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWN0aW9uLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50Py4oKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGxldCBvdXRwdXQ6IHByZWFjdC5Db21wb25lbnRDaGlsZDtcbiAgICAgICAgICAgIHRoaXMucmVhY3Rpb24udHJhY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lYXN1cmVCbG9jaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IChzdXBlci5yZW5kZXIgYXMgYW55KSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9LCBgJHtuYW1lfXxyZW5kZXJgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH07XG59Il19
36
- /* _JS_SOURCE_HASH = "fe68ffdc0211272fc44c1e75e0764edfae9f906d786a5dd59e684386a442d95f"; */
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJvYnNlcnZlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFHMUIsK0JBQTRDO0FBQzVDLG1FQUFxRTtBQUVyRSxJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUM3QixTQUFnQixRQUFRLENBU3BCLFdBQWM7SUFFZCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQzVCLE9BQU8sS0FBTSxTQUFRLFdBQVc7UUFBekI7O1lBR0gsYUFBUSxHQUFHLElBQUksZUFBUSxDQUFDLFVBQVUsSUFBSSxJQUFJLG9CQUFvQixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQ3JFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztRQWNQLENBQUM7UUFsQkcsYUFBYTtRQUNiLE1BQU0sS0FBSyxJQUFJLEtBQUssT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUk5QyxvQkFBb0I7O1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsTUFBQSxLQUFLLENBQUMsb0JBQW9CLG9EQUFJLENBQUM7UUFDbkMsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQVc7WUFDakIsSUFBSSxNQUE2QixDQUFDO1lBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDckIsSUFBQSxzQkFBWSxFQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLEdBQUksS0FBSyxDQUFDLE1BQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxDQUFDLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDO0FBaENELDRCQWdDQyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWU7XG5cbmltcG9ydCAqIGFzIHByZWFjdCBmcm9tIFwicHJlYWN0XCI7XG5pbXBvcnQgeyBvYnNlcnZhYmxlLCBSZWFjdGlvbiB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgeyBtZWFzdXJlQmxvY2sgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9wcm9maWxpbmcvbWVhc3VyZVwiO1xuXG5sZXQgZ2xvYmFsQ29uc3RydWN0T3JkZXIgPSAxO1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVyPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICAgIG5ldyguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgICAgIHJlbmRlcigpOiBwcmVhY3QuQ29tcG9uZW50Q2hpbGQ7XG4gICAgICAgICAgICBmb3JjZVVwZGF0ZShjYWxsYmFjaz86ICgpID0+IHZvaWQpOiB2b2lkO1xuICAgICAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQ/KCk6IHZvaWQ7XG4gICAgICAgIH1cbiAgICB9XG4+KFxuICAgIENvbnN0cnVjdG9yOiBUXG4pIHtcbiAgICBsZXQgbmFtZSA9IENvbnN0cnVjdG9yLm5hbWU7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQ29uc3RydWN0b3Ige1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXRpYyBnZXQgbmFtZSgpIHsgcmV0dXJuIENvbnN0cnVjdG9yLm5hbWU7IH1cbiAgICAgICAgcmVhY3Rpb24gPSBuZXcgUmVhY3Rpb24oYHJlbmRlci4ke25hbWV9LiR7Z2xvYmFsQ29uc3RydWN0T3JkZXIrK31gLCAoKSA9PiB7XG4gICAgICAgICAgICBzdXBlci5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWN0aW9uLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50Py4oKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGxldCBvdXRwdXQ6IHByZWFjdC5Db21wb25lbnRDaGlsZDtcbiAgICAgICAgICAgIHRoaXMucmVhY3Rpb24udHJhY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lYXN1cmVCbG9jaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IChzdXBlci5yZW5kZXIgYXMgYW55KSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9LCBgJHtuYW1lfXxyZW5kZXJgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH07XG59Il19
37
+ /* _JS_SOURCE_HASH = "9ea1e7947dad4dc649b606086b48cc67b99bda02fd8fbe7af03aa1185a7420d9"; */