velocious 1.0.509 → 1.0.511
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/README.md +1 -0
- package/build/configuration-types.js +7 -0
- package/build/configuration.js +74 -2
- package/build/database/advisory-lock-runner.js +192 -0
- package/build/database/drivers/mysql/index.js +3 -0
- package/build/database/record/index.js +23 -111
- package/build/database/tenants/schema-cloner.js +49 -13
- package/build/frontend-models/resource-definition.js +144 -0
- package/build/routes/built-in/api-manifest/controller.js +14 -0
- package/build/src/configuration-types.d.ts +21 -1
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +7 -1
- package/build/src/configuration.d.ts +35 -2
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +68 -3
- package/build/src/database/advisory-lock-runner.d.ts +124 -0
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -0
- package/build/src/database/advisory-lock-runner.js +176 -0
- package/build/src/database/drivers/mysql/index.d.ts +2 -2
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +3 -1
- package/build/src/database/record/attachments/handle.d.ts +1 -1
- package/build/src/database/record/index.d.ts +13 -61
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +24 -108
- package/build/src/database/tenants/schema-cloner.d.ts +11 -1
- package/build/src/database/tenants/schema-cloner.d.ts.map +1 -1
- package/build/src/database/tenants/schema-cloner.js +45 -13
- package/build/src/frontend-models/resource-definition.d.ts +9 -0
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +130 -1
- package/build/src/routes/built-in/api-manifest/controller.d.ts +9 -0
- package/build/src/routes/built-in/api-manifest/controller.d.ts.map +1 -0
- package/build/src/routes/built-in/api-manifest/controller.js +13 -0
- package/build/src/sync/sync-envelope-replay-service.d.ts +1 -1
- package/build/src/sync/sync-replay-upsert-applier.d.ts +2 -2
- package/build/src/sync/sync-resource-base.js +3 -3
- package/build/sync/sync-resource-base.js +2 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/configuration-types.js +7 -0
- package/src/configuration.js +74 -2
- package/src/database/advisory-lock-runner.js +192 -0
- package/src/database/drivers/mysql/index.js +3 -0
- package/src/database/record/index.js +23 -111
- package/src/database/tenants/schema-cloner.js +49 -13
- package/src/frontend-models/resource-definition.js +144 -0
- package/src/routes/built-in/api-manifest/controller.js +14 -0
- package/src/sync/sync-resource-base.js +2 -2
|
@@ -59,7 +59,8 @@ export default class SchemaCloner {
|
|
|
59
59
|
}): Promise<boolean>;
|
|
60
60
|
/**
|
|
61
61
|
* Creates non-primary-key indexes present on the source but missing from the target,
|
|
62
|
-
* and
|
|
62
|
+
* and replaces target indexes whose definition (columns or uniqueness) drifted from
|
|
63
|
+
* the source.
|
|
63
64
|
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
64
65
|
* @returns {Promise<void>}
|
|
65
66
|
*/
|
|
@@ -67,6 +68,15 @@ export default class SchemaCloner {
|
|
|
67
68
|
sourceTable: import("../drivers/base-table.js").default;
|
|
68
69
|
tableName: string;
|
|
69
70
|
}): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Drops an index on the target database.
|
|
73
|
+
* @param {{tableName: string, targetIndex: import("../drivers/base-columns-index.js").default}} args
|
|
74
|
+
* @returns {Promise<void>}
|
|
75
|
+
*/
|
|
76
|
+
dropTargetIndex({ tableName, targetIndex }: {
|
|
77
|
+
tableName: string;
|
|
78
|
+
targetIndex: import("../drivers/base-columns-index.js").default;
|
|
79
|
+
}): Promise<void>;
|
|
70
80
|
/**
|
|
71
81
|
* Baselines the target ledger so the cloned schema is recorded as already-applied.
|
|
72
82
|
* @returns {Promise<string[]>} The versions newly recorded on the target.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-cloner.d.ts","sourceRoot":"","sources":["../../../../src/database/tenants/schema-cloner.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;GAaG;AACH;IACE;;;OAGG;IACH,oCAFW;QAAC,QAAQ,EAAE,OAAO,oBAAoB,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,oBAAoB,EAAE,OAAO,CAAA;KAAC,EAK1G;IAFC,+CAAwB;IACxB,+CAAwB;IAG1B;;;;;OAKG;IACH,uBAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;OAKG;IACH,qBAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAqBzB;IAED;;;;;OAKG;IACH,8CAHW;QAAC,WAAW,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;OAKG;IACH,gDAHW;QAAC,WAAW,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAC1E,OAAO,CAAC,OAAO,CAAC,CA0C5B;IAED
|
|
1
|
+
{"version":3,"file":"schema-cloner.d.ts","sourceRoot":"","sources":["../../../../src/database/tenants/schema-cloner.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;GAaG;AACH;IACE;;;OAGG;IACH,oCAFW;QAAC,QAAQ,EAAE,OAAO,oBAAoB,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,oBAAoB,EAAE,OAAO,CAAA;KAAC,EAK1G;IAFC,+CAAwB;IACxB,+CAAwB;IAG1B;;;;;OAKG;IACH,uBAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;OAKG;IACH,qBAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAqBzB;IAED;;;;;OAKG;IACH,8CAHW;QAAC,WAAW,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;OAKG;IACH,gDAHW;QAAC,WAAW,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAC1E,OAAO,CAAC,OAAO,CAAC,CA0C5B;IAED;;;;;;OAMG;IACH,gDAHW;QAAC,WAAW,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,CAuEzB;IAED;;;;OAIG;IACH,4CAHW;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,kCAAkC,EAAE,OAAO,CAAA;KAAC,GAClF,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;OAGG;IACH,mBAFa,OAAO,CAAC,MAAM,EAAE,CAAC,CAI7B;IAED;;;;OAIG;IACH,0BAFa,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;;;OAKG;IACH,2CAHW,OAAO,kCAAkC,EAAE,OAAO,GAChD,UAAU,CAetB;IAED;;;;;OAKG;IACH,2DAHW;QAAC,WAAW,EAAE,OAAO,kCAAkC,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,GAClF;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAC,CAelF;IAED;;;;;OAKG;IACH,0BAJW,OAAO,kCAAkC,EAAE,OAAO,eAClD,OAAO,kCAAkC,EAAE,OAAO,GAChD,OAAO,CAqBnB;IAED;;;;OAIG;IACH,sBAHW,OAAO,kCAAkC,EAAE,OAAO,GAChD,MAAM,CAIlB;IAED;;;;OAIG;IACH,iCAHW,MAAM,GACJ,MAAM,CAUlB;IAED;;;;OAIG;IACH,yBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,kCAJW,OAAO,2BAA2B,EAAE,OAAO,gBAC3C,OAAO,2BAA2B,EAAE,OAAO,GACzC,OAAO,CAOnB;IAED;;;;;;OAMG;IACH,yCAJW,OAAO,2BAA2B,EAAE,OAAO,mBAC3C;QAAC,WAAW,EAAE,OAAO,CAAA;KAAC,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCnC;CACF;uBArasB,8BAA8B"}
|
|
@@ -126,7 +126,8 @@ export default class SchemaCloner {
|
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* Creates non-primary-key indexes present on the source but missing from the target,
|
|
129
|
-
* and
|
|
129
|
+
* and replaces target indexes whose definition (columns or uniqueness) drifted from
|
|
130
|
+
* the source.
|
|
130
131
|
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
131
132
|
* @returns {Promise<void>}
|
|
132
133
|
*/
|
|
@@ -135,7 +136,7 @@ export default class SchemaCloner {
|
|
|
135
136
|
/** @type {Map<string, import("../drivers/base-columns-index.js").default>} */
|
|
136
137
|
const targetIndexesByName = new Map();
|
|
137
138
|
const targetIndexSignatures = new Set();
|
|
138
|
-
let
|
|
139
|
+
let dirty = false;
|
|
139
140
|
for (const targetIndex of await targetTable.getIndexes()) {
|
|
140
141
|
targetIndexesByName.set(targetIndex.getName(), targetIndex);
|
|
141
142
|
targetIndexSignatures.add(this.indexSignature(targetIndex));
|
|
@@ -151,23 +152,54 @@ export default class SchemaCloner {
|
|
|
151
152
|
continue;
|
|
152
153
|
}
|
|
153
154
|
const targetIndex = this.targetDb.getType() === "sqlite" ? undefined : targetIndexesByName.get(sourceIndex.getName());
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
if (targetIndex) {
|
|
156
|
+
if (!this.indexesMatch(sourceIndex, targetIndex)) {
|
|
157
|
+
// Replacing a non-unique index with a unique one is unsafe because
|
|
158
|
+
// the target may have duplicate values that will reject the new
|
|
159
|
+
// unique constraint, and the old index was already dropped by this
|
|
160
|
+
// point. The opposite direction (unique → non-unique) is always
|
|
161
|
+
// safe — non-unique indexes never fail on duplicate values.
|
|
162
|
+
if (sourceIndex.isUnique() && !targetIndex.isUnique()) {
|
|
163
|
+
throw new Error(`Schema clone index drift for ${tableName}.${sourceIndex.getName()}: cannot safely replace a non-unique index with a unique one.`);
|
|
164
|
+
}
|
|
165
|
+
await this.dropTargetIndex({ tableName, targetIndex });
|
|
166
|
+
targetIndexesByName.delete(targetIndex.getName());
|
|
167
|
+
targetIndexSignatures.delete(this.indexSignature(targetIndex));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
continue;
|
|
158
171
|
}
|
|
159
|
-
createdIndex = true;
|
|
160
|
-
targetIndexSignatures.add(sourceIndexSignature);
|
|
161
|
-
continue;
|
|
162
172
|
}
|
|
163
|
-
|
|
164
|
-
|
|
173
|
+
// Drop any target index that shares the source name but survived the
|
|
174
|
+
// drift check above because the driver was skipped (SQLite).
|
|
175
|
+
const sameNameTargetIndex = targetIndexesByName.get(sourceIndex.getName());
|
|
176
|
+
if (sameNameTargetIndex) {
|
|
177
|
+
await this.dropTargetIndex({ tableName, targetIndex: sameNameTargetIndex });
|
|
178
|
+
targetIndexesByName.delete(sameNameTargetIndex.getName());
|
|
179
|
+
targetIndexSignatures.delete(this.indexSignature(sameNameTargetIndex));
|
|
165
180
|
}
|
|
181
|
+
const createIndexSqls = await this.targetDb.createIndexSQLs(this.createIndexArgsFromSourceIndex({ sourceIndex, tableName }));
|
|
182
|
+
for (const createIndexSql of createIndexSqls) {
|
|
183
|
+
await this.targetDb.query(createIndexSql);
|
|
184
|
+
}
|
|
185
|
+
dirty = true;
|
|
186
|
+
targetIndexSignatures.add(sourceIndexSignature);
|
|
166
187
|
}
|
|
167
|
-
if (
|
|
188
|
+
if (dirty) {
|
|
168
189
|
this.targetDb.clearSchemaCache();
|
|
169
190
|
}
|
|
170
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Drops an index on the target database.
|
|
194
|
+
* @param {{tableName: string, targetIndex: import("../drivers/base-columns-index.js").default}} args
|
|
195
|
+
* @returns {Promise<void>}
|
|
196
|
+
*/
|
|
197
|
+
async dropTargetIndex({ tableName, targetIndex }) {
|
|
198
|
+
const dropSqls = await this.targetDb.removeIndexSQLs({ name: targetIndex.getName(), tableName });
|
|
199
|
+
for (const sql of dropSqls) {
|
|
200
|
+
await this.targetDb.query(sql);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
171
203
|
/**
|
|
172
204
|
* Baselines the target ledger so the cloned schema is recorded as already-applied.
|
|
173
205
|
* @returns {Promise<string[]>} The versions newly recorded on the target.
|
|
@@ -323,4 +355,4 @@ export default class SchemaCloner {
|
|
|
323
355
|
return columnArgs;
|
|
324
356
|
}
|
|
325
357
|
}
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWNsb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS90ZW5hbnRzL3NjaGVtYS1jbG9uZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUE7QUFDOUMsT0FBTyxVQUFVLE1BQU0sOEJBQThCLENBQUE7QUFFckQsTUFBTSxzQkFBc0IsR0FBRyw2Q0FBNkMsQ0FBQTtBQUU1RSxxQ0FBcUM7QUFDckMsTUFBTSxlQUFlLEdBQUc7SUFDdEIsUUFBUSxFQUFFLENBQUM7SUFDWCxJQUFJLEVBQUUsQ0FBQztJQUNQLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7Q0FDWixDQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUMvQjs7O09BR0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVU7UUFDekIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakMsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUztRQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FB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VUFBVSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDakMsQ0FBQztRQUVELGtGQUFrRjtRQUNsRixrRkFBa0Y7UUFDbEYsK0VBQStFO1FBQy9FLElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUMxQixDQUFDO1FBRUQsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0csVUFBVSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUE7UUFDbkMsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTWlncmF0aW9uc0xlZGdlciBmcm9tIFwiLi4vbWlncmF0aW9ucy1sZWRnZXIuanNcIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiXG5pbXBvcnQgVGFibGVJbmRleCBmcm9tIFwiLi4vdGFibGUtZGF0YS90YWJsZS1pbmRleC5qc1wiXG5cbmNvbnN0IFNJTVBMRV9ERUZBVUxUX1BBVFRFUk4gPSAvXig/Oi0/XFxkKyg/OlxcLlxcZCspP3xbQS1aYS16MC05IF8uLDovQCstXSopJC9cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqL1xuY29uc3QgVEVYVF9UWVBFX1JBTktTID0ge1xuICB0aW55dGV4dDogMSxcbiAgdGV4dDogMixcbiAgbWVkaXVtdGV4dDogMyxcbiAgbG9uZ3RleHQ6IDRcbn1cblxuLyoqXG4gKiBDbG9uZXMgdGFibGUgc3RydWN0dXJlIChjb2x1bW5zLCB0ZXh0LXR5cGUgd2lkZW5pbmcsIGluZGV4ZXMpIGZyb20gYSBzb3VyY2UgZGF0YWJhc2VcbiAqIGludG8gYSB0YXJnZXQgZGF0YWJhc2UgZm9yIGEgZ2l2ZW4gc2V0IG9mIHRhYmxlcywgdGhlbiBiYXNlbGluZXMgdGhlIHRhcmdldCdzXG4gKiBgc2NoZW1hX21pZ3JhdGlvbnNgIGxlZGdlciB0byB0aGUgc291cmNlIHZpYSB7QGxpbmsgTWlncmF0aW9uc0xlZGdlcn0uIFRoaXMgaXMgdGhlXG4gKiBtZWNoYW5pc20gbXVsdGktdGVuYW50IGFwcHMgdXNlIHRvIHByb3Zpc2lvbiBhIHRlbmFudCBkYXRhYmFzZSBmcm9tIGEgdGVtcGxhdGUvZ2xvYmFsXG4gKiBkYXRhYmFzZSB3aXRob3V0IHJlLXJ1bm5pbmcgbWlncmF0aW9uczogdGhlIHN0cnVjdHVyZSBpcyBjb3BpZWQgYW5kIHRoZSBsZWRnZXIgaXNcbiAqIHJlY29yZGVkIGFzIGFscmVhZHktYXBwbGllZCwgc28gYSBsYXRlciBgZGI6dGVuYW50czptaWdyYXRlYCBkb2VzIG5vdCByZS1ydW4gYW5cbiAqIGBhZGRDb2x1bW5gIHdob3NlIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cbiAqXG4gKiBUaGUgY2xvbmVyIGlzIGludGVudGlvbmFsbHkgcG9saWN5LWZyZWUg4oCUIHRoZSBjYWxsZXIgZGVjaWRlcyB3aGljaCB0YWJsZXMgdG8gc3luYyBhbmRcbiAqIHdoaWNoIGRhdGFiYXNlcyBhcmUgc291cmNlL3RhcmdldC4gSXQgaXMgaWRlbXBvdGVudDogbWlzc2luZyB0YWJsZXMgYXJlIGNyZWF0ZWQsXG4gKiBtaXNzaW5nIGNvbHVtbnMgYWRkZWQsIHRvby1uYXJyb3cgdGV4dCBjb2x1bW5zIHdpZGVuZWQsIGFuZCBtaXNzaW5nIGluZGV4ZXMgY3JlYXRlZDtcbiAqIGFuIGluZGV4IHdob3NlIGRlZmluaXRpb24gZGl2ZXJnZXMgZnJvbSB0aGUgc291cmNlIGlzIHRyZWF0ZWQgYXMgZHJpZnQgYW5kIHRocm93cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NoZW1hQ2xvbmVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjbG9uZXIgdGhhdCBjb3BpZXMgdGFibGUgc3RydWN0dXJlIGZyb20gYHNvdXJjZURiYCBpbnRvIGB0YXJnZXREYmAuXG4gICAqIEBwYXJhbSB7e3NvdXJjZURiOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgdGFyZ2V0RGI6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fX0gYXJnc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe3NvdXJjZURiLCB0YXJnZXREYn0pIHtcbiAgICB0aGlzLnNvdXJjZURiID0gc291cmNlRGJcbiAgICB0aGlzLnRhcmdldERiID0gdGFyZ2V0RGJcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZXMgZXZlcnkgZ2l2ZW4gdGFibGUgZnJvbSB0aGUgc291cmNlIGludG8gdGhlIHRhcmdldCwgdGhlbiBiYXNlbGluZXMgdGhlXG4gICAqIHRhcmdldCdzIGxlZGdlciBzbyB0aGUgY2xvbmVkIHNjaGVtYSBpcyByZWNvcmRlZCBhcyBhbHJlYWR5LW1pZ3JhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0YWJsZU5hbWVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3luY1RhYmxlcyh0YWJsZU5hbWVzKSB7XG4gICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVOYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jVGFibGUodGFibGVOYW1lKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVjb25jaWxlTGVkZ2VyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZXMgYSBzaW5nbGUgdGFibGUgZnJvbSB0aGUgc291cmNlIGludG8gdGhlIHRhcmdldCwgY3JlYXRpbmcgaXQgb3IgYWRkaW5nIGFuZFxuICAgKiB3aWRlbmluZyBjb2x1bW5zIGFuZCBpbmRleGVzIGFzIG5lZWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN5bmNUYWJsZSh0YWJsZU5hbWUpIHtcbiAgICBjb25zdCBzb3VyY2VUYWJsZSA9IGF3YWl0IHRoaXMuc291cmNlRGIuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgaWYgKCFzb3VyY2VUYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBzb3VyY2UgdGFibGUgdG8gZXhpc3Q6ICR7dGFibGVOYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCB0aGlzLnRhcmdldERiLnRhYmxlRXhpc3RzKHRhYmxlTmFtZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFyZ2V0VGFibGUoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlZENvbHVtbnMgPSBhd2FpdCB0aGlzLmVuc3VyZVRhcmdldENvbHVtbnMoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KVxuXG4gICAgaWYgKGNoYW5nZWRDb2x1bW5zKSB7XG4gICAgICB0aGlzLnRhcmdldERiLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlVGFyZ2V0SW5kZXhlcyh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdGFibGUgaW4gdGhlIHRhcmdldCBmcm9tIHRoZSBzb3VyY2UgdGFibGUncyBjb2x1bW5zIGFuZCBpdHNcbiAgICogbm9uLXByaW1hcnkta2V5IGluZGV4ZXMuXG4gICAqIEBwYXJhbSB7e3NvdXJjZVRhYmxlOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmd9fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVGFyZ2V0VGFibGUoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUNvbHVtbiBvZiBhd2FpdCBzb3VyY2VUYWJsZS5nZXRDb2x1bW5zKCkpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogZmFsc2V9KSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUluZGV4IG9mIGF3YWl0IHNvdXJjZVRhYmxlLmdldEluZGV4ZXMoKSkge1xuICAgICAgaWYgKCFzb3VyY2VJbmRleC5pc1ByaW1hcnlLZXkoKSkge1xuICAgICAgICB0YWJsZURhdGEuYWRkSW5kZXgodGhpcy50YWJsZURhdGFJbmRleEZyb21Tb3VyY2VJbmRleChzb3VyY2VJbmRleCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy50YXJnZXREYi5jcmVhdGVUYWJsZSh0YWJsZURhdGEpXG4gICAgdGhpcy50YXJnZXREYi5jbGVhclNjaGVtYUNhY2hlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbHVtbnMgcHJlc2VudCBvbiB0aGUgc291cmNlIGJ1dCBtaXNzaW5nIGZyb20gdGhlIHRhcmdldCwgYW5kIHdpZGVuc1xuICAgKiB0b28tbmFycm93IHRhcmdldCB0ZXh0IGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7e3NvdXJjZVRhYmxlOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmd9fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFueSBjb2x1bW4gd2FzIGFkZGVkIG9yIHdpZGVuZWQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVUYXJnZXRDb2x1bW5zKHtzb3VyY2VUYWJsZSwgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbnMgPSBhd2FpdCBzb3VyY2VUYWJsZS5nZXRDb2x1bW5zKClcbiAgICBjb25zdCB0YXJnZXRUYWJsZSA9IGF3YWl0IHRoaXMudGFyZ2V0RGIuZ2V0VGFibGVCeU5hbWVPckZhaWwodGFibGVOYW1lKVxuICAgIGNvbnN0IHRhcmdldENvbHVtbnNCeU5hbWUgPSBuZXcgTWFwKClcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IFtdXG4gICAgY29uc3QgY29sdW1uc05lZWRpbmdXaWRlbmluZyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldENvbHVtbiBvZiBhd2FpdCB0YXJnZXRUYWJsZS5nZXRDb2x1bW5zKCkpIHtcbiAgICAgIHRhcmdldENvbHVtbnNCeU5hbWUuc2V0KHRhcmdldENvbHVtbi5nZXROYW1lKCksIHRhcmdldENvbHVtbilcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUNvbHVtbiBvZiBzb3VyY2VDb2x1bW5zKSB7XG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0YXJnZXRDb2x1bW5zQnlOYW1lLmdldChzb3VyY2VDb2x1bW4uZ2V0TmFtZSgpKVxuXG4gICAgICBpZiAoIXRhcmdldENvbHVtbikge1xuICAgICAgICBtaXNzaW5nQ29sdW1ucy5wdXNoKHNvdXJjZUNvbHVtbilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW5OZWVkc1dpZGVuaW5nKHNvdXJjZUNvbHVtbiwgdGFyZ2V0Q29sdW1uKSkge1xuICAgICAgICBjb2x1bW5zTmVlZGluZ1dpZGVuaW5nLnB1c2goc291cmNlQ29sdW1uKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPD0gMCAmJiBjb2x1bW5zTmVlZGluZ1dpZGVuaW5nLmxlbmd0aCA8PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIG1pc3NpbmdDb2x1bW5zKSB7XG4gICAgICB0YWJsZURhdGEuYWRkQ29sdW1uKHNvdXJjZUNvbHVtbi5nZXROYW1lKCksIHRoaXMuY29sdW1uQXJnc0Zyb21Tb3VyY2VDb2x1bW4oc291cmNlQ29sdW1uLCB7aXNOZXdDb2x1bW46IHRydWV9KSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUNvbHVtbiBvZiBjb2x1bW5zTmVlZGluZ1dpZGVuaW5nKSB7XG4gICAgICB0YWJsZURhdGEuYWRkQ29sdW1uKHNvdXJjZUNvbHVtbi5nZXROYW1lKCksIHRoaXMuY29sdW1uQXJnc0Zyb21Tb3VyY2VDb2x1bW4oc291cmNlQ29sdW1uLCB7aXNOZXdDb2x1bW46IGZhbHNlfSkpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhbHRlclNxbCBvZiBhd2FpdCB0aGlzLnRhcmdldERiLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSkpIHtcbiAgICAgIGF3YWl0IHRoaXMudGFyZ2V0RGIucXVlcnkoYWx0ZXJTcWwpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5vbi1wcmltYXJ5LWtleSBpbmRleGVzIHByZXNlbnQgb24gdGhlIHNvdXJjZSBidXQgbWlzc2luZyBmcm9tIHRoZSB0YXJnZXQsXG4gICAqIGFuZCB0aHJvd3MgaWYgYW4gZXhpc3RpbmcgdGFyZ2V0IGluZGV4IGRpdmVyZ2VzIGZyb20gdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtIHt7c291cmNlVGFibGU6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0LCB0YWJsZU5hbWU6IHN0cmluZ319IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBlbnN1cmVUYXJnZXRJbmRleGVzKHtzb3VyY2VUYWJsZSwgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IHRhcmdldFRhYmxlID0gYXdhaXQgdGhpcy50YXJnZXREYi5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgICBjb25zdCB0YXJnZXRJbmRleGVzQnlOYW1lID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdGFyZ2V0SW5kZXhTaWduYXR1cmVzID0gbmV3IFNldCgpXG4gICAgbGV0IGNyZWF0ZWRJbmRleCA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldEluZGV4IG9mIGF3YWl0IHRhcmdldFRhYmxlLmdldEluZGV4ZXMoKSkge1xuICAgICAgdGFyZ2V0SW5kZXhlc0J5TmFtZS5zZXQodGFyZ2V0SW5kZXguZ2V0TmFtZSgpLCB0YXJnZXRJbmRleClcbiAgICAgIHRhcmdldEluZGV4U2lnbmF0dXJlcy5hZGQodGhpcy5pbmRleFNpZ25hdHVyZSh0YXJnZXRJbmRleCkpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VJbmRleCBvZiBhd2FpdCBzb3VyY2VUYWJsZS5nZXRJbmRleGVzKCkpIHtcbiAgICAgIGlmIChzb3VyY2VJbmRleC5pc1ByaW1hcnlLZXkoKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VJbmRleFNpZ25hdHVyZSA9IHRoaXMuaW5kZXhTaWduYXR1cmUoc291cmNlSW5kZXgpXG5cbiAgICAgIC8vIFNRTGl0ZSBpbmRleCBuYW1lcyBhcmUgdW5pcXVlIHBlci1kYXRhYmFzZSwgbm90IHBlci10YWJsZSwgc28gbWF0Y2ggY2xvbmVkXG4gICAgICAvLyBpbmRleGVzIGJ5IHRoZWlyIGNvbHVtbi91bmlxdWVuZXNzIHNpZ25hdHVyZSByYXRoZXIgdGhhbiB0aGVpciBuYW1lLlxuICAgICAgaWYgKHRoaXMudGFyZ2V0RGIuZ2V0VHlwZSgpID09PSBcInNxbGl0ZVwiICYmIHRhcmdldEluZGV4U2lnbmF0dXJlcy5oYXMoc291cmNlSW5kZXhTaWduYXR1cmUpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy50YXJnZXREYi5nZXRUeXBlKCkgPT09IFwic3FsaXRlXCIgPyB1bmRlZmluZWQgOiB0YXJnZXRJbmRleGVzQnlOYW1lLmdldChzb3VyY2VJbmRleC5nZXROYW1lKCkpXG5cbiAgICAgIGlmICghdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlSW5kZXhTcWxzID0gYXdhaXQgdGhpcy50YXJnZXREYi5jcmVhdGVJbmRleFNRTHModGhpcy5jcmVhdGVJbmRleEFyZ3NGcm9tU291cmNlSW5kZXgoe3NvdXJjZUluZGV4LCB0YWJsZU5hbWV9KSlcblxuICAgICAgICBmb3IgKGNvbnN0IGNyZWF0ZUluZGV4U3FsIG9mIGNyZWF0ZUluZGV4U3Fscykge1xuICAgICAgICAgIGF3YWl0IHRoaXMudGFyZ2V0RGIucXVlcnkoY3JlYXRlSW5kZXhTcWwpXG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVkSW5kZXggPSB0cnVlXG4gICAgICAgIHRhcmdldEluZGV4U2lnbmF0dXJlcy5hZGQoc291cmNlSW5kZXhTaWduYXR1cmUpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5pbmRleGVzTWF0Y2goc291cmNlSW5kZXgsIHRhcmdldEluZGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVtYSBjbG9uZSBpbmRleCBkcmlmdCBmb3IgJHt0YWJsZU5hbWV9LiR7c291cmNlSW5kZXguZ2V0TmFtZSgpfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZWRJbmRleCkge1xuICAgICAgdGhpcy50YXJnZXREYi5jbGVhclNjaGVtYUNhY2hlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZWxpbmVzIHRoZSB0YXJnZXQgbGVkZ2VyIHNvIHRoZSBjbG9uZWQgc2NoZW1hIGlzIHJlY29yZGVkIGFzIGFscmVhZHktYXBwbGllZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSBUaGUgdmVyc2lvbnMgbmV3bHkgcmVjb3JkZWQgb24gdGhlIHRhcmdldC5cbiAgICovXG4gIGFzeW5jIHJlY29uY2lsZUxlZGdlcigpIHtcbiAgICByZXR1cm4gYXdhaXQgTWlncmF0aW9uc0xlZGdlci5iYXNlbGluZUZyb21EYXRhYmFzZSh7c291cmNlRGI6IHRoaXMuc291cmNlRGIsIHRhcmdldERiOiB0aGlzLnRhcmdldERifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgbGVkZ2VyIGlzIG1pc3NpbmcgYW55IHZlcnNpb24gYXBwbGllZCBvbiB0aGUgc291cmNlIOKAlCBpLmUuIHRoZVxuICAgKiB0YXJnZXQgc2NoZW1hIG1heSBoYXZlIGJlZW4gYWR2YW5jZWQgb3V0IG9mIGJhbmQgd2l0aG91dCByZWNvcmRpbmcgaXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgbGVkZ2VyRHJpZnRzRnJvbVNvdXJjZSgpIHtcbiAgICBpZiAoIWF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIudGFibGVFeGlzdHModGhpcy50YXJnZXREYikpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlVmVyc2lvbnMgPSBhd2FpdCBNaWdyYXRpb25zTGVkZ2VyLmFwcGxpZWRWZXJzaW9ucyh0aGlzLnNvdXJjZURiKVxuICAgIGNvbnN0IHRhcmdldFZlcnNpb25TZXQgPSBuZXcgU2V0KGF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIuYXBwbGllZFZlcnNpb25zKHRoaXMudGFyZ2V0RGIpKVxuXG4gICAgcmV0dXJuIHNvdXJjZVZlcnNpb25zLnNvbWUoKHZlcnNpb24pID0+ICF0YXJnZXRWZXJzaW9uU2V0Lmhhcyh2ZXJzaW9uKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgc291cmNlIGluZGV4IGludG8gYSBUYWJsZURhdGEgaW5kZXggZm9yIHRhYmxlIGNyZWF0aW9uIChTUUxpdGUgb21pdHMgdGhlXG4gICAqIGluZGV4IG5hbWUgc28gdGhlIGRyaXZlciBjYW4gZ2VuZXJhdGUgYSB1bmlxdWUgb25lKS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSBzb3VyY2VJbmRleFxuICAgKiBAcmV0dXJucyB7VGFibGVJbmRleH1cbiAgICovXG4gIHRhYmxlRGF0YUluZGV4RnJvbVNvdXJjZUluZGV4KHNvdXJjZUluZGV4KSB7XG4gICAgLyoqIEB0eXBlIHt7bmFtZT86IHN0cmluZywgdW5pcXVlOiBib29sZWFufX0gKi9cbiAgICBjb25zdCBhcmdzID0ge3VuaXF1ZTogc291cmNlSW5kZXguaXNVbmlxdWUoKX1cblxuICAgIC8vIFNRTGl0ZSBpbmRleCBuYW1lcyBhcmUgdW5pcXVlIHBlci1kYXRhYmFzZSwgbm90IHBlci10YWJsZSwgc28gbGV0IHRoZSBkcml2ZXJcbiAgICAvLyBnZW5lcmF0ZSBvbmU7IG90aGVyIGRyaXZlcnMgcHJlc2VydmUgdGhlIHNvdXJjZSBpbmRleCBuYW1lLiBCdWlsZCB0aGUgVGFibGVJbmRleFxuICAgIC8vIGRpcmVjdGx5IChyYXRoZXIgdGhhbiB2aWEgdGhlIGRyaXZlcidzIGdldFRhYmxlRGF0YUluZGV4LCB3aGljaCBvbmx5IE15U1FMIGFuZFxuICAgIC8vIFNRTGl0ZSBpbXBsZW1lbnQpIHNvIGNsb25pbmcgYSBQb3N0Z3JlU1FMIG9yIE1TLVNRTCBzb3VyY2UgdGFibGUgd29ya3MgdG9vLlxuICAgIGlmICh0aGlzLnRhcmdldERiLmdldFR5cGUoKSAhPT0gXCJzcWxpdGVcIikge1xuICAgICAgYXJncy5uYW1lID0gc291cmNlSW5kZXguZ2V0TmFtZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KHNvdXJjZUluZGV4LmdldENvbHVtbk5hbWVzKCksIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGRyaXZlciBjcmVhdGUtaW5kZXggYXJncyBmcm9tIGEgc291cmNlIGluZGV4ICh0aGUgaW5kZXggbmFtZSBpcyBvbWl0dGVkIG9uXG4gICAqIFNRTGl0ZSwgd2hlcmUgaW5kZXggbmFtZXMgYXJlIHVuaXF1ZSBwZXItZGF0YWJhc2UgcmF0aGVyIHRoYW4gcGVyLXRhYmxlKS5cbiAgICogQHBhcmFtIHt7c291cmNlSW5kZXg6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW5zLWluZGV4LmpzXCIpLmRlZmF1bHQsIHRhYmxlTmFtZTogc3RyaW5nfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7e2NvbHVtbnM6IHN0cmluZ1tdLCBuYW1lPzogc3RyaW5nLCB0YWJsZU5hbWU6IHN0cmluZywgdW5pcXVlOiBib29sZWFufX1cbiAgICovXG4gIGNyZWF0ZUluZGV4QXJnc0Zyb21Tb3VyY2VJbmRleCh7c291cmNlSW5kZXgsIHRhYmxlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge3tjb2x1bW5zOiBzdHJpbmdbXSwgbmFtZT86IHN0cmluZywgdGFibGVOYW1lOiBzdHJpbmcsIHVuaXF1ZTogYm9vbGVhbn19ICovXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0ge1xuICAgICAgY29sdW1uczogc291cmNlSW5kZXguZ2V0Q29sdW1uTmFtZXMoKSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHVuaXF1ZTogc291cmNlSW5kZXguaXNVbmlxdWUoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldERiLmdldFR5cGUoKSAhPT0gXCJzcWxpdGVcIikge1xuICAgICAgY3JlYXRlSW5kZXhBcmdzLm5hbWUgPSBzb3VyY2VJbmRleC5nZXROYW1lKClcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlSW5kZXhBcmdzXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0d28gaW5kZXhlcyBoYXZlIHRoZSBzYW1lIHVuaXF1ZW5lc3MgYW5kIG9yZGVyZWQgY29sdW1uIGxpc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gc291cmNlSW5kZXhcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSB0YXJnZXRJbmRleFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGluZGV4ZXNNYXRjaChzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgpIHtcbiAgICBjb25zdCBzb3VyY2VDb2x1bW5OYW1lcyA9IHNvdXJjZUluZGV4LmdldENvbHVtbk5hbWVzKClcbiAgICBjb25zdCB0YXJnZXRDb2x1bW5OYW1lcyA9IHRhcmdldEluZGV4LmdldENvbHVtbk5hbWVzKClcblxuICAgIGlmIChzb3VyY2VJbmRleC5pc1VuaXF1ZSgpICE9PSB0YXJnZXRJbmRleC5pc1VuaXF1ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc291cmNlQ29sdW1uTmFtZXMubGVuZ3RoICE9PSB0YXJnZXRDb2x1bW5OYW1lcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAobGV0IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBzb3VyY2VDb2x1bW5OYW1lcy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgIGlmIChzb3VyY2VDb2x1bW5OYW1lc1tjb2x1bW5JbmRleF0gIT09IHRhcmdldENvbHVtbk5hbWVzW2NvbHVtbkluZGV4XSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYW4gaW5kZXgsIHVzZWQgdG8gbWF0Y2ggY2xvbmVkIGluZGV4ZXMgYnkgc2hhcGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gaW5kZXhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGluZGV4U2lnbmF0dXJlKGluZGV4KSB7XG4gICAgcmV0dXJuIGAke2luZGV4LmlzVW5pcXVlKCkgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwifToke2luZGV4LmdldENvbHVtbk5hbWVzKCkuam9pbihcIixcIil9YFxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBjb2x1bW4gdHlwZSB0byBpdHMgY2Fub25pY2FsIGxvd2VyY2FzZSBmb3JtIChgaW50YCBiZWNvbWVzIGBpbnRlZ2VyYCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5UeXBlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBub3JtYWxpemVkQ29sdW1uVHlwZShjb2x1bW5UeXBlKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSBjb2x1bW5UeXBlLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgcmV0dXJuIFwiaW50ZWdlclwiXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUeXBlXG4gIH1cblxuICAvKipcbiAgICogVGhlIHdpZGVuaW5nIHJhbmsgb2YgYSB0ZXh0IGNvbHVtbiB0eXBlICgwIHdoZW4gbm90IGEgdGV4dCB0eXBlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtblR5cGVcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHRleHRUeXBlUmFuayhjb2x1bW5UeXBlKSB7XG4gICAgcmV0dXJuIFRFWFRfVFlQRV9SQU5LU1t0aGlzLm5vcm1hbGl6ZWRDb2x1bW5UeXBlKGNvbHVtblR5cGUpXSB8fCAwXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGFyZ2V0J3MgdGV4dCBjb2x1bW4gaXMgbmFycm93ZXIgdGhhbiB0aGUgc291cmNlJ3MgYW5kIG11c3QgYmUgd2lkZW5lZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IHNvdXJjZUNvbHVtblxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gdGFyZ2V0Q29sdW1uXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgY29sdW1uTmVlZHNXaWRlbmluZyhzb3VyY2VDb2x1bW4sIHRhcmdldENvbHVtbikge1xuICAgIGNvbnN0IHNvdXJjZVJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayhzb3VyY2VDb2x1bW4uZ2V0VHlwZSgpKVxuICAgIGNvbnN0IHRhcmdldFJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayh0YXJnZXRDb2x1bW4uZ2V0VHlwZSgpKVxuXG4gICAgcmV0dXJuIHNvdXJjZVJhbmsgPiAwICYmIHRhcmdldFJhbmsgPiAwICYmIHNvdXJjZVJhbmsgPiB0YXJnZXRSYW5rXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIFRhYmxlRGF0YSBjb2x1bW4gYXJncyBmcm9tIGEgc291cmNlIGNvbHVtbiwgY29weWluZyB0eXBlLCBudWxsYWJpbGl0eSxcbiAgICogbGVuZ3RoLCBub3Rlcywgc2ltcGxlIGRlZmF1bHRzIGFuZCAoZm9yIGZ1bGwgY2xvbmVzKSBwcmltYXJ5LWtleSBmbGFnLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gc291cmNlQ29sdW1uXG4gICAqIEBwYXJhbSB7e2lzTmV3Q29sdW1uOiBib29sZWFufX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqL1xuICBjb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbn0pIHtcbiAgICAvKiogQHR5cGUge3thdXRvSW5jcmVtZW50PzogYm9vbGVhbiwgZGVmYXVsdD86IHVua25vd24sIGlzTmV3Q29sdW1uOiBib29sZWFuLCBtYXhMZW5ndGg/OiBudW1iZXIsIG5vdGVzPzogc3RyaW5nLCBudWxsOiBib29sZWFuLCBwcmltYXJ5S2V5PzogYm9vbGVhbiwgdHlwZTogc3RyaW5nfX0gKi9cbiAgICBjb25zdCBjb2x1bW5BcmdzID0ge1xuICAgICAgaXNOZXdDb2x1bW4sXG4gICAgICBudWxsOiBzb3VyY2VDb2x1bW4uZ2V0TnVsbCgpLFxuICAgICAgdHlwZTogdGhpcy5ub3JtYWxpemVkQ29sdW1uVHlwZShzb3VyY2VDb2x1bW4uZ2V0VHlwZSgpKVxuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBzb3VyY2VDb2x1bW4uZ2V0RGVmYXVsdCgpXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gc291cmNlQ29sdW1uLmdldE1heExlbmd0aCgpXG4gICAgY29uc3Qgbm90ZXMgPSBzb3VyY2VDb2x1bW4uZ2V0Tm90ZXMoKVxuXG4gICAgaWYgKCFpc05ld0NvbHVtbiAmJiBzb3VyY2VDb2x1bW4uZ2V0UHJpbWFyeUtleSgpKSB7XG4gICAgICBjb2x1bW5BcmdzLnByaW1hcnlLZXkgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUNvbHVtbi5nZXRBdXRvSW5jcmVtZW50KCkpIHtcbiAgICAgIGNvbHVtbkFyZ3MuYXV0b0luY3JlbWVudCA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBBIG1heExlbmd0aCBvZiAtMSBpcyB0aGUgTVMtU1FMIFwibWF4XCIgc2VudGluZWwgKE5WQVJDSEFSKE1BWCkgLyBWQVJCSU5BUlkoTUFYKSxcbiAgICAvLyBiYWNraW5nIFZlbG9jaW91cyB0ZXh0L2pzb24vYmxvYiBjb2x1bW5zKTsgdGhlIGNvbHVtbiB0eXBlIGRyaXZlcyB0aGUgdW5ib3VuZGVkXG4gICAgLy8gU1FMLCBzbyBkb24ndCBmb3J3YXJkIC0xIGFzIGFuIGV4cGxpY2l0IGxlbmd0aCAoaXQgd291bGQgZW1pdCBOVkFSQ0hBUigtMSkpLlxuICAgIGlmIChtYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBtYXhMZW5ndGggPj0gMCkge1xuICAgICAgY29sdW1uQXJncy5tYXhMZW5ndGggPSBtYXhMZW5ndGhcbiAgICB9XG5cbiAgICBpZiAobm90ZXMpIHtcbiAgICAgIGNvbHVtbkFyZ3Mubm90ZXMgPSBub3Rlc1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgU0lNUExFX0RFRkFVTFRfUEFUVEVSTi50ZXN0KFN0cmluZyhkZWZhdWx0VmFsdWUpKSkge1xuICAgICAgY29sdW1uQXJncy5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbkFyZ3NcbiAgfVxufVxuIl19
|
|
358
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWNsb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS90ZW5hbnRzL3NjaGVtYS1jbG9uZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUE7QUFDOUMsT0FBTyxVQUFVLE1BQU0sOEJBQThCLENBQUE7QUFFckQsTUFBTSxzQkFBc0IsR0FBRyw2Q0FBNkMsQ0FBQTtBQUU1RSxxQ0FBcUM7QUFDckMsTUFBTSxlQUFlLEdBQUc7SUFDdEIsUUFBUSxFQUFFLENBQUM7SUFDWCxJQUFJLEVBQUUsQ0FBQztJQUNQLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7Q0FDWixDQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUMvQjs7O09BR0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVU7UUFDekIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakMsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUztRQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FB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RUFBRSxFQUFFLENBQUM7WUFDakQsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDOUIsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztZQUNwQyxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUNqQyxDQUFDO1FBRUQsa0ZBQWtGO1FBQ2xGLGtGQUFrRjtRQUNsRiwrRUFBK0U7UUFDL0UsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUNsQyxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQzFCLENBQUM7UUFFRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RyxVQUFVLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQTtRQUNuQyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBNaWdyYXRpb25zTGVkZ2VyIGZyb20gXCIuLi9taWdyYXRpb25zLWxlZGdlci5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmltcG9ydCBUYWJsZUluZGV4IGZyb20gXCIuLi90YWJsZS1kYXRhL3RhYmxlLWluZGV4LmpzXCJcblxuY29uc3QgU0lNUExFX0RFRkFVTFRfUEFUVEVSTiA9IC9eKD86LT9cXGQrKD86XFwuXFxkKyk/fFtBLVphLXowLTkgXy4sOi9AKy1dKikkL1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovXG5jb25zdCBURVhUX1RZUEVfUkFOS1MgPSB7XG4gIHRpbnl0ZXh0OiAxLFxuICB0ZXh0OiAyLFxuICBtZWRpdW10ZXh0OiAzLFxuICBsb25ndGV4dDogNFxufVxuXG4vKipcbiAqIENsb25lcyB0YWJsZSBzdHJ1Y3R1cmUgKGNvbHVtbnMsIHRleHQtdHlwZSB3aWRlbmluZywgaW5kZXhlcykgZnJvbSBhIHNvdXJjZSBkYXRhYmFzZVxuICogaW50byBhIHRhcmdldCBkYXRhYmFzZSBmb3IgYSBnaXZlbiBzZXQgb2YgdGFibGVzLCB0aGVuIGJhc2VsaW5lcyB0aGUgdGFyZ2V0J3NcbiAqIGBzY2hlbWFfbWlncmF0aW9uc2AgbGVkZ2VyIHRvIHRoZSBzb3VyY2UgdmlhIHtAbGluayBNaWdyYXRpb25zTGVkZ2VyfS4gVGhpcyBpcyB0aGVcbiAqIG1lY2hhbmlzbSBtdWx0aS10ZW5hbnQgYXBwcyB1c2UgdG8gcHJvdmlzaW9uIGEgdGVuYW50IGRhdGFiYXNlIGZyb20gYSB0ZW1wbGF0ZS9nbG9iYWxcbiAqIGRhdGFiYXNlIHdpdGhvdXQgcmUtcnVubmluZyBtaWdyYXRpb25zOiB0aGUgc3RydWN0dXJlIGlzIGNvcGllZCBhbmQgdGhlIGxlZGdlciBpc1xuICogcmVjb3JkZWQgYXMgYWxyZWFkeS1hcHBsaWVkLCBzbyBhIGxhdGVyIGBkYjp0ZW5hbnRzOm1pZ3JhdGVgIGRvZXMgbm90IHJlLXJ1biBhblxuICogYGFkZENvbHVtbmAgd2hvc2UgY29sdW1uIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIFRoZSBjbG9uZXIgaXMgaW50ZW50aW9uYWxseSBwb2xpY3ktZnJlZSDigJQgdGhlIGNhbGxlciBkZWNpZGVzIHdoaWNoIHRhYmxlcyB0byBzeW5jIGFuZFxuICogd2hpY2ggZGF0YWJhc2VzIGFyZSBzb3VyY2UvdGFyZ2V0LiBJdCBpcyBpZGVtcG90ZW50OiBtaXNzaW5nIHRhYmxlcyBhcmUgY3JlYXRlZCxcbiAqIG1pc3NpbmcgY29sdW1ucyBhZGRlZCwgdG9vLW5hcnJvdyB0ZXh0IGNvbHVtbnMgd2lkZW5lZCwgYW5kIG1pc3NpbmcgaW5kZXhlcyBjcmVhdGVkO1xuICogYW4gaW5kZXggd2hvc2UgZGVmaW5pdGlvbiBkaXZlcmdlcyBmcm9tIHRoZSBzb3VyY2UgaXMgdHJlYXRlZCBhcyBkcmlmdCBhbmQgdGhyb3dzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2hlbWFDbG9uZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsb25lciB0aGF0IGNvcGllcyB0YWJsZSBzdHJ1Y3R1cmUgZnJvbSBgc291cmNlRGJgIGludG8gYHRhcmdldERiYC5cbiAgICogQHBhcmFtIHt7c291cmNlRGI6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCB0YXJnZXREYjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9fSBhcmdzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7c291cmNlRGIsIHRhcmdldERifSkge1xuICAgIHRoaXMuc291cmNlRGIgPSBzb3VyY2VEYlxuICAgIHRoaXMudGFyZ2V0RGIgPSB0YXJnZXREYlxuICB9XG5cbiAgLyoqXG4gICAqIENsb25lcyBldmVyeSBnaXZlbiB0YWJsZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgdGFyZ2V0LCB0aGVuIGJhc2VsaW5lcyB0aGVcbiAgICogdGFyZ2V0J3MgbGVkZ2VyIHNvIHRoZSBjbG9uZWQgc2NoZW1hIGlzIHJlY29yZGVkIGFzIGFscmVhZHktbWlncmF0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRhYmxlTmFtZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzeW5jVGFibGVzKHRhYmxlTmFtZXMpIHtcbiAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNUYWJsZSh0YWJsZU5hbWUpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVMZWRnZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb25lcyBhIHNpbmdsZSB0YWJsZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgdGFyZ2V0LCBjcmVhdGluZyBpdCBvciBhZGRpbmcgYW5kXG4gICAqIHdpZGVuaW5nIGNvbHVtbnMgYW5kIGluZGV4ZXMgYXMgbmVlZGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3luY1RhYmxlKHRhYmxlTmFtZSkge1xuICAgIGNvbnN0IHNvdXJjZVRhYmxlID0gYXdhaXQgdGhpcy5zb3VyY2VEYi5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAoIXNvdXJjZVRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHNvdXJjZSB0YWJsZSB0byBleGlzdDogJHt0YWJsZU5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IHRoaXMudGFyZ2V0RGIudGFibGVFeGlzdHModGFibGVOYW1lKSkge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVUYXJnZXRUYWJsZSh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VkQ29sdW1ucyA9IGF3YWl0IHRoaXMuZW5zdXJlVGFyZ2V0Q29sdW1ucyh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pXG5cbiAgICBpZiAoY2hhbmdlZENvbHVtbnMpIHtcbiAgICAgIHRoaXMudGFyZ2V0RGIuY2xlYXJTY2hlbWFDYWNoZSgpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVUYXJnZXRJbmRleGVzKHtzb3VyY2VUYWJsZSwgdGFibGVOYW1lfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSB0YWJsZSBpbiB0aGUgdGFyZ2V0IGZyb20gdGhlIHNvdXJjZSB0YWJsZSdzIGNvbHVtbnMgYW5kIGl0c1xuICAgKiBub24tcHJpbWFyeS1rZXkgaW5kZXhlcy5cbiAgICogQHBhcmFtIHt7c291cmNlVGFibGU6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0LCB0YWJsZU5hbWU6IHN0cmluZ319IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjcmVhdGVUYXJnZXRUYWJsZSh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pIHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIGF3YWl0IHNvdXJjZVRhYmxlLmdldENvbHVtbnMoKSkge1xuICAgICAgdGFibGVEYXRhLmFkZENvbHVtbihzb3VyY2VDb2x1bW4uZ2V0TmFtZSgpLCB0aGlzLmNvbHVtbkFyZ3NGcm9tU291cmNlQ29sdW1uKHNvdXJjZUNvbHVtbiwge2lzTmV3Q29sdW1uOiBmYWxzZX0pKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlSW5kZXggb2YgYXdhaXQgc291cmNlVGFibGUuZ2V0SW5kZXhlcygpKSB7XG4gICAgICBpZiAoIXNvdXJjZUluZGV4LmlzUHJpbWFyeUtleSgpKSB7XG4gICAgICAgIHRhYmxlRGF0YS5hZGRJbmRleCh0aGlzLnRhYmxlRGF0YUluZGV4RnJvbVNvdXJjZUluZGV4KHNvdXJjZUluZGV4KSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnRhcmdldERiLmNyZWF0ZVRhYmxlKHRhYmxlRGF0YSlcbiAgICB0aGlzLnRhcmdldERiLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29sdW1ucyBwcmVzZW50IG9uIHRoZSBzb3VyY2UgYnV0IG1pc3NpbmcgZnJvbSB0aGUgdGFyZ2V0LCBhbmQgd2lkZW5zXG4gICAqIHRvby1uYXJyb3cgdGFyZ2V0IHRleHQgY29sdW1ucy5cbiAgICogQHBhcmFtIHt7c291cmNlVGFibGU6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0LCB0YWJsZU5hbWU6IHN0cmluZ319IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYW55IGNvbHVtbiB3YXMgYWRkZWQgb3Igd2lkZW5lZC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVRhcmdldENvbHVtbnMoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3Qgc291cmNlQ29sdW1ucyA9IGF3YWl0IHNvdXJjZVRhYmxlLmdldENvbHVtbnMoKVxuICAgIGNvbnN0IHRhcmdldFRhYmxlID0gYXdhaXQgdGhpcy50YXJnZXREYi5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgY29uc3QgdGFyZ2V0Q29sdW1uc0J5TmFtZSA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IG1pc3NpbmdDb2x1bW5zID0gW11cbiAgICBjb25zdCBjb2x1bW5zTmVlZGluZ1dpZGVuaW5nID0gW11cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0Q29sdW1uIG9mIGF3YWl0IHRhcmdldFRhYmxlLmdldENvbHVtbnMoKSkge1xuICAgICAgdGFyZ2V0Q29sdW1uc0J5TmFtZS5zZXQodGFyZ2V0Q29sdW1uLmdldE5hbWUoKSwgdGFyZ2V0Q29sdW1uKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRhcmdldENvbHVtbnNCeU5hbWUuZ2V0KHNvdXJjZUNvbHVtbi5nZXROYW1lKCkpXG5cbiAgICAgIGlmICghdGFyZ2V0Q29sdW1uKSB7XG4gICAgICAgIG1pc3NpbmdDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbk5lZWRzV2lkZW5pbmcoc291cmNlQ29sdW1uLCB0YXJnZXRDb2x1bW4pKSB7XG4gICAgICAgIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcucHVzaChzb3VyY2VDb2x1bW4pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCA8PSAwICYmIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VDb2x1bW4gb2YgbWlzc2luZ0NvbHVtbnMpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogdHJ1ZX0pKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogZmFsc2V9KSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFsdGVyU3FsIG9mIGF3YWl0IHRoaXMudGFyZ2V0RGIuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKSkge1xuICAgICAgYXdhaXQgdGhpcy50YXJnZXREYi5xdWVyeShhbHRlclNxbClcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbm9uLXByaW1hcnkta2V5IGluZGV4ZXMgcHJlc2VudCBvbiB0aGUgc291cmNlIGJ1dCBtaXNzaW5nIGZyb20gdGhlIHRhcmdldCxcbiAgICogYW5kIHJlcGxhY2VzIHRhcmdldCBpbmRleGVzIHdob3NlIGRlZmluaXRpb24gKGNvbHVtbnMgb3IgdW5pcXVlbmVzcykgZHJpZnRlZCBmcm9tXG4gICAqIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7e3NvdXJjZVRhYmxlOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmd9fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlVGFyZ2V0SW5kZXhlcyh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pIHtcbiAgICBjb25zdCB0YXJnZXRUYWJsZSA9IGF3YWl0IHRoaXMudGFyZ2V0RGIuZ2V0VGFibGVCeU5hbWVPckZhaWwodGFibGVOYW1lKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdD59ICovXG4gICAgY29uc3QgdGFyZ2V0SW5kZXhlc0J5TmFtZSA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHRhcmdldEluZGV4U2lnbmF0dXJlcyA9IG5ldyBTZXQoKVxuICAgIGxldCBkaXJ0eSA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldEluZGV4IG9mIGF3YWl0IHRhcmdldFRhYmxlLmdldEluZGV4ZXMoKSkge1xuICAgICAgdGFyZ2V0SW5kZXhlc0J5TmFtZS5zZXQodGFyZ2V0SW5kZXguZ2V0TmFtZSgpLCB0YXJnZXRJbmRleClcbiAgICAgIHRhcmdldEluZGV4U2lnbmF0dXJlcy5hZGQodGhpcy5pbmRleFNpZ25hdHVyZSh0YXJnZXRJbmRleCkpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VJbmRleCBvZiBhd2FpdCBzb3VyY2VUYWJsZS5nZXRJbmRleGVzKCkpIHtcbiAgICAgIGlmIChzb3VyY2VJbmRleC5pc1ByaW1hcnlLZXkoKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VJbmRleFNpZ25hdHVyZSA9IHRoaXMuaW5kZXhTaWduYXR1cmUoc291cmNlSW5kZXgpXG5cbiAgICAgIC8vIFNRTGl0ZSBpbmRleCBuYW1lcyBhcmUgdW5pcXVlIHBlci1kYXRhYmFzZSwgbm90IHBlci10YWJsZSwgc28gbWF0Y2ggY2xvbmVkXG4gICAgICAvLyBpbmRleGVzIGJ5IHRoZWlyIGNvbHVtbi91bmlxdWVuZXNzIHNpZ25hdHVyZSByYXRoZXIgdGhhbiB0aGVpciBuYW1lLlxuICAgICAgaWYgKHRoaXMudGFyZ2V0RGIuZ2V0VHlwZSgpID09PSBcInNxbGl0ZVwiICYmIHRhcmdldEluZGV4U2lnbmF0dXJlcy5oYXMoc291cmNlSW5kZXhTaWduYXR1cmUpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy50YXJnZXREYi5nZXRUeXBlKCkgPT09IFwic3FsaXRlXCIgPyB1bmRlZmluZWQgOiB0YXJnZXRJbmRleGVzQnlOYW1lLmdldChzb3VyY2VJbmRleC5nZXROYW1lKCkpXG5cbiAgICAgIGlmICh0YXJnZXRJbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXhlc01hdGNoKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCkpIHtcbiAgICAgICAgICAvLyBSZXBsYWNpbmcgYSBub24tdW5pcXVlIGluZGV4IHdpdGggYSB1bmlxdWUgb25lIGlzIHVuc2FmZSBiZWNhdXNlXG4gICAgICAgICAgLy8gdGhlIHRhcmdldCBtYXkgaGF2ZSBkdXBsaWNhdGUgdmFsdWVzIHRoYXQgd2lsbCByZWplY3QgdGhlIG5ld1xuICAgICAgICAgIC8vIHVuaXF1ZSBjb25zdHJhaW50LCBhbmQgdGhlIG9sZCBpbmRleCB3YXMgYWxyZWFkeSBkcm9wcGVkIGJ5IHRoaXNcbiAgICAgICAgICAvLyBwb2ludC4gVGhlIG9wcG9zaXRlIGRpcmVjdGlvbiAodW5pcXVlIOKGkiBub24tdW5pcXVlKSBpcyBhbHdheXNcbiAgICAgICAgICAvLyBzYWZlIOKAlCBub24tdW5pcXVlIGluZGV4ZXMgbmV2ZXIgZmFpbCBvbiBkdXBsaWNhdGUgdmFsdWVzLlxuICAgICAgICAgIGlmIChzb3VyY2VJbmRleC5pc1VuaXF1ZSgpICYmICF0YXJnZXRJbmRleC5pc1VuaXF1ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVtYSBjbG9uZSBpbmRleCBkcmlmdCBmb3IgJHt0YWJsZU5hbWV9LiR7c291cmNlSW5kZXguZ2V0TmFtZSgpfTogY2Fubm90IHNhZmVseSByZXBsYWNlIGEgbm9uLXVuaXF1ZSBpbmRleCB3aXRoIGEgdW5pcXVlIG9uZS5gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHRoaXMuZHJvcFRhcmdldEluZGV4KHt0YWJsZU5hbWUsIHRhcmdldEluZGV4fSlcbiAgICAgICAgICB0YXJnZXRJbmRleGVzQnlOYW1lLmRlbGV0ZSh0YXJnZXRJbmRleC5nZXROYW1lKCkpXG4gICAgICAgICAgdGFyZ2V0SW5kZXhTaWduYXR1cmVzLmRlbGV0ZSh0aGlzLmluZGV4U2lnbmF0dXJlKHRhcmdldEluZGV4KSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERyb3AgYW55IHRhcmdldCBpbmRleCB0aGF0IHNoYXJlcyB0aGUgc291cmNlIG5hbWUgYnV0IHN1cnZpdmVkIHRoZVxuICAgICAgLy8gZHJpZnQgY2hlY2sgYWJvdmUgYmVjYXVzZSB0aGUgZHJpdmVyIHdhcyBza2lwcGVkIChTUUxpdGUpLlxuICAgICAgY29uc3Qgc2FtZU5hbWVUYXJnZXRJbmRleCA9IHRhcmdldEluZGV4ZXNCeU5hbWUuZ2V0KHNvdXJjZUluZGV4LmdldE5hbWUoKSlcblxuICAgICAgaWYgKHNhbWVOYW1lVGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kcm9wVGFyZ2V0SW5kZXgoe3RhYmxlTmFtZSwgdGFyZ2V0SW5kZXg6IHNhbWVOYW1lVGFyZ2V0SW5kZXh9KVxuICAgICAgICB0YXJnZXRJbmRleGVzQnlOYW1lLmRlbGV0ZShzYW1lTmFtZVRhcmdldEluZGV4LmdldE5hbWUoKSlcbiAgICAgICAgdGFyZ2V0SW5kZXhTaWduYXR1cmVzLmRlbGV0ZSh0aGlzLmluZGV4U2lnbmF0dXJlKHNhbWVOYW1lVGFyZ2V0SW5kZXgpKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjcmVhdGVJbmRleFNxbHMgPSBhd2FpdCB0aGlzLnRhcmdldERiLmNyZWF0ZUluZGV4U1FMcyh0aGlzLmNyZWF0ZUluZGV4QXJnc0Zyb21Tb3VyY2VJbmRleCh7c291cmNlSW5kZXgsIHRhYmxlTmFtZX0pKVxuXG4gICAgICBmb3IgKGNvbnN0IGNyZWF0ZUluZGV4U3FsIG9mIGNyZWF0ZUluZGV4U3Fscykge1xuICAgICAgICBhd2FpdCB0aGlzLnRhcmdldERiLnF1ZXJ5KGNyZWF0ZUluZGV4U3FsKVxuICAgICAgfVxuXG4gICAgICBkaXJ0eSA9IHRydWVcbiAgICAgIHRhcmdldEluZGV4U2lnbmF0dXJlcy5hZGQoc291cmNlSW5kZXhTaWduYXR1cmUpXG4gICAgfVxuXG4gICAgaWYgKGRpcnR5KSB7XG4gICAgICB0aGlzLnRhcmdldERiLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyBhbiBpbmRleCBvbiB0aGUgdGFyZ2V0IGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge3t0YWJsZU5hbWU6IHN0cmluZywgdGFyZ2V0SW5kZXg6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW5zLWluZGV4LmpzXCIpLmRlZmF1bHR9fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJvcFRhcmdldEluZGV4KHt0YWJsZU5hbWUsIHRhcmdldEluZGV4fSkge1xuICAgIGNvbnN0IGRyb3BTcWxzID0gYXdhaXQgdGhpcy50YXJnZXREYi5yZW1vdmVJbmRleFNRTHMoe25hbWU6IHRhcmdldEluZGV4LmdldE5hbWUoKSwgdGFibGVOYW1lfSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIGRyb3BTcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLnRhcmdldERiLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZWxpbmVzIHRoZSB0YXJnZXQgbGVkZ2VyIHNvIHRoZSBjbG9uZWQgc2NoZW1hIGlzIHJlY29yZGVkIGFzIGFscmVhZHktYXBwbGllZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSBUaGUgdmVyc2lvbnMgbmV3bHkgcmVjb3JkZWQgb24gdGhlIHRhcmdldC5cbiAgICovXG4gIGFzeW5jIHJlY29uY2lsZUxlZGdlcigpIHtcbiAgICByZXR1cm4gYXdhaXQgTWlncmF0aW9uc0xlZGdlci5iYXNlbGluZUZyb21EYXRhYmFzZSh7c291cmNlRGI6IHRoaXMuc291cmNlRGIsIHRhcmdldERiOiB0aGlzLnRhcmdldERifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgbGVkZ2VyIGlzIG1pc3NpbmcgYW55IHZlcnNpb24gYXBwbGllZCBvbiB0aGUgc291cmNlIOKAlCBpLmUuIHRoZVxuICAgKiB0YXJnZXQgc2NoZW1hIG1heSBoYXZlIGJlZW4gYWR2YW5jZWQgb3V0IG9mIGJhbmQgd2l0aG91dCByZWNvcmRpbmcgaXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgbGVkZ2VyRHJpZnRzRnJvbVNvdXJjZSgpIHtcbiAgICBpZiAoIWF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIudGFibGVFeGlzdHModGhpcy50YXJnZXREYikpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlVmVyc2lvbnMgPSBhd2FpdCBNaWdyYXRpb25zTGVkZ2VyLmFwcGxpZWRWZXJzaW9ucyh0aGlzLnNvdXJjZURiKVxuICAgIGNvbnN0IHRhcmdldFZlcnNpb25TZXQgPSBuZXcgU2V0KGF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIuYXBwbGllZFZlcnNpb25zKHRoaXMudGFyZ2V0RGIpKVxuXG4gICAgcmV0dXJuIHNvdXJjZVZlcnNpb25zLnNvbWUoKHZlcnNpb24pID0+ICF0YXJnZXRWZXJzaW9uU2V0Lmhhcyh2ZXJzaW9uKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgc291cmNlIGluZGV4IGludG8gYSBUYWJsZURhdGEgaW5kZXggZm9yIHRhYmxlIGNyZWF0aW9uIChTUUxpdGUgb21pdHMgdGhlXG4gICAqIGluZGV4IG5hbWUgc28gdGhlIGRyaXZlciBjYW4gZ2VuZXJhdGUgYSB1bmlxdWUgb25lKS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSBzb3VyY2VJbmRleFxuICAgKiBAcmV0dXJucyB7VGFibGVJbmRleH1cbiAgICovXG4gIHRhYmxlRGF0YUluZGV4RnJvbVNvdXJjZUluZGV4KHNvdXJjZUluZGV4KSB7XG4gICAgLyoqIEB0eXBlIHt7bmFtZT86IHN0cmluZywgdW5pcXVlOiBib29sZWFufX0gKi9cbiAgICBjb25zdCBhcmdzID0ge3VuaXF1ZTogc291cmNlSW5kZXguaXNVbmlxdWUoKX1cblxuICAgIC8vIFNRTGl0ZSBpbmRleCBuYW1lcyBhcmUgdW5pcXVlIHBlci1kYXRhYmFzZSwgbm90IHBlci10YWJsZSwgc28gbGV0IHRoZSBkcml2ZXJcbiAgICAvLyBnZW5lcmF0ZSBvbmU7IG90aGVyIGRyaXZlcnMgcHJlc2VydmUgdGhlIHNvdXJjZSBpbmRleCBuYW1lLiBCdWlsZCB0aGUgVGFibGVJbmRleFxuICAgIC8vIGRpcmVjdGx5IChyYXRoZXIgdGhhbiB2aWEgdGhlIGRyaXZlcidzIGdldFRhYmxlRGF0YUluZGV4LCB3aGljaCBvbmx5IE15U1FMIGFuZFxuICAgIC8vIFNRTGl0ZSBpbXBsZW1lbnQpIHNvIGNsb25pbmcgYSBQb3N0Z3JlU1FMIG9yIE1TLVNRTCBzb3VyY2UgdGFibGUgd29ya3MgdG9vLlxuICAgIGlmICh0aGlzLnRhcmdldERiLmdldFR5cGUoKSAhPT0gXCJzcWxpdGVcIikge1xuICAgICAgYXJncy5uYW1lID0gc291cmNlSW5kZXguZ2V0TmFtZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KHNvdXJjZUluZGV4LmdldENvbHVtbk5hbWVzKCksIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGRyaXZlciBjcmVhdGUtaW5kZXggYXJncyBmcm9tIGEgc291cmNlIGluZGV4ICh0aGUgaW5kZXggbmFtZSBpcyBvbWl0dGVkIG9uXG4gICAqIFNRTGl0ZSwgd2hlcmUgaW5kZXggbmFtZXMgYXJlIHVuaXF1ZSBwZXItZGF0YWJhc2UgcmF0aGVyIHRoYW4gcGVyLXRhYmxlKS5cbiAgICogQHBhcmFtIHt7c291cmNlSW5kZXg6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW5zLWluZGV4LmpzXCIpLmRlZmF1bHQsIHRhYmxlTmFtZTogc3RyaW5nfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7e2NvbHVtbnM6IHN0cmluZ1tdLCBuYW1lPzogc3RyaW5nLCB0YWJsZU5hbWU6IHN0cmluZywgdW5pcXVlOiBib29sZWFufX1cbiAgICovXG4gIGNyZWF0ZUluZGV4QXJnc0Zyb21Tb3VyY2VJbmRleCh7c291cmNlSW5kZXgsIHRhYmxlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge3tjb2x1bW5zOiBzdHJpbmdbXSwgbmFtZT86IHN0cmluZywgdGFibGVOYW1lOiBzdHJpbmcsIHVuaXF1ZTogYm9vbGVhbn19ICovXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0ge1xuICAgICAgY29sdW1uczogc291cmNlSW5kZXguZ2V0Q29sdW1uTmFtZXMoKSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHVuaXF1ZTogc291cmNlSW5kZXguaXNVbmlxdWUoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldERiLmdldFR5cGUoKSAhPT0gXCJzcWxpdGVcIikge1xuICAgICAgY3JlYXRlSW5kZXhBcmdzLm5hbWUgPSBzb3VyY2VJbmRleC5nZXROYW1lKClcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlSW5kZXhBcmdzXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0d28gaW5kZXhlcyBoYXZlIHRoZSBzYW1lIHVuaXF1ZW5lc3MgYW5kIG9yZGVyZWQgY29sdW1uIGxpc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gc291cmNlSW5kZXhcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSB0YXJnZXRJbmRleFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGluZGV4ZXNNYXRjaChzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgpIHtcbiAgICBjb25zdCBzb3VyY2VDb2x1bW5OYW1lcyA9IHNvdXJjZUluZGV4LmdldENvbHVtbk5hbWVzKClcbiAgICBjb25zdCB0YXJnZXRDb2x1bW5OYW1lcyA9IHRhcmdldEluZGV4LmdldENvbHVtbk5hbWVzKClcblxuICAgIGlmIChzb3VyY2VJbmRleC5pc1VuaXF1ZSgpICE9PSB0YXJnZXRJbmRleC5pc1VuaXF1ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc291cmNlQ29sdW1uTmFtZXMubGVuZ3RoICE9PSB0YXJnZXRDb2x1bW5OYW1lcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAobGV0IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBzb3VyY2VDb2x1bW5OYW1lcy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgIGlmIChzb3VyY2VDb2x1bW5OYW1lc1tjb2x1bW5JbmRleF0gIT09IHRhcmdldENvbHVtbk5hbWVzW2NvbHVtbkluZGV4XSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYW4gaW5kZXgsIHVzZWQgdG8gbWF0Y2ggY2xvbmVkIGluZGV4ZXMgYnkgc2hhcGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gaW5kZXhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGluZGV4U2lnbmF0dXJlKGluZGV4KSB7XG4gICAgcmV0dXJuIGAke2luZGV4LmlzVW5pcXVlKCkgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwifToke2luZGV4LmdldENvbHVtbk5hbWVzKCkuam9pbihcIixcIil9YFxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBjb2x1bW4gdHlwZSB0byBpdHMgY2Fub25pY2FsIGxvd2VyY2FzZSBmb3JtIChgaW50YCBiZWNvbWVzIGBpbnRlZ2VyYCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5UeXBlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBub3JtYWxpemVkQ29sdW1uVHlwZShjb2x1bW5UeXBlKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSBjb2x1bW5UeXBlLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgcmV0dXJuIFwiaW50ZWdlclwiXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUeXBlXG4gIH1cblxuICAvKipcbiAgICogVGhlIHdpZGVuaW5nIHJhbmsgb2YgYSB0ZXh0IGNvbHVtbiB0eXBlICgwIHdoZW4gbm90IGEgdGV4dCB0eXBlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtblR5cGVcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHRleHRUeXBlUmFuayhjb2x1bW5UeXBlKSB7XG4gICAgcmV0dXJuIFRFWFRfVFlQRV9SQU5LU1t0aGlzLm5vcm1hbGl6ZWRDb2x1bW5UeXBlKGNvbHVtblR5cGUpXSB8fCAwXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGFyZ2V0J3MgdGV4dCBjb2x1bW4gaXMgbmFycm93ZXIgdGhhbiB0aGUgc291cmNlJ3MgYW5kIG11c3QgYmUgd2lkZW5lZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IHNvdXJjZUNvbHVtblxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gdGFyZ2V0Q29sdW1uXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgY29sdW1uTmVlZHNXaWRlbmluZyhzb3VyY2VDb2x1bW4sIHRhcmdldENvbHVtbikge1xuICAgIGNvbnN0IHNvdXJjZVJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayhzb3VyY2VDb2x1bW4uZ2V0VHlwZSgpKVxuICAgIGNvbnN0IHRhcmdldFJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayh0YXJnZXRDb2x1bW4uZ2V0VHlwZSgpKVxuXG4gICAgcmV0dXJuIHNvdXJjZVJhbmsgPiAwICYmIHRhcmdldFJhbmsgPiAwICYmIHNvdXJjZVJhbmsgPiB0YXJnZXRSYW5rXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIFRhYmxlRGF0YSBjb2x1bW4gYXJncyBmcm9tIGEgc291cmNlIGNvbHVtbiwgY29weWluZyB0eXBlLCBudWxsYWJpbGl0eSxcbiAgICogbGVuZ3RoLCBub3Rlcywgc2ltcGxlIGRlZmF1bHRzIGFuZCAoZm9yIGZ1bGwgY2xvbmVzKSBwcmltYXJ5LWtleSBmbGFnLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gc291cmNlQ29sdW1uXG4gICAqIEBwYXJhbSB7e2lzTmV3Q29sdW1uOiBib29sZWFufX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqL1xuICBjb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbn0pIHtcbiAgICAvKiogQHR5cGUge3thdXRvSW5jcmVtZW50PzogYm9vbGVhbiwgZGVmYXVsdD86IHVua25vd24sIGlzTmV3Q29sdW1uOiBib29sZWFuLCBtYXhMZW5ndGg/OiBudW1iZXIsIG5vdGVzPzogc3RyaW5nLCBudWxsOiBib29sZWFuLCBwcmltYXJ5S2V5PzogYm9vbGVhbiwgdHlwZTogc3RyaW5nfX0gKi9cbiAgICBjb25zdCBjb2x1bW5BcmdzID0ge1xuICAgICAgaXNOZXdDb2x1bW4sXG4gICAgICBudWxsOiBzb3VyY2VDb2x1bW4uZ2V0TnVsbCgpLFxuICAgICAgdHlwZTogdGhpcy5ub3JtYWxpemVkQ29sdW1uVHlwZShzb3VyY2VDb2x1bW4uZ2V0VHlwZSgpKVxuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBzb3VyY2VDb2x1bW4uZ2V0RGVmYXVsdCgpXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gc291cmNlQ29sdW1uLmdldE1heExlbmd0aCgpXG4gICAgY29uc3Qgbm90ZXMgPSBzb3VyY2VDb2x1bW4uZ2V0Tm90ZXMoKVxuXG4gICAgaWYgKCFpc05ld0NvbHVtbiAmJiBzb3VyY2VDb2x1bW4uZ2V0UHJpbWFyeUtleSgpKSB7XG4gICAgICBjb2x1bW5BcmdzLnByaW1hcnlLZXkgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUNvbHVtbi5nZXRBdXRvSW5jcmVtZW50KCkpIHtcbiAgICAgIGNvbHVtbkFyZ3MuYXV0b0luY3JlbWVudCA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBBIG1heExlbmd0aCBvZiAtMSBpcyB0aGUgTVMtU1FMIFwibWF4XCIgc2VudGluZWwgKE5WQVJDSEFSKE1BWCkgLyBWQVJCSU5BUlkoTUFYKSxcbiAgICAvLyBiYWNraW5nIFZlbG9jaW91cyB0ZXh0L2pzb24vYmxvYiBjb2x1bW5zKTsgdGhlIGNvbHVtbiB0eXBlIGRyaXZlcyB0aGUgdW5ib3VuZGVkXG4gICAgLy8gU1FMLCBzbyBkb24ndCBmb3J3YXJkIC0xIGFzIGFuIGV4cGxpY2l0IGxlbmd0aCAoaXQgd291bGQgZW1pdCBOVkFSQ0hBUigtMSkpLlxuICAgIGlmIChtYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBtYXhMZW5ndGggPj0gMCkge1xuICAgICAgY29sdW1uQXJncy5tYXhMZW5ndGggPSBtYXhMZW5ndGhcbiAgICB9XG5cbiAgICBpZiAobm90ZXMpIHtcbiAgICAgIGNvbHVtbkFyZ3Mubm90ZXMgPSBub3Rlc1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgU0lNUExFX0RFRkFVTFRfUEFUVEVSTi50ZXN0KFN0cmluZyhkZWZhdWx0VmFsdWUpKSkge1xuICAgICAgY29sdW1uQXJncy5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbkFyZ3NcbiAgfVxufVxuIl19
|
|
@@ -28,6 +28,15 @@ export function frontendModelResourceConfigurationFromDefinition(resourceDefinit
|
|
|
28
28
|
* @returns {Record<string, import("../configuration-types.js").NormalizedFrontendModelResourceSyncConfiguration>} - Sync metadata keyed by model name.
|
|
29
29
|
*/
|
|
30
30
|
export function frontendModelSyncManifestForBackendProjects(backendProjects: import("../configuration-types.js").BackendProjectConfiguration[]): Record<string, import("../configuration-types.js").NormalizedFrontendModelResourceSyncConfiguration>;
|
|
31
|
+
/**
|
|
32
|
+
* Builds a frontend-safe API manifest for all registered frontend-model
|
|
33
|
+
* resources. The manifest is deterministic (sorted model names, sorted
|
|
34
|
+
* attributes, sorted commands) and includes only public-safe metadata: no
|
|
35
|
+
* secrets, no server callbacks, no backend file paths.
|
|
36
|
+
* @param {import("../configuration-types.js").BackendProjectConfiguration[]} backendProjects - Backend projects to scan.
|
|
37
|
+
* @returns {Record<string, unknown>} - Frontend-safe API manifest.
|
|
38
|
+
*/
|
|
39
|
+
export function frontendModelApiManifest(backendProjects: import("../configuration-types.js").BackendProjectConfiguration[]): Record<string, unknown>;
|
|
31
40
|
/**
|
|
32
41
|
* Runs the frontendModelResourcePath helper.
|
|
33
42
|
* @param {string} modelName - Model class name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-definition.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/resource-definition.js"],"names":[],"mappings":"AAoDA;;;;GAIG;AACH,wEAHW,OAAO,2BAA2B,EAAE,2BAA2B,GAC7D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,8BAA8B,CAAC,CAc9F;AAED;;;;GAIG;AACH,8DAHW,OAAC,GACC,KAAK,IAAI,OAAO,2BAA2B,EAAE,8BAA8B,CAIvF;AAED;;;;GAIG;AACH,6EAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,8BAA8B,GAAG,IAAI,CAIrF;AAED;;;;GAIG;AACH,qFAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,4CAA4C,GAAG,IAAI,CAQnG;AA4JD;;;;GAIG;AACH,6EAHW,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,GAC/D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,gDAAgD,CAAC,CAuBhH;
|
|
1
|
+
{"version":3,"file":"resource-definition.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/resource-definition.js"],"names":[],"mappings":"AAoDA;;;;GAIG;AACH,wEAHW,OAAO,2BAA2B,EAAE,2BAA2B,GAC7D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,8BAA8B,CAAC,CAc9F;AAED;;;;GAIG;AACH,8DAHW,OAAC,GACC,KAAK,IAAI,OAAO,2BAA2B,EAAE,8BAA8B,CAIvF;AAED;;;;GAIG;AACH,6EAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,8BAA8B,GAAG,IAAI,CAIrF;AAED;;;;GAIG;AACH,qFAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,4CAA4C,GAAG,IAAI,CAQnG;AA4JD;;;;GAIG;AACH,6EAHW,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,GAC/D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,gDAAgD,CAAC,CAuBhH;AAED;;;;;;;GAOG;AACH,0DAHW,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,GAC/D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkFnC;AA0gBD;;;;;GAKG;AACH,qDAJW,MAAM,sBACN,OAAC,GACC,MAAM,CAUlB;AAED;;;;;;;GAOG;AACH,8FALG;IAAqB,WAAW,EAAxB,MAAM;IACO,SAAS,EAAtB,MAAM;IACE,kBAAkB,EAA1B,OAAC;CACT,GAAU,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,IAAI,CA2BrG;AAED;;;;;;GAMG;AACH,oFAJG;IAAgF,eAAe,EAAvF,OAAO,2BAA2B,EAAE,2BAA2B,EAAE;IACpD,WAAW,EAAxB,MAAM;CACd,GAAU;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAAA;CAAC,GAAG,IAAI,CA8DxJ;AAiBD;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,mFAJG;IAA4G,aAAa,EAAjH;QAAC,kBAAkB,EAAE,MAAM,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,CAAA;KAAC;IAChF,YAAY,EAAzB,MAAM;CACd,GAAU,yCAAyC,GAAG,IAAI,CA0B5D;;;;;;;;eAxCa,MAAM;;;;mBACN,OAAO,2BAA2B,EAAE,8BAA8B;;;;2BAClE,OAAO,2BAA2B,EAAE,4CAA4C"}
|