@bitgo-beta/sdk-coin-sol 7.6.4-beta.720 → 7.6.4-beta.722

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.
Files changed (40) hide show
  1. package/LICENSE +191 -0
  2. package/dist/cjs/src/lib/constants.d.ts +7 -0
  3. package/dist/cjs/src/lib/constants.d.ts.map +1 -1
  4. package/dist/cjs/src/lib/constants.js +9 -2
  5. package/dist/cjs/src/lib/customInstructionBuilder.d.ts +13 -2
  6. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -1
  7. package/dist/cjs/src/lib/customInstructionBuilder.js +131 -28
  8. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
  9. package/dist/cjs/src/lib/instructionParamsFactory.js +81 -21
  10. package/dist/cjs/src/lib/transaction.d.ts +12 -1
  11. package/dist/cjs/src/lib/transaction.d.ts.map +1 -1
  12. package/dist/cjs/src/lib/transaction.js +31 -1
  13. package/dist/cjs/src/lib/transactionBuilder.d.ts +33 -0
  14. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -1
  15. package/dist/cjs/src/lib/transactionBuilder.js +75 -1
  16. package/dist/cjs/src/lib/utils.d.ts.map +1 -1
  17. package/dist/cjs/src/lib/utils.js +12 -4
  18. package/dist/cjs/test/unit/transaction.js +22 -1
  19. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  20. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  21. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  22. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +334 -23
  23. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  24. package/dist/esm/lib/constants.d.ts +7 -0
  25. package/dist/esm/lib/constants.d.ts.map +1 -1
  26. package/dist/esm/lib/constants.js +8 -1
  27. package/dist/esm/lib/customInstructionBuilder.d.ts +13 -2
  28. package/dist/esm/lib/customInstructionBuilder.d.ts.map +1 -1
  29. package/dist/esm/lib/customInstructionBuilder.js +132 -29
  30. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
  31. package/dist/esm/lib/instructionParamsFactory.js +81 -21
  32. package/dist/esm/lib/transaction.d.ts +12 -1
  33. package/dist/esm/lib/transaction.d.ts.map +1 -1
  34. package/dist/esm/lib/transaction.js +31 -1
  35. package/dist/esm/lib/transactionBuilder.d.ts +33 -0
  36. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -1
  37. package/dist/esm/lib/transactionBuilder.js +76 -2
  38. package/dist/esm/lib/utils.d.ts.map +1 -1
  39. package/dist/esm/lib/utils.js +12 -4
  40. package/package.json +8 -8
@@ -11,6 +11,7 @@ const transactionBuilder_1 = require("./transactionBuilder");
11
11
  const constants_1 = require("./constants");
12
12
  const utils_1 = require("./utils");
13
13
  const assert_1 = __importDefault(require("assert"));
14
+ const bs58_1 = __importDefault(require("bs58"));
14
15
  /**
15
16
  * Transaction builder for custom Solana instructions.
16
17
  * Allows building transactions with any set of raw Solana instructions.
@@ -134,30 +135,94 @@ class CustomInstructionBuilder extends transactionBuilder_1.TransactionBuilder {
134
135
  }
135
136
  /**
136
137
  * Inject nonce advance instruction into versioned transaction data for durable nonce support.
137
- * Reorders accounts so signers appear first (required by Solana MessageV0 format).
138
+ * Rebuilds the static account keys section by section (writable signers, read-only signers,
139
+ * writable non-signers, read-only non-signers), remaps every instruction index - static and
140
+ * lookup-table - to the new key order, and validates that the result compiles to a MessageV0.
138
141
  * @param data - Original versioned transaction data
139
- * @returns Modified versioned transaction data with nonce advance instruction
142
+ * @returns Modified versioned transaction data with the nonce advance instruction first
140
143
  * @private
141
144
  */
142
145
  injectNonceAdvanceInstruction(data) {
143
146
  const { walletNonceAddress, authWalletAddress } = this._nonceInfo.params;
144
147
  const SYSTEM_PROGRAM = web3_js_1.SystemProgram.programId.toBase58();
145
148
  const SYSVAR_RECENT_BLOCKHASHES = web3_js_1.SYSVAR_RECENT_BLOCKHASHES_PUBKEY.toBase58();
146
- const numSigners = data.messageHeader.numRequiredSignatures;
147
- const originalSigners = data.staticAccountKeys.slice(0, numSigners);
148
- const originalNonSigners = data.staticAccountKeys.slice(numSigners);
149
- if (!originalSigners.includes(authWalletAddress)) {
150
- originalSigners.push(authWalletAddress);
151
- }
152
- const nonSigners = [...originalNonSigners];
153
- const allKeys = [...originalSigners, ...originalNonSigners];
154
- if (!allKeys.includes(SYSTEM_PROGRAM))
155
- nonSigners.push(SYSTEM_PROGRAM);
156
- if (!allKeys.includes(walletNonceAddress))
157
- nonSigners.push(walletNonceAddress);
158
- if (!allKeys.includes(SYSVAR_RECENT_BLOCKHASHES))
159
- nonSigners.push(SYSVAR_RECENT_BLOCKHASHES);
160
- const newStaticAccountKeys = [...originalSigners, ...nonSigners];
149
+ const { numRequiredSignatures, numReadonlySignedAccounts, numReadonlyUnsignedAccounts } = data.messageHeader;
150
+ const oldStaticLen = data.staticAccountKeys.length;
151
+ if (numReadonlySignedAccounts > numRequiredSignatures ||
152
+ numRequiredSignatures + numReadonlyUnsignedAccounts > oldStaticLen) {
153
+ throw new sdk_core_1.BuildTransactionError(`Invalid message header: readonly counts (${numReadonlySignedAccounts}, ${numReadonlyUnsignedAccounts}) ` +
154
+ `are inconsistent with ${numRequiredSignatures} required signatures and ${oldStaticLen} static account keys`);
155
+ }
156
+ // Split the original static keys into the four MessageV0 header sections.
157
+ const writableSigners = data.staticAccountKeys.slice(0, numRequiredSignatures - numReadonlySignedAccounts);
158
+ const readonlySigners = data.staticAccountKeys.slice(numRequiredSignatures - numReadonlySignedAccounts, numRequiredSignatures);
159
+ const writableNonSigners = data.staticAccountKeys.slice(numRequiredSignatures, oldStaticLen - numReadonlyUnsignedAccounts);
160
+ const readonlyNonSigners = data.staticAccountKeys.slice(oldStaticLen - numReadonlyUnsignedAccounts);
161
+ // The nonce authority must be a signer for AdvanceNonceAccount. If it is already present
162
+ // as a non-signer, move it into the signers, keeping its writability (a writable
163
+ // non-signer becomes a writable signer, a read-only one a read-only signer).
164
+ const authorityIsSigner = writableSigners.includes(authWalletAddress) || readonlySigners.includes(authWalletAddress);
165
+ if (!authorityIsSigner) {
166
+ const asReadonlyNonSigner = readonlyNonSigners.indexOf(authWalletAddress);
167
+ const asWritableNonSigner = writableNonSigners.indexOf(authWalletAddress);
168
+ if (asReadonlyNonSigner >= 0) {
169
+ readonlyNonSigners.splice(asReadonlyNonSigner, 1);
170
+ readonlySigners.push(authWalletAddress);
171
+ }
172
+ else if (asWritableNonSigner >= 0) {
173
+ writableNonSigners.splice(asWritableNonSigner, 1);
174
+ writableSigners.push(authWalletAddress);
175
+ }
176
+ else {
177
+ // A brand-new authority is a read-only signer for AdvanceNonceAccount.
178
+ readonlySigners.push(authWalletAddress);
179
+ }
180
+ }
181
+ // The nonce account must be writable for AdvanceNonceAccount. If it is already present,
182
+ // keep it in place when writable, or move it into the writable section when read-only.
183
+ const nonceAsReadonlyNonSigner = readonlyNonSigners.indexOf(walletNonceAddress);
184
+ const nonceAsReadonlySigner = readonlySigners.indexOf(walletNonceAddress);
185
+ if (nonceAsReadonlyNonSigner >= 0) {
186
+ readonlyNonSigners.splice(nonceAsReadonlyNonSigner, 1);
187
+ writableNonSigners.push(walletNonceAddress);
188
+ }
189
+ else if (nonceAsReadonlySigner >= 0) {
190
+ readonlySigners.splice(nonceAsReadonlySigner, 1);
191
+ writableSigners.push(walletNonceAddress);
192
+ }
193
+ else if (!writableSigners.includes(walletNonceAddress) && !writableNonSigners.includes(walletNonceAddress)) {
194
+ writableNonSigners.push(walletNonceAddress);
195
+ }
196
+ // The system program and the recent blockhashes sysvar are read-only non-signers for
197
+ // AdvanceNonceAccount.
198
+ const isPresent = (key) => writableSigners.includes(key) ||
199
+ readonlySigners.includes(key) ||
200
+ writableNonSigners.includes(key) ||
201
+ readonlyNonSigners.includes(key);
202
+ if (!isPresent(SYSTEM_PROGRAM)) {
203
+ readonlyNonSigners.push(SYSTEM_PROGRAM);
204
+ }
205
+ if (!isPresent(SYSVAR_RECENT_BLOCKHASHES)) {
206
+ readonlyNonSigners.push(SYSVAR_RECENT_BLOCKHASHES);
207
+ }
208
+ const newStaticAccountKeys = [...writableSigners, ...readonlySigners, ...writableNonSigners, ...readonlyNonSigners];
209
+ // Build one full old-index to new-index map covering static and lookup-table indexes.
210
+ // Static indexes follow their key to its new position; lookup-table indexes, which are
211
+ // appended after the static keys, shift by the number of inserted static keys.
212
+ const indexMap = new Map();
213
+ data.staticAccountKeys.forEach((key, oldIdx) => indexMap.set(oldIdx, newStaticAccountKeys.indexOf(key)));
214
+ const shift = newStaticAccountKeys.length - oldStaticLen;
215
+ const lookupKeyCount = data.addressLookupTables.reduce((sum, alt) => sum + alt.writableIndexes.length + alt.readonlyIndexes.length, 0);
216
+ for (let i = oldStaticLen; i < oldStaticLen + lookupKeyCount; i++) {
217
+ indexMap.set(i, i + shift);
218
+ }
219
+ const remapIndex = (index) => {
220
+ const mapped = indexMap.get(index);
221
+ if (mapped === undefined) {
222
+ throw new sdk_core_1.BuildTransactionError(`Invalid account key index ${index} in versioned instruction`);
223
+ }
224
+ return mapped;
225
+ };
161
226
  const nonceAdvanceInstruction = {
162
227
  programIdIndex: newStaticAccountKeys.indexOf(SYSTEM_PROGRAM),
163
228
  accountKeyIndexes: [
@@ -167,21 +232,59 @@ class CustomInstructionBuilder extends transactionBuilder_1.TransactionBuilder {
167
232
  ],
168
233
  data: '6vx8P', // SystemProgram AdvanceNonceAccount (0x04000000) in base58
169
234
  };
170
- const indexMap = new Map(data.staticAccountKeys.map((key, oldIdx) => [oldIdx, newStaticAccountKeys.indexOf(key)]));
171
- const remappedInstructions = data.versionedInstructions.map((inst) => ({
172
- programIdIndex: indexMap.get(inst.programIdIndex) ?? inst.programIdIndex,
173
- accountKeyIndexes: inst.accountKeyIndexes.map((idx) => indexMap.get(idx) ?? idx),
174
- data: inst.data,
175
- }));
176
- return {
235
+ const processed = {
177
236
  ...data,
178
- versionedInstructions: [nonceAdvanceInstruction, ...remappedInstructions],
237
+ versionedInstructions: [
238
+ nonceAdvanceInstruction,
239
+ ...data.versionedInstructions.map((inst) => ({
240
+ programIdIndex: remapIndex(inst.programIdIndex),
241
+ accountKeyIndexes: inst.accountKeyIndexes.map(remapIndex),
242
+ data: inst.data,
243
+ })),
244
+ ],
179
245
  staticAccountKeys: newStaticAccountKeys,
180
246
  messageHeader: {
181
- ...data.messageHeader,
182
- numRequiredSignatures: originalSigners.length,
247
+ numRequiredSignatures: writableSigners.length + readonlySigners.length,
248
+ numReadonlySignedAccounts: readonlySigners.length,
249
+ numReadonlyUnsignedAccounts: readonlyNonSigners.length,
183
250
  },
184
251
  };
252
+ this.validateInjectedMessage(processed);
253
+ return processed;
254
+ }
255
+ /**
256
+ * Validate the result of injectNonceAdvanceInstruction by compiling it: the MessageV0 built
257
+ * from the new keys, header, lookups and instructions must deserialize and contain no
258
+ * duplicate keys.
259
+ * @param data - Processed versioned transaction data
260
+ * @throws {BuildTransactionError} if the rebuilt message does not compile
261
+ * @private
262
+ */
263
+ validateInjectedMessage(data) {
264
+ if (new Set(data.staticAccountKeys).size !== data.staticAccountKeys.length) {
265
+ throw new sdk_core_1.BuildTransactionError('Injected nonce advance instruction produced duplicate account keys');
266
+ }
267
+ const message = new web3_js_1.MessageV0({
268
+ header: data.messageHeader,
269
+ staticAccountKeys: data.staticAccountKeys.map((key) => new web3_js_1.PublicKey(key)),
270
+ recentBlockhash: data.recentBlockhash ?? this._recentBlockhash,
271
+ compiledInstructions: data.versionedInstructions.map((instruction) => ({
272
+ programIdIndex: instruction.programIdIndex,
273
+ accountKeyIndexes: instruction.accountKeyIndexes,
274
+ data: Buffer.from(bs58_1.default.decode(instruction.data)),
275
+ })),
276
+ addressTableLookups: data.addressLookupTables.map((alt) => ({
277
+ accountKey: new web3_js_1.PublicKey(alt.accountKey),
278
+ writableIndexes: alt.writableIndexes,
279
+ readonlyIndexes: alt.readonlyIndexes,
280
+ })),
281
+ });
282
+ try {
283
+ web3_js_1.MessageV0.deserialize(message.serialize());
284
+ }
285
+ catch (error) {
286
+ throw new sdk_core_1.BuildTransactionError(`Injected nonce advance instruction produced an invalid message: ${error instanceof Error ? error.message : error}`);
287
+ }
185
288
  }
186
289
  /**
187
290
  * Clear all custom instructions and versioned transaction data
@@ -286,4 +389,4 @@ class CustomInstructionBuilder extends transactionBuilder_1.TransactionBuilder {
286
389
  }
287
390
  }
288
391
  exports.CustomInstructionBuilder = CustomInstructionBuilder;
289
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQXVIO0FBQ3ZILDZDQUE2RjtBQUM3RiwrQ0FBNEM7QUFDNUMsNkRBQTBEO0FBQzFELDJDQUFzRDtBQUV0RCxtQ0FBaUQ7QUFDakQsb0RBQTRCO0FBRTVCOzs7R0FHRztBQUNILE1BQWEsd0JBQXlCLFNBQVEsdUNBQWtCO0lBRzlELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSGIsd0JBQW1CLEdBQXVELEVBQUUsQ0FBQztJQUlyRixDQUFDO0lBRUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEVBQWU7UUFDekIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0QixLQUFLLE1BQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxtQ0FBdUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNuRSxNQUFNLGlCQUFpQixHQUFHLFdBQWdDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxDQUFDO2lCQUFNLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxtQ0FBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2dCQUNuRixNQUFNLDBCQUEwQixHQUFHLFdBQXlDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENB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QUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLG1EQUFtRCxDQUFDLENBQUM7UUFFakcsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFdkQsT0FBTyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQXpURCw0REF5VEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFNvbEluc3RydWN0aW9uLCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgUHVibGljS2V5LCBTeXN0ZW1Qcm9ncmFtLCBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWSB9IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDdXN0b21JbnN0cnVjdGlvbiwgVmVyc2lvbmVkQ3VzdG9tSW5zdHJ1Y3Rpb24sIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgaXNTb2xMZWdhY3lJbnN0cnVjdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG4vKipcbiAqIFRyYW5zYWN0aW9uIGJ1aWxkZXIgZm9yIGN1c3RvbSBTb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICogQWxsb3dzIGJ1aWxkaW5nIHRyYW5zYWN0aW9ucyB3aXRoIGFueSBzZXQgb2YgcmF3IFNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9jdXN0b21JbnN0cnVjdGlvbnM6IChDdXN0b21JbnN0cnVjdGlvbiB8IFZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uKVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJ1aWxkZXIgZnJvbSBhbiBleGlzdGluZyB0cmFuc2FjdGlvblxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBDdXN0b21JbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5hZGRDdXN0b21JbnN0cnVjdGlvbihjdXN0b21JbnN0cnVjdGlvbi5wYXJhbXMpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbikge1xuICAgICAgICBjb25zdCB2ZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLmFkZEN1c3RvbUluc3RydWN0aW9uKHZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uLnBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1c3RvbSBpbnN0cnVjdGlvbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIGN1c3RvbSBpbnN0cnVjdGlvbiB0byBhZGRcbiAgICogQHJldHVybnMgVGhpcyBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBhZGRDdXN0b21JbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogU29sSW5zdHJ1Y3Rpb24gfCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG5cbiAgICBpZiAoaXNTb2xMZWdhY3lJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpIHtcbiAgICAgIGNvbnN0IGN1c3RvbUluc3RydWN0aW9uOiBDdXN0b21JbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gICAgICAgIHBhcmFtczogaW5zdHJ1Y3Rpb24sXG4gICAgICB9O1xuICAgICAgdGhpcy5fY3VzdG9tSW5zdHJ1Y3Rpb25zLnB1c2goY3VzdG9tSW5zdHJ1Y3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbjogVmVyc2lvbmVkQ3VzdG9tSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uLFxuICAgICAgICBwYXJhbXM6IGluc3RydWN0aW9uLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2N1c3RvbUluc3RydWN0aW9ucy5wdXNoKHZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbXVsdGlwbGUgY3VzdG9tIGluc3RydWN0aW9ucyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGluc3RydWN0aW9ucyAtIEFycmF5IG9mIGN1c3RvbSBpbnN0cnVjdGlvbnMgdG8gYWRkXG4gICAqIEByZXR1cm5zIFRoaXMgYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogKFNvbEluc3RydWN0aW9uIHwgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pW10pOiB0aGlzIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgIHRoaXMuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0cmFuc2FjdGlvbiBmcm9tIGRlY29uc3RydWN0ZWQgVmVyc2lvbmVkVHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcGFyYW0gZGF0YSAtIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSBjb250YWluaW5nIGluc3RydWN0aW9ucywgQUxUcywgYW5kIGFjY291bnQga2V5c1xuICAgKiBAcmV0dXJucyBUaGlzIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIGZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoZGF0YTogVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKTogdGhpcyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zKSB8fCBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndmVyc2lvbmVkSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuYWRkcmVzc0xvb2t1cFRhYmxlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignYWRkcmVzc0xvb2t1cFRhYmxlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnN0YXRpY0FjY291bnRLZXlzKSB8fCBkYXRhLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdzdGF0aWNBY2NvdW50S2V5cyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS5tZXNzYWdlSGVhZGVyIHx8IHR5cGVvZiBkYXRhLm1lc3NhZ2VIZWFkZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ21lc3NhZ2VIZWFkZXIgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyA8IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdtZXNzYWdlSGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMgIT09ICdudW1iZXInIHx8XG4gICAgICAgIGRhdGEubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzIDwgMFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ21lc3NhZ2VIZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyA8IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdtZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcHJvY2Vzc2VkRGF0YSA9IGRhdGE7XG4gICAgICBpZiAodGhpcy5fbm9uY2VJbmZvICYmIHRoaXMuX25vbmNlSW5mby5wYXJhbXMpIHtcbiAgICAgICAgcHJvY2Vzc2VkRGF0YSA9IHRoaXMuaW5qZWN0Tm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24oZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKHByb2Nlc3NlZERhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgaWYgKCF0aGlzLl90cmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShwcm9jZXNzZWREYXRhKTtcblxuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgIGlmICghdGhpcy5fc2VuZGVyICYmIHByb2Nlc3NlZERhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9zZW5kZXIgPSBwcm9jZXNzZWREYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQnVpbGRUcmFuc2FjdGlvbkVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGRhdGE6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IG5vbmNlIGFkdmFuY2UgaW5zdHJ1Y3Rpb24gaW50byB2ZXJzaW9uZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgZHVyYWJsZSBub25jZSBzdXBwb3J0LlxuICAgKiBSZW9yZGVycyBhY2NvdW50cyBzbyBzaWduZXJzIGFwcGVhciBmaXJzdCAocmVxdWlyZWQgYnkgU29sYW5hIE1lc3NhZ2VWMCBmb3JtYXQpLlxuICAgKiBAcGFyYW0gZGF0YSAtIE9yaWdpbmFsIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIE1vZGlmaWVkIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhIHdpdGggbm9uY2UgYWR2YW5jZSBpbnN0cnVjdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3ROb25jZUFkdmFuY2VJbnN0cnVjdGlvbihkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEpOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEge1xuICAgIGNvbnN0IHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9ID0gdGhpcy5fbm9uY2VJbmZvIS5wYXJhbXM7XG4gICAgY29uc3QgU1lTVEVNX1BST0dSQU0gPSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMgPSBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWS50b0Jhc2U1OCgpO1xuXG4gICAgY29uc3QgbnVtU2lnbmVycyA9IGRhdGEubWVzc2FnZUhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7XG4gICAgY29uc3Qgb3JpZ2luYWxTaWduZXJzID0gZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZSgwLCBudW1TaWduZXJzKTtcbiAgICBjb25zdCBvcmlnaW5hbE5vblNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKG51bVNpZ25lcnMpO1xuXG4gICAgaWYgKCFvcmlnaW5hbFNpZ25lcnMuaW5jbHVkZXMoYXV0aFdhbGxldEFkZHJlc3MpKSB7XG4gICAgICBvcmlnaW5hbFNpZ25lcnMucHVzaChhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uU2lnbmVycyA9IFsuLi5vcmlnaW5hbE5vblNpZ25lcnNdO1xuICAgIGNvbnN0IGFsbEtleXMgPSBbLi4ub3JpZ2luYWxTaWduZXJzLCAuLi5vcmlnaW5hbE5vblNpZ25lcnNdO1xuXG4gICAgaWYgKCFhbGxLZXlzLmluY2x1ZGVzKFNZU1RFTV9QUk9HUkFNKSkgbm9uU2lnbmVycy5wdXNoKFNZU1RFTV9QUk9HUkFNKTtcbiAgICBpZiAoIWFsbEtleXMuaW5jbHVkZXMod2FsbGV0Tm9uY2VBZGRyZXNzKSkgbm9uU2lnbmVycy5wdXNoKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gICAgaWYgKCFhbGxLZXlzLmluY2x1ZGVzKFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMpKSBub25TaWduZXJzLnB1c2goU1lTVkFSX1JFQ0VOVF9CTE9DS0hBU0hFUyk7XG5cbiAgICBjb25zdCBuZXdTdGF0aWNBY2NvdW50S2V5cyA9IFsuLi5vcmlnaW5hbFNpZ25lcnMsIC4uLm5vblNpZ25lcnNdO1xuXG4gICAgY29uc3Qgbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb246IFNvbFZlcnNpb25lZEluc3RydWN0aW9uID0ge1xuICAgICAgcHJvZ3JhbUlkSW5kZXg6IG5ld1N0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoU1lTVEVNX1BST0dSQU0pLFxuICAgICAgYWNjb3VudEtleUluZGV4ZXM6IFtcbiAgICAgICAgbmV3U3RhdGljQWNjb3VudEtleXMuaW5kZXhPZih3YWxsZXROb25jZUFkZHJlc3MpLFxuICAgICAgICBuZXdTdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMpLFxuICAgICAgICBuZXdTdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKGF1dGhXYWxsZXRBZGRyZXNzKSxcbiAgICAgIF0sXG4gICAgICBkYXRhOiAnNnZ4OFAnLCAvLyBTeXN0ZW1Qcm9ncmFtIEFkdmFuY2VOb25jZUFjY291bnQgKDB4MDQwMDAwMDApIGluIGJhc2U1OFxuICAgIH07XG5cbiAgICBjb25zdCBpbmRleE1hcCA9IG5ldyBNYXAoZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5tYXAoKGtleSwgb2xkSWR4KSA9PiBbb2xkSWR4LCBuZXdTdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKGtleSldKSk7XG4gICAgY29uc3QgcmVtYXBwZWRJbnN0cnVjdGlvbnMgPSBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5tYXAoKGluc3QpID0+ICh7XG4gICAgICBwcm9ncmFtSWRJbmRleDogaW5kZXhNYXAuZ2V0KGluc3QucHJvZ3JhbUlkSW5kZXgpID8/IGluc3QucHJvZ3JhbUlkSW5kZXgsXG4gICAgICBhY2NvdW50S2V5SW5kZXhlczogaW5zdC5hY2NvdW50S2V5SW5kZXhlcy5tYXAoKGlkeCkgPT4gaW5kZXhNYXAuZ2V0KGlkeCkgPz8gaWR4KSxcbiAgICAgIGRhdGE6IGluc3QuZGF0YSxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHZlcnNpb25lZEluc3RydWN0aW9uczogW25vbmNlQWR2YW5jZUluc3RydWN0aW9uLCAuLi5yZW1hcHBlZEluc3RydWN0aW9uc10sXG4gICAgICBzdGF0aWNBY2NvdW50S2V5czogbmV3U3RhdGljQWNjb3VudEtleXMsXG4gICAgICBtZXNzYWdlSGVhZGVyOiB7XG4gICAgICAgIC4uLmRhdGEubWVzc2FnZUhlYWRlcixcbiAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiBvcmlnaW5hbFNpZ25lcnMubGVuZ3RoLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjdXN0b20gaW5zdHJ1Y3Rpb25zIGFuZCB2ZXJzaW9uZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyBUaGlzIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIGNsZWFySW5zdHJ1Y3Rpb25zKCk6IHRoaXMge1xuICAgIHRoaXMuX2N1c3RvbUluc3RydWN0aW9ucyA9IFtdO1xuICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbikge1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBjdXN0b20gaW5zdHJ1Y3Rpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgICovXG4gIGdldEluc3RydWN0aW9ucygpOiAoQ3VzdG9tSW5zdHJ1Y3Rpb24gfCBWZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbilbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9jdXN0b21JbnN0cnVjdGlvbnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGN1c3RvbSBpbnN0cnVjdGlvbiBmb3JtYXRcbiAgICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIGluc3RydWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb246IFNvbEluc3RydWN0aW9uIHwgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIWluc3RydWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnN0cnVjdGlvbiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTb2xMZWdhY3lJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVTb2xJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsaWRhdGVWZXJzaW9uZWRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRyYWRpdGlvbmFsIFNvbEluc3RydWN0aW9uIGZvcm1hdFxuICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSBUaGUgdHJhZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gdG8gdmFsaWRhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTb2xJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogU29sSW5zdHJ1Y3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIWluc3RydWN0aW9uLnByb2dyYW1JZCB8fCB0eXBlb2YgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGEgdmFsaWQgcHJvZ3JhbUlkIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgcHJvZ3JhbUlkIGlzIGEgdmFsaWQgU29sYW5hIHB1YmxpYyBrZXlcbiAgICB0cnkge1xuICAgICAgbmV3IFB1YmxpY0tleShpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHByb2dyYW1JZCBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWluc3RydWN0aW9uLmtleXMgfHwgIUFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb24ua2V5cykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0luc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBrZXlzIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZWFjaCBrZXlcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBpbnN0cnVjdGlvbi5rZXlzKSB7XG4gICAgICBpZiAoIWtleS5wdWJrZXkgfHwgdHlwZW9mIGtleS5wdWJrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VhY2gga2V5IG11c3QgaGF2ZSBhIHZhbGlkIHB1YmtleSBzdHJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFB1YmxpY0tleShrZXkucHVia2V5KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcHVia2V5IGZvcm1hdCBpbiBrZXlzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Yga2V5LmlzU2lnbmVyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRWFjaCBrZXkgbXVzdCBoYXZlIGEgYm9vbGVhbiBpc1NpZ25lciBmaWVsZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGtleS5pc1dyaXRhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRWFjaCBrZXkgbXVzdCBoYXZlIGEgYm9vbGVhbiBpc1dyaXRhYmxlIGZpZWxkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluc3RydWN0aW9uLmRhdGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgaW5zdHJ1Y3Rpb24uZGF0YSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0luc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBkYXRhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB2ZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gZm9ybWF0XG4gICAqIEBwYXJhbSBpbnN0cnVjdGlvbiAtIFRoZSB2ZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gdG8gdmFsaWRhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVWZXJzaW9uZWRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIGluc3RydWN0aW9uLnByb2dyYW1JZEluZGV4ICE9PSAnbnVtYmVyJyB8fCBpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1ZlcnNpb25lZCBpbnN0cnVjdGlvbiBtdXN0IGhhdmUgYSB2YWxpZCBwcm9ncmFtSWRJbmRleCBudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAoIWluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzIHx8ICFBcnJheS5pc0FycmF5KGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBhY2NvdW50S2V5SW5kZXhlcyBhcnJheScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggYWNjb3VudCBrZXkgaW5kZXhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzKSB7XG4gICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRWFjaCBhY2NvdW50S2V5SW5kZXggbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdHJ1Y3Rpb24uZGF0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBpbnN0cnVjdGlvbi5kYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBkYXRhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgYXNzZXJ0KHRoaXMuX2N1c3RvbUluc3RydWN0aW9ucy5sZW5ndGggPiAwLCAnQXQgbGVhc3Qgb25lIGN1c3RvbSBpbnN0cnVjdGlvbiBtdXN0IGJlIHNwZWNpZmllZCcpO1xuXG4gICAgLy8gU2V0IHRoZSBpbnN0cnVjdGlvbnMgZGF0YSB0byBvdXIgY3VzdG9tIGluc3RydWN0aW9uc1xuICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBbLi4udGhpcy5fY3VzdG9tSW5zdHJ1Y3Rpb25zXTtcblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cbn1cbiJdfQ==
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQXVIO0FBQ3ZILDZDQUF3RztBQUN4RywrQ0FBNEM7QUFDNUMsNkRBQTBEO0FBQzFELDJDQUFzRDtBQUV0RCxtQ0FBaUQ7QUFDakQsb0RBQTRCO0FBQzVCLGdEQUEwQjtBQUUxQjs7O0dBR0c7QUFDSCxNQUFhLHdCQUF5QixTQUFRLHVDQUFrQjtJQUc5RCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUhiLHdCQUFtQixHQUF1RCxFQUFFLENBQUM7SUFJckYsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssbUNBQXVCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbkUsTUFBTSxpQkFBaUIsR0FBRyxXQUFnQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsQ0FBQztpQkFBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssbUNBQXVCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDbkYsTUFBTSwwQkFBMEIsR0FBRyxXQUF5QyxDQUFDO2dCQUM3RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0QsQ0FBQztRQUNI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LEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLG1EQUFtRCxDQUFDLENBQUM7UUFFakcsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFdkQsT0FBTyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQXJiRCw0REFxYkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFNvbEluc3RydWN0aW9uLCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgTWVzc2FnZVYwLCBQdWJsaWNLZXksIFN5c3RlbVByb2dyYW0sIFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfUFVCS0VZIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEN1c3RvbUluc3RydWN0aW9uLCBWZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbiwgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBpc1NvbExlZ2FjeUluc3RydWN0aW9uIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuXG4vKipcbiAqIFRyYW5zYWN0aW9uIGJ1aWxkZXIgZm9yIGN1c3RvbSBTb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICogQWxsb3dzIGJ1aWxkaW5nIHRyYW5zYWN0aW9ucyB3aXRoIGFueSBzZXQgb2YgcmF3IFNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9jdXN0b21JbnN0cnVjdGlvbnM6IChDdXN0b21JbnN0cnVjdGlvbiB8IFZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uKVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJ1aWxkZXIgZnJvbSBhbiBleGlzdGluZyB0cmFuc2FjdGlvblxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBDdXN0b21JbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5hZGRDdXN0b21JbnN0cnVjdGlvbihjdXN0b21JbnN0cnVjdGlvbi5wYXJhbXMpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbikge1xuICAgICAgICBjb25zdCB2ZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLmFkZEN1c3RvbUluc3RydWN0aW9uKHZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uLnBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1c3RvbSBpbnN0cnVjdGlvbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIGN1c3RvbSBpbnN0cnVjdGlvbiB0byBhZGRcbiAgICogQHJldHVybnMgVGhpcyBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBhZGRDdXN0b21JbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogU29sSW5zdHJ1Y3Rpb24gfCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG5cbiAgICBpZiAoaXNTb2xMZWdhY3lJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpIHtcbiAgICAgIGNvbnN0IGN1c3RvbUluc3RydWN0aW9uOiBDdXN0b21JbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gICAgICAgIHBhcmFtczogaW5zdHJ1Y3Rpb24sXG4gICAgICB9O1xuICAgICAgdGhpcy5fY3VzdG9tSW5zdHJ1Y3Rpb25zLnB1c2goY3VzdG9tSW5zdHJ1Y3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRDdXN0b21JbnN0cnVjdGlvbjogVmVyc2lvbmVkQ3VzdG9tSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uLFxuICAgICAgICBwYXJhbXM6IGluc3RydWN0aW9uLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2N1c3RvbUluc3RydWN0aW9ucy5wdXNoKHZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbXVsdGlwbGUgY3VzdG9tIGluc3RydWN0aW9ucyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGluc3RydWN0aW9ucyAtIEFycmF5IG9mIGN1c3RvbSBpbnN0cnVjdGlvbnMgdG8gYWRkXG4gICAqIEByZXR1cm5zIFRoaXMgYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogKFNvbEluc3RydWN0aW9uIHwgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pW10pOiB0aGlzIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgIHRoaXMuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0cmFuc2FjdGlvbiBmcm9tIGRlY29uc3RydWN0ZWQgVmVyc2lvbmVkVHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcGFyYW0gZGF0YSAtIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSBjb250YWluaW5nIGluc3RydWN0aW9ucywgQUxUcywgYW5kIGFjY291bnQga2V5c1xuICAgKiBAcmV0dXJucyBUaGlzIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIGZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoZGF0YTogVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKTogdGhpcyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zKSB8fCBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndmVyc2lvbmVkSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuYWRkcmVzc0xvb2t1cFRhYmxlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignYWRkcmVzc0xvb2t1cFRhYmxlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnN0YXRpY0FjY291bnRLZXlzKSB8fCBkYXRhLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdzdGF0aWNBY2NvdW50S2V5cyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS5tZXNzYWdlSGVhZGVyIHx8IHR5cGVvZiBkYXRhLm1lc3NhZ2VIZWFkZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ21lc3NhZ2VIZWFkZXIgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyA8IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdtZXNzYWdlSGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMgIT09ICdudW1iZXInIHx8XG4gICAgICAgIGRhdGEubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzIDwgMFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ21lc3NhZ2VIZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgZGF0YS5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyA8IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdtZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcHJvY2Vzc2VkRGF0YSA9IGRhdGE7XG4gICAgICBpZiAodGhpcy5fbm9uY2VJbmZvICYmIHRoaXMuX25vbmNlSW5mby5wYXJhbXMpIHtcbiAgICAgICAgcHJvY2Vzc2VkRGF0YSA9IHRoaXMuaW5qZWN0Tm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24oZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKHByb2Nlc3NlZERhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgaWYgKCF0aGlzLl90cmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShwcm9jZXNzZWREYXRhKTtcblxuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgIGlmICghdGhpcy5fc2VuZGVyICYmIHByb2Nlc3NlZERhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9zZW5kZXIgPSBwcm9jZXNzZWREYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQnVpbGRUcmFuc2FjdGlvbkVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGRhdGE6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IG5vbmNlIGFkdmFuY2UgaW5zdHJ1Y3Rpb24gaW50byB2ZXJzaW9uZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgZHVyYWJsZSBub25jZSBzdXBwb3J0LlxuICAgKiBSZWJ1aWxkcyB0aGUgc3RhdGljIGFjY291bnQga2V5cyBzZWN0aW9uIGJ5IHNlY3Rpb24gKHdyaXRhYmxlIHNpZ25lcnMsIHJlYWQtb25seSBzaWduZXJzLFxuICAgKiB3cml0YWJsZSBub24tc2lnbmVycywgcmVhZC1vbmx5IG5vbi1zaWduZXJzKSwgcmVtYXBzIGV2ZXJ5IGluc3RydWN0aW9uIGluZGV4IC0gc3RhdGljIGFuZFxuICAgKiBsb29rdXAtdGFibGUgLSB0byB0aGUgbmV3IGtleSBvcmRlciwgYW5kIHZhbGlkYXRlcyB0aGF0IHRoZSByZXN1bHQgY29tcGlsZXMgdG8gYSBNZXNzYWdlVjAuXG4gICAqIEBwYXJhbSBkYXRhIC0gT3JpZ2luYWwgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICogQHJldHVybnMgTW9kaWZpZWQgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGRhdGEgd2l0aCB0aGUgbm9uY2UgYWR2YW5jZSBpbnN0cnVjdGlvbiBmaXJzdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3ROb25jZUFkdmFuY2VJbnN0cnVjdGlvbihkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEpOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEge1xuICAgIGNvbnN0IHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9ID0gdGhpcy5fbm9uY2VJbmZvIS5wYXJhbXM7XG4gICAgY29uc3QgU1lTVEVNX1BST0dSQU0gPSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMgPSBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWS50b0Jhc2U1OCgpO1xuXG4gICAgY29uc3QgeyBudW1SZXF1aXJlZFNpZ25hdHVyZXMsIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyB9ID0gZGF0YS5tZXNzYWdlSGVhZGVyO1xuICAgIGNvbnN0IG9sZFN0YXRpY0xlbiA9IGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICAgIGlmIChcbiAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMgPiBudW1SZXF1aXJlZFNpZ25hdHVyZXMgfHxcbiAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyArIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyA+IG9sZFN0YXRpY0xlblxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgbWVzc2FnZSBoZWFkZXI6IHJlYWRvbmx5IGNvdW50cyAoJHtudW1SZWFkb25seVNpZ25lZEFjY291bnRzfSwgJHtudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHN9KSBgICtcbiAgICAgICAgICBgYXJlIGluY29uc2lzdGVudCB3aXRoICR7bnVtUmVxdWlyZWRTaWduYXR1cmVzfSByZXF1aXJlZCBzaWduYXR1cmVzIGFuZCAke29sZFN0YXRpY0xlbn0gc3RhdGljIGFjY291bnQga2V5c2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgdGhlIG9yaWdpbmFsIHN0YXRpYyBrZXlzIGludG8gdGhlIGZvdXIgTWVzc2FnZVYwIGhlYWRlciBzZWN0aW9ucy5cbiAgICBjb25zdCB3cml0YWJsZVNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKDAsIG51bVJlcXVpcmVkU2lnbmF0dXJlcyAtIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMpO1xuICAgIGNvbnN0IHJlYWRvbmx5U2lnbmVycyA9IGRhdGEuc3RhdGljQWNjb3VudEtleXMuc2xpY2UoXG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMgLSBudW1SZWFkb25seVNpZ25lZEFjY291bnRzLFxuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzXG4gICAgKTtcbiAgICBjb25zdCB3cml0YWJsZU5vblNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKFxuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzLFxuICAgICAgb2xkU3RhdGljTGVuIC0gbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzXG4gICAgKTtcbiAgICBjb25zdCByZWFkb25seU5vblNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKG9sZFN0YXRpY0xlbiAtIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyk7XG5cbiAgICAvLyBUaGUgbm9uY2UgYXV0aG9yaXR5IG11c3QgYmUgYSBzaWduZXIgZm9yIEFkdmFuY2VOb25jZUFjY291bnQuIElmIGl0IGlzIGFscmVhZHkgcHJlc2VudFxuICAgIC8vIGFzIGEgbm9uLXNpZ25lciwgbW92ZSBpdCBpbnRvIHRoZSBzaWduZXJzLCBrZWVwaW5nIGl0cyB3cml0YWJpbGl0eSAoYSB3cml0YWJsZVxuICAgIC8vIG5vbi1zaWduZXIgYmVjb21lcyBhIHdyaXRhYmxlIHNpZ25lciwgYSByZWFkLW9ubHkgb25lIGEgcmVhZC1vbmx5IHNpZ25lcikuXG4gICAgY29uc3QgYXV0aG9yaXR5SXNTaWduZXIgPVxuICAgICAgd3JpdGFibGVTaWduZXJzLmluY2x1ZGVzKGF1dGhXYWxsZXRBZGRyZXNzKSB8fCByZWFkb25seVNpZ25lcnMuaW5jbHVkZXMoYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgIGlmICghYXV0aG9yaXR5SXNTaWduZXIpIHtcbiAgICAgIGNvbnN0IGFzUmVhZG9ubHlOb25TaWduZXIgPSByZWFkb25seU5vblNpZ25lcnMuaW5kZXhPZihhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgICBjb25zdCBhc1dyaXRhYmxlTm9uU2lnbmVyID0gd3JpdGFibGVOb25TaWduZXJzLmluZGV4T2YoYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgICAgaWYgKGFzUmVhZG9ubHlOb25TaWduZXIgPj0gMCkge1xuICAgICAgICByZWFkb25seU5vblNpZ25lcnMuc3BsaWNlKGFzUmVhZG9ubHlOb25TaWduZXIsIDEpO1xuICAgICAgICByZWFkb25seVNpZ25lcnMucHVzaChhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgICB9IGVsc2UgaWYgKGFzV3JpdGFibGVOb25TaWduZXIgPj0gMCkge1xuICAgICAgICB3cml0YWJsZU5vblNpZ25lcnMuc3BsaWNlKGFzV3JpdGFibGVOb25TaWduZXIsIDEpO1xuICAgICAgICB3cml0YWJsZVNpZ25lcnMucHVzaChhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBIGJyYW5kLW5ldyBhdXRob3JpdHkgaXMgYSByZWFkLW9ubHkgc2lnbmVyIGZvciBBZHZhbmNlTm9uY2VBY2NvdW50LlxuICAgICAgICByZWFkb25seVNpZ25lcnMucHVzaChhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIG5vbmNlIGFjY291bnQgbXVzdCBiZSB3cml0YWJsZSBmb3IgQWR2YW5jZU5vbmNlQWNjb3VudC4gSWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LFxuICAgIC8vIGtlZXAgaXQgaW4gcGxhY2Ugd2hlbiB3cml0YWJsZSwgb3IgbW92ZSBpdCBpbnRvIHRoZSB3cml0YWJsZSBzZWN0aW9uIHdoZW4gcmVhZC1vbmx5LlxuICAgIGNvbnN0IG5vbmNlQXNSZWFkb25seU5vblNpZ25lciA9IHJlYWRvbmx5Tm9uU2lnbmVycy5pbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gICAgY29uc3Qgbm9uY2VBc1JlYWRvbmx5U2lnbmVyID0gcmVhZG9ubHlTaWduZXJzLmluZGV4T2Yod2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgICBpZiAobm9uY2VBc1JlYWRvbmx5Tm9uU2lnbmVyID49IDApIHtcbiAgICAgIHJlYWRvbmx5Tm9uU2lnbmVycy5zcGxpY2Uobm9uY2VBc1JlYWRvbmx5Tm9uU2lnbmVyLCAxKTtcbiAgICAgIHdyaXRhYmxlTm9uU2lnbmVycy5wdXNoKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gICAgfSBlbHNlIGlmIChub25jZUFzUmVhZG9ubHlTaWduZXIgPj0gMCkge1xuICAgICAgcmVhZG9ubHlTaWduZXJzLnNwbGljZShub25jZUFzUmVhZG9ubHlTaWduZXIsIDEpO1xuICAgICAgd3JpdGFibGVTaWduZXJzLnB1c2god2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgICB9IGVsc2UgaWYgKCF3cml0YWJsZVNpZ25lcnMuaW5jbHVkZXMod2FsbGV0Tm9uY2VBZGRyZXNzKSAmJiAhd3JpdGFibGVOb25TaWduZXJzLmluY2x1ZGVzKHdhbGxldE5vbmNlQWRkcmVzcykpIHtcbiAgICAgIHdyaXRhYmxlTm9uU2lnbmVycy5wdXNoKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHN5c3RlbSBwcm9ncmFtIGFuZCB0aGUgcmVjZW50IGJsb2NraGFzaGVzIHN5c3ZhciBhcmUgcmVhZC1vbmx5IG5vbi1zaWduZXJzIGZvclxuICAgIC8vIEFkdmFuY2VOb25jZUFjY291bnQuXG4gICAgY29uc3QgaXNQcmVzZW50ID0gKGtleTogc3RyaW5nKSA9PlxuICAgICAgd3JpdGFibGVTaWduZXJzLmluY2x1ZGVzKGtleSkgfHxcbiAgICAgIHJlYWRvbmx5U2lnbmVycy5pbmNsdWRlcyhrZXkpIHx8XG4gICAgICB3cml0YWJsZU5vblNpZ25lcnMuaW5jbHVkZXMoa2V5KSB8fFxuICAgICAgcmVhZG9ubHlOb25TaWduZXJzLmluY2x1ZGVzKGtleSk7XG4gICAgaWYgKCFpc1ByZXNlbnQoU1lTVEVNX1BST0dSQU0pKSB7XG4gICAgICByZWFkb25seU5vblNpZ25lcnMucHVzaChTWVNURU1fUFJPR1JBTSk7XG4gICAgfVxuICAgIGlmICghaXNQcmVzZW50KFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMpKSB7XG4gICAgICByZWFkb25seU5vblNpZ25lcnMucHVzaChTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGF0aWNBY2NvdW50S2V5cyA9IFsuLi53cml0YWJsZVNpZ25lcnMsIC4uLnJlYWRvbmx5U2lnbmVycywgLi4ud3JpdGFibGVOb25TaWduZXJzLCAuLi5yZWFkb25seU5vblNpZ25lcnNdO1xuXG4gICAgLy8gQnVpbGQgb25lIGZ1bGwgb2xkLWluZGV4IHRvIG5ldy1pbmRleCBtYXAgY292ZXJpbmcgc3RhdGljIGFuZCBsb29rdXAtdGFibGUgaW5kZXhlcy5cbiAgICAvLyBTdGF0aWMgaW5kZXhlcyBmb2xsb3cgdGhlaXIga2V5IHRvIGl0cyBuZXcgcG9zaXRpb247IGxvb2t1cC10YWJsZSBpbmRleGVzLCB3aGljaCBhcmVcbiAgICAvLyBhcHBlbmRlZCBhZnRlciB0aGUgc3RhdGljIGtleXMsIHNoaWZ0IGJ5IHRoZSBudW1iZXIgb2YgaW5zZXJ0ZWQgc3RhdGljIGtleXMuXG4gICAgY29uc3QgaW5kZXhNYXAgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgIGRhdGEuc3RhdGljQWNjb3VudEtleXMuZm9yRWFjaCgoa2V5LCBvbGRJZHgpID0+IGluZGV4TWFwLnNldChvbGRJZHgsIG5ld1N0YXRpY0FjY291bnRLZXlzLmluZGV4T2Yoa2V5KSkpO1xuICAgIGNvbnN0IHNoaWZ0ID0gbmV3U3RhdGljQWNjb3VudEtleXMubGVuZ3RoIC0gb2xkU3RhdGljTGVuO1xuICAgIGNvbnN0IGxvb2t1cEtleUNvdW50ID0gZGF0YS5hZGRyZXNzTG9va3VwVGFibGVzLnJlZHVjZShcbiAgICAgIChzdW0sIGFsdCkgPT4gc3VtICsgYWx0LndyaXRhYmxlSW5kZXhlcy5sZW5ndGggKyBhbHQucmVhZG9ubHlJbmRleGVzLmxlbmd0aCxcbiAgICAgIDBcbiAgICApO1xuICAgIGZvciAobGV0IGkgPSBvbGRTdGF0aWNMZW47IGkgPCBvbGRTdGF0aWNMZW4gKyBsb29rdXBLZXlDb3VudDsgaSsrKSB7XG4gICAgICBpbmRleE1hcC5zZXQoaSwgaSArIHNoaWZ0KTtcbiAgICB9XG4gICAgY29uc3QgcmVtYXBJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IG1hcHBlZCA9IGluZGV4TWFwLmdldChpbmRleCk7XG4gICAgICBpZiAobWFwcGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBhY2NvdW50IGtleSBpbmRleCAke2luZGV4fSBpbiB2ZXJzaW9uZWQgaW5zdHJ1Y3Rpb25gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uOiBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgIHByb2dyYW1JZEluZGV4OiBuZXdTdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1RFTV9QUk9HUkFNKSxcbiAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbXG4gICAgICAgIG5ld1N0YXRpY0FjY291bnRLZXlzLmluZGV4T2Yod2FsbGV0Tm9uY2VBZGRyZXNzKSxcbiAgICAgICAgbmV3U3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTKSxcbiAgICAgICAgbmV3U3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihhdXRoV2FsbGV0QWRkcmVzcyksXG4gICAgICBdLFxuICAgICAgZGF0YTogJzZ2eDhQJywgLy8gU3lzdGVtUHJvZ3JhbSBBZHZhbmNlTm9uY2VBY2NvdW50ICgweDA0MDAwMDAwKSBpbiBiYXNlNThcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgPSB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgIG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLFxuICAgICAgICAuLi5kYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5tYXAoKGluc3QpID0+ICh7XG4gICAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IHJlbWFwSW5kZXgoaW5zdC5wcm9ncmFtSWRJbmRleCksXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGluc3QuYWNjb3VudEtleUluZGV4ZXMubWFwKHJlbWFwSW5kZXgpLFxuICAgICAgICAgIGRhdGE6IGluc3QuZGF0YSxcbiAgICAgICAgfSkpLFxuICAgICAgXSxcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBuZXdTdGF0aWNBY2NvdW50S2V5cyxcbiAgICAgIG1lc3NhZ2VIZWFkZXI6IHtcbiAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiB3cml0YWJsZVNpZ25lcnMubGVuZ3RoICsgcmVhZG9ubHlTaWduZXJzLmxlbmd0aCxcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogcmVhZG9ubHlTaWduZXJzLmxlbmd0aCxcbiAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiByZWFkb25seU5vblNpZ25lcnMubGVuZ3RoLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGhpcy52YWxpZGF0ZUluamVjdGVkTWVzc2FnZShwcm9jZXNzZWQpO1xuICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIHJlc3VsdCBvZiBpbmplY3ROb25jZUFkdmFuY2VJbnN0cnVjdGlvbiBieSBjb21waWxpbmcgaXQ6IHRoZSBNZXNzYWdlVjAgYnVpbHRcbiAgICogZnJvbSB0aGUgbmV3IGtleXMsIGhlYWRlciwgbG9va3VwcyBhbmQgaW5zdHJ1Y3Rpb25zIG11c3QgZGVzZXJpYWxpemUgYW5kIGNvbnRhaW4gbm9cbiAgICogZHVwbGljYXRlIGtleXMuXG4gICAqIEBwYXJhbSBkYXRhIC0gUHJvY2Vzc2VkIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEB0aHJvd3Mge0J1aWxkVHJhbnNhY3Rpb25FcnJvcn0gaWYgdGhlIHJlYnVpbHQgbWVzc2FnZSBkb2VzIG5vdCBjb21waWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlSW5qZWN0ZWRNZXNzYWdlKGRhdGE6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSk6IHZvaWQge1xuICAgIGlmIChuZXcgU2V0KGRhdGEuc3RhdGljQWNjb3VudEtleXMpLnNpemUgIT09IGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbmplY3RlZCBub25jZSBhZHZhbmNlIGluc3RydWN0aW9uIHByb2R1Y2VkIGR1cGxpY2F0ZSBhY2NvdW50IGtleXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2VWMCh7XG4gICAgICBoZWFkZXI6IGRhdGEubWVzc2FnZUhlYWRlcixcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBkYXRhLnN0YXRpY0FjY291bnRLZXlzLm1hcCgoa2V5KSA9PiBuZXcgUHVibGljS2V5KGtleSkpLFxuICAgICAgcmVjZW50QmxvY2toYXNoOiBkYXRhLnJlY2VudEJsb2NraGFzaCA/PyB0aGlzLl9yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBjb21waWxlZEluc3RydWN0aW9uczogZGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4gKHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IGluc3RydWN0aW9uLnByb2dyYW1JZEluZGV4LFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMsXG4gICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGJhc2U1OC5kZWNvZGUoaW5zdHJ1Y3Rpb24uZGF0YSkpLFxuICAgICAgfSkpLFxuICAgICAgYWRkcmVzc1RhYmxlTG9va3VwczogZGF0YS5hZGRyZXNzTG9va3VwVGFibGVzLm1hcCgoYWx0KSA9PiAoe1xuICAgICAgICBhY2NvdW50S2V5OiBuZXcgUHVibGljS2V5KGFsdC5hY2NvdW50S2V5KSxcbiAgICAgICAgd3JpdGFibGVJbmRleGVzOiBhbHQud3JpdGFibGVJbmRleGVzLFxuICAgICAgICByZWFkb25seUluZGV4ZXM6IGFsdC5yZWFkb25seUluZGV4ZXMsXG4gICAgICB9KSksXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgTWVzc2FnZVYwLmRlc2VyaWFsaXplKG1lc3NhZ2Uuc2VyaWFsaXplKCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW5qZWN0ZWQgbm9uY2UgYWR2YW5jZSBpbnN0cnVjdGlvbiBwcm9kdWNlZCBhbiBpbnZhbGlkIG1lc3NhZ2U6ICR7XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvclxuICAgICAgICB9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGN1c3RvbSBpbnN0cnVjdGlvbnMgYW5kIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIFRoaXMgYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgY2xlYXJJbnN0cnVjdGlvbnMoKTogdGhpcyB7XG4gICAgdGhpcy5fY3VzdG9tSW5zdHJ1Y3Rpb25zID0gW107XG4gICAgaWYgKHRoaXMuX3RyYW5zYWN0aW9uKSB7XG4gICAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY3VzdG9tIGluc3RydWN0aW9uc1xuICAgKi9cbiAgZ2V0SW5zdHJ1Y3Rpb25zKCk6IChDdXN0b21JbnN0cnVjdGlvbiB8IFZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uKVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX2N1c3RvbUluc3RydWN0aW9uc107XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY3VzdG9tIGluc3RydWN0aW9uIGZvcm1hdFxuICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gdmFsaWRhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogU29sSW5zdHJ1Y3Rpb24gfCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbik6IHZvaWQge1xuICAgIGlmICghaW5zdHJ1Y3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0luc3RydWN0aW9uIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGlmIChpc1NvbExlZ2FjeUluc3RydWN0aW9uKGluc3RydWN0aW9uKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZVNvbEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZVZlcnNpb25lZEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdHJhZGl0aW9uYWwgU29sSW5zdHJ1Y3Rpb24gZm9ybWF0XG4gICAqIEBwYXJhbSBpbnN0cnVjdGlvbiAtIFRoZSB0cmFkaXRpb25hbCBpbnN0cnVjdGlvbiB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNvbEluc3RydWN0aW9uKGluc3RydWN0aW9uOiBTb2xJbnN0cnVjdGlvbik6IHZvaWQge1xuICAgIGlmICghaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkIHx8IHR5cGVvZiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnN0cnVjdGlvbiBtdXN0IGhhdmUgYSB2YWxpZCBwcm9ncmFtSWQgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBwcm9ncmFtSWQgaXMgYSB2YWxpZCBTb2xhbmEgcHVibGljIGtleVxuICAgIHRyeSB7XG4gICAgICBuZXcgUHVibGljS2V5KGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcHJvZ3JhbUlkIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIGlmICghaW5zdHJ1Y3Rpb24ua2V5cyB8fCAhQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbi5rZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGtleXMgYXJyYXknKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIGtleVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGluc3RydWN0aW9uLmtleXMpIHtcbiAgICAgIGlmICgha2V5LnB1YmtleSB8fCB0eXBlb2Yga2V5LnB1YmtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRWFjaCBrZXkgbXVzdCBoYXZlIGEgdmFsaWQgcHVia2V5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgUHVibGljS2V5KGtleS5wdWJrZXkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBwdWJrZXkgZm9ybWF0IGluIGtleXMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBrZXkuaXNTaWduZXIgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdFYWNoIGtleSBtdXN0IGhhdmUgYSBib29sZWFuIGlzU2lnbmVyIGZpZWxkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Yga2V5LmlzV3JpdGFibGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdFYWNoIGtleSBtdXN0IGhhdmUgYSBib29sZWFuIGlzV3JpdGFibGUgZmllbGQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdHJ1Y3Rpb24uZGF0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBpbnN0cnVjdGlvbi5kYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGRhdGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHZlcnNpb25lZCBpbnN0cnVjdGlvbiBmb3JtYXRcbiAgICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIHZlcnNpb25lZCBpbnN0cnVjdGlvbiB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZlcnNpb25lZEluc3RydWN0aW9uKGluc3RydWN0aW9uOiBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbik6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXggIT09ICdudW1iZXInIHx8IGluc3RydWN0aW9uLnByb2dyYW1JZEluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIHByb2dyYW1JZEluZGV4IG51bWJlcicpO1xuICAgIH1cblxuICAgIGlmICghaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMgfHwgIUFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdWZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGFjY291bnRLZXlJbmRleGVzIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZWFjaCBhY2NvdW50IGtleSBpbmRleFxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5kZXggIT09ICdudW1iZXInIHx8IGluZGV4IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdFYWNoIGFjY291bnRLZXlJbmRleCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbnN0cnVjdGlvbi5kYXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGluc3RydWN0aW9uLmRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdWZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGRhdGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBhc3NlcnQodGhpcy5fY3VzdG9tSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAsICdBdCBsZWFzdCBvbmUgY3VzdG9tIGluc3RydWN0aW9uIG11c3QgYmUgc3BlY2lmaWVkJyk7XG5cbiAgICAvLyBTZXQgdGhlIGluc3RydWN0aW9ucyBkYXRhIHRvIG91ciBjdXN0b20gaW5zdHJ1Y3Rpb25zXG4gICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IFsuLi50aGlzLl9jdXN0b21JbnN0cnVjdGlvbnNdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"instructionParamsFactory.d.ts","sourceRoot":"","sources":["../../../../src/lib/instructionParamsFactory.ts"],"names":[],"mappings":"AAaA,OAAO,EAYL,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIrE,OAAO,EAKL,gBAAgB,EAChB,iBAAiB,EAiBlB,MAAM,SAAS,CAAC;AAKjB;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,sBAAsB,EAAE,EACtC,QAAQ,CAAC,EAAE,MAAM,EACjB,mBAAmB,CAAC,EAAE,iBAAiB,EAAE,EACzC,yBAAyB,CAAC,EAAE,OAAO,GAClC,iBAAiB,EAAE,CA6BrB;AA2zCD,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,mBAAmB,CAAC,EAAE,iBAAiB,EAAE,EACzC,yBAAyB,CAAC,EAAE,OAAO,GAClC,MAAM,CAgCR;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,iBAAiB,EAAE,GACxC,gBAAgB,EAAE,GAAG,SAAS,CAehC"}
1
+ {"version":3,"file":"instructionParamsFactory.d.ts","sourceRoot":"","sources":["../../../../src/lib/instructionParamsFactory.ts"],"names":[],"mappings":"AAaA,OAAO,EAYL,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIrE,OAAO,EAKL,gBAAgB,EAChB,iBAAiB,EAiBlB,MAAM,SAAS,CAAC;AAKjB;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,sBAAsB,EAAE,EACtC,QAAQ,CAAC,EAAE,MAAM,EACjB,mBAAmB,CAAC,EAAE,iBAAiB,EAAE,EACzC,yBAAyB,CAAC,EAAE,OAAO,GAClC,iBAAiB,EAAE,CA6BrB;AAu4CD,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,mBAAmB,CAAC,EAAE,iBAAiB,EAAE,EACzC,yBAAyB,CAAC,EAAE,OAAO,GAClC,MAAM,CAgCR;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,iBAAiB,EAAE,GACxC,gBAAgB,EAAE,GAAG,SAAS,CAehC"}