@bitgo-beta/statics 15.1.1-beta.134 → 15.1.1-beta.1340

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.
Files changed (105) hide show
  1. package/dist/src/account.d.ts +897 -73
  2. package/dist/src/account.d.ts.map +1 -1
  3. package/dist/src/account.js +1407 -149
  4. package/dist/src/ada.d.ts.map +1 -1
  5. package/dist/src/ada.js +7 -3
  6. package/dist/src/allCoinsAndTokens.d.ts +2 -0
  7. package/dist/src/allCoinsAndTokens.d.ts.map +1 -0
  8. package/dist/src/allCoinsAndTokens.js +906 -0
  9. package/dist/src/avaxp.d.ts.map +1 -1
  10. package/dist/src/avaxp.js +8 -3
  11. package/dist/src/base.d.ts +1904 -46
  12. package/dist/src/base.d.ts.map +1 -1
  13. package/dist/src/base.js +1987 -57
  14. package/dist/src/canton.d.ts +34 -0
  15. package/dist/src/canton.d.ts.map +1 -0
  16. package/dist/src/canton.js +51 -0
  17. package/dist/src/coinFeatures.d.ts +109 -0
  18. package/dist/src/coinFeatures.d.ts.map +1 -0
  19. package/dist/src/coinFeatures.js +657 -0
  20. package/dist/src/coins/adaTokens.d.ts +2 -0
  21. package/dist/src/coins/adaTokens.d.ts.map +1 -0
  22. package/dist/src/coins/adaTokens.js +17 -0
  23. package/dist/src/coins/avaxTokens.d.ts +2 -0
  24. package/dist/src/coins/avaxTokens.d.ts.map +1 -0
  25. package/dist/src/coins/avaxTokens.js +125 -0
  26. package/dist/src/coins/botOfcTokens.d.ts +2 -0
  27. package/dist/src/coins/botOfcTokens.d.ts.map +1 -0
  28. package/dist/src/coins/botOfcTokens.js +5 -0
  29. package/dist/src/coins/botTokens.d.ts +3 -0
  30. package/dist/src/coins/botTokens.d.ts.map +1 -0
  31. package/dist/src/coins/botTokens.js +43 -0
  32. package/dist/src/coins/bscTokens.d.ts +2 -0
  33. package/dist/src/coins/bscTokens.d.ts.map +1 -0
  34. package/dist/src/coins/bscTokens.js +186 -0
  35. package/dist/src/coins/cosmosTokens.d.ts +2 -0
  36. package/dist/src/coins/cosmosTokens.d.ts.map +1 -0
  37. package/dist/src/coins/cosmosTokens.js +12 -0
  38. package/dist/src/coins/erc20Coins.d.ts +2 -0
  39. package/dist/src/coins/erc20Coins.d.ts.map +1 -0
  40. package/dist/src/coins/erc20Coins.js +1932 -0
  41. package/dist/src/coins/jettonTokens.d.ts +2 -0
  42. package/dist/src/coins/jettonTokens.d.ts.map +1 -0
  43. package/dist/src/coins/jettonTokens.js +13 -0
  44. package/dist/src/coins/nep141Tokens.d.ts +2 -0
  45. package/dist/src/coins/nep141Tokens.d.ts.map +1 -0
  46. package/dist/src/coins/nep141Tokens.js +16 -0
  47. package/dist/src/coins/ofcCoins.d.ts +2 -0
  48. package/dist/src/coins/ofcCoins.d.ts.map +1 -0
  49. package/dist/src/coins/ofcCoins.js +739 -0
  50. package/dist/src/coins/ofcErc20Coins.d.ts +3 -0
  51. package/dist/src/coins/ofcErc20Coins.d.ts.map +1 -0
  52. package/dist/src/coins/ofcErc20Coins.js +1587 -0
  53. package/dist/src/coins/polygonTokens.d.ts +2 -0
  54. package/dist/src/coins/polygonTokens.d.ts.map +1 -0
  55. package/dist/src/coins/polygonTokens.js +157 -0
  56. package/dist/src/coins/polyxTokens.d.ts +2 -0
  57. package/dist/src/coins/polyxTokens.d.ts.map +1 -0
  58. package/dist/src/coins/polyxTokens.js +21 -0
  59. package/dist/src/coins/sip10Tokens.d.ts +2 -0
  60. package/dist/src/coins/sip10Tokens.d.ts.map +1 -0
  61. package/dist/src/coins/sip10Tokens.js +25 -0
  62. package/dist/src/coins/solTokens.d.ts +3 -0
  63. package/dist/src/coins/solTokens.d.ts.map +1 -0
  64. package/dist/src/coins/solTokens.js +406 -0
  65. package/dist/src/coins/vetTokens.d.ts +2 -0
  66. package/dist/src/coins/vetTokens.d.ts.map +1 -0
  67. package/dist/src/coins/vetTokens.js +11 -0
  68. package/dist/src/coins.d.ts +11 -1
  69. package/dist/src/coins.d.ts.map +1 -1
  70. package/dist/src/coins.js +330 -1616
  71. package/dist/src/constants.d.ts +1 -0
  72. package/dist/src/constants.d.ts.map +1 -1
  73. package/dist/src/constants.js +3 -2
  74. package/dist/src/flrp.d.ts +40 -0
  75. package/dist/src/flrp.d.ts.map +1 -0
  76. package/dist/src/flrp.js +65 -0
  77. package/dist/src/index.d.ts +3 -1
  78. package/dist/src/index.d.ts.map +1 -1
  79. package/dist/src/index.js +26 -3
  80. package/dist/src/lightning.d.ts +43 -0
  81. package/dist/src/lightning.d.ts.map +1 -0
  82. package/dist/src/lightning.js +60 -0
  83. package/dist/src/map.d.ts +10 -0
  84. package/dist/src/map.d.ts.map +1 -1
  85. package/dist/src/map.js +144 -17
  86. package/dist/src/networkFeatureMapForTokens.d.ts +3 -0
  87. package/dist/src/networkFeatureMapForTokens.d.ts.map +1 -0
  88. package/dist/src/networkFeatureMapForTokens.js +31 -0
  89. package/dist/src/networks.d.ts +1206 -9
  90. package/dist/src/networks.d.ts.map +1 -1
  91. package/dist/src/networks.js +1524 -74
  92. package/dist/src/ofc.d.ts +563 -3
  93. package/dist/src/ofc.d.ts.map +1 -1
  94. package/dist/src/ofc.js +1341 -28
  95. package/dist/src/tokenConfig.d.ts +256 -14
  96. package/dist/src/tokenConfig.d.ts.map +1 -1
  97. package/dist/src/tokenConfig.js +954 -244
  98. package/dist/src/utxo.d.ts +3 -1
  99. package/dist/src/utxo.d.ts.map +1 -1
  100. package/dist/src/utxo.js +84 -3
  101. package/dist/tsconfig.tsbuildinfo +1 -1
  102. package/package.json +6 -3
  103. package/.mocharc.js +0 -10
  104. package/.prettierignore +0 -2
  105. package/CHANGELOG.md +0 -838
package/dist/src/ofc.js CHANGED
@@ -1,8 +1,86 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tofcHederaToken = exports.ofcHederaToken = exports.tofcAlgoToken = exports.ofcAlgoToken = exports.tofcStellarToken = exports.ofcStellarToken = exports.tofcerc20 = exports.ofcerc20 = exports.tofc = exports.ofc = exports.OfcCoin = void 0;
3
+ exports.OfcCoin = void 0;
4
+ exports.getFilteredFeatures = getFilteredFeatures;
5
+ exports.ofcToken = ofcToken;
6
+ exports.ofc = ofc;
7
+ exports.tofc = tofc;
8
+ exports.ofcerc20 = ofcerc20;
9
+ exports.tofcerc20 = tofcerc20;
10
+ exports.ofcsolToken = ofcsolToken;
11
+ exports.tofcsolToken = tofcsolToken;
12
+ exports.ofcStellarToken = ofcStellarToken;
13
+ exports.tofcStellarToken = tofcStellarToken;
14
+ exports.ofcAlgoToken = ofcAlgoToken;
15
+ exports.tofcAlgoToken = tofcAlgoToken;
16
+ exports.ofcHederaToken = ofcHederaToken;
17
+ exports.tofcHederaToken = tofcHederaToken;
18
+ exports.ofcArbethErc20 = ofcArbethErc20;
19
+ exports.tofcArbethErc20 = tofcArbethErc20;
20
+ exports.ofcAvaxErc20 = ofcAvaxErc20;
21
+ exports.tofcAvaxErc20 = tofcAvaxErc20;
22
+ exports.ofcPolygonErc20 = ofcPolygonErc20;
23
+ exports.tofcPolygonErc20 = tofcPolygonErc20;
24
+ exports.ofcBscToken = ofcBscToken;
25
+ exports.tofcBscToken = tofcBscToken;
26
+ exports.ofcXrpToken = ofcXrpToken;
27
+ exports.tofcXrpToken = tofcXrpToken;
28
+ exports.ofcStxToken = ofcStxToken;
29
+ exports.tofcStxToken = tofcStxToken;
30
+ exports.ofcOpethErc20 = ofcOpethErc20;
31
+ exports.ofcTronToken = ofcTronToken;
32
+ exports.tofcTronToken = tofcTronToken;
33
+ exports.ofcaptToken = ofcaptToken;
34
+ exports.tofcaptToken = tofcaptToken;
35
+ exports.ofcnep141Token = ofcnep141Token;
36
+ exports.tofcnep141Token = tofcnep141Token;
37
+ exports.ofcWorldErc20 = ofcWorldErc20;
38
+ exports.tofcWorldErc20 = tofcWorldErc20;
39
+ exports.ofcCoredaoErc20 = ofcCoredaoErc20;
40
+ exports.tofcCoredaoErc20 = tofcCoredaoErc20;
41
+ exports.ofcVetToken = ofcVetToken;
42
+ exports.tofcVetToken = tofcVetToken;
43
+ exports.ofcHashToken = ofcHashToken;
44
+ exports.tofcHashToken = tofcHashToken;
45
+ exports.ofcTonToken = ofcTonToken;
46
+ exports.tofcTonToken = tofcTonToken;
4
47
  const base_1 = require("./base");
5
48
  const networks_1 = require("./networks");
49
+ const allCoinsAndTokens_1 = require("./allCoinsAndTokens");
50
+ const map_1 = require("./map");
51
+ // Function to get coins map - will be called lazily to avoid circular dependency
52
+ let allCoinsAndTokensMap;
53
+ const getAllCoinsAndTokensMap = () => {
54
+ if (!allCoinsAndTokensMap) {
55
+ allCoinsAndTokensMap = map_1.CoinMap.fromCoins(allCoinsAndTokens_1.allCoinsAndTokens);
56
+ }
57
+ return allCoinsAndTokensMap;
58
+ };
59
+ const DISALLOWED_FEATURES = [
60
+ base_1.CoinFeature.UNSPENT_MODEL,
61
+ base_1.CoinFeature.CHILD_PAYS_FOR_PARENT,
62
+ base_1.CoinFeature.PAYGO,
63
+ base_1.CoinFeature.SUPPORTS_TOKENS,
64
+ // OFC inherits features from the base asset but the features are not always applicable to OFC
65
+ base_1.CoinFeature.SHARED_EVM_SIGNING,
66
+ base_1.CoinFeature.EVM_COMPATIBLE_WP,
67
+ ];
68
+ const REQUIRED_FEATURES = [base_1.CoinFeature.ACCOUNT_MODEL, base_1.CoinFeature.REQUIRES_BIG_NUMBER];
69
+ /**
70
+ * Get filtered features for a coin based on its suffix
71
+ * @param suffix The coin suffix to look up
72
+ * @returns Filtered array of CoinFeatures excluding the ones in the exclude list
73
+ */
74
+ function getFilteredFeatures(suffix) {
75
+ const coinsMap = getAllCoinsAndTokensMap();
76
+ if (coinsMap.has(suffix.toLowerCase())) {
77
+ const filteredFeatures = coinsMap
78
+ .get(suffix.toLowerCase())
79
+ .features.filter((feature) => !DISALLOWED_FEATURES.includes(feature));
80
+ return [...filteredFeatures, ...REQUIRED_FEATURES];
81
+ }
82
+ return [];
83
+ }
6
84
  /**
7
85
  * OFC (off chain) coins. These are virtual coins used to represent off chain assets on the BitGo platform.
8
86
  */
@@ -11,17 +89,13 @@ class OfcCoin extends base_1.BaseCoin {
11
89
  const { addressCoin, ...baseOptions } = options;
12
90
  super(baseOptions);
13
91
  this.addressCoin = addressCoin;
92
+ this.minimumDenomination = Math.pow(10, this.decimalPlaces);
14
93
  }
15
94
  requiredFeatures() {
16
- return new Set([base_1.CoinFeature.ACCOUNT_MODEL, base_1.CoinFeature.REQUIRES_BIG_NUMBER]);
95
+ return new Set(REQUIRED_FEATURES);
17
96
  }
18
97
  disallowedFeatures() {
19
- return new Set([
20
- base_1.CoinFeature.UNSPENT_MODEL,
21
- base_1.CoinFeature.CHILD_PAYS_FOR_PARENT,
22
- base_1.CoinFeature.PAYGO,
23
- base_1.CoinFeature.SUPPORTS_TOKENS,
24
- ]);
98
+ return new Set(DISALLOWED_FEATURES);
25
99
  }
26
100
  }
27
101
  exports.OfcCoin = OfcCoin;
@@ -30,7 +104,50 @@ OfcCoin.DEFAULT_FEATURES = [
30
104
  base_1.CoinFeature.REQUIRES_BIG_NUMBER,
31
105
  base_1.CoinFeature.CUSTODY,
32
106
  base_1.CoinFeature.CUSTODY_BITGO_TRUST,
107
+ base_1.CoinFeature.CUSTODY_BITGO_MENA_FZE,
108
+ base_1.CoinFeature.CUSTODY_BITGO_CUSTODY_MENA_FZE,
109
+ base_1.CoinFeature.CUSTODY_BITGO_INDIA,
33
110
  ];
111
+ /**
112
+ * Function to convert AMS inputs into OFC coin instance.
113
+ *
114
+ * @param id uuid v4
115
+ * @param name unique identifier of the coin
116
+ * @param fullName complete human-readable name of the coin
117
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
118
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
119
+ * @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
120
+ * @param prefix Optional coin prefix. Defaults to empty string
121
+ * @param suffix Optional coin suffix. Defaults to coin name.
122
+ * @param network Network object for this coin
123
+ * @param primaryKeyCurve The elliptic curve for this chain/token
124
+ * @param baseUnit base unit of the token
125
+ * @param isToken Whether or not this account coin is a token of another coin
126
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
127
+ * @returns {Readonly<OfcCoin>} OFC coin instance
128
+ */
129
+ function ofcToken(id, name, fullName, decimalPlaces, asset, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, primaryKeyCurve = base_1.KeyCurve.Secp256k1, baseUnit = base_1.BaseUnit.OFC, isToken = true, kind = base_1.CoinKind.CRYPTO, addressCoin = '') {
130
+ const filteredFeatures = getFilteredFeatures(suffix);
131
+ if (filteredFeatures.length > 0) {
132
+ features = filteredFeatures;
133
+ }
134
+ return Object.freeze(new OfcCoin({
135
+ id,
136
+ name,
137
+ fullName,
138
+ network,
139
+ prefix,
140
+ suffix,
141
+ features,
142
+ decimalPlaces,
143
+ isToken,
144
+ asset,
145
+ kind,
146
+ primaryKeyCurve,
147
+ baseUnit,
148
+ addressCoin,
149
+ }));
150
+ }
34
151
  /**
35
152
  * Factory function for ofc coin instances.
36
153
  *
@@ -50,6 +167,10 @@ OfcCoin.DEFAULT_FEATURES = [
50
167
  function ofc(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true,
51
168
  /** OFC tokens use SECP256K1 under the hood even if the chain doesn't **/
52
169
  primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
170
+ const filteredFeatures = getFilteredFeatures(suffix);
171
+ if (filteredFeatures.length > 0) {
172
+ features = filteredFeatures;
173
+ }
53
174
  return Object.freeze(new OfcCoin({
54
175
  id,
55
176
  name,
@@ -66,7 +187,6 @@ primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
66
187
  baseUnit: base_1.BaseUnit.OFC,
67
188
  }));
68
189
  }
69
- exports.ofc = ofc;
70
190
  /**
71
191
  * Factory function for testnet ofc coin instances.
72
192
  *
@@ -84,6 +204,10 @@ exports.ofc = ofc;
84
204
  * @param primaryKeyCurve The elliptic curve for this chain/token
85
205
  */
86
206
  function tofc(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
207
+ const filteredFeatures = getFilteredFeatures(suffix);
208
+ if (filteredFeatures.length > 0) {
209
+ features = filteredFeatures;
210
+ }
87
211
  return Object.freeze(new OfcCoin({
88
212
  id,
89
213
  name,
@@ -100,24 +224,26 @@ function tofc(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.C
100
224
  baseUnit: base_1.BaseUnit.OFC,
101
225
  }));
102
226
  }
103
- exports.tofc = tofc;
104
227
  /**
105
228
  * Factory function for ofc erc20 coin instances.
106
229
  *
107
230
  * @param id uuid v4
108
231
  * @param name unique identifier of the coin
109
232
  * @param fullName Complete human-readable name of the coin
110
- * @param network Network object for this coin
111
233
  * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
112
234
  * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
113
- * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
114
- * @param prefix? Optional coin prefix. Defaults to empty string
235
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets * @param prefix? Optional coin prefix. Defaults to empty string
115
236
  * @param suffix? Optional coin suffix. Defaults to coin name.
237
+ * @param network Network object for this coin
116
238
  * @param isToken? Whether or not this account coin is a token of another coin
117
239
  * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
118
240
  * @param primaryKeyCurve The elliptic curve for this chain/token
119
241
  */
120
242
  function ofcerc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'eth', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
243
+ const filteredFeatures = getFilteredFeatures(suffix);
244
+ if (filteredFeatures.length > 0) {
245
+ features = filteredFeatures;
246
+ }
121
247
  return Object.freeze(new OfcCoin({
122
248
  id,
123
249
  name,
@@ -135,7 +261,6 @@ function ofcerc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKi
135
261
  baseUnit: base_1.BaseUnit.ETH,
136
262
  }));
137
263
  }
138
- exports.ofcerc20 = ofcerc20;
139
264
  /**
140
265
  * Factory function for testnet ofc erc20 coin instances.
141
266
  *
@@ -153,6 +278,10 @@ exports.ofcerc20 = ofcerc20;
153
278
  * @param primaryKeyCurve The elliptic curve for this chain/token
154
279
  */
155
280
  function tofcerc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'teth', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
281
+ const filteredFeatures = getFilteredFeatures(suffix);
282
+ if (filteredFeatures.length > 0) {
283
+ features = filteredFeatures;
284
+ }
156
285
  return Object.freeze(new OfcCoin({
157
286
  id,
158
287
  name,
@@ -170,7 +299,84 @@ function tofcerc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinK
170
299
  baseUnit: base_1.BaseUnit.ETH,
171
300
  }));
172
301
  }
173
- exports.tofcerc20 = tofcerc20;
302
+ /**
303
+ * Factory function for ofc solana token instances.
304
+ *
305
+ * @param id uuid v4
306
+ * @param name unique identifier of the coin
307
+ * @param fullName Complete human-readable name of the coin
308
+ * @param features
309
+ * @param prefix
310
+ * @param suffix
311
+ * @param network Network object for this coin
312
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
313
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
314
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
315
+ * @param isToken
316
+ * @param addressCoin
317
+ * @param primaryKeyCurve The elliptic curve for this chain/token
318
+ */
319
+ function ofcsolToken(id, name, fullName, decimalPlaces, asset, features = [...OfcCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], kind = base_1.CoinKind.CRYPTO, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'sol', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
320
+ const filteredFeatures = getFilteredFeatures(suffix);
321
+ if (filteredFeatures.length > 0) {
322
+ features = filteredFeatures;
323
+ }
324
+ return Object.freeze(new OfcCoin({
325
+ id,
326
+ name,
327
+ fullName,
328
+ network,
329
+ prefix,
330
+ suffix,
331
+ features,
332
+ decimalPlaces,
333
+ isToken,
334
+ asset,
335
+ kind,
336
+ addressCoin,
337
+ primaryKeyCurve,
338
+ baseUnit: base_1.BaseUnit.SOL,
339
+ }));
340
+ }
341
+ /**
342
+ * Factory function for testnet ofc solana token instances.
343
+ *
344
+ * @param id uuid v4
345
+ * @param name unique identifier of the coin
346
+ * @param fullName Complete human-readable name of the coin
347
+ * @param features
348
+ * @param prefix
349
+ * @param suffix
350
+ * @param network Network object for this coin
351
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
352
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
353
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
354
+ * @param isToken
355
+ * @param addressCoin
356
+ * @param primaryKeyCurve The elliptic curve for this chain/token
357
+ */
358
+ function tofcsolToken(id, name, fullName, decimalPlaces, asset, features = [...OfcCoin.DEFAULT_FEATURES, base_1.CoinFeature.REQUIRES_RESERVE], kind = base_1.CoinKind.CRYPTO, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tsol', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
359
+ const filteredFeatures = getFilteredFeatures(suffix);
360
+ if (filteredFeatures.length > 0) {
361
+ features = filteredFeatures;
362
+ }
363
+ return Object.freeze(new OfcCoin({
364
+ id,
365
+ name,
366
+ fullName,
367
+ network,
368
+ prefix,
369
+ suffix,
370
+ features,
371
+ decimalPlaces,
372
+ isToken,
373
+ asset,
374
+ kind,
375
+ addressCoin,
376
+ primaryKeyCurve,
377
+ baseUnit: base_1.BaseUnit.SOL,
378
+ }));
379
+ }
174
380
  /**
175
381
  * Factory function for ofc stellar token instances.
176
382
  *
@@ -187,7 +393,11 @@ exports.tofcerc20 = tofcerc20;
187
393
  * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
188
394
  * @param primaryKeyCurve The elliptic curve for this chain/token
189
395
  */
190
- function ofcStellarToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'xlm', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
396
+ function ofcStellarToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'xlm', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
397
+ const filteredFeatures = getFilteredFeatures(suffix);
398
+ if (filteredFeatures.length > 0) {
399
+ features = filteredFeatures;
400
+ }
191
401
  return Object.freeze(new OfcCoin({
192
402
  id,
193
403
  name,
@@ -205,7 +415,6 @@ function ofcStellarToken(id, name, fullName, decimalPlaces, asset, kind = base_1
205
415
  baseUnit: base_1.BaseUnit.XLM,
206
416
  }));
207
417
  }
208
- exports.ofcStellarToken = ofcStellarToken;
209
418
  /**
210
419
  * Factory function for testnet ofc stellar token instances.
211
420
  *
@@ -222,7 +431,11 @@ exports.ofcStellarToken = ofcStellarToken;
222
431
  * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
223
432
  * @param primaryKeyCurve The elliptic curve for this chain/token
224
433
  */
225
- function tofcStellarToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'txlm', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
434
+ function tofcStellarToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'txlm', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
435
+ const filteredFeatures = getFilteredFeatures(suffix);
436
+ if (filteredFeatures.length > 0) {
437
+ features = filteredFeatures;
438
+ }
226
439
  return Object.freeze(new OfcCoin({
227
440
  id,
228
441
  name,
@@ -240,7 +453,6 @@ function tofcStellarToken(id, name, fullName, decimalPlaces, asset, kind = base_
240
453
  baseUnit: base_1.BaseUnit.XLM,
241
454
  }));
242
455
  }
243
- exports.tofcStellarToken = tofcStellarToken;
244
456
  /**
245
457
  * Factory function for ofc algo token instances.
246
458
  *
@@ -257,7 +469,11 @@ exports.tofcStellarToken = tofcStellarToken;
257
469
  * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
258
470
  * @param primaryKeyCurve The elliptic curve for this chain/token
259
471
  */
260
- function ofcAlgoToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'algo', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
472
+ function ofcAlgoToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'algo', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
473
+ const filteredFeatures = getFilteredFeatures(suffix);
474
+ if (filteredFeatures.length > 0) {
475
+ features = filteredFeatures;
476
+ }
261
477
  return Object.freeze(new OfcCoin({
262
478
  id,
263
479
  name,
@@ -275,7 +491,6 @@ function ofcAlgoToken(id, name, fullName, decimalPlaces, asset, kind = base_1.Co
275
491
  baseUnit: base_1.BaseUnit.ALGO,
276
492
  }));
277
493
  }
278
- exports.ofcAlgoToken = ofcAlgoToken;
279
494
  /**
280
495
  * Factory function for testnet ofc algo token instances.
281
496
  *
@@ -292,7 +507,11 @@ exports.ofcAlgoToken = ofcAlgoToken;
292
507
  * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
293
508
  * @param primaryKeyCurve The elliptic curve for this chain/token
294
509
  */
295
- function tofcAlgoToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'talgo', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
510
+ function tofcAlgoToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'talgo', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
511
+ const filteredFeatures = getFilteredFeatures(suffix);
512
+ if (filteredFeatures.length > 0) {
513
+ features = filteredFeatures;
514
+ }
296
515
  return Object.freeze(new OfcCoin({
297
516
  id,
298
517
  name,
@@ -310,7 +529,6 @@ function tofcAlgoToken(id, name, fullName, decimalPlaces, asset, kind = base_1.C
310
529
  baseUnit: base_1.BaseUnit.ALGO,
311
530
  }));
312
531
  }
313
- exports.tofcAlgoToken = tofcAlgoToken;
314
532
  /**
315
533
  * Factory function for ofc hedera token instances.
316
534
  *
@@ -327,7 +545,11 @@ exports.tofcAlgoToken = tofcAlgoToken;
327
545
  * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
328
546
  * @param primaryKeyCurve The elliptic curve for this chain/token
329
547
  */
330
- function ofcHederaToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'hbar', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
548
+ function ofcHederaToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'hbar', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
549
+ const filteredFeatures = getFilteredFeatures(suffix);
550
+ if (filteredFeatures.length > 0) {
551
+ features = filteredFeatures;
552
+ }
331
553
  return Object.freeze(new OfcCoin({
332
554
  id,
333
555
  name,
@@ -345,7 +567,6 @@ function ofcHederaToken(id, name, fullName, decimalPlaces, asset, kind = base_1.
345
567
  baseUnit: base_1.BaseUnit.HBAR,
346
568
  }));
347
569
  }
348
- exports.ofcHederaToken = ofcHederaToken;
349
570
  /**
350
571
  * Factory function for testnet ofc hedera token instances.
351
572
  *
@@ -362,7 +583,11 @@ exports.ofcHederaToken = ofcHederaToken;
362
583
  * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
363
584
  * @param primaryKeyCurve The elliptic curve for this chain/token
364
585
  */
365
- function tofcHederaToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'thbar', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
586
+ function tofcHederaToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'thbar', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
587
+ const filteredFeatures = getFilteredFeatures(suffix);
588
+ if (filteredFeatures.length > 0) {
589
+ features = filteredFeatures;
590
+ }
366
591
  return Object.freeze(new OfcCoin({
367
592
  id,
368
593
  name,
@@ -380,5 +605,1093 @@ function tofcHederaToken(id, name, fullName, decimalPlaces, asset, kind = base_1
380
605
  baseUnit: base_1.BaseUnit.HBAR,
381
606
  }));
382
607
  }
383
- exports.tofcHederaToken = tofcHederaToken;
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBOEY7QUFDOUYseUNBQStEO0FBbUIvRDs7R0FFRztBQUNILE1BQWEsT0FBUSxTQUFRLGVBQVE7SUFXbkMsWUFBWSxPQUE4QjtRQUN4QyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLE9BQU8sSUFBSSxHQUFHLENBQWMsQ0FBQyxrQkFBVyxDQUFDLGFBQWEsRUFBRSxrQkFBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sSUFBSSxHQUFHLENBQWM7WUFDMUIsa0JBQVcsQ0FBQyxhQUFhO1lBQ3pCLGtCQUFXLENBQUMscUJBQXFCO1lBQ2pDLGtCQUFXLENBQUMsS0FBSztZQUNqQixrQkFBVyxDQUFDLGVBQWU7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE1QkgsMEJBNkJDO0FBNUJ3Qix3QkFBZ0IsR0FBRztJQUN4QyxrQkFBVyxDQUFDLGFBQWE7SUFDekIsa0JBQVcsQ0FBQyxtQkFBbUI7SUFDL0Isa0JBQVcsQ0FBQyxPQUFPO0lBQ25CLGtCQUFXLENBQUMsbUJBQW1CO0NBQ2hDLENBQUM7QUF5Qko7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsR0FBRyxDQUNqQixFQUFVLEVBQ1YsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLGFBQXFCLEVBQ3JCLEtBQXNCLEVBQ3RCLE9BQWlCLGVBQVEsQ0FBQyxNQUFNLEVBQ2hDLFdBQTBCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFDbEQsTUFBTSxHQUFHLEVBQUUsRUFDWCxTQUFpQixJ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QUFhO1FBQ2IsT0FBTztRQUNQLEtBQUs7UUFDTCxJQUFJO1FBQ0osV0FBVztRQUNYLGVBQWU7UUFDZixRQUFRLEVBQUUsZUFBUSxDQUFDLElBQUk7S0FDeEIsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBakNELDBDQWlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luLCBCYXNlVW5pdCwgQ29pbkZlYXR1cmUsIENvaW5LaW5kLCBLZXlDdXJ2ZSwgVW5kZXJseWluZ0Fzc2V0IH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IEJhc2VOZXR3b3JrLCBOZXR3b3JrcywgT2ZjTmV0d29yayB9IGZyb20gJy4vbmV0d29ya3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9mY0NvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIGlkOiBzdHJpbmc7XG4gIGZ1bGxOYW1lOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbmV0d29yazogQmFzZU5ldHdvcms7XG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQ7XG4gIGJhc2VVbml0OiBCYXNlVW5pdDtcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW107XG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcjtcbiAgaXNUb2tlbjogYm9vbGVhbjtcbiAga2luZDogQ29pbktpbmQ7XG4gIHByZWZpeD86IHN0cmluZztcbiAgc3VmZml4Pzogc3RyaW5nO1xuICBhZGRyZXNzQ29pbj86IHN0cmluZztcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZTtcbn1cblxuLyoqXG4gKiBPRkMgKG9mZiBjaGFpbikgY29pbnMuIFRoZXNlIGFyZSB2aXJ0dWFsIGNvaW5zIHVzZWQgdG8gcmVwcmVzZW50IG9mZiBjaGFpbiBhc3NldHMgb24gdGhlIEJpdEdvIHBsYXRmb3JtLlxuICovXG5leHBvcnQgY2xhc3MgT2ZjQ29pbiBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0ZFQVRVUkVTID0gW1xuICAgIENvaW5GZWF0dXJlLkFDQ09VTlRfTU9ERUwsXG4gICAgQ29pbkZlYXR1cmUuUkVRVUlSRVNfQklHX05VTUJFUixcbiAgICBDb2luRmVhdHVyZS5DVVNUT0RZLFxuICAgIENvaW5GZWF0dXJlLkNVU1RPRFlfQklUR09fVFJVU1QsXG4gIF07XG5cbiAgLy8gSWYgc2V0LCB0aGlzIGNvaW4gaXMgdGhlIG5hdGl2ZSBhZGRyZXNzIGZvcm1hdCBmb3IgdGhpcyB0b2tlbi5cbiAgcHVibGljIHJlYWRvbmx5IGFkZHJlc3NDb2luPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9mY0NvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIGNvbnN0IHsgYWRkcmVzc0NvaW4sIC4uLmJhc2VPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIHN1cGVyKGJhc2VPcHRpb25zKTtcbiAgICB0aGlzLmFkZHJlc3NDb2luID0gYWRkcmVzc0NvaW47XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWlyZWRGZWF0dXJlcygpOiBTZXQ8Q29pbkZlYXR1cmU+IHtcbiAgICByZXR1cm4gbmV3IFNldDxDb2luRmVhdHVyZT4oW0NvaW5GZWF0dXJlLkFDQ09VTlRfTU9ERUwsIENvaW5GZWF0dXJlLlJFUVVJUkVTX0JJR19OVU1CRVJdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNhbGxvd2VkRmVhdHVyZXMoKTogU2V0PENvaW5GZWF0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8Q29pbkZlYXR1cmU+KFtcbiAgICAgIENvaW5GZWF0dXJlLlVOU1BFTlRfTU9ERUwsXG4gICAgICBDb2luRmVhdHVyZS5DSElMRF9QQVlTX0ZPUl9QQVJFTlQsXG4gICAgICBDb2luRmVhdHVyZS5QQVlHTyxcbiAgICAgIENvaW5GZWF0dXJlLlNVUFBPUlRTX1RPS0VOUyxcbiAgICBdKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG9mYyBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gb2ZjKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgLyoqIE9GQyB0b2tlbnMgdXNlIFNFQ1AyNTZLMSB1bmRlciB0aGUgaG9vZCBldmVuIGlmIHRoZSBjaGFpbiBkb2Vzbid0ICoqL1xuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5PRkMsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mYyhcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0Lk9GQyxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG9mYyBlcmMyMCBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gb2ZjZXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICdldGgnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBlcmMyMCBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mY2VyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndGV0aCcsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIHN0ZWxsYXIgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNTdGVsbGFyVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAneGxtJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5YTE0sXG4gICAgfSlcbiAgKTtcbn1cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBvZmMgc3RlbGxhciB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNTdGVsbGFyVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndHhsbScsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuWExNLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIGFsZ28gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNBbGdvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAnYWxnbycsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuQUxHTyxcbiAgICB9KVxuICApO1xufVxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBhbGdvIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mY0FsZ29Ub2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0YWxnbycsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuQUxHTyxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG9mYyBoZWRlcmEgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNIZWRlcmFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICdoYmFyJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5IQkFSLFxuICAgIH0pXG4gICk7XG59XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgb2ZjIGhlZGVyYSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNIZWRlcmFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0aGJhcicsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuSEJBUixcbiAgICB9KVxuICApO1xufVxuIl19
608
+ /**
609
+ * Factory function for ofc arbethErc20 token instances.
610
+ *
611
+ * @param id uuid v4
612
+ * @param name unique identifier of the coin
613
+ * @param fullName Complete human-readable name of the coin
614
+ * @param network Network object for this coin
615
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
616
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
617
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
618
+ * @param prefix? Optional coin prefix. Defaults to empty string
619
+ * @param suffix? Optional coin suffix. Defaults to coin name.
620
+ * @param isToken? Whether or not this account coin is a token of another coin
621
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
622
+ * @param primaryKeyCurve The elliptic curve for this chain/token
623
+ */
624
+ function ofcArbethErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'arbeth', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
625
+ const filteredFeatures = getFilteredFeatures(suffix);
626
+ if (filteredFeatures.length > 0) {
627
+ features = filteredFeatures;
628
+ }
629
+ return Object.freeze(new OfcCoin({
630
+ id,
631
+ name,
632
+ fullName,
633
+ network,
634
+ prefix,
635
+ suffix,
636
+ features,
637
+ decimalPlaces,
638
+ isToken,
639
+ asset,
640
+ kind,
641
+ addressCoin,
642
+ primaryKeyCurve,
643
+ baseUnit: base_1.BaseUnit.ETH,
644
+ }));
645
+ }
646
+ /**
647
+ * Factory function for testnet ofc arbethErc20 token instances.
648
+ *
649
+ * @param id uuid v4
650
+ * @param name unique identifier of the coin
651
+ * @param fullName Complete human-readable name of the coin
652
+ * @param network Network object for this coin
653
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
654
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
655
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
656
+ * @param prefix? Optional coin prefix. Defaults to empty string
657
+ * @param suffix? Optional coin suffix. Defaults to coin name.
658
+ * @param isToken? Whether or not this account coin is a token of another coin
659
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
660
+ * @param primaryKeyCurve The elliptic curve for this chain/token
661
+ */
662
+ function tofcArbethErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tarbeth', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
663
+ const filteredFeatures = getFilteredFeatures(suffix);
664
+ if (filteredFeatures.length > 0) {
665
+ features = filteredFeatures;
666
+ }
667
+ return Object.freeze(new OfcCoin({
668
+ id,
669
+ name,
670
+ fullName,
671
+ network,
672
+ prefix,
673
+ suffix,
674
+ features,
675
+ decimalPlaces,
676
+ isToken,
677
+ asset,
678
+ kind,
679
+ addressCoin,
680
+ primaryKeyCurve,
681
+ baseUnit: base_1.BaseUnit.ETH,
682
+ }));
683
+ }
684
+ /**
685
+ * Factory function for ofc avaxErc20 token instances.
686
+ *
687
+ * @param id uuid v4
688
+ * @param name unique identifier of the coin
689
+ * @param fullName Complete human-readable name of the coin
690
+ * @param network Network object for this coin
691
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
692
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
693
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
694
+ * @param prefix? Optional coin prefix. Defaults to empty string
695
+ * @param suffix? Optional coin suffix. Defaults to coin name.
696
+ * @param isToken? Whether or not this account coin is a token of another coin
697
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
698
+ * @param primaryKeyCurve The elliptic curve for this chain/token
699
+ */
700
+ function ofcAvaxErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'avaxc', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
701
+ const filteredFeatures = getFilteredFeatures(suffix);
702
+ if (filteredFeatures.length > 0) {
703
+ features = filteredFeatures;
704
+ }
705
+ return Object.freeze(new OfcCoin({
706
+ id,
707
+ name,
708
+ fullName,
709
+ network,
710
+ prefix,
711
+ suffix,
712
+ features,
713
+ decimalPlaces,
714
+ isToken,
715
+ asset,
716
+ kind,
717
+ addressCoin,
718
+ primaryKeyCurve,
719
+ baseUnit: base_1.BaseUnit.ETH,
720
+ }));
721
+ }
722
+ /**
723
+ * Factory function for testnet ofc avaxErc20 token instances.
724
+ *
725
+ * @param id uuid v4
726
+ * @param name unique identifier of the coin
727
+ * @param fullName Complete human-readable name of the coin
728
+ * @param network Network object for this coin
729
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
730
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
731
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
732
+ * @param prefix? Optional coin prefix. Defaults to empty string
733
+ * @param suffix? Optional coin suffix. Defaults to coin name.
734
+ * @param isToken? Whether or not this account coin is a token of another coin
735
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
736
+ * @param primaryKeyCurve The elliptic curve for this chain/token
737
+ */
738
+ function tofcAvaxErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tavaxc', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
739
+ const filteredFeatures = getFilteredFeatures(suffix);
740
+ if (filteredFeatures.length > 0) {
741
+ features = filteredFeatures;
742
+ }
743
+ return Object.freeze(new OfcCoin({
744
+ id,
745
+ name,
746
+ fullName,
747
+ network,
748
+ prefix,
749
+ suffix,
750
+ features,
751
+ decimalPlaces,
752
+ isToken,
753
+ asset,
754
+ kind,
755
+ addressCoin,
756
+ primaryKeyCurve,
757
+ baseUnit: base_1.BaseUnit.ETH,
758
+ }));
759
+ }
760
+ /**
761
+ * Factory function for ofc polygonErc20 token instances.
762
+ *
763
+ * @param id uuid v4
764
+ * @param name unique identifier of the coin
765
+ * @param fullName Complete human-readable name of the coin
766
+ * @param network Network object for this coin
767
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
768
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
769
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
770
+ * @param prefix? Optional coin prefix. Defaults to empty string
771
+ * @param suffix? Optional coin suffix. Defaults to coin name.
772
+ * @param isToken? Whether or not this account coin is a token of another coin
773
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
774
+ * @param primaryKeyCurve The elliptic curve for this chain/token
775
+ */
776
+ function ofcPolygonErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'polygon', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
777
+ const filteredFeatures = getFilteredFeatures(suffix);
778
+ if (filteredFeatures.length > 0) {
779
+ features = filteredFeatures;
780
+ }
781
+ return Object.freeze(new OfcCoin({
782
+ id,
783
+ name,
784
+ fullName,
785
+ network,
786
+ prefix,
787
+ suffix,
788
+ features,
789
+ decimalPlaces,
790
+ isToken,
791
+ asset,
792
+ kind,
793
+ addressCoin,
794
+ primaryKeyCurve,
795
+ baseUnit: base_1.BaseUnit.ETH,
796
+ }));
797
+ }
798
+ /**
799
+ * Factory function for testnet ofc polygonErc20 token instances.
800
+ *
801
+ * @param id uuid v4
802
+ * @param name unique identifier of the coin
803
+ * @param fullName Complete human-readable name of the coin
804
+ * @param network Network object for this coin
805
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
806
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
807
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
808
+ * @param prefix? Optional coin prefix. Defaults to empty string
809
+ * @param suffix? Optional coin suffix. Defaults to coin name.
810
+ * @param isToken? Whether or not this account coin is a token of another coin
811
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
812
+ * @param primaryKeyCurve The elliptic curve for this chain/token
813
+ */
814
+ function tofcPolygonErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tpolygon', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
815
+ const filteredFeatures = getFilteredFeatures(suffix);
816
+ if (filteredFeatures.length > 0) {
817
+ features = filteredFeatures;
818
+ }
819
+ return Object.freeze(new OfcCoin({
820
+ id,
821
+ name,
822
+ fullName,
823
+ network,
824
+ prefix,
825
+ suffix,
826
+ features,
827
+ decimalPlaces,
828
+ isToken,
829
+ asset,
830
+ kind,
831
+ addressCoin,
832
+ primaryKeyCurve,
833
+ baseUnit: base_1.BaseUnit.ETH,
834
+ }));
835
+ }
836
+ /**
837
+ * Factory function for ofc bsc token instances.
838
+ *
839
+ * @param id uuid v4
840
+ * @param name unique identifier of the coin
841
+ * @param fullName Complete human-readable name of the coin
842
+ * @param network Network object for this coin
843
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
844
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
845
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
846
+ * @param prefix? Optional coin prefix. Defaults to empty string
847
+ * @param suffix? Optional coin suffix. Defaults to coin name.
848
+ * @param isToken? Whether or not this account coin is a token of another coin
849
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
850
+ * @param primaryKeyCurve The elliptic curve for this chain/token
851
+ */
852
+ function ofcBscToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'bsc', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
853
+ const filteredFeatures = getFilteredFeatures(suffix);
854
+ if (filteredFeatures.length > 0) {
855
+ features = filteredFeatures;
856
+ }
857
+ return Object.freeze(new OfcCoin({
858
+ id,
859
+ name,
860
+ fullName,
861
+ network,
862
+ prefix,
863
+ suffix,
864
+ features,
865
+ decimalPlaces,
866
+ isToken,
867
+ asset,
868
+ kind,
869
+ addressCoin,
870
+ primaryKeyCurve,
871
+ baseUnit: base_1.BaseUnit.BSC,
872
+ }));
873
+ }
874
+ /**
875
+ * Factory function for testnet ofc bsc token instances.
876
+ *
877
+ * @param id uuid v4
878
+ * @param name unique identifier of the coin
879
+ * @param fullName Complete human-readable name of the coin
880
+ * @param network Network object for this coin
881
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
882
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
883
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
884
+ * @param prefix? Optional coin prefix. Defaults to empty string
885
+ * @param suffix? Optional coin suffix. Defaults to coin name.
886
+ * @param isToken? Whether or not this account coin is a token of another coin
887
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
888
+ * @param primaryKeyCurve The elliptic curve for this chain/token
889
+ */
890
+ function tofcBscToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tbsc', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
891
+ const filteredFeatures = getFilteredFeatures(suffix);
892
+ if (filteredFeatures.length > 0) {
893
+ features = filteredFeatures;
894
+ }
895
+ return Object.freeze(new OfcCoin({
896
+ id,
897
+ name,
898
+ fullName,
899
+ network,
900
+ prefix,
901
+ suffix,
902
+ features,
903
+ decimalPlaces,
904
+ isToken,
905
+ asset,
906
+ kind,
907
+ addressCoin,
908
+ primaryKeyCurve,
909
+ baseUnit: base_1.BaseUnit.BSC,
910
+ }));
911
+ }
912
+ /**
913
+ * Factory function for mainnet ofc xrp instances.
914
+ *
915
+ * @param id uuid v4
916
+ * @param name unique identifier of the coin
917
+ * @param fullName Complete human-readable name of the coin
918
+ * @param network Network object for this coin
919
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
920
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
921
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
922
+ * @param prefix? Optional coin prefix. Defaults to empty string
923
+ * @param suffix? Optional coin suffix. Defaults to coin name.
924
+ * @param isToken? Whether or not this account coin is a token of another coin
925
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
926
+ * @param primaryKeyCurve The elliptic curve for this chain/token
927
+ */
928
+ function ofcXrpToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'xrp', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
929
+ const filteredFeatures = getFilteredFeatures(suffix);
930
+ if (filteredFeatures.length > 0) {
931
+ features = filteredFeatures;
932
+ }
933
+ return Object.freeze(new OfcCoin({
934
+ id,
935
+ name,
936
+ fullName,
937
+ network,
938
+ prefix,
939
+ suffix,
940
+ features,
941
+ decimalPlaces,
942
+ isToken,
943
+ asset,
944
+ kind,
945
+ addressCoin,
946
+ primaryKeyCurve,
947
+ baseUnit: base_1.BaseUnit.XRP,
948
+ }));
949
+ }
950
+ /**
951
+ * Factory function for testnet ofc xrp token instances.
952
+ *
953
+ * @param id uuid v4
954
+ * @param name unique identifier of the coin
955
+ * @param fullName Complete human-readable name of the coin
956
+ * @param network Network object for this coin
957
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
958
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
959
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
960
+ * @param prefix? Optional coin prefix. Defaults to empty string
961
+ * @param suffix? Optional coin suffix. Defaults to coin name.
962
+ * @param isToken? Whether or not this account coin is a token of another coin
963
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
964
+ * @param primaryKeyCurve The elliptic curve for this chain/token
965
+ */
966
+ function tofcXrpToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'txrp', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
967
+ const filteredFeatures = getFilteredFeatures(suffix);
968
+ if (filteredFeatures.length > 0) {
969
+ features = filteredFeatures;
970
+ }
971
+ return Object.freeze(new OfcCoin({
972
+ id,
973
+ name,
974
+ fullName,
975
+ network,
976
+ prefix,
977
+ suffix,
978
+ features,
979
+ decimalPlaces,
980
+ isToken,
981
+ asset,
982
+ kind,
983
+ addressCoin,
984
+ primaryKeyCurve,
985
+ baseUnit: base_1.BaseUnit.XRP,
986
+ }));
987
+ }
988
+ /**
989
+ * Factory function for mainnet ofc stx instances.
990
+ *
991
+ * @param id uuid v4
992
+ * @param name unique identifier of the coin
993
+ * @param fullName Complete human-readable name of the coin
994
+ * @param network Network object for this coin
995
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
996
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
997
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
998
+ * @param prefix Optional coin prefix. Defaults to empty string
999
+ * @param suffix Optional coin suffix. Defaults to coin name.
1000
+ * @param isToken Whether or not this account coin is a token of another coin
1001
+ * @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1002
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1003
+ */
1004
+ function ofcStxToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'stx', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1005
+ const filteredFeatures = getFilteredFeatures(suffix);
1006
+ if (filteredFeatures.length > 0) {
1007
+ features = filteredFeatures;
1008
+ }
1009
+ return Object.freeze(new OfcCoin({
1010
+ id,
1011
+ name,
1012
+ fullName,
1013
+ network,
1014
+ prefix,
1015
+ suffix,
1016
+ features,
1017
+ decimalPlaces,
1018
+ isToken,
1019
+ asset,
1020
+ kind,
1021
+ addressCoin,
1022
+ primaryKeyCurve,
1023
+ baseUnit: base_1.BaseUnit.STX,
1024
+ }));
1025
+ }
1026
+ /**
1027
+ * Factory function for testnet ofc stx instances.
1028
+ *
1029
+ * @param id uuid v4
1030
+ * @param name unique identifier of the coin
1031
+ * @param fullName Complete human-readable name of the coin
1032
+ * @param network Network object for this coin
1033
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1034
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1035
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1036
+ * @param prefix Optional coin prefix. Defaults to empty string
1037
+ * @param suffix Optional coin suffix. Defaults to coin name.
1038
+ * @param isToken Whether or not this account coin is a token of another coin
1039
+ * @param features Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1040
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1041
+ */
1042
+ function tofcStxToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tstx', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1043
+ const filteredFeatures = getFilteredFeatures(suffix);
1044
+ if (filteredFeatures.length > 0) {
1045
+ features = filteredFeatures;
1046
+ }
1047
+ return Object.freeze(new OfcCoin({
1048
+ id,
1049
+ name,
1050
+ fullName,
1051
+ network,
1052
+ prefix,
1053
+ suffix,
1054
+ features,
1055
+ decimalPlaces,
1056
+ isToken,
1057
+ asset,
1058
+ kind,
1059
+ addressCoin,
1060
+ primaryKeyCurve,
1061
+ baseUnit: base_1.BaseUnit.STX,
1062
+ }));
1063
+ }
1064
+ /**
1065
+ * Factory function for ofc opetherc20 token instances.
1066
+ *
1067
+ * @param id uuid v4
1068
+ * @param name unique identifier of the coin
1069
+ * @param fullName Complete human-readable name of the coin
1070
+ * @param network Network object for this coin
1071
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1072
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1073
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1074
+ * @param prefix? Optional coin prefix. Defaults to empty string
1075
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1076
+ * @param isToken? Whether or not this account coin is a token of another coin
1077
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1078
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1079
+ */
1080
+ function ofcOpethErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'opeth', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1081
+ const filteredFeatures = getFilteredFeatures(suffix);
1082
+ if (filteredFeatures.length > 0) {
1083
+ features = filteredFeatures;
1084
+ }
1085
+ return Object.freeze(new OfcCoin({
1086
+ id,
1087
+ name,
1088
+ fullName,
1089
+ network,
1090
+ prefix,
1091
+ suffix,
1092
+ features,
1093
+ decimalPlaces,
1094
+ isToken,
1095
+ asset,
1096
+ kind,
1097
+ addressCoin,
1098
+ primaryKeyCurve,
1099
+ baseUnit: base_1.BaseUnit.ETH,
1100
+ }));
1101
+ }
1102
+ /**
1103
+ * Factory function for ofc tron token instances.
1104
+ *
1105
+ * @param id uuid v4
1106
+ * @param name unique identifier of the coin
1107
+ * @param fullName Complete human-readable name of the coin
1108
+ * @param network Network object for this coin
1109
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1110
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1111
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1112
+ * @param prefix? Optional coin prefix. Defaults to empty string
1113
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1114
+ * @param isToken? Whether or not this account coin is a token of another coin
1115
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1116
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1117
+ */
1118
+ function ofcTronToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'trx', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1119
+ const filteredFeatures = getFilteredFeatures(suffix);
1120
+ if (filteredFeatures.length > 0) {
1121
+ features = filteredFeatures;
1122
+ }
1123
+ return Object.freeze(new OfcCoin({
1124
+ id,
1125
+ name,
1126
+ fullName,
1127
+ network,
1128
+ prefix,
1129
+ suffix,
1130
+ features,
1131
+ decimalPlaces,
1132
+ isToken,
1133
+ asset,
1134
+ kind,
1135
+ addressCoin,
1136
+ primaryKeyCurve,
1137
+ baseUnit: base_1.BaseUnit.TRX,
1138
+ }));
1139
+ }
1140
+ /**
1141
+ * Factory function for ofc tron token instances.
1142
+ *
1143
+ * @param id uuid v4
1144
+ * @param name unique identifier of the coin
1145
+ * @param fullName Complete human-readable name of the coin
1146
+ * @param network Network object for this coin
1147
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1148
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1149
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1150
+ * @param prefix? Optional coin prefix. Defaults to empty string
1151
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1152
+ * @param isToken? Whether or not this account coin is a token of another coin
1153
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1154
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1155
+ */
1156
+ function tofcTronToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'ttrx', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1157
+ const filteredFeatures = getFilteredFeatures(suffix);
1158
+ if (filteredFeatures.length > 0) {
1159
+ features = filteredFeatures;
1160
+ }
1161
+ return Object.freeze(new OfcCoin({
1162
+ id,
1163
+ name,
1164
+ fullName,
1165
+ network,
1166
+ prefix,
1167
+ suffix,
1168
+ features,
1169
+ decimalPlaces,
1170
+ isToken,
1171
+ asset,
1172
+ kind,
1173
+ addressCoin,
1174
+ primaryKeyCurve,
1175
+ baseUnit: base_1.BaseUnit.TRX,
1176
+ }));
1177
+ }
1178
+ /**
1179
+ * Factory function for ofc aptos token instances.
1180
+ *
1181
+ * @param id uuid v4
1182
+ * @param name unique identifier of the coin
1183
+ * @param fullName Complete human-readable name of the coin
1184
+ * @param features
1185
+ * @param prefix
1186
+ * @param suffix
1187
+ * @param network Network object for this coin
1188
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1189
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1190
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1191
+ * @param isToken
1192
+ * @param addressCoin
1193
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1194
+ */
1195
+ function ofcaptToken(id, name, fullName, decimalPlaces, asset, features = [...OfcCoin.DEFAULT_FEATURES, base_1.CoinFeature.TSS_ENTERPRISE_PAYS_FEES], // TSS_ENTERPRISE_PAYS_FEE is a mandatory field for APTOS being a TSS & having Gas tank as fee payer
1196
+ kind = base_1.CoinKind.CRYPTO, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'apt', primaryKeyCurve = base_1.KeyCurve.Ed25519) {
1197
+ const filteredFeatures = getFilteredFeatures(suffix);
1198
+ if (filteredFeatures.length > 0) {
1199
+ features = filteredFeatures;
1200
+ }
1201
+ return Object.freeze(new OfcCoin({
1202
+ id,
1203
+ name,
1204
+ fullName,
1205
+ network,
1206
+ prefix,
1207
+ suffix,
1208
+ features,
1209
+ decimalPlaces,
1210
+ isToken,
1211
+ asset,
1212
+ kind,
1213
+ addressCoin,
1214
+ primaryKeyCurve,
1215
+ baseUnit: base_1.BaseUnit.APT,
1216
+ }));
1217
+ }
1218
+ /**
1219
+ * Factory function for testnet ofc aptos token instances.
1220
+ *
1221
+ * @param id uuid v4
1222
+ * @param name unique identifier of the coin
1223
+ * @param fullName Complete human-readable name of the coin
1224
+ * @param features
1225
+ * @param prefix
1226
+ * @param suffix
1227
+ * @param network Network object for this coin
1228
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1229
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1230
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1231
+ * @param isToken
1232
+ * @param addressCoin
1233
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1234
+ */
1235
+ function tofcaptToken(id, name, fullName, decimalPlaces, asset, features = [...OfcCoin.DEFAULT_FEATURES, base_1.CoinFeature.TSS_ENTERPRISE_PAYS_FEES], // TSS_ENTERPRISE_PAYS_FEE is a mandatory field for APTOS being a TSS & having Gas tank as fee payer
1236
+ kind = base_1.CoinKind.CRYPTO, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tapt', primaryKeyCurve = base_1.KeyCurve.Ed25519) {
1237
+ const filteredFeatures = getFilteredFeatures(suffix);
1238
+ if (filteredFeatures.length > 0) {
1239
+ features = filteredFeatures;
1240
+ }
1241
+ return Object.freeze(new OfcCoin({
1242
+ id,
1243
+ name,
1244
+ fullName,
1245
+ network,
1246
+ prefix,
1247
+ suffix,
1248
+ features,
1249
+ decimalPlaces,
1250
+ isToken,
1251
+ asset,
1252
+ kind,
1253
+ addressCoin,
1254
+ primaryKeyCurve,
1255
+ baseUnit: base_1.BaseUnit.APT,
1256
+ }));
1257
+ }
1258
+ /**
1259
+ * Factory function for ofc nep141 token instances.
1260
+ *
1261
+ * @param id uuid v4
1262
+ * @param name unique identifier of the coin
1263
+ * @param fullName Complete human-readable name of the coin
1264
+ * @param features
1265
+ * @param prefix
1266
+ * @param suffix
1267
+ * @param network Network object for this coin
1268
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1269
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1270
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1271
+ * @param isToken
1272
+ * @param addressCoin
1273
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1274
+ */
1275
+ function ofcnep141Token(id, name, fullName, decimalPlaces, asset, features = OfcCoin.DEFAULT_FEATURES, kind = base_1.CoinKind.CRYPTO, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'near', primaryKeyCurve = base_1.KeyCurve.Ed25519) {
1276
+ const filteredFeatures = getFilteredFeatures(suffix);
1277
+ if (filteredFeatures.length > 0) {
1278
+ features = filteredFeatures;
1279
+ }
1280
+ return Object.freeze(new OfcCoin({
1281
+ id,
1282
+ name,
1283
+ fullName,
1284
+ network,
1285
+ prefix,
1286
+ suffix,
1287
+ features,
1288
+ decimalPlaces,
1289
+ isToken,
1290
+ asset,
1291
+ kind,
1292
+ addressCoin,
1293
+ primaryKeyCurve,
1294
+ baseUnit: base_1.BaseUnit.NEAR,
1295
+ }));
1296
+ }
1297
+ /**
1298
+ * Factory function for tofc nep141 token instances.
1299
+ *
1300
+ * @param id uuid v4
1301
+ * @param name unique identifier of the coin
1302
+ * @param fullName Complete human-readable name of the coin
1303
+ * @param features
1304
+ * @param prefix
1305
+ * @param suffix
1306
+ * @param network Network object for this coin
1307
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1308
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1309
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1310
+ * @param isToken
1311
+ * @param addressCoin
1312
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1313
+ */
1314
+ function tofcnep141Token(id, name, fullName, decimalPlaces, asset, features = OfcCoin.DEFAULT_FEATURES, kind = base_1.CoinKind.CRYPTO, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tnear', primaryKeyCurve = base_1.KeyCurve.Ed25519) {
1315
+ const filteredFeatures = getFilteredFeatures(suffix);
1316
+ if (filteredFeatures.length > 0) {
1317
+ features = filteredFeatures;
1318
+ }
1319
+ return Object.freeze(new OfcCoin({
1320
+ id,
1321
+ name,
1322
+ fullName,
1323
+ network,
1324
+ prefix,
1325
+ suffix,
1326
+ features,
1327
+ decimalPlaces,
1328
+ isToken,
1329
+ asset,
1330
+ kind,
1331
+ addressCoin,
1332
+ primaryKeyCurve,
1333
+ baseUnit: base_1.BaseUnit.NEAR,
1334
+ }));
1335
+ }
1336
+ /**
1337
+ * Factory function for ofc WorldErc20 token instances.
1338
+ *
1339
+ * @param id uuid v4
1340
+ * @param name unique identifier of the coin
1341
+ * @param fullName Complete human-readable name of the coin
1342
+ * @param network Network object for this coin
1343
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1344
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1345
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1346
+ * @param prefix? Optional coin prefix. Defaults to empty string
1347
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1348
+ * @param isToken? Whether or not this account coin is a token of another coin
1349
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1350
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1351
+ */
1352
+ function ofcWorldErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'world', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1353
+ const filteredFeatures = getFilteredFeatures(suffix);
1354
+ if (filteredFeatures.length > 0) {
1355
+ features = filteredFeatures;
1356
+ }
1357
+ return Object.freeze(new OfcCoin({
1358
+ id,
1359
+ name,
1360
+ fullName,
1361
+ network,
1362
+ prefix,
1363
+ suffix,
1364
+ features,
1365
+ decimalPlaces,
1366
+ isToken,
1367
+ asset,
1368
+ kind,
1369
+ addressCoin,
1370
+ primaryKeyCurve,
1371
+ baseUnit: base_1.BaseUnit.ETH,
1372
+ }));
1373
+ }
1374
+ /**
1375
+ * Factory function for testnet ofc WorldErc20 token instances.
1376
+ *
1377
+ * @param id uuid v4
1378
+ * @param name unique identifier of the coin
1379
+ * @param fullName Complete human-readable name of the coin
1380
+ * @param network Network object for this coin
1381
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1382
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1383
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1384
+ * @param prefix? Optional coin prefix. Defaults to empty string
1385
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1386
+ * @param isToken? Whether or not this account coin is a token of another coin
1387
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1388
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1389
+ */
1390
+ function tofcWorldErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tworld', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1391
+ const filteredFeatures = getFilteredFeatures(suffix);
1392
+ if (filteredFeatures.length > 0) {
1393
+ features = filteredFeatures;
1394
+ }
1395
+ return Object.freeze(new OfcCoin({
1396
+ id,
1397
+ name,
1398
+ fullName,
1399
+ network,
1400
+ prefix,
1401
+ suffix,
1402
+ features,
1403
+ decimalPlaces,
1404
+ isToken,
1405
+ asset,
1406
+ kind,
1407
+ addressCoin,
1408
+ primaryKeyCurve,
1409
+ baseUnit: base_1.BaseUnit.ETH,
1410
+ }));
1411
+ }
1412
+ /**
1413
+ * Factory function for ofc CoredaoErc20 token instances.
1414
+ *
1415
+ * @param id uuid v4
1416
+ * @param name unique identifier of the coin
1417
+ * @param fullName Complete human-readable name of the coin
1418
+ * @param network Network object for this coin
1419
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1420
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1421
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1422
+ * @param prefix? Optional coin prefix. Defaults to empty string
1423
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1424
+ * @param isToken? Whether or not this account coin is a token of another coin
1425
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1426
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1427
+ */
1428
+ function ofcCoredaoErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'coredao', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1429
+ const filteredFeatures = getFilteredFeatures(suffix);
1430
+ if (filteredFeatures.length > 0) {
1431
+ features = filteredFeatures;
1432
+ }
1433
+ return Object.freeze(new OfcCoin({
1434
+ id,
1435
+ name,
1436
+ fullName,
1437
+ network,
1438
+ prefix,
1439
+ suffix,
1440
+ features,
1441
+ decimalPlaces,
1442
+ isToken,
1443
+ asset,
1444
+ kind,
1445
+ addressCoin,
1446
+ primaryKeyCurve,
1447
+ baseUnit: base_1.BaseUnit.ETH,
1448
+ }));
1449
+ }
1450
+ /**
1451
+ * Factory function for testnet ofc CoredaoErc20 token instances.
1452
+ *
1453
+ * @param id uuid v4
1454
+ * @param name unique identifier of the coin
1455
+ * @param fullName Complete human-readable name of the coin
1456
+ * @param network Network object for this coin
1457
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1458
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1459
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1460
+ * @param prefix? Optional coin prefix. Defaults to empty string
1461
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1462
+ * @param isToken? Whether or not this account coin is a token of another coin
1463
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1464
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1465
+ */
1466
+ function tofcCoredaoErc20(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tcoredao', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1467
+ const filteredFeatures = getFilteredFeatures(suffix);
1468
+ if (filteredFeatures.length > 0) {
1469
+ features = filteredFeatures;
1470
+ }
1471
+ return Object.freeze(new OfcCoin({
1472
+ id,
1473
+ name,
1474
+ fullName,
1475
+ network,
1476
+ prefix,
1477
+ suffix,
1478
+ features,
1479
+ decimalPlaces,
1480
+ isToken,
1481
+ asset,
1482
+ kind,
1483
+ addressCoin,
1484
+ primaryKeyCurve,
1485
+ baseUnit: base_1.BaseUnit.ETH,
1486
+ }));
1487
+ }
1488
+ /**
1489
+ * Factory function for ofc vet token instances.
1490
+ *
1491
+ * @param id uuid v4
1492
+ * @param name unique identifier of the coin
1493
+ * @param fullName Complete human-readable name of the coin
1494
+ * @param network Network object for this coin
1495
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1496
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1497
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1498
+ * @param prefix? Optional coin prefix. Defaults to empty string
1499
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1500
+ * @param isToken? Whether or not this account coin is a token of another coin
1501
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1502
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1503
+ */
1504
+ function ofcVetToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'vet', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1505
+ const filteredFeatures = getFilteredFeatures(suffix);
1506
+ if (filteredFeatures.length > 0) {
1507
+ features = filteredFeatures;
1508
+ }
1509
+ return Object.freeze(new OfcCoin({
1510
+ id,
1511
+ name,
1512
+ fullName,
1513
+ network,
1514
+ prefix,
1515
+ suffix,
1516
+ features,
1517
+ decimalPlaces,
1518
+ isToken,
1519
+ asset,
1520
+ kind,
1521
+ addressCoin,
1522
+ primaryKeyCurve,
1523
+ baseUnit: base_1.BaseUnit.VET,
1524
+ }));
1525
+ }
1526
+ /**
1527
+ * Factory function for testnet ofc vet token instances.
1528
+ *
1529
+ * @param id uuid v4
1530
+ * @param name unique identifier of the coin
1531
+ * @param fullName Complete human-readable name of the coin
1532
+ * @param network Network object for this coin
1533
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1534
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1535
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1536
+ * @param prefix? Optional coin prefix. Defaults to empty string
1537
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1538
+ * @param isToken? Whether or not this account coin is a token of another coin
1539
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1540
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1541
+ */
1542
+ function tofcVetToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tvet', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1543
+ const filteredFeatures = getFilteredFeatures(suffix);
1544
+ if (filteredFeatures.length > 0) {
1545
+ features = filteredFeatures;
1546
+ }
1547
+ return Object.freeze(new OfcCoin({
1548
+ id,
1549
+ name,
1550
+ fullName,
1551
+ network,
1552
+ prefix,
1553
+ suffix,
1554
+ features,
1555
+ decimalPlaces,
1556
+ isToken,
1557
+ asset,
1558
+ kind,
1559
+ addressCoin,
1560
+ primaryKeyCurve,
1561
+ baseUnit: base_1.BaseUnit.VET,
1562
+ }));
1563
+ }
1564
+ /**
1565
+ * Factory function for ofc hash token instances.
1566
+ *
1567
+ * @param id uuid v4
1568
+ * @param name unique identifier of the coin
1569
+ * @param fullName Complete human-readable name of the coin
1570
+ * @param network Network object for this coin
1571
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1572
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1573
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1574
+ * @param prefix? Optional coin prefix. Defaults to empty string
1575
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1576
+ * @param isToken? Whether or not this account coin is a token of another coin
1577
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1578
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1579
+ */
1580
+ function ofcHashToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'hash', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1581
+ const filteredFeatures = getFilteredFeatures(suffix);
1582
+ if (filteredFeatures.length > 0) {
1583
+ features = filteredFeatures;
1584
+ }
1585
+ return Object.freeze(new OfcCoin({
1586
+ id,
1587
+ name,
1588
+ fullName,
1589
+ network,
1590
+ prefix,
1591
+ suffix,
1592
+ features,
1593
+ decimalPlaces,
1594
+ isToken,
1595
+ asset,
1596
+ kind,
1597
+ addressCoin,
1598
+ primaryKeyCurve,
1599
+ baseUnit: base_1.BaseUnit.HASH,
1600
+ }));
1601
+ }
1602
+ /**
1603
+ * Factory function for testnet ofc hash token instances.
1604
+ *
1605
+ * @param id uuid v4
1606
+ * @param name unique identifier of the coin
1607
+ * @param fullName Complete human-readable name of the coin
1608
+ * @param network Network object for this coin
1609
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1610
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1611
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1612
+ * @param prefix? Optional coin prefix. Defaults to empty string
1613
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1614
+ * @param isToken? Whether or not this account coin is a token of another coin
1615
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1616
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1617
+ */
1618
+ function tofcHashToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'thash', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1619
+ return ofcHashToken(id, name, fullName, decimalPlaces, asset, kind, features, prefix, suffix, network, isToken, addressCoin, primaryKeyCurve);
1620
+ }
1621
+ /**
1622
+ * Factory function for ofc ton token instances.
1623
+ *
1624
+ * @param id uuid v4
1625
+ * @param name unique identifier of the coin
1626
+ * @param fullName Complete human-readable name of the coin
1627
+ * @param network Network object for this coin
1628
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1629
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1630
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1631
+ * @param prefix? Optional coin prefix. Defaults to empty string
1632
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1633
+ * @param isToken? Whether or not this account coin is a token of another coin
1634
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1635
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1636
+ */
1637
+ function ofcTonToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.main.ofc, isToken = true, addressCoin = 'ton', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1638
+ const filteredFeatures = getFilteredFeatures(suffix);
1639
+ if (filteredFeatures.length > 0) {
1640
+ features = filteredFeatures;
1641
+ }
1642
+ return Object.freeze(new OfcCoin({
1643
+ id,
1644
+ name,
1645
+ fullName,
1646
+ network,
1647
+ prefix,
1648
+ suffix,
1649
+ features,
1650
+ decimalPlaces,
1651
+ isToken,
1652
+ asset,
1653
+ kind,
1654
+ addressCoin,
1655
+ primaryKeyCurve,
1656
+ baseUnit: base_1.BaseUnit.TON,
1657
+ }));
1658
+ }
1659
+ /**
1660
+ * Factory function for testnet ofc ton token instances.
1661
+ *
1662
+ * @param id uuid v4
1663
+ * @param name unique identifier of the coin
1664
+ * @param fullName Complete human-readable name of the coin
1665
+ * @param network Network object for this coin
1666
+ * @param decimalPlaces Number of decimal places this coin supports (divisibility exponent)
1667
+ * @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
1668
+ * @param kind Differentiates coins which represent fiat assets from those which represent crypto assets
1669
+ * @param prefix? Optional coin prefix. Defaults to empty string
1670
+ * @param suffix? Optional coin suffix. Defaults to coin name.
1671
+ * @param isToken? Whether or not this account coin is a token of another coin
1672
+ * @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `OfcCoin`
1673
+ * @param primaryKeyCurve The elliptic curve for this chain/token
1674
+ */
1675
+ function tofcTonToken(id, name, fullName, decimalPlaces, asset, kind = base_1.CoinKind.CRYPTO, features = OfcCoin.DEFAULT_FEATURES, prefix = '', suffix = name.replace(/^ofc/, '').toUpperCase(), network = networks_1.Networks.test.ofc, isToken = true, addressCoin = 'tton', primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
1676
+ const filteredFeatures = getFilteredFeatures(suffix);
1677
+ if (filteredFeatures.length > 0) {
1678
+ features = filteredFeatures;
1679
+ }
1680
+ return Object.freeze(new OfcCoin({
1681
+ id,
1682
+ name,
1683
+ fullName,
1684
+ network,
1685
+ prefix,
1686
+ suffix,
1687
+ features,
1688
+ decimalPlaces,
1689
+ isToken,
1690
+ asset,
1691
+ kind,
1692
+ addressCoin,
1693
+ primaryKeyCurve,
1694
+ baseUnit: base_1.BaseUnit.TON,
1695
+ }));
1696
+ }
1697
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnREEsa0RBU0M7QUFvREQsNEJBc0NDO0FBa0JELGtCQW9DQztBQWtCRCxvQkFtQ0M7QUFpQkQsNEJBcUNDO0FBaUJELDhCQXFDQztBQW9CRCxrQ0FxQ0M7QUFvQkQsb0NBcUNDO0FBa0JELDBDQXFDQztBQWlCRCw0Q0FxQ0M7QUFrQkQsb0NBcUNDO0FBaUJELHNDQXFDQztBQWtCRCx3Q0FxQ0M7QUFpQkQsMENBcUNDO0FBa0JELHdDQXFDQztBQWtCRCwwQ0FxQ0M7QUFrQkQsb0NBcUNDO0FBa0JELHNDQXFDQztBQWtCRCwwQ0FxQ0M7QUFrQkQsNENBcUNDO0FBa0JELGtDQXFDQztBQWtCRCxvQ0FxQ0M7QUFrQkQsa0NBcUNDO0FBa0JELG9DQXFDQztBQWtCRCxrQ0FxQ0M7QUFrQkQsb0NBcUNDO0FBa0JELHNDQXFDQztBQWtCRCxvQ0FxQ0M7QUFrQkQsc0NBcUNDO0FBb0JELGtDQXFDQztBQW9CRCxvQ0FxQ0M7QUFvQkQsd0NBcUNDO0FBb0JELDBDQXFDQztBQWtCRCxzQ0FxQ0M7QUFrQkQsd0NBcUNDO0FBa0JELDBDQXFDQztBQWtCRCw0Q0FxQ0M7QUFrQkQsa0NBcUNDO0FBa0JELG9DQXFDQztBQWtCRCxvQ0FxQ0M7QUFrQkQsc0NBOEJDO0FBa0JELGtDQXFDQztBQWtCRCxvQ0FxQ0M7QUEvMUVELGlDQUE4RjtBQUM5Rix5Q0FBK0Q7QUFDL0QsMkRBQXdEO0FBQ3hELCtCQUFnQztBQW1CaEMsaUZBQWlGO0FBQ2pGLElBQUksb0JBQXlDLENBQUM7QUFFOUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFZLEVBQUU7SUFDNUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDMUIsb0JBQW9CLEdBQUcsYUFBTyxDQUFDLFNBQVMsQ0FBQyxxQ0FBaUIsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxPQUFPLG9CQUFvQixD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ZW50IjpbImltcG9ydCB7IEJhc2VDb2luLCBCYXNlVW5pdCwgQ29pbkZlYXR1cmUsIENvaW5LaW5kLCBLZXlDdXJ2ZSwgVW5kZXJseWluZ0Fzc2V0IH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IEJhc2VOZXR3b3JrLCBOZXR3b3JrcywgT2ZjTmV0d29yayB9IGZyb20gJy4vbmV0d29ya3MnO1xuaW1wb3J0IHsgYWxsQ29pbnNBbmRUb2tlbnMgfSBmcm9tICcuL2FsbENvaW5zQW5kVG9rZW5zJztcbmltcG9ydCB7IENvaW5NYXAgfSBmcm9tICcuL21hcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2ZjQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgaWQ6IHN0cmluZztcbiAgZnVsbE5hbWU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBuZXR3b3JrOiBCYXNlTmV0d29yaztcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldDtcbiAgYmFzZVVuaXQ6IEJhc2VVbml0O1xuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXTtcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyO1xuICBpc1Rva2VuOiBib29sZWFuO1xuICBraW5kOiBDb2luS2luZDtcbiAgcHJlZml4Pzogc3RyaW5nO1xuICBzdWZmaXg/OiBzdHJpbmc7XG4gIGFkZHJlc3NDb2luPzogc3RyaW5nO1xuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlO1xufVxuXG4vLyBGdW5jdGlvbiB0byBnZXQgY29pbnMgbWFwIC0gd2lsbCBiZSBjYWxsZWQgbGF6aWx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3lcbmxldCBhbGxDb2luc0FuZFRva2Vuc01hcDogQ29pbk1hcCB8IHVuZGVmaW5lZDtcblxuY29uc3QgZ2V0QWxsQ29pbnNBbmRUb2tlbnNNYXAgPSAoKTogQ29pbk1hcCA9PiB7XG4gIGlmICghYWxsQ29pbnNBbmRUb2tlbnNNYXApIHtcbiAgICBhbGxDb2luc0FuZFRva2Vuc01hcCA9IENvaW5NYXAuZnJvbUNvaW5zKGFsbENvaW5zQW5kVG9rZW5zKTtcbiAgfVxuICByZXR1cm4gYWxsQ29pbnNBbmRUb2tlbnNNYXA7XG59O1xuXG5jb25zdCBESVNBTExPV0VEX0ZFQVRVUkVTID0gW1xuICBDb2luRmVhdHVyZS5VTlNQRU5UX01PREVMLFxuICBDb2luRmVhdHVyZS5DSElMRF9QQVlTX0ZPUl9QQVJFTlQsXG4gIENvaW5GZWF0dXJlLlBBWUdPLFxuICBDb2luRmVhdHVyZS5TVVBQT1JUU19UT0tFTlMsXG4gIC8vIE9GQyBpbmhlcml0cyBmZWF0dXJlcyBmcm9tIHRoZSBiYXNlIGFzc2V0IGJ1dCB0aGUgZmVhdHVyZXMgYXJlIG5vdCBhbHdheXMgYXBwbGljYWJsZSB0byBPRkNcbiAgQ29pbkZlYXR1cmUuU0hBUkVEX0VWTV9TSUdOSU5HLFxuICBDb2luRmVhdHVyZS5FVk1fQ09NUEFUSUJMRV9XUCxcbl07XG5cbmNvbnN0IFJFUVVJUkVEX0ZFQVRVUkVTID0gW0NvaW5GZWF0dXJlLkFDQ09VTlRfTU9ERUwsIENvaW5GZWF0dXJlLlJFUVVJUkVTX0JJR19OVU1CRVJdO1xuLyoqXG4gKiBHZXQgZmlsdGVyZWQgZmVhdHVyZXMgZm9yIGEgY29pbiBiYXNlZCBvbiBpdHMgc3VmZml4XG4gKiBAcGFyYW0gc3VmZml4IFRoZSBjb2luIHN1ZmZpeCB0byBsb29rIHVwXG4gKiBAcmV0dXJucyBGaWx0ZXJlZCBhcnJheSBvZiBDb2luRmVhdHVyZXMgZXhjbHVkaW5nIHRoZSBvbmVzIGluIHRoZSBleGNsdWRlIGxpc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4OiBzdHJpbmcpOiBDb2luRmVhdHVyZVtdIHtcbiAgY29uc3QgY29pbnNNYXAgPSBnZXRBbGxDb2luc0FuZFRva2Vuc01hcCgpO1xuICBpZiAoY29pbnNNYXAuaGFzKHN1ZmZpeC50b0xvd2VyQ2FzZSgpKSkge1xuICAgIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBjb2luc01hcFxuICAgICAgLmdldChzdWZmaXgudG9Mb3dlckNhc2UoKSlcbiAgICAgIC5mZWF0dXJlcy5maWx0ZXIoKGZlYXR1cmUpID0+ICFESVNBTExPV0VEX0ZFQVRVUkVTLmluY2x1ZGVzKGZlYXR1cmUpKTtcbiAgICByZXR1cm4gWy4uLmZpbHRlcmVkRmVhdHVyZXMsIC4uLlJFUVVJUkVEX0ZFQVRVUkVTXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogT0ZDIChvZmYgY2hhaW4pIGNvaW5zLiBUaGVzZSBhcmUgdmlydHVhbCBjb2lucyB1c2VkIHRvIHJlcHJlc2VudCBvZmYgY2hhaW4gYXNzZXRzIG9uIHRoZSBCaXRHbyBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9mY0NvaW4gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GRUFUVVJFUyA9IFtcbiAgICBDb2luRmVhdHVyZS5BQ0NPVU5UX01PREVMLFxuICAgIENvaW5GZWF0dXJlLlJFUVVJUkVTX0JJR19OVU1CRVIsXG4gICAgQ29pbkZlYXR1cmUuQ1VTVE9EWSxcbiAgICBDb2luRmVhdHVyZS5DVVNUT0RZX0JJVEdPX1RSVVNULFxuICAgIENvaW5GZWF0dXJlLkNVU1RPRFlfQklUR09fTUVOQV9GWkUsXG4gICAgQ29pbkZlYXR1cmUuQ1VTVE9EWV9CSVRHT19DVVNUT0RZX01FTkFfRlpFLFxuICAgIENvaW5GZWF0dXJlLkNVU1RPRFlfQklUR09fSU5ESUEsXG4gIF07XG5cbiAgLy8gSWYgc2V0LCB0aGlzIGNvaW4gaXMgdGhlIG5hdGl2ZSBhZGRyZXNzIGZvcm1hdCBmb3IgdGhpcyB0b2tlbi5cbiAgcHVibGljIHJlYWRvbmx5IGFkZHJlc3NDb2luPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWluaW11bURlbm9taW5hdGlvbjogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPZmNDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGFkZHJlc3NDb2luLCAuLi5iYXNlT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBzdXBlcihiYXNlT3B0aW9ucyk7XG4gICAgdGhpcy5hZGRyZXNzQ29pbiA9IGFkZHJlc3NDb2luO1xuICAgIHRoaXMubWluaW11bURlbm9taW5hdGlvbiA9IE1hdGgucG93KDEwLCB0aGlzLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVkRmVhdHVyZXMoKTogU2V0PENvaW5GZWF0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8Q29pbkZlYXR1cmU+KFJFUVVJUkVEX0ZFQVRVUkVTKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNhbGxvd2VkRmVhdHVyZXMoKTogU2V0PENvaW5GZWF0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8Q29pbkZlYXR1cmU+KERJU0FMTE9XRURfRkVBVFVSRVMpO1xuICB9XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNvbnZlcnQgQU1TIGlucHV0cyBpbnRvIE9GQyBjb2luIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIGNvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBmZWF0dXJlcyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKiBAcGFyYW0gYmFzZVVuaXQgYmFzZSB1bml0IG9mIHRoZSB0b2tlblxuICogQHBhcmFtIGlzVG9rZW4gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8T2ZjQ29pbj59IE9GQyBjb2luIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxLFxuICBiYXNlVW5pdDogQmFzZVVuaXQgPSBCYXNlVW5pdC5PRkMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgYWRkcmVzc0NvaW4gPSAnJ1xuKTogUmVhZG9ubHk8T2ZjQ29pbj4ge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIGNvaW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmMoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICAvKiogT0ZDIHRva2VucyB1c2UgU0VDUDI1NksxIHVuZGVyIHRoZSBob29kIGV2ZW4gaWYgdGhlIGNoYWluIGRvZXNuJ3QgKiovXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuT0ZDLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBvZmMgY29pbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmMoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0Lk9GQyxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG9mYyBlcmMyMCBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0cyAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9mY2VyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAnZXRoJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBlcmMyMCBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mY2VyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndGV0aCcsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBvZmMgc29sYW5hIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXNcbiAqIEBwYXJhbSBwcmVmaXhcbiAqIEBwYXJhbSBzdWZmaXhcbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gaXNUb2tlblxuICogQHBhcmFtIGFkZHJlc3NDb2luXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvZmNzb2xUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gWy4uLk9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUywgQ29pbkZlYXR1cmUuUkVRVUlSRVNfUkVTRVJWRV0sXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAnc29sJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlNPTCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgb2ZjIHNvbGFuYSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIGZlYXR1cmVzXG4gKiBAcGFyYW0gcHJlZml4XG4gKiBAcGFyYW0gc3VmZml4XG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIGlzVG9rZW5cbiAqIEBwYXJhbSBhZGRyZXNzQ29pblxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdG9mY3NvbFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5SRVFVSVJFU19SRVNFUlZFXSxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0c29sJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlNPTCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG9mYyBzdGVsbGFyIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gb2ZjU3RlbGxhclRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAneGxtJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlhMTSxcbiAgICB9KVxuICApO1xufVxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBzdGVsbGFyIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mY1N0ZWxsYXJUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3R4bG0nLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuWExNLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIGFsZ28gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNBbGdvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICdhbGdvJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkFMR08sXG4gICAgfSlcbiAgKTtcbn1cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBvZmMgYWxnbyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNBbGdvVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0YWxnbycsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5BTEdPLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIGhlZGVyYSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9mY0hlZGVyYVRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAnaGJhcicsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5IQkFSLFxuICAgIH0pXG4gICk7XG59XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgb2ZjIGhlZGVyYSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNIZWRlcmFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3RoYmFyJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkhCQVIsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBvZmMgYXJiZXRoRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNBcmJldGhFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ2FyYmV0aCcsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBhcmJldGhFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNBcmJldGhFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3RhcmJldGgnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIGF2YXhFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9mY0F2YXhFcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ2F2YXhjJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgb2ZjIGF2YXhFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNBdmF4RXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0YXZheGMnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIHBvbHlnb25FcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9mY1BvbHlnb25FcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3BvbHlnb24nLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBvZmMgcG9seWdvbkVyYzIwIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mY1BvbHlnb25FcmMyMChcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3Rwb2x5Z29uJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG9mYyBic2MgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNCc2NUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ2JzYycsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5CU0MsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBic2MgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2ZjQnNjVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0YnNjJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkJTQyxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG1haW5uZXQgb2ZjIHhycCBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9mY1hycFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAneHJwJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LlhSUCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgb2ZjIHhycCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNYcnBUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3R4cnAnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuWFJQLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgbWFpbm5ldCBvZmMgc3R4IGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeCBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbiBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzIEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNTdHhUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3N0eCcsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5TVFgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBzdHggaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuIFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNTdHhUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3RzdHgnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuU1RYLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIG9wZXRoZXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNPcGV0aEVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAnb3BldGgnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIHRyb24gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNUcm9uVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0cngnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuVFJYLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIHRyb24gdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2ZjVHJvblRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndHRyeCcsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5UUlgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBvZmMgYXB0b3MgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlc1xuICogQHBhcmFtIHByZWZpeFxuICogQHBhcmFtIHN1ZmZpeFxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBpc1Rva2VuXG4gKiBAcGFyYW0gYWRkcmVzc0NvaW5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9mY2FwdFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5UU1NfRU5URVJQUklTRV9QQVlTX0ZFRVNdLCAvLyBUU1NfRU5URVJQUklTRV9QQVlTX0ZFRSBpcyBhIG1hbmRhdG9yeSBmaWVsZCBmb3IgQVBUT1MgYmVpbmcgYSBUU1MgJiBoYXZpbmcgR2FzIHRhbmsgYXMgZmVlIHBheWVyXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAnYXB0JyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5BUFQsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB0ZXN0bmV0IG9mYyBhcHRvcyB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIGZlYXR1cmVzXG4gKiBAcGFyYW0gcHJlZml4XG4gKiBAcGFyYW0gc3VmZml4XG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIGlzVG9rZW5cbiAqIEBwYXJhbSBhZGRyZXNzQ29pblxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdG9mY2FwdFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBbLi4uT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5UU1NfRU5URVJQUklTRV9QQVlTX0ZFRVNdLCAvLyBUU1NfRU5URVJQUklTRV9QQVlTX0ZFRSBpcyBhIG1hbmRhdG9yeSBmaWVsZCBmb3IgQVBUT1MgYmVpbmcgYSBUU1MgJiBoYXZpbmcgR2FzIHRhbmsgYXMgZmVlIHBheWVyXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndGFwdCcsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5FZDI1NTE5XG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuQVBULFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIG5lcDE0MSB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIGZlYXR1cmVzXG4gKiBAcGFyYW0gcHJlZml4XG4gKiBAcGFyYW0gc3VmZml4XG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIGlzVG9rZW5cbiAqIEBwYXJhbSBhZGRyZXNzQ29pblxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gb2ZjbmVwMTQxVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICduZWFyJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5ORUFSLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdG9mYyBuZXAxNDEgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlc1xuICogQHBhcmFtIHByZWZpeFxuICogQHBhcmFtIHN1ZmZpeFxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBpc1Rva2VuXG4gKiBAcGFyYW0gYWRkcmVzc0NvaW5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvZmNuZXAxNDFUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy50ZXN0Lm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ3RuZWFyJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLkVkMjU1MTlcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5ORUFSLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Igb2ZjIFdvcmxkRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNXb3JsZEVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLm1haW4ub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAnd29ybGQnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuRVRILFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBvZmMgV29ybGRFcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNXb3JsZEVyYzIwKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndHdvcmxkJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIG9mYyBDb3JlZGFvRXJjMjAgdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvZmNDb3JlZGFvRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICdjb3JlZGFvJyxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIGNvbnN0IGZpbHRlcmVkRmVhdHVyZXMgPSBnZXRGaWx0ZXJlZEZlYXR1cmVzKHN1ZmZpeCk7XG4gIGlmIChmaWx0ZXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBmZWF0dXJlcyA9IGZpbHRlcmVkRmVhdHVyZXM7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgbmV3IE9mY0NvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBkZWNpbWFsUGxhY2VzLFxuICAgICAgaXNUb2tlbixcbiAgICAgIGFzc2V0LFxuICAgICAga2luZCxcbiAgICAgIGFkZHJlc3NDb2luLFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQ6IEJhc2VVbml0LkVUSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgb2ZjIENvcmVkYW9FcmMyMCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZmNDb3JlZGFvRXJjMjAoXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MudGVzdC5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0Y29yZWRhbycsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5FVEgsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBvZmMgdmV0IHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gb2ZjVmV0VG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd2ZXQnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuVkVULFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBvZmMgdmV0IHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mY1ZldFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndHZldCcsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5WRVQsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBvZmMgaGFzaCB0b2tlbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIGlkIHV1aWQgdjRcbiAqIEBwYXJhbSBuYW1lIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gZnVsbE5hbWUgQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY29pblxuICogQHBhcmFtIG5ldHdvcmsgTmV0d29yayBvYmplY3QgZm9yIHRoaXMgY29pblxuICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRoaXMgY29pbiBzdXBwb3J0cyAoZGl2aXNpYmlsaXR5IGV4cG9uZW50KVxuICogQHBhcmFtIGFzc2V0IEFzc2V0IHdoaWNoIHRoaXMgY29pbiByZXByZXNlbnRzLiBUaGlzIGlzIHRoZSBzYW1lIGZvciBib3RoIG1haW5uZXQgYW5kIHRlc3RuZXQgdmFyaWFudHMgb2YgYSBjb2luLlxuICogQHBhcmFtIGtpbmQgRGlmZmVyZW50aWF0ZXMgY29pbnMgd2hpY2ggcmVwcmVzZW50IGZpYXQgYXNzZXRzIGZyb20gdGhvc2Ugd2hpY2ggcmVwcmVzZW50IGNyeXB0byBhc3NldHNcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gaXNUb2tlbj8gV2hldGhlciBvciBub3QgdGhpcyBhY2NvdW50IGNvaW4gaXMgYSB0b2tlbiBvZiBhbm90aGVyIGNvaW5cbiAqIEBwYXJhbSBmZWF0dXJlcz8gRmVhdHVyZXMgb2YgdGhpcyBjb2luLiBEZWZhdWx0cyB0byB0aGUgREVGQVVMVF9GRUFUVVJFUyBkZWZpbmVkIGluIGBPZmNDb2luYFxuICogQHBhcmFtIHByaW1hcnlLZXlDdXJ2ZSBUaGUgZWxsaXB0aWMgY3VydmUgZm9yIHRoaXMgY2hhaW4vdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9mY0hhc2hUb2tlbihcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGtpbmQ6IENvaW5LaW5kID0gQ29pbktpbmQuQ1JZUFRPLFxuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IE9mY0NvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgcHJlZml4ID0gJycsXG4gIHN1ZmZpeDogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC9eb2ZjLywgJycpLnRvVXBwZXJDYXNlKCksXG4gIG5ldHdvcms6IE9mY05ldHdvcmsgPSBOZXR3b3Jrcy5tYWluLm9mYyxcbiAgaXNUb2tlbiA9IHRydWUsXG4gIGFkZHJlc3NDb2luID0gJ2hhc2gnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuSEFTSCxcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRlc3RuZXQgb2ZjIGhhc2ggdG9rZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSBpZCB1dWlkIHY0XG4gKiBAcGFyYW0gbmFtZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29pblxuICogQHBhcmFtIGZ1bGxOYW1lIENvbXBsZXRlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBuZXR3b3JrIE5ldHdvcmsgb2JqZWN0IGZvciB0aGlzIGNvaW5cbiAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0aGlzIGNvaW4gc3VwcG9ydHMgKGRpdmlzaWJpbGl0eSBleHBvbmVudClcbiAqIEBwYXJhbSBhc3NldCBBc3NldCB3aGljaCB0aGlzIGNvaW4gcmVwcmVzZW50cy4gVGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBtYWlubmV0IGFuZCB0ZXN0bmV0IHZhcmlhbnRzIG9mIGEgY29pbi5cbiAqIEBwYXJhbSBraW5kIERpZmZlcmVudGlhdGVzIGNvaW5zIHdoaWNoIHJlcHJlc2VudCBmaWF0IGFzc2V0cyBmcm9tIHRob3NlIHdoaWNoIHJlcHJlc2VudCBjcnlwdG8gYXNzZXRzXG4gKiBAcGFyYW0gcHJlZml4PyBPcHRpb25hbCBjb2luIHByZWZpeC4gRGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nXG4gKiBAcGFyYW0gc3VmZml4PyBPcHRpb25hbCBjb2luIHN1ZmZpeC4gRGVmYXVsdHMgdG8gY29pbiBuYW1lLlxuICogQHBhcmFtIGlzVG9rZW4/IFdoZXRoZXIgb3Igbm90IHRoaXMgYWNjb3VudCBjb2luIGlzIGEgdG9rZW4gb2YgYW5vdGhlciBjb2luXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgT2ZjQ29pbmBcbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2ZjSGFzaFRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndGhhc2gnLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgcmV0dXJuIG9mY0hhc2hUb2tlbihcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgYXNzZXQsXG4gICAga2luZCxcbiAgICBmZWF0dXJlcyxcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIG5ldHdvcmssXG4gICAgaXNUb2tlbixcbiAgICBhZGRyZXNzQ29pbixcbiAgICBwcmltYXJ5S2V5Q3VydmVcbiAgKTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBvZmMgdG9uIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gb2ZjVG9uVG9rZW4oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgZnVsbE5hbWU6IHN0cmluZyxcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICBhc3NldDogVW5kZXJseWluZ0Fzc2V0LFxuICBraW5kOiBDb2luS2luZCA9IENvaW5LaW5kLkNSWVBUTyxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBPZmNDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvXm9mYy8sICcnKS50b1VwcGVyQ2FzZSgpLFxuICBuZXR3b3JrOiBPZmNOZXR3b3JrID0gTmV0d29ya3MubWFpbi5vZmMsXG4gIGlzVG9rZW4gPSB0cnVlLFxuICBhZGRyZXNzQ29pbiA9ICd0b24nLFxuICBwcmltYXJ5S2V5Q3VydmU6IEtleUN1cnZlID0gS2V5Q3VydmUuU2VjcDI1NmsxXG4pIHtcbiAgY29uc3QgZmlsdGVyZWRGZWF0dXJlcyA9IGdldEZpbHRlcmVkRmVhdHVyZXMoc3VmZml4KTtcbiAgaWYgKGZpbHRlcmVkRmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGZlYXR1cmVzID0gZmlsdGVyZWRGZWF0dXJlcztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgT2ZjQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBpc1Rva2VuLFxuICAgICAgYXNzZXQsXG4gICAgICBraW5kLFxuICAgICAgYWRkcmVzc0NvaW4sXG4gICAgICBwcmltYXJ5S2V5Q3VydmUsXG4gICAgICBiYXNlVW5pdDogQmFzZVVuaXQuVE9OLFxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGVzdG5ldCBvZmMgdG9uIHRva2VuIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gZGVjaW1hbFBsYWNlcyBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdGhpcyBjb2luIHN1cHBvcnRzIChkaXZpc2liaWxpdHkgZXhwb25lbnQpXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0ga2luZCBEaWZmZXJlbnRpYXRlcyBjb2lucyB3aGljaCByZXByZXNlbnQgZmlhdCBhc3NldHMgZnJvbSB0aG9zZSB3aGljaCByZXByZXNlbnQgY3J5cHRvIGFzc2V0c1xuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBpc1Rva2VuPyBXaGV0aGVyIG9yIG5vdCB0aGlzIGFjY291bnQgY29pbiBpcyBhIHRva2VuIG9mIGFub3RoZXIgY29pblxuICogQHBhcmFtIGZlYXR1cmVzPyBGZWF0dXJlcyBvZiB0aGlzIGNvaW4uIERlZmF1bHRzIHRvIHRoZSBERUZBVUxUX0ZFQVRVUkVTIGRlZmluZWQgaW4gYE9mY0NvaW5gXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9mY1RvblRva2VuKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldCxcbiAga2luZDogQ29pbktpbmQgPSBDb2luS2luZC5DUllQVE8sXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gT2ZjQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBwcmVmaXggPSAnJyxcbiAgc3VmZml4OiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoL15vZmMvLCAnJykudG9VcHBlckNhc2UoKSxcbiAgbmV0d29yazogT2ZjTmV0d29yayA9IE5ldHdvcmtzLnRlc3Qub2ZjLFxuICBpc1Rva2VuID0gdHJ1ZSxcbiAgYWRkcmVzc0NvaW4gPSAndHRvbicsXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICBjb25zdCBmaWx0ZXJlZEZlYXR1cmVzID0gZ2V0RmlsdGVyZWRGZWF0dXJlcyhzdWZmaXgpO1xuICBpZiAoZmlsdGVyZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgZmVhdHVyZXMgPSBmaWx0ZXJlZEZlYXR1cmVzO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBPZmNDb2luKHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGZ1bGxOYW1lLFxuICAgICAgbmV0d29yayxcbiAgICAgIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIGlzVG9rZW4sXG4gICAgICBhc3NldCxcbiAgICAgIGtpbmQsXG4gICAgICBhZGRyZXNzQ29pbixcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5UT04sXG4gICAgfSlcbiAgKTtcbn1cbiJdfQ==