@allbridge/bridge-core-sdk 3.25.0 → 3.26.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/browser/index.js +6 -1
  2. package/dist/browser/index.js.map +4 -4
  3. package/dist/cjs/index.js +6 -1
  4. package/dist/cjs/index.js.map +4 -4
  5. package/dist/esm/index.js +6 -1
  6. package/dist/esm/index.js.map +4 -4
  7. package/dist/src/chains/chain.enums.d.ts +7 -2
  8. package/dist/src/chains/chain.enums.js +5 -0
  9. package/dist/src/chains/chain.enums.js.map +1 -1
  10. package/dist/src/chains/index.js +6 -0
  11. package/dist/src/chains/index.js.map +1 -1
  12. package/dist/src/client/core-api/core-api-mapper.js +1 -0
  13. package/dist/src/client/core-api/core-api-mapper.js.map +1 -1
  14. package/dist/src/client/core-api/core-api.model.d.ts +1 -0
  15. package/dist/src/client/core-api/core-api.model.js.map +1 -1
  16. package/dist/src/services/bridge/alg/index.d.ts +15 -0
  17. package/dist/src/services/bridge/alg/index.js +151 -0
  18. package/dist/src/services/bridge/alg/index.js.map +1 -0
  19. package/dist/src/services/bridge/index.js +16 -0
  20. package/dist/src/services/bridge/index.js.map +1 -1
  21. package/dist/src/services/bridge/models/bridge.model.d.ts +1 -0
  22. package/dist/src/services/bridge/models/bridge.model.js.map +1 -1
  23. package/dist/src/services/bridge/sui/index.js.map +1 -1
  24. package/dist/src/services/bridge/utils.d.ts +3 -1
  25. package/dist/src/services/bridge/utils.js +41 -15
  26. package/dist/src/services/bridge/utils.js.map +1 -1
  27. package/dist/src/services/liquidity-pool/alg/index.d.ts +19 -0
  28. package/dist/src/services/liquidity-pool/alg/index.js +133 -0
  29. package/dist/src/services/liquidity-pool/alg/index.js.map +1 -0
  30. package/dist/src/services/liquidity-pool/index.js +16 -0
  31. package/dist/src/services/liquidity-pool/index.js.map +1 -1
  32. package/dist/src/services/liquidity-pool/sui/index.js.map +1 -1
  33. package/dist/src/services/liquidity-pool/trx/index.js.map +1 -1
  34. package/dist/src/services/models/alg/BridgeClient.d.ts +2718 -0
  35. package/dist/src/services/models/alg/BridgeClient.js +2619 -0
  36. package/dist/src/services/models/alg/BridgeClient.js.map +1 -0
  37. package/dist/src/services/models/alg/PoolClient.d.ts +2265 -0
  38. package/dist/src/services/models/alg/PoolClient.js +2176 -0
  39. package/dist/src/services/models/alg/PoolClient.js.map +1 -0
  40. package/dist/src/services/models/index.d.ts +6 -5
  41. package/dist/src/services/models/index.js.map +1 -1
  42. package/dist/src/services/token/alg/index.d.ts +17 -0
  43. package/dist/src/services/token/alg/index.js +46 -0
  44. package/dist/src/services/token/alg/index.js.map +1 -0
  45. package/dist/src/services/token/index.js +16 -0
  46. package/dist/src/services/token/index.js.map +1 -1
  47. package/dist/src/services/token/sui/index.js.map +1 -1
  48. package/dist/src/services/utils/alg/index.d.ts +14 -0
  49. package/dist/src/services/utils/alg/index.js +56 -0
  50. package/dist/src/services/utils/alg/index.js.map +1 -0
  51. package/dist/src/services/utils/trx/index.js.map +1 -1
  52. package/dist/src/services/yield/index.js +4 -0
  53. package/dist/src/services/yield/index.js.map +1 -1
  54. package/dist/src/tokens-info/tokens-info.model.d.ts +4 -0
  55. package/dist/src/tokens-info/tokens-info.model.js.map +1 -1
  56. package/dist/src/utils/alg/index.d.ts +21 -0
  57. package/dist/src/utils/alg/index.js +85 -0
  58. package/dist/src/utils/alg/index.js.map +1 -0
  59. package/dist/src/utils/index.d.ts +3 -0
  60. package/dist/src/utils/index.js +3 -0
  61. package/dist/src/utils/index.js.map +1 -1
  62. package/dist/src/version.d.ts +1 -1
  63. package/dist/src/version.js +1 -1
  64. package/dist/src/version.js.map +1 -1
  65. package/package.json +5 -2
@@ -0,0 +1,2619 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BridgeClient = exports.BridgeFactory = exports.BridgeParamsFactory = exports.APP_SPEC = void 0;
4
+ const app_arc56_1 = require("@algorandfoundation/algokit-utils/types/app-arc56");
5
+ const app_client_1 = require("@algorandfoundation/algokit-utils/types/app-client");
6
+ const app_factory_1 = require("@algorandfoundation/algokit-utils/types/app-factory");
7
+ exports.APP_SPEC = {
8
+ name: "Bridge",
9
+ structs: {},
10
+ methods: [
11
+ {
12
+ name: "createApplication",
13
+ args: [
14
+ { type: "address", name: "owner" },
15
+ { type: "byte", name: "chainId" },
16
+ { type: "application", name: "messenger" },
17
+ { type: "application", name: "gasOracle" },
18
+ ],
19
+ returns: { type: "void" },
20
+ actions: { create: ["NoOp"], call: [] },
21
+ readonly: false,
22
+ events: [],
23
+ recommendations: {},
24
+ },
25
+ {
26
+ name: "optInAsset",
27
+ args: [{ type: "uint64", name: "assetId" }],
28
+ returns: { type: "void" },
29
+ actions: { create: [], call: ["NoOp"] },
30
+ readonly: false,
31
+ events: [],
32
+ recommendations: {},
33
+ },
34
+ {
35
+ name: "noop",
36
+ args: [],
37
+ returns: { type: "void" },
38
+ actions: { create: [], call: ["NoOp"] },
39
+ readonly: false,
40
+ events: [],
41
+ recommendations: {},
42
+ },
43
+ {
44
+ name: "swapAndBridge",
45
+ args: [
46
+ { type: "uint64", name: "tokenId" },
47
+ { type: "byte[32]", name: "recipient" },
48
+ { type: "byte", name: "destinationChainId" },
49
+ { type: "byte[32]", name: "receiveToken" },
50
+ { type: "byte[32]", name: "nonce" },
51
+ {
52
+ type: "uint64",
53
+ name: "feeTokenAmount",
54
+ defaultValue: { source: "literal", data: "AAAAAAAAAAA=", type: "uint64" },
55
+ },
56
+ ],
57
+ returns: { type: "void" },
58
+ actions: { create: [], call: ["NoOp"] },
59
+ readonly: false,
60
+ events: [
61
+ { name: "BridgingFeeFromTokens", args: [{ type: "uint64", name: "fee" }] },
62
+ {
63
+ name: "ReceiveFee",
64
+ args: [
65
+ { type: "uint64", name: "bridgeTransactionCost" },
66
+ { type: "uint64", name: "messageTransactionCost" },
67
+ ],
68
+ },
69
+ {
70
+ name: "TokensSent",
71
+ args: [
72
+ { type: "uint64", name: "amount" },
73
+ { type: "byte[32]", name: "recipient" },
74
+ { type: "byte", name: "destinationChainId" },
75
+ { type: "byte[32]", name: "receiveToken" },
76
+ { type: "byte[32]", name: "nonce" },
77
+ { type: "byte", name: "messenger" },
78
+ ],
79
+ },
80
+ ],
81
+ recommendations: {},
82
+ },
83
+ {
84
+ name: "receiveTokens",
85
+ args: [
86
+ { type: "uint64", name: "amount" },
87
+ { type: "byte[32]", name: "recipient" },
88
+ { type: "byte", name: "sourceChainId" },
89
+ { type: "byte[32]", name: "receiveToken" },
90
+ { type: "byte[32]", name: "nonce" },
91
+ { type: "uint64", name: "receiveAmountMin" },
92
+ ],
93
+ returns: { type: "void" },
94
+ actions: { create: [], call: ["NoOp"] },
95
+ readonly: false,
96
+ events: [
97
+ {
98
+ name: "TokensReceived",
99
+ args: [
100
+ { type: "uint64", name: "receiveAmount" },
101
+ { type: "address", name: "recipient" },
102
+ { type: "byte[32]", name: "nonce" },
103
+ { type: "byte", name: "messenger" },
104
+ { type: "byte[32]", name: "message" },
105
+ ],
106
+ },
107
+ ],
108
+ recommendations: {},
109
+ },
110
+ {
111
+ name: "registerBridge",
112
+ args: [
113
+ { type: "byte", name: "chainId" },
114
+ { type: "byte[32]", name: "bridgeAddress" },
115
+ ],
116
+ returns: { type: "void" },
117
+ actions: { create: [], call: ["NoOp"] },
118
+ readonly: false,
119
+ events: [],
120
+ recommendations: {},
121
+ },
122
+ {
123
+ name: "addBridgeToken",
124
+ args: [
125
+ { type: "byte", name: "chainId" },
126
+ { type: "byte[32]", name: "tokenAddress" },
127
+ ],
128
+ returns: { type: "void" },
129
+ actions: { create: [], call: ["NoOp"] },
130
+ readonly: false,
131
+ events: [],
132
+ recommendations: {},
133
+ },
134
+ {
135
+ name: "removeBridgeToken",
136
+ args: [
137
+ { type: "byte", name: "chainId" },
138
+ { type: "byte[32]", name: "tokenAddress" },
139
+ ],
140
+ returns: { type: "void" },
141
+ actions: { create: [], call: ["NoOp"] },
142
+ readonly: false,
143
+ events: [],
144
+ recommendations: {},
145
+ },
146
+ {
147
+ name: "withdrawGasTokens",
148
+ args: [{ type: "uint64", name: "amount" }],
149
+ returns: { type: "void" },
150
+ actions: { create: [], call: ["NoOp"] },
151
+ readonly: false,
152
+ events: [],
153
+ recommendations: {},
154
+ },
155
+ {
156
+ name: "withdrawBridgingFeeInTokens",
157
+ args: [{ type: "uint64", name: "assetId" }],
158
+ returns: { type: "void" },
159
+ actions: { create: [], call: ["NoOp"] },
160
+ readonly: false,
161
+ events: [],
162
+ recommendations: {},
163
+ },
164
+ {
165
+ name: "getBridgingCostInTokens",
166
+ args: [
167
+ { type: "byte", name: "destinationChainId" },
168
+ { type: "uint64", name: "tokenId" },
169
+ ],
170
+ returns: { type: "uint64" },
171
+ actions: { create: [], call: ["NoOp"] },
172
+ readonly: true,
173
+ events: [],
174
+ recommendations: {},
175
+ },
176
+ {
177
+ name: "hashMessage",
178
+ args: [
179
+ { type: "uint64", name: "amount" },
180
+ { type: "byte[32]", name: "recipient" },
181
+ { type: "byte", name: "sourceChainId" },
182
+ { type: "byte", name: "destinationChainId" },
183
+ { type: "byte[32]", name: "receiveToken" },
184
+ { type: "byte[32]", name: "nonce" },
185
+ ],
186
+ returns: { type: "byte[32]" },
187
+ actions: { create: [], call: ["NoOp"] },
188
+ readonly: true,
189
+ events: [],
190
+ recommendations: {},
191
+ },
192
+ {
193
+ name: "isOtherBridgeTokenSupported",
194
+ args: [
195
+ { type: "byte", name: "chainId" },
196
+ { type: "byte[32]", name: "token" },
197
+ ],
198
+ returns: { type: "bool" },
199
+ actions: { create: [], call: ["NoOp"] },
200
+ readonly: true,
201
+ events: [],
202
+ recommendations: {},
203
+ },
204
+ {
205
+ name: "getTransactionCost",
206
+ args: [{ type: "byte", name: "chainId" }],
207
+ returns: { type: "uint64" },
208
+ actions: { create: [], call: ["NoOp"] },
209
+ readonly: true,
210
+ events: [],
211
+ recommendations: {},
212
+ },
213
+ {
214
+ name: "getReceiveTokensCost",
215
+ args: [],
216
+ returns: { type: "uint64" },
217
+ actions: { create: [], call: ["NoOp"] },
218
+ readonly: true,
219
+ events: [],
220
+ recommendations: {},
221
+ },
222
+ {
223
+ name: "getSendTransactionStorageCost",
224
+ args: [],
225
+ returns: { type: "uint64" },
226
+ actions: { create: [], call: ["NoOp"] },
227
+ readonly: true,
228
+ events: [],
229
+ recommendations: {},
230
+ },
231
+ {
232
+ name: "swap",
233
+ args: [
234
+ { type: "uint64", name: "tokenId", desc: "The token to be swapped." },
235
+ { type: "uint64", name: "receiveTokenId", desc: "The token to receive in exchange for the swapped token." },
236
+ { type: "address", name: "recipient", desc: "The address to receive the tokens." },
237
+ {
238
+ type: "uint64",
239
+ name: "receiveAmountMin",
240
+ desc: "The minimum amount of tokens required to receive during the swap.",
241
+ },
242
+ ],
243
+ returns: { type: "void" },
244
+ actions: { create: [], call: ["NoOp"] },
245
+ readonly: false,
246
+ events: [
247
+ {
248
+ name: "Swapped",
249
+ args: [
250
+ { type: "address", name: "sender" },
251
+ { type: "address", name: "recipient" },
252
+ { type: "uint64", name: "tokenId" },
253
+ { type: "uint64", name: "receiveTokenId" },
254
+ { type: "uint64", name: "amount" },
255
+ { type: "uint64", name: "receivedAmount" },
256
+ ],
257
+ },
258
+ ],
259
+ recommendations: {},
260
+ },
261
+ {
262
+ name: "addPool",
263
+ args: [
264
+ { type: "uint64", name: "poolId", desc: "The address of the `Pool` contract." },
265
+ { type: "uint64", name: "tokenId", desc: "The address of the token in the liquidity pool." },
266
+ ],
267
+ returns: { type: "void" },
268
+ actions: { create: [], call: ["NoOp"] },
269
+ readonly: false,
270
+ events: [],
271
+ recommendations: {},
272
+ },
273
+ {
274
+ name: "removePool",
275
+ args: [{ type: "uint64", name: "tokenId" }],
276
+ returns: { type: "void" },
277
+ actions: { create: [], call: ["NoOp"] },
278
+ readonly: false,
279
+ events: [],
280
+ recommendations: {},
281
+ },
282
+ {
283
+ name: "stopSwap",
284
+ args: [],
285
+ returns: { type: "void" },
286
+ actions: { create: [], call: ["NoOp"] },
287
+ readonly: false,
288
+ events: [],
289
+ recommendations: {},
290
+ },
291
+ {
292
+ name: "startSwap",
293
+ args: [],
294
+ returns: { type: "void" },
295
+ actions: { create: [], call: ["NoOp"] },
296
+ readonly: false,
297
+ events: [],
298
+ recommendations: {},
299
+ },
300
+ {
301
+ name: "setStopAuthority",
302
+ args: [{ type: "address", name: "stopAuthority" }],
303
+ returns: { type: "void" },
304
+ actions: { create: [], call: ["NoOp"] },
305
+ readonly: false,
306
+ events: [],
307
+ recommendations: {},
308
+ },
309
+ {
310
+ name: "setRebalancer",
311
+ args: [{ type: "address", name: "rebalancer" }],
312
+ returns: { type: "void" },
313
+ actions: { create: [], call: ["NoOp"] },
314
+ readonly: false,
315
+ events: [],
316
+ recommendations: {},
317
+ },
318
+ {
319
+ name: "getGasUsage",
320
+ args: [{ type: "byte", name: "chainId" }],
321
+ returns: { type: "uint64" },
322
+ actions: { create: [], call: ["NoOp"] },
323
+ readonly: true,
324
+ events: [],
325
+ recommendations: {},
326
+ },
327
+ {
328
+ name: "setGasUsage",
329
+ args: [
330
+ { type: "byte", name: "chainId" },
331
+ { type: "uint64", name: "gasAmount" },
332
+ ],
333
+ returns: { type: "void" },
334
+ actions: { create: [], call: ["NoOp"] },
335
+ readonly: false,
336
+ events: [],
337
+ recommendations: {},
338
+ },
339
+ {
340
+ name: "setGasOracle",
341
+ args: [{ type: "application", name: "gasOracle" }],
342
+ returns: { type: "void" },
343
+ actions: { create: [], call: ["NoOp"] },
344
+ readonly: false,
345
+ events: [],
346
+ recommendations: {},
347
+ },
348
+ {
349
+ name: "getTransactionRelayerCost",
350
+ args: [{ type: "byte", name: "chainId" }],
351
+ returns: { type: "uint64" },
352
+ actions: { create: [], call: ["NoOp"] },
353
+ readonly: true,
354
+ events: [],
355
+ recommendations: {},
356
+ },
357
+ {
358
+ name: "transferOwnership",
359
+ args: [{ type: "address", name: "newOwner" }],
360
+ returns: { type: "void" },
361
+ actions: { create: [], call: ["NoOp"] },
362
+ readonly: false,
363
+ events: [],
364
+ recommendations: {},
365
+ },
366
+ ],
367
+ arcs: [22, 28],
368
+ networks: {},
369
+ state: {
370
+ schema: { global: { ints: 3, bytes: 4 }, local: { ints: 0, bytes: 0 } },
371
+ keys: {
372
+ global: {
373
+ chainId: { keyType: "AVMString", valueType: "byte", key: "Y2hhaW5JZA==" },
374
+ messenger: { keyType: "AVMString", valueType: "AVMUint64", key: "bWVzc2VuZ2Vy" },
375
+ stopAuthority: { keyType: "AVMString", valueType: "address", key: "c3RvcEF1dGhvcml0eQ==" },
376
+ rebalancer: { keyType: "AVMString", valueType: "address", key: "cmViYWxhbmNlcg==" },
377
+ canSwap: { keyType: "AVMString", valueType: "AVMUint64", key: "Y2FuU3dhcA==" },
378
+ gasOracle: { keyType: "AVMString", valueType: "AVMUint64", key: "Z2FzT3JhY2xl" },
379
+ owner: { keyType: "AVMString", valueType: "address", key: "b3duZXI=" },
380
+ },
381
+ local: {},
382
+ box: {},
383
+ },
384
+ maps: {
385
+ global: {},
386
+ local: {},
387
+ box: {
388
+ processedMessages: { keyType: "byte[32]", valueType: "byte[0]", prefix: "bQ==" },
389
+ sentMessages: { keyType: "byte[32]", valueType: "byte[0]", prefix: "cw==" },
390
+ otherBridges: { keyType: "byte", valueType: "byte[32]", prefix: "Yg==" },
391
+ otherBridgeTokens: { keyType: "AVMBytes", valueType: "byte[0]", prefix: "dA==" },
392
+ pools: { keyType: "uint64", valueType: "uint64", prefix: "cA==" },
393
+ fromGasOracleScalingFactor: { keyType: "uint64", valueType: "uint64", prefix: "ZQ==" },
394
+ bridgingFeeConversionScalingFactor: { keyType: "uint64", valueType: "uint64", prefix: "Zg==" },
395
+ gasUsage: { keyType: "byte", valueType: "uint64", prefix: "Zw==" },
396
+ },
397
+ },
398
+ },
399
+ bareActions: { create: [], call: [] },
400
+ sourceInfo: {
401
+ approval: {
402
+ sourceInfo: [
403
+ { pc: [906], errorMessage: "Asset must go to app" },
404
+ { pc: [889], errorMessage: "Asset txn missing" },
405
+ { pc: [1366, 1844, 2135, 2221, 2315, 2357], errorMessage: "Box must have value" },
406
+ { pc: [1122], errorMessage: "Bridge: amount too low for fee" },
407
+ { pc: [1130], errorMessage: "Bridge: bridge to the zero address" },
408
+ { pc: [1504], errorMessage: "Bridge: message processed" },
409
+ { pc: [1547], errorMessage: "Bridge: no message" },
410
+ { pc: [1327, 1455], errorMessage: "Bridge: not enough fee" },
411
+ { pc: [1446], errorMessage: "Bridge: source not registered" },
412
+ { pc: [1217], errorMessage: "Bridge: tokens already sent" },
413
+ { pc: [1180], errorMessage: "Bridge: unknown chain or token" },
414
+ { pc: [1167], errorMessage: "Bridge: wrong destination chain" },
415
+ { pc: [1258, 1412, 1544, 1783, 1830, 2199, 2300, 2401], errorMessage: "Bytes has valid prefix" },
416
+ { pc: [927], errorMessage: "CloseTo not allowed" },
417
+ { pc: [1223], errorMessage: "Index access is out of bounds" },
418
+ {
419
+ pc: [
420
+ 341, 356, 376, 394, 413, 433, 448, 463, 475, 487, 503, 523, 550, 562, 574, 594, 622, 657, 681, 697, 713,
421
+ 731, 749, 767, 799, 831, 840, 856,
422
+ ],
423
+ errorMessage: "OnCompletion is not NoOp",
424
+ },
425
+ { pc: [2411], errorMessage: "Only owner" },
426
+ { pc: [920], errorMessage: "Rekey not allowed" },
427
+ { pc: [2080], errorMessage: "Router: is not stopAuthority" },
428
+ { pc: [2216], errorMessage: "Router: no pool" },
429
+ { pc: [2130], errorMessage: "Router: no receive pool" },
430
+ { pc: [1112, 1436, 1933], errorMessage: "Router: swap prohibited" },
431
+ { pc: [913], errorMessage: "Wrong asset" },
432
+ { pc: [1710], errorMessage: "account opted into asset" },
433
+ { pc: [1266, 2226], errorMessage: "application exists" },
434
+ { pc: [2021], errorMessage: "asset exists" },
435
+ { pc: [860], errorMessage: "can only call when creating" },
436
+ {
437
+ pc: [
438
+ 344, 359, 379, 397, 416, 436, 451, 466, 478, 490, 506, 526, 553, 565, 577, 597, 625, 660, 684, 700, 716,
439
+ 734, 752, 770, 802, 834, 843,
440
+ ],
441
+ errorMessage: "can only call when not creating",
442
+ },
443
+ {
444
+ pc: [
445
+ 1111, 1163, 1185, 1230, 1263, 1270, 1375, 1380, 1435, 1460, 1512, 1678, 1718, 1753, 1790, 1932, 2078, 2147,
446
+ 2252, 2363, 2409,
447
+ ],
448
+ errorMessage: "check GlobalState exists",
449
+ },
450
+ { pc: [1896], errorMessage: "invalid size" },
451
+ { pc: [899], errorMessage: "transaction type is axfer" },
452
+ { pc: [975], errorMessage: "transaction type is pay" },
453
+ ],
454
+ pcOffsetMethod: "none",
455
+ },
456
+ clear: { sourceInfo: [], pcOffsetMethod: "none" },
457
+ },
458
+ source: {
459
+ approval: "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgNCAxNTcwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjYW5Td2FwIiAibWVzc2VuZ2VyIiAib3duZXIiICJnYXNPcmFjbGUiICJjaGFpbklkIiAicmViYWxhbmNlciIgInQiICJwIiAweDAwICJzdG9wQXV0aG9yaXR5IiAweDAxICJnIiAweDQzNDE3YWEzIDB4Zjc0NzViODIgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAzNgogICAgcHVzaGJ5dGVzcyAweGZmZjgyODQxIDB4NjVmNzA1NzMgMHhlODNhODdhYiAweDJjOWY2ODQ3IDB4MzE5MTliMjggMHg0ZWJhMDcyMSAweGM2MTdlZDczIDB4NTc1MzE1NjAgMHg2MzgwODI3OCAweDA2NTA3YzZhIDB4ZjVmOTZlYjMgMHg0YjA2MmNhMCAweGMzY2RkOTJhIC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxieXRlLGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgIm9wdEluQXNzZXQodWludDY0KXZvaWQiLCBtZXRob2QgIm5vb3AoKXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlY2VpdmVUb2tlbnModWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlZ2lzdGVyQnJpZGdlKGJ5dGUsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkQnJpZGdlVG9rZW4oYnl0ZSxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJyZW1vdmVCcmlkZ2VUb2tlbihieXRlLGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3R2FzVG9rZW5zKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnModWludDY0KXZvaWQiLCBtZXRob2QgImdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGJ5dGUsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaGFzaE1lc3NhZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZSxieXRlWzMyXSxieXRlWzMyXSlieXRlWzMyXSIsIG1ldGhvZCAiaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGJ5dGUsYnl0ZVszMl0pYm9vbCIKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgcHVzaGJ5dGVzcyAweDA3ZGY4NDI5IDB4ODBjNWM3MGYgMHhmYWIxMTFhMiAweGVmMTVmODU1IDB4NmIxZWUyMjMgMHgxODcwYTQ5MiAweDM1NTczMjRkIDB4MDRiMTYxZjEgMHhkMmIzNTdlYiAvLyBtZXRob2QgImdldFJlY2VpdmVUb2tlbnNDb3N0KCl1aW50NjQiLCBtZXRob2QgImdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCl1aW50NjQiLCBtZXRob2QgInN3YXAodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRQb29sKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlUG9vbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3RvcFN3YXAoKXZvaWQiLCBtZXRob2QgInN0YXJ0U3dhcCgpdm9pZCIsIG1ldGhvZCAic2V0U3RvcEF1dGhvcml0eShhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldFJlYmFsYW5jZXIoYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIHB1c2hieXRlc3MgMHgwY2E1YWU3YSAweDM5N2I5MThiIDB4Y2JmYzZkMDIgMHhlMTdiYWZiNCAvLyBtZXRob2QgInNldEdhc1VzYWdlKGJ5dGUsdWludDY0KXZvaWQiLCBtZXRob2QgInNldEdhc09yYWNsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGJ5dGUpdWludDY0IiwgbWV0aG9kICJ0cmFuc2Zlck93bmVyc2hpcChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDUgbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDYgbWFpbl9ub29wX3JvdXRlQDcgbWFpbl9zd2FwQW5kQnJpZGdlX3JvdXRlQDggbWFpbl9yZWNlaXZlVG9rZW5zX3JvdXRlQDkgbWFpbl9yZWdpc3RlckJyaWRnZV9yb3V0ZUAxMCBtYWluX2FkZEJyaWRnZVRva2VuX3JvdXRlQDExIG1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTIgbWFpbl93aXRoZHJhd0dhc1Rva2Vuc19yb3V0ZUAxMyBtYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNCBtYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1IG1haW5faGFzaE1lc3NhZ2Vfcm91dGVAMTYgbWFpbl9pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWRfcm91dGVAMTcgbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTggbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOSBtYWluX2dldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0X3JvdXRlQDIwIG1haW5fc3dhcF9yb3V0ZUAyMSBtYWluX2FkZFBvb2xfcm91dGVAMjIgbWFpbl9yZW1vdmVQb29sX3JvdXRlQDIzIG1haW5fc3RvcFN3YXBfcm91dGVAMjQgbWFpbl9zdGFydFN3YXBfcm91dGVAMjUgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDI2IG1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNyBtYWluX2dldEdhc1VzYWdlX3JvdXRlQDI4IG1haW5fc2V0R2FzVXNhZ2Vfcm91dGVAMjkgbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzAgbWFpbl9nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0X3JvdXRlQDMxIG1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzIKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdHJhbnNmZXJPd25lcnNoaXAKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdF9yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0R2FzT3JhY2xlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldEdhc1VzYWdlX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRHYXNVc2FnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRHYXNVc2FnZV9yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjE3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRSZWJhbGFuY2VyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldFN0b3BBdXRob3JpdHlfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFN3YXBfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RhcnRTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0b3BTd2FwX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0b3BTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZVBvb2xfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlUG9vbAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRQb29sX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdF9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxMQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25Db3N0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2lzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBpc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQKICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2hhc2hNZXNzYWdlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI2MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fd2l0aGRyYXdHYXNUb2tlbnNfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgd2l0aGRyYXdHYXNUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkQnJpZGdlVG9rZW5fcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJCcmlkZ2Vfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVnaXN0ZXJCcmlkZ2UKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVjZWl2ZVRva2Vuc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlY2VpdmVUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcEFuZEJyaWRnZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIGNhbGxzdWIgc3dhcEFuZEJyaWRnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBvcHRJbkFzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6Z2V0UHJldkFzc2V0UGF5KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRQcmV2QXNzZXRQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2QXNzZXRQYXkoYXNzZXRJZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM2CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPiAwLCBgQXNzZXQgdHhuIG1pc3NpbmdgKTsKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQgLy8gQXNzZXQgdHhuIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czozOQogICAgLy8gY29uc3QgcHJldklkeDogdWludDY0ID0gVHhuLmdyb3VwSW5kZXggLSAxOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IHBheSA9IGd0eG4uQXNzZXRUcmFuc2ZlclR4bihwcmV2SWR4KTsKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChwYXkuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGBBc3NldCBtdXN0IGdvIHRvIGFwcGApOwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBc3NldCBtdXN0IGdvIHRvIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQocGF5LnhmZXJBc3NldC5pZCA9PT0gYXNzZXRJZCwgYFdyb25nIGFzc2V0YCk7CiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDgKICAgIC8vIGFzc2VydChwYXkucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCBgUmVrZXkgbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFJla2V5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDkKICAgIC8vIGFzc2VydChwYXkuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBDbG9zZVRvIG5vdCBhbGxvd2VkYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIENsb3NlVG8gbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHBheS5hc3NldEFtb3VudDsKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6OmdldFByZXZQYXkocmVsVHhJbmRleDogdWludDY0KSAtPiB1aW50NjQ6CmdldFByZXZQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2UGF5KHJlbFR4SW5kZXg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTQKICAgIC8vIGlmIChUeG4uZ3JvdXBJbmRleCA8IHJlbFR4SW5kZXgpIHJldHVybiAwOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHR4SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIHJlbFR4SW5kZXg7CiAgICB0eG4gR3JvdXBJbmRleAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU4CiAgICAvLyBpZiAoZ3R4bi5UcmFuc2FjdGlvbih0eElkeCkudHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpIHJldHVybiAwOwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCBwYXkgPSBndHhuLlBheW1lbnRUeG4odHhJZHgpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo2MQogICAgLy8gaWYgKHBheS5yZWNlaXZlciAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHJldHVybiAwOwogICAgZnJhbWVfZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjYzCiAgICAvLyBpZiAocGF5LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDgKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NjQKICAgIC8vIGlmIChwYXkuY2xvc2VSZW1haW5kZXJUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gMDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBnZXRQcmV2UGF5X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjY2CiAgICAvLyByZXR1cm4gcGF5LmFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgY2hhaW5JZDogYnl0ZXMsIG1lc3NlbmdlcjogdWludDY0LCBnYXNPcmFjbGU6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNAogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyB0aGlzLmNoYWluSWQudmFsdWUgPSBjaGFpbklkOwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyB0aGlzLm1lc3Nlbmdlci52YWx1ZSA9IG1lc3NlbmdlcjsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5vcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0SW5Bc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIG9wdEluQXNzZXQoYXNzZXRJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KGFzc2V0SWQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIGxvZygnQnJpZGdlOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIkJyaWRnZTogb3B0LWluIGNvbXBsZXRlZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnN3YXBBbmRCcmlkZ2UodG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIGZlZVRva2VuQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkzLTEwNQogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIC8vIHN3YXBBbmRCcmlkZ2UoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGZlZVRva2VuQW1vdW50OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTYKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyBhc3NlcnQoYW1vdW50ID4gZmVlVG9rZW5BbW91bnQsICdCcmlkZ2U6IGFtb3VudCB0b28gbG93IGZvciBmZWUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEJyaWRnZTogYW1vdW50IHRvbyBsb3cgZm9yIGZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCghcmVjaXBpZW50LmJ5dGVzLmVxdWFscyhiemVybygzMikpLCAnQnJpZGdlOiBicmlkZ2UgdG8gdGhlIHplcm8gYWRkcmVzcycpOwogICAgcHVzaGludCAzMiAvLyAzMgogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IGJyaWRnZSB0byB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gY29uc3QgYnJpZGdpbmdGZWU6IHVpbnQ2NCA9IGdldFByZXZQYXkoMikgKyB0aGlzLl9jb252ZXJ0QnJpZGdpbmdGZWVJblRva2Vuc1RvTmF0aXZlVG9rZW4odG9rZW5JZCwgZmVlVG9rZW5BbW91bnQpOwogICAgcHVzaGludCAyIC8vIDIKICAgIGNhbGxzdWIgZ2V0UHJldlBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIGlmIChmZWVUb2tlbkFtb3VudCA9PT0gMCkgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBzd2FwQW5kQnJpZGdlX2FmdGVyX2lmX2Vsc2VAMwogICAgaW50Y18wIC8vIDAKCnN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIGNvbnN0IGJyaWRnaW5nRmVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDIpICsgdGhpcy5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuKHRva2VuSWQsIGZlZVRva2VuQW1vdW50KTsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgYW1vdW50QWZ0ZXJGZWU6IHVpbnQ2NCA9IGFtb3VudCAtIGZlZVRva2VuQW1vdW50OwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGNvbnN0IHZVc2RBbW91bnQgPSB0aGlzLnNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQsIHNlbmRlciwgYW1vdW50QWZ0ZXJGZWUpOwogICAgZnJhbWVfZGlnIC02CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnRBZnRlckZlZSk7CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc2VuZEFuZFN3YXBUb1ZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGFzc2VydChkZXN0aW5hdGlvbkNoYWluSWQgIT09IHRoaXMuY2hhaW5JZC52YWx1ZSwgJ0JyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4nKTsKICAgIGZyYW1lX2RpZyAtNAogICAgIT0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IHdyb25nIGRlc3RpbmF0aW9uIGNoYWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gcmV0dXJuIGNoYWluSWQuYnl0ZXMuY29uY2F0KHRva2VuLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG90aGVyQnJpZGdlVG9rZW5zID0gQm94TWFwPGJ5dGVzLCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICd0JyB9KTsKICAgIGJ5dGVjIDcgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBhc3NlcnQodGhpcy5vdGhlckJyaWRnZVRva2Vucyh0aGlzLl9nZXRPdGhlckJyaWRnZVRva2Vuc0tleShkZXN0aW5hdGlvbkNoYWluSWQsIHJlY2VpdmVUb2tlbikpLmV4aXN0cywgJ0JyaWRnZTogdW5rbm93biBjaGFpbiBvciB0b2tlbicpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQnJpZGdlOiB1bmtub3duIGNoYWluIG9yIHRva2VuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgdGhpcy5jaGFpbklkLnZhbHVlLCBkZXN0aW5hdGlvbkNoYWluSWQsIHJlY2VpdmVUb2tlbiwgbm9uY2UpOwogICAgZGlnIDEKICAgIGZyYW1lX2RpZyAtNQogICAgdW5jb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gY29uc3QgYnJpZGdlVHJhbnNhY3Rpb25Db3N0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkNvc3QoZGVzdGluYXRpb25DaGFpbklkKTsKICAgIGZyYW1lX2RpZyAtNAogICAgY2FsbHN1YiBnZXRUcmFuc2FjdGlvbkNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjEKICAgIC8vIHNlbnRNZXNzYWdlcyA9IEJveE1hcDxTdGF0aWNCeXRlczwzMj4sIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3MnIH0pOwogICAgcHVzaGJ5dGVzICJzIgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGFzc2VydCghdGhpcy5zZW50TWVzc2FnZXMobWVzc2FnZSkuZXhpc3RzLCAnQnJpZGdlOiB0b2tlbnMgYWxyZWFkeSBzZW50Jyk7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEJyaWRnZTogdG9rZW5zIGFscmVhZHkgc2VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIHRoaXMuc2VudE1lc3NhZ2VzKG1lc3NhZ2UpLnZhbHVlID0gbmV3IFN0YXRpY0J5dGVzKCk7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyBjb25zdCBkZXN0aW5hdGlvbkNoYWluSWQgPSBtZXNzYWdlLmF0KDEpOwogICAgZGlnIDEKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTMtMTU2CiAgICAvLyBjb25zdCBtZXNzYWdlQ29zdCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkNvc3QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUzLTE1NgogICAgLy8gY29uc3QgbWVzc2FnZUNvc3QgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25Db3N0LCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyByZWNlaXZlcjogdGhpcy5tZXNzZW5nZXIudmFsdWUuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIm1lc3NlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50UGFyYW1zLCBhcHBDYWxsUGFyYW1zKTsKICAgIGl0eG5fYmVnaW4KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTgtMTYxCiAgICAvLyBjb25zdCBwYXltZW50UGFyYW1zID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBtZXNzYWdlQ29zdCwKICAgIC8vICAgcmVjZWl2ZXI6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmFkZHJlc3MsCiAgICAvLyB9KTsKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRQYXJhbXMsIGFwcENhbGxQYXJhbXMpOwogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gYXJjNC5tZXRob2RTZWxlY3Rvcignc2VuZE1lc3NhZ2UoYnl0ZVszMl0pdm9pZCcpLAogICAgcHVzaGJ5dGVzIDB4YTMyNDk5ODkgLy8gbWV0aG9kICJzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNjMtMTY5CiAgICAvLyBjb25zdCBhcHBDYWxsUGFyYW1zID0gaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkJyksCiAgICAvLyAgICAgbWVzc2FnZSwKICAgIC8vICAgXSwKICAgIC8vIH0pOwogICAgaW50Y18yIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudFBhcmFtcywgYXBwQ2FsbFBhcmFtcyk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIGVtaXQ8UmVjZWl2ZUZlZT4oeyBicmlkZ2VUcmFuc2FjdGlvbkNvc3QsIG1lc3NhZ2VUcmFuc2FjdGlvbkNvc3QgfSk7CiAgICBkaWcgMQogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NGI1NTQxOWIgLy8gbWV0aG9kICJSZWNlaXZlRmVlKHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBhc3NlcnQoYnJpZGdpbmdGZWUgPj0gYnJpZGdlVHJhbnNhY3Rpb25Db3N0ICsgbWVzc2FnZVRyYW5zYWN0aW9uQ29zdCwgJ0JyaWRnZTogbm90IGVub3VnaCBmZWUnKTsKICAgICsKICAgIHVuY292ZXIgMgogICAgPD0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzNQogICAgLy8gYW1vdW50LAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzQtMTQxCiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IEFMTEJSSURHRV9NRVNTRU5HRVIgPSBuZXcgQnl0ZSgxKTsKICAgIGJ5dGVjIDExIC8vIDB4MDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM0LTE0MQogICAgLy8gZW1pdDxUb2tlbnNTZW50Pih7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBkZXN0aW5hdGlvbkNoYWluSWQsCiAgICAvLyAgICAgcmVjZWl2ZVRva2VuLAogICAgLy8gICAgIG5vbmNlLAogICAgLy8gICAgIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwKICAgIC8vICAgfSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzQtMTQyCiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDIyOWZiYWVjIC8vIG1ldGhvZCAiVG9rZW5zU2VudCh1aW50NjQsYnl0ZVszMl0sYnl0ZSxieXRlWzMyXSxieXRlWzMyXSxieXRlKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCnN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzkKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIGZyYW1lX2RpZyAtNgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozNgogICAgLy8gcHJvdGVjdGVkIGJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZicgfSk7CiAgICBwdXNoYnl0ZXMgImYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBjb25zdCBmZWU6IHVpbnQ2NCA9IHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZSAqIGZlZVRva2VuQW1vdW50IC8gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFByaWNlLCB7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnYXNPcmFjbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2hhaW5JZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4MWRiNzBjZGQgLy8gbWV0aG9kICJnZXRQcmljZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBlbWl0PEJyaWRnaW5nRmVlRnJvbVRva2Vucz4oeyBmZWUgfSk7CiAgICBkdXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweGUwN2Y2YjM2IC8vIG1ldGhvZCAiQnJpZGdpbmdGZWVGcm9tVG9rZW5zKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIGNvbnN0IGJyaWRnaW5nRmVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDIpICsgdGhpcy5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuKHRva2VuSWQsIGZlZVRva2VuQW1vdW50KTsKICAgIGIgc3dhcEFuZEJyaWRnZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuQDUKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVjZWl2ZVRva2VucyhhbW91bnQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgc291cmNlQ2hhaW5JZDogYnl0ZXMsIHJlY2VpdmVUb2tlbjogYnl0ZXMsIG5vbmNlOiBieXRlcywgcmVjZWl2ZUFtb3VudE1pbjogdWludDY0KSAtPiB2b2lkOgpyZWNlaXZlVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQtMTgyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlY2VpdmVUb2tlbnMoCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IFN0YXRpY0J5dGVzPDMyPiwKICAgIC8vICAgc291cmNlQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGFzc2VydCAvLyBSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MwogICAgLy8gb3RoZXJCcmlkZ2VzID0gQm94TWFwPEJ5dGUsIFN0YXRpY0J5dGVzPDMyPj4oeyBrZXlQcmVmaXg6ICdiJyB9KTsKICAgIHB1c2hieXRlcyAiYiIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gYXNzZXJ0KHRoaXMub3RoZXJCcmlkZ2VzKHNvdXJjZUNoYWluSWQpLmV4aXN0cywgJ0JyaWRnZTogc291cmNlIG5vdCByZWdpc3RlcmVkJyk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHNvdXJjZSBub3QgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIGNvbnN0IHZhbHVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDEpOwogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZ2V0UHJldlBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIGFzc2VydCh2YWx1ZSA+PSBzdG9yYWdlRmVlLCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE4NwogICAgLy8gYXNzZXJ0KHZhbHVlID49IHN0b3JhZ2VGZWUsICdCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm90IGVub3VnaCBmZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmhhc2hNZXNzYWdlKGFtb3VudCwgcmVjaXBpZW50LCBzb3VyY2VDaGFpbklkLCB0aGlzLmNoYWluSWQudmFsdWUsIHJlY2VpdmVUb2tlbiwgbm9uY2UpOwogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBoYXNoTWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgwCiAgICAvLyBjb25zdCBoOiBieXRlcyA9IG9wLmtlY2NhazI1NihvcC5jb25jYXQobWVzc2FnZS5ieXRlcywgc2VuZGVyQWRkcmVzcykpOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gY29uc3QgbWVzc2FnZVdpdGhTZW5kZXIgPSBoYXNoV2l0aFNlbmRlckFkZHJlc3MobWVzc2FnZSwgVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6ODAKICAgIC8vIGNvbnN0IGg6IGJ5dGVzID0gb3Aua2VjY2FrMjU2KG9wLmNvbmNhdChtZXNzYWdlLmJ5dGVzLCBzZW5kZXJBZGRyZXNzKSk7CiAgICBjb25jYXQKICAgIGtlY2NhazI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgzCiAgICAvLyBjb25zdCBmaXJzdDIgPSBvcC5zdWJzdHJpbmcobWVzc2FnZS5ieXRlcywgMCwgMik7CiAgICBzd2FwCiAgICBzdWJzdHJpbmcgMCAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6ODUKICAgIC8vIGNvbnN0IGxhc3QzMCA9IG9wLnN1YnN0cmluZyhoLCAyLCAzMik7CiAgICBzd2FwCiAgICBzdWJzdHJpbmcgMiAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDMyPihvcC5jb25jYXQoZmlyc3QyLCBsYXN0MzApKTsKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBwcm9jZXNzZWRNZXNzYWdlcyA9IEJveE1hcDxTdGF0aWNCeXRlczwzMj4sIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ20nIH0pOwogICAgcHVzaGJ5dGVzICJtIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGFzc2VydCghdGhpcy5wcm9jZXNzZWRNZXNzYWdlcyhtZXNzYWdlV2l0aFNlbmRlcikuZXhpc3RzLCAnQnJpZGdlOiBtZXNzYWdlIHByb2Nlc3NlZCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IG1lc3NhZ2UgcHJvY2Vzc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5wcm9jZXNzZWRNZXNzYWdlcyhtZXNzYWdlV2l0aFNlbmRlcikudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTctMjAwCiAgICAvLyBhc3NlcnQoYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbbWVzc2FnZVdpdGhTZW5kZXJdLAogICAgLy8gfSkucmV0dXJuVmFsdWUsICdCcmlkZ2U6IG5vIG1lc3NhZ2UnKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIm1lc3NlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5Ny0yMDAKICAgIC8vIGFzc2VydChhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUucmVjZWl2ZWRNZXNzYWdlcywgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFttZXNzYWdlV2l0aFNlbmRlcl0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSwgJ0JyaWRnZTogbm8gbWVzc2FnZScpOwogICAgcHVzaGJ5dGVzIDB4MzNlMTQ3YWEgLy8gbWV0aG9kICJyZWNlaXZlZE1lc3NhZ2VzKGJ5dGVbMzJdKWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gQnJpZGdlOiBubyBtZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gY29uc3QgdG9rZW5JZDogdWludDY0ID0gb3AuZXh0cmFjdFVpbnQ2NChyZWNlaXZlVG9rZW4uYnl0ZXMsIDI0KTsKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjA0LTIwOQogICAgLy8gY29uc3QgcmVjZWl2ZUFtb3VudCA9IHRoaXMucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCgKICAgIC8vICAgdG9rZW5JZCwKICAgIC8vICAgcmVjaXBpZW50QWRkcmVzcywKICAgIC8vICAgYW1vdW50LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluLAogICAgLy8gKTsKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIGNvbnN0IGV4dHJhR2FzOiB1aW50NjQgPSB2YWx1ZSAtIHN0b3JhZ2VGZWU7CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBjb25zdCBleHRyYUdhczogdWludDY0ID0gdmFsdWUgLSBzdG9yYWdlRmVlOwogICAgLQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGlmICh2YWx1ZSA+IHN0b3JhZ2VGZWUpIHsKICAgID4KICAgIGJ6IHJlY2VpdmVUb2tlbnNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNC0yMTcKICAgIC8vIHBheW1lbnQoewogICAgLy8gICBhbW91bnQ6IGV4dHJhR2FzLAogICAgLy8gICByZWNlaXZlcjogcmVjaXBpZW50QWRkcmVzcy5ieXRlcywKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC01CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CgpyZWNlaXZlVG9rZW5zX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBlbWl0PFRva2Vuc1JlY2VpdmVkPih7IHJlY2VpdmVBbW91bnQsIHJlY2lwaWVudDogcmVjaXBpZW50QWRkcmVzcywgbm9uY2UsIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwgbWVzc2FnZTogbWVzc2FnZVdpdGhTZW5kZXIgfSk7CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCBBTExCUklER0VfTUVTU0VOR0VSID0gbmV3IEJ5dGUoMSk7CiAgICBieXRlYyAxMSAvLyAweDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxOQogICAgLy8gZW1pdDxUb2tlbnNSZWNlaXZlZD4oeyByZWNlaXZlQW1vdW50LCByZWNpcGllbnQ6IHJlY2lwaWVudEFkZHJlc3MsIG5vbmNlLCBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsIG1lc3NhZ2U6IG1lc3NhZ2VXaXRoU2VuZGVyIH0pOwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0NTgzNmFkNiAvLyBtZXRob2QgIlRva2Vuc1JlY2VpdmVkKHVpbnQ2NCxhZGRyZXNzLGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0pIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5yZWdpc3RlckJyaWRnZShjaGFpbklkOiBieXRlcywgYnJpZGdlQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CnJlZ2lzdGVyQnJpZGdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjItMjIzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlZ2lzdGVyQnJpZGdlKGNoYWluSWQ6IEJ5dGUsIGJyaWRnZUFkZHJlc3M6IFN0YXRpY0J5dGVzPDMyPik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjYzCiAgICAvLyBvdGhlckJyaWRnZXMgPSBCb3hNYXA8Qnl0ZSwgU3RhdGljQnl0ZXM8MzI+Pih7IGtleVByZWZpeDogJ2InIH0pOwogICAgcHVzaGJ5dGVzICJiIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyB0aGlzLm90aGVyQnJpZGdlcyhjaGFpbklkKS52YWx1ZSA9IGJyaWRnZUFkZHJlc3M7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5hZGRCcmlkZ2VUb2tlbihjaGFpbklkOiBieXRlcywgdG9rZW5BZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKYWRkQnJpZGdlVG9rZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOC0yMjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gYWRkQnJpZGdlVG9rZW4oY2hhaW5JZDogQnl0ZSwgdG9rZW5BZGRyZXNzOiBTdGF0aWNCeXRlczwzMj4pOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzAKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHJldHVybiBjaGFpbklkLmJ5dGVzLmNvbmNhdCh0b2tlbi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBvdGhlckJyaWRnZVRva2VucyA9IEJveE1hcDxieXRlcywgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAndCcgfSk7CiAgICBieXRlYyA3IC8vICJ0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gdGhpcy5vdGhlckJyaWRnZVRva2Vucyh0aGlzLl9nZXRPdGhlckJyaWRnZVRva2Vuc0tleShjaGFpbklkLCB0b2tlbkFkZHJlc3MpKS52YWx1ZSA9IG5ldyBTdGF0aWNCeXRlcygpOwogICAgcHVzaGJ5dGVzIDB4CiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVtb3ZlQnJpZGdlVG9rZW4oY2hhaW5JZDogYnl0ZXMsIHRva2VuQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZUJyaWRnZVRva2VuOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzQtMjM1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlbW92ZUJyaWRnZVRva2VuKGNoYWluSWQ6IEJ5dGUsIHRva2VuQWRkcmVzczogU3RhdGljQnl0ZXM8MzI+KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzcKICAgIC8vIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW5BZGRyZXNzKSkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS53aXRoZHJhd0dhc1Rva2VucyhhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKd2l0aGRyYXdHYXNUb2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MC0yNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXdHYXNUb2tlbnMoYW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDMKICAgIC8vIHBheW1lbnQoeyBhbW91bnQ6IGFtb3VudCwgcmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBwYXltZW50KHsgYW1vdW50OiBhbW91bnQsIHJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzIH0pLnN1Ym1pdCgpOwogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS53aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMoYXNzZXRJZDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0Ni0yNDcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zKGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1MAogICAgLy8gY29uc3QgYXBwQWNjdDogQWNjb3VudCA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzOwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIGNvbnN0IGJhbGFuY2UgPSBhc3NldC5iYWxhbmNlKGFwcEFjY3QpOwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1MgogICAgLy8gaWYgKGJhbGFuY2UgPiBVaW50NjQoMCkpIHsKICAgIGJ6IHdpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUzLTI1OAogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlcjogYXBwQWNjdCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUzLTI1OAogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlcjogYXBwQWNjdCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCndpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuZ2V0QnJpZGdpbmdDb3N0SW5Ub2tlbnMoZGVzdGluYXRpb25DaGFpbklkOiBieXRlcywgdG9rZW5JZDogdWludDY0KSAtPiB1aW50NjQ6CmdldEJyaWRnaW5nQ29zdEluVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjItMjY2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zKAogICAgLy8gICBkZXN0aW5hdGlvbkNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBjb25zdCBicmlkZ2VHYXNBbW91bnQ6IHVpbnQ2NCA9IHRoaXMuZ2V0R2FzVXNhZ2UoZGVzdGluYXRpb25DaGFpbklkKTsKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBnZXRHYXNVc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjgtMjcxCiAgICAvLyBjb25zdCBtZXNzZW5nZXJHYXNBbW91bnQ6IHVpbnQ2NCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRHYXNVc2FnZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjgtMjcxCiAgICAvLyBjb25zdCBtZXNzZW5nZXJHYXNBbW91bnQ6IHVpbnQ2NCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRHYXNVc2FnZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBieXRlYyAxNCAvLyBtZXRob2QgImdldEdhc1VzYWdlKGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3My0yNzYKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnYXNPcmFjbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWQsIGJyaWRnZUdhc0Ftb3VudCArIG1lc3Nlbmdlckdhc0Ftb3VudF0sCiAgICBjb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3My0yNzYKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgcHVzaGJ5dGVzIDB4N2JmN2Q1MGMgLy8gbWV0aG9kICJnZXRUcmFuc2FjdGlvbkdhc0Nvc3RJblVTRChieXRlLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMzCiAgICAvLyBwcm90ZWN0ZWQgZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZScgfSk7CiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzMtMjc2CiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIC8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5oYXNoTWVzc2FnZShhbW91bnQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgc291cmNlQ2hhaW5JZDogYnl0ZXMsIGRlc3RpbmF0aW9uQ2hhaW5JZDogYnl0ZXMsIHJlY2VpdmVUb2tlbjogYnl0ZXMsIG5vbmNlOiBieXRlcykgLT4gYnl0ZXM6Cmhhc2hNZXNzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzktMjg3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGhhc2hNZXNzYWdlKAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHNvdXJjZUNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyApOiBTdGF0aWNCeXRlczwzMj4gewogICAgcHJvdG8gNiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gY29uc3QgYW1vdW50MzIgPSBiemVybygyNCkuY29uY2F0KG9wLml0b2IoYW1vdW50KSk7CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBiemVybwogICAgZnJhbWVfZGlnIC02CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyBjb25zdCBzb3VyY2VDaGFpbklkMzIgPSBiemVybygzMSkuY29uY2F0KHNvdXJjZUNoYWluSWQuYnl0ZXMpOwogICAgcHVzaGludCAzMSAvLyAzMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MC0yOTEKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgc3dhcAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjkwLTI5MgogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MC0yOTMKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIC8vICAgLmNvbmNhdChyZWNlaXZlVG9rZW4uYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTAtMjk0CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgLy8gICAuY29uY2F0KG5vbmNlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IEFMTEJSSURHRV9NRVNTRU5HRVIgPSBuZXcgQnl0ZSgxKTsKICAgIGJ5dGVjIDExIC8vIDB4MDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjkwLTI5NQogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgLy8gICAuY29uY2F0KHJlY2VpdmVUb2tlbi5ieXRlcykKICAgIC8vICAgLmNvbmNhdChub25jZS5ieXRlcykKICAgIC8vICAgLmNvbmNhdChBTExCUklER0VfTUVTU0VOR0VSLmJ5dGVzKTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGNvbnN0IGhhc2ggPSBvcC5rZWNjYWsyNTYocGFja2VkKTsgLy8gMzIgYnl0ZXMKICAgIGtlY2NhazI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDAKICAgIC8vIGNvbnN0IHdpdGhTcmMgPSBvcC5zZXRCeXRlKGhhc2gsIDAsIG9wLmJ0b2koc291cmNlQ2hhaW5JZC5ieXRlcykpOwogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc2V0Ynl0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIGNvbnN0IHdpdGhEc3QgPSBvcC5zZXRCeXRlKHdpdGhTcmMsIDEsIG9wLmJ0b2koZGVzdGluYXRpb25DaGFpbklkLmJ5dGVzKSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICBzd2FwCiAgICBzZXRieXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwMwogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4od2l0aERzdCk7CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHNpemUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQoY2hhaW5JZDogYnl0ZXMsIHRva2VuOiBieXRlcykgLT4gdWludDY0Ogppc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwNi0zMDcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGNoYWluSWQ6IEJ5dGUsIHRva2VuOiBTdGF0aWNCeXRlczwzMj4pOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHJldHVybiBjaGFpbklkLmJ5dGVzLmNvbmNhdCh0b2tlbi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBvdGhlckJyaWRnZVRva2VucyA9IEJveE1hcDxieXRlcywgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAndCcgfSk7CiAgICBieXRlYyA3IC8vICJ0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gcmV0dXJuIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW4pKS5leGlzdHM7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5nZXRUcmFuc2FjdGlvbkNvc3QoY2hhaW5JZDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0VHJhbnNhY3Rpb25Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTEtMzEyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldFRyYW5zYWN0aW9uQ29zdChjaGFpbklkOiBCeXRlKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICArCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc3dhcCh0b2tlbklkOiB1aW50NjQsIHJlY2VpdmVUb2tlbklkOiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCkgLT4gdm9pZDoKc3dhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgtODQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc3dhcCgKICAgIC8vICAgdG9rZW5JZDogdWludDY0LAogICAgLy8gICByZWNlaXZlVG9rZW5JZDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IEFkZHJlc3MsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGFzc2VydCAvLyBSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4NgogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjg3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjg4CiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkLCBzZW5kZXIsIGFtb3VudCk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGRpZyAyCiAgICBkaWcgMgogICAgY2FsbHN1YiBzZW5kQW5kU3dhcFRvVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4OQogICAgLy8gY29uc3QgcmVjZWl2ZWRBbW91bnQgPSB0aGlzLnJlY2VpdmVBbmRTd2FwRnJvbVZVc2QocmVjZWl2ZVRva2VuSWQsIHJlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbik7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo5MAogICAgLy8gZW1pdDxTd2FwcGVkPih7IHNlbmRlciwgcmVjaXBpZW50LCB0b2tlbklkLCByZWNlaXZlVG9rZW5JZCwgYW1vdW50LCByZWNlaXZlZEFtb3VudCB9KTsKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTQwNDRiMyAvLyBtZXRob2QgIlN3YXBwZWQoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLmFkZFBvb2wocG9vbElkOiB1aW50NjQsIHRva2VuSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAwLTEwMQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBhZGRQb29sKHBvb2xJZDogdWludDY0LCB0b2tlbklkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkudmFsdWUgPSBwb29sSWQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAzCiAgICAvLyB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlID0gcG9vbElkOwogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNQogICAgLy8gY29uc3QgdG9rZW5EZWNpbWFscyA9IGFzc2V0LmRlY2ltYWxzOwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLW9yYWNsZS5jb250cmFjdC5hbGdvLnRzOjgKICAgIC8vIGV4cG9ydCBjb25zdCBPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OOiB1aW50NjQgPSA5OwogICAgcHVzaGludCA5IC8vIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA2CiAgICAvLyB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMgKyBDSEFJTl9QUkVDSVNJT04pOwogICAgc3dhcAogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy1vcmFjbGUuY29udHJhY3QuYWxnby50czo3CiAgICAvLyBleHBvcnQgY29uc3QgQ0hBSU5fUFJFQ0lTSU9OOiB1aW50NjQgPSA2OwogICAgaW50Y18yIC8vIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA2CiAgICAvLyB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMgKyBDSEFJTl9QUkVDSVNJT04pOwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozNgogICAgLy8gcHJvdGVjdGVkIGJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZicgfSk7CiAgICBwdXNoYnl0ZXMgImYiCiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHVuY292ZXIgMgogICAgZXhwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMzCiAgICAvLyBwcm90ZWN0ZWQgZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZScgfSk7CiAgICBwdXNoYnl0ZXMgImUiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDcKICAgIC8vIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMpOwogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBleHAKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5yZW1vdmVQb29sKHRva2VuSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwLTExMQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZW1vdmVQb29sKHRva2VuSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMgogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS5kZWxldGUoKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMQogICAgLy8gcG9vbHMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlYyA4IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN0b3BTd2FwKCkgLT4gdm9pZDoKc3RvcFN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlLmJ5dGVzLCAnUm91dGVyOiBpcyBub3Qgc3RvcEF1dGhvcml0eScpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozOQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInN0b3BBdXRob3JpdHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2OAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1JvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHknKTsKICAgID09CiAgICBhc3NlcnQgLy8gUm91dGVyOiBpcyBub3Qgc3RvcEF1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTIyCiAgICAvLyB0aGlzLmNhblN3YXAudmFsdWUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN0YXJ0U3dhcCgpIC0+IHZvaWQ6CnN0YXJ0U3dhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzMQogICAgLy8gdGhpcy5jYW5Td2FwLnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogYnl0ZXMpIC0+IHZvaWQ6CnNldFN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNy0xMzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0U3RvcEF1dGhvcml0eShzdG9wQXV0aG9yaXR5OiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM5CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzkKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgMTAgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0MAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gc3RvcEF1dGhvcml0eTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zZXRSZWJhbGFuY2VyKHJlYmFsYW5jZXI6IGJ5dGVzKSAtPiB2b2lkOgpzZXRSZWJhbGFuY2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYtMTQ3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldFJlYmFsYW5jZXIocmViYWxhbmNlcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0OQogICAgLy8gdGhpcy5yZWJhbGFuY2VyLnZhbHVlID0gcmViYWxhbmNlcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5yZWNlaXZlQW5kU3dhcEZyb21WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgdlVzZEFtb3VudDogdWludDY0LCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQpIC0+IHVpbnQ2NDoKcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTUyLTE1NwogICAgLy8gcHJvdGVjdGVkIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBZGRyZXNzLAogICAgLy8gICB2VXNkQW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNTkKICAgIC8vIGNvbnN0IHBvb2xJZCA9IHRoaXMucG9vbHModG9rZW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjAtMTYzCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwRnJvbVZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2MgogICAgLy8gYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjIKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2MC0xNjMKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBGcm9tVlVzZCwgewogICAgLy8gICBhcHBJZDogcG9vbElkLAogICAgLy8gICBhcmdzOiBbcmVjaXBpZW50LCB2VXNkQW1vdW50LCByZWNlaXZlQW1vdW50TWluLCByZWNpcGllbnQgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweDBkMWI0YzA2IC8vIG1ldGhvZCAic3dhcEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZDogdWludDY0LCB1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKc2VuZEFuZFN3YXBUb1ZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2NwogICAgLy8gcHJvdGVjdGVkIHNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgdXNlcjogQWRkcmVzcywgYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyBwb29sJyk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjgKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKHRva2VuSWQpLmV4aXN0cywgJ1JvdXRlcjogbm8gcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTY5CiAgICAvLyBjb25zdCBwb29sSWQgPSB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTcxLTE3NgogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0b2tlbklkLAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3NAogICAgLy8gYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzEtMTc1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRva2VuSWQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3MS0xNzYKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdG9rZW5JZCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgLy8gfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTc4LTE4MQogICAgLy8gcmV0dXJuIGFiaUNhbGwoUG9vbC5wcm90b3R5cGUuc3dhcFRvVlVzZCwgewogICAgLy8gICBhcHBJZDogcG9vbElkLAogICAgLy8gICBhcmdzOiBbdXNlciwgYW1vdW50LCB1c2VyID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4MAogICAgLy8gYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSByZWJhbGFuY2VyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKGJ6ZXJvKDApKSB9KTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAicmViYWxhbmNlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4MAogICAgLy8gYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3OC0xODEKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBUb1ZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4ZDk3OGFkMTQgLy8gbWV0aG9kICJzd2FwVG9WVXNkKGFkZHJlc3MsdWludDY0LGJvb2wpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLmdldEdhc1VzYWdlKGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldEdhc1VzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNy0xOAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRHYXNVc2FnZShjaGFpbklkOiBCeXRlKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxMAogICAgLy8gZ2FzVXNhZ2UgPSBCb3hNYXA8Qnl0ZSwgdWludDY0Pih7IGtleVByZWZpeDogJ2cnIH0pOwogICAgYnl0ZWMgMTIgLy8gImciCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxOQogICAgLy8gcmV0dXJuIHRoaXMuZ2FzVXNhZ2UoY2hhaW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2Uuc2V0R2FzVXNhZ2UoY2hhaW5JZDogYnl0ZXMsIGdhc0Ftb3VudDogdWludDY0KSAtPiB2b2lkOgpzZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjItMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0R2FzVXNhZ2UoY2hhaW5JZDogQnl0ZSwgZ2FzQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjEwCiAgICAvLyBnYXNVc2FnZSA9IEJveE1hcDxCeXRlLCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZycgfSk7CiAgICBieXRlYyAxMiAvLyAiZyIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI1CiAgICAvLyB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlID0gZ2FzQW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5zZXRHYXNPcmFjbGUoZ2FzT3JhY2xlOiB1aW50NjQpIC0+IHZvaWQ6CnNldEdhc09yYWNsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjgtMjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0R2FzT3JhY2xlKGdhc09yYWNsZTogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozMAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozMQogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0LTM1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdnJyB9KTsKICAgIGJ5dGVjIDEyIC8vICJnIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzYKICAgIC8vIGNvbnN0IGdhc0Ftb3VudCA9IHRoaXMuZ2FzVXNhZ2UoY2hhaW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNy00MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJbk5hdGl2ZVRva2VuLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2NoYWluSWQsIGdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6OQogICAgLy8gZ2FzT3JhY2xlID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzkKICAgIC8vIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNy00MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJbk5hdGl2ZVRva2VuLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2NoYWluSWQsIGdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGMyYWZjY2QxIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbihieXRlLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5vd25lci52YWx1ZS5ieXRlcywgJ09ubHkgb3duZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBvd25lcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUudHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IGJ5dGVzKSAtPiB2b2lkOgp0cmFuc2Zlck93bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB0cmFuc2Zlck93bmVyc2hpcChuZXdPd25lcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG5ld093bmVyOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==",
460
+ clear: "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==",
461
+ },
462
+ byteCode: {
463
+ approval: "CiAFAAEGBNR6JhAEFR98dQdjYW5Td2FwCW1lc3NlbmdlcgVvd25lcglnYXNPcmFjbGUHY2hhaW5JZApyZWJhbGFuY2VyAXQBcAEADXN0b3BBdXRob3JpdHkBAQFnBENBeqME90dbggwVH3x1AAAAAAAAPVQxGEAACSKvJwZMZykjZzEbQQDJgg0E//goQQRl9wVzBOg6h6sELJ9oRwQxkZsoBE66ByEExhftcwRXUxVgBGOAgngEBlB8agT1+W6zBEsGLKAEw83ZKicNggkEB9+EKQSAxccPBPqxEaIE7xX4VQRrHuIjBBhwpJIENVcyTQQEsWHxBNKzV+snDoIEBAylrnoEOXuRiwTL/G0CBOF7r7Q2GgCOHAIFAfUB7AHMAawBmgGIAXYBZgFWAT4BGwD/AOsA3wDTALgApACUAIgAfABtAF4ASgA3ACUAEQACIkMxGRREMRhENhoBiAgOI0MxGRREMRhENhoBiAe7FihMULAjQzEZFEQxGEQ2GgEXwDKIB5gjQzEZFEQxGEQ2GgE2GgIXiAd1I0MxGRREMRhENhoBiAdYFihMULAjQzEZFEQxGEQ2GgGIBn0jQzEZFEQxGEQ2GgGIBmIjQzEZFEQxGESIBk8jQzEZFEQxGESIBjYjQzEZFEQxGEQ2GgEXiAYWI0MxGRREMRhENhoBFzYaAheIBckjQzEZFEQxGEQ2GgEXNhoCFzYaAzYaBBeIBWUjQzEZFEQxGEQnD7AjQzEZFEQxGEQnD7AjQzEZFEQxGEQ2GgGIBTIWKExQsCNDMRkURDEYRDYaATYaAogFCycJIk8CVChMULAjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGiASvKExQsCNDMRkURDEYRDYaATYaAheIBC4WKExQsCNDMRkURDEYRDYaAReIA+kjQzEZFEQxGEQ2GgEXiAPAI0MxGRREMRhENhoBNhoCiAOcI0MxGRREMRhENhoBNhoCiAN3I0MxGRREMRhENhoBNhoCiANVI0MxGRREMRhENhoBFzYaAjYaAzYaBDYaBTYaBheIAnsjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGF4gBFyNDMRkURDEYRCNDMRkURDEYRDYaAReIAMkjQzEZFEQxGBRENhoBNhoCNhoDF8AyNhoEF8AyiACPI0OKAQExFkQxFiMJSTgQJRJESTgUMgoSREk4EYv/EkRJOCAyAxJESTgVMgMSRDgSiYoBAYAASTEWi/8MQQAEIowAiTEWi/8JSYwBOBBJjAAjE0EABCKMAImLACMSRIsBOAcyChNBAAQijACJiwE4IDIDE0EABCKMAImLATgJMgMTQQAEIowAiYsBOAiMAImKBAAri/xnJwSL/2cnCov8ZycFi/1nKov+Z4mKAQCIBUKxMgqyFCKyEov/shElshAisgGzgBhCcmlkZ2U6IG9wdC1pbiBjb21wbGV0ZWSwiYoGACIpZUREi/qI/xZJi/8NRIEgr4v7EhREgQKI/zOL/0AA1SKLAQiLAIv/CYv6MQBPAogEEyInBWVEi/wTRIv8i/1QJwdMUL1FAUQiJwVlREsBi/tPAov8i/2L/ogChov8iALEgAFzSwJQSb1FARREgAC/SwFXAQGxIiplRCcNshqyGLIaJLIQIrIBs7Q+SVcEAExXAAQoEkQXIiplRHIIRCIqZUSxTLIHSwGyCCOyECKyAbaABKMkmYmyGk8DshqyGCSyECKyAbNLARZLARZQgARLVUGbTFCwCE8CDkQWi/tQi/xQi/1Qi/5QJwtQgAQin7rsTFCwiYv6FoABZkxQvkwXTESL/wuxIicEZUQiJwVlRIAEHbcM3bIashqyGCSyECKyAbO0PklXBABMVwAEKBJEFwpJFoAE4H9rNkxQsEL+4YoGACIpZUREgAFii/xQvUUBRCOI/fhJIQQPRCInBWVEi/qL+4v8TwOL/Yv+iAFzSTEAUAJMUQACTFECIFBJTgKAAW1LAVBJvUUBFESAAL+xIiplRIAEM+FHqrIashiyGiSyECKyAbO0PklXBABMVwAEKBJEIlNEi/2BGFuL+4v6i/+IAipMSSEECUwhBA1BABCxi/uyB4sCsggjshAisgGziwEWi/tQi/5QJwtQiwBQgARFg2rWTFCwiYoCAIgDD4ABYov+UIv/v4mKAgCIAv+L/ov/UCcHTFCAAL+JigIAiALsi/6L/1AnB0xQvEiJigEAiALasSIrZUSyB4v/sggjshAisgGziYoBAIgCwTIKSYv/cABMSU8CREEAGrEiK2VEshSLAbISi/+yEYsAsgAlshAisgGziYoCAYv+iAIqsSIqZUQnDrIai/6yGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXsSInBGVETgIIFoAEe/fVDLIai/6yGrIashgkshAisgGztD5JVwQATFcABCgSRBeL/xaAAWVMUL5MF0xEComKBgGBGK+L+hZQgR+vi/xQTIv7UExQi/5Qi/9QJwtQAov8FyJMVov9FyNMVkkVgSASRImKAgGL/ov/UCcHTFC9RQGJigEBi/+IAachBAiJigQAIillREQxAIv8iPvfi/xLAksCiAD8i/2L/k8Ci/+IAJuL/BaL/RZPAxZPAxZPBIv+UE8EUE8DUE8CUExQgAQVQESzTFCwiYoCAIgBj4v/FicISwFQi/4Wv4v/cQFEgQlMCUkkCIABZksDUIEKTwKUFr+AAWVPAlCBCk8ClBa/iYoBAIgBVov/FicITFC8SIkxACInCmVEEkQpImeJiAE8KSNniYoBAIgBMicKi/9niYoBAIgBJicGi/9niYoEAYv8FicITFBJvUUBRL5MF0xEsYv+Fov/FiInBmVEi/0SJwkiTwJUgAQNG0wGshqL/bIaTwKyGkyyGrIashgkshAisgGztD5JVwQATFcABCgSRBeJigMBi/0WJwhMUEm9RQFEvkwXTESxSXIIRLIUi/+yEov9shElshAisgGzsYv/FiInBmVEi/4SJwkiTwJUgATZeK0UshqL/rIaTLIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4mKAQEnDIv/UL5MF0xEiYoCAIgAUScMi/5Qi/8Wv4mKAQCIAEEnBIv/Z4mKAQEnDIv/UL5MF0xEsSInBGVETBaABMKvzNGyGov/shqyGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXiTEAIitlRBJEiYoBAIj/8SuL/2eJ",
464
+ clear: "CoEBQw==",
465
+ },
466
+ events: [
467
+ { name: "BridgingFeeFromTokens", args: [{ type: "uint64", name: "fee" }] },
468
+ {
469
+ name: "ReceiveFee",
470
+ args: [
471
+ { type: "uint64", name: "bridgeTransactionCost" },
472
+ { type: "uint64", name: "messageTransactionCost" },
473
+ ],
474
+ },
475
+ {
476
+ name: "TokensSent",
477
+ args: [
478
+ { type: "uint64", name: "amount" },
479
+ { type: "byte[32]", name: "recipient" },
480
+ { type: "byte", name: "destinationChainId" },
481
+ { type: "byte[32]", name: "receiveToken" },
482
+ { type: "byte[32]", name: "nonce" },
483
+ { type: "byte", name: "messenger" },
484
+ ],
485
+ },
486
+ {
487
+ name: "TokensReceived",
488
+ args: [
489
+ { type: "uint64", name: "receiveAmount" },
490
+ { type: "address", name: "recipient" },
491
+ { type: "byte[32]", name: "nonce" },
492
+ { type: "byte", name: "messenger" },
493
+ { type: "byte[32]", name: "message" },
494
+ ],
495
+ },
496
+ {
497
+ name: "Swapped",
498
+ args: [
499
+ { type: "address", name: "sender" },
500
+ { type: "address", name: "recipient" },
501
+ { type: "uint64", name: "tokenId" },
502
+ { type: "uint64", name: "receiveTokenId" },
503
+ { type: "uint64", name: "amount" },
504
+ { type: "uint64", name: "receivedAmount" },
505
+ ],
506
+ },
507
+ ],
508
+ templateVariables: {},
509
+ };
510
+ class BinaryStateValue {
511
+ value;
512
+ constructor(value) {
513
+ this.value = value;
514
+ }
515
+ asByteArray() {
516
+ return this.value;
517
+ }
518
+ asString() {
519
+ return this.value !== undefined ? Buffer.from(this.value).toString("utf-8") : undefined;
520
+ }
521
+ }
522
+ /**
523
+ * Exposes methods for constructing `AppClient` params objects for ABI calls to the Bridge smart contract
524
+ */
525
+ class BridgeParamsFactory {
526
+ /**
527
+ * Gets available create ABI call param factories
528
+ */
529
+ static get create() {
530
+ return {
531
+ _resolveByMethod(params) {
532
+ switch (params.method) {
533
+ case "createApplication":
534
+ case "createApplication(address,byte,application,application)void":
535
+ return BridgeParamsFactory.create.createApplication(params);
536
+ }
537
+ throw new Error(`Unknown ' + verb + ' method`);
538
+ },
539
+ /**
540
+ * Constructs create ABI call params for the Bridge smart contract using the createApplication(address,byte,application,application)void ABI method
541
+ *
542
+ * @param params Parameters for the call
543
+ * @returns An `AppClientMethodCallParams` object for the call
544
+ */
545
+ createApplication(params) {
546
+ return {
547
+ ...params,
548
+ method: "createApplication(address,byte,application,application)void",
549
+ args: Array.isArray(params.args)
550
+ ? params.args
551
+ : [params.args.owner, params.args.chainId, params.args.messenger, params.args.gasOracle],
552
+ };
553
+ },
554
+ };
555
+ }
556
+ /**
557
+ * Constructs a no op call for the optInAsset(uint64)void ABI method
558
+ *
559
+ * @param params Parameters for the call
560
+ * @returns An `AppClientMethodCallParams` object for the call
561
+ */
562
+ static optInAsset(params) {
563
+ return {
564
+ ...params,
565
+ method: "optInAsset(uint64)void",
566
+ args: Array.isArray(params.args) ? params.args : [params.args.assetId],
567
+ };
568
+ }
569
+ /**
570
+ * Constructs a no op call for the noop()void ABI method
571
+ *
572
+ * @param params Parameters for the call
573
+ * @returns An `AppClientMethodCallParams` object for the call
574
+ */
575
+ static noop(params) {
576
+ return {
577
+ ...params,
578
+ method: "noop()void",
579
+ args: Array.isArray(params.args) ? params.args : [],
580
+ };
581
+ }
582
+ /**
583
+ * Constructs a no op call for the swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void ABI method
584
+ *
585
+ * @param params Parameters for the call
586
+ * @returns An `AppClientMethodCallParams` object for the call
587
+ */
588
+ static swapAndBridge(params) {
589
+ return {
590
+ ...params,
591
+ method: "swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void",
592
+ args: Array.isArray(params.args)
593
+ ? params.args
594
+ : [
595
+ params.args.tokenId,
596
+ params.args.recipient,
597
+ params.args.destinationChainId,
598
+ params.args.receiveToken,
599
+ params.args.nonce,
600
+ params.args.feeTokenAmount,
601
+ ],
602
+ };
603
+ }
604
+ /**
605
+ * Constructs a no op call for the receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void ABI method
606
+ *
607
+ * @param params Parameters for the call
608
+ * @returns An `AppClientMethodCallParams` object for the call
609
+ */
610
+ static receiveTokens(params) {
611
+ return {
612
+ ...params,
613
+ method: "receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void",
614
+ args: Array.isArray(params.args)
615
+ ? params.args
616
+ : [
617
+ params.args.amount,
618
+ params.args.recipient,
619
+ params.args.sourceChainId,
620
+ params.args.receiveToken,
621
+ params.args.nonce,
622
+ params.args.receiveAmountMin,
623
+ ],
624
+ };
625
+ }
626
+ /**
627
+ * Constructs a no op call for the registerBridge(byte,byte[32])void ABI method
628
+ *
629
+ * @param params Parameters for the call
630
+ * @returns An `AppClientMethodCallParams` object for the call
631
+ */
632
+ static registerBridge(params) {
633
+ return {
634
+ ...params,
635
+ method: "registerBridge(byte,byte[32])void",
636
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.bridgeAddress],
637
+ };
638
+ }
639
+ /**
640
+ * Constructs a no op call for the addBridgeToken(byte,byte[32])void ABI method
641
+ *
642
+ * @param params Parameters for the call
643
+ * @returns An `AppClientMethodCallParams` object for the call
644
+ */
645
+ static addBridgeToken(params) {
646
+ return {
647
+ ...params,
648
+ method: "addBridgeToken(byte,byte[32])void",
649
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.tokenAddress],
650
+ };
651
+ }
652
+ /**
653
+ * Constructs a no op call for the removeBridgeToken(byte,byte[32])void ABI method
654
+ *
655
+ * @param params Parameters for the call
656
+ * @returns An `AppClientMethodCallParams` object for the call
657
+ */
658
+ static removeBridgeToken(params) {
659
+ return {
660
+ ...params,
661
+ method: "removeBridgeToken(byte,byte[32])void",
662
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.tokenAddress],
663
+ };
664
+ }
665
+ /**
666
+ * Constructs a no op call for the withdrawGasTokens(uint64)void ABI method
667
+ *
668
+ * @param params Parameters for the call
669
+ * @returns An `AppClientMethodCallParams` object for the call
670
+ */
671
+ static withdrawGasTokens(params) {
672
+ return {
673
+ ...params,
674
+ method: "withdrawGasTokens(uint64)void",
675
+ args: Array.isArray(params.args) ? params.args : [params.args.amount],
676
+ };
677
+ }
678
+ /**
679
+ * Constructs a no op call for the withdrawBridgingFeeInTokens(uint64)void ABI method
680
+ *
681
+ * @param params Parameters for the call
682
+ * @returns An `AppClientMethodCallParams` object for the call
683
+ */
684
+ static withdrawBridgingFeeInTokens(params) {
685
+ return {
686
+ ...params,
687
+ method: "withdrawBridgingFeeInTokens(uint64)void",
688
+ args: Array.isArray(params.args) ? params.args : [params.args.assetId],
689
+ };
690
+ }
691
+ /**
692
+ * Constructs a no op call for the getBridgingCostInTokens(byte,uint64)uint64 ABI method
693
+ *
694
+ * @param params Parameters for the call
695
+ * @returns An `AppClientMethodCallParams` object for the call
696
+ */
697
+ static getBridgingCostInTokens(params) {
698
+ return {
699
+ ...params,
700
+ method: "getBridgingCostInTokens(byte,uint64)uint64",
701
+ args: Array.isArray(params.args) ? params.args : [params.args.destinationChainId, params.args.tokenId],
702
+ };
703
+ }
704
+ /**
705
+ * Constructs a no op call for the hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32] ABI method
706
+ *
707
+ * @param params Parameters for the call
708
+ * @returns An `AppClientMethodCallParams` object for the call
709
+ */
710
+ static hashMessage(params) {
711
+ return {
712
+ ...params,
713
+ method: "hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",
714
+ args: Array.isArray(params.args)
715
+ ? params.args
716
+ : [
717
+ params.args.amount,
718
+ params.args.recipient,
719
+ params.args.sourceChainId,
720
+ params.args.destinationChainId,
721
+ params.args.receiveToken,
722
+ params.args.nonce,
723
+ ],
724
+ };
725
+ }
726
+ /**
727
+ * Constructs a no op call for the isOtherBridgeTokenSupported(byte,byte[32])bool ABI method
728
+ *
729
+ * @param params Parameters for the call
730
+ * @returns An `AppClientMethodCallParams` object for the call
731
+ */
732
+ static isOtherBridgeTokenSupported(params) {
733
+ return {
734
+ ...params,
735
+ method: "isOtherBridgeTokenSupported(byte,byte[32])bool",
736
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.token],
737
+ };
738
+ }
739
+ /**
740
+ * Constructs a no op call for the getTransactionCost(byte)uint64 ABI method
741
+ *
742
+ * @param params Parameters for the call
743
+ * @returns An `AppClientMethodCallParams` object for the call
744
+ */
745
+ static getTransactionCost(params) {
746
+ return {
747
+ ...params,
748
+ method: "getTransactionCost(byte)uint64",
749
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId],
750
+ };
751
+ }
752
+ /**
753
+ * Constructs a no op call for the getReceiveTokensCost()uint64 ABI method
754
+ *
755
+ * @param params Parameters for the call
756
+ * @returns An `AppClientMethodCallParams` object for the call
757
+ */
758
+ static getReceiveTokensCost(params) {
759
+ return {
760
+ ...params,
761
+ method: "getReceiveTokensCost()uint64",
762
+ args: Array.isArray(params.args) ? params.args : [],
763
+ };
764
+ }
765
+ /**
766
+ * Constructs a no op call for the getSendTransactionStorageCost()uint64 ABI method
767
+ *
768
+ * @param params Parameters for the call
769
+ * @returns An `AppClientMethodCallParams` object for the call
770
+ */
771
+ static getSendTransactionStorageCost(params) {
772
+ return {
773
+ ...params,
774
+ method: "getSendTransactionStorageCost()uint64",
775
+ args: Array.isArray(params.args) ? params.args : [],
776
+ };
777
+ }
778
+ /**
779
+ * Constructs a no op call for the swap(uint64,uint64,address,uint64)void ABI method
780
+ *
781
+ * @param params Parameters for the call
782
+ * @returns An `AppClientMethodCallParams` object for the call
783
+ */
784
+ static swap(params) {
785
+ return {
786
+ ...params,
787
+ method: "swap(uint64,uint64,address,uint64)void",
788
+ args: Array.isArray(params.args)
789
+ ? params.args
790
+ : [params.args.tokenId, params.args.receiveTokenId, params.args.recipient, params.args.receiveAmountMin],
791
+ };
792
+ }
793
+ /**
794
+ * Constructs a no op call for the addPool(uint64,uint64)void ABI method
795
+ *
796
+ * @param params Parameters for the call
797
+ * @returns An `AppClientMethodCallParams` object for the call
798
+ */
799
+ static addPool(params) {
800
+ return {
801
+ ...params,
802
+ method: "addPool(uint64,uint64)void",
803
+ args: Array.isArray(params.args) ? params.args : [params.args.poolId, params.args.tokenId],
804
+ };
805
+ }
806
+ /**
807
+ * Constructs a no op call for the removePool(uint64)void ABI method
808
+ *
809
+ * @param params Parameters for the call
810
+ * @returns An `AppClientMethodCallParams` object for the call
811
+ */
812
+ static removePool(params) {
813
+ return {
814
+ ...params,
815
+ method: "removePool(uint64)void",
816
+ args: Array.isArray(params.args) ? params.args : [params.args.tokenId],
817
+ };
818
+ }
819
+ /**
820
+ * Constructs a no op call for the stopSwap()void ABI method
821
+ *
822
+ * @param params Parameters for the call
823
+ * @returns An `AppClientMethodCallParams` object for the call
824
+ */
825
+ static stopSwap(params) {
826
+ return {
827
+ ...params,
828
+ method: "stopSwap()void",
829
+ args: Array.isArray(params.args) ? params.args : [],
830
+ };
831
+ }
832
+ /**
833
+ * Constructs a no op call for the startSwap()void ABI method
834
+ *
835
+ * @param params Parameters for the call
836
+ * @returns An `AppClientMethodCallParams` object for the call
837
+ */
838
+ static startSwap(params) {
839
+ return {
840
+ ...params,
841
+ method: "startSwap()void",
842
+ args: Array.isArray(params.args) ? params.args : [],
843
+ };
844
+ }
845
+ /**
846
+ * Constructs a no op call for the setStopAuthority(address)void ABI method
847
+ *
848
+ * @param params Parameters for the call
849
+ * @returns An `AppClientMethodCallParams` object for the call
850
+ */
851
+ static setStopAuthority(params) {
852
+ return {
853
+ ...params,
854
+ method: "setStopAuthority(address)void",
855
+ args: Array.isArray(params.args) ? params.args : [params.args.stopAuthority],
856
+ };
857
+ }
858
+ /**
859
+ * Constructs a no op call for the setRebalancer(address)void ABI method
860
+ *
861
+ * @param params Parameters for the call
862
+ * @returns An `AppClientMethodCallParams` object for the call
863
+ */
864
+ static setRebalancer(params) {
865
+ return {
866
+ ...params,
867
+ method: "setRebalancer(address)void",
868
+ args: Array.isArray(params.args) ? params.args : [params.args.rebalancer],
869
+ };
870
+ }
871
+ /**
872
+ * Constructs a no op call for the getGasUsage(byte)uint64 ABI method
873
+ *
874
+ * @param params Parameters for the call
875
+ * @returns An `AppClientMethodCallParams` object for the call
876
+ */
877
+ static getGasUsage(params) {
878
+ return {
879
+ ...params,
880
+ method: "getGasUsage(byte)uint64",
881
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId],
882
+ };
883
+ }
884
+ /**
885
+ * Constructs a no op call for the setGasUsage(byte,uint64)void ABI method
886
+ *
887
+ * @param params Parameters for the call
888
+ * @returns An `AppClientMethodCallParams` object for the call
889
+ */
890
+ static setGasUsage(params) {
891
+ return {
892
+ ...params,
893
+ method: "setGasUsage(byte,uint64)void",
894
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId, params.args.gasAmount],
895
+ };
896
+ }
897
+ /**
898
+ * Constructs a no op call for the setGasOracle(application)void ABI method
899
+ *
900
+ * @param params Parameters for the call
901
+ * @returns An `AppClientMethodCallParams` object for the call
902
+ */
903
+ static setGasOracle(params) {
904
+ return {
905
+ ...params,
906
+ method: "setGasOracle(application)void",
907
+ args: Array.isArray(params.args) ? params.args : [params.args.gasOracle],
908
+ };
909
+ }
910
+ /**
911
+ * Constructs a no op call for the getTransactionRelayerCost(byte)uint64 ABI method
912
+ *
913
+ * @param params Parameters for the call
914
+ * @returns An `AppClientMethodCallParams` object for the call
915
+ */
916
+ static getTransactionRelayerCost(params) {
917
+ return {
918
+ ...params,
919
+ method: "getTransactionRelayerCost(byte)uint64",
920
+ args: Array.isArray(params.args) ? params.args : [params.args.chainId],
921
+ };
922
+ }
923
+ /**
924
+ * Constructs a no op call for the transferOwnership(address)void ABI method
925
+ *
926
+ * @param params Parameters for the call
927
+ * @returns An `AppClientMethodCallParams` object for the call
928
+ */
929
+ static transferOwnership(params) {
930
+ return {
931
+ ...params,
932
+ method: "transferOwnership(address)void",
933
+ args: Array.isArray(params.args) ? params.args : [params.args.newOwner],
934
+ };
935
+ }
936
+ }
937
+ exports.BridgeParamsFactory = BridgeParamsFactory;
938
+ /**
939
+ * A factory to create and deploy one or more instance of the Bridge smart contract and to create one or more app clients to interact with those (or other) app instances
940
+ */
941
+ class BridgeFactory {
942
+ /**
943
+ * The underlying `AppFactory` for when you want to have more flexibility
944
+ */
945
+ appFactory;
946
+ /**
947
+ * Creates a new instance of `BridgeFactory`
948
+ *
949
+ * @param params The parameters to initialise the app factory with
950
+ */
951
+ constructor(params) {
952
+ this.appFactory = new app_factory_1.AppFactory({
953
+ ...params,
954
+ appSpec: exports.APP_SPEC,
955
+ });
956
+ }
957
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
958
+ get appName() {
959
+ return this.appFactory.appName;
960
+ }
961
+ /** The ARC-56 app spec being used */
962
+ get appSpec() {
963
+ return exports.APP_SPEC;
964
+ }
965
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
966
+ get algorand() {
967
+ return this.appFactory.algorand;
968
+ }
969
+ /**
970
+ * Returns a new `AppClient` client for an app instance of the given ID.
971
+ *
972
+ * Automatically populates appName, defaultSender and source maps from the factory
973
+ * if not specified in the params.
974
+ * @param params The parameters to create the app client
975
+ * @returns The `AppClient`
976
+ */
977
+ getAppClientById(params) {
978
+ return new BridgeClient(this.appFactory.getAppClientById(params));
979
+ }
980
+ /**
981
+ * Returns a new `AppClient` client, resolving the app by creator address and name
982
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
983
+ *
984
+ * Automatically populates appName, defaultSender and source maps from the factory
985
+ * if not specified in the params.
986
+ * @param params The parameters to create the app client
987
+ * @returns The `AppClient`
988
+ */
989
+ async getAppClientByCreatorAndName(params) {
990
+ return new BridgeClient(await this.appFactory.getAppClientByCreatorAndName(params));
991
+ }
992
+ /**
993
+ * Idempotently deploys the Bridge smart contract.
994
+ *
995
+ * @param params The arguments for the contract calls and any additional parameters for the call
996
+ * @returns The deployment result
997
+ */
998
+ async deploy(params = {}) {
999
+ const result = await this.appFactory.deploy({
1000
+ ...params,
1001
+ createParams: params.createParams?.method
1002
+ ? BridgeParamsFactory.create._resolveByMethod(params.createParams)
1003
+ : params.createParams
1004
+ ? params.createParams
1005
+ : undefined,
1006
+ });
1007
+ return { result: result.result, appClient: new BridgeClient(result.appClient) };
1008
+ }
1009
+ /**
1010
+ * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
1011
+ */
1012
+ params = {
1013
+ /**
1014
+ * Gets available create methods
1015
+ */
1016
+ create: {
1017
+ /**
1018
+ * Creates a new instance of the Bridge smart contract using the createApplication(address,byte,application,application)void ABI method.
1019
+ *
1020
+ * @param params The params for the smart contract call
1021
+ * @returns The create params
1022
+ */
1023
+ createApplication: (params) => {
1024
+ return this.appFactory.params.create(BridgeParamsFactory.create.createApplication(params));
1025
+ },
1026
+ },
1027
+ };
1028
+ /**
1029
+ * Create transactions for the current app
1030
+ */
1031
+ createTransaction = {
1032
+ /**
1033
+ * Gets available create methods
1034
+ */
1035
+ create: {
1036
+ /**
1037
+ * Creates a new instance of the Bridge smart contract using the createApplication(address,byte,application,application)void ABI method.
1038
+ *
1039
+ * @param params The params for the smart contract call
1040
+ * @returns The create transaction
1041
+ */
1042
+ createApplication: (params) => {
1043
+ return this.appFactory.createTransaction.create(BridgeParamsFactory.create.createApplication(params));
1044
+ },
1045
+ },
1046
+ };
1047
+ /**
1048
+ * Send calls to the current app
1049
+ */
1050
+ send = {
1051
+ /**
1052
+ * Gets available create methods
1053
+ */
1054
+ create: {
1055
+ /**
1056
+ * Creates a new instance of the Bridge smart contract using an ABI method call using the createApplication(address,byte,application,application)void ABI method.
1057
+ *
1058
+ * @param params The params for the smart contract call
1059
+ * @returns The create result
1060
+ */
1061
+ createApplication: async (params) => {
1062
+ const result = await this.appFactory.send.create(BridgeParamsFactory.create.createApplication(params));
1063
+ return {
1064
+ result: {
1065
+ ...result.result,
1066
+ return: result.result.return,
1067
+ },
1068
+ appClient: new BridgeClient(result.appClient),
1069
+ };
1070
+ },
1071
+ },
1072
+ };
1073
+ }
1074
+ exports.BridgeFactory = BridgeFactory;
1075
+ /**
1076
+ * A client to make calls to the Bridge smart contract
1077
+ */
1078
+ class BridgeClient {
1079
+ /**
1080
+ * The underlying `AppClient` for when you want to have more flexibility
1081
+ */
1082
+ appClient;
1083
+ constructor(appClientOrParams) {
1084
+ this.appClient =
1085
+ appClientOrParams instanceof app_client_1.AppClient
1086
+ ? appClientOrParams
1087
+ : new app_client_1.AppClient({
1088
+ ...appClientOrParams,
1089
+ appSpec: exports.APP_SPEC,
1090
+ });
1091
+ }
1092
+ /**
1093
+ * Checks for decode errors on the given return value and maps the return value to the return type for the given method
1094
+ * @returns The typed return value or undefined if there was no value
1095
+ */
1096
+ decodeReturnValue(method, returnValue) {
1097
+ return returnValue !== undefined
1098
+ ? (0, app_arc56_1.getArc56ReturnValue)(returnValue, this.appClient.getABIMethod(method), exports.APP_SPEC.structs)
1099
+ : undefined;
1100
+ }
1101
+ /**
1102
+ * Returns a new `BridgeClient` client, resolving the app by creator address and name
1103
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
1104
+ * @param params The parameters to create the app client
1105
+ */
1106
+ static async fromCreatorAndName(params) {
1107
+ return new BridgeClient(await app_client_1.AppClient.fromCreatorAndName({ ...params, appSpec: exports.APP_SPEC }));
1108
+ }
1109
+ /**
1110
+ * Returns an `BridgeClient` instance for the current network based on
1111
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
1112
+ *
1113
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
1114
+ * @param params The parameters to create the app client
1115
+ */
1116
+ static async fromNetwork(params) {
1117
+ return new BridgeClient(await app_client_1.AppClient.fromNetwork({ ...params, appSpec: exports.APP_SPEC }));
1118
+ }
1119
+ /** The ID of the app instance this client is linked to. */
1120
+ get appId() {
1121
+ return this.appClient.appId;
1122
+ }
1123
+ /** The app address of the app instance this client is linked to. */
1124
+ get appAddress() {
1125
+ return this.appClient.appAddress;
1126
+ }
1127
+ /** The name of the app. */
1128
+ get appName() {
1129
+ return this.appClient.appName;
1130
+ }
1131
+ /** The ARC-56 app spec being used */
1132
+ get appSpec() {
1133
+ return this.appClient.appSpec;
1134
+ }
1135
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
1136
+ get algorand() {
1137
+ return this.appClient.algorand;
1138
+ }
1139
+ /**
1140
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
1141
+ */
1142
+ params = {
1143
+ /**
1144
+ * Makes a clear_state call to an existing instance of the Bridge smart contract.
1145
+ *
1146
+ * @param params The params for the bare (raw) call
1147
+ * @returns The clearState result
1148
+ */
1149
+ clearState: (params) => {
1150
+ return this.appClient.params.bare.clearState(params);
1151
+ },
1152
+ /**
1153
+ * Makes a call to the Bridge smart contract using the `optInAsset(uint64)void` ABI method.
1154
+ *
1155
+ * @param params The params for the smart contract call
1156
+ * @returns The call params
1157
+ */
1158
+ optInAsset: (params) => {
1159
+ return this.appClient.params.call(BridgeParamsFactory.optInAsset(params));
1160
+ },
1161
+ /**
1162
+ * Makes a call to the Bridge smart contract using the `noop()void` ABI method.
1163
+ *
1164
+ * @param params The params for the smart contract call
1165
+ * @returns The call params
1166
+ */
1167
+ noop: (params = { args: [] }) => {
1168
+ return this.appClient.params.call(BridgeParamsFactory.noop(params));
1169
+ },
1170
+ /**
1171
+ * Makes a call to the Bridge smart contract using the `swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1172
+ *
1173
+ * @param params The params for the smart contract call
1174
+ * @returns The call params
1175
+ */
1176
+ swapAndBridge: (params) => {
1177
+ return this.appClient.params.call(BridgeParamsFactory.swapAndBridge(params));
1178
+ },
1179
+ /**
1180
+ * Makes a call to the Bridge smart contract using the `receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1181
+ *
1182
+ * @param params The params for the smart contract call
1183
+ * @returns The call params
1184
+ */
1185
+ receiveTokens: (params) => {
1186
+ return this.appClient.params.call(BridgeParamsFactory.receiveTokens(params));
1187
+ },
1188
+ /**
1189
+ * Makes a call to the Bridge smart contract using the `registerBridge(byte,byte[32])void` ABI method.
1190
+ *
1191
+ * @param params The params for the smart contract call
1192
+ * @returns The call params
1193
+ */
1194
+ registerBridge: (params) => {
1195
+ return this.appClient.params.call(BridgeParamsFactory.registerBridge(params));
1196
+ },
1197
+ /**
1198
+ * Makes a call to the Bridge smart contract using the `addBridgeToken(byte,byte[32])void` ABI method.
1199
+ *
1200
+ * @param params The params for the smart contract call
1201
+ * @returns The call params
1202
+ */
1203
+ addBridgeToken: (params) => {
1204
+ return this.appClient.params.call(BridgeParamsFactory.addBridgeToken(params));
1205
+ },
1206
+ /**
1207
+ * Makes a call to the Bridge smart contract using the `removeBridgeToken(byte,byte[32])void` ABI method.
1208
+ *
1209
+ * @param params The params for the smart contract call
1210
+ * @returns The call params
1211
+ */
1212
+ removeBridgeToken: (params) => {
1213
+ return this.appClient.params.call(BridgeParamsFactory.removeBridgeToken(params));
1214
+ },
1215
+ /**
1216
+ * Makes a call to the Bridge smart contract using the `withdrawGasTokens(uint64)void` ABI method.
1217
+ *
1218
+ * @param params The params for the smart contract call
1219
+ * @returns The call params
1220
+ */
1221
+ withdrawGasTokens: (params) => {
1222
+ return this.appClient.params.call(BridgeParamsFactory.withdrawGasTokens(params));
1223
+ },
1224
+ /**
1225
+ * Makes a call to the Bridge smart contract using the `withdrawBridgingFeeInTokens(uint64)void` ABI method.
1226
+ *
1227
+ * @param params The params for the smart contract call
1228
+ * @returns The call params
1229
+ */
1230
+ withdrawBridgingFeeInTokens: (params) => {
1231
+ return this.appClient.params.call(BridgeParamsFactory.withdrawBridgingFeeInTokens(params));
1232
+ },
1233
+ /**
1234
+ * Makes a call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
1235
+ *
1236
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1237
+ *
1238
+ * @param params The params for the smart contract call
1239
+ * @returns The call params
1240
+ */
1241
+ getBridgingCostInTokens: (params) => {
1242
+ return this.appClient.params.call(BridgeParamsFactory.getBridgingCostInTokens(params));
1243
+ },
1244
+ /**
1245
+ * Makes a call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
1246
+ *
1247
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1248
+ *
1249
+ * @param params The params for the smart contract call
1250
+ * @returns The call params
1251
+ */
1252
+ hashMessage: (params) => {
1253
+ return this.appClient.params.call(BridgeParamsFactory.hashMessage(params));
1254
+ },
1255
+ /**
1256
+ * Makes a call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
1257
+ *
1258
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1259
+ *
1260
+ * @param params The params for the smart contract call
1261
+ * @returns The call params
1262
+ */
1263
+ isOtherBridgeTokenSupported: (params) => {
1264
+ return this.appClient.params.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
1265
+ },
1266
+ /**
1267
+ * Makes a call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
1268
+ *
1269
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1270
+ *
1271
+ * @param params The params for the smart contract call
1272
+ * @returns The call params
1273
+ */
1274
+ getTransactionCost: (params) => {
1275
+ return this.appClient.params.call(BridgeParamsFactory.getTransactionCost(params));
1276
+ },
1277
+ /**
1278
+ * Makes a call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
1279
+ *
1280
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1281
+ *
1282
+ * @param params The params for the smart contract call
1283
+ * @returns The call params
1284
+ */
1285
+ getReceiveTokensCost: (params = { args: [] }) => {
1286
+ return this.appClient.params.call(BridgeParamsFactory.getReceiveTokensCost(params));
1287
+ },
1288
+ /**
1289
+ * Makes a call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
1290
+ *
1291
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1292
+ *
1293
+ * @param params The params for the smart contract call
1294
+ * @returns The call params
1295
+ */
1296
+ getSendTransactionStorageCost: (params = { args: [] }) => {
1297
+ return this.appClient.params.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
1298
+ },
1299
+ /**
1300
+ * Makes a call to the Bridge smart contract using the `swap(uint64,uint64,address,uint64)void` ABI method.
1301
+ *
1302
+ * @param params The params for the smart contract call
1303
+ * @returns The call params
1304
+ */
1305
+ swap: (params) => {
1306
+ return this.appClient.params.call(BridgeParamsFactory.swap(params));
1307
+ },
1308
+ /**
1309
+ * Makes a call to the Bridge smart contract using the `addPool(uint64,uint64)void` ABI method.
1310
+ *
1311
+ * @param params The params for the smart contract call
1312
+ * @returns The call params
1313
+ */
1314
+ addPool: (params) => {
1315
+ return this.appClient.params.call(BridgeParamsFactory.addPool(params));
1316
+ },
1317
+ /**
1318
+ * Makes a call to the Bridge smart contract using the `removePool(uint64)void` ABI method.
1319
+ *
1320
+ * @param params The params for the smart contract call
1321
+ * @returns The call params
1322
+ */
1323
+ removePool: (params) => {
1324
+ return this.appClient.params.call(BridgeParamsFactory.removePool(params));
1325
+ },
1326
+ /**
1327
+ * Makes a call to the Bridge smart contract using the `stopSwap()void` ABI method.
1328
+ *
1329
+ * @param params The params for the smart contract call
1330
+ * @returns The call params
1331
+ */
1332
+ stopSwap: (params = { args: [] }) => {
1333
+ return this.appClient.params.call(BridgeParamsFactory.stopSwap(params));
1334
+ },
1335
+ /**
1336
+ * Makes a call to the Bridge smart contract using the `startSwap()void` ABI method.
1337
+ *
1338
+ * @param params The params for the smart contract call
1339
+ * @returns The call params
1340
+ */
1341
+ startSwap: (params = { args: [] }) => {
1342
+ return this.appClient.params.call(BridgeParamsFactory.startSwap(params));
1343
+ },
1344
+ /**
1345
+ * Makes a call to the Bridge smart contract using the `setStopAuthority(address)void` ABI method.
1346
+ *
1347
+ * @param params The params for the smart contract call
1348
+ * @returns The call params
1349
+ */
1350
+ setStopAuthority: (params) => {
1351
+ return this.appClient.params.call(BridgeParamsFactory.setStopAuthority(params));
1352
+ },
1353
+ /**
1354
+ * Makes a call to the Bridge smart contract using the `setRebalancer(address)void` ABI method.
1355
+ *
1356
+ * @param params The params for the smart contract call
1357
+ * @returns The call params
1358
+ */
1359
+ setRebalancer: (params) => {
1360
+ return this.appClient.params.call(BridgeParamsFactory.setRebalancer(params));
1361
+ },
1362
+ /**
1363
+ * Makes a call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
1364
+ *
1365
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1366
+ *
1367
+ * @param params The params for the smart contract call
1368
+ * @returns The call params
1369
+ */
1370
+ getGasUsage: (params) => {
1371
+ return this.appClient.params.call(BridgeParamsFactory.getGasUsage(params));
1372
+ },
1373
+ /**
1374
+ * Makes a call to the Bridge smart contract using the `setGasUsage(byte,uint64)void` ABI method.
1375
+ *
1376
+ * @param params The params for the smart contract call
1377
+ * @returns The call params
1378
+ */
1379
+ setGasUsage: (params) => {
1380
+ return this.appClient.params.call(BridgeParamsFactory.setGasUsage(params));
1381
+ },
1382
+ /**
1383
+ * Makes a call to the Bridge smart contract using the `setGasOracle(application)void` ABI method.
1384
+ *
1385
+ * @param params The params for the smart contract call
1386
+ * @returns The call params
1387
+ */
1388
+ setGasOracle: (params) => {
1389
+ return this.appClient.params.call(BridgeParamsFactory.setGasOracle(params));
1390
+ },
1391
+ /**
1392
+ * Makes a call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
1393
+ *
1394
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1395
+ *
1396
+ * @param params The params for the smart contract call
1397
+ * @returns The call params
1398
+ */
1399
+ getTransactionRelayerCost: (params) => {
1400
+ return this.appClient.params.call(BridgeParamsFactory.getTransactionRelayerCost(params));
1401
+ },
1402
+ /**
1403
+ * Makes a call to the Bridge smart contract using the `transferOwnership(address)void` ABI method.
1404
+ *
1405
+ * @param params The params for the smart contract call
1406
+ * @returns The call params
1407
+ */
1408
+ transferOwnership: (params) => {
1409
+ return this.appClient.params.call(BridgeParamsFactory.transferOwnership(params));
1410
+ },
1411
+ };
1412
+ /**
1413
+ * Create transactions for the current app
1414
+ */
1415
+ createTransaction = {
1416
+ /**
1417
+ * Makes a clear_state call to an existing instance of the Bridge smart contract.
1418
+ *
1419
+ * @param params The params for the bare (raw) call
1420
+ * @returns The clearState result
1421
+ */
1422
+ clearState: (params) => {
1423
+ return this.appClient.createTransaction.bare.clearState(params);
1424
+ },
1425
+ /**
1426
+ * Makes a call to the Bridge smart contract using the `optInAsset(uint64)void` ABI method.
1427
+ *
1428
+ * @param params The params for the smart contract call
1429
+ * @returns The call transaction
1430
+ */
1431
+ optInAsset: (params) => {
1432
+ return this.appClient.createTransaction.call(BridgeParamsFactory.optInAsset(params));
1433
+ },
1434
+ /**
1435
+ * Makes a call to the Bridge smart contract using the `noop()void` ABI method.
1436
+ *
1437
+ * @param params The params for the smart contract call
1438
+ * @returns The call transaction
1439
+ */
1440
+ noop: (params = { args: [] }) => {
1441
+ return this.appClient.createTransaction.call(BridgeParamsFactory.noop(params));
1442
+ },
1443
+ /**
1444
+ * Makes a call to the Bridge smart contract using the `swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1445
+ *
1446
+ * @param params The params for the smart contract call
1447
+ * @returns The call transaction
1448
+ */
1449
+ swapAndBridge: (params) => {
1450
+ return this.appClient.createTransaction.call(BridgeParamsFactory.swapAndBridge(params));
1451
+ },
1452
+ /**
1453
+ * Makes a call to the Bridge smart contract using the `receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1454
+ *
1455
+ * @param params The params for the smart contract call
1456
+ * @returns The call transaction
1457
+ */
1458
+ receiveTokens: (params) => {
1459
+ return this.appClient.createTransaction.call(BridgeParamsFactory.receiveTokens(params));
1460
+ },
1461
+ /**
1462
+ * Makes a call to the Bridge smart contract using the `registerBridge(byte,byte[32])void` ABI method.
1463
+ *
1464
+ * @param params The params for the smart contract call
1465
+ * @returns The call transaction
1466
+ */
1467
+ registerBridge: (params) => {
1468
+ return this.appClient.createTransaction.call(BridgeParamsFactory.registerBridge(params));
1469
+ },
1470
+ /**
1471
+ * Makes a call to the Bridge smart contract using the `addBridgeToken(byte,byte[32])void` ABI method.
1472
+ *
1473
+ * @param params The params for the smart contract call
1474
+ * @returns The call transaction
1475
+ */
1476
+ addBridgeToken: (params) => {
1477
+ return this.appClient.createTransaction.call(BridgeParamsFactory.addBridgeToken(params));
1478
+ },
1479
+ /**
1480
+ * Makes a call to the Bridge smart contract using the `removeBridgeToken(byte,byte[32])void` ABI method.
1481
+ *
1482
+ * @param params The params for the smart contract call
1483
+ * @returns The call transaction
1484
+ */
1485
+ removeBridgeToken: (params) => {
1486
+ return this.appClient.createTransaction.call(BridgeParamsFactory.removeBridgeToken(params));
1487
+ },
1488
+ /**
1489
+ * Makes a call to the Bridge smart contract using the `withdrawGasTokens(uint64)void` ABI method.
1490
+ *
1491
+ * @param params The params for the smart contract call
1492
+ * @returns The call transaction
1493
+ */
1494
+ withdrawGasTokens: (params) => {
1495
+ return this.appClient.createTransaction.call(BridgeParamsFactory.withdrawGasTokens(params));
1496
+ },
1497
+ /**
1498
+ * Makes a call to the Bridge smart contract using the `withdrawBridgingFeeInTokens(uint64)void` ABI method.
1499
+ *
1500
+ * @param params The params for the smart contract call
1501
+ * @returns The call transaction
1502
+ */
1503
+ withdrawBridgingFeeInTokens: (params) => {
1504
+ return this.appClient.createTransaction.call(BridgeParamsFactory.withdrawBridgingFeeInTokens(params));
1505
+ },
1506
+ /**
1507
+ * Makes a call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
1508
+ *
1509
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1510
+ *
1511
+ * @param params The params for the smart contract call
1512
+ * @returns The call transaction
1513
+ */
1514
+ getBridgingCostInTokens: (params) => {
1515
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getBridgingCostInTokens(params));
1516
+ },
1517
+ /**
1518
+ * Makes a call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
1519
+ *
1520
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1521
+ *
1522
+ * @param params The params for the smart contract call
1523
+ * @returns The call transaction
1524
+ */
1525
+ hashMessage: (params) => {
1526
+ return this.appClient.createTransaction.call(BridgeParamsFactory.hashMessage(params));
1527
+ },
1528
+ /**
1529
+ * Makes a call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
1530
+ *
1531
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1532
+ *
1533
+ * @param params The params for the smart contract call
1534
+ * @returns The call transaction
1535
+ */
1536
+ isOtherBridgeTokenSupported: (params) => {
1537
+ return this.appClient.createTransaction.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
1538
+ },
1539
+ /**
1540
+ * Makes a call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
1541
+ *
1542
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1543
+ *
1544
+ * @param params The params for the smart contract call
1545
+ * @returns The call transaction
1546
+ */
1547
+ getTransactionCost: (params) => {
1548
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getTransactionCost(params));
1549
+ },
1550
+ /**
1551
+ * Makes a call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
1552
+ *
1553
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1554
+ *
1555
+ * @param params The params for the smart contract call
1556
+ * @returns The call transaction
1557
+ */
1558
+ getReceiveTokensCost: (params = { args: [] }) => {
1559
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getReceiveTokensCost(params));
1560
+ },
1561
+ /**
1562
+ * Makes a call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
1563
+ *
1564
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1565
+ *
1566
+ * @param params The params for the smart contract call
1567
+ * @returns The call transaction
1568
+ */
1569
+ getSendTransactionStorageCost: (params = { args: [] }) => {
1570
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
1571
+ },
1572
+ /**
1573
+ * Makes a call to the Bridge smart contract using the `swap(uint64,uint64,address,uint64)void` ABI method.
1574
+ *
1575
+ * @param params The params for the smart contract call
1576
+ * @returns The call transaction
1577
+ */
1578
+ swap: (params) => {
1579
+ return this.appClient.createTransaction.call(BridgeParamsFactory.swap(params));
1580
+ },
1581
+ /**
1582
+ * Makes a call to the Bridge smart contract using the `addPool(uint64,uint64)void` ABI method.
1583
+ *
1584
+ * @param params The params for the smart contract call
1585
+ * @returns The call transaction
1586
+ */
1587
+ addPool: (params) => {
1588
+ return this.appClient.createTransaction.call(BridgeParamsFactory.addPool(params));
1589
+ },
1590
+ /**
1591
+ * Makes a call to the Bridge smart contract using the `removePool(uint64)void` ABI method.
1592
+ *
1593
+ * @param params The params for the smart contract call
1594
+ * @returns The call transaction
1595
+ */
1596
+ removePool: (params) => {
1597
+ return this.appClient.createTransaction.call(BridgeParamsFactory.removePool(params));
1598
+ },
1599
+ /**
1600
+ * Makes a call to the Bridge smart contract using the `stopSwap()void` ABI method.
1601
+ *
1602
+ * @param params The params for the smart contract call
1603
+ * @returns The call transaction
1604
+ */
1605
+ stopSwap: (params = { args: [] }) => {
1606
+ return this.appClient.createTransaction.call(BridgeParamsFactory.stopSwap(params));
1607
+ },
1608
+ /**
1609
+ * Makes a call to the Bridge smart contract using the `startSwap()void` ABI method.
1610
+ *
1611
+ * @param params The params for the smart contract call
1612
+ * @returns The call transaction
1613
+ */
1614
+ startSwap: (params = { args: [] }) => {
1615
+ return this.appClient.createTransaction.call(BridgeParamsFactory.startSwap(params));
1616
+ },
1617
+ /**
1618
+ * Makes a call to the Bridge smart contract using the `setStopAuthority(address)void` ABI method.
1619
+ *
1620
+ * @param params The params for the smart contract call
1621
+ * @returns The call transaction
1622
+ */
1623
+ setStopAuthority: (params) => {
1624
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setStopAuthority(params));
1625
+ },
1626
+ /**
1627
+ * Makes a call to the Bridge smart contract using the `setRebalancer(address)void` ABI method.
1628
+ *
1629
+ * @param params The params for the smart contract call
1630
+ * @returns The call transaction
1631
+ */
1632
+ setRebalancer: (params) => {
1633
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setRebalancer(params));
1634
+ },
1635
+ /**
1636
+ * Makes a call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
1637
+ *
1638
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1639
+ *
1640
+ * @param params The params for the smart contract call
1641
+ * @returns The call transaction
1642
+ */
1643
+ getGasUsage: (params) => {
1644
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getGasUsage(params));
1645
+ },
1646
+ /**
1647
+ * Makes a call to the Bridge smart contract using the `setGasUsage(byte,uint64)void` ABI method.
1648
+ *
1649
+ * @param params The params for the smart contract call
1650
+ * @returns The call transaction
1651
+ */
1652
+ setGasUsage: (params) => {
1653
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setGasUsage(params));
1654
+ },
1655
+ /**
1656
+ * Makes a call to the Bridge smart contract using the `setGasOracle(application)void` ABI method.
1657
+ *
1658
+ * @param params The params for the smart contract call
1659
+ * @returns The call transaction
1660
+ */
1661
+ setGasOracle: (params) => {
1662
+ return this.appClient.createTransaction.call(BridgeParamsFactory.setGasOracle(params));
1663
+ },
1664
+ /**
1665
+ * Makes a call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
1666
+ *
1667
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1668
+ *
1669
+ * @param params The params for the smart contract call
1670
+ * @returns The call transaction
1671
+ */
1672
+ getTransactionRelayerCost: (params) => {
1673
+ return this.appClient.createTransaction.call(BridgeParamsFactory.getTransactionRelayerCost(params));
1674
+ },
1675
+ /**
1676
+ * Makes a call to the Bridge smart contract using the `transferOwnership(address)void` ABI method.
1677
+ *
1678
+ * @param params The params for the smart contract call
1679
+ * @returns The call transaction
1680
+ */
1681
+ transferOwnership: (params) => {
1682
+ return this.appClient.createTransaction.call(BridgeParamsFactory.transferOwnership(params));
1683
+ },
1684
+ };
1685
+ /**
1686
+ * Send calls to the current app
1687
+ */
1688
+ send = {
1689
+ /**
1690
+ * Makes a clear_state call to an existing instance of the Bridge smart contract.
1691
+ *
1692
+ * @param params The params for the bare (raw) call
1693
+ * @returns The clearState result
1694
+ */
1695
+ clearState: (params) => {
1696
+ return this.appClient.send.bare.clearState(params);
1697
+ },
1698
+ /**
1699
+ * Makes a call to the Bridge smart contract using the `optInAsset(uint64)void` ABI method.
1700
+ *
1701
+ * @param params The params for the smart contract call
1702
+ * @returns The call result
1703
+ */
1704
+ optInAsset: async (params) => {
1705
+ const result = await this.appClient.send.call(BridgeParamsFactory.optInAsset(params));
1706
+ return { ...result, return: result.return };
1707
+ },
1708
+ /**
1709
+ * Makes a call to the Bridge smart contract using the `noop()void` ABI method.
1710
+ *
1711
+ * @param params The params for the smart contract call
1712
+ * @returns The call result
1713
+ */
1714
+ noop: async (params = { args: [] }) => {
1715
+ const result = await this.appClient.send.call(BridgeParamsFactory.noop(params));
1716
+ return { ...result, return: result.return };
1717
+ },
1718
+ /**
1719
+ * Makes a call to the Bridge smart contract using the `swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1720
+ *
1721
+ * @param params The params for the smart contract call
1722
+ * @returns The call result
1723
+ */
1724
+ swapAndBridge: async (params) => {
1725
+ const result = await this.appClient.send.call(BridgeParamsFactory.swapAndBridge(params));
1726
+ return {
1727
+ ...result,
1728
+ return: result.return,
1729
+ };
1730
+ },
1731
+ /**
1732
+ * Makes a call to the Bridge smart contract using the `receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void` ABI method.
1733
+ *
1734
+ * @param params The params for the smart contract call
1735
+ * @returns The call result
1736
+ */
1737
+ receiveTokens: async (params) => {
1738
+ const result = await this.appClient.send.call(BridgeParamsFactory.receiveTokens(params));
1739
+ return {
1740
+ ...result,
1741
+ return: result.return,
1742
+ };
1743
+ },
1744
+ /**
1745
+ * Makes a call to the Bridge smart contract using the `registerBridge(byte,byte[32])void` ABI method.
1746
+ *
1747
+ * @param params The params for the smart contract call
1748
+ * @returns The call result
1749
+ */
1750
+ registerBridge: async (params) => {
1751
+ const result = await this.appClient.send.call(BridgeParamsFactory.registerBridge(params));
1752
+ return {
1753
+ ...result,
1754
+ return: result.return,
1755
+ };
1756
+ },
1757
+ /**
1758
+ * Makes a call to the Bridge smart contract using the `addBridgeToken(byte,byte[32])void` ABI method.
1759
+ *
1760
+ * @param params The params for the smart contract call
1761
+ * @returns The call result
1762
+ */
1763
+ addBridgeToken: async (params) => {
1764
+ const result = await this.appClient.send.call(BridgeParamsFactory.addBridgeToken(params));
1765
+ return {
1766
+ ...result,
1767
+ return: result.return,
1768
+ };
1769
+ },
1770
+ /**
1771
+ * Makes a call to the Bridge smart contract using the `removeBridgeToken(byte,byte[32])void` ABI method.
1772
+ *
1773
+ * @param params The params for the smart contract call
1774
+ * @returns The call result
1775
+ */
1776
+ removeBridgeToken: async (params) => {
1777
+ const result = await this.appClient.send.call(BridgeParamsFactory.removeBridgeToken(params));
1778
+ return {
1779
+ ...result,
1780
+ return: result.return,
1781
+ };
1782
+ },
1783
+ /**
1784
+ * Makes a call to the Bridge smart contract using the `withdrawGasTokens(uint64)void` ABI method.
1785
+ *
1786
+ * @param params The params for the smart contract call
1787
+ * @returns The call result
1788
+ */
1789
+ withdrawGasTokens: async (params) => {
1790
+ const result = await this.appClient.send.call(BridgeParamsFactory.withdrawGasTokens(params));
1791
+ return {
1792
+ ...result,
1793
+ return: result.return,
1794
+ };
1795
+ },
1796
+ /**
1797
+ * Makes a call to the Bridge smart contract using the `withdrawBridgingFeeInTokens(uint64)void` ABI method.
1798
+ *
1799
+ * @param params The params for the smart contract call
1800
+ * @returns The call result
1801
+ */
1802
+ withdrawBridgingFeeInTokens: async (params) => {
1803
+ const result = await this.appClient.send.call(BridgeParamsFactory.withdrawBridgingFeeInTokens(params));
1804
+ return {
1805
+ ...result,
1806
+ return: result.return,
1807
+ };
1808
+ },
1809
+ /**
1810
+ * Makes a call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
1811
+ *
1812
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1813
+ *
1814
+ * @param params The params for the smart contract call
1815
+ * @returns The call result
1816
+ */
1817
+ getBridgingCostInTokens: async (params) => {
1818
+ const result = await this.appClient.send.call(BridgeParamsFactory.getBridgingCostInTokens(params));
1819
+ return {
1820
+ ...result,
1821
+ return: result.return,
1822
+ };
1823
+ },
1824
+ /**
1825
+ * Makes a call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
1826
+ *
1827
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1828
+ *
1829
+ * @param params The params for the smart contract call
1830
+ * @returns The call result
1831
+ */
1832
+ hashMessage: async (params) => {
1833
+ const result = await this.appClient.send.call(BridgeParamsFactory.hashMessage(params));
1834
+ return {
1835
+ ...result,
1836
+ return: result.return,
1837
+ };
1838
+ },
1839
+ /**
1840
+ * Makes a call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
1841
+ *
1842
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1843
+ *
1844
+ * @param params The params for the smart contract call
1845
+ * @returns The call result
1846
+ */
1847
+ isOtherBridgeTokenSupported: async (params) => {
1848
+ const result = await this.appClient.send.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
1849
+ return {
1850
+ ...result,
1851
+ return: result.return,
1852
+ };
1853
+ },
1854
+ /**
1855
+ * Makes a call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
1856
+ *
1857
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1858
+ *
1859
+ * @param params The params for the smart contract call
1860
+ * @returns The call result
1861
+ */
1862
+ getTransactionCost: async (params) => {
1863
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionCost(params));
1864
+ return {
1865
+ ...result,
1866
+ return: result.return,
1867
+ };
1868
+ },
1869
+ /**
1870
+ * Makes a call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
1871
+ *
1872
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1873
+ *
1874
+ * @param params The params for the smart contract call
1875
+ * @returns The call result
1876
+ */
1877
+ getReceiveTokensCost: async (params = { args: [] }) => {
1878
+ const result = await this.appClient.send.call(BridgeParamsFactory.getReceiveTokensCost(params));
1879
+ return {
1880
+ ...result,
1881
+ return: result.return,
1882
+ };
1883
+ },
1884
+ /**
1885
+ * Makes a call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
1886
+ *
1887
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1888
+ *
1889
+ * @param params The params for the smart contract call
1890
+ * @returns The call result
1891
+ */
1892
+ getSendTransactionStorageCost: async (params = { args: [] }) => {
1893
+ const result = await this.appClient.send.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
1894
+ return {
1895
+ ...result,
1896
+ return: result.return,
1897
+ };
1898
+ },
1899
+ /**
1900
+ * Makes a call to the Bridge smart contract using the `swap(uint64,uint64,address,uint64)void` ABI method.
1901
+ *
1902
+ * @param params The params for the smart contract call
1903
+ * @returns The call result
1904
+ */
1905
+ swap: async (params) => {
1906
+ const result = await this.appClient.send.call(BridgeParamsFactory.swap(params));
1907
+ return {
1908
+ ...result,
1909
+ return: result.return,
1910
+ };
1911
+ },
1912
+ /**
1913
+ * Makes a call to the Bridge smart contract using the `addPool(uint64,uint64)void` ABI method.
1914
+ *
1915
+ * @param params The params for the smart contract call
1916
+ * @returns The call result
1917
+ */
1918
+ addPool: async (params) => {
1919
+ const result = await this.appClient.send.call(BridgeParamsFactory.addPool(params));
1920
+ return { ...result, return: result.return };
1921
+ },
1922
+ /**
1923
+ * Makes a call to the Bridge smart contract using the `removePool(uint64)void` ABI method.
1924
+ *
1925
+ * @param params The params for the smart contract call
1926
+ * @returns The call result
1927
+ */
1928
+ removePool: async (params) => {
1929
+ const result = await this.appClient.send.call(BridgeParamsFactory.removePool(params));
1930
+ return { ...result, return: result.return };
1931
+ },
1932
+ /**
1933
+ * Makes a call to the Bridge smart contract using the `stopSwap()void` ABI method.
1934
+ *
1935
+ * @param params The params for the smart contract call
1936
+ * @returns The call result
1937
+ */
1938
+ stopSwap: async (params = { args: [] }) => {
1939
+ const result = await this.appClient.send.call(BridgeParamsFactory.stopSwap(params));
1940
+ return { ...result, return: result.return };
1941
+ },
1942
+ /**
1943
+ * Makes a call to the Bridge smart contract using the `startSwap()void` ABI method.
1944
+ *
1945
+ * @param params The params for the smart contract call
1946
+ * @returns The call result
1947
+ */
1948
+ startSwap: async (params = { args: [] }) => {
1949
+ const result = await this.appClient.send.call(BridgeParamsFactory.startSwap(params));
1950
+ return { ...result, return: result.return };
1951
+ },
1952
+ /**
1953
+ * Makes a call to the Bridge smart contract using the `setStopAuthority(address)void` ABI method.
1954
+ *
1955
+ * @param params The params for the smart contract call
1956
+ * @returns The call result
1957
+ */
1958
+ setStopAuthority: async (params) => {
1959
+ const result = await this.appClient.send.call(BridgeParamsFactory.setStopAuthority(params));
1960
+ return {
1961
+ ...result,
1962
+ return: result.return,
1963
+ };
1964
+ },
1965
+ /**
1966
+ * Makes a call to the Bridge smart contract using the `setRebalancer(address)void` ABI method.
1967
+ *
1968
+ * @param params The params for the smart contract call
1969
+ * @returns The call result
1970
+ */
1971
+ setRebalancer: async (params) => {
1972
+ const result = await this.appClient.send.call(BridgeParamsFactory.setRebalancer(params));
1973
+ return { ...result, return: result.return };
1974
+ },
1975
+ /**
1976
+ * Makes a call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
1977
+ *
1978
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1979
+ *
1980
+ * @param params The params for the smart contract call
1981
+ * @returns The call result
1982
+ */
1983
+ getGasUsage: async (params) => {
1984
+ const result = await this.appClient.send.call(BridgeParamsFactory.getGasUsage(params));
1985
+ return { ...result, return: result.return };
1986
+ },
1987
+ /**
1988
+ * Makes a call to the Bridge smart contract using the `setGasUsage(byte,uint64)void` ABI method.
1989
+ *
1990
+ * @param params The params for the smart contract call
1991
+ * @returns The call result
1992
+ */
1993
+ setGasUsage: async (params) => {
1994
+ const result = await this.appClient.send.call(BridgeParamsFactory.setGasUsage(params));
1995
+ return {
1996
+ ...result,
1997
+ return: result.return,
1998
+ };
1999
+ },
2000
+ /**
2001
+ * Makes a call to the Bridge smart contract using the `setGasOracle(application)void` ABI method.
2002
+ *
2003
+ * @param params The params for the smart contract call
2004
+ * @returns The call result
2005
+ */
2006
+ setGasOracle: async (params) => {
2007
+ const result = await this.appClient.send.call(BridgeParamsFactory.setGasOracle(params));
2008
+ return {
2009
+ ...result,
2010
+ return: result.return,
2011
+ };
2012
+ },
2013
+ /**
2014
+ * Makes a call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
2015
+ *
2016
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2017
+ *
2018
+ * @param params The params for the smart contract call
2019
+ * @returns The call result
2020
+ */
2021
+ getTransactionRelayerCost: async (params) => {
2022
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionRelayerCost(params));
2023
+ return {
2024
+ ...result,
2025
+ return: result.return,
2026
+ };
2027
+ },
2028
+ /**
2029
+ * Makes a call to the Bridge smart contract using the `transferOwnership(address)void` ABI method.
2030
+ *
2031
+ * @param params The params for the smart contract call
2032
+ * @returns The call result
2033
+ */
2034
+ transferOwnership: async (params) => {
2035
+ const result = await this.appClient.send.call(BridgeParamsFactory.transferOwnership(params));
2036
+ return {
2037
+ ...result,
2038
+ return: result.return,
2039
+ };
2040
+ },
2041
+ };
2042
+ /**
2043
+ * Clone this app client with different params
2044
+ *
2045
+ * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
2046
+ * @returns A new app client with the altered params
2047
+ */
2048
+ clone(params) {
2049
+ return new BridgeClient(this.appClient.clone(params));
2050
+ }
2051
+ /**
2052
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getBridgingCostInTokens(byte,uint64)uint64` ABI method.
2053
+ *
2054
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2055
+ *
2056
+ * @param params The params for the smart contract call
2057
+ * @returns The call result
2058
+ */
2059
+ async getBridgingCostInTokens(params) {
2060
+ const result = await this.appClient.send.call(BridgeParamsFactory.getBridgingCostInTokens(params));
2061
+ return result.return;
2062
+ }
2063
+ /**
2064
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]` ABI method.
2065
+ *
2066
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2067
+ *
2068
+ * @param params The params for the smart contract call
2069
+ * @returns The call result
2070
+ */
2071
+ async hashMessage(params) {
2072
+ const result = await this.appClient.send.call(BridgeParamsFactory.hashMessage(params));
2073
+ return result.return;
2074
+ }
2075
+ /**
2076
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `isOtherBridgeTokenSupported(byte,byte[32])bool` ABI method.
2077
+ *
2078
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2079
+ *
2080
+ * @param params The params for the smart contract call
2081
+ * @returns The call result
2082
+ */
2083
+ async isOtherBridgeTokenSupported(params) {
2084
+ const result = await this.appClient.send.call(BridgeParamsFactory.isOtherBridgeTokenSupported(params));
2085
+ return result.return;
2086
+ }
2087
+ /**
2088
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getTransactionCost(byte)uint64` ABI method.
2089
+ *
2090
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2091
+ *
2092
+ * @param params The params for the smart contract call
2093
+ * @returns The call result
2094
+ */
2095
+ async getTransactionCost(params) {
2096
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionCost(params));
2097
+ return result.return;
2098
+ }
2099
+ /**
2100
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getReceiveTokensCost()uint64` ABI method.
2101
+ *
2102
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2103
+ *
2104
+ * @param params The params for the smart contract call
2105
+ * @returns The call result
2106
+ */
2107
+ async getReceiveTokensCost(params = { args: [] }) {
2108
+ const result = await this.appClient.send.call(BridgeParamsFactory.getReceiveTokensCost(params));
2109
+ return result.return;
2110
+ }
2111
+ /**
2112
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getSendTransactionStorageCost()uint64` ABI method.
2113
+ *
2114
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2115
+ *
2116
+ * @param params The params for the smart contract call
2117
+ * @returns The call result
2118
+ */
2119
+ async getSendTransactionStorageCost(params = { args: [] }) {
2120
+ const result = await this.appClient.send.call(BridgeParamsFactory.getSendTransactionStorageCost(params));
2121
+ return result.return;
2122
+ }
2123
+ /**
2124
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getGasUsage(byte)uint64` ABI method.
2125
+ *
2126
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2127
+ *
2128
+ * @param params The params for the smart contract call
2129
+ * @returns The call result
2130
+ */
2131
+ async getGasUsage(params) {
2132
+ const result = await this.appClient.send.call(BridgeParamsFactory.getGasUsage(params));
2133
+ return result.return;
2134
+ }
2135
+ /**
2136
+ * Makes a readonly (simulated) call to the Bridge smart contract using the `getTransactionRelayerCost(byte)uint64` ABI method.
2137
+ *
2138
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
2139
+ *
2140
+ * @param params The params for the smart contract call
2141
+ * @returns The call result
2142
+ */
2143
+ async getTransactionRelayerCost(params) {
2144
+ const result = await this.appClient.send.call(BridgeParamsFactory.getTransactionRelayerCost(params));
2145
+ return result.return;
2146
+ }
2147
+ /**
2148
+ * Methods to access state for the current Bridge app
2149
+ */
2150
+ state = {
2151
+ /**
2152
+ * Methods to access global state for the current Bridge app
2153
+ */
2154
+ global: {
2155
+ /**
2156
+ * Get all current keyed values from global state
2157
+ */
2158
+ getAll: async () => {
2159
+ const result = await this.appClient.state.global.getAll();
2160
+ return {
2161
+ chainId: result.chainId,
2162
+ messenger: result.messenger,
2163
+ stopAuthority: result.stopAuthority,
2164
+ rebalancer: result.rebalancer,
2165
+ canSwap: result.canSwap,
2166
+ gasOracle: result.gasOracle,
2167
+ owner: result.owner,
2168
+ };
2169
+ },
2170
+ /**
2171
+ * Get the current value of the chainId key in global state
2172
+ */
2173
+ chainId: async () => {
2174
+ return (await this.appClient.state.global.getValue("chainId"));
2175
+ },
2176
+ /**
2177
+ * Get the current value of the messenger key in global state
2178
+ */
2179
+ messenger: async () => {
2180
+ return (await this.appClient.state.global.getValue("messenger"));
2181
+ },
2182
+ /**
2183
+ * Get the current value of the stopAuthority key in global state
2184
+ */
2185
+ stopAuthority: async () => {
2186
+ return (await this.appClient.state.global.getValue("stopAuthority"));
2187
+ },
2188
+ /**
2189
+ * Get the current value of the rebalancer key in global state
2190
+ */
2191
+ rebalancer: async () => {
2192
+ return (await this.appClient.state.global.getValue("rebalancer"));
2193
+ },
2194
+ /**
2195
+ * Get the current value of the canSwap key in global state
2196
+ */
2197
+ canSwap: async () => {
2198
+ return (await this.appClient.state.global.getValue("canSwap"));
2199
+ },
2200
+ /**
2201
+ * Get the current value of the gasOracle key in global state
2202
+ */
2203
+ gasOracle: async () => {
2204
+ return (await this.appClient.state.global.getValue("gasOracle"));
2205
+ },
2206
+ /**
2207
+ * Get the current value of the owner key in global state
2208
+ */
2209
+ owner: async () => {
2210
+ return (await this.appClient.state.global.getValue("owner"));
2211
+ },
2212
+ },
2213
+ /**
2214
+ * Methods to access box state for the current Bridge app
2215
+ */
2216
+ box: {
2217
+ /**
2218
+ * Get all current keyed values from box state
2219
+ */
2220
+ getAll: async () => {
2221
+ const result = await this.appClient.state.box.getAll();
2222
+ return {};
2223
+ },
2224
+ /**
2225
+ * Get values from the processedMessages map in box state
2226
+ */
2227
+ processedMessages: {
2228
+ /**
2229
+ * Get all current values of the processedMessages map in box state
2230
+ */
2231
+ getMap: async () => {
2232
+ return (await this.appClient.state.box.getMap("processedMessages"));
2233
+ },
2234
+ /**
2235
+ * Get a current value of the processedMessages map by key from box state
2236
+ */
2237
+ value: async (key) => {
2238
+ return (await this.appClient.state.box.getMapValue("processedMessages", key));
2239
+ },
2240
+ },
2241
+ /**
2242
+ * Get values from the sentMessages map in box state
2243
+ */
2244
+ sentMessages: {
2245
+ /**
2246
+ * Get all current values of the sentMessages map in box state
2247
+ */
2248
+ getMap: async () => {
2249
+ return (await this.appClient.state.box.getMap("sentMessages"));
2250
+ },
2251
+ /**
2252
+ * Get a current value of the sentMessages map by key from box state
2253
+ */
2254
+ value: async (key) => {
2255
+ return (await this.appClient.state.box.getMapValue("sentMessages", key));
2256
+ },
2257
+ },
2258
+ /**
2259
+ * Get values from the otherBridges map in box state
2260
+ */
2261
+ otherBridges: {
2262
+ /**
2263
+ * Get all current values of the otherBridges map in box state
2264
+ */
2265
+ getMap: async () => {
2266
+ return (await this.appClient.state.box.getMap("otherBridges"));
2267
+ },
2268
+ /**
2269
+ * Get a current value of the otherBridges map by key from box state
2270
+ */
2271
+ value: async (key) => {
2272
+ return (await this.appClient.state.box.getMapValue("otherBridges", key));
2273
+ },
2274
+ },
2275
+ /**
2276
+ * Get values from the otherBridgeTokens map in box state
2277
+ */
2278
+ otherBridgeTokens: {
2279
+ /**
2280
+ * Get all current values of the otherBridgeTokens map in box state
2281
+ */
2282
+ getMap: async () => {
2283
+ return (await this.appClient.state.box.getMap("otherBridgeTokens"));
2284
+ },
2285
+ /**
2286
+ * Get a current value of the otherBridgeTokens map by key from box state
2287
+ */
2288
+ value: async (key) => {
2289
+ return (await this.appClient.state.box.getMapValue("otherBridgeTokens", key));
2290
+ },
2291
+ },
2292
+ /**
2293
+ * Get values from the pools map in box state
2294
+ */
2295
+ pools: {
2296
+ /**
2297
+ * Get all current values of the pools map in box state
2298
+ */
2299
+ getMap: async () => {
2300
+ return (await this.appClient.state.box.getMap("pools"));
2301
+ },
2302
+ /**
2303
+ * Get a current value of the pools map by key from box state
2304
+ */
2305
+ value: async (key) => {
2306
+ return (await this.appClient.state.box.getMapValue("pools", key));
2307
+ },
2308
+ },
2309
+ /**
2310
+ * Get values from the fromGasOracleScalingFactor map in box state
2311
+ */
2312
+ fromGasOracleScalingFactor: {
2313
+ /**
2314
+ * Get all current values of the fromGasOracleScalingFactor map in box state
2315
+ */
2316
+ getMap: async () => {
2317
+ return (await this.appClient.state.box.getMap("fromGasOracleScalingFactor"));
2318
+ },
2319
+ /**
2320
+ * Get a current value of the fromGasOracleScalingFactor map by key from box state
2321
+ */
2322
+ value: async (key) => {
2323
+ return (await this.appClient.state.box.getMapValue("fromGasOracleScalingFactor", key));
2324
+ },
2325
+ },
2326
+ /**
2327
+ * Get values from the bridgingFeeConversionScalingFactor map in box state
2328
+ */
2329
+ bridgingFeeConversionScalingFactor: {
2330
+ /**
2331
+ * Get all current values of the bridgingFeeConversionScalingFactor map in box state
2332
+ */
2333
+ getMap: async () => {
2334
+ return (await this.appClient.state.box.getMap("bridgingFeeConversionScalingFactor"));
2335
+ },
2336
+ /**
2337
+ * Get a current value of the bridgingFeeConversionScalingFactor map by key from box state
2338
+ */
2339
+ value: async (key) => {
2340
+ return (await this.appClient.state.box.getMapValue("bridgingFeeConversionScalingFactor", key));
2341
+ },
2342
+ },
2343
+ /**
2344
+ * Get values from the gasUsage map in box state
2345
+ */
2346
+ gasUsage: {
2347
+ /**
2348
+ * Get all current values of the gasUsage map in box state
2349
+ */
2350
+ getMap: async () => {
2351
+ return (await this.appClient.state.box.getMap("gasUsage"));
2352
+ },
2353
+ /**
2354
+ * Get a current value of the gasUsage map by key from box state
2355
+ */
2356
+ value: async (key) => {
2357
+ return (await this.appClient.state.box.getMapValue("gasUsage", key));
2358
+ },
2359
+ },
2360
+ },
2361
+ };
2362
+ newGroup() {
2363
+ const client = this;
2364
+ const composer = this.algorand.newGroup();
2365
+ let promiseChain = Promise.resolve();
2366
+ const resultMappers = [];
2367
+ return {
2368
+ /**
2369
+ * Add a optInAsset(uint64)void method call against the Bridge contract
2370
+ */
2371
+ optInAsset(params) {
2372
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInAsset(params)));
2373
+ resultMappers.push(undefined);
2374
+ return this;
2375
+ },
2376
+ /**
2377
+ * Add a noop()void method call against the Bridge contract
2378
+ */
2379
+ noop(params) {
2380
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.noop(params)));
2381
+ resultMappers.push(undefined);
2382
+ return this;
2383
+ },
2384
+ /**
2385
+ * Add a swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void method call against the Bridge contract
2386
+ */
2387
+ swapAndBridge(params) {
2388
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.swapAndBridge(params)));
2389
+ resultMappers.push(undefined);
2390
+ return this;
2391
+ },
2392
+ /**
2393
+ * Add a receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void method call against the Bridge contract
2394
+ */
2395
+ receiveTokens(params) {
2396
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.receiveTokens(params)));
2397
+ resultMappers.push(undefined);
2398
+ return this;
2399
+ },
2400
+ /**
2401
+ * Add a registerBridge(byte,byte[32])void method call against the Bridge contract
2402
+ */
2403
+ registerBridge(params) {
2404
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.registerBridge(params)));
2405
+ resultMappers.push(undefined);
2406
+ return this;
2407
+ },
2408
+ /**
2409
+ * Add a addBridgeToken(byte,byte[32])void method call against the Bridge contract
2410
+ */
2411
+ addBridgeToken(params) {
2412
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addBridgeToken(params)));
2413
+ resultMappers.push(undefined);
2414
+ return this;
2415
+ },
2416
+ /**
2417
+ * Add a removeBridgeToken(byte,byte[32])void method call against the Bridge contract
2418
+ */
2419
+ removeBridgeToken(params) {
2420
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeBridgeToken(params)));
2421
+ resultMappers.push(undefined);
2422
+ return this;
2423
+ },
2424
+ /**
2425
+ * Add a withdrawGasTokens(uint64)void method call against the Bridge contract
2426
+ */
2427
+ withdrawGasTokens(params) {
2428
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdrawGasTokens(params)));
2429
+ resultMappers.push(undefined);
2430
+ return this;
2431
+ },
2432
+ /**
2433
+ * Add a withdrawBridgingFeeInTokens(uint64)void method call against the Bridge contract
2434
+ */
2435
+ withdrawBridgingFeeInTokens(params) {
2436
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdrawBridgingFeeInTokens(params)));
2437
+ resultMappers.push(undefined);
2438
+ return this;
2439
+ },
2440
+ /**
2441
+ * Add a getBridgingCostInTokens(byte,uint64)uint64 method call against the Bridge contract
2442
+ */
2443
+ getBridgingCostInTokens(params) {
2444
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getBridgingCostInTokens(params)));
2445
+ resultMappers.push((v) => client.decodeReturnValue("getBridgingCostInTokens(byte,uint64)uint64", v));
2446
+ return this;
2447
+ },
2448
+ /**
2449
+ * Add a hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32] method call against the Bridge contract
2450
+ */
2451
+ hashMessage(params) {
2452
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hashMessage(params)));
2453
+ resultMappers.push((v) => client.decodeReturnValue("hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]", v));
2454
+ return this;
2455
+ },
2456
+ /**
2457
+ * Add a isOtherBridgeTokenSupported(byte,byte[32])bool method call against the Bridge contract
2458
+ */
2459
+ isOtherBridgeTokenSupported(params) {
2460
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.isOtherBridgeTokenSupported(params)));
2461
+ resultMappers.push((v) => client.decodeReturnValue("isOtherBridgeTokenSupported(byte,byte[32])bool", v));
2462
+ return this;
2463
+ },
2464
+ /**
2465
+ * Add a getTransactionCost(byte)uint64 method call against the Bridge contract
2466
+ */
2467
+ getTransactionCost(params) {
2468
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTransactionCost(params)));
2469
+ resultMappers.push((v) => client.decodeReturnValue("getTransactionCost(byte)uint64", v));
2470
+ return this;
2471
+ },
2472
+ /**
2473
+ * Add a getReceiveTokensCost()uint64 method call against the Bridge contract
2474
+ */
2475
+ getReceiveTokensCost(params) {
2476
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getReceiveTokensCost(params)));
2477
+ resultMappers.push((v) => client.decodeReturnValue("getReceiveTokensCost()uint64", v));
2478
+ return this;
2479
+ },
2480
+ /**
2481
+ * Add a getSendTransactionStorageCost()uint64 method call against the Bridge contract
2482
+ */
2483
+ getSendTransactionStorageCost(params) {
2484
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getSendTransactionStorageCost(params)));
2485
+ resultMappers.push((v) => client.decodeReturnValue("getSendTransactionStorageCost()uint64", v));
2486
+ return this;
2487
+ },
2488
+ /**
2489
+ * Add a swap(uint64,uint64,address,uint64)void method call against the Bridge contract
2490
+ */
2491
+ swap(params) {
2492
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.swap(params)));
2493
+ resultMappers.push(undefined);
2494
+ return this;
2495
+ },
2496
+ /**
2497
+ * Add a addPool(uint64,uint64)void method call against the Bridge contract
2498
+ */
2499
+ addPool(params) {
2500
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addPool(params)));
2501
+ resultMappers.push(undefined);
2502
+ return this;
2503
+ },
2504
+ /**
2505
+ * Add a removePool(uint64)void method call against the Bridge contract
2506
+ */
2507
+ removePool(params) {
2508
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removePool(params)));
2509
+ resultMappers.push(undefined);
2510
+ return this;
2511
+ },
2512
+ /**
2513
+ * Add a stopSwap()void method call against the Bridge contract
2514
+ */
2515
+ stopSwap(params) {
2516
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stopSwap(params)));
2517
+ resultMappers.push(undefined);
2518
+ return this;
2519
+ },
2520
+ /**
2521
+ * Add a startSwap()void method call against the Bridge contract
2522
+ */
2523
+ startSwap(params) {
2524
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.startSwap(params)));
2525
+ resultMappers.push(undefined);
2526
+ return this;
2527
+ },
2528
+ /**
2529
+ * Add a setStopAuthority(address)void method call against the Bridge contract
2530
+ */
2531
+ setStopAuthority(params) {
2532
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setStopAuthority(params)));
2533
+ resultMappers.push(undefined);
2534
+ return this;
2535
+ },
2536
+ /**
2537
+ * Add a setRebalancer(address)void method call against the Bridge contract
2538
+ */
2539
+ setRebalancer(params) {
2540
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setRebalancer(params)));
2541
+ resultMappers.push(undefined);
2542
+ return this;
2543
+ },
2544
+ /**
2545
+ * Add a getGasUsage(byte)uint64 method call against the Bridge contract
2546
+ */
2547
+ getGasUsage(params) {
2548
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getGasUsage(params)));
2549
+ resultMappers.push((v) => client.decodeReturnValue("getGasUsage(byte)uint64", v));
2550
+ return this;
2551
+ },
2552
+ /**
2553
+ * Add a setGasUsage(byte,uint64)void method call against the Bridge contract
2554
+ */
2555
+ setGasUsage(params) {
2556
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setGasUsage(params)));
2557
+ resultMappers.push(undefined);
2558
+ return this;
2559
+ },
2560
+ /**
2561
+ * Add a setGasOracle(application)void method call against the Bridge contract
2562
+ */
2563
+ setGasOracle(params) {
2564
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setGasOracle(params)));
2565
+ resultMappers.push(undefined);
2566
+ return this;
2567
+ },
2568
+ /**
2569
+ * Add a getTransactionRelayerCost(byte)uint64 method call against the Bridge contract
2570
+ */
2571
+ getTransactionRelayerCost(params) {
2572
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTransactionRelayerCost(params)));
2573
+ resultMappers.push((v) => client.decodeReturnValue("getTransactionRelayerCost(byte)uint64", v));
2574
+ return this;
2575
+ },
2576
+ /**
2577
+ * Add a transferOwnership(address)void method call against the Bridge contract
2578
+ */
2579
+ transferOwnership(params) {
2580
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.transferOwnership(params)));
2581
+ resultMappers.push(undefined);
2582
+ return this;
2583
+ },
2584
+ /**
2585
+ * Add a clear state call to the Bridge contract
2586
+ */
2587
+ clearState(params) {
2588
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
2589
+ return this;
2590
+ },
2591
+ addTransaction(txn, signer) {
2592
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
2593
+ return this;
2594
+ },
2595
+ async composer() {
2596
+ await promiseChain;
2597
+ return composer;
2598
+ },
2599
+ async simulate(options) {
2600
+ await promiseChain;
2601
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
2602
+ return {
2603
+ ...result,
2604
+ returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i](val) : val.returnValue),
2605
+ };
2606
+ },
2607
+ async send(params) {
2608
+ await promiseChain;
2609
+ const result = await composer.send(params);
2610
+ return {
2611
+ ...result,
2612
+ returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i](val) : val.returnValue),
2613
+ };
2614
+ },
2615
+ };
2616
+ }
2617
+ }
2618
+ exports.BridgeClient = BridgeClient;
2619
+ //# sourceMappingURL=BridgeClient.js.map