@bitgo-beta/sdk-coin-sol 2.4.3-beta.130 → 2.4.3-beta.1301
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/bigint-buffer-guard.d.ts +1 -0
- package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/src/bigint-buffer-guard.js +29 -0
- package/dist/src/config/token2022StaticConfig.d.ts +3 -0
- package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/src/config/token2022StaticConfig.js +50 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/lib/ataInitializationBuilder.d.ts.map +1 -1
- package/dist/src/lib/ataInitializationBuilder.js +60 -22
- package/dist/src/lib/closeAtaBuilder.d.ts +19 -0
- package/dist/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/src/lib/closeAtaBuilder.js +69 -0
- package/dist/src/lib/constants.d.ts +63 -8
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +73 -10
- package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/customInstructionBuilder.js +289 -0
- package/dist/src/lib/iface.d.ts +106 -5
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +13 -10
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +48 -28
- package/dist/src/lib/instructionParamsFactory.d.ts +1 -1
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +521 -85
- package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/src/lib/keyPair.js +5 -5
- package/dist/src/lib/messages/index.d.ts +2 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +18 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/messages/messageBuilderFactory.js +19 -0
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +363 -95
- package/dist/src/lib/stakingActivateBuilder.d.ts +18 -0
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +34 -8
- package/dist/src/lib/stakingAuthorizeBuilder.js +7 -7
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +27 -1
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +82 -15
- package/dist/src/lib/stakingDelegateBuilder.js +9 -9
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +5 -5
- package/dist/src/lib/stakingWithdrawBuilder.js +6 -6
- package/dist/src/lib/token2022Config.d.ts +44 -0
- package/dist/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/src/lib/token2022Config.js +27 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +4 -1
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +87 -23
- package/dist/src/lib/transaction.d.ts +42 -6
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +185 -67
- package/dist/src/lib/transactionBuilder.d.ts +20 -3
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +107 -20
- package/dist/src/lib/transactionBuilderFactory.d.ts +19 -9
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +29 -10
- package/dist/src/lib/transferBuilder.js +4 -4
- package/dist/src/lib/transferBuilderV2.d.ts +14 -1
- package/dist/src/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/src/lib/transferBuilderV2.js +114 -11
- package/dist/src/lib/utils.d.ts +37 -6
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +194 -58
- package/dist/src/lib/walletInitializationBuilder.js +6 -6
- package/dist/src/sol.d.ts +81 -24
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +655 -91
- package/dist/src/solToken.d.ts +2 -1
- package/dist/src/solToken.d.ts.map +1 -1
- package/dist/src/solToken.js +6 -3
- package/dist/src/tsol.js +1 -1
- package/dist/test/fixtures/sol.d.ts +1152 -0
- package/dist/test/fixtures/sol.d.ts.map +1 -0
- package/dist/test/fixtures/sol.js +1433 -0
- package/dist/test/resources/sol.d.ts +238 -0
- package/dist/test/resources/sol.d.ts.map +1 -0
- package/dist/test/resources/sol.js +320 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.js +412 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +177 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/test/unit/sol.d.ts +2 -0
- package/dist/test/unit/sol.d.ts.map +1 -0
- package/dist/test/unit/sol.js +3108 -0
- package/dist/test/unit/solInstructionFactory.d.ts +2 -0
- package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/test/unit/solInstructionFactory.js +454 -0
- package/dist/test/unit/solToken.d.ts +2 -0
- package/dist/test/unit/solToken.d.ts.map +1 -0
- package/dist/test/unit/solToken.js +31 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +983 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +459 -0
- package/dist/test/unit/versionedTransaction.d.ts +2 -0
- package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/test/unit/versionedTransaction.js +207 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -11
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -353
|
@@ -4,16 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Transaction = void 0;
|
|
7
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
7
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
9
8
|
const web3_js_1 = require("@solana/web3.js");
|
|
9
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
10
10
|
const bs58_1 = __importDefault(require("bs58"));
|
|
11
|
-
const utils_1 = require("./utils");
|
|
12
|
-
const instructionParamsFactory_1 = require("./instructionParamsFactory");
|
|
13
11
|
const constants_1 = require("./constants");
|
|
12
|
+
const instructionParamsFactory_1 = require("./instructionParamsFactory");
|
|
13
|
+
const utils_1 = require("./utils");
|
|
14
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
14
15
|
class Transaction extends sdk_core_1.BaseTransaction {
|
|
15
16
|
constructor(_coinConfig) {
|
|
16
17
|
super(_coinConfig);
|
|
18
|
+
this._instructionsData = [];
|
|
19
|
+
this._useTokenAddressTokenName = false;
|
|
17
20
|
}
|
|
18
21
|
get solTransaction() {
|
|
19
22
|
return this._solTransaction;
|
|
@@ -25,21 +28,29 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
25
28
|
return this._solTransaction.compileMessage().header.numRequiredSignatures;
|
|
26
29
|
}
|
|
27
30
|
get numberOfATACreationInstructions() {
|
|
28
|
-
return this._solTransaction.instructions.filter((instruction) => utils_1.getInstructionType(instruction) === constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount).length;
|
|
31
|
+
return this._solTransaction.instructions.filter((instruction) => (0, utils_1.getInstructionType)(instruction) === constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount).length;
|
|
29
32
|
}
|
|
30
33
|
/** @inheritDoc */
|
|
31
34
|
get signablePayload() {
|
|
35
|
+
if (this._versionedTransaction) {
|
|
36
|
+
return Buffer.from(this._versionedTransaction.message.serialize());
|
|
37
|
+
}
|
|
32
38
|
return this._solTransaction.serializeMessage();
|
|
33
39
|
}
|
|
34
40
|
/** @inheritDoc **/
|
|
35
41
|
get id() {
|
|
36
42
|
// Solana transaction ID === first signature: https://docs.solana.com/terminology#transaction-id
|
|
43
|
+
if (this._versionedTransaction) {
|
|
44
|
+
const sig = this._versionedTransaction.signatures?.[0];
|
|
45
|
+
// Check if signature exists and is not a placeholder signature (all zeros)
|
|
46
|
+
if (sig && sig.some((byte) => byte !== 0)) {
|
|
47
|
+
return bs58_1.default.encode(sig);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
37
50
|
if (this._solTransaction.signature) {
|
|
38
51
|
return bs58_1.default.encode(this._solTransaction.signature);
|
|
39
52
|
}
|
|
40
|
-
|
|
41
|
-
return constants_1.UNAVAILABLE_TEXT;
|
|
42
|
-
}
|
|
53
|
+
return constants_1.UNAVAILABLE_TEXT;
|
|
43
54
|
}
|
|
44
55
|
get lamportsPerSignature() {
|
|
45
56
|
return this._lamportsPerSignature;
|
|
@@ -56,9 +67,21 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
56
67
|
/** @inheritDoc */
|
|
57
68
|
get signature() {
|
|
58
69
|
const signatures = [];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
70
|
+
if (this._versionedTransaction) {
|
|
71
|
+
// Handle VersionedTransaction signatures
|
|
72
|
+
for (const sig of this._versionedTransaction.signatures) {
|
|
73
|
+
// Filters out placeholder signatures
|
|
74
|
+
if (sig && sig.some((b) => b !== 0)) {
|
|
75
|
+
signatures.push(bs58_1.default.encode(sig));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Handle legacy transaction signatures
|
|
81
|
+
for (const solSignature of this._solTransaction.signatures) {
|
|
82
|
+
if (solSignature.signature) {
|
|
83
|
+
signatures.push(bs58_1.default.encode(solSignature.signature));
|
|
84
|
+
}
|
|
62
85
|
}
|
|
63
86
|
}
|
|
64
87
|
return signatures;
|
|
@@ -71,6 +94,55 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
71
94
|
setTransactionType(transactionType) {
|
|
72
95
|
this._type = transactionType;
|
|
73
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Set the instructionData.
|
|
99
|
+
*
|
|
100
|
+
* @param {InstructionParams[]} instructionData The instruction data to be set.
|
|
101
|
+
*/
|
|
102
|
+
setInstructionsData(instructionData) {
|
|
103
|
+
this._instructionsData = instructionData;
|
|
104
|
+
}
|
|
105
|
+
get useTokenAddressTokenName() {
|
|
106
|
+
return this._useTokenAddressTokenName;
|
|
107
|
+
}
|
|
108
|
+
setUseTokenAddressTokenName(value) {
|
|
109
|
+
this._useTokenAddressTokenName = value;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if this transaction is a VersionedTransaction
|
|
113
|
+
* @returns {boolean} True if this is a VersionedTransaction
|
|
114
|
+
*/
|
|
115
|
+
isVersionedTransaction() {
|
|
116
|
+
return !!this._versionedTransaction || !!this._versionedTransactionData;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the original VersionedTransaction if this transaction was parsed from one
|
|
120
|
+
* @returns {VersionedTransaction | undefined} The VersionedTransaction or undefined
|
|
121
|
+
*/
|
|
122
|
+
get versionedTransaction() {
|
|
123
|
+
return this._versionedTransaction;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Set a built VersionedTransaction
|
|
127
|
+
* @param {VersionedTransaction} versionedTx The VersionedTransaction to set
|
|
128
|
+
*/
|
|
129
|
+
set versionedTransaction(versionedTx) {
|
|
130
|
+
this._versionedTransaction = versionedTx;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get the stored VersionedTransactionData
|
|
134
|
+
* @returns {VersionedTransactionData | undefined} The stored data or undefined
|
|
135
|
+
*/
|
|
136
|
+
getVersionedTransactionData() {
|
|
137
|
+
return this._versionedTransactionData;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Set the VersionedTransactionData for this transaction
|
|
141
|
+
* @param {VersionedTransactionData | undefined} data The versioned transaction data to store, or undefined to clear
|
|
142
|
+
*/
|
|
143
|
+
setVersionedTransactionData(data) {
|
|
144
|
+
this._versionedTransactionData = data;
|
|
145
|
+
}
|
|
74
146
|
/** @inheritdoc */
|
|
75
147
|
canSign() {
|
|
76
148
|
return true;
|
|
@@ -81,12 +153,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
81
153
|
* @param {KeyPair} keyPair Signer keys.
|
|
82
154
|
*/
|
|
83
155
|
async sign(keyPair) {
|
|
84
|
-
|
|
85
|
-
throw new sdk_core_1.SigningError('Nonce is required before signing');
|
|
86
|
-
}
|
|
87
|
-
if (!this._solTransaction || !this._solTransaction.feePayer) {
|
|
88
|
-
throw new sdk_core_1.SigningError('feePayer is required before signing');
|
|
89
|
-
}
|
|
156
|
+
// Convert to array and build signers list
|
|
90
157
|
const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
|
|
91
158
|
const signers = [];
|
|
92
159
|
for (const kp of keyPairs) {
|
|
@@ -96,30 +163,38 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
96
163
|
}
|
|
97
164
|
signers.push({ publicKey: new web3_js_1.PublicKey(keys.pub), secretKey: keys.prv });
|
|
98
165
|
}
|
|
99
|
-
|
|
100
|
-
this.
|
|
166
|
+
if (this._versionedTransaction) {
|
|
167
|
+
if (!this._versionedTransaction.message.recentBlockhash) {
|
|
168
|
+
throw new sdk_core_1.SigningError('Nonce is required before signing');
|
|
169
|
+
}
|
|
170
|
+
this._versionedTransaction.sign(signers);
|
|
171
|
+
return;
|
|
101
172
|
}
|
|
102
|
-
|
|
103
|
-
throw
|
|
173
|
+
if (!this._solTransaction || !this._solTransaction.recentBlockhash) {
|
|
174
|
+
throw new sdk_core_1.SigningError('Nonce is required before signing');
|
|
175
|
+
}
|
|
176
|
+
if (!this._solTransaction || !this._solTransaction.feePayer) {
|
|
177
|
+
throw new sdk_core_1.SigningError('feePayer is required before signing');
|
|
104
178
|
}
|
|
179
|
+
this._solTransaction.partialSign(...signers);
|
|
105
180
|
}
|
|
106
181
|
/** @inheritdoc */
|
|
107
182
|
toBroadcastFormat() {
|
|
183
|
+
if (this._versionedTransaction) {
|
|
184
|
+
// VersionedTransaction.serialize() doesn't need requireAllSignatures parameter
|
|
185
|
+
// It automatically handles whatever signatures are present
|
|
186
|
+
return Buffer.from(this._versionedTransaction.serialize()).toString('base64');
|
|
187
|
+
}
|
|
108
188
|
if (!this._solTransaction) {
|
|
109
189
|
throw new sdk_core_1.ParseTransactionError('Empty transaction');
|
|
110
190
|
}
|
|
111
191
|
// The signatures can have null signatures (which means they are required but yet unsigned)
|
|
112
192
|
// In order to be able to serializer the txs, we have to change the requireAllSignatures based
|
|
113
193
|
// on if the TX is fully signed or not
|
|
114
|
-
const requireAllSignatures = utils_1.requiresAllSignatures(this._solTransaction.signatures);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return this._solTransaction.serialize({ requireAllSignatures }).toString('base64');
|
|
119
|
-
}
|
|
120
|
-
catch (e) {
|
|
121
|
-
throw e;
|
|
122
|
-
}
|
|
194
|
+
const requireAllSignatures = (0, utils_1.requiresAllSignatures)(this._solTransaction.signatures);
|
|
195
|
+
// Based on the recomendation encoding found here https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
|
|
196
|
+
// We use base64 encoding
|
|
197
|
+
return this._solTransaction.serialize({ requireAllSignatures }).toString('base64');
|
|
123
198
|
}
|
|
124
199
|
/**
|
|
125
200
|
* Sets this transaction payload
|
|
@@ -128,12 +203,12 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
128
203
|
*/
|
|
129
204
|
fromRawTransaction(rawTransaction) {
|
|
130
205
|
try {
|
|
131
|
-
utils_1.isValidRawTransaction(rawTransaction);
|
|
206
|
+
(0, utils_1.isValidRawTransaction)(rawTransaction);
|
|
132
207
|
this._solTransaction = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
|
|
133
208
|
if (this._solTransaction.signature && this._solTransaction.signature !== null) {
|
|
134
209
|
this._id = bs58_1.default.encode(this._solTransaction.signature);
|
|
135
210
|
}
|
|
136
|
-
const transactionType = utils_1.getTransactionType(this._solTransaction);
|
|
211
|
+
const transactionType = (0, utils_1.getTransactionType)(this._solTransaction);
|
|
137
212
|
switch (transactionType) {
|
|
138
213
|
case sdk_core_1.TransactionType.WalletInitialization:
|
|
139
214
|
this.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
|
|
@@ -153,6 +228,9 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
153
228
|
case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
|
|
154
229
|
this.setTransactionType(sdk_core_1.TransactionType.AssociatedTokenAccountInitialization);
|
|
155
230
|
break;
|
|
231
|
+
case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
|
|
232
|
+
this.setTransactionType(sdk_core_1.TransactionType.CloseAssociatedTokenAccount);
|
|
233
|
+
break;
|
|
156
234
|
case sdk_core_1.TransactionType.StakingAuthorize:
|
|
157
235
|
this.setTransactionType(sdk_core_1.TransactionType.StakingAuthorize);
|
|
158
236
|
break;
|
|
@@ -162,6 +240,9 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
162
240
|
case sdk_core_1.TransactionType.StakingDelegate:
|
|
163
241
|
this.setTransactionType(sdk_core_1.TransactionType.StakingDelegate);
|
|
164
242
|
break;
|
|
243
|
+
case sdk_core_1.TransactionType.CustomTx:
|
|
244
|
+
this.setTransactionType(sdk_core_1.TransactionType.CustomTx);
|
|
245
|
+
break;
|
|
165
246
|
}
|
|
166
247
|
if (transactionType !== sdk_core_1.TransactionType.StakingAuthorizeRaw) {
|
|
167
248
|
this.loadInputsAndOutputs();
|
|
@@ -173,7 +254,6 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
173
254
|
}
|
|
174
255
|
/** @inheritdoc */
|
|
175
256
|
toJson() {
|
|
176
|
-
var _a;
|
|
177
257
|
if (!this._solTransaction) {
|
|
178
258
|
throw new sdk_core_1.ParseTransactionError('Empty transaction');
|
|
179
259
|
}
|
|
@@ -185,7 +265,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
185
265
|
authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
|
|
186
266
|
};
|
|
187
267
|
}
|
|
188
|
-
const instructionData = instructionParamsFactory_1.instructionParamsFactory(this._type, this._solTransaction.instructions);
|
|
268
|
+
const instructionData = (0, instructionParamsFactory_1.instructionParamsFactory)(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
|
|
189
269
|
if (this._type) {
|
|
190
270
|
if (!durableNonce &&
|
|
191
271
|
instructionData.length > 1 &&
|
|
@@ -195,7 +275,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
195
275
|
}
|
|
196
276
|
const result = {
|
|
197
277
|
id: this._solTransaction.signature ? this.id : undefined,
|
|
198
|
-
feePayer:
|
|
278
|
+
feePayer: this._solTransaction.feePayer?.toString(),
|
|
199
279
|
lamportsPerSignature: this.lamportsPerSignature,
|
|
200
280
|
nonce: this.getNonce(),
|
|
201
281
|
durableNonce: durableNonce,
|
|
@@ -223,13 +303,12 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
223
303
|
* Load the input and output data on this transaction.
|
|
224
304
|
*/
|
|
225
305
|
loadInputsAndOutputs() {
|
|
226
|
-
|
|
227
|
-
if (!this._solTransaction || ((_a = this._solTransaction.instructions) === null || _a === void 0 ? void 0 : _a.length) === 0) {
|
|
306
|
+
if (!this._solTransaction || this._solTransaction.instructions?.length === 0) {
|
|
228
307
|
return;
|
|
229
308
|
}
|
|
230
309
|
const outputs = [];
|
|
231
310
|
const inputs = [];
|
|
232
|
-
const instructionParams = instructionParamsFactory_1.instructionParamsFactory(this.type, this._solTransaction.instructions);
|
|
311
|
+
const instructionParams = (0, instructionParamsFactory_1.instructionParamsFactory)(this.type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
|
|
233
312
|
for (const instruction of instructionParams) {
|
|
234
313
|
switch (instruction.type) {
|
|
235
314
|
case constants_1.InstructionBuilderTypes.CreateNonceAccount:
|
|
@@ -269,14 +348,18 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
269
348
|
value: instruction.params.amount,
|
|
270
349
|
coin: this._coinConfig.name,
|
|
271
350
|
});
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
351
|
+
if (instruction.params.stakingType !== public_types_1.SolStakingTypeEnum.JITO) {
|
|
352
|
+
outputs.push({
|
|
353
|
+
address: instruction.params.stakingAddress,
|
|
354
|
+
value: instruction.params.amount,
|
|
355
|
+
coin: this._coinConfig.name,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
277
358
|
break;
|
|
278
359
|
case constants_1.InstructionBuilderTypes.StakingDeactivate:
|
|
279
|
-
if (instruction.params.amount &&
|
|
360
|
+
if (instruction.params.amount &&
|
|
361
|
+
instruction.params.unstakingAddress &&
|
|
362
|
+
instruction.params.stakingType !== public_types_1.SolStakingTypeEnum.JITO) {
|
|
280
363
|
inputs.push({
|
|
281
364
|
address: instruction.params.stakingAddress,
|
|
282
365
|
value: instruction.params.amount,
|
|
@@ -303,10 +386,16 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
303
386
|
break;
|
|
304
387
|
case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
|
|
305
388
|
break;
|
|
389
|
+
case constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount:
|
|
390
|
+
break;
|
|
306
391
|
case constants_1.InstructionBuilderTypes.StakingAuthorize:
|
|
307
392
|
break;
|
|
308
393
|
case constants_1.InstructionBuilderTypes.StakingDelegate:
|
|
309
394
|
break;
|
|
395
|
+
case constants_1.InstructionBuilderTypes.SetPriorityFee:
|
|
396
|
+
break;
|
|
397
|
+
case constants_1.InstructionBuilderTypes.CustomInstruction:
|
|
398
|
+
break;
|
|
310
399
|
}
|
|
311
400
|
}
|
|
312
401
|
this._outputs = outputs;
|
|
@@ -314,14 +403,16 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
314
403
|
}
|
|
315
404
|
/** @inheritDoc */
|
|
316
405
|
explainTransaction() {
|
|
317
|
-
if (utils_1.validateRawMsgInstruction(this._solTransaction.instructions)) {
|
|
406
|
+
if ((0, utils_1.validateRawMsgInstruction)(this._solTransaction.instructions)) {
|
|
318
407
|
return this.explainRawMsgAuthorizeTransaction();
|
|
319
408
|
}
|
|
320
|
-
const decodedInstructions = instructionParamsFactory_1.instructionParamsFactory(this._type, this._solTransaction.instructions);
|
|
409
|
+
const decodedInstructions = (0, instructionParamsFactory_1.instructionParamsFactory)(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
|
|
321
410
|
let memo = undefined;
|
|
322
411
|
let durableNonce = undefined;
|
|
323
412
|
let outputAmount = new bignumber_js_1.default(0);
|
|
324
413
|
const outputs = [];
|
|
414
|
+
// Create a separate array for token enablements
|
|
415
|
+
const tokenEnablements = [];
|
|
325
416
|
for (const instruction of decodedInstructions) {
|
|
326
417
|
switch (instruction.type) {
|
|
327
418
|
case constants_1.InstructionBuilderTypes.NonceAdvance:
|
|
@@ -371,6 +462,16 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
371
462
|
outputAmount = outputAmount.plus(stakingWithdrawInstruction.params.amount);
|
|
372
463
|
break;
|
|
373
464
|
case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
|
|
465
|
+
// Process token enablement instructions and collect them in the tokenEnablements array
|
|
466
|
+
const ataInit = instruction;
|
|
467
|
+
tokenEnablements.push({
|
|
468
|
+
address: ataInit.params.ataAddress,
|
|
469
|
+
tokenName: ataInit.params.tokenName,
|
|
470
|
+
tokenAddress: ataInit.params.mintAddress,
|
|
471
|
+
});
|
|
472
|
+
break;
|
|
473
|
+
case constants_1.InstructionBuilderTypes.CustomInstruction:
|
|
474
|
+
// Custom instructions are arbitrary and cannot be explained
|
|
374
475
|
break;
|
|
375
476
|
default:
|
|
376
477
|
continue;
|
|
@@ -384,7 +485,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
384
485
|
};
|
|
385
486
|
}
|
|
386
487
|
}
|
|
387
|
-
return this.getExplainedTransaction(outputAmount, outputs, memo, durableNonce);
|
|
488
|
+
return this.getExplainedTransaction(outputAmount, outputs, memo, durableNonce, tokenEnablements);
|
|
388
489
|
}
|
|
389
490
|
calculateFee() {
|
|
390
491
|
if (this.lamportsPerSignature || this.tokenAccountRentExemptAmount) {
|
|
@@ -398,21 +499,25 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
398
499
|
}
|
|
399
500
|
return constants_1.UNAVAILABLE_TEXT;
|
|
400
501
|
}
|
|
401
|
-
getExplainedTransaction(outputAmount, outputs, memo = undefined, durableNonce = undefined) {
|
|
502
|
+
getExplainedTransaction(outputAmount, outputs, memo = undefined, durableNonce = undefined, tokenEnablements = []) {
|
|
402
503
|
const feeString = this.calculateFee();
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
504
|
+
// Create displayOrder with tokenEnablements always included
|
|
505
|
+
const displayOrder = [
|
|
506
|
+
'id',
|
|
507
|
+
'type',
|
|
508
|
+
'blockhash',
|
|
509
|
+
'durableNonce',
|
|
510
|
+
'outputAmount',
|
|
511
|
+
'changeAmount',
|
|
512
|
+
'outputs',
|
|
513
|
+
'changeOutputs',
|
|
514
|
+
'tokenEnablements',
|
|
515
|
+
'fee',
|
|
516
|
+
'memo',
|
|
517
|
+
];
|
|
518
|
+
// Create the base explanation object with tokenEnablements always included
|
|
519
|
+
const explanation = {
|
|
520
|
+
displayOrder,
|
|
416
521
|
id: this.id,
|
|
417
522
|
type: sdk_core_1.TransactionType[this.type].toString(),
|
|
418
523
|
changeOutputs: [],
|
|
@@ -426,7 +531,9 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
426
531
|
memo: memo,
|
|
427
532
|
blockhash: this.getNonce(),
|
|
428
533
|
durableNonce: durableNonce,
|
|
534
|
+
tokenEnablements: tokenEnablements,
|
|
429
535
|
};
|
|
536
|
+
return explanation;
|
|
430
537
|
}
|
|
431
538
|
explainRawMsgAuthorizeTransaction() {
|
|
432
539
|
const { instructions } = this._solTransaction;
|
|
@@ -435,12 +542,21 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
435
542
|
walletNonceAddress: nonceInstruction.noncePubkey.toString(),
|
|
436
543
|
authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
|
|
437
544
|
};
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
545
|
+
const data = instructions[1].data.toString('hex');
|
|
546
|
+
const stakingAuthorizeParams = data === constants_1.validInstructionData
|
|
547
|
+
? {
|
|
548
|
+
stakingAddress: instructions[1].keys[0].pubkey.toString(),
|
|
549
|
+
oldWithdrawAddress: instructions[1].keys[2].pubkey.toString(),
|
|
550
|
+
newWithdrawAddress: instructions[1].keys[3].pubkey.toString(),
|
|
551
|
+
custodianAddress: instructions[1].keys[4].pubkey.toString(),
|
|
552
|
+
}
|
|
553
|
+
: {
|
|
554
|
+
stakingAddress: instructions[1].keys[0].pubkey.toString(),
|
|
555
|
+
oldWithdrawAddress: '',
|
|
556
|
+
newWithdrawAddress: '',
|
|
557
|
+
oldStakingAuthorityAddress: instructions[1].keys[2].pubkey.toString(),
|
|
558
|
+
newStakingAuthorityAddress: instructions[1].keys[3].pubkey.toString(),
|
|
559
|
+
};
|
|
444
560
|
const feeString = this.calculateFee();
|
|
445
561
|
return {
|
|
446
562
|
displayOrder: [
|
|
@@ -452,6 +568,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
452
568
|
'changeAmount',
|
|
453
569
|
'outputs',
|
|
454
570
|
'changeOutputs',
|
|
571
|
+
'tokenEnablements',
|
|
455
572
|
'fee',
|
|
456
573
|
'memo',
|
|
457
574
|
],
|
|
@@ -468,8 +585,9 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
468
585
|
blockhash: this.getNonce(),
|
|
469
586
|
durableNonce: durableNonce,
|
|
470
587
|
stakingAuthorize: stakingAuthorizeParams,
|
|
588
|
+
tokenEnablements: [], // Always include tokenEnablements as an empty array for consistency
|
|
471
589
|
};
|
|
472
590
|
}
|
|
473
591
|
}
|
|
474
592
|
exports.Transaction = Transaction;
|
|
475
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxtREFROEI7QUFFOUIsNkNBQWlIO0FBY2pILGdEQUEwQjtBQUMxQixtQ0FNaUI7QUFFakIseUVBQXNFO0FBQ3RFLDJDQUFtRztBQUVuRyxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQU05QyxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsRUFBa0I7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVksMEJBQTBCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7SUFDNUUsQ0FBQztJQUVELElBQVksK0JBQStCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUM3QyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsMEJBQWtCLENBQUMsV0FBVyxDQUFDLEtBQUsscUNBQXlCLENBQUMsZ0NBQWdDLENBQ2hILENBQUMsTUFBTSxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLEVBQUU7UUFDSixnR0FBZ0c7UUFDaEcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRTtZQUNsQyxPQUFPLGNBQU0sQ0FBQyxNQUFNLENBQUMs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UUFBUSxFQUFFO1lBQzdELGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtTQUM1RCxDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE9BQU87WUFDTCxZQUFZLEVBQUU7Z0JBQ1osSUFBSTtnQkFDSixNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsY0FBYztnQkFDZCxjQUFjO2dCQUNkLGNBQWM7Z0JBQ2QsU0FBUztnQkFDVCxlQUFlO2dCQUNmLEtBQUs7Z0JBQ0wsTUFBTTthQUNQO1lBQ0QsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUMzQyxhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsR0FBRztZQUNqQixZQUFZLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxFQUFFO1lBQ1gsR0FBRyxFQUFFO2dCQUNILEdBQUcsRUFBRSxTQUFTO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CO2FBQ25DO1lBQ0QsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsZ0JBQWdCLEVBQUUsc0JBQXNCO1NBQ3pDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuZkQsa0NBbWZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHtcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCbG9ja2hhc2gsIFB1YmxpY0tleSwgU2lnbmVyLCBTeXN0ZW1JbnN0cnVjdGlvbiwgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24gfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtcbiAgRHVyYWJsZU5vbmNlUGFyYW1zLFxuICBNZW1vLFxuICBOb25jZSxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplUGFyYW1zLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyLFxuICBUeERhdGEsXG4gIFdhbGxldEluaXQsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcbmltcG9ydCB7XG4gIGdldEluc3RydWN0aW9uVHlwZSxcbiAgZ2V0VHJhbnNhY3Rpb25UeXBlLFxuICBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24sXG4gIHJlcXVpcmVzQWxsU2lnbmF0dXJlcyxcbiAgdmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbixcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkgfSBmcm9tICcuL2luc3RydWN0aW9uUGFyYW1zRmFjdG9yeSc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgVU5BVkFJTEFCTEVfVEVYVCwgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9zb2xUcmFuc2FjdGlvbjogU29sVHJhbnNhY3Rpb247XG4gIHByaXZhdGUgX2xhbXBvcnRzUGVyU2lnbmF0dXJlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Rva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHNvbFRyYW5zYWN0aW9uKCk6IFNvbFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgc29sVHJhbnNhY3Rpb24odHg6IFNvbFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmNvbXBpbGVNZXNzYWdlKCkuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLmZpbHRlcihcbiAgICAgIChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudFxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uc2VyaWFsaXplTWVzc2FnZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICoqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAvLyBTb2xhbmEgdHJhbnNhY3Rpb24gSUQgPT09IGZpcnN0IHNpZ25hdHVyZTogaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjdHJhbnNhY3Rpb24taWRcbiAgICBpZiAodGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlKSB7XG4gICAgICByZXR1cm4gYmFzZTU4LmVuY29kZSh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gVU5BVkFJTEFCTEVfVEVYVDtcbiAgICB9XG4gIH1cblxuICBnZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBzZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUobGFtcG9ydHNQZXJTaWduYXR1cmU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID0gbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBnZXQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50O1xuICB9XG5cbiAgc2V0IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQodG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCA9IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc29sU2lnbmF0dXJlIG9mIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZXMpIHtcbiAgICAgIGlmIChzb2xTaWduYXR1cmUuc2lnbmF0dXJlKSB7XG4gICAgICAgIHNpZ25hdHVyZXMucHVzaChiYXNlNTguZW5jb2RlKHNvbFNpZ25hdHVyZS5zaWduYXR1cmUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXIgU2lnbmVyIGtleXMuXG4gICAqL1xuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXJbXSB8IEtleVBhaXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uIHx8ICF0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ05vbmNlIGlzIHJlcXVpcmVkIGJlZm9yZSBzaWduaW5nJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24gfHwgIXRoaXMuX3NvbFRyYW5zYWN0aW9uLmZlZVBheWVyKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdmZWVQYXllciBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgIH1cbiAgICBjb25zdCBrZXlQYWlycyA9IGtleVBhaXIgaW5zdGFuY2VvZiBBcnJheSA/IGtleVBhaXIgOiBba2V5UGFpcl07XG4gICAgY29uc3Qgc2lnbmVyczogU2lnbmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtwIG9mIGtleVBhaXJzKSB7XG4gICAgICBjb25zdCBrZXlzID0ga3AuZ2V0S2V5cyh0cnVlKTtcbiAgICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgICAgfVxuICAgICAgc2lnbmVycy5wdXNoKHsgcHVibGljS2V5OiBuZXcgUHVibGljS2V5KGtleXMucHViKSwgc2VjcmV0S2V5OiBrZXlzLnBydiBhcyBVaW50OEFycmF5IH0pO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24ucGFydGlhbFNpZ24oLi4uc2lnbmVycyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICAvLyBUaGUgc2lnbmF0dXJlcyBjYW4gaGF2ZSBudWxsIHNpZ25hdHVyZXMgKHdoaWNoIG1lYW5zIHRoZXkgYXJlIHJlcXVpcmVkIGJ1dCB5ZXQgdW5zaWduZWQpXG4gICAgLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzZXJpYWxpemVyIHRoZSB0eHMsIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSByZXF1aXJlQWxsU2lnbmF0dXJlcyBiYXNlZFxuICAgIC8vIG9uIGlmIHRoZSBUWCBpcyBmdWxseSBzaWduZWQgb3Igbm90XG4gICAgY29uc3QgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSByZXF1aXJlc0FsbFNpZ25hdHVyZXModGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhc2VkIG9uIHRoZSByZWNvbWVuZGF0aW9uIGVuY29kaW5nIGZvdW5kIGhlcmUgaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vZGV2ZWxvcGluZy9jbGllbnRzL2pzb25ycGMtYXBpI3NlbmR0cmFuc2FjdGlvblxuICAgICAgLy8gV2UgdXNlIGJhc2U2NCBlbmNvZGluZ1xuICAgICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoaXMgdHJhbnNhY3Rpb24gcGF5bG9hZFxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb25cbiAgICovXG4gIGZyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbiA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgICBpZiAodGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlICYmIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9pZCA9IGJhc2U1OC5lbmNvZGUodGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uVHlwZSA9IGdldFRyYW5zYWN0aW9uVHlwZSh0aGlzLl9zb2xUcmFuc2FjdGlvbik7XG4gICAgICBzd2l0Y2ggKHRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNhY3Rpb25UeXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdykge1xuICAgICAgICB0aGlzLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBsZXQgZHVyYWJsZU5vbmNlOiBEdXJhYmxlTm9uY2VQYXJhbXMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mbykge1xuICAgICAgY29uc3Qgbm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZSh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2VJbnN0cnVjdGlvbik7XG4gICAgICBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBpbnN0cnVjdGlvbkRhdGEgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkodGhpcy5fdHlwZSwgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zKTtcbiAgICBpZiAodGhpcy5fdHlwZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhZHVyYWJsZU5vbmNlICYmXG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5sZW5ndGggPiAxICYmXG4gICAgICAgIGluc3RydWN0aW9uRGF0YVswXS50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2VcbiAgICAgICkge1xuICAgICAgICBkdXJhYmxlTm9uY2UgPSBpbnN0cnVjdGlvbkRhdGFbMF0ucGFyYW1zO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IFR4RGF0YSA9IHtcbiAgICAgIGlkOiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUgPyB0aGlzLmlkIDogdW5kZWZpbmVkLFxuICAgICAgZmVlUGF5ZXI6IHRoaXMuX3NvbFRyYW5zYWN0aW9uLmZlZVBheWVyPy50b1N0cmluZygpLFxuICAgICAgbGFtcG9ydHNQZXJTaWduYXR1cmU6IHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUsXG4gICAgICBub25jZTogdGhpcy5nZXROb25jZSgpLFxuICAgICAgZHVyYWJsZU5vbmNlOiBkdXJhYmxlTm9uY2UsXG4gICAgICBudW1TaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZS5sZW5ndGgsXG4gICAgICBpbnN0cnVjdGlvbnNEYXRhOiBpbnN0cnVjdGlvbkRhdGEsXG4gICAgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbm9uY2UgZnJvbSB0aGUgU29sYW5hIFRyYW5zYWN0aW9uXG4gICAqIFRocm93cyBpZiBub3Qgc2V0XG4gICAqL1xuICBwcml2YXRlIGdldE5vbmNlKCk6IEJsb2NraGFzaCB7XG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mbykge1xuICAgICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mby5ub25jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBpcyBub3Qgc2V0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbiB8fCB0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRzOiBFbnRyeVtdID0gW107XG4gICAgY29uc3QgaW5wdXRzOiBFbnRyeVtdID0gW107XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25QYXJhbXMgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkodGhpcy50eXBlLCB0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMpO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvblBhcmFtcykge1xuICAgICAgc3dpdGNoIChpbnN0cnVjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50OlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyOlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCAmJiBpbnN0cnVjdGlvbi5wYXJhbXMudW5zdGFraW5nQWRkcmVzcykge1xuICAgICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy51bnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gaW5wdXRzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBpZiAodmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbih0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leHBsYWluUmF3TXNnQXV0aG9yaXplVHJhbnNhY3Rpb24oKTtcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeSh0aGlzLl90eXBlLCB0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMpO1xuXG4gICAgbGV0IG1lbW86IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgZHVyYWJsZU5vbmNlOiBEdXJhYmxlTm9uY2VQYXJhbXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBsZXQgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGRlY29kZWRJbnN0cnVjdGlvbnMpIHtcbiAgICAgIHN3aXRjaCAoaW5zdHJ1Y3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZTpcbiAgICAgICAgICBkdXJhYmxlTm9uY2UgPSAoaW5zdHJ1Y3Rpb24gYXMgTm9uY2UpLnBhcmFtcztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vOlxuICAgICAgICAgIG1lbW8gPSAoaW5zdHJ1Y3Rpb24gYXMgTWVtbykucGFyYW1zLm1lbW87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFRyYW5zZmVyO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQucGx1cyh0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXI6XG4gICAgICAgICAgY29uc3QgdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgVG9rZW5UcmFuc2ZlcjtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQ6XG4gICAgICAgICAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBXYWxsZXRJbml0O1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBjcmVhdGVJbnN0cnVjdGlvbi5wYXJhbXMubm9uY2VBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBjcmVhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKGNyZWF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgICBjb25zdCBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICBjb25zdCBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFN0YWtpbmdXaXRoZHJhdztcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGRlc2VyaWFsaXppbmcgYSB0cmFuc2FjdGlvbiwgZHVyYWJsZSBub25jZSBkZXRhaWxzIGFyZSBwb3B1bGF0ZWQgaW4gdGhlIG5vbmNlSW5mbyBmaWVsZFxuICAgICAgaWYgKCFkdXJhYmxlTm9uY2UgJiYgdGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvKSB7XG4gICAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKFxuICAgICAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGR1cmFibGVOb25jZSA9IHtcbiAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRFeHBsYWluZWRUcmFuc2FjdGlvbihvdXRwdXRBbW91bnQsIG91dHB1dHMsIG1lbW8sIGR1cmFibGVOb25jZSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUZlZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlIHx8IHRoaXMudG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlRmVlcyA9IHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmVcbiAgICAgICAgPyBuZXcgQmlnTnVtYmVyKHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUpLm11bHRpcGxpZWRCeSh0aGlzLm51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKS50b0ZpeGVkKDApXG4gICAgICAgIDogMDtcbiAgICAgIGNvbnN0IHJlbnRGZWVzID0gdGhpcy50b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50XG4gICAgICAgID8gbmV3IEJpZ051bWJlcih0aGlzLnRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQpLm11bHRpcGxpZWRCeSh0aGlzLm51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMpLnRvRml4ZWQoMClcbiAgICAgICAgOiAwO1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoc2lnbmF0dXJlRmVlcykucGx1cyhyZW50RmVlcykudG9GaXhlZCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIFVOQVZBSUxBQkxFX1RFWFQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RXhwbGFpbmVkVHJhbnNhY3Rpb24oXG4gICAgb3V0cHV0QW1vdW50OiBCaWdOdW1iZXIsXG4gICAgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSxcbiAgICBtZW1vOiB1bmRlZmluZWQgfCBzdHJpbmcgPSB1bmRlZmluZWQsXG4gICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQgfCBEdXJhYmxlTm9uY2VQYXJhbXMgPSB1bmRlZmluZWRcbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgZmVlU3RyaW5nID0gdGhpcy5jYWxjdWxhdGVGZWUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICdpZCcsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAnZmVlJyxcbiAgICAgICAgJ21lbW8nLFxuICAgICAgXSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlW3RoaXMudHlwZV0udG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBvdXRwdXRBbW91bnQ6IG91dHB1dEFtb3VudC50b0ZpeGVkKDApLFxuICAgICAgb3V0cHV0czogb3V0cHV0cyxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IGZlZVN0cmluZyxcbiAgICAgICAgZmVlUmF0ZTogdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSxcbiAgICAgIH0sXG4gICAgICBtZW1vOiBtZW1vLFxuICAgICAgYmxvY2toYXNoOiB0aGlzLmdldE5vbmNlKCksXG4gICAgICBkdXJhYmxlTm9uY2U6IGR1cmFibGVOb25jZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBleHBsYWluUmF3TXNnQXV0aG9yaXplVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRoaXMuX3NvbFRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IG5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgICBjb25zdCBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBub25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9O1xuICAgIGNvbnN0IHN0YWtpbmdBdXRob3JpemVQYXJhbXM6IFN0YWtpbmdBdXRob3JpemVQYXJhbXMgPSB7XG4gICAgICBzdGFraW5nQWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBvbGRXaXRoZHJhd0FkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGN1c3RvZGlhbkFkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgIH07XG4gICAgY29uc3QgZmVlU3RyaW5nID0gdGhpcy5jYWxjdWxhdGVGZWUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICdpZCcsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAnZmVlJyxcbiAgICAgICAgJ21lbW8nLFxuICAgICAgXSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlW3RoaXMudHlwZV0udG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBvdXRwdXRBbW91bnQ6IDAsXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IGZlZVN0cmluZyxcbiAgICAgICAgZmVlUmF0ZTogdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSxcbiAgICAgIH0sXG4gICAgICBibG9ja2hhc2g6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgc3Rha2luZ0F1dGhvcml6ZTogc3Rha2luZ0F1dGhvcml6ZVBhcmFtcyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
593
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVM4QjtBQUU5Qiw2Q0FPeUI7QUFDekIsZ0VBQXFDO0FBQ3JDLGdEQUEwQjtBQUUxQiwyQ0FLcUI7QUFpQnJCLHlFQUFzRTtBQUN0RSxtQ0FNaUI7QUFDakIsc0RBQXlEO0FBRXpELE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBVTlDLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBTlgsc0JBQWlCLEdBQXdCLEVBQUUsQ0FBQztRQUM5Qyw4QkFBeUIsR0FBRyxLQUFLLENBQUM7SUFNMUMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLEVBQWtCO1FBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFZLDBCQUEwQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFZLCtCQUErQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDN0MsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUEsMEJBQWtCLEVBQUMsV0FBVyxDQUFDLEtBQUsscUNBQXlCLENBQUMsZ0NBQWdDLENBQ2hILENBQUMsTUFBTSxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLGVBQWU7UUFDakIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8s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Q3RCLDBCQUEwQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDckUsMEJBQTBCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2FBQ3RFLENBQUM7UUFDUixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsT0FBTztZQUNMLFlBQVksRUFBRTtnQkFDWixJQUFJO2dCQUNKLE1BQU07Z0JBQ04sV0FBVztnQkFDWCxjQUFjO2dCQUNkLGNBQWM7Z0JBQ2QsY0FBYztnQkFDZCxTQUFTO2dCQUNULGVBQWU7Z0JBQ2Ysa0JBQWtCO2dCQUNsQixLQUFLO2dCQUNMLE1BQU07YUFDUDtZQUNELEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDM0MsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUc7WUFDakIsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLEdBQUcsRUFBRTtnQkFDSCxHQUFHLEVBQUUsU0FBUztnQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUNuQztZQUNELFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzFCLFlBQVksRUFBRSxZQUFZO1lBQzFCLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsb0VBQW9FO1NBQzNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFwcEJELGtDQW9wQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgSVRva2VuRW5hYmxlbWVudCxcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEJsb2NraGFzaCxcbiAgUHVibGljS2V5LFxuICBTaWduZXIsXG4gIFRyYW5zYWN0aW9uIGFzIFNvbFRyYW5zYWN0aW9uLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4nO1xuaW1wb3J0IHtcbiAgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMsXG4gIFVOQVZBSUxBQkxFX1RFWFQsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFJbml0LFxuICBEdXJhYmxlTm9uY2VQYXJhbXMsXG4gIEluc3RydWN0aW9uUGFyYW1zLFxuICBNZW1vLFxuICBOb25jZSxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplUGFyYW1zLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyLFxuICBUeERhdGEsXG4gIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgV2FsbGV0SW5pdCxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkgfSBmcm9tICcuL2luc3RydWN0aW9uUGFyYW1zRmFjdG9yeSc7XG5pbXBvcnQge1xuICBnZXRJbnN0cnVjdGlvblR5cGUsXG4gIGdldFRyYW5zYWN0aW9uVHlwZSxcbiAgaXNWYWxpZFJhd1RyYW5zYWN0aW9uLFxuICByZXF1aXJlc0FsbFNpZ25hdHVyZXMsXG4gIHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfc29sVHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9sYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwcm90ZWN0ZWQgX2luc3RydWN0aW9uc0RhdGE6IEluc3RydWN0aW9uUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZlcnNpb25lZFRyYW5zYWN0aW9uOiBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHNvbFRyYW5zYWN0aW9uKCk6IFNvbFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgc29sVHJhbnNhY3Rpb24odHg6IFNvbFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmNvbXBpbGVNZXNzYWdlKCkuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLmZpbHRlcihcbiAgICAgIChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudFxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5tZXNzYWdlLnNlcmlhbGl6ZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqKi9cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgLy8gU29sYW5hIHRyYW5zYWN0aW9uIElEID09PSBmaXJzdCBzaWduYXR1cmU6IGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL3Rlcm1pbm9sb2d5I3RyYW5zYWN0aW9uLWlkXG4gICAgaWYgKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICBjb25zdCBzaWcgPSB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5zaWduYXR1cmVzPy5bMF07XG4gICAgICAvLyBDaGVjayBpZiBzaWduYXR1cmUgZXhpc3RzIGFuZCBpcyBub3QgYSBwbGFjZWhvbGRlciBzaWduYXR1cmUgKGFsbCB6ZXJvcylcbiAgICAgIGlmIChzaWcgJiYgc2lnLnNvbWUoKGJ5dGUpID0+IGJ5dGUgIT09IDApKSB7XG4gICAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKHNpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSkge1xuICAgICAgcmV0dXJuIGJhc2U1OC5lbmNvZGUodGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gVU5BVkFJTEFCTEVfVEVYVDtcbiAgfVxuXG4gIGdldCBsYW1wb3J0c1BlclNpZ25hdHVyZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9sYW1wb3J0c1BlclNpZ25hdHVyZTtcbiAgfVxuXG4gIHNldCBsYW1wb3J0c1BlclNpZ25hdHVyZShsYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmUgPSBsYW1wb3J0c1BlclNpZ25hdHVyZTtcbiAgfVxuXG4gIGdldCB0b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ7XG4gIH1cblxuICBzZXQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCh0b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50ID0gdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzaWduYXR1cmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICAvLyBIYW5kbGUgVmVyc2lvbmVkVHJhbnNhY3Rpb24gc2lnbmF0dXJlc1xuICAgICAgZm9yIChjb25zdCBzaWcgb2YgdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlcykge1xuICAgICAgICAvLyBGaWx0ZXJzIG91dCBwbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICAgIGlmIChzaWcgJiYgc2lnLnNvbWUoKGIpID0+IGIgIT09IDApKSB7XG4gICAgICAgICAgc2lnbmF0dXJlcy5wdXNoKGJhc2U1OC5lbmNvZGUoc2lnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGxlZ2FjeSB0cmFuc2FjdGlvbiBzaWduYXR1cmVzXG4gICAgICBmb3IgKGNvbnN0IHNvbFNpZ25hdHVyZSBvZiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmVzKSB7XG4gICAgICAgIGlmIChzb2xTaWduYXR1cmUuc2lnbmF0dXJlKSB7XG4gICAgICAgICAgc2lnbmF0dXJlcy5wdXNoKGJhc2U1OC5lbmNvZGUoc29sU2lnbmF0dXJlLnNpZ25hdHVyZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpZ25hdHVyZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBpbnN0cnVjdGlvbkRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gaW5zdHJ1Y3Rpb25EYXRhIFRoZSBpbnN0cnVjdGlvbiBkYXRhIHRvIGJlIHNldC5cbiAgICovXG4gIHNldEluc3RydWN0aW9uc0RhdGEoaW5zdHJ1Y3Rpb25EYXRhOiBJbnN0cnVjdGlvblBhcmFtc1tdKTogdm9pZCB7XG4gICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IGluc3RydWN0aW9uRGF0YTtcbiAgfVxuXG4gIGdldCB1c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZTtcbiAgfVxuXG4gIHNldFVzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgYSBWZXJzaW9uZWRUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGlzIGEgVmVyc2lvbmVkVHJhbnNhY3Rpb25cbiAgICovXG4gIGlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24gfHwgISF0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcmlnaW5hbCBWZXJzaW9uZWRUcmFuc2FjdGlvbiBpZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBwYXJzZWQgZnJvbSBvbmVcbiAgICogQHJldHVybnMge1ZlcnNpb25lZFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkfSBUaGUgVmVyc2lvbmVkVHJhbnNhY3Rpb24gb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXQgdmVyc2lvbmVkVHJhbnNhY3Rpb24oKTogVmVyc2lvbmVkVHJhbnNhY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBidWlsdCBWZXJzaW9uZWRUcmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1ZlcnNpb25lZFRyYW5zYWN0aW9ufSB2ZXJzaW9uZWRUeCBUaGUgVmVyc2lvbmVkVHJhbnNhY3Rpb24gdG8gc2V0XG4gICAqL1xuICBzZXQgdmVyc2lvbmVkVHJhbnNhY3Rpb24odmVyc2lvbmVkVHg6IFZlcnNpb25lZFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24gPSB2ZXJzaW9uZWRUeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0b3JlZCBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGFcbiAgICogQHJldHVybnMge1ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZH0gVGhlIHN0b3JlZCBkYXRhIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKCk6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSBmb3IgdGhpcyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZH0gZGF0YSBUaGUgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGRhdGEgdG8gc3RvcmUsIG9yIHVuZGVmaW5lZCB0byBjbGVhclxuICAgKi9cbiAgc2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKGRhdGE6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSA9IGRhdGE7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIFNpZ25lciBrZXlzLlxuICAgKi9cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyW10gfCBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ29udmVydCB0byBhcnJheSBhbmQgYnVpbGQgc2lnbmVycyBsaXN0XG4gICAgY29uc3Qga2V5UGFpcnMgPSBrZXlQYWlyIGluc3RhbmNlb2YgQXJyYXkgPyBrZXlQYWlyIDogW2tleVBhaXJdO1xuICAgIGNvbnN0IHNpZ25lcnM6IFNpZ25lcltdID0gW107XG4gICAgZm9yIChjb25zdCBrcCBvZiBrZXlQYWlycykge1xuICAgICAgY29uc3Qga2V5cyA9IGtwLmdldEtleXModHJ1ZSk7XG4gICAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICAgIHNpZ25lcnMucHVzaCh7IHB1YmxpY0tleTogbmV3IFB1YmxpY0tleShrZXlzLnB1YiksIHNlY3JldEtleToga2V5cy5wcnYgYXMgVWludDhBcnJheSB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIGlmICghdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24ubWVzc2FnZS5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTm9uY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLnNpZ24oc2lnbmVycyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbiB8fCAhdGhpcy5fc29sVHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdOb25jZSBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uIHx8ICF0aGlzLl9zb2xUcmFuc2FjdGlvbi5mZWVQYXllcikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignZmVlUGF5ZXIgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICB9XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24ucGFydGlhbFNpZ24oLi4uc2lnbmVycyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIFZlcnNpb25lZFRyYW5zYWN0aW9uLnNlcmlhbGl6ZSgpIGRvZXNuJ3QgbmVlZCByZXF1aXJlQWxsU2lnbmF0dXJlcyBwYXJhbWV0ZXJcbiAgICAgIC8vIEl0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB3aGF0ZXZlciBzaWduYXR1cmVzIGFyZSBwcmVzZW50XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICAvLyBUaGUgc2lnbmF0dXJlcyBjYW4gaGF2ZSBudWxsIHNpZ25hdHVyZXMgKHdoaWNoIG1lYW5zIHRoZXkgYXJlIHJlcXVpcmVkIGJ1dCB5ZXQgdW5zaWduZWQpXG4gICAgLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzZXJpYWxpemVyIHRoZSB0eHMsIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSByZXF1aXJlQWxsU2lnbmF0dXJlcyBiYXNlZFxuICAgIC8vIG9uIGlmIHRoZSBUWCBpcyBmdWxseSBzaWduZWQgb3Igbm90XG4gICAgY29uc3QgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSByZXF1aXJlc0FsbFNpZ25hdHVyZXModGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcyk7XG4gICAgLy8gQmFzZWQgb24gdGhlIHJlY29tZW5kYXRpb24gZW5jb2RpbmcgZm91bmQgaGVyZSBodHRwczovL2RvY3Muc29sYW5hLmNvbS9kZXZlbG9waW5nL2NsaWVudHMvanNvbnJwYy1hcGkjc2VuZHRyYW5zYWN0aW9uXG4gICAgLy8gV2UgdXNlIGJhc2U2NCBlbmNvZGluZ1xuICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlcyB9KS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuICAgICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSAmJiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5faWQgPSBiYXNlNTguZW5jb2RlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSBnZXRUcmFuc2FjdGlvblR5cGUodGhpcy5fc29sVHJhbnNhY3Rpb24pO1xuICAgICAgc3dpdGNoICh0cmFuc2FjdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb246XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNhY3Rpb25UeXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdykge1xuICAgICAgICB0aGlzLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBsZXQgZHVyYWJsZU5vbmNlOiBEdXJhYmxlTm9uY2VQYXJhbXMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mbykge1xuICAgICAgY29uc3Qgbm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZSh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2VJbnN0cnVjdGlvbik7XG4gICAgICBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBpbnN0cnVjdGlvbkRhdGEgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gICAgICB0aGlzLl90eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG4gICAgaWYgKHRoaXMuX3R5cGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWR1cmFibGVOb25jZSAmJlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGEubGVuZ3RoID4gMSAmJlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGFbMF0udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlXG4gICAgICApIHtcbiAgICAgICAgZHVyYWJsZU5vbmNlID0gaW5zdHJ1Y3Rpb25EYXRhWzBdLnBhcmFtcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogdGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlID8gdGhpcy5pZCA6IHVuZGVmaW5lZCxcbiAgICAgIGZlZVBheWVyOiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5mZWVQYXllcj8udG9TdHJpbmcoKSxcbiAgICAgIGxhbXBvcnRzUGVyU2lnbmF0dXJlOiB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlLFxuICAgICAgbm9uY2U6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgbnVtU2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUubGVuZ3RoLFxuICAgICAgaW5zdHJ1Y3Rpb25zRGF0YTogaW5zdHJ1Y3Rpb25EYXRhLFxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5vbmNlIGZyb20gdGhlIFNvbGFuYSBUcmFuc2FjdGlvblxuICAgKiBUaHJvd3MgaWYgbm90IHNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXROb25jZSgpOiBCbG9ja2hhc2gge1xuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8pIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTm9uY2UgaXMgbm90IHNldCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24gfHwgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGluc3RydWN0aW9uUGFyYW1zID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICAgICAgdGhpcy50eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9uUGFyYW1zKSB7XG4gICAgICBzd2l0Y2ggKGluc3RydWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQ6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyOlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nVHlwZSAhPT0gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE8pIHtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50ICYmXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMudW5zdGFraW5nQWRkcmVzcyAmJlxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdUeXBlICE9PSBTb2xTdGFraW5nVHlwZUVudW0uSklUT1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy51bnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0UHJpb3JpdHlGZWU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb246XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMgPSBvdXRwdXRzO1xuICAgIHRoaXMuX2lucHV0cyA9IGlucHV0cztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgaWYgKHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24odGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblJhd01zZ0F1dGhvcml6ZVRyYW5zYWN0aW9uKCk7XG4gICAgfVxuICAgIGNvbnN0IGRlY29kZWRJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gICAgICB0aGlzLl90eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG5cbiAgICBsZXQgbWVtbzogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBkdXJhYmxlTm9uY2U6IER1cmFibGVOb25jZVBhcmFtcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGxldCBvdXRwdXRBbW91bnQgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcbiAgICAvLyBDcmVhdGUgYSBzZXBhcmF0ZSBhcnJheSBmb3IgdG9rZW4gZW5hYmxlbWVudHNcbiAgICBjb25zdCB0b2tlbkVuYWJsZW1lbnRzOiBJVG9rZW5FbmFibGVtZW50W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgZGVjb2RlZEluc3RydWN0aW9ucykge1xuICAgICAgc3dpdGNoIChpbnN0cnVjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlOlxuICAgICAgICAgIGR1cmFibGVOb25jZSA9IChpbnN0cnVjdGlvbiBhcyBOb25jZSkucGFyYW1zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW86XG4gICAgICAgICAgbWVtbyA9IChpbnN0cnVjdGlvbiBhcyBNZW1vKS5wYXJhbXMubWVtbztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5UcmFuc2ZlcjpcbiAgICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgVHJhbnNmZXI7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgICBjb25zdCB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBUb2tlblRyYW5zZmVyO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZU5vbmNlQWNjb3VudDpcbiAgICAgICAgICBjb25zdCBjcmVhdGVJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFdhbGxldEluaXQ7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGNyZWF0ZUluc3RydWN0aW9uLnBhcmFtcy5ub25jZUFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IGNyZWF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMoY3JlYXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICAgIGNvbnN0IHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgU3Rha2luZ0FjdGl2YXRlO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMoc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICAgIGNvbnN0IHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgU3Rha2luZ1dpdGhkcmF3O1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMoc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICAvLyBQcm9jZXNzIHRva2VuIGVuYWJsZW1lbnQgaW5zdHJ1Y3Rpb25zIGFuZCBjb2xsZWN0IHRoZW0gaW4gdGhlIHRva2VuRW5hYmxlbWVudHMgYXJyYXlcbiAgICAgICAgICBjb25zdCBhdGFJbml0ID0gaW5zdHJ1Y3Rpb24gYXMgQXRhSW5pdDtcbiAgICAgICAgICB0b2tlbkVuYWJsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogYXRhSW5pdC5wYXJhbXMuYXRhQWRkcmVzcyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogYXRhSW5pdC5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgICAgdG9rZW5BZGRyZXNzOiBhdGFJbml0LnBhcmFtcy5taW50QWRkcmVzcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbjpcbiAgICAgICAgICAvLyBDdXN0b20gaW5zdHJ1Y3Rpb25zIGFyZSBhcmJpdHJhcnkgYW5kIGNhbm5vdCBiZSBleHBsYWluZWRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgZGVzZXJpYWxpemluZyBhIHRyYW5zYWN0aW9uLCBkdXJhYmxlIG5vbmNlIGRldGFpbHMgYXJlIHBvcHVsYXRlZCBpbiB0aGUgbm9uY2VJbmZvIGZpZWxkXG4gICAgICBpZiAoIWR1cmFibGVOb25jZSAmJiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8pIHtcbiAgICAgICAgY29uc3Qgbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoXG4gICAgICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvLm5vbmNlSW5zdHJ1Y3Rpb25cbiAgICAgICAgKTtcbiAgICAgICAgZHVyYWJsZU5vbmNlID0ge1xuICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBub25jZUFkdmFuY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFkdmFuY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEV4cGxhaW5lZFRyYW5zYWN0aW9uKG91dHB1dEFtb3VudCwgb3V0cHV0cywgbWVtbywgZHVyYWJsZU5vbmNlLCB0b2tlbkVuYWJsZW1lbnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRmVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUgfHwgdGhpcy50b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50KSB7XG4gICAgICBjb25zdCBzaWduYXR1cmVGZWVzID0gdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZVxuICAgICAgICA/IG5ldyBCaWdOdW1iZXIodGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSkubXVsdGlwbGllZEJ5KHRoaXMubnVtYmVyT2ZSZXF1aXJlZFNpZ25hdHVyZXMpLnRvRml4ZWQoMClcbiAgICAgICAgOiAwO1xuICAgICAgY29uc3QgcmVudEZlZXMgPSB0aGlzLnRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnRcbiAgICAgICAgPyBuZXcgQmlnTnVtYmVyKHRoaXMudG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCkubXVsdGlwbGllZEJ5KHRoaXMubnVtYmVyT2ZBVEFDcmVhdGlvbkluc3RydWN0aW9ucykudG9GaXhlZCgwKVxuICAgICAgICA6IDA7XG4gICAgICByZXR1cm4gbmV3IEJpZ051bWJlcihzaWduYXR1cmVGZWVzKS5wbHVzKHJlbnRGZWVzKS50b0ZpeGVkKDApO1xuICAgIH1cbiAgICByZXR1cm4gVU5BVkFJTEFCTEVfVEVYVDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRFeHBsYWluZWRUcmFuc2FjdGlvbihcbiAgICBvdXRwdXRBbW91bnQ6IEJpZ051bWJlcixcbiAgICBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdLFxuICAgIG1lbW86IHVuZGVmaW5lZCB8IHN0cmluZyA9IHVuZGVmaW5lZCxcbiAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCB8IER1cmFibGVOb25jZVBhcmFtcyA9IHVuZGVmaW5lZCxcbiAgICB0b2tlbkVuYWJsZW1lbnRzOiBJVG9rZW5FbmFibGVtZW50W10gPSBbXVxuICApOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBmZWVTdHJpbmcgPSB0aGlzLmNhbGN1bGF0ZUZlZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGRpc3BsYXlPcmRlciB3aXRoIHRva2VuRW5hYmxlbWVudHMgYWx3YXlzIGluY2x1ZGVkXG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gW1xuICAgICAgJ2lkJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICdibG9ja2hhc2gnLFxuICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgJ291dHB1dHMnLFxuICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgJ2ZlZScsXG4gICAgICAnbWVtbycsXG4gICAgXTtcblxuICAgIC8vIENyZWF0ZSB0aGUgYmFzZSBleHBsYW5hdGlvbiBvYmplY3Qgd2l0aCB0b2tlbkVuYWJsZW1lbnRzIGFsd2F5cyBpbmNsdWRlZFxuICAgIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVbdGhpcy50eXBlXS50b1N0cmluZygpLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LnRvRml4ZWQoMCksXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogZmVlU3RyaW5nLFxuICAgICAgICBmZWVSYXRlOiB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlLFxuICAgICAgfSxcbiAgICAgIG1lbW86IG1lbW8sXG4gICAgICBibG9ja2hhc2g6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgdG9rZW5FbmFibGVtZW50czogdG9rZW5FbmFibGVtZW50cyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBsYWluUmF3TXNnQXV0aG9yaXplVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRoaXMuX3NvbFRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IG5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgICBjb25zdCBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBub25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9O1xuICAgIGNvbnN0IGRhdGEgPSBpbnN0cnVjdGlvbnNbMV0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgc3Rha2luZ0F1dGhvcml6ZVBhcmFtczogU3Rha2luZ0F1dGhvcml6ZVBhcmFtcyA9XG4gICAgICBkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZFdpdGhkcmF3QWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgY3VzdG9kaWFuQWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZFdpdGhkcmF3QWRkcmVzczogJycsXG4gICAgICAgICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6ICcnLFxuICAgICAgICAgICAgb2xkU3Rha2luZ0F1dGhvcml0eUFkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3U3Rha2luZ0F1dGhvcml0eUFkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH07XG4gICAgY29uc3QgZmVlU3RyaW5nID0gdGhpcy5jYWxjdWxhdGVGZWUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICdpZCcsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICdmZWUnLFxuICAgICAgICAnbWVtbycsXG4gICAgICBdLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVbdGhpcy50eXBlXS50b1N0cmluZygpLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogZmVlU3RyaW5nLFxuICAgICAgICBmZWVSYXRlOiB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlLFxuICAgICAgfSxcbiAgICAgIGJsb2NraGFzaDogdGhpcy5nZXROb25jZSgpLFxuICAgICAgZHVyYWJsZU5vbmNlOiBkdXJhYmxlTm9uY2UsXG4gICAgICBzdGFraW5nQXV0aG9yaXplOiBzdGFraW5nQXV0aG9yaXplUGFyYW1zLFxuICAgICAgdG9rZW5FbmFibGVtZW50czogW10sIC8vIEFsd2F5cyBpbmNsdWRlIHRva2VuRW5hYmxlbWVudHMgYXMgYW4gZW1wdHkgYXJyYXkgZm9yIGNvbnNpc3RlbmN5XG4gICAgfTtcbiAgfVxufVxuIl19
|