sliftutils 1.7.87 → 1.7.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +3 -1
- package/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +675 -296
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/cloudflareHelpers.ts.cache +2 -2
- package/misc/https/dist/dns.ts.cache +2 -2
- package/misc/https/dist/hostServer.ts.cache +49 -21
- package/misc/https/dist/hostsFile.ts.cache +82 -0
- package/misc/https/dist/httpsCerts.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/hostServer.d.ts +6 -2
- package/misc/https/hostServer.ts +52 -19
- package/misc/https/hostsFile.d.ts +7 -0
- package/misc/https/hostsFile.ts +66 -0
- package/package.json +1 -1
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/ArchivesDisk.d.ts +3 -6
- package/storage/ArchivesDisk.ts +26 -2
- package/storage/BulkDatabase2/BulkDatabaseReader.ts +1 -1
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +3 -3
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/IArchives.d.ts +37 -24
- package/storage/IArchives.ts +47 -62
- package/storage/LogMap.d.ts +56 -0
- package/storage/LogMap.ts +220 -0
- package/storage/archiveHelpers.d.ts +36 -0
- package/storage/archiveHelpers.ts +103 -0
- package/storage/backblaze.d.ts +7 -12
- package/storage/backblaze.ts +53 -48
- package/storage/dist/ArchivesDisk.ts.cache +28 -2
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +16 -52
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/LogMap.ts.cache +212 -0
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +58 -44
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesDelayed.d.ts +66 -0
- package/storage/remoteStorage/ArchivesDelayed.ts +237 -0
- package/storage/remoteStorage/ArchivesRemote.d.ts +5 -6
- package/storage/remoteStorage/ArchivesRemote.ts +26 -5
- package/storage/remoteStorage/ArchivesUrl.d.ts +2 -5
- package/storage/remoteStorage/ArchivesUrl.ts +2 -2
- package/storage/remoteStorage/accessPage.tsx +12 -0
- package/storage/remoteStorage/accessStats.d.ts +1 -1
- package/storage/remoteStorage/accessStats.ts +3 -3
- package/storage/remoteStorage/blobStore.d.ts +162 -189
- package/storage/remoteStorage/blobStore.ts +495 -952
- package/storage/remoteStorage/bucketDisk.d.ts +24 -3
- package/storage/remoteStorage/bucketDisk.ts +56 -22
- package/storage/remoteStorage/certTrustModal.d.ts +1 -0
- package/storage/remoteStorage/certTrustModal.tsx +48 -0
- package/storage/remoteStorage/cliArgs.d.ts +2 -0
- package/storage/remoteStorage/cliArgs.ts +5 -0
- package/storage/remoteStorage/createArchives.d.ts +8 -7
- package/storage/remoteStorage/createArchives.ts +65 -26
- package/storage/remoteStorage/deployTakeover.ts +1 -1
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +220 -0
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +25 -5
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +3 -3
- package/storage/remoteStorage/dist/accessPage.tsx.cache +13 -3
- package/storage/remoteStorage/dist/accessStats.ts.cache +6 -6
- package/storage/remoteStorage/dist/blobStore.ts.cache +483 -965
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +60 -29
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +55 -0
- package/storage/remoteStorage/dist/cliArgs.ts.cache +9 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +63 -26
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +5 -5
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +286 -0
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +122 -56
- package/storage/remoteStorage/dist/serverConfig.ts.cache +4 -4
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -11
- package/storage/remoteStorage/dist/sourcesList.ts.cache +3 -6
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +27 -12
- package/storage/remoteStorage/dist/storageServer.ts.cache +27 -7
- package/storage/remoteStorage/dist/storageServerCli.ts.cache +7 -3
- package/storage/remoteStorage/dist/storageServerState.ts.cache +133 -696
- package/storage/remoteStorage/dist/storeConfig.ts.cache +52 -0
- package/storage/remoteStorage/dist/storePlan.ts.cache +110 -81
- package/storage/remoteStorage/dist/storeSources.ts.cache +51 -0
- package/storage/remoteStorage/dist/storeSync.ts.cache +650 -0
- package/storage/remoteStorage/dist/validation.ts.cache +14 -4
- package/storage/remoteStorage/intermediateManagement.d.ts +12 -0
- package/storage/remoteStorage/intermediateManagement.ts +264 -0
- package/storage/remoteStorage/remoteConfig.d.ts +32 -0
- package/storage/remoteStorage/remoteConfig.ts +115 -50
- package/storage/remoteStorage/serverConfig.d.ts +1 -1
- package/storage/remoteStorage/serverConfig.ts +1 -1
- package/storage/remoteStorage/sourceWrapper.ts +4 -8
- package/storage/remoteStorage/sourcesList.d.ts +0 -2
- package/storage/remoteStorage/sourcesList.ts +0 -3
- package/storage/remoteStorage/spec.md +18 -4
- package/storage/remoteStorage/storageController.d.ts +10 -0
- package/storage/remoteStorage/storageController.ts +29 -16
- package/storage/remoteStorage/storageServer.d.ts +2 -0
- package/storage/remoteStorage/storageServer.ts +28 -4
- package/storage/remoteStorage/storageServerCli.ts +5 -1
- package/storage/remoteStorage/storageServerState.d.ts +34 -21
- package/storage/remoteStorage/storageServerState.ts +147 -662
- package/storage/remoteStorage/storeConfig.d.ts +30 -0
- package/storage/remoteStorage/storeConfig.ts +62 -0
- package/storage/remoteStorage/storePlan.d.ts +29 -17
- package/storage/remoteStorage/storePlan.ts +112 -85
- package/storage/remoteStorage/storeSources.d.ts +11 -0
- package/storage/remoteStorage/storeSources.ts +47 -0
- package/storage/remoteStorage/storeSync.d.ts +53 -0
- package/storage/remoteStorage/storeSync.ts +632 -0
- package/storage/remoteStorage/validation.d.ts +2 -0
- package/storage/remoteStorage/validation.ts +10 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"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
|
};
|
|
@@ -17,6 +17,9 @@ const logColors_1 = require("socket-function/src/formatting/logColors");
|
|
|
17
17
|
const certs_1 = require("./certs");
|
|
18
18
|
const httpsCerts_1 = require("./httpsCerts");
|
|
19
19
|
const dns_1 = require("./dns");
|
|
20
|
+
const hostsFile_1 = require("./hostsFile");
|
|
21
|
+
// A self-signed cert is signed by our own CA and never renews via ACME, so it gets a long life
|
|
22
|
+
const SELF_SIGNED_LIFESPAN = 1000 * 60 * 60 * 24 * 365 * 10;
|
|
20
23
|
// 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.
|
|
21
24
|
const RENEW_THRESHOLD_MIN = 0.4;
|
|
22
25
|
const RENEW_THRESHOLD_MAX = 0.6;
|
|
@@ -32,11 +35,18 @@ async function hostServer(config) {
|
|
|
32
35
|
await (0, certs_1.loadIdentityCA)(rootDomain);
|
|
33
36
|
if (config.setDNSRecord) {
|
|
34
37
|
let ip = config.publicIp || await (0, networking_1.getExternalIP)();
|
|
35
|
-
|
|
38
|
+
if (config.selfSigned) {
|
|
39
|
+
// A self-signed server uses no Cloudflare at all (no ACME challenge and no public DNS record), so we resolve the ip-domain through THIS machine's hosts file instead. Other machines that need to reach it must resolve the domain themselves (a real DNS record, or the same hosts entry).
|
|
40
|
+
(0, hostsFile_1.setHostsEntry)({ ip, hostname: domain });
|
|
41
|
+
(0, hostsFile_1.setHostsEntry)({ ip: "127.0.0.1", hostname: "127-0-0-1." + rootDomain });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
await (0, dns_1.setRecord)("A", domain, ip);
|
|
45
|
+
}
|
|
36
46
|
}
|
|
37
|
-
let keyCert = await getFreshHTTPSCert(domain);
|
|
47
|
+
let keyCert = await getFreshHTTPSCert(domain, config.selfSigned);
|
|
38
48
|
let certListeners = [];
|
|
39
|
-
void runCertRenewalLoop(domain, newKeyCert => {
|
|
49
|
+
void runCertRenewalLoop(domain, config.selfSigned, newKeyCert => {
|
|
40
50
|
keyCert = newKeyCert;
|
|
41
51
|
for (let listener of certListeners) {
|
|
42
52
|
listener(newKeyCert);
|
|
@@ -45,7 +55,8 @@ async function hostServer(config) {
|
|
|
45
55
|
// With portFallback, a busy port is not an error: the underlying server scans for a free port instead (useAvailablePortIfPortInUse), and the nodeId tells us which port we actually got
|
|
46
56
|
let nodeId = await SocketFunction_1.SocketFunction.mount({
|
|
47
57
|
public: true,
|
|
48
|
-
|
|
58
|
+
// --internal servers are LAN-only, so we never open a port on the router
|
|
59
|
+
autoForwardPort: !config.internal,
|
|
49
60
|
port,
|
|
50
61
|
useAvailablePortIfPortInUse: !!config.portFallback,
|
|
51
62
|
...(0, certs_1.getThreadKeyCert)(rootDomain),
|
|
@@ -73,7 +84,7 @@ async function hostServer(config) {
|
|
|
73
84
|
if (fallback && servingPort !== port) {
|
|
74
85
|
console.warn(`Port ${port} is in use (presumably by our predecessor); serving on alternate port ${servingPort} until it frees`);
|
|
75
86
|
await ((_b = fallback.onPortInUse) === null || _b === void 0 ? void 0 : _b.call(fallback));
|
|
76
|
-
void runMainPortAcquireLoop(domain, port, servingPort, fallback);
|
|
87
|
+
void runMainPortAcquireLoop(domain, port, servingPort, fallback, !!config.internal);
|
|
77
88
|
}
|
|
78
89
|
fallback === null || fallback === void 0 ? void 0 : fallback.onListening(servingPort, servingPort === port);
|
|
79
90
|
console.log((0, logColors_1.magenta)(`Hosting https://${domain}:${servingPort} (nodeId ${nodeId})`));
|
|
@@ -81,7 +92,7 @@ async function hostServer(config) {
|
|
|
81
92
|
}
|
|
82
93
|
exports.hostServer = hostServer;
|
|
83
94
|
// SocketFunction can only mount once per process, so "taking over" the main port is a raw TCP relay forwarding to our real listener - TLS/SNI passes straight through, and clients address servers by ip domain (wildcard negotiation), so the extra hop is invisible.
|
|
84
|
-
async function runMainPortAcquireLoop(domain, mainPort, servingPort, fallback) {
|
|
95
|
+
async function runMainPortAcquireLoop(domain, mainPort, servingPort, fallback, internal) {
|
|
85
96
|
while (true) {
|
|
86
97
|
await (0, batching_1.delay)(fallback.getAcquireDelay());
|
|
87
98
|
let acquired = await new Promise(resolve => {
|
|
@@ -104,36 +115,53 @@ async function runMainPortAcquireLoop(domain, mainPort, servingPort, fallback) {
|
|
|
104
115
|
});
|
|
105
116
|
if (acquired) {
|
|
106
117
|
console.log((0, logColors_1.magenta)(`Acquired main port ${mainPort} for https://${domain} (relaying to our listener on ${servingPort})`));
|
|
107
|
-
// The mount only forwarded OUR serving port; the main port needs its own mapping (the predecessor's mapping pointed at the same machine+port, but dies with it)
|
|
108
|
-
|
|
118
|
+
// The mount only forwarded OUR serving port; the main port needs its own mapping (the predecessor's mapping pointed at the same machine+port, but dies with it). LAN-only (--internal) servers never open router ports.
|
|
119
|
+
if (!internal) {
|
|
120
|
+
await (0, forwardPort_1.forwardPort)({ externalPort: mainPort, internalPort: mainPort });
|
|
121
|
+
}
|
|
109
122
|
fallback.onListening(mainPort, true);
|
|
110
123
|
return;
|
|
111
124
|
}
|
|
112
125
|
}
|
|
113
126
|
}
|
|
114
|
-
|
|
115
|
-
|
|
127
|
+
// Self-signed certs cache under a distinct name, so switching a domain between ACME and self-signed never reads back the wrong kind
|
|
128
|
+
function getCertDiskPath(domain, selfSigned) {
|
|
129
|
+
return os_1.default.homedir() + `/httpscert_${selfSigned ? "selfsigned_" : ""}${domain}.json`;
|
|
116
130
|
}
|
|
117
|
-
function readCertFromDisk(domain) {
|
|
131
|
+
function readCertFromDisk(domain, selfSigned) {
|
|
118
132
|
try {
|
|
119
|
-
return JSON.parse(fs_1.default.readFileSync(getCertDiskPath(domain), "utf8"));
|
|
133
|
+
return JSON.parse(fs_1.default.readFileSync(getCertDiskPath(domain, selfSigned), "utf8"));
|
|
120
134
|
}
|
|
121
135
|
catch (_a) {
|
|
122
136
|
return undefined;
|
|
123
137
|
}
|
|
124
138
|
}
|
|
139
|
+
// A TLS cert for `domain` signed by this machine's identity CA, presented as a chain (leaf + CA) so a client that trusts the CA validates it. The key part of the ip-domain scheme is unchanged: browsers ignore nameConstraints and validate the SAN + chain; a browser that hasn't trusted the CA prompts the user, who accepts it once (the trust-cert flow), and node peers trust it via the CA.
|
|
140
|
+
function generateSelfSignedCert(domain) {
|
|
141
|
+
let rootDomain = domain.split(".").slice(-2).join(".");
|
|
142
|
+
let ca = (0, certs_1.getIdentityCA)(rootDomain);
|
|
143
|
+
let leaf = (0, certs_1.createX509)({ domain, issuer: ca, keyPair: (0, certs_1.generateKeyPair)(), lifeSpan: SELF_SIGNED_LIFESPAN });
|
|
144
|
+
return { key: leaf.key.toString(), cert: leaf.cert.toString() + "\n" + ca.cert.toString() };
|
|
145
|
+
}
|
|
125
146
|
function getRenewTime(certPem, threshold) {
|
|
126
147
|
let certObj = (0, httpsCerts_1.parseCert)(certPem);
|
|
127
148
|
let start = +new Date(certObj.validity.notBefore);
|
|
128
149
|
let end = +new Date(certObj.validity.notAfter);
|
|
129
150
|
return start + (end - start) * threshold;
|
|
130
151
|
}
|
|
131
|
-
/** Returns the cached HTTPS cert for the domain, creating/renewing it first if it is past this process's renewal threshold. Reads the disk cache on every call, so a renewal done by a parallel process is picked up instead of renewing again. */
|
|
132
|
-
async function getFreshHTTPSCert(domain) {
|
|
133
|
-
let keyCert = readCertFromDisk(domain);
|
|
152
|
+
/** Returns the cached HTTPS cert for the domain, creating/renewing it first if it is past this process's renewal threshold. Reads the disk cache on every call, so a renewal done by a parallel process is picked up instead of renewing again. selfSigned: sign it with this machine's CA instead of getting a real ACME cert. */
|
|
153
|
+
async function getFreshHTTPSCert(domain, selfSigned) {
|
|
154
|
+
let keyCert = readCertFromDisk(domain, selfSigned);
|
|
134
155
|
if (keyCert && getRenewTime(keyCert.cert, renewThreshold) > Date.now()) {
|
|
135
156
|
return keyCert;
|
|
136
157
|
}
|
|
158
|
+
if (selfSigned) {
|
|
159
|
+
// Cached so the served cert is stable across restarts (a browser's accepted-certificate exception is per exact cert)
|
|
160
|
+
console.log((0, logColors_1.magenta)(keyCert ? `Self-signed cert for ${domain} is expiring, regenerating` : `No self-signed cert on disk for ${domain}, creating one (signed by this machine's CA)`));
|
|
161
|
+
let generated = generateSelfSignedCert(domain);
|
|
162
|
+
fs_1.default.writeFileSync(getCertDiskPath(domain, true), JSON.stringify(generated));
|
|
163
|
+
return generated;
|
|
164
|
+
}
|
|
137
165
|
if (keyCert) {
|
|
138
166
|
console.log((0, logColors_1.magenta)(`HTTPS cert for ${domain} is past ${(renewThreshold * 100).toFixed(0)}% of its lifetime, renewing`));
|
|
139
167
|
}
|
|
@@ -157,13 +185,13 @@ async function getFreshHTTPSCert(domain) {
|
|
|
157
185
|
return { key: keyCert.key, cert: keyCert.cert };
|
|
158
186
|
}
|
|
159
187
|
exports.getFreshHTTPSCert = getFreshHTTPSCert;
|
|
160
|
-
async function runCertRenewalLoop(domain, onNewCert) {
|
|
188
|
+
async function runCertRenewalLoop(domain, selfSigned, onNewCert) {
|
|
161
189
|
var _a;
|
|
162
|
-
let lastCert = (_a = readCertFromDisk(domain)) === null || _a === void 0 ? void 0 : _a.cert;
|
|
190
|
+
let lastCert = (_a = readCertFromDisk(domain, selfSigned)) === null || _a === void 0 ? void 0 : _a.cert;
|
|
163
191
|
while (true) {
|
|
164
192
|
await (0, batching_1.delay)(CERT_CHECK_INTERVAL);
|
|
165
193
|
try {
|
|
166
|
-
let keyCert = await getFreshHTTPSCert(domain);
|
|
194
|
+
let keyCert = await getFreshHTTPSCert(domain, selfSigned);
|
|
167
195
|
if (keyCert.cert !== lastCert) {
|
|
168
196
|
lastCert = keyCert.cert;
|
|
169
197
|
console.log((0, logColors_1.magenta)(`HTTPS cert for ${domain} updated, applying to running server`));
|
|
@@ -175,5 +203,5 @@ async function runCertRenewalLoop(domain, onNewCert) {
|
|
|
175
203
|
}
|
|
176
204
|
}
|
|
177
205
|
}
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdFNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhvc3RTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLDRDQUFvQjtBQUNwQiw4Q0FBc0I7QUFDdEIsbUVBQWdFO0FBQ2hFLDZEQUFrRTtBQUNsRSxtREFBd0Q7QUFDeEQsMkRBQXFEO0FBQ3JELCtEQUErRDtBQUMvRCxpRUFBOEQ7QUFDOUQsd0VBQW1FO0FBQ25FLG1DQUE0RTtBQUM1RSw2Q0FBc0U7QUFDdEUsK0JBQWtDO0FBRWxDLHlUQUF5VDtBQUN6VCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLG1CQUFZLEdBQUcsRUFBRSxDQUFDO0FBRTlDLGlHQUFpRztBQUNqRyxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO0FBdUJ6RyxpVEFBaVQ7QUFDMVMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxNQUF3Qjs7SUFDckQsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDOUIsZ0dBQWdHO0lBQ2hHLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sSUFBQSxzQkFBYyxFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWpDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxJQUFBLDBCQUFhLEdBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUEsZUFBUyxFQUFDLEdB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bmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBuZXQgZnJvbSBcIm5ldFwiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBnZXROb2RlSWRMb2NhdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL25vZGVDYWNoZVwiO1xuaW1wb3J0IHsgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0RXh0ZXJuYWxJUCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL25ldHdvcmtpbmdcIjtcbmltcG9ydCB7IGZvcndhcmRQb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9yd2FyZFBvcnRcIjtcbmltcG9ydCB7IG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgZ2V0T3duTWFjaGluZUlkLCBnZXRUaHJlYWRLZXlDZXJ0LCBsb2FkSWRlbnRpdHlDQSB9IGZyb20gXCIuL2NlcnRzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUNlcnQsIGdldEFjY291bnRLZXksIHBhcnNlQ2VydCB9IGZyb20gXCIuL2h0dHBzQ2VydHNcIjtcbmltcG9ydCB7IHNldFJlY29yZCB9IGZyb20gXCIuL2Ruc1wiO1xuXG4vLyBSZW5ldyBzb21ld2hlcmUgcmFuZG9tbHkgYmV0d2VlbiA0MCUgYW5kIDYwJSBvZiB0aGUgd2F5IHRocm91Z2ggdGhlIGNlcnQgbGlmZXRpbWUuIFRoZSByYW5kb20gdGhyZXNob2xkIHN0YWdnZXJzIHBhcmFsbGVsIHByb2Nlc3NlcyBvbiB0aGUgc2FtZSBtYWNoaW5lLCBzbyB1c3VhbGx5IG9uZSBwcm9jZXNzIHJlbmV3cyBlYXJseSwgYW5kIHRoZSBvdGhlcnMgc2VlIHRoZSByZW5ld2VkIGNlcnQgb24gZGlzayAod2UgcmUtcmVhZCB0aGUgZGlzayBiZWZvcmUgZXZlcnkgcmVuZXdhbCBjaGVjaykgYW5kIG5ldmVyIHJlbmV3IHRoZW1zZWx2ZXMuXG5jb25zdCBSRU5FV19USFJFU0hPTERfTUlOID0gMC40O1xuY29uc3QgUkVORVdfVEhSRVNIT0xEX01BWCA9IDAuNjtcbmNvbnN0IENFUlRfQ0hFQ0tfSU5URVJWQUwgPSB0aW1lSW5NaW51dGUgKiAxNTtcblxuLy8gT25lIHRocmVzaG9sZCBwZXIgcHJvY2Vzcywgc28gYSBwcm9jZXNzIGlzIGNvbnNpc3RlbnRseSBlYXJseSBvciBsYXRlIHJlbGF0aXZlIHRvIGl0cyBzaWJsaW5nc1xuY29uc3QgcmVuZXdUaHJlc2hvbGQgPSBSRU5FV19USFJFU0hPTERfTUlOICsgTWF0aC5yYW5kb20oKSAqIChSRU5FV19USFJFU0hPTERfTUFYIC0gUkVORVdfVEhSRVNIT0xEX01JTik7XG5cbmV4cG9ydCB0eXBlIEhvc3RTZXJ2ZXJDb25maWcgPSB7XG4gICAgLyoqIEZ1bGwgZG9tYWluIHRvIGhvc3Qgb24gKGUuZy4gXCJ0ZXN0c2l0ZS5leGFtcGxlLmNvbVwiKS4gVGhlIEhUVFBTIGNlcnQgaXMgY3JlYXRlZCBmb3IgdGhpcyBkb21haW4gYW5kICouZG9tYWluLCBzbyB1c2luZyBhIHN1YmRvbWFpbiBuZXZlciB0b3VjaGVzIHRoZSByb290IGRvbWFpbiAoYmV5b25kIGl0cyBfYWNtZS1jaGFsbGVuZ2UgVFhUIHJlY29yZCkuICovXG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuXG4gICAgLy8gVE9ETzogRXZlbnR1YWxseSB3ZSBzaG91bGQgc3VwcG9ydCBydW5uaW5nIHdpdGhvdXQgQ2xvdWRmbGFyZSBBUEkgdG9rZW5zLiBJdCdzIGFubm95aW5nIHRob3VnaCBhcyB0aGUgdXNlciB3aWxsIGhhdmUgdG8gY3JlYXRlIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYW5kIHRoZW4gdGhleSdsbCBoYXZlIHRvIGdvIHRocm91Z2ggYW5kIHRydXN0IGl0IGV2ZXJ5d2hlcmUsIGFuZCBhIGxvdCBvZiB0aGUgc3R1ZmYgaXMgdHJhbnNwYXJlbnQsIGFuZCBzbyBpdCdsbCBoYXZlIHRvIGJlIG5vbi10cmFuc3BhcmVudCwgZ2V0dGluZyB0aGUgdXNlciB0byBnbyB0byB0aGUgcGFnZSB0aGF0IG93bnMgdGhlIGRvbWFpbiBhbmQgdHJ1c3QgaXQgZnJvbSB0aGVyZS4gSXQncyBtdWNoIGJldHRlciBqdXN0IG1ha2UgYSBDbG91ZGZsYXJlIGFjY291bnQuIFlvdSBjYW4gYnV5IGEgZG9tYWluIGZvciAkMTUgYSB5ZWFyLCBhbmQgdGhlbiB5b3UgY2FuIHVzZSBpdCBmb3IgR2l0SHViIHBhZ2VzIHRvIGhvc3QgeW91ciBvd24gc2l0ZSBhbmQgZG8gYWxsIGtpbmRzIG9mIHRoaW5ncyBqdXN0IGxpa2UgYW55IG90aGVyIHJlYWwgc2l0ZS5cbiAgICAvKiogQ3JlYXRlcyBhbiB1bnByb3hpZWQgQSByZWNvcmQgcG9pbnRpbmcgZG9tYWluIGF0IHRoaXMgbWFjaGluZSAocHVibGljSXAsIG9yIG91ciBkZXRlY3RlZCBleHRlcm5hbCBJUCkgKi9cbiAgICBzZXRETlNSZWNvcmQ/OiBib29sZWFuO1xuICAgIHB1YmxpY0lwPzogc3RyaW5nO1xuICAgIGFsbG93SG9zdG5hbWVzPzogc3RyaW5nW107XG4gICAgLyoqIFdoZW4gdGhlIHBvcnQgaXMgYnVzeSAoZS5nLiB0aGUgcHJldmlvdXMgZGVwbG95IHN0aWxsIGhvbGRzIGl0KSwgbW91bnQgb24gYW4gYWx0ZXJuYXRlIHBvcnQgaW5zdGVhZCAodGhlIHNvY2tldCBzZXJ2ZXIncyBidWlsdC1pbiBmcmVlLXBvcnQgc2NhbiksIGFuZCBrZWVwIHRyeWluZyB0byB0YWtlIHRoZSByZWFsIHBvcnQgLSBvbmNlIGl0IGZyZWVzLCBhIHJhdyBUQ1AgcmVsYXkgb24gdGhlIHJlYWwgcG9ydCBmb3J3YXJkcyB0byBvdXIgbGlzdGVuZXIgKFNvY2tldEZ1bmN0aW9uIGNhbiBvbmx5IG1vdW50IG9uY2UgcGVyIHByb2Nlc3MpLiAqL1xuICAgIHBvcnRGYWxsYmFjaz86IHtcbiAgICAgICAgLyoqIERlbGF5IHVudGlsIHRoZSBuZXh0IG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0ICh0aWdodGVuZWQgYXJvdW5kIHRoZSBwcmVkZWNlc3NvcidzIHNjaGVkdWxlZCBkZWF0aCkgKi9cbiAgICAgICAgZ2V0QWNxdWlyZURlbGF5OiAoKSA9PiBudW1iZXI7XG4gICAgICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgbWFpbiBwb3J0IHR1cm5lZCBvdXQgdG8gYmUgYnVzeSwgYmVmb3JlIHdlIGFjdCBhcyBpdHMgc3VjY2Vzc29yIGluIGFueSB3YXkuIFRocm93aW5nIGFib3J0cyBzdGFydHVwIC0gYSBidXN5IHBvcnQgd2l0aCBubyBkZXBsb3kgaW4gcHJvZ3Jlc3MgbWVhbnMgc29tZXRoaW5nIGVsc2UgaG9sZHMgaXQsIHdoaWNoIGlzIG5vdCBhIHN0YXRlIHRvIGtlZXAgcnVubmluZyBpbi4gKi9cbiAgICAgICAgb25Qb3J0SW5Vc2U/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICAvKiogUmVwb3J0cyBldmVyeSBwb3J0IHdlIGJlY29tZSByZWFjaGFibGUgb24gKHRoZSBhbHRlcm5hdGUgYXQgbW91bnQsIHRoZSBtYWluIHBvcnQgb25jZSByZWxheWVkKSAqL1xuICAgICAgICBvbkxpc3RlbmluZzogKHBvcnQ6IG51bWJlciwgaXNNYWluUG9ydDogYm9vbGVhbikgPT4gdm9pZDtcbiAgICB9O1xufTtcblxuLyoqIEhvc3RzIGEgU29ja2V0RnVuY3Rpb24gc2VydmVyIG9uIGEgcmVhbCBkb21haW4sIHdpdGggYW4gYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCByZW5ld2VkIExldCdzIEVuY3J5cHQgSFRUUFMgY2VydGlmaWNhdGUgKGNhY2hlZCBpbiB0aGUgaG9tZSBmb2xkZXIsIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyBvbiB0aGUgbWFjaGluZSkuIEV4cG9zZSB5b3VyIGNvbnRyb2xsZXJzIChhbmQgYW55IFJlcXVpcmVDb250cm9sbGVyIHNldHVwKSBiZWZvcmUgY2FsbGluZyB0aGlzLiBSZXR1cm5zIHRoZSBtb3VudGVkIG5vZGVJZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBob3N0U2VydmVyKGNvbmZpZzogSG9zdFNlcnZlckNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBjb25maWc7XG4gICAgLy8gVGhlIGlkZW50aXR5IENBIGFsd2F5cyBsaXZlcyBvbiB0aGUgcm9vdCBkb21haW4gKG5vZGVJZHMgYXJlIHRocmVhZEhhc2gubWFjaGluZUhhc2gucm9vdC50bGQpXG4gICAgbGV0IHJvb3REb21haW4gPSBkb21haW4uc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcbiAgICBhd2FpdCBsb2FkSWRlbnRpdHlDQShyb290RG9tYWluKTtcblxuICAgIGlmIChjb25maWcuc2V0RE5TUmVjb3JkKSB7XG4gICAgICAgIGxldCBpcCA9IGNvbmZpZy5wdWJsaWNJcCB8fCBhd2FpdCBnZXRFeHRlcm5hbElQKCk7XG4gICAgICAgIGF3YWl0IHNldFJlY29yZChcIkFcIiwgZG9tYWluLCBpcCk7XG4gICAgfVxuXG4gICAgbGV0IGtleUNlcnQgPSBhd2FpdCBnZXRGcmVzaEhUVFBTQ2VydChkb21haW4pO1xuICAgIGxldCBjZXJ0TGlzdGVuZXJzOiAoKHZhbHVlOiB7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfSkgPT4gdm9pZClbXSA9IFtdO1xuICAgIHZvaWQgcnVuQ2VydFJlbmV3YWxMb29wKGRvbWFpbiwgbmV3S2V5Q2VydCA9PiB7XG4gICAgICAgIGtleUNlcnQgPSBuZXdLZXlDZXJ0O1xuICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiBjZXJ0TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihuZXdLZXlDZXJ0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2l0aCBwb3J0RmFsbGJhY2ssIGEgYnVzeSBwb3J0IGlzIG5vdCBhbiBlcnJvcjogdGhlIHVuZGVybHlpbmcgc2VydmVyIHNjYW5zIGZvciBhIGZyZWUgcG9ydCBpbnN0ZWFkICh1c2VBdmFpbGFibGVQb3J0SWZQb3J0SW5Vc2UpLCBhbmQgdGhlIG5vZGVJZCB0ZWxscyB1cyB3aGljaCBwb3J0IHdlIGFjdHVhbGx5IGdvdFxuICAgIGxldCBub2RlSWQgPSBhd2FpdCBTb2NrZXRGdW5jdGlvbi5tb3VudCh7XG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgYXV0b0ZvcndhcmRQb3J0OiB0cnVlLFxuICAgICAgICBwb3J0LFxuICAgICAgICB1c2VBdmFpbGFibGVQb3J0SWZQb3J0SW5Vc2U6ICEhY29uZmlnLnBvcnRGYWxsYmFjayxcbiAgICAgICAgLi4uZ2V0VGhyZWFkS2V5Q2VydChyb290RG9tYWluKSxcbiAgICAgICAgU05JQ2VydHM6IHtcbiAgICAgICAgICAgIFtkb21haW5dOiBjYWxsYmFjayA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soa2V5Q2VydCk7XG4gICAgICAgICAgICAgICAgY2VydExpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbZ2V0T3duTWFjaGluZUlkKHJvb3REb21haW4pICsgXCIuXCIgKyByb290RG9tYWluXTogYXN5bmMgY2FsbGJhY2sgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0aHJlYWRDZXJ0ID0gYXdhaXQgZ2V0VGhyZWFkS2V5Q2VydChyb290RG9tYWluKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogdGhyZWFkQ2VydC5rZXksXG4gICAgICAgICAgICAgICAgICAgIGNlcnQ6IHRocmVhZENlcnQuY2VydCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXCIxMjctMC0wLTEuXCIgKyByb290RG9tYWluXTogYXN5bmMgY2FsbGJhY2sgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGtleUNlcnQpO1xuICAgICAgICAgICAgICAgIGNlcnRMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhbGxvd0hvc3RuYW1lczogY29uZmlnLmFsbG93SG9zdG5hbWVzLFxuICAgIH0pO1xuICAgIGxldCBzZXJ2aW5nUG9ydCA9IGdldE5vZGVJZExvY2F0aW9uKG5vZGVJZCk/LnBvcnQgfHwgcG9ydDtcbiAgICBsZXQgZmFsbGJhY2sgPSBjb25maWcucG9ydEZhbGxiYWNrO1xuICAgIGlmIChmYWxsYmFjayAmJiBzZXJ2aW5nUG9ydCAhPT0gcG9ydCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFBvcnQgJHtwb3J0fSBpcyBpbiB1c2UgKHByZXN1bWFibHkgYnkgb3VyIHByZWRlY2Vzc29yKTsgc2VydmluZyBvbiBhbHRlcm5hdGUgcG9ydCAke3NlcnZpbmdQb3J0fSB1bnRpbCBpdCBmcmVlc2ApO1xuICAgICAgICBhd2FpdCBmYWxsYmFjay5vblBvcnRJblVzZT8uKCk7XG4gICAgICAgIHZvaWQgcnVuTWFpblBvcnRBY3F1aXJlTG9vcChkb21haW4sIHBvcnQsIHNlcnZpbmdQb3J0LCBmYWxsYmFjayk7XG4gICAgfVxuICAgIGZhbGxiYWNrPy5vbkxpc3RlbmluZyhzZXJ2aW5nUG9ydCwgc2VydmluZ1BvcnQgPT09IHBvcnQpO1xuICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYEhvc3RpbmcgaHR0cHM6Ly8ke2RvbWFpbn06JHtzZXJ2aW5nUG9ydH0gKG5vZGVJZCAke25vZGVJZH0pYCkpO1xuICAgIHJldHVybiBub2RlSWQ7XG59XG5cbi8vIFNvY2tldEZ1bmN0aW9uIGNhbiBvbmx5IG1vdW50IG9uY2UgcGVyIHByb2Nlc3MsIHNvIFwidGFraW5nIG92ZXJcIiB0aGUgbWFpbiBwb3J0IGlzIGEgcmF3IFRDUCByZWxheSBmb3J3YXJkaW5nIHRvIG91ciByZWFsIGxpc3RlbmVyIC0gVExTL1NOSSBwYXNzZXMgc3RyYWlnaHQgdGhyb3VnaCwgYW5kIGNsaWVudHMgYWRkcmVzcyBzZXJ2ZXJzIGJ5IGlwIGRvbWFpbiAod2lsZGNhcmQgbmVnb3RpYXRpb24pLCBzbyB0aGUgZXh0cmEgaG9wIGlzIGludmlzaWJsZS5cbmFzeW5jIGZ1bmN0aW9uIHJ1bk1haW5Qb3J0QWNxdWlyZUxvb3AoZG9tYWluOiBzdHJpbmcsIG1haW5Qb3J0OiBudW1iZXIsIHNlcnZpbmdQb3J0OiBudW1iZXIsIGZhbGxiYWNrOiBOb25OdWxsYWJsZTxIb3N0U2VydmVyQ29uZmlnW1wicG9ydEZhbGxiYWNrXCJdPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KGZhbGxiYWNrLmdldEFjcXVpcmVEZWxheSgpKTtcbiAgICAgICAgbGV0IGFjcXVpcmVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVsYXkgPSBuZXQuY3JlYXRlU2VydmVyKGNsaWVudCA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHVwc3RyZWFtID0gbmV0LmNvbm5lY3QoeyBob3N0OiBcIjEyNy4wLjAuMVwiLCBwb3J0OiBzZXJ2aW5nUG9ydCB9KTtcbiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgZXZlcnkgcmVsYXllZCByZXF1ZXN0IHBheXMgdGhlIH40MG1zIGRlbGF5ZWQtQUNLIHRpbWVyOiBhIGNhbGwgaXMgYSBzbWFsbCB3cml0ZSAob2Z0ZW4gYSBoZWFkZXIgdGhlbiBhIGJvZHkpLCBOYWdsZSBob2xkcyB0aGUgc2Vjb25kIHdyaXRlIHVudGlsIHRoZSBmaXJzdCBpcyBhY2tub3dsZWRnZWQsIGFuZCB0aGUgcGVlciBoYXMgbm90aGluZyB0byBwaWdneWJhY2sgdGhlIEFDSyBvbi4gTWVhc3VyZWQgYXMgNDNtcyBwZXIgY2FsbCB0aHJvdWdoIHRoZSByZWxheSB2ZXJzdXMgMW1zIGRpcmVjdC5cbiAgICAgICAgICAgICAgICBjbGllbnQuc2V0Tm9EZWxheSh0cnVlKTtcbiAgICAgICAgICAgICAgICB1cHN0cmVhbS5zZXROb0RlbGF5KHRydWUpO1xuICAgICAgICAgICAgICAgIGNsaWVudC5waXBlKHVwc3RyZWFtKTtcbiAgICAgICAgICAgICAgICB1cHN0cmVhbS5waXBlKGNsaWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWVudC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNsaWVudC5vbihcImVycm9yXCIsIGNsZWFudXApO1xuICAgICAgICAgICAgICAgIHVwc3RyZWFtLm9uKFwiZXJyb3JcIiwgY2xlYW51cCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlbGF5Lm9uY2UoXCJlcnJvclwiLCAoKSA9PiByZXNvbHZlKGZhbHNlKSk7XG4gICAgICAgICAgICByZWxheS5saXN0ZW4obWFpblBvcnQsICgpID0+IHJlc29sdmUodHJ1ZSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGFjcXVpcmVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBBY3F1aXJlZCBtYWluIHBvcnQgJHttYWluUG9ydH0gZm9yIGh0dHBzOi8vJHtkb21haW59IChyZWxheWluZyB0byBvdXIgbGlzdGVuZXIgb24gJHtzZXJ2aW5nUG9ydH0pYCkpO1xuICAgICAgICAgICAgLy8gVGhlIG1vdW50IG9ubHkgZm9yd2FyZGVkIE9VUiBzZXJ2aW5nIHBvcnQ7IHRoZSBtYWluIHBvcnQgbmVlZHMgaXRzIG93biBtYXBwaW5nICh0aGUgcHJlZGVjZXNzb3IncyBtYXBwaW5nIHBvaW50ZWQgYXQgdGhlIHNhbWUgbWFjaGluZStwb3J0LCBidXQgZGllcyB3aXRoIGl0KVxuICAgICAgICAgICAgYXdhaXQgZm9yd2FyZFBvcnQoeyBleHRlcm5hbFBvcnQ6IG1haW5Qb3J0LCBpbnRlcm5hbFBvcnQ6IG1haW5Qb3J0IH0pO1xuICAgICAgICAgICAgZmFsbGJhY2sub25MaXN0ZW5pbmcobWFpblBvcnQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRDZXJ0RGlza1BhdGgoZG9tYWluOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3MuaG9tZWRpcigpICsgYC9odHRwc2NlcnRfJHtkb21haW59Lmpzb25gO1xufVxuZnVuY3Rpb24gcmVhZENlcnRGcm9tRGlzayhkb21haW46IHN0cmluZyk6IHsga2V5OiBzdHJpbmc7IGNlcnQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZ2V0Q2VydERpc2tQYXRoKGRvbWFpbiksIFwidXRmOFwiKSkgYXMgeyBrZXk6IHN0cmluZzsgY2VydDogc3RyaW5nIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UmVuZXdUaW1lKGNlcnRQZW06IHN0cmluZywgdGhyZXNob2xkOiBudW1iZXIpIHtcbiAgICBsZXQgY2VydE9iaiA9IHBhcnNlQ2VydChjZXJ0UGVtKTtcbiAgICBsZXQgc3RhcnQgPSArbmV3IERhdGUoY2VydE9iai52YWxpZGl0eS5ub3RCZWZvcmUpO1xuICAgIGxldCBlbmQgPSArbmV3IERhdGUoY2VydE9iai52YWxpZGl0eS5ub3RBZnRlcik7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHRocmVzaG9sZDtcbn1cblxuLyoqIFJldHVybnMgdGhlIGNhY2hlZCBIVFRQUyBjZXJ0IGZvciB0aGUgZG9tYWluLCBjcmVhdGluZy9yZW5ld2luZyBpdCBmaXJzdCBpZiBpdCBpcyBwYXN0IHRoaXMgcHJvY2VzcydzIHJlbmV3YWwgdGhyZXNob2xkLiBSZWFkcyB0aGUgZGlzayBjYWNoZSBvbiBldmVyeSBjYWxsLCBzbyBhIHJlbmV3YWwgZG9uZSBieSBhIHBhcmFsbGVsIHByb2Nlc3MgaXMgcGlja2VkIHVwIGluc3RlYWQgb2YgcmVuZXdpbmcgYWdhaW4uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RnJlc2hIVFRQU0NlcnQoZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IGNlcnQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IGtleUNlcnQgPSByZWFkQ2VydEZyb21EaXNrKGRvbWFpbik7XG4gICAgaWYgKGtleUNlcnQgJiYgZ2V0UmVuZXdUaW1lKGtleUNlcnQuY2VydCwgcmVuZXdUaHJlc2hvbGQpID4gRGF0ZS5ub3coKSkge1xuICAgICAgICByZXR1cm4ga2V5Q2VydDtcbiAgICB9XG4gICAgaWYgKGtleUNlcnQpIHtcbiAgICAgICAgY29uc29sZS5sb2cobWFnZW50YShgSFRUUFMgY2VydCBmb3IgJHtkb21haW59IGlzIHBhc3QgJHsocmVuZXdUaHJlc2hvbGQgKiAxMDApLnRvRml4ZWQoMCl9JSBvZiBpdHMgbGlmZXRpbWUsIHJlbmV3aW5nYCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYE5vIEhUVFBTIGNlcnQgb24gZGlzayBmb3IgJHtkb21haW59LCBjcmVhdGluZyBvbmVgKSk7XG4gICAgfVxuICAgIGxldCBhY2NvdW50S2V5ID0gYXdhaXQgZ2V0QWNjb3VudEtleShkb21haW4pO1xuICAgIHRyeSB7XG4gICAgICAgIGtleUNlcnQgPSBhd2FpdCBnZW5lcmF0ZUNlcnQoeyBhY2NvdW50S2V5LCBkb21haW4sIGFsdERvbWFpbnM6IFtcIiouXCIgKyBkb21haW5dIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKFN0cmluZyhlKS5pbmNsdWRlcyhcImF1dGhvcml6YXRpb24gbXVzdCBiZSBwZW5kaW5nXCIpKSB7XG4gICAgICAgICAgICAvLyBBbm90aGVyIHByb2Nlc3MgaXMgbWlkLXJlbmV3YWwuIFdhaXQgZm9yIGl0IHRvIGZpbmlzaCwgdGhlbiByZS1jaGVjayB0aGUgZGlzay5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDZXJ0aWZpY2F0ZSBhdXRob3JpemF0aW9uIGlzIHBlbmRpbmcgaW4gYW5vdGhlciBwcm9jZXNzLCB3YWl0aW5nIDIgbWludXRlc2ApO1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkodGltZUluTWludXRlICogMik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0RnJlc2hIVFRQU0NlcnQoZG9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBmcy53cml0ZUZpbGVTeW5jKGdldENlcnREaXNrUGF0aChkb21haW4pLCBKU09OLnN0cmluZ2lmeSh7IGtleToga2V5Q2VydC5rZXksIGNlcnQ6IGtleUNlcnQuY2VydCB9KSk7XG4gICAgcmV0dXJuIHsga2V5OiBrZXlDZXJ0LmtleSwgY2VydDoga2V5Q2VydC5jZXJ0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNlcnRSZW5ld2FsTG9vcChkb21haW46IHN0cmluZywgb25OZXdDZXJ0OiAoa2V5Q2VydDogeyBrZXk6IHN0cmluZzsgY2VydDogc3RyaW5nIH0pID0+IHZvaWQpIHtcbiAgICBsZXQgbGFzdENlcnQgPSByZWFkQ2VydEZyb21EaXNrKGRvbWFpbik/LmNlcnQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgYXdhaXQgZGVsYXkoQ0VSVF9DSEVDS19JTlRFUlZBTCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQga2V5Q2VydCA9IGF3YWl0IGdldEZyZXNoSFRUUFNDZXJ0KGRvbWFpbik7XG4gICAgICAgICAgICBpZiAoa2V5Q2VydC5jZXJ0ICE9PSBsYXN0Q2VydCkge1xuICAgICAgICAgICAgICAgIGxhc3RDZXJ0ID0ga2V5Q2VydC5jZXJ0O1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYEhUVFBTIGNlcnQgZm9yICR7ZG9tYWlufSB1cGRhdGVkLCBhcHBseWluZyB0byBydW5uaW5nIHNlcnZlcmApKTtcbiAgICAgICAgICAgICAgICBvbk5ld0NlcnQoa2V5Q2VydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjaGVjay9yZW5ldyBIVFRQUyBjZXJ0IGZvciAke2RvbWFpbn1gLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
179
|
-
/* _JS_SOURCE_HASH = "
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdFNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhvc3RTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLDRDQUFvQjtBQUNwQiw4Q0FBc0I7QUFDdEIsbUVBQWdFO0FBQ2hFLDZEQUFrRTtBQUNsRSxtREFBd0Q7QUFDeEQsMkRBQXFEO0FBQ3JELCtEQUErRDtBQUMvRCxpRUFBOEQ7QUFDOUQsd0VBQW1FO0FBQ25FLG1DQUF3SDtBQUN4SCw2Q0FBc0U7QUFDdEUsK0JBQWtDO0FBQ2xDLDJDQUE0QztBQUU1QywrRkFBK0Y7QUFDL0YsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUU1RCx5VEFBeVQ7QUFDelQsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxtQkFBbUIsR0FBRyxtQkFBWSxHQUFHLEVBQUUsQ0FBQztBQUU5QyxpR0FBaUc7QUFDakcsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztBQTJCekcsaVRBQWlUO0FBQzFTLEtBQUssVUFBVSxVQUFVLENBQUMsTUFBd0I7O0lBQ3JELElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQzlCLGdHQUFnRztJQUNoRyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUEsc0JBQWMsRUFBQyxVQUFVLENBQUMsQ0FBQztJQUVqQyxJQUFJLE1BQU0sQ0FBQyxZ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MUksSUFBSSxRQUFRLEdBQUcsTUFBQSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLDBDQUFFLElBQUksQ0FBQztJQUMxRCxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFBLGdCQUFLLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDRCxJQUFJLE9BQU8sR0FBRyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMxRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUEsbUJBQU8sRUFBQyxrQkFBa0IsTUFBTSxzQ0FBc0MsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JGLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgbmV0IGZyb20gXCJuZXRcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgZ2V0Tm9kZUlkTG9jYXRpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9ub2RlQ2FjaGVcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldEV4dGVybmFsSVAgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9uZXR3b3JraW5nXCI7XG5pbXBvcnQgeyBmb3J3YXJkUG9ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2ZvcndhcmRQb3J0XCI7XG5pbXBvcnQgeyBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCB7IGdldE93bk1hY2hpbmVJZCwgZ2V0VGhyZWFkS2V5Q2VydCwgbG9hZElkZW50aXR5Q0EsIGdldElkZW50aXR5Q0EsIGNyZWF0ZVg1MDksIGdlbmVyYXRlS2V5UGFpciB9IGZyb20gXCIuL2NlcnRzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUNlcnQsIGdldEFjY291bnRLZXksIHBhcnNlQ2VydCB9IGZyb20gXCIuL2h0dHBzQ2VydHNcIjtcbmltcG9ydCB7IHNldFJlY29yZCB9IGZyb20gXCIuL2Ruc1wiO1xuaW1wb3J0IHsgc2V0SG9zdHNFbnRyeSB9IGZyb20gXCIuL2hvc3RzRmlsZVwiO1xuXG4vLyBBIHNlbGYtc2lnbmVkIGNlcnQgaXMgc2lnbmVkIGJ5IG91ciBvd24gQ0EgYW5kIG5ldmVyIHJlbmV3cyB2aWEgQUNNRSwgc28gaXQgZ2V0cyBhIGxvbmcgbGlmZVxuY29uc3QgU0VMRl9TSUdORURfTElGRVNQQU4gPSAxMDAwICogNjAgKiA2MCAqIDI0ICogMzY1ICogMTA7XG5cbi8vIFJlbmV3IHNvbWV3aGVyZSByYW5kb21seSBiZXR3ZWVuIDQwJSBhbmQgNjAlIG9mIHRoZSB3YXkgdGhyb3VnaCB0aGUgY2VydCBsaWZldGltZS4gVGhlIHJhbmRvbSB0aHJlc2hvbGQgc3RhZ2dlcnMgcGFyYWxsZWwgcHJvY2Vzc2VzIG9uIHRoZSBzYW1lIG1hY2hpbmUsIHNvIHVzdWFsbHkgb25lIHByb2Nlc3MgcmVuZXdzIGVhcmx5LCBhbmQgdGhlIG90aGVycyBzZWUgdGhlIHJlbmV3ZWQgY2VydCBvbiBkaXNrICh3ZSByZS1yZWFkIHRoZSBkaXNrIGJlZm9yZSBldmVyeSByZW5ld2FsIGNoZWNrKSBhbmQgbmV2ZXIgcmVuZXcgdGhlbXNlbHZlcy5cbmNvbnN0IFJFTkVXX1RIUkVTSE9MRF9NSU4gPSAwLjQ7XG5jb25zdCBSRU5FV19USFJFU0hPTERfTUFYID0gMC42O1xuY29uc3QgQ0VSVF9DSEVDS19JTlRFUlZBTCA9IHRpbWVJbk1pbnV0ZSAqIDE1O1xuXG4vLyBPbmUgdGhyZXNob2xkIHBlciBwcm9jZXNzLCBzbyBhIHByb2Nlc3MgaXMgY29uc2lzdGVudGx5IGVhcmx5IG9yIGxhdGUgcmVsYXRpdmUgdG8gaXRzIHNpYmxpbmdzXG5jb25zdCByZW5ld1RocmVzaG9sZCA9IFJFTkVXX1RIUkVTSE9MRF9NSU4gKyBNYXRoLnJhbmRvbSgpICogKFJFTkVXX1RIUkVTSE9MRF9NQVggLSBSRU5FV19USFJFU0hPTERfTUlOKTtcblxuZXhwb3J0IHR5cGUgSG9zdFNlcnZlckNvbmZpZyA9IHtcbiAgICAvKiogRnVsbCBkb21haW4gdG8gaG9zdCBvbiAoZS5nLiBcInRlc3RzaXRlLmV4YW1wbGUuY29tXCIpLiBUaGUgSFRUUFMgY2VydCBpcyBjcmVhdGVkIGZvciB0aGlzIGRvbWFpbiBhbmQgKi5kb21haW4sIHNvIHVzaW5nIGEgc3ViZG9tYWluIG5ldmVyIHRvdWNoZXMgdGhlIHJvb3QgZG9tYWluIChiZXlvbmQgaXRzIF9hY21lLWNoYWxsZW5nZSBUWFQgcmVjb3JkKS4gKi9cbiAgICBkb21haW46IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG5cbiAgICAvLyBUT0RPOiBFdmVudHVhbGx5IHdlIHNob3VsZCBzdXBwb3J0IHJ1bm5pbmcgd2l0aG91dCBDbG91ZGZsYXJlIEFQSSB0b2tlbnMuIEl0J3MgYW5ub3lpbmcgdGhvdWdoIGFzIHRoZSB1c2VyIHdpbGwgaGF2ZSB0byBjcmVhdGUgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBhbmQgdGhlbiB0aGV5J2xsIGhhdmUgdG8gZ28gdGhyb3VnaCBhbmQgdHJ1c3QgaXQgZXZlcnl3aGVyZSwgYW5kIGEgbG90IG9mIHRoZSBzdHVmZiBpcyB0cmFuc3BhcmVudCwgYW5kIHNvIGl0J2xsIGhhdmUgdG8gYmUgbm9uLXRyYW5zcGFyZW50LCBnZXR0aW5nIHRoZSB1c2VyIHRvIGdvIHRvIHRoZSBwYWdlIHRoYXQgb3ducyB0aGUgZG9tYWluIGFuZCB0cnVzdCBpdCBmcm9tIHRoZXJlLiBJdCdzIG11Y2ggYmV0dGVyIGp1c3QgbWFrZSBhIENsb3VkZmxhcmUgYWNjb3VudC4gWW91IGNhbiBidXkgYSBkb21haW4gZm9yICQxNSBhIHllYXIsIGFuZCB0aGVuIHlvdSBjYW4gdXNlIGl0IGZvciBHaXRIdWIgcGFnZXMgdG8gaG9zdCB5b3VyIG93biBzaXRlIGFuZCBkbyBhbGwga2luZHMgb2YgdGhpbmdzIGp1c3QgbGlrZSBhbnkgb3RoZXIgcmVhbCBzaXRlLlxuICAgIC8qKiBDcmVhdGVzIGFuIHVucHJveGllZCBBIHJlY29yZCBwb2ludGluZyBkb21haW4gYXQgdGhpcyBtYWNoaW5lIChwdWJsaWNJcCwgb3Igb3VyIGRldGVjdGVkIGV4dGVybmFsIElQKSAqL1xuICAgIHNldEROU1JlY29yZD86IGJvb2xlYW47XG4gICAgcHVibGljSXA/OiBzdHJpbmc7XG4gICAgYWxsb3dIb3N0bmFtZXM/OiBzdHJpbmdbXTtcbiAgICAvKiogTEFOLW9ubHk6IGRvIE5PVCBmb3J3YXJkIHRoZSBwb3J0IChubyBVUG5QL05BVCBtYXBwaW5nKSwgZm9yIGEgc2VydmVyIHJlYWNoYWJsZSBvbmx5IG9uIHRoZSBsb2NhbCBuZXR3b3JrLiAqL1xuICAgIGludGVybmFsPzogYm9vbGVhbjtcbiAgICAvKiogU2VydmUgYSBUTFMgY2VydCBzaWduZWQgYnkgdGhpcyBtYWNoaW5lJ3MgQ0EgaW5zdGVhZCBvZiBvYnRhaW5pbmcgYSByZWFsIChBQ01FKSBvbmUuIFNlZSBnZXRGcmVzaEhUVFBTQ2VydC4gKi9cbiAgICBzZWxmU2lnbmVkPzogYm9vbGVhbjtcbiAgICAvKiogV2hlbiB0aGUgcG9ydCBpcyBidXN5IChlLmcuIHRoZSBwcmV2aW91cyBkZXBsb3kgc3RpbGwgaG9sZHMgaXQpLCBtb3VudCBvbiBhbiBhbHRlcm5hdGUgcG9ydCBpbnN0ZWFkICh0aGUgc29ja2V0IHNlcnZlcidzIGJ1aWx0LWluIGZyZWUtcG9ydCBzY2FuKSwgYW5kIGtlZXAgdHJ5aW5nIHRvIHRha2UgdGhlIHJlYWwgcG9ydCAtIG9uY2UgaXQgZnJlZXMsIGEgcmF3IFRDUCByZWxheSBvbiB0aGUgcmVhbCBwb3J0IGZvcndhcmRzIHRvIG91ciBsaXN0ZW5lciAoU29ja2V0RnVuY3Rpb24gY2FuIG9ubHkgbW91bnQgb25jZSBwZXIgcHJvY2VzcykuICovXG4gICAgcG9ydEZhbGxiYWNrPzoge1xuICAgICAgICAvKiogRGVsYXkgdW50aWwgdGhlIG5leHQgbWFpbi1wb3J0IGFjcXVpc2l0aW9uIGF0dGVtcHQgKHRpZ2h0ZW5lZCBhcm91bmQgdGhlIHByZWRlY2Vzc29yJ3Mgc2NoZWR1bGVkIGRlYXRoKSAqL1xuICAgICAgICBnZXRBY3F1aXJlRGVsYXk6ICgpID0+IG51bWJlcjtcbiAgICAgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBtYWluIHBvcnQgdHVybmVkIG91dCB0byBiZSBidXN5LCBiZWZvcmUgd2UgYWN0IGFzIGl0cyBzdWNjZXNzb3IgaW4gYW55IHdheS4gVGhyb3dpbmcgYWJvcnRzIHN0YXJ0dXAgLSBhIGJ1c3kgcG9ydCB3aXRoIG5vIGRlcGxveSBpbiBwcm9ncmVzcyBtZWFucyBzb21ldGhpbmcgZWxzZSBob2xkcyBpdCwgd2hpY2ggaXMgbm90IGEgc3RhdGUgdG8ga2VlcCBydW5uaW5nIGluLiAqL1xuICAgICAgICBvblBvcnRJblVzZT86ICgpID0+IFByb21pc2U8dm9pZD47XG4gICAgICAgIC8qKiBSZXBvcnRzIGV2ZXJ5IHBvcnQgd2UgYmVjb21lIHJlYWNoYWJsZSBvbiAodGhlIGFsdGVybmF0ZSBhdCBtb3VudCwgdGhlIG1haW4gcG9ydCBvbmNlIHJlbGF5ZWQpICovXG4gICAgICAgIG9uTGlzdGVuaW5nOiAocG9ydDogbnVtYmVyLCBpc01haW5Qb3J0OiBib29sZWFuKSA9PiB2b2lkO1xuICAgIH07XG59O1xuXG4vKiogSG9zdHMgYSBTb2NrZXRGdW5jdGlvbiBzZXJ2ZXIgb24gYSByZWFsIGRvbWFpbiwgd2l0aCBhbiBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHJlbmV3ZWQgTGV0J3MgRW5jcnlwdCBIVFRQUyBjZXJ0aWZpY2F0ZSAoY2FjaGVkIGluIHRoZSBob21lIGZvbGRlciwgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzIG9uIHRoZSBtYWNoaW5lKS4gRXhwb3NlIHlvdXIgY29udHJvbGxlcnMgKGFuZCBhbnkgUmVxdWlyZUNvbnRyb2xsZXIgc2V0dXApIGJlZm9yZSBjYWxsaW5nIHRoaXMuIFJldHVybnMgdGhlIG1vdW50ZWQgbm9kZUlkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhvc3RTZXJ2ZXIoY29uZmlnOiBIb3N0U2VydmVyQ29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGNvbmZpZztcbiAgICAvLyBUaGUgaWRlbnRpdHkgQ0EgYWx3YXlzIGxpdmVzIG9uIHRoZSByb290IGRvbWFpbiAobm9kZUlkcyBhcmUgdGhyZWFkSGFzaC5tYWNoaW5lSGFzaC5yb290LnRsZClcbiAgICBsZXQgcm9vdERvbWFpbiA9IGRvbWFpbi5zcGxpdChcIi5cIikuc2xpY2UoLTIpLmpvaW4oXCIuXCIpO1xuICAgIGF3YWl0IGxvYWRJZGVudGl0eUNBKHJvb3REb21haW4pO1xuXG4gICAgaWYgKGNvbmZpZy5zZXRETlNSZWNvcmQpIHtcbiAgICAgICAgbGV0IGlwID0gY29uZmlnLnB1YmxpY0lwIHx8IGF3YWl0IGdldEV4dGVybmFsSVAoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zZWxmU2lnbmVkKSB7XG4gICAgICAgICAgICAvLyBBIHNlbGYtc2lnbmVkIHNlcnZlciB1c2VzIG5vIENsb3VkZmxhcmUgYXQgYWxsIChubyBBQ01FIGNoYWxsZW5nZSBhbmQgbm8gcHVibGljIEROUyByZWNvcmQpLCBzbyB3ZSByZXNvbHZlIHRoZSBpcC1kb21haW4gdGhyb3VnaCBUSElTIG1hY2hpbmUncyBob3N0cyBmaWxlIGluc3RlYWQuIE90aGVyIG1hY2hpbmVzIHRoYXQgbmVlZCB0byByZWFjaCBpdCBtdXN0IHJlc29sdmUgdGhlIGRvbWFpbiB0aGVtc2VsdmVzIChhIHJlYWwgRE5TIHJlY29yZCwgb3IgdGhlIHNhbWUgaG9zdHMgZW50cnkpLlxuICAgICAgICAgICAgc2V0SG9zdHNFbnRyeSh7IGlwLCBob3N0bmFtZTogZG9tYWluIH0pO1xuICAgICAgICAgICAgc2V0SG9zdHNFbnRyeSh7IGlwOiBcIjEyNy4wLjAuMVwiLCBob3N0bmFtZTogXCIxMjctMC0wLTEuXCIgKyByb290RG9tYWluIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgc2V0UmVjb3JkKFwiQVwiLCBkb21haW4sIGlwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCBrZXlDZXJ0ID0gYXdhaXQgZ2V0RnJlc2hIVFRQU0NlcnQoZG9tYWluLCBjb25maWcuc2VsZlNpZ25lZCk7XG4gICAgbGV0IGNlcnRMaXN0ZW5lcnM6ICgodmFsdWU6IHsga2V5OiBzdHJpbmc7IGNlcnQ6IHN0cmluZyB9KSA9PiB2b2lkKVtdID0gW107XG4gICAgdm9pZCBydW5DZXJ0UmVuZXdhbExvb3AoZG9tYWluLCBjb25maWcuc2VsZlNpZ25lZCwgbmV3S2V5Q2VydCA9PiB7XG4gICAgICAgIGtleUNlcnQgPSBuZXdLZXlDZXJ0O1xuICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiBjZXJ0TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihuZXdLZXlDZXJ0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2l0aCBwb3J0RmFsbGJhY2ssIGEgYnVzeSBwb3J0IGlzIG5vdCBhbiBlcnJvcjogdGhlIHVuZGVybHlpbmcgc2VydmVyIHNjYW5zIGZvciBhIGZyZWUgcG9ydCBpbnN0ZWFkICh1c2VBdmFpbGFibGVQb3J0SWZQb3J0SW5Vc2UpLCBhbmQgdGhlIG5vZGVJZCB0ZWxscyB1cyB3aGljaCBwb3J0IHdlIGFjdHVhbGx5IGdvdFxuICAgIGxldCBub2RlSWQgPSBhd2FpdCBTb2NrZXRGdW5jdGlvbi5tb3VudCh7XG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgLy8gLS1pbnRlcm5hbCBzZXJ2ZXJzIGFyZSBMQU4tb25seSwgc28gd2UgbmV2ZXIgb3BlbiBhIHBvcnQgb24gdGhlIHJvdXRlclxuICAgICAgICBhdXRvRm9yd2FyZFBvcnQ6ICFjb25maWcuaW50ZXJuYWwsXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHVzZUF2YWlsYWJsZVBvcnRJZlBvcnRJblVzZTogISFjb25maWcucG9ydEZhbGxiYWNrLFxuICAgICAgICAuLi5nZXRUaHJlYWRLZXlDZXJ0KHJvb3REb21haW4pLFxuICAgICAgICBTTklDZXJ0czoge1xuICAgICAgICAgICAgW2RvbWFpbl06IGNhbGxiYWNrID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhrZXlDZXJ0KTtcbiAgICAgICAgICAgICAgICBjZXJ0TGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtnZXRPd25NYWNoaW5lSWQocm9vdERvbWFpbikgKyBcIi5cIiArIHJvb3REb21haW5dOiBhc3luYyBjYWxsYmFjayA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRocmVhZENlcnQgPSBhd2FpdCBnZXRUaHJlYWRLZXlDZXJ0KHJvb3REb21haW4pO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiB0aHJlYWRDZXJ0LmtleSxcbiAgICAgICAgICAgICAgICAgICAgY2VydDogdGhyZWFkQ2VydC5jZXJ0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcIjEyNy0wLTAtMS5cIiArIHJvb3REb21haW5dOiBhc3luYyBjYWxsYmFjayA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soa2V5Q2VydCk7XG4gICAgICAgICAgICAgICAgY2VydExpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFsbG93SG9zdG5hbWVzOiBjb25maWcuYWxsb3dIb3N0bmFtZXMsXG4gICAgfSk7XG4gICAgbGV0IHNlcnZpbmdQb3J0ID0gZ2V0Tm9kZUlkTG9jYXRpb24obm9kZUlkKT8ucG9ydCB8fCBwb3J0O1xuICAgIGxldCBmYWxsYmFjayA9IGNvbmZpZy5wb3J0RmFsbGJhY2s7XG4gICAgaWYgKGZhbGxiYWNrICYmIHNlcnZpbmdQb3J0ICE9PSBwb3J0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUG9ydCAke3BvcnR9IGlzIGluIHVzZSAocHJlc3VtYWJseSBieSBvdXIgcHJlZGVjZXNzb3IpOyBzZXJ2aW5nIG9uIGFsdGVybmF0ZSBwb3J0ICR7c2VydmluZ1BvcnR9IHVudGlsIGl0IGZyZWVzYCk7XG4gICAgICAgIGF3YWl0IGZhbGxiYWNrLm9uUG9ydEluVXNlPy4oKTtcbiAgICAgICAgdm9pZCBydW5NYWluUG9ydEFjcXVpcmVMb29wKGRvbWFpbiwgcG9ydCwgc2VydmluZ1BvcnQsIGZhbGxiYWNrLCAhIWNvbmZpZy5pbnRlcm5hbCk7XG4gICAgfVxuICAgIGZhbGxiYWNrPy5vbkxpc3RlbmluZyhzZXJ2aW5nUG9ydCwgc2VydmluZ1BvcnQgPT09IHBvcnQpO1xuICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYEhvc3RpbmcgaHR0cHM6Ly8ke2RvbWFpbn06JHtzZXJ2aW5nUG9ydH0gKG5vZGVJZCAke25vZGVJZH0pYCkpO1xuICAgIHJldHVybiBub2RlSWQ7XG59XG5cbi8vIFNvY2tldEZ1bmN0aW9uIGNhbiBvbmx5IG1vdW50IG9uY2UgcGVyIHByb2Nlc3MsIHNvIFwidGFraW5nIG92ZXJcIiB0aGUgbWFpbiBwb3J0IGlzIGEgcmF3IFRDUCByZWxheSBmb3J3YXJkaW5nIHRvIG91ciByZWFsIGxpc3RlbmVyIC0gVExTL1NOSSBwYXNzZXMgc3RyYWlnaHQgdGhyb3VnaCwgYW5kIGNsaWVudHMgYWRkcmVzcyBzZXJ2ZXJzIGJ5IGlwIGRvbWFpbiAod2lsZGNhcmQgbmVnb3RpYXRpb24pLCBzbyB0aGUgZXh0cmEgaG9wIGlzIGludmlzaWJsZS5cbmFzeW5jIGZ1bmN0aW9uIHJ1bk1haW5Qb3J0QWNxdWlyZUxvb3AoZG9tYWluOiBzdHJpbmcsIG1haW5Qb3J0OiBudW1iZXIsIHNlcnZpbmdQb3J0OiBudW1iZXIsIGZhbGxiYWNrOiBOb25OdWxsYWJsZTxIb3N0U2VydmVyQ29uZmlnW1wicG9ydEZhbGxiYWNrXCJdPiwgaW50ZXJuYWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBhd2FpdCBkZWxheShmYWxsYmFjay5nZXRBY3F1aXJlRGVsYXkoKSk7XG4gICAgICAgIGxldCBhY3F1aXJlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgbGV0IHJlbGF5ID0gbmV0LmNyZWF0ZVNlcnZlcihjbGllbnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB1cHN0cmVhbSA9IG5ldC5jb25uZWN0KHsgaG9zdDogXCIxMjcuMC4wLjFcIiwgcG9ydDogc2VydmluZ1BvcnQgfSk7XG4gICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzIGV2ZXJ5IHJlbGF5ZWQgcmVxdWVzdCBwYXlzIHRoZSB+NDBtcyBkZWxheWVkLUFDSyB0aW1lcjogYSBjYWxsIGlzIGEgc21hbGwgd3JpdGUgKG9mdGVuIGEgaGVhZGVyIHRoZW4gYSBib2R5KSwgTmFnbGUgaG9sZHMgdGhlIHNlY29uZCB3cml0ZSB1bnRpbCB0aGUgZmlyc3QgaXMgYWNrbm93bGVkZ2VkLCBhbmQgdGhlIHBlZXIgaGFzIG5vdGhpbmcgdG8gcGlnZ3liYWNrIHRoZSBBQ0sgb24uIE1lYXN1cmVkIGFzIDQzbXMgcGVyIGNhbGwgdGhyb3VnaCB0aGUgcmVsYXkgdmVyc3VzIDFtcyBkaXJlY3QuXG4gICAgICAgICAgICAgICAgY2xpZW50LnNldE5vRGVsYXkodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdXBzdHJlYW0uc2V0Tm9EZWxheSh0cnVlKTtcbiAgICAgICAgICAgICAgICBjbGllbnQucGlwZSh1cHN0cmVhbSk7XG4gICAgICAgICAgICAgICAgdXBzdHJlYW0ucGlwZShjbGllbnQpO1xuICAgICAgICAgICAgICAgIGxldCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGllbnQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB1cHN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjbGllbnQub24oXCJlcnJvclwiLCBjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICB1cHN0cmVhbS5vbihcImVycm9yXCIsIGNsZWFudXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWxheS5vbmNlKFwiZXJyb3JcIiwgKCkgPT4gcmVzb2x2ZShmYWxzZSkpO1xuICAgICAgICAgICAgcmVsYXkubGlzdGVuKG1haW5Qb3J0LCAoKSA9PiByZXNvbHZlKHRydWUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhY3F1aXJlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWFnZW50YShgQWNxdWlyZWQgbWFpbiBwb3J0ICR7bWFpblBvcnR9IGZvciBodHRwczovLyR7ZG9tYWlufSAocmVsYXlpbmcgdG8gb3VyIGxpc3RlbmVyIG9uICR7c2VydmluZ1BvcnR9KWApKTtcbiAgICAgICAgICAgIC8vIFRoZSBtb3VudCBvbmx5IGZvcndhcmRlZCBPVVIgc2VydmluZyBwb3J0OyB0aGUgbWFpbiBwb3J0IG5lZWRzIGl0cyBvd24gbWFwcGluZyAodGhlIHByZWRlY2Vzc29yJ3MgbWFwcGluZyBwb2ludGVkIGF0IHRoZSBzYW1lIG1hY2hpbmUrcG9ydCwgYnV0IGRpZXMgd2l0aCBpdCkuIExBTi1vbmx5ICgtLWludGVybmFsKSBzZXJ2ZXJzIG5ldmVyIG9wZW4gcm91dGVyIHBvcnRzLlxuICAgICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZvcndhcmRQb3J0KHsgZXh0ZXJuYWxQb3J0OiBtYWluUG9ydCwgaW50ZXJuYWxQb3J0OiBtYWluUG9ydCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZhbGxiYWNrLm9uTGlzdGVuaW5nKG1haW5Qb3J0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gU2VsZi1zaWduZWQgY2VydHMgY2FjaGUgdW5kZXIgYSBkaXN0aW5jdCBuYW1lLCBzbyBzd2l0Y2hpbmcgYSBkb21haW4gYmV0d2VlbiBBQ01FIGFuZCBzZWxmLXNpZ25lZCBuZXZlciByZWFkcyBiYWNrIHRoZSB3cm9uZyBraW5kXG5mdW5jdGlvbiBnZXRDZXJ0RGlza1BhdGgoZG9tYWluOiBzdHJpbmcsIHNlbGZTaWduZWQ/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIG9zLmhvbWVkaXIoKSArIGAvaHR0cHNjZXJ0XyR7c2VsZlNpZ25lZCA/IFwic2VsZnNpZ25lZF9cIiA6IFwiXCJ9JHtkb21haW59Lmpzb25gO1xufVxuZnVuY3Rpb24gcmVhZENlcnRGcm9tRGlzayhkb21haW46IHN0cmluZywgc2VsZlNpZ25lZD86IGJvb2xlYW4pOiB7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGdldENlcnREaXNrUGF0aChkb21haW4sIHNlbGZTaWduZWQpLCBcInV0ZjhcIikpIGFzIHsga2V5OiBzdHJpbmc7IGNlcnQ6IHN0cmluZyB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuLy8gQSBUTFMgY2VydCBmb3IgYGRvbWFpbmAgc2lnbmVkIGJ5IHRoaXMgbWFjaGluZSdzIGlkZW50aXR5IENBLCBwcmVzZW50ZWQgYXMgYSBjaGFpbiAobGVhZiArIENBKSBzbyBhIGNsaWVudCB0aGF0IHRydXN0cyB0aGUgQ0EgdmFsaWRhdGVzIGl0LiBUaGUga2V5IHBhcnQgb2YgdGhlIGlwLWRvbWFpbiBzY2hlbWUgaXMgdW5jaGFuZ2VkOiBicm93c2VycyBpZ25vcmUgbmFtZUNvbnN0cmFpbnRzIGFuZCB2YWxpZGF0ZSB0aGUgU0FOICsgY2hhaW47IGEgYnJvd3NlciB0aGF0IGhhc24ndCB0cnVzdGVkIHRoZSBDQSBwcm9tcHRzIHRoZSB1c2VyLCB3aG8gYWNjZXB0cyBpdCBvbmNlICh0aGUgdHJ1c3QtY2VydCBmbG93KSwgYW5kIG5vZGUgcGVlcnMgdHJ1c3QgaXQgdmlhIHRoZSBDQS5cbmZ1bmN0aW9uIGdlbmVyYXRlU2VsZlNpZ25lZENlcnQoZG9tYWluOiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfSB7XG4gICAgbGV0IHJvb3REb21haW4gPSBkb21haW4uc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcbiAgICBsZXQgY2EgPSBnZXRJZGVudGl0eUNBKHJvb3REb21haW4pO1xuICAgIGxldCBsZWFmID0gY3JlYXRlWDUwOSh7IGRvbWFpbiwgaXNzdWVyOiBjYSwga2V5UGFpcjogZ2VuZXJhdGVLZXlQYWlyKCksIGxpZmVTcGFuOiBTRUxGX1NJR05FRF9MSUZFU1BBTiB9KTtcbiAgICByZXR1cm4geyBrZXk6IGxlYWYua2V5LnRvU3RyaW5nKCksIGNlcnQ6IGxlYWYuY2VydC50b1N0cmluZygpICsgXCJcXG5cIiArIGNhLmNlcnQudG9TdHJpbmcoKSB9O1xufVxuZnVuY3Rpb24gZ2V0UmVuZXdUaW1lKGNlcnRQZW06IHN0cmluZywgdGhyZXNob2xkOiBudW1iZXIpIHtcbiAgICBsZXQgY2VydE9iaiA9IHBhcnNlQ2VydChjZXJ0UGVtKTtcbiAgICBsZXQgc3RhcnQgPSArbmV3IERhdGUoY2VydE9iai52YWxpZGl0eS5ub3RCZWZvcmUpO1xuICAgIGxldCBlbmQgPSArbmV3IERhdGUoY2VydE9iai52YWxpZGl0eS5ub3RBZnRlcik7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHRocmVzaG9sZDtcbn1cblxuLyoqIFJldHVybnMgdGhlIGNhY2hlZCBIVFRQUyBjZXJ0IGZvciB0aGUgZG9tYWluLCBjcmVhdGluZy9yZW5ld2luZyBpdCBmaXJzdCBpZiBpdCBpcyBwYXN0IHRoaXMgcHJvY2VzcydzIHJlbmV3YWwgdGhyZXNob2xkLiBSZWFkcyB0aGUgZGlzayBjYWNoZSBvbiBldmVyeSBjYWxsLCBzbyBhIHJlbmV3YWwgZG9uZSBieSBhIHBhcmFsbGVsIHByb2Nlc3MgaXMgcGlja2VkIHVwIGluc3RlYWQgb2YgcmVuZXdpbmcgYWdhaW4uIHNlbGZTaWduZWQ6IHNpZ24gaXQgd2l0aCB0aGlzIG1hY2hpbmUncyBDQSBpbnN0ZWFkIG9mIGdldHRpbmcgYSByZWFsIEFDTUUgY2VydC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGcmVzaEhUVFBTQ2VydChkb21haW46IHN0cmluZywgc2VsZlNpZ25lZD86IGJvb2xlYW4pOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IGNlcnQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IGtleUNlcnQgPSByZWFkQ2VydEZyb21EaXNrKGRvbWFpbiwgc2VsZlNpZ25lZCk7XG4gICAgaWYgKGtleUNlcnQgJiYgZ2V0UmVuZXdUaW1lKGtleUNlcnQuY2VydCwgcmVuZXdUaHJlc2hvbGQpID4gRGF0ZS5ub3coKSkge1xuICAgICAgICByZXR1cm4ga2V5Q2VydDtcbiAgICB9XG4gICAgaWYgKHNlbGZTaWduZWQpIHtcbiAgICAgICAgLy8gQ2FjaGVkIHNvIHRoZSBzZXJ2ZWQgY2VydCBpcyBzdGFibGUgYWNyb3NzIHJlc3RhcnRzIChhIGJyb3dzZXIncyBhY2NlcHRlZC1jZXJ0aWZpY2F0ZSBleGNlcHRpb24gaXMgcGVyIGV4YWN0IGNlcnQpXG4gICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoa2V5Q2VydCA/IGBTZWxmLXNpZ25lZCBjZXJ0IGZvciAke2RvbWFpbn0gaXMgZXhwaXJpbmcsIHJlZ2VuZXJhdGluZ2AgOiBgTm8gc2VsZi1zaWduZWQgY2VydCBvbiBkaXNrIGZvciAke2RvbWFpbn0sIGNyZWF0aW5nIG9uZSAoc2lnbmVkIGJ5IHRoaXMgbWFjaGluZSdzIENBKWApKTtcbiAgICAgICAgbGV0IGdlbmVyYXRlZCA9IGdlbmVyYXRlU2VsZlNpZ25lZENlcnQoZG9tYWluKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhnZXRDZXJ0RGlza1BhdGgoZG9tYWluLCB0cnVlKSwgSlNPTi5zdHJpbmdpZnkoZ2VuZXJhdGVkKSk7XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZWQ7XG4gICAgfVxuICAgIGlmIChrZXlDZXJ0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYEhUVFBTIGNlcnQgZm9yICR7ZG9tYWlufSBpcyBwYXN0ICR7KHJlbmV3VGhyZXNob2xkICogMTAwKS50b0ZpeGVkKDApfSUgb2YgaXRzIGxpZmV0aW1lLCByZW5ld2luZ2ApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBObyBIVFRQUyBjZXJ0IG9uIGRpc2sgZm9yICR7ZG9tYWlufSwgY3JlYXRpbmcgb25lYCkpO1xuICAgIH1cbiAgICBsZXQgYWNjb3VudEtleSA9IGF3YWl0IGdldEFjY291bnRLZXkoZG9tYWluKTtcbiAgICB0cnkge1xuICAgICAgICBrZXlDZXJ0ID0gYXdhaXQgZ2VuZXJhdGVDZXJ0KHsgYWNjb3VudEtleSwgZG9tYWluLCBhbHREb21haW5zOiBbXCIqLlwiICsgZG9tYWluXSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChTdHJpbmcoZSkuaW5jbHVkZXMoXCJhdXRob3JpemF0aW9uIG11c3QgYmUgcGVuZGluZ1wiKSkge1xuICAgICAgICAgICAgLy8gQW5vdGhlciBwcm9jZXNzIGlzIG1pZC1yZW5ld2FsLiBXYWl0IGZvciBpdCB0byBmaW5pc2gsIHRoZW4gcmUtY2hlY2sgdGhlIGRpc2suXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ2VydGlmaWNhdGUgYXV0aG9yaXphdGlvbiBpcyBwZW5kaW5nIGluIGFub3RoZXIgcHJvY2Vzcywgd2FpdGluZyAyIG1pbnV0ZXNgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KHRpbWVJbk1pbnV0ZSAqIDIpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldEZyZXNoSFRUUFNDZXJ0KGRvbWFpbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhnZXRDZXJ0RGlza1BhdGgoZG9tYWluKSwgSlNPTi5zdHJpbmdpZnkoeyBrZXk6IGtleUNlcnQua2V5LCBjZXJ0OiBrZXlDZXJ0LmNlcnQgfSkpO1xuICAgIHJldHVybiB7IGtleToga2V5Q2VydC5rZXksIGNlcnQ6IGtleUNlcnQuY2VydCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5DZXJ0UmVuZXdhbExvb3AoZG9tYWluOiBzdHJpbmcsIHNlbGZTaWduZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsIG9uTmV3Q2VydDogKGtleUNlcnQ6IHsga2V5OiBzdHJpbmc7IGNlcnQ6IHN0cmluZyB9KSA9PiB2b2lkKSB7XG4gICAgbGV0IGxhc3RDZXJ0ID0gcmVhZENlcnRGcm9tRGlzayhkb21haW4sIHNlbGZTaWduZWQpPy5jZXJ0O1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KENFUlRfQ0hFQ0tfSU5URVJWQUwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGtleUNlcnQgPSBhd2FpdCBnZXRGcmVzaEhUVFBTQ2VydChkb21haW4sIHNlbGZTaWduZWQpO1xuICAgICAgICAgICAgaWYgKGtleUNlcnQuY2VydCAhPT0gbGFzdENlcnQpIHtcbiAgICAgICAgICAgICAgICBsYXN0Q2VydCA9IGtleUNlcnQuY2VydDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBIVFRQUyBjZXJ0IGZvciAke2RvbWFpbn0gdXBkYXRlZCwgYXBwbHlpbmcgdG8gcnVubmluZyBzZXJ2ZXJgKSk7XG4gICAgICAgICAgICAgICAgb25OZXdDZXJ0KGtleUNlcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY2hlY2svcmVuZXcgSFRUUFMgY2VydCBmb3IgJHtkb21haW59YCwgZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
207
|
+
/* _JS_SOURCE_HASH = "18f976ef33df57f8c15686f07a5aecf5e45fd9ac382c2a082cc931f08d523f37"; */
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
6
|
+
//exports.removeHostsEntry = exports.setHostsEntry = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
// Cross-platform hosts-file editing, WITHOUT any third-party dependency. The approach (per-platform path, platform line endings, space-separated "<ip> <hostname>" entries, update-matching-hostname-else-append) is the same one the widely-used `hostile` npm package uses - but that package pulls in several dependencies (once, split, @ljharb/through), so this reimplements the ~40 lines we actually need instead of importing them. Used with --selfSigned, where we resolve the ip-domain locally via the hosts file instead of a public (Cloudflare) DNS record. NOTE: a hosts entry only affects THIS machine, so a self-signed server reachable from other machines still needs those machines to resolve its domain (a real DNS record, or the same hosts entry).
|
|
10
|
+
const WINDOWS = os_1.default.platform() === "win32";
|
|
11
|
+
// The canonical hosts-file locations (same as hostile)
|
|
12
|
+
const HOSTS_PATH = WINDOWS ? "C:/Windows/System32/drivers/etc/hosts" : "/etc/hosts";
|
|
13
|
+
const EOL = WINDOWS ? "\r\n" : "\n";
|
|
14
|
+
// Tags the lines we manage, so they are recognizable (and safe to rewrite/remove) without touching the user's own entries
|
|
15
|
+
const MARKER = "# managed by sliftutils hostsFile";
|
|
16
|
+
// The hostname of a line, or undefined for a blank/comment/malformed line. The marker is a comment, so it is stripped here too - matching works the same for our lines and the user's.
|
|
17
|
+
function lineHostname(line) {
|
|
18
|
+
let noComment = line.replace(/#.*/, "").trim();
|
|
19
|
+
if (!noComment)
|
|
20
|
+
return undefined;
|
|
21
|
+
let parts = noComment.split(/\s+/);
|
|
22
|
+
if (parts.length < 2)
|
|
23
|
+
return undefined;
|
|
24
|
+
return parts[1];
|
|
25
|
+
}
|
|
26
|
+
/** Ensures the hosts file maps `hostname` to `ip` (adding our tagged line, or updating it/an existing line for the same hostname). Idempotent. Returns false, with a warning telling the user the line to add by hand, if the file can't be written (writing the hosts file needs admin/root). */
|
|
27
|
+
function setHostsEntry(config) {
|
|
28
|
+
var _a, _b;
|
|
29
|
+
let { ip, hostname } = config;
|
|
30
|
+
let desired = `${ip} ${hostname} ${MARKER}`;
|
|
31
|
+
let lines;
|
|
32
|
+
try {
|
|
33
|
+
lines = fs_1.default.readFileSync(HOSTS_PATH, "utf8").split(/\r?\n/);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
console.error(`Could not read the hosts file ${HOSTS_PATH} to map ${hostname} -> ${ip}: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}. Add this line yourself: ${ip} ${hostname}`);
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
// A trailing newline leaves a final "" - drop trailing blanks so we don't accumulate them, and re-add exactly one newline at the end when we write
|
|
40
|
+
while (lines.length && lines[lines.length - 1] === "")
|
|
41
|
+
lines.pop();
|
|
42
|
+
let index = lines.findIndex(line => lineHostname(line) === hostname);
|
|
43
|
+
if (index >= 0) {
|
|
44
|
+
if (lines[index] === desired)
|
|
45
|
+
return true;
|
|
46
|
+
lines[index] = desired;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
lines.push(desired);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
fs_1.default.writeFileSync(HOSTS_PATH, lines.join(EOL) + EOL);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
console.error(`Could not write the hosts file ${HOSTS_PATH} to map ${hostname} -> ${ip} (writing it needs admin/root): ${(_b = e.stack) !== null && _b !== void 0 ? _b : e}. Add this line yourself: ${ip} ${hostname}`);
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
exports.setHostsEntry = setHostsEntry;
|
|
61
|
+
/** Removes our managed entry for `hostname` (only lines we added, tagged with the marker). No-op if absent or the file can't be written. */
|
|
62
|
+
function removeHostsEntry(hostname) {
|
|
63
|
+
let lines;
|
|
64
|
+
try {
|
|
65
|
+
lines = fs_1.default.readFileSync(HOSTS_PATH, "utf8").split(/\r?\n/);
|
|
66
|
+
}
|
|
67
|
+
catch (_a) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
let kept = lines.filter(line => !(line.includes(MARKER) && lineHostname(line) === hostname));
|
|
71
|
+
if (kept.length === lines.length)
|
|
72
|
+
return;
|
|
73
|
+
while (kept.length && kept[kept.length - 1] === "")
|
|
74
|
+
kept.pop();
|
|
75
|
+
try {
|
|
76
|
+
fs_1.default.writeFileSync(HOSTS_PATH, kept.join(EOL) + EOL);
|
|
77
|
+
}
|
|
78
|
+
catch (_b) { }
|
|
79
|
+
}
|
|
80
|
+
exports.removeHostsEntry = removeHostsEntry;
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdHNGaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaG9zdHNGaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFFcEIsZ3ZCQUFndkI7QUFFaHZCLE1BQU0sT0FBTyxHQUFHLFlBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxPQUFPLENBQUM7QUFDMUMsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUNwRixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDLDBIQUEwSDtBQUMxSCxNQUFNLE1BQU0sR0FBRyxtQ0FBbUMsQ0FBQztBQUVuRCx1TEFBdUw7QUFDdkwsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUM5QixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pDLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsa1NBQWtTO0FBQ2xTLFNBQWdCLGFBQWEsQ0FBQyxNQUF3Qzs7SUFDbEUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDOUIsSUFBSSxPQUFPLEdBQUcsR0FBRyxFQUFFLElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO0lBQzVDLElBQUksS0FBZSxDQUFD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c1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuXG4vLyBDcm9zcy1wbGF0Zm9ybSBob3N0cy1maWxlIGVkaXRpbmcsIFdJVEhPVVQgYW55IHRoaXJkLXBhcnR5IGRlcGVuZGVuY3kuIFRoZSBhcHByb2FjaCAocGVyLXBsYXRmb3JtIHBhdGgsIHBsYXRmb3JtIGxpbmUgZW5kaW5ncywgc3BhY2Utc2VwYXJhdGVkIFwiPGlwPiA8aG9zdG5hbWU+XCIgZW50cmllcywgdXBkYXRlLW1hdGNoaW5nLWhvc3RuYW1lLWVsc2UtYXBwZW5kKSBpcyB0aGUgc2FtZSBvbmUgdGhlIHdpZGVseS11c2VkIGBob3N0aWxlYCBucG0gcGFja2FnZSB1c2VzIC0gYnV0IHRoYXQgcGFja2FnZSBwdWxscyBpbiBzZXZlcmFsIGRlcGVuZGVuY2llcyAob25jZSwgc3BsaXQsIEBsamhhcmIvdGhyb3VnaCksIHNvIHRoaXMgcmVpbXBsZW1lbnRzIHRoZSB+NDAgbGluZXMgd2UgYWN0dWFsbHkgbmVlZCBpbnN0ZWFkIG9mIGltcG9ydGluZyB0aGVtLiBVc2VkIHdpdGggLS1zZWxmU2lnbmVkLCB3aGVyZSB3ZSByZXNvbHZlIHRoZSBpcC1kb21haW4gbG9jYWxseSB2aWEgdGhlIGhvc3RzIGZpbGUgaW5zdGVhZCBvZiBhIHB1YmxpYyAoQ2xvdWRmbGFyZSkgRE5TIHJlY29yZC4gTk9URTogYSBob3N0cyBlbnRyeSBvbmx5IGFmZmVjdHMgVEhJUyBtYWNoaW5lLCBzbyBhIHNlbGYtc2lnbmVkIHNlcnZlciByZWFjaGFibGUgZnJvbSBvdGhlciBtYWNoaW5lcyBzdGlsbCBuZWVkcyB0aG9zZSBtYWNoaW5lcyB0byByZXNvbHZlIGl0cyBkb21haW4gKGEgcmVhbCBETlMgcmVjb3JkLCBvciB0aGUgc2FtZSBob3N0cyBlbnRyeSkuXG5cbmNvbnN0IFdJTkRPV1MgPSBvcy5wbGF0Zm9ybSgpID09PSBcIndpbjMyXCI7XG4vLyBUaGUgY2Fub25pY2FsIGhvc3RzLWZpbGUgbG9jYXRpb25zIChzYW1lIGFzIGhvc3RpbGUpXG5jb25zdCBIT1NUU19QQVRIID0gV0lORE9XUyA/IFwiQzovV2luZG93cy9TeXN0ZW0zMi9kcml2ZXJzL2V0Yy9ob3N0c1wiIDogXCIvZXRjL2hvc3RzXCI7XG5jb25zdCBFT0wgPSBXSU5ET1dTID8gXCJcXHJcXG5cIiA6IFwiXFxuXCI7XG4vLyBUYWdzIHRoZSBsaW5lcyB3ZSBtYW5hZ2UsIHNvIHRoZXkgYXJlIHJlY29nbml6YWJsZSAoYW5kIHNhZmUgdG8gcmV3cml0ZS9yZW1vdmUpIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHVzZXIncyBvd24gZW50cmllc1xuY29uc3QgTUFSS0VSID0gXCIjIG1hbmFnZWQgYnkgc2xpZnR1dGlscyBob3N0c0ZpbGVcIjtcblxuLy8gVGhlIGhvc3RuYW1lIG9mIGEgbGluZSwgb3IgdW5kZWZpbmVkIGZvciBhIGJsYW5rL2NvbW1lbnQvbWFsZm9ybWVkIGxpbmUuIFRoZSBtYXJrZXIgaXMgYSBjb21tZW50LCBzbyBpdCBpcyBzdHJpcHBlZCBoZXJlIHRvbyAtIG1hdGNoaW5nIHdvcmtzIHRoZSBzYW1lIGZvciBvdXIgbGluZXMgYW5kIHRoZSB1c2VyJ3MuXG5mdW5jdGlvbiBsaW5lSG9zdG5hbWUobGluZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbm9Db21tZW50ID0gbGluZS5yZXBsYWNlKC8jLiovLCBcIlwiKS50cmltKCk7XG4gICAgaWYgKCFub0NvbW1lbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IHBhcnRzID0gbm9Db21tZW50LnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHBhcnRzWzFdO1xufVxuXG4vKiogRW5zdXJlcyB0aGUgaG9zdHMgZmlsZSBtYXBzIGBob3N0bmFtZWAgdG8gYGlwYCAoYWRkaW5nIG91ciB0YWdnZWQgbGluZSwgb3IgdXBkYXRpbmcgaXQvYW4gZXhpc3RpbmcgbGluZSBmb3IgdGhlIHNhbWUgaG9zdG5hbWUpLiBJZGVtcG90ZW50LiBSZXR1cm5zIGZhbHNlLCB3aXRoIGEgd2FybmluZyB0ZWxsaW5nIHRoZSB1c2VyIHRoZSBsaW5lIHRvIGFkZCBieSBoYW5kLCBpZiB0aGUgZmlsZSBjYW4ndCBiZSB3cml0dGVuICh3cml0aW5nIHRoZSBob3N0cyBmaWxlIG5lZWRzIGFkbWluL3Jvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhvc3RzRW50cnkoY29uZmlnOiB7IGlwOiBzdHJpbmc7IGhvc3RuYW1lOiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIGxldCB7IGlwLCBob3N0bmFtZSB9ID0gY29uZmlnO1xuICAgIGxldCBkZXNpcmVkID0gYCR7aXB9ICR7aG9zdG5hbWV9ICR7TUFSS0VSfWA7XG4gICAgbGV0IGxpbmVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBsaW5lcyA9IGZzLnJlYWRGaWxlU3luYyhIT1NUU19QQVRILCBcInV0ZjhcIikuc3BsaXQoL1xccj9cXG4vKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCByZWFkIHRoZSBob3N0cyBmaWxlICR7SE9TVFNfUEFUSH0gdG8gbWFwICR7aG9zdG5hbWV9IC0+ICR7aXB9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfS4gQWRkIHRoaXMgbGluZSB5b3Vyc2VsZjogJHtpcH0gJHtob3N0bmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBBIHRyYWlsaW5nIG5ld2xpbmUgbGVhdmVzIGEgZmluYWwgXCJcIiAtIGRyb3AgdHJhaWxpbmcgYmxhbmtzIHNvIHdlIGRvbid0IGFjY3VtdWxhdGUgdGhlbSwgYW5kIHJlLWFkZCBleGFjdGx5IG9uZSBuZXdsaW5lIGF0IHRoZSBlbmQgd2hlbiB3ZSB3cml0ZVxuICAgIHdoaWxlIChsaW5lcy5sZW5ndGggJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09IFwiXCIpIGxpbmVzLnBvcCgpO1xuXG4gICAgbGV0IGluZGV4ID0gbGluZXMuZmluZEluZGV4KGxpbmUgPT4gbGluZUhvc3RuYW1lKGxpbmUpID09PSBob3N0bmFtZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgaWYgKGxpbmVzW2luZGV4XSA9PT0gZGVzaXJlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGxpbmVzW2luZGV4XSA9IGRlc2lyZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChkZXNpcmVkKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhIT1NUU19QQVRILCBsaW5lcy5qb2luKEVPTCkgKyBFT0wpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IHdyaXRlIHRoZSBob3N0cyBmaWxlICR7SE9TVFNfUEFUSH0gdG8gbWFwICR7aG9zdG5hbWV9IC0+ICR7aXB9ICh3cml0aW5nIGl0IG5lZWRzIGFkbWluL3Jvb3QpOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfS4gQWRkIHRoaXMgbGluZSB5b3Vyc2VsZjogJHtpcH0gJHtob3N0bmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFJlbW92ZXMgb3VyIG1hbmFnZWQgZW50cnkgZm9yIGBob3N0bmFtZWAgKG9ubHkgbGluZXMgd2UgYWRkZWQsIHRhZ2dlZCB3aXRoIHRoZSBtYXJrZXIpLiBOby1vcCBpZiBhYnNlbnQgb3IgdGhlIGZpbGUgY2FuJ3QgYmUgd3JpdHRlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVIb3N0c0VudHJ5KGhvc3RuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQgbGluZXM6IHN0cmluZ1tdO1xuICAgIHRyeSB7XG4gICAgICAgIGxpbmVzID0gZnMucmVhZEZpbGVTeW5jKEhPU1RTX1BBVEgsIFwidXRmOFwiKS5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBrZXB0ID0gbGluZXMuZmlsdGVyKGxpbmUgPT4gIShsaW5lLmluY2x1ZGVzKE1BUktFUikgJiYgbGluZUhvc3RuYW1lKGxpbmUpID09PSBob3N0bmFtZSkpO1xuICAgIGlmIChrZXB0Lmxlbmd0aCA9PT0gbGluZXMubGVuZ3RoKSByZXR1cm47XG4gICAgd2hpbGUgKGtlcHQubGVuZ3RoICYmIGtlcHRba2VwdC5sZW5ndGggLSAxXSA9PT0gXCJcIikga2VwdC5wb3AoKTtcbiAgICB0cnkge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKEhPU1RTX1BBVEgsIGtlcHQuam9pbihFT0wpICsgRU9MKTtcbiAgICB9IGNhdGNoIHsgfVxufVxuIl19
|
|
82
|
+
/* _JS_SOURCE_HASH = "b8e084cb421f8925f72a5a49a8b88a94bf953a6605fa6352352e3df28ac149a6"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"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);
|
|
@@ -191,4 +191,4 @@ async function generateCert(config) {
|
|
|
191
191
|
}
|
|
192
192
|
exports.generateCert = generateCert;
|
|
193
193
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNDZXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImh0dHBzQ2VydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwrQkFBdUU7QUFDdkUseURBQTBEO0FBQzFELGtEQUFvQztBQUNwQyw4REFBK0I7QUFDL0Isd0VBQXdFO0FBQ3hFLGtFQUFtRjtBQUNuRixtREFBb0U7QUFDcEUsMkRBQXFEO0FBQ3JELDRDQUFvQjtBQUNwQixxRUFBdUQ7QUFFdkQsZUFBZTtBQUNmOzs7Ozs7Ozs7RUFTRTtBQUVGLDZFQUE2RTtBQUM3RSxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUVqQyxpREFBaUQ7QUFDcEMsUUFBQSxZQUFZLEdBQUcsSUFBQSxlQUFLLEVBQUMsS0FBSyxFQUFFLE1BQWMsRUFBMEMsRUFBRTtJQUMvRixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQzFCLENBQUM7SUFFRCwyTkFBMk47SUFDM04sVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNaLG9CQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUMsRUFBRSxpQkFBVSxDQUFDLENBQUM7SUFFZixJQUFJLE9BQWtELENBQUM7SUFDdkQsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBa0MsQ0FBQztJQUN6RixDQUFDO0lBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztJQUNYLElBQUksT0FBTyxFQUFFLENBQUM7UUFDVix5RUFBeUU7UUFDekUsMkJBQTJCO1FBQzNCLElBQUksT0FBTyxHQUFHLFNBQVMs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R0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsSUFBSSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELE9BQU87UUFDSCxPQUFPLEVBQUUsVUFBVTtRQUNuQixHQUFHLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRTtRQUM5QixJQUFJLEVBQUUsSUFBSTtLQUNiLENBQUM7QUFDTixDQUFDO0FBaEZELG9DQWdGQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgYWRkUmVjb3JkLCBkZWxldGVSZWNvcmQsIGdldFJlY29yZHMsIHNldFJlY29yZCB9IGZyb20gXCIuL2Ruc1wiO1xuaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgKiBhcyBmb3JnZSBmcm9tIFwibm9kZS1mb3JnZVwiO1xuaW1wb3J0IGFjbWUgZnJvbSBcImFjbWUtY2xpZW50XCI7XG5pbXBvcnQgeyBtYWdlbnRhLCByZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZVRpbWUsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgdGltZUluSG91ciwgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZ2V0S2V5U3RvcmUgfSBmcm9tIFwiLi9wZXJzaXN0ZW50TG9jYWxTdG9yYWdlXCI7XG5cbi8vIEZvciBleGFtcGxlOlxuLypcbmxldCBkb21haW4gPSBcInF1ZXJ5c3VidGVzdC5jb21cIjtcbmF3YWl0IGxvYWRJZGVudGl0eUNBKGRvbWFpbik7XG5cbmxldCBsaXN0ZW5QdWJsaWMgPSBmYWxzZTtcbmxldCBwb3J0ID0gOTgyMztcbmxldCBsb2NhbERvbWFpbiA9IFwiMTI3LTAtMC0xLlwiICsgZG9tYWluO1xuYXdhaXQgYWRkUmVjb3JkKFwiQVwiLCBsb2NhbERvbWFpbiwgXCIxMjcuMC4wLjFcIik7XG5sZXQga2V5Q2VydCA9IGF3YWl0IGdldEhUVFBTQ2VydChkb21haW4pO1xuKi9cblxuLy8gRXhwaXJlIEVYUElSQVRJT05fVEhSRVNIT0xEJSBvZiB0aGUgd2F5IHRocm91Z2ggdGhlIGNlcnRpZmljYXRlJ3MgbGlmZXRpbWVcbmNvbnN0IEVYUElSQVRJT05fVEhSRVNIT0xEID0gMC40O1xuXG4vKiogTk9URTogV2UgYWxzbyBnZW5lcmF0ZSB0aGUgZG9tYWluICouZG9tYWluICovXG5leHBvcnQgY29uc3QgZ2V0SFRUUFNDZXJ0ID0gY2FjaGUoYXN5bmMgKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfT4gPT4ge1xuICAgIGlmICghZG9tYWluLmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICBkb21haW4gPSBkb21haW4gKyBcIi5cIjtcbiAgICB9XG5cbiAgICAvLyBObyBtYXR0ZXIgd2hhdCwgcmVzZXQgdGhpcyBmcm9tIHRoZSBpbi1tZW1vcnkgY2FjaGUgaW4gYW4gaG91ci4gVGhpcyBpcyBmaW5lLiBXZSdsbCBqdXN0IHNlZSB0aGUgY2FjaGUgb24gZGlzayBhbmQgc2VlIHRoYXQgaXQgaGFzbid0IGV4cGlyZWQuIE9yIHdlIG1pZ2h0IHNlZSB0aGF0IGl0IGhhcyBleHBpcmVkLCBhbmQgdGhlbiB3ZSB3aWxsIGdldCB0aGUgbmV3IHZhbHVlLiBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZ2V0SFRUUFNDZXJ0LmNsZWFyKGRvbWFpbik7XG4gICAgfSwgdGltZUluSG91cik7XG5cbiAgICBsZXQga2V5Q2VydDogeyBrZXk6IHN0cmluZzsgY2VydDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHBhdGggPSBkb21haW4gKyBcIi5jZXJ0XCI7XG5cbiAgICB0cnkge1xuICAgICAgICBrZXlDZXJ0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKSBhcyB7IGtleTogc3RyaW5nOyBjZXJ0OiBzdHJpbmcgfTtcbiAgICB9IGNhdGNoIHsgfVxuICAgIGlmIChrZXlDZXJ0KSB7XG4gICAgICAgIC8vIElmIDQwJSBvZiB0aGUgbGlmZXRpbWUgaGFzIHBhc3NlZCwgcmVuZXcgaXQgKGhhcyB0byBiZSA8IHRoZSB0aHJlc2hvbGRcbiAgICAgICAgLy8gIGluIEVkZ2VDZXJ0Q29udHJvbGxlcikuXG4gICAgICAgIGxldCBjZXJ0T2JqID0gcGFyc2VDZXJ0KGtleUNlcnQuY2VydCk7XG4gICAgICAgIGxldCBleHBpcmF0aW9uVGltZSA9ICtuZXcgRGF0ZShjZXJ0T2JqLnZhbGlkaXR5Lm5vdEFmdGVyKTtcbiAgICAgICAgbGV0IGNyZWF0ZVRpbWUgPSArbmV3IERhdGUoY2VydE9iai52YWxpZGl0eS5ub3RCZWZvcmUpO1xuICAgICAgICBsZXQgcmVuZXdEYXRlID0gY3JlYXRlVGltZSArIChleHBpcmF0aW9uVGltZSAtIGNyZWF0ZVRpbWUpICogRVhQSVJBVElPTl9USFJFU0hPTEQ7XG4gICAgICAgIGlmIChyZW5ld0RhdGUgPCBEYXRlLm5vdygpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBSZW5ld2luZyBkb21haW4gJHtkb21haW59IChyZW5ldyB0YXJnZXQgaXMgJHtmb3JtYXREYXRlVGltZShyZW5ld0RhdGUpfSkuYCkpO1xuICAgICAgICAgICAga2V5Q2VydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYE5vIGNlcnQgZm91bmQgZm9yIGRvbWFpbiAke2RvbWFpbn0sIGdlbmVyYXRpbmcgc2hvcnRseS5gKSk7XG4gICAgfVxuICAgIGlmIChrZXlDZXJ0KSB7XG4gICAgICAgIHJldHVybiBrZXlDZXJ0O1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRLZXkgPSBhd2FpdCBnZXRBY2NvdW50S2V5KGRvbWFpbik7XG4gICAgbGV0IGFsdERvbWFpbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBhbHREb21haW5zLnB1c2goXCJub3Byb3h5LlwiICsgZG9tYWluKTtcbiAgICAvLyAvLyBOT1RFOiBBbGxvd2luZyBsb2NhbCBhY2Nlc3MgaXMganVzdCBhbiBvcHRpbWl6YXRpb24sIG5vdCB0byBhdm9pZCBoYXZpbmcgdG8gZm9yd2FyZCBwb3J0cyAvLyAgKHVubGVzcyB5b3UgdHlwZSAxMjctMC0wLTEuZG9tYWluIGludG8gdGhlIGJyb3dzZXIuLi4gdGhlbiBJIGd1ZXNzIHlvdSBkb24ndCBoYXZlIHRvIGZvcndhcmQgcG9ydHM/KSBhbHREb21haW5zLnB1c2goXCIxMjctMC0wLTEuXCIgKyBkb21haW4pO1xuXG4gICAgLy8gTk9URTogSSBmb3JnZXQgd2h5IHdlIHdlcmUgbm90IGFsbG93aW5nIHdpbGRjYXJkIGRvbWFpbnMuIEkgdGhpbmsgaXQgd2FzIHRvIHByZXZlbnQgYW55IEhUVFBTIGRvbWFpbnMgZnJvbSBpbXBlcnNvbmF0aW5nIHNlcnZlcnMuIEJ1dC4uLiBzZXJ2ZXJzIGhhdmUgdHdvIGxldmVscywgc28gdGhhdCBpc24ndCBhbiBpc3N1ZS4gQW5kIGV2ZW4gaWYgdGhleSBkaWRuJ3QgdGhleSBzdG9yZSB0aGVpciBwdWJsaWMga2V5IGluIHRoZWlyIGRvbWFpbiwgc28geW91IGNhbid0IHJlYWxseSBpbXBlcnNvbmF0ZSB0aGVtIGFueXdheXMuLi5cbiAgICAvLyAgLSBBTkQsIHdlIG5lZWQgdGhpcyBmb3IgSVAgdHlwZSBBIHJlY29yZHMsIHdoaWNoLi4uIHdlIG5lZWQgdG8gcGljayB0aGUgc2VydmVyIHdlIHdhbnQgdG8gY29ubmVjdCB0by5cbiAgICBhbHREb21haW5zLnB1c2goXCIqLlwiICsgZG9tYWluKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGtleUNlcnQgPSBhd2FpdCBnZW5lcmF0ZUNlcnQoeyBhY2NvdW50S2V5LCBkb21haW4sIGFsdERvbWFpbnMgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoU3RyaW5nKGUpLmluY2x1ZGVzKFwiYXV0aG9yaXphdGlvbiBtdXN0IGJlIHBlbmRpbmdcIikpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBdXRob3JpemF0aW9uIGFwcGVhcnMgdG8gYmUgcGVuZGluZywgd2FpdGluZyAyIG1pbnV0ZXMgZm9yIG90aGVyIHByb2Nlc3MgdG8gY3JlYXRlIGNlcnRpZmljYXRlYCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSh0aW1lSW5NaW51dGUgKiAyKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZXRIVFRQU0NlcnQoZG9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aCwgSlNPTi5zdHJpbmdpZnkoa2V5Q2VydCkpO1xuICAgIHJldHVybiBrZXlDZXJ0O1xufSk7XG5cblxuZXhwb3J0IGNvbnN0IGdldEFjY291bnRLZXkgPSBhc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50S2V5KGRvbWFpbjogc3RyaW5nKSB7XG4gICAgbGV0IGFjY291bnRLZXkgPSBnZXRLZXlTdG9yZTxzdHJpbmc+KGRvbWFpbiwgXCJsZXRzRW5jcnlwdEFjY291bnRLZXlcIik7XG4gICAgbGV0IHNlY3JldCA9IGF3YWl0IGFjY291bnRLZXkuZ2V0KCk7XG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgICAgLy8gU2hvdWxkIG9ubHkgSEFQUEVOIE9OQ0UsIEVWRVIhXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocmVkKGBHZW5lcmF0aW5nIG5ldyBsZXRzZW5jcnlwdCBhY2NvdW50IGtleWApKTtcbiAgICAgICAgY29uc3Qga2V5UGFpciA9IGZvcmdlLnBraS5yc2EuZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICAgIHNlY3JldCA9IGZvcmdlLnBraS5wcml2YXRlS2V5VG9QZW0oa2V5UGFpci5wcml2YXRlS2V5KTtcbiAgICAgICAgYXdhaXQgYWNjb3VudEtleS5zZXQoc2VjcmV0KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlY3JldDtcbn07XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2VydChQRU1vckRFUjogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgcmV0dXJuIGZvcmdlLnBraS5jZXJ0aWZpY2F0ZUZyb21QZW0obm9ybWFsaXplQ2VydFRvUEVNKFBFTW9yREVSKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDZXJ0VG9QRU0oUEVNb3JERVI6IHN0cmluZyB8IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgaWYgKFBFTW9yREVSLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVwiKSkge1xuICAgICAgICByZXR1cm4gUEVNb3JERVIudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgUEVNb3JERVIgPSBQRU1vckRFUi50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgICByZXR1cm4gXCItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cXG5cIiArIFBFTW9yREVSICsgXCJcXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXCI7XG59XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ2VydChjb25maWc6IHtcbiAgICBhY2NvdW50S2V5OiBzdHJpbmc7XG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgYWx0RG9tYWlucz86IHN0cmluZ1tdO1xufSk6IFByb21pc2U8e1xuICAgIGRvbWFpbnM6IHN0cmluZ1tdO1xuICAgIGtleTogc3RyaW5nO1xuICAgIGNlcnQ6IHN0cmluZztcbn0+IHtcbiAgICBsZXQgeyBhY2NvdW50S2V5LCBkb21haW4gfSA9IGNvbmZpZztcblxuICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYEdlbmVyYXRpbmcgbmV3IGNlcnQgZm9yICR7ZG9tYWlufWApKTtcblxuICAgIGxldCBkb21haW5MaXN0ID0gW2RvbWFpbiwgLi4uY29uZmlnLmFsdERvbWFpbnMgfHwgW11dO1xuICAgIC8vIFN0cmlwIHRyYWlsaW5nIFwiLlwiXG4gICAgZG9tYWluTGlzdCA9IGRvbWFpbkxpc3QubWFwKHggPT4geC5lbmRzV2l0aChcIi5cIikgPyB4LnNsaWNlKDAsIC0xKSA6IHgpO1xuXG4gICAgY29uc3QgW2NlcnRpZmljYXRlS2V5LCBjZXJ0aWZpY2F0ZUNzcl0gPSBhd2FpdCBhY21lLmZvcmdlLmNyZWF0ZUNzcih7XG4gICAgICAgIGNvbW1vbk5hbWU6IGRvbWFpbkxpc3RbMF0sXG4gICAgICAgIGFsdE5hbWVzOiBkb21haW5MaXN0LnNsaWNlKDEpLFxuICAgIH0pO1xuXG4gICAgLy8gU28uLi4gYWNtZS1jbGllbnQgaXMgZmluZS4gSnVzdCByZS1pbXBsZW1lbnQgdGhlIFwiYXV0b1wiIG1vZGUgb3Vyc2VsdmVzLCB0byBoYXZlIG1vcmUgY29udHJvbCBvdmVyIGl0LlxuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBhY21lLkNsaWVudCh7XG4gICAgICAgIGRpcmVjdG9yeVVybDogYWNtZS5kaXJlY3RvcnkubGV0c2VuY3J5cHQucHJvZHVjdGlvbixcbiAgICAgICAgYWNjb3VudEtleTogYWNjb3VudEtleSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY291bnRQYXlsb2FkID0ge1xuICAgICAgICB0ZXJtc09mU2VydmljZUFncmVlZDogdHJ1ZSxcbiAgICAgICAgY29udGFjdDogW2BtYWlsdG86ZGV2b3BzQHBlcnNwZWN0YW5hbHl0aWNzLmNvbWBdLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQuZ2V0QWNjb3VudFVybCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBjbGllbnQuY3JlYXRlQWNjb3VudChhY2NvdW50UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JkZXJQYXlsb2FkID0ge1xuICAgICAgICBpZGVudGlmaWVyczogZG9tYWluTGlzdC5tYXAoZG9tYWluID0+ICh7IHR5cGU6IFwiZG5zXCIsIHZhbHVlOiBkb21haW4gfSkpLFxuICAgIH07XG4gICAgY29uc3Qgb3JkZXIgPSBhd2FpdCBjbGllbnQuY3JlYXRlT3JkZXIob3JkZXJQYXlsb2FkKTtcbiAgICBjb25zdCBhdXRob3JpemF0aW9ucyA9IGF3YWl0IGNsaWVudC5nZXRBdXRob3JpemF0aW9ucyhvcmRlcik7XG4gICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGF1dGhvcml6YXRpb25zOiAke0pTT04uc3RyaW5naWZ5KGF1dGhvcml6YXRpb25zKX1gKTtcblxuICAgIGZvciAobGV0IGF1dGggb2YgYXV0aG9yaXphdGlvbnMpIHtcbiAgICAgICAgaWYgKGF1dGguc3RhdHVzID09PSBcInZhbGlkXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBdXRob3JpemF0aW9uIGFscmVhZHkgdmFsaWQgZm9yICR7YXV0aC5pZGVudGlmaWVyLnZhbHVlfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGF1dGhvcml6YXRpb24gZm9yICR7SlNPTi5zdHJpbmdpZnkoYXV0aCl9YCk7XG5cbiAgICAgICAgLy8gT25seSB1c2UgRE5TIGF1dGhvcml6YXRpb25cbiAgICAgICAgbGV0IGNoYWxsZW5nZSA9IGF1dGguY2hhbGxlbmdlcy5maW5kKHggPT4geC50eXBlID09PSBcImRucy0wMVwiKTtcbiAgICAgICAgaWYgKCFjaGFsbGVuZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIEROUyBjaGFsbGVuZ2UgZm91bmRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5QXV0aG9yaXphdGlvbiA9IGF3YWl0IGNsaWVudC5nZXRDaGFsbGVuZ2VLZXlBdXRob3JpemF0aW9uKGNoYWxsZW5nZSk7XG5cbiAgICAgICAgbGV0IGhvc3RuYW1lID0gYXV0aC5pZGVudGlmaWVyLnZhbHVlO1xuICAgICAgICBsZXQgY2hhbGxlbmdlUmVjb3JkTmFtZSA9IFwiX2FjbWUtY2hhbGxlbmdlLlwiICsgaG9zdG5hbWUgKyBcIi5cIjtcbiAgICAgICAgYXdhaXQgc2V0UmVjb3JkKFwiVFhUXCIsIGNoYWxsZW5nZVJlY29yZE5hbWUsIGtleUF1dGhvcml6YXRpb24pO1xuXG4gICAgICAgIGF3YWl0IGNsaWVudC5jb21wbGV0ZUNoYWxsZW5nZShjaGFsbGVuZ2UpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2hhbGxlbmdlIGNvbXBsZXRlZGApO1xuXG4gICAgICAgIGF3YWl0IGNsaWVudC53YWl0Rm9yVmFsaWRTdGF0dXMoY2hhbGxlbmdlKTtcbiAgICAgICAgY29uc29sZS5sb2coYFN0YXR1cyBvZiBvcmRlciBpcyB2YWxpZGApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsaXplZCA9IGF3YWl0IGNsaWVudC5maW5hbGl6ZU9yZGVyKG9yZGVyLCBjZXJ0aWZpY2F0ZUNzcik7XG4gICAgY29uc29sZS5sb2coYE9yZGVyIGZpbmFsaXplZGApO1xuXG4gICAgbGV0IGNlcnQgPSBhd2FpdCBjbGllbnQuZ2V0Q2VydGlmaWNhdGUoZmluYWxpemVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkb21haW5zOiBkb21haW5MaXN0LFxuICAgICAgICBrZXk6IGNlcnRpZmljYXRlS2V5LnRvU3RyaW5nKCksXG4gICAgICAgIGNlcnQ6IGNlcnQsXG4gICAgfTtcbn1cbiJdfQ==
|
|
194
|
-
/* _JS_SOURCE_HASH = "
|
|
194
|
+
/* _JS_SOURCE_HASH = "0bf9715ae3db989093ab91b30bf391997f0ebce1b826d89ac5c5f20678482256"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"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
|
};
|
|
@@ -42,4 +42,4 @@ function getKeyStore(appName, key) {
|
|
|
42
42
|
}
|
|
43
43
|
exports.getKeyStore = getKeyStore;
|
|
44
44
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVudExvY2FsU3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBlcnNpc3RlbnRMb2NhbFN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQWtEO0FBQ2xELDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFHcEIsU0FBZ0IsV0FBVyxDQUFJLE9BQWUsRUFBRSxHQUFXO0lBSXZELElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsSUFBSSxJQUFJLEdBQUcsWUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsRSxPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLFFBQVEsR0FBdUIsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLENBQUM7b0JBQUMsUUFBUSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFFBQVE7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQWU7Z0JBQ2YsWUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBZTtnQkFDZixZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleVN0b3JlPFQ+KGFwcE5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiB7XG4gICAgZ2V0KCk6IFQgfCB1bmRlZmluZWQ7XG4gICAgc2V0KHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQ7XG59IHtcbiAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgbGV0IHBhdGggPSBvcy5ob21lZGlyKCkgKyBgL2tleXN0b3JlXyR7YXBwTmFtZX1fYCArIGtleSArIFwiLmpzb25cIjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0cnkgeyBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIik7IH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50cykgYXMgVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghanNvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKSBhcyBUO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==
|
|
45
|
-
/* _JS_SOURCE_HASH = "
|
|
45
|
+
/* _JS_SOURCE_HASH = "218014c9227e88372af9d132c69f93c89ab7ad4ce231a6f012c4478e3b0728ca"; */
|
|
@@ -6,6 +6,10 @@ export type HostServerConfig = {
|
|
|
6
6
|
setDNSRecord?: boolean;
|
|
7
7
|
publicIp?: string;
|
|
8
8
|
allowHostnames?: string[];
|
|
9
|
+
/** LAN-only: do NOT forward the port (no UPnP/NAT mapping), for a server reachable only on the local network. */
|
|
10
|
+
internal?: boolean;
|
|
11
|
+
/** Serve a TLS cert signed by this machine's CA instead of obtaining a real (ACME) one. See getFreshHTTPSCert. */
|
|
12
|
+
selfSigned?: boolean;
|
|
9
13
|
/** When the port is busy (e.g. the previous deploy still holds it), mount on an alternate port instead (the socket server's built-in free-port scan), and keep trying to take the real port - once it frees, a raw TCP relay on the real port forwards to our listener (SocketFunction can only mount once per process). */
|
|
10
14
|
portFallback?: {
|
|
11
15
|
/** Delay until the next main-port acquisition attempt (tightened around the predecessor's scheduled death) */
|
|
@@ -18,8 +22,8 @@ export type HostServerConfig = {
|
|
|
18
22
|
};
|
|
19
23
|
/** 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. */
|
|
20
24
|
export declare function hostServer(config: HostServerConfig): Promise<string>;
|
|
21
|
-
/** Returns the cached HTTPS cert for the domain, creating/renewing it first if it is past this process's renewal threshold. Reads the disk cache on every call, so a renewal done by a parallel process is picked up instead of renewing again. */
|
|
22
|
-
export declare function getFreshHTTPSCert(domain: string): Promise<{
|
|
25
|
+
/** Returns the cached HTTPS cert for the domain, creating/renewing it first if it is past this process's renewal threshold. Reads the disk cache on every call, so a renewal done by a parallel process is picked up instead of renewing again. selfSigned: sign it with this machine's CA instead of getting a real ACME cert. */
|
|
26
|
+
export declare function getFreshHTTPSCert(domain: string, selfSigned?: boolean): Promise<{
|
|
23
27
|
key: string;
|
|
24
28
|
cert: string;
|
|
25
29
|
}>;
|