sonamu 0.7.21 → 0.7.22
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/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.js +2 -2
- package/dist/database/db.d.ts +1 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +5 -5
- package/dist/database/knex.d.ts +3 -0
- package/dist/database/knex.d.ts.map +1 -0
- package/dist/database/knex.js +29 -0
- package/dist/migration/migrator.d.ts +1 -1
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +7 -7
- package/dist/testing/bootstrap.d.ts +28 -0
- package/dist/testing/bootstrap.d.ts.map +1 -0
- package/dist/testing/bootstrap.js +120 -0
- package/dist/testing/fixture-loader.d.ts +21 -0
- package/dist/testing/fixture-loader.d.ts.map +1 -0
- package/dist/testing/fixture-loader.js +28 -0
- package/dist/testing/fixture-manager.d.ts +1 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +7 -7
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/naite-vitest-reporter.d.ts +12 -0
- package/dist/testing/naite-vitest-reporter.d.ts.map +1 -0
- package/dist/testing/naite-vitest-reporter.js +17 -0
- package/dist/ui/ai-client.d.ts +3 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +27 -8
- package/package.json +5 -1
- package/src/api/config.ts +2 -2
- package/src/api/sonamu.ts +1 -1
- package/src/database/db.ts +5 -5
- package/src/database/knex.ts +34 -0
- package/src/migration/migrator.ts +7 -6
- package/src/testing/bootstrap.ts +176 -0
- package/src/testing/fixture-loader.ts +28 -0
- package/src/testing/fixture-manager.ts +7 -6
- package/src/testing/index.ts +3 -0
- package/src/testing/naite-vitest-reporter.ts +18 -0
- package/src/ui/ai-client.ts +82 -50
|
@@ -3,11 +3,11 @@ import chalk from "chalk";
|
|
|
3
3
|
import { execSync } from "child_process";
|
|
4
4
|
import { readFileSync, writeFileSync } from "fs";
|
|
5
5
|
import inflection from "inflection";
|
|
6
|
-
import knex from "knex";
|
|
7
6
|
import { unique } from "radashi";
|
|
8
7
|
import { inspect } from "util";
|
|
9
8
|
import { Sonamu } from "../api/index.js";
|
|
10
9
|
import { BaseModel } from "../database/base-model.js";
|
|
10
|
+
import { createKnexInstance } from "../database/knex.js";
|
|
11
11
|
import { UpsertBuilder } from "../database/upsert-builder.js";
|
|
12
12
|
import { EntityManager } from "../entity/entity-manager.js";
|
|
13
13
|
import { isBelongsToOneRelationProp, isHasManyRelationProp, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualProp } from "../types/types.js";
|
|
@@ -51,8 +51,8 @@ export class FixtureManagerClass {
|
|
|
51
51
|
throw new Error(`테스트DB와 프로덕션DB에 동일한 데이터베이스가 사용되었습니다.`);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
this.tdb =
|
|
55
|
-
this.fdb =
|
|
54
|
+
this.tdb = createKnexInstance(Sonamu.dbConfig.test);
|
|
55
|
+
this.fdb = createKnexInstance(Sonamu.dbConfig.fixture);
|
|
56
56
|
}
|
|
57
57
|
async getChecksum(db, tableName) {
|
|
58
58
|
const [[checksumRow]] = await db.raw(`CHECKSUM TABLE ${tableName}`);
|
|
@@ -196,8 +196,8 @@ export class FixtureManagerClass {
|
|
|
196
196
|
await BaseModel.destroy();
|
|
197
197
|
}
|
|
198
198
|
async getFixtures(sourceDBName, targetDBName, searchOptions, duplicateCheck) {
|
|
199
|
-
const sourceDB =
|
|
200
|
-
const targetDB =
|
|
199
|
+
const sourceDB = createKnexInstance(Sonamu.dbConfig[sourceDBName]);
|
|
200
|
+
const targetDB = createKnexInstance(Sonamu.dbConfig[targetDBName]);
|
|
201
201
|
const { entityId, field, value, searchType } = searchOptions;
|
|
202
202
|
const entity = EntityManager.get(entityId);
|
|
203
203
|
const column = entity.props.find((prop)=>prop.name === field)?.type === "relation" ? `${field}_id` : field;
|
|
@@ -327,7 +327,7 @@ export class FixtureManagerClass {
|
|
|
327
327
|
this.fixtureRefMap = new Map();
|
|
328
328
|
this.uuidToFixtureId = new Map();
|
|
329
329
|
this.skippedFixtures = new Map();
|
|
330
|
-
const db =
|
|
330
|
+
const db = createKnexInstance(Sonamu.dbConfig[dbName]);
|
|
331
331
|
const results = [];
|
|
332
332
|
try {
|
|
333
333
|
// 1. RelationGraph로 fixture 단위 삽입 순서 계산
|
|
@@ -620,4 +620,4 @@ export class FixtureManagerClass {
|
|
|
620
620
|
}
|
|
621
621
|
export const FixtureManager = new FixtureManagerClass();
|
|
622
622
|
|
|
623
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBVQlJlZiwgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHV1aWRUb0ZpeHR1cmVJZDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBza2lwcGVkRml4dHVyZXM6IE1hcDxzdHJpbmcsIHsgZW50aXR5SWQ6IHN0cmluZzsgZXhpc3RpbmdJZDogbnVtYmVyIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuX3RkYiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoU29uYW11LmRiQ29uZmlnLnRlc3QgJiYgU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKSB7XG4gICAgICBjb25zdCB0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHBDb25uID0gU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0ga25leChTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgfVxuXG4gIGFzeW5jIGdldENoZWNrc3VtKGRiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IFtbY2hlY2tzdW1Sb3ddXSA9IGF3YWl0IGRiLnJhdyhgQ0hFQ0tTVU0gVEFCTEUgJHt0YWJsZU5hbWV9YCk7XG4gICAgcmV0dXJuIGNoZWNrc3VtUm93LkNoZWNrc3VtO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgY29uc3QgW3JzaF0gPSBhd2FpdCB3ZGIucmF3KHF1ZXJ5KTtcbiAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGluZm86IHJzaC5pbmZvLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnNvbGUubG9nKHsgZW50aXR5SWQsIGZpZWxkLCBpZCB9KTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcblxuICAgIC8vIOyXrOq4sOyEnCDsi6REQuydmCByb3cg6rCA7KC47Ji0XG4gICAgY29uc3QgW3Jvd10gPSBhd2FpdCB3ZGIoZW50aXR5LnRhYmxlKS53aGVyZShmaWVsZCwgaWQpLmxpbWl0KDEpO1xuICAgIGlmIChyb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfSMke2lkfSByb3frpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7ZS97Iqk7LOQREIsIOyLpERCXG4gICAgY29uc3QgZml4dHVyZURhdGFiYXNlID0gKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZTtcbiAgICBjb25zdCByZWFsRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKVxuICAgICAgLmRhdGFiYXNlO1xuXG4gICAgY29uc3Qgc2VsZlF1ZXJ5ID0gYElOU0VSVCBJR05PUkUgSU5UTyBcXGAke2ZpeHR1cmVEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIChTRUxFQ1QgKiBGUk9NIFxcYCR7cmVhbERhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgV0hFUkUgXFxgaWRcXGAgPSAke2lkfSlgO1xuXG4gICAgY29uc3QgYXJncyA9IE9iamVjdC5lbnRyaWVzKGVudGl0eS5yZWxhdGlvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoWywgcmVsYXRpb25dKSA9PlxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSAmJiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlID09PSB1bmRlZmluZWQpLFxuICAgICAgKVxuICAgICAgLm1hcCgoWywgcmVsYXRpb25dKSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgIEJlbG9uZ3NUb09uZeyduCDqsr3smrBcbiAgICAgICAgICBDYXRlZ29yeSAvICdpZCcgLyByb3dbY2F0ZWdvcnlfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSB0cnVlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ2lkJyAvIHJvd1twcm9maWxlX2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gZmFsc2Ug7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAncHJvZmlsZV9pZCcgLyByb3dbJ2lkJ10g7Zi47LacXG4gICAgICAgICovXG4gICAgICAgIGxldCBmaWVsZDogc3RyaW5nO1xuICAgICAgICBsZXQgaWQ6IG51bWJlcjtcbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmICFyZWxhdGlvbi5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZENvbHVtbk5hbWUgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKT8ubmFtZTtcbiAgICAgICAgICBpZiAoIXJlbGF0ZWRJZENvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWxhdGVkRW50aXR5LmlkfeydmCAke2VudGl0eS5pZH0g6rSA6rOEIO2UhOuhreydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGQgPSBgJHtyZWxhdGVkSWRDb2x1bW5OYW1lfV9pZGA7XG4gICAgICAgICAgaWQgPSByb3cuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGQgPSBcImlkXCI7XG4gICAgICAgICAgaWQgPSByb3dbYCR7cmVsYXRpb24ubmFtZX1faWRgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVudGl0eUlkOiByZWxhdGlvbi53aXRoLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGlkLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGFyZykgPT4gYXJnLmlkICE9PSBudWxsKTtcblxuICAgIGNvbnN0IHJlbFF1ZXJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFyZ3MubWFwKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEltcG9ydFF1ZXJpZXMoYXJncy5lbnRpdHlJZCwgYXJncy5maWVsZCwgYXJncy5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFsuLi51bmlxdWUocmVsUXVlcmllcy5yZXZlcnNlKCkuZmxhdCgpKSwgc2VsZlF1ZXJ5XTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX3RkYikge1xuICAgICAgYXdhaXQgdGhpcy5fdGRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX3RkYiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZGIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2ZkYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9mZGIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rml4dHVyZXMoXG4gICAgc291cmNlREJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICB0YXJnZXREQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHNlYXJjaE9wdGlvbnM6IEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICAgIGR1cGxpY2F0ZUNoZWNrPzogRHVwbGljYXRlQ2hlY2tPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VEQiA9IGtuZXgoU29uYW11LmRiQ29uZmlnW3NvdXJjZURCTmFtZV0pO1xuICAgIGNvbnN0IHRhcmdldERCID0ga25leChTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICBjb25zdCB7IGVudGl0eUlkLCBmaWVsZCwgdmFsdWUsIHNlYXJjaFR5cGUgfSA9IHNlYXJjaE9wdGlvbnM7XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3QgY29sdW1uID1cbiAgICAgIGVudGl0eS5wcm9wcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IGZpZWxkKT8udHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7ZmllbGR9X2lkYCA6IGZpZWxkO1xuXG4gICAgbGV0IHF1ZXJ5ID0gc291cmNlREIoZW50aXR5LnRhYmxlKTtcbiAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT09IFwibGlrZVwiKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5O1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjb3JkcyBmb3VuZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgaW5pdGlhbFJlY29yZHNMZW5ndGggPSBmaXh0dXJlcy5sZW5ndGg7XG4gICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgIF9kYjogc291cmNlREIsXG4gICAgICB9KTtcbiAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICBjb25zdCBjdXJyZW50Rml4dHVyZVJlY29yZCA9IGZpeHR1cmVzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSBgJHtlbnRpdHlJZH0jJHtyb3cuaWR9YCk7XG5cbiAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgIGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZldGNoZWRSZWNvcmRzID0gZml4dHVyZXNcbiAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAubWFwKChyKSA9PiByLmZpeHR1cmVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgY29uc3QgY3VzdG9tQ29sdW1ucyA9IGR1cGxpY2F0ZUNoZWNrPy5jb2x1bW5zPy5bZml4dHVyZS5lbnRpdHlJZF07XG4gICAgICBpZiAoY3VzdG9tQ29sdW1ucyAmJiBjdXN0b21Db2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICB0YXJnZXREQixcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCBjdXN0b21EdXBsaWNhdGVSb3csIHtcbiAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS50YXJnZXQgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVW5pcXVlIGluZGV4IOq4sOykgCDspJHrs7Ug7ZmV7J24IOKGkiBmaXh0dXJlLnVuaXF1ZVxuICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgIGlmICh1bmlxdWVSb3cpIHtcbiAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCB1bmlxdWVSb3csIHtcbiAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgX2RiOiB0YXJnZXREQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRhcmdldERCLmRlc3Ryb3koKTtcbiAgICBhd2FpdCBzb3VyY2VEQi5kZXN0cm95KCk7XG5cbiAgICByZXR1cm4gdW5pcXVlKGZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3c6IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICB9LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzaW5nbGVSZWNvcmQ/OiBib29sZWFuO1xuICAgICAgX2RiPzogS25leDtcbiAgICB9LFxuICApOiBQcm9taXNlPEZpeHR1cmVSZWNvcmRbXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ZWRFbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY3JlYXRlID0gYXN5bmMgKFxuICAgICAgZW50aXR5OiBFbnRpdHksXG4gICAgICByb3c6IHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgICB9LFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgZml4dHVyZUlkID0gYCR7ZW50aXR5LmlkfSMke3Jvdy5pZH1gO1xuICAgICAgaWYgKHZpc2l0ZWRFbnRpdGllcy5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aXNpdGVkRW50aXRpZXMuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IHJlY29yZDogRml4dHVyZVJlY29yZCA9IHtcbiAgICAgICAgZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICBjb2x1bW5zOiB7fSxcbiAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdID0ge1xuICAgICAgICAgIHByb3A6IHByb3AsXG4gICAgICAgICAgdmFsdWU6IHJvd1twcm9wLm5hbWVdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRiID0gb3B0aW9ucz8uX2RiID8/IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0aHJvdWdoVGFibGUgPSBwcm9wLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCBmcm9tQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdG9Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIodGhyb3VnaFRhYmxlKS53aGVyZShmcm9tQ29sdW1uLCByb3cuaWQpLnBsdWNrKHRvQ29sdW1uKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSlcbiAgICAgICAgICAgIC53aGVyZShwcm9wLmpvaW5Db2x1bW4sIHJvdy5pZClcbiAgICAgICAgICAgIC5wbHVjayhcImlkXCIpO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgIXByb3AuaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCByb3cuaWQpLmZpcnN0KCk7XG4gICAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZFJvdz8uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gcm93W2Ake3Byb3AubmFtZX1faWRgXTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWxvbmdzUmVjb3Jkcy5wdXNoKGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghb3B0aW9ucz8uc2luZ2xlUmVjb3JkICYmIHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCByZWxhdGVkSWQpLmZpcnN0KCk7XG4gICAgICAgICAgICBpZiAocmVsYXRlZFJvdykge1xuICAgICAgICAgICAgICBhd2FpdCBjcmVhdGUocmVsYXRlZEVudGl0eSwgcmVsYXRlZFJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgIH07XG5cbiAgICBhd2FpdCBjcmVhdGUoZW50aXR5LCByb3cpO1xuXG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH1cblxuICAvKipcbiAgICogMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsCAoc2VsZi1yZWZlcmVuY2Ug7Y+s7ZWoKVxuICAgKiAyLiDsiJzshJzrjIDroZwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ0gKFVCUmVm66GcIOywuOyhsCDqtIDqs4Qg7ZGc7ZiEKVxuICAgKiAzLiDthYzsnbTruJTrs4QgdXBzZXJ0IOyLpO2WiSAoSUTripQgRELqsIAg7J6Q64+ZIO2VoOuLuSlcbiAgICovXG4gIGFzeW5jIGluc2VydEZpeHR1cmVzKFxuICAgIGRiTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgX2ZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgY29uc3QgZml4dHVyZXMgPSB1bmlxdWUoX2ZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuXG4gICAgLy8g7LSI6riw7ZmUXG4gICAgdGhpcy5idWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy51dWlkVG9GaXh0dXJlSWQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5za2lwcGVkRml4dHVyZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBkYiA9IGtuZXgoU29uYW11LmRiQ29uZmlnW2RiTmFtZV0pO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrBcbiAgICAgIHRoaXMucmVsYXRpb25HcmFwaC5idWlsZEdyYXBoKGZpeHR1cmVzKTtcbiAgICAgIGNvbnN0IGluc2VydGlvbk9yZGVyID0gdGhpcy5yZWxhdGlvbkdyYXBoLmdldEluc2VydGlvbk9yZGVyKCk7XG5cbiAgICAgIC8vIDIuIOyInOyEnOuMgOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSAob3ZlcnJpZGUg7LK07YGsKVxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGhhc1RhcmdldCA9ICEhZml4dHVyZS50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGhhc1VuaXF1ZSA9ICEhZml4dHVyZS51bmlxdWU7XG4gICAgICAgIGNvbnN0IGhhc0R1cGxpY2F0ZSA9IGhhc1RhcmdldCB8fCBoYXNVbmlxdWU7XG5cbiAgICAgICAgLy8g7KSR67O17J20IOyeiOqzoCBvdmVycmlkZT1mYWxzZeyduCDqsr3smrA6IOyKpO2CtVxuICAgICAgICBpZiAoaGFzRHVwbGljYXRlICYmICFmaXh0dXJlLm92ZXJyaWRlKSB7XG4gICAgICAgICAgLy8g6riw7KG0IOugiOy9lOuTnCBJRCDsoIDsnqUgKHVuaXF1ZSDsmrDshKAsIOyXhuycvOuptCB0YXJnZXQpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGZpeHR1cmUudW5pcXVlPy5pZCA/PyBmaXh0dXJlLnRhcmdldD8uaWQ7XG4gICAgICAgICAgYXNzZXJ0KGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzLnNldChmaXh0dXJlSWQsIHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgZXhpc3RpbmdJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgU2tpcHBlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0gKGV4aXN0aW5nOiAjJHtleGlzdGluZ0lkfSwgb3ZlcnJpZGU6IGZhbHNlKWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICAgIGBSZWdpc3RlcmVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSR7Zml4dHVyZS5vdmVycmlkZSA/IGAgKG92ZXJyaWRlIGV4aXN0aW5nOiAjJHtmaXh0dXJlLnRhcmdldD8uaWR9KWAgOiBcIlwifWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gMy4g7YWM7J2067iU67OEIHVwc2VydCDsi6TtlolcbiAgICAgIGNvbnN0IHRhYmxlT3JkZXIgPSB0aGlzLmdldFRhYmxlT3JkZXIoZml4dHVyZXMpO1xuXG4gICAgICBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydGVkSWRzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlT3JkZXIpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YWJsZU5hbWUpKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIHVwc2VydCDsi6Ttlokg7KCEIHV1aWQg66qp66GdIOyggOyepVxuICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5idWlsZGVyLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgICAgICAgY29uc3QgdXVpZHMgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiByb3cudXVpZCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzYCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRlci51cHNlcnQodHJ4LCB0YWJsZU5hbWUpO1xuXG4gICAgICAgICAgLy8gdXBzZXJ065CcIHJvd+uTpOydmCB1dWlkIC0+IGlkIOunpO2VkSDqtazstpVcbiAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdXVpZFRvSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRyeCh0YWJsZU5hbWUgYXMgc3RyaW5nKVxuICAgICAgICAgICAgICAuc2VsZWN0KFwidXVpZFwiLCBcImlkXCIpXG4gICAgICAgICAgICAgIC53aGVyZUluKFwidXVpZFwiLCB1dWlkcyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgICAgICAgdXVpZFRvSWQuc2V0KHJvdy51dWlkLCByb3cuaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgdXVpZFRvSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIE1hbnlUb01hbnkg6rSA6rOEIOyymOumrFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKHRyeCwgZml4dHVyZXMsIGluc2VydGVkSWRzQnlUYWJsZSk7XG5cbiAgICAgICAgLy8gNS4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oYEluc2VydGVkIGludG8gJHtlbnRpdHkudGFibGV9OiAjJHtmaXh0dXJlLmlkfSAtPiAjJHtpbnNlcnRlZElkfWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlKHJlc3VsdHMsIChyKSA9PiBgJHtyLmVudGl0eUlkfSMke3IuZGF0YS5pZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlUmVjb3Jk66W8IFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRml4dHVyZShmaXh0dXJlOiBGaXh0dXJlUmVjb3JkKTogVUJSZWYge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgIGNvbnN0IHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIE92ZXJyaWRlIOuqqOuTnCDtjJDri6g6IHRhcmdldCDrmJDripQgdW5pcXVl6rCAIOyeiOqzoCBvdmVycmlkZT10cnVl7J24IOqyveyasFxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gZml4dHVyZS50YXJnZXQgPz8gZml4dHVyZS51bmlxdWU7XG4gICAgY29uc3QgaXNPdmVycmlkZU1vZGUgPSBmaXh0dXJlLm92ZXJyaWRlICYmIGV4aXN0aW5nUmVjb3JkO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQvdXVpZCDsspjrpqw6IE92ZXJyaWRlIOuqqOuTnOydvCDrlYzrp4wg6riw7KG0IOqwkiDsgqzsmqlcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiIHx8IHByb3BOYW1lID09PSBcInV1aWRcIikge1xuICAgICAgICBpZiAoaXNPdmVycmlkZU1vZGUgJiYgZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAvLyBPdmVycmlkZTog6riw7KG0IOugiOy9lOuTnOydmCDqsJIg7IKs7JqpIOKGkiBVUERBVEVcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gZXhpc3RpbmdSZWNvcmQuY29sdW1uc1twcm9wTmFtZV0/LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIOyDiCDroIjsvZTrk5w6IOygnOyZuCDihpIgSU5TRVJUIChEQi9VcHNlcnRCdWlsZGVy6rCAIOyDneyEsSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQgIT09IG51bGwgJiYgcmVsYXRlZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG5cbiAgICAgICAgICAgIC8vIOuovOyggCBza2lw65CcIGZpeHR1cmXsnbjsp4Ag7ZmV7J24XG4gICAgICAgICAgICBjb25zdCBza2lwcGVkRXhpc3RpbmdJZCA9IHRoaXMuc2tpcHBlZEZpeHR1cmVzLmdldChyZWxhdGVkRml4dHVyZUlkKT8uZXhpc3RpbmdJZDtcbiAgICAgICAgICAgIGlmIChza2lwcGVkRXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIHNraXDrkJwgZml4dHVyZSDihpIgdGFyZ2V0IERC7J2YIOq4sOyhtCDroIjsvZTrk5wgaWQg7IKs7JqpXG4gICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHNraXBwZWRFeGlzdGluZ0lkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgICAgLy8g7J2066+4IOuTseuhneuQnCBmaXh0dXJlIOywuOyhsCDihpIgVUJSZWYg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZFJlZjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmaXh0dXJlc+yXkCDtj6ztlajrkJjsp4Ag7JWK7J2AIOugiOy9lOuTnCDihpIgSUQg6re464yA66GcIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXNNYW55LCBNYW55VG9NYW5564qUIOuzhOuPhCDsspjrpqxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7xcbiAgICAgICAgcm93W3Byb3BOYW1lXSA9IHRoaXMuY29udmVydENvbHVtblZhbHVlKHByb3AgYXMgRW50aXR5UHJvcCwgY29sdW1uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBSZWdpc3RlcmluZyAke2VudGl0eS50YWJsZX0gLSAke2luc3BlY3Qocm93LCBmYWxzZSwgbnVsbCwgdHJ1ZSl9YCkpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuYnVpbGRlci5yZWdpc3RlcihlbnRpdHkudGFibGUsIHJvdyk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwLnNldChmaXh0dXJlLmZpeHR1cmVJZCwgcmVmKTtcbiAgICB0aGlzLnV1aWRUb0ZpeHR1cmVJZC5zZXQocmVmLnV1aWQsIGZpeHR1cmUuZml4dHVyZUlkKTtcblxuICAgIHJldHVybiByZWY7XG4gIH1cblxuICAvKipcbiAgICog7Lus65+8IOqwkiDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgY29udmVydENvbHVtblZhbHVlKHByb3A6IEVudGl0eVByb3AsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAvLyBVcHNlcnRCdWlsZGVyLnJlZ2lzdGVy7JeQ7IScIEpTT04uc3RyaW5naWZ5IOyymOumrO2VmOuvgOuhnCBvYmplY3Qg6re464yA66GcIOyghOuLrFxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7YWM7J2067iUIOyInOyEnCDstpTstpwgKGZpeHR1cmVz7JeQIO2PrO2VqOuQnCDthYzsnbTruJTrp4wpXG4gICAqL1xuICBwcml2YXRlIGdldFRhYmxlT3JkZXIoZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSk6IChrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZClbXSB7XG4gICAgY29uc3QgdGFibGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICBpZiAoIXNlZW4uaGFzKGVudGl0eS50YWJsZSkpIHtcbiAgICAgICAgc2Vlbi5hZGQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgdGFibGVzLnB1c2goZW50aXR5LnRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVzIGFzIChrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZClbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKHRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YXJnZXRUYWJsZS50YWJsZSkgPT09IGZhbHNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IChwcm9wIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgbGV0IHRhcmdldElkOiBudW1iZXI7XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQocmVsYXRlZEVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSWQgPSByZWxhdGVkVXVpZFRvSWQ/LmdldChyZWxhdGVkUmVmLnV1aWQpO1xuXG4gICAgICAgICAgICAgIGlmIChyZXNvbHZlZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgUmVsYXRlZCBmaXh0dXJlICR7cmVsYXRlZEZpeHR1cmVJZH0gbm90IGZvdW5kIGluIGluc2VydGVkSWRzLCBza2lwcGluZ2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlc29sdmVkSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSm9pblRhYmxl7JeQIOyCveyehVxuICAgICAgICAgICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IHRyeChqb2luVGFibGUpXG4gICAgICAgICAgICAgIC53aGVyZSh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmxpbWl0KDEpO1xuXG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRyeChqb2luVGFibGUpLmluc2VydCh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVW5pcXVlVmlvbGF0aW9uKGRiOiBLbmV4LCBlbnRpdHk6IEVudGl0eSwgZml4dHVyZTogRml4dHVyZVJlY29yZCkge1xuICAgIGNvbnN0IF91bmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBfdW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOyduCDqsr3smrAgX2lkIOu2meydtOq4sFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCBkYkNvbHVtbiA9IHByb3AgJiYgaXNSZWxhdGlvblByb3AocHJvcCkgPyBgJHtjb2x1bW59X2lkYCA6IGNvbHVtbjtcbiAgICAgIGNvbnN0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW2NvbHVtbl0/LnZhbHVlO1xuXG4gICAgICAvLyBudWxsIOqwkuydtCDtj6ztlajrkJwg6rK97JqwIOykkeuztSDtmZXsnbgg7Iqk7YK1XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2hlcmVDbGF1c2VbZGJDb2x1bW5dID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IGRiKGVudGl0eS50YWJsZSkud2hlcmUod2hlcmVDbGF1c2UpLmxpbWl0KDEpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpeHR1cmVMb2FkZXIoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL3Rlc3RpbmcvZml4dHVyZS50c2A7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgZml4dHVyZUxvYWRlclN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiY29uc3QgZml4dHVyZUxvYWRlciA9IHtcIik7XG4gICAgY29uc3QgZml4dHVyZUxvYWRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZihcIn07XCIsIGZpeHR1cmVMb2FkZXJTdGFydCk7XG5cbiAgICBpZiAoZml4dHVyZUxvYWRlclN0YXJ0ICE9PSAtMSAmJiBmaXh0dXJlTG9hZGVyRW5kICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2NvbnRlbnQuc2xpY2UoMCwgZml4dHVyZUxvYWRlckVuZCl9ICAke2NvZGV9XFxuJHtjb250ZW50LnNsaWNlKGZpeHR1cmVMb2FkZXJFbmQpfWA7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgbmV3Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIGZpeHR1cmVMb2FkZXIgaW4gZml4dHVyZS50c1wiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpeHR1cmVNYW5hZ2VyID0gbmV3IEZpeHR1cmVNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJjaGFsayIsImV4ZWNTeW5jIiwicmVhZEZpbGVTeW5jIiwid3JpdGVGaWxlU3luYyIsImluZmxlY3Rpb24iLCJrbmV4IiwidW5pcXVlIiwiaW5zcGVjdCIsIlNvbmFtdSIsIkJhc2VNb2RlbCIsIlVwc2VydEJ1aWxkZXIiLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiUmVsYXRpb25HcmFwaCIsIkZpeHR1cmVNYW5hZ2VyQ2xhc3MiLCJfdGRiIiwidGRiIiwiRXJyb3IiLCJfZmRiIiwiZmRiIiwiY2FjaGVkVGFibGVOYW1lcyIsInJlbGF0aW9uR3JhcGgiLCJidWlsZGVyIiwiZml4dHVyZVJlZk1hcCIsIk1hcCIsInV1aWRUb0ZpeHR1cmVJZCIsInNraXBwZWRGaXh0dXJlcyIsImluaXQiLCJkYkNvbmZpZyIsInRlc3QiLCJwcm9kdWN0aW9uX21hc3RlciIsInRDb25uIiwiY29ubmVjdGlvbiIsInBDb25uIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImZpeHR1cmUiLCJnZXRDaGVja3N1bSIsImRiIiwidGFibGVOYW1lIiwiY2hlY2tzdW1Sb3ciLCJyYXciLCJDaGVja3N1bSIsInN5bmMiLCJmaXh0dXJlQ29ubiIsInRlc3RDb25uIiwidGVzdFBnRW52IiwiUEdQQVNTV09SRCIsInBhc3N3b3JkIiwidXNlciIsInN0ZGlvIiwiZW52IiwicHJvY2VzcyIsImZpeHR1cmVQZ0VudiIsImR1bXBDbWQiLCJyZXN0b3JlQ21kIiwic2hlbGwiLCJ2aXNpdGVkUmVjb3JkcyIsIlNldCIsImltcG9ydEZpeHR1cmUiLCJlbnRpdHlJZCIsImlkcyIsImNsZWFyIiwicXVlcmllcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJpZCIsImdldEltcG9ydFF1ZXJpZXMiLCJmbGF0Iiwid2RiIiwiZ2V0REIiLCJxdWVyeSIsInJzaCIsImNvbnNvbGUiLCJsb2ciLCJpbmZvIiwiZmllbGQiLCJyZWNvcmRLZXkiLCJoYXMiLCJhZGQiLCJlbnRpdHkiLCJnZXQiLCJyb3ciLCJ0YWJsZSIsIndoZXJlIiwibGltaXQiLCJ1bmRlZmluZWQiLCJmaXh0dXJlRGF0YWJhc2UiLCJyZWFsRGF0YWJhc2UiLCJzZWxmUXVlcnkiLCJhcmdzIiwiT2JqZWN0IiwiZW50cmllcyIsInJlbGF0aW9ucyIsImZpbHRlciIsInJlbGF0aW9uIiwiY3VzdG9tSm9pbkNsYXVzZSIsImhhc0pvaW5Db2x1bW4iLCJyZWxhdGVkRW50aXR5Iiwid2l0aCIsInJlbGF0ZWRJZENvbHVtbk5hbWUiLCJwcm9wcyIsImZpbmQiLCJwIiwibmFtZSIsImFyZyIsInJlbFF1ZXJpZXMiLCJyZXZlcnNlIiwiZGVzdHJveSIsImdldEZpeHR1cmVzIiwic291cmNlREJOYW1lIiwidGFyZ2V0REJOYW1lIiwic2VhcmNoT3B0aW9ucyIsImR1cGxpY2F0ZUNoZWNrIiwic291cmNlREIiLCJ0YXJnZXREQiIsInZhbHVlIiwic2VhcmNoVHlwZSIsImNvbHVtbiIsInByb3AiLCJ0eXBlIiwicm93cyIsImxlbmd0aCIsImZpeHR1cmVzIiwiaW5pdGlhbFJlY29yZHNMZW5ndGgiLCJuZXdSZWNvcmRzIiwiY3JlYXRlRml4dHVyZVJlY29yZCIsIl9kYiIsInB1c2giLCJjdXJyZW50Rml4dHVyZVJlY29yZCIsInIiLCJmaXh0dXJlSWQiLCJmZXRjaGVkUmVjb3JkcyIsInNsaWNlIiwiY3VzdG9tQ29sdW1ucyIsImNvbHVtbnMiLCJjdXN0b21EdXBsaWNhdGVSb3ciLCJjaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyIsInJlY29yZCIsInNpbmdsZVJlY29yZCIsInRhcmdldCIsInVuaXF1ZVJvdyIsImNoZWNrVW5pcXVlVmlvbGF0aW9uIiwiZiIsIm9wdGlvbnMiLCJyZWNvcmRzIiwidmlzaXRlZEVudGl0aWVzIiwiY3JlYXRlIiwiYmVsb25nc1JlY29yZHMiLCJ0aHJvdWdoVGFibGUiLCJqb2luVGFibGUiLCJmcm9tQ29sdW1uIiwic2luZ3VsYXJpemUiLCJ0b0NvbHVtbiIsInJlbGF0ZWRJZHMiLCJwbHVjayIsImpvaW5Db2x1bW4iLCJyZWxhdGVkUHJvcCIsInJlbGF0ZWRSb3ciLCJmaXJzdCIsInJlbGF0ZWRJZCIsImluc2VydEZpeHR1cmVzIiwiZGJOYW1lIiwiX2ZpeHR1cmVzIiwicmVzdWx0cyIsImJ1aWxkR3JhcGgiLCJpbnNlcnRpb25PcmRlciIsImdldEluc2VydGlvbk9yZGVyIiwiaGFzVGFyZ2V0IiwiaGFzVW5pcXVlIiwiaGFzRHVwbGljYXRlIiwib3ZlcnJpZGUiLCJleGlzdGluZ0lkIiwic2V0IiwieWVsbG93IiwicmVnaXN0ZXJGaXh0dXJlIiwiYmx1ZSIsInRhYmxlT3JkZXIiLCJnZXRUYWJsZU9yZGVyIiwidHJhbnNhY3Rpb24iLCJ0cngiLCJpbnNlcnRlZElkc0J5VGFibGUiLCJoYXNUYWJsZSIsImdldFRhYmxlIiwidXVpZHMiLCJ1dWlkIiwidXBzZXJ0IiwidXVpZFRvSWQiLCJzZWxlY3QiLCJ3aGVyZUluIiwicHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMiLCJza2lwcGVkIiwiZGF0YSIsInJlZiIsImluc2VydGVkSWQiLCJncmVlbiIsImV4aXN0aW5nUmVjb3JkIiwiaXNPdmVycmlkZU1vZGUiLCJwcm9wTmFtZSIsInJlbGF0ZWRGaXh0dXJlSWQiLCJza2lwcGVkRXhpc3RpbmdJZCIsInJlbGF0ZWRSZWYiLCJjb252ZXJ0Q29sdW1uVmFsdWUiLCJyZWdpc3RlciIsIkRhdGUiLCJ0YWJsZXMiLCJzZWVuIiwic291cmNlUmVmIiwic291cmNlVXVpZFRvSWQiLCJzb3VyY2VJZCIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldFRhYmxlIiwic291cmNlQ29sdW1uIiwidGFyZ2V0Q29sdW1uIiwidGFyZ2V0SWQiLCJyZWxhdGVkVXVpZFRvSWQiLCJyZXNvbHZlZElkIiwid2FybiIsImZvdW5kIiwiaW5zZXJ0IiwiX3VuaXF1ZUluZGV4ZXMiLCJpbmRleGVzIiwiaSIsInVuaXF1ZUluZGV4ZXMiLCJpbmRleCIsImV2ZXJ5Iiwic3RhcnRzV2l0aCIsInVuaXF1ZVF1ZXJ5IiwiaGFzQ29uZGl0aW9uIiwiY29udGFpbnNOdWxsIiwic29tZSIsInJlcGxhY2UiLCJvcldoZXJlIiwicWIiLCJhbmRXaGVyZSIsInVuaXF1ZUZvdW5kIiwid2hlcmVDbGF1c2UiLCJkYkNvbHVtbiIsImFkZEZpeHR1cmVMb2FkZXIiLCJjb2RlIiwicGF0aCIsImFwaVJvb3RQYXRoIiwiY29udGVudCIsInRvU3RyaW5nIiwiZml4dHVyZUxvYWRlclN0YXJ0IiwiaW5kZXhPZiIsImZpeHR1cmVMb2FkZXJFbmQiLCJuZXdDb250ZW50IiwiRml4dHVyZU1hbmFnZXIiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsUUFBUSxRQUFRLGdCQUFnQjtBQUN6QyxTQUFTQyxZQUFZLEVBQUVDLGFBQWEsUUFBUSxLQUFLO0FBQ2pELE9BQU9DLGdCQUFnQixhQUFhO0FBQ3BDLE9BQU9DLFVBQXlCLE9BQU87QUFDdkMsU0FBU0MsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FBU0MsT0FBTyxRQUFRLE9BQU87QUFDL0IsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLFNBQVNDLFNBQVMsUUFBUSw0QkFBeUI7QUFFbkQsU0FBcUJDLGFBQWEsUUFBUSxnQ0FBNkI7QUFFdkUsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQU1FQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxzQkFBc0IsRUFDdEJDLGNBQWMsRUFDZEMsYUFBYSxRQUVSLG9CQUFpQjtBQUN4QixTQUFTQyxhQUFhLFFBQVEsdUJBQW9CO0FBU2xELE9BQU8sTUFBTUM7SUFDSEMsT0FBb0IsS0FBSztJQUNqQyxJQUFJQyxJQUFJQSxHQUFTLEVBQUU7UUFDakIsSUFBSSxDQUFDRCxJQUFJLEdBQUdDO0lBQ2Q7SUFDQSxJQUFJQSxNQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUNELElBQUksS0FBSyxNQUFNO1lBQ3RCLE1BQU0sSUFBSUUsTUFBTTtRQUNsQjtRQUNBLE9BQU8sSUFBSSxDQUFDRixJQUFJO0lBQ2xCO0lBRVFHLE9BQW9CLEtBQUs7SUFDakMsSUFBSUMsSUFBSUEsR0FBUyxFQUFFO1FBQ2pCLElBQUksQ0FBQ0QsSUFBSSxHQUFHQztJQUNkO0lBQ0EsSUFBSUEsTUFBWTtRQUNkLElBQUksSUFBSSxDQUFDRCxJQUFJLEtBQUssTUFBTTtZQUN0QixNQUFNLElBQUlELE1BQU07UUFDbEI7UUFDQSxPQUFPLElBQUksQ0FBQ0MsSUFBSTtJQUNsQjtJQUNBRSxtQkFBb0MsS0FBSztJQUVqQ0MsZ0JBQWdCLElBQUlSLGdCQUFnQjtJQUU1QyxpQ0FBaUM7SUFDekJTLFVBQXlCLElBQUlqQixnQkFBZ0I7SUFDN0NrQixnQkFBb0MsSUFBSUMsTUFBTTtJQUM5Q0Msa0JBQXVDLElBQUlELE1BQU07SUFDakRFLGtCQUF5RSxJQUFJRixNQUFNO0lBRTNGRyxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUNaLElBQUksS0FBSyxNQUFNO1lBQ3RCO1FBQ0Y7UUFDQSxJQUFJWixPQUFPeUIsUUFBUSxDQUFDQyxJQUFJLElBQUkxQixPQUFPeUIsUUFBUSxDQUFDRSxpQkFBaUIsRUFBRTtZQUM3RCxNQUFNQyxRQUFRNUIsT0FBT3lCLFFBQVEsQ0FBQ0MsSUFBSSxDQUFDRyxVQUFVO1lBRzdDLE1BQU1DLFFBQVE5QixPQUFPeUIsUUFBUSxDQUFDRSxpQkFBaUIsQ0FBQ0UsVUFBVTtZQUcxRCxJQUNFLEdBQUdELE1BQU1HLElBQUksSUFBSSxZQUFZLENBQUMsRUFBRUgsTUFBTUksSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFSixNQUFNSyxRQUFRLEVBQUUsS0FDdEUsR0FBR0gsTUFBTUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxFQUFFRCxNQUFNRSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUVGLE1BQU1HLFFBQVEsRUFBRSxFQUN0RTtnQkFDQSxNQUFNLElBQUluQixNQUFNLENBQUMsbUNBQW1DLENBQUM7WUFDdkQ7UUFDRjtRQUVBLElBQUksQ0FBQ0QsR0FBRyxHQUFHaEIsS0FBS0csT0FBT3lCLFFBQVEsQ0FBQ0MsSUFBSTtRQUNwQyxJQUFJLENBQUNWLEdBQUcsR0FBR25CLEtBQUtHLE9BQU95QixRQUFRLENBQUNTLE9BQU87SUFDekM7SUFFQSxNQUFNQyxZQUFZQyxFQUFRLEVBQUVDLFNBQWlCLEVBQUU7UUFDN0MsTUFBTSxDQUFDLENBQUNDLFlBQVksQ0FBQyxHQUFHLE1BQU1GLEdBQUdHLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRUYsV0FBVztRQUNsRSxPQUFPQyxZQUFZRSxRQUFRO0lBQzdCO0lBRUE7OztFQUdBLEdBQ0EsTUFBTUMsT0FBTztRQUNYLE1BQU1DLGNBQWMxQyxPQUFPeUIsUUFBUSxDQUFDUyxPQUFPLENBQUNMLFVBQVU7UUFDdEQsTUFBTWMsV0FBVzNDLE9BQU95QixRQUFRLENBQUNDLElBQUksQ0FBQ0csVUFBVTtRQUVoRCw0QkFBNEI7UUFDNUIsTUFBTWUsWUFBWTtZQUFFQyxZQUFZRixTQUFTRyxRQUFRLElBQUk7UUFBRztRQUN4RHJELFNBQ0UsQ0FBQyxRQUFRLEVBQUVrRCxTQUFTWixJQUFJLENBQUMsSUFBSSxFQUFFWSxTQUFTWCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUVXLFNBQVNJLElBQUksQ0FBQzs7O3lCQUd0RCxFQUFFSixTQUFTVixRQUFRLENBQUM7O09BRXRDLENBQUMsRUFDRjtZQUFFZSxPQUFPO1lBQVdDLEtBQUs7Z0JBQUUsR0FBR0MsUUFBUUQsR0FBRztnQkFBRSxHQUFHTCxTQUFTO1lBQUM7UUFBdUI7UUFHakZuRCxTQUNFLENBQUMsUUFBUSxFQUFFa0QsU0FBU1osSUFBSSxDQUFDLElBQUksRUFBRVksU0FBU1gsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFVyxTQUFTSSxJQUFJLENBQUMsNENBQTRDLEVBQUVKLFNBQVNWLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDOUk7WUFBRWUsT0FBTztZQUFXQyxLQUFLO2dCQUFFLEdBQUdDLFFBQVFELEdBQUc7Z0JBQUUsR0FBR0wsU0FBUztZQUFDO1FBQXVCO1FBR2pGbkQsU0FDRSxDQUFDLFFBQVEsRUFBRWtELFNBQVNaLElBQUksQ0FBQyxJQUFJLEVBQUVZLFNBQVNYLElBQUksSUFBSSxLQUFLLElBQUksRUFBRVcsU0FBU0ksSUFBSSxDQUFDLG9DQUFvQyxFQUFFSixTQUFTVixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQ3RJO1lBQUVlLE9BQU87WUFBV0MsS0FBSztnQkFBRSxHQUFHQyxRQUFRRCxHQUFHO2dCQUFFLEdBQUdMLFNBQVM7WUFBQztRQUF1QjtRQUdqRiwyREFBMkQ7UUFDM0QsTUFBTU8sZUFBZTtZQUFFTixZQUFZSCxZQUFZSSxRQUFRLElBQUk7UUFBRztRQUM5RCxNQUFNTSxVQUFVLENBQUMsV0FBVyxFQUFFVixZQUFZWCxJQUFJLENBQUMsSUFBSSxFQUFFVyxZQUFZVixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUVVLFlBQVlLLElBQUksQ0FBQyxJQUFJLEVBQUVMLFlBQVlULFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDckksTUFBTW9CLGFBQWEsQ0FBQyxjQUFjLEVBQUVWLFNBQVNaLElBQUksQ0FBQyxJQUFJLEVBQUVZLFNBQVNYLElBQUksSUFBSSxLQUFLLElBQUksRUFBRVcsU0FBU0ksSUFBSSxDQUFDLElBQUksRUFBRUosU0FBU1YsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBRS9JeEMsU0FBUyxHQUFHMkQsUUFBUSxlQUFlLEVBQUVULFNBQVNHLFFBQVEsSUFBSSxHQUFHLEVBQUUsRUFBRU8sWUFBWSxFQUFFO1lBQzdFTCxPQUFPO1lBQ1BDLEtBQUs7Z0JBQUUsR0FBR0MsUUFBUUQsR0FBRztnQkFBRSxHQUFHRSxZQUFZO1lBQUM7WUFDdkNHLE9BQU87UUFDVDtJQUNGO0lBRVFDLGlCQUFpQixJQUFJQyxNQUFjO0lBQzNDLE1BQU1DLGNBQWNDLFFBQWdCLEVBQUVDLEdBQWEsRUFBRTtRQUNuRCwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDSixjQUFjLENBQUNLLEtBQUs7UUFFekIsTUFBTUMsVUFBVS9ELE9BQ2QsQUFDRSxDQUFBLE1BQU1nRSxRQUFRQyxHQUFHLENBQ2ZKLElBQUlLLEdBQUcsQ0FBQyxPQUFPQztZQUNiLE9BQU8sTUFBTSxJQUFJLENBQUNDLGdCQUFnQixDQUFDUixVQUFVLE1BQU1PO1FBQ3JELEdBQ0YsRUFDQUUsSUFBSTtRQUdSLE1BQU1DLE1BQU1uRSxVQUFVb0UsS0FBSyxDQUFDO1FBQzVCLEtBQUssTUFBTUMsU0FBU1QsUUFBUztZQUMzQixNQUFNLENBQUNVLElBQUksR0FBRyxNQUFNSCxJQUFJN0IsR0FBRyxDQUFDK0I7WUFDNUJFLFFBQVFDLEdBQUcsQ0FBQztnQkFDVkg7Z0JBQ0FJLE1BQU1ILElBQUlHLElBQUk7WUFDaEI7UUFDRjtJQUNGO0lBRUEsTUFBTVIsaUJBQWlCUixRQUFnQixFQUFFaUIsS0FBYSxFQUFFVixFQUFVLEVBQXFCO1FBQ3JGLE1BQU1XLFlBQVksR0FBR2xCLFNBQVMsQ0FBQyxFQUFFaUIsTUFBTSxDQUFDLEVBQUVWLElBQUk7UUFFOUMsMkJBQTJCO1FBQzNCLElBQUksSUFBSSxDQUFDVixjQUFjLENBQUNzQixHQUFHLENBQUNELFlBQVk7WUFDdEMsT0FBTyxFQUFFO1FBQ1g7UUFDQSxJQUFJLENBQUNyQixjQUFjLENBQUN1QixHQUFHLENBQUNGO1FBRXhCSixRQUFRQyxHQUFHLENBQUM7WUFBRWY7WUFBVWlCO1lBQU9WO1FBQUc7UUFDbEMsTUFBTWMsU0FBUzVFLGNBQWM2RSxHQUFHLENBQUN0QjtRQUNqQyxNQUFNVSxNQUFNbkUsVUFBVW9FLEtBQUssQ0FBQztRQUU1QixtQkFBbUI7UUFDbkIsTUFBTSxDQUFDWSxJQUFJLEdBQUcsTUFBTWIsSUFBSVcsT0FBT0csS0FBSyxFQUFFQyxLQUFLLENBQUNSLE9BQU9WLElBQUltQixLQUFLLENBQUM7UUFDN0QsSUFBSUgsUUFBUUksV0FBVztZQUNyQixNQUFNLElBQUl2RSxNQUFNLEdBQUc0QyxTQUFTLENBQUMsRUFBRU8sR0FBRyxnQkFBZ0IsQ0FBQztRQUNyRDtRQUVBLGFBQWE7UUFDYixNQUFNcUIsa0JBQWtCLEFBQUN0RixPQUFPeUIsUUFBUSxDQUFDUyxPQUFPLENBQUNMLFVBQVUsQ0FBMkJJLFFBQVE7UUFDOUYsTUFBTXNELGVBQWUsQUFBQ3ZGLE9BQU95QixRQUFRLENBQUNFLGlCQUFpQixDQUFDRSxVQUFVLENBQy9ESSxRQUFRO1FBRVgsTUFBTXVELFlBQVksQ0FBQyxxQkFBcUIsRUFBRUYsZ0JBQWdCLEtBQUssRUFBRVAsT0FBT0csS0FBSyxDQUFDLG9CQUFvQixFQUFFSyxhQUFhLEtBQUssRUFBRVIsT0FBT0csS0FBSyxDQUFDLGtCQUFrQixFQUFFakIsR0FBRyxDQUFDLENBQUM7UUFFOUosTUFBTXdCLE9BQU9DLE9BQU9DLE9BQU8sQ0FBQ1osT0FBT2EsU0FBUyxFQUN6Q0MsTUFBTSxDQUNMLENBQUMsR0FBR0MsU0FBUyxHQUNYMUYsMkJBQTJCMEYsYUFDMUJ2Rix1QkFBdUJ1RixhQUFhQSxTQUFTQyxnQkFBZ0IsS0FBS1YsV0FFdEVyQixHQUFHLENBQUMsQ0FBQyxHQUFHOEIsU0FBUztZQUNoQjs7Ozs7OztRQU9BLEdBQ0EsSUFBSW5CO1lBQ0osSUFBSVY7WUFDSixJQUFJMUQsdUJBQXVCdUYsYUFBYSxDQUFDQSxTQUFTRSxhQUFhLEVBQUU7Z0JBQy9ELE1BQU1DLGdCQUFnQjlGLGNBQWM2RSxHQUFHLENBQUNjLFNBQVNJLElBQUk7Z0JBQ3JELE1BQU1DLHNCQUFzQkYsY0FBY0csS0FBSyxDQUFDQyxJQUFJLENBQ2xELENBQUNDLElBQU05RixlQUFlOEYsTUFBTUEsRUFBRUosSUFBSSxLQUFLbkIsT0FBT2QsRUFBRSxHQUMvQ3NDO2dCQUNILElBQUksQ0FBQ0oscUJBQXFCO29CQUN4QixNQUFNLElBQUlyRixNQUFNLEdBQUdtRixjQUFjaEMsRUFBRSxDQUFDLEVBQUUsRUFBRWMsT0FBT2QsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2dCQUN2RTtnQkFDQVUsUUFBUSxHQUFHd0Isb0JBQW9CLEdBQUcsQ0FBQztnQkFDbkNsQyxLQUFLZ0IsSUFBSWhCLEVBQUU7WUFDYixPQUFPO2dCQUNMVSxRQUFRO2dCQUNSVixLQUFLZ0IsR0FBRyxDQUFDLEdBQUdhLFNBQVNTLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQztZQUNBLE9BQU87Z0JBQ0w3QyxVQUFVb0MsU0FBU0ksSUFBSTtnQkFDdkJ2QjtnQkFDQVY7WUFDRjtRQUNGLEdBQ0M0QixNQUFNLENBQUMsQ0FBQ1csTUFBUUEsSUFBSXZDLEVBQUUsS0FBSztRQUU5QixNQUFNd0MsYUFBYSxNQUFNM0MsUUFBUUMsR0FBRyxDQUNsQzBCLEtBQUt6QixHQUFHLENBQUMsT0FBT3lCO1lBQ2QsT0FBTyxJQUFJLENBQUN2QixnQkFBZ0IsQ0FBQ3VCLEtBQUsvQixRQUFRLEVBQUUrQixLQUFLZCxLQUFLLEVBQUVjLEtBQUt4QixFQUFFO1FBQ2pFO1FBR0YsT0FBTztlQUFJbkUsT0FBTzJHLFdBQVdDLE9BQU8sR0FBR3ZDLElBQUk7WUFBS3FCO1NBQVU7SUFDNUQ7SUFFQSxNQUFNbUIsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDL0YsSUFBSSxFQUFFO1lBQ2IsTUFBTSxJQUFJLENBQUNBLElBQUksQ0FBQytGLE9BQU87WUFDdkIsSUFBSSxDQUFDL0YsSUFBSSxHQUFHO1FBQ2Q7UUFDQSxJQUFJLElBQUksQ0FBQ0csSUFBSSxFQUFFO1lBQ2IsTUFBTSxJQUFJLENBQUNBLElBQUksQ0FBQzRGLE9BQU87WUFDdkIsSUFBSSxDQUFDNUYsSUFBSSxHQUFHO1FBQ2Q7UUFDQSxNQUFNZCxVQUFVMEcsT0FBTztJQUN6QjtJQUVBLE1BQU1DLFlBQ0pDLFlBQWtDLEVBQ2xDQyxZQUFrQyxFQUNsQ0MsYUFBbUMsRUFDbkNDLGNBQXNDLEVBQ3RDO1FBQ0EsTUFBTUMsV0FBV3BILEtBQUtHLE9BQU95QixRQUFRLENBQUNvRixhQUFhO1FBQ25ELE1BQU1LLFdBQVdySCxLQUFLRyxPQUFPeUIsUUFBUSxDQUFDcUYsYUFBYTtRQUVuRCxNQUFNLEVBQUVwRCxRQUFRLEVBQUVpQixLQUFLLEVBQUV3QyxLQUFLLEVBQUVDLFVBQVUsRUFBRSxHQUFHTDtRQUUvQyxNQUFNaEMsU0FBUzVFLGNBQWM2RSxHQUFHLENBQUN0QjtRQUNqQyxNQUFNMkQsU0FDSnRDLE9BQU9xQixLQUFLLENBQUNDLElBQUksQ0FBQyxDQUFDaUIsT0FBU0EsS0FBS2YsSUFBSSxLQUFLNUIsUUFBUTRDLFNBQVMsYUFBYSxHQUFHNUMsTUFBTSxHQUFHLENBQUMsR0FBR0E7UUFFMUYsSUFBSUwsUUFBUTJDLFNBQVNsQyxPQUFPRyxLQUFLO1FBQ2pDLElBQUlrQyxlQUFlLFVBQVU7WUFDM0I5QyxRQUFRQSxNQUFNYSxLQUFLLENBQUNrQyxRQUFRRjtRQUM5QixPQUFPLElBQUlDLGVBQWUsUUFBUTtZQUNoQzlDLFFBQVFBLE1BQU1hLEtBQUssQ0FBQ2tDLFFBQVEsUUFBUSxDQUFDLENBQUMsRUFBRUYsTUFBTSxDQUFDLENBQUM7UUFDbEQ7UUFFQSxNQUFNSyxPQUFPLE1BQU1sRDtRQUNuQixJQUFJa0QsS0FBS0MsTUFBTSxLQUFLLEdBQUc7WUFDckIsTUFBTSxJQUFJM0csTUFBTTtRQUNsQjtRQUVBLE1BQU00RyxXQUE0QixFQUFFO1FBQ3BDLEtBQUssTUFBTXpDLE9BQU91QyxLQUFNO1lBQ3RCLE1BQU1HLHVCQUF1QkQsU0FBU0QsTUFBTTtZQUM1QyxNQUFNRyxhQUFhLE1BQU0sSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQzlDLFFBQVFFLEtBQUs7Z0JBQzdENkMsS0FBS2I7WUFDUDtZQUNBUyxTQUFTSyxJQUFJLElBQUlIO1lBQ2pCLE1BQU1JLHVCQUF1Qk4sU0FBU3JCLElBQUksQ0FBQyxDQUFDNEIsSUFBTUEsRUFBRUMsU0FBUyxLQUFLLEdBQUd4RSxTQUFTLENBQUMsRUFBRXVCLElBQUloQixFQUFFLEVBQUU7WUFFekYsSUFBSStELHNCQUFzQjtnQkFDeEIsc0NBQXNDO2dCQUN0Q0EscUJBQXFCRyxjQUFjLEdBQUdULFNBQ25DN0IsTUFBTSxDQUFDLENBQUNvQyxJQUFNQSxFQUFFQyxTQUFTLEtBQUtGLHFCQUFxQkUsU0FBUyxFQUM1REUsS0FBSyxDQUFDVCxzQkFDTjNELEdBQUcsQ0FBQyxDQUFDaUUsSUFBTUEsRUFBRUMsU0FBUztZQUMzQjtRQUNGO1FBRUEsV0FBVyxNQUFNaEcsV0FBV3dGLFNBQVU7WUFDcEMsTUFBTTNDLFNBQVM1RSxjQUFjNkUsR0FBRyxDQUFDOUMsUUFBUXdCLFFBQVE7WUFFakQsOEJBQThCO1lBQzlCLE1BQU0yRSxnQkFBZ0JyQixnQkFBZ0JzQixTQUFTLENBQUNwRyxRQUFRd0IsUUFBUSxDQUFDO1lBQ2pFLElBQUkyRSxpQkFBaUJBLGNBQWNaLE1BQU0sR0FBRyxHQUFHO2dCQUM3QyxNQUFNYyxxQkFBcUIsTUFBTSxJQUFJLENBQUNDLHVCQUF1QixDQUMzRHRCLFVBQ0FuQyxRQUNBN0MsU0FDQW1HO2dCQUVGLElBQUlFLG9CQUFvQjtvQkFDdEIsTUFBTSxDQUFDRSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUNaLG1CQUFtQixDQUFDOUMsUUFBUXdELG9CQUFvQjt3QkFDMUVHLGNBQWM7d0JBQ2RaLEtBQUtaO29CQUNQO29CQUNBaEYsUUFBUXlHLE1BQU0sR0FBR0Y7Z0JBQ25CO1lBQ0Y7WUFFQSx5Q0FBeUM7WUFDekMsTUFBTUcsWUFBWSxNQUFNLElBQUksQ0FBQ0Msb0JBQW9CLENBQUMzQixVQUFVbkMsUUFBUTdDO1lBQ3BFLElBQUkwRyxXQUFXO2dCQUNiLE1BQU0sQ0FBQ0gsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDWixtQkFBbUIsQ0FBQzlDLFFBQVE2RCxXQUFXO29CQUNqRUYsY0FBYztvQkFDZFosS0FBS1o7Z0JBQ1A7Z0JBQ0FoRixRQUFRcEMsTUFBTSxHQUFHMkk7WUFDbkI7UUFDRjtRQUVBLE1BQU12QixTQUFTUCxPQUFPO1FBQ3RCLE1BQU1NLFNBQVNOLE9BQU87UUFFdEIsT0FBTzdHLE9BQU80SCxVQUFVLENBQUNvQixJQUFNQSxFQUFFWixTQUFTO0lBQzVDO0lBRUEsTUFBTUwsb0JBQ0o5QyxNQUFjLEVBQ2RFLEdBR0MsRUFDRDhELE9BR0MsRUFDeUI7UUFDMUIsTUFBTUMsVUFBMkIsRUFBRTtRQUNuQyxNQUFNQyxrQkFBa0IsSUFBSXpGO1FBRTVCLE1BQU0wRixTQUFTLE9BQ2JuRSxRQUNBRTtZQUtBLE1BQU1pRCxZQUFZLEdBQUduRCxPQUFPZCxFQUFFLENBQUMsQ0FBQyxFQUFFZ0IsSUFBSWhCLEVBQUUsRUFBRTtZQUMxQyxJQUFJZ0YsZ0JBQWdCcEUsR0FBRyxDQUFDcUQsWUFBWTtnQkFDbEM7WUFDRjtZQUNBZSxnQkFBZ0JuRSxHQUFHLENBQUNvRDtZQUVwQixNQUFNTyxTQUF3QjtnQkFDNUJQO2dCQUNBeEUsVUFBVXFCLE9BQU9kLEVBQUU7Z0JBQ25CQSxJQUFJZ0IsSUFBSWhCLEVBQUU7Z0JBQ1ZxRSxTQUFTLENBQUM7Z0JBQ1ZILGdCQUFnQixFQUFFO2dCQUNsQmdCLGdCQUFnQixFQUFFO1lBQ3BCO1lBRUEsS0FBSyxNQUFNN0IsUUFBUXZDLE9BQU9xQixLQUFLLENBQUU7Z0JBQy9CLElBQUkzRixjQUFjNkcsT0FBTztvQkFDdkI7Z0JBQ0Y7Z0JBRUFtQixPQUFPSCxPQUFPLENBQUNoQixLQUFLZixJQUFJLENBQUMsR0FBRztvQkFDMUJlLE1BQU1BO29CQUNOSCxPQUFPbEMsR0FBRyxDQUFDcUMsS0FBS2YsSUFBSSxDQUFDO2dCQUN2QjtnQkFFQSxNQUFNbkUsS0FBSzJHLFNBQVNqQixPQUFPN0gsVUFBVW9FLEtBQUssQ0FBQztnQkFDM0MsSUFBSS9ELHlCQUF5QmdILE9BQU87b0JBQ2xDLE1BQU1yQixnQkFBZ0I5RixjQUFjNkUsR0FBRyxDQUFDc0MsS0FBS3BCLElBQUk7b0JBQ2pELE1BQU1rRCxlQUFlOUIsS0FBSytCLFNBQVM7b0JBQ25DLE1BQU1DLGFBQWEsR0FBRzFKLFdBQVcySixXQUFXLENBQUN4RSxPQUFPRyxLQUFLLEVBQUUsR0FBRyxDQUFDO29CQUMvRCxNQUFNc0UsV0FBVyxHQUFHNUosV0FBVzJKLFdBQVcsQ0FBQ3RELGNBQWNmLEtBQUssRUFBRSxHQUFHLENBQUM7b0JBRXBFLE1BQU11RSxhQUFhLE1BQU1ySCxHQUFHZ0gsY0FBY2pFLEtBQUssQ0FBQ21FLFlBQVlyRSxJQUFJaEIsRUFBRSxFQUFFeUYsS0FBSyxDQUFDRjtvQkFDMUVmLE9BQU9ILE9BQU8sQ0FBQ2hCLEtBQUtmLElBQUksQ0FBQyxDQUFDWSxLQUFLLEdBQUdzQztnQkFDcEMsT0FBTyxJQUFJcEosc0JBQXNCaUgsT0FBTztvQkFDdEMsTUFBTXJCLGdCQUFnQjlGLGNBQWM2RSxHQUFHLENBQUNzQyxLQUFLcEIsSUFBSTtvQkFDakQsTUFBTXVELGFBQWEsTUFBTXJILEdBQUc2RCxjQUFjZixLQUFLLEVBQzVDQyxLQUFLLENBQUNtQyxLQUFLcUMsVUFBVSxFQUFFMUUsSUFBSWhCLEVBQUUsRUFDN0J5RixLQUFLLENBQUM7b0JBQ1RqQixPQUFPSCxPQUFPLENBQUNoQixLQUFLZixJQUFJLENBQUMsQ0FBQ1ksS0FBSyxHQUFHc0M7Z0JBQ3BDLE9BQU8sSUFBSWxKLHVCQUF1QitHLFNBQVMsQ0FBQ0EsS0FBS3RCLGFBQWEsRUFBRTtvQkFDOUQsTUFBTUMsZ0JBQWdCOUYsY0FBYzZFLEdBQUcsQ0FBQ3NDLEtBQUtwQixJQUFJO29CQUNqRCxNQUFNMEQsY0FBYzNELGNBQWNHLEtBQUssQ0FBQ0MsSUFBSSxDQUMxQyxDQUFDQyxJQUFNOUYsZUFBZThGLE1BQU1BLEVBQUVKLElBQUksS0FBS25CLE9BQU9kLEVBQUU7b0JBRWxELElBQUkyRixhQUFhO3dCQUNmLE1BQU1DLGFBQWEsTUFBTXpILEdBQUc2RCxjQUFjZixLQUFLLEVBQUVDLEtBQUssQ0FBQyxNQUFNRixJQUFJaEIsRUFBRSxFQUFFNkYsS0FBSzt3QkFDMUVyQixPQUFPSCxPQUFPLENBQUNoQixLQUFLZixJQUFJLENBQUMsQ0FBQ1ksS0FBSyxHQUFHMEMsWUFBWTVGO29CQUNoRDtnQkFDRixPQUFPLElBQUl6RCxlQUFlOEcsT0FBTztvQkFDL0IsTUFBTXlDLFlBQVk5RSxHQUFHLENBQUMsR0FBR3FDLEtBQUtmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeENrQyxPQUFPSCxPQUFPLENBQUNoQixLQUFLZixJQUFJLENBQUMsQ0FBQ1ksS0FBSyxHQUFHNEM7b0JBQ2xDLElBQUlBLFdBQVc7d0JBQ2J0QixPQUFPVSxjQUFjLENBQUNwQixJQUFJLENBQUMsR0FBR1QsS0FBS3BCLElBQUksQ0FBQyxDQUFDLEVBQUU2RCxXQUFXO29CQUN4RDtvQkFDQSxJQUFJLENBQUNoQixTQUFTTCxnQkFBZ0JxQixXQUFXO3dCQUN2QyxNQUFNOUQsZ0JBQWdCOUYsY0FBYzZFLEdBQUcsQ0FBQ3NDLEtBQUtwQixJQUFJO3dCQUNqRCxNQUFNMkQsYUFBYSxNQUFNekgsR0FBRzZELGNBQWNmLEtBQUssRUFBRUMsS0FBSyxDQUFDLE1BQU00RSxXQUFXRCxLQUFLO3dCQUM3RSxJQUFJRCxZQUFZOzRCQUNkLE1BQU1YLE9BQU9qRCxlQUFlNEQ7d0JBQzlCO29CQUNGO2dCQUNGO1lBQ0Y7WUFFQWIsUUFBUWpCLElBQUksQ0FBQ1U7UUFDZjtRQUVBLE1BQU1TLE9BQU9uRSxRQUFRRTtRQUVyQixPQUFPK0Q7SUFDVDtJQUVBOzs7O0dBSUMsR0FDRCxNQUFNZ0IsZUFDSkMsTUFBNEIsRUFDNUJDLFNBQTBCLEVBQ007UUFDaEMsTUFBTXhDLFdBQVc1SCxPQUFPb0ssV0FBVyxDQUFDcEIsSUFBTUEsRUFBRVosU0FBUztRQUVyRCxNQUFNO1FBQ04sSUFBSSxDQUFDL0csT0FBTyxHQUFHLElBQUlqQjtRQUNuQixJQUFJLENBQUNrQixhQUFhLEdBQUcsSUFBSUM7UUFDekIsSUFBSSxDQUFDQyxlQUFlLEdBQUcsSUFBSUQ7UUFDM0IsSUFBSSxDQUFDRSxlQUFlLEdBQUcsSUFBSUY7UUFFM0IsTUFBTWUsS0FBS3ZDLEtBQUtHLE9BQU95QixRQUFRLENBQUN3SSxPQUFPO1FBQ3ZDLE1BQU1FLFVBQWlDLEVBQUU7UUFFekMsSUFBSTtZQUNGLHdDQUF3QztZQUN4QyxJQUFJLENBQUNqSixhQUFhLENBQUNrSixVQUFVLENBQUMxQztZQUM5QixNQUFNMkMsaUJBQWlCLElBQUksQ0FBQ25KLGFBQWEsQ0FBQ29KLGlCQUFpQjtZQUUzRCwwQ0FBMEM7WUFDMUMsS0FBSyxNQUFNcEMsYUFBYW1DLGVBQWdCO2dCQUN0QyxNQUFNbkksVUFBVXdGLFNBQVNyQixJQUFJLENBQUMsQ0FBQ3lDLElBQU1BLEVBQUVaLFNBQVMsS0FBS0E7Z0JBQ3JELElBQUksQ0FBQ2hHLFNBQVM7Z0JBRWQsTUFBTXFJLFlBQVksQ0FBQyxDQUFDckksUUFBUXlHLE1BQU07Z0JBQ2xDLE1BQU02QixZQUFZLENBQUMsQ0FBQ3RJLFFBQVFwQyxNQUFNO2dCQUNsQyxNQUFNMkssZUFBZUYsYUFBYUM7Z0JBRWxDLGdDQUFnQztnQkFDaEMsSUFBSUMsZ0JBQWdCLENBQUN2SSxRQUFRd0ksUUFBUSxFQUFFO29CQUNyQyx1Q0FBdUM7b0JBQ3ZDLE1BQU1DLGFBQWF6SSxRQUFRcEMsTUFBTSxFQUFFbUUsTUFBTS9CLFFBQVF5RyxNQUFNLEVBQUUxRTtvQkFDekQxRSxPQUFPb0w7b0JBQ1AsSUFBSSxDQUFDcEosZUFBZSxDQUFDcUosR0FBRyxDQUFDMUMsV0FBVzt3QkFDbEN4RSxVQUFVeEIsUUFBUXdCLFFBQVE7d0JBQzFCaUg7b0JBQ0Y7b0JBRUFuRyxRQUFRQyxHQUFHLENBQ1RqRixNQUFNcUwsTUFBTSxDQUNWLENBQUMsUUFBUSxFQUFFM0ksUUFBUXdCLFFBQVEsQ0FBQyxDQUFDLEVBQUV4QixRQUFRK0IsRUFBRSxDQUFDLGFBQWEsRUFBRTBHLFdBQVcsa0JBQWtCLENBQUM7b0JBRzNGO2dCQUNGO2dCQUVBLElBQUksQ0FBQ0csZUFBZSxDQUFDNUk7Z0JBQ3JCc0MsUUFBUUMsR0FBRyxDQUNUakYsTUFBTXVMLElBQUksQ0FDUixDQUFDLFdBQVcsRUFBRTdJLFFBQVF3QixRQUFRLENBQUMsQ0FBQyxFQUFFeEIsUUFBUStCLEVBQUUsR0FBRy9CLFFBQVF3SSxRQUFRLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRXhJLFFBQVF5RyxNQUFNLEVBQUUxRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUk7WUFHN0g7WUFFQSxvQkFBb0I7WUFDcEIsTUFBTStHLGFBQWEsSUFBSSxDQUFDQyxhQUFhLENBQUN2RDtZQUV0QyxNQUFNdEYsR0FBRzhJLFdBQVcsQ0FBQyxPQUFPQztnQkFDMUIsTUFBTUMscUJBQXFCLElBQUkvSjtnQkFFL0IsS0FBSyxNQUFNZ0IsYUFBYTJJLFdBQVk7b0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUM3SixPQUFPLENBQUNrSyxRQUFRLENBQUNoSixZQUFZO29CQUV2Qyx5QkFBeUI7b0JBQ3pCLE1BQU02QyxRQUFRLElBQUksQ0FBQy9ELE9BQU8sQ0FBQ21LLFFBQVEsQ0FBQ2pKO29CQUNwQyxNQUFNa0osUUFBUXJHLE1BQU1zQyxJQUFJLENBQUN4RCxHQUFHLENBQUMsQ0FBQ2lCLE1BQVFBLElBQUl1RyxJQUFJO29CQUU5Q2hILFFBQVFDLEdBQUcsQ0FBQ2pGLE1BQU11TCxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUxSSxVQUFVLE1BQU0sRUFBRWtKLE1BQU05RCxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUN6RSxNQUFNLElBQUksQ0FBQ3RHLE9BQU8sQ0FBQ3NLLE1BQU0sQ0FBQ04sS0FBSzlJO29CQUUvQixpQ0FBaUM7b0JBQ2pDLElBQUlrSixNQUFNOUQsTUFBTSxHQUFHLEdBQUc7d0JBQ3BCLE1BQU1pRSxXQUFXLElBQUlySzt3QkFDckIsTUFBTW1HLE9BQU8sTUFBTTJELElBQUk5SSxXQUNwQnNKLE1BQU0sQ0FBQyxRQUFRLE1BQ2ZDLE9BQU8sQ0FBQyxRQUFRTDt3QkFFbkIsS0FBSyxNQUFNdEcsT0FBT3VDLEtBQU07NEJBQ3RCa0UsU0FBU2QsR0FBRyxDQUFDM0YsSUFBSXVHLElBQUksRUFBRXZHLElBQUloQixFQUFFO3dCQUMvQjt3QkFFQW1ILG1CQUFtQlIsR0FBRyxDQUFDdkksV0FBV3FKO29CQUNwQztnQkFDRjtnQkFFQSxzQkFBc0I7Z0JBQ3RCLE1BQU0sSUFBSSxDQUFDRywwQkFBMEIsQ0FBQ1YsS0FBS3pELFVBQVUwRDtnQkFFckQsV0FBVztnQkFDWCxLQUFLLE1BQU1sSixXQUFXd0YsU0FBVTtvQkFDOUIsTUFBTTNDLFNBQVM1RSxjQUFjNkUsR0FBRyxDQUFDOUMsUUFBUXdCLFFBQVE7b0JBRWpELGdDQUFnQztvQkFDaEMsTUFBTW9JLFVBQVUsSUFBSSxDQUFDdkssZUFBZSxDQUFDeUQsR0FBRyxDQUFDOUMsUUFBUWdHLFNBQVM7b0JBQzFELElBQUk0RCxTQUFTO3dCQUNYM0IsUUFBUXBDLElBQUksQ0FBQzs0QkFDWHJFLFVBQVV4QixRQUFRd0IsUUFBUTs0QkFDMUJxSSxNQUFNLE1BQU1aLElBQUlwRyxPQUFPRyxLQUFLLEVBQUVDLEtBQUssQ0FBQyxNQUFNMkcsUUFBUW5CLFVBQVUsRUFBRWIsS0FBSzt3QkFDckU7d0JBQ0E7b0JBQ0Y7b0JBRUEsTUFBTWtDLE1BQU0sSUFBSSxDQUFDNUssYUFBYSxDQUFDNEQsR0FBRyxDQUFDOUMsUUFBUWdHLFNBQVM7b0JBQ3BELElBQUk4RCxLQUFLO3dCQUNQLE1BQU1OLFdBQVdOLG1CQUFtQnBHLEdBQUcsQ0FBQ0QsT0FBT0csS0FBSzt3QkFDcEQsTUFBTStHLGFBQWFQLFVBQVUxRyxJQUFJZ0gsSUFBSVIsSUFBSTt3QkFFekMsSUFBSVMsZUFBZTVHLFdBQVc7NEJBQzVCOEUsUUFBUXBDLElBQUksQ0FBQztnQ0FDWHJFLFVBQVV4QixRQUFRd0IsUUFBUTtnQ0FDMUJxSSxNQUFNLE1BQU1aLElBQUlwRyxPQUFPRyxLQUFLLEVBQUVDLEtBQUssQ0FBQyxNQUFNOEcsWUFBWW5DLEtBQUs7NEJBQzdEOzRCQUVBdEYsUUFBUUMsR0FBRyxDQUNUakYsTUFBTTBNLEtBQUssQ0FBQyxDQUFDLGNBQWMsRUFBRW5ILE9BQU9HLEtBQUssQ0FBQyxHQUFHLEVBQUVoRCxRQUFRK0IsRUFBRSxDQUFDLEtBQUssRUFBRWdJLFlBQVk7d0JBRWpGO29CQUNGO2dCQUNGO1lBQ0Y7UUFDRixTQUFVO1lBQ1IsTUFBTTdKLEdBQUd1RSxPQUFPO1FBQ2xCO1FBRUEsT0FBTzdHLE9BQU9xSyxTQUFTLENBQUNsQyxJQUFNLEdBQUdBLEVBQUV2RSxRQUFRLENBQUMsQ0FBQyxFQUFFdUUsRUFBRThELElBQUksQ0FBQzlILEVBQUUsRUFBRTtJQUM1RDtJQUVBOztHQUVDLEdBQ0QsQUFBUTZHLGdCQUFnQjVJLE9BQXNCLEVBQVM7UUFDckQsTUFBTTZDLFNBQVM1RSxjQUFjNkUsR0FBRyxDQUFDOUMsUUFBUXdCLFFBQVE7UUFDakQsTUFBTXVCLE1BQStCLENBQUM7UUFFdEMseURBQXlEO1FBQ3pELE1BQU1rSCxpQkFBaUJqSyxRQUFReUcsTUFBTSxJQUFJekcsUUFBUXBDLE1BQU07UUFDdkQsTUFBTXNNLGlCQUFpQmxLLFFBQVF3SSxRQUFRLElBQUl5QjtRQUUzQyxLQUFLLE1BQU0sQ0FBQ0UsVUFBVWhGLE9BQU8sSUFBSTNCLE9BQU9DLE9BQU8sQ0FBQ3pELFFBQVFvRyxPQUFPLEVBQUc7WUFDaEUsTUFBTWhCLE9BQU9ELE9BQU9DLElBQUk7WUFFeEIsSUFBSTdHLGNBQWM2RyxPQUFPO2dCQUN2QjtZQUNGO1lBRUEsc0NBQXNDO1lBQ3RDLElBQUkrRSxhQUFhLFFBQVFBLGFBQWEsUUFBUTtnQkFDNUMsSUFBSUQsa0JBQWtCRCxnQkFBZ0I7b0JBQ3BDLGtDQUFrQztvQkFDbENsSCxHQUFHLENBQUNvSCxTQUFTLEdBQUdGLGVBQWU3RCxPQUFPLENBQUMrRCxTQUFTLEVBQUVsRjtnQkFDcEQ7Z0JBRUE7WUFDRjtZQUVBLElBQUkzRyxlQUFlOEcsT0FBTztnQkFDeEIsSUFDRWxILDJCQUEyQmtILFNBQzFCL0csdUJBQXVCK0csU0FBU0EsS0FBS3RCLGFBQWEsRUFDbkQ7b0JBQ0EsTUFBTStELFlBQVkxQyxPQUFPRixLQUFLO29CQUM5QixJQUFJNEMsY0FBYyxRQUFRQSxjQUFjMUUsV0FBVzt3QkFDakQsTUFBTWlILG1CQUFtQixHQUFHaEYsS0FBS3BCLElBQUksQ0FBQyxDQUFDLEVBQUU2RCxXQUFXO3dCQUVwRCx3QkFBd0I7d0JBQ3hCLE1BQU13QyxvQkFBb0IsSUFBSSxDQUFDaEwsZUFBZSxDQUFDeUQsR0FBRyxDQUFDc0gsbUJBQW1CM0I7d0JBQ3RFLElBQUk0QixzQkFBc0JsSCxXQUFXOzRCQUNuQywwQ0FBMEM7NEJBQzFDSixHQUFHLENBQUMsR0FBR29ILFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBR0U7d0JBQzFCLE9BQU87NEJBQ0wsTUFBTUMsYUFBYSxJQUFJLENBQUNwTCxhQUFhLENBQUM0RCxHQUFHLENBQUNzSDs0QkFDMUMsSUFBSUUsWUFBWTtnQ0FDZCwrQkFBK0I7Z0NBQy9CdkgsR0FBRyxDQUFDLEdBQUdvSCxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUdHOzRCQUMxQixPQUFPO2dDQUNMLG9DQUFvQztnQ0FDcEN2SCxHQUFHLENBQUMsR0FBR29ILFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBR3RDOzRCQUMxQjt3QkFDRjtvQkFDRixPQUFPO3dCQUNMOUUsR0FBRyxDQUFDLEdBQUdvSCxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUc7b0JBQzFCO2dCQUNGO1lBQ0EsNkJBQTZCO1lBQy9CLE9BQU87Z0JBQ0wsUUFBUTtnQkFDUnBILEdBQUcsQ0FBQ29ILFNBQVMsR0FBRyxJQUFJLENBQUNJLGtCQUFrQixDQUFDbkYsTUFBb0JELE9BQU9GLEtBQUs7WUFDMUU7UUFDRjtRQUVBM0MsUUFBUUMsR0FBRyxDQUFDakYsTUFBTXVMLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRWhHLE9BQU9HLEtBQUssQ0FBQyxHQUFHLEVBQUVuRixRQUFRa0YsS0FBSyxPQUFPLE1BQU0sT0FBTztRQUN6RixNQUFNK0csTUFBTSxJQUFJLENBQUM3SyxPQUFPLENBQUN1TCxRQUFRLENBQUMzSCxPQUFPRyxLQUFLLEVBQUVEO1FBQ2hELElBQUksQ0FBQzdELGFBQWEsQ0FBQ3dKLEdBQUcsQ0FBQzFJLFFBQVFnRyxTQUFTLEVBQUU4RDtRQUMxQyxJQUFJLENBQUMxSyxlQUFlLENBQUNzSixHQUFHLENBQUNvQixJQUFJUixJQUFJLEVBQUV0SixRQUFRZ0csU0FBUztRQUVwRCxPQUFPOEQ7SUFDVDtJQUVBOztHQUVDLEdBQ0QsQUFBUVMsbUJBQW1CbkYsSUFBZ0IsRUFBRUgsS0FBYyxFQUFXO1FBQ3BFLElBQUlBLFVBQVUsUUFBUUEsVUFBVTlCLFdBQVc7WUFDekMsT0FBTztRQUNUO1FBRUEsT0FBUWlDLEtBQUtDLElBQUk7WUFDZixLQUFLO2dCQUNILDhEQUE4RDtnQkFDOUQsT0FBT0o7WUFFVCxLQUFLO2dCQUNILElBQUksT0FBT0EsVUFBVSxZQUFZLE9BQU9BLFVBQVUsVUFBVTtvQkFDMUQsT0FBTyxJQUFJd0YsS0FBS3hGO2dCQUNsQjtnQkFDQSxPQUFPQTtZQUVUO2dCQUNFLE9BQU9BO1FBQ1g7SUFDRjtJQUVBOztHQUVDLEdBQ0QsQUFBUThELGNBQWN2RCxRQUF5QixFQUFrQztRQUMvRSxNQUFNa0YsU0FBbUIsRUFBRTtRQUMzQixNQUFNQyxPQUFPLElBQUlySjtRQUVqQixLQUFLLE1BQU10QixXQUFXd0YsU0FBVTtZQUM5QixNQUFNM0MsU0FBUzVFLGNBQWM2RSxHQUFHLENBQUM5QyxRQUFRd0IsUUFBUTtZQUNqRCxJQUFJLENBQUNtSixLQUFLaEksR0FBRyxDQUFDRSxPQUFPRyxLQUFLLEdBQUc7Z0JBQzNCMkgsS0FBSy9ILEdBQUcsQ0FBQ0MsT0FBT0csS0FBSztnQkFDckIwSCxPQUFPN0UsSUFBSSxDQUFDaEQsT0FBT0csS0FBSztZQUMxQjtRQUNGO1FBRUEsT0FBTzBIO0lBQ1Q7SUFFQSxNQUFjZiwyQkFDWlYsR0FBcUIsRUFDckJ6RCxRQUF5QixFQUN6QjBELGtCQUFvRCxFQUNyQztRQUNmLEtBQUssTUFBTWxKLFdBQVd3RixTQUFVO1lBQzlCLE1BQU0zQyxTQUFTNUUsY0FBYzZFLEdBQUcsQ0FBQzlDLFFBQVF3QixRQUFRO1lBQ2pELE1BQU1vSixZQUFZLElBQUksQ0FBQzFMLGFBQWEsQ0FBQzRELEdBQUcsQ0FBQzlDLFFBQVFnRyxTQUFTO1lBRTFELElBQUksQ0FBQzRFLFdBQVc7WUFFaEIsTUFBTUMsaUJBQWlCM0IsbUJBQW1CcEcsR0FBRyxDQUFDRCxPQUFPRyxLQUFLO1lBQzFELE1BQU04SCxXQUFXRCxnQkFBZ0IvSCxJQUFJOEgsVUFBVXRCLElBQUk7WUFFbkQsSUFBSXdCLGFBQWEzSCxXQUFXO1lBRTVCLEtBQUssTUFBTSxHQUFHZ0MsT0FBTyxJQUFJM0IsT0FBT0MsT0FBTyxDQUFDekQsUUFBUW9HLE9BQU8sRUFBRztnQkFDeEQsTUFBTWhCLE9BQU9ELE9BQU9DLElBQUk7Z0JBRXhCLElBQUloSCx5QkFBeUJnSCxTQUFTMkYsTUFBTUMsT0FBTyxDQUFDN0YsT0FBT0YsS0FBSyxHQUFHO29CQUNqRSxpQ0FBaUM7b0JBQ2pDLE1BQU1nRyxjQUFjaE4sY0FBYzZFLEdBQUcsQ0FBQ3NDLEtBQUtwQixJQUFJO29CQUMvQyxJQUFJLElBQUksQ0FBQy9FLE9BQU8sQ0FBQ2tLLFFBQVEsQ0FBQzhCLFlBQVlqSSxLQUFLLE1BQU0sT0FBTztvQkFFeEQsTUFBTXVFLGFBQWFwQyxPQUFPRixLQUFLO29CQUMvQixJQUFJc0MsV0FBV2hDLE1BQU0sS0FBSyxHQUFHO29CQUU3QixNQUFNNEIsWUFBWSxBQUFDL0IsS0FBZ0MrQixTQUFTO29CQUM1RCxNQUFNcEQsZ0JBQWdCOUYsY0FBYzZFLEdBQUcsQ0FBQ3NDLEtBQUtwQixJQUFJO29CQUVqRCxNQUFNa0gsZUFBZSxHQUFHeE4sV0FBVzJKLFdBQVcsQ0FBQ3hFLE9BQU9HLEtBQUssRUFBRSxHQUFHLENBQUM7b0JBQ2pFLE1BQU1tSSxlQUFlLEdBQUd6TixXQUFXMkosV0FBVyxDQUFDdEQsY0FBY2YsS0FBSyxFQUFFLEdBQUcsQ0FBQztvQkFFeEUsS0FBSyxNQUFNNkUsYUFBYU4sV0FBWTt3QkFDbEMsTUFBTTZDLG1CQUFtQixHQUFHaEYsS0FBS3BCLElBQUksQ0FBQyxDQUFDLEVBQUU2RCxXQUFXO3dCQUNwRCxNQUFNeUMsYUFBYSxJQUFJLENBQUNwTCxhQUFhLENBQUM0RCxHQUFHLENBQUNzSDt3QkFFMUMsSUFBSWdCO3dCQUVKLElBQUlkLFlBQVk7NEJBQ2QsTUFBTWUsa0JBQWtCbkMsbUJBQW1CcEcsR0FBRyxDQUFDaUIsY0FBY2YsS0FBSzs0QkFDbEUsTUFBTXNJLGFBQWFELGlCQUFpQnZJLElBQUl3SCxXQUFXaEIsSUFBSTs0QkFFdkQsSUFBSWdDLGVBQWVuSSxXQUFXO2dDQUM1QmIsUUFBUWlKLElBQUksQ0FDVixDQUFDLGdCQUFnQixFQUFFbkIsaUJBQWlCLG1DQUFtQyxDQUFDO2dDQUUxRTs0QkFDRjs0QkFDQWdCLFdBQVdFO3dCQUNiLE9BQU87NEJBQ0xGLFdBQVd2RDt3QkFDYjt3QkFFQSxnQkFBZ0I7d0JBQ2hCLE1BQU0sQ0FBQzJELE1BQU0sR0FBRyxNQUFNdkMsSUFBSTlCLFdBQ3ZCbEUsS0FBSyxDQUFDOzRCQUNMLENBQUNpSSxhQUFhLEVBQUVKOzRCQUNoQixDQUFDSyxhQUFhLEVBQUVDO3dCQUNsQixHQUNDbEksS0FBSyxDQUFDO3dCQUVULElBQUksQ0FBQ3NJLE9BQU87NEJBQ1YsTUFBTXZDLElBQUk5QixXQUFXc0UsTUFBTSxDQUFDO2dDQUMxQixDQUFDUCxhQUFhLEVBQUVKO2dDQUNoQixDQUFDSyxhQUFhLEVBQUVDOzRCQUNsQjs0QkFFQTlJLFFBQVFDLEdBQUcsQ0FDVGpGLE1BQU0wTSxLQUFLLENBQ1QsQ0FBQyxjQUFjLEVBQUU3QyxVQUFVLEVBQUUsRUFBRXRFLE9BQU9HLEtBQUssQ0FBQyxDQUFDLEVBQUU4SCxTQUFTLElBQUksRUFBRS9HLGNBQWNmLEtBQUssQ0FBQyxDQUFDLEVBQUVvSSxTQUFTLENBQUMsQ0FBQzt3QkFHdEc7b0JBQ0Y7Z0JBQ0Y7WUFDRjtRQUNGO0lBQ0Y7SUFFQSxNQUFjekUscUJBQXFCekcsRUFBUSxFQUFFMkMsTUFBYyxFQUFFN0MsT0FBc0IsRUFBRTtRQUNuRixNQUFNMEwsaUJBQWlCN0ksT0FBTzhJLE9BQU8sRUFBRWhJLE9BQU8sQ0FBQ2lJLElBQU1BLEVBQUV2RyxJQUFJLEtBQUssYUFBYSxFQUFFO1FBRS9FLE1BQU13RyxnQkFBZ0JILGVBQWUvSCxNQUFNLENBQUMsQ0FBQ21JLFFBQzNDQSxNQUFNMUYsT0FBTyxDQUFDMkYsS0FBSyxDQUFDLENBQUM1RyxTQUFXLENBQUNBLE9BQU9kLElBQUksQ0FBQzJILFVBQVUsQ0FBQyxHQUFHbkosT0FBT0csS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUU3RSxJQUFJNkksY0FBY3RHLE1BQU0sS0FBSyxHQUFHO1lBQzlCLE9BQU87UUFDVDtRQUVBLElBQUkwRyxjQUFjL0wsR0FBRzJDLE9BQU9HLEtBQUs7UUFDakMsSUFBSWtKLGVBQWU7UUFFbkIsS0FBSyxNQUFNSixTQUFTRCxjQUFlO1lBQ2pDLGtEQUFrRDtZQUNsRCxNQUFNTSxlQUFlTCxNQUFNMUYsT0FBTyxDQUFDZ0csSUFBSSxDQUFDLENBQUNqSDtnQkFDdkMsTUFBTTFDLFFBQVEwQyxPQUFPZCxJQUFJLENBQUNnSSxPQUFPLENBQUMsUUFBUTtnQkFDMUMsT0FBT3JNLFFBQVFvRyxPQUFPLENBQUMzRCxNQUFNLEVBQUV3QyxVQUFVO1lBQzNDO1lBQ0EsSUFBSWtILGNBQWM7Z0JBQ2hCO1lBQ0Y7WUFFQUYsY0FBY0EsWUFBWUssT0FBTyxDQUFDLENBQUNDO2dCQUNqQyxLQUFLLE1BQU1wSCxVQUFVMkcsTUFBTTFGLE9BQU8sQ0FBRTtvQkFDbEMsTUFBTTNELFFBQVEwQyxPQUFPZCxJQUFJLENBQUNnSSxPQUFPLENBQUMsUUFBUTtvQkFFMUMsSUFBSXRCLE1BQU1DLE9BQU8sQ0FBQ2hMLFFBQVFvRyxPQUFPLENBQUMzRCxNQUFNLEVBQUV3QyxRQUFRO3dCQUNoRHNILEdBQUc3QyxPQUFPLENBQUN2RSxPQUFPZCxJQUFJLEVBQUVyRSxRQUFRb0csT0FBTyxDQUFDM0QsTUFBTSxDQUFDd0MsS0FBSztvQkFDdEQsT0FBTzt3QkFDTHNILEdBQUdDLFFBQVEsQ0FBQ3JILE9BQU9kLElBQUksRUFBRXJFLFFBQVFvRyxPQUFPLENBQUMzRCxNQUFNLEVBQUV3QztvQkFDbkQ7Z0JBQ0Y7WUFDRjtZQUNBaUgsZUFBZTtRQUNqQjtRQUVBLElBQUksQ0FBQ0EsY0FBYztZQUNqQixPQUFPO1FBQ1Q7UUFFQSxNQUFNLENBQUNPLFlBQVksR0FBRyxNQUFNUjtRQUM1QixPQUFPUTtJQUNUO0lBRUEsTUFBY25HLHdCQUNacEcsRUFBUSxFQUNSMkMsTUFBYyxFQUNkN0MsT0FBc0IsRUFDdEJvRyxPQUFpQixFQUNqQjtRQUNBLElBQUlBLFFBQVFiLE1BQU0sS0FBSyxHQUFHO1lBQ3hCLE9BQU87UUFDVDtRQUVBLE1BQU1tSCxjQUF1QyxDQUFDO1FBRTlDLEtBQUssTUFBTXZILFVBQVVpQixRQUFTO1lBQzVCLDBCQUEwQjtZQUMxQixNQUFNaEIsT0FBT3ZDLE9BQU9xQixLQUFLLENBQUNDLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxJQUFJLEtBQUtjO1lBQ2pELE1BQU13SCxXQUFXdkgsUUFBUTlHLGVBQWU4RyxRQUFRLEdBQUdELE9BQU8sR0FBRyxDQUFDLEdBQUdBO1lBQ2pFLE1BQU1GLFFBQVFqRixRQUFRb0csT0FBTyxDQUFDakIsT0FBTyxFQUFFRjtZQUV2QywwQkFBMEI7WUFDMUIsSUFBSUEsVUFBVSxRQUFRQSxVQUFVOUIsV0FBVztnQkFDekMsT0FBTztZQUNUO1lBRUF1SixXQUFXLENBQUNDLFNBQVMsR0FBRzFIO1FBQzFCO1FBRUEsTUFBTSxDQUFDdUcsTUFBTSxHQUFHLE1BQU10TCxHQUFHMkMsT0FBT0csS0FBSyxFQUFFQyxLQUFLLENBQUN5SixhQUFheEosS0FBSyxDQUFDO1FBQ2hFLE9BQU9zSTtJQUNUO0lBRUEsTUFBTW9CLGlCQUFpQkMsSUFBWSxFQUFFO1FBQ25DLE1BQU1DLE9BQU8sR0FBR2hQLE9BQU9pUCxXQUFXLENBQUMsdUJBQXVCLENBQUM7UUFDM0QsTUFBTUMsVUFBVXhQLGFBQWFzUCxNQUFNRyxRQUFRO1FBRTNDLE1BQU1DLHFCQUFxQkYsUUFBUUcsT0FBTyxDQUFDO1FBQzNDLE1BQU1DLG1CQUFtQkosUUFBUUcsT0FBTyxDQUFDLE1BQU1EO1FBRS9DLElBQUlBLHVCQUF1QixDQUFDLEtBQUtFLHFCQUFxQixDQUFDLEdBQUc7WUFDeEQsTUFBTUMsYUFBYSxHQUFHTCxRQUFROUcsS0FBSyxDQUFDLEdBQUdrSCxrQkFBa0IsRUFBRSxFQUFFUCxLQUFLLEVBQUUsRUFBRUcsUUFBUTlHLEtBQUssQ0FBQ2tILG1CQUFtQjtZQUV2RzNQLGNBQWNxUCxNQUFNTztRQUN0QixPQUFPO1lBQ0wsTUFBTSxJQUFJek8sTUFBTTtRQUNsQjtJQUNGO0FBQ0Y7QUFFQSxPQUFPLE1BQU0wTyxpQkFBaUIsSUFBSTdPLHNCQUFzQiJ9
|
|
623
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFiYXNlU2NoZW1hRXh0ZW5kLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZUltcG9ydFJlc3VsdCxcbiAgdHlwZSBGaXh0dXJlUmVjb3JkLFxuICB0eXBlIEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIE1hbnlUb01hbnlSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25HcmFwaCB9IGZyb20gXCIuL19yZWxhdGlvbi1ncmFwaFwiO1xuXG4vKiog7IKs7Jqp7J6QIOyngOyglSDspJHrs7Ug7ZmV7J24IOy7rOufvCAoZW50aXR5SWTrs4TroZwg7KeA7KCVKSAqL1xuZXhwb3J0IGludGVyZmFjZSBEdXBsaWNhdGVDaGVja09wdGlvbnMge1xuICBjb2x1bW5zPzoge1xuICAgIFtlbnRpdHlJZDogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGaXh0dXJlTWFuYWdlckNsYXNzIHtcbiAgcHJpdmF0ZSBfdGRiOiBLbmV4IHwgbnVsbCA9IG51bGw7XG4gIHNldCB0ZGIodGRiOiBLbmV4KSB7XG4gICAgdGhpcy5fdGRiID0gdGRiO1xuICB9XG4gIGdldCB0ZGIoKTogS25leCB7XG4gICAgaWYgKHRoaXMuX3RkYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGRiO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmRiOiBLbmV4IHwgbnVsbCA9IG51bGw7XG4gIHNldCBmZGIoZmRiOiBLbmV4KSB7XG4gICAgdGhpcy5fZmRiID0gZmRiO1xuICB9XG4gIGdldCBmZGIoKTogS25leCB7XG4gICAgaWYgKHRoaXMuX2ZkYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmRiO1xuICB9XG4gIGNhY2hlZFRhYmxlTmFtZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWxhdGlvbkdyYXBoID0gbmV3IFJlbGF0aW9uR3JhcGgoKTtcblxuICAvLyBVcHNlcnRCdWlsZGVyIOq4sOuwmCBpbXBvcnTrpbwg7JyE7ZWcIOyDge2DnFxuICBwcml2YXRlIGJ1aWxkZXI6IFVwc2VydEJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICBwcml2YXRlIGZpeHR1cmVSZWZNYXA6IE1hcDxzdHJpbmcsIFVCUmVmPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB1dWlkVG9GaXh0dXJlSWQ6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB9PiA9IG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hlY2tzdW0oZGI6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgW1tjaGVja3N1bVJvd11dID0gYXdhaXQgZGIucmF3KGBDSEVDS1NVTSBUQUJMRSAke3RhYmxlTmFtZX1gKTtcbiAgICByZXR1cm4gY2hlY2tzdW1Sb3cuQ2hlY2tzdW07XG4gIH1cblxuICAvKipcbiAgICDsm5DqsqkgZml4dHVyZSBEQuulvCDroZzsu6wgdGVzdCBEQuuhnCDrs7Xsgqztlanri4jri6QuXG4gICAgcGdfZHVtcOuhnCDsm5DqsqkgRELrpbwg642k7ZSE7ZWY6rOgLCBwZ19yZXN0b3Jl66GcIOuhnOy7rOyXkCDrs7Xsm5Dtlanri4jri6QuXG4gICovXG4gIGFzeW5jIHN5bmMoKSB7XG4gICAgY29uc3QgZml4dHVyZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHRlc3RDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcblxuICAgIC8vIDEuIOuhnOy7rCB0ZXN0IERCIOyXsOqysCDsooXro4wg67CPIOyerOyDneyEsVxuICAgIGNvbnN0IHRlc3RQZ0VudiA9IHsgUEdQQVNTV09SRDogdGVzdENvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIlxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gJyR7dGVzdENvbm4uZGF0YWJhc2V9J1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIFwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcXFxcIiR7dGVzdENvbm4uZGF0YWJhc2V9XFxcXFwiXCJgLFxuICAgICAgeyBzdGRpbzogXCJpbmhlcml0XCIsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGVzdFBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuXG4gICAgZXhlY1N5bmMoXG4gICAgICBgcHNxbCAtaCAke3Rlc3RDb25uLmhvc3R9IC1wICR7dGVzdENvbm4ucG9ydCA/PyA1NDMyfSAtVSAke3Rlc3RDb25uLnVzZXJ9IC1kIHBvc3RncmVzIC1jIFwiQ1JFQVRFIERBVEFCQVNFIFxcXFxcIiR7dGVzdENvbm4uZGF0YWJhc2V9XFxcXFwiXCJgLFxuICAgICAgeyBzdGRpbzogXCJpbmhlcml0XCIsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGVzdFBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuXG4gICAgLy8gMi4g7JuQ6rKpIGZpeHR1cmUgREIg4oaSIOuhnOy7rCB0ZXN0IERC66GcIOuzteyCrCAocGdfZHVtcCB8IHBnX3Jlc3RvcmUpXG4gICAgY29uc3QgZml4dHVyZVBnRW52ID0geyBQR1BBU1NXT1JEOiBmaXh0dXJlQ29ubi5wYXNzd29yZCB8fCBcIlwiIH07XG4gICAgY29uc3QgZHVtcENtZCA9IGBwZ19kdW1wIC1oICR7Zml4dHVyZUNvbm4uaG9zdH0gLXAgJHtmaXh0dXJlQ29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7Zml4dHVyZUNvbm4udXNlcn0gLWQgJHtmaXh0dXJlQ29ubi5kYXRhYmFzZX0gLUZjYDtcbiAgICBjb25zdCByZXN0b3JlQ21kID0gYHBnX3Jlc3RvcmUgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCAke3Rlc3RDb25uLmRhdGFiYXNlfSAtLW5vLW93bmVyIC0tbm8tYWNsYDtcblxuICAgIGV4ZWNTeW5jKGAke2R1bXBDbWR9IHwgUEdQQVNTV09SRD1cIiR7dGVzdENvbm4ucGFzc3dvcmQgfHwgXCJcIn1cIiAke3Jlc3RvcmVDbWR9YCwge1xuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5maXh0dXJlUGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgIHNoZWxsOiBcIi9iaW4vYmFzaFwiLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdGVkUmVjb3JkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBhc3luYyBpbXBvcnRGaXh0dXJlKGVudGl0eUlkOiBzdHJpbmcsIGlkczogbnVtYmVyW10pIHtcbiAgICAvLyDrsKnrrLgg6riw66GdIOy0iOq4sO2ZlCAo7IOI66Gc7Jq0IGltcG9ydCDsnpHsl4Ug7Iuc7J6RKVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuY2xlYXIoKTtcblxuICAgIGNvbnN0IHF1ZXJpZXMgPSB1bmlxdWUoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGlkcy5tYXAoYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkLCBcImlkXCIsIGlkKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgKS5mbGF0KCksXG4gICAgKTtcblxuICAgIGNvbnN0IHdkYiA9IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgZm9yIChjb25zdCBxdWVyeSBvZiBxdWVyaWVzKSB7XG4gICAgICBjb25zdCBbcnNoXSA9IGF3YWl0IHdkYi5yYXcocXVlcnkpO1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgaW5mbzogcnNoLmluZm8sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7ZmllbGR9IyR7aWR9YDtcblxuICAgIC8vIOyInO2ZmCDssLjsobAg67Cp7KeAOiDsnbTrr7gg67Cp66y47ZWcIOugiOy9lOuTnOuKlCDsiqTtgrVcbiAgICBpZiAodGhpcy52aXNpdGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuXG4gICAgY29uc29sZS5sb2coeyBlbnRpdHlJZCwgZmllbGQsIGlkIH0pO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICBjb25zdCB7IGVudGl0eUlkLCBmaWVsZCwgdmFsdWUsIHNlYXJjaFR5cGUgfSA9IHNlYXJjaE9wdGlvbnM7XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3QgY29sdW1uID1cbiAgICAgIGVudGl0eS5wcm9wcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IGZpZWxkKT8udHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7ZmllbGR9X2lkYCA6IGZpZWxkO1xuXG4gICAgbGV0IHF1ZXJ5ID0gc291cmNlREIoZW50aXR5LnRhYmxlKTtcbiAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT09IFwibGlrZVwiKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5O1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjb3JkcyBmb3VuZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgaW5pdGlhbFJlY29yZHNMZW5ndGggPSBmaXh0dXJlcy5sZW5ndGg7XG4gICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgIF9kYjogc291cmNlREIsXG4gICAgICB9KTtcbiAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICBjb25zdCBjdXJyZW50Rml4dHVyZVJlY29yZCA9IGZpeHR1cmVzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSBgJHtlbnRpdHlJZH0jJHtyb3cuaWR9YCk7XG5cbiAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgIGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZldGNoZWRSZWNvcmRzID0gZml4dHVyZXNcbiAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAubWFwKChyKSA9PiByLmZpeHR1cmVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgY29uc3QgY3VzdG9tQ29sdW1ucyA9IGR1cGxpY2F0ZUNoZWNrPy5jb2x1bW5zPy5bZml4dHVyZS5lbnRpdHlJZF07XG4gICAgICBpZiAoY3VzdG9tQ29sdW1ucyAmJiBjdXN0b21Db2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICB0YXJnZXREQixcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCBjdXN0b21EdXBsaWNhdGVSb3csIHtcbiAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS50YXJnZXQgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVW5pcXVlIGluZGV4IOq4sOykgCDspJHrs7Ug7ZmV7J24IOKGkiBmaXh0dXJlLnVuaXF1ZVxuICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgIGlmICh1bmlxdWVSb3cpIHtcbiAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCB1bmlxdWVSb3csIHtcbiAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgX2RiOiB0YXJnZXREQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRhcmdldERCLmRlc3Ryb3koKTtcbiAgICBhd2FpdCBzb3VyY2VEQi5kZXN0cm95KCk7XG5cbiAgICByZXR1cm4gdW5pcXVlKGZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3c6IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICB9LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzaW5nbGVSZWNvcmQ/OiBib29sZWFuO1xuICAgICAgX2RiPzogS25leDtcbiAgICB9LFxuICApOiBQcm9taXNlPEZpeHR1cmVSZWNvcmRbXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ZWRFbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY3JlYXRlID0gYXN5bmMgKFxuICAgICAgZW50aXR5OiBFbnRpdHksXG4gICAgICByb3c6IHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgICB9LFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgZml4dHVyZUlkID0gYCR7ZW50aXR5LmlkfSMke3Jvdy5pZH1gO1xuICAgICAgaWYgKHZpc2l0ZWRFbnRpdGllcy5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aXNpdGVkRW50aXRpZXMuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IHJlY29yZDogRml4dHVyZVJlY29yZCA9IHtcbiAgICAgICAgZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICBjb2x1bW5zOiB7fSxcbiAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdID0ge1xuICAgICAgICAgIHByb3A6IHByb3AsXG4gICAgICAgICAgdmFsdWU6IHJvd1twcm9wLm5hbWVdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRiID0gb3B0aW9ucz8uX2RiID8/IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0aHJvdWdoVGFibGUgPSBwcm9wLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCBmcm9tQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdG9Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIodGhyb3VnaFRhYmxlKS53aGVyZShmcm9tQ29sdW1uLCByb3cuaWQpLnBsdWNrKHRvQ29sdW1uKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSlcbiAgICAgICAgICAgIC53aGVyZShwcm9wLmpvaW5Db2x1bW4sIHJvdy5pZClcbiAgICAgICAgICAgIC5wbHVjayhcImlkXCIpO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgIXByb3AuaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCByb3cuaWQpLmZpcnN0KCk7XG4gICAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZFJvdz8uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gcm93W2Ake3Byb3AubmFtZX1faWRgXTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWxvbmdzUmVjb3Jkcy5wdXNoKGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghb3B0aW9ucz8uc2luZ2xlUmVjb3JkICYmIHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCByZWxhdGVkSWQpLmZpcnN0KCk7XG4gICAgICAgICAgICBpZiAocmVsYXRlZFJvdykge1xuICAgICAgICAgICAgICBhd2FpdCBjcmVhdGUocmVsYXRlZEVudGl0eSwgcmVsYXRlZFJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgIH07XG5cbiAgICBhd2FpdCBjcmVhdGUoZW50aXR5LCByb3cpO1xuXG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH1cblxuICAvKipcbiAgICogMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsCAoc2VsZi1yZWZlcmVuY2Ug7Y+s7ZWoKVxuICAgKiAyLiDsiJzshJzrjIDroZwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ0gKFVCUmVm66GcIOywuOyhsCDqtIDqs4Qg7ZGc7ZiEKVxuICAgKiAzLiDthYzsnbTruJTrs4QgdXBzZXJ0IOyLpO2WiSAoSUTripQgRELqsIAg7J6Q64+ZIO2VoOuLuSlcbiAgICovXG4gIGFzeW5jIGluc2VydEZpeHR1cmVzKFxuICAgIGRiTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgX2ZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgY29uc3QgZml4dHVyZXMgPSB1bmlxdWUoX2ZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuXG4gICAgLy8g7LSI6riw7ZmUXG4gICAgdGhpcy5idWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy51dWlkVG9GaXh0dXJlSWQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5za2lwcGVkRml4dHVyZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbZGJOYW1lXSk7XG4gICAgY29uc3QgcmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsFxuICAgICAgdGhpcy5yZWxhdGlvbkdyYXBoLmJ1aWxkR3JhcGgoZml4dHVyZXMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uT3JkZXIgPSB0aGlzLnJlbGF0aW9uR3JhcGguZ2V0SW5zZXJ0aW9uT3JkZXIoKTtcblxuICAgICAgLy8gMi4g7Iic7ISc64yA66GcIFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdIChvdmVycmlkZSDssrTtgawpXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaGFzVGFyZ2V0ID0gISFmaXh0dXJlLnRhcmdldDtcbiAgICAgICAgY29uc3QgaGFzVW5pcXVlID0gISFmaXh0dXJlLnVuaXF1ZTtcbiAgICAgICAgY29uc3QgaGFzRHVwbGljYXRlID0gaGFzVGFyZ2V0IHx8IGhhc1VuaXF1ZTtcblxuICAgICAgICAvLyDspJHrs7XsnbQg7J6I6rOgIG92ZXJyaWRlPWZhbHNl7J24IOqyveyasDog7Iqk7YK1XG4gICAgICAgIGlmIChoYXNEdXBsaWNhdGUgJiYgIWZpeHR1cmUub3ZlcnJpZGUpIHtcbiAgICAgICAgICAvLyDquLDsobQg66CI7L2U65OcIElEIOyggOyepSAodW5pcXVlIOyasOyEoCwg7JeG7Jy866m0IHRhcmdldClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZml4dHVyZS51bmlxdWU/LmlkID8/IGZpeHR1cmUudGFyZ2V0Py5pZDtcbiAgICAgICAgICBhc3NlcnQoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5za2lwcGVkRml4dHVyZXMuc2V0KGZpeHR1cmVJZCwge1xuICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICBleGlzdGluZ0lkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSAoZXhpc3Rpbmc6ICMke2V4aXN0aW5nSWR9LCBvdmVycmlkZTogZmFsc2UpYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUgZXhpc3Rpbmc6ICMke2ZpeHR1cmUudGFyZ2V0Py5pZH0pYCA6IFwiXCJ9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgdXBzZXJ0IOyLpO2WiVxuICAgICAgY29uc3QgdGFibGVPcmRlciA9IHRoaXMuZ2V0VGFibGVPcmRlcihmaXh0dXJlcyk7XG5cbiAgICAgIGF3YWl0IGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZHNCeVRhYmxlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVPcmRlcikge1xuICAgICAgICAgIGlmICghdGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhYmxlTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gdXBzZXJ0IOyLpO2WiSDsoIQgdXVpZCDrqqnroZ0g7KCA7J6lXG4gICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICBjb25zdCB1dWlkcyA9IHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvdy51dWlkIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBVcHNlcnRpbmcgJHt0YWJsZU5hbWV9IHdpdGggJHt1dWlkcy5sZW5ndGh9IHJvd3NgKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydCh0cngsIHRhYmxlTmFtZSk7XG5cbiAgICAgICAgICAvLyB1cHNlcnTrkJwgcm9365Ok7J2YIHV1aWQgLT4gaWQg66ek7ZWRIOq1rOy2lVxuICAgICAgICAgIGlmICh1dWlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdHJ4KHRhYmxlTmFtZSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgIC5zZWxlY3QoXCJ1dWlkXCIsIFwiaWRcIilcbiAgICAgICAgICAgICAgLndoZXJlSW4oXCJ1dWlkXCIsIHV1aWRzKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICAgICAgICB1dWlkVG9JZC5zZXQocm93LnV1aWQsIHJvdy5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCB1dWlkVG9JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA1LiDqsrDqs7wg7IiY7KeRXG4gICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmXripQg6riw7KG0IOugiOy9lOuTnCDsoJXrs7TroZwg6rKw6rO8IOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBza2lwcGVkLmV4aXN0aW5nSWQpLmZpcnN0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IHV1aWRUb0lkPy5nZXQocmVmLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBpbnNlcnRlZElkKS5maXJzdCgpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUocmVzdWx0cywgKHIpID0+IGAke3IuZW50aXR5SWR9IyR7ci5kYXRhLmlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeHR1cmVSZWNvcmTrpbwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ1cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpOiBVQlJlZiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZC91dWlkIOyymOumrDogT3ZlcnJpZGUg66qo65Oc7J28IOuVjOunjCDquLDsobQg6rCSIOyCrOyaqVxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIgfHwgcHJvcE5hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g7IOIIOugiOy9lOuTnDog7KCc7Jm4IOKGkiBJTlNFUlQgKERCL1Vwc2VydEJ1aWxkZXLqsIAg7IOd7ISxKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7gg65Ox66Gd65CcIGZpeHR1cmUg7LC47KGwIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkUmVmO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuICAgIHRoaXMudXVpZFRvRml4dHVyZUlkLnNldChyZWYudXVpZCwgZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUocHJvcDogRW50aXR5UHJvcCwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIC8vIFVwc2VydEJ1aWxkZXIucmVnaXN0ZXLsl5DshJwgSlNPTi5zdHJpbmdpZnkg7LKY66as7ZWY66+A66GcIG9iamVjdCDqt7jrjIDroZwg7KCE64usXG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDthYzsnbTruJQg7Iic7IScIOy2lOy2nCAoZml4dHVyZXPsl5Ag7Y+s7ZWo65CcIO2FjOydtOu4lOunjClcbiAgICovXG4gIHByaXZhdGUgZ2V0VGFibGVPcmRlcihmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogKGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kKVtdIHtcbiAgICBjb25zdCB0YWJsZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGlmICghc2Vlbi5oYXMoZW50aXR5LnRhYmxlKSkge1xuICAgICAgICBzZWVuLmFkZChlbnRpdHkudGFibGUpO1xuICAgICAgICB0YWJsZXMucHVzaChlbnRpdHkudGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YWJsZXMgYXMgKGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kKVtdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyhcbiAgICB0cng6IEtuZXguVHJhbnNhY3Rpb24sXG4gICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgY29uc3Qgc291cmNlUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICAgIGlmICghc291cmNlUmVmKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgc291cmNlVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZVV1aWRUb0lkPy5nZXQoc291cmNlUmVmLnV1aWQpO1xuXG4gICAgICBpZiAoc291cmNlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnZhbHVlKSkge1xuICAgICAgICAgIC8vIOyEoO2DneuQmOyngCDslYrsnYAgTWFueVRvTWFueSDqtIDqs4TripQg7KCA7J6l7ZWY7KeAIOyViuydjFxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBpZiAodGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhcmdldFRhYmxlLnRhYmxlKSA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgam9pblRhYmxlID0gKHByb3AgYXMgTWFueVRvTWFueVJlbGF0aW9uUHJvcCkuam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlcjtcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgICAgICAgIGBJbnNlcnRlZCBpbnRvICR7am9pblRhYmxlfTogJHtlbnRpdHkudGFibGV9KCR7c291cmNlSWR9KSAtICR7cmVsYXRlZEVudGl0eS50YWJsZX0oJHt0YXJnZXRJZH0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tVbmlxdWVWaW9sYXRpb24oZGI6IEtuZXgsIGVudGl0eTogRW50aXR5LCBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkKSB7XG4gICAgY29uc3QgX3VuaXF1ZUluZGV4ZXMgPSBlbnRpdHkuaW5kZXhlcz8uZmlsdGVyKChpKSA9PiBpLnR5cGUgPT09IFwidW5pcXVlXCIpID8/IFtdO1xuXG4gICAgY29uc3QgdW5pcXVlSW5kZXhlcyA9IF91bmlxdWVJbmRleGVzLmZpbHRlcigoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLmV2ZXJ5KChjb2x1bW4pID0+ICFjb2x1bW4ubmFtZS5zdGFydHNXaXRoKGAke2VudGl0eS50YWJsZX1fX2ApKSxcbiAgICApO1xuICAgIGlmICh1bmlxdWVJbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHVuaXF1ZVF1ZXJ5ID0gZGIoZW50aXR5LnRhYmxlKTtcbiAgICBsZXQgaGFzQ29uZGl0aW9uID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHVuaXF1ZUluZGV4ZXMpIHtcbiAgICAgIC8vIOy7rOufvCDspJEg7ZWY64KY652864+EIG51bGzsnbTrqbQg7Jyg64uI7YGsIOygnOyVveydhCDsnITrsJjtlZjsp4Ag7JWK6riwIOuVjOusuOyXkCDtlbTri7kg7J24642x7Iqk64qUIOustOyLnFxuICAgICAgY29uc3QgY29udGFpbnNOdWxsID0gaW5kZXguY29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ubmFtZS5yZXBsYWNlKC9faWQkLywgXCJcIik7XG4gICAgICAgIHJldHVybiBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSA9PT0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbnRhaW5zTnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdW5pcXVlUXVlcnkgPSB1bmlxdWVRdWVyeS5vcldoZXJlKChxYikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBpbmRleC5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ubmFtZS5yZXBsYWNlKC9faWQkLywgXCJcIik7XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHFiLndoZXJlSW4oY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0udmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxYi5hbmRXaGVyZShjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBoYXNDb25kaXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaGFzQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBbdW5pcXVlRm91bmRdID0gYXdhaXQgdW5pcXVlUXVlcnk7XG4gICAgcmV0dXJuIHVuaXF1ZUZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICBkYjogS25leCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ2xhdXNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgLy8gcmVsYXRpb24g7ZWE65Oc7J24IOqyveyasCBfaWQg67aZ7J206riwXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uKTtcbiAgICAgIGNvbnN0IGRiQ29sdW1uID0gcHJvcCAmJiBpc1JlbGF0aW9uUHJvcChwcm9wKSA/IGAke2NvbHVtbn1faWRgIDogY29sdW1uO1xuICAgICAgY29uc3QgdmFsdWUgPSBmaXh0dXJlLmNvbHVtbnNbY29sdW1uXT8udmFsdWU7XG5cbiAgICAgIC8vIG51bGwg6rCS7J20IO2PrO2VqOuQnCDqsr3smrAg7KSR67O1IO2ZleyduCDsiqTtgrVcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB3aGVyZUNsYXVzZVtkYkNvbHVtbl0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgZGIoZW50aXR5LnRhYmxlKS53aGVyZSh3aGVyZUNsYXVzZSkubGltaXQoMSk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgYXN5bmMgYWRkRml4dHVyZUxvYWRlcihjb2RlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvdGVzdGluZy9maXh0dXJlLnRzYDtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhdGgpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyU3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJjb25zdCBmaXh0dXJlTG9hZGVyID0ge1wiKTtcbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyRW5kID0gY29udGVudC5pbmRleE9mKFwifTtcIiwgZml4dHVyZUxvYWRlclN0YXJ0KTtcblxuICAgIGlmIChmaXh0dXJlTG9hZGVyU3RhcnQgIT09IC0xICYmIGZpeHR1cmVMb2FkZXJFbmQgIT09IC0xKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7Y29udGVudC5zbGljZSgwLCBmaXh0dXJlTG9hZGVyRW5kKX0gICR7Y29kZX1cXG4ke2NvbnRlbnQuc2xpY2UoZml4dHVyZUxvYWRlckVuZCl9YDtcblxuICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLCBuZXdDb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgZml4dHVyZUxvYWRlciBpbiBmaXh0dXJlLnRzXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRml4dHVyZU1hbmFnZXIgPSBuZXcgRml4dHVyZU1hbmFnZXJDbGFzcygpO1xuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwiZXhlY1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiaW5mbGVjdGlvbiIsInVuaXF1ZSIsImluc3BlY3QiLCJTb25hbXUiLCJCYXNlTW9kZWwiLCJjcmVhdGVLbmV4SW5zdGFuY2UiLCJVcHNlcnRCdWlsZGVyIiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNIYXNNYW55UmVsYXRpb25Qcm9wIiwiaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNWaXJ0dWFsUHJvcCIsIlJlbGF0aW9uR3JhcGgiLCJGaXh0dXJlTWFuYWdlckNsYXNzIiwiX3RkYiIsInRkYiIsIkVycm9yIiwiX2ZkYiIsImZkYiIsImNhY2hlZFRhYmxlTmFtZXMiLCJyZWxhdGlvbkdyYXBoIiwiYnVpbGRlciIsImZpeHR1cmVSZWZNYXAiLCJNYXAiLCJ1dWlkVG9GaXh0dXJlSWQiLCJza2lwcGVkRml4dHVyZXMiLCJpbml0IiwiZGJDb25maWciLCJ0ZXN0IiwicHJvZHVjdGlvbl9tYXN0ZXIiLCJ0Q29ubiIsImNvbm5lY3Rpb24iLCJwQ29ubiIsImhvc3QiLCJwb3J0IiwiZGF0YWJhc2UiLCJmaXh0dXJlIiwiZ2V0Q2hlY2tzdW0iLCJkYiIsInRhYmxlTmFtZSIsImNoZWNrc3VtUm93IiwicmF3IiwiQ2hlY2tzdW0iLCJzeW5jIiwiZml4dHVyZUNvbm4iLCJ0ZXN0Q29ubiIsInRlc3RQZ0VudiIsIlBHUEFTU1dPUkQiLCJwYXNzd29yZCIsInVzZXIiLCJzdGRpbyIsImVudiIsInByb2Nlc3MiLCJmaXh0dXJlUGdFbnYiLCJkdW1wQ21kIiwicmVzdG9yZUNtZCIsInNoZWxsIiwidmlzaXRlZFJlY29yZHMiLCJTZXQiLCJpbXBvcnRGaXh0dXJlIiwiZW50aXR5SWQiLCJpZHMiLCJjbGVhciIsInF1ZXJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiaWQiLCJnZXRJbXBvcnRRdWVyaWVzIiwiZmxhdCIsIndkYiIsImdldERCIiwicXVlcnkiLCJyc2giLCJjb25zb2xlIiwibG9nIiwiaW5mbyIsImZpZWxkIiwicmVjb3JkS2V5IiwiaGFzIiwiYWRkIiwiZW50aXR5IiwiZ2V0Iiwicm93IiwidGFibGUiLCJ3aGVyZSIsImxpbWl0IiwidW5kZWZpbmVkIiwiZml4dHVyZURhdGFiYXNlIiwicmVhbERhdGFiYXNlIiwic2VsZlF1ZXJ5IiwiYXJncyIsIk9iamVjdCIsImVudHJpZXMiLCJyZWxhdGlvbnMiLCJmaWx0ZXIiLCJyZWxhdGlvbiIsImN1c3RvbUpvaW5DbGF1c2UiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEVudGl0eSIsIndpdGgiLCJyZWxhdGVkSWRDb2x1bW5OYW1lIiwicHJvcHMiLCJmaW5kIiwicCIsIm5hbWUiLCJhcmciLCJyZWxRdWVyaWVzIiwicmV2ZXJzZSIsImRlc3Ryb3kiLCJnZXRGaXh0dXJlcyIsInNvdXJjZURCTmFtZSIsInRhcmdldERCTmFtZSIsInNlYXJjaE9wdGlvbnMiLCJkdXBsaWNhdGVDaGVjayIsInNvdXJjZURCIiwidGFyZ2V0REIiLCJ2YWx1ZSIsInNlYXJjaFR5cGUiLCJjb2x1bW4iLCJwcm9wIiwidHlwZSIsInJvd3MiLCJsZW5ndGgiLCJmaXh0dXJlcyIsImluaXRpYWxSZWNvcmRzTGVuZ3RoIiwibmV3UmVjb3JkcyIsImNyZWF0ZUZpeHR1cmVSZWNvcmQiLCJfZGIiLCJwdXNoIiwiY3VycmVudEZpeHR1cmVSZWNvcmQiLCJyIiwiZml4dHVyZUlkIiwiZmV0Y2hlZFJlY29yZHMiLCJzbGljZSIsImN1c3RvbUNvbHVtbnMiLCJjb2x1bW5zIiwiY3VzdG9tRHVwbGljYXRlUm93IiwiY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMiLCJyZWNvcmQiLCJzaW5nbGVSZWNvcmQiLCJ0YXJnZXQiLCJ1bmlxdWVSb3ciLCJjaGVja1VuaXF1ZVZpb2xhdGlvbiIsImYiLCJvcHRpb25zIiwicmVjb3JkcyIsInZpc2l0ZWRFbnRpdGllcyIsImNyZWF0ZSIsImJlbG9uZ3NSZWNvcmRzIiwidGhyb3VnaFRhYmxlIiwiam9pblRhYmxlIiwiZnJvbUNvbHVtbiIsInNpbmd1bGFyaXplIiwidG9Db2x1bW4iLCJyZWxhdGVkSWRzIiwicGx1Y2siLCJqb2luQ29sdW1uIiwicmVsYXRlZFByb3AiLCJyZWxhdGVkUm93IiwiZmlyc3QiLCJyZWxhdGVkSWQiLCJpbnNlcnRGaXh0dXJlcyIsImRiTmFtZSIsIl9maXh0dXJlcyIsInJlc3VsdHMiLCJidWlsZEdyYXBoIiwiaW5zZXJ0aW9uT3JkZXIiLCJnZXRJbnNlcnRpb25PcmRlciIsImhhc1RhcmdldCIsImhhc1VuaXF1ZSIsImhhc0R1cGxpY2F0ZSIsIm92ZXJyaWRlIiwiZXhpc3RpbmdJZCIsInNldCIsInllbGxvdyIsInJlZ2lzdGVyRml4dHVyZSIsImJsdWUiLCJ0YWJsZU9yZGVyIiwiZ2V0VGFibGVPcmRlciIsInRyYW5zYWN0aW9uIiwidHJ4IiwiaW5zZXJ0ZWRJZHNCeVRhYmxlIiwiaGFzVGFibGUiLCJnZXRUYWJsZSIsInV1aWRzIiwidXVpZCIsInVwc2VydCIsInV1aWRUb0lkIiwic2VsZWN0Iiwid2hlcmVJbiIsInByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zIiwic2tpcHBlZCIsImRhdGEiLCJyZWYiLCJpbnNlcnRlZElkIiwiZ3JlZW4iLCJleGlzdGluZ1JlY29yZCIsImlzT3ZlcnJpZGVNb2RlIiwicHJvcE5hbWUiLCJyZWxhdGVkRml4dHVyZUlkIiwic2tpcHBlZEV4aXN0aW5nSWQiLCJyZWxhdGVkUmVmIiwiY29udmVydENvbHVtblZhbHVlIiwicmVnaXN0ZXIiLCJEYXRlIiwidGFibGVzIiwic2VlbiIsInNvdXJjZVJlZiIsInNvdXJjZVV1aWRUb0lkIiwic291cmNlSWQiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXRUYWJsZSIsInNvdXJjZUNvbHVtbiIsInRhcmdldENvbHVtbiIsInRhcmdldElkIiwicmVsYXRlZFV1aWRUb0lkIiwicmVzb2x2ZWRJZCIsIndhcm4iLCJmb3VuZCIsImluc2VydCIsIl91bmlxdWVJbmRleGVzIiwiaW5kZXhlcyIsImkiLCJ1bmlxdWVJbmRleGVzIiwiaW5kZXgiLCJldmVyeSIsInN0YXJ0c1dpdGgiLCJ1bmlxdWVRdWVyeSIsImhhc0NvbmRpdGlvbiIsImNvbnRhaW5zTnVsbCIsInNvbWUiLCJyZXBsYWNlIiwib3JXaGVyZSIsInFiIiwiYW5kV2hlcmUiLCJ1bmlxdWVGb3VuZCIsIndoZXJlQ2xhdXNlIiwiZGJDb2x1bW4iLCJhZGRGaXh0dXJlTG9hZGVyIiwiY29kZSIsInBhdGgiLCJhcGlSb290UGF0aCIsImNvbnRlbnQiLCJ0b1N0cmluZyIsImZpeHR1cmVMb2FkZXJTdGFydCIsImluZGV4T2YiLCJmaXh0dXJlTG9hZGVyRW5kIiwibmV3Q29udGVudCIsIkZpeHR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFDekMsU0FBU0MsWUFBWSxFQUFFQyxhQUFhLFFBQVEsS0FBSztBQUNqRCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsU0FBUyxRQUFRLDRCQUF5QjtBQUVuRCxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBcUJDLGFBQWEsUUFBUSxnQ0FBNkI7QUFFdkUsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQU1FQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxzQkFBc0IsRUFDdEJDLGNBQWMsRUFDZEMsYUFBYSxRQUVSLG9CQUFpQjtBQUN4QixTQUFTQyxhQUFhLFFBQVEsdUJBQW9CO0FBU2xELE9BQU8sTUFBTUM7SUFDSEMsT0FBb0IsS0FBSztJQUNqQyxJQUFJQyxJQUFJQSxHQUFTLEVBQUU7UUFDakIsSUFBSSxDQUFDRCxJQUFJLEdBQUdDO0lBQ2Q7SUFDQSxJQUFJQSxNQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUNELElBQUksS0FBSyxNQUFNO1lBQ3RCLE1BQU0sSUFBSUUsTUFBTTtRQUNsQjtRQUNBLE9BQU8sSUFBSSxDQUFDRixJQUFJO0lBQ2xCO0lBRVFHLE9BQW9CLEtBQUs7SUFDakMsSUFBSUMsSUFBSUEsR0FBUyxFQUFFO1FBQ2pCLElBQUks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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./bootstrap.js";
|
|
2
|
+
export * from "./fixture-loader.js";
|
|
3
|
+
export * from "./naite-vitest-reporter.js";
|
|
4
|
+
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2Jvb3RzdHJhcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZml4dHVyZS1sb2FkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25haXRlLXZpdGVzdC1yZXBvcnRlclwiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWM7QUFDNUIsY0FBYyxzQkFBbUI7QUFDakMsY0FBYyw2QkFBMEIifQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Naite Vitest Reporter
|
|
3
|
+
*
|
|
4
|
+
* 테스트 런 시작/종료를 정확히 감지하여 NaiteReporter에 알립니다.
|
|
5
|
+
* - onTestRunStart: 테스트 런 시작 시 (첫 실행 및 watch 재실행 포함)
|
|
6
|
+
* - onTestRunEnd: 각 런 종료 시
|
|
7
|
+
*/
|
|
8
|
+
export declare const NaiteVitestReporter: {
|
|
9
|
+
onTestRunStart(): Promise<void>;
|
|
10
|
+
onTestRunEnd(): Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=naite-vitest-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naite-vitest-reporter.d.ts","sourceRoot":"","sources":["../../src/testing/naite-vitest-reporter.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;CAQ/B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NaiteReporter } from "../naite/naite-reporter.js";
|
|
2
|
+
/**
|
|
3
|
+
* Naite Vitest Reporter
|
|
4
|
+
*
|
|
5
|
+
* 테스트 런 시작/종료를 정확히 감지하여 NaiteReporter에 알립니다.
|
|
6
|
+
* - onTestRunStart: 테스트 런 시작 시 (첫 실행 및 watch 재실행 포함)
|
|
7
|
+
* - onTestRunEnd: 각 런 종료 시
|
|
8
|
+
*/ export const NaiteVitestReporter = {
|
|
9
|
+
async onTestRunStart () {
|
|
10
|
+
await NaiteReporter.startTestRun();
|
|
11
|
+
},
|
|
12
|
+
async onTestRunEnd () {
|
|
13
|
+
await NaiteReporter.endTestRun();
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL25haXRlLXZpdGVzdC1yZXBvcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOYWl0ZVJlcG9ydGVyIH0gZnJvbSBcIi4uL25haXRlL25haXRlLXJlcG9ydGVyXCI7XG5cbi8qKlxuICogTmFpdGUgVml0ZXN0IFJlcG9ydGVyXG4gKlxuICog7YWM7Iqk7Yq4IOufsCDsi5zsnpEv7KKF66OM66W8IOygle2Zle2eiCDqsJDsp4DtlZjsl6wgTmFpdGVSZXBvcnRlcuyXkCDslYzrpr3ri4jri6QuXG4gKiAtIG9uVGVzdFJ1blN0YXJ0OiDthYzsiqTtirgg65+wIOyLnOyekSDsi5wgKOyyqyDsi6Ttlokg67CPIHdhdGNoIOyerOyLpO2WiSDtj6ztlagpXG4gKiAtIG9uVGVzdFJ1bkVuZDog6rCBIOufsCDsooXro4wg7IucXG4gKi9cbmV4cG9ydCBjb25zdCBOYWl0ZVZpdGVzdFJlcG9ydGVyID0ge1xuICBhc3luYyBvblRlc3RSdW5TdGFydCgpIHtcbiAgICBhd2FpdCBOYWl0ZVJlcG9ydGVyLnN0YXJ0VGVzdFJ1bigpO1xuICB9LFxuXG4gIGFzeW5jIG9uVGVzdFJ1bkVuZCgpIHtcbiAgICBhd2FpdCBOYWl0ZVJlcG9ydGVyLmVuZFRlc3RSdW4oKTtcbiAgfSxcbn07XG4iXSwibmFtZXMiOlsiTmFpdGVSZXBvcnRlciIsIk5haXRlVml0ZXN0UmVwb3J0ZXIiLCJvblRlc3RSdW5TdGFydCIsInN0YXJ0VGVzdFJ1biIsIm9uVGVzdFJ1bkVuZCIsImVuZFRlc3RSdW4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGFBQWEsUUFBUSw2QkFBMEI7QUFFeEQ7Ozs7OztDQU1DLEdBQ0QsT0FBTyxNQUFNQyxzQkFBc0I7SUFDakMsTUFBTUM7UUFDSixNQUFNRixjQUFjRyxZQUFZO0lBQ2xDO0lBRUEsTUFBTUM7UUFDSixNQUFNSixjQUFjSyxVQUFVO0lBQ2hDO0FBQ0YsRUFBRSJ9
|
package/dist/ui/ai-client.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: AI SDK의 타입이 명확하지 않아 any를 허용함 */
|
|
2
|
+
import type { ModelMessage, StreamTextResult } from "ai";
|
|
2
3
|
import { type FixtureRecord } from "../types/types";
|
|
3
4
|
declare class AIClient {
|
|
4
5
|
private model;
|
|
6
|
+
private aiSdk;
|
|
5
7
|
init(): Promise<void>;
|
|
6
8
|
handleFixture(messages: ModelMessage[], fixtureRecords: FixtureRecord[]): StreamTextResult<any, any>;
|
|
7
9
|
handleEntity(messages: ModelMessage[]): StreamTextResult<any, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/ui/ai-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/ui/ai-client.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,KAAK,EAAiB,YAAY,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AAOxE,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,gBAAgB,CAAC;AAQxB,cAAM,QAAQ;IACZ,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,KAAK,CAIG;IAEV,IAAI;IAcV,aAAa,CACX,QAAQ,EAAE,YAAY,EAAE,EACxB,cAAc,EAAE,aAAa,EAAE,GAC9B,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;IA+M7B,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;CAuQnE;AAiDD,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
|