@bitgo-beta/sdk-coin-sol 7.6.4-beta.702 → 7.6.4-beta.704

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  2. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  3. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  4. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  5. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  6. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  7. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +17 -0
  8. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  9. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +68 -0
  10. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +30 -0
  11. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  12. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +205 -0
  13. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  14. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  15. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  16. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  17. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  18. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  19. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  20. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  21. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  22. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  23. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  24. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  25. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  26. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +17 -0
  27. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  28. package/dist/esm/lib/serialization/codecs/v1/message.js +61 -0
  29. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +30 -0
  30. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  31. package/dist/esm/lib/serialization/compileTransactionMessage.js +202 -0
  32. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  33. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  34. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  35. package/package.json +7 -7
@@ -0,0 +1,136 @@
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 assert_1 = __importDefault(require("assert"));
7
+ const web3_js_1 = require("@solana/web3.js");
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
10
+ const compileTransactionMessage_1 = require("../../../src/lib/serialization/compileTransactionMessage");
11
+ const wire_transaction_1 = require("../../../src/lib/serialization/wire-transaction");
12
+ const TOKEN_2022_PROGRAM_ID = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
13
+ function buildTransfer(feePayer, token) {
14
+ return new web3_js_1.TransactionInstruction({
15
+ keys: [
16
+ { pubkey: feePayer, isSigner: true, isWritable: true },
17
+ { pubkey: token, isSigner: false, isWritable: true },
18
+ ],
19
+ programId: new web3_js_1.PublicKey(TOKEN_2022_PROGRAM_ID),
20
+ data: Buffer.from([27, 5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 6]),
21
+ });
22
+ }
23
+ function buildProof(size) {
24
+ return new web3_js_1.TransactionInstruction({
25
+ keys: [{ pubkey: new web3_js_1.PublicKey(TOKEN_2022_PROGRAM_ID), isSigner: false, isWritable: false }],
26
+ programId: new web3_js_1.PublicKey(TOKEN_2022_PROGRAM_ID),
27
+ data: Buffer.alloc(size, 0xab),
28
+ });
29
+ }
30
+ const config = {
31
+ computeUnitLimit: 200000,
32
+ heapSize: 32768,
33
+ loadedAccountsDataSizeLimit: 65536,
34
+ priorityFee: 5000,
35
+ };
36
+ describe('v1 transaction compilation and serialization (plain TS)', () => {
37
+ const feePayer = web3_js_1.Keypair.generate().publicKey;
38
+ const tokenAddress = web3_js_1.Keypair.generate().publicKey;
39
+ const recentBlockhash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
40
+ it('compiles a v1 message with the 0x81 version prefix', () => {
41
+ const bytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
42
+ version: 1,
43
+ instructions: [buildTransfer(feePayer, tokenAddress)],
44
+ feePayer,
45
+ recentBlockhash,
46
+ transactionConfig: config,
47
+ });
48
+ assert_1.default.strictEqual(bytes[0], 0x81);
49
+ // header: 1 signer (fee payer), 0 readonly signers, 0 readonly non-signers
50
+ assert_1.default.strictEqual(bytes[1], 1); // numSignerAccounts
51
+ assert_1.default.strictEqual(bytes[2], 0); // numReadonlySignerAccounts
52
+ assert_1.default.strictEqual(bytes[3], 1); // numReadonlyNonSignerAccounts (the invoked program)
53
+ });
54
+ it('encodes the transaction config mask and values', () => {
55
+ const bytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
56
+ version: 1,
57
+ instructions: [buildTransfer(feePayer, tokenAddress)],
58
+ feePayer,
59
+ recentBlockhash,
60
+ transactionConfig: config,
61
+ });
62
+ // configMask is u32 LE at bytes 4..8: priorityFee(0b11) + cuLimit(0b100) + loaded(0b1000) + heap(0b10000) = 0b11111 = 31
63
+ assert_1.default.strictEqual(bytes[4], 0x1f);
64
+ assert_1.default.strictEqual(bytes[5], 0x00);
65
+ assert_1.default.strictEqual(bytes[6], 0x00);
66
+ assert_1.default.strictEqual(bytes[7], 0x00);
67
+ });
68
+ it('serializes and round-trips a >2048-byte v1 transaction within the size limit', () => {
69
+ const messageBytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
70
+ version: 1,
71
+ instructions: [buildTransfer(feePayer, tokenAddress), buildProof(2300)],
72
+ feePayer,
73
+ recentBlockhash,
74
+ transactionConfig: config,
75
+ });
76
+ const secretKey = web3_js_1.Keypair.generate().secretKey;
77
+ const signature = tweetnacl_1.default.sign.detached(messageBytes, secretKey);
78
+ const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, [signature]);
79
+ assert_1.default.ok(wire.length > 2048);
80
+ assert_1.default.ok(wire.length <= 4096);
81
+ assert_1.default.strictEqual(wire[0], 0x81);
82
+ // message-first framing: message bytes first, then the 64-byte signature
83
+ const sigStart = wire.length - 64;
84
+ assert_1.default.deepStrictEqual(wire.slice(sigStart), signature);
85
+ });
86
+ it('strips ComputeBudget instructions and folds them into the config', () => {
87
+ const cuLimit = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 500000 });
88
+ const price = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 250000 });
89
+ const noBudgetConfig = {
90
+ computeUnitLimit: null,
91
+ heapSize: null,
92
+ loadedAccountsDataSizeLimit: null,
93
+ priorityFee: null,
94
+ };
95
+ const bytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
96
+ version: 1,
97
+ instructions: [cuLimit, price, buildTransfer(feePayer, tokenAddress)],
98
+ feePayer,
99
+ recentBlockhash,
100
+ transactionConfig: noBudgetConfig,
101
+ });
102
+ // configMask = priorityFee(0b11) + cuLimit(0b100) = 0b111 = 7
103
+ assert_1.default.strictEqual(bytes[4], 0x07);
104
+ });
105
+ it('throws on empty instructions or missing config', () => {
106
+ assert_1.default.throws(() => (0, compileTransactionMessage_1.compileTransactionMessage)({
107
+ version: 1,
108
+ instructions: [],
109
+ feePayer,
110
+ recentBlockhash,
111
+ transactionConfig: config,
112
+ }), sdk_core_1.BuildTransactionError);
113
+ assert_1.default.throws(() => (0, compileTransactionMessage_1.compileTransactionMessage)({
114
+ version: 1,
115
+ instructions: [buildTransfer(feePayer, tokenAddress)],
116
+ feePayer,
117
+ recentBlockhash,
118
+ transactionConfig: undefined,
119
+ }), sdk_core_1.BuildTransactionError);
120
+ });
121
+ it('throws on invalid recent blockhash', () => {
122
+ assert_1.default.throws(() => (0, compileTransactionMessage_1.compileTransactionMessage)({
123
+ version: 1,
124
+ instructions: [buildTransfer(feePayer, tokenAddress)],
125
+ feePayer,
126
+ recentBlockhash: 'not-a-valid-blockhash',
127
+ transactionConfig: config,
128
+ }), sdk_core_1.BuildTransactionError);
129
+ });
130
+ it('serializeV1Transaction enforces version prefix, signature count, and size', () => {
131
+ assert_1.default.throws(() => (0, wire_transaction_1.serializeWireTransaction)(new Uint8Array(), []), sdk_core_1.BuildTransactionError);
132
+ assert_1.default.throws(() => (0, wire_transaction_1.serializeWireTransaction)(new Uint8Array([0x80, 1]), [new Uint8Array(64)]), sdk_core_1.BuildTransactionError);
133
+ assert_1.default.throws(() => (0, wire_transaction_1.serializeWireTransaction)(new Uint8Array([0x81, 1, 0, 0]), []), sdk_core_1.BuildTransactionError);
134
+ });
135
+ });
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25WMS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9zZXJpYWxpemF0aW9uL3RyYW5zYWN0aW9uVjEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBQW1HO0FBQ25HLG1EQUE2RDtBQUM3RCwwREFBNkI7QUFDN0Isd0dBQXFHO0FBQ3JHLHNGQUEyRjtBQUUzRixNQUFNLHFCQUFxQixHQUFHLDZDQUE2QyxDQUFDO0FBRTVFLFNBQVMsYUFBYSxDQUFDLFFBQW1CLEVBQUUsS0FBZ0I7SUFDMUQsT0FBTyxJQUFJLGdDQUFzQixDQUFDO1FBQ2hDLElBQUksRUFBRTtZQUNKLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7WUFDdEQsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtTQUNyRDtRQUNELFNBQVMsRUFBRSxJQUFJLG1CQUFTLENBQUMscUJBQXFCLENBQUM7UUFDL0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDOUUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQVk7SUFDOUIsT0FBTyxJQUFJLGdDQUFzQixDQUFDO1FBQ2hDLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksbUJBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzVGLFNBQVMsRUFB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QUM7SUFFSCxFQUFFLENBQUMsMkVBQTJFLEVBQUUsR0FBRyxFQUFFO1FBQ25GLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsMkNBQXdCLEVBQUMsSUFBSSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxnQ0FBcUIsQ0FBQyxDQUFDO1FBQzNGLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLElBQUEsMkNBQXdCLEVBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDL0UsZ0NBQXFCLENBQ3RCLENBQUM7UUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDJDQUF3QixFQUFDLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxnQ0FBcUIsQ0FBQyxDQUFDO0lBQzVHLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDb21wdXRlQnVkZ2V0UHJvZ3JhbSwgS2V5cGFpciwgUHVibGljS2V5LCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgeyBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL2NvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2UnO1xuaW1wb3J0IHsgc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL3dpcmUtdHJhbnNhY3Rpb24nO1xuXG5jb25zdCBUT0tFTl8yMDIyX1BST0dSQU1fSUQgPSAnVG9rZW56UWRCTmJMcVA1VkVoZGtBUzZFUEZMQzFQSG5CcUNYRXBQeHVFYic7XG5cbmZ1bmN0aW9uIGJ1aWxkVHJhbnNmZXIoZmVlUGF5ZXI6IFB1YmxpY0tleSwgdG9rZW46IFB1YmxpY0tleSk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIGtleXM6IFtcbiAgICAgIHsgcHVia2V5OiBmZWVQYXllciwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiB0b2tlbiwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgXSxcbiAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkoVE9LRU5fMjAyMl9QUk9HUkFNX0lEKSxcbiAgICBkYXRhOiBCdWZmZXIuZnJvbShbMjcsIDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDZdKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvb2Yoc2l6ZTogbnVtYmVyKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB7XG4gIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAga2V5czogW3sgcHVia2V5OiBuZXcgUHVibGljS2V5KFRPS0VOXzIwMjJfUFJPR1JBTV9JRCksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfV0sXG4gICAgcHJvZ3JhbUlkOiBuZXcgUHVibGljS2V5KFRPS0VOXzIwMjJfUFJPR1JBTV9JRCksXG4gICAgZGF0YTogQnVmZmVyLmFsbG9jKHNpemUsIDB4YWIpLFxuICB9KTtcbn1cblxuY29uc3QgY29uZmlnID0ge1xuICBjb21wdXRlVW5pdExpbWl0OiAyMDBfMDAwLFxuICBoZWFwU2l6ZTogMzJfNzY4LFxuICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IDY1XzUzNixcbiAgcHJpb3JpdHlGZWU6IDVfMDAwLFxufTtcblxuZGVzY3JpYmUoJ3YxIHRyYW5zYWN0aW9uIGNvbXBpbGF0aW9uIGFuZCBzZXJpYWxpemF0aW9uIChwbGFpbiBUUyknLCAoKSA9PiB7XG4gIGNvbnN0IGZlZVBheWVyID0gS2V5cGFpci5nZW5lcmF0ZSgpLnB1YmxpY0tleTtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gS2V5cGFpci5nZW5lcmF0ZSgpLnB1YmxpY0tleTtcbiAgY29uc3QgcmVjZW50QmxvY2toYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcblxuICBpdCgnY29tcGlsZXMgYSB2MSBtZXNzYWdlIHdpdGggdGhlIDB4ODEgdmVyc2lvbiBwcmVmaXgnLCAoKSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlKHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBpbnN0cnVjdGlvbnM6IFtidWlsZFRyYW5zZmVyKGZlZVBheWVyLCB0b2tlbkFkZHJlc3MpXSxcbiAgICAgIGZlZVBheWVyLFxuICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgdHJhbnNhY3Rpb25Db25maWc6IGNvbmZpZyxcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZXNbMF0sIDB4ODEpO1xuICAgIC8vIGhlYWRlcjogMSBzaWduZXIgKGZlZSBwYXllciksIDAgcmVhZG9ubHkgc2lnbmVycywgMCByZWFkb25seSBub24tc2lnbmVyc1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1sxXSwgMSk7IC8vIG51bVNpZ25lckFjY291bnRzXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ5dGVzWzJdLCAwKTsgLy8gbnVtUmVhZG9ubHlTaWduZXJBY2NvdW50c1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1szXSwgMSk7IC8vIG51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHMgKHRoZSBpbnZva2VkIHByb2dyYW0pXG4gIH0pO1xuXG4gIGl0KCdlbmNvZGVzIHRoZSB0cmFuc2FjdGlvbiBjb25maWcgbWFzayBhbmQgdmFsdWVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBbYnVpbGRUcmFuc2ZlcihmZWVQYXllciwgdG9rZW5BZGRyZXNzKV0sXG4gICAgICBmZWVQYXllcixcbiAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgIHRyYW5zYWN0aW9uQ29uZmlnOiBjb25maWcsXG4gICAgfSk7XG4gICAgLy8gY29uZmlnTWFzayBpcyB1MzIgTEUgYXQgYnl0ZXMgNC4uODogcHJpb3JpdHlGZWUoMGIxMSkgKyBjdUxpbWl0KDBiMTAwKSArIGxvYWRlZCgwYjEwMDApICsgaGVhcCgwYjEwMDAwKSA9IDBiMTExMTEgPSAzMVxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1s0XSwgMHgxZik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ5dGVzWzVdLCAweDAwKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZXNbNl0sIDB4MDApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1s3XSwgMHgwMCk7XG4gIH0pO1xuXG4gIGl0KCdzZXJpYWxpemVzIGFuZCByb3VuZC10cmlwcyBhID4yMDQ4LWJ5dGUgdjEgdHJhbnNhY3Rpb24gd2l0aGluIHRoZSBzaXplIGxpbWl0JywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCeXRlcyA9IGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2Uoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIGluc3RydWN0aW9uczogW2J1aWxkVHJhbnNmZXIoZmVlUGF5ZXIsIHRva2VuQWRkcmVzcyksIGJ1aWxkUHJvb2YoMjMwMCldLFxuICAgICAgZmVlUGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2gsXG4gICAgICB0cmFuc2FjdGlvbkNvbmZpZzogY29uZmlnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldEtleSA9IEtleXBhaXIuZ2VuZXJhdGUoKS5zZWNyZXRLZXk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gbmFjbC5zaWduLmRldGFjaGVkKG1lc3NhZ2VCeXRlcywgc2VjcmV0S2V5KTtcbiAgICBjb25zdCB3aXJlID0gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG1lc3NhZ2VCeXRlcywgW3NpZ25hdHVyZV0pO1xuICAgIGFzc2VydC5vayh3aXJlLmxlbmd0aCA+IDIwNDgpO1xuICAgIGFzc2VydC5vayh3aXJlLmxlbmd0aCA8PSA0MDk2KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2lyZVswXSwgMHg4MSk7XG4gICAgLy8gbWVzc2FnZS1maXJzdCBmcmFtaW5nOiBtZXNzYWdlIGJ5dGVzIGZpcnN0LCB0aGVuIHRoZSA2NC1ieXRlIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ1N0YXJ0ID0gd2lyZS5sZW5ndGggLSA2NDtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHdpcmUuc2xpY2Uoc2lnU3RhcnQpLCBzaWduYXR1cmUpO1xuICB9KTtcblxuICBpdCgnc3RyaXBzIENvbXB1dGVCdWRnZXQgaW5zdHJ1Y3Rpb25zIGFuZCBmb2xkcyB0aGVtIGludG8gdGhlIGNvbmZpZycsICgpID0+IHtcbiAgICBjb25zdCBjdUxpbWl0ID0gQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7IHVuaXRzOiA1MDBfMDAwIH0pO1xuICAgIGNvbnN0IHByaWNlID0gQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRQcmljZSh7IG1pY3JvTGFtcG9ydHM6IDI1MF8wMDAgfSk7XG4gICAgY29uc3Qgbm9CdWRnZXRDb25maWcgPSB7XG4gICAgICBjb21wdXRlVW5pdExpbWl0OiBudWxsLFxuICAgICAgaGVhcFNpemU6IG51bGwsXG4gICAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IG51bGwsXG4gICAgICBwcmlvcml0eUZlZTogbnVsbCxcbiAgICB9O1xuICAgIGNvbnN0IGJ5dGVzID0gY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBbY3VMaW1pdCwgcHJpY2UsIGJ1aWxkVHJhbnNmZXIoZmVlUGF5ZXIsIHRva2VuQWRkcmVzcyldLFxuICAgICAgZmVlUGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2gsXG4gICAgICB0cmFuc2FjdGlvbkNvbmZpZzogbm9CdWRnZXRDb25maWcsXG4gICAgfSk7XG4gICAgLy8gY29uZmlnTWFzayA9IHByaW9yaXR5RmVlKDBiMTEpICsgY3VMaW1pdCgwYjEwMCkgPSAwYjExMSA9IDdcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZXNbNF0sIDB4MDcpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIG9uIGVtcHR5IGluc3RydWN0aW9ucyBvciBtaXNzaW5nIGNvbmZpZycsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtdLFxuICAgICAgICAgIGZlZVBheWVyLFxuICAgICAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgICAgICB0cmFuc2FjdGlvbkNvbmZpZzogY29uZmlnLFxuICAgICAgICB9KSxcbiAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvclxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2Uoe1xuICAgICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbYnVpbGRUcmFuc2ZlcihmZWVQYXllciwgdG9rZW5BZGRyZXNzKV0sXG4gICAgICAgICAgZmVlUGF5ZXIsXG4gICAgICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgICAgIHRyYW5zYWN0aW9uQ29uZmlnOiB1bmRlZmluZWQgYXMgbmV2ZXIsXG4gICAgICAgIH0pLFxuICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIHJlY2VudCBibG9ja2hhc2gnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2Uoe1xuICAgICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbYnVpbGRUcmFuc2ZlcihmZWVQYXllciwgdG9rZW5BZGRyZXNzKV0sXG4gICAgICAgICAgZmVlUGF5ZXIsXG4gICAgICAgICAgcmVjZW50QmxvY2toYXNoOiAnbm90LWEtdmFsaWQtYmxvY2toYXNoJyxcbiAgICAgICAgICB0cmFuc2FjdGlvbkNvbmZpZzogY29uZmlnLFxuICAgICAgICB9KSxcbiAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvclxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzZXJpYWxpemVWMVRyYW5zYWN0aW9uIGVuZm9yY2VzIHZlcnNpb24gcHJlZml4LCBzaWduYXR1cmUgY291bnQsIGFuZCBzaXplJywgKCkgPT4ge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG5ldyBVaW50OEFycmF5KCksIFtdKSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG5ldyBVaW50OEFycmF5KFsweDgwLCAxXSksIFtuZXcgVWludDhBcnJheSg2NCldKSxcbiAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvclxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24obmV3IFVpbnQ4QXJyYXkoWzB4ODEsIDEsIDAsIDBdKSwgW10pLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICB9KTtcbn0pO1xuIl19