@alpha-arcade/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +367 -0
- package/dist/index.cjs +2178 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +535 -0
- package/dist/index.d.ts +535 -0
- package/dist/index.js +2146 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2178 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var algosdk2 = require('algosdk');
|
|
4
|
+
var algokit3 = require('@algorandfoundation/algokit-utils');
|
|
5
|
+
var decimal_js = require('decimal.js');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var algosdk2__default = /*#__PURE__*/_interopDefault(algosdk2);
|
|
28
|
+
var algokit3__namespace = /*#__PURE__*/_interopNamespace(algokit3);
|
|
29
|
+
|
|
30
|
+
// src/modules/trading.ts
|
|
31
|
+
var APP_SPEC = {
|
|
32
|
+
"hints": {
|
|
33
|
+
"on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8": {
|
|
34
|
+
"call_config": {
|
|
35
|
+
"no_op": "CREATE"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"create_escrow(uint64,uint64,uint64,uint8)uint64": {
|
|
39
|
+
"call_config": {
|
|
40
|
+
"no_op": "CALL"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"activate_market()uint8": {
|
|
44
|
+
"call_config": {
|
|
45
|
+
"no_op": "CALL"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"process_potential_match(application,application)uint8": {
|
|
49
|
+
"call_config": {
|
|
50
|
+
"no_op": "CALL"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"resolve_market(uint8)uint8": {
|
|
54
|
+
"call_config": {
|
|
55
|
+
"no_op": "CALL"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"merge_shares()uint8": {
|
|
59
|
+
"call_config": {
|
|
60
|
+
"no_op": "CALL"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"split_shares()uint8": {
|
|
64
|
+
"call_config": {
|
|
65
|
+
"no_op": "CALL"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"claim()uint8": {
|
|
69
|
+
"call_config": {
|
|
70
|
+
"no_op": "CALL"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"donate_excess_to_market_friend()uint8": {
|
|
74
|
+
"call_config": {
|
|
75
|
+
"no_op": "CALL"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"delete_escrow(uint64,address)uint8": {
|
|
79
|
+
"call_config": {
|
|
80
|
+
"no_op": "CALL"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"delete()uint8": {
|
|
84
|
+
"call_config": {
|
|
85
|
+
"delete_application": "CALL"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"do_noop(uint64)uint64": {
|
|
89
|
+
"call_config": {
|
|
90
|
+
"no_op": "CALL"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"on_update()uint64": {
|
|
94
|
+
"call_config": {
|
|
95
|
+
"update_application": "CALL"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"source": {
|
|
100
|
+
"approval": "I3ByYWdtYSB2ZXJzaW9uIDgKaW50Y2Jsb2NrIDEgMCAyIDI1NiAxMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAwMDAgMTg0NDY3NDQwNzM3MDk1NTE2MTUKYnl0ZWNibG9jayAweDYzNmY2YzZjNjE3NDY1NzI2MTZjNWY2MTczNzM2NTc0NWY2OTY0IDB4Nzk2NTczNWY3Mzc1NzA3MDZjNzkgMHg2ZTZmNWY3Mzc1NzA3MDZjNzkgMHg3OTY1NzM1ZjYxNzM3MzY1NzQ1ZjY5NjQgMHg2ZTZmNWY2MTczNzM2NTc0NWY2OTY0IDB4MTUxZjdjNzUgMHg3MDZmNzM2OTc0Njk2ZjZlIDB4MDAgMHg2OTczNWY3MjY1NzM2ZjZjNzY2NTY0IDB4NmQ2MTcyNmI2NTc0NWY2NjcyNjk2NTZlNjQ1ZjYxNjQ2NDcyIDB4NzA3MjY5NjM2NSAweDczNjk2NDY1IDB4IDB4NmY3NzZlNjU3MiAweDY5NzM1ZjYxNjM3NDY5NzY2MTc0NjU2NCAweDY2NjU2NTVmNjI2MTczNjU1ZjcwNjU3MjYzNjU2ZTc0IDB4NmQ2MTcyNmI2NTc0NWY2MTcwNzA1ZjY5NjQgMHg3MzZjNjk3MDcwNjE2NzY1IDB4NmY3NTc0NjM2ZjZkNjUgMHgxMTllM2M0YiAweDZmNzI2MTYzNmM2NTVmNjE2NDY0NzI2NTczNzMgMHg2NjY1NjU1ZjYxNjQ2NDcyNjU3MzczIDB4NjU3MzYzNzI2Zjc3NWY2MzYxNmU2MzY1NmM1ZjYxNjQ2NDcyNjU3MzczIDB4NDE2YzcwNjg2MTIwNGQ2MTcyNmI2NTc0MjAgMHg2ODc0NzQ3MDczM2EyZjJmNzc3Nzc3MmU2MTZjNzA2ODYxNjE3MjYzNjE2NDY1MmU2MzZmNmQyZjZkNjE3MjZiNjU3NDJmIDB4NjY2NTY1NWY3NDY5NmQ2NTcyNWY3Mzc0NjE3Mjc0CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4YmE4ZDYxY2IgLy8gIm9uX2NyZWF0ZShzdHJpbmcsdWludDY0LGFkZHJlc3MsdWludDY0LGFkZHJlc3Msc3RyaW5nLGFkZHJlc3MsdWludDY0LHVpbnQ2NCxhZGRyZXNzKXVpbnQ4Igo9PQpibnogbWFpbl9sMjYKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhlMTFhZjJhMCAvLyAiY3JlYXRlX2VzY3Jvdyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCl1aW50NjQiCj09CmJueiBtYWluX2wyNQp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweDAyYTRlMzA5IC8vICJhY3RpdmF0ZV9tYXJrZXQoKXVpbnQ4Igo9PQpibnogbWFpbl9sMjQKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhiYTFkZWVmNSAvLyAicHJvY2Vzc19wb3RlbnRpYWxfbWF0Y2goYXBwbGljYXRpb24sYXBwbGljYXRpb24pdWludDgiCj09CmJueiBtYWluX2wyMwp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweGZiZGJmMTExIC8vICJyZXNvbHZlX21hcmtldCh1aW50OCl1aW50OCIKPT0KYm56IG1haW5fbDIyCnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4OGM1ZGIwNTYgLy8gIm1lcmdlX3NoYXJlcygpdWludDgiCj09CmJueiBtYWluX2wyMQp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweDgzMjFiM2JkIC8vICJzcGxpdF9zaGFyZXMoKXVpbnQ4Igo9PQpibnogbWFpbl9sMjAKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHgzMjAwNjIzYiAvLyAiY2xhaW0oKXVpbnQ4Igo9PQpibnogbWFpbl9sMTkKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhhN2ExNTcxZSAvLyAiZG9uYXRlX2V4Y2Vzc190b19tYXJrZXRfZnJpZW5kKCl1aW50OCIKPT0KYm56IG1haW5fbDE4CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4NDI1ZGViM2QgLy8gImRlbGV0ZV9lc2Nyb3codWludDY0LGFkZHJlc3MpdWludDgiCj09CmJueiBtYWluX2wxNwp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCmJ5dGVjIDE5IC8vICJkZWxldGUoKXVpbnQ4Igo9PQpibnogbWFpbl9sMTYKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhiNGYxMWExOCAvLyAiZG9fbm9vcCh1aW50NjQpdWludDY0Igo9PQpibnogbWFpbl9sMTUKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHgyNGMzZDIzNCAvLyAib25fdXBkYXRlKCl1aW50NjQiCj09CmJueiBtYWluX2wxNAplcnIKbWFpbl9sMTQ6CnR4biBPbkNvbXBsZXRpb24KcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIG9udXBkYXRlY2FzdGVyXzQyCmludGNfMCAvLyAxCnJldHVybgptYWluX2wxNToKdHhuIE9uQ29tcGxldGlvbgppbnRjXzEgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzEgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBkb25vb3BjYXN0ZXJfNDEKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDE2Ogp0eG4gT25Db21wbGV0aW9uCnB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzEgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBkZWxldGVjYXN0ZXJfNDAKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDE3Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIGRlbGV0ZWVzY3Jvd2Nhc3Rlcl8zOQppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMTg6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgZG9uYXRlZXhjZXNzdG9tYXJrZXRmcmllbmRjYXN0ZXJfMzgKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDE5Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIGNsYWltY2FzdGVyXzM3CmludGNfMCAvLyAxCnJldHVybgptYWluX2wyMDoKdHhuIE9uQ29tcGxldGlvbgppbnRjXzEgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzEgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBzcGxpdHNoYXJlc2Nhc3Rlcl8zNgppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMjE6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgbWVyZ2VzaGFyZXNjYXN0ZXJfMzUKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDIyOgp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIHJlc29sdmVtYXJrZXRjYXN0ZXJfMzQKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDIzOgp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIHByb2Nlc3Nwb3RlbnRpYWxtYXRjaGNhc3Rlcl8zMwppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMjQ6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgYWN0aXZhdGVtYXJrZXRjYXN0ZXJfMzIKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDI1Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIGNyZWF0ZWVzY3Jvd2Nhc3Rlcl8zMQppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMjY6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKPT0KJiYKYXNzZXJ0CmNhbGxzdWIgb25jcmVhdGVjYXN0ZXJfMzAKaW50Y18wIC8vIDEKcmV0dXJuCgovLyBkaXZfY2VpbF9ieXRlcwpkaXZjZWlsYnl0ZXNfMDoKcHJvdG8gMiAxCmZyYW1lX2RpZyAtMgpmcmFtZV9kaWcgLTEKYi8Kc3RvcmUgMTIKZnJhbWVfZGlnIC0yCmZyYW1lX2RpZyAtMQpiJQpsZW4KaW50Y18xIC8vIDAKPgpibnogZGl2Y2VpbGJ5dGVzXzBfbDIKbG9hZCAxMgpyZXRzdWIKZGl2Y2VpbGJ5dGVzXzBfbDI6CmxvYWQgMTIKaW50Y18wIC8vIDEKaXRvYgpiKwpyZXRzdWIKCi8vIGNhbGN1bGF0ZV9mZWUKY2FsY3VsYXRlZmVlXzE6CnByb3RvIDMgMQpmcmFtZV9kaWcgLTMKaXRvYgpzdG9yZSAyCmZyYW1lX2RpZyAtMgppdG9iCnN0b3JlIDMKaW50YyA0IC8vIDEwMDAwMDAKZnJhbWVfZGlnIC0yCi0KaXRvYgpzdG9yZSA0CmxvYWQgMgpsb2FkIDMKYioKc3RvcmUgMgpsb2FkIDIKbG9hZCA0CmIqCnN0b3JlIDIKbG9hZCAyCmZyYW1lX2RpZyAtMQppdG9iCmIqCnN0b3JlIDIKbG9hZCAyCmludGMgNSAvLyAxMDAwMDAwMDAwMDAwMDAwMDAwCml0b2IKYi8KYnRvaQpyZXRzdWIKCi8vIGNhbGN1bGF0ZV9mZWVfY29tbWl0CmNhbGN1bGF0ZWZlZWNvbW1pdF8yOgpwcm90byAzIDEKZnJhbWVfZGlnIC0zCml0b2IKc3RvcmUgOQpmcmFtZV9kaWcgLTIKaXRvYgpzdG9yZSAxMAppbnRjIDQgLy8gMTAwMDAwMApmcmFtZV9kaWcgLTIKLQppdG9iCnN0b3JlIDExCmxvYWQgOQpsb2FkIDEwCmIqCnN0b3JlIDkKbG9hZCA5CmxvYWQgMTEKYioKc3RvcmUgOQpsb2FkIDkKZnJhbWVfZGlnIC0xCml0b2IKYioKc3RvcmUgOQpsb2FkIDkKaW50YyA1IC8vIDEwMDAwMDAwMDAwMDAwMDAwMDAKaXRvYgpjYWxsc3ViIGRpdmNlaWxieXRlc18wCmJ0b2kKcmV0c3ViCgovLyBnbG9iYWxfbXVzdF9nZXQKZ2xvYmFsbXVzdGdldF8zOgpwcm90byAyIDEKZnJhbWVfZGlnIC0yCmZyYW1lX2RpZyAtMQphcHBfZ2xvYmFsX2dldF9leApzdG9yZSAxCnN0b3JlIDAKbG9hZCAxCmFzc2VydApsb2FkIDAKcmV0c3ViCgovLyBnZXRfYXBwX2FkZHIKZ2V0YXBwYWRkcl80Ogpwcm90byAxIDEKZnJhbWVfZGlnIC0xCmFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKc3RvcmUgNgpzdG9yZSA1CmxvYWQgNgphc3NlcnQKbG9hZCA1CnJldHN1YgoKLy8gZ2V0X2FwcF9jcmVhdG9yCmdldGFwcGNyZWF0b3JfNToKcHJvdG8gMSAxCmZyYW1lX2RpZyAtMQphcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCnN0b3JlIDE2CnN0b3JlIDE1CmxvYWQgMTYKYXNzZXJ0CmxvYWQgMTUKcmV0c3ViCgovLyBzZW5kX2Fzc2V0CnNlbmRhc3NldF82Ogpwcm90byA0IDAKaXR4bl9iZWdpbgpwdXNoaW50IDQgLy8gYXhmZXIKaXR4bl9maWVsZCBUeXBlRW51bQpmcmFtZV9kaWcgLTQKaXR4bl9maWVsZCBTZW5kZXIKZnJhbWVfZGlnIC0zCml0eG5fZmllbGQgQXNzZXRBbW91bnQKZnJhbWVfZGlnIC0yCml0eG5fZmllbGQgWGZlckFzc2V0CmZyYW1lX2RpZyAtMQppdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKaXR4bl9zdWJtaXQKcmV0c3ViCgovLyBzZW5kX2FsZ28Kc2VuZGFsZ29fNzoKcHJvdG8gMyAwCml0eG5fYmVnaW4KaW50Y18wIC8vIHBheQppdHhuX2ZpZWxkIFR5cGVFbnVtCmZyYW1lX2RpZyAtMwppdHhuX2ZpZWxkIFNlbmRlcgpmcmFtZV9kaWcgLTIKaXR4bl9maWVsZCBBbW91bnQKZnJhbWVfZGlnIC0xCml0eG5fZmllbGQgUmVjZWl2ZXIKaXR4bl9zdWJtaXQKcmV0c3ViCgovLyBnZXRfZnVuZHNfdG9fdHJhZGVyCmdldGZ1bmRzdG90cmFkZXJfODoKcHJvdG8gNCAwCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCnN0b3JlIDgKc3RvcmUgNwpsb2FkIDgKYm56IGdldGZ1bmRzdG90cmFkZXJfOF9sMgpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwpmcmFtZV9kaWcgLTEKZnJhbWVfZGlnIC0yCmZyYW1lX2RpZyAtMwpjYWxsc3ViIHNlbmRhc3NldF82CmIgZ2V0ZnVuZHN0b3RyYWRlcl84X2wzCmdldGZ1bmRzdG90cmFkZXJfOF9sMjoKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKZnJhbWVfZGlnIC0xCmZyYW1lX2RpZyAtMgpmcmFtZV9kaWcgLTQKY2FsbHN1YiBzZW5kYXNzZXRfNgpnZXRmdW5kc3RvdHJhZGVyXzhfbDM6CnJldHN1YgoKLy8gc2FmZV93YWxsZXRfYmFsYW5jZQpzYWZld2FsbGV0YmFsYW5jZV85Ogpwcm90byAyIDEKZnJhbWVfZGlnIC0xCmZyYW1lX2RpZyAtMgphc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKc3RvcmUgMTgKcmV0c3ViCgovLyBvbl9jcmVhdGUKb25jcmVhdGVfMTA6CnByb3RvIDEwIDEKaW50Y18xIC8vIDAKcHVzaGJ5dGVzIDB4NzQ2OTc0NmM2NSAvLyAidGl0bGUiCmZyYW1lX2RpZyAtMTAKZXh0cmFjdCAyIDAKYXBwX2dsb2JhbF9wdXQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKZnJhbWVfZGlnIC05CmFwcF9nbG9iYWxfcHV0CmJ5dGVjIDIwIC8vICJvcmFjbGVfYWRkcmVzcyIKZnJhbWVfZGlnIC04CmFwcF9nbG9iYWxfcHV0CnB1c2hieXRlcyAweDcyNjU3MzZmNmM3NTc0Njk2ZjZlNWY3NDY5NmQ2NSAvLyAicmVzb2x1dGlvbl90aW1lIgpmcmFtZV9kaWcgLTcKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgMTQgLy8gImlzX2FjdGl2YXRlZCIKaW50Y18xIC8vIDAKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmludGNfMSAvLyAwCmFwcF9nbG9iYWxfcHV0CmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKZnJhbWVfZGlnIC02CmFwcF9nbG9iYWxfcHV0CnB1c2hieXRlcyAweDcyNzU2YzY1NzMgLy8gInJ1bGVzIgpmcmFtZV9kaWcgLTUKZXh0cmFjdCAyIDAKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgMjEgLy8gImZlZV9hZGRyZXNzIgpmcmFtZV9kaWcgLTQKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgMTUgLy8gImZlZV9iYXNlX3BlcmNlbnQiCmZyYW1lX2RpZyAtMwphcHBfZ2xvYmFsX3B1dApwdXNoYnl0ZXMgMHg2NjY1NjU1Zjc0Njk2ZDY1NzI1Zjc0Njg3MjY1NzM2ODZmNmM2NCAvLyAiZmVlX3RpbWVyX3RocmVzaG9sZCIKZnJhbWVfZGlnIC0yCmFwcF9nbG9iYWxfcHV0CmJ5dGVjIDIyIC8vICJlc2Nyb3dfY2FuY2VsX2FkZHJlc3MiCmZyYW1lX2RpZyAtMQphcHBfZ2xvYmFsX3B1dAppbnRjXzAgLy8gMQpmcmFtZV9idXJ5IDAKZnJhbWVfZGlnIDAKaW50Y18zIC8vIDI1Ngo8CmFzc2VydApyZXRzdWIKCi8vIGludF90b19hc2NpaQppbnR0b2FzY2lpXzExOgpwcm90byAxIDEKcHVzaGJ5dGVzIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkgLy8gIjAxMjM0NTY3ODkiCmZyYW1lX2RpZyAtMQppbnRjXzAgLy8gMQpleHRyYWN0MwpyZXRzdWIKCi8vIGl0b2EKaXRvYV8xMjoKcHJvdG8gMSAxCmZyYW1lX2RpZyAtMQppbnRjXzEgLy8gMAo9PQpibnogaXRvYV8xMl9sNQpmcmFtZV9kaWcgLTEKcHVzaGludCAxMCAvLyAxMAovCmludGNfMSAvLyAwCj4KYm56IGl0b2FfMTJfbDQKYnl0ZWMgMTIgLy8gIiIKaXRvYV8xMl9sMzoKZnJhbWVfZGlnIC0xCnB1c2hpbnQgMTAgLy8gMTAKJQpjYWxsc3ViIGludHRvYXNjaWlfMTEKY29uY2F0CmIgaXRvYV8xMl9sNgppdG9hXzEyX2w0OgpmcmFtZV9kaWcgLTEKcHVzaGludCAxMCAvLyAxMAovCmNhbGxzdWIgaXRvYV8xMgpiIGl0b2FfMTJfbDMKaXRvYV8xMl9sNToKcHVzaGJ5dGVzIDB4MzAgLy8gIjAiCml0b2FfMTJfbDY6CnJldHN1YgoKLy8gc2V0dXBfZXNjcm93CnNldHVwZXNjcm93XzEzOgpwcm90byA3IDAKaXR4bl9iZWdpbgppbnRjXzAgLy8gcGF5Cml0eG5fZmllbGQgVHlwZUVudW0KZnJhbWVfZGlnIC03CmNhbGxzdWIgZ2V0YXBwYWRkcl80Cml0eG5fZmllbGQgUmVjZWl2ZXIKcHVzaGludCAzMDAwMDAgLy8gMzAwMDAwCnB1c2hpbnQgMzAwMCAvLyAzMDAwCisKcHVzaGludCAxMDAwMDAgLy8gMTAwMDAwCisKaXR4bl9maWVsZCBBbW91bnQKZ2xvYmFsIE1pblR4bkZlZQppdHhuX2ZpZWxkIEZlZQppdHhuX25leHQKcHVzaGludCA2IC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpmcmFtZV9kaWcgLTcKaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECnB1c2hieXRlcyAweDk1NGU3ZDcyIC8vICJzZXR1cChzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmcsc3RyaW5nKXVpbnQ4IgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTMKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTYKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTIKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTQKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTUKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKZnJhbWVfZGlnIC0xCml0eG5fZmllbGQgQXNzZXRzCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRzCmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBBc3NldHMKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRzCnR4biBTZW5kZXIKaXR4bl9maWVsZCBBY2NvdW50cwppdHhuX25leHQKcHVzaGludCA0IC8vIGF4ZmVyCml0eG5fZmllbGQgVHlwZUVudW0KdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKaXR4bl9maWVsZCBYZmVyQXNzZXQKZnJhbWVfZGlnIC03CmNhbGxzdWIgZ2V0YXBwYWRkcl80Cml0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgpnbG9iYWwgTWluVHhuRmVlCml0eG5fZmllbGQgRmVlCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKaXR4bl9maWVsZCBBc3NldEFtb3VudAppdHhuX3N1Ym1pdApyZXRzdWIKCi8vIGNyZWF0ZV9lc2Nyb3cKY3JlYXRlZXNjcm93XzE0Ogpwcm90byA0IDEKaW50Y18xIC8vIDAKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBTZW5kZXIKdHhuIFNlbmRlcgo9PQphc3NlcnQKdHhuIFR5cGVFbnVtCnB1c2hpbnQgNiAvLyBhcHBsCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zIFNlbmRlcgp0eG4gU2VuZGVyCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zIFR5cGVFbnVtCmludGNfMCAvLyBwYXkKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgUmVjZWl2ZXIKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgQW1vdW50CnB1c2hpbnQgOTU2NTAwIC8vIDk1NjUwMAo+PQphc3NlcnQKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMSAvLyAwCj09CmFzc2VydApieXRlYyAxNCAvLyAiaXNfYWN0aXZhdGVkIgphcHBfZ2xvYmFsX2dldAppbnRjXzAgLy8gMQo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKYnl0ZWNfMyAvLyAieWVzX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAo9PQp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldApieXRlYyA0IC8vICJub19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKPT0KfHwKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKPT0KfHwKYXNzZXJ0Cml0eG5fYmVnaW4KcHVzaGludCA2IC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpwdXNoYnl0ZXMgMHgwODIwMDYwMDAxYzA4NDNkMDQ4MDAyODA4MDkwYmJiYWQ2YWRmMDBkMjYxNzBkNmQ2MTcyNmI2NTc0NWY2MTcwNzA1ZjY5NjQwODcwNmY3MzY5NzQ2OTZmNmUwNTcwNzI2OTYzNjUwNDczNjk2NDY1MDg3MzZjNjk3MDcwNjE2NzY1MDU2Zjc3NmU2NTcyMDg3MTc1NjE2ZTc0Njk3NDc5MGY2NjY1NjU1Zjc0Njk2ZDY1NzI1ZjczNzQ2MTcyNzQwZjcxNzU2MTZlNzQ2OTc0Nzk1ZjY2Njk2YzZjNjU2NDEzNjM2ZjZjNmM2MTc0NjU3MjYxNmM1ZjYxNzM3MzY1NzQ1ZjY5NjQwNDE1MWY3Yzc1MGM3OTY1NzM1ZjYxNzM3MzY1NzQ1ZjY5NjQwYjZlNmY1ZjYxNzM3MzY1NzQ1ZjY5NjQxMDY2NjU2NTVmNjI2MTczNjU1ZjcwNjU3MjYzNjU2ZTc0MDEwMDBjNjE3MzczNjU3NDVmNmM2OTczNzQ2NTY0MGI2NjY1NjU1ZjYxNjQ2NDcyNjU3MzczMDQ5NTRlN2Q3MjA0MzJjZTI4MWUwNGM5MWU4OGY1MDRkYjkyMmZjMjAwMDRiYTFkZWVmNTMxMWIyMjEyNDAwMGI2MzYxYTAwODAwNDQzZGI2MmExMTI0MDAwOWEzNjFhMDAyNzExMTI0MDAwODIzNjFhMDAyNzEyMTI0MDAwNmEzNjFhMDAyNzEzMTI0MDAwNTIzNjFhMDAyNzE0MTI0MDAwM2EzNjFhMDA4MDA0MTE5ZTNjNGIxMjQwMDAxZDM2MWEwMDgwMDQyNGMzZDIzNDEyNDAwMDAxMDAzMTE5MjUxMjMxMTgyMjEzMTA0NDg4MGMxNDIzNDMzMTE5ODEwNTEyMzExODIyMTMxMDQ0ODgwYmYwMjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYmM2MjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYjg5MjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYjUzMjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYjA5MjM0MzMxMTkyMjEyMzExODIyMTIxMDQ0ODgwYWU2MjM0MzMxMTkyMjEyNDAwMDAxMDAzMTE4MjIxMjQ0ODgwMTBjMjM0MzhhMDIwMThiZmU4YmZmMGEzNTA5OGJmZThiZmYxODgxZjQwMzBkNDAwMDAzMzQwOTg5MzQwOTIzMDg4OThhMDIwMThiZmU4YmZmYTIzNTExOGJmZThiZmZhYTE1MjIwZDQwMDAwMzM0MTE4OTM0MTEyMzE2YTA4OThhMDMwMThiZmQxNjM1MDI4YmZlMTYzNTAzMjQ4YmZlMDkxNjM1MDQzNDAyMzQwM2EzMzUwMjM0MDIzNDA0YTMzNTAyMzQwMjhiZmYxNmEzMzUwMjM0MDIyMTA1MTZhMjE3ODk4YTAzMDE4YmZkMTYzNTBlOGJmZTE2MzUwZjI0OGJmZTA5MTYzNTEwMzQwZTM0MGZhMzM1MGUzNDBlMzQxMGEzMzUwZTM0MGU4YmZmMTZhMzM1MGUzNDBlMjEwNTE2ODhmZjdlMTc4OThhMDIwMThiZmU4YmZmNjUzNTAxMzUwMDM0MDE0NDM0MDA4OThhMDEwMThiZmY3MjA4MzUwNjM1MDUzNDA2NDQzNDA1ODk4YTA0MDBiMTI1YjIxMDhiZmNiMjAwOGJmZGIyMTI4YmZlYjIxMThiZmZiMjE0YjM4OThhMDQwMDhiZmM4YmZlNzAwMDM1MDgzNTA3MzQwODQwMDAwZTMyMGE4YmZmOGJmZThiZmQ4OGZmY2E0MjAwMGIzMjBhOGJmZjhiZmU4YmZjODhmZmJjODk4YTAwMDAyNzBmMjI2NzI3MDcyMjY3MjgyMjY3MjcwNTI3MTU2NzI5MjI2NzJhMjI2NzI3MDYyMjY3MjcwODIyNjcyYjIyNjcyNzA0MjI2Nzg5OGEwMDAxMjIyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDUwMTIyMzEwMDMyMDkxMjQ0MzExMDgxMDYxMjQ0MzYxYTAwMjcxMTEyNDQ4YmZiNTcwMjAwMTcyMjEyOGJmYjU3MDIwMDE3MjMxMjExNDQ4YmZkNTcwMjAwMTcyMjEyOGJmZDU3MDIwMDE3MjMxMjExNDQ4YmZjNTcwMjAwMTcyMjBkNDQ4YmZjNTcwMjAwMTcyNDBjNDQ4YmZlNTcwMjAwMTcyMjBkNDQyNzBmMjJjMDMwNjcyODMyMGQ2NzI5OGJmYjU3MDIwMDE3NjcyYjhiZmQ1NzAyMDAxNzY3MjcwNjhiZmU1NzAyMDAxNzY3MjcwODIyNjcyYThiZmM1NzAyMDAxNzY3MjcwNTIzYzAxYzY3MjcwNDhiZmY1NzAyMDAxNzY3MzIwYTIyMjg2NDI3MDk4OGZlYzMzMjBhODhmZWUxMzIwYTIyMjg2NDI3MGI4OGZlYjQzMjBhODhmZWQyMzIwYTIyMjg2NDI3MGM4OGZlYTUzMjBhODhmZWMzMjcwNzMyMDc2NzIzOGMwMDhiMDAyMTA0MGM0NDg5OGEwMTAwMzExNjIzMDgzODEwODEwNjEyNDQzMTE2MjMwODM5MWEwMDI3MTQxMjQ0MzExNjIzMDgzODE4OGJmZmMwMzIxMjQ0MzExNjgxMDIwODM4MTA4MTA2MTI0NDMxMTY4MTAyMDgzOTFhMDAyNzE2MTI0NDMxMTY4MTAyMDgzODE4Mjg2NDEyNDQzMTE2MjMwODM4MTkyMjEyNDQzMTE2ODEwMjA4MzgxOTIyMTI0NDg5OGEwNTAwOGJmYjhiZmM4YmZkOGJmZTg4ZmRjMzI4NjQyNzA5ODhmZTIyOGJmZjg4ZmU0MDg5OGEwMjAwMmE2NDhiZmUyYTg4ZmUxMThiZmUyNzA0ODhmZTBhMDkwZjQ0OGJmZTI3MDU4OGZlMDA4YmZlODhmZTBkMjg2NDI3MDk4OGZkZjQ4YmZmMmE2NDBiMjQwYThiZmYyYTY0Mjg2NDI3MGQ4OGZkZTI4OGZkNzkwOTg4ZmUxNzMyMGE4YmZmMmE2NDI4NjQyNzBkODhmZGNlMjg2NDI3MTA4OGZkYzc4OGZmOGQ4OThhMDIwMDJhNjQ4YmZlMmE4OGZkYjg4YmZlMjcwNDg4ZmRiMTA4MGU0NDhiZmUyNzA1ODhmZGE3OGJmZTg4ZmRiNDI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGZkOTQ0MjAwMDcyODY0MjcwYzg4ZmQ4YThiZmY4OGZkYzE4OThhMDIwMDJhNjQ4YmZlMmE4OGZkNzkwODhiZmUyNzA0ODhmZDcxMDgyNDBmNDQzMjBhOGJmZjJhNjQwYjI0ODhmY2MwMjg2NDI3MDk4OGZkNWIyODY0ODhmZDY4ODhmZDc2ODk4YTAyMDAyYTY0OGJmZTJhODhmZDQ3OGJmZTI3MDQ4OGZkNDAwOTA4MjQwZTQ0MzIwYThiZmYyOTY0MjIxMjQwMDAwYTI4NjQyNzBiODhmZDI5NDIwMDA3Mjg2NDI3MGM4OGZkMWYyODY0ODhmZDJjODhmZDNhODk4YTAyMDEyMjhiZmU4OGZlN2M4YmZmMjcwNjY0MjcwODY0MDkwZTQ0MjcwNDY0MjIwZDQwMDE0ZDI3MDQ2NDIyMGQ0MDAxMzgyOTY0MjIxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmY2UxMjIxMjEwOGJmZWMwMzIyYjg4ZmNkNjIyMTIxMDI5NjQyMzEyMmI2NDIzMTIxMDhiZmVjMDMyMjk4OGZjYzIyMzEyMTA4YmZlYzAzMjJiODhmY2I3MjIxMjEwMTE0MDAwZWEyOTY0MjIxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYzlmMjIxMjEwOGJmZWMwMzIyYjg4ZmM5NDIzMTIxMDI5NjQyMzEyMmI2NDIyMTIxMDhiZmVjMDMyMjk4OGZjODAyMzEyMTA4YmZlYzAzMjJiODhmYzc1MjMxMjEwMTE0MDAwOWMyOTY0MjIxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmYzVkMjMxMjEwOGJmZWMwMzIyYjg4ZmM1MjIzMTIxMDI5NjQyMzEyMmI2NDIzMTIxMDhiZmVjMDMyMjk4OGZjM2UyMjEyMTA4YmZlYzAzMjJiODhmYzMzMjMxMjEwMTE0MDAwNGUyOTY0MjIxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYzFiMjMxMjEwOGJmZWMwMzIyYjg4ZmMxMDIyMTIxMDI5NjQyMzEyMmI2NDIyMTIxMDhiZmVjMDMyMjk4OGZiZmMyMjEyMTA4YmZlYzAzMjJiODhmYmYxMjIxMjEwMTE0MTAwNWE4YmZlYzAzMjhiZmY4OGZlOGY0MjAwNGU4YmZlYzAzMjhiZmY4OGZlNTE0MjAwNDI4YmZlYzAzMjhiZmY4OGZlMDY0MjAwMzY4YmZlYzAzMjhiZmY4OGZkYTE0MjAwMmEzMjA3MjcwNzY0ODE3ODA4MGM0NDQyZmViYjhiZmVjMDMyMjcwNDg4ZmJhNDIyMGQyNzA3NjQ4YmZlYzAzMjI3MDc4OGZiOTYwZTEwNDQ0MmZlOTYyNzA4MjcwODY0OGJmZjA4NjcyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDEwMDMxMTYyMzA5MzgxMDgxMDYxMjQ0MzExNjIzMDkzOTFhMDAyNzEyMTI0NDMxMTYyMzA5MzgxODhiZmYxMjQ0MzExNjIzMDgzODEwODEwNjEyNDQzMTE2MjMwODM5MWEwMDI3MTYxMjQ0MzExNjIzMDgzODE4Mjg2NDEyNDQzMTE2MjMwOTM5MWEwMjE3MjcwNjY0MjcwODY0MDkwZTQ0MzExNjIzMDkzODE5MjIxMjQ0MzExNjIzMDgzODE5MjIxMjQ0ODk4YTAyMDAyYTY0MjcwNDY0MDg4YmZlMmE4OGZiMDkwZjQ0OGJmZTI3MDU4OGZiMDA4YmZlODhmYjBkMjg2NDI3MDk4OGZhZjQ4YmZmOGJmZTJhODhmYWVjMGIyNDBhODhmYjIyMzIwYThiZmY4YmZlMmE4OGZhZGMyODY0MjcwZDg4ZmFkNTI4NjQyNzEwODhmYWNlODhmYzk0ODk4YTAyMDAyYTY0MjcwNDY0MDk4YmZlMmE4OGZhYmIwZTQ0OGJmZTI3MDU4OGZhYjI4YmZlODhmYWJmMjk2NDIyMTI0MDAwMGEyODY0MjcwYjg4ZmE5ZjQyMDAwNzI4NjQyNzBjODhmYTk1OGJmZjg4ZmFjYzg5OGEwMjAwMmE2NDhiZmUyYTg4ZmE4NDA4MjcwNDY0MDgyNDBmNDQyYTY0MjcwNDY0MDgyNDhiZmUyYTg4ZmE2ZjA5MGQ0MDAwMGIyYTY0MjcwNDY0MDgzNTEyNDIwMDBhMjQ4YmZlMmE4OGZhIC8vIDB4MDgyMDA2MDAwMWMwODQzZDA0ODAwMjgwODA5MGJiYmFkNmFkZjAwZDI2MTcwZDZkNjE3MjZiNjU3NDVmNjE3MDcwNWY2OTY0MDg3MDZmNzM2OTc0Njk2ZjZlMDU3MDcyNjk2MzY1MDQ3MzY5NjQ2NTA4NzM2YzY5NzA3MDYxNjc2NTA1NmY3NzZlNjU3MjA4NzE3NTYxNmU3NDY5NzQ3OTBmNjY2NTY1NWY3NDY5NmQ2NTcyNWY3Mzc0NjE3Mjc0MGY3MTc1NjE2ZTc0Njk3NDc5NWY2NjY5NmM2YzY1NjQxMzYzNmY2YzZjNjE3NDY1NzI2MTZjNWY2MTczNzM2NTc0NWY2OTY0MDQxNTFmN2M3NTBjNzk2NTczNWY2MTczNzM2NTc0NWY2OTY0MGI2ZTZmNWY2MTczNzM2NTc0NWY2OTY0MTA2NjY1NjU1ZjYyNjE3MzY1NWY3MDY1NzI2MzY1NmU3NDAxMDAwYzYxNzM3MzY1NzQ1ZjZjNjk3Mzc0NjU2NDBiNjY2NTY1NWY2MTY0NjQ3MjY1NzM3MzA0OTU0ZTdkNzIwNDMyY2UyODFlMDRjOTFlODhmNTA0ZGI5MjJmYzIwMDA0YmExZGVlZjUzMTFiMjIxMjQwMDBiNjM2MWEwMDgwMDQ0M2RiNjJhMTEyNDAwMDlhMzYxYTAwMjcxMTEyNDAwMDgyMzYxYTAwMjcxMjEyNDAwMDZhMzYxYTAwMjcxMzEyNDAwMDUyMzYxYTAwMjcxNDEyNDAwMDNhMzYxYTAwODAwNDExOWUzYzRiMTI0MDAwMWQzNjFhMDA4MDA0MjRjM2QyMzQxMjQwMDAwMTAwMzExOTI1MTIzMTE4MjIxMzEwNDQ4ODBjMTQyMzQzMzExOTgxMDUxMjMxMTgyMjEzMTA0NDg4MGJmMDIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGJjNjIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGI4OTIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGI1MzIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGIwOTIzNDMzMTE5MjIxMjMxMTgyMjEyMTA0NDg4MGFlNjIzNDMzMTE5MjIxMjQwMDAwMTAwMzExODIyMTI0NDg4MDEwYzIzNDM4YTAyMDE4YmZlOGJmZjBhMzUwOThiZmU4YmZmMTg4MWY0MDMwZDQwMDAwMzM0MDk4OTM0MDkyMzA4ODk4YTAyMDE4YmZlOGJmZmEyMzUxMThiZmU4YmZmYWExNTIyMGQ0MDAwMDMzNDExODkzNDExMjMxNmEwODk4YTAzMDE4YmZkMTYzNTAyOGJmZTE2MzUwMzI0OGJmZTA5MTYzNTA0MzQwMjM0MDNhMzM1MDIzNDAyMzQwNGEzMzUwMjM0MDI4YmZmMTZhMzM1MDIzNDAyMjEwNTE2YTIxNzg5OGEwMzAxOGJmZDE2MzUwZThiZmUxNjM1MGYyNDhiZmUwOTE2MzUxMDM0MGUzNDBmYTMzNTBlMzQwZTM0MTBhMzM1MGUzNDBlOGJmZjE2YTMzNTBlMzQwZTIxMDUxNjg4ZmY3ZTE3ODk4YTAyMDE4YmZlOGJmZjY1MzUwMTM1MDAzNDAxNDQzNDAwODk4YTAxMDE4YmZmNzIwODM1MDYzNTA1MzQwNjQ0MzQwNTg5OGEwNDAwYjEyNWIyMTA4YmZjYjIwMDhiZmRiMjEyOGJmZWIyMTE4YmZmYjIxNGIzODk4YTA0MDA4YmZjOGJmZTcwMDAzNTA4MzUwNzM0MDg0MDAwMGUzMjBhOGJmZjhiZmU4YmZkODhmZmNhNDIwMDBiMzIwYThiZmY4YmZlOGJmYzg4ZmZiYzg5OGEwMDAwMjcwZjIyNjcyNzA3MjI2NzI4MjI2NzI3MDUyNzE1NjcyOTIyNjcyYTIyNjcyNzA2MjI2NzI3MDgyMjY3MmIyMjY3MjcwNDIyNjc4OThhMDAwMTIyMjM4YzAwOGIwMDIxMDQwYzQ0ODk4YTA1MDEyMjMxMDAzMjA5MTI0NDMxMTA4MTA2MTI0NDM2MWEwMDI3MTExMjQ0OGJmYjU3MDIwMDE3MjIxMjhiZmI1NzAyMDAxNzIzMTIxMTQ0OGJmZDU3MDIwMDE3MjIxMjhiZmQ1NzAyMDAxNzIzMTIxMTQ0OGJmYzU3MDIwMDE3MjIwZDQ0OGJmYzU3MDIwMDE3MjQwYzQ0OGJmZTU3MDIwMDE3MjIwZDQ0MjcwZjIyYzAzMDY3MjgzMjBkNjcyOThiZmI1NzAyMDAxNzY3MmI4YmZkNTcwMjAwMTc2NzI3MDY4YmZlNTcwMjAwMTc2NzI3MDgyMjY3MmE4YmZjNTcwMjAwMTc2NzI3MDUyM2MwMWM2NzI3MDQ4YmZmNTcwMjAwMTc2NzMyMGEyMjI4NjQyNzA5ODhmZWMzMzIwYTg4ZmVlMTMyMGEyMjI4NjQyNzBiODhmZWI0MzIwYTg4ZmVkMjMyMGEyMjI4NjQyNzBjODhmZWE1MzIwYTg4ZmVjMzI3MDczMjA3NjcyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDEwMDMxMTYyMzA4MzgxMDgxMDYxMjQ0MzExNjIzMDgzOTFhMDAyNzE0MTI0NDMxMTYyMzA4MzgxODhiZmZjMDMyMTI0NDMxMTY4MTAyMDgzODEwODEwNjEyNDQzMTE2ODEwMjA4MzkxYTAwMjcxNjEyNDQzMTE2ODEwMjA4MzgxODI4NjQxMjQ0MzExNjIzMDgzODE5MjIxMjQ0MzExNjgxMDIwODM4MTkyMjEyNDQ4OThhMDUwMDhiZmI4YmZjOGJmZDhiZmU4OGZkYzMyODY0MjcwOTg4ZmUyMjhiZmY4OGZlNDA4OThhMDIwMDJhNjQ4YmZlMmE4OGZlMTE4YmZlMjcwNDg4ZmUwYTA5MGY0NDhiZmUyNzA1ODhmZTAwOGJmZTg4ZmUwZDI4NjQyNzA5ODhmZGY0OGJmZjJhNjQwYjI0MGE4YmZmMmE2NDI4NjQyNzBkODhmZGUyODhmZDc5MDk4OGZlMTczMjBhOGJmZjJhNjQyODY0MjcwZDg4ZmRjZTI4NjQyNzEwODhmZGM3ODhmZjhkODk4YTAyMDAyYTY0OGJmZTJhODhmZGI4OGJmZTI3MDQ4OGZkYjEwODBlNDQ4YmZlMjcwNTg4ZmRhNzhiZmU4OGZkYjQyOTY0MjIxMjQwMDAwYTI4NjQyNzBiODhmZDk0NDIwMDA3Mjg2NDI3MGM4OGZkOGE4YmZmODhmZGMxODk4YTAyMDAyYTY0OGJmZTJhODhmZDc5MDg4YmZlMjcwNDg4ZmQ3MTA4MjQwZjQ0MzIwYThiZmYyYTY0MGIyNDg4ZmNjMDI4NjQyNzA5ODhmZDViMjg2NDg4ZmQ2ODg4ZmQ3Njg5OGEwMjAwMmE2NDhiZmUyYTg4ZmQ0NzhiZmUyNzA0ODhmZDQwMDkwODI0MGU0NDMyMGE4YmZmMjk2NDIyMTI0MDAwMGEyODY0MjcwYjg4ZmQyOTQyMDAwNzI4NjQyNzBjODhmZDFmMjg2NDg4ZmQyYzg4ZmQzYTg5OGEwMjAxMjI4YmZlODhmZTdjOGJmZjI3MDY2NDI3MDg2NDA5MGU0NDI3MDQ2NDIyMGQ0MDAxNGQyNzA0NjQyMjBkNDAwMTM4Mjk2NDIyMTIyYjY0MjMxMjEwOGJmZWMwMzIyOTg4ZmNlMTIyMTIxMDhiZmVjMDMyMmI4OGZjZDYyMjEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmY2MyMjMxMjEwOGJmZWMwMzIyYjg4ZmNiNzIyMTIxMDExNDAwMGVhMjk2NDIyMTIyYjY0MjIxMjEwOGJmZWMwMzIyOTg4ZmM5ZjIyMTIxMDhiZmVjMDMyMmI4OGZjOTQyMzEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYzgwMjMxMjEwOGJmZWMwMzIyYjg4ZmM3NTIzMTIxMDExNDAwMDljMjk2NDIyMTIyYjY0MjMxMjEwOGJmZWMwMzIyOTg4ZmM1ZDIzMTIxMDhiZmVjMDMyMmI4OGZjNTIyMzEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmYzNlMjIxMjEwOGJmZWMwMzIyYjg4ZmMzMzIzMTIxMDExNDAwMDRlMjk2NDIyMTIyYjY0MjIxMjEwOGJmZWMwMzIyOTg4ZmMxYjIzMTIxMDhiZmVjMDMyMmI4OGZjMTAyMjEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYmZjMjIxMjEwOGJmZWMwMzIyYjg4ZmJmMTIyMTIxMDExNDEwMDVhOGJmZWMwMzI4YmZmODhmZThmNDIwMDRlOGJmZWMwMzI4YmZmODhmZTUxNDIwMDQyOGJmZWMwMzI4YmZmODhmZTA2NDIwMDM2OGJmZWMwMzI4YmZmODhmZGExNDIwMDJhMzIwNzI3MDc2NDgxNzgwODBjNDQ0MmZlYmI4YmZlYzAzMjI3MDQ4OGZiYTQyMjBkMjcwNzY0OGJmZWMwMzIyNzA3ODhmYjk2MGUxMDQ0NDJmZTk2MjcwODI3MDg2NDhiZmYwODY3MjM4YzAwOGIwMDIxMDQwYzQ0ODk4YTAxMDAzMTE2MjMwOTM4MTA4MTA2MTI0NDMxMTYyMzA5MzkxYTAwMjcxMjEyNDQzMTE2MjMwOTM4MTg4YmZmMTI0NDMxMTYyMzA4MzgxMDgxMDYxMjQ0MzExNjIzMDgzOTFhMDAyNzE2MTI0NDMxMTYyMzA4MzgxODI4NjQxMjQ0MzExNjIzMDkzOTFhMDIxNzI3MDY2NDI3MDg2NDA5MGU0NDMxMTYyMzA5MzgxOTIyMTI0NDMxMTYyMzA4MzgxOTIyMTI0NDg5OGEwMjAwMmE2NDI3MDQ2NDA4OGJmZTJhODhmYjA5MGY0NDhiZmUyNzA1ODhmYjAwOGJmZTg4ZmIwZDI4NjQyNzA5ODhmYWY0OGJmZjhiZmUyYTg4ZmFlYzBiMjQwYTg4ZmIyMjMyMGE4YmZmOGJmZTJhODhmYWRjMjg2NDI3MGQ4OGZhZDUyODY0MjcxMDg4ZmFjZTg4ZmM5NDg5OGEwMjAwMmE2NDI3MDQ2NDA5OGJmZTJhODhmYWJiMGU0NDhiZmUyNzA1ODhmYWIyOGJmZTg4ZmFiZjI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGZhOWY0MjAwMDcyODY0MjcwYzg4ZmE5NThiZmY4OGZhY2M4OThhMDIwMDJhNjQ4YmZlMmE4OGZhODQwODI3MDQ2NDA4MjQwZjQ0MmE2NDI3MDQ2NDA4MjQ4YmZlMmE4OGZhNmYwOTBkNDAwMDBiMmE2NDI3MDQ2NDA4MzUxMjQyMDAwYTI0OGJmZTJhODhmYQppdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCnB1c2hieXRlcyAweDU4MDkzNTEyMzIwYThiZmYzNDEyMGIyNDg4ZjlhODI4NjQyNzA5ODhmYTQzMjg2NDg4ZmE1MDg4ZmE1ZTMyMGE4YmZmMzQxMjI4NjQyNzBkODhmYTJlMjg2NDI3MTA4OGZhMjc4OGZiZWQ4OThhMDIwMDJhNjQ4YmZlMmE4OGZhMTgwODI3MDQ2NDA5MjQwZTQ0MmE2NDI3MDQ2NDA5MjQ4YmZlMmE4OGZhMDMwOTBjNDAwMDI5MjQ4YmZlMmE4OGY5ZjcwOTM1MTMzMjBhOGJmZjI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGY5ZTI0MjAwMTUyODY0MjcwYzg4ZjlkODQyMDAwYjJhNjQyNzA0NjQwOTM1MTM0MmZmZDYyODY0ODhmOWQ3ODhmOWU1ODk4YTAzMDEyMjMxMTA4MTA2MTI0NDM2MWEwMDI3MTMxMjQ0MzEwMDI3MDU2NDEyNDQyNzA4NjQyMjEyNDQ4YmZkMjIwZDQ0OGJmZDI0MGM0NDhiZmUyMjBkNDQ4YmZkMmE2NDEzOGJmZTI3MDY2NDEzMTE4YmZmMjcwNDY0MTMxMTQ0MmI2NDIzMTI0MDAwNmMyNzBmNjQzNTBkOGJmZTI3MDY2NDBkNDAwMDFkMjcwNjY0OGJmZTA5MzUwYzM0MGMyMjBkNDEwMGZhMzIwYTM0MGMzNDBkMzEwMDg4Zjk3NDQyMDBlYzhiZmUyNzA2NjQwOTM1MGMzMTE2MjIwZDQ0MzExNjIzMDkzODEwMjUxMjQ0MzExNjIzMDkzODAwMzEwMDEyNDQzMTE2MjMwOTM4MTQzMjBhMTI0NDMxMTYyMzA5MzgxMTM0MGQxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQ0MjAwYWIyNzA2NjQyYTY0MjcwNDY0MDgwYjI0MGEyNzA2NjQyYTY0MjcwNDY0MDgyODY0MjcwZDg4ZjhmMTg4ZjhiYTA4MzUwYThiZmU4YmZkOGJmZjA4MGIyNDBhOGJmZThiZmQ4YmZmMDgyODY0MjcwZDg4ZjhkMzg4Zjg5YzA4MzUwYjM0MGIzNDBhMGQ0MDAwMjEzNDBhMzQwYjA5MzUwYzM0MGMyMjBkNDEwMDU1MzIwYTM0MGMyODY0MjcwOTg4ZjhhYzMxMDA4OGY4Y2E0MjAwNDIzNDBiMzQwYTA5MzUwYzMxMTYyMjBkNDQzMTE2MjMwOTM4MTAyNTEyNDQzMTE2MjMwOTM4MDAzMTAwMTI0NDMxMTYyMzA5MzgxNDMyMGExMjQ0MzExNjIzMDkzODExMjg2NDI3MDk4OGY4NmUxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQyYThiZmQ2NzI3MDY4YmZlNjcyNzA0OGJmZjY3MjcwNzMyMDc2NzIzOGMwMDhiMDAyMTA0MGM0NDg5OGEwMTAxMjI4YmZmYzAzMjg4ZmNiZDhiZmZjMDMyMjcwNDg4ZjgzMTIyMGQ0MDAxNjUyNzA0NjQyMjBkNDAwMTUwMjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4ZjgxMzIyMTIxMDhiZmZjMDMyMmI4OGY4MDgyMjEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmN2Y0MjMxMjEwOGJmZmMwMzIyYjg4ZjdlOTIyMTIxMDExNDAwMGZjMjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4ZjdkMTIyMTIxMDhiZmZjMDMyMmI4OGY3YzYyMzEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmN2IyMjMxMjEwOGJmZmMwMzIyYjg4ZjdhNzIzMTIxMDExNDAwMGE4Mjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4Zjc4ZjIzMTIxMDhiZmZjMDMyMmI4OGY3ODQyMzEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmNzcwMjIxMjEwOGJmZmMwMzIyYjg4Zjc2NTIzMTIxMDExNDAwMDU0Mjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4Zjc0ZDIzMTIxMDhiZmZjMDMyMmI4OGY3NDIyMjEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmNzJlMjIxMjEwOGJmZmMwMzIyYjg4ZjcyMzIyMTIxMDExNDEwMDZjOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmY2VhNDIwMDVhOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzZjNDIwMDQ4OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzFmNDIwMDM2OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYmJmNDIwMDI0MzIwNzI3MDc2NDgxNzgwODBjNDQ0MmZlYTMyNzA0NjQyMjBkOGJmZmMwMzIyNzA3ODhmNmI5MjcwNzY0MGUxMDQ0NDJmZTg0MjcwODI3MDg2NDMxMTYyMzA5MzkxYTAyMTcwODY3MjM4YzAwODk4YTAwMDEyMjMxMDAzMjA5MTIzMTAwMjg2NDgwMTU2NTczNjM3MjZmNzc1ZjYzNjE2ZTYzNjU2YzVmNjE2NDY0NzI2NTczNzM4OGY2NzYxMjExNDRiMTI1YjIxMDI4NjQyNzA5ODhmNjY4YjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBiODhmNjRhYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBjODhmNjJjYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTIzYjIxMDIyYjIwODI3MDU2NGIyMDcyMmIyMDEyNzA1NjRiMjA5YjMyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDAwMTIyMzEwMDI4NjQ4MDEyNmQ2MTcyNmI2NTc0NWY2NjcyNjk2NTZlNjQ1ZjYxNjQ2NDcyODhmNWRiMTIzMjA0MjMxMjEwNDQyMzhjMDA4OThhMDAwMDIyODhmNjVhOGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjI3MTU0NzA0MzYxYTAxOGMwMTM2MWEwMjhjMDIzNjFhMDM4YzAzMzYxYTA0OGMwNDM2MWEwNThjMDU4YjAxOGIwMjhiMDM4YjA0OGIwNTg4ZjYyZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAyMzYxYTAxMjI1NThjMDEzNjFhMDIxNzhjMDI4YjAxOGIwMjg4Zjg1MThjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAzMzYxYTAxMTc4YzAxMzYxYTAyMTc4YzAyMzYxYTAzMTc4YzAzOGIwMThiMDI4YjAzODhmYjc4OGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjQ5MzYxYTAxMjI1NThjMDE4YjAxODhmY2Q2OGMwMDI3MGE4YjAwMTY1MGIwODk4YTAwMDAyMjg4ZmU2ZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI4OGZlZmM4YzAwMjcwYThiMDAxNjUwYjA4OSAvLyAweDU4MDkzNTEyMzIwYThiZmYzNDEyMGIyNDg4ZjlhODI4NjQyNzA5ODhmYTQzMjg2NDg4ZmE1MDg4ZmE1ZTMyMGE4YmZmMzQxMjI4NjQyNzBkODhmYTJlMjg2NDI3MTA4OGZhMjc4OGZiZWQ4OThhMDIwMDJhNjQ4YmZlMmE4OGZhMTgwODI3MDQ2NDA5MjQwZTQ0MmE2NDI3MDQ2NDA5MjQ4YmZlMmE4OGZhMDMwOTBjNDAwMDI5MjQ4YmZlMmE4OGY5ZjcwOTM1MTMzMjBhOGJmZjI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGY5ZTI0MjAwMTUyODY0MjcwYzg4ZjlkODQyMDAwYjJhNjQyNzA0NjQwOTM1MTM0MmZmZDYyODY0ODhmOWQ3ODhmOWU1ODk4YTAzMDEyMjMxMTA4MTA2MTI0NDM2MWEwMDI3MTMxMjQ0MzEwMDI3MDU2NDEyNDQyNzA4NjQyMjEyNDQ4YmZkMjIwZDQ0OGJmZDI0MGM0NDhiZmUyMjBkNDQ4YmZkMmE2NDEzOGJmZTI3MDY2NDEzMTE4YmZmMjcwNDY0MTMxMTQ0MmI2NDIzMTI0MDAwNmMyNzBmNjQzNTBkOGJmZTI3MDY2NDBkNDAwMDFkMjcwNjY0OGJmZTA5MzUwYzM0MGMyMjBkNDEwMGZhMzIwYTM0MGMzNDBkMzEwMDg4Zjk3NDQyMDBlYzhiZmUyNzA2NjQwOTM1MGMzMTE2MjIwZDQ0MzExNjIzMDkzODEwMjUxMjQ0MzExNjIzMDkzODAwMzEwMDEyNDQzMTE2MjMwOTM4MTQzMjBhMTI0NDMxMTYyMzA5MzgxMTM0MGQxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQ0MjAwYWIyNzA2NjQyYTY0MjcwNDY0MDgwYjI0MGEyNzA2NjQyYTY0MjcwNDY0MDgyODY0MjcwZDg4ZjhmMTg4ZjhiYTA4MzUwYThiZmU4YmZkOGJmZjA4MGIyNDBhOGJmZThiZmQ4YmZmMDgyODY0MjcwZDg4ZjhkMzg4Zjg5YzA4MzUwYjM0MGIzNDBhMGQ0MDAwMjEzNDBhMzQwYjA5MzUwYzM0MGMyMjBkNDEwMDU1MzIwYTM0MGMyODY0MjcwOTg4ZjhhYzMxMDA4OGY4Y2E0MjAwNDIzNDBiMzQwYTA5MzUwYzMxMTYyMjBkNDQzMTE2MjMwOTM4MTAyNTEyNDQzMTE2MjMwOTM4MDAzMTAwMTI0NDMxMTYyMzA5MzgxNDMyMGExMjQ0MzExNjIzMDkzODExMjg2NDI3MDk4OGY4NmUxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQyYThiZmQ2NzI3MDY4YmZlNjcyNzA0OGJmZjY3MjcwNzMyMDc2NzIzOGMwMDhiMDAyMTA0MGM0NDg5OGEwMTAxMjI4YmZmYzAzMjg4ZmNiZDhiZmZjMDMyMjcwNDg4ZjgzMTIyMGQ0MDAxNjUyNzA0NjQyMjBkNDAwMTUwMjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4ZjgxMzIyMTIxMDhiZmZjMDMyMmI4OGY4MDgyMjEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmN2Y0MjMxMjEwOGJmZmMwMzIyYjg4ZjdlOTIyMTIxMDExNDAwMGZjMjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4ZjdkMTIyMTIxMDhiZmZjMDMyMmI4OGY3YzYyMzEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmN2IyMjMxMjEwOGJmZmMwMzIyYjg4ZjdhNzIzMTIxMDExNDAwMGE4Mjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4Zjc4ZjIzMTIxMDhiZmZjMDMyMmI4OGY3ODQyMzEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmNzcwMjIxMjEwOGJmZmMwMzIyYjg4Zjc2NTIzMTIxMDExNDAwMDU0Mjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4Zjc0ZDIzMTIxMDhiZmZjMDMyMmI4OGY3NDIyMjEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmNzJlMjIxMjEwOGJmZmMwMzIyYjg4ZjcyMzIyMTIxMDExNDEwMDZjOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmY2VhNDIwMDVhOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzZjNDIwMDQ4OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzFmNDIwMDM2OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYmJmNDIwMDI0MzIwNzI3MDc2NDgxNzgwODBjNDQ0MmZlYTMyNzA0NjQyMjBkOGJmZmMwMzIyNzA3ODhmNmI5MjcwNzY0MGUxMDQ0NDJmZTg0MjcwODI3MDg2NDMxMTYyMzA5MzkxYTAyMTcwODY3MjM4YzAwODk4YTAwMDEyMjMxMDAzMjA5MTIzMTAwMjg2NDgwMTU2NTczNjM3MjZmNzc1ZjYzNjE2ZTYzNjU2YzVmNjE2NDY0NzI2NTczNzM4OGY2NzYxMjExNDRiMTI1YjIxMDI4NjQyNzA5ODhmNjY4YjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBiODhmNjRhYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBjODhmNjJjYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTIzYjIxMDIyYjIwODI3MDU2NGIyMDcyMmIyMDEyNzA1NjRiMjA5YjMyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDAwMTIyMzEwMDI4NjQ4MDEyNmQ2MTcyNmI2NTc0NWY2NjcyNjk2NTZlNjQ1ZjYxNjQ2NDcyODhmNWRiMTIzMjA0MjMxMjEwNDQyMzhjMDA4OThhMDAwMDIyODhmNjVhOGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjI3MTU0NzA0MzYxYTAxOGMwMTM2MWEwMjhjMDIzNjFhMDM4YzAzMzYxYTA0OGMwNDM2MWEwNThjMDU4YjAxOGIwMjhiMDM4YjA0OGIwNTg4ZjYyZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAyMzYxYTAxMjI1NThjMDEzNjFhMDIxNzhjMDI4YjAxOGIwMjg4Zjg1MThjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAzMzYxYTAxMTc4YzAxMzYxYTAyMTc4YzAyMzYxYTAzMTc4YzAzOGIwMThiMDI4YjAzODhmYjc4OGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjQ5MzYxYTAxMjI1NThjMDE4YjAxODhmY2Q2OGMwMDI3MGE4YjAwMTY1MGIwODk4YTAwMDAyMjg4ZmU2ZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI4OGZlZmM4YzAwMjcwYThiMDAxNjUwYjA4OQppdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCnB1c2hieXRlcyAweDA4ODEwMDQzIC8vIDB4MDg4MTAwNDMKaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCmludGNfMCAvLyAxCml0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKaW50Y18wIC8vIDEKaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKcHVzaGludCA5IC8vIDkKaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50Cml0eG5fc3VibWl0Cml0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKc3RvcmUgMTMKbG9hZCAxMwpmcmFtZV9idXJ5IDAKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKYnl0ZWNfMyAvLyAieWVzX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAo9PQpibnogY3JlYXRlZXNjcm93XzE0X2w0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAo9PQpibnogY3JlYXRlZXNjcm93XzE0X2wzCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKZnJhbWVfZGlnIC0zCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKKwoqCmludGMgNCAvLyAxMDAwMDAwCi8KZnJhbWVfZGlnIC0zCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKKwpieXRlYyAxNSAvLyAiZmVlX2Jhc2VfcGVyY2VudCIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBjYWxjdWxhdGVmZWVjb21taXRfMgorCj09CmFzc2VydApsb2FkIDEzCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKZnJhbWVfZGlnIC0zCmZyYW1lX2RpZyAtMQppbnRjXzAgLy8gMQpieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldApjYWxsc3ViIHNldHVwZXNjcm93XzEzCmIgY3JlYXRlZXNjcm93XzE0X2w1CmNyZWF0ZWVzY3Jvd18xNF9sMzoKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudApmcmFtZV9kaWcgLTMKPT0KYXNzZXJ0CmxvYWQgMTMKZnJhbWVfZGlnIC00CmZyYW1lX2RpZyAtMgp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmludGNfMSAvLyAwCmludGNfMSAvLyAwCmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldApjYWxsc3ViIHNldHVwZXNjcm93XzEzCmIgY3JlYXRlZXNjcm93XzE0X2w1CmNyZWF0ZWVzY3Jvd18xNF9sNDoKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudApmcmFtZV9kaWcgLTMKPT0KYXNzZXJ0CmxvYWQgMTMKZnJhbWVfZGlnIC00CmZyYW1lX2RpZyAtMgp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmludGNfMCAvLyAxCmludGNfMSAvLyAwCmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBzZXR1cGVzY3Jvd18xMwpjcmVhdGVlc2Nyb3dfMTRfbDU6CnJldHN1YgoKLy8gYWN0aXZhdGVfbWFya2V0CmFjdGl2YXRlbWFya2V0XzE1Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECmNhbGxzdWIgaXRvYV8xMgpzdG9yZSAxNApieXRlYyAxNCAvLyAiaXNfYWN0aXZhdGVkIgphcHBfZ2xvYmFsX2dldAppbnRjXzEgLy8gMAo9PQphc3NlcnQKaXR4bl9iZWdpbgpwdXNoaW50IDMgLy8gYWNmZwppdHhuX2ZpZWxkIFR5cGVFbnVtCmJ5dGVjIDIzIC8vICJBbHBoYSBNYXJrZXQgIgpsb2FkIDE0CmNvbmNhdApwdXNoYnl0ZXMgMHgyMDU5NjU3MyAvLyAiIFllcyIKY29uY2F0Cml0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCmJ5dGVjIDI0IC8vICJodHRwczovL3d3dy5hbHBoYWFyY2FkZS5jb20vbWFya2V0LyIKbG9hZCAxNApjb25jYXQKaXR4bl9maWVsZCBDb25maWdBc3NldFVSTApwdXNoaW50IDYgLy8gNgppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKaW50YyA2IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1Cml0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgpwdXNoYnl0ZXMgMHg0MTRjNTA0ODQxMmQ1OSAvLyAiQUxQSEEtWSIKaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCml0eG5fc3VibWl0CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKaXR4biBDcmVhdGVkQXNzZXRJRAphcHBfZ2xvYmFsX3B1dAppdHhuX2JlZ2luCnB1c2hpbnQgMyAvLyBhY2ZnCml0eG5fZmllbGQgVHlwZUVudW0KYnl0ZWMgMjMgLy8gIkFscGhhIE1hcmtldCAiCmxvYWQgMTQKY29uY2F0CnB1c2hieXRlcyAweDIwNGU2ZiAvLyAiIE5vIgpjb25jYXQKaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKYnl0ZWMgMjQgLy8gImh0dHBzOi8vd3d3LmFscGhhYXJjYWRlLmNvbS9tYXJrZXQvIgpsb2FkIDE0CmNvbmNhdAppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCnB1c2hpbnQgNiAvLyA2Cml0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwppbnRjIDYgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCml0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCnB1c2hieXRlcyAweDQxNGM1MDQ4NDEyZDRlIC8vICJBTFBIQS1OIgppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKaXR4bl9zdWJtaXQKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCml0eG4gQ3JlYXRlZEFzc2V0SUQKYXBwX2dsb2JhbF9wdXQKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKaW50Y18xIC8vIDAKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlYyAxNCAvLyAiaXNfYWN0aXZhdGVkIgppbnRjXzAgLy8gMQphcHBfZ2xvYmFsX3B1dApieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgppbnRjXzEgLy8gMAphcHBfZ2xvYmFsX3B1dApieXRlY18yIC8vICJub19zdXBwbHkiCmludGNfMSAvLyAwCmFwcF9nbG9iYWxfcHV0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gdmFsaWRhdGVfbWF0Y2hfZ3JvdXBfc3RydWN0dXJlCnZhbGlkYXRlbWF0Y2hncm91cHN0cnVjdHVyZV8xNjoKcHJvdG8gMiAwCmJ5dGVjIDE0IC8vICJpc19hY3RpdmF0ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMCAvLyAxCj09CmFzc2VydApieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgVHlwZUVudW0KcHVzaGludCA2IC8vIGFwcGwKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnNhIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweGRiOTIyZmMyIC8vICJtYXRjaF90YWtlcihhcHBsaWNhdGlvbil1aW50NjQiCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFwcGxpY2F0aW9uSUQKZnJhbWVfZGlnIC0xCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNiAvLyBhcHBsCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHgzMmNlMjgxZSAvLyAibWF0Y2hfbWFrZXIoYXBwbGljYXRpb24sdWludDY0KXVpbnQ4Igo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBBcHBsaWNhdGlvbklECmZyYW1lX2RpZyAtMgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIE9uQ29tcGxldGlvbgppbnRjXzEgLy8gTm9PcAo9PQphc3NlcnQKcmV0c3ViCgovLyB2YWxpZGF0ZV9tYXJrZXRfY29uc2lzdGVuY3kKdmFsaWRhdGVtYXJrZXRjb25zaXN0ZW5jeV8xNzoKcHJvdG8gMiAwCmZyYW1lX2RpZyAtMgpieXRlYyAxNiAvLyAibWFya2V0X2FwcF9pZCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0xCmJ5dGVjIDE2IC8vICJtYXJrZXRfYXBwX2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwo9PQphc3NlcnQKZnJhbWVfZGlnIC0yCmJ5dGVjIDE2IC8vICJtYXJrZXRfYXBwX2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMQpieXRlYyAxNiAvLyAibWFya2V0X2FwcF9pZCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECj09CmFzc2VydApyZXRzdWIKCi8vIGhhbmRsZV9iaWRfYmlkX2NvbXBsZW1lbnRfbWF0Y2gKaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4Ogpwcm90byAzIDAKZnJhbWVfZGlnIC0yCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0zCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKKwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMworCmludGMgNCAvLyAxMDAwMDAwCj49CmFzc2VydApmcmFtZV9kaWcgLTMKYnl0ZWMgMTMgLy8gIm93bmVyIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpmcmFtZV9kaWcgLTMKY2FsbHN1YiBnZXRhcHBhZGRyXzQKZnJhbWVfZGlnIC0zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQpibnogaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2w1CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2wyOgpmcmFtZV9kaWcgLTEKY2FsbHN1YiBnZXRmdW5kc3RvdHJhZGVyXzgKZnJhbWVfZGlnIC0yCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0yCmNhbGxzdWIgZ2V0YXBwYWRkcl80CmZyYW1lX2RpZyAtMgpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18xIC8vIDAKPT0KYm56IGhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNApieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmIgaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2w2CmhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNDoKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmIgaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2w2CmhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNToKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmIgaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2wyCmhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNjoKZnJhbWVfZGlnIC0xCmNhbGxzdWIgZ2V0ZnVuZHN0b3RyYWRlcl84CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CmZyYW1lX2RpZyAtMQorCmFwcF9nbG9iYWxfcHV0CmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgphcHBfZ2xvYmFsX2dldApmcmFtZV9kaWcgLTEKKwphcHBfZ2xvYmFsX3B1dApyZXRzdWIKCi8vIGhhbmRsZV9hc2tfYXNrX2NvbXBsZW1lbnRfbWF0Y2gKaGFuZGxlYXNrYXNrY29tcGxlbWVudG1hdGNoXzE5Ogpwcm90byAzIDAKZnJhbWVfZGlnIC0yCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0zCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKKwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwotCmludGMgNCAvLyAxMDAwMDAwCjw9CmFzc2VydApmcmFtZV9kaWcgLTIKYnl0ZWMgMTAgLy8gInByaWNlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwotCmludGMgNCAvLyAxMDAwMDAwCmZyYW1lX2RpZyAtMwpieXRlYyAxMCAvLyAicHJpY2UiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8zCi0KPApibnogaGFuZGxlYXNrYXNrY29tcGxlbWVudG1hdGNoXzE5X2wyCmludGMgNCAvLyAxMDAwMDAwCmZyYW1lX2RpZyAtMwpieXRlYyAxMCAvLyAicHJpY2UiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8zCi0Kc3RvcmUgMTcKYiBoYW5kbGVhc2thc2tjb21wbGVtZW50bWF0Y2hfMTlfbDMKaGFuZGxlYXNrYXNrY29tcGxlbWVudG1hdGNoXzE5X2wyOgpmcmFtZV9kaWcgLTIKYnl0ZWMgMTAgLy8gInByaWNlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwotCnN0b3JlIDE3CmhhbmRsZWFza2Fza2NvbXBsZW1lbnRtYXRjaF8xOV9sMzoKZnJhbWVfZGlnIC0zCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0zCmNhbGxzdWIgZ2V0YXBwYWRkcl80CmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmZyYW1lX2RpZyAtMQpmcmFtZV9kaWcgLTMKYnl0ZWMgMTAgLy8gInByaWNlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwoqCmludGMgNCAvLyAxMDAwMDAwCi8KY2FsbHN1YiBnZXRmdW5kc3RvdHJhZGVyXzgKZnJhbWVfZGlnIC0yCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0yCmNhbGxzdWIgZ2V0YXBwYWRkcl80CmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmZyYW1lX2RpZyAtMQpsb2FkIDE3CioKaW50YyA0IC8vIDEwMDAwMDAKLwpmcmFtZV9kaWcgLTEKbG9hZCAxNwpieXRlYyAxNSAvLyAiZmVlX2Jhc2VfcGVyY2VudCIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBjYWxjdWxhdGVmZWVfMQotCmNhbGxzdWIgZ2V0ZnVuZHN0b3RyYWRlcl84Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCmZyYW1lX2RpZyAtMQpsb2FkIDE3CmJ5dGVjIDE1IC8vICJmZWVfYmFzZV9wZXJjZW50IgphcHBfZ2xvYmFsX2dldApjYWxsc3ViIGNhbGN1bGF0ZWZlZV8xCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmJ5dGVjIDIxIC8vICJmZWVfYWRkcmVzcyIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgphcHBfZ2xvYmFsX2dldApmcmFtZV9kaWcgLTEKLQphcHBfZ2xvYmFsX3B1dApieXRlY18yIC8vICJub19zdXBwbHkiCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKZnJhbWVfZGlnIC0xCi0KYXBwX2dsb2JhbF9wdXQKcmV0c3ViCgovLyBwcm9jZXNzX3BvdGVudGlhbF9tYXRjaApwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjA6CnByb3RvIDIgMQppbnRjXzEgLy8gMApmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmZyYW1lX2RpZyAtMQp0eG5hcyBBcHBsaWNhdGlvbnMKY2FsbHN1YiB2YWxpZGF0ZW1hdGNoZ3JvdXBzdHJ1Y3R1cmVfMTYKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmNhbGxzdWIgdmFsaWRhdGVtYXJrZXRjb25zaXN0ZW5jeV8xNwpieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMgp0eG5hcyBBcHBsaWNhdGlvbnMKY2FsbHN1YiBnZXRhcHBjcmVhdG9yXzUKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMQp0eG5hcyBBcHBsaWNhdGlvbnMKY2FsbHN1YiBnZXRhcHBjcmVhdG9yXzUKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMgp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWMgMjUgLy8gImZlZV90aW1lcl9zdGFydCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAyNSAvLyAiZmVlX3RpbWVyX3N0YXJ0IgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwo8PQphc3NlcnQKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18xIC8vIDAKPT0KZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18xIC8vIDAKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKfHwKYm56IHByb2Nlc3Nwb3RlbnRpYWxtYXRjaF8yMF9sMwpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzAgLy8gMQo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzAgLy8gMQo9PQpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgp8fApieiBwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjBfbDQKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnNhIEFwcGxpY2F0aW9uQXJncyAyCmJ0b2kKY2FsbHN1YiBoYW5kbGVhc2thc2tjb21wbGVtZW50bWF0Y2hfMTkKYiBwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjBfbDQKcHJvY2Vzc3BvdGVudGlhbG1hdGNoXzIwX2wzOgpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmZyYW1lX2RpZyAtMQp0eG5hcyBBcHBsaWNhdGlvbnMKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhuc2EgQXBwbGljYXRpb25BcmdzIDIKYnRvaQpjYWxsc3ViIGhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOApwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjBfbDQ6CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gcmVzb2x2ZV9tYXJrZXQKcmVzb2x2ZW1hcmtldF8yMToKcHJvdG8gMSAxCmludGNfMSAvLyAwCnR4biBTZW5kZXIKYnl0ZWMgMjAgLy8gIm9yYWNsZV9hZGRyZXNzIgphcHBfZ2xvYmFsX2dldAo9PQphc3NlcnQKYnl0ZWMgMTggLy8gIm91dGNvbWUiCmZyYW1lX2RpZyAtMQphcHBfZ2xvYmFsX3B1dApieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKaW50Y18wIC8vIDEKYXBwX2dsb2JhbF9wdXQKaW50Y18wIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBtZXJnZV9zaGFyZXMKbWVyZ2VzaGFyZXNfMjI6CnByb3RvIDAgMQppbnRjXzEgLy8gMApieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgVHlwZUVudW0KcHVzaGludCA0IC8vIGF4ZmVyCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0UmVjZWl2ZXIKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBYZmVyQXNzZXQKPT0KYXNzZXJ0CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBBc3NldEFtb3VudAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50Cj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmludGNfMSAvLyAwCj4KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgU2VuZGVyCnR4biBTZW5kZXIKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgU2VuZGVyCnR4biBTZW5kZXIKPT0KYXNzZXJ0Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgQXNzZXRBbW91bnQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIFNlbmRlcgpjYWxsc3ViIHNlbmRhc3NldF82CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApieXRlY18yIC8vICJub19zdXBwbHkiCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAotCmFwcF9nbG9iYWxfcHV0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gc3BsaXRfc2hhcmVzCnNwbGl0c2hhcmVzXzIzOgpwcm90byAwIDEKaW50Y18xIC8vIDAKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMSAvLyAwCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydApieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAppbnRjXzEgLy8gMAo+CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFNlbmRlcgp0eG4gU2VuZGVyCj09CmFzc2VydApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIFNlbmRlcgpjYWxsc3ViIHNlbmRhc3NldF82Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBTZW5kZXIKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CisKYXBwX2dsb2JhbF9wdXQKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgpieXRlY18yIC8vICJub19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKKwphcHBfZ2xvYmFsX3B1dAppbnRjXzAgLy8gMQpmcmFtZV9idXJ5IDAKZnJhbWVfZGlnIDAKaW50Y18zIC8vIDI1Ngo8CmFzc2VydApyZXRzdWIKCi8vIGNsYWltCmNsYWltXzI0Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMCAvLyAxCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydApieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQp8fAphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBTZW5kZXIKdHhuIFNlbmRlcgo9PQphc3NlcnQKYnl0ZWMgMTggLy8gIm91dGNvbWUiCmFwcF9nbG9iYWxfZ2V0CmludGNfMCAvLyAxCj09CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKPT0KJiYKYm56IGNsYWltXzI0X2wxMgpieXRlYyAxOCAvLyAib3V0Y29tZSIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CiYmCmJueiBjbGFpbV8yNF9sMTEKYnl0ZWMgMTggLy8gIm91dGNvbWUiCmFwcF9nbG9iYWxfZ2V0CmludGNfMiAvLyAyCj09CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQpieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09Cnx8CiYmCmJueiBjbGFpbV8yNF9sNwpieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CmJueiBjbGFpbV8yNF9sNgpieXRlYyA0IC8vICJub19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKPT0KYnogY2xhaW1fMjRfbDEzCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50Ci0KYXBwX2dsb2JhbF9wdXQKYiBjbGFpbV8yNF9sMTMKY2xhaW1fMjRfbDY6CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApiIGNsYWltXzI0X2wxMwpjbGFpbV8yNF9sNzoKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAppbnRjXzIgLy8gMgovCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBTZW5kZXIKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlYyA0IC8vICJub19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKPT0KYm56IGNsYWltXzI0X2wxMApieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CmJ6IGNsYWltXzI0X2wxMwpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50Ci0KYXBwX2dsb2JhbF9wdXQKYiBjbGFpbV8yNF9sMTMKY2xhaW1fMjRfbDEwOgpieXRlY18yIC8vICJub19zdXBwbHkiCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAotCmFwcF9nbG9iYWxfcHV0CmIgY2xhaW1fMjRfbDEzCmNsYWltXzI0X2wxMToKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudApieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gU2VuZGVyCmNhbGxzdWIgc2VuZGFzc2V0XzYKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgpieXRlY18yIC8vICJub19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApiIGNsYWltXzI0X2wxMwpjbGFpbV8yNF9sMTI6Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIFNlbmRlcgpjYWxsc3ViIHNlbmRhc3NldF82CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApjbGFpbV8yNF9sMTM6CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gZG9uYXRlX2V4Y2Vzc190b19tYXJrZXRfZnJpZW5kCmRvbmF0ZWV4Y2Vzc3RvbWFya2V0ZnJpZW5kXzI1Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKdHhuIFNlbmRlcgpieXRlYyA5IC8vICJtYXJrZXRfZnJpZW5kX2FkZHIiCmFwcF9nbG9iYWxfZ2V0Cj09CmFzc2VydApieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwpjYWxsc3ViIHNhZmV3YWxsZXRiYWxhbmNlXzkKYnl0ZWNfMSAvLyAieWVzX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgphcHBfZ2xvYmFsX2dldAorCj4KYnogZG9uYXRlZXhjZXNzdG9tYXJrZXRmcmllbmRfMjVfbDIKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKY2FsbHN1YiBzYWZld2FsbGV0YmFsYW5jZV85CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKKwotCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBzZW5kYXNzZXRfNgpkb25hdGVleGNlc3N0b21hcmtldGZyaWVuZF8yNV9sMjoKaW50Y18wIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBkZWxldGVfZXNjcm93CmRlbGV0ZWVzY3Jvd18yNjoKcHJvdG8gMiAxCmludGNfMSAvLyAwCmZyYW1lX2RpZyAtMgpjYWxsc3ViIGdldGFwcGNyZWF0b3JfNQpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwo9PQphc3NlcnQKdHhuIFNlbmRlcgpmcmFtZV9kaWcgLTIKYnl0ZWMgMTMgLy8gIm93bmVyIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwo9PQp0eG4gU2VuZGVyCmJ5dGVjIDIyIC8vICJlc2Nyb3dfY2FuY2VsX2FkZHJlc3MiCmFwcF9nbG9iYWxfZ2V0Cj09Cnx8CmFzc2VydAppdHhuX2JlZ2luCnB1c2hpbnQgNiAvLyBhcHBsCml0eG5fZmllbGQgVHlwZUVudW0KZnJhbWVfZGlnIC0yCml0eG5fZmllbGQgQXBwbGljYXRpb25JRApieXRlYyAxOSAvLyAiZGVsZXRlKCl1aW50OCIKaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCml0eG5fZmllbGQgT25Db21wbGV0aW9uCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIEFzc2V0cwpieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRzCmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIEFzc2V0cwp0eG4gU2VuZGVyCml0eG5fZmllbGQgQWNjb3VudHMKZnJhbWVfZGlnIC0yCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaXR4bl9maWVsZCBBY2NvdW50cwppdHhuX3N1Ym1pdApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwpwdXNoaW50IDU1NjUwMCAvLyA1NTY1MDAKZnJhbWVfZGlnIC0xCmNhbGxzdWIgc2VuZGFsZ29fNwppbnRjXzAgLy8gMQpmcmFtZV9idXJ5IDAKZnJhbWVfZGlnIDAKaW50Y18zIC8vIDI1Ngo8CmFzc2VydApyZXRzdWIKCi8vIGRlbGV0ZQpkZWxldGVfMjc6CnByb3RvIDAgMQppbnRjXzEgLy8gMAp0eG4gU2VuZGVyCmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKPT0KYXNzZXJ0CmJ5dGVjIDggLy8gImlzX3Jlc29sdmVkIgphcHBfZ2xvYmFsX2dldAppbnRjXzAgLy8gMQo9PQphc3NlcnQKaXR4bl9iZWdpbgpwdXNoaW50IDQgLy8gYXhmZXIKaXR4bl9maWVsZCBUeXBlRW51bQpieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIFhmZXJBc3NldApieXRlYyA5IC8vICJtYXJrZXRfZnJpZW5kX2FkZHIiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgppbnRjXzEgLy8gMAppdHhuX2ZpZWxkIEZlZQppbnRjXzEgLy8gMAppdHhuX2ZpZWxkIEFzc2V0QW1vdW50CmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBBc3NldENsb3NlVG8KaXR4bl9zdWJtaXQKaXR4bl9iZWdpbgpwdXNoaW50IDMgLy8gYWNmZwppdHhuX2ZpZWxkIFR5cGVFbnVtCmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBDb25maWdBc3NldAppdHhuX3N1Ym1pdAppdHhuX2JlZ2luCnB1c2hpbnQgMyAvLyBhY2ZnCml0eG5fZmllbGQgVHlwZUVudW0KYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQ29uZmlnQXNzZXQKaXR4bl9zdWJtaXQKaXR4bl9iZWdpbgppbnRjXzAgLy8gcGF5Cml0eG5fZmllbGQgVHlwZUVudW0KaW50Y18xIC8vIDAKaXR4bl9maWVsZCBBbW91bnQKYnl0ZWMgOSAvLyAibWFya2V0X2ZyaWVuZF9hZGRyIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIFJlY2VpdmVyCmludGNfMSAvLyAwCml0eG5fZmllbGQgRmVlCmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCml0eG5fc3VibWl0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gZG9fbm9vcApkb25vb3BfMjg6CnByb3RvIDEgMQppbnRjXzEgLy8gMApmcmFtZV9kaWcgLTEKZnJhbWVfYnVyeSAwCnJldHN1YgoKLy8gb25fdXBkYXRlCm9udXBkYXRlXzI5Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKdHhuIFNlbmRlcgpieXRlYyA5IC8vICJtYXJrZXRfZnJpZW5kX2FkZHIiCmFwcF9nbG9iYWxfZ2V0Cj09Cmdsb2JhbCBHcm91cFNpemUKaW50Y18wIC8vIDEKPT0KJiYKYXNzZXJ0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApyZXRzdWIKCi8vIG9uX2NyZWF0ZV9jYXN0ZXIKb25jcmVhdGVjYXN0ZXJfMzA6CnByb3RvIDAgMAppbnRjXzEgLy8gMApieXRlYyAxMiAvLyAiIgppbnRjXzEgLy8gMApieXRlYyAxMiAvLyAiIgppbnRjXzEgLy8gMApieXRlYyAxMiAvLyAiIgpkdXBuIDIKaW50Y18xIC8vIDAKZHVwCmJ5dGVjIDEyIC8vICIiCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKZnJhbWVfYnVyeSAxCnR4bmEgQXBwbGljYXRpb25BcmdzIDIKYnRvaQpmcmFtZV9idXJ5IDIKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwpmcmFtZV9idXJ5IDMKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNApidG9pCmZyYW1lX2J1cnkgNAp0eG5hIEFwcGxpY2F0aW9uQXJncyA1CmZyYW1lX2J1cnkgNQp0eG5hIEFwcGxpY2F0aW9uQXJncyA2CmZyYW1lX2J1cnkgNgp0eG5hIEFwcGxpY2F0aW9uQXJncyA3CmZyYW1lX2J1cnkgNwp0eG5hIEFwcGxpY2F0aW9uQXJncyA4CmJ0b2kKZnJhbWVfYnVyeSA4CnR4bmEgQXBwbGljYXRpb25BcmdzIDkKYnRvaQpmcmFtZV9idXJ5IDkKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKZnJhbWVfYnVyeSAxMApmcmFtZV9kaWcgMQpmcmFtZV9kaWcgMgpmcmFtZV9kaWcgMwpmcmFtZV9kaWcgNApmcmFtZV9kaWcgNQpmcmFtZV9kaWcgNgpmcmFtZV9kaWcgNwpmcmFtZV9kaWcgOApmcmFtZV9kaWcgOQpmcmFtZV9kaWcgMTAKY2FsbHN1YiBvbmNyZWF0ZV8xMApmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmJ5dGVjIDcgLy8gMHgwMAppbnRjXzEgLy8gMApmcmFtZV9kaWcgMApzZXRieXRlCmNvbmNhdApsb2cKcmV0c3ViCgovLyBjcmVhdGVfZXNjcm93X2Nhc3RlcgpjcmVhdGVlc2Nyb3djYXN0ZXJfMzE6CnByb3RvIDAgMAppbnRjXzEgLy8gMApkdXBuIDQKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQpidG9pCmZyYW1lX2J1cnkgMQp0eG5hIEFwcGxpY2F0aW9uQXJncyAyCmJ0b2kKZnJhbWVfYnVyeSAyCnR4bmEgQXBwbGljYXRpb25BcmdzIDMKYnRvaQpmcmFtZV9idXJ5IDMKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAppbnRjXzEgLy8gMApnZXRieXRlCmZyYW1lX2J1cnkgNApmcmFtZV9kaWcgMQpmcmFtZV9kaWcgMgpmcmFtZV9kaWcgMwpmcmFtZV9kaWcgNApjYWxsc3ViIGNyZWF0ZWVzY3Jvd18xNApmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmZyYW1lX2RpZyAwCml0b2IKY29uY2F0CmxvZwpyZXRzdWIKCi8vIGFjdGl2YXRlX21hcmtldF9jYXN0ZXIKYWN0aXZhdGVtYXJrZXRjYXN0ZXJfMzI6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIGFjdGl2YXRlbWFya2V0XzE1CmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIHByb2Nlc3NfcG90ZW50aWFsX21hdGNoX2Nhc3Rlcgpwcm9jZXNzcG90ZW50aWFsbWF0Y2hjYXN0ZXJfMzM6CnByb3RvIDAgMAppbnRjXzEgLy8gMApkdXBuIDIKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQppbnRjXzEgLy8gMApnZXRieXRlCmZyYW1lX2J1cnkgMQp0eG5hIEFwcGxpY2F0aW9uQXJncyAyCmludGNfMSAvLyAwCmdldGJ5dGUKZnJhbWVfYnVyeSAyCmZyYW1lX2RpZyAxCmZyYW1lX2RpZyAyCmNhbGxzdWIgcHJvY2Vzc3BvdGVudGlhbG1hdGNoXzIwCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIHJlc29sdmVfbWFya2V0X2Nhc3RlcgpyZXNvbHZlbWFya2V0Y2FzdGVyXzM0Ogpwcm90byAwIDAKaW50Y18xIC8vIDAKZHVwCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKaW50Y18xIC8vIDAKZ2V0Ynl0ZQpmcmFtZV9idXJ5IDEKZnJhbWVfZGlnIDEKY2FsbHN1YiByZXNvbHZlbWFya2V0XzIxCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIG1lcmdlX3NoYXJlc19jYXN0ZXIKbWVyZ2VzaGFyZXNjYXN0ZXJfMzU6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIG1lcmdlc2hhcmVzXzIyCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIHNwbGl0X3NoYXJlc19jYXN0ZXIKc3BsaXRzaGFyZXNjYXN0ZXJfMzY6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIHNwbGl0c2hhcmVzXzIzCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIGNsYWltX2Nhc3RlcgpjbGFpbWNhc3Rlcl8zNzoKcHJvdG8gMCAwCmludGNfMSAvLyAwCmNhbGxzdWIgY2xhaW1fMjQKZnJhbWVfYnVyeSAwCmJ5dGVjIDUgLy8gMHgxNTFmN2M3NQpieXRlYyA3IC8vIDB4MDAKaW50Y18xIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gZG9uYXRlX2V4Y2Vzc190b19tYXJrZXRfZnJpZW5kX2Nhc3Rlcgpkb25hdGVleGNlc3N0b21hcmtldGZyaWVuZGNhc3Rlcl8zODoKcHJvdG8gMCAwCmludGNfMSAvLyAwCmNhbGxzdWIgZG9uYXRlZXhjZXNzdG9tYXJrZXRmcmllbmRfMjUKZnJhbWVfYnVyeSAwCmJ5dGVjIDUgLy8gMHgxNTFmN2M3NQpieXRlYyA3IC8vIDB4MDAKaW50Y18xIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gZGVsZXRlX2VzY3Jvd19jYXN0ZXIKZGVsZXRlZXNjcm93Y2FzdGVyXzM5Ogpwcm90byAwIDAKaW50Y18xIC8vIDAKZHVwCmJ5dGVjIDEyIC8vICIiCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKYnRvaQpmcmFtZV9idXJ5IDEKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgpmcmFtZV9idXJ5IDIKZnJhbWVfZGlnIDEKZnJhbWVfZGlnIDIKY2FsbHN1YiBkZWxldGVlc2Nyb3dfMjYKZnJhbWVfYnVyeSAwCmJ5dGVjIDUgLy8gMHgxNTFmN2M3NQpieXRlYyA3IC8vIDB4MDAKaW50Y18xIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gZGVsZXRlX2Nhc3RlcgpkZWxldGVjYXN0ZXJfNDA6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIGRlbGV0ZV8yNwpmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmJ5dGVjIDcgLy8gMHgwMAppbnRjXzEgLy8gMApmcmFtZV9kaWcgMApzZXRieXRlCmNvbmNhdApsb2cKcmV0c3ViCgovLyBkb19ub29wX2Nhc3Rlcgpkb25vb3BjYXN0ZXJfNDE6CnByb3RvIDAgMAppbnRjXzEgLy8gMApkdXAKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQpidG9pCmZyYW1lX2J1cnkgMQpmcmFtZV9kaWcgMQpjYWxsc3ViIGRvbm9vcF8yOApmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmZyYW1lX2RpZyAwCml0b2IKY29uY2F0CmxvZwpyZXRzdWIKCi8vIG9uX3VwZGF0ZV9jYXN0ZXIKb251cGRhdGVjYXN0ZXJfNDI6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIG9udXBkYXRlXzI5CmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKZnJhbWVfZGlnIDAKaXRvYgpjb25jYXQKbG9nCnJldHN1Yg==",
|
|
101
|
+
"clear": "I3ByYWdtYSB2ZXJzaW9uIDgKcHVzaGludCAwIC8vIDAKcmV0dXJu"
|
|
102
|
+
},
|
|
103
|
+
"state": {
|
|
104
|
+
"global": {
|
|
105
|
+
"num_byte_slices": 6,
|
|
106
|
+
"num_uints": 11
|
|
107
|
+
},
|
|
108
|
+
"local": {
|
|
109
|
+
"num_byte_slices": 0,
|
|
110
|
+
"num_uints": 0
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"schema": {
|
|
114
|
+
"global": {
|
|
115
|
+
"declared": {
|
|
116
|
+
"collateral_asset_id": {
|
|
117
|
+
"type": "uint64",
|
|
118
|
+
"key": "collateral_asset_id",
|
|
119
|
+
"descr": "The asset id of the collatteral"
|
|
120
|
+
},
|
|
121
|
+
"escrow_cancel_address": {
|
|
122
|
+
"type": "bytes",
|
|
123
|
+
"key": "escrow_cancel_address",
|
|
124
|
+
"descr": "The address that can cancel escrows"
|
|
125
|
+
},
|
|
126
|
+
"fee_address": {
|
|
127
|
+
"type": "bytes",
|
|
128
|
+
"key": "fee_address",
|
|
129
|
+
"descr": "The address the fees go to"
|
|
130
|
+
},
|
|
131
|
+
"fee_base_percent": {
|
|
132
|
+
"type": "uint64",
|
|
133
|
+
"key": "fee_base_percent",
|
|
134
|
+
"descr": "The base fee percent of the market"
|
|
135
|
+
},
|
|
136
|
+
"fee_timer_threshold": {
|
|
137
|
+
"type": "uint64",
|
|
138
|
+
"key": "fee_timer_threshold",
|
|
139
|
+
"descr": "The number of seconds since fee_timer_start an order can match within to not pay fee"
|
|
140
|
+
},
|
|
141
|
+
"is_activated": {
|
|
142
|
+
"type": "uint64",
|
|
143
|
+
"key": "is_activated",
|
|
144
|
+
"descr": "The status of the market"
|
|
145
|
+
},
|
|
146
|
+
"is_resolved": {
|
|
147
|
+
"type": "uint64",
|
|
148
|
+
"key": "is_resolved",
|
|
149
|
+
"descr": "The status of the market"
|
|
150
|
+
},
|
|
151
|
+
"market_friend_addr": {
|
|
152
|
+
"type": "bytes",
|
|
153
|
+
"key": "market_friend_addr",
|
|
154
|
+
"descr": "The address of the market friend"
|
|
155
|
+
},
|
|
156
|
+
"no_asset_id": {
|
|
157
|
+
"type": "uint64",
|
|
158
|
+
"key": "no_asset_id",
|
|
159
|
+
"descr": "The asset id of the no outcome"
|
|
160
|
+
},
|
|
161
|
+
"no_supply": {
|
|
162
|
+
"type": "uint64",
|
|
163
|
+
"key": "no_supply",
|
|
164
|
+
"descr": "The supply of the no asset"
|
|
165
|
+
},
|
|
166
|
+
"oracle_address": {
|
|
167
|
+
"type": "bytes",
|
|
168
|
+
"key": "oracle_address",
|
|
169
|
+
"descr": "The address of the oracle"
|
|
170
|
+
},
|
|
171
|
+
"outcome": {
|
|
172
|
+
"type": "uint64",
|
|
173
|
+
"key": "outcome",
|
|
174
|
+
"descr": "The outcome of the market"
|
|
175
|
+
},
|
|
176
|
+
"resolution_time": {
|
|
177
|
+
"type": "uint64",
|
|
178
|
+
"key": "resolution_time",
|
|
179
|
+
"descr": "The timestamp the market should be resolved by (unix seconds)"
|
|
180
|
+
},
|
|
181
|
+
"rules": {
|
|
182
|
+
"type": "bytes",
|
|
183
|
+
"key": "rules",
|
|
184
|
+
"descr": "The rules of the market"
|
|
185
|
+
},
|
|
186
|
+
"title": {
|
|
187
|
+
"type": "bytes",
|
|
188
|
+
"key": "title",
|
|
189
|
+
"descr": "The name of the market"
|
|
190
|
+
},
|
|
191
|
+
"yes_asset_id": {
|
|
192
|
+
"type": "uint64",
|
|
193
|
+
"key": "yes_asset_id",
|
|
194
|
+
"descr": "The asset id of the yes outcome"
|
|
195
|
+
},
|
|
196
|
+
"yes_supply": {
|
|
197
|
+
"type": "uint64",
|
|
198
|
+
"key": "yes_supply",
|
|
199
|
+
"descr": "The supply of the yes asset"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"reserved": {}
|
|
203
|
+
},
|
|
204
|
+
"local": {
|
|
205
|
+
"declared": {},
|
|
206
|
+
"reserved": {}
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"contract": {
|
|
210
|
+
"name": "market_app",
|
|
211
|
+
"methods": [
|
|
212
|
+
{
|
|
213
|
+
"name": "on_create",
|
|
214
|
+
"args": [
|
|
215
|
+
{
|
|
216
|
+
"type": "string",
|
|
217
|
+
"name": "title"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"type": "uint64",
|
|
221
|
+
"name": "collateral_asset_id"
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"type": "address",
|
|
225
|
+
"name": "oracle_address"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"type": "uint64",
|
|
229
|
+
"name": "resolution_time"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"type": "address",
|
|
233
|
+
"name": "market_friend"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"type": "string",
|
|
237
|
+
"name": "rules"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"type": "address",
|
|
241
|
+
"name": "fee_address"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"type": "uint64",
|
|
245
|
+
"name": "fee_base_percent"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"type": "uint64",
|
|
249
|
+
"name": "fee_timer_threshhold"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"type": "address",
|
|
253
|
+
"name": "escrow_cancel_address"
|
|
254
|
+
}
|
|
255
|
+
],
|
|
256
|
+
"returns": {
|
|
257
|
+
"type": "uint8"
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"name": "create_escrow",
|
|
262
|
+
"args": [
|
|
263
|
+
{
|
|
264
|
+
"type": "uint64",
|
|
265
|
+
"name": "price"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"type": "uint64",
|
|
269
|
+
"name": "quantity"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"type": "uint64",
|
|
273
|
+
"name": "slippage"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"type": "uint8",
|
|
277
|
+
"name": "position"
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"returns": {
|
|
281
|
+
"type": "uint64"
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"name": "activate_market",
|
|
286
|
+
"args": [],
|
|
287
|
+
"returns": {
|
|
288
|
+
"type": "uint8"
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"name": "process_potential_match",
|
|
293
|
+
"args": [
|
|
294
|
+
{
|
|
295
|
+
"type": "application",
|
|
296
|
+
"name": "maker"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"type": "application",
|
|
300
|
+
"name": "taker"
|
|
301
|
+
}
|
|
302
|
+
],
|
|
303
|
+
"returns": {
|
|
304
|
+
"type": "uint8"
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
"name": "resolve_market",
|
|
309
|
+
"args": [
|
|
310
|
+
{
|
|
311
|
+
"type": "uint8",
|
|
312
|
+
"name": "resolution"
|
|
313
|
+
}
|
|
314
|
+
],
|
|
315
|
+
"returns": {
|
|
316
|
+
"type": "uint8"
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"name": "merge_shares",
|
|
321
|
+
"args": [],
|
|
322
|
+
"returns": {
|
|
323
|
+
"type": "uint8"
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"name": "split_shares",
|
|
328
|
+
"args": [],
|
|
329
|
+
"returns": {
|
|
330
|
+
"type": "uint8"
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"name": "claim",
|
|
335
|
+
"args": [],
|
|
336
|
+
"returns": {
|
|
337
|
+
"type": "uint8"
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"name": "donate_excess_to_market_friend",
|
|
342
|
+
"args": [],
|
|
343
|
+
"returns": {
|
|
344
|
+
"type": "uint8"
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"name": "delete_escrow",
|
|
349
|
+
"args": [
|
|
350
|
+
{
|
|
351
|
+
"type": "uint64",
|
|
352
|
+
"name": "escrow_app_id"
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"type": "address",
|
|
356
|
+
"name": "algo_receiver"
|
|
357
|
+
}
|
|
358
|
+
],
|
|
359
|
+
"returns": {
|
|
360
|
+
"type": "uint8"
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
"name": "delete",
|
|
365
|
+
"args": [],
|
|
366
|
+
"returns": {
|
|
367
|
+
"type": "uint8"
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"name": "do_noop",
|
|
372
|
+
"args": [
|
|
373
|
+
{
|
|
374
|
+
"type": "uint64",
|
|
375
|
+
"name": "call_number"
|
|
376
|
+
}
|
|
377
|
+
],
|
|
378
|
+
"returns": {
|
|
379
|
+
"type": "uint64"
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"name": "on_update",
|
|
384
|
+
"args": [],
|
|
385
|
+
"returns": {
|
|
386
|
+
"type": "uint64"
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
],
|
|
390
|
+
"networks": {}
|
|
391
|
+
},
|
|
392
|
+
"bare_call_config": {}
|
|
393
|
+
};
|
|
394
|
+
var MarketAppCallFactory = class {
|
|
395
|
+
/**
|
|
396
|
+
* Gets available create call factories
|
|
397
|
+
*/
|
|
398
|
+
static get create() {
|
|
399
|
+
return {
|
|
400
|
+
/**
|
|
401
|
+
* Constructs a create call for the market_app smart contract using the on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8 ABI method
|
|
402
|
+
*
|
|
403
|
+
* @param args Any args for the contract call
|
|
404
|
+
* @param params Any additional parameters for the call
|
|
405
|
+
* @returns A TypedCallParams object for the call
|
|
406
|
+
*/
|
|
407
|
+
onCreate(args, params = {}) {
|
|
408
|
+
return {
|
|
409
|
+
method: "on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8",
|
|
410
|
+
methodArgs: Array.isArray(args) ? args : [args.title, args.collateralAssetId, args.oracleAddress, args.resolutionTime, args.marketFriend, args.rules, args.feeAddress, args.feeBasePercent, args.feeTimerThreshhold, args.escrowCancelAddress],
|
|
411
|
+
...params
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Gets available update call factories
|
|
418
|
+
*/
|
|
419
|
+
static get update() {
|
|
420
|
+
return {
|
|
421
|
+
/**
|
|
422
|
+
* Constructs an update call for the market_app smart contract using the on_update()uint64 ABI method
|
|
423
|
+
*
|
|
424
|
+
* @param args Any args for the contract call
|
|
425
|
+
* @param params Any additional parameters for the call
|
|
426
|
+
* @returns A TypedCallParams object for the call
|
|
427
|
+
*/
|
|
428
|
+
onUpdate(args, params = {}) {
|
|
429
|
+
return {
|
|
430
|
+
method: "on_update()uint64",
|
|
431
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
432
|
+
...params
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Gets available delete call factories
|
|
439
|
+
*/
|
|
440
|
+
static get delete() {
|
|
441
|
+
return {
|
|
442
|
+
/**
|
|
443
|
+
* Constructs a delete call for the market_app smart contract using the delete()uint8 ABI method
|
|
444
|
+
*
|
|
445
|
+
* @param args Any args for the contract call
|
|
446
|
+
* @param params Any additional parameters for the call
|
|
447
|
+
* @returns A TypedCallParams object for the call
|
|
448
|
+
*/
|
|
449
|
+
delete(args, params = {}) {
|
|
450
|
+
return {
|
|
451
|
+
method: "delete()uint8",
|
|
452
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
453
|
+
...params
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Constructs a no op call for the create_escrow(uint64,uint64,uint64,uint8)uint64 ABI method
|
|
460
|
+
*
|
|
461
|
+
* @param args Any args for the contract call
|
|
462
|
+
* @param params Any additional parameters for the call
|
|
463
|
+
* @returns A TypedCallParams object for the call
|
|
464
|
+
*/
|
|
465
|
+
static createEscrow(args, params) {
|
|
466
|
+
return {
|
|
467
|
+
method: "create_escrow(uint64,uint64,uint64,uint8)uint64",
|
|
468
|
+
methodArgs: Array.isArray(args) ? args : [args.price, args.quantity, args.slippage, args.position],
|
|
469
|
+
...params
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Constructs a no op call for the activate_market()uint8 ABI method
|
|
474
|
+
*
|
|
475
|
+
* @param args Any args for the contract call
|
|
476
|
+
* @param params Any additional parameters for the call
|
|
477
|
+
* @returns A TypedCallParams object for the call
|
|
478
|
+
*/
|
|
479
|
+
static activateMarket(args, params) {
|
|
480
|
+
return {
|
|
481
|
+
method: "activate_market()uint8",
|
|
482
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
483
|
+
...params
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Constructs a no op call for the process_potential_match(application,application)uint8 ABI method
|
|
488
|
+
*
|
|
489
|
+
* @param args Any args for the contract call
|
|
490
|
+
* @param params Any additional parameters for the call
|
|
491
|
+
* @returns A TypedCallParams object for the call
|
|
492
|
+
*/
|
|
493
|
+
static processPotentialMatch(args, params) {
|
|
494
|
+
return {
|
|
495
|
+
method: "process_potential_match(application,application)uint8",
|
|
496
|
+
methodArgs: Array.isArray(args) ? args : [args.maker, args.taker],
|
|
497
|
+
...params
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Constructs a no op call for the resolve_market(uint8)uint8 ABI method
|
|
502
|
+
*
|
|
503
|
+
* @param args Any args for the contract call
|
|
504
|
+
* @param params Any additional parameters for the call
|
|
505
|
+
* @returns A TypedCallParams object for the call
|
|
506
|
+
*/
|
|
507
|
+
static resolveMarket(args, params) {
|
|
508
|
+
return {
|
|
509
|
+
method: "resolve_market(uint8)uint8",
|
|
510
|
+
methodArgs: Array.isArray(args) ? args : [args.resolution],
|
|
511
|
+
...params
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Constructs a no op call for the merge_shares()uint8 ABI method
|
|
516
|
+
*
|
|
517
|
+
* @param args Any args for the contract call
|
|
518
|
+
* @param params Any additional parameters for the call
|
|
519
|
+
* @returns A TypedCallParams object for the call
|
|
520
|
+
*/
|
|
521
|
+
static mergeShares(args, params) {
|
|
522
|
+
return {
|
|
523
|
+
method: "merge_shares()uint8",
|
|
524
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
525
|
+
...params
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Constructs a no op call for the split_shares()uint8 ABI method
|
|
530
|
+
*
|
|
531
|
+
* @param args Any args for the contract call
|
|
532
|
+
* @param params Any additional parameters for the call
|
|
533
|
+
* @returns A TypedCallParams object for the call
|
|
534
|
+
*/
|
|
535
|
+
static splitShares(args, params) {
|
|
536
|
+
return {
|
|
537
|
+
method: "split_shares()uint8",
|
|
538
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
539
|
+
...params
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Constructs a no op call for the claim()uint8 ABI method
|
|
544
|
+
*
|
|
545
|
+
* @param args Any args for the contract call
|
|
546
|
+
* @param params Any additional parameters for the call
|
|
547
|
+
* @returns A TypedCallParams object for the call
|
|
548
|
+
*/
|
|
549
|
+
static claim(args, params) {
|
|
550
|
+
return {
|
|
551
|
+
method: "claim()uint8",
|
|
552
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
553
|
+
...params
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Constructs a no op call for the donate_excess_to_market_friend()uint8 ABI method
|
|
558
|
+
*
|
|
559
|
+
* @param args Any args for the contract call
|
|
560
|
+
* @param params Any additional parameters for the call
|
|
561
|
+
* @returns A TypedCallParams object for the call
|
|
562
|
+
*/
|
|
563
|
+
static donateExcessToMarketFriend(args, params) {
|
|
564
|
+
return {
|
|
565
|
+
method: "donate_excess_to_market_friend()uint8",
|
|
566
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
567
|
+
...params
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Constructs a no op call for the delete_escrow(uint64,address)uint8 ABI method
|
|
572
|
+
*
|
|
573
|
+
* @param args Any args for the contract call
|
|
574
|
+
* @param params Any additional parameters for the call
|
|
575
|
+
* @returns A TypedCallParams object for the call
|
|
576
|
+
*/
|
|
577
|
+
static deleteEscrow(args, params) {
|
|
578
|
+
return {
|
|
579
|
+
method: "delete_escrow(uint64,address)uint8",
|
|
580
|
+
methodArgs: Array.isArray(args) ? args : [args.escrowAppId, args.algoReceiver],
|
|
581
|
+
...params
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Constructs a no op call for the do_noop(uint64)uint64 ABI method
|
|
586
|
+
*
|
|
587
|
+
* @param args Any args for the contract call
|
|
588
|
+
* @param params Any additional parameters for the call
|
|
589
|
+
* @returns A TypedCallParams object for the call
|
|
590
|
+
*/
|
|
591
|
+
static doNoop(args, params) {
|
|
592
|
+
return {
|
|
593
|
+
method: "do_noop(uint64)uint64",
|
|
594
|
+
methodArgs: Array.isArray(args) ? args : [args.callNumber],
|
|
595
|
+
...params
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
};
|
|
599
|
+
var MarketAppClient = class _MarketAppClient {
|
|
600
|
+
/**
|
|
601
|
+
* Creates a new instance of `MarketAppClient`
|
|
602
|
+
*
|
|
603
|
+
* @param appDetails appDetails The details to identify the app to deploy
|
|
604
|
+
* @param algod An algod client instance
|
|
605
|
+
*/
|
|
606
|
+
constructor(appDetails, algod) {
|
|
607
|
+
this.algod = algod;
|
|
608
|
+
this.sender = appDetails.sender;
|
|
609
|
+
this.appClient = algokit3__namespace.getAppClient({
|
|
610
|
+
...appDetails,
|
|
611
|
+
app: APP_SPEC
|
|
612
|
+
}, algod);
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* The underlying `ApplicationClient` for when you want to have more flexibility
|
|
616
|
+
*/
|
|
617
|
+
appClient;
|
|
618
|
+
sender;
|
|
619
|
+
/**
|
|
620
|
+
* Checks for decode errors on the AppCallTransactionResult and maps the return value to the specified generic type
|
|
621
|
+
*
|
|
622
|
+
* @param result The AppCallTransactionResult to be mapped
|
|
623
|
+
* @param returnValueFormatter An optional delegate to format the return value if required
|
|
624
|
+
* @returns The smart contract response with an updated return value
|
|
625
|
+
*/
|
|
626
|
+
mapReturnValue(result, returnValueFormatter) {
|
|
627
|
+
if (result.return?.decodeError) {
|
|
628
|
+
throw result.return.decodeError;
|
|
629
|
+
}
|
|
630
|
+
const returnValue = result.return?.returnValue !== void 0 && returnValueFormatter !== void 0 ? returnValueFormatter(result.return.returnValue) : result.return?.returnValue;
|
|
631
|
+
return { ...result, return: returnValue };
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Calls the ABI method with the matching signature using an onCompletion code of NO_OP
|
|
635
|
+
*
|
|
636
|
+
* @param typedCallParams An object containing the method signature, args, and any other relevant parameters
|
|
637
|
+
* @param returnValueFormatter An optional delegate which when provided will be used to map non-undefined return values to the target type
|
|
638
|
+
* @returns The result of the smart contract call
|
|
639
|
+
*/
|
|
640
|
+
async call(typedCallParams, returnValueFormatter) {
|
|
641
|
+
return this.mapReturnValue(await this.appClient.call(typedCallParams), returnValueFormatter);
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* Idempotently deploys the market_app smart contract.
|
|
645
|
+
*
|
|
646
|
+
* @param params The arguments for the contract calls and any additional parameters for the call
|
|
647
|
+
* @returns The deployment result
|
|
648
|
+
*/
|
|
649
|
+
deploy(params = {}) {
|
|
650
|
+
const createArgs = params.createCall?.(MarketAppCallFactory.create);
|
|
651
|
+
const updateArgs = params.updateCall?.(MarketAppCallFactory.update);
|
|
652
|
+
const deleteArgs = params.deleteCall?.(MarketAppCallFactory.delete);
|
|
653
|
+
return this.appClient.deploy({
|
|
654
|
+
...params,
|
|
655
|
+
updateArgs,
|
|
656
|
+
deleteArgs,
|
|
657
|
+
createArgs,
|
|
658
|
+
createOnCompleteAction: createArgs?.onCompleteAction
|
|
659
|
+
});
|
|
660
|
+
}
|
|
661
|
+
/**
|
|
662
|
+
* Gets available create methods
|
|
663
|
+
*/
|
|
664
|
+
get create() {
|
|
665
|
+
const $this = this;
|
|
666
|
+
return {
|
|
667
|
+
/**
|
|
668
|
+
* Creates a new instance of the market_app smart contract using the on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8 ABI method.
|
|
669
|
+
*
|
|
670
|
+
* @param args The arguments for the smart contract call
|
|
671
|
+
* @param params Any additional parameters for the call
|
|
672
|
+
* @returns The create result
|
|
673
|
+
*/
|
|
674
|
+
async onCreate(args, params = {}) {
|
|
675
|
+
return $this.mapReturnValue(await $this.appClient.create(MarketAppCallFactory.create.onCreate(args, params)));
|
|
676
|
+
}
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Gets available update methods
|
|
681
|
+
*/
|
|
682
|
+
get update() {
|
|
683
|
+
const $this = this;
|
|
684
|
+
return {
|
|
685
|
+
/**
|
|
686
|
+
* Updates an existing instance of the market_app smart contract using the on_update()uint64 ABI method.
|
|
687
|
+
*
|
|
688
|
+
* @param args The arguments for the smart contract call
|
|
689
|
+
* @param params Any additional parameters for the call
|
|
690
|
+
* @returns The update result
|
|
691
|
+
*/
|
|
692
|
+
async onUpdate(args, params = {}) {
|
|
693
|
+
return $this.mapReturnValue(await $this.appClient.update(MarketAppCallFactory.update.onUpdate(args, params)));
|
|
694
|
+
}
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Gets available delete methods
|
|
699
|
+
*/
|
|
700
|
+
get delete() {
|
|
701
|
+
const $this = this;
|
|
702
|
+
return {
|
|
703
|
+
/**
|
|
704
|
+
* Deletes an existing instance of the market_app smart contract using the delete()uint8 ABI method.
|
|
705
|
+
*
|
|
706
|
+
* @param args The arguments for the smart contract call
|
|
707
|
+
* @param params Any additional parameters for the call
|
|
708
|
+
* @returns The delete result
|
|
709
|
+
*/
|
|
710
|
+
async delete(args, params = {}) {
|
|
711
|
+
return $this.mapReturnValue(await $this.appClient.delete(MarketAppCallFactory.delete.delete(args, params)));
|
|
712
|
+
}
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* Makes a clear_state call to an existing instance of the market_app smart contract.
|
|
717
|
+
*
|
|
718
|
+
* @param args The arguments for the bare call
|
|
719
|
+
* @returns The clear_state result
|
|
720
|
+
*/
|
|
721
|
+
clearState(args = {}) {
|
|
722
|
+
return this.appClient.clearState(args);
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* Calls the create_escrow(uint64,uint64,uint64,uint8)uint64 ABI method.
|
|
726
|
+
*
|
|
727
|
+
* @param args The arguments for the contract call
|
|
728
|
+
* @param params Any additional parameters for the call
|
|
729
|
+
* @returns The result of the call
|
|
730
|
+
*/
|
|
731
|
+
createEscrow(args, params = {}) {
|
|
732
|
+
return this.call(MarketAppCallFactory.createEscrow(args, params));
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Calls the activate_market()uint8 ABI method.
|
|
736
|
+
*
|
|
737
|
+
* @param args The arguments for the contract call
|
|
738
|
+
* @param params Any additional parameters for the call
|
|
739
|
+
* @returns The result of the call
|
|
740
|
+
*/
|
|
741
|
+
activateMarket(args, params = {}) {
|
|
742
|
+
return this.call(MarketAppCallFactory.activateMarket(args, params));
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* Calls the process_potential_match(application,application)uint8 ABI method.
|
|
746
|
+
*
|
|
747
|
+
* @param args The arguments for the contract call
|
|
748
|
+
* @param params Any additional parameters for the call
|
|
749
|
+
* @returns The result of the call
|
|
750
|
+
*/
|
|
751
|
+
processPotentialMatch(args, params = {}) {
|
|
752
|
+
return this.call(MarketAppCallFactory.processPotentialMatch(args, params));
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* Calls the resolve_market(uint8)uint8 ABI method.
|
|
756
|
+
*
|
|
757
|
+
* @param args The arguments for the contract call
|
|
758
|
+
* @param params Any additional parameters for the call
|
|
759
|
+
* @returns The result of the call
|
|
760
|
+
*/
|
|
761
|
+
resolveMarket(args, params = {}) {
|
|
762
|
+
return this.call(MarketAppCallFactory.resolveMarket(args, params));
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* Calls the merge_shares()uint8 ABI method.
|
|
766
|
+
*
|
|
767
|
+
* @param args The arguments for the contract call
|
|
768
|
+
* @param params Any additional parameters for the call
|
|
769
|
+
* @returns The result of the call
|
|
770
|
+
*/
|
|
771
|
+
mergeShares(args, params = {}) {
|
|
772
|
+
return this.call(MarketAppCallFactory.mergeShares(args, params));
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Calls the split_shares()uint8 ABI method.
|
|
776
|
+
*
|
|
777
|
+
* @param args The arguments for the contract call
|
|
778
|
+
* @param params Any additional parameters for the call
|
|
779
|
+
* @returns The result of the call
|
|
780
|
+
*/
|
|
781
|
+
splitShares(args, params = {}) {
|
|
782
|
+
return this.call(MarketAppCallFactory.splitShares(args, params));
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Calls the claim()uint8 ABI method.
|
|
786
|
+
*
|
|
787
|
+
* @param args The arguments for the contract call
|
|
788
|
+
* @param params Any additional parameters for the call
|
|
789
|
+
* @returns The result of the call
|
|
790
|
+
*/
|
|
791
|
+
claim(args, params = {}) {
|
|
792
|
+
return this.call(MarketAppCallFactory.claim(args, params));
|
|
793
|
+
}
|
|
794
|
+
/**
|
|
795
|
+
* Calls the donate_excess_to_market_friend()uint8 ABI method.
|
|
796
|
+
*
|
|
797
|
+
* @param args The arguments for the contract call
|
|
798
|
+
* @param params Any additional parameters for the call
|
|
799
|
+
* @returns The result of the call
|
|
800
|
+
*/
|
|
801
|
+
donateExcessToMarketFriend(args, params = {}) {
|
|
802
|
+
return this.call(MarketAppCallFactory.donateExcessToMarketFriend(args, params));
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* Calls the delete_escrow(uint64,address)uint8 ABI method.
|
|
806
|
+
*
|
|
807
|
+
* @param args The arguments for the contract call
|
|
808
|
+
* @param params Any additional parameters for the call
|
|
809
|
+
* @returns The result of the call
|
|
810
|
+
*/
|
|
811
|
+
deleteEscrow(args, params = {}) {
|
|
812
|
+
return this.call(MarketAppCallFactory.deleteEscrow(args, params));
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Calls the do_noop(uint64)uint64 ABI method.
|
|
816
|
+
*
|
|
817
|
+
* @param args The arguments for the contract call
|
|
818
|
+
* @param params Any additional parameters for the call
|
|
819
|
+
* @returns The result of the call
|
|
820
|
+
*/
|
|
821
|
+
doNoop(args, params = {}) {
|
|
822
|
+
return this.call(MarketAppCallFactory.doNoop(args, params));
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Extracts a binary state value out of an AppState dictionary
|
|
826
|
+
*
|
|
827
|
+
* @param state The state dictionary containing the state value
|
|
828
|
+
* @param key The key of the state value
|
|
829
|
+
* @returns A BinaryState instance containing the state value, or undefined if the key was not found
|
|
830
|
+
*/
|
|
831
|
+
static getBinaryState(state, key) {
|
|
832
|
+
const value = state[key];
|
|
833
|
+
if (!value) return void 0;
|
|
834
|
+
if (!("valueRaw" in value))
|
|
835
|
+
throw new Error(`Failed to parse state value for ${key}; received an int when expected a byte array`);
|
|
836
|
+
return {
|
|
837
|
+
asString() {
|
|
838
|
+
return value.value;
|
|
839
|
+
},
|
|
840
|
+
asByteArray() {
|
|
841
|
+
return value.valueRaw;
|
|
842
|
+
}
|
|
843
|
+
};
|
|
844
|
+
}
|
|
845
|
+
/**
|
|
846
|
+
* Extracts a integer state value out of an AppState dictionary
|
|
847
|
+
*
|
|
848
|
+
* @param state The state dictionary containing the state value
|
|
849
|
+
* @param key The key of the state value
|
|
850
|
+
* @returns An IntegerState instance containing the state value, or undefined if the key was not found
|
|
851
|
+
*/
|
|
852
|
+
static getIntegerState(state, key) {
|
|
853
|
+
const value = state[key];
|
|
854
|
+
if (!value) return void 0;
|
|
855
|
+
if ("valueRaw" in value)
|
|
856
|
+
throw new Error(`Failed to parse state value for ${key}; received a byte array when expected a number`);
|
|
857
|
+
return {
|
|
858
|
+
asBigInt() {
|
|
859
|
+
return typeof value.value === "bigint" ? value.value : BigInt(value.value);
|
|
860
|
+
},
|
|
861
|
+
asNumber() {
|
|
862
|
+
return typeof value.value === "bigint" ? Number(value.value) : value.value;
|
|
863
|
+
}
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
/**
|
|
867
|
+
* Returns the smart contract's global state wrapped in a strongly typed accessor with options to format the stored value
|
|
868
|
+
*/
|
|
869
|
+
async getGlobalState() {
|
|
870
|
+
const state = await this.appClient.getGlobalState();
|
|
871
|
+
return {
|
|
872
|
+
get collateralAssetId() {
|
|
873
|
+
return _MarketAppClient.getIntegerState(state, "collateral_asset_id");
|
|
874
|
+
},
|
|
875
|
+
get escrowCancelAddress() {
|
|
876
|
+
return _MarketAppClient.getBinaryState(state, "escrow_cancel_address");
|
|
877
|
+
},
|
|
878
|
+
get feeAddress() {
|
|
879
|
+
return _MarketAppClient.getBinaryState(state, "fee_address");
|
|
880
|
+
},
|
|
881
|
+
get feeBasePercent() {
|
|
882
|
+
return _MarketAppClient.getIntegerState(state, "fee_base_percent");
|
|
883
|
+
},
|
|
884
|
+
get feeTimerThreshold() {
|
|
885
|
+
return _MarketAppClient.getIntegerState(state, "fee_timer_threshold");
|
|
886
|
+
},
|
|
887
|
+
get isActivated() {
|
|
888
|
+
return _MarketAppClient.getIntegerState(state, "is_activated");
|
|
889
|
+
},
|
|
890
|
+
get isResolved() {
|
|
891
|
+
return _MarketAppClient.getIntegerState(state, "is_resolved");
|
|
892
|
+
},
|
|
893
|
+
get marketFriendAddr() {
|
|
894
|
+
return _MarketAppClient.getBinaryState(state, "market_friend_addr");
|
|
895
|
+
},
|
|
896
|
+
get noAssetId() {
|
|
897
|
+
return _MarketAppClient.getIntegerState(state, "no_asset_id");
|
|
898
|
+
},
|
|
899
|
+
get noSupply() {
|
|
900
|
+
return _MarketAppClient.getIntegerState(state, "no_supply");
|
|
901
|
+
},
|
|
902
|
+
get oracleAddress() {
|
|
903
|
+
return _MarketAppClient.getBinaryState(state, "oracle_address");
|
|
904
|
+
},
|
|
905
|
+
get outcome() {
|
|
906
|
+
return _MarketAppClient.getIntegerState(state, "outcome");
|
|
907
|
+
},
|
|
908
|
+
get resolutionTime() {
|
|
909
|
+
return _MarketAppClient.getIntegerState(state, "resolution_time");
|
|
910
|
+
},
|
|
911
|
+
get rules() {
|
|
912
|
+
return _MarketAppClient.getBinaryState(state, "rules");
|
|
913
|
+
},
|
|
914
|
+
get title() {
|
|
915
|
+
return _MarketAppClient.getBinaryState(state, "title");
|
|
916
|
+
},
|
|
917
|
+
get yesAssetId() {
|
|
918
|
+
return _MarketAppClient.getIntegerState(state, "yes_asset_id");
|
|
919
|
+
},
|
|
920
|
+
get yesSupply() {
|
|
921
|
+
return _MarketAppClient.getIntegerState(state, "yes_supply");
|
|
922
|
+
}
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
compose() {
|
|
926
|
+
const client = this;
|
|
927
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
928
|
+
let promiseChain = Promise.resolve();
|
|
929
|
+
const resultMappers = [];
|
|
930
|
+
return {
|
|
931
|
+
createEscrow(args, params) {
|
|
932
|
+
promiseChain = promiseChain.then(() => client.createEscrow(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
933
|
+
resultMappers.push(void 0);
|
|
934
|
+
return this;
|
|
935
|
+
},
|
|
936
|
+
activateMarket(args, params) {
|
|
937
|
+
promiseChain = promiseChain.then(() => client.activateMarket(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
938
|
+
resultMappers.push(void 0);
|
|
939
|
+
return this;
|
|
940
|
+
},
|
|
941
|
+
processPotentialMatch(args, params) {
|
|
942
|
+
promiseChain = promiseChain.then(() => client.processPotentialMatch(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
943
|
+
resultMappers.push(void 0);
|
|
944
|
+
return this;
|
|
945
|
+
},
|
|
946
|
+
resolveMarket(args, params) {
|
|
947
|
+
promiseChain = promiseChain.then(() => client.resolveMarket(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
948
|
+
resultMappers.push(void 0);
|
|
949
|
+
return this;
|
|
950
|
+
},
|
|
951
|
+
mergeShares(args, params) {
|
|
952
|
+
promiseChain = promiseChain.then(() => client.mergeShares(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
953
|
+
resultMappers.push(void 0);
|
|
954
|
+
return this;
|
|
955
|
+
},
|
|
956
|
+
splitShares(args, params) {
|
|
957
|
+
promiseChain = promiseChain.then(() => client.splitShares(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
958
|
+
resultMappers.push(void 0);
|
|
959
|
+
return this;
|
|
960
|
+
},
|
|
961
|
+
claim(args, params) {
|
|
962
|
+
promiseChain = promiseChain.then(() => client.claim(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
963
|
+
resultMappers.push(void 0);
|
|
964
|
+
return this;
|
|
965
|
+
},
|
|
966
|
+
donateExcessToMarketFriend(args, params) {
|
|
967
|
+
promiseChain = promiseChain.then(() => client.donateExcessToMarketFriend(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
968
|
+
resultMappers.push(void 0);
|
|
969
|
+
return this;
|
|
970
|
+
},
|
|
971
|
+
deleteEscrow(args, params) {
|
|
972
|
+
promiseChain = promiseChain.then(() => client.deleteEscrow(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
973
|
+
resultMappers.push(void 0);
|
|
974
|
+
return this;
|
|
975
|
+
},
|
|
976
|
+
doNoop(args, params) {
|
|
977
|
+
promiseChain = promiseChain.then(() => client.doNoop(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
978
|
+
resultMappers.push(void 0);
|
|
979
|
+
return this;
|
|
980
|
+
},
|
|
981
|
+
get update() {
|
|
982
|
+
const $this = this;
|
|
983
|
+
return {
|
|
984
|
+
onUpdate(args, params) {
|
|
985
|
+
promiseChain = promiseChain.then(() => client.update.onUpdate(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
986
|
+
resultMappers.push(void 0);
|
|
987
|
+
return $this;
|
|
988
|
+
}
|
|
989
|
+
};
|
|
990
|
+
},
|
|
991
|
+
get delete() {
|
|
992
|
+
const $this = this;
|
|
993
|
+
return {
|
|
994
|
+
delete(args, params) {
|
|
995
|
+
promiseChain = promiseChain.then(() => client.delete.delete(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
996
|
+
resultMappers.push(void 0);
|
|
997
|
+
return $this;
|
|
998
|
+
}
|
|
999
|
+
};
|
|
1000
|
+
},
|
|
1001
|
+
clearState(args) {
|
|
1002
|
+
promiseChain = promiseChain.then(() => client.clearState({ ...args, sendParams: { ...args?.sendParams, skipSending: true, atc } }));
|
|
1003
|
+
resultMappers.push(void 0);
|
|
1004
|
+
return this;
|
|
1005
|
+
},
|
|
1006
|
+
addTransaction(txn, defaultSender) {
|
|
1007
|
+
promiseChain = promiseChain.then(async () => atc.addTransaction(await algokit3__namespace.getTransactionWithSigner(txn, defaultSender ?? client.sender)));
|
|
1008
|
+
return this;
|
|
1009
|
+
},
|
|
1010
|
+
async atc() {
|
|
1011
|
+
await promiseChain;
|
|
1012
|
+
return atc;
|
|
1013
|
+
},
|
|
1014
|
+
async simulate(options) {
|
|
1015
|
+
await promiseChain;
|
|
1016
|
+
const result = await atc.simulate(client.algod, new algosdk2.modelsv2.SimulateRequest({ txnGroups: [], ...options }));
|
|
1017
|
+
return {
|
|
1018
|
+
...result,
|
|
1019
|
+
returns: result.methodResults?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
|
|
1020
|
+
};
|
|
1021
|
+
},
|
|
1022
|
+
async execute(sendParams) {
|
|
1023
|
+
await promiseChain;
|
|
1024
|
+
const result = await algokit3__namespace.sendAtomicTransactionComposer({ atc, sendParams }, client.algod);
|
|
1025
|
+
return {
|
|
1026
|
+
...result,
|
|
1027
|
+
returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
|
|
1028
|
+
};
|
|
1029
|
+
}
|
|
1030
|
+
};
|
|
1031
|
+
}
|
|
1032
|
+
};
|
|
1033
|
+
var APP_SPEC2 = {
|
|
1034
|
+
"hints": {
|
|
1035
|
+
"on_create()uint8": {
|
|
1036
|
+
"call_config": {
|
|
1037
|
+
"no_op": "CREATE"
|
|
1038
|
+
}
|
|
1039
|
+
},
|
|
1040
|
+
"propose_a_match(application,application,uint64,address,address,address,uint64)uint8": {
|
|
1041
|
+
"call_config": {
|
|
1042
|
+
"no_op": "CALL"
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
},
|
|
1046
|
+
"source": {
|
|
1047
|
+
"approval": "I3ByYWdtYSB2ZXJzaW9uIDgKaW50Y2Jsb2NrIDAgMSA2IDI1NgpieXRlY2Jsb2NrIDB4MDEgMHg2MzZmNmM2YzYxNzQ2NTcyNjE2YzVmNjE3MzczNjU3NDVmNjk2NCAweDc5NjU3MzVmNjE3MzczNjU3NDVmNjk2NCAweDZlNmY1ZjYxNzM3MzY1NzQ1ZjY5NjQgMHgxNTFmN2M3NSAweDAwCnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4NDNkYjYyYTEgLy8gIm9uX2NyZWF0ZSgpdWludDgiCj09CmJueiBtYWluX2w0CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4MTZhYzZkYmIgLy8gInByb3Bvc2VfYV9tYXRjaChhcHBsaWNhdGlvbixhcHBsaWNhdGlvbix1aW50NjQsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsdWludDY0KXVpbnQ4Igo9PQpibnogbWFpbl9sMwplcnIKbWFpbl9sMzoKdHhuIE9uQ29tcGxldGlvbgppbnRjXzAgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzAgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBwcm9wb3NlYW1hdGNoY2FzdGVyXzQKaW50Y18xIC8vIDEKcmV0dXJuCm1haW5fbDQ6CnR4biBPbkNvbXBsZXRpb24KaW50Y18wIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18wIC8vIDAKPT0KJiYKYXNzZXJ0CmNhbGxzdWIgb25jcmVhdGVjYXN0ZXJfMwppbnRjXzEgLy8gMQpyZXR1cm4KCi8vIGdsb2JhbF9tdXN0X2dldApnbG9iYWxtdXN0Z2V0XzA6CnByb3RvIDIgMQpmcmFtZV9kaWcgLTIKZnJhbWVfZGlnIC0xCmFwcF9nbG9iYWxfZ2V0X2V4CnN0b3JlIDIKc3RvcmUgMQpsb2FkIDIKYXNzZXJ0CmxvYWQgMQpyZXRzdWIKCi8vIG9uX2NyZWF0ZQpvbmNyZWF0ZV8xOgpwcm90byAwIDEKaW50Y18wIC8vIDAKaW50Y18xIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBwcm9wb3NlX2FfbWF0Y2gKcHJvcG9zZWFtYXRjaF8yOgpwcm90byA3IDEKaW50Y18wIC8vIDAKdHhuIEdyb3VwSW5kZXgKZnJhbWVfZGlnIC0xCi0KZ3R4bnMgTGFzdExvZwpwdXNoaW50IDQgLy8gNAp0eG4gR3JvdXBJbmRleApmcmFtZV9kaWcgLTEKLQpndHhucyBMYXN0TG9nCmxlbgpwdXNoaW50IDQgLy8gNAotCmV4dHJhY3QzCmJ0b2kKc3RvcmUgMAppdHhuX2JlZ2luCmludGNfMiAvLyBhcHBsCml0eG5fZmllbGQgVHlwZUVudW0KZnJhbWVfZGlnIC02CnR4bmFzIEFwcGxpY2F0aW9ucwppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKbG9hZCAwCml0eG5fZmllbGQgQXBwbGljYXRpb25zCnB1c2hieXRlcyAweDMyY2UyODFlIC8vICJtYXRjaF9tYWtlcihhcHBsaWNhdGlvbix1aW50NjQpdWludDgiCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmJ5dGVjXzAgLy8gMHgwMQppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTUKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwppbnRjXzAgLy8gMAppdHhuX2ZpZWxkIEZlZQpmcmFtZV9kaWcgLTQKaXR4bl9maWVsZCBBY2NvdW50cwpmcmFtZV9kaWcgLTIKaXR4bl9maWVsZCBBY2NvdW50cwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCml0eG5fZmllbGQgQXBwbGljYXRpb25zCmxvYWQgMAppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzEgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMiAvLyAieWVzX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzMgLy8gIm5vX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwppdHhuX25leHQKaW50Y18yIC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpsb2FkIDAKaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECmZyYW1lX2RpZyAtNgp0eG5hcyBBcHBsaWNhdGlvbnMKaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKcHVzaGJ5dGVzIDB4ZGI5MjJmYzIgLy8gIm1hdGNoX3Rha2VyKGFwcGxpY2F0aW9uKXVpbnQ2NCIKaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKYnl0ZWNfMCAvLyAweDAxCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmludGNfMCAvLyAwCml0eG5fZmllbGQgRmVlCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKZnJhbWVfZGlnIC02CnR4bmFzIEFwcGxpY2F0aW9ucwppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzEgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMiAvLyAieWVzX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzMgLy8gIm5vX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwpmcmFtZV9kaWcgLTMKaXR4bl9maWVsZCBBY2NvdW50cwpmcmFtZV9kaWcgLTIKaXR4bl9maWVsZCBBY2NvdW50cwppdHhuX25leHQKaW50Y18yIC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCml0eG5fZmllbGQgQXBwbGljYXRpb25JRApmcmFtZV9kaWcgLTYKdHhuYXMgQXBwbGljYXRpb25zCml0eG5fZmllbGQgQXBwbGljYXRpb25zCmxvYWQgMAppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpwdXNoYnl0ZXMgMHhiYTFkZWVmNSAvLyAicHJvY2Vzc19wb3RlbnRpYWxfbWF0Y2goYXBwbGljYXRpb24sYXBwbGljYXRpb24pdWludDgiCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmJ5dGVjXzAgLy8gMHgwMQppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpwdXNoYnl0ZXMgMHgwMiAvLyAweDAyCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmludGNfMCAvLyAwCml0eG5fZmllbGQgRmVlCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMSAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzAKaXR4bl9maWVsZCBBc3NldHMKZnJhbWVfZGlnIC03CnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlY18yIC8vICJ5ZXNfYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMyAvLyAibm9fYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtMwppdHhuX2ZpZWxkIEFjY291bnRzCmZyYW1lX2RpZyAtNAppdHhuX2ZpZWxkIEFjY291bnRzCmZyYW1lX2RpZyAtMgppdHhuX2ZpZWxkIEFjY291bnRzCml0eG5fbmV4dAppbnRjXzIgLy8gYXBwbAppdHhuX2ZpZWxkIFR5cGVFbnVtCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECmludGNfMCAvLyBOb09wCml0eG5fZmllbGQgT25Db21wbGV0aW9uCnB1c2hieXRlcyAweGI0ZjExYTE4IC8vICJkb19ub29wKHVpbnQ2NCl1aW50NjQiCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmludGNfMSAvLyAxCml0b2IKaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKaW50Y18wIC8vIDAKaXR4bl9maWVsZCBGZWUKaXR4bl9zdWJtaXQKaW50Y18xIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBvbl9jcmVhdGVfY2FzdGVyCm9uY3JlYXRlY2FzdGVyXzM6CnByb3RvIDAgMAppbnRjXzAgLy8gMApjYWxsc3ViIG9uY3JlYXRlXzEKZnJhbWVfYnVyeSAwCmJ5dGVjIDQgLy8gMHgxNTFmN2M3NQpieXRlYyA1IC8vIDB4MDAKaW50Y18wIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gcHJvcG9zZV9hX21hdGNoX2Nhc3Rlcgpwcm9wb3NlYW1hdGNoY2FzdGVyXzQ6CnByb3RvIDAgMAppbnRjXzAgLy8gMApkdXBuIDMKcHVzaGJ5dGVzIDB4IC8vICIiCmR1cG4gMgppbnRjXzAgLy8gMAp0eG5hIEFwcGxpY2F0aW9uQXJncyAxCmludGNfMCAvLyAwCmdldGJ5dGUKZnJhbWVfYnVyeSAxCnR4bmEgQXBwbGljYXRpb25BcmdzIDIKaW50Y18wIC8vIDAKZ2V0Ynl0ZQpmcmFtZV9idXJ5IDIKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwpidG9pCmZyYW1lX2J1cnkgMwp0eG5hIEFwcGxpY2F0aW9uQXJncyA0CmZyYW1lX2J1cnkgNAp0eG5hIEFwcGxpY2F0aW9uQXJncyA1CmZyYW1lX2J1cnkgNQp0eG5hIEFwcGxpY2F0aW9uQXJncyA2CmZyYW1lX2J1cnkgNgp0eG5hIEFwcGxpY2F0aW9uQXJncyA3CmJ0b2kKZnJhbWVfYnVyeSA3CmZyYW1lX2RpZyAxCmZyYW1lX2RpZyAyCmZyYW1lX2RpZyAzCmZyYW1lX2RpZyA0CmZyYW1lX2RpZyA1CmZyYW1lX2RpZyA2CmZyYW1lX2RpZyA3CmNhbGxzdWIgcHJvcG9zZWFtYXRjaF8yCmZyYW1lX2J1cnkgMApieXRlYyA0IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNSAvLyAweDAwCmludGNfMCAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWI=",
|
|
1048
|
+
"clear": "I3ByYWdtYSB2ZXJzaW9uIDgKcHVzaGludCAwIC8vIDAKcmV0dXJu"
|
|
1049
|
+
},
|
|
1050
|
+
"state": {
|
|
1051
|
+
"global": {
|
|
1052
|
+
"num_byte_slices": 0,
|
|
1053
|
+
"num_uints": 0
|
|
1054
|
+
},
|
|
1055
|
+
"local": {
|
|
1056
|
+
"num_byte_slices": 0,
|
|
1057
|
+
"num_uints": 0
|
|
1058
|
+
}
|
|
1059
|
+
},
|
|
1060
|
+
"schema": {
|
|
1061
|
+
"global": {
|
|
1062
|
+
"declared": {},
|
|
1063
|
+
"reserved": {}
|
|
1064
|
+
},
|
|
1065
|
+
"local": {
|
|
1066
|
+
"declared": {},
|
|
1067
|
+
"reserved": {}
|
|
1068
|
+
}
|
|
1069
|
+
},
|
|
1070
|
+
"contract": {
|
|
1071
|
+
"name": "matcher_app",
|
|
1072
|
+
"methods": [
|
|
1073
|
+
{
|
|
1074
|
+
"name": "on_create",
|
|
1075
|
+
"args": [],
|
|
1076
|
+
"returns": {
|
|
1077
|
+
"type": "uint8"
|
|
1078
|
+
}
|
|
1079
|
+
},
|
|
1080
|
+
{
|
|
1081
|
+
"name": "propose_a_match",
|
|
1082
|
+
"args": [
|
|
1083
|
+
{
|
|
1084
|
+
"type": "application",
|
|
1085
|
+
"name": "market_app"
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
"type": "application",
|
|
1089
|
+
"name": "maker"
|
|
1090
|
+
},
|
|
1091
|
+
{
|
|
1092
|
+
"type": "uint64",
|
|
1093
|
+
"name": "quantity_matched"
|
|
1094
|
+
},
|
|
1095
|
+
{
|
|
1096
|
+
"type": "address",
|
|
1097
|
+
"name": "taker_address"
|
|
1098
|
+
},
|
|
1099
|
+
{
|
|
1100
|
+
"type": "address",
|
|
1101
|
+
"name": "maker_address"
|
|
1102
|
+
},
|
|
1103
|
+
{
|
|
1104
|
+
"type": "address",
|
|
1105
|
+
"name": "fee_address"
|
|
1106
|
+
},
|
|
1107
|
+
{
|
|
1108
|
+
"type": "uint64",
|
|
1109
|
+
"name": "taker_app_created_index_offset"
|
|
1110
|
+
}
|
|
1111
|
+
],
|
|
1112
|
+
"returns": {
|
|
1113
|
+
"type": "uint8"
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
],
|
|
1117
|
+
"networks": {}
|
|
1118
|
+
},
|
|
1119
|
+
"bare_call_config": {}
|
|
1120
|
+
};
|
|
1121
|
+
var MatcherAppCallFactory = class {
|
|
1122
|
+
/**
|
|
1123
|
+
* Gets available create call factories
|
|
1124
|
+
*/
|
|
1125
|
+
static get create() {
|
|
1126
|
+
return {
|
|
1127
|
+
/**
|
|
1128
|
+
* Constructs a create call for the matcher_app smart contract using the on_create()uint8 ABI method
|
|
1129
|
+
*
|
|
1130
|
+
* @param args Any args for the contract call
|
|
1131
|
+
* @param params Any additional parameters for the call
|
|
1132
|
+
* @returns A TypedCallParams object for the call
|
|
1133
|
+
*/
|
|
1134
|
+
onCreate(args, params = {}) {
|
|
1135
|
+
return {
|
|
1136
|
+
method: "on_create()uint8",
|
|
1137
|
+
methodArgs: Array.isArray(args) ? args : [],
|
|
1138
|
+
...params
|
|
1139
|
+
};
|
|
1140
|
+
}
|
|
1141
|
+
};
|
|
1142
|
+
}
|
|
1143
|
+
/**
|
|
1144
|
+
* Constructs a no op call for the propose_a_match(application,application,uint64,address,address,address,uint64)uint8 ABI method
|
|
1145
|
+
*
|
|
1146
|
+
* @param args Any args for the contract call
|
|
1147
|
+
* @param params Any additional parameters for the call
|
|
1148
|
+
* @returns A TypedCallParams object for the call
|
|
1149
|
+
*/
|
|
1150
|
+
static proposeAMatch(args, params) {
|
|
1151
|
+
return {
|
|
1152
|
+
method: "propose_a_match(application,application,uint64,address,address,address,uint64)uint8",
|
|
1153
|
+
methodArgs: Array.isArray(args) ? args : [args.marketApp, args.maker, args.quantityMatched, args.takerAddress, args.makerAddress, args.feeAddress, args.takerAppCreatedIndexOffset],
|
|
1154
|
+
...params
|
|
1155
|
+
};
|
|
1156
|
+
}
|
|
1157
|
+
};
|
|
1158
|
+
var MatcherAppClient = class {
|
|
1159
|
+
/**
|
|
1160
|
+
* Creates a new instance of `MatcherAppClient`
|
|
1161
|
+
*
|
|
1162
|
+
* @param appDetails appDetails The details to identify the app to deploy
|
|
1163
|
+
* @param algod An algod client instance
|
|
1164
|
+
*/
|
|
1165
|
+
constructor(appDetails, algod) {
|
|
1166
|
+
this.algod = algod;
|
|
1167
|
+
this.sender = appDetails.sender;
|
|
1168
|
+
this.appClient = algokit3__namespace.getAppClient({
|
|
1169
|
+
...appDetails,
|
|
1170
|
+
app: APP_SPEC2
|
|
1171
|
+
}, algod);
|
|
1172
|
+
}
|
|
1173
|
+
/**
|
|
1174
|
+
* The underlying `ApplicationClient` for when you want to have more flexibility
|
|
1175
|
+
*/
|
|
1176
|
+
appClient;
|
|
1177
|
+
sender;
|
|
1178
|
+
/**
|
|
1179
|
+
* Checks for decode errors on the AppCallTransactionResult and maps the return value to the specified generic type
|
|
1180
|
+
*
|
|
1181
|
+
* @param result The AppCallTransactionResult to be mapped
|
|
1182
|
+
* @param returnValueFormatter An optional delegate to format the return value if required
|
|
1183
|
+
* @returns The smart contract response with an updated return value
|
|
1184
|
+
*/
|
|
1185
|
+
mapReturnValue(result, returnValueFormatter) {
|
|
1186
|
+
if (result.return?.decodeError) {
|
|
1187
|
+
throw result.return.decodeError;
|
|
1188
|
+
}
|
|
1189
|
+
const returnValue = result.return?.returnValue !== void 0 && returnValueFormatter !== void 0 ? returnValueFormatter(result.return.returnValue) : result.return?.returnValue;
|
|
1190
|
+
return { ...result, return: returnValue };
|
|
1191
|
+
}
|
|
1192
|
+
/**
|
|
1193
|
+
* Calls the ABI method with the matching signature using an onCompletion code of NO_OP
|
|
1194
|
+
*
|
|
1195
|
+
* @param typedCallParams An object containing the method signature, args, and any other relevant parameters
|
|
1196
|
+
* @param returnValueFormatter An optional delegate which when provided will be used to map non-undefined return values to the target type
|
|
1197
|
+
* @returns The result of the smart contract call
|
|
1198
|
+
*/
|
|
1199
|
+
async call(typedCallParams, returnValueFormatter) {
|
|
1200
|
+
return this.mapReturnValue(await this.appClient.call(typedCallParams), returnValueFormatter);
|
|
1201
|
+
}
|
|
1202
|
+
/**
|
|
1203
|
+
* Idempotently deploys the matcher_app smart contract.
|
|
1204
|
+
*
|
|
1205
|
+
* @param params The arguments for the contract calls and any additional parameters for the call
|
|
1206
|
+
* @returns The deployment result
|
|
1207
|
+
*/
|
|
1208
|
+
deploy(params = {}) {
|
|
1209
|
+
const createArgs = params.createCall?.(MatcherAppCallFactory.create);
|
|
1210
|
+
return this.appClient.deploy({
|
|
1211
|
+
...params,
|
|
1212
|
+
createArgs,
|
|
1213
|
+
createOnCompleteAction: createArgs?.onCompleteAction
|
|
1214
|
+
});
|
|
1215
|
+
}
|
|
1216
|
+
/**
|
|
1217
|
+
* Gets available create methods
|
|
1218
|
+
*/
|
|
1219
|
+
get create() {
|
|
1220
|
+
const $this = this;
|
|
1221
|
+
return {
|
|
1222
|
+
/**
|
|
1223
|
+
* Creates a new instance of the matcher_app smart contract using the on_create()uint8 ABI method.
|
|
1224
|
+
*
|
|
1225
|
+
* @param args The arguments for the smart contract call
|
|
1226
|
+
* @param params Any additional parameters for the call
|
|
1227
|
+
* @returns The create result
|
|
1228
|
+
*/
|
|
1229
|
+
async onCreate(args, params = {}) {
|
|
1230
|
+
return $this.mapReturnValue(await $this.appClient.create(MatcherAppCallFactory.create.onCreate(args, params)));
|
|
1231
|
+
}
|
|
1232
|
+
};
|
|
1233
|
+
}
|
|
1234
|
+
/**
|
|
1235
|
+
* Makes a clear_state call to an existing instance of the matcher_app smart contract.
|
|
1236
|
+
*
|
|
1237
|
+
* @param args The arguments for the bare call
|
|
1238
|
+
* @returns The clear_state result
|
|
1239
|
+
*/
|
|
1240
|
+
clearState(args = {}) {
|
|
1241
|
+
return this.appClient.clearState(args);
|
|
1242
|
+
}
|
|
1243
|
+
/**
|
|
1244
|
+
* Calls the propose_a_match(application,application,uint64,address,address,address,uint64)uint8 ABI method.
|
|
1245
|
+
*
|
|
1246
|
+
* @param args The arguments for the contract call
|
|
1247
|
+
* @param params Any additional parameters for the call
|
|
1248
|
+
* @returns The result of the call
|
|
1249
|
+
*/
|
|
1250
|
+
proposeAMatch(args, params = {}) {
|
|
1251
|
+
return this.call(MatcherAppCallFactory.proposeAMatch(args, params));
|
|
1252
|
+
}
|
|
1253
|
+
compose() {
|
|
1254
|
+
const client = this;
|
|
1255
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
1256
|
+
let promiseChain = Promise.resolve();
|
|
1257
|
+
const resultMappers = [];
|
|
1258
|
+
return {
|
|
1259
|
+
proposeAMatch(args, params) {
|
|
1260
|
+
promiseChain = promiseChain.then(() => client.proposeAMatch(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
|
|
1261
|
+
resultMappers.push(void 0);
|
|
1262
|
+
return this;
|
|
1263
|
+
},
|
|
1264
|
+
clearState(args) {
|
|
1265
|
+
promiseChain = promiseChain.then(() => client.clearState({ ...args, sendParams: { ...args?.sendParams, skipSending: true, atc } }));
|
|
1266
|
+
resultMappers.push(void 0);
|
|
1267
|
+
return this;
|
|
1268
|
+
},
|
|
1269
|
+
addTransaction(txn, defaultSender) {
|
|
1270
|
+
promiseChain = promiseChain.then(async () => atc.addTransaction(await algokit3__namespace.getTransactionWithSigner(txn, defaultSender ?? client.sender)));
|
|
1271
|
+
return this;
|
|
1272
|
+
},
|
|
1273
|
+
async atc() {
|
|
1274
|
+
await promiseChain;
|
|
1275
|
+
return atc;
|
|
1276
|
+
},
|
|
1277
|
+
async simulate(options) {
|
|
1278
|
+
await promiseChain;
|
|
1279
|
+
const result = await atc.simulate(client.algod, new algosdk2.modelsv2.SimulateRequest({ txnGroups: [], ...options }));
|
|
1280
|
+
return {
|
|
1281
|
+
...result,
|
|
1282
|
+
returns: result.methodResults?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
|
|
1283
|
+
};
|
|
1284
|
+
},
|
|
1285
|
+
async execute(sendParams) {
|
|
1286
|
+
await promiseChain;
|
|
1287
|
+
const result = await algokit3__namespace.sendAtomicTransactionComposer({ atc, sendParams }, client.algod);
|
|
1288
|
+
return {
|
|
1289
|
+
...result,
|
|
1290
|
+
returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
|
|
1291
|
+
};
|
|
1292
|
+
}
|
|
1293
|
+
};
|
|
1294
|
+
}
|
|
1295
|
+
};
|
|
1296
|
+
var calculateFee = (quantity, price, feeBase) => {
|
|
1297
|
+
const q = new decimal_js.Decimal(quantity.toString());
|
|
1298
|
+
const p = new decimal_js.Decimal(price.toString()).div(1e6);
|
|
1299
|
+
const fb = new decimal_js.Decimal(feeBase.toString()).div(1e6);
|
|
1300
|
+
const fee = fb.mul(q).mul(p).mul(new decimal_js.Decimal(1).minus(p));
|
|
1301
|
+
return Math.ceil(fee.toNumber());
|
|
1302
|
+
};
|
|
1303
|
+
var calculateFeeFromTotal = (totalAmount, price, feeBase) => {
|
|
1304
|
+
const total = new decimal_js.Decimal(totalAmount.toString());
|
|
1305
|
+
const p = new decimal_js.Decimal(price.toString()).div(1e6);
|
|
1306
|
+
const fb = new decimal_js.Decimal(feeBase.toString()).div(1e6);
|
|
1307
|
+
const denominator = p.mul(new decimal_js.Decimal(1).plus(fb.mul(new decimal_js.Decimal(1).minus(p))));
|
|
1308
|
+
const quantity = total.div(denominator);
|
|
1309
|
+
const fee = fb.mul(quantity).mul(p).mul(new decimal_js.Decimal(1).minus(p));
|
|
1310
|
+
return Math.ceil(fee.toNumber());
|
|
1311
|
+
};
|
|
1312
|
+
var decodeGlobalState = (rawState) => {
|
|
1313
|
+
const state = {};
|
|
1314
|
+
for (const item of rawState) {
|
|
1315
|
+
const key = Buffer.from(item.key, "base64").toString();
|
|
1316
|
+
if (item.value.type === 1) {
|
|
1317
|
+
if (key === "owner" || key === "oracle_address" || key === "fee_address" || key === "market_friend_addr" || key === "escrow_cancel_address") {
|
|
1318
|
+
try {
|
|
1319
|
+
const addressBytes = Buffer.from(item.value.bytes, "base64");
|
|
1320
|
+
if (addressBytes.length === 32) {
|
|
1321
|
+
state[key] = algosdk2__default.default.encodeAddress(addressBytes);
|
|
1322
|
+
} else {
|
|
1323
|
+
state[key] = item.value.bytes;
|
|
1324
|
+
}
|
|
1325
|
+
} catch {
|
|
1326
|
+
state[key] = item.value.bytes;
|
|
1327
|
+
}
|
|
1328
|
+
} else {
|
|
1329
|
+
try {
|
|
1330
|
+
state[key] = Buffer.from(item.value.bytes, "base64").toString();
|
|
1331
|
+
} catch {
|
|
1332
|
+
state[key] = item.value.bytes;
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
} else {
|
|
1336
|
+
state[key] = Number(item.value.uint);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
return state;
|
|
1340
|
+
};
|
|
1341
|
+
var getMarketGlobalState = async (algodClient, marketAppId) => {
|
|
1342
|
+
const appInfo = await algodClient.getApplicationByID(marketAppId).do();
|
|
1343
|
+
const rawState = appInfo.params?.["global-state"] ?? appInfo["params"]?.["global-state"] ?? [];
|
|
1344
|
+
return decodeGlobalState(rawState);
|
|
1345
|
+
};
|
|
1346
|
+
var getEscrowGlobalState = async (indexerClient, escrowAppId) => {
|
|
1347
|
+
const appInfo = await indexerClient.lookupApplications(escrowAppId).do();
|
|
1348
|
+
const rawState = appInfo.application?.params?.["global-state"] ?? [];
|
|
1349
|
+
return decodeGlobalState(rawState);
|
|
1350
|
+
};
|
|
1351
|
+
var checkAssetOptIn = async (algodClient, address, assetId) => {
|
|
1352
|
+
try {
|
|
1353
|
+
const accountInfo = await algodClient.accountInformation(address).do();
|
|
1354
|
+
const assets = accountInfo.assets || accountInfo["assets"] || [];
|
|
1355
|
+
return assets.some((a) => (a["asset-id"] ?? a.assetId) === assetId);
|
|
1356
|
+
} catch {
|
|
1357
|
+
return false;
|
|
1358
|
+
}
|
|
1359
|
+
};
|
|
1360
|
+
|
|
1361
|
+
// src/utils/matching.ts
|
|
1362
|
+
var calculateMatchingOrders = (orderbook, isBuying, isYes, quantity, price, slippageTolerance) => {
|
|
1363
|
+
const { yes, no } = orderbook;
|
|
1364
|
+
const getMatchingOrders = () => {
|
|
1365
|
+
if (isBuying) {
|
|
1366
|
+
if (isYes) {
|
|
1367
|
+
const directOrders = yes.asks;
|
|
1368
|
+
const complementaryOrders = no.bids.map((bid) => ({
|
|
1369
|
+
price: 1e6 - bid.price,
|
|
1370
|
+
quantity: bid.quantity,
|
|
1371
|
+
escrowAppId: bid.escrowAppId,
|
|
1372
|
+
owner: bid.owner
|
|
1373
|
+
}));
|
|
1374
|
+
const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => a.price - b.price);
|
|
1375
|
+
return allOrders.filter((order) => order.price <= price + slippageTolerance);
|
|
1376
|
+
} else {
|
|
1377
|
+
const directOrders = no.asks;
|
|
1378
|
+
const complementaryOrders = yes.bids.map((bid) => ({
|
|
1379
|
+
price: 1e6 - bid.price,
|
|
1380
|
+
quantity: bid.quantity,
|
|
1381
|
+
escrowAppId: bid.escrowAppId,
|
|
1382
|
+
owner: bid.owner
|
|
1383
|
+
}));
|
|
1384
|
+
const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => a.price - b.price);
|
|
1385
|
+
return allOrders.filter((order) => order.price <= price + slippageTolerance);
|
|
1386
|
+
}
|
|
1387
|
+
} else {
|
|
1388
|
+
if (isYes) {
|
|
1389
|
+
const directOrders = yes.bids;
|
|
1390
|
+
const complementaryOrders = no.asks.map((ask) => ({
|
|
1391
|
+
price: 1e6 - ask.price,
|
|
1392
|
+
quantity: ask.quantity,
|
|
1393
|
+
escrowAppId: ask.escrowAppId,
|
|
1394
|
+
owner: ask.owner
|
|
1395
|
+
}));
|
|
1396
|
+
const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => b.price - a.price);
|
|
1397
|
+
return allOrders.filter((order) => order.price >= price - slippageTolerance);
|
|
1398
|
+
} else {
|
|
1399
|
+
const directOrders = no.bids;
|
|
1400
|
+
const complementaryOrders = yes.asks.map((ask) => ({
|
|
1401
|
+
price: 1e6 - ask.price,
|
|
1402
|
+
quantity: ask.quantity,
|
|
1403
|
+
escrowAppId: ask.escrowAppId,
|
|
1404
|
+
owner: ask.owner
|
|
1405
|
+
}));
|
|
1406
|
+
const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => b.price - a.price);
|
|
1407
|
+
return allOrders.filter((order) => order.price >= price - slippageTolerance);
|
|
1408
|
+
}
|
|
1409
|
+
}
|
|
1410
|
+
};
|
|
1411
|
+
const matchingOrders = getMatchingOrders();
|
|
1412
|
+
if (matchingOrders.length === 0) return [];
|
|
1413
|
+
const matches = [];
|
|
1414
|
+
let volumeLeft = quantity;
|
|
1415
|
+
for (const counterParty of matchingOrders) {
|
|
1416
|
+
if (volumeLeft <= 0) break;
|
|
1417
|
+
const amountToTake = Math.min(counterParty.quantity, volumeLeft);
|
|
1418
|
+
if (amountToTake > 0) {
|
|
1419
|
+
matches.push({
|
|
1420
|
+
escrowAppId: counterParty.escrowAppId,
|
|
1421
|
+
quantity: amountToTake,
|
|
1422
|
+
owner: counterParty.owner
|
|
1423
|
+
});
|
|
1424
|
+
volumeLeft -= amountToTake;
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
return matches;
|
|
1428
|
+
};
|
|
1429
|
+
var getAllCreatedApplications = async (indexerClient, address, limit = 100) => {
|
|
1430
|
+
let applications = [];
|
|
1431
|
+
let nextToken;
|
|
1432
|
+
let hasMore = true;
|
|
1433
|
+
while (hasMore) {
|
|
1434
|
+
let query = indexerClient.lookupAccountCreatedApplications(address).limit(limit);
|
|
1435
|
+
if (nextToken) {
|
|
1436
|
+
query = query.nextToken(nextToken);
|
|
1437
|
+
}
|
|
1438
|
+
const response = await query.do();
|
|
1439
|
+
if (response.applications?.length) {
|
|
1440
|
+
applications = [...applications, ...response.applications];
|
|
1441
|
+
}
|
|
1442
|
+
if (response["next-token"]) {
|
|
1443
|
+
nextToken = response["next-token"];
|
|
1444
|
+
} else {
|
|
1445
|
+
hasMore = false;
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
return applications.filter((a) => a.deleted === false);
|
|
1449
|
+
};
|
|
1450
|
+
var fetchApplicationsGlobalState = async (indexerClient, applications) => {
|
|
1451
|
+
return Promise.all(
|
|
1452
|
+
applications.map(async (app) => {
|
|
1453
|
+
const appId = app.id;
|
|
1454
|
+
try {
|
|
1455
|
+
const appInfo = await indexerClient.lookupApplications(appId).do();
|
|
1456
|
+
const globalState = {};
|
|
1457
|
+
const rawGlobalState = appInfo.application?.params?.["global-state"];
|
|
1458
|
+
if (rawGlobalState) {
|
|
1459
|
+
const decoded = decodeGlobalState(rawGlobalState);
|
|
1460
|
+
Object.assign(globalState, decoded);
|
|
1461
|
+
}
|
|
1462
|
+
return { appId: Number(appId), globalState };
|
|
1463
|
+
} catch {
|
|
1464
|
+
return { appId: 0, globalState: {} };
|
|
1465
|
+
}
|
|
1466
|
+
})
|
|
1467
|
+
);
|
|
1468
|
+
};
|
|
1469
|
+
var transformOrders = (orders) => orders.filter((o) => o.appId > 0).map((o) => ({
|
|
1470
|
+
price: o.globalState.price ?? 0,
|
|
1471
|
+
quantity: (o.globalState.quantity ?? 0) - (o.globalState.quantity_filled ?? 0),
|
|
1472
|
+
escrowAppId: o.appId,
|
|
1473
|
+
owner: o.globalState.owner ?? ""
|
|
1474
|
+
}));
|
|
1475
|
+
var getOrderbook = async (config, marketAppId) => {
|
|
1476
|
+
const appAddress = algosdk2__default.default.getApplicationAddress(marketAppId);
|
|
1477
|
+
const applications = await getAllCreatedApplications(config.indexerClient, appAddress);
|
|
1478
|
+
const appsWithState = await fetchApplicationsGlobalState(config.indexerClient, applications);
|
|
1479
|
+
const isOpenLimitOrder = (o) => (o.globalState.quantity ?? 0) > (o.globalState.quantity_filled ?? 0) && o.globalState.slippage === 0;
|
|
1480
|
+
const yesBuyOrders = appsWithState.filter(
|
|
1481
|
+
(o) => o.globalState.side === 1 && o.globalState.position === 1 && isOpenLimitOrder(o)
|
|
1482
|
+
);
|
|
1483
|
+
const yesSellOrders = appsWithState.filter(
|
|
1484
|
+
(o) => o.globalState.side === 0 && o.globalState.position === 1 && isOpenLimitOrder(o)
|
|
1485
|
+
);
|
|
1486
|
+
const noBuyOrders = appsWithState.filter(
|
|
1487
|
+
(o) => o.globalState.side === 1 && o.globalState.position === 0 && isOpenLimitOrder(o)
|
|
1488
|
+
);
|
|
1489
|
+
const noSellOrders = appsWithState.filter(
|
|
1490
|
+
(o) => o.globalState.side === 0 && o.globalState.position === 0 && isOpenLimitOrder(o)
|
|
1491
|
+
);
|
|
1492
|
+
return {
|
|
1493
|
+
yes: {
|
|
1494
|
+
bids: transformOrders(yesBuyOrders),
|
|
1495
|
+
asks: transformOrders(yesSellOrders)
|
|
1496
|
+
},
|
|
1497
|
+
no: {
|
|
1498
|
+
bids: transformOrders(noBuyOrders),
|
|
1499
|
+
asks: transformOrders(noSellOrders)
|
|
1500
|
+
}
|
|
1501
|
+
};
|
|
1502
|
+
};
|
|
1503
|
+
var getOpenOrders = async (config, marketAppId, walletAddress) => {
|
|
1504
|
+
const owner = walletAddress ?? config.activeAddress;
|
|
1505
|
+
const appAddress = algosdk2__default.default.getApplicationAddress(marketAppId);
|
|
1506
|
+
const applications = await getAllCreatedApplications(config.indexerClient, appAddress);
|
|
1507
|
+
const appsWithState = await fetchApplicationsGlobalState(config.indexerClient, applications);
|
|
1508
|
+
return appsWithState.filter(
|
|
1509
|
+
(o) => o.globalState.owner === owner && (o.globalState.quantity ?? 0) > (o.globalState.quantity_filled ?? 0)
|
|
1510
|
+
).map((o) => ({
|
|
1511
|
+
escrowAppId: o.appId,
|
|
1512
|
+
marketAppId,
|
|
1513
|
+
position: o.globalState.position ?? 0,
|
|
1514
|
+
side: o.globalState.side ?? 0,
|
|
1515
|
+
price: o.globalState.price ?? 0,
|
|
1516
|
+
quantity: o.globalState.quantity ?? 0,
|
|
1517
|
+
quantityFilled: o.globalState.quantity_filled ?? 0,
|
|
1518
|
+
slippage: o.globalState.slippage ?? 0,
|
|
1519
|
+
owner: o.globalState.owner ?? ""
|
|
1520
|
+
}));
|
|
1521
|
+
};
|
|
1522
|
+
|
|
1523
|
+
// src/modules/trading.ts
|
|
1524
|
+
var extractEscrowAppId = async (algodClient, indexerClient, targetTxId) => {
|
|
1525
|
+
try {
|
|
1526
|
+
const pendingInfo = await algodClient.pendingTransactionInformation(targetTxId).do();
|
|
1527
|
+
if (pendingInfo?.["inner-txns"]?.[0]?.["created-application-index"]) {
|
|
1528
|
+
return pendingInfo["inner-txns"][0]["created-application-index"];
|
|
1529
|
+
}
|
|
1530
|
+
} catch {
|
|
1531
|
+
}
|
|
1532
|
+
const backoffs = [1e3, 1500, 2e3, 3e3, 5e3, 8e3];
|
|
1533
|
+
for (const delayMs of backoffs) {
|
|
1534
|
+
try {
|
|
1535
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
1536
|
+
const txnLookup = await indexerClient.lookupTransactionByID(targetTxId).do();
|
|
1537
|
+
if (txnLookup?.transaction?.["inner-txns"]?.[0]?.["created-application-index"]) {
|
|
1538
|
+
return txnLookup.transaction["inner-txns"][0]["created-application-index"];
|
|
1539
|
+
}
|
|
1540
|
+
} catch {
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
return 0;
|
|
1544
|
+
};
|
|
1545
|
+
var createLimitOrder = async (config, params) => {
|
|
1546
|
+
return createOrder(config, { ...params, slippage: 0, matchingOrders: [] });
|
|
1547
|
+
};
|
|
1548
|
+
var createMarketOrder = async (config, params) => {
|
|
1549
|
+
let matchingOrders = params.matchingOrders;
|
|
1550
|
+
if (!matchingOrders) {
|
|
1551
|
+
const orderbook = await getOrderbook(config, params.marketAppId);
|
|
1552
|
+
matchingOrders = calculateMatchingOrders(
|
|
1553
|
+
orderbook,
|
|
1554
|
+
params.isBuying,
|
|
1555
|
+
params.position === 1,
|
|
1556
|
+
params.quantity,
|
|
1557
|
+
params.price,
|
|
1558
|
+
params.slippage
|
|
1559
|
+
);
|
|
1560
|
+
}
|
|
1561
|
+
const totalMatchedQuantity = matchingOrders.reduce((sum, o) => sum + o.quantity, 0);
|
|
1562
|
+
const result = await createOrder(config, {
|
|
1563
|
+
...params,
|
|
1564
|
+
matchingOrders
|
|
1565
|
+
});
|
|
1566
|
+
return { ...result, matchedQuantity: totalMatchedQuantity };
|
|
1567
|
+
};
|
|
1568
|
+
var createOrder = async (config, params) => {
|
|
1569
|
+
const { algodClient, indexerClient, signer, activeAddress, matcherAppId, usdcAssetId, feeAddress } = config;
|
|
1570
|
+
const { marketAppId, position, price, quantity, isBuying, slippage, matchingOrders } = params;
|
|
1571
|
+
const globalState = await getMarketGlobalState(algodClient, marketAppId);
|
|
1572
|
+
const yesAssetId = globalState.yes_asset_id;
|
|
1573
|
+
const noAssetId = globalState.no_asset_id;
|
|
1574
|
+
const feeBase = params.feeBase ?? globalState.fee_base_percent;
|
|
1575
|
+
const marketFeeAddress = globalState.fee_address || feeAddress;
|
|
1576
|
+
const signerAccount = { signer, addr: activeAddress };
|
|
1577
|
+
const marketClient = new MarketAppClient(
|
|
1578
|
+
{ resolveBy: "id", id: marketAppId, sender: signerAccount },
|
|
1579
|
+
algodClient
|
|
1580
|
+
);
|
|
1581
|
+
const matcherClient = new MatcherAppClient(
|
|
1582
|
+
{ resolveBy: "id", id: matcherAppId, sender: signerAccount },
|
|
1583
|
+
algodClient
|
|
1584
|
+
);
|
|
1585
|
+
let fee = 0;
|
|
1586
|
+
if (isBuying) {
|
|
1587
|
+
fee = calculateFee(quantity, price + slippage, feeBase);
|
|
1588
|
+
}
|
|
1589
|
+
const marketAddress = algosdk2.getApplicationAddress(marketAppId);
|
|
1590
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
1591
|
+
let createEscrowTxnIndex = 0;
|
|
1592
|
+
if (!isBuying) {
|
|
1593
|
+
const hasUsdcOptIn = await checkAssetOptIn(algodClient, activeAddress, usdcAssetId);
|
|
1594
|
+
if (!hasUsdcOptIn) {
|
|
1595
|
+
const optInTxn = await algokit3__namespace.transferAsset(
|
|
1596
|
+
{ from: signerAccount, to: activeAddress, assetId: usdcAssetId, amount: 0, skipSending: true },
|
|
1597
|
+
algodClient
|
|
1598
|
+
);
|
|
1599
|
+
atc.addTransaction({ txn: optInTxn.transaction, signer });
|
|
1600
|
+
createEscrowTxnIndex++;
|
|
1601
|
+
}
|
|
1602
|
+
} else {
|
|
1603
|
+
const assetId = position === 1 ? yesAssetId : noAssetId;
|
|
1604
|
+
const hasAssetOptIn = await checkAssetOptIn(algodClient, activeAddress, assetId);
|
|
1605
|
+
if (!hasAssetOptIn) {
|
|
1606
|
+
const optInTxn = await algokit3__namespace.transferAsset(
|
|
1607
|
+
{ from: signerAccount, to: activeAddress, assetId, amount: 0, skipSending: true },
|
|
1608
|
+
algodClient
|
|
1609
|
+
);
|
|
1610
|
+
atc.addTransaction({ txn: optInTxn.transaction, signer });
|
|
1611
|
+
createEscrowTxnIndex++;
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1614
|
+
const paymentTxn = await algokit3__namespace.transferAlgos(
|
|
1615
|
+
{ from: signerAccount, to: marketAddress, amount: algokit3__namespace.microAlgos(957e3), skipSending: true },
|
|
1616
|
+
algodClient
|
|
1617
|
+
);
|
|
1618
|
+
atc.addTransaction({ txn: paymentTxn.transaction, signer });
|
|
1619
|
+
createEscrowTxnIndex++;
|
|
1620
|
+
const fundAmount = isBuying ? Math.floor(quantity * (price + slippage) / 1e6) + fee : quantity;
|
|
1621
|
+
const fundAssetId = isBuying ? usdcAssetId : position === 1 ? yesAssetId : noAssetId;
|
|
1622
|
+
const assetTransferTxn = await algokit3__namespace.transferAsset(
|
|
1623
|
+
{ from: signerAccount, to: marketAddress, amount: fundAmount, assetId: fundAssetId, skipSending: true },
|
|
1624
|
+
algodClient
|
|
1625
|
+
);
|
|
1626
|
+
atc.addTransaction({ txn: assetTransferTxn.transaction, signer });
|
|
1627
|
+
createEscrowTxnIndex++;
|
|
1628
|
+
const createEscrowTxn = await marketClient.createEscrow(
|
|
1629
|
+
{ price, quantity, slippage, position },
|
|
1630
|
+
{ assets: [usdcAssetId, yesAssetId, noAssetId], sendParams: { skipSending: true } }
|
|
1631
|
+
);
|
|
1632
|
+
atc.addTransaction({ txn: createEscrowTxn.transaction, signer });
|
|
1633
|
+
let matchIndex = 1;
|
|
1634
|
+
for (const matchingOrder of matchingOrders) {
|
|
1635
|
+
const payCounterPartyTxn = await algokit3__namespace.transferAlgos(
|
|
1636
|
+
{
|
|
1637
|
+
from: signerAccount,
|
|
1638
|
+
to: algosdk2.getApplicationAddress(matchingOrder.escrowAppId),
|
|
1639
|
+
amount: algokit3__namespace.microAlgos(1e3 * (isBuying ? 1 : 2)),
|
|
1640
|
+
skipSending: true
|
|
1641
|
+
},
|
|
1642
|
+
algodClient
|
|
1643
|
+
);
|
|
1644
|
+
atc.addTransaction({ txn: payCounterPartyTxn.transaction, signer });
|
|
1645
|
+
const proposeAMatchTxn = await matcherClient.proposeAMatch(
|
|
1646
|
+
{
|
|
1647
|
+
marketApp: marketAppId,
|
|
1648
|
+
maker: matchingOrder.escrowAppId,
|
|
1649
|
+
quantityMatched: Math.min(matchingOrder.quantity, quantity),
|
|
1650
|
+
takerAddress: activeAddress,
|
|
1651
|
+
makerAddress: matchingOrder.owner,
|
|
1652
|
+
feeAddress: marketFeeAddress,
|
|
1653
|
+
takerAppCreatedIndexOffset: matchIndex * 2
|
|
1654
|
+
},
|
|
1655
|
+
{
|
|
1656
|
+
assets: [usdcAssetId, yesAssetId, noAssetId],
|
|
1657
|
+
accounts: [activeAddress, marketFeeAddress, matchingOrder.owner],
|
|
1658
|
+
sendParams: { skipSending: true, fee: algokit3__namespace.microAlgos(1e4) }
|
|
1659
|
+
}
|
|
1660
|
+
);
|
|
1661
|
+
atc.addTransaction({ txn: proposeAMatchTxn.transaction, signer });
|
|
1662
|
+
matchIndex++;
|
|
1663
|
+
}
|
|
1664
|
+
const result = await atc.execute(algodClient, 4);
|
|
1665
|
+
const targetTxId = result.txIDs[createEscrowTxnIndex];
|
|
1666
|
+
const escrowAppId = await extractEscrowAppId(algodClient, indexerClient, targetTxId);
|
|
1667
|
+
return {
|
|
1668
|
+
escrowAppId,
|
|
1669
|
+
txIds: result.txIDs,
|
|
1670
|
+
confirmedRound: result.confirmedRound
|
|
1671
|
+
};
|
|
1672
|
+
};
|
|
1673
|
+
var cancelOrder = async (config, params) => {
|
|
1674
|
+
const { algodClient, signer, usdcAssetId } = config;
|
|
1675
|
+
const { marketAppId, escrowAppId, orderOwner } = params;
|
|
1676
|
+
const globalState = await getMarketGlobalState(algodClient, marketAppId);
|
|
1677
|
+
const yesAssetId = globalState.yes_asset_id;
|
|
1678
|
+
const noAssetId = globalState.no_asset_id;
|
|
1679
|
+
const signerAccount = { signer, addr: orderOwner };
|
|
1680
|
+
const marketClient = new MarketAppClient(
|
|
1681
|
+
{ resolveBy: "id", id: marketAppId, sender: signerAccount },
|
|
1682
|
+
algodClient
|
|
1683
|
+
);
|
|
1684
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
1685
|
+
const deleteCallTxn = await marketClient.deleteEscrow(
|
|
1686
|
+
{ escrowAppId, algoReceiver: orderOwner },
|
|
1687
|
+
{
|
|
1688
|
+
apps: [escrowAppId],
|
|
1689
|
+
assets: [usdcAssetId, yesAssetId, noAssetId],
|
|
1690
|
+
accounts: [orderOwner],
|
|
1691
|
+
sendParams: { skipSending: true, fee: algokit3__namespace.microAlgos(7e3) }
|
|
1692
|
+
}
|
|
1693
|
+
);
|
|
1694
|
+
atc.addTransaction({ txn: deleteCallTxn.transaction, signer });
|
|
1695
|
+
const result = await atc.execute(algodClient, 4);
|
|
1696
|
+
return {
|
|
1697
|
+
success: true,
|
|
1698
|
+
txIds: result.txIDs
|
|
1699
|
+
};
|
|
1700
|
+
};
|
|
1701
|
+
var proposeMatch = async (config, params) => {
|
|
1702
|
+
const { algodClient, signer, activeAddress, matcherAppId, usdcAssetId, feeAddress } = config;
|
|
1703
|
+
const { marketAppId, makerEscrowAppId, makerAddress, quantityMatched } = params;
|
|
1704
|
+
const globalState = await getMarketGlobalState(algodClient, marketAppId);
|
|
1705
|
+
const yesAssetId = globalState.yes_asset_id;
|
|
1706
|
+
const noAssetId = globalState.no_asset_id;
|
|
1707
|
+
const marketFeeAddress = globalState.fee_address || feeAddress;
|
|
1708
|
+
const signerAccount = { signer, addr: activeAddress };
|
|
1709
|
+
const matcherClient = new MatcherAppClient(
|
|
1710
|
+
{ resolveBy: "id", id: matcherAppId, sender: signerAccount },
|
|
1711
|
+
algodClient
|
|
1712
|
+
);
|
|
1713
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
1714
|
+
const payMakerTxn = await algokit3__namespace.transferAlgos(
|
|
1715
|
+
{
|
|
1716
|
+
from: signerAccount,
|
|
1717
|
+
to: algosdk2.getApplicationAddress(makerEscrowAppId),
|
|
1718
|
+
amount: algokit3__namespace.microAlgos(2e3),
|
|
1719
|
+
skipSending: true
|
|
1720
|
+
},
|
|
1721
|
+
algodClient
|
|
1722
|
+
);
|
|
1723
|
+
atc.addTransaction({ txn: payMakerTxn.transaction, signer });
|
|
1724
|
+
const proposeTxn = await matcherClient.proposeAMatch(
|
|
1725
|
+
{
|
|
1726
|
+
marketApp: marketAppId,
|
|
1727
|
+
maker: makerEscrowAppId,
|
|
1728
|
+
quantityMatched,
|
|
1729
|
+
takerAddress: activeAddress,
|
|
1730
|
+
makerAddress,
|
|
1731
|
+
feeAddress: marketFeeAddress,
|
|
1732
|
+
takerAppCreatedIndexOffset: 0
|
|
1733
|
+
},
|
|
1734
|
+
{
|
|
1735
|
+
assets: [usdcAssetId, yesAssetId, noAssetId],
|
|
1736
|
+
accounts: [activeAddress, marketFeeAddress, makerAddress],
|
|
1737
|
+
sendParams: { skipSending: true, fee: algokit3__namespace.microAlgos(1e4) }
|
|
1738
|
+
}
|
|
1739
|
+
);
|
|
1740
|
+
atc.addTransaction({ txn: proposeTxn.transaction, signer });
|
|
1741
|
+
const result = await atc.execute(algodClient, 4);
|
|
1742
|
+
return {
|
|
1743
|
+
success: true,
|
|
1744
|
+
txIds: result.txIDs
|
|
1745
|
+
};
|
|
1746
|
+
};
|
|
1747
|
+
var splitShares = async (config, params) => {
|
|
1748
|
+
const { algodClient, signer, activeAddress, usdcAssetId } = config;
|
|
1749
|
+
const { marketAppId, amount } = params;
|
|
1750
|
+
const globalState = await getMarketGlobalState(algodClient, marketAppId);
|
|
1751
|
+
const yesAssetId = globalState.yes_asset_id;
|
|
1752
|
+
const noAssetId = globalState.no_asset_id;
|
|
1753
|
+
const signerAccount = { signer, addr: activeAddress };
|
|
1754
|
+
const marketClient = new MarketAppClient(
|
|
1755
|
+
{ resolveBy: "id", id: marketAppId, sender: signerAccount },
|
|
1756
|
+
algodClient
|
|
1757
|
+
);
|
|
1758
|
+
const marketAddress = algosdk2.getApplicationAddress(marketAppId);
|
|
1759
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
1760
|
+
let optInCosts = 0;
|
|
1761
|
+
const hasYesOptIn = await checkAssetOptIn(algodClient, activeAddress, yesAssetId);
|
|
1762
|
+
if (!hasYesOptIn) {
|
|
1763
|
+
const optInTxn = await algokit3__namespace.transferAsset(
|
|
1764
|
+
{ from: signerAccount, to: activeAddress, assetId: yesAssetId, amount: 0, skipSending: true },
|
|
1765
|
+
algodClient
|
|
1766
|
+
);
|
|
1767
|
+
atc.addTransaction({ txn: optInTxn.transaction, signer });
|
|
1768
|
+
optInCosts += 1e3;
|
|
1769
|
+
}
|
|
1770
|
+
const hasNoOptIn = await checkAssetOptIn(algodClient, activeAddress, noAssetId);
|
|
1771
|
+
if (!hasNoOptIn) {
|
|
1772
|
+
const optInTxn = await algokit3__namespace.transferAsset(
|
|
1773
|
+
{ from: signerAccount, to: activeAddress, assetId: noAssetId, amount: 0, skipSending: true },
|
|
1774
|
+
algodClient
|
|
1775
|
+
);
|
|
1776
|
+
atc.addTransaction({ txn: optInTxn.transaction, signer });
|
|
1777
|
+
optInCosts += 1e3;
|
|
1778
|
+
}
|
|
1779
|
+
const algoPayment = await algokit3__namespace.transferAlgos(
|
|
1780
|
+
{ from: signerAccount, to: marketAddress, amount: algokit3__namespace.microAlgos(5e3 + optInCosts), skipSending: true },
|
|
1781
|
+
algodClient
|
|
1782
|
+
);
|
|
1783
|
+
atc.addTransaction({ txn: algoPayment.transaction, signer });
|
|
1784
|
+
const usdcTransfer = await algokit3__namespace.transferAsset(
|
|
1785
|
+
{ from: signerAccount, to: marketAddress, amount, assetId: usdcAssetId, skipSending: true },
|
|
1786
|
+
algodClient
|
|
1787
|
+
);
|
|
1788
|
+
atc.addTransaction({ txn: usdcTransfer.transaction, signer });
|
|
1789
|
+
const splitTxn = await marketClient.splitShares(
|
|
1790
|
+
{},
|
|
1791
|
+
{ assets: [usdcAssetId, yesAssetId, noAssetId], sendParams: { skipSending: true } }
|
|
1792
|
+
);
|
|
1793
|
+
atc.addTransaction({ txn: splitTxn.transaction, signer });
|
|
1794
|
+
const result = await atc.execute(algodClient, 4);
|
|
1795
|
+
return {
|
|
1796
|
+
success: true,
|
|
1797
|
+
txIds: result.txIDs,
|
|
1798
|
+
confirmedRound: result.confirmedRound
|
|
1799
|
+
};
|
|
1800
|
+
};
|
|
1801
|
+
var mergeShares = async (config, params) => {
|
|
1802
|
+
const { algodClient, signer, activeAddress, usdcAssetId } = config;
|
|
1803
|
+
const { marketAppId, amount } = params;
|
|
1804
|
+
const globalState = await getMarketGlobalState(algodClient, marketAppId);
|
|
1805
|
+
const yesAssetId = globalState.yes_asset_id;
|
|
1806
|
+
const noAssetId = globalState.no_asset_id;
|
|
1807
|
+
const signerAccount = { signer, addr: activeAddress };
|
|
1808
|
+
const marketClient = new MarketAppClient(
|
|
1809
|
+
{ resolveBy: "id", id: marketAppId, sender: signerAccount },
|
|
1810
|
+
algodClient
|
|
1811
|
+
);
|
|
1812
|
+
const marketAddress = algosdk2.getApplicationAddress(marketAppId);
|
|
1813
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
1814
|
+
let optInCosts = 0;
|
|
1815
|
+
const hasUsdcOptIn = await checkAssetOptIn(algodClient, activeAddress, usdcAssetId);
|
|
1816
|
+
if (!hasUsdcOptIn) {
|
|
1817
|
+
const optInTxn = await algokit3__namespace.transferAsset(
|
|
1818
|
+
{ from: signerAccount, to: activeAddress, assetId: usdcAssetId, amount: 0, skipSending: true },
|
|
1819
|
+
algodClient
|
|
1820
|
+
);
|
|
1821
|
+
atc.addTransaction({ txn: optInTxn.transaction, signer });
|
|
1822
|
+
optInCosts += 1e3;
|
|
1823
|
+
}
|
|
1824
|
+
const algoPayment = await algokit3__namespace.transferAlgos(
|
|
1825
|
+
{ from: signerAccount, to: marketAddress, amount: algokit3__namespace.microAlgos(5e3 + optInCosts), skipSending: true },
|
|
1826
|
+
algodClient
|
|
1827
|
+
);
|
|
1828
|
+
atc.addTransaction({ txn: algoPayment.transaction, signer });
|
|
1829
|
+
const yesTransfer = await algokit3__namespace.transferAsset(
|
|
1830
|
+
{ from: signerAccount, to: marketAddress, amount, assetId: yesAssetId, skipSending: true },
|
|
1831
|
+
algodClient
|
|
1832
|
+
);
|
|
1833
|
+
atc.addTransaction({ txn: yesTransfer.transaction, signer });
|
|
1834
|
+
const noTransfer = await algokit3__namespace.transferAsset(
|
|
1835
|
+
{ from: signerAccount, to: marketAddress, amount, assetId: noAssetId, skipSending: true },
|
|
1836
|
+
algodClient
|
|
1837
|
+
);
|
|
1838
|
+
atc.addTransaction({ txn: noTransfer.transaction, signer });
|
|
1839
|
+
const mergeTxn = await marketClient.mergeShares(
|
|
1840
|
+
{},
|
|
1841
|
+
{ assets: [usdcAssetId], sendParams: { skipSending: true } }
|
|
1842
|
+
);
|
|
1843
|
+
atc.addTransaction({ txn: mergeTxn.transaction, signer });
|
|
1844
|
+
const result = await atc.execute(algodClient, 4);
|
|
1845
|
+
return {
|
|
1846
|
+
success: true,
|
|
1847
|
+
txIds: result.txIDs,
|
|
1848
|
+
confirmedRound: result.confirmedRound
|
|
1849
|
+
};
|
|
1850
|
+
};
|
|
1851
|
+
var claim = async (config, params) => {
|
|
1852
|
+
const { algodClient, signer, activeAddress, usdcAssetId } = config;
|
|
1853
|
+
const { marketAppId, assetId } = params;
|
|
1854
|
+
const signerAccount = { signer, addr: activeAddress };
|
|
1855
|
+
const marketClient = new MarketAppClient(
|
|
1856
|
+
{ resolveBy: "id", id: marketAppId, sender: signerAccount },
|
|
1857
|
+
algodClient
|
|
1858
|
+
);
|
|
1859
|
+
const marketAddress = algosdk2.getApplicationAddress(marketAppId);
|
|
1860
|
+
let tokenBalance = params.amount;
|
|
1861
|
+
if (!tokenBalance) {
|
|
1862
|
+
const accountInfo = await algodClient.accountInformation(activeAddress).do();
|
|
1863
|
+
const assets = accountInfo.assets || accountInfo["assets"] || [];
|
|
1864
|
+
const asset = assets.find((a) => (a["asset-id"] ?? a.assetId) === assetId);
|
|
1865
|
+
tokenBalance = asset ? Number(asset.amount) : 0;
|
|
1866
|
+
}
|
|
1867
|
+
if (tokenBalance <= 0) {
|
|
1868
|
+
throw new Error("No tokens to claim");
|
|
1869
|
+
}
|
|
1870
|
+
const atc = new algosdk2.AtomicTransactionComposer();
|
|
1871
|
+
const tokenTransfer = await algokit3__namespace.transferAsset(
|
|
1872
|
+
{ from: signerAccount, to: marketAddress, amount: tokenBalance, assetId, skipSending: true },
|
|
1873
|
+
algodClient
|
|
1874
|
+
);
|
|
1875
|
+
atc.addTransaction({ txn: tokenTransfer.transaction, signer });
|
|
1876
|
+
const claimTxn = await marketClient.claim(
|
|
1877
|
+
{},
|
|
1878
|
+
{
|
|
1879
|
+
assets: [usdcAssetId, assetId],
|
|
1880
|
+
sendParams: { skipSending: true, fee: algokit3__namespace.microAlgos(1e3) }
|
|
1881
|
+
}
|
|
1882
|
+
);
|
|
1883
|
+
atc.addTransaction({ txn: claimTxn.transaction, signer });
|
|
1884
|
+
const sp = await algodClient.getTransactionParams().do();
|
|
1885
|
+
const closeOutTxn = algosdk2__default.default.makeAssetTransferTxnWithSuggestedParamsFromObject({
|
|
1886
|
+
from: activeAddress,
|
|
1887
|
+
to: marketAddress,
|
|
1888
|
+
amount: 0,
|
|
1889
|
+
assetIndex: assetId,
|
|
1890
|
+
closeRemainderTo: marketAddress,
|
|
1891
|
+
suggestedParams: sp
|
|
1892
|
+
});
|
|
1893
|
+
atc.addTransaction({ txn: closeOutTxn, signer });
|
|
1894
|
+
const result = await atc.execute(algodClient, 4);
|
|
1895
|
+
return {
|
|
1896
|
+
success: true,
|
|
1897
|
+
txIds: result.txIDs,
|
|
1898
|
+
confirmedRound: result.confirmedRound
|
|
1899
|
+
};
|
|
1900
|
+
};
|
|
1901
|
+
var getPositions = async (config, walletAddress) => {
|
|
1902
|
+
const { algodClient, indexerClient } = config;
|
|
1903
|
+
const address = walletAddress ?? config.activeAddress;
|
|
1904
|
+
const accountInfo = await algodClient.accountInformation(address).do();
|
|
1905
|
+
const assets = accountInfo.assets || accountInfo["assets"] || [];
|
|
1906
|
+
const nonZeroAssets = assets.filter((a) => Number(a.amount) > 0);
|
|
1907
|
+
if (nonZeroAssets.length === 0) return [];
|
|
1908
|
+
const positions = /* @__PURE__ */ new Map();
|
|
1909
|
+
for (const asset of nonZeroAssets) {
|
|
1910
|
+
const assetId = asset["asset-id"] ?? asset.assetId;
|
|
1911
|
+
const amount = Number(asset.amount);
|
|
1912
|
+
try {
|
|
1913
|
+
const assetInfo = await indexerClient.lookupAssetByID(assetId).do();
|
|
1914
|
+
const creator = assetInfo.asset?.params?.creator;
|
|
1915
|
+
if (!creator) continue;
|
|
1916
|
+
const createdApps = await indexerClient.lookupAccountCreatedApplications(creator).limit(1).do();
|
|
1917
|
+
if (!createdApps.applications?.length) continue;
|
|
1918
|
+
const appId = createdApps.applications[0].id;
|
|
1919
|
+
try {
|
|
1920
|
+
const appInfo = await indexerClient.lookupApplications(appId).do();
|
|
1921
|
+
const rawState = appInfo.application?.params?.["global-state"];
|
|
1922
|
+
if (!rawState) continue;
|
|
1923
|
+
let yesAssetIdOnChain = 0;
|
|
1924
|
+
let noAssetIdOnChain = 0;
|
|
1925
|
+
for (const item of rawState) {
|
|
1926
|
+
const key = Buffer.from(item.key, "base64").toString();
|
|
1927
|
+
if (key === "yes_asset_id") yesAssetIdOnChain = Number(item.value.uint);
|
|
1928
|
+
if (key === "no_asset_id") noAssetIdOnChain = Number(item.value.uint);
|
|
1929
|
+
}
|
|
1930
|
+
if (yesAssetIdOnChain === 0 && noAssetIdOnChain === 0) continue;
|
|
1931
|
+
const existing = positions.get(appId) ?? {
|
|
1932
|
+
marketAppId: appId,
|
|
1933
|
+
yesAssetId: yesAssetIdOnChain,
|
|
1934
|
+
noAssetId: noAssetIdOnChain,
|
|
1935
|
+
yesBalance: 0,
|
|
1936
|
+
noBalance: 0
|
|
1937
|
+
};
|
|
1938
|
+
if (assetId === yesAssetIdOnChain) {
|
|
1939
|
+
existing.yesBalance = amount;
|
|
1940
|
+
} else if (assetId === noAssetIdOnChain) {
|
|
1941
|
+
existing.noBalance = amount;
|
|
1942
|
+
} else {
|
|
1943
|
+
continue;
|
|
1944
|
+
}
|
|
1945
|
+
positions.set(appId, existing);
|
|
1946
|
+
} catch {
|
|
1947
|
+
continue;
|
|
1948
|
+
}
|
|
1949
|
+
} catch {
|
|
1950
|
+
continue;
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1953
|
+
return Array.from(positions.values());
|
|
1954
|
+
};
|
|
1955
|
+
|
|
1956
|
+
// src/modules/markets.ts
|
|
1957
|
+
var DEFAULT_API_BASE_URL = "https://partners.alphaarcade.com/api";
|
|
1958
|
+
var getMarkets = async (config) => {
|
|
1959
|
+
const baseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
|
|
1960
|
+
const allMarkets = [];
|
|
1961
|
+
let lastEvaluatedKey;
|
|
1962
|
+
let hasMore = true;
|
|
1963
|
+
while (hasMore) {
|
|
1964
|
+
const params = new URLSearchParams({ activeOnly: "true", limit: "300" });
|
|
1965
|
+
if (lastEvaluatedKey) {
|
|
1966
|
+
params.set("lastEvaluatedKey", lastEvaluatedKey);
|
|
1967
|
+
}
|
|
1968
|
+
const url = `${baseUrl}/get-live-markets?${params.toString()}`;
|
|
1969
|
+
const response = await fetch(url, { headers: { "x-api-key": config.apiKey } });
|
|
1970
|
+
if (!response.ok) {
|
|
1971
|
+
throw new Error(`Alpha API error: ${response.status} ${response.statusText}`);
|
|
1972
|
+
}
|
|
1973
|
+
const data = await response.json();
|
|
1974
|
+
if (Array.isArray(data)) {
|
|
1975
|
+
allMarkets.push(...data);
|
|
1976
|
+
hasMore = false;
|
|
1977
|
+
} else if (data.markets) {
|
|
1978
|
+
allMarkets.push(...data.markets);
|
|
1979
|
+
lastEvaluatedKey = data.lastEvaluatedKey;
|
|
1980
|
+
hasMore = !!lastEvaluatedKey;
|
|
1981
|
+
} else {
|
|
1982
|
+
hasMore = false;
|
|
1983
|
+
}
|
|
1984
|
+
}
|
|
1985
|
+
return allMarkets;
|
|
1986
|
+
};
|
|
1987
|
+
var getMarket = async (config, marketId) => {
|
|
1988
|
+
const baseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
|
|
1989
|
+
const url = `${baseUrl}/get-market?marketId=${encodeURIComponent(marketId)}`;
|
|
1990
|
+
const response = await fetch(url, { headers: { "x-api-key": config.apiKey } });
|
|
1991
|
+
if (!response.ok) {
|
|
1992
|
+
if (response.status === 404) return null;
|
|
1993
|
+
throw new Error(`Alpha API error: ${response.status} ${response.statusText}`);
|
|
1994
|
+
}
|
|
1995
|
+
const data = await response.json();
|
|
1996
|
+
return data.market ?? data ?? null;
|
|
1997
|
+
};
|
|
1998
|
+
|
|
1999
|
+
// src/client.ts
|
|
2000
|
+
var AlphaClient = class {
|
|
2001
|
+
config;
|
|
2002
|
+
constructor(config) {
|
|
2003
|
+
if (!config.algodClient) throw new Error("algodClient is required");
|
|
2004
|
+
if (!config.indexerClient) throw new Error("indexerClient is required");
|
|
2005
|
+
if (!config.signer) throw new Error("signer is required");
|
|
2006
|
+
if (!config.activeAddress) throw new Error("activeAddress is required");
|
|
2007
|
+
if (!config.matcherAppId) throw new Error("matcherAppId is required");
|
|
2008
|
+
if (!config.usdcAssetId) throw new Error("usdcAssetId is required");
|
|
2009
|
+
if (!config.feeAddress) throw new Error("feeAddress is required");
|
|
2010
|
+
if (!config.apiKey) throw new Error("apiKey is required");
|
|
2011
|
+
this.config = {
|
|
2012
|
+
...config,
|
|
2013
|
+
apiBaseUrl: config.apiBaseUrl ?? "https://partners.alphaarcade.com/api"
|
|
2014
|
+
};
|
|
2015
|
+
}
|
|
2016
|
+
// ============================================
|
|
2017
|
+
// Trading
|
|
2018
|
+
// ============================================
|
|
2019
|
+
/**
|
|
2020
|
+
* Creates a limit order on a market.
|
|
2021
|
+
*
|
|
2022
|
+
* A limit order sits on the orderbook at your specified price until matched
|
|
2023
|
+
* or cancelled. Slippage is 0 — the order executes only at your exact price.
|
|
2024
|
+
*
|
|
2025
|
+
* @param params - Order parameters (marketAppId, position, price, quantity, isBuying)
|
|
2026
|
+
* @returns The created escrow app ID and transaction info
|
|
2027
|
+
*/
|
|
2028
|
+
async createLimitOrder(params) {
|
|
2029
|
+
return createLimitOrder(this.config, params);
|
|
2030
|
+
}
|
|
2031
|
+
/**
|
|
2032
|
+
* Creates a market order with automatic matching.
|
|
2033
|
+
*
|
|
2034
|
+
* Fetches the live orderbook, finds the best counterparty orders within your
|
|
2035
|
+
* slippage tolerance, then creates the order and proposes matches in a single
|
|
2036
|
+
* atomic transaction group.
|
|
2037
|
+
*
|
|
2038
|
+
* @param params - Order parameters (marketAppId, position, price, quantity, isBuying, slippage)
|
|
2039
|
+
* @returns The created escrow app ID, matched quantity, and transaction info
|
|
2040
|
+
*/
|
|
2041
|
+
async createMarketOrder(params) {
|
|
2042
|
+
return createMarketOrder(this.config, params);
|
|
2043
|
+
}
|
|
2044
|
+
/**
|
|
2045
|
+
* Cancels an open order by deleting its escrow app.
|
|
2046
|
+
*
|
|
2047
|
+
* Returns the escrowed funds (USDC or outcome tokens) to the order owner,
|
|
2048
|
+
* and reclaims the ALGO minimum balance used by the escrow app.
|
|
2049
|
+
*
|
|
2050
|
+
* @param params - Cancel parameters (marketAppId, escrowAppId, orderOwner)
|
|
2051
|
+
* @returns Whether the cancellation succeeded
|
|
2052
|
+
*/
|
|
2053
|
+
async cancelOrder(params) {
|
|
2054
|
+
return cancelOrder(this.config, params);
|
|
2055
|
+
}
|
|
2056
|
+
/**
|
|
2057
|
+
* Proposes a match between an existing maker order and a new taker order.
|
|
2058
|
+
*
|
|
2059
|
+
* Use this for advanced matching scenarios where you want to explicitly
|
|
2060
|
+
* specify which orders to match against.
|
|
2061
|
+
*
|
|
2062
|
+
* @param params - Match parameters (marketAppId, makerEscrowAppId, makerAddress, quantityMatched)
|
|
2063
|
+
* @returns Whether the match succeeded
|
|
2064
|
+
*/
|
|
2065
|
+
async proposeMatch(params) {
|
|
2066
|
+
return proposeMatch(this.config, params);
|
|
2067
|
+
}
|
|
2068
|
+
// ============================================
|
|
2069
|
+
// Positions
|
|
2070
|
+
// ============================================
|
|
2071
|
+
/**
|
|
2072
|
+
* Splits USDC into equal amounts of YES and NO outcome tokens.
|
|
2073
|
+
*
|
|
2074
|
+
* For example, splitting 1 USDC gives you 1 YES token + 1 NO token.
|
|
2075
|
+
* Together they're always worth $1.00 — you can trade them independently.
|
|
2076
|
+
*
|
|
2077
|
+
* @param params - Split parameters (marketAppId, amount in microunits)
|
|
2078
|
+
* @returns Transaction result
|
|
2079
|
+
*/
|
|
2080
|
+
async splitShares(params) {
|
|
2081
|
+
return splitShares(this.config, params);
|
|
2082
|
+
}
|
|
2083
|
+
/**
|
|
2084
|
+
* Merges equal amounts of YES and NO tokens back into USDC.
|
|
2085
|
+
*
|
|
2086
|
+
* The inverse of split. 1 YES + 1 NO = 1 USDC, always.
|
|
2087
|
+
*
|
|
2088
|
+
* @param params - Merge parameters (marketAppId, amount in microunits)
|
|
2089
|
+
* @returns Transaction result
|
|
2090
|
+
*/
|
|
2091
|
+
async mergeShares(params) {
|
|
2092
|
+
return mergeShares(this.config, params);
|
|
2093
|
+
}
|
|
2094
|
+
/**
|
|
2095
|
+
* Claims USDC from a resolved market by redeeming outcome tokens.
|
|
2096
|
+
*
|
|
2097
|
+
* - Winning tokens: redeemed 1:1 for USDC
|
|
2098
|
+
* - Voided market: redeemed at half value
|
|
2099
|
+
* - Losing tokens: burned (no USDC returned)
|
|
2100
|
+
*
|
|
2101
|
+
* @param params - Claim parameters (marketAppId, assetId, optional amount)
|
|
2102
|
+
* @returns Transaction result
|
|
2103
|
+
*/
|
|
2104
|
+
async claim(params) {
|
|
2105
|
+
return claim(this.config, params);
|
|
2106
|
+
}
|
|
2107
|
+
/**
|
|
2108
|
+
* Gets all token positions for a wallet across all markets.
|
|
2109
|
+
*
|
|
2110
|
+
* Reads on-chain account info and maps ASA holdings to markets.
|
|
2111
|
+
* Returns raw token balances (YES/NO amounts per market).
|
|
2112
|
+
*
|
|
2113
|
+
* @param walletAddress - Optional wallet (defaults to activeAddress)
|
|
2114
|
+
* @returns Array of positions with market app IDs and token balances
|
|
2115
|
+
*/
|
|
2116
|
+
async getPositions(walletAddress) {
|
|
2117
|
+
return getPositions(this.config, walletAddress);
|
|
2118
|
+
}
|
|
2119
|
+
// ============================================
|
|
2120
|
+
// Orderbook
|
|
2121
|
+
// ============================================
|
|
2122
|
+
/**
|
|
2123
|
+
* Fetches the full on-chain orderbook for a market.
|
|
2124
|
+
*
|
|
2125
|
+
* Reads all escrow apps created by the market contract, decodes their
|
|
2126
|
+
* global state, and organizes into yes/no bids and asks.
|
|
2127
|
+
* Only includes limit orders (slippage = 0) with unfilled quantity.
|
|
2128
|
+
*
|
|
2129
|
+
* @param marketAppId - The market app ID
|
|
2130
|
+
* @returns Orderbook with yes and no sides, each having bids and asks
|
|
2131
|
+
*/
|
|
2132
|
+
async getOrderbook(marketAppId) {
|
|
2133
|
+
return getOrderbook(this.config, marketAppId);
|
|
2134
|
+
}
|
|
2135
|
+
/**
|
|
2136
|
+
* Gets open orders for a specific wallet on a market.
|
|
2137
|
+
*
|
|
2138
|
+
* @param marketAppId - The market app ID
|
|
2139
|
+
* @param walletAddress - Optional wallet (defaults to activeAddress)
|
|
2140
|
+
* @returns Array of open orders
|
|
2141
|
+
*/
|
|
2142
|
+
async getOpenOrders(marketAppId, walletAddress) {
|
|
2143
|
+
return getOpenOrders(this.config, marketAppId, walletAddress);
|
|
2144
|
+
}
|
|
2145
|
+
// ============================================
|
|
2146
|
+
// Markets
|
|
2147
|
+
// ============================================
|
|
2148
|
+
/**
|
|
2149
|
+
* Fetches all live, tradeable markets from the Alpha API.
|
|
2150
|
+
*
|
|
2151
|
+
* Automatically paginates to retrieve all markets.
|
|
2152
|
+
*
|
|
2153
|
+
* @returns Array of live markets
|
|
2154
|
+
*/
|
|
2155
|
+
async getMarkets() {
|
|
2156
|
+
return getMarkets(this.config);
|
|
2157
|
+
}
|
|
2158
|
+
/**
|
|
2159
|
+
* Fetches a single market by its ID.
|
|
2160
|
+
*
|
|
2161
|
+
* @param marketId - The market ID
|
|
2162
|
+
* @returns The market data, or null if not found
|
|
2163
|
+
*/
|
|
2164
|
+
async getMarket(marketId) {
|
|
2165
|
+
return getMarket(this.config, marketId);
|
|
2166
|
+
}
|
|
2167
|
+
};
|
|
2168
|
+
|
|
2169
|
+
exports.AlphaClient = AlphaClient;
|
|
2170
|
+
exports.calculateFee = calculateFee;
|
|
2171
|
+
exports.calculateFeeFromTotal = calculateFeeFromTotal;
|
|
2172
|
+
exports.calculateMatchingOrders = calculateMatchingOrders;
|
|
2173
|
+
exports.checkAssetOptIn = checkAssetOptIn;
|
|
2174
|
+
exports.decodeGlobalState = decodeGlobalState;
|
|
2175
|
+
exports.getEscrowGlobalState = getEscrowGlobalState;
|
|
2176
|
+
exports.getMarketGlobalState = getMarketGlobalState;
|
|
2177
|
+
//# sourceMappingURL=index.cjs.map
|
|
2178
|
+
//# sourceMappingURL=index.cjs.map
|