Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
9AAF5B08FAEB5A595CD48A15467BC1B3E44BCE518D1440A430492DAAC220B8F0

Transaction overview

Status
Success
Execution completed
Block
#747764
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
115,567,700
Requested gas limit
GAS USED
57,783,890
Gas consumed
FEE
115568ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1ftls0ctrrj0y96sr9dq906j7gdqhg9exgcvaey

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CsO+AgoML3ZtLm1fYWRkcGtnErG+AgooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRKDvgIKBWNyYWZ0Eh1nbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9jcmFmdBqzLAoJY3JhZnQuZ25vEqUscGFja2FnZSBjcmFmdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKCSJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9lcXVpcG1lbnQiCgkiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvaXRlbSIKKQoKY29uc3QgKAoJU2V0UmVjaXBlRXZlbnQgICAgID0gIlNldFJlY2lwZSIKCURlbGV0ZVJlY2lwZUV2ZW50ICA9ICJEZWxldGVSZWNpcGUiCglEZWxldGVSZWNpcGVzRXZlbnQgPSAiRGVsZXRlUmVjaXBlcyIKCVNldExpc3RMaW1pdEV2ZW50ICA9ICJTZXRMaXN0TGltaXQiCglTZXRDcmFmdEZlZUV2ZW50ICAgPSAiU2V0Q3JhZnRGZWUiCglDcmFmdEV2ZW50ICAgICAgICAgPSAiQ3JhZnQiCikKCnZhciAoCglyZWNpcGVzICAgPSBicHRyZWUuTmV3QlBUcmVlMzIoKQoJbGlzdExpbWl0ID0gZGVmYXVsdFJlY2lwZUxpc3RMaW1pdAoJY3JhZnRGZWUgID0gZGVmYXVsdENyYWZ0RmVlCikKCmZ1bmMgaW5pdCgpIHsgcmVzZXRDcmFmdFN0YXRlKCkgfQoKZnVuYyByZXNldENyYWZ0U3RhdGUoKSB7CglyZWNpcGVzID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCWxpc3RMaW1pdCA9IGRlZmF1bHRSZWNpcGVMaXN0TGltaXQKCWNyYWZ0RmVlID0gZGVmYXVsdENyYWZ0RmVlCn0KCi8vIFNldFJlY2lwZSBzdG9yZXMgdGhlIGl0ZW0gZGVmaW5pdGlvbiBJRCBwcm9kdWNlZCBieSBhIGNhbm9uaWNhbCByZWNpcGUuCmZ1bmMgU2V0UmVjaXBlKGN1ciByZWFsbSwgcmVjaXBlIHN0cmluZywgaXRlbUlEIHVpbnQzMikgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgYWRtaW4uSXNBZG1pbikKCWFzc2VydENyYWZ0Tm9Db2lucygpCgljYW5vbmljYWxSZWNpcGUsIF8gOj0gbXVzdFBhcnNlUmVjaXBlKHJlY2lwZSkKCXNldFJlY2lwZShjYW5vbmljYWxSZWNpcGUsIGl0ZW1JRCkKfQoKLy8gU2V0UmVjaXBlcyBzdG9yZXMgdXAgdG8gMTAwIGNhbm9uaWNhbCByZWNpcGUgYW5kIGl0ZW0gSUQgcGFpcnMgaW4gb25lIHRyYW5zYWN0aW9uLgpmdW5jIFNldFJlY2lwZXMoY3VyIHJlYWxtLCByZWNpcGVzQ1NWLCBpdGVtSURzQ1NWIHN0cmluZykgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgYWRtaW4uSXNBZG1pbikKCWFzc2VydENyYWZ0Tm9Db2lucygpCgljYW5vbmljYWxSZWNpcGVzLCBpdGVtSURzIDo9IG11c3RQYXJzZVJlY2lwZUNTVihyZWNpcGVzQ1NWLCBpdGVtSURzQ1NWKQoJZm9yIGksIHJlY2lwZSA6PSByYW5nZSBjYW5vbmljYWxSZWNpcGVzIHsKCQlzZXRSZWNpcGUocmVjaXBlLCBpdGVtSURzW2ldKQoJfQp9CgpmdW5jIHNldFJlY2lwZShjYW5vbmljYWxSZWNpcGUgc3RyaW5nLCBpdGVtSUQgdWludDMyKSB7CglyZWNpcGVzLlNldChjYW5vbmljYWxSZWNpcGUsIGl0ZW1JRCkKCWNoYWluLkVtaXQoCgkJU2V0UmVjaXBlRXZlbnQsCgkJInJlY2lwZSIsIGNhbm9uaWNhbFJlY2lwZSwKCQkiaXRlbUlkIiwgc3RyY29udi5Gb3JtYXRVaW50KHVpbnQ2NChpdGVtSUQpLCAxMCksCgkpCn0KCmZ1bmMgRGVsZXRlUmVjaXBlKGN1ciByZWFsbSwgcmVjaXBlIHN0cmluZykgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgYWRtaW4uSXNBZG1pbikKCWFzc2VydENyYWZ0Tm9Db2lucygpCgljYW5vbmljYWxSZWNpcGUgOj0gbXVzdENhbm9uaWNhbFJlY2lwZShyZWNpcGUpCglkZWxldGVSZWNpcGUoY2Fub25pY2FsUmVjaXBlKQoJY2hhaW4uRW1pdChEZWxldGVSZWNpcGVFdmVudCwgInJlY2lwZSIsIGNhbm9uaWNhbFJlY2lwZSkKfQoKZnVuYyBEZWxldGVSZWNpcGVzKGN1ciByZWFsbSwgcmVjaXBlc0NTViBzdHJpbmcpIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBjdXIsIGFkbWluLklzQWRtaW4pCglhc3NlcnRDcmFmdE5vQ29pbnMoKQoJY2Fub25pY2FsUmVjaXBlcyA6PSBtdXN0UGFyc2VSZWNpcGVLZXlDU1YocmVjaXBlc0NTVikKCWZvciBfLCByZWNpcGUgOj0gcmFuZ2UgY2Fub25pY2FsUmVjaXBlcyB7CgkJaWYgIXJlY2lwZXMuSGFzKHJlY2lwZSkgewoJCQlwYW5pYygicmVjaXBlIG5vdCBmb3VuZDogIiArIHJlY2lwZSkKCQl9Cgl9Cglmb3IgXywgcmVjaXBlIDo9IHJhbmdlIGNhbm9uaWNhbFJlY2lwZXMgewoJCWRlbGV0ZVJlY2lwZShyZWNpcGUpCgl9CgljaGFpbi5FbWl0KERlbGV0ZVJlY2lwZXNFdmVudCwgImNvdW50Iiwgc3RyY29udi5JdG9hKGxlbihjYW5vbmljYWxSZWNpcGVzKSkpCn0KCmZ1bmMgZGVsZXRlUmVjaXBlKGNhbm9uaWNhbFJlY2lwZSBzdHJpbmcpIHsKCWlmIF8sIHJlbW92ZWQgOj0gcmVjaXBlcy5SZW1vdmUoY2Fub25pY2FsUmVjaXBlKTsgIXJlbW92ZWQgewoJCXBhbmljKCJyZWNpcGUgbm90IGZvdW5kOiAiICsgY2Fub25pY2FsUmVjaXBlKQoJfQp9CgpmdW5jIEhhc1JlY2lwZShyZWNpcGUgc3RyaW5nKSBib29sIHsKCWNhbm9uaWNhbCwgXywgZXJyTXNnIDo9IHBhcnNlUmVjaXBlKHJlY2lwZSkKCWlmIGVyck1zZyAhPSAiIiB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gcmVjaXBlcy5IYXMoY2Fub25pY2FsKQp9CgpmdW5jIEdldFJlY2lwZShyZWNpcGUgc3RyaW5nKSB1aW50MzIgewoJcmV0dXJuIG11c3RHZXRSZWNpcGVJdGVtSUQobXVzdENhbm9uaWNhbFJlY2lwZShyZWNpcGUpKQp9CgpmdW5jIEdldFJlY2lwZUNvdW50KCkgaW50IHsKCXJldHVybiByZWNpcGVzLlNpemUoKQp9CgpmdW5jIExpc3RSZWNpcGVzKHBhZ2UsIGNvdW50IGludCkgW11tYXBbc3RyaW5nXXN0cmluZyB7Cglhc3NlcnRSZWNpcGVMaXN0UGFnZUNvdW50KHBhZ2UsIGNvdW50KQoJcmVzdWx0IDo9IFtdbWFwW3N0cmluZ11zdHJpbmd7fQoJcmVjaXBlcy5JdGVyYXRlQnlPZmZzZXQoKHBhZ2UtMSkqY291bnQsIGNvdW50LCBmdW5jKHJlY2lwZSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgbWFwW3N0cmluZ11zdHJpbmd7CgkJCSJyZWNpcGUiOiByZWNpcGUsCgkJCSJpdGVtSWQiOiBzdHJjb252LkZvcm1hdFVpbnQodWludDY0KHZhbHVlLih1aW50MzIpKSwgMTApLAoJCX0pCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIHJlc3VsdAp9CgpmdW5jIFNldExpc3RMaW1pdChjdXIgcmVhbG0sIGxpbWl0IGludCkgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgYWRtaW4uSXNBZG1pbikKCWFzc2VydENyYWZ0Tm9Db2lucygpCglpZiBsaW1pdCA8IDEgewoJCXBhbmljKCJsaW1pdCBtdXN0IGJlIGF0IGxlYXN0IDEiKQoJfQoKCW9sZExpbWl0IDo9IGxpc3RMaW1pdAoJbGlzdExpbWl0ID0gbGltaXQKCWNoYWluLkVtaXQoCgkJU2V0TGlzdExpbWl0RXZlbnQsCgkJIm9sZExpbWl0Iiwgc3RyY29udi5JdG9hKG9sZExpbWl0KSwKCQkibmV3TGltaXQiLCBzdHJjb252Lkl0b2EobGltaXQpLAoJKQp9CgpmdW5jIEdldExpc3RMaW1pdCgpIGludCB7CglyZXR1cm4gbGlzdExpbWl0Cn0KCmZ1bmMgU2V0Q3JhZnRGZWUoY3VyIHJlYWxtLCBmZWUgaW50NjQpIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBjdXIsIGFkbWluLklzQWRtaW4pCglhc3NlcnRDcmFmdE5vQ29pbnMoKQoJaWYgZmVlIDwgMCB7CgkJcGFuaWMoImZlZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpCgl9CgoJb2xkRmVlIDo9IGNyYWZ0RmVlCgljcmFmdEZlZSA9IGZlZQoJY2hhaW4uRW1pdCgKCQlTZXRDcmFmdEZlZUV2ZW50LAoJCSJvbGRGZWUiLCBzdHJjb252LkZvcm1hdEludChvbGRGZWUsIDEwKSwKCQkibmV3RmVlIiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlLCAxMCksCgkpCn0KCmZ1bmMgR2V0Q3JhZnRGZWUoKSBpbnQ2NCB7CglyZXR1cm4gY3JhZnRGZWUKfQoKLy8gQ3JhZnQgYnVybnMgYSBjYW5vbmljYWwgcmVjaXBlIGFuZCBtaW50cyB0aGUgbmV4dCBHUkM3MjEgZXF1aXBtZW50IHRva2VuLgpmdW5jIENyYWZ0KGN1ciByZWFsbSwgcmVjaXBlIHN0cmluZykgdWludDY0IHsKCWNhbGxlciA6PSBhY2Nlc3Njb250cm9sLk11c3RHZXRVc2VyQ2FsbGVyKDAsIGN1cikKCWNhbm9uaWNhbFJlY2lwZSwgaW5ncmVkaWVudHMgOj0gbXVzdFBhcnNlUmVjaXBlKHJlY2lwZSkKCWl0ZW1JRCA6PSBtdXN0R2V0UmVjaXBlSXRlbUlEKGNhbm9uaWNhbFJlY2lwZSkKCWFzc2VydEV4YWN0VWdub3RQYXltZW50KGNyYWZ0RmVlKQoKCWZvciBfLCBpbmdyZWRpZW50IDo9IHJhbmdlIGluZ3JlZGllbnRzIHsKCQlpdGVtLkJ1cm5Gcm9tUmVhbG0oY3Jvc3MoY3VyKSwgY2FsbGVyLCBpbmdyZWRpZW50LlRva2VuSUQsIGluZ3JlZGllbnQuQW1vdW50KQoJfQoJdG9rZW5JRCA6PSBlcXVpcG1lbnQuTWludEZyb21SZWFsbShjcm9zcyhjdXIpLCBjYWxsZXIsIGl0ZW1JRCwgIiIsICIiKQoJaWYgY3JhZnRGZWUgPiAwIHsKCQlibmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZVJlYWxtU2VuZCwgY3VyKQoJCWJuay5TZW5kQ29pbnMoY3VyLkFkZHJlc3MoKSwgYWRtaW4uR2V0RmVlQ29sbGVjdG9yKCksIGNoYWluLkNvaW5ze3sidWdub3QiLCBjcmFmdEZlZX19KQoJfQoKCWNoYWluLkVtaXQoCgkJQ3JhZnRFdmVudCwKCQkib3duZXIiLCBjYWxsZXIuU3RyaW5nKCksCgkJInJlY2lwZSIsIGNhbm9uaWNhbFJlY2lwZSwKCQkiZXF1aXBtZW50VG9rZW5JZCIsIHN0cmNvbnYuRm9ybWF0VWludCh0b2tlbklELCAxMCksCgkJIml0ZW1JZCIsIHN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQoaXRlbUlEKSwgMTApLAoJCSJmZWUiLCBzdHJjb252LkZvcm1hdEludChjcmFmdEZlZSwgMTApLAoJKQoJcmV0dXJuIHRva2VuSUQKfQoKZnVuYyBtdXN0Q2Fub25pY2FsUmVjaXBlKHJlY2lwZSBzdHJpbmcpIHN0cmluZyB7CgljYW5vbmljYWwsIF8gOj0gbXVzdFBhcnNlUmVjaXBlKHJlY2lwZSkKCXJldHVybiBjYW5vbmljYWwKfQoKZnVuYyBtdXN0R2V0UmVjaXBlSXRlbUlEKHJlY2lwZSBzdHJpbmcpIHVpbnQzMiB7Cgl2YWx1ZSA6PSByZWNpcGVzLkdldChyZWNpcGUpCglpZiB2YWx1ZSA9PSBuaWwgewoJCXBhbmljKCJyZWNpcGUgbm90IGZvdW5kOiAiICsgcmVjaXBlKQoJfQoJcmV0dXJuIHZhbHVlLih1aW50MzIpCn0KCmZ1bmMgYXNzZXJ0Q3JhZnROb0NvaW5zKCkgewoJaWYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpICE9IDAgewoJCXBhbmljKCJhdHRhY2hlZCBjb2lucyBub3QgYWxsb3dlZCIpCgl9Cn0KCmZ1bmMgYXNzZXJ0RXhhY3RVZ25vdFBheW1lbnQoZXhwZWN0ZWQgaW50NjQpIHsKCWNvaW5zIDo9IHVuc2FmZS5PcmlnaW5TZW5kKCkKCWlmIGV4cGVjdGVkID09IDAgewoJCWlmIGxlbihjb2lucykgIT0gMCB7CgkJCXBhbmljKCJleGFjdCBwYXltZW50IHJlcXVpcmVkOiBleHBlY3RlZCBubyBjb2lucywgZ290ICIgKyBjb2lucy5TdHJpbmcoKSkKCQl9CgkJcmV0dXJuCgl9CglpZiBsZW4oY29pbnMpICE9IDEgfHwgY29pbnNbMF0uRGVub20gIT0gInVnbm90IiB8fCBjb2luc1swXS5BbW91bnQgIT0gZXhwZWN0ZWQgewoJCXBhbmljKCJleGFjdCBwYXltZW50IHJlcXVpcmVkOiBleHBlY3RlZCAiICsgc3RyY29udi5Gb3JtYXRJbnQoZXhwZWN0ZWQsIDEwKSArICJ1Z25vdCwgZ290ICIgKyBjb2lucy5TdHJpbmcoKSkKCX0KfQoa/6gBCg5jcmFmdF90ZXN0LmdubxLrqAFwYWNrYWdlIGNyYWZ0CgppbXBvcnQgKAoJImNoYWluIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9lcXVpcG1lbnQiCgkiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvaXRlbSIKKQoKZnVuYyBUZXN0U2V0UmVjaXBlQ3JlYXRlc0FuZFVwZGF0ZXNSZWNpcGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCgoJU2V0UmVjaXBlKGNyb3NzKGN1ciksICIwMDAxfG1pbmVjcmFmdDppcm9uX2luZ290OjAxIiwgMTAwKQoJdWFzc2VydC5UcnVlKHQsIEhhc1JlY2lwZSgiMDAwMXxtaW5lY3JhZnQ6aXJvbl9pbmdvdDoxIikpCgl1YXNzZXJ0LlRydWUodCwgSGFzUmVjaXBlKCIwMDAxfG1pbmVjcmFmdDppcm9uX2luZ290OjAxIikpCgl1YXNzZXJ0LlRydWUodCwgSGFzUmVjaXBlKCIwMDAxfDA6bWluZWNyYWZ0Omlyb25faW5nb3Q6MSIpKQoJdWFzc2VydC5FcXVhbCh0LCB1aW50MzIoMTAwKSwgR2V0UmVjaXBlKCIwMDAxfG1pbmVjcmFmdDppcm9uX2luZ290OjAxIikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldFJlY2lwZUNvdW50KCkpCgoJU2V0UmVjaXBlKGNyb3NzKGN1ciksICIwMDAxfDA6bWluZWNyYWZ0Omlyb25faW5nb3Q6MSIsIDEwMSkKCXVhc3NlcnQuRXF1YWwodCwgdWludDMyKDEwMSksIEdldFJlY2lwZSgiMDAwMXxtaW5lY3JhZnQ6aXJvbl9pbmdvdDoxIikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldFJlY2lwZUNvdW50KCkpCgoJU2V0UmVjaXBlKGNyb3NzKGN1ciksICIwMDBBfGNyYWZ0LWhleC1hOjF8Y3JhZnQtaGV4LWI6MiIsIDEwMikKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNSZWNpcGUoIjAwMGF8Y3JhZnQtaGV4LWE6MXxjcmFmdC1oZXgtYjoyIikpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQzMigxMDIpLCBHZXRSZWNpcGUoIjAwMEF8Y3JhZnQtaGV4LWE6MXxjcmFmdC1oZXgtYjoyIikpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIEdldFJlY2lwZUNvdW50KCkpCn0KCmZ1bmMgVGVzdFNldFJlY2lwZVJlcXVpcmVzRGlyZWN0QWRtaW5XaXRob3V0Q29pbnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCglyZWNpcGUgOj0gIjAwMDF8Y3JhZnQtc2VjdXJpdHktaXRlbToxIgoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgcmVjaXBlLCAyMDApCgl9KQoJdWFzc2VydC5GYWxzZSh0LCBIYXNSZWNpcGUocmVjaXBlKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2V4YW1wbGUvY3JhZnRfYWRtaW5fcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgcmVjaXBlLCAyMDApCgl9KQoJdWFzc2VydC5GYWxzZSh0LCBIYXNSZWNpcGUocmVjaXBlKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7eyJ1Z25vdCIsIDF9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYXR0YWNoZWQgY29pbnMgbm90IGFsbG93ZWQiLCBmdW5jKCkgewoJCVNldFJlY2lwZShjcm9zcyhjdXIpLCByZWNpcGUsIDIwMCkKCX0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7fSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKHJlY2lwZSkpCn0KCmZ1bmMgVGVzdFNldFJlY2lwZXNTdG9yZXNNdWx0aXBsZVJlY2lwZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCgoJU2V0UmVjaXBlcygKCQljcm9zcyhjdXIpLAoJCSIwMDAxfGNyYWZ0LWJhdGNoLWlyb246MSwwMDAyfGNyYWZ0LWJhdGNoLWdvbGQ6MiIsCgkJIjMwMCwzMDEiLAoJKQoKCXVhc3NlcnQuRXF1YWwodCwgdWludDMyKDMwMCksIEdldFJlY2lwZSgiMDAwMXxjcmFmdC1iYXRjaC1pcm9uOjEiKSkKCXVhc3NlcnQuRXF1YWwodCwgdWludDMyKDMwMSksIEdldFJlY2lwZSgiMDAwMnxjcmFmdC1iYXRjaC1nb2xkOjIiKSkKfQoKZnVuYyBUZXN0U2V0UmVjaXBlc1N0b3Jlc09jY3VwYW5jeUJhdGNoKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuQWRtaW4pKQoKCVNldFJlY2lwZXMoCgkJY3Jvc3MoY3VyKSwKCQkiMDAxM3x0ZXN0LWlyb246MXx0ZXN0LWlyb246Mnx0ZXN0LXN0aWNrOjIsIisKCQkJIjAwMDN8dGVzdC13b29kOjJ8dGVzdC1zdG9uZToxLCIrCgkJCSIwMDAxfHRlc3QtaGVyYjozLCIrCgkJCSIwMDA3fHRlc3QtY29wcGVyOjF8dGVzdC1sZWF0aGVyOjJ8dGVzdC1jbG90aDoxIiwKCQkiMTEwMTAwMCwxMTAxMDAxLDExMDEwMDIsMTEwMTAwMyIsCgkpCgoJdWFzc2VydC5FcXVhbCh0LCA0LCBHZXRSZWNpcGVDb3VudCgpKQoJdWFzc2VydC5FcXVhbCh0LCB1aW50MzIoMTEwMTAwMCksIEdldFJlY2lwZSgiMDAxM3x0ZXN0LWlyb246MXx0ZXN0LWlyb246Mnx0ZXN0LXN0aWNrOjIiKSkKCXVhc3NlcnQuRXF1YWwodCwgdWludDMyKDExMDEwMDEpLCBHZXRSZWNpcGUoIjAwMDN8dGVzdC13b29kOjJ8dGVzdC1zdG9uZToxIikpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQzMigxMTAxMDAyKSwgR2V0UmVjaXBlKCIwMDAxfHRlc3QtaGVyYjozIikpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQzMigxMTAxMDAzKSwgR2V0UmVjaXBlKCIwMDA3fHRlc3QtY29wcGVyOjF8dGVzdC1sZWF0aGVyOjJ8dGVzdC1jbG90aDoxIikpCgl1YXNzZXJ0LlRydWUodCwgSGFzUmVjaXBlKCIwMDEzfDA6dGVzdC1pcm9uOjF8MTp0ZXN0LWlyb246Mnw0OnRlc3Qtc3RpY2s6MiIpKQoJdWFzc2VydC5FcXVhbCh0LCA0LCBsZW4oTGlzdFJlY2lwZXMoMSwgMjApKSkKfQoKZnVuYyBUZXN0U2V0UmVjaXBlc0FsbG93c0xhc3REdXBsaWNhdGVUb1dpbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCXJlY2lwZSA6PSAiMDAwMXxjcmFmdC1iYXRjaC1kdXBsaWNhdGU6MSIKCglTZXRSZWNpcGVzKGNyb3NzKGN1ciksIHJlY2lwZSsiLCIrcmVjaXBlLCAiMzEwLDMxMSIpCgoJdWFzc2VydC5FcXVhbCh0LCB1aW50MzIoMzExKSwgR2V0UmVjaXBlKHJlY2lwZSkpCn0KCmZ1bmMgVGVzdFNldFJlY2lwZXNSZXF1aXJlc0RpcmVjdEFkbWluKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJcmVjaXBlIDo9ICIwMDAxfGNyYWZ0LWJhdGNoLXNlY3VyaXR5OjEiCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldFJlY2lwZXMoY3Jvc3MoY3VyKSwgcmVjaXBlLCAiMzIwIikKCX0pCgl1YXNzZXJ0LkZhbHNlKHQsIEhhc1JlY2lwZShyZWNpcGUpKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9jcmFmdF9iYXRjaF9yZWxheSIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldFJlY2lwZXMoY3Jvc3MoY3VyKSwgcmVjaXBlLCAiMzIwIikKCX0pCgl1YXNzZXJ0LkZhbHNlKHQsIEhhc1JlY2lwZShyZWNpcGUpKQp9CgpmdW5jIFRlc3RTZXRSZWNpcGVzUmVqZWN0c0NvdW50TWlzbWF0Y2hBbmRSb2xsc0JhY2soY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglmaXJzdFJlY2lwZSA6PSAiMDAwMXxjcmFmdC1taXNtYXRjaC1hOjEiCglzZWNvbmRSZWNpcGUgOj0gIjAwMDF8Y3JhZnQtbWlzbWF0Y2gtYjoxIgoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAicmVjaXBlcyBhbmQgaXRlbSBpZHMgY291bnQgbWlzbWF0Y2giLCBmdW5jKCkgewoJCVNldFJlY2lwZXMoY3Jvc3MoY3VyKSwgZmlyc3RSZWNpcGUrIiwiK3NlY29uZFJlY2lwZSwgIjQwMCIpCgl9KQoKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKGZpcnN0UmVjaXBlKSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKHNlY29uZFJlY2lwZSkpCn0KCmZ1bmMgVGVzdFNldFJlY2lwZXNSZWplY3RzSW52YWxpZEl0ZW1JRChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCXJlY2lwZSA6PSAiMDAwMXxjcmFmdC1pbnZhbGlkLWlkOjEiCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIGl0ZW0gaWQ6IGludmFsaWQiLCBmdW5jKCkgewoJCVNldFJlY2lwZXMoY3Jvc3MoY3VyKSwgcmVjaXBlLCAiaW52YWxpZCIpCgl9KQoJdWFzc2VydC5GYWxzZSh0LCBIYXNSZWNpcGUocmVjaXBlKSkKfQoKZnVuYyBUZXN0U2V0UmVjaXBlc1JlamVjdHNFbXB0eVRva2Vuc0FuZFRyYWlsaW5nQ29tbWEoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglyZWNpcGUgOj0gIjAwMDF8Y3JhZnQtZW1wdHktdG9rZW46MSIKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImVtcHR5IHJlY2lwZSBub3QgYWxsb3dlZCIsIGZ1bmMoKSB7CgkJU2V0UmVjaXBlcyhjcm9zcyhjdXIpLCByZWNpcGUrIiwiLCAiNDEwLDQxMSIpCgl9KQoJdWFzc2VydC5GYWxzZSh0LCBIYXNSZWNpcGUocmVjaXBlKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImVtcHR5IGl0ZW0gaWQgbm90IGFsbG93ZWQiLCBmdW5jKCkgewoJCVNldFJlY2lwZXMoY3Jvc3MoY3VyKSwgcmVjaXBlKyIsMDAwMXxjcmFmdC1lbXB0eS1pZDoxIiwgIjQxMiwiKQoJfSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKHJlY2lwZSkpCn0KCmZ1bmMgVGVzdFNldFJlY2lwZXNSZWplY3RzQmF0Y2hBYm92ZUxpbWl0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuQWRtaW4pKQoJcmVjaXBlIDo9ICIwMDAxfGNyYWZ0LWJhdGNoLWxpbWl0OjEiCglyZWNpcGVzQ1NWIDo9IHJlY2lwZQoJaXRlbUlEc0NTViA6PSAiNTAwIgoJZm9yIGkgOj0gMTsgaSA8IDEwMTsgaSsrIHsKCQlyZWNpcGVzQ1NWICs9ICIsIiArIHJlY2lwZQoJCWl0ZW1JRHNDU1YgKz0gIiw1MDAiCgl9CgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZWNpcGVzIGV4Y2VlZHMgMTAwIiwgZnVuYygpIHsKCQlTZXRSZWNpcGVzKGNyb3NzKGN1ciksIHJlY2lwZXNDU1YsIGl0ZW1JRHNDU1YpCgl9KQoJdWFzc2VydC5GYWxzZSh0LCBIYXNSZWNpcGUocmVjaXBlKSkKfQoKZnVuYyBUZXN0RGVsZXRlUmVjaXBlUmVtb3Zlc1JlY2lwZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCXJlY2lwZSA6PSAiMDAwMXxjcmFmdC1kZWxldGUtaXRlbToxIgoJU2V0UmVjaXBlKGNyb3NzKGN1ciksIHJlY2lwZSwgNjAwKQoKCURlbGV0ZVJlY2lwZShjcm9zcyhjdXIpLCAiMDAwMXxjcmFmdC1kZWxldGUtaXRlbTowMSIpCgl1YXNzZXJ0LkZhbHNlKHQsIEhhc1JlY2lwZShyZWNpcGUpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBHZXRSZWNpcGVDb3VudCgpKQp9CgpmdW5jIFRlc3REZWxldGVSZWNpcGVzUmVtb3Zlc0JhdGNoQW5kUmVxdWlyZXNBZG1pbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCWZpcnN0UmVjaXBlIDo9ICIwMDAxfGNyYWZ0LWRlbGV0ZS1hOjEiCglzZWNvbmRSZWNpcGUgOj0gIjAwMDJ8Y3JhZnQtZGVsZXRlLWI6MSIKCVNldFJlY2lwZShjcm9zcyhjdXIpLCBmaXJzdFJlY2lwZSwgNjAxKQoJU2V0UmVjaXBlKGNyb3NzKGN1ciksIHNlY29uZFJlY2lwZSwgNjAyKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlEZWxldGVSZWNpcGVzKGNyb3NzKGN1ciksIGZpcnN0UmVjaXBlKQoJfSkKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNSZWNpcGUoZmlyc3RSZWNpcGUpKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCURlbGV0ZVJlY2lwZXMoY3Jvc3MoY3VyKSwgZmlyc3RSZWNpcGUrIiwiK3NlY29uZFJlY2lwZSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKGZpcnN0UmVjaXBlKSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKHNlY29uZFJlY2lwZSkpCn0KCmZ1bmMgVGVzdERlbGV0ZVJlY2lwZXNSZWplY3RzTWlzc2luZ0FuZFJvbGxzQmFjayhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCWZpcnN0UmVjaXBlIDo9ICIwMDAxfGNyYWZ0LWRlbGV0ZS1taXNzaW5nLWE6MSIKCXNlY29uZFJlY2lwZSA6PSAiMDAwMnxjcmFmdC1kZWxldGUtbWlzc2luZy1iOjEiCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgZmlyc3RSZWNpcGUsIDYwMykKCVNldFJlY2lwZShjcm9zcyhjdXIpLCBzZWNvbmRSZWNpcGUsIDYwNCkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInJlY2lwZSBub3QgZm91bmQ6IDAwMDF8MDpjcmFmdC1kZWxldGUtbWlzc2luZy1jOjEiLCBmdW5jKCkgewoJCURlbGV0ZVJlY2lwZXMoY3Jvc3MoY3VyKSwgZmlyc3RSZWNpcGUrIiwwMDAxfGNyYWZ0LWRlbGV0ZS1taXNzaW5nLWM6MSIpCgl9KQoJdWFzc2VydC5UcnVlKHQsIEhhc1JlY2lwZShmaXJzdFJlY2lwZSkpCgl1YXNzZXJ0LlRydWUodCwgSGFzUmVjaXBlKHNlY29uZFJlY2lwZSkpCn0KCmZ1bmMgVGVzdERlbGV0ZVJlY2lwZVJlamVjdHNNaXNzaW5nUmVjaXBlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuQWRtaW4pKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZWNpcGUgbm90IGZvdW5kOiAwMDAxfDA6Y3JhZnQtbWlzc2luZy1kZWxldGU6MSIsIGZ1bmMoKSB7CgkJRGVsZXRlUmVjaXBlKGNyb3NzKGN1ciksICIwMDAxfGNyYWZ0LW1pc3NpbmctZGVsZXRlOjEiKQoJfSkKfQoKZnVuYyBUZXN0TGlzdFJlY2lwZXNQYWdlc0FuZENvcGllc1Jvd3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgIjAwMDF8Y3JhZnQtbGlzdC1hOjEiLCA3MDEpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgIjAwMDJ8Y3JhZnQtbGlzdC1iOjEiLCA3MDIpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgIjAwMDR8Y3JhZnQtbGlzdC1jOjEiLCA3MDMpCgoJdWFzc2VydC5FcXVhbCh0LCAzLCBHZXRSZWNpcGVDb3VudCgpKQoJcGFnZTEgOj0gTGlzdFJlY2lwZXMoMSwgMikKCXVhc3NlcnQuRXF1YWwodCwgMiwgbGVuKHBhZ2UxKSkKCXBhZ2UxWzBdWyJpdGVtSWQiXSA9ICJoYWNrZWQiCgl1YXNzZXJ0LkVxdWFsKHQsICI3MDEiLCBMaXN0UmVjaXBlcygxLCAyKVswXVsiaXRlbUlkIl0pCglwYWdlMiA6PSBMaXN0UmVjaXBlcygyLCAyKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBsZW4ocGFnZTIpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oTGlzdFJlY2lwZXMoMywgMikpKQoKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAicGFnZSBtdXN0IGJlIGF0IGxlYXN0IDEiLCBmdW5jKCkgewoJCUxpc3RSZWNpcGVzKDAsIDEpCgl9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBtdXN0IGJlIGF0IGxlYXN0IDEiLCBmdW5jKCkgewoJCUxpc3RSZWNpcGVzKDEsIDApCgl9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBleGNlZWRzIGxpc3RMaW1pdCAobWF4OiAxMDApIiwgZnVuYygpIHsKCQlMaXN0UmVjaXBlcygxLCAxMDEpCgl9KQp9CgpmdW5jIFRlc3RTZXRMaXN0TGltaXQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgMSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0TGlzdExpbWl0KCkpCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvdW50IGV4Y2VlZHMgbGlzdExpbWl0IChtYXg6IDEpIiwgZnVuYygpIHsKCQlMaXN0UmVjaXBlcygxLCAyKQoJfSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImxpbWl0IG11c3QgYmUgYXQgbGVhc3QgMSIsIGZ1bmMoKSB7CgkJU2V0TGlzdExpbWl0KGNyb3NzKGN1ciksIDApCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgNTApCgl9KQp9CgpmdW5jIFRlc3RNdXN0UGFyc2VSZWNpcGVDYW5vbmljYWxpemVzU2xvdHNBbmRDb3VudHNJbmdyZWRpZW50cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJY2Fub25pY2FsLCBpbmdyZWRpZW50cyA6PSBtdXN0UGFyc2VSZWNpcGUoIjAwMTN8bWluZWNyYWZ0Omlyb25faW5nb3Q6MDF8bWluZWNyYWZ0Omlyb25faW5nb3Q6MnxtaW5lY3JhZnQ6c3RpY2s6MyIpCgoJdWFzc2VydC5FcXVhbCh0LCAiMDAxM3wwOm1pbmVjcmFmdDppcm9uX2luZ290OjF8MTptaW5lY3JhZnQ6aXJvbl9pbmdvdDoyfDQ6bWluZWNyYWZ0OnN0aWNrOjMiLCBjYW5vbmljYWwpCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIGxlbihpbmdyZWRpZW50cykpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQoMCksIGluZ3JlZGllbnRzWzBdLlNsb3QpCgl1YXNzZXJ0LkVxdWFsKHQsICJtaW5lY3JhZnQ6aXJvbl9pbmdvdCIsIGluZ3JlZGllbnRzWzBdLlRva2VuSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEpLCBpbmdyZWRpZW50c1swXS5BbW91bnQpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQoNCksIGluZ3JlZGllbnRzWzJdLlNsb3QpCgl1YXNzZXJ0LkVxdWFsKHQsICJtaW5lY3JhZnQ6c3RpY2siLCBpbmdyZWRpZW50c1syXS5Ub2tlbklEKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzKSwgaW5ncmVkaWVudHNbMl0uQW1vdW50KQoKCXJvdW5kVHJpcCwgXyA6PSBtdXN0UGFyc2VSZWNpcGUoY2Fub25pY2FsKQoJdWFzc2VydC5FcXVhbCh0LCBjYW5vbmljYWwsIHJvdW5kVHJpcCkKCgloZXhDYW5vbmljYWwsIGhleEluZ3JlZGllbnRzIDo9IG11c3RQYXJzZVJlY2lwZSgiMDAwQXxjcmFmdC1oZXgtYToxfGNyYWZ0LWhleC1iOjIiKQoJdWFzc2VydC5FcXVhbCh0LCAiMDAwYXwxOmNyYWZ0LWhleC1hOjF8MzpjcmFmdC1oZXgtYjoyIiwgaGV4Q2Fub25pY2FsKQoJdWFzc2VydC5FcXVhbCh0LCB1aW50KDEpLCBoZXhJbmdyZWRpZW50c1swXS5TbG90KQoJdWFzc2VydC5FcXVhbCh0LCB1aW50KDMpLCBoZXhJbmdyZWRpZW50c1sxXS5TbG90KQp9CgpmdW5jIFRlc3RNdXN0UGFyc2VSZWNpcGVSZWplY3RzSW52YWxpZFJlY2lwZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RzIDo9IFtdc3RydWN0IHsKCQlyZWNpcGUsIHBhbmljTXNnIHN0cmluZwoJfXsKCQl7IiIsICJpbnZhbGlkIHJlY2lwZSJ9LAoJCXsiMDAwMHxpdGVtOjEiLCAiaW52YWxpZCByZWNpcGUgb2NjdXBhbmN5In0sCgkJeyIwMDAxfGl0ZW0iLCAiaW52YWxpZCByZWNpcGUgaW5ncmVkaWVudCJ9LAoJCXsiMDAwMXxpdGVtOjAiLCAiaW5ncmVkaWVudCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSJ9LAoJCXsiMDAwM3xpdGVtOjEiLCAib2NjdXBpZWQgc2xvdHMgYW5kIGluZ3JlZGllbnRzIGNvdW50IG1pc21hdGNoIn0sCgkJeyIwMDAxfDE6aXRlbToxIiwgImluZ3JlZGllbnQgc2xvdCBtaXNtYXRjaCJ9LAoJCXsiMDAxM3w0OnN0aWNrOjF8MDppcm9uOjF8MTppcm9uOjEiLCAiaW5ncmVkaWVudCBzbG90IG1pc21hdGNoIn0sCgkJeyIwMDAxfCV6ejoxIiwgImludmFsaWQgaXRlbSB0b2tlbiBpZCJ9LAoJfQoKCWZvciBfLCB0YyA6PSByYW5nZSB0ZXN0cyB7CgkJcmVjaXBlLCBwYW5pY01zZyA6PSB0Yy5yZWNpcGUsIHRjLnBhbmljTXNnCgkJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsIHBhbmljTXNnLCBmdW5jKCkgewoJCQltdXN0UGFyc2VSZWNpcGUocmVjaXBlKQoJCX0pCgl9Cn0KCmZ1bmMgVGVzdEhhc1JlY2lwZVJldHVybnNGYWxzZUZvckludmFsaWRBbmRNaXNzaW5nUmVjaXBlcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKCIiKSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKCJub3QtYS1yZWNpcGUiKSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzUmVjaXBlKCIwMDAxfGNyYWZ0LW1pc3NpbmctcXVlcnk6MSIpKQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJyZWNpcGUgbm90IGZvdW5kOiAwMDAxfDA6Y3JhZnQtbWlzc2luZy1xdWVyeToxIiwgZnVuYygpIHsKCQlHZXRSZWNpcGUoIjAwMDF8Y3JhZnQtbWlzc2luZy1xdWVyeToxIikKCX0pCn0KCmZ1bmMgVGVzdENyYWZ0QnVybnNJdGVtc0FuZE1pbnRzRXF1aXBtZW50KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJcmVjaXBlIDo9ICIwMDEzfGNyYWZ0LXN1Y2Nlc3MtaXJvbjoxfGNyYWZ0LXN1Y2Nlc3MtaXJvbjoyfGNyYWZ0LXN1Y2Nlc3Mtc3RpY2s6MiIKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgcmVjaXBlLCAxMTAxMDAwKQoJbWludENyYWZ0SXRlbShjcm9zcyhjdXIpLCAiY3JhZnQtc3VjY2Vzcy1pcm9uIiwgMykKCW1pbnRDcmFmdEl0ZW0oY3Jvc3MoY3VyKSwgImNyYWZ0LXN1Y2Nlc3Mtc3RpY2siLCAyKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0Lk93bmVyKSkKCWJlZm9yZSA6PSBlcXVpcG1lbnQuR2V0TGF0ZXN0VG9rZW5JRCgpCgljb2xsZWN0b3JCZWZvcmUgOj0gdWdub3RCYWxhbmNlRm9yVGVzdChjcmFmdFRlc3QuRmVlQ29sbGVjdG9yKQoJcmVhbG1CZWZvcmUgOj0gdWdub3RCYWxhbmNlRm9yVGVzdChjcmFmdFRlc3QuUGtnQWRkcikKCXBheUNyYWZ0RmVlKGRlZmF1bHRDcmFmdEZlZUNvaW5zKCkpCgl0b2tlbklEIDo9IENyYWZ0KGNyb3NzKGN1ciksICIwMDEzfGNyYWZ0LXN1Y2Nlc3MtaXJvbjowMXxjcmFmdC1zdWNjZXNzLWlyb246MnxjcmFmdC1zdWNjZXNzLXN0aWNrOjIiKQoJdWFzc2VydC5FcXVhbCh0LCBiZWZvcmUrMSwgdG9rZW5JRCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIGl0ZW0uQmFsYW5jZU9mKGNyYWZ0VGVzdC5Pd25lciwgImNyYWZ0LXN1Y2Nlc3MtaXJvbiIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgaXRlbS5CYWxhbmNlT2YoY3JhZnRUZXN0Lk93bmVyLCAiY3JhZnQtc3VjY2Vzcy1zdGljayIpKQoJdWFzc2VydC5FcXVhbCh0LCBjcmFmdFRlc3QuT3duZXIsIGVxdWlwbWVudC5Pd25lck9mKHRva2VuSUQpKQoJdWFzc2VydC5FcXVhbCh0LCAiMTEwMTAwMCIsIGVxdWlwbWVudC5HZXRNZXRhZGF0YSh0b2tlbklEKVsiZGVmaW5pdGlvbklkIl0pCgl1YXNzZXJ0LkVxdWFsKHQsIGRlZmF1bHRDcmFmdEZlZSwgdWdub3RCYWxhbmNlRm9yVGVzdChjcmFmdFRlc3QuRmVlQ29sbGVjdG9yKS1jb2xsZWN0b3JCZWZvcmUpCgl1YXNzZXJ0LkVxdWFsKHQsIHJlYWxtQmVmb3JlLCB1Z25vdEJhbGFuY2VGb3JUZXN0KGNyYWZ0VGVzdC5Qa2dBZGRyKSkKfQoKZnVuYyBUZXN0Q3JhZnRBbGxvY2F0ZXNTZXF1ZW50aWFsRXF1aXBtZW50VG9rZW5JRHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCglyZWNpcGUgOj0gIjAwMDF8Y3JhZnQtc2tpcC1pZDoxIgoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCVNldFJlY2lwZShjcm9zcyhjdXIpLCByZWNpcGUsIDExMDEwMDMpCgltaW50Q3JhZnRJdGVtKGNyb3NzKGN1ciksICJjcmFmdC1za2lwLWlkIiwgMikKCWJlZm9yZSA6PSBlcXVpcG1lbnQuR2V0TGF0ZXN0VG9rZW5JRCgpCgllcXVpcG1lbnQuTWludChjcm9zcyhjdXIpLCBjcmFmdFRlc3QuT3RoZXIsIDExMDE5OTgsICIiLCAiIikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5Pd25lcikpCglwYXlDcmFmdEZlZShkZWZhdWx0Q3JhZnRGZWVDb2lucygpKQoJdG9rZW5JRCA6PSBDcmFmdChjcm9zcyhjdXIpLCByZWNpcGUpCgl1YXNzZXJ0LkVxdWFsKHQsIGJlZm9yZSsyLCB0b2tlbklEKQoJdWFzc2VydC5FcXVhbCh0LCBjcmFmdFRlc3QuT3RoZXIsIGVxdWlwbWVudC5Pd25lck9mKGJlZm9yZSsxKSkKCXVhc3NlcnQuRXF1YWwodCwgY3JhZnRUZXN0Lk93bmVyLCBlcXVpcG1lbnQuT3duZXJPZih0b2tlbklEKSkKfQoKZnVuYyBUZXN0Q3JhZnRSZXF1aXJlc0VxdWlwbWVudE1pbnRlclJlYWxtKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJcmVjaXBlIDo9ICIwMDAxfGNyYWZ0LW1pbnQtcm9sbGJhY2s6MiIKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgcmVjaXBlLCAxMTAxMDAxKQoJbWludENyYWZ0SXRlbShjcm9zcyhjdXIpLCAiY3JhZnQtbWludC1yb2xsYmFjayIsIDIpCgllcXVpcG1lbnQuVW5zZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCAiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvY3JhZnQiKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibWludGVyIHJlYWxtIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlwYXlDcmFmdEZlZShkZWZhdWx0Q3JhZnRGZWVDb2lucygpKQoJCUNyYWZ0KGNyb3NzKGN1ciksIHJlY2lwZSkKCX0pCn0KCmZ1bmMgVGVzdENyYWZ0UmVxdWlyZXNJdGVtTWludGVyUmVhbG0oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCglyZWNpcGUgOj0gIjAwMDF8Y3JhZnQtaXRlbS1taW50ZXI6MSIKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgcmVjaXBlLCAxMTAxMDA1KQoJbWludENyYWZ0SXRlbShjcm9zcyhjdXIpLCAiY3JhZnQtaXRlbS1taW50ZXIiLCAxKQoJaXRlbS5VbnNldE1pbnRlclJlYWxtKGNyb3NzKGN1ciksICJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9jcmFmdCIpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJtaW50ZXIgcmVhbG0gcmVxdWlyZWQiLCBmdW5jKCkgewoJCXBheUNyYWZ0RmVlKGRlZmF1bHRDcmFmdEZlZUNvaW5zKCkpCgkJQ3JhZnQoY3Jvc3MoY3VyKSwgcmVjaXBlKQoJfSkKCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEpLCBpdGVtLkJhbGFuY2VPZihjcmFmdFRlc3QuT3duZXIsICJjcmFmdC1pdGVtLW1pbnRlciIpKQp9CgpmdW5jIFRlc3RDcmFmdFJlamVjdHNVbmtub3duUmVjaXBlQW5kSW5zdWZmaWNpZW50SXRlbXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCglyZWNpcGUgOj0gIjAwMDF8Y3JhZnQtZmFpbC1pdGVtOjIiCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZWNpcGUgbm90IGZvdW5kOiAwMDAxfDA6Y3JhZnQtZmFpbC1pdGVtOjIiLCBmdW5jKCkgewoJCUNyYWZ0KGNyb3NzKGN1ciksIHJlY2lwZSkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgcmVjaXBlIiwgZnVuYygpIHsKCQlDcmFmdChjcm9zcyhjdXIpLCAiYmFkIikKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuQWRtaW4pKQoJU2V0UmVjaXBlKGNyb3NzKGN1ciksIHJlY2lwZSwgMTEwMTAwNCkKCW1pbnRDcmFmdEl0ZW0oY3Jvc3MoY3VyKSwgImNyYWZ0LWZhaWwtaXRlbSIsIDEpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpdGVtIGJ1cm4gYW1vdW50IGV4Y2VlZHMgc3VwcGx5IiwgZnVuYygpIHsKCQlwYXlDcmFmdEZlZShkZWZhdWx0Q3JhZnRGZWVDb2lucygpKQoJCUNyYWZ0KGNyb3NzKGN1ciksIHJlY2lwZSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEpLCBpdGVtLkJhbGFuY2VPZihjcmFmdFRlc3QuT3duZXIsICJjcmFmdC1mYWlsLWl0ZW0iKSkKfQoKZnVuYyBUZXN0Q3JhZnRSZXF1aXJlc0RpcmVjdFVzZXJBbmRFeGFjdEZlZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXJlY2lwZSA6PSAiMDAwMXxjcmFmdC1jcmFmdC1zZWN1cml0eToxIgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuQWRtaW4pKQoJU2V0UmVjaXBlKGNyb3NzKGN1ciksIHJlY2lwZSwgMTEwMTAwMikKCWJlZm9yZSA6PSBlcXVpcG1lbnQuR2V0TGF0ZXN0VG9rZW5JRCgpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2NyYWZ0X2NyYWZ0X3JlbGF5IikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvbnRyYWN0IGNhbGxzIG5vdCBhbGxvd2VkOiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyIiwgZnVuYygpIHsKCQlDcmFmdChjcm9zcyhjdXIpLCByZWNpcGUpCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZXhhY3QgcGF5bWVudCByZXF1aXJlZDogZXhwZWN0ZWQgMTAwMDAwMHVnbm90LCBnb3QgIiwgZnVuYygpIHsKCQlDcmFmdChjcm9zcyhjdXIpLCByZWNpcGUpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJleGFjdCBwYXltZW50IHJlcXVpcmVkOiBleHBlY3RlZCAxMDAwMDAwdWdub3QsIGdvdCAxdWdub3QiLCBmdW5jKCkgewoJCXBheUNyYWZ0RmVlKGNoYWluLkNvaW5ze3sidWdub3QiLCAxfX0pCgkJQ3JhZnQoY3Jvc3MoY3VyKSwgcmVjaXBlKQoJfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t9KQoJdWFzc2VydC5FcXVhbCh0LCBiZWZvcmUsIGVxdWlwbWVudC5HZXRMYXRlc3RUb2tlbklEKCkpCn0KCmZ1bmMgVGVzdENyYWZ0UmVqZWN0c0luZXhhY3RQYXltZW50KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJcmVjaXBlIDo9ICIwMDAxfGNyYWZ0LWluZXhhY3QtZmVlOjEiCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgcmVjaXBlLCAxMTAxMDA2KQoJbWludENyYWZ0SXRlbShjcm9zcyhjdXIpLCAiY3JhZnQtaW5leGFjdC1mZWUiLCAzKQoJYmVmb3JlIDo9IGVxdWlwbWVudC5HZXRMYXRlc3RUb2tlbklEKCkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImV4YWN0IHBheW1lbnQgcmVxdWlyZWQ6IGV4cGVjdGVkIDEwMDAwMDB1Z25vdCwgZ290IDk5OTk5OXVnbm90IiwgZnVuYygpIHsKCQlwYXlDcmFmdEZlZShjaGFpbi5Db2luc3t7InVnbm90IiwgOTk5Xzk5OX19KQoJCUNyYWZ0KGNyb3NzKGN1ciksIHJlY2lwZSkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImV4YWN0IHBheW1lbnQgcmVxdWlyZWQ6IGV4cGVjdGVkIDEwMDAwMDB1Z25vdCwgZ290IDEwMDAwMDF1Z25vdCIsIGZ1bmMoKSB7CgkJcGF5Q3JhZnRGZWUoY2hhaW4uQ29pbnN7eyJ1Z25vdCIsIDFfMDAwXzAwMX19KQoJCUNyYWZ0KGNyb3NzKGN1ciksIHJlY2lwZSkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImV4YWN0IHBheW1lbnQgcmVxdWlyZWQ6IGV4cGVjdGVkIDEwMDAwMDB1Z25vdCwgZ290IDEwMDAwMDB1Z25vdCwxZm9vIiwgZnVuYygpIHsKCQlwYXlDcmFmdEZlZShjaGFpbi5Db2luc3t7InVnbm90IiwgZGVmYXVsdENyYWZ0RmVlfSwgeyJmb28iLCAxfX0pCgkJQ3JhZnQoY3Jvc3MoY3VyKSwgcmVjaXBlKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlLCBlcXVpcG1lbnQuR2V0TGF0ZXN0VG9rZW5JRCgpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzKSwgaXRlbS5CYWxhbmNlT2YoY3JhZnRUZXN0Lk93bmVyLCAiY3JhZnQtaW5leGFjdC1mZWUiKSkKfQoKZnVuYyBUZXN0U2V0Q3JhZnRGZWVVcGRhdGVzRmVlQW5kQWxsb3dzRnJlZUNyYWZ0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJdWFzc2VydC5FcXVhbCh0LCBkZWZhdWx0Q3JhZnRGZWUsIEdldENyYWZ0RmVlKCkpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuQWRtaW4pKQoJU2V0Q3JhZnRGZWUoY3Jvc3MoY3VyKSwgMl8wMDBfMDAwKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyXzAwMF8wMDApLCBHZXRDcmFmdEZlZSgpKQoJU2V0Q3JhZnRGZWUoY3Jvc3MoY3VyKSwgMCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEdldENyYWZ0RmVlKCkpCgoJcmVjaXBlIDo9ICIwMDAxfGNyYWZ0LWZyZWUtZmVlOjEiCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgcmVjaXBlLCAxMTAxMDA3KQoJbWludENyYWZ0SXRlbShjcm9zcyhjdXIpLCAiY3JhZnQtZnJlZS1mZWUiLCAxKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZXhhY3QgcGF5bWVudCByZXF1aXJlZDogZXhwZWN0ZWQgbm8gY29pbnMsIGdvdCAxdWdub3QiLCBmdW5jKCkgewoJCXBheUNyYWZ0RmVlKGNoYWluLkNvaW5ze3sidWdub3QiLCAxfX0pCgkJQ3JhZnQoY3Jvc3MoY3VyKSwgcmVjaXBlKQoJfSkKCWNvbGxlY3RvckJlZm9yZSA6PSB1Z25vdEJhbGFuY2VGb3JUZXN0KGNyYWZ0VGVzdC5GZWVDb2xsZWN0b3IpCglwYXlDcmFmdEZlZShjaGFpbi5Db2luc3t9KQoJdG9rZW5JRCA6PSBDcmFmdChjcm9zcyhjdXIpLCByZWNpcGUpCgl1YXNzZXJ0LkVxdWFsKHQsIGNyYWZ0VGVzdC5Pd25lciwgZXF1aXBtZW50Lk93bmVyT2YodG9rZW5JRCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGNvbGxlY3RvckJlZm9yZSwgdWdub3RCYWxhbmNlRm9yVGVzdChjcmFmdFRlc3QuRmVlQ29sbGVjdG9yKSkKfQoKZnVuYyBUZXN0U2V0Q3JhZnRGZWVSZXF1aXJlc0RpcmVjdEFkbWluV2l0aG91dENvaW5zKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENyYWZ0VGVzdChjcm9zcyhjdXIpLCB0KQoJdWFzc2VydC5FcXVhbCh0LCBkZWZhdWx0Q3JhZnRGZWUsIEdldENyYWZ0RmVlKCkpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JhZnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmFmdFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldENyYWZ0RmVlKGNyb3NzKGN1ciksIDUwKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgZGVmYXVsdENyYWZ0RmVlLCBHZXRDcmFmdEZlZSgpKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9jcmFmdF9mZWVfcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRDcmFmdEZlZShjcm9zcyhjdXIpLCA1MCkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIGRlZmF1bHRDcmFmdEZlZSwgR2V0Q3JhZnRGZWUoKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7eyJ1Z25vdCIsIDF9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYXR0YWNoZWQgY29pbnMgbm90IGFsbG93ZWQiLCBmdW5jKCkgewoJCVNldENyYWZ0RmVlKGNyb3NzKGN1ciksIDUwKQoJfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t9KQoJdWFzc2VydC5FcXVhbCh0LCBkZWZhdWx0Q3JhZnRGZWUsIEdldENyYWZ0RmVlKCkpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJmZWUgbXVzdCBiZSBub24tbmVnYXRpdmUiLCBmdW5jKCkgewoJCVNldENyYWZ0RmVlKGNyb3NzKGN1ciksIC0xKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgZGVmYXVsdENyYWZ0RmVlLCBHZXRDcmFmdEZlZSgpKQp9ChpECgtnbm9tb2QudG9tbBI1bW9kdWxlID0gImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2NyYWZ0Igpnbm8gPSAiMC45Igoa9hIKCnJlbmRlci5nbm8S5xJwYWNrYWdlIGNyYWZ0CgppbXBvcnQgKAoJIm5ldC91cmwiCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgpmdW5jIFJlbmRlcihpVVJMIHN0cmluZykgc3RyaW5nIHsKCXUsIGVyciA6PSB1cmwuUGFyc2UoaVVSTCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiByZW5kZXJSZWNpcGVFcnJvcigiSW52YWxpZCBVUkwiKQoJfQoKCXN3aXRjaCB1LlBhdGggewoJY2FzZSAiIjoKCQlyZXR1cm4gcmVuZGVyUmVjaXBlSG9tZSgpCgljYXNlICJyZWNpcGUiOgoJCXJldHVybiByZW5kZXJSZWNpcGVSZXN1bHQodS5RdWVyeSgpLkdldCgicmVjaXBlIikpCgljYXNlICJyZWNpcGVzIjoKCQlyZXR1cm4gcmVuZGVyUmVjaXBlTGlzdCh1LlF1ZXJ5KCkuR2V0KCJwYWdlIikpCglkZWZhdWx0OgoJCXJldHVybiByZW5kZXJSZWNpcGVFcnJvcigiTm90IGZvdW5kIikKCX0KfQoKZnVuYyByZW5kZXJSZWNpcGVIb21lKCkgc3RyaW5nIHsKCXJldHVybiBgIyBBS0tBRElBIFJlY2lwZQoKSW5ncmVkaWVudHMgYXJlIGJvdW5kIHRvIG9jY3VwaWVkIG9jY3VwYW5jeSBiaXRzIGZyb20gc2xvdCAwIHVwd2FyZC4KCkN1cnJlbnQgY3JhZnQgZmVlIGlzIGAgKyBzdHJjb252LkZvcm1hdEludChHZXRDcmFmdEZlZSgpLCAxMCkgKyBgdWdub3QuCgpFbnRlciBhIHJlY2lwZSB0byBmaW5kIGl0cyBpdGVtIElELgoKPGduby1mb3JtIHBhdGg9InJlY2lwZSI+CiAgPGduby1pbnB1dCBuYW1lPSJyZWNpcGUiIHBsYWNlaG9sZGVyPSIwMDEzfGlyb246MXxpcm9uOjJ8c3RpY2s6MyIgLz4KPC9nbm8tZm9ybT4KCiogW0Jyb3dzZSBSZWNpcGVzXSguL2NyYWZ0OnJlY2lwZXMpCmAKfQoKZnVuYyByZW5kZXJSZWNpcGVMaXN0KHJhd1BhZ2Ugc3RyaW5nKSBzdHJpbmcgewoJcGFnZSA6PSAxCglpZiByYXdQYWdlICE9ICIiIHsKCQlwYXJzZWQsIGVyciA6PSBzdHJjb252LkF0b2kocmF3UGFnZSkKCQlpZiBlcnIgIT0gbmlsIHx8IHBhcnNlZCA8IDEgewoJCQlyZXR1cm4gcmVuZGVyUmVjaXBlRXJyb3IoIkludmFsaWQgcGFnZSIpCgkJfQoJCXBhZ2UgPSBwYXJzZWQKCX0KCgljb3VudCA6PSAyMAoJaWYgY291bnQgPiBsaXN0TGltaXQgewoJCWNvdW50ID0gbGlzdExpbWl0Cgl9CgoJb3V0cHV0IDo9IGAjIFJlY2lwZXMKClvihpAgQmFja10oLi9jcmFmdDopCgpgCgl0b3RhbCA6PSBHZXRSZWNpcGVDb3VudCgpCglpZiB0b3RhbCA9PSAwIHsKCQlyZXR1cm4gb3V0cHV0ICsgYCpObyByZWNpcGVzIHN0b3JlZCB5ZXQuKgpgCgl9CgoJcm93cyA6PSBMaXN0UmVjaXBlcyhwYWdlLCBjb3VudCkKCWlmIGxlbihyb3dzKSA9PSAwIHsKCQlyZXR1cm4gcmVuZGVyUmVjaXBlRXJyb3IoIkludmFsaWQgcGFnZSIpCgl9Cglmb3IgXywgcm93IDo9IHJhbmdlIHJvd3MgewoJCW91dHB1dCArPSAiKiAiICsgZm9ybWF0UmVjaXBlQ29kZShyb3dbInJlY2lwZSJdKSArICIg4oaSICIgKyByb3dbIml0ZW1JZCJdICsgIlxuIgoJfQoJcmV0dXJuIG91dHB1dAp9CgpmdW5jIHJlbmRlclJlY2lwZVJlc3VsdChyZWNpcGUgc3RyaW5nKSBzdHJpbmcgewoJaWYgcmVjaXBlID09ICIiIHsKCQlyZXR1cm4gcmVuZGVyUmVjaXBlRXJyb3IoIlJlY2lwZSBpcyByZXF1aXJlZCIpCgl9CgoJY2Fub25pY2FsLCBfLCBlcnJNc2cgOj0gcGFyc2VSZWNpcGUocmVjaXBlKQoJaWYgZXJyTXNnICE9ICIiIHsKCQlyZXR1cm4gcmVuZGVyUmVjaXBlRXJyb3IoIkludmFsaWQgcmVjaXBlIikKCX0KCWlmICFyZWNpcGVzLkhhcyhjYW5vbmljYWwpIHsKCQlyZXR1cm4gcmVuZGVyUmVjaXBlRXJyb3IoIlJlY2lwZSBub3QgZm91bmQiKQoJfQoKCXJldHVybiBgIyBSZWNpcGUgUmVzdWx0CgoqICoqUmVjaXBlKio6IGAgKyBmb3JtYXRSZWNpcGVDb2RlKGNhbm9uaWNhbCkgKyBgCiogKipJdGVtIElEKio6IGAgKyBzdHJjb252LkZvcm1hdFVpbnQodWludDY0KG11c3RHZXRSZWNpcGVJdGVtSUQoY2Fub25pY2FsKSksIDEwKSArIGAKClvihpAgQmFja10oLi9jcmFmdDopCmAKfQoKZnVuYyByZW5kZXJSZWNpcGVFcnJvcihtZXNzYWdlIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBgIyBFcnJvcgoKPiBgICsgbWVzc2FnZSArIGAKClvihpAgQmFja10oLi9jcmFmdDopCmAKfQoKLy8gUmVjaXBlcyB1c2UgfCBhbmQgLSBhcyBzeW50YXguIEEgY29kZSBzcGFuIGtlZXBzIHRob3NlIGNoYXJhY3RlcnMKLy8gbGl0ZXJhbCBzbyBnbm93ZWIgZG9lcyBub3Qgc2hvdyBiYWNrc2xhc2ggZXNjYXBlcy4KZnVuYyBmb3JtYXRSZWNpcGVDb2RlKHJlY2lwZSBzdHJpbmcpIHN0cmluZyB7CglyZWNpcGUgPSBzdHJpbmdzLlJlcGxhY2VBbGwocmVjaXBlLCAiXG4iLCAiICIpCglmZW5jZSA6PSAiYCIKCWZvciBzdHJpbmdzLkNvbnRhaW5zKHJlY2lwZSwgZmVuY2UpIHsKCQlmZW5jZSArPSAiYCIKCX0KCXJldHVybiBmZW5jZSArIHJlY2lwZSArIGZlbmNlCn0KGsMTCg9yZW5kZXJfdGVzdC5nbm8SrxNwYWNrYWdlIGNyYWZ0CgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgpmdW5jIFRlc3RSZW5kZXJSZWNpcGVMb29rdXAoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgIjAwMDF8Y3JhZnQtcmVuZGVyLWl0ZW06MDEiLCAxMjAwKQoKCW91dHB1dCA6PSBSZW5kZXIoInJlY2lwZT9yZWNpcGU9MDAwMSU3Q2NyYWZ0LXJlbmRlci1pdGVtJTNBMSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXRwdXQsICJJdGVtIElEKio6IDEyMDAiKSwgInNob3VsZCByZW5kZXIgdGhlIG1hcHBlZCBpdGVtIElEIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dHB1dCwgImAwMDAxfDA6Y3JhZnQtcmVuZGVyLWl0ZW06MWAiKSwgInNob3VsZCByZW5kZXIgdGhlIGNhbm9uaWNhbCByZWNpcGUgYXMgYSBjb2RlIHNwYW4iKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dHB1dCwgYFx8YCksICJyZWNpcGUgY29kZSBzcGFuIHNob3VsZCBrZWVwIHBpcGVzIGxpdGVyYWwiKQp9CgpmdW5jIFRlc3RSZW5kZXJSZWNpcGVFcnJvcnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ3JhZnRUZXN0KGNyb3NzKGN1ciksIHQpCgoJZW1wdHkgOj0gUmVuZGVyKCJyZWNpcGUiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoZW1wdHksICJSZWNpcGUgaXMgcmVxdWlyZWQiKSwgInNob3VsZCByZXF1aXJlIGEgcmVjaXBlIikKCglpbnZhbGlkIDo9IFJlbmRlcigicmVjaXBlP3JlY2lwZT1iYWQiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW52YWxpZCwgIkludmFsaWQgcmVjaXBlIiksICJzaG91bGQgcmVqZWN0IGFuIGludmFsaWQgcmVjaXBlIikKCgltaXNzaW5nIDo9IFJlbmRlcigicmVjaXBlP3JlY2lwZT0wMDAxJTdDY3JhZnQtbWlzc2luZy1pdGVtJTNBMSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhtaXNzaW5nLCAiUmVjaXBlIG5vdCBmb3VuZCIpLCAic2hvdWxkIHJlcG9ydCBhIG1pc3NpbmcgcmVjaXBlIikKCgl1bmtub3duIDo9IFJlbmRlcigidW5rbm93biIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyh1bmtub3duLCAiTm90IGZvdW5kIiksICJzaG91bGQgcmVqZWN0IGFuIHVua25vd24gcm91dGUiKQp9CgpmdW5jIFRlc3RSZW5kZXJSZWNpcGVIb21lQW5kTGlzdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDcmFmdFRlc3QoY3Jvc3MoY3VyKSwgdCkKCWhvbWUgOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaG9tZSwgYDxnbm8tZm9ybSBwYXRoPSJyZWNpcGUiPmApLCAic2hvdWxkIHJlbmRlciB0aGUgcmVjaXBlIGxvb2t1cCBmb3JtIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGhvbWUsIGBuYW1lPSJyZWNpcGUiYCksICJzaG91bGQgcmVuZGVyIHRoZSByZWNpcGUgaW5wdXQiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaG9tZSwgYC4vY3JhZnQ6cmVjaXBlc2ApLCAic2hvdWxkIGxpbmsgdG8gdGhlIHJlY2lwZSBsaXN0IikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGhvbWUsICIxMDAwMDAwdWdub3QiKSwgInNob3VsZCByZW5kZXIgdGhlIGRlZmF1bHQgY3JhZnQgZmVlIikKCgllbXB0eUxpc3QgOj0gUmVuZGVyKCJyZWNpcGVzIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGVtcHR5TGlzdCwgIk5vIHJlY2lwZXMgc3RvcmVkIHlldCIpLCAic2hvdWxkIHJlbmRlciBhbiBlbXB0eSBsaXN0IikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglTZXRSZWNpcGUoY3Jvc3MoY3VyKSwgIjAwMDF8Y3JhZnQtbGlzdC1yZW5kZXI6MSIsIDEzMDApCgoJbGlzdGVkIDo9IFJlbmRlcigicmVjaXBlcyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICIxMzAwIiksICJzaG91bGQgcmVuZGVyIHN0b3JlZCBpdGVtIElEcyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICJgMDAwMXwwOmNyYWZ0LWxpc3QtcmVuZGVyOjFgIiksICJzaG91bGQgcmVuZGVyIGxpc3RlZCByZWNpcGVzIGFzIGEgY29kZSBzcGFuIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsIGBcfGApLCAibGlzdGVkIHJlY2lwZSBjb2RlIHNwYW4gc2hvdWxkIGtlZXAgcGlwZXMgbGl0ZXJhbCIpCn0KGtEPCg5zZXR1cF90ZXN0LmdubxK+D3BhY2thZ2UgY3JhZnQKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2VxdWlwbWVudCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9pdGVtIgopCgp2YXIgY3JhZnRUZXN0ID0gc3RydWN0IHsKCUFkbWluLCBPd25lciwgT3RoZXIsIEZlZUNvbGxlY3RvciwgUGtnQWRkciBhZGRyZXNzCglTZXR1cERvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbAp9ewoJQWRtaW46ICAgICAgICB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImNyYWZ0QWRtaW4iKSwKCU93bmVyOiAgICAgICAgdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJjcmFmdE93bmVyIiksCglPdGhlcjogICAgICAgIHRlc3R1dGlscy5UZXN0QWRkcmVzcygiY3JhZnRPdGhlciIpLAoJRmVlQ29sbGVjdG9yOiB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImNyYWZ0RmVlQ29sbGVjdG9yIiksCglQa2dBZGRyOiAgICAgIGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9jcmFmdCIpLAp9CgpmdW5jIHNldHVwQ3JhZnRUZXN0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCglyZXNldENyYWZ0U3RhdGUoKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze30pCglpZiAhY3JhZnRUZXN0LlNldHVwRG9uZSB7CgkJb3JpZ2luYWxBZG1pbiA6PSBhZG1pbi5HZXRBZG1pbigpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIob3JpZ2luYWxBZG1pbikKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG9yaWdpbmFsQWRtaW4pKQoJCWFkbWluLlRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgY3JhZnRUZXN0LkFkbWluKQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCgkJYWRtaW4uQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCQlhZG1pbi5TZXRGZWVDb2xsZWN0b3IoY3Jvc3MoY3VyKSwgY3JhZnRUZXN0LkZlZUNvbGxlY3RvcikKCQljcmFmdFRlc3QuU2V0dXBEb25lID0gdHJ1ZQoJfQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNyYWZ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JhZnRUZXN0LkFkbWluKSkKCWl0ZW0uU2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2NyYWZ0IikKCWVxdWlwbWVudC5TZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCAiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvY3JhZnQiKQp9CgpmdW5jIG1pbnRDcmFmdEl0ZW0oY3VyIHJlYWxtLCB0b2tlbklEIHN0cmluZywgYW1vdW50IGludDY0KSB7Cgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjcmFmdFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyYWZ0VGVzdC5BZG1pbikpCglpdGVtLlNhZmVNaW50KGNyb3NzKGN1ciksIGNyYWZ0VGVzdC5Pd25lciwgdG9rZW5JRCwgYW1vdW50KQp9CgpmdW5jIGRlZmF1bHRDcmFmdEZlZUNvaW5zKCkgY2hhaW4uQ29pbnMgewoJcmV0dXJuIGNoYWluLkNvaW5ze3sidWdub3QiLCBkZWZhdWx0Q3JhZnRGZWV9fQp9CgpmdW5jIHBheUNyYWZ0RmVlKGNvaW5zIGNoYWluLkNvaW5zKSB7CglpZiBsZW4oY29pbnMpID4gMCB7CgkJdGVzdGluZy5Jc3N1ZUNvaW5zKGNyYWZ0VGVzdC5Qa2dBZGRyLCBjb2lucykKCX0KCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjb2lucykKfQoKZnVuYyB1Z25vdEJhbGFuY2VGb3JUZXN0KGFkZHIgYWRkcmVzcykgaW50NjQgewoJcmV0dXJuIGJhbmtlci5OZXdSZWFkb25seUJhbmtlcigpLkdldENvaW5zKGFkZHIpLkFtb3VudE9mKCJ1Z25vdCIpCn0KGqQxCg52YWxpZGF0aW9uLmdubxKRMXBhY2thZ2UgY3JhZnQKCmltcG9ydCAoCgkibmV0L3VybCIKCSJzdHJjb252IgopCgpjb25zdCAoCglyZWNpcGVCYXRjaExpbWl0ICAgICAgICAgICAgID0gMTAwCgltYXhSZWNpcGVJbmdyZWRpZW50cyAgICAgICAgID0gMTYKCWRlZmF1bHRSZWNpcGVMaXN0TGltaXQgICAgICAgPSAxMDAKCWRlZmF1bHRDcmFmdEZlZSAgICAgICAgaW50NjQgPSAxXzAwMF8wMDAKKQoKdHlwZSBjcmFmdEluZ3JlZGllbnQgc3RydWN0IHsKCVNsb3QgICAgdWludAoJVG9rZW5JRCBzdHJpbmcKCUFtb3VudCAgaW50NjQKfQoKZnVuYyBtdXN0UGFyc2VSZWNpcGVDU1YocmVjaXBlc0NTViwgaXRlbUlEc0NTViBzdHJpbmcpIChbXXN0cmluZywgW111aW50MzIpIHsKCWlmIHJlY2lwZXNDU1YgPT0gIiIgewoJCXBhbmljKCJyZWNpcGVzIGlzIHJlcXVpcmVkIikKCX0KCWlmIGl0ZW1JRHNDU1YgPT0gIiIgewoJCXBhbmljKCJpdGVtIGlkcyBpcyByZXF1aXJlZCIpCgl9CgoJY2Fub25pY2FsUmVjaXBlcyA6PSBbXXN0cmluZ3t9CglpdGVtSURzIDo9IFtddWludDMye30KCXJlY2lwZVN0YXJ0LCByZWNpcGVFbmQgOj0gMCwgMAoJaXRlbUlEU3RhcnQsIGl0ZW1JREVuZCA6PSAwLCAwCglmb3IgewoJCWZvciByZWNpcGVFbmQgPCBsZW4ocmVjaXBlc0NTVikgJiYgcmVjaXBlc0NTVltyZWNpcGVFbmRdICE9ICcsJyB7CgkJCXJlY2lwZUVuZCsrCgkJfQoJCWZvciBpdGVtSURFbmQgPCBsZW4oaXRlbUlEc0NTVikgJiYgaXRlbUlEc0NTVltpdGVtSURFbmRdICE9ICcsJyB7CgkJCWl0ZW1JREVuZCsrCgkJfQoKCQlyZWNpcGVUb2tlbiA6PSByZWNpcGVzQ1NWW3JlY2lwZVN0YXJ0OnJlY2lwZUVuZF0KCQlpdGVtSURUZXh0IDo9IGl0ZW1JRHNDU1ZbaXRlbUlEU3RhcnQ6aXRlbUlERW5kXQoJCWlmIHJlY2lwZVRva2VuID09ICIiIHsKCQkJcGFuaWMoImVtcHR5IHJlY2lwZSBub3QgYWxsb3dlZCIpCgkJfQoJCWlmIGl0ZW1JRFRleHQgPT0gIiIgewoJCQlwYW5pYygiZW1wdHkgaXRlbSBpZCBub3QgYWxsb3dlZCIpCgkJfQoKCQljYW5vbmljYWxSZWNpcGUsIF8gOj0gbXVzdFBhcnNlUmVjaXBlKHJlY2lwZVRva2VuKQoJCWl0ZW1JRFZhbHVlLCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQoaXRlbUlEVGV4dCwgMTAsIDMyKQoJCWlmIGVyciAhPSBuaWwgewoJCQlwYW5pYygiaW52YWxpZCBpdGVtIGlkOiAiICsgaXRlbUlEVGV4dCkKCQl9CgoJCWNhbm9uaWNhbFJlY2lwZXMgPSBhcHBlbmQoY2Fub25pY2FsUmVjaXBlcywgY2Fub25pY2FsUmVjaXBlKQoJCWl0ZW1JRHMgPSBhcHBlbmQoaXRlbUlEcywgdWludDMyKGl0ZW1JRFZhbHVlKSkKCQlpZiBsZW4oY2Fub25pY2FsUmVjaXBlcykgPiByZWNpcGVCYXRjaExpbWl0IHsKCQkJcGFuaWMoInJlY2lwZXMgZXhjZWVkcyAxMDAiKQoJCX0KCgkJcmVjaXBlRG9uZSA6PSByZWNpcGVFbmQgPj0gbGVuKHJlY2lwZXNDU1YpCgkJaXRlbUlERG9uZSA6PSBpdGVtSURFbmQgPj0gbGVuKGl0ZW1JRHNDU1YpCgkJaWYgcmVjaXBlRG9uZSAhPSBpdGVtSUREb25lIHsKCQkJcGFuaWMoInJlY2lwZXMgYW5kIGl0ZW0gaWRzIGNvdW50IG1pc21hdGNoIikKCQl9CgkJaWYgcmVjaXBlRG9uZSB7CgkJCXJldHVybiBjYW5vbmljYWxSZWNpcGVzLCBpdGVtSURzCgkJfQoKCQlyZWNpcGVFbmQrKwoJCWl0ZW1JREVuZCsrCgkJcmVjaXBlU3RhcnQgPSByZWNpcGVFbmQKCQlpdGVtSURTdGFydCA9IGl0ZW1JREVuZAoJfQp9CgpmdW5jIG11c3RQYXJzZVJlY2lwZUtleUNTVihyZWNpcGVzQ1NWIHN0cmluZykgW11zdHJpbmcgewoJaWYgcmVjaXBlc0NTViA9PSAiIiB7CgkJcGFuaWMoInJlY2lwZXMgaXMgcmVxdWlyZWQiKQoJfQoKCWNhbm9uaWNhbFJlY2lwZXMgOj0gW11zdHJpbmd7fQoJcmVjaXBlU3RhcnQsIHJlY2lwZUVuZCA6PSAwLCAwCglmb3IgewoJCWZvciByZWNpcGVFbmQgPCBsZW4ocmVjaXBlc0NTVikgJiYgcmVjaXBlc0NTVltyZWNpcGVFbmRdICE9ICcsJyB7CgkJCXJlY2lwZUVuZCsrCgkJfQoKCQlyZWNpcGVUb2tlbiA6PSByZWNpcGVzQ1NWW3JlY2lwZVN0YXJ0OnJlY2lwZUVuZF0KCQlpZiByZWNpcGVUb2tlbiA9PSAiIiB7CgkJCXBhbmljKCJlbXB0eSByZWNpcGUgbm90IGFsbG93ZWQiKQoJCX0KCgkJY2Fub25pY2FsUmVjaXBlLCBfIDo9IG11c3RQYXJzZVJlY2lwZShyZWNpcGVUb2tlbikKCQljYW5vbmljYWxSZWNpcGVzID0gYXBwZW5kKGNhbm9uaWNhbFJlY2lwZXMsIGNhbm9uaWNhbFJlY2lwZSkKCQlpZiBsZW4oY2Fub25pY2FsUmVjaXBlcykgPiByZWNpcGVCYXRjaExpbWl0IHsKCQkJcGFuaWMoInJlY2lwZXMgZXhjZWVkcyAxMDAiKQoJCX0KCgkJaWYgcmVjaXBlRW5kID49IGxlbihyZWNpcGVzQ1NWKSB7CgkJCXJldHVybiBjYW5vbmljYWxSZWNpcGVzCgkJfQoKCQlyZWNpcGVFbmQrKwoJCXJlY2lwZVN0YXJ0ID0gcmVjaXBlRW5kCgl9Cn0KCmZ1bmMgbXVzdFBhcnNlUmVjaXBlKHJlY2lwZSBzdHJpbmcpIChzdHJpbmcsIFtdY3JhZnRJbmdyZWRpZW50KSB7CgljYW5vbmljYWwsIGluZ3JlZGllbnRzLCBlcnJNc2cgOj0gcGFyc2VSZWNpcGUocmVjaXBlKQoJaWYgZXJyTXNnICE9ICIiIHsKCQlwYW5pYyhlcnJNc2cpCgl9CglyZXR1cm4gY2Fub25pY2FsLCBpbmdyZWRpZW50cwp9CgovLyBBIHZhbGlkIHJlY2lwZSBpcyAiPDQtaGV4IG9jY3VwYW5jeT58PGluZ3JlZGllbnQ+fC4uLiIuIE9jY3VwYW5jeSBiaXRzCi8vIGNob29zZSBzbG90cyAwLTE1IGluIG9yZGVyOyBlYWNoIGluZ3JlZGllbnQgaXMgInRva2VuSWQ6YW1vdW50IiBvcgovLyAic2xvdDp0b2tlbklkOmFtb3VudCIuIEV4YW1wbGU6ICIwMDEzfGlyb246MXxpcm9uOjJ8c3RpY2s6MiIgKGJpdHMgMCwxLDQpCi8vIGNhbm9uaWNhbGl6ZXMgdG8gIjAwMTN8MDppcm9uOjF8MTppcm9uOjJ8NDpzdGljazoyIi4KZnVuYyBwYXJzZVJlY2lwZShyZWNpcGUgc3RyaW5nKSAoc3RyaW5nLCBbXWNyYWZ0SW5ncmVkaWVudCwgc3RyaW5nKSB7CglpZiBsZW4ocmVjaXBlKSA8IDcgfHwgcmVjaXBlWzRdICE9ICd8JyB7CgkJcmV0dXJuICIiLCBuaWwsICJpbnZhbGlkIHJlY2lwZSIKCX0KCglvY2N1cGFuY3lWYWx1ZSwgZXJyIDo9IHN0cmNvbnYuUGFyc2VVaW50KHJlY2lwZVs6NF0sIDE2LCAxNikKCWlmIGVyciAhPSBuaWwgfHwgb2NjdXBhbmN5VmFsdWUgPT0gMCB7CgkJcmV0dXJuICIiLCBuaWwsICJpbnZhbGlkIHJlY2lwZSBvY2N1cGFuY3kiCgl9CglvY2N1cGFuY3kgOj0gdWludDE2KG9jY3VwYW5jeVZhbHVlKQoJc2xvdHMgOj0gb2NjdXBpZWRTbG90cyhvY2N1cGFuY3kpCgoJaW5ncmVkaWVudHMgOj0gW11jcmFmdEluZ3JlZGllbnR7fQoJZW50cnlTdGFydCwgZW50cnlFbmQgOj0gNSwgNQoJZm9yIHsKCQlmb3IgZW50cnlFbmQgPCBsZW4ocmVjaXBlKSAmJiByZWNpcGVbZW50cnlFbmRdICE9ICd8JyB7CgkJCWVudHJ5RW5kKysKCQl9CgoJCWlmIGxlbihpbmdyZWRpZW50cykgPT0gbGVuKHNsb3RzKSB7CgkJCXJldHVybiAiIiwgbmlsLCAib2NjdXBpZWQgc2xvdHMgYW5kIGluZ3JlZGllbnRzIGNvdW50IG1pc21hdGNoIgoJCX0KCgkJaW5ncmVkaWVudCwgZXJyTXNnIDo9IHBhcnNlUmVjaXBlSW5ncmVkaWVudCgKCQkJcmVjaXBlW2VudHJ5U3RhcnQ6ZW50cnlFbmRdLAoJCQlzbG90c1tsZW4oaW5ncmVkaWVudHMpXSwKCQkpCgkJaWYgZXJyTXNnICE9ICIiIHsKCQkJcmV0dXJuICIiLCBuaWwsIGVyck1zZwoJCX0KCQlpbmdyZWRpZW50cyA9IGFwcGVuZChpbmdyZWRpZW50cywgaW5ncmVkaWVudCkKCQlpZiBsZW4oaW5ncmVkaWVudHMpID4gbWF4UmVjaXBlSW5ncmVkaWVudHMgewoJCQlyZXR1cm4gIiIsIG5pbCwgInJlY2lwZSBpbmdyZWRpZW50cyBleGNlZWRzIDE2IgoJCX0KCgkJaWYgZW50cnlFbmQgPj0gbGVuKHJlY2lwZSkgewoJCQlicmVhawoJCX0KCgkJZW50cnlFbmQrKwoJCWVudHJ5U3RhcnQgPSBlbnRyeUVuZAoJfQoKCWlmIGxlbihpbmdyZWRpZW50cykgIT0gbGVuKHNsb3RzKSB7CgkJcmV0dXJuICIiLCBuaWwsICJvY2N1cGllZCBzbG90cyBhbmQgaW5ncmVkaWVudHMgY291bnQgbWlzbWF0Y2giCgl9CgoJY2Fub25pY2FsUmVjaXBlIDo9IGZvcm1hdE9jY3VwYW5jeShvY2N1cGFuY3kpCglmb3IgXywgaW5ncmVkaWVudCA6PSByYW5nZSBpbmdyZWRpZW50cyB7CgkJY2Fub25pY2FsUmVjaXBlICs9ICJ8IiArCgkJCXN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQoaW5ncmVkaWVudC5TbG90KSwgMTApICsgIjoiICsKCQkJdXJsLlBhdGhFc2NhcGUoaW5ncmVkaWVudC5Ub2tlbklEKSArICI6IiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGluZ3JlZGllbnQuQW1vdW50LCAxMCkKCX0KCXJldHVybiBjYW5vbmljYWxSZWNpcGUsIGluZ3JlZGllbnRzLCAiIgp9CgpmdW5jIHBhcnNlUmVjaXBlSW5ncmVkaWVudChlbnRyeSBzdHJpbmcsIGV4cGVjdGVkU2xvdCB1aW50KSAoY3JhZnRJbmdyZWRpZW50LCBzdHJpbmcpIHsKCWFtb3VudFNlcGFyYXRvciA6PSBsZW4oZW50cnkpIC0gMQoJZm9yIGFtb3VudFNlcGFyYXRvciA+IDAgJiYgZW50cnlbYW1vdW50U2VwYXJhdG9yXSAhPSAnOicgewoJCWFtb3VudFNlcGFyYXRvci0tCgl9CglpZiBhbW91bnRTZXBhcmF0b3IgPT0gMCB8fCBlbnRyeVthbW91bnRTZXBhcmF0b3JdICE9ICc6JyB7CgkJcmV0dXJuIGNyYWZ0SW5ncmVkaWVudHt9LCAiaW52YWxpZCByZWNpcGUgaW5ncmVkaWVudCIKCX0KCgl0b2tlbkZpZWxkIDo9IGVudHJ5WzphbW91bnRTZXBhcmF0b3JdCglhbW91bnRUZXh0IDo9IGVudHJ5W2Ftb3VudFNlcGFyYXRvcisxOl0KCWVuY29kZWRUb2tlbklEIDo9IHRva2VuRmllbGQKCXNsb3RQcmVmaXhFbmQgOj0gMAoJZm9yIHNsb3RQcmVmaXhFbmQgPCBsZW4odG9rZW5GaWVsZCkgJiYgdG9rZW5GaWVsZFtzbG90UHJlZml4RW5kXSAhPSAnOicgewoJCXNsb3RQcmVmaXhFbmQrKwoJfQoJaWYgc2xvdFByZWZpeEVuZCA8IGxlbih0b2tlbkZpZWxkKSAmJiB0b2tlbkZpZWxkW3Nsb3RQcmVmaXhFbmRdID09ICc6JyB7CgkJc2xvdFZhbHVlLCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQodG9rZW5GaWVsZFs6c2xvdFByZWZpeEVuZF0sIDEwLCA4KQoJCWlmIGVyciA9PSBuaWwgewoJCQlpZiB1aW50KHNsb3RWYWx1ZSkgIT0gZXhwZWN0ZWRTbG90IHsKCQkJCXJldHVybiBjcmFmdEluZ3JlZGllbnR7fSwgImluZ3JlZGllbnQgc2xvdCBtaXNtYXRjaCIKCQkJfQoJCQllbmNvZGVkVG9rZW5JRCA9IHRva2VuRmllbGRbc2xvdFByZWZpeEVuZCsxOl0KCQl9Cgl9CgoJdG9rZW5JRCwgZXJyIDo9IHVybC5QYXRoVW5lc2NhcGUoZW5jb2RlZFRva2VuSUQpCglpZiBlcnIgIT0gbmlsIHx8IHRva2VuSUQgPT0gIiIgewoJCXJldHVybiBjcmFmdEluZ3JlZGllbnR7fSwgImludmFsaWQgaXRlbSB0b2tlbiBpZCIKCX0KCglhbW91bnQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KGFtb3VudFRleHQsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBjcmFmdEluZ3JlZGllbnR7fSwgImludmFsaWQgaW5ncmVkaWVudCBhbW91bnQ6ICIgKyBhbW91bnRUZXh0Cgl9CglpZiBhbW91bnQgPD0gMCB7CgkJcmV0dXJuIGNyYWZ0SW5ncmVkaWVudHt9LCAiaW5ncmVkaWVudCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIKCX0KCglyZXR1cm4gY3JhZnRJbmdyZWRpZW50ewoJCVNsb3Q6ICAgIGV4cGVjdGVkU2xvdCwKCQlUb2tlbklEOiB0b2tlbklELAoJCUFtb3VudDogIGFtb3VudCwKCX0sICIiCn0KCmZ1bmMgb2NjdXBpZWRTbG90cyhvY2N1cGFuY3kgdWludDE2KSBbXXVpbnQgewoJc2xvdHMgOj0gW111aW50e30KCWZvciBzbG90IDo9IHVpbnQoMCk7IHNsb3QgPCAxNjsgc2xvdCsrIHsKCQlpZiBvY2N1cGFuY3kmKHVpbnQxNigxKTw8c2xvdCkgIT0gMCB7CgkJCXNsb3RzID0gYXBwZW5kKHNsb3RzLCBzbG90KQoJCX0KCX0KCXJldHVybiBzbG90cwp9CgpmdW5jIGZvcm1hdE9jY3VwYW5jeShvY2N1cGFuY3kgdWludDE2KSBzdHJpbmcgewoJdmFsdWUgOj0gc3RyY29udi5Gb3JtYXRVaW50KHVpbnQ2NChvY2N1cGFuY3kpLCAxNikKCXJldHVybiAiMDAwMCJbOjQtbGVuKHZhbHVlKV0gKyB2YWx1ZQp9CgpmdW5jIGFzc2VydFJlY2lwZUxpc3RQYWdlQ291bnQocGFnZSwgY291bnQgaW50KSB7CglpZiBwYWdlIDwgMSB7CgkJcGFuaWMoInBhZ2UgbXVzdCBiZSBhdCBsZWFzdCAxIikKCX0KCWlmIGNvdW50IDwgMSB7CgkJcGFuaWMoImNvdW50IG11c3QgYmUgYXQgbGVhc3QgMSIpCgl9CglpZiBjb3VudCA+IGxpc3RMaW1pdCB7CgkJcGFuaWMoImNvdW50IGV4Y2VlZHMgbGlzdExpbWl0IChtYXg6ICIgKyBzdHJjb252Lkl0b2EobGlzdExpbWl0KSArICIpIikKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEgiosZtuEgsxMTU1Njh1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQItRS2vq8g7O+I4ZvJRzWH7jH0BzvxYjnsf41ryBRUbwxJAmF5rPB1WxdnQs9y/W20moDR0xPeTAwpIFQWKIBHnc24kIv+49u/sRxQmqyccpg9/4UKXPoIxQSKx8Omgbk3fzRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data