@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.404 → 1.4.3-alpha.405
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +780 -0
- package/package.json +8 -11
- package/dist/test/fixtures.d.ts +0 -571
- package/dist/test/fixtures.d.ts.map +0 -1
- package/dist/test/fixtures.js +0 -656
- package/dist/test/resources.d.ts +0 -451
- package/dist/test/resources.d.ts.map +0 -1
- package/dist/test/resources.js +0 -349
- package/dist/test/unit/keyPair.d.ts +0 -2
- package/dist/test/unit/keyPair.d.ts.map +0 -1
- package/dist/test/unit/keyPair.js +0 -142
- package/dist/test/unit/offlineTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/offlineTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/offlineTransactionBuilder.js +0 -291
- package/dist/test/unit/transaction.d.ts +0 -2
- package/dist/test/unit/transaction.d.ts.map +0 -1
- package/dist/test/unit/transaction.js +0 -98
- package/dist/test/unit/transactionBuilder.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.js +0 -656
- package/dist/test/unit/transferBuilder.d.ts +0 -2
- package/dist/test/unit/transferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transferBuilder.js +0 -82
- package/dist/test/unit/util.d.ts +0 -2
- package/dist/test/unit/util.d.ts.map +0 -1
- package/dist/test/unit/util.js +0 -198
- package/dist/test/unit/xtz.d.ts +0 -2
- package/dist/test/unit/xtz.d.ts.map +0 -1
- package/dist/test/unit/xtz.js +0 -192
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,656 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const assert_1 = __importDefault(require("assert"));
|
|
40
|
-
const should_1 = __importDefault(require("should"));
|
|
41
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
42
|
-
const statics_1 = require("@bitgo-beta/statics");
|
|
43
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
44
|
-
const testData = __importStar(require("../resources"));
|
|
45
|
-
const src_1 = require("../../src");
|
|
46
|
-
describe('Tezos Transaction builder', function () {
|
|
47
|
-
const defaultKeyPair = new src_1.XtzLib.KeyPair({
|
|
48
|
-
prv: 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2',
|
|
49
|
-
});
|
|
50
|
-
describe('should parse', () => {
|
|
51
|
-
it('an unsigned init transaction', async () => {
|
|
52
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
53
|
-
txBuilder.from(testData.unsignedSerializedOriginationTransaction);
|
|
54
|
-
const tx = await txBuilder.build();
|
|
55
|
-
tx.id.should.equal('');
|
|
56
|
-
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
57
|
-
tx.source.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
58
|
-
should_1.default.equal(tx.inputs.length, 1);
|
|
59
|
-
should_1.default.equal(tx.outputs.length, 1);
|
|
60
|
-
tx.inputs[0].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
61
|
-
tx.inputs[0].value.should.equal('1004764');
|
|
62
|
-
tx.outputs[0].address.should.equal('');
|
|
63
|
-
tx.outputs[0].value.should.equal('1000000');
|
|
64
|
-
should_1.default.not.exist(tx.delegate);
|
|
65
|
-
tx.signature.length.should.equal(0);
|
|
66
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
67
|
-
tx.owners.length.should.equal(3);
|
|
68
|
-
tx.owners[0].should.equal('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
69
|
-
tx.owners[1].should.equal('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
70
|
-
tx.owners[2].should.equal('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe('should build', () => {
|
|
74
|
-
it('an init transaction', async () => {
|
|
75
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
76
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
77
|
-
txBuilder.fee({ fee: '10' });
|
|
78
|
-
const source = {
|
|
79
|
-
pub: 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY',
|
|
80
|
-
};
|
|
81
|
-
const sourceKeyPair = new src_1.XtzLib.KeyPair(source);
|
|
82
|
-
txBuilder.source(sourceKeyPair.getAddress());
|
|
83
|
-
txBuilder.initialBalance('1000000');
|
|
84
|
-
txBuilder.counter('0');
|
|
85
|
-
txBuilder.owner(new src_1.XtzLib.KeyPair({ pub: 'sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b' }).getKeys().pub);
|
|
86
|
-
txBuilder.owner(new src_1.XtzLib.KeyPair({ pub: 'sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F' }).getKeys().pub);
|
|
87
|
-
txBuilder.owner(new src_1.XtzLib.KeyPair({ pub: 'sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf' }).getKeys().pub);
|
|
88
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
89
|
-
const tx = await txBuilder.build();
|
|
90
|
-
tx.id.should.equal('');
|
|
91
|
-
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
92
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
93
|
-
should_1.default.equal(tx.inputs.length, 1);
|
|
94
|
-
should_1.default.equal(tx.outputs.length, 1);
|
|
95
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
96
|
-
tx.inputs[0].value.should.equal('1000010');
|
|
97
|
-
tx.outputs[0].address.should.equal('');
|
|
98
|
-
tx.outputs[0].value.should.equal('1000000');
|
|
99
|
-
tx.signature.length.should.equal(0);
|
|
100
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
101
|
-
tx.owners.length.should.equal(3);
|
|
102
|
-
tx.owners[0].should.equal('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
103
|
-
tx.owners[1].should.equal('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
104
|
-
tx.owners[2].should.equal('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
105
|
-
});
|
|
106
|
-
it('an account reveal transaction', async () => {
|
|
107
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
108
|
-
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
|
|
109
|
-
txBuilder.fee({ fee: '10' });
|
|
110
|
-
const source = {
|
|
111
|
-
pub: 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY',
|
|
112
|
-
};
|
|
113
|
-
const keyPair = new src_1.XtzLib.KeyPair(source);
|
|
114
|
-
txBuilder.source(keyPair.getAddress());
|
|
115
|
-
txBuilder.publicKeyToReveal(keyPair.getExtendedKeys().xpub);
|
|
116
|
-
txBuilder.counter('0');
|
|
117
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
118
|
-
const tx = await txBuilder.build();
|
|
119
|
-
tx.id.should.equal('');
|
|
120
|
-
tx.type.should.equal(sdk_core_1.TransactionType.AccountUpdate);
|
|
121
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
122
|
-
should_1.default.equal(tx.inputs.length, 1);
|
|
123
|
-
should_1.default.equal(tx.outputs.length, 0);
|
|
124
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
125
|
-
tx.inputs[0].value.should.equal('1420');
|
|
126
|
-
should_1.default.not.exist(tx.delegate);
|
|
127
|
-
tx.signature.length.should.equal(0);
|
|
128
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
129
|
-
tx.owners.length.should.equal(0);
|
|
130
|
-
});
|
|
131
|
-
it('a forwarder contract init transaction', async () => {
|
|
132
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
133
|
-
txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
|
|
134
|
-
const forwarderDestination = 'KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8';
|
|
135
|
-
txBuilder.forwarderDestination(forwarderDestination);
|
|
136
|
-
txBuilder.fee({ fee: '10' });
|
|
137
|
-
const source = {
|
|
138
|
-
pub: 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY',
|
|
139
|
-
};
|
|
140
|
-
const keyPair = new src_1.XtzLib.KeyPair(source);
|
|
141
|
-
txBuilder.source(keyPair.getAddress());
|
|
142
|
-
txBuilder.publicKeyToReveal(keyPair.getExtendedKeys().xpub);
|
|
143
|
-
txBuilder.counter('0');
|
|
144
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
145
|
-
const tx = await txBuilder.build();
|
|
146
|
-
tx.type.should.equal(sdk_core_1.TransactionType.AddressInitialization);
|
|
147
|
-
tx.source.should.equal(keyPair.getAddress());
|
|
148
|
-
tx.publicKeyToReveal.should.equal(keyPair.getKeys().pub);
|
|
149
|
-
tx.forwarderDestination.should.equal(forwarderDestination);
|
|
150
|
-
tx.owners.length.should.equal(0);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
describe('should sign', () => {
|
|
154
|
-
it('an init transaction', async () => {
|
|
155
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
156
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
157
|
-
txBuilder.fee({
|
|
158
|
-
fee: '4764',
|
|
159
|
-
gasLimit: '33971',
|
|
160
|
-
storageLimit: '1292',
|
|
161
|
-
});
|
|
162
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
163
|
-
txBuilder.initialBalance('1000000');
|
|
164
|
-
txBuilder.counter('0');
|
|
165
|
-
txBuilder.owner('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
166
|
-
txBuilder.owner('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
167
|
-
txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
168
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
169
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
170
|
-
const tx = await txBuilder.build();
|
|
171
|
-
tx.id.should.equal('opNfjjEfWk7HsnY8fQrUoPFuXZfABweubA6D4bVScmqoVzcZVFA');
|
|
172
|
-
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
173
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
174
|
-
should_1.default.equal(tx.inputs.length, 1);
|
|
175
|
-
should_1.default.equal(tx.outputs.length, 1);
|
|
176
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
177
|
-
tx.inputs[0].value.should.equal('1004764');
|
|
178
|
-
tx.outputs[0].address.should.equal('KT1J9LfhDV6FQxR7aMaK7R6Rw8mBpfhP5MA3');
|
|
179
|
-
tx.outputs[0].value.should.equal('1000000');
|
|
180
|
-
should_1.default.not.exist(tx.delegate);
|
|
181
|
-
tx.signature.length.should.equal(1);
|
|
182
|
-
tx.signature[0].should.equal('sigVD57haAMCobHrCwH9ABfbFvdmyR9ZspZC3Zihb9tEPfhtzCKS1F8fLoVpodvor3PUoo7ry4j46xYETEzELmtnrNTaTPX4');
|
|
183
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
184
|
-
tx.owners.length.should.equal(3);
|
|
185
|
-
tx.owners[0].should.equal('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
186
|
-
tx.owners[1].should.equal('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
187
|
-
tx.owners[2].should.equal('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
188
|
-
});
|
|
189
|
-
it('a wallet init transaction with delegation and reveal the source', async () => {
|
|
190
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
191
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
192
|
-
txBuilder.fee({
|
|
193
|
-
fee: '4764',
|
|
194
|
-
gasLimit: '33971',
|
|
195
|
-
storageLimit: '1292',
|
|
196
|
-
});
|
|
197
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
198
|
-
txBuilder.publicKeyToReveal(defaultKeyPair.getKeys().pub);
|
|
199
|
-
txBuilder.initialBalance('1000000');
|
|
200
|
-
txBuilder.counter('0');
|
|
201
|
-
txBuilder.owner('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
202
|
-
txBuilder.owner('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
203
|
-
txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
204
|
-
txBuilder.initialDelegate('tz1KpbK5v1NB2vg3JHBxXJZhyQ7ur83Xp7iC');
|
|
205
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
206
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
207
|
-
const tx = await txBuilder.build();
|
|
208
|
-
tx.id.should.equal('oo9rzcHZcGBBKtUfe3aL82isMf8SscBsLE7PBmBQXA2EKGT9yz7');
|
|
209
|
-
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
210
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
211
|
-
should_1.default.equal(tx.inputs.length, 2);
|
|
212
|
-
should_1.default.equal(tx.outputs.length, 1);
|
|
213
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
214
|
-
tx.inputs[0].value.should.equal('1420');
|
|
215
|
-
tx.inputs[1].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
216
|
-
tx.inputs[1].value.should.equal('1004764');
|
|
217
|
-
tx.outputs[0].address.should.equal('KT1JQQUXLfoxL6ifTz2SyQK7ZEAvF1m7KXgC');
|
|
218
|
-
tx.outputs[0].value.should.equal('1000000');
|
|
219
|
-
tx.delegate.should.equal('tz1KpbK5v1NB2vg3JHBxXJZhyQ7ur83Xp7iC');
|
|
220
|
-
tx.signature.length.should.equal(1);
|
|
221
|
-
tx.signature[0].should.equal('sigUyznaJo4JdLuyS7wpP5fDe12cUutDiABEYHHMEpaNYY6TQstAfvLJPQTcFWJJ2QRMZxC46nUvKEdaBJfPN5dzCGMQDtXn');
|
|
222
|
-
const indexesByTransactionType = tx.getIndexesByTransactionType();
|
|
223
|
-
Object.keys(indexesByTransactionType).length.should.equal(2);
|
|
224
|
-
indexesByTransactionType.reveal.length.should.equal(1);
|
|
225
|
-
indexesByTransactionType.reveal[0].should.equal(0);
|
|
226
|
-
indexesByTransactionType.origination.length.should.equal(1);
|
|
227
|
-
indexesByTransactionType.origination[0].should.equal(1);
|
|
228
|
-
tx.owners.length.should.equal(3);
|
|
229
|
-
tx.owners[0].should.equal('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
230
|
-
tx.owners[1].should.equal('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
231
|
-
tx.owners[2].should.equal('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
232
|
-
});
|
|
233
|
-
it('a reveal transaction', async () => {
|
|
234
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
235
|
-
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
|
|
236
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
237
|
-
txBuilder.publicKeyToReveal(defaultKeyPair.getKeys().pub);
|
|
238
|
-
txBuilder.counter('0');
|
|
239
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
240
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
241
|
-
const tx = await txBuilder.build();
|
|
242
|
-
tx.id.should.equal('oomXs6PuWtmGwMKoXTNsu9XJHnGXtuRujcHMeYS9y37Xj6sXPHb');
|
|
243
|
-
tx.type.should.equal(sdk_core_1.TransactionType.AccountUpdate);
|
|
244
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
245
|
-
should_1.default.equal(tx.inputs.length, 1);
|
|
246
|
-
should_1.default.equal(tx.outputs.length, 0);
|
|
247
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
248
|
-
tx.inputs[0].value.should.equal('1420');
|
|
249
|
-
should_1.default.not.exist(tx.delegate);
|
|
250
|
-
tx.signature.length.should.equal(1);
|
|
251
|
-
tx.signature[0].should.equal('sigQyYsfhtrJBKZuJSEizDdxoejNVvJWRZPDMWdpXVvdTVix37HzURwXfXsi9METnRzskvjgsBSgiF4pr7RVxzWLuixxJL8U');
|
|
252
|
-
const indexesByTransactionType = tx.getIndexesByTransactionType();
|
|
253
|
-
indexesByTransactionType.reveal.length.should.equal(1);
|
|
254
|
-
indexesByTransactionType.reveal[0].should.equal(0);
|
|
255
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
256
|
-
tx.owners.length.should.equal(0);
|
|
257
|
-
});
|
|
258
|
-
it('a multisig send transaction to an implicit account', async () => {
|
|
259
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
260
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
261
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
262
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
263
|
-
txBuilder.counter('0');
|
|
264
|
-
txBuilder
|
|
265
|
-
.transfer('1000000')
|
|
266
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
267
|
-
.to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A')
|
|
268
|
-
.fee('4764')
|
|
269
|
-
.gasLimit('33971')
|
|
270
|
-
.storageLimit('1292')
|
|
271
|
-
.dataToSign('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
|
|
272
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
273
|
-
txBuilder.sign({
|
|
274
|
-
key: new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' }).getKeys().prv,
|
|
275
|
-
});
|
|
276
|
-
txBuilder.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv });
|
|
277
|
-
const tx = await txBuilder.build();
|
|
278
|
-
tx.id.should.equal('oo8haKjuiZfjLJmpWgKDVF1kKbb2uEtygFyrSVzgoZNkc3nUMDd');
|
|
279
|
-
tx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
280
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
281
|
-
should_1.default.equal(tx.inputs.length, 2);
|
|
282
|
-
should_1.default.equal(tx.outputs.length, 1);
|
|
283
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
284
|
-
tx.inputs[0].value.should.equal('4764');
|
|
285
|
-
tx.inputs[1].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
|
|
286
|
-
tx.inputs[1].value.should.equal('1000000');
|
|
287
|
-
tx.outputs[0].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
288
|
-
tx.outputs[0].value.should.equal('1000000');
|
|
289
|
-
should_1.default.not.exist(tx.delegate);
|
|
290
|
-
tx.signature.length.should.equal(1);
|
|
291
|
-
tx.signature[0].should.equal('sigQLHLzWLNBWYDGfRcA36ZaMkapKJRKSjDB2WrDsou9FZLoz4Kp1ucW9AG7mey9wjAiNfRfCFrBV9yKsU8UZ4sEL21V7vWY');
|
|
292
|
-
tx.toBroadcastFormat().should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500b389028c0a000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e00000125070707070000050502000000430320053d036d0743035d0100000024747a3156526a5270564b6e76313641567072464831746b446e3454446656714138393341031e0743036a0080897a034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a4750030611ebda30dd150324737391705886840bfb99f8f51d6586b27408e84df93ce0f45dc6e8e6df000e602da19c3509190b37e7df7b11d552ccbc46e3dd34c05f3bf8');
|
|
293
|
-
const indexesByTransactionType = tx.getIndexesByTransactionType();
|
|
294
|
-
Object.keys(indexesByTransactionType).length.should.equal(1);
|
|
295
|
-
indexesByTransactionType.transaction.length.should.equal(1);
|
|
296
|
-
indexesByTransactionType.transaction[0].should.equal(0);
|
|
297
|
-
tx.owners.length.should.equal(0);
|
|
298
|
-
});
|
|
299
|
-
it('a send transaction to an originated account (other contract)', async () => {
|
|
300
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
301
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
302
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
303
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
304
|
-
txBuilder.counter('0');
|
|
305
|
-
txBuilder
|
|
306
|
-
.transfer('100')
|
|
307
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
308
|
-
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
309
|
-
.fee('4764')
|
|
310
|
-
.gasLimit('33971')
|
|
311
|
-
.storageLimit('1292')
|
|
312
|
-
.dataToSign('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
|
|
313
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
314
|
-
txBuilder.sign({
|
|
315
|
-
key: new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' }).getKeys().prv,
|
|
316
|
-
});
|
|
317
|
-
txBuilder.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv });
|
|
318
|
-
const tx = await txBuilder.build();
|
|
319
|
-
tx.id.should.equal('oobTNo72du9BFYfyZTo64kTXVhBfHNuJaJQXuNGVr6gYCDpYjDQ');
|
|
320
|
-
tx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
321
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
322
|
-
should_1.default.equal(tx.inputs.length, 2);
|
|
323
|
-
should_1.default.equal(tx.outputs.length, 1);
|
|
324
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
325
|
-
tx.inputs[0].value.should.equal('4764');
|
|
326
|
-
tx.inputs[1].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
|
|
327
|
-
tx.inputs[1].value.should.equal('100');
|
|
328
|
-
tx.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
|
|
329
|
-
tx.outputs[0].value.should.equal('100');
|
|
330
|
-
should_1.default.not.exist(tx.delegate);
|
|
331
|
-
tx.signature.length.should.equal(1);
|
|
332
|
-
tx.signature[0].should.equal('sigcM3xiQ9GN9tPXsVkckPHk66kAHDRMag6XCbHLWvMLPqH9KHgzAFepci2x53kcJGqVhFXaUSE3DhRCGdgj8ahkkWgiYZur');
|
|
333
|
-
tx.toBroadcastFormat().should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500b389028c0a000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000001400707070700000505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a475003066dbeee80de45847aeeb04f17dbb2e0774ae6942817d31e744c7e7772925c5f510b18523dafe54603c8753141f3e0989678f2252deb3bdaef93d6befa94399240');
|
|
334
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
335
|
-
tx.owners.length.should.equal(0);
|
|
336
|
-
});
|
|
337
|
-
it('a send transaction to multiple destinations', async () => {
|
|
338
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
339
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
340
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
341
|
-
txBuilder.counter('0');
|
|
342
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
343
|
-
txBuilder
|
|
344
|
-
.transfer('100')
|
|
345
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
346
|
-
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
347
|
-
.fee('4764')
|
|
348
|
-
.counter('1')
|
|
349
|
-
.dataToSign('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
|
|
350
|
-
txBuilder
|
|
351
|
-
.transfer('100')
|
|
352
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
353
|
-
.to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A')
|
|
354
|
-
.fee('4764')
|
|
355
|
-
.counter('2')
|
|
356
|
-
.dataToSign('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
|
|
357
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
358
|
-
txBuilder.sign({
|
|
359
|
-
key: new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' }).getKeys().prv,
|
|
360
|
-
});
|
|
361
|
-
txBuilder.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv });
|
|
362
|
-
const tx = await txBuilder.build();
|
|
363
|
-
tx.id.should.equal('onyGaWs6z4bVVcfn3h9KbBrktEhuDyJLYEVB4aJRM6YNngjDxE4');
|
|
364
|
-
tx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
365
|
-
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
366
|
-
should_1.default.equal(tx.inputs.length, 4);
|
|
367
|
-
should_1.default.equal(tx.outputs.length, 2);
|
|
368
|
-
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
369
|
-
tx.inputs[0].value.should.equal('4764');
|
|
370
|
-
tx.inputs[1].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
|
|
371
|
-
tx.inputs[1].value.should.equal('100');
|
|
372
|
-
tx.inputs[2].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
373
|
-
tx.inputs[2].value.should.equal('4764');
|
|
374
|
-
tx.inputs[3].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
|
|
375
|
-
tx.inputs[3].value.should.equal('100');
|
|
376
|
-
tx.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
|
|
377
|
-
tx.outputs[0].value.should.equal('100');
|
|
378
|
-
tx.outputs[1].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
379
|
-
tx.outputs[1].value.should.equal('100');
|
|
380
|
-
should_1.default.not.exist(tx.delegate);
|
|
381
|
-
tx.signature.length.should.equal(1);
|
|
382
|
-
tx.signature[0].should.equal('sigdUpzCxmi9NWhdbFGfvqVyH8Xfr2UiPc2fkqNrQ4CHvrk19ZDksDksEc4DJsTbphenV8jCNZFqzL4sCVRzM93HnSSqgJz7');
|
|
383
|
-
tx.toBroadcastFormat().should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000001400707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a475003066c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2501e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e00000124070707070002050502000000420320053d036d0743035d0100000024747a3156526a5270564b6e76313641567072464831746b446e3454446656714138393341031e0743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a47500306766a0b1f6cb035bf537887ba9004c489bb458d8c8e72b5033b6cee8ad52f84ec27b719f5d0b98cdf2d0744b255301263688692645eafc9cdf1b48b5053c51dca');
|
|
384
|
-
tx.owners.length.should.equal(0);
|
|
385
|
-
const indexesByTransactionType = tx.getIndexesByTransactionType();
|
|
386
|
-
Object.keys(indexesByTransactionType).length.should.equal(1);
|
|
387
|
-
indexesByTransactionType.transaction.length.should.equal(2);
|
|
388
|
-
indexesByTransactionType.transaction[0].should.equal(0);
|
|
389
|
-
indexesByTransactionType.transaction[1].should.equal(1);
|
|
390
|
-
const firstTransferSignatures = tx.getTransferSignatures(indexesByTransactionType.transaction[0]);
|
|
391
|
-
firstTransferSignatures[0].signature.should.equal('sigNjD64NuVnUK7oVB2c2SP32VYj7dTykbnRxyDoS9BGvgagvnMcT4hYccabbFGo9tdVQT4M46ezYJdL2pzYDSwkfR6yrppY');
|
|
392
|
-
firstTransferSignatures[0].index.should.equal(0);
|
|
393
|
-
firstTransferSignatures[1].signature.should.equal('sigYfVYJUaiKKZX4zszWZ7RF292nV2P6XM4nKek2YgWQ8BLS1r22u4a9SCvGMcb89BjTftTn2vgUzCTQGS2cJNvbYtuGQjGP');
|
|
394
|
-
firstTransferSignatures[1].index.should.equal(1);
|
|
395
|
-
const secondTransferSignatures = tx.getTransferSignatures(indexesByTransactionType.transaction[1]);
|
|
396
|
-
secondTransferSignatures[0].signature.should.equal('sigNjD64NuVnUK7oVB2c2SP32VYj7dTykbnRxyDoS9BGvgagvnMcT4hYccabbFGo9tdVQT4M46ezYJdL2pzYDSwkfR6yrppY');
|
|
397
|
-
secondTransferSignatures[0].index.should.equal(0);
|
|
398
|
-
secondTransferSignatures[1].signature.should.equal('sigYfVYJUaiKKZX4zszWZ7RF292nV2P6XM4nKek2YgWQ8BLS1r22u4a9SCvGMcb89BjTftTn2vgUzCTQGS2cJNvbYtuGQjGP');
|
|
399
|
-
secondTransferSignatures[1].index.should.equal(1);
|
|
400
|
-
});
|
|
401
|
-
it('a send transaction to multiple destinations from implicit account', async () => {
|
|
402
|
-
const sourceAccount = new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' });
|
|
403
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
404
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
405
|
-
txBuilder.fee({ fee: '4764' });
|
|
406
|
-
txBuilder.branch('BKnfiSVFTjixbhzsTbR1eDmit6yK7UBcgRJPhmgeWcZqiMHRZ6E');
|
|
407
|
-
txBuilder.counter('377751');
|
|
408
|
-
txBuilder.source(sourceAccount.getAddress());
|
|
409
|
-
txBuilder.transfer('111').to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
410
|
-
txBuilder.transfer('111').to('tz2XCDa2tcnS26PoBgiUb8h1xYhtJaebC2bT');
|
|
411
|
-
txBuilder.sign({ key: sourceAccount.getKeys().prv });
|
|
412
|
-
const tx = await txBuilder.build();
|
|
413
|
-
tx.id.should.equal('oo7mpTB22Qu1d7EVc5b4eAdMgEzvdKRsHGjZWoEjQwYk6BJ1NTq');
|
|
414
|
-
tx.type.should.equal(sdk_core_1.TransactionType.SingleSigSend);
|
|
415
|
-
tx.source.should.equal('tz2P2E8EgHaLA6A17rH3pE9T2tx6DA7D4siW');
|
|
416
|
-
should_1.default.equal(tx.inputs.length, 4);
|
|
417
|
-
should_1.default.equal(tx.outputs.length, 2);
|
|
418
|
-
tx.inputs[0].address.should.equal('tz2P2E8EgHaLA6A17rH3pE9T2tx6DA7D4siW');
|
|
419
|
-
tx.inputs[0].value.should.equal('4764');
|
|
420
|
-
tx.inputs[1].address.should.equal('tz2P2E8EgHaLA6A17rH3pE9T2tx6DA7D4siW');
|
|
421
|
-
tx.inputs[1].value.should.equal('111');
|
|
422
|
-
tx.inputs[2].address.should.equal('tz2P2E8EgHaLA6A17rH3pE9T2tx6DA7D4siW');
|
|
423
|
-
tx.inputs[2].value.should.equal('4764');
|
|
424
|
-
tx.inputs[3].address.should.equal('tz2P2E8EgHaLA6A17rH3pE9T2tx6DA7D4siW');
|
|
425
|
-
tx.inputs[3].value.should.equal('111');
|
|
426
|
-
tx.outputs[0].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
427
|
-
tx.outputs[0].value.should.equal('111');
|
|
428
|
-
tx.outputs[1].address.should.equal('tz2XCDa2tcnS26PoBgiUb8h1xYhtJaebC2bT');
|
|
429
|
-
tx.outputs[1].value.should.equal('111');
|
|
430
|
-
should_1.default.not.exist(tx.delegate);
|
|
431
|
-
tx.signature.length.should.equal(1);
|
|
432
|
-
tx.signature[0].should.equal('sigw5eG2rCkAqJcR2SuZ23TDQEtfU8oFw9rGpTAtpvnC69EbQazMZL6eUnYzxzvWFbLEtp7HbN4joWi1C9GQ348NXrw6X3Zd');
|
|
433
|
-
tx.toBroadcastFormat().should.equal('09f5686021aadcfc00063b0873055c2e7c841398fece3d7865a8ed2756708d4a6c01a1525e289aed93119c44fd3aa8e9df8522e0d80d9c25978717e85281026f00006b5ddaef3fb5d7c151cfb36fbe43a7a066777394006c01a1525e289aed93119c44fd3aa8e9df8522e0d80d9c25988717e85281026f0001faf711f98d3a978656651c30875138c086fa871100fcf189b364c021e4be1a032f3867445e0c62ca01047fb853fe02d038e62fcad02ffca1d05e4b5a4e4fdc3ce6fc11607c9ca8ceca6fd7335d3dab6439ce2dee11');
|
|
434
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
435
|
-
tx.owners.length.should.equal(0);
|
|
436
|
-
});
|
|
437
|
-
it('a multisig send transaction with the signatures in custom order', async () => {
|
|
438
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
439
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
440
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
441
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
442
|
-
txBuilder.counter('0');
|
|
443
|
-
txBuilder
|
|
444
|
-
.transfer('100')
|
|
445
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
446
|
-
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
447
|
-
.fee('4764')
|
|
448
|
-
.gasLimit('33971')
|
|
449
|
-
.storageLimit('1292')
|
|
450
|
-
.dataToSign('00');
|
|
451
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
452
|
-
// Multisig keys
|
|
453
|
-
txBuilder.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(18) }).getKeys().prv, index: 2 });
|
|
454
|
-
txBuilder.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv, index: 1 });
|
|
455
|
-
const tx = await txBuilder.build();
|
|
456
|
-
const signatures = tx.toJson().contents[0].parameters.value.args[1];
|
|
457
|
-
signatures[0].prim.should.equal('None');
|
|
458
|
-
signatures[1].prim.should.equal('Some');
|
|
459
|
-
signatures[1].args[0].string.should.equal('sigUxvCQSEWQvZrf3yS2VjSTBWycMPe3zBBo6EWva2d3tHV1DKZNUs8b5fmqQeXWvdSSXztx48UsPY5FmJiDofmPSZ6SUjZt');
|
|
460
|
-
signatures[2].prim.should.equal('Some');
|
|
461
|
-
signatures[2].args[0].string.should.equal('sigiC286gLc1SSWHwKydczwwdwTUPv7e9mkPeHzfE9wEG9PKZ6fUcmrMeYwcH7t9fWsnozB7Fay2uxkmi1u1X1bw3MgJUNpu');
|
|
462
|
-
tx.owners.length.should.equal(0);
|
|
463
|
-
});
|
|
464
|
-
it('a multisig send transaction with the signatures in default order', async () => {
|
|
465
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
466
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
467
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
468
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
469
|
-
txBuilder.counter('0');
|
|
470
|
-
txBuilder
|
|
471
|
-
.transfer('100')
|
|
472
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
473
|
-
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
474
|
-
.fee('4764')
|
|
475
|
-
.gasLimit('33971')
|
|
476
|
-
.storageLimit('1292')
|
|
477
|
-
.dataToSign('00');
|
|
478
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
479
|
-
// Multisig keys
|
|
480
|
-
txBuilder.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(18) }).getKeys().prv });
|
|
481
|
-
txBuilder.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv });
|
|
482
|
-
const tx = await txBuilder.build();
|
|
483
|
-
const signatures = tx.toJson().contents[0].parameters.value.args[1];
|
|
484
|
-
signatures[0].prim.should.equal('Some');
|
|
485
|
-
signatures[0].args[0].string.should.equal('sigiC286gLc1SSWHwKydczwwdwTUPv7e9mkPeHzfE9wEG9PKZ6fUcmrMeYwcH7t9fWsnozB7Fay2uxkmi1u1X1bw3MgJUNpu');
|
|
486
|
-
signatures[1].prim.should.equal('Some');
|
|
487
|
-
signatures[1].args[0].string.should.equal('sigUxvCQSEWQvZrf3yS2VjSTBWycMPe3zBBo6EWva2d3tHV1DKZNUs8b5fmqQeXWvdSSXztx48UsPY5FmJiDofmPSZ6SUjZt');
|
|
488
|
-
signatures[2].prim.should.equal('None');
|
|
489
|
-
Object.keys(tx.getIndexesByTransactionType()).length.should.equal(1);
|
|
490
|
-
});
|
|
491
|
-
it('a singleSig transaction', async () => {
|
|
492
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
493
|
-
txBuilder.type(sdk_core_1.TransactionType.SingleSigSend);
|
|
494
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
495
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
496
|
-
txBuilder.counter('0');
|
|
497
|
-
txBuilder
|
|
498
|
-
.transfer(new bignumber_js_1.default(10).toFixed(0))
|
|
499
|
-
.from(defaultKeyPair.getAddress())
|
|
500
|
-
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
501
|
-
.fee('4764')
|
|
502
|
-
.gasLimit('100971')
|
|
503
|
-
.storageLimit('1292');
|
|
504
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
505
|
-
const tx = await txBuilder.build();
|
|
506
|
-
tx.type.should.equal(sdk_core_1.TransactionType.SingleSigSend);
|
|
507
|
-
const txJson = tx.toJson();
|
|
508
|
-
txJson.contents[0].gas_limit.should.equal('100971');
|
|
509
|
-
txJson.contents[0].storage_limit.should.equal('1292');
|
|
510
|
-
txJson.contents[0].amount.should.equal('10');
|
|
511
|
-
txJson.contents[0].counter.should.equal('0');
|
|
512
|
-
});
|
|
513
|
-
});
|
|
514
|
-
describe('should fail to sign', () => {
|
|
515
|
-
let genericTxBuilder;
|
|
516
|
-
beforeEach(() => {
|
|
517
|
-
genericTxBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('txtz'));
|
|
518
|
-
genericTxBuilder.type(sdk_core_1.TransactionType.Send);
|
|
519
|
-
genericTxBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
520
|
-
genericTxBuilder.source(defaultKeyPair.getAddress());
|
|
521
|
-
genericTxBuilder.counter('0');
|
|
522
|
-
genericTxBuilder
|
|
523
|
-
.transfer('100')
|
|
524
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
525
|
-
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
526
|
-
.fee('4764')
|
|
527
|
-
.gasLimit('33971')
|
|
528
|
-
.storageLimit('1292')
|
|
529
|
-
.dataToSign('00');
|
|
530
|
-
});
|
|
531
|
-
it('a transaction with no source account', async () => {
|
|
532
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
533
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
534
|
-
assert_1.default.throws(() => txBuilder.sign({ key: defaultKeyPair.getKeys().prv }));
|
|
535
|
-
});
|
|
536
|
-
it('a transaction with a different private key than the source account', async () => {
|
|
537
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
538
|
-
txBuilder.from(testData.emptyUnsignedSerializedOriginationTransaction);
|
|
539
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
540
|
-
assert_1.default.throws(() => txBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv }));
|
|
541
|
-
});
|
|
542
|
-
it('a transaction with some keys with custom index', async () => {
|
|
543
|
-
genericTxBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
544
|
-
// Multisig keys
|
|
545
|
-
genericTxBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv });
|
|
546
|
-
genericTxBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv });
|
|
547
|
-
assert_1.default.throws(() => genericTxBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv, index: 2 }), new RegExp('Custom index has to be set for all multisig contract signing keys or none'));
|
|
548
|
-
});
|
|
549
|
-
it('a transaction with some keys without custom index', async () => {
|
|
550
|
-
genericTxBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
551
|
-
// Multisig keys
|
|
552
|
-
genericTxBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv, index: 0 });
|
|
553
|
-
genericTxBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv, index: 1 });
|
|
554
|
-
assert_1.default.throws(() => genericTxBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv }), new RegExp('Custom index has to be set for all multisig contract signing keys or none'));
|
|
555
|
-
});
|
|
556
|
-
it('a transaction with a key with invalid custom index', async () => {
|
|
557
|
-
genericTxBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
558
|
-
assert_1.default.throws(() => genericTxBuilder.sign({ key: new src_1.XtzLib.KeyPair().getKeys().prv, index: 3 }), new RegExp('Custom index cannot be greater'));
|
|
559
|
-
});
|
|
560
|
-
it('a Send transaction with no transfers', async () => {
|
|
561
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
562
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
563
|
-
txBuilder.fee({ fee: '4764' });
|
|
564
|
-
txBuilder.branch('BKnfiSVFTjixbhzsTbR1eDmit6yK7UBcgRJPhmgeWcZqiMHRZ6E');
|
|
565
|
-
txBuilder.counter('1');
|
|
566
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
567
|
-
assert_1.default.throws(() => txBuilder.sign({ key: defaultKeyPair.getKeys().prv }));
|
|
568
|
-
});
|
|
569
|
-
it('an address initialization transaction without public key', async () => {
|
|
570
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
571
|
-
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
|
|
572
|
-
assert_1.default.throws(() => txBuilder.sign({ key: defaultKeyPair.getKeys().prv }), new RegExp('Cannot sign a public key revelation transaction without public key'));
|
|
573
|
-
});
|
|
574
|
-
});
|
|
575
|
-
describe('should fail to', () => {
|
|
576
|
-
it('change the type to Send when owners have already been set', async () => {
|
|
577
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
578
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
579
|
-
txBuilder.owner(defaultKeyPair.getKeys().pub);
|
|
580
|
-
assert_1.default.throws(() => txBuilder.type(sdk_core_1.TransactionType.Send));
|
|
581
|
-
});
|
|
582
|
-
it('build a send transaction with owners', async () => {
|
|
583
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
584
|
-
assert_1.default.throws(() => txBuilder.owner(defaultKeyPair.getKeys().pub));
|
|
585
|
-
});
|
|
586
|
-
it('build a transaction with an invalid branch id', async () => {
|
|
587
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
588
|
-
assert_1.default.throws(() => txBuilder.branch(''));
|
|
589
|
-
});
|
|
590
|
-
it('build a transaction with an invalid value', async () => {
|
|
591
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
592
|
-
assert_1.default.throws(() => txBuilder.initialBalance('-1'));
|
|
593
|
-
});
|
|
594
|
-
it('build a non wallet initialization transaction with initial balance', async () => {
|
|
595
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
596
|
-
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
597
|
-
assert_1.default.throws(() => txBuilder.initialBalance('100'));
|
|
598
|
-
});
|
|
599
|
-
it('build transfer for non send-type transaction', async () => {
|
|
600
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
601
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
602
|
-
assert_1.default.throws(() => txBuilder.transfer('100'), new RegExp('Transfers can only be set for send transactions'));
|
|
603
|
-
});
|
|
604
|
-
it('add more owners than the multisig maximum', async () => {
|
|
605
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
606
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
607
|
-
txBuilder.owner('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
608
|
-
txBuilder.owner('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
609
|
-
txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
610
|
-
assert_1.default.throws(() => txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf'), new RegExp('A maximum of 3 owners'));
|
|
611
|
-
});
|
|
612
|
-
it('add the same owner twice', async () => {
|
|
613
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
614
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
615
|
-
txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
616
|
-
assert_1.default.throws(() => txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf'), new RegExp('Repeated owner public key'));
|
|
617
|
-
});
|
|
618
|
-
it('add an invalid owner public key', async () => {
|
|
619
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
620
|
-
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
621
|
-
assert_1.default.throws(() => txBuilder.owner('sppk'), new RegExp('Invalid public key'));
|
|
622
|
-
});
|
|
623
|
-
it('add an invalid public key to reveal', async () => {
|
|
624
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
625
|
-
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
|
|
626
|
-
assert_1.default.throws(() => txBuilder.publicKeyToReveal('sppk'), new RegExp('Unsupported public key'));
|
|
627
|
-
});
|
|
628
|
-
it('add the same public key to reveal twice', async () => {
|
|
629
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
630
|
-
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
|
|
631
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
632
|
-
txBuilder.publicKeyToReveal(defaultKeyPair.getKeys().pub);
|
|
633
|
-
assert_1.default.throws(() => txBuilder.publicKeyToReveal(defaultKeyPair.getKeys().pub), new RegExp('Public key to reveal already set'));
|
|
634
|
-
});
|
|
635
|
-
it('add the public key to reveal that does not belong to the source', async () => {
|
|
636
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
637
|
-
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
|
|
638
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
639
|
-
assert_1.default.throws(() => txBuilder.publicKeyToReveal('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf'), new RegExp('Public key does not match the source address'));
|
|
640
|
-
});
|
|
641
|
-
it('change the transaction type from Send if it has transfers', async () => {
|
|
642
|
-
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
643
|
-
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
644
|
-
txBuilder.source(defaultKeyPair.getAddress());
|
|
645
|
-
txBuilder.counter('0');
|
|
646
|
-
txBuilder
|
|
647
|
-
.transfer('100')
|
|
648
|
-
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
649
|
-
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
650
|
-
.fee('4764');
|
|
651
|
-
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
652
|
-
assert_1.default.throws(() => txBuilder.type(sdk_core_1.TransactionType.WalletInitialization), new RegExp('Transaction contains transfers and can only be labeled as Send'));
|
|
653
|
-
});
|
|
654
|
-
});
|
|
655
|
-
});
|
|
656
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsbURBQXVEO0FBQ3ZELGlEQUE0QztBQUM1QyxnRUFBcUM7QUFDckMsdURBQXlDO0FBQ3pDLG1DQUFtQztBQUVuQyxRQUFRLENBQUMsMkJBQTJCLEVBQUU7SUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxZQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3hDLEdBQUcsRUFBRSxpSEFBaUg7S0FDdkgsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLDhCQUE4QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzVDLE1BQU0sU0FBUyxHQUFRLElBQUksWUFBTSxDQUFDLGtCQUFrQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2RSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzNELEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQy9ELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxF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QUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN0RixNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVuQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztZQUMxRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMvRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDMUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDMUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFD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Q0FBQyxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMzRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMzRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLGdCQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQzFC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QUM1RixJQUFJLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUMzRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekUsTUFBTSxTQUFTLEdBQVEsSUFBSSxZQUFNLENBQUMsa0JBQWtCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLFNBQVMsQ0FBQyxNQUFNLENBQUMscURBQXFELENBQUMsQ0FBQztZQUN4RSxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsU0FBUztpQkFDTixRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUNmLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQztpQkFDNUMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO2lCQUMxQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDZixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUMxRCxJQUFJLE1BQU0sQ0FBQyxnRUFBZ0UsQ0FBQyxDQUM3RSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnVGV6b3MgVHJhbnNhY3Rpb24gYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZGVmYXVsdEtleVBhaXIgPSBuZXcgWHR6TGliLktleVBhaXIoe1xuICAgIHBydjogJ3hwcnY5czIxWnJRSDE0M0szRDhUWGZ2QUpnSFZmVEVlUU5XNVlzOXdadG5VWmtxUHpGelNqYkVKcldDMXZaNEduWEN2UjdyUUwyVUZYM1JTdVllVTlNckVSbTFYQnZBQ293N2MzNnZuejVpWXlqMicsXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgcGFyc2UnLCAoKSA9PiB7XG4gICAgaXQoJ2FuIHVuc2lnbmVkIGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLmZyb20odGVzdERhdGEudW5zaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnJyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5kZWxlZ2F0ZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIE9iamVjdC5rZXlzKHR4LmdldEluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSgpKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3duZXJzLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgICB0eC5vd25lcnNbMF0uc2hvdWxkLmVxdWFsKCdzcHBrN1pXQjhkaVUyVFdlaHhka1dDVjJEVEZ2bjFoUHo0cUxqaUQzbkpRb3pLbm9TRW5TQzhiJyk7XG4gICAgICB0eC5vd25lcnNbMV0uc2hvdWxkLmVxdWFsKCdzcHBrN1pxOUtQdHdremtnQXNoYTRqVTI5QzQzTWNnUDJza0s1NnRqZDdLSmpoY21INkFaQzFGJyk7XG4gICAgICB0eC5vd25lcnNbMl0uc2hvdWxkLmVxdWFsKCdzcHBrN2QyenR6YnJMZEJhVEI3eXphV1JrUGZjV0dzck5RTkpka0JFOWJDVFNTemVrTE56cHZmJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQnLCAoKSA9PiB7XG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMCcgfSk7XG4gICAgICBjb25zdCBzb3VyY2UgPSB7XG4gICAgICAgIHB1YjogJ3hwdWI2NjFNeU13QXFSYmNGaEN2ZGhUQWZwRUVEVjU4b3FEdnY2NVlOSEM2ODZOTnM0S2JIOFlaUUpXVm1yZmJ2ZTdhQVZIenh3OGJLRnhBN01MZURLNkJiTGZrRTNicWt2SExQZ2FHSEh0WUdlWScsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc291cmNlS2V5UGFpciA9IG5ldyBYdHpMaWIuS2V5UGFpcihzb3VyY2UpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShzb3VyY2VLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIuaW5pdGlhbEJhbGFuY2UoJzEwMDAwMDAnKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoXG4gICAgICAgIG5ldyBYdHpMaWIuS2V5UGFpcih7IHB1YjogJ3NwcGs3WldCOGRpVTJUV2VoeGRrV0NWMkRURnZuMWhQejRxTGppRDNuSlFvektub1NFblNDOGInIH0pLmdldEtleXMoKS5wdWJcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoXG4gICAgICAgIG5ldyBYdHpMaWIuS2V5UGFpcih7IHB1YjogJ3NwcGs3WnE5S1B0d2t6a2dBc2hhNGpVMjlDNDNNY2dQMnNrSzU2dGpkN0tKamhjbUg2QVpDMUYnIH0pLmdldEtleXMoKS5wdWJcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoXG4gICAgICAgIG5ldyBYdHpMaWIuS2V5UGFpcih7IHB1YjogJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnIH0pLmdldEtleXMoKS5wdWJcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnJyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHguc291cmNlLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMTAnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJycpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgT2JqZWN0LmtleXModHguZ2V0SW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlKCkpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vd25lcnMubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICAgIHR4Lm93bmVyc1swXS5zaG91bGQuZXF1YWwoJ3NwcGs3WldCOGRpVTJUV2VoeGRrV0NWMkRURnZuMWhQejRxTGppRDNuSlFvektub1NFblNDOGInKTtcbiAgICAgIHR4Lm93bmVyc1sxXS5zaG91bGQuZXF1YWwoJ3NwcGs3WnE5S1B0d2t6a2dBc2hhNGpVMjlDNDNNY2dQMnNrSzU2dGpkN0tKamhjbUg2QVpDMUYnKTtcbiAgICAgIHR4Lm93bmVyc1syXS5zaG91bGQuZXF1YWwoJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBhY2NvdW50IHJldmVhbCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAnIH0pO1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjRmhDdmRoVEFmcEVFRFY1OG9xRHZ2NjVZTkhDNjg2Tk5zNEtiSDhZWlFKV1ZtcmZidmU3YUFWSHp4dzhiS0Z4QTdNTGVESzZCYkxma0UzYnFrdkhMUGdhR0hIdFlHZVknLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgWHR6TGliLktleVBhaXIoc291cmNlKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2Uoa2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLnB1YmxpY0tleVRvUmV2ZWFsKGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCkueHB1Yik7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJycpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFjY291bnRVcGRhdGUpO1xuICAgICAgdHguc291cmNlLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0cy5sZW5ndGgsIDApO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzE0MjAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBPYmplY3Qua2V5cyh0eC5nZXRJbmRleGVzQnlUcmFuc2FjdGlvblR5cGUoKSkubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm93bmVycy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgZm9yd2FyZGVyIGNvbnRyYWN0IGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbik7XG4gICAgICBjb25zdCBmb3J3YXJkZXJEZXN0aW5hdGlvbiA9ICdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnO1xuICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckRlc3RpbmF0aW9uKGZvcndhcmRlckRlc3RpbmF0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMCcgfSk7XG4gICAgICBjb25zdCBzb3VyY2UgPSB7XG4gICAgICAgIHB1YjogJ3hwdWI2NjFNeU13QXFSYmNGaEN2ZGhUQWZwRUVEVjU4b3FEdnY2NVlOSEM2ODZOTnM0S2JIOFlaUUpXVm1yZmJ2ZTdhQVZIenh3OGJLRnhBN01MZURLNkJiTGZrRTNicWt2SExQZ2FHSEh0WUdlWScsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBYdHpMaWIuS2V5UGFpcihzb3VyY2UpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShrZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIucHVibGljS2V5VG9SZXZlYWwoa2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKS54cHViKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4LnNvdXJjZS5zaG91bGQuZXF1YWwoa2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHgucHVibGljS2V5VG9SZXZlYWwuc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0S2V5cygpLnB1Yik7XG4gICAgICB0eC5mb3J3YXJkZXJEZXN0aW5hdGlvbi5zaG91bGQuZXF1YWwoZm9yd2FyZGVyRGVzdGluYXRpb24pO1xuICAgICAgdHgub3duZXJzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgc2lnbicsICgpID0+IHtcbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzQ3NjQnLFxuICAgICAgICBnYXNMaW1pdDogJzMzOTcxJyxcbiAgICAgICAgc3RvcmFnZUxpbWl0OiAnMTI5MicsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5pbml0aWFsQmFsYW5jZSgnMTAwMDAwMCcpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignc3BwazdaV0I4ZGlVMlRXZWh4ZGtXQ1YyRFRGdm4xaFB6NHFMamlEM25KUW96S25vU0VuU0M4YicpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCdzcHBrN1pxOUtQdHdremtnQXNoYTRqVTI5QzQzTWNnUDJza0s1NnRqZDdLSmpoY21INkFaQzFGJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnKTtcbiAgICAgIHR4QnVpbGRlci5icmFuY2goJ0JNOFFkWjkyVnlhSDFzNW53QUY5clVYamlQWjNnM05zbjZvWWJkS3FqMlJnSHh2V1hWUycpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJ29wTmZqakVmV2s3SHNuWThmUXJVb1BGdVhaZkFCd2V1YkE2RDRiVlNjbXFvVnpjWlZGQScpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4LnNvdXJjZS5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDA0NzY0Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFKOUxmaERWNkZReFI3YU1hSzdSNlJ3OG1CcGZoUDVNQTMnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHR4LmRlbGVnYXRlKTtcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ1ZENTdoYUFNQ29iSHJDd0g5QUJmYkZ2ZG15Ujlac3BaQzNaaWhiOXRFUGZodHpDS1MxRjhmTG9WcG9kdm9yM1BVb283cnk0ajQ2eFlFVEV6RUxtdG5yTlRhVFBYNCdcbiAgICAgICk7XG4gICAgICBPYmplY3Qua2V5cyh0eC5nZXRJbmRleGVzQnlUcmFuc2FjdGlvblR5cGUoKSkubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm93bmVycy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgdHgub3duZXJzWzBdLnNob3VsZC5lcXVhbCgnc3BwazdaV0I4ZGlVMlRXZWh4ZGtXQ1YyRFRGdm4xaFB6NHFMamlEM25KUW96S25vU0VuU0M4YicpO1xuICAgICAgdHgub3duZXJzWzFdLnNob3VsZC5lcXVhbCgnc3BwazdacTlLUHR3a3prZ0FzaGE0alUyOUM0M01jZ1Ayc2tLNTZ0amQ3S0pqaGNtSDZBWkMxRicpO1xuICAgICAgdHgub3duZXJzWzJdLnNob3VsZC5lcXVhbCgnc3BwazdkMnp0emJyTGRCYVRCN3l6YVdSa1BmY1dHc3JOUU5KZGtCRTliQ1RTU3pla0xOenB2ZicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egd2FsbGV0IGluaXQgdHJhbnNhY3Rpb24gd2l0aCBkZWxlZ2F0aW9uIGFuZCByZXZlYWwgdGhlIHNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzQ3NjQnLFxuICAgICAgICBnYXNMaW1pdDogJzMzOTcxJyxcbiAgICAgICAgc3RvcmFnZUxpbWl0OiAnMTI5MicsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5wdWJsaWNLZXlUb1JldmVhbChkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHViKTtcbiAgICAgIHR4QnVpbGRlci5pbml0aWFsQmFsYW5jZSgnMTAwMDAwMCcpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignc3BwazdaV0I4ZGlVMlRXZWh4ZGtXQ1YyRFRGdm4xaFB6NHFMamlEM25KUW96S25vU0VuU0M4YicpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCdzcHBrN1pxOUtQdHdremtnQXNoYTRqVTI5QzQzTWNnUDJza0s1NnRqZDdLSmpoY21INkFaQzFGJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnKTtcbiAgICAgIHR4QnVpbGRlci5pbml0aWFsRGVsZWdhdGUoJ3R6MUtwYks1djFOQjJ2ZzNKSEJ4WEpaaHlRN3VyODNYcDdpQycpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnb285cnpjSFpjR0JCS3RVZmUzYUw4MmlzTWY4U3NjQnNMRTdQQm1CUVhBMkVLR1Q5eXo3Jyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHguc291cmNlLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMik7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzE0MjAnKTtcbiAgICAgIHR4LmlucHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICB0eC5pbnB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDA0NzY0Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFKUVFVWExmb3hMNmlmVHoyU3lRSzdaRUF2RjFtN0tYZ0MnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICB0eC5kZWxlZ2F0ZS5zaG91bGQuZXF1YWwoJ3R6MUtwYks1djFOQjJ2ZzNKSEJ4WEpaaHlRN3VyODNYcDdpQycpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnVXl6bmFKbzRKZEx1eVM3d3BQNWZEZTEyY1V1dERpQUJFWUhITUVwYU5ZWTZUUXN0QWZ2TEpQUVRjRldKSjJRUk1aeEM0Nm5VdktFZGFCSmZQTjVkekNHTVFEdFhuJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSA9IHR4LmdldEluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSgpO1xuICAgICAgT2JqZWN0LmtleXMoaW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlKS5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgaW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlLnJldmVhbC5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgaW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlLnJldmVhbFswXS5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUub3JpZ2luYXRpb24ubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZS5vcmlnaW5hdGlvblswXS5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vd25lcnMubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICAgIHR4Lm93bmVyc1swXS5zaG91bGQuZXF1YWwoJ3NwcGs3WldCOGRpVTJUV2VoeGRrV0NWMkRURnZuMWhQejRxTGppRDNuSlFvektub1NFblNDOGInKTtcbiAgICAgIHR4Lm93bmVyc1sxXS5zaG91bGQuZXF1YWwoJ3NwcGs3WnE5S1B0d2t6a2dBc2hhNGpVMjlDNDNNY2dQMnNrSzU2dGpkN0tKamhjbUg2QVpDMUYnKTtcbiAgICAgIHR4Lm93bmVyc1syXS5zaG91bGQuZXF1YWwoJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHJldmVhbCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIucHVibGljS2V5VG9SZXZlYWwoZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnb29tWHM2UHVXdG1Hd01Lb1hUTnN1OVhKSG5HWHR1UnVqY0hNZVlTOXkzN1hqNnNYUEhiJyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICB0eC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMCk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTQyMCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5kZWxlZ2F0ZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdReVlzZmh0ckpCS1p1SlNFaXpEZHhvZWpOVnZKV1JaUERNV2RwWFZ2ZFRWaXgzN0h6VVJ3WGZYc2k5TUVUblJ6c2t2amdzQlNnaUY0cHI3UlZ4eldMdWl4eEpMOFUnXG4gICAgICApO1xuICAgICAgY29uc3QgaW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlID0gdHguZ2V0SW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlKCk7XG4gICAgICBpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUucmV2ZWFsLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUucmV2ZWFsWzBdLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIE9iamVjdC5rZXlzKHR4LmdldEluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSgpKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3duZXJzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBtdWx0aXNpZyBzZW5kIHRyYW5zYWN0aW9uIHRvIGFuIGltcGxpY2l0IGFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcignMTAwMDAwMCcpXG4gICAgICAgIC5mcm9tKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKVxuICAgICAgICAudG8oJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpXG4gICAgICAgIC5mZWUoJzQ3NjQnKVxuICAgICAgICAuZ2FzTGltaXQoJzMzOTcxJylcbiAgICAgICAgLnN0b3JhZ2VMaW1pdCgnMTI5MicpXG4gICAgICAgIC5kYXRhVG9TaWduKFxuICAgICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYidcbiAgICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oe1xuICAgICAgICBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHBydjogJ3Nwc2syY2JpVnNBdnBHS21hdTlYY01zY0wzTlJ3amt5VDU3NU41QXlBb2Zjb2o0MXg2ZzZUTCcgfSkuZ2V0S2V5cygpLnBydixcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHNlZWQ6IEJ1ZmZlci5hbGxvYygxNikgfSkuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnb284aGFLanVpWmZqTEptcFdnS0RWRjFrS2JiMnVFdHlnRnlyU1Z6Z29aTmtjM25VTURkJyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnNDc2NCcpO1xuICAgICAgdHguaW5wdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKTtcbiAgICAgIHR4LmlucHV0c1sxXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnUUxITHpXTE5CV1lER2ZSY0EzNlphTWthcEtKUktTakRCMldyRHNvdTlGWkxvejRLcDF1Y1c5QUc3bWV5OXdqQWlOZlJmQ0ZyQlY5eUtzVThVWjRzRUwyMVY3dldZJ1xuICAgICAgKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnYmE3YTA0ZmFiMWEzZjc3ZWRhOTZiNTUxOTQ3ZGQzNDNlMTY1ZDFiOTFiNmY5ZjgwNjY0OGI2M2U1N2M4OGNjODZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAwYjM4OTAyOGMwYTAwMDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDBmZmZmMDQ2ZDYxNjk2ZTAwMDAwMTI1MDcwNzA3MDcwMDAwMDUwNTAyMDAwMDAwNDMwMzIwMDUzZDAzNmQwNzQzMDM1ZDAxMDAwMDAwMjQ3NDdhMzE1NjUyNmE1MjcwNTY0YjZlNzYzMTM2NDE1NjcwNzI0NjQ4MzE3NDZiNDQ2ZTM0NTQ0NDY2NTY3MTQxMzgzOTMzNDEwMzFlMDc0MzAzNmEwMDgwODk3YTAzNGYwMzRkMDMxYjAyMDAwMDAwZDAwNTA5MDEwMDAwMDA2MDczNjk2NzRlNmE0NDM2MzQ0ZTc1NTY2ZTU1NGIzNzZmNTY0MjMyNjMzMjUzNTAzMzMyNTY1OTZhMzc2NDU0Nzk2YjYyNmU1Mjc4Nzk0NDZmNTMzOTQyNDc3NjY3NjE2Nzc2NmU0ZDYzNTQzNDY4NTk2MzYzNjE2MjYyNDY0NzZmMzk3NDY0NTY1MTU0MzQ0ZDM0MzY2NTdhNTk0YTY0NGMzMjcwN2E1OTQ0NTM3NzZiNjY1MjM2Nzk3MjcwNzA1OTA1MDkwMTAwMDAwMDYwNzM2OTY3NTk2NjU2NTk0YTU1NjE2OTRiNGI1YTU4MzQ3YTczN2E1NzVhMzc1MjQ2MzIzOTMyNmU1NjMyNTAzNjU4NGQzNDZlNGI2NTZiMzI1OTY3NTc1MTM4NDI0YzUzMzE3MjMyMzI3NTM0NjEzOTUzNDM3NjQ3NGQ2MzYyMzgzOTQyNmE1NDY2NzQ1NDZlMzI3NjY3NTU3YTQzNTQ1MTQ3NTMzMjYzNGE0ZTc2NjI1OTc0NzU0NzUxNmE0NzUwMDMwNjExZWJkYTMwZGQxNTAzMjQ3MzczOTE3MDU4ODY4NDBiZmI5OWY4ZjUxZDY1ODZiMjc0MDhlODRkZjkzY2UwZjQ1ZGM2ZThlNmRmMDAwZTYwMmRhMTljMzUwOTE5MGIzN2U3ZGY3YjExZDU1MmNjYmM0NmUzZGQzNGMwNWYzYmY4J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSA9IHR4LmdldEluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSgpO1xuICAgICAgT2JqZWN0LmtleXMoaW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgaW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlLnRyYW5zYWN0aW9uLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUudHJhbnNhY3Rpb25bMF0uc2hvdWxkLmVxdWFsKDApO1xuICAgICAgdHgub3duZXJzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBzZW5kIHRyYW5zYWN0aW9uIHRvIGFuIG9yaWdpbmF0ZWQgYWNjb3VudCAob3RoZXIgY29udHJhY3QpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4QnVpbGRlci5icmFuY2goJ0JNOFFkWjkyVnlhSDFzNW53QUY5clVYamlQWjNnM05zbjZvWWJkS3FqMlJnSHh2V1hWUycpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudHJhbnNmZXIoJzEwMCcpXG4gICAgICAgIC5mcm9tKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKVxuICAgICAgICAudG8oJ0tUMUhVcnQ2a2Z2WXlERVlDSjJHU2p2VFBaNkttUmZ4TEJVOCcpXG4gICAgICAgIC5mZWUoJzQ3NjQnKVxuICAgICAgICAuZ2FzTGltaXQoJzMzOTcxJylcbiAgICAgICAgLnN0b3JhZ2VMaW1pdCgnMTI5MicpXG4gICAgICAgIC5kYXRhVG9TaWduKFxuICAgICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYidcbiAgICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oe1xuICAgICAgICBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHBydjogJ3Nwc2syY2JpVnNBdnBHS21hdTlYY01zY0wzTlJ3amt5VDU3NU41QXlBb2Zjb2o0MXg2ZzZUTCcgfSkuZ2V0S2V5cygpLnBydixcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHNlZWQ6IEJ1ZmZlci5hbGxvYygxNikgfSkuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnb29iVE5vNzJkdTlCRllmeVpUbzY0a1RYVmhCZkhOdUphSlFYdU5HVnI2Z1lDRHBZakRRJyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnNDc2NCcpO1xuICAgICAgdHguaW5wdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKTtcbiAgICAgIHR4LmlucHV0c1sxXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHR4LmRlbGVnYXRlKTtcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ2NNM3hpUTlHTjl0UFhzVmtja1BIazY2a0FIRFJNYWc2WENiSExXdk1MUHFIOUtIZ3pBRmVwY2kyeDUza2NKR3FWaEZYYVVTRTNEaFJDR2RnajhhaGtrV2dpWVp1cidcbiAgICAgICk7XG4gICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ2JhN2EwNGZhYjFhM2Y3N2VkYTk2YjU1MTk0N2RkMzQzZTE2NWQxYjkxYjZmOWY4MDY2NDhiNjNlNTdjODhjYzg2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMGIzODkwMjhjMGEwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDE0MDA3MDcwNzA3MDAwMDA1MDUwMjAwMDAwMDVlMDMyMDA1M2QwMzZkMDc0MzAzNmUwMTAwMDAwMDI0NGI1NDMxNDg1NTcyNzQzNjZiNjY3NjU5Nzk0NDQ1NTk0MzRhMzI0NzUzNmE3NjU0NTA1YTM2NGI2ZDUyNjY3ODRjNDI1NTM4MDU1NTAzNmMwMjAwMDAwMDE1MDcyZjAyMDAwMDAwMDkwMjAwMDAwMDA0MDM0ZjAzMjcwMjAwMDAwMDAwMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMGQwMDUwOTAxMDAwMDAwNjA3MzY5Njc0ZTZhNDQzNjM0NGU3NTU2NmU1NTRiMzc2ZjU2NDIzMjYzMzI1MzUwMzMzMjU2NTk2YTM3NjQ1NDc5NmI2MjZlNTI3ODc5NDQ2ZjUzMzk0MjQ3NzY2NzYxNjc3NjZlNGQ2MzU0MzQ2ODU5NjM2MzYxNjI2MjQ2NDc2ZjM5NzQ2NDU2NTE1NDM0NGQzNDM2NjU3YTU5NGE2NDRjMzI3MDdhNTk0NDUzNzc2YjY2NTIzNjc5NzI3MDcwNTkwNTA5MDEwMDAwMDA2MDczNjk2NzU5NjY1NjU5NGE1NTYxNjk0YjRiNWE1ODM0N2E3MzdhNTc1YTM3NTI0NjMyMzkzMjZlNTYzMjUwMzY1ODRkMzQ2ZTRiNjU2YjMyNTk2NzU3NTEzODQyNGM1MzMxNzIzMjMyNzUzNDYxMzk1MzQzNzY0NzRkNjM2MjM4Mzk0MjZhNTQ2Njc0NTQ2ZTMyNzY2NzU1N2E0MzU0NTE0NzUzMzI2MzRhNGU3NjYyNTk3NDc1NDc1MTZhNDc1MDAzMDY2ZGJlZWU4MGRlNDU4NDdhZWViMDRmMTdkYmIyZTA3NzRhZTY5NDI4MTdkMzFlNzQ0YzdlNzc3MjkyNWM1ZjUxMGIxODUyM2RhZmU1NDYwM2M4NzUzMTQxZjNlMDk4OTY3OGYyMjUyZGViM2JkYWVmOTNkNmJlZmE5NDM5OTI0MCdcbiAgICAgICk7XG4gICAgICBPYmplY3Qua2V5cyh0eC5nZXRJbmRleGVzQnlUcmFuc2FjdGlvblR5cGUoKSkubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm93bmVycy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2VuZCB0cmFuc2FjdGlvbiB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcignMTAwJylcbiAgICAgICAgLmZyb20oJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpXG4gICAgICAgIC50bygnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4JylcbiAgICAgICAgLmZlZSgnNDc2NCcpXG4gICAgICAgIC5jb3VudGVyKCcxJylcbiAgICAgICAgLmRhdGFUb1NpZ24oXG4gICAgICAgICAgJzA1MDcwNzBhMDAwMDAwMTYwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMDA3MDcwMDAwMDUwNTAyMDAwMDAwMzIwMzIwMDUzZDAzNmQwNzQzMDM1ZDBhMDAwMDAwMTUwMDZiNWRkYWVmM2ZiNWQ3YzE1MWNmYjM2ZmJlNDNhN2EwNjY3NzczOTQwMzFlMDc0MzAzNmEwMDAxMDM0ZjAzNGQwMzFiJ1xuICAgICAgICApO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcignMTAwJylcbiAgICAgICAgLmZyb20oJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpXG4gICAgICAgIC50bygndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJylcbiAgICAgICAgLmZlZSgnNDc2NCcpXG4gICAgICAgIC5jb3VudGVyKCcyJylcbiAgICAgICAgLmRhdGFUb1NpZ24oXG4gICAgICAgICAgJzA1MDcwNzBhMDAwMDAwMTYwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMDA3MDcwMDAwMDUwNTAyMDAwMDAwMzIwMzIwMDUzZDAzNmQwNzQzMDM1ZDBhMDAwMDAwMTUwMDZiNWRkYWVmM2ZiNWQ3YzE1MWNmYjM2ZmJlNDNhN2EwNjY3NzczOTQwMzFlMDc0MzAzNmEwMDAxMDM0ZjAzNGQwMzFiJ1xuICAgICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7XG4gICAgICAgIGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KS5nZXRLZXlzKCkucHJ2LFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKHsgc2VlZDogQnVmZmVyLmFsbG9jKDE2KSB9KS5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKCdvbnlHYVdzNno0YlZWY2ZuM2g5S2JCcmt0RWh1RHlKTFlFVkI0YUpSTTZZTm5nakR4RTQnKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LnNvdXJjZS5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCc0NzY0Jyk7XG4gICAgICB0eC5pbnB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpO1xuICAgICAgdHguaW5wdXRzWzFdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICB0eC5pbnB1dHNbMl0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgdHguaW5wdXRzWzJdLnZhbHVlLnNob3VsZC5lcXVhbCgnNDc2NCcpO1xuICAgICAgdHguaW5wdXRzWzNdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKTtcbiAgICAgIHR4LmlucHV0c1szXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICB0eC5vdXRwdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4Lm91dHB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnZFVwekN4bWk5TldoZGJGR2Z2cVZ5SDhYZnIyVWlQYzJma3FOclE0Q0h2cmsxOVpEa3NEa3NFYzRESnNUYnBoZW5WOGpDTlpGcXpMNHNDVlJ6TTkzSG5TU3FnSno3J1xuICAgICAgKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnYmE3YTA0ZmFiMWEzZjc3ZWRhOTZiNTUxOTQ3ZGQzNDNlMTY1ZDFiOTFiNmY5ZjgwNjY0OGI2M2U1N2M4OGNjODZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAwZTg1MjgxMDIwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDE0MDA3MDcwNzA3MDAwMTA1MDUwMjAwMDAwMDVlMDMyMDA1M2QwMzZkMDc0MzAzNmUwMTAwMDAwMDI0NGI1NDMxNDg1NTcyNzQzNjZiNjY3NjU5Nzk0NDQ1NTk0MzRhMzI0NzUzNmE3NjU0NTA1YTM2NGI2ZDUyNjY3ODRjNDI1NTM4MDU1NTAzNmMwMjAwMDAwMDE1MDcyZjAyMDAwMDAwMDkwMjAwMDAwMDA0MDM0ZjAzMjcwMjAwMDAwMDAwMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMGQwMDUwOTAxMDAwMDAwNjA3MzY5Njc0ZTZhNDQzNjM0NGU3NTU2NmU1NTRiMzc2ZjU2NDIzMjYzMzI1MzUwMzMzMjU2NTk2YTM3NjQ1NDc5NmI2MjZlNTI3ODc5NDQ2ZjUzMzk0MjQ3NzY2NzYxNjc3NjZlNGQ2MzU0MzQ2ODU5NjM2MzYxNjI2MjQ2NDc2ZjM5NzQ2NDU2NTE1NDM0NGQzNDM2NjU3YTU5NGE2NDRjMzI3MDdhNTk0NDUzNzc2YjY2NTIzNjc5NzI3MDcwNTkwNTA5MDEwMDAwMDA2MDczNjk2NzU5NjY1NjU5NGE1NTYxNjk0YjRiNWE1ODM0N2E3MzdhNTc1YTM3NTI0NjMyMzkzMjZlNTYzMjUwMzY1ODRkMzQ2ZTRiNjU2YjMyNTk2NzU3NTEzODQyNGM1MzMxNzIzMjMyNzUzNDYxMzk1MzQzNzY0NzRkNjM2MjM4Mzk0MjZhNTQ2Njc0NTQ2ZTMyNzY2NzU1N2E0MzU0NTE0NzUzMzI2MzRhNGU3NjYyNTk3NDc1NDc1MTZhNDc1MDAzMDY2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMWU4NTI4MTAyMDAwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMGZmZmYwNDZkNjE2OTZlMDAwMDAxMjQwNzA3MDcwNzAwMDIwNTA1MDIwMDAwMDA0MjAzMjAwNTNkMDM2ZDA3NDMwMzVkMDEwMDAwMDAyNDc0N2EzMTU2NTI2YTUyNzA1NjRiNmU3NjMxMzY0MTU2NzA3MjQ2NDgzMTc0NmI0NDZlMzQ1NDQ0NjY1NjcxNDEzODM5MzM0MTAzMWUwNzQzMDM2YTAwYTQwMTAzNGYwMzRkMDMxYjAyMDAwMDAwZDAwNTA5MDEwMDAwMDA2MDczNjk2NzRlNmE0NDM2MzQ0ZTc1NTY2ZTU1NGIzNzZmNTY0MjMyNjMzMjUzNTAzMzMyNTY1OTZhMzc2NDU0Nzk2YjYyNmU1Mjc4Nzk0NDZmNTMzOTQyNDc3NjY3NjE2Nzc2NmU0ZDYzNTQzNDY4NTk2MzYzNjE2MjYyNDY0NzZmMzk3NDY0NTY1MTU0MzQ0ZDM0MzY2NTdhNTk0YTY0NGMzMjcwN2E1OTQ0NTM3NzZiNjY1MjM2Nzk3MjcwNzA1OTA1MDkwMTAwMDAwMDYwNzM2OTY3NTk2NjU2NTk0YTU1NjE2OTRiNGI1YTU4MzQ3YTczN2E1NzVhMzc1MjQ2MzIzOTMyNmU1NjMyNTAzNjU4NGQzNDZlNGI2NTZiMzI1OTY3NTc1MTM4NDI0YzUzMzE3MjMyMzI3NTM0NjEzOTUzNDM3NjQ3NGQ2MzYyMzgzOTQyNmE1NDY2NzQ1NDZlMzI3NjY3NTU3YTQzNTQ1MTQ3NTMzMjYzNGE0ZTc2NjI1OTc0NzU0NzUxNmE0NzUwMDMwNjc2NmEwYjFmNmNiMDM1YmY1Mzc4ODdiYTkwMDRjNDg5YmI0NThkOGM4ZTcyYjUwMzNiNmNlZThhZDUyZjg0ZWMyN2I3MTlmNWQwYjk4Y2RmMmQwNzQ0YjI1NTMwMTI2MzY4ODY5MjY0NWVhZmM5Y2RmMWI0OGI1MDUzYzUxZGNhJ1xuICAgICAgKTtcbiAgICAgIHR4Lm93bmVycy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgY29uc3QgaW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlID0gdHguZ2V0SW5kZXhlc0J5VHJhbnNhY3Rpb25UeXBlKCk7XG4gICAgICBPYmplY3Qua2V5cyhpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUudHJhbnNhY3Rpb24ubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIGluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZS50cmFuc2FjdGlvblswXS5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUudHJhbnNhY3Rpb25bMV0uc2hvdWxkLmVxdWFsKDEpO1xuXG4gICAgICBjb25zdCBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlcyA9IHR4LmdldFRyYW5zZmVyU2lnbmF0dXJlcyhpbmRleGVzQnlUcmFuc2FjdGlvblR5cGUudHJhbnNhY3Rpb25bMF0pO1xuICAgICAgZmlyc3RUcmFuc2ZlclNpZ25hdHVyZXNbMF0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ05qRDY0TnVWblVLN29WQjJjMlNQMzJWWWo3ZFR5a2JuUnh5RG9TOUJHdmdhZ3ZuTWNUNGhZY2NhYmJGR285dGRWUVQ0TTQ2ZXpZSmRMMnB6WURTd2tmUjZ5cnBwWSdcbiAgICAgICk7XG4gICAgICBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlc1swXS5pbmRleC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlc1sxXS5zaWduYXR1cmUuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnWWZWWUpVYWlLS1pYNHpzeldaN1JGMjkyblYyUDZYTTRuS2VrMllnV1E4QkxTMXIyMnU0YTlTQ3ZHTWNiODlCalRmdFRuMnZnVXpDVFFHUzJjSk52Yll0dUdRakdQJ1xuICAgICAgKTtcbiAgICAgIGZpcnN0VHJhbnNmZXJTaWduYXR1cmVzWzFdLmluZGV4LnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgY29uc3Qgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzID0gdHguZ2V0VHJhbnNmZXJTaWduYXR1cmVzKGluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZS50cmFuc2FjdGlvblsxXSk7XG4gICAgICBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXNbMF0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ05qRDY0TnVWblVLN29WQjJjMlNQMzJWWWo3ZFR5a2JuUnh5RG9TOUJHdmdhZ3ZuTWNUNGhZY2NhYmJGR285dGRWUVQ0TTQ2ZXpZSmRMMnB6WURTd2tmUjZ5cnBwWSdcbiAgICAgICk7XG4gICAgICBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXNbMF0uaW5kZXguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzWzFdLnNpZ25hdHVyZS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdZZlZZSlVhaUtLWlg0enN6V1o3UkYyOTJuVjJQNlhNNG5LZWsyWWdXUThCTFMxcjIydTRhOVNDdkdNY2I4OUJqVGZ0VG4ydmdVekNUUUdTMmNKTnZiWXR1R1FqR1AnXG4gICAgICApO1xuICAgICAgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzWzFdLmluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHNlbmQgdHJhbnNhY3Rpb24gdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zIGZyb20gaW1wbGljaXQgYWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZUFjY291bnQgPSBuZXcgWHR6TGliLktleVBhaXIoeyBwcnY6ICdzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzQ3NjQnIH0pO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQktuZmlTVkZUaml4Ymh6c1RiUjFlRG1pdDZ5SzdVQmNnUkpQaG1nZVdjWnFpTUhSWjZFJyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMzc3NzUxJyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHNvdXJjZUFjY291bnQuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci50cmFuc2ZlcignMTExJykudG8oJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHhCdWlsZGVyLnRyYW5zZmVyKCcxMTEnKS50bygndHoyWENEYTJ0Y25TMjZQb0JnaVViOGgxeFlodEphZWJDMmJUJyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogc291cmNlQWNjb3VudC5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKCdvbzdtcFRCMjJRdTFkN0VWYzViNGVBZE1nRXp2ZEtSc0hHalpXb0VqUXdZazZCSjFOVHEnKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVTaWdTZW5kKTtcbiAgICAgIHR4LnNvdXJjZS5zaG91bGQuZXF1YWwoJ3R6MlAyRThFZ0hhTEE2QTE3ckgzcEU5VDJ0eDZEQTdENHNpVycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUDJFOEVnSGFMQTZBMTdySDNwRTlUMnR4NkRBN0Q0c2lXJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCc0NzY0Jyk7XG4gICAgICB0eC5pbnB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlAyRThFZ0hhTEE2QTE3ckgzcEU5VDJ0eDZEQTdENHNpVycpO1xuICAgICAgdHguaW5wdXRzWzFdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTExJyk7XG4gICAgICB0eC5pbnB1dHNbMl0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlAyRThFZ0hhTEE2QTE3ckgzcEU5VDJ0eDZEQTdENHNpVycpO1xuICAgICAgdHguaW5wdXRzWzJdLnZhbHVlLnNob3VsZC5lcXVhbCgnNDc2NCcpO1xuICAgICAgdHguaW5wdXRzWzNdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQMkU4RWdIYUxBNkExN3JIM3BFOVQydHg2REE3RDRzaVcnKTtcbiAgICAgIHR4LmlucHV0c1szXS52YWx1ZS5zaG91bGQuZXF1YWwoJzExMScpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTExJyk7XG4gICAgICB0eC5vdXRwdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJYQ0RhMnRjblMyNlBvQmdpVWI4aDF4WWh0SmFlYkMyYlQnKTtcbiAgICAgIHR4Lm91dHB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMTEnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lndzVlRzJyQ2tBcUpjUjJTdVoyM1REUUV0ZlU4b0Z3OXJHcFRBdHB2bkM2OUViUWF6TVpMNmVVbll6eHp2V0ZiTEV0cDdIYk40am9XaTFDOUdRMzQ4TlhydzZYM1pkJ1xuICAgICAgKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMDlmNTY4NjAyMWFhZGNmYzAwMDYzYjA4NzMwNTVjMmU3Yzg0MTM5OGZlY2UzZDc4NjVhOGVkMjc1NjcwOGQ0YTZjMDFhMTUyNWUyODlhZWQ5MzExOWM0NGZkM2FhOGU5ZGY4NTIyZTBkODBkOWMyNTk3ODcxN2U4NTI4MTAyNmYwMDAwNmI1ZGRhZWYzZmI1ZDdjMTUxY2ZiMzZmYmU0M2E3YTA2Njc3NzM5NDAwNmMwMWExNTI1ZTI4OWFlZDkzMTE5YzQ0ZmQzYWE4ZTlkZjg1MjJlMGQ4MGQ5YzI1OTg4NzE3ZTg1MjgxMDI2ZjAwMDFmYWY3MTFmOThkM2E5Nzg2NTY2NTFjMzA4NzUxMzhjMDg2ZmE4NzExMDBmY2YxODliMzY0YzAyMWU0YmUxYTAzMmYzODY3NDQ1ZTBjNjJjYTAxMDQ3ZmI4NTNmZTAyZDAzOGU2MmZjYWQwMmZmY2ExZDA1ZTRiNWE0ZTRmZGMzY2U2ZmMxMTYwN2M5Y2E4Y2VjYTZmZDczMzVkM2RhYjY0MzljZTJkZWUxMSdcbiAgICAgICk7XG4gICAgICBPYmplY3Qua2V5cyh0eC5nZXRJbmRleGVzQnlUcmFuc2FjdGlvblR5cGUoKSkubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm93bmVycy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgbXVsdGlzaWcgc2VuZCB0cmFuc2FjdGlvbiB3aXRoIHRoZSBzaWduYXR1cmVzIGluIGN1c3RvbSBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnRyYW5zZmVyKCcxMDAnKVxuICAgICAgICAuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJylcbiAgICAgICAgLnRvKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKVxuICAgICAgICAuZmVlKCc0NzY0JylcbiAgICAgICAgLmdhc0xpbWl0KCczMzk3MScpXG4gICAgICAgIC5zdG9yYWdlTGltaXQoJzEyOTInKVxuICAgICAgICAuZGF0YVRvU2lnbignMDAnKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgLy8gTXVsdGlzaWcga2V5c1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHNlZWQ6IEJ1ZmZlci5hbGxvYygxOCkgfSkuZ2V0S2V5cygpLnBydiwgaW5kZXg6IDIgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKHsgc2VlZDogQnVmZmVyLmFsbG9jKDE2KSB9KS5nZXRLZXlzKCkucHJ2LCBpbmRleDogMSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gdHgudG9Kc29uKCkuY29udGVudHNbMF0ucGFyYW1ldGVycy52YWx1ZS5hcmdzWzFdO1xuICAgICAgc2lnbmF0dXJlc1swXS5wcmltLnNob3VsZC5lcXVhbCgnTm9uZScpO1xuICAgICAgc2lnbmF0dXJlc1sxXS5wcmltLnNob3VsZC5lcXVhbCgnU29tZScpO1xuICAgICAgc2lnbmF0dXJlc1sxXS5hcmdzWzBdLnN0cmluZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdVeHZDUVNFV1F2WnJmM3lTMlZqU1RCV3ljTVBlM3pCQm82RVd2YTJkM3RIVjFES1pOVXM4YjVmbXFRZVhXdmRTU1h6dHg0OFVzUFk1Rm1KaURvZm1QU1o2U1VqWnQnXG4gICAgICApO1xuICAgICAgc2lnbmF0dXJlc1syXS5wcmltLnNob3VsZC5lcXVhbCgnU29tZScpO1xuICAgICAgc2lnbmF0dXJlc1syXS5hcmdzWzBdLnN0cmluZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdpQzI4NmdMYzFTU1dId0t5ZGN6d3dkd1RVUHY3ZTlta1BlSHpmRTl3RUc5UEtaNmZVY21yTWVZd2NIN3Q5Zldzbm96QjdGYXkydXhrbWkxdTFYMWJ3M01nSlVOcHUnXG4gICAgICApO1xuICAgICAgdHgub3duZXJzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBtdWx0aXNpZyBzZW5kIHRyYW5zYWN0aW9uIHdpdGggdGhlIHNpZ25hdHVyZXMgaW4gZGVmYXVsdCBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnRyYW5zZmVyKCcxMDAnKVxuICAgICAgICAuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJylcbiAgICAgICAgLnRvKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKVxuICAgICAgICAuZmVlKCc0NzY0JylcbiAgICAgICAgLmdhc0xpbWl0KCczMzk3MScpXG4gICAgICAgIC5zdG9yYWdlTGltaXQoJzEyOTInKVxuICAgICAgICAuZGF0YVRvU2lnbignMDAnKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgLy8gTXVsdGlzaWcga2V5c1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHNlZWQ6IEJ1ZmZlci5hbGxvYygxOCkgfSkuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBuZXcgWHR6TGliLktleVBhaXIoeyBzZWVkOiBCdWZmZXIuYWxsb2MoMTYpIH0pLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IHR4LnRvSnNvbigpLmNvbnRlbnRzWzBdLnBhcmFtZXRlcnMudmFsdWUuYXJnc1sxXTtcbiAgICAgIHNpZ25hdHVyZXNbMF0ucHJpbS5zaG91bGQuZXF1YWwoJ1NvbWUnKTtcbiAgICAgIHNpZ25hdHVyZXNbMF0uYXJnc1swXS5zdHJpbmcuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnaUMyODZnTGMxU1NXSHdLeWRjend3ZHdUVVB2N2U5bWtQZUh6ZkU5d0VHOVBLWjZmVWNtck1lWXdjSDd0OWZXc25vekI3RmF5MnV4a21pMXUxWDFidzNNZ0pVTnB1J1xuICAgICAgKTtcbiAgICAgIHNpZ25hdHVyZXNbMV0ucHJpbS5zaG91bGQuZXF1YWwoJ1NvbWUnKTtcbiAgICAgIHNpZ25hdHVyZXNbMV0uYXJnc1swXS5zdHJpbmcuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnVXh2Q1FTRVdRdlpyZjN5UzJWalNUQld5Y01QZTN6QkJvNkVXdmEyZDN0SFYxREtaTlVzOGI1Zm1xUWVYV3ZkU1NYenR4NDhVc1BZNUZtSmlEb2ZtUFNaNlNValp0J1xuICAgICAgKTtcbiAgICAgIHNpZ25hdHVyZXNbMl0ucHJpbS5zaG91bGQuZXF1YWwoJ05vbmUnKTtcbiAgICAgIE9iamVjdC5rZXlzKHR4LmdldEluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSgpKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2luZ2xlU2lnIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVTaWdTZW5kKTtcbiAgICAgIHR4QnVpbGRlci5icmFuY2goJ0JNOFFkWjkyVnlhSDFzNW53QUY5clVYamlQWjNnM05zbjZvWWJkS3FqMlJnSHh2V1hWUycpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudHJhbnNmZXIobmV3IEJpZ051bWJlcigxMCkudG9GaXhlZCgwKSlcbiAgICAgICAgLmZyb20oZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKVxuICAgICAgICAudG8oJ0tUMUhVcnQ2a2Z2WXlERVlDSjJHU2p2VFBaNkttUmZ4TEJVOCcpXG4gICAgICAgIC5mZWUoJzQ3NjQnKVxuICAgICAgICAuZ2FzTGltaXQoJzEwMDk3MScpXG4gICAgICAgIC5zdG9yYWdlTGltaXQoJzEyOTInKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVTaWdTZW5kKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmNvbnRlbnRzWzBdLmdhc19saW1pdC5zaG91bGQuZXF1YWwoJzEwMDk3MScpO1xuICAgICAgdHhKc29uLmNvbnRlbnRzWzBdLnN0b3JhZ2VfbGltaXQuc2hvdWxkLmVxdWFsKCcxMjkyJyk7XG4gICAgICB0eEpzb24uY29udGVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCgnMTAnKTtcbiAgICAgIHR4SnNvbi5jb250ZW50c1swXS5jb3VudGVyLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8gc2lnbicsICgpID0+IHtcbiAgICBsZXQgZ2VuZXJpY1R4QnVpbGRlcjogYW55O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBnZW5lcmljVHhCdWlsZGVyID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgZ2VuZXJpY1R4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGdlbmVyaWNUeEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIGdlbmVyaWNUeEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICBnZW5lcmljVHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIGdlbmVyaWNUeEJ1aWxkZXJcbiAgICAgICAgLnRyYW5zZmVyKCcxMDAnKVxuICAgICAgICAuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJylcbiAgICAgICAgLnRvKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKVxuICAgICAgICAuZmVlKCc0NzY0JylcbiAgICAgICAgLmdhc0xpbWl0KCczMzk3MScpXG4gICAgICAgIC5zdG9yYWdlTGltaXQoJzEyOTInKVxuICAgICAgICAuZGF0YVRvU2lnbignMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGggbm8gc291cmNlIGFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcml2YXRlIGtleSB0aGFuIHRoZSBzb3VyY2UgYWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5lbXB0eVVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcigpLmdldEtleXMoKS5wcnYgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gd2l0aCBzb21lIGtleXMgd2l0aCBjdXN0b20gaW5kZXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBnZW5lcmljVHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICAvLyBNdWx0aXNpZyBrZXlzXG4gICAgICBnZW5lcmljVHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcigpLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBnZW5lcmljVHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcigpLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBnZW5lcmljVHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcigpLmdldEtleXMoKS5wcnYsIGluZGV4OiAyIH0pLFxuICAgICAgICBuZXcgUmVnRXhwKCdDdXN0b20gaW5kZXggaGFzIHRvIGJlIHNldCBmb3IgYWxsIG11bHRpc2lnIGNvbnRyYWN0IHNpZ25pbmcga2V5cyBvciBub25lJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB3aXRoIHNvbWUga2V5cyB3aXRob3V0IGN1c3RvbSBpbmRleCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGdlbmVyaWNUeEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIC8vIE11bHRpc2lnIGtleXNcbiAgICAgIGdlbmVyaWNUeEJ1aWxkZXIuc2lnbih7IGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKCkuZ2V0S2V5cygpLnBydiwgaW5kZXg6IDAgfSk7XG4gICAgICBnZW5lcmljVHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcigpLmdldEtleXMoKS5wcnYsIGluZGV4OiAxIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gZ2VuZXJpY1R4QnVpbGRlci5zaWduKHsga2V5OiBuZXcgWHR6TGliLktleVBhaXIoKS5nZXRLZXlzKCkucHJ2IH0pLFxuICAgICAgICBuZXcgUmVnRXhwKCdDdXN0b20gaW5kZXggaGFzIHRvIGJlIHNldCBmb3IgYWxsIG11bHRpc2lnIGNvbnRyYWN0IHNpZ25pbmcga2V5cyBvciBub25lJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB3aXRoIGEga2V5IHdpdGggaW52YWxpZCBjdXN0b20gaW5kZXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBnZW5lcmljVHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBnZW5lcmljVHhCdWlsZGVyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcigpLmdldEtleXMoKS5wcnYsIGluZGV4OiAzIH0pLFxuICAgICAgICBuZXcgUmVnRXhwKCdDdXN0b20gaW5kZXggY2Fubm90IGJlIGdyZWF0ZXInKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIFNlbmQgdHJhbnNhY3Rpb24gd2l0aCBubyB0cmFuc2ZlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzQ3NjQnIH0pO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQktuZmlTVkZUaml4Ymh6c1RiUjFlRG1pdDZ5SzdVQmNnUkpQaG1nZVdjWnFpTUhSWjZFJyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMScpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gYWRkcmVzcyBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbiB3aXRob3V0IHB1YmxpYyBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkFjY291bnRVcGRhdGUpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0Nhbm5vdCBzaWduIGEgcHVibGljIGtleSByZXZlbGF0aW9uIHRyYW5zYWN0aW9uIHdpdGhvdXQgcHVibGljIGtleScpXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8nLCAoKSA9PiB7XG4gICAgaXQoJ2NoYW5nZSB0aGUgdHlwZSB0byBTZW5kIHdoZW4gb3duZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wdWIpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgc2VuZCB0cmFuc2FjdGlvbiB3aXRoIG93bmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5vd25lcihkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHViKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQgYnJhbmNoIGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmJyYW5jaCgnJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIHZhbHVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmluaXRpYWxCYWxhbmNlKCctMScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIG5vbiB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24gd2l0aCBpbml0aWFsIGJhbGFuY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuaW5pdGlhbEJhbGFuY2UoJzEwMCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCB0cmFuc2ZlciBmb3Igbm9uIHNlbmQtdHlwZSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudHJhbnNmZXIoJzEwMCcpLCBuZXcgUmVnRXhwKCdUcmFuc2ZlcnMgY2FuIG9ubHkgYmUgc2V0IGZvciBzZW5kIHRyYW5zYWN0aW9ucycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhZGQgbW9yZSBvd25lcnMgdGhhbiB0aGUgbXVsdGlzaWcgbWF4aW11bScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCdzcHBrN1pXQjhkaVUyVFdlaHhka1dDVjJEVEZ2bjFoUHo0cUxqaUQzbkpRb3pLbm9TRW5TQzhiJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJ3NwcGs3WnE5S1B0d2t6a2dBc2hhNGpVMjlDNDNNY2dQMnNrSzU2dGpkN0tKamhjbUg2QVpDMUYnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignc3BwazdkMnp0emJyTGRCYVRCN3l6YVdSa1BmY1dHc3JOUU5KZGtCRTliQ1RTU3pla0xOenB2ZicpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHhCdWlsZGVyLm93bmVyKCdzcHBrN2QyenR6YnJMZEJhVEI3eXphV1JrUGZjV0dzck5RTkpka0JFOWJDVFNTemVrTE56cHZmJyksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0EgbWF4aW11bSBvZiAzIG93bmVycycpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FkZCB0aGUgc2FtZSBvd25lciB0d2ljZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCdzcHBrN2QyenR6YnJMZEJhVEI3eXphV1JrUGZjV0dzck5RTkpka0JFOWJDVFNTemVrTE56cHZmJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIub3duZXIoJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnKSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnUmVwZWF0ZWQgb3duZXIgcHVibGljIGtleScpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FkZCBhbiBpbnZhbGlkIG93bmVyIHB1YmxpYyBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLm93bmVyKCdzcHBrJyksIG5ldyBSZWdFeHAoJ0ludmFsaWQgcHVibGljIGtleScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhZGQgYW4gaW52YWxpZCBwdWJsaWMga2V5IHRvIHJldmVhbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5wdWJsaWNLZXlUb1JldmVhbCgnc3BwaycpLCBuZXcgUmVnRXhwKCdVbnN1cHBvcnRlZCBwdWJsaWMga2V5JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FkZCB0aGUgc2FtZSBwdWJsaWMga2V5IHRvIHJldmVhbCB0d2ljZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIucHVibGljS2V5VG9SZXZlYWwoZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnB1Yik7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIucHVibGljS2V5VG9SZXZlYWwoZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnB1YiksXG4gICAgICAgIG5ldyBSZWdFeHAoJ1B1YmxpYyBrZXkgdG8gcmV2ZWFsIGFscmVhZHkgc2V0JylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWRkIHRoZSBwdWJsaWMga2V5IHRvIHJldmVhbCB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB0aGUgc291cmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50VXBkYXRlKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci5wdWJsaWNLZXlUb1JldmVhbCgnc3BwazdkMnp0emJyTGRCYVRCN3l6YVdSa1BmY1dHc3JOUU5KZGtCRTliQ1RTU3pla0xOenB2ZicpLFxuICAgICAgICBuZXcgUmVnRXhwKCdQdWJsaWMga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBzb3VyY2UgYWRkcmVzcycpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoYW5nZSB0aGUgdHJhbnNhY3Rpb24gdHlwZSBmcm9tIFNlbmQgaWYgaXQgaGFzIHRyYW5zZmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnRyYW5zZmVyKCcxMDAnKVxuICAgICAgICAuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJylcbiAgICAgICAgLnRvKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKVxuICAgICAgICAuZmVlKCc0NzY0Jyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbiksXG4gICAgICAgIG5ldyBSZWdFeHAoJ1RyYW5zYWN0aW9uIGNvbnRhaW5zIHRyYW5zZmVycyBhbmQgY2FuIG9ubHkgYmUgbGFiZWxlZCBhcyBTZW5kJylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|