@bitgo/sdk-coin-eth 25.15.1 → 25.15.3

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.
@@ -43,18 +43,42 @@ export declare class Erc7984Token extends Eth {
43
43
  protected getTransactionBuilder(): TransactionBuilder;
44
44
  /** @inheritDoc */
45
45
  verifyTransaction(params: VerifyEthTransactionOptions): Promise<boolean>;
46
+ private isConsolidationTransaction;
47
+ private getWalletBaseAddress;
48
+ /**
49
+ * Verifies ERC-7984 forwarder consolidation (flush) transactions.
50
+ *
51
+ * Multisig shape:
52
+ * tx.to = wallet contract
53
+ * tx.data = sendMultiSig(forwarder, 0, callFromParent(token, 0, confidentialTransferNoProof(base, handle)), ...)
54
+ *
55
+ * TSS / direct shape:
56
+ * tx.to = forwarder contract
57
+ * tx.data = callFromParent(token, 0, confidentialTransferNoProof(base, handle))
58
+ */
59
+ private verifyConfidentialConsolidation;
46
60
  /**
47
61
  * Verifies a confidential token transfer (SendERC7984) transaction.
48
62
  *
49
- * With txHex (multisig second-signer, MPC post-signing):
50
- * 1. Decodes the sendMultiSig calldata and checks the inner token contract address.
51
- * 2. Requires the decoded recipient to match txParams.recipients[0].address or
52
- * buildParams.recipients[0].address at least one must be present.
53
- * 3. Confirms encryptedHandle and inputProof are structurally present.
54
- * 4. Validates txParams.recipients[0].amount is a positive integer and matches
55
- * buildParams.recipients[0].amount when both are present.
63
+ * With txHex two on-chain shapes are supported:
64
+ *
65
+ * sendMultiSig-wrapped (multisig / smart-contract wallet):
66
+ * tx.to = wallet contract
67
+ * tx.data = sendMultiSig(tokenAddr, 0, confidentialTransfer(recipient, handle, proof), ...)
68
+ * Token contract address is decoded from the sendMultiSig inner calldata.
69
+ *
70
+ * Direct call (hot / TSS EOA wallet):
71
+ * tx.to = token contract
72
+ * tx.data = confidentialTransfer(recipient, handle, proof)
73
+ * Token contract address is taken from tx.to.
74
+ *
75
+ * For both shapes the verifier checks:
76
+ * 1. Token contract address matches this coin's tokenContractAddress.
77
+ * 2. Decoded recipient matches txParams.recipients[0].address or buildParams.recipients[0].address.
78
+ * 3. encryptedHandle and inputProof are structurally present (non-empty).
79
+ * 4. txParams.recipients[0].amount is a positive integer and matches buildParams when both present.
56
80
  *
57
- * Without txHex (multisig first-signer, MPC pre-signing):
81
+ * Without txHex (first-signer / pre-signing path):
58
82
  * 1. Requires exactly one recipient in txParams.
59
83
  * 2. Validates txParams.recipients[0].address is a valid Ethereum address.
60
84
  * 3. Validates txParams.recipients[0].amount is a positive integer.
@@ -1 +1 @@
1
- {"version":3,"file":"erc7984Token.d.ts","sourceRoot":"","sources":["../../src/erc7984Token.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAAS,kBAAkB,EAA2B,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,SAAS,EACT,2BAA2B,EAG3B,2BAA2B,EAG5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,qBAAa,YAAa,SAAQ,GAAG;IACnC,SAAgB,WAAW,EAAE,kBAAkB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB,CAAC;IACxE,MAAM,CAAC,SAAS,EAAE,SAAS,CAGzB;gBAEU,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB;IAU7D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe;IAI1E,MAAM,CAAC,uBAAuB,CAC5B,YAAY,GAAE,kBAAkB,EAG/B,GACA,oBAAoB,EAAE;IAUzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,QAAQ,IAAI,MAAM;IAIlB,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;;;;;OAMG;IACH,sBAAsB,IAAI,OAAO;IAIjC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,kBAAkB;IAClB,eAAe,IAAI,YAAY;IAI/B,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAIrD,kBAAkB;IACZ,iBAAiB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;IAO9E;;;;;;;;;;;;;;;;OAgBG;YACW,0BAA0B;IA+GxC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;;;;OAQG;YACW,4BAA4B;IAqH1C;;;;;;;;;;;;;;;;OAgBG;IACH,8BAA8B,IAAI,2BAA2B;CAG9D"}
1
+ {"version":3,"file":"erc7984Token.d.ts","sourceRoot":"","sources":["../../src/erc7984Token.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAAS,kBAAkB,EAA2B,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,SAAS,EACT,2BAA2B,EAQ3B,2BAA2B,EAG5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,qBAAa,YAAa,SAAQ,GAAG;IACnC,SAAgB,WAAW,EAAE,kBAAkB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB,CAAC;IACxE,MAAM,CAAC,SAAS,EAAE,SAAS,CAGzB;gBAEU,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB;IAU7D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe;IAI1E,MAAM,CAAC,uBAAuB,CAC5B,YAAY,GAAE,kBAAkB,EAG/B,GACA,oBAAoB,EAAE;IAUzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,QAAQ,IAAI,MAAM;IAIlB,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;;;;;OAMG;IACH,sBAAsB,IAAI,OAAO;IAIjC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,kBAAkB;IAClB,eAAe,IAAI,YAAY;IAI/B,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAIrD,kBAAkB;IACZ,iBAAiB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9E,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,oBAAoB;IAS5B;;;;;;;;;;OAUG;YACW,+BAA+B;IA+E7C;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;YACW,0BAA0B;IAuIxC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;;;;OAQG;YACW,4BAA4B;IAqH1C;;;;;;;;;;;;;;;;OAgBG;IACH,8BAA8B,IAAI,2BAA2B;CAG9D"}
@@ -90,20 +90,122 @@ class Erc7984Token extends eth_1.Eth {
90
90
  if (params.txParams?.type === 'enabletoken') {
91
91
  return this.verifyEnableTokenTransaction(params);
92
92
  }
93
+ if (this.isConsolidationTransaction(params)) {
94
+ return this.verifyConfidentialConsolidation(params);
95
+ }
93
96
  return this.verifyConfidentialTransfer(params);
94
97
  }
98
+ isConsolidationTransaction(params) {
99
+ const { txParams, txPrebuild, verification } = params;
100
+ return !!(verification?.consolidationToBaseAddress ||
101
+ txPrebuild?.consolidateId ||
102
+ txParams?.type === 'consolidate' ||
103
+ txParams?.prebuildTx?.consolidateId);
104
+ }
105
+ getWalletBaseAddress(wallet) {
106
+ if (!wallet) {
107
+ return undefined;
108
+ }
109
+ const coinSpecific = typeof wallet.coinSpecific === 'function' ? wallet.coinSpecific() : wallet.coinSpecific;
110
+ const ethCoinSpecific = coinSpecific;
111
+ return ethCoinSpecific?.baseAddress ?? ethCoinSpecific?.rootAddress;
112
+ }
113
+ /**
114
+ * Verifies ERC-7984 forwarder consolidation (flush) transactions.
115
+ *
116
+ * Multisig shape:
117
+ * tx.to = wallet contract
118
+ * tx.data = sendMultiSig(forwarder, 0, callFromParent(token, 0, confidentialTransferNoProof(base, handle)), ...)
119
+ *
120
+ * TSS / direct shape:
121
+ * tx.to = forwarder contract
122
+ * tx.data = callFromParent(token, 0, confidentialTransferNoProof(base, handle))
123
+ */
124
+ async verifyConfidentialConsolidation(params) {
125
+ const { txParams, txPrebuild, wallet } = params;
126
+ if (!txPrebuild?.txHex) {
127
+ if (!txPrebuild?.consolidateId && !txParams?.prebuildTx?.consolidateId) {
128
+ throw new Error('verifyConfidentialConsolidation: missing consolidateId');
129
+ }
130
+ return true;
131
+ }
132
+ const txBuilder = this.getTransactionBuilder();
133
+ txBuilder.from(txPrebuild.txHex);
134
+ const tx = await txBuilder.build();
135
+ const txJson = tx.toJson();
136
+ let tokenContractAddress;
137
+ let parentAddress;
138
+ let encryptedHandle;
139
+ let forwarderAddress;
140
+ try {
141
+ if (txJson.data.startsWith(abstract_eth_1.sendMultisigMethodId)) {
142
+ const decoded = (0, abstract_eth_1.decodeSendMultiSigFlushERC7984Data)(txJson.data);
143
+ forwarderAddress = decoded.forwarderAddress;
144
+ tokenContractAddress = decoded.tokenContractAddress;
145
+ parentAddress = decoded.parentAddress;
146
+ encryptedHandle = decoded.encryptedHandle;
147
+ }
148
+ else if (txJson.data.startsWith(abstract_eth_1.callFromParentMethodId)) {
149
+ const decoded = (0, abstract_eth_1.decodeFlushERC7984ForwarderTokenCalldata)(txJson.data);
150
+ tokenContractAddress = decoded.tokenContractAddress;
151
+ parentAddress = decoded.parentAddress;
152
+ encryptedHandle = decoded.encryptedHandle;
153
+ forwarderAddress = txJson.to;
154
+ }
155
+ else {
156
+ throw new Error(`unexpected method ID ${txJson.data.slice(0, 10)}`);
157
+ }
158
+ }
159
+ catch (e) {
160
+ throw new Error(`verifyConfidentialConsolidation: failed to decode consolidation calldata — ${e.message}`);
161
+ }
162
+ if (tokenContractAddress.toLowerCase() !== this.tokenContractAddress.toLowerCase()) {
163
+ throw new Error(`verifyConfidentialConsolidation: token contract address mismatch — ` +
164
+ `expected ${this.tokenContractAddress}, got ${tokenContractAddress}`);
165
+ }
166
+ const baseAddress = this.getWalletBaseAddress(wallet);
167
+ if (!baseAddress) {
168
+ throw new Error('verifyConfidentialConsolidation: unable to determine wallet base address');
169
+ }
170
+ if (parentAddress.toLowerCase() !== baseAddress.toLowerCase()) {
171
+ throw new Error(`verifyConfidentialConsolidation: parent address mismatch — expected ${baseAddress}, got ${parentAddress}`);
172
+ }
173
+ if (!encryptedHandle || encryptedHandle === '0x') {
174
+ throw new Error('verifyConfidentialConsolidation: encryptedHandle is missing or empty in transaction calldata');
175
+ }
176
+ const expectedForwarder = txPrebuild.recipients?.[0]?.address ??
177
+ txPrebuild.txInfo?.recipients?.[0]?.address ??
178
+ txParams?.recipients?.[0]?.address;
179
+ if (forwarderAddress && expectedForwarder) {
180
+ if (forwarderAddress.toLowerCase() !== expectedForwarder.toLowerCase()) {
181
+ throw new Error(`verifyConfidentialConsolidation: forwarder address mismatch — ` +
182
+ `expected ${expectedForwarder}, got ${forwarderAddress}`);
183
+ }
184
+ }
185
+ return true;
186
+ }
95
187
  /**
96
188
  * Verifies a confidential token transfer (SendERC7984) transaction.
97
189
  *
98
- * With txHex (multisig second-signer, MPC post-signing):
99
- * 1. Decodes the sendMultiSig calldata and checks the inner token contract address.
100
- * 2. Requires the decoded recipient to match txParams.recipients[0].address or
101
- * buildParams.recipients[0].address at least one must be present.
102
- * 3. Confirms encryptedHandle and inputProof are structurally present.
103
- * 4. Validates txParams.recipients[0].amount is a positive integer and matches
104
- * buildParams.recipients[0].amount when both are present.
190
+ * With txHex two on-chain shapes are supported:
191
+ *
192
+ * sendMultiSig-wrapped (multisig / smart-contract wallet):
193
+ * tx.to = wallet contract
194
+ * tx.data = sendMultiSig(tokenAddr, 0, confidentialTransfer(recipient, handle, proof), ...)
195
+ * Token contract address is decoded from the sendMultiSig inner calldata.
196
+ *
197
+ * Direct call (hot / TSS EOA wallet):
198
+ * tx.to = token contract
199
+ * tx.data = confidentialTransfer(recipient, handle, proof)
200
+ * Token contract address is taken from tx.to.
201
+ *
202
+ * For both shapes the verifier checks:
203
+ * 1. Token contract address matches this coin's tokenContractAddress.
204
+ * 2. Decoded recipient matches txParams.recipients[0].address or buildParams.recipients[0].address.
205
+ * 3. encryptedHandle and inputProof are structurally present (non-empty).
206
+ * 4. txParams.recipients[0].amount is a positive integer and matches buildParams when both present.
105
207
  *
106
- * Without txHex (multisig first-signer, MPC pre-signing):
208
+ * Without txHex (first-signer / pre-signing path):
107
209
  * 1. Requires exactly one recipient in txParams.
108
210
  * 2. Validates txParams.recipients[0].address is a valid Ethereum address.
109
211
  * 3. Validates txParams.recipients[0].amount is a positive integer.
@@ -148,33 +250,58 @@ class Erc7984Token extends eth_1.Eth {
148
250
  txBuilder.from(txPrebuild.txHex);
149
251
  const tx = await txBuilder.build();
150
252
  const txJson = tx.toJson();
151
- let decoded;
253
+ let toAddress;
254
+ let tokenContractAddress;
255
+ let encryptedHandle;
256
+ let inputProof;
152
257
  try {
153
- decoded = (0, abstract_eth_1.decodeConfidentialTransferData)(txJson.data);
258
+ if (txJson.data.startsWith(abstract_eth_1.sendMultisigMethodId)) {
259
+ // sendMultiSig-wrapped path: smart-contract wallet relays the confidentialTransfer call.
260
+ // Token contract address is encoded inside the sendMultiSig calldata.
261
+ const decoded = (0, abstract_eth_1.decodeConfidentialTransferData)(txJson.data);
262
+ toAddress = decoded.toAddress;
263
+ tokenContractAddress = decoded.tokenContractAddress;
264
+ encryptedHandle = decoded.encryptedHandle;
265
+ inputProof = decoded.inputProof;
266
+ }
267
+ else if (txJson.data.startsWith(abstract_eth_1.confidentialTransferWithProofMethodId)) {
268
+ // Direct call path: hot/TSS EOA wallet calls the token contract directly.
269
+ // The transaction's `to` field is the token contract address.
270
+ if (!txJson.to) {
271
+ throw new Error('direct confidentialTransfer call is missing transaction to address');
272
+ }
273
+ const decoded = (0, abstract_eth_1.decodeDirectConfidentialTransferCalldata)(txJson.data);
274
+ toAddress = decoded.toAddress;
275
+ tokenContractAddress = txJson.to;
276
+ encryptedHandle = decoded.encryptedHandle;
277
+ inputProof = decoded.inputProof;
278
+ }
279
+ else {
280
+ throw new Error(`unexpected method ID ${txJson.data.slice(0, 10)}`);
281
+ }
154
282
  }
155
283
  catch (e) {
156
284
  throw new Error(`verifyConfidentialTransfer: failed to decode confidential transfer calldata — ${e.message}`);
157
285
  }
158
286
  // 1. Token contract address must match this coin
159
- if (decoded.tokenContractAddress.toLowerCase() !== this.tokenContractAddress.toLowerCase()) {
287
+ if (tokenContractAddress.toLowerCase() !== this.tokenContractAddress.toLowerCase()) {
160
288
  throw new Error(`verifyConfidentialTransfer: token contract address mismatch — ` +
161
- `expected ${this.tokenContractAddress}, got ${decoded.tokenContractAddress}`);
289
+ `expected ${this.tokenContractAddress}, got ${tokenContractAddress}`);
162
290
  }
163
291
  // 2. Recipient address must match txParams.recipients[0] or buildParams.recipients[0]
164
292
  const expectedRecipient = txParams?.recipients?.[0]?.address ?? txPrebuild.buildParams?.recipients?.[0]?.address;
165
293
  if (!expectedRecipient) {
166
294
  throw new Error('verifyConfidentialTransfer: missing expected recipient (provide txParams.recipients or txPrebuild.buildParams.recipients)');
167
295
  }
168
- if (decoded.toAddress.toLowerCase() !== expectedRecipient.toLowerCase()) {
169
- throw new Error(`verifyConfidentialTransfer: recipient address mismatch — ` +
170
- `expected ${expectedRecipient}, got ${decoded.toAddress}`);
296
+ if (toAddress.toLowerCase() !== expectedRecipient.toLowerCase()) {
297
+ throw new Error(`verifyConfidentialTransfer: recipient address mismatch — ` + `expected ${expectedRecipient}, got ${toAddress}`);
171
298
  }
172
299
  // 3. encryptedHandle must be a non-trivial hex value (not bare '0x')
173
- if (!decoded.encryptedHandle || decoded.encryptedHandle === '0x') {
300
+ if (!encryptedHandle || encryptedHandle === '0x') {
174
301
  throw new Error('verifyConfidentialTransfer: encryptedHandle is missing or empty in transaction calldata');
175
302
  }
176
303
  // 4. inputProof must be a non-trivial hex value
177
- if (!decoded.inputProof || decoded.inputProof === '0x') {
304
+ if (!inputProof || inputProof === '0x') {
178
305
  throw new Error('verifyConfidentialTransfer: inputProof is missing or empty in transaction calldata');
179
306
  }
180
307
  // 5. Verify plaintext intent: txParams amount must be valid and consistent with buildParams
@@ -325,4 +452,4 @@ Erc7984Token.coinNames = {
325
452
  Mainnet: 'eth',
326
453
  Testnet: 'hteth',
327
454
  };
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSw0Q0FBb0Y7QUFDcEYsc0RBUTZCO0FBRTdCLCtCQUE0QjtBQUM1QiwrQkFBMkM7QUFJM0MsTUFBYSxZQUFhLFNBQVEsU0FBRztJQVFuQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0Isa0ZBQWtGO1FBQ2xGLDRHQUE0RztRQUM1RywyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUEwQjtRQUN0RCxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLGVBQXFDO1FBQ25DLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtRQUN4QyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDekM7UUFFRCxNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFF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QUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCw4QkFBOEI7UUFDNUIsT0FBTyxJQUFJLDBDQUEyQixFQUFFLENBQUM7SUFDM0MsQ0FBQzs7QUF2WUgsb0NBd1lDO0FBcllRLHNCQUFTLEdBQWM7SUFDNUIsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQml0R29CYXNlLCBDb2luQ29uc3RydWN0b3IsIE1QQ0FsZ29yaXRobSwgTmFtZWRDb2luQ29uc3RydWN0b3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBjb2lucywgRXJjNzk4NFRva2VuQ29uZmlnLCBFdGhlcmV1bU5ldHdvcmssIHRva2VucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7XG4gIENvaW5OYW1lcyxcbiAgRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyLFxuICBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEsXG4gIGRlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YSxcbiAgVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zLFxuICBhY2xNdWx0aWNhbGxNZXRob2RJZCxcbiAgY2FsbEZyb21QYXJlbnRNZXRob2RJZCxcbn0gZnJvbSAnQGJpdGdvL2Fic3RyYWN0LWV0aCc7XG5cbmltcG9ydCB7IEV0aCB9IGZyb20gJy4vZXRoJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vbGliJztcblxuZXhwb3J0IHsgRXJjNzk4NFRva2VuQ29uZmlnIH07XG5cbmV4cG9ydCBjbGFzcyBFcmM3OTg0VG9rZW4gZXh0ZW5kcyBFdGgge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IEVyYzc5ODRUb2tlbkNvbmZpZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbmRNZXRob2ROYW1lOiAnc2VuZE11bHRpU2lnJyB8ICdzZW5kTXVsdGlTaWdUb2tlbic7XG4gIHN0YXRpYyBjb2luTmFtZXM6IENvaW5OYW1lcyA9IHtcbiAgICBNYWlubmV0OiAnZXRoJyxcbiAgICBUZXN0bmV0OiAnaHRldGgnLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHRva2VuQ29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW5zLmdldChFcmM3OTg0VG9rZW4uY29pbk5hbWVzW3Rva2VuQ29uZmlnLm5ldHdvcmtdKTtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICAgIHRoaXMudG9rZW5Db25maWcgPSB0b2tlbkNvbmZpZztcbiAgICAvLyBFUkM3OTg0IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgdXNlIHNlbmRNdWx0aVNpZyAobm90IHNlbmRNdWx0aVNpZ1Rva2VuKSBiZWNhdXNlXG4gICAgLy8gdGhlIGNhbGxkYXRhIHBhcmFtZXRlciBpcyByZXF1aXJlZCB0byBjYXJyeSBjb25maWRlbnRpYWxUcmFuc2ZlcihyZWNpcGllbnQsIGVuY3J5cHRlZEhhbmRsZSwgaW5wdXRQcm9vZikuXG4gICAgLy8gc2VuZE11bHRpU2lnVG9rZW4gaGFzIG5vIGRhdGEgcGFyYW1ldGVyIGFuZCBjYW5ub3QgY2FycnkgaW5uZXIgY2FsbGRhdGEuXG4gICAgdGhpcy5zZW5kTWV0aG9kTmFtZSA9ICdzZW5kTXVsdGlTaWcnO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3IoY29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWcpOiBDb2luQ29uc3RydWN0b3Ige1xuICAgIHJldHVybiAoYml0Z286IEJpdEdvQmFzZSkgPT4gbmV3IEVyYzc5ODRUb2tlbihiaXRnbywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhcbiAgICB0b2tlbkNvbmZpZ3M6IEVyYzc5ODRUb2tlbkNvbmZpZ1tdID0gW1xuICAgICAgLi4udG9rZW5zLmJpdGNvaW4uZXRoLmNvbmZpZGVudGlhbFRva2VucyxcbiAgICAgIC4uLnRva2Vucy50ZXN0bmV0LmV0aC5jb25maWRlbnRpYWxUb2tlbnMsXG4gICAgXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWdzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gRXJjNzk4NFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3IodG9rZW4pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnR5cGUsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50b2tlbkNvbnRyYWN0QWRkcmVzcywgY29pbkNvbnN0cnVjdG9yOiB0b2tlbkNvbnN0cnVjdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zQ3RvcnM7XG4gIH1cblxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5hbWU7XG4gIH1cblxuICBnZXQgY29pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmNvaW47XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5ldHdvcms7XG4gIH1cblxuICBnZXQgdG9rZW5Db250cmFjdEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgfVxuXG4gIGdldCBkZWNpbWFsUGxhY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcztcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdFUkM3OTg0IENvbmZpZGVudGlhbCBUb2tlbic7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMC5cbiAgICogRVJDLTc5ODQgY29uZmlkZW50aWFsIHRyYW5zZmVycyBhbHdheXMgY2FycnkgYW4gZW5jcnlwdGVkIGFtb3VudDsgemVyby12YWx1ZSBzZW5kcyBhcmUgbm90IG1lYW5pbmdmdWwuXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgZGF0YSBhbG9uZyB3aXRoIHRyYW5zYWN0aW9ucyB2aWEgdGhlIHN0YW5kYXJkIHRva2VuLXNlbmQgQVBJLlxuICAgKiBSZXR1cm5zIGZhbHNlIGJlY2F1c2UgRVJDLTc5ODQgc2VuZHMgdXNlIGNvbmZpZGVudGlhbFRyYW5zZmVyKCkgY2FsbGRhdGEgYnVpbHRcbiAgICogYnkgV1AsIG5vdCBhbiBhcmJpdHJhcnkgZGF0YSBmaWVsZCBvbiB0aGUgc2VuZCBwYXJhbXMuXG4gICAqIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJldmVudCBjYWxsZGF0YS1iYXNlZCBmbG93cyBsaWtlIGdldERlbGVnYXRpb25CdWlsZGVyKCksXG4gICAqIHdoaWNoIGJ5cGFzcyB0aGUgdG9rZW4tc2VuZCBwYXRoIGVudGlyZWx5LlxuICAgKi9cbiAgdHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuICdlY2RzYSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChwYXJhbXMudHhQYXJhbXM/LnR5cGUgPT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXIocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIGNvbmZpZGVudGlhbCB0b2tlbiB0cmFuc2ZlciAoU2VuZEVSQzc5ODQpIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBXaXRoIHR4SGV4IChtdWx0aXNpZyBzZWNvbmQtc2lnbmVyLCBNUEMgcG9zdC1zaWduaW5nKTpcbiAgICogIDEuIERlY29kZXMgdGhlIHNlbmRNdWx0aVNpZyBjYWxsZGF0YSBhbmQgY2hlY2tzIHRoZSBpbm5lciB0b2tlbiBjb250cmFjdCBhZGRyZXNzLlxuICAgKiAgMi4gUmVxdWlyZXMgdGhlIGRlY29kZWQgcmVjaXBpZW50IHRvIG1hdGNoIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyBvclxuICAgKiAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzIOKAlCBhdCBsZWFzdCBvbmUgbXVzdCBiZSBwcmVzZW50LlxuICAgKiAgMy4gQ29uZmlybXMgZW5jcnlwdGVkSGFuZGxlIGFuZCBpbnB1dFByb29mIGFyZSBzdHJ1Y3R1cmFsbHkgcHJlc2VudC5cbiAgICogIDQuIFZhbGlkYXRlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFtb3VudCBpcyBhIHBvc2l0aXZlIGludGVnZXIgYW5kIG1hdGNoZXNcbiAgICogICAgIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHNbMF0uYW1vdW50IHdoZW4gYm90aCBhcmUgcHJlc2VudC5cbiAgICpcbiAgICogV2l0aG91dCB0eEhleCAobXVsdGlzaWcgZmlyc3Qtc2lnbmVyLCBNUEMgcHJlLXNpZ25pbmcpOlxuICAgKiAgMS4gUmVxdWlyZXMgZXhhY3RseSBvbmUgcmVjaXBpZW50IGluIHR4UGFyYW1zLlxuICAgKiAgMi4gVmFsaWRhdGVzIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyBpcyBhIHZhbGlkIEV0aGVyZXVtIGFkZHJlc3MuXG4gICAqICAzLiBWYWxpZGF0ZXMgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hbW91bnQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICAgKiAgNC4gQ3Jvc3MtY2hlY2tzIGFkZHJlc3MgYW5kIGFtb3VudCBhZ2FpbnN0IGJ1aWxkUGFyYW1zIHdoZW4gdGhlIHNlcnZlciBoYXMgc3RvcmVkIHRoZSBpbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgLy8gTm8gcmF3IHR4IGF2YWlsYWJsZSAobXVsdGlzaWcgZmlyc3Qtc2lnbmVyIHBhdGgpLlxuICAgICAgLy8gVmFsaWRhdGUgRVJDNzk4NC1zcGVjaWZpYyBpbnZhcmlhbnRzIGZyb20gdHhQYXJhbXMgYW5kIGJ1aWxkUGFyYW1zLlxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHR4UGFyYW1zPy5yZWNpcGllbnRzO1xuICAgICAgaWYgKCFyZWNpcGllbnRzIHx8IHJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHJlY2lwaWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbnRyeScpO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2lwaWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgc3VwcG9ydCBleGFjdGx5IDEgcmVjaXBpZW50LCBnb3QgJHtyZWNpcGllbnRzLmxlbmd0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNpcGllbnQgPSByZWNpcGllbnRzWzBdO1xuICAgICAgaWYgKCFyZWNpcGllbnQuYWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50IGFkZHJlc3MgaXMgbWlzc2luZyBvciBpbnZhbGlkOiAke3JlY2lwaWVudC5hZGRyZXNzfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYW1vdW50U3RyID0gU3RyaW5nKHJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgaWYgKCFFcmM3OTg0VG9rZW4uaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcoYW1vdW50U3RyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBhbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc3RyaW5nIGluIGJhc2UgdW5pdHMsIGdvdCAnJHthbW91bnRTdHJ9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIENyb3NzLWNoZWNrIGFnYWluc3QgYnVpbGRQYXJhbXMgd2hlbiB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IHN0b3JlZCB0aGUgaW50ZW50XG4gICAgICBjb25zdCBidWlsZFBhcmFtc1JlY2lwaWVudCA9IHR4UHJlYnVpbGQ/LmJ1aWxkUGFyYW1zPy5yZWNpcGllbnRzPy5bMF07XG4gICAgICBpZiAoYnVpbGRQYXJhbXNSZWNpcGllbnQ/LmFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocmVjaXBpZW50LmFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gYnVpbGRQYXJhbXNSZWNpcGllbnQuYWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiByZWNpcGllbnQgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArXG4gICAgICAgICAgICAgIGB0eFBhcmFtcyBoYXMgJyR7cmVjaXBpZW50LmFkZHJlc3N9JyBidXQgYnVpbGRQYXJhbXMgaGFzICcke2J1aWxkUGFyYW1zUmVjaXBpZW50LmFkZHJlc3N9J2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBidWlsZFBhcmFtc0Ftb3VudCA9IGJ1aWxkUGFyYW1zUmVjaXBpZW50Py5hbW91bnQ7XG4gICAgICBpZiAoYnVpbGRQYXJhbXNBbW91bnQgIT09IHVuZGVmaW5lZCAmJiBidWlsZFBhcmFtc0Ftb3VudCAhPT0gYW1vdW50U3RyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtaXNtYXRjaCDigJQgdHhQYXJhbXMgaGFzICcke2Ftb3VudFN0cn0nIGJ1dCBidWlsZFBhcmFtcyBoYXMgJyR7YnVpbGRQYXJhbXNBbW91bnR9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGFuZCBkZWNvZGUgdGhlIHJhdyB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZyb20odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgIGxldCBkZWNvZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGE+O1xuICAgIHRyeSB7XG4gICAgICBkZWNvZGVkID0gZGVjb2RlQ29uZmlkZW50aWFsVHJhbnNmZXJEYXRhKHR4SnNvbi5kYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogZmFpbGVkIHRvIGRlY29kZSBjb25maWRlbnRpYWwgdHJhbnNmZXIgY2FsbGRhdGEg4oCUICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAxLiBUb2tlbiBjb250cmFjdCBhZGRyZXNzIG11c3QgbWF0Y2ggdGhpcyBjb2luXG4gICAgaWYgKGRlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogdG9rZW4gY29udHJhY3QgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArXG4gICAgICAgICAgYGV4cGVjdGVkICR7dGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzc30sIGdvdCAke2RlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAyLiBSZWNpcGllbnQgYWRkcmVzcyBtdXN0IG1hdGNoIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0gb3IgYnVpbGRQYXJhbXMucmVjaXBpZW50c1swXVxuICAgIGNvbnN0IGV4cGVjdGVkUmVjaXBpZW50ID0gdHhQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcyA/PyB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFkZHJlc3M7XG4gICAgaWYgKCFleHBlY3RlZFJlY2lwaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IG1pc3NpbmcgZXhwZWN0ZWQgcmVjaXBpZW50IChwcm92aWRlIHR4UGFyYW1zLnJlY2lwaWVudHMgb3IgdHhQcmVidWlsZC5idWlsZFBhcmFtcy5yZWNpcGllbnRzKSdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZWNvZGVkLnRvQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBleHBlY3RlZFJlY2lwaWVudC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgK1xuICAgICAgICAgIGBleHBlY3RlZCAke2V4cGVjdGVkUmVjaXBpZW50fSwgZ290ICR7ZGVjb2RlZC50b0FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBlbmNyeXB0ZWRIYW5kbGUgbXVzdCBiZSBhIG5vbi10cml2aWFsIGhleCB2YWx1ZSAobm90IGJhcmUgJzB4JylcbiAgICBpZiAoIWRlY29kZWQuZW5jcnlwdGVkSGFuZGxlIHx8IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlID09PSAnMHgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBlbmNyeXB0ZWRIYW5kbGUgaXMgbWlzc2luZyBvciBlbXB0eSBpbiB0cmFuc2FjdGlvbiBjYWxsZGF0YScpO1xuICAgIH1cblxuICAgIC8vIDQuIGlucHV0UHJvb2YgbXVzdCBiZSBhIG5vbi10cml2aWFsIGhleCB2YWx1ZVxuICAgIGlmICghZGVjb2RlZC5pbnB1dFByb29mIHx8IGRlY29kZWQuaW5wdXRQcm9vZiA9PT0gJzB4Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogaW5wdXRQcm9vZiBpcyBtaXNzaW5nIG9yIGVtcHR5IGluIHRyYW5zYWN0aW9uIGNhbGxkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gNS4gVmVyaWZ5IHBsYWludGV4dCBpbnRlbnQ6IHR4UGFyYW1zIGFtb3VudCBtdXN0IGJlIHZhbGlkIGFuZCBjb25zaXN0ZW50IHdpdGggYnVpbGRQYXJhbXNcbiAgICBjb25zdCByYXdUeFBhcmFtc0Ftb3VudCA9IHR4UGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFtb3VudDtcbiAgICBpZiAocmF3VHhQYXJhbXNBbW91bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHhQYXJhbXNBbW91bnQgPSBTdHJpbmcocmF3VHhQYXJhbXNBbW91bnQpO1xuICAgICAgaWYgKCFFcmM3OTg0VG9rZW4uaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodHhQYXJhbXNBbW91bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcgaW4gYmFzZSB1bml0cywgZ290ICcke3R4UGFyYW1zQW1vdW50fSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBidWlsZFBhcmFtc0Ftb3VudCA9IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYW1vdW50O1xuICAgICAgaWYgKGJ1aWxkUGFyYW1zQW1vdW50ICE9PSB1bmRlZmluZWQgJiYgdHhQYXJhbXNBbW91bnQgIT09IGJ1aWxkUGFyYW1zQW1vdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtaXNtYXRjaCDigJQgdHhQYXJhbXMgaGFzICcke3R4UGFyYW1zQW1vdW50fScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlxcZCskLy50ZXN0KHZhbHVlKSAmJiBCaWdJbnQodmFsdWUpID4gMG47XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uIGZvciBFUkMtNzk4NCBkZWNyeXB0aW9uIGRlbGVnYXRpb24uXG4gICAqXG4gICAqIFRTUyBwYXRoOiBkZWNvZGVzIHRoZSByYXcgdHggYW5kIHZlcmlmaWVzIGl0IGNhbGxzIHRoZSBBQ0wgY29udHJhY3Qgd2l0aFxuICAgKiBjYWxsZGF0YSB0aGF0IGNvdmVycyBhbGwgcmVxdWVzdGVkIHRva2VuIGNvbnRyYWN0IGFkZHJlc3Nlcy5cbiAgICpcbiAgICogTXVsdGlzaWcgcGF0aDogdmVyaWZpZXMgdGhlIGJ1aWxkUGFyYW1zIHJlY2lwaWVudHMgY2FycnkgdGhlIGNvcnJlY3QgdG9rZW5OYW1lc1xuICAgKiBhbmQgemVybyBhbW91bnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0VHlwZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHdhbGxldFR5cGUgPT09ICd0c3MnKSB7XG4gICAgICAvLyBUU1MgcGF0aDogZnVsbCByYXctdHggZGVjb2RlXG4gICAgICBjb25zdCBlbmFibGVUb2tlbnMgPSB0eFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBpZiAoIWVuYWJsZVRva2VucyB8fCBlbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogZW5hYmxlVG9rZW5zIG11c3QgYmUgbm9uLWVtcHR5IGZvciBUU1MgcGF0aCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgcmVxdWVzdGVkIHRva2VuIG5hbWVzIOKGkiBjb250cmFjdCBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEFkZHJlc3NlcyA9IGVuYWJsZVRva2Vucy5tYXAoKHQpID0+IHtcbiAgICAgICAgY29uc3QgdG9rZW5Db2luID0gdGhpcy5iaXRnby5jb2luKHQubmFtZSkgYXMgRXJjNzk4NFRva2VuO1xuICAgICAgICByZXR1cm4gdG9rZW5Db2luLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUGFyc2UgdGhlIHJhdyB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mcm9tKHR4UHJlYnVpbGQudHhIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gdGFyZ2V0cyB0aGUgY29ycmVjdCBjb250cmFjdCBiYXNlZCBvbiBjYWxsZGF0YSBzaGFwZVxuICAgICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yaygpIGFzIEV0aGVyZXVtTmV0d29yaztcbiAgICAgIGNvbnN0IGFjbENvbnRyYWN0QWRkcmVzcyA9IG5ldHdvcms/LnphbWFBY2xDb250cmFjdEFkZHJlc3M7XG4gICAgICBpZiAoIWFjbENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHphbWFBY2xDb250cmFjdEFkZHJlc3Mgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgbmV0d29yaycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eEpzb24udG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiBpcyBtaXNzaW5nIHJlY2lwaWVudCBhZGRyZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluc3BlY3QgY2FsbGRhdGEgbWV0aG9kIElEIHRvIGRpc3Rpbmd1aXNoIHJvb3Qgd2FsbGV0IGZyb20gZm9yd2FyZGVyIHdhbGxldDpcbiAgICAgIC8vICAgYWNsTXVsdGljYWxsTWV0aG9kSWQgICDihpIgcm9vdCB3YWxsZXQ6IHRvID0gQUNMIGNvbnRyYWN0IGRpcmVjdGx5XG4gICAgICAvLyAgIGNhbGxGcm9tUGFyZW50TWV0aG9kSWQg4oaSIGZvcndhcmRlciB3YWxsZXQ6IHRvID0gZm9yd2FyZGVyLCBBQ0wgYWRkcmVzcyBpcyBpbnNpZGUgY2FsbGRhdGFcbiAgICAgIGNvbnN0IGNhbGxkYXRhTWV0aG9kSWQgPSB0eEpzb24uZGF0YS5zbGljZSgwLCAxMCk7XG4gICAgICBpZiAoY2FsbGRhdGFNZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICAgICAgLy8gUm9vdCB3YWxsZXQgKGJhc2UgYWRkcmVzcyk6IHR4IGNhbGxzIHRoZSBBQ0wgY29udHJhY3QgZGlyZWN0bHlcbiAgICAgICAgaWYgKHR4SnNvbi50by50b0xvd2VyQ2FzZSgpICE9PSBhY2xDb250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiB0YXJnZXQgJHt0eEpzb24udG99IGRvZXMgbm90IG1hdGNoIEFDTCBjb250cmFjdCAke2FjbENvbnRyYWN0QWRkcmVzc31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjYWxsZGF0YU1ldGhvZElkID09PSBjYWxsRnJvbVBhcmVudE1ldGhvZElkKSB7XG4gICAgICAgIC8vIEZvcndhcmRlciB3YWxsZXQ6IHR4IGNhbGxzIHRoZSBmb3J3YXJkZXIsIHdoaWNoIGNhbGxzIHRoZSBBQ0wgdmlhIGNhbGxGcm9tUGFyZW50LlxuICAgICAgICAvLyBUaGUgZm9yd2FyZGVyIGFkZHJlc3MgaXMgd2FsbGV0LXNwZWNpZmljIGFuZCBjYW5ub3QgYmUgc3RhdGljYWxseSB2ZXJpZmllZCBoZXJlO1xuICAgICAgICAvLyB0b2tlbiBhZGRyZXNzIGNvcnJlY3RuZXNzIGlzIHN0aWxsIHZlcmlmaWVkIGJlbG93IHZpYSBjYWxsZGF0YSBkZWNvZGluZy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogdW5yZWNvZ25pc2VkIGNhbGxkYXRhIG1ldGhvZCBJRCAke2NhbGxkYXRhTWV0aG9kSWR9OyBleHBlY3RlZCBtdWx0aWNhbGwgb3IgY2FsbEZyb21QYXJlbnRgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSB2YWx1ZSBpcyAwXG4gICAgICBpZiAodHhKc29uLnZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBleHBlY3RlZCB0cmFuc2FjdGlvbiB2YWx1ZSAwIGJ1dCBnb3QgJHt0eEpzb24udmFsdWV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY29kZSB0b2tlbiBhZGRyZXNzZXMgZnJvbSBjYWxsZGF0YSBhbmQgdmVyaWZ5IGFsbCByZXF1ZXN0ZWQgdG9rZW5zIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBkZWNvZGVkQWRkcmVzc2VzID0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkIG9mIHJlcXVlc3RlZEFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIWRlY29kZWRBZGRyZXNzZXMuaW5jbHVkZXMocmVxdWVzdGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBkZWxlZ2F0aW9uIGNhbGxkYXRhYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpc2lnIHBhdGg6IGJ1aWxkUGFyYW1zLWxldmVsIGNoZWNrXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cyBhc1xuICAgICAgICB8IEFycmF5PHsgdG9rZW5OYW1lPzogc3RyaW5nOyBhbW91bnQ/OiBzdHJpbmcgfT5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBtaXNzaW5nIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgZm9yIG11bHRpc2lnIHBhdGgnKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIHJlcXVlc3RlZCB0b2tlbiBuYW1lcyBmcm9tIHR4UGFyYW1zXG4gICAgICBjb25zdCByZXF1ZXN0ZWRUb2tlbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKHR4UGFyYW1zLmVuYWJsZVRva2VucyAmJiB0eFBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXF1ZXN0ZWRUb2tlbk5hbWVzLnB1c2goLi4udHhQYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodCkgPT4gdC5uYW1lKSk7XG4gICAgICB9IGVsc2UgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgJiYgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcXVlc3RlZFRva2VuTmFtZXMucHVzaCguLi50eFBhcmFtcy5yZWNpcGllbnRzLm1hcCgocjogYW55KSA9PiByLnRva2VuTmFtZSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IGFsbCByZWNpcGllbnRzIGhhdmUgdG9rZW5OYW1lIGFuZCBhbW91bnQgPSAnMCdcbiAgICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIHJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFyZWNpcGllbnQudG9rZW5OYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZWNpcGllbnQgaXMgbWlzc2luZyB0b2tlbk5hbWUgaW4gYnVpbGRQYXJhbXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjaXBpZW50LmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IGV4cGVjdGVkIGFtb3VudCAwIGZvciB0b2tlbiBlbmFibGVtZW50IGJ1dCBnb3QgJHtyZWNpcGllbnQuYW1vdW50fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSByZXF1ZXN0ZWQgdG9rZW4gbmFtZXMgYXJlIHByZXNlbnQgaW4gcmVjaXBpZW50c1xuICAgICAgaWYgKHJlcXVlc3RlZFRva2VuTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZWNpcGllbnRUb2tlbk5hbWVzID0gcmVjaXBpZW50cy5tYXAoKHIpID0+IHIudG9rZW5OYW1lKTtcbiAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWQgb2YgcmVxdWVzdGVkVG9rZW5OYW1lcykge1xuICAgICAgICAgIGlmICghcmVjaXBpZW50VG9rZW5OYW1lcy5pbmNsdWRlcyhyZXF1ZXN0ZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBidWlsZFBhcmFtcyByZWNpcGllbnRzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIgZm9yIGNvbnN0cnVjdGluZyBaYW1hIEFDTCBkZWNyeXB0aW9uXG4gICAqIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBUaGUgYnVpbGRlciBwcm9kdWNlcyBhIERlY3J5cHRpb25EZWxlZ2F0aW9uVHhSZXF1ZXN0IHt0bywgZGF0YSwgdmFsdWV9IHRoYXQgaXNcbiAgICogd2FsbGV0LXR5cGUtYWdub3N0aWMg4oCUIFdQIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBzaWduaW5nIHBhdGg6XG4gICAqIC0gTVBDOiBzdWJtaXQgYXMgYSByYXcgVFNTIHRyYW5zYWN0aW9uXG4gICAqIC0gTXVsdGlzaWc6IHdyYXAgaW4gc2VuZE11bHRpU2lnKHdhbGxldENvbnRyYWN0LCB0bywgMCwgZGF0YSwgLi4uKVxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiAgIGNvbnN0IHJlcSA9IGNvaW4uZ2V0RGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyKCkuYnVpbGQoe1xuICAgKiAgICAgYWNsQ29udHJhY3RBZGRyZXNzOiAnMHhmMEZmLi4uJyxcbiAgICogICAgIGRlbGVnYXRlQWRkcmVzczogICAgZW50ZXJwcmlzZVZpZXdpbmdLZXksXG4gICAqICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzOiBbdG9rZW5BZGRyZXNzXSxcbiAgICogICAgIGV4cGlyeVRpbWVzdGFtcDogICAgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyAzNjUgKiA4NjQwMCxcbiAgICogICB9KTtcbiAgICovXG4gIGdldERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlcigpOiBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyKCk7XG4gIH1cbn1cbiJdfQ==
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSw0Q0FBb0Y7QUFDcEYsc0RBYTZCO0FBRTdCLCtCQUE0QjtBQUM1QiwrQkFBMkM7QUFJM0MsTUFBYSxZQUFhLFNBQVEsU0FBRztJQVFuQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0Isa0ZBQWtGO1FBQ2xGLDRHQUE0RztRQUM1RywyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUEwQjtRQUN0RCxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLGVBQXFDO1FBQ25DLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtRQUN4QyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDekM7UUFFRCxNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFF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RyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9ELEtBQUssTUFBTSxTQUFTLElBQUksbUJBQW1CLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUM3QyxNQUFNLElBQUksS0FBSyxDQUNiLGlEQUFpRCxTQUFTLHNDQUFzQyxDQUNqRyxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCw4QkFBOEI7UUFDNUIsT0FBTyxJQUFJLDBDQUEyQixFQUFFLENBQUM7SUFDM0MsQ0FBQzs7QUF6aEJILG9DQTBoQkM7QUF2aEJRLHNCQUFTLEdBQWM7SUFDNUIsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQml0R29CYXNlLCBDb2luQ29uc3RydWN0b3IsIE1QQ0FsZ29yaXRobSwgTmFtZWRDb2luQ29uc3RydWN0b3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBjb2lucywgRXJjNzk4NFRva2VuQ29uZmlnLCBFdGhlcmV1bU5ldHdvcmssIHRva2VucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7XG4gIENvaW5OYW1lcyxcbiAgRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyLFxuICBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEsXG4gIGRlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YSxcbiAgZGVjb2RlRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJDYWxsZGF0YSxcbiAgZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YSxcbiAgZGVjb2RlU2VuZE11bHRpU2lnRmx1c2hFUkM3OTg0RGF0YSxcbiAgc2VuZE11bHRpc2lnTWV0aG9kSWQsXG4gIGNvbmZpZGVudGlhbFRyYW5zZmVyV2l0aFByb29mTWV0aG9kSWQsXG4gIFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgYWNsTXVsdGljYWxsTWV0aG9kSWQsXG4gIGNhbGxGcm9tUGFyZW50TWV0aG9kSWQsXG59IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1ldGgnO1xuXG5pbXBvcnQgeyBFdGggfSBmcm9tICcuL2V0aCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2xpYic7XG5cbmV4cG9ydCB7IEVyYzc5ODRUb2tlbkNvbmZpZyB9O1xuXG5leHBvcnQgY2xhc3MgRXJjNzk4NFRva2VuIGV4dGVuZHMgRXRoIHtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuQ29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZW5kTWV0aG9kTmFtZTogJ3NlbmRNdWx0aVNpZycgfCAnc2VuZE11bHRpU2lnVG9rZW4nO1xuICBzdGF0aWMgY29pbk5hbWVzOiBDb2luTmFtZXMgPSB7XG4gICAgTWFpbm5ldDogJ2V0aCcsXG4gICAgVGVzdG5ldDogJ2h0ZXRoJyxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCB0b2tlbkNvbmZpZzogRXJjNzk4NFRva2VuQ29uZmlnKSB7XG4gICAgY29uc3Qgc3RhdGljc0NvaW4gPSBjb2lucy5nZXQoRXJjNzk4NFRva2VuLmNvaW5OYW1lc1t0b2tlbkNvbmZpZy5uZXR3b3JrXSk7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgICB0aGlzLnRva2VuQ29uZmlnID0gdG9rZW5Db25maWc7XG4gICAgLy8gRVJDNzk4NCBjb25maWRlbnRpYWwgdHJhbnNmZXJzIHVzZSBzZW5kTXVsdGlTaWcgKG5vdCBzZW5kTXVsdGlTaWdUb2tlbikgYmVjYXVzZVxuICAgIC8vIHRoZSBjYWxsZGF0YSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgdG8gY2FycnkgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBlbmNyeXB0ZWRIYW5kbGUsIGlucHV0UHJvb2YpLlxuICAgIC8vIHNlbmRNdWx0aVNpZ1Rva2VuIGhhcyBubyBkYXRhIHBhcmFtZXRlciBhbmQgY2Fubm90IGNhcnJ5IGlubmVyIGNhbGxkYXRhLlxuICAgIHRoaXMuc2VuZE1ldGhvZE5hbWUgPSAnc2VuZE11bHRpU2lnJztcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9yKGNvbmZpZzogRXJjNzk4NFRva2VuQ29uZmlnKTogQ29pbkNvbnN0cnVjdG9yIHtcbiAgICByZXR1cm4gKGJpdGdvOiBCaXRHb0Jhc2UpID0+IG5ldyBFcmM3OTg0VG9rZW4oYml0Z28sIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoXG4gICAgdG9rZW5Db25maWdzOiBFcmM3OTg0VG9rZW5Db25maWdbXSA9IFtcbiAgICAgIC4uLnRva2Vucy5iaXRjb2luLmV0aC5jb25maWRlbnRpYWxUb2tlbnMsXG4gICAgICAuLi50b2tlbnMudGVzdG5ldC5ldGguY29uZmlkZW50aWFsVG9rZW5zLFxuICAgIF1cbiAgKTogTmFtZWRDb2luQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgdG9rZW5zQ3RvcnM6IE5hbWVkQ29pbkNvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VuQ29uZmlncykge1xuICAgICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IEVyYzc5ODRUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9yKHRva2VuKTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50eXBlLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgICB0b2tlbnNDdG9ycy5wdXNoKHsgbmFtZTogdG9rZW4udG9rZW5Db250cmFjdEFkZHJlc3MsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc0N0b3JzO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50eXBlO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uYW1lO1xuICB9XG5cbiAgZ2V0IGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb2luO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uZXR3b3JrO1xuICB9XG5cbiAgZ2V0IHRva2VuQ29udHJhY3RBZGRyZXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gIH1cblxuICBnZXQgZGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXM7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnRVJDNzk4NCBDb25maWRlbnRpYWwgVG9rZW4nO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy50b2tlbkNvbmZpZy5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIHZhbHVlIG9mIDAuXG4gICAqIEVSQy03OTg0IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgYWx3YXlzIGNhcnJ5IGFuIGVuY3J5cHRlZCBhbW91bnQ7IHplcm8tdmFsdWUgc2VuZHMgYXJlIG5vdCBtZWFuaW5nZnVsLlxuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIGRhdGEgYWxvbmcgd2l0aCB0cmFuc2FjdGlvbnMgdmlhIHRoZSBzdGFuZGFyZCB0b2tlbi1zZW5kIEFQSS5cbiAgICogUmV0dXJucyBmYWxzZSBiZWNhdXNlIEVSQy03OTg0IHNlbmRzIHVzZSBjb25maWRlbnRpYWxUcmFuc2ZlcigpIGNhbGxkYXRhIGJ1aWx0XG4gICAqIGJ5IFdQLCBub3QgYW4gYXJiaXRyYXJ5IGRhdGEgZmllbGQgb24gdGhlIHNlbmQgcGFyYW1zLlxuICAgKiBOb3RlOiB0aGlzIGRvZXMgbm90IHByZXZlbnQgY2FsbGRhdGEtYmFzZWQgZmxvd3MgbGlrZSBnZXREZWxlZ2F0aW9uQnVpbGRlcigpLFxuICAgKiB3aGljaCBieXBhc3MgdGhlIHRva2VuLXNlbmQgcGF0aCBlbnRpcmVseS5cbiAgICovXG4gIHRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWNkc2EnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zYWN0aW9uQnVpbGRlcigpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCh0aGlzLmdldEJhc2VDaGFpbigpKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAocGFyYW1zLnR4UGFyYW1zPy50eXBlID09PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ29uc29saWRhdGlvblRyYW5zYWN0aW9uKHBhcmFtcykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXIocGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB2ZXJpZmljYXRpb24gfSA9IHBhcmFtcztcbiAgICByZXR1cm4gISEoXG4gICAgICB2ZXJpZmljYXRpb24/LmNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzIHx8XG4gICAgICB0eFByZWJ1aWxkPy5jb25zb2xpZGF0ZUlkIHx8XG4gICAgICB0eFBhcmFtcz8udHlwZSA9PT0gJ2NvbnNvbGlkYXRlJyB8fFxuICAgICAgdHhQYXJhbXM/LnByZWJ1aWxkVHg/LmNvbnNvbGlkYXRlSWRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYWxsZXRCYXNlQWRkcmVzcyh3YWxsZXQ6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9uc1snd2FsbGV0J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghd2FsbGV0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB0eXBlb2Ygd2FsbGV0LmNvaW5TcGVjaWZpYyA9PT0gJ2Z1bmN0aW9uJyA/IHdhbGxldC5jb2luU3BlY2lmaWMoKSA6IHdhbGxldC5jb2luU3BlY2lmaWM7XG4gICAgY29uc3QgZXRoQ29pblNwZWNpZmljID0gY29pblNwZWNpZmljIGFzIHsgYmFzZUFkZHJlc3M/OiBzdHJpbmc7IHJvb3RBZGRyZXNzPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGV0aENvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgPz8gZXRoQ29pblNwZWNpZmljPy5yb290QWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBFUkMtNzk4NCBmb3J3YXJkZXIgY29uc29saWRhdGlvbiAoZmx1c2gpIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogTXVsdGlzaWcgc2hhcGU6XG4gICAqICAgdHgudG8gICA9IHdhbGxldCBjb250cmFjdFxuICAgKiAgIHR4LmRhdGEgPSBzZW5kTXVsdGlTaWcoZm9yd2FyZGVyLCAwLCBjYWxsRnJvbVBhcmVudCh0b2tlbiwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mKGJhc2UsIGhhbmRsZSkpLCAuLi4pXG4gICAqXG4gICAqIFRTUyAvIGRpcmVjdCBzaGFwZTpcbiAgICogICB0eC50byAgID0gZm9yd2FyZGVyIGNvbnRyYWN0XG4gICAqICAgdHguZGF0YSA9IGNhbGxGcm9tUGFyZW50KHRva2VuLCAwLCBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2YoYmFzZSwgaGFuZGxlKSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgaWYgKCF0eFByZWJ1aWxkPy5jb25zb2xpZGF0ZUlkICYmICF0eFBhcmFtcz8ucHJlYnVpbGRUeD8uY29uc29saWRhdGVJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IG1pc3NpbmcgY29uc29saWRhdGVJZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gICAgbGV0IHBhcmVudEFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG4gICAgbGV0IGZvcndhcmRlckFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHhKc29uLmRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZCkpIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVNlbmRNdWx0aVNpZ0ZsdXNoRVJDNzk4NERhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICBmb3J3YXJkZXJBZGRyZXNzID0gZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzO1xuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9IGRlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gICAgICAgIHBhcmVudEFkZHJlc3MgPSBkZWNvZGVkLnBhcmVudEFkZHJlc3M7XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgfSBlbHNlIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKGNhbGxGcm9tUGFyZW50TWV0aG9kSWQpKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSBkZWNvZGVkLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICAgICAgICBwYXJlbnRBZGRyZXNzID0gZGVjb2RlZC5wYXJlbnRBZGRyZXNzO1xuICAgICAgICBlbmNyeXB0ZWRIYW5kbGUgPSBkZWNvZGVkLmVuY3J5cHRlZEhhbmRsZTtcbiAgICAgICAgZm9yd2FyZGVyQWRkcmVzcyA9IHR4SnNvbi50bztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtZXRob2QgSUQgJHt0eEpzb24uZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogZmFpbGVkIHRvIGRlY29kZSBjb25zb2xpZGF0aW9uIGNhbGxkYXRhIOKAlCAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogdG9rZW4gY29udHJhY3QgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArXG4gICAgICAgICAgYGV4cGVjdGVkICR7dGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzc30sIGdvdCAke3Rva2VuQ29udHJhY3RBZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLmdldFdhbGxldEJhc2VBZGRyZXNzKHdhbGxldCk7XG4gICAgaWYgKCFiYXNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiB1bmFibGUgdG8gZGV0ZXJtaW5lIHdhbGxldCBiYXNlIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgaWYgKHBhcmVudEFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gYmFzZUFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogcGFyZW50IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGV4cGVjdGVkICR7YmFzZUFkZHJlc3N9LCBnb3QgJHtwYXJlbnRBZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNyeXB0ZWRIYW5kbGUgfHwgZW5jcnlwdGVkSGFuZGxlID09PSAnMHgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IGVuY3J5cHRlZEhhbmRsZSBpcyBtaXNzaW5nIG9yIGVtcHR5IGluIHRyYW5zYWN0aW9uIGNhbGxkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRGb3J3YXJkZXIgPVxuICAgICAgdHhQcmVidWlsZC5yZWNpcGllbnRzPy5bMF0/LmFkZHJlc3MgPz9cbiAgICAgIHR4UHJlYnVpbGQudHhJbmZvPy5yZWNpcGllbnRzPy5bMF0/LmFkZHJlc3MgPz9cbiAgICAgIHR4UGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFkZHJlc3M7XG4gICAgaWYgKGZvcndhcmRlckFkZHJlc3MgJiYgZXhwZWN0ZWRGb3J3YXJkZXIpIHtcbiAgICAgIGlmIChmb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IGV4cGVjdGVkRm9yd2FyZGVyLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiBmb3J3YXJkZXIgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQgJHtleHBlY3RlZEZvcndhcmRlcn0sIGdvdCAke2ZvcndhcmRlckFkZHJlc3N9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGEgY29uZmlkZW50aWFsIHRva2VuIHRyYW5zZmVyIChTZW5kRVJDNzk4NCkgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFdpdGggdHhIZXgg4oCUIHR3byBvbi1jaGFpbiBzaGFwZXMgYXJlIHN1cHBvcnRlZDpcbiAgICpcbiAgICogICBzZW5kTXVsdGlTaWctd3JhcHBlZCAobXVsdGlzaWcgLyBzbWFydC1jb250cmFjdCB3YWxsZXQpOlxuICAgKiAgICAgdHgudG8gICA9IHdhbGxldCBjb250cmFjdFxuICAgKiAgICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyh0b2tlbkFkZHIsIDAsIGNvbmZpZGVudGlhbFRyYW5zZmVyKHJlY2lwaWVudCwgaGFuZGxlLCBwcm9vZiksIC4uLilcbiAgICogICAgIFRva2VuIGNvbnRyYWN0IGFkZHJlc3MgaXMgZGVjb2RlZCBmcm9tIHRoZSBzZW5kTXVsdGlTaWcgaW5uZXIgY2FsbGRhdGEuXG4gICAqXG4gICAqICAgRGlyZWN0IGNhbGwgKGhvdCAvIFRTUyBFT0Egd2FsbGV0KTpcbiAgICogICAgIHR4LnRvICAgPSB0b2tlbiBjb250cmFjdFxuICAgKiAgICAgdHguZGF0YSA9IGNvbmZpZGVudGlhbFRyYW5zZmVyKHJlY2lwaWVudCwgaGFuZGxlLCBwcm9vZilcbiAgICogICAgIFRva2VuIGNvbnRyYWN0IGFkZHJlc3MgaXMgdGFrZW4gZnJvbSB0eC50by5cbiAgICpcbiAgICogICBGb3IgYm90aCBzaGFwZXMgdGhlIHZlcmlmaWVyIGNoZWNrczpcbiAgICogICAgIDEuIFRva2VuIGNvbnRyYWN0IGFkZHJlc3MgbWF0Y2hlcyB0aGlzIGNvaW4ncyB0b2tlbkNvbnRyYWN0QWRkcmVzcy5cbiAgICogICAgIDIuIERlY29kZWQgcmVjaXBpZW50IG1hdGNoZXMgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzIG9yIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcy5cbiAgICogICAgIDMuIGVuY3J5cHRlZEhhbmRsZSBhbmQgaW5wdXRQcm9vZiBhcmUgc3RydWN0dXJhbGx5IHByZXNlbnQgKG5vbi1lbXB0eSkuXG4gICAqICAgICA0LiB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFtb3VudCBpcyBhIHBvc2l0aXZlIGludGVnZXIgYW5kIG1hdGNoZXMgYnVpbGRQYXJhbXMgd2hlbiBib3RoIHByZXNlbnQuXG4gICAqXG4gICAqIFdpdGhvdXQgdHhIZXggKGZpcnN0LXNpZ25lciAvIHByZS1zaWduaW5nIHBhdGgpOlxuICAgKiAgMS4gUmVxdWlyZXMgZXhhY3RseSBvbmUgcmVjaXBpZW50IGluIHR4UGFyYW1zLlxuICAgKiAgMi4gVmFsaWRhdGVzIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyBpcyBhIHZhbGlkIEV0aGVyZXVtIGFkZHJlc3MuXG4gICAqICAzLiBWYWxpZGF0ZXMgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hbW91bnQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICAgKiAgNC4gQ3Jvc3MtY2hlY2tzIGFkZHJlc3MgYW5kIGFtb3VudCBhZ2FpbnN0IGJ1aWxkUGFyYW1zIHdoZW4gdGhlIHNlcnZlciBoYXMgc3RvcmVkIHRoZSBpbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgLy8gTm8gcmF3IHR4IGF2YWlsYWJsZSAobXVsdGlzaWcgZmlyc3Qtc2lnbmVyIHBhdGgpLlxuICAgICAgLy8gVmFsaWRhdGUgRVJDNzk4NC1zcGVjaWZpYyBpbnZhcmlhbnRzIGZyb20gdHhQYXJhbXMgYW5kIGJ1aWxkUGFyYW1zLlxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHR4UGFyYW1zPy5yZWNpcGllbnRzO1xuICAgICAgaWYgKCFyZWNpcGllbnRzIHx8IHJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHJlY2lwaWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbnRyeScpO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2lwaWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgc3VwcG9ydCBleGFjdGx5IDEgcmVjaXBpZW50LCBnb3QgJHtyZWNpcGllbnRzLmxlbmd0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNpcGllbnQgPSByZWNpcGllbnRzWzBdO1xuICAgICAgaWYgKCFyZWNpcGllbnQuYWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50IGFkZHJlc3MgaXMgbWlzc2luZyBvciBpbnZhbGlkOiAke3JlY2lwaWVudC5hZGRyZXNzfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYW1vdW50U3RyID0gU3RyaW5nKHJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgaWYgKCFFcmM3OTg0VG9rZW4uaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcoYW1vdW50U3RyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBhbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc3RyaW5nIGluIGJhc2UgdW5pdHMsIGdvdCAnJHthbW91bnRTdHJ9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIENyb3NzLWNoZWNrIGFnYWluc3QgYnVpbGRQYXJhbXMgd2hlbiB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IHN0b3JlZCB0aGUgaW50ZW50XG4gICAgICBjb25zdCBidWlsZFBhcmFtc1JlY2lwaWVudCA9IHR4UHJlYnVpbGQ/LmJ1aWxkUGFyYW1zPy5yZWNpcGllbnRzPy5bMF07XG4gICAgICBpZiAoYnVpbGRQYXJhbXNSZWNpcGllbnQ/LmFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocmVjaXBpZW50LmFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gYnVpbGRQYXJhbXNSZWNpcGllbnQuYWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiByZWNpcGllbnQgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArXG4gICAgICAgICAgICAgIGB0eFBhcmFtcyBoYXMgJyR7cmVjaXBpZW50LmFkZHJlc3N9JyBidXQgYnVpbGRQYXJhbXMgaGFzICcke2J1aWxkUGFyYW1zUmVjaXBpZW50LmFkZHJlc3N9J2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBidWlsZFBhcmFtc0Ftb3VudCA9IGJ1aWxkUGFyYW1zUmVjaXBpZW50Py5hbW91bnQ7XG4gICAgICBpZiAoYnVpbGRQYXJhbXNBbW91bnQgIT09IHVuZGVmaW5lZCAmJiBidWlsZFBhcmFtc0Ftb3VudCAhPT0gYW1vdW50U3RyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtaXNtYXRjaCDigJQgdHhQYXJhbXMgaGFzICcke2Ftb3VudFN0cn0nIGJ1dCBidWlsZFBhcmFtcyBoYXMgJyR7YnVpbGRQYXJhbXNBbW91bnR9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGFuZCBkZWNvZGUgdGhlIHJhdyB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZyb20odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgIGxldCB0b0FkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG4gICAgbGV0IGlucHV0UHJvb2Y6IHN0cmluZztcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHhKc29uLmRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZCkpIHtcbiAgICAgICAgLy8gc2VuZE11bHRpU2lnLXdyYXBwZWQgcGF0aDogc21hcnQtY29udHJhY3Qgd2FsbGV0IHJlbGF5cyB0aGUgY29uZmlkZW50aWFsVHJhbnNmZXIgY2FsbC5cbiAgICAgICAgLy8gVG9rZW4gY29udHJhY3QgYWRkcmVzcyBpcyBlbmNvZGVkIGluc2lkZSB0aGUgc2VuZE11bHRpU2lnIGNhbGxkYXRhLlxuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlQ29uZmlkZW50aWFsVHJhbnNmZXJEYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdG9BZGRyZXNzID0gZGVjb2RlZC50b0FkZHJlc3M7XG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzID0gZGVjb2RlZC50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgICAgICAgZW5jcnlwdGVkSGFuZGxlID0gZGVjb2RlZC5lbmNyeXB0ZWRIYW5kbGU7XG4gICAgICAgIGlucHV0UHJvb2YgPSBkZWNvZGVkLmlucHV0UHJvb2Y7XG4gICAgICB9IGVsc2UgaWYgKHR4SnNvbi5kYXRhLnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2ZNZXRob2RJZCkpIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGwgcGF0aDogaG90L1RTUyBFT0Egd2FsbGV0IGNhbGxzIHRoZSB0b2tlbiBjb250cmFjdCBkaXJlY3RseS5cbiAgICAgICAgLy8gVGhlIHRyYW5zYWN0aW9uJ3MgYHRvYCBmaWVsZCBpcyB0aGUgdG9rZW4gY29udHJhY3QgYWRkcmVzcy5cbiAgICAgICAgaWYgKCF0eEpzb24udG8pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RpcmVjdCBjb25maWRlbnRpYWxUcmFuc2ZlciBjYWxsIGlzIG1pc3NpbmcgdHJhbnNhY3Rpb24gdG8gYWRkcmVzcycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVEaXJlY3RDb25maWRlbnRpYWxUcmFuc2ZlckNhbGxkYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdG9BZGRyZXNzID0gZGVjb2RlZC50b0FkZHJlc3M7XG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzID0gdHhKc29uLnRvO1xuICAgICAgICBlbmNyeXB0ZWRIYW5kbGUgPSBkZWNvZGVkLmVuY3J5cHRlZEhhbmRsZTtcbiAgICAgICAgaW5wdXRQcm9vZiA9IGRlY29kZWQuaW5wdXRQcm9vZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtZXRob2QgSUQgJHt0eEpzb24uZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGZhaWxlZCB0byBkZWNvZGUgY29uZmlkZW50aWFsIHRyYW5zZmVyIGNhbGxkYXRhIOKAlCAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMS4gVG9rZW4gY29udHJhY3QgYWRkcmVzcyBtdXN0IG1hdGNoIHRoaXMgY29pblxuICAgIGlmICh0b2tlbkNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiB0b2tlbiBjb250cmFjdCBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICBgZXhwZWN0ZWQgJHt0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzfSwgZ290ICR7dG9rZW5Db250cmFjdEFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAyLiBSZWNpcGllbnQgYWRkcmVzcyBtdXN0IG1hdGNoIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0gb3IgYnVpbGRQYXJhbXMucmVjaXBpZW50c1swXVxuICAgIGNvbnN0IGV4cGVjdGVkUmVjaXBpZW50ID0gdHhQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcyA/PyB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFkZHJlc3M7XG4gICAgaWYgKCFleHBlY3RlZFJlY2lwaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IG1pc3NpbmcgZXhwZWN0ZWQgcmVjaXBpZW50IChwcm92aWRlIHR4UGFyYW1zLnJlY2lwaWVudHMgb3IgdHhQcmVidWlsZC5idWlsZFBhcmFtcy5yZWNpcGllbnRzKSdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0b0FkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gZXhwZWN0ZWRSZWNpcGllbnQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHJlY2lwaWVudCBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICsgYGV4cGVjdGVkICR7ZXhwZWN0ZWRSZWNpcGllbnR9LCBnb3QgJHt0b0FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBlbmNyeXB0ZWRIYW5kbGUgbXVzdCBiZSBhIG5vbi10cml2aWFsIGhleCB2YWx1ZSAobm90IGJhcmUgJzB4JylcbiAgICBpZiAoIWVuY3J5cHRlZEhhbmRsZSB8fCBlbmNyeXB0ZWRIYW5kbGUgPT09ICcweCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGVuY3J5cHRlZEhhbmRsZSBpcyBtaXNzaW5nIG9yIGVtcHR5IGluIHRyYW5zYWN0aW9uIGNhbGxkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gNC4gaW5wdXRQcm9vZiBtdXN0IGJlIGEgbm9uLXRyaXZpYWwgaGV4IHZhbHVlXG4gICAgaWYgKCFpbnB1dFByb29mIHx8IGlucHV0UHJvb2YgPT09ICcweCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGlucHV0UHJvb2YgaXMgbWlzc2luZyBvciBlbXB0eSBpbiB0cmFuc2FjdGlvbiBjYWxsZGF0YScpO1xuICAgIH1cblxuICAgIC8vIDUuIFZlcmlmeSBwbGFpbnRleHQgaW50ZW50OiB0eFBhcmFtcyBhbW91bnQgbXVzdCBiZSB2YWxpZCBhbmQgY29uc2lzdGVudCB3aXRoIGJ1aWxkUGFyYW1zXG4gICAgY29uc3QgcmF3VHhQYXJhbXNBbW91bnQgPSB0eFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hbW91bnQ7XG4gICAgaWYgKHJhd1R4UGFyYW1zQW1vdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zQW1vdW50ID0gU3RyaW5nKHJhd1R4UGFyYW1zQW1vdW50KTtcbiAgICAgIGlmICghRXJjNzk4NFRva2VuLmlzUG9zaXRpdmVJbnRlZ2VyU3RyaW5nKHR4UGFyYW1zQW1vdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBhbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc3RyaW5nIGluIGJhc2UgdW5pdHMsIGdvdCAnJHt0eFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgYnVpbGRQYXJhbXNBbW91bnQgPSB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFtb3VudDtcbiAgICAgIGlmIChidWlsZFBhcmFtc0Ftb3VudCAhPT0gdW5kZWZpbmVkICYmIHR4UGFyYW1zQW1vdW50ICE9PSBidWlsZFBhcmFtc0Ftb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBhbW91bnQgbWlzbWF0Y2gg4oCUIHR4UGFyYW1zIGhhcyAnJHt0eFBhcmFtc0Ftb3VudH0nIGJ1dCBidWlsZFBhcmFtcyBoYXMgJyR7YnVpbGRQYXJhbXNBbW91bnR9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzUG9zaXRpdmVJbnRlZ2VyU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15cXGQrJC8udGVzdCh2YWx1ZSkgJiYgQmlnSW50KHZhbHVlKSA+IDBuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGEgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbiBmb3IgRVJDLTc5ODQgZGVjcnlwdGlvbiBkZWxlZ2F0aW9uLlxuICAgKlxuICAgKiBUU1MgcGF0aDogZGVjb2RlcyB0aGUgcmF3IHR4IGFuZCB2ZXJpZmllcyBpdCBjYWxscyB0aGUgQUNMIGNvbnRyYWN0IHdpdGhcbiAgICogY2FsbGRhdGEgdGhhdCBjb3ZlcnMgYWxsIHJlcXVlc3RlZCB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXMuXG4gICAqXG4gICAqIE11bHRpc2lnIHBhdGg6IHZlcmlmaWVzIHRoZSBidWlsZFBhcmFtcyByZWNpcGllbnRzIGNhcnJ5IHRoZSBjb3JyZWN0IHRva2VuTmFtZXNcbiAgICogYW5kIHplcm8gYW1vdW50cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldFR5cGUgfSA9IHBhcmFtcztcblxuICAgIGlmICh3YWxsZXRUeXBlID09PSAndHNzJykge1xuICAgICAgLy8gVFNTIHBhdGg6IGZ1bGwgcmF3LXR4IGRlY29kZVxuICAgICAgY29uc3QgZW5hYmxlVG9rZW5zID0gdHhQYXJhbXMuZW5hYmxlVG9rZW5zO1xuICAgICAgaWYgKCFlbmFibGVUb2tlbnMgfHwgZW5hYmxlVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IGVuYWJsZVRva2VucyBtdXN0IGJlIG5vbi1lbXB0eSBmb3IgVFNTIHBhdGgnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdHhQcmVidWlsZC50eEhleCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IG1pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHJlcXVlc3RlZCB0b2tlbiBuYW1lcyDihpIgY29udHJhY3QgYWRkcmVzc2VzXG4gICAgICBjb25zdCByZXF1ZXN0ZWRBZGRyZXNzZXMgPSBlbmFibGVUb2tlbnMubWFwKCh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRva2VuQ29pbiA9IHRoaXMuYml0Z28uY29pbih0Lm5hbWUpIGFzIEVyYzc5ODRUb2tlbjtcbiAgICAgICAgcmV0dXJuIHRva2VuQ29pbi50b2tlbkNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFBhcnNlIHRoZSByYXcgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIHRhcmdldHMgdGhlIGNvcnJlY3QgY29udHJhY3QgYmFzZWQgb24gY2FsbGRhdGEgc2hhcGVcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmdldE5ldHdvcmsoKSBhcyBFdGhlcmV1bU5ldHdvcms7XG4gICAgICBjb25zdCBhY2xDb250cmFjdEFkZHJlc3MgPSBuZXR3b3JrPy56YW1hQWNsQ29udHJhY3RBZGRyZXNzO1xuICAgICAgaWYgKCFhY2xDb250cmFjdEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB6YW1hQWNsQ29udHJhY3RBZGRyZXNzIG5vdCBjb25maWd1cmVkIGZvciB0aGlzIG5ldHdvcmsnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdHhKc29uLnRvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gaXMgbWlzc2luZyByZWNpcGllbnQgYWRkcmVzcycpO1xuICAgICAgfVxuXG4gICAgICAvLyBJbnNwZWN0IGNhbGxkYXRhIG1ldGhvZCBJRCB0byBkaXN0aW5ndWlzaCByb290IHdhbGxldCBmcm9tIGZvcndhcmRlciB3YWxsZXQ6XG4gICAgICAvLyAgIGFjbE11bHRpY2FsbE1ldGhvZElkICAg4oaSIHJvb3Qgd2FsbGV0OiB0byA9IEFDTCBjb250cmFjdCBkaXJlY3RseVxuICAgICAgLy8gICBjYWxsRnJvbVBhcmVudE1ldGhvZElkIOKGkiBmb3J3YXJkZXIgd2FsbGV0OiB0byA9IGZvcndhcmRlciwgQUNMIGFkZHJlc3MgaXMgaW5zaWRlIGNhbGxkYXRhXG4gICAgICBjb25zdCBjYWxsZGF0YU1ldGhvZElkID0gdHhKc29uLmRhdGEuc2xpY2UoMCwgMTApO1xuICAgICAgaWYgKGNhbGxkYXRhTWV0aG9kSWQgPT09IGFjbE11bHRpY2FsbE1ldGhvZElkKSB7XG4gICAgICAgIC8vIFJvb3Qgd2FsbGV0IChiYXNlIGFkZHJlc3MpOiB0eCBjYWxscyB0aGUgQUNMIGNvbnRyYWN0IGRpcmVjdGx5XG4gICAgICAgIGlmICh0eEpzb24udG8udG9Mb3dlckNhc2UoKSAhPT0gYWNsQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gdGFyZ2V0ICR7dHhKc29uLnRvfSBkb2VzIG5vdCBtYXRjaCBBQ0wgY29udHJhY3QgJHthY2xDb250cmFjdEFkZHJlc3N9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2FsbGRhdGFNZXRob2RJZCA9PT0gY2FsbEZyb21QYXJlbnRNZXRob2RJZCkge1xuICAgICAgICAvLyBGb3J3YXJkZXIgd2FsbGV0OiB0eCBjYWxscyB0aGUgZm9yd2FyZGVyLCB3aGljaCBjYWxscyB0aGUgQUNMIHZpYSBjYWxsRnJvbVBhcmVudC5cbiAgICAgICAgLy8gVGhlIGZvcndhcmRlciBhZGRyZXNzIGlzIHdhbGxldC1zcGVjaWZpYyBhbmQgY2Fubm90IGJlIHN0YXRpY2FsbHkgdmVyaWZpZWQgaGVyZTtcbiAgICAgICAgLy8gdG9rZW4gYWRkcmVzcyBjb3JyZWN0bmVzcyBpcyBzdGlsbCB2ZXJpZmllZCBiZWxvdyB2aWEgY2FsbGRhdGEgZGVjb2RpbmcuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHVucmVjb2duaXNlZCBjYWxsZGF0YSBtZXRob2QgSUQgJHtjYWxsZGF0YU1ldGhvZElkfTsgZXhwZWN0ZWQgbXVsdGljYWxsIG9yIGNhbGxGcm9tUGFyZW50YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgdmFsdWUgaXMgMFxuICAgICAgaWYgKHR4SnNvbi52YWx1ZSAhPT0gJzAnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogZXhwZWN0ZWQgdHJhbnNhY3Rpb24gdmFsdWUgMCBidXQgZ290ICR7dHhKc29uLnZhbHVlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWNvZGUgdG9rZW4gYWRkcmVzc2VzIGZyb20gY2FsbGRhdGEgYW5kIHZlcmlmeSBhbGwgcmVxdWVzdGVkIHRva2VucyBhcmUgcHJlc2VudFxuICAgICAgY29uc3QgZGVjb2RlZEFkZHJlc3NlcyA9IGRlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YSh0eEpzb24uZGF0YSk7XG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZCBvZiByZXF1ZXN0ZWRBZGRyZXNzZXMpIHtcbiAgICAgICAgaWYgKCFkZWNvZGVkQWRkcmVzc2VzLmluY2x1ZGVzKHJlcXVlc3RlZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogcmVxdWVzdGVkIHRva2VuICR7cmVxdWVzdGVkfSBub3QgZm91bmQgaW4gZGVsZWdhdGlvbiBjYWxsZGF0YWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aXNpZyBwYXRoOiBidWlsZFBhcmFtcy1sZXZlbCBjaGVja1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHMgYXNcbiAgICAgICAgfCBBcnJheTx7IHRva2VuTmFtZT86IHN0cmluZzsgYW1vdW50Pzogc3RyaW5nIH0+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFyZWNpcGllbnRzIHx8IHJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogbWlzc2luZyBidWlsZFBhcmFtcy5yZWNpcGllbnRzIGZvciBtdWx0aXNpZyBwYXRoJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSByZXF1ZXN0ZWQgdG9rZW4gbmFtZXMgZnJvbSB0eFBhcmFtc1xuICAgICAgY29uc3QgcmVxdWVzdGVkVG9rZW5OYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICh0eFBhcmFtcy5lbmFibGVUb2tlbnMgJiYgdHhQYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVxdWVzdGVkVG9rZW5OYW1lcy5wdXNoKC4uLnR4UGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoKHQpID0+IHQubmFtZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXF1ZXN0ZWRUb2tlbk5hbWVzLnB1c2goLi4udHhQYXJhbXMucmVjaXBpZW50cy5tYXAoKHI6IGFueSkgPT4gci50b2tlbk5hbWUpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSBhbGwgcmVjaXBpZW50cyBoYXZlIHRva2VuTmFtZSBhbmQgYW1vdW50ID0gJzAnXG4gICAgICBmb3IgKGNvbnN0IHJlY2lwaWVudCBvZiByZWNpcGllbnRzKSB7XG4gICAgICAgIGlmICghcmVjaXBpZW50LnRva2VuTmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogcmVjaXBpZW50IGlzIG1pc3NpbmcgdG9rZW5OYW1lIGluIGJ1aWxkUGFyYW1zJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2lwaWVudC5hbW91bnQgIT09ICcwJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBleHBlY3RlZCBhbW91bnQgMCBmb3IgdG9rZW4gZW5hYmxlbWVudCBidXQgZ290ICR7cmVjaXBpZW50LmFtb3VudH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgcmVxdWVzdGVkIHRva2VuIG5hbWVzIGFyZSBwcmVzZW50IGluIHJlY2lwaWVudHNcbiAgICAgIGlmIChyZXF1ZXN0ZWRUb2tlbk5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcmVjaXBpZW50VG9rZW5OYW1lcyA9IHJlY2lwaWVudHMubWFwKChyKSA9PiByLnRva2VuTmFtZSk7XG4gICAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkIG9mIHJlcXVlc3RlZFRva2VuTmFtZXMpIHtcbiAgICAgICAgICBpZiAoIXJlY2lwaWVudFRva2VuTmFtZXMuaW5jbHVkZXMocmVxdWVzdGVkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogcmVxdWVzdGVkIHRva2VuICR7cmVxdWVzdGVkfSBub3QgZm91bmQgaW4gYnVpbGRQYXJhbXMgcmVjaXBpZW50c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyIGZvciBjb25zdHJ1Y3RpbmcgWmFtYSBBQ0wgZGVjcnlwdGlvblxuICAgKiBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogVGhlIGJ1aWxkZXIgcHJvZHVjZXMgYSBEZWNyeXB0aW9uRGVsZWdhdGlvblR4UmVxdWVzdCB7dG8sIGRhdGEsIHZhbHVlfSB0aGF0IGlzXG4gICAqIHdhbGxldC10eXBlLWFnbm9zdGljIOKAlCBXUCByb3V0ZXMgaXQgdG8gdGhlIGNvcnJlY3Qgc2lnbmluZyBwYXRoOlxuICAgKiAtIE1QQzogc3VibWl0IGFzIGEgcmF3IFRTUyB0cmFuc2FjdGlvblxuICAgKiAtIE11bHRpc2lnOiB3cmFwIGluIHNlbmRNdWx0aVNpZyh3YWxsZXRDb250cmFjdCwgdG8sIDAsIGRhdGEsIC4uLilcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogICBjb25zdCByZXEgPSBjb2luLmdldERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlcigpLmJ1aWxkKHtcbiAgICogICAgIGFjbENvbnRyYWN0QWRkcmVzczogJzB4ZjBGZi4uLicsXG4gICAqICAgICBkZWxlZ2F0ZUFkZHJlc3M6ICAgIGVudGVycHJpc2VWaWV3aW5nS2V5LFxuICAgKiAgICAgdG9rZW5Db250cmFjdEFkZHJlc3NlczogW3Rva2VuQWRkcmVzc10sXG4gICAqICAgICBleHBpcnlUaW1lc3RhbXA6ICAgIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgMzY1ICogODY0MDAsXG4gICAqICAgfSk7XG4gICAqL1xuICBnZXREZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIoKTogRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlcigpO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"eth.d.ts","sourceRoot":"","sources":["../../src/eth.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,QAAQ,EACR,SAAS,EAGT,sBAAsB,EAGtB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EAEZ,SAAS,EAET,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EAEtB,QAAQ,EACR,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EAEZ,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EACL,sBAAsB,EACtB,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,CAAC;AAEF,qBAAa,GAAI,SAAQ,uBAAuB;IAC9C,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAI/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F,2BAA2B,IAAI,OAAO;IAItC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAI/B,kBAAkB;IAClB,wBAAwB,IAAI,qBAAqB;IAOjD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAwB3B,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,QAAQ,CAAC,2BAA2B,GAAG,QAAQ,CAAC,WAAW;IAiCpH;;;;;OAKG;IACG,+BAA+B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAiBnG;;;OAGG;cACa,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,GAAG,kBAAkB,CAAC;cA2KlF,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IAKpH;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQhC;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,sBAAsB;IAwD3D;;;;;;OAMG;IACG,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqEjF;;;;;;;OAOG;IACG,sBAAsB,CAAC,WAAW,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAsB9E;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;CAGtD"}
1
+ {"version":3,"file":"eth.d.ts","sourceRoot":"","sources":["../../src/eth.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,QAAQ,EACR,SAAS,EAGT,sBAAsB,EAGtB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EAEZ,SAAS,EAET,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EAEtB,QAAQ,EACR,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EAEZ,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EACL,sBAAsB,EACtB,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,CAAC;AAEF,qBAAa,GAAI,SAAQ,uBAAuB;IAC9C,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAI/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F,2BAA2B,IAAI,OAAO;IAItC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAI/B,kBAAkB;IAClB,wBAAwB,IAAI,qBAAqB;IAOjD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAwB3B,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,QAAQ,CAAC,2BAA2B,GAAG,QAAQ,CAAC,WAAW;IAiCpH;;;;;OAKG;IACG,+BAA+B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAiBnG;;;OAGG;cACa,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,GAAG,kBAAkB,CAAC;cA2KlF,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IAKpH;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQhC;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,sBAAsB;IAwD3D;;;;;;OAMG;IACG,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsEjF;;;;;;;OAOG;IACG,sBAAsB,CAAC,WAAW,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAsB9E;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;CAGtD"}