@bitgo/sdk-api 1.0.1-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,435 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BitGoAPI = void 0;
4
+ const _ = require("lodash");
5
+ const api_1 = require("./api");
6
+ const debug_1 = require("debug");
7
+ const superagent = require("superagent");
8
+ const urlLib = require("url");
9
+ const crypto_1 = require("crypto");
10
+ const sdk_core_1 = require("@bitgo/sdk-core");
11
+ const util_1 = require("./util");
12
+ const sjcl = require("@bitgo/sjcl");
13
+ const moment = require("moment");
14
+ const pjson = require("../package.json");
15
+ const debug = debug_1.default('bitgo:api');
16
+ if (!process.browser) {
17
+ debug('enabling superagent-proxy wrapper');
18
+ require('superagent-proxy')(superagent);
19
+ }
20
+ const patchedRequestMethods = ['get', 'post', 'put', 'del', 'patch'];
21
+ class BitGoAPI {
22
+ constructor(params = {}) {
23
+ this._authVersion = 2;
24
+ this._hmacVerification = true;
25
+ this._version = pjson.version;
26
+ if (!sdk_core_1.common.validateParams(params, [], [
27
+ 'accessToken',
28
+ 'userAgent',
29
+ 'customRootURI',
30
+ 'customBitcoinNetwork',
31
+ 'serverXpub',
32
+ 'stellarFederationServerUrl',
33
+ ]) ||
34
+ (params.useProduction && !_.isBoolean(params.useProduction))) {
35
+ throw new Error('invalid argument');
36
+ }
37
+ // By default, we operate on the test server.
38
+ // Deprecate useProduction in the future
39
+ let env;
40
+ if (params.useProduction) {
41
+ if (params.env && params.env !== 'prod') {
42
+ throw new Error('cannot use useProduction when env=' + params.env);
43
+ }
44
+ env = 'prod';
45
+ }
46
+ else if (params.customRootURI ||
47
+ params.customBitcoinNetwork ||
48
+ params.customSigningAddress ||
49
+ params.serverXpub ||
50
+ process.env.BITGO_CUSTOM_ROOT_URI ||
51
+ process.env.BITGO_CUSTOM_BITCOIN_NETWORK) {
52
+ // for branch deploys, we want to be able to specify custom endpoints while still
53
+ // maintaining the name of specified the environment
54
+ env = params.env === 'branch' ? 'branch' : 'custom';
55
+ if (params.customRootURI) {
56
+ sdk_core_1.common.Environments[env].uri = params.customRootURI;
57
+ }
58
+ if (params.customBitcoinNetwork) {
59
+ sdk_core_1.common.Environments[env].network = params.customBitcoinNetwork;
60
+ }
61
+ if (params.customSigningAddress) {
62
+ sdk_core_1.common.Environments[env].customSigningAddress = params.customSigningAddress;
63
+ }
64
+ if (params.serverXpub) {
65
+ sdk_core_1.common.Environments[env].serverXpub = params.serverXpub;
66
+ }
67
+ if (params.stellarFederationServerUrl) {
68
+ sdk_core_1.common.Environments[env].stellarFederationServerUrl = params.stellarFederationServerUrl;
69
+ }
70
+ }
71
+ else {
72
+ env = params.env || process.env.BITGO_ENV;
73
+ }
74
+ if (params.authVersion !== undefined) {
75
+ this._authVersion = params.authVersion;
76
+ }
77
+ // if this env is an alias, swap it out with the equivalent supported environment
78
+ if (env in sdk_core_1.AliasEnvironments) {
79
+ env = sdk_core_1.AliasEnvironments[env];
80
+ }
81
+ if (env === 'custom' && _.isUndefined(sdk_core_1.common.Environments[env].uri)) {
82
+ throw new Error('must use --customrooturi or set the BITGO_CUSTOM_ROOT_URI environment variable when using the custom environment');
83
+ }
84
+ if (env) {
85
+ if (sdk_core_1.common.Environments[env]) {
86
+ this._baseUrl = sdk_core_1.common.Environments[env].uri;
87
+ }
88
+ else {
89
+ throw new Error('invalid environment ' + env + '. Supported environments: prod, test, dev, latest');
90
+ }
91
+ }
92
+ else {
93
+ env = 'test';
94
+ if (!BitGoAPI._testnetWarningMessage) {
95
+ BitGoAPI._testnetWarningMessage = true;
96
+ console.log('BitGo SDK env not set - defaulting to test at test.bitgo.com.');
97
+ }
98
+ this._baseUrl = sdk_core_1.common.Environments[env].uri;
99
+ }
100
+ this._env = this.env = env;
101
+ if (params.etherscanApiToken) {
102
+ sdk_core_1.common.Environments[env].etherscanApiToken = params.etherscanApiToken;
103
+ }
104
+ sdk_core_1.common.setNetwork(sdk_core_1.common.Environments[env].network);
105
+ this._baseApiUrl = this._baseUrl + '/api/v1';
106
+ this._baseApiUrlV2 = this._baseUrl + '/api/v2';
107
+ this._token = params.accessToken;
108
+ this._userAgent = params.userAgent || 'BitGoJS/' + this.version();
109
+ this._reqId = undefined;
110
+ if (!params.hmacVerification && params.hmacVerification !== undefined) {
111
+ if (sdk_core_1.common.Environments[env].hmacVerificationEnforced) {
112
+ throw new Error(`Cannot disable request HMAC verification in environment ${this.getEnv()}`);
113
+ }
114
+ debug('HMAC verification explicitly disabled by constructor option');
115
+ this._hmacVerification = params.hmacVerification;
116
+ }
117
+ if (!params.proxy && process.env.BITGO_USE_PROXY) {
118
+ params.proxy = process.env.BITGO_USE_PROXY;
119
+ }
120
+ if (process.browser && params.proxy) {
121
+ throw new Error('cannot use https proxy params while in browser');
122
+ }
123
+ this._proxy = params.proxy;
124
+ // capture outer stack so we have useful debug information if fetch constants fails
125
+ const e = new Error();
126
+ // Kick off first load of constants
127
+ this.fetchConstants().catch((err) => {
128
+ if (err) {
129
+ // make sure an error does not terminate the entire script
130
+ console.error('failed to fetch initial client constants from BitGo');
131
+ debug(e.stack);
132
+ }
133
+ });
134
+ }
135
+ /**
136
+ * Return the current BitGo environment
137
+ */
138
+ getEnv() {
139
+ return this._env;
140
+ }
141
+ /**
142
+ * Return the current auth version used for requests to the BitGo server
143
+ */
144
+ getAuthVersion() {
145
+ return this._authVersion;
146
+ }
147
+ /**
148
+ * This is a patching function which can apply our authorization
149
+ * headers to any outbound request.
150
+ * @param method
151
+ */
152
+ requestPatch(method, url) {
153
+ let req = superagent[method](url);
154
+ if (this._proxy) {
155
+ debug('proxying request through %s', this._proxy);
156
+ req = req.proxy(this._proxy);
157
+ }
158
+ const originalThen = req.then.bind(req);
159
+ req.then = (onfulfilled, onrejected) => {
160
+ var _a, _b;
161
+ // intercept a request before it's submitted to the server for v2 authentication (based on token)
162
+ if (this._version) {
163
+ // TODO - decide where to get version
164
+ req.set('BitGo-SDK-Version', this._version);
165
+ }
166
+ if (!_.isUndefined(this._reqId)) {
167
+ req.set('Request-ID', this._reqId.toString());
168
+ // increment after setting the header so the sequence numbers start at 0
169
+ this._reqId.inc();
170
+ // request ids must be set before each request instead of being kept
171
+ // inside the bitgo object. This is to prevent reentrancy issues where
172
+ // multiple simultaneous requests could cause incorrect reqIds to be used
173
+ delete this._reqId;
174
+ }
175
+ // prevent IE from caching requests
176
+ req.set('If-Modified-Since', 'Mon, 26 Jul 1997 05:00:00 GMT');
177
+ if (!process.browser && this._userAgent) {
178
+ // If not in the browser, set the User-Agent. Browsers don't allow
179
+ // setting of User-Agent, so we must disable this when run in the
180
+ // browser (browserify sets process.browser).
181
+ req.set('User-Agent', this._userAgent);
182
+ }
183
+ // Set the request timeout to just above 5 minutes by default
184
+ req.timeout(process.env.BITGO_TIMEOUT * 1000 || 305 * 1000);
185
+ // if there is no token, and we're not logged in, the request cannot be v2 authenticated
186
+ req.isV2Authenticated = true;
187
+ req.authenticationToken = this._token;
188
+ // some of the older tokens appear to be only 40 characters long
189
+ if ((this._token && this._token.length !== 67 && this._token.indexOf('v2x') !== 0) || req.forceV1Auth) {
190
+ // use the old method
191
+ req.isV2Authenticated = false;
192
+ req.set('Authorization', 'Bearer ' + this._token);
193
+ debug('sending v1 %s request to %s with token %s', method, url, (_a = this._token) === null || _a === void 0 ? void 0 : _a.substr(0, 8));
194
+ return originalThen(onfulfilled).catch(onrejected);
195
+ }
196
+ req.set('BitGo-Auth-Version', this._authVersion === 3 ? '3.0' : '2.0');
197
+ if (this._token) {
198
+ const data = api_1.serializeRequestData(req);
199
+ api_1.setRequestQueryString(req);
200
+ const requestProperties = this.calculateRequestHeaders({
201
+ url: req.url,
202
+ token: this._token,
203
+ method,
204
+ text: data || '',
205
+ });
206
+ req.set('Auth-Timestamp', requestProperties.timestamp.toString());
207
+ // we're not sending the actual token, but only its hash
208
+ req.set('Authorization', 'Bearer ' + requestProperties.tokenHash);
209
+ debug('sending v2 %s request to %s with token %s', method, url, (_b = this._token) === null || _b === void 0 ? void 0 : _b.substr(0, 8));
210
+ // set the HMAC
211
+ req.set('HMAC', requestProperties.hmac);
212
+ }
213
+ /**
214
+ * Verify the response before calling the original onfulfilled handler,
215
+ * and make sure onrejected is called if a verification error is encountered
216
+ */
217
+ const newOnFulfilled = onfulfilled
218
+ ? (response) => {
219
+ // HMAC verification is only allowed to be skipped in certain environments.
220
+ // This is checked in the constructor, but checking it again at request time
221
+ // will help prevent against tampering of this property after the object is created
222
+ if (!this._hmacVerification && !sdk_core_1.common.Environments[this.getEnv()].hmacVerificationEnforced) {
223
+ return onfulfilled(response);
224
+ }
225
+ const verifiedResponse = api_1.verifyResponse(this, this._token, method, req, response);
226
+ return onfulfilled(verifiedResponse);
227
+ }
228
+ : null;
229
+ return originalThen(newOnFulfilled).catch(onrejected);
230
+ };
231
+ return api_1.toBitgoRequest(req);
232
+ }
233
+ get(url) {
234
+ return this.requestPatch('get', url);
235
+ }
236
+ post(url) {
237
+ return this.requestPatch('post', url);
238
+ }
239
+ put(url) {
240
+ return this.requestPatch('put', url);
241
+ }
242
+ del(url) {
243
+ return this.requestPatch('del', url);
244
+ }
245
+ patch(url) {
246
+ return this.requestPatch('patch', url);
247
+ }
248
+ /**
249
+ * Calculate the HMAC for the given key and message
250
+ * @param key {String} - the key to use for the HMAC
251
+ * @param message {String} - the actual message to HMAC
252
+ * @returns {*} - the result of the HMAC operation
253
+ */
254
+ calculateHMAC(key, message) {
255
+ return crypto_1.createHmac('sha256', key).update(message).digest('hex');
256
+ }
257
+ /**
258
+ * Calculate the subject string that is to be HMAC'ed for a HTTP request or response
259
+ * @param urlPath request url, including query params
260
+ * @param text request body text
261
+ * @param timestamp request timestamp from `Date.now()`
262
+ * @param statusCode Only set for HTTP responses, leave blank for requests
263
+ * @param method request method
264
+ * @returns {string}
265
+ */
266
+ calculateHMACSubject({ urlPath, text, timestamp, statusCode, method }) {
267
+ const urlDetails = urlLib.parse(urlPath);
268
+ const queryPath = urlDetails.query && urlDetails.query.length > 0 ? urlDetails.path : urlDetails.pathname;
269
+ if (!_.isUndefined(statusCode) && _.isInteger(statusCode) && _.isFinite(statusCode)) {
270
+ if (this._authVersion === 3) {
271
+ return [method.toUpperCase(), timestamp, queryPath, statusCode, text].join('|');
272
+ }
273
+ return [timestamp, queryPath, statusCode, text].join('|');
274
+ }
275
+ if (this._authVersion === 3) {
276
+ return [method.toUpperCase(), timestamp, '3.0', queryPath, text].join('|');
277
+ }
278
+ return [timestamp, queryPath, text].join('|');
279
+ }
280
+ /**
281
+ * Calculate the HMAC for an HTTP request
282
+ */
283
+ calculateRequestHMAC({ url: urlPath, text, timestamp, token, method }) {
284
+ const signatureSubject = this.calculateHMACSubject({ urlPath, text, timestamp, method });
285
+ // calculate the HMAC
286
+ return this.calculateHMAC(token, signatureSubject);
287
+ }
288
+ /**
289
+ * Calculate request headers with HMAC
290
+ */
291
+ calculateRequestHeaders({ url, text, token, method }) {
292
+ const timestamp = Date.now();
293
+ const hmac = this.calculateRequestHMAC({ url, text, timestamp, token, method });
294
+ // calculate the SHA256 hash of the token
295
+ const hashDigest = sjcl.hash.sha256.hash(token);
296
+ const tokenHash = sjcl.codec.hex.fromBits(hashDigest);
297
+ return {
298
+ hmac,
299
+ timestamp,
300
+ tokenHash,
301
+ };
302
+ }
303
+ /**
304
+ * Verify the HMAC for an HTTP response
305
+ */
306
+ verifyResponse({ url: urlPath, statusCode, text, timestamp, token, hmac, method, }) {
307
+ const signatureSubject = this.calculateHMACSubject({
308
+ urlPath,
309
+ text,
310
+ timestamp,
311
+ statusCode,
312
+ method,
313
+ });
314
+ // calculate the HMAC
315
+ const expectedHmac = this.calculateHMAC(token, signatureSubject);
316
+ // determine if the response is still within the validity window (5 minute window)
317
+ const now = Date.now();
318
+ const isInResponseValidityWindow = timestamp >= now - 1000 * 60 * 5 && timestamp <= now;
319
+ // verify the HMAC and timestamp
320
+ return {
321
+ isValid: expectedHmac === hmac,
322
+ expectedHmac,
323
+ signatureSubject,
324
+ isInResponseValidityWindow,
325
+ verificationTime: now,
326
+ };
327
+ }
328
+ /**
329
+ * Process the username, password and otp into an object containing the username and hashed password, ready to
330
+ * send to bitgo for authentication.
331
+ */
332
+ preprocessAuthenticationParams({ username, password, otp, forceSMS, extensible, trust, }) {
333
+ if (!_.isString(username)) {
334
+ throw new Error('expected string username');
335
+ }
336
+ if (!_.isString(password)) {
337
+ throw new Error('expected string password');
338
+ }
339
+ const lowerName = username.toLowerCase();
340
+ // Calculate the password HMAC so we don't send clear-text passwords
341
+ const hmacPassword = this.calculateHMAC(lowerName, password);
342
+ const authParams = {
343
+ email: lowerName,
344
+ password: hmacPassword,
345
+ forceSMS: !!forceSMS,
346
+ };
347
+ if (otp) {
348
+ authParams.otp = otp;
349
+ if (trust) {
350
+ authParams.trust = 1;
351
+ }
352
+ }
353
+ if (extensible) {
354
+ this._extensionKey = util_1.makeRandomKey();
355
+ authParams.extensible = true;
356
+ authParams.extensionAddress = util_1.getAddressP2PKH(this._extensionKey);
357
+ }
358
+ return authParams;
359
+ }
360
+ /**
361
+ * Fetch useful constant values from the BitGo server.
362
+ * These values do change infrequently, so they need to be fetched,
363
+ * but are unlikely to change during the lifetime of a BitGo object,
364
+ * so they can safely cached.
365
+ */
366
+ async fetchConstants() {
367
+ const env = this.getEnv();
368
+ if (!BitGoAPI._constants) {
369
+ BitGoAPI._constants = {};
370
+ }
371
+ if (!BitGoAPI._constantsExpire) {
372
+ BitGoAPI._constantsExpire = {};
373
+ }
374
+ if (BitGoAPI._constants[env] && BitGoAPI._constantsExpire[env] && new Date() < BitGoAPI._constantsExpire[env]) {
375
+ return BitGoAPI._constants[env];
376
+ }
377
+ // client constants call cannot be authenticated using the normal HMAC validation
378
+ // scheme, so we need to use a raw superagent instance to do this request.
379
+ // Proxy settings must still be respected however
380
+ const resultPromise = superagent.get(this.url('/client/constants'));
381
+ const result = await (this._proxy ? resultPromise.proxy(this._proxy) : resultPromise);
382
+ BitGoAPI._constants[env] = result.body.constants;
383
+ BitGoAPI._constantsExpire[env] = moment.utc().add(result.body.ttl, 'second').toDate();
384
+ return BitGoAPI._constants[env];
385
+ }
386
+ /**
387
+ * Create a url for calling BitGo platform APIs
388
+ * @param path
389
+ * @param version
390
+ */
391
+ url(path, version = 1) {
392
+ const baseUrl = version === 2 ? this._baseApiUrlV2 : this._baseApiUrl;
393
+ return baseUrl + path;
394
+ }
395
+ /**
396
+ * Create a url for calling BitGo microservice APIs
397
+ */
398
+ microservicesUrl(path) {
399
+ return this._baseUrl + path;
400
+ }
401
+ /**
402
+ * Gets the version of the BitGoJS package
403
+ */
404
+ version() {
405
+ return this._version;
406
+ }
407
+ /**
408
+ * Synchronous method for activating an access token.
409
+ */
410
+ authenticateWithAccessToken({ accessToken }) {
411
+ debug('now authenticating with access token %s', accessToken.substring(0, 8));
412
+ this._token = accessToken;
413
+ }
414
+ /**
415
+ * Test connectivity to the server
416
+ * @param params
417
+ */
418
+ ping({ reqId } = {}) {
419
+ if (reqId) {
420
+ this._reqId = reqId;
421
+ }
422
+ return this.get(this.url('/ping')).result();
423
+ }
424
+ /**
425
+ * Set a request tracer to provide request IDs during multi-request workflows
426
+ */
427
+ setRequestTracer(reqTracer) {
428
+ if (reqTracer) {
429
+ this._reqId = reqTracer;
430
+ }
431
+ }
432
+ }
433
+ exports.BitGoAPI = BitGoAPI;
434
+ BitGoAPI._testnetWarningMessage = false;
435
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNEJBQTRCO0FBQzVCLCtCQUFrSDtBQUNsSCxpQ0FBNkI7QUFDN0IseUNBQXlDO0FBQ3pDLDhCQUE4QjtBQUM5QixtQ0FBb0M7QUFFcEMsOENBQTZFO0FBQzdFLGlDQUF3RDtBQUN4RCxvQ0FBb0M7QUFlcEMsaUNBQWtDO0FBQ2xDLHlDQUEwQztBQUUxQyxNQUFNLEtBQUssR0FBRyxlQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFcEMsSUFBSSxDQUFFLE9BQWUsQ0FBQyxPQUFPLEVBQUU7SUFDN0IsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDM0MsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7Q0FDekM7QUFFRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBRTlFLE1BQXNCLFFBQVE7SUFrQjVCLFlBQVksU0FBMEIsRUFBRTtRQVRyQixpQkFBWSxHQUF1RCxDQUFDLENBQUM7UUFDOUUsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBS3pCLGFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBSWpDLElBQ0UsQ0FBQyxpQkFBTSxDQUFDLGNBQWMsQ0FDcEIsTUFBTSxFQUNOLEVBQUUsRUFDRjtZQUNFLGFBQWE7WUFDYixXQUFXO1lBQ1gsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixZQUFZO1lBQ1osNEJBQTRCO1NBQzdCLENBQ0Y7WUFDRCxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUM1RDtZQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztT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LENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxTQUF5QjtRQUN4QyxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQzs7QUEzZkgsNEJBNGZDO0FBemZrQiwrQkFBc0IsR0FBRyxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCaXRHb1JlcXVlc3QsIHNlcmlhbGl6ZVJlcXVlc3REYXRhLCBzZXRSZXF1ZXN0UXVlcnlTdHJpbmcsIHRvQml0Z29SZXF1ZXN0LCB2ZXJpZnlSZXNwb25zZSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyBzdXBlcmFnZW50IGZyb20gJ3N1cGVyYWdlbnQnO1xuaW1wb3J0ICogYXMgdXJsTGliIGZyb20gJ3VybCc7XG5pbXBvcnQgeyBjcmVhdGVIbWFjIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEFsaWFzRW52aXJvbm1lbnRzLCBjb21tb24sIEVudmlyb25tZW50TmFtZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBnZXRBZGRyZXNzUDJQS0gsIG1ha2VSYW5kb21LZXkgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28vc2pjbCc7XG5pbXBvcnQge1xuICBBY2Nlc3NUb2tlbk9wdGlvbnMsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBQaW5nT3B0aW9ucyxcbiAgQXV0aGVudGljYXRlT3B0aW9ucyxcbiAgQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zLFxuICBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnMsXG4gIENhbGN1bGF0ZVJlcXVlc3RIbWFjT3B0aW9ucyxcbiAgUHJvY2Vzc2VkQXV0aGVudGljYXRpb25PcHRpb25zLFxuICBSZXF1ZXN0SGVhZGVycyxcbiAgVmVyaWZ5UmVzcG9uc2VJbmZvLFxuICBWZXJpZnlSZXNwb25zZU9wdGlvbnMsXG4gIEJpdEdvQVBJT3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XG5pbXBvcnQgcGpzb24gPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286YXBpJyk7XG5cbmlmICghKHByb2Nlc3MgYXMgYW55KS5icm93c2VyKSB7XG4gIGRlYnVnKCdlbmFibGluZyBzdXBlcmFnZW50LXByb3h5IHdyYXBwZXInKTtcbiAgcmVxdWlyZSgnc3VwZXJhZ2VudC1wcm94eScpKHN1cGVyYWdlbnQpO1xufVxuXG5jb25zdCBwYXRjaGVkUmVxdWVzdE1ldGhvZHMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWwnLCAncGF0Y2gnXSBhcyBjb25zdDtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJpdEdvQVBJIHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfY29uc3RhbnRzOiBhbnk7XG4gIHByb3RlY3RlZCBzdGF0aWMgX2NvbnN0YW50c0V4cGlyZTogYW55O1xuICBwcm90ZWN0ZWQgc3RhdGljIF90ZXN0bmV0V2FybmluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgcHVibGljIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnROYW1lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VVcmw6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlQXBpVXJsOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFzZUFwaVVybFYyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfZW52OiBFbnZpcm9ubWVudE5hbWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYXV0aFZlcnNpb246IEV4Y2x1ZGU8Qml0R29BUElPcHRpb25zWydhdXRoVmVyc2lvbiddLCB1bmRlZmluZWQ+ID0gMjtcbiAgcHJvdGVjdGVkIF9obWFjVmVyaWZpY2F0aW9uID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wcm94eT86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9leHRlbnNpb25LZXk/OiB1dHhvbGliLkVDUGFpci5FQ1BhaXJJbnRlcmZhY2U7XG4gIHByb3RlY3RlZCBfcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbiAgcHJvdGVjdGVkIF90b2tlbj86IHN0cmluZztcbiAgcHJvdGVjdGVkIF92ZXJzaW9uID0gcGpzb24udmVyc2lvbjtcbiAgcHJvdGVjdGVkIF91c2VyQWdlbnQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBCaXRHb0FQSU9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChcbiAgICAgICFjb21tb24udmFsaWRhdGVQYXJhbXMoXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgW10sXG4gICAgICAgIFtcbiAgICAgICAgICAnYWNjZXNzVG9rZW4nLFxuICAgICAgICAgICd1c2VyQWdlbnQnLFxuICAgICAgICAgICdjdXN0b21Sb290VVJJJyxcbiAgICAgICAgICAnY3VzdG9tQml0Y29pbk5ldHdvcmsnLFxuICAgICAgICAgICdzZXJ2ZXJYcHViJyxcbiAgICAgICAgICAnc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwnLFxuICAgICAgICBdXG4gICAgICApIHx8XG4gICAgICAocGFyYW1zLnVzZVByb2R1Y3Rpb24gJiYgIV8uaXNCb29sZWFuKHBhcmFtcy51c2VQcm9kdWN0aW9uKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIG9wZXJhdGUgb24gdGhlIHRlc3Qgc2VydmVyLlxuICAgIC8vIERlcHJlY2F0ZSB1c2VQcm9kdWN0aW9uIGluIHRoZSBmdXR1cmVcbiAgICBsZXQgZW52OiBFbnZpcm9ubWVudE5hbWU7XG5cbiAgICBpZiAocGFyYW1zLnVzZVByb2R1Y3Rpb24pIHtcbiAgICAgIGlmIChwYXJhbXMuZW52ICYmIHBhcmFtcy5lbnYgIT09ICdwcm9kJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCB1c2UgdXNlUHJvZHVjdGlvbiB3aGVuIGVudj0nICsgcGFyYW1zLmVudik7XG4gICAgICB9XG4gICAgICBlbnYgPSAncHJvZCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhcmFtcy5jdXN0b21Sb290VVJJIHx8XG4gICAgICBwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcmsgfHxcbiAgICAgIHBhcmFtcy5jdXN0b21TaWduaW5nQWRkcmVzcyB8fFxuICAgICAgcGFyYW1zLnNlcnZlclhwdWIgfHxcbiAgICAgIHByb2Nlc3MuZW52LkJJVEdPX0NVU1RPTV9ST09UX1VSSSB8fFxuICAgICAgcHJvY2Vzcy5lbnYuQklUR09fQ1VTVE9NX0JJVENPSU5fTkVUV09SS1xuICAgICkge1xuICAgICAgLy8gZm9yIGJyYW5jaCBkZXBsb3lzLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gc3BlY2lmeSBjdXN0b20gZW5kcG9pbnRzIHdoaWxlIHN0aWxsXG4gICAgICAvLyBtYWludGFpbmluZyB0aGUgbmFtZSBvZiBzcGVjaWZpZWQgdGhlIGVudmlyb25tZW50XG4gICAgICBlbnYgPSBwYXJhbXMuZW52ID09PSAnYnJhbmNoJyA/ICdicmFuY2gnIDogJ2N1c3RvbSc7XG4gICAgICBpZiAocGFyYW1zLmN1c3RvbVJvb3RVUkkpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaSA9IHBhcmFtcy5jdXN0b21Sb290VVJJO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5jdXN0b21CaXRjb2luTmV0d29yaykge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0ubmV0d29yayA9IHBhcmFtcy5jdXN0b21CaXRjb2luTmV0d29yaztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuY3VzdG9tU2lnbmluZ0FkZHJlc3MpIHtcbiAgICAgICAgKGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XSBhcyBhbnkpLmN1c3RvbVNpZ25pbmdBZGRyZXNzID0gcGFyYW1zLmN1c3RvbVNpZ25pbmdBZGRyZXNzO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zZXJ2ZXJYcHViKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5zZXJ2ZXJYcHViID0gcGFyYW1zLnNlcnZlclhwdWI7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnN0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5zdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybCA9IHBhcmFtcy5zdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gcGFyYW1zLmVudiB8fCAocHJvY2Vzcy5lbnYuQklUR09fRU5WIGFzIEVudmlyb25tZW50TmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hdXRoVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9hdXRoVmVyc2lvbiA9IHBhcmFtcy5hdXRoVmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGVudiBpcyBhbiBhbGlhcywgc3dhcCBpdCBvdXQgd2l0aCB0aGUgZXF1aXZhbGVudCBzdXBwb3J0ZWQgZW52aXJvbm1lbnRcbiAgICBpZiAoZW52IGluIEFsaWFzRW52aXJvbm1lbnRzKSB7XG4gICAgICBlbnYgPSBBbGlhc0Vudmlyb25tZW50c1tlbnZdO1xuICAgIH1cblxuICAgIGlmIChlbnYgPT09ICdjdXN0b20nICYmIF8uaXNVbmRlZmluZWQoY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ211c3QgdXNlIC0tY3VzdG9tcm9vdHVyaSBvciBzZXQgdGhlIEJJVEdPX0NVU1RPTV9ST09UX1VSSSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHVzaW5nIHRoZSBjdXN0b20gZW52aXJvbm1lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbnYpIHtcbiAgICAgIGlmIChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0pIHtcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW52aXJvbm1lbnQgJyArIGVudiArICcuIFN1cHBvcnRlZCBlbnZpcm9ubWVudHM6IHByb2QsIHRlc3QsIGRldiwgbGF0ZXN0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9ICd0ZXN0JztcbiAgICAgIGlmICghQml0R29BUEkuX3Rlc3RuZXRXYXJuaW5nTWVzc2FnZSkge1xuICAgICAgICBCaXRHb0FQSS5fdGVzdG5ldFdhcm5pbmdNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ0JpdEdvIFNESyBlbnYgbm90IHNldCAtIGRlZmF1bHRpbmcgdG8gdGVzdCBhdCB0ZXN0LmJpdGdvLmNvbS4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Jhc2VVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpO1xuICAgIH1cbiAgICB0aGlzLl9lbnYgPSB0aGlzLmVudiA9IGVudjtcblxuICAgIGlmIChwYXJhbXMuZXRoZXJzY2FuQXBpVG9rZW4pIHtcbiAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5ldGhlcnNjYW5BcGlUb2tlbiA9IHBhcmFtcy5ldGhlcnNjYW5BcGlUb2tlbjtcbiAgICB9XG5cbiAgICBjb21tb24uc2V0TmV0d29yayhjb21tb24uRW52aXJvbm1lbnRzW2Vudl0ubmV0d29yayk7XG5cbiAgICB0aGlzLl9iYXNlQXBpVXJsID0gdGhpcy5fYmFzZVVybCArICcvYXBpL3YxJztcbiAgICB0aGlzLl9iYXNlQXBpVXJsVjIgPSB0aGlzLl9iYXNlVXJsICsgJy9hcGkvdjInO1xuICAgIHRoaXMuX3Rva2VuID0gcGFyYW1zLmFjY2Vzc1Rva2VuO1xuICAgIHRoaXMuX3VzZXJBZ2VudCA9IHBhcmFtcy51c2VyQWdlbnQgfHwgJ0JpdEdvSlMvJyArIHRoaXMudmVyc2lvbigpO1xuICAgIHRoaXMuX3JlcUlkID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAmJiBwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tbW9uLkVudmlyb25tZW50c1tlbnZdLmhtYWNWZXJpZmljYXRpb25FbmZvcmNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkaXNhYmxlIHJlcXVlc3QgSE1BQyB2ZXJpZmljYXRpb24gaW4gZW52aXJvbm1lbnQgJHt0aGlzLmdldEVudigpfWApO1xuICAgICAgfVxuICAgICAgZGVidWcoJ0hNQUMgdmVyaWZpY2F0aW9uIGV4cGxpY2l0bHkgZGlzYWJsZWQgYnkgY29uc3RydWN0b3Igb3B0aW9uJyk7XG4gICAgICB0aGlzLl9obWFjVmVyaWZpY2F0aW9uID0gcGFyYW1zLmhtYWNWZXJpZmljYXRpb247XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnByb3h5ICYmIHByb2Nlc3MuZW52LkJJVEdPX1VTRV9QUk9YWSkge1xuICAgICAgcGFyYW1zLnByb3h5ID0gcHJvY2Vzcy5lbnYuQklUR09fVVNFX1BST1hZO1xuICAgIH1cblxuICAgIGlmICgocHJvY2VzcyBhcyBhbnkpLmJyb3dzZXIgJiYgcGFyYW1zLnByb3h5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCB1c2UgaHR0cHMgcHJveHkgcGFyYW1zIHdoaWxlIGluIGJyb3dzZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm94eSA9IHBhcmFtcy5wcm94eTtcblxuICAgIC8vIGNhcHR1cmUgb3V0ZXIgc3RhY2sgc28gd2UgaGF2ZSB1c2VmdWwgZGVidWcgaW5mb3JtYXRpb24gaWYgZmV0Y2ggY29uc3RhbnRzIGZhaWxzXG4gICAgY29uc3QgZSA9IG5ldyBFcnJvcigpO1xuXG4gICAgLy8gS2ljayBvZmYgZmlyc3QgbG9hZCBvZiBjb25zdGFudHNcbiAgICB0aGlzLmZldGNoQ29uc3RhbnRzKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBtYWtlIHN1cmUgYW4gZXJyb3IgZG9lcyBub3QgdGVybWluYXRlIHRoZSBlbnRpcmUgc2NyaXB0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBpbml0aWFsIGNsaWVudCBjb25zdGFudHMgZnJvbSBCaXRHbycpO1xuICAgICAgICBkZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQml0R28gZW52aXJvbm1lbnRcbiAgICovXG4gIGdldEVudigpOiBFbnZpcm9ubWVudE5hbWUge1xuICAgIHJldHVybiB0aGlzLl9lbnY7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IGF1dGggdmVyc2lvbiB1c2VkIGZvciByZXF1ZXN0cyB0byB0aGUgQml0R28gc2VydmVyXG4gICAqL1xuICBnZXRBdXRoVmVyc2lvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hdXRoVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgcGF0Y2hpbmcgZnVuY3Rpb24gd2hpY2ggY2FuIGFwcGx5IG91ciBhdXRob3JpemF0aW9uXG4gICAqIGhlYWRlcnMgdG8gYW55IG91dGJvdW5kIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdFBhdGNoKG1ldGhvZDogdHlwZW9mIHBhdGNoZWRSZXF1ZXN0TWV0aG9kc1tudW1iZXJdLCB1cmw6IHN0cmluZykge1xuICAgIGxldCByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QgPSBzdXBlcmFnZW50W21ldGhvZF0odXJsKTtcbiAgICBpZiAodGhpcy5fcHJveHkpIHtcbiAgICAgIGRlYnVnKCdwcm94eWluZyByZXF1ZXN0IHRocm91Z2ggJXMnLCB0aGlzLl9wcm94eSk7XG4gICAgICByZXEgPSByZXEucHJveHkodGhpcy5fcHJveHkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsVGhlbiA9IHJlcS50aGVuLmJpbmQocmVxKTtcbiAgICByZXEudGhlbiA9IChvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkgPT4ge1xuICAgICAgLy8gaW50ZXJjZXB0IGEgcmVxdWVzdCBiZWZvcmUgaXQncyBzdWJtaXR0ZWQgdG8gdGhlIHNlcnZlciBmb3IgdjIgYXV0aGVudGljYXRpb24gKGJhc2VkIG9uIHRva2VuKVxuICAgICAgaWYgKHRoaXMuX3ZlcnNpb24pIHtcbiAgICAgICAgLy8gVE9ETyAtIGRlY2lkZSB3aGVyZSB0byBnZXQgdmVyc2lvblxuICAgICAgICByZXEuc2V0KCdCaXRHby1TREstVmVyc2lvbicsIHRoaXMuX3ZlcnNpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5fcmVxSWQpKSB7XG4gICAgICAgIHJlcS5zZXQoJ1JlcXVlc3QtSUQnLCB0aGlzLl9yZXFJZC50b1N0cmluZygpKTtcblxuICAgICAgICAvLyBpbmNyZW1lbnQgYWZ0ZXIgc2V0dGluZyB0aGUgaGVhZGVyIHNvIHRoZSBzZXF1ZW5jZSBudW1iZXJzIHN0YXJ0IGF0IDBcbiAgICAgICAgdGhpcy5fcmVxSWQuaW5jKCk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCBpZHMgbXVzdCBiZSBzZXQgYmVmb3JlIGVhY2ggcmVxdWVzdCBpbnN0ZWFkIG9mIGJlaW5nIGtlcHRcbiAgICAgICAgLy8gaW5zaWRlIHRoZSBiaXRnbyBvYmplY3QuIFRoaXMgaXMgdG8gcHJldmVudCByZWVudHJhbmN5IGlzc3VlcyB3aGVyZVxuICAgICAgICAvLyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcmVxdWVzdHMgY291bGQgY2F1c2UgaW5jb3JyZWN0IHJlcUlkcyB0byBiZSB1c2VkXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9yZXFJZDtcbiAgICAgIH1cblxuICAgICAgLy8gcHJldmVudCBJRSBmcm9tIGNhY2hpbmcgcmVxdWVzdHNcbiAgICAgIHJlcS5zZXQoJ0lmLU1vZGlmaWVkLVNpbmNlJywgJ01vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UJyk7XG5cbiAgICAgIGlmICghKHByb2Nlc3MgYXMgYW55KS5icm93c2VyICYmIHRoaXMuX3VzZXJBZ2VudCkge1xuICAgICAgICAvLyBJZiBub3QgaW4gdGhlIGJyb3dzZXIsIHNldCB0aGUgVXNlci1BZ2VudC4gQnJvd3NlcnMgZG9uJ3QgYWxsb3dcbiAgICAgICAgLy8gc2V0dGluZyBvZiBVc2VyLUFnZW50LCBzbyB3ZSBtdXN0IGRpc2FibGUgdGhpcyB3aGVuIHJ1biBpbiB0aGVcbiAgICAgICAgLy8gYnJvd3NlciAoYnJvd3NlcmlmeSBzZXRzIHByb2Nlc3MuYnJvd3NlcikuXG4gICAgICAgIHJlcS5zZXQoJ1VzZXItQWdlbnQnLCB0aGlzLl91c2VyQWdlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCB0byBqdXN0IGFib3ZlIDUgbWludXRlcyBieSBkZWZhdWx0XG4gICAgICByZXEudGltZW91dCgocHJvY2Vzcy5lbnYuQklUR09fVElNRU9VVCBhcyBhbnkpICogMTAwMCB8fCAzMDUgKiAxMDAwKTtcblxuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gdG9rZW4sIGFuZCB3ZSdyZSBub3QgbG9nZ2VkIGluLCB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgdjIgYXV0aGVudGljYXRlZFxuICAgICAgcmVxLmlzVjJBdXRoZW50aWNhdGVkID0gdHJ1ZTtcbiAgICAgIHJlcS5hdXRoZW50aWNhdGlvblRva2VuID0gdGhpcy5fdG9rZW47XG4gICAgICAvLyBzb21lIG9mIHRoZSBvbGRlciB0b2tlbnMgYXBwZWFyIHRvIGJlIG9ubHkgNDAgY2hhcmFjdGVycyBsb25nXG4gICAgICBpZiAoKHRoaXMuX3Rva2VuICYmIHRoaXMuX3Rva2VuLmxlbmd0aCAhPT0gNjcgJiYgdGhpcy5fdG9rZW4uaW5kZXhPZigndjJ4JykgIT09IDApIHx8IHJlcS5mb3JjZVYxQXV0aCkge1xuICAgICAgICAvLyB1c2UgdGhlIG9sZCBtZXRob2RcbiAgICAgICAgcmVxLmlzVjJBdXRoZW50aWNhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgcmVxLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIHRoaXMuX3Rva2VuKTtcbiAgICAgICAgZGVidWcoJ3NlbmRpbmcgdjEgJXMgcmVxdWVzdCB0byAlcyB3aXRoIHRva2VuICVzJywgbWV0aG9kLCB1cmwsIHRoaXMuX3Rva2VuPy5zdWJzdHIoMCwgOCkpO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxUaGVuKG9uZnVsZmlsbGVkKS5jYXRjaChvbnJlamVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgcmVxLnNldCgnQml0R28tQXV0aC1WZXJzaW9uJywgdGhpcy5fYXV0aFZlcnNpb24gPT09IDMgPyAnMy4wJyA6ICcyLjAnKTtcblxuICAgICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShyZXEpO1xuICAgICAgICBzZXRSZXF1ZXN0UXVlcnlTdHJpbmcocmVxKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UHJvcGVydGllcyA9IHRoaXMuY2FsY3VsYXRlUmVxdWVzdEhlYWRlcnMoe1xuICAgICAgICAgIHVybDogcmVxLnVybCxcbiAgICAgICAgICB0b2tlbjogdGhpcy5fdG9rZW4sXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHRleHQ6IGRhdGEgfHwgJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXEuc2V0KCdBdXRoLVRpbWVzdGFtcCcsIHJlcXVlc3RQcm9wZXJ0aWVzLnRpbWVzdGFtcC50b1N0cmluZygpKTtcblxuICAgICAgICAvLyB3ZSdyZSBub3Qgc2VuZGluZyB0aGUgYWN0dWFsIHRva2VuLCBidXQgb25seSBpdHMgaGFzaFxuICAgICAgICByZXEuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgcmVxdWVzdFByb3BlcnRpZXMudG9rZW5IYXNoKTtcbiAgICAgICAgZGVidWcoJ3NlbmRpbmcgdjIgJXMgcmVxdWVzdCB0byAlcyB3aXRoIHRva2VuICVzJywgbWV0aG9kLCB1cmwsIHRoaXMuX3Rva2VuPy5zdWJzdHIoMCwgOCkpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgSE1BQ1xuICAgICAgICByZXEuc2V0KCdITUFDJywgcmVxdWVzdFByb3BlcnRpZXMuaG1hYyk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVmVyaWZ5IHRoZSByZXNwb25zZSBiZWZvcmUgY2FsbGluZyB0aGUgb3JpZ2luYWwgb25mdWxmaWxsZWQgaGFuZGxlcixcbiAgICAgICAqIGFuZCBtYWtlIHN1cmUgb25yZWplY3RlZCBpcyBjYWxsZWQgaWYgYSB2ZXJpZmljYXRpb24gZXJyb3IgaXMgZW5jb3VudGVyZWRcbiAgICAgICAqL1xuICAgICAgY29uc3QgbmV3T25GdWxmaWxsZWQgPSBvbmZ1bGZpbGxlZFxuICAgICAgICA/IChyZXNwb25zZTogc3VwZXJhZ2VudC5SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gSE1BQyB2ZXJpZmljYXRpb24gaXMgb25seSBhbGxvd2VkIHRvIGJlIHNraXBwZWQgaW4gY2VydGFpbiBlbnZpcm9ubWVudHMuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGNoZWNrZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgY2hlY2tpbmcgaXQgYWdhaW4gYXQgcmVxdWVzdCB0aW1lXG4gICAgICAgICAgICAvLyB3aWxsIGhlbHAgcHJldmVudCBhZ2FpbnN0IHRhbXBlcmluZyBvZiB0aGlzIHByb3BlcnR5IGFmdGVyIHRoZSBvYmplY3QgaXMgY3JlYXRlZFxuICAgICAgICAgICAgaWYgKCF0aGlzLl9obWFjVmVyaWZpY2F0aW9uICYmICFjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLmhtYWNWZXJpZmljYXRpb25FbmZvcmNlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gb25mdWxmaWxsZWQocmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2ZXJpZmllZFJlc3BvbnNlID0gdmVyaWZ5UmVzcG9uc2UodGhpcywgdGhpcy5fdG9rZW4sIG1ldGhvZCwgcmVxLCByZXNwb25zZSk7XG4gICAgICAgICAgICByZXR1cm4gb25mdWxmaWxsZWQodmVyaWZpZWRSZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgICByZXR1cm4gb3JpZ2luYWxUaGVuKG5ld09uRnVsZmlsbGVkKS5jYXRjaChvbnJlamVjdGVkKTtcbiAgICB9O1xuICAgIHJldHVybiB0b0JpdGdvUmVxdWVzdChyZXEpO1xuICB9XG5cbiAgZ2V0KHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ2dldCcsIHVybCk7XG4gIH1cbiAgcG9zdCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdwb3N0JywgdXJsKTtcbiAgfVxuICBwdXQodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgncHV0JywgdXJsKTtcbiAgfVxuICBkZWwodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgnZGVsJywgdXJsKTtcbiAgfVxuICBwYXRjaCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdwYXRjaCcsIHVybCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBITUFDIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBtZXNzYWdlXG4gICAqIEBwYXJhbSBrZXkge1N0cmluZ30gLSB0aGUga2V5IHRvIHVzZSBmb3IgdGhlIEhNQUNcbiAgICogQHBhcmFtIG1lc3NhZ2Uge1N0cmluZ30gLSB0aGUgYWN0dWFsIG1lc3NhZ2UgdG8gSE1BQ1xuICAgKiBAcmV0dXJucyB7Kn0gLSB0aGUgcmVzdWx0IG9mIHRoZSBITUFDIG9wZXJhdGlvblxuICAgKi9cbiAgY2FsY3VsYXRlSE1BQyhrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY3JlYXRlSG1hYygnc2hhMjU2Jywga2V5KS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIHN1YmplY3Qgc3RyaW5nIHRoYXQgaXMgdG8gYmUgSE1BQydlZCBmb3IgYSBIVFRQIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAgICogQHBhcmFtIHVybFBhdGggcmVxdWVzdCB1cmwsIGluY2x1ZGluZyBxdWVyeSBwYXJhbXNcbiAgICogQHBhcmFtIHRleHQgcmVxdWVzdCBib2R5IHRleHRcbiAgICogQHBhcmFtIHRpbWVzdGFtcCByZXF1ZXN0IHRpbWVzdGFtcCBmcm9tIGBEYXRlLm5vdygpYFxuICAgKiBAcGFyYW0gc3RhdHVzQ29kZSBPbmx5IHNldCBmb3IgSFRUUCByZXNwb25zZXMsIGxlYXZlIGJsYW5rIGZvciByZXF1ZXN0c1xuICAgKiBAcGFyYW0gbWV0aG9kIHJlcXVlc3QgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjYWxjdWxhdGVITUFDU3ViamVjdCh7IHVybFBhdGgsIHRleHQsIHRpbWVzdGFtcCwgc3RhdHVzQ29kZSwgbWV0aG9kIH06IENhbGN1bGF0ZUhtYWNTdWJqZWN0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsRGV0YWlscyA9IHVybExpYi5wYXJzZSh1cmxQYXRoKTtcbiAgICBjb25zdCBxdWVyeVBhdGggPSB1cmxEZXRhaWxzLnF1ZXJ5ICYmIHVybERldGFpbHMucXVlcnkubGVuZ3RoID4gMCA/IHVybERldGFpbHMucGF0aCA6IHVybERldGFpbHMucGF0aG5hbWU7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHN0YXR1c0NvZGUpICYmIF8uaXNJbnRlZ2VyKHN0YXR1c0NvZGUpICYmIF8uaXNGaW5pdGUoc3RhdHVzQ29kZSkpIHtcbiAgICAgIGlmICh0aGlzLl9hdXRoVmVyc2lvbiA9PT0gMykge1xuICAgICAgICByZXR1cm4gW21ldGhvZC50b1VwcGVyQ2FzZSgpLCB0aW1lc3RhbXAsIHF1ZXJ5UGF0aCwgc3RhdHVzQ29kZSwgdGV4dF0uam9pbignfCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFt0aW1lc3RhbXAsIHF1ZXJ5UGF0aCwgc3RhdHVzQ29kZSwgdGV4dF0uam9pbignfCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYXV0aFZlcnNpb24gPT09IDMpIHtcbiAgICAgIHJldHVybiBbbWV0aG9kLnRvVXBwZXJDYXNlKCksIHRpbWVzdGFtcCwgJzMuMCcsIHF1ZXJ5UGF0aCwgdGV4dF0uam9pbignfCcpO1xuICAgIH1cbiAgICByZXR1cm4gW3RpbWVzdGFtcCwgcXVlcnlQYXRoLCB0ZXh0XS5qb2luKCd8Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBITUFDIGZvciBhbiBIVFRQIHJlcXVlc3RcbiAgICovXG4gIGNhbGN1bGF0ZVJlcXVlc3RITUFDKHsgdXJsOiB1cmxQYXRoLCB0ZXh0LCB0aW1lc3RhbXAsIHRva2VuLCBtZXRob2QgfTogQ2FsY3VsYXRlUmVxdWVzdEhtYWNPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaWduYXR1cmVTdWJqZWN0ID0gdGhpcy5jYWxjdWxhdGVITUFDU3ViamVjdCh7IHVybFBhdGgsIHRleHQsIHRpbWVzdGFtcCwgbWV0aG9kIH0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBITUFDXG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlSE1BQyh0b2tlbiwgc2lnbmF0dXJlU3ViamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHJlcXVlc3QgaGVhZGVycyB3aXRoIEhNQUNcbiAgICovXG4gIGNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHsgdXJsLCB0ZXh0LCB0b2tlbiwgbWV0aG9kIH06IENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzT3B0aW9ucyk6IFJlcXVlc3RIZWFkZXJzIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGhtYWMgPSB0aGlzLmNhbGN1bGF0ZVJlcXVlc3RITUFDKHsgdXJsLCB0ZXh0LCB0aW1lc3RhbXAsIHRva2VuLCBtZXRob2QgfSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIFNIQTI1NiBoYXNoIG9mIHRoZSB0b2tlblxuICAgIGNvbnN0IGhhc2hEaWdlc3QgPSBzamNsLmhhc2guc2hhMjU2Lmhhc2godG9rZW4pO1xuICAgIGNvbnN0IHRva2VuSGFzaCA9IHNqY2wuY29kZWMuaGV4LmZyb21CaXRzKGhhc2hEaWdlc3QpO1xuICAgIHJldHVybiB7XG4gICAgICBobWFjLFxuICAgICAgdGltZXN0YW1wLFxuICAgICAgdG9rZW5IYXNoLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBITUFDIGZvciBhbiBIVFRQIHJlc3BvbnNlXG4gICAqL1xuICB2ZXJpZnlSZXNwb25zZSh7XG4gICAgdXJsOiB1cmxQYXRoLFxuICAgIHN0YXR1c0NvZGUsXG4gICAgdGV4dCxcbiAgICB0aW1lc3RhbXAsXG4gICAgdG9rZW4sXG4gICAgaG1hYyxcbiAgICBtZXRob2QsXG4gIH06IFZlcmlmeVJlc3BvbnNlT3B0aW9ucyk6IFZlcmlmeVJlc3BvbnNlSW5mbyB7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3ViamVjdCA9IHRoaXMuY2FsY3VsYXRlSE1BQ1N1YmplY3Qoe1xuICAgICAgdXJsUGF0aCxcbiAgICAgIHRleHQsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBzdGF0dXNDb2RlLFxuICAgICAgbWV0aG9kLFxuICAgIH0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBITUFDXG4gICAgY29uc3QgZXhwZWN0ZWRIbWFjID0gdGhpcy5jYWxjdWxhdGVITUFDKHRva2VuLCBzaWduYXR1cmVTdWJqZWN0KTtcblxuICAgIC8vIGRldGVybWluZSBpZiB0aGUgcmVzcG9uc2UgaXMgc3RpbGwgd2l0aGluIHRoZSB2YWxpZGl0eSB3aW5kb3cgKDUgbWludXRlIHdpbmRvdylcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93ID0gdGltZXN0YW1wID49IG5vdyAtIDEwMDAgKiA2MCAqIDUgJiYgdGltZXN0YW1wIDw9IG5vdztcblxuICAgIC8vIHZlcmlmeSB0aGUgSE1BQyBhbmQgdGltZXN0YW1wXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGV4cGVjdGVkSG1hYyA9PT0gaG1hYyxcbiAgICAgIGV4cGVjdGVkSG1hYyxcbiAgICAgIHNpZ25hdHVyZVN1YmplY3QsXG4gICAgICBpc0luUmVzcG9uc2VWYWxpZGl0eVdpbmRvdyxcbiAgICAgIHZlcmlmaWNhdGlvblRpbWU6IG5vdyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIHVzZXJuYW1lLCBwYXNzd29yZCBhbmQgb3RwIGludG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIGFuZCBoYXNoZWQgcGFzc3dvcmQsIHJlYWR5IHRvXG4gICAqIHNlbmQgdG8gYml0Z28gZm9yIGF1dGhlbnRpY2F0aW9uLlxuICAgKi9cbiAgcHJlcHJvY2Vzc0F1dGhlbnRpY2F0aW9uUGFyYW1zKHtcbiAgICB1c2VybmFtZSxcbiAgICBwYXNzd29yZCxcbiAgICBvdHAsXG4gICAgZm9yY2VTTVMsXG4gICAgZXh0ZW5zaWJsZSxcbiAgICB0cnVzdCxcbiAgfTogQXV0aGVudGljYXRlT3B0aW9ucyk6IFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHVzZXJuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgdXNlcm5hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvd2VyTmFtZSA9IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwYXNzd29yZCBITUFDIHNvIHdlIGRvbid0IHNlbmQgY2xlYXItdGV4dCBwYXNzd29yZHNcbiAgICBjb25zdCBobWFjUGFzc3dvcmQgPSB0aGlzLmNhbGN1bGF0ZUhNQUMobG93ZXJOYW1lLCBwYXNzd29yZCk7XG5cbiAgICBjb25zdCBhdXRoUGFyYW1zOiBQcm9jZXNzZWRBdXRoZW50aWNhdGlvbk9wdGlvbnMgPSB7XG4gICAgICBlbWFpbDogbG93ZXJOYW1lLFxuICAgICAgcGFzc3dvcmQ6IGhtYWNQYXNzd29yZCxcbiAgICAgIGZvcmNlU01TOiAhIWZvcmNlU01TLFxuICAgIH07XG5cbiAgICBpZiAob3RwKSB7XG4gICAgICBhdXRoUGFyYW1zLm90cCA9IG90cDtcbiAgICAgIGlmICh0cnVzdCkge1xuICAgICAgICBhdXRoUGFyYW1zLnRydXN0ID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0ZW5zaWJsZSkge1xuICAgICAgdGhpcy5fZXh0ZW5zaW9uS2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgYXV0aFBhcmFtcy5leHRlbnNpYmxlID0gdHJ1ZTtcbiAgICAgIGF1dGhQYXJhbXMuZXh0ZW5zaW9uQWRkcmVzcyA9IGdldEFkZHJlc3NQMlBLSCh0aGlzLl9leHRlbnNpb25LZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHVzZWZ1bCBjb25zdGFudCB2YWx1ZXMgZnJvbSB0aGUgQml0R28gc2VydmVyLlxuICAgKiBUaGVzZSB2YWx1ZXMgZG8gY2hhbmdlIGluZnJlcXVlbnRseSwgc28gdGhleSBuZWVkIHRvIGJlIGZldGNoZWQsXG4gICAqIGJ1dCBhcmUgdW5saWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYSBCaXRHbyBvYmplY3QsXG4gICAqIHNvIHRoZXkgY2FuIHNhZmVseSBjYWNoZWQuXG4gICAqL1xuICBhc3luYyBmZXRjaENvbnN0YW50cygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGVudiA9IHRoaXMuZ2V0RW52KCk7XG5cbiAgICBpZiAoIUJpdEdvQVBJLl9jb25zdGFudHMpIHtcbiAgICAgIEJpdEdvQVBJLl9jb25zdGFudHMgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlKSB7XG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlID0ge307XG4gICAgfVxuXG4gICAgaWYgKEJpdEdvQVBJLl9jb25zdGFudHNbZW52XSAmJiBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0gJiYgbmV3IERhdGUoKSA8IEJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmVbZW52XSkge1xuICAgICAgcmV0dXJuIEJpdEdvQVBJLl9jb25zdGFudHNbZW52XTtcbiAgICB9XG5cbiAgICAvLyBjbGllbnQgY29uc3RhbnRzIGNhbGwgY2Fubm90IGJlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIG5vcm1hbCBITUFDIHZhbGlkYXRpb25cbiAgICAvLyBzY2hlbWUsIHNvIHdlIG5lZWQgdG8gdXNlIGEgcmF3IHN1cGVyYWdlbnQgaW5zdGFuY2UgdG8gZG8gdGhpcyByZXF1ZXN0LlxuICAgIC8vIFByb3h5IHNldHRpbmdzIG11c3Qgc3RpbGwgYmUgcmVzcGVjdGVkIGhvd2V2ZXJcbiAgICBjb25zdCByZXN1bHRQcm9taXNlID0gc3VwZXJhZ2VudC5nZXQodGhpcy51cmwoJy9jbGllbnQvY29uc3RhbnRzJykpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICh0aGlzLl9wcm94eSA/IHJlc3VsdFByb21pc2UucHJveHkodGhpcy5fcHJveHkpIDogcmVzdWx0UHJvbWlzZSk7XG4gICAgQml0R29BUEkuX2NvbnN0YW50c1tlbnZdID0gcmVzdWx0LmJvZHkuY29uc3RhbnRzO1xuXG4gICAgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdID0gbW9tZW50LnV0YygpLmFkZChyZXN1bHQuYm9keS50dGwsICdzZWNvbmQnKS50b0RhdGUoKTtcbiAgICByZXR1cm4gQml0R29BUEkuX2NvbnN0YW50c1tlbnZdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHVybCBmb3IgY2FsbGluZyBCaXRHbyBwbGF0Zm9ybSBBUElzXG4gICAqIEBwYXJhbSBwYXRoXG4gICAqIEBwYXJhbSB2ZXJzaW9uXG4gICAqL1xuICB1cmwocGF0aDogc3RyaW5nLCB2ZXJzaW9uID0gMSk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZVVybCA9IHZlcnNpb24gPT09IDIgPyB0aGlzLl9iYXNlQXBpVXJsVjIgOiB0aGlzLl9iYXNlQXBpVXJsO1xuICAgIHJldHVybiBiYXNlVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB1cmwgZm9yIGNhbGxpbmcgQml0R28gbWljcm9zZXJ2aWNlIEFQSXNcbiAgICovXG4gIG1pY3Jvc2VydmljZXNVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYmFzZVVybCArIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgQml0R29KUyBwYWNrYWdlXG4gICAqL1xuICB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgbWV0aG9kIGZvciBhY3RpdmF0aW5nIGFuIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZVdpdGhBY2Nlc3NUb2tlbih7IGFjY2Vzc1Rva2VuIH06IEFjY2Vzc1Rva2VuT3B0aW9ucyk6IHZvaWQge1xuICAgIGRlYnVnKCdub3cgYXV0aGVudGljYXRpbmcgd2l0aCBhY2Nlc3MgdG9rZW4gJXMnLCBhY2Nlc3NUb2tlbi5zdWJzdHJpbmcoMCwgOCkpO1xuICAgIHRoaXMuX3Rva2VuID0gYWNjZXNzVG9rZW47XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBjb25uZWN0aXZpdHkgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBwaW5nKHsgcmVxSWQgfTogUGluZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHJlcUlkKSB7XG4gICAgICB0aGlzLl9yZXFJZCA9IHJlcUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3BpbmcnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcmVxdWVzdCB0cmFjZXIgdG8gcHJvdmlkZSByZXF1ZXN0IElEcyBkdXJpbmcgbXVsdGktcmVxdWVzdCB3b3JrZmxvd3NcbiAgICovXG4gIHNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyOiBJUmVxdWVzdFRyYWNlcik6IHZvaWQge1xuICAgIGlmIChyZXFUcmFjZXIpIHtcbiAgICAgIHRoaXMuX3JlcUlkID0gcmVxVHJhY2VyO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ export * from './api';
2
+ export * from './bitgoAPI';
3
+ export * from './util';
4
+ export * from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./api"), exports);
14
+ __exportStar(require("./bitgoAPI"), exports);
15
+ __exportStar(require("./util"), exports);
16
+ __exportStar(require("./types"), exports);
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsd0NBQXNCO0FBQ3RCLDZDQUEyQjtBQUMzQix5Q0FBdUI7QUFDdkIsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9iaXRnb0FQSSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXX0=
@@ -0,0 +1,95 @@
1
+ import { BitGoJsError, EnvironmentName, V1Network } from '@bitgo/sdk-core';
2
+ export interface BitGoAPIOptions {
3
+ accessToken?: string;
4
+ authVersion?: 2 | 3;
5
+ customBitcoinNetwork?: V1Network;
6
+ customRootURI?: string;
7
+ customSigningAddress?: string;
8
+ env?: EnvironmentName;
9
+ etherscanApiToken?: string;
10
+ hmacVerification?: boolean;
11
+ proxy?: string;
12
+ serverXpub?: string;
13
+ stellarFederationServerUrl?: string;
14
+ useProduction?: boolean;
15
+ userAgent?: string;
16
+ }
17
+ export interface IRequestTracer {
18
+ inc(): void;
19
+ toString(): string;
20
+ }
21
+ export interface AccessTokenOptions {
22
+ accessToken: string;
23
+ }
24
+ export interface PingOptions {
25
+ reqId?: IRequestTracer;
26
+ }
27
+ export declare const supportedRequestMethods: readonly ["get", "post", "put", "del", "patch"];
28
+ export interface CalculateHmacSubjectOptions {
29
+ urlPath: string;
30
+ text: string;
31
+ timestamp: number;
32
+ method: typeof supportedRequestMethods[number];
33
+ statusCode?: number;
34
+ }
35
+ export interface CalculateRequestHmacOptions {
36
+ url: string;
37
+ text: string;
38
+ timestamp: number;
39
+ token: string;
40
+ method: typeof supportedRequestMethods[number];
41
+ }
42
+ export interface RequestHeaders {
43
+ hmac: string;
44
+ timestamp: number;
45
+ tokenHash: string;
46
+ }
47
+ export interface CalculateRequestHeadersOptions {
48
+ url: string;
49
+ text: string;
50
+ token: string;
51
+ method: typeof supportedRequestMethods[number];
52
+ }
53
+ export interface VerifyResponseOptions extends CalculateRequestHeadersOptions {
54
+ hmac: string;
55
+ url: string;
56
+ text: string;
57
+ timestamp: number;
58
+ method: typeof supportedRequestMethods[number];
59
+ statusCode?: number;
60
+ }
61
+ export interface VerifyResponseInfo {
62
+ isValid: boolean;
63
+ expectedHmac: string;
64
+ signatureSubject: string;
65
+ isInResponseValidityWindow: boolean;
66
+ verificationTime: number;
67
+ }
68
+ export interface AuthenticateOptions {
69
+ username: string;
70
+ password: string;
71
+ otp?: string;
72
+ trust?: number;
73
+ forceSMS?: boolean;
74
+ extensible?: boolean;
75
+ forceV1Auth?: boolean;
76
+ }
77
+ export interface ProcessedAuthenticationOptions {
78
+ email: string;
79
+ password: string;
80
+ forceSMS: boolean;
81
+ otp?: string;
82
+ trust?: number;
83
+ extensible?: boolean;
84
+ extensionAddress?: string;
85
+ forceV1Auth?: boolean;
86
+ }
87
+ export declare class ApiResponseError<ResponseBodyType = any> extends BitGoJsError {
88
+ message: string;
89
+ status: number;
90
+ result?: ResponseBodyType;
91
+ invalidToken?: boolean;
92
+ needsOTP?: boolean;
93
+ constructor(message: string, status: number, result?: ResponseBodyType, invalidToken?: boolean, needsOTP?: boolean);
94
+ }
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}