sliftutils 1.8.5 → 1.8.7
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/dist/treeSummary.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/package.json +1 -1
- package/render-utils/dist/LocalStorageParam.ts.cache +62 -0
- package/security/authorizedKeys/daemon/dist/revocation.ts.cache +6 -4
- package/security/authorizedKeys/daemon/revocation.ts +4 -2
- package/security/authorizedKeys/dist/unrevokeCli.ts.cache +6 -3
- package/security/authorizedKeys/unrevoke.ts +31 -8
- package/security/authorizedKeys/unrevokeCli.ts +17 -2
- package/security/machines/addMachine.ts +2 -2
- package/security/machines/dist/machines.ts.cache +13 -6
- package/security/machines/dist/printMachineId.ts.cache +6 -3
- package/security/machines/machines.ts +11 -4
- package/security/machines/printMachineId.ts +2 -1
- package/security/signedFiles/signFilesCli.ts +2 -1
- package/storage/dist/ArchivesDisk.ts.cache +2 -2
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/StreamingLogs.ts.cache +2 -2
- package/storage/dist/TransactionFile.ts.cache +2 -2
- package/storage/dist/archiveHelpers.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +19 -4
- package/storage/proxydatabase/ivfEmbeddingDatabase.ts +16 -2
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
- package/storage/remoteStorage/dist/chainStartup.ts.cache +2 -2
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +2 -2
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageLogs.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageServerState.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSync.ts.cache +2 -2
- package/storage/remoteStorage/dist/validation.ts.cache +2 -2
|
@@ -79,11 +79,12 @@ export async function readRemoteRevocations(config: { sourceURL: string }) {
|
|
|
79
79
|
return revocations;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
/**
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
/** What the unrevokes already in a repo allow: "<identity> <address>" for each pair, plus the bare
|
|
83
|
+
revocation ids the older format named.
|
|
84
|
+
|
|
85
|
+
Read out of the repo rather than out of the daemon's absorbed state, because whoever runs a cli
|
|
86
|
+
is looking at a checkout and has no daemon in the process to ask. */
|
|
87
|
+
export async function readUnrevokedInRepo(repoPath: string) {
|
|
87
88
|
let unrevoked = new Set<string>();
|
|
88
89
|
try {
|
|
89
90
|
let directory = path.join(repoPath, UNREVOKES_DIR);
|
|
@@ -93,7 +94,10 @@ export async function revokedKeysInRepo(config: { repoPath: string; sourceURL: s
|
|
|
93
94
|
}
|
|
94
95
|
let parsed = JSON.parse(await fs.readFile(path.join(directory, name), "utf8"));
|
|
95
96
|
for (let allowed of parsed.allowed || []) {
|
|
96
|
-
|
|
97
|
+
let identity = allowed.fingerprint || allowed.machineId;
|
|
98
|
+
if (identity && allowed.ip) {
|
|
99
|
+
unrevoked.add(`${identity} ${allowed.ip}`);
|
|
100
|
+
}
|
|
97
101
|
}
|
|
98
102
|
// Named ids, for the unrevokes written before this was about pairs.
|
|
99
103
|
for (let revocationId of parsed.revocationIds || []) {
|
|
@@ -103,8 +107,27 @@ export async function revokedKeysInRepo(config: { repoPath: string; sourceURL: s
|
|
|
103
107
|
} catch (e) {
|
|
104
108
|
// Nothing has been unrevoked.
|
|
105
109
|
}
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
return unrevoked;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** The revocations those unrevokes have not already undone.
|
|
114
|
+
|
|
115
|
+
Matched on revocationIdentity, not on fingerprint: a machine revocation carries a machineId and
|
|
116
|
+
no fingerprint, so comparing fingerprints leaves every machine looking revoked forever no matter
|
|
117
|
+
how many times it is unrevoked. */
|
|
118
|
+
export function stillRevokedBy(revocations: Revocation[], unrevoked: Set<string>) {
|
|
119
|
+
return revocations.filter(revocation =>
|
|
120
|
+
!unrevoked.has(revocation.revocationId)
|
|
121
|
+
&& !unrevoked.has(`${revocationIdentity(revocation)} ${revocationIP(revocation)}`)
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Which keys in a repo are revoked. What signfiles and securessh refuse over. */
|
|
126
|
+
export async function revokedKeysInRepo(config: { repoPath: string; sourceURL: string }) {
|
|
127
|
+
let { repoPath, sourceURL } = config;
|
|
128
|
+
let revocations = await readRemoteRevocations({ sourceURL });
|
|
129
|
+
let unrevoked = await readUnrevokedInRepo(repoPath);
|
|
130
|
+
let stillRevoked = stillRevokedBy(revocations, unrevoked);
|
|
108
131
|
let keys = normalizeKeys(await fs.readFile(path.join(repoPath, "authorized_keys"), "utf8").catch(() => ""));
|
|
109
132
|
return stillRevoked
|
|
110
133
|
.filter(revocation => keys.some(key => keyFingerprint(key) === revocation.fingerprint))
|
|
@@ -6,7 +6,7 @@ import { revokeRepoURL } from "./revokeSource";
|
|
|
6
6
|
import { signRepo } from "../signedFiles/signFiles";
|
|
7
7
|
import { getMachines, setMachines } from "../machines/machines";
|
|
8
8
|
import { resolveKeysRepo } from "./keysRepo";
|
|
9
|
-
import { readRemoteRevocations, Revocation, revocationIdentity, revocationIP, UNREVOKES_DIR } from "./unrevoke";
|
|
9
|
+
import { readRemoteRevocations, readUnrevokedInRepo, Revocation, revocationIdentity, revocationIP, stillRevokedBy, UNREVOKES_DIR } from "./unrevoke";
|
|
10
10
|
|
|
11
11
|
const GIT_KEYWORD = "git";
|
|
12
12
|
const COMMIT_MESSAGE = "unrevoke keys";
|
|
@@ -104,6 +104,18 @@ async function main() {
|
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
// Only what this repo has not already forgiven. Revocations are never deleted from the revoke
|
|
108
|
+
// repo, so without this every run writes a fresh unrevoke naming every revocation that ever
|
|
109
|
+
// happened - the same entries listed and re-signed each time, which reads as though unrevoking
|
|
110
|
+
// does nothing at all.
|
|
111
|
+
let alreadyUnrevoked = await readUnrevokedInRepo(repoPath);
|
|
112
|
+
revocations = stillRevokedBy(revocations, alreadyUnrevoked);
|
|
113
|
+
if (!revocations.length) {
|
|
114
|
+
console.log(`Everything ${revokeRepoURL(originURL)} lists is already unrevoked here.`);
|
|
115
|
+
console.log(`Nothing to do, and nothing was written.`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
107
119
|
let directory = path.join(repoPath, UNREVOKES_DIR);
|
|
108
120
|
await fs.mkdir(directory, { recursive: true });
|
|
109
121
|
let stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
@@ -189,7 +201,10 @@ async function main() {
|
|
|
189
201
|
|
|
190
202
|
if (!pushToGit) {
|
|
191
203
|
console.log(`\nCommit and push it, and those keys work again as each machine picks it up:`);
|
|
192
|
-
|
|
204
|
+
// The cd is part of the block on purpose. These commands only do the right thing inside
|
|
205
|
+
// the keys repo, and whoever reads this is almost never sitting in it - pasting the git
|
|
206
|
+
// lines alone commits whatever repo their terminal happened to be in, or nothing at all.
|
|
207
|
+
console.log(`\`\`\`\ncd ${repoPath}\ngit add -A\ngit commit -m "${COMMIT_MESSAGE}"\ngit push\n\`\`\``);
|
|
193
208
|
return;
|
|
194
209
|
}
|
|
195
210
|
await runPromise(`git add -A`, { cwd: repoPath });
|
|
@@ -93,8 +93,8 @@ async function main() {
|
|
|
93
93
|
console.log(` in ${repoPath}`);
|
|
94
94
|
|
|
95
95
|
if (!pushToGit) {
|
|
96
|
-
console.log(`\nNothing believes this until it is signed.
|
|
97
|
-
console.log(`\`\`\`\nyarn signfiles ${GIT_KEYWORD}\n\`\`\``);
|
|
96
|
+
console.log(`\nNothing believes this until it is signed. Run:`);
|
|
97
|
+
console.log(`\`\`\`\ncd ${repoPath}\nyarn signfiles ${GIT_KEYWORD}\n\`\`\``);
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
100
|
await signRepo({ repoPath });
|
|
@@ -14,6 +14,7 @@ const git_1 = require("../authorizedKeys/daemon/git");
|
|
|
14
14
|
const repoFiles_2 = require("../authorizedKeys/daemon/repoFiles");
|
|
15
15
|
const readSignedRepo_1 = require("../authorizedKeys/daemon/readSignedRepo");
|
|
16
16
|
const revokeSource_1 = require("../authorizedKeys/revokeSource");
|
|
17
|
+
const sources_1 = require("../authorizedKeys/sources");
|
|
17
18
|
const notify_1 = require("../authorizedKeys/daemon/notify");
|
|
18
19
|
const discord_1 = require("../notifications/discord");
|
|
19
20
|
const certs_1 = require("../../misc/https/certs");
|
|
@@ -314,8 +315,9 @@ async function recordMachineRevocation(config) {
|
|
|
314
315
|
+ ` else has a copy of the key, or the machine's address changed.`
|
|
315
316
|
+ `\n\nMachine ${machineId} is frozen everywhere now, and nothing accepts calls from ${machineId}.`
|
|
316
317
|
+ `\n\nIf this was an attack, remove \`machines/${machineId}.json\` from \`${sourceURL}\` now.`
|
|
317
|
-
+ `\nIf the new address is legitimate, run
|
|
318
|
-
+
|
|
318
|
+
+ `\nIf the new address is legitimate, run:`
|
|
319
|
+
+ `\n\`\`\`\ncd ${(0, sources_1.sourceRepoPath)(sourceURL)}\nyarn unrevoke git\n\`\`\``
|
|
320
|
+
+ `\nThe unrevoke allows ${machineId} from ${ip}, and takes effect as each machine picks it up.`
|
|
319
321
|
+ `\n\nmachine: \`${machineId}\``
|
|
320
322
|
+ `\nfrozen by: \`${hostLabel}\``);
|
|
321
323
|
return true;
|
|
@@ -348,14 +350,19 @@ async function isMachineAccepted(config) {
|
|
|
348
350
|
+ `${frozen.revokedAt && `, at ${frozen.revokedAt}` || ""}`
|
|
349
351
|
+ `${frozen.revokedBy && `, noticed by ${frozen.revokedBy}` || ""}`
|
|
350
352
|
+ `, which is not an address it is allowed from (revocation ${frozen.revocationId}).`
|
|
351
|
-
+ ` To give it access again, run
|
|
353
|
+
+ ` To give it access again, run: cd ${(0, sources_1.sourceRepoPath)(sourceURL)} && yarn unrevoke git`,
|
|
352
354
|
},
|
|
353
355
|
froze: false,
|
|
354
356
|
};
|
|
355
357
|
}
|
|
356
358
|
return { verdict: { accepted: false, reason: `Machine ${machineId} is not trusted. ${addMachineCommand({ machineId, ip, domain })}` }, froze: false };
|
|
357
359
|
}
|
|
358
|
-
|
|
360
|
+
// Loopback is always an allowed address. The machine still has to be trusted - an unknown
|
|
361
|
+
// or frozen one was already refused above - but no ip list can describe a machine talking
|
|
362
|
+
// to itself: a machine is listed under the address others reach it at, never 127.0.0.1,
|
|
363
|
+
// so checking loopback against that list rejects every local call and then freezes the
|
|
364
|
+
// machine everywhere for making it.
|
|
365
|
+
if (machine.ips.includes(ip) || LOOPBACK.includes(ip)) {
|
|
359
366
|
return { verdict: { accepted: true, reason: "" }, froze: false };
|
|
360
367
|
}
|
|
361
368
|
// Listed, but talking to us from somewhere it should not be. Recorded once for this machine
|
|
@@ -391,5 +398,5 @@ async function isMachineAccepted(config) {
|
|
|
391
398
|
return (await evaluate()).verdict;
|
|
392
399
|
}
|
|
393
400
|
exports.isMachineAccepted = isMachineAccepted;
|
|
394
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLG9FQUFzRTtBQUN0RSxzREFBZ0U7QUFDaEUsa0VBQXFFO0FBQ3JFLDRFQUEySTtBQUMzSSxpRUFBK0U7QUFDL0UsNERBQXlEO0FBQ3pELHNEQUF1STtBQUN2SSxrREFBaUk7QUFDakksb0RBQWlGO0FBQ2pGLHlEQUFtRDtBQUNuRCwyREFBK0Q7QUFHL0QsbUdBQW1HO0FBQ25HLGlHQUFpRztBQUNqRyxnRUFBZ0U7QUFDbkQsUUFBQSxZQUFZLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxNQUFNLGlCQUFpQixHQUFHLDhDQUE4QyxDQUFDO0FBQ3pFLGdHQUFnRztBQUNoRyxtQ0FBbUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLDZGQUE2RjtBQUM3RixpR0FBaUc7QUFDakcsa0VBQWtFO0FBQ2xFLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxnR0FBZ0c7QUFDaEcsaUdBQWlHO0FBQ2pHLDBEQUEwRDtBQUMxRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDMUQsZ0dBQWdHO0FBQ2hHLGdHQUFnRztBQUNoRyxNQUFNLDhCQUE4QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDakQsSUFBSSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFTakMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxN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QUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsU0FBUyx3QkFBd0IsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDckgsQ0FBQyxDQUFDO0lBRUYsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFDO0lBQzFDLGdHQUFnRztJQUNoRywrRkFBK0Y7SUFDL0Ysd0JBQXdCO0lBQ3hCLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0QsOEZBQThGO0lBQzlGLGdHQUFnRztJQUNoRyw0RkFBNEY7SUFDNUYsU0FBUztJQUNULElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLHdCQUF3QixHQUFHLDhCQUE4QixFQUFFLENBQUM7UUFDekUsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUEsZ0JBQVEsR0FBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBQSxjQUFRLEVBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0SCxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxNQUFNLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RDLENBQUM7QUEvRUQsOENBK0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHJlc29sdmVLZXlzUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9rZXlzUmVwb1wiO1xuaW1wb3J0IHsgcmV2b2tlUmVwbywgc3luY1JlcG9GaWxlcyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBuZXdSZXZvY2F0aW9uSWQgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3Jldm9jYXRpb25cIjtcbmltcG9ydCB7IHJ1bkdpdCwgc3luY1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL2dpdFwiO1xuaW1wb3J0IHsgZW5zdXJlUmV2b2tlS2V5IH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZXBvRmlsZXNcIjtcbmltcG9ydCB7IGlkZW50aXR5RnJvemVuQnksIGlzUGFpclJldm9rZWQsIGlzUGFpclVucmV2b2tlZCwgbm90ZVJldm9jYXRpb24sIHJlYWRTaWduZWRSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZWFkU2lnbmVkUmVwb1wiO1xuaW1wb3J0IHsgcmV2b2tlUmVwb1BhdGgsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvcmV2b2tlU291cmNlXCI7XG5pbXBvcnQgeyBub3RpZnkgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL25vdGlmeVwiO1xuaW1wb3J0IHsgYXJlRGlzY29yZE5vdGlmaWNhdGlvbnNDb25maWd1cmVkLCBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucywgREVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSCB9IGZyb20gXCIuLi9ub3RpZmljYXRpb25zL2Rpc2NvcmRcIjtcbmltcG9ydCB7IERFVl9nZXRJZGVudGl0eUZpbGVQYXRoLCBnZW5lcmF0ZUNBLCBnZXRNYWNoaW5lSWQsIGdldE93bk1hY2hpbmVJZCwgSWRlbnRpdHlTdG9yYWdlVHlwZSB9IGZyb20gXCIuLi8uLi9taXNjL2h0dHBzL2NlcnRzXCI7XG5pbXBvcnQgeyBkZXNjcmliZUhvc3QsIHJ1bk92ZXJTU0gsIHdyaXRlUmVtb3RlRmlsZSB9IGZyb20gXCIuLi9oZWxwZXJzL3JlbW90ZVNTSFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuXG4vLyBXaGljaCBtYWNoaW5lcyB0aGlzIHN5c3RlbSB0YWxrcyB0bywga2VwdCBpbiB0aGUgc2FtZSByZXBvIGFzIHRoZSBzc2gga2V5cy4gVGhhdCByZXBvIGlzIGFscmVhZHlcbi8vIHNpZ25lZCwgYWxyZWFkeSBkaXN0cmlidXRlZCB0byBldmVyeSBtYWNoaW5lLCBhbmQgYWxyZWFkeSBoYXMgc29tZXdoZXJlIHRvIHJlY29yZCBhIHJlamVjdGlvbixcbi8vIHNvIGEgc2Vjb25kIG9uZSB3b3VsZCBvbmx5IGJlIGEgc2Vjb25kIHRoaW5nIHRvIGtlZXAgaW4gc3RlcC5cbmV4cG9ydCBjb25zdCBNQUNISU5FU19ESVIgPSBcIm1hY2hpbmVzXCI7XG5jb25zdCBSRVZPQ0FUSU9OU19ESVIgPSBcInJldm9jYXRpb25zXCI7XG5jb25zdCBSRVZPQ0FUSU9OX1JFQVNPTiA9IFwiYSBtYWNoaW5lIHRhbGtlZCB0byB1cyBmcm9tIGFuIHVuYXBwcm92ZWQgSVBcIjtcbi8vIFRoZSByZXZva2UgcmVwbyBpcyBwdWxsZWQgYXQgbW9zdCB0aGlzIG9mdGVuLiBBIGNoZWNrIGhhcHBlbnMgcGVyIHJlcXVlc3QsIGFuZCBhIHJlcXVlc3QgbXVzdFxuLy8gbm90IGNvc3QgYSByb3VuZCB0cmlwIHRvIGdpdGh1Yi5cbmNvbnN0IFJFVk9LRV9TWU5DX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gQW5kIHRoZSBtYWNoaW5lIGxpc3QgaXMgcmUtcmVhZCBmcm9tIHRoZSBjaGVja291dCBvbiB0aGlzIGludGVydmFsLCBpbiB0aGUgYmFja2dyb3VuZC4gVGhlXG4vLyBjaGVja291dCBpdHNlbGYgb25seSBtb3ZlcyB3aGVuIHRoZSBkYWVtb24gcHVsbHMgaXQsIHdoaWNoIGlzIG9uIHRoZSBzYW1lIHNvcnQgb2YgaW50ZXJ2YWwsIHNvXG4vLyByZWFkaW5nIG1vcmUgb2Z0ZW4gdGhhbiB0aGlzIHdvdWxkIG9ubHkgcmUtcmVhZCB0aGUgc2FtZSBieXRlcy5cbmNvbnN0IE1BQ0hJTkVTX1JFRlJFU0hfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBIb3cgbG9uZyBhIGZhaWx1cmUgdG8gZmluZCB0aGUga2V5cyByZXBvIGlzIHJlbWVtYmVyZWQuIEEgbG9uZyBsaXZlZCBwcm9jZXNzIG1heSBzdGFydCBiZWZvcmVcbi8vIHRoZSBtYWNoaW5lIGlzIHNldCB1cCwgYW5kIHNob3VsZCBwaWNrIGl0IHVwIG9uY2UgaXQgaXMsIHdpdGhvdXQgYmVpbmcgcmVzdGFydGVkIC0gYnV0IGl0IG11c3Rcbi8vIG5vdCBwYXkgZm9yIHJlc29sdmluZyB0aGUgcmVwbyBvbiBldmVyeSByZXF1ZXN0IGVpdGhlci5cbmNvbnN0IFJFUE9fUkVUUllfREVMQVkgPSAxNSAqIDEwMDA7XG5jb25zdCBMT09QQkFDSyA9IFtcIjEyNy4wLjAuMVwiLCBcIjo6MVwiLCBcIjo6ZmZmZjoxMjcuMC4wLjFcIl07XG4vLyBUaGUgdHJ1c3RlZCBtYWNoaW5lIGxpc3QgaXMgcmUtcmVhZCBhdCBtb3N0IHRoaXMgb2Z0ZW4gd2hlbiBhIGNoZWNrIHJlamVjdHMsIHNvIGEgY2FsbGVyIHRoYXRcbi8vIHdhcyBqdXN0IGFkZGVkIGlzIHBpY2tlZCB1cCBxdWlja2x5IHdpdGhvdXQgbGV0dGluZyBhIGZsb29kIG9mIHJlamVjdGlvbnMgcmUtcmVhZCBldmVyeSB0aW1lLlxuY29uc3QgTUFDSElORVNfSU5WQUxJREFUSU9OX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xubGV0IGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA9IDA7XG5cbi8qKiBPbmUgbWFjaGluZSB3ZSBhcmUgd2lsbGluZyB0byB0YWxrIHRvLCBhbmQgdGhlIGFkZHJlc3NlcyBpdCBtYXkgdGFsayB0byB1cyBmcm9tLiAqL1xuZXhwb3J0IHR5cGUgTWFjaGluZVN0YXRlID0ge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwczogc3RyaW5nW107XG4gICAgYWRkZWRBdDogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gcGF0aEV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGg6IHN0cmluZywgbWFjaGluZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIsIGAke21hY2hpbmVJZH0uanNvbmApO1xufVxuXG4vKiogVGhpcyBtYWNoaW5lJ3Mga2V5cyByZXBvLCB3b3JrZWQgb3V0IG9uY2UgYW5kIHRoZW4gcmVtZW1iZXJlZC5cblxuICAgIEEgZmFpbHVyZSBpcyByZW1lbWJlcmVkIHRvbywgYnV0IG9ubHkgYnJpZWZseTogYSBzZXJ2ZXIgbWF5IHdlbGwgc3RhcnQgYmVmb3JlIHRoZSBtYWNoaW5lIGhhc1xuICAgIGJlZW4gc2V0IHVwLCBhbmQgc2hvdWxkIHN0YXJ0IHdvcmtpbmcgd2hlbiBpdCBpcywgcmF0aGVyIHRoYW4gbmVlZGluZyBhIHJlc3RhcnQuICovXG5leHBvcnQgY29uc3Qga2V5c1JlcG8gPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgbG9va3VwID0gcmVzb2x2ZUtleXNSZXBvKCk7XG4gICAgbG9va3VwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBrZXlzUmVwby5yZXNldCgpLCBSRVBPX1JFVFJZX0RFTEFZKS51bnJlZigpO1xuICAgIH0pO1xuICAgIHJldHVybiBhd2FpdCBsb29rdXA7XG59KTtcblxuLyoqIEV2ZXJ5IG1hY2hpbmUgYSBjaGVja291dCBsaXN0cy4gV2l0aG91dCBhIHJlcG8sIHRoaXMgbWFjaGluZSdzIG93bi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNYWNoaW5lcyhyZXBvUGF0aD86IHN0cmluZyk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICByZXR1cm4gWy4uLihhd2FpdCByZWFkTWFjaGluZXMocmVwb1BhdGggfHwgKGF3YWl0IGtleXNSZXBvKCkpLnJlcG9QYXRoKSkudmFsdWVzKCldO1xufVxuXG4vKiogVGhlIG1hY2hpbmVzIHRoZSBzaWduZWQgZmlsZXMgdm91Y2ggZm9yLiBPbmx5IHRoZSBtYWNoaW5lIGZpbGVzIGNvdmVyZWQgYnkgdGhlIHNpZ25hdHVyZSBhcmVcbiAgICByZWFkIC0gYW4gdW5zaWduZWQgbWFjaGluZXMvKi5qc29uIGlzIG5vdCBldmlkZW5jZSBvZiBhbnl0aGluZywgc28gcmVhZFNpZ25lZFJlcG8gaGFzIGFscmVhZHlcbiAgICBsZWZ0IGl0IG91dC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUcnVzdGVkTWFjaGluZXMoKSB7XG4gICAgbGV0IHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICBsZXQgeyBmaWxlcyB9ID0gYXdhaXQgcmVhZFNpZ25lZFJlcG8oeyByZXBvUGF0aCwgc291cmNlVVJMIH0pO1xuICAgIGxldCBtYWNoaW5lczogTWFjaGluZVN0YXRlW10gPSBbXTtcbiAgICBmb3IgKGxldCBbZmlsZVBhdGgsIGNvbnRlbnRzXSBvZiBmaWxlcykge1xuICAgICAgICBsZXQgbmFtZSA9IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7TUFDSElORVNfRElSfS9gKSAmJiBmaWxlUGF0aC5zbGljZShNQUNISU5FU19ESVIubGVuZ3RoICsgMSkgfHwgXCJcIjtcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikgfHwgbmFtZS5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYWNoaW5lID0gcGFyc2VNYWNoaW5lRmlsZShuYW1lLCBjb250ZW50cy50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICBpZiAobWFjaGluZSkge1xuICAgICAgICAgICAgbWFjaGluZXMucHVzaChtYWNoaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZXM7XG59XG5cbmNvbnN0IHRydXN0ZWRNYWNoaW5lcyA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZWFkID0gcmVhZFRydXN0ZWRNYWNoaW5lcygpO1xuICAgIHJlYWQuY2F0Y2goKCkgPT4gdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCkpO1xuICAgIHJldHVybiBhd2FpdCByZWFkO1xufSk7XG5cbmxldCByZWZyZXNoaW5nID0gZmFsc2U7XG5cbi8qKiBUaGUgbWFjaGluZXMgdGhpcyBzeXN0ZW0gdHJ1c3RzLCBhcyB0aGUgc2lnbmVkIHJlcG8gbGlzdHMgdGhlbS5cblxuICAgIEhlbGQgcmF0aGVyIHRoYW4gcmVhZCBwZXIgY2FsbCwgYW5kIHJlZnJlc2hlZCBpbiB0aGUgYmFja2dyb3VuZCwgc28gbm9ib2R5IGFza2luZyB3aGV0aGVyIGFcbiAgICBtYWNoaW5lIGlzIHRydXN0ZWQgd2FpdHMgZm9yIGEgZGlyZWN0b3J5IG9mIGZpbGVzIHRvIGJlIHJlYWQgYW5kIGEgc2lnbmF0dXJlIHRvIGJlIGNoZWNrZWQuIEFcbiAgICByZWZyZXNoIHRoYXQgZmFpbHMgbGVhdmVzIHRoZSBsaXN0IHdlIGFscmVhZHkgaGF2ZTogdGhlIGNoZWNrb3V0IGlzIG9ubHkgc3RhbGUsIG5vdCB3cm9uZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRUcnVzdGVkTWFjaGluZXMoKTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIGlmICghcmVmcmVzaGluZykge1xuICAgICAgICByZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKE1BQ0hJTkVTX1JFRlJFU0hfSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdHJ1c3RlZE1hY2hpbmVzLnNldChQcm9taXNlLnJlc29sdmUoYXdhaXQgcmVhZFRydXN0ZWRNYWNoaW5lcygpKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvdWxkIG5vdCByZS1yZWFkIHRoZSB0cnVzdGVkIG1hY2hpbmVzLCBrZWVwaW5nIHRoZSBvbmVzIHdlIGhhdmUuICR7ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0cnVzdGVkTWFjaGluZXMoKTtcbn1cblxuLyoqIFRoZSBtYWNoaW5lIGlkIG9mIGEgbWFjaGluZSByZWFjaGVkIG92ZXIgc3NoLCBnZW5lcmF0aW5nIGFuZCBpbnN0YWxsaW5nIGFuIGlkZW50aXR5IGZvciBpdCBpZlxuICAgIGl0IGhhcyBub25lIHVuZGVyIHRoaXMgZG9tYWluLiBUaGUgcHJpdmF0ZSBrZXkgZW5kcyB1cCBvbiB0aGF0IG1hY2hpbmUgYW5kIG5vd2hlcmUgZWxzZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVJlbW90ZU1hY2hpbmVJZChob3N0OiBzdHJpbmcsIGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKERFVl9nZXRJZGVudGl0eUZpbGVQYXRoKGRvbWFpbikpO1xuICAgIGxldCBob21lID0gKGF3YWl0IHJ1bk92ZXJTU0goeyBob3N0LCBzY3JpcHQ6IGBlY2hvICRIT01FYCB9KSkuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAoIWhvbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2hvc3R9IHRvIHJlcG9ydCBhIGhvbWUgZGlyZWN0b3J5LCBpdCByZXBvcnRlZCBub3RoaW5nYCk7XG4gICAgfVxuICAgIGxldCBjb250ZW50cyA9IGF3YWl0IHJ1bk92ZXJTU0goeyBob3N0LCBzY3JpcHQ6IGBjYXQgJHtob21lfS8ke2ZpbGVOYW1lfSAyPi9kZXYvbnVsbCB8fCB0cnVlYCB9KTtcbiAgICBpZiAoY29udGVudHMuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgICBsZXQgc3RvcmVkID0gSlNPTi5wYXJzZShjb250ZW50cy5zdGRvdXQpIGFzIElkZW50aXR5U3RvcmFnZVR5cGU7XG4gICAgICAgIHJldHVybiBnZXRNYWNoaW5lSWQoc3RvcmVkLmRvbWFpbiwgZG9tYWluKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYCR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBoYXMgbm8gaWRlbnRpdHkgZm9yICR7ZG9tYWlufSwgZ2VuZXJhdGluZyBvbmVgKTtcbiAgICBsZXQgZ2VuZXJhdGVkID0gZ2VuZXJhdGVDQShkb21haW4pO1xuICAgIGxldCBzdG9yZWQ6IElkZW50aXR5U3RvcmFnZVR5cGUgPSB7XG4gICAgICAgIGRvbWFpbjogZ2VuZXJhdGVkLmRvbWFpbixcbiAgICAgICAgY2VydEI2NDogZ2VuZXJhdGVkLmNlcnQudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgIGtleUI2NDogZ2VuZXJhdGVkLmtleS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICB9O1xuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBgJHtob21lfS8ke2ZpbGVOYW1lfWAsXG4gICAgICAgIGNvbnRlbnRzOiBKU09OLnN0cmluZ2lmeShzdG9yZWQpLFxuICAgICAgICBmaWxlTW9kZTogXCI2MDBcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3MDBcIixcbiAgICB9KTtcbiAgICByZXR1cm4gZ2V0TWFjaGluZUlkKGdlbmVyYXRlZC5kb21haW4sIGRvbWFpbik7XG59XG5cbi8qKiBNYWtlcyBhIGNoZWNrb3V0IGxpc3QgZXhhY3RseSB0aGVzZSBtYWNoaW5lczogdGhvc2UgbmFtZWQgYXJlIHdyaXR0ZW4gd2l0aCB0aGUgYWRkcmVzc2VzIGdpdmVuLFxuICAgIGFuZCBhbnl0aGluZyBub3QgbmFtZWQgaXMgcmVtb3ZlZC4gU28gcmVhZCB0aGVtLCBjaGFuZ2Ugd2hhdCB5b3Ugd2FudCwgYW5kIHdyaXRlIHRoZSByZXN1bHQuXG5cbiAgICBUaGUgYWRkcmVzc2VzIGFyZSBwYXJ0IG9mIHNldHRpbmcgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBzdGVwLCBiZWNhdXNlIGEgbWFjaGluZSB3aXRoIG5vXG4gICAgYWRkcmVzcyBpdCBtYXkgdGFsayBmcm9tIGlzIG5vdCBhIG1hY2hpbmUgdGhhdCB3b3VsZCBldmVyIGJlIGFjY2VwdGVkIC0gdGhlcmUgaXMgbm8gc3RhdGUgd2hlcmVcbiAgICBuYW1pbmcgb25lIHdpdGhvdXQgdGhlbSBtZWFucyBhbnl0aGluZy5cblxuICAgIE5vdGhpbmcgaGVyZSBzaWducyBvciBjb21taXRzLiBUaGUgc2lnbmF0dXJlIGlzIHdoYXQgZXZlcnkgb3RoZXIgbWFjaGluZSBjaGVja3MgYmVmb3JlXG4gICAgYmVsaWV2aW5nIGFueSBvZiB0aGlzLCBhbmQgaXQgdGFrZXMgdGhlIGhhcmR3YXJlIGtleSwgc28gYHlhcm4gc2lnbmZpbGVzIGdpdGAgaXMgc3RpbGwgeW91cnMgdG9cbiAgICBydW4gYWZ0ZXJ3YXJkcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRNYWNoaW5lcyhjb25maWc6IHtcbiAgICByZXBvUGF0aD86IHN0cmluZztcbiAgICBtYWNoaW5lczogeyBtYWNoaW5lSWQ6IHN0cmluZzsgaXBzOiBzdHJpbmdbXSB9W107XG59KTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIGxldCB7IG1hY2hpbmVzIH0gPSBjb25maWc7XG4gICAgbGV0IHJlcG9QYXRoID0gY29uZmlnLnJlcG9QYXRoIHx8IChhd2FpdCBrZXlzUmVwbygpKS5yZXBvUGF0aDtcbiAgICAvLyBXaGF0ZXZlciB3YXMgaGVsZCBpcyBub3cgc3RhbGUsIHdob2V2ZXIgcmVhZHMgaXQgbmV4dC5cbiAgICB0cnVzdGVkTWFjaGluZXMucmVzZXQoKTtcbiAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWFjaGluZXMocmVwb1BhdGgpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUik7XG4gICAgbGV0IHdyaXR0ZW46IE1hY2hpbmVTdGF0ZVtdID0gW107XG4gICAgZm9yIChsZXQgbWFjaGluZSBvZiBtYWNoaW5lcykge1xuICAgICAgICBpZiAoIW1hY2hpbmUubWFjaGluZUlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgbWFjaGluZUlkLCB3YXMgJHtKU09OLnN0cmluZ2lmeShtYWNoaW5lLm1hY2hpbmVJZCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtYWNoaW5lLmlwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgYWRkcmVzc2VzIGZvciAke21hY2hpbmUubWFjaGluZUlkfSwgd2FzIG5vbmUuIEEgbWFjaGluZSBpcyB0cnVzdGVkIGZyb21gXG4gICAgICAgICAgICAgICAgKyBgIHRoZSBhZGRyZXNzZXMgaXQgbWF5IHRhbGsgZnJvbSwgc28gbGVhdmUgaXQgb3V0IG9mIHRoZSBsaXN0IHRvIHJlbW92ZSBpdC5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpcHMgPSBtYWNoaW5lLmlwcy5maWx0ZXIoKGlwLCBpbmRleCkgPT4gaXAgJiYgbWFjaGluZS5pcHMuaW5kZXhPZihpcCkgPT09IGluZGV4KTtcbiAgICAgICAgbGV0IHN0YXRlOiBNYWNoaW5lU3RhdGUgPSB7XG4gICAgICAgICAgICBtYWNoaW5lSWQ6IG1hY2hpbmUubWFjaGluZUlkLFxuICAgICAgICAgICAgLy8gSW4gdGhlIG9yZGVyIGdpdmVuLCB3aXRob3V0IGR1cGxpY2F0ZXMsIHNvIHRoZSBmaWxlIHJlYWRzIHRoZSB3YXkgaXQgd2FzIHNldC5cbiAgICAgICAgICAgIGlwcyxcbiAgICAgICAgICAgIGFkZGVkQXQ6IGV4aXN0aW5nLmdldChtYWNoaW5lLm1hY2hpbmVJZCk/LmFkZGVkQXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUobWFjaGluZUZpbGVQYXRoKHJlcG9QYXRoLCBzdGF0ZS5tYWNoaW5lSWQpLCBKU09OLnN0cmluZ2lmeShzdGF0ZSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIpO1xuICAgICAgICB3cml0dGVuLnB1c2goc3RhdGUpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIHRoZSByZXBvIGhhZCBhbmQgdGhlIGNhbGxlciBkaWQgbm90IG5hbWUgaXMgbm8gbG9uZ2VyIHRydXN0ZWQuXG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGV4aXN0aW5nLmtleXMoKSkge1xuICAgICAgICBpZiAoIW1hY2hpbmVzLnNvbWUobWFjaGluZSA9PiBtYWNoaW5lLm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKSkge1xuICAgICAgICAgICAgYXdhaXQgZnMucm0obWFjaGluZUZpbGVQYXRoKHJlcG9QYXRoLCBtYWNoaW5lSWQpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3cml0dGVuO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1hY2hpbmVGaWxlKG5hbWU6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IE1hY2hpbmVTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gcGFyc2VkLm1hY2hpbmVJZCB8fCBuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJcIik7XG4gICAgICAgIHJldHVybiB7IG1hY2hpbmVJZCwgaXBzOiBwYXJzZWQuaXBzIHx8IFtdLCBhZGRlZEF0OiBwYXJzZWQuYWRkZWRBdCB8fCBcIlwiIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgSWdub3JpbmcgdW5yZWFkYWJsZSBtYWNoaW5lIGZpbGUgJHtuYW1lfS4gJHtlfWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuLyoqIEV2ZXJ5IG1hY2hpbmUgZmlsZSBvbiBkaXNrLiBGb3IgZWRpdGluZyB0aGUgcmVwbywgbm90IGZvciBkZWNpZGluZyB0cnVzdCAtIHRydXN0IHJlYWRzIHRoZVxuICAgIHNpZ25lZCBmaWxlcyB0aHJvdWdoIHJlYWRUcnVzdGVkTWFjaGluZXMuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTWFjaGluZXMocmVwb1BhdGg6IHN0cmluZykge1xuICAgIGxldCBtYWNoaW5lcyA9IG5ldyBNYXA8c3RyaW5nLCBNYWNoaW5lU3RhdGU+KCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgTUFDSElORVNfRElSKTtcbiAgICBsZXQgbmFtZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcmVjdG9yeSkuY2F0Y2goKCkgPT4gW10gYXMgc3RyaW5nW10pO1xuICAgIGZvciAobGV0IG5hbWUgb2YgbmFtZXMuc29ydCgpKSB7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFjaGluZSA9IHBhcnNlTWFjaGluZUZpbGUobmFtZSwgYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSksIFwidXRmOFwiKS5jYXRjaCgoKSA9PiBcIlwiKSk7XG4gICAgICAgIGlmIChtYWNoaW5lKSB7XG4gICAgICAgICAgICBtYWNoaW5lcy5zZXQobWFjaGluZS5tYWNoaW5lSWQsIG1hY2hpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lcztcbn1cblxubGV0IGxhc3RSZXZva2VTeW5jID0gMDtcblxuLyoqIFB1bGxzIHRoZSBrZXlzIHJlcG8gYW5kIGl0cyByZXZva2UgcmVwbywgYXQgbW9zdCBvbmNlIGEgUkVWT0tFX1NZTkNfSU5URVJWQUwsIGJlY2F1c2UgdGhpcyBpc1xuICAgIGFza2VkIHBlciByZXF1ZXN0LiBCb3RoLCBzaW5jZSBlaXRoZXIgY2hhbmdpbmcgY2hhbmdlcyB0aGUgYW5zd2VyOiB0aGUga2V5cyByZXBvIGNhcnJpZXMgdGhlXG4gICAgbWFjaGluZXMgYW5kIHVucmV2b2tlcywgdGhlIHJldm9rZSByZXBvIGNhcnJpZXMgdGhlIHJldm9jYXRpb25zLiBBIHN5bmMgdGhhdCBmYWlscyBsZWF2ZXMgdGhlXG4gICAgY2hlY2tvdXRzIHdlIGFscmVhZHkgaGF2ZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmNSZXZvY2F0aW9ucyhzb3VyY2VVUkw6IHN0cmluZykge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFJldm9rZVN5bmMgPCBSRVZPS0VfU1lOQ19JTlRFUlZBTCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RSZXZva2VTeW5jID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBzeW5jUmVwbyhzb3VyY2VVUkwpLmNhdGNoKGUgPT4gY29uc29sZS5sb2coYENvdWxkIG5vdCBzeW5jICR7c291cmNlVVJMfSwgdXNpbmcgdGhlIGNoZWNrb3V0IGFscmVhZHkgaGVyZS4gJHtlfWApKTtcbiAgICBhd2FpdCBzeW5jUmVwb0ZpbGVzKHJldm9rZVJlcG8oc291cmNlVVJMKSkuY2F0Y2goZSA9PiBjb25zb2xlLmxvZyhgQ291bGQgbm90IHN5bmMgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9LCB1c2luZyB0aGUgcmV2b2NhdGlvbnMgYWxyZWFkeSBhYnNvcmJlZC4gJHtlfWApKTtcbn1cblxuLyoqIFdoYXQgdG8gcnVuIHRvIHRydXN0IGEgbWFjaGluZSB0aGF0IGhhcyBqdXN0IGJlZW4gcmVmdXNlZC5cblxuICAgIEV2ZXJ5dGhpbmcgaW4gaXQgaXMgYWxyZWFkeSBrbm93biB0byB3aG9ldmVyIGlzIGJlaW5nIHJlZnVzZWQ6IHRoZWlyIG1hY2hpbmUgaWQsIHRoZSBhZGRyZXNzIHdlXG4gICAgc2F3IHRoZW0gYXQsIGFuZCB0aGUgZG9tYWluIHRoZXkganVzdCB0YWxrZWQgdG8uIEhhbmRpbmcgaXQgYmFjayBzYXZlcyB0aGVtIHdvcmtpbmcgb3V0IHRoZVxuICAgIHBhcnRzIG9mIGEgY29tbWFuZCB0aGV5IGhhdmUgZXZlcnkgcmlnaHQgdG8ga25vdy4gUnVubmluZyBpdCBzdGlsbCB0YWtlcyB0aGUgaGFyZHdhcmUga2V5IG9uXG4gICAgdGhlIG1hY2hpbmUgdGhhdCBvd25zIHRoZSByZXBvLCBzbyB0ZWxsaW5nIHRoZW0gY29zdHMgbm90aGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRNYWNoaW5lQ29tbWFuZChjb25maWc6IHsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmc7IGRvbWFpbj86IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0gPSBjb25maWc7XG4gICAgcmV0dXJuIGBUbyB0cnVzdCAke21hY2hpbmVJZH0sIHJ1bjogeWFybiBhZGRtYWNoaW5lICR7ZG9tYWluIHx8IFwiPGRvbWFpbj5cIn0gJHttYWNoaW5lSWR9ICR7aXB9IGdpdGA7XG59XG5cbi8qKiBTZW5kcyB0aGUgb25lIG5vdGlmaWNhdGlvbiB0aGlzIGZpbGUgaXMgYWxsb3dlZCB0byBzZW5kLCB3aGVuIGl0IGNhbi5cblxuICAgIFRoZSBkYWVtb24gY29uZmlndXJlcyBub3RpZmljYXRpb25zIG9uIHN0YXJ0dXAgYW5kIHdvdWxkIHNpbXBseSBzZW5kLiBUaGlzIGNhbiBhbHNvIHJ1biBpbiBzb21lXG4gICAgb3RoZXIgcHJvY2Vzcywgd2hpY2ggaGFzIG5vdCwgc28gdGhlIHdlYmhvb2sgaXMgcGlja2VkIHVwIGhlcmUgaWYgaXQgaXMgcmVhZGFibGUuIEEgbWFjaGluZVxuICAgIHdpdGggbm8gd2ViaG9vayBzZXQgdXAgc3RpbGwgcmVjb3JkcyB0aGUgcmV2b2NhdGlvbiAtIGJlaW5nIHVuYWJsZSB0byB0ZWxsIGFueW9uZSBpcyBub3QgYVxuICAgIHJlYXNvbiB0byBrZWVwIGFjY2VwdGluZyBhIG1hY2hpbmUgdGhhdCBpcyBiZWluZyBtaXN1c2VkLiAqL1xuYXN5bmMgZnVuY3Rpb24gbm90aWZ5QmVzdEVmZm9ydChoZWFkbGluZTogc3RyaW5nLCBib2R5OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoIWFyZURpc2NvcmROb3RpZmljYXRpb25zQ29uZmlndXJlZCgpKSB7XG4gICAgICAgICAgICAvLyBSZWFkIGZpcnN0OiBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucyBleGl0cyB0aGUgcHJvY2VzcyB3aGVuIHRoZSBmaWxlIGlzIG1pc3NpbmcsXG4gICAgICAgICAgICAvLyB3aGljaCBpcyByaWdodCBmb3IgdGhlIGRhZW1vbiBhdCBzdGFydHVwIGFuZCB3cm9uZyBmb3IgYSBsaWJyYXJ5IGNhbGwuXG4gICAgICAgICAgICBhd2FpdCBmcy5yZWFkRmlsZShERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRILCBcInV0ZjhcIik7XG4gICAgICAgICAgICBhd2FpdCBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucyh7IGZpbGVQYXRoOiBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5vdGlmeShoZWFkbGluZSwgYm9keSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHNlbmQgYSBub3RpZmljYXRpb24gYWJvdXQgdGhpcywgaXQgaXMgb25seSBpbiB0aGUgbG9nLiAke2V9YCk7XG4gICAgfVxufVxuXG4vKiogUmVjb3JkcyB0aGF0IGEgbWFjaGluZSB3ZSBhY2NlcHQgdGFsa2VkIHRvIHVzIGZyb20gYW4gYWRkcmVzcyBpdCBpcyBub3QgYWxsb3dlZCBmcm9tLiBPbmUgcGVyXG4gICAgbWFjaGluZSBhbmQgYWRkcmVzcywgc28gYSBzZWNvbmQgYWRkcmVzcyBpcyBhIHNlY29uZCByZXZvY2F0aW9uIGFuZCBhbiB1bnJldm9rZSBvZiB0aGUgZmlyc3RcbiAgICBkb2VzIG5vdCBjb3ZlciBpdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZE1hY2hpbmVSZXZvY2F0aW9uKGNvbmZpZzoge1xuICAgIHNvdXJjZVVSTDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgaG9zdExhYmVsOiBzdHJpbmc7XG59KSB7XG4gICAgbGV0IHsgc291cmNlVVJMLCBtYWNoaW5lSWQsIGlwLCBob3N0TGFiZWwgfSA9IGNvbmZpZztcbiAgICAvLyBDbG9uZXMgaXQgaWYgaXQgaXMgbm90IGhlcmUgeWV0LCB3aGljaCBpcyB0aGUgdXN1YWwgc3RhdGUgb2YgYSBtYWNoaW5lIHRoYXQgaGFzIG5ldmVyIGhhZCB0b1xuICAgIC8vIHJldm9rZSBhbnl0aGluZy4gV2l0aG91dCB0aGlzIHRoZSBta2RpciBiZWxvdyB3b3VsZCBidWlsZCB0aGUgZGlyZWN0b3J5IGFueXdheSBhbmQgZ2l0IHdvdWxkXG4gICAgLy8gdGhlbiBiZSBydW4gc29tZXdoZXJlIHRoYXQgaXMgbm90IGEgY2hlY2tvdXQsIHNvIHRoZSByZXZvY2F0aW9uIHdhcyB3cml0dGVuIHdoZXJlIG5vdGhpbmdcbiAgICAvLyB3b3VsZCBldmVyIHJlYWQgaXQuXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3luY1JlcG9GaWxlcyhyZXZva2VSZXBvKHNvdXJjZVVSTCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IHJlY29yZCB0aGUgcmV2b2NhdGlvbiBvZiAke21hY2hpbmVJZH0sICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfSBjb3VsZCBub3QgYmUgcmVhZC4gJHtlfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCByZXBvUGF0aCA9IHJldm9rZVJlcG9QYXRoKHNvdXJjZVVSTCk7XG4gICAgbGV0IGtleVBhdGggPSBhd2FpdCBlbnN1cmVSZXZva2VLZXkoc291cmNlVVJMKTtcbiAgICBsZXQgcmV2b2NhdGlvbklkID0gbmV3UmV2b2NhdGlvbklkKG1hY2hpbmVJZCk7XG4gICAgbGV0IHJldm9rZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBSRVZPQ0FUSU9OU19ESVIpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIGAke3Jldm9jYXRpb25JZH0uanNvbmApLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJldm9jYXRpb25JZCxcbiAgICAgICAgbWFjaGluZUlkLFxuICAgICAgICBpcCxcbiAgICAgICAgcmV2b2tlZEF0LFxuICAgICAgICByZXZva2VkQnk6IGhvc3RMYWJlbCxcbiAgICAgICAgcmVhc29uOiBSRVZPQ0FUSU9OX1JFQVNPTixcbiAgICB9LCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIik7XG5cbiAgICBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJhZGRcIiwgXCItQVwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCB9KTtcbiAgICBhd2FpdCBydW5HaXQoe1xuICAgICAgICBhcmdzOiBbXCItY1wiLCBcInVzZXIuZW1haWw9cG9ydHNlY3VyZUBsb2NhbGhvc3RcIiwgXCItY1wiLCBcInVzZXIubmFtZT1wb3J0c2VjdXJlXCIsIFwiY29tbWl0XCIsIFwiLW1cIiwgYHJldm9rZSAke3Jldm9jYXRpb25JZH1gXSxcbiAgICAgICAgY3dkOiByZXBvUGF0aCwga2V5UGF0aCxcbiAgICB9KTtcbiAgICBsZXQgcHVzaCA9IGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcInB1c2hcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKHB1c2guc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIC8vIEFub3RoZXIgbWFjaGluZSBtb3N0IGxpa2VseSByZWNvcmRlZCB0aGUgc2FtZSB0aGluZyBmaXJzdCwgYW5kIHRoZSBuZXh0IHJlYWQgcGlja3MgaXQgdXAuXG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3QgcHVzaCB0aGUgcmV2b2NhdGlvbiBvZiAke21hY2hpbmVJZH0gZnJvbSAke2lwfS4gJHsocHVzaC5zdGRvdXQgKyBwdXNoLnN0ZGVycikudHJpbSgpfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG5vdGVSZXZvY2F0aW9uKHJldm9jYXRpb25JZCwgeyBpZGVudGl0eTogbWFjaGluZUlkLCBpcCwgcmV2b2tlZEF0LCByZXZva2VkQnk6IGhvc3RMYWJlbCB9KTtcbiAgICBjb25zb2xlLmxvZyhgUmV2b2tlZCAke21hY2hpbmVJZH0gZnJvbSAke2lwfSwgJHtyZXZvY2F0aW9uSWR9YCk7XG5cbiAgICAvLyBTYWlkIGJ5IHdob2V2ZXIgd3JvdGUgdGhlIHJldm9jYXRpb24sIG9uY2UsIHRoZSBzYW1lIGFzIGZvciBhbiBzc2gga2V5LiBNYWNoaW5lcyB0aGF0IG9ubHlcbiAgICAvLyByZWFkIGl0IGxhdGVyIHNheSBub3RoaW5nLCBvciBvbmUgZXZlbnQgd291bGQgYmUgcmVwb3J0ZWQgYnkgZXZlcnkgbWFjaGluZSB0aGF0IHNhdyBpdC5cbiAgICBhd2FpdCBub3RpZnlCZXN0RWZmb3J0KFxuICAgICAgICBgU1VTUElDSU9VUyBJUCAke2lwfSBGUk9aRSBNQUNISU5FICR7bWFjaGluZUlkfWAsXG4gICAgICAgIGBUcnVzdGVkIG1hY2hpbmUgJHttYWNoaW5lSWR9IHRhbGtlZCB0byB1cyBmcm9tICR7aXB9LCBhbiBhZGRyZXNzICR7bWFjaGluZUlkfSBpcyBub3RgXG4gICAgICAgICsgYCBhbGxvd2VkIGZyb20uIFRoZSBjYWxsZXIgcHJvdmVkIHBvc3Nlc3Npb24gb2YgJHttYWNoaW5lSWR9J3Mga2V5LCBzbyBlaXRoZXIgc29tZW9uZWBcbiAgICAgICAgKyBgIGVsc2UgaGFzIGEgY29weSBvZiB0aGUga2V5LCBvciB0aGUgbWFjaGluZSdzIGFkZHJlc3MgY2hhbmdlZC5gXG4gICAgICAgICsgYFxcblxcbk1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIGZyb3plbiBldmVyeXdoZXJlIG5vdywgYW5kIG5vdGhpbmcgYWNjZXB0cyBjYWxscyBmcm9tICR7bWFjaGluZUlkfS5gXG4gICAgICAgICsgYFxcblxcbklmIHRoaXMgd2FzIGFuIGF0dGFjaywgcmVtb3ZlIFxcYG1hY2hpbmVzLyR7bWFjaGluZUlkfS5qc29uXFxgIGZyb20gXFxgJHtzb3VyY2VVUkx9XFxgIG5vdy5gXG4gICAgICAgICsgYFxcbklmIHRoZSBuZXcgYWRkcmVzcyBpcyBsZWdpdGltYXRlLCBydW4gXFxgeWFybiB1bnJldm9rZSBnaXRcXGAgaW4gXFxgJHtzb3VyY2VVUkx9XFxgLiBUaGVgXG4gICAgICAgICsgYCB1bnJldm9rZSBhbGxvd3MgJHttYWNoaW5lSWR9IGZyb20gJHtpcH0sIGFuZCB0YWtlcyBlZmZlY3QgYXMgZWFjaCBtYWNoaW5lIHBpY2tzIGl0IHVwLmBcbiAgICAgICAgKyBgXFxuXFxubWFjaGluZTogXFxgJHttYWNoaW5lSWR9XFxgYFxuICAgICAgICArIGBcXG5mcm96ZW4gYnk6IFxcYCR7aG9zdExhYmVsfVxcYGBcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKiogV2hldGhlciB3ZSB3aWxsIHRhbGsgdG8gdGhpcyBtYWNoaW5lLCBjb21pbmcgZnJvbSB0aGlzIGFkZHJlc3MuXG5cbiAgICBCb3RoIGhhbHZlcyBhcmUgcmVxdWlyZWQgYW5kIG5laXRoZXIgaXMgYSBndWVzczogdGhlIGNhbGxlciBrbm93cyB0aGUgbWFjaGluZSBpZCBiZWNhdXNlIHRoZVxuICAgIGNvbm5lY3Rpb24gcHJvdmVkIGl0LCBhbmQga25vd3MgdGhlIGFkZHJlc3MgYmVjYXVzZSB0aGUgcGFja2V0cyBjYW1lIGZyb20gdGhlcmUuIEEgbWFjaGluZSB3ZVxuICAgIGRvIG5vdCBsaXN0IGlzIHNpbXBseSBub3QgYWNjZXB0ZWQuIEEgbWFjaGluZSB3ZSBkbyBsaXN0LCBhcnJpdmluZyBmcm9tIGFuIGFkZHJlc3MgaXQgZG9lcyBub3RcbiAgICBoYXZlLCBpcyB0cmVhdGVkIGFzIHRoZSBzYW1lIGtpbmQgb2YgZXZlbnQgYXMgYSBzdG9sZW4gc3NoIGtleSAtIGl0IGlzIHJldm9rZWQgZXZlcnl3aGVyZSwgYW5kXG4gICAgc3RheXMgcmV2b2tlZCB1bnRpbCBhbiB1bnJldm9rZSBhbGxvd3MgdGhhdCBtYWNoaW5lIGZyb20gdGhhdCBhZGRyZXNzLlxuXG4gICAgU2F5cyB3aHkgd2hlbiB0aGUgYW5zd2VyIGlzIG5vLCBiZWNhdXNlIHRoZSB0aHJlZSB3YXlzIHRvIGJlIHJlZnVzZWQgYXJlIGVudGlyZWx5IGRpZmZlcmVudFxuICAgIHRoaW5ncyB0byBhIHBlcnNvbiByZWFkaW5nIGl0OiBuZXZlciB0cnVzdGVkIGF0IGFsbCwgdHJ1c3RlZCBidXQgZnJvemVuLCBvciB0cnVzdGVkIGFuZCB0YWxraW5nXG4gICAgZnJvbSBzb21ld2hlcmUgaXQgc2hvdWxkIG5vdCBiZS5cblxuICAgIFRocm93cyB3aGVuIHRoZSByZXBvIGl0c2VsZiBjYW5ub3QgYmUgcmVhZCBvciBpcyBub3Qgc2lnbmVkLCByYXRoZXIgdGhhbiBhbnN3ZXJpbmcgZmFsc2U6IHRoYXRcbiAgICBpcyBhIGJyb2tlbiBpbnN0YWxsYXRpb24sIG5vdCBhIHJlamVjdGVkIG1hY2hpbmUsIGFuZCB0aGUgdHdvIGRlc2VydmUgZGlmZmVyZW50IGhhbmRsaW5nLiAqL1xuZXhwb3J0IHR5cGUgTWFjaGluZVZlcmRpY3QgPSB7IGFjY2VwdGVkOiBib29sZWFuOyByZWFzb246IHN0cmluZyB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNNYWNoaW5lQWNjZXB0ZWQoY29uZmlnOiB7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICAvLyBVc2VkIGZvciBsb2NhbCBsb29wYmFjayBhY2NlcHRhbmNlLCBhbmQgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy5cbiAgICBkb21haW4/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxNYWNoaW5lVmVyZGljdD4ge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgaXAsIGRvbWFpbiB9ID0gY29uZmlnO1xuICAgIGlmICghbWFjaGluZUlkIHx8ICFpcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgbWFjaGluZUlkIGFuZCBhbiBpcCwgd2FzICR7SlNPTi5zdHJpbmdpZnkobWFjaGluZUlkKX0gYW5kICR7SlNPTi5zdHJpbmdpZnkoaXApfWApO1xuICAgIH1cblxuICAgIC8vIFRoZSB3aG9sZSBjaGVjaywgcGx1cyB3aGV0aGVyIGl0IGZyb3plIHRoZSBtYWNoaW5lLiBBIHJlamVjdGlvbiB0aGF0IGZyb3plIGl0IGlzIGZpbmFsLCBzb1xuICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgdG8gZ2FpbiBmcm9tIGxvb2tpbmcgYWdhaW4uIEFueSBvdGhlciByZWplY3Rpb24gbWlnaHQganVzdCBiZSBhIHN0YWxlIHZpZXcgLVxuICAgIC8vIGEgbWFjaGluZSBhZGRlZCBzZWNvbmRzIGFnbyB0aGF0IG91ciBjYWNoZWQgbGlzdCBoYXMgbm90IGNhdWdodCB1cCB0byAtIHNvIGl0IGlzIHdvcnRoIG9uZVxuICAgIC8vIGZyZXNoIGxvb2ssIHdoaWNoIGlzIHdoYXQgdGhlIHJldHJ5IGJlbG93IGRvZXMuXG4gICAgbGV0IGV2YWx1YXRlID0gYXN5bmMgKCk6IFByb21pc2U8eyB2ZXJkaWN0OiBNYWNoaW5lVmVyZGljdDsgZnJvemU6IGJvb2xlYW4gfT4gPT4ge1xuICAgICAgICBpZiAoTE9PUEJBQ0suaW5jbHVkZXMoaXApICYmICEhZG9tYWluICYmIG1hY2hpbmVJZCA9PT0gZ2V0T3duTWFjaGluZUlkKGRvbWFpbikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IHRydWUsIHJlYXNvbjogXCJcIiB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBzb3VyY2VVUkwgfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgICAgIGF3YWl0IHN5bmNSZXZvY2F0aW9ucyhzb3VyY2VVUkwpO1xuICAgICAgICAvLyBUaGUgbGlzdCBoYXMgcmV2b2NhdGlvbnMgYWxyZWFkeSBhcHBsaWVkIC0gcmVhZFNpZ25lZFJlcG8gZHJvcHMgZnJvemVuIG1hY2hpbmVzIC0gc28gYVxuICAgICAgICAvLyBtYWNoaW5lIGluIGl0IGlzIHRydXN0ZWQsIGFuZCBhIG1hY2hpbmUgbWlzc2luZyBmcm9tIGl0IGlzIGVpdGhlciB1bmtub3duIG9yIGZyb3plbi5cbiAgICAgICAgbGV0IG1hY2hpbmUgPSAoYXdhaXQgZ2V0VHJ1c3RlZE1hY2hpbmVzKCkpLmZpbmQoZW50cnkgPT4gZW50cnkubWFjaGluZUlkID09PSBtYWNoaW5lSWQpO1xuICAgICAgICBpZiAoIW1hY2hpbmUpIHtcbiAgICAgICAgICAgIGxldCBmcm96ZW4gPSBpZGVudGl0eUZyb3plbkJ5KG1hY2hpbmVJZCk7XG4gICAgICAgICAgICBpZiAoZnJvemVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmVyZGljdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBmcm96ZW46IGl0IHdhcyB1c2VkIGZyb20gJHtmcm96ZW4uaXAgfHwgXCJhbiBhZGRyZXNzIG5vdGhpbmcgcmVjb3JkZWRcIn1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgJHtmcm96ZW4ucmV2b2tlZEF0ICYmIGAsIGF0ICR7ZnJvemVuLnJldm9rZWRBdH1gIHx8IFwiXCJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYCR7ZnJvemVuLnJldm9rZWRCeSAmJiBgLCBub3RpY2VkIGJ5ICR7ZnJvemVuLnJldm9rZWRCeX1gIHx8IFwiXCJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYCwgd2hpY2ggaXMgbm90IGFuIGFkZHJlc3MgaXQgaXMgYWxsb3dlZCBmcm9tIChyZXZvY2F0aW9uICR7ZnJvemVuLnJldm9jYXRpb25JZH0pLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGAgVG8gZ2l2ZSBpdCBhY2Nlc3MgYWdhaW4sIHJ1biBpbiB0aGUga2V5cyByZXBvOiB5YXJuIHVucmV2b2tlIGdpdGAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZyb3plOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogZmFsc2UsIHJlYXNvbjogYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIG5vdCB0cnVzdGVkLiAke2FkZE1hY2hpbmVDb21tYW5kKHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0pfWAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFjaGluZS5pcHMuaW5jbHVkZXMoaXApKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiB0cnVlLCByZWFzb246IFwiXCIgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaXN0ZWQsIGJ1dCB0YWxraW5nIHRvIHVzIGZyb20gc29tZXdoZXJlIGl0IHNob3VsZCBub3QgYmUuIFJlY29yZGVkIG9uY2UgZm9yIHRoaXMgbWFjaGluZVxuICAgICAgICAvLyBhbmQgYWRkcmVzcywgc28gYmVpbmcgdGFsa2VkIHRvIHJlcGVhdGVkbHkgZG9lcyBub3Qgd3JpdGUgcmVwZWF0ZWRseS5cbiAgICAgICAgaWYgKCFpc1BhaXJSZXZva2VkKG1hY2hpbmVJZCwgaXApICYmICFpc1BhaXJVbnJldm9rZWQobWFjaGluZUlkLCBpcCkpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIG1hY2hpbmUgdGhhdCBhY3R1YWxseSB3cm90ZSB0aGUgcmV2b2NhdGlvbiBtYXkgc2F5IGl0IGZyb3plIGFueXRoaW5nLiBPbmVcbiAgICAgICAgICAgIC8vIHRoYXQgY291bGQgbm90IHJlYWNoIHRoZSByZXZva2UgcmVwbyBoYXMgcmVmdXNlZCB0aGlzIGNhbGwgYW5kIG5vdGhpbmcgbW9yZS5cbiAgICAgICAgICAgIGxldCBmcm96ZSA9IGF3YWl0IHJlY29yZE1hY2hpbmVSZXZvY2F0aW9uKHsgc291cmNlVVJMLCBtYWNoaW5lSWQsIGlwLCBob3N0TGFiZWw6IG9zLmhvc3RuYW1lKCkgfSk7XG4gICAgICAgICAgICBsZXQgcmVhc29uID0gZnJvemVcbiAgICAgICAgICAgICAgICAmJiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfSwgYW5kIGlzIG5vdyBmcm96ZW4gZXZlcnl3aGVyZS5gXG4gICAgICAgICAgICAgICAgfHwgYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH0uIEl0IGNvdWxkIG5vdCBiZSBmcm96ZW4sICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfSBjb3VsZCBub3QgYmUgd3JpdHRlbi5gO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogZmFsc2UsIHJlYXNvbiB9LCBmcm96ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBub3QgYWxsb3dlZCBmcm9tICR7aXB9LmAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCB7IHZlcmRpY3QsIGZyb3plIH0gPSBhd2FpdCBldmFsdWF0ZSgpO1xuICAgIC8vIEFuIGFjY2VwdCwgb3IgYSByZWplY3Rpb24gdGhhdCBqdXN0IGZyb3plIHRoZSBtYWNoaW5lLCBpcyB0aGUgZmluYWwgd29yZC4gQW55IG90aGVyIHJlamVjdGlvblxuICAgIC8vIG1pZ2h0IGp1c3QgYmUgYSBzdGFsZSBsaXN0IC0gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHdlIGhhdmUgbm90IGNhdWdodCB1cCB0byAtIHNvIGl0IGlzXG4gICAgLy8gd29ydGggb25lIGZyZXNoIGxvb2suXG4gICAgaWYgKHZlcmRpY3QuYWNjZXB0ZWQgfHwgZnJvemUpIHtcbiAgICAgICAgcmV0dXJuIHZlcmRpY3Q7XG4gICAgfVxuICAgIC8vIFJlLXJlYWQgdGhlIGxpc3QgYXQgbW9zdCBvbmNlIGEgbWludXRlLCBzbyBhIGJ1cnN0IG9mIGJhZCBjYWxsZXJzIGNhbm5vdCBtYWtlIHVzIHJlLXJlYWQgb25cbiAgICAvLyBldmVyeSBvbmUgb2YgdGhlbS4gRm9yY2UgdGhlIGNoZWNrb3V0IGJhY2sgdG8gdGhlIHJlbW90ZSBmaXJzdCwgc28gYSBtYWNoaW5lIGFkZGVkIGFuZCBzaWduZWRcbiAgICAvLyBzZWNvbmRzIGFnbyBpcyBwaWNrZWQgdXAgZXZlbiBpZiB0aGUgY2hlY2tvdXQgd2FzIGxlZnQgZGlydHksIHRoZW4gdGFrZSB0aGUgZnJlc2ggbG9vayBhc1xuICAgIC8vIGZpbmFsLlxuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID4gTUFDSElORVNfSU5WQUxJREFUSU9OX0lOVEVSVkFMKSB7XG4gICAgICAgIGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICAgICAgYXdhaXQgc3luY1JlcG8oc291cmNlVVJMLCB7IGZvcmNlVXBkYXRlOiB0cnVlIH0pLmNhdGNoKGUgPT4gY29uc29sZS5sb2coYENvdWxkIG5vdCBmb3JjZSB1cGRhdGUgJHtzb3VyY2VVUkx9LiAke2V9YCkpO1xuICAgICAgICB0cnVzdGVkTWFjaGluZXMucmVzZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCBldmFsdWF0ZSgpKS52ZXJkaWN0O1xufVxuIl19
|
|
395
|
-
/* _JS_SOURCE_HASH = "
|
|
401
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLG9FQUFzRTtBQUN0RSxzREFBZ0U7QUFDaEUsa0VBQXFFO0FBQ3JFLDRFQUEySTtBQUMzSSxpRUFBK0U7QUFDL0UsdURBQTJEO0FBQzNELDREQUF5RDtBQUN6RCxzREFBdUk7QUFDdkksa0RBQWlJO0FBQ2pJLG9EQUFpRjtBQUNqRix5REFBbUQ7QUFDbkQsMkRBQStEO0FBRy9ELG1HQUFtRztBQUNuRyxpR0FBaUc7QUFDakcsZ0VBQWdFO0FBQ25ELFFBQUEsWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUN2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFDdEMsTUFBTSxpQkFBaUIsR0FBRyw4Q0FBOEMsQ0FBQztBQUN6RSxnR0FBZ0c7QUFDaEcsbUNBQW1DO0FBQ25DLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN2Qyw2RkFBNkY7QUFDN0YsaUdBQWlHO0FBQ2pHLGtFQUFrRTtBQUNsRSxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsZ0dBQWdHO0FBQ2hHLGlHQUFpRztBQUNqRywwREFBMEQ7QUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzFELGdHQUFnRztBQUNoRyxnR0FBZ0c7QUFDaEcsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBU2pDLEtBQUssVUFBVSxVQUFVLENBQUMsUUFBZ0I7SUFDdEMsSUFB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QUFDO0lBQ0QsT0FBTyxDQUFDLE1BQU0sUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDdEMsQ0FBQztBQXBGRCw4Q0FvRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcmVzb2x2ZUtleXNSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2tleXNSZXBvXCI7XG5pbXBvcnQgeyByZXZva2VSZXBvLCBzeW5jUmVwb0ZpbGVzIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZXBvRmlsZXNcIjtcbmltcG9ydCB7IG5ld1Jldm9jYXRpb25JZCB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmV2b2NhdGlvblwiO1xuaW1wb3J0IHsgcnVuR2l0LCBzeW5jUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vZ2l0XCI7XG5pbXBvcnQgeyBlbnN1cmVSZXZva2VLZXkgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgaWRlbnRpdHlGcm96ZW5CeSwgaXNQYWlyUmV2b2tlZCwgaXNQYWlyVW5yZXZva2VkLCBub3RlUmV2b2NhdGlvbiwgcmVhZFNpZ25lZFJlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlYWRTaWduZWRSZXBvXCI7XG5pbXBvcnQgeyByZXZva2VSZXBvUGF0aCwgcmV2b2tlUmVwb1VSTCB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IHNvdXJjZVJlcG9QYXRoIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL3NvdXJjZXNcIjtcbmltcG9ydCB7IG5vdGlmeSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vbm90aWZ5XCI7XG5pbXBvcnQgeyBhcmVEaXNjb3JkTm90aWZpY2F0aW9uc0NvbmZpZ3VyZWQsIGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zLCBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgREVWX2dldElkZW50aXR5RmlsZVBhdGgsIGdlbmVyYXRlQ0EsIGdldE1hY2hpbmVJZCwgZ2V0T3duTWFjaGluZUlkLCBJZGVudGl0eVN0b3JhZ2VUeXBlIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcbmltcG9ydCB7IGRlc2NyaWJlSG9zdCwgcnVuT3ZlclNTSCwgd3JpdGVSZW1vdGVGaWxlIH0gZnJvbSBcIi4uL2hlbHBlcnMvcmVtb3RlU1NIXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHNwYXduUHJvbWlzZSB9IGZyb20gXCIuLi9oZWxwZXJzL3NwYXduXCI7XG5cbi8vIFdoaWNoIG1hY2hpbmVzIHRoaXMgc3lzdGVtIHRhbGtzIHRvLCBrZXB0IGluIHRoZSBzYW1lIHJlcG8gYXMgdGhlIHNzaCBrZXlzLiBUaGF0IHJlcG8gaXMgYWxyZWFkeVxuLy8gc2lnbmVkLCBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvIGV2ZXJ5IG1hY2hpbmUsIGFuZCBhbHJlYWR5IGhhcyBzb21ld2hlcmUgdG8gcmVjb3JkIGEgcmVqZWN0aW9uLFxuLy8gc28gYSBzZWNvbmQgb25lIHdvdWxkIG9ubHkgYmUgYSBzZWNvbmQgdGhpbmcgdG8ga2VlcCBpbiBzdGVwLlxuZXhwb3J0IGNvbnN0IE1BQ0hJTkVTX0RJUiA9IFwibWFjaGluZXNcIjtcbmNvbnN0IFJFVk9DQVRJT05TX0RJUiA9IFwicmV2b2NhdGlvbnNcIjtcbmNvbnN0IFJFVk9DQVRJT05fUkVBU09OID0gXCJhIG1hY2hpbmUgdGFsa2VkIHRvIHVzIGZyb20gYW4gdW5hcHByb3ZlZCBJUFwiO1xuLy8gVGhlIHJldm9rZSByZXBvIGlzIHB1bGxlZCBhdCBtb3N0IHRoaXMgb2Z0ZW4uIEEgY2hlY2sgaGFwcGVucyBwZXIgcmVxdWVzdCwgYW5kIGEgcmVxdWVzdCBtdXN0XG4vLyBub3QgY29zdCBhIHJvdW5kIHRyaXAgdG8gZ2l0aHViLlxuY29uc3QgUkVWT0tFX1NZTkNfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBBbmQgdGhlIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGZyb20gdGhlIGNoZWNrb3V0IG9uIHRoaXMgaW50ZXJ2YWwsIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGVcbi8vIGNoZWNrb3V0IGl0c2VsZiBvbmx5IG1vdmVzIHdoZW4gdGhlIGRhZW1vbiBwdWxscyBpdCwgd2hpY2ggaXMgb24gdGhlIHNhbWUgc29ydCBvZiBpbnRlcnZhbCwgc29cbi8vIHJlYWRpbmcgbW9yZSBvZnRlbiB0aGFuIHRoaXMgd291bGQgb25seSByZS1yZWFkIHRoZSBzYW1lIGJ5dGVzLlxuY29uc3QgTUFDSElORVNfUkVGUkVTSF9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIEhvdyBsb25nIGEgZmFpbHVyZSB0byBmaW5kIHRoZSBrZXlzIHJlcG8gaXMgcmVtZW1iZXJlZC4gQSBsb25nIGxpdmVkIHByb2Nlc3MgbWF5IHN0YXJ0IGJlZm9yZVxuLy8gdGhlIG1hY2hpbmUgaXMgc2V0IHVwLCBhbmQgc2hvdWxkIHBpY2sgaXQgdXAgb25jZSBpdCBpcywgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWQgLSBidXQgaXQgbXVzdFxuLy8gbm90IHBheSBmb3IgcmVzb2x2aW5nIHRoZSByZXBvIG9uIGV2ZXJ5IHJlcXVlc3QgZWl0aGVyLlxuY29uc3QgUkVQT19SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IExPT1BCQUNLID0gW1wiMTI3LjAuMC4xXCIsIFwiOjoxXCIsIFwiOjpmZmZmOjEyNy4wLjAuMVwiXTtcbi8vIFRoZSB0cnVzdGVkIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGF0IG1vc3QgdGhpcyBvZnRlbiB3aGVuIGEgY2hlY2sgcmVqZWN0cywgc28gYSBjYWxsZXIgdGhhdFxuLy8gd2FzIGp1c3QgYWRkZWQgaXMgcGlja2VkIHVwIHF1aWNrbHkgd2l0aG91dCBsZXR0aW5nIGEgZmxvb2Qgb2YgcmVqZWN0aW9ucyByZS1yZWFkIGV2ZXJ5IHRpbWUuXG5jb25zdCBNQUNISU5FU19JTlZBTElEQVRJT05fSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID0gMDtcblxuLyoqIE9uZSBtYWNoaW5lIHdlIGFyZSB3aWxsaW5nIHRvIHRhbGsgdG8sIGFuZCB0aGUgYWRkcmVzc2VzIGl0IG1heSB0YWxrIHRvIHVzIGZyb20uICovXG5leHBvcnQgdHlwZSBNYWNoaW5lU3RhdGUgPSB7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXBzOiBzdHJpbmdbXTtcbiAgICBhZGRlZEF0OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aDogc3RyaW5nLCBtYWNoaW5lSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUiwgYCR7bWFjaGluZUlkfS5qc29uYCk7XG59XG5cbi8qKiBUaGlzIG1hY2hpbmUncyBrZXlzIHJlcG8sIHdvcmtlZCBvdXQgb25jZSBhbmQgdGhlbiByZW1lbWJlcmVkLlxuXG4gICAgQSBmYWlsdXJlIGlzIHJlbWVtYmVyZWQgdG9vLCBidXQgb25seSBicmllZmx5OiBhIHNlcnZlciBtYXkgd2VsbCBzdGFydCBiZWZvcmUgdGhlIG1hY2hpbmUgaGFzXG4gICAgYmVlbiBzZXQgdXAsIGFuZCBzaG91bGQgc3RhcnQgd29ya2luZyB3aGVuIGl0IGlzLCByYXRoZXIgdGhhbiBuZWVkaW5nIGEgcmVzdGFydC4gKi9cbmV4cG9ydCBjb25zdCBrZXlzUmVwbyA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBsb29rdXAgPSByZXNvbHZlS2V5c1JlcG8oKTtcbiAgICBsb29rdXAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGtleXNSZXBvLnJlc2V0KCksIFJFUE9fUkVUUllfREVMQVkpLnVucmVmKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IGxvb2t1cDtcbn0pO1xuXG4vKiogRXZlcnkgbWFjaGluZSBhIGNoZWNrb3V0IGxpc3RzLiBXaXRob3V0IGEgcmVwbywgdGhpcyBtYWNoaW5lJ3Mgb3duLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1hY2hpbmVzKHJlcG9QYXRoPzogc3RyaW5nKTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIHJldHVybiBbLi4uKGF3YWl0IHJlYWRNYWNoaW5lcyhyZXBvUGF0aCB8fCAoYXdhaXQga2V5c1JlcG8oKSkucmVwb1BhdGgpKS52YWx1ZXMoKV07XG59XG5cbi8qKiBUaGUgbWFjaGluZXMgdGhlIHNpZ25lZCBmaWxlcyB2b3VjaCBmb3IuIE9ubHkgdGhlIG1hY2hpbmUgZmlsZXMgY292ZXJlZCBieSB0aGUgc2lnbmF0dXJlIGFyZVxuICAgIHJlYWQgLSBhbiB1bnNpZ25lZCBtYWNoaW5lcy8qLmpzb24gaXMgbm90IGV2aWRlbmNlIG9mIGFueXRoaW5nLCBzbyByZWFkU2lnbmVkUmVwbyBoYXMgYWxyZWFkeVxuICAgIGxlZnQgaXQgb3V0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFRydXN0ZWRNYWNoaW5lcygpIHtcbiAgICBsZXQgeyByZXBvUGF0aCwgc291cmNlVVJMIH0gPSBhd2FpdCBrZXlzUmVwbygpO1xuICAgIGxldCB7IGZpbGVzIH0gPSBhd2FpdCByZWFkU2lnbmVkUmVwbyh7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSk7XG4gICAgbGV0IG1hY2hpbmVzOiBNYWNoaW5lU3RhdGVbXSA9IFtdO1xuICAgIGZvciAobGV0IFtmaWxlUGF0aCwgY29udGVudHNdIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtNQUNISU5FU19ESVJ9L2ApICYmIGZpbGVQYXRoLnNsaWNlKE1BQ0hJTkVTX0RJUi5sZW5ndGggKyAxKSB8fCBcIlwiO1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSB8fCBuYW1lLmluY2x1ZGVzKFwiL1wiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmUgPSBwYXJzZU1hY2hpbmVGaWxlKG5hbWUsIGNvbnRlbnRzLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgIGlmIChtYWNoaW5lKSB7XG4gICAgICAgICAgICBtYWNoaW5lcy5wdXNoKG1hY2hpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lcztcbn1cblxuY29uc3QgdHJ1c3RlZE1hY2hpbmVzID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgbGV0IHJlYWQgPSByZWFkVHJ1c3RlZE1hY2hpbmVzKCk7XG4gICAgcmVhZC5jYXRjaCgoKSA9PiB0cnVzdGVkTWFjaGluZXMucmVzZXQoKSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWQ7XG59KTtcblxubGV0IHJlZnJlc2hpbmcgPSBmYWxzZTtcblxuLyoqIFRoZSBtYWNoaW5lcyB0aGlzIHN5c3RlbSB0cnVzdHMsIGFzIHRoZSBzaWduZWQgcmVwbyBsaXN0cyB0aGVtLlxuXG4gICAgSGVsZCByYXRoZXIgdGhhbiByZWFkIHBlciBjYWxsLCBhbmQgcmVmcmVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyBub2JvZHkgYXNraW5nIHdoZXRoZXIgYVxuICAgIG1hY2hpbmUgaXMgdHJ1c3RlZCB3YWl0cyBmb3IgYSBkaXJlY3Rvcnkgb2YgZmlsZXMgdG8gYmUgcmVhZCBhbmQgYSBzaWduYXR1cmUgdG8gYmUgY2hlY2tlZC4gQVxuICAgIHJlZnJlc2ggdGhhdCBmYWlscyBsZWF2ZXMgdGhlIGxpc3Qgd2UgYWxyZWFkeSBoYXZlOiB0aGUgY2hlY2tvdXQgaXMgb25seSBzdGFsZSwgbm90IHdyb25nLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRydXN0ZWRNYWNoaW5lcygpOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgaWYgKCFyZWZyZXNoaW5nKSB7XG4gICAgICAgIHJlZnJlc2hpbmcgPSB0cnVlO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoTUFDSElORVNfUkVGUkVTSF9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0cnVzdGVkTWFjaGluZXMuc2V0KFByb21pc2UucmVzb2x2ZShhd2FpdCByZWFkVHJ1c3RlZE1hY2hpbmVzKCkpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHJlLXJlYWQgdGhlIHRydXN0ZWQgbWFjaGluZXMsIGtlZXBpbmcgdGhlIG9uZXMgd2UgaGF2ZS4gJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRydXN0ZWRNYWNoaW5lcygpO1xufVxuXG4vKiogVGhlIG1hY2hpbmUgaWQgb2YgYSBtYWNoaW5lIHJlYWNoZWQgb3ZlciBzc2gsIGdlbmVyYXRpbmcgYW5kIGluc3RhbGxpbmcgYW4gaWRlbnRpdHkgZm9yIGl0IGlmXG4gICAgaXQgaGFzIG5vbmUgdW5kZXIgdGhpcyBkb21haW4uIFRoZSBwcml2YXRlIGtleSBlbmRzIHVwIG9uIHRoYXQgbWFjaGluZSBhbmQgbm93aGVyZSBlbHNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlUmVtb3RlTWFjaGluZUlkKGhvc3Q6IHN0cmluZywgZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoREVWX2dldElkZW50aXR5RmlsZVBhdGgoZG9tYWluKSk7XG4gICAgbGV0IGhvbWUgPSAoYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogYGVjaG8gJEhPTUVgIH0pKS5zdGRvdXQudHJpbSgpO1xuICAgIGlmICghaG9tZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7aG9zdH0gdG8gcmVwb3J0IGEgaG9tZSBkaXJlY3RvcnksIGl0IHJlcG9ydGVkIG5vdGhpbmdgKTtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogYGNhdCAke2hvbWV9LyR7ZmlsZU5hbWV9IDI+L2Rldi9udWxsIHx8IHRydWVgIH0pO1xuICAgIGlmIChjb250ZW50cy5zdGRvdXQudHJpbSgpKSB7XG4gICAgICAgIGxldCBzdG9yZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzLnN0ZG91dCkgYXMgSWRlbnRpdHlTdG9yYWdlVHlwZTtcbiAgICAgICAgcmV0dXJuIGdldE1hY2hpbmVJZChzdG9yZWQuZG9tYWluLCBkb21haW4pO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgJHtkZXNjcmliZUhvc3QoaG9zdCl9IGhhcyBubyBpZGVudGl0eSBmb3IgJHtkb21haW59LCBnZW5lcmF0aW5nIG9uZWApO1xuICAgIGxldCBnZW5lcmF0ZWQgPSBnZW5lcmF0ZUNBKGRvbWFpbik7XG4gICAgbGV0IHN0b3JlZDogSWRlbnRpdHlTdG9yYWdlVHlwZSA9IHtcbiAgICAgICAgZG9tYWluOiBnZW5lcmF0ZWQuZG9tYWluLFxuICAgICAgICBjZXJ0QjY0OiBnZW5lcmF0ZWQuY2VydC50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAga2V5QjY0OiBnZW5lcmF0ZWQua2V5LnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgIH07XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvbWV9LyR7ZmlsZU5hbWV9YCxcbiAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHN0b3JlZCksXG4gICAgICAgIGZpbGVNb2RlOiBcIjYwMFwiLFxuICAgICAgICBkaXJlY3RvcnlNb2RlOiBcIjcwMFwiLFxuICAgIH0pO1xuICAgIHJldHVybiBnZXRNYWNoaW5lSWQoZ2VuZXJhdGVkLmRvbWFpbiwgZG9tYWluKTtcbn1cblxuLyoqIE1ha2VzIGEgY2hlY2tvdXQgbGlzdCBleGFjdGx5IHRoZXNlIG1hY2hpbmVzOiB0aG9zZSBuYW1lZCBhcmUgd3JpdHRlbiB3aXRoIHRoZSBhZGRyZXNzZXMgZ2l2ZW4sXG4gICAgYW5kIGFueXRoaW5nIG5vdCBuYW1lZCBpcyByZW1vdmVkLiBTbyByZWFkIHRoZW0sIGNoYW5nZSB3aGF0IHlvdSB3YW50LCBhbmQgd3JpdGUgdGhlIHJlc3VsdC5cblxuICAgIFRoZSBhZGRyZXNzZXMgYXJlIHBhcnQgb2Ygc2V0dGluZyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIHN0ZXAsIGJlY2F1c2UgYSBtYWNoaW5lIHdpdGggbm9cbiAgICBhZGRyZXNzIGl0IG1heSB0YWxrIGZyb20gaXMgbm90IGEgbWFjaGluZSB0aGF0IHdvdWxkIGV2ZXIgYmUgYWNjZXB0ZWQgLSB0aGVyZSBpcyBubyBzdGF0ZSB3aGVyZVxuICAgIG5hbWluZyBvbmUgd2l0aG91dCB0aGVtIG1lYW5zIGFueXRoaW5nLlxuXG4gICAgTm90aGluZyBoZXJlIHNpZ25zIG9yIGNvbW1pdHMuIFRoZSBzaWduYXR1cmUgaXMgd2hhdCBldmVyeSBvdGhlciBtYWNoaW5lIGNoZWNrcyBiZWZvcmVcbiAgICBiZWxpZXZpbmcgYW55IG9mIHRoaXMsIGFuZCBpdCB0YWtlcyB0aGUgaGFyZHdhcmUga2V5LCBzbyBgeWFybiBzaWduZmlsZXMgZ2l0YCBpcyBzdGlsbCB5b3VycyB0b1xuICAgIHJ1biBhZnRlcndhcmRzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldE1hY2hpbmVzKGNvbmZpZzoge1xuICAgIHJlcG9QYXRoPzogc3RyaW5nO1xuICAgIG1hY2hpbmVzOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcHM6IHN0cmluZ1tdIH1bXTtcbn0pOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgbGV0IHsgbWFjaGluZXMgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBjb25maWcucmVwb1BhdGggfHwgKGF3YWl0IGtleXNSZXBvKCkpLnJlcG9QYXRoO1xuICAgIC8vIFdoYXRldmVyIHdhcyBoZWxkIGlzIG5vdyBzdGFsZSwgd2hvZXZlciByZWFkcyBpdCBuZXh0LlxuICAgIHRydXN0ZWRNYWNoaW5lcy5yZXNldCgpO1xuICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHJlYWRNYWNoaW5lcyhyZXBvUGF0aCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgTUFDSElORVNfRElSKTtcbiAgICBsZXQgd3JpdHRlbjogTWFjaGluZVN0YXRlW10gPSBbXTtcbiAgICBmb3IgKGxldCBtYWNoaW5lIG9mIG1hY2hpbmVzKSB7XG4gICAgICAgIGlmICghbWFjaGluZS5tYWNoaW5lSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBtYWNoaW5lSWQsIHdhcyAke0pTT04uc3RyaW5naWZ5KG1hY2hpbmUubWFjaGluZUlkKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1hY2hpbmUuaXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBhZGRyZXNzZXMgZm9yICR7bWFjaGluZS5tYWNoaW5lSWR9LCB3YXMgbm9uZS4gQSBtYWNoaW5lIGlzIHRydXN0ZWQgZnJvbWBcbiAgICAgICAgICAgICAgICArIGAgdGhlIGFkZHJlc3NlcyBpdCBtYXkgdGFsayBmcm9tLCBzbyBsZWF2ZSBpdCBvdXQgb2YgdGhlIGxpc3QgdG8gcmVtb3ZlIGl0LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlwcyA9IG1hY2hpbmUuaXBzLmZpbHRlcigoaXAsIGluZGV4KSA9PiBpcCAmJiBtYWNoaW5lLmlwcy5pbmRleE9mKGlwKSA9PT0gaW5kZXgpO1xuICAgICAgICBsZXQgc3RhdGU6IE1hY2hpbmVTdGF0ZSA9IHtcbiAgICAgICAgICAgIG1hY2hpbmVJZDogbWFjaGluZS5tYWNoaW5lSWQsXG4gICAgICAgICAgICAvLyBJbiB0aGUgb3JkZXIgZ2l2ZW4sIHdpdGhvdXQgZHVwbGljYXRlcywgc28gdGhlIGZpbGUgcmVhZHMgdGhlIHdheSBpdCB3YXMgc2V0LlxuICAgICAgICAgICAgaXBzLFxuICAgICAgICAgICAgYWRkZWRBdDogZXhpc3RpbmcuZ2V0KG1hY2hpbmUubWFjaGluZUlkKT8uYWRkZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGgsIHN0YXRlLm1hY2hpbmVJZCksIEpTT04uc3RyaW5naWZ5KHN0YXRlLCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIik7XG4gICAgICAgIHdyaXR0ZW4ucHVzaChzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gV2hhdGV2ZXIgdGhlIHJlcG8gaGFkIGFuZCB0aGUgY2FsbGVyIGRpZCBub3QgbmFtZSBpcyBubyBsb25nZXIgdHJ1c3RlZC5cbiAgICBmb3IgKGxldCBtYWNoaW5lSWQgb2YgZXhpc3Rpbmcua2V5cygpKSB7XG4gICAgICAgIGlmICghbWFjaGluZXMuc29tZShtYWNoaW5lID0+IG1hY2hpbmUubWFjaGluZUlkID09PSBtYWNoaW5lSWQpKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5ybShtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGgsIG1hY2hpbmVJZCksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdyaXR0ZW47XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWFjaGluZUZpbGUobmFtZTogc3RyaW5nLCBjb250ZW50czogc3RyaW5nKTogTWFjaGluZVN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50cyk7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBwYXJzZWQubWFjaGluZUlkIHx8IG5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcHM6IHBhcnNlZC5pcHMgfHwgW10sIGFkZGVkQXQ6IHBhcnNlZC5hZGRlZEF0IHx8IFwiXCIgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyB1bnJlYWRhYmxlIG1hY2hpbmUgZmlsZSAke25hbWV9LiAke2V9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRXZlcnkgbWFjaGluZSBmaWxlIG9uIGRpc2suIEZvciBlZGl0aW5nIHRoZSByZXBvLCBub3QgZm9yIGRlY2lkaW5nIHRydXN0IC0gdHJ1c3QgcmVhZHMgdGhlXG4gICAgc2lnbmVkIGZpbGVzIHRocm91Z2ggcmVhZFRydXN0ZWRNYWNoaW5lcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNYWNoaW5lcyhyZXBvUGF0aDogc3RyaW5nKSB7XG4gICAgbGV0IG1hY2hpbmVzID0gbmV3IE1hcDxzdHJpbmcsIE1hY2hpbmVTdGF0ZT4oKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIpO1xuICAgIGxldCBuYW1lcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KS5jYXRjaCgoKSA9PiBbXSBhcyBzdHJpbmdbXSk7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBuYW1lcy5zb3J0KCkpIHtcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYWNoaW5lID0gcGFyc2VNYWNoaW5lRmlsZShuYW1lLCBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKSwgXCJ1dGY4XCIpLmNhdGNoKCgpID0+IFwiXCIpKTtcbiAgICAgICAgaWYgKG1hY2hpbmUpIHtcbiAgICAgICAgICAgIG1hY2hpbmVzLnNldChtYWNoaW5lLm1hY2hpbmVJZCwgbWFjaGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVzO1xufVxuXG5sZXQgbGFzdFJldm9rZVN5bmMgPSAwO1xuXG4vKiogUHVsbHMgdGhlIGtleXMgcmVwbyBhbmQgaXRzIHJldm9rZSByZXBvLCBhdCBtb3N0IG9uY2UgYSBSRVZPS0VfU1lOQ19JTlRFUlZBTCwgYmVjYXVzZSB0aGlzIGlzXG4gICAgYXNrZWQgcGVyIHJlcXVlc3QuIEJvdGgsIHNpbmNlIGVpdGhlciBjaGFuZ2luZyBjaGFuZ2VzIHRoZSBhbnN3ZXI6IHRoZSBrZXlzIHJlcG8gY2FycmllcyB0aGVcbiAgICBtYWNoaW5lcyBhbmQgdW5yZXZva2VzLCB0aGUgcmV2b2tlIHJlcG8gY2FycmllcyB0aGUgcmV2b2NhdGlvbnMuIEEgc3luYyB0aGF0IGZhaWxzIGxlYXZlcyB0aGVcbiAgICBjaGVja291dHMgd2UgYWxyZWFkeSBoYXZlLiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY1Jldm9jYXRpb25zKHNvdXJjZVVSTDogc3RyaW5nKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0UmV2b2tlU3luYyA8IFJFVk9LRV9TWU5DX0lOVEVSVkFMKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdFJldm9rZVN5bmMgPSBEYXRlLm5vdygpO1xuICAgIGF3YWl0IHN5bmNSZXBvKHNvdXJjZVVSTCkuY2F0Y2goZSA9PiBjb25zb2xlLmxvZyhgQ291bGQgbm90IHN5bmMgJHtzb3VyY2VVUkx9LCB1c2luZyB0aGUgY2hlY2tvdXQgYWxyZWFkeSBoZXJlLiAke2V9YCkpO1xuICAgIGF3YWl0IHN5bmNSZXBvRmlsZXMocmV2b2tlUmVwbyhzb3VyY2VVUkwpKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc3luYyAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0sIHVzaW5nIHRoZSByZXZvY2F0aW9ucyBhbHJlYWR5IGFic29yYmVkLiAke2V9YCkpO1xufVxuXG4vKiogV2hhdCB0byBydW4gdG8gdHJ1c3QgYSBtYWNoaW5lIHRoYXQgaGFzIGp1c3QgYmVlbiByZWZ1c2VkLlxuXG4gICAgRXZlcnl0aGluZyBpbiBpdCBpcyBhbHJlYWR5IGtub3duIHRvIHdob2V2ZXIgaXMgYmVpbmcgcmVmdXNlZDogdGhlaXIgbWFjaGluZSBpZCwgdGhlIGFkZHJlc3Mgd2VcbiAgICBzYXcgdGhlbSBhdCwgYW5kIHRoZSBkb21haW4gdGhleSBqdXN0IHRhbGtlZCB0by4gSGFuZGluZyBpdCBiYWNrIHNhdmVzIHRoZW0gd29ya2luZyBvdXQgdGhlXG4gICAgcGFydHMgb2YgYSBjb21tYW5kIHRoZXkgaGF2ZSBldmVyeSByaWdodCB0byBrbm93LiBSdW5uaW5nIGl0IHN0aWxsIHRha2VzIHRoZSBoYXJkd2FyZSBrZXkgb25cbiAgICB0aGUgbWFjaGluZSB0aGF0IG93bnMgdGhlIHJlcG8sIHNvIHRlbGxpbmcgdGhlbSBjb3N0cyBub3RoaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE1hY2hpbmVDb21tYW5kKGNvbmZpZzogeyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZzsgZG9tYWluPzogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSA9IGNvbmZpZztcbiAgICByZXR1cm4gYFRvIHRydXN0ICR7bWFjaGluZUlkfSwgcnVuOiB5YXJuIGFkZG1hY2hpbmUgJHtkb21haW4gfHwgXCI8ZG9tYWluPlwifSAke21hY2hpbmVJZH0gJHtpcH0gZ2l0YDtcbn1cblxuLyoqIFNlbmRzIHRoZSBvbmUgbm90aWZpY2F0aW9uIHRoaXMgZmlsZSBpcyBhbGxvd2VkIHRvIHNlbmQsIHdoZW4gaXQgY2FuLlxuXG4gICAgVGhlIGRhZW1vbiBjb25maWd1cmVzIG5vdGlmaWNhdGlvbnMgb24gc3RhcnR1cCBhbmQgd291bGQgc2ltcGx5IHNlbmQuIFRoaXMgY2FuIGFsc28gcnVuIGluIHNvbWVcbiAgICBvdGhlciBwcm9jZXNzLCB3aGljaCBoYXMgbm90LCBzbyB0aGUgd2ViaG9vayBpcyBwaWNrZWQgdXAgaGVyZSBpZiBpdCBpcyByZWFkYWJsZS4gQSBtYWNoaW5lXG4gICAgd2l0aCBubyB3ZWJob29rIHNldCB1cCBzdGlsbCByZWNvcmRzIHRoZSByZXZvY2F0aW9uIC0gYmVpbmcgdW5hYmxlIHRvIHRlbGwgYW55b25lIGlzIG5vdCBhXG4gICAgcmVhc29uIHRvIGtlZXAgYWNjZXB0aW5nIGEgbWFjaGluZSB0aGF0IGlzIGJlaW5nIG1pc3VzZWQuICovXG5hc3luYyBmdW5jdGlvbiBub3RpZnlCZXN0RWZmb3J0KGhlYWRsaW5lOiBzdHJpbmcsIGJvZHk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghYXJlRGlzY29yZE5vdGlmaWNhdGlvbnNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICAgIC8vIFJlYWQgZmlyc3Q6IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zIGV4aXRzIHRoZSBwcm9jZXNzIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyxcbiAgICAgICAgICAgIC8vIHdoaWNoIGlzIHJpZ2h0IGZvciB0aGUgZGFlbW9uIGF0IHN0YXJ0dXAgYW5kIHdyb25nIGZvciBhIGxpYnJhcnkgY2FsbC5cbiAgICAgICAgICAgIGF3YWl0IGZzLnJlYWRGaWxlKERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEgsIFwidXRmOFwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zKHsgZmlsZVBhdGg6IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbm90aWZ5KGhlYWRsaW5lLCBib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc2VuZCBhIG5vdGlmaWNhdGlvbiBhYm91dCB0aGlzLCBpdCBpcyBvbmx5IGluIHRoZSBsb2cuICR7ZX1gKTtcbiAgICB9XG59XG5cbi8qKiBSZWNvcmRzIHRoYXQgYSBtYWNoaW5lIHdlIGFjY2VwdCB0YWxrZWQgdG8gdXMgZnJvbSBhbiBhZGRyZXNzIGl0IGlzIG5vdCBhbGxvd2VkIGZyb20uIE9uZSBwZXJcbiAgICBtYWNoaW5lIGFuZCBhZGRyZXNzLCBzbyBhIHNlY29uZCBhZGRyZXNzIGlzIGEgc2Vjb25kIHJldm9jYXRpb24gYW5kIGFuIHVucmV2b2tlIG9mIHRoZSBmaXJzdFxuICAgIGRvZXMgbm90IGNvdmVyIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkTWFjaGluZVJldm9jYXRpb24oY29uZmlnOiB7XG4gICAgc291cmNlVVJMOiBzdHJpbmc7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICBob3N0TGFiZWw6IHN0cmluZztcbn0pIHtcbiAgICBsZXQgeyBzb3VyY2VVUkwsIG1hY2hpbmVJZCwgaXAsIGhvc3RMYWJlbCB9ID0gY29uZmlnO1xuICAgIC8vIENsb25lcyBpdCBpZiBpdCBpcyBub3QgaGVyZSB5ZXQsIHdoaWNoIGlzIHRoZSB1c3VhbCBzdGF0ZSBvZiBhIG1hY2hpbmUgdGhhdCBoYXMgbmV2ZXIgaGFkIHRvXG4gICAgLy8gcmV2b2tlIGFueXRoaW5nLiBXaXRob3V0IHRoaXMgdGhlIG1rZGlyIGJlbG93IHdvdWxkIGJ1aWxkIHRoZSBkaXJlY3RvcnkgYW55d2F5IGFuZCBnaXQgd291bGRcbiAgICAvLyB0aGVuIGJlIHJ1biBzb21ld2hlcmUgdGhhdCBpcyBub3QgYSBjaGVja291dCwgc28gdGhlIHJldm9jYXRpb24gd2FzIHdyaXR0ZW4gd2hlcmUgbm90aGluZ1xuICAgIC8vIHdvdWxkIGV2ZXIgcmVhZCBpdC5cbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzeW5jUmVwb0ZpbGVzKHJldm9rZVJlcG8oc291cmNlVVJMKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgcmVjb3JkIHRoZSByZXZvY2F0aW9uIG9mICR7bWFjaGluZUlkfSwgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9IGNvdWxkIG5vdCBiZSByZWFkLiAke2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHJlcG9QYXRoID0gcmV2b2tlUmVwb1BhdGgoc291cmNlVVJMKTtcbiAgICBsZXQga2V5UGF0aCA9IGF3YWl0IGVuc3VyZVJldm9rZUtleShzb3VyY2VVUkwpO1xuICAgIGxldCByZXZvY2F0aW9uSWQgPSBuZXdSZXZvY2F0aW9uSWQobWFjaGluZUlkKTtcbiAgICBsZXQgcmV2b2tlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFJFVk9DQVRJT05TX0RJUik7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgYCR7cmV2b2NhdGlvbklkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmV2b2NhdGlvbklkLFxuICAgICAgICBtYWNoaW5lSWQsXG4gICAgICAgIGlwLFxuICAgICAgICByZXZva2VkQXQsXG4gICAgICAgIHJldm9rZWRCeTogaG9zdExhYmVsLFxuICAgICAgICByZWFzb246IFJFVk9DQVRJT05fUkVBU09OLFxuICAgIH0sIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcblxuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImFkZFwiLCBcIi1BXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIGF3YWl0IHJ1bkdpdCh7XG4gICAgICAgIGFyZ3M6IFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBgcmV2b2tlICR7cmV2b2NhdGlvbklkfWBdLFxuICAgICAgICBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLFxuICAgIH0pO1xuICAgIGxldCBwdXNoID0gYXdhaXQgcnVuR2l0KHsgYXJnczogW1wicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gQW5vdGhlciBtYWNoaW5lIG1vc3QgbGlrZWx5IHJlY29yZGVkIHRoZSBzYW1lIHRoaW5nIGZpcnN0LCBhbmQgdGhlIG5leHQgcmVhZCBwaWNrcyBpdCB1cC5cbiAgICAgICAgY29uc29sZS5sb2coYENvdWxkIG5vdCBwdXNoIHRoZSByZXZvY2F0aW9uIG9mICR7bWFjaGluZUlkfSBmcm9tICR7aXB9LiAkeyhwdXNoLnN0ZG91dCArIHB1c2guc3RkZXJyKS50cmltKCl9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbm90ZVJldm9jYXRpb24ocmV2b2NhdGlvbklkLCB7IGlkZW50aXR5OiBtYWNoaW5lSWQsIGlwLCByZXZva2VkQXQsIHJldm9rZWRCeTogaG9zdExhYmVsIH0pO1xuICAgIGNvbnNvbGUubG9nKGBSZXZva2VkICR7bWFjaGluZUlkfSBmcm9tICR7aXB9LCAke3Jldm9jYXRpb25JZH1gKTtcblxuICAgIC8vIFNhaWQgYnkgd2hvZXZlciB3cm90ZSB0aGUgcmV2b2NhdGlvbiwgb25jZSwgdGhlIHNhbWUgYXMgZm9yIGFuIHNzaCBrZXkuIE1hY2hpbmVzIHRoYXQgb25seVxuICAgIC8vIHJlYWQgaXQgbGF0ZXIgc2F5IG5vdGhpbmcsIG9yIG9uZSBldmVudCB3b3VsZCBiZSByZXBvcnRlZCBieSBldmVyeSBtYWNoaW5lIHRoYXQgc2F3IGl0LlxuICAgIGF3YWl0IG5vdGlmeUJlc3RFZmZvcnQoXG4gICAgICAgIGBTVVNQSUNJT1VTIElQICR7aXB9IEZST1pFIE1BQ0hJTkUgJHttYWNoaW5lSWR9YCxcbiAgICAgICAgYFRydXN0ZWQgbWFjaGluZSAke21hY2hpbmVJZH0gdGFsa2VkIHRvIHVzIGZyb20gJHtpcH0sIGFuIGFkZHJlc3MgJHttYWNoaW5lSWR9IGlzIG5vdGBcbiAgICAgICAgKyBgIGFsbG93ZWQgZnJvbS4gVGhlIGNhbGxlciBwcm92ZWQgcG9zc2Vzc2lvbiBvZiAke21hY2hpbmVJZH0ncyBrZXksIHNvIGVpdGhlciBzb21lb25lYFxuICAgICAgICArIGAgZWxzZSBoYXMgYSBjb3B5IG9mIHRoZSBrZXksIG9yIHRoZSBtYWNoaW5lJ3MgYWRkcmVzcyBjaGFuZ2VkLmBcbiAgICAgICAgKyBgXFxuXFxuTWFjaGluZSAke21hY2hpbmVJZH0gaXMgZnJvemVuIGV2ZXJ5d2hlcmUgbm93LCBhbmQgbm90aGluZyBhY2NlcHRzIGNhbGxzIGZyb20gJHttYWNoaW5lSWR9LmBcbiAgICAgICAgKyBgXFxuXFxuSWYgdGhpcyB3YXMgYW4gYXR0YWNrLCByZW1vdmUgXFxgbWFjaGluZXMvJHttYWNoaW5lSWR9Lmpzb25cXGAgZnJvbSBcXGAke3NvdXJjZVVSTH1cXGAgbm93LmBcbiAgICAgICAgKyBgXFxuSWYgdGhlIG5ldyBhZGRyZXNzIGlzIGxlZ2l0aW1hdGUsIHJ1bjpgXG4gICAgICAgICsgYFxcblxcYFxcYFxcYFxcbmNkICR7c291cmNlUmVwb1BhdGgoc291cmNlVVJMKX1cXG55YXJuIHVucmV2b2tlIGdpdFxcblxcYFxcYFxcYGBcbiAgICAgICAgKyBgXFxuVGhlIHVucmV2b2tlIGFsbG93cyAke21hY2hpbmVJZH0gZnJvbSAke2lwfSwgYW5kIHRha2VzIGVmZmVjdCBhcyBlYWNoIG1hY2hpbmUgcGlja3MgaXQgdXAuYFxuICAgICAgICArIGBcXG5cXG5tYWNoaW5lOiBcXGAke21hY2hpbmVJZH1cXGBgXG4gICAgICAgICsgYFxcbmZyb3plbiBieTogXFxgJHtob3N0TGFiZWx9XFxgYFxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgdGFsayB0byB0aGlzIG1hY2hpbmUsIGNvbWluZyBmcm9tIHRoaXMgYWRkcmVzcy5cblxuICAgIEJvdGggaGFsdmVzIGFyZSByZXF1aXJlZCBhbmQgbmVpdGhlciBpcyBhIGd1ZXNzOiB0aGUgY2FsbGVyIGtub3dzIHRoZSBtYWNoaW5lIGlkIGJlY2F1c2UgdGhlXG4gICAgY29ubmVjdGlvbiBwcm92ZWQgaXQsIGFuZCBrbm93cyB0aGUgYWRkcmVzcyBiZWNhdXNlIHRoZSBwYWNrZXRzIGNhbWUgZnJvbSB0aGVyZS4gQSBtYWNoaW5lIHdlXG4gICAgZG8gbm90IGxpc3QgaXMgc2ltcGx5IG5vdCBhY2NlcHRlZC4gQSBtYWNoaW5lIHdlIGRvIGxpc3QsIGFycml2aW5nIGZyb20gYW4gYWRkcmVzcyBpdCBkb2VzIG5vdFxuICAgIGhhdmUsIGlzIHRyZWF0ZWQgYXMgdGhlIHNhbWUga2luZCBvZiBldmVudCBhcyBhIHN0b2xlbiBzc2gga2V5IC0gaXQgaXMgcmV2b2tlZCBldmVyeXdoZXJlLCBhbmRcbiAgICBzdGF5cyByZXZva2VkIHVudGlsIGFuIHVucmV2b2tlIGFsbG93cyB0aGF0IG1hY2hpbmUgZnJvbSB0aGF0IGFkZHJlc3MuXG5cbiAgICBTYXlzIHdoeSB3aGVuIHRoZSBhbnN3ZXIgaXMgbm8sIGJlY2F1c2UgdGhlIHRocmVlIHdheXMgdG8gYmUgcmVmdXNlZCBhcmUgZW50aXJlbHkgZGlmZmVyZW50XG4gICAgdGhpbmdzIHRvIGEgcGVyc29uIHJlYWRpbmcgaXQ6IG5ldmVyIHRydXN0ZWQgYXQgYWxsLCB0cnVzdGVkIGJ1dCBmcm96ZW4sIG9yIHRydXN0ZWQgYW5kIHRhbGtpbmdcbiAgICBmcm9tIHNvbWV3aGVyZSBpdCBzaG91bGQgbm90IGJlLlxuXG4gICAgVGhyb3dzIHdoZW4gdGhlIHJlcG8gaXRzZWxmIGNhbm5vdCBiZSByZWFkIG9yIGlzIG5vdCBzaWduZWQsIHJhdGhlciB0aGFuIGFuc3dlcmluZyBmYWxzZTogdGhhdFxuICAgIGlzIGEgYnJva2VuIGluc3RhbGxhdGlvbiwgbm90IGEgcmVqZWN0ZWQgbWFjaGluZSwgYW5kIHRoZSB0d28gZGVzZXJ2ZSBkaWZmZXJlbnQgaGFuZGxpbmcuICovXG5leHBvcnQgdHlwZSBNYWNoaW5lVmVyZGljdCA9IHsgYWNjZXB0ZWQ6IGJvb2xlYW47IHJlYXNvbjogc3RyaW5nIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc01hY2hpbmVBY2NlcHRlZChjb25maWc6IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIC8vIFVzZWQgZm9yIGxvY2FsIGxvb3BiYWNrIGFjY2VwdGFuY2UsIGFuZCBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICAgIGRvbWFpbj86IHN0cmluZztcbn0pOiBQcm9taXNlPE1hY2hpbmVWZXJkaWN0PiB7XG4gICAgbGV0IHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0gPSBjb25maWc7XG4gICAgaWYgKCFtYWNoaW5lSWQgfHwgIWlwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBtYWNoaW5lSWQgYW5kIGFuIGlwLCB3YXMgJHtKU09OLnN0cmluZ2lmeShtYWNoaW5lSWQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShpcCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHdob2xlIGNoZWNrLCBwbHVzIHdoZXRoZXIgaXQgZnJvemUgdGhlIG1hY2hpbmUuIEEgcmVqZWN0aW9uIHRoYXQgZnJvemUgaXQgaXMgZmluYWwsIHNvXG4gICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBnYWluIGZyb20gbG9va2luZyBhZ2Fpbi4gQW55IG90aGVyIHJlamVjdGlvbiBtaWdodCBqdXN0IGJlIGEgc3RhbGUgdmlldyAtXG4gICAgLy8gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHRoYXQgb3VyIGNhY2hlZCBsaXN0IGhhcyBub3QgY2F1Z2h0IHVwIHRvIC0gc28gaXQgaXMgd29ydGggb25lXG4gICAgLy8gZnJlc2ggbG9vaywgd2hpY2ggaXMgd2hhdCB0aGUgcmV0cnkgYmVsb3cgZG9lcy5cbiAgICBsZXQgZXZhbHVhdGUgPSBhc3luYyAoKTogUHJvbWlzZTx7IHZlcmRpY3Q6IE1hY2hpbmVWZXJkaWN0OyBmcm96ZTogYm9vbGVhbiB9PiA9PiB7XG4gICAgICAgIGlmIChMT09QQkFDSy5pbmNsdWRlcyhpcCkgJiYgISFkb21haW4gJiYgbWFjaGluZUlkID09PSBnZXRPd25NYWNoaW5lSWQoZG9tYWluKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogdHJ1ZSwgcmVhc29uOiBcIlwiIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICAgICAgYXdhaXQgc3luY1Jldm9jYXRpb25zKHNvdXJjZVVSTCk7XG4gICAgICAgIC8vIFRoZSBsaXN0IGhhcyByZXZvY2F0aW9ucyBhbHJlYWR5IGFwcGxpZWQgLSByZWFkU2lnbmVkUmVwbyBkcm9wcyBmcm96ZW4gbWFjaGluZXMgLSBzbyBhXG4gICAgICAgIC8vIG1hY2hpbmUgaW4gaXQgaXMgdHJ1c3RlZCwgYW5kIGEgbWFjaGluZSBtaXNzaW5nIGZyb20gaXQgaXMgZWl0aGVyIHVua25vd24gb3IgZnJvemVuLlxuICAgICAgICBsZXQgbWFjaGluZSA9IChhd2FpdCBnZXRUcnVzdGVkTWFjaGluZXMoKSkuZmluZChlbnRyeSA9PiBlbnRyeS5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCk7XG4gICAgICAgIGlmICghbWFjaGluZSkge1xuICAgICAgICAgICAgbGV0IGZyb3plbiA9IGlkZW50aXR5RnJvemVuQnkobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGlmIChmcm96ZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2ZXJkaWN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIGZyb3plbjogaXQgd2FzIHVzZWQgZnJvbSAke2Zyb3plbi5pcCB8fCBcImFuIGFkZHJlc3Mgbm90aGluZyByZWNvcmRlZFwifWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGAke2Zyb3plbi5yZXZva2VkQXQgJiYgYCwgYXQgJHtmcm96ZW4ucmV2b2tlZEF0fWAgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgJHtmcm96ZW4ucmV2b2tlZEJ5ICYmIGAsIG5vdGljZWQgYnkgJHtmcm96ZW4ucmV2b2tlZEJ5fWAgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgLCB3aGljaCBpcyBub3QgYW4gYWRkcmVzcyBpdCBpcyBhbGxvd2VkIGZyb20gKHJldm9jYXRpb24gJHtmcm96ZW4ucmV2b2NhdGlvbklkfSkuYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYCBUbyBnaXZlIGl0IGFjY2VzcyBhZ2FpbiwgcnVuOiBjZCAke3NvdXJjZVJlcG9QYXRoKHNvdXJjZVVSTCl9ICYmIHlhcm4gdW5yZXZva2UgZ2l0YCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZnJvemU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IHRydXN0ZWQuICR7YWRkTWFjaGluZUNvbW1hbmQoeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSl9YCB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3BiYWNrIGlzIGFsd2F5cyBhbiBhbGxvd2VkIGFkZHJlc3MuIFRoZSBtYWNoaW5lIHN0aWxsIGhhcyB0byBiZSB0cnVzdGVkIC0gYW4gdW5rbm93blxuICAgICAgICAvLyBvciBmcm96ZW4gb25lIHdhcyBhbHJlYWR5IHJlZnVzZWQgYWJvdmUgLSBidXQgbm8gaXAgbGlzdCBjYW4gZGVzY3JpYmUgYSBtYWNoaW5lIHRhbGtpbmdcbiAgICAgICAgLy8gdG8gaXRzZWxmOiBhIG1hY2hpbmUgaXMgbGlzdGVkIHVuZGVyIHRoZSBhZGRyZXNzIG90aGVycyByZWFjaCBpdCBhdCwgbmV2ZXIgMTI3LjAuMC4xLFxuICAgICAgICAvLyBzbyBjaGVja2luZyBsb29wYmFjayBhZ2FpbnN0IHRoYXQgbGlzdCByZWplY3RzIGV2ZXJ5IGxvY2FsIGNhbGwgYW5kIHRoZW4gZnJlZXplcyB0aGVcbiAgICAgICAgLy8gbWFjaGluZSBldmVyeXdoZXJlIGZvciBtYWtpbmcgaXQuXG4gICAgICAgIGlmIChtYWNoaW5lLmlwcy5pbmNsdWRlcyhpcCkgfHwgTE9PUEJBQ0suaW5jbHVkZXMoaXApKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiB0cnVlLCByZWFzb246IFwiXCIgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaXN0ZWQsIGJ1dCB0YWxraW5nIHRvIHVzIGZyb20gc29tZXdoZXJlIGl0IHNob3VsZCBub3QgYmUuIFJlY29yZGVkIG9uY2UgZm9yIHRoaXMgbWFjaGluZVxuICAgICAgICAvLyBhbmQgYWRkcmVzcywgc28gYmVpbmcgdGFsa2VkIHRvIHJlcGVhdGVkbHkgZG9lcyBub3Qgd3JpdGUgcmVwZWF0ZWRseS5cbiAgICAgICAgaWYgKCFpc1BhaXJSZXZva2VkKG1hY2hpbmVJZCwgaXApICYmICFpc1BhaXJVbnJldm9rZWQobWFjaGluZUlkLCBpcCkpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIG1hY2hpbmUgdGhhdCBhY3R1YWxseSB3cm90ZSB0aGUgcmV2b2NhdGlvbiBtYXkgc2F5IGl0IGZyb3plIGFueXRoaW5nLiBPbmVcbiAgICAgICAgICAgIC8vIHRoYXQgY291bGQgbm90IHJlYWNoIHRoZSByZXZva2UgcmVwbyBoYXMgcmVmdXNlZCB0aGlzIGNhbGwgYW5kIG5vdGhpbmcgbW9yZS5cbiAgICAgICAgICAgIGxldCBmcm96ZSA9IGF3YWl0IHJlY29yZE1hY2hpbmVSZXZvY2F0aW9uKHsgc291cmNlVVJMLCBtYWNoaW5lSWQsIGlwLCBob3N0TGFiZWw6IG9zLmhvc3RuYW1lKCkgfSk7XG4gICAgICAgICAgICBsZXQgcmVhc29uID0gZnJvemVcbiAgICAgICAgICAgICAgICAmJiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfSwgYW5kIGlzIG5vdyBmcm96ZW4gZXZlcnl3aGVyZS5gXG4gICAgICAgICAgICAgICAgfHwgYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH0uIEl0IGNvdWxkIG5vdCBiZSBmcm96ZW4sICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfSBjb3VsZCBub3QgYmUgd3JpdHRlbi5gO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogZmFsc2UsIHJlYXNvbiB9LCBmcm96ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBub3QgYWxsb3dlZCBmcm9tICR7aXB9LmAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCB7IHZlcmRpY3QsIGZyb3plIH0gPSBhd2FpdCBldmFsdWF0ZSgpO1xuICAgIC8vIEFuIGFjY2VwdCwgb3IgYSByZWplY3Rpb24gdGhhdCBqdXN0IGZyb3plIHRoZSBtYWNoaW5lLCBpcyB0aGUgZmluYWwgd29yZC4gQW55IG90aGVyIHJlamVjdGlvblxuICAgIC8vIG1pZ2h0IGp1c3QgYmUgYSBzdGFsZSBsaXN0IC0gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHdlIGhhdmUgbm90IGNhdWdodCB1cCB0byAtIHNvIGl0IGlzXG4gICAgLy8gd29ydGggb25lIGZyZXNoIGxvb2suXG4gICAgaWYgKHZlcmRpY3QuYWNjZXB0ZWQgfHwgZnJvemUpIHtcbiAgICAgICAgcmV0dXJuIHZlcmRpY3Q7XG4gICAgfVxuICAgIC8vIFJlLXJlYWQgdGhlIGxpc3QgYXQgbW9zdCBvbmNlIGEgbWludXRlLCBzbyBhIGJ1cnN0IG9mIGJhZCBjYWxsZXJzIGNhbm5vdCBtYWtlIHVzIHJlLXJlYWQgb25cbiAgICAvLyBldmVyeSBvbmUgb2YgdGhlbS4gRm9yY2UgdGhlIGNoZWNrb3V0IGJhY2sgdG8gdGhlIHJlbW90ZSBmaXJzdCwgc28gYSBtYWNoaW5lIGFkZGVkIGFuZCBzaWduZWRcbiAgICAvLyBzZWNvbmRzIGFnbyBpcyBwaWNrZWQgdXAgZXZlbiBpZiB0aGUgY2hlY2tvdXQgd2FzIGxlZnQgZGlydHksIHRoZW4gdGFrZSB0aGUgZnJlc2ggbG9vayBhc1xuICAgIC8vIGZpbmFsLlxuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID4gTUFDSElORVNfSU5WQUxJREFUSU9OX0lOVEVSVkFMKSB7XG4gICAgICAgIGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICAgICAgYXdhaXQgc3luY1JlcG8oc291cmNlVVJMLCB7IGZvcmNlVXBkYXRlOiB0cnVlIH0pLmNhdGNoKGUgPT4gY29uc29sZS5sb2coYENvdWxkIG5vdCBmb3JjZSB1cGRhdGUgJHtzb3VyY2VVUkx9LiAke2V9YCkpO1xuICAgICAgICB0cnVzdGVkTWFjaGluZXMucmVzZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCBldmFsdWF0ZSgpKS52ZXJkaWN0O1xufVxuIl19
|
|
402
|
+
/* _JS_SOURCE_HASH = "c5e62dd10f51942a9c6296e4d6c2784eaf3d3af1705e2e7a1ff3f02c6ccfc2b1"; */
|
|
@@ -87,7 +87,10 @@ async function printRepo(ownIds) {
|
|
|
87
87
|
+ `${revocation.revokedBy && `, noticed by ${revocation.revokedBy}` || ""}${us}`);
|
|
88
88
|
console.log(` ${revocation.revocationId}`);
|
|
89
89
|
}
|
|
90
|
-
if (
|
|
90
|
+
if (frozen.length) {
|
|
91
|
+
console.log(` To give these access again, run in ${repoPath}: yarn unrevoke git`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
91
94
|
console.log(` (nothing is frozen)`);
|
|
92
95
|
}
|
|
93
96
|
let forgiven = revocations.filter(revocation => revocation.forgiven);
|
|
@@ -110,5 +113,5 @@ main().catch(e => {
|
|
|
110
113
|
console.error(`${e}`);
|
|
111
114
|
process.exitCode = 1;
|
|
112
115
|
}).finally(() => process.exit());
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRNYWNoaW5lSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmludE1hY2hpbmVJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUFrRztBQUNsRyx5REFBNkQ7QUFDN0QsNEVBQTBGO0FBQzFGLGtFQUErRTtBQUMvRSx5Q0FBMEM7QUFFMUMsOEZBQThGO0FBQzlGLGdHQUFnRztBQUNoRyw2RUFBNkU7QUFFN0UsS0FBSyxVQUFVLFdBQVc7SUFDdEIsSUFBSSxPQUFPLEdBQUcsSUFBQSwrQkFBdUIsR0FBRSxDQUFDO0lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQy9GLE9BQU87SUFDWCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3QixJQUFJLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDdkIsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUEsc0JBQWMsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxJQUFBLHVCQUFlLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUVELEtBQUssVUFBVSxTQUFTLENBQUMsTUFBZ0I7SUFDckMsSUFBSSxJQUFJLENBQUM7SUFDVCxJQUFJLENBQUM7UUFDRCxJQUFJLEdBQUcsTUFBTSxJQUFBLDBCQUFlLEdBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULE9BQU8sQ0FBQyxHQUFHLENB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QUFDLENBQUM7UUFDaEcsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUMvQyxLQUFLLElBQUksUUFBUSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDTCxDQUFDO0FBRUQsS0FBSyxVQUFVLElBQUk7SUFDZixJQUFJLE1BQU0sR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sU0FBUyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVWX2xpc3RJZGVudGl0eURvbWFpbnMsIGdldE93bk1hY2hpbmVJZCwgbG9hZElkZW50aXR5Q0EgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUtleXNSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2tleXNSZXBvXCI7XG5pbXBvcnQgeyBsaXN0UmV2b2NhdGlvbnMsIHJlYWRTaWduZWRSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZWFkU2lnbmVkUmVwb1wiO1xuaW1wb3J0IHsgcmV2b2tlUmVwbywgc3luY1JlcG9GaWxlcyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBNQUNISU5FU19ESVIgfSBmcm9tIFwiLi9tYWNoaW5lc1wiO1xuXG4vLyBXaG8gdGhpcyBtYWNoaW5lIGlzLCBhbmQgd2hvIGl0IGJlbGlldmVzIGV2ZXJ5b25lIGVsc2UgaXMuIE9uZSBjb21tYW5kLCBiZWNhdXNlIHdvcmtpbmcgb3V0XG4vLyB3aGV0aGVyIGEgbWFjaGluZSBpcyB0cnVzdGVkIG1lYW5zIGhvbGRpbmcgYm90aCBoYWx2ZXMgYXQgb25jZTogb3VyIG93biBpZCB1bmRlciBlYWNoIGRvbWFpbixcbi8vIGFuZCB0aGUgaWRzIHRoZSBzaWduZWQgcmVwbyBsaXN0cyB3aXRoIHRoZSBhZGRyZXNzZXMgZWFjaCBpcyBhbGxvd2VkIGZyb20uXG5cbmFzeW5jIGZ1bmN0aW9uIHByaW50T3duSWRzKCkge1xuICAgIGxldCBkb21haW5zID0gREVWX2xpc3RJZGVudGl0eURvbWFpbnMoKTtcbiAgICBpZiAoIWRvbWFpbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBUaGlzIG1hY2hpbmUgaGFzIG5vIGlkZW50aXRpZXMgeWV0LiBPbmUgaXMgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBpdCBuZWVkcyBvbmUuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFRoaXMgbWFjaGluZTpgKTtcbiAgICBsZXQgaWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGRvbWFpbiBvZiBkb21haW5zKSB7XG4gICAgICAgIGF3YWl0IGxvYWRJZGVudGl0eUNBKGRvbWFpbik7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBnZXRPd25NYWNoaW5lSWQoZG9tYWluKTtcbiAgICAgICAgaWRzLnB1c2gobWFjaGluZUlkKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAke2RvbWFpbn0gJHttYWNoaW5lSWR9YCk7XG4gICAgfVxuICAgIHJldHVybiBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByaW50UmVwbyhvd25JZHM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHJlcG87XG4gICAgdHJ5IHtcbiAgICAgICAgcmVwbyA9IGF3YWl0IHJlc29sdmVLZXlzUmVwbygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbk5vIGtleXMgcmVwbyB0byByZWFkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHNheSBhYm91dCB3aG8gaXMgdHJ1c3RlZC4gJHtlfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSA9IHJlcG87XG4gICAgY29uc29sZS5sb2coYFxcbktleXMgcmVwbyAke3JlcG9QYXRofWApO1xuICAgIGNvbnNvbGUubG9nKGAgICAgZnJvbSAke3NvdXJjZVVSTH1gKTtcblxuICAgIC8vIFB1bGxlZCBmaXJzdCwgb3IgYSByZXZvY2F0aW9uIGFub3RoZXIgbWFjaGluZSB3cm90ZSBtaW51dGVzIGFnbyBpcyBtaXNzaW5nIGZyb20gYSBwaWN0dXJlXG4gICAgLy8gd2hvc2Ugd2hvbGUgcHVycG9zZSBpcyB0byBleHBsYWluIHdoeSBzb21ldGhpbmcgaXMgYmVpbmcgcmVmdXNlZC5cbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzeW5jUmVwb0ZpbGVzKHJldm9rZVJlcG8oc291cmNlVVJMKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgIENvdWxkIG5vdCBwdWxsIHRoZSByZXZvY2F0aW9ucywgc2hvd2luZyB0aGUgb25lcyBhbHJlYWR5IGhlcmUuICR7ZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgZmlsZXM7XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZXMgPSAoYXdhaXQgcmVhZFNpZ25lZFJlcG8oeyByZXBvUGF0aCwgc291cmNlVVJMIH0pKS5maWxlcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG5JdHMgc2lnbmF0dXJlIGRvZXMgbm90IGNoZWNrIG91dCwgc28gbm90aGluZyBpbiBpdCBjb3VudHMuICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdGhlIG1hY2hpbmUgZmlsZXMgdGhlIHNpZ25hdHVyZSBjb3ZlcnMgLSByZWFkU2lnbmVkUmVwbyBoYXMgYWxyZWFkeSBkcm9wcGVkIGFueXRoaW5nXG4gICAgLy8gdW5zaWduZWQgb3IgZnJvemVuLCBzbyB0aGlzIGlzIHRoZSBsaXN0IHRoaXMgbWFjaGluZSB3b3VsZCBhY3R1YWxseSBhY2NlcHQuXG4gICAgbGV0IG1hY2hpbmVzOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcHM6IHN0cmluZ1tdIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IFtmaWxlUGF0aCwgY29udGVudHNdIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGguc3RhcnRzV2l0aChgJHtNQUNISU5FU19ESVJ9L2ApIHx8ICFmaWxlUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgICAgIG1hY2hpbmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1hY2hpbmVJZDogcGFyc2VkLm1hY2hpbmVJZCB8fCBmaWxlUGF0aC5zbGljZShNQUNISU5FU19ESVIubGVuZ3RoICsgMSwgLVwiLmpzb25cIi5sZW5ndGgpLFxuICAgICAgICAgICAgICAgIGlwczogcGFyc2VkLmlwcyB8fCBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIElnbm9yaW5nIHVucmVhZGFibGUgJHtmaWxlUGF0aH0uICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG5UcnVzdGVkIG1hY2hpbmVzICgke21hY2hpbmVzLmxlbmd0aH0pLCBhbmQgdGhlIGFkZHJlc3NlcyBlYWNoIG1heSB0YWxrIGZyb206YCk7XG4gICAgZm9yIChsZXQgbWFjaGluZSBvZiBtYWNoaW5lcykge1xuICAgICAgICBsZXQgdXMgPSBvd25JZHMuaW5jbHVkZXMobWFjaGluZS5tYWNoaW5lSWQpICYmIFwiICA8LSB0aGlzIG1hY2hpbmVcIiB8fCBcIlwiO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7bWFjaGluZS5tYWNoaW5lSWR9ICAke21hY2hpbmUuaXBzLmpvaW4oXCIsIFwiKSB8fCBcIihubyBhZGRyZXNzZXMsIHNvIGl0IGlzIG5ldmVyIGFjY2VwdGVkKVwifSR7dXN9YCk7XG4gICAgfVxuXG4gICAgLy8gRnJvemVuIG1hY2hpbmVzIGFyZSBhbHJlYWR5IGdvbmUgZnJvbSB0aGUgbGlzdCBhYm92ZSwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhleSBoYXZlIHRvIGJlXG4gICAgLy8gbmFtZWQgaGVyZSAtIG90aGVyd2lzZSBhIG1hY2hpbmUgYmVpbmcgcmVmdXNlZCBldmVyeXdoZXJlIHNpbXBseSBpcyBub3QgbWVudGlvbmVkIGFueXdoZXJlLlxuICAgIGxldCByZXZvY2F0aW9ucyA9IGxpc3RSZXZvY2F0aW9ucygpO1xuICAgIGxldCBmcm96ZW4gPSByZXZvY2F0aW9ucy5maWx0ZXIocmV2b2NhdGlvbiA9PiAhcmV2b2NhdGlvbi5mb3JnaXZlbik7XG4gICAgY29uc29sZS5sb2coYFxcbkZyb3plbiAoJHtmcm96ZW4ubGVuZ3RofSksIHJlZnVzZWQgZXZlcnl3aGVyZSB1bnRpbCB1bnJldm9rZWQ6YCk7XG4gICAgZm9yIChsZXQgcmV2b2NhdGlvbiBvZiBmcm96ZW4pIHtcbiAgICAgICAgbGV0IHVzID0gb3duSWRzLmluY2x1ZGVzKHJldm9jYXRpb24uaWRlbnRpdHkpICYmIFwiICA8LSB0aGlzIG1hY2hpbmVcIiB8fCBcIlwiO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7cmV2b2NhdGlvbi5pZGVudGl0eX0gIHVzZWQgZnJvbSAke3Jldm9jYXRpb24uaXAgfHwgXCJhbiB1bnJlY29yZGVkIGFkZHJlc3NcIn1gXG4gICAgICAgICAgICArIGAke3Jldm9jYXRpb24ucmV2b2tlZEF0ICYmIGAgYXQgJHtyZXZvY2F0aW9uLnJldm9rZWRBdH1gIHx8IFwiXCJ9YFxuICAgICAgICAgICAgKyBgJHtyZXZvY2F0aW9uLnJldm9rZWRCeSAmJiBgLCBub3RpY2VkIGJ5ICR7cmV2b2NhdGlvbi5yZXZva2VkQnl9YCB8fCBcIlwifSR7dXN9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAgICR7cmV2b2NhdGlvbi5yZXZvY2F0aW9uSWR9YCk7XG4gICAgfVxuICAgIGlmICghZnJvemVuLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgIChub3RoaW5nIGlzIGZyb3plbilgKTtcbiAgICB9XG5cbiAgICBsZXQgZm9yZ2l2ZW4gPSByZXZvY2F0aW9ucy5maWx0ZXIocmV2b2NhdGlvbiA9PiByZXZvY2F0aW9uLmZvcmdpdmVuKTtcbiAgICBpZiAoZm9yZ2l2ZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG5SZXZva2VkLCB0aGVuIGFsbG93ZWQgYWdhaW4gKCR7Zm9yZ2l2ZW4ubGVuZ3RofSk6YCk7XG4gICAgICAgIGZvciAobGV0IHJldm9jYXRpb24gb2YgZm9yZ2l2ZW4pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtyZXZvY2F0aW9uLmlkZW50aXR5fSAgZnJvbSAke3Jldm9jYXRpb24uaXAgfHwgXCJhbiB1bnJlY29yZGVkIGFkZHJlc3NcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG5TaWduZWQgZmlsZXMgKCR7ZmlsZXMuc2l6ZX0pOmApO1xuICAgIGZvciAobGV0IGZpbGVQYXRoIG9mIFsuLi5maWxlcy5rZXlzKCldLnNvcnQoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIGxldCBvd25JZHMgPSBhd2FpdCBwcmludE93bklkcygpO1xuICAgIGF3YWl0IHByaW50UmVwbyhvd25JZHMgfHwgW10pO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlfWApO1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xufSkuZmluYWxseSgoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG4iXX0//=
|
|
114
|
-
/* _JS_SOURCE_HASH = "
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRNYWNoaW5lSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmludE1hY2hpbmVJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUFrRztBQUNsRyx5REFBNkQ7QUFDN0QsNEVBQTBGO0FBQzFGLGtFQUErRTtBQUMvRSx5Q0FBMEM7QUFFMUMsOEZBQThGO0FBQzlGLGdHQUFnRztBQUNoRyw2RUFBNkU7QUFFN0UsS0FBSyxVQUFVLFdBQVc7SUFDdEIsSUFBSSxPQUFPLEdBQUcsSUFBQSwrQkFBdUIsR0FBRSxDQUFDO0lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQy9GLE9BQU87SUFDWCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3QixJQUFJLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDdkIsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUEsc0JBQWMsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxJQUFBLHVCQUFlLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUVELEtBQUssVUFBVSxTQUFTLENBQUMsTUFBZ0I7SUFDckMsSUFBSSxJQUFJLENBQUM7SUFDVCxJQUFJLENBQUM7UUFDRCxJQUFJLEdBQUcsTUFBTSxJQUFBLDBCQUFlLEdBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULE9BQU8sQ0FBQyxHQUFHLENB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QyxHQUFHLENBQUMsT0FBTyxVQUFVLENBQUMsUUFBUSxVQUFVLFVBQVUsQ0FBQyxFQUFFLElBQUksdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDL0MsS0FBSyxJQUFJLFFBQVEsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxJQUFJO0lBQ2YsSUFBSSxNQUFNLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQztJQUNqQyxNQUFNLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERFVl9saXN0SWRlbnRpdHlEb21haW5zLCBnZXRPd25NYWNoaW5lSWQsIGxvYWRJZGVudGl0eUNBIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcbmltcG9ydCB7IHJlc29sdmVLZXlzUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9rZXlzUmVwb1wiO1xuaW1wb3J0IHsgbGlzdFJldm9jYXRpb25zLCByZWFkU2lnbmVkUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVhZFNpZ25lZFJlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG8sIHN5bmNSZXBvRmlsZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgTUFDSElORVNfRElSIH0gZnJvbSBcIi4vbWFjaGluZXNcIjtcblxuLy8gV2hvIHRoaXMgbWFjaGluZSBpcywgYW5kIHdobyBpdCBiZWxpZXZlcyBldmVyeW9uZSBlbHNlIGlzLiBPbmUgY29tbWFuZCwgYmVjYXVzZSB3b3JraW5nIG91dFxuLy8gd2hldGhlciBhIG1hY2hpbmUgaXMgdHJ1c3RlZCBtZWFucyBob2xkaW5nIGJvdGggaGFsdmVzIGF0IG9uY2U6IG91ciBvd24gaWQgdW5kZXIgZWFjaCBkb21haW4sXG4vLyBhbmQgdGhlIGlkcyB0aGUgc2lnbmVkIHJlcG8gbGlzdHMgd2l0aCB0aGUgYWRkcmVzc2VzIGVhY2ggaXMgYWxsb3dlZCBmcm9tLlxuXG5hc3luYyBmdW5jdGlvbiBwcmludE93bklkcygpIHtcbiAgICBsZXQgZG9tYWlucyA9IERFVl9saXN0SWRlbnRpdHlEb21haW5zKCk7XG4gICAgaWYgKCFkb21haW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgVGhpcyBtYWNoaW5lIGhhcyBubyBpZGVudGl0aWVzIHlldC4gT25lIGlzIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgaXQgbmVlZHMgb25lLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBUaGlzIG1hY2hpbmU6YCk7XG4gICAgbGV0IGlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBkb21haW4gb2YgZG9tYWlucykge1xuICAgICAgICBhd2FpdCBsb2FkSWRlbnRpdHlDQShkb21haW4pO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0T3duTWFjaGluZUlkKGRvbWFpbik7XG4gICAgICAgIGlkcy5wdXNoKG1hY2hpbmVJZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtkb21haW59ICR7bWFjaGluZUlkfWApO1xuICAgIH1cbiAgICByZXR1cm4gaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcmludFJlcG8ob3duSWRzOiBzdHJpbmdbXSkge1xuICAgIGxldCByZXBvO1xuICAgIHRyeSB7XG4gICAgICAgIHJlcG8gPSBhd2FpdCByZXNvbHZlS2V5c1JlcG8oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG5ObyBrZXlzIHJlcG8gdG8gcmVhZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byBzYXkgYWJvdXQgd2hvIGlzIHRydXN0ZWQuICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgeyByZXBvUGF0aCwgc291cmNlVVJMIH0gPSByZXBvO1xuICAgIGNvbnNvbGUubG9nKGBcXG5LZXlzIHJlcG8gJHtyZXBvUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICAgIGZyb20gJHtzb3VyY2VVUkx9YCk7XG5cbiAgICAvLyBQdWxsZWQgZmlyc3QsIG9yIGEgcmV2b2NhdGlvbiBhbm90aGVyIG1hY2hpbmUgd3JvdGUgbWludXRlcyBhZ28gaXMgbWlzc2luZyBmcm9tIGEgcGljdHVyZVxuICAgIC8vIHdob3NlIHdob2xlIHB1cnBvc2UgaXMgdG8gZXhwbGFpbiB3aHkgc29tZXRoaW5nIGlzIGJlaW5nIHJlZnVzZWQuXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3luY1JlcG9GaWxlcyhyZXZva2VSZXBvKHNvdXJjZVVSTCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgICBDb3VsZCBub3QgcHVsbCB0aGUgcmV2b2NhdGlvbnMsIHNob3dpbmcgdGhlIG9uZXMgYWxyZWFkeSBoZXJlLiAke2V9YCk7XG4gICAgfVxuXG4gICAgbGV0IGZpbGVzO1xuICAgIHRyeSB7XG4gICAgICAgIGZpbGVzID0gKGF3YWl0IHJlYWRTaWduZWRSZXBvKHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9KSkuZmlsZXM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuSXRzIHNpZ25hdHVyZSBkb2VzIG5vdCBjaGVjayBvdXQsIHNvIG5vdGhpbmcgaW4gaXQgY291bnRzLiAke2V9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHRoZSBtYWNoaW5lIGZpbGVzIHRoZSBzaWduYXR1cmUgY292ZXJzIC0gcmVhZFNpZ25lZFJlcG8gaGFzIGFscmVhZHkgZHJvcHBlZCBhbnl0aGluZ1xuICAgIC8vIHVuc2lnbmVkIG9yIGZyb3plbiwgc28gdGhpcyBpcyB0aGUgbGlzdCB0aGlzIG1hY2hpbmUgd291bGQgYWN0dWFsbHkgYWNjZXB0LlxuICAgIGxldCBtYWNoaW5lczogeyBtYWNoaW5lSWQ6IHN0cmluZzsgaXBzOiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBbZmlsZVBhdGgsIGNvbnRlbnRzXSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIWZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7TUFDSElORVNfRElSfS9gKSB8fCAhZmlsZVBhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgICAgICBtYWNoaW5lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtYWNoaW5lSWQ6IHBhcnNlZC5tYWNoaW5lSWQgfHwgZmlsZVBhdGguc2xpY2UoTUFDSElORVNfRElSLmxlbmd0aCArIDEsIC1cIi5qc29uXCIubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICBpcHM6IHBhcnNlZC5pcHMgfHwgW10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICBJZ25vcmluZyB1bnJlYWRhYmxlICR7ZmlsZVBhdGh9LiAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgXFxuVHJ1c3RlZCBtYWNoaW5lcyAoJHttYWNoaW5lcy5sZW5ndGh9KSwgYW5kIHRoZSBhZGRyZXNzZXMgZWFjaCBtYXkgdGFsayBmcm9tOmApO1xuICAgIGZvciAobGV0IG1hY2hpbmUgb2YgbWFjaGluZXMpIHtcbiAgICAgICAgbGV0IHVzID0gb3duSWRzLmluY2x1ZGVzKG1hY2hpbmUubWFjaGluZUlkKSAmJiBcIiAgPC0gdGhpcyBtYWNoaW5lXCIgfHwgXCJcIjtcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAke21hY2hpbmUubWFjaGluZUlkfSAgJHttYWNoaW5lLmlwcy5qb2luKFwiLCBcIikgfHwgXCIobm8gYWRkcmVzc2VzLCBzbyBpdCBpcyBuZXZlciBhY2NlcHRlZClcIn0ke3VzfWApO1xuICAgIH1cblxuICAgIC8vIEZyb3plbiBtYWNoaW5lcyBhcmUgYWxyZWFkeSBnb25lIGZyb20gdGhlIGxpc3QgYWJvdmUsIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZXkgaGF2ZSB0byBiZVxuICAgIC8vIG5hbWVkIGhlcmUgLSBvdGhlcndpc2UgYSBtYWNoaW5lIGJlaW5nIHJlZnVzZWQgZXZlcnl3aGVyZSBzaW1wbHkgaXMgbm90IG1lbnRpb25lZCBhbnl3aGVyZS5cbiAgICBsZXQgcmV2b2NhdGlvbnMgPSBsaXN0UmV2b2NhdGlvbnMoKTtcbiAgICBsZXQgZnJvemVuID0gcmV2b2NhdGlvbnMuZmlsdGVyKHJldm9jYXRpb24gPT4gIXJldm9jYXRpb24uZm9yZ2l2ZW4pO1xuICAgIGNvbnNvbGUubG9nKGBcXG5Gcm96ZW4gKCR7ZnJvemVuLmxlbmd0aH0pLCByZWZ1c2VkIGV2ZXJ5d2hlcmUgdW50aWwgdW5yZXZva2VkOmApO1xuICAgIGZvciAobGV0IHJldm9jYXRpb24gb2YgZnJvemVuKSB7XG4gICAgICAgIGxldCB1cyA9IG93bklkcy5pbmNsdWRlcyhyZXZvY2F0aW9uLmlkZW50aXR5KSAmJiBcIiAgPC0gdGhpcyBtYWNoaW5lXCIgfHwgXCJcIjtcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAke3Jldm9jYXRpb24uaWRlbnRpdHl9ICB1c2VkIGZyb20gJHtyZXZvY2F0aW9uLmlwIHx8IFwiYW4gdW5yZWNvcmRlZCBhZGRyZXNzXCJ9YFxuICAgICAgICAgICAgKyBgJHtyZXZvY2F0aW9uLnJldm9rZWRBdCAmJiBgIGF0ICR7cmV2b2NhdGlvbi5yZXZva2VkQXR9YCB8fCBcIlwifWBcbiAgICAgICAgICAgICsgYCR7cmV2b2NhdGlvbi5yZXZva2VkQnkgJiYgYCwgbm90aWNlZCBieSAke3Jldm9jYXRpb24ucmV2b2tlZEJ5fWAgfHwgXCJcIn0ke3VzfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgICAke3Jldm9jYXRpb24ucmV2b2NhdGlvbklkfWApO1xuICAgIH1cbiAgICBpZiAoZnJvemVuLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgIFRvIGdpdmUgdGhlc2UgYWNjZXNzIGFnYWluLCBydW4gaW4gJHtyZXBvUGF0aH06IHlhcm4gdW5yZXZva2UgZ2l0YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAobm90aGluZyBpcyBmcm96ZW4pYCk7XG4gICAgfVxuXG4gICAgbGV0IGZvcmdpdmVuID0gcmV2b2NhdGlvbnMuZmlsdGVyKHJldm9jYXRpb24gPT4gcmV2b2NhdGlvbi5mb3JnaXZlbik7XG4gICAgaWYgKGZvcmdpdmVuLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuUmV2b2tlZCwgdGhlbiBhbGxvd2VkIGFnYWluICgke2ZvcmdpdmVuLmxlbmd0aH0pOmApO1xuICAgICAgICBmb3IgKGxldCByZXZvY2F0aW9uIG9mIGZvcmdpdmVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7cmV2b2NhdGlvbi5pZGVudGl0eX0gIGZyb20gJHtyZXZvY2F0aW9uLmlwIHx8IFwiYW4gdW5yZWNvcmRlZCBhZGRyZXNzXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgXFxuU2lnbmVkIGZpbGVzICgke2ZpbGVzLnNpemV9KTpgKTtcbiAgICBmb3IgKGxldCBmaWxlUGF0aCBvZiBbLi4uZmlsZXMua2V5cygpXS5zb3J0KCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAke2ZpbGVQYXRofWApO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgICBsZXQgb3duSWRzID0gYXdhaXQgcHJpbnRPd25JZHMoKTtcbiAgICBhd2FpdCBwcmludFJlcG8ob3duSWRzIHx8IFtdKTtcbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7ZX1gKTtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbn0pLmZpbmFsbHkoKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xuIl1//9
|
|
117
|
+
/* _JS_SOURCE_HASH = "76e90f977b9bdad196767fcf9f8b95a2d05c1f2605687d9b9baae28db11b2f88"; */
|
|
@@ -8,6 +8,7 @@ import { runGit, syncRepo } from "../authorizedKeys/daemon/git";
|
|
|
8
8
|
import { ensureRevokeKey } from "../authorizedKeys/daemon/repoFiles";
|
|
9
9
|
import { identityFrozenBy, isPairRevoked, isPairUnrevoked, noteRevocation, readSignedRepo } from "../authorizedKeys/daemon/readSignedRepo";
|
|
10
10
|
import { revokeRepoPath, revokeRepoURL } from "../authorizedKeys/revokeSource";
|
|
11
|
+
import { sourceRepoPath } from "../authorizedKeys/sources";
|
|
11
12
|
import { notify } from "../authorizedKeys/daemon/notify";
|
|
12
13
|
import { areDiscordNotificationsConfigured, configureDiscordNotifications, DEFAULT_WEBHOOK_FILE_PATH } from "../notifications/discord";
|
|
13
14
|
import { DEV_getIdentityFilePath, generateCA, getMachineId, getOwnMachineId, IdentityStorageType } from "../../misc/https/certs";
|
|
@@ -338,8 +339,9 @@ async function recordMachineRevocation(config: {
|
|
|
338
339
|
+ ` else has a copy of the key, or the machine's address changed.`
|
|
339
340
|
+ `\n\nMachine ${machineId} is frozen everywhere now, and nothing accepts calls from ${machineId}.`
|
|
340
341
|
+ `\n\nIf this was an attack, remove \`machines/${machineId}.json\` from \`${sourceURL}\` now.`
|
|
341
|
-
+ `\nIf the new address is legitimate, run
|
|
342
|
-
+
|
|
342
|
+
+ `\nIf the new address is legitimate, run:`
|
|
343
|
+
+ `\n\`\`\`\ncd ${sourceRepoPath(sourceURL)}\nyarn unrevoke git\n\`\`\``
|
|
344
|
+
+ `\nThe unrevoke allows ${machineId} from ${ip}, and takes effect as each machine picks it up.`
|
|
343
345
|
+ `\n\nmachine: \`${machineId}\``
|
|
344
346
|
+ `\nfrozen by: \`${hostLabel}\``
|
|
345
347
|
);
|
|
@@ -397,7 +399,7 @@ export async function isMachineAccepted(config: {
|
|
|
397
399
|
+ `${frozen.revokedAt && `, at ${frozen.revokedAt}` || ""}`
|
|
398
400
|
+ `${frozen.revokedBy && `, noticed by ${frozen.revokedBy}` || ""}`
|
|
399
401
|
+ `, which is not an address it is allowed from (revocation ${frozen.revocationId}).`
|
|
400
|
-
+ ` To give it access again, run
|
|
402
|
+
+ ` To give it access again, run: cd ${sourceRepoPath(sourceURL)} && yarn unrevoke git`,
|
|
401
403
|
},
|
|
402
404
|
froze: false,
|
|
403
405
|
};
|
|
@@ -405,7 +407,12 @@ export async function isMachineAccepted(config: {
|
|
|
405
407
|
return { verdict: { accepted: false, reason: `Machine ${machineId} is not trusted. ${addMachineCommand({ machineId, ip, domain })}` }, froze: false };
|
|
406
408
|
}
|
|
407
409
|
|
|
408
|
-
|
|
410
|
+
// Loopback is always an allowed address. The machine still has to be trusted - an unknown
|
|
411
|
+
// or frozen one was already refused above - but no ip list can describe a machine talking
|
|
412
|
+
// to itself: a machine is listed under the address others reach it at, never 127.0.0.1,
|
|
413
|
+
// so checking loopback against that list rejects every local call and then freezes the
|
|
414
|
+
// machine everywhere for making it.
|
|
415
|
+
if (machine.ips.includes(ip) || LOOPBACK.includes(ip)) {
|
|
409
416
|
return { verdict: { accepted: true, reason: "" }, froze: false };
|
|
410
417
|
}
|
|
411
418
|
|
|
@@ -90,7 +90,8 @@ async function printRepo(ownIds: string[]) {
|
|
|
90
90
|
console.log(` ${revocation.revocationId}`);
|
|
91
91
|
}
|
|
92
92
|
if (frozen.length) {
|
|
93
|
-
console.log(` To give these access again, run
|
|
93
|
+
console.log(` To give these access again, run:`);
|
|
94
|
+
console.log(`\`\`\`\ncd ${repoPath}\nyarn unrevoke git\n\`\`\``);
|
|
94
95
|
} else {
|
|
95
96
|
console.log(` (nothing is frozen)`);
|
|
96
97
|
}
|
|
@@ -32,7 +32,8 @@ async function main() {
|
|
|
32
32
|
await signRepo({ repoPath, keyPath });
|
|
33
33
|
|
|
34
34
|
if (!pushToGit) {
|
|
35
|
-
console.log(`Commit and push ${MANIFEST_NAME} and ${SIGNATURE_NAME} for anything to see them
|
|
35
|
+
console.log(`Commit and push ${MANIFEST_NAME} and ${SIGNATURE_NAME} for anything to see them:`);
|
|
36
|
+
console.log(`\`\`\`\ncd ${repoPath}\ngit add -A\ngit commit -m "${COMMIT_MESSAGE}"\ngit push\n\`\`\``);
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
39
|
await runPromise(`git add -A`, { cwd: repoPath });
|