@bitgo/sdk-coin-ada 4.12.9 → 4.13.1
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/.mocharc.yml +1 -1
- package/CHANGELOG.md +10 -0
- package/LICENSE +191 -0
- package/dist/src/ada.d.ts +116 -0
- package/dist/src/ada.d.ts.map +1 -0
- package/dist/src/ada.js +548 -0
- package/dist/src/adaToken.d.ts +38 -0
- package/dist/src/adaToken.d.ts.map +1 -0
- package/dist/src/adaToken.js +69 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +22 -0
- package/dist/src/lib/index.d.ts +15 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +65 -0
- package/dist/src/lib/keyPair.d.ts +20 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +91 -0
- package/dist/src/lib/messages/cip8/cip8Message.d.ts +25 -0
- package/dist/src/lib/messages/cip8/cip8Message.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/cip8Message.js +140 -0
- package/dist/src/lib/messages/cip8/cip8MessageBuilder.d.ts +19 -0
- package/dist/src/lib/messages/cip8/cip8MessageBuilder.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/cip8MessageBuilder.js +27 -0
- package/dist/src/lib/messages/cip8/index.d.ts +3 -0
- package/dist/src/lib/messages/cip8/index.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/index.js +19 -0
- package/dist/src/lib/messages/cip8/utils.d.ts +24 -0
- package/dist/src/lib/messages/cip8/utils.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/utils.js +73 -0
- package/dist/src/lib/messages/index.d.ts +3 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +19 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/messages/messageBuilderFactory.js +20 -0
- package/dist/src/lib/stakingActivateBuilder.d.ts +24 -0
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingActivateBuilder.js +88 -0
- package/dist/src/lib/stakingBaseClaimBuilder.d.ts +20 -0
- package/dist/src/lib/stakingBaseClaimBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingBaseClaimBuilder.js +35 -0
- package/dist/src/lib/stakingClaimRewardsBuilder.d.ts +10 -0
- package/dist/src/lib/stakingClaimRewardsBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingClaimRewardsBuilder.js +22 -0
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +22 -0
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingDeactivateBuilder.js +75 -0
- package/dist/src/lib/stakingPledgeBuilder.d.ts +23 -0
- package/dist/src/lib/stakingPledgeBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingPledgeBuilder.js +43 -0
- package/dist/src/lib/stakingWithdrawBuilder.d.ts +12 -0
- package/dist/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingWithdrawBuilder.js +22 -0
- package/dist/src/lib/transaction.d.ts +133 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +371 -0
- package/dist/src/lib/transactionBuilder.d.ts +59 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +445 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +36 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +92 -0
- package/dist/src/lib/transferBuilder.d.ts +14 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +27 -0
- package/dist/src/lib/utils.d.ts +52 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +277 -0
- package/dist/src/lib/voteDelegationBuilder.d.ts +24 -0
- package/dist/src/lib/voteDelegationBuilder.d.ts.map +1 -0
- package/dist/src/lib/voteDelegationBuilder.js +84 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts +14 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/walletInitializationBuilder.js +24 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +13 -0
- package/dist/src/tada.d.ts +21 -0
- package/dist/src/tada.d.ts.map +1 -0
- package/dist/src/tada.js +26 -0
- package/package.json +7 -7
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
+
import { Transaction } from './transaction';
|
|
3
|
+
import { StakingBaseClaimBuilder } from './stakingBaseClaimBuilder';
|
|
4
|
+
/**
|
|
5
|
+
* Transaction builder for withdrawing unstaked ADAs.
|
|
6
|
+
*/
|
|
7
|
+
export declare class StakingWithdrawBuilder extends StakingBaseClaimBuilder {
|
|
8
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
9
|
+
/** @inheritdoc */
|
|
10
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=stakingWithdrawBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakingWithdrawBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/stakingWithdrawBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,uBAAuB;gBACrD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CAK5D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StakingWithdrawBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
5
|
+
const stakingBaseClaimBuilder_1 = require("./stakingBaseClaimBuilder");
|
|
6
|
+
/**
|
|
7
|
+
* Transaction builder for withdrawing unstaked ADAs.
|
|
8
|
+
*/
|
|
9
|
+
class StakingWithdrawBuilder extends stakingBaseClaimBuilder_1.StakingBaseClaimBuilder {
|
|
10
|
+
constructor(_coinConfig) {
|
|
11
|
+
super(_coinConfig);
|
|
12
|
+
this._type = sdk_core_1.TransactionType.StakingWithdraw;
|
|
13
|
+
}
|
|
14
|
+
/** @inheritdoc */
|
|
15
|
+
async buildImplementation() {
|
|
16
|
+
const tx = await super.buildImplementation();
|
|
17
|
+
tx.setTransactionType(sdk_core_1.TransactionType.StakingWithdraw);
|
|
18
|
+
return tx;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.StakingWithdrawBuilder = StakingWithdrawBuilder;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dpdGhkcmF3QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvc3Rha2luZ1dpdGhkcmF3QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FBa0Q7QUFHbEQsdUVBQW9FO0FBRXBFOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxpREFBdUI7SUFDakUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRywwQkFBZSxDQUFDLGVBQWUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxNQUFNLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNGO0FBWkQsd0RBWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBTdGFraW5nQmFzZUNsYWltQnVpbGRlciB9IGZyb20gJy4vc3Rha2luZ0Jhc2VDbGFpbUJ1aWxkZXInO1xuXG4vKipcbiAqIFRyYW5zYWN0aW9uIGJ1aWxkZXIgZm9yIHdpdGhkcmF3aW5nIHVuc3Rha2VkIEFEQXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFraW5nV2l0aGRyYXdCdWlsZGVyIGV4dGVuZHMgU3Rha2luZ0Jhc2VDbGFpbUJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICAgIHR4LnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KTtcbiAgICByZXR1cm4gdHg7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { BaseKey, BaseTransaction, TransactionType } from '@bitgo/sdk-core';
|
|
2
|
+
import * as CardanoWasm from '@emurgo/cardano-serialization-lib-nodejs';
|
|
3
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
4
|
+
export interface TransactionInput {
|
|
5
|
+
transaction_id: string;
|
|
6
|
+
transaction_index: number;
|
|
7
|
+
}
|
|
8
|
+
export interface Asset {
|
|
9
|
+
policy_id: string;
|
|
10
|
+
asset_name: string;
|
|
11
|
+
quantity: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TransactionOutput {
|
|
14
|
+
address: string;
|
|
15
|
+
amount: string;
|
|
16
|
+
multiAssets?: CardanoWasm.MultiAsset;
|
|
17
|
+
}
|
|
18
|
+
export interface Witness {
|
|
19
|
+
publicKey: string;
|
|
20
|
+
signature: string;
|
|
21
|
+
}
|
|
22
|
+
export declare enum CertType {
|
|
23
|
+
StakeKeyRegistration = 0,
|
|
24
|
+
StakeKeyDelegation = 1,
|
|
25
|
+
StakeKeyDeregistration = 2,
|
|
26
|
+
StakePoolRegistration = 3,
|
|
27
|
+
VoteDelegation = 4
|
|
28
|
+
}
|
|
29
|
+
export interface Cert {
|
|
30
|
+
type: CertType;
|
|
31
|
+
stakeCredentialHash?: string;
|
|
32
|
+
poolKeyHash?: string;
|
|
33
|
+
dRepId?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface Withdrawal {
|
|
36
|
+
stakeAddress: string;
|
|
37
|
+
value: string;
|
|
38
|
+
}
|
|
39
|
+
export type StakeKeyRegistrationCert = Cert;
|
|
40
|
+
export type StakeKeyDelegationCert = Cert;
|
|
41
|
+
export interface StakePoolRegistrationCert extends Cert {
|
|
42
|
+
vrfKeyHash: string;
|
|
43
|
+
pledge: string;
|
|
44
|
+
cost: string;
|
|
45
|
+
marginNumerator: string;
|
|
46
|
+
marginDenominator: string;
|
|
47
|
+
rewardAccount: string;
|
|
48
|
+
poolOwners: string[];
|
|
49
|
+
}
|
|
50
|
+
export interface PledgeDetails {
|
|
51
|
+
stakeKeyRegistration?: StakeKeyRegistrationCert;
|
|
52
|
+
stakeKeyDelegation?: StakeKeyDelegationCert;
|
|
53
|
+
stakePoolRegistration: StakePoolRegistrationCert;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The transaction data returned from the toJson() function of a transaction
|
|
57
|
+
*/
|
|
58
|
+
export interface TxData {
|
|
59
|
+
id: string;
|
|
60
|
+
type: TransactionType;
|
|
61
|
+
inputs: TransactionInput[];
|
|
62
|
+
outputs: TransactionOutput[];
|
|
63
|
+
witnesses: Witness[];
|
|
64
|
+
certs: Cert[];
|
|
65
|
+
withdrawals: Withdrawal[];
|
|
66
|
+
pledgeDetails?: PledgeDetails;
|
|
67
|
+
}
|
|
68
|
+
export declare class Transaction extends BaseTransaction {
|
|
69
|
+
private _transaction;
|
|
70
|
+
private _fee;
|
|
71
|
+
private _pledgeDetails?;
|
|
72
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
73
|
+
get transaction(): CardanoWasm.Transaction;
|
|
74
|
+
set transaction(tx: CardanoWasm.Transaction);
|
|
75
|
+
/** @inheritdoc */
|
|
76
|
+
canSign(key: BaseKey): boolean;
|
|
77
|
+
toBroadcastFormat(): string;
|
|
78
|
+
/** @inheritdoc */
|
|
79
|
+
toJson(): TxData;
|
|
80
|
+
/**
|
|
81
|
+
* Build input and output field for this transaction
|
|
82
|
+
*
|
|
83
|
+
*/
|
|
84
|
+
loadInputsAndOutputs(): void;
|
|
85
|
+
/** @inheritdoc */
|
|
86
|
+
get signablePayload(): Buffer;
|
|
87
|
+
/**
|
|
88
|
+
* Sets this transaction payload
|
|
89
|
+
*
|
|
90
|
+
* @param rawTx
|
|
91
|
+
*/
|
|
92
|
+
fromRawTransaction(rawTx: string): void;
|
|
93
|
+
private loadStakeKeyRegistration;
|
|
94
|
+
private loadStakeKeyDelegation;
|
|
95
|
+
private loadStakePoolRegistration;
|
|
96
|
+
/**
|
|
97
|
+
* Set the transaction type.
|
|
98
|
+
*
|
|
99
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
100
|
+
*/
|
|
101
|
+
setTransactionType(transactionType: TransactionType): void;
|
|
102
|
+
/** @inheritdoc */
|
|
103
|
+
explainTransaction(): {
|
|
104
|
+
outputs: {
|
|
105
|
+
amount: string;
|
|
106
|
+
address: string;
|
|
107
|
+
}[];
|
|
108
|
+
certificates: Cert[];
|
|
109
|
+
changeOutputs: string[];
|
|
110
|
+
outputAmount: string;
|
|
111
|
+
fee: {
|
|
112
|
+
fee: string;
|
|
113
|
+
};
|
|
114
|
+
displayOrder: string[];
|
|
115
|
+
id: string;
|
|
116
|
+
changeAmount: string;
|
|
117
|
+
type: string;
|
|
118
|
+
withdrawals: Withdrawal[];
|
|
119
|
+
pledgeDetails?: PledgeDetails;
|
|
120
|
+
};
|
|
121
|
+
getPledgeDetails(): PledgeDetails | undefined;
|
|
122
|
+
/**
|
|
123
|
+
* Get transaction fee
|
|
124
|
+
*/
|
|
125
|
+
get getFee(): string;
|
|
126
|
+
/**
|
|
127
|
+
* Set transaction fee
|
|
128
|
+
*
|
|
129
|
+
* @param fee
|
|
130
|
+
*/
|
|
131
|
+
fee(fee: string): void;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.Transaction = exports.CertType = void 0;
|
|
40
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
41
|
+
const CardanoWasm = __importStar(require("@emurgo/cardano-serialization-lib-nodejs"));
|
|
42
|
+
const keyPair_1 = require("./keyPair");
|
|
43
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
44
|
+
var CertType;
|
|
45
|
+
(function (CertType) {
|
|
46
|
+
CertType[CertType["StakeKeyRegistration"] = 0] = "StakeKeyRegistration";
|
|
47
|
+
CertType[CertType["StakeKeyDelegation"] = 1] = "StakeKeyDelegation";
|
|
48
|
+
CertType[CertType["StakeKeyDeregistration"] = 2] = "StakeKeyDeregistration";
|
|
49
|
+
CertType[CertType["StakePoolRegistration"] = 3] = "StakePoolRegistration";
|
|
50
|
+
CertType[CertType["VoteDelegation"] = 4] = "VoteDelegation";
|
|
51
|
+
})(CertType || (exports.CertType = CertType = {}));
|
|
52
|
+
class Transaction extends sdk_core_1.BaseTransaction {
|
|
53
|
+
constructor(coinConfig) {
|
|
54
|
+
super(coinConfig);
|
|
55
|
+
}
|
|
56
|
+
get transaction() {
|
|
57
|
+
return this._transaction;
|
|
58
|
+
}
|
|
59
|
+
set transaction(tx) {
|
|
60
|
+
this._transaction = tx;
|
|
61
|
+
this._id = Buffer.from(CardanoWasm.hash_transaction(tx.body()).to_bytes()).toString('hex');
|
|
62
|
+
}
|
|
63
|
+
/** @inheritdoc */
|
|
64
|
+
canSign(key) {
|
|
65
|
+
try {
|
|
66
|
+
new keyPair_1.KeyPair({ prv: key.key });
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
toBroadcastFormat() {
|
|
74
|
+
if (!this._transaction) {
|
|
75
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
76
|
+
}
|
|
77
|
+
return Buffer.from(this._transaction.to_bytes()).toString('hex');
|
|
78
|
+
}
|
|
79
|
+
/** @inheritdoc */
|
|
80
|
+
toJson() {
|
|
81
|
+
if (!this._transaction) {
|
|
82
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
83
|
+
}
|
|
84
|
+
const result = {
|
|
85
|
+
id: this.id,
|
|
86
|
+
type: this._type,
|
|
87
|
+
inputs: [],
|
|
88
|
+
outputs: [],
|
|
89
|
+
witnesses: [],
|
|
90
|
+
certs: [],
|
|
91
|
+
withdrawals: [],
|
|
92
|
+
};
|
|
93
|
+
for (let i = 0; i < this._transaction.body().inputs().len(); i++) {
|
|
94
|
+
const input = this._transaction.body().inputs().get(i);
|
|
95
|
+
result.inputs.push({
|
|
96
|
+
transaction_id: Buffer.from(input.transaction_id().to_bytes()).toString('hex'),
|
|
97
|
+
transaction_index: input.index(),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
for (let i = 0; i < this._transaction.body().outputs().len(); i++) {
|
|
101
|
+
const output = this._transaction.body().outputs().get(i);
|
|
102
|
+
result.outputs.push({
|
|
103
|
+
address: utils_1.default.getAddressString(output.address()),
|
|
104
|
+
amount: output.amount().coin().to_str(),
|
|
105
|
+
multiAssets: output.amount().multiasset() || undefined,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (this._transaction.body().certs()) {
|
|
109
|
+
for (let i = 0; i < this._transaction.body().certs().len(); i++) {
|
|
110
|
+
const cert = this._transaction.body().certs().get(i);
|
|
111
|
+
if (cert.as_stake_registration() !== undefined) {
|
|
112
|
+
const stakeRegistration = cert.as_stake_registration();
|
|
113
|
+
result.certs.push({
|
|
114
|
+
type: CertType.StakeKeyRegistration,
|
|
115
|
+
stakeCredentialHash: Buffer.from(stakeRegistration.stake_credential().to_bytes()).toString('hex'),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (cert.as_stake_deregistration() !== undefined) {
|
|
119
|
+
const stakeDeregistration = cert.as_stake_deregistration();
|
|
120
|
+
result.certs.push({
|
|
121
|
+
type: CertType.StakeKeyDeregistration,
|
|
122
|
+
stakeCredentialHash: Buffer.from(stakeDeregistration.stake_credential().to_bytes()).toString('hex'),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (cert.as_stake_delegation() !== undefined) {
|
|
126
|
+
const stakeDelegation = cert.as_stake_delegation();
|
|
127
|
+
result.certs.push({
|
|
128
|
+
type: CertType.StakeKeyDelegation,
|
|
129
|
+
stakeCredentialHash: Buffer.from(stakeDelegation.stake_credential().to_bytes()).toString('hex'),
|
|
130
|
+
poolKeyHash: Buffer.from(stakeDelegation.pool_keyhash().to_bytes()).toString('hex'),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (cert.as_pool_registration() !== undefined) {
|
|
134
|
+
const stakePoolRegistration = cert.as_pool_registration();
|
|
135
|
+
result.certs.push({
|
|
136
|
+
type: CertType.StakePoolRegistration,
|
|
137
|
+
poolKeyHash: Buffer.from(stakePoolRegistration.pool_params().operator().to_bytes()).toString('hex'),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (cert.as_vote_delegation() !== undefined) {
|
|
141
|
+
const voteDelegation = cert.as_vote_delegation();
|
|
142
|
+
result.certs.push({
|
|
143
|
+
type: CertType.VoteDelegation,
|
|
144
|
+
stakeCredentialHash: Buffer.from(voteDelegation.stake_credential().to_bytes()).toString('hex'),
|
|
145
|
+
dRepId: utils_1.default.getDRepIdFromDRep(voteDelegation.drep()),
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
result.pledgeDetails = this._pledgeDetails;
|
|
151
|
+
if (this._transaction.body().withdrawals()) {
|
|
152
|
+
const withdrawals = this._transaction.body().withdrawals();
|
|
153
|
+
const keys = withdrawals.keys();
|
|
154
|
+
for (let i = 0; i < keys.len(); i++) {
|
|
155
|
+
const rewardAddress = keys.get(i);
|
|
156
|
+
const reward = withdrawals.get(rewardAddress);
|
|
157
|
+
result.withdrawals.push({
|
|
158
|
+
stakeAddress: rewardAddress.to_address().to_bytes().toString(),
|
|
159
|
+
value: reward.to_str(),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (this._transaction.witness_set().vkeys() !== undefined) {
|
|
164
|
+
const vkeys = this._transaction.witness_set().vkeys();
|
|
165
|
+
for (let i = 0; i < vkeys.len(); i++) {
|
|
166
|
+
const vkey = this._transaction.witness_set().vkeys().get(i);
|
|
167
|
+
result.witnesses.push({
|
|
168
|
+
publicKey: vkey?.vkey().public_key().to_hex(),
|
|
169
|
+
signature: vkey?.signature().to_hex(),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Build input and output field for this transaction
|
|
177
|
+
*
|
|
178
|
+
*/
|
|
179
|
+
loadInputsAndOutputs() {
|
|
180
|
+
const outputs = [];
|
|
181
|
+
const inputs = [];
|
|
182
|
+
const tx_outputs = this._transaction.body().outputs();
|
|
183
|
+
for (let i = 0; i < tx_outputs.len(); i++) {
|
|
184
|
+
const output = tx_outputs.get(i);
|
|
185
|
+
outputs.push({
|
|
186
|
+
address: utils_1.default.getAddressString(output.address()),
|
|
187
|
+
value: output.amount().coin().to_str(),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
this._outputs = outputs;
|
|
191
|
+
this._inputs = inputs;
|
|
192
|
+
}
|
|
193
|
+
/** @inheritdoc */
|
|
194
|
+
get signablePayload() {
|
|
195
|
+
return Buffer.from(CardanoWasm.hash_transaction(this._transaction.body()).to_bytes());
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Sets this transaction payload
|
|
199
|
+
*
|
|
200
|
+
* @param rawTx
|
|
201
|
+
*/
|
|
202
|
+
fromRawTransaction(rawTx) {
|
|
203
|
+
if (CardanoWasm.Transaction === undefined) {
|
|
204
|
+
// a temp fix until we solve import problem in webpack
|
|
205
|
+
throw new sdk_core_1.NodeEnvironmentError('unable to load cardano serialization library');
|
|
206
|
+
}
|
|
207
|
+
const HEX_REGEX = /^[0-9a-fA-F]+$/;
|
|
208
|
+
const bufferRawTransaction = HEX_REGEX.test(rawTx) ? Buffer.from(rawTx, 'hex') : Buffer.from(rawTx, 'base64');
|
|
209
|
+
try {
|
|
210
|
+
const txn = CardanoWasm.Transaction.from_bytes(bufferRawTransaction);
|
|
211
|
+
this._transaction = txn;
|
|
212
|
+
this._id = Buffer.from(CardanoWasm.hash_transaction(txn.body()).to_bytes()).toString('hex');
|
|
213
|
+
this._type = sdk_core_1.TransactionType.Send;
|
|
214
|
+
if (this._transaction.body().certs()) {
|
|
215
|
+
const certs = [];
|
|
216
|
+
for (let i = 0; i < this._transaction.body().certs().len(); i++) {
|
|
217
|
+
const cert = this._transaction.body().certs().get(i);
|
|
218
|
+
certs.push(cert);
|
|
219
|
+
}
|
|
220
|
+
if (certs.some((c) => c.as_pool_registration() !== undefined)) {
|
|
221
|
+
this._type = sdk_core_1.TransactionType.StakingPledge;
|
|
222
|
+
const stakeKeyRegistration = certs.find((c) => c.as_stake_registration() !== undefined);
|
|
223
|
+
const stakeKeyDelegation = certs.find((c) => c.as_stake_delegation() !== undefined);
|
|
224
|
+
const stakePoolRegistration = certs.find((c) => c.as_pool_registration() !== undefined);
|
|
225
|
+
this._pledgeDetails = {
|
|
226
|
+
stakeKeyRegistration: this.loadStakeKeyRegistration(stakeKeyRegistration),
|
|
227
|
+
stakeKeyDelegation: this.loadStakeKeyDelegation(stakeKeyDelegation),
|
|
228
|
+
stakePoolRegistration: this.loadStakePoolRegistration(stakePoolRegistration),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
else if (certs.some((c) => c.as_stake_registration() !== undefined)) {
|
|
232
|
+
this._type = sdk_core_1.TransactionType.StakingActivate;
|
|
233
|
+
}
|
|
234
|
+
else if (certs.some((c) => c.as_stake_deregistration() !== undefined)) {
|
|
235
|
+
this._type = sdk_core_1.TransactionType.StakingDeactivate;
|
|
236
|
+
}
|
|
237
|
+
else if (certs.some((c) => c.as_vote_delegation() !== undefined)) {
|
|
238
|
+
this._type = sdk_core_1.TransactionType.VoteDelegation;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (this._transaction.body().withdrawals()) {
|
|
242
|
+
this._type = sdk_core_1.TransactionType.StakingWithdraw;
|
|
243
|
+
}
|
|
244
|
+
this._fee = txn.body().fee().to_str();
|
|
245
|
+
this.loadInputsAndOutputs();
|
|
246
|
+
if (this._transaction.witness_set().vkeys()) {
|
|
247
|
+
const vkeys = this._transaction.witness_set().vkeys();
|
|
248
|
+
for (let i = 0; i < vkeys.len(); i++) {
|
|
249
|
+
const vkey = vkeys.get(i);
|
|
250
|
+
this._signatures.push(vkey.signature().to_hex());
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (e) {
|
|
255
|
+
throw new sdk_core_1.InvalidTransactionError('unable to build transaction from raw');
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
loadStakeKeyRegistration(certificate) {
|
|
259
|
+
if (certificate === undefined) {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
const stakeRegistration = certificate.as_stake_registration();
|
|
263
|
+
if (stakeRegistration !== undefined && stakeRegistration.stake_credential().to_keyhash() !== undefined) {
|
|
264
|
+
return {
|
|
265
|
+
type: CertType.StakeKeyRegistration,
|
|
266
|
+
stakeCredentialHash: stakeRegistration.stake_credential().to_keyhash().to_hex(),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
loadStakeKeyDelegation(certificate) {
|
|
274
|
+
if (certificate === undefined) {
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
const stakeDelegation = certificate.as_stake_delegation();
|
|
278
|
+
if (stakeDelegation !== undefined && stakeDelegation.stake_credential().to_keyhash() !== undefined) {
|
|
279
|
+
return {
|
|
280
|
+
type: CertType.StakeKeyDelegation,
|
|
281
|
+
stakeCredentialHash: stakeDelegation.stake_credential().to_keyhash().to_hex(),
|
|
282
|
+
poolKeyHash: stakeDelegation.pool_keyhash().to_hex(),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
loadStakePoolRegistration(certificate) {
|
|
290
|
+
const poolRegistration = certificate.as_pool_registration();
|
|
291
|
+
const rewardAccount = poolRegistration.pool_params().reward_account();
|
|
292
|
+
const networkId = rewardAccount.to_address().network_id();
|
|
293
|
+
const owners = [];
|
|
294
|
+
for (let i = 0; i < poolRegistration.pool_params().pool_owners().len(); i++) {
|
|
295
|
+
const poolOwner = poolRegistration.pool_params().pool_owners().get(i);
|
|
296
|
+
const ownerStakeKey = CardanoWasm.Credential.from_keyhash(poolOwner);
|
|
297
|
+
owners.push(CardanoWasm.RewardAddress.new(networkId, ownerStakeKey).to_address().to_bech32());
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
type: CertType.StakePoolRegistration,
|
|
301
|
+
poolKeyHash: poolRegistration.pool_params().operator().to_hex(),
|
|
302
|
+
vrfKeyHash: poolRegistration.pool_params().vrf_keyhash().to_hex(),
|
|
303
|
+
pledge: poolRegistration.pool_params().pledge().to_str(),
|
|
304
|
+
cost: poolRegistration.pool_params().cost().to_str(),
|
|
305
|
+
marginNumerator: poolRegistration.pool_params().margin().numerator().to_str(),
|
|
306
|
+
marginDenominator: poolRegistration.pool_params().margin().denominator().to_str(),
|
|
307
|
+
rewardAccount: rewardAccount.to_address().to_bech32(),
|
|
308
|
+
poolOwners: owners,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Set the transaction type.
|
|
313
|
+
*
|
|
314
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
315
|
+
*/
|
|
316
|
+
setTransactionType(transactionType) {
|
|
317
|
+
this._type = transactionType;
|
|
318
|
+
}
|
|
319
|
+
/** @inheritdoc */
|
|
320
|
+
explainTransaction() {
|
|
321
|
+
const txJson = this.toJson();
|
|
322
|
+
const displayOrder = ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
|
|
323
|
+
const amount = txJson.outputs.map((o) => ({ amount: BigInt(o.amount) }));
|
|
324
|
+
const outputAmount = amount.reduce((p, n) => p + BigInt(n.amount), BigInt('0')).toString();
|
|
325
|
+
const type = this._type === sdk_core_1.TransactionType.Send
|
|
326
|
+
? 'Transfer'
|
|
327
|
+
: this._type === sdk_core_1.TransactionType.StakingActivate
|
|
328
|
+
? 'StakingActivate'
|
|
329
|
+
: this._type === sdk_core_1.TransactionType.StakingWithdraw
|
|
330
|
+
? 'StakingWithdraw'
|
|
331
|
+
: this._type === sdk_core_1.TransactionType.StakingDeactivate
|
|
332
|
+
? 'StakingDeactivate'
|
|
333
|
+
: this._type === sdk_core_1.TransactionType.StakingPledge
|
|
334
|
+
? 'StakingPledge'
|
|
335
|
+
: this._type === sdk_core_1.TransactionType.VoteDelegation
|
|
336
|
+
? 'VoteDelegation'
|
|
337
|
+
: 'undefined';
|
|
338
|
+
return {
|
|
339
|
+
displayOrder,
|
|
340
|
+
id: txJson.id,
|
|
341
|
+
outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.amount })),
|
|
342
|
+
outputAmount: outputAmount,
|
|
343
|
+
changeOutputs: [],
|
|
344
|
+
changeAmount: '0',
|
|
345
|
+
fee: { fee: this._fee },
|
|
346
|
+
type,
|
|
347
|
+
certificates: txJson.certs,
|
|
348
|
+
withdrawals: txJson.withdrawals,
|
|
349
|
+
pledgeDetails: this._pledgeDetails,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
getPledgeDetails() {
|
|
353
|
+
return this._pledgeDetails;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Get transaction fee
|
|
357
|
+
*/
|
|
358
|
+
get getFee() {
|
|
359
|
+
return this._fee;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Set transaction fee
|
|
363
|
+
*
|
|
364
|
+
* @param fee
|
|
365
|
+
*/
|
|
366
|
+
fee(fee) {
|
|
367
|
+
this._fee = fee;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
exports.Transaction = Transaction;
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQU95QjtBQUN6QixzRkFBd0U7QUFDeEUsdUNBQW9DO0FBRXBDLG9EQUErQjtBQXVCL0IsSUFBWSxRQU1YO0FBTkQsV0FBWSxRQUFRO0lBQ2xCLHVFQUFvQixDQUFBO0lBQ3BCLG1FQUFrQixDQUFBO0lBQ2xCLDJFQUFzQixDQUFBO0lBQ3RCLHlFQUFxQixDQUFBO0lBQ3JCLDJEQUFjLENBQUE7QUFDaEIsQ0FBQyxFQU5XLFFBQVEsd0JBQVIsUUFBUSxRQU1uQjtBQWdERCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQUs5QyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxFQUEyQjtRQUN6QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQVk7UUFDbEIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxpQkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8s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QU0sRUFBRSxDQUFDLENBQUM7WUFDOUUsWUFBWSxFQUFFLFlBQVk7WUFDMUIsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUc7WUFDakIsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdkIsSUFBSTtZQUNKLFlBQVksRUFBRSxNQUFNLENBQUMsS0FBSztZQUMxQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQ25DLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxHQUFXO1FBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBdFdELGtDQXNXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBOb2RlRW52aXJvbm1lbnRFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgQ2FyZGFub1dhc20gZnJvbSAnQGVtdXJnby9jYXJkYW5vLXNlcmlhbGl6YXRpb24tbGliLW5vZGVqcyc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgYWRhVXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbnB1dCB7XG4gIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gIHRyYW5zYWN0aW9uX2luZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xuICBwb2xpY3lfaWQ6IHN0cmluZztcbiAgYXNzZXRfbmFtZTogc3RyaW5nO1xuICBxdWFudGl0eTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbiAgbXVsdGlBc3NldHM/OiBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdG5lc3Mge1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59XG5leHBvcnQgZW51bSBDZXJ0VHlwZSB7XG4gIFN0YWtlS2V5UmVnaXN0cmF0aW9uLFxuICBTdGFrZUtleURlbGVnYXRpb24sXG4gIFN0YWtlS2V5RGVyZWdpc3RyYXRpb24sXG4gIFN0YWtlUG9vbFJlZ2lzdHJhdGlvbixcbiAgVm90ZURlbGVnYXRpb24sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VydCB7XG4gIHR5cGU6IENlcnRUeXBlO1xuICBzdGFrZUNyZWRlbnRpYWxIYXNoPzogc3RyaW5nO1xuICBwb29sS2V5SGFzaD86IHN0cmluZztcbiAgZFJlcElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhkcmF3YWwge1xuICBzdGFrZUFkZHJlc3M6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU3Rha2VLZXlSZWdpc3RyYXRpb25DZXJ0ID0gQ2VydDtcblxuZXhwb3J0IHR5cGUgU3Rha2VLZXlEZWxlZ2F0aW9uQ2VydCA9IENlcnQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Rha2VQb29sUmVnaXN0cmF0aW9uQ2VydCBleHRlbmRzIENlcnQge1xuICB2cmZLZXlIYXNoOiBzdHJpbmc7XG4gIHBsZWRnZTogc3RyaW5nO1xuICBjb3N0OiBzdHJpbmc7XG4gIG1hcmdpbk51bWVyYXRvcjogc3RyaW5nO1xuICBtYXJnaW5EZW5vbWluYXRvcjogc3RyaW5nO1xuICByZXdhcmRBY2NvdW50OiBzdHJpbmc7XG4gIHBvb2xPd25lcnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsZWRnZURldGFpbHMge1xuICBzdGFrZUtleVJlZ2lzdHJhdGlvbj86IFN0YWtlS2V5UmVnaXN0cmF0aW9uQ2VydDtcbiAgc3Rha2VLZXlEZWxlZ2F0aW9uPzogU3Rha2VLZXlEZWxlZ2F0aW9uQ2VydDtcbiAgc3Rha2VQb29sUmVnaXN0cmF0aW9uOiBTdGFrZVBvb2xSZWdpc3RyYXRpb25DZXJ0O1xufVxuXG4vKipcbiAqIFRoZSB0cmFuc2FjdGlvbiBkYXRhIHJldHVybmVkIGZyb20gdGhlIHRvSnNvbigpIGZ1bmN0aW9uIG9mIGEgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeERhdGEge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIGlucHV0czogVHJhbnNhY3Rpb25JbnB1dFtdO1xuICBvdXRwdXRzOiBUcmFuc2FjdGlvbk91dHB1dFtdO1xuICB3aXRuZXNzZXM6IFdpdG5lc3NbXTtcbiAgY2VydHM6IENlcnRbXTtcbiAgd2l0aGRyYXdhbHM6IFdpdGhkcmF3YWxbXTtcbiAgcGxlZGdlRGV0YWlscz86IFBsZWRnZURldGFpbHM7XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX3RyYW5zYWN0aW9uOiBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbjtcbiAgcHJpdmF0ZSBfZmVlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3BsZWRnZURldGFpbHM/OiBQbGVkZ2VEZXRhaWxzO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gIH1cblxuICBnZXQgdHJhbnNhY3Rpb24oKTogQ2FyZGFub1dhc20uVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHNldCB0cmFuc2FjdGlvbih0eDogQ2FyZGFub1dhc20uVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHR4O1xuICAgIHRoaXMuX2lkID0gQnVmZmVyLmZyb20oQ2FyZGFub1dhc20uaGFzaF90cmFuc2FjdGlvbih0eC5ib2R5KCkpLnRvX2J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKGtleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgS2V5UGFpcih7IHBydjoga2V5LmtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl90cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl90cmFuc2FjdGlvbi50b19ieXRlcygpKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl90cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IHRoaXMuX3R5cGUgYXMgVHJhbnNhY3Rpb25UeXBlLFxuICAgICAgaW5wdXRzOiBbXSxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgd2l0bmVzc2VzOiBbXSxcbiAgICAgIGNlcnRzOiBbXSxcbiAgICAgIHdpdGhkcmF3YWxzOiBbXSxcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90cmFuc2FjdGlvbi5ib2R5KCkuaW5wdXRzKCkubGVuKCk7IGkrKykge1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLl90cmFuc2FjdGlvbi5ib2R5KCkuaW5wdXRzKCkuZ2V0KGkpO1xuICAgICAgcmVzdWx0LmlucHV0cy5wdXNoKHtcbiAgICAgICAgdHJhbnNhY3Rpb25faWQ6IEJ1ZmZlci5mcm9tKGlucHV0LnRyYW5zYWN0aW9uX2lkKCkudG9fYnl0ZXMoKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0cmFuc2FjdGlvbl9pbmRleDogaW5wdXQuaW5kZXgoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdHJhbnNhY3Rpb24uYm9keSgpLm91dHB1dHMoKS5sZW4oKTsgaSsrKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLl90cmFuc2FjdGlvbi5ib2R5KCkub3V0cHV0cygpLmdldChpKTtcbiAgICAgIHJlc3VsdC5vdXRwdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBhZGFVdGlscy5nZXRBZGRyZXNzU3RyaW5nKG91dHB1dC5hZGRyZXNzKCkpLFxuICAgICAgICBhbW91bnQ6IG91dHB1dC5hbW91bnQoKS5jb2luKCkudG9fc3RyKCksXG4gICAgICAgIG11bHRpQXNzZXRzOiBvdXRwdXQuYW1vdW50KCkubXVsdGlhc3NldCgpIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbi5ib2R5KCkuY2VydHMoKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90cmFuc2FjdGlvbi5ib2R5KCkuY2VydHMoKSEubGVuKCk7IGkrKykge1xuICAgICAgICBjb25zdCBjZXJ0ID0gdGhpcy5fdHJhbnNhY3Rpb24uYm9keSgpLmNlcnRzKCkhLmdldChpKTtcbiAgICAgICAgaWYgKGNlcnQuYXNfc3Rha2VfcmVnaXN0cmF0aW9uKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHN0YWtlUmVnaXN0cmF0aW9uID0gY2VydC5hc19zdGFrZV9yZWdpc3RyYXRpb24oKSBhcyBDYXJkYW5vV2FzbS5TdGFrZVJlZ2lzdHJhdGlvbjtcbiAgICAgICAgICByZXN1bHQuY2VydHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBDZXJ0VHlwZS5TdGFrZUtleVJlZ2lzdHJhdGlvbixcbiAgICAgICAgICAgIHN0YWtlQ3JlZGVudGlhbEhhc2g6IEJ1ZmZlci5mcm9tKHN0YWtlUmVnaXN0cmF0aW9uLnN0YWtlX2NyZWRlbnRpYWwoKS50b19ieXRlcygpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNlcnQuYXNfc3Rha2VfZGVyZWdpc3RyYXRpb24oKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc3Rha2VEZXJlZ2lzdHJhdGlvbiA9IGNlcnQuYXNfc3Rha2VfZGVyZWdpc3RyYXRpb24oKSBhcyBDYXJkYW5vV2FzbS5TdGFrZURlcmVnaXN0cmF0aW9uO1xuICAgICAgICAgIHJlc3VsdC5jZXJ0cy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IENlcnRUeXBlLlN0YWtlS2V5RGVyZWdpc3RyYXRpb24sXG4gICAgICAgICAgICBzdGFrZUNyZWRlbnRpYWxIYXNoOiBCdWZmZXIuZnJvbShzdGFrZURlcmVnaXN0cmF0aW9uLnN0YWtlX2NyZWRlbnRpYWwoKS50b19ieXRlcygpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNlcnQuYXNfc3Rha2VfZGVsZWdhdGlvbigpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFrZURlbGVnYXRpb24gPSBjZXJ0LmFzX3N0YWtlX2RlbGVnYXRpb24oKSBhcyBDYXJkYW5vV2FzbS5TdGFrZURlbGVnYXRpb247XG4gICAgICAgICAgcmVzdWx0LmNlcnRzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogQ2VydFR5cGUuU3Rha2VLZXlEZWxlZ2F0aW9uLFxuICAgICAgICAgICAgc3Rha2VDcmVkZW50aWFsSGFzaDogQnVmZmVyLmZyb20oc3Rha2VEZWxlZ2F0aW9uLnN0YWtlX2NyZWRlbnRpYWwoKS50b19ieXRlcygpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICBwb29sS2V5SGFzaDogQnVmZmVyLmZyb20oc3Rha2VEZWxlZ2F0aW9uLnBvb2xfa2V5aGFzaCgpLnRvX2J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2VydC5hc19wb29sX3JlZ2lzdHJhdGlvbigpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFrZVBvb2xSZWdpc3RyYXRpb24gPSBjZXJ0LmFzX3Bvb2xfcmVnaXN0cmF0aW9uKCkgYXMgQ2FyZGFub1dhc20uUG9vbFJlZ2lzdHJhdGlvbjtcbiAgICAgICAgICByZXN1bHQuY2VydHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBDZXJ0VHlwZS5TdGFrZVBvb2xSZWdpc3RyYXRpb24sXG4gICAgICAgICAgICBwb29sS2V5SGFzaDogQnVmZmVyLmZyb20oc3Rha2VQb29sUmVnaXN0cmF0aW9uLnBvb2xfcGFyYW1zKCkub3BlcmF0b3IoKS50b19ieXRlcygpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNlcnQuYXNfdm90ZV9kZWxlZ2F0aW9uKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHZvdGVEZWxlZ2F0aW9uID0gY2VydC5hc192b3RlX2RlbGVnYXRpb24oKSBhcyBDYXJkYW5vV2FzbS5Wb3RlRGVsZWdhdGlvbjtcbiAgICAgICAgICByZXN1bHQuY2VydHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBDZXJ0VHlwZS5Wb3RlRGVsZWdhdGlvbixcbiAgICAgICAgICAgIHN0YWtlQ3JlZGVudGlhbEhhc2g6IEJ1ZmZlci5mcm9tKHZvdGVEZWxlZ2F0aW9uLnN0YWtlX2NyZWRlbnRpYWwoKS50b19ieXRlcygpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICBkUmVwSWQ6IGFkYVV0aWxzLmdldERSZXBJZEZyb21EUmVwKHZvdGVEZWxlZ2F0aW9uLmRyZXAoKSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXN1bHQucGxlZGdlRGV0YWlscyA9IHRoaXMuX3BsZWRnZURldGFpbHM7XG5cbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24uYm9keSgpLndpdGhkcmF3YWxzKCkpIHtcbiAgICAgIGNvbnN0IHdpdGhkcmF3YWxzID0gdGhpcy5fdHJhbnNhY3Rpb24uYm9keSgpLndpdGhkcmF3YWxzKCkgYXMgQ2FyZGFub1dhc20uV2l0aGRyYXdhbHM7XG4gICAgICBjb25zdCBrZXlzID0gd2l0aGRyYXdhbHMua2V5cygpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbigpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmV3YXJkQWRkcmVzcyA9IGtleXMuZ2V0KGkpO1xuICAgICAgICBjb25zdCByZXdhcmQgPSB3aXRoZHJhd2Fscy5nZXQocmV3YXJkQWRkcmVzcykgYXMgQ2FyZGFub1dhc20uQmlnTnVtO1xuICAgICAgICByZXN1bHQud2l0aGRyYXdhbHMucHVzaCh7XG4gICAgICAgICAgc3Rha2VBZGRyZXNzOiByZXdhcmRBZGRyZXNzLnRvX2FkZHJlc3MoKS50b19ieXRlcygpLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsdWU6IHJld2FyZC50b19zdHIoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3RyYW5zYWN0aW9uLndpdG5lc3Nfc2V0KCkudmtleXMoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2a2V5cyA9IHRoaXMuX3RyYW5zYWN0aW9uLndpdG5lc3Nfc2V0KCkudmtleXMoKSBhcyBDYXJkYW5vV2FzbS5Wa2V5d2l0bmVzc2VzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2a2V5cy5sZW4oKTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZrZXkgPSAodGhpcy5fdHJhbnNhY3Rpb24ud2l0bmVzc19zZXQoKS52a2V5cygpIGFzIENhcmRhbm9XYXNtLlZrZXl3aXRuZXNzZXMpLmdldChpKTtcbiAgICAgICAgcmVzdWx0LndpdG5lc3Nlcy5wdXNoKHtcbiAgICAgICAgICBwdWJsaWNLZXk6IHZrZXk/LnZrZXkoKS5wdWJsaWNfa2V5KCkudG9faGV4KCksXG4gICAgICAgICAgc2lnbmF0dXJlOiB2a2V5Py5zaWduYXR1cmUoKS50b19oZXgoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgaW5wdXQgYW5kIG91dHB1dCBmaWVsZCBmb3IgdGhpcyB0cmFuc2FjdGlvblxuICAgKlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuXG4gICAgY29uc3QgdHhfb3V0cHV0cyA9IHRoaXMuX3RyYW5zYWN0aW9uLmJvZHkoKS5vdXRwdXRzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eF9vdXRwdXRzLmxlbigpOyBpKyspIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHR4X291dHB1dHMuZ2V0KGkpO1xuICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogYWRhVXRpbHMuZ2V0QWRkcmVzc1N0cmluZyhvdXRwdXQuYWRkcmVzcygpKSxcbiAgICAgICAgdmFsdWU6IG91dHB1dC5hbW91bnQoKS5jb2luKCkudG9fc3RyKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9vdXRwdXRzID0gb3V0cHV0cztcbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShDYXJkYW5vV2FzbS5oYXNoX3RyYW5zYWN0aW9uKHRoaXMuX3RyYW5zYWN0aW9uLmJvZHkoKSkudG9fYnl0ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1R4XG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhIHRlbXAgZml4IHVudGlsIHdlIHNvbHZlIGltcG9ydCBwcm9ibGVtIGluIHdlYnBhY2tcbiAgICAgIHRocm93IG5ldyBOb2RlRW52aXJvbm1lbnRFcnJvcigndW5hYmxlIHRvIGxvYWQgY2FyZGFubyBzZXJpYWxpemF0aW9uIGxpYnJhcnknKTtcbiAgICB9XG4gICAgY29uc3QgSEVYX1JFR0VYID0gL15bMC05YS1mQS1GXSskLztcbiAgICBjb25zdCBidWZmZXJSYXdUcmFuc2FjdGlvbiA9IEhFWF9SRUdFWC50ZXN0KHJhd1R4KSA/IEJ1ZmZlci5mcm9tKHJhd1R4LCAnaGV4JykgOiBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eG4gPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbi5mcm9tX2J5dGVzKGJ1ZmZlclJhd1RyYW5zYWN0aW9uKTtcbiAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHhuO1xuICAgICAgdGhpcy5faWQgPSBCdWZmZXIuZnJvbShDYXJkYW5vV2FzbS5oYXNoX3RyYW5zYWN0aW9uKHR4bi5ib2R5KCkpLnRvX2J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbi5ib2R5KCkuY2VydHMoKSkge1xuICAgICAgICBjb25zdCBjZXJ0czogQ2FyZGFub1dhc20uQ2VydGlmaWNhdGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RyYW5zYWN0aW9uLmJvZHkoKS5jZXJ0cygpIS5sZW4oKTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2VydCA9IHRoaXMuX3RyYW5zYWN0aW9uLmJvZHkoKS5jZXJ0cygpIS5nZXQoaSk7XG4gICAgICAgICAgY2VydHMucHVzaChjZXJ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjZXJ0cy5zb21lKChjKSA9PiBjLmFzX3Bvb2xfcmVnaXN0cmF0aW9uKCkgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdQbGVkZ2U7XG4gICAgICAgICAgY29uc3Qgc3Rha2VLZXlSZWdpc3RyYXRpb24gPSBjZXJ0cy5maW5kKChjKSA9PiBjLmFzX3N0YWtlX3JlZ2lzdHJhdGlvbigpICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgIGNvbnN0IHN0YWtlS2V5RGVsZWdhdGlvbiA9IGNlcnRzLmZpbmQoKGMpID0+IGMuYXNfc3Rha2VfZGVsZWdhdGlvbigpICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgIGNvbnN0IHN0YWtlUG9vbFJlZ2lzdHJhdGlvbiA9IGNlcnRzLmZpbmQoKGMpID0+IGMuYXNfcG9vbF9yZWdpc3RyYXRpb24oKSAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICAgIHRoaXMuX3BsZWRnZURldGFpbHMgPSB7XG4gICAgICAgICAgICBzdGFrZUtleVJlZ2lzdHJhdGlvbjogdGhpcy5sb2FkU3Rha2VLZXlSZWdpc3RyYXRpb24oc3Rha2VLZXlSZWdpc3RyYXRpb24pLFxuICAgICAgICAgICAgc3Rha2VLZXlEZWxlZ2F0aW9uOiB0aGlzLmxvYWRTdGFrZUtleURlbGVnYXRpb24oc3Rha2VLZXlEZWxlZ2F0aW9uKSxcbiAgICAgICAgICAgIHN0YWtlUG9vbFJlZ2lzdHJhdGlvbjogdGhpcy5sb2FkU3Rha2VQb29sUmVnaXN0cmF0aW9uKHN0YWtlUG9vbFJlZ2lzdHJhdGlvbiEpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoY2VydHMuc29tZSgoYykgPT4gYy5hc19zdGFrZV9yZWdpc3RyYXRpb24oKSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlO1xuICAgICAgICB9IGVsc2UgaWYgKGNlcnRzLnNvbWUoKGMpID0+IGMuYXNfc3Rha2VfZGVyZWdpc3RyYXRpb24oKSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2VydHMuc29tZSgoYykgPT4gYy5hc192b3RlX2RlbGVnYXRpb24oKSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuVm90ZURlbGVnYXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbi5ib2R5KCkud2l0aGRyYXdhbHMoKSkge1xuICAgICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZmVlID0gdHhuLmJvZHkoKS5mZWUoKS50b19zdHIoKTtcbiAgICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcblxuICAgICAgaWYgKHRoaXMuX3RyYW5zYWN0aW9uLndpdG5lc3Nfc2V0KCkudmtleXMoKSkge1xuICAgICAgICBjb25zdCB2a2V5cyA9IHRoaXMuX3RyYW5zYWN0aW9uLndpdG5lc3Nfc2V0KCkudmtleXMoKSEgYXMgQ2FyZGFub1dhc20uVmtleXdpdG5lc3NlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2a2V5cy5sZW4oKTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmtleSA9IHZrZXlzLmdldChpKTtcbiAgICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2godmtleS5zaWduYXR1cmUoKS50b19oZXgoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3VuYWJsZSB0byBidWlsZCB0cmFuc2FjdGlvbiBmcm9tIHJhdycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0YWtlS2V5UmVnaXN0cmF0aW9uKFxuICAgIGNlcnRpZmljYXRlOiBDYXJkYW5vV2FzbS5DZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZFxuICApOiBTdGFrZUtleVJlZ2lzdHJhdGlvbkNlcnQgfCB1bmRlZmluZWQge1xuICAgIGlmIChjZXJ0aWZpY2F0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdGFrZVJlZ2lzdHJhdGlvbiA9IGNlcnRpZmljYXRlLmFzX3N0YWtlX3JlZ2lzdHJhdGlvbigpO1xuICAgIGlmIChzdGFrZVJlZ2lzdHJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHN0YWtlUmVnaXN0cmF0aW9uIS5zdGFrZV9jcmVkZW50aWFsKCkudG9fa2V5aGFzaCgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IENlcnRUeXBlLlN0YWtlS2V5UmVnaXN0cmF0aW9uLFxuICAgICAgICBzdGFrZUNyZWRlbnRpYWxIYXNoOiBzdGFrZVJlZ2lzdHJhdGlvbiEuc3Rha2VfY3JlZGVudGlhbCgpLnRvX2tleWhhc2goKSEudG9faGV4KCksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0YWtlS2V5RGVsZWdhdGlvbihjZXJ0aWZpY2F0ZTogQ2FyZGFub1dhc20uQ2VydGlmaWNhdGUgfCB1bmRlZmluZWQpOiBTdGFrZUtleURlbGVnYXRpb25DZXJ0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY2VydGlmaWNhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3Rha2VEZWxlZ2F0aW9uID0gY2VydGlmaWNhdGUuYXNfc3Rha2VfZGVsZWdhdGlvbigpO1xuICAgIGlmIChzdGFrZURlbGVnYXRpb24gIT09IHVuZGVmaW5lZCAmJiBzdGFrZURlbGVnYXRpb24hLnN0YWtlX2NyZWRlbnRpYWwoKS50b19rZXloYXNoKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogQ2VydFR5cGUuU3Rha2VLZXlEZWxlZ2F0aW9uLFxuICAgICAgICBzdGFrZUNyZWRlbnRpYWxIYXNoOiBzdGFrZURlbGVnYXRpb24hLnN0YWtlX2NyZWRlbnRpYWwoKS50b19rZXloYXNoKCkhLnRvX2hleCgpLFxuICAgICAgICBwb29sS2V5SGFzaDogc3Rha2VEZWxlZ2F0aW9uIS5wb29sX2tleWhhc2goKS50b19oZXgoKSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU3Rha2VQb29sUmVnaXN0cmF0aW9uKGNlcnRpZmljYXRlOiBDYXJkYW5vV2FzbS5DZXJ0aWZpY2F0ZSk6IFN0YWtlUG9vbFJlZ2lzdHJhdGlvbkNlcnQge1xuICAgIGNvbnN0IHBvb2xSZWdpc3RyYXRpb24gPSBjZXJ0aWZpY2F0ZS5hc19wb29sX3JlZ2lzdHJhdGlvbigpO1xuICAgIGNvbnN0IHJld2FyZEFjY291bnQgPSBwb29sUmVnaXN0cmF0aW9uIS5wb29sX3BhcmFtcygpLnJld2FyZF9hY2NvdW50KCk7XG4gICAgY29uc3QgbmV0d29ya0lkID0gcmV3YXJkQWNjb3VudC50b19hZGRyZXNzKCkubmV0d29ya19pZCgpO1xuICAgIGNvbnN0IG93bmVyczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xSZWdpc3RyYXRpb24hLnBvb2xfcGFyYW1zKCkucG9vbF9vd25lcnMoKS5sZW4oKTsgaSsrKSB7XG4gICAgICBjb25zdCBwb29sT3duZXIgPSBwb29sUmVnaXN0cmF0aW9uIS5wb29sX3BhcmFtcygpLnBvb2xfb3duZXJzKCkuZ2V0KGkpO1xuICAgICAgY29uc3Qgb3duZXJTdGFrZUtleSA9IENhcmRhbm9XYXNtLkNyZWRlbnRpYWwuZnJvbV9rZXloYXNoKHBvb2xPd25lcik7XG4gICAgICBvd25lcnMucHVzaChDYXJkYW5vV2FzbS5SZXdhcmRBZGRyZXNzLm5ldyhuZXR3b3JrSWQsIG93bmVyU3Rha2VLZXkpLnRvX2FkZHJlc3MoKS50b19iZWNoMzIoKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBDZXJ0VHlwZS5TdGFrZVBvb2xSZWdpc3RyYXRpb24sXG4gICAgICBwb29sS2V5SGFzaDogcG9vbFJlZ2lzdHJhdGlvbiEucG9vbF9wYXJhbXMoKS5vcGVyYXRvcigpLnRvX2hleCgpLFxuICAgICAgdnJmS2V5SGFzaDogcG9vbFJlZ2lzdHJhdGlvbiEucG9vbF9wYXJhbXMoKS52cmZfa2V5aGFzaCgpLnRvX2hleCgpLFxuICAgICAgcGxlZGdlOiBwb29sUmVnaXN0cmF0aW9uIS5wb29sX3BhcmFtcygpLnBsZWRnZSgpLnRvX3N0cigpLFxuICAgICAgY29zdDogcG9vbFJlZ2lzdHJhdGlvbiEucG9vbF9wYXJhbXMoKS5jb3N0KCkudG9fc3RyKCksXG4gICAgICBtYXJnaW5OdW1lcmF0b3I6IHBvb2xSZWdpc3RyYXRpb24hLnBvb2xfcGFyYW1zKCkubWFyZ2luKCkubnVtZXJhdG9yKCkudG9fc3RyKCksXG4gICAgICBtYXJnaW5EZW5vbWluYXRvcjogcG9vbFJlZ2lzdHJhdGlvbiEucG9vbF9wYXJhbXMoKS5tYXJnaW4oKS5kZW5vbWluYXRvcigpLnRvX3N0cigpLFxuICAgICAgcmV3YXJkQWNjb3VudDogcmV3YXJkQWNjb3VudC50b19hZGRyZXNzKCkudG9fYmVjaDMyKCksXG4gICAgICBwb29sT3duZXJzOiBvd25lcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKToge1xuICAgIG91dHB1dHM6IHsgYW1vdW50OiBzdHJpbmc7IGFkZHJlc3M6IHN0cmluZyB9W107XG4gICAgY2VydGlmaWNhdGVzOiBDZXJ0W107XG4gICAgY2hhbmdlT3V0cHV0czogc3RyaW5nW107XG4gICAgb3V0cHV0QW1vdW50OiBzdHJpbmc7XG4gICAgZmVlOiB7IGZlZTogc3RyaW5nIH07XG4gICAgZGlzcGxheU9yZGVyOiBzdHJpbmdbXTtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNoYW5nZUFtb3VudDogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB3aXRoZHJhd2FsczogV2l0aGRyYXdhbFtdO1xuICAgIHBsZWRnZURldGFpbHM/OiBQbGVkZ2VEZXRhaWxzO1xuICB9IHtcbiAgICBjb25zdCB0eEpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnXTtcbiAgICBjb25zdCBhbW91bnQgPSB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFtb3VudDogQmlnSW50KG8uYW1vdW50KSB9KSk7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gYW1vdW50LnJlZHVjZSgocCwgbikgPT4gcCArIEJpZ0ludChuLmFtb3VudCksIEJpZ0ludCgnMCcpKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHR5cGUgPVxuICAgICAgdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmRcbiAgICAgICAgPyAnVHJhbnNmZXInXG4gICAgICAgIDogdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZVxuICAgICAgICA/ICdTdGFraW5nQWN0aXZhdGUnXG4gICAgICAgIDogdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhd1xuICAgICAgICA/ICdTdGFraW5nV2l0aGRyYXcnXG4gICAgICAgIDogdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlXG4gICAgICAgID8gJ1N0YWtpbmdEZWFjdGl2YXRlJ1xuICAgICAgICA6IHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nUGxlZGdlXG4gICAgICAgID8gJ1N0YWtpbmdQbGVkZ2UnXG4gICAgICAgIDogdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlZvdGVEZWxlZ2F0aW9uXG4gICAgICAgID8gJ1ZvdGVEZWxlZ2F0aW9uJ1xuICAgICAgICA6ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby5hbW91bnQgfSkpLFxuICAgICAgb3V0cHV0QW1vdW50OiBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgZmVlOiB7IGZlZTogdGhpcy5fZmVlIH0sXG4gICAgICB0eXBlLFxuICAgICAgY2VydGlmaWNhdGVzOiB0eEpzb24uY2VydHMsXG4gICAgICB3aXRoZHJhd2FsczogdHhKc29uLndpdGhkcmF3YWxzLFxuICAgICAgcGxlZGdlRGV0YWlsczogdGhpcy5fcGxlZGdlRGV0YWlscyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0UGxlZGdlRGV0YWlscygpOiBQbGVkZ2VEZXRhaWxzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGxlZGdlRGV0YWlscztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gZmVlXG4gICAqL1xuICBnZXQgZ2V0RmVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNhY3Rpb24gZmVlXG4gICAqXG4gICAqIEBwYXJhbSBmZWVcbiAgICovXG4gIGZlZShmZWU6IHN0cmluZykge1xuICAgIHRoaXMuX2ZlZSA9IGZlZTtcbiAgfVxufVxuIl19
|