@bitgo-beta/sdk-coin-flrp 1.0.1-beta.38 → 1.0.1-beta.380
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/flrp.d.ts +10 -17
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +51 -77
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +43 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +150 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +24 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +151 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +30 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +163 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +34 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +173 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +12 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +30 -41
- package/dist/src/lib/atomicTransactionBuilder.d.ts +54 -70
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +134 -213
- package/dist/src/lib/iface.d.ts +65 -57
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +20 -14
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +12 -2
- package/dist/src/lib/keyPair.d.ts +5 -5
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +17 -9
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +41 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +126 -0
- package/dist/src/lib/transaction.d.ts +30 -66
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +338 -199
- package/dist/src/lib/transactionBuilder.d.ts +115 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +228 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +129 -72
- package/dist/src/lib/utils.d.ts +106 -146
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +305 -321
- package/dist/test/resources/account.d.ts +81 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +79 -0
- package/dist/test/resources/transactionData/exportInC.d.ts +50 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +58 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +60 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +101 -0
- package/dist/test/resources/transactionData/importInC.d.ts +56 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +120 -0
- package/dist/test/resources/transactionData/importInP.d.ts +66 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +84 -0
- package/dist/test/unit/flrp.js +449 -68
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +193 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +122 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +507 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +126 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +83 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +60 -0
- package/dist/test/unit/lib/utils.js +601 -207
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -10
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/lib/constants.d.ts +0 -11
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -17
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -170
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -56
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
package/dist/src/lib/utils.js
CHANGED
|
@@ -1,27 +1,79 @@
|
|
|
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.Utils = void 0;
|
|
7
|
+
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
4
8
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
-
const
|
|
9
|
+
const buffer_1 = require("buffer");
|
|
6
10
|
const crypto_1 = require("crypto");
|
|
7
|
-
const
|
|
11
|
+
const secp256k1_1 = require("@bitgo-beta/secp256k1");
|
|
12
|
+
const iface_1 = require("./iface");
|
|
13
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
14
|
+
const bech32_1 = require("bech32");
|
|
8
15
|
class Utils {
|
|
9
16
|
constructor() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Helper method to convert address components to string
|
|
19
|
+
*/
|
|
20
|
+
this.addressToString = (hrp, prefix, address) => {
|
|
21
|
+
// Convert the address bytes to 5-bit words for bech32 encoding
|
|
22
|
+
const words = bech32_1.bech32.toWords(address);
|
|
23
|
+
// Create the full bech32 address with format: P-{hrp}1{bech32_encoded_address}
|
|
24
|
+
return `${prefix}-${bech32_1.bech32.encode(hrp, words)}`;
|
|
25
|
+
};
|
|
26
|
+
// In utils.ts, add this method to the Utils class:
|
|
27
|
+
/**
|
|
28
|
+
* Parse an address string into a Buffer
|
|
29
|
+
* @param address - The address to parse
|
|
30
|
+
* @returns Buffer containing the parsed address
|
|
31
|
+
*/
|
|
32
|
+
this.parseAddress = (address) => {
|
|
33
|
+
return this.stringToAddress(address);
|
|
34
|
+
};
|
|
35
|
+
this.stringToAddress = (address, hrp) => {
|
|
36
|
+
// Handle hex addresses
|
|
37
|
+
if (address.startsWith('0x')) {
|
|
38
|
+
return buffer_1.Buffer.from(address.slice(2), 'hex');
|
|
39
|
+
}
|
|
40
|
+
// Handle raw hex without 0x prefix
|
|
41
|
+
if (/^[0-9a-fA-F]{40}$/.test(address)) {
|
|
42
|
+
return buffer_1.Buffer.from(address, 'hex');
|
|
43
|
+
}
|
|
44
|
+
// Handle Bech32 addresses
|
|
45
|
+
const parts = address.trim().split('-');
|
|
46
|
+
if (parts.length < 2) {
|
|
47
|
+
throw new Error('Error - Valid address should include -');
|
|
48
|
+
}
|
|
49
|
+
const split = parts[1].lastIndexOf('1');
|
|
50
|
+
if (split < 0) {
|
|
51
|
+
throw new Error('Error - Valid bech32 address must include separator (1)');
|
|
52
|
+
}
|
|
53
|
+
const humanReadablePart = parts[1].slice(0, split);
|
|
54
|
+
if (humanReadablePart !== 'flare' && humanReadablePart !== 'costwo') {
|
|
55
|
+
throw new Error('Error - Invalid HRP');
|
|
56
|
+
}
|
|
57
|
+
return buffer_1.Buffer.from(bech32_1.bech32.fromWords(bech32_1.bech32.decode(parts[1]).words));
|
|
13
58
|
};
|
|
14
59
|
}
|
|
60
|
+
isValidTransactionId(txId) {
|
|
61
|
+
throw new Error('Method not implemented.');
|
|
62
|
+
}
|
|
63
|
+
isValidSignature(signature) {
|
|
64
|
+
throw new Error('Method not implemented.');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if addresses in wallet match UTXO output addresses
|
|
68
|
+
*/
|
|
15
69
|
includeIn(walletAddresses, otxoOutputAddresses) {
|
|
16
70
|
return walletAddresses.map((a) => otxoOutputAddresses.includes(a)).reduce((a, b) => a && b, true);
|
|
17
71
|
}
|
|
18
72
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* @
|
|
22
|
-
* @returns {boolean} - the validation result
|
|
73
|
+
* Validates a Flare address or array of addresses
|
|
74
|
+
* @param {string | string[]} address - address(es) to validate
|
|
75
|
+
* @returns {boolean} - validation result
|
|
23
76
|
*/
|
|
24
|
-
/** @inheritdoc */
|
|
25
77
|
isValidAddress(address) {
|
|
26
78
|
const addressArr = Array.isArray(address) ? address : address.split('~');
|
|
27
79
|
for (const address of addressArr) {
|
|
@@ -32,65 +84,53 @@ class Utils {
|
|
|
32
84
|
return true;
|
|
33
85
|
}
|
|
34
86
|
isValidAddressRegex(address) {
|
|
35
|
-
return
|
|
87
|
+
return /^(^P||NodeID)-[a-zA-Z0-9]+$/.test(address);
|
|
36
88
|
}
|
|
37
89
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* @
|
|
41
|
-
* @returns {boolean} - the validation result
|
|
90
|
+
* Validates a block ID
|
|
91
|
+
* @param {string} hash - block ID to validate
|
|
92
|
+
* @returns {boolean} - validation result
|
|
42
93
|
*/
|
|
43
|
-
/** @inheritdoc */
|
|
44
94
|
isValidBlockId(hash) {
|
|
45
|
-
// FlareJS equivalent - check if it's a valid CB58 hash with correct length
|
|
46
95
|
try {
|
|
47
|
-
const decoded = Buffer.from(hash);
|
|
48
|
-
return decoded.length ===
|
|
96
|
+
const decoded = buffer_1.Buffer.from(hash, 'hex');
|
|
97
|
+
return decoded.length === 32;
|
|
49
98
|
}
|
|
50
99
|
catch {
|
|
51
100
|
return false;
|
|
52
101
|
}
|
|
53
102
|
}
|
|
54
103
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* @param {string} pub - the public key to be validated
|
|
59
|
-
* @returns {boolean} - the validation result
|
|
104
|
+
* Validates a public key
|
|
105
|
+
* @param {string} pub - public key to validate
|
|
106
|
+
* @returns {boolean} - validation result
|
|
60
107
|
*/
|
|
61
108
|
isValidPublicKey(pub) {
|
|
62
109
|
if ((0, sdk_core_1.isValidXpub)(pub))
|
|
63
110
|
return true;
|
|
64
111
|
let pubBuf;
|
|
65
|
-
if (pub.length ===
|
|
112
|
+
if (pub.length === 50) {
|
|
66
113
|
try {
|
|
67
|
-
|
|
68
|
-
pubBuf = Buffer.from(pub, 'hex'); // Temporary placeholder
|
|
114
|
+
pubBuf = buffer_1.Buffer.from(pub, 'hex');
|
|
69
115
|
}
|
|
70
116
|
catch {
|
|
71
117
|
return false;
|
|
72
118
|
}
|
|
73
119
|
}
|
|
74
120
|
else {
|
|
75
|
-
if (pub.length !==
|
|
121
|
+
if (pub.length !== 66 && pub.length !== 130)
|
|
76
122
|
return false;
|
|
77
|
-
}
|
|
78
123
|
const firstByte = pub.slice(0, 2);
|
|
79
|
-
|
|
80
|
-
if (pub.length === constants_1.UNCOMPRESSED_PUBLIC_KEY_LENGTH && firstByte !== '04') {
|
|
124
|
+
if (pub.length === 130 && firstByte !== '04')
|
|
81
125
|
return false;
|
|
82
|
-
|
|
83
|
-
// compressed public key
|
|
84
|
-
if (pub.length === constants_1.COMPRESSED_PUBLIC_KEY_LENGTH && firstByte !== '02' && firstByte !== '03') {
|
|
126
|
+
if (pub.length === 66 && firstByte !== '02' && firstByte !== '03')
|
|
85
127
|
return false;
|
|
86
|
-
}
|
|
87
128
|
if (!this.allHexChars(pub))
|
|
88
129
|
return false;
|
|
89
|
-
pubBuf = Buffer.from(pub, 'hex');
|
|
130
|
+
pubBuf = buffer_1.Buffer.from(pub, 'hex');
|
|
90
131
|
}
|
|
91
|
-
// validate the public key using BitGo secp256k1
|
|
92
132
|
try {
|
|
93
|
-
secp256k1_1.ecc.isPoint(pubBuf);
|
|
133
|
+
secp256k1_1.ecc.isPoint(pubBuf);
|
|
94
134
|
return true;
|
|
95
135
|
}
|
|
96
136
|
catch (e) {
|
|
@@ -98,269 +138,134 @@ class Utils {
|
|
|
98
138
|
}
|
|
99
139
|
}
|
|
100
140
|
/**
|
|
101
|
-
*
|
|
102
|
-
* private key
|
|
103
|
-
*
|
|
104
|
-
* The protocol key format is described in the @stacks/transactions npm package, in the
|
|
105
|
-
* createStacksPrivateKey function:
|
|
106
|
-
* https://github.com/blockstack/stacks.js/blob/master/packages/transactions/src/keys.ts#L125
|
|
107
|
-
*
|
|
108
|
-
* @param {string} prv - the private key (or extended private key) to be validated
|
|
109
|
-
* @returns {boolean} - the validation result
|
|
141
|
+
* Validates a private key
|
|
142
|
+
* @param {string} prv - private key to validate
|
|
143
|
+
* @returns {boolean} - validation result
|
|
110
144
|
*/
|
|
111
145
|
isValidPrivateKey(prv) {
|
|
112
146
|
if ((0, sdk_core_1.isValidXprv)(prv))
|
|
113
147
|
return true;
|
|
114
|
-
if (prv.length !==
|
|
148
|
+
if (prv.length !== 64 && prv.length !== 66)
|
|
115
149
|
return false;
|
|
116
|
-
|
|
117
|
-
if (prv.length === constants_1.SUFFIXED_PRIVATE_KEY_LENGTH &&
|
|
118
|
-
prv.slice(constants_1.RAW_PRIVATE_KEY_LENGTH) !== constants_1.PRIVATE_KEY_COMPRESSED_SUFFIX) {
|
|
150
|
+
if (prv.length === 66 && prv.slice(64) !== '01')
|
|
119
151
|
return false;
|
|
120
|
-
}
|
|
121
152
|
return this.allHexChars(prv);
|
|
122
153
|
}
|
|
123
154
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* @param {string} maybe - the string to be validated
|
|
127
|
-
* @returns {boolean} - the validation result
|
|
155
|
+
* Checks if a string contains only hex characters
|
|
128
156
|
*/
|
|
129
|
-
allHexChars(
|
|
130
|
-
return
|
|
157
|
+
allHexChars(str) {
|
|
158
|
+
return /^(0x){0,1}([0-9a-f])+$/i.test(str);
|
|
131
159
|
}
|
|
132
160
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* @param {string} address - the Ethereum address to validate
|
|
137
|
-
* @returns {boolean} - true if valid Ethereum address format
|
|
161
|
+
* Creates a signature using the Flare network parameters
|
|
162
|
+
* Returns a 65-byte signature (64 bytes signature + 1 byte recovery parameter)
|
|
138
163
|
*/
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
164
|
+
createSignature(network, message, prv) {
|
|
165
|
+
const messageHash = this.sha256(message);
|
|
166
|
+
const signature = secp256k1_1.ecc.sign(messageHash, prv);
|
|
167
|
+
// Get the public key from the private key for recovery parameter determination
|
|
168
|
+
const publicKey = secp256k1_1.ecc.pointFromScalar(prv, true);
|
|
169
|
+
if (!publicKey) {
|
|
170
|
+
throw new Error('Failed to derive public key from private key');
|
|
142
171
|
}
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
*
|
|
151
|
-
* @param {T} obj - the source object
|
|
152
|
-
* @param {K[]} keys - array of property keys to pick
|
|
153
|
-
* @returns {Pick<T, K>} - new object with only the specified properties
|
|
154
|
-
*/
|
|
155
|
-
pick(obj, keys) {
|
|
156
|
-
const result = {};
|
|
157
|
-
for (const key of keys) {
|
|
158
|
-
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
159
|
-
result[key] = obj[key];
|
|
172
|
+
// Try recovery with param 0 and 1 to find the correct one
|
|
173
|
+
let recoveryParam = 0;
|
|
174
|
+
for (let i = 0; i <= 1; i++) {
|
|
175
|
+
const recovered = secp256k1_1.ecc.recoverPublicKey(messageHash, signature, i, true);
|
|
176
|
+
if (recovered && buffer_1.Buffer.from(recovered).equals(buffer_1.Buffer.from(publicKey))) {
|
|
177
|
+
recoveryParam = i;
|
|
178
|
+
break;
|
|
160
179
|
}
|
|
161
180
|
}
|
|
162
|
-
|
|
181
|
+
// Append recovery parameter to create 65-byte signature
|
|
182
|
+
const sigWithRecovery = buffer_1.Buffer.alloc(65);
|
|
183
|
+
buffer_1.Buffer.from(signature).copy(sigWithRecovery, 0);
|
|
184
|
+
sigWithRecovery[64] = recoveryParam;
|
|
185
|
+
return sigWithRecovery;
|
|
163
186
|
}
|
|
164
187
|
/**
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* @param
|
|
168
|
-
* @param
|
|
169
|
-
* @returns
|
|
188
|
+
* Verifies a signature
|
|
189
|
+
* @param messageHash - The SHA256 hash of the message (e.g., signablePayload)
|
|
190
|
+
* @param signature - The 64-byte signature (without recovery parameter)
|
|
191
|
+
* @param publicKey - The public key to verify against
|
|
192
|
+
* @returns true if signature is valid
|
|
170
193
|
*/
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
return
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (typeof a !== typeof b)
|
|
194
|
+
verifySignature(messageHash, signature, publicKey) {
|
|
195
|
+
try {
|
|
196
|
+
return secp256k1_1.ecc.verify(messageHash, publicKey, signature);
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
177
199
|
return false;
|
|
178
|
-
if (typeof a === 'object') {
|
|
179
|
-
if (Array.isArray(a) !== Array.isArray(b))
|
|
180
|
-
return false;
|
|
181
|
-
if (Array.isArray(a)) {
|
|
182
|
-
const arrB = b;
|
|
183
|
-
if (a.length !== arrB.length)
|
|
184
|
-
return false;
|
|
185
|
-
for (let i = 0; i < a.length; i++) {
|
|
186
|
-
if (!this.isEqual(a[i], arrB[i]))
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
return true;
|
|
190
|
-
}
|
|
191
|
-
const objA = a;
|
|
192
|
-
const objB = b;
|
|
193
|
-
const keysA = Object.keys(objA);
|
|
194
|
-
const keysB = Object.keys(objB);
|
|
195
|
-
if (keysA.length !== keysB.length)
|
|
196
|
-
return false;
|
|
197
|
-
for (const key of keysA) {
|
|
198
|
-
if (!keysB.includes(key))
|
|
199
|
-
return false;
|
|
200
|
-
if (!this.isEqual(objA[key], objB[key]))
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
return true;
|
|
204
200
|
}
|
|
205
|
-
return false;
|
|
206
|
-
}
|
|
207
|
-
/** @inheritdoc */
|
|
208
|
-
isValidSignature(signature) {
|
|
209
|
-
throw new sdk_core_1.NotImplementedError('isValidSignature not implemented');
|
|
210
|
-
}
|
|
211
|
-
/** @inheritdoc */
|
|
212
|
-
isValidTransactionId(txId) {
|
|
213
|
-
throw new sdk_core_1.NotImplementedError('isValidTransactionId not implemented');
|
|
214
201
|
}
|
|
215
202
|
/**
|
|
216
|
-
*
|
|
217
|
-
* @param network
|
|
218
|
-
* @param message
|
|
219
|
-
* @param prv
|
|
220
|
-
* @return signature
|
|
203
|
+
* Creates a new signature object
|
|
221
204
|
*/
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const signature = secp256k1_1.ecc.sign(message, prv);
|
|
226
|
-
return Buffer.from(signature);
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
throw new Error(`Failed to create signature: ${error}`);
|
|
230
|
-
}
|
|
205
|
+
createNewSig(sigHex) {
|
|
206
|
+
const buffer = buffer_1.Buffer.from(sigHex.padStart(130, '0'), 'hex');
|
|
207
|
+
return new flarejs_1.Signature(buffer);
|
|
231
208
|
}
|
|
232
209
|
/**
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* @param
|
|
237
|
-
* @param publicKey - public key instead of private key for verification
|
|
238
|
-
* @return true if it's verify successful
|
|
210
|
+
* Creates an empty signature with embedded address for signature slot identification.
|
|
211
|
+
* The address is embedded at position 90 (after the first 45 zero bytes).
|
|
212
|
+
* This allows the signing logic to determine which slot belongs to which address.
|
|
213
|
+
* @param addressHex The 20-byte address in hex format (40 chars, without 0x prefix)
|
|
239
214
|
*/
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
215
|
+
createEmptySigWithAddress(addressHex) {
|
|
216
|
+
// First 45 bytes (90 hex chars) are zeros, followed by 20-byte address (40 hex chars)
|
|
217
|
+
const cleanAddr = this.removeHexPrefix(addressHex).toLowerCase();
|
|
218
|
+
const sigHex = '0'.repeat(90) + cleanAddr.padStart(40, '0');
|
|
219
|
+
const buffer = buffer_1.Buffer.from(sigHex, 'hex');
|
|
220
|
+
return new flarejs_1.Signature(buffer);
|
|
247
221
|
}
|
|
248
222
|
/**
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
* @param message
|
|
252
|
-
* @param signature
|
|
253
|
-
* @return recovered public key
|
|
223
|
+
* Extracts the embedded address from an empty signature.
|
|
224
|
+
* Returns the address hex string (40 chars) or empty string if not found.
|
|
254
225
|
*/
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
//
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
catch (error) {
|
|
262
|
-
throw new Error(`Failed to recover signature: ${error}`);
|
|
226
|
+
getAddressFromEmptySig(sig) {
|
|
227
|
+
const cleanSig = this.removeHexPrefix(sig);
|
|
228
|
+
if (cleanSig.length >= 130) {
|
|
229
|
+
// Address is at position 90-130 (last 40 hex chars = 20 bytes)
|
|
230
|
+
return cleanSig.substring(90, 130).toLowerCase();
|
|
263
231
|
}
|
|
232
|
+
return '';
|
|
264
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Computes SHA256 hash
|
|
236
|
+
*/
|
|
265
237
|
sha256(buf) {
|
|
266
238
|
return (0, crypto_1.createHash)('sha256').update(buf).digest();
|
|
267
239
|
}
|
|
268
240
|
/**
|
|
269
|
-
*
|
|
270
|
-
* It's to reuse in TransactionBuilder and TransactionBuilderFactory
|
|
271
|
-
*
|
|
272
|
-
* @param rawTransaction Transaction as hex string
|
|
241
|
+
* Validates raw transaction format
|
|
273
242
|
*/
|
|
274
243
|
validateRawTransaction(rawTransaction) {
|
|
275
244
|
if (!rawTransaction) {
|
|
276
245
|
throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
|
|
277
246
|
}
|
|
278
|
-
if (!
|
|
247
|
+
if (!this.allHexChars(rawTransaction)) {
|
|
279
248
|
throw new sdk_core_1.ParseTransactionError('Raw transaction is not hex string');
|
|
280
249
|
}
|
|
281
250
|
}
|
|
282
251
|
/**
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
* @param {DeprecatedTx} tx
|
|
286
|
-
* @param {string} blockchainId
|
|
287
|
-
* @returns true if tx is for blockchainId
|
|
288
|
-
*/
|
|
289
|
-
isTransactionOf(tx, blockchainId) {
|
|
290
|
-
// FlareJS equivalent - this would need proper CB58 encoding implementation
|
|
291
|
-
try {
|
|
292
|
-
const txRecord = tx;
|
|
293
|
-
const unsignedTx = txRecord.getUnsignedTx();
|
|
294
|
-
const transaction = unsignedTx.getTransaction();
|
|
295
|
-
const txBlockchainId = transaction.getBlockchainID();
|
|
296
|
-
return Buffer.from(txBlockchainId).toString('hex') === blockchainId;
|
|
297
|
-
}
|
|
298
|
-
catch (error) {
|
|
299
|
-
return false;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Check if Output is from PVM.
|
|
304
|
-
* Output could be EVM or PVM output.
|
|
305
|
-
* @param {DeprecatedOutput} output
|
|
306
|
-
* @returns {boolean} output has transferable output structure
|
|
307
|
-
*/
|
|
308
|
-
deprecatedIsTransferableOutput(output) {
|
|
309
|
-
return 'getOutput' in output;
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Check if Output is from PVM.
|
|
313
|
-
* Output could be EVM or PVM output.
|
|
314
|
-
* @param {Output} output
|
|
315
|
-
* @returns {boolean} output is TransferableOutput
|
|
252
|
+
* Checks if output is TransferableOutput type
|
|
316
253
|
*/
|
|
317
254
|
isTransferableOutput(output) {
|
|
318
|
-
return
|
|
255
|
+
return output?._type === flarejs_1.TypeSymbols.TransferableOutput;
|
|
319
256
|
}
|
|
320
257
|
/**
|
|
321
|
-
*
|
|
322
|
-
* @param network required to stringify addresses
|
|
323
|
-
* @return mapper function
|
|
324
|
-
*/
|
|
325
|
-
deprecatedMapOutputToEntry(network) {
|
|
326
|
-
return (output) => {
|
|
327
|
-
if (this.deprecatedIsTransferableOutput(output)) {
|
|
328
|
-
// Simplified implementation for FlareJS
|
|
329
|
-
try {
|
|
330
|
-
const transferableOutput = output;
|
|
331
|
-
const amount = transferableOutput.amount();
|
|
332
|
-
// Simplified address handling - would need proper FlareJS address utilities
|
|
333
|
-
const address = 'flare-address-placeholder'; // TODO: implement proper address conversion
|
|
334
|
-
return {
|
|
335
|
-
value: amount.toString(),
|
|
336
|
-
address,
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
catch (error) {
|
|
340
|
-
throw new Error(`Failed to map output: ${error}`);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
else {
|
|
344
|
-
// Handle EVM output case - simplified
|
|
345
|
-
return {
|
|
346
|
-
value: '0', // TODO: implement proper amount extraction
|
|
347
|
-
address: '0x0000000000000000000000000000000000000000', // TODO: implement proper address extraction
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Return a mapper function to that network address representation.
|
|
354
|
-
* @param network required to stringify addresses
|
|
355
|
-
* @return mapper function
|
|
258
|
+
* Maps outputs to entry format
|
|
356
259
|
*/
|
|
357
260
|
mapOutputToEntry(network) {
|
|
358
261
|
return (output) => {
|
|
359
262
|
if (this.isTransferableOutput(output)) {
|
|
360
|
-
const
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
|
|
263
|
+
const outputAmount = output.amount();
|
|
264
|
+
const address = output.output
|
|
265
|
+
.getOwners()
|
|
266
|
+
.map((a) => this.addressToString(network.hrp, network.alias, buffer_1.Buffer.from(a)))
|
|
267
|
+
.sort()
|
|
268
|
+
.join(iface_1.ADDRESS_SEPARATOR);
|
|
364
269
|
return {
|
|
365
270
|
value: outputAmount.toString(),
|
|
366
271
|
address,
|
|
@@ -372,116 +277,195 @@ class Utils {
|
|
|
372
277
|
};
|
|
373
278
|
}
|
|
374
279
|
/**
|
|
375
|
-
*
|
|
376
|
-
* @param hex string
|
|
377
|
-
* @returns hex without 0x
|
|
280
|
+
* Removes 0x prefix from hex string
|
|
378
281
|
*/
|
|
379
282
|
removeHexPrefix(hex) {
|
|
380
|
-
|
|
381
|
-
return hex.substring(2);
|
|
382
|
-
}
|
|
383
|
-
return hex;
|
|
283
|
+
return hex.startsWith('0x') ? hex.substring(2) : hex;
|
|
384
284
|
}
|
|
385
285
|
/**
|
|
386
|
-
*
|
|
387
|
-
* @param {string} outputidx number
|
|
388
|
-
* @return {Buffer} buffer of size 4 with that number value
|
|
286
|
+
* Converts output index to buffer
|
|
389
287
|
*/
|
|
390
288
|
outputidxNumberToBuffer(outputidx) {
|
|
391
|
-
return Buffer.from(Number(outputidx).toString(16).padStart(
|
|
289
|
+
return buffer_1.Buffer.from(Number(outputidx).toString(16).padStart(8, '0'), 'hex');
|
|
392
290
|
}
|
|
393
291
|
/**
|
|
394
|
-
*
|
|
395
|
-
* @param {Buffer} outputidx
|
|
396
|
-
* @return {string} outputidx number
|
|
292
|
+
* Converts output index buffer to number string
|
|
397
293
|
*/
|
|
398
294
|
outputidxBufferToNumber(outputidx) {
|
|
399
295
|
return parseInt(outputidx.toString('hex'), 16).toString();
|
|
400
296
|
}
|
|
401
297
|
/**
|
|
402
|
-
*
|
|
403
|
-
* @param {string} data - CB58 encoded string
|
|
404
|
-
* @returns {Buffer} decoded buffer
|
|
298
|
+
* Decodes a base58 string with checksum to a Buffer
|
|
405
299
|
*/
|
|
406
|
-
cb58Decode(
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
return Buffer.from(data, 'hex');
|
|
411
|
-
}
|
|
412
|
-
catch {
|
|
413
|
-
// Fallback to buffer from string
|
|
414
|
-
return Buffer.from(data);
|
|
300
|
+
cb58Decode(str) {
|
|
301
|
+
const decoded = bs58_1.default.decode(str);
|
|
302
|
+
if (!this.validateChecksum(buffer_1.Buffer.from(decoded))) {
|
|
303
|
+
throw new Error('Invalid checksum');
|
|
415
304
|
}
|
|
305
|
+
return buffer_1.Buffer.from(decoded.slice(0, decoded.length - 4));
|
|
416
306
|
}
|
|
417
307
|
/**
|
|
418
|
-
*
|
|
419
|
-
* @param {string} hrp - Human readable part
|
|
420
|
-
* @param {string} chainid - Chain identifier
|
|
421
|
-
* @param {Buffer} addressBuffer - Address buffer
|
|
422
|
-
* @returns {string} Address string
|
|
308
|
+
* Validates a checksum on a Buffer and returns true if valid, false if not
|
|
423
309
|
*/
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
310
|
+
validateChecksum(buff) {
|
|
311
|
+
const hashSlice = buff.slice(buff.length - 4);
|
|
312
|
+
const calculatedHashSlice = (0, crypto_1.createHash)('sha256')
|
|
313
|
+
.update(buff.slice(0, buff.length - 4))
|
|
314
|
+
.digest()
|
|
315
|
+
.slice(28);
|
|
316
|
+
return hashSlice.toString('hex') === calculatedHashSlice.toString('hex');
|
|
427
317
|
}
|
|
428
318
|
/**
|
|
429
|
-
*
|
|
430
|
-
* Follows FlareJS utils.stringToBytes pattern
|
|
431
|
-
* @param {string} text - Text to convert
|
|
432
|
-
* @returns {Uint8Array} Byte array
|
|
319
|
+
* Encodes a Buffer as a base58 string with checksum
|
|
433
320
|
*/
|
|
434
|
-
|
|
435
|
-
|
|
321
|
+
cb58Encode(bytes) {
|
|
322
|
+
const withChecksum = this.addChecksum(bytes);
|
|
323
|
+
return bs58_1.default.encode(withChecksum);
|
|
436
324
|
}
|
|
437
325
|
/**
|
|
438
|
-
*
|
|
439
|
-
*
|
|
440
|
-
* @returns {string} Decoded string
|
|
326
|
+
* Adds a checksum to a Buffer and returns the concatenated result
|
|
327
|
+
* Uses last 4 bytes of SHA256 hash as checksum (matching avaxp behavior)
|
|
441
328
|
*/
|
|
442
|
-
|
|
443
|
-
|
|
329
|
+
addChecksum(buff) {
|
|
330
|
+
const buffer = buffer_1.Buffer.from(buff);
|
|
331
|
+
const hashSlice = (0, crypto_1.createHash)('sha256').update(buffer).digest().slice(28);
|
|
332
|
+
return new Uint8Array(buffer_1.Buffer.concat([buffer, hashSlice]));
|
|
333
|
+
}
|
|
334
|
+
flareIdString(value) {
|
|
335
|
+
return new flarejs_1.Id(buffer_1.Buffer.from(value, 'hex'));
|
|
444
336
|
}
|
|
445
337
|
/**
|
|
446
|
-
*
|
|
447
|
-
*
|
|
448
|
-
* @param
|
|
449
|
-
* @
|
|
338
|
+
* Recover public key from signature
|
|
339
|
+
* @param messageHash - The SHA256 hash of the message (e.g., signablePayload)
|
|
340
|
+
* @param signature - 65-byte signature (64 bytes signature + 1 byte recovery parameter)
|
|
341
|
+
* @return recovered public key
|
|
450
342
|
*/
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
343
|
+
recoverySignature(messageHash, signature) {
|
|
344
|
+
try {
|
|
345
|
+
// Extract recovery parameter and signature
|
|
346
|
+
if (signature.length !== 65) {
|
|
347
|
+
throw new Error('Invalid signature length - expected 65 bytes (64 bytes signature + 1 byte recovery)');
|
|
348
|
+
}
|
|
349
|
+
const recoveryParam = signature[64];
|
|
350
|
+
const sigOnly = signature.slice(0, 64);
|
|
351
|
+
// Recover public key using the provided recovery parameter
|
|
352
|
+
// messageHash should already be the SHA256 hash (signablePayload)
|
|
353
|
+
const recovered = secp256k1_1.ecc.recoverPublicKey(messageHash, sigOnly, recoveryParam, true);
|
|
354
|
+
if (!recovered) {
|
|
355
|
+
throw new Error('Failed to recover public key');
|
|
356
|
+
}
|
|
357
|
+
return buffer_1.Buffer.from(recovered);
|
|
457
358
|
}
|
|
458
|
-
|
|
459
|
-
|
|
359
|
+
catch (error) {
|
|
360
|
+
throw new Error(`Failed to recover signature: ${error.message}`);
|
|
460
361
|
}
|
|
461
|
-
throw new sdk_core_1.InvalidTransactionError('Invalid memo format');
|
|
462
362
|
}
|
|
463
363
|
/**
|
|
464
|
-
*
|
|
465
|
-
*
|
|
466
|
-
* @
|
|
364
|
+
* Check if tx is for the blockchainId
|
|
365
|
+
*
|
|
366
|
+
* @param {Tx} tx
|
|
367
|
+
* @param {string} blockchainId - blockchain ID in hex format
|
|
368
|
+
* @returns true if tx is for blockchainId
|
|
467
369
|
*/
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
370
|
+
isTransactionOf(tx, blockchainId) {
|
|
371
|
+
// Note: getBlockchainId() and BlockchainId.value() return CB58-encoded strings,
|
|
372
|
+
// but we need hex format, so we use toBytes() and convert to hex
|
|
373
|
+
const extractBlockchainId = (txObj) => {
|
|
374
|
+
if (typeof txObj.getTx === 'function') {
|
|
375
|
+
const innerTx = txObj.getTx();
|
|
376
|
+
if (innerTx.baseTx?.BlockchainId?.toBytes) {
|
|
377
|
+
return buffer_1.Buffer.from(innerTx.baseTx.BlockchainId.toBytes()).toString('hex');
|
|
378
|
+
}
|
|
379
|
+
if (innerTx.blockchainId?.toBytes) {
|
|
380
|
+
return buffer_1.Buffer.from(innerTx.blockchainId.toBytes()).toString('hex');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (txObj.tx?.baseTx?.BlockchainId?.toBytes) {
|
|
384
|
+
return buffer_1.Buffer.from(txObj.tx.baseTx.BlockchainId.toBytes()).toString('hex');
|
|
385
|
+
}
|
|
386
|
+
if (txObj.baseTx?.BlockchainId?.toBytes) {
|
|
387
|
+
return buffer_1.Buffer.from(txObj.baseTx.BlockchainId.toBytes()).toString('hex');
|
|
388
|
+
}
|
|
389
|
+
if (txObj.blockchainId?.toBytes) {
|
|
390
|
+
return buffer_1.Buffer.from(txObj.blockchainId.toBytes()).toString('hex');
|
|
391
|
+
}
|
|
392
|
+
return null;
|
|
393
|
+
};
|
|
394
|
+
const txBlockchainId = extractBlockchainId(tx);
|
|
395
|
+
return txBlockchainId === blockchainId;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Convert FlareJS native Utxo to DecodedUtxoObj for internal use
|
|
399
|
+
* @param utxo - FlareJS Utxo object
|
|
400
|
+
* @param network - Flare network configuration
|
|
401
|
+
* @returns DecodedUtxoObj compatible with existing methods
|
|
402
|
+
*/
|
|
403
|
+
utxoToDecoded(utxo, network) {
|
|
404
|
+
const outputOwners = utxo.getOutputOwners();
|
|
405
|
+
const output = utxo.output;
|
|
406
|
+
// Get amount from output
|
|
407
|
+
const amount = output.amount().toString();
|
|
408
|
+
// Get txid from utxoId (cb58 encoded)
|
|
409
|
+
const txid = this.cb58Encode(buffer_1.Buffer.from(utxo.utxoId.txID.toBytes()));
|
|
410
|
+
// Get output index
|
|
411
|
+
const outputidx = utxo.utxoId.outputIdx.value().toString();
|
|
412
|
+
// Get threshold
|
|
413
|
+
const threshold = outputOwners.threshold.value();
|
|
414
|
+
// Get locktime
|
|
415
|
+
const locktime = outputOwners.locktime.value().toString();
|
|
416
|
+
// Get addresses as bech32 strings
|
|
417
|
+
const addresses = outputOwners.addrs.map((addr) => this.addressToString(network.hrp, network.alias, buffer_1.Buffer.from(addr.toBytes())));
|
|
418
|
+
return {
|
|
419
|
+
outputID: iface_1.SECP256K1_Transfer_Output,
|
|
420
|
+
locktime,
|
|
421
|
+
amount,
|
|
422
|
+
txid,
|
|
423
|
+
outputidx,
|
|
424
|
+
threshold,
|
|
425
|
+
addresses,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Convert array of FlareJS Utxos to DecodedUtxoObj array
|
|
430
|
+
* @param utxos - Array of FlareJS Utxo objects
|
|
431
|
+
* @param network - Flare network configuration
|
|
432
|
+
* @returns Array of DecodedUtxoObj
|
|
433
|
+
*/
|
|
434
|
+
utxosToDecoded(utxos, network) {
|
|
435
|
+
return utxos.map((utxo) => this.utxoToDecoded(utxo, network));
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Convert DecodedUtxoObj to native FlareJS Utxo object
|
|
439
|
+
* This is the reverse of utxoToDecoded
|
|
440
|
+
* @param decoded - DecodedUtxoObj to convert
|
|
441
|
+
* @param assetId - Asset ID as cb58 encoded string
|
|
442
|
+
* @returns Native FlareJS Utxo object
|
|
443
|
+
*/
|
|
444
|
+
decodedToUtxo(decoded, assetId) {
|
|
445
|
+
// Create UTXOID from txid and output index
|
|
446
|
+
const utxoId = flarejs_1.avaxSerial.UTXOID.fromNative(decoded.txid, parseInt(decoded.outputidx, 10));
|
|
447
|
+
// Parse addresses from bech32 strings to byte buffers
|
|
448
|
+
const addressBytes = decoded.addresses.map((addr) => this.parseAddress(addr));
|
|
449
|
+
// Create OutputOwners with locktime, threshold, and addresses
|
|
450
|
+
const locktime = decoded.locktime ? BigInt(decoded.locktime) : BigInt(0);
|
|
451
|
+
const outputOwners = flarejs_1.OutputOwners.fromNative(addressBytes, locktime, decoded.threshold);
|
|
452
|
+
// Create TransferOutput with amount and owners
|
|
453
|
+
const amount = BigInt(decoded.amount);
|
|
454
|
+
const transferOutput = new flarejs_1.TransferOutput(new flarejs_1.BigIntPr(amount), outputOwners);
|
|
455
|
+
// Create and return the Utxo
|
|
456
|
+
return new flarejs_1.Utxo(utxoId, flarejs_1.Id.fromString(assetId), transferOutput);
|
|
473
457
|
}
|
|
474
458
|
/**
|
|
475
|
-
*
|
|
476
|
-
* @param
|
|
477
|
-
* @param
|
|
478
|
-
* @returns
|
|
459
|
+
* Convert array of DecodedUtxoObj to native FlareJS Utxo objects
|
|
460
|
+
* @param decodedUtxos - Array of DecodedUtxoObj
|
|
461
|
+
* @param assetId - Asset ID as cb58 encoded string
|
|
462
|
+
* @returns Array of native FlareJS Utxo objects
|
|
479
463
|
*/
|
|
480
|
-
|
|
481
|
-
return
|
|
464
|
+
decodedToUtxos(decodedUtxos, assetId) {
|
|
465
|
+
return decodedUtxos.map((decoded) => this.decodedToUtxo(decoded, assetId));
|
|
482
466
|
}
|
|
483
467
|
}
|
|
484
468
|
exports.Utils = Utils;
|
|
485
469
|
const utils = new Utils();
|
|
486
470
|
exports.default = utils;
|
|
487
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG1EQVE4QjtBQUU5QixxREFBNEM7QUFDNUMsbUNBQW9DO0FBRXBDLDJDQVdxQjtBQUVyQixNQUFhLEtBQUs7SUFBbEI7UUE0RlMsaUJBQVksR0FBRyxDQUFDLEdBQVcsRUFBVSxFQUFFO1lBQzVDLHlDQUF5QztZQUN6QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsNEJBQTRCO1FBQzlELENBQUMsQ0FBQztJQThaSixDQUFDO0lBNWZRLFNBQVMsQ0FBQyxlQUF5QixFQUFFLG1CQUE2QjtRQUN2RSxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxPQUEwQjtRQUN2QyxNQUFNLFVBQVUsR0FBYSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkYsS0FBSyxNQUFNLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxt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QUM7UUFDbEMsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsU0FBcUI7UUFDbEMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFxQixFQUFFLE9BQU8sR0FBRyxJQUFJO1FBQ3BELE9BQU8sU0FBUyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBN2ZELHNCQTZmQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7XG4gIEJhc2VVdGlscyxcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHBydixcbiAgaXNWYWxpZFhwdWIsXG4gIE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRmxhcmVOZXR3b3JrIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBlY2MgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBEZXByZWNhdGVkT3V0cHV0LCBEZXByZWNhdGVkVHgsIE91dHB1dCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHtcbiAgREVDT0RFRF9CTE9DS19JRF9MRU5HVEgsXG4gIFNIT1JUX1BVQl9LRVlfTEVOR1RILFxuICBDT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RILFxuICBVTkNPTVBSRVNTRURfUFVCTElDX0tFWV9MRU5HVEgsXG4gIFJBV19QUklWQVRFX0tFWV9MRU5HVEgsXG4gIFNVRkZJWEVEX1BSSVZBVEVfS0VZX0xFTkdUSCxcbiAgUFJJVkFURV9LRVlfQ09NUFJFU1NFRF9TVUZGSVgsXG4gIE9VVFBVVF9JTkRFWF9IRVhfTEVOR1RILFxuICBBRERSRVNTX1JFR0VYLFxuICBIRVhfUkVHRVgsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgcHVibGljIGluY2x1ZGVJbih3YWxsZXRBZGRyZXNzZXM6IHN0cmluZ1tdLCBvdHhvT3V0cHV0QWRkcmVzc2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3YWxsZXRBZGRyZXNzZXMubWFwKChhKSA9PiBvdHhvT3V0cHV0QWRkcmVzc2VzLmluY2x1ZGVzKGEpKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYiwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGl0IGlzIGEgdmFsaWQgYWRkcmVzcyBubyBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFkZHJlc3NBcnI6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShhZGRyZXNzKSA/IGFkZHJlc3MgOiBhZGRyZXNzLnNwbGl0KCd+Jyk7XG5cbiAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgYWRkcmVzc0Fycikge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzUmVnZXgoYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQWRkcmVzc1JlZ2V4KGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBRERSRVNTX1JFR0VYLnRlc3QoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGl0IGlzIGEgdmFsaWQgYmxvY2tJZCB3aXRoIGxlbmd0aCA2NiBpbmNsdWRpbmcgMHhcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggLSBibG9ja0lkIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBGbGFyZUpTIGVxdWl2YWxlbnQgLSBjaGVjayBpZiBpdCdzIGEgdmFsaWQgQ0I1OCBoYXNoIHdpdGggY29ycmVjdCBsZW5ndGhcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKGhhc2gpOyAvLyBGbGFyZUpTIHNob3VsZCBwcm92aWRlIENCNTggdXRpbGl0aWVzXG4gICAgICByZXR1cm4gZGVjb2RlZC5sZW5ndGggPT09IERFQ09ERURfQkxPQ0tfSURfTEVOR1RIO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIHB1YmxpYyBrZXkgb3JcbiAgICogZXh0ZW5kZWQgcHVibGljIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YiAtIHRoZSAgcHVibGljIGtleSB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkUHVibGljS2V5KHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzVmFsaWRYcHViKHB1YikpIHJldHVybiB0cnVlO1xuXG4gICAgbGV0IHB1YkJ1ZjogQnVmZmVyO1xuICAgIGlmIChwdWIubGVuZ3RoID09PSBTSE9SVF9QVUJfS0VZX0xFTkdUSCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRm9yIEZsYXJlSlMsIHdlJ2xsIG5lZWQgdG8gaW1wbGVtZW50IENCNTggZGVjb2RlIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgcHViQnVmID0gQnVmZmVyLmZyb20ocHViLCAnaGV4Jyk7IC8vIFRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHB1Yi5sZW5ndGggIT09IENPTVBSRVNTRURfUFVCTElDX0tFWV9MRU5HVEggJiYgcHViLmxlbmd0aCAhPT0gVU5DT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RIKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RCeXRlID0gcHViLnNsaWNlKDAsIDIpO1xuXG4gICAgICAvLyB1bmNvbXByZXNzZWQgcHVibGljIGtleVxuICAgICAgaWYgKHB1Yi5sZW5ndGggPT09IFVOQ09NUFJFU1NFRF9QVUJMSUNfS0VZX0xFTkdUSCAmJiBmaXJzdEJ5dGUgIT09ICcwNCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb21wcmVzc2VkIHB1YmxpYyBrZXlcbiAgICAgIGlmIChwdWIubGVuZ3RoID09PSBDT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RIICYmIGZpcnN0Qnl0ZSAhPT0gJzAyJyAmJiBmaXJzdEJ5dGUgIT09ICcwMycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYWxsSGV4Q2hhcnMocHViKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcHViQnVmID0gQnVmZmVyLmZyb20ocHViLCAnaGV4Jyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHRoZSBwdWJsaWMga2V5IHVzaW5nIEJpdEdvIHNlY3AyNTZrMVxuICAgIHRyeSB7XG4gICAgICBlY2MuaXNQb2ludChwdWJCdWYpOyAvLyBDaGVjayBpZiBpdCdzIGEgdmFsaWQgcG9pbnRcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2VBZGRyZXNzID0gKHB1Yjogc3RyaW5nKTogQnVmZmVyID0+IHtcbiAgICAvLyBGbGFyZUpTIGVxdWl2YWxlbnQgZm9yIGFkZHJlc3MgcGFyc2luZ1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShwdWIsICdoZXgnKTsgLy8gU2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvblxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBwcm90b2NvbCBwcml2YXRlIGtleSwgb3IgZXh0ZW5kZWRcbiAgICogcHJpdmF0ZSBrZXkuXG4gICAqXG4gICAqIFRoZSBwcm90b2NvbCBrZXkgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiB0aGUgQHN0YWNrcy90cmFuc2FjdGlvbnMgbnBtIHBhY2thZ2UsIGluIHRoZVxuICAgKiBjcmVhdGVTdGFja3NQcml2YXRlS2V5IGZ1bmN0aW9uOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vYmxvY2tzdGFjay9zdGFja3MuanMvYmxvYi9tYXN0ZXIvcGFja2FnZXMvdHJhbnNhY3Rpb25zL3NyYy9rZXlzLnRzI0wxMjVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBydiAtIHRoZSBwcml2YXRlIGtleSAob3IgZXh0ZW5kZWQgcHJpdmF0ZSBrZXkpIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRQcml2YXRlS2V5KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzVmFsaWRYcHJ2KHBydikpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKHBydi5sZW5ndGggIT09IFJBV19QUklWQVRFX0tFWV9MRU5HVEggJiYgcHJ2Lmxlbmd0aCAhPT0gU1VGRklYRURfUFJJVkFURV9LRVlfTEVOR1RIKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJ2Lmxlbmd0aCA9PT0gU1VGRklYRURfUFJJVkFURV9LRVlfTEVOR1RIICYmXG4gICAgICBwcnYuc2xpY2UoUkFXX1BSSVZBVEVfS0VZX0xFTkdUSCkgIT09IFBSSVZBVEVfS0VZX0NPTVBSRVNTRURfU1VGRklYXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWxsSGV4Q2hhcnMocHJ2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSBjb21wb3NlZCBvZiBoZXggY2hhcnMgb25seVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF5YmUgLSB0aGUgIHN0cmluZyB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBhbGxIZXhDaGFycyhtYXliZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEhFWF9SRUdFWC50ZXN0KG1heWJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWdodHdlaWdodCBFdGhlcmV1bSBhZGRyZXNzIHZhbGlkYXRpb25cbiAgICogVmFsaWRhdGVzIHRoYXQgYW4gYWRkcmVzcyBpcyBhIDQwLWNoYXJhY3RlciBoZXggc3RyaW5nIChvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggMHgpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gdGhlIEV0aGVyZXVtIGFkZHJlc3MgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdHJ1ZSBpZiB2YWxpZCBFdGhlcmV1bSBhZGRyZXNzIGZvcm1hdFxuICAgKi9cbiAgaXNWYWxpZEV0aGVyZXVtQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgdHlwZW9mIGFkZHJlc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIDB4IHByZWZpeCBpZiBwcmVzZW50XG4gICAgY29uc3QgY2xlYW5BZGRyZXNzID0gYWRkcmVzcy5zdGFydHNXaXRoKCcweCcpID8gYWRkcmVzcy5zbGljZSgyKSA6IGFkZHJlc3M7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGV4YWN0bHkgNDAgaGV4IGNoYXJhY3RlcnNcbiAgICByZXR1cm4gY2xlYW5BZGRyZXNzLmxlbmd0aCA9PT0gNDAgJiYgL15bMC05YS1mQS1GXXs0MH0kLy50ZXN0KGNsZWFuQWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogUGljayBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0IChyZXBsYWNlcyBsb2Rhc2gucGljaylcbiAgICpcbiAgICogQHBhcmFtIHtUfSBvYmogLSB0aGUgc291cmNlIG9iamVjdFxuICAgKiBAcGFyYW0ge0tbXX0ga2V5cyAtIGFycmF5IG9mIHByb3BlcnR5IGtleXMgdG8gcGlja1xuICAgKiBAcmV0dXJucyB7UGljazxULCBLPn0gLSBuZXcgb2JqZWN0IHdpdGggb25seSB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXNcbiAgICovXG4gIHBpY2s8VCwgSyBleHRlbmRzIGtleW9mIFQ+KG9iajogVCwga2V5czogS1tdKTogUGljazxULCBLPiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUGljazxULCBLPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZXAgZXF1YWxpdHkgY29tcGFyaXNvbiAocmVwbGFjZXMgbG9kYXNoLmlzRXF1YWwpXG4gICAqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gYSAtIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcbiAgICogQHBhcmFtIHt1bmtub3dufSBiIC0gc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGRlZXBseSBlcXVhbFxuICAgKi9cbiAgaXNFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKGEgPT09IG51bGwgfHwgYSA9PT0gdW5kZWZpbmVkIHx8IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYSA9PT0gYjtcblxuICAgIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpICE9PSBBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIGNvbnN0IGFyckIgPSBiIGFzIHVua25vd25bXTtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBhcnJCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNFcXVhbChhW2ldLCBhcnJCW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYmpBID0gYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG9iakIgPSBiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG4gICAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0EpIHtcbiAgICAgICAgaWYgKCFrZXlzQi5pbmNsdWRlcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5pc0VxdWFsKG9iakFba2V5XSwgb2JqQltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFNpZ25hdHVyZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFRyYW5zYWN0aW9uSWQgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmVKUyB3cmFwcGVyIHRvIGNyZWF0ZSBzaWduYXR1cmUgYW5kIHJldHVybiBpdCBmb3IgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIG5ldHdvcmtcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIHNpZ25hdHVyZVxuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlKG5ldHdvcms6IEZsYXJlTmV0d29yaywgbWVzc2FnZTogQnVmZmVyLCBwcnY6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgLy8gVXNlIEJpdEdvIHNlY3AyNTZrMSBzaW5jZSBGbGFyZUpTIG1heSBub3QgZXhwb3NlIEtleVBhaXIgaW4gdGhlIHNhbWUgd2F5XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGVjYy5zaWduKG1lc3NhZ2UsIHBydik7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oc2lnbmF0dXJlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hdHVyZTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmxhcmVKUyB3cmFwcGVyIHRvIHZlcmlmeSBzaWduYXR1cmVcbiAgICogQHBhcmFtIG5ldHdvcmtcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHNpZ25hdHVyZVxuICAgKiBAcGFyYW0gcHVibGljS2V5IC0gcHVibGljIGtleSBpbnN0ZWFkIG9mIHByaXZhdGUga2V5IGZvciB2ZXJpZmljYXRpb25cbiAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgdmVyaWZ5IHN1Y2Nlc3NmdWxcbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShuZXR3b3JrOiBGbGFyZU5ldHdvcmssIG1lc3NhZ2U6IEJ1ZmZlciwgc2lnbmF0dXJlOiBCdWZmZXIsIHB1YmxpY0tleTogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlY2MudmVyaWZ5KG1lc3NhZ2UsIHB1YmxpY0tleSwgc2lnbmF0dXJlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFyZUpTIHdyYXBwZXIgdG8gcmVjb3ZlciBzaWduYXR1cmVcbiAgICogQHBhcmFtIG5ldHdvcmtcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHNpZ25hdHVyZVxuICAgKiBAcmV0dXJuIHJlY292ZXJlZCBwdWJsaWMga2V5XG4gICAqL1xuICByZWNvdmVyeVNpZ25hdHVyZShuZXR3b3JrOiBGbGFyZU5ldHdvcmssIG1lc3NhZ2U6IEJ1ZmZlciwgc2lnbmF0dXJlOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHRyeSB7XG4gICAgICAvLyBUaGlzIHdvdWxkIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgd2l0aCBzZWNwMjU2azEgcmVjb3ZlcnlcbiAgICAgIC8vIEZvciBub3csIHRocm93aW5nIGVycm9yIHNpbmNlIHJlY292ZXJ5IGxvZ2ljIHdvdWxkIG5lZWQgdG8gYmUgYWRhcHRlZFxuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ3JlY292ZXJ5U2lnbmF0dXJlIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBmb3IgRmxhcmVKUycpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWNvdmVyIHNpZ25hdHVyZTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBzaGEyNTYoYnVmOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJ1ZikuZGlnZXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKiBJdCdzIHRvIHJldXNlIGluIFRyYW5zYWN0aW9uQnVpbGRlciBhbmQgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeVxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gYXMgaGV4IHN0cmluZ1xuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdSYXcgdHJhbnNhY3Rpb24gaXMgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKCF1dGlscy5hbGxIZXhDaGFycyhyYXdUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBub3QgaGV4IHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0eCBpcyBmb3IgdGhlIGJsb2NrY2hhaW5JZFxuICAgKlxuICAgKiBAcGFyYW0ge0RlcHJlY2F0ZWRUeH0gdHhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJsb2NrY2hhaW5JZFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHR4IGlzIGZvciBibG9ja2NoYWluSWRcbiAgICovXG4gIGlzVHJhbnNhY3Rpb25PZih0eDogRGVwcmVjYXRlZFR4LCBibG9ja2NoYWluSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEZsYXJlSlMgZXF1aXZhbGVudCAtIHRoaXMgd291bGQgbmVlZCBwcm9wZXIgQ0I1OCBlbmNvZGluZyBpbXBsZW1lbnRhdGlvblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eFJlY29yZCA9IHR4IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gKHR4UmVjb3JkLmdldFVuc2lnbmVkVHggYXMgKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9ICh1bnNpZ25lZFR4LmdldFRyYW5zYWN0aW9uIGFzICgpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSgpO1xuICAgICAgY29uc3QgdHhCbG9ja2NoYWluSWQgPSAodHJhbnNhY3Rpb24uZ2V0QmxvY2tjaGFpbklEIGFzICgpID0+IHVua25vd24pKCk7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odHhCbG9ja2NoYWluSWQgYXMgc3RyaW5nKS50b1N0cmluZygnaGV4JykgPT09IGJsb2NrY2hhaW5JZDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBPdXRwdXQgaXMgZnJvbSBQVk0uXG4gICAqIE91dHB1dCBjb3VsZCBiZSBFVk0gb3IgUFZNIG91dHB1dC5cbiAgICogQHBhcmFtIHtEZXByZWNhdGVkT3V0cHV0fSBvdXRwdXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IG91dHB1dCBoYXMgdHJhbnNmZXJhYmxlIG91dHB1dCBzdHJ1Y3R1cmVcbiAgICovXG4gIGRlcHJlY2F0ZWRJc1RyYW5zZmVyYWJsZU91dHB1dChvdXRwdXQ6IERlcHJlY2F0ZWRPdXRwdXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gJ2dldE91dHB1dCcgaW4gKG91dHB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgT3V0cHV0IGlzIGZyb20gUFZNLlxuICAgKiBPdXRwdXQgY291bGQgYmUgRVZNIG9yIFBWTSBvdXRwdXQuXG4gICAqIEBwYXJhbSB7T3V0cHV0fSBvdXRwdXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IG91dHB1dCBpcyBUcmFuc2ZlcmFibGVPdXRwdXRcbiAgICovXG4gIGlzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dDogT3V0cHV0KTogb3V0cHV0IGlzIFRyYW5zZmVyYWJsZU91dHB1dCB7XG4gICAgcmV0dXJuIHR5cGVvZiAob3V0cHV0IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmdldE91dHB1dCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtYXBwZXIgZnVuY3Rpb24gdG8gdGhhdCBuZXR3b3JrIGFkZHJlc3MgcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSBuZXR3b3JrIHJlcXVpcmVkIHRvIHN0cmluZ2lmeSBhZGRyZXNzZXNcbiAgICogQHJldHVybiBtYXBwZXIgZnVuY3Rpb25cbiAgICovXG4gIGRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KG5ldHdvcms6IEZsYXJlTmV0d29yayk6IChvdXRwdXQ6IERlcHJlY2F0ZWRPdXRwdXQpID0+IEVudHJ5IHtcbiAgICByZXR1cm4gKG91dHB1dDogRGVwcmVjYXRlZE91dHB1dCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVwcmVjYXRlZElzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dCkpIHtcbiAgICAgICAgLy8gU2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiBmb3IgRmxhcmVKU1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZU91dHB1dCA9IG91dHB1dCBhcyB1bmtub3duIGFzIFRyYW5zZmVyYWJsZU91dHB1dDtcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSB0cmFuc2ZlcmFibGVPdXRwdXQuYW1vdW50KCk7XG5cbiAgICAgICAgICAvLyBTaW1wbGlmaWVkIGFkZHJlc3MgaGFuZGxpbmcgLSB3b3VsZCBuZWVkIHByb3BlciBGbGFyZUpTIGFkZHJlc3MgdXRpbGl0aWVzXG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9ICdmbGFyZS1hZGRyZXNzLXBsYWNlaG9sZGVyJzsgLy8gVE9ETzogaW1wbGVtZW50IHByb3BlciBhZGRyZXNzIGNvbnZlcnNpb25cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbWFwIG91dHB1dDogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIEVWTSBvdXRwdXQgY2FzZSAtIHNpbXBsaWZpZWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogJzAnLCAvLyBUT0RPOiBpbXBsZW1lbnQgcHJvcGVyIGFtb3VudCBleHRyYWN0aW9uXG4gICAgICAgICAgYWRkcmVzczogJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIFRPRE86IGltcGxlbWVudCBwcm9wZXIgYWRkcmVzcyBleHRyYWN0aW9uXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtYXBwZXIgZnVuY3Rpb24gdG8gdGhhdCBuZXR3b3JrIGFkZHJlc3MgcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSBuZXR3b3JrIHJlcXVpcmVkIHRvIHN0cmluZ2lmeSBhZGRyZXNzZXNcbiAgICogQHJldHVybiBtYXBwZXIgZnVuY3Rpb25cbiAgICovXG4gIG1hcE91dHB1dFRvRW50cnkobmV0d29yazogRmxhcmVOZXR3b3JrKTogKE91dHB1dCkgPT4gRW50cnkge1xuICAgIHJldHVybiAob3V0cHV0OiBPdXRwdXQpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dCkpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJhYmxlT3V0cHV0ID0gb3V0cHV0IGFzIFRyYW5zZmVyYWJsZU91dHB1dDtcbiAgICAgICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHJhbnNmZXJhYmxlT3V0cHV0LmFtb3VudCgpO1xuXG4gICAgICAgIC8vIFNpbXBsaWZpZWQgYWRkcmVzcyBoYW5kbGluZyBmb3IgRmxhcmVKU1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gJ2ZsYXJlLWFkZHJlc3MtcGxhY2Vob2xkZXInOyAvLyBUT0RPOiBpbXBsZW1lbnQgcHJvcGVyIGFkZHJlc3MgY29udmVyc2lvblxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IG91dHB1dEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgb3V0cHV0IHR5cGUnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBoZXggcHJlZml4ICgweClcbiAgICogQHBhcmFtIGhleCBzdHJpbmdcbiAgICogQHJldHVybnMgaGV4IHdpdGhvdXQgMHhcbiAgICovXG4gIHJlbW92ZUhleFByZWZpeChoZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGhleC5zdGFydHNXaXRoKCcweCcpKSB7XG4gICAgICByZXR1cm4gaGV4LnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXRpZHggY29udmVydCBmcm9tIG51bWJlciAoYXMgc3RyaW5nKSB0byBidWZmZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRpZHggbnVtYmVyXG4gICAqIEByZXR1cm4ge0J1ZmZlcn0gYnVmZmVyIG9mIHNpemUgNCB3aXRoIHRoYXQgbnVtYmVyIHZhbHVlXG4gICAqL1xuICBvdXRwdXRpZHhOdW1iZXJUb0J1ZmZlcihvdXRwdXRpZHg6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKE51bWJlcihvdXRwdXRpZHgpLnRvU3RyaW5nKDE2KS5wYWRTdGFydChPVVRQVVRfSU5ERVhfSEVYX0xFTkdUSCwgJzAnKSwgJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dGlkeCBidWZmZXIgdG8gbnVtYmVyIChhcyBzdHJpbmcpXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXRpZHhcbiAgICogQHJldHVybiB7c3RyaW5nfSBvdXRwdXRpZHggbnVtYmVyXG4gICAqL1xuICBvdXRwdXRpZHhCdWZmZXJUb051bWJlcihvdXRwdXRpZHg6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhcnNlSW50KG91dHB1dGlkeC50b1N0cmluZygnaGV4JyksIDE2KS50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENCNTggZGVjb2RlIGZ1bmN0aW9uIC0gc2ltcGxlIEJhc2U1OCBkZWNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBDQjU4IGVuY29kZWQgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IGRlY29kZWQgYnVmZmVyXG4gICAqL1xuICBjYjU4RGVjb2RlKGRhdGE6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgLy8gRm9yIG5vdywgdXNlIGEgc2ltcGxlIGhleCBkZWNvZGUgYXMgcGxhY2Vob2xkZXJcbiAgICAvLyBJbiBhIGZ1bGwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgYmUgcHJvcGVyIENCNTggZGVjb2RpbmdcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEsICdoZXgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIGJ1ZmZlciBmcm9tIHN0cmluZ1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGFkZHJlc3MgYnVmZmVyIHRvIGJlY2gzMiBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhycCAtIEh1bWFuIHJlYWRhYmxlIHBhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYWluaWQgLSBDaGFpbiBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBhZGRyZXNzQnVmZmVyIC0gQWRkcmVzcyBidWZmZXJcbiAgICogQHJldHVybnMge3N0cmluZ30gQWRkcmVzcyBzdHJpbmdcbiAgICovXG4gIGFkZHJlc3NUb1N0cmluZyhocnA6IHN0cmluZywgY2hhaW5pZDogc3RyaW5nLCBhZGRyZXNzQnVmZmVyOiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIC8vIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiAtIGluIHByYWN0aWNlIHRoaXMgd291bGQgdXNlIGJlY2gzMiBlbmNvZGluZ1xuICAgIHJldHVybiBgJHtjaGFpbmlkfS0ke2FkZHJlc3NCdWZmZXIudG9TdHJpbmcoJ2hleCcpfWA7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBzdHJpbmcgdG8gYnl0ZXMgZm9yIEZsYXJlSlMgbWVtb1xuICAgKiBGb2xsb3dzIEZsYXJlSlMgdXRpbHMuc3RyaW5nVG9CeXRlcyBwYXR0ZXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGV4dCB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBCeXRlIGFycmF5XG4gICAqL1xuICBzdHJpbmdUb0J5dGVzKHRleHQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBieXRlcyB0byBzdHJpbmcgZnJvbSBGbGFyZUpTIG1lbW9cbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGVzIHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMge3N0cmluZ30gRGVjb2RlZCBzdHJpbmdcbiAgICovXG4gIGJ5dGVzVG9TdHJpbmcoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnl0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBtZW1vIGJ5dGVzIGZyb20gdmFyaW91cyBpbnB1dCBmb3JtYXRzXG4gICAqIFN1cHBvcnRzIHN0cmluZywgSlNPTiBvYmplY3QsIG9yIHJhdyBieXRlc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVWludDhBcnJheX0gbWVtbyAtIE1lbW8gZGF0YVxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gTWVtbyBieXRlcyBmb3IgRmxhcmVKU1xuICAgKi9cbiAgY3JlYXRlTWVtb0J5dGVzKG1lbW86IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIGlmIChtZW1vIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtZW1vID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVG9CeXRlcyhtZW1vKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1lbW8gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdUb0J5dGVzKEpTT04uc3RyaW5naWZ5KG1lbW8pKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgbWVtbyBmb3JtYXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZW1vIGJ5dGVzIHRvIHN0cmluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IG1lbW9CeXRlcyAtIE1lbW8gYnl0ZXMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IERlY29kZWQgbWVtbyBzdHJpbmdcbiAgICovXG4gIHBhcnNlTWVtb0J5dGVzKG1lbW9CeXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgaWYgKG1lbW9CeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXNUb1N0cmluZyhtZW1vQnl0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIG1lbW8gc2l6ZSAoRmxhcmVKUyBoYXMgdHJhbnNhY3Rpb24gc2l6ZSBsaW1pdHMpXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gbWVtb0J5dGVzIC0gTWVtbyBieXRlc1xuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4U2l6ZSAtIE1heGltdW0gc2l6ZSBpbiBieXRlcyAoZGVmYXVsdCA0S0IpXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG1lbW8gaXMgd2l0aGluIHNpemUgbGltaXRzXG4gICAqL1xuICB2YWxpZGF0ZU1lbW9TaXplKG1lbW9CeXRlczogVWludDhBcnJheSwgbWF4U2l6ZSA9IDQwOTYpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbWVtb0J5dGVzLmxlbmd0aCA8PSBtYXhTaXplO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIl19
|
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVUrQjtBQUMvQixtREFPOEI7QUFFOUIsbUNBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxxREFBNEM7QUFDNUMsbUNBQW1HO0FBQ25HLGdEQUF3QjtBQUN4QixtQ0FBZ0M7QUFFaEMsTUFBYSxLQUFLO0lBQWxCO1FBNlBFOztXQUVHO1FBQ0ksb0JBQWUsR0FBRyxDQUFDLEdBQVcsRUFBRSxNQUFjLEVBQUUsT0FBZSxFQUFVLEVBQUU7WUFDaEYsK0RBQStEO1lBQy9ELE1BQU0sS0FBSyxHQUFHLGVBQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsK0VBQStFO1lBQy9FLE9BQU8sR0FBRyxNQUFNLElBQUksZUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUEyQ0YsbURBQW1EO1FBRW5EOzs7O1dBSUc7UUFDSSxpQkFBWSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUU7WUFDaEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQztRQUVLLG9CQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQUUsR0FBWSxFQUFVLEVBQUU7WUFDakUsdUJBQXVCO1lBQ3ZCLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM3QixPQUFPLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBRUQsbUNBQW1DO1lBQ25DLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sZUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUVELDBCQUEwQjtZQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRCxJQUFJLGlCQUFpQixLQUFLLE9BQU8sSUFBSSxpQkFBaUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFFRCxPQUFPLGVBQU0sQ0FBQyxJQUFJLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDO0lBZ0tKLENBQUM7SUF0ZkMsb0JBQW9CLENBQUMsSUFBWTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELGdCQUFnQixDQUFDLFNBQWlCO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0Q7O09BRUc7SUFDSSxTQUFTLENBQUMsZUFBeUIsRUFBRSxtQkFBNkI7UUFDdkUsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLE9BQTBCO1FBQ3ZDLE1BQU0sVUFBVSxHQUFhLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuRixLQUFLLE1BQU0sT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE9BQWU7UUFDekMsT0FBTyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsSUFBWTtRQUN6QixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsSUFBSSxJQUFBLHNCQUFXLEVBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbEMsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRTFELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxLQUFLLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDM0QsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxJQUFJO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUV6QyxNQUFNLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILGVBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsR0FBVztRQUMzQixJQUFJLElBQUEsc0JBQVcsRUFBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3pELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLE9BQU8seUJBQXlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsT0FBcUIsRUFBRSxPQUFlLEVBQUUsR0FBVztRQUNqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLGVBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTdDLCtFQUErRTtRQUMvRSxNQUFNLFNBQVMsR0FBRyxlQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sU0FBUyxHQUFHLGVBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RSxJQUFJLFNBQVMsSUFBSSxlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdkUsYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDbEIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsd0RBQXdEO1FBQ3hELE1BQU0sZUFBZSxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekMsZUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUM7UUFFcEMsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGVBQWUsQ0FBQyxXQUFtQixFQUFFLFNBQWlCLEVBQUUsU0FBaUI7UUFDdkUsSUFBSSxDQUFDO1lBQ0gsT0FBTyxlQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsTUFBYztRQUN6QixNQUFNLE1BQU0sR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxtQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHlCQUF5QixDQUFDLFVBQWtCO1FBQzFDLHNGQUFzRjtRQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLG1CQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLEdBQVc7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7WUFDM0IsK0RBQStEO1lBQy9ELE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQWU7UUFDcEIsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQixDQUFDLGNBQXNCO1FBQzNDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksa0NBQXVCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksZ0NBQXFCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLENBQUMsTUFBYztRQUNqQyxPQUFPLE1BQU0sRUFBRSxLQUFLLEtBQUsscUJBQVcsQ0FBQyxrQkFBa0IsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxPQUFxQjtRQUNwQyxPQUFPLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBSSxNQUFNLENBQUMsTUFBeUI7cUJBQzlDLFNBQVMsRUFBRTtxQkFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDNUUsSUFBSSxFQUFFO3FCQUNOLElBQUksQ0FBQyx5QkFBaUIsQ0FBQyxDQUFDO2dCQUMzQixPQUFPO29CQUNMLEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO29CQUM5QixPQUFPO2lCQUNSLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsR0FBVztRQUN6QixPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCx1QkFBdUIsQ0FBQyxTQUFpQjtRQUN2QyxPQUFPLGVBQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7T0FFRztJQUNILHVCQUF1QixDQUFDLFNBQWlCO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQVlEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLEdBQVc7UUFDM0IsTUFBTSxPQUFPLEdBQUcsY0FBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxlQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLG1CQUFtQixHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUM7YUFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDdEMsTUFBTSxFQUFFO2FBQ1IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsS0FBYTtRQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE9BQU8sY0FBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUFDLElBQXlCO1FBQzFDLE1BQU0sTUFBTSxHQUFHLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxlQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBMkNELGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLE9BQU8sSUFBSSxZQUFFLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUFtQixFQUFFLFNBQWlCO1FBQ3RELElBQUksQ0FBQztZQUNILDJDQUEyQztZQUMzQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMscUZBQXFGLENBQUMsQ0FBQztZQUN6RyxDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXZDLDJEQUEyRDtZQUMzRCxrRUFBa0U7WUFDbEUsTUFBTSxTQUFTLEdBQUcsZUFBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUVELE9BQU8sZUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZSxDQUFDLEVBQU0sRUFBRSxZQUFvQjtRQUMxQyxnRkFBZ0Y7UUFDaEYsaUVBQWlFO1FBQ2pFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxLQUFVLEVBQWlCLEVBQUU7WUFDeEQsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztvQkFDMUMsT0FBTyxlQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1RSxDQUFDO2dCQUNELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxlQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JFLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzVDLE9BQU8sZUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sZUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNoQyxPQUFPLGVBQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLGNBQWMsS0FBSyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLElBQVUsRUFBRSxPQUFxQjtRQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQXdCLENBQUM7UUFFN0MseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUxQyxzQ0FBc0M7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RSxtQkFBbUI7UUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFM0QsZ0JBQWdCO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFakQsZUFBZTtRQUNmLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFMUQsa0NBQWtDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDaEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUM5RSxDQUFDO1FBRUYsT0FBTztZQUNMLFFBQVEsRUFBRSxpQ0FBeUI7WUFDbkMsUUFBUTtZQUNSLE1BQU07WUFDTixJQUFJO1lBQ0osU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGNBQWMsQ0FBQyxLQUFhLEVBQUUsT0FBcUI7UUFDeEQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhLENBQUMsT0FBdUIsRUFBRSxPQUFlO1FBQzNELDJDQUEyQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNGLHNEQUFzRDtRQUN0RCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTlFLDhEQUE4RDtRQUM5RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxZQUFZLEdBQUcsc0JBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEYsK0NBQStDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsTUFBTSxjQUFjLEdBQUcsSUFBSSx3QkFBYyxDQUFDLElBQUksa0JBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUU5RSw2QkFBNkI7UUFDN0IsT0FBTyxJQUFJLGNBQUksQ0FBQyxNQUFNLEVBQUUsWUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsWUFBOEIsRUFBRSxPQUFlO1FBQ25FLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQ0Y7QUF2ZkQsc0JBdWZDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUMxQixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTaWduYXR1cmUsXG4gIFRyYW5zZmVyYWJsZU91dHB1dCxcbiAgVHJhbnNmZXJPdXRwdXQsXG4gIFR5cGVTeW1ib2xzLFxuICBJZCxcbiAgVXR4byxcbiAgQmlnSW50UHIsXG4gIE91dHB1dE93bmVycyxcbiAgYXZheFNlcmlhbCxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7XG4gIEJhc2VVdGlscyxcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHBydixcbiAgaXNWYWxpZFhwdWIsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRmxhcmVOZXR3b3JrIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBlY2MgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgQUREUkVTU19TRVBBUkFUT1IsIERlY29kZWRVdHhvT2JqLCBPdXRwdXQsIFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsIFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IGJlY2gzMiB9IGZyb20gJ2JlY2gzMic7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiBhZGRyZXNzZXMgaW4gd2FsbGV0IG1hdGNoIFVUWE8gb3V0cHV0IGFkZHJlc3Nlc1xuICAgKi9cbiAgcHVibGljIGluY2x1ZGVJbih3YWxsZXRBZGRyZXNzZXM6IHN0cmluZ1tdLCBvdHhvT3V0cHV0QWRkcmVzc2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3YWxsZXRBZGRyZXNzZXMubWFwKChhKSA9PiBvdHhvT3V0cHV0QWRkcmVzc2VzLmluY2x1ZGVzKGEpKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYiwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgRmxhcmUgYWRkcmVzcyBvciBhcnJheSBvZiBhZGRyZXNzZXNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gYWRkcmVzcyAtIGFkZHJlc3MoZXMpIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFkZHJlc3NBcnI6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShhZGRyZXNzKSA/IGFkZHJlc3MgOiBhZGRyZXNzLnNwbGl0KCd+Jyk7XG5cbiAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgYWRkcmVzc0Fycikge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzUmVnZXgoYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQWRkcmVzc1JlZ2V4KGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXiheUHx8Tm9kZUlEKS1bYS16QS1aMC05XSskLy50ZXN0KGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIGJsb2NrIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIC0gYmxvY2sgSUQgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oaGFzaCwgJ2hleCcpO1xuICAgICAgcmV0dXJuIGRlY29kZWQubGVuZ3RoID09PSAzMjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgcHVibGljIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHViIC0gcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1ZhbGlkWHB1YihwdWIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGxldCBwdWJCdWY6IEJ1ZmZlcjtcbiAgICBpZiAocHViLmxlbmd0aCA9PT0gNTApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHB1YkJ1ZiA9IEJ1ZmZlci5mcm9tKHB1YiwgJ2hleCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHB1Yi5sZW5ndGggIT09IDY2ICYmIHB1Yi5sZW5ndGggIT09IDEzMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBmaXJzdEJ5dGUgPSBwdWIuc2xpY2UoMCwgMik7XG4gICAgICBpZiAocHViLmxlbmd0aCA9PT0gMTMwICYmIGZpcnN0Qnl0ZSAhPT0gJzA0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHB1Yi5sZW5ndGggPT09IDY2ICYmIGZpcnN0Qnl0ZSAhPT0gJzAyJyAmJiBmaXJzdEJ5dGUgIT09ICcwMycpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5hbGxIZXhDaGFycyhwdWIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHB1YkJ1ZiA9IEJ1ZmZlci5mcm9tKHB1YiwgJ2hleCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBlY2MuaXNQb2ludChwdWJCdWYpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJ2IC0gcHJpdmF0ZSBrZXkgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRQcml2YXRlS2V5KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzVmFsaWRYcHJ2KHBydikpIHJldHVybiB0cnVlO1xuICAgIGlmIChwcnYubGVuZ3RoICE9PSA2NCAmJiBwcnYubGVuZ3RoICE9PSA2NikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChwcnYubGVuZ3RoID09PSA2NiAmJiBwcnYuc2xpY2UoNjQpICE9PSAnMDEnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuYWxsSGV4Q2hhcnMocHJ2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzdHJpbmcgY29udGFpbnMgb25seSBoZXggY2hhcmFjdGVyc1xuICAgKi9cbiAgYWxsSGV4Q2hhcnMoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL14oMHgpezAsMX0oWzAtOWEtZl0pKyQvaS50ZXN0KHN0cik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNpZ25hdHVyZSB1c2luZyB0aGUgRmxhcmUgbmV0d29yayBwYXJhbWV0ZXJzXG4gICAqIFJldHVybnMgYSA2NS1ieXRlIHNpZ25hdHVyZSAoNjQgYnl0ZXMgc2lnbmF0dXJlICsgMSBieXRlIHJlY292ZXJ5IHBhcmFtZXRlcilcbiAgICovXG4gIGNyZWF0ZVNpZ25hdHVyZShuZXR3b3JrOiBGbGFyZU5ldHdvcmssIG1lc3NhZ2U6IEJ1ZmZlciwgcHJ2OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IG1lc3NhZ2VIYXNoID0gdGhpcy5zaGEyNTYobWVzc2FnZSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gZWNjLnNpZ24obWVzc2FnZUhhc2gsIHBydik7XG5cbiAgICAvLyBHZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgcHJpdmF0ZSBrZXkgZm9yIHJlY292ZXJ5IHBhcmFtZXRlciBkZXRlcm1pbmF0aW9uXG4gICAgY29uc3QgcHVibGljS2V5ID0gZWNjLnBvaW50RnJvbVNjYWxhcihwcnYsIHRydWUpO1xuICAgIGlmICghcHVibGljS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZXJpdmUgcHVibGljIGtleSBmcm9tIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHJlY292ZXJ5IHdpdGggcGFyYW0gMCBhbmQgMSB0byBmaW5kIHRoZSBjb3JyZWN0IG9uZVxuICAgIGxldCByZWNvdmVyeVBhcmFtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlY292ZXJlZCA9IGVjYy5yZWNvdmVyUHVibGljS2V5KG1lc3NhZ2VIYXNoLCBzaWduYXR1cmUsIGksIHRydWUpO1xuICAgICAgaWYgKHJlY292ZXJlZCAmJiBCdWZmZXIuZnJvbShyZWNvdmVyZWQpLmVxdWFscyhCdWZmZXIuZnJvbShwdWJsaWNLZXkpKSkge1xuICAgICAgICByZWNvdmVyeVBhcmFtID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIHJlY292ZXJ5IHBhcmFtZXRlciB0byBjcmVhdGUgNjUtYnl0ZSBzaWduYXR1cmVcbiAgICBjb25zdCBzaWdXaXRoUmVjb3ZlcnkgPSBCdWZmZXIuYWxsb2MoNjUpO1xuICAgIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkuY29weShzaWdXaXRoUmVjb3ZlcnksIDApO1xuICAgIHNpZ1dpdGhSZWNvdmVyeVs2NF0gPSByZWNvdmVyeVBhcmFtO1xuXG4gICAgcmV0dXJuIHNpZ1dpdGhSZWNvdmVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIHNpZ25hdHVyZVxuICAgKiBAcGFyYW0gbWVzc2FnZUhhc2ggLSBUaGUgU0hBMjU2IGhhc2ggb2YgdGhlIG1lc3NhZ2UgKGUuZy4sIHNpZ25hYmxlUGF5bG9hZClcbiAgICogQHBhcmFtIHNpZ25hdHVyZSAtIFRoZSA2NC1ieXRlIHNpZ25hdHVyZSAod2l0aG91dCByZWNvdmVyeSBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgLSBUaGUgcHVibGljIGtleSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZFxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2VIYXNoOiBCdWZmZXIsIHNpZ25hdHVyZTogQnVmZmVyLCBwdWJsaWNLZXk6IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZWNjLnZlcmlmeShtZXNzYWdlSGFzaCwgcHVibGljS2V5LCBzaWduYXR1cmUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzaWduYXR1cmUgb2JqZWN0XG4gICAqL1xuICBjcmVhdGVOZXdTaWcoc2lnSGV4OiBzdHJpbmcpOiBTaWduYXR1cmUge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNpZ0hleC5wYWRTdGFydCgxMzAsICcwJyksICdoZXgnKTtcbiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZShidWZmZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZW1wdHkgc2lnbmF0dXJlIHdpdGggZW1iZWRkZWQgYWRkcmVzcyBmb3Igc2lnbmF0dXJlIHNsb3QgaWRlbnRpZmljYXRpb24uXG4gICAqIFRoZSBhZGRyZXNzIGlzIGVtYmVkZGVkIGF0IHBvc2l0aW9uIDkwIChhZnRlciB0aGUgZmlyc3QgNDUgemVybyBieXRlcykuXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBzaWduaW5nIGxvZ2ljIHRvIGRldGVybWluZSB3aGljaCBzbG90IGJlbG9uZ3MgdG8gd2hpY2ggYWRkcmVzcy5cbiAgICogQHBhcmFtIGFkZHJlc3NIZXggVGhlIDIwLWJ5dGUgYWRkcmVzcyBpbiBoZXggZm9ybWF0ICg0MCBjaGFycywgd2l0aG91dCAweCBwcmVmaXgpXG4gICAqL1xuICBjcmVhdGVFbXB0eVNpZ1dpdGhBZGRyZXNzKGFkZHJlc3NIZXg6IHN0cmluZyk6IFNpZ25hdHVyZSB7XG4gICAgLy8gRmlyc3QgNDUgYnl0ZXMgKDkwIGhleCBjaGFycykgYXJlIHplcm9zLCBmb2xsb3dlZCBieSAyMC1ieXRlIGFkZHJlc3MgKDQwIGhleCBjaGFycylcbiAgICBjb25zdCBjbGVhbkFkZHIgPSB0aGlzLnJlbW92ZUhleFByZWZpeChhZGRyZXNzSGV4KS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHNpZ0hleCA9ICcwJy5yZXBlYXQoOTApICsgY2xlYW5BZGRyLnBhZFN0YXJ0KDQwLCAnMCcpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNpZ0hleCwgJ2hleCcpO1xuICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKGJ1ZmZlcik7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGVtYmVkZGVkIGFkZHJlc3MgZnJvbSBhbiBlbXB0eSBzaWduYXR1cmUuXG4gICAqIFJldHVybnMgdGhlIGFkZHJlc3MgaGV4IHN0cmluZyAoNDAgY2hhcnMpIG9yIGVtcHR5IHN0cmluZyBpZiBub3QgZm91bmQuXG4gICAqL1xuICBnZXRBZGRyZXNzRnJvbUVtcHR5U2lnKHNpZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGVhblNpZyA9IHRoaXMucmVtb3ZlSGV4UHJlZml4KHNpZyk7XG4gICAgaWYgKGNsZWFuU2lnLmxlbmd0aCA+PSAxMzApIHtcbiAgICAgIC8vIEFkZHJlc3MgaXMgYXQgcG9zaXRpb24gOTAtMTMwIChsYXN0IDQwIGhleCBjaGFycyA9IDIwIGJ5dGVzKVxuICAgICAgcmV0dXJuIGNsZWFuU2lnLnN1YnN0cmluZyg5MCwgMTMwKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgU0hBMjU2IGhhc2hcbiAgICovXG4gIHNoYTI1NihidWY6IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYnVmKS5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgcmF3IHRyYW5zYWN0aW9uIGZvcm1hdFxuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdSYXcgdHJhbnNhY3Rpb24gaXMgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFsbEhleENoYXJzKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIG5vdCBoZXggc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBvdXRwdXQgaXMgVHJhbnNmZXJhYmxlT3V0cHV0IHR5cGVcbiAgICovXG4gIGlzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dDogT3V0cHV0KTogb3V0cHV0IGlzIFRyYW5zZmVyYWJsZU91dHB1dCB7XG4gICAgcmV0dXJuIG91dHB1dD8uX3R5cGUgPT09IFR5cGVTeW1ib2xzLlRyYW5zZmVyYWJsZU91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIG91dHB1dHMgdG8gZW50cnkgZm9ybWF0XG4gICAqL1xuICBtYXBPdXRwdXRUb0VudHJ5KG5ldHdvcms6IEZsYXJlTmV0d29yayk6IChPdXRwdXQpID0+IEVudHJ5IHtcbiAgICByZXR1cm4gKG91dHB1dDogT3V0cHV0KSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyYW5zZmVyYWJsZU91dHB1dChvdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IG91dHB1dC5hbW91bnQoKTtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IChvdXRwdXQub3V0cHV0IGFzIFRyYW5zZmVyT3V0cHV0KVxuICAgICAgICAgIC5nZXRPd25lcnMoKVxuICAgICAgICAgIC5tYXAoKGEpID0+IHRoaXMuYWRkcmVzc1RvU3RyaW5nKG5ldHdvcmsuaHJwLCBuZXR3b3JrLmFsaWFzLCBCdWZmZXIuZnJvbShhKSkpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5qb2luKEFERFJFU1NfU0VQQVJBVE9SKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogb3V0cHV0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvdXRwdXQgdHlwZScpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyAweCBwcmVmaXggZnJvbSBoZXggc3RyaW5nXG4gICAqL1xuICByZW1vdmVIZXhQcmVmaXgoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBoZXguc3RhcnRzV2l0aCgnMHgnKSA/IGhleC5zdWJzdHJpbmcoMikgOiBoZXg7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgb3V0cHV0IGluZGV4IHRvIGJ1ZmZlclxuICAgKi9cbiAgb3V0cHV0aWR4TnVtYmVyVG9CdWZmZXIob3V0cHV0aWR4OiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShOdW1iZXIob3V0cHV0aWR4KS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgJzAnKSwgJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIG91dHB1dCBpbmRleCBidWZmZXIgdG8gbnVtYmVyIHN0cmluZ1xuICAgKi9cbiAgb3V0cHV0aWR4QnVmZmVyVG9OdW1iZXIob3V0cHV0aWR4OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXJzZUludChvdXRwdXRpZHgudG9TdHJpbmcoJ2hleCcpLCAxNikudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgYWRkcmVzcyBjb21wb25lbnRzIHRvIHN0cmluZ1xuICAgKi9cbiAgcHVibGljIGFkZHJlc3NUb1N0cmluZyA9IChocnA6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsIGFkZHJlc3M6IEJ1ZmZlcik6IHN0cmluZyA9PiB7XG4gICAgLy8gQ29udmVydCB0aGUgYWRkcmVzcyBieXRlcyB0byA1LWJpdCB3b3JkcyBmb3IgYmVjaDMyIGVuY29kaW5nXG4gICAgY29uc3Qgd29yZHMgPSBiZWNoMzIudG9Xb3JkcyhhZGRyZXNzKTtcbiAgICAvLyBDcmVhdGUgdGhlIGZ1bGwgYmVjaDMyIGFkZHJlc3Mgd2l0aCBmb3JtYXQ6IFAte2hycH0xe2JlY2gzMl9lbmNvZGVkX2FkZHJlc3N9XG4gICAgcmV0dXJuIGAke3ByZWZpeH0tJHtiZWNoMzIuZW5jb2RlKGhycCwgd29yZHMpfWA7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBiYXNlNTggc3RyaW5nIHdpdGggY2hlY2tzdW0gdG8gYSBCdWZmZXJcbiAgICovXG4gIHB1YmxpYyBjYjU4RGVjb2RlKHN0cjogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBjb25zdCBkZWNvZGVkID0gYnM1OC5kZWNvZGUoc3RyKTtcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVDaGVja3N1bShCdWZmZXIuZnJvbShkZWNvZGVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3N1bScpO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGVjb2RlZC5zbGljZSgwLCBkZWNvZGVkLmxlbmd0aCAtIDQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBjaGVja3N1bSBvbiBhIEJ1ZmZlciBhbmQgcmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBpZiBub3RcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDaGVja3N1bShidWZmOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNoU2xpY2UgPSBidWZmLnNsaWNlKGJ1ZmYubGVuZ3RoIC0gNCk7XG4gICAgY29uc3QgY2FsY3VsYXRlZEhhc2hTbGljZSA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAudXBkYXRlKGJ1ZmYuc2xpY2UoMCwgYnVmZi5sZW5ndGggLSA0KSlcbiAgICAgIC5kaWdlc3QoKVxuICAgICAgLnNsaWNlKDI4KTtcbiAgICByZXR1cm4gaGFzaFNsaWNlLnRvU3RyaW5nKCdoZXgnKSA9PT0gY2FsY3VsYXRlZEhhc2hTbGljZS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyBhIEJ1ZmZlciBhcyBhIGJhc2U1OCBzdHJpbmcgd2l0aCBjaGVja3N1bVxuICAgKi9cbiAgcHVibGljIGNiNThFbmNvZGUoYnl0ZXM6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgd2l0aENoZWNrc3VtID0gdGhpcy5hZGRDaGVja3N1bShieXRlcyk7XG4gICAgcmV0dXJuIGJzNTguZW5jb2RlKHdpdGhDaGVja3N1bSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNoZWNrc3VtIHRvIGEgQnVmZmVyIGFuZCByZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgcmVzdWx0XG4gICAqIFVzZXMgbGFzdCA0IGJ5dGVzIG9mIFNIQTI1NiBoYXNoIGFzIGNoZWNrc3VtIChtYXRjaGluZyBhdmF4cCBiZWhhdmlvcilcbiAgICovXG4gIHB1YmxpYyBhZGRDaGVja3N1bShidWZmOiBCdWZmZXIgfCBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYnVmZik7XG4gICAgY29uc3QgaGFzaFNsaWNlID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJ1ZmZlcikuZGlnZXN0KCkuc2xpY2UoMjgpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KFtidWZmZXIsIGhhc2hTbGljZV0pKTtcbiAgfVxuXG4gIC8vIEluIHV0aWxzLnRzLCBhZGQgdGhpcyBtZXRob2QgdG8gdGhlIFV0aWxzIGNsYXNzOlxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBhZGRyZXNzIHN0cmluZyBpbnRvIGEgQnVmZmVyXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gcGFyc2VcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBhcnNlZCBhZGRyZXNzXG4gICAqL1xuICBwdWJsaWMgcGFyc2VBZGRyZXNzID0gKGFkZHJlc3M6IHN0cmluZyk6IEJ1ZmZlciA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpO1xuICB9O1xuXG4gIHB1YmxpYyBzdHJpbmdUb0FkZHJlc3MgPSAoYWRkcmVzczogc3RyaW5nLCBocnA/OiBzdHJpbmcpOiBCdWZmZXIgPT4ge1xuICAgIC8vIEhhbmRsZSBoZXggYWRkcmVzc2VzXG4gICAgaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgnMHgnKSkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFkZHJlc3Muc2xpY2UoMiksICdoZXgnKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcmF3IGhleCB3aXRob3V0IDB4IHByZWZpeFxuICAgIGlmICgvXlswLTlhLWZBLUZdezQwfSQvLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhZGRyZXNzLCAnaGV4Jyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEJlY2gzMiBhZGRyZXNzZXNcbiAgICBjb25zdCBwYXJ0cyA9IGFkZHJlc3MudHJpbSgpLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgLSBWYWxpZCBhZGRyZXNzIHNob3VsZCBpbmNsdWRlIC0nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdCA9IHBhcnRzWzFdLmxhc3RJbmRleE9mKCcxJyk7XG4gICAgaWYgKHNwbGl0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciAtIFZhbGlkIGJlY2gzMiBhZGRyZXNzIG11c3QgaW5jbHVkZSBzZXBhcmF0b3IgKDEpJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaHVtYW5SZWFkYWJsZVBhcnQgPSBwYXJ0c1sxXS5zbGljZSgwLCBzcGxpdCk7XG4gICAgaWYgKGh1bWFuUmVhZGFibGVQYXJ0ICE9PSAnZmxhcmUnICYmIGh1bWFuUmVhZGFibGVQYXJ0ICE9PSAnY29zdHdvJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciAtIEludmFsaWQgSFJQJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJlY2gzMi5mcm9tV29yZHMoYmVjaDMyLmRlY29kZShwYXJ0c1sxXSkud29yZHMpKTtcbiAgfTtcblxuICBmbGFyZUlkU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBJZCB7XG4gICAgcmV0dXJuIG5ldyBJZChCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIHB1YmxpYyBrZXkgZnJvbSBzaWduYXR1cmVcbiAgICogQHBhcmFtIG1lc3NhZ2VIYXNoIC0gVGhlIFNIQTI1NiBoYXNoIG9mIHRoZSBtZXNzYWdlIChlLmcuLCBzaWduYWJsZVBheWxvYWQpXG4gICAqIEBwYXJhbSBzaWduYXR1cmUgLSA2NS1ieXRlIHNpZ25hdHVyZSAoNjQgYnl0ZXMgc2lnbmF0dXJlICsgMSBieXRlIHJlY292ZXJ5IHBhcmFtZXRlcilcbiAgICogQHJldHVybiByZWNvdmVyZWQgcHVibGljIGtleVxuICAgKi9cbiAgcmVjb3ZlcnlTaWduYXR1cmUobWVzc2FnZUhhc2g6IEJ1ZmZlciwgc2lnbmF0dXJlOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHRyeSB7XG4gICAgICAvLyBFeHRyYWN0IHJlY292ZXJ5IHBhcmFtZXRlciBhbmQgc2lnbmF0dXJlXG4gICAgICBpZiAoc2lnbmF0dXJlLmxlbmd0aCAhPT0gNjUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBsZW5ndGggLSBleHBlY3RlZCA2NSBieXRlcyAoNjQgYnl0ZXMgc2lnbmF0dXJlICsgMSBieXRlIHJlY292ZXJ5KScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWNvdmVyeVBhcmFtID0gc2lnbmF0dXJlWzY0XTtcbiAgICAgIGNvbnN0IHNpZ09ubHkgPSBzaWduYXR1cmUuc2xpY2UoMCwgNjQpO1xuXG4gICAgICAvLyBSZWNvdmVyIHB1YmxpYyBrZXkgdXNpbmcgdGhlIHByb3ZpZGVkIHJlY292ZXJ5IHBhcmFtZXRlclxuICAgICAgLy8gbWVzc2FnZUhhc2ggc2hvdWxkIGFscmVhZHkgYmUgdGhlIFNIQTI1NiBoYXNoIChzaWduYWJsZVBheWxvYWQpXG4gICAgICBjb25zdCByZWNvdmVyZWQgPSBlY2MucmVjb3ZlclB1YmxpY0tleShtZXNzYWdlSGFzaCwgc2lnT25seSwgcmVjb3ZlcnlQYXJhbSwgdHJ1ZSk7XG4gICAgICBpZiAoIXJlY292ZXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWNvdmVyIHB1YmxpYyBrZXknKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHJlY292ZXJlZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlY292ZXIgc2lnbmF0dXJlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHR4IGlzIGZvciB0aGUgYmxvY2tjaGFpbklkXG4gICAqXG4gICAqIEBwYXJhbSB7VHh9IHR4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBibG9ja2NoYWluSWQgLSBibG9ja2NoYWluIElEIGluIGhleCBmb3JtYXRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0eCBpcyBmb3IgYmxvY2tjaGFpbklkXG4gICAqL1xuICBpc1RyYW5zYWN0aW9uT2YodHg6IFR4LCBibG9ja2NoYWluSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIE5vdGU6IGdldEJsb2NrY2hhaW5JZCgpIGFuZCBCbG9ja2NoYWluSWQudmFsdWUoKSByZXR1cm4gQ0I1OC1lbmNvZGVkIHN0cmluZ3MsXG4gICAgLy8gYnV0IHdlIG5lZWQgaGV4IGZvcm1hdCwgc28gd2UgdXNlIHRvQnl0ZXMoKSBhbmQgY29udmVydCB0byBoZXhcbiAgICBjb25zdCBleHRyYWN0QmxvY2tjaGFpbklkID0gKHR4T2JqOiBhbnkpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdHhPYmouZ2V0VHggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgaW5uZXJUeCA9IHR4T2JqLmdldFR4KCk7XG4gICAgICAgIGlmIChpbm5lclR4LmJhc2VUeD8uQmxvY2tjaGFpbklkPy50b0J5dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGlubmVyVHguYmFzZVR4LkJsb2NrY2hhaW5JZC50b0J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5uZXJUeC5ibG9ja2NoYWluSWQ/LnRvQnl0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5uZXJUeC5ibG9ja2NoYWluSWQudG9CeXRlcygpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR4T2JqLnR4Py5iYXNlVHg/LkJsb2NrY2hhaW5JZD8udG9CeXRlcykge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20odHhPYmoudHguYmFzZVR4LkJsb2NrY2hhaW5JZC50b0J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR4T2JqLmJhc2VUeD8uQmxvY2tjaGFpbklkPy50b0J5dGVzKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0eE9iai5iYXNlVHguQmxvY2tjaGFpbklkLnRvQnl0ZXMoKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgfVxuICAgICAgaWYgKHR4T2JqLmJsb2NrY2hhaW5JZD8udG9CeXRlcykge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20odHhPYmouYmxvY2tjaGFpbklkLnRvQnl0ZXMoKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgY29uc3QgdHhCbG9ja2NoYWluSWQgPSBleHRyYWN0QmxvY2tjaGFpbklkKHR4KTtcbiAgICByZXR1cm4gdHhCbG9ja2NoYWluSWQgPT09IGJsb2NrY2hhaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IEZsYXJlSlMgbmF0aXZlIFV0eG8gdG8gRGVjb2RlZFV0eG9PYmogZm9yIGludGVybmFsIHVzZVxuICAgKiBAcGFyYW0gdXR4byAtIEZsYXJlSlMgVXR4byBvYmplY3RcbiAgICogQHBhcmFtIG5ldHdvcmsgLSBGbGFyZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgRGVjb2RlZFV0eG9PYmogY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIG1ldGhvZHNcbiAgICovXG4gIHB1YmxpYyB1dHhvVG9EZWNvZGVkKHV0eG86IFV0eG8sIG5ldHdvcms6IEZsYXJlTmV0d29yayk6IERlY29kZWRVdHhvT2JqIHtcbiAgICBjb25zdCBvdXRwdXRPd25lcnMgPSB1dHhvLmdldE91dHB1dE93bmVycygpO1xuICAgIGNvbnN0IG91dHB1dCA9IHV0eG8ub3V0cHV0IGFzIFRyYW5zZmVyT3V0cHV0O1xuXG4gICAgLy8gR2V0IGFtb3VudCBmcm9tIG91dHB1dFxuICAgIGNvbnN0IGFtb3VudCA9IG91dHB1dC5hbW91bnQoKS50b1N0cmluZygpO1xuXG4gICAgLy8gR2V0IHR4aWQgZnJvbSB1dHhvSWQgKGNiNTggZW5jb2RlZClcbiAgICBjb25zdCB0eGlkID0gdGhpcy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKHV0eG8udXR4b0lkLnR4SUQudG9CeXRlcygpKSk7XG5cbiAgICAvLyBHZXQgb3V0cHV0IGluZGV4XG4gICAgY29uc3Qgb3V0cHV0aWR4ID0gdXR4by51dHhvSWQub3V0cHV0SWR4LnZhbHVlKCkudG9TdHJpbmcoKTtcblxuICAgIC8vIEdldCB0aHJlc2hvbGRcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBvdXRwdXRPd25lcnMudGhyZXNob2xkLnZhbHVlKCk7XG5cbiAgICAvLyBHZXQgbG9ja3RpbWVcbiAgICBjb25zdCBsb2NrdGltZSA9IG91dHB1dE93bmVycy5sb2NrdGltZS52YWx1ZSgpLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBHZXQgYWRkcmVzc2VzIGFzIGJlY2gzMiBzdHJpbmdzXG4gICAgY29uc3QgYWRkcmVzc2VzID0gb3V0cHV0T3duZXJzLmFkZHJzLm1hcCgoYWRkcikgPT5cbiAgICAgIHRoaXMuYWRkcmVzc1RvU3RyaW5nKG5ldHdvcmsuaHJwLCBuZXR3b3JrLmFsaWFzLCBCdWZmZXIuZnJvbShhZGRyLnRvQnl0ZXMoKSkpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRJRDogU0VDUDI1NksxX1RyYW5zZmVyX091dHB1dCxcbiAgICAgIGxvY2t0aW1lLFxuICAgICAgYW1vdW50LFxuICAgICAgdHhpZCxcbiAgICAgIG91dHB1dGlkeCxcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGFkZHJlc3NlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYXJyYXkgb2YgRmxhcmVKUyBVdHhvcyB0byBEZWNvZGVkVXR4b09iaiBhcnJheVxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBGbGFyZUpTIFV0eG8gb2JqZWN0c1xuICAgKiBAcGFyYW0gbmV0d29yayAtIEZsYXJlIG5ldHdvcmsgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBEZWNvZGVkVXR4b09ialxuICAgKi9cbiAgcHVibGljIHV0eG9zVG9EZWNvZGVkKHV0eG9zOiBVdHhvW10sIG5ldHdvcms6IEZsYXJlTmV0d29yayk6IERlY29kZWRVdHhvT2JqW10ge1xuICAgIHJldHVybiB1dHhvcy5tYXAoKHV0eG8pID0+IHRoaXMudXR4b1RvRGVjb2RlZCh1dHhvLCBuZXR3b3JrKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBEZWNvZGVkVXR4b09iaiB0byBuYXRpdmUgRmxhcmVKUyBVdHhvIG9iamVjdFxuICAgKiBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIHV0eG9Ub0RlY29kZWRcbiAgICogQHBhcmFtIGRlY29kZWQgLSBEZWNvZGVkVXR4b09iaiB0byBjb252ZXJ0XG4gICAqIEBwYXJhbSBhc3NldElkIC0gQXNzZXQgSUQgYXMgY2I1OCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyBOYXRpdmUgRmxhcmVKUyBVdHhvIG9iamVjdFxuICAgKi9cbiAgcHVibGljIGRlY29kZWRUb1V0eG8oZGVjb2RlZDogRGVjb2RlZFV0eG9PYmosIGFzc2V0SWQ6IHN0cmluZyk6IFV0eG8ge1xuICAgIC8vIENyZWF0ZSBVVFhPSUQgZnJvbSB0eGlkIGFuZCBvdXRwdXQgaW5kZXhcbiAgICBjb25zdCB1dHhvSWQgPSBhdmF4U2VyaWFsLlVUWE9JRC5mcm9tTmF0aXZlKGRlY29kZWQudHhpZCwgcGFyc2VJbnQoZGVjb2RlZC5vdXRwdXRpZHgsIDEwKSk7XG5cbiAgICAvLyBQYXJzZSBhZGRyZXNzZXMgZnJvbSBiZWNoMzIgc3RyaW5ncyB0byBieXRlIGJ1ZmZlcnNcbiAgICBjb25zdCBhZGRyZXNzQnl0ZXMgPSBkZWNvZGVkLmFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHRoaXMucGFyc2VBZGRyZXNzKGFkZHIpKTtcblxuICAgIC8vIENyZWF0ZSBPdXRwdXRPd25lcnMgd2l0aCBsb2NrdGltZSwgdGhyZXNob2xkLCBhbmQgYWRkcmVzc2VzXG4gICAgY29uc3QgbG9ja3RpbWUgPSBkZWNvZGVkLmxvY2t0aW1lID8gQmlnSW50KGRlY29kZWQubG9ja3RpbWUpIDogQmlnSW50KDApO1xuICAgIGNvbnN0IG91dHB1dE93bmVycyA9IE91dHB1dE93bmVycy5mcm9tTmF0aXZlKGFkZHJlc3NCeXRlcywgbG9ja3RpbWUsIGRlY29kZWQudGhyZXNob2xkKTtcblxuICAgIC8vIENyZWF0ZSBUcmFuc2Zlck91dHB1dCB3aXRoIGFtb3VudCBhbmQgb3duZXJzXG4gICAgY29uc3QgYW1vdW50ID0gQmlnSW50KGRlY29kZWQuYW1vdW50KTtcbiAgICBjb25zdCB0cmFuc2Zlck91dHB1dCA9IG5ldyBUcmFuc2Zlck91dHB1dChuZXcgQmlnSW50UHIoYW1vdW50KSwgb3V0cHV0T3duZXJzKTtcblxuICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBVdHhvXG4gICAgcmV0dXJuIG5ldyBVdHhvKHV0eG9JZCwgSWQuZnJvbVN0cmluZyhhc3NldElkKSwgdHJhbnNmZXJPdXRwdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYXJyYXkgb2YgRGVjb2RlZFV0eG9PYmogdG8gbmF0aXZlIEZsYXJlSlMgVXR4byBvYmplY3RzXG4gICAqIEBwYXJhbSBkZWNvZGVkVXR4b3MgLSBBcnJheSBvZiBEZWNvZGVkVXR4b09ialxuICAgKiBAcGFyYW0gYXNzZXRJZCAtIEFzc2V0IElEIGFzIGNiNTggZW5jb2RlZCBzdHJpbmdcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbmF0aXZlIEZsYXJlSlMgVXR4byBvYmplY3RzXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlZFRvVXR4b3MoZGVjb2RlZFV0eG9zOiBEZWNvZGVkVXR4b09ialtdLCBhc3NldElkOiBzdHJpbmcpOiBVdHhvW10ge1xuICAgIHJldHVybiBkZWNvZGVkVXR4b3MubWFwKChkZWNvZGVkKSA9PiB0aGlzLmRlY29kZWRUb1V0eG8oZGVjb2RlZCwgYXNzZXRJZCkpO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
|