sliftutils 1.7.150 → 1.8.0
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/package.json
CHANGED
|
@@ -269,6 +269,17 @@ async function notifyBestEffort(headline, body) {
|
|
|
269
269
|
does not cover it. */
|
|
270
270
|
async function recordMachineRevocation(config) {
|
|
271
271
|
let { sourceURL, machineId, ip, hostLabel } = config;
|
|
272
|
+
// Clones it if it is not here yet, which is the usual state of a machine that has never had to
|
|
273
|
+
// revoke anything. Without this the mkdir below would build the directory anyway and git would
|
|
274
|
+
// then be run somewhere that is not a checkout, so the revocation was written where nothing
|
|
275
|
+
// would ever read it.
|
|
276
|
+
try {
|
|
277
|
+
await (0, repoFiles_1.syncRepoFiles)((0, repoFiles_1.revokeRepo)(sourceURL));
|
|
278
|
+
}
|
|
279
|
+
catch (e) {
|
|
280
|
+
console.error(`Cannot record the revocation of ${machineId}, ${(0, revokeSource_1.revokeRepoURL)(sourceURL)} could not be read. ${e}`);
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
272
283
|
let repoPath = (0, revokeSource_1.revokeRepoPath)(sourceURL);
|
|
273
284
|
let keyPath = await (0, repoFiles_2.ensureRevokeKey)(sourceURL);
|
|
274
285
|
let revocationId = (0, revocation_1.newRevocationId)(machineId);
|
|
@@ -291,7 +302,7 @@ async function recordMachineRevocation(config) {
|
|
|
291
302
|
if (push.status !== 0) {
|
|
292
303
|
// Another machine most likely recorded the same thing first, and the next read picks it up.
|
|
293
304
|
console.log(`Could not push the revocation of ${machineId} from ${ip}. ${(push.stdout + push.stderr).trim()}`);
|
|
294
|
-
return;
|
|
305
|
+
return false;
|
|
295
306
|
}
|
|
296
307
|
(0, readSignedRepo_1.noteRevocation)(revocationId, machineId, ip);
|
|
297
308
|
console.log(`Revoked ${machineId} from ${ip}, ${revocationId}`);
|
|
@@ -306,6 +317,7 @@ async function recordMachineRevocation(config) {
|
|
|
306
317
|
+ ` unrevoke allows ${machineId} from ${ip}, and takes effect as each machine picks it up.`
|
|
307
318
|
+ `\n\nmachine: \`${machineId}\``
|
|
308
319
|
+ `\nfrozen by: \`${hostLabel}\``);
|
|
320
|
+
return true;
|
|
309
321
|
}
|
|
310
322
|
async function isMachineAccepted(config) {
|
|
311
323
|
let { machineId, ip, domain } = config;
|
|
@@ -337,8 +349,13 @@ async function isMachineAccepted(config) {
|
|
|
337
349
|
// Listed, but talking to us from somewhere it should not be. Recorded once for this machine
|
|
338
350
|
// and address, so being talked to repeatedly does not write repeatedly.
|
|
339
351
|
if (!(0, readSignedRepo_1.isPairRevoked)(machineId, ip) && !(0, readSignedRepo_1.isPairUnrevoked)(machineId, ip)) {
|
|
340
|
-
|
|
341
|
-
|
|
352
|
+
// Only the machine that actually wrote the revocation may say it froze anything. One
|
|
353
|
+
// that could not reach the revoke repo has refused this call and nothing more.
|
|
354
|
+
let froze = await recordMachineRevocation({ sourceURL, machineId, ip, hostLabel: os_1.default.hostname() });
|
|
355
|
+
let reason = froze
|
|
356
|
+
&& `Machine ${machineId} is not allowed from ${ip}, and is now frozen everywhere.`
|
|
357
|
+
|| `Machine ${machineId} is not allowed from ${ip}. It could not be frozen, ${(0, revokeSource_1.revokeRepoURL)(sourceURL)} could not be written.`;
|
|
358
|
+
return { verdict: { accepted: false, reason }, froze };
|
|
342
359
|
}
|
|
343
360
|
return { verdict: { accepted: false, reason: `Machine ${machineId} is not allowed from ${ip}.` }, froze: false };
|
|
344
361
|
};
|
|
@@ -362,5 +379,5 @@ async function isMachineAccepted(config) {
|
|
|
362
379
|
return (await evaluate()).verdict;
|
|
363
380
|
}
|
|
364
381
|
exports.isMachineAccepted = isMachineAccepted;
|
|
365
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLG9FQUFzRTtBQUN0RSxzREFBZ0U7QUFDaEUsa0VBQXFFO0FBQ3JFLDRFQUEySTtBQUMzSSxpRUFBK0U7QUFDL0UsNERBQXlEO0FBQ3pELHNEQUF1STtBQUN2SSxrREFBaUk7QUFDakksb0RBQWlGO0FBQ2pGLHlEQUFtRDtBQUNuRCwyREFBK0Q7QUFHL0QsbUdBQW1HO0FBQ25HLGlHQUFpRztBQUNqRyxnRUFBZ0U7QUFDbkQsUUFBQSxZQUFZLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxNQUFNLGlCQUFpQixHQUFHLDhDQUE4QyxDQUFDO0FBQ3pFLGdHQUFnRztBQUNoRyxtQ0FBbUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLDZGQUE2RjtBQUM3RixpR0FBaUc7QUFDakcsa0VBQWtFO0FBQ2xFLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxnR0FBZ0c7QUFDaEcsaUdBQWlHO0FBQ2pHLDBEQUEwRDtBQUMxRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDMUQsZ0dBQWdHO0FBQ2hHLGdHQUFnRztBQUNoRyxNQUFNLDhCQUE4QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDakQsSUFBSSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFTakMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxN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LDhDQThEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMva2V5c1JlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG8sIHN5bmNSZXBvRmlsZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgbmV3UmV2b2NhdGlvbklkIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZXZvY2F0aW9uXCI7XG5pbXBvcnQgeyBydW5HaXQsIHN5bmNSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9naXRcIjtcbmltcG9ydCB7IGVuc3VyZVJldm9rZUtleSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBpc0lkZW50aXR5RnJvemVuLCBpc1BhaXJSZXZva2VkLCBpc1BhaXJVbnJldm9rZWQsIG5vdGVSZXZvY2F0aW9uLCByZWFkU2lnbmVkUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVhZFNpZ25lZFJlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG9QYXRoLCByZXZva2VSZXBvVVJMIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgbm90aWZ5IH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9ub3RpZnlcIjtcbmltcG9ydCB7IGFyZURpc2NvcmROb3RpZmljYXRpb25zQ29uZmlndXJlZCwgY29uZmlndXJlRGlzY29yZE5vdGlmaWNhdGlvbnMsIERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSBmcm9tIFwiLi4vbm90aWZpY2F0aW9ucy9kaXNjb3JkXCI7XG5pbXBvcnQgeyBERVZfZ2V0SWRlbnRpdHlGaWxlUGF0aCwgZ2VuZXJhdGVDQSwgZ2V0TWFjaGluZUlkLCBnZXRPd25NYWNoaW5lSWQsIElkZW50aXR5U3RvcmFnZVR5cGUgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgZGVzY3JpYmVIb3N0LCBydW5PdmVyU1NILCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgc3Bhd25Qcm9taXNlIH0gZnJvbSBcIi4uL2hlbHBlcnMvc3Bhd25cIjtcblxuLy8gV2hpY2ggbWFjaGluZXMgdGhpcyBzeXN0ZW0gdGFsa3MgdG8sIGtlcHQgaW4gdGhlIHNhbWUgcmVwbyBhcyB0aGUgc3NoIGtleXMuIFRoYXQgcmVwbyBpcyBhbHJlYWR5XG4vLyBzaWduZWQsIGFscmVhZHkgZGlzdHJpYnV0ZWQgdG8gZXZlcnkgbWFjaGluZSwgYW5kIGFscmVhZHkgaGFzIHNvbWV3aGVyZSB0byByZWNvcmQgYSByZWplY3Rpb24sXG4vLyBzbyBhIHNlY29uZCBvbmUgd291bGQgb25seSBiZSBhIHNlY29uZCB0aGluZyB0byBrZWVwIGluIHN0ZXAuXG5leHBvcnQgY29uc3QgTUFDSElORVNfRElSID0gXCJtYWNoaW5lc1wiO1xuY29uc3QgUkVWT0NBVElPTlNfRElSID0gXCJyZXZvY2F0aW9uc1wiO1xuY29uc3QgUkVWT0NBVElPTl9SRUFTT04gPSBcImEgbWFjaGluZSB0YWxrZWQgdG8gdXMgZnJvbSBhbiB1bmFwcHJvdmVkIElQXCI7XG4vLyBUaGUgcmV2b2tlIHJlcG8gaXMgcHVsbGVkIGF0IG1vc3QgdGhpcyBvZnRlbi4gQSBjaGVjayBoYXBwZW5zIHBlciByZXF1ZXN0LCBhbmQgYSByZXF1ZXN0IG11c3Rcbi8vIG5vdCBjb3N0IGEgcm91bmQgdHJpcCB0byBnaXRodWIuXG5jb25zdCBSRVZPS0VfU1lOQ19JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIEFuZCB0aGUgbWFjaGluZSBsaXN0IGlzIHJlLXJlYWQgZnJvbSB0aGUgY2hlY2tvdXQgb24gdGhpcyBpbnRlcnZhbCwgaW4gdGhlIGJhY2tncm91bmQuIFRoZVxuLy8gY2hlY2tvdXQgaXRzZWxmIG9ubHkgbW92ZXMgd2hlbiB0aGUgZGFlbW9uIHB1bGxzIGl0LCB3aGljaCBpcyBvbiB0aGUgc2FtZSBzb3J0IG9mIGludGVydmFsLCBzb1xuLy8gcmVhZGluZyBtb3JlIG9mdGVuIHRoYW4gdGhpcyB3b3VsZCBvbmx5IHJlLXJlYWQgdGhlIHNhbWUgYnl0ZXMuXG5jb25zdCBNQUNISU5FU19SRUZSRVNIX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gSG93IGxvbmcgYSBmYWlsdXJlIHRvIGZpbmQgdGhlIGtleXMgcmVwbyBpcyByZW1lbWJlcmVkLiBBIGxvbmcgbGl2ZWQgcHJvY2VzcyBtYXkgc3RhcnQgYmVmb3JlXG4vLyB0aGUgbWFjaGluZSBpcyBzZXQgdXAsIGFuZCBzaG91bGQgcGljayBpdCB1cCBvbmNlIGl0IGlzLCB3aXRob3V0IGJlaW5nIHJlc3RhcnRlZCAtIGJ1dCBpdCBtdXN0XG4vLyBub3QgcGF5IGZvciByZXNvbHZpbmcgdGhlIHJlcG8gb24gZXZlcnkgcmVxdWVzdCBlaXRoZXIuXG5jb25zdCBSRVBPX1JFVFJZX0RFTEFZID0gMTUgKiAxMDAwO1xuY29uc3QgTE9PUEJBQ0sgPSBbXCIxMjcuMC4wLjFcIiwgXCI6OjFcIiwgXCI6OmZmZmY6MTI3LjAuMC4xXCJdO1xuLy8gVGhlIHRydXN0ZWQgbWFjaGluZSBsaXN0IGlzIHJlLXJlYWQgYXQgbW9zdCB0aGlzIG9mdGVuIHdoZW4gYSBjaGVjayByZWplY3RzLCBzbyBhIGNhbGxlciB0aGF0XG4vLyB3YXMganVzdCBhZGRlZCBpcyBwaWNrZWQgdXAgcXVpY2tseSB3aXRob3V0IGxldHRpbmcgYSBmbG9vZCBvZiByZWplY3Rpb25zIHJlLXJlYWQgZXZlcnkgdGltZS5cbmNvbnN0IE1BQ0hJTkVTX0lOVkFMSURBVElPTl9JTlRFUlZBTCA9IDYwICogMTAwMDtcbmxldCBsYXN0TWFjaGluZXNJbnZhbGlkYXRpb24gPSAwO1xuXG4vKiogT25lIG1hY2hpbmUgd2UgYXJlIHdpbGxpbmcgdG8gdGFsayB0bywgYW5kIHRoZSBhZGRyZXNzZXMgaXQgbWF5IHRhbGsgdG8gdXMgZnJvbS4gKi9cbmV4cG9ydCB0eXBlIE1hY2hpbmVTdGF0ZSA9IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcHM6IHN0cmluZ1tdO1xuICAgIGFkZGVkQXQ6IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbWFjaGluZUZpbGVQYXRoKHJlcG9QYXRoOiBzdHJpbmcsIG1hY2hpbmVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihyZXBvUGF0aCwgTUFDSElORVNfRElSLCBgJHttYWNoaW5lSWR9Lmpzb25gKTtcbn1cblxuLyoqIFRoaXMgbWFjaGluZSdzIGtleXMgcmVwbywgd29ya2VkIG91dCBvbmNlIGFuZCB0aGVuIHJlbWVtYmVyZWQuXG5cbiAgICBBIGZhaWx1cmUgaXMgcmVtZW1iZXJlZCB0b28sIGJ1dCBvbmx5IGJyaWVmbHk6IGEgc2VydmVyIG1heSB3ZWxsIHN0YXJ0IGJlZm9yZSB0aGUgbWFjaGluZSBoYXNcbiAgICBiZWVuIHNldCB1cCwgYW5kIHNob3VsZCBzdGFydCB3b3JraW5nIHdoZW4gaXQgaXMsIHJhdGhlciB0aGFuIG5lZWRpbmcgYSByZXN0YXJ0LiAqL1xuZXhwb3J0IGNvbnN0IGtleXNSZXBvID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgbGV0IGxvb2t1cCA9IHJlc29sdmVLZXlzUmVwbygpO1xuICAgIGxvb2t1cC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ga2V5c1JlcG8ucmVzZXQoKSwgUkVQT19SRVRSWV9ERUxBWSkudW5yZWYoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgbG9va3VwO1xufSk7XG5cbi8qKiBFdmVyeSBtYWNoaW5lIGEgY2hlY2tvdXQgbGlzdHMuIFdpdGhvdXQgYSByZXBvLCB0aGlzIG1hY2hpbmUncyBvd24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TWFjaGluZXMocmVwb1BhdGg/OiBzdHJpbmcpOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIFsuLi4oYXdhaXQgcmVhZE1hY2hpbmVzKHJlcG9QYXRoIHx8IChhd2FpdCBrZXlzUmVwbygpKS5yZXBvUGF0aCkpLnZhbHVlcygpXTtcbn1cblxuLyoqIFRoZSBtYWNoaW5lcyB0aGUgc2lnbmVkIGZpbGVzIHZvdWNoIGZvci4gT25seSB0aGUgbWFjaGluZSBmaWxlcyBjb3ZlcmVkIGJ5IHRoZSBzaWduYXR1cmUgYXJlXG4gICAgcmVhZCAtIGFuIHVuc2lnbmVkIG1hY2hpbmVzLyouanNvbiBpcyBub3QgZXZpZGVuY2Ugb2YgYW55dGhpbmcsIHNvIHJlYWRTaWduZWRSZXBvIGhhcyBhbHJlYWR5XG4gICAgbGVmdCBpdCBvdXQuICovXG5hc3luYyBmdW5jdGlvbiByZWFkVHJ1c3RlZE1hY2hpbmVzKCkge1xuICAgIGxldCB7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgbGV0IHsgZmlsZXMgfSA9IGF3YWl0IHJlYWRTaWduZWRSZXBvKHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9KTtcbiAgICBsZXQgbWFjaGluZXM6IE1hY2hpbmVTdGF0ZVtdID0gW107XG4gICAgZm9yIChsZXQgW2ZpbGVQYXRoLCBjb250ZW50c10gb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWxlUGF0aC5zdGFydHNXaXRoKGAke01BQ0hJTkVTX0RJUn0vYCkgJiYgZmlsZVBhdGguc2xpY2UoTUFDSElORVNfRElSLmxlbmd0aCArIDEpIHx8IFwiXCI7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpIHx8IG5hbWUuaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFjaGluZSA9IHBhcnNlTWFjaGluZUZpbGUobmFtZSwgY29udGVudHMudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgaWYgKG1hY2hpbmUpIHtcbiAgICAgICAgICAgIG1hY2hpbmVzLnB1c2gobWFjaGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVzO1xufVxuXG5jb25zdCB0cnVzdGVkTWFjaGluZXMgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVhZCA9IHJlYWRUcnVzdGVkTWFjaGluZXMoKTtcbiAgICByZWFkLmNhdGNoKCgpID0+IHRydXN0ZWRNYWNoaW5lcy5yZXNldCgpKTtcbiAgICByZXR1cm4gYXdhaXQgcmVhZDtcbn0pO1xuXG5sZXQgcmVmcmVzaGluZyA9IGZhbHNlO1xuXG4vKiogVGhlIG1hY2hpbmVzIHRoaXMgc3lzdGVtIHRydXN0cywgYXMgdGhlIHNpZ25lZCByZXBvIGxpc3RzIHRoZW0uXG5cbiAgICBIZWxkIHJhdGhlciB0aGFuIHJlYWQgcGVyIGNhbGwsIGFuZCByZWZyZXNoZWQgaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vYm9keSBhc2tpbmcgd2hldGhlciBhXG4gICAgbWFjaGluZSBpcyB0cnVzdGVkIHdhaXRzIGZvciBhIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSByZWFkIGFuZCBhIHNpZ25hdHVyZSB0byBiZSBjaGVja2VkLiBBXG4gICAgcmVmcmVzaCB0aGF0IGZhaWxzIGxlYXZlcyB0aGUgbGlzdCB3ZSBhbHJlYWR5IGhhdmU6IHRoZSBjaGVja291dCBpcyBvbmx5IHN0YWxlLCBub3Qgd3JvbmcuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VHJ1c3RlZE1hY2hpbmVzKCk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICBpZiAoIXJlZnJlc2hpbmcpIHtcbiAgICAgICAgcmVmcmVzaGluZyA9IHRydWU7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChNQUNISU5FU19SRUZSRVNIX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRydXN0ZWRNYWNoaW5lcy5zZXQoUHJvbWlzZS5yZXNvbHZlKGF3YWl0IHJlYWRUcnVzdGVkTWFjaGluZXMoKSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3QgcmUtcmVhZCB0aGUgdHJ1c3RlZCBtYWNoaW5lcywga2VlcGluZyB0aGUgb25lcyB3ZSBoYXZlLiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdHJ1c3RlZE1hY2hpbmVzKCk7XG59XG5cbi8qKiBUaGUgbWFjaGluZSBpZCBvZiBhIG1hY2hpbmUgcmVhY2hlZCBvdmVyIHNzaCwgZ2VuZXJhdGluZyBhbmQgaW5zdGFsbGluZyBhbiBpZGVudGl0eSBmb3IgaXQgaWZcbiAgICBpdCBoYXMgbm9uZSB1bmRlciB0aGlzIGRvbWFpbi4gVGhlIHByaXZhdGUga2V5IGVuZHMgdXAgb24gdGhhdCBtYWNoaW5lIGFuZCBub3doZXJlIGVsc2UuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVSZW1vdGVNYWNoaW5lSWQoaG9zdDogc3RyaW5nLCBkb21haW46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShERVZfZ2V0SWRlbnRpdHlGaWxlUGF0aChkb21haW4pKTtcbiAgICBsZXQgaG9tZSA9IChhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBgZWNobyAkSE9NRWAgfSkpLnN0ZG91dC50cmltKCk7XG4gICAgaWYgKCFob21lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtob3N0fSB0byByZXBvcnQgYSBob21lIGRpcmVjdG9yeSwgaXQgcmVwb3J0ZWQgbm90aGluZ2ApO1xuICAgIH1cbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBgY2F0ICR7aG9tZX0vJHtmaWxlTmFtZX0gMj4vZGV2L251bGwgfHwgdHJ1ZWAgfSk7XG4gICAgaWYgKGNvbnRlbnRzLnN0ZG91dC50cmltKCkpIHtcbiAgICAgICAgbGV0IHN0b3JlZCA9IEpTT04ucGFyc2UoY29udGVudHMuc3Rkb3V0KSBhcyBJZGVudGl0eVN0b3JhZ2VUeXBlO1xuICAgICAgICByZXR1cm4gZ2V0TWFjaGluZUlkKHN0b3JlZC5kb21haW4sIGRvbWFpbik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gaGFzIG5vIGlkZW50aXR5IGZvciAke2RvbWFpbn0sIGdlbmVyYXRpbmcgb25lYCk7XG4gICAgbGV0IGdlbmVyYXRlZCA9IGdlbmVyYXRlQ0EoZG9tYWluKTtcbiAgICBsZXQgc3RvcmVkOiBJZGVudGl0eVN0b3JhZ2VUeXBlID0ge1xuICAgICAgICBkb21haW46IGdlbmVyYXRlZC5kb21haW4sXG4gICAgICAgIGNlcnRCNjQ6IGdlbmVyYXRlZC5jZXJ0LnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICBrZXlCNjQ6IGdlbmVyYXRlZC5rZXkudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZVJlbW90ZUZpbGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBmaWxlUGF0aDogYCR7aG9tZX0vJHtmaWxlTmFtZX1gLFxuICAgICAgICBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIGdldE1hY2hpbmVJZChnZW5lcmF0ZWQuZG9tYWluLCBkb21haW4pO1xufVxuXG4vKiogTWFrZXMgYSBjaGVja291dCBsaXN0IGV4YWN0bHkgdGhlc2UgbWFjaGluZXM6IHRob3NlIG5hbWVkIGFyZSB3cml0dGVuIHdpdGggdGhlIGFkZHJlc3NlcyBnaXZlbixcbiAgICBhbmQgYW55dGhpbmcgbm90IG5hbWVkIGlzIHJlbW92ZWQuIFNvIHJlYWQgdGhlbSwgY2hhbmdlIHdoYXQgeW91IHdhbnQsIGFuZCB3cml0ZSB0aGUgcmVzdWx0LlxuXG4gICAgVGhlIGFkZHJlc3NlcyBhcmUgcGFydCBvZiBzZXR0aW5nIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgc3RlcCwgYmVjYXVzZSBhIG1hY2hpbmUgd2l0aCBub1xuICAgIGFkZHJlc3MgaXQgbWF5IHRhbGsgZnJvbSBpcyBub3QgYSBtYWNoaW5lIHRoYXQgd291bGQgZXZlciBiZSBhY2NlcHRlZCAtIHRoZXJlIGlzIG5vIHN0YXRlIHdoZXJlXG4gICAgbmFtaW5nIG9uZSB3aXRob3V0IHRoZW0gbWVhbnMgYW55dGhpbmcuXG5cbiAgICBOb3RoaW5nIGhlcmUgc2lnbnMgb3IgY29tbWl0cy4gVGhlIHNpZ25hdHVyZSBpcyB3aGF0IGV2ZXJ5IG90aGVyIG1hY2hpbmUgY2hlY2tzIGJlZm9yZVxuICAgIGJlbGlldmluZyBhbnkgb2YgdGhpcywgYW5kIGl0IHRha2VzIHRoZSBoYXJkd2FyZSBrZXksIHNvIGB5YXJuIHNpZ25maWxlcyBnaXRgIGlzIHN0aWxsIHlvdXJzIHRvXG4gICAgcnVuIGFmdGVyd2FyZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0TWFjaGluZXMoY29uZmlnOiB7XG4gICAgcmVwb1BhdGg/OiBzdHJpbmc7XG4gICAgbWFjaGluZXM6IHsgbWFjaGluZUlkOiBzdHJpbmc7IGlwczogc3RyaW5nW10gfVtdO1xufSk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICBsZXQgeyBtYWNoaW5lcyB9ID0gY29uZmlnO1xuICAgIGxldCByZXBvUGF0aCA9IGNvbmZpZy5yZXBvUGF0aCB8fCAoYXdhaXQga2V5c1JlcG8oKSkucmVwb1BhdGg7XG4gICAgLy8gV2hhdGV2ZXIgd2FzIGhlbGQgaXMgbm93IHN0YWxlLCB3aG9ldmVyIHJlYWRzIGl0IG5leHQuXG4gICAgdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCk7XG4gICAgbGV0IGV4aXN0aW5nID0gYXdhaXQgcmVhZE1hY2hpbmVzKHJlcG9QYXRoKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIpO1xuICAgIGxldCB3cml0dGVuOiBNYWNoaW5lU3RhdGVbXSA9IFtdO1xuICAgIGZvciAobGV0IG1hY2hpbmUgb2YgbWFjaGluZXMpIHtcbiAgICAgICAgaWYgKCFtYWNoaW5lLm1hY2hpbmVJZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIG1hY2hpbmVJZCwgd2FzICR7SlNPTi5zdHJpbmdpZnkobWFjaGluZS5tYWNoaW5lSWQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWFjaGluZS5pcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIGFkZHJlc3NlcyBmb3IgJHttYWNoaW5lLm1hY2hpbmVJZH0sIHdhcyBub25lLiBBIG1hY2hpbmUgaXMgdHJ1c3RlZCBmcm9tYFxuICAgICAgICAgICAgICAgICsgYCB0aGUgYWRkcmVzc2VzIGl0IG1heSB0YWxrIGZyb20sIHNvIGxlYXZlIGl0IG91dCBvZiB0aGUgbGlzdCB0byByZW1vdmUgaXQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXBzID0gbWFjaGluZS5pcHMuZmlsdGVyKChpcCwgaW5kZXgpID0+IGlwICYmIG1hY2hpbmUuaXBzLmluZGV4T2YoaXApID09PSBpbmRleCk7XG4gICAgICAgIGxldCBzdGF0ZTogTWFjaGluZVN0YXRlID0ge1xuICAgICAgICAgICAgbWFjaGluZUlkOiBtYWNoaW5lLm1hY2hpbmVJZCxcbiAgICAgICAgICAgIC8vIEluIHRoZSBvcmRlciBnaXZlbiwgd2l0aG91dCBkdXBsaWNhdGVzLCBzbyB0aGUgZmlsZSByZWFkcyB0aGUgd2F5IGl0IHdhcyBzZXQuXG4gICAgICAgICAgICBpcHMsXG4gICAgICAgICAgICBhZGRlZEF0OiBleGlzdGluZy5nZXQobWFjaGluZS5tYWNoaW5lSWQpPy5hZGRlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aCwgc3RhdGUubWFjaGluZUlkKSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUsIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcbiAgICAgICAgd3JpdHRlbi5wdXNoKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBXaGF0ZXZlciB0aGUgcmVwbyBoYWQgYW5kIHRoZSBjYWxsZXIgZGlkIG5vdCBuYW1lIGlzIG5vIGxvbmdlciB0cnVzdGVkLlxuICAgIGZvciAobGV0IG1hY2hpbmVJZCBvZiBleGlzdGluZy5rZXlzKCkpIHtcbiAgICAgICAgaWYgKCFtYWNoaW5lcy5zb21lKG1hY2hpbmUgPT4gbWFjaGluZS5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJtKG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aCwgbWFjaGluZUlkKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd3JpdHRlbjtcbn1cblxuZnVuY3Rpb24gcGFyc2VNYWNoaW5lRmlsZShuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiBNYWNoaW5lU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKTtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IHBhcnNlZC5tYWNoaW5lSWQgfHwgbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4geyBtYWNoaW5lSWQsIGlwczogcGFyc2VkLmlwcyB8fCBbXSwgYWRkZWRBdDogcGFyc2VkLmFkZGVkQXQgfHwgXCJcIiB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIHVucmVhZGFibGUgbWFjaGluZSBmaWxlICR7bmFtZX0uICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKiBFdmVyeSBtYWNoaW5lIGZpbGUgb24gZGlzay4gRm9yIGVkaXRpbmcgdGhlIHJlcG8sIG5vdCBmb3IgZGVjaWRpbmcgdHJ1c3QgLSB0cnVzdCByZWFkcyB0aGVcbiAgICBzaWduZWQgZmlsZXMgdGhyb3VnaCByZWFkVHJ1c3RlZE1hY2hpbmVzLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1hY2hpbmVzKHJlcG9QYXRoOiBzdHJpbmcpIHtcbiAgICBsZXQgbWFjaGluZXMgPSBuZXcgTWFwPHN0cmluZywgTWFjaGluZVN0YXRlPigpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUik7XG4gICAgbGV0IG5hbWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJlY3RvcnkpLmNhdGNoKCgpID0+IFtdIGFzIHN0cmluZ1tdKTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIG5hbWVzLnNvcnQoKSkge1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmUgPSBwYXJzZU1hY2hpbmVGaWxlKG5hbWUsIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpLCBcInV0ZjhcIikuY2F0Y2goKCkgPT4gXCJcIikpO1xuICAgICAgICBpZiAobWFjaGluZSkge1xuICAgICAgICAgICAgbWFjaGluZXMuc2V0KG1hY2hpbmUubWFjaGluZUlkLCBtYWNoaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZXM7XG59XG5cbmxldCBsYXN0UmV2b2tlU3luYyA9IDA7XG5cbi8qKiBQdWxscyB0aGUga2V5cyByZXBvIGFuZCBpdHMgcmV2b2tlIHJlcG8sIGF0IG1vc3Qgb25jZSBhIFJFVk9LRV9TWU5DX0lOVEVSVkFMLCBiZWNhdXNlIHRoaXMgaXNcbiAgICBhc2tlZCBwZXIgcmVxdWVzdC4gQm90aCwgc2luY2UgZWl0aGVyIGNoYW5naW5nIGNoYW5nZXMgdGhlIGFuc3dlcjogdGhlIGtleXMgcmVwbyBjYXJyaWVzIHRoZVxuICAgIG1hY2hpbmVzIGFuZCB1bnJldm9rZXMsIHRoZSByZXZva2UgcmVwbyBjYXJyaWVzIHRoZSByZXZvY2F0aW9ucy4gQSBzeW5jIHRoYXQgZmFpbHMgbGVhdmVzIHRoZVxuICAgIGNoZWNrb3V0cyB3ZSBhbHJlYWR5IGhhdmUuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jUmV2b2NhdGlvbnMoc291cmNlVVJMOiBzdHJpbmcpIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RSZXZva2VTeW5jIDwgUkVWT0tFX1NZTkNfSU5URVJWQUwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0UmV2b2tlU3luYyA9IERhdGUubm93KCk7XG4gICAgYXdhaXQgc3luY1JlcG8oc291cmNlVVJMKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc3luYyAke3NvdXJjZVVSTH0sIHVzaW5nIHRoZSBjaGVja291dCBhbHJlYWR5IGhlcmUuICR7ZX1gKSk7XG4gICAgYXdhaXQgc3luY1JlcG9GaWxlcyhyZXZva2VSZXBvKHNvdXJjZVVSTCkpLmNhdGNoKGUgPT4gY29uc29sZS5sb2coYENvdWxkIG5vdCBzeW5jICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfSwgdXNpbmcgdGhlIHJldm9jYXRpb25zIGFscmVhZHkgYWJzb3JiZWQuICR7ZX1gKSk7XG59XG5cbi8qKiBXaGF0IHRvIHJ1biB0byB0cnVzdCBhIG1hY2hpbmUgdGhhdCBoYXMganVzdCBiZWVuIHJlZnVzZWQuXG5cbiAgICBFdmVyeXRoaW5nIGluIGl0IGlzIGFscmVhZHkga25vd24gdG8gd2hvZXZlciBpcyBiZWluZyByZWZ1c2VkOiB0aGVpciBtYWNoaW5lIGlkLCB0aGUgYWRkcmVzcyB3ZVxuICAgIHNhdyB0aGVtIGF0LCBhbmQgdGhlIGRvbWFpbiB0aGV5IGp1c3QgdGFsa2VkIHRvLiBIYW5kaW5nIGl0IGJhY2sgc2F2ZXMgdGhlbSB3b3JraW5nIG91dCB0aGVcbiAgICBwYXJ0cyBvZiBhIGNvbW1hbmQgdGhleSBoYXZlIGV2ZXJ5IHJpZ2h0IHRvIGtub3cuIFJ1bm5pbmcgaXQgc3RpbGwgdGFrZXMgdGhlIGhhcmR3YXJlIGtleSBvblxuICAgIHRoZSBtYWNoaW5lIHRoYXQgb3ducyB0aGUgcmVwbywgc28gdGVsbGluZyB0aGVtIGNvc3RzIG5vdGhpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTWFjaGluZUNvbW1hbmQoY29uZmlnOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyBkb21haW4/OiBzdHJpbmcgfSkge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgaXAsIGRvbWFpbiB9ID0gY29uZmlnO1xuICAgIHJldHVybiBgVG8gdHJ1c3QgJHttYWNoaW5lSWR9LCBydW46IHlhcm4gYWRkbWFjaGluZSAke2RvbWFpbiB8fCBcIjxkb21haW4+XCJ9ICR7bWFjaGluZUlkfSAke2lwfSBnaXRgO1xufVxuXG4vKiogU2VuZHMgdGhlIG9uZSBub3RpZmljYXRpb24gdGhpcyBmaWxlIGlzIGFsbG93ZWQgdG8gc2VuZCwgd2hlbiBpdCBjYW4uXG5cbiAgICBUaGUgZGFlbW9uIGNvbmZpZ3VyZXMgbm90aWZpY2F0aW9ucyBvbiBzdGFydHVwIGFuZCB3b3VsZCBzaW1wbHkgc2VuZC4gVGhpcyBjYW4gYWxzbyBydW4gaW4gc29tZVxuICAgIG90aGVyIHByb2Nlc3MsIHdoaWNoIGhhcyBub3QsIHNvIHRoZSB3ZWJob29rIGlzIHBpY2tlZCB1cCBoZXJlIGlmIGl0IGlzIHJlYWRhYmxlLiBBIG1hY2hpbmVcbiAgICB3aXRoIG5vIHdlYmhvb2sgc2V0IHVwIHN0aWxsIHJlY29yZHMgdGhlIHJldm9jYXRpb24gLSBiZWluZyB1bmFibGUgdG8gdGVsbCBhbnlvbmUgaXMgbm90IGFcbiAgICByZWFzb24gdG8ga2VlcCBhY2NlcHRpbmcgYSBtYWNoaW5lIHRoYXQgaXMgYmVpbmcgbWlzdXNlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vdGlmeUJlc3RFZmZvcnQoaGVhZGxpbmU6IHN0cmluZywgYm9keTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFhcmVEaXNjb3JkTm90aWZpY2F0aW9uc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICAgICAgLy8gUmVhZCBmaXJzdDogY29uZmlndXJlRGlzY29yZE5vdGlmaWNhdGlvbnMgZXhpdHMgdGhlIHByb2Nlc3Mgd2hlbiB0aGUgZmlsZSBpcyBtaXNzaW5nLFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgcmlnaHQgZm9yIHRoZSBkYWVtb24gYXQgc3RhcnR1cCBhbmQgd3JvbmcgZm9yIGEgbGlicmFyeSBjYWxsLlxuICAgICAgICAgICAgYXdhaXQgZnMucmVhZEZpbGUoREVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgYXdhaXQgY29uZmlndXJlRGlzY29yZE5vdGlmaWNhdGlvbnMoeyBmaWxlUGF0aDogREVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSCB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBub3RpZnkoaGVhZGxpbmUsIGJvZHkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYENvdWxkIG5vdCBzZW5kIGEgbm90aWZpY2F0aW9uIGFib3V0IHRoaXMsIGl0IGlzIG9ubHkgaW4gdGhlIGxvZy4gJHtlfWApO1xuICAgIH1cbn1cblxuLyoqIFJlY29yZHMgdGhhdCBhIG1hY2hpbmUgd2UgYWNjZXB0IHRhbGtlZCB0byB1cyBmcm9tIGFuIGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbS4gT25lIHBlclxuICAgIG1hY2hpbmUgYW5kIGFkZHJlc3MsIHNvIGEgc2Vjb25kIGFkZHJlc3MgaXMgYSBzZWNvbmQgcmV2b2NhdGlvbiBhbmQgYW4gdW5yZXZva2Ugb2YgdGhlIGZpcnN0XG4gICAgZG9lcyBub3QgY292ZXIgaXQuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRNYWNoaW5lUmV2b2NhdGlvbihjb25maWc6IHtcbiAgICBzb3VyY2VVUkw6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIGhvc3RMYWJlbDogc3RyaW5nO1xufSkge1xuICAgIGxldCB7IHNvdXJjZVVSTCwgbWFjaGluZUlkLCBpcCwgaG9zdExhYmVsIH0gPSBjb25maWc7XG4gICAgbGV0IHJlcG9QYXRoID0gcmV2b2tlUmVwb1BhdGgoc291cmNlVVJMKTtcbiAgICBsZXQga2V5UGF0aCA9IGF3YWl0IGVuc3VyZVJldm9rZUtleShzb3VyY2VVUkwpO1xuICAgIGxldCByZXZvY2F0aW9uSWQgPSBuZXdSZXZvY2F0aW9uSWQobWFjaGluZUlkKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBSRVZPQ0FUSU9OU19ESVIpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIGAke3Jldm9jYXRpb25JZH0uanNvbmApLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJldm9jYXRpb25JZCxcbiAgICAgICAgbWFjaGluZUlkLFxuICAgICAgICBpcCxcbiAgICAgICAgcmV2b2tlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHJldm9rZWRCeTogaG9zdExhYmVsLFxuICAgICAgICByZWFzb246IFJFVk9DQVRJT05fUkVBU09OLFxuICAgIH0sIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcblxuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImFkZFwiLCBcIi1BXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIGF3YWl0IHJ1bkdpdCh7XG4gICAgICAgIGFyZ3M6IFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBgcmV2b2tlICR7cmV2b2NhdGlvbklkfWBdLFxuICAgICAgICBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLFxuICAgIH0pO1xuICAgIGxldCBwdXNoID0gYXdhaXQgcnVuR2l0KHsgYXJnczogW1wicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gQW5vdGhlciBtYWNoaW5lIG1vc3QgbGlrZWx5IHJlY29yZGVkIHRoZSBzYW1lIHRoaW5nIGZpcnN0LCBhbmQgdGhlIG5leHQgcmVhZCBwaWNrcyBpdCB1cC5cbiAgICAgICAgY29uc29sZS5sb2coYENvdWxkIG5vdCBwdXNoIHRoZSByZXZvY2F0aW9uIG9mICR7bWFjaGluZUlkfSBmcm9tICR7aXB9LiAkeyhwdXNoLnN0ZG91dCArIHB1c2guc3RkZXJyKS50cmltKCl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbm90ZVJldm9jYXRpb24ocmV2b2NhdGlvbklkLCBtYWNoaW5lSWQsIGlwKTtcbiAgICBjb25zb2xlLmxvZyhgUmV2b2tlZCAke21hY2hpbmVJZH0gZnJvbSAke2lwfSwgJHtyZXZvY2F0aW9uSWR9YCk7XG5cbiAgICAvLyBTYWlkIGJ5IHdob2V2ZXIgd3JvdGUgdGhlIHJldm9jYXRpb24sIG9uY2UsIHRoZSBzYW1lIGFzIGZvciBhbiBzc2gga2V5LiBNYWNoaW5lcyB0aGF0IG9ubHlcbiAgICAvLyByZWFkIGl0IGxhdGVyIHNheSBub3RoaW5nLCBvciBvbmUgZXZlbnQgd291bGQgYmUgcmVwb3J0ZWQgYnkgZXZlcnkgbWFjaGluZSB0aGF0IHNhdyBpdC5cbiAgICBhd2FpdCBub3RpZnlCZXN0RWZmb3J0KFxuICAgICAgICBgU1VTUElDSU9VUyBJUCAke2lwfSBGUk9aRSBNQUNISU5FICR7bWFjaGluZUlkfWAsXG4gICAgICAgIGBUcnVzdGVkIG1hY2hpbmUgJHttYWNoaW5lSWR9IHRhbGtlZCB0byB1cyBmcm9tICR7aXB9LCBhbiBhZGRyZXNzICR7bWFjaGluZUlkfSBpcyBub3RgXG4gICAgICAgICsgYCBhbGxvd2VkIGZyb20uIFRoZSBjYWxsZXIgcHJvdmVkIHBvc3Nlc3Npb24gb2YgJHttYWNoaW5lSWR9J3Mga2V5LCBzbyBlaXRoZXIgc29tZW9uZWBcbiAgICAgICAgKyBgIGVsc2UgaGFzIGEgY29weSBvZiB0aGUga2V5LCBvciB0aGUgbWFjaGluZSdzIGFkZHJlc3MgY2hhbmdlZC5gXG4gICAgICAgICsgYFxcblxcbk1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIGZyb3plbiBldmVyeXdoZXJlIG5vdywgYW5kIG5vdGhpbmcgYWNjZXB0cyBjYWxscyBmcm9tICR7bWFjaGluZUlkfS5gXG4gICAgICAgICsgYFxcblxcbklmIHRoaXMgd2FzIGFuIGF0dGFjaywgcmVtb3ZlIFxcYG1hY2hpbmVzLyR7bWFjaGluZUlkfS5qc29uXFxgIGZyb20gXFxgJHtzb3VyY2VVUkx9XFxgIG5vdy5gXG4gICAgICAgICsgYFxcbklmIHRoZSBuZXcgYWRkcmVzcyBpcyBsZWdpdGltYXRlLCBydW4gXFxgeWFybiB1bnJldm9rZSBnaXRcXGAgaW4gXFxgJHtzb3VyY2VVUkx9XFxgLiBUaGVgXG4gICAgICAgICsgYCB1bnJldm9rZSBhbGxvd3MgJHttYWNoaW5lSWR9IGZyb20gJHtpcH0sIGFuZCB0YWtlcyBlZmZlY3QgYXMgZWFjaCBtYWNoaW5lIHBpY2tzIGl0IHVwLmBcbiAgICAgICAgKyBgXFxuXFxubWFjaGluZTogXFxgJHttYWNoaW5lSWR9XFxgYFxuICAgICAgICArIGBcXG5mcm96ZW4gYnk6IFxcYCR7aG9zdExhYmVsfVxcYGBcbiAgICApO1xufVxuXG4vKiogV2hldGhlciB3ZSB3aWxsIHRhbGsgdG8gdGhpcyBtYWNoaW5lLCBjb21pbmcgZnJvbSB0aGlzIGFkZHJlc3MuXG5cbiAgICBCb3RoIGhhbHZlcyBhcmUgcmVxdWlyZWQgYW5kIG5laXRoZXIgaXMgYSBndWVzczogdGhlIGNhbGxlciBrbm93cyB0aGUgbWFjaGluZSBpZCBiZWNhdXNlIHRoZVxuICAgIGNvbm5lY3Rpb24gcHJvdmVkIGl0LCBhbmQga25vd3MgdGhlIGFkZHJlc3MgYmVjYXVzZSB0aGUgcGFja2V0cyBjYW1lIGZyb20gdGhlcmUuIEEgbWFjaGluZSB3ZVxuICAgIGRvIG5vdCBsaXN0IGlzIHNpbXBseSBub3QgYWNjZXB0ZWQuIEEgbWFjaGluZSB3ZSBkbyBsaXN0LCBhcnJpdmluZyBmcm9tIGFuIGFkZHJlc3MgaXQgZG9lcyBub3RcbiAgICBoYXZlLCBpcyB0cmVhdGVkIGFzIHRoZSBzYW1lIGtpbmQgb2YgZXZlbnQgYXMgYSBzdG9sZW4gc3NoIGtleSAtIGl0IGlzIHJldm9rZWQgZXZlcnl3aGVyZSwgYW5kXG4gICAgc3RheXMgcmV2b2tlZCB1bnRpbCBhbiB1bnJldm9rZSBhbGxvd3MgdGhhdCBtYWNoaW5lIGZyb20gdGhhdCBhZGRyZXNzLlxuXG4gICAgU2F5cyB3aHkgd2hlbiB0aGUgYW5zd2VyIGlzIG5vLCBiZWNhdXNlIHRoZSB0aHJlZSB3YXlzIHRvIGJlIHJlZnVzZWQgYXJlIGVudGlyZWx5IGRpZmZlcmVudFxuICAgIHRoaW5ncyB0byBhIHBlcnNvbiByZWFkaW5nIGl0OiBuZXZlciB0cnVzdGVkIGF0IGFsbCwgdHJ1c3RlZCBidXQgZnJvemVuLCBvciB0cnVzdGVkIGFuZCB0YWxraW5nXG4gICAgZnJvbSBzb21ld2hlcmUgaXQgc2hvdWxkIG5vdCBiZS5cblxuICAgIFRocm93cyB3aGVuIHRoZSByZXBvIGl0c2VsZiBjYW5ub3QgYmUgcmVhZCBvciBpcyBub3Qgc2lnbmVkLCByYXRoZXIgdGhhbiBhbnN3ZXJpbmcgZmFsc2U6IHRoYXRcbiAgICBpcyBhIGJyb2tlbiBpbnN0YWxsYXRpb24sIG5vdCBhIHJlamVjdGVkIG1hY2hpbmUsIGFuZCB0aGUgdHdvIGRlc2VydmUgZGlmZmVyZW50IGhhbmRsaW5nLiAqL1xuZXhwb3J0IHR5cGUgTWFjaGluZVZlcmRpY3QgPSB7IGFjY2VwdGVkOiBib29sZWFuOyByZWFzb246IHN0cmluZyB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNNYWNoaW5lQWNjZXB0ZWQoY29uZmlnOiB7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICAvLyBVc2VkIGZvciBsb2NhbCBsb29wYmFjayBhY2NlcHRhbmNlLCBhbmQgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy5cbiAgICBkb21haW4/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxNYWNoaW5lVmVyZGljdD4ge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgaXAsIGRvbWFpbiB9ID0gY29uZmlnO1xuICAgIGlmICghbWFjaGluZUlkIHx8ICFpcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgbWFjaGluZUlkIGFuZCBhbiBpcCwgd2FzICR7SlNPTi5zdHJpbmdpZnkobWFjaGluZUlkKX0gYW5kICR7SlNPTi5zdHJpbmdpZnkoaXApfWApO1xuICAgIH1cblxuICAgIC8vIFRoZSB3aG9sZSBjaGVjaywgcGx1cyB3aGV0aGVyIGl0IGZyb3plIHRoZSBtYWNoaW5lLiBBIHJlamVjdGlvbiB0aGF0IGZyb3plIGl0IGlzIGZpbmFsLCBzb1xuICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgdG8gZ2FpbiBmcm9tIGxvb2tpbmcgYWdhaW4uIEFueSBvdGhlciByZWplY3Rpb24gbWlnaHQganVzdCBiZSBhIHN0YWxlIHZpZXcgLVxuICAgIC8vIGEgbWFjaGluZSBhZGRlZCBzZWNvbmRzIGFnbyB0aGF0IG91ciBjYWNoZWQgbGlzdCBoYXMgbm90IGNhdWdodCB1cCB0byAtIHNvIGl0IGlzIHdvcnRoIG9uZVxuICAgIC8vIGZyZXNoIGxvb2ssIHdoaWNoIGlzIHdoYXQgdGhlIHJldHJ5IGJlbG93IGRvZXMuXG4gICAgbGV0IGV2YWx1YXRlID0gYXN5bmMgKCk6IFByb21pc2U8eyB2ZXJkaWN0OiBNYWNoaW5lVmVyZGljdDsgZnJvemU6IGJvb2xlYW4gfT4gPT4ge1xuICAgICAgICBpZiAoTE9PUEJBQ0suaW5jbHVkZXMoaXApICYmICEhZG9tYWluICYmIG1hY2hpbmVJZCA9PT0gZ2V0T3duTWFjaGluZUlkKGRvbWFpbikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IHRydWUsIHJlYXNvbjogXCJcIiB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBzb3VyY2VVUkwgfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgICAgIGF3YWl0IHN5bmNSZXZvY2F0aW9ucyhzb3VyY2VVUkwpO1xuICAgICAgICAvLyBUaGUgbGlzdCBoYXMgcmV2b2NhdGlvbnMgYWxyZWFkeSBhcHBsaWVkIC0gcmVhZFNpZ25lZFJlcG8gZHJvcHMgZnJvemVuIG1hY2hpbmVzIC0gc28gYVxuICAgICAgICAvLyBtYWNoaW5lIGluIGl0IGlzIHRydXN0ZWQsIGFuZCBhIG1hY2hpbmUgbWlzc2luZyBmcm9tIGl0IGlzIGVpdGhlciB1bmtub3duIG9yIGZyb3plbi5cbiAgICAgICAgbGV0IG1hY2hpbmUgPSAoYXdhaXQgZ2V0VHJ1c3RlZE1hY2hpbmVzKCkpLmZpbmQoZW50cnkgPT4gZW50cnkubWFjaGluZUlkID09PSBtYWNoaW5lSWQpO1xuICAgICAgICBpZiAoIW1hY2hpbmUpIHtcbiAgICAgICAgICAgIGlmIChpc0lkZW50aXR5RnJvemVuKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgZnJvemVuLCBoYXZpbmcgYmVlbiB1c2VkIGZyb20gYW4gdW5hcHByb3ZlZCBhZGRyZXNzLmAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IHRydXN0ZWQuICR7YWRkTWFjaGluZUNvbW1hbmQoeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSl9YCB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYWNoaW5lLmlwcy5pbmNsdWRlcyhpcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IHRydWUsIHJlYXNvbjogXCJcIiB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpc3RlZCwgYnV0IHRhbGtpbmcgdG8gdXMgZnJvbSBzb21ld2hlcmUgaXQgc2hvdWxkIG5vdCBiZS4gUmVjb3JkZWQgb25jZSBmb3IgdGhpcyBtYWNoaW5lXG4gICAgICAgIC8vIGFuZCBhZGRyZXNzLCBzbyBiZWluZyB0YWxrZWQgdG8gcmVwZWF0ZWRseSBkb2VzIG5vdCB3cml0ZSByZXBlYXRlZGx5LlxuICAgICAgICBpZiAoIWlzUGFpclJldm9rZWQobWFjaGluZUlkLCBpcCkgJiYgIWlzUGFpclVucmV2b2tlZChtYWNoaW5lSWQsIGlwKSkge1xuICAgICAgICAgICAgYXdhaXQgcmVjb3JkTWFjaGluZVJldm9jYXRpb24oeyBzb3VyY2VVUkwsIG1hY2hpbmVJZCwgaXAsIGhvc3RMYWJlbDogb3MuaG9zdG5hbWUoKSB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBub3QgYWxsb3dlZCBmcm9tICR7aXB9LCBhbmQgaXMgbm93IGZyb3plbiBldmVyeXdoZXJlLmAgfSwgZnJvemU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfS5gIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgIH07XG5cbiAgICBsZXQgeyB2ZXJkaWN0LCBmcm96ZSB9ID0gYXdhaXQgZXZhbHVhdGUoKTtcbiAgICAvLyBBbiBhY2NlcHQsIG9yIGEgcmVqZWN0aW9uIHRoYXQganVzdCBmcm96ZSB0aGUgbWFjaGluZSwgaXMgdGhlIGZpbmFsIHdvcmQuIEFueSBvdGhlciByZWplY3Rpb25cbiAgICAvLyBtaWdodCBqdXN0IGJlIGEgc3RhbGUgbGlzdCAtIGEgbWFjaGluZSBhZGRlZCBzZWNvbmRzIGFnbyB3ZSBoYXZlIG5vdCBjYXVnaHQgdXAgdG8gLSBzbyBpdCBpc1xuICAgIC8vIHdvcnRoIG9uZSBmcmVzaCBsb29rLlxuICAgIGlmICh2ZXJkaWN0LmFjY2VwdGVkIHx8IGZyb3plKSB7XG4gICAgICAgIHJldHVybiB2ZXJkaWN0O1xuICAgIH1cbiAgICAvLyBSZS1yZWFkIHRoZSBsaXN0IGF0IG1vc3Qgb25jZSBhIG1pbnV0ZSwgc28gYSBidXJzdCBvZiBiYWQgY2FsbGVycyBjYW5ub3QgbWFrZSB1cyByZS1yZWFkIG9uXG4gICAgLy8gZXZlcnkgb25lIG9mIHRoZW0uIEZvcmNlIHRoZSBjaGVja291dCBiYWNrIHRvIHRoZSByZW1vdGUgZmlyc3QsIHNvIGEgbWFjaGluZSBhZGRlZCBhbmQgc2lnbmVkXG4gICAgLy8gc2Vjb25kcyBhZ28gaXMgcGlja2VkIHVwIGV2ZW4gaWYgdGhlIGNoZWNrb3V0IHdhcyBsZWZ0IGRpcnR5LCB0aGVuIHRha2UgdGhlIGZyZXNoIGxvb2sgYXNcbiAgICAvLyBmaW5hbC5cbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA+IE1BQ0hJTkVTX0lOVkFMSURBVElPTl9JTlRFUlZBTCkge1xuICAgICAgICBsYXN0TWFjaGluZXNJbnZhbGlkYXRpb24gPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgeyBzb3VyY2VVUkwgfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgICAgIGF3YWl0IHN5bmNSZXBvKHNvdXJjZVVSTCwgeyBmb3JjZVVwZGF0ZTogdHJ1ZSB9KS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3QgZm9yY2UgdXBkYXRlICR7c291cmNlVVJMfS4gJHtlfWApKTtcbiAgICAgICAgdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgZXZhbHVhdGUoKSkudmVyZGljdDtcbn1cbiJdfQ==
|
|
366
|
-
/* _JS_SOURCE_HASH = "
|
|
382
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLG9FQUFzRTtBQUN0RSxzREFBZ0U7QUFDaEUsa0VBQXFFO0FBQ3JFLDRFQUEySTtBQUMzSSxpRUFBK0U7QUFDL0UsNERBQXlEO0FBQ3pELHNEQUF1STtBQUN2SSxrREFBaUk7QUFDakksb0RBQWlGO0FBQ2pGLHlEQUFtRDtBQUNuRCwyREFBK0Q7QUFHL0QsbUdBQW1HO0FBQ25HLGlHQUFpRztBQUNqRyxnRUFBZ0U7QUFDbkQsUUFBQSxZQUFZLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxNQUFNLGlCQUFpQixHQUFHLDhDQUE4QyxDQUFDO0FBQ3pFLGdHQUFnRztBQUNoRyxtQ0FBbUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLDZGQUE2RjtBQUM3RixpR0FBaUc7QUFDakcsa0VBQWtFO0FBQ2xFLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxnR0FBZ0c7QUFDaEcsaUdBQWlHO0FBQ2pHLDBEQUEwRDtBQUMxRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDMUQsZ0dBQWdHO0FBQ2hHLGdHQUFnRztBQUNoRyxNQUFNLDhCQUE4QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDakQsSUFBSSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFTakMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxN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aEcsNEZBQTRGO0lBQzVGLFNBQVM7SUFDVCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyx3QkFBd0IsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3pFLHdCQUF3QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFBLGdCQUFRLEdBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUEsY0FBUSxFQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEgsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBTSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxDQUFDO0FBbkVELDhDQW1FQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMva2V5c1JlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG8sIHN5bmNSZXBvRmlsZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgbmV3UmV2b2NhdGlvbklkIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZXZvY2F0aW9uXCI7XG5pbXBvcnQgeyBydW5HaXQsIHN5bmNSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9naXRcIjtcbmltcG9ydCB7IGVuc3VyZVJldm9rZUtleSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBpc0lkZW50aXR5RnJvemVuLCBpc1BhaXJSZXZva2VkLCBpc1BhaXJVbnJldm9rZWQsIG5vdGVSZXZvY2F0aW9uLCByZWFkU2lnbmVkUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVhZFNpZ25lZFJlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG9QYXRoLCByZXZva2VSZXBvVVJMIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgbm90aWZ5IH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9ub3RpZnlcIjtcbmltcG9ydCB7IGFyZURpc2NvcmROb3RpZmljYXRpb25zQ29uZmlndXJlZCwgY29uZmlndXJlRGlzY29yZE5vdGlmaWNhdGlvbnMsIERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSBmcm9tIFwiLi4vbm90aWZpY2F0aW9ucy9kaXNjb3JkXCI7XG5pbXBvcnQgeyBERVZfZ2V0SWRlbnRpdHlGaWxlUGF0aCwgZ2VuZXJhdGVDQSwgZ2V0TWFjaGluZUlkLCBnZXRPd25NYWNoaW5lSWQsIElkZW50aXR5U3RvcmFnZVR5cGUgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgZGVzY3JpYmVIb3N0LCBydW5PdmVyU1NILCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgc3Bhd25Qcm9taXNlIH0gZnJvbSBcIi4uL2hlbHBlcnMvc3Bhd25cIjtcblxuLy8gV2hpY2ggbWFjaGluZXMgdGhpcyBzeXN0ZW0gdGFsa3MgdG8sIGtlcHQgaW4gdGhlIHNhbWUgcmVwbyBhcyB0aGUgc3NoIGtleXMuIFRoYXQgcmVwbyBpcyBhbHJlYWR5XG4vLyBzaWduZWQsIGFscmVhZHkgZGlzdHJpYnV0ZWQgdG8gZXZlcnkgbWFjaGluZSwgYW5kIGFscmVhZHkgaGFzIHNvbWV3aGVyZSB0byByZWNvcmQgYSByZWplY3Rpb24sXG4vLyBzbyBhIHNlY29uZCBvbmUgd291bGQgb25seSBiZSBhIHNlY29uZCB0aGluZyB0byBrZWVwIGluIHN0ZXAuXG5leHBvcnQgY29uc3QgTUFDSElORVNfRElSID0gXCJtYWNoaW5lc1wiO1xuY29uc3QgUkVWT0NBVElPTlNfRElSID0gXCJyZXZvY2F0aW9uc1wiO1xuY29uc3QgUkVWT0NBVElPTl9SRUFTT04gPSBcImEgbWFjaGluZSB0YWxrZWQgdG8gdXMgZnJvbSBhbiB1bmFwcHJvdmVkIElQXCI7XG4vLyBUaGUgcmV2b2tlIHJlcG8gaXMgcHVsbGVkIGF0IG1vc3QgdGhpcyBvZnRlbi4gQSBjaGVjayBoYXBwZW5zIHBlciByZXF1ZXN0LCBhbmQgYSByZXF1ZXN0IG11c3Rcbi8vIG5vdCBjb3N0IGEgcm91bmQgdHJpcCB0byBnaXRodWIuXG5jb25zdCBSRVZPS0VfU1lOQ19JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIEFuZCB0aGUgbWFjaGluZSBsaXN0IGlzIHJlLXJlYWQgZnJvbSB0aGUgY2hlY2tvdXQgb24gdGhpcyBpbnRlcnZhbCwgaW4gdGhlIGJhY2tncm91bmQuIFRoZVxuLy8gY2hlY2tvdXQgaXRzZWxmIG9ubHkgbW92ZXMgd2hlbiB0aGUgZGFlbW9uIHB1bGxzIGl0LCB3aGljaCBpcyBvbiB0aGUgc2FtZSBzb3J0IG9mIGludGVydmFsLCBzb1xuLy8gcmVhZGluZyBtb3JlIG9mdGVuIHRoYW4gdGhpcyB3b3VsZCBvbmx5IHJlLXJlYWQgdGhlIHNhbWUgYnl0ZXMuXG5jb25zdCBNQUNISU5FU19SRUZSRVNIX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gSG93IGxvbmcgYSBmYWlsdXJlIHRvIGZpbmQgdGhlIGtleXMgcmVwbyBpcyByZW1lbWJlcmVkLiBBIGxvbmcgbGl2ZWQgcHJvY2VzcyBtYXkgc3RhcnQgYmVmb3JlXG4vLyB0aGUgbWFjaGluZSBpcyBzZXQgdXAsIGFuZCBzaG91bGQgcGljayBpdCB1cCBvbmNlIGl0IGlzLCB3aXRob3V0IGJlaW5nIHJlc3RhcnRlZCAtIGJ1dCBpdCBtdXN0XG4vLyBub3QgcGF5IGZvciByZXNvbHZpbmcgdGhlIHJlcG8gb24gZXZlcnkgcmVxdWVzdCBlaXRoZXIuXG5jb25zdCBSRVBPX1JFVFJZX0RFTEFZID0gMTUgKiAxMDAwO1xuY29uc3QgTE9PUEJBQ0sgPSBbXCIxMjcuMC4wLjFcIiwgXCI6OjFcIiwgXCI6OmZmZmY6MTI3LjAuMC4xXCJdO1xuLy8gVGhlIHRydXN0ZWQgbWFjaGluZSBsaXN0IGlzIHJlLXJlYWQgYXQgbW9zdCB0aGlzIG9mdGVuIHdoZW4gYSBjaGVjayByZWplY3RzLCBzbyBhIGNhbGxlciB0aGF0XG4vLyB3YXMganVzdCBhZGRlZCBpcyBwaWNrZWQgdXAgcXVpY2tseSB3aXRob3V0IGxldHRpbmcgYSBmbG9vZCBvZiByZWplY3Rpb25zIHJlLXJlYWQgZXZlcnkgdGltZS5cbmNvbnN0IE1BQ0hJTkVTX0lOVkFMSURBVElPTl9JTlRFUlZBTCA9IDYwICogMTAwMDtcbmxldCBsYXN0TWFjaGluZXNJbnZhbGlkYXRpb24gPSAwO1xuXG4vKiogT25lIG1hY2hpbmUgd2UgYXJlIHdpbGxpbmcgdG8gdGFsayB0bywgYW5kIHRoZSBhZGRyZXNzZXMgaXQgbWF5IHRhbGsgdG8gdXMgZnJvbS4gKi9cbmV4cG9ydCB0eXBlIE1hY2hpbmVTdGF0ZSA9IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcHM6IHN0cmluZ1tdO1xuICAgIGFkZGVkQXQ6IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbWFjaGluZUZpbGVQYXRoKHJlcG9QYXRoOiBzdHJpbmcsIG1hY2hpbmVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihyZXBvUGF0aCwgTUFDSElORVNfRElSLCBgJHttYWNoaW5lSWR9Lmpzb25gKTtcbn1cblxuLyoqIFRoaXMgbWFjaGluZSdzIGtleXMgcmVwbywgd29ya2VkIG91dCBvbmNlIGFuZCB0aGVuIHJlbWVtYmVyZWQuXG5cbiAgICBBIGZhaWx1cmUgaXMgcmVtZW1iZXJlZCB0b28sIGJ1dCBvbmx5IGJyaWVmbHk6IGEgc2VydmVyIG1heSB3ZWxsIHN0YXJ0IGJlZm9yZSB0aGUgbWFjaGluZSBoYXNcbiAgICBiZWVuIHNldCB1cCwgYW5kIHNob3VsZCBzdGFydCB3b3JraW5nIHdoZW4gaXQgaXMsIHJhdGhlciB0aGFuIG5lZWRpbmcgYSByZXN0YXJ0LiAqL1xuZXhwb3J0IGNvbnN0IGtleXNSZXBvID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgbGV0IGxvb2t1cCA9IHJlc29sdmVLZXlzUmVwbygpO1xuICAgIGxvb2t1cC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ga2V5c1JlcG8ucmVzZXQoKSwgUkVQT19SRVRSWV9ERUxBWSkudW5yZWYoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgbG9va3VwO1xufSk7XG5cbi8qKiBFdmVyeSBtYWNoaW5lIGEgY2hlY2tvdXQgbGlzdHMuIFdpdGhvdXQgYSByZXBvLCB0aGlzIG1hY2hpbmUncyBvd24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TWFjaGluZXMocmVwb1BhdGg/OiBzdHJpbmcpOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIFsuLi4oYXdhaXQgcmVhZE1hY2hpbmVzKHJlcG9QYXRoIHx8IChhd2FpdCBrZXlzUmVwbygpKS5yZXBvUGF0aCkpLnZhbHVlcygpXTtcbn1cblxuLyoqIFRoZSBtYWNoaW5lcyB0aGUgc2lnbmVkIGZpbGVzIHZvdWNoIGZvci4gT25seSB0aGUgbWFjaGluZSBmaWxlcyBjb3ZlcmVkIGJ5IHRoZSBzaWduYXR1cmUgYXJlXG4gICAgcmVhZCAtIGFuIHVuc2lnbmVkIG1hY2hpbmVzLyouanNvbiBpcyBub3QgZXZpZGVuY2Ugb2YgYW55dGhpbmcsIHNvIHJlYWRTaWduZWRSZXBvIGhhcyBhbHJlYWR5XG4gICAgbGVmdCBpdCBvdXQuICovXG5hc3luYyBmdW5jdGlvbiByZWFkVHJ1c3RlZE1hY2hpbmVzKCkge1xuICAgIGxldCB7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgbGV0IHsgZmlsZXMgfSA9IGF3YWl0IHJlYWRTaWduZWRSZXBvKHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9KTtcbiAgICBsZXQgbWFjaGluZXM6IE1hY2hpbmVTdGF0ZVtdID0gW107XG4gICAgZm9yIChsZXQgW2ZpbGVQYXRoLCBjb250ZW50c10gb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWxlUGF0aC5zdGFydHNXaXRoKGAke01BQ0hJTkVTX0RJUn0vYCkgJiYgZmlsZVBhdGguc2xpY2UoTUFDSElORVNfRElSLmxlbmd0aCArIDEpIHx8IFwiXCI7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpIHx8IG5hbWUuaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFjaGluZSA9IHBhcnNlTWFjaGluZUZpbGUobmFtZSwgY29udGVudHMudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgaWYgKG1hY2hpbmUpIHtcbiAgICAgICAgICAgIG1hY2hpbmVzLnB1c2gobWFjaGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVzO1xufVxuXG5jb25zdCB0cnVzdGVkTWFjaGluZXMgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVhZCA9IHJlYWRUcnVzdGVkTWFjaGluZXMoKTtcbiAgICByZWFkLmNhdGNoKCgpID0+IHRydXN0ZWRNYWNoaW5lcy5yZXNldCgpKTtcbiAgICByZXR1cm4gYXdhaXQgcmVhZDtcbn0pO1xuXG5sZXQgcmVmcmVzaGluZyA9IGZhbHNlO1xuXG4vKiogVGhlIG1hY2hpbmVzIHRoaXMgc3lzdGVtIHRydXN0cywgYXMgdGhlIHNpZ25lZCByZXBvIGxpc3RzIHRoZW0uXG5cbiAgICBIZWxkIHJhdGhlciB0aGFuIHJlYWQgcGVyIGNhbGwsIGFuZCByZWZyZXNoZWQgaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vYm9keSBhc2tpbmcgd2hldGhlciBhXG4gICAgbWFjaGluZSBpcyB0cnVzdGVkIHdhaXRzIGZvciBhIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSByZWFkIGFuZCBhIHNpZ25hdHVyZSB0byBiZSBjaGVja2VkLiBBXG4gICAgcmVmcmVzaCB0aGF0IGZhaWxzIGxlYXZlcyB0aGUgbGlzdCB3ZSBhbHJlYWR5IGhhdmU6IHRoZSBjaGVja291dCBpcyBvbmx5IHN0YWxlLCBub3Qgd3JvbmcuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VHJ1c3RlZE1hY2hpbmVzKCk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICBpZiAoIXJlZnJlc2hpbmcpIHtcbiAgICAgICAgcmVmcmVzaGluZyA9IHRydWU7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChNQUNISU5FU19SRUZSRVNIX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRydXN0ZWRNYWNoaW5lcy5zZXQoUHJvbWlzZS5yZXNvbHZlKGF3YWl0IHJlYWRUcnVzdGVkTWFjaGluZXMoKSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3QgcmUtcmVhZCB0aGUgdHJ1c3RlZCBtYWNoaW5lcywga2VlcGluZyB0aGUgb25lcyB3ZSBoYXZlLiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdHJ1c3RlZE1hY2hpbmVzKCk7XG59XG5cbi8qKiBUaGUgbWFjaGluZSBpZCBvZiBhIG1hY2hpbmUgcmVhY2hlZCBvdmVyIHNzaCwgZ2VuZXJhdGluZyBhbmQgaW5zdGFsbGluZyBhbiBpZGVudGl0eSBmb3IgaXQgaWZcbiAgICBpdCBoYXMgbm9uZSB1bmRlciB0aGlzIGRvbWFpbi4gVGhlIHByaXZhdGUga2V5IGVuZHMgdXAgb24gdGhhdCBtYWNoaW5lIGFuZCBub3doZXJlIGVsc2UuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVSZW1vdGVNYWNoaW5lSWQoaG9zdDogc3RyaW5nLCBkb21haW46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShERVZfZ2V0SWRlbnRpdHlGaWxlUGF0aChkb21haW4pKTtcbiAgICBsZXQgaG9tZSA9IChhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBgZWNobyAkSE9NRWAgfSkpLnN0ZG91dC50cmltKCk7XG4gICAgaWYgKCFob21lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtob3N0fSB0byByZXBvcnQgYSBob21lIGRpcmVjdG9yeSwgaXQgcmVwb3J0ZWQgbm90aGluZ2ApO1xuICAgIH1cbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBgY2F0ICR7aG9tZX0vJHtmaWxlTmFtZX0gMj4vZGV2L251bGwgfHwgdHJ1ZWAgfSk7XG4gICAgaWYgKGNvbnRlbnRzLnN0ZG91dC50cmltKCkpIHtcbiAgICAgICAgbGV0IHN0b3JlZCA9IEpTT04ucGFyc2UoY29udGVudHMuc3Rkb3V0KSBhcyBJZGVudGl0eVN0b3JhZ2VUeXBlO1xuICAgICAgICByZXR1cm4gZ2V0TWFjaGluZUlkKHN0b3JlZC5kb21haW4sIGRvbWFpbik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gaGFzIG5vIGlkZW50aXR5IGZvciAke2RvbWFpbn0sIGdlbmVyYXRpbmcgb25lYCk7XG4gICAgbGV0IGdlbmVyYXRlZCA9IGdlbmVyYXRlQ0EoZG9tYWluKTtcbiAgICBsZXQgc3RvcmVkOiBJZGVudGl0eVN0b3JhZ2VUeXBlID0ge1xuICAgICAgICBkb21haW46IGdlbmVyYXRlZC5kb21haW4sXG4gICAgICAgIGNlcnRCNjQ6IGdlbmVyYXRlZC5jZXJ0LnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICBrZXlCNjQ6IGdlbmVyYXRlZC5rZXkudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZVJlbW90ZUZpbGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBmaWxlUGF0aDogYCR7aG9tZX0vJHtmaWxlTmFtZX1gLFxuICAgICAgICBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIGdldE1hY2hpbmVJZChnZW5lcmF0ZWQuZG9tYWluLCBkb21haW4pO1xufVxuXG4vKiogTWFrZXMgYSBjaGVja291dCBsaXN0IGV4YWN0bHkgdGhlc2UgbWFjaGluZXM6IHRob3NlIG5hbWVkIGFyZSB3cml0dGVuIHdpdGggdGhlIGFkZHJlc3NlcyBnaXZlbixcbiAgICBhbmQgYW55dGhpbmcgbm90IG5hbWVkIGlzIHJlbW92ZWQuIFNvIHJlYWQgdGhlbSwgY2hhbmdlIHdoYXQgeW91IHdhbnQsIGFuZCB3cml0ZSB0aGUgcmVzdWx0LlxuXG4gICAgVGhlIGFkZHJlc3NlcyBhcmUgcGFydCBvZiBzZXR0aW5nIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgc3RlcCwgYmVjYXVzZSBhIG1hY2hpbmUgd2l0aCBub1xuICAgIGFkZHJlc3MgaXQgbWF5IHRhbGsgZnJvbSBpcyBub3QgYSBtYWNoaW5lIHRoYXQgd291bGQgZXZlciBiZSBhY2NlcHRlZCAtIHRoZXJlIGlzIG5vIHN0YXRlIHdoZXJlXG4gICAgbmFtaW5nIG9uZSB3aXRob3V0IHRoZW0gbWVhbnMgYW55dGhpbmcuXG5cbiAgICBOb3RoaW5nIGhlcmUgc2lnbnMgb3IgY29tbWl0cy4gVGhlIHNpZ25hdHVyZSBpcyB3aGF0IGV2ZXJ5IG90aGVyIG1hY2hpbmUgY2hlY2tzIGJlZm9yZVxuICAgIGJlbGlldmluZyBhbnkgb2YgdGhpcywgYW5kIGl0IHRha2VzIHRoZSBoYXJkd2FyZSBrZXksIHNvIGB5YXJuIHNpZ25maWxlcyBnaXRgIGlzIHN0aWxsIHlvdXJzIHRvXG4gICAgcnVuIGFmdGVyd2FyZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0TWFjaGluZXMoY29uZmlnOiB7XG4gICAgcmVwb1BhdGg/OiBzdHJpbmc7XG4gICAgbWFjaGluZXM6IHsgbWFjaGluZUlkOiBzdHJpbmc7IGlwczogc3RyaW5nW10gfVtdO1xufSk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICBsZXQgeyBtYWNoaW5lcyB9ID0gY29uZmlnO1xuICAgIGxldCByZXBvUGF0aCA9IGNvbmZpZy5yZXBvUGF0aCB8fCAoYXdhaXQga2V5c1JlcG8oKSkucmVwb1BhdGg7XG4gICAgLy8gV2hhdGV2ZXIgd2FzIGhlbGQgaXMgbm93IHN0YWxlLCB3aG9ldmVyIHJlYWRzIGl0IG5leHQuXG4gICAgdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCk7XG4gICAgbGV0IGV4aXN0aW5nID0gYXdhaXQgcmVhZE1hY2hpbmVzKHJlcG9QYXRoKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIpO1xuICAgIGxldCB3cml0dGVuOiBNYWNoaW5lU3RhdGVbXSA9IFtdO1xuICAgIGZvciAobGV0IG1hY2hpbmUgb2YgbWFjaGluZXMpIHtcbiAgICAgICAgaWYgKCFtYWNoaW5lLm1hY2hpbmVJZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIG1hY2hpbmVJZCwgd2FzICR7SlNPTi5zdHJpbmdpZnkobWFjaGluZS5tYWNoaW5lSWQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWFjaGluZS5pcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIGFkZHJlc3NlcyBmb3IgJHttYWNoaW5lLm1hY2hpbmVJZH0sIHdhcyBub25lLiBBIG1hY2hpbmUgaXMgdHJ1c3RlZCBmcm9tYFxuICAgICAgICAgICAgICAgICsgYCB0aGUgYWRkcmVzc2VzIGl0IG1heSB0YWxrIGZyb20sIHNvIGxlYXZlIGl0IG91dCBvZiB0aGUgbGlzdCB0byByZW1vdmUgaXQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXBzID0gbWFjaGluZS5pcHMuZmlsdGVyKChpcCwgaW5kZXgpID0+IGlwICYmIG1hY2hpbmUuaXBzLmluZGV4T2YoaXApID09PSBpbmRleCk7XG4gICAgICAgIGxldCBzdGF0ZTogTWFjaGluZVN0YXRlID0ge1xuICAgICAgICAgICAgbWFjaGluZUlkOiBtYWNoaW5lLm1hY2hpbmVJZCxcbiAgICAgICAgICAgIC8vIEluIHRoZSBvcmRlciBnaXZlbiwgd2l0aG91dCBkdXBsaWNhdGVzLCBzbyB0aGUgZmlsZSByZWFkcyB0aGUgd2F5IGl0IHdhcyBzZXQuXG4gICAgICAgICAgICBpcHMsXG4gICAgICAgICAgICBhZGRlZEF0OiBleGlzdGluZy5nZXQobWFjaGluZS5tYWNoaW5lSWQpPy5hZGRlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aCwgc3RhdGUubWFjaGluZUlkKSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUsIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcbiAgICAgICAgd3JpdHRlbi5wdXNoKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBXaGF0ZXZlciB0aGUgcmVwbyBoYWQgYW5kIHRoZSBjYWxsZXIgZGlkIG5vdCBuYW1lIGlzIG5vIGxvbmdlciB0cnVzdGVkLlxuICAgIGZvciAobGV0IG1hY2hpbmVJZCBvZiBleGlzdGluZy5rZXlzKCkpIHtcbiAgICAgICAgaWYgKCFtYWNoaW5lcy5zb21lKG1hY2hpbmUgPT4gbWFjaGluZS5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJtKG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aCwgbWFjaGluZUlkKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd3JpdHRlbjtcbn1cblxuZnVuY3Rpb24gcGFyc2VNYWNoaW5lRmlsZShuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiBNYWNoaW5lU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKTtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IHBhcnNlZC5tYWNoaW5lSWQgfHwgbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4geyBtYWNoaW5lSWQsIGlwczogcGFyc2VkLmlwcyB8fCBbXSwgYWRkZWRBdDogcGFyc2VkLmFkZGVkQXQgfHwgXCJcIiB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIHVucmVhZGFibGUgbWFjaGluZSBmaWxlICR7bmFtZX0uICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKiBFdmVyeSBtYWNoaW5lIGZpbGUgb24gZGlzay4gRm9yIGVkaXRpbmcgdGhlIHJlcG8sIG5vdCBmb3IgZGVjaWRpbmcgdHJ1c3QgLSB0cnVzdCByZWFkcyB0aGVcbiAgICBzaWduZWQgZmlsZXMgdGhyb3VnaCByZWFkVHJ1c3RlZE1hY2hpbmVzLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1hY2hpbmVzKHJlcG9QYXRoOiBzdHJpbmcpIHtcbiAgICBsZXQgbWFjaGluZXMgPSBuZXcgTWFwPHN0cmluZywgTWFjaGluZVN0YXRlPigpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUik7XG4gICAgbGV0IG5hbWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJlY3RvcnkpLmNhdGNoKCgpID0+IFtdIGFzIHN0cmluZ1tdKTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIG5hbWVzLnNvcnQoKSkge1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmUgPSBwYXJzZU1hY2hpbmVGaWxlKG5hbWUsIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpLCBcInV0ZjhcIikuY2F0Y2goKCkgPT4gXCJcIikpO1xuICAgICAgICBpZiAobWFjaGluZSkge1xuICAgICAgICAgICAgbWFjaGluZXMuc2V0KG1hY2hpbmUubWFjaGluZUlkLCBtYWNoaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZXM7XG59XG5cbmxldCBsYXN0UmV2b2tlU3luYyA9IDA7XG5cbi8qKiBQdWxscyB0aGUga2V5cyByZXBvIGFuZCBpdHMgcmV2b2tlIHJlcG8sIGF0IG1vc3Qgb25jZSBhIFJFVk9LRV9TWU5DX0lOVEVSVkFMLCBiZWNhdXNlIHRoaXMgaXNcbiAgICBhc2tlZCBwZXIgcmVxdWVzdC4gQm90aCwgc2luY2UgZWl0aGVyIGNoYW5naW5nIGNoYW5nZXMgdGhlIGFuc3dlcjogdGhlIGtleXMgcmVwbyBjYXJyaWVzIHRoZVxuICAgIG1hY2hpbmVzIGFuZCB1bnJldm9rZXMsIHRoZSByZXZva2UgcmVwbyBjYXJyaWVzIHRoZSByZXZvY2F0aW9ucy4gQSBzeW5jIHRoYXQgZmFpbHMgbGVhdmVzIHRoZVxuICAgIGNoZWNrb3V0cyB3ZSBhbHJlYWR5IGhhdmUuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jUmV2b2NhdGlvbnMoc291cmNlVVJMOiBzdHJpbmcpIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RSZXZva2VTeW5jIDwgUkVWT0tFX1NZTkNfSU5URVJWQUwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0UmV2b2tlU3luYyA9IERhdGUubm93KCk7XG4gICAgYXdhaXQgc3luY1JlcG8oc291cmNlVVJMKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc3luYyAke3NvdXJjZVVSTH0sIHVzaW5nIHRoZSBjaGVja291dCBhbHJlYWR5IGhlcmUuICR7ZX1gKSk7XG4gICAgYXdhaXQgc3luY1JlcG9GaWxlcyhyZXZva2VSZXBvKHNvdXJjZVVSTCkpLmNhdGNoKGUgPT4gY29uc29sZS5sb2coYENvdWxkIG5vdCBzeW5jICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfSwgdXNpbmcgdGhlIHJldm9jYXRpb25zIGFscmVhZHkgYWJzb3JiZWQuICR7ZX1gKSk7XG59XG5cbi8qKiBXaGF0IHRvIHJ1biB0byB0cnVzdCBhIG1hY2hpbmUgdGhhdCBoYXMganVzdCBiZWVuIHJlZnVzZWQuXG5cbiAgICBFdmVyeXRoaW5nIGluIGl0IGlzIGFscmVhZHkga25vd24gdG8gd2hvZXZlciBpcyBiZWluZyByZWZ1c2VkOiB0aGVpciBtYWNoaW5lIGlkLCB0aGUgYWRkcmVzcyB3ZVxuICAgIHNhdyB0aGVtIGF0LCBhbmQgdGhlIGRvbWFpbiB0aGV5IGp1c3QgdGFsa2VkIHRvLiBIYW5kaW5nIGl0IGJhY2sgc2F2ZXMgdGhlbSB3b3JraW5nIG91dCB0aGVcbiAgICBwYXJ0cyBvZiBhIGNvbW1hbmQgdGhleSBoYXZlIGV2ZXJ5IHJpZ2h0IHRvIGtub3cuIFJ1bm5pbmcgaXQgc3RpbGwgdGFrZXMgdGhlIGhhcmR3YXJlIGtleSBvblxuICAgIHRoZSBtYWNoaW5lIHRoYXQgb3ducyB0aGUgcmVwbywgc28gdGVsbGluZyB0aGVtIGNvc3RzIG5vdGhpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTWFjaGluZUNvbW1hbmQoY29uZmlnOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyBkb21haW4/OiBzdHJpbmcgfSkge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgaXAsIGRvbWFpbiB9ID0gY29uZmlnO1xuICAgIHJldHVybiBgVG8gdHJ1c3QgJHttYWNoaW5lSWR9LCBydW46IHlhcm4gYWRkbWFjaGluZSAke2RvbWFpbiB8fCBcIjxkb21haW4+XCJ9ICR7bWFjaGluZUlkfSAke2lwfSBnaXRgO1xufVxuXG4vKiogU2VuZHMgdGhlIG9uZSBub3RpZmljYXRpb24gdGhpcyBmaWxlIGlzIGFsbG93ZWQgdG8gc2VuZCwgd2hlbiBpdCBjYW4uXG5cbiAgICBUaGUgZGFlbW9uIGNvbmZpZ3VyZXMgbm90aWZpY2F0aW9ucyBvbiBzdGFydHVwIGFuZCB3b3VsZCBzaW1wbHkgc2VuZC4gVGhpcyBjYW4gYWxzbyBydW4gaW4gc29tZVxuICAgIG90aGVyIHByb2Nlc3MsIHdoaWNoIGhhcyBub3QsIHNvIHRoZSB3ZWJob29rIGlzIHBpY2tlZCB1cCBoZXJlIGlmIGl0IGlzIHJlYWRhYmxlLiBBIG1hY2hpbmVcbiAgICB3aXRoIG5vIHdlYmhvb2sgc2V0IHVwIHN0aWxsIHJlY29yZHMgdGhlIHJldm9jYXRpb24gLSBiZWluZyB1bmFibGUgdG8gdGVsbCBhbnlvbmUgaXMgbm90IGFcbiAgICByZWFzb24gdG8ga2VlcCBhY2NlcHRpbmcgYSBtYWNoaW5lIHRoYXQgaXMgYmVpbmcgbWlzdXNlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vdGlmeUJlc3RFZmZvcnQoaGVhZGxpbmU6IHN0cmluZywgYm9keTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFhcmVEaXNjb3JkTm90aWZpY2F0aW9uc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICAgICAgLy8gUmVhZCBmaXJzdDogY29uZmlndXJlRGlzY29yZE5vdGlmaWNhdGlvbnMgZXhpdHMgdGhlIHByb2Nlc3Mgd2hlbiB0aGUgZmlsZSBpcyBtaXNzaW5nLFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgcmlnaHQgZm9yIHRoZSBkYWVtb24gYXQgc3RhcnR1cCBhbmQgd3JvbmcgZm9yIGEgbGlicmFyeSBjYWxsLlxuICAgICAgICAgICAgYXdhaXQgZnMucmVhZEZpbGUoREVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgYXdhaXQgY29uZmlndXJlRGlzY29yZE5vdGlmaWNhdGlvbnMoeyBmaWxlUGF0aDogREVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSCB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBub3RpZnkoaGVhZGxpbmUsIGJvZHkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYENvdWxkIG5vdCBzZW5kIGEgbm90aWZpY2F0aW9uIGFib3V0IHRoaXMsIGl0IGlzIG9ubHkgaW4gdGhlIGxvZy4gJHtlfWApO1xuICAgIH1cbn1cblxuLyoqIFJlY29yZHMgdGhhdCBhIG1hY2hpbmUgd2UgYWNjZXB0IHRhbGtlZCB0byB1cyBmcm9tIGFuIGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbS4gT25lIHBlclxuICAgIG1hY2hpbmUgYW5kIGFkZHJlc3MsIHNvIGEgc2Vjb25kIGFkZHJlc3MgaXMgYSBzZWNvbmQgcmV2b2NhdGlvbiBhbmQgYW4gdW5yZXZva2Ugb2YgdGhlIGZpcnN0XG4gICAgZG9lcyBub3QgY292ZXIgaXQuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRNYWNoaW5lUmV2b2NhdGlvbihjb25maWc6IHtcbiAgICBzb3VyY2VVUkw6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIGhvc3RMYWJlbDogc3RyaW5nO1xufSkge1xuICAgIGxldCB7IHNvdXJjZVVSTCwgbWFjaGluZUlkLCBpcCwgaG9zdExhYmVsIH0gPSBjb25maWc7XG4gICAgLy8gQ2xvbmVzIGl0IGlmIGl0IGlzIG5vdCBoZXJlIHlldCwgd2hpY2ggaXMgdGhlIHVzdWFsIHN0YXRlIG9mIGEgbWFjaGluZSB0aGF0IGhhcyBuZXZlciBoYWQgdG9cbiAgICAvLyByZXZva2UgYW55dGhpbmcuIFdpdGhvdXQgdGhpcyB0aGUgbWtkaXIgYmVsb3cgd291bGQgYnVpbGQgdGhlIGRpcmVjdG9yeSBhbnl3YXkgYW5kIGdpdCB3b3VsZFxuICAgIC8vIHRoZW4gYmUgcnVuIHNvbWV3aGVyZSB0aGF0IGlzIG5vdCBhIGNoZWNrb3V0LCBzbyB0aGUgcmV2b2NhdGlvbiB3YXMgd3JpdHRlbiB3aGVyZSBub3RoaW5nXG4gICAgLy8gd291bGQgZXZlciByZWFkIGl0LlxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bmNSZXBvRmlsZXMocmV2b2tlUmVwbyhzb3VyY2VVUkwpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCByZWNvcmQgdGhlIHJldm9jYXRpb24gb2YgJHttYWNoaW5lSWR9LCAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0gY291bGQgbm90IGJlIHJlYWQuICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgcmVwb1BhdGggPSByZXZva2VSZXBvUGF0aChzb3VyY2VVUkwpO1xuICAgIGxldCBrZXlQYXRoID0gYXdhaXQgZW5zdXJlUmV2b2tlS2V5KHNvdXJjZVVSTCk7XG4gICAgbGV0IHJldm9jYXRpb25JZCA9IG5ld1Jldm9jYXRpb25JZChtYWNoaW5lSWQpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFJFVk9DQVRJT05TX0RJUik7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgYCR7cmV2b2NhdGlvbklkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmV2b2NhdGlvbklkLFxuICAgICAgICBtYWNoaW5lSWQsXG4gICAgICAgIGlwLFxuICAgICAgICByZXZva2VkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgcmV2b2tlZEJ5OiBob3N0TGFiZWwsXG4gICAgICAgIHJlYXNvbjogUkVWT0NBVElPTl9SRUFTT04sXG4gICAgfSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIpO1xuXG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiYWRkXCIsIFwiLUFcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSk7XG4gICAgYXdhaXQgcnVuR2l0KHtcbiAgICAgICAgYXJnczogW1wiLWNcIiwgXCJ1c2VyLmVtYWlsPXBvcnRzZWN1cmVAbG9jYWxob3N0XCIsIFwiLWNcIiwgXCJ1c2VyLm5hbWU9cG9ydHNlY3VyZVwiLCBcImNvbW1pdFwiLCBcIi1tXCIsIGByZXZva2UgJHtyZXZvY2F0aW9uSWR9YF0sXG4gICAgICAgIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsXG4gICAgfSk7XG4gICAgbGV0IHB1c2ggPSBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJwdXNoXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChwdXNoLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBBbm90aGVyIG1hY2hpbmUgbW9zdCBsaWtlbHkgcmVjb3JkZWQgdGhlIHNhbWUgdGhpbmcgZmlyc3QsIGFuZCB0aGUgbmV4dCByZWFkIHBpY2tzIGl0IHVwLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHB1c2ggdGhlIHJldm9jYXRpb24gb2YgJHttYWNoaW5lSWR9IGZyb20gJHtpcH0uICR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKX1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBub3RlUmV2b2NhdGlvbihyZXZvY2F0aW9uSWQsIG1hY2hpbmVJZCwgaXApO1xuICAgIGNvbnNvbGUubG9nKGBSZXZva2VkICR7bWFjaGluZUlkfSBmcm9tICR7aXB9LCAke3Jldm9jYXRpb25JZH1gKTtcblxuICAgIC8vIFNhaWQgYnkgd2hvZXZlciB3cm90ZSB0aGUgcmV2b2NhdGlvbiwgb25jZSwgdGhlIHNhbWUgYXMgZm9yIGFuIHNzaCBrZXkuIE1hY2hpbmVzIHRoYXQgb25seVxuICAgIC8vIHJlYWQgaXQgbGF0ZXIgc2F5IG5vdGhpbmcsIG9yIG9uZSBldmVudCB3b3VsZCBiZSByZXBvcnRlZCBieSBldmVyeSBtYWNoaW5lIHRoYXQgc2F3IGl0LlxuICAgIGF3YWl0IG5vdGlmeUJlc3RFZmZvcnQoXG4gICAgICAgIGBTVVNQSUNJT1VTIElQICR7aXB9IEZST1pFIE1BQ0hJTkUgJHttYWNoaW5lSWR9YCxcbiAgICAgICAgYFRydXN0ZWQgbWFjaGluZSAke21hY2hpbmVJZH0gdGFsa2VkIHRvIHVzIGZyb20gJHtpcH0sIGFuIGFkZHJlc3MgJHttYWNoaW5lSWR9IGlzIG5vdGBcbiAgICAgICAgKyBgIGFsbG93ZWQgZnJvbS4gVGhlIGNhbGxlciBwcm92ZWQgcG9zc2Vzc2lvbiBvZiAke21hY2hpbmVJZH0ncyBrZXksIHNvIGVpdGhlciBzb21lb25lYFxuICAgICAgICArIGAgZWxzZSBoYXMgYSBjb3B5IG9mIHRoZSBrZXksIG9yIHRoZSBtYWNoaW5lJ3MgYWRkcmVzcyBjaGFuZ2VkLmBcbiAgICAgICAgKyBgXFxuXFxuTWFjaGluZSAke21hY2hpbmVJZH0gaXMgZnJvemVuIGV2ZXJ5d2hlcmUgbm93LCBhbmQgbm90aGluZyBhY2NlcHRzIGNhbGxzIGZyb20gJHttYWNoaW5lSWR9LmBcbiAgICAgICAgKyBgXFxuXFxuSWYgdGhpcyB3YXMgYW4gYXR0YWNrLCByZW1vdmUgXFxgbWFjaGluZXMvJHttYWNoaW5lSWR9Lmpzb25cXGAgZnJvbSBcXGAke3NvdXJjZVVSTH1cXGAgbm93LmBcbiAgICAgICAgKyBgXFxuSWYgdGhlIG5ldyBhZGRyZXNzIGlzIGxlZ2l0aW1hdGUsIHJ1biBcXGB5YXJuIHVucmV2b2tlIGdpdFxcYCBpbiBcXGAke3NvdXJjZVVSTH1cXGAuIFRoZWBcbiAgICAgICAgKyBgIHVucmV2b2tlIGFsbG93cyAke21hY2hpbmVJZH0gZnJvbSAke2lwfSwgYW5kIHRha2VzIGVmZmVjdCBhcyBlYWNoIG1hY2hpbmUgcGlja3MgaXQgdXAuYFxuICAgICAgICArIGBcXG5cXG5tYWNoaW5lOiBcXGAke21hY2hpbmVJZH1cXGBgXG4gICAgICAgICsgYFxcbmZyb3plbiBieTogXFxgJHtob3N0TGFiZWx9XFxgYFxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgdGFsayB0byB0aGlzIG1hY2hpbmUsIGNvbWluZyBmcm9tIHRoaXMgYWRkcmVzcy5cblxuICAgIEJvdGggaGFsdmVzIGFyZSByZXF1aXJlZCBhbmQgbmVpdGhlciBpcyBhIGd1ZXNzOiB0aGUgY2FsbGVyIGtub3dzIHRoZSBtYWNoaW5lIGlkIGJlY2F1c2UgdGhlXG4gICAgY29ubmVjdGlvbiBwcm92ZWQgaXQsIGFuZCBrbm93cyB0aGUgYWRkcmVzcyBiZWNhdXNlIHRoZSBwYWNrZXRzIGNhbWUgZnJvbSB0aGVyZS4gQSBtYWNoaW5lIHdlXG4gICAgZG8gbm90IGxpc3QgaXMgc2ltcGx5IG5vdCBhY2NlcHRlZC4gQSBtYWNoaW5lIHdlIGRvIGxpc3QsIGFycml2aW5nIGZyb20gYW4gYWRkcmVzcyBpdCBkb2VzIG5vdFxuICAgIGhhdmUsIGlzIHRyZWF0ZWQgYXMgdGhlIHNhbWUga2luZCBvZiBldmVudCBhcyBhIHN0b2xlbiBzc2gga2V5IC0gaXQgaXMgcmV2b2tlZCBldmVyeXdoZXJlLCBhbmRcbiAgICBzdGF5cyByZXZva2VkIHVudGlsIGFuIHVucmV2b2tlIGFsbG93cyB0aGF0IG1hY2hpbmUgZnJvbSB0aGF0IGFkZHJlc3MuXG5cbiAgICBTYXlzIHdoeSB3aGVuIHRoZSBhbnN3ZXIgaXMgbm8sIGJlY2F1c2UgdGhlIHRocmVlIHdheXMgdG8gYmUgcmVmdXNlZCBhcmUgZW50aXJlbHkgZGlmZmVyZW50XG4gICAgdGhpbmdzIHRvIGEgcGVyc29uIHJlYWRpbmcgaXQ6IG5ldmVyIHRydXN0ZWQgYXQgYWxsLCB0cnVzdGVkIGJ1dCBmcm96ZW4sIG9yIHRydXN0ZWQgYW5kIHRhbGtpbmdcbiAgICBmcm9tIHNvbWV3aGVyZSBpdCBzaG91bGQgbm90IGJlLlxuXG4gICAgVGhyb3dzIHdoZW4gdGhlIHJlcG8gaXRzZWxmIGNhbm5vdCBiZSByZWFkIG9yIGlzIG5vdCBzaWduZWQsIHJhdGhlciB0aGFuIGFuc3dlcmluZyBmYWxzZTogdGhhdFxuICAgIGlzIGEgYnJva2VuIGluc3RhbGxhdGlvbiwgbm90IGEgcmVqZWN0ZWQgbWFjaGluZSwgYW5kIHRoZSB0d28gZGVzZXJ2ZSBkaWZmZXJlbnQgaGFuZGxpbmcuICovXG5leHBvcnQgdHlwZSBNYWNoaW5lVmVyZGljdCA9IHsgYWNjZXB0ZWQ6IGJvb2xlYW47IHJlYXNvbjogc3RyaW5nIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc01hY2hpbmVBY2NlcHRlZChjb25maWc6IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIC8vIFVzZWQgZm9yIGxvY2FsIGxvb3BiYWNrIGFjY2VwdGFuY2UsIGFuZCBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICAgIGRvbWFpbj86IHN0cmluZztcbn0pOiBQcm9taXNlPE1hY2hpbmVWZXJkaWN0PiB7XG4gICAgbGV0IHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0gPSBjb25maWc7XG4gICAgaWYgKCFtYWNoaW5lSWQgfHwgIWlwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBtYWNoaW5lSWQgYW5kIGFuIGlwLCB3YXMgJHtKU09OLnN0cmluZ2lmeShtYWNoaW5lSWQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShpcCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHdob2xlIGNoZWNrLCBwbHVzIHdoZXRoZXIgaXQgZnJvemUgdGhlIG1hY2hpbmUuIEEgcmVqZWN0aW9uIHRoYXQgZnJvemUgaXQgaXMgZmluYWwsIHNvXG4gICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBnYWluIGZyb20gbG9va2luZyBhZ2Fpbi4gQW55IG90aGVyIHJlamVjdGlvbiBtaWdodCBqdXN0IGJlIGEgc3RhbGUgdmlldyAtXG4gICAgLy8gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHRoYXQgb3VyIGNhY2hlZCBsaXN0IGhhcyBub3QgY2F1Z2h0IHVwIHRvIC0gc28gaXQgaXMgd29ydGggb25lXG4gICAgLy8gZnJlc2ggbG9vaywgd2hpY2ggaXMgd2hhdCB0aGUgcmV0cnkgYmVsb3cgZG9lcy5cbiAgICBsZXQgZXZhbHVhdGUgPSBhc3luYyAoKTogUHJvbWlzZTx7IHZlcmRpY3Q6IE1hY2hpbmVWZXJkaWN0OyBmcm96ZTogYm9vbGVhbiB9PiA9PiB7XG4gICAgICAgIGlmIChMT09QQkFDSy5pbmNsdWRlcyhpcCkgJiYgISFkb21haW4gJiYgbWFjaGluZUlkID09PSBnZXRPd25NYWNoaW5lSWQoZG9tYWluKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogdHJ1ZSwgcmVhc29uOiBcIlwiIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICAgICAgYXdhaXQgc3luY1Jldm9jYXRpb25zKHNvdXJjZVVSTCk7XG4gICAgICAgIC8vIFRoZSBsaXN0IGhhcyByZXZvY2F0aW9ucyBhbHJlYWR5IGFwcGxpZWQgLSByZWFkU2lnbmVkUmVwbyBkcm9wcyBmcm96ZW4gbWFjaGluZXMgLSBzbyBhXG4gICAgICAgIC8vIG1hY2hpbmUgaW4gaXQgaXMgdHJ1c3RlZCwgYW5kIGEgbWFjaGluZSBtaXNzaW5nIGZyb20gaXQgaXMgZWl0aGVyIHVua25vd24gb3IgZnJvemVuLlxuICAgICAgICBsZXQgbWFjaGluZSA9IChhd2FpdCBnZXRUcnVzdGVkTWFjaGluZXMoKSkuZmluZChlbnRyeSA9PiBlbnRyeS5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCk7XG4gICAgICAgIGlmICghbWFjaGluZSkge1xuICAgICAgICAgICAgaWYgKGlzSWRlbnRpdHlGcm96ZW4obWFjaGluZUlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBmcm96ZW4sIGhhdmluZyBiZWVuIHVzZWQgZnJvbSBhbiB1bmFwcHJvdmVkIGFkZHJlc3MuYCB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBub3QgdHJ1c3RlZC4gJHthZGRNYWNoaW5lQ29tbWFuZCh7IG1hY2hpbmVJZCwgaXAsIGRvbWFpbiB9KX1gIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hY2hpbmUuaXBzLmluY2x1ZGVzKGlwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogdHJ1ZSwgcmVhc29uOiBcIlwiIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGlzdGVkLCBidXQgdGFsa2luZyB0byB1cyBmcm9tIHNvbWV3aGVyZSBpdCBzaG91bGQgbm90IGJlLiBSZWNvcmRlZCBvbmNlIGZvciB0aGlzIG1hY2hpbmVcbiAgICAgICAgLy8gYW5kIGFkZHJlc3MsIHNvIGJlaW5nIHRhbGtlZCB0byByZXBlYXRlZGx5IGRvZXMgbm90IHdyaXRlIHJlcGVhdGVkbHkuXG4gICAgICAgIGlmICghaXNQYWlyUmV2b2tlZChtYWNoaW5lSWQsIGlwKSAmJiAhaXNQYWlyVW5yZXZva2VkKG1hY2hpbmVJZCwgaXApKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHRoZSBtYWNoaW5lIHRoYXQgYWN0dWFsbHkgd3JvdGUgdGhlIHJldm9jYXRpb24gbWF5IHNheSBpdCBmcm96ZSBhbnl0aGluZy4gT25lXG4gICAgICAgICAgICAvLyB0aGF0IGNvdWxkIG5vdCByZWFjaCB0aGUgcmV2b2tlIHJlcG8gaGFzIHJlZnVzZWQgdGhpcyBjYWxsIGFuZCBub3RoaW5nIG1vcmUuXG4gICAgICAgICAgICBsZXQgZnJvemUgPSBhd2FpdCByZWNvcmRNYWNoaW5lUmV2b2NhdGlvbih7IHNvdXJjZVVSTCwgbWFjaGluZUlkLCBpcCwgaG9zdExhYmVsOiBvcy5ob3N0bmFtZSgpIH0pO1xuICAgICAgICAgICAgbGV0IHJlYXNvbiA9IGZyb3plXG4gICAgICAgICAgICAgICAgJiYgYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH0sIGFuZCBpcyBub3cgZnJvemVuIGV2ZXJ5d2hlcmUuYFxuICAgICAgICAgICAgICAgIHx8IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBub3QgYWxsb3dlZCBmcm9tICR7aXB9LiBJdCBjb3VsZCBub3QgYmUgZnJvemVuLCAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0gY291bGQgbm90IGJlIHdyaXR0ZW4uYDtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb24gfSwgZnJvemUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfS5gIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgIH07XG5cbiAgICBsZXQgeyB2ZXJkaWN0LCBmcm96ZSB9ID0gYXdhaXQgZXZhbHVhdGUoKTtcbiAgICAvLyBBbiBhY2NlcHQsIG9yIGEgcmVqZWN0aW9uIHRoYXQganVzdCBmcm96ZSB0aGUgbWFjaGluZSwgaXMgdGhlIGZpbmFsIHdvcmQuIEFueSBvdGhlciByZWplY3Rpb25cbiAgICAvLyBtaWdodCBqdXN0IGJlIGEgc3RhbGUgbGlzdCAtIGEgbWFjaGluZSBhZGRlZCBzZWNvbmRzIGFnbyB3ZSBoYXZlIG5vdCBjYXVnaHQgdXAgdG8gLSBzbyBpdCBpc1xuICAgIC8vIHdvcnRoIG9uZSBmcmVzaCBsb29rLlxuICAgIGlmICh2ZXJkaWN0LmFjY2VwdGVkIHx8IGZyb3plKSB7XG4gICAgICAgIHJldHVybiB2ZXJkaWN0O1xuICAgIH1cbiAgICAvLyBSZS1yZWFkIHRoZSBsaXN0IGF0IG1vc3Qgb25jZSBhIG1pbnV0ZSwgc28gYSBidXJzdCBvZiBiYWQgY2FsbGVycyBjYW5ub3QgbWFrZSB1cyByZS1yZWFkIG9uXG4gICAgLy8gZXZlcnkgb25lIG9mIHRoZW0uIEZvcmNlIHRoZSBjaGVja291dCBiYWNrIHRvIHRoZSByZW1vdGUgZmlyc3QsIHNvIGEgbWFjaGluZSBhZGRlZCBhbmQgc2lnbmVkXG4gICAgLy8gc2Vjb25kcyBhZ28gaXMgcGlja2VkIHVwIGV2ZW4gaWYgdGhlIGNoZWNrb3V0IHdhcyBsZWZ0IGRpcnR5LCB0aGVuIHRha2UgdGhlIGZyZXNoIGxvb2sgYXNcbiAgICAvLyBmaW5hbC5cbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA+IE1BQ0hJTkVTX0lOVkFMSURBVElPTl9JTlRFUlZBTCkge1xuICAgICAgICBsYXN0TWFjaGluZXNJbnZhbGlkYXRpb24gPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgeyBzb3VyY2VVUkwgfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgICAgIGF3YWl0IHN5bmNSZXBvKHNvdXJjZVVSTCwgeyBmb3JjZVVwZGF0ZTogdHJ1ZSB9KS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3QgZm9yY2UgdXBkYXRlICR7c291cmNlVVJMfS4gJHtlfWApKTtcbiAgICAgICAgdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgZXZhbHVhdGUoKSkudmVyZGljdDtcbn1cbiJdfQ==
|
|
383
|
+
/* _JS_SOURCE_HASH = "40e26ad1633fe73c690ab9307a374d85f513c5ebcddb5e2d1d9e7344251159cc"; */
|
|
@@ -290,6 +290,16 @@ async function recordMachineRevocation(config: {
|
|
|
290
290
|
hostLabel: string;
|
|
291
291
|
}) {
|
|
292
292
|
let { sourceURL, machineId, ip, hostLabel } = config;
|
|
293
|
+
// Clones it if it is not here yet, which is the usual state of a machine that has never had to
|
|
294
|
+
// revoke anything. Without this the mkdir below would build the directory anyway and git would
|
|
295
|
+
// then be run somewhere that is not a checkout, so the revocation was written where nothing
|
|
296
|
+
// would ever read it.
|
|
297
|
+
try {
|
|
298
|
+
await syncRepoFiles(revokeRepo(sourceURL));
|
|
299
|
+
} catch (e) {
|
|
300
|
+
console.error(`Cannot record the revocation of ${machineId}, ${revokeRepoURL(sourceURL)} could not be read. ${e}`);
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
293
303
|
let repoPath = revokeRepoPath(sourceURL);
|
|
294
304
|
let keyPath = await ensureRevokeKey(sourceURL);
|
|
295
305
|
let revocationId = newRevocationId(machineId);
|
|
@@ -313,7 +323,7 @@ async function recordMachineRevocation(config: {
|
|
|
313
323
|
if (push.status !== 0) {
|
|
314
324
|
// Another machine most likely recorded the same thing first, and the next read picks it up.
|
|
315
325
|
console.log(`Could not push the revocation of ${machineId} from ${ip}. ${(push.stdout + push.stderr).trim()}`);
|
|
316
|
-
return;
|
|
326
|
+
return false;
|
|
317
327
|
}
|
|
318
328
|
noteRevocation(revocationId, machineId, ip);
|
|
319
329
|
console.log(`Revoked ${machineId} from ${ip}, ${revocationId}`);
|
|
@@ -332,6 +342,7 @@ async function recordMachineRevocation(config: {
|
|
|
332
342
|
+ `\n\nmachine: \`${machineId}\``
|
|
333
343
|
+ `\nfrozen by: \`${hostLabel}\``
|
|
334
344
|
);
|
|
345
|
+
return true;
|
|
335
346
|
}
|
|
336
347
|
|
|
337
348
|
/** Whether we will talk to this machine, coming from this address.
|
|
@@ -388,8 +399,13 @@ export async function isMachineAccepted(config: {
|
|
|
388
399
|
// Listed, but talking to us from somewhere it should not be. Recorded once for this machine
|
|
389
400
|
// and address, so being talked to repeatedly does not write repeatedly.
|
|
390
401
|
if (!isPairRevoked(machineId, ip) && !isPairUnrevoked(machineId, ip)) {
|
|
391
|
-
|
|
392
|
-
|
|
402
|
+
// Only the machine that actually wrote the revocation may say it froze anything. One
|
|
403
|
+
// that could not reach the revoke repo has refused this call and nothing more.
|
|
404
|
+
let froze = await recordMachineRevocation({ sourceURL, machineId, ip, hostLabel: os.hostname() });
|
|
405
|
+
let reason = froze
|
|
406
|
+
&& `Machine ${machineId} is not allowed from ${ip}, and is now frozen everywhere.`
|
|
407
|
+
|| `Machine ${machineId} is not allowed from ${ip}. It could not be frozen, ${revokeRepoURL(sourceURL)} could not be written.`;
|
|
408
|
+
return { verdict: { accepted: false, reason }, froze };
|
|
393
409
|
}
|
|
394
410
|
return { verdict: { accepted: false, reason: `Machine ${machineId} is not allowed from ${ip}.` }, froze: false };
|
|
395
411
|
};
|