@bitgo/account-lib 2.20.0-rc.32 → 2.20.0-rc.33

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 (179) hide show
  1. package/dist/resources/README.md +0 -22
  2. package/dist/src/index.d.ts +5 -5
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js +6 -6
  5. package/dist/tsconfig.tsbuildinfo +3552 -12209
  6. package/package.json +9 -12
  7. package/resources/README.md +0 -22
  8. package/dist/resources/trx/protobuf/Contract.proto +0 -256
  9. package/dist/resources/trx/protobuf/Discover.proto +0 -44
  10. package/dist/resources/trx/protobuf/tron.d.ts +0 -11024
  11. package/dist/resources/trx/protobuf/tron.js +0 -31510
  12. package/dist/resources/trx/protobuf/tron.proto +0 -677
  13. package/dist/src/coin/etc/index.d.ts +0 -6
  14. package/dist/src/coin/etc/index.d.ts.map +0 -1
  15. package/dist/src/coin/etc/index.js +0 -33
  16. package/dist/src/coin/etc/resources.d.ts +0 -10
  17. package/dist/src/coin/etc/resources.d.ts.map +0 -1
  18. package/dist/src/coin/etc/resources.js +0 -26
  19. package/dist/src/coin/etc/transactionBuilder.d.ts +0 -17
  20. package/dist/src/coin/etc/transactionBuilder.d.ts.map +0 -1
  21. package/dist/src/coin/etc/transactionBuilder.js +0 -45
  22. package/dist/src/coin/etc/transferBuilder.d.ts +0 -19
  23. package/dist/src/coin/etc/transferBuilder.d.ts.map +0 -1
  24. package/dist/src/coin/etc/transferBuilder.js +0 -27
  25. package/dist/src/coin/etc/utils.d.ts +0 -17
  26. package/dist/src/coin/etc/utils.d.ts.map +0 -1
  27. package/dist/src/coin/etc/utils.js +0 -42
  28. package/dist/src/coin/near/constants.d.ts +0 -12
  29. package/dist/src/coin/near/constants.d.ts.map +0 -1
  30. package/dist/src/coin/near/constants.js +0 -15
  31. package/dist/src/coin/near/contractCallWrapper.d.ts +0 -33
  32. package/dist/src/coin/near/contractCallWrapper.d.ts.map +0 -1
  33. package/dist/src/coin/near/contractCallWrapper.js +0 -68
  34. package/dist/src/coin/near/errors.d.ts +0 -5
  35. package/dist/src/coin/near/errors.d.ts.map +0 -1
  36. package/dist/src/coin/near/errors.js +0 -12
  37. package/dist/src/coin/near/iface.d.ts +0 -40
  38. package/dist/src/coin/near/iface.d.ts.map +0 -1
  39. package/dist/src/coin/near/iface.js +0 -8
  40. package/dist/src/coin/near/index.d.ts +0 -11
  41. package/dist/src/coin/near/index.d.ts.map +0 -1
  42. package/dist/src/coin/near/index.js +0 -41
  43. package/dist/src/coin/near/keyPair.d.ts +0 -25
  44. package/dist/src/coin/near/keyPair.d.ts.map +0 -1
  45. package/dist/src/coin/near/keyPair.js +0 -73
  46. package/dist/src/coin/near/stakingActivateBuilder.d.ts +0 -32
  47. package/dist/src/coin/near/stakingActivateBuilder.d.ts.map +0 -1
  48. package/dist/src/coin/near/stakingActivateBuilder.js +0 -90
  49. package/dist/src/coin/near/stakingDeactivateBuilder.d.ts +0 -32
  50. package/dist/src/coin/near/stakingDeactivateBuilder.d.ts.map +0 -1
  51. package/dist/src/coin/near/stakingDeactivateBuilder.js +0 -89
  52. package/dist/src/coin/near/stakingWithdrawBuilder.d.ts +0 -32
  53. package/dist/src/coin/near/stakingWithdrawBuilder.d.ts.map +0 -1
  54. package/dist/src/coin/near/stakingWithdrawBuilder.js +0 -89
  55. package/dist/src/coin/near/transaction.d.ts +0 -90
  56. package/dist/src/coin/near/transaction.d.ts.map +0 -1
  57. package/dist/src/coin/near/transaction.js +0 -368
  58. package/dist/src/coin/near/transactionBuilder.d.ts +0 -89
  59. package/dist/src/coin/near/transactionBuilder.d.ts.map +0 -1
  60. package/dist/src/coin/near/transactionBuilder.js +0 -216
  61. package/dist/src/coin/near/transactionBuilderFactory.d.ts +0 -30
  62. package/dist/src/coin/near/transactionBuilderFactory.d.ts.map +0 -1
  63. package/dist/src/coin/near/transactionBuilderFactory.js +0 -71
  64. package/dist/src/coin/near/transferBuilder.d.ts +0 -26
  65. package/dist/src/coin/near/transferBuilder.d.ts.map +0 -1
  66. package/dist/src/coin/near/transferBuilder.js +0 -72
  67. package/dist/src/coin/near/utils.d.ts +0 -42
  68. package/dist/src/coin/near/utils.d.ts.map +0 -1
  69. package/dist/src/coin/near/utils.js +0 -85
  70. package/dist/src/coin/near/walletInitializationBuilder.d.ts +0 -12
  71. package/dist/src/coin/near/walletInitializationBuilder.d.ts.map +0 -1
  72. package/dist/src/coin/near/walletInitializationBuilder.js +0 -20
  73. package/dist/src/coin/rbtc/index.d.ts +0 -6
  74. package/dist/src/coin/rbtc/index.d.ts.map +0 -1
  75. package/dist/src/coin/rbtc/index.js +0 -33
  76. package/dist/src/coin/rbtc/resources.d.ts +0 -10
  77. package/dist/src/coin/rbtc/resources.d.ts.map +0 -1
  78. package/dist/src/coin/rbtc/resources.js +0 -25
  79. package/dist/src/coin/rbtc/transactionBuilder.d.ts +0 -17
  80. package/dist/src/coin/rbtc/transactionBuilder.d.ts.map +0 -1
  81. package/dist/src/coin/rbtc/transactionBuilder.js +0 -44
  82. package/dist/src/coin/rbtc/transferBuilder.d.ts +0 -19
  83. package/dist/src/coin/rbtc/transferBuilder.d.ts.map +0 -1
  84. package/dist/src/coin/rbtc/transferBuilder.js +0 -27
  85. package/dist/src/coin/rbtc/utils.d.ts +0 -17
  86. package/dist/src/coin/rbtc/utils.d.ts.map +0 -1
  87. package/dist/src/coin/rbtc/utils.js +0 -42
  88. package/dist/src/coin/sol/ataInitializationBuilder.d.ts +0 -42
  89. package/dist/src/coin/sol/ataInitializationBuilder.d.ts.map +0 -1
  90. package/dist/src/coin/sol/ataInitializationBuilder.js +0 -112
  91. package/dist/src/coin/sol/ataInitializationTransaction.d.ts +0 -14
  92. package/dist/src/coin/sol/ataInitializationTransaction.d.ts.map +0 -1
  93. package/dist/src/coin/sol/ataInitializationTransaction.js +0 -81
  94. package/dist/src/coin/sol/constants.d.ts +0 -58
  95. package/dist/src/coin/sol/constants.d.ts.map +0 -1
  96. package/dist/src/coin/sol/constants.js +0 -76
  97. package/dist/src/coin/sol/iface.d.ts +0 -100
  98. package/dist/src/coin/sol/iface.d.ts.map +0 -1
  99. package/dist/src/coin/sol/iface.js +0 -3
  100. package/dist/src/coin/sol/index.d.ts +0 -11
  101. package/dist/src/coin/sol/index.d.ts.map +0 -1
  102. package/dist/src/coin/sol/index.js +0 -41
  103. package/dist/src/coin/sol/instructionParamsFactory.d.ts +0 -12
  104. package/dist/src/coin/sol/instructionParamsFactory.d.ts.map +0 -1
  105. package/dist/src/coin/sol/instructionParamsFactory.js +0 -267
  106. package/dist/src/coin/sol/keyPair.d.ts +0 -26
  107. package/dist/src/coin/sol/keyPair.d.ts.map +0 -1
  108. package/dist/src/coin/sol/keyPair.js +0 -63
  109. package/dist/src/coin/sol/solInstructionFactory.d.ts +0 -10
  110. package/dist/src/coin/sol/solInstructionFactory.d.ts.map +0 -1
  111. package/dist/src/coin/sol/solInstructionFactory.js +0 -213
  112. package/dist/src/coin/sol/stakingActivateBuilder.d.ts +0 -41
  113. package/dist/src/coin/sol/stakingActivateBuilder.d.ts.map +0 -1
  114. package/dist/src/coin/sol/stakingActivateBuilder.js +0 -94
  115. package/dist/src/coin/sol/stakingDeactivateBuilder.d.ts +0 -23
  116. package/dist/src/coin/sol/stakingDeactivateBuilder.d.ts.map +0 -1
  117. package/dist/src/coin/sol/stakingDeactivateBuilder.js +0 -62
  118. package/dist/src/coin/sol/stakingWithdrawBuilder.d.ts +0 -31
  119. package/dist/src/coin/sol/stakingWithdrawBuilder.d.ts.map +0 -1
  120. package/dist/src/coin/sol/stakingWithdrawBuilder.js +0 -78
  121. package/dist/src/coin/sol/tokenEncodeDecode.d.ts +0 -85
  122. package/dist/src/coin/sol/tokenEncodeDecode.d.ts.map +0 -1
  123. package/dist/src/coin/sol/tokenEncodeDecode.js +0 -133
  124. package/dist/src/coin/sol/tokenTransferBuilder.d.ts +0 -27
  125. package/dist/src/coin/sol/tokenTransferBuilder.d.ts.map +0 -1
  126. package/dist/src/coin/sol/tokenTransferBuilder.js +0 -73
  127. package/dist/src/coin/sol/transaction.d.ts +0 -61
  128. package/dist/src/coin/sol/transaction.d.ts.map +0 -1
  129. package/dist/src/coin/sol/transaction.js +0 -369
  130. package/dist/src/coin/sol/transactionBuilder.d.ts +0 -101
  131. package/dist/src/coin/sol/transactionBuilder.d.ts.map +0 -1
  132. package/dist/src/coin/sol/transactionBuilder.js +0 -261
  133. package/dist/src/coin/sol/transactionBuilderFactory.d.ts +0 -76
  134. package/dist/src/coin/sol/transactionBuilderFactory.d.ts.map +0 -1
  135. package/dist/src/coin/sol/transactionBuilderFactory.js +0 -136
  136. package/dist/src/coin/sol/transferBuilder.d.ts +0 -26
  137. package/dist/src/coin/sol/transferBuilder.d.ts.map +0 -1
  138. package/dist/src/coin/sol/transferBuilder.js +0 -67
  139. package/dist/src/coin/sol/utils.d.ts +0 -146
  140. package/dist/src/coin/sol/utils.d.ts.map +0 -1
  141. package/dist/src/coin/sol/utils.js +0 -361
  142. package/dist/src/coin/sol/walletInitializationBuilder.d.ts +0 -26
  143. package/dist/src/coin/sol/walletInitializationBuilder.d.ts.map +0 -1
  144. package/dist/src/coin/sol/walletInitializationBuilder.js +0 -71
  145. package/dist/src/coin/trx/address.d.ts +0 -11
  146. package/dist/src/coin/trx/address.d.ts.map +0 -1
  147. package/dist/src/coin/trx/address.js +0 -13
  148. package/dist/src/coin/trx/contractCallBuilder.d.ts +0 -96
  149. package/dist/src/coin/trx/contractCallBuilder.d.ts.map +0 -1
  150. package/dist/src/coin/trx/contractCallBuilder.js +0 -281
  151. package/dist/src/coin/trx/enum.d.ts +0 -23
  152. package/dist/src/coin/trx/enum.d.ts.map +0 -1
  153. package/dist/src/coin/trx/enum.js +0 -28
  154. package/dist/src/coin/trx/iface.d.ts +0 -92
  155. package/dist/src/coin/trx/iface.d.ts.map +0 -1
  156. package/dist/src/coin/trx/iface.js +0 -3
  157. package/dist/src/coin/trx/index.d.ts +0 -10
  158. package/dist/src/coin/trx/index.d.ts.map +0 -1
  159. package/dist/src/coin/trx/index.js +0 -39
  160. package/dist/src/coin/trx/keyPair.d.ts +0 -44
  161. package/dist/src/coin/trx/keyPair.d.ts.map +0 -1
  162. package/dist/src/coin/trx/keyPair.js +0 -121
  163. package/dist/src/coin/trx/transaction.d.ts +0 -74
  164. package/dist/src/coin/trx/transaction.d.ts.map +0 -1
  165. package/dist/src/coin/trx/transaction.js +0 -205
  166. package/dist/src/coin/trx/transactionBuilder.d.ts +0 -65
  167. package/dist/src/coin/trx/transactionBuilder.d.ts.map +0 -1
  168. package/dist/src/coin/trx/transactionBuilder.js +0 -215
  169. package/dist/src/coin/trx/utils.d.ts +0 -127
  170. package/dist/src/coin/trx/utils.d.ts.map +0 -1
  171. package/dist/src/coin/trx/utils.js +0 -369
  172. package/dist/src/coin/trx/wrappedBuilder.d.ts +0 -52
  173. package/dist/src/coin/trx/wrappedBuilder.d.ts.map +0 -1
  174. package/dist/src/coin/trx/wrappedBuilder.js +0 -104
  175. package/resources/trx/protobuf/Contract.proto +0 -256
  176. package/resources/trx/protobuf/Discover.proto +0 -44
  177. package/resources/trx/protobuf/tron.d.ts +0 -11024
  178. package/resources/trx/protobuf/tron.js +0 -31510
  179. package/resources/trx/protobuf/tron.proto +0 -677
@@ -1,205 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Transaction = void 0;
7
- const crypto_1 = require("crypto");
8
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
- const tron_1 = require("../../../resources/trx/protobuf/tron");
10
- const sdk_core_1 = require("@bitgo/sdk-core");
11
- const enum_1 = require("./enum");
12
- const utils_1 = require("./utils");
13
- /**
14
- * Tron transaction model.
15
- */
16
- class Transaction extends sdk_core_1.BaseTransaction {
17
- /**
18
- * Public constructor.
19
- *
20
- * @param coinConfig
21
- * @param rawTransaction
22
- */
23
- constructor(coinConfig, rawTransaction) {
24
- super(coinConfig);
25
- if (rawTransaction) {
26
- if (!rawTransaction.txID) {
27
- throw new sdk_core_1.ParseTransactionError('Transaction has no id');
28
- }
29
- this._id = rawTransaction.txID;
30
- this._transaction = rawTransaction;
31
- this._decodedRawDataHex = utils_1.decodeTransaction(rawTransaction.raw_data_hex);
32
- // Destination depends on the contract type
33
- this.recordRawDataFields(this._decodedRawDataHex);
34
- }
35
- }
36
- /**
37
- * Parse the transaction raw data and record the most important fields.
38
- *
39
- * @param rawData Object from a tron transaction
40
- */
41
- recordRawDataFields(rawData) {
42
- // Contract-agnostic fields
43
- this._validFrom = rawData.timestamp;
44
- this._validTo = rawData.expiration;
45
- let output, input;
46
- // Contract-specific fields
47
- switch (rawData.contractType) {
48
- case enum_1.ContractType.Transfer:
49
- this._type = sdk_core_1.TransactionType.Send;
50
- const value = new bignumber_js_1.default(rawData.contract[0].parameter.value.amount).toFixed(0);
51
- output = {
52
- address: rawData.contract[0].parameter.value.to_address,
53
- value,
54
- };
55
- input = {
56
- address: rawData.contract[0].parameter.value.owner_address,
57
- value,
58
- };
59
- break;
60
- case enum_1.ContractType.AccountPermissionUpdate:
61
- this._type = sdk_core_1.TransactionType.WalletInitialization;
62
- output = {
63
- address: rawData.contract.owner_address,
64
- value: '0',
65
- };
66
- input = {
67
- address: rawData.contract.owner_address,
68
- value: '0',
69
- };
70
- break;
71
- case enum_1.ContractType.TriggerSmartContract:
72
- this._type = sdk_core_1.TransactionType.ContractCall;
73
- const contractCallValues = rawData.contract[0].parameter.value;
74
- output = {
75
- address: contractCallValues.owner_address,
76
- value: '0',
77
- };
78
- input = {
79
- address: contractCallValues.owner_address,
80
- contractAddress: contractCallValues.contract_address,
81
- data: contractCallValues.data,
82
- value: '0',
83
- };
84
- break;
85
- default:
86
- throw new sdk_core_1.ParseTransactionError('Unsupported contract type');
87
- }
88
- this._inputs = [input];
89
- this._outputs = [output];
90
- }
91
- /**
92
- * Recalculate and update the transaction id. This should be done after changing any transaction
93
- * field since the the id is a hash of the transaction body.
94
- */
95
- updateId() {
96
- if (!this._transaction) {
97
- throw new sdk_core_1.ParseTransactionError('Empty transaction');
98
- }
99
- const hexBuffer = Buffer.from(this._transaction.raw_data_hex, 'hex');
100
- const newTxid = crypto_1.createHash('sha256').update(hexBuffer).digest('hex');
101
- this._transaction.txID = newTxid;
102
- this._id = newTxid;
103
- }
104
- /**
105
- * Extend the expiration date by the given number of milliseconds.
106
- *
107
- * @param extensionMs The number of milliseconds to extend the expiration by
108
- */
109
- extendExpiration(extensionMs) {
110
- if (extensionMs < 0) {
111
- throw new sdk_core_1.ExtendTransactionError('Invalid extension range. Must be positive a integer');
112
- }
113
- if (!this._transaction) {
114
- throw new sdk_core_1.ExtendTransactionError('Empty transaction');
115
- }
116
- if (this._transaction.signature && this._transaction.signature.length > 0) {
117
- throw new sdk_core_1.ExtendTransactionError('Cannot extend a signed transaction');
118
- }
119
- const rawDataHex = this._transaction.raw_data_hex;
120
- const bytes = Buffer.from(rawDataHex, 'hex');
121
- let raw;
122
- try {
123
- raw = tron_1.protocol.Transaction.raw.decode(bytes);
124
- const newExpiration = new bignumber_js_1.default(raw.expiration).plus(extensionMs).toNumber();
125
- raw.expiration = newExpiration;
126
- const newRawDataHex = Buffer.from(tron_1.protocol.Transaction.raw.encode(raw).finish()).toString('hex');
127
- // Set the internal variables to account for the new expiration date
128
- this._transaction.raw_data_hex = newRawDataHex;
129
- this._transaction.raw_data.expiration = newExpiration;
130
- this._decodedRawDataHex = utils_1.decodeTransaction(newRawDataHex);
131
- this.recordRawDataFields(this._decodedRawDataHex);
132
- this.updateId();
133
- }
134
- catch (e) {
135
- throw new sdk_core_1.ExtendTransactionError('There was an error decoding the initial raw_data_hex from the serialized tx.');
136
- }
137
- }
138
- /**
139
- * Get the signatures associated with this transaction.
140
- */
141
- get signature() {
142
- if (this._transaction && this._transaction.signature) {
143
- return this._transaction.signature;
144
- }
145
- return [];
146
- }
147
- /**
148
- * Get the time in milliseconds this transaction becomes valid and can be broadcasted to the
149
- * network.
150
- */
151
- get validFrom() {
152
- return this._validFrom;
153
- }
154
- /**
155
- * Get the expiration time in milliseconds.
156
- */
157
- get validTo() {
158
- return this._validTo;
159
- }
160
- /** @inheritdoc */
161
- get outputs() {
162
- return this._outputs;
163
- }
164
- /** @inheritdoc */
165
- get inputs() {
166
- return this._inputs;
167
- }
168
- /** @inheritdoc */
169
- canSign(key) {
170
- // Tron transaction do not contain the owners account address so it is not possible to check the
171
- // private key with any but the account main address. This is not enough to fail this check, so
172
- // it is a no-op.
173
- return true;
174
- }
175
- /**
176
- * Sets this transaction
177
- *
178
- * @param {Transaction} tx transaction
179
- */
180
- setTransactionReceipt(tx) {
181
- this._transaction = tx;
182
- this.updateId();
183
- }
184
- /**
185
- * Set the transaction type
186
- *
187
- * @param {TransactionType} transactionType The transaction type to be set
188
- */
189
- setTransactionType(transactionType) {
190
- this._type = transactionType;
191
- }
192
- /** @inheritdoc */
193
- toJson() {
194
- if (!this._transaction) {
195
- throw new sdk_core_1.ParseTransactionError('Empty transaction');
196
- }
197
- return this._transaction;
198
- }
199
- /** @inheritdoc */
200
- toBroadcastFormat() {
201
- return JSON.stringify(this.toJson());
202
- }
203
- }
204
- exports.Transaction = Transaction;
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi90cngvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbUNBQW9DO0FBRXBDLGdFQUFxQztBQUNyQywrREFBZ0U7QUFDaEUsOENBTXlCO0FBQ3pCLGlDQUFzQztBQUN0QyxtQ0FBNEM7QUFHNUM7O0dBRUc7QUFDSCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQVU5Qzs7Ozs7T0FLRztJQUNILFlBQVksVUFBZ0MsRUFBRSxjQUFtQztRQUMvRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEIsSUFBSSxjQUFjLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3hCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDO1lBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyx5QkFBaUIsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFekUsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsT0FBZ0I7UUFDMUMsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFFbkMsSUFBSSxNQUFxQixFQUFFLEtBQW9CLENBQUM7UUFDaEQsMkJBQTJCO1FBQzNCLFFBQVEsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUM1QixLQUFLLG1CQUFZLENBQUMsUUFBUTtnQkFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRywwQkFBZSxDQUFDLElBQUksQ0FBQztnQkFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxzQkFBUyxDQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFzQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RyxNQUFNLEdBQUc7b0JBQ1AsT0FBTyxFQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFzQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDN0UsS0FBSztpQkFDTixDQUFDO2dCQUNGLEtBQUssR0FBRztvQkFDTixPQUFPLEVBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQXNCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhO29CQUNoRixLQUFLO2lCQUNOLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssbUJBQVksQ0FBQyx1QkFBdUI7Z0JBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbEQsTUFBTSxHQUFHO29CQUNQLE9BQU8sRUFBRyxPQUFPLENBQUMsUUFBZ0IsQ0FBQyxhQUFhO29CQUNoRCxLQUFLLEVBQUUsR0FBRztpQkFDWCxDQUFDO2dCQUNGLEtBQUssR0FBRztvQkFDTixPQUFPLEVBQUcsT0FBTyxDQUFDLFFBQWdCLENBQUMsYUFBYTtvQkFDaEQsS0FBSyxFQUFFLEdBQUc7aUJBQ1gsQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxtQkFBWSxDQUFDLG9CQUFvQjtnQkFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRywwQkFBZSxDQUFDLFlBQVksQ0FBQztnQkFDMUMsTUFBTSxrQkFBa0IsR0FBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBMEIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUN6RixNQUFNLEdBQUc7b0JBQ1AsT0FBTyxFQUFFLGtCQUFrQixDQUFDLGFBQWE7b0JBQ3pDLEtBQUssRUFBRSxHQUFHO2lCQUNYLENBQUM7Z0JBQ0YsS0FBSyxHQUFHO29CQUNOLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxhQUFhO29CQUN6QyxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZ0JBQWdCO29CQUNwRCxJQUFJLEVBQUUsa0JBQWtCLENBQUMsSUFBSTtvQkFDN0IsS0FBSyxFQUFFLEdBQUc7aUJBQ1gsQ0FBQztnQkFDRixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDaEU7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxRQUFRO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEQ7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sT0FBTyxHQUFHLG1CQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxXQUFtQjtRQUNsQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxJQUFJLGlDQUFzQixDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDekY7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixNQUFNLElBQUksaUNBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6RSxNQUFNLElBQUksaUNBQXNCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN4RTtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSTtZQUNGLEdBQUcsR0FBRyxlQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxzQkFBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakYsR0FBRyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7WUFDL0IsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakcsb0VBQW9FO1lBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztZQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBQ3RELElBQUksQ0FBQyxrQkFBa0IsR0FBRyx5QkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLElBQUksaUNBQXNCLENBQUMsOEVBQThFLENBQUMsQ0FBQztTQUNsSDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtZQUNwRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE9BQU8sQ0FBQyxHQUFZO1FBQ2xCLGdHQUFnRztRQUNoRywrRkFBK0Y7UUFDL0YsaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxFQUFzQjtRQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxlQUFnQztRQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztJQUMvQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixNQUFNLElBQUksZ0NBQXFCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN0RDtRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFwTkQsa0NBb05DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgcHJvdG9jb2wgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvdHJ4L3Byb3RvYnVmL3Ryb24nO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFeHRlbmRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IENvbnRyYWN0VHlwZSB9IGZyb20gJy4vZW51bSc7XG5pbXBvcnQgeyBkZWNvZGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQ29udHJhY3RFbnRyeSwgUmF3RGF0YSwgVHJhbnNhY3Rpb25SZWNlaXB0LCBUcmFuc2ZlckNvbnRyYWN0LCBUcmlnZ2VyU21hcnRDb250cmFjdCB9IGZyb20gJy4vaWZhY2UnO1xuXG4vKipcbiAqIFRyb24gdHJhbnNhY3Rpb24gbW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIC8vIFRyb24gc3BlY2lmaWMgZmllbGRzXG4gIHByb3RlY3RlZCBfdmFsaWRGcm9tOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdmFsaWRUbzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX2lucHV0czogQ29udHJhY3RFbnRyeVtdO1xuICBwcm90ZWN0ZWQgX291dHB1dHM6IENvbnRyYWN0RW50cnlbXTtcblxuICBwcml2YXRlIF9kZWNvZGVkUmF3RGF0YUhleDogUmF3RGF0YTtcbiAgcHJpdmF0ZSBfdHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvblJlY2VpcHQ7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIGNvaW5Db25maWdcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPiwgcmF3VHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvblJlY2VpcHQpIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICBpZiAocmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIGlmICghcmF3VHJhbnNhY3Rpb24udHhJRCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBoYXMgbm8gaWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lkID0gcmF3VHJhbnNhY3Rpb24udHhJRDtcbiAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gcmF3VHJhbnNhY3Rpb247XG4gICAgICB0aGlzLl9kZWNvZGVkUmF3RGF0YUhleCA9IGRlY29kZVRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uLnJhd19kYXRhX2hleCk7XG5cbiAgICAgIC8vIERlc3RpbmF0aW9uIGRlcGVuZHMgb24gdGhlIGNvbnRyYWN0IHR5cGVcbiAgICAgIHRoaXMucmVjb3JkUmF3RGF0YUZpZWxkcyh0aGlzLl9kZWNvZGVkUmF3RGF0YUhleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSB0cmFuc2FjdGlvbiByYXcgZGF0YSBhbmQgcmVjb3JkIHRoZSBtb3N0IGltcG9ydGFudCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSByYXdEYXRhIE9iamVjdCBmcm9tIGEgdHJvbiB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRSYXdEYXRhRmllbGRzKHJhd0RhdGE6IFJhd0RhdGEpIHtcbiAgICAvLyBDb250cmFjdC1hZ25vc3RpYyBmaWVsZHNcbiAgICB0aGlzLl92YWxpZEZyb20gPSByYXdEYXRhLnRpbWVzdGFtcDtcbiAgICB0aGlzLl92YWxpZFRvID0gcmF3RGF0YS5leHBpcmF0aW9uO1xuXG4gICAgbGV0IG91dHB1dDogQ29udHJhY3RFbnRyeSwgaW5wdXQ6IENvbnRyYWN0RW50cnk7XG4gICAgLy8gQ29udHJhY3Qtc3BlY2lmaWMgZmllbGRzXG4gICAgc3dpdGNoIChyYXdEYXRhLmNvbnRyYWN0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdFR5cGUuVHJhbnNmZXI6XG4gICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgQmlnTnVtYmVyKChyYXdEYXRhLmNvbnRyYWN0WzBdIGFzIFRyYW5zZmVyQ29udHJhY3QpLnBhcmFtZXRlci52YWx1ZS5hbW91bnQpLnRvRml4ZWQoMCk7XG4gICAgICAgIG91dHB1dCA9IHtcbiAgICAgICAgICBhZGRyZXNzOiAocmF3RGF0YS5jb250cmFjdFswXSBhcyBUcmFuc2ZlckNvbnRyYWN0KS5wYXJhbWV0ZXIudmFsdWUudG9fYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgYWRkcmVzczogKHJhd0RhdGEuY29udHJhY3RbMF0gYXMgVHJhbnNmZXJDb250cmFjdCkucGFyYW1ldGVyLnZhbHVlLm93bmVyX2FkZHJlc3MsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb250cmFjdFR5cGUuQWNjb3VudFBlcm1pc3Npb25VcGRhdGU6XG4gICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gICAgICAgIG91dHB1dCA9IHtcbiAgICAgICAgICBhZGRyZXNzOiAocmF3RGF0YS5jb250cmFjdCBhcyBhbnkpLm93bmVyX2FkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgfTtcbiAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgYWRkcmVzczogKHJhd0RhdGEuY29udHJhY3QgYXMgYW55KS5vd25lcl9hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb250cmFjdFR5cGUuVHJpZ2dlclNtYXJ0Q29udHJhY3Q6XG4gICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgICAgICBjb25zdCBjb250cmFjdENhbGxWYWx1ZXMgPSAocmF3RGF0YS5jb250cmFjdFswXSBhcyBUcmlnZ2VyU21hcnRDb250cmFjdCkucGFyYW1ldGVyLnZhbHVlO1xuICAgICAgICBvdXRwdXQgPSB7XG4gICAgICAgICAgYWRkcmVzczogY29udHJhY3RDYWxsVmFsdWVzLm93bmVyX2FkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgfTtcbiAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgYWRkcmVzczogY29udHJhY3RDYWxsVmFsdWVzLm93bmVyX2FkZHJlc3MsXG4gICAgICAgICAgY29udHJhY3RBZGRyZXNzOiBjb250cmFjdENhbGxWYWx1ZXMuY29udHJhY3RfYWRkcmVzcyxcbiAgICAgICAgICBkYXRhOiBjb250cmFjdENhbGxWYWx1ZXMuZGF0YSxcbiAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbnRyYWN0IHR5cGUnKTtcbiAgICB9XG4gICAgdGhpcy5faW5wdXRzID0gW2lucHV0XTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW291dHB1dF07XG4gIH1cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgdHJhbnNhY3Rpb24gaWQuIFRoaXMgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgY2hhbmdpbmcgYW55IHRyYW5zYWN0aW9uXG4gICAqIGZpZWxkIHNpbmNlIHRoZSB0aGUgaWQgaXMgYSBoYXNoIG9mIHRoZSB0cmFuc2FjdGlvbiBib2R5LlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVJZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBoZXhCdWZmZXIgPSBCdWZmZXIuZnJvbSh0aGlzLl90cmFuc2FjdGlvbi5yYXdfZGF0YV9oZXgsICdoZXgnKTtcbiAgICBjb25zdCBuZXdUeGlkID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGhleEJ1ZmZlcikuZGlnZXN0KCdoZXgnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi50eElEID0gbmV3VHhpZDtcbiAgICB0aGlzLl9pZCA9IG5ld1R4aWQ7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHRoZSBleHBpcmF0aW9uIGRhdGUgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBleHRlbnNpb25NcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBleHRlbmQgdGhlIGV4cGlyYXRpb24gYnlcbiAgICovXG4gIGV4dGVuZEV4cGlyYXRpb24oZXh0ZW5zaW9uTXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChleHRlbnNpb25NcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFeHRlbmRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGV4dGVuc2lvbiByYW5nZS4gTXVzdCBiZSBwb3NpdGl2ZSBhIGludGVnZXInKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlICYmIHRoaXMuX3RyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignQ2Fubm90IGV4dGVuZCBhIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJhd0RhdGFIZXggPSB0aGlzLl90cmFuc2FjdGlvbi5yYXdfZGF0YV9oZXg7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbShyYXdEYXRhSGV4LCAnaGV4Jyk7XG4gICAgbGV0IHJhdztcbiAgICB0cnkge1xuICAgICAgcmF3ID0gcHJvdG9jb2wuVHJhbnNhY3Rpb24ucmF3LmRlY29kZShieXRlcyk7XG4gICAgICBjb25zdCBuZXdFeHBpcmF0aW9uID0gbmV3IEJpZ051bWJlcihyYXcuZXhwaXJhdGlvbikucGx1cyhleHRlbnNpb25NcykudG9OdW1iZXIoKTtcbiAgICAgIHJhdy5leHBpcmF0aW9uID0gbmV3RXhwaXJhdGlvbjtcbiAgICAgIGNvbnN0IG5ld1Jhd0RhdGFIZXggPSBCdWZmZXIuZnJvbShwcm90b2NvbC5UcmFuc2FjdGlvbi5yYXcuZW5jb2RlKHJhdykuZmluaXNoKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFNldCB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgZXhwaXJhdGlvbiBkYXRlXG4gICAgICB0aGlzLl90cmFuc2FjdGlvbi5yYXdfZGF0YV9oZXggPSBuZXdSYXdEYXRhSGV4O1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24ucmF3X2RhdGEuZXhwaXJhdGlvbiA9IG5ld0V4cGlyYXRpb247XG4gICAgICB0aGlzLl9kZWNvZGVkUmF3RGF0YUhleCA9IGRlY29kZVRyYW5zYWN0aW9uKG5ld1Jhd0RhdGFIZXgpO1xuICAgICAgdGhpcy5yZWNvcmRSYXdEYXRhRmllbGRzKHRoaXMuX2RlY29kZWRSYXdEYXRhSGV4KTtcbiAgICAgIHRoaXMudXBkYXRlSWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIGRlY29kaW5nIHRoZSBpbml0aWFsIHJhd19kYXRhX2hleCBmcm9tIHRoZSBzZXJpYWxpemVkIHR4LicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNpZ25hdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24gJiYgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhpcyB0cmFuc2FjdGlvbiBiZWNvbWVzIHZhbGlkIGFuZCBjYW4gYmUgYnJvYWRjYXN0ZWQgdG8gdGhlXG4gICAqIG5ldHdvcmsuXG4gICAqL1xuICBnZXQgdmFsaWRGcm9tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkRnJvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4cGlyYXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBnZXQgdmFsaWRUbygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWxpZFRvO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldCBvdXRwdXRzKCk6IENvbnRyYWN0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX291dHB1dHM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0IGlucHV0cygpOiBDb250cmFjdEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dHM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUcm9uIHRyYW5zYWN0aW9uIGRvIG5vdCBjb250YWluIHRoZSBvd25lcnMgYWNjb3VudCBhZGRyZXNzIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjaGVjayB0aGVcbiAgICAvLyBwcml2YXRlIGtleSB3aXRoIGFueSBidXQgdGhlIGFjY291bnQgbWFpbiBhZGRyZXNzLiBUaGlzIGlzIG5vdCBlbm91Z2ggdG8gZmFpbCB0aGlzIGNoZWNrLCBzb1xuICAgIC8vIGl0IGlzIGEgbm8tb3AuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHR4IHRyYW5zYWN0aW9uXG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblJlY2VpcHQodHg6IFRyYW5zYWN0aW9uUmVjZWlwdCkge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHg7XG4gICAgdGhpcy51cGRhdGVJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKTogVHJhbnNhY3Rpb25SZWNlaXB0IHtcbiAgICBpZiAoIXRoaXMuX3RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogYW55IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pzb24oKSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,65 +0,0 @@
1
- import BigNumber from 'bignumber.js';
2
- import { BaseCoin as CoinConfig } from '@bitgo/statics';
3
- import { BaseKey, BaseTransactionBuilder } from '@bitgo/sdk-core';
4
- import { TransactionReceipt } from './iface';
5
- import { Address } from './address';
6
- import { Transaction } from './transaction';
7
- /**
8
- * Tron transaction builder.
9
- */
10
- export declare class TransactionBuilder extends BaseTransactionBuilder {
11
- private _transaction;
12
- /**
13
- * Public constructor.
14
- *
15
- * @param {CoinConfig} _coinConfig Configuration object
16
- */
17
- constructor(_coinConfig: Readonly<CoinConfig>);
18
- /**
19
- * Parse transaction takes in raw JSON directly from the node.
20
- *
21
- * @param {TransactionReceipt} rawTransaction The Tron transaction in JSON format as returned by the Tron lib or a stringifyed version of such JSON.
22
- * @returns {Transaction} Tron transaction
23
- */
24
- protected fromImplementation(rawTransaction: TransactionReceipt | string): Transaction;
25
- /** @inheritdoc */
26
- protected signImplementation(key: BaseKey): Transaction;
27
- protected applySignature(key: BaseKey): Transaction;
28
- /** @inheritdoc */
29
- protected buildImplementation(): Promise<Transaction>;
30
- initBuilder(tx: TransactionReceipt | string): void;
31
- /**
32
- * Extend the validity of this transaction by the given amount of time
33
- *
34
- * @param {number} extensionMs The number of milliseconds to extend the validTo time
35
- * @returns {undefined}
36
- */
37
- extendValidTo(extensionMs: number): void;
38
- /** @inheritdoc */
39
- validateValue(value: BigNumber): void;
40
- /** @inheritdoc */
41
- validateAddress(address: Address): void;
42
- /** @inheritdoc */
43
- validateKey(key: BaseKey): void;
44
- /**
45
- * Validate the contents of a raw transaction. The validation
46
- * phase is to compare the raw-data-hex to the raw-data of the
47
- * transaction.
48
- *
49
- * The contents to be validated are
50
- * 1. The transaction id
51
- * 2. The expiration date
52
- * 3. The timestamp
53
- * 4. The contract
54
- *
55
- * @param {TransactionReceipt | string} rawTransaction The raw transaction to be validated
56
- */
57
- validateRawTransaction(rawTransaction: TransactionReceipt | string): void;
58
- /** @inheritdoc */
59
- validateTransaction(transaction: Transaction): void;
60
- /** @inheritdoc */
61
- protected get transaction(): Transaction;
62
- /** @inheritdoc */
63
- protected set transaction(transaction: Transaction);
64
- }
65
- //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../../src/coin/trx/transactionBuilder.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,OAAO,EACP,sBAAsB,EAKvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,sBAAsB;IAE5D,OAAO,CAAC,YAAY,CAAc;IAClC;;;;OAIG;gBACS,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,GAAG,WAAW;IAWtF,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAWvD,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAuBnD,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAQ3D,WAAW,CAAC,EAAE,EAAE,kBAAkB,GAAG,MAAM;IAI3C;;;;;OAKG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIxC,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAWrC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOvC,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAQ/B;;;;;;;;;;;;OAYG;IACH,sBAAsB,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI;IA2CzE,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAQnD,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;CACF"}
@@ -1,215 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- var __importDefault = (this && this.__importDefault) || function (mod) {
22
- return (mod && mod.__esModule) ? mod : { "default": mod };
23
- };
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.TransactionBuilder = void 0;
26
- const crypto_1 = require("crypto");
27
- const _ = __importStar(require("lodash"));
28
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
29
- const sdk_core_1 = require("@bitgo/sdk-core");
30
- const utils_1 = require("./utils");
31
- const transaction_1 = require("./transaction");
32
- const keyPair_1 = require("./keyPair");
33
- /**
34
- * Tron transaction builder.
35
- */
36
- class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
37
- /**
38
- * Public constructor.
39
- *
40
- * @param {CoinConfig} _coinConfig Configuration object
41
- */
42
- constructor(_coinConfig) {
43
- super(_coinConfig);
44
- }
45
- /**
46
- * Parse transaction takes in raw JSON directly from the node.
47
- *
48
- * @param {TransactionReceipt} rawTransaction The Tron transaction in JSON format as returned by the Tron lib or a stringifyed version of such JSON.
49
- * @returns {Transaction} Tron transaction
50
- */
51
- fromImplementation(rawTransaction) {
52
- let tx;
53
- if (typeof rawTransaction === 'string') {
54
- const transaction = JSON.parse(rawTransaction);
55
- tx = new transaction_1.Transaction(this._coinConfig, transaction);
56
- }
57
- else {
58
- tx = new transaction_1.Transaction(this._coinConfig, rawTransaction);
59
- }
60
- return tx;
61
- }
62
- /** @inheritdoc */
63
- signImplementation(key) {
64
- if (!this.transaction.inputs) {
65
- throw new sdk_core_1.SigningError('Transaction has no sender');
66
- }
67
- if (!this.transaction.outputs) {
68
- throw new sdk_core_1.SigningError('Transaction has no receiver');
69
- }
70
- return this.applySignature(key);
71
- }
72
- applySignature(key) {
73
- const oldTransaction = this.transaction.toJson();
74
- // Store the original signatures to compare them with the new ones in a later step. Signatures
75
- // can be undefined if this is the first time the transaction is being signed
76
- const oldSignatureCount = oldTransaction.signature ? oldTransaction.signature.length : 0;
77
- let signedTransaction;
78
- try {
79
- const keyPair = new keyPair_1.KeyPair({ prv: key.key });
80
- // Since the key pair was generated using a private key, it will always have a prv attribute,
81
- // hence it is safe to use non-null operator
82
- signedTransaction = utils_1.signTransaction(keyPair.getKeys().prv, this.transaction.toJson());
83
- }
84
- catch (e) {
85
- throw new sdk_core_1.SigningError('Failed to sign transaction via helper.');
86
- }
87
- // Ensure that we have more signatures than what we started with
88
- if (!signedTransaction.signature || oldSignatureCount >= signedTransaction.signature.length) {
89
- throw new sdk_core_1.SigningError('Transaction signing did not return an additional signature.');
90
- }
91
- return new transaction_1.Transaction(this._coinConfig, signedTransaction);
92
- }
93
- /** @inheritdoc */
94
- async buildImplementation() {
95
- // This is a no-op since Tron transactions are built from
96
- if (!this.transaction.id) {
97
- throw new sdk_core_1.BuildTransactionError('A valid transaction must have an id');
98
- }
99
- return Promise.resolve(this.transaction);
100
- }
101
- initBuilder(tx) {
102
- this.transaction = this.fromImplementation(tx);
103
- }
104
- /**
105
- * Extend the validity of this transaction by the given amount of time
106
- *
107
- * @param {number} extensionMs The number of milliseconds to extend the validTo time
108
- * @returns {undefined}
109
- */
110
- extendValidTo(extensionMs) {
111
- this.transaction.extendExpiration(extensionMs);
112
- }
113
- /** @inheritdoc */
114
- validateValue(value) {
115
- if (value.isLessThanOrEqualTo(0)) {
116
- throw new Error('Value cannot be below zero.');
117
- }
118
- // max long in Java - assumed upper limit for a TRX transaction
119
- if (value.isGreaterThan(new bignumber_js_1.default('9223372036854775807'))) {
120
- throw new Error('Value cannot be greater than handled by the javatron node.');
121
- }
122
- }
123
- /** @inheritdoc */
124
- validateAddress(address) {
125
- // assumes a base 58 address for our addresses
126
- if (!utils_1.isBase58Address(address.address)) {
127
- throw new Error(address.address + ' is not a valid base58 address.');
128
- }
129
- }
130
- /** @inheritdoc */
131
- validateKey(key) {
132
- try {
133
- new keyPair_1.KeyPair({ prv: key.key });
134
- }
135
- catch (err) {
136
- throw new Error('The provided key is not valid');
137
- }
138
- }
139
- /**
140
- * Validate the contents of a raw transaction. The validation
141
- * phase is to compare the raw-data-hex to the raw-data of the
142
- * transaction.
143
- *
144
- * The contents to be validated are
145
- * 1. The transaction id
146
- * 2. The expiration date
147
- * 3. The timestamp
148
- * 4. The contract
149
- *
150
- * @param {TransactionReceipt | string} rawTransaction The raw transaction to be validated
151
- */
152
- validateRawTransaction(rawTransaction) {
153
- // TODO: Validation of signature
154
- if (!rawTransaction) {
155
- throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
156
- }
157
- let currTransaction;
158
- // rawTransaction can be either Stringified JSON OR
159
- // it can be a regular JSON object (not stringified).
160
- if (typeof rawTransaction === 'string') {
161
- try {
162
- currTransaction = JSON.parse(rawTransaction);
163
- }
164
- catch (e) {
165
- throw new sdk_core_1.ParseTransactionError('There was error in parsing the JSON string');
166
- }
167
- }
168
- else if (_.isObject(rawTransaction)) {
169
- currTransaction = rawTransaction;
170
- }
171
- else {
172
- throw new sdk_core_1.InvalidTransactionError('Transaction is not an object or stringified json');
173
- }
174
- const decodedRawDataHex = utils_1.decodeTransaction(currTransaction.raw_data_hex);
175
- if (!currTransaction.txID) {
176
- throw new sdk_core_1.InvalidTransactionError('Transaction ID is empty');
177
- }
178
- // Validate the transaction ID from the raw data hex
179
- const hexBuffer = Buffer.from(currTransaction.raw_data_hex, 'hex');
180
- const currTxID = crypto_1.createHash('sha256').update(hexBuffer).digest('hex');
181
- if (currTransaction.txID !== currTxID) {
182
- throw new sdk_core_1.InvalidTransactionError('Transaction has not have a valid id');
183
- }
184
- // Validate the expiration time from the raw-data-hex
185
- if (currTransaction.raw_data.expiration !== decodedRawDataHex.expiration) {
186
- throw new sdk_core_1.InvalidTransactionError('Transaction has not have a valid expiration');
187
- }
188
- // Validate the timestamp from the raw-data-hex
189
- if (currTransaction.raw_data.timestamp !== decodedRawDataHex.timestamp) {
190
- throw new sdk_core_1.InvalidTransactionError('Transaction has not have a valid timetamp');
191
- }
192
- // Transaction contract must exist
193
- if (!currTransaction.raw_data.contract) {
194
- throw new sdk_core_1.InvalidTransactionError('Transaction contracts are empty');
195
- }
196
- }
197
- /** @inheritdoc */
198
- validateTransaction(transaction) {
199
- const hexBuffer = Buffer.from(transaction.toJson().raw_data_hex, 'hex');
200
- const txId = crypto_1.createHash('sha256').update(hexBuffer).digest('hex');
201
- if (transaction.id !== txId) {
202
- throw new sdk_core_1.InvalidTransactionError(transaction.id + ' is not a valid transaction id. Expecting: ' + txId);
203
- }
204
- }
205
- /** @inheritdoc */
206
- get transaction() {
207
- return this._transaction;
208
- }
209
- /** @inheritdoc */
210
- set transaction(transaction) {
211
- this._transaction = transaction;
212
- }
213
- }
214
- exports.TransactionBuilder = TransactionBuilder;
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvaW4vdHJ4L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW9DO0FBQ3BDLDBDQUE0QjtBQUM1QixnRUFBcUM7QUFFckMsOENBT3lCO0FBR3pCLG1DQUE4RTtBQUM5RSwrQ0FBNEM7QUFDNUMsdUNBQW9DO0FBRXBDOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxpQ0FBc0I7SUFHNUQ7Ozs7T0FJRztJQUNILFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGtCQUFrQixDQUFDLGNBQTJDO1FBQ3RFLElBQUksRUFBRSxDQUFDO1FBQ1AsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUU7WUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvQyxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUN4RDtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtCQUFrQjtJQUNSLGtCQUFrQixDQUFDLEdBQVk7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQzVCLE1BQU0sSUFBSSx1QkFBWSxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDckQ7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDN0IsTUFBTSxJQUFJLHVCQUFZLENB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bEIsSUFBYyxXQUFXLENBQUMsV0FBd0I7UUFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBOUxELGdEQThMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25SZWNlaXB0IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBBZGRyZXNzIH0gZnJvbSAnLi9hZGRyZXNzJztcbmltcG9ydCB7IHNpZ25UcmFuc2FjdGlvbiwgaXNCYXNlNThBZGRyZXNzLCBkZWNvZGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuXG4vKipcbiAqIFRyb24gdHJhbnNhY3Rpb24gYnVpbGRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAvLyB0cmFuc2FjdGlvbiBiZWluZyBidWlsdFxuICBwcml2YXRlIF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29pbkNvbmZpZ30gX2NvaW5Db25maWcgQ29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSB0cmFuc2FjdGlvbiB0YWtlcyBpbiByYXcgSlNPTiBkaXJlY3RseSBmcm9tIHRoZSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uUmVjZWlwdH0gcmF3VHJhbnNhY3Rpb24gVGhlIFRyb24gdHJhbnNhY3Rpb24gaW4gSlNPTiBmb3JtYXQgYXMgcmV0dXJuZWQgYnkgdGhlIFRyb24gbGliIG9yIGEgc3RyaW5naWZ5ZWQgdmVyc2lvbiBvZiBzdWNoIEpTT04uXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbn0gVHJvbiB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25SZWNlaXB0IHwgc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGxldCB0eDtcbiAgICBpZiAodHlwZW9mIHJhd1RyYW5zYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBKU09OLnBhcnNlKHJhd1RyYW5zYWN0aW9uKTtcbiAgICAgIHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcsIHRyYW5zYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHggPSBuZXcgVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZywgcmF3VHJhbnNhY3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLmlucHV0cykge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vIHNlbmRlcicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdUcmFuc2FjdGlvbiBoYXMgbm8gcmVjZWl2ZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlTaWduYXR1cmUoa2V5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBseVNpZ25hdHVyZShrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qgb2xkVHJhbnNhY3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uLnRvSnNvbigpO1xuICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBzaWduYXR1cmVzIHRvIGNvbXBhcmUgdGhlbSB3aXRoIHRoZSBuZXcgb25lcyBpbiBhIGxhdGVyIHN0ZXAuIFNpZ25hdHVyZXNcbiAgICAvLyBjYW4gYmUgdW5kZWZpbmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHNpZ25lZFxuICAgIGNvbnN0IG9sZFNpZ25hdHVyZUNvdW50ID0gb2xkVHJhbnNhY3Rpb24uc2lnbmF0dXJlID8gb2xkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA6IDA7XG4gICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvblJlY2VpcHQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjoga2V5LmtleSB9KTtcbiAgICAgIC8vIFNpbmNlIHRoZSBrZXkgcGFpciB3YXMgZ2VuZXJhdGVkIHVzaW5nIGEgcHJpdmF0ZSBrZXksIGl0IHdpbGwgYWx3YXlzIGhhdmUgYSBwcnYgYXR0cmlidXRlLFxuICAgICAgLy8gaGVuY2UgaXQgaXMgc2FmZSB0byB1c2Ugbm9uLW51bGwgb3BlcmF0b3JcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gc2lnblRyYW5zYWN0aW9uKGtleVBhaXIuZ2V0S2V5cygpLnBydiEsIHRoaXMudHJhbnNhY3Rpb24udG9Kc29uKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ0ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uIHZpYSBoZWxwZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBtb3JlIHNpZ25hdHVyZXMgdGhhbiB3aGF0IHdlIHN0YXJ0ZWQgd2l0aFxuICAgIGlmICghc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlIHx8IG9sZFNpZ25hdHVyZUNvdW50ID49IHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ1RyYW5zYWN0aW9uIHNpZ25pbmcgZGlkIG5vdCByZXR1cm4gYW4gYWRkaXRpb25hbCBzaWduYXR1cmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnLCBzaWduZWRUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIC8vIFRoaXMgaXMgYSBuby1vcCBzaW5jZSBUcm9uIHRyYW5zYWN0aW9ucyBhcmUgYnVpbHQgZnJvbVxuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5pZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQSB2YWxpZCB0cmFuc2FjdGlvbiBtdXN0IGhhdmUgYW4gaWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvblJlY2VpcHQgfCBzdHJpbmcpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gdGhpcy5mcm9tSW1wbGVtZW50YXRpb24odHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dGVuZCB0aGUgdmFsaWRpdHkgb2YgdGhpcyB0cmFuc2FjdGlvbiBieSB0aGUgZ2l2ZW4gYW1vdW50IG9mIHRpbWVcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4dGVuc2lvbk1zIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGV4dGVuZCB0aGUgdmFsaWRUbyB0aW1lXG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAqL1xuICBleHRlbmRWYWxpZFRvKGV4dGVuc2lvbk1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmV4dGVuZEV4cGlyYXRpb24oZXh0ZW5zaW9uTXMpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVmFsdWUodmFsdWU6IEJpZ051bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuT3JFcXVhbFRvKDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGNhbm5vdCBiZSBiZWxvdyB6ZXJvLicpO1xuICAgIH1cblxuICAgIC8vIG1heCBsb25nIGluIEphdmEgLSBhc3N1bWVkIHVwcGVyIGxpbWl0IGZvciBhIFRSWCB0cmFuc2FjdGlvblxuICAgIGlmICh2YWx1ZS5pc0dyZWF0ZXJUaGFuKG5ldyBCaWdOdW1iZXIoJzkyMjMzNzIwMzY4NTQ3NzU4MDcnKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBoYW5kbGVkIGJ5IHRoZSBqYXZhdHJvbiBub2RlLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogQWRkcmVzcyk6IHZvaWQge1xuICAgIC8vIGFzc3VtZXMgYSBiYXNlIDU4IGFkZHJlc3MgZm9yIG91ciBhZGRyZXNzZXNcbiAgICBpZiAoIWlzQmFzZTU4QWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYWRkcmVzcy5hZGRyZXNzICsgJyBpcyBub3QgYSB2YWxpZCBiYXNlNTggYWRkcmVzcy4nKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIG5vdCB2YWxpZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgYSByYXcgdHJhbnNhY3Rpb24uIFRoZSB2YWxpZGF0aW9uXG4gICAqIHBoYXNlIGlzIHRvIGNvbXBhcmUgdGhlIHJhdy1kYXRhLWhleCB0byB0aGUgcmF3LWRhdGEgb2YgdGhlXG4gICAqIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBUaGUgY29udGVudHMgdG8gYmUgdmFsaWRhdGVkIGFyZVxuICAgKiAxLiBUaGUgdHJhbnNhY3Rpb24gaWRcbiAgICogMi4gVGhlIGV4cGlyYXRpb24gZGF0ZVxuICAgKiAzLiBUaGUgdGltZXN0YW1wXG4gICAqIDQuIFRoZSBjb250cmFjdFxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uUmVjZWlwdCB8IHN0cmluZ30gcmF3VHJhbnNhY3Rpb24gVGhlIHJhdyB0cmFuc2FjdGlvbiB0byBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uUmVjZWlwdCB8IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFRPRE86IFZhbGlkYXRpb24gb2Ygc2lnbmF0dXJlXG4gICAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdSYXcgdHJhbnNhY3Rpb24gaXMgZW1wdHknKTtcbiAgICB9XG4gICAgbGV0IGN1cnJUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25SZWNlaXB0O1xuICAgIC8vIHJhd1RyYW5zYWN0aW9uIGNhbiBiZSBlaXRoZXIgU3RyaW5naWZpZWQgSlNPTiBPUlxuICAgIC8vIGl0IGNhbiBiZSBhIHJlZ3VsYXIgSlNPTiBvYmplY3QgKG5vdCBzdHJpbmdpZmllZCkuXG4gICAgaWYgKHR5cGVvZiByYXdUcmFuc2FjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJUcmFuc2FjdGlvbiA9IEpTT04ucGFyc2UocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdUaGVyZSB3YXMgZXJyb3IgaW4gcGFyc2luZyB0aGUgSlNPTiBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QocmF3VHJhbnNhY3Rpb24pKSB7XG4gICAgICBjdXJyVHJhbnNhY3Rpb24gPSByYXdUcmFuc2FjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBpcyBub3QgYW4gb2JqZWN0IG9yIHN0cmluZ2lmaWVkIGpzb24nKTtcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZFJhd0RhdGFIZXggPSBkZWNvZGVUcmFuc2FjdGlvbihjdXJyVHJhbnNhY3Rpb24ucmF3X2RhdGFfaGV4KTtcbiAgICBpZiAoIWN1cnJUcmFuc2FjdGlvbi50eElEKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIElEIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHRoZSB0cmFuc2FjdGlvbiBJRCBmcm9tIHRoZSByYXcgZGF0YSBoZXhcbiAgICBjb25zdCBoZXhCdWZmZXIgPSBCdWZmZXIuZnJvbShjdXJyVHJhbnNhY3Rpb24ucmF3X2RhdGFfaGV4LCAnaGV4Jyk7XG4gICAgY29uc3QgY3VyclR4SUQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoaGV4QnVmZmVyKS5kaWdlc3QoJ2hleCcpO1xuICAgIGlmIChjdXJyVHJhbnNhY3Rpb24udHhJRCAhPT0gY3VyclR4SUQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vdCBoYXZlIGEgdmFsaWQgaWQnKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgdGhlIGV4cGlyYXRpb24gdGltZSBmcm9tIHRoZSByYXctZGF0YS1oZXhcbiAgICBpZiAoY3VyclRyYW5zYWN0aW9uLnJhd19kYXRhLmV4cGlyYXRpb24gIT09IGRlY29kZWRSYXdEYXRhSGV4LmV4cGlyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vdCBoYXZlIGEgdmFsaWQgZXhwaXJhdGlvbicpO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSB0aGUgdGltZXN0YW1wIGZyb20gdGhlIHJhdy1kYXRhLWhleFxuICAgIGlmIChjdXJyVHJhbnNhY3Rpb24ucmF3X2RhdGEudGltZXN0YW1wICE9PSBkZWNvZGVkUmF3RGF0YUhleC50aW1lc3RhbXApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vdCBoYXZlIGEgdmFsaWQgdGltZXRhbXAnKTtcbiAgICB9XG4gICAgLy8gVHJhbnNhY3Rpb24gY29udHJhY3QgbXVzdCBleGlzdFxuICAgIGlmICghY3VyclRyYW5zYWN0aW9uLnJhd19kYXRhLmNvbnRyYWN0KSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGNvbnRyYWN0cyBhcmUgZW1wdHknKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBoZXhCdWZmZXIgPSBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbi50b0pzb24oKS5yYXdfZGF0YV9oZXgsICdoZXgnKTtcbiAgICBjb25zdCB0eElkID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGhleEJ1ZmZlcikuZGlnZXN0KCdoZXgnKTtcbiAgICBpZiAodHJhbnNhY3Rpb24uaWQgIT09IHR4SWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcih0cmFuc2FjdGlvbi5pZCArICcgaXMgbm90IGEgdmFsaWQgdHJhbnNhY3Rpb24gaWQuIEV4cGVjdGluZzogJyArIHR4SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNldCB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuICB9XG59XG4iXX0=