@bitgo/abstract-utxo 1.3.0-dev.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +126 -0
- package/dist/src/abstractUtxoCoin.d.ts +31 -38
- package/dist/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/src/abstractUtxoCoin.js +33 -29
- package/dist/src/config.d.ts +1 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +6 -5
- package/dist/src/recovery/RecoveryProvider.d.ts +1 -0
- package/dist/src/recovery/RecoveryProvider.d.ts.map +1 -1
- package/dist/src/recovery/RecoveryProvider.js +2 -1
- package/dist/src/recovery/backupKeyRecovery.d.ts +9 -9
- package/dist/src/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/src/recovery/backupKeyRecovery.js +36 -19
- package/dist/src/recovery/crossChainRecovery.d.ts +9 -8
- package/dist/src/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/src/recovery/crossChainRecovery.js +40 -22
- package/dist/src/recovery/smartbitApi.d.ts +1 -1
- package/dist/src/recovery/smartbitApi.d.ts.map +1 -1
- package/dist/src/recovery/smartbitApi.js +1 -1
- package/dist/src/replayProtection.d.ts +1 -4
- package/dist/src/replayProtection.d.ts.map +1 -1
- package/dist/src/replayProtection.js +1 -1
- package/dist/src/sign.d.ts +9 -9
- package/dist/src/sign.d.ts.map +1 -1
- package/dist/src/sign.js +1 -1
- package/dist/tsconfig.tsbuildinfo +3513 -2700
- package/package.json +10 -9
package/dist/src/config.d.ts
CHANGED
package/dist/src/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,6BAA6B
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,6BAA6B;;;;;;CAMzC,CAAC"}
|
package/dist/src/config.js
CHANGED
|
@@ -4,9 +4,10 @@ exports.supportedCrossChainRecoveries = void 0;
|
|
|
4
4
|
// Supported cross-chain recovery routes. The coin to be recovered is the index, the valid coins for recipient wallets
|
|
5
5
|
// are listed in the array.
|
|
6
6
|
exports.supportedCrossChainRecoveries = {
|
|
7
|
-
btc: ['bch', 'ltc', 'bsv'],
|
|
8
|
-
bch: ['btc', 'ltc', 'bsv'],
|
|
9
|
-
ltc: ['btc', 'bch', 'bsv'],
|
|
10
|
-
bsv: ['btc', 'ltc', 'bch'],
|
|
7
|
+
btc: ['bch', 'ltc', 'bsv', 'doge'],
|
|
8
|
+
bch: ['btc', 'ltc', 'bsv', 'doge'],
|
|
9
|
+
ltc: ['btc', 'bch', 'bsv', 'doge'],
|
|
10
|
+
bsv: ['btc', 'ltc', 'bch', 'doge'],
|
|
11
|
+
doge: ['btc', 'bch', 'ltc', 'bsv'],
|
|
11
12
|
};
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzSEFBc0g7QUFDdEgsMkJBQTJCO0FBQ2QsUUFBQSw2QkFBNkIsR0FBRztJQUMzQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDbEMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2xDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQztJQUNsQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDbEMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0NBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTdXBwb3J0ZWQgY3Jvc3MtY2hhaW4gcmVjb3Zlcnkgcm91dGVzLiBUaGUgY29pbiB0byBiZSByZWNvdmVyZWQgaXMgdGhlIGluZGV4LCB0aGUgdmFsaWQgY29pbnMgZm9yIHJlY2lwaWVudCB3YWxsZXRzXG4vLyBhcmUgbGlzdGVkIGluIHRoZSBhcnJheS5cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcmllcyA9IHtcbiAgYnRjOiBbJ2JjaCcsICdsdGMnLCAnYnN2JywgJ2RvZ2UnXSxcbiAgYmNoOiBbJ2J0YycsICdsdGMnLCAnYnN2JywgJ2RvZ2UnXSxcbiAgbHRjOiBbJ2J0YycsICdiY2gnLCAnYnN2JywgJ2RvZ2UnXSxcbiAgYnN2OiBbJ2J0YycsICdsdGMnLCAnYmNoJywgJ2RvZ2UnXSxcbiAgZG9nZTogWydidGMnLCAnYmNoJywgJ2x0YycsICdic3YnXSxcbn07XG4iXX0=
|
|
@@ -14,6 +14,7 @@ export interface RecoveryAccountData {
|
|
|
14
14
|
export interface RecoveryProvider {
|
|
15
15
|
getUnspentsForAddresses(addresses: string[]): Promise<Unspent[]>;
|
|
16
16
|
getAddressInfo(address: string): Promise<AddressInfo>;
|
|
17
|
+
getTransactionHex(txid: string): Promise<string>;
|
|
17
18
|
}
|
|
18
19
|
export declare function forCoin(coinName: string, apiToken?: string): RecoveryProvider;
|
|
19
20
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,aAAK,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAI7B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,aAAK,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAI7B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAiB7E"}
|
|
@@ -13,6 +13,7 @@ function forCoin(coinName, apiToken) {
|
|
|
13
13
|
case 'bsv':
|
|
14
14
|
case 'btg':
|
|
15
15
|
case 'dash':
|
|
16
|
+
case 'doge':
|
|
16
17
|
case 'ltc':
|
|
17
18
|
case 'zec':
|
|
18
19
|
return blockapis_1.BlockchairApi.forCoin(coinName, { apiToken });
|
|
@@ -20,4 +21,4 @@ function forCoin(coinName, apiToken) {
|
|
|
20
21
|
throw new baseApi_1.ApiNotImplementedError(coinName);
|
|
21
22
|
}
|
|
22
23
|
exports.forCoin = forCoin;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3ZlcnlQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWNvdmVyeS9SZWNvdmVyeVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUE4RTtBQUk5RSx1Q0FBbUQ7QUFtQm5ELFNBQWdCLE9BQU8sQ0FBQyxRQUFnQixFQUFFLFFBQWlCO0lBQ3pELFFBQVEsUUFBUSxFQUFFO1FBQ2hCLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxNQUFNO1lBQ1QsT0FBTywwQkFBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssS0FBSztZQUNSLE9BQU8seUJBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUN4RDtJQUVELE1BQU0sSUFBSSxnQ0FBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBakJELDBCQWlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkZHJlc3NJbmZvLCBCbG9ja2NoYWlyQXBpLCBCbG9ja3N0cmVhbUFwaSB9IGZyb20gJ0BiaXRnby9ibG9ja2FwaXMnO1xuaW1wb3J0IHsgYml0Z28gfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xudHlwZSBVbnNwZW50ID0gYml0Z28uVW5zcGVudDtcblxuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4vYmFzZUFwaSc7XG5cbi8qKlxuICogQW4gYWNjb3VudCB3aXRoIGJlYXIgbWluaW11bSBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgcmVjb3Zlcmllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyeUFjY291bnREYXRhIHtcbiAgdHhDb3VudDogbnVtYmVyO1xuICB0b3RhbEJhbGFuY2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBBZGRyZXNzQXBpICYgVXR4b0FwaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5UHJvdmlkZXIge1xuICBnZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVbnNwZW50W10+O1xuICBnZXRBZGRyZXNzSW5mbyhhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPEFkZHJlc3NJbmZvPjtcbiAgZ2V0VHJhbnNhY3Rpb25IZXgodHhpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yQ29pbihjb2luTmFtZTogc3RyaW5nLCBhcGlUb2tlbj86IHN0cmluZyk6IFJlY292ZXJ5UHJvdmlkZXIge1xuICBzd2l0Y2ggKGNvaW5OYW1lKSB7XG4gICAgY2FzZSAnYnRjJzpcbiAgICBjYXNlICd0YnRjJzpcbiAgICAgIHJldHVybiBCbG9ja3N0cmVhbUFwaS5mb3JDb2luKGNvaW5OYW1lKTtcbiAgICBjYXNlICdiY2gnOlxuICAgIGNhc2UgJ2JjaGEnOlxuICAgIGNhc2UgJ2Jzdic6XG4gICAgY2FzZSAnYnRnJzpcbiAgICBjYXNlICdkYXNoJzpcbiAgICBjYXNlICdkb2dlJzpcbiAgICBjYXNlICdsdGMnOlxuICAgIGNhc2UgJ3plYyc6XG4gICAgICByZXR1cm4gQmxvY2tjaGFpckFwaS5mb3JDb2luKGNvaW5OYW1lLCB7IGFwaVRva2VuIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEFwaU5vdEltcGxlbWVudGVkRXJyb3IoY29pbk5hbWUpO1xufVxuIl19
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* @prettier
|
|
3
3
|
*/
|
|
4
4
|
import * as utxolib from '@bitgo/utxo-lib';
|
|
5
|
-
declare type WalletUnspent = utxolib.bitgo.WalletUnspent
|
|
5
|
+
declare type WalletUnspent<TNumber extends number | bigint = number> = utxolib.bitgo.WalletUnspent<TNumber>;
|
|
6
6
|
declare type ScriptType2Of3 = utxolib.bitgo.outputScripts.ScriptType2Of3;
|
|
7
7
|
import { BitGoBase } from '@bitgo/sdk-core';
|
|
8
8
|
import { AbstractUtxoCoin } from '../abstractUtxoCoin';
|
|
9
9
|
import { RecoveryProvider } from './RecoveryProvider';
|
|
10
|
-
export interface OfflineVaultTxInfo {
|
|
11
|
-
inputs: WalletUnspent[];
|
|
10
|
+
export interface OfflineVaultTxInfo<TNumber extends number | bigint = number> {
|
|
11
|
+
inputs: WalletUnspent<TNumber>[];
|
|
12
12
|
}
|
|
13
|
-
export interface FormattedOfflineVaultTxInfo {
|
|
13
|
+
export interface FormattedOfflineVaultTxInfo<TNumber extends number | bigint = number> {
|
|
14
14
|
txInfo: {
|
|
15
|
-
unspents: WalletUnspent[];
|
|
15
|
+
unspents: WalletUnspent<TNumber>[];
|
|
16
16
|
};
|
|
17
17
|
txHex: string;
|
|
18
18
|
feeInfo: Record<string, never>;
|
|
@@ -31,12 +31,12 @@ export interface RecoverParams {
|
|
|
31
31
|
userKeyPath?: string;
|
|
32
32
|
recoveryProvider?: RecoveryProvider;
|
|
33
33
|
}
|
|
34
|
-
export declare type BackupKeyRecoveryTransansaction = {
|
|
35
|
-
inputs: WalletUnspent[];
|
|
34
|
+
export declare type BackupKeyRecoveryTransansaction<TNumber extends number | bigint = number> = {
|
|
35
|
+
inputs: WalletUnspent<TNumber>[];
|
|
36
36
|
transactionHex: string;
|
|
37
37
|
coin: string;
|
|
38
38
|
backupKey: string;
|
|
39
|
-
recoveryAmount:
|
|
39
|
+
recoveryAmount: TNumber;
|
|
40
40
|
tx?: unknown;
|
|
41
41
|
};
|
|
42
42
|
/**
|
|
@@ -54,6 +54,6 @@ export declare type BackupKeyRecoveryTransansaction = {
|
|
|
54
54
|
* - ignoreAddressTypes: (optional) scripts to ignore
|
|
55
55
|
* for example: ['p2shP2wsh', 'p2wsh'] will prevent code from checking for wrapped-segwit and native-segwit chains on the public block explorers
|
|
56
56
|
*/
|
|
57
|
-
export declare function backupKeyRecovery(coin: AbstractUtxoCoin, bitgo: BitGoBase, params: RecoverParams): Promise<BackupKeyRecoveryTransansaction | FormattedOfflineVaultTxInfo
|
|
57
|
+
export declare function backupKeyRecovery<TNumber extends number | bigint = number>(coin: AbstractUtxoCoin, bitgo: BitGoBase, params: RecoverParams): Promise<BackupKeyRecoveryTransansaction<TNumber> | FormattedOfflineVaultTxInfo<TNumber>>;
|
|
58
58
|
export {};
|
|
59
59
|
//# sourceMappingURL=backupKeyRecovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backupKeyRecovery.d.ts","sourceRoot":"","sources":["../../../src/recovery/backupKeyRecovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAY3C,aAAK,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"backupKeyRecovery.d.ts","sourceRoot":"","sources":["../../../src/recovery/backupKeyRecovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAY3C,aAAK,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACpG,aAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC;AAIjE,OAAO,EACL,SAAS,EAQV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAW,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAO/D,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IAC1E,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IACnF,MAAM,EAAE;QACN,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;KACpC,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAgED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,cAAc,EAAE,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AA8FD,oBAAY,+BAA+B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI;IACtF,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IAExB,EAAE,CAAC,EAAE,OAAO,CAAC;CACd,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAC9E,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,+BAA+B,CAAC,OAAO,CAAC,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAuL1F"}
|
|
@@ -51,7 +51,6 @@ async function getRecoveryMarketPrice(coin) {
|
|
|
51
51
|
* @param coin
|
|
52
52
|
* @param params
|
|
53
53
|
* @param params.provider {String} the KRS provider that holds the backup key
|
|
54
|
-
* @param params.amount {Number} amount (in base units) to be recovered
|
|
55
54
|
* @returns {*}
|
|
56
55
|
*/
|
|
57
56
|
async function calculateFeeAmount(coin, params) {
|
|
@@ -87,11 +86,33 @@ async function queryBlockchainUnspentsPath(coin, params, walletKeys, chain) {
|
|
|
87
86
|
if (addrInfo.balance > 0) {
|
|
88
87
|
console.log(`Found an address with balance: ${address.address} with balance ${addrInfo.balance}`);
|
|
89
88
|
const addressUnspents = await recoveryProvider.getUnspentsForAddresses([address.address]);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
const processedUnspents = await Promise.all(addressUnspents.map(async (u) => {
|
|
90
|
+
if (coin.amountType === 'bigint') {
|
|
91
|
+
// blockchair returns the number with the correct precision, but in number format
|
|
92
|
+
// json parse won't parse it correctly, so we requery the txid for the tx hex to decode here
|
|
93
|
+
let val = BigInt(u.value);
|
|
94
|
+
if (!Number.isSafeInteger(u.value)) {
|
|
95
|
+
const { txid, vout } = utxolib.bitgo.parseOutputId(u.id);
|
|
96
|
+
const txHex = await recoveryProvider.getTransactionHex(txid);
|
|
97
|
+
const tx = coin.createTransactionFromHex(txHex);
|
|
98
|
+
val = tx.outs[vout].value;
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
...u,
|
|
102
|
+
value: val,
|
|
103
|
+
chain: chain,
|
|
104
|
+
index: addrIndex,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
return {
|
|
109
|
+
...u,
|
|
110
|
+
chain: chain,
|
|
111
|
+
index: addrIndex,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}));
|
|
115
|
+
walletUnspents.push(...processedUnspents);
|
|
95
116
|
}
|
|
96
117
|
}
|
|
97
118
|
if (numSequentialAddressesWithoutTxs >= MAX_SEQUENTIAL_ADDRESSES_WITHOUT_TXS) {
|
|
@@ -169,7 +190,7 @@ async function backupKeyRecovery(coin, bitgo, params) {
|
|
|
169
190
|
queryBlockchainUnspentsPath(coin, params, walletKeys, getInternalChainCode(addressType)),
|
|
170
191
|
], []))).flat();
|
|
171
192
|
// Execute the queries and gather the unspents
|
|
172
|
-
const totalInputAmount =
|
|
193
|
+
const totalInputAmount = utxolib.bitgo.unspentSum(unspents, coin.amountType);
|
|
173
194
|
if (totalInputAmount <= 0) {
|
|
174
195
|
throw new sdk_core_1.ErrorNoInputToRecover();
|
|
175
196
|
}
|
|
@@ -182,33 +203,29 @@ async function backupKeyRecovery(coin, bitgo, params) {
|
|
|
182
203
|
// segwit overhead size and p2sh inputs for the same reason.
|
|
183
204
|
const outputSize = (isKrsRecovery ? 2 : 1) * unspents_1.VirtualSizes.txP2wshOutputSize;
|
|
184
205
|
const approximateSize = unspents_1.VirtualSizes.txSegOverheadVSize + outputSize + unspents_1.VirtualSizes.txP2shInputSize * unspents.length;
|
|
185
|
-
const approximateFee = approximateSize * feePerByte;
|
|
206
|
+
const approximateFee = utxolib.bitgo.toTNumber(approximateSize * feePerByte, coin.amountType);
|
|
186
207
|
// Construct a transaction
|
|
187
208
|
txInfo.inputs = unspents;
|
|
188
209
|
unspents.forEach((unspent) => {
|
|
189
210
|
const { txid, vout } = parseOutputId(unspent.id);
|
|
190
211
|
transactionBuilder.addInput(txid, vout, 0xffffffff, utxolib.address.toOutputScript(unspent.address, coin.network), unspent.value);
|
|
191
212
|
});
|
|
192
|
-
let
|
|
193
|
-
let krsFee;
|
|
213
|
+
let krsFee = utxolib.bitgo.toTNumber(0, coin.amountType);
|
|
194
214
|
if (isKrsRecovery && params.krsProvider) {
|
|
195
215
|
try {
|
|
196
|
-
krsFee = await calculateFeeAmount(coin, {
|
|
197
|
-
provider: params.krsProvider,
|
|
198
|
-
amount: recoveryAmount,
|
|
199
|
-
});
|
|
200
|
-
recoveryAmount -= krsFee;
|
|
216
|
+
krsFee = utxolib.bitgo.toTNumber(await calculateFeeAmount(coin, { provider: params.krsProvider }), coin.amountType);
|
|
201
217
|
}
|
|
202
218
|
catch (err) {
|
|
203
219
|
// Don't let this error block the recovery -
|
|
204
220
|
console.dir(err);
|
|
205
221
|
}
|
|
206
222
|
}
|
|
223
|
+
const recoveryAmount = utxolib.bitgo.toTNumber(BigInt(totalInputAmount) - BigInt(approximateFee) - BigInt(krsFee), coin.amountType);
|
|
207
224
|
if (recoveryAmount < 0) {
|
|
208
225
|
throw new Error(`this wallet\'s balance is too low to pay the fees specified by the KRS provider.
|
|
209
|
-
Existing balance on wallet: ${totalInputAmount}. Estimated network fee for the recovery transaction
|
|
210
|
-
: ${approximateFee}, KRS fee to pay: ${krsFee}. After deducting fees, your total
|
|
211
|
-
is ${recoveryAmount}`);
|
|
226
|
+
Existing balance on wallet: ${totalInputAmount.toString()}. Estimated network fee for the recovery transaction
|
|
227
|
+
: ${approximateFee.toString()}, KRS fee to pay: ${krsFee.toString()}. After deducting fees, your total
|
|
228
|
+
recoverable balance is ${recoveryAmount.toString()}`);
|
|
212
229
|
}
|
|
213
230
|
transactionBuilder.addOutput(params.recoveryDestination, recoveryAmount);
|
|
214
231
|
if (krsProvider && krsFee > 0) {
|
|
@@ -270,4 +287,4 @@ async function backupKeyRecovery(coin, bitgo, params) {
|
|
|
270
287
|
return txInfo;
|
|
271
288
|
}
|
|
272
289
|
exports.backupKeyRecovery = backupKeyRecovery;
|
|
273
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCw0QkFBNEI7QUFDNUIsMkNBQTJDO0FBQzNDLE1BQU0sRUFDSixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLG9CQUFvQixHQUNyQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFPbEIsOENBQStDO0FBRS9DLDhDQVN5QjtBQUd6Qix5REFBK0Q7QUFDL0QsdUNBQW9FO0FBQ3BFLCtDQUE0QztBQUM1Qyw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLGtDQUF5RDtBQWV6RDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixRQUFnQixFQUNoQixNQUEwQixFQUMxQixLQUFhO0lBRWIsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNLEVBQUU7WUFDTixRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU07U0FDeEI7UUFDRCxPQUFPLEVBQUUsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUFDLElBQXNCO0lBQzFELE9BQU8sTUFBTSxJQUFJLDJCQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxLQUFLLFVBQVUsa0JBQWtCLENBQy9CLElBQXNCLEVBQ3RCLE1BQTZDO0lBRTdDLE1BQU0sV0FBVyxHQUFHLHVCQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM3QixNQUFNLElBQUks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XG4gKiBAcHJldHRpZXJcbiAqL1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5jb25zdCB7XG4gIGdldEludGVybmFsQ2hhaW5Db2RlLFxuICBwYXJzZU91dHB1dElkLFxuICBzY3JpcHRUeXBlRm9yQ2hhaW4sXG4gIFdhbGxldFVuc3BlbnRTaWduZXIsXG4gIG91dHB1dFNjcmlwdHMsXG4gIGdldEV4dGVybmFsQ2hhaW5Db2RlLFxufSA9IHV0eG9saWIuYml0Z287XG5cbnR5cGUgQ2hhaW5Db2RlID0gdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgV2FsbGV0VW5zcGVudCA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDtcbnR5cGUgU2NyaXB0VHlwZTJPZjMgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG5cbmltcG9ydCB7IFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5cbmltcG9ydCB7XG4gIEJpdEdvQmFzZSxcbiAgRXJyb3JOb0lucHV0VG9SZWNvdmVyLFxuICBnZXRLcnNQcm92aWRlcixcbiAgZ2V0QmlwMzJLZXlzLFxuICBnZXRJc0tyc1JlY292ZXJ5LFxuICBnZXRJc1Vuc2lnbmVkU3dlZXAsXG4gIGlzVHJpcGxlLFxuICBrcnNQcm92aWRlcnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luIH0gZnJvbSAnLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5cbmltcG9ydCB7IGZvckNvaW4sIFJlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuL1JlY292ZXJ5UHJvdmlkZXInO1xuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciwgQXBpUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9iYXNlQXBpJztcbmltcG9ydCB7IFNtYXJ0Yml0QXBpIH0gZnJvbSAnLi9zbWFydGJpdEFwaSc7XG5pbXBvcnQgeyBNZW1wb29sQXBpIH0gZnJvbSAnLi9tZW1wb29sQXBpJztcbmltcG9ydCB7IENvaW5nZWNrb0FwaSB9IGZyb20gJy4vY29pbmdlY2tvQXBpJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3NpZ24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9mZmxpbmVWYXVsdFR4SW5mbyB7XG4gIGlucHV0czogV2FsbGV0VW5zcGVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyB7XG4gIHR4SW5mbzoge1xuICAgIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50W107XG4gIH07XG4gIHR4SGV4OiBzdHJpbmc7XG4gIGZlZUluZm86IFJlY29yZDxzdHJpbmcsIG5ldmVyPjtcbiAgY29pbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgdHJhbnNmb3JtcyB0aGUgdHhJbmZvIGZyb20gcmVjb3ZlciBpbnRvIHRoZSBmb3JtYXQgdGhhdCBvZmZsaW5lLXNpZ25pbmctdG9vbCBleHBlY3RzXG4gKiBAcGFyYW0gY29pbk5hbWVcbiAqIEBwYXJhbSB0eEluZm9cbiAqIEBwYXJhbSB0eEhleFxuICogQHJldHVybnMge3t0eEhleDogKiwgdHhJbmZvOiB7dW5zcGVudHM6ICp9LCBmZWVJbmZvOiB7fSwgY29pbjogdm9pZH19XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEZvck9mZmxpbmVWYXVsdChcbiAgY29pbk5hbWU6IHN0cmluZyxcbiAgdHhJbmZvOiBPZmZsaW5lVmF1bHRUeEluZm8sXG4gIHR4SGV4OiBzdHJpbmdcbik6IEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyB7XG4gIHJldHVybiB7XG4gICAgdHhIZXgsXG4gICAgdHhJbmZvOiB7XG4gICAgICB1bnNwZW50czogdHhJbmZvLmlucHV0cyxcbiAgICB9LFxuICAgIGZlZUluZm86IHt9LFxuICAgIGNvaW46IGNvaW5OYW1lLFxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBtYXJrZXQgcHJpY2UgZnJvbSBhIHRoaXJkIHBhcnR5IHRvIGJlIHVzZWQgZm9yIHJlY292ZXJ5XG4gKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW50ZW5kZWQgZm9yIG5vbi1iaXRnbyByZWNvdmVyeSB0cmFuc2FjdGlvbnMsIHdoZW4gaXQgaXMgbmVjZXNzYXJ5XG4gKiB0byBjYWxjdWxhdGUgdGhlIHJvdWdoIGZlZSBuZWVkZWQgdG8gcGF5IHRvIEtleXRlcm5hbC4gV2UgYXJlIG9rYXkgd2l0aCBhcHByb3hpbWF0aW5nLFxuICogYmVjYXVzZSB0aGUgcmVzdWx0aW5nIHByaWNlIG9mIHRoaXMgZnVuY3Rpb24gb25seSBoYXMgbGVzcyB0aGFuIDEgZG9sbGFyIGluZmx1ZW5jZSBvbiB0aGVcbiAqIGZlZSB0aGF0IG5lZWRzIHRvIGJlIHBhaWQgdG8gS2V5dGVybmFsLlxuICpcbiAqIFNlZSBjYWxjdWxhdGVGZWVBbW91bnQgZnVuY3Rpb246ICByZXR1cm4gTWF0aC5yb3VuZChmZWVBbW91bnRVc2QgLyBjdXJyZW50UHJpY2UgKiBzZWxmLmdldEJhc2VGYWN0b3IoKSk7XG4gKlxuICogVGhpcyBlbmQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGFuIGFjY3VyYXRlIGVuZHBvaW50LCBzaW5jZSBzb21lIGNvaW5zJyBwcmljZXMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgcHJvdmlkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlNYXJrZXRQcmljZShjb2luOiBBYnN0cmFjdFV0eG9Db2luKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBDb2luZ2Vja29BcGkoKS5nZXRVU0RQcmljZShjb2luLmdldEZhbWlseSgpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhbW91bnQgKGluIGJhc2UgdW5pdHMpIHRvIHBheSBhIEtSUyBwcm92aWRlciB3aGVuIGJ1aWxkaW5nIGEgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBjb2luXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zLnByb3ZpZGVyIHtTdHJpbmd9IHRoZSBLUlMgcHJvdmlkZXIgdGhhdCBob2xkcyB0aGUgYmFja3VwIGtleVxuICogQHBhcmFtIHBhcmFtcy5hbW91bnQge051bWJlcn0gYW1vdW50IChpbiBiYXNlIHVuaXRzKSB0byBiZSByZWNvdmVyZWRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5hc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVGZWVBbW91bnQoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHBhcmFtczogeyBwcm92aWRlcjogc3RyaW5nOyBhbW91bnQ/OiBudW1iZXIgfVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qga3JzUHJvdmlkZXIgPSBrcnNQcm92aWRlcnNbcGFyYW1zLnByb3ZpZGVyXTtcblxuICBpZiAoa3JzUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gZmVlIHN0cnVjdHVyZSBzcGVjaWZpZWQgZm9yIHByb3ZpZGVyICR7cGFyYW1zLnByb3ZpZGVyfWApO1xuICB9XG5cbiAgaWYgKGtyc1Byb3ZpZGVyLmZlZVR5cGUgPT09ICdmbGF0VXNkJykge1xuICAgIGNvbnN0IGZlZUFtb3VudFVzZCA9IGtyc1Byb3ZpZGVyLmZlZUFtb3VudDtcbiAgICBjb25zdCBjdXJyZW50UHJpY2U6IG51bWJlciA9IGF3YWl0IGdldFJlY292ZXJ5TWFya2V0UHJpY2UoY29pbik7XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoZmVlQW1vdW50VXNkIC8gY3VycmVudFByaWNlKSAqIGNvaW4uZ2V0QmFzZUZhY3RvcigpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSBjYW4gYWRkIG1vcmUgZmVlIHN0cnVjdHVyZXMgaGVyZSBhcyBuZWVkZWQgZm9yIGRpZmZlcmVudCBwcm92aWRlcnMsIHN1Y2ggYXMgcGVyY2VudGFnZSBvZiByZWNvdmVyeSBhbW91bnRcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZlZSBzdHJ1Y3R1cmUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyUGFyYW1zIHtcbiAgc2Nhbj86IG51bWJlcjtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICBrcnNQcm92aWRlcj86IHN0cmluZztcbiAgaWdub3JlQWRkcmVzc1R5cGVzOiBTY3JpcHRUeXBlMk9mM1tdO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIHVzZXJLZXlQYXRoPzogc3RyaW5nO1xuICByZWNvdmVyeVByb3ZpZGVyPzogUmVjb3ZlcnlQcm92aWRlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBwYXJhbXM6IFJlY292ZXJQYXJhbXMsXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBjaGFpbjogQ2hhaW5Db2RlXG4pOiBQcm9taXNlPFdhbGxldFVuc3BlbnRbXT4ge1xuICBjb25zdCByZWNvdmVyeVByb3ZpZGVyID0gcGFyYW1zLnJlY292ZXJ5UHJvdmlkZXIgPz8gZm9yQ29pbihjb2luLmdldENoYWluKCksIHBhcmFtcy5hcGlLZXkpO1xuICBjb25zdCBNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFMgPSBwYXJhbXMuc2NhbiB8fCAyMDtcbiAgbGV0IG51bVNlcXVlbnRpYWxBZGRyZXNzZXNXaXRob3V0VHhzID0gMDtcblxuICBhc3luYyBmdW5jdGlvbiBnYXRoZXJVbnNwZW50cyhhZGRySW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHdhbGxldEtleXNGb3JVbnNwZW50ID0gd2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KGNoYWluLCBhZGRySW5kZXgpO1xuICAgIGNvbnN0IGFkZHJlc3MgPSBjb2luLmNyZWF0ZU11bHRpU2lnQWRkcmVzcyhzY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pLCAyLCB3YWxsZXRLZXlzRm9yVW5zcGVudC5wdWJsaWNLZXlzKTtcblxuICAgIGNvbnN0IGFkZHJJbmZvID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRBZGRyZXNzSW5mbyhhZGRyZXNzLmFkZHJlc3MpO1xuICAgIC8vIHdlIHVzZSB0eENvdW50IGhlcmUgYmVjYXVzZSBpdCBpbXBsaWVzIHVzYWdlIC0gaGF2aW5nIHR4J2VzIG1lYW5zIHRoZSBhZGRyIHdhcyBnZW5lcmF0ZWQgYW5kIHVzZWRcbiAgICBpZiAoYWRkckluZm8udHhDb3VudCA9PT0gMCkge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPSAwO1xuXG4gICAgICBpZiAoYWRkckluZm8uYmFsYW5jZSA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIGFuIGFkZHJlc3Mgd2l0aCBiYWxhbmNlOiAke2FkZHJlc3MuYWRkcmVzc30gd2l0aCBiYWxhbmNlICR7YWRkckluZm8uYmFsYW5jZX1gKTtcbiAgICAgICAgY29uc3QgYWRkcmVzc1Vuc3BlbnRzID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhbYWRkcmVzcy5hZGRyZXNzXSk7XG5cbiAgICAgICAgd2FsbGV0VW5zcGVudHMucHVzaChcbiAgICAgICAgICAuLi5hZGRyZXNzVW5zcGVudHMubWFwKFxuICAgICAgICAgICAgKHUpOiBXYWxsZXRVbnNwZW50ID0+ICh7XG4gICAgICAgICAgICAgIC4uLnUsXG4gICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcbiAgICAgICAgICAgICAgaW5kZXg6IGFkZHJJbmRleCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChudW1TZXF1ZW50aWFsQWRkcmVzc2VzV2l0aG91dFR4cyA+PSBNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFMpIHtcbiAgICAgIC8vIHN0b3Agc2VhcmNoaW5nIGZvciBhZGRyZXNzZXMgd2l0aCB1bnNwZW50cyBpbiB0aGVtLCB3ZSd2ZSBmb3VuZCAke01BWF9TRVFVRU5USUFMX0FERFJFU1NFU19XSVRIT1VUX1RYU30gaW4gYSByb3cgd2l0aCBub25lXG4gICAgICAvLyB3ZSBhcmUgZG9uZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRoZXJVbnNwZW50cyhhZGRySW5kZXggKyAxKTtcbiAgfVxuXG4gIC8vIGdldCB1bnNwZW50cyBmb3IgdGhlc2UgYWRkcmVzc2VzXG5cbiAgY29uc3Qgd2FsbGV0VW5zcGVudHM6IFdhbGxldFVuc3BlbnRbXSA9IFtdO1xuICAvLyBUaGlzIHdpbGwgcG9wdWxhdGUgd2FsbGV0QWRkcmVzc2VzXG4gIGF3YWl0IGdhdGhlclVuc3BlbnRzKDApO1xuXG4gIGlmICh3YWxsZXRVbnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBDb3VsZG4ndCBmaW5kIGFueSBhZGRyZXNzZXMgd2l0aCBmdW5kc1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiB3YWxsZXRVbnNwZW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgeyBkZWZhdWx0VmFsdWUgfTogeyBkZWZhdWx0VmFsdWU6IG51bWJlciB9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBNZW1wb29sQXBpLmZvckNvaW4oY29pbi5nZXRDaGFpbigpKS5nZXRSZWNvdmVyeUZlZVBlckJ5dGVzKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmRpcihlKTtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24gPSB7XG4gIGlucHV0czogV2FsbGV0VW5zcGVudFtdO1xuICB0cmFuc2FjdGlvbkhleDogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICByZWNvdmVyeUFtb3VudDogbnVtYmVyO1xuICAvLyBzbWFydGJpdCBhcGkgcmVzcG9uc2VcbiAgdHg/OiB1bmtub3duO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gKiBAcGFyYW0gY29pblxuICogQHBhcmFtIGJpdGdvXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAtIHVzZXJLZXk6IFtlbmNyeXB0ZWRdIHhwcnYsIG9yIHhwdWJcbiAqIC0gYmFja3VwS2V5OiBbZW5jcnlwdGVkXSB4cHJ2LCBvciB4cHViIGlmIHRoZSB4cHJ2IGlzIGhlbGQgYnkgYSBLUlMgcHJvdmlkZXJcbiAqIC0gd2FsbGV0UGFzc3BocmFzZTogbmVjZXNzYXJ5IGlmIG9uZSBvZiB0aGUgeHBydnMgaXMgZW5jcnlwdGVkXG4gKiAtIGJpdGdvS2V5OiB4cHViXG4gKiAtIGtyc1Byb3ZpZGVyOiBuZWNlc3NhcnkgaWYgYmFja3VwIGtleSBpcyBoZWxkIGJ5IEtSU1xuICogLSByZWNvdmVyeURlc3RpbmF0aW9uOiB0YXJnZXQgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICogLSBzY2FuOiB0aGUgYW1vdW50IG9mIGNvbnNlY3V0aXZlIGFkZHJlc3NlcyB3aXRob3V0IHVuc3BlbnRzIHRvIHNjYW4gdGhyb3VnaCBiZWZvcmUgc3RvcHBpbmdcbiAqIC0gaWdub3JlQWRkcmVzc1R5cGVzOiAob3B0aW9uYWwpIHNjcmlwdHMgdG8gaWdub3JlXG4gKiAgICAgICAgZm9yIGV4YW1wbGU6IFsncDJzaFAyd3NoJywgJ3Ayd3NoJ10gd2lsbCBwcmV2ZW50IGNvZGUgZnJvbSBjaGVja2luZyBmb3Igd3JhcHBlZC1zZWd3aXQgYW5kIG5hdGl2ZS1zZWd3aXQgY2hhaW5zIG9uIHRoZSBwdWJsaWMgYmxvY2sgZXhwbG9yZXJzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYWNrdXBLZXlSZWNvdmVyeShcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBSZWNvdmVyUGFyYW1zXG4pOiBQcm9taXNlPEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24gfCBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8+IHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVzZXJLZXknKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5iYWNrdXBLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJhY2t1cEtleScpO1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8ICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNjYW4pICYmICghXy5pc0ludGVnZXIocGFyYW1zLnNjYW4pIHx8IHBhcmFtcy5zY2FuIDwgMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjYW4gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGNvbnN0IGlzS3JzUmVjb3ZlcnkgPSBnZXRJc0tyc1JlY292ZXJ5KHBhcmFtcyk7XG4gIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuXG4gIGNvbnN0IGtyc1Byb3ZpZGVyID0gaXNLcnNSZWNvdmVyeSA/IGdldEtyc1Byb3ZpZGVyKGNvaW4sIHBhcmFtcy5rcnNQcm92aWRlcikgOiB1bmRlZmluZWQ7XG5cbiAgLy8gY2hlY2sgd2hldGhlciBrZXkgbWF0ZXJpYWwgYW5kIHBhc3N3b3JkIGF1dGhlbnRpY2F0ZSB0aGUgdXNlcnMgYW5kIHJldHVybiBwYXJlbnQga2V5cyBvZiBhbGwgdGhyZWUga2V5cyBvZiB0aGUgd2FsbGV0XG4gIGNvbnN0IGtleXMgPSBnZXRCaXAzMktleXMoYml0Z28sIHBhcmFtcywgeyByZXF1aXJlQml0R29YcHViOiB0cnVlIH0pO1xuICBpZiAoIWlzVHJpcGxlKGtleXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBrZXkgdHJpcGxlYCk7XG4gIH1cbiAgY29uc3Qgd2FsbGV0S2V5cyA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKGtleXMsIFtcbiAgICBwYXJhbXMudXNlcktleVBhdGggfHwgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICAgIHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgICB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gIF0pO1xuXG4gIGNvbnN0IHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50W10gPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBvdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mM1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChhZGRyZXNzVHlwZSkgPT4gY29pbi5zdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlKSAmJiAhcGFyYW1zLmlnbm9yZUFkZHJlc3NUeXBlcz8uaW5jbHVkZXMoYWRkcmVzc1R5cGUpXG4gICAgICAgIClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocXVlcmllcywgYWRkcmVzc1R5cGUpID0+IFtcbiAgICAgICAgICAgIC4uLnF1ZXJpZXMsXG4gICAgICAgICAgICBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGgoY29pbiwgcGFyYW1zLCB3YWxsZXRLZXlzLCBnZXRFeHRlcm5hbENoYWluQ29kZShhZGRyZXNzVHlwZSkpLFxuICAgICAgICAgICAgcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoKGNvaW4sIHBhcmFtcywgd2FsbGV0S2V5cywgZ2V0SW50ZXJuYWxDaGFpbkNvZGUoYWRkcmVzc1R5cGUpKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtdIGFzIFByb21pc2U8V2FsbGV0VW5zcGVudFtdPltdXG4gICAgICAgIClcbiAgICApXG4gICkuZmxhdCgpO1xuXG4gIC8vIEV4ZWN1dGUgdGhlIHF1ZXJpZXMgYW5kIGdhdGhlciB0aGUgdW5zcGVudHNcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHVuc3BlbnRzLnJlZHVjZSgoc3VtLCB1KSA9PiBzdW0gKyB1LnZhbHVlLCAwKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvck5vSW5wdXRUb1JlY292ZXIoKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSB0cmFuc2FjdGlvblxuICBjb25zdCB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcmsoY29pbi5uZXR3b3JrKTtcbiAgY29uc3QgdHhJbmZvID0ge30gYXMgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbjtcblxuICBjb25zdCBmZWVQZXJCeXRlOiBudW1iZXIgPSBhd2FpdCBnZXRSZWNvdmVyeUZlZVBlckJ5dGVzKGNvaW4sIHsgZGVmYXVsdFZhbHVlOiAxMDAgfSk7XG5cbiAgLy8gS1JTIHJlY292ZXJ5IHRyYW5zYWN0aW9ucyBoYXZlIGEgMm5kIG91dHB1dCB0byBwYXkgdGhlIHJlY292ZXJ5IGZlZSwgbGlrZSBwYXlnbyBmZWVzLiBVc2UgcDJ3c2ggb3V0cHV0cyBiZWNhdXNlXG4gIC8vIHRoZXkgYXJlIHRoZSBsYXJnZXN0IG91dHB1dHMgYW5kIHRodXMgdGhlIG1vc3QgY29uc2VydmF0aXZlIGVzdGltYXRlIHRvIHVzZSBpbiBjYWxjdWxhdGluZyBmZWVzLiBBbHNvIHVzZVxuICAvLyBzZWd3aXQgb3ZlcmhlYWQgc2l6ZSBhbmQgcDJzaCBpbnB1dHMgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IChpc0tyc1JlY292ZXJ5ID8gMiA6IDEpICogVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplO1xuICBjb25zdCBhcHByb3hpbWF0ZVNpemUgPSBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiB1bnNwZW50cy5sZW5ndGg7XG4gIGNvbnN0IGFwcHJveGltYXRlRmVlID0gYXBwcm94aW1hdGVTaXplICogZmVlUGVyQnl0ZTtcblxuICAvLyBDb25zdHJ1Y3QgYSB0cmFuc2FjdGlvblxuICB0eEluZm8uaW5wdXRzID0gdW5zcGVudHM7XG5cbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHhpZCwgdm91dCB9ID0gcGFyc2VPdXRwdXRJZCh1bnNwZW50LmlkKTtcbiAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuYWRkSW5wdXQoXG4gICAgICB0eGlkLFxuICAgICAgdm91dCxcbiAgICAgIDB4ZmZmZmZmZmYsXG4gICAgICB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQodW5zcGVudC5hZGRyZXNzLCBjb2luLm5ldHdvcmspLFxuICAgICAgdW5zcGVudC52YWx1ZVxuICAgICk7XG4gIH0pO1xuXG4gIGxldCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZUZlZTtcbiAgbGV0IGtyc0ZlZTtcbiAgaWYgKGlzS3JzUmVjb3ZlcnkgJiYgcGFyYW1zLmtyc1Byb3ZpZGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGtyc0ZlZSA9IGF3YWl0IGNhbGN1bGF0ZUZlZUFtb3VudChjb2luLCB7XG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMua3JzUHJvdmlkZXIsXG4gICAgICAgIGFtb3VudDogcmVjb3ZlcnlBbW91bnQsXG4gICAgICB9KTtcbiAgICAgIHJlY292ZXJ5QW1vdW50IC09IGtyc0ZlZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIERvbid0IGxldCB0aGlzIGVycm9yIGJsb2NrIHRoZSByZWNvdmVyeSAtXG4gICAgICBjb25zb2xlLmRpcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZWNvdmVyeUFtb3VudCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRoaXMgd2FsbGV0XFwncyBiYWxhbmNlIGlzIHRvbyBsb3cgdG8gcGF5IHRoZSBmZWVzIHNwZWNpZmllZCBieSB0aGUgS1JTIHByb3ZpZGVyLiBcbiAgICAgICAgICBFeGlzdGluZyBiYWxhbmNlIG9uIHdhbGxldDogJHt0b3RhbElucHV0QW1vdW50fS4gRXN0aW1hdGVkIG5ldHdvcmsgZmVlIGZvciB0aGUgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAgICAgICAgICA6ICR7YXBwcm94aW1hdGVGZWV9LCBLUlMgZmVlIHRvIHBheTogJHtrcnNGZWV9LiBBZnRlciBkZWR1Y3RpbmcgZmVlcywgeW91ciB0b3RhbCByZWNvdmVyYWJsZSBiYWxhbmNlXG4gICAgICAgICAgaXMgJHtyZWNvdmVyeUFtb3VudH1gKTtcbiAgfVxuXG4gIHRyYW5zYWN0aW9uQnVpbGRlci5hZGRPdXRwdXQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIHJlY292ZXJ5QW1vdW50KTtcblxuICBpZiAoa3JzUHJvdmlkZXIgJiYga3JzRmVlID4gMCkge1xuICAgIGlmICgha3JzUHJvdmlkZXIuZmVlQWRkcmVzc2VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGtleVByb3ZpZGVyIG11c3QgZGVmaW5lIGZlZUFkZHJlc3Nlc2ApO1xuICAgIH1cblxuICAgIGNvbnN0IGtyc0ZlZUFkZHJlc3MgPSBrcnNQcm92aWRlci5mZWVBZGRyZXNzZXNbY29pbi5nZXRDaGFpbigpXTtcblxuICAgIGlmICgha3JzRmVlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIEtSUyBwcm92aWRlciBoYXMgbm90IGNvbmZpZ3VyZWQgdGhlaXIgZmVlIHN0cnVjdHVyZSB5ZXQgLSByZWNvdmVyeSBjYW5ub3QgYmUgY29tcGxldGVkJyk7XG4gICAgfVxuXG4gICAgdHJhbnNhY3Rpb25CdWlsZGVyLmFkZE91dHB1dChrcnNGZWVBZGRyZXNzLCBrcnNGZWUpO1xuICB9XG5cbiAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgIGNvbnN0IHR4SGV4ID0gdHJhbnNhY3Rpb25CdWlsZGVyLmJ1aWxkSW5jb21wbGV0ZSgpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIHJldHVybiBmb3JtYXRGb3JPZmZsaW5lVmF1bHQoY29pbi5nZXRDaGFpbigpLCB0eEluZm8gYXMgT2ZmbGluZVZhdWx0VHhJbmZvLCB0eEhleCk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHRyYW5zYWN0aW9uID0gc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uKFxuICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgICAgdW5zcGVudHMsXG4gICAgICBuZXcgV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4od2FsbGV0S2V5cywgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJhY2t1cCksXG4gICAgICB7IGlzTGFzdFNpZ25hdHVyZTogZmFsc2UgfVxuICAgICk7XG4gICAgaWYgKCFpc0tyc1JlY292ZXJ5KSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbihcbiAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgIHVuc3BlbnRzLFxuICAgICAgICBuZXcgV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4od2FsbGV0S2V5cywgd2FsbGV0S2V5cy5iYWNrdXAsIHdhbGxldEtleXMudXNlciksXG4gICAgICAgIHsgaXNMYXN0U2lnbmF0dXJlOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHhJbmZvLnRyYW5zYWN0aW9uSGV4ID0gdHJhbnNhY3Rpb24udG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBsZXQgdHJhbnNhY3Rpb25EZXRhaWxzO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbkRldGFpbHMgPSBhd2FpdCBTbWFydGJpdEFwaS5mb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSkuZ2V0VHJhbnNhY3Rpb25EZXRhaWxzKHRyYW5zYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzb21lIGNvaW5zIGRvbid0IGhhdmUgYSByZWxpYWJsZSB0aGlyZCBwYXJ0eSB2ZXJpZmljYXRpb24gZW5kcG9pbnQsIG9yIHNvbWV0aW1lcyB0aGUgdGhpcmQgcGFydHkgZW5kcG9pbnRcbiAgICAgIC8vIGNvdWxkIGJlIHVuYXZhaWxhYmxlIGR1ZSB0byBzZXJ2aWNlIG91dGFnZSwgc28gd2UgY29udGludWUgd2l0aG91dCB2ZXJpZmljYXRpb24gZm9yIHRob3NlIGNvaW5zLCBidXQgd2Ugd2lsbFxuICAgICAgLy8gbGV0IHVzZXJzIGtub3cgdGhhdCB0aGV5IHNob3VsZCB2ZXJpZnkgdGhlaXIgb3duXG4gICAgICAvLyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHBpcGVkIHRvIFdSVyBhbmQgZGlzcGxheWVkIG9uIHRoZSBVSVxuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBcGlOb3RJbXBsZW1lbnRlZEVycm9yIHx8IGUgaW5zdGFuY2VvZiBBcGlSZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1BsZWFzZSB2ZXJpZnkgeW91ciB0cmFuc2FjdGlvbiBieSBkZWNvZGluZyB0aGUgdHggaGV4IHVzaW5nIGEgdGhpcmQtcGFydHkgYXBpIG9mIHlvdXIgY2hvaWNlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0cmFuc2FjdGlvbkRldGFpbHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogVmVyaWZ5IHRoYXQgdGhlIHR4aGV4IHVzZXIgc2lnbnMgY29ycmVzcG9uZCB0byB0aGUgY29ycmVjdCB0eCB0aGV5IGludGVuZGVkXG4gICAgICAgKiBieSAxKSBnZXR0aW5nIGJhY2sgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gYmFzZWQgb24gdGhlIHR4aGV4XG4gICAgICAgKiBhbmQgdGhlbiAyKSBjb21wdXRlIHRoZSB0eGlkIChoYXNoKSwgaDEgb2YgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gMykgY29tcGFyZSBoMVxuICAgICAgICogdG8gdGhlIHR4aWQgKGhhc2gpIG9mIHRoZSB0cmFuc2FjdGlvbiAoaW5jbHVkaW5nIHVuc3BlbnQgaW5mbykgd2UgY29uc3RydWN0ZWRcbiAgICAgICAqL1xuICAgICAgaWYgKHRyYW5zYWN0aW9uRGV0YWlscy5UeElkICE9PSB0cmFuc2FjdGlvbi5nZXRJZCgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0eGhhc2gvdHhpZCByZXR1cm5lZCBieSBibG9ja2V4cGxvcmVyOiAnLCB0cmFuc2FjdGlvbkRldGFpbHMuVHhJZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0eGhhc2gvdHhpZCBvZiB0aGUgdHJhbnNhY3Rpb24gYml0Z28gY29uc3RydWN0ZWQnLCB0cmFuc2FjdGlvbi5nZXRJZCgpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvbnNpc3RlbnQgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gaWQnKTtcbiAgICAgIH1cbiAgICAgIHR4SW5mby50eCA9IHRyYW5zYWN0aW9uRGV0YWlscztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgIHR4SW5mby5jb2luID0gY29pbi5nZXRDaGFpbigpO1xuICAgIHR4SW5mby5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgIHR4SW5mby5yZWNvdmVyeUFtb3VudCA9IHJlY292ZXJ5QW1vdW50O1xuICB9XG5cbiAgcmV0dXJuIHR4SW5mbztcbn1cbiJdfQ==
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCw0QkFBNEI7QUFDNUIsMkNBQTJDO0FBQzNDLE1BQU0sRUFDSixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLG9CQUFvQixHQUNyQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFPbEIsOENBQStDO0FBRS9DLDhDQVN5QjtBQUd6Qix5REFBK0Q7QUFDL0QsdUNBQW9FO0FBQ3BFLCtDQUE0QztBQUM1Qyw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLGtDQUF5RDtBQWV6RDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixRQUFnQixFQUNoQixNQUFtQyxFQUNuQyxLQUFhO0lBRWIsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNLEVBQUU7WUFDTixRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU07U0FDeEI7UUFDRCxPQUFPLEVBQUUsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUFDLElBQXNCO0lBQzFELE9BQU8sTUFBTSxJQUFJLDJCQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxJQUFzQixFQUFFLE1BQTRCO0lBQ3BGLE1BQU0sV0FBVyxHQUFHLHVCQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FB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aEIsQ0FBQztBQTNMRCw4Q0EyTEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5cbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmNvbnN0IHtcbiAgZ2V0SW50ZXJuYWxDaGFpbkNvZGUsXG4gIHBhcnNlT3V0cHV0SWQsXG4gIHNjcmlwdFR5cGVGb3JDaGFpbixcbiAgV2FsbGV0VW5zcGVudFNpZ25lcixcbiAgb3V0cHV0U2NyaXB0cyxcbiAgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUsXG59ID0gdXR4b2xpYi5iaXRnbztcblxudHlwZSBDaGFpbkNvZGUgPSB1dHhvbGliLmJpdGdvLkNoYWluQ29kZTtcbnR5cGUgUm9vdFdhbGxldEtleXMgPSB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzO1xudHlwZSBXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50PFROdW1iZXI+O1xudHlwZSBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcblxuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvL3Vuc3BlbnRzJztcblxuaW1wb3J0IHtcbiAgQml0R29CYXNlLFxuICBFcnJvck5vSW5wdXRUb1JlY292ZXIsXG4gIGdldEtyc1Byb3ZpZGVyLFxuICBnZXRCaXAzMktleXMsXG4gIGdldElzS3JzUmVjb3ZlcnksXG4gIGdldElzVW5zaWduZWRTd2VlcCxcbiAgaXNUcmlwbGUsXG4gIGtyc1Byb3ZpZGVycyxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4gfSBmcm9tICcuLi9hYnN0cmFjdFV0eG9Db2luJztcblxuaW1wb3J0IHsgZm9yQ29pbiwgUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vUmVjb3ZlcnlQcm92aWRlcic7XG5pbXBvcnQgeyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yLCBBcGlSZXF1ZXN0RXJyb3IgfSBmcm9tICcuL2Jhc2VBcGknO1xuaW1wb3J0IHsgU21hcnRiaXRBcGkgfSBmcm9tICcuL3NtYXJ0Yml0QXBpJztcbmltcG9ydCB7IE1lbXBvb2xBcGkgfSBmcm9tICcuL21lbXBvb2xBcGknO1xuaW1wb3J0IHsgQ29pbmdlY2tvQXBpIH0gZnJvbSAnLi9jb2luZ2Vja29BcGknO1xuaW1wb3J0IHsgc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vc2lnbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2ZmbGluZVZhdWx0VHhJbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgaW5wdXRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdHhJbmZvOiB7XG4gICAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXTtcbiAgfTtcbiAgdHhIZXg6IHN0cmluZztcbiAgZmVlSW5mbzogUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuICBjb2luOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyB0cmFuc2Zvcm1zIHRoZSB0eEluZm8gZnJvbSByZWNvdmVyIGludG8gdGhlIGZvcm1hdCB0aGF0IG9mZmxpbmUtc2lnbmluZy10b29sIGV4cGVjdHNcbiAqIEBwYXJhbSBjb2luTmFtZVxuICogQHBhcmFtIHR4SW5mb1xuICogQHBhcmFtIHR4SGV4XG4gKiBAcmV0dXJucyB7e3R4SGV4OiAqLCB0eEluZm86IHt1bnNwZW50czogKn0sIGZlZUluZm86IHt9LCBjb2luOiB2b2lkfX1cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Rm9yT2ZmbGluZVZhdWx0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luTmFtZTogc3RyaW5nLFxuICB0eEluZm86IE9mZmxpbmVWYXVsdFR4SW5mbzxUTnVtYmVyPixcbiAgdHhIZXg6IHN0cmluZ1xuKTogRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvPFROdW1iZXI+IHtcbiAgcmV0dXJuIHtcbiAgICB0eEhleCxcbiAgICB0eEluZm86IHtcbiAgICAgIHVuc3BlbnRzOiB0eEluZm8uaW5wdXRzLFxuICAgIH0sXG4gICAgZmVlSW5mbzoge30sXG4gICAgY29pbjogY29pbk5hbWUsXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IG1hcmtldCBwcmljZSBmcm9tIGEgdGhpcmQgcGFydHkgdG8gYmUgdXNlZCBmb3IgcmVjb3ZlcnlcbiAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5IHRyYW5zYWN0aW9ucywgd2hlbiBpdCBpcyBuZWNlc3NhcnlcbiAqIHRvIGNhbGN1bGF0ZSB0aGUgcm91Z2ggZmVlIG5lZWRlZCB0byBwYXkgdG8gS2V5dGVybmFsLiBXZSBhcmUgb2theSB3aXRoIGFwcHJveGltYXRpbmcsXG4gKiBiZWNhdXNlIHRoZSByZXN1bHRpbmcgcHJpY2Ugb2YgdGhpcyBmdW5jdGlvbiBvbmx5IGhhcyBsZXNzIHRoYW4gMSBkb2xsYXIgaW5mbHVlbmNlIG9uIHRoZVxuICogZmVlIHRoYXQgbmVlZHMgdG8gYmUgcGFpZCB0byBLZXl0ZXJuYWwuXG4gKlxuICogU2VlIGNhbGN1bGF0ZUZlZUFtb3VudCBmdW5jdGlvbjogIHJldHVybiBNYXRoLnJvdW5kKGZlZUFtb3VudFVzZCAvIGN1cnJlbnRQcmljZSAqIHNlbGYuZ2V0QmFzZUZhY3RvcigpKTtcbiAqXG4gKiBUaGlzIGVuZCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgYXMgYW4gYWNjdXJhdGUgZW5kcG9pbnQsIHNpbmNlIHNvbWUgY29pbnMnIHByaWNlcyBhcmUgbWlzc2luZyBmcm9tIHRoZSBwcm92aWRlclxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWNvdmVyeU1hcmtldFByaWNlKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gYXdhaXQgbmV3IENvaW5nZWNrb0FwaSgpLmdldFVTRFByaWNlKGNvaW4uZ2V0RmFtaWx5KCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFtb3VudCAoaW4gYmFzZSB1bml0cykgdG8gcGF5IGEgS1JTIHByb3ZpZGVyIHdoZW4gYnVpbGRpbmcgYSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMucHJvdmlkZXIge1N0cmluZ30gdGhlIEtSUyBwcm92aWRlciB0aGF0IGhvbGRzIHRoZSBiYWNrdXAga2V5XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRmVlQW1vdW50KGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHBhcmFtczogeyBwcm92aWRlcjogc3RyaW5nIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBrcnNQcm92aWRlciA9IGtyc1Byb3ZpZGVyc1twYXJhbXMucHJvdmlkZXJdO1xuXG4gIGlmIChrcnNQcm92aWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBmZWUgc3RydWN0dXJlIHNwZWNpZmllZCBmb3IgcHJvdmlkZXIgJHtwYXJhbXMucHJvdmlkZXJ9YCk7XG4gIH1cblxuICBpZiAoa3JzUHJvdmlkZXIuZmVlVHlwZSA9PT0gJ2ZsYXRVc2QnKSB7XG4gICAgY29uc3QgZmVlQW1vdW50VXNkID0ga3JzUHJvdmlkZXIuZmVlQW1vdW50O1xuICAgIGNvbnN0IGN1cnJlbnRQcmljZTogbnVtYmVyID0gYXdhaXQgZ2V0UmVjb3ZlcnlNYXJrZXRQcmljZShjb2luKTtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKChmZWVBbW91bnRVc2QgLyBjdXJyZW50UHJpY2UpICogY29pbi5nZXRCYXNlRmFjdG9yKCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIHdlIGNhbiBhZGQgbW9yZSBmZWUgc3RydWN0dXJlcyBoZXJlIGFzIG5lZWRlZCBmb3IgZGlmZmVyZW50IHByb3ZpZGVycywgc3VjaCBhcyBwZXJjZW50YWdlIG9mIHJlY292ZXJ5IGFtb3VudFxuICAgIHRocm93IG5ldyBFcnJvcignRmVlIHN0cnVjdHVyZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJQYXJhbXMge1xuICBzY2FuPzogbnVtYmVyO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xuICByZWNvdmVyeURlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIGtyc1Byb3ZpZGVyPzogc3RyaW5nO1xuICBpZ25vcmVBZGRyZXNzVHlwZXM6IFNjcmlwdFR5cGUyT2YzW107XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgdXNlcktleVBhdGg/OiBzdHJpbmc7XG4gIHJlY292ZXJ5UHJvdmlkZXI/OiBSZWNvdmVyeVByb3ZpZGVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGg8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtcyxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIGNoYWluOiBDaGFpbkNvZGVcbik6IFByb21pc2U8V2FsbGV0VW5zcGVudDxUTnVtYmVyPltdPiB7XG4gIGNvbnN0IHJlY292ZXJ5UHJvdmlkZXIgPSBwYXJhbXMucmVjb3ZlcnlQcm92aWRlciA/PyBmb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSwgcGFyYW1zLmFwaUtleSk7XG4gIGNvbnN0IE1BWF9TRVFVRU5USUFMX0FERFJFU1NFU19XSVRIT1VUX1RYUyA9IHBhcmFtcy5zY2FuIHx8IDIwO1xuICBsZXQgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdhdGhlclVuc3BlbnRzKGFkZHJJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgd2FsbGV0S2V5c0ZvclVuc3BlbnQgPSB3YWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoY2hhaW4sIGFkZHJJbmRleCk7XG4gICAgY29uc3QgYWRkcmVzcyA9IGNvaW4uY3JlYXRlTXVsdGlTaWdBZGRyZXNzKHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbiksIDIsIHdhbGxldEtleXNGb3JVbnNwZW50LnB1YmxpY0tleXMpO1xuXG4gICAgY29uc3QgYWRkckluZm8gPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldEFkZHJlc3NJbmZvKGFkZHJlc3MuYWRkcmVzcyk7XG4gICAgLy8gd2UgdXNlIHR4Q291bnQgaGVyZSBiZWNhdXNlIGl0IGltcGxpZXMgdXNhZ2UgLSBoYXZpbmcgdHgnZXMgbWVhbnMgdGhlIGFkZHIgd2FzIGdlbmVyYXRlZCBhbmQgdXNlZFxuICAgIGlmIChhZGRySW5mby50eENvdW50ID09PSAwKSB7XG4gICAgICBudW1TZXF1ZW50aWFsQWRkcmVzc2VzV2l0aG91dFR4cysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1TZXF1ZW50aWFsQWRkcmVzc2VzV2l0aG91dFR4cyA9IDA7XG5cbiAgICAgIGlmIChhZGRySW5mby5iYWxhbmNlID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgYW4gYWRkcmVzcyB3aXRoIGJhbGFuY2U6ICR7YWRkcmVzcy5hZGRyZXNzfSB3aXRoIGJhbGFuY2UgJHthZGRySW5mby5iYWxhbmNlfWApO1xuICAgICAgICBjb25zdCBhZGRyZXNzVW5zcGVudHMgPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKFthZGRyZXNzLmFkZHJlc3NdKTtcblxuICAgICAgICBjb25zdCBwcm9jZXNzZWRVbnNwZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGFkZHJlc3NVbnNwZW50cy5tYXAoYXN5bmMgKHUpOiBQcm9taXNlPFdhbGxldFVuc3BlbnQ8VE51bWJlcj4+ID0+IHtcbiAgICAgICAgICAgIGlmIChjb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgICAgIC8vIGJsb2NrY2hhaXIgcmV0dXJucyB0aGUgbnVtYmVyIHdpdGggdGhlIGNvcnJlY3QgcHJlY2lzaW9uLCBidXQgaW4gbnVtYmVyIGZvcm1hdFxuICAgICAgICAgICAgICAvLyBqc29uIHBhcnNlIHdvbid0IHBhcnNlIGl0IGNvcnJlY3RseSwgc28gd2UgcmVxdWVyeSB0aGUgdHhpZCBmb3IgdGhlIHR4IGhleCB0byBkZWNvZGUgaGVyZVxuICAgICAgICAgICAgICBsZXQgdmFsID0gQmlnSW50KHUudmFsdWUpIGFzIFROdW1iZXI7XG4gICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHR4aWQsIHZvdXQgfSA9IHV0eG9saWIuYml0Z28ucGFyc2VPdXRwdXRJZCh1LmlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eEhleCA9IGF3YWl0IHJlY292ZXJ5UHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb25IZXgodHhpZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHggPSBjb2luLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyPih0eEhleCk7XG4gICAgICAgICAgICAgICAgdmFsID0gdHgub3V0c1t2b3V0XS52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG4gICAgICAgICAgICAgICAgaW5kZXg6IGFkZHJJbmRleCxcbiAgICAgICAgICAgICAgfSBhcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi51LFxuICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcbiAgICAgICAgICAgICAgICBpbmRleDogYWRkckluZGV4LFxuICAgICAgICAgICAgICB9IGFzIFdhbGxldFVuc3BlbnQ8VE51bWJlcj47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB3YWxsZXRVbnNwZW50cy5wdXNoKC4uLnByb2Nlc3NlZFVuc3BlbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPj0gTUFYX1NFUVVFTlRJQUxfQUREUkVTU0VTX1dJVEhPVVRfVFhTKSB7XG4gICAgICAvLyBzdG9wIHNlYXJjaGluZyBmb3IgYWRkcmVzc2VzIHdpdGggdW5zcGVudHMgaW4gdGhlbSwgd2UndmUgZm91bmQgJHtNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFN9IGluIGEgcm93IHdpdGggbm9uZVxuICAgICAgLy8gd2UgYXJlIGRvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0aGVyVW5zcGVudHMoYWRkckluZGV4ICsgMSk7XG4gIH1cblxuICAvLyBnZXQgdW5zcGVudHMgZm9yIHRoZXNlIGFkZHJlc3Nlc1xuXG4gIGNvbnN0IHdhbGxldFVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10gPSBbXTtcbiAgLy8gVGhpcyB3aWxsIHBvcHVsYXRlIHdhbGxldEFkZHJlc3Nlc1xuICBhd2FpdCBnYXRoZXJVbnNwZW50cygwKTtcblxuICBpZiAod2FsbGV0VW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gQ291bGRuJ3QgZmluZCBhbnkgYWRkcmVzc2VzIHdpdGggZnVuZHNcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gd2FsbGV0VW5zcGVudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHsgZGVmYXVsdFZhbHVlIH06IHsgZGVmYXVsdFZhbHVlOiBudW1iZXIgfVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgTWVtcG9vbEFwaS5mb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSkuZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5kaXIoZSk7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0ge1xuICBpbnB1dHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXTtcbiAgdHJhbnNhY3Rpb25IZXg6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgcmVjb3ZlcnlBbW91bnQ6IFROdW1iZXI7XG4gIC8vIHNtYXJ0Yml0IGFwaSByZXNwb25zZVxuICB0eD86IHVua25vd247XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAqIEBwYXJhbSBjb2luXG4gKiBAcGFyYW0gYml0Z29cbiAqIEBwYXJhbSBwYXJhbXNcbiAqIC0gdXNlcktleTogW2VuY3J5cHRlZF0geHBydiwgb3IgeHB1YlxuICogLSBiYWNrdXBLZXk6IFtlbmNyeXB0ZWRdIHhwcnYsIG9yIHhwdWIgaWYgdGhlIHhwcnYgaXMgaGVsZCBieSBhIEtSUyBwcm92aWRlclxuICogLSB3YWxsZXRQYXNzcGhyYXNlOiBuZWNlc3NhcnkgaWYgb25lIG9mIHRoZSB4cHJ2cyBpcyBlbmNyeXB0ZWRcbiAqIC0gYml0Z29LZXk6IHhwdWJcbiAqIC0ga3JzUHJvdmlkZXI6IG5lY2Vzc2FyeSBpZiBiYWNrdXAga2V5IGlzIGhlbGQgYnkgS1JTXG4gKiAtIHJlY292ZXJ5RGVzdGluYXRpb246IHRhcmdldCBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gKiAtIHNjYW46IHRoZSBhbW91bnQgb2YgY29uc2VjdXRpdmUgYWRkcmVzc2VzIHdpdGhvdXQgdW5zcGVudHMgdG8gc2NhbiB0aHJvdWdoIGJlZm9yZSBzdG9wcGluZ1xuICogLSBpZ25vcmVBZGRyZXNzVHlwZXM6IChvcHRpb25hbCkgc2NyaXB0cyB0byBpZ25vcmVcbiAqICAgICAgICBmb3IgZXhhbXBsZTogWydwMnNoUDJ3c2gnLCAncDJ3c2gnXSB3aWxsIHByZXZlbnQgY29kZSBmcm9tIGNoZWNraW5nIGZvciB3cmFwcGVkLXNlZ3dpdCBhbmQgbmF0aXZlLXNlZ3dpdCBjaGFpbnMgb24gdGhlIHB1YmxpYyBibG9jayBleHBsb3JlcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJhY2t1cEtleVJlY292ZXJ5PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBiaXRnbzogQml0R29CYXNlLFxuICBwYXJhbXM6IFJlY292ZXJQYXJhbXNcbik6IFByb21pc2U8QmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbjxUTnVtYmVyPiB8IEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbzxUTnVtYmVyPj4ge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlcktleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikgfHwgIWNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2NhbikgJiYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2NhbikgfHwgcGFyYW1zLnNjYW4gPCAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2NhbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICB9XG5cbiAgY29uc3QgaXNLcnNSZWNvdmVyeSA9IGdldElzS3JzUmVjb3ZlcnkocGFyYW1zKTtcbiAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gZ2V0SXNVbnNpZ25lZFN3ZWVwKHBhcmFtcyk7XG5cbiAgY29uc3Qga3JzUHJvdmlkZXIgPSBpc0tyc1JlY292ZXJ5ID8gZ2V0S3JzUHJvdmlkZXIoY29pbiwgcGFyYW1zLmtyc1Byb3ZpZGVyKSA6IHVuZGVmaW5lZDtcblxuICAvLyBjaGVjayB3aGV0aGVyIGtleSBtYXRlcmlhbCBhbmQgcGFzc3dvcmQgYXV0aGVudGljYXRlIHRoZSB1c2VycyBhbmQgcmV0dXJuIHBhcmVudCBrZXlzIG9mIGFsbCB0aHJlZSBrZXlzIG9mIHRoZSB3YWxsZXRcbiAgY29uc3Qga2V5cyA9IGdldEJpcDMyS2V5cyhiaXRnbywgcGFyYW1zLCB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfSk7XG4gIGlmICghaXNUcmlwbGUoa2V5cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGtleSB0cmlwbGVgKTtcbiAgfVxuICBjb25zdCB3YWxsZXRLZXlzID0gbmV3IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMoa2V5cywgW1xuICAgIHBhcmFtcy51c2VyS2V5UGF0aCB8fCB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gICAgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICAgIHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgXSk7XG5cbiAgY29uc3QgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXSA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGFkZHJlc3NUeXBlKSA9PiBjb2luLnN1cHBvcnRzQWRkcmVzc1R5cGUoYWRkcmVzc1R5cGUpICYmICFwYXJhbXMuaWdub3JlQWRkcmVzc1R5cGVzPy5pbmNsdWRlcyhhZGRyZXNzVHlwZSlcbiAgICAgICAgKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgIChxdWVyaWVzLCBhZGRyZXNzVHlwZSkgPT4gW1xuICAgICAgICAgICAgLi4ucXVlcmllcyxcbiAgICAgICAgICAgIHF1ZXJ5QmxvY2tjaGFpblVuc3BlbnRzUGF0aDxUTnVtYmVyPihjb2luLCBwYXJhbXMsIHdhbGxldEtleXMsIGdldEV4dGVybmFsQ2hhaW5Db2RlKGFkZHJlc3NUeXBlKSksXG4gICAgICAgICAgICBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGg8VE51bWJlcj4oY29pbiwgcGFyYW1zLCB3YWxsZXRLZXlzLCBnZXRJbnRlcm5hbENoYWluQ29kZShhZGRyZXNzVHlwZSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgW10gYXMgUHJvbWlzZTxXYWxsZXRVbnNwZW50PFROdW1iZXI+W10+W11cbiAgICAgICAgKVxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgLy8gRXhlY3V0ZSB0aGUgcXVlcmllcyBhbmQgZ2F0aGVyIHRoZSB1bnNwZW50c1xuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtPFROdW1iZXI+KHVuc3BlbnRzLCBjb2luLmFtb3VudFR5cGUpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcigpO1xuICB9XG5cbiAgLy8gQnVpbGQgdGhlIHRyYW5zYWN0aW9uXG4gIGNvbnN0IHRyYW5zYWN0aW9uQnVpbGRlciA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yazxUTnVtYmVyPihjb2luLm5ldHdvcmspO1xuICBjb25zdCB0eEluZm8gPSB7fSBhcyBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uPFROdW1iZXI+O1xuXG4gIGNvbnN0IGZlZVBlckJ5dGU6IG51bWJlciA9IGF3YWl0IGdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoY29pbiwgeyBkZWZhdWx0VmFsdWU6IDEwMCB9KTtcblxuICAvLyBLUlMgcmVjb3ZlcnkgdHJhbnNhY3Rpb25zIGhhdmUgYSAybmQgb3V0cHV0IHRvIHBheSB0aGUgcmVjb3ZlcnkgZmVlLCBsaWtlIHBheWdvIGZlZXMuIFVzZSBwMndzaCBvdXRwdXRzIGJlY2F1c2VcbiAgLy8gdGhleSBhcmUgdGhlIGxhcmdlc3Qgb3V0cHV0cyBhbmQgdGh1cyB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgdG8gdXNlIGluIGNhbGN1bGF0aW5nIGZlZXMuIEFsc28gdXNlXG4gIC8vIHNlZ3dpdCBvdmVyaGVhZCBzaXplIGFuZCBwMnNoIGlucHV0cyBmb3IgdGhlIHNhbWUgcmVhc29uLlxuICBjb25zdCBvdXRwdXRTaXplID0gKGlzS3JzUmVjb3ZlcnkgPyAyIDogMSkgKiBWaXJ0dWFsU2l6ZXMudHhQMndzaE91dHB1dFNpemU7XG4gIGNvbnN0IGFwcHJveGltYXRlU2l6ZSA9IFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBvdXRwdXRTaXplICsgVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHVuc3BlbnRzLmxlbmd0aDtcbiAgY29uc3QgYXBwcm94aW1hdGVGZWU6IFROdW1iZXIgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihhcHByb3hpbWF0ZVNpemUgKiBmZWVQZXJCeXRlLCBjb2luLmFtb3VudFR5cGUpO1xuXG4gIC8vIENvbnN0cnVjdCBhIHRyYW5zYWN0aW9uXG4gIHR4SW5mby5pbnB1dHMgPSB1bnNwZW50cztcblxuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PiB7XG4gICAgY29uc3QgeyB0eGlkLCB2b3V0IH0gPSBwYXJzZU91dHB1dElkKHVuc3BlbnQuaWQpO1xuICAgIHRyYW5zYWN0aW9uQnVpbGRlci5hZGRJbnB1dChcbiAgICAgIHR4aWQsXG4gICAgICB2b3V0LFxuICAgICAgMHhmZmZmZmZmZixcbiAgICAgIHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCh1bnNwZW50LmFkZHJlc3MsIGNvaW4ubmV0d29yayksXG4gICAgICB1bnNwZW50LnZhbHVlXG4gICAgKTtcbiAgfSk7XG5cbiAgbGV0IGtyc0ZlZTogVE51bWJlciA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KDAsIGNvaW4uYW1vdW50VHlwZSk7XG4gIGlmIChpc0tyc1JlY292ZXJ5ICYmIHBhcmFtcy5rcnNQcm92aWRlcikge1xuICAgIHRyeSB7XG4gICAgICBrcnNGZWUgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICAgICAgYXdhaXQgY2FsY3VsYXRlRmVlQW1vdW50KGNvaW4sIHsgcHJvdmlkZXI6IHBhcmFtcy5rcnNQcm92aWRlciB9KSxcbiAgICAgICAgY29pbi5hbW91bnRUeXBlXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gRG9uJ3QgbGV0IHRoaXMgZXJyb3IgYmxvY2sgdGhlIHJlY292ZXJ5IC1cbiAgICAgIGNvbnNvbGUuZGlyKGVycik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICBCaWdJbnQodG90YWxJbnB1dEFtb3VudCkgLSBCaWdJbnQoYXBwcm94aW1hdGVGZWUpIC0gQmlnSW50KGtyc0ZlZSksXG4gICAgY29pbi5hbW91bnRUeXBlXG4gICk7XG5cbiAgaWYgKHJlY292ZXJ5QW1vdW50IDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdGhpcyB3YWxsZXRcXCdzIGJhbGFuY2UgaXMgdG9vIGxvdyB0byBwYXkgdGhlIGZlZXMgc3BlY2lmaWVkIGJ5IHRoZSBLUlMgcHJvdmlkZXIuIFxuICAgICAgICAgIEV4aXN0aW5nIGJhbGFuY2Ugb24gd2FsbGV0OiAke3RvdGFsSW5wdXRBbW91bnQudG9TdHJpbmcoKX0uIEVzdGltYXRlZCBuZXR3b3JrIGZlZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gICAgICAgICAgOiAke2FwcHJveGltYXRlRmVlLnRvU3RyaW5nKCl9LCBLUlMgZmVlIHRvIHBheTogJHtrcnNGZWUudG9TdHJpbmcoKX0uIEFmdGVyIGRlZHVjdGluZyBmZWVzLCB5b3VyIHRvdGFsIFxuICAgICAgICAgIHJlY292ZXJhYmxlIGJhbGFuY2UgaXMgJHtyZWNvdmVyeUFtb3VudC50b1N0cmluZygpfWApO1xuICB9XG5cbiAgdHJhbnNhY3Rpb25CdWlsZGVyLmFkZE91dHB1dChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgcmVjb3ZlcnlBbW91bnQpO1xuXG4gIGlmIChrcnNQcm92aWRlciAmJiBrcnNGZWUgPiAwKSB7XG4gICAgaWYgKCFrcnNQcm92aWRlci5mZWVBZGRyZXNzZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihga2V5UHJvdmlkZXIgbXVzdCBkZWZpbmUgZmVlQWRkcmVzc2VzYCk7XG4gICAgfVxuXG4gICAgY29uc3Qga3JzRmVlQWRkcmVzcyA9IGtyc1Byb3ZpZGVyLmZlZUFkZHJlc3Nlc1tjb2luLmdldENoYWluKCldO1xuXG4gICAgaWYgKCFrcnNGZWVBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgS1JTIHByb3ZpZGVyIGhhcyBub3QgY29uZmlndXJlZCB0aGVpciBmZWUgc3RydWN0dXJlIHlldCAtIHJlY292ZXJ5IGNhbm5vdCBiZSBjb21wbGV0ZWQnKTtcbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuYWRkT3V0cHV0KGtyc0ZlZUFkZHJlc3MsIGtyc0ZlZSk7XG4gIH1cblxuICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgY29uc3QgdHhIZXggPSB0cmFuc2FjdGlvbkJ1aWxkZXIuYnVpbGRJbmNvbXBsZXRlKCkudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG4gICAgcmV0dXJuIGZvcm1hdEZvck9mZmxpbmVWYXVsdChjb2luLmdldENoYWluKCksIHR4SW5mbyBhcyBPZmZsaW5lVmF1bHRUeEluZm88VE51bWJlcj4sIHR4SGV4KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24oXG4gICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIsXG4gICAgICB1bnNwZW50cyxcbiAgICAgIG5ldyBXYWxsZXRVbnNwZW50U2lnbmVyPFJvb3RXYWxsZXRLZXlzPih3YWxsZXRLZXlzLCB3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwKSxcbiAgICAgIHsgaXNMYXN0U2lnbmF0dXJlOiBmYWxzZSB9XG4gICAgKTtcbiAgICBpZiAoIWlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHRyYW5zYWN0aW9uID0gc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uKFxuICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgICAgdW5zcGVudHMsXG4gICAgICAgIG5ldyBXYWxsZXRVbnNwZW50U2lnbmVyPFJvb3RXYWxsZXRLZXlzPih3YWxsZXRLZXlzLCB3YWxsZXRLZXlzLmJhY2t1cCwgd2FsbGV0S2V5cy51c2VyKSxcbiAgICAgICAgeyBpc0xhc3RTaWduYXR1cmU6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0eEluZm8udHJhbnNhY3Rpb25IZXggPSB0cmFuc2FjdGlvbi50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGxldCB0cmFuc2FjdGlvbkRldGFpbHM7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uRGV0YWlscyA9IGF3YWl0IFNtYXJ0Yml0QXBpLmZvckNvaW4oY29pbi5nZXRDaGFpbigpKS5nZXRUcmFuc2FjdGlvbkRldGFpbHModHJhbnNhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNvbWUgY29pbnMgZG9uJ3QgaGF2ZSBhIHJlbGlhYmxlIHRoaXJkIHBhcnR5IHZlcmlmaWNhdGlvbiBlbmRwb2ludCwgb3Igc29tZXRpbWVzIHRoZSB0aGlyZCBwYXJ0eSBlbmRwb2ludFxuICAgICAgLy8gY291bGQgYmUgdW5hdmFpbGFibGUgZHVlIHRvIHNlcnZpY2Ugb3V0YWdlLCBzbyB3ZSBjb250aW51ZSB3aXRob3V0IHZlcmlmaWNhdGlvbiBmb3IgdGhvc2UgY29pbnMsIGJ1dCB3ZSB3aWxsXG4gICAgICAvLyBsZXQgdXNlcnMga25vdyB0aGF0IHRoZXkgc2hvdWxkIHZlcmlmeSB0aGVpciBvd25cbiAgICAgIC8vIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgcGlwZWQgdG8gV1JXIGFuZCBkaXNwbGF5ZWQgb24gdGhlIFVJXG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEFwaU5vdEltcGxlbWVudGVkRXJyb3IgfHwgZSBpbnN0YW5jZW9mIEFwaVJlcXVlc3RFcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZygnUGxlYXNlIHZlcmlmeSB5b3VyIHRyYW5zYWN0aW9uIGJ5IGRlY29kaW5nIHRoZSB0eCBoZXggdXNpbmcgYSB0aGlyZC1wYXJ0eSBhcGkgb2YgeW91ciBjaG9pY2UnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRyYW5zYWN0aW9uRGV0YWlscykge1xuICAgICAgLyoqXG4gICAgICAgKiBWZXJpZnkgdGhhdCB0aGUgdHhoZXggdXNlciBzaWducyBjb3JyZXNwb25kIHRvIHRoZSBjb3JyZWN0IHR4IHRoZXkgaW50ZW5kZWRcbiAgICAgICAqIGJ5IDEpIGdldHRpbmcgYmFjayB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgdHhoZXhcbiAgICAgICAqIGFuZCB0aGVuIDIpIGNvbXB1dGUgdGhlIHR4aWQgKGhhc2gpLCBoMSBvZiB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvbiAzKSBjb21wYXJlIGgxXG4gICAgICAgKiB0byB0aGUgdHhpZCAoaGFzaCkgb2YgdGhlIHRyYW5zYWN0aW9uIChpbmNsdWRpbmcgdW5zcGVudCBpbmZvKSB3ZSBjb25zdHJ1Y3RlZFxuICAgICAgICovXG4gICAgICBpZiAodHJhbnNhY3Rpb25EZXRhaWxzLlR4SWQgIT09IHRyYW5zYWN0aW9uLmdldElkKCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3R4aGFzaC90eGlkIHJldHVybmVkIGJ5IGJsb2NrZXhwbG9yZXI6ICcsIHRyYW5zYWN0aW9uRGV0YWlscy5UeElkKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3R4aGFzaC90eGlkIG9mIHRoZSB0cmFuc2FjdGlvbiBiaXRnbyBjb25zdHJ1Y3RlZCcsIHRyYW5zYWN0aW9uLmdldElkKCkpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luY29uc2lzdGVudCByZWNvdmVyeSB0cmFuc2FjdGlvbiBpZCcpO1xuICAgICAgfVxuICAgICAgdHhJbmZvLnR4ID0gdHJhbnNhY3Rpb25EZXRhaWxzO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgdHhJbmZvLmNvaW4gPSBjb2luLmdldENoYWluKCk7XG4gICAgdHhJbmZvLmJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXk7XG4gICAgdHhJbmZvLnJlY292ZXJ5QW1vdW50ID0gcmVjb3ZlcnlBbW91bnQ7XG4gIH1cblxuICByZXR1cm4gdHhJbmZvO1xufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as utxolib from '@bitgo/utxo-lib';
|
|
2
|
-
declare type Unspent = utxolib.bitgo.Unspent
|
|
2
|
+
declare type Unspent<TNumber extends number | bigint = number> = utxolib.bitgo.Unspent<TNumber>;
|
|
3
3
|
import { BitGoBase, IWallet } from '@bitgo/sdk-core';
|
|
4
4
|
import { AbstractUtxoCoin, TransactionInfo } from '../abstractUtxoCoin';
|
|
5
5
|
export interface ExplorerTxInfo {
|
|
@@ -17,9 +17,10 @@ export declare class BitgoPublicApi {
|
|
|
17
17
|
/**
|
|
18
18
|
* Fetch unspent transaction outputs using IMS unspents API
|
|
19
19
|
* @param addresses
|
|
20
|
+
* @param amountType
|
|
20
21
|
* @returns {*}
|
|
21
22
|
*/
|
|
22
|
-
getUnspentInfo(addresses: string[]): Promise<Unspent[]>;
|
|
23
|
+
getUnspentInfo<TNumber extends number | bigint = number>(addresses: string[], amountType?: 'number' | 'bigint'): Promise<Unspent<TNumber>[]>;
|
|
23
24
|
}
|
|
24
25
|
export interface BuildRecoveryTransactionOptions {
|
|
25
26
|
wallet: string;
|
|
@@ -32,23 +33,23 @@ declare type FeeInfo = {
|
|
|
32
33
|
fee: number;
|
|
33
34
|
payGoFee: number;
|
|
34
35
|
};
|
|
35
|
-
export interface CrossChainRecoveryUnsigned {
|
|
36
|
+
export interface CrossChainRecoveryUnsigned<TNumber extends number | bigint = number> {
|
|
36
37
|
txHex: string;
|
|
37
|
-
txInfo: TransactionInfo
|
|
38
|
+
txInfo: TransactionInfo<TNumber>;
|
|
38
39
|
walletId: string;
|
|
39
40
|
feeInfo: FeeInfo;
|
|
40
41
|
address: string;
|
|
41
42
|
coin: string;
|
|
42
43
|
}
|
|
43
|
-
export interface CrossChainRecoverySigned {
|
|
44
|
+
export interface CrossChainRecoverySigned<TNumber extends number | bigint = number> {
|
|
44
45
|
version: 1 | 2;
|
|
45
46
|
txHex: string;
|
|
46
|
-
txInfo: TransactionInfo
|
|
47
|
+
txInfo: TransactionInfo<TNumber>;
|
|
47
48
|
walletId: string;
|
|
48
49
|
sourceCoin: string;
|
|
49
50
|
recoveryCoin: string;
|
|
50
51
|
recoveryAddress?: string;
|
|
51
|
-
recoveryAmount?:
|
|
52
|
+
recoveryAmount?: TNumber;
|
|
52
53
|
}
|
|
53
54
|
declare type WalletV1 = {
|
|
54
55
|
keychains: {
|
|
@@ -91,6 +92,6 @@ declare type RecoverParams = {
|
|
|
91
92
|
* @param {BitGoBase} bitgo
|
|
92
93
|
* @param {RecoverParams} params
|
|
93
94
|
*/
|
|
94
|
-
export declare function recoverCrossChain(bitgo: BitGoBase, params: RecoverParams): Promise<CrossChainRecoverySigned | CrossChainRecoveryUnsigned
|
|
95
|
+
export declare function recoverCrossChain<TNumber extends number | bigint = number>(bitgo: BitGoBase, params: RecoverParams): Promise<CrossChainRecoverySigned<TNumber> | CrossChainRecoveryUnsigned<TNumber>>;
|
|
95
96
|
export {};
|
|
96
97
|
//# sourceMappingURL=crossChainRecovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossChainRecovery.d.ts","sourceRoot":"","sources":["../../../src/recovery/crossChainRecovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crossChainRecovery.d.ts","sourceRoot":"","sources":["../../../src/recovery/crossChainRecovery.ts"],"names":[],"mappings":"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"}
|