@bitgo-beta/statics 10.0.1-alpha.51 → 10.0.1-alpha.510
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account.d.ts +1167 -73
- package/dist/src/account.d.ts.map +1 -1
- package/dist/src/account.js +1837 -155
- package/dist/src/ada.d.ts.map +1 -1
- package/dist/src/ada.js +9 -3
- package/dist/src/allCoinsAndTokens.d.ts +2 -0
- package/dist/src/allCoinsAndTokens.d.ts.map +1 -0
- package/dist/src/allCoinsAndTokens.js +1730 -0
- package/dist/src/avaxp.d.ts.map +1 -1
- package/dist/src/avaxp.js +11 -3
- package/dist/src/base.d.ts +2886 -49
- package/dist/src/base.d.ts.map +1 -1
- package/dist/src/base.js +3007 -61
- package/dist/src/canton.d.ts +34 -0
- package/dist/src/canton.d.ts.map +1 -0
- package/dist/src/canton.js +51 -0
- package/dist/src/coinFeatures.d.ts +127 -0
- package/dist/src/coinFeatures.d.ts.map +1 -0
- package/dist/src/coinFeatures.js +779 -0
- package/dist/src/coins/adaTokens.d.ts +2 -0
- package/dist/src/coins/adaTokens.d.ts.map +1 -0
- package/dist/src/coins/adaTokens.js +22 -0
- package/dist/src/coins/avaxTokens.d.ts +2 -0
- package/dist/src/coins/avaxTokens.d.ts.map +1 -0
- package/dist/src/coins/avaxTokens.js +131 -0
- package/dist/src/coins/botOfcTokens.d.ts +3 -0
- package/dist/src/coins/botOfcTokens.d.ts.map +1 -0
- package/dist/src/coins/botOfcTokens.js +64 -0
- package/dist/src/coins/botTokens.d.ts +3 -0
- package/dist/src/coins/botTokens.d.ts.map +1 -0
- package/dist/src/coins/botTokens.js +282 -0
- package/dist/src/coins/bscTokens.d.ts +2 -0
- package/dist/src/coins/bscTokens.d.ts.map +1 -0
- package/dist/src/coins/bscTokens.js +223 -0
- package/dist/src/coins/cantonTokens.d.ts +2 -0
- package/dist/src/coins/cantonTokens.d.ts.map +1 -0
- package/dist/src/coins/cantonTokens.js +118 -0
- package/dist/src/coins/cosmosTokens.d.ts +2 -0
- package/dist/src/coins/cosmosTokens.d.ts.map +1 -0
- package/dist/src/coins/cosmosTokens.js +14 -0
- package/dist/src/coins/erc20Coins.d.ts +2 -0
- package/dist/src/coins/erc20Coins.d.ts.map +1 -0
- package/dist/src/coins/erc20Coins.js +2060 -0
- package/dist/src/coins/erc7984Tokens.d.ts +18 -0
- package/dist/src/coins/erc7984Tokens.d.ts.map +1 -0
- package/dist/src/coins/erc7984Tokens.js +34 -0
- package/dist/src/coins/generateERC20.d.ts +36 -0
- package/dist/src/coins/generateERC20.d.ts.map +1 -0
- package/dist/src/coins/generateERC20.js +46 -0
- package/dist/src/coins/hoodethTokens.d.ts +2 -0
- package/dist/src/coins/hoodethTokens.d.ts.map +1 -0
- package/dist/src/coins/hoodethTokens.js +115 -0
- package/dist/src/coins/jettonTokens.d.ts +2 -0
- package/dist/src/coins/jettonTokens.d.ts.map +1 -0
- package/dist/src/coins/jettonTokens.js +19 -0
- package/dist/src/coins/nep141Tokens.d.ts +2 -0
- package/dist/src/coins/nep141Tokens.d.ts.map +1 -0
- package/dist/src/coins/nep141Tokens.js +18 -0
- package/dist/src/coins/ofcCoins.d.ts +2 -0
- package/dist/src/coins/ofcCoins.d.ts.map +1 -0
- package/dist/src/coins/ofcCoins.js +1170 -0
- package/dist/src/coins/ofcErc20Coins.d.ts +4 -0
- package/dist/src/coins/ofcErc20Coins.d.ts.map +1 -0
- package/dist/src/coins/ofcErc20Coins.js +1831 -0
- package/dist/src/coins/ofcHoodethTokens.d.ts +2 -0
- package/dist/src/coins/ofcHoodethTokens.d.ts.map +1 -0
- package/dist/src/coins/ofcHoodethTokens.js +113 -0
- package/dist/src/coins/polygonTokens.d.ts +2 -0
- package/dist/src/coins/polygonTokens.d.ts.map +1 -0
- package/dist/src/coins/polygonTokens.js +205 -0
- package/dist/src/coins/polyxTokens.d.ts +2 -0
- package/dist/src/coins/polyxTokens.d.ts.map +1 -0
- package/dist/src/coins/polyxTokens.js +22 -0
- package/dist/src/coins/sip10Tokens.d.ts +2 -0
- package/dist/src/coins/sip10Tokens.d.ts.map +1 -0
- package/dist/src/coins/sip10Tokens.js +25 -0
- package/dist/src/coins/solTokens.d.ts +3 -0
- package/dist/src/coins/solTokens.d.ts.map +1 -0
- package/dist/src/coins/solTokens.js +494 -0
- package/dist/src/coins/vetTokens.d.ts +2 -0
- package/dist/src/coins/vetTokens.d.ts.map +1 -0
- package/dist/src/coins/vetTokens.js +11 -0
- package/dist/src/coins.d.ts +22 -1
- package/dist/src/coins.d.ts.map +1 -1
- package/dist/src/coins.js +463 -1427
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +3 -2
- package/dist/src/errors.d.ts +9 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +23 -2
- package/dist/src/flrp.d.ts +40 -0
- package/dist/src/flrp.d.ts.map +1 -0
- package/dist/src/flrp.js +66 -0
- package/dist/src/hypeevm.d.ts +28 -0
- package/dist/src/hypeevm.d.ts.map +1 -0
- package/dist/src/hypeevm.js +60 -0
- package/dist/src/index.d.ts +5 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +41 -3
- package/dist/src/kaspa.d.ts +34 -0
- package/dist/src/kaspa.d.ts.map +1 -0
- package/dist/src/kaspa.js +63 -0
- package/dist/src/lightning.d.ts +43 -0
- package/dist/src/lightning.d.ts.map +1 -0
- package/dist/src/lightning.js +64 -0
- package/dist/src/map.d.ts +34 -0
- package/dist/src/map.d.ts.map +1 -1
- package/dist/src/map.js +250 -17
- package/dist/src/networkFeatureMapForTokens.d.ts +17 -0
- package/dist/src/networkFeatureMapForTokens.d.ts.map +1 -0
- package/dist/src/networkFeatureMapForTokens.js +84 -0
- package/dist/src/networks.d.ts +2098 -60
- package/dist/src/networks.d.ts.map +1 -1
- package/dist/src/networks.js +2557 -78
- package/dist/src/ofc.d.ts +695 -3
- package/dist/src/ofc.d.ts.map +1 -1
- package/dist/src/ofc.js +1653 -28
- package/dist/src/tokenConfig.d.ts +689 -102
- package/dist/src/tokenConfig.d.ts.map +1 -1
- package/dist/src/tokenConfig.js +1094 -205
- package/dist/src/utxo.d.ts +3 -1
- package/dist/src/utxo.d.ts.map +1 -1
- package/dist/src/utxo.js +85 -3
- package/dist/tsconfig.tsbuildinfo +1 -2744
- package/package.json +6 -3
- package/.mocharc.js +0 -10
- package/.prettierignore +0 -2
- package/CHANGELOG.md +0 -587
- package/dist/resources/dot/index.d.ts +0 -3
- package/dist/resources/dot/index.d.ts.map +0 -1
- package/dist/resources/dot/index.js +0 -15
- package/dist/resources/dot/mainnet.d.ts +0 -2
- package/dist/resources/dot/mainnet.d.ts.map +0 -1
- package/dist/resources/dot/mainnet.js +0 -5
- package/dist/resources/dot/westend.d.ts +0 -2
- package/dist/resources/dot/westend.d.ts.map +0 -1
- package/dist/resources/dot/westend.js +0 -5
- package/resources/dot/index.ts +0 -2
- package/resources/dot/mainnet.ts +0 -2
- package/resources/dot/westend.ts +0 -2
package/dist/src/account.js
CHANGED
|
@@ -1,11 +1,104 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
3
|
+
exports.CantonToken = exports.AdaToken = exports.PolyxCoin = exports.TaoCoin = exports.JettonToken = exports.CosmosChainToken = exports.VetToken = exports.Nep141Token = exports.Sip10Token = exports.FiatCoin = exports.VetNFTCollection = exports.AptNFTCollection = exports.AptCoin = exports.SuiCoin = exports.XrpMptCoin = exports.XrpCoin = exports.MonERC20Token = exports.XdcERC20Token = exports.FlrERC20Token = exports.WorldERC20Token = exports.CoredaoERC20Token = exports.BeraERC20Token = exports.ZkethERC20Token = exports.OpethERC20Token = exports.ArbethERC20Token = exports.PolygonERC20Token = exports.AvaxERC20Token = exports.EthLikeERC721Token = exports.EthLikeERC20Token = exports.SolCoin = exports.EosCoin = exports.AlgoCoin = exports.HederaToken = exports.HederaCoin = exports.StellarCoin = exports.BscCoin = exports.CeloCoin = exports.Erc20CompatibleAccountCoin = exports.TronErc20Coin = exports.Erc7984Coin = exports.Erc1155Coin = exports.Erc721Coin = exports.Erc20Coin = exports.Base58ContractAddressDefinedToken = exports.NFTCollectionIdDefinedToken = exports.ContractAddressDefinedToken = exports.GasTankAccountCoin = exports.AccountCoinToken = exports.AccountCoin = exports.ProgramID = void 0;
|
|
4
|
+
exports.Tip20Token = void 0;
|
|
5
|
+
exports.account = account;
|
|
6
|
+
exports.gasTankAccount = gasTankAccount;
|
|
7
|
+
exports.erc20Token = erc20Token;
|
|
8
|
+
exports.erc721Token = erc721Token;
|
|
9
|
+
exports.erc20 = erc20;
|
|
10
|
+
exports.terc20 = terc20;
|
|
11
|
+
exports.erc7984 = erc7984;
|
|
12
|
+
exports.terc7984 = terc7984;
|
|
13
|
+
exports.erc721 = erc721;
|
|
14
|
+
exports.terc721 = terc721;
|
|
15
|
+
exports.nonstandardToken = nonstandardToken;
|
|
16
|
+
exports.erc1155 = erc1155;
|
|
17
|
+
exports.terc1155 = terc1155;
|
|
18
|
+
exports.erc20CompatibleAccountCoin = erc20CompatibleAccountCoin;
|
|
19
|
+
exports.celoToken = celoToken;
|
|
20
|
+
exports.tceloToken = tceloToken;
|
|
21
|
+
exports.bscToken = bscToken;
|
|
22
|
+
exports.tbscToken = tbscToken;
|
|
23
|
+
exports.stellarToken = stellarToken;
|
|
24
|
+
exports.tstellarToken = tstellarToken;
|
|
25
|
+
exports.tronToken = tronToken;
|
|
26
|
+
exports.ttronToken = ttronToken;
|
|
27
|
+
exports.hederaCoin = hederaCoin;
|
|
28
|
+
exports.hederaToken = hederaToken;
|
|
29
|
+
exports.algoToken = algoToken;
|
|
30
|
+
exports.talgoToken = talgoToken;
|
|
31
|
+
exports.eosToken = eosToken;
|
|
32
|
+
exports.teosToken = teosToken;
|
|
33
|
+
exports.solToken = solToken;
|
|
34
|
+
exports.tsolToken = tsolToken;
|
|
35
|
+
exports.adaToken = adaToken;
|
|
36
|
+
exports.tadaToken = tadaToken;
|
|
37
|
+
exports.avaxErc20 = avaxErc20;
|
|
38
|
+
exports.tavaxErc20 = tavaxErc20;
|
|
39
|
+
exports.polygonErc20 = polygonErc20;
|
|
40
|
+
exports.tpolygonErc20 = tpolygonErc20;
|
|
41
|
+
exports.arbethErc20 = arbethErc20;
|
|
42
|
+
exports.tarbethErc20 = tarbethErc20;
|
|
43
|
+
exports.opethErc20 = opethErc20;
|
|
44
|
+
exports.topethErc20 = topethErc20;
|
|
45
|
+
exports.zkethErc20 = zkethErc20;
|
|
46
|
+
exports.tzkethErc20 = tzkethErc20;
|
|
47
|
+
exports.beraErc20 = beraErc20;
|
|
48
|
+
exports.tberaErc20 = tberaErc20;
|
|
49
|
+
exports.coredaoErc20 = coredaoErc20;
|
|
50
|
+
exports.tcoredaoErc20 = tcoredaoErc20;
|
|
51
|
+
exports.worldErc20 = worldErc20;
|
|
52
|
+
exports.tworldErc20 = tworldErc20;
|
|
53
|
+
exports.flrErc20 = flrErc20;
|
|
54
|
+
exports.tflrErc20 = tflrErc20;
|
|
55
|
+
exports.xdcErc20 = xdcErc20;
|
|
56
|
+
exports.txdcErc20 = txdcErc20;
|
|
57
|
+
exports.monErc20 = monErc20;
|
|
58
|
+
exports.tmonErc20 = tmonErc20;
|
|
59
|
+
exports.xrpToken = xrpToken;
|
|
60
|
+
exports.txrpToken = txrpToken;
|
|
61
|
+
exports.xrpMptToken = xrpMptToken;
|
|
62
|
+
exports.txrpMptToken = txrpMptToken;
|
|
63
|
+
exports.suiToken = suiToken;
|
|
64
|
+
exports.tsuiToken = tsuiToken;
|
|
65
|
+
exports.aptToken = aptToken;
|
|
66
|
+
exports.aptNFTCollection = aptNFTCollection;
|
|
67
|
+
exports.taptToken = taptToken;
|
|
68
|
+
exports.taptNFTCollection = taptNFTCollection;
|
|
69
|
+
exports.fiat = fiat;
|
|
70
|
+
exports.sip10Token = sip10Token;
|
|
71
|
+
exports.tsip10Token = tsip10Token;
|
|
72
|
+
exports.nep141Token = nep141Token;
|
|
73
|
+
exports.tnep141Token = tnep141Token;
|
|
74
|
+
exports.vetToken = vetToken;
|
|
75
|
+
exports.tvetToken = tvetToken;
|
|
76
|
+
exports.vetNFTCollection = vetNFTCollection;
|
|
77
|
+
exports.tvetNFTCollection = tvetNFTCollection;
|
|
78
|
+
exports.cosmosToken = cosmosToken;
|
|
79
|
+
exports.taoToken = taoToken;
|
|
80
|
+
exports.ttaoToken = ttaoToken;
|
|
81
|
+
exports.polyxToken = polyxToken;
|
|
82
|
+
exports.tpolyxToken = tpolyxToken;
|
|
83
|
+
exports.jettonToken = jettonToken;
|
|
84
|
+
exports.tjettonToken = tjettonToken;
|
|
85
|
+
exports.cantonToken = cantonToken;
|
|
86
|
+
exports.tcantonToken = tcantonToken;
|
|
87
|
+
exports.tip20Token = tip20Token;
|
|
88
|
+
exports.ttip20Token = ttip20Token;
|
|
5
89
|
const base_1 = require("./base");
|
|
6
90
|
const constants_1 = require("./constants");
|
|
7
91
|
const errors_1 = require("./errors");
|
|
8
92
|
const networks_1 = require("./networks");
|
|
93
|
+
const coinFeatures_1 = require("./coinFeatures");
|
|
94
|
+
/**
|
|
95
|
+
* This is the program id against sol token program.
|
|
96
|
+
*/
|
|
97
|
+
var ProgramID;
|
|
98
|
+
(function (ProgramID) {
|
|
99
|
+
ProgramID["TokenProgramId"] = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
100
|
+
ProgramID["Token2022ProgramId"] = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
|
|
101
|
+
})(ProgramID || (exports.ProgramID = ProgramID = {}));
|
|
9
102
|
/**
|
|
10
103
|
* Account based coins, such as Ethereum, Stellar, or XRP.
|
|
11
104
|
*
|
|
@@ -27,16 +120,17 @@ class AccountCoin extends base_1.BaseCoin {
|
|
|
27
120
|
disallowedFeatures() {
|
|
28
121
|
return new Set([base_1.CoinFeature.UNSPENT_MODEL]);
|
|
29
122
|
}
|
|
123
|
+
static getFeaturesExcluding(excludedFeatures) {
|
|
124
|
+
return AccountCoin.DEFAULT_FEATURES.filter((feature) => !excludedFeatures.includes(feature));
|
|
125
|
+
}
|
|
126
|
+
static getFeaturesByTypeExcluding(excludedFeatures, baseFeatures = AccountCoin.DEFAULT_FEATURES) {
|
|
127
|
+
return baseFeatures.filter((feature) => !excludedFeatures.includes(feature));
|
|
128
|
+
}
|
|
30
129
|
}
|
|
31
130
|
exports.AccountCoin = AccountCoin;
|
|
32
|
-
AccountCoin.DEFAULT_FEATURES =
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
base_1.CoinFeature.VALUELESS_TRANSFER,
|
|
36
|
-
base_1.CoinFeature.TRANSACTION_DATA,
|
|
37
|
-
base_1.CoinFeature.CUSTODY,
|
|
38
|
-
base_1.CoinFeature.CUSTODY_BITGO_TRUST,
|
|
39
|
-
];
|
|
131
|
+
AccountCoin.DEFAULT_FEATURES = coinFeatures_1.ACCOUNT_COIN_DEFAULT_FEATURES;
|
|
132
|
+
// Need to gate some high risk coin from SINGAPORE trust
|
|
133
|
+
AccountCoin.DEFAULT_FEATURES_EXCLUDE_SINGAPORE = coinFeatures_1.ACCOUNT_COIN_DEFAULT_FEATURES_EXCLUDE_SINGAPORE;
|
|
40
134
|
class AccountCoinToken extends AccountCoin {
|
|
41
135
|
constructor(options) {
|
|
42
136
|
super({
|
|
@@ -45,6 +139,17 @@ class AccountCoinToken extends AccountCoin {
|
|
|
45
139
|
}
|
|
46
140
|
}
|
|
47
141
|
exports.AccountCoinToken = AccountCoinToken;
|
|
142
|
+
class GasTankAccountCoin extends AccountCoin {
|
|
143
|
+
constructor(options) {
|
|
144
|
+
super({
|
|
145
|
+
...options,
|
|
146
|
+
});
|
|
147
|
+
this.gasTankLowBalanceAlertFactor = options.gasTankLowBalanceAlertFactor;
|
|
148
|
+
this.gasTankMinBalanceRecommendationFactor = options.gasTankMinBalanceRecommendationFactor;
|
|
149
|
+
this.gasTankToken = options?.gasTankToken;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.GasTankAccountCoin = GasTankAccountCoin;
|
|
48
153
|
/**
|
|
49
154
|
* Some blockchains support tokens which are defined by an address at which they have a smart contract deployed.
|
|
50
155
|
* Examples are ERC20 tokens, and the equivalent on other chains.
|
|
@@ -63,6 +168,18 @@ class ContractAddressDefinedToken extends AccountCoinToken {
|
|
|
63
168
|
}
|
|
64
169
|
}
|
|
65
170
|
exports.ContractAddressDefinedToken = ContractAddressDefinedToken;
|
|
171
|
+
/**
|
|
172
|
+
* Used for blockchains that support NFT collections.
|
|
173
|
+
*/
|
|
174
|
+
class NFTCollectionIdDefinedToken extends AccountCoinToken {
|
|
175
|
+
constructor(options) {
|
|
176
|
+
super({
|
|
177
|
+
...options,
|
|
178
|
+
});
|
|
179
|
+
this.nftCollectionId = options.nftCollectionId;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.NFTCollectionIdDefinedToken = NFTCollectionIdDefinedToken;
|
|
66
183
|
/**
|
|
67
184
|
* ERC20 token addresses are Base58 formatted on some blockchains.
|
|
68
185
|
*/
|
|
@@ -101,6 +218,19 @@ exports.Erc721Coin = Erc721Coin;
|
|
|
101
218
|
class Erc1155Coin extends ContractAddressDefinedToken {
|
|
102
219
|
}
|
|
103
220
|
exports.Erc1155Coin = Erc1155Coin;
|
|
221
|
+
/**
|
|
222
|
+
* ERC-7984 is the confidential token standard for fhEVM-enabled blockchains (Zama).
|
|
223
|
+
* Token balances are stored as FHE-encrypted ciphertexts; transfers use confidentialTransfer()
|
|
224
|
+
* instead of the standard ERC-20 transfer(). Balance reads require delegated decryption via ACL.
|
|
225
|
+
*
|
|
226
|
+
* {@link https://eips.ethereum.org/EIPS/eip-7984 EIP-7984}
|
|
227
|
+
*/
|
|
228
|
+
class Erc7984Coin extends ContractAddressDefinedToken {
|
|
229
|
+
constructor(options) {
|
|
230
|
+
super(options);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.Erc7984Coin = Erc7984Coin;
|
|
104
234
|
/**
|
|
105
235
|
* The TRON blockchain supports tokens of the ERC20 standard similar to ETH ERC20 tokens.
|
|
106
236
|
*/
|
|
@@ -177,7 +307,8 @@ class HederaToken extends AccountCoinToken {
|
|
|
177
307
|
...options,
|
|
178
308
|
});
|
|
179
309
|
this.nodeAccountId = options.nodeAccountId;
|
|
180
|
-
this.tokenId = options.
|
|
310
|
+
this.tokenId = options.contractAddress;
|
|
311
|
+
this.contractAddress = options.contractAddress;
|
|
181
312
|
}
|
|
182
313
|
}
|
|
183
314
|
exports.HederaToken = HederaToken;
|
|
@@ -192,15 +323,6 @@ class AlgoCoin extends AccountCoinToken {
|
|
|
192
323
|
super({
|
|
193
324
|
...options,
|
|
194
325
|
});
|
|
195
|
-
if (options.tokenURL) {
|
|
196
|
-
try {
|
|
197
|
-
new URL(options.tokenURL);
|
|
198
|
-
}
|
|
199
|
-
catch (ex) {
|
|
200
|
-
throw new errors_1.InvalidDomainError(options.name, options.tokenURL);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
this.tokenURL = options.tokenURL;
|
|
204
326
|
}
|
|
205
327
|
}
|
|
206
328
|
exports.AlgoCoin = AlgoCoin;
|
|
@@ -215,7 +337,9 @@ class EosCoin extends AccountCoinToken {
|
|
|
215
337
|
super({
|
|
216
338
|
...options,
|
|
217
339
|
});
|
|
218
|
-
this.contractName = options.
|
|
340
|
+
this.contractName = options.contractAddress;
|
|
341
|
+
this.contractAddress = options.contractAddress;
|
|
342
|
+
this.symbol = options.symbol ?? options.name.split(':')[1];
|
|
219
343
|
}
|
|
220
344
|
}
|
|
221
345
|
exports.EosCoin = EosCoin;
|
|
@@ -230,25 +354,24 @@ class SolCoin extends AccountCoinToken {
|
|
|
230
354
|
super({
|
|
231
355
|
...options,
|
|
232
356
|
});
|
|
233
|
-
this.tokenAddress = options.
|
|
357
|
+
this.tokenAddress = options.contractAddress;
|
|
358
|
+
this.contractAddress = options.contractAddress;
|
|
359
|
+
this.programId = options.programId;
|
|
234
360
|
}
|
|
235
361
|
}
|
|
236
362
|
exports.SolCoin = SolCoin;
|
|
237
|
-
|
|
238
|
-
* The Ada network supports tokens
|
|
239
|
-
* Ada tokens are identified by their policy ID and asset name
|
|
240
|
-
*
|
|
241
|
-
*/
|
|
242
|
-
class AdaCoin extends AccountCoinToken {
|
|
363
|
+
class EthLikeERC20Token extends ContractAddressDefinedToken {
|
|
243
364
|
constructor(options) {
|
|
244
|
-
super(
|
|
245
|
-
...options,
|
|
246
|
-
});
|
|
247
|
-
this.policyId = options.policyId;
|
|
248
|
-
this.assetName = options.assetName;
|
|
365
|
+
super(options);
|
|
249
366
|
}
|
|
250
367
|
}
|
|
251
|
-
exports.
|
|
368
|
+
exports.EthLikeERC20Token = EthLikeERC20Token;
|
|
369
|
+
class EthLikeERC721Token extends ContractAddressDefinedToken {
|
|
370
|
+
constructor(options) {
|
|
371
|
+
super(options);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
exports.EthLikeERC721Token = EthLikeERC721Token;
|
|
252
375
|
/**
|
|
253
376
|
* The AVAX C Chain network support tokens
|
|
254
377
|
* AVAX C Chain Tokens are ERC20 coins
|
|
@@ -269,6 +392,96 @@ class PolygonERC20Token extends ContractAddressDefinedToken {
|
|
|
269
392
|
}
|
|
270
393
|
}
|
|
271
394
|
exports.PolygonERC20Token = PolygonERC20Token;
|
|
395
|
+
/**
|
|
396
|
+
* The Arbitrum Chain network support tokens
|
|
397
|
+
* Arbitrum Chain Tokens are ERC20 tokens
|
|
398
|
+
*/
|
|
399
|
+
class ArbethERC20Token extends ContractAddressDefinedToken {
|
|
400
|
+
constructor(options) {
|
|
401
|
+
super(options);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
exports.ArbethERC20Token = ArbethERC20Token;
|
|
405
|
+
/**
|
|
406
|
+
* The Optimism Chain network support tokens
|
|
407
|
+
* Optimism Chain Tokens are ERC20 tokens
|
|
408
|
+
*/
|
|
409
|
+
class OpethERC20Token extends ContractAddressDefinedToken {
|
|
410
|
+
constructor(options) {
|
|
411
|
+
super(options);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
exports.OpethERC20Token = OpethERC20Token;
|
|
415
|
+
/**
|
|
416
|
+
* The zkSync network support tokens
|
|
417
|
+
* zkSync Tokens are ERC20 tokens
|
|
418
|
+
*/
|
|
419
|
+
class ZkethERC20Token extends ContractAddressDefinedToken {
|
|
420
|
+
constructor(options) {
|
|
421
|
+
super(options);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
exports.ZkethERC20Token = ZkethERC20Token;
|
|
425
|
+
/**
|
|
426
|
+
* The Bera Chain network support tokens
|
|
427
|
+
* Bera Chain Tokens are ERC20 tokens
|
|
428
|
+
*/
|
|
429
|
+
class BeraERC20Token extends ContractAddressDefinedToken {
|
|
430
|
+
constructor(options) {
|
|
431
|
+
super(options);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
exports.BeraERC20Token = BeraERC20Token;
|
|
435
|
+
/**
|
|
436
|
+
* The Coredao Chain network support tokens
|
|
437
|
+
* Coredao Chain Tokens are ERC20 tokens
|
|
438
|
+
*/
|
|
439
|
+
class CoredaoERC20Token extends ContractAddressDefinedToken {
|
|
440
|
+
constructor(options) {
|
|
441
|
+
super(options);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
exports.CoredaoERC20Token = CoredaoERC20Token;
|
|
445
|
+
/**
|
|
446
|
+
* The World Chain network supports tokens
|
|
447
|
+
* World Chain Tokens are ERC20 tokens
|
|
448
|
+
*/
|
|
449
|
+
class WorldERC20Token extends ContractAddressDefinedToken {
|
|
450
|
+
constructor(options) {
|
|
451
|
+
super(options);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
exports.WorldERC20Token = WorldERC20Token;
|
|
455
|
+
/**
|
|
456
|
+
* The Flr Chain network supports tokens
|
|
457
|
+
* Flr Chain Tokens are ERC20 tokens
|
|
458
|
+
*/
|
|
459
|
+
class FlrERC20Token extends ContractAddressDefinedToken {
|
|
460
|
+
constructor(options) {
|
|
461
|
+
super(options);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
exports.FlrERC20Token = FlrERC20Token;
|
|
465
|
+
/**
|
|
466
|
+
* The XDC network supports tokens
|
|
467
|
+
* XDC Tokens are ERC20 tokens
|
|
468
|
+
*/
|
|
469
|
+
class XdcERC20Token extends ContractAddressDefinedToken {
|
|
470
|
+
constructor(options) {
|
|
471
|
+
super(options);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
exports.XdcERC20Token = XdcERC20Token;
|
|
475
|
+
/**
|
|
476
|
+
* The Mon network supports tokens
|
|
477
|
+
* Mon Tokens are ERC20 tokens
|
|
478
|
+
*/
|
|
479
|
+
class MonERC20Token extends ContractAddressDefinedToken {
|
|
480
|
+
constructor(options) {
|
|
481
|
+
super(options);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
exports.MonERC20Token = MonERC20Token;
|
|
272
485
|
/**
|
|
273
486
|
* The Xrp network supports tokens
|
|
274
487
|
* Xrp tokens are identified by their issuer address
|
|
@@ -284,11 +497,77 @@ class XrpCoin extends AccountCoinToken {
|
|
|
284
497
|
throw new errors_1.InvalidDomainError(options.name, options.domain);
|
|
285
498
|
}
|
|
286
499
|
this.domain = options.domain;
|
|
287
|
-
this.
|
|
288
|
-
this.
|
|
500
|
+
this.issuerAddress = options.contractAddress.split('::')[0];
|
|
501
|
+
this.currencyCode = options.contractAddress.split('::')[1];
|
|
502
|
+
this.contractAddress = options.contractAddress;
|
|
289
503
|
}
|
|
290
504
|
}
|
|
291
505
|
exports.XrpCoin = XrpCoin;
|
|
506
|
+
/**
|
|
507
|
+
* XRP Ledger Multi-Purpose Token (MPT) — MPTokensV1 amendment.
|
|
508
|
+
* Identified by a 48-char hex MPTokenIssuanceID stored as contractAddress.
|
|
509
|
+
* Uses account_objects (not account_lines). No issuer::currency pattern.
|
|
510
|
+
* Named xrp:<token_name> — same pattern as trust-line tokens.
|
|
511
|
+
*/
|
|
512
|
+
class XrpMptCoin extends AccountCoinToken {
|
|
513
|
+
constructor(options) {
|
|
514
|
+
super({ ...options });
|
|
515
|
+
if (!/^[0-9a-fA-F]{48}$/.test(options.mptIssuanceId)) {
|
|
516
|
+
throw new errors_1.InvalidContractAddressError(options.name, options.mptIssuanceId);
|
|
517
|
+
}
|
|
518
|
+
if (!Number.isInteger(options.assetScale) || options.assetScale < 0 || options.assetScale > 255) {
|
|
519
|
+
throw new Error(`invalid assetScale '${options.assetScale}' for coin '${options.name}': must be an integer between 0 and 255 (uint8)`);
|
|
520
|
+
}
|
|
521
|
+
this.contractAddress = options.mptIssuanceId;
|
|
522
|
+
this.canTransfer = options.canTransfer;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
exports.XrpMptCoin = XrpMptCoin;
|
|
526
|
+
class SuiCoin extends AccountCoinToken {
|
|
527
|
+
constructor(options) {
|
|
528
|
+
super({
|
|
529
|
+
...options,
|
|
530
|
+
});
|
|
531
|
+
this.packageId = options.packageId;
|
|
532
|
+
this.module = options.module;
|
|
533
|
+
this.symbol = options.symbol;
|
|
534
|
+
this.contractAddress = options.contractAddress;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
exports.SuiCoin = SuiCoin;
|
|
538
|
+
/**
|
|
539
|
+
* The Apt network supports tokens
|
|
540
|
+
* Apt tokens work similar to native Apt coin, but the token name is determined by
|
|
541
|
+
* the tokenAddress on the chain.
|
|
542
|
+
*
|
|
543
|
+
*/
|
|
544
|
+
class AptCoin extends AccountCoinToken {
|
|
545
|
+
constructor(options) {
|
|
546
|
+
super({
|
|
547
|
+
...options,
|
|
548
|
+
});
|
|
549
|
+
this.assetId = options.assetId;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
exports.AptCoin = AptCoin;
|
|
553
|
+
/**
|
|
554
|
+
* The Apt network supports non-fungible tokens (Digital Asset Standard)
|
|
555
|
+
* Every NFT belongs to an NFT collection.
|
|
556
|
+
*/
|
|
557
|
+
class AptNFTCollection extends NFTCollectionIdDefinedToken {
|
|
558
|
+
}
|
|
559
|
+
exports.AptNFTCollection = AptNFTCollection;
|
|
560
|
+
/**
|
|
561
|
+
* The Vechain network supports non-fungible tokens
|
|
562
|
+
* Every NFT belongs to an NFT collection(contract).
|
|
563
|
+
*/
|
|
564
|
+
class VetNFTCollection extends NFTCollectionIdDefinedToken {
|
|
565
|
+
constructor(options) {
|
|
566
|
+
super(options);
|
|
567
|
+
this.gasTankToken = options.gasTankToken;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
exports.VetNFTCollection = VetNFTCollection;
|
|
292
571
|
/**
|
|
293
572
|
* Fiat currencies, such as USD, EUR, or YEN.
|
|
294
573
|
*/
|
|
@@ -306,6 +585,137 @@ class FiatCoin extends base_1.BaseCoin {
|
|
|
306
585
|
}
|
|
307
586
|
exports.FiatCoin = FiatCoin;
|
|
308
587
|
FiatCoin.DEFAULT_FEATURES = [...AccountCoin.DEFAULT_FEATURES];
|
|
588
|
+
/**
|
|
589
|
+
* The Stacks network supports tokens
|
|
590
|
+
* Stx tokens work similar to native Stx coin, but the token name is determined by
|
|
591
|
+
* the contractName on the chain.
|
|
592
|
+
*/
|
|
593
|
+
class Sip10Token extends AccountCoinToken {
|
|
594
|
+
constructor(options) {
|
|
595
|
+
super({
|
|
596
|
+
...options,
|
|
597
|
+
});
|
|
598
|
+
this.assetId = options.assetId;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
exports.Sip10Token = Sip10Token;
|
|
602
|
+
/**
|
|
603
|
+
* The Near network supports tokens
|
|
604
|
+
* Near tokens work similar to native near coin
|
|
605
|
+
*/
|
|
606
|
+
class Nep141Token extends AccountCoinToken {
|
|
607
|
+
constructor(options) {
|
|
608
|
+
super({
|
|
609
|
+
...options,
|
|
610
|
+
});
|
|
611
|
+
this.contractAddress = options.contractAddress;
|
|
612
|
+
this.storageDepositAmount = options.storageDepositAmount;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
exports.Nep141Token = Nep141Token;
|
|
616
|
+
class VetToken extends AccountCoinToken {
|
|
617
|
+
constructor(options) {
|
|
618
|
+
super({
|
|
619
|
+
...options,
|
|
620
|
+
});
|
|
621
|
+
this.contractAddress = options.contractAddress;
|
|
622
|
+
this.gasTankToken = options.gasTankToken;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
exports.VetToken = VetToken;
|
|
626
|
+
/**
|
|
627
|
+
* Cosmos network supports tokens
|
|
628
|
+
* Cosmos tokens work similar to native coins, but the token is determined by
|
|
629
|
+
* the denom on chain.
|
|
630
|
+
*
|
|
631
|
+
*/
|
|
632
|
+
class CosmosChainToken extends AccountCoinToken {
|
|
633
|
+
constructor(options) {
|
|
634
|
+
super({
|
|
635
|
+
...options,
|
|
636
|
+
});
|
|
637
|
+
this.denom = options.denom;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
exports.CosmosChainToken = CosmosChainToken;
|
|
641
|
+
/**
|
|
642
|
+
* TON supports tokens and Jetton is a token standard on TON
|
|
643
|
+
* Jetton tokens work similar to native TON coin
|
|
644
|
+
*/
|
|
645
|
+
class JettonToken extends AccountCoinToken {
|
|
646
|
+
constructor(options) {
|
|
647
|
+
super({
|
|
648
|
+
...options,
|
|
649
|
+
});
|
|
650
|
+
this.contractAddress = options.contractAddress;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
exports.JettonToken = JettonToken;
|
|
654
|
+
/**
|
|
655
|
+
* The Bittensor network supports tokens
|
|
656
|
+
* The token name is determined by the subnetId on chain.
|
|
657
|
+
*/
|
|
658
|
+
class TaoCoin extends AccountCoinToken {
|
|
659
|
+
constructor(options) {
|
|
660
|
+
super({
|
|
661
|
+
...options,
|
|
662
|
+
});
|
|
663
|
+
this.subnetId = options.subnetId;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
exports.TaoCoin = TaoCoin;
|
|
667
|
+
/**
|
|
668
|
+
* The Bittensor network supports tokens
|
|
669
|
+
* The token name is determined by the subnetId on chain.
|
|
670
|
+
*/
|
|
671
|
+
class PolyxCoin extends AccountCoinToken {
|
|
672
|
+
constructor(options) {
|
|
673
|
+
super({
|
|
674
|
+
...options,
|
|
675
|
+
});
|
|
676
|
+
this.ticker = options.ticker;
|
|
677
|
+
this.assetId = options.assetId;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
exports.PolyxCoin = PolyxCoin;
|
|
681
|
+
class AdaToken extends AccountCoinToken {
|
|
682
|
+
constructor(options) {
|
|
683
|
+
super({
|
|
684
|
+
...options,
|
|
685
|
+
});
|
|
686
|
+
this.policyId = options.policyId;
|
|
687
|
+
this.assetName = options.assetName;
|
|
688
|
+
this.contractAddress = options.contractAddress;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
exports.AdaToken = AdaToken;
|
|
692
|
+
/**
|
|
693
|
+
* The canton network supports tokens
|
|
694
|
+
* Canton tokens work similar to Canton coin,
|
|
695
|
+
* but they will have their own token standard base url and instrument admin
|
|
696
|
+
*/
|
|
697
|
+
class CantonToken extends AccountCoinToken {
|
|
698
|
+
constructor(options) {
|
|
699
|
+
super({
|
|
700
|
+
...options,
|
|
701
|
+
});
|
|
702
|
+
this.baseUrl = options.baseUrl;
|
|
703
|
+
this.contractAddress = options.contractAddress;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
exports.CantonToken = CantonToken;
|
|
707
|
+
/**
|
|
708
|
+
* The Tempo network supports TIP20 tokens
|
|
709
|
+
* TIP20 tokens are ERC20-compatible tokens on the Tempo network
|
|
710
|
+
*/
|
|
711
|
+
class Tip20Token extends ContractAddressDefinedToken {
|
|
712
|
+
constructor(options) {
|
|
713
|
+
super({
|
|
714
|
+
...options,
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
exports.Tip20Token = Tip20Token;
|
|
309
719
|
/**
|
|
310
720
|
* Factory function for account coin instances.
|
|
311
721
|
*
|
|
@@ -337,23 +747,122 @@ function account(id, name, fullName, network, decimalPlaces, asset, baseUnit, fe
|
|
|
337
747
|
primaryKeyCurve,
|
|
338
748
|
}));
|
|
339
749
|
}
|
|
340
|
-
exports.account = account;
|
|
341
750
|
/**
|
|
342
|
-
* Factory function for
|
|
751
|
+
* Factory function for gas tank account coin instances.
|
|
343
752
|
*
|
|
344
753
|
* @param id uuid v4
|
|
345
|
-
* @param name unique identifier of the
|
|
346
|
-
* @param fullName Complete human-readable name of the
|
|
347
|
-
* @param
|
|
348
|
-
* @param
|
|
349
|
-
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
754
|
+
* @param name unique identifier of the coin
|
|
755
|
+
* @param fullName Complete human-readable name of the coin
|
|
756
|
+
* @param network Network object for this coin
|
|
757
|
+
* @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
|
|
758
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
759
|
+
* @param baseUnit
|
|
760
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
761
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
762
|
+
* @param gasTankLowBalanceAlertFactor Low gas tank balance alert threshold = (feeEstimate x gasTankLowBalanceAlertFactor)
|
|
763
|
+
* @param gasTankMinBalanceRecommendationFactor Min gas tank balance recommendation = (feeEstimate x gasTankMinBalanceRecommendationFactor)
|
|
764
|
+
* @param prefix Optional coin prefix. Defaults to empty string
|
|
765
|
+
* @param suffix Optional coin suffix. Defaults to coin name.
|
|
766
|
+
* @param isToken Whether or not this account coin is a token of another coin
|
|
767
|
+
*/
|
|
768
|
+
function gasTankAccount(id, name, fullName, network, decimalPlaces, asset, baseUnit, features = AccountCoin.DEFAULT_FEATURES, primaryKeyCurve = base_1.KeyCurve.Secp256k1, gasTankLowBalanceAlertFactor = 2, gasTankMinBalanceRecommendationFactor = 10, prefix = '', suffix = name.toUpperCase(), isToken = false, gasTankToken) {
|
|
769
|
+
return Object.freeze(new GasTankAccountCoin({
|
|
770
|
+
id,
|
|
771
|
+
name,
|
|
772
|
+
fullName,
|
|
773
|
+
network,
|
|
774
|
+
prefix,
|
|
775
|
+
suffix,
|
|
776
|
+
baseUnit,
|
|
777
|
+
features,
|
|
778
|
+
decimalPlaces,
|
|
779
|
+
isToken,
|
|
780
|
+
asset,
|
|
781
|
+
primaryKeyCurve,
|
|
782
|
+
gasTankLowBalanceAlertFactor,
|
|
783
|
+
gasTankMinBalanceRecommendationFactor,
|
|
784
|
+
gasTankToken,
|
|
785
|
+
}));
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* Factory function for ethLikeErc20 token instances.
|
|
789
|
+
*
|
|
790
|
+
* @param id uuid v4
|
|
791
|
+
* @param name unique identifier of the token
|
|
792
|
+
* @param fullName Complete human-readable name of the token
|
|
793
|
+
* @param decimalPlaces Number of decimal places this token supports
|
|
794
|
+
* @param contractAddress Contract address of this token
|
|
795
|
+
* @param asset Asset which this coin represents
|
|
796
|
+
* @param network Optional token network
|
|
797
|
+
* @param coinNames The parent coin names for mainnet and testnet
|
|
798
|
+
* @param features Features of this coin
|
|
799
|
+
* @param prefix Optional token prefix
|
|
800
|
+
* @param suffix Optional token suffix
|
|
801
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
802
|
+
*/
|
|
803
|
+
function erc20Token(id, name, fullName, decimalPlaces, contractAddress, asset, network, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
804
|
+
return Object.freeze(new EthLikeERC20Token({
|
|
805
|
+
id,
|
|
806
|
+
name,
|
|
807
|
+
fullName,
|
|
808
|
+
network,
|
|
809
|
+
contractAddress,
|
|
810
|
+
decimalPlaces,
|
|
811
|
+
asset,
|
|
812
|
+
features,
|
|
813
|
+
prefix,
|
|
814
|
+
suffix,
|
|
815
|
+
primaryKeyCurve,
|
|
816
|
+
isToken: true,
|
|
817
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
818
|
+
}));
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* Factory function for erc721 token instances.
|
|
822
|
+
*
|
|
823
|
+
* @param id uuid v4
|
|
824
|
+
* @param name unique identifier of the token
|
|
825
|
+
* @param fullName Complete human-readable name of the token
|
|
826
|
+
* @param contractAddress Contract address of this token
|
|
827
|
+
* @param network network
|
|
828
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
829
|
+
* @param prefix Optional token prefix
|
|
830
|
+
* @param suffix Optional token suffix
|
|
831
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
832
|
+
*/
|
|
833
|
+
function erc721Token(id, name, fullName, contractAddress, network, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
834
|
+
return Object.freeze(new EthLikeERC721Token({
|
|
835
|
+
id,
|
|
836
|
+
name,
|
|
837
|
+
fullName,
|
|
838
|
+
network,
|
|
839
|
+
contractAddress,
|
|
840
|
+
decimalPlaces: 0, // ERC721 tokens are non-divisible
|
|
841
|
+
asset: base_1.UnderlyingAsset.ERC721,
|
|
842
|
+
features,
|
|
843
|
+
prefix,
|
|
844
|
+
suffix,
|
|
845
|
+
primaryKeyCurve,
|
|
846
|
+
isToken: true,
|
|
847
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
848
|
+
}));
|
|
849
|
+
}
|
|
850
|
+
/**
|
|
851
|
+
* Factory function for erc20 token instances.
|
|
852
|
+
*
|
|
853
|
+
* @param id uuid v4
|
|
854
|
+
* @param name unique identifier of the token
|
|
855
|
+
* @param fullName Complete human-readable name of the token
|
|
856
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
857
|
+
* @param contractAddress Contract address of this token
|
|
858
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
350
859
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
351
860
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
352
861
|
* @param network? Optional token network. Defaults to Ethereum main network.
|
|
353
862
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
354
863
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
355
864
|
*/
|
|
356
|
-
function erc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ethereum, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
865
|
+
function erc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.BULK_TRANSACTION], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ethereum, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
357
866
|
return Object.freeze(new Erc20Coin({
|
|
358
867
|
id,
|
|
359
868
|
name,
|
|
@@ -370,7 +879,6 @@ function erc20(id, name, fullName, decimalPlaces, contractAddress, asset, featur
|
|
|
370
879
|
baseUnit: base_1.BaseUnit.ETH,
|
|
371
880
|
}));
|
|
372
881
|
}
|
|
373
|
-
exports.erc20 = erc20;
|
|
374
882
|
/**
|
|
375
883
|
* Factory function for testnet erc20 token instances.
|
|
376
884
|
*
|
|
@@ -385,10 +893,62 @@ exports.erc20 = erc20;
|
|
|
385
893
|
* @param network? Optional token network. Defaults to the Kovan test network.
|
|
386
894
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
387
895
|
*/
|
|
388
|
-
function terc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.kovan) {
|
|
896
|
+
function terc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.BULK_TRANSACTION], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.kovan) {
|
|
389
897
|
return erc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network);
|
|
390
898
|
}
|
|
391
|
-
|
|
899
|
+
/**
|
|
900
|
+
* Factory function for ERC-7984 confidential token instances (Zama fhEVM).
|
|
901
|
+
*
|
|
902
|
+
* ERC-7984 tokens store balances as FHE-encrypted ciphertexts. Transfers use
|
|
903
|
+
* confidentialTransfer() and balance reads require ACL delegation to BitGo.
|
|
904
|
+
*
|
|
905
|
+
* @param id uuid v4
|
|
906
|
+
* @param name unique identifier of the token (e.g. 'eth:ctkn')
|
|
907
|
+
* @param fullName Complete human-readable name of the token
|
|
908
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
909
|
+
* @param contractAddress Contract address of this token
|
|
910
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
911
|
+
* @param features? Features of this coin. Defaults to ERC7984_TOKEN_FEATURES
|
|
912
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
913
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
914
|
+
* @param network? Optional token network. Defaults to Ethereum main network.
|
|
915
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
916
|
+
*/
|
|
917
|
+
function erc7984(id, name, fullName, decimalPlaces, contractAddress, asset, features = coinFeatures_1.ERC7984_TOKEN_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ethereum, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
918
|
+
return Object.freeze(new Erc7984Coin({
|
|
919
|
+
id,
|
|
920
|
+
name,
|
|
921
|
+
fullName,
|
|
922
|
+
network,
|
|
923
|
+
contractAddress,
|
|
924
|
+
prefix,
|
|
925
|
+
suffix,
|
|
926
|
+
features,
|
|
927
|
+
decimalPlaces,
|
|
928
|
+
asset,
|
|
929
|
+
isToken: true,
|
|
930
|
+
primaryKeyCurve,
|
|
931
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
932
|
+
}));
|
|
933
|
+
}
|
|
934
|
+
/**
|
|
935
|
+
* Factory function for testnet ERC-7984 confidential token instances (Zama fhEVM).
|
|
936
|
+
*
|
|
937
|
+
* @param id uuid v4
|
|
938
|
+
* @param name unique identifier of the token (e.g. 'hteth:ctkn')
|
|
939
|
+
* @param fullName Complete human-readable name of the token
|
|
940
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
941
|
+
* @param contractAddress Contract address of this token
|
|
942
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
943
|
+
* @param features? Features of this coin. Defaults to ERC7984_TOKEN_FEATURES
|
|
944
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
945
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
946
|
+
* @param network? Optional token network. Defaults to Hoodi test network.
|
|
947
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
948
|
+
*/
|
|
949
|
+
function terc7984(id, name, fullName, decimalPlaces, contractAddress, asset, features = coinFeatures_1.ERC7984_TOKEN_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.hoodi, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
950
|
+
return erc7984(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
951
|
+
}
|
|
392
952
|
/**
|
|
393
953
|
* Factory function for erc721 token instances.
|
|
394
954
|
*
|
|
@@ -420,7 +980,6 @@ function erc721(id, name, fullName, contractAddress, features = AccountCoin.DEFA
|
|
|
420
980
|
baseUnit: base_1.BaseUnit.ETH,
|
|
421
981
|
}));
|
|
422
982
|
}
|
|
423
|
-
exports.erc721 = erc721;
|
|
424
983
|
/**
|
|
425
984
|
* Factory function for testnet erc721 token instances.
|
|
426
985
|
*
|
|
@@ -431,13 +990,12 @@ exports.erc721 = erc721;
|
|
|
431
990
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
432
991
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
433
992
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
434
|
-
* @param network? Optional token network. Defaults to
|
|
993
|
+
* @param network? Optional token network. Defaults to Hoodi test network.
|
|
435
994
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
436
995
|
*/
|
|
437
|
-
function terc721(id, name, fullName, contractAddress, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.
|
|
996
|
+
function terc721(id, name, fullName, contractAddress, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.hoodi, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
438
997
|
return erc721(id, name, fullName, contractAddress, features, prefix, suffix, network, primaryKeyCurve);
|
|
439
998
|
}
|
|
440
|
-
exports.terc721 = terc721;
|
|
441
999
|
/**
|
|
442
1000
|
* Factory function for nonstandard token instances.
|
|
443
1001
|
*
|
|
@@ -469,7 +1027,6 @@ function nonstandardToken(id, name, fullName, contractAddress, features = Accoun
|
|
|
469
1027
|
baseUnit: base_1.BaseUnit.ETH,
|
|
470
1028
|
}));
|
|
471
1029
|
}
|
|
472
|
-
exports.nonstandardToken = nonstandardToken;
|
|
473
1030
|
/**
|
|
474
1031
|
* Factory function for erc1155 token instances.
|
|
475
1032
|
*
|
|
@@ -501,7 +1058,6 @@ function erc1155(id, name, fullName, contractAddress, features = AccountCoin.DEF
|
|
|
501
1058
|
baseUnit: base_1.BaseUnit.ETH,
|
|
502
1059
|
}));
|
|
503
1060
|
}
|
|
504
|
-
exports.erc1155 = erc1155;
|
|
505
1061
|
/**
|
|
506
1062
|
* Factory function for testnet erc1155 token instances.
|
|
507
1063
|
*
|
|
@@ -512,13 +1068,12 @@ exports.erc1155 = erc1155;
|
|
|
512
1068
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
513
1069
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
514
1070
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
515
|
-
* @param network? Optional token network. Defaults to
|
|
1071
|
+
* @param network? Optional token network. Defaults to Hoodi test network.
|
|
516
1072
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
517
1073
|
*/
|
|
518
|
-
function terc1155(id, name, fullName, contractAddress, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.
|
|
1074
|
+
function terc1155(id, name, fullName, contractAddress, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.hoodi, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
519
1075
|
return erc1155(id, name, fullName, contractAddress, features, prefix, suffix, network, primaryKeyCurve);
|
|
520
1076
|
}
|
|
521
|
-
exports.terc1155 = terc1155;
|
|
522
1077
|
/**
|
|
523
1078
|
* Factory function for ERC20-compatible account coin instances.
|
|
524
1079
|
*
|
|
@@ -551,7 +1106,6 @@ function erc20CompatibleAccountCoin(id, name, fullName, network, decimalPlaces,
|
|
|
551
1106
|
baseUnit,
|
|
552
1107
|
}));
|
|
553
1108
|
}
|
|
554
|
-
exports.erc20CompatibleAccountCoin = erc20CompatibleAccountCoin;
|
|
555
1109
|
/**
|
|
556
1110
|
* Factory function for celo token instances.
|
|
557
1111
|
*
|
|
@@ -560,14 +1114,14 @@ exports.erc20CompatibleAccountCoin = erc20CompatibleAccountCoin;
|
|
|
560
1114
|
* @param fullName Complete human-readable name of the token
|
|
561
1115
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
562
1116
|
* @param contractAddress Contract address of this token
|
|
563
|
-
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin
|
|
564
|
-
* @param prefix? Optional token prefix. Defaults to empty string
|
|
565
|
-
* @param suffix? Optional token suffix. Defaults to token name.
|
|
566
|
-
* @param network? Optional token network. Defaults to CELO main network.
|
|
567
|
-
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES
|
|
1117
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin
|
|
1118
|
+
* @param prefix ? Optional token prefix. Defaults to empty string
|
|
1119
|
+
* @param suffix ? Optional token suffix. Defaults to token name.
|
|
1120
|
+
* @param network ? Optional token network. Defaults to CELO main network.
|
|
1121
|
+
* @param features ? Features of this coin. Defaults to the DEFAULT_FEATURES excluding CUSTODY feature
|
|
568
1122
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
569
1123
|
*/
|
|
570
|
-
function celoToken(id, name, fullName, decimalPlaces, contractAddress, asset, features =
|
|
1124
|
+
function celoToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = coinFeatures_1.CELO_TOKEN_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.celo, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
571
1125
|
return Object.freeze(new CeloCoin({
|
|
572
1126
|
id,
|
|
573
1127
|
name,
|
|
@@ -584,7 +1138,6 @@ function celoToken(id, name, fullName, decimalPlaces, contractAddress, asset, fe
|
|
|
584
1138
|
baseUnit: base_1.BaseUnit.ETH,
|
|
585
1139
|
}));
|
|
586
1140
|
}
|
|
587
|
-
exports.celoToken = celoToken;
|
|
588
1141
|
/**
|
|
589
1142
|
* Factory function for testnet celo token instances.
|
|
590
1143
|
*
|
|
@@ -594,15 +1147,14 @@ exports.celoToken = celoToken;
|
|
|
594
1147
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
595
1148
|
* @param contractAddress Contract address of this token
|
|
596
1149
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
597
|
-
* @param
|
|
598
|
-
* @param
|
|
599
|
-
* @param
|
|
600
|
-
* @param
|
|
1150
|
+
* @param features ? Features of this coin. Defaults to the DEFAULT_FEATURES excluding CUSTODY feature
|
|
1151
|
+
* @param prefix ? Optional token prefix. Defaults to empty string
|
|
1152
|
+
* @param suffix ? Optional token suffix. Defaults to token name.
|
|
1153
|
+
* @param network ? Optional token network. Defaults to the testnet CELO network.
|
|
601
1154
|
*/
|
|
602
|
-
function tceloToken(id, name, fullName, decimalPlaces, contractAddress, asset, features =
|
|
1155
|
+
function tceloToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = coinFeatures_1.CELO_TOKEN_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.celo) {
|
|
603
1156
|
return celoToken(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network);
|
|
604
1157
|
}
|
|
605
|
-
exports.tceloToken = tceloToken;
|
|
606
1158
|
/**
|
|
607
1159
|
* Factory function for celo token instances.
|
|
608
1160
|
*
|
|
@@ -635,7 +1187,6 @@ function bscToken(id, name, fullName, decimalPlaces, contractAddress, asset, fea
|
|
|
635
1187
|
baseUnit: base_1.BaseUnit.BSC,
|
|
636
1188
|
}));
|
|
637
1189
|
}
|
|
638
|
-
exports.bscToken = bscToken;
|
|
639
1190
|
/**
|
|
640
1191
|
* Factory function for testnet bsc token instances.
|
|
641
1192
|
*
|
|
@@ -653,7 +1204,6 @@ exports.bscToken = bscToken;
|
|
|
653
1204
|
function tbscToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.bsc) {
|
|
654
1205
|
return bscToken(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network);
|
|
655
1206
|
}
|
|
656
|
-
exports.tbscToken = tbscToken;
|
|
657
1207
|
/**
|
|
658
1208
|
* Factory function for Stellar token instances.
|
|
659
1209
|
*
|
|
@@ -687,7 +1237,6 @@ function stellarToken(id, name, fullName, decimalPlaces, asset, domain = '', fea
|
|
|
687
1237
|
baseUnit: base_1.BaseUnit.XLM,
|
|
688
1238
|
}));
|
|
689
1239
|
}
|
|
690
|
-
exports.stellarToken = stellarToken;
|
|
691
1240
|
/**
|
|
692
1241
|
* Factory function for testnet Stellar token instances.
|
|
693
1242
|
*
|
|
@@ -706,7 +1255,6 @@ exports.stellarToken = stellarToken;
|
|
|
706
1255
|
function tstellarToken(id, name, fullName, decimalPlaces, asset, domain = '', features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.stellar) {
|
|
707
1256
|
return stellarToken(id, name, fullName, decimalPlaces, asset, domain, features, prefix, suffix, network);
|
|
708
1257
|
}
|
|
709
|
-
exports.tstellarToken = tstellarToken;
|
|
710
1258
|
/**
|
|
711
1259
|
* Factory function for tron token instances.
|
|
712
1260
|
*
|
|
@@ -739,7 +1287,6 @@ function tronToken(id, name, fullName, decimalPlaces, contractAddress, asset, fe
|
|
|
739
1287
|
baseUnit: base_1.BaseUnit.TRX,
|
|
740
1288
|
}));
|
|
741
1289
|
}
|
|
742
|
-
exports.tronToken = tronToken;
|
|
743
1290
|
/**
|
|
744
1291
|
* Factory function for testnet tron token instances.
|
|
745
1292
|
*
|
|
@@ -758,7 +1305,6 @@ exports.tronToken = tronToken;
|
|
|
758
1305
|
function ttronToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.trx, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
759
1306
|
return tronToken(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
760
1307
|
}
|
|
761
|
-
exports.ttronToken = ttronToken;
|
|
762
1308
|
/**
|
|
763
1309
|
* Factory function for Hedera coin instances
|
|
764
1310
|
*
|
|
@@ -774,14 +1320,14 @@ exports.ttronToken = ttronToken;
|
|
|
774
1320
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
775
1321
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
776
1322
|
*/
|
|
777
|
-
function hederaCoin(id, name, fullName, network, decimalPlaces, asset,
|
|
1323
|
+
function hederaCoin(id, name, fullName, network, decimalPlaces, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
778
1324
|
return Object.freeze(new HederaCoin({
|
|
779
1325
|
id,
|
|
780
1326
|
name,
|
|
781
1327
|
fullName,
|
|
782
1328
|
decimalPlaces,
|
|
783
1329
|
asset,
|
|
784
|
-
nodeAccountId,
|
|
1330
|
+
nodeAccountId: constants_1.HEDERA_NODE_ACCCOUNT_ID,
|
|
785
1331
|
features,
|
|
786
1332
|
prefix,
|
|
787
1333
|
suffix,
|
|
@@ -791,7 +1337,6 @@ function hederaCoin(id, name, fullName, network, decimalPlaces, asset, nodeAccou
|
|
|
791
1337
|
baseUnit: base_1.BaseUnit.HBAR,
|
|
792
1338
|
}));
|
|
793
1339
|
}
|
|
794
|
-
exports.hederaCoin = hederaCoin;
|
|
795
1340
|
/**
|
|
796
1341
|
* Factory function for Hedera token instances
|
|
797
1342
|
*
|
|
@@ -802,21 +1347,22 @@ exports.hederaCoin = hederaCoin;
|
|
|
802
1347
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
803
1348
|
* @param nodeAccountId node account Id from which the transaction will be sent
|
|
804
1349
|
* @param tokenId The unique identifier of this token
|
|
1350
|
+
* @param contractAddress Contract address of this token, same as tokenId
|
|
805
1351
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
806
1352
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
807
1353
|
* @param network? Optional token network. Defaults to Hedera mainnet.
|
|
808
1354
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
809
1355
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
810
1356
|
*/
|
|
811
|
-
function hederaToken(id, name, fullName, network, decimalPlaces, asset,
|
|
1357
|
+
function hederaToken(id, name, fullName, network, decimalPlaces, asset, contractAddress, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
812
1358
|
return Object.freeze(new HederaToken({
|
|
813
1359
|
id,
|
|
814
1360
|
name,
|
|
815
1361
|
fullName,
|
|
816
1362
|
decimalPlaces,
|
|
817
1363
|
asset,
|
|
818
|
-
nodeAccountId,
|
|
819
|
-
|
|
1364
|
+
nodeAccountId: constants_1.HEDERA_NODE_ACCCOUNT_ID,
|
|
1365
|
+
contractAddress,
|
|
820
1366
|
features,
|
|
821
1367
|
prefix,
|
|
822
1368
|
suffix,
|
|
@@ -826,7 +1372,6 @@ function hederaToken(id, name, fullName, network, decimalPlaces, asset, nodeAcco
|
|
|
826
1372
|
baseUnit: base_1.BaseUnit.HBAR,
|
|
827
1373
|
}));
|
|
828
1374
|
}
|
|
829
|
-
exports.hederaToken = hederaToken;
|
|
830
1375
|
/**
|
|
831
1376
|
* Factory function for ALGO token instances.
|
|
832
1377
|
*
|
|
@@ -837,7 +1382,6 @@ exports.hederaToken = hederaToken;
|
|
|
837
1382
|
* @param fullName Complete human-readable name of the token
|
|
838
1383
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
839
1384
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
840
|
-
* @param tokenURL Optional asset Url for more informationa about the asset
|
|
841
1385
|
* See https://developer.algorand.org/docs/reference/transactions/#url
|
|
842
1386
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
843
1387
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
@@ -845,7 +1389,7 @@ exports.hederaToken = hederaToken;
|
|
|
845
1389
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
846
1390
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
847
1391
|
*/
|
|
848
|
-
function algoToken(id, name, alias, fullName, decimalPlaces, asset,
|
|
1392
|
+
function algoToken(id, name, alias, fullName, decimalPlaces, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.algorand, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
849
1393
|
return Object.freeze(new AlgoCoin({
|
|
850
1394
|
id,
|
|
851
1395
|
name,
|
|
@@ -853,7 +1397,6 @@ function algoToken(id, name, alias, fullName, decimalPlaces, asset, tokenURL = '
|
|
|
853
1397
|
fullName,
|
|
854
1398
|
decimalPlaces,
|
|
855
1399
|
asset,
|
|
856
|
-
tokenURL: tokenURL,
|
|
857
1400
|
features,
|
|
858
1401
|
prefix,
|
|
859
1402
|
suffix,
|
|
@@ -863,7 +1406,6 @@ function algoToken(id, name, alias, fullName, decimalPlaces, asset, tokenURL = '
|
|
|
863
1406
|
baseUnit: base_1.BaseUnit.ALGO,
|
|
864
1407
|
}));
|
|
865
1408
|
}
|
|
866
|
-
exports.algoToken = algoToken;
|
|
867
1409
|
/**
|
|
868
1410
|
* Factory function for testnet ALGO token instances.
|
|
869
1411
|
*
|
|
@@ -873,17 +1415,15 @@ exports.algoToken = algoToken;
|
|
|
873
1415
|
* @param fullName Complete human-readable name of the token
|
|
874
1416
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
875
1417
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
876
|
-
* @param tokenURL Optional asset Url for more informationa about the asset
|
|
877
1418
|
* See https://developer.algorand.org/docs/reference/transactions/#url
|
|
878
1419
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
879
1420
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
880
1421
|
* @param network? Optional token network. Defaults to Algo testnet.
|
|
881
1422
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
882
1423
|
*/
|
|
883
|
-
function talgoToken(id, name, alias, fullName, decimalPlaces, asset,
|
|
884
|
-
return algoToken(id, name, alias, fullName, decimalPlaces, asset,
|
|
1424
|
+
function talgoToken(id, name, alias, fullName, decimalPlaces, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.algorand) {
|
|
1425
|
+
return algoToken(id, name, alias, fullName, decimalPlaces, asset, features, prefix, suffix, network);
|
|
885
1426
|
}
|
|
886
|
-
exports.talgoToken = talgoToken;
|
|
887
1427
|
/**
|
|
888
1428
|
* Factory function for eos token instances.
|
|
889
1429
|
*
|
|
@@ -892,6 +1432,7 @@ exports.talgoToken = talgoToken;
|
|
|
892
1432
|
* @param fullName Complete human-readable name of the token
|
|
893
1433
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
894
1434
|
* @param contractName Contract address of this token
|
|
1435
|
+
* @param contractAddress Contract address of this token
|
|
895
1436
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
896
1437
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
897
1438
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
@@ -899,13 +1440,14 @@ exports.talgoToken = talgoToken;
|
|
|
899
1440
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
900
1441
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
901
1442
|
*/
|
|
902
|
-
function eosToken(id, name, fullName, decimalPlaces, contractName, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.eos, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1443
|
+
function eosToken(id, name, fullName, decimalPlaces, contractName, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), symbol, network = networks_1.Networks.main.eos, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
903
1444
|
return Object.freeze(new EosCoin({
|
|
904
1445
|
id,
|
|
905
1446
|
name,
|
|
906
1447
|
fullName,
|
|
907
1448
|
network,
|
|
908
1449
|
contractName,
|
|
1450
|
+
contractAddress,
|
|
909
1451
|
prefix,
|
|
910
1452
|
suffix,
|
|
911
1453
|
features,
|
|
@@ -914,9 +1456,9 @@ function eosToken(id, name, fullName, decimalPlaces, contractName, asset, featur
|
|
|
914
1456
|
isToken: true,
|
|
915
1457
|
primaryKeyCurve,
|
|
916
1458
|
baseUnit: base_1.BaseUnit.EOS,
|
|
1459
|
+
symbol,
|
|
917
1460
|
}));
|
|
918
1461
|
}
|
|
919
|
-
exports.eosToken = eosToken;
|
|
920
1462
|
/**
|
|
921
1463
|
* Factory function for testnet eos token instances.
|
|
922
1464
|
*
|
|
@@ -924,17 +1466,18 @@ exports.eosToken = eosToken;
|
|
|
924
1466
|
* @param name unique identifier of the token
|
|
925
1467
|
* @param fullName Complete human-readable name of the token
|
|
926
1468
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1469
|
+
* @param contractName Contract address of this token
|
|
927
1470
|
* @param contractAddress Contract address of this token
|
|
928
1471
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
929
1472
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
930
1473
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1474
|
+
* @param symbol? token symbol as defined in token contract.
|
|
931
1475
|
* @param network? Optional token network. Defaults to the testnet EOS network.
|
|
932
1476
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
933
1477
|
*/
|
|
934
|
-
function teosToken(id, name, fullName, decimalPlaces, contractName, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.eos) {
|
|
935
|
-
return eosToken(id, name, fullName, decimalPlaces, contractName, asset, features, prefix, suffix, network);
|
|
1478
|
+
function teosToken(id, name, fullName, decimalPlaces, contractName, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), symbol, network = networks_1.Networks.test.eos) {
|
|
1479
|
+
return eosToken(id, name, fullName, decimalPlaces, contractName, contractAddress, asset, features, prefix, suffix, symbol, network);
|
|
936
1480
|
}
|
|
937
|
-
exports.teosToken = teosToken;
|
|
938
1481
|
/**
|
|
939
1482
|
* Factory function for sol token instances.
|
|
940
1483
|
*
|
|
@@ -943,6 +1486,7 @@ exports.teosToken = teosToken;
|
|
|
943
1486
|
* @param fullName Complete human-readable name of the token
|
|
944
1487
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
945
1488
|
* @param tokenAddress Token address of this token
|
|
1489
|
+
* @param contractAddress Contract address of this token
|
|
946
1490
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
947
1491
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
948
1492
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
@@ -950,16 +1494,18 @@ exports.teosToken = teosToken;
|
|
|
950
1494
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
951
1495
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
952
1496
|
*/
|
|
953
|
-
function solToken(id, name, fullName, decimalPlaces, tokenAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.sol, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
1497
|
+
function solToken(id, name, fullName, decimalPlaces, tokenAddress, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], programId = ProgramID.TokenProgramId, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.sol, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
954
1498
|
return Object.freeze(new SolCoin({
|
|
955
1499
|
id,
|
|
956
1500
|
name,
|
|
957
1501
|
fullName,
|
|
958
1502
|
network,
|
|
959
1503
|
tokenAddress,
|
|
1504
|
+
contractAddress,
|
|
960
1505
|
prefix,
|
|
961
1506
|
suffix,
|
|
962
1507
|
features,
|
|
1508
|
+
programId,
|
|
963
1509
|
decimalPlaces,
|
|
964
1510
|
asset,
|
|
965
1511
|
isToken: true,
|
|
@@ -967,7 +1513,6 @@ function solToken(id, name, fullName, decimalPlaces, tokenAddress, asset, featur
|
|
|
967
1513
|
baseUnit: base_1.BaseUnit.SOL,
|
|
968
1514
|
}));
|
|
969
1515
|
}
|
|
970
|
-
exports.solToken = solToken;
|
|
971
1516
|
/**
|
|
972
1517
|
* Factory function for testnet solana token instances.
|
|
973
1518
|
*
|
|
@@ -982,27 +1527,28 @@ exports.solToken = solToken;
|
|
|
982
1527
|
* @param network? Optional token network. Defaults to the testnet Solana network.
|
|
983
1528
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
984
1529
|
*/
|
|
985
|
-
function tsolToken(id, name, fullName, decimalPlaces, tokenAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.sol) {
|
|
986
|
-
return solToken(id, name, fullName, decimalPlaces, tokenAddress, asset, features, prefix, suffix, network);
|
|
1530
|
+
function tsolToken(id, name, fullName, decimalPlaces, tokenAddress, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], programId = ProgramID.TokenProgramId, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.sol) {
|
|
1531
|
+
return solToken(id, name, fullName, decimalPlaces, tokenAddress, contractAddress, asset, features, programId, prefix, suffix, network);
|
|
987
1532
|
}
|
|
988
|
-
exports.tsolToken = tsolToken;
|
|
989
1533
|
/**
|
|
990
|
-
* Factory function for
|
|
1534
|
+
* Factory function for prod cardano token instances.
|
|
991
1535
|
*
|
|
992
1536
|
* @param id uuid v4
|
|
993
|
-
* @param name
|
|
1537
|
+
* @param name Name of the token
|
|
994
1538
|
* @param fullName Complete human-readable name of the token
|
|
995
1539
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
996
|
-
* @param
|
|
1540
|
+
* @param policyId Policy Id
|
|
1541
|
+
* @param assetName Asset name -> Policy ID + Asset name is the unique identifier
|
|
1542
|
+
* @param contractAddress Fingerprint of this token
|
|
997
1543
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
998
1544
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
999
1545
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1000
|
-
* @param network? Optional token network. Defaults to Cardano
|
|
1546
|
+
* @param network? Optional token network. Defaults to the testnet Cardano network.
|
|
1001
1547
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
1002
1548
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1003
1549
|
*/
|
|
1004
|
-
function adaToken(id, name, fullName, decimalPlaces, policyId, assetName, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ada, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
1005
|
-
return Object.freeze(new
|
|
1550
|
+
function adaToken(id, name, fullName, decimalPlaces, policyId, assetName, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ada, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
1551
|
+
return Object.freeze(new AdaToken({
|
|
1006
1552
|
id,
|
|
1007
1553
|
name,
|
|
1008
1554
|
fullName,
|
|
@@ -1013,31 +1559,32 @@ function adaToken(id, name, fullName, decimalPlaces, policyId, assetName, asset,
|
|
|
1013
1559
|
suffix,
|
|
1014
1560
|
features,
|
|
1015
1561
|
decimalPlaces,
|
|
1562
|
+
contractAddress,
|
|
1016
1563
|
asset,
|
|
1017
1564
|
isToken: true,
|
|
1018
1565
|
primaryKeyCurve,
|
|
1019
1566
|
baseUnit: base_1.BaseUnit.ADA,
|
|
1020
1567
|
}));
|
|
1021
1568
|
}
|
|
1022
|
-
exports.adaToken = adaToken;
|
|
1023
1569
|
/**
|
|
1024
1570
|
* Factory function for testnet cardano token instances.
|
|
1025
1571
|
*
|
|
1026
1572
|
* @param id uuid v4
|
|
1027
|
-
* @param name
|
|
1573
|
+
* @param name Name of the token
|
|
1028
1574
|
* @param fullName Complete human-readable name of the token
|
|
1029
1575
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1030
|
-
* @param
|
|
1576
|
+
* @param policyId Policy Id
|
|
1577
|
+
* @param assetName Asset name -> Policy ID + Asset name is the unique identifier
|
|
1578
|
+
* @param contractAddress Fingerprint of this token
|
|
1031
1579
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1032
1580
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1033
1581
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1034
1582
|
* @param network? Optional token network. Defaults to the testnet Cardano network.
|
|
1035
1583
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
1036
1584
|
*/
|
|
1037
|
-
function tadaToken(id, name, fullName, decimalPlaces, policyId, assetName, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], prefix = '', suffix = name.toUpperCase()
|
|
1038
|
-
return adaToken(id, name, fullName, decimalPlaces, policyId, assetName, asset, features, prefix, suffix, network);
|
|
1585
|
+
function tadaToken(id, name, fullName, decimalPlaces, policyId, assetName, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], network = networks_1.Networks.test.ada, prefix = '', suffix = name.toUpperCase()) {
|
|
1586
|
+
return adaToken(id, name, fullName, decimalPlaces, policyId, assetName, contractAddress, asset, features, prefix, suffix, network);
|
|
1039
1587
|
}
|
|
1040
|
-
exports.tadaToken = tadaToken;
|
|
1041
1588
|
/**
|
|
1042
1589
|
* Factory function for avaxErc20 token instances.
|
|
1043
1590
|
*
|
|
@@ -1070,7 +1617,6 @@ function avaxErc20(id, name, fullName, decimalPlaces, contractAddress, asset, fe
|
|
|
1070
1617
|
baseUnit: base_1.BaseUnit.ETH,
|
|
1071
1618
|
}));
|
|
1072
1619
|
}
|
|
1073
|
-
exports.avaxErc20 = avaxErc20;
|
|
1074
1620
|
/**
|
|
1075
1621
|
* Factory function for testnet avaxErc20 token instances.
|
|
1076
1622
|
*
|
|
@@ -1089,7 +1635,6 @@ exports.avaxErc20 = avaxErc20;
|
|
|
1089
1635
|
function tavaxErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.avalancheC, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1090
1636
|
return avaxErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1091
1637
|
}
|
|
1092
|
-
exports.tavaxErc20 = tavaxErc20;
|
|
1093
1638
|
/**
|
|
1094
1639
|
* Factory function for polygonErc20 token instances.
|
|
1095
1640
|
*
|
|
@@ -1105,7 +1650,7 @@ exports.tavaxErc20 = tavaxErc20;
|
|
|
1105
1650
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1106
1651
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1107
1652
|
*/
|
|
1108
|
-
function polygonErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.polygon, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1653
|
+
function polygonErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.polygon, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1109
1654
|
return Object.freeze(new PolygonERC20Token({
|
|
1110
1655
|
id,
|
|
1111
1656
|
name,
|
|
@@ -1122,9 +1667,8 @@ function polygonErc20(id, name, fullName, decimalPlaces, contractAddress, asset,
|
|
|
1122
1667
|
baseUnit: base_1.BaseUnit.ETH,
|
|
1123
1668
|
}));
|
|
1124
1669
|
}
|
|
1125
|
-
exports.polygonErc20 = polygonErc20;
|
|
1126
1670
|
/**
|
|
1127
|
-
* Factory function for
|
|
1671
|
+
* Factory function for Amoy testnet polygonErc20 token instances.
|
|
1128
1672
|
*
|
|
1129
1673
|
* @param id uuid v4
|
|
1130
1674
|
* @param name unique identifier of the token
|
|
@@ -1141,33 +1685,28 @@ exports.polygonErc20 = polygonErc20;
|
|
|
1141
1685
|
function tpolygonErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.polygon, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1142
1686
|
return polygonErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1143
1687
|
}
|
|
1144
|
-
exports.tpolygonErc20 = tpolygonErc20;
|
|
1145
1688
|
/**
|
|
1146
|
-
* Factory function for
|
|
1689
|
+
* Factory function for arbethErc20 token instances.
|
|
1147
1690
|
*
|
|
1148
1691
|
* @param id uuid v4
|
|
1149
1692
|
* @param name unique identifier of the token
|
|
1150
1693
|
* @param fullName Complete human-readable name of the token
|
|
1151
1694
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1152
|
-
* @param
|
|
1153
|
-
* @param currencyCode The token symbol. Example: USD, BTC, ETH, etc.
|
|
1154
|
-
* @param domain? the domain of the issuer of the token,
|
|
1695
|
+
* @param contractAddress Contract address of this token
|
|
1155
1696
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1156
1697
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1157
1698
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1158
|
-
* @param network? Optional token network. Defaults to
|
|
1699
|
+
* @param network? Optional token network. Defaults to Arbitrum main network.
|
|
1159
1700
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1160
1701
|
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1161
1702
|
*/
|
|
1162
|
-
function
|
|
1163
|
-
return Object.freeze(new
|
|
1703
|
+
function arbethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.arbitrum, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1704
|
+
return Object.freeze(new ArbethERC20Token({
|
|
1164
1705
|
id,
|
|
1165
1706
|
name,
|
|
1166
1707
|
fullName,
|
|
1167
1708
|
network,
|
|
1168
|
-
|
|
1169
|
-
currencyCode,
|
|
1170
|
-
domain,
|
|
1709
|
+
contractAddress,
|
|
1171
1710
|
prefix,
|
|
1172
1711
|
suffix,
|
|
1173
1712
|
features,
|
|
@@ -1175,60 +1714,1203 @@ function xrpToken(id, name, fullName, decimalPlaces, issuerAddress, currencyCode
|
|
|
1175
1714
|
asset,
|
|
1176
1715
|
isToken: true,
|
|
1177
1716
|
primaryKeyCurve,
|
|
1178
|
-
baseUnit: base_1.BaseUnit.
|
|
1717
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
1179
1718
|
}));
|
|
1180
1719
|
}
|
|
1181
|
-
exports.xrpToken = xrpToken;
|
|
1182
1720
|
/**
|
|
1183
|
-
* Factory function for testnet
|
|
1721
|
+
* Factory function for Arbitrum Sepolia testnet arbethErc20 token instances.
|
|
1184
1722
|
*
|
|
1185
1723
|
* @param id uuid v4
|
|
1186
1724
|
* @param name unique identifier of the token
|
|
1187
1725
|
* @param fullName Complete human-readable name of the token
|
|
1188
1726
|
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1189
|
-
* @param
|
|
1190
|
-
* @param currencyCode The token symbol. Example: USD, BTC, ETH, etc.
|
|
1191
|
-
* @param domain? the domain of the issuer of the token,
|
|
1727
|
+
* @param contractAddress Contract address of this token
|
|
1192
1728
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1193
1729
|
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1194
1730
|
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1195
|
-
* @param network? Optional token network. Defaults to the
|
|
1731
|
+
* @param network? Optional token network. Defaults to the Arbitrum test network.
|
|
1196
1732
|
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1733
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1197
1734
|
*/
|
|
1198
|
-
function
|
|
1199
|
-
return
|
|
1735
|
+
function tarbethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.arbitrum, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1736
|
+
return arbethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1200
1737
|
}
|
|
1201
|
-
exports.txrpToken = txrpToken;
|
|
1202
1738
|
/**
|
|
1203
|
-
* Factory function for
|
|
1739
|
+
* Factory function for opethErc20 token instances.
|
|
1204
1740
|
*
|
|
1205
1741
|
* @param id uuid v4
|
|
1206
|
-
* @param name unique identifier of the
|
|
1207
|
-
* @param fullName Complete human-readable name of the
|
|
1208
|
-
* @param
|
|
1209
|
-
* @param
|
|
1742
|
+
* @param name unique identifier of the token
|
|
1743
|
+
* @param fullName Complete human-readable name of the token
|
|
1744
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1745
|
+
* @param contractAddress Contract address of this token
|
|
1210
1746
|
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1211
|
-
* @param
|
|
1212
|
-
* @param
|
|
1213
|
-
* @param
|
|
1214
|
-
* @param
|
|
1215
|
-
* @param
|
|
1747
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1748
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1749
|
+
* @param network? Optional token network. Defaults to Optimism main network.
|
|
1750
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1751
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1216
1752
|
*/
|
|
1217
|
-
function
|
|
1218
|
-
return Object.freeze(new
|
|
1753
|
+
function opethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559, base_1.CoinFeature.BULK_TRANSACTION], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.optimism, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1754
|
+
return Object.freeze(new OpethERC20Token({
|
|
1219
1755
|
id,
|
|
1220
1756
|
name,
|
|
1221
1757
|
fullName,
|
|
1222
1758
|
network,
|
|
1759
|
+
contractAddress,
|
|
1223
1760
|
prefix,
|
|
1224
1761
|
suffix,
|
|
1225
1762
|
features,
|
|
1226
1763
|
decimalPlaces,
|
|
1227
|
-
isToken,
|
|
1228
1764
|
asset,
|
|
1765
|
+
isToken: true,
|
|
1229
1766
|
primaryKeyCurve,
|
|
1230
|
-
baseUnit: base_1.BaseUnit.
|
|
1767
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
1231
1768
|
}));
|
|
1232
1769
|
}
|
|
1233
|
-
|
|
1234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxpQ0FBOEY7QUFDOUYsMkNBQTZDO0FBQzdDLHFDQUEyRTtBQUMzRSx5Q0FBaUc7QUFrQmpHOzs7Ozs7R0FNRztBQUNILE1BQWEsV0FBWSxTQUFRLGVBQVE7SUFZdkMsWUFBWSxPQUFrQztRQUM1QyxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixJQUFJLEVBQUUsZUFBUSxDQUFDLE1BQU07U0FDdEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFUyxnQkFBZ0I7UUFDeEIsT0FBTyxJQUFJLEdBQUcsQ0FBYyxDQUFDLGtCQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sSUFBSSxHQUFHLENBQWMsQ0FBQyxrQkFBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQzs7QUEzQkgsa0NBNEJDO0FBM0J3Qiw0QkFBZ0IsR0FBRztJQUN4QyxrQkFBVyxDQUFDLGFBQWE7SUFDekIsa0JBQVcsQ0FBQyxtQkFBbUI7SUFDL0Isa0JBQVcsQ0FBQyxrQkFBa0I7SUFDOUIsa0JBQVcsQ0FBQyxnQkFBZ0I7SUFDNUIsa0JBQVcsQ0FBQyxPQUFPO0lBQ25CLGtCQUFXLENBQUMsbUJBQW1CO0NBQ2hDLENBQUM7QUF1RUosTUFBYSxnQkFBaUIsU0FBUSxXQUFXO0lBQy9DLFlBQVksT0FBa0M7UUFDNUMsS0FBSyxDQUFDO1lBQ0osR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBTkQsNENBTUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLDJCQUE0QixTQUFRLGdCQUFnQjtJQUcvRCxZQUFZLE9BQWdDO1FBQzFDLEtBQUssQ0FBQztZ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b0IsRUFDcEIsTUFBTSxHQUFHLEVBQUUsRUFDWCxLQUFzQixFQUN0QixXQUEwQixXQUFXLENBQUMsZ0JBQWdCLEVBQ3RELE1BQU0sR0FBRyxFQUFFLEVBQ1gsU0FBaUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNuQyxVQUEwQixtQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHO0lBRTNDLE9BQU8sUUFBUSxDQUNiLEVBQUUsRUFDRixJQUFJLEVBQ0osUUFBUSxFQUNSLGFBQWEsRUFDYixhQUFhLEVBQ2IsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7QUFDSixDQUFDO0FBNUJELDhCQTRCQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsSUFBSSxDQUNsQixFQUFVLEVBQ1YsSUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsT0FBb0IsRUFDcEIsYUFBcUIsRUFDckIsS0FBc0IsRUFDdEIsV0FBMEIsUUFBUSxDQUFDLGdCQUFnQixFQUNuRCxrQkFBNEIsZUFBUSxDQUFDLFNBQVMsRUFDOUMsTUFBTSxHQUFHLEVBQUUsRUFDWCxTQUFpQixJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ25DLE9BQU8sR0FBRyxLQUFLO0lBRWYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUNsQixJQUFJLFFBQVEsQ0FBQztRQUNYLEVBQUU7UUFDRixJQUFJO1FBQ0osUUFBUTtRQUNSLE9BQU87UUFDUCxNQUFNO1FBQ04sTUFBTTtRQUNOLFFBQVE7UUFDUixhQUFhO1FBQ2IsT0FBTztRQUNQLEtBQUs7UUFDTCxlQUFlO1FBQ2YsUUFBUSxFQUFFLGVBQVEsQ0FBQyxJQUFJO0tBQ3hCLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQTdCRCxvQkE2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiwgQmFzZVVuaXQsIENvaW5GZWF0dXJlLCBDb2luS2luZCwgS2V5Q3VydmUsIFVuZGVybHlpbmdBc3NldCB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBET01BSU5fUEFUVEVSTiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEludmFsaWRDb250cmFjdEFkZHJlc3NFcnJvciwgSW52YWxpZERvbWFpbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgQWNjb3VudE5ldHdvcmssIEJhc2VOZXR3b3JrLCBFdGhlcmV1bU5ldHdvcmssIE5ldHdvcmtzLCBUcm9uTmV0d29yayB9IGZyb20gJy4vbmV0d29ya3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBpZDogc3RyaW5nO1xuICBmdWxsTmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzPzogc3RyaW5nO1xuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yaztcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldDtcbiAgYmFzZVVuaXQ6IEJhc2VVbml0O1xuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXTtcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyO1xuICBpc1Rva2VuOiBib29sZWFuO1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIHN1ZmZpeD86IHN0cmluZztcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZTtcbn1cblxuLyoqXG4gKiBBY2NvdW50IGJhc2VkIGNvaW5zLCBzdWNoIGFzIEV0aGVyZXVtLCBTdGVsbGFyLCBvciBYUlAuXG4gKlxuICogVGhlc2UgdHlwZXMgb2YgY29pbnMgbWFpbnRhaW4gYW4gXCJhY2NvdW50IGJhbGFuY2VcIiBmb3IgZWFjaCBhZGRyZXNzIG9uIHRoZSBuZXR3b3JrLFxuICogYXMgb3Bwb3NlZCB0byB0aGUgdW5zcGVudCB0cmFuc2FjdGlvbiBvdXRwdXQgbW9kZWwgd2hpY2ggbWFpbnRhaW5zIGEgcmVjb3JkIG9mIGFsbFxuICogXCJwaWVjZXNcIiBvZiBjb2luIHdoaWNoIGJlbG9uZyB0byBhbiBhZGRyZXNzLlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudENvaW4gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GRUFUVVJFUyA9IFtcbiAgICBDb2luRmVhdHVyZS5BQ0NPVU5UX01PREVMLFxuICAgIENvaW5GZWF0dXJlLlJFUVVJUkVTX0JJR19OVU1CRVIsXG4gICAgQ29pbkZlYXR1cmUuVkFMVUVMRVNTX1RSQU5TRkVSLFxuICAgIENvaW5GZWF0dXJlLlRSQU5TQUNUSU9OX0RBVEEsXG4gICAgQ29pbkZlYXR1cmUuQ1VTVE9EWSxcbiAgICBDb2luRmVhdHVyZS5DVVNUT0RZX0JJVEdPX1RSVVNULFxuICBdO1xuXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrOiBBY2NvdW50TmV0d29yaztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGtpbmQ6IENvaW5LaW5kLkNSWVBUTyxcbiAgICB9KTtcblxuICAgIHRoaXMubmV0d29yayA9IG9wdGlvbnMubmV0d29yaztcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlZEZlYXR1cmVzKCk6IFNldDxDb2luRmVhdHVyZT4ge1xuICAgIHJldHVybiBuZXcgU2V0PENvaW5GZWF0dXJlPihbQ29pbkZlYXR1cmUuQUNDT1VOVF9NT0RFTF0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc2FsbG93ZWRGZWF0dXJlcygpOiBTZXQ8Q29pbkZlYXR1cmU+IHtcbiAgICByZXR1cm4gbmV3IFNldDxDb2luRmVhdHVyZT4oW0NvaW5GZWF0dXJlLlVOU1BFTlRfTU9ERUxdKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVyYzIwQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZWxsYXJDb2luQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIGRvbWFpbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlZGVyYUNvaW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgbm9kZUFjY291bnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlZGVyYVRva2VuQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIG5vZGVBY2NvdW50SWQ6IHN0cmluZztcbiAgdG9rZW5JZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFsZ29Db2luQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIHRva2VuVVJMOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW9zQ29pbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBjb250cmFjdE5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2xDb2luQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIHRva2VuQWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYUNvaW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgcG9saWN5SWQ6IHN0cmluZztcbiAgYXNzZXROYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWHJwQ29pbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBpc3N1ZXJBZGRyZXNzOiBzdHJpbmc7XG4gIGN1cnJlbmN5Q29kZTogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbn1cblxudHlwZSBGaWF0Q29pbk5hbWUgPSBgZmlhdCR7c3RyaW5nfWAgfCBgdGZpYXQke3N0cmluZ31gO1xuZXhwb3J0IGludGVyZmFjZSBGaWF0Q29pbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBuYW1lOiBGaWF0Q29pbk5hbWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RBZGRyZXNzIGV4dGVuZHMgU3RyaW5nIHtcbiAgX19jb250cmFjdGFkZHJlc3NfcGhhbnRvbV9fOiBuZXZlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFjY291bnRDb2luVG9rZW4gZXh0ZW5kcyBBY2NvdW50Q29pbiB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU29tZSBibG9ja2NoYWlucyBzdXBwb3J0IHRva2VucyB3aGljaCBhcmUgZGVmaW5lZCBieSBhbiBhZGRyZXNzIGF0IHdoaWNoIHRoZXkgaGF2ZSBhIHNtYXJ0IGNvbnRyYWN0IGRlcGxveWVkLlxuICogRXhhbXBsZXMgYXJlIEVSQzIwIHRva2VucywgYW5kIHRoZSBlcXVpdmFsZW50IG9uIG90aGVyIGNoYWlucy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBDb250cmFjdEFkZHJlc3M7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgLy8gdmFsaWQgRVJDIDIwIGNvbnRyYWN0IGFkZHJlc3NlcyBhcmUgXCIweFwiIGZvbGxvd2VkIGJ5IDQwIGxvd2VyY2FzZSBoZXggY2hhcmFjdGVyc1xuICAgIC8vIGRvIG5vdCB1c2UgYSB2YWxpZCBhZGRyZXNzIGZvcm1hdCBmb3IgZ2VuZXJpYyB0b2tlbnMgYmVjYXVzZSB0aGV5IG5vdCBoYXZlIG9uY2hhaW4gYWRkcmVzc2VzXG4gICAgaWYgKCFvcHRpb25zLmNvbnRyYWN0QWRkcmVzcy5tYXRjaCgvXjB4W2EtZjAtOV17NDB9JC8pICYmICFvcHRpb25zLmZlYXR1cmVzLmluY2x1ZGVzKENvaW5GZWF0dXJlLkdFTkVSSUNfVE9LRU4pKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbnRyYWN0QWRkcmVzc0Vycm9yKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5jb250cmFjdEFkZHJlc3MpO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJhY3RBZGRyZXNzID0gb3B0aW9ucy5jb250cmFjdEFkZHJlc3MgYXMgdW5rbm93biBhcyBDb250cmFjdEFkZHJlc3M7XG4gIH1cbn1cblxuLyoqXG4gKiBFUkMyMCB0b2tlbiBhZGRyZXNzZXMgYXJlIEJhc2U1OCBmb3JtYXR0ZWQgb24gc29tZSBibG9ja2NoYWlucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2U1OENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBDb250cmFjdEFkZHJlc3M7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgaWYgKCEvXlsxLTlBLUhKLU5QLVphLWttLXpdezM0fSQvLnRlc3Qob3B0aW9ucy5jb250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbnRyYWN0QWRkcmVzc0Vycm9yKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5jb250cmFjdEFkZHJlc3MpO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJhY3RBZGRyZXNzID0gb3B0aW9ucy5jb250cmFjdEFkZHJlc3MgYXMgdW5rbm93biBhcyBDb250cmFjdEFkZHJlc3M7XG4gIH1cbn1cblxuLyoqXG4gKiBFUkMgMjAgaXMgYSB0b2tlbiBzdGFuZGFyZCBmb3IgdGhlIEV0aGVyZXVtIGJsb2NrY2hhaW4uIFRoZXkgYXJlIHNpbWlsYXIgdG8gb3RoZXIgYWNjb3VudCBjb2lucywgYnV0IGhhdmUgYVxuICogY29udHJhY3QgYWRkcmVzcyBwcm9wZXJ0eSB3aGljaCBpZGVudGlmaWVzIHRoZSBzbWFydCBjb250cmFjdCB3aGljaCBkZWZpbmVzIHRoZSB0b2tlbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEVyYzIwQ29pbiBleHRlbmRzIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiB7fVxuXG4vKipcbiAqIEVSQyA3MjEgaXMgdGhlIG5vbiBmdW5naWJsZSB0b2tlbiBzdGFuZGFyZCBmb3IgdGhlIEV0aGVyZXVtIGJsb2NrY2hhaW4uXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vZWlwcy5ldGhlcmV1bS5vcmcvRUlQUy9laXAtNzIxIEVJUDcyMX1cbiAqL1xuZXhwb3J0IGNsYXNzIEVyYzcyMUNvaW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge31cblxuLyoqXG4gKiBFUkMgMTE1NSBpcyB0aGUgbXVsdGkgdG9rZW4gc3RhbmRhcmQgZm9yIHRoZSBFdGhlcmV1bSBibG9ja2NoYWluLlxuICpcbiAqIHtAbGluayBodHRwczovL2VpcHMuZXRoZXJldW0ub3JnL0VJUFMvZWlwLTExNTUgRUlQMTE1NX1cbiAqL1xuZXhwb3J0IGNsYXNzIEVyYzExNTVDb2luIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHt9XG5cbi8qKlxuICogVGhlIFRST04gYmxvY2tjaGFpbiBzdXBwb3J0cyB0b2tlbnMgb2YgdGhlIEVSQzIwIHN0YW5kYXJkIHNpbWlsYXIgdG8gRVRIIEVSQzIwIHRva2Vucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyb25FcmMyMENvaW4gZXh0ZW5kcyBCYXNlNThDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge31cblxuLyoqXG4gKiBTb21lIGJsb2NrY2hhaW5zIGhhdmUgbmF0aXZlIGNvaW5zIHdoaWNoIGFsc28gc3VwcG9ydCB0aGUgRVJDMjAgaW50ZXJmYWNlIHN1Y2ggYXMgQ0VMTy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVyYzIwQ29tcGF0aWJsZUFjY291bnRDb2luIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLy8gVGhlc2UgY29pbnMgc2hvdWxkIG5vdCBiZSBjbGFzc2lmaWVkIGFzIHRva2VucyBhcyB0aGV5IGFyZSBub3QgY2hpbGRyZW4gb2Ygb3RoZXIgY29pbnNcbiAgICAgIGlzVG9rZW46IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhlIENFTE8gYmxvY2tjaGFpbiBzdXBwb3J0cyB0b2tlbnMgb2YgdGhlIEVSQzIwIHN0YW5kYXJkIHNpbWlsYXIgdG8gRVRIIEVSQzIwIHRva2Vucy5cbiAqL1xuZXhwb3J0IGNsYXNzIENlbG9Db2luIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHt9XG5cbi8qKlxuICogVGhlIEJTQyBibG9ja2NoYWluIHN1cHBvcnRzIHRva2VucyBvZiB0aGUgRVJDMjAgc3RhbmRhcmQgc2ltaWxhciB0byBFVEggRVJDMjAgdG9rZW5zLlxuICovXG5leHBvcnQgY2xhc3MgQnNjQ29pbiBleHRlbmRzIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiB7fVxuXG4vKipcbiAqIFRoZSBTdGVsbGFyIG5ldHdvcmsgc3VwcG9ydHMgdG9rZW5zIChub24tbmF0aXZlIGFzc2V0cylcbiAqIFhMTSBpcyBhbHNvIGtub3duIGFzIHRoZSBuYXRpdmUgYXNzZXQuXG4gKiBTdGVsbGFyIHRva2VucyB3b3JrIHNpbWlsYXIgdG8gWExNLCBidXQgdGhlIHRva2VuIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2hhaW4sXG4gKiB0aGUgdG9rZW4gY29kZSBhbmQgdGhlIGlzc3VlciBhY2NvdW50IGluIHRoZSBmb3JtOiAodCl4bG06PHRva2VuPi08aXNzdWVyPlxuICovXG5leHBvcnQgY2xhc3MgU3RlbGxhckNvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIGRvbWFpbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN0ZWxsYXJDb2luQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmRvbWFpbiAhPT0gJycgJiYgIW9wdGlvbnMuZG9tYWluLm1hdGNoKERPTUFJTl9QQVRURVJOKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREb21haW5FcnJvcihvcHRpb25zLm5hbWUsIG9wdGlvbnMuZG9tYWluKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvbWFpbiA9IG9wdGlvbnMuZG9tYWluIGFzIHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBIZWRlcmEgY29pbiBuZWVkcyBhIGNsaWVudCBzZXQgd2l0aCB0aGUgbm9kZSBhY2NvdW50IElkLlxuICogSXQncyBhbiBhY2NvdW50IGJhc2VkIGNvaW4gdGhhdCBuZWVkcyB0aGUgbm9kZSBhY2NvdW50IElEXG4gKiB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSBzZW50LlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEhlZGVyYUNvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIG5vZGVBY2NvdW50SWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBIZWRlcmFDb2luQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIHRoaXMubm9kZUFjY291bnRJZCA9IG9wdGlvbnMubm9kZUFjY291bnRJZDtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBIZWRlcmEgbmV0d29yayBzdXBwb3J0cyB0b2tlbnMuXG4gKiBIZWRlcmEgdG9rZW5zIHdvcmsgc2ltaWxhciB0byBuYXRpdmUgSGVkZXJhIGNvaW4sXG4gKiBidXQgdGhlIHRva2VuIGlzIGRldGVybWluZWQgYnkgdGhlIHRva2VuSWQgb24gdGhlIG5vZGVcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBIZWRlcmFUb2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgbm9kZUFjY291bnRJZDogc3RyaW5nO1xuICBwdWJsaWMgdG9rZW5JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEhlZGVyYVRva2VuQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIHRoaXMubm9kZUFjY291bnRJZCA9IG9wdGlvbnMubm9kZUFjY291bnRJZDtcbiAgICB0aGlzLnRva2VuSWQgPSBvcHRpb25zLnRva2VuSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgQWxnbyBuZXR3b3JrIHN1cHBvcnRzIHRva2VucyAoYXNzZXRzKVxuICogQWxnbyB0b2tlbnMgd29yayBzaW1pbGFyIHRvIG5hdGl2ZSBBTEdPIGNvaW4sIGJ1dCB0aGUgdG9rZW4gbmFtZSBpcyBkZXRlcm1pbmVkIGJ5XG4gKiB1bmlxdWUgYXNzZXQgaWQgb24gdGhlIGNoYWluLiBJbnRlcm5hbGx5LCBCaXRHbyB1c2VzIHRva2VuIGlkZW50aWZpZXJzIG9mIHRoZSBmb3JtYXQ6ICh0KWFsZ286PGFzc2V0SWQ+XG4gKlxuICovXG5leHBvcnQgY2xhc3MgQWxnb0NvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIHRva2VuVVJMOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFsZ29Db2luQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLnRva2VuVVJMKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKG9wdGlvbnMudG9rZW5VUkwpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWREb21haW5FcnJvcihvcHRpb25zLm5hbWUsIG9wdGlvbnMudG9rZW5VUkwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudG9rZW5VUkwgPSBvcHRpb25zLnRva2VuVVJMO1xuICB9XG59XG5cbi8qKlxuICogVGhlIEVvcyBuZXR3b3JrIHN1cHBvcnRzIHRva2Vuc1xuICogRW9zIHRva2VucyB3b3JrIHNpbWlsYXIgdG8gbmF0aXZlIEVvcyBjb2luLCBidXQgdGhlIHRva2VuIG5hbWUgaXMgZGV0ZXJtaW5lZCBieVxuICogdGhlIGNvbnRyYWN0TmFtZSBvbiB0aGUgY2hhaW4uXG4gKlxuICovXG5leHBvcnQgY2xhc3MgRW9zQ29pbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgY29udHJhY3ROYW1lOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVvc0NvaW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb250cmFjdE5hbWUgPSBvcHRpb25zLmNvbnRyYWN0TmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBTb2wgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIFNvbCB0b2tlbnMgd29yayBzaW1pbGFyIHRvIG5hdGl2ZSBTT0wgY29pbiwgYnV0IHRoZSB0b2tlbiBuYW1lIGlzIGRldGVybWluZWQgYnlcbiAqIHRoZSB0b2tlbkFkZHJlc3Mgb24gdGhlIGNoYWluLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFNvbENvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIHRva2VuQWRkcmVzczogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTb2xDb2luQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIHRoaXMudG9rZW5BZGRyZXNzID0gb3B0aW9ucy50b2tlbkFkZHJlc3M7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgQWRhIG5ldHdvcmsgc3VwcG9ydHMgdG9rZW5zXG4gKiBBZGEgdG9rZW5zIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHBvbGljeSBJRCBhbmQgYXNzZXQgbmFtZVxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEFkYUNvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIHBvbGljeUlkOiBzdHJpbmc7XG4gIHB1YmxpYyBhc3NldE5hbWU6IHN0cmluZztcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQWRhQ29pbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBvbGljeUlkID0gb3B0aW9ucy5wb2xpY3lJZDtcbiAgICB0aGlzLmFzc2V0TmFtZSA9IG9wdGlvbnMuYXNzZXROYW1lO1xuICB9XG59XG5cbi8qKlxuICogVGhlIEFWQVggQyBDaGFpbiBuZXR3b3JrIHN1cHBvcnQgdG9rZW5zXG4gKiBBVkFYIEMgQ2hhaW4gVG9rZW5zIGFyZSBFUkMyMCBjb2luc1xuICovXG5leHBvcnQgY2xhc3MgQXZheEVSQzIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIFBvbHlnb24gQ2hhaW4gbmV0d29yayBzdXBwb3J0IHRva2Vuc1xuICogUG9seWdvbiBDaGFpbiBUb2tlbnMgYXJlIEVSQzIwIGNvaW5zXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2x5Z29uRVJDMjBUb2tlbiBleHRlbmRzIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVyYzIwQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgWHJwIG5ldHdvcmsgc3VwcG9ydHMgdG9rZW5zXG4gKiBYcnAgdG9rZW5zIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGlzc3VlciBhZGRyZXNzXG4gKiBOYW1pbmcgZm9ybWF0IGlzIHNpbWlsYXIgdG8gWExNXG4gKiA8bmV0d29yaz46PHRva2VuPi08aXNzdWVyPlxuICovXG5leHBvcnQgY2xhc3MgWHJwQ29pbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgaXNzdWVyQWRkcmVzczogc3RyaW5nO1xuICBwdWJsaWMgY3VycmVuY3lDb2RlOiBzdHJpbmc7XG4gIHB1YmxpYyBkb21haW46IHN0cmluZztcbiAgY29uc3RydWN0b3Iob3B0aW9uczogWHJwQ29pbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5kb21haW4gIT09ICcnICYmICFvcHRpb25zLmRvbWFpbi5tYXRjaChET01BSU5fUEFUVEVSTikpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRG9tYWluRXJyb3Iob3B0aW9ucy5uYW1lLCBvcHRpb25zLmRvbWFpbik7XG4gICAgfVxuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbiBhcyBzdHJpbmc7XG4gICAgdGhpcy5jdXJyZW5jeUNvZGUgPSBvcHRpb25zLmN1cnJlbmN5Q29kZTtcbiAgICB0aGlzLmlzc3VlckFkZHJlc3MgPSBvcHRpb25zLmlzc3VlckFkZHJlc3M7XG4gIH1cbn1cblxuLyoqXG4gKiBGaWF0IGN1cnJlbmNpZXMsIHN1Y2ggYXMgVVNELCBFVVIsIG9yIFlFTi5cbiAqL1xuZXhwb3J0IGNsYXNzIEZpYXRDb2luIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRkVBVFVSRVMgPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFU107XG5cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcms6IEJhc2VOZXR3b3JrO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEZpYXRDb2luQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoeyAuLi5vcHRpb25zLCBraW5kOiBDb2luS2luZC5GSUFUIH0pO1xuXG4gICAgdGhpcy5uZXR3b3JrID0gb3B0aW9ucy5uZXR3b3JrO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVkRmVhdHVyZXMoKTogU2V0PENvaW5GZWF0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8Q29pbkZlYXR1cmU+KFtDb2luRmVhdHVyZS5BQ0NPVU5UX01PREVMXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGlzYWxsb3dlZEZlYXR1cmVzKCk6IFNldDxDb2luRmVhdHVyZT4ge1xuICAgIHJldHVybiBuZXcgU2V0PENvaW5GZWF0dXJlPihbQ29pbkZlYXR1cmUuVU5TUEVOVF9NT0RFTF0pO1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgYWNjb3VudCBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlPyBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjY291bnQoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmssXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgYmFzZVVuaXQ6IEJhc2VVbml0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azEsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgaXNUb2tlbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEFjY291bnRDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGJhc2VVbml0LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgZXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEV0aGVyZXVtIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogRXRoZXJldW1OZXR3b3JrID0gTmV0d29ya3MubWFpbi5ldGhlcmV1bSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBFcmMyMENvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgZXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSBLb3ZhbiB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qua292YW5cbikge1xuICByZXR1cm4gZXJjMjAoaWQsIG5hbWUsIGZ1bGxOYW1lLCBkZWNpbWFsUGxhY2VzLCBjb250cmFjdEFkZHJlc3MsIGFzc2V0LCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGVyYzcyMSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBFdGhlcmV1bSBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJjNzIxKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogRXRoZXJldW1OZXR3b3JrID0gTmV0d29ya3MubWFpbi5ldGhlcmV1bSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBFcmM3MjFDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlczogMCxcbiAgICAgIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQuRVJDNzIxLFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGVyYzcyMSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBHb2VybGkgdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlcmM3MjEoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LmdvZXJsaSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBlcmM3MjEoaWQsIG5hbWUsIGZ1bGxOYW1lLCBjb250cmFjdEFkZHJlc3MsIGZlYXR1cmVzLCBwcmVmaXgsIHN1ZmZpeCwgbmV0d29yaywgcHJpbWFyeUtleUN1cnZlKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBub25zdGFuZGFyZCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBFdGhlcmV1bSBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9uc3RhbmRhcmRUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLm1haW4uZXRoZXJldW0sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlczogMCxcbiAgICAgIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQuTk9OU1RBTkRBUkQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGVyYzExNTUgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gRXRoZXJldW0gbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVyYzExNTUoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmV0aGVyZXVtLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEVyYzExNTVDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlczogMCxcbiAgICAgIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQuRVJDMTE1NSxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBlcmMxMTU1IHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEdvZXJsaSB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVyYzExNTUoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LmdvZXJsaSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBlcmMxMTU1KGlkLCBuYW1lLCBmdWxsTmFtZSwgY29udHJhY3RBZGRyZXNzLCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmssIHByaW1hcnlLZXlDdXJ2ZSk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgRVJDMjAtY29tcGF0aWJsZSBhY2NvdW50IGNvaW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVyYzIwQ29tcGF0aWJsZUFjY291bnRDb2luKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgYmFzZVVuaXQ6IEJhc2VVbml0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBFcmMyMENvbXBhdGlibGVBY2NvdW50Q29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IGZhbHNlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjZWxvIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBDRUxPIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLm1haW4uY2VsbyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBDZWxvQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBjZWxvIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgdGVzdG5ldCBDRUxPIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0Y2Vsb1Rva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LmNlbG9cbikge1xuICByZXR1cm4gY2Vsb1Rva2VuKGlkLCBuYW1lLCBmdWxsTmFtZSwgZGVjaW1hbFBsYWNlcywgY29udHJhY3RBZGRyZXNzLCBhc3NldCwgZmVhdHVyZXMsIHByZWZpeCwgc3VmZml4LCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjZWxvIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBCU0MgbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJzY1Rva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmJzYyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBCc2NDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5CU0MsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGJzYyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIHRlc3RuZXQgQlNDIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YnNjVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLnRlc3QuYnNjXG4pIHtcbiAgcmV0dXJuIGJzY1Rva2VuKGlkLCBuYW1lLCBmdWxsTmFtZSwgZGVjaW1hbFBsYWNlcywgY29udHJhY3RBZGRyZXNzLCBhc3NldCwgZmVhdHVyZXMsIHByZWZpeCwgc3VmZml4LCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBTdGVsbGFyIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZG9tYWluIERvbWFpbiBvZiB0aGUgdG9rZW4gaXNzdWVyICh1c2VkIHRvIGFjY2VzcyB0b2tlbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpc3N1ZXIncyBzdGVsbGFyLnRvbWwgZmlsZSlcbiAqIFNlZSBodHRwczovL3d3dy5zdGVsbGFyLm9yZy9kZXZlbG9wZXJzL2d1aWRlcy9jb25jZXB0cy9zdGVsbGFyLXRvbWwuaHRtbFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBTdGVsbGFyIG1haW5uZXQuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RlbGxhclRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZG9tYWluID0gJycsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uc3RlbGxhcixcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgU3RlbGxhckNvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBkb21haW4sXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIG5ldHdvcmssXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlhMTSxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgU3RlbGxhciB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGRvbWFpbiBEb21haW4gb2YgdGhlIHRva2VuIGlzc3VlciAodXNlZCB0byBhY2Nlc3MgdG9rZW4gaW5mb3JtYXRpb24gZnJvbSB0aGUgaXNzdWVyJ3Mgc3RlbGxhci50b21sIGZpbGUpXG4gKiBTZWUgaHR0cHM6Ly93d3cuc3RlbGxhci5vcmcvZGV2ZWxvcGVycy9ndWlkZXMvY29uY2VwdHMvc3RlbGxhci10b21sLmh0bWxcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gU3RlbGxhciB0ZXN0bmV0LlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHN0ZWxsYXJUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGRvbWFpbiA9ICcnLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnN0ZWxsYXJcbikge1xuICByZXR1cm4gc3RlbGxhclRva2VuKGlkLCBuYW1lLCBmdWxsTmFtZSwgZGVjaW1hbFBsYWNlcywgYXNzZXQsIGRvbWFpbiwgZmVhdHVyZXMsIHByZWZpeCwgc3VmZml4LCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0cm9uIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBUUk9OIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cm9uVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IFRyb25OZXR3b3JrID0gTmV0d29ya3MubWFpbi50cngsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgVHJvbkVyYzIwQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuVFJYLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCB0cm9uIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgdGVzdG5ldCBUUk9OIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdHRyb25Ub2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogVHJvbk5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnRyeCxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiB0cm9uVG9rZW4oXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgSGVkZXJhIGNvaW4gaW5zdGFuY2VzXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gbm9kZUFjY291bnRJZCBub2RlIGFjY291bnQgSWQgZnJvbSB3aGljaCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSBzZW50XG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEhlZGVyYSBtYWlubmV0LlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlZGVyYUNvaW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmssXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgbm9kZUFjY291bnRJZCA9ICcwLjAuMycsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBIZWRlcmFDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgbm9kZUFjY291bnRJZCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgbmV0d29yayxcbiAgICAgIGlzVG9rZW46IGZhbHNlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkhCQVIsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBIZWRlcmEgdG9rZW4gaW5zdGFuY2VzXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gbm9kZUFjY291bnRJZCBub2RlIGFjY291bnQgSWQgZnJvbSB3aGljaCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSBzZW50XG4gKiBAcGFyYW0gdG9rZW5JZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBIZWRlcmEgbWFpbm5ldC5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWRlcmFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBub2RlQWNjb3VudElkID0gJzAuMC4zJyxcbiAgdG9rZW5JZDogc3RyaW5nLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgSGVkZXJhVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBub2RlQWNjb3VudElkLFxuICAgICAgdG9rZW5JZCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgbmV0d29yayxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuSEJBUixcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIEFMR08gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cblxuICogQHBhcmFtIGFsaWFzIChvcHRpb25hbCkgYWx0ZXJuYXRpdmUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSB0b2tlblVSTCBPcHRpb25hbCBhc3NldCBVcmwgZm9yIG1vcmUgaW5mb3JtYXRpb25hIGFib3V0IHRoZSBhc3NldFxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3JlZmVyZW5jZS90cmFuc2FjdGlvbnMvI3VybFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBBTEdPIG1haW5uZXQuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxnb1Rva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgdG9rZW5VUkwgPSAnJyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5hbGdvcmFuZCxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbik6IFJlYWRvbmx5PEFsZ29Db2luPiB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBBbGdvQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBhbGlhcyxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgdG9rZW5VUkw6IHRva2VuVVJMLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBuZXR3b3JrLFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5BTEdPLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBBTEdPIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gYWxpYXMgKG9wdGlvbmFsKSBhbHRlcm5hdGl2ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHRva2VuVVJMIE9wdGlvbmFsIGFzc2V0IFVybCBmb3IgbW9yZSBpbmZvcm1hdGlvbmEgYWJvdXQgdGhlIGFzc2V0XG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcmVmZXJlbmNlL3RyYW5zYWN0aW9ucy8jdXJsXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEFsZ28gdGVzdG5ldC5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhbGdvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICB0b2tlblVSTCA9ICcnLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LmFsZ29yYW5kXG4pOiBSZWFkb25seTxBbGdvQ29pbj4ge1xuICByZXR1cm4gYWxnb1Rva2VuKGlkLCBuYW1lLCBhbGlhcywgZnVsbE5hbWUsIGRlY2ltYWxQbGFjZXMsIGFzc2V0LCB0b2tlblVSTCwgZmVhdHVyZXMsIHByZWZpeCwgc3VmZml4LCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBlb3MgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdE5hbWUgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEVPUyBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZW9zVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdE5hbWU6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5lb3MsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgRW9zQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdE5hbWUsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRU9TLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBlb3MgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IEVPUyBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVvc1Rva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QuZW9zXG4pIHtcbiAgcmV0dXJuIGVvc1Rva2VuKGlkLCBuYW1lLCBmdWxsTmFtZSwgZGVjaW1hbFBsYWNlcywgY29udHJhY3ROYW1lLCBhc3NldCwgZmVhdHVyZXMsIHByZWZpeCwgc3VmZml4LCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBzb2wgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVG9rZW4gYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFNPTCBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgYW5kIFJFUVVJUkVTX1JFU0VSVkUgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gc29sVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICB0b2tlbkFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUywgQ29pbkZlYXR1cmUuUkVRVUlSRVNfUkVTRVJWRV0sXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLnNvbCxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgU29sQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuU09MLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBzb2xhbmEgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVG9rZW4gYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IFNvbGFuYSBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGFuZCBSRVFVSVJFU19SRVNFUlZFIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNvbFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgdG9rZW5BZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLlJFUVVJUkVTX1JFU0VSVkVdLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5zb2xcbikge1xuICByZXR1cm4gc29sVG9rZW4oaWQsIG5hbWUsIGZ1bGxOYW1lLCBkZWNpbWFsUGxhY2VzLCB0b2tlbkFkZHJlc3MsIGFzc2V0LCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGFkYSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIHRva2VuU3ltYm9sIFRva2VuIHN5bWJvbCBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIENhcmRhbm8gbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGFuZCBSRVFVSVJFU19SRVNFUlZFIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYVRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgcG9saWN5SWQ6IHN0cmluZyxcbiAgYXNzZXROYW1lOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLlJFUVVJUkVTX1JFU0VSVkVdLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5hZGEsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEFkYUNvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcG9saWN5SWQsXG4gICAgICBhc3NldE5hbWUsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuQURBLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBjYXJkYW5vIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gdG9rZW5TeW1ib2wgVG9rZW4gc3ltYm9sIG9mIHRoaXMgdG9rZW4gaS5lOiBBVVNEXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IENhcmRhbm8gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBhbmQgUkVRVUlSRVNfUkVTRVJWRSBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZGFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIHBvbGljeUlkOiBzdHJpbmcsXG4gIGFzc2V0TmFtZTogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5SRVFVSVJFU19SRVNFUlZFXSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QuYWRhXG4pIHtcbiAgcmV0dXJuIGFkYVRva2VuKGlkLCBuYW1lLCBmdWxsTmFtZSwgZGVjaW1hbFBsYWNlcywgcG9saWN5SWQsIGFzc2V0TmFtZSwgYXNzZXQsIGZlYXR1cmVzLCBwcmVmaXgsIHN1ZmZpeCwgbmV0d29yayk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgYXZheEVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBBdmFsYW5jaGVDIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdmF4RXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5hdmFsYW5jaGVDLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEF2YXhFUkMyMFRva2VuKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGF2YXhFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIEF2YWxhbmNoZUMgdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhdmF4RXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5hdmFsYW5jaGVDLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIGF2YXhFcmMyMChcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBwb2x5Z29uRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFBvbHlnb24gbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25FcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLnBvbHlnb24sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgUG9seWdvbkVSQzIwVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIE11bWJhaSB0ZXN0bmV0IHBvbHlnb25FcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIFBvbHlnb24gdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRwb2x5Z29uRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5wb2x5Z29uLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIHBvbHlnb25FcmMyMChcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB4cnAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBpc3N1ZXJBZGRyZXNzOiBUaGUgYWRkcmVzcyBvZiB0aGUgaXNzdWVyIG9mIHRoZSB0b2tlbixcbiAqIEBwYXJhbSBjdXJyZW5jeUNvZGUgVGhlIHRva2VuIHN5bWJvbC4gRXhhbXBsZTogVVNELCBCVEMsIEVUSCwgZXRjLlxuICogQHBhcmFtIGRvbWFpbj8gdGhlIGRvbWFpbiBvZiB0aGUgaXNzdWVyIG9mIHRoZSB0b2tlbixcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gQ2FyZGFubyBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24geHJwVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBpc3N1ZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGN1cnJlbmN5Q29kZTogc3RyaW5nLFxuICBkb21haW4gPSAnJyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi54cnAsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgWHJwQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBpc3N1ZXJBZGRyZXNzLFxuICAgICAgY3VycmVuY3lDb2RlLFxuICAgICAgZG9tYWluLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlhSUCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgY2FyZGFubyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGlzc3VlckFkZHJlc3M6IFRoZSBhZGRyZXNzIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIHRva2VuLFxuICogQHBhcmFtIGN1cnJlbmN5Q29kZSBUaGUgdG9rZW4gc3ltYm9sLiBFeGFtcGxlOiBVU0QsIEJUQywgRVRILCBldGMuXG4gKiBAcGFyYW0gZG9tYWluPyB0aGUgZG9tYWluIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIHRva2VuLFxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgdGVzdG5ldCBDYXJkYW5vIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eHJwVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBpc3N1ZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGN1cnJlbmN5Q29kZTogc3RyaW5nLFxuICBkb21haW4gPSAnJyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC54cnBcbikge1xuICByZXR1cm4geHJwVG9rZW4oXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIGlzc3VlckFkZHJlc3MsXG4gICAgY3VycmVuY3lDb2RlLFxuICAgIGRvbWFpbixcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmtcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBmaWF0IGNvaW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pbiwgc2hvdWxkIHN0YXJ0IHdpdGggJ2ZpYXQnIG9yICd0ZmlhdCcgZm9sbG93ZWQgYnkgdGhlIDMtY2hhciBJU08tNDIxNyBhbHBoYWJldGljYWwgY29kZVxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBGaWF0Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmU/IFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpYXQoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IEZpYXRDb2luTmFtZSxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmV0d29yazogQmFzZU5ldHdvcmssXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBGaWF0Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIGlzVG9rZW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBGaWF0Q29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRklBVCxcbiAgICB9KVxuICApO1xufVxuIl19
|
|
1770
|
+
/**
|
|
1771
|
+
* Factory function for Optimism Sepolia testnet opethErc20 token instances.
|
|
1772
|
+
*
|
|
1773
|
+
* @param id uuid v4
|
|
1774
|
+
* @param name unique identifier of the token
|
|
1775
|
+
* @param fullName Complete human-readable name of the token
|
|
1776
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1777
|
+
* @param contractAddress Contract address of this token
|
|
1778
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1779
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1780
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1781
|
+
* @param network? Optional token network. Defaults to the Optimism test network.
|
|
1782
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1783
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1784
|
+
*/
|
|
1785
|
+
function topethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.BULK_TRANSACTION], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.optimism, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1786
|
+
return opethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1787
|
+
}
|
|
1788
|
+
/**
|
|
1789
|
+
* Factory function for zkethErc20 token instances.
|
|
1790
|
+
*
|
|
1791
|
+
* @param id uuid v4
|
|
1792
|
+
* @param name unique identifier of the token
|
|
1793
|
+
* @param fullName Complete human-readable name of the token
|
|
1794
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1795
|
+
* @param contractAddress Contract address of this token
|
|
1796
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1797
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1798
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1799
|
+
* @param network? Optional token network. Defaults to zkSync mainnet network.
|
|
1800
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1801
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1802
|
+
*/
|
|
1803
|
+
function zkethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.zkSync, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1804
|
+
return Object.freeze(new ZkethERC20Token({
|
|
1805
|
+
id,
|
|
1806
|
+
name,
|
|
1807
|
+
fullName,
|
|
1808
|
+
network,
|
|
1809
|
+
contractAddress,
|
|
1810
|
+
prefix,
|
|
1811
|
+
suffix,
|
|
1812
|
+
features,
|
|
1813
|
+
decimalPlaces,
|
|
1814
|
+
asset,
|
|
1815
|
+
isToken: true,
|
|
1816
|
+
primaryKeyCurve,
|
|
1817
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
1818
|
+
}));
|
|
1819
|
+
}
|
|
1820
|
+
/**
|
|
1821
|
+
* Factory function for zkSync Sepolia testnet zkethErc20 token instances.
|
|
1822
|
+
*
|
|
1823
|
+
* @param id uuid v4
|
|
1824
|
+
* @param name unique identifier of the token
|
|
1825
|
+
* @param fullName Complete human-readable name of the token
|
|
1826
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1827
|
+
* @param contractAddress Contract address of this token
|
|
1828
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1829
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1830
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1831
|
+
* @param network? Optional token network. Defaults to the zkSync sepolia test network.
|
|
1832
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1833
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1834
|
+
*/
|
|
1835
|
+
function tzkethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.zkSync, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1836
|
+
return zkethErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1837
|
+
}
|
|
1838
|
+
/**
|
|
1839
|
+
* Factory function for beraErc20 token instances.
|
|
1840
|
+
*
|
|
1841
|
+
* @param id uuid v4
|
|
1842
|
+
* @param name unique identifier of the token
|
|
1843
|
+
* @param fullName Complete human-readable name of the token
|
|
1844
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1845
|
+
* @param contractAddress Contract address of this token
|
|
1846
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1847
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1848
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1849
|
+
* @param network? Optional token network. Defaults to bera mainnet network.
|
|
1850
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1851
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1852
|
+
*/
|
|
1853
|
+
function beraErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.bera, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1854
|
+
return Object.freeze(new BeraERC20Token({
|
|
1855
|
+
id,
|
|
1856
|
+
name,
|
|
1857
|
+
fullName,
|
|
1858
|
+
network,
|
|
1859
|
+
contractAddress,
|
|
1860
|
+
prefix,
|
|
1861
|
+
suffix,
|
|
1862
|
+
features,
|
|
1863
|
+
decimalPlaces,
|
|
1864
|
+
asset,
|
|
1865
|
+
isToken: true,
|
|
1866
|
+
primaryKeyCurve,
|
|
1867
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
1868
|
+
}));
|
|
1869
|
+
}
|
|
1870
|
+
/**
|
|
1871
|
+
* Factory function for zkSync Sepolia testnet beraErc20 token instances.
|
|
1872
|
+
*
|
|
1873
|
+
* @param id uuid v4
|
|
1874
|
+
* @param name unique identifier of the token
|
|
1875
|
+
* @param fullName Complete human-readable name of the token
|
|
1876
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1877
|
+
* @param contractAddress Contract address of this token
|
|
1878
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1879
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1880
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1881
|
+
* @param network? Optional token network. Defaults to the bera test network.
|
|
1882
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1883
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1884
|
+
*/
|
|
1885
|
+
function tberaErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.bera, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1886
|
+
return beraErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1887
|
+
}
|
|
1888
|
+
/**
|
|
1889
|
+
* Factory function for CoredaoErc20 token instances.
|
|
1890
|
+
*
|
|
1891
|
+
* @param id uuid v4
|
|
1892
|
+
* @param name unique identifier of the token
|
|
1893
|
+
* @param fullName Complete human-readable name of the token
|
|
1894
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1895
|
+
* @param contractAddress Contract address of this token
|
|
1896
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1897
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1898
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1899
|
+
* @param network? Optional token network. Defaults to coredao mainnet network.
|
|
1900
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1901
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1902
|
+
*/
|
|
1903
|
+
function coredaoErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.coredao, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1904
|
+
return Object.freeze(new CoredaoERC20Token({
|
|
1905
|
+
id,
|
|
1906
|
+
name,
|
|
1907
|
+
fullName,
|
|
1908
|
+
network,
|
|
1909
|
+
contractAddress,
|
|
1910
|
+
prefix,
|
|
1911
|
+
suffix,
|
|
1912
|
+
features,
|
|
1913
|
+
decimalPlaces,
|
|
1914
|
+
asset,
|
|
1915
|
+
isToken: true,
|
|
1916
|
+
primaryKeyCurve,
|
|
1917
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
1918
|
+
}));
|
|
1919
|
+
}
|
|
1920
|
+
/**
|
|
1921
|
+
* Factory function for coredao testnet coredaoErc20 token instances.
|
|
1922
|
+
*
|
|
1923
|
+
* @param id uuid v4
|
|
1924
|
+
* @param name unique identifier of the token
|
|
1925
|
+
* @param fullName Complete human-readable name of the token
|
|
1926
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1927
|
+
* @param contractAddress Contract address of this token
|
|
1928
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1929
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1930
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1931
|
+
* @param network? Optional token network. Defaults to the coredao test network.
|
|
1932
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1933
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1934
|
+
*/
|
|
1935
|
+
function tcoredaoErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.coredao, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1936
|
+
return coredaoErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1937
|
+
}
|
|
1938
|
+
/**
|
|
1939
|
+
* Factory function for WorldErc20 token instances.
|
|
1940
|
+
*
|
|
1941
|
+
* @param id uuid v4
|
|
1942
|
+
* @param name unique identifier of the token
|
|
1943
|
+
* @param fullName Complete human-readable name of the token
|
|
1944
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1945
|
+
* @param contractAddress Contract address of this token
|
|
1946
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1947
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1948
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1949
|
+
* @param network? Optional token network. Defaults to World Chain mainnet network.
|
|
1950
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1951
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1952
|
+
*/
|
|
1953
|
+
function worldErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.world, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1954
|
+
return Object.freeze(new WorldERC20Token({
|
|
1955
|
+
id,
|
|
1956
|
+
name,
|
|
1957
|
+
fullName,
|
|
1958
|
+
network,
|
|
1959
|
+
contractAddress,
|
|
1960
|
+
prefix,
|
|
1961
|
+
suffix,
|
|
1962
|
+
features,
|
|
1963
|
+
decimalPlaces,
|
|
1964
|
+
asset,
|
|
1965
|
+
isToken: true,
|
|
1966
|
+
primaryKeyCurve,
|
|
1967
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
1968
|
+
}));
|
|
1969
|
+
}
|
|
1970
|
+
/**
|
|
1971
|
+
* Factory function for world testnet worldErc20 token instances.
|
|
1972
|
+
*
|
|
1973
|
+
* @param id uuid v4
|
|
1974
|
+
* @param name unique identifier of the token
|
|
1975
|
+
* @param fullName Complete human-readable name of the token
|
|
1976
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1977
|
+
* @param contractAddress Contract address of this token
|
|
1978
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1979
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1980
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1981
|
+
* @param network? Optional token network. Defaults to the World Chain test network.
|
|
1982
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
1983
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
1984
|
+
*/
|
|
1985
|
+
function tworldErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.world, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
1986
|
+
return worldErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
1987
|
+
}
|
|
1988
|
+
/**
|
|
1989
|
+
* Factory function for FlrErc20 token instances.
|
|
1990
|
+
*
|
|
1991
|
+
* @param id uuid v4
|
|
1992
|
+
* @param name unique identifier of the token
|
|
1993
|
+
* @param fullName Complete human-readable name of the token
|
|
1994
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
1995
|
+
* @param contractAddress Contract address of this token
|
|
1996
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
1997
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
1998
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
1999
|
+
* @param network? Optional token network. Defaults to Flr Chain mainnet network.
|
|
2000
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2001
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2002
|
+
*/
|
|
2003
|
+
function flrErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.flr, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2004
|
+
return Object.freeze(new FlrERC20Token({
|
|
2005
|
+
id,
|
|
2006
|
+
name,
|
|
2007
|
+
fullName,
|
|
2008
|
+
network,
|
|
2009
|
+
contractAddress,
|
|
2010
|
+
prefix,
|
|
2011
|
+
suffix,
|
|
2012
|
+
features,
|
|
2013
|
+
decimalPlaces,
|
|
2014
|
+
asset,
|
|
2015
|
+
isToken: true,
|
|
2016
|
+
primaryKeyCurve,
|
|
2017
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
2018
|
+
}));
|
|
2019
|
+
}
|
|
2020
|
+
/**
|
|
2021
|
+
* Factory function for Flr testnet FlrErc20 token instances.
|
|
2022
|
+
*
|
|
2023
|
+
* @param id uuid v4
|
|
2024
|
+
* @param name unique identifier of the token
|
|
2025
|
+
* @param fullName Complete human-readable name of the token
|
|
2026
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2027
|
+
* @param contractAddress Contract address of this token
|
|
2028
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2029
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2030
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2031
|
+
* @param network? Optional token network. Defaults to the Flr Chain test network.
|
|
2032
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2033
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2034
|
+
*/
|
|
2035
|
+
function tflrErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.flr, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2036
|
+
return flrErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2037
|
+
}
|
|
2038
|
+
/**
|
|
2039
|
+
* Factory function for XdcErc20 token instances.
|
|
2040
|
+
*
|
|
2041
|
+
* @param id uuid v4
|
|
2042
|
+
* @param name unique identifier of the token
|
|
2043
|
+
* @param fullName Complete human-readable name of the token
|
|
2044
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2045
|
+
* @param contractAddress Contract address of this token
|
|
2046
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2047
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2048
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2049
|
+
* @param network? Optional token network. Defaults to XDC mainnet network.
|
|
2050
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2051
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2052
|
+
*/
|
|
2053
|
+
function xdcErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.xdc, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2054
|
+
return Object.freeze(new XdcERC20Token({
|
|
2055
|
+
id,
|
|
2056
|
+
name,
|
|
2057
|
+
fullName,
|
|
2058
|
+
network,
|
|
2059
|
+
contractAddress,
|
|
2060
|
+
prefix,
|
|
2061
|
+
suffix,
|
|
2062
|
+
features,
|
|
2063
|
+
decimalPlaces,
|
|
2064
|
+
asset,
|
|
2065
|
+
isToken: true,
|
|
2066
|
+
primaryKeyCurve,
|
|
2067
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
2068
|
+
}));
|
|
2069
|
+
}
|
|
2070
|
+
/**
|
|
2071
|
+
* Factory function for XDC testnet XdcErc20 token instances.
|
|
2072
|
+
*
|
|
2073
|
+
* @param id uuid v4
|
|
2074
|
+
* @param name unique identifier of the token
|
|
2075
|
+
* @param fullName Complete human-readable name of the token
|
|
2076
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2077
|
+
* @param contractAddress Contract address of this token
|
|
2078
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2079
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2080
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2081
|
+
* @param network? Optional token network. Defaults to the XDC test network.
|
|
2082
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2083
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2084
|
+
*/
|
|
2085
|
+
function txdcErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.xdc, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2086
|
+
return xdcErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2087
|
+
}
|
|
2088
|
+
/**
|
|
2089
|
+
* Factory function for MonErc20 token instances.
|
|
2090
|
+
*
|
|
2091
|
+
* @param id uuid v4
|
|
2092
|
+
* @param name unique identifier of the token
|
|
2093
|
+
* @param fullName Complete human-readable name of the token
|
|
2094
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2095
|
+
* @param contractAddress Contract address of this token
|
|
2096
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2097
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2098
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2099
|
+
* @param network? Optional token network. Defaults to Mon mainnet network.
|
|
2100
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2101
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2102
|
+
*/
|
|
2103
|
+
function monErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = [...AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559], prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.mon, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2104
|
+
return Object.freeze(new MonERC20Token({
|
|
2105
|
+
id,
|
|
2106
|
+
name,
|
|
2107
|
+
fullName,
|
|
2108
|
+
network,
|
|
2109
|
+
contractAddress,
|
|
2110
|
+
prefix,
|
|
2111
|
+
suffix,
|
|
2112
|
+
features,
|
|
2113
|
+
decimalPlaces,
|
|
2114
|
+
asset,
|
|
2115
|
+
isToken: true,
|
|
2116
|
+
primaryKeyCurve,
|
|
2117
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
2118
|
+
}));
|
|
2119
|
+
}
|
|
2120
|
+
/**
|
|
2121
|
+
* Factory function for Mon testnet MonErc20 token instances.
|
|
2122
|
+
*
|
|
2123
|
+
* @param id uuid v4
|
|
2124
|
+
* @param name unique identifier of the token
|
|
2125
|
+
* @param fullName Complete human-readable name of the token
|
|
2126
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2127
|
+
* @param contractAddress Contract address of this token
|
|
2128
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2129
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2130
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2131
|
+
* @param network? Optional token network. Defaults to the Mon test network.
|
|
2132
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2133
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2134
|
+
*/
|
|
2135
|
+
function tmonErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.mon, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2136
|
+
return monErc20(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2137
|
+
}
|
|
2138
|
+
/**
|
|
2139
|
+
* Factory function for xrp token instances.
|
|
2140
|
+
*
|
|
2141
|
+
* @param id uuid v4
|
|
2142
|
+
* @param name unique identifier of the token
|
|
2143
|
+
* @param fullName Complete human-readable name of the token
|
|
2144
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2145
|
+
* @param issuerAddress: The address of the issuer of the token,
|
|
2146
|
+
* @param currencyCode The token symbol. Example: USD, BTC, ETH, etc.
|
|
2147
|
+
* @param contractAddress Contract address of this token formed with `issuerAddress::currencyCode`
|
|
2148
|
+
* @param domain? the domain of the issuer of the token,
|
|
2149
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2150
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2151
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2152
|
+
* @param network? Optional token network. Defaults to Cardano main network.
|
|
2153
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2154
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2155
|
+
*/
|
|
2156
|
+
function xrpToken(id, name, fullName, decimalPlaces, issuerAddress, currencyCode, contractAddress, domain = '', asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.xrp, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2157
|
+
return Object.freeze(new XrpCoin({
|
|
2158
|
+
id,
|
|
2159
|
+
name,
|
|
2160
|
+
fullName,
|
|
2161
|
+
network,
|
|
2162
|
+
issuerAddress,
|
|
2163
|
+
currencyCode,
|
|
2164
|
+
contractAddress,
|
|
2165
|
+
domain,
|
|
2166
|
+
prefix,
|
|
2167
|
+
suffix,
|
|
2168
|
+
features,
|
|
2169
|
+
decimalPlaces,
|
|
2170
|
+
asset,
|
|
2171
|
+
isToken: true,
|
|
2172
|
+
primaryKeyCurve,
|
|
2173
|
+
baseUnit: base_1.BaseUnit.XRP,
|
|
2174
|
+
}));
|
|
2175
|
+
}
|
|
2176
|
+
/**
|
|
2177
|
+
* Factory function for testnet cardano token instances.
|
|
2178
|
+
*
|
|
2179
|
+
* @param id uuid v4
|
|
2180
|
+
* @param name unique identifier of the token
|
|
2181
|
+
* @param fullName Complete human-readable name of the token
|
|
2182
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2183
|
+
* @param issuerAddress: The address of the issuer of the token,
|
|
2184
|
+
* @param currencyCode The token symbol. Example: USD, BTC, ETH, etc.
|
|
2185
|
+
* @param contractAddress Contract address of this token formed with `issuerAddress::currencyCode`
|
|
2186
|
+
* @param domain? the domain of the issuer of the token,
|
|
2187
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2188
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2189
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2190
|
+
* @param network? Optional token network. Defaults to the testnet Cardano network.
|
|
2191
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2192
|
+
*/
|
|
2193
|
+
function txrpToken(id, name, fullName, decimalPlaces, issuerAddress, currencyCode, contractAddress, domain = '', asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.xrp) {
|
|
2194
|
+
return xrpToken(id, name, fullName, decimalPlaces, issuerAddress, currencyCode, contractAddress, domain, asset, features, prefix, suffix, network);
|
|
2195
|
+
}
|
|
2196
|
+
/**
|
|
2197
|
+
* Factory function for mainnet XRP MPT token instances.
|
|
2198
|
+
*
|
|
2199
|
+
* @param id uuid v4
|
|
2200
|
+
* @param name unique identifier of the token, e.g. "xrp:my_mpt"
|
|
2201
|
+
* @param fullName Complete human-readable name of the token
|
|
2202
|
+
* @param mptIssuanceId 48-char hex MPTokenIssuanceID
|
|
2203
|
+
* @param canTransfer immutable lsfMPTCanTransfer flag from MPTokenIssuanceCreate
|
|
2204
|
+
* @param assetScale immutable display decimal places from MPTokenIssuanceCreate (also used as decimalPlaces)
|
|
2205
|
+
* @param asset UnderlyingAsset enum value
|
|
2206
|
+
* @param features Optional coin features
|
|
2207
|
+
* @param network Optional network override (defaults to mainnet XRP)
|
|
2208
|
+
*/
|
|
2209
|
+
function xrpMptToken(id, name, fullName, mptIssuanceId, canTransfer, assetScale, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.xrp, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2210
|
+
return Object.freeze(new XrpMptCoin({
|
|
2211
|
+
id,
|
|
2212
|
+
name,
|
|
2213
|
+
fullName,
|
|
2214
|
+
network,
|
|
2215
|
+
mptIssuanceId,
|
|
2216
|
+
canTransfer,
|
|
2217
|
+
assetScale,
|
|
2218
|
+
prefix,
|
|
2219
|
+
suffix,
|
|
2220
|
+
features,
|
|
2221
|
+
decimalPlaces: assetScale, // assetScale IS the display decimal places — same concept as decimalPlaces elsewhere
|
|
2222
|
+
asset,
|
|
2223
|
+
isToken: true,
|
|
2224
|
+
primaryKeyCurve,
|
|
2225
|
+
baseUnit: base_1.BaseUnit.XRP,
|
|
2226
|
+
}));
|
|
2227
|
+
}
|
|
2228
|
+
/**
|
|
2229
|
+
* Factory function for testnet XRP MPT token instances.
|
|
2230
|
+
*/
|
|
2231
|
+
function txrpMptToken(id, name, fullName, mptIssuanceId, canTransfer, assetScale, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.xrp) {
|
|
2232
|
+
return xrpMptToken(id, name, fullName, mptIssuanceId, canTransfer, assetScale, asset, features, prefix, suffix, network);
|
|
2233
|
+
}
|
|
2234
|
+
/**
|
|
2235
|
+
* Factory function for sui token instances.
|
|
2236
|
+
*
|
|
2237
|
+
* @param id uuid v4
|
|
2238
|
+
* @param name unique identifier of the token
|
|
2239
|
+
* @param fullName Complete human-readable name of the token
|
|
2240
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2241
|
+
* @param packageId PackageId of this token
|
|
2242
|
+
* @param module The module of the package with id `packageId`
|
|
2243
|
+
* @param symbol Identifies the coin defined in the module `module` of the package with id `packageId`
|
|
2244
|
+
* @param contractAddress Contract address of this token formed with `packageId::module::symbol`
|
|
2245
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2246
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES
|
|
2247
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2248
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2249
|
+
* @param network? Optional token network. Defaults to SUI main network.
|
|
2250
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2251
|
+
*/
|
|
2252
|
+
function suiToken(id, name, fullName, decimalPlaces, packageId, module, symbol, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.sui, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2253
|
+
return Object.freeze(new SuiCoin({
|
|
2254
|
+
id,
|
|
2255
|
+
name,
|
|
2256
|
+
fullName,
|
|
2257
|
+
network,
|
|
2258
|
+
packageId,
|
|
2259
|
+
module,
|
|
2260
|
+
symbol,
|
|
2261
|
+
contractAddress,
|
|
2262
|
+
prefix,
|
|
2263
|
+
suffix,
|
|
2264
|
+
features,
|
|
2265
|
+
decimalPlaces,
|
|
2266
|
+
asset,
|
|
2267
|
+
isToken: true,
|
|
2268
|
+
primaryKeyCurve,
|
|
2269
|
+
baseUnit: base_1.BaseUnit.SUI,
|
|
2270
|
+
}));
|
|
2271
|
+
}
|
|
2272
|
+
/**
|
|
2273
|
+
* Factory function for testnet sui token instances.
|
|
2274
|
+
*
|
|
2275
|
+
* @param id uuid v4
|
|
2276
|
+
* @param name unique identifier of the token
|
|
2277
|
+
* @param fullName Complete human-readable name of the token
|
|
2278
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2279
|
+
* @param packageId PackageId of this token
|
|
2280
|
+
* @param module The module of the package with id `packageId`
|
|
2281
|
+
* @param symbol Identifies the coin defined in the module `module` of the package with id `packageId`
|
|
2282
|
+
* @param contractAddress Contract address of this token formed with `packageId::module::symbol`
|
|
2283
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2284
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES
|
|
2285
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2286
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2287
|
+
* @param network? Optional token network. Defaults to SUI test network.
|
|
2288
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2289
|
+
*/
|
|
2290
|
+
function tsuiToken(id, name, fullName, decimalPlaces, packageId, module, symbol, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.sui, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2291
|
+
return suiToken(id, name, fullName, decimalPlaces, packageId, module, symbol, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2292
|
+
}
|
|
2293
|
+
/**
|
|
2294
|
+
* Factory function for apt token instances.
|
|
2295
|
+
*
|
|
2296
|
+
* @param id uuid v4
|
|
2297
|
+
* @param name unique identifier of the token
|
|
2298
|
+
* @param fullName Complete human-readable name of the token
|
|
2299
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2300
|
+
* @param assetId Asset Id of this token i.e. the unique identifier of the token for all tokens - fungible, non-fungible and legacy
|
|
2301
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2302
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2303
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2304
|
+
* @param network Optional token network. Defaults to APT main network.
|
|
2305
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
2306
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2307
|
+
*/
|
|
2308
|
+
function aptToken(id, name, fullName, decimalPlaces, assetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.apt, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2309
|
+
return Object.freeze(new AptCoin({
|
|
2310
|
+
id,
|
|
2311
|
+
name,
|
|
2312
|
+
fullName,
|
|
2313
|
+
network,
|
|
2314
|
+
assetId,
|
|
2315
|
+
prefix,
|
|
2316
|
+
suffix,
|
|
2317
|
+
features,
|
|
2318
|
+
decimalPlaces,
|
|
2319
|
+
asset,
|
|
2320
|
+
isToken: true,
|
|
2321
|
+
primaryKeyCurve,
|
|
2322
|
+
baseUnit: base_1.BaseUnit.APT,
|
|
2323
|
+
}));
|
|
2324
|
+
}
|
|
2325
|
+
/**
|
|
2326
|
+
* Factory function for Apt NFT collections.
|
|
2327
|
+
*
|
|
2328
|
+
* @param id uuid v4
|
|
2329
|
+
* @param name unique identifier of the NFT collection
|
|
2330
|
+
* @param fullName Complete human-readable name of the NFT collection
|
|
2331
|
+
* @param nftCollectionId collection ID of the non-fungible tokens (NFTs)
|
|
2332
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2333
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2334
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2335
|
+
* @param network Optional token network. Defaults to APT main network.
|
|
2336
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
2337
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2338
|
+
*/
|
|
2339
|
+
function aptNFTCollection(id, name, fullName, nftCollectionId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.apt, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2340
|
+
return Object.freeze(new AptNFTCollection({
|
|
2341
|
+
id,
|
|
2342
|
+
name,
|
|
2343
|
+
fullName,
|
|
2344
|
+
network,
|
|
2345
|
+
nftCollectionId,
|
|
2346
|
+
prefix,
|
|
2347
|
+
suffix,
|
|
2348
|
+
features,
|
|
2349
|
+
decimalPlaces: 0,
|
|
2350
|
+
asset,
|
|
2351
|
+
isToken: true,
|
|
2352
|
+
primaryKeyCurve,
|
|
2353
|
+
baseUnit: base_1.BaseUnit.APT,
|
|
2354
|
+
}));
|
|
2355
|
+
}
|
|
2356
|
+
/**
|
|
2357
|
+
* Factory function for testnet apt token instances.
|
|
2358
|
+
*
|
|
2359
|
+
* @param id uuid v4
|
|
2360
|
+
* @param name unique identifier of the token
|
|
2361
|
+
* @param fullName Complete human-readable name of the token
|
|
2362
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2363
|
+
* @param assetId Asset Id of this token i.e. the unique identifier of the token for all tokens - fungible, non-fungible and legacy
|
|
2364
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2365
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2366
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2367
|
+
* @param network Optional token network. Defaults to the testnet APT network.
|
|
2368
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
2369
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2370
|
+
*/
|
|
2371
|
+
function taptToken(id, name, fullName, decimalPlaces, assetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.apt, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2372
|
+
return aptToken(id, name, fullName, decimalPlaces, assetId, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2373
|
+
}
|
|
2374
|
+
/**
|
|
2375
|
+
* Factory function for testnet Apt NFT collections.
|
|
2376
|
+
*
|
|
2377
|
+
* @param id uuid v4
|
|
2378
|
+
* @param name unique identifier of the NFT collection
|
|
2379
|
+
* @param fullName Complete human-readable name of the NFT collection
|
|
2380
|
+
* @param nftCollectionId collection ID of the non-fungible tokens (NFTs)
|
|
2381
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2382
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2383
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2384
|
+
* @param network Optional token network. Defaults to APT test network.
|
|
2385
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
2386
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2387
|
+
*/
|
|
2388
|
+
function taptNFTCollection(id, name, fullName, nftCollectionId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = 't', suffix = name.toUpperCase(), network = networks_1.Networks.test.apt, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2389
|
+
return aptNFTCollection(id, name, fullName, nftCollectionId, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2390
|
+
}
|
|
2391
|
+
/**
|
|
2392
|
+
* Factory function for fiat coin instances.
|
|
2393
|
+
*
|
|
2394
|
+
* @param id uuid v4
|
|
2395
|
+
* @param name unique identifier of the coin, should start with 'fiat' or 'tfiat' followed by the 3-char ISO-4217 alphabetical code
|
|
2396
|
+
* @param fullName Complete human-readable name of the coin
|
|
2397
|
+
* @param network Network object for this coin
|
|
2398
|
+
* @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
|
|
2399
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2400
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `FiatCoin`
|
|
2401
|
+
* @param primaryKeyCurve? The elliptic curve for this chain/token
|
|
2402
|
+
* @param prefix? Optional coin prefix. Defaults to empty string
|
|
2403
|
+
* @param suffix? Optional coin suffix. Defaults to coin name.
|
|
2404
|
+
* @param isToken? Whether or not this coin is a token of another coin
|
|
2405
|
+
*/
|
|
2406
|
+
function fiat(id, name, fullName, network, decimalPlaces, asset, features = FiatCoin.DEFAULT_FEATURES, primaryKeyCurve = base_1.KeyCurve.Secp256k1, prefix = '', suffix = name.toUpperCase(), isToken = false) {
|
|
2407
|
+
return Object.freeze(new FiatCoin({
|
|
2408
|
+
id,
|
|
2409
|
+
name,
|
|
2410
|
+
fullName,
|
|
2411
|
+
network,
|
|
2412
|
+
prefix,
|
|
2413
|
+
suffix,
|
|
2414
|
+
features,
|
|
2415
|
+
decimalPlaces,
|
|
2416
|
+
isToken,
|
|
2417
|
+
asset,
|
|
2418
|
+
primaryKeyCurve,
|
|
2419
|
+
baseUnit: base_1.BaseUnit.FIAT,
|
|
2420
|
+
}));
|
|
2421
|
+
}
|
|
2422
|
+
/**
|
|
2423
|
+
* Factory function for sip10 token instances.
|
|
2424
|
+
*
|
|
2425
|
+
* @param id uuid v4
|
|
2426
|
+
* @param name unique identifier of the token
|
|
2427
|
+
* @param fullName Complete human-readable name of the token
|
|
2428
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2429
|
+
* @param assetId A unique identifier for a token, which is in the form of contractAddress.contractName::tokenName
|
|
2430
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2431
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2432
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2433
|
+
* @param network? Optional token network. Defaults to Stacks main network.
|
|
2434
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2435
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2436
|
+
*/
|
|
2437
|
+
function sip10Token(id, name, fullName, decimalPlaces, assetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.stx, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2438
|
+
return Object.freeze(new Sip10Token({
|
|
2439
|
+
id,
|
|
2440
|
+
name,
|
|
2441
|
+
fullName,
|
|
2442
|
+
network,
|
|
2443
|
+
assetId,
|
|
2444
|
+
prefix,
|
|
2445
|
+
suffix,
|
|
2446
|
+
features,
|
|
2447
|
+
decimalPlaces,
|
|
2448
|
+
asset,
|
|
2449
|
+
isToken: true,
|
|
2450
|
+
primaryKeyCurve,
|
|
2451
|
+
baseUnit: base_1.BaseUnit.STX,
|
|
2452
|
+
}));
|
|
2453
|
+
}
|
|
2454
|
+
/**
|
|
2455
|
+
* Factory function for testnet sip10 token instances.
|
|
2456
|
+
*
|
|
2457
|
+
* @param id uuid v4
|
|
2458
|
+
* @param name unique identifier of the token
|
|
2459
|
+
* @param fullName Complete human-readable name of the token
|
|
2460
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2461
|
+
* @param assetId A unique identifier for a token, which is in the form of contractAddress.contractName::tokenName
|
|
2462
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2463
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2464
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2465
|
+
* @param network? Optional token network. Defaults to the testnet Stacks network.
|
|
2466
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2467
|
+
*/
|
|
2468
|
+
function tsip10Token(id, name, fullName, decimalPlaces, assetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.stx) {
|
|
2469
|
+
return sip10Token(id, name, fullName, decimalPlaces, assetId, asset, features, prefix, suffix, network);
|
|
2470
|
+
}
|
|
2471
|
+
/**
|
|
2472
|
+
* Factory function for nep141 token instances.
|
|
2473
|
+
*
|
|
2474
|
+
* @param id uuid v4
|
|
2475
|
+
* @param name unique identifier of the token
|
|
2476
|
+
* @param fullName Complete human-readable name of the token
|
|
2477
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2478
|
+
* @param contractAddress Contract address of this token
|
|
2479
|
+
* @param storageDepositAmount the deposit amount needed to get registered with this contract
|
|
2480
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2481
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2482
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2483
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2484
|
+
* @param network Optional token network. Defaults to Near main network.
|
|
2485
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2486
|
+
*/
|
|
2487
|
+
function nep141Token(id, name, fullName, decimalPlaces, contractAddress, storageDepositAmount, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.near, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2488
|
+
return Object.freeze(new Nep141Token({
|
|
2489
|
+
id,
|
|
2490
|
+
name,
|
|
2491
|
+
fullName,
|
|
2492
|
+
network,
|
|
2493
|
+
decimalPlaces,
|
|
2494
|
+
contractAddress,
|
|
2495
|
+
storageDepositAmount,
|
|
2496
|
+
prefix,
|
|
2497
|
+
suffix,
|
|
2498
|
+
features,
|
|
2499
|
+
asset,
|
|
2500
|
+
isToken: true,
|
|
2501
|
+
primaryKeyCurve,
|
|
2502
|
+
baseUnit: base_1.BaseUnit.NEAR,
|
|
2503
|
+
}));
|
|
2504
|
+
}
|
|
2505
|
+
/**
|
|
2506
|
+
* Factory function for testnet nep141 token instances.
|
|
2507
|
+
*
|
|
2508
|
+
* @param id uuid v4
|
|
2509
|
+
* @param name unique identifier of the token
|
|
2510
|
+
* @param fullName Complete human-readable name of the token
|
|
2511
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2512
|
+
* @param contractAddress Contract address of this token
|
|
2513
|
+
* @param storageDepositAmount the deposit amount needed to get registered with this contract
|
|
2514
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2515
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2516
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2517
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2518
|
+
* @param network Optional token network. Defaults to the testnet Near network.
|
|
2519
|
+
*/
|
|
2520
|
+
function tnep141Token(id, name, fullName, decimalPlaces, contractAddress, storageDepositAmount, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.near) {
|
|
2521
|
+
return nep141Token(id, name, fullName, decimalPlaces, contractAddress, storageDepositAmount, asset, features, prefix, suffix, network);
|
|
2522
|
+
}
|
|
2523
|
+
/**
|
|
2524
|
+
* Factory function for vet token instances.
|
|
2525
|
+
*
|
|
2526
|
+
* @param id uuid v4
|
|
2527
|
+
* @param name unique identifier of the token
|
|
2528
|
+
* @param fullName Complete human-readable name of the token
|
|
2529
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2530
|
+
* @param contractAddress Contract address of this token
|
|
2531
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2532
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2533
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2534
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2535
|
+
* @param network Optional token network. Defaults to Near main network.
|
|
2536
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2537
|
+
* @param gasTankToken representing the token with which gas is paid on the network, defaults to 'VET:VTHO'
|
|
2538
|
+
*/
|
|
2539
|
+
function vetToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.vet, primaryKeyCurve = base_1.KeyCurve.Secp256k1, gasTankToken = 'VET:VTHO') {
|
|
2540
|
+
return Object.freeze(new VetToken({
|
|
2541
|
+
id,
|
|
2542
|
+
name,
|
|
2543
|
+
fullName,
|
|
2544
|
+
network,
|
|
2545
|
+
contractAddress,
|
|
2546
|
+
prefix,
|
|
2547
|
+
suffix,
|
|
2548
|
+
features,
|
|
2549
|
+
decimalPlaces,
|
|
2550
|
+
asset,
|
|
2551
|
+
isToken: true,
|
|
2552
|
+
primaryKeyCurve,
|
|
2553
|
+
baseUnit: base_1.BaseUnit.VET,
|
|
2554
|
+
gasTankToken,
|
|
2555
|
+
}));
|
|
2556
|
+
}
|
|
2557
|
+
/**
|
|
2558
|
+
* Factory function for testnet vet token instances.
|
|
2559
|
+
*
|
|
2560
|
+
* @param id uuid v4
|
|
2561
|
+
* @param name unique identifier of the token
|
|
2562
|
+
* @param fullName Complete human-readable name of the token
|
|
2563
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2564
|
+
* @param contractAddress Contract address of this token
|
|
2565
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2566
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2567
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2568
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2569
|
+
* @param network Optional token network. Defaults to the testnet Near network.
|
|
2570
|
+
* @param gasTankToken representing the token with which gas is paid on the network, defaults to 'TVET:VTHO'
|
|
2571
|
+
*/
|
|
2572
|
+
function tvetToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.vet, gasTankToken = 'TVET:VTHO' // For test environment
|
|
2573
|
+
) {
|
|
2574
|
+
return vetToken(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, base_1.KeyCurve.Secp256k1, gasTankToken);
|
|
2575
|
+
}
|
|
2576
|
+
/**
|
|
2577
|
+
* Factory function for Vet NFT collections.
|
|
2578
|
+
*
|
|
2579
|
+
* @param id uuid v4
|
|
2580
|
+
* @param name unique identifier of the NFT collection
|
|
2581
|
+
* @param fullName Complete human-readable name of the NFT collection
|
|
2582
|
+
* @param nftCollectionId collection ID of the non-fungible tokens (NFTs)
|
|
2583
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2584
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2585
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2586
|
+
* @param network Optional token network. Defaults to VET main network.
|
|
2587
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
2588
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2589
|
+
* @param gasTankToken representing the token with which gas is paid on the network, defaults to 'VET:VTHO'
|
|
2590
|
+
*/
|
|
2591
|
+
function vetNFTCollection(id, name, fullName, nftCollectionId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.vet, primaryKeyCurve = base_1.KeyCurve.Secp256k1, gasTankToken = 'VET:VTHO') {
|
|
2592
|
+
return Object.freeze(new VetNFTCollection({
|
|
2593
|
+
id,
|
|
2594
|
+
name,
|
|
2595
|
+
fullName,
|
|
2596
|
+
network,
|
|
2597
|
+
nftCollectionId,
|
|
2598
|
+
prefix,
|
|
2599
|
+
suffix,
|
|
2600
|
+
features,
|
|
2601
|
+
decimalPlaces: 0,
|
|
2602
|
+
asset,
|
|
2603
|
+
isToken: true,
|
|
2604
|
+
primaryKeyCurve,
|
|
2605
|
+
baseUnit: base_1.BaseUnit.VET,
|
|
2606
|
+
gasTankToken,
|
|
2607
|
+
}));
|
|
2608
|
+
}
|
|
2609
|
+
/**
|
|
2610
|
+
* Factory function for testnet Vet NFT collections.
|
|
2611
|
+
*
|
|
2612
|
+
* @param id uuid v4
|
|
2613
|
+
* @param name unique identifier of the NFT collection
|
|
2614
|
+
* @param fullName Complete human-readable name of the NFT collection
|
|
2615
|
+
* @param nftCollectionId collection ID of the non-fungible tokens (NFTs)
|
|
2616
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2617
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2618
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2619
|
+
* @param network Optional token network. Defaults to VET test network.
|
|
2620
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES and REQUIRES_RESERVE defined in `AccountCoin`
|
|
2621
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2622
|
+
* @param gasTankToken representing the token with which gas is paid on the network, defaults to 'TVET:VTHO'
|
|
2623
|
+
*/
|
|
2624
|
+
function tvetNFTCollection(id, name, fullName, nftCollectionId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = 't', suffix = name.toUpperCase(), network = networks_1.Networks.test.vet, primaryKeyCurve = base_1.KeyCurve.Secp256k1, gasTankToken = 'TVET:VTHO') {
|
|
2625
|
+
return vetNFTCollection(id, name, fullName, nftCollectionId, asset, features, prefix, suffix, network, primaryKeyCurve, gasTankToken);
|
|
2626
|
+
}
|
|
2627
|
+
/**
|
|
2628
|
+
* Factory function for Cosmos chain token instances.
|
|
2629
|
+
*
|
|
2630
|
+
* @param id uuid v4
|
|
2631
|
+
* @param name unique identifier of the token
|
|
2632
|
+
* @param fullName Complete human-readable name of the token
|
|
2633
|
+
* @param denom denomination of this token which will act as a unique identifier for the token on chain
|
|
2634
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2635
|
+
* @param network Network (mainnet or testnet) for this token
|
|
2636
|
+
* @param baseUnit Base unit of this token (native asset)
|
|
2637
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2638
|
+
* @param features Features of this coin. Defaults to the COSMOS_SIDECHAIN_FEATURES defined in `coinFeatures.ts`
|
|
2639
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2640
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2641
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2642
|
+
*/
|
|
2643
|
+
function cosmosToken(id, name, fullName, denom, decimalPlaces, network, baseUnit, asset, features = coinFeatures_1.COSMOS_SIDECHAIN_FEATURES, prefix = '', suffix = name.toUpperCase(), primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2644
|
+
return Object.freeze(new CosmosChainToken({
|
|
2645
|
+
id,
|
|
2646
|
+
name,
|
|
2647
|
+
fullName,
|
|
2648
|
+
denom,
|
|
2649
|
+
decimalPlaces,
|
|
2650
|
+
network,
|
|
2651
|
+
baseUnit,
|
|
2652
|
+
asset,
|
|
2653
|
+
features,
|
|
2654
|
+
prefix,
|
|
2655
|
+
suffix,
|
|
2656
|
+
primaryKeyCurve,
|
|
2657
|
+
isToken: true,
|
|
2658
|
+
}));
|
|
2659
|
+
}
|
|
2660
|
+
/**
|
|
2661
|
+
* Factory function for tao token instances.
|
|
2662
|
+
*
|
|
2663
|
+
* @param id uuid v4
|
|
2664
|
+
* @param name unique identifier of the token
|
|
2665
|
+
* @param fullName Complete human-readable name of the token
|
|
2666
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2667
|
+
* @param subnetId The uid of the subnet this token belongs to, numerical string
|
|
2668
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2669
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES
|
|
2670
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2671
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2672
|
+
* @param network? Optional token network. Defaults to TAO main network.
|
|
2673
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2674
|
+
*/
|
|
2675
|
+
function taoToken(id, name, fullName, decimalPlaces, subnetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.tao, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2676
|
+
return Object.freeze(new TaoCoin({
|
|
2677
|
+
id,
|
|
2678
|
+
name,
|
|
2679
|
+
fullName,
|
|
2680
|
+
network,
|
|
2681
|
+
subnetId,
|
|
2682
|
+
prefix,
|
|
2683
|
+
suffix,
|
|
2684
|
+
features,
|
|
2685
|
+
decimalPlaces,
|
|
2686
|
+
asset,
|
|
2687
|
+
isToken: true,
|
|
2688
|
+
primaryKeyCurve,
|
|
2689
|
+
baseUnit: base_1.BaseUnit.TAO,
|
|
2690
|
+
}));
|
|
2691
|
+
}
|
|
2692
|
+
/**
|
|
2693
|
+
* Factory function for testnet tao token instances.
|
|
2694
|
+
*
|
|
2695
|
+
* @param id uuid v4
|
|
2696
|
+
* @param name unique identifier of the token
|
|
2697
|
+
* @param fullName Complete human-readable name of the token
|
|
2698
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2699
|
+
* @param subnetId The uid of the subnet this token belongs to, numerical string
|
|
2700
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2701
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES
|
|
2702
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2703
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2704
|
+
* @param network? Optional token network. Defaults to TAO test network.
|
|
2705
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2706
|
+
*/
|
|
2707
|
+
function ttaoToken(id, name, fullName, decimalPlaces, subnetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.tao, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2708
|
+
return taoToken(id, name, fullName, decimalPlaces, subnetId, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2709
|
+
}
|
|
2710
|
+
/**
|
|
2711
|
+
* Factory function for polyx token instances.
|
|
2712
|
+
*
|
|
2713
|
+
* @param id uuid v4
|
|
2714
|
+
* @param name unique identifier of the token
|
|
2715
|
+
* @param fullName Complete human-readable name of the token
|
|
2716
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2717
|
+
* @param subnetId The uid of the subnet this token belongs to, numerical string
|
|
2718
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2719
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES
|
|
2720
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2721
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2722
|
+
* @param network? Optional token network. Defaults to Polyx main network.
|
|
2723
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2724
|
+
*/
|
|
2725
|
+
function polyxToken(id, name, fullName, decimalPlaces, ticker, assetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.polyx, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2726
|
+
return Object.freeze(new PolyxCoin({
|
|
2727
|
+
id,
|
|
2728
|
+
name,
|
|
2729
|
+
fullName,
|
|
2730
|
+
network,
|
|
2731
|
+
ticker,
|
|
2732
|
+
assetId,
|
|
2733
|
+
prefix,
|
|
2734
|
+
suffix,
|
|
2735
|
+
features,
|
|
2736
|
+
decimalPlaces,
|
|
2737
|
+
asset,
|
|
2738
|
+
isToken: true,
|
|
2739
|
+
primaryKeyCurve,
|
|
2740
|
+
baseUnit: base_1.BaseUnit.POLYX,
|
|
2741
|
+
}));
|
|
2742
|
+
}
|
|
2743
|
+
/**
|
|
2744
|
+
* Factory function for testnet polyx token instances.
|
|
2745
|
+
*
|
|
2746
|
+
* @param id uuid v4
|
|
2747
|
+
* @param name unique identifier of the token
|
|
2748
|
+
* @param fullName Complete human-readable name of the token
|
|
2749
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2750
|
+
* @param ticker The ticker symbol of the token
|
|
2751
|
+
* @param assetId The unique asset identifier for this token
|
|
2752
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2753
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES
|
|
2754
|
+
* @param prefix? Optional token prefix. Defaults to empty string
|
|
2755
|
+
* @param suffix? Optional token suffix. Defaults to token name.
|
|
2756
|
+
* @param network? Optional token network. Defaults to Polyx test network.
|
|
2757
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2758
|
+
*/
|
|
2759
|
+
function tpolyxToken(id, name, fullName, decimalPlaces, ticker, assetId, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.polyx, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2760
|
+
return polyxToken(id, name, fullName, decimalPlaces, ticker, assetId, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2761
|
+
}
|
|
2762
|
+
/**
|
|
2763
|
+
* Factory function for Jetton token instances.
|
|
2764
|
+
* Jetton is the token standard on TON blockchain.
|
|
2765
|
+
*
|
|
2766
|
+
* @param id uuid v4
|
|
2767
|
+
* @param name unique identifier of the token
|
|
2768
|
+
* @param fullName Complete human-readable name of the token
|
|
2769
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2770
|
+
* @param contractAddress Contract address of this token
|
|
2771
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2772
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2773
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2774
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2775
|
+
* @param network Optional token network. Defaults to TON main network.
|
|
2776
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2777
|
+
*/
|
|
2778
|
+
function jettonToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ton, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2779
|
+
return Object.freeze(new JettonToken({
|
|
2780
|
+
id,
|
|
2781
|
+
name,
|
|
2782
|
+
fullName,
|
|
2783
|
+
network,
|
|
2784
|
+
contractAddress,
|
|
2785
|
+
prefix,
|
|
2786
|
+
suffix,
|
|
2787
|
+
features,
|
|
2788
|
+
decimalPlaces,
|
|
2789
|
+
asset,
|
|
2790
|
+
isToken: true,
|
|
2791
|
+
primaryKeyCurve,
|
|
2792
|
+
baseUnit: base_1.BaseUnit.TON,
|
|
2793
|
+
}));
|
|
2794
|
+
}
|
|
2795
|
+
/**
|
|
2796
|
+
* Factory function for testnet jetton token instances.
|
|
2797
|
+
* Jetton is the token standard on TON blockchain.
|
|
2798
|
+
*
|
|
2799
|
+
* @param id uuid v4
|
|
2800
|
+
* @param name unique identifier of the token
|
|
2801
|
+
* @param fullName Complete human-readable name of the token
|
|
2802
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2803
|
+
* @param contractAddress Contract address of this token
|
|
2804
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2805
|
+
* @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `AccountCoin`
|
|
2806
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2807
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2808
|
+
* @param network Optional token network. Defaults to the testnet TON network.
|
|
2809
|
+
*/
|
|
2810
|
+
function tjettonToken(id, name, fullName, decimalPlaces, contractAddress, asset, features = AccountCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.ton, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2811
|
+
return jettonToken(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2812
|
+
}
|
|
2813
|
+
/**
|
|
2814
|
+
* Factory function for prod canton token instances.
|
|
2815
|
+
*
|
|
2816
|
+
* @param id uuid v4
|
|
2817
|
+
* @param name Name of the token
|
|
2818
|
+
* @param fullName Complete human-readable name of the token
|
|
2819
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2820
|
+
* @param baseUrl token standard base url, ref: https://docs.digitalasset.com/utilities/devnet/overview/registry-user-guide/token-standard.html#token-standard-endpoints
|
|
2821
|
+
* @param contractAddress the contract address of the token in the form `instrumentAdmin:instrumentId`
|
|
2822
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2823
|
+
* @param features Features of this coin. Defaults to CANTON_FEATURES
|
|
2824
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2825
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2826
|
+
* @param network Optional token network. Defaults to the mainnet canton network.
|
|
2827
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2828
|
+
*/
|
|
2829
|
+
function cantonToken(id, name, fullName, decimalPlaces, baseUrl, contractAddress, asset, features = coinFeatures_1.CANTON_TOKEN_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.canton, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2830
|
+
return Object.freeze(new CantonToken({
|
|
2831
|
+
id,
|
|
2832
|
+
name,
|
|
2833
|
+
fullName,
|
|
2834
|
+
decimalPlaces,
|
|
2835
|
+
network,
|
|
2836
|
+
baseUrl,
|
|
2837
|
+
contractAddress,
|
|
2838
|
+
asset,
|
|
2839
|
+
features,
|
|
2840
|
+
prefix,
|
|
2841
|
+
suffix,
|
|
2842
|
+
isToken: true,
|
|
2843
|
+
primaryKeyCurve,
|
|
2844
|
+
baseUnit: base_1.BaseUnit.CANTON,
|
|
2845
|
+
}));
|
|
2846
|
+
}
|
|
2847
|
+
/**
|
|
2848
|
+
* Factory function for testnet canton token instances.
|
|
2849
|
+
*
|
|
2850
|
+
* @param id uuid v4
|
|
2851
|
+
* @param name unique identifier of the token
|
|
2852
|
+
* @param fullName Complete human-readable name of the token
|
|
2853
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2854
|
+
* @param baseUrl token standard base url
|
|
2855
|
+
* @param contractAddress the contract address of the token in the form `instrumentAdmin:instrumentId`
|
|
2856
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2857
|
+
* @param features Features of this coin. Defaults to the CANTON_FEATURES
|
|
2858
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2859
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2860
|
+
* @param network Optional token network. Defaults to the testnet Canton network.
|
|
2861
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2862
|
+
*/
|
|
2863
|
+
function tcantonToken(id, name, fullName, decimalPlaces, baseUrl, contractAddress, asset, features = coinFeatures_1.CANTON_TOKEN_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.canton, primaryKeyCurve = base_1.KeyCurve.Ed25519) {
|
|
2864
|
+
return cantonToken(id, name, fullName, decimalPlaces, baseUrl, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2865
|
+
}
|
|
2866
|
+
/**
|
|
2867
|
+
* Factory function for TIP20 token instances on Tempo network.
|
|
2868
|
+
*
|
|
2869
|
+
* @param id uuid v4
|
|
2870
|
+
* @param name unique identifier of the token
|
|
2871
|
+
* @param fullName Complete human-readable name of the token
|
|
2872
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2873
|
+
* @param contractAddress the contract address of the token
|
|
2874
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2875
|
+
* @param features Features of this coin. Defaults to the TEMPO_FEATURES
|
|
2876
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2877
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2878
|
+
* @param network Optional token network. Defaults to the mainnet Tempo network.
|
|
2879
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2880
|
+
*/
|
|
2881
|
+
function tip20Token(id, name, fullName, decimalPlaces, contractAddress, asset, features = coinFeatures_1.TEMPO_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.tempo, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2882
|
+
return Object.freeze(new Tip20Token({
|
|
2883
|
+
id,
|
|
2884
|
+
name,
|
|
2885
|
+
fullName,
|
|
2886
|
+
decimalPlaces,
|
|
2887
|
+
network,
|
|
2888
|
+
contractAddress,
|
|
2889
|
+
asset,
|
|
2890
|
+
features,
|
|
2891
|
+
prefix,
|
|
2892
|
+
suffix,
|
|
2893
|
+
isToken: true,
|
|
2894
|
+
primaryKeyCurve,
|
|
2895
|
+
baseUnit: base_1.BaseUnit.ETH,
|
|
2896
|
+
}));
|
|
2897
|
+
}
|
|
2898
|
+
/**
|
|
2899
|
+
* Factory function for testnet TIP20 token instances on Tempo network.
|
|
2900
|
+
*
|
|
2901
|
+
* @param id uuid v4
|
|
2902
|
+
* @param name unique identifier of the token
|
|
2903
|
+
* @param fullName Complete human-readable name of the token
|
|
2904
|
+
* @param decimalPlaces Number of decimal places this token supports (divisibility exponent)
|
|
2905
|
+
* @param contractAddress the contract address of the token
|
|
2906
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
2907
|
+
* @param features Features of this coin. Defaults to the TEMPO_FEATURES
|
|
2908
|
+
* @param prefix Optional token prefix. Defaults to empty string
|
|
2909
|
+
* @param suffix Optional token suffix. Defaults to token name.
|
|
2910
|
+
* @param network Optional token network. Defaults to the testnet Tempo network.
|
|
2911
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
2912
|
+
*/
|
|
2913
|
+
function ttip20Token(id, name, fullName, decimalPlaces, contractAddress, asset, features = coinFeatures_1.TEMPO_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.tempo, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
2914
|
+
return tip20Token(id, name, fullName, decimalPlaces, contractAddress, asset, features, prefix, suffix, network, primaryKeyCurve);
|
|
2915
|
+
}
|
|
2916
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFvM0JBLDBCQThCQztBQW9CRCx3Q0FvQ0M7QUFrQkQsZ0NBOEJDO0FBZUQsa0NBNEJDO0FBaUJELHNCQThCQztBQWdCRCx3QkFhQztBQW9CRCwwQkE4QkM7QUFpQkQsNEJBMEJDO0FBZ0JELHdCQTRCQztBQWVELDBCQVlDO0FBZ0JELDRDQTRCQztBQWdCRCwwQkE0QkM7QUFlRCw0QkFZQztBQWlCRCxnRUErQkM7QUFpQkQsOEJBOEJDO0FBZ0JELGdDQWFDO0FBaUJELDRCQThCQztBQWdCRCw4QkFhQztBQWtCRCxvQ0E4QkM7QUFpQkQsc0NBYUM7QUFpQkQsOEJBOEJDO0FBaUJELGdDQTBCQztBQWlCRCxnQ0E2QkM7QUFtQkQsa0NBK0JDO0FBbUJELDhCQThCQztBQWlCRCxnQ0FhQztBQWtCRCw0QkFrQ0M7QUFrQkQsOEJBNEJDO0FBa0JELDRCQWtDQztBQWdCRCw4QkE0QkM7QUFtQkQsNEJBa0NDO0FBa0JELDhCQTRCQztBQWlCRCw4QkE4QkM7QUFpQkQsZ0NBMEJDO0FBaUJELG9DQThCQztBQWlCRCxzQ0EwQkM7QUFpQkQsa0NBOEJDO0FBaUJELG9DQTBCQztBQWlCRCxnQ0E4QkM7QUFpQkQsa0NBMEJDO0FBaUJELGdDQThCQztBQWlCRCxrQ0EwQkM7QUFpQkQsOEJBOEJDO0FBaUJELGdDQTBCQztBQWlCRCxvQ0E4QkM7QUFpQkQsc0NBMEJDO0FBaUJELGdDQThCQztBQWlCRCxrQ0EwQkM7QUFpQkQsNEJBOEJDO0FBaUJELDhCQTBCQztBQWlCRCw0QkE4QkM7QUFpQkQsOEJBMEJDO0FBaUJELDRCQThCQztBQWlCRCw4QkEwQkM7QUFvQkQsNEJBb0NDO0FBbUJELDhCQThCQztBQWVELGtDQWlDQztBQUtELG9DQTBCQztBQW9CRCw0QkFvQ0M7QUFxQkQsOEJBZ0NDO0FBaUJELDRCQThCQztBQWdCRCw0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Q0FDbEIsSUFBSSxVQUFVLENBQUM7UUFDYixFQUFFO1FBQ0YsSUFBSTtRQUNKLFFBQVE7UUFDUixhQUFhO1FBQ2IsT0FBTztRQUNQLGVBQWU7UUFDZixLQUFLO1FBQ0wsUUFBUTtRQUNSLE1BQU07UUFDTixNQUFNO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixlQUFlO1FBQ2YsUUFBUSxFQUFFLGVBQVEsQ0FBQyxHQUFHO0tBQ3ZCLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixFQUFVLEVBQ1YsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLGFBQXFCLEVBQ3JCLGVBQXVCLEVBQ3ZCLEtBQXNCLEVBQ3RCLFdBQTBCLDZCQUFjLEVBQ3hDLE1BQU0sR0FBRyxFQUFFLEVBQ1gsU0FBaUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNuQyxVQUEwQixtQkFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQzdDLGtCQUE0QixlQUFRLENBQUMsU0FBUztJQUU5QyxPQUFPLFVBQVUsQ0FDZixFQUFFLEVBQ0YsSUFBSSxFQUNKLFFBQVEsRUFDUixhQUFhLEVBQ2IsZUFBZSxFQUNmLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixPQUFPLEVBQ1AsZUFBZSxDQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luLCBCYXNlVW5pdCwgQ29pbkZlYXR1cmUsIENvaW5LaW5kLCBLZXlDdXJ2ZSwgVW5kZXJseWluZ0Fzc2V0IH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IERPTUFJTl9QQVRURVJOLCBIRURFUkFfTk9ERV9BQ0NDT1VOVF9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEludmFsaWRDb250cmFjdEFkZHJlc3NFcnJvciwgSW52YWxpZERvbWFpbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgQWNjb3VudE5ldHdvcmssIEJhc2VOZXR3b3JrLCBFdGhlcmV1bU5ldHdvcmssIE5ldHdvcmtzLCBUcm9uTmV0d29yayB9IGZyb20gJy4vbmV0d29ya3MnO1xuaW1wb3J0IHtcbiAgQUNDT1VOVF9DT0lOX0RFRkFVTFRfRkVBVFVSRVMsXG4gIEFDQ09VTlRfQ09JTl9ERUZBVUxUX0ZFQVRVUkVTX0VYQ0xVREVfU0lOR0FQT1JFLFxuICBDQU5UT05fVE9LRU5fRkVBVFVSRVMsXG4gIENFTE9fVE9LRU5fRkVBVFVSRVMsXG4gIENPU01PU19TSURFQ0hBSU5fRkVBVFVSRVMsXG4gIEVSQzc5ODRfVE9LRU5fRkVBVFVSRVMsXG4gIFRFTVBPX0ZFQVRVUkVTLFxufSBmcm9tICcuL2NvaW5GZWF0dXJlcyc7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgcHJvZ3JhbSBpZCBhZ2FpbnN0IHNvbCB0b2tlbiBwcm9ncmFtLlxuICovXG5leHBvcnQgZW51bSBQcm9ncmFtSUQge1xuICBUb2tlblByb2dyYW1JZCA9ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgVG9rZW4yMDIyUHJvZ3JhbUlkID0gJ1Rva2VuelFkQk5iTHFQNVZFaGRrQVM2RVBGTEMxUEhuQnFDWEVwUHh1RWInLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBpZDogc3RyaW5nO1xuICBmdWxsTmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzPzogc3RyaW5nO1xuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yaztcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldDtcbiAgYmFzZVVuaXQ6IEJhc2VVbml0O1xuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXTtcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyO1xuICBpc1Rva2VuOiBib29sZWFuO1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIHN1ZmZpeD86IHN0cmluZztcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZTtcbn1cblxuLyoqXG4gKiBBY2NvdW50IGJhc2VkIGNvaW5zLCBzdWNoIGFzIEV0aGVyZXVtLCBTdGVsbGFyLCBvciBYUlAuXG4gKlxuICogVGhlc2UgdHlwZXMgb2YgY29pbnMgbWFpbnRhaW4gYW4gXCJhY2NvdW50IGJhbGFuY2VcIiBmb3IgZWFjaCBhZGRyZXNzIG9uIHRoZSBuZXR3b3JrLFxuICogYXMgb3Bwb3NlZCB0byB0aGUgdW5zcGVudCB0cmFuc2FjdGlvbiBvdXRwdXQgbW9kZWwgd2hpY2ggbWFpbnRhaW5zIGEgcmVjb3JkIG9mIGFsbFxuICogXCJwaWVjZXNcIiBvZiBjb2luIHdoaWNoIGJlbG9uZyB0byBhbiBhZGRyZXNzLlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudENvaW4gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GRUFUVVJFUyA9IEFDQ09VTlRfQ09JTl9ERUZBVUxUX0ZFQVRVUkVTO1xuXG4gIC8vIE5lZWQgdG8gZ2F0ZSBzb21lIGhpZ2ggcmlzayBjb2luIGZyb20gU0lOR0FQT1JFIHRydXN0XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GRUFUVVJFU19FWENMVURFX1NJTkdBUE9SRSA9IEFDQ09VTlRfQ09JTl9ERUZBVUxUX0ZFQVRVUkVTX0VYQ0xVREVfU0lOR0FQT1JFO1xuXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrOiBBY2NvdW50TmV0d29yaztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGtpbmQ6IENvaW5LaW5kLkNSWVBUTyxcbiAgICB9KTtcblxuICAgIHRoaXMubmV0d29yayA9IG9wdGlvbnMubmV0d29yaztcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlZEZlYXR1cmVzKCk6IFNldDxDb2luRmVhdHVyZT4ge1xuICAgIHJldHVybiBuZXcgU2V0PENvaW5GZWF0dXJlPihbQ29pbkZlYXR1cmUuQUNDT1VOVF9NT0RFTF0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc2FsbG93ZWRGZWF0dXJlcygpOiBTZXQ8Q29pbkZlYXR1cmU+IHtcbiAgICByZXR1cm4gbmV3IFNldDxDb2luRmVhdHVyZT4oW0NvaW5GZWF0dXJlLlVOU1BFTlRfTU9ERUxdKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RmVhdHVyZXNFeGNsdWRpbmcoZXhjbHVkZWRGZWF0dXJlczogQ29pbkZlYXR1cmVbXSk6IENvaW5GZWF0dXJlW10ge1xuICAgIHJldHVybiBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLmZpbHRlcigoZmVhdHVyZSkgPT4gIWV4Y2x1ZGVkRmVhdHVyZXMuaW5jbHVkZXMoZmVhdHVyZSkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRGZWF0dXJlc0J5VHlwZUV4Y2x1ZGluZyhcbiAgICBleGNsdWRlZEZlYXR1cmVzOiBDb2luRmVhdHVyZVtdLFxuICAgIGJhc2VGZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVNcbiAgKTogQ29pbkZlYXR1cmVbXSB7XG4gICAgcmV0dXJuIGJhc2VGZWF0dXJlcy5maWx0ZXIoKGZlYXR1cmUpID0+ICFleGNsdWRlZEZlYXR1cmVzLmluY2x1ZGVzKGZlYXR1cmUpKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdhc1RhbmtBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIC8vIGxvdyBnYXMgdGFuayBiYWxhbmNlIGFsZXJ0IHRocmVzaG9sZCBpcyBjYWxjdWxhdGVkIGFzIChmZWVFc3RpbWF0ZSB4IGdhc1RhbmtMb3dCYWxhbmNlQWxlcnRGYWN0b3IpXG4gIGdhc1RhbmtMb3dCYWxhbmNlQWxlcnRGYWN0b3I6IG51bWJlcjtcbiAgLy8gbWluIGdhcyB0YW5rIGJhbGFuY2UgcmVjb21tZW5kYXRpb24gaXMgY2FsY3VsYXRlZCBhcyAoZmVlRXN0aW1hdGUgeCBnYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yKVxuICBnYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yOiBudW1iZXI7XG4gIC8vIGdhcyB0YW5rIHRva2VuIGlzIHRoZSB0b2tlbiB1c2VkIHRvIHBheSBmb3IgZ2FzXG4gIGdhc1RhbmtUb2tlbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcmM3MjFDb25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJjNzk4NENvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBORlRDb2xsZWN0aW9uSWRDb25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgbmZ0Q29sbGVjdGlvbklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlbGxhckNvaW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgZG9tYWluOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVkZXJhQ29pbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBub2RlQWNjb3VudElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVkZXJhVG9rZW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgbm9kZUFjY291bnRJZDogc3RyaW5nO1xuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFb3NDb2luQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nO1xuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgc3ltYm9sPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbENvaW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgdG9rZW5BZGRyZXNzOiBzdHJpbmc7XG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xuICBwcm9ncmFtSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBYcnBDb2luQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIGlzc3VlckFkZHJlc3M6IHN0cmluZztcbiAgY3VycmVuY3lDb2RlOiBzdHJpbmc7XG4gIGRvbWFpbjogc3RyaW5nO1xuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBYcnBNcHRDb2luQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIG1wdElzc3VhbmNlSWQ6IHN0cmluZzsgLy8gNDgtY2hhciBoZXggTVBUb2tlbklzc3VhbmNlSUQg4oCUIHN0b3JlZCBhcyBjb250cmFjdEFkZHJlc3NcbiAgY2FuVHJhbnNmZXI6IGJvb2xlYW47IC8vIGltbXV0YWJsZSBsc2ZNUFRDYW5UcmFuc2ZlciAoMHgwMDA4KSBmbGFnXG4gIGFzc2V0U2NhbGU6IG51bWJlcjsgLy8gaW1tdXRhYmxlIEFzc2V0U2NhbGUgZnJvbSBNUFRva2VuSXNzdWFuY2VDcmVhdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWlDb2luQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIHBhY2thZ2VJZDogc3RyaW5nO1xuICBtb2R1bGU6IHN0cmluZztcbiAgc3ltYm9sOiBzdHJpbmc7XG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwdENvaW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgYXNzZXRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhb0NvaW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgc3VibmV0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb2x5eENvaW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgdGlja2VyOiBzdHJpbmc7XG4gIGFzc2V0SWQ6IHN0cmluZztcbn1cblxudHlwZSBGaWF0Q29pbk5hbWUgPSBgZmlhdCR7c3RyaW5nfWAgfCBgdGZpYXQke3N0cmluZ31gO1xuZXhwb3J0IGludGVyZmFjZSBGaWF0Q29pbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBuYW1lOiBGaWF0Q29pbk5hbWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lwMTBUb2tlbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBhc3NldElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmVwMTQxVG9rZW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHN0b3JhZ2VEZXBvc2l0QW1vdW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmV0VG9rZW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIGdhc1RhbmtUb2tlbj86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29zbW9zVG9rZW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgZGVub206IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKZXR0b25Ub2tlbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFUb2tlbkNvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIEFjY291bnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBwb2xpY3lJZDogc3RyaW5nO1xuICBhc3NldE5hbWU6IHN0cmluZztcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FudG9uVG9rZW5Db25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaXAyMFRva2VuQ29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0QWRkcmVzcyBleHRlbmRzIFN0cmluZyB7XG4gIF9fY29udHJhY3RhZGRyZXNzX3BoYW50b21fXzogbmV2ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBBY2NvdW50Q29pblRva2VuIGV4dGVuZHMgQWNjb3VudENvaW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2FzVGFua0FjY291bnRDb2luIGV4dGVuZHMgQWNjb3VudENvaW4ge1xuICBwdWJsaWMgZ2FzVGFua0xvd0JhbGFuY2VBbGVydEZhY3RvcjogbnVtYmVyO1xuICBwdWJsaWMgZ2FzVGFua01pbkJhbGFuY2VSZWNvbW1lbmRhdGlvbkZhY3RvcjogbnVtYmVyO1xuICBwdWJsaWMgZ2FzVGFua1Rva2VuPzogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHYXNUYW5rQWNjb3VudENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5nYXNUYW5rTG93QmFsYW5jZUFsZXJ0RmFjdG9yID0gb3B0aW9ucy5nYXNUYW5rTG93QmFsYW5jZUFsZXJ0RmFjdG9yO1xuICAgIHRoaXMuZ2FzVGFua01pbkJhbGFuY2VSZWNvbW1lbmRhdGlvbkZhY3RvciA9IG9wdGlvbnMuZ2FzVGFua01pbkJhbGFuY2VSZWNvbW1lbmRhdGlvbkZhY3RvcjtcbiAgICB0aGlzLmdhc1RhbmtUb2tlbiA9IG9wdGlvbnM/Lmdhc1RhbmtUb2tlbjtcbiAgfVxufVxuXG4vKipcbiAqIFNvbWUgYmxvY2tjaGFpbnMgc3VwcG9ydCB0b2tlbnMgd2hpY2ggYXJlIGRlZmluZWQgYnkgYW4gYWRkcmVzcyBhdCB3aGljaCB0aGV5IGhhdmUgYSBzbWFydCBjb250cmFjdCBkZXBsb3llZC5cbiAqIEV4YW1wbGVzIGFyZSBFUkMyMCB0b2tlbnMsIGFuZCB0aGUgZXF1aXZhbGVudCBvbiBvdGhlciBjaGFpbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIGNvbnRyYWN0QWRkcmVzczogQ29udHJhY3RBZGRyZXNzO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVyYzIwQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIC8vIHZhbGlkIEVSQyAyMCBjb250cmFjdCBhZGRyZXNzZXMgYXJlIFwiMHhcIiBmb2xsb3dlZCBieSA0MCBsb3dlcmNhc2UgaGV4IGNoYXJhY3RlcnNcbiAgICAvLyBkbyBub3QgdXNlIGEgdmFsaWQgYWRkcmVzcyBmb3JtYXQgZm9yIGdlbmVyaWMgdG9rZW5zIGJlY2F1c2UgdGhleSBub3QgaGF2ZSBvbmNoYWluIGFkZHJlc3Nlc1xuICAgIGlmICghb3B0aW9ucy5jb250cmFjdEFkZHJlc3MubWF0Y2goL14weFthLWYwLTldezQwfSQvKSAmJiAhb3B0aW9ucy5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5HRU5FUklDX1RPS0VOKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRDb250cmFjdEFkZHJlc3NFcnJvcihvcHRpb25zLm5hbWUsIG9wdGlvbnMuY29udHJhY3RBZGRyZXNzKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyYWN0QWRkcmVzcyA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzIGFzIHVua25vd24gYXMgQ29udHJhY3RBZGRyZXNzO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBmb3IgYmxvY2tjaGFpbnMgdGhhdCBzdXBwb3J0IE5GVCBjb2xsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5GVENvbGxlY3Rpb25JZERlZmluZWRUb2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgbmZ0Q29sbGVjdGlvbklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTkZUQ29sbGVjdGlvbklkQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLm5mdENvbGxlY3Rpb25JZCA9IG9wdGlvbnMubmZ0Q29sbGVjdGlvbklkO1xuICB9XG59XG5cbi8qKlxuICogRVJDMjAgdG9rZW4gYWRkcmVzc2VzIGFyZSBCYXNlNTggZm9ybWF0dGVkIG9uIHNvbWUgYmxvY2tjaGFpbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlNThDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIGNvbnRyYWN0QWRkcmVzczogQ29udHJhY3RBZGRyZXNzO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVyYzIwQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIGlmICghL15bMS05QS1ISi1OUC1aYS1rbS16XXszNH0kLy50ZXN0KG9wdGlvbnMuY29udHJhY3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRDb250cmFjdEFkZHJlc3NFcnJvcihvcHRpb25zLm5hbWUsIG9wdGlvbnMuY29udHJhY3RBZGRyZXNzKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyYWN0QWRkcmVzcyA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzIGFzIHVua25vd24gYXMgQ29udHJhY3RBZGRyZXNzO1xuICB9XG59XG5cbi8qKlxuICogRVJDIDIwIGlzIGEgdG9rZW4gc3RhbmRhcmQgZm9yIHRoZSBFdGhlcmV1bSBibG9ja2NoYWluLiBUaGV5IGFyZSBzaW1pbGFyIHRvIG90aGVyIGFjY291bnQgY29pbnMsIGJ1dCBoYXZlIGFcbiAqIGNvbnRyYWN0IGFkZHJlc3MgcHJvcGVydHkgd2hpY2ggaWRlbnRpZmllcyB0aGUgc21hcnQgY29udHJhY3Qgd2hpY2ggZGVmaW5lcyB0aGUgdG9rZW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBFcmMyMENvaW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge31cblxuLyoqXG4gKiBFUkMgNzIxIGlzIHRoZSBub24gZnVuZ2libGUgdG9rZW4gc3RhbmRhcmQgZm9yIHRoZSBFdGhlcmV1bSBibG9ja2NoYWluLlxuICpcbiAqIHtAbGluayBodHRwczovL2VpcHMuZXRoZXJldW0ub3JnL0VJUFMvZWlwLTcyMSBFSVA3MjF9XG4gKi9cbmV4cG9ydCBjbGFzcyBFcmM3MjFDb2luIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHt9XG5cbi8qKlxuICogRVJDIDExNTUgaXMgdGhlIG11bHRpIHRva2VuIHN0YW5kYXJkIGZvciB0aGUgRXRoZXJldW0gYmxvY2tjaGFpbi5cbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC0xMTU1IEVJUDExNTV9XG4gKi9cbmV4cG9ydCBjbGFzcyBFcmMxMTU1Q29pbiBleHRlbmRzIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiB7fVxuXG4vKipcbiAqIEVSQy03OTg0IGlzIHRoZSBjb25maWRlbnRpYWwgdG9rZW4gc3RhbmRhcmQgZm9yIGZoRVZNLWVuYWJsZWQgYmxvY2tjaGFpbnMgKFphbWEpLlxuICogVG9rZW4gYmFsYW5jZXMgYXJlIHN0b3JlZCBhcyBGSEUtZW5jcnlwdGVkIGNpcGhlcnRleHRzOyB0cmFuc2ZlcnMgdXNlIGNvbmZpZGVudGlhbFRyYW5zZmVyKClcbiAqIGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIEVSQy0yMCB0cmFuc2ZlcigpLiBCYWxhbmNlIHJlYWRzIHJlcXVpcmUgZGVsZWdhdGVkIGRlY3J5cHRpb24gdmlhIEFDTC5cbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC03OTg0IEVJUC03OTg0fVxuICovXG5leHBvcnQgY2xhc3MgRXJjNzk4NENvaW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmM3OTg0Q29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgVFJPTiBibG9ja2NoYWluIHN1cHBvcnRzIHRva2VucyBvZiB0aGUgRVJDMjAgc3RhbmRhcmQgc2ltaWxhciB0byBFVEggRVJDMjAgdG9rZW5zLlxuICovXG5leHBvcnQgY2xhc3MgVHJvbkVyYzIwQ29pbiBleHRlbmRzIEJhc2U1OENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiB7fVxuXG4vKipcbiAqIFNvbWUgYmxvY2tjaGFpbnMgaGF2ZSBuYXRpdmUgY29pbnMgd2hpY2ggYWxzbyBzdXBwb3J0IHRoZSBFUkMyMCBpbnRlcmZhY2Ugc3VjaCBhcyBDRUxPLlxuICovXG5leHBvcnQgY2xhc3MgRXJjMjBDb21wYXRpYmxlQWNjb3VudENvaW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAvLyBUaGVzZSBjb2lucyBzaG91bGQgbm90IGJlIGNsYXNzaWZpZWQgYXMgdG9rZW5zIGFzIHRoZXkgYXJlIG5vdCBjaGlsZHJlbiBvZiBvdGhlciBjb2luc1xuICAgICAgaXNUb2tlbjogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgQ0VMTyBibG9ja2NoYWluIHN1cHBvcnRzIHRva2VucyBvZiB0aGUgRVJDMjAgc3RhbmRhcmQgc2ltaWxhciB0byBFVEggRVJDMjAgdG9rZW5zLlxuICovXG5leHBvcnQgY2xhc3MgQ2Vsb0NvaW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge31cblxuLyoqXG4gKiBUaGUgQlNDIGJsb2NrY2hhaW4gc3VwcG9ydHMgdG9rZW5zIG9mIHRoZSBFUkMyMCBzdGFuZGFyZCBzaW1pbGFyIHRvIEVUSCBFUkMyMCB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCc2NDb2luIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHt9XG5cbi8qKlxuICogVGhlIFN0ZWxsYXIgbmV0d29yayBzdXBwb3J0cyB0b2tlbnMgKG5vbi1uYXRpdmUgYXNzZXRzKVxuICogWExNIGlzIGFsc28ga25vd24gYXMgdGhlIG5hdGl2ZSBhc3NldC5cbiAqIFN0ZWxsYXIgdG9rZW5zIHdvcmsgc2ltaWxhciB0byBYTE0sIGJ1dCB0aGUgdG9rZW4gbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjaGFpbixcbiAqIHRoZSB0b2tlbiBjb2RlIGFuZCB0aGUgaXNzdWVyIGFjY291bnQgaW4gdGhlIGZvcm06ICh0KXhsbTo8dG9rZW4+LTxpc3N1ZXI+XG4gKi9cbmV4cG9ydCBjbGFzcyBTdGVsbGFyQ29pbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgZG9tYWluOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU3RlbGxhckNvaW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZG9tYWluICE9PSAnJyAmJiAhb3B0aW9ucy5kb21haW4ubWF0Y2goRE9NQUlOX1BBVFRFUk4pKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZERvbWFpbkVycm9yKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5kb21haW4pO1xuICAgIH1cblxuICAgIHRoaXMuZG9tYWluID0gb3B0aW9ucy5kb21haW4gYXMgc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogVGhlIEhlZGVyYSBjb2luIG5lZWRzIGEgY2xpZW50IHNldCB3aXRoIHRoZSBub2RlIGFjY291bnQgSWQuXG4gKiBJdCdzIGFuIGFjY291bnQgYmFzZWQgY29pbiB0aGF0IG5lZWRzIHRoZSBub2RlIGFjY291bnQgSURcbiAqIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHNlbnQuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgSGVkZXJhQ29pbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgbm9kZUFjY291bnRJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEhlZGVyYUNvaW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgdGhpcy5ub2RlQWNjb3VudElkID0gb3B0aW9ucy5ub2RlQWNjb3VudElkO1xuICB9XG59XG5cbi8qKlxuICogVGhlIEhlZGVyYSBuZXR3b3JrIHN1cHBvcnRzIHRva2Vucy5cbiAqIEhlZGVyYSB0b2tlbnMgd29yayBzaW1pbGFyIHRvIG5hdGl2ZSBIZWRlcmEgY29pbixcbiAqIGJ1dCB0aGUgdG9rZW4gaXMgZGV0ZXJtaW5lZCBieSB0aGUgdG9rZW5JZCBvbiB0aGUgbm9kZVxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEhlZGVyYVRva2VuIGV4dGVuZHMgQWNjb3VudENvaW5Ub2tlbiB7XG4gIHB1YmxpYyBub2RlQWNjb3VudElkOiBzdHJpbmc7XG4gIHB1YmxpYyB0b2tlbklkOiBzdHJpbmc7XG4gIHB1YmxpYyBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBIZWRlcmFUb2tlbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGVBY2NvdW50SWQgPSBvcHRpb25zLm5vZGVBY2NvdW50SWQ7XG4gICAgdGhpcy50b2tlbklkID0gb3B0aW9ucy5jb250cmFjdEFkZHJlc3M7XG4gICAgdGhpcy5jb250cmFjdEFkZHJlc3MgPSBvcHRpb25zLmNvbnRyYWN0QWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBBbGdvIG5ldHdvcmsgc3VwcG9ydHMgdG9rZW5zIChhc3NldHMpXG4gKiBBbGdvIHRva2VucyB3b3JrIHNpbWlsYXIgdG8gbmF0aXZlIEFMR08gY29pbiwgYnV0IHRoZSB0b2tlbiBuYW1lIGlzIGRldGVybWluZWQgYnlcbiAqIHVuaXF1ZSBhc3NldCBpZCBvbiB0aGUgY2hhaW4uIEludGVybmFsbHksIEJpdEdvIHVzZXMgdG9rZW4gaWRlbnRpZmllcnMgb2YgdGhlIGZvcm1hdDogKHQpYWxnbzo8YXNzZXRJZD5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBBbGdvQ29pbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBY2NvdW50Q29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBFb3MgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIEVvcyB0b2tlbnMgd29yayBzaW1pbGFyIHRvIG5hdGl2ZSBFb3MgY29pbiwgYnV0IHRoZSB0b2tlbiBuYW1lIGlzIGRldGVybWluZWQgYnlcbiAqIHRoZSBjb250cmFjdE5hbWUgb24gdGhlIGNoYWluLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEVvc0NvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIGNvbnRyYWN0TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBzeW1ib2w6IHN0cmluZztcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRW9zQ29pbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyYWN0TmFtZSA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzO1xuICAgIHRoaXMuY29udHJhY3RBZGRyZXNzID0gb3B0aW9ucy5jb250cmFjdEFkZHJlc3M7XG4gICAgdGhpcy5zeW1ib2wgPSBvcHRpb25zLnN5bWJvbCA/PyBvcHRpb25zLm5hbWUuc3BsaXQoJzonKVsxXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBTb2wgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIFNvbCB0b2tlbnMgd29yayBzaW1pbGFyIHRvIG5hdGl2ZSBTT0wgY29pbiwgYnV0IHRoZSB0b2tlbiBuYW1lIGlzIGRldGVybWluZWQgYnlcbiAqIHRoZSB0b2tlbkFkZHJlc3Mgb24gdGhlIGNoYWluLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFNvbENvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIHRva2VuQWRkcmVzczogc3RyaW5nO1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBwcm9ncmFtSWQ6IHN0cmluZztcbiAgY29uc3RydWN0b3Iob3B0aW9uczogU29sQ29pbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRva2VuQWRkcmVzcyA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzO1xuICAgIHRoaXMuY29udHJhY3RBZGRyZXNzID0gb3B0aW9ucy5jb250cmFjdEFkZHJlc3M7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBvcHRpb25zLnByb2dyYW1JZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXRoTGlrZUVSQzIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdGhMaWtlRVJDNzIxVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmM3MjFDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBBVkFYIEMgQ2hhaW4gbmV0d29yayBzdXBwb3J0IHRva2Vuc1xuICogQVZBWCBDIENoYWluIFRva2VucyBhcmUgRVJDMjAgY29pbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEF2YXhFUkMyMFRva2VuIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBQb2x5Z29uIENoYWluIG5ldHdvcmsgc3VwcG9ydCB0b2tlbnNcbiAqIFBvbHlnb24gQ2hhaW4gVG9rZW5zIGFyZSBFUkMyMCBjb2luc1xuICovXG5leHBvcnQgY2xhc3MgUG9seWdvbkVSQzIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIEFyYml0cnVtIENoYWluIG5ldHdvcmsgc3VwcG9ydCB0b2tlbnNcbiAqIEFyYml0cnVtIENoYWluIFRva2VucyBhcmUgRVJDMjAgdG9rZW5zXG4gKi9cbmV4cG9ydCBjbGFzcyBBcmJldGhFUkMyMFRva2VuIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBPcHRpbWlzbSBDaGFpbiBuZXR3b3JrIHN1cHBvcnQgdG9rZW5zXG4gKiBPcHRpbWlzbSBDaGFpbiBUb2tlbnMgYXJlIEVSQzIwIHRva2Vuc1xuICovXG5leHBvcnQgY2xhc3MgT3BldGhFUkMyMFRva2VuIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB6a1N5bmMgbmV0d29yayBzdXBwb3J0IHRva2Vuc1xuICogemtTeW5jIFRva2VucyBhcmUgRVJDMjAgdG9rZW5zXG4gKi9cbmV4cG9ydCBjbGFzcyBaa2V0aEVSQzIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIEJlcmEgQ2hhaW4gbmV0d29yayBzdXBwb3J0IHRva2Vuc1xuICogQmVyYSBDaGFpbiBUb2tlbnMgYXJlIEVSQzIwIHRva2Vuc1xuICovXG5leHBvcnQgY2xhc3MgQmVyYUVSQzIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIENvcmVkYW8gQ2hhaW4gbmV0d29yayBzdXBwb3J0IHRva2Vuc1xuICogQ29yZWRhbyBDaGFpbiBUb2tlbnMgYXJlIEVSQzIwIHRva2Vuc1xuICovXG5leHBvcnQgY2xhc3MgQ29yZWRhb0VSQzIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIFdvcmxkIENoYWluIG5ldHdvcmsgc3VwcG9ydHMgdG9rZW5zXG4gKiBXb3JsZCBDaGFpbiBUb2tlbnMgYXJlIEVSQzIwIHRva2Vuc1xuICovXG5leHBvcnQgY2xhc3MgV29ybGRFUkMyMFRva2VuIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBGbHIgQ2hhaW4gbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIEZsciBDaGFpbiBUb2tlbnMgYXJlIEVSQzIwIHRva2Vuc1xuICovXG5leHBvcnQgY2xhc3MgRmxyRVJDMjBUb2tlbiBleHRlbmRzIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVyYzIwQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgWERDIG5ldHdvcmsgc3VwcG9ydHMgdG9rZW5zXG4gKiBYREMgVG9rZW5zIGFyZSBFUkMyMCB0b2tlbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFhkY0VSQzIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFcmMyMENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIE1vbiBuZXR3b3JrIHN1cHBvcnRzIHRva2Vuc1xuICogTW9uIFRva2VucyBhcmUgRVJDMjAgdG9rZW5zXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25FUkMyMFRva2VuIGV4dGVuZHMgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXJjMjBDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBYcnAgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIFhycCB0b2tlbnMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgaXNzdWVyIGFkZHJlc3NcbiAqIE5hbWluZyBmb3JtYXQgaXMgc2ltaWxhciB0byBYTE1cbiAqIDxuZXR3b3JrPjo8dG9rZW4+LTxpc3N1ZXI+XG4gKi9cbmV4cG9ydCBjbGFzcyBYcnBDb2luIGV4dGVuZHMgQWNjb3VudENvaW5Ub2tlbiB7XG4gIHB1YmxpYyBpc3N1ZXJBZGRyZXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBjdXJyZW5jeUNvZGU6IHN0cmluZztcbiAgcHVibGljIGRvbWFpbjogc3RyaW5nO1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFhycENvaW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZG9tYWluICE9PSAnJyAmJiAhb3B0aW9ucy5kb21haW4ubWF0Y2goRE9NQUlOX1BBVFRFUk4pKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZERvbWFpbkVycm9yKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5kb21haW4pO1xuICAgIH1cblxuICAgIHRoaXMuZG9tYWluID0gb3B0aW9ucy5kb21haW4gYXMgc3RyaW5nO1xuICAgIHRoaXMuaXNzdWVyQWRkcmVzcyA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzLnNwbGl0KCc6OicpWzBdO1xuICAgIHRoaXMuY3VycmVuY3lDb2RlID0gb3B0aW9ucy5jb250cmFjdEFkZHJlc3Muc3BsaXQoJzo6JylbMV07XG4gICAgdGhpcy5jb250cmFjdEFkZHJlc3MgPSBvcHRpb25zLmNvbnRyYWN0QWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIFhSUCBMZWRnZXIgTXVsdGktUHVycG9zZSBUb2tlbiAoTVBUKSDigJQgTVBUb2tlbnNWMSBhbWVuZG1lbnQuXG4gKiBJZGVudGlmaWVkIGJ5IGEgNDgtY2hhciBoZXggTVBUb2tlbklzc3VhbmNlSUQgc3RvcmVkIGFzIGNvbnRyYWN0QWRkcmVzcy5cbiAqIFVzZXMgYWNjb3VudF9vYmplY3RzIChub3QgYWNjb3VudF9saW5lcykuIE5vIGlzc3Vlcjo6Y3VycmVuY3kgcGF0dGVybi5cbiAqIE5hbWVkIHhycDo8dG9rZW5fbmFtZT4g4oCUIHNhbWUgcGF0dGVybiBhcyB0cnVzdC1saW5lIHRva2Vucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFhycE1wdENvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyYWN0QWRkcmVzczogc3RyaW5nOyAvLyBNUFRva2VuSXNzdWFuY2VJRFxuICBwdWJsaWMgcmVhZG9ubHkgY2FuVHJhbnNmZXI6IGJvb2xlYW47IC8vIGltbXV0YWJsZSDigJQgc2V0IGF0IE1QVG9rZW5Jc3N1YW5jZUNyZWF0ZVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFhycE1wdENvaW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICBpZiAoIS9eWzAtOWEtZkEtRl17NDh9JC8udGVzdChvcHRpb25zLm1wdElzc3VhbmNlSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbnRyYWN0QWRkcmVzc0Vycm9yKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5tcHRJc3N1YW5jZUlkKTtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob3B0aW9ucy5hc3NldFNjYWxlKSB8fCBvcHRpb25zLmFzc2V0U2NhbGUgPCAwIHx8IG9wdGlvbnMuYXNzZXRTY2FsZSA+IDI1NSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgaW52YWxpZCBhc3NldFNjYWxlICcke29wdGlvbnMuYXNzZXRTY2FsZX0nIGZvciBjb2luICcke29wdGlvbnMubmFtZX0nOiBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTUgKHVpbnQ4KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cmFjdEFkZHJlc3MgPSBvcHRpb25zLm1wdElzc3VhbmNlSWQ7XG4gICAgdGhpcy5jYW5UcmFuc2ZlciA9IG9wdGlvbnMuY2FuVHJhbnNmZXI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1aUNvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIHBhY2thZ2VJZDogc3RyaW5nO1xuICBwdWJsaWMgbW9kdWxlOiBzdHJpbmc7XG4gIHB1YmxpYyBzeW1ib2w6IHN0cmluZztcbiAgcHVibGljIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN1aUNvaW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWNrYWdlSWQgPSBvcHRpb25zLnBhY2thZ2VJZDtcbiAgICB0aGlzLm1vZHVsZSA9IG9wdGlvbnMubW9kdWxlO1xuICAgIHRoaXMuc3ltYm9sID0gb3B0aW9ucy5zeW1ib2w7XG4gICAgdGhpcy5jb250cmFjdEFkZHJlc3MgPSBvcHRpb25zLmNvbnRyYWN0QWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBBcHQgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIEFwdCB0b2tlbnMgd29yayBzaW1pbGFyIHRvIG5hdGl2ZSBBcHQgY29pbiwgYnV0IHRoZSB0b2tlbiBuYW1lIGlzIGRldGVybWluZWQgYnlcbiAqIHRoZSB0b2tlbkFkZHJlc3Mgb24gdGhlIGNoYWluLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEFwdENvaW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIGFzc2V0SWQ6IHN0cmluZztcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQXB0Q29pbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFzc2V0SWQgPSBvcHRpb25zLmFzc2V0SWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgQXB0IG5ldHdvcmsgc3VwcG9ydHMgbm9uLWZ1bmdpYmxlIHRva2VucyAoRGlnaXRhbCBBc3NldCBTdGFuZGFyZClcbiAqIEV2ZXJ5IE5GVCBiZWxvbmdzIHRvIGFuIE5GVCBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXB0TkZUQ29sbGVjdGlvbiBleHRlbmRzIE5GVENvbGxlY3Rpb25JZERlZmluZWRUb2tlbiB7fVxuXG4vKipcbiAqIFRoZSBWZWNoYWluIG5ldHdvcmsgc3VwcG9ydHMgbm9uLWZ1bmdpYmxlIHRva2Vuc1xuICogRXZlcnkgTkZUIGJlbG9uZ3MgdG8gYW4gTkZUIGNvbGxlY3Rpb24oY29udHJhY3QpLlxuICovXG5leHBvcnQgY2xhc3MgVmV0TkZUQ29sbGVjdGlvbiBleHRlbmRzIE5GVENvbGxlY3Rpb25JZERlZmluZWRUb2tlbiB7XG4gIHB1YmxpYyBnYXNUYW5rVG9rZW4/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTkZUQ29sbGVjdGlvbklkQ29uc3RydWN0b3JPcHRpb25zICYgeyBnYXNUYW5rVG9rZW4/OiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuZ2FzVGFua1Rva2VuID0gb3B0aW9ucy5nYXNUYW5rVG9rZW47XG4gIH1cbn1cblxuLyoqXG4gKiBGaWF0IGN1cnJlbmNpZXMsIHN1Y2ggYXMgVVNELCBFVVIsIG9yIFlFTi5cbiAqL1xuZXhwb3J0IGNsYXNzIEZpYXRDb2luIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRkVBVFVSRVMgPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFU107XG5cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcms6IEJhc2VOZXR3b3JrO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEZpYXRDb2luQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoeyAuLi5vcHRpb25zLCBraW5kOiBDb2luS2luZC5GSUFUIH0pO1xuXG4gICAgdGhpcy5uZXR3b3JrID0gb3B0aW9ucy5uZXR3b3JrO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVkRmVhdHVyZXMoKTogU2V0PENvaW5GZWF0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8Q29pbkZlYXR1cmU+KFtDb2luRmVhdHVyZS5BQ0NPVU5UX01PREVMXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGlzYWxsb3dlZEZlYXR1cmVzKCk6IFNldDxDb2luRmVhdHVyZT4ge1xuICAgIHJldHVybiBuZXcgU2V0PENvaW5GZWF0dXJlPihbQ29pbkZlYXR1cmUuVU5TUEVOVF9NT0RFTF0pO1xuICB9XG59XG5cbi8qKlxuICogVGhlIFN0YWNrcyBuZXR3b3JrIHN1cHBvcnRzIHRva2Vuc1xuICogU3R4IHRva2VucyB3b3JrIHNpbWlsYXIgdG8gbmF0aXZlIFN0eCBjb2luLCBidXQgdGhlIHRva2VuIG5hbWUgaXMgZGV0ZXJtaW5lZCBieVxuICogdGhlIGNvbnRyYWN0TmFtZSBvbiB0aGUgY2hhaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXAxMFRva2VuIGV4dGVuZHMgQWNjb3VudENvaW5Ub2tlbiB7XG4gIHB1YmxpYyBhc3NldElkOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNpcDEwVG9rZW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hc3NldElkID0gb3B0aW9ucy5hc3NldElkO1xuICB9XG59XG5cbi8qKlxuICogVGhlIE5lYXIgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIE5lYXIgdG9rZW5zIHdvcmsgc2ltaWxhciB0byBuYXRpdmUgbmVhciBjb2luXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXAxNDFUb2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBzdG9yYWdlRGVwb3NpdEFtb3VudDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBOZXAxNDFUb2tlbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyYWN0QWRkcmVzcyA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzO1xuICAgIHRoaXMuc3RvcmFnZURlcG9zaXRBbW91bnQgPSBvcHRpb25zLnN0b3JhZ2VEZXBvc2l0QW1vdW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWZXRUb2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBnYXNUYW5rVG9rZW4/OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFZldFRva2VuQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyYWN0QWRkcmVzcyA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzO1xuICAgIHRoaXMuZ2FzVGFua1Rva2VuID0gb3B0aW9ucy5nYXNUYW5rVG9rZW47XG4gIH1cbn1cblxuLyoqXG4gKiBDb3Ntb3MgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIENvc21vcyB0b2tlbnMgd29yayBzaW1pbGFyIHRvIG5hdGl2ZSBjb2lucywgYnV0IHRoZSB0b2tlbiBpcyBkZXRlcm1pbmVkIGJ5XG4gKiB0aGUgZGVub20gb24gY2hhaW4uXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ29zbW9zQ2hhaW5Ub2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgZGVub206IHN0cmluZztcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQ29zbW9zVG9rZW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMuZGVub20gPSBvcHRpb25zLmRlbm9tO1xuICB9XG59XG4vKipcbiAqIFRPTiBzdXBwb3J0cyB0b2tlbnMgYW5kIEpldHRvbiBpcyBhIHRva2VuIHN0YW5kYXJkIG9uIFRPTlxuICogSmV0dG9uIHRva2VucyB3b3JrIHNpbWlsYXIgdG8gbmF0aXZlIFRPTiBjb2luXG4gKi9cbmV4cG9ydCBjbGFzcyBKZXR0b25Ub2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEpldHRvblRva2VuQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyYWN0QWRkcmVzcyA9IG9wdGlvbnMuY29udHJhY3RBZGRyZXNzO1xuICB9XG59XG5cbi8qKlxuICogVGhlIEJpdHRlbnNvciBuZXR3b3JrIHN1cHBvcnRzIHRva2Vuc1xuICogVGhlIHRva2VuIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc3VibmV0SWQgb24gY2hhaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBUYW9Db2luIGV4dGVuZHMgQWNjb3VudENvaW5Ub2tlbiB7XG4gIHB1YmxpYyBzdWJuZXRJZDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUYW9Db2luQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnN1Ym5ldElkID0gb3B0aW9ucy5zdWJuZXRJZDtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBCaXR0ZW5zb3IgbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIFRoZSB0b2tlbiBuYW1lIGlzIGRldGVybWluZWQgYnkgdGhlIHN1Ym5ldElkIG9uIGNoYWluLlxuICovXG5leHBvcnQgY2xhc3MgUG9seXhDb2luIGV4dGVuZHMgQWNjb3VudENvaW5Ub2tlbiB7XG4gIHB1YmxpYyB0aWNrZXI6IHN0cmluZztcbiAgcHVibGljIGFzc2V0SWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQb2x5eENvaW5Db25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMudGlja2VyID0gb3B0aW9ucy50aWNrZXI7XG4gICAgdGhpcy5hc3NldElkID0gb3B0aW9ucy5hc3NldElkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZGFUb2tlbiBleHRlbmRzIEFjY291bnRDb2luVG9rZW4ge1xuICBwdWJsaWMgcG9saWN5SWQ6IHN0cmluZztcbiAgcHVibGljIGFzc2V0TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFkYVRva2VuQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIHRoaXMucG9saWN5SWQgPSBvcHRpb25zLnBvbGljeUlkO1xuICAgIHRoaXMuYXNzZXROYW1lID0gb3B0aW9ucy5hc3NldE5hbWU7XG4gICAgdGhpcy5jb250cmFjdEFkZHJlc3MgPSBvcHRpb25zLmNvbnRyYWN0QWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBjYW50b24gbmV0d29yayBzdXBwb3J0cyB0b2tlbnNcbiAqIENhbnRvbiB0b2tlbnMgd29yayBzaW1pbGFyIHRvIENhbnRvbiBjb2luLFxuICogYnV0IHRoZXkgd2lsbCBoYXZlIHRoZWlyIG93biB0b2tlbiBzdGFuZGFyZCBiYXNlIHVybCBhbmQgaW5zdHJ1bWVudCBhZG1pblxuICovXG5leHBvcnQgY2xhc3MgQ2FudG9uVG9rZW4gZXh0ZW5kcyBBY2NvdW50Q29pblRva2VuIHtcbiAgcHVibGljIGJhc2VVcmw6IHN0cmluZztcbiAgcHVibGljIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDYW50b25Ub2tlbkNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5iYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgIHRoaXMuY29udHJhY3RBZGRyZXNzID0gb3B0aW9ucy5jb250cmFjdEFkZHJlc3M7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgVGVtcG8gbmV0d29yayBzdXBwb3J0cyBUSVAyMCB0b2tlbnNcbiAqIFRJUDIwIHRva2VucyBhcmUgRVJDMjAtY29tcGF0aWJsZSB0b2tlbnMgb24gdGhlIFRlbXBvIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGNsYXNzIFRpcDIwVG9rZW4gZXh0ZW5kcyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUaXAyMFRva2VuQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGFjY291bnQgY29pbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZT8gVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY2NvdW50KFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGJhc2VVbml0OiBCYXNlVW5pdCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIGlzVG9rZW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBBY2NvdW50Q29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBiYXNlVW5pdCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGdhcyB0YW5rIGFjY291bnQgY29pbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGJhc2VVbml0XG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKiBAcGFyYW0gZ2FzVGFua0xvd0JhbGFuY2VBbGVydEZhY3RvciBMb3cgZ2FzIHRhbmsgYmFsYW5jZSBhbGVydCB0aHJlc2hvbGQgPSAoZmVlRXN0aW1hdGUgeCBnYXNUYW5rTG93QmFsYW5jZUFsZXJ0RmFjdG9yKVxuICogQHBhcmFtIGdhc1RhbmtNaW5CYWxhbmNlUmVjb21tZW5kYXRpb25GYWN0b3IgTWluIGdhcyB0YW5rIGJhbGFuY2UgcmVjb21tZW5kYXRpb24gPSAoZmVlRXN0aW1hdGUgeCBnYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yKVxuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbiBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2FzVGFua0FjY291bnQoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmssXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgYmFzZVVuaXQ6IEJhc2VVbml0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azEsXG4gIGdhc1RhbmtMb3dCYWxhbmNlQWxlcnRGYWN0b3IgPSAyLFxuICBnYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yID0gMTAsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgaXNUb2tlbiA9IGZhbHNlLFxuICBnYXNUYW5rVG9rZW4/OiBzdHJpbmdcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgR2FzVGFua0FjY291bnRDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGJhc2VVbml0LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgZ2FzVGFua0xvd0JhbGFuY2VBbGVydEZhY3RvcixcbiAgICAgIGdhc1RhbmtNaW5CYWxhbmNlUmVjb21tZW5kYXRpb25GYWN0b3IsXG4gICAgICBnYXNUYW5rVG9rZW4sXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBldGhMaWtlRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHNcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHNcbiAqIEBwYXJhbSBuZXR3b3JrIE9wdGlvbmFsIHRva2VuIG5ldHdvcmtcbiAqIEBwYXJhbSBjb2luTmFtZXMgVGhlIHBhcmVudCBjb2luIG5hbWVzIGZvciBtYWlubmV0IGFuZCB0ZXN0bmV0XG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIHRva2VuIHByZWZpeFxuICogQHBhcmFtIHN1ZmZpeCBPcHRpb25hbCB0b2tlbiBzdWZmaXhcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcmMyMFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5FSVAxNTU5XSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEV0aExpa2VFUkMyMFRva2VuKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBlcmM3MjEgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBuZXR3b3JrIG5ldHdvcmtcbiAqIEBwYXJhbSBmZWF0dXJlcyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCB0b2tlbiBwcmVmaXhcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4XG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJjNzIxVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5FSVAxNTU5XSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pOiBSZWFkb25seTxFdGhMaWtlRVJDNzIxVG9rZW4+IHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEV0aExpa2VFUkM3MjFUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBkZWNpbWFsUGxhY2VzOiAwLCAvLyBFUkM3MjEgdG9rZW5zIGFyZSBub24tZGl2aXNpYmxlXG4gICAgICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LkVSQzcyMSxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBlcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gRXRoZXJldW0gbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLkJVTEtfVFJBTlNBQ1RJT05dLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLm1haW4uZXRoZXJldW0sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgRXJjMjBDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgS292YW4gdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLkJVTEtfVFJBTlNBQ1RJT05dLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qua292YW5cbikge1xuICByZXR1cm4gZXJjMjAoaWQsIG5hbWUsIGZ1bGxOYW1lLCBkZWNpbWFsUGxhY2VzLCBjb250cmFjdEFkZHJlc3MsIGFzc2V0LCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIEVSQy03OTg0IGNvbmZpZGVudGlhbCB0b2tlbiBpbnN0YW5jZXMgKFphbWEgZmhFVk0pLlxuICpcbiAqIEVSQy03OTg0IHRva2VucyBzdG9yZSBiYWxhbmNlcyBhcyBGSEUtZW5jcnlwdGVkIGNpcGhlcnRleHRzLiBUcmFuc2ZlcnMgdXNlXG4gKiBjb25maWRlbnRpYWxUcmFuc2ZlcigpIGFuZCBiYWxhbmNlIHJlYWRzIHJlcXVpcmUgQUNMIGRlbGVnYXRpb24gdG8gQml0R28uXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlbiAoZS5nLiAnZXRoOmN0a24nKVxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byBFUkM3OTg0X1RPS0VOX0ZFQVRVUkVTXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEV0aGVyZXVtIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcmM3OTg0KFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gRVJDNzk4NF9UT0tFTl9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmV0aGVyZXVtLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEVyYzc5ODRDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IEVSQy03OTg0IGNvbmZpZGVudGlhbCB0b2tlbiBpbnN0YW5jZXMgKFphbWEgZmhFVk0pLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW4gKGUuZy4gJ2h0ZXRoOmN0a24nKVxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byBFUkM3OTg0X1RPS0VOX0ZFQVRVUkVTXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEhvb2RpIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXJjNzk4NChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEVSQzc5ODRfVE9LRU5fRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogRXRoZXJldW1OZXR3b3JrID0gTmV0d29ya3MudGVzdC5ob29kaSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBlcmM3OTg0KFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgYXNzZXQsXG4gICAgZmVhdHVyZXMsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBuZXR3b3JrLFxuICAgIHByaW1hcnlLZXlDdXJ2ZVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGVyYzcyMSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBFdGhlcmV1bSBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJjNzIxKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogRXRoZXJldW1OZXR3b3JrID0gTmV0d29ya3MubWFpbi5ldGhlcmV1bSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBFcmM3MjFDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlczogMCxcbiAgICAgIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQuRVJDNzIxLFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGVyYzcyMSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBIb29kaSB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVyYzcyMShcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLnRlc3QuaG9vZGksXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gZXJjNzIxKGlkLCBuYW1lLCBmdWxsTmFtZSwgY29udHJhY3RBZGRyZXNzLCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmssIHByaW1hcnlLZXlDdXJ2ZSk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uc3RhbmRhcmQgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gRXRoZXJldW0gbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vbnN0YW5kYXJkVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmV0aGVyZXVtLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXM6IDAsXG4gICAgICBhc3NldDogVW5kZXJseWluZ0Fzc2V0Lk5PTlNUQU5EQVJELFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBlcmMxMTU1IHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEV0aGVyZXVtIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcmMxMTU1KFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogRXRoZXJldW1OZXR3b3JrID0gTmV0d29ya3MubWFpbi5ldGhlcmV1bSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBFcmMxMTU1Q29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXM6IDAsXG4gICAgICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LkVSQzExNTUsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgZXJjMTE1NSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBIb29kaSB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVyYzExNTUoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lmhvb2RpLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIGVyYzExNTUoaWQsIG5hbWUsIGZ1bGxOYW1lLCBjb250cmFjdEFkZHJlc3MsIGZlYXR1cmVzLCBwcmVmaXgsIHN1ZmZpeCwgbmV0d29yaywgcHJpbWFyeUtleUN1cnZlKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBFUkMyMC1jb21wYXRpYmxlIGFjY291bnQgY29pbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJjMjBDb21wYXRpYmxlQWNjb3VudENvaW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmV0d29yazogRXRoZXJldW1OZXR3b3JrLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBiYXNlVW5pdDogQmFzZVVuaXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEVyYzIwQ29tcGF0aWJsZUFjY291bnRDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogZmFsc2UsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNlbG8gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW5cbiAqIEBwYXJhbSBwcmVmaXggPyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeCA/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrID8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gQ0VMTyBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXMgPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGV4Y2x1ZGluZyBDVVNUT0RZIGZlYXR1cmVcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBDRUxPX1RPS0VOX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLm1haW4uY2VsbyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBDZWxvQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBjZWxvIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGZlYXR1cmVzID8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBleGNsdWRpbmcgQ1VTVE9EWSBmZWF0dXJlXG4gKiBAcGFyYW0gcHJlZml4ID8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggPyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yayA/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IENFTE8gbmV0d29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRjZWxvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBDRUxPX1RPS0VOX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLnRlc3QuY2Vsb1xuKSB7XG4gIHJldHVybiBjZWxvVG9rZW4oaWQsIG5hbWUsIGZ1bGxOYW1lLCBkZWNpbWFsUGxhY2VzLCBjb250cmFjdEFkZHJlc3MsIGFzc2V0LCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNlbG8gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEJTQyBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYnNjVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayA9IE5ldHdvcmtzLm1haW4uYnNjLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEJzY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkJTQyxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgYnNjIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgdGVzdG5ldCBCU0MgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRic2NUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogRXRoZXJldW1OZXR3b3JrID0gTmV0d29ya3MudGVzdC5ic2Ncbikge1xuICByZXR1cm4gYnNjVG9rZW4oaWQsIG5hbWUsIGZ1bGxOYW1lLCBkZWNpbWFsUGxhY2VzLCBjb250cmFjdEFkZHJlc3MsIGFzc2V0LCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIFN0ZWxsYXIgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBkb21haW4gRG9tYWluIG9mIHRoZSB0b2tlbiBpc3N1ZXIgKHVzZWQgdG8gYWNjZXNzIHRva2VuIGluZm9ybWF0aW9uIGZyb20gdGhlIGlzc3VlcidzIHN0ZWxsYXIudG9tbCBmaWxlKVxuICogU2VlIGh0dHBzOi8vd3d3LnN0ZWxsYXIub3JnL2RldmVsb3BlcnMvZ3VpZGVzL2NvbmNlcHRzL3N0ZWxsYXItdG9tbC5odG1sXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFN0ZWxsYXIgbWFpbm5ldC5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVsbGFyVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBkb21haW4gPSAnJyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5zdGVsbGFyLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBTdGVsbGFyQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGRvbWFpbixcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgbmV0d29yayxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuWExNLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBTdGVsbGFyIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZG9tYWluIERvbWFpbiBvZiB0aGUgdG9rZW4gaXNzdWVyICh1c2VkIHRvIGFjY2VzcyB0b2tlbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpc3N1ZXIncyBzdGVsbGFyLnRvbWwgZmlsZSlcbiAqIFNlZSBodHRwczovL3d3dy5zdGVsbGFyLm9yZy9kZXZlbG9wZXJzL2d1aWRlcy9jb25jZXB0cy9zdGVsbGFyLXRvbWwuaHRtbFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBTdGVsbGFyIHRlc3RuZXQuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c3RlbGxhclRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZG9tYWluID0gJycsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3Quc3RlbGxhclxuKSB7XG4gIHJldHVybiBzdGVsbGFyVG9rZW4oaWQsIG5hbWUsIGZ1bGxOYW1lLCBkZWNpbWFsUGxhY2VzLCBhc3NldCwgZG9tYWluLCBmZWF0dXJlcywgcHJlZml4LCBzdWZmaXgsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRyb24gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFRST04gbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyb25Ub2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogVHJvbk5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLnRyeCxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBUcm9uRXJjMjBDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5UUlgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IHRyb24gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IFRST04gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0dHJvblRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBUcm9uTmV0d29yayA9IE5ldHdvcmtzLnRlc3QudHJ4LFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIHRyb25Ub2tlbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBIZWRlcmEgY29pbiBpbnN0YW5jZXNcbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBub2RlQWNjb3VudElkIG5vZGUgYWNjb3VudCBJZCBmcm9tIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHNlbnRcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gSGVkZXJhIG1haW5uZXQuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGVkZXJhQ29pbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgSGVkZXJhQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIG5vZGVBY2NvdW50SWQ6IEhFREVSQV9OT0RFX0FDQ0NPVU5UX0lELFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBuZXR3b3JrLFxuICAgICAgaXNUb2tlbjogZmFsc2UsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuSEJBUixcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIEhlZGVyYSB0b2tlbiBpbnN0YW5jZXNcbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBub2RlQWNjb3VudElkIG5vZGUgYWNjb3VudCBJZCBmcm9tIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHNlbnRcbiAqIEBwYXJhbSB0b2tlbklkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlbiwgc2FtZSBhcyB0b2tlbklkXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEhlZGVyYSBtYWlubmV0LlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlZGVyYVRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgSGVkZXJhVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBub2RlQWNjb3VudElkOiBIRURFUkFfTk9ERV9BQ0NDT1VOVF9JRCxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgbmV0d29yayxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuSEJBUixcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIEFMR08gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cblxuICogQHBhcmFtIGFsaWFzIChvcHRpb25hbCkgYWx0ZXJuYXRpdmUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyN1cmxcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gQUxHTyBtYWlubmV0LlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsZ29Ub2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uYWxnb3JhbmQsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pOiBSZWFkb25seTxBbGdvQ29pbj4ge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgQWxnb0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgYWxpYXMsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgbmV0d29yayxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuQUxHTyxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgQUxHTyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGFsaWFzIChvcHRpb25hbCkgYWx0ZXJuYXRpdmUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyN1cmxcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gQWxnbyB0ZXN0bmV0LlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFsZ29Ub2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QuYWxnb3JhbmRcbik6IFJlYWRvbmx5PEFsZ29Db2luPiB7XG4gIHJldHVybiBhbGdvVG9rZW4oaWQsIG5hbWUsIGFsaWFzLCBmdWxsTmFtZSwgZGVjaW1hbFBsYWNlcywgYXNzZXQsIGZlYXR1cmVzLCBwcmVmaXgsIHN1ZmZpeCwgbmV0d29yayk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgZW9zIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3ROYW1lIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gRU9TIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlb3NUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIHN5bWJvbD86IHN0cmluZyxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmVvcyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBFb3NDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0TmFtZSxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FT1MsXG4gICAgICBzeW1ib2wsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGVvcyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0TmFtZSBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIHN5bWJvbD8gdG9rZW4gc3ltYm9sIGFzIGRlZmluZWQgaW4gdG9rZW4gY29udHJhY3QuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIHRlc3RuZXQgRU9TIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW9zVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdE5hbWU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBzeW1ib2w/OiBzdHJpbmcsXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5lb3Ncbikge1xuICByZXR1cm4gZW9zVG9rZW4oXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIGNvbnRyYWN0TmFtZSxcbiAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgYXNzZXQsXG4gICAgZmVhdHVyZXMsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBzeW1ib2wsXG4gICAgbmV0d29ya1xuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHNvbCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUb2tlbiBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFNPTCBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgYW5kIFJFUVVJUkVTX1JFU0VSVkUgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gc29sVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICB0b2tlbkFkZHJlc3M6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLlJFUVVJUkVTX1JFU0VSVkVdLFxuICBwcm9ncmFtSWQ6IFByb2dyYW1JRCA9IFByb2dyYW1JRC5Ub2tlblByb2dyYW1JZCxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uc29sLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBTb2xDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJvZ3JhbUlkLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5TT0wsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IHNvbGFuYSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUb2tlbiBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIHRlc3RuZXQgU29sYW5hIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgYW5kIFJFUVVJUkVTX1JFU0VSVkUgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c29sVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICB0b2tlbkFkZHJlc3M6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLlJFUVVJUkVTX1JFU0VSVkVdLFxuICBwcm9ncmFtSWQgPSBQcm9ncmFtSUQuVG9rZW5Qcm9ncmFtSWQsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnNvbFxuKSB7XG4gIHJldHVybiBzb2xUb2tlbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgdG9rZW5BZGRyZXNzLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcm9ncmFtSWQsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBuZXR3b3JrXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgcHJvZCBjYXJkYW5vIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBwb2xpY3lJZCBQb2xpY3kgSWRcbiAqIEBwYXJhbSBhc3NldE5hbWUgQXNzZXQgbmFtZSAtPiBQb2xpY3kgSUQgKyBBc3NldCBuYW1lIGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllclxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBGaW5nZXJwcmludCBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IENhcmRhbm8gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBhbmQgUkVRVUlSRVNfUkVTRVJWRSBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIHBvbGljeUlkOiBzdHJpbmcsXG4gIGFzc2V0TmFtZTogc3RyaW5nLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUywgQ29pbkZlYXR1cmUuUkVRVUlSRVNfUkVTRVJWRV0sXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmFkYSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgQWRhVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcG9saWN5SWQsXG4gICAgICBhc3NldE5hbWUsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuQURBLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBjYXJkYW5vIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBwb2xpY3lJZCBQb2xpY3kgSWRcbiAqIEBwYXJhbSBhc3NldE5hbWUgQXNzZXQgbmFtZSAtPiBQb2xpY3kgSUQgKyBBc3NldCBuYW1lIGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllclxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBGaW5nZXJwcmludCBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IENhcmRhbm8gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBhbmQgUkVRVUlSRVNfUkVTRVJWRSBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZGFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIHBvbGljeUlkOiBzdHJpbmcsXG4gIGFzc2V0TmFtZTogc3RyaW5nLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUywgQ29pbkZlYXR1cmUuUkVRVUlSRVNfUkVTRVJWRV0sXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5hZGEsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKVxuKSB7XG4gIHJldHVybiBhZGFUb2tlbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgcG9saWN5SWQsXG4gICAgYXNzZXROYW1lLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmtcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBhdmF4RXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIEF2YWxhbmNoZUMgbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF2YXhFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmF2YWxhbmNoZUMsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgQXZheEVSQzIwVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgYXZheEVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgQXZhbGFuY2hlQyB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGF2YXhFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LmF2YWxhbmNoZUMsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gYXZheEVyYzIwKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgYXNzZXQsXG4gICAgZmVhdHVyZXMsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBuZXR3b3JrLFxuICAgIHByaW1hcnlLZXlDdXJ2ZVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHBvbHlnb25FcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gUG9seWdvbiBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbkVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLkVJUDE1NTldLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5wb2x5Z29uLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IFBvbHlnb25FUkMyMFRva2VuKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBBbW95IHRlc3RuZXQgcG9seWdvbkVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgUG9seWdvbiB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdHBvbHlnb25FcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnBvbHlnb24sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gcG9seWdvbkVyYzIwKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgYXNzZXQsXG4gICAgZmVhdHVyZXMsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBuZXR3b3JrLFxuICAgIHByaW1hcnlLZXlDdXJ2ZVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGFyYmV0aEVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBBcmJpdHJ1bSBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJiZXRoRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUywgQ29pbkZlYXR1cmUuRUlQMTU1OV0sXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmFyYml0cnVtLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEFyYmV0aEVSQzIwVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIEFyYml0cnVtIFNlcG9saWEgdGVzdG5ldCBhcmJldGhFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIEFyYml0cnVtIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXJiZXRoRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5hcmJpdHJ1bSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBhcmJldGhFcmMyMChcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBvcGV0aEVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBPcHRpbWlzbSBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BldGhFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5FSVAxNTU5LCBDb2luRmVhdHVyZS5CVUxLX1RSQU5TQUNUSU9OXSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4ub3B0aW1pc20sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT3BldGhFUkMyMFRva2VuKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBPcHRpbWlzbSBTZXBvbGlhIHRlc3RuZXQgb3BldGhFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIE9wdGltaXNtIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3BldGhFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5CVUxLX1RSQU5TQUNUSU9OXSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub3B0aW1pc20sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gb3BldGhFcmMyMChcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB6a2V0aEVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB6a1N5bmMgbWFpbm5ldCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHprZXRoRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi56a1N5bmMsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgWmtldGhFUkMyMFRva2VuKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB6a1N5bmMgU2Vwb2xpYSB0ZXN0bmV0IHprZXRoRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB6a1N5bmMgc2Vwb2xpYSB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdHprZXRoRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC56a1N5bmMsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gemtldGhFcmMyMChcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBiZXJhRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIGJlcmEgbWFpbm5ldCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlcmFFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5FSVAxNTU5XSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uYmVyYSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBCZXJhRVJDMjBUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgemtTeW5jIFNlcG9saWEgdGVzdG5ldCBiZXJhRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSBiZXJhIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YmVyYUVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QuYmVyYSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBiZXJhRXJjMjAoXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgQ29yZWRhb0VyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBjb3JlZGFvIG1haW5uZXQgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3JlZGFvRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUywgQ29pbkZlYXR1cmUuRUlQMTU1OV0sXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLmNvcmVkYW8sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgQ29yZWRhb0VSQzIwVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNvcmVkYW8gdGVzdG5ldCBjb3JlZGFvRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSBjb3JlZGFvIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0Y29yZWRhb0VyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QuY29yZWRhbyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBjb3JlZGFvRXJjMjAoXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgV29ybGRFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gV29ybGQgQ2hhaW4gbWFpbm5ldCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmxkRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUywgQ29pbkZlYXR1cmUuRUlQMTU1OV0sXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLndvcmxkLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IFdvcmxkRVJDMjBUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igd29ybGQgdGVzdG5ldCB3b3JsZEVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgV29ybGQgQ2hhaW4gdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR3b3JsZEVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3Qud29ybGQsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gd29ybGRFcmMyMChcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBGbHJFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gRmxyIENoYWluIG1haW5uZXQgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHJFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5FSVAxNTU5XSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uZmxyLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEZsckVSQzIwVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIEZsciB0ZXN0bmV0IEZsckVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgRmxyIENoYWluIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZmxyRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5mbHIsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gZmxyRXJjMjAoXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgWGRjRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFhEQyBtYWlubmV0IG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24geGRjRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi54ZGMsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgWGRjRVJDMjBUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgWERDIHRlc3RuZXQgWGRjRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSBYREMgdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR4ZGNFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnhkYyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiB4ZGNFcmMyMChcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBNb25FcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gTW9uIG1haW5uZXQgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb25FcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFsuLi5BY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5FSVAxNTU5XSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4ubW9uLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE1vbkVSQzIwVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIE1vbiB0ZXN0bmV0IE1vbkVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgTW9uIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0bW9uRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5tb24sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gbW9uRXJjMjAoXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgeHJwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gaXNzdWVyQWRkcmVzczogVGhlIGFkZHJlc3Mgb2YgdGhlIGlzc3VlciBvZiB0aGUgdG9rZW4sXG4gKiBAcGFyYW0gY3VycmVuY3lDb2RlIFRoZSB0b2tlbiBzeW1ib2wuIEV4YW1wbGU6IFVTRCwgQlRDLCBFVEgsIGV0Yy5cbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuIGZvcm1lZCB3aXRoIGBpc3N1ZXJBZGRyZXNzOjpjdXJyZW5jeUNvZGVgXG4gKiBAcGFyYW0gZG9tYWluPyB0aGUgZG9tYWluIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIHRva2VuLFxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBDYXJkYW5vIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4cnBUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGlzc3VlckFkZHJlc3M6IHN0cmluZyxcbiAgY3VycmVuY3lDb2RlOiBzdHJpbmcsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBkb21haW4gPSAnJyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi54cnAsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgWHJwQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBpc3N1ZXJBZGRyZXNzLFxuICAgICAgY3VycmVuY3lDb2RlLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgZG9tYWluLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlhSUCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgY2FyZGFubyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGlzc3VlckFkZHJlc3M6IFRoZSBhZGRyZXNzIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIHRva2VuLFxuICogQHBhcmFtIGN1cnJlbmN5Q29kZSBUaGUgdG9rZW4gc3ltYm9sLiBFeGFtcGxlOiBVU0QsIEJUQywgRVRILCBldGMuXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlbiBmb3JtZWQgd2l0aCBgaXNzdWVyQWRkcmVzczo6Y3VycmVuY3lDb2RlYFxuICogQHBhcmFtIGRvbWFpbj8gdGhlIGRvbWFpbiBvZiB0aGUgaXNzdWVyIG9mIHRoZSB0b2tlbixcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIHRlc3RuZXQgQ2FyZGFubyBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHhycFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgaXNzdWVyQWRkcmVzczogc3RyaW5nLFxuICBjdXJyZW5jeUNvZGU6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGRvbWFpbiA9ICcnLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnhycFxuKSB7XG4gIHJldHVybiB4cnBUb2tlbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgaXNzdWVyQWRkcmVzcyxcbiAgICBjdXJyZW5jeUNvZGUsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGRvbWFpbixcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmtcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBtYWlubmV0IFhSUCBNUFQgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW4sIGUuZy4gXCJ4cnA6bXlfbXB0XCJcbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIG1wdElzc3VhbmNlSWQgNDgtY2hhciBoZXggTVBUb2tlbklzc3VhbmNlSURcbiAqIEBwYXJhbSBjYW5UcmFuc2ZlciBpbW11dGFibGUgbHNmTVBUQ2FuVHJhbnNmZXIgZmxhZyBmcm9tIE1QVG9rZW5Jc3N1YW5jZUNyZWF0ZVxuICogQHBhcmFtIGFzc2V0U2NhbGUgaW1tdXRhYmxlIGRpc3BsYXkgZGVjaW1hbCBwbGFjZXMgZnJvbSBNUFRva2VuSXNzdWFuY2VDcmVhdGUgKGFsc28gdXNlZCBhcyBkZWNpbWFsUGxhY2VzKVxuICogQHBhcmFtIGFzc2V0IFVuZGVybHlpbmdBc3NldCBlbnVtIHZhbHVlXG4gKiBAcGFyYW0gZmVhdHVyZXMgT3B0aW9uYWwgY29pbiBmZWF0dXJlc1xuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgbmV0d29yayBvdmVycmlkZSAoZGVmYXVsdHMgdG8gbWFpbm5ldCBYUlApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4cnBNcHRUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBtcHRJc3N1YW5jZUlkOiBzdHJpbmcsXG4gIGNhblRyYW5zZmVyOiBib29sZWFuLFxuICBhc3NldFNjYWxlOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4ueHJwLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IFhycE1wdENvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgbXB0SXNzdWFuY2VJZCxcbiAgICAgIGNhblRyYW5zZmVyLFxuICAgICAgYXNzZXRTY2FsZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlczogYXNzZXRTY2FsZSwgLy8gYXNzZXRTY2FsZSBJUyB0aGUgZGlzcGxheSBkZWNpbWFsIHBsYWNlcyDigJQgc2FtZSBjb25jZXB0IGFzIGRlY2ltYWxQbGFjZXMgZWxzZXdoZXJlXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuWFJQLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBYUlAgTVBUIHRva2VuIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR4cnBNcHRUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBtcHRJc3N1YW5jZUlkOiBzdHJpbmcsXG4gIGNhblRyYW5zZmVyOiBib29sZWFuLFxuICBhc3NldFNjYWxlOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QueHJwXG4pIHtcbiAgcmV0dXJuIHhycE1wdFRva2VuKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgbXB0SXNzdWFuY2VJZCxcbiAgICBjYW5UcmFuc2ZlcixcbiAgICBhc3NldFNjYWxlLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29ya1xuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHN1aSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIHBhY2thZ2VJZCBQYWNrYWdlSWQgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIG1vZHVsZSBUaGUgbW9kdWxlIG9mIHRoZSBwYWNrYWdlIHdpdGggaWQgYHBhY2thZ2VJZGBcbiAqIEBwYXJhbSBzeW1ib2wgSWRlbnRpZmllcyB0aGUgY29pbiBkZWZpbmVkIGluIHRoZSBtb2R1bGUgYG1vZHVsZWAgb2YgdGhlIHBhY2thZ2Ugd2l0aCBpZCBgcGFja2FnZUlkYFxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBDb250cmFjdCBhZGRyZXNzIG9mIHRoaXMgdG9rZW4gZm9ybWVkIHdpdGggYHBhY2thZ2VJZDo6bW9kdWxlOjpzeW1ib2xgXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gU1VJIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWlUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIHBhY2thZ2VJZDogc3RyaW5nLFxuICBtb2R1bGU6IHN0cmluZyxcbiAgc3ltYm9sOiBzdHJpbmcsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLnN1aSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbik6IFJlYWRvbmx5PFN1aUNvaW4+IHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IFN1aUNvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcGFja2FnZUlkLFxuICAgICAgbW9kdWxlLFxuICAgICAgc3ltYm9sLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlNVSSxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgc3VpIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gcGFja2FnZUlkIFBhY2thZ2VJZCBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gbW9kdWxlIFRoZSBtb2R1bGUgb2YgdGhlIHBhY2thZ2Ugd2l0aCBpZCBgcGFja2FnZUlkYFxuICogQHBhcmFtIHN5bWJvbCBJZGVudGlmaWVzIHRoZSBjb2luIGRlZmluZWQgaW4gdGhlIG1vZHVsZSBgbW9kdWxlYCBvZiB0aGUgcGFja2FnZSB3aXRoIGlkIGBwYWNrYWdlSWRgXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlbiBmb3JtZWQgd2l0aCBgcGFja2FnZUlkOjptb2R1bGU6OnN5bWJvbGBcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFU1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBTVUkgdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHN1aVRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgcGFja2FnZUlkOiBzdHJpbmcsXG4gIG1vZHVsZTogc3RyaW5nLFxuICBzeW1ib2w6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3Quc3VpLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKTogUmVhZG9ubHk8U3VpQ29pbj4ge1xuICByZXR1cm4gc3VpVG9rZW4oXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIHBhY2thZ2VJZCxcbiAgICBtb2R1bGUsXG4gICAgc3ltYm9sLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgYXB0IHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXRJZCBBc3NldCBJZCBvZiB0aGlzIHRva2VuIGkuZS4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlbiBmb3IgYWxsIHRva2VucyAtIGZ1bmdpYmxlLCBub24tZnVuZ2libGUgYW5kIGxlZ2FjeVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeCBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yayBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBBUFQgbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzIEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgYW5kIFJFUVVJUkVTX1JFU0VSVkUgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYXB0VG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldElkOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uYXB0LFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBBcHRDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGFzc2V0SWQsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuQVBULFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgQXB0IE5GVCBjb2xsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE5GVCBjb2xsZWN0aW9uXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgTkZUIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSBuZnRDb2xsZWN0aW9uSWQgY29sbGVjdGlvbiBJRCBvZiB0aGUgbm9uLWZ1bmdpYmxlIHRva2VucyAoTkZUcylcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXggT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gQVBUIG1haW4gbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGFuZCBSRVFVSVJFU19SRVNFUlZFIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwdE5GVENvbGxlY3Rpb24oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmZ0Q29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uYXB0LFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBBcHRORlRDb2xsZWN0aW9uKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIG5mdENvbGxlY3Rpb25JZCxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlczogMCxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5BUFQsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGFwdCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0SWQgQXNzZXQgSWQgb2YgdGhpcyB0b2tlbiBpLmUuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW4gZm9yIGFsbCB0b2tlbnMgLSBmdW5naWJsZSwgbm9uLWZ1bmdpYmxlIGFuZCBsZWdhY3lcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXggT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIHRlc3RuZXQgQVBUIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBhbmQgUkVRVUlSRVNfUkVTRVJWRSBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXB0VG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldElkOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QuYXB0LFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBhcHRUb2tlbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgYXNzZXRJZCxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBBcHQgTkZUIGNvbGxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgTkZUIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBORlQgY29sbGVjdGlvblxuICogQHBhcmFtIG5mdENvbGxlY3Rpb25JZCBjb2xsZWN0aW9uIElEIG9mIHRoZSBub24tZnVuZ2libGUgdG9rZW5zIChORlRzKVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeCBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yayBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBBUFQgdGVzdCBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzIEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgYW5kIFJFUVVJUkVTX1JFU0VSVkUgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFwdE5GVENvbGxlY3Rpb24oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmZ0Q29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJ3QnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LmFwdCxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICByZXR1cm4gYXB0TkZUQ29sbGVjdGlvbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIG5mdENvbGxlY3Rpb25JZCxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgZmlhdCBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW4sIHNob3VsZCBzdGFydCB3aXRoICdmaWF0JyBvciAndGZpYXQnIGZvbGxvd2VkIGJ5IHRoZSAzLWNoYXIgSVNPLTQyMTcgYWxwaGFiZXRpY2FsIGNvZGVcbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgRmlhdENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlPyBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWF0KFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBGaWF0Q29pbk5hbWUsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIG5ldHdvcms6IEJhc2VOZXR3b3JrLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gRmlhdENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMSxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBpc1Rva2VuID0gZmFsc2Vcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgRmlhdENvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkZJQVQsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBzaXAxMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0SWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0b2tlbiwgd2hpY2ggaXMgaW4gdGhlIGZvcm0gb2YgY29udHJhY3RBZGRyZXNzLmNvbnRyYWN0TmFtZTo6dG9rZW5OYW1lXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFN0YWNrcyBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lwMTBUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0SWQ6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5zdHgsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgU2lwMTBUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBhc3NldElkLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlNUWCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgc2lwMTAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldElkIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdG9rZW4sIHdoaWNoIGlzIGluIHRoZSBmb3JtIG9mIGNvbnRyYWN0QWRkcmVzcy5jb250cmFjdE5hbWU6OnRva2VuTmFtZVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgdGVzdG5ldCBTdGFja3MgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzaXAxMFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXRJZDogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnN0eFxuKSB7XG4gIHJldHVybiBzaXAxMFRva2VuKGlkLCBuYW1lLCBmdWxsTmFtZSwgZGVjaW1hbFBsYWNlcywgYXNzZXRJZCwgYXNzZXQsIGZlYXR1cmVzLCBwcmVmaXgsIHN1ZmZpeCwgbmV0d29yayk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgbmVwMTQxIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIHN0b3JhZ2VEZXBvc2l0QW1vdW50IHRoZSBkZXBvc2l0IGFtb3VudCBuZWVkZWQgdG8gZ2V0IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNvbnRyYWN0XG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmVmaXggT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gTmVhciBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVwMTQxVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgc3RvcmFnZURlcG9zaXRBbW91bnQ6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi5uZWFyLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBOZXAxNDFUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgc3RvcmFnZURlcG9zaXRBbW91bnQsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5ORUFSLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBuZXAxNDEgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gc3RvcmFnZURlcG9zaXRBbW91bnQgdGhlIGRlcG9zaXQgYW1vdW50IG5lZWRlZCB0byBnZXQgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY29udHJhY3RcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeCBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yayBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgdGVzdG5ldCBOZWFyIG5ldHdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0bmVwMTQxVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgc3RvcmFnZURlcG9zaXRBbW91bnQ6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5uZWFyXG4pIHtcbiAgcmV0dXJuIG5lcDE0MVRva2VuKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgc3RvcmFnZURlcG9zaXRBbW91bnQsXG4gICAgYXNzZXQsXG4gICAgZmVhdHVyZXMsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBuZXR3b3JrXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdmV0IHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGZlYXR1cmVzIEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrIE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIE5lYXIgbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqIEBwYXJhbSBnYXNUYW5rVG9rZW4gcmVwcmVzZW50aW5nIHRoZSB0b2tlbiB3aXRoIHdoaWNoIGdhcyBpcyBwYWlkIG9uIHRoZSBuZXR3b3JrLCBkZWZhdWx0cyB0byAnVkVUOlZUSE8nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXRUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLnZldCxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMSxcbiAgZ2FzVGFua1Rva2VuID0gJ1ZFVDpWVEhPJ1xuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBWZXRUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBhc3NldCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuVkVULFxuICAgICAgZ2FzVGFua1Rva2VuLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCB2ZXQgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmVmaXggT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIHRlc3RuZXQgTmVhciBuZXR3b3JrLlxuICogQHBhcmFtIGdhc1RhbmtUb2tlbiByZXByZXNlbnRpbmcgdGhlIHRva2VuIHdpdGggd2hpY2ggZ2FzIGlzIHBhaWQgb24gdGhlIG5ldHdvcmssIGRlZmF1bHRzIHRvICdUVkVUOlZUSE8nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0dmV0VG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC52ZXQsXG4gIGdhc1RhbmtUb2tlbiA9ICdUVkVUOlZUSE8nIC8vIEZvciB0ZXN0IGVudmlyb25tZW50XG4pIHtcbiAgcmV0dXJuIHZldFRva2VuKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgYXNzZXQsXG4gICAgZmVhdHVyZXMsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBuZXR3b3JrLFxuICAgIEtleUN1cnZlLlNlY3AyNTZrMSxcbiAgICBnYXNUYW5rVG9rZW5cbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBWZXQgTkZUIGNvbGxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgTkZUIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBORlQgY29sbGVjdGlvblxuICogQHBhcmFtIG5mdENvbGxlY3Rpb25JZCBjb2xsZWN0aW9uIElEIG9mIHRoZSBub24tZnVuZ2libGUgdG9rZW5zIChORlRzKVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeCBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yayBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBWRVQgbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIGZlYXR1cmVzIEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgYW5kIFJFUVVJUkVTX1JFU0VSVkUgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICogQHBhcmFtIGdhc1RhbmtUb2tlbiByZXByZXNlbnRpbmcgdGhlIHRva2VuIHdpdGggd2hpY2ggZ2FzIGlzIHBhaWQgb24gdGhlIG5ldHdvcmssIGRlZmF1bHRzIHRvICdWRVQ6VlRITydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZldE5GVENvbGxlY3Rpb24oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmZ0Q29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4udmV0LFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxLFxuICBnYXNUYW5rVG9rZW4gPSAnVkVUOlZUSE8nXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IFZldE5GVENvbGxlY3Rpb24oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgbmZ0Q29sbGVjdGlvbklkLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzOiAwLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlZFVCxcbiAgICAgIGdhc1RhbmtUb2tlbixcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgVmV0IE5GVCBjb2xsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE5GVCBjb2xsZWN0aW9uXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgTkZUIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSBuZnRDb2xsZWN0aW9uSWQgY29sbGVjdGlvbiBJRCBvZiB0aGUgbm9uLWZ1bmdpYmxlIHRva2VucyAoTkZUcylcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBwcmVmaXggT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gVkVUIHRlc3QgbmV0d29yay5cbiAqIEBwYXJhbSBmZWF0dXJlcyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGFuZCBSRVFVSVJFU19SRVNFUlZFIGRlZmluZWQgaW4gYEFjY291bnRDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqIEBwYXJhbSBnYXNUYW5rVG9rZW4gcmVwcmVzZW50aW5nIHRoZSB0b2tlbiB3aXRoIHdoaWNoIGdhcyBpcyBwYWlkIG9uIHRoZSBuZXR3b3JrLCBkZWZhdWx0cyB0byAnVFZFVDpWVEhPJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHZldE5GVENvbGxlY3Rpb24oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgbmZ0Q29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJ3QnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnZldCxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMSxcbiAgZ2FzVGFua1Rva2VuID0gJ1RWRVQ6VlRITydcbikge1xuICByZXR1cm4gdmV0TkZUQ29sbGVjdGlvbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIG5mdENvbGxlY3Rpb25JZCxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlLFxuICAgIGdhc1RhbmtUb2tlblxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIENvc21vcyBjaGFpbiB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVub20gZGVub21pbmF0aW9uIG9mIHRoaXMgdG9rZW4gd2hpY2ggd2lsbCBhY3QgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRva2VuIG9uIGNoYWluXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayAobWFpbm5ldCBvciB0ZXN0bmV0KSBmb3IgdGhpcyB0b2tlblxuICogQHBhcmFtIGJhc2VVbml0IEJhc2UgdW5pdCBvZiB0aGlzIHRva2VuIChuYXRpdmUgYXNzZXQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgQ09TTU9TX1NJREVDSEFJTl9GRUFUVVJFUyBkZWZpbmVkIGluIGBjb2luRmVhdHVyZXMudHNgXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3Ntb3NUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZW5vbTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrLFxuICBiYXNlVW5pdDogQmFzZVVuaXQsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQ09TTU9TX1NJREVDSEFJTl9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IENvc21vc0NoYWluVG9rZW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBkZW5vbSxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmFzZVVuaXQsXG4gICAgICBhc3NldCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRhbyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIHN1Ym5ldElkIFRoZSB1aWQgb2YgdGhlIHN1Ym5ldCB0aGlzIHRva2VuIGJlbG9uZ3MgdG8sIG51bWVyaWNhbCBzdHJpbmdcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFU1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBUQU8gbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhb1Rva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgc3VibmV0SWQ6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi50YW8sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pOiBSZWFkb25seTxUYW9Db2luPiB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBUYW9Db2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHN1Ym5ldElkLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgYXNzZXQsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlRBTyxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgdGFvIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gc3VibmV0SWQgVGhlIHVpZCBvZiB0aGUgc3VibmV0IHRoaXMgdG9rZW4gYmVsb25ncyB0bywgbnVtZXJpY2FsIHN0cmluZ1xuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcms/IE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFRBTyB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0dGFvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBzdWJuZXRJZDogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0LnRhbyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbik6IFJlYWRvbmx5PFRhb0NvaW4+IHtcbiAgcmV0dXJuIHRhb1Rva2VuKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBzdWJuZXRJZCxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgcG9seXggdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBzdWJuZXRJZCBUaGUgdWlkIG9mIHRoZSBzdWJuZXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvLCBudW1lcmljYWwgc3RyaW5nXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yaz8gT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gUG9seXggbWFpbiBuZXR3b3JrLlxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbHl4VG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICB0aWNrZXI6IHN0cmluZyxcbiAgYXNzZXRJZDogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogQWNjb3VudE5ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLnBvbHl4LFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKTogUmVhZG9ubHk8UG9seXhDb2luPiB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBQb2x5eENvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgdGlja2VyLFxuICAgICAgYXNzZXRJZCxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5QT0xZWCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgcG9seXggdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSB0aWNrZXIgVGhlIHRpY2tlciBzeW1ib2wgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gYXNzZXRJZCBUaGUgdW5pcXVlIGFzc2V0IGlkZW50aWZpZXIgZm9yIHRoaXMgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFU1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrPyBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byBQb2x5eCB0ZXN0IG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cG9seXhUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIHRpY2tlcjogc3RyaW5nLFxuICBhc3NldElkOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QucG9seXgsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pOiBSZWFkb25seTxQb2x5eENvaW4+IHtcbiAgcmV0dXJuIHBvbHl4VG9rZW4oXG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICBmdWxsTmFtZSxcbiAgICBkZWNpbWFsUGxhY2VzLFxuICAgIHRpY2tlcixcbiAgICBhc3NldElkLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBKZXR0b24gdG9rZW4gaW5zdGFuY2VzLlxuICogSmV0dG9uIGlzIHRoZSB0b2tlbiBzdGFuZGFyZCBvbiBUT04gYmxvY2tjaGFpbi5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIENvbnRyYWN0IGFkZHJlc3Mgb2YgdGhpcyB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGZlYXR1cmVzIEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgQWNjb3VudENvaW5gXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrIE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIFRPTiBtYWluIG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gamV0dG9uVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MubWFpbi50b24sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IEpldHRvblRva2VuKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgaXNUb2tlbjogdHJ1ZSxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5UT04sXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IGpldHRvbiB0b2tlbiBpbnN0YW5jZXMuXG4gKiBKZXR0b24gaXMgdGhlIHRva2VuIHN0YW5kYXJkIG9uIFRPTiBibG9ja2NoYWluLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgQ29udHJhY3QgYWRkcmVzcyBvZiB0aGlzIHRva2VuXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBBY2NvdW50Q29pbmBcbiAqIEBwYXJhbSBwcmVmaXggT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIHRlc3RuZXQgVE9OIG5ldHdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0amV0dG9uVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC50b24sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pIHtcbiAgcmV0dXJuIGpldHRvblRva2VuKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgYXNzZXQsXG4gICAgZmVhdHVyZXMsXG4gICAgcHJlZml4LFxuICAgIHN1ZmZpeCxcbiAgICBuZXR3b3JrLFxuICAgIHByaW1hcnlLZXlDdXJ2ZVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHByb2QgY2FudG9uIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgdG9rZW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBiYXNlVXJsIHRva2VuIHN0YW5kYXJkIGJhc2UgdXJsLCByZWY6IGh0dHBzOi8vZG9jcy5kaWdpdGFsYXNzZXQuY29tL3V0aWxpdGllcy9kZXZuZXQvb3ZlcnZpZXcvcmVnaXN0cnktdXNlci1ndWlkZS90b2tlbi1zdGFuZGFyZC5odG1sI3Rva2VuLXN0YW5kYXJkLWVuZHBvaW50c1xuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdG9rZW4gaW4gdGhlIGZvcm0gYGluc3RydW1lbnRBZG1pbjppbnN0cnVtZW50SWRgXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byBDQU5UT05fRkVBVFVSRVNcbiAqIEBwYXJhbSBwcmVmaXggT3B0aW9uYWwgdG9rZW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgdG9rZW4gc3VmZml4LiBEZWZhdWx0cyB0byB0b2tlbiBuYW1lLlxuICogQHBhcmFtIG5ldHdvcmsgT3B0aW9uYWwgdG9rZW4gbmV0d29yay4gRGVmYXVsdHMgdG8gdGhlIG1haW5uZXQgY2FudG9uIG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FudG9uVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBiYXNlVXJsOiBzdHJpbmcsXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IENBTlRPTl9UT0tFTl9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4uY2FudG9uLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuRWQyNTUxOVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBDYW50b25Ub2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmFzZVVybCxcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIGFzc2V0LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBpc1Rva2VuOiB0cnVlLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkNBTlRPTixcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgY2FudG9uIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYmFzZVVybCB0b2tlbiBzdGFuZGFyZCBiYXNlIHVybFxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdG9rZW4gaW4gdGhlIGZvcm0gYGluc3RydW1lbnRBZG1pbjppbnN0cnVtZW50SWRgXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgQ0FOVE9OX0ZFQVRVUkVTXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrIE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IENhbnRvbiBuZXR3b3JrLlxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRjYW50b25Ub2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGJhc2VVcmw6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gQ0FOVE9OX1RPS0VOX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IEFjY291bnROZXR3b3JrID0gTmV0d29ya3MudGVzdC5jYW50b24sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pIHtcbiAgcmV0dXJuIGNhbnRvblRva2VuKFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZnVsbE5hbWUsXG4gICAgZGVjaW1hbFBsYWNlcyxcbiAgICBiYXNlVXJsLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBhc3NldCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgcHJpbWFyeUtleUN1cnZlXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgVElQMjAgdG9rZW4gaW5zdGFuY2VzIG9uIFRlbXBvIG5ldHdvcmsuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyB0b2tlbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBURU1QT19GRUFUVVJFU1xuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCB0b2tlbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeCBPcHRpb25hbCB0b2tlbiBzdWZmaXguIERlZmF1bHRzIHRvIHRva2VuIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yayBPcHRpb25hbCB0b2tlbiBuZXR3b3JrLiBEZWZhdWx0cyB0byB0aGUgbWFpbm5ldCBUZW1wbyBuZXR3b3JrLlxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpcDIwVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBURU1QT19GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLm1haW4udGVtcG8sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgVGlwMjBUb2tlbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBuZXR3b3JrLFxuICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgYXNzZXQsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGlzVG9rZW46IHRydWUsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBUSVAyMCB0b2tlbiBpbnN0YW5jZXMgb24gVGVtcG8gbmV0d29yay5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIHRva2VuIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGZlYXR1cmVzIEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIFRFTVBPX0ZFQVRVUkVTXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIHRva2VuIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIHRva2VuIHN1ZmZpeC4gRGVmYXVsdHMgdG8gdG9rZW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrIE9wdGlvbmFsIHRva2VuIG5ldHdvcmsuIERlZmF1bHRzIHRvIHRoZSB0ZXN0bmV0IFRlbXBvIG5ldHdvcmsuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdHRpcDIwVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBURU1QT19GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBBY2NvdW50TmV0d29yayA9IE5ldHdvcmtzLnRlc3QudGVtcG8sXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gdGlwMjBUb2tlbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgY29udHJhY3RBZGRyZXNzLFxuICAgIGFzc2V0LFxuICAgIGZlYXR1cmVzLFxuICAgIHByZWZpeCxcbiAgICBzdWZmaXgsXG4gICAgbmV0d29yayxcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cbiJdfQ==
|