@bitgo/sdk-api 1.1.0-rc.21 → 1.1.0-rc.24
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/CHANGELOG.md +24 -0
- package/dist/package.json +10 -4
- package/dist/src/bitgoAPI.d.ts +214 -3
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +577 -7
- package/dist/src/types.d.ts +82 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +1 -1
- package/dist/src/v1/blockchain.d.ts +5 -0
- package/dist/src/v1/blockchain.d.ts.map +1 -0
- package/dist/src/v1/blockchain.js +114 -0
- package/dist/src/v1/keychains.d.ts +5 -0
- package/dist/src/v1/keychains.d.ts.map +1 -0
- package/dist/src/v1/keychains.js +315 -0
- package/dist/src/v1/markets.d.ts +5 -0
- package/dist/src/v1/markets.d.ts.map +1 -0
- package/dist/src/v1/markets.js +63 -0
- package/dist/src/v1/pendingapproval.d.ts +6 -0
- package/dist/src/v1/pendingapproval.d.ts.map +1 -0
- package/dist/src/v1/pendingapproval.js +322 -0
- package/dist/src/v1/pendingapprovals.d.ts +6 -0
- package/dist/src/v1/pendingapprovals.d.ts.map +1 -0
- package/dist/src/v1/pendingapprovals.js +68 -0
- package/dist/src/v1/transactionBuilder.d.ts +5 -0
- package/dist/src/v1/transactionBuilder.d.ts.map +1 -0
- package/dist/src/v1/transactionBuilder.js +889 -0
- package/dist/src/v1/travelRule.d.ts +5 -0
- package/dist/src/v1/travelRule.d.ts.map +1 -0
- package/dist/src/v1/travelRule.js +257 -0
- package/dist/src/v1/wallet.d.ts +6 -0
- package/dist/src/v1/wallet.d.ts.map +1 -0
- package/dist/src/v1/wallet.js +2095 -0
- package/dist/src/v1/wallets.d.ts +5 -0
- package/dist/src/v1/wallets.d.ts.map +1 -0
- package/dist/src/v1/wallets.js +472 -0
- package/dist/web/main.js +1 -1
- package/dist/web/main.js.LICENSE.txt +41 -0
- package/package.json +10 -4
- package/dist/tsconfig.tsbuildinfo +0 -5499
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"travelRule.d.ts","sourceRoot":"","sources":["../../../src/v1/travelRule.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @hidden
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
*/
|
|
8
|
+
//
|
|
9
|
+
// TravelRule Object
|
|
10
|
+
// BitGo accessor for a specific enterprise
|
|
11
|
+
//
|
|
12
|
+
// Copyright 2014, BitGo, Inc. All Rights Reserved.
|
|
13
|
+
//
|
|
14
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
15
|
+
const bip32 = require("bip32");
|
|
16
|
+
const utxolib = require("@bitgo/utxo-lib");
|
|
17
|
+
const Bluebird = require("bluebird");
|
|
18
|
+
const _ = require("lodash");
|
|
19
|
+
//
|
|
20
|
+
// Constructor
|
|
21
|
+
//
|
|
22
|
+
const TravelRule = function (bitgo) {
|
|
23
|
+
// @ts-expect-error - no implicit this
|
|
24
|
+
this.bitgo = bitgo;
|
|
25
|
+
};
|
|
26
|
+
TravelRule.prototype.url = function (extra) {
|
|
27
|
+
extra = extra || '';
|
|
28
|
+
return this.bitgo.url('/travel/' + extra);
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Get available travel-rule info recipients for a transaction
|
|
32
|
+
* @param params
|
|
33
|
+
* txid: transaction id
|
|
34
|
+
* @param callback
|
|
35
|
+
* @returns {*}
|
|
36
|
+
*/
|
|
37
|
+
TravelRule.prototype.getRecipients = function (params, callback) {
|
|
38
|
+
params = params || {};
|
|
39
|
+
params.txid = params.txid || params.hash;
|
|
40
|
+
sdk_core_1.common.validateParams(params, ['txid'], [], callback);
|
|
41
|
+
const url = this.url(params.txid + '/recipients');
|
|
42
|
+
return Bluebird.resolve(this.bitgo.get(url).result('recipients')).nodeify(callback);
|
|
43
|
+
};
|
|
44
|
+
TravelRule.prototype.validateTravelInfo = function (info) {
|
|
45
|
+
const fields = {
|
|
46
|
+
amount: { type: 'number' },
|
|
47
|
+
toAddress: { type: 'string' },
|
|
48
|
+
toEnterprise: { type: 'string' },
|
|
49
|
+
fromUserName: { type: 'string' },
|
|
50
|
+
fromUserAccount: { type: 'string' },
|
|
51
|
+
fromUserAddress: { type: 'string' },
|
|
52
|
+
toUserName: { type: 'string' },
|
|
53
|
+
toUserAccount: { type: 'string' },
|
|
54
|
+
toUserAddress: { type: 'string' },
|
|
55
|
+
extra: { type: 'object' },
|
|
56
|
+
};
|
|
57
|
+
_.forEach(fields, function (field, fieldName) {
|
|
58
|
+
// No required fields yet -- should there be?
|
|
59
|
+
if (field.required) {
|
|
60
|
+
if (info[fieldName] === undefined) {
|
|
61
|
+
throw new Error('missing required field ' + fieldName + ' in travel info');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (info[fieldName] && typeof info[fieldName] !== field.type) {
|
|
65
|
+
throw new Error('incorrect type for field ' + fieldName + ' in travel info, expected ' + field.type);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// Strip out any other fields we don't know about
|
|
69
|
+
const result = _.pick(info, _.keys(fields));
|
|
70
|
+
if (_.isEmpty(result)) {
|
|
71
|
+
throw new Error('empty travel data');
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Takes a transaction object as returned by getTransaction or listTransactions, along
|
|
77
|
+
* with a keychain (or hdnode object), and attempts to decrypt any encrypted travel
|
|
78
|
+
* info included in the transaction's receivedTravelInfo field.
|
|
79
|
+
* Parameters:
|
|
80
|
+
* tx: a transaction object
|
|
81
|
+
* keychain: keychain object (with xprv)
|
|
82
|
+
* Returns:
|
|
83
|
+
* the tx object, augmented with decrypted travelInfo fields
|
|
84
|
+
*/
|
|
85
|
+
TravelRule.prototype.decryptReceivedTravelInfo = function (params = {}) {
|
|
86
|
+
const tx = params.tx;
|
|
87
|
+
if (!_.isObject(tx)) {
|
|
88
|
+
throw new Error('expecting tx param to be object');
|
|
89
|
+
}
|
|
90
|
+
if (!tx.receivedTravelInfo || !tx.receivedTravelInfo.length) {
|
|
91
|
+
return tx;
|
|
92
|
+
}
|
|
93
|
+
const keychain = params.keychain;
|
|
94
|
+
if (!_.isObject(keychain) || !_.isString(keychain.xprv)) {
|
|
95
|
+
throw new Error('expecting keychain param with xprv');
|
|
96
|
+
}
|
|
97
|
+
const hdNode = bip32.fromBase58(keychain.xprv);
|
|
98
|
+
tx.receivedTravelInfo.forEach((info) => {
|
|
99
|
+
const key = hdNode.derivePath(sdk_core_1.sanitizeLegacyPath(info.toPubKeyPath));
|
|
100
|
+
const secret = sdk_core_1.getSharedSecret(key, Buffer.from(info.fromPubKey, 'hex')).toString('hex');
|
|
101
|
+
try {
|
|
102
|
+
const decrypted = this.bitgo.decrypt({
|
|
103
|
+
input: info.encryptedTravelInfo,
|
|
104
|
+
password: secret,
|
|
105
|
+
});
|
|
106
|
+
info.travelInfo = JSON.parse(decrypted);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.error('failed to decrypt or parse travel info for ', info.transactionId + ':' + info.outputIndex);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
return tx;
|
|
113
|
+
};
|
|
114
|
+
TravelRule.prototype.prepareParams = function (params) {
|
|
115
|
+
params = params || {};
|
|
116
|
+
params.txid = params.txid || params.hash;
|
|
117
|
+
sdk_core_1.common.validateParams(params, ['txid'], ['fromPrivateInfo']);
|
|
118
|
+
const txid = params.txid;
|
|
119
|
+
const recipient = params.recipient;
|
|
120
|
+
let travelInfo = params.travelInfo;
|
|
121
|
+
if (!recipient || !_.isObject(recipient)) {
|
|
122
|
+
throw new Error('invalid or missing recipient');
|
|
123
|
+
}
|
|
124
|
+
if (!travelInfo || !_.isObject(travelInfo)) {
|
|
125
|
+
throw new Error('invalid or missing travelInfo');
|
|
126
|
+
}
|
|
127
|
+
if (!params.noValidate) {
|
|
128
|
+
travelInfo = this.validateTravelInfo(travelInfo);
|
|
129
|
+
}
|
|
130
|
+
// Fill in toEnterprise if not already filled
|
|
131
|
+
if (!travelInfo.toEnterprise && recipient.enterprise) {
|
|
132
|
+
travelInfo.toEnterprise = recipient.enterprise;
|
|
133
|
+
}
|
|
134
|
+
// If a key was not provided, create a new random key
|
|
135
|
+
let fromKey = params.fromKey && utxolib.ECPair.fromWIF(params.fromKey, sdk_core_1.getNetwork());
|
|
136
|
+
if (!fromKey) {
|
|
137
|
+
fromKey = sdk_core_1.makeRandomKey();
|
|
138
|
+
}
|
|
139
|
+
// Compute the shared key for encryption
|
|
140
|
+
const sharedSecret = sdk_core_1.getSharedSecret(fromKey, Buffer.from(recipient.pubKey, 'hex')).toString('hex');
|
|
141
|
+
// JSON-ify and encrypt the payload
|
|
142
|
+
const travelInfoJSON = JSON.stringify(travelInfo);
|
|
143
|
+
const encryptedTravelInfo = this.bitgo.encrypt({
|
|
144
|
+
input: travelInfoJSON,
|
|
145
|
+
password: sharedSecret,
|
|
146
|
+
});
|
|
147
|
+
const result = {
|
|
148
|
+
txid: txid,
|
|
149
|
+
outputIndex: recipient.outputIndex,
|
|
150
|
+
toPubKey: recipient.pubKey,
|
|
151
|
+
fromPubKey: fromKey.publicKey.toString('hex'),
|
|
152
|
+
encryptedTravelInfo: encryptedTravelInfo,
|
|
153
|
+
fromPrivateInfo: undefined,
|
|
154
|
+
};
|
|
155
|
+
if (params.fromPrivateInfo) {
|
|
156
|
+
result.fromPrivateInfo = params.fromPrivateInfo;
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* Send travel data to the server for a transaction
|
|
162
|
+
*/
|
|
163
|
+
TravelRule.prototype.send = function (params, callback) {
|
|
164
|
+
params = params || {};
|
|
165
|
+
params.txid = params.txid || params.hash;
|
|
166
|
+
sdk_core_1.common.validateParams(params, ['txid', 'toPubKey', 'encryptedTravelInfo'], ['fromPubKey', 'fromPrivateInfo'], callback);
|
|
167
|
+
if (!_.isNumber(params.outputIndex)) {
|
|
168
|
+
throw new Error('invalid outputIndex');
|
|
169
|
+
}
|
|
170
|
+
return Bluebird.resolve(this.bitgo
|
|
171
|
+
.post(this.url(params.txid + '/' + params.outputIndex))
|
|
172
|
+
.send(params)
|
|
173
|
+
.result()).nodeify(callback);
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Send multiple travel rule infos for the outputs of a single transaction.
|
|
177
|
+
* Parameters:
|
|
178
|
+
* - txid (or hash): txid of the transaction (must be a sender of the tx)
|
|
179
|
+
* - travelInfos: array of travelInfo objects which look like the following:
|
|
180
|
+
* {
|
|
181
|
+
* outputIndex: number, // tx output index
|
|
182
|
+
* fromUserName: string, // name of the sending user
|
|
183
|
+
* fromUserAccount: string, // account id of the sending user
|
|
184
|
+
* fromUserAddress: string, // mailing address of the sending user
|
|
185
|
+
* toUserName: string, // name of the receiving user
|
|
186
|
+
* toUserAccount: string, // account id of the receiving user
|
|
187
|
+
* toUserAddress: string // mailing address of the receiving user
|
|
188
|
+
* }
|
|
189
|
+
* All fields aside from outputIndex are optional, but at least one must
|
|
190
|
+
* be defined.
|
|
191
|
+
*
|
|
192
|
+
* It is not necessary to provide travelInfo for all output indices.
|
|
193
|
+
* End-to-end encryption of the travel info is handled automatically by this method.
|
|
194
|
+
*
|
|
195
|
+
*/
|
|
196
|
+
TravelRule.prototype.sendMany = function (params, callback) {
|
|
197
|
+
params = params || {};
|
|
198
|
+
params.txid = params.txid || params.hash;
|
|
199
|
+
sdk_core_1.common.validateParams(params, ['txid'], callback);
|
|
200
|
+
const travelInfos = params.travelInfos;
|
|
201
|
+
if (!_.isArray(travelInfos)) {
|
|
202
|
+
throw new Error('expected parameter travelInfos to be array');
|
|
203
|
+
}
|
|
204
|
+
const self = this;
|
|
205
|
+
const travelInfoMap = _(travelInfos)
|
|
206
|
+
.keyBy('outputIndex')
|
|
207
|
+
.mapValues(function (travelInfo) {
|
|
208
|
+
return self.validateTravelInfo(travelInfo);
|
|
209
|
+
})
|
|
210
|
+
.value();
|
|
211
|
+
return self.getRecipients({ txid: params.txid }).then(function (recipients) {
|
|
212
|
+
// Build up data to post
|
|
213
|
+
const sendParamsList = [];
|
|
214
|
+
// don't regenerate a new random key for each recipient
|
|
215
|
+
const fromKey = params.fromKey || sdk_core_1.makeRandomKey().toWIF();
|
|
216
|
+
recipients.forEach(function (recipient) {
|
|
217
|
+
const outputIndex = recipient.outputIndex;
|
|
218
|
+
const info = travelInfoMap[outputIndex];
|
|
219
|
+
if (info) {
|
|
220
|
+
if (info.amount && info.amount !== recipient.amount) {
|
|
221
|
+
throw new Error('amount did not match for output index ' + outputIndex);
|
|
222
|
+
}
|
|
223
|
+
const sendParams = self.prepareParams({
|
|
224
|
+
txid: params.txid,
|
|
225
|
+
recipient: recipient,
|
|
226
|
+
travelInfo: info,
|
|
227
|
+
fromKey: fromKey,
|
|
228
|
+
noValidate: true, // don't re-validate
|
|
229
|
+
});
|
|
230
|
+
sendParamsList.push(sendParams);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
const result = {
|
|
234
|
+
matched: sendParamsList.length,
|
|
235
|
+
results: [],
|
|
236
|
+
};
|
|
237
|
+
const sendSerial = function () {
|
|
238
|
+
const sendParams = sendParamsList.shift();
|
|
239
|
+
if (!sendParams) {
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
return self
|
|
243
|
+
.send(sendParams)
|
|
244
|
+
.then(function (res) {
|
|
245
|
+
result.results.push({ result: res });
|
|
246
|
+
return sendSerial();
|
|
247
|
+
})
|
|
248
|
+
.catch(function (err) {
|
|
249
|
+
result.results.push({ error: err.toString() });
|
|
250
|
+
return sendSerial();
|
|
251
|
+
});
|
|
252
|
+
};
|
|
253
|
+
return sendSerial();
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
module.exports = TravelRule;
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhdmVsUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS90cmF2ZWxSdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLG9CQUFvQjtBQUNwQiwyQ0FBMkM7QUFDM0MsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsOENBQXlHO0FBQ3pHLCtCQUErQjtBQUMvQiwyQ0FBMkM7QUFDM0MscUNBQXFDO0FBQ3JDLDRCQUE0QjtBQXlCNUIsRUFBRTtBQUNGLGNBQWM7QUFDZCxFQUFFO0FBQ0YsTUFBTSxVQUFVLEdBQUcsVUFBVSxLQUFLO0lBQ2hDLHNDQUFzQztJQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLEtBQUs7SUFDeEMsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUM3RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztJQUN6QyxpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQ2xE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Q2YsT0FBTyxNQUFNLENBQUM7YUFDZjtZQUNELE9BQU8sSUFBSTtpQkFDUixJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHO2dCQUNqQixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsVUFBVSxHQUFHO2dCQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO1FBRUYsT0FBTyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBUcmF2ZWxSdWxlIE9iamVjdFxuLy8gQml0R28gYWNjZXNzb3IgZm9yIGEgc3BlY2lmaWMgZW50ZXJwcmlzZVxuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5pbXBvcnQgeyBjb21tb24sIGdldE5ldHdvcmssIGdldFNoYXJlZFNlY3JldCwgbWFrZVJhbmRvbUtleSwgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGJpcDMyIGZyb20gJ2JpcDMyJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIEJsdWViaXJkIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW50ZXJmYWNlIERlY3J5cHRSZWNlaXZlZFRyYXZlbFJ1bGVPcHRpb25zIHtcbiAgdHg/OiB7XG4gICAgcmVjZWl2ZWRUcmF2ZWxJbmZvPzoge1xuICAgICAgdG9QdWJLZXlQYXRoOiBzdHJpbmc7XG4gICAgICBmcm9tUHViS2V5OiBzdHJpbmc7XG4gICAgICBlbmNyeXB0ZWRUcmF2ZWxJbmZvOiBzdHJpbmc7XG4gICAgICB0cmF2ZWxJbmZvOiBzdHJpbmc7XG4gICAgICB0cmFuc2FjdGlvbklkOiBzdHJpbmc7XG4gICAgICBvdXRwdXRJbmRleDogbnVtYmVyO1xuICAgIH1bXTtcbiAgfTtcbiAga2V5Y2hhaW4/OiB7XG4gICAgeHBydj86IHN0cmluZztcbiAgfTtcbiAgaGRub2RlPzogYmlwMzIuQklQMzJJbnRlcmZhY2U7XG59XG5cbmludGVyZmFjZSBSZWNpcGllbnQge1xuICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gIHB1YktleTogc3RyaW5nO1xuICBvdXRwdXRJbmRleDogc3RyaW5nO1xufVxuXG4vL1xuLy8gQ29uc3RydWN0b3Jcbi8vXG5jb25zdCBUcmF2ZWxSdWxlID0gZnVuY3Rpb24gKGJpdGdvKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMuYml0Z28gPSBiaXRnbztcbn07XG5cblRyYXZlbFJ1bGUucHJvdG90eXBlLnVybCA9IGZ1bmN0aW9uIChleHRyYSkge1xuICBleHRyYSA9IGV4dHJhIHx8ICcnO1xuICByZXR1cm4gdGhpcy5iaXRnby51cmwoJy90cmF2ZWwvJyArIGV4dHJhKTtcbn07XG5cbi8qKlxuICogR2V0IGF2YWlsYWJsZSB0cmF2ZWwtcnVsZSBpbmZvIHJlY2lwaWVudHMgZm9yIGEgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0eGlkOiB0cmFuc2FjdGlvbiBpZFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuVHJhdmVsUnVsZS5wcm90b3R5cGUuZ2V0UmVjaXBpZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgcGFyYW1zLnR4aWQgPSBwYXJhbXMudHhpZCB8fCBwYXJhbXMuaGFzaDtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eGlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwocGFyYW1zLnR4aWQgKyAnL3JlY2lwaWVudHMnKTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoJ3JlY2lwaWVudHMnKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5UcmF2ZWxSdWxlLnByb3RvdHlwZS52YWxpZGF0ZVRyYXZlbEluZm8gPSBmdW5jdGlvbiAoaW5mbykge1xuICBjb25zdCBmaWVsZHMgPSB7XG4gICAgYW1vdW50OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgdG9BZGRyZXNzOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgdG9FbnRlcnByaXNlOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgZnJvbVVzZXJOYW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgZnJvbVVzZXJBY2NvdW50OiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgZnJvbVVzZXJBZGRyZXNzOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgdG9Vc2VyTmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHRvVXNlckFjY291bnQ6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICB0b1VzZXJBZGRyZXNzOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgZXh0cmE6IHsgdHlwZTogJ29iamVjdCcgfSxcbiAgfTtcblxuICBfLmZvckVhY2goZmllbGRzLCBmdW5jdGlvbiAoZmllbGQ6IGFueSwgZmllbGROYW1lKSB7XG4gICAgLy8gTm8gcmVxdWlyZWQgZmllbGRzIHlldCAtLSBzaG91bGQgdGhlcmUgYmU/XG4gICAgaWYgKGZpZWxkLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoaW5mb1tmaWVsZE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGZpZWxkICcgKyBmaWVsZE5hbWUgKyAnIGluIHRyYXZlbCBpbmZvJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmZvW2ZpZWxkTmFtZV0gJiYgdHlwZW9mIGluZm9bZmllbGROYW1lXSAhPT0gZmllbGQudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvcnJlY3QgdHlwZSBmb3IgZmllbGQgJyArIGZpZWxkTmFtZSArICcgaW4gdHJhdmVsIGluZm8sIGV4cGVjdGVkICcgKyBmaWVsZC50eXBlKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFN0cmlwIG91dCBhbnkgb3RoZXIgZmllbGRzIHdlIGRvbid0IGtub3cgYWJvdXRcbiAgY29uc3QgcmVzdWx0ID0gXy5waWNrKGluZm8sIF8ua2V5cyhmaWVsZHMpKTtcbiAgaWYgKF8uaXNFbXB0eShyZXN1bHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbXB0eSB0cmF2ZWwgZGF0YScpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFRha2VzIGEgdHJhbnNhY3Rpb24gb2JqZWN0IGFzIHJldHVybmVkIGJ5IGdldFRyYW5zYWN0aW9uIG9yIGxpc3RUcmFuc2FjdGlvbnMsIGFsb25nXG4gKiB3aXRoIGEga2V5Y2hhaW4gKG9yIGhkbm9kZSBvYmplY3QpLCBhbmQgYXR0ZW1wdHMgdG8gZGVjcnlwdCBhbnkgZW5jcnlwdGVkIHRyYXZlbFxuICogaW5mbyBpbmNsdWRlZCBpbiB0aGUgdHJhbnNhY3Rpb24ncyByZWNlaXZlZFRyYXZlbEluZm8gZmllbGQuXG4gKiBQYXJhbWV0ZXJzOlxuICogICB0eDogYSB0cmFuc2FjdGlvbiBvYmplY3RcbiAqICAga2V5Y2hhaW46IGtleWNoYWluIG9iamVjdCAod2l0aCB4cHJ2KVxuICogUmV0dXJuczpcbiAqICAgdGhlIHR4IG9iamVjdCwgYXVnbWVudGVkIHdpdGggZGVjcnlwdGVkIHRyYXZlbEluZm8gZmllbGRzXG4gKi9cblRyYXZlbFJ1bGUucHJvdG90eXBlLmRlY3J5cHRSZWNlaXZlZFRyYXZlbEluZm8gPSBmdW5jdGlvbiAocGFyYW1zOiBEZWNyeXB0UmVjZWl2ZWRUcmF2ZWxSdWxlT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHR4ID0gcGFyYW1zLnR4O1xuICBpZiAoIV8uaXNPYmplY3QodHgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdHggcGFyYW0gdG8gYmUgb2JqZWN0Jyk7XG4gIH1cblxuICBpZiAoIXR4LnJlY2VpdmVkVHJhdmVsSW5mbyB8fCAhdHgucmVjZWl2ZWRUcmF2ZWxJbmZvLmxlbmd0aCkge1xuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIGNvbnN0IGtleWNoYWluID0gcGFyYW1zLmtleWNoYWluO1xuICBpZiAoIV8uaXNPYmplY3Qoa2V5Y2hhaW4pIHx8ICFfLmlzU3RyaW5nKGtleWNoYWluLnhwcnYpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3Rpbmcga2V5Y2hhaW4gcGFyYW0gd2l0aCB4cHJ2Jyk7XG4gIH1cbiAgY29uc3QgaGROb2RlID0gYmlwMzIuZnJvbUJhc2U1OChrZXljaGFpbi54cHJ2KTtcblxuICB0eC5yZWNlaXZlZFRyYXZlbEluZm8uZm9yRWFjaCgoaW5mbykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGhkTm9kZS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aChpbmZvLnRvUHViS2V5UGF0aCkpO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChrZXksIEJ1ZmZlci5mcm9tKGluZm8uZnJvbVB1YktleSwgJ2hleCcpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIGlucHV0OiBpbmZvLmVuY3J5cHRlZFRyYXZlbEluZm8sXG4gICAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICB9KTtcbiAgICAgIGluZm8udHJhdmVsSW5mbyA9IEpTT04ucGFyc2UoZGVjcnlwdGVkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBkZWNyeXB0IG9yIHBhcnNlIHRyYXZlbCBpbmZvIGZvciAnLCBpbmZvLnRyYW5zYWN0aW9uSWQgKyAnOicgKyBpbmZvLm91dHB1dEluZGV4KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0eDtcbn07XG5cblRyYXZlbFJ1bGUucHJvdG90eXBlLnByZXBhcmVQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgcGFyYW1zLnR4aWQgPSBwYXJhbXMudHhpZCB8fCBwYXJhbXMuaGFzaDtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eGlkJ10sIFsnZnJvbVByaXZhdGVJbmZvJ10pO1xuICBjb25zdCB0eGlkID0gcGFyYW1zLnR4aWQ7XG4gIGNvbnN0IHJlY2lwaWVudDogUmVjaXBpZW50IHwgdW5kZWZpbmVkID0gcGFyYW1zLnJlY2lwaWVudDtcbiAgbGV0IHRyYXZlbEluZm8gPSBwYXJhbXMudHJhdmVsSW5mbztcbiAgaWYgKCFyZWNpcGllbnQgfHwgIV8uaXNPYmplY3QocmVjaXBpZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBvciBtaXNzaW5nIHJlY2lwaWVudCcpO1xuICB9XG4gIGlmICghdHJhdmVsSW5mbyB8fCAhXy5pc09iamVjdCh0cmF2ZWxJbmZvKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBvciBtaXNzaW5nIHRyYXZlbEluZm8nKTtcbiAgfVxuICBpZiAoIXBhcmFtcy5ub1ZhbGlkYXRlKSB7XG4gICAgdHJhdmVsSW5mbyA9IHRoaXMudmFsaWRhdGVUcmF2ZWxJbmZvKHRyYXZlbEluZm8pO1xuICB9XG5cbiAgLy8gRmlsbCBpbiB0b0VudGVycHJpc2UgaWYgbm90IGFscmVhZHkgZmlsbGVkXG4gIGlmICghdHJhdmVsSW5mby50b0VudGVycHJpc2UgJiYgcmVjaXBpZW50LmVudGVycHJpc2UpIHtcbiAgICB0cmF2ZWxJbmZvLnRvRW50ZXJwcmlzZSA9IHJlY2lwaWVudC5lbnRlcnByaXNlO1xuICB9XG5cbiAgLy8gSWYgYSBrZXkgd2FzIG5vdCBwcm92aWRlZCwgY3JlYXRlIGEgbmV3IHJhbmRvbSBrZXlcbiAgbGV0IGZyb21LZXkgPSBwYXJhbXMuZnJvbUtleSAmJiB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5mcm9tS2V5LCBnZXROZXR3b3JrKCkgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgaWYgKCFmcm9tS2V5KSB7XG4gICAgZnJvbUtleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIHNoYXJlZCBrZXkgZm9yIGVuY3J5cHRpb25cbiAgY29uc3Qgc2hhcmVkU2VjcmV0ID0gZ2V0U2hhcmVkU2VjcmV0KGZyb21LZXksIEJ1ZmZlci5mcm9tKHJlY2lwaWVudC5wdWJLZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gIC8vIEpTT04taWZ5IGFuZCBlbmNyeXB0IHRoZSBwYXlsb2FkXG4gIGNvbnN0IHRyYXZlbEluZm9KU09OID0gSlNPTi5zdHJpbmdpZnkodHJhdmVsSW5mbyk7XG4gIGNvbnN0IGVuY3J5cHRlZFRyYXZlbEluZm8gPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgIGlucHV0OiB0cmF2ZWxJbmZvSlNPTixcbiAgICBwYXNzd29yZDogc2hhcmVkU2VjcmV0LFxuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgdHhpZDogdHhpZCxcbiAgICBvdXRwdXRJbmRleDogcmVjaXBpZW50Lm91dHB1dEluZGV4LFxuICAgIHRvUHViS2V5OiByZWNpcGllbnQucHViS2V5LFxuICAgIGZyb21QdWJLZXk6IGZyb21LZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICBlbmNyeXB0ZWRUcmF2ZWxJbmZvOiBlbmNyeXB0ZWRUcmF2ZWxJbmZvLFxuICAgIGZyb21Qcml2YXRlSW5mbzogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGlmIChwYXJhbXMuZnJvbVByaXZhdGVJbmZvKSB7XG4gICAgcmVzdWx0LmZyb21Qcml2YXRlSW5mbyA9IHBhcmFtcy5mcm9tUHJpdmF0ZUluZm87XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBTZW5kIHRyYXZlbCBkYXRhIHRvIHRoZSBzZXJ2ZXIgZm9yIGEgdHJhbnNhY3Rpb25cbiAqL1xuVHJhdmVsUnVsZS5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgcGFyYW1zLnR4aWQgPSBwYXJhbXMudHhpZCB8fCBwYXJhbXMuaGFzaDtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgIHBhcmFtcyxcbiAgICBbJ3R4aWQnLCAndG9QdWJLZXknLCAnZW5jcnlwdGVkVHJhdmVsSW5mbyddLFxuICAgIFsnZnJvbVB1YktleScsICdmcm9tUHJpdmF0ZUluZm8nXSxcbiAgICBjYWxsYmFja1xuICApO1xuXG4gIGlmICghXy5pc051bWJlcihwYXJhbXMub3V0cHV0SW5kZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG91dHB1dEluZGV4Jyk7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybChwYXJhbXMudHhpZCArICcvJyArIHBhcmFtcy5vdXRwdXRJbmRleCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KClcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogU2VuZCBtdWx0aXBsZSB0cmF2ZWwgcnVsZSBpbmZvcyBmb3IgdGhlIG91dHB1dHMgb2YgYSBzaW5nbGUgdHJhbnNhY3Rpb24uXG4gKiBQYXJhbWV0ZXJzOlxuICogICAtIHR4aWQgKG9yIGhhc2gpOiB0eGlkIG9mIHRoZSB0cmFuc2FjdGlvbiAobXVzdCBiZSBhIHNlbmRlciBvZiB0aGUgdHgpXG4gKiAgIC0gdHJhdmVsSW5mb3M6IGFycmF5IG9mIHRyYXZlbEluZm8gb2JqZWN0cyB3aGljaCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzpcbiAqICAgICB7XG4gKiAgICAgICBvdXRwdXRJbmRleDogbnVtYmVyLCAgICAgLy8gdHggb3V0cHV0IGluZGV4XG4gKiAgICAgICBmcm9tVXNlck5hbWU6IHN0cmluZywgICAgLy8gbmFtZSBvZiB0aGUgc2VuZGluZyB1c2VyXG4gKiAgICAgICBmcm9tVXNlckFjY291bnQ6IHN0cmluZywgLy8gYWNjb3VudCBpZCBvZiB0aGUgc2VuZGluZyB1c2VyXG4gKiAgICAgICBmcm9tVXNlckFkZHJlc3M6IHN0cmluZywgLy8gbWFpbGluZyBhZGRyZXNzIG9mIHRoZSBzZW5kaW5nIHVzZXJcbiAqICAgICAgIHRvVXNlck5hbWU6IHN0cmluZywgICAgICAvLyBuYW1lIG9mIHRoZSByZWNlaXZpbmcgdXNlclxuICogICAgICAgdG9Vc2VyQWNjb3VudDogc3RyaW5nLCAgIC8vIGFjY291bnQgaWQgb2YgdGhlIHJlY2VpdmluZyB1c2VyXG4gKiAgICAgICB0b1VzZXJBZGRyZXNzOiBzdHJpbmcgICAgLy8gbWFpbGluZyBhZGRyZXNzIG9mIHRoZSByZWNlaXZpbmcgdXNlclxuICogICAgIH1cbiAqICAgICBBbGwgZmllbGRzIGFzaWRlIGZyb20gb3V0cHV0SW5kZXggYXJlIG9wdGlvbmFsLCBidXQgYXQgbGVhc3Qgb25lIG11c3RcbiAqICAgICBiZSBkZWZpbmVkLlxuICpcbiAqICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgdHJhdmVsSW5mbyBmb3IgYWxsIG91dHB1dCBpbmRpY2VzLlxuICogIEVuZC10by1lbmQgZW5jcnlwdGlvbiBvZiB0aGUgdHJhdmVsIGluZm8gaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoaXMgbWV0aG9kLlxuICpcbiAqL1xuVHJhdmVsUnVsZS5wcm90b3R5cGUuc2VuZE1hbnkgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIHBhcmFtcy50eGlkID0gcGFyYW1zLnR4aWQgfHwgcGFyYW1zLmhhc2g7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHhpZCddLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdHJhdmVsSW5mb3MgPSBwYXJhbXMudHJhdmVsSW5mb3M7XG4gIGlmICghXy5pc0FycmF5KHRyYXZlbEluZm9zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgcGFyYW1ldGVyIHRyYXZlbEluZm9zIHRvIGJlIGFycmF5Jyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgY29uc3QgdHJhdmVsSW5mb01hcCA9IF8odHJhdmVsSW5mb3MpXG4gICAgLmtleUJ5KCdvdXRwdXRJbmRleCcpXG4gICAgLm1hcFZhbHVlcyhmdW5jdGlvbiAodHJhdmVsSW5mbykge1xuICAgICAgcmV0dXJuIHNlbGYudmFsaWRhdGVUcmF2ZWxJbmZvKHRyYXZlbEluZm8pO1xuICAgIH0pXG4gICAgLnZhbHVlKCk7XG5cbiAgcmV0dXJuIHNlbGYuZ2V0UmVjaXBpZW50cyh7IHR4aWQ6IHBhcmFtcy50eGlkIH0pLnRoZW4oZnVuY3Rpb24gKHJlY2lwaWVudHMpIHtcbiAgICAvLyBCdWlsZCB1cCBkYXRhIHRvIHBvc3RcbiAgICBjb25zdCBzZW5kUGFyYW1zTGlzdDogYW55W10gPSBbXTtcbiAgICAvLyBkb24ndCByZWdlbmVyYXRlIGEgbmV3IHJhbmRvbSBrZXkgZm9yIGVhY2ggcmVjaXBpZW50XG4gICAgY29uc3QgZnJvbUtleSA9IHBhcmFtcy5mcm9tS2V5IHx8IG1ha2VSYW5kb21LZXkoKS50b1dJRigpO1xuXG4gICAgcmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gcmVjaXBpZW50Lm91dHB1dEluZGV4O1xuICAgICAgY29uc3QgaW5mbyA9IHRyYXZlbEluZm9NYXBbb3V0cHV0SW5kZXhdO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uYW1vdW50ICYmIGluZm8uYW1vdW50ICE9PSByZWNpcGllbnQuYW1vdW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbW91bnQgZGlkIG5vdCBtYXRjaCBmb3Igb3V0cHV0IGluZGV4ICcgKyBvdXRwdXRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VuZFBhcmFtcyA9IHNlbGYucHJlcGFyZVBhcmFtcyh7XG4gICAgICAgICAgdHhpZDogcGFyYW1zLnR4aWQsXG4gICAgICAgICAgcmVjaXBpZW50OiByZWNpcGllbnQsXG4gICAgICAgICAgdHJhdmVsSW5mbzogaW5mbyxcbiAgICAgICAgICBmcm9tS2V5OiBmcm9tS2V5LFxuICAgICAgICAgIG5vVmFsaWRhdGU6IHRydWUsIC8vIGRvbid0IHJlLXZhbGlkYXRlXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kUGFyYW1zTGlzdC5wdXNoKHNlbmRQYXJhbXMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBtYXRjaGVkOiBudW1iZXI7XG4gICAgICByZXN1bHRzOiB7XG4gICAgICAgIHJlc3VsdD86IGFueTtcbiAgICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICB9W107XG4gICAgfSA9IHtcbiAgICAgIG1hdGNoZWQ6IHNlbmRQYXJhbXNMaXN0Lmxlbmd0aCxcbiAgICAgIHJlc3VsdHM6IFtdLFxuICAgIH07XG5cbiAgICBjb25zdCBzZW5kU2VyaWFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2VuZFBhcmFtcyA9IHNlbmRQYXJhbXNMaXN0LnNoaWZ0KCk7XG4gICAgICBpZiAoIXNlbmRQYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmXG4gICAgICAgIC5zZW5kKHNlbmRQYXJhbXMpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICByZXN1bHQucmVzdWx0cy5wdXNoKHsgcmVzdWx0OiByZXMgfSk7XG4gICAgICAgICAgcmV0dXJuIHNlbmRTZXJpYWwoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICByZXN1bHQucmVzdWx0cy5wdXNoKHsgZXJyb3I6IGVyci50b1N0cmluZygpIH0pO1xuICAgICAgICAgIHJldHVybiBzZW5kU2VyaWFsKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gc2VuZFNlcmlhbCgpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhdmVsUnVsZTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../src/v1/wallet.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH,QAAA,MAAM,MAAM,mCAYX,CAAC;AA00EF,SAAS,MAAM,CAAC"}
|