@bitgo-beta/sdk-coin-trx 1.0.2-beta.1981 → 1.0.2-beta.1983

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.
@@ -8,6 +8,7 @@ const trx_1 = require("./trx");
8
8
  const statics_1 = require("@bitgo-beta/statics");
9
9
  const builder_1 = require("./lib/builder");
10
10
  const assert_1 = __importDefault(require("assert"));
11
+ const lib_1 = require("./lib");
11
12
  class TrxToken extends trx_1.Trx {
12
13
  constructor(bitgo, tokenConfig) {
13
14
  const staticsCoin = tokenConfig.network === 'Mainnet' ? statics_1.coins.get('trx') : statics_1.coins.get('ttrx');
@@ -70,14 +71,46 @@ class TrxToken extends trx_1.Trx {
70
71
  return false;
71
72
  }
72
73
  async verifyTransaction(params) {
73
- const { txPrebuild: txPrebuild, txParams: txParams, walletType } = params;
74
+ const { txPrebuild, txParams, walletType } = params;
74
75
  (0, assert_1.default)(txPrebuild.txHex, new Error('missing required tx prebuild property txHex'));
75
- // For TSS wallets, TRC20 token transfers are TriggerSmartContract transactions.
76
- // Trx.verifyTransaction already returns true for TriggerSmartContract in TSS mode
77
- // (only TransferContract/native TRX gets validated against recipients there).
78
- // We apply the same convention here: the TSS signing protocol itself provides
79
- // cryptographic guarantees; recipients-based verification is not applicable.
80
76
  if (walletType === 'tss') {
77
+ // For TSS wallets, TRC20 token transfers are TriggerSmartContract transactions.
78
+ // Decode the transaction and validate destination address and amount against
79
+ // txParams.recipients before signing to ensure intent matches the prebuild.
80
+ const rawDataHex = this.extractRawDataHex(txPrebuild.txHex);
81
+ const decodedTx = lib_1.Utils.decodeTransaction(rawDataHex);
82
+ if (decodedTx.contractType !== lib_1.Enum.ContractType.TriggerSmartContract) {
83
+ throw new Error(`Expected TriggerSmartContract for TRC20 token transfer, got contract type: ${decodedTx.contractType}`);
84
+ }
85
+ if (!Array.isArray(decodedTx.contract) || decodedTx.contract.length !== 1) {
86
+ throw new Error('Invalid TriggerSmartContract structure');
87
+ }
88
+ const triggerContract = decodedTx.contract[0];
89
+ // data is base64-encoded from protobuf decoding; convert to hex for decodeDataParams
90
+ const contractData = Buffer.from(triggerContract.parameter.value.data, 'base64').toString('hex');
91
+ const recipients = txParams.recipients || txPrebuild.txInfo.recipients;
92
+ if (!recipients || recipients.length !== 1) {
93
+ throw new Error('missing or invalid required property recipients');
94
+ }
95
+ let recipientHex;
96
+ let transferAmount;
97
+ try {
98
+ [recipientHex, transferAmount] = lib_1.Utils.decodeDataParams(['address', 'uint256'], contractData);
99
+ }
100
+ catch (e) {
101
+ throw new Error(`Failed to decode TRC20 transfer ABI data: ${e instanceof Error ? e.message : String(e)}`);
102
+ }
103
+ // recipientHex has '41' hex prefix; convert to base58 for comparison
104
+ const actualDestination = lib_1.Utils.getBase58AddressFromHex(recipientHex);
105
+ const actualAmount = transferAmount.toString();
106
+ const expectedDestination = recipients[0].address;
107
+ const expectedAmount = recipients[0].amount.toString();
108
+ if (actualAmount !== expectedAmount) {
109
+ throw new Error('transaction amount in txPrebuild does not match the value given by client');
110
+ }
111
+ if (expectedDestination.toLowerCase() !== actualDestination.toLowerCase()) {
112
+ throw new Error('destination address does not match with the recipient address');
113
+ }
81
114
  return true;
82
115
  }
83
116
  const rawTx = txPrebuild.txHex;
@@ -96,4 +129,4 @@ class TrxToken extends trx_1.Trx {
96
129
  }
97
130
  }
98
131
  exports.TrxToken = TrxToken;
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ4VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJ4VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0JBQTRCO0FBRTVCLGlEQUFvRTtBQUNwRSwyQ0FBMkM7QUFFM0Msb0RBQTRCO0FBVTVCLE1BQWEsUUFBUyxTQUFRLFNBQUc7SUFHL0IsWUFBWSxLQUFnQixFQUFFLFdBQTJCO1FBQ3ZELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdGLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFzQjtRQUNsRCxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLGVBQWlDLENBQUMsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUU3RixNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQWUs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Q29udGVudCI6WyJpbXBvcnQgeyBUcnggfSBmcm9tICcuL3RyeCc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UsIENvaW5Db25zdHJ1Y3RvciwgTmFtZWRDb2luQ29uc3RydWN0b3IsIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyeFRva2VuQ29uZmlnLCBjb2lucywgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi9saWIvYnVpbGRlcic7XG5pbXBvcnQgeyBSZWNpcGllbnQgfSBmcm9tICcuLi8uLi9zZGstY29yZS9zcmMvYml0Z28vYmFzZUNvaW4vaUJhc2VDb2luJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZXhwb3J0IHsgVHJ4VG9rZW5Db25maWcgfTtcblxuZXhwb3J0IHR5cGUgVHJvblR4SW5mbyA9IHtcbiAgcmVjaXBpZW50cz86IFJlY2lwaWVudFtdO1xuICBmcm9tPzogc3RyaW5nO1xuICB0eGlkPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIFRyeFRva2VuIGV4dGVuZHMgVHJ4IHtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuQ29uZmlnOiBUcnhUb2tlbkNvbmZpZztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCB0b2tlbkNvbmZpZzogVHJ4VG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IHRva2VuQ29uZmlnLm5ldHdvcmsgPT09ICdNYWlubmV0JyA/IGNvaW5zLmdldCgndHJ4JykgOiBjb2lucy5nZXQoJ3R0cngnKTtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICAgIHRoaXMudG9rZW5Db25maWcgPSB0b2tlbkNvbmZpZztcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9yKGNvbmZpZzogVHJ4VG9rZW5Db25maWcpOiBDb2luQ29uc3RydWN0b3Ige1xuICAgIHJldHVybiAoYml0Z286IEJpdEdvQmFzZSkgPT4gbmV3IFRyeFRva2VuKGJpdGdvLCBjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKFxuICAgIHRva2VuQ29uZmlnczogVHJ4VG9rZW5Db25maWdbXSA9IFsuLi50b2tlbnMuYml0Y29pbi50cngudG9rZW5zLCAuLi50b2tlbnMudGVzdG5ldC50cngudG9rZW5zXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWdzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gVHJ4VG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3Rvcih0b2tlbik7XG4gICAgICB0b2tlbnNDdG9ycy5wdXNoKHsgbmFtZTogdG9rZW4udHlwZSwgY29pbkNvbnN0cnVjdG9yOiB0b2tlbkNvbnN0cnVjdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zQ3RvcnM7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50eXBlO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcubmFtZTtcbiAgfVxuXG4gIGdldCBjb2luKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmNvaW47XG4gIH1cblxuICBnZXQgbmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uZXR3b3JrO1xuICB9XG5cbiAgZ2V0IHRva2VuQ29udHJhY3RBZGRyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICB9XG5cbiAgZ2V0IGRlY2ltYWxQbGFjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcztcbiAgfVxuXG4gIGdldENoYWluKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXRCYXNlQ2hhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29pbjtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiAnVHJvbiBUb2tlbic7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCkge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy50b2tlbkNvbmZpZy5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIHZhbHVlIG9mIDBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgb2theSB0byBzZW5kIDAgdmFsdWUsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIGRhdGEgYWxvbmcgd2l0aCB0cmFuc2FjdGlvbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgb2theSB0byBzZW5kIHR4IGRhdGEgKEVUSCksIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgdHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZDogdHhQcmVidWlsZCwgdHhQYXJhbXM6IHR4UGFyYW1zLCB3YWxsZXRUeXBlIH0gPSBwYXJhbXM7XG4gICAgYXNzZXJ0KHR4UHJlYnVpbGQudHhIZXgsIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpKTtcblxuICAgIC8vIEZvciBUU1Mgd2FsbGV0cywgVFJDMjAgdG9rZW4gdHJhbnNmZXJzIGFyZSBUcmlnZ2VyU21hcnRDb250cmFjdCB0cmFuc2FjdGlvbnMuXG4gICAgLy8gVHJ4LnZlcmlmeVRyYW5zYWN0aW9uIGFscmVhZHkgcmV0dXJucyB0cnVlIGZvciBUcmlnZ2VyU21hcnRDb250cmFjdCBpbiBUU1MgbW9kZVxuICAgIC8vIChvbmx5IFRyYW5zZmVyQ29udHJhY3QvbmF0aXZlIFRSWCBnZXRzIHZhbGlkYXRlZCBhZ2FpbnN0IHJlY2lwaWVudHMgdGhlcmUpLlxuICAgIC8vIFdlIGFwcGx5IHRoZSBzYW1lIGNvbnZlbnRpb24gaGVyZTogdGhlIFRTUyBzaWduaW5nIHByb3RvY29sIGl0c2VsZiBwcm92aWRlc1xuICAgIC8vIGNyeXB0b2dyYXBoaWMgZ3VhcmFudGVlczsgcmVjaXBpZW50cy1iYXNlZCB2ZXJpZmljYXRpb24gaXMgbm90IGFwcGxpY2FibGUuXG4gICAgaWYgKHdhbGxldFR5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCByYXdUeCA9IHR4UHJlYnVpbGQudHhIZXg7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKHRoaXMuZ2V0Q2hhaW4oKSkuZnJvbShyYXdUeCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eFBhcmFtcy5yZWNpcGllbnRzIHx8ICh0eFByZWJ1aWxkLnR4SW5mbyBhcyBUcm9uVHhJbmZvKS5yZWNpcGllbnRzO1xuICAgIGlmICghcmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAocmVjaXBpZW50c1swXS5hZGRyZXNzID09PSB0eC5vdXRwdXRzWzBdLmFkZHJlc3MgJiYgcmVjaXBpZW50c1swXS5hbW91bnQgPT09IHR4Lm91dHB1dHNbMF0udmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ4VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJ4VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0JBQTRCO0FBRTVCLGlEQUFvRTtBQUNwRSwyQ0FBMkM7QUFFM0Msb0RBQTRCO0FBQzVCLCtCQUErQztBQVUvQyxNQUFhLFFBQVMsU0FBUSxTQUFHO0lBRy9CLFlBQVksS0FBZ0IsRUFBRSxXQUEyQjtRQUN2RCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RixLQUFLLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBc0I7UUFDbEQsT0FBTyxDQUFDLEtBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxDQUFDLHVCQUF1QixDQUM1QixlQUFpQyxDQUFDLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFFN0YsTUFBTSxXQUFXLEdBQTJCLEVBQUUsQ0FBQztRQUMvQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hFLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElB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LE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFL0IsTUFBTSxTQUFTLEdBQUcsSUFBQSxvQkFBVSxFQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVuQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxJQUFLLFVBQVUsQ0FBQyxNQUFxQixDQUFDLFVBQVUsQ0FBQztRQUN2RixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BHLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFKRCw0QkEwSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcnggfSBmcm9tICcuL3RyeCc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UsIENvaW5Db25zdHJ1Y3RvciwgTmFtZWRDb2luQ29uc3RydWN0b3IsIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyeFRva2VuQ29uZmlnLCBjb2lucywgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi9saWIvYnVpbGRlcic7XG5pbXBvcnQgeyBSZWNpcGllbnQgfSBmcm9tICcuLi8uLi9zZGstY29yZS9zcmMvYml0Z28vYmFzZUNvaW4vaUJhc2VDb2luJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEVudW0sIFV0aWxzLCBJbnRlcmZhY2UgfSBmcm9tICcuL2xpYic7XG5cbmV4cG9ydCB7IFRyeFRva2VuQ29uZmlnIH07XG5cbmV4cG9ydCB0eXBlIFRyb25UeEluZm8gPSB7XG4gIHJlY2lwaWVudHM/OiBSZWNpcGllbnRbXTtcbiAgZnJvbT86IHN0cmluZztcbiAgdHhpZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBUcnhUb2tlbiBleHRlbmRzIFRyeCB7XG4gIHB1YmxpYyByZWFkb25seSB0b2tlbkNvbmZpZzogVHJ4VG9rZW5Db25maWc7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgdG9rZW5Db25maWc6IFRyeFRva2VuQ29uZmlnKSB7XG4gICAgY29uc3Qgc3RhdGljc0NvaW4gPSB0b2tlbkNvbmZpZy5uZXR3b3JrID09PSAnTWFpbm5ldCcgPyBjb2lucy5nZXQoJ3RyeCcpIDogY29pbnMuZ2V0KCd0dHJ4Jyk7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgICB0aGlzLnRva2VuQ29uZmlnID0gdG9rZW5Db25maWc7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3Rvcihjb25maWc6IFRyeFRva2VuQ29uZmlnKTogQ29pbkNvbnN0cnVjdG9yIHtcbiAgICByZXR1cm4gKGJpdGdvOiBCaXRHb0Jhc2UpID0+IG5ldyBUcnhUb2tlbihiaXRnbywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhcbiAgICB0b2tlbkNvbmZpZ3M6IFRyeFRva2VuQ29uZmlnW10gPSBbLi4udG9rZW5zLmJpdGNvaW4udHJ4LnRva2VucywgLi4udG9rZW5zLnRlc3RuZXQudHJ4LnRva2Vuc11cbiAgKTogTmFtZWRDb2luQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgdG9rZW5zQ3RvcnM6IE5hbWVkQ29pbkNvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VuQ29uZmlncykge1xuICAgICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IFRyeFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3IodG9rZW4pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnR5cGUsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc0N0b3JzO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5hbWU7XG4gIH1cblxuICBnZXQgY29pbigpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb2luO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcubmV0d29yaztcbiAgfVxuXG4gIGdldCB0b2tlbkNvbnRyYWN0QWRkcmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgfVxuXG4gIGdldCBkZWNpbWFsUGxhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXM7XG4gIH1cblxuICBnZXRDaGFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50eXBlO1xuICB9XG5cbiAgZ2V0QmFzZUNoYWluKCkge1xuICAgIHJldHVybiB0aGlzLmNvaW47XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpIHtcbiAgICByZXR1cm4gJ1Ryb24gVG9rZW4nO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyB2YWx1ZSBvZiAwXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCAwIHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyBkYXRhIGFsb25nIHdpdGggdHJhbnNhY3Rpb25zXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCB0eCBkYXRhIChFVEgpLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zLCB3YWxsZXRUeXBlIH0gPSBwYXJhbXM7XG4gICAgYXNzZXJ0KHR4UHJlYnVpbGQudHhIZXgsIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpKTtcblxuICAgIGlmICh3YWxsZXRUeXBlID09PSAndHNzJykge1xuICAgICAgLy8gRm9yIFRTUyB3YWxsZXRzLCBUUkMyMCB0b2tlbiB0cmFuc2ZlcnMgYXJlIFRyaWdnZXJTbWFydENvbnRyYWN0IHRyYW5zYWN0aW9ucy5cbiAgICAgIC8vIERlY29kZSB0aGUgdHJhbnNhY3Rpb24gYW5kIHZhbGlkYXRlIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIGFtb3VudCBhZ2FpbnN0XG4gICAgICAvLyB0eFBhcmFtcy5yZWNpcGllbnRzIGJlZm9yZSBzaWduaW5nIHRvIGVuc3VyZSBpbnRlbnQgbWF0Y2hlcyB0aGUgcHJlYnVpbGQuXG4gICAgICBjb25zdCByYXdEYXRhSGV4ID0gdGhpcy5leHRyYWN0UmF3RGF0YUhleCh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICAgIGNvbnN0IGRlY29kZWRUeCA9IFV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHJhd0RhdGFIZXgpO1xuXG4gICAgICBpZiAoZGVjb2RlZFR4LmNvbnRyYWN0VHlwZSAhPT0gRW51bS5Db250cmFjdFR5cGUuVHJpZ2dlclNtYXJ0Q29udHJhY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBUcmlnZ2VyU21hcnRDb250cmFjdCBmb3IgVFJDMjAgdG9rZW4gdHJhbnNmZXIsIGdvdCBjb250cmFjdCB0eXBlOiAke2RlY29kZWRUeC5jb250cmFjdFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjb2RlZFR4LmNvbnRyYWN0KSB8fCBkZWNvZGVkVHguY29udHJhY3QubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBUcmlnZ2VyU21hcnRDb250cmFjdCBzdHJ1Y3R1cmUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlckNvbnRyYWN0ID0gZGVjb2RlZFR4LmNvbnRyYWN0WzBdIGFzIEludGVyZmFjZS5UcmlnZ2VyU21hcnRDb250cmFjdDtcbiAgICAgIC8vIGRhdGEgaXMgYmFzZTY0LWVuY29kZWQgZnJvbSBwcm90b2J1ZiBkZWNvZGluZzsgY29udmVydCB0byBoZXggZm9yIGRlY29kZURhdGFQYXJhbXNcbiAgICAgIGNvbnN0IGNvbnRyYWN0RGF0YSA9IEJ1ZmZlci5mcm9tKHRyaWdnZXJDb250cmFjdC5wYXJhbWV0ZXIudmFsdWUuZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHMgfHwgKHR4UHJlYnVpbGQudHhJbmZvIGFzIFRyb25UeEluZm8pLnJlY2lwaWVudHM7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIG9yIGludmFsaWQgcmVxdWlyZWQgcHJvcGVydHkgcmVjaXBpZW50cycpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmVjaXBpZW50SGV4OiBzdHJpbmc7XG4gICAgICBsZXQgdHJhbnNmZXJBbW91bnQ6IHsgdG9TdHJpbmcoKTogc3RyaW5nIH07XG4gICAgICB0cnkge1xuICAgICAgICBbcmVjaXBpZW50SGV4LCB0cmFuc2ZlckFtb3VudF0gPSBVdGlscy5kZWNvZGVEYXRhUGFyYW1zKFsnYWRkcmVzcycsICd1aW50MjU2J10sIGNvbnRyYWN0RGF0YSkgYXMgW1xuICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICB7IHRvU3RyaW5nKCk6IHN0cmluZyB9XG4gICAgICAgIF07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBUUkMyMCB0cmFuc2ZlciBBQkkgZGF0YTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlY2lwaWVudEhleCBoYXMgJzQxJyBoZXggcHJlZml4OyBjb252ZXJ0IHRvIGJhc2U1OCBmb3IgY29tcGFyaXNvblxuICAgICAgY29uc3QgYWN0dWFsRGVzdGluYXRpb24gPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleChyZWNpcGllbnRIZXgpO1xuICAgICAgY29uc3QgYWN0dWFsQW1vdW50ID0gdHJhbnNmZXJBbW91bnQudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkRGVzdGluYXRpb24gPSByZWNpcGllbnRzWzBdLmFkZHJlc3M7XG4gICAgICBjb25zdCBleHBlY3RlZEFtb3VudCA9IHJlY2lwaWVudHNbMF0uYW1vdW50LnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChhY3R1YWxBbW91bnQgIT09IGV4cGVjdGVkQW1vdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHJhbnNhY3Rpb24gYW1vdW50IGluIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIGdpdmVuIGJ5IGNsaWVudCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhwZWN0ZWREZXN0aW5hdGlvbi50b0xvd2VyQ2FzZSgpICE9PSBhY3R1YWxEZXN0aW5hdGlvbi50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGVzdGluYXRpb24gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNpcGllbnQgYWRkcmVzcycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCByYXdUeCA9IHR4UHJlYnVpbGQudHhIZXg7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKHRoaXMuZ2V0Q2hhaW4oKSkuZnJvbShyYXdUeCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eFBhcmFtcy5yZWNpcGllbnRzIHx8ICh0eFByZWJ1aWxkLnR4SW5mbyBhcyBUcm9uVHhJbmZvKS5yZWNpcGllbnRzO1xuICAgIGlmICghcmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAocmVjaXBpZW50c1swXS5hZGRyZXNzID09PSB0eC5vdXRwdXRzWzBdLmFkZHJlc3MgJiYgcmVjaXBpZW50c1swXS5hbW91bnQgPT09IHR4Lm91dHB1dHNbMF0udmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trxToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trxToken.d.ts","sourceRoot":"","sources":["../../../test/unit/trxToken.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
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
+ const node_assert_1 = __importDefault(require("node:assert"));
7
+ const node_test_1 = require("node:test");
8
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
9
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
10
+ const statics_1 = require("@bitgo-beta/statics");
11
+ const trx_1 = require("../../src/trx");
12
+ const trxToken_1 = require("../../src/trxToken");
13
+ const ttrx_1 = require("../../src/ttrx");
14
+ const lib_1 = require("../../src/lib");
15
+ // Real TriggerSmartContract protobuf raw_data_hex encoding a TRC20 transfer:
16
+ // owner: 41c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac
17
+ // contract: 4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0
18
+ // data: a9059cbb + abi(address=8483618ca85c35a9b923d98bebca718f5a1db279, uint256=100000000)
19
+ const TRC20_RAW_DATA_HEX = '0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307';
20
+ // Recipient address decoded from the ABI data above (41 prefix → base58)
21
+ const TRC20_RECIPIENT_HEX = '418483618ca85c35a9b923d98bebca718f5a1db279';
22
+ const TRC20_AMOUNT = '100000000';
23
+ (0, node_test_1.describe)('TrxToken verifyTransaction:', function () {
24
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
25
+ bitgo.initializeTestVars();
26
+ bitgo.safeRegister('trx', trx_1.Trx.createInstance);
27
+ bitgo.safeRegister('ttrx', ttrx_1.Ttrx.createInstance);
28
+ let tokenCoin;
29
+ (0, node_test_1.before)(function () {
30
+ const usdtConfig = statics_1.tokens.testnet.trx.tokens.find((t) => t.type === 'ttrx:usdt');
31
+ node_assert_1.default.ok(usdtConfig, 'ttrx:usdt token config not found');
32
+ tokenCoin = new trxToken_1.TrxToken(bitgo, usdtConfig);
33
+ });
34
+ (0, node_test_1.describe)('TSS wallet — TriggerSmartContract validation', () => {
35
+ (0, node_test_1.it)('should validate a correct TRC20 transfer', async function () {
36
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
37
+ const result = await tokenCoin.verifyTransaction({
38
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
39
+ txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
40
+ walletType: 'tss',
41
+ });
42
+ node_assert_1.default.strictEqual(result, true);
43
+ });
44
+ (0, node_test_1.it)('should validate when txHex is a serialized JSON (prebuildAndSignTransaction path)', async function () {
45
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
46
+ const serializedTxHex = JSON.stringify({ txID: 'abc', raw_data_hex: TRC20_RAW_DATA_HEX, raw_data: {} });
47
+ const result = await tokenCoin.verifyTransaction({
48
+ txPrebuild: { txHex: serializedTxHex },
49
+ txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
50
+ walletType: 'tss',
51
+ });
52
+ node_assert_1.default.strictEqual(result, true);
53
+ });
54
+ (0, node_test_1.it)('should throw when amount does not match', async function () {
55
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
56
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
57
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
58
+ txParams: { recipients: [{ address: recipientBase58, amount: '999' }] },
59
+ walletType: 'tss',
60
+ }), { message: 'transaction amount in txPrebuild does not match the value given by client' });
61
+ });
62
+ (0, node_test_1.it)('should throw when recipient address does not match', async function () {
63
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
64
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
65
+ txParams: { recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: TRC20_AMOUNT }] },
66
+ walletType: 'tss',
67
+ }), { message: 'destination address does not match with the recipient address' });
68
+ });
69
+ (0, node_test_1.it)('should throw when recipients is empty', async function () {
70
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
71
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
72
+ txParams: { recipients: [] },
73
+ walletType: 'tss',
74
+ }), { message: 'missing or invalid required property recipients' });
75
+ });
76
+ (0, node_test_1.it)('should throw when contract type is not TriggerSmartContract', async function () {
77
+ // Use a native TRX Transfer protobuf as txHex — TrxToken only handles TriggerSmartContract
78
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
79
+ const nativeTrxRawDataHex = lib_1.Utils.generateRawDataHex({
80
+ contract: [
81
+ {
82
+ parameter: {
83
+ value: {
84
+ amount: 100000000,
85
+ owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
86
+ to_address: TRC20_RECIPIENT_HEX,
87
+ },
88
+ type_url: 'type.googleapis.com/protocol.TransferContract',
89
+ },
90
+ type: 'TransferContract',
91
+ },
92
+ ],
93
+ refBlockBytes: 'c8cf',
94
+ refBlockHash: '89177fd84c5d9196',
95
+ expiration: Date.now() + 3600000,
96
+ timestamp: Date.now(),
97
+ });
98
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
99
+ txPrebuild: { txHex: nativeTrxRawDataHex },
100
+ txParams: { recipients: [{ address: recipientBase58, amount: '100000000' }] },
101
+ walletType: 'tss',
102
+ }), { message: /Expected TriggerSmartContract for TRC20 token transfer/ });
103
+ });
104
+ });
105
+ (0, node_test_1.describe)('non-TSS wallet — builder-based validation (existing path)', () => {
106
+ (0, node_test_1.it)('should validate a correct non-TSS TRC20 transfer using txBuilder', async function () {
107
+ // The non-TSS path uses getBuilder().from(rawTx).build() and checks tx.outputs[0]
108
+ // This test uses the full JSON tx format that the builder understands.
109
+ const txHex = '{"raw_data":{"contractType":2,"contract":[{"parameter":{"value":{"data":"a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e100","owner_address":"41c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac","contract_address":"4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"expiration":1674581767432,"timestamp":1674578167432,"ref_block_bytes":"578b","ref_block_hash":"6113bb9ac351432b","fee_limit":15000000},"raw_data_hex":"0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307","txID":"fe21c49f4febd9089125e3a006943c145721d8fcb7ab84136f8c6663ff92f8ed","signature":["0775cde302689eb8293883c66a89b31e80d608bfc3ad3c283b64a490ea4cc712c55a2fd2e62c75843dd7e77d8c4cb52e0f371fbb29b332c259f8cb63c2e6195301"]}';
110
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
111
+ const result = await tokenCoin.verifyTransaction({
112
+ txPrebuild: { txHex },
113
+ txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
114
+ });
115
+ node_assert_1.default.strictEqual(result, true);
116
+ });
117
+ });
118
+ });
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ4VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJ4VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMseUNBQWlEO0FBQ2pELGlEQUErQztBQUMvQyxtREFBK0Q7QUFDL0QsaURBQTZDO0FBQzdDLHVDQUFvQztBQUNwQyxpREFBOEM7QUFDOUMseUNBQXNDO0FBQ3RDLHVDQUFzQztBQUV0Qyw2RUFBNkU7QUFDN0UseURBQXlEO0FBQ3pELHlEQUF5RDtBQUN6RCxrR0FBa0c7QUFDbEcsTUFBTSxrQkFBa0IsR0FDdEIsd2FBQXdhLENBQUM7QUFFM2EseUVBQXlFO0FBQ3pFLE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7QUFDekUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBRWpDLElBQUEsb0JBQVEsRUFBQyw2QkFBNkIsRUFBRTtJQUN0QyxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsSUFBSSxTQUFtQixDQUFDO0lBRXhCLElBQUEsa0JBQU0sRUFBQztRQUNMLE1BQU0sVUFBVSxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ2pGLHFCQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxrQ0FB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QkFDN0UsVUFBVSxFQUFFLEtBQUs7YUFDWCxDQUFDLEVBQ1QsRUFBRSxPQUFPLEVBQUUsd0RBQXdELEVBQUUsQ0FDdEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLG9CQUFRLEVBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1FBQ3pFLElBQUEsY0FBRSxFQUFDLGtFQUFrRSxFQUFFLEtBQUs7WUFDMUUsa0ZBQWtGO1lBQ2xGLHVFQUF1RTtZQUN2RSxNQUFNLEtBQUssR0FDVCxndENBQWd0QyxDQUFDO1lBQ250QyxNQUFNLGVBQWUsR0FBRyxXQUFLLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUUzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFO2dCQUNyQixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUU7YUFDeEUsQ0FBQyxDQUFDO1lBRVYscUJBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGl0LCBiZWZvcmUgfSBmcm9tICdub2RlOnRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHb0FQSSwgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcnggfSBmcm9tICcuLi8uLi9zcmMvdHJ4JztcbmltcG9ydCB7IFRyeFRva2VuIH0gZnJvbSAnLi4vLi4vc3JjL3RyeFRva2VuJztcbmltcG9ydCB7IFR0cnggfSBmcm9tICcuLi8uLi9zcmMvdHRyeCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL3NyYy9saWInO1xuXG4vLyBSZWFsIFRyaWdnZXJTbWFydENvbnRyYWN0IHByb3RvYnVmIHJhd19kYXRhX2hleCBlbmNvZGluZyBhIFRSQzIwIHRyYW5zZmVyOlxuLy8gICBvd25lcjogICAgNDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjXG4vLyAgIGNvbnRyYWN0OiA0MTQyYTFlMzlhZWZhNDkyOTBmMmIzZjllZDY4OGQ3Y2VjZjg2Y2Q2ZTBcbi8vICAgZGF0YTogICAgIGE5MDU5Y2JiICsgYWJpKGFkZHJlc3M9ODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OSwgdWludDI1Nj0xMDAwMDAwMDApXG5jb25zdCBUUkMyMF9SQVdfREFUQV9IRVggPVxuICAnMGEwMjU3OGIyMjA4NjExM2JiOWFjMzUxNDMyYjQwODhlYWU3YTZkZTMwNWFhZTAxMDgxZjEyYTkwMTBhMzE3NDc5NzA2NTJlNjc2ZjZmNjc2YzY1NjE3MDY5NzMyZTYzNmY2ZDJmNzA3MjZmNzQ2ZjYzNmY2YzJlNTQ3MjY5Njc2NzY1NzI1MzZkNjE3Mjc0NDM2ZjZlNzQ3MjYxNjM3NDEyNzQwYTE1NDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjMTIxNTQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMDIyNDRhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwNzA4ODhkOGNhNWRlMzA5MDAxYzBjMzkzMDcnO1xuXG4vLyBSZWNpcGllbnQgYWRkcmVzcyBkZWNvZGVkIGZyb20gdGhlIEFCSSBkYXRhIGFib3ZlICg0MSBwcmVmaXgg4oaSIGJhc2U1OClcbmNvbnN0IFRSQzIwX1JFQ0lQSUVOVF9IRVggPSAnNDE4NDgzNjE4Y2E4NWMzNWE5YjkyM2Q5OGJlYmNhNzE4ZjVhMWRiMjc5JztcbmNvbnN0IFRSQzIwX0FNT1VOVCA9ICcxMDAwMDAwMDAnO1xuXG5kZXNjcmliZSgnVHJ4VG9rZW4gdmVyaWZ5VHJhbnNhY3Rpb246JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbzogVGVzdEJpdEdvQVBJID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0cngnLCBUcnguY3JlYXRlSW5zdGFuY2UpO1xuICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3R0cngnLCBUdHJ4LmNyZWF0ZUluc3RhbmNlKTtcblxuICBsZXQgdG9rZW5Db2luOiBUcnhUb2tlbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZHRDb25maWcgPSB0b2tlbnMudGVzdG5ldC50cngudG9rZW5zLmZpbmQoKHQpID0+IHQudHlwZSA9PT0gJ3R0cng6dXNkdCcpO1xuICAgIGFzc2VydC5vayh1c2R0Q29uZmlnLCAndHRyeDp1c2R0IHRva2VuIGNvbmZpZyBub3QgZm91bmQnKTtcbiAgICB0b2tlbkNvaW4gPSBuZXcgVHJ4VG9rZW4oYml0Z28sIHVzZHRDb25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVFNTIHdhbGxldCDigJQgVHJpZ2dlclNtYXJ0Q29udHJhY3QgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgY29ycmVjdCBUUkMyMCB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudEJhc2U1OCA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KFRSQzIwX1JFQ0lQSUVOVF9IRVgpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdoZW4gdHhIZXggaXMgYSBzZXJpYWxpemVkIEpTT04gKHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uIHBhdGgpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBKU09OLnN0cmluZ2lmeSh7IHR4SUQ6ICdhYmMnLCByYXdfZGF0YV9oZXg6IFRSQzIwX1JBV19EQVRBX0hFWCwgcmF3X2RhdGE6IHt9IH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBzZXJpYWxpemVkVHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IFRSQzIwX1JBV19EQVRBX0hFWCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IHJlY2lwaWVudEJhc2U1OCwgYW1vdW50OiAnOTk5JyB9XSB9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9IGFzIGFueSksXG4gICAgICAgIHsgbWVzc2FnZTogJ3RyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBnaXZlbiBieSBjbGllbnQnIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gcmVjaXBpZW50IGFkZHJlc3MgZG9lcyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVExXaDY3UDkzS2d0blpOQ3RHbkVITTFIMzNOaHEydXZ2TicsIGFtb3VudDogVFJDMjBfQU1PVU5UIH1dIH0sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0gYXMgYW55KSxcbiAgICAgICAgeyBtZXNzYWdlOiAnZGVzdGluYXRpb24gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNpcGllbnQgYWRkcmVzcycgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnRzIGlzIGVtcHR5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogVFJDMjBfUkFXX0RBVEFfSEVYIH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW10gfSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgICB7IG1lc3NhZ2U6ICdtaXNzaW5nIG9yIGludmFsaWQgcmVxdWlyZWQgcHJvcGVydHkgcmVjaXBpZW50cycgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBjb250cmFjdCB0eXBlIGlzIG5vdCBUcmlnZ2VyU21hcnRDb250cmFjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVzZSBhIG5hdGl2ZSBUUlggVHJhbnNmZXIgcHJvdG9idWYgYXMgdHhIZXgg4oCUIFRyeFRva2VuIG9ubHkgaGFuZGxlcyBUcmlnZ2VyU21hcnRDb250cmFjdFxuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG4gICAgICBjb25zdCBuYXRpdmVUcnhSYXdEYXRhSGV4ID0gVXRpbHMuZ2VuZXJhdGVSYXdEYXRhSGV4KHtcbiAgICAgICAgY29udHJhY3Q6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMCxcbiAgICAgICAgICAgICAgICBvd25lcl9hZGRyZXNzOiAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JyxcbiAgICAgICAgICAgICAgICB0b19hZGRyZXNzOiBUUkMyMF9SRUNJUElFTlRfSEVYLFxuICAgICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmQmxvY2tCeXRlczogJ2M4Y2YnLFxuICAgICAgICByZWZCbG9ja0hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgZXhwaXJhdGlvbjogRGF0ZS5ub3coKSArIDM2MDAwMDAsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBuYXRpdmVUcnhSYXdEYXRhSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6ICcxMDAwMDAwMDAnIH1dIH0sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0gYXMgYW55KSxcbiAgICAgICAgeyBtZXNzYWdlOiAvRXhwZWN0ZWQgVHJpZ2dlclNtYXJ0Q29udHJhY3QgZm9yIFRSQzIwIHRva2VuIHRyYW5zZmVyLyB9XG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uLVRTUyB3YWxsZXQg4oCUIGJ1aWxkZXItYmFzZWQgdmFsaWRhdGlvbiAoZXhpc3RpbmcgcGF0aCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIGNvcnJlY3Qgbm9uLVRTUyBUUkMyMCB0cmFuc2ZlciB1c2luZyB0eEJ1aWxkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgbm9uLVRTUyBwYXRoIHVzZXMgZ2V0QnVpbGRlcigpLmZyb20ocmF3VHgpLmJ1aWxkKCkgYW5kIGNoZWNrcyB0eC5vdXRwdXRzWzBdXG4gICAgICAvLyBUaGlzIHRlc3QgdXNlcyB0aGUgZnVsbCBKU09OIHR4IGZvcm1hdCB0aGF0IHRoZSBidWlsZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAne1wicmF3X2RhdGFcIjp7XCJjb250cmFjdFR5cGVcIjoyLFwiY29udHJhY3RcIjpbe1wicGFyYW1ldGVyXCI6e1widmFsdWVcIjp7XCJkYXRhXCI6XCJhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwXCIsXCJvd25lcl9hZGRyZXNzXCI6XCI0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWNcIixcImNvbnRyYWN0X2FkZHJlc3NcIjpcIjQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMFwifSxcInR5cGVfdXJsXCI6XCJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyaWdnZXJTbWFydENvbnRyYWN0XCJ9LFwidHlwZVwiOlwiVHJpZ2dlclNtYXJ0Q29udHJhY3RcIn1dLFwiZXhwaXJhdGlvblwiOjE2NzQ1ODE3Njc0MzIsXCJ0aW1lc3RhbXBcIjoxNjc0NTc4MTY3NDMyLFwicmVmX2Jsb2NrX2J5dGVzXCI6XCI1NzhiXCIsXCJyZWZfYmxvY2tfaGFzaFwiOlwiNjExM2JiOWFjMzUxNDMyYlwiLFwiZmVlX2xpbWl0XCI6MTUwMDAwMDB9LFwicmF3X2RhdGFfaGV4XCI6XCIwYTAyNTc4YjIyMDg2MTEzYmI5YWMzNTE0MzJiNDA4OGVhZTdhNmRlMzA1YWFlMDEwODFmMTJhOTAxMGEzMTc0Nzk3MDY1MmU2NzZmNmY2NzZjNjU2MTcwNjk3MzJlNjM2ZjZkMmY3MDcyNmY3NDZmNjM2ZjZjMmU1NDcyNjk2NzY3NjU3MjUzNmQ2MTcyNzQ0MzZmNmU3NDcyNjE2Mzc0MTI3NDBhMTU0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWMxMjE1NDE0MmExZTM5YWVmYTQ5MjkwZjJiM2Y5ZWQ2ODhkN2NlY2Y4NmNkNmUwMjI0NGE5MDU5Y2JiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVmNWUxMDA3MDg4OGQ4Y2E1ZGUzMDkwMDFjMGMzOTMwN1wiLFwidHhJRFwiOlwiZmUyMWM0OWY0ZmViZDkwODkxMjVlM2EwMDY5NDNjMTQ1NzIxZDhmY2I3YWI4NDEzNmY4YzY2NjNmZjkyZjhlZFwiLFwic2lnbmF0dXJlXCI6W1wiMDc3NWNkZTMwMjY4OWViODI5Mzg4M2M2NmE4OWIzMWU4MGQ2MDhiZmMzYWQzYzI4M2I2NGE0OTBlYTRjYzcxMmM1NWEyZmQyZTYyYzc1ODQzZGQ3ZTc3ZDhjNGNiNTJlMGYzNzFmYmIyOWIzMzJjMjU5ZjhjYjYzYzJlNjE5NTMwMVwiXX0nO1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgfSBhcyBhbnkpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -475,9 +475,9 @@ const resources_1 = require("../resources");
475
475
  });
476
476
  });
477
477
  });
478
- (0, node_test_1.it)('should return true for non-Transfer contract types in TSS', async function () {
479
- // For non-Transfer contracts (e.g., AccountPermissionUpdate), TSS path returns true
480
- // without detailed validation.
478
+ (0, node_test_1.it)('should return true for non-Transfer, non-TriggerSmartContract types in TSS', async function () {
479
+ // AccountPermissionUpdate and other native TRX contracts (freeze, vote, etc.) pass through
480
+ // without recipient validation in the TSS path.
481
481
  const rawDataHex = resources_1.UnsignedAccountPermissionUpdateContractTx.raw_data_hex;
482
482
  const params = {
483
483
  txParams: {
@@ -492,6 +492,26 @@ const resources_1 = require("../resources");
492
492
  const result = await basecoin.verifyTransaction(params);
493
493
  node_assert_1.default.strictEqual(result, true);
494
494
  });
495
+ (0, node_test_1.it)('should throw when TSS native TRX verifyTransaction encounters a TriggerSmartContract', async function () {
496
+ // Defense-in-depth: native TRX (Trx) should never verify TriggerSmartContract.
497
+ // TRC20 token transfers must go through TrxToken.verifyTransaction.
498
+ // The raw_data_hex below is a real TRC20 TriggerSmartContract protobuf.
499
+ const trc20RawDataHex = '0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307';
500
+ const params = {
501
+ txParams: {
502
+ recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: '100000000' }],
503
+ },
504
+ txPrebuild: {
505
+ txHex: trc20RawDataHex,
506
+ },
507
+ wallet: {},
508
+ walletType: 'tss',
509
+ };
510
+ await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
511
+ message: 'TriggerSmartContract verification is not supported by native TRX. ' +
512
+ 'TRC20 token transfers must be verified via TrxToken.verifyTransaction.',
513
+ });
514
+ });
495
515
  (0, node_test_1.it)('should throw error when txHex is missing for TSS wallet', async function () {
496
516
  const params = {
497
517
  txParams: {
@@ -570,4 +590,4 @@ const resources_1 = require("../resources");
570
590
  });
571
591
  });
572
592
  });
573
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMsbUNBQW9DO0FBQ3BDLHlDQUFpRDtBQUNqRCxpREFBK0M7QUFDL0MsbURBQStEO0FBQy9ELG1DQUFzQztBQUN0Qyx1Q0FBc0M7QUFDdEMsNENBQW1HO0FBRW5HLElBQUEsb0JBQVEsRUFBQywwQkFBMEIsRUFBRTtJQUNuQyxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsSUFBSSxRQUFRLENBQUM7SUFFYixJQUFBLGtCQUFNLEVBQUM7UUFDTCxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7UUFDcEMsSUFBQSxjQUFFLEVBQUMsNkNBQTZDLEVBQUUsS0FBSztZQUNyRCxNQUFNLE1BQU0sR0FBRztnQkFDYixVQUFVLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3BCLEdBQUcsb0NBQXdCO3dCQUMzQixRQUFRLEVBQUU7NEJBQ1IsR0FBRyxvQ0FBd0IsQ0FBQyxRQUFROzRCQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU87NEJBQ2hDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO3lCQUN0QjtxQkFDRixDQUFDO2lCQUNIO2dCQUNELE1BQU0sRUFBRSxFQUFFO2FBQ1gsQ0FBQztZQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2RCxPQUFPLEVBQUUsa0JBQWtCO2FBQzVCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMseURBQXlELEVBQUUsS0FBSztZQUNqRSxNQUFNLE1BQU0sR0FBRztnQkFDYixRQUFRLEVBQUU7b0JBQ1IsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO2lCQUNuRjthQUNGLENBQUM7WUFFRixNQUFNLHFCQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdkQsT0FBTyxFQUFFLG9CQUFvQjthQUM5QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLHFEQUFxRCxFQUFFLEtBQUs7WUFDN0QsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztpQkFDbkY7Z0JBQ0QsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLEVBQUU7YUFDWCxDQUFDO1lBRUYsTUFBTSxxQkFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3ZELE9BQU8sRUFBRSw2QkFBNkI7YUFDdkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7UUFDeEMsSUFBQSxvQkFBUSxFQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtZQUNoQyxJQUFBLGNBQUUsRUFBQyx3Q0FBd0MsRUFBRSxLQUFLO2dCQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sZ0JBQWdCLEdBQUc7b0JBQ3ZCLFNBQVMsRUFBRTt3QkFDVCxLQUFLLEVBQUU7NEJBQ0wsTUFBTSxFQUFFLE9BQU87NEJBQ2YsYUFBYSxFQUFFLDRDQUE0Qzs0QkFDM0QsVUFBVSxFQUFFLDRDQUE0Qzt5QkFDekQ7d0JBQ0QsUUFBUSxFQUFFLCtDQUErQztxQkFDMUQ7b0JBQ0QsSUFBSSxFQUFFLGtCQUFrQjtpQkFDekIsQ0FBQztnQkFFRixNQUFNLE9BQU8sR0FBRztvQkFDZCxRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDNUIsZUFBZSxFQUFFLE1BQU07b0JBQ3ZCLGNBQWMsRUFBRSxrQkFBa0I7b0JBQ2xDLFVBQVUsRUFBRSxTQUFTLEdBQUcsT0FBTztvQkFDL0IsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFNBQVMsRUFBRSxTQUFTO2lCQUNyQixDQUFDO2dCQUVGLDhEQUE4RDtnQkFDOUQsTUFBTSxrQkFBa0IsR0FBRztvQkFDekIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFlO29CQUNqQyxhQUFhLEVBQUUsT0FBTyxDQUFDLGVBQWU7b0JBQ3RDLFlBQVksRUFBRSxPQUFPLENBQUMsY0FBYztvQkFDcEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO29CQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLFFBQVEsRUFBRSxPQUFPLENBQUMsU0FBUztpQkFDNUIsQ0FBQztnQkFFRixtREFBbUQ7Z0JBQ25ELE1BQU0sVUFBVSxHQUFHLFdBQUssQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUVoRSxnREFBZ0Q7Z0JBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXZGLE1BQU0sTUFBTSxHQUFHO29CQUNiLFFBQVEsRUFBRTt3QkFDUixVQUFVLEVBQUU7NEJBQ1Y7Z0NBQ0UsT0FBTyxFQUFFLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyw0Q0FBNEMsQ0FBQztnQ0FDcEYsTUFBTSxFQUFFLFNBQVM7NkJBQ2xCO3lCQUNGO3FCQUNGO29CQUNELFVBQVUsRUFBRTt3QkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDcEIsSUFBSTs0QkFDSixRQUFRLEVBQUUsT0FBTzs0QkFDakIsWUFBWSxFQUFFLFVBQVU7eUJBQ3pCLENBQUM7cUJBQ0g7b0JBQ0QsTUFBTSxFQUFFLEVBQUU7aUJBQ1gsQ0FBQztnQkFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEQscUJBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBQSxjQUFFLEVBQUMsd0NBQXdDLEVBQUUsS0FBSztnQkFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksR0FBRyxrRUFBa0UsQ0FBQztnQkFDaEYsTUFBTSxnQkFBZ0IsR0FBRztvQkFDdkIsU0FBUyxFQUFFO3dCQUNULEtBQUssRUFBRTs0QkFDTCxNQUFNLEVBQUUsT0FBTzs0QkFDZixVQUFVLEVBQUUsNENBQTRDO3lCQUN6RDt3QkFDRCxRQUFRLEVBQUUsK0NBQStDO3FCQUMxRDtvQkFDRCxJQUFJLEVBQUUsa0JBQWtCO2lCQUN6QixDQUFDO2dCQUVGLE1BQU0sT0FBTyxHQUFHO29CQUNkLElBQUk7b0JBQ0osUUFBUSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzVCLGVBQWUsRUFBRSxNQUFNO29CQUN2QixjQUFjLEVBQUUsa0JBQWtCO29CQUNsQyxVQUFVLEVBQUUsU0FBUyxHQUFHLE9BQU87b0JBQy9CLFNBQVMsRUFBRSxTQUFTO29CQUNwQixTQUFTLEVBQUUsU0FBUztpQkFDckIsQ0FBQztnQkFFRixNQUFNLGtCQUFrQixHQUFHO29CQUN6QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQWU7b0JBQ2pDLGFBQWEsRUFBRSxPQUFPLENBQUMsZUFBZTtvQkFDdEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxjQUFjO29CQUNwQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7b0JBQzlCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lCQUM1QixDQUFDO2dCQUVGLE1BQU0sa0JBQWtCLEdBQUcsV0FBSyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRXhFLE1BQU0sTUFBTSxHQUFHO29CQUNiLFFBQVEsRUFBRTt3QkFDUixVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7cUJBQ25GO29CQUNELFVBQVUsRUFBRTt3QkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDcEIsSUFBSTs0QkFDSixRQUFRLEVBQUUsT0FBTzs0QkFDakIsWUFBWSxFQUFFLGtCQUFrQjt5QkFDakMsQ0FBQztxQkFDSDtvQkFDRCxNQUFNLEVBQUUsRUFBRTtpQkFDWCxDQUFDO2dCQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEVBQUUscUNBQXFDO2lCQUMvQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUEsY0FBRSxFQUFDLDhDQUE4QyxFQUFFLEtBQUs7Z0JBQ3RELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxJQUFJLEdBQUcsa0VBQWtFLENBQUM7Z0JBQ2hGLE1BQU0sZ0JBQWdCLEdBQUc7b0JBQ3ZCLFNBQVMsRUFBRTt3QkFDVCxLQUFLLEVBQUU7NEJBQ0wsTUFBTSxFQUFFLE9BQU87NEJBQ2YsYUFBYSxFQUFFLDRDQUE0Qzt5QkFDNUQ7d0JBQ0QsUUFBUSxFQUFFLCtDQUErQztxQkFDMUQ7b0JBQ0QsSUFBSSxFQUFFLGtCQUFrQjtpQkFDekIsQ0FBQztnQkFFRixNQUFNLE9BQU8sR0FBRztvQkFDZCxJQUFJO29CQUNKLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUM1QixlQUFlLEVBQUUsTUFBTTtvQkFDdkIsY0FBYyxFQUFFLGtCQUFrQjtvQkFDbEMsVUFBVSxFQUFFLFNBQVMsR0FBRyxPQUFPO29CQUMvQixTQUFTLEVBQUUsU0FBUztvQkFDcEIsU0FBUyxFQUFFLFNBQVM7aUJBQ3JCLENBQUM7Z0JBRUYsTUFBTSxrQkFBa0IsR0FBRztvQkFDekIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFlO29CQUNqQyxhQUFhLEVBQUUsT0FBTyxDQUFDLGVBQWU7b0JBQ3RDLFlBQVksRUFBRSxPQUFPLENBQUMsY0FBYztvQkFDcEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO29CQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLFFBQVEsRUFBRSxPQUFPLENBQUMsU0FBUztpQkFDNUIsQ0FBQztnQkFFRixNQUFNLGtCQUFrQixHQUFHLFdBQUssQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUV4RSxNQUFNLE1BQU0sR0FBRztvQkFDYixRQUFRLEVBQUU7d0JBQ1IsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO3FCQUNuRjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ3BCLElBQUk7NEJBQ0osUUFBUSxFQUFFLE9BQU87NEJBQ2pCLFlBQVksRUFBRSxrQkFBa0I7eUJBQ2pDLENBQUM7cUJBQ0g7b0JBQ0QsTUFBTSxFQUFFLEVBQUU7aUJBQ1gsQ0FBQztnQkFFRixNQUFNLHFCQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDdkQsT0FBTyxFQUFFLHFDQUFxQztpQkFDL0MsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFBLGNBQUUsRUFBQyxpQ0FBaUMsRUFBRSxLQUFLO2dCQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sZ0JBQWdCLEdBQUc7b0JBQ3ZCLFNBQVMsRUFBRTt3QkFDVCxLQUFLLEVBQUU7NEJBQ0wsYUFBYSxFQUFFLDRDQUE0Qzs0QkFDM0QsVUFBVSxFQUFFLDRDQUE0Qzt5QkFDekQ7d0JBQ0QsUUFBUSxFQUFFLCtDQUErQztxQkFDMUQ7b0JBQ0QsSUFBSSxFQUFFLGtCQUFrQjtpQkFDekIsQ0FBQztnQkFFRixNQUFNLE9BQU8sR0FBRztvQkFDZCxRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDNUIsZUFBZSxFQUFFLE1BQU07b0JBQ3ZCLGNBQWMsRUFBRSxrQkFBa0I7b0JBQ2xDLFVBQVUsRUFBRSxTQUFTLEdBQUcsT0FBTztvQkFDL0IsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFNBQVMsRUFBRSxTQUFTO2lCQUNyQixDQUFDO2dCQUVGLE1BQU0sa0JBQWtCLEdBQUc7b0JBQ3pCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBZTtvQkFDakMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxlQUFlO29CQUN0QyxZQUFZLEVBQUUsT0FBTyxDQUFDLGNBQWM7b0JBQ3BDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO29CQUM1QixRQUFRLEVBQUUsT0FBTyxDQUFDLFNBQVM7aUJBQzVCLENBQUM7Z0JBRUYsTUFBTSxrQkFBa0IsR0FBRyxXQUFLLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFFeEUsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsUUFBUSxFQUFFO3dCQUNSLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztxQkFDbkY7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNwQixRQUFRLEVBQUUsT0FBTzs0QkFDakIsWUFBWSxFQUFFLGtCQUFrQjt5QkFDakMsQ0FBQztxQkFDSDtvQkFDRCxNQUFNLEVBQUUsRUFBRTtpQkFDWCxDQUFDO2dCQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEVBQUUsa0RBQWtEO2lCQUM1RCxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUEsY0FBRSxFQUFDLHFDQUFxQyxFQUFFLEtBQUs7Z0JBQzdDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxnQkFBZ0IsR0FBRztvQkFDdkIsU0FBUyxFQUFFO3dCQUNULEtBQUssRUFBRTs0QkFDTCxNQUFNLEVBQUUsT0FBTzs0QkFDZixhQUFhLEVBQUUsNENBQTRDOzRCQUMzRCxVQUFVLEVBQUUsNENBQTRDO3lCQUN6RDt3QkFDRCxRQUFRLEVBQUUsK0NBQStDO3FCQUMxRDtvQkFDRCxJQUFJLEVBQUUsa0JBQWtCO2lCQUN6QixDQUFDO2dCQUVGLE1BQU0sT0FBTyxHQUFHO29CQUNkLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUM1QixlQUFlLEVBQUUsTUFBTTtvQkFDdkIsY0FBYyxFQUFFLGtCQUFrQjtvQkFDbEMsVUFBVSxFQUFFLFNBQVMsR0FBRyxPQUFPO29CQUMvQixTQUFTLEVBQUUsU0FBUztvQkFDcEIsU0FBUyxFQUFFLFNBQVM7aUJBQ3JCLENBQUM7Z0JBRUYsOERBQThEO2dCQUM5RCxNQUFNLGtCQUFrQixHQUFHO29CQUN6QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQWU7b0JBQ2pDLGFBQWEsRUFBRSxPQUFPLENBQUMsZUFBZTtvQkFDdEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxjQUFjO29CQUNwQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7b0JBQzlCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lCQUM1QixDQUFDO2dCQUVGLG1EQUFtRDtnQkFDbkQsTUFBTSxVQUFVLEdBQUcsV0FBSyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRWhFLGdEQUFnRDtnQkFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFdkYsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsUUFBUSxFQUFFO3dCQUNSLFVBQVUsRUFBRTs0QkFDVjtnQ0FDRSxPQUFPLEVBQUUsNENBQTRDO2dDQUNyRCxNQUFNLEVBQUUsU0FBUzs2QkFDbEI7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNwQixJQUFJOzRCQUNKLFFBQVEsRUFBRSxPQUFPOzRCQUNqQixZQUFZLEVBQUUsVUFBVTt5QkFDekIsQ0FBQztxQkFDSDtvQkFDRCxNQUFNLEVBQUUsRUFBRTtpQkFDWCxDQUFDO2dCQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEVBQUUsMkVBQTJFO2lCQUNyRixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUEsY0FBRSxFQUFDLGtEQUFrRCxFQUFFLEtBQUs7Z0JBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxnQkFBZ0IsR0FBRztvQkFDdkIsU0FBUyxFQUFFO3dCQUNULEtBQUssRUFBRTs0QkFDTCxNQUFNLEVBQUUsT0FBTzs0QkFDZixhQUFhLEVBQUUsNENBQTRDOzRCQUMzRCxVQUFVLEVBQUUsNENBQTRDO3lCQUN6RDt3QkFDRCxRQUFRLEVBQUUsK0NBQStDO3FCQUMxRDtvQkFDRCxJQUFJLEVBQUUsa0JBQWtCO2lCQUN6QixDQUFDO2dCQUVGLE1BQU0sT0FBTyxHQUFHO29CQUNkLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUM1QixlQUFlLEVBQUUsTUFBTTtvQkFDdkIsY0FBYyxFQUFFLGtCQUFrQjtvQkFDbEMsVUFBVSxFQUFFLFNBQVMsR0FBRyxPQUFPO29CQUMvQixTQUFTLEVBQUUsU0FBUztvQkFDcEIsU0FBUyxFQUFFLFNBQVM7aUJBQ3JCLENBQUM7Z0JBRUYsOERBQThEO2dCQUM5RCxNQUFNLGtCQUFrQixHQUFHO29CQUN6QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQWU7b0JBQ2pDLGFBQWEsRUFBRSxPQUFPLENBQUMsZUFBZTtvQkFDdEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxjQUFjO29CQUNwQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7b0JBQzlCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lCQUM1QixDQUFDO2dCQUVGLG1EQUFtRDtnQkFDbkQsTUFBTSxVQUFVLEdBQUcsV0FBSyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRWhFLGdEQUFnRDtnQkFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFdkYsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsUUFBUSxFQUFFO3dCQUNSLFVBQVUsRUFBRTs0QkFDVjtnQ0FDRSxPQUFPLEVBQUUsNENBQTRDO2dDQUNyRCxNQUFNLEVBQUUsU0FBUzs2QkFDbEI7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNwQixJQUFJOzRCQUNKLFFBQVEsRUFBRSxPQUFPOzRCQUNqQixZQUFZLEVBQUUsVUFBVTt5QkFDekIsQ0FBQztxQkFDSDtvQkFDRCxNQUFNLEVBQUUsRUFBRTtpQkFDWCxDQUFDO2dCQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEVBQUUsK0RBQStEO2lCQUN6RSxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLG9CQUFRLEVBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDOzs7V0FHRztRQUNILFNBQVMscUJBQXFCLENBQUMsTUFNOUI7WUFDQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqRCxNQUFNLGdCQUFnQixHQUFHO2dCQUN2QixTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTt3QkFDckIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxZQUFZO3dCQUNsQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7cUJBQzdCO29CQUNELFFBQVEsRUFBRSwrQ0FBK0M7aUJBQzFEO2dCQUNELElBQUksRUFBRSxrQkFBa0I7YUFDekIsQ0FBQztZQUVGLE1BQU0sa0JBQWtCLEdBQUc7Z0JBQ3pCLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFRO2dCQUNuQyxhQUFhLEVBQUUsTUFBTTtnQkFDckIsWUFBWSxFQUFFLGtCQUFrQjtnQkFDaEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxHQUFHLE9BQU87Z0JBQ3BELFNBQVMsRUFBRSxTQUFTO2FBQ3JCLENBQUM7WUFFRixPQUFPLFdBQUssQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFBLG9CQUFRLEVBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1lBQ2hDLElBQUEsY0FBRSxFQUFDLDhDQUE4QyxFQUFFLEtBQUs7Z0JBQ3RELE1BQU0sUUFBUSxHQUFHLDRDQUE0QyxDQUFDO2dCQUM5RCxNQUFNLEtBQUssR0FBRyw0Q0FBNEMsQ0FBQztnQkFDM0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO2dCQUV2QixNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUUvRixNQUFNLE1BQU0sR0FBRztvQkFDYixRQUFRLEVBQUU7d0JBQ1IsVUFBVSxFQUFFOzRCQUNWO2dDQUNFLDRDQUE0QztnQ0FDNUMsT0FBTyxFQUFFLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7Z0NBQzdDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFOzZCQUMxQjt5QkFDRjtxQkFDRjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsNkRBQTZEO3dCQUM3RCxLQUFLLEVBQUUsVUFBVTtxQkFDbEI7b0JBQ0QsTUFBTSxFQUFFLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCLENBQUM7Z0JBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hELHFCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUEsY0FBRSxFQUFDLHlEQUF5RCxFQUFFLEtBQUs7Z0JBQ2pFLE1BQU0sUUFBUSxHQUFHLDRDQUE0QyxDQUFDO2dCQUM5RCxNQUFNLEtBQUssR0FBRyw0Q0FBNEMsQ0FBQztnQkFFM0QsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBRXhHLE1BQU0sTUFBTSxHQUFHO29CQUNiLFFBQVEsRUFBRTt3QkFDUixVQUFVLEVBQUU7NEJBQ1Y7Z0NBQ0UsT0FBTyxFQUFFLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7Z0NBQzdDLE1BQU0sRUFBRSxTQUFTLEVBQUUsOEJBQThCOzZCQUNsRDt5QkFDRjtxQkFDRjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsS0FBSyxFQUFFLFVBQVU7cUJBQ2xCO29CQUNELE1BQU0sRUFBRSxFQUFFO29CQUNWLFVBQVUsRUFBRSxLQUFLO2lCQUNsQixDQUFDO2dCQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEVBQUUsMkVBQTJFO2lCQUNyRixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUEsY0FBRSxFQUFDLHNFQUFzRSxFQUFFLEtBQUs7Z0JBQzlFLE1BQU0sUUFBUSxHQUFHLDRDQUE0QyxDQUFDO2dCQUM5RCxNQUFNLEtBQUssR0FBRyw0Q0FBNEMsQ0FBQztnQkFFM0QsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBRXhHLE1BQU0sTUFBTSxHQUFHO29CQUNiLFFBQVEsRUFBRTt3QkFDUixVQUFVLEVBQUU7NEJBQ1Y7Z0NBQ0UsbURBQW1EO2dDQUNuRCxPQUFPLEVBQUUsb0NBQW9DO2dDQUM3QyxNQUFNLEVBQUUsU0FBUzs2QkFDbEI7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLEtBQUssRUFBRSxVQUFVO3FCQUNsQjtvQkFDRCxNQUFNLEVBQUUsRUFBRTtvQkFDVixVQUFVLEVBQUUsS0FBSztpQkFDbEIsQ0FBQztnQkFFRixNQUFNLHFCQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDdkQsT0FBTyxFQUFFLCtEQUErRDtpQkFDekUsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLDJEQUEyRCxFQUFFLEtBQUs7WUFDbkUsb0ZBQW9GO1lBQ3BGLCtCQUErQjtZQUMvQixNQUFNLFVBQVUsR0FBRyxxREFBeUMsQ0FBQyxZQUFZLENBQUM7WUFFMUUsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLFVBQVUsRUFBRSxFQUFFO2lCQUNmO2dCQUNELFVBQVUsRUFBRTtvQkFDVixLQUFLLEVBQUUsVUFBVTtpQkFDbEI7Z0JBQ0QsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLEtBQUs7YUFDbEIsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELHFCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLHlEQUF5RCxFQUFFLEtBQUs7WUFDakUsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztpQkFDbkY7Z0JBQ0QsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLEtBQUs7YUFDbEIsQ0FBQztZQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2RCxPQUFPLEVBQUUsNkJBQTZCO2FBQ3ZDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxvQkFBUSxFQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUNsRCxrRkFBa0Y7WUFDbEYsc0ZBQXNGO1lBQ3RGLHVEQUF1RDtZQUV2RCxJQUFBLGNBQUUsRUFBQyxvRkFBb0YsRUFBRSxLQUFLO2dCQUM1RixNQUFNLFFBQVEsR0FBRyw0Q0FBNEMsQ0FBQztnQkFDOUQsTUFBTSxLQUFLLEdBQUcsNENBQTRDLENBQUM7Z0JBQzNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztnQkFFdkIsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDL0YsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFdkYsNEZBQTRGO2dCQUM1RixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNyQyxJQUFJO29CQUNKLFlBQVksRUFBRSxVQUFVO29CQUN4QixRQUFRLEVBQUUsRUFBRTtpQkFDYixDQUFDLENBQUM7Z0JBRUgsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsUUFBUSxFQUFFO3dCQUNSLFVBQVUsRUFBRTs0QkFDVjtnQ0FDRSxPQUFPLEVBQUUsV0FBSyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQztnQ0FDN0MsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUU7NkJBQzFCO3lCQUNGO3FCQUNGO29CQUNELFVBQVUsRUFBRTt3QkFDVixLQUFLLEVBQUUsZUFBZTtxQkFDdkI7b0JBQ0QsTUFBTSxFQUFFLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCLENBQUM7Z0JBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hELHFCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUEsY0FBRSxFQUFDLG9EQUFvRCxFQUFFLEtBQUs7Z0JBQzVELE1BQU0sUUFBUSxHQUFHLDRDQUE0QyxDQUFDO2dCQUM5RCxNQUFNLEtBQUssR0FBRyw0Q0FBNEMsQ0FBQztnQkFFM0QsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3hHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ3JDLElBQUksRUFBRSxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDL0UsWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLFFBQVEsRUFBRSxFQUFFO2lCQUNiLENBQUMsQ0FBQztnQkFFSCxNQUFNLE1BQU0sR0FBRztvQkFDYixRQUFRLEVBQUU7d0JBQ1IsVUFBVSxFQUFFOzRCQUNWO2dDQUNFLE9BQU8sRUFBRSxXQUFLLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDO2dDQUM3QyxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVc7NkJBQy9CO3lCQUNGO3FCQUNGO29CQUNELFVBQVUsRUFBRTt3QkFDVixLQUFLLEVBQUUsZUFBZTtxQkFDdkI7b0JBQ0QsTUFBTSxFQUFFLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCLENBQUM7Z0JBRUYsTUFBTSxxQkFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ3ZELE9BQU8sRUFBRSwyRUFBMkU7aUJBQ3JGLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGRlc2NyaWJlLCBpdCwgYmVmb3JlIH0gZnJvbSAnbm9kZTp0ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R29BUEksIFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IFRyeCwgVHRyeCB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uLCBVbnNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeCB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5cbmRlc2NyaWJlKCdUUk9OIFZlcmlmeSBUcmFuc2FjdGlvbjonLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpdGdvOiBUZXN0Qml0R29BUEkgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RyeCcsIFRyeC5jcmVhdGVJbnN0YW5jZSk7XG4gIGJpdGdvLnNhZmVSZWdpc3RlcigndHRyeCcsIFR0cnguY3JlYXRlSW5zdGFuY2UpO1xuXG4gIGxldCBiYXNlY29pbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndHRyeCcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyYW1ldGVyIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UGFyYW1zIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgLi4uVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgcmF3X2RhdGE6IHtcbiAgICAgICAgICAgICAgLi4uVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uLnJhd19kYXRhLFxuICAgICAgICAgICAgICBleHBpcmF0aW9uOiBEYXRlLm5vdygpICsgMzYwMDAwMCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgbWVzc2FnZTogJ21pc3NpbmcgdHhQYXJhbXMnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gd2FsbGV0IG9yIHR4UHJlYnVpbGQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVFFGeERTb1h5MnlYUkU1SHRLd0F3ck5SWEd4WXhrZVNHaycsIGFtb3VudDogJzEwMDAwMDAnIH1dLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICBtZXNzYWdlOiAnbWlzc2luZyB0eFByZWJ1aWxkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVFFGeERTb1h5MnlYUkU1SHRLd0F3ck5SWEd4WXhrZVNHaycsIGFtb3VudDogJzEwMDAwMDAnIH1dLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7fSxcbiAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgbWVzc2FnZTogJ21pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbnRyYWN0IFR5cGUgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBkZXNjcmliZSgnVHJhbnNmZXJDb250cmFjdCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmFsaWQgVHJhbnNmZXJDb250cmFjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMCxcbiAgICAgICAgICAgICAgb3duZXJfYWRkcmVzczogJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNScsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSByYXdEYXRhIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXIgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByYXdfZGF0YV9oZXggdXNpbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0eElEIGFzIFNIQTI1NiBoYXNoIG9mIHJhd19kYXRhX2hleFxuICAgICAgICBjb25zdCB0eElEID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KCc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInKSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0eElELFxuICAgICAgICAgICAgICByYXdfZGF0YTogcmF3RGF0YSxcbiAgICAgICAgICAgICAgcmF3X2RhdGFfaGV4OiByYXdEYXRhSGV4LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIG1pc3Npbmcgb3duZXIgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHhJRCA9ICcwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmJztcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMCxcbiAgICAgICAgICAgICAgdG9fYWRkcmVzczogJzQxYzI1NDIwMjU1YzJjNWEyZGQ1NGVmNjlmOTJlZjI2MWU2YmQ0MjE2YScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSB7XG4gICAgICAgICAgdHhJRCxcbiAgICAgICAgICBjb250cmFjdDogW3RyYW5zZmVyQ29udHJhY3RdLFxuICAgICAgICAgIHJlZl9ibG9ja19ieXRlczogJ2M4Y2YnLFxuICAgICAgICAgIHJlZl9ibG9ja19oYXNoOiAnODkxNzdmZDg0YzVkOTE5NicsXG4gICAgICAgICAgZXhwaXJhdGlvbjogdGltZXN0YW1wICsgMzYwMDAwMCxcbiAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVfbGltaXQ6IDE1MDAwMDAwMCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFJhd0RhdGEgPSB7XG4gICAgICAgICAgY29udHJhY3Q6IHJhd0RhdGEuY29udHJhY3QgYXMgYW55LFxuICAgICAgICAgIHJlZkJsb2NrQnl0ZXM6IHJhd0RhdGEucmVmX2Jsb2NrX2J5dGVzLFxuICAgICAgICAgIHJlZkJsb2NrSGFzaDogcmF3RGF0YS5yZWZfYmxvY2tfaGFzaCxcbiAgICAgICAgICBleHBpcmF0aW9uOiByYXdEYXRhLmV4cGlyYXRpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiByYXdEYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVMaW1pdDogcmF3RGF0YS5mZWVfbGltaXQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZXhwZWN0ZWRSYXdEYXRhSGV4ID0gVXRpbHMuZ2VuZXJhdGVSYXdEYXRhSGV4KHRyYW5zZm9ybWVkUmF3RGF0YSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVExXaDY3UDkzS2d0blpOQ3RHbkVITTFIMzNOaHEydXZ2TicsIGFtb3VudDogJzEwMDAwMDAnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgICAgdHhIZXg6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgdHhJRCxcbiAgICAgICAgICAgICAgcmF3X2RhdGE6IHJhd0RhdGEsXG4gICAgICAgICAgICAgIHJhd19kYXRhX2hleDogZXhwZWN0ZWRSYXdEYXRhSGV4LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgICBtZXNzYWdlOiAnVHJhbnNhY3Rpb24gaGFzIG5vdCBoYXZlIGEgdmFsaWQgaWQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtaXNzaW5nIGRlc3RpbmF0aW9uIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHR4SUQgPSAnMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZic7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAsXG4gICAgICAgICAgICAgIG93bmVyX2FkZHJlc3M6ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgY29udHJhY3Q6IFt0cmFuc2ZlckNvbnRyYWN0XSxcbiAgICAgICAgICByZWZfYmxvY2tfYnl0ZXM6ICdjOGNmJyxcbiAgICAgICAgICByZWZfYmxvY2tfaGFzaDogJzg5MTc3ZmQ4NGM1ZDkxOTYnLFxuICAgICAgICAgIGV4cGlyYXRpb246IHRpbWVzdGFtcCArIDM2MDAwMDAsXG4gICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsXG4gICAgICAgICAgZmVlX2xpbWl0OiAxNTAwMDAwMDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiByYXdEYXRhLmNvbnRyYWN0IGFzIGFueSxcbiAgICAgICAgICByZWZCbG9ja0J5dGVzOiByYXdEYXRhLnJlZl9ibG9ja19ieXRlcyxcbiAgICAgICAgICByZWZCbG9ja0hhc2g6IHJhd0RhdGEucmVmX2Jsb2NrX2hhc2gsXG4gICAgICAgICAgZXhwaXJhdGlvbjogcmF3RGF0YS5leHBpcmF0aW9uLFxuICAgICAgICAgIHRpbWVzdGFtcDogcmF3RGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgZmVlTGltaXQ6IHJhd0RhdGEuZmVlX2xpbWl0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RMV2g2N1A5M0tndG5aTkN0R25FSE0xSDMzTmhxMnV2dk4nLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IGV4cGVjdGVkUmF3RGF0YUhleCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ1RyYW5zYWN0aW9uIGhhcyBub3QgaGF2ZSBhIHZhbGlkIGlkJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggbWlzc2luZyBhbW91bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBvd25lcl9hZGRyZXNzOiAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JyxcbiAgICAgICAgICAgICAgdG9fYWRkcmVzczogJzQxYzI1NDIwMjU1YzJjNWEyZGQ1NGVmNjlmOTJlZjI2MWU2YmQ0MjE2YScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSB7XG4gICAgICAgICAgY29udHJhY3Q6IFt0cmFuc2ZlckNvbnRyYWN0XSxcbiAgICAgICAgICByZWZfYmxvY2tfYnl0ZXM6ICdjOGNmJyxcbiAgICAgICAgICByZWZfYmxvY2tfaGFzaDogJzg5MTc3ZmQ4NGM1ZDkxOTYnLFxuICAgICAgICAgIGV4cGlyYXRpb246IHRpbWVzdGFtcCArIDM2MDAwMDAsXG4gICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsXG4gICAgICAgICAgZmVlX2xpbWl0OiAxNTAwMDAwMDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiByYXdEYXRhLmNvbnRyYWN0IGFzIGFueSxcbiAgICAgICAgICByZWZCbG9ja0J5dGVzOiByYXdEYXRhLnJlZl9ibG9ja19ieXRlcyxcbiAgICAgICAgICByZWZCbG9ja0hhc2g6IHJhd0RhdGEucmVmX2Jsb2NrX2hhc2gsXG4gICAgICAgICAgZXhwaXJhdGlvbjogcmF3RGF0YS5leHBpcmF0aW9uLFxuICAgICAgICAgIHRpbWVzdGFtcDogcmF3RGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgZmVlTGltaXQ6IHJhd0RhdGEuZmVlX2xpbWl0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RMV2g2N1A5M0tndG5aTkN0R25FSE0xSDMzTmhxMnV2dk4nLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IGV4cGVjdGVkUmF3RGF0YUhleCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ0Ftb3VudCBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHRyYW5zZmVyIGNvbnRyYWN0LicsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBkdWUgdG8gYW1vdW50IG1pc3NtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMCxcbiAgICAgICAgICAgICAgb3duZXJfYWRkcmVzczogJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNScsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSByYXdEYXRhIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXIgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByYXdfZGF0YV9oZXggdXNpbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0eElEIGFzIFNIQTI1NiBoYXNoIG9mIHJhd19kYXRhX2hleFxuICAgICAgICBjb25zdCB0eElEID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGR1ZSB0byBkZXN0aW5hdGlvbiBhZGRyZXNzIG1pc3NtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMCxcbiAgICAgICAgICAgICAgb3duZXJfYWRkcmVzczogJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNScsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSByYXdEYXRhIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXIgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByYXdfZGF0YV9oZXggdXNpbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0eElEIGFzIFNIQTI1NiBoYXNoIG9mIHJhd19kYXRhX2hleFxuICAgICAgICBjb25zdCB0eElEID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODMnLFxuICAgICAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZXN0aW5hdGlvbiBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHJlY2lwaWVudCBhZGRyZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RTUyBXYWxsZXQgVmVyaWZpY2F0aW9uJywgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIEhlbHBlciB0byBidWlsZCBhIHJhd19kYXRhX2hleCAocHJvdG9idWYpIGZvciBhIFRyYW5zZmVyQ29udHJhY3QuXG4gICAgICogRm9yIFRTUywgdHhQcmVidWlsZC50eEhleCBpcyB0aGUgcmF3X2RhdGFfaGV4IGRpcmVjdGx5IChub3QgYSBKU09OIHN0cmluZykuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYnVpbGRUc3NUcmFuc2ZlclR4SGV4KHBhcmFtczoge1xuICAgICAgb3duZXJBZGRyZXNzOiBzdHJpbmc7XG4gICAgICB0b0FkZHJlc3M6IHN0cmluZztcbiAgICAgIGFtb3VudDogbnVtYmVyO1xuICAgICAgdGltZXN0YW1wPzogbnVtYmVyO1xuICAgICAgZXhwaXJhdGlvbj86IG51bWJlcjtcbiAgICB9KTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcmFtcy50aW1lc3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgIHBhcmFtZXRlcjoge1xuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBvd25lcl9hZGRyZXNzOiBwYXJhbXMub3duZXJBZGRyZXNzLFxuICAgICAgICAgICAgdG9fYWRkcmVzczogcGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogJ1RyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHJhbnNmb3JtZWRSYXdEYXRhID0ge1xuICAgICAgICBjb250cmFjdDogW3RyYW5zZmVyQ29udHJhY3RdIGFzIGFueSxcbiAgICAgICAgcmVmQmxvY2tCeXRlczogJ2M4Y2YnLFxuICAgICAgICByZWZCbG9ja0hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgZXhwaXJhdGlvbjogcGFyYW1zLmV4cGlyYXRpb24gfHwgdGltZXN0YW1wICsgMzYwMDAwMCxcbiAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gVXRpbHMuZ2VuZXJhdGVSYXdEYXRhSGV4KHRyYW5zZm9ybWVkUmF3RGF0YSk7XG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJ1RyYW5zZmVyQ29udHJhY3QnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgdmFsaWQgVFNTIFRyYW5zZmVyQ29udHJhY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG93bmVySGV4ID0gJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNSc7XG4gICAgICAgIGNvbnN0IHRvSGV4ID0gJzQxZDZjZDZhMmMwZmYzNWEzMTllNmFiYjViOTUwM2JhMDI3ODY3OTg4Mic7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IDEwMDAwMDA7XG5cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IGJ1aWxkVHNzVHJhbnNmZXJUeEhleCh7IG93bmVyQWRkcmVzczogb3duZXJIZXgsIHRvQWRkcmVzczogdG9IZXgsIGFtb3VudCB9KTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFRTUyBwYXRoOiByZWNpcGllbnRzIHVzZSBiYXNlNTggYWRkcmVzc2VzXG4gICAgICAgICAgICAgICAgYWRkcmVzczogVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodG9IZXgpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgICAgLy8gVFNTIHBhdGg6IHR4SGV4IGlzIHRoZSByYXcgcHJvdG9idWYgaGV4LCBub3QgYSBKU09OIHN0cmluZ1xuICAgICAgICAgICAgdHhIZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBUU1MgdmVyaWZpY2F0aW9uIHdoZW4gYW1vdW50IGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvd25lckhleCA9ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnO1xuICAgICAgICBjb25zdCB0b0hleCA9ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInO1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBidWlsZFRzc1RyYW5zZmVyVHhIZXgoeyBvd25lckFkZHJlc3M6IG93bmVySGV4LCB0b0FkZHJlc3M6IHRvSGV4LCBhbW91bnQ6IDIwMDAwMDAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh0b0hleCksXG4gICAgICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsIC8vIG1pc21hdGNoOiB0eEhleCBoYXMgMjAwMDAwMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiByYXdEYXRhSGV4LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ3RyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBnaXZlbiBieSBjbGllbnQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgVFNTIHZlcmlmaWNhdGlvbiB3aGVuIGRlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG93bmVySGV4ID0gJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNSc7XG4gICAgICAgIGNvbnN0IHRvSGV4ID0gJzQxZDZjZDZhMmMwZmYzNWEzMTllNmFiYjViOTUwM2JhMDI3ODY3OTg4Mic7XG5cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IGJ1aWxkVHNzVHJhbnNmZXJUeEhleCh7IG93bmVyQWRkcmVzczogb3duZXJIZXgsIHRvQWRkcmVzczogdG9IZXgsIGFtb3VudDogMTAwMDAwMCB9KTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBhZGRyZXNzIHRoYW4gd2hhdCdzIGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgICAgICAgICAgIGFkZHJlc3M6ICdUVHNHd25UTFE0ZXJ5RkpwRHZKU2Z1R1F4UFhSQ2pYdlp6JyxcbiAgICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogcmF3RGF0YUhleCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZXN0aW5hdGlvbiBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHJlY2lwaWVudCBhZGRyZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIG5vbi1UcmFuc2ZlciBjb250cmFjdCB0eXBlcyBpbiBUU1MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBGb3Igbm9uLVRyYW5zZmVyIGNvbnRyYWN0cyAoZS5nLiwgQWNjb3VudFBlcm1pc3Npb25VcGRhdGUpLCBUU1MgcGF0aCByZXR1cm5zIHRydWVcbiAgICAgIC8vIHdpdGhvdXQgZGV0YWlsZWQgdmFsaWRhdGlvbi5cbiAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBVbnNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeC5yYXdfZGF0YV9oZXg7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4OiByYXdEYXRhSGV4LFxuICAgICAgICB9LFxuICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eEhleCBpcyBtaXNzaW5nIGZvciBUU1Mgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdUUUZ4RFNvWHkyeVhSRTVIdEt3QXdyTlJYR3hZeGtlU0drJywgYW1vdW50OiAnMTAwMDAwMCcgfV0sXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHt9LFxuICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgbWVzc2FnZTogJ21pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXJpYWxpemVkVHhIZXggKEpTT04gc3RyaW5nKSBwYXRoJywgKCkgPT4ge1xuICAgICAgLy8gcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24gcGFzc2VzIHR4SGV4IGFzIHNlcmlhbGl6ZWRUeEhleCDigJQgYSBmdWxsIEpTT04gc3RyaW5nXG4gICAgICAvLyBjb250YWluaW5nIHsgdHhJRCwgcmF3X2RhdGEsIHJhd19kYXRhX2hleCB9LiBUaGUgVFNTIGJyYW5jaCBtdXN0IGhhbmRsZSB0aGlzIGZvcm1hdFxuICAgICAgLy8gYnkgZXh0cmFjdGluZyByYXdfZGF0YV9oZXggYmVmb3JlIHByb3RvYnVmIGRlY29kaW5nLlxuXG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFRTUyBUcmFuc2ZlckNvbnRyYWN0IHdoZW4gdHhIZXggaXMgYSBKU09OIHN0cmluZyAoc2VyaWFsaXplZFR4SGV4KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb3duZXJIZXggPSAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JztcbiAgICAgICAgY29uc3QgdG9IZXggPSAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJztcbiAgICAgICAgY29uc3QgYW1vdW50ID0gMTAwMDAwMDtcblxuICAgICAgICBjb25zdCByYXdEYXRhSGV4ID0gYnVpbGRUc3NUcmFuc2ZlclR4SGV4KHsgb3duZXJBZGRyZXNzOiBvd25lckhleCwgdG9BZGRyZXNzOiB0b0hleCwgYW1vdW50IH0pO1xuICAgICAgICBjb25zdCB0eElEID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICAvLyBTaW11bGF0ZSB0aGUgc2VyaWFsaXplZFR4SGV4IGZvcm1hdCBmcm9tIEJpdEdvIEFQSSAoSlNPTiBzdHJpbmcgd2l0aCB0eElEICsgcmF3X2RhdGFfaGV4KVxuICAgICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdHhJRCxcbiAgICAgICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgcmF3X2RhdGE6IHt9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KHRvSGV4KSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBzZXJpYWxpemVkVHhIZXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGFtb3VudCBtaXNtYXRjaGVzIHdpdGggSlNPTiB0eEhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb3duZXJIZXggPSAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JztcbiAgICAgICAgY29uc3QgdG9IZXggPSAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJztcblxuICAgICAgICBjb25zdCByYXdEYXRhSGV4ID0gYnVpbGRUc3NUcmFuc2ZlclR4SGV4KHsgb3duZXJBZGRyZXNzOiBvd25lckhleCwgdG9BZGRyZXNzOiB0b0hleCwgYW1vdW50OiAyMDAwMDAwIH0pO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdHhJRDogY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKSxcbiAgICAgICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgcmF3X2RhdGE6IHt9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KHRvSGV4KSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJywgLy8gbWlzbWF0Y2hcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogc2VyaWFsaXplZFR4SGV4LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ3RyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBnaXZlbiBieSBjbGllbnQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
593
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMsbUNBQW9DO0FBQ3BDLHlDQUFpRDtBQUNqRCxpREFBK0M7QUFDL0MsbURBQStEO0FBQy9ELG1DQUFzQztBQUN0Qyx1Q0FBc0M7QUFDdEMsNENBQW1HO0FBRW5HLElBQUEsb0JBQVEsRUFBQywwQkFBMEIsRUFBRTtJQUNuQyxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsSUFBSSxRQUFRLENBQUM7SUFFYixJQUFBLGtCQUFNLEVBQUM7UUFDTCxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7UUFDcEMsSUFBQSxjQUFFLEVBQUMsNkNBQTZDLEVBQUUsS0FBSztZQUNyRCxNQUFNLE1BQU0sR0FBRztnQkFDYixVQUFVLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3BCLEdBQUcsb0NBQXdCO3dCQUMzQixRQUFRLEVBQUU7NEJBQ1IsR0FBRyxvQ0FBd0IsQ0FBQyxRQUFROzRCQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU87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RSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNyQyxJQUFJLEVBQUUsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQy9FLFlBQVksRUFBRSxVQUFVO29CQUN4QixRQUFRLEVBQUUsRUFBRTtpQkFDYixDQUFDLENBQUM7Z0JBRUgsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsUUFBUSxFQUFFO3dCQUNSLFVBQVUsRUFBRTs0QkFDVjtnQ0FDRSxPQUFPLEVBQUUsV0FBSyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQztnQ0FDN0MsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXOzZCQUMvQjt5QkFDRjtxQkFDRjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsS0FBSyxFQUFFLGVBQWU7cUJBQ3ZCO29CQUNELE1BQU0sRUFBRSxFQUFFO29CQUNWLFVBQVUsRUFBRSxLQUFLO2lCQUNsQixDQUFDO2dCQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEVBQUUsMkVBQTJFO2lCQUNyRixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQsIGJlZm9yZSB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgVGVzdEJpdEdvQVBJLCBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBUcngsIFR0cnggfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IFVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbiwgVW5zaWduZWRBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0VHggfSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5kZXNjcmliZSgnVFJPTiBWZXJpZnkgVHJhbnNhY3Rpb246JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbzogVGVzdEJpdEdvQVBJID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0cngnLCBUcnguY3JlYXRlSW5zdGFuY2UpO1xuICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3R0cngnLCBUdHJ4LmNyZWF0ZUluc3RhbmNlKTtcblxuICBsZXQgYmFzZWNvaW47XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3R0cngnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcmFtZXRlciBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFBhcmFtcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIC4uLlVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbixcbiAgICAgICAgICAgIHJhd19kYXRhOiB7XG4gICAgICAgICAgICAgIC4uLlVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbi5yYXdfZGF0YSxcbiAgICAgICAgICAgICAgZXhwaXJhdGlvbjogRGF0ZS5ub3coKSArIDM2MDAwMDAsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldDoge30sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UGFyYW1zJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHdhbGxldCBvciB0eFByZWJ1aWxkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RRRnhEU29YeTJ5WFJFNUh0S3dBd3JOUlhHeFl4a2VTR2snLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgbWVzc2FnZTogJ21pc3NpbmcgdHhQcmVidWlsZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFByZWJ1aWxkLnR4SGV4IGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RRRnhEU29YeTJ5WFJFNUh0S3dBd3JOUlhHeFl4a2VTR2snLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDoge30sXG4gICAgICAgIHdhbGxldDoge30sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4SGV4IGluIHR4UHJlYnVpbGQnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDb250cmFjdCBUeXBlIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ1RyYW5zZmVyQ29udHJhY3QnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHZhbGlkIFRyYW5zZmVyQ29udHJhY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAsXG4gICAgICAgICAgICAgIG93bmVyX2FkZHJlc3M6ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnLFxuICAgICAgICAgICAgICB0b19hZGRyZXNzOiAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogW3RyYW5zZmVyQ29udHJhY3RdLFxuICAgICAgICAgIHJlZl9ibG9ja19ieXRlczogJ2M4Y2YnLFxuICAgICAgICAgIHJlZl9ibG9ja19oYXNoOiAnODkxNzdmZDg0YzVkOTE5NicsXG4gICAgICAgICAgZXhwaXJhdGlvbjogdGltZXN0YW1wICsgMzYwMDAwMCxcbiAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVfbGltaXQ6IDE1MDAwMDAwMCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUcmFuc2Zvcm0gcmF3RGF0YSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgcGFyYW1ldGVyIHN0cnVjdHVyZVxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFJhd0RhdGEgPSB7XG4gICAgICAgICAgY29udHJhY3Q6IHJhd0RhdGEuY29udHJhY3QgYXMgYW55LFxuICAgICAgICAgIHJlZkJsb2NrQnl0ZXM6IHJhd0RhdGEucmVmX2Jsb2NrX2J5dGVzLFxuICAgICAgICAgIHJlZkJsb2NrSGFzaDogcmF3RGF0YS5yZWZfYmxvY2tfaGFzaCxcbiAgICAgICAgICBleHBpcmF0aW9uOiByYXdEYXRhLmV4cGlyYXRpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiByYXdEYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVMaW1pdDogcmF3RGF0YS5mZWVfbGltaXQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgcmF3X2RhdGFfaGV4IHVzaW5nIHRoZSB1dGlsaXR5IGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBVdGlscy5nZW5lcmF0ZVJhd0RhdGFIZXgodHJhbnNmb3JtZWRSYXdEYXRhKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdHhJRCBhcyBTSEEyNTYgaGFzaCBvZiByYXdfZGF0YV9oZXhcbiAgICAgICAgY29uc3QgdHhJRCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShCdWZmZXIuZnJvbShyYXdEYXRhSGV4LCAnaGV4JykpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCgnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJyksXG4gICAgICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgICAgdHhIZXg6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgdHhJRCxcbiAgICAgICAgICAgICAgcmF3X2RhdGE6IHJhd0RhdGEsXG4gICAgICAgICAgICAgIHJhd19kYXRhX2hleDogcmF3RGF0YUhleCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtaXNzaW5nIG93bmVyIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHR4SUQgPSAnMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZic7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWMyNTQyMDI1NWMyYzVhMmRkNTRlZjY5ZjkyZWYyNjFlNmJkNDIxNmEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgY29udHJhY3Q6IFt0cmFuc2ZlckNvbnRyYWN0XSxcbiAgICAgICAgICByZWZfYmxvY2tfYnl0ZXM6ICdjOGNmJyxcbiAgICAgICAgICByZWZfYmxvY2tfaGFzaDogJzg5MTc3ZmQ4NGM1ZDkxOTYnLFxuICAgICAgICAgIGV4cGlyYXRpb246IHRpbWVzdGFtcCArIDM2MDAwMDAsXG4gICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsXG4gICAgICAgICAgZmVlX2xpbWl0OiAxNTAwMDAwMDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiByYXdEYXRhLmNvbnRyYWN0IGFzIGFueSxcbiAgICAgICAgICByZWZCbG9ja0J5dGVzOiByYXdEYXRhLnJlZl9ibG9ja19ieXRlcyxcbiAgICAgICAgICByZWZCbG9ja0hhc2g6IHJhd0RhdGEucmVmX2Jsb2NrX2hhc2gsXG4gICAgICAgICAgZXhwaXJhdGlvbjogcmF3RGF0YS5leHBpcmF0aW9uLFxuICAgICAgICAgIHRpbWVzdGFtcDogcmF3RGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgZmVlTGltaXQ6IHJhd0RhdGEuZmVlX2xpbWl0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RMV2g2N1A5M0tndG5aTkN0R25FSE0xSDMzTmhxMnV2dk4nLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IGV4cGVjdGVkUmF3RGF0YUhleCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ1RyYW5zYWN0aW9uIGhhcyBub3QgaGF2ZSBhIHZhbGlkIGlkJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggbWlzc2luZyBkZXN0aW5hdGlvbiBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB0eElEID0gJzAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYnO1xuICAgICAgICBjb25zdCB0cmFuc2ZlckNvbnRyYWN0ID0ge1xuICAgICAgICAgIHBhcmFtZXRlcjoge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwLFxuICAgICAgICAgICAgICBvd25lcl9hZGRyZXNzOiAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmF3RGF0YSA9IHtcbiAgICAgICAgICB0eElELFxuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBleHBlY3RlZFJhd0RhdGFIZXggPSBVdGlscy5nZW5lcmF0ZVJhd0RhdGFIZXgodHJhbnNmb3JtZWRSYXdEYXRhKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdUTFdoNjdQOTNLZ3RuWk5DdEduRUhNMUgzM05ocTJ1dnZOJywgYW1vdW50OiAnMTAwMDAwMCcgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0eElELFxuICAgICAgICAgICAgICByYXdfZGF0YTogcmF3RGF0YSxcbiAgICAgICAgICAgICAgcmF3X2RhdGFfaGV4OiBleHBlY3RlZFJhd0RhdGFIZXgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdUcmFuc2FjdGlvbiBoYXMgbm90IGhhdmUgYSB2YWxpZCBpZCcsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIG1pc3NpbmcgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB0cmFuc2ZlckNvbnRyYWN0ID0ge1xuICAgICAgICAgIHBhcmFtZXRlcjoge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgb3duZXJfYWRkcmVzczogJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNScsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWMyNTQyMDI1NWMyYzVhMmRkNTRlZjY5ZjkyZWYyNjFlNmJkNDIxNmEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBleHBlY3RlZFJhd0RhdGFIZXggPSBVdGlscy5nZW5lcmF0ZVJhd0RhdGFIZXgodHJhbnNmb3JtZWRSYXdEYXRhKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdUTFdoNjdQOTNLZ3RuWk5DdEduRUhNMUgzM05ocTJ1dnZOJywgYW1vdW50OiAnMTAwMDAwMCcgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICByYXdfZGF0YTogcmF3RGF0YSxcbiAgICAgICAgICAgICAgcmF3X2RhdGFfaGV4OiBleHBlY3RlZFJhd0RhdGFIZXgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdBbW91bnQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyB0cmFuc2ZlciBjb250cmFjdC4nLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZHVlIHRvIGFtb3VudCBtaXNzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBhbW91bnQ6IDIwMDAwMDAsXG4gICAgICAgICAgICAgIG93bmVyX2FkZHJlc3M6ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnLFxuICAgICAgICAgICAgICB0b19hZGRyZXNzOiAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogW3RyYW5zZmVyQ29udHJhY3RdLFxuICAgICAgICAgIHJlZl9ibG9ja19ieXRlczogJ2M4Y2YnLFxuICAgICAgICAgIHJlZl9ibG9ja19oYXNoOiAnODkxNzdmZDg0YzVkOTE5NicsXG4gICAgICAgICAgZXhwaXJhdGlvbjogdGltZXN0YW1wICsgMzYwMDAwMCxcbiAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVfbGltaXQ6IDE1MDAwMDAwMCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUcmFuc2Zvcm0gcmF3RGF0YSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgcGFyYW1ldGVyIHN0cnVjdHVyZVxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFJhd0RhdGEgPSB7XG4gICAgICAgICAgY29udHJhY3Q6IHJhd0RhdGEuY29udHJhY3QgYXMgYW55LFxuICAgICAgICAgIHJlZkJsb2NrQnl0ZXM6IHJhd0RhdGEucmVmX2Jsb2NrX2J5dGVzLFxuICAgICAgICAgIHJlZkJsb2NrSGFzaDogcmF3RGF0YS5yZWZfYmxvY2tfaGFzaCxcbiAgICAgICAgICBleHBpcmF0aW9uOiByYXdEYXRhLmV4cGlyYXRpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiByYXdEYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVMaW1pdDogcmF3RGF0YS5mZWVfbGltaXQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgcmF3X2RhdGFfaGV4IHVzaW5nIHRoZSB1dGlsaXR5IGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBVdGlscy5nZW5lcmF0ZVJhd0RhdGFIZXgodHJhbnNmb3JtZWRSYXdEYXRhKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdHhJRCBhcyBTSEEyNTYgaGFzaCBvZiByYXdfZGF0YV9oZXhcbiAgICAgICAgY29uc3QgdHhJRCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShCdWZmZXIuZnJvbShyYXdEYXRhSGV4LCAnaGV4JykpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJyxcbiAgICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0eElELFxuICAgICAgICAgICAgICByYXdfZGF0YTogcmF3RGF0YSxcbiAgICAgICAgICAgICAgcmF3X2RhdGFfaGV4OiByYXdEYXRhSGV4LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgICBtZXNzYWdlOiAndHJhbnNhY3Rpb24gYW1vdW50IGluIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIGdpdmVuIGJ5IGNsaWVudCcsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBkdWUgdG8gZGVzdGluYXRpb24gYWRkcmVzcyBtaXNzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAsXG4gICAgICAgICAgICAgIG93bmVyX2FkZHJlc3M6ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnLFxuICAgICAgICAgICAgICB0b19hZGRyZXNzOiAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogW3RyYW5zZmVyQ29udHJhY3RdLFxuICAgICAgICAgIHJlZl9ibG9ja19ieXRlczogJ2M4Y2YnLFxuICAgICAgICAgIHJlZl9ibG9ja19oYXNoOiAnODkxNzdmZDg0YzVkOTE5NicsXG4gICAgICAgICAgZXhwaXJhdGlvbjogdGltZXN0YW1wICsgMzYwMDAwMCxcbiAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVfbGltaXQ6IDE1MDAwMDAwMCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUcmFuc2Zvcm0gcmF3RGF0YSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgcGFyYW1ldGVyIHN0cnVjdHVyZVxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFJhd0RhdGEgPSB7XG4gICAgICAgICAgY29udHJhY3Q6IHJhd0RhdGEuY29udHJhY3QgYXMgYW55LFxuICAgICAgICAgIHJlZkJsb2NrQnl0ZXM6IHJhd0RhdGEucmVmX2Jsb2NrX2J5dGVzLFxuICAgICAgICAgIHJlZkJsb2NrSGFzaDogcmF3RGF0YS5yZWZfYmxvY2tfaGFzaCxcbiAgICAgICAgICBleHBpcmF0aW9uOiByYXdEYXRhLmV4cGlyYXRpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiByYXdEYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVMaW1pdDogcmF3RGF0YS5mZWVfbGltaXQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgcmF3X2RhdGFfaGV4IHVzaW5nIHRoZSB1dGlsaXR5IGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBVdGlscy5nZW5lcmF0ZVJhd0RhdGFIZXgodHJhbnNmb3JtZWRSYXdEYXRhKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdHhJRCBhcyBTSEEyNTYgaGFzaCBvZiByYXdfZGF0YV9oZXhcbiAgICAgICAgY29uc3QgdHhJRCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShCdWZmZXIuZnJvbShyYXdEYXRhSGV4LCAnaGV4JykpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgzJyxcbiAgICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0eElELFxuICAgICAgICAgICAgICByYXdfZGF0YTogcmF3RGF0YSxcbiAgICAgICAgICAgICAgcmF3X2RhdGFfaGV4OiByYXdEYXRhSGV4LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgICBtZXNzYWdlOiAnZGVzdGluYXRpb24gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNpcGllbnQgYWRkcmVzcycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUU1MgV2FsbGV0IFZlcmlmaWNhdGlvbicsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBIZWxwZXIgdG8gYnVpbGQgYSByYXdfZGF0YV9oZXggKHByb3RvYnVmKSBmb3IgYSBUcmFuc2ZlckNvbnRyYWN0LlxuICAgICAqIEZvciBUU1MsIHR4UHJlYnVpbGQudHhIZXggaXMgdGhlIHJhd19kYXRhX2hleCBkaXJlY3RseSAobm90IGEgSlNPTiBzdHJpbmcpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJ1aWxkVHNzVHJhbnNmZXJUeEhleChwYXJhbXM6IHtcbiAgICAgIG93bmVyQWRkcmVzczogc3RyaW5nO1xuICAgICAgdG9BZGRyZXNzOiBzdHJpbmc7XG4gICAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAgIHRpbWVzdGFtcD86IG51bWJlcjtcbiAgICAgIGV4cGlyYXRpb24/OiBudW1iZXI7XG4gICAgfSk6IHN0cmluZyB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBwYXJhbXMudGltZXN0YW1wIHx8IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0cmFuc2ZlckNvbnRyYWN0ID0ge1xuICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgb3duZXJfYWRkcmVzczogcGFyYW1zLm93bmVyQWRkcmVzcyxcbiAgICAgICAgICAgIHRvX2FkZHJlc3M6IHBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgY29udHJhY3Q6IFt0cmFuc2ZlckNvbnRyYWN0XSBhcyBhbnksXG4gICAgICAgIHJlZkJsb2NrQnl0ZXM6ICdjOGNmJyxcbiAgICAgICAgcmVmQmxvY2tIYXNoOiAnODkxNzdmZDg0YzVkOTE5NicsXG4gICAgICAgIGV4cGlyYXRpb246IHBhcmFtcy5leHBpcmF0aW9uIHx8IHRpbWVzdGFtcCArIDM2MDAwMDAsXG4gICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuICAgIH1cblxuICAgIGRlc2NyaWJlKCdUcmFuc2ZlckNvbnRyYWN0JywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHZhbGlkIFRTUyBUcmFuc2ZlckNvbnRyYWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvd25lckhleCA9ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnO1xuICAgICAgICBjb25zdCB0b0hleCA9ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInO1xuICAgICAgICBjb25zdCBhbW91bnQgPSAxMDAwMDAwO1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBidWlsZFRzc1RyYW5zZmVyVHhIZXgoeyBvd25lckFkZHJlc3M6IG93bmVySGV4LCB0b0FkZHJlc3M6IHRvSGV4LCBhbW91bnQgfSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBUU1MgcGF0aDogcmVjaXBpZW50cyB1c2UgYmFzZTU4IGFkZHJlc3Nlc1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KHRvSGV4KSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIC8vIFRTUyBwYXRoOiB0eEhleCBpcyB0aGUgcmF3IHByb3RvYnVmIGhleCwgbm90IGEgSlNPTiBzdHJpbmdcbiAgICAgICAgICAgIHR4SGV4OiByYXdEYXRhSGV4LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgVFNTIHZlcmlmaWNhdGlvbiB3aGVuIGFtb3VudCBkb2VzIG5vdCBtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb3duZXJIZXggPSAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JztcbiAgICAgICAgY29uc3QgdG9IZXggPSAnNDFkNmNkNmEyYzBmZjM1YTMxOWU2YWJiNWI5NTAzYmEwMjc4Njc5ODgyJztcblxuICAgICAgICBjb25zdCByYXdEYXRhSGV4ID0gYnVpbGRUc3NUcmFuc2ZlclR4SGV4KHsgb3duZXJBZGRyZXNzOiBvd25lckhleCwgdG9BZGRyZXNzOiB0b0hleCwgYW1vdW50OiAyMDAwMDAwIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodG9IZXgpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLCAvLyBtaXNtYXRjaDogdHhIZXggaGFzIDIwMDAwMDBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogcmF3RGF0YUhleCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIFRTUyB2ZXJpZmljYXRpb24gd2hlbiBkZXN0aW5hdGlvbiBhZGRyZXNzIGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvd25lckhleCA9ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnO1xuICAgICAgICBjb25zdCB0b0hleCA9ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInO1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBidWlsZFRzc1RyYW5zZmVyVHhIZXgoeyBvd25lckFkZHJlc3M6IG93bmVySGV4LCB0b0FkZHJlc3M6IHRvSGV4LCBhbW91bnQ6IDEwMDAwMDAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgYWRkcmVzcyB0aGFuIHdoYXQncyBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICBhZGRyZXNzOiAnVFRzR3duVExRNGVyeUZKcER2SlNmdUdReFBYUkNqWHZaeicsXG4gICAgICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgICAgdHhIZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgICBtZXNzYWdlOiAnZGVzdGluYXRpb24gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNpcGllbnQgYWRkcmVzcycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBub24tVHJhbnNmZXIsIG5vbi1UcmlnZ2VyU21hcnRDb250cmFjdCB0eXBlcyBpbiBUU1MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBBY2NvdW50UGVybWlzc2lvblVwZGF0ZSBhbmQgb3RoZXIgbmF0aXZlIFRSWCBjb250cmFjdHMgKGZyZWV6ZSwgdm90ZSwgZXRjLikgcGFzcyB0aHJvdWdoXG4gICAgICAvLyB3aXRob3V0IHJlY2lwaWVudCB2YWxpZGF0aW9uIGluIHRoZSBUU1MgcGF0aC5cbiAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBVbnNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeC5yYXdfZGF0YV9oZXg7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4OiByYXdEYXRhSGV4LFxuICAgICAgICB9LFxuICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBUU1MgbmF0aXZlIFRSWCB2ZXJpZnlUcmFuc2FjdGlvbiBlbmNvdW50ZXJzIGEgVHJpZ2dlclNtYXJ0Q29udHJhY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBEZWZlbnNlLWluLWRlcHRoOiBuYXRpdmUgVFJYIChUcngpIHNob3VsZCBuZXZlciB2ZXJpZnkgVHJpZ2dlclNtYXJ0Q29udHJhY3QuXG4gICAgICAvLyBUUkMyMCB0b2tlbiB0cmFuc2ZlcnMgbXVzdCBnbyB0aHJvdWdoIFRyeFRva2VuLnZlcmlmeVRyYW5zYWN0aW9uLlxuICAgICAgLy8gVGhlIHJhd19kYXRhX2hleCBiZWxvdyBpcyBhIHJlYWwgVFJDMjAgVHJpZ2dlclNtYXJ0Q29udHJhY3QgcHJvdG9idWYuXG4gICAgICBjb25zdCB0cmMyMFJhd0RhdGFIZXggPVxuICAgICAgICAnMGEwMjU3OGIyMjA4NjExM2JiOWFjMzUxNDMyYjQwODhlYWU3YTZkZTMwNWFhZTAxMDgxZjEyYTkwMTBhMzE3NDc5NzA2NTJlNjc2ZjZmNjc2YzY1NjE3MDY5NzMyZTYzNmY2ZDJmNzA3MjZmNzQ2ZjYzNmY2YzJlNTQ3MjY5Njc2NzY1NzI1MzZkNjE3Mjc0NDM2ZjZlNzQ3MjYxNjM3NDEyNzQwYTE1NDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjMTIxNTQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMDIyNDRhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwNzA4ODhkOGNhNWRlMzA5MDAxYzBjMzkzMDcnO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RMV2g2N1A5M0tndG5aTkN0R25FSE0xSDMzTmhxMnV2dk4nLCBhbW91bnQ6ICcxMDAwMDAwMDAnIH1dLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6IHRyYzIwUmF3RGF0YUhleCxcbiAgICAgICAgfSxcbiAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgJ1RyaWdnZXJTbWFydENvbnRyYWN0IHZlcmlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IG5hdGl2ZSBUUlguICcgK1xuICAgICAgICAgICdUUkMyMCB0b2tlbiB0cmFuc2ZlcnMgbXVzdCBiZSB2ZXJpZmllZCB2aWEgVHJ4VG9rZW4udmVyaWZ5VHJhbnNhY3Rpb24uJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4SGV4IGlzIG1pc3NpbmcgZm9yIFRTUyB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RRRnhEU29YeTJ5WFJFNUh0S3dBd3JOUlhHeFl4a2VTR2snLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDoge30sXG4gICAgICAgIHdhbGxldDoge30sXG4gICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICBtZXNzYWdlOiAnbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NlcmlhbGl6ZWRUeEhleCAoSlNPTiBzdHJpbmcpIHBhdGgnLCAoKSA9PiB7XG4gICAgICAvLyBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiBwYXNzZXMgdHhIZXggYXMgc2VyaWFsaXplZFR4SGV4IOKAlCBhIGZ1bGwgSlNPTiBzdHJpbmdcbiAgICAgIC8vIGNvbnRhaW5pbmcgeyB0eElELCByYXdfZGF0YSwgcmF3X2RhdGFfaGV4IH0uIFRoZSBUU1MgYnJhbmNoIG11c3QgaGFuZGxlIHRoaXMgZm9ybWF0XG4gICAgICAvLyBieSBleHRyYWN0aW5nIHJhd19kYXRhX2hleCBiZWZvcmUgcHJvdG9idWYgZGVjb2RpbmcuXG5cbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgVFNTIFRyYW5zZmVyQ29udHJhY3Qgd2hlbiB0eEhleCBpcyBhIEpTT04gc3RyaW5nIChzZXJpYWxpemVkVHhIZXgpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvd25lckhleCA9ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnO1xuICAgICAgICBjb25zdCB0b0hleCA9ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInO1xuICAgICAgICBjb25zdCBhbW91bnQgPSAxMDAwMDAwO1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBidWlsZFRzc1RyYW5zZmVyVHhIZXgoeyBvd25lckFkZHJlc3M6IG93bmVySGV4LCB0b0FkZHJlc3M6IHRvSGV4LCBhbW91bnQgfSk7XG4gICAgICAgIGNvbnN0IHR4SUQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoQnVmZmVyLmZyb20ocmF3RGF0YUhleCwgJ2hleCcpKS5kaWdlc3QoJ2hleCcpO1xuXG4gICAgICAgIC8vIFNpbXVsYXRlIHRoZSBzZXJpYWxpemVkVHhIZXggZm9ybWF0IGZyb20gQml0R28gQVBJIChKU09OIHN0cmluZyB3aXRoIHR4SUQgKyByYXdfZGF0YV9oZXgpXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICB0eElELFxuICAgICAgICAgIHJhd19kYXRhX2hleDogcmF3RGF0YUhleCxcbiAgICAgICAgICByYXdfZGF0YToge30sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodG9IZXgpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgICAgdHhIZXg6IHNlcmlhbGl6ZWRUeEhleCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gYW1vdW50IG1pc21hdGNoZXMgd2l0aCBKU09OIHR4SGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvd25lckhleCA9ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnO1xuICAgICAgICBjb25zdCB0b0hleCA9ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInO1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGFIZXggPSBidWlsZFRzc1RyYW5zZmVyVHhIZXgoeyBvd25lckFkZHJlc3M6IG93bmVySGV4LCB0b0FkZHJlc3M6IHRvSGV4LCBhbW91bnQ6IDIwMDAwMDAgfSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICB0eElEOiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoQnVmZmVyLmZyb20ocmF3RGF0YUhleCwgJ2hleCcpKS5kaWdlc3QoJ2hleCcpLFxuICAgICAgICAgIHJhd19kYXRhX2hleDogcmF3RGF0YUhleCxcbiAgICAgICAgICByYXdfZGF0YToge30sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodG9IZXgpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLCAvLyBtaXNtYXRjaFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBzZXJpYWxpemVkVHhIZXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgICBtZXNzYWdlOiAndHJhbnNhY3Rpb24gYW1vdW50IGluIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIGdpdmVuIGJ5IGNsaWVudCcsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=