@bitgo/sdk-coin-flrp 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/src/flrp.d.ts +6 -75
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +13 -298
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +186 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +273 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +215 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +180 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -79
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +138 -281
  25. package/dist/src/lib/iface.d.ts +50 -51
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +22 -10
  28. package/dist/src/lib/index.d.ts +2 -3
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +5 -6
  31. package/dist/src/lib/keyPair.d.ts +1 -1
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +9 -5
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
  37. package/dist/src/lib/transaction.d.ts +8 -73
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +159 -210
  40. package/dist/src/lib/transactionBuilder.d.ts +56 -34
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilder.js +113 -70
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +35 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +133 -74
  46. package/dist/src/lib/utils.d.ts +73 -151
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +197 -390
  49. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  50. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  51. package/dist/test/resources/transactionData/exportInC.js +34 -0
  52. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  53. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInP.js +140 -0
  55. package/dist/test/resources/transactionData/importInC.d.ts +27 -0
  56. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/importInC.js +44 -0
  58. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  59. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInP.js +58 -0
  61. package/dist/test/unit/lib/exportInCTxBuilder.js +95 -513
  62. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
  63. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
  64. package/dist/test/unit/lib/exportInPTxBuilder.js +110 -366
  65. package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
  66. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
  67. package/dist/test/unit/lib/importInCTxBuilder.js +40 -251
  68. package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
  69. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
  70. package/dist/test/unit/lib/importInPTxBuilder.js +61 -489
  71. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  72. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  73. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  74. package/dist/test/unit/lib/utils.js +29 -302
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +8 -10
  77. package/dist/src/iface.d.ts +0 -25
  78. package/dist/src/iface.d.ts.map +0 -1
  79. package/dist/src/iface.js +0 -3
  80. package/dist/src/lib/constants.d.ts +0 -170
  81. package/dist/src/lib/constants.d.ts.map +0 -1
  82. package/dist/src/lib/constants.js +0 -227
  83. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  84. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  85. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  86. package/dist/src/lib/errors.d.ts +0 -8
  87. package/dist/src/lib/errors.d.ts.map +0 -1
  88. package/dist/src/lib/errors.js +0 -19
  89. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  90. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  91. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  92. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  93. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  94. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  95. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  96. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  97. package/dist/src/lib/importInCTxBuilder.js +0 -403
  98. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  99. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  100. package/dist/src/lib/importInPTxBuilder.js +0 -464
  101. package/dist/src/lib/types.d.ts +0 -78
  102. package/dist/src/lib/types.d.ts.map +0 -1
  103. package/dist/src/lib/types.js +0 -5
  104. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  105. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  106. package/dist/src/lib/validatorTxBuilder.js +0 -180
  107. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  108. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  109. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  110. package/dist/test/unit/flrp.d.ts +0 -2
  111. package/dist/test/unit/flrp.d.ts.map +0 -1
  112. package/dist/test/unit/flrp.js +0 -118
  113. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  114. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  115. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  116. package/dist/test/unit/lib/transaction.d.ts +0 -2
  117. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  118. package/dist/test/unit/lib/transaction.js +0 -460
  119. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  120. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  121. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  122. package/dist/test/unit/smoke.d.ts +0 -2
  123. package/dist/test/unit/smoke.d.ts.map +0 -1
  124. package/dist/test/unit/smoke.js +0 -23
  125. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  126. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  127. package/dist/test/unit/transactionBuilder.test.js +0 -114
  128. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  129. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  130. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -1,318 +1,175 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.AtomicTransactionBuilder = void 0;
4
- const sdk_core_1 = require("@bitgo/sdk-core");
7
+ const transactionBuilder_1 = require("./transactionBuilder");
8
+ const transaction_1 = require("./transaction");
5
9
  const flarejs_1 = require("@flarenetwork/flarejs");
6
- const constants_1 = require("./constants");
7
- const utils_1 = require("./utils");
8
- /**
9
- * Flare P-chain atomic transaction builder with FlareJS credential support.
10
- * This provides the foundation for building Flare P-chain transactions with proper
11
- * credential handling using FlareJS Credential and Signature classes.
12
- */
13
- class AtomicTransactionBuilder {
14
- constructor(coinConfig) {
15
- this._utxos = [];
16
- this.transaction = {
17
- _network: {},
18
- _networkID: constants_1.DEFAULT_NETWORK_ID,
19
- _blockchainID: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
20
- _assetId: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
21
- _fromAddresses: [],
22
- _to: [],
23
- _locktime: constants_1.DEFAULT_LOCKTIME,
24
- _threshold: constants_1.DEFAULT_THRESHOLD,
25
- _fee: { fee: constants_1.AMOUNT_STRING_ZERO },
26
- hasCredentials: false,
27
- setTransaction: function (_tx) {
28
- this._tx = _tx;
29
- },
30
- };
31
- this._coinConfig = coinConfig;
32
- }
33
- /**
34
- * Get the asset ID for Flare network transactions
35
- * @returns Buffer containing the asset ID
36
- */
37
- getAssetId() {
38
- // Use the asset ID from transaction if already set
39
- if (this.transaction._assetId && this.transaction._assetId.length > 0) {
40
- return this.transaction._assetId;
41
- }
42
- // For native FLR transactions, return zero-filled buffer as placeholder
43
- // In a real implementation, this would be obtained from the network configuration
44
- // or FlareJS API to get the actual native asset ID
45
- return Buffer.alloc(constants_1.ASSET_ID_LENGTH);
46
- }
47
- validateAmount(amount) {
48
- if (amount <= constants_1.ZERO_BIGINT) {
49
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_AMOUNT_POSITIVE);
50
- }
10
+ const utils_1 = __importDefault(require("./utils"));
11
+ class AtomicTransactionBuilder extends transactionBuilder_1.TransactionBuilder {
12
+ constructor(_coinConfig) {
13
+ super(_coinConfig);
14
+ this.recoverSigner = false;
15
+ this.transaction = new transaction_1.Transaction(_coinConfig);
51
16
  }
52
17
  /**
53
- * Validates that credentials array is properly formed
54
- * @param credentials - Array of credentials to validate
18
+ * Create inputs and outputs from UTXOs
19
+ * @param {bigint} amount Amount to transfer
20
+ * @return {
21
+ * inputs: TransferableInput[];
22
+ * outputs: TransferableInput[];
23
+ * credentials: Credential[];
24
+ * }
25
+ * @protected
55
26
  */
56
- validateCredentials(credentials) {
57
- if (!Array.isArray(credentials)) {
58
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_CREDENTIALS_ARRAY);
59
- }
60
- credentials.forEach((credential, index) => {
61
- if (!(credential instanceof flarejs_1.Credential)) {
62
- throw new sdk_core_1.BuildTransactionError(`Invalid credential at index ${index}`);
27
+ createInputOutput(amount) {
28
+ const sender = this.transaction._fromAddresses.slice();
29
+ if (this.recoverSigner) {
30
+ // switch first and last signer
31
+ const tmp = sender.pop();
32
+ sender.push(sender[0]);
33
+ if (tmp) {
34
+ sender[0] = tmp;
63
35
  }
64
- });
65
- }
66
- /**
67
- * Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
68
- * Based on AVAX P-chain implementation adapted for FlareJS.
69
- *
70
- * Note: This is a simplified implementation that creates the core structure.
71
- * The FlareJS type system integration will be refined in future iterations.
72
- *
73
- * @param total - Total amount needed including fees
74
- * @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
75
- */
76
- createInputOutput(total) {
77
- if (!this._utxos || this._utxos.length === constants_1.ZERO_NUMBER) {
78
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED);
79
36
  }
37
+ let totalAmount = BigInt(0);
80
38
  const inputs = [];
81
39
  const outputs = [];
82
40
  const credentials = [];
83
- let inputSum = 0n;
84
- const addressIndices = {};
85
- let nextAddressIndex = 0;
86
- // Sort UTXOs by amount in descending order for optimal coin selection
87
- const sortedUtxos = [...this._utxos].sort((a, b) => {
88
- const amountA = BigInt(a.amount);
89
- const amountB = BigInt(b.amount);
90
- if (amountA > amountB)
91
- return -1;
92
- if (amountA < amountB)
93
- return 1;
94
- return 0;
95
- });
96
- // Process UTXOs to create inputs and credentials
97
- for (const utxo of sortedUtxos) {
41
+ this.transaction._utxos.forEach((utxo) => {
98
42
  const utxoAmount = BigInt(utxo.amount);
99
- if (inputSum >= total) {
100
- break; // We have enough inputs
101
- }
102
- // Track input sum
103
- inputSum += utxoAmount;
104
- // Track address indices for signature ordering (mimics AVAX pattern)
105
- const addressIndexArray = [];
106
- for (const address of utxo.addresses) {
107
- if (!(address in addressIndices)) {
108
- addressIndices[address] = nextAddressIndex++;
109
- }
110
- addressIndexArray.push(addressIndices[address]);
111
- }
112
- // Store address indices on the UTXO for credential creation
113
- utxo.addressesIndex = addressIndexArray;
114
- // Create TransferableInput for atomic transactions
115
- const transferableInput = {
116
- txID: Buffer.from(utxo.txid || constants_1.AMOUNT_STRING_ZERO.repeat(constants_1.TRANSACTION_ID_HEX_LENGTH), constants_1.HEX_ENCODING),
117
- outputIndex: parseInt(utxo.outputidx || constants_1.AMOUNT_STRING_ZERO, constants_1.DECIMAL_RADIX),
118
- assetID: this.getAssetId(),
119
- input: {
120
- amount: utxoAmount,
121
- addressIndices: addressIndexArray,
122
- threshold: utxo.threshold,
43
+ totalAmount += utxoAmount;
44
+ // Create input
45
+ const input = {
46
+ _type: flarejs_1.TypeSymbols.Input,
47
+ amount: () => utxoAmount,
48
+ sigIndices: sender.map((_, i) => i),
49
+ toBytes: () => new Uint8Array(),
50
+ };
51
+ // Create asset with Amounter interface
52
+ const assetId = {
53
+ _type: flarejs_1.TypeSymbols.BaseTx,
54
+ amount: () => utxoAmount,
55
+ toBytes: () => {
56
+ const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
57
+ return bytes;
123
58
  },
124
59
  };
125
- // Store the input (type assertion for compatibility)
60
+ // Create TransferableInput
61
+ const transferableInput = new flarejs_1.TransferableInput({
62
+ _type: flarejs_1.TypeSymbols.UTXOID,
63
+ txID: new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.txid, 'hex'))),
64
+ outputIdx: new flarejs_1.Int(Number(utxo.outputidx)),
65
+ ID: () => utxo.txid,
66
+ toBytes: () => {
67
+ const txIdBytes = new Uint8Array(Buffer.from(utxo.txid, 'hex'));
68
+ const outputIdxBytes = new Uint8Array(4);
69
+ new DataView(outputIdxBytes.buffer).setInt32(0, Number(utxo.outputidx), true);
70
+ return Buffer.concat([txIdBytes, outputIdxBytes]);
71
+ },
72
+ }, new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.outputidx.toString()))), assetId);
73
+ // Set input properties
74
+ Object.assign(transferableInput, { input });
126
75
  inputs.push(transferableInput);
127
- // Create credential with placeholder signatures
128
- // In a real implementation, these would be actual signatures
129
- const signatures = Array.from({ length: utxo.threshold }, () => '');
130
- const credential = this.createFlareCredential(0, signatures);
131
- credentials.push(credential);
132
- }
133
- // Verify we have enough inputs
134
- if (inputSum < total) {
135
- throw new sdk_core_1.BuildTransactionError(`Insufficient funds: need ${total}, have ${inputSum}`);
136
- }
137
- // Create change output if we have excess input amount
138
- if (inputSum > total) {
139
- const changeAmount = inputSum - total;
140
- // Create change output for atomic transactions
141
- const changeOutput = {
142
- assetID: this.getAssetId(),
143
- output: {
144
- amount: changeAmount,
145
- addresses: this.transaction._fromAddresses,
146
- threshold: 1,
147
- locktime: 0n,
76
+ // Create empty credential for each input
77
+ const emptySignatures = sender.map(() => utils_1.default.createNewSig(''));
78
+ credentials.push(new flarejs_1.Credential(emptySignatures));
79
+ });
80
+ // Create output if there is change
81
+ if (totalAmount > amount) {
82
+ const changeAmount = totalAmount - amount;
83
+ const output = {
84
+ _type: flarejs_1.TypeSymbols.BaseTx,
85
+ amount: () => changeAmount,
86
+ addresses: sender,
87
+ locktime: this.transaction._locktime,
88
+ threshold: this.transaction._threshold,
89
+ toBytes: () => new Uint8Array(),
90
+ };
91
+ // Create asset with Amounter interface
92
+ const assetId = {
93
+ _type: flarejs_1.TypeSymbols.BaseTx,
94
+ amount: () => changeAmount,
95
+ toBytes: () => {
96
+ const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
97
+ return bytes;
148
98
  },
149
99
  };
150
- // Add the change output (type assertion for compatibility)
151
- outputs.push(changeOutput);
100
+ // Create TransferableOutput
101
+ const transferableOutput = new flarejs_1.TransferableInput({
102
+ _type: flarejs_1.TypeSymbols.UTXOID,
103
+ txID: new flarejs_1.Id(new Uint8Array(32)),
104
+ outputIdx: new flarejs_1.Int(0),
105
+ ID: () => '',
106
+ toBytes: () => {
107
+ const txIdBytes = new Uint8Array(32);
108
+ const outputIdxBytes = new Uint8Array(4);
109
+ return Buffer.concat([txIdBytes, outputIdxBytes]);
110
+ },
111
+ }, new flarejs_1.Id(new Uint8Array([0])), assetId);
112
+ // Set output properties
113
+ Object.assign(transferableOutput, { output });
114
+ outputs.push(transferableOutput);
115
+ }
116
+ return {
117
+ inputs,
118
+ outputs,
119
+ credentials,
120
+ };
121
+ }
122
+ /** @inheritdoc */
123
+ async buildImplementation() {
124
+ this.buildFlareTransaction();
125
+ this.setTransactionType(this.transactionType);
126
+ if (this.hasSigner()) {
127
+ // Sign sequentially to ensure proper order
128
+ for (const keyPair of this._signer) {
129
+ await this.transaction.sign(keyPair);
130
+ }
152
131
  }
153
- return { inputs, outputs, credentials };
132
+ return this.transaction;
154
133
  }
155
134
  /**
156
- * Set UTXOs for the transaction. This is required for creating inputs and outputs.
135
+ * Fee is fix for AVM atomic tx.
157
136
  *
158
- * @param utxos - Array of decoded UTXO objects
159
- * @returns this builder instance for chaining
137
+ * @returns network.txFee
138
+ * @protected
160
139
  */
161
- utxos(utxos) {
162
- this._utxos = utxos;
163
- return this;
140
+ get fixedFee() {
141
+ return this.transaction._network.txFee;
164
142
  }
165
143
  /**
166
- * Flare equivalent of Avalanche's SelectCredentialClass
167
- * Creates a credential with the provided signatures
144
+ * Set the transaction type
168
145
  *
169
- * @param credentialId - The credential ID (not used in FlareJS but kept for compatibility)
170
- * @param signatures - Array of signature hex strings or empty strings for placeholders
171
- * @returns Credential instance
146
+ * @param {TransactionType} transactionType The transaction type to be set
172
147
  */
173
- createFlareCredential(_credentialId, signatures) {
174
- if (!Array.isArray(signatures)) {
175
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_ARRAY);
176
- }
177
- if (signatures.length === constants_1.ZERO_NUMBER) {
178
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_EMPTY);
179
- }
180
- const sigs = signatures.map((sig, index) => {
181
- // Handle empty/placeholder signatures
182
- if (!sig || sig.length === 0) {
183
- return new flarejs_1.Signature(new Uint8Array(constants_1.SECP256K1_SIGNATURE_LENGTH));
184
- }
185
- // Validate hex string format
186
- const cleanSig = sig.startsWith(constants_1.HEX_PREFIX) ? sig.slice(constants_1.HEX_PREFIX_LENGTH) : sig;
187
- if (!(0, utils_1.createFlexibleHexRegex)().test(cleanSig)) {
188
- throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
189
- }
190
- // Convert to buffer and validate length
191
- const sigBuffer = Buffer.from(cleanSig, constants_1.HEX_ENCODING);
192
- if (sigBuffer.length > constants_1.SECP256K1_SIGNATURE_LENGTH) {
193
- throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${constants_1.SECP256K1_SIGNATURE_LENGTH})`);
194
- }
195
- // Create fixed-length buffer and copy signature data
196
- const fixedLengthBuffer = Buffer.alloc(constants_1.SECP256K1_SIGNATURE_LENGTH);
197
- sigBuffer.copy(fixedLengthBuffer);
198
- try {
199
- return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
200
- }
201
- catch (error) {
202
- throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
203
- }
204
- });
205
- try {
206
- return new flarejs_1.Credential(sigs);
207
- }
208
- catch (error) {
209
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_CREATE_CREDENTIAL_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
210
- }
148
+ setTransactionType(transactionType) {
149
+ this.transaction._type = transactionType;
211
150
  }
212
151
  /**
213
- * Base initBuilder used by concrete builders. For now just returns this so fluent API works.
152
+ * The internal chain is the one set for the coin in coinConfig.network. The external chain is the other chain involved.
153
+ * The external chain id is the source on import and the destination on export.
154
+ *
155
+ * @param {string} chainId - id of the external chain
214
156
  */
215
- initBuilder(_tx) {
157
+ externalChainId(chainId) {
158
+ const newTargetChainId = typeof chainId === 'string' ? utils_1.default.cb58Decode(chainId) : Buffer.from(chainId);
159
+ this.validateChainId(newTargetChainId);
160
+ this._externalChainId = newTargetChainId;
216
161
  return this;
217
162
  }
218
163
  /**
219
- * Sign transaction with private key using FlareJS compatibility
220
- */
221
- sign(params) {
222
- // FlareJS signing implementation with atomic transaction support
223
- try {
224
- // Validate private key format (placeholder implementation)
225
- if (!params.key || params.key.length < constants_1.PRIVATE_KEY_HEX_LENGTH) {
226
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_PRIVATE_KEY);
227
- }
228
- // Create signature structure
229
- const signature = {
230
- privateKey: params.key,
231
- signingMethod: constants_1.SIGNING_METHOD,
232
- };
233
- // Store signature for FlareJS compatibility
234
- this.transaction._signature = signature;
235
- this.transaction.hasCredentials = true;
236
- return this;
237
- }
238
- catch (error) {
239
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FLAREJS_SIGNING_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
240
- }
241
- }
242
- /**
243
- * Build the transaction using FlareJS compatibility
244
- */
245
- async build() {
246
- // FlareJS UnsignedTx creation with atomic transaction support
247
- try {
248
- // Validate transaction requirements
249
- if (!this._utxos || this._utxos.length === 0) {
250
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED_BUILD);
251
- }
252
- // Create FlareJS transaction structure with atomic support
253
- const transaction = {
254
- _id: `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
255
- _inputs: [],
256
- _outputs: [],
257
- _type: this.transactionType,
258
- signature: [],
259
- fromAddresses: this.transaction._fromAddresses,
260
- validationErrors: [],
261
- // FlareJS methods with atomic support
262
- toBroadcastFormat: () => `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
263
- toJson: () => ({
264
- type: this.transactionType,
265
- }),
266
- explainTransaction: () => ({
267
- type: this.transactionType,
268
- inputs: [],
269
- outputs: [],
270
- outputAmount: constants_1.AMOUNT_STRING_ZERO,
271
- rewardAddresses: [],
272
- id: `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
273
- changeOutputs: [],
274
- changeAmount: constants_1.AMOUNT_STRING_ZERO,
275
- fee: { fee: this.transaction._fee.fee },
276
- }),
277
- isTransactionForCChain: false,
278
- loadInputsAndOutputs: () => {
279
- /* FlareJS atomic transaction loading */
280
- },
281
- inputs: () => [],
282
- outputs: () => [],
283
- fee: () => ({ fee: this.transaction._fee.fee }),
284
- feeRate: () => 0,
285
- id: () => `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
286
- type: this.transactionType,
287
- };
288
- return transaction;
289
- }
290
- catch (error) {
291
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_BUILD_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
292
- }
293
- }
294
- /**
295
- * Parse and explain a transaction from hex using FlareJS compatibility
164
+ * Set the transaction fee
165
+ *
166
+ * @param {string | bigint} feeValue - the fee value
296
167
  */
297
- explainTransaction() {
298
- // FlareJS transaction parsing with atomic support
299
- try {
300
- return {
301
- type: this.transactionType,
302
- inputs: [],
303
- outputs: [],
304
- outputAmount: constants_1.AMOUNT_STRING_ZERO,
305
- rewardAddresses: [],
306
- id: `${constants_1.FLARE_ATOMIC_PARSED_PREFIX}${Date.now()}`,
307
- changeOutputs: [],
308
- changeAmount: constants_1.AMOUNT_STRING_ZERO,
309
- fee: { fee: this.transaction._fee.fee },
310
- };
311
- }
312
- catch (error) {
313
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_PARSE_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
314
- }
168
+ fee(feeValue) {
169
+ const fee = typeof feeValue === 'string' ? feeValue : feeValue.toString();
170
+ this.transaction._fee.fee = fee;
171
+ return this;
315
172
  }
316
173
  }
317
174
  exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsOENBQTBGO0FBQzFGLG1EQUFxRztBQUVyRywyQ0FnQ3FCO0FBQ3JCLG1DQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBc0Isd0JBQXdCO0lBcUM1QyxZQUFZLFVBQWdDO1FBaENsQyxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQWNqQjtZQUNGLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLDhCQUFrQjtZQUM5QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUN6QyxjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSw0QkFBZ0I7WUFDM0IsVUFBVSxFQUFFLDZCQUFpQjtZQUM3QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsOEJBQWtCLEVBQUU7WUFDakMsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLFVBQVUsR0FBWTtnQkFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7OztPQUdHO0lBQ08sVUFBVTtRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFD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QUUsOEJBQWtCO2dCQUNoQyxlQUFlLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsc0NBQTBCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoRCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtnQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLEdBQUcsdUNBQTJCLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFYRCw0REEwWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUsIEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBDcmVkZW50aWFsLCBTaWduYXR1cmUsIFRyYW5zZmVyYWJsZUlucHV0LCBUcmFuc2ZlcmFibGVPdXRwdXQgfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7XG4gIEFTU0VUX0lEX0xFTkdUSCxcbiAgVFJBTlNBQ1RJT05fSURfSEVYX0xFTkdUSCxcbiAgUFJJVkFURV9LRVlfSEVYX0xFTkdUSCxcbiAgU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEgsXG4gIFRSQU5TQUNUSU9OX0lEX1BSRUZJWCxcbiAgREVGQVVMVF9ORVRXT1JLX0lELFxuICBFTVBUWV9CVUZGRVJfU0laRSxcbiAgSEVYX1BSRUZJWCxcbiAgSEVYX1BSRUZJWF9MRU5HVEgsXG4gIERFQ0lNQUxfUkFESVgsXG4gIFNJR05JTkdfTUVUSE9ELFxuICBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gIERFRkFVTFRfTE9DS1RJTUUsXG4gIERFRkFVTFRfVEhSRVNIT0xELFxuICBaRVJPX0JJR0lOVCxcbiAgWkVST19OVU1CRVIsXG4gIEVSUk9SX0FNT1VOVF9QT1NJVElWRSxcbiAgRVJST1JfQ1JFREVOVElBTFNfQVJSQVksXG4gIEVSUk9SX1VUWE9TX1JFUVVJUkVELFxuICBFUlJPUl9TSUdOQVRVUkVTX0FSUkFZLFxuICBFUlJPUl9TSUdOQVRVUkVTX0VNUFRZLFxuICBFUlJPUl9JTlZBTElEX1BSSVZBVEVfS0VZLFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRF9CVUlMRCxcbiAgRVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVELFxuICBFUlJPUl9FTkhBTkNFRF9QQVJTRV9GQUlMRUQsXG4gIEVSUk9SX0ZMQVJFSlNfU0lHTklOR19GQUlMRUQsXG4gIEVSUk9SX0NSRUFURV9DUkVERU5USUFMX0ZBSUxFRCxcbiAgRVJST1JfVU5LTk9XTixcbiAgRkxBUkVfQVRPTUlDX1BSRUZJWCxcbiAgRkxBUkVfQVRPTUlDX1BBUlNFRF9QUkVGSVgsXG4gIEhFWF9FTkNPRElORyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY3JlYXRlRmxleGlibGVIZXhSZWdleCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEZsYXJlIFAtY2hhaW4gYXRvbWljIHRyYW5zYWN0aW9uIGJ1aWxkZXIgd2l0aCBGbGFyZUpTIGNyZWRlbnRpYWwgc3VwcG9ydC5cbiAqIFRoaXMgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIGJ1aWxkaW5nIEZsYXJlIFAtY2hhaW4gdHJhbnNhY3Rpb25zIHdpdGggcHJvcGVyXG4gKiBjcmVkZW50aWFsIGhhbmRsaW5nIHVzaW5nIEZsYXJlSlMgQ3JlZGVudGlhbCBhbmQgU2lnbmF0dXJlIGNsYXNzZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+O1xuICAvLyBFeHRlcm5hbCBjaGFpbiBpZCAoZGVzdGluYXRpb24pIGZvciBleHBvcnQgdHJhbnNhY3Rpb25zXG4gIHByb3RlY3RlZCBfZXh0ZXJuYWxDaGFpbklkOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIF91dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCB0cmFuc2FjdGlvbjoge1xuICAgIF9uZXR3b3JrOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBfbmV0d29ya0lEOiBudW1iZXI7XG4gICAgX2Jsb2NrY2hhaW5JRDogQnVmZmVyO1xuICAgIF9hc3NldElkOiBCdWZmZXI7XG4gICAgX2Zyb21BZGRyZXNzZXM6IHN0cmluZ1tdO1xuICAgIF90bzogc3RyaW5nW107XG4gICAgX2xvY2t0aW1lOiBiaWdpbnQ7XG4gICAgX3RocmVzaG9sZDogbnVtYmVyO1xuICAgIF9mZWU6IHsgZmVlOiBzdHJpbmc7IGZlZVJhdGU/OiBzdHJpbmc7IHNpemU/OiBudW1iZXIgfTtcbiAgICBoYXNDcmVkZW50aWFsczogYm9vbGVhbjtcbiAgICBfdHg/OiB1bmtub3duO1xuICAgIF9zaWduYXR1cmU/OiB1bmtub3duO1xuICAgIHNldFRyYW5zYWN0aW9uOiAodHg6IHVua25vd24pID0+IHZvaWQ7XG4gIH0gPSB7XG4gICAgX25ldHdvcms6IHt9LFxuICAgIF9uZXR3b3JrSUQ6IERFRkFVTFRfTkVUV09SS19JRCxcbiAgICBfYmxvY2tjaGFpbklEOiBCdWZmZXIuYWxsb2MoRU1QVFlfQlVGRkVSX1NJWkUpLFxuICAgIF9hc3NldElkOiBCdWZmZXIuYWxsb2MoRU1QVFlfQlVGRkVSX1NJWkUpLFxuICAgIF9mcm9tQWRkcmVzc2VzOiBbXSxcbiAgICBfdG86IFtdLFxuICAgIF9sb2NrdGltZTogREVGQVVMVF9MT0NLVElNRSxcbiAgICBfdGhyZXNob2xkOiBERUZBVUxUX1RIUkVTSE9MRCxcbiAgICBfZmVlOiB7IGZlZTogQU1PVU5UX1NUUklOR19aRVJPIH0sXG4gICAgaGFzQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIHNldFRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoX3R4OiB1bmtub3duKSB7XG4gICAgICB0aGlzLl90eCA9IF90eDtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgdGhpcy5fY29pbkNvbmZpZyA9IGNvaW5Db25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXNzZXQgSUQgZm9yIEZsYXJlIG5ldHdvcmsgdHJhbnNhY3Rpb25zXG4gICAqIEByZXR1cm5zIEJ1ZmZlciBjb250YWluaW5nIHRoZSBhc3NldCBJRFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFzc2V0SWQoKTogQnVmZmVyIHtcbiAgICAvLyBVc2UgdGhlIGFzc2V0IElEIGZyb20gdHJhbnNhY3Rpb24gaWYgYWxyZWFkeSBzZXRcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCAmJiB0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkO1xuICAgIH1cblxuICAgIC8vIEZvciBuYXRpdmUgRkxSIHRyYW5zYWN0aW9ucywgcmV0dXJuIHplcm8tZmlsbGVkIGJ1ZmZlciBhcyBwbGFjZWhvbGRlclxuICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBvciBGbGFyZUpTIEFQSSB0byBnZXQgdGhlIGFjdHVhbCBuYXRpdmUgYXNzZXQgSURcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKEFTU0VUX0lEX0xFTkdUSCk7XG4gIH1cblxuICB2YWxpZGF0ZUFtb3VudChhbW91bnQ6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmIChhbW91bnQgPD0gWkVST19CSUdJTlQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfQU1PVU5UX1BPU0lUSVZFKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgY3JlZGVudGlhbHMgYXJyYXkgaXMgcHJvcGVybHkgZm9ybWVkXG4gICAqIEBwYXJhbSBjcmVkZW50aWFscyAtIEFycmF5IG9mIGNyZWRlbnRpYWxzIHRvIHZhbGlkYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVDcmVkZW50aWFscyhjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdKTogdm9pZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNyZWRlbnRpYWxzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9DUkVERU5USUFMU19BUlJBWSk7XG4gICAgfVxuXG4gICAgY3JlZGVudGlhbHMuZm9yRWFjaCgoY3JlZGVudGlhbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghKGNyZWRlbnRpYWwgaW5zdGFuY2VvZiBDcmVkZW50aWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGNyZWRlbnRpYWwgYXQgaW5kZXggJHtpbmRleH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGlucHV0cywgb3V0cHV0cywgYW5kIGNyZWRlbnRpYWxzIGZvciBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbnMuXG4gICAqIEJhc2VkIG9uIEFWQVggUC1jaGFpbiBpbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZvciBGbGFyZUpTLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIGNvcmUgc3RydWN0dXJlLlxuICAgKiBUaGUgRmxhcmVKUyB0eXBlIHN5c3RlbSBpbnRlZ3JhdGlvbiB3aWxsIGJlIHJlZmluZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB0b3RhbCAtIFRvdGFsIGFtb3VudCBuZWVkZWQgaW5jbHVkaW5nIGZlZXNcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgVHJhbnNmZXJhYmxlSW5wdXRbXSwgVHJhbnNmZXJhYmxlT3V0cHV0W10sIGFuZCBDcmVkZW50aWFsW11cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dCh0b3RhbDogYmlnaW50KToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBpZiAoIXRoaXMuX3V0eG9zIHx8IHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gWkVST19OVU1CRVIpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfVVRYT1NfUkVRVUlSRUQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZU91dHB1dFtdID0gW107XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IFtdO1xuXG4gICAgbGV0IGlucHV0U3VtID0gMG47XG4gICAgY29uc3QgYWRkcmVzc0luZGljZXM6IHsgW2FkZHJlc3M6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgbGV0IG5leHRBZGRyZXNzSW5kZXggPSAwO1xuXG4gICAgLy8gU29ydCBVVFhPcyBieSBhbW91bnQgaW4gZGVzY2VuZGluZyBvcmRlciBmb3Igb3B0aW1hbCBjb2luIHNlbGVjdGlvblxuICAgIGNvbnN0IHNvcnRlZFV0eG9zID0gWy4uLnRoaXMuX3V0eG9zXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhbW91bnRBID0gQmlnSW50KGEuYW1vdW50KTtcbiAgICAgIGNvbnN0IGFtb3VudEIgPSBCaWdJbnQoYi5hbW91bnQpO1xuICAgICAgaWYgKGFtb3VudEEgPiBhbW91bnRCKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYW1vdW50QSA8IGFtb3VudEIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICAvLyBQcm9jZXNzIFVUWE9zIHRvIGNyZWF0ZSBpbnB1dHMgYW5kIGNyZWRlbnRpYWxzXG4gICAgZm9yIChjb25zdCB1dHhvIG9mIHNvcnRlZFV0eG9zKSB7XG4gICAgICBjb25zdCB1dHhvQW1vdW50ID0gQmlnSW50KHV0eG8uYW1vdW50KTtcblxuICAgICAgaWYgKGlucHV0U3VtID49IHRvdGFsKSB7XG4gICAgICAgIGJyZWFrOyAvLyBXZSBoYXZlIGVub3VnaCBpbnB1dHNcbiAgICAgIH1cblxuICAgICAgLy8gVHJhY2sgaW5wdXQgc3VtXG4gICAgICBpbnB1dFN1bSArPSB1dHhvQW1vdW50O1xuXG4gICAgICAvLyBUcmFjayBhZGRyZXNzIGluZGljZXMgZm9yIHNpZ25hdHVyZSBvcmRlcmluZyAobWltaWNzIEFWQVggcGF0dGVybilcbiAgICAgIGNvbnN0IGFkZHJlc3NJbmRleEFycmF5OiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHV0eG8uYWRkcmVzc2VzKSB7XG4gICAgICAgIGlmICghKGFkZHJlc3MgaW4gYWRkcmVzc0luZGljZXMpKSB7XG4gICAgICAgICAgYWRkcmVzc0luZGljZXNbYWRkcmVzc10gPSBuZXh0QWRkcmVzc0luZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc0luZGV4QXJyYXkucHVzaChhZGRyZXNzSW5kaWNlc1thZGRyZXNzXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIGFkZHJlc3MgaW5kaWNlcyBvbiB0aGUgVVRYTyBmb3IgY3JlZGVudGlhbCBjcmVhdGlvblxuICAgICAgdXR4by5hZGRyZXNzZXNJbmRleCA9IGFkZHJlc3NJbmRleEFycmF5O1xuXG4gICAgICAvLyBDcmVhdGUgVHJhbnNmZXJhYmxlSW5wdXQgZm9yIGF0b21pYyB0cmFuc2FjdGlvbnNcbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0ID0ge1xuICAgICAgICB0eElEOiBCdWZmZXIuZnJvbSh1dHhvLnR4aWQgfHwgQU1PVU5UX1NUUklOR19aRVJPLnJlcGVhdChUUkFOU0FDVElPTl9JRF9IRVhfTEVOR1RIKSwgSEVYX0VOQ09ESU5HKSxcbiAgICAgICAgb3V0cHV0SW5kZXg6IHBhcnNlSW50KHV0eG8ub3V0cHV0aWR4IHx8IEFNT1VOVF9TVFJJTkdfWkVSTywgREVDSU1BTF9SQURJWCksXG4gICAgICAgIGFzc2V0SUQ6IHRoaXMuZ2V0QXNzZXRJZCgpLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGFtb3VudDogdXR4b0Ftb3VudCxcbiAgICAgICAgICBhZGRyZXNzSW5kaWNlczogYWRkcmVzc0luZGV4QXJyYXksXG4gICAgICAgICAgdGhyZXNob2xkOiB1dHhvLnRocmVzaG9sZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBpbnB1dCAodHlwZSBhc3NlcnRpb24gZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCBhcyB1bmtub3duIGFzIFRyYW5zZmVyYWJsZUlucHV0KTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBwbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoZXNlIHdvdWxkIGJlIGFjdHVhbCBzaWduYXR1cmVzXG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdXR4by50aHJlc2hvbGQgfSwgKCkgPT4gJycpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHRoaXMuY3JlYXRlRmxhcmVDcmVkZW50aWFsKDAsIHNpZ25hdHVyZXMpO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChjcmVkZW50aWFsKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgd2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgaWYgKGlucHV0U3VtIDwgdG90YWwpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEluc3VmZmljaWVudCBmdW5kczogbmVlZCAke3RvdGFsfSwgaGF2ZSAke2lucHV0U3VtfWApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjaGFuZ2Ugb3V0cHV0IGlmIHdlIGhhdmUgZXhjZXNzIGlucHV0IGFtb3VudFxuICAgIGlmIChpbnB1dFN1bSA+IHRvdGFsKSB7XG4gICAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBpbnB1dFN1bSAtIHRvdGFsO1xuXG4gICAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBmb3IgYXRvbWljIHRyYW5zYWN0aW9uc1xuICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0ge1xuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgYW1vdW50OiBjaGFuZ2VBbW91bnQsXG4gICAgICAgICAgYWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBsb2NrdGltZTogMG4sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdGhlIGNoYW5nZSBvdXRwdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgb3V0cHV0cy5wdXNoKGNoYW5nZU91dHB1dCBhcyB1bmtub3duIGFzIFRyYW5zZmVyYWJsZU91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaW5wdXRzLCBvdXRwdXRzLCBjcmVkZW50aWFscyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBVVFhPcyBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBjcmVhdGluZyBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAqXG4gICAqIEBwYXJhbSB1dHhvcyAtIEFycmF5IG9mIGRlY29kZWQgVVRYTyBvYmplY3RzXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHV0eG9zKHV0eG9zOiBEZWNvZGVkVXR4b09ialtdKTogdGhpcyB7XG4gICAgdGhpcy5fdXR4b3MgPSB1dHhvcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFyZSBlcXVpdmFsZW50IG9mIEF2YWxhbmNoZSdzIFNlbGVjdENyZWRlbnRpYWxDbGFzc1xuICAgKiBDcmVhdGVzIGEgY3JlZGVudGlhbCB3aXRoIHRoZSBwcm92aWRlZCBzaWduYXR1cmVzXG4gICAqXG4gICAqIEBwYXJhbSBjcmVkZW50aWFsSWQgLSBUaGUgY3JlZGVudGlhbCBJRCAobm90IHVzZWQgaW4gRmxhcmVKUyBidXQga2VwdCBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICogQHBhcmFtIHNpZ25hdHVyZXMgLSBBcnJheSBvZiBzaWduYXR1cmUgaGV4IHN0cmluZ3Mgb3IgZW1wdHkgc3RyaW5ncyBmb3IgcGxhY2Vob2xkZXJzXG4gICAqIEByZXR1cm5zIENyZWRlbnRpYWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVGbGFyZUNyZWRlbnRpYWwoX2NyZWRlbnRpYWxJZDogbnVtYmVyLCBzaWduYXR1cmVzOiBzdHJpbmdbXSk6IENyZWRlbnRpYWwge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaWduYXR1cmVzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9TSUdOQVRVUkVTX0FSUkFZKTtcbiAgICB9XG5cbiAgICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPT09IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1NJR05BVFVSRVNfRU1QVFkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ3MgPSBzaWduYXR1cmVzLm1hcCgoc2lnLCBpbmRleCkgPT4ge1xuICAgICAgLy8gSGFuZGxlIGVtcHR5L3BsYWNlaG9sZGVyIHNpZ25hdHVyZXNcbiAgICAgIGlmICghc2lnIHx8IHNpZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUobmV3IFVpbnQ4QXJyYXkoU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEgpKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgaGV4IHN0cmluZyBmb3JtYXRcbiAgICAgIGNvbnN0IGNsZWFuU2lnID0gc2lnLnN0YXJ0c1dpdGgoSEVYX1BSRUZJWCkgPyBzaWcuc2xpY2UoSEVYX1BSRUZJWF9MRU5HVEgpIDogc2lnO1xuICAgICAgaWYgKCFjcmVhdGVGbGV4aWJsZUhleFJlZ2V4KCkudGVzdChjbGVhblNpZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBoZXggc2lnbmF0dXJlIGF0IGluZGV4ICR7aW5kZXh9OiBjb250YWlucyBub24taGV4IGNoYXJhY3RlcnNgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCB0byBidWZmZXIgYW5kIHZhbGlkYXRlIGxlbmd0aFxuICAgICAgY29uc3Qgc2lnQnVmZmVyID0gQnVmZmVyLmZyb20oY2xlYW5TaWcsIEhFWF9FTkNPRElORyk7XG4gICAgICBpZiAoc2lnQnVmZmVyLmxlbmd0aCA+IFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYFNpZ25hdHVyZSB0b28gbG9uZyBhdCBpbmRleCAke2luZGV4fTogJHtzaWdCdWZmZXIubGVuZ3RofSBieXRlcyAobWF4ICR7U0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEh9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGZpeGVkLWxlbmd0aCBidWZmZXIgYW5kIGNvcHkgc2lnbmF0dXJlIGRhdGFcbiAgICAgIGNvbnN0IGZpeGVkTGVuZ3RoQnVmZmVyID0gQnVmZmVyLmFsbG9jKFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKTtcbiAgICAgIHNpZ0J1ZmZlci5jb3B5KGZpeGVkTGVuZ3RoQnVmZmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUobmV3IFVpbnQ4QXJyYXkoZml4ZWRMZW5ndGhCdWZmZXIpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgc2lnbmF0dXJlIGF0IGluZGV4ICR7aW5kZXh9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBDcmVkZW50aWFsKHNpZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCYXNlIGluaXRCdWlsZGVyIHVzZWQgYnkgY29uY3JldGUgYnVpbGRlcnMuIEZvciBub3cganVzdCByZXR1cm5zIHRoaXMgc28gZmx1ZW50IEFQSSB3b3Jrcy5cbiAgICovXG4gIGluaXRCdWlsZGVyKF90eDogdW5rbm93bik6IHRoaXMge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gdHJhbnNhY3Rpb24gd2l0aCBwcml2YXRlIGtleSB1c2luZyBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIHNpZ24ocGFyYW1zOiB7IGtleTogc3RyaW5nIH0pOiB0aGlzIHtcbiAgICAvLyBGbGFyZUpTIHNpZ25pbmcgaW1wbGVtZW50YXRpb24gd2l0aCBhdG9taWMgdHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBwcml2YXRlIGtleSBmb3JtYXQgKHBsYWNlaG9sZGVyIGltcGxlbWVudGF0aW9uKVxuICAgICAgaWYgKCFwYXJhbXMua2V5IHx8IHBhcmFtcy5rZXkubGVuZ3RoIDwgUFJJVkFURV9LRVlfSEVYX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0lOVkFMSURfUFJJVkFURV9LRVkpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgc2lnbmF0dXJlIHN0cnVjdHVyZVxuICAgICAgY29uc3Qgc2lnbmF0dXJlID0ge1xuICAgICAgICBwcml2YXRlS2V5OiBwYXJhbXMua2V5LFxuICAgICAgICBzaWduaW5nTWV0aG9kOiBTSUdOSU5HX01FVEhPRCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHNpZ25hdHVyZSBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLmhhc0NyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGAke0VSUk9SX0ZMQVJFSlNfU0lHTklOR19GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgdHJhbnNhY3Rpb24gdXNpbmcgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBhc3luYyBidWlsZCgpOiBQcm9taXNlPEJhc2VUcmFuc2FjdGlvbj4ge1xuICAgIC8vIEZsYXJlSlMgVW5zaWduZWRUeCBjcmVhdGlvbiB3aXRoIGF0b21pYyB0cmFuc2FjdGlvbiBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRyYW5zYWN0aW9uIHJlcXVpcmVtZW50c1xuICAgICAgaWYgKCF0aGlzLl91dHhvcyB8fCB0aGlzLl91dHhvcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9VVFhPU19SRVFVSVJFRF9CVUlMRCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBGbGFyZUpTIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSB3aXRoIGF0b21pYyBzdXBwb3J0XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHtcbiAgICAgICAgX2lkOiBgJHtUUkFOU0FDVElPTl9JRF9QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIF9pbnB1dHM6IFtdLFxuICAgICAgICBfb3V0cHV0czogW10sXG4gICAgICAgIF90eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgc2lnbmF0dXJlOiBbXSBhcyBzdHJpbmdbXSxcblxuICAgICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLFxuICAgICAgICB2YWxpZGF0aW9uRXJyb3JzOiBbXSxcblxuICAgICAgICAvLyBGbGFyZUpTIG1ldGhvZHMgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgICAgICB0b0Jyb2FkY2FzdEZvcm1hdDogKCkgPT4gYCR7VFJBTlNBQ1RJT05fSURfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB0b0pzb246ICgpID0+ICh7XG4gICAgICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIGV4cGxhaW5UcmFuc2FjdGlvbjogKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPT4gKHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICAgIG91dHB1dEFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICAgICAgaWQ6IGAke0ZMQVJFX0FUT01JQ19QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgICAgY2hhbmdlQW1vdW50OiBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gICAgICAgICAgZmVlOiB7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9LFxuICAgICAgICB9KSxcblxuICAgICAgICBpc1RyYW5zYWN0aW9uRm9yQ0NoYWluOiBmYWxzZSxcbiAgICAgICAgbG9hZElucHV0c0FuZE91dHB1dHM6ICgpID0+IHtcbiAgICAgICAgICAvKiBGbGFyZUpTIGF0b21pYyB0cmFuc2FjdGlvbiBsb2FkaW5nICovXG4gICAgICAgIH0sXG4gICAgICAgIGlucHV0czogKCkgPT4gW10sXG4gICAgICAgIG91dHB1dHM6ICgpID0+IFtdLFxuICAgICAgICBmZWU6ICgpID0+ICh7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9KSxcbiAgICAgICAgZmVlUmF0ZTogKCkgPT4gMCxcbiAgICAgICAgaWQ6ICgpID0+IGAke0ZMQVJFX0FUT01JQ19QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIEJhc2VUcmFuc2FjdGlvbjtcblxuICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9FTkhBTkNFRF9CVUlMRF9GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbmQgZXhwbGFpbiBhIHRyYW5zYWN0aW9uIGZyb20gaGV4IHVzaW5nIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIC8vIEZsYXJlSlMgdHJhbnNhY3Rpb24gcGFyc2luZyB3aXRoIGF0b21pYyBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gICAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICAgIGlkOiBgJHtGTEFSRV9BVE9NSUNfUEFSU0VEX1BSRUZJWH0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICBmZWU6IHsgZmVlOiB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlIH0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9FTkhBTkNFRF9QQVJTRV9GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQTBEO0FBQzFELCtDQUE0QztBQUM1QyxtREFBNEY7QUFFNUYsb0RBQTRCO0FBUzVCLE1BQXNCLHdCQUF5QixTQUFRLHVDQUFrQjtJQUl2RSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUhYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBSTlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTyxpQkFBaUIsQ0FBQyxNQUFjO1FBS3hDLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxXQUEyQixDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QiwrQkFBK0I7WUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFdBQVcsR0FBaUIsRUFBRSxDQUFDO1FBRXBDLElBQUksQ0FBQyxXQUEyQixDQUFDLE1BQU0sQ0FB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QUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsT0FBd0I7UUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLFFBQXlCO1FBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekUsSUFBSSxDQUFDLFdBQTJCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUF6TUQsNERBeU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNmZXJhYmxlSW5wdXQsIEludCwgSWQsIFR5cGVTeW1ib2xzLCBDcmVkZW50aWFsIH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8vIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGNhbiBwcm92aWRlIGFuIGFtb3VudFxuaW50ZXJmYWNlIEFtb3VudGVyIHtcbiAgX3R5cGU6IFR5cGVTeW1ib2xzO1xuICBhbW91bnQ6ICgpID0+IGJpZ2ludDtcbiAgdG9CeXRlczogKCkgPT4gVWludDhBcnJheTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfZXh0ZXJuYWxDaGFpbklkOiBCdWZmZXI7XG4gIHByb3RlY3RlZCByZWNvdmVyU2lnbmVyID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnB1dHMgYW5kIG91dHB1dHMgZnJvbSBVVFhPc1xuICAgKiBAcGFyYW0ge2JpZ2ludH0gYW1vdW50IEFtb3VudCB0byB0cmFuc2ZlclxuICAgKiBAcmV0dXJuIHtcbiAgICogICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICogICAgIG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAqICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgKiB9XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dChhbW91bnQ6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBjb25zdCBzZW5kZXIgPSAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Zyb21BZGRyZXNzZXMuc2xpY2UoKTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG5cbiAgICAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX3V0eG9zLmZvckVhY2goKHV0eG86IERlY29kZWRVdHhvT2JqKSA9PiB7XG4gICAgICBjb25zdCB1dHhvQW1vdW50ID0gQmlnSW50KHV0eG8uYW1vdW50KTtcbiAgICAgIHRvdGFsQW1vdW50ICs9IHV0eG9BbW91bnQ7XG5cbiAgICAgIC8vIENyZWF0ZSBpbnB1dFxuICAgICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5JbnB1dCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiB1dHhvQW1vdW50LFxuICAgICAgICBzaWdJbmRpY2VzOiBzZW5kZXIubWFwKChfLCBpKSA9PiBpKSxcbiAgICAgICAgdG9CeXRlczogKCkgPT4gbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBhc3NldCB3aXRoIEFtb3VudGVyIGludGVyZmFjZVxuICAgICAgY29uc3QgYXNzZXRJZDogQW1vdW50ZXIgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5CYXNlVHgsXG4gICAgICAgIGFtb3VudDogKCkgPT4gdXR4b0Ftb3VudCxcbiAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9hc3NldElkLCAnaGV4JykpO1xuICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBUcmFuc2ZlcmFibGVJbnB1dFxuICAgICAgY29uc3QgdHJhbnNmZXJhYmxlSW5wdXQgPSBuZXcgVHJhbnNmZXJhYmxlSW5wdXQoXG4gICAgICAgIHtcbiAgICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuVVRYT0lELFxuICAgICAgICAgIHR4SUQ6IG5ldyBJZChuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1dHhvLnR4aWQsICdoZXgnKSkpLFxuICAgICAgICAgIG91dHB1dElkeDogbmV3IEludChOdW1iZXIodXR4by5vdXRwdXRpZHgpKSxcbiAgICAgICAgICBJRDogKCkgPT4gdXR4by50eGlkLFxuICAgICAgICAgIHRvQnl0ZXM6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR4SWRCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8udHhpZCwgJ2hleCcpKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dElkeEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgICAgICBuZXcgRGF0YVZpZXcob3V0cHV0SWR4Qnl0ZXMuYnVmZmVyKS5zZXRJbnQzMigwLCBOdW1iZXIodXR4by5vdXRwdXRpZHgpLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0eElkQnl0ZXMsIG91dHB1dElkeEJ5dGVzXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8ub3V0cHV0aWR4LnRvU3RyaW5nKCkpKSksXG4gICAgICAgIGFzc2V0SWRcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBpbnB1dCBwcm9wZXJ0aWVzXG4gICAgICBPYmplY3QuYXNzaWduKHRyYW5zZmVyYWJsZUlucHV0LCB7IGlucHV0IH0pO1xuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQpO1xuXG4gICAgICAvLyBDcmVhdGUgZW1wdHkgY3JlZGVudGlhbCBmb3IgZWFjaCBpbnB1dFxuICAgICAgY29uc3QgZW1wdHlTaWduYXR1cmVzID0gc2VuZGVyLm1hcCgoKSA9PiB1dGlscy5jcmVhdGVOZXdTaWcoJycpKTtcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2gobmV3IENyZWRlbnRpYWwoZW1wdHlTaWduYXR1cmVzKSk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgb3V0cHV0IGlmIHRoZXJlIGlzIGNoYW5nZVxuICAgIGlmICh0b3RhbEFtb3VudCA+IGFtb3VudCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdG90YWxBbW91bnQgLSBhbW91bnQ7XG4gICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5CYXNlVHgsXG4gICAgICAgIGFtb3VudDogKCkgPT4gY2hhbmdlQW1vdW50LFxuICAgICAgICBhZGRyZXNzZXM6IHNlbmRlcixcbiAgICAgICAgbG9ja3RpbWU6ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fbG9ja3RpbWUsXG4gICAgICAgIHRocmVzaG9sZDogKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl90aHJlc2hvbGQsXG4gICAgICAgIHRvQnl0ZXM6ICgpID0+IG5ldyBVaW50OEFycmF5KCksXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgYXNzZXQgd2l0aCBBbW91bnRlciBpbnRlcmZhY2VcbiAgICAgIGNvbnN0IGFzc2V0SWQ6IEFtb3VudGVyID0ge1xuICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuQmFzZVR4LFxuICAgICAgICBhbW91bnQ6ICgpID0+IGNoYW5nZUFtb3VudCxcbiAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9hc3NldElkLCAnaGV4JykpO1xuICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBUcmFuc2ZlcmFibGVPdXRwdXRcbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZU91dHB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgICAge1xuICAgICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5VVFhPSUQsXG4gICAgICAgICAgdHhJRDogbmV3IElkKG5ldyBVaW50OEFycmF5KDMyKSksXG4gICAgICAgICAgb3V0cHV0SWR4OiBuZXcgSW50KDApLFxuICAgICAgICAgIElEOiAoKSA9PiAnJyxcbiAgICAgICAgICB0b0J5dGVzOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eElkQnl0ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRJZHhCeXRlcyA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3R4SWRCeXRlcywgb3V0cHV0SWR4Qnl0ZXNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoWzBdKSksXG4gICAgICAgIGFzc2V0SWRcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBvdXRwdXQgcHJvcGVydGllc1xuICAgICAgT2JqZWN0LmFzc2lnbih0cmFuc2ZlcmFibGVPdXRwdXQsIHsgb3V0cHV0IH0pO1xuICAgICAgb3V0cHV0cy5wdXNoKHRyYW5zZmVyYWJsZU91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICBpZiAodGhpcy5oYXNTaWduZXIoKSkge1xuICAgICAgLy8gU2lnbiBzZXF1ZW50aWFsbHkgdG8gZW5zdXJlIHByb3BlciBvcmRlclxuICAgICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHRoaXMuX3NpZ25lcikge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ24oa2V5UGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXZheCB0cmFuc2FjdGlvbi4gdHJhbnNhY3Rpb24gZmllbGQgaXMgY2hhbmdlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZEZsYXJlVHJhbnNhY3Rpb24oKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEZlZSBpcyBmaXggZm9yIEFWTSBhdG9taWMgdHguXG4gICAqXG4gICAqIEByZXR1cm5zIG5ldHdvcmsudHhGZWVcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBmaXhlZEZlZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLnR4RmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgY2hhaW4gaXMgdGhlIG9uZSBzZXQgZm9yIHRoZSBjb2luIGluIGNvaW5Db25maWcubmV0d29yay4gVGhlIGV4dGVybmFsIGNoYWluIGlzIHRoZSBvdGhlciBjaGFpbiBpbnZvbHZlZC5cbiAgICogVGhlIGV4dGVybmFsIGNoYWluIGlkIGlzIHRoZSBzb3VyY2Ugb24gaW1wb3J0IGFuZCB0aGUgZGVzdGluYXRpb24gb24gZXhwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhaW5JZCAtIGlkIG9mIHRoZSBleHRlcm5hbCBjaGFpblxuICAgKi9cbiAgZXh0ZXJuYWxDaGFpbklkKGNoYWluSWQ6IHN0cmluZyB8IEJ1ZmZlcik6IHRoaXMge1xuICAgIGNvbnN0IG5ld1RhcmdldENoYWluSWQgPSB0eXBlb2YgY2hhaW5JZCA9PT0gJ3N0cmluZycgPyB1dGlscy5jYjU4RGVjb2RlKGNoYWluSWQpIDogQnVmZmVyLmZyb20oY2hhaW5JZCk7XG4gICAgdGhpcy52YWxpZGF0ZUNoYWluSWQobmV3VGFyZ2V0Q2hhaW5JZCk7XG4gICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gbmV3VGFyZ2V0Q2hhaW5JZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGZlZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IGJpZ2ludH0gZmVlVmFsdWUgLSB0aGUgZmVlIHZhbHVlXG4gICAqL1xuICBmZWUoZmVlVmFsdWU6IHN0cmluZyB8IGJpZ2ludCk6IHRoaXMge1xuICAgIGNvbnN0IGZlZSA9IHR5cGVvZiBmZWVWYWx1ZSA9PT0gJ3N0cmluZycgPyBmZWVWYWx1ZSA6IGZlZVZhbHVlLnRvU3RyaW5nKCk7XG4gICAgKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9mZWUuZmVlID0gZmVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=