sonamu 0.8.2 → 0.8.4
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/bin/cli.js +6 -3
- package/dist/entity/entity-manager.d.ts +22 -0
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/testing/fixture-generator.d.ts +13 -0
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +114 -4
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +17 -11
- package/dist/types/types.d.ts +64 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +2 -1
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +24 -23
- package/package.json +1 -1
- package/src/bin/cli.ts +7 -1
- package/src/skills/sonamu/SKILL.md +2 -2
- package/src/skills/sonamu/fixture-cli.md +15 -13
- package/src/skills/sonamu/testing.md +13 -12
- package/src/skills/sonamu/workflow.md +1 -1
- package/src/testing/fixture-generator.ts +152 -2
- package/src/testing/fixture-manager.ts +33 -10
- package/src/types/types.ts +2 -0
- package/src/ui/api.ts +27 -30
|
@@ -119,17 +119,19 @@ export class FixtureManagerClass {
|
|
|
119
119
|
// id 필드의 타입을 확인합니다
|
|
120
120
|
const idProp = entity.props.find((p)=>p.name === "id");
|
|
121
121
|
const idType = idProp?.type;
|
|
122
|
-
// integer
|
|
123
|
-
|
|
122
|
+
// integer/bigInteger이거나, string이지만 fixtureStrategy=sequence인 경우에만 리셋합니다
|
|
123
|
+
const usesSequence = idType === "integer" || idType === "bigInteger" || idProp?.cone?.fixtureStrategy === "sequence";
|
|
124
|
+
if (!usesSequence) {
|
|
124
125
|
!isTest() && console.log(`Skipping sequence reset for ${tableName} (id type: ${idType || "unknown"})`);
|
|
125
126
|
continue;
|
|
126
127
|
}
|
|
127
128
|
// PostgreSQL 시퀀스를 현재 테이블의 MAX(id)로 리셋합니다.
|
|
128
|
-
//
|
|
129
|
+
// string 타입의 경우 숫자 캐스팅이 필요합니다.
|
|
130
|
+
const maxExpr = idType === "string" ? "MAX(id::bigint)" : "MAX(id)";
|
|
129
131
|
await testDb.raw(`
|
|
130
132
|
SELECT setval(
|
|
131
133
|
pg_get_serial_sequence('public.${tableName}', 'id'),
|
|
132
|
-
COALESCE((SELECT
|
|
134
|
+
COALESCE((SELECT ${maxExpr} FROM ${tableName}), 1)
|
|
133
135
|
)
|
|
134
136
|
`);
|
|
135
137
|
}
|
|
@@ -441,18 +443,22 @@ export class FixtureManagerClass {
|
|
|
441
443
|
if (entity) {
|
|
442
444
|
const idProp = entity.props.find((p)=>p.name === "id");
|
|
443
445
|
const idType = idProp?.type;
|
|
444
|
-
// integer
|
|
445
|
-
|
|
446
|
+
// integer/bigInteger이거나, string이지만 fixtureStrategy=sequence인 경우에만 리셋합니다
|
|
447
|
+
const usesSequence = idType === "integer" || idType === "bigInteger" || idProp?.cone?.fixtureStrategy === "sequence";
|
|
448
|
+
if (!usesSequence) {
|
|
446
449
|
!isTest() && console.log(chalk.gray(`Skipped sequence reset for ${tableName} (id type: ${idType || "unknown"})`));
|
|
447
450
|
continue;
|
|
448
451
|
}
|
|
449
452
|
}
|
|
450
|
-
// 테이블의 최대 ID 조회
|
|
451
|
-
const
|
|
453
|
+
// 테이블의 최대 ID 조회 (string 타입은 숫자 캐스팅 필요)
|
|
454
|
+
const entity2 = EntityManager.getAllEntities().find((e)=>e.table === tableName || e.id.toLowerCase() === tableName);
|
|
455
|
+
const idType2 = entity2?.props.find((p)=>p.name === "id")?.type;
|
|
456
|
+
const maxIdResult = idType2 === "string" ? await trx.raw(`SELECT MAX(id::bigint) as max_id FROM "${tableName}"`).then((r)=>r.rows[0]) : await trx(tableName).max("id as max_id").first();
|
|
452
457
|
const maxId = maxIdResult?.max_id;
|
|
453
458
|
if (maxId !== null && maxId !== undefined) {
|
|
454
|
-
//
|
|
455
|
-
await trx.raw(`SELECT setval('
|
|
459
|
+
// 시퀀스명을 pg_get_serial_sequence로 안전하게 조회
|
|
460
|
+
await trx.raw(`SELECT setval(pg_get_serial_sequence(?, 'id'), ?)`, [
|
|
461
|
+
tableName,
|
|
456
462
|
maxId
|
|
457
463
|
]);
|
|
458
464
|
!isTest() && console.log(chalk.green(`Reset sequence for ${tableName}: ${maxId}`));
|
|
@@ -757,4 +763,4 @@ export class FixtureManagerClass {
|
|
|
757
763
|
}
|
|
758
764
|
export const FixtureManager = new FixtureManagerClass();
|
|
759
765
|
|
|
760
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNraXBwZWRGaXh0dXJlczogTWFwPHN0cmluZywgeyBlbnRpdHlJZDogc3RyaW5nOyBleGlzdGluZ0lkOiBudW1iZXIgfCBzdHJpbmcgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcblxuICAgIC8vIDMuIOyLnO2AgOyKpCDrpqzshYsgKOuNsOydtO2EsCDrs7Xsgqwg7ZuEIOyLnO2AgOyKpOulvCBNQVgoaWQp66GcIOygleugrClcbiAgICBhd2FpdCB0aGlzLnJlc2V0U2VxdWVuY2VzKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6Ag7YWM7J2067iU7J2YIOyLnO2AgOyKpOulvCDtmITsnqwgTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAqIGZpeHR1cmUgc3luYyDtm4Qg7Iuc7YCA7Iqk6rCAIOyLpOygnCDrjbDsnbTthLDsmYAg66ee7KeAIOyViuuKlCDrrLjsoJzrpbwg7ZW06rKw7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFNlcXVlbmNlcyhkYkNvbmZpZzogU29uYW11REJDb25maWdbXCJ0ZXN0XCJdKSB7XG4gICAgY29uc3QgdGVzdERiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGUgfHwgZW50aXR5LmlkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDtmZXsnbjtlanri4jri6RcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgIC8vIGludGVnZXLrgpggYmlnSW50ZWdlcuqwgCDslYTri4wg6rK97JqwIHNlcXVlbmNlIHJlc2V07J2EIOyKpO2Cte2VqeuLiOuLpCAodGV4dCwgdXVpZCDrk7EpXG4gICAgICAgIGlmICghaWRUeXBlIHx8IChpZFR5cGUgIT09IFwiaW50ZWdlclwiICYmIGlkVHlwZSAhPT0gXCJiaWdJbnRlZ2VyXCIpKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc3RncmVTUUwg7Iuc7YCA7Iqk66W8IO2YhOyerCDthYzsnbTruJTsnZggTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAgICAgIC8vIOyEuCDrsojsp7gg7J247J6Q66W8IOyDneuete2VmOuptCDquLDrs7jqsJIgdHJ1ZeqwgCDsoIHsmqnrkJjslrQsIOuLpOydjCBJTlNFUlQg7IucIE1BWChpZCkrMeu2gO2EsCDsi5zsnpHtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHRlc3REYi5yYXcoYFxuICAgICAgICAgIFNFTEVDVCBzZXR2YWwoXG4gICAgICAgICAgICBwZ19nZXRfc2VyaWFsX3NlcXVlbmNlKCdwdWJsaWMuJHt0YWJsZU5hbWV9JywgJ2lkJyksXG4gICAgICAgICAgICBDT0FMRVNDRSgoU0VMRUNUIE1BWChpZCkgRlJPTSAke3RhYmxlTmFtZX0pLCAxKVxuICAgICAgICAgIClcbiAgICAgICAgYCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRlc3REYi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdGVkUmVjb3JkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBhc3luYyBpbXBvcnRGaXh0dXJlKGVudGl0eUlkOiBzdHJpbmcsIGlkczogbnVtYmVyW10pIHtcbiAgICAvLyDrsKnrrLgg6riw66GdIOy0iOq4sO2ZlCAo7IOI66Gc7Jq0IGltcG9ydCDsnpHsl4Ug7Iuc7J6RKVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuY2xlYXIoKTtcblxuICAgIGNvbnN0IHF1ZXJpZXMgPSB1bmlxdWUoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGlkcy5tYXAoYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkLCBcImlkXCIsIGlkKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgKS5mbGF0KCksXG4gICAgKTtcblxuICAgIGNvbnN0IHdkYiA9IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgZm9yIChjb25zdCBxdWVyeSBvZiBxdWVyaWVzKSB7XG4gICAgICBhd2FpdCB3ZGIucmF3KHF1ZXJ5KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7ZmllbGR9IyR7aWR9YDtcblxuICAgIC8vIOyInO2ZmCDssLjsobAg67Cp7KeAOiDsnbTrr7gg67Cp66y47ZWcIOugiOy9lOuTnOuKlCDsiqTtgrVcbiAgICBpZiAodGhpcy52aXNpdGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuXG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgIGNvbnN0IHdkYiA9IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG5cbiAgICAvLyDsl6zquLDshJwg7IukRELsnZggcm93IOqwgOyguOyYtFxuICAgIGNvbnN0IFtyb3ddID0gYXdhaXQgd2RiKGVudGl0eS50YWJsZSkud2hlcmUoZmllbGQsIGlkKS5saW1pdCgxKTtcbiAgICBpZiAocm93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH0jJHtpZH0gcm9366W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIO2UveyKpOyzkERCLCDsi6REQlxuICAgIGNvbnN0IGZpeHR1cmVEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZykuZGF0YWJhc2U7XG4gICAgY29uc3QgcmVhbERhdGFiYXNlID0gKFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZylcbiAgICAgIC5kYXRhYmFzZTtcblxuICAgIGNvbnN0IHNlbGZRdWVyeSA9IGBJTlNFUlQgSUdOT1JFIElOVE8gXFxgJHtmaXh0dXJlRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCAoU0VMRUNUICogRlJPTSBcXGAke3JlYWxEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIFdIRVJFIFxcYGlkXFxgID0gJHtpZH0pYDtcblxuICAgIGNvbnN0IGFyZ3MgPSBPYmplY3QuZW50cmllcyhlbnRpdHkucmVsYXRpb25zKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFssIHJlbGF0aW9uXSkgPT5cbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSA9PT0gdW5kZWZpbmVkKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKFssIHJlbGF0aW9uXSkgPT4ge1xuICAgICAgICAvKlxuICAgICAgICBCZWxvbmdzVG9PbmXsnbgg6rK97JqwXG4gICAgICAgICAgQ2F0ZWdvcnkgLyAnaWQnIC8gcm93W2NhdGVnb3J5X2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gdHJ1ZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdpZCcgLyByb3dbcHJvZmlsZV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IGZhbHNlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ3Byb2ZpbGVfaWQnIC8gcm93WydpZCddIO2YuOy2nFxuICAgICAgICAqL1xuICAgICAgICBsZXQgZmllbGQ6IHN0cmluZztcbiAgICAgICAgbGV0IGlkOiBudW1iZXI7XG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSAmJiAhcmVsYXRpb24uaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRDb2x1bW5OYW1lID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk/Lm5hbWU7XG4gICAgICAgICAgaWYgKCFyZWxhdGVkSWRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVsYXRlZEVudGl0eS5pZH3snZggJHtlbnRpdHkuaWR9IOq0gOqzhCDtlITroa3snYQg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkID0gYCR7cmVsYXRlZElkQ29sdW1uTmFtZX1faWRgO1xuICAgICAgICAgIGlkID0gcm93LmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkID0gXCJpZFwiO1xuICAgICAgICAgIGlkID0gcm93W2Ake3JlbGF0aW9uLm5hbWV9X2lkYF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbnRpdHlJZDogcmVsYXRpb24ud2l0aCxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBpZCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChhcmcpID0+IGFyZy5pZCAhPT0gbnVsbCk7XG5cbiAgICBjb25zdCByZWxRdWVyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhcmdzLm1hcChhc3luYyAoYXJncykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbXBvcnRRdWVyaWVzKGFyZ3MuZW50aXR5SWQsIGFyZ3MuZmllbGQsIGFyZ3MuaWQpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBbLi4udW5pcXVlKHJlbFF1ZXJpZXMucmV2ZXJzZSgpLmZsYXQoKSksIHNlbGZRdWVyeV07XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl90ZGIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3RkYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLl90ZGIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9mZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZmRiID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZpeHR1cmVzKFxuICAgIHNvdXJjZURCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgdGFyZ2V0REJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICBzZWFyY2hPcHRpb25zOiBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgICBkdXBsaWNhdGVDaGVjaz86IER1cGxpY2F0ZUNoZWNrT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgc291cmNlREIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW3NvdXJjZURCTmFtZV0pO1xuICAgIGNvbnN0IHRhcmdldERCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXREQk5hbWVdKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGVudGl0eUlkLCBmaWVsZCwgdmFsdWUsIHNlYXJjaFR5cGUgfSA9IHNlYXJjaE9wdGlvbnM7XG5cbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9XG4gICAgICAgIGVudGl0eS5wcm9wcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IGZpZWxkKT8udHlwZSA9PT0gXCJyZWxhdGlvblwiXG4gICAgICAgICAgPyBgJHtmaWVsZH1faWRgXG4gICAgICAgICAgOiBmaWVsZDtcblxuICAgICAgbGV0IHF1ZXJ5ID0gc291cmNlREIoZW50aXR5LnRhYmxlKTtcbiAgICAgIGlmIChzZWFyY2hUeXBlID09PSBcImVxdWFsc1wiKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoY29sdW1uLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT09IFwibGlrZVwiKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoY29sdW1uLCBcImxpa2VcIiwgYCUke3ZhbHVlfSVgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5O1xuICAgICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHJlY29yZHMgZm91bmRcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbFJlY29yZHNMZW5ndGggPSBmaXh0dXJlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5ld1JlY29yZHMgPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCByb3csIHtcbiAgICAgICAgICBfZGI6IHNvdXJjZURCLFxuICAgICAgICB9KTtcbiAgICAgICAgZml4dHVyZXMucHVzaCguLi5uZXdSZWNvcmRzKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpeHR1cmVSZWNvcmQgPSBmaXh0dXJlcy5maW5kKChyKSA9PiByLmZpeHR1cmVJZCA9PT0gYCR7ZW50aXR5SWR9IyR7cm93LmlkfWApO1xuXG4gICAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAgIC8vIO2YhOyerCBmaXh0dXJl66Gc67aA7YSwIOyDneyEseuQnCBmZXRjaGVkUmVjb3JkcyDshKTsoJVcbiAgICAgICAgICBjdXJyZW50Rml4dHVyZVJlY29yZC5mZXRjaGVkUmVjb3JkcyA9IGZpeHR1cmVzXG4gICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgICAgLnNsaWNlKGluaXRpYWxSZWNvcmRzTGVuZ3RoKVxuICAgICAgICAgICAgLm1hcCgocikgPT4gci5maXh0dXJlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAvLyDsgqzsmqnsnpAg7KeA7KCVIOy7rOufvCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgdGFyZ2V0XG4gICAgICAgIGNvbnN0IGN1c3RvbUNvbHVtbnMgPSBkdXBsaWNhdGVDaGVjaz8uY29sdW1ucz8uW2ZpeHR1cmUuZW50aXR5SWRdO1xuICAgICAgICBpZiAoY3VzdG9tQ29sdW1ucyAmJiBjdXN0b21Db2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21EdXBsaWNhdGVSb3cgPSBhd2FpdCB0aGlzLmNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgICAgICAgICAgdGFyZ2V0REIsXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICBmaXh0dXJlLFxuICAgICAgICAgICAgY3VzdG9tQ29sdW1ucyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjdXN0b21EdXBsaWNhdGVSb3cpIHtcbiAgICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgY3VzdG9tRHVwbGljYXRlUm93LCB7XG4gICAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgICAgX2RiOiB0YXJnZXREQixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZml4dHVyZS50YXJnZXQgPSByZWNvcmQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5pcXVlIGluZGV4IOq4sOykgCDspJHrs7Ug7ZmV7J24IOKGkiBmaXh0dXJlLnVuaXF1ZVxuICAgICAgICBjb25zdCB1bmlxdWVSb3cgPSBhd2FpdCB0aGlzLmNoZWNrVW5pcXVlVmlvbGF0aW9uKHRhcmdldERCLCBlbnRpdHksIGZpeHR1cmUpO1xuICAgICAgICBpZiAodW5pcXVlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCB1bmlxdWVSb3csIHtcbiAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS51bmlxdWUgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZShmaXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGFyZ2V0REIuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgc291cmNlREIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcm93OiB7XG4gICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgc2luZ2xlUmVjb3JkPzogYm9vbGVhbjtcbiAgICAgIF9kYj86IEtuZXg7XG4gICAgfSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlUmVjb3JkW10+IHtcbiAgICBjb25zdCByZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcbiAgICBjb25zdCB2aXNpdGVkRW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGNyZWF0ZSA9IGFzeW5jIChcbiAgICAgIGVudGl0eTogRW50aXR5LFxuICAgICAgcm93OiB7XG4gICAgICAgIGlkOiBudW1iZXIgfCBzdHJpbmc7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgICAgfSxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IGAke2VudGl0eS5pZH0jJHtyb3cuaWR9YDtcbiAgICAgIGlmICh2aXNpdGVkRW50aXRpZXMuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmlzaXRlZEVudGl0aWVzLmFkZChmaXh0dXJlSWQpO1xuXG4gICAgICBjb25zdCByZWNvcmQ6IEZpeHR1cmVSZWNvcmQgPSB7XG4gICAgICAgIGZpeHR1cmVJZCxcbiAgICAgICAgZW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgICAgY29sdW1uczoge30sXG4gICAgICAgIGZldGNoZWRSZWNvcmRzOiBbXSxcbiAgICAgICAgYmVsb25nc1JlY29yZHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICBwcm9wOiBwcm9wLFxuICAgICAgICAgIHZhbHVlOiByb3dbcHJvcC5uYW1lXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkYiA9IG9wdGlvbnM/Ll9kYiA/PyBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgdGhyb3VnaFRhYmxlID0gcHJvcC5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgZnJvbUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRvQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHRocm91Z2hUYWJsZSkud2hlcmUoZnJvbUNvbHVtbiwgcm93LmlkKS5wbHVjayh0b0NvbHVtbik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpXG4gICAgICAgICAgICAud2hlcmUocHJvcC5qb2luQ29sdW1uLCByb3cuaWQpXG4gICAgICAgICAgICAucGx1Y2soXCJpZFwiKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmICFwcm9wLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAvLyDsl63rsKntlqUgT25lVG9PbmU6IEZL66W8IOqwgOynhCDqtIDroKgg7JeU7Yuw7Yuw66W8IOywvuyKteuLiOuLpFxuICAgICAgICAgIC8vIOyYiOyLnDogVXNlciBPbmVUb09uZSBFbXBsb3llZSAoRW1wbG95ZWXqsIAgdXNlcl9pZCBGS+ulvCDqsIDsp5ApXG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3AgJiYgaXNSZWxhdGlvblByb3AocmVsYXRlZFByb3ApKSB7XG4gICAgICAgICAgICAvLyDqtIDroKgg7JeU7Yuw7Yuw7JeQ7IScIEZLIOy7rOufvOycvOuhnCDsv7zrpqztlanri4jri6QgKGlk6rCAIOyVhOuLmClcbiAgICAgICAgICAgIGNvbnN0IGZrQ29sdW1uID0gYCR7cmVsYXRlZFByb3AubmFtZX1faWRgO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKGZrQ29sdW1uLCByb3cuaWQpLmZpcnN0KCk7XG4gICAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZFJvdz8uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gcm93W2Ake3Byb3AubmFtZX1faWRgXTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWxvbmdzUmVjb3Jkcy5wdXNoKGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghb3B0aW9ucz8uc2luZ2xlUmVjb3JkICYmIHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCByZWxhdGVkSWQpLmZpcnN0KCk7XG4gICAgICAgICAgICBpZiAocmVsYXRlZFJvdykge1xuICAgICAgICAgICAgICBhd2FpdCBjcmVhdGUocmVsYXRlZEVudGl0eSwgcmVsYXRlZFJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgIH07XG5cbiAgICBhd2FpdCBjcmVhdGUoZW50aXR5LCByb3cpO1xuXG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH1cblxuICAvKipcbiAgICogMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsCAoc2VsZi1yZWZlcmVuY2Ug7Y+s7ZWoKVxuICAgKiAyLiDthYzsnbTruJTrs4Qg66CI67Ko67OE66GcIFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdIOuwjyB1cHNlcnQg7Iuk7ZaJXG4gICAqIDMuIOyInOyEnCDquLDrsJggdXVpZOKGkmlkIOunpO2VkSAoVXBzZXJ0QnVpbGRlcuqwgCB1dWlk66W8IERC7JeQIOyggOyepe2VmOyngCDslYrsnLzrr4DroZwpXG4gICAqXG4gICAqIFVwc2VydEJ1aWxkZXLripQgc2VsZi1yZWZlcmVuY2XqsIAg7J6I7Jy866m0IGJ1aWxkSW5zZXJ0TGV2ZWxzKCnroZwg7J6s7KCV66Cs7ZWY7JesXG4gICAqIOuTseuhnSDsiJzshJzsmYAg67CY7ZmYIOyInOyEnOqwgCDri6zrnbzsp4gg7IiYIOyeiOyKteuLiOuLpC4g7J2066W8IOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICogRml4dHVyZU1hbmFnZXLqsIAg66CI67Ko67OE66GcIOuCmOuIoOyEnCDsspjrpqztlZjsl6wg6rCBIHVwc2VydCDtmLjstpzsl5DshJzripRcbiAgICogc2VsZi1yZWZlcmVuY2XqsIAg7JeG64+E66GdIO2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGluc2VydEZpeHR1cmVzKFxuICAgIGRiTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgX2ZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgY29uc3QgZml4dHVyZXMgPSB1bmlxdWUoX2ZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuXG4gICAgLy8g7LSI6riw7ZmUXG4gICAgdGhpcy5idWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5za2lwcGVkRml4dHVyZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbZGJOYW1lXSk7XG4gICAgY29uc3QgcmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsFxuICAgICAgdGhpcy5yZWxhdGlvbkdyYXBoLmJ1aWxkR3JhcGgoZml4dHVyZXMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uT3JkZXIgPSB0aGlzLnJlbGF0aW9uR3JhcGguZ2V0SW5zZXJ0aW9uT3JkZXIoKTtcblxuICAgICAgLy8gMi4g7Iqk7YK17ZWgIGZpeHR1cmUg66i87KCAIOyymOumrCAob3ZlcnJpZGUg7LK07YGsKVxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGhhc1RhcmdldCA9ICEhZml4dHVyZS50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGhhc1VuaXF1ZSA9ICEhZml4dHVyZS51bmlxdWU7XG4gICAgICAgIGNvbnN0IGhhc0R1cGxpY2F0ZSA9IGhhc1RhcmdldCB8fCBoYXNVbmlxdWU7XG5cbiAgICAgICAgLy8g7KSR67O17J20IOyeiOqzoCBvdmVycmlkZT1mYWxzZeyduCDqsr3smrA6IOyKpO2CtVxuICAgICAgICBpZiAoaGFzRHVwbGljYXRlICYmICFmaXh0dXJlLm92ZXJyaWRlKSB7XG4gICAgICAgICAgLy8g6riw7KG0IOugiOy9lOuTnCBJRCDsoIDsnqUgKHVuaXF1ZSDsmrDshKAsIOyXhuycvOuptCB0YXJnZXQpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGZpeHR1cmUudW5pcXVlPy5pZCA/PyBmaXh0dXJlLnRhcmdldD8uaWQ7XG4gICAgICAgICAgYXNzZXJ0KGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzLnNldChmaXh0dXJlSWQsIHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgZXhpc3RpbmdJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgU2tpcHBlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0gKGV4aXN0aW5nOiAjJHtleGlzdGluZ0lkfSwgb3ZlcnJpZGU6IGZhbHNlKWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIO2FjOydtOu4lOuzhCBmaXh0dXJlIOq3uOujue2ZlCAoaW5zZXJ0aW9uT3JkZXIg7Iic7IScIOq4sOuwmClcbiAgICAgIGNvbnN0IGZpeHR1cmVzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBGaXh0dXJlUmVjb3JkW10+KCk7XG4gICAgICBjb25zdCB0YWJsZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICAvLyDsiqTtgrXrkJwgZml4dHVyZSDsoJzsmbhcbiAgICAgICAgaWYgKHRoaXMuc2tpcHBlZEZpeHR1cmVzLmhhcyhmaXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGVudGl0eS50YWJsZTtcblxuICAgICAgICBpZiAoIWZpeHR1cmVzQnlUYWJsZS5oYXModGFibGVOYW1lKSkge1xuICAgICAgICAgIGZpeHR1cmVzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBbXSk7XG4gICAgICAgICAgdGFibGVPcmRlci5wdXNoKHRhYmxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpPy5wdXNoKGZpeHR1cmUpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydGVkSWRzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PigpO1xuXG4gICAgICAgIC8vIDQuIO2FjOydtOu4lOuzhCDroIjrsqjrs4Qg7LKY66asXG4gICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlT3JkZXIpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUZpeHR1cmVzID0gZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IGxldmVscyA9IHRoaXMuZ3JvdXBGaXh0dXJlc0J5TGV2ZWwodGFibGVGaXh0dXJlcyk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGxldmVsRml4dHVyZXMgb2YgbGV2ZWxzKSB7XG4gICAgICAgICAgICAvLyDtlbTri7kg66CI67Ko7J2YIGZpeHR1cmXrk6QgcmVnaXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBsZXZlbEZpeHR1cmVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmUsIGluc2VydGVkSWRzQnlUYWJsZSk7XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUpYCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBzZXJ0IOyLpO2WiSDsoIQgdXVpZCDrqqnroZ0g7KCA7J6lXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuYnVpbGRlci5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdXVpZHMgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiByb3cudXVpZCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICAgICAgICAgIGBVcHNlcnRpbmcgJHt0YWJsZU5hbWV9IHdpdGggJHt1dWlkcy5sZW5ndGh9IHJvd3MgKGxldmVsICR7bGV2ZWxzLmluZGV4T2YobGV2ZWxGaXh0dXJlcykgKyAxfS8ke2xldmVscy5sZW5ndGh9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IChhd2FpdCB0aGlzLmJ1aWxkZXIudXBzZXJ0KFxuICAgICAgICAgICAgICB0cngsXG4gICAgICAgICAgICAgIHRhYmxlTmFtZSBhcyBrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgICAgICAgICAgICkpIGFzIChudW1iZXIgfCBzdHJpbmcpW107XG5cbiAgICAgICAgICAgIC8vIOyInOyEnCDquLDrsJggdXVpZCAtPiBpZCDrp6TtlZFcbiAgICAgICAgICAgIC8vIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuycvOuvgOuhnCDrk7HroZ0g7Iic7IScID0g67CY7ZmYIOyInOyEnCDrs7TsnqVcbiAgICAgICAgICAgIGlmICh1dWlkcy5sZW5ndGggPiAwICYmIHV1aWRzLmxlbmd0aCA9PT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ01hcCA9XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldCh0YWJsZU5hbWUpID8/IG5ldyBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+KCk7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXVpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ01hcC5zZXQodXVpZHNbaV0sIGlkc1tpXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5zZXJ0ZWRJZHNCeVRhYmxlLnNldCh0YWJsZU5hbWUsIGV4aXN0aW5nTWFwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXVpZHMubGVuZ3RoICE9PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgICBgV2FybmluZzogdXVpZCBjb3VudCAoJHt1dWlkcy5sZW5ndGh9KSAhPSBpZCBjb3VudCAoJHtpZHMubGVuZ3RofSkgZm9yICR7dGFibGVOYW1lfWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA1LiBNYW55VG9NYW55IOq0gOqzhCDsspjrpqxcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyh0cngsIGZpeHR1cmVzLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuXG4gICAgICAgIC8vIDYuIFBvc3RncmVTUUwg7Iuc7YCA7IqkIOumrOyFi1xuICAgICAgICAvLyBGaXh0dXJlIOyCveyehSDtm4Qg6rCBIO2FjOydtOu4lOydmCBJRCDsi5ztgIDsiqTrpbwg7LWc64yAIElEIOqwkuycvOuhnCDsl4XrjbDsnbTtirjtlanri4jri6QuXG4gICAgICAgIC8vIOydtOugh+qyjCDtlZjsp4Ag7JWK7Jy866m0IOuLpOydjCBJTlNFUlQg7IucIElE6rCAIDIwMDDrsojrjIDroZwg7IOd7ISx65CgIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiUmVzZXR0aW5nIHNlcXVlbmNlcy4uLlwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlT3JkZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRW50aXR566W8IOywvuyVhOyEnCBpZCDtg4DsnoUg7ZmV7J24XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCkuZmluZChcbiAgICAgICAgICAgICAgKGUpID0+IGUudGFibGUgPT09IHRhYmxlTmFtZSB8fCBlLmlkLnRvTG93ZXJDYXNlKCkgPT09IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgICAgICAgIC8vIGludGVnZXLrgpggYmlnSW50ZWdlcuqwgCDslYTri4wg6rK97JqwIHNlcXVlbmNlIHJlc2V07J2EIOyKpO2Cte2VqeuLiOuLpFxuICAgICAgICAgICAgICBpZiAoIWlkVHlwZSB8fCAoaWRUeXBlICE9PSBcImludGVnZXJcIiAmJiBpZFR5cGUgIT09IFwiYmlnSW50ZWdlclwiKSkge1xuICAgICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMXG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9IGF3YWl0IHRyeCh0YWJsZU5hbWUpLm1heChcImlkIGFzIG1heF9pZFwiKS5maXJzdCgpO1xuICAgICAgICAgICAgY29uc3QgbWF4SWQgPSBtYXhJZFJlc3VsdD8ubWF4X2lkO1xuXG4gICAgICAgICAgICBpZiAobWF4SWQgIT09IG51bGwgJiYgbWF4SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyDsi5ztgIDsiqTrpbwg7LWc64yAIElE66GcIOyEpOyglVxuICAgICAgICAgICAgICBhd2FpdCB0cngucmF3KGBTRUxFQ1Qgc2V0dmFsKCcke3RhYmxlTmFtZX1faWRfc2VxJywgPylgLCBbbWF4SWRdKTtcbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBSZXNldCBzZXF1ZW5jZSBmb3IgJHt0YWJsZU5hbWV9OiAke21heElkfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAvLyDsi5ztgIDsiqTqsIAg7JeG64qUIO2FjOydtOu4lChqb2luIHRhYmxlIOuTsSnsnYAg66y07IucXG4gICAgICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JheShgU2tpcHBlZCBzZXF1ZW5jZSByZXNldCBmb3IgJHt0YWJsZU5hbWV9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDcuIOqysOqzvCDsiJjsp5FcbiAgICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgICAvLyDsiqTtgrXrkJwgZml4dHVyZeuKlCDquLDsobQg66CI7L2U65OcIOygleuztOuhnCDqsrDqs7wg7LaU6rCAXG4gICAgICAgICAgY29uc3Qgc2tpcHBlZCA9IHRoaXMuc2tpcHBlZEZpeHR1cmVzLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgaWYgKHNraXBwZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICBkYXRhOiBhd2FpdCB0cngoZW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHNraXBwZWQuZXhpc3RpbmdJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgY29uc3QgdXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRlZElkID0gdXVpZFRvSWQ/LmdldChyZWYudXVpZCk7XG5cbiAgICAgICAgICAgIGlmIChpbnNlcnRlZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgICBkYXRhOiBhd2FpdCB0cngoZW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIGluc2VydGVkSWQpLmZpcnN0KCksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oYEluc2VydGVkIGludG8gJHtlbnRpdHkudGFibGV9OiAjJHtmaXh0dXJlLmlkfSAtPiAjJHtpbnNlcnRlZElkfWApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUocmVzdWx0cywgKHIpID0+IGAke3IuZW50aXR5SWR9IyR7ci5kYXRhLmlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeHR1cmVSZWNvcmTrpbwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ1cbiAgICogQHBhcmFtIGluc2VydGVkSWRzQnlUYWJsZSDsnbTrr7ggdXBzZXJ065CcIO2FjOydtOu4lOydmCB1dWlk4oaSaWQg66ek7ZWRICjroIjrsqjrs4Qg7LKY66asIOyLnCDsgqzsmqkpXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRml4dHVyZShcbiAgICBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkLFxuICAgIGluc2VydGVkSWRzQnlUYWJsZT86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZWQgY29sdW1u7J2AIElOU0VSVOyXkOyEnCDsoJzsmbggKERC6rCAIOyekOuPmSDsg53shLEpXG4gICAgICBpZiAoXCJnZW5lcmF0ZWRcIiBpbiBwcm9wICYmIHByb3AuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCDsspjrpqw6IE92ZXJyaWRlIOuqqOuTnOydvCDrlYzrp4wg6riw7KG0IOqwkiDsgqzsmqlcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g7IOIIOugiOy9lOuTnDog7KCc7Jm4IOKGkiBJTlNFUlQgKERCL1Vwc2VydEJ1aWxkZXLqsIAg7IOd7ISxKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgUmVnaXN0ZXJpbmcgJHtlbnRpdHkudGFibGV9IC0gJHtpbnNwZWN0KHJvdywgZmFsc2UsIG51bGwsIHRydWUpfWApKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmJ1aWxkZXIucmVnaXN0ZXIoZW50aXR5LnRhYmxlLCByb3cpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHJlZik7XG5cbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIOy7rOufvCDqsJIg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wOiBFbnRpdHlQcm9wLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgLy8gVXBzZXJ0QnVpbGRlci5yZWdpc3RlcuyXkOyEnCBKU09OLnN0cmluZ2lmeSDsspjrpqztlZjrr4DroZwgb2JqZWN0IOq3uOuMgOuhnCDsoITri6xcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyhcbiAgICB0cng6IEtuZXguVHJhbnNhY3Rpb24sXG4gICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgY29uc3Qgc291cmNlUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICAgIGlmICghc291cmNlUmVmKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgc291cmNlVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZVV1aWRUb0lkPy5nZXQoc291cmNlUmVmLnV1aWQpO1xuXG4gICAgICBpZiAoc291cmNlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnZhbHVlKSkge1xuICAgICAgICAgIC8vIOyEoO2DneuQmOyngCDslYrsnYAgTWFueVRvTWFueSDqtIDqs4TripQg7KCA7J6l7ZWY7KeAIOyViuydjFxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBpZiAodGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhcmdldFRhYmxlLnRhYmxlKSA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgam9pblRhYmxlID0gKHByb3AgYXMgTWFueVRvTWFueVJlbGF0aW9uUHJvcCkuam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSBmaXh0dXJlLmNvbHVtbnNbcHJvcC5uYW1lXT8udmFsdWUgYXMgbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVmSWQgPT09IG51bGwgfHwgcmVmSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgY29uc3QgcmVmRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlZklkfWA7XG4gICAgICAgICAgLy8g7J2066+4IOyymOumrOuQkOqxsOuCmCwg7ZiE7J6sIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg6rK97JqwICjsmbjrtoAg7LC47KGwKVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzZWQuaGFzKHJlZkZpeHR1cmVJZCkgfHwgIXJlbWFpbmluZy5oYXMocmVmRml4dHVyZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNhblByb2Nlc3MpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChmaXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdJZHMgPSBBcnJheS5mcm9tKHJlbWFpbmluZykuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENpcmN1bGFyIHNlbGYtcmVmZXJlbmNlIGRldGVjdGVkIGluICR7ZW50aXR5LnRhYmxlfS4gUmVtYWluaW5nIGZpeHR1cmVzOiAke3JlbWFpbmluZ0lkc31gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICBwcm9jZXNzZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIH1cblxuICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1VuaXF1ZVZpb2xhdGlvbihkYjogS25leCwgZW50aXR5OiBFbnRpdHksIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpIHtcbiAgICBjb25zdCBfdW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gX3VuaXF1ZUluZGV4ZXMuZmlsdGVyKChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGNvbHVtbikgPT4gIWNvbHVtbi5uYW1lLnN0YXJ0c1dpdGgoYCR7ZW50aXR5LnRhYmxlfV9fYCkpLFxuICAgICk7XG4gICAgaWYgKHVuaXF1ZUluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgdW5pcXVlUXVlcnkgPSBkYihlbnRpdHkudGFibGUpO1xuICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdW5pcXVlSW5kZXhlcykge1xuICAgICAgLy8g7Lus65+8IOykkSDtlZjrgpjrnbzrj4QgbnVsbOydtOuptCDsnKDri4jtgawg7KCc7JW97J2EIOychOuwmO2VmOyngCDslYrquLAg65WM66y47JeQIO2VtOuLuSDsnbjrjbHsiqTripQg66y07IucXG4gICAgICBjb25zdCBjb250YWluc051bGwgPSBpbmRleC5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlID09PSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoY29udGFpbnNOdWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB1bmlxdWVRdWVyeSA9IHVuaXF1ZVF1ZXJ5Lm9yV2hlcmUoKHFiKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGluZGV4LmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKSkge1xuICAgICAgICAgICAgcWIud2hlcmVJbihjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHFiLmFuZFdoZXJlKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhhc0NvbmRpdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFt1bmlxdWVGb3VuZF0gPSBhd2FpdCB1bmlxdWVRdWVyeTtcbiAgICByZXR1cm4gdW5pcXVlRm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgIGRiOiBLbmV4LFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJTdGFydCA9IGNvbnRlbnQuaW5kZXhPZihcImNvbnN0IGZpeHR1cmVMb2FkZXIgPSB7XCIpO1xuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJFbmQgPSBjb250ZW50LmluZGV4T2YoXCJ9O1wiLCBmaXh0dXJlTG9hZGVyU3RhcnQpO1xuXG4gICAgaWYgKGZpeHR1cmVMb2FkZXJTdGFydCAhPT0gLTEgJiYgZml4dHVyZUxvYWRlckVuZCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtjb250ZW50LnNsaWNlKDAsIGZpeHR1cmVMb2FkZXJFbmQpfSAgJHtjb2RlfVxcbiR7Y29udGVudC5zbGljZShmaXh0dXJlTG9hZGVyRW5kKX1gO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiY2hhbGsiLCJleGVjU3luYyIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJpbmZsZWN0aW9uIiwidW5pcXVlIiwiaW5zcGVjdCIsIlNvbmFtdSIsIkJhc2VNb2RlbCIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIlVwc2VydEJ1aWxkZXIiLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiaXNUZXN0IiwiUmVsYXRpb25HcmFwaCIsIkZpeHR1cmVNYW5hZ2VyQ2xhc3MiLCJfdGRiIiwidGRiIiwiRXJyb3IiLCJfZmRiIiwiZmRiIiwiY2FjaGVkVGFibGVOYW1lcyIsInJlbGF0aW9uR3JhcGgiLCJidWlsZGVyIiwiZml4dHVyZVJlZk1hcCIsIk1hcCIsInNraXBwZWRGaXh0dXJlcyIsImluaXQiLCJkYkNvbmZpZyIsInRlc3QiLCJwcm9kdWN0aW9uX21hc3RlciIsInRDb25uIiwiY29ubmVjdGlvbiIsInBDb25uIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImZpeHR1cmUiLCJzeW5jIiwiZml4dHVyZUNvbm4iLCJ0ZXN0Q29ubiIsInRlc3RQZ0VudiIsIlBHUEFTU1dPUkQiLCJwYXNzd29yZCIsInVzZXIiLCJzdGRpbyIsImVudiIsInByb2Nlc3MiLCJmaXh0dXJlUGdFbnYiLCJkdW1wQ21kIiwicmVzdG9yZUNtZCIsInNoZWxsIiwicmVzZXRTZXF1ZW5jZXMiLCJ0ZXN0RGIiLCJlbnRpdGllcyIsImdldEFsbEVudGl0aWVzIiwiZW50aXR5IiwidGFibGVOYW1lIiwidGFibGUiLCJpZCIsInRvTG93ZXJDYXNlIiwiaWRQcm9wIiwicHJvcHMiLCJmaW5kIiwicCIsIm5hbWUiLCJpZFR5cGUiLCJ0eXBlIiwiY29uc29sZSIsImxvZyIsInJhdyIsImRlc3Ryb3kiLCJ2aXNpdGVkUmVjb3JkcyIsIlNldCIsImltcG9ydEZpeHR1cmUiLCJlbnRpdHlJZCIsImlkcyIsImNsZWFyIiwicXVlcmllcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJnZXRJbXBvcnRRdWVyaWVzIiwiZmxhdCIsIndkYiIsImdldERCIiwicXVlcnkiLCJmaWVsZCIsInJlY29yZEtleSIsImhhcyIsImFkZCIsImdldCIsInJvdyIsIndoZXJlIiwibGltaXQiLCJ1bmRlZmluZWQiLCJmaXh0dXJlRGF0YWJhc2UiLCJyZWFsRGF0YWJhc2UiLCJzZWxmUXVlcnkiLCJhcmdzIiwiT2JqZWN0IiwiZW50cmllcyIsInJlbGF0aW9ucyIsImZpbHRlciIsInJlbGF0aW9uIiwiY3VzdG9tSm9pbkNsYXVzZSIsImhhc0pvaW5Db2x1bW4iLCJyZWxhdGVkRW50aXR5Iiwid2l0aCIsInJlbGF0ZWRJZENvbHVtbk5hbWUiLCJhcmciLCJyZWxRdWVyaWVzIiwicmV2ZXJzZSIsImdldEZpeHR1cmVzIiwic291cmNlREJOYW1lIiwidGFyZ2V0REJOYW1lIiwic2VhcmNoT3B0aW9ucyIsImR1cGxpY2F0ZUNoZWNrIiwic291cmNlREIiLCJ0YXJnZXREQiIsInZhbHVlIiwic2VhcmNoVHlwZSIsImNvbHVtbiIsInByb3AiLCJyb3dzIiwibGVuZ3RoIiwiZml4dHVyZXMiLCJpbml0aWFsUmVjb3Jkc0xlbmd0aCIsIm5ld1JlY29yZHMiLCJjcmVhdGVGaXh0dXJlUmVjb3JkIiwiX2RiIiwicHVzaCIsImN1cnJlbnRGaXh0dXJlUmVjb3JkIiwiciIsImZpeHR1cmVJZCIsImZldGNoZWRSZWNvcmRzIiwic2xpY2UiLCJjdXN0b21Db2x1bW5zIiwiY29sdW1ucyIsImN1c3RvbUR1cGxpY2F0ZVJvdyIsImNoZWNrRHVwbGljYXRlQnlDb2x1bW5zIiwicmVjb3JkIiwic2luZ2xlUmVjb3JkIiwidGFyZ2V0IiwidW5pcXVlUm93IiwiY2hlY2tVbmlxdWVWaW9sYXRpb24iLCJmIiwib3B0aW9ucyIsInJlY29yZHMiLCJ2aXNpdGVkRW50aXRpZXMiLCJjcmVhdGUiLCJiZWxvbmdzUmVjb3JkcyIsImRiIiwidGhyb3VnaFRhYmxlIiwiam9pblRhYmxlIiwiZnJvbUNvbHVtbiIsInNpbmd1bGFyaXplIiwidG9Db2x1bW4iLCJyZWxhdGVkSWRzIiwicGx1Y2siLCJqb2luQ29sdW1uIiwicmVsYXRlZFByb3AiLCJma0NvbHVtbiIsInJlbGF0ZWRSb3ciLCJmaXJzdCIsInJlbGF0ZWRJZCIsImluc2VydEZpeHR1cmVzIiwiZGJOYW1lIiwiX2ZpeHR1cmVzIiwicmVzdWx0cyIsImJ1aWxkR3JhcGgiLCJpbnNlcnRpb25PcmRlciIsImdldEluc2VydGlvbk9yZGVyIiwiaGFzVGFyZ2V0IiwiaGFzVW5pcXVlIiwiaGFzRHVwbGljYXRlIiwib3ZlcnJpZGUiLCJleGlzdGluZ0lkIiwic2V0IiwieWVsbG93IiwiZml4dHVyZXNCeVRhYmxlIiwidGFibGVPcmRlciIsInRyYW5zYWN0aW9uIiwidHJ4IiwiaW5zZXJ0ZWRJZHNCeVRhYmxlIiwidGFibGVGaXh0dXJlcyIsImxldmVscyIsImdyb3VwRml4dHVyZXNCeUxldmVsIiwibGV2ZWxGaXh0dXJlcyIsInJlZ2lzdGVyRml4dHVyZSIsImJsdWUiLCJnZXRUYWJsZSIsInV1aWRzIiwidXVpZCIsImluZGV4T2YiLCJ1cHNlcnQiLCJleGlzdGluZ01hcCIsImkiLCJ3YXJuIiwicHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMiLCJlIiwiZ3JheSIsIm1heElkUmVzdWx0IiwibWF4IiwibWF4SWQiLCJtYXhfaWQiLCJncmVlbiIsIl9lcnIiLCJza2lwcGVkIiwiZGF0YSIsInJlZiIsInV1aWRUb0lkIiwiaW5zZXJ0ZWRJZCIsImV4aXN0aW5nUmVjb3JkIiwiaXNPdmVycmlkZU1vZGUiLCJwcm9wTmFtZSIsImdlbmVyYXRlZCIsInJlbGF0ZWRGaXh0dXJlSWQiLCJza2lwcGVkRXhpc3RpbmdJZCIsInJlbGF0ZWRSZWYiLCJyZWxhdGVkSW5zZXJ0ZWRJZHMiLCJhY3R1YWxJZCIsImNvbnZlcnRDb2x1bW5WYWx1ZSIsInJlZ2lzdGVyIiwiRGF0ZSIsInNvdXJjZVJlZiIsInNvdXJjZVV1aWRUb0lkIiwic291cmNlSWQiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXRUYWJsZSIsImhhc1RhYmxlIiwic291cmNlQ29sdW1uIiwidGFyZ2V0Q29sdW1uIiwidGFyZ2V0SWQiLCJyZWxhdGVkVXVpZFRvSWQiLCJyZXNvbHZlZElkIiwiZm91bmQiLCJpbnNlcnQiLCJzZWxmUmVmUHJvcHMiLCJyZW1haW5pbmciLCJwcm9jZXNzZWQiLCJzaXplIiwiY3VycmVudExldmVsIiwiY2FuUHJvY2VzcyIsImV2ZXJ5IiwicmVmSWQiLCJyZWZGaXh0dXJlSWQiLCJyZW1haW5pbmdJZHMiLCJmcm9tIiwiam9pbiIsImRlbGV0ZSIsIl91bmlxdWVJbmRleGVzIiwiaW5kZXhlcyIsInVuaXF1ZUluZGV4ZXMiLCJpbmRleCIsInN0YXJ0c1dpdGgiLCJ1bmlxdWVRdWVyeSIsImhhc0NvbmRpdGlvbiIsImNvbnRhaW5zTnVsbCIsInNvbWUiLCJyZXBsYWNlIiwib3JXaGVyZSIsInFiIiwid2hlcmVJbiIsImFuZFdoZXJlIiwidW5pcXVlRm91bmQiLCJ3aGVyZUNsYXVzZSIsImRiQ29sdW1uIiwiYWRkRml4dHVyZUxvYWRlciIsImNvZGUiLCJwYXRoIiwiYXBpUm9vdFBhdGgiLCJjb250ZW50IiwidG9TdHJpbmciLCJmaXh0dXJlTG9hZGVyU3RhcnQiLCJmaXh0dXJlTG9hZGVyRW5kIiwibmV3Q29udGVudCIsIkZpeHR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFDekMsU0FBU0MsWUFBWSxFQUFFQyxhQUFhLFFBQVEsS0FBSztBQUNqRCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsU0FBUyxRQUFRLDRCQUF5QjtBQUVuRCxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBcUJDLGFBQWEsUUFBUSxnQ0FBNkI7QUFFdkUsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQU9FQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxzQkFBc0IsRUFDdEJDLGNBQWMsRUFDZEMsYUFBYSxRQUdSLG9CQUFpQjtBQUN4QixTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQVNDLGFBQWEsUUFBUSx1QkFBb0I7QUFTbEQsT0FBTyxNQUFNQztJQUNIQyxPQUFvQixLQUFLO0lBQ2pDLElBQUlDLElBQUlBLEdBQVMsRUFBRTtRQUNqQixJQUFJLENBQUNELElBQUksR0FBR0M7SUFDZDtJQUNBLElBQUlBLE1BQVk7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
|
|
766
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNraXBwZWRGaXh0dXJlczogTWFwPHN0cmluZywgeyBlbnRpdHlJZDogc3RyaW5nOyBleGlzdGluZ0lkOiBudW1iZXIgfCBzdHJpbmcgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcblxuICAgIC8vIDMuIOyLnO2AgOyKpCDrpqzshYsgKOuNsOydtO2EsCDrs7Xsgqwg7ZuEIOyLnO2AgOyKpOulvCBNQVgoaWQp66GcIOygleugrClcbiAgICBhd2FpdCB0aGlzLnJlc2V0U2VxdWVuY2VzKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6Ag7YWM7J2067iU7J2YIOyLnO2AgOyKpOulvCDtmITsnqwgTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAqIGZpeHR1cmUgc3luYyDtm4Qg7Iuc7YCA7Iqk6rCAIOyLpOygnCDrjbDsnbTthLDsmYAg66ee7KeAIOyViuuKlCDrrLjsoJzrpbwg7ZW06rKw7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFNlcXVlbmNlcyhkYkNvbmZpZzogU29uYW11REJDb25maWdbXCJ0ZXN0XCJdKSB7XG4gICAgY29uc3QgdGVzdERiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGUgfHwgZW50aXR5LmlkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDtmZXsnbjtlanri4jri6RcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGZpeHR1cmVTdHJhdGVneT1zZXF1ZW5jZeyduCDqsr3smrDsl5Drp4wg66as7IWL7ZWp64uI64ukXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgaWRUeXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuXG4gICAgICAgIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc3RncmVTUUwg7Iuc7YCA7Iqk66W8IO2YhOyerCDthYzsnbTruJTsnZggTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAgICAgIC8vIHN0cmluZyDtg4DsnoXsnZgg6rK97JqwIOyIq+yekCDsupDsiqTtjIXsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgICBjb25zdCBtYXhFeHByID0gaWRUeXBlID09PSBcInN0cmluZ1wiID8gXCJNQVgoaWQ6OmJpZ2ludClcIiA6IFwiTUFYKGlkKVwiO1xuICAgICAgICBhd2FpdCB0ZXN0RGIucmF3KGBcbiAgICAgICAgICBTRUxFQ1Qgc2V0dmFsKFxuICAgICAgICAgICAgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSgncHVibGljLiR7dGFibGVOYW1lfScsICdpZCcpLFxuICAgICAgICAgICAgQ09BTEVTQ0UoKFNFTEVDVCAke21heEV4cHJ9IEZST00gJHt0YWJsZU5hbWV9KSwgMSlcbiAgICAgICAgICApXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZXN0RGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRhcmdldERCLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHNvdXJjZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgLy8g7Jet67Cp7ZalIE9uZVRvT25lOiBGS+ulvCDqsIDsp4Qg6rSA66CoIOyXlO2LsO2LsOulvCDssL7sirXri4jri6RcbiAgICAgICAgICAvLyDsmIjsi5w6IFVzZXIgT25lVG9PbmUgRW1wbG95ZWUgKEVtcGxveWVl6rCAIHVzZXJfaWQgRkvrpbwg6rCA7KeQKVxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wICYmIGlzUmVsYXRpb25Qcm9wKHJlbGF0ZWRQcm9wKSkge1xuICAgICAgICAgICAgLy8g6rSA66CoIOyXlO2LsO2LsOyXkOyEnCBGSyDsu6zrn7zsnLzroZwg7L+866as7ZWp64uI64ukIChpZOqwgCDslYTri5gpXG4gICAgICAgICAgICBjb25zdCBma0NvbHVtbiA9IGAke3JlbGF0ZWRQcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShma0NvbHVtbiwgcm93LmlkKS5maXJzdCgpO1xuICAgICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRSb3c/LmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IHJvd1tgJHtwcm9wLm5hbWV9X2lkYF07XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICBpZiAocmVsYXRlZElkKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVsb25nc1JlY29yZHMucHVzaChgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW9wdGlvbnM/LnNpbmdsZVJlY29yZCAmJiByZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKHJlbGF0ZWRFbnRpdHksIHJlbGF0ZWRSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICB9O1xuXG4gICAgYXdhaXQgY3JlYXRlKGVudGl0eSwgcm93KTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW2RiTmFtZV0pO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrBcbiAgICAgIHRoaXMucmVsYXRpb25HcmFwaC5idWlsZEdyYXBoKGZpeHR1cmVzKTtcbiAgICAgIGNvbnN0IGluc2VydGlvbk9yZGVyID0gdGhpcy5yZWxhdGlvbkdyYXBoLmdldEluc2VydGlvbk9yZGVyKCk7XG5cbiAgICAgIC8vIDIuIOyKpO2Cte2VoCBmaXh0dXJlIOuovOyggCDsspjrpqwgKG92ZXJyaWRlIOyytO2BrClcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIGluc2VydGlvbk9yZGVyKSB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlcy5maW5kKChmKSA9PiBmLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkKTtcbiAgICAgICAgaWYgKCFmaXh0dXJlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBoYXNUYXJnZXQgPSAhIWZpeHR1cmUudGFyZ2V0O1xuICAgICAgICBjb25zdCBoYXNVbmlxdWUgPSAhIWZpeHR1cmUudW5pcXVlO1xuICAgICAgICBjb25zdCBoYXNEdXBsaWNhdGUgPSBoYXNUYXJnZXQgfHwgaGFzVW5pcXVlO1xuXG4gICAgICAgIC8vIOykkeuzteydtCDsnojqs6Agb3ZlcnJpZGU9ZmFsc2Xsnbgg6rK97JqwOiDsiqTtgrVcbiAgICAgICAgaWYgKGhhc0R1cGxpY2F0ZSAmJiAhZml4dHVyZS5vdmVycmlkZSkge1xuICAgICAgICAgIC8vIOq4sOyhtCDroIjsvZTrk5wgSUQg7KCA7J6lICh1bmlxdWUg7Jqw7ISgLCDsl4bsnLzrqbQgdGFyZ2V0KVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBmaXh0dXJlLnVuaXF1ZT8uaWQgPz8gZml4dHVyZS50YXJnZXQ/LmlkO1xuICAgICAgICAgIGFzc2VydChleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLnNraXBwZWRGaXh0dXJlcy5zZXQoZml4dHVyZUlkLCB7XG4gICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgIGV4aXN0aW5nSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFNraXBwZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9IChleGlzdGluZzogIyR7ZXhpc3RpbmdJZH0sIG92ZXJyaWRlOiBmYWxzZSlgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSR7Zml4dHVyZS5vdmVycmlkZSA/IGAgKG92ZXJyaWRlKWAgOiBcIlwifWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwc2VydCDsi6Ttlokg7KCEIHV1aWQg66qp66GdIOyggOyepVxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LnV1aWQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICBgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzIChsZXZlbCAke2xldmVscy5pbmRleE9mKGxldmVsRml4dHVyZXMpICsgMX0vJHtsZXZlbHMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSAoYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydChcbiAgICAgICAgICAgICAgdHJ4LFxuICAgICAgICAgICAgICB0YWJsZU5hbWUgYXMga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gICAgICAgICAgICApKSBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuXG4gICAgICAgICAgICAvLyDsiJzshJwg6riw67CYIHV1aWQgLT4gaWQg66ek7ZWRXG4gICAgICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDsl4bsnLzrr4DroZwg65Ox66GdIOyInOyEnCA9IOuwmO2ZmCDsiJzshJwg67O07J6lXG4gICAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCAmJiB1dWlkcy5sZW5ndGggPT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdNYXAgPVxuICAgICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPigpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KHV1aWRzW2ldLCBpZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBleGlzdGluZ01hcCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHV1aWRzLmxlbmd0aCAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgYFdhcm5pbmc6IHV1aWQgY291bnQgKCR7dXVpZHMubGVuZ3RofSkgIT0gaWQgY291bnQgKCR7aWRzLmxlbmd0aH0pIGZvciAke3RhYmxlTmFtZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA2LiBQb3N0Z3JlU1FMIOyLnO2AgOyKpCDrpqzshYtcbiAgICAgICAgLy8gRml4dHVyZSDsgr3snoUg7ZuEIOqwgSDthYzsnbTruJTsnZggSUQg7Iuc7YCA7Iqk66W8IOy1nOuMgCBJRCDqsJLsnLzroZwg7JeF642w7J207Yq47ZWp64uI64ukLlxuICAgICAgICAvLyDsnbTroIfqsowg7ZWY7KeAIOyViuycvOuptCDri6TsnYwgSU5TRVJUIOyLnCBJROqwgCAyMDAw67KI64yA66GcIOyDneyEseuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlc2V0dGluZyBzZXF1ZW5jZXMuLi5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eeulvCDssL7slYTshJwgaWQg7YOA7J6FIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpLmZpbmQoXG4gICAgICAgICAgICAgIChlKSA9PiBlLnRhYmxlID09PSB0YWJsZU5hbWUgfHwgZS5pZC50b0xvd2VyQ2FzZSgpID09PSB0YWJsZU5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMIChzdHJpbmcg7YOA7J6F7J2AIOyIq+yekCDsupDsiqTtjIUg7ZWE7JqUKVxuICAgICAgICAgICAgY29uc3QgZW50aXR5MiA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkVHlwZTIgPSBlbnRpdHkyPy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik/LnR5cGU7XG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9XG4gICAgICAgICAgICAgIGlkVHlwZTIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRyeFxuICAgICAgICAgICAgICAgICAgICAucmF3KGBTRUxFQ1QgTUFYKGlkOjpiaWdpbnQpIGFzIG1heF9pZCBGUk9NIFwiJHt0YWJsZU5hbWV9XCJgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gci5yb3dzWzBdKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgdHJ4KHRhYmxlTmFtZSkubWF4KFwiaWQgYXMgbWF4X2lkXCIpLmZpcnN0KCk7XG4gICAgICAgICAgICBjb25zdCBtYXhJZCA9IG1heElkUmVzdWx0Py5tYXhfaWQ7XG5cbiAgICAgICAgICAgIGlmIChtYXhJZCAhPT0gbnVsbCAmJiBtYXhJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIOyLnO2AgOyKpOuqheydhCBwZ19nZXRfc2VyaWFsX3NlcXVlbmNl66GcIOyViOyghO2VmOqyjCDsobDtmoxcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4LnJhdyhgU0VMRUNUIHNldHZhbChwZ19nZXRfc2VyaWFsX3NlcXVlbmNlKD8sICdpZCcpLCA/KWAsIFtcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbWF4SWQsXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFJlc2V0IHNlcXVlbmNlIGZvciAke3RhYmxlTmFtZX06ICR7bWF4SWR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNy4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKiBAcGFyYW0gaW5zZXJ0ZWRJZHNCeVRhYmxlIOydtOuvuCB1cHNlcnTrkJwg7YWM7J2067iU7J2YIHV1aWTihpJpZCDrp6TtlZEgKOugiOuyqOuzhCDsspjrpqwg7IucIOyCrOyaqSlcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAvLyBPdmVycmlkZSDrqqjrk5wg7YyQ64uoOiB0YXJnZXQg65iQ64qUIHVuaXF1ZeqwgCDsnojqs6Agb3ZlcnJpZGU9dHJ1ZeyduCDqsr3smrBcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGZpeHR1cmUudGFyZ2V0ID8/IGZpeHR1cmUudW5pcXVlO1xuICAgIGNvbnN0IGlzT3ZlcnJpZGVNb2RlID0gZml4dHVyZS5vdmVycmlkZSAmJiBleGlzdGluZ1JlY29yZDtcblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW7snYAgSU5TRVJU7JeQ7IScIOygnOyZuCAoRELqsIAg7J6Q64+ZIOyDneyEsSlcbiAgICAgIGlmIChcImdlbmVyYXRlZFwiIGluIHByb3AgJiYgcHJvcC5nZW5lcmF0ZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkIOyymOumrDogT3ZlcnJpZGUg66qo65Oc7J28IOuVjOunjCDquLDsobQg6rCSIOyCrOyaqVxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgaWYgKGlzT3ZlcnJpZGVNb2RlICYmIGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgICAgICAgLy8gT3ZlcnJpZGU6IOq4sOyhtCDroIjsvZTrk5zsnZgg6rCSIOyCrOyaqSDihpIgVVBEQVRFXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGV4aXN0aW5nUmVjb3JkLmNvbHVtbnNbcHJvcE5hbWVdPy52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyDsg4gg66CI7L2U65OcOiDsoJzsmbgg4oaSIElOU0VSVCAoREIvVXBzZXJ0QnVpbGRlcuqwgCDsg53shLEpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVsYXRlZElkICE9PSBudWxsICYmIHJlbGF0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuXG4gICAgICAgICAgICAvLyDrqLzsoIAgc2tpcOuQnCBmaXh0dXJl7J247KeAIO2ZleyduFxuICAgICAgICAgICAgY29uc3Qgc2tpcHBlZEV4aXN0aW5nSWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQocmVsYXRlZEZpeHR1cmVJZCk/LmV4aXN0aW5nSWQ7XG4gICAgICAgICAgICBpZiAoc2tpcHBlZEV4aXN0aW5nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBza2lw65CcIGZpeHR1cmUg4oaSIHRhcmdldCBEQuydmCDquLDsobQg66CI7L2U65OcIGlkIOyCrOyaqVxuICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBza2lwcGVkRXhpc3RpbmdJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICAgIC8vIOydtOuvuCB1cHNlcnTrkJwg6rCZ7J2AIO2FjOydtOu4lCBmaXh0dXJlIO2ZleyduFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJbnNlcnRlZElkcyA9IGluc2VydGVkSWRzQnlUYWJsZT8uZ2V0KHJlbGF0ZWRFbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbElkID0gcmVsYXRlZEluc2VydGVkSWRzPy5nZXQocmVsYXRlZFJlZi51dWlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3R1YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CoIOKGkiDsi6TsoJwgSUQg7IKs7JqpXG4gICAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBhY3R1YWxJZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8g7JWE7KeBIHVwc2VydCDslYjrkKgg4oaSIFVCUmVmIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZFJlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZml4dHVyZXPsl5Ag7Y+s7ZWo65CY7KeAIOyViuydgCDroIjsvZTrk5wg4oaSIElEIOq3uOuMgOuhnCDsgqzsmqlcbiAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFzTWFueSwgTWFueVRvTWFueeuKlCDrs4Trj4Qg7LKY66asXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg7Lus65+8XG4gICAgICAgIHJvd1twcm9wTmFtZV0gPSB0aGlzLmNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wIGFzIEVudGl0eVByb3AsIGNvbHVtbi52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBSZWdpc3RlcmluZyAke2VudGl0eS50YWJsZX0gLSAke2luc3BlY3Qocm93LCBmYWxzZSwgbnVsbCwgdHJ1ZSl9YCkpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuYnVpbGRlci5yZWdpc3RlcihlbnRpdHkudGFibGUsIHJvdyk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwLnNldChmaXh0dXJlLmZpeHR1cmVJZCwgcmVmKTtcblxuICAgIHJldHVybiByZWY7XG4gIH1cblxuICAvKipcbiAgICog7Lus65+8IOqwkiDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgY29udmVydENvbHVtblZhbHVlKHByb3A6IEVudGl0eVByb3AsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAvLyBVcHNlcnRCdWlsZGVyLnJlZ2lzdGVy7JeQ7IScIEpTT04uc3RyaW5naWZ5IOyymOumrO2VmOuvgOuhnCBvYmplY3Qg6re464yA66GcIOyghOuLrFxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKFxuICAgIHRyeDogS25leC5UcmFuc2FjdGlvbixcbiAgICBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICAgIGluc2VydGVkSWRzQnlUYWJsZTogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICBjb25zdCBzb3VyY2VSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcblxuICAgICAgaWYgKCFzb3VyY2VSZWYpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBzb3VyY2VVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgIGNvbnN0IHNvdXJjZUlkID0gc291cmNlVXVpZFRvSWQ/LmdldChzb3VyY2VSZWYudXVpZCk7XG5cbiAgICAgIGlmIChzb3VyY2VJZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBbLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkgJiYgQXJyYXkuaXNBcnJheShjb2x1bW4udmFsdWUpKSB7XG4gICAgICAgICAgLy8g7ISg7YOd65CY7KeAIOyViuydgCBNYW55VG9NYW55IOq0gOqzhOuKlCDsoIDsnqXtlZjsp4Ag7JWK7J2MXG4gICAgICAgICAgY29uc3QgdGFyZ2V0VGFibGUgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGlmICh0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFyZ2V0VGFibGUudGFibGUpID09PSBmYWxzZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gY29sdW1uLnZhbHVlIGFzIG51bWJlcltdO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBqb2luVGFibGUgPSAocHJvcCBhcyBNYW55VG9NYW55UmVsYXRpb25Qcm9wKS5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG5cbiAgICAgICAgICAgIGxldCB0YXJnZXRJZDogbnVtYmVyIHwgc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHJlbGF0ZWRFbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZElkID0gcmVsYXRlZFV1aWRUb0lkPy5nZXQocmVsYXRlZFJlZi51dWlkKTtcblxuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFJlbGF0ZWQgZml4dHVyZSAke3JlbGF0ZWRGaXh0dXJlSWR9IG5vdCBmb3VuZCBpbiBpbnNlcnRlZElkcywgc2tpcHBpbmdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZXNvbHZlZElkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEpvaW5UYWJsZeyXkCDsgr3snoVcbiAgICAgICAgICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCB0cngoam9pblRhYmxlKVxuICAgICAgICAgICAgICAud2hlcmUoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5saW1pdCgxKTtcblxuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICBhd2FpdCB0cngoam9pblRhYmxlKS5pbnNlcnQoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICAgIGBJbnNlcnRlZCBpbnRvICR7am9pblRhYmxlfTogJHtlbnRpdHkudGFibGV9KCR7c291cmNlSWR9KSAtICR7cmVsYXRlZEVudGl0eS50YWJsZX0oJHt0YXJnZXRJZH0pYCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCZ7J2AIO2FjOydtOu4lCDrgrQgZml4dHVyZeuTpOydhCBzZWxmLXJlZmVyZW5jZSDroIjrsqjrs4TroZwg67aE7ZWgXG4gICAqIC0gc2VsZi1yZWZlcmVuY2XqsIAg7JeG64qUIGZpeHR1cmXrk6Q6IExldmVsIDBcbiAgICogLSBMZXZlbCAw7J2EIOywuOyhsO2VmOuKlCBmaXh0dXJl65OkOiBMZXZlbCAxXG4gICAqIC0g67CY67O1XG4gICAqXG4gICAqIFVwc2VydEJ1aWxkZXLqsIAgc2VsZi1yZWZlcmVuY2XqsIAg7J6I7Jy866m0IGJ1aWxkSW5zZXJ0TGV2ZWxzKCnroZwg7J6s7KCV66Cs7ZWY7JesXG4gICAqIOuTseuhnSDsiJzshJzsmYAg67CY7ZmYIOyInOyEnOqwgCDri6zrnbzsp4gg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2066W8IOuwqeyngO2VmOq4sCDsnITtlbQgRml4dHVyZU1hbmFnZXLqsIAg66CI67Ko67OE66GcIOuCmOuIoOyEnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdyb3VwRml4dHVyZXNCeUxldmVsKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiBGaXh0dXJlUmVjb3JkW11bXSB7XG4gICAgaWYgKGZpeHR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmVzWzBdLmVudGl0eUlkKTtcblxuICAgIC8vIHNlbGYtcmVmZXJlbmNlIHJlbGF0aW9uIHByb3Ag7LC+6riwXG4gICAgY29uc3Qgc2VsZlJlZlByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgfCBPbmVUb09uZVJlbGF0aW9uUHJvcCA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocCkgJiYgcC5oYXNKb2luQ29sdW1uKSkgJiZcbiAgICAgICAgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgKTtcblxuICAgIGlmIChzZWxmUmVmUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBzZWxmLXJlZmVyZW5jZSDsl4bsnYwg4oaSIOuLqOydvCDroIjrsqhcbiAgICAgIHJldHVybiBbZml4dHVyZXNdO1xuICAgIH1cblxuICAgIC8vIOugiOuyqOuzhCDrtoTtlaAgKHRvcG9sb2dpY2FsIHNvcnQpXG4gICAgY29uc3QgbGV2ZWxzOiBGaXh0dXJlUmVjb3JkW11bXSA9IFtdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQoZml4dHVyZXMubWFwKChmKSA9PiBmLmZpeHR1cmVJZCkpO1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZy5zaXplID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExldmVsOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgIGlmICghcmVtYWluaW5nLmhhcyhmaXh0dXJlLmZpeHR1cmVJZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNlbGYtcmVmZXJlbmNl6rCAIOuqqOuRkCDsnbTrr7gg7LKY66as65CQ6rGw64KYIG51bGzsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNhblByb2Nlc3MgPSBzZWxmUmVmUHJvcHMuZXZlcnkoKHByb3ApID0+IHtcbiAgICAgICAgICBjb25zdCByZWZJZCA9IGZpeHR1cmUuY29sdW1uc1twcm9wLm5hbWVdPy52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWZJZCA9PT0gbnVsbCB8fCByZWZJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBjb25zdCByZWZGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVmSWR9YDtcbiAgICAgICAgICAvLyDsnbTrr7gg7LKY66as65CQ6rGw64KYLCDtmITsnqwgZml4dHVyZXPsl5Ag7Y+s7ZWo65CY7KeAIOyViuydgCDqsr3smrAgKOyZuOu2gCDssLjsobApXG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZC5oYXMocmVmRml4dHVyZUlkKSB8fCAhcmVtYWluaW5nLmhhcyhyZWZGaXh0dXJlSWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuUHJvY2Vzcykge1xuICAgICAgICAgIGN1cnJlbnRMZXZlbC5wdXNoKGZpeHR1cmUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ0lkcyA9IEFycmF5LmZyb20ocmVtYWluaW5nKS5qb2luKFwiLCBcIik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2lyY3VsYXIgc2VsZi1yZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJHtlbnRpdHkudGFibGV9LiBSZW1haW5pbmcgZml4dHVyZXM6ICR7cmVtYWluaW5nSWRzfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBjdXJyZW50TGV2ZWwpIHtcbiAgICAgICAgcmVtYWluaW5nLmRlbGV0ZShmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgIHByb2Nlc3NlZC5hZGQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgfVxuXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgIH1cblxuICAgIHJldHVybiBsZXZlbHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVW5pcXVlVmlvbGF0aW9uKGRiOiBLbmV4LCBlbnRpdHk6IEVudGl0eSwgZml4dHVyZTogRml4dHVyZVJlY29yZCkge1xuICAgIGNvbnN0IF91bmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBfdW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOyduCDqsr3smrAgX2lkIOu2meydtOq4sFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCBkYkNvbHVtbiA9IHByb3AgJiYgaXNSZWxhdGlvblByb3AocHJvcCkgPyBgJHtjb2x1bW59X2lkYCA6IGNvbHVtbjtcbiAgICAgIGNvbnN0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW2NvbHVtbl0/LnZhbHVlO1xuXG4gICAgICAvLyBudWxsIOqwkuydtCDtj6ztlajrkJwg6rK97JqwIOykkeuztSDtmZXsnbgg7Iqk7YK1XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2hlcmVDbGF1c2VbZGJDb2x1bW5dID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IGRiKGVudGl0eS50YWJsZSkud2hlcmUod2hlcmVDbGF1c2UpLmxpbWl0KDEpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpeHR1cmVMb2FkZXIoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL3Rlc3RpbmcvZml4dHVyZS50c2A7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgZml4dHVyZUxvYWRlclN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiY29uc3QgZml4dHVyZUxvYWRlciA9IHtcIik7XG4gICAgY29uc3QgZml4dHVyZUxvYWRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZihcIn07XCIsIGZpeHR1cmVMb2FkZXJTdGFydCk7XG5cbiAgICBpZiAoZml4dHVyZUxvYWRlclN0YXJ0ICE9PSAtMSAmJiBmaXh0dXJlTG9hZGVyRW5kICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2NvbnRlbnQuc2xpY2UoMCwgZml4dHVyZUxvYWRlckVuZCl9ICAke2NvZGV9XFxuJHtjb250ZW50LnNsaWNlKGZpeHR1cmVMb2FkZXJFbmQpfWA7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgbmV3Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIGZpeHR1cmVMb2FkZXIgaW4gZml4dHVyZS50c1wiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpeHR1cmVNYW5hZ2VyID0gbmV3IEZpeHR1cmVNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJjaGFsayIsImV4ZWNTeW5jIiwicmVhZEZpbGVTeW5jIiwid3JpdGVGaWxlU3luYyIsImluZmxlY3Rpb24iLCJ1bmlxdWUiLCJpbnNwZWN0IiwiU29uYW11IiwiQmFzZU1vZGVsIiwiY3JlYXRlS25leEluc3RhbmNlIiwiVXBzZXJ0QnVpbGRlciIsIkVudGl0eU1hbmFnZXIiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbFByb3AiLCJpc1Rlc3QiLCJSZWxhdGlvbkdyYXBoIiwiRml4dHVyZU1hbmFnZXJDbGFzcyIsIl90ZGIiLCJ0ZGIiLCJFcnJvciIsIl9mZGIiLCJmZGIiLCJjYWNoZWRUYWJsZU5hbWVzIiwicmVsYXRpb25HcmFwaCIsImJ1aWxkZXIiLCJmaXh0dXJlUmVmTWFwIiwiTWFwIiwic2tpcHBlZEZpeHR1cmVzIiwiaW5pdCIsImRiQ29uZmlnIiwidGVzdCIsInByb2R1Y3Rpb25fbWFzdGVyIiwidENvbm4iLCJjb25uZWN0aW9uIiwicENvbm4iLCJob3N0IiwicG9ydCIsImRhdGFiYXNlIiwiZml4dHVyZSIsInN5bmMiLCJmaXh0dXJlQ29ubiIsInRlc3RDb25uIiwidGVzdFBnRW52IiwiUEdQQVNTV09SRCIsInBhc3N3b3JkIiwidXNlciIsInN0ZGlvIiwiZW52IiwicHJvY2VzcyIsImZpeHR1cmVQZ0VudiIsImR1bXBDbWQiLCJyZXN0b3JlQ21kIiwic2hlbGwiLCJyZXNldFNlcXVlbmNlcyIsInRlc3REYiIsImVudGl0aWVzIiwiZ2V0QWxsRW50aXRpZXMiLCJlbnRpdHkiLCJ0YWJsZU5hbWUiLCJ0YWJsZSIsImlkIiwidG9Mb3dlckNhc2UiLCJpZFByb3AiLCJwcm9wcyIsImZpbmQiLCJwIiwibmFtZSIsImlkVHlwZSIsInR5cGUiLCJ1c2VzU2VxdWVuY2UiLCJjb25lIiwiZml4dHVyZVN0cmF0ZWd5IiwiY29uc29sZSIsImxvZyIsIm1heEV4cHIiLCJyYXciLCJkZXN0cm95IiwidmlzaXRlZFJlY29yZHMiLCJTZXQiLCJpbXBvcnRGaXh0dXJlIiwiZW50aXR5SWQiLCJpZHMiLCJjbGVhciIsInF1ZXJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZ2V0SW1wb3J0UXVlcmllcyIsImZsYXQiLCJ3ZGIiLCJnZXREQiIsInF1ZXJ5IiwiZmllbGQiLCJyZWNvcmRLZXkiLCJoYXMiLCJhZGQiLCJnZXQiLCJyb3ciLCJ3aGVyZSIsImxpbWl0IiwidW5kZWZpbmVkIiwiZml4dHVyZURhdGFiYXNlIiwicmVhbERhdGFiYXNlIiwic2VsZlF1ZXJ5IiwiYXJncyIsIk9iamVjdCIsImVudHJpZXMiLCJyZWxhdGlvbnMiLCJmaWx0ZXIiLCJyZWxhdGlvbiIsImN1c3RvbUpvaW5DbGF1c2UiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEVudGl0eSIsIndpdGgiLCJyZWxhdGVkSWRDb2x1bW5OYW1lIiwiYXJnIiwicmVsUXVlcmllcyIsInJldmVyc2UiLCJnZXRGaXh0dXJlcyIsInNvdXJjZURCTmFtZSIsInRhcmdldERCTmFtZSIsInNlYXJjaE9wdGlvbnMiLCJkdXBsaWNhdGVDaGVjayIsInNvdXJjZURCIiwidGFyZ2V0REIiLCJ2YWx1ZSIsInNlYXJjaFR5cGUiLCJjb2x1bW4iLCJwcm9wIiwicm93cyIsImxlbmd0aCIsImZpeHR1cmVzIiwiaW5pdGlhbFJlY29yZHNMZW5ndGgiLCJuZXdSZWNvcmRzIiwiY3JlYXRlRml4dHVyZVJlY29yZCIsIl9kYiIsInB1c2giLCJjdXJyZW50Rml4dHVyZVJlY29yZCIsInIiLCJmaXh0dXJlSWQiLCJmZXRjaGVkUmVjb3JkcyIsInNsaWNlIiwiY3VzdG9tQ29sdW1ucyIsImNvbHVtbnMiLCJjdXN0b21EdXBsaWNhdGVSb3ciLCJjaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyIsInJlY29yZCIsInNpbmdsZVJlY29yZCIsInRhcmdldCIsInVuaXF1ZVJvdyIsImNoZWNrVW5pcXVlVmlvbGF0aW9uIiwiZiIsIm9wdGlvbnMiLCJyZWNvcmRzIiwidmlzaXRlZEVudGl0aWVzIiwiY3JlYXRlIiwiYmVsb25nc1JlY29yZHMiLCJkYiIsInRocm91Z2hUYWJsZSIsImpvaW5UYWJsZSIsImZyb21Db2x1bW4iLCJzaW5ndWxhcml6ZSIsInRvQ29sdW1uIiwicmVsYXRlZElkcyIsInBsdWNrIiwiam9pbkNvbHVtbiIsInJlbGF0ZWRQcm9wIiwiZmtDb2x1bW4iLCJyZWxhdGVkUm93IiwiZmlyc3QiLCJyZWxhdGVkSWQiLCJpbnNlcnRGaXh0dXJlcyIsImRiTmFtZSIsIl9maXh0dXJlcyIsInJlc3VsdHMiLCJidWlsZEdyYXBoIiwiaW5zZXJ0aW9uT3JkZXIiLCJnZXRJbnNlcnRpb25PcmRlciIsImhhc1RhcmdldCIsImhhc1VuaXF1ZSIsImhhc0R1cGxpY2F0ZSIsIm92ZXJyaWRlIiwiZXhpc3RpbmdJZCIsInNldCIsInllbGxvdyIsImZpeHR1cmVzQnlUYWJsZSIsInRhYmxlT3JkZXIiLCJ0cmFuc2FjdGlvbiIsInRyeCIsImluc2VydGVkSWRzQnlUYWJsZSIsInRhYmxlRml4dHVyZXMiLCJsZXZlbHMiLCJncm91cEZpeHR1cmVzQnlMZXZlbCIsImxldmVsRml4dHVyZXMiLCJyZWdpc3RlckZpeHR1cmUiLCJibHVlIiwiZ2V0VGFibGUiLCJ1dWlkcyIsInV1aWQiLCJpbmRleE9mIiwidXBzZXJ0IiwiZXhpc3RpbmdNYXAiLCJpIiwid2FybiIsInByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zIiwiZSIsImdyYXkiLCJlbnRpdHkyIiwiaWRUeXBlMiIsIm1heElkUmVzdWx0IiwidGhlbiIsIm1heCIsIm1heElkIiwibWF4X2lkIiwiZ3JlZW4iLCJfZXJyIiwic2tpcHBlZCIsImRhdGEiLCJyZWYiLCJ1dWlkVG9JZCIsImluc2VydGVkSWQiLCJleGlzdGluZ1JlY29yZCIsImlzT3ZlcnJpZGVNb2RlIiwicHJvcE5hbWUiLCJnZW5lcmF0ZWQiLCJyZWxhdGVkRml4dHVyZUlkIiwic2tpcHBlZEV4aXN0aW5nSWQiLCJyZWxhdGVkUmVmIiwicmVsYXRlZEluc2VydGVkSWRzIiwiYWN0dWFsSWQiLCJjb252ZXJ0Q29sdW1uVmFsdWUiLCJyZWdpc3RlciIsIkRhdGUiLCJzb3VyY2VSZWYiLCJzb3VyY2VVdWlkVG9JZCIsInNvdXJjZUlkIiwiQXJyYXkiLCJpc0FycmF5IiwidGFyZ2V0VGFibGUiLCJoYXNUYWJsZSIsInNvdXJjZUNvbHVtbiIsInRhcmdldENvbHVtbiIsInRhcmdldElkIiwicmVsYXRlZFV1aWRUb0lkIiwicmVzb2x2ZWRJZCIsImZvdW5kIiwiaW5zZXJ0Iiwic2VsZlJlZlByb3BzIiwicmVtYWluaW5nIiwicHJvY2Vzc2VkIiwic2l6ZSIsImN1cnJlbnRMZXZlbCIsImNhblByb2Nlc3MiLCJldmVyeSIsInJlZklkIiwicmVmRml4dHVyZUlkIiwicmVtYWluaW5nSWRzIiwiZnJvbSIsImpvaW4iLCJkZWxldGUiLCJfdW5pcXVlSW5kZXhlcyIsImluZGV4ZXMiLCJ1bmlxdWVJbmRleGVzIiwiaW5kZXgiLCJzdGFydHNXaXRoIiwidW5pcXVlUXVlcnkiLCJoYXNDb25kaXRpb24iLCJjb250YWluc051bGwiLCJzb21lIiwicmVwbGFjZSIsIm9yV2hlcmUiLCJxYiIsIndoZXJlSW4iLCJhbmRXaGVyZSIsInVuaXF1ZUZvdW5kIiwid2hlcmVDbGF1c2UiLCJkYkNvbHVtbiIsImFkZEZpeHR1cmVMb2FkZXIiLCJjb2RlIiwicGF0aCIsImFwaVJvb3RQYXRoIiwiY29udGVudCIsInRvU3RyaW5nIiwiZml4dHVyZUxvYWRlclN0YXJ0IiwiZml4dHVyZUxvYWRlckVuZCIsIm5ld0NvbnRlbnQiLCJGaXh0dXJlTWFuYWdlciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxRQUFRLFFBQVEsZ0JBQWdCO0FBQ3pDLFNBQVNDLFlBQVksRUFBRUMsYUFBYSxRQUFRLEtBQUs7QUFDakQsT0FBT0MsZ0JBQWdCLGFBQWE7QUFFcEMsU0FBU0MsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FBU0MsT0FBTyxRQUFRLE9BQU87QUFDL0IsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLFNBQVNDLFNBQVMsUUFBUSw0QkFBeUI7QUFFbkQsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQW1CO0FBQ3RELFNBQXFCQyxhQUFhLFFBQVEsZ0NBQTZCO0FBRXZFLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FPRUMsMEJBQTBCLEVBQzFCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLGFBQWEsUUFHUixvQkFBaUI7QUFDeEIsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtBQUM3QyxTQUFTQyxhQUFhLFFBQVEsdUJBQW9C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
|