Transaction executed successfully

Transaction Details

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

Transaction hash
3426AFE3D38091826F1046F1977C06D324765C332C622AFF5105F32DDB5B9306

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
122,016,357
Requested gas limit
GAS USED
101,680,337
Gas consumed
FEE
122017ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cp3XBAoML3ZtLm1fYWRkcGtnEovXBAooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLd1gQKB3VpbnQyNTYSHWduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxGuoJCglSRUFETUUubWQS3AkjIHVpbnQyNTYKCjI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBhcml0aG1ldGljIGZvciBHbm9Td2FwLgoKIyMgT3ZlcnZpZXcKCkZpeGVkLXNpemUgMjU2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGxpYnJhcnkgb3B0aW1pemVkIGZvciBBTU0gY2FsY3VsYXRpb25zIHdpdGgKcHJlY2lzZSBgTXVsRGl2YCBvcGVyYXRpb25zLiBUaGUgdW5zdWZmaXhlZCBgQWRkYCwgYFN1YmAsIGFuZCBgTXVsYCBtZXRob2RzCnJldHVybiB0aGUgbG93IDI1NiBiaXRzOyB0aGUgY29ycmVzcG9uZGluZyBgQWRkT3ZlcmZsb3dgLCBgU3ViT3ZlcmZsb3dgLCBhbmQKYE11bE92ZXJmbG93YCB2YXJpYW50cyBhbHNvIHJlcG9ydCBhbiBvdmVyZmxvdy91bmRlcmZsb3cgZmxhZy4KCiMjIEZlYXR1cmVzCgotIEZpeGVkIDI1Ni1iaXQgc2l6ZSAoNCB1aW50NjQgdmFsdWVzKQotIEV4cGxpY2l0IG92ZXJmbG93IGRldGVjdGlvbiB2aWEgYCpPdmVyZmxvd2AgdmFyaWFudHMKLSBPcHRpbWl6ZWQgYE11bERpdmAgZm9yIHByZWNpc2UgY2FsY3VsYXRpb25zCi0gRGVjaW1hbCBzdHJpbmcgY29udmVyc2lvbgotIFJhbmdlOiAwIHRvIDJeMjU2LTEKCiMjIFVzYWdlCgpgYGBnbwpwYWNrYWdlIG1haW4KCmltcG9ydCB1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCmZ1bmMgbWFpbigpIHsKICAgIGEgOj0gdTI1Ni5OZXdVaW50KDEwMDApCiAgICBiIDo9IHUyNTYuTXVzdEZyb21EZWNpbWFsKCIxMDAwMDAwMDAwMDAwMDAwMDAwIikKICAgIHJlc3VsdCwgb3ZlcmZsb3cgOj0gbmV3KHUyNTYuVWludCkuQWRkT3ZlcmZsb3coYSwgYikKICAgIGlmIG92ZXJmbG93IHsKICAgICAgICBwYW5pYygidW5zaWduZWQgYWRkaXRpb24gb3ZlcmZsb3ciKQogICAgfQogICAgcHJpbnRsbihyZXN1bHQuVG9TdHJpbmcoKSkgLy8gMTAwMDAwMDAwMDAwMDAwMTAwMAoKICAgIC8vIE11bERpdiBjYWxjdWxhdGVzIGZsb29yKGEqYi9jKS4gVGhlIGRlbm9taW5hdG9yIG11c3QgYmUgbm9uLXplcm8sCiAgICAvLyBhbmQgdGhlIHF1b3RpZW50IG11c3QgZml0IGluIDI1NiBiaXRzOyBvdGhlcndpc2UgaXQgcGFuaWNzLgogICAgYyA6PSB1MjU2Lk5ld1VpbnQoMykKICAgIHByaW50bG4odTI1Ni5NdWxEaXYoYSwgYiwgYykuVG9TdHJpbmcoKSkgLy8gMzMzMzMzMzMzMzMzMzMzMzMzMzMzCn0KYGBgCgojIyBDcmVkaXRzCgpQb3J0ZWQgZnJvbSBbaG9saW1hbi91aW50MjU2XShodHRwczovL2dpdGh1Yi5jb20vaG9saW1hbi91aW50MjU2KRr0YgoOYXJpdGhtZXRpYy5nbm8S4WIvLyBhcml0aG1ldGljIHByb3ZpZGVzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBmb3IgVWludCBvYmplY3RzLgovLyBUaGlzIGluY2x1ZGVzIGJhc2ljIGJpbmFyeSBvcGVyYXRpb25zIHN1Y2ggYXMgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBtdWx0aXBsaWNhdGlvbiwgZGl2aXNpb24sIGFuZCBtb2R1bG8gb3BlcmF0aW9ucwovLyBhcyB3ZWxsIGFzIG92ZXJmbG93IGNoZWNrcywgYW5kIG5lZ2F0aW9uLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGVzc2VudGlhbCBmb3IgbnVtZXJpYwovLyBjYWxjdWxhdGlvbnMgdXNpbmcgMjU2LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KcGFja2FnZSB1aW50MjU2CgppbXBvcnQgKAoJIm1hdGgvYml0cyIKKQoKLy8gQWRkIHNldHMgeiB0byB0aGUgc3VtIHgreSBhbmQgcmV0dXJucyB6LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0geDogdGhlIGZpcnN0IGFkZGVuZDsgaXRzIDI1Ni1iaXQgdmFsdWUgaXMgYWRkZWQgbW9kdWxvIDJeMjU2Ci8vICAgLSB5OiB0aGUgc2Vjb25kIGFkZGVuZDsgaXRzIDI1Ni1iaXQgdmFsdWUgaXMgYWRkZWQgbW9kdWxvIDJeMjU2Ci8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogY29udGFpbmluZyB4K3kgbW9kdWxvIDJeMjU2OyBhbnkgY2FycnkgYmV5b25kIGJpdCAyNTUgaXMgZGlzY2FyZGVkCmZ1bmMgKHogKlVpbnQpIEFkZCh4LCB5ICpVaW50KSAqVWludCB7Cgl2YXIgY2FycnkgdWludDY0Cgl6WzBdLCBjYXJyeSA9IGJpdHMuQWRkNjQoeFswXSwgeVswXSwgMCkKCXpbMV0sIGNhcnJ5ID0gYml0cy5BZGQ2NCh4WzFdLCB5WzFdLCBjYXJyeSkKCXpbMl0sIGNhcnJ5ID0gYml0cy5BZGQ2NCh4WzJdLCB5WzJdLCBjYXJyeSkKCXpbM10sIF8gPSBiaXRzLkFkZDY0KHhbM10sIHlbM10sIGNhcnJ5KQoJcmV0dXJuIHoKfQoKLy8gQWRkT3ZlcmZsb3cgc2V0cyB6IHRvIHRoZSBzdW0geCt5IGFuZCByZXR1cm5zIHogYW5kIHRydWUgaWYgb3ZlcmZsb3cgb2NjdXJyZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiB0aGUgZmlyc3QgYWRkZW5kCi8vICAgLSB5OiB0aGUgc2Vjb25kIGFkZGVuZAovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGNvbnRhaW5pbmcgeCt5IG1vZHVsbyAyXjI1NgovLyAgIC0gb3ZlcmZsb3c6IHRydWUgd2hlbiB4K3kgZXhjZWVkcyB0aGUgMjU2LWJpdCByYW5nZQpmdW5jICh6ICpVaW50KSBBZGRPdmVyZmxvdyh4LCB5ICpVaW50KSAoKlVpbnQsIGJvb2wpIHsKCXZhciBjYXJyeSB1aW50NjQKCXpbMF0sIGNhcnJ5ID0gYml0cy5BZGQ2NCh4WzBdLCB5WzBdLCAwKQoJelsxXSwgY2FycnkgPSBiaXRzLkFkZDY0KHhbMV0sIHlbMV0sIGNhcnJ5KQoJelsyXSwgY2FycnkgPSBiaXRzLkFkZDY0KHhbMl0sIHlbMl0sIGNhcnJ5KQoJelszXSwgY2FycnkgPSBiaXRzLkFkZDY0KHhbM10sIHlbM10sIGNhcnJ5KQoJcmV0dXJuIHosIGNhcnJ5ICE9IDAKfQoKLy8gU3ViIHNldHMgeiB0byB0aGUgZGlmZmVyZW5jZSB4LXkgYW5kIHJldHVybnMgei4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBtaW51ZW5kCi8vICAgLSB5OiB0aGUgc3VidHJhaGVuZAovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGNvbnRhaW5pbmcgeC15IG1vZHVsbyAyXjI1NjsgdW5kZXJmbG93IHdyYXBzIGluIHRoZSB1bnNpZ25lZCByZXByZXNlbnRhdGlvbgpmdW5jICh6ICpVaW50KSBTdWIoeCwgeSAqVWludCkgKlVpbnQgewoJdmFyIGNhcnJ5IHVpbnQ2NAoJelswXSwgY2FycnkgPSBiaXRzLlN1YjY0KHhbMF0sIHlbMF0sIDApCgl6WzFdLCBjYXJyeSA9IGJpdHMuU3ViNjQoeFsxXSwgeVsxXSwgY2FycnkpCgl6WzJdLCBjYXJyeSA9IGJpdHMuU3ViNjQoeFsyXSwgeVsyXSwgY2FycnkpCgl6WzNdLCBfID0gYml0cy5TdWI2NCh4WzNdLCB5WzNdLCBjYXJyeSkKCXJldHVybiB6Cn0KCi8vIFN1Yk92ZXJmbG93IHNldHMgeiB0byB0aGUgZGlmZmVyZW5jZSB4LXkgYW5kIHJldHVybnMgeiBhbmQgdHJ1ZSBpZiB1bmRlcmZsb3cgb2NjdXJyZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiB0aGUgbWludWVuZAovLyAgIC0geTogdGhlIHN1YnRyYWhlbmQKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBjb250YWluaW5nIHgteSBtb2R1bG8gMl4yNTYKLy8gICAtIHVuZGVyZmxvdzogdHJ1ZSB3aGVuIHggaXMgbGVzcyB0aGFuIHkKZnVuYyAoeiAqVWludCkgU3ViT3ZlcmZsb3coeCwgeSAqVWludCkgKCpVaW50LCBib29sKSB7Cgl2YXIgY2FycnkgdWludDY0Cgl6WzBdLCBjYXJyeSA9IGJpdHMuU3ViNjQoeFswXSwgeVswXSwgMCkKCXpbMV0sIGNhcnJ5ID0gYml0cy5TdWI2NCh4WzFdLCB5WzFdLCBjYXJyeSkKCXpbMl0sIGNhcnJ5ID0gYml0cy5TdWI2NCh4WzJdLCB5WzJdLCBjYXJyeSkKCXpbM10sIGNhcnJ5ID0gYml0cy5TdWI2NCh4WzNdLCB5WzNdLCBjYXJyeSkKCXJldHVybiB6LCBjYXJyeSAhPSAwCn0KCi8vIE5lZyByZXR1cm5zIC14IG1vZCAyXjI1Ni4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSB2YWx1ZSB3aG9zZSBhZGRpdGl2ZSBpbnZlcnNlIG1vZHVsbyAyXjI1NiBpcyBjb21wdXRlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGNvbnRhaW5pbmcgLXggbW9kdWxvIDJeMjU2CmZ1bmMgKHogKlVpbnQpIE5lZyh4ICpVaW50KSAqVWludCB7CglyZXR1cm4gei5TdWIoWmVybygpLCB4KQp9CgovLyBNdWwgc2V0cyB6IHRvIHRoZSBwcm9kdWN0IHgqeSBhbmQgcmV0dXJucyB6LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0geDogdGhlIGZpcnN0IG11bHRpcGxpY2FuZAovLyAgIC0geTogdGhlIHNlY29uZCBtdWx0aXBsaWNhbmQKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBjb250YWluaW5nIHRoZSBsb3cgMjU2IGJpdHMgb2YgeCp5CmZ1bmMgKHogKlVpbnQpIE11bCh4LCB5ICpVaW50KSAqVWludCB7Cgl2YXIgKAoJCXJlcyAgICAgICAgICAgICAgVWludAoJCWNhcnJ5ICAgICAgICAgICAgdWludDY0CgkJcmVzMSwgcmVzMiwgcmVzMyB1aW50NjQKCSkKCgljYXJyeSwgcmVzWzBdID0gYml0cy5NdWw2NCh4WzBdLCB5WzBdKQoJY2FycnksIHJlczEgPSB1bXVsSG9wKGNhcnJ5LCB4WzFdLCB5WzBdKQoJY2FycnksIHJlczIgPSB1bXVsSG9wKGNhcnJ5LCB4WzJdLCB5WzBdKQoJcmVzMyA9IHhbM10qeVswXSArIGNhcnJ5CgoJY2FycnksIHJlc1sxXSA9IHVtdWxIb3AocmVzMSwgeFswXSwgeVsxXSkKCWNhcnJ5LCByZXMyID0gdW11bFN0ZXAocmVzMiwgeFsxXSwgeVsxXSwgY2FycnkpCglyZXMzID0gcmVzMyArIHhbMl0qeVsxXSArIGNhcnJ5CgoJY2FycnksIHJlc1syXSA9IHVtdWxIb3AocmVzMiwgeFswXSwgeVsyXSkKCXJlczMgPSByZXMzICsgeFsxXSp5WzJdICsgY2FycnkKCglyZXNbM10gPSByZXMzICsgeFswXSp5WzNdCgoJcmV0dXJuIHouU2V0KCZyZXMpCn0KCi8vIE11bE92ZXJmbG93IHNldHMgeiB0byB0aGUgcHJvZHVjdCB4KnkgYW5kIHJldHVybnMgeiBhbmQgdHJ1ZSBpZiBvdmVyZmxvdyBvY2N1cnJlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBmaXJzdCBtdWx0aXBsaWNhbmQKLy8gICAtIHk6IHRoZSBzZWNvbmQgbXVsdGlwbGljYW5kCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogY29udGFpbmluZyB0aGUgbG93IDI1NiBiaXRzIG9mIHgqeQovLyAgIC0gb3ZlcmZsb3c6IHRydWUgd2hlbiB0aGUgZnVsbCBwcm9kdWN0IG5lZWRzIG1vcmUgdGhhbiAyNTYgYml0cwpmdW5jICh6ICpVaW50KSBNdWxPdmVyZmxvdyh4LCB5ICpVaW50KSAoKlVpbnQsIGJvb2wpIHsKCXAgOj0gdW11bCh4LCB5KQoJY29weSh6WzpdLCBwWzo0XSkKCXJldHVybiB6LCAocFs0XSB8IHBbNV0gfCBwWzZdIHwgcFs3XSkgIT0gMAp9CgovLyBEaXYgc2V0cyB6IHRvIHRoZSBxdW90aWVudCB4L3kgYW5kIHJldHVybnMgei4KLy8gSXQgcGFuaWNzIGlmIHkgPT0gMC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBkaXZpZGVuZAovLyAgIC0geTogdGhlIG5vbi16ZXJvIGRpdmlzb3I7IHplcm8gY2F1c2VzIGEgZGl2aXNpb24tYnktemVybyBwYW5pYwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGNvbnRhaW5pbmcgdGhlIHVuc2lnbmVkIHF1b3RpZW50IHgveQpmdW5jICh6ICpVaW50KSBEaXYoeCwgeSAqVWludCkgKlVpbnQgewoJaWYgeS5Jc1plcm8oKSB7CgkJcGFuaWMoImRpdmlzaW9uIGJ5IHplcm8iKQoJfQoJaWYgeS5HdCh4KSB7CgkJcmV0dXJuIHouQ2xlYXIoKQoJfQoJaWYgeC5FcSh5KSB7CgkJcmV0dXJuIHouU2V0T25lKCkKCX0KCS8vIFNob3J0Y3V0IHNvbWUgY2FzZXMKCWlmIHguSXNVaW50NjQoKSB7CgkJcmV0dXJuIHouU2V0VWludDY0KHguVWludDY0KCkgLyB5LlVpbnQ2NCgpKQoJfQoKCS8vIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cKCS8vIHgveSA7IHggPiB5ID4gMAoKCXZhciBxdW90IFVpbnQKCXVkaXZyZW0ocXVvdFs6XSwgeFs6XSwgeSkKCXJldHVybiB6LlNldCgmcXVvdCkKfQoKLy8gTW9kIHNldHMgeiB0byB0aGUgbW9kdWx1cyB4JXkgYW5kIHJldHVybnMgei4KLy8gSXQgcGFuaWNzIGlmIHkgPT0gMC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBkaXZpZGVuZAovLyAgIC0geTogdGhlIG5vbi16ZXJvIGRpdmlzb3I7IHplcm8gY2F1c2VzIGEgbW9kdWxvLWJ5LXplcm8gcGFuaWMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBjb250YWluaW5nIHRoZSB1bnNpZ25lZCByZW1haW5kZXIgeCV5CmZ1bmMgKHogKlVpbnQpIE1vZCh4LCB5ICpVaW50KSAqVWludCB7CglpZiB5LklzWmVybygpIHsKCQlwYW5pYygibW9kdWxvIGJ5IHplcm8iKQoJfQoJaWYgeC5Jc1plcm8oKSB7CgkJcmV0dXJuIHouQ2xlYXIoKQoJfQoJc3dpdGNoIHguQ21wKHkpIHsKCWNhc2UgLTE6CgkJLy8geCA8IHkKCQljb3B5KHpbOl0sIHhbOl0pCgkJcmV0dXJuIHoKCWNhc2UgMDoKCQkvLyB4ID09IHkKCQlyZXR1cm4gei5DbGVhcigpIC8vIFRoZXkgYXJlIGVxdWFsCgl9CgoJLy8gQXQgdGhpcyBwb2ludDoKCS8vIHggIT0gMAoJLy8geSAhPSAwCgkvLyB4ID4geQoKCS8vIFNob3J0Y3V0IHRyaXZpYWwgY2FzZQoJaWYgeC5Jc1VpbnQ2NCgpIHsKCQlyZXR1cm4gei5TZXRVaW50NjQoeC5VaW50NjQoKSAlIHkuVWludDY0KCkpCgl9CgoJdmFyIHF1b3QgVWludAoJKnogPSB1ZGl2cmVtKHF1b3RbOl0sIHhbOl0sIHkpCglyZXR1cm4gegp9CgovLyBNdWxNb2Qgc2V0cyB6IHRvICh4ICogeSkgbW9kIG0gYW5kIHJldHVybnMgei4KLy8gSXQgcGFuaWNzIGlmIG0gPT0gMC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBmaXJzdCBtdWx0aXBsaWNhbmQKLy8gICAtIHk6IHRoZSBzZWNvbmQgbXVsdGlwbGljYW5kCi8vICAgLSBtOiB0aGUgbm9uLXplcm8gbW9kdWx1czsgemVybyBjYXVzZXMgYSBtb2R1bG8tYnktemVybyBwYW5pYwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGNvbnRhaW5pbmcgKHgqeSkgbW9kdWxvIG0KZnVuYyAoeiAqVWludCkgTXVsTW9kKHgsIHksIG0gKlVpbnQpICpVaW50IHsKCWlmIG0uSXNaZXJvKCkgewoJCXBhbmljKCJtb2R1bG8gYnkgemVybyIpCgl9CglpZiB4LklzWmVybygpIHx8IHkuSXNaZXJvKCkgewoJCXJldHVybiB6LkNsZWFyKCkKCX0KCXAgOj0gdW11bCh4LCB5KQoKCWlmIG1bM10gIT0gMCB7CgkJbXUgOj0gUmVjaXByb2NhbChtKQoJCXIgOj0gcmVkdWNlNChwLCBtLCBtdSkKCQlyZXR1cm4gei5TZXQoJnIpCgl9CgoJdmFyICgKCQlwbCBVaW50CgkJcGggVWludAoJKQoKCXBsWzBdLCBwbFsxXSwgcGxbMl0sIHBsWzNdID0gcFswXSwgcFsxXSwgcFsyXSwgcFszXQoJcGhbMF0sIHBoWzFdLCBwaFsyXSwgcGhbM10gPSBwWzRdLCBwWzVdLCBwWzZdLCBwWzddCgoJLy8gSWYgdGhlIG11bHRpcGxpY2F0aW9uIGlzIHdpdGhpbiAyNTYgYml0cyB1c2UgTW9kKCkuCglpZiBwaC5Jc1plcm8oKSB7CgkJcmV0dXJuIHouTW9kKCZwbCwgbSkKCX0KCgl2YXIgcXVvdCBbOF11aW50NjQKCXJlbSA6PSB1ZGl2cmVtKHF1b3RbOl0sIHBbOl0sIG0pCglyZXR1cm4gei5TZXQoJnJlbSkKfQoKLy8gRGl2TW9kIHNldHMgeiB0byB0aGUgcXVvdGllbnQgeC95IGFuZCBtIHRvIHRoZSBtb2R1bHVzIHgleSwgcmV0dXJuaW5nIHRoZSBwYWlyICh6LCBtKS4KLy8gSXQgcGFuaWNzIGlmIHkgPT0gMC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBkaXZpZGVuZAovLyAgIC0geTogdGhlIG5vbi16ZXJvIGRpdmlzb3I7IHplcm8gY2F1c2VzIGEgZGl2aXNpb24tYnktemVybyBwYW5pYwovLyAgIC0gbTogdGhlIGRlc3RpbmF0aW9uIG92ZXJ3cml0dGVuIHdpdGggeCBtb2R1bG8geQovLwovLyBSZXR1cm5zOgovLyAgIC0gcXVvdGllbnQ6IHogY29udGFpbmluZyB4L3kKLy8gICAtIHJlbWFpbmRlcjogbSBjb250YWluaW5nIHgleQpmdW5jICh6ICpVaW50KSBEaXZNb2QoeCwgeSwgbSAqVWludCkgKCpVaW50LCAqVWludCkgewoJaWYgeS5Jc1plcm8oKSB7CgkJcGFuaWMoImRpdmlzaW9uIGJ5IHplcm8iKQoJfQoKCXN3aXRjaCB4LkNtcCh5KSB7CgljYXNlIC0xOgoJCS8vIHggPCB5CgkJcmV0dXJuIHouQ2xlYXIoKSwgbS5TZXQoeCkKCWNhc2UgMDoKCQkvLyB4ID09IHkKCQlyZXR1cm4gei5TZXRPbmUoKSwgbS5DbGVhcigpCgl9CgoJLy8gQXQgdGhpcyBwb2ludDoKCS8vIHggIT0gMAoJLy8geSAhPSAwCgkvLyB4ID4geQoKCS8vIFNob3J0Y3V0IHRyaXZpYWwgY2FzZQoJaWYgeC5Jc1VpbnQ2NCgpIHsKCQl4MCwgeTAgOj0geC5VaW50NjQoKSwgeS5VaW50NjQoKQoJCXJldHVybiB6LlNldFVpbnQ2NCh4MCAvIHkwKSwgbS5TZXRVaW50NjQoeDAgJSB5MCkKCX0KCgl2YXIgcXVvdCBVaW50CgkqbSA9IHVkaXZyZW0ocXVvdFs6XSwgeFs6XSwgeSkKCSp6ID0gcXVvdAoJcmV0dXJuIHosIG0KfQoKLy8gdWRpdnJlbSBkaXZpZGVzIHUgYnkgZCBhbmQgcHJvZHVjZXMgYm90aCBxdW90aWVudCBhbmQgcmVtYWluZGVyLgovLyBUaGUgcXVvdGllbnQgaXMgc3RvcmVkIGluIHByb3ZpZGVkIHF1b3QgLSBsZW4odSktbGVuKGQpKzEgd29yZHMuCi8vIEl0IGxvb3NlbHkgZm9sbG93cyB0aGUgS251dGgncyBkaXZpc2lvbiBhbGdvcml0aG0gKHNvbWV0aW1lcyByZWZlcmVuY2VkIGFzICJzY2hvb2xib29rIiBkaXZpc2lvbikgdXNpbmcgNjQtYml0IHdvcmRzLgovLyBTZWUgS251dGgsIFZvbHVtZSAyLCBzZWN0aW9uIDQuMy4xLCBBbGdvcml0aG0gRC4KZnVuYyB1ZGl2cmVtKHF1b3QsIHUgW111aW50NjQsIGQgKlVpbnQpIChyZW0gVWludCkgewoJdmFyIGRMZW4gaW50Cglmb3IgaSA6PSBsZW4oZCkgLSAxOyBpID49IDA7IGktLSB7CgkJaWYgZFtpXSAhPSAwIHsKCQkJZExlbiA9IGkgKyAxCgkJCWJyZWFrCgkJfQoJfQoKCXNoaWZ0IDo9IHVpbnQoYml0cy5MZWFkaW5nWmVyb3M2NChkW2RMZW4tMV0pKQoKCXZhciBkblN0b3JhZ2UgVWludAoJZG4gOj0gZG5TdG9yYWdlWzpkTGVuXQoJZm9yIGkgOj0gZExlbiAtIDE7IGkgPiAwOyBpLS0gewoJCWRuW2ldID0gKGRbaV0gPDwgc2hpZnQpIHwgKGRbaS0xXSA+PiAoNjQgLSBzaGlmdCkpCgl9CglkblswXSA9IGRbMF0gPDwgc2hpZnQKCgl2YXIgdUxlbiBpbnQKCWZvciBpIDo9IGxlbih1KSAtIDE7IGkgPj0gMDsgaS0tIHsKCQlpZiB1W2ldICE9IDAgewoJCQl1TGVuID0gaSArIDEKCQkJYnJlYWsKCQl9Cgl9CgoJaWYgdUxlbiA8IGRMZW4gewoJCWNvcHkocmVtWzpdLCB1KQoJCXJldHVybiByZW0KCX0KCgl2YXIgdW5TdG9yYWdlIFs5XXVpbnQ2NAoJdW4gOj0gdW5TdG9yYWdlWzp1TGVuKzFdCgl1blt1TGVuXSA9IHVbdUxlbi0xXSA+PiAoNjQgLSBzaGlmdCkKCWZvciBpIDo9IHVMZW4gLSAxOyBpID4gMDsgaS0tIHsKCQl1bltpXSA9ICh1W2ldIDw8IHNoaWZ0KSB8ICh1W2ktMV0gPj4gKDY0IC0gc2hpZnQpKQoJfQoJdW5bMF0gPSB1WzBdIDw8IHNoaWZ0CgoJaWYgZExlbiA9PSAxIHsKCQlyIDo9IHVkaXZyZW1CeTEocXVvdCwgdW4sIGRuWzBdKQoJCXJlbS5TZXRVaW50NjQociA+PiBzaGlmdCkKCQlyZXR1cm4gcmVtCgl9CgoJdWRpdnJlbUtudXRoKHF1b3QsIHVuLCBkbikKCglmb3IgaSA6PSAwOyBpIDwgZExlbi0xOyBpKysgewoJCXJlbVtpXSA9ICh1bltpXSA+PiBzaGlmdCkgfCAodW5baSsxXSA8PCAoNjQgLSBzaGlmdCkpCgl9CglyZW1bZExlbi0xXSA9IHVuW2RMZW4tMV0gPj4gc2hpZnQKCglyZXR1cm4gcmVtCn0KCi8vIHVtdWwgY29tcHV0ZXMgZnVsbCAyNTYgeCAyNTYgLT4gNTEyIG11bHRpcGxpY2F0aW9uLgpmdW5jIHVtdWwoeCwgeSAqVWludCkgWzhddWludDY0IHsKCXZhciByZXMgWzhddWludDY0CgoJdG9wWCA6PSBoaWdoZXN0Tm9uWmVyb1dvcmQoeCkKCXRvcFkgOj0gaGlnaGVzdE5vblplcm9Xb3JkKHkpCgoJaWYgdG9wWCA8IDAgfHwgdG9wWSA8IDAgewoJCXJldHVybiByZXMKCX0KCglsZW5YIDo9IHRvcFggKyAxCglsZW5ZIDo9IHRvcFkgKyAxCgoJZm9yIGkgOj0gMDsgaSA8IGxlblg7IGkrKyB7CgkJeGkgOj0geFtpXQoJCWlmIHhpID09IDAgewoJCQljb250aW51ZQoJCX0KCQl2YXIgY2FycnkgdWludDY0CgkJayA6PSBpCgkJZm9yIGogOj0gMDsgaiA8IGxlblk7IGorKyB7CgkJCWhpLCBsbyA6PSBiaXRzLk11bDY0KHhpLCB5W2pdKQoJCQlsbywgYyA6PSBiaXRzLkFkZDY0KGxvLCByZXNba10sIDApCgkJCWhpICs9IGMKCQkJbG8sIGMgPSBiaXRzLkFkZDY0KGxvLCBjYXJyeSwgMCkKCQkJaGkgKz0gYwoJCQlyZXNba10gPSBsbwoJCQljYXJyeSA9IGhpCgkJCWsrKwoJCX0KCQlyZXNbaStsZW5ZXSA9IGNhcnJ5Cgl9CgoJcmV0dXJuIHJlcwp9CgovLyBoaWdoZXN0Tm9uWmVyb1dvcmQgcmV0dXJucyB0aGUgaGlnaGVzdCBpbmRleCB3aXRoIG5vbi16ZXJvIHZhbHVlIG9yIC0xIGlmIHRoZSBVaW50IGlzIHplcm8uCmZ1bmMgaGlnaGVzdE5vblplcm9Xb3JkKHUgKlVpbnQpIGludCB7Cglmb3IgaSA6PSAzOyBpID49IDA7IGktLSB7CgkJaWYgdVtpXSAhPSAwIHsKCQkJcmV0dXJuIGkKCQl9Cgl9CglyZXR1cm4gLTEKfQoKLy8gdW11bFN0ZXAgY29tcHV0ZXMgKGhpICogMl42NCArIGxvKSA9IHogKyAoeCAqIHkpICsgY2FycnkuCmZ1bmMgdW11bFN0ZXAoeiwgeCwgeSwgY2FycnkgdWludDY0KSAoaGksIGxvIHVpbnQ2NCkgewoJaGksIGxvID0gYml0cy5NdWw2NCh4LCB5KQoJbG8sIGNhcnJ5ID0gYml0cy5BZGQ2NChsbywgY2FycnksIDApCgloaSArPSBjYXJyeQoJbG8sIGNhcnJ5ID0gYml0cy5BZGQ2NChsbywgeiwgMCkKCWhpICs9IGNhcnJ5CglyZXR1cm4gaGksIGxvCn0KCi8vIHVtdWxIb3AgY29tcHV0ZXMgKGhpICogMl42NCArIGxvKSA9IHogKyAoeCAqIHkpCmZ1bmMgdW11bEhvcCh6LCB4LCB5IHVpbnQ2NCkgKGhpLCBsbyB1aW50NjQpIHsKCWhpLCBsbyA9IGJpdHMuTXVsNjQoeCwgeSkKCWxvLCBjYXJyeSA6PSBiaXRzLkFkZDY0KGxvLCB6LCAwKQoJaGkgKz0gY2FycnkKCXJldHVybiBoaSwgbG8KfQoKLy8gdWRpdnJlbUJ5MSBkaXZpZGVzIHUgYnkgc2luZ2xlIG5vcm1hbGl6ZWQgd29yZCBkIGFuZCBwcm9kdWNlcyBib3RoIHF1b3RpZW50IGFuZCByZW1haW5kZXIuCi8vIFRoZSBxdW90aWVudCBpcyBzdG9yZWQgaW4gcHJvdmlkZWQgcXVvdC4KZnVuYyB1ZGl2cmVtQnkxKHF1b3QsIHUgW111aW50NjQsIGQgdWludDY0KSAocmVtIHVpbnQ2NCkgewoJcmVjaXByb2NhbCA6PSByZWNpcHJvY2FsMmJ5MShkKQoJcmVtID0gdVtsZW4odSktMV0gLy8gU2V0IHRoZSB0b3Agd29yZCBhcyByZW1haW5kZXIuCglmb3IgaiA6PSBsZW4odSkgLSAyOyBqID49IDA7IGotLSB7CgkJcXVvdFtqXSwgcmVtID0gdWRpdnJlbTJieTEocmVtLCB1W2pdLCBkLCByZWNpcHJvY2FsKQoJfQoJcmV0dXJuIHJlbQp9CgovLyB1ZGl2cmVtS251dGggaW1wbGVtZW50cyB0aGUgZGl2aXNpb24gb2YgdSBieSBub3JtYWxpemVkIG11bHRpcGxlIHdvcmQgZCBmcm9tIHRoZSBLbnV0aCdzIGRpdmlzaW9uIGFsZ29yaXRobS4KLy8gVGhlIHF1b3RpZW50IGlzIHN0b3JlZCBpbiBwcm92aWRlZCBxdW90IC0gbGVuKHUpLWxlbihkKSB3b3Jkcy4KLy8gVXBkYXRlcyB1IHRvIGNvbnRhaW4gdGhlIHJlbWFpbmRlciAtIGxlbihkKSB3b3Jkcy4KZnVuYyB1ZGl2cmVtS251dGgocXVvdCwgdSwgZCBbXXVpbnQ2NCkgewoJZExlbiA6PSBsZW4oZCkKCWRoIDo9IGRbZExlbi0xXQoJZGwgOj0gZFtkTGVuLTJdCglyZWNpcHJvY2FsIDo9IHJlY2lwcm9jYWwyYnkxKGRoKQoKCWZvciBqIDo9IGxlbih1KSAtIGRMZW4gLSAxOyBqID49IDA7IGotLSB7CgkJdTIgOj0gdVtqK2RMZW5dCgkJdTEgOj0gdVtqK2RMZW4tMV0KCQl1MCA6PSB1W2orZExlbi0yXQoKCQl2YXIgcWhhdCwgcmhhdCB1aW50NjQKCQlpZiB1MiA+PSBkaCB7IC8vIERpdmlzaW9uIG92ZXJmbG93cy4KCQkJcWhhdCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1IC8vIG1heCB1aW50NjQKCQkJLy8gTk9URTogQWRkICJxaGF0IG9uZSB0byBiaWciIGFkanVzdG1lbnQgKG5vdCBuZWVkZWQgZm9yIGNvcnJlY3RuZXNzLCBidXQgaGVscHMgYXZvaWRpbmcgImFkZCBiYWNrIiBjYXNlKS4KCQl9IGVsc2UgewoJCQlxaGF0LCByaGF0ID0gdWRpdnJlbTJieTEodTIsIHUxLCBkaCwgcmVjaXByb2NhbCkKCQkJcGgsIHBsIDo9IGJpdHMuTXVsNjQocWhhdCwgZGwpCgkJCWlmIHBoID4gcmhhdCB8fCAocGggPT0gcmhhdCAmJiBwbCA+IHUwKSB7CgkJCQlxaGF0LS0KCQkJCS8vIE5PVEU6IEFkZCAicWhhdCBvbmUgdG8gYmlnIiBhZGp1c3RtZW50IChub3QgbmVlZGVkIGZvciBjb3JyZWN0bmVzcywgYnV0IGhlbHBzIGF2b2lkaW5nICJhZGQgYmFjayIgY2FzZSkuCgkJCX0KCQl9CgoJCS8vIE11bHRpcGx5IGFuZCBzdWJ0cmFjdC4KCQlib3Jyb3cgOj0gc3ViTXVsVG8odVtqOl0sIGQsIHFoYXQpCgkJdVtqK2RMZW5dID0gdTIgLSBib3Jyb3cKCQlpZiB1MiA8IGJvcnJvdyB7IC8vIFRvbyBtdWNoIHN1YnRyYWN0ZWQsIGFkZCBiYWNrLgoJCQlxaGF0LS0KCQkJdVtqK2RMZW5dICs9IGFkZFRvKHVbajpdLCBkKQoJCX0KCgkJcXVvdFtqXSA9IHFoYXQgLy8gU3RvcmUgcXVvdGllbnQgZGlnaXQuCgl9Cn0KCi8vIGlzQml0U2V0IHJldHVybnMgdHJ1ZSBpZiBiaXQgbi10aCBpcyBzZXQsIHdoZXJlIG4gPSAwIGlzIExTQi4KLy8gVGhlIG4gbXVzdCBiZSA8PSAyNTUuCmZ1bmMgKHogKlVpbnQpIGlzQml0U2V0KG4gdWludCkgYm9vbCB7CglyZXR1cm4gKHpbbi82NF0gJiAoMSA8PCAobiAlIDY0KSkpICE9IDAKfQoKLy8gSXNPdmVyZmxvdyByZXBvcnRzIHdoZXRoZXIgdGhlIGhpZ2hlc3QgYml0IG9mIHogaXMgc2V0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gb3ZlcmZsb3c6IHRydWUgd2hlbiB6IGhhcyBiaXQgMjU1IHNldApmdW5jICh6ICpVaW50KSBJc092ZXJmbG93KCkgYm9vbCB7CglyZXR1cm4gei5pc0JpdFNldCgyNTUpCn0KCi8vIGFkZFRvIGNvbXB1dGVzIHggKz0geS4KLy8gUmVxdWlyZXMgbGVuKHgpID49IGxlbih5KS4KZnVuYyBhZGRUbyh4LCB5IFtddWludDY0KSB1aW50NjQgewoJdmFyIGNhcnJ5IHVpbnQ2NAoJZm9yIGkgOj0gMDsgaSA8IGxlbih5KTsgaSsrIHsKCQl4W2ldLCBjYXJyeSA9IGJpdHMuQWRkNjQoeFtpXSwgeVtpXSwgY2FycnkpCgl9CglyZXR1cm4gY2FycnkKfQoKLy8gc3ViTXVsVG8gY29tcHV0ZXMgeCAtPSB5ICogbXVsdGlwbGllci4KLy8gUmVxdWlyZXMgbGVuKHgpID49IGxlbih5KS4KZnVuYyBzdWJNdWxUbyh4LCB5IFtddWludDY0LCBtdWx0aXBsaWVyIHVpbnQ2NCkgdWludDY0IHsKCXZhciBib3Jyb3cgdWludDY0Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHkpOyBpKysgewoJCXMsIGNhcnJ5MSA6PSBiaXRzLlN1YjY0KHhbaV0sIGJvcnJvdywgMCkKCQlwaCwgcGwgOj0gYml0cy5NdWw2NCh5W2ldLCBtdWx0aXBsaWVyKQoJCXQsIGNhcnJ5MiA6PSBiaXRzLlN1YjY0KHMsIHBsLCAwKQoJCXhbaV0gPSB0CgkJYm9ycm93ID0gcGggKyBjYXJyeTEgKyBjYXJyeTIKCX0KCXJldHVybiBib3Jyb3cKfQoKLy8gcmVjaXByb2NhbDJieTEgY29tcHV0ZXMgPF5kLCBeMD4gLyBkLgpmdW5jIHJlY2lwcm9jYWwyYnkxKGQgdWludDY0KSB1aW50NjQgewoJcmVjaXByb2NhbCwgXyA6PSBiaXRzLkRpdjY0KF5kLCAxODQ0Njc0NDA3MzcwOTU1MTYxNSwgZCkKCXJldHVybiByZWNpcHJvY2FsCn0KCi8vIHVkaXZyZW0yYnkxIGRpdmlkZXMgPHVoLCB1bD4gLyBkIGFuZCBwcm9kdWNlcyBib3RoIHF1b3RpZW50IGFuZCByZW1haW5kZXIuCi8vIEl0IHVzZXMgdGhlIHByb3ZpZGVkIGQncyByZWNpcHJvY2FsLgovLyBJbXBsZW1lbnRhdGlvbiBwb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vY2hmYXN0L2ludHggYW5kIGlzIGJhc2VkIG9uCi8vICJJbXByb3ZlZCBkaXZpc2lvbiBieSBpbnZhcmlhbnQgaW50ZWdlcnMiLCBBbGdvcml0aG0gNC4KZnVuYyB1ZGl2cmVtMmJ5MSh1aCwgdWwsIGQsIHJlY2lwcm9jYWwgdWludDY0KSAocXVvdCwgcmVtIHVpbnQ2NCkgewoJcWgsIHFsIDo9IGJpdHMuTXVsNjQocmVjaXByb2NhbCwgdWgpCglxbCwgY2FycnkgOj0gYml0cy5BZGQ2NChxbCwgdWwsIDApCglxaCwgXyA9IGJpdHMuQWRkNjQocWgsIHVoLCBjYXJyeSkKCXFoKysKCglyIDo9IHVsIC0gcWgqZAoKCWlmIHIgPiBxbCB7CgkJcWgtLQoJCXIgKz0gZAoJfQoKCWlmIHIgPj0gZCB7CgkJcWgrKwoJCXIgLT0gZAoJfQoKCXJldHVybiBxaCwgcgp9Chr0MwoLYml0d2lzZS5nbm8S5DMvLyBiaXR3aXNlIGNvbnRhaW5zIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3IgVWludCBpbnN0YW5jZXMuCi8vIFRoaXMgZmlsZSBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gcGVyZm9ybSBiaXR3aXNlIEFORCwgT1IsIFhPUiwgYW5kIE5PVCBvcGVyYXRpb25zLCBhcyB3ZWxsIGFzIGJpdCBzaGlmdGluZy4KLy8gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgY3J1Y2lhbCBmb3IgbWFuaXB1bGF0aW5nIGluZGl2aWR1YWwgYml0cyB3aXRoaW4gYSAyNTYtYml0IHVuc2lnbmVkIGludGVnZXIuCnBhY2thZ2UgdWludDI1NgoKLy8gT3Igc2V0cyB6IHRvIHRoZSBiaXR3aXNlIE9SIG9mIHggYW5kIHkgYW5kIHJldHVybnMgei4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IEZpcnN0IDI1Ni1iaXQgb3BlcmFuZC4KLy8gICAtIHk6IFNlY29uZCAyNTYtYml0IG9wZXJhbmQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB6OiBUaGUgMjU2LWJpdCBiaXR3aXNlIE9SIHggfCB5LCBzdG9yZWQgaW4gdGhlIHJlY2VpdmVyLgpmdW5jICh6ICpVaW50KSBPcih4LCB5ICpVaW50KSAqVWludCB7Cgl6WzBdID0geFswXSB8IHlbMF0KCXpbMV0gPSB4WzFdIHwgeVsxXQoJelsyXSA9IHhbMl0gfCB5WzJdCgl6WzNdID0geFszXSB8IHlbM10KCXJldHVybiB6Cn0KCi8vIEFuZCBzZXRzIHogdG8gdGhlIGJpdHdpc2UgQU5EIG9mIHggYW5kIHkgYW5kIHJldHVybnMgei4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IEZpcnN0IDI1Ni1iaXQgb3BlcmFuZC4KLy8gICAtIHk6IFNlY29uZCAyNTYtYml0IG9wZXJhbmQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB6OiBUaGUgMjU2LWJpdCBiaXR3aXNlIEFORCB4ICYgeSwgc3RvcmVkIGluIHRoZSByZWNlaXZlci4KZnVuYyAoeiAqVWludCkgQW5kKHgsIHkgKlVpbnQpICpVaW50IHsKCXpbMF0gPSB4WzBdICYgeVswXQoJelsxXSA9IHhbMV0gJiB5WzFdCgl6WzJdID0geFsyXSAmIHlbMl0KCXpbM10gPSB4WzNdICYgeVszXQoJcmV0dXJuIHoKfQoKLy8gTm90IHNldHMgeiB0byB0aGUgYml0d2lzZSBjb21wbGVtZW50IG9mIHggYW5kIHJldHVybnMgei4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IDI1Ni1iaXQgb3BlcmFuZCB3aG9zZSBiaXRzIGFyZSBjb21wbGVtZW50ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB6OiBUaGUgMjU2LWJpdCBiaXR3aXNlIGNvbXBsZW1lbnQgXngsIHN0b3JlZCBpbiB0aGUgcmVjZWl2ZXIuCmZ1bmMgKHogKlVpbnQpIE5vdCh4ICpVaW50KSAqVWludCB7Cgl6WzNdLCB6WzJdLCB6WzFdLCB6WzBdID0gXnhbM10sIF54WzJdLCBeeFsxXSwgXnhbMF0KCXJldHVybiB6Cn0KCi8vIEFuZE5vdCBzZXRzIHogdG8geCBBTkQgTk9UIHkgYW5kIHJldHVybnMgei4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IEZpcnN0IDI1Ni1iaXQgb3BlcmFuZC4KLy8gICAtIHk6IE9wZXJhbmQgd2hvc2UgYml0cyBhcmUgY2xlYXJlZCBmcm9tIHguCi8vCi8vIFJldHVybnM6Ci8vICAgLSB6OiBUaGUgMjU2LWJpdCBiaXQgcGF0dGVybiB4ICZeIHksIHN0b3JlZCBpbiB0aGUgcmVjZWl2ZXIuCmZ1bmMgKHogKlVpbnQpIEFuZE5vdCh4LCB5ICpVaW50KSAqVWludCB7Cgl6WzBdID0geFswXSAmXiB5WzBdCgl6WzFdID0geFsxXSAmXiB5WzFdCgl6WzJdID0geFsyXSAmXiB5WzJdCgl6WzNdID0geFszXSAmXiB5WzNdCglyZXR1cm4gegp9CgovLyBYb3Igc2V0cyB6IHRvIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBPUiBvZiB4IGFuZCB5IGFuZCByZXR1cm5zIHouCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiBGaXJzdCAyNTYtYml0IG9wZXJhbmQuCi8vICAgLSB5OiBTZWNvbmQgMjU2LWJpdCBvcGVyYW5kLgovLwovLyBSZXR1cm5zOgovLyAgIC0gejogVGhlIDI1Ni1iaXQgYml0d2lzZSBleGNsdXNpdmUgT1IgeCBeIHksIHN0b3JlZCBpbiB0aGUgcmVjZWl2ZXIuCmZ1bmMgKHogKlVpbnQpIFhvcih4LCB5ICpVaW50KSAqVWludCB7Cgl6WzBdID0geFswXSBeIHlbMF0KCXpbMV0gPSB4WzFdIF4geVsxXQoJelsyXSA9IHhbMl0gXiB5WzJdCgl6WzNdID0geFszXSBeIHlbM10KCXJldHVybiB6Cn0KCi8vIExzaCBzZXRzIHogdG8geCBsZWZ0LXNoaWZ0ZWQgYnkgbiBiaXRzIGFuZCByZXR1cm5zIHouCi8vIEJpdHMgc2hpZnRlZCBiZXlvbmQgdGhlIDI1Ni1iaXQgd2lkdGggYXJlIGRpc2NhcmRlZDsgbiA+PSAyNTYgcHJvZHVjZXMgemVyby4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IDI1Ni1iaXQgb3BlcmFuZCB0byBzaGlmdC4KLy8gICAtIG46IE51bWJlciBvZiBiaXQgcG9zaXRpb25zIHRvIHNoaWZ0IGxlZnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB6OiBUaGUgbG93IDI1NiBiaXRzIG9mIHggPDwgbiwgc3RvcmVkIGluIHRoZSByZWNlaXZlci4KZnVuYyAoeiAqVWludCkgTHNoKHggKlVpbnQsIG4gdWludCkgKlVpbnQgewoJaWYgeC5Jc1plcm8oKSB7CgkJcmV0dXJuIHouQ2xlYXIoKQoJfQoKCWlmIG4gPT0gMCB7CgkJcmV0dXJuIHouU2V0KHgpCgl9CgoJcmV0dXJuIHoubHNoKHgsIG4pCn0KCi8vIGxzaCBwZXJmb3JtcyBsZWZ0IHNoaWZ0IHdpdGhvdXQgb3ZlcmZsb3cgY2hlY2tpbmcKZnVuYyAoeiAqVWludCkgbHNoKHggKlVpbnQsIG4gdWludCkgKlVpbnQgewoJLy8gbiAlIDY0ID09IDAKCWlmIG4mMHgzZiA9PSAwIHsKCQlzd2l0Y2ggbiB7CgkJY2FzZSAwOgoJCQlyZXR1cm4gei5TZXQoeCkKCQljYXNlIDY0OgoJCQlyZXR1cm4gei5sc2g2NCh4KQoJCWNhc2UgMTI4OgoJCQlyZXR1cm4gei5sc2gxMjgoeCkKCQljYXNlIDE5MjoKCQkJcmV0dXJuIHoubHNoMTkyKHgpCgkJZGVmYXVsdDoKCQkJcmV0dXJuIHouQ2xlYXIoKQoJCX0KCX0KCXZhciBhLCBiIHVpbnQ2NAoJLy8gQmlnIHN3YXBzIGZpcnN0Cglzd2l0Y2ggewoJY2FzZSBuID4gMTkyOgoJCXoubHNoMTkyKHgpCgkJbiAtPSAxOTIKCQlnb3RvIHNoMTkyCgljYXNlIG4gPiAxMjg6CgkJei5sc2gxMjgoeCkKCQluIC09IDEyOAoJCWdvdG8gc2gxMjgKCWNhc2UgbiA+IDY0OgoJCXoubHNoNjQoeCkKCQluIC09IDY0CgkJZ290byBzaDY0CglkZWZhdWx0OgoJCXouU2V0KHgpCgl9CgoJLy8gcmVtYWluaW5nIHNoaWZ0cwoJYSA9IHpbMF0gPj4gKDY0IC0gbikKCXpbMF0gPSB6WzBdIDw8IG4KCnNoNjQ6CgliID0gelsxXSA+PiAoNjQgLSBuKQoJelsxXSA9ICh6WzFdIDw8IG4pIHwgYQoKc2gxMjg6CglhID0gelsyXSA+PiAoNjQgLSBuKQoJelsyXSA9ICh6WzJdIDw8IG4pIHwgYgoKc2gxOTI6Cgl6WzNdID0gKHpbM10gPDwgbikgfCBhCgoJcmV0dXJuIHoKfQoKLy8gUnNoIHNldHMgeiB0byB4IGxvZ2ljYWxseSByaWdodC1zaGlmdGVkIGJ5IG4gYml0cyBhbmQgcmV0dXJucyB6LgovLyBaZXJvIGJpdHMgYXJlIHNoaWZ0ZWQgaW4gZnJvbSB0aGUgbGVmdCwgYW5kIG4gPj0gMjU2IHByb2R1Y2VzIHplcm8uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiAyNTYtYml0IG9wZXJhbmQgdG8gc2hpZnQuCi8vICAgLSBuOiBOdW1iZXIgb2YgYml0IHBvc2l0aW9ucyB0byBzaGlmdCByaWdodC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHo6IFRoZSAyNTYtYml0IGxvZ2ljYWwgcmlnaHQgc2hpZnQgeCA+PiBuLCBzdG9yZWQgaW4gdGhlIHJlY2VpdmVyLgpmdW5jICh6ICpVaW50KSBSc2goeCAqVWludCwgbiB1aW50KSAqVWludCB7CgkvLyBuICUgNjQgPT0gMAoJaWYgbiYweDNmID09IDAgewoJCXN3aXRjaCBuIHsKCQljYXNlIDA6CgkJCXJldHVybiB6LlNldCh4KQoJCWNhc2UgNjQ6CgkJCXJldHVybiB6LnJzaDY0KHgpCgkJY2FzZSAxMjg6CgkJCXJldHVybiB6LnJzaDEyOCh4KQoJCWNhc2UgMTkyOgoJCQlyZXR1cm4gei5yc2gxOTIoeCkKCQlkZWZhdWx0OgoJCQlyZXR1cm4gei5DbGVhcigpCgkJfQoJfQoJdmFyIGEsIGIgdWludDY0CgkvLyBCaWcgc3dhcHMgZmlyc3QKCXN3aXRjaCB7CgljYXNlIG4gPiAxOTI6CgkJaWYgbiA+IDI1NiB7CgkJCXJldHVybiB6LkNsZWFyKCkKCQl9CgkJei5yc2gxOTIoeCkKCQluIC09IDE5MgoJCWdvdG8gc2gxOTIKCWNhc2UgbiA+IDEyODoKCQl6LnJzaDEyOCh4KQoJCW4gLT0gMTI4CgkJZ290byBzaDEyOAoJY2FzZSBuID4gNjQ6CgkJei5yc2g2NCh4KQoJCW4gLT0gNjQKCQlnb3RvIHNoNjQKCWRlZmF1bHQ6CgkJei5TZXQoeCkKCX0KCgkvLyByZW1haW5pbmcgc2hpZnRzCglhID0gelszXSA8PCAoNjQgLSBuKQoJelszXSA9IHpbM10gPj4gbgoKc2g2NDoKCWIgPSB6WzJdIDw8ICg2NCAtIG4pCgl6WzJdID0gKHpbMl0gPj4gbikgfCBhCgpzaDEyODoKCWEgPSB6WzFdIDw8ICg2NCAtIG4pCgl6WzFdID0gKHpbMV0gPj4gbikgfCBiCgpzaDE5MjoKCXpbMF0gPSAoelswXSA+PiBuKSB8IGEKCglyZXR1cm4gegp9CgovLyBTUnNoIHNldHMgeiB0byB4IGFyaXRobWV0aWNhbGx5IHJpZ2h0LXNoaWZ0ZWQgYnkgbiBiaXRzIGFuZCByZXR1cm5zIHouCi8vIFRoZSB0b3AgYml0IGlzIHRyZWF0ZWQgYXMgYSBzaWduIGJpdDogbmVnYXRpdmUgcGF0dGVybnMgcmVjZWl2ZSBvbmUtZmlsbCwKLy8gd2hpbGUgbm9uLW5lZ2F0aXZlIHBhdHRlcm5zIHVzZSB0aGUgbG9naWNhbCByaWdodCBzaGlmdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IDI1Ni1iaXQgdHdvJ3MtY29tcGxlbWVudCBiaXQgcGF0dGVybiB0byBzaGlmdC4KLy8gICAtIG46IE51bWJlciBvZiBiaXQgcG9zaXRpb25zIHRvIHNoaWZ0IHJpZ2h0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gejogVGhlIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb2YgeCwgc3RvcmVkIGluIHRoZSByZWNlaXZlcjsgbiA+PSAyNTYKLy8gICAgIHlpZWxkcyBhbGwgb25lcyBmb3IgYSBuZWdhdGl2ZSB4IGFuZCB6ZXJvIG90aGVyd2lzZS4KZnVuYyAoeiAqVWludCkgU1JzaCh4ICpVaW50LCBuIHVpbnQpICpVaW50IHsKCS8vIElmIHRoZSBNU0IgaXMgMCwgU1JzaCBpcyBzYW1lIGFzIFJzaC4KCWlmICF4LmlzQml0U2V0KDI1NSkgewoJCXJldHVybiB6LlJzaCh4LCBuKQoJfQoJaWYgbiU2NCA9PSAwIHsKCQlzd2l0Y2ggbiB7CgkJY2FzZSAwOgoJCQlyZXR1cm4gei5TZXQoeCkKCQljYXNlIDY0OgoJCQlyZXR1cm4gei5zcnNoNjQoeCkKCQljYXNlIDEyODoKCQkJcmV0dXJuIHouc3JzaDEyOCh4KQoJCWNhc2UgMTkyOgoJCQlyZXR1cm4gei5zcnNoMTkyKHgpCgkJZGVmYXVsdDoKCQkJcmV0dXJuIHouU2V0QWxsT25lKCkKCQl9Cgl9Cgl2YXIgYSB1aW50NjQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNSA8PCAoNjQgLSBuJTY0KQoJLy8gQmlnIHN3YXBzIGZpcnN0Cglzd2l0Y2ggewoJY2FzZSBuID4gMTkyOgoJCWlmIG4gPiAyNTYgewoJCQlyZXR1cm4gei5TZXRBbGxPbmUoKQoJCX0KCQl6LnNyc2gxOTIoeCkKCQluIC09IDE5MgoJCWdvdG8gc2gxOTIKCWNhc2UgbiA+IDEyODoKCQl6LnNyc2gxMjgoeCkKCQluIC09IDEyOAoJCWdvdG8gc2gxMjgKCWNhc2UgbiA+IDY0OgoJCXouc3JzaDY0KHgpCgkJbiAtPSA2NAoJCWdvdG8gc2g2NAoJZGVmYXVsdDoKCQl6LlNldCh4KQoJfQoKCS8vIHJlbWFpbmluZyBzaGlmdHMKCXpbM10sIGEgPSAoelszXT4+bil8YSwgelszXTw8KDY0LW4pCgpzaDY0OgoJelsyXSwgYSA9ICh6WzJdPj5uKXxhLCB6WzJdPDwoNjQtbikKCnNoMTI4OgoJelsxXSwgYSA9ICh6WzFdPj5uKXxhLCB6WzFdPDwoNjQtbikKCnNoMTkyOgoJelswXSA9ICh6WzBdID4+IG4pIHwgYQoKCXJldHVybiB6Cn0KCmZ1bmMgKHogKlVpbnQpIGxzaDY0KHggKlVpbnQpICpVaW50IHsKCXpbM10sIHpbMl0sIHpbMV0sIHpbMF0gPSB4WzJdLCB4WzFdLCB4WzBdLCAwCglyZXR1cm4gegp9CgpmdW5jICh6ICpVaW50KSBsc2gxMjgoeCAqVWludCkgKlVpbnQgewoJelszXSwgelsyXSwgelsxXSwgelswXSA9IHhbMV0sIHhbMF0sIDAsIDAKCXJldHVybiB6Cn0KCmZ1bmMgKHogKlVpbnQpIGxzaDE5Mih4ICpVaW50KSAqVWludCB7Cgl6WzNdLCB6WzJdLCB6WzFdLCB6WzBdID0geFswXSwgMCwgMCwgMAoJcmV0dXJuIHoKfQoKZnVuYyAoeiAqVWludCkgcnNoNjQoeCAqVWludCkgKlVpbnQgewoJelszXSwgelsyXSwgelsxXSwgelswXSA9IDAsIHhbM10sIHhbMl0sIHhbMV0KCXJldHVybiB6Cn0KCmZ1bmMgKHogKlVpbnQpIHJzaDEyOCh4ICpVaW50KSAqVWludCB7Cgl6WzNdLCB6WzJdLCB6WzFdLCB6WzBdID0gMCwgMCwgeFszXSwgeFsyXQoJcmV0dXJuIHoKfQoKZnVuYyAoeiAqVWludCkgcnNoMTkyKHggKlVpbnQpICpVaW50IHsKCXpbM10sIHpbMl0sIHpbMV0sIHpbMF0gPSAwLCAwLCAwLCB4WzNdCglyZXR1cm4gegp9CgpmdW5jICh6ICpVaW50KSBzcnNoNjQoeCAqVWludCkgKlVpbnQgewoJelszXSwgelsyXSwgelsxXSwgelswXSA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1LCB4WzNdLCB4WzJdLCB4WzFdCglyZXR1cm4gegp9CgpmdW5jICh6ICpVaW50KSBzcnNoMTI4KHggKlVpbnQpICpVaW50IHsKCXpbM10sIHpbMl0sIHpbMV0sIHpbMF0gPSAxODQ0Njc0NDA3MzcwOTU1MTYxNSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUsIHhbM10sIHhbMl0KCXJldHVybiB6Cn0KCmZ1bmMgKHogKlVpbnQpIHNyc2gxOTIoeCAqVWludCkgKlVpbnQgewoJelszXSwgelsyXSwgelsxXSwgelswXSA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1LCAxODQ0Njc0NDA3MzcwOTU1MTYxNSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUsIHhbM10KCXJldHVybiB6Cn0KGqEXCgdjbXAuZ25vEpUXLy8gY21wIChvciwgY29tcGFyaXNvbnMpIGluY2x1ZGVzIG1ldGhvZHMgZm9yIGNvbXBhcmluZyBVaW50IGluc3RhbmNlcy4KLy8gVGhlc2UgY29tcGFyaXNvbiBmdW5jdGlvbnMgY292ZXIgYSByYW5nZSBvZiBvcGVyYXRpb25zIGluY2x1ZGluZyBlcXVhbGl0eSBjaGVja3MsIGxlc3MgdGhhbi9ncmVhdGVyIHRoYW4KLy8gZXZhbHVhdGlvbnMsIGFuZCBzcGVjaWFsaXplZCBjb21wYXJpc29ucyBzdWNoIGFzIHNpZ25lZCBncmVhdGVyIHRoYW4uIFRoZXNlIGFyZSBmdW5kYW1lbnRhbCBmb3IgbG9naWNhbAovLyBkZWNpc2lvbiBtYWtpbmcgYmFzZWQgb24gVWludCB2YWx1ZXMuCnBhY2thZ2UgdWludDI1NgoKaW1wb3J0ICJtYXRoL2JpdHMiCgovLyBDbXAgY29tcGFyZXMgeiBhbmQgeCBhbmQgcmV0dXJucyAtMSBpZiB6IDwgeCwgMCBpZiB6ID09IHgsIG9yICsxIGlmIHogPiB4LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0geDogdGhlIFVpbnQgdmFsdWUgY29tcGFyZWQgd2l0aCB6Ci8vCi8vIFJldHVybnM6Ci8vICAgLSByOiAtMSB3aGVuIHo8eCwgMCB3aGVuIHo9PXgsIG9yICsxIHdoZW4gej54CmZ1bmMgKHogKlVpbnQpIENtcCh4ICpVaW50KSAociBpbnQpIHsKCS8vIHogPCB4IDw9PiB6IC0geCA8IDAgaS5lLiB3aGVuIHN1YnRyYWN0aW9uIG92ZXJmbG93cy4KCWQwLCBjYXJyeSA6PSBiaXRzLlN1YjY0KHpbMF0sIHhbMF0sIDApCglkMSwgY2FycnkgOj0gYml0cy5TdWI2NCh6WzFdLCB4WzFdLCBjYXJyeSkKCWQyLCBjYXJyeSA6PSBiaXRzLlN1YjY0KHpbMl0sIHhbMl0sIGNhcnJ5KQoJZDMsIGNhcnJ5IDo9IGJpdHMuU3ViNjQoelszXSwgeFszXSwgY2FycnkpCglpZiBjYXJyeSA9PSAxIHsKCQlyZXR1cm4gLTEKCX0KCWlmIGQwfGQxfGQyfGQzID09IDAgewoJCXJldHVybiAwCgl9CglyZXR1cm4gMQp9CgovLyBJc1plcm8gcmV0dXJucyB0cnVlIGlmIHogZXF1YWxzIDAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpc1plcm86IHRydWUgd2hlbiBhbGwgZm91ciB3b3JkcyBvZiB6IGFyZSB6ZXJvCmZ1bmMgKHogKlVpbnQpIElzWmVybygpIGJvb2wgewoJcmV0dXJuICh6WzBdIHwgelsxXSB8IHpbMl0gfCB6WzNdKSA9PSAwCn0KCi8vIFNpZ24gcmV0dXJucyB0aGUgc2lnbiBvZiB6IGludGVycHJldGVkIGFzIGEgdHdvJ3MgY29tcGxlbWVudCBzaWduZWQgbnVtYmVyLgovLyBJdCByZXR1cm5zIC0xIGlmIHogPCAwLCAwIGlmIHogPT0gMCwgb3IgKzEgaWYgeiA+IDAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzaWduOiAtMSwgMCwgb3IgKzEgYWNjb3JkaW5nIHRvIHogaW50ZXJwcmV0ZWQgYXMgYSB0d28ncy1jb21wbGVtZW50IHNpZ25lZCB2YWx1ZQpmdW5jICh6ICpVaW50KSBTaWduKCkgaW50IHsKCWlmIHouSXNaZXJvKCkgewoJCXJldHVybiAwCgl9CglpZiB6WzNdIDwgMHg4MDAwMDAwMDAwMDAwMDAwIHsKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIC0xCn0KCi8vIEx0IHJldHVybnMgdHJ1ZSBpZiB6IGlzIGxlc3MgdGhhbiB4LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0geDogdGhlIGNvbXBhcmlzb24gb3BlcmFuZAovLwovLyBSZXR1cm5zOgovLyAgIC0gbGVzczogdHJ1ZSB3aGVuIHo8eApmdW5jICh6ICpVaW50KSBMdCh4ICpVaW50KSBib29sIHsKCS8vIHogPCB4IDw9PiB6IC0geCA8IDAgaS5lLiB3aGVuIHN1YnRyYWN0aW9uIG92ZXJmbG93cy4KCV8sIGNhcnJ5IDo9IGJpdHMuU3ViNjQoelswXSwgeFswXSwgMCkKCV8sIGNhcnJ5ID0gYml0cy5TdWI2NCh6WzFdLCB4WzFdLCBjYXJyeSkKCV8sIGNhcnJ5ID0gYml0cy5TdWI2NCh6WzJdLCB4WzJdLCBjYXJyeSkKCV8sIGNhcnJ5ID0gYml0cy5TdWI2NCh6WzNdLCB4WzNdLCBjYXJyeSkKCglyZXR1cm4gY2FycnkgIT0gMAp9CgovLyBHdCByZXR1cm5zIHRydWUgaWYgeiBpcyBncmVhdGVyIHRoYW4geC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBjb21wYXJpc29uIG9wZXJhbmQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGdyZWF0ZXI6IHRydWUgd2hlbiB6PngKZnVuYyAoeiAqVWludCkgR3QoeCAqVWludCkgYm9vbCB7CglyZXR1cm4geC5MdCh6KQp9CgovLyBMdGUgcmV0dXJucyB0cnVlIGlmIHogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiB0aGUgY29tcGFyaXNvbiBvcGVyYW5kCi8vCi8vIFJldHVybnM6Ci8vICAgLSBsZXNzT3JFcXVhbDogdHJ1ZSB3aGVuIHo8PXgKZnVuYyAoeiAqVWludCkgTHRlKHggKlVpbnQpIGJvb2wgewoJcmV0dXJuICF4Lkx0KHopCn0KCi8vIEd0ZSByZXR1cm5zIHRydWUgaWYgeiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8geC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSBjb21wYXJpc29uIG9wZXJhbmQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGdyZWF0ZXJPckVxdWFsOiB0cnVlIHdoZW4gej49eApmdW5jICh6ICpVaW50KSBHdGUoeCAqVWludCkgYm9vbCB7CglyZXR1cm4gIXouTHQoeCkKfQoKLy8gRXEgcmV0dXJucyB0cnVlIGlmIHogZXF1YWxzIHguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiB0aGUgY29tcGFyaXNvbiBvcGVyYW5kCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcXVhbDogdHJ1ZSB3aGVuIHogYW5kIHggaGF2ZSBpZGVudGljYWwgMjU2LWJpdCB2YWx1ZXMKZnVuYyAoeiAqVWludCkgRXEoeCAqVWludCkgYm9vbCB7CglyZXR1cm4gKHpbMF0gPT0geFswXSkgJiYgKHpbMV0gPT0geFsxXSkgJiYgKHpbMl0gPT0geFsyXSkgJiYgKHpbM10gPT0geFszXSkKfQoKLy8gTmVxIHJldHVybnMgdHJ1ZSBpZiB6IGRvZXMgbm90IGVxdWFsIHguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiB0aGUgY29tcGFyaXNvbiBvcGVyYW5kCi8vCi8vIFJldHVybnM6Ci8vICAgLSBub3RFcXVhbDogdHJ1ZSB3aGVuIHogYW5kIHggZGlmZmVyCmZ1bmMgKHogKlVpbnQpIE5lcSh4ICpVaW50KSBib29sIHsKCXJldHVybiAhei5FcSh4KQp9ChqEwgEKDmNvbnZlcnNpb24uZ25vEvDBAS8vIGNvbnZlcnNpb25zIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgVWludCBpbnN0YW5jZXMgdG8gb3RoZXIgdHlwZXMgYW5kIHZpY2UgdmVyc2EuCi8vIFRoaXMgaW5jbHVkZXMgY29udmVyc2lvbnMgdG8gYW5kIGZyb20gYmFzaWMgdHlwZXMgc3VjaCBhcyB1aW50NjQgYW5kIGludDMyLCBhcyB3ZWxsIGFzIHN0cmluZyByZXByZXNlbnRhdGlvbnMKLy8gYW5kIGJ5dGUgc2xpY2VzLiBBZGRpdGlvbmFsbHksIGl0IGNvdmVycyBtYXJzaGFsaW5nIGFuZCB1bm1hcnNoYWxpbmcgZm9yIEpTT04gYW5kIG90aGVyIHRleHQgZm9ybWF0cy4KcGFja2FnZSB1aW50MjU2CgppbXBvcnQgKAoJImVuY29kaW5nL2JpbmFyeSIKCSJzdHJjb252IgopCgovLyBVaW50NjQgcmV0dXJucyB0aGUgbG93ZXIgNjQgYml0cyBvZiB6IGFzIGEgdWludDY0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gdmFsdWU6IHRoZSBsb3cgNjQgYml0cyBvZiB6CmZ1bmMgKHogKlVpbnQpIFVpbnQ2NCgpIHVpbnQ2NCB7CglyZXR1cm4gelswXQp9CgovLyBJbnQ2NCByZXR1cm5zIHRoZSBsb3dlciA2NCBiaXRzIG9mIHogYXMgYW4gaW50NjQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB2YWx1ZTogdGhlIGxvdyA2NCBiaXRzIG9mIHogaW50ZXJwcmV0ZWQgYXMgaW50NjQKZnVuYyAoeiAqVWludCkgSW50NjQoKSBpbnQ2NCB7CglyZXR1cm4gaW50NjQoei5VaW50NjQoKSkKfQoKLy8gVWludDY0V2l0aE92ZXJmbG93IHJldHVybnMgdGhlIGxvd2VyIDY0IGJpdHMgb2YgeiBhbmQgdHJ1ZSBpZiBvdmVyZmxvdyBvY2N1cnJlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHZhbHVlOiB0aGUgbG93IDY0IGJpdHMgb2YgegovLyAgIC0gb3ZlcmZsb3c6IHRydWUgd2hlbiBhbnkgdXBwZXIgMTkyIGJpdHMgYXJlIG5vbi16ZXJvCmZ1bmMgKHogKlVpbnQpIFVpbnQ2NFdpdGhPdmVyZmxvdygpICh1aW50NjQsIGJvb2wpIHsKCXJldHVybiB6WzBdLCAoelsxXSB8IHpbMl0gfCB6WzNdKSAhPSAwCn0KCi8vIFNldFVpbnQ2NCBzZXRzIHogdG8gdGhlIHZhbHVlIG9mIHggYW5kIHJldHVybnMgei4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IHRoZSB1aW50NjQgdmFsdWUgYXNzaWduZWQgdG8gegovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIHNldHRpbmcgaXQgdG8geApmdW5jICh6ICpVaW50KSBTZXRVaW50NjQoeCB1aW50NjQpICpVaW50IHsKCXpbM10sIHpbMl0sIHpbMV0sIHpbMF0gPSAwLCAwLCAwLCB4CglyZXR1cm4gegp9CgovLyBJc1VpbnQ2NCByZXBvcnRzIHdoZXRoZXIgeiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSB1aW50NjQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmaXRzOiB0cnVlIHdoZW4geiBpcyByZXByZXNlbnRhYmxlIGluIDY0IGJpdHMKZnVuYyAoeiAqVWludCkgSXNVaW50NjQoKSBib29sIHsKCXJldHVybiAoelsxXSB8IHpbMl0gfCB6WzNdKSA9PSAwCn0KCi8vIERlYyByZXR1cm5zIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHouCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZWNpbWFsOiB0aGUgYmFzZS0xMCByZXByZXNlbnRhdGlvbiBvZiB6CmZ1bmMgKHogKlVpbnQpIERlYygpIHN0cmluZyB7CglpZiB6LklzWmVybygpIHsKCQlyZXR1cm4gIjAiCgl9CglpZiB6LklzVWludDY0KCkgewoJCXJldHVybiBzdHJjb252LkZvcm1hdFVpbnQoei5VaW50NjQoKSwgMTApCgl9CgoJLy8gVGhlIG1heCB1aW50NjQgdmFsdWUgYmVpbmcgMTg0NDY3NDQwNzM3MDk1NTE2MTUsIHRoZSBsYXJnZXN0CgkvLyBwb3dlci1vZi10ZW4gYmVsb3cgdGhhdCBpcyAxMDAwMDAwMDAwMDAwMDAwMDAwMC4KCS8vIFdoZW4gd2UgZG8gYSBEaXZNb2QgdXNpbmcgdGhhdCBudW1iZXIsIHRoZSByZW1haW5kZXIgdGhhdCB3ZQoJLy8gZ2V0IGJhY2sgaXMgdGhlIGxvd2VyIHBhcnQgb2YgdGhlIG91dHB1dC4KCS8vCgkvLyBUaGUgYXNjaWktb3V0cHV0IG9mIHJlbWFpbmRlciB3aWxsIG5ldmVyIGV4Y2VlZCAxOSBieXRlcyAoc2luY2UgaXQgd2lsbCBiZQoJLy8gYmVsb3cgMTAwMDAwMDAwMDAwMDAwMDAwMDApLgoJLy8KCS8vIEFsZ29yaXRobSBleGFtcGxlIHVzaW5nIDEwMCBhcyBkaXZpc29yCgkvLwoJLy8gMTIzNDUgJSAxMDAgPSA0NSAgIChyZW0pCgkvLyAxMjM0NSAvIDEwMCA9IDEyMyAgKHF1bykKCS8vIC0+IG91dHB1dCAnNDUnLCBjb250aW51ZSBpdGVyYXRlIG9uIDEyMwoJdmFyICgKCQkvLyBvdXQgaXMgOTggYnl0ZXMgbG9uZzogNzggKG1heCBzaXplIG9mIGEgc3RyaW5nIHdpdGhvdXQgbGVhZGluZyB6ZXJvZXMsCgkJLy8gcGx1cyBzbGFjayBzbyB3ZSBjYW4gY29weSAxOSBieXRlcyBldmVyeSBpdGVyYXRpb24pLgoJCS8vIFdlIGluaXQgaXQgd2l0aCB6ZXJvZXMsIGJlY2F1c2Ugd2hlbiBzdHJjb252IGFwcGVuZHMgdGhlIGFzY2lpIHJlcHJlc2VudGF0aW9ucywKCQkvLyBpdCB3aWxsIG9taXQgbGVhZGluZyB6ZXJvZXMuCgkJb3V0ICAgICAgWzk4XWJ5dGUKCQlkaXZpc29yICBVaW50CgkJeSAgICAgICAgPSAqeiAgICAgICAgICAgICAgICAgLy8gY29weSB6IHRvIGF2b2lkIG1vZGlmeWluZyBpdAoJCXBvcyAgICAgID0gbGVuKG91dCkgICAgICAgICAgIC8vIHBvc2l0aW9uIHRvIHdyaXRlIHRvCgkJYnVmICAgICAgWzE5XWJ5dGUgICAgICAgICAgICAgLy8gYnVmZmVyIHRvIHdyaXRlIHVpbnQ2NDpzIHRvCgkJYnVmU2xpY2UgW11ieXRlICAgICA9IGJ1Zls6MF0gLy8gc2xpY2UgZm9yIHN0cmNvbnYuQXBwZW5kVWludAoJKQoKCS8vIEluaXRpYWxpemUgb3V0IGFycmF5IHdpdGggJzAncwoJZm9yIGkgOj0gcmFuZ2Ugb3V0IHsKCQlvdXRbaV0gPSAnMCcKCX0KCgkvLyBTZXQgZGl2aXNvciB0byAxMF4xOQoJZGl2aXNvci5TZXRVaW50NjQoMTAwMDAwMDAwMDAwMDAwMDAwMDApCgoJZm9yIHsKCQkvLyBPYnRhaW4gUSBhbmQgUiBmb3IgZGl2aXNvcgoJCXZhciBxdW90IFVpbnQKCQlyZW0gOj0gdWRpdnJlbShxdW90WzpdLCB5WzpdLCAmZGl2aXNvcikKCQl5ID0gcXVvdCAvLyBTZXQgUSBmb3IgbmV4dCBsb29wCgkJLy8gQ29udmVydCB0aGUgUiB0byBhc2NpaSByZXByZXNlbnRhdGlvbgoJCWJ1ZlNsaWNlID0gc3RyY29udi5BcHBlbmRVaW50KGJ1ZlNsaWNlWzowXSwgcmVtLlVpbnQ2NCgpLCAxMCkKCQkvLyBDb3B5IGluIHRoZSBhc2NpaSBkaWdpdHMKCQljb3B5KG91dFtwb3MtbGVuKGJ1ZlNsaWNlKTpdLCBidWZTbGljZSkKCQlpZiB5LklzWmVybygpIHsKCQkJYnJlYWsKCQl9CgkJLy8gTW92ZSAxOSBkaWdpdHMgbGVmdAoJCXBvcyAtPSAxOQoJfQoJLy8gc2tpcCBsZWFkaW5nIHplcm9lcyBieSBvbmx5IHVzaW5nIHRoZSAndXNlZCBzaXplJyBvZiBidWZTbGljZQoJcmV0dXJuIHN0cmluZyhvdXRbcG9zLWxlbihidWZTbGljZSk6XSkKfQoKLy8gVG9TdHJpbmcgcmV0dXJucyB0aGUgZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygei4KLy8gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgeiBpcyBuaWwuIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhpc3QgaW4gaG9saW1hbidzIHVpbnQyNTYuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZWNpbWFsOiB6IGluIGJhc2UgMTAsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHogaXMgbmlsCmZ1bmMgKHogKlVpbnQpIFRvU3RyaW5nKCkgc3RyaW5nIHsKCWlmIHogPT0gbmlsIHsKCQlyZXR1cm4gIiIKCX0KCglyZXR1cm4gei5EZWMoKQp9CgovLyBTZXRCeXRlcyBpbnRlcnByZXRzIGJ1ZiBhcyBhIGJpZy1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBhbmQgc2V0cyB6IHRvIHRoYXQgdmFsdWUuCi8vIElmIGJ1ZiBpcyBsYXJnZXIgdGhhbiAzMiBieXRlcywgdXNlcyBvbmx5IHRoZSBsYXN0IDMyIGJ5dGVzLiBSZXR1cm5zIHouCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBidWY6IHRoZSBiaWctZW5kaWFuIGJ5dGUgc2VxdWVuY2U7IGlmIGxvbmdlciB0aGFuIDMyIGJ5dGVzLCBvbmx5IGl0cyBmaW5hbCAzMiBieXRlcyBhcmUgdXNlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBzZWxlY3RlZCBiaWctZW5kaWFuIGJ5dGVzCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzKGJ1ZiBbXWJ5dGUpICpVaW50IHsKCXN3aXRjaCBsIDo9IGxlbihidWYpOyBsIHsKCWNhc2UgMDoKCQl6LkNsZWFyKCkKCWNhc2UgMToKCQl6LlNldEJ5dGVzMShidWYpCgljYXNlIDI6CgkJei5TZXRCeXRlczIoYnVmKQoJY2FzZSAzOgoJCXouU2V0Qnl0ZXMzKGJ1ZikKCWNhc2UgNDoKCQl6LlNldEJ5dGVzNChidWYpCgljYXNlIDU6CgkJei5TZXRCeXRlczUoYnVmKQoJY2FzZSA2OgoJCXouU2V0Qnl0ZXM2KGJ1ZikKCWNhc2UgNzoKCQl6LlNldEJ5dGVzNyhidWYpCgljYXNlIDg6CgkJei5TZXRCeXRlczgoYnVmKQoJY2FzZSA5OgoJCXouU2V0Qnl0ZXM5KGJ1ZikKCWNhc2UgMTA6CgkJei5TZXRCeXRlczEwKGJ1ZikKCWNhc2UgMTE6CgkJei5TZXRCeXRlczExKGJ1ZikKCWNhc2UgMTI6CgkJei5TZXRCeXRlczEyKGJ1ZikKCWNhc2UgMTM6CgkJei5TZXRCeXRlczEzKGJ1ZikKCWNhc2UgMTQ6CgkJei5TZXRCeXRlczE0KGJ1ZikKCWNhc2UgMTU6CgkJei5TZXRCeXRlczE1KGJ1ZikKCWNhc2UgMTY6CgkJei5TZXRCeXRlczE2KGJ1ZikKCWNhc2UgMTc6CgkJei5TZXRCeXRlczE3KGJ1ZikKCWNhc2UgMTg6CgkJei5TZXRCeXRlczE4KGJ1ZikKCWNhc2UgMTk6CgkJei5TZXRCeXRlczE5KGJ1ZikKCWNhc2UgMjA6CgkJei5TZXRCeXRlczIwKGJ1ZikKCWNhc2UgMjE6CgkJei5TZXRCeXRlczIxKGJ1ZikKCWNhc2UgMjI6CgkJei5TZXRCeXRlczIyKGJ1ZikKCWNhc2UgMjM6CgkJei5TZXRCeXRlczIzKGJ1ZikKCWNhc2UgMjQ6CgkJei5TZXRCeXRlczI0KGJ1ZikKCWNhc2UgMjU6CgkJei5TZXRCeXRlczI1KGJ1ZikKCWNhc2UgMjY6CgkJei5TZXRCeXRlczI2KGJ1ZikKCWNhc2UgMjc6CgkJei5TZXRCeXRlczI3KGJ1ZikKCWNhc2UgMjg6CgkJei5TZXRCeXRlczI4KGJ1ZikKCWNhc2UgMjk6CgkJei5TZXRCeXRlczI5KGJ1ZikKCWNhc2UgMzA6CgkJei5TZXRCeXRlczMwKGJ1ZikKCWNhc2UgMzE6CgkJei5TZXRCeXRlczMxKGJ1ZikKCWRlZmF1bHQ6CgkJei5TZXRCeXRlczMyKGJ1ZltsLTMyOl0pCgl9CglyZXR1cm4gegp9CgovLyBTZXRCeXRlczEgc2V0cyB6IGZyb20gYSAxLWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDEgYnl0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgZmlyc3QgYnl0ZSBpcyBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgYmUgcHJlc2VudAovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCBieXRlIG9mIGluCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMShpbiBbXWJ5dGUpICpVaW50IHsKCXpbM10sIHpbMl0sIHpbMV0gPSAwLCAwLCAwCgl6WzBdID0gdWludDY0KGluWzBdKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMyIHNldHMgeiBmcm9tIGEgMi1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAyIGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDIgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDIgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMiBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMihpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsxXSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10sIHpbMl0sIHpbMV0gPSAwLCAwLCAwCgl6WzBdID0gdWludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGluWzA6Ml0pKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMzIHNldHMgeiBmcm9tIGEgMy1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAzIGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDMgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDMgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMyBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMyhpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsyXSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10sIHpbMl0sIHpbMV0gPSAwLCAwLCAwCgl6WzBdID0gdWludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGluWzE6M10pKSB8IHVpbnQ2NChpblswXSk8PDE2CglyZXR1cm4gegp9CgovLyBTZXRCeXRlczQgc2V0cyB6IGZyb20gYSA0LWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDQgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgNCBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgNCBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXM0KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzNdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSwgelsyXSwgelsxXSA9IDAsIDAsIDAKCXpbMF0gPSB1aW50NjQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoaW5bMDo0XSkpCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczUgc2V0cyB6IGZyb20gYSA1LWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDUgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgNSBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgNSBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCA1IGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXM1KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzRdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSwgelsyXSwgelsxXSA9IDAsIDAsIDAKCXpbMF0gPSBiaWdFbmRpYW5VaW50NDAoaW5bMDo1XSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzNiBzZXRzIHogZnJvbSBhIDYtYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gNiBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCA2IGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCA2IGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDYgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczYoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bNV0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdLCB6WzJdLCB6WzFdID0gMCwgMCwgMAoJelswXSA9IGJpZ0VuZGlhblVpbnQ0OChpblswOjZdKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXM3IHNldHMgeiBmcm9tIGEgNy1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiA3IGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDcgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDcgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgNyBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzNyhpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpbls2XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10sIHpbMl0sIHpbMV0gPSAwLCAwLCAwCgl6WzBdID0gYmlnRW5kaWFuVWludDU2KGluWzA6N10pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczggc2V0cyB6IGZyb20gYW4gOC1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiA4IGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDggYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDggYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgOCBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzOChpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpbls3XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10sIHpbMl0sIHpbMV0gPSAwLCAwLCAwCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMDo4XSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzOSBzZXRzIHogZnJvbSBhIDktYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gOSBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCA5IGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCA5IGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDkgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczkoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bOF0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdLCB6WzJdID0gMCwgMAoJelsxXSA9IHVpbnQ2NChpblswXSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsxOjldKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMxMCBzZXRzIHogZnJvbSBhIDEwLWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDEwIGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDEwIGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAxMCBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCAxMCBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMTAoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bOV0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdLCB6WzJdID0gMCwgMAoJelsxXSA9IHVpbnQ2NChiaW5hcnkuQmlnRW5kaWFuLlVpbnQxNihpblswOjJdKSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsyOjEwXSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMTEgc2V0cyB6IGZyb20gYW4gMTEtYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMTEgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMTEgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDExIGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDExIGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMxMShpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsxMF0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdLCB6WzJdID0gMCwgMAoJelsxXSA9IHVpbnQ2NChiaW5hcnkuQmlnRW5kaWFuLlVpbnQxNihpblsxOjNdKSkgfCB1aW50NjQoaW5bMF0pPDwxNgoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzM6MTFdKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMxMiBzZXRzIHogZnJvbSBhIDEyLWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDEyIGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDEyIGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAxMiBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCAxMiBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMTIoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bMTFdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSwgelsyXSA9IDAsIDAKCXpbMV0gPSB1aW50NjQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoaW5bMDo0XSkpCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bNDoxMl0pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczEzIHNldHMgeiBmcm9tIGEgMTMtYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMTMgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMTMgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDEzIGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDEzIGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMxMyhpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsxMl0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdLCB6WzJdID0gMCwgMAoJelsxXSA9IGJpZ0VuZGlhblVpbnQ0MChpblswOjVdKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzU6MTNdKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMxNCBzZXRzIHogZnJvbSBhIDE0LWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDE0IGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDE0IGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAxNCBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCAxNCBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMTQoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bMTNdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSwgelsyXSA9IDAsIDAKCXpbMV0gPSBiaWdFbmRpYW5VaW50NDgoaW5bMDo2XSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpbls2OjE0XSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMTUgc2V0cyB6IGZyb20gYSAxNS1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAxNSBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAxNSBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMTUgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMTUgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczE1KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzE0XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10sIHpbMl0gPSAwLCAwCgl6WzFdID0gYmlnRW5kaWFuVWludDU2KGluWzA6N10pCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bNzoxNV0pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczE2IHNldHMgeiBmcm9tIGEgMTYtYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMTYgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMTYgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDE2IGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDE2IGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMxNihpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsxNV0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdLCB6WzJdID0gMCwgMAoJelsxXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzA6OF0pCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bODoxNl0pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczE3IHNldHMgeiBmcm9tIGEgMTctYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMTcgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMTcgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDE3IGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDE3IGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMxNyhpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsxNl0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdID0gMAoJelsyXSA9IHVpbnQ2NChpblswXSkKCXpbMV0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsxOjldKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzk6MTddKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMxOCBzZXRzIHogZnJvbSBhbiAxOC1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAxOCBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAxOCBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMTggYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMTggYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczE4KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzE3XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10gPSAwCgl6WzJdID0gdWludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGluWzA6Ml0pKQoJelsxXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzI6MTBdKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzEwOjE4XSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMTkgc2V0cyB6IGZyb20gYSAxOS1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAxOSBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAxOSBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMTkgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMTkgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczE5KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzE4XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10gPSAwCgl6WzJdID0gdWludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGluWzE6M10pKSB8IHVpbnQ2NChpblswXSk8PDE2Cgl6WzFdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMzoxMV0pCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMTE6MTldKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMyMCBzZXRzIHogZnJvbSBhIDIwLWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDIwIGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDIwIGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAyMCBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCAyMCBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMjAoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bMTldIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSA9IDAKCXpbMl0gPSB1aW50NjQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoaW5bMDo0XSkpCgl6WzFdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bNDoxMl0pCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMTI6MjBdKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMyMSBzZXRzIHogZnJvbSBhIDIxLWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDIxIGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDIxIGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAyMSBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCAyMSBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMjEoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bMjBdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSA9IDAKCXpbMl0gPSBiaWdFbmRpYW5VaW50NDAoaW5bMDo1XSkKCXpbMV0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpbls1OjEzXSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsxMzoyMV0pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczIyIHNldHMgeiBmcm9tIGEgMjItYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMjIgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMjIgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDIyIGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDIyIGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMyMihpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsyMV0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdID0gMAoJelsyXSA9IGJpZ0VuZGlhblVpbnQ0OChpblswOjZdKQoJelsxXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzY6MTRdKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzE0OjIyXSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMjMgc2V0cyB6IGZyb20gYSAyMy1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAyMyBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAyMyBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMjMgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMjMgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczIzKGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzIyXSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10gPSAwCgl6WzJdID0gYmlnRW5kaWFuVWludDU2KGluWzA6N10pCgl6WzFdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bNzoxNV0pCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMTU6MjNdKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMyNCBzZXRzIHogZnJvbSBhIDI0LWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDI0IGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDI0IGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAyNCBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCAyNCBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMjQoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bMjNdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSA9IDAKCXpbMl0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblswOjhdKQoJelsxXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzg6MTZdKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzE2OjI0XSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMjUgc2V0cyB6IGZyb20gYSAyNS1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAyNSBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAyNSBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMjUgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMjUgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczI1KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzI0XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10gPSB1aW50NjQoaW5bMF0pCgl6WzJdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMTo5XSkKCXpbMV0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpbls5OjE3XSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsxNzoyNV0pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczI2IHNldHMgeiBmcm9tIGEgMjYtYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMjYgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMjYgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDI2IGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDI2IGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMyNihpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsyNV0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdID0gdWludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGluWzA6Ml0pKQoJelsyXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzI6MTBdKQoJelsxXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzEwOjE4XSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsxODoyNl0pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczI3IHNldHMgeiBmcm9tIGEgMjctYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMjcgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMjcgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDI3IGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDI3IGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMyNyhpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblsyNl0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdID0gdWludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGluWzE6M10pKSB8IHVpbnQ2NChpblswXSk8PDE2Cgl6WzJdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMzoxMV0pCgl6WzFdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMTE6MTldKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzE5OjI3XSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMjggc2V0cyB6IGZyb20gYSAyOC1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAyOCBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAyOCBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMjggYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMjggYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczI4KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzI3XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10gPSB1aW50NjQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoaW5bMDo0XSkpCgl6WzJdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bNDoxMl0pCgl6WzFdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMTI6MjBdKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzIwOjI4XSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMjkgc2V0cyB6IGZyb20gYSAyOS1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAyOSBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAyOSBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMjkgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMjkgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczI5KGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzI4XSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10gPSBiaWdFbmRpYW5VaW50NDAoaW5bMDo1XSkKCXpbMl0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpbls1OjEzXSkKCXpbMV0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsxMzoyMV0pCgl6WzBdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMjE6MjldKQoJcmV0dXJuIHoKfQoKLy8gU2V0Qnl0ZXMzMCBzZXRzIHogZnJvbSBhIDMwLWJ5dGUgYmlnLWVuZGlhbiBzbGljZSBhbmQgcmV0dXJucyB6LgovLyBQYW5pY3MgaWYgaW5wdXQgaXMgc2hvcnRlciB0aGFuIDMwIGJ5dGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW46IHRoZSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IDMwIGJ5dGVzIGFyZSBkZWNvZGVkIGluIGJpZy1lbmRpYW4gb3JkZXI7IGl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAzMCBieXRlcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCAzMCBieXRlcyBvZiBpbiBpbiBiaWctZW5kaWFuIG9yZGVyCmZ1bmMgKHogKlVpbnQpIFNldEJ5dGVzMzAoaW4gW11ieXRlKSAqVWludCB7CglfID0gaW5bMjldIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJelszXSA9IGJpZ0VuZGlhblVpbnQ0OChpblswOjZdKQoJelsyXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzY6MTRdKQoJelsxXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzE0OjIyXSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsyMjozMF0pCglyZXR1cm4gegp9CgovLyBTZXRCeXRlczMxIHNldHMgeiBmcm9tIGEgMzEtYnl0ZSBiaWctZW5kaWFuIHNsaWNlIGFuZCByZXR1cm5zIHouCi8vIFBhbmljcyBpZiBpbnB1dCBpcyBzaG9ydGVyIHRoYW4gMzEgYnl0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbjogdGhlIGJ5dGUgc2VxdWVuY2Ugd2hvc2UgZmlyc3QgMzEgYnl0ZXMgYXJlIGRlY29kZWQgaW4gYmlnLWVuZGlhbiBvcmRlcjsgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IDMxIGJ5dGVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IDMxIGJ5dGVzIG9mIGluIGluIGJpZy1lbmRpYW4gb3JkZXIKZnVuYyAoeiAqVWludCkgU2V0Qnl0ZXMzMShpbiBbXWJ5dGUpICpVaW50IHsKCV8gPSBpblszMF0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4Cgl6WzNdID0gYmlnRW5kaWFuVWludDU2KGluWzA6N10pCgl6WzJdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bNzoxNV0pCgl6WzFdID0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoaW5bMTU6MjNdKQoJelswXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzIzOjMxXSkKCXJldHVybiB6Cn0KCi8vIFNldEJ5dGVzMzIgc2V0cyB6IGZyb20gYSAzMi1ieXRlIGJpZy1lbmRpYW4gc2xpY2UgYW5kIHJldHVybnMgei4KLy8gUGFuaWNzIGlmIGlucHV0IGlzIHNob3J0ZXIgdGhhbiAzMiBieXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluOiB0aGUgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCAzMiBieXRlcyBhcmUgZGVjb2RlZCBpbiBiaWctZW5kaWFuIG9yZGVyOyBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMzIgYnl0ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgMzIgYnl0ZXMgb2YgaW4gaW4gYmlnLWVuZGlhbiBvcmRlcgpmdW5jICh6ICpVaW50KSBTZXRCeXRlczMyKGluIFtdYnl0ZSkgKlVpbnQgewoJXyA9IGluWzMxXSAvLyBib3VuZHMgY2hlY2sgaGludCB0byBjb21waWxlcjsgc2VlIGdvbGFuZy5vcmcvaXNzdWUvMTQ4MDgKCXpbM10gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblswOjhdKQoJelsyXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzg6MTZdKQoJelsxXSA9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGluWzE2OjI0XSkKCXpbMF0gPSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChpblsyNDozMl0pCglyZXR1cm4gegp9CgovLyBVdGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgIm1pc3NpbmciIGFtb25nIHRoZSBiaWdFbmRpYW4uVWludFhYIG1ldGhvZHMuCgovLyBiaWdFbmRpYW5VaW50NDAgcmV0dXJucyB0aGUgdWludDY0IHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSA1IGJ5dGVzIGluIGJpZy1lbmRpYW4gb3JkZXIuCmZ1bmMgYmlnRW5kaWFuVWludDQwKGIgW11ieXRlKSB1aW50NjQgewoJXyA9IGJbNF0gLy8gYm91bmRzIGNoZWNrIGhpbnQgdG8gY29tcGlsZXI7IHNlZSBnb2xhbmcub3JnL2lzc3VlLzE0ODA4CglyZXR1cm4gdWludDY0KGJbNF0pIHwgdWludDY0KGJbM10pPDw4IHwgdWludDY0KGJbMl0pPDwxNiB8IHVpbnQ2NChiWzFdKTw8MjQgfAoJCXVpbnQ2NChiWzBdKTw8MzIKfQoKLy8gYmlnRW5kaWFuVWludDU2IHJldHVybnMgdGhlIHVpbnQ2NCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgNyBieXRlcyBpbiBiaWctZW5kaWFuIG9yZGVyLgpmdW5jIGJpZ0VuZGlhblVpbnQ1NihiIFtdYnl0ZSkgdWludDY0IHsKCV8gPSBiWzZdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJcmV0dXJuIHVpbnQ2NChiWzZdKSB8IHVpbnQ2NChiWzVdKTw8OCB8IHVpbnQ2NChiWzRdKTw8MTYgfCB1aW50NjQoYlszXSk8PDI0IHwKCQl1aW50NjQoYlsyXSk8PDMyIHwgdWludDY0KGJbMV0pPDw0MCB8IHVpbnQ2NChiWzBdKTw8NDgKfQoKLy8gYmlnRW5kaWFuVWludDQ4IHJldHVybnMgdGhlIHVpbnQ2NCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgNiBieXRlcyBpbiBiaWctZW5kaWFuIG9yZGVyLgpmdW5jIGJpZ0VuZGlhblVpbnQ0OChiIFtdYnl0ZSkgdWludDY0IHsKCV8gPSBiWzVdIC8vIGJvdW5kcyBjaGVjayBoaW50IHRvIGNvbXBpbGVyOyBzZWUgZ29sYW5nLm9yZy9pc3N1ZS8xNDgwOAoJcmV0dXJuIHVpbnQ2NChiWzVdKSB8IHVpbnQ2NChiWzRdKTw8OCB8IHVpbnQ2NChiWzNdKTw8MTYgfCB1aW50NjQoYlsyXSk8PDI0IHwKCQl1aW50NjQoYlsxXSk8PDMyIHwgdWludDY0KGJbMF0pPDw0MAp9ChqLBgoHZG9jLmdubxL/BS8vIFBhY2thZ2UgdWludDI1NiBpbXBsZW1lbnRzIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBhcml0aG1ldGljIGZvciBHbm9Td2FwLgovLwovLyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBVaW50IHR5cGUgdGhhdCByZXByZXNlbnRzIGEgMjU2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLAovLyBzdG9yZWQgYXMgZm91ciB1aW50NjQgdmFsdWVzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuIFRoZSB1bnN1ZmZpeGVkIEFkZCwgU3ViLAovLyBhbmQgTXVsIG1ldGhvZHMgcmV0dXJuIHRoZSBsb3cgMjU2IGJpdHM7IEFkZE92ZXJmbG93LCBTdWJPdmVyZmxvdywgYW5kCi8vIE11bE92ZXJmbG93IGFkZGl0aW9uYWxseSByZXBvcnQgYW4gb3ZlcmZsb3cvdW5kZXJmbG93IGZsYWcuIE11bERpdiBhbmQKLy8gTXVsRGl2Um91bmRpbmdVcCBwYW5pYyBvbiBhIHplcm8gZGVub21pbmF0b3Igb3IgYW4gdW5yZXByZXNlbnRhYmxlIHJlc3VsdDsKLy8gdGhlIHJvdW5kaW5nIHZhcmlhbnQgYWxzbyBwYW5pY3MgaWYgYWRkaW5nIG9uZSB0byBpdHMgcmVzdWx0IHdvdWxkIG92ZXJmbG93LgovLwovLyBUaGUgaW1wbGVtZW50YXRpb24gaXMgb3B0aW1pemVkIGZvciBnYXMgZWZmaWNpZW5jeSB3aGlsZSBtYWludGFpbmluZwovLyBjb21wYXRpYmlsaXR5IHdpdGggRXRoZXJldW0ncyB1aW50MjU2IHNlbWFudGljcywgZW5zdXJpbmcgY29uc2lzdGVudAovLyBiZWhhdmlvciBhY3Jvc3MgZGlmZmVyZW50IGJsb2NrY2hhaW4gZW52aXJvbm1lbnRzLgpwYWNrYWdlIHVpbnQyNTYKGu4fCgxmdWxsbWF0aC5nbm8S3R8vLyBSRUY6IGh0dHBzOi8vZ2l0aHViLmNvbS9Vbmlzd2FwL3YzLWNvcmUvYmxvYi9tYWluL2NvbnRyYWN0cy9saWJyYXJpZXMvRnVsbE1hdGguc29sCgovLyBmdWxsbWF0aCBpbXBsZW1lbnRzIFVuaXN3YXAgVjMncyBGdWxsTWF0aCBsaWJyYXJ5LgovLwovLyBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgYWR2YW5jZWQgZml4ZWQtcG9pbnQgbWF0aCBvcGVyYXRpb25zIHRoYXQgYXJlIGVzc2VudGlhbAovLyBmb3IgVW5pc3dhcCBWMydzIHRpY2sgbWF0aCBhbmQgbGlxdWlkaXR5IGNhbGN1bGF0aW9ucy4gSXQgZW5hYmxlcyBwcmVjaXNlCi8vIGNhbGN1bGF0aW9ucyBvZiAoYSAqIGIgLyBkZW5vbWluYXRvcikgd2l0aCBmdWxsIDUxMi1iaXQgaW50ZXJtZWRpYXRlIHByZWNpc2lvbi4KLy8KLy8gTk9URTogVW5saWtlIHRoZSBiYXNlIGFyaXRobWV0aWMgbWV0aG9kcyBpbiB0aGUgdWludDI1NiBwYWNrYWdlLCB3aGljaCByZXR1cm4KLy8gbG93LTI1Ni1iaXQgdmFsdWVzIChvciB2YWx1ZXMgcGx1cyBvdmVyZmxvdyBmbGFncyBpbiB0aGVpciBgKk92ZXJmbG93YAovLyB2YXJpYW50cyksIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgcGFuaWMgb24gaW52YWxpZCBpbnB1dHMgdG8gbWFpbnRhaW4KLy8gYmVoYXZpb3JhbCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9yaWdpbmFsIFNvbGlkaXR5IGltcGxlbWVudGF0aW9uLgovLwovLyBUaGlzIGRlc2lnbiBjaG9pY2UgaXMgaW50ZW50aW9uYWwgYmVjYXVzZToKLy8gMS4gVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBob3QgcGF0aHMgd2hlcmUgZXJyb3IgaGFuZGxpbmcgd291bGQgYWRkIG92ZXJoZWFkCi8vIDIuIEludmFsaWQgaW5wdXRzIChsaWtlIHplcm8gZGVub21pbmF0b3IpIHJlcHJlc2VudCBwcm9ncmFtbWluZyBlcnJvcnMsIG5vdCBydW50aW1lIGNvbmRpdGlvbnMKLy8gMy4gU3RheWluZyBjbG9zZSB0byB0aGUgU29saWRpdHkgaW1wbGVtZW50YXRpb24gbWFrZXMgcHJvdG9jb2wgcG9ydGluZyBtb3JlIHJlbGlhYmxlCi8vCi8vIElmIHlvdSBuZWVkIGVycm9yLXJldHVybmluZyB2ZXJzaW9ucywgd3JhcCB0aGVzZSBmdW5jdGlvbnMgd2l0aCBhcHByb3ByaWF0ZSBlcnJvciBoYW5kbGluZy4KcGFja2FnZSB1aW50MjU2CgovLyBNdWxEaXYgY29tcHV0ZXMgZmxvb3IoKGEgKiBiKSAvIGRlbm9taW5hdG9yKSB3aXRoIGEgZnVsbCA1MTItYml0IGludGVybWVkaWF0ZSBwcm9kdWN0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYTogRmlyc3Qgbm9uLW5lZ2F0aXZlIDI1Ni1iaXQgbXVsdGlwbGljYW5kLgovLyAgIC0gYjogU2Vjb25kIG5vbi1uZWdhdGl2ZSAyNTYtYml0IG11bHRpcGxpY2FuZC4KLy8gICAtIGRlbm9taW5hdG9yOiBOb24temVybyAyNTYtYml0IGRpdmlzb3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBxdW90aWVudDogVGhlIGV4YWN0IGZsb29yIHF1b3RpZW50IHdoZW4gaXQgZml0cyBpbiAyNTYgYml0cy4KLy8KLy8gUGFuaWNzIGlmIGRlbm9taW5hdG9yIGlzIHplcm8gb3IgdGhlIHF1b3RpZW50IGlzIGF0IGxlYXN0IDJeMjU2LgpmdW5jIE11bERpdihhLCBiLCBkZW5vbWluYXRvciAqVWludCkgKlVpbnQgewoJaWYgZGVub21pbmF0b3IuSXNaZXJvKCkgewoJCXBhbmljKCJkZW5vbWluYXRvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIikKCX0KCgkvLyA1MTItYml0IHByb2R1Y3QgKDggbGltYnMgb2YgNjQgYml0cykKCXAgOj0gdW11bChhLCBiKQoKCWlmIChwWzRdIHwgcFs1XSB8IHBbNl0gfCBwWzddKSA9PSAwIHsKCQl2YXIgbG8gVWludAoJCWxvWzBdLCBsb1sxXSwgbG9bMl0sIGxvWzNdID0gcFswXSwgcFsxXSwgcFsyXSwgcFszXQoJCXJldHVybiBuZXcoVWludCkuRGl2KCZsbywgZGVub21pbmF0b3IpCgl9CgoJLy8gb3B0aW9uYWwgZWFybHkgb3ZlcmZsb3cgY2hlY2s6CgkvLyBJZiBoaSA+PSBkZW5vbWluYXRvciB0aGVuIGZsb29yKChoaSoyXjI1NiArIGxvKSAvIGRlbm9taW5hdG9yKSA+PSAyXjI1Niwgd2hpY2ggaXMgb3ZlcmZsb3cuCgl7CgkJdmFyIGhpIFVpbnQKCQloaVswXSwgaGlbMV0sIGhpWzJdLCBoaVszXSA9IHBbNF0sIHBbNV0sIHBbNl0sIHBbN10KCQlpZiBkZW5vbWluYXRvci5MdGUoJmhpKSB7CgkJCXBhbmljKCJvdmVyZmxvdzogZGVub21pbmF0b3IoIiArIGRlbm9taW5hdG9yLlRvU3RyaW5nKCkgKyAiKSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBoaSgiICsgaGkuVG9TdHJpbmcoKSArICIpIikKCQl9Cgl9CgoJLy8gcGVyZm9ybSA1MTIgLyAyNTYgZGl2aXNpb24KCS8vIHVkaXZyZW0gc3RvcmVzIHF1b3RpZW50IGludG8gYHF1b3RgIChsZW4odSkgLSBsZW4oZCkgKyAxIHdvcmRzKQoJLy8gd2UgcGFzcyA4IHdvcmRzIHRvIGJlIHNhZmUuCgl2YXIgcXVvdCBbOF11aW50NjQKCXVkaXZyZW0ocXVvdFs6XSwgcFs6XSwgZGVub21pbmF0b3IpIC8vIGlnbm9yZSByZW1haW5kZXIKCglpZiAocXVvdFs0XSB8IHF1b3RbNV0gfCBxdW90WzZdIHwgcXVvdFs3XSkgIT0gMCB7CgkJcGFuaWMoInVpbnQyNTY6IE11bERpdiBvdmVyZmxvdyAoaGlnaCBxdW90aWVudCB3b3JkcyBub24temVybykiKQoJfQoKCS8vIHJldHVybiBsb3dlciAyNTYgYml0cyBvZiBxdW90aWVudAoJdmFyIHogVWludAoJY29weSh6WzpdLCBxdW90Wzo0XSkKCXJldHVybiAmegp9CgovLyBNdWxEaXZSb3VuZGluZ1VwIGNvbXB1dGVzIGNlaWwoKGEgKiBiKSAvIGRlbm9taW5hdG9yKSB3aXRoIGEgZnVsbCA1MTItYml0IGludGVybWVkaWF0ZSBwcm9kdWN0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYTogRmlyc3Qgbm9uLW5lZ2F0aXZlIDI1Ni1iaXQgbXVsdGlwbGljYW5kLgovLyAgIC0gYjogU2Vjb25kIG5vbi1uZWdhdGl2ZSAyNTYtYml0IG11bHRpcGxpY2FuZC4KLy8gICAtIGRlbm9taW5hdG9yOiBOb24temVybyAyNTYtYml0IGRpdmlzb3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBxdW90aWVudDogVGhlIGNlaWxpbmcgcXVvdGllbnQ7IGl0IGlzIG9uZSBncmVhdGVyIHRoYW4gdGhlIGZsb29yIHF1b3RpZW50Ci8vICAgICBleGFjdGx5IHdoZW4gdGhlIHByb2R1Y3QgaGFzIGEgbm9uLXplcm8gcmVtYWluZGVyLgovLwovLyBQYW5pY3MgaWYgZGVub21pbmF0b3IgaXMgemVybyBvciByb3VuZGluZyB0aGUgcmVzdWx0IGV4Y2VlZHMgMjU2IGJpdHMuCmZ1bmMgTXVsRGl2Um91bmRpbmdVcChhLCBiLCBkZW5vbWluYXRvciAqVWludCkgKlVpbnQgewoJcmVzdWx0IDo9IE11bERpdihhLCBiLCBkZW5vbWluYXRvcikKCgkvLyBDaGVjayBpZiB0aGVyZSdzIGEgcmVtYWluZGVyCgltdWxNb2RSZXN1bHQgOj0gbmV3KFVpbnQpLk11bE1vZChhLCBiLCBkZW5vbWluYXRvcikKCgkvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmRlciwgcmV0dXJuIHRoZSByZXN1bHQgYXMtaXMKCWlmIG11bE1vZFJlc3VsdC5Jc1plcm8oKSB7CgkJcmV0dXJuIHJlc3VsdAoJfQoKCS8vIEFkZCAxIHRvIHJvdW5kIHVwLCBidXQgY2hlY2sgZm9yIG92ZXJmbG93CglpZiByZXN1bHQuRXEoTWF4VWludDI1NigpKSB7CgkJcGFuaWMoIm92ZXJmbG93OiByZXN1bHQoIiArIHJlc3VsdC5Ub1N0cmluZygpICsgIikgKyAxIHdvdWxkIGV4Y2VlZCBNQVhfVUlOVDI1NiIpCgl9CgoJcmV0dXJuIHJlc3VsdC5BZGQocmVzdWx0LCAmVWludHsxLCAwLCAwLCAwfSkKfQoKLy8gRGl2Um91bmRpbmdVcCBjb21wdXRlcyBjZWlsKHggLyB5KSBmb3IgdW5zaWduZWQgMjU2LWJpdCBvcGVyYW5kcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHg6IE5vbi1uZWdhdGl2ZSAyNTYtYml0IGRpdmlkZW5kLgovLyAgIC0geTogTm9uLXplcm8gMjU2LWJpdCBkaXZpc29yLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcXVvdGllbnQ6IFRoZSBxdW90aWVudCByb3VuZGVkIHRvd2FyZCBwb3NpdGl2ZSBpbmZpbml0eS4KLy8KLy8gUGFuaWNzIGlmIHkgaXMgemVyby4KZnVuYyBEaXZSb3VuZGluZ1VwKHgsIHkgKlVpbnQpICpVaW50IHsKCWRpdiwgbW9kIDo9IG5ldyhVaW50KS5EaXZNb2QoeCwgeSwgbmV3KFVpbnQpKQoJaWYgIW1vZC5Jc1plcm8oKSB7CgkJZGl2LkFkZChkaXYsICZVaW50ezEsIDAsIDAsIDB9KQoJfQoJcmV0dXJuIGRpdgp9ChpECgtnbm9tb2QudG9tbBI1bW9kdWxlID0gImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgpnbm8gPSAiMC45IgoapHQKB21vZC5nbm8SmHRwYWNrYWdlIHVpbnQyNTYKCmltcG9ydCAoCgkibWF0aC9iaXRzIgopCgovLyBSZWNpcHJvY2FsIGNvbXB1dGVzIHRoZSAzMjAtYml0IHJlY2lwcm9jYWwgZXN0aW1hdGUgdXNlZCBieSBCYXJyZXR0IHJlZHVjdGlvbi4KLy8KLy8gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNwZWNpYWxpemVkIGZvciBhIGZvdXItd29yZCBtb2R1bHVzIHdpdGggbVszXSBub24temVybwovLyAoMl4xOTIgPD0gbSA8IDJeMjU2KS4gRm9yIGEgbW9kdWx1cyB3aG9zZSBtb3N0LXNpZ25pZmljYW50IHdvcmQgaXMgemVybyBpdAovLyByZXR1cm5zIGFuIGFsbC16ZXJvIGVzdGltYXRlIGluc3RlYWQgb2YgcnVubmluZyB0aGUgcmVmaW5lbWVudCBzdGVwcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG06IEZvdXItd29yZCB1bnNpZ25lZCBtb2R1bHVzOyBpdHMgbW9zdC1zaWduaWZpY2FudCB3b3JkIHNlbGVjdHMgdGhlIHN1cHBvcnRlZCByYW5nZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG11OiBGaXZlIGxpdHRsZS1lbmRpYW4gdWludDY0IHdvcmRzIGNvbnRhaW5pbmcgdGhlIHJlY2lwcm9jYWwgZXN0aW1hdGUgZm9yIG0uCmZ1bmMgUmVjaXByb2NhbChtICpVaW50KSAobXUgWzVddWludDY0KSB7CglpZiBtWzNdID09IDAgewoJCXJldHVybiBtdQoJfQoKCXMgOj0gYml0cy5MZWFkaW5nWmVyb3M2NChtWzNdKSAvLyBSZXBsYWNlIHdpdGggbGVhZGluZ1plcm9zKG0pIGZvciBnZW5lcmFsIGNhc2UKCXAgOj0gMjU1IC0gcyAgICAgICAgICAgICAgICAgICAvLyBmbG9vcihsb2dfMihtKSksIG0+MAoKCS8vIDAgb3IgYSBwb3dlciBvZiAyPwoKCS8vIENoZWNrIGlmIGF0IGxlYXN0IG9uZSBiaXQgaXMgc2V0IGluIG1bMl0sIG1bMV0gb3IgbVswXSwKCS8vIG9yIGF0IGxlYXN0IHR3byBiaXRzIGluIG1bM10KCglpZiBtWzBdfG1bMV18bVsyXXwobVszXSYobVszXS0xKSkgPT0gMCB7CgoJCW11WzRdID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUgPj4gdWludChwJjYzKQoJCW11WzNdID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUKCQltdVsyXSA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1CgkJbXVbMV0gPSAxODQ0Njc0NDA3MzcwOTU1MTYxNQoJCW11WzBdID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUKCgkJcmV0dXJuIG11Cgl9CgoJLy8gTWF4aW1pc2UgZGl2aXNpb24gcHJlY2lzaW9uIGJ5IGxlZnQtYWxpZ25pbmcgZGl2aXNvcgoKCXZhciAoCgkJeSAgVWludCAgIC8vIGxlZnQtYWxpZ25lZCBjb3B5IG9mIG0KCQlyMCB1aW50MzIgLy8gZXN0aW1hdGUgb2YgMl4zMS95CgkpCgoJeS5Mc2gobSwgdWludChzKSkgLy8gMS8yIDwgeSA8IDEKCgkvLyBFeHRyYWN0IG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cwoKCXloIDo9IHVpbnQzMih5WzNdID4+IDMyKQoKCWlmIHloID09IDB4ODAwMDAwMDAgeyAvLyBBdm9pZCBvdmVyZmxvdyBpbiBkaXZpc2lvbgoJCXIwID0gMHhmZmZmZmZmZgoJfSBlbHNlIHsKCQlyMCwgXyA9IGJpdHMuRGl2MzIoMHg4MDAwMDAwMCwgMCwgeWgpCgl9CgoJLy8gRmlyc3QgaXRlcmF0aW9uOiAzMiAtPiA2NAoKCXQxIDo9IHVpbnQ2NChyMCkgICAgICAgICAgICAgLy8gMl4zMS95Cgl0MSAqPSB0MSAgICAgICAgICAgICAgICAgICAgIC8vIDJeNjIveV4yCgl0MSwgXyA9IGJpdHMuTXVsNjQodDEsIHlbM10pIC8vIDJeNjIveV4yICogMl42NC95IC8gMl42NCA9IDJeNjIveQoKCXIxIDo9IHVpbnQ2NChyMCkgPDwgMzIgLy8gMl42My95CglyMSAtPSB0MSAgICAgICAgICAgICAgIC8vIDJeNjMveSAtIDJeNjIveSA9IDJeNjIveQoJcjEgKj0gMiAgICAgICAgICAgICAgICAvLyAyXjYzL3kKCglpZiAocjEgfCAoeVszXSA8PCAxKSkgPT0gMCB7CgkJcjEgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNQoJfQoKCS8vIFNlY29uZCBpdGVyYXRpb246IDY0IC0+IDEyOAoKCS8vIHNxdWFyZTogMl4xMjYveV4yCglhMmgsIGEybCA6PSBiaXRzLk11bDY0KHIxLCByMSkKCgkvLyBtdWx0aXBseSBieSB5OiBlMmg6ZTJsOmIyaCA9IDJeMTI2L3leMiAqIDJeMTI4L3kgLyAyXjEyOCA9IDJeMTI2L3kKCWIyaCwgXyA6PSBiaXRzLk11bDY0KGEybCwgeVsyXSkKCWMyaCwgYzJsIDo9IGJpdHMuTXVsNjQoYTJsLCB5WzNdKQoJZDJoLCBkMmwgOj0gYml0cy5NdWw2NChhMmgsIHlbMl0pCgllMmgsIGUybCA6PSBiaXRzLk11bDY0KGEyaCwgeVszXSkKCgliMmgsIGMgOj0gYml0cy5BZGQ2NChiMmgsIGMybCwgMCkKCWUybCwgYyA9IGJpdHMuQWRkNjQoZTJsLCBjMmgsIGMpCgllMmgsIF8gPSBiaXRzLkFkZDY0KGUyaCwgMCwgYykKCglfLCBjID0gYml0cy5BZGQ2NChiMmgsIGQybCwgMCkKCWUybCwgYyA9IGJpdHMuQWRkNjQoZTJsLCBkMmgsIGMpCgllMmgsIF8gPSBiaXRzLkFkZDY0KGUyaCwgMCwgYykKCgkvLyBzdWJ0cmFjdDogdDJoOnQybCA9IDJeMTI3L3kgLSAyXjEyNi95ID0gMl4xMjYveQoJdDJsLCBiIDo9IGJpdHMuU3ViNjQoMCwgZTJsLCAwKQoJdDJoLCBfIDo9IGJpdHMuU3ViNjQocjEsIGUyaCwgYikKCgkvLyBkb3VibGU6IHIyaDpyMmwgPSAyXjEyNy95CglyMmwsIGMgOj0gYml0cy5BZGQ2NCh0MmwsIHQybCwgMCkKCXIyaCwgXyA6PSBiaXRzLkFkZDY0KHQyaCwgdDJoLCBjKQoKCWlmIChyMmggfCByMmwgfCAoeVszXSA8PCAxKSkgPT0gMCB7CgkJcjJoID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUKCQlyMmwgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNQoJfQoKCS8vIFRoaXJkIGl0ZXJhdGlvbjogMTI4IC0+IDE5MgoKCS8vIHNxdWFyZSByMiAoa2VlcCAyNTYgYml0cyk6IDJeMTkwL3leMgoJYTNoLCBhM2wgOj0gYml0cy5NdWw2NChyMmwsIHIybCkKCWIzaCwgYjNsIDo9IGJpdHMuTXVsNjQocjJsLCByMmgpCgljM2gsIGMzbCA6PSBiaXRzLk11bDY0KHIyaCwgcjJoKQoKCWEzaCwgYyA9IGJpdHMuQWRkNjQoYTNoLCBiM2wsIDApCgljM2wsIGMgPSBiaXRzLkFkZDY0KGMzbCwgYjNoLCBjKQoJYzNoLCBfID0gYml0cy5BZGQ2NChjM2gsIDAsIGMpCgoJYTNoLCBjID0gYml0cy5BZGQ2NChhM2gsIGIzbCwgMCkKCWMzbCwgYyA9IGJpdHMuQWRkNjQoYzNsLCBiM2gsIGMpCgljM2gsIF8gPSBiaXRzLkFkZDY0KGMzaCwgMCwgYykKCgkvLyBtdWx0aXBseSBieSB5OiBxID0gMl4xOTAveV4yICogMl4xOTIveSAvIDJeMTkyID0gMl4xOTAveQoKCXgwIDo9IGEzbAoJeDEgOj0gYTNoCgl4MiA6PSBjM2wKCXgzIDo9IGMzaAoKCXZhciBxMCwgcTEsIHEyLCBxMywgcTQsIHQwIHVpbnQ2NAoKCXEwLCBfID0gYml0cy5NdWw2NCh4MiwgeVswXSkKCXExLCB0MCA9IGJpdHMuTXVsNjQoeDMsIHlbMF0pCglxMCwgYyA9IGJpdHMuQWRkNjQocTAsIHQwLCAwKQoJcTEsIF8gPSBiaXRzLkFkZDY0KHExLCAwLCBjKQoKCXQxLCBfID0gYml0cy5NdWw2NCh4MSwgeVsxXSkKCXEwLCBjID0gYml0cy5BZGQ2NChxMCwgdDEsIDApCglxMiwgdDAgPSBiaXRzLk11bDY0KHgzLCB5WzFdKQoJcTEsIGMgPSBiaXRzLkFkZDY0KHExLCB0MCwgYykKCXEyLCBfID0gYml0cy5BZGQ2NChxMiwgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgyLCB5WzFdKQoJcTAsIGMgPSBiaXRzLkFkZDY0KHEwLCB0MCwgMCkKCXExLCBjID0gYml0cy5BZGQ2NChxMSwgdDEsIGMpCglxMiwgXyA9IGJpdHMuQWRkNjQocTIsIDAsIGMpCgoJdDEsIHQwID0gYml0cy5NdWw2NCh4MSwgeVsyXSkKCXEwLCBjID0gYml0cy5BZGQ2NChxMCwgdDAsIDApCglxMSwgYyA9IGJpdHMuQWRkNjQocTEsIHQxLCBjKQoJcTMsIHQwID0gYml0cy5NdWw2NCh4MywgeVsyXSkKCXEyLCBjID0gYml0cy5BZGQ2NChxMiwgdDAsIGMpCglxMywgXyA9IGJpdHMuQWRkNjQocTMsIDAsIGMpCgoJdDEsIF8gPSBiaXRzLk11bDY0KHgwLCB5WzJdKQoJcTAsIGMgPSBiaXRzLkFkZDY0KHEwLCB0MSwgMCkKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDIsIHlbMl0pCglxMSwgYyA9IGJpdHMuQWRkNjQocTEsIHQwLCBjKQoJcTIsIGMgPSBiaXRzLkFkZDY0KHEyLCB0MSwgYykKCXEzLCBfID0gYml0cy5BZGQ2NChxMywgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgxLCB5WzNdKQoJcTEsIGMgPSBiaXRzLkFkZDY0KHExLCB0MCwgMCkKCXEyLCBjID0gYml0cy5BZGQ2NChxMiwgdDEsIGMpCglxNCwgdDAgPSBiaXRzLk11bDY0KHgzLCB5WzNdKQoJcTMsIGMgPSBiaXRzLkFkZDY0KHEzLCB0MCwgYykKCXE0LCBfID0gYml0cy5BZGQ2NChxNCwgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgwLCB5WzNdKQoJcTAsIGMgPSBiaXRzLkFkZDY0KHEwLCB0MCwgMCkKCXExLCBjID0gYml0cy5BZGQ2NChxMSwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgyLCB5WzNdKQoJcTIsIGMgPSBiaXRzLkFkZDY0KHEyLCB0MCwgYykKCXEzLCBjID0gYml0cy5BZGQ2NChxMywgdDEsIGMpCglxNCwgXyA9IGJpdHMuQWRkNjQocTQsIDAsIGMpCgoJLy8gc3VidHJhY3Q6IHQzID0gMl4xOTEveSAtIDJeMTkwL3kgPSAyXjE5MC95CglfLCBiID0gYml0cy5TdWI2NCgwLCBxMCwgMCkKCV8sIGIgPSBiaXRzLlN1YjY0KDAsIHExLCBiKQoJdDNsLCBiIDo9IGJpdHMuU3ViNjQoMCwgcTIsIGIpCgl0M20sIGIgOj0gYml0cy5TdWI2NChyMmwsIHEzLCBiKQoJdDNoLCBfIDo9IGJpdHMuU3ViNjQocjJoLCBxNCwgYikKCgkvLyBkb3VibGU6IHIzID0gMl4xOTEveQoJcjNsLCBjIDo9IGJpdHMuQWRkNjQodDNsLCB0M2wsIDApCglyM20sIGMgOj0gYml0cy5BZGQ2NCh0M20sIHQzbSwgYykKCXIzaCwgXyA6PSBiaXRzLkFkZDY0KHQzaCwgdDNoLCBjKQoKCS8vIEZvdXJ0aCBpdGVyYXRpb246IDE5MiAtPiAzMjAKCgkvLyBzcXVhcmUgcjMKCglhNGgsIGE0bCA6PSBiaXRzLk11bDY0KHIzbCwgcjNsKQoJYjRoLCBiNGwgOj0gYml0cy5NdWw2NChyM2wsIHIzbSkKCWM0aCwgYzRsIDo9IGJpdHMuTXVsNjQocjNsLCByM2gpCglkNGgsIGQ0bCA6PSBiaXRzLk11bDY0KHIzbSwgcjNtKQoJZTRoLCBlNGwgOj0gYml0cy5NdWw2NChyM20sIHIzaCkKCWY0aCwgZjRsIDo9IGJpdHMuTXVsNjQocjNoLCByM2gpCgoJYjRoLCBjID0gYml0cy5BZGQ2NChiNGgsIGM0bCwgMCkKCWU0bCwgYyA9IGJpdHMuQWRkNjQoZTRsLCBjNGgsIGMpCgllNGgsIF8gPSBiaXRzLkFkZDY0KGU0aCwgMCwgYykKCglhNGgsIGMgPSBiaXRzLkFkZDY0KGE0aCwgYjRsLCAwKQoJZDRsLCBjID0gYml0cy5BZGQ2NChkNGwsIGI0aCwgYykKCWQ0aCwgYyA9IGJpdHMuQWRkNjQoZDRoLCBlNGwsIGMpCglmNGwsIGMgPSBiaXRzLkFkZDY0KGY0bCwgZTRoLCBjKQoJZjRoLCBfID0gYml0cy5BZGQ2NChmNGgsIDAsIGMpCgoJYTRoLCBjID0gYml0cy5BZGQ2NChhNGgsIGI0bCwgMCkKCWQ0bCwgYyA9IGJpdHMuQWRkNjQoZDRsLCBiNGgsIGMpCglkNGgsIGMgPSBiaXRzLkFkZDY0KGQ0aCwgZTRsLCBjKQoJZjRsLCBjID0gYml0cy5BZGQ2NChmNGwsIGU0aCwgYykKCWY0aCwgXyA9IGJpdHMuQWRkNjQoZjRoLCAwLCBjKQoKCS8vIG11bHRpcGx5IGJ5IHkKCgl4MSwgeDAgPSBiaXRzLk11bDY0KGQ0aCwgeVswXSkKCXgzLCB4MiA9IGJpdHMuTXVsNjQoZjRoLCB5WzBdKQoJdDEsIHQwID0gYml0cy5NdWw2NChmNGwsIHlbMF0pCgl4MSwgYyA9IGJpdHMuQWRkNjQoeDEsIHQwLCAwKQoJeDIsIGMgPSBiaXRzLkFkZDY0KHgyLCB0MSwgYykKCXgzLCBfID0gYml0cy5BZGQ2NCh4MywgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KGQ0aCwgeVsxXSkKCXgxLCBjID0gYml0cy5BZGQ2NCh4MSwgdDAsIDApCgl4MiwgYyA9IGJpdHMuQWRkNjQoeDIsIHQxLCBjKQoJeDQsIHQwIDo9IGJpdHMuTXVsNjQoZjRoLCB5WzFdKQoJeDMsIGMgPSBiaXRzLkFkZDY0KHgzLCB0MCwgYykKCXg0LCBfID0gYml0cy5BZGQ2NCh4NCwgMCwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQoZDRsLCB5WzFdKQoJeDAsIGMgPSBiaXRzLkFkZDY0KHgwLCB0MCwgMCkKCXgxLCBjID0gYml0cy5BZGQ2NCh4MSwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KGY0bCwgeVsxXSkKCXgyLCBjID0gYml0cy5BZGQ2NCh4MiwgdDAsIGMpCgl4MywgYyA9IGJpdHMuQWRkNjQoeDMsIHQxLCBjKQoJeDQsIF8gPSBiaXRzLkFkZDY0KHg0LCAwLCBjKQoKCXQxLCB0MCA9IGJpdHMuTXVsNjQoYTRoLCB5WzJdKQoJeDAsIGMgPSBiaXRzLkFkZDY0KHgwLCB0MCwgMCkKCXgxLCBjID0gYml0cy5BZGQ2NCh4MSwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KGQ0aCwgeVsyXSkKCXgyLCBjID0gYml0cy5BZGQ2NCh4MiwgdDAsIGMpCgl4MywgYyA9IGJpdHMuQWRkNjQoeDMsIHQxLCBjKQoJeDUsIHQwIDo9IGJpdHMuTXVsNjQoZjRoLCB5WzJdKQoJeDQsIGMgPSBiaXRzLkFkZDY0KHg0LCB0MCwgYykKCXg1LCBfID0gYml0cy5BZGQ2NCh4NSwgMCwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQoZDRsLCB5WzJdKQoJeDEsIGMgPSBiaXRzLkFkZDY0KHgxLCB0MCwgMCkKCXgyLCBjID0gYml0cy5BZGQ2NCh4MiwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KGY0bCwgeVsyXSkKCXgzLCBjID0gYml0cy5BZGQ2NCh4MywgdDAsIGMpCgl4NCwgYyA9IGJpdHMuQWRkNjQoeDQsIHQxLCBjKQoJeDUsIF8gPSBiaXRzLkFkZDY0KHg1LCAwLCBjKQoKCXQxLCB0MCA9IGJpdHMuTXVsNjQoYTRoLCB5WzNdKQoJeDEsIGMgPSBiaXRzLkFkZDY0KHgxLCB0MCwgMCkKCXgyLCBjID0gYml0cy5BZGQ2NCh4MiwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KGQ0aCwgeVszXSkKCXgzLCBjID0gYml0cy5BZGQ2NCh4MywgdDAsIGMpCgl4NCwgYyA9IGJpdHMuQWRkNjQoeDQsIHQxLCBjKQoJeDYsIHQwIDo9IGJpdHMuTXVsNjQoZjRoLCB5WzNdKQoJeDUsIGMgPSBiaXRzLkFkZDY0KHg1LCB0MCwgYykKCXg2LCBfID0gYml0cy5BZGQ2NCh4NiwgMCwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQoYTRsLCB5WzNdKQoJeDAsIGMgPSBiaXRzLkFkZDY0KHgwLCB0MCwgMCkKCXgxLCBjID0gYml0cy5BZGQ2NCh4MSwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KGQ0bCwgeVszXSkKCXgyLCBjID0gYml0cy5BZGQ2NCh4MiwgdDAsIGMpCgl4MywgYyA9IGJpdHMuQWRkNjQoeDMsIHQxLCBjKQoJdDEsIHQwID0gYml0cy5NdWw2NChmNGwsIHlbM10pCgl4NCwgYyA9IGJpdHMuQWRkNjQoeDQsIHQwLCBjKQoJeDUsIGMgPSBiaXRzLkFkZDY0KHg1LCB0MSwgYykKCXg2LCBfID0gYml0cy5BZGQ2NCh4NiwgMCwgYykKCgkvLyBzdWJ0cmFjdAoJXywgYiA9IGJpdHMuU3ViNjQoMCwgeDAsIDApCglfLCBiID0gYml0cy5TdWI2NCgwLCB4MSwgYikKCXI0bCwgYiA6PSBiaXRzLlN1YjY0KDAsIHgyLCBiKQoJcjRrLCBiIDo9IGJpdHMuU3ViNjQoMCwgeDMsIGIpCglyNGosIGIgOj0gYml0cy5TdWI2NChyM2wsIHg0LCBiKQoJcjRpLCBiIDo9IGJpdHMuU3ViNjQocjNtLCB4NSwgYikKCXI0aCwgXyA6PSBiaXRzLlN1YjY0KHIzaCwgeDYsIGIpCgoJLy8gTXVsdGlwbHkgY2FuZGlkYXRlIGZvciAxLzR5IGJ5IHksIHdpdGggZnVsbCBwcmVjaXNpb24KCgl4MCA9IHI0bAoJeDEgPSByNGsKCXgyID0gcjRqCgl4MyA9IHI0aQoJeDQgPSByNGgKCglxMSwgcTAgPSBiaXRzLk11bDY0KHgwLCB5WzBdKQoJcTMsIHEyID0gYml0cy5NdWw2NCh4MiwgeVswXSkKCXE1LCBxNCA6PSBiaXRzLk11bDY0KHg0LCB5WzBdKQoKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDEsIHlbMF0pCglxMSwgYyA9IGJpdHMuQWRkNjQocTEsIHQwLCAwKQoJcTIsIGMgPSBiaXRzLkFkZDY0KHEyLCB0MSwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDMsIHlbMF0pCglxMywgYyA9IGJpdHMuQWRkNjQocTMsIHQwLCBjKQoJcTQsIGMgPSBiaXRzLkFkZDY0KHE0LCB0MSwgYykKCXE1LCBfID0gYml0cy5BZGQ2NChxNSwgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgwLCB5WzFdKQoJcTEsIGMgPSBiaXRzLkFkZDY0KHExLCB0MCwgMCkKCXEyLCBjID0gYml0cy5BZGQ2NChxMiwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgyLCB5WzFdKQoJcTMsIGMgPSBiaXRzLkFkZDY0KHEzLCB0MCwgYykKCXE0LCBjID0gYml0cy5BZGQ2NChxNCwgdDEsIGMpCglxNiwgdDAgOj0gYml0cy5NdWw2NCh4NCwgeVsxXSkKCXE1LCBjID0gYml0cy5BZGQ2NChxNSwgdDAsIGMpCglxNiwgXyA9IGJpdHMuQWRkNjQocTYsIDAsIGMpCgoJdDEsIHQwID0gYml0cy5NdWw2NCh4MSwgeVsxXSkKCXEyLCBjID0gYml0cy5BZGQ2NChxMiwgdDAsIDApCglxMywgYyA9IGJpdHMuQWRkNjQocTMsIHQxLCBjKQoJdDEsIHQwID0gYml0cy5NdWw2NCh4MywgeVsxXSkKCXE0LCBjID0gYml0cy5BZGQ2NChxNCwgdDAsIGMpCglxNSwgYyA9IGJpdHMuQWRkNjQocTUsIHQxLCBjKQoJcTYsIF8gPSBiaXRzLkFkZDY0KHE2LCAwLCBjKQoKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDAsIHlbMl0pCglxMiwgYyA9IGJpdHMuQWRkNjQocTIsIHQwLCAwKQoJcTMsIGMgPSBiaXRzLkFkZDY0KHEzLCB0MSwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDIsIHlbMl0pCglxNCwgYyA9IGJpdHMuQWRkNjQocTQsIHQwLCBjKQoJcTUsIGMgPSBiaXRzLkFkZDY0KHE1LCB0MSwgYykKCXE3LCB0MCA6PSBiaXRzLk11bDY0KHg0LCB5WzJdKQoJcTYsIGMgPSBiaXRzLkFkZDY0KHE2LCB0MCwgYykKCXE3LCBfID0gYml0cy5BZGQ2NChxNywgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgxLCB5WzJdKQoJcTMsIGMgPSBiaXRzLkFkZDY0KHEzLCB0MCwgMCkKCXE0LCBjID0gYml0cy5BZGQ2NChxNCwgdDEsIGMpCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgzLCB5WzJdKQoJcTUsIGMgPSBiaXRzLkFkZDY0KHE1LCB0MCwgYykKCXE2LCBjID0gYml0cy5BZGQ2NChxNiwgdDEsIGMpCglxNywgXyA9IGJpdHMuQWRkNjQocTcsIDAsIGMpCgoJdDEsIHQwID0gYml0cy5NdWw2NCh4MCwgeVszXSkKCXEzLCBjID0gYml0cy5BZGQ2NChxMywgdDAsIDApCglxNCwgYyA9IGJpdHMuQWRkNjQocTQsIHQxLCBjKQoJdDEsIHQwID0gYml0cy5NdWw2NCh4MiwgeVszXSkKCXE1LCBjID0gYml0cy5BZGQ2NChxNSwgdDAsIGMpCglxNiwgYyA9IGJpdHMuQWRkNjQocTYsIHQxLCBjKQoJcTgsIHQwIDo9IGJpdHMuTXVsNjQoeDQsIHlbM10pCglxNywgYyA9IGJpdHMuQWRkNjQocTcsIHQwLCBjKQoJcTgsIF8gPSBiaXRzLkFkZDY0KHE4LCAwLCBjKQoKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDEsIHlbM10pCglxNCwgYyA9IGJpdHMuQWRkNjQocTQsIHQwLCAwKQoJcTUsIGMgPSBiaXRzLkFkZDY0KHE1LCB0MSwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDMsIHlbM10pCglxNiwgYyA9IGJpdHMuQWRkNjQocTYsIHQwLCBjKQoJcTcsIGMgPSBiaXRzLkFkZDY0KHE3LCB0MSwgYykKCXE4LCBfID0gYml0cy5BZGQ2NChxOCwgMCwgYykKCgkvLyBGaW5hbCBhZGp1c3RtZW50CgoJLy8gc3VidHJhY3QgcSBmcm9tIDEvNAoJXywgYiA9IGJpdHMuU3ViNjQoMCwgcTAsIDApCglfLCBiID0gYml0cy5TdWI2NCgwLCBxMSwgYikKCV8sIGIgPSBiaXRzLlN1YjY0KDAsIHEyLCBiKQoJXywgYiA9IGJpdHMuU3ViNjQoMCwgcTMsIGIpCglfLCBiID0gYml0cy5TdWI2NCgwLCBxNCwgYikKCV8sIGIgPSBiaXRzLlN1YjY0KDAsIHE1LCBiKQoJXywgYiA9IGJpdHMuU3ViNjQoMCwgcTYsIGIpCglfLCBiID0gYml0cy5TdWI2NCgwLCBxNywgYikKCV8sIGIgPSBiaXRzLlN1YjY0KHVpbnQ2NCgxKTw8NjIsIHE4LCBiKQoKCS8vIGRlY3JlbWVudCB0aGUgcmVzdWx0Cgl4MCwgdCA6PSBiaXRzLlN1YjY0KHI0bCwgMSwgMCkKCXgxLCB0ID0gYml0cy5TdWI2NChyNGssIDAsIHQpCgl4MiwgdCA9IGJpdHMuU3ViNjQocjRqLCAwLCB0KQoJeDMsIHQgPSBiaXRzLlN1YjY0KHI0aSwgMCwgdCkKCXg0LCBfID0gYml0cy5TdWI2NChyNGgsIDAsIHQpCgoJLy8gY29tbWl0IHRoZSBkZWNyZW1lbnQgaWYgdGhlIHN1YnRyYWN0aW9uIHVuZGVyZmxvd2VkIChyZWNpcHJvY2FsIHdhcyB0b28gbGFyZ2UpCglpZiBiICE9IDAgewoJCXI0aCwgcjRpLCByNGosIHI0aywgcjRsID0geDQsIHgzLCB4MiwgeDEsIHgwCgl9CgoJLy8gU2hpZnQgdG8gY29ycmVjdCBiaXQgYWxpZ25tZW50LCB0cnVuY2F0aW5nIGV4Y2VzcyBiaXRzCgoJcCA9IChwICYgNjMpIC0gMQoKCXgwLCBjID0gYml0cy5BZGQ2NChyNGwsIHI0bCwgMCkKCXgxLCBjID0gYml0cy5BZGQ2NChyNGssIHI0aywgYykKCXgyLCBjID0gYml0cy5BZGQ2NChyNGosIHI0aiwgYykKCXgzLCBjID0gYml0cy5BZGQ2NChyNGksIHI0aSwgYykKCXg0LCBfID0gYml0cy5BZGQ2NChyNGgsIHI0aCwgYykKCglpZiBwIDwgMCB7CgkJcjRoLCByNGksIHI0aiwgcjRrLCByNGwgPSB4NCwgeDMsIHgyLCB4MSwgeDAKCQlwID0gMCAvLyBhdm9pZCBuZWdhdGl2ZSBzaGlmdCBiZWxvdwoJfQoKCXsKCQlyIDo9IHVpbnQocCkgICAgICAvLyByaWdodCBzaGlmdAoJCWwgOj0gdWludCg2NCAtIHIpIC8vIGxlZnQgc2hpZnQKCgkJeDAgPSAocjRsID4+IHIpIHwgKHI0ayA8PCBsKQoJCXgxID0gKHI0ayA+PiByKSB8IChyNGogPDwgbCkKCQl4MiA9IChyNGogPj4gcikgfCAocjRpIDw8IGwpCgkJeDMgPSAocjRpID4+IHIpIHwgKHI0aCA8PCBsKQoJCXg0ID0gKHI0aCA+PiByKQoJfQoKCWlmIHAgPiAwIHsKCQlyNGgsIHI0aSwgcjRqLCByNGssIHI0bCA9IHg0LCB4MywgeDIsIHgxLCB4MAoJfQoKCW11WzBdID0gcjRsCgltdVsxXSA9IHI0awoJbXVbMl0gPSByNGoKCW11WzNdID0gcjRpCgltdVs0XSA9IHI0aAoKCXJldHVybiBtdQp9CgovLyByZWR1Y2U0IGNvbXB1dGVzIHRoZSBsZWFzdCBub24tbmVnYXRpdmUgcmVzaWR1ZSBvZiB4IG1vZHVsbyBtCi8vCi8vIHJlcXVpcmVzIGEgZm91ci13b3JkIG1vZHVsdXMgKG1bM10gPiAxKSBhbmQgaXRzIGludmVyc2UgKG11KQpmdW5jIHJlZHVjZTQoeCBbOF11aW50NjQsIG0gKlVpbnQsIG11IFs1XXVpbnQ2NCkgKHogVWludCkgewoJLy8gTkI6IE1vc3QgdmFyaWFibGUgbmFtZXMgaW4gdGhlIGNvbW1lbnRzIG1hdGNoIHRoZSBwc2V1ZG9jb2RlIGZvcgoJLy8gCUJhcnJldHQgcmVkdWN0aW9uIGluIHRoZSBIYW5kYm9vayBvZiBBcHBsaWVkIENyeXB0b2dyYXBoeS4KCgkvLyBxMSA9IHgvMl4xOTIKCgl4MCA6PSB4WzNdCgl4MSA6PSB4WzRdCgl4MiA6PSB4WzVdCgl4MyA6PSB4WzZdCgl4NCA6PSB4WzddCgoJLy8gcTIgPSBxMSAqIG11OyBxMyA9IHEyIC8gMl4zMjAKCgl2YXIgcTAsIHExLCBxMiwgcTMsIHE0LCBxNSwgdDAsIHQxLCBjIHVpbnQ2NAoKCXEwLCBfID0gYml0cy5NdWw2NCh4MywgbXVbMF0pCglxMSwgdDAgPSBiaXRzLk11bDY0KHg0LCBtdVswXSkKCXEwLCBjID0gYml0cy5BZGQ2NChxMCwgdDAsIDApCglxMSwgXyA9IGJpdHMuQWRkNjQocTEsIDAsIGMpCgoJdDEsIF8gPSBiaXRzLk11bDY0KHgyLCBtdVsxXSkKCXEwLCBjID0gYml0cy5BZGQ2NChxMCwgdDEsIDApCglxMiwgdDAgPSBiaXRzLk11bDY0KHg0LCBtdVsxXSkKCXExLCBjID0gYml0cy5BZGQ2NChxMSwgdDAsIGMpCglxMiwgXyA9IGJpdHMuQWRkNjQocTIsIDAsIGMpCgoJdDEsIHQwID0gYml0cy5NdWw2NCh4MywgbXVbMV0pCglxMCwgYyA9IGJpdHMuQWRkNjQocTAsIHQwLCAwKQoJcTEsIGMgPSBiaXRzLkFkZDY0KHExLCB0MSwgYykKCXEyLCBfID0gYml0cy5BZGQ2NChxMiwgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgyLCBtdVsyXSkKCXEwLCBjID0gYml0cy5BZGQ2NChxMCwgdDAsIDApCglxMSwgYyA9IGJpdHMuQWRkNjQocTEsIHQxLCBjKQoJcTMsIHQwID0gYml0cy5NdWw2NCh4NCwgbXVbMl0pCglxMiwgYyA9IGJpdHMuQWRkNjQocTIsIHQwLCBjKQoJcTMsIF8gPSBiaXRzLkFkZDY0KHEzLCAwLCBjKQoKCXQxLCBfID0gYml0cy5NdWw2NCh4MSwgbXVbMl0pCglxMCwgYyA9IGJpdHMuQWRkNjQocTAsIHQxLCAwKQoJdDEsIHQwID0gYml0cy5NdWw2NCh4MywgbXVbMl0pCglxMSwgYyA9IGJpdHMuQWRkNjQocTEsIHQwLCBjKQoJcTIsIGMgPSBiaXRzLkFkZDY0KHEyLCB0MSwgYykKCXEzLCBfID0gYml0cy5BZGQ2NChxMywgMCwgYykKCgl0MSwgXyA9IGJpdHMuTXVsNjQoeDAsIG11WzNdKQoJcTAsIGMgPSBiaXRzLkFkZDY0KHEwLCB0MSwgMCkKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDIsIG11WzNdKQoJcTEsIGMgPSBiaXRzLkFkZDY0KHExLCB0MCwgYykKCXEyLCBjID0gYml0cy5BZGQ2NChxMiwgdDEsIGMpCglxNCwgdDAgPSBiaXRzLk11bDY0KHg0LCBtdVszXSkKCXEzLCBjID0gYml0cy5BZGQ2NChxMywgdDAsIGMpCglxNCwgXyA9IGJpdHMuQWRkNjQocTQsIDAsIGMpCgoJdDEsIHQwID0gYml0cy5NdWw2NCh4MSwgbXVbM10pCglxMCwgYyA9IGJpdHMuQWRkNjQocTAsIHQwLCAwKQoJcTEsIGMgPSBiaXRzLkFkZDY0KHExLCB0MSwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQoeDMsIG11WzNdKQoJcTIsIGMgPSBiaXRzLkFkZDY0KHEyLCB0MCwgYykKCXEzLCBjID0gYml0cy5BZGQ2NChxMywgdDEsIGMpCglxNCwgXyA9IGJpdHMuQWRkNjQocTQsIDAsIGMpCgoJdDEsIHQwID0gYml0cy5NdWw2NCh4MCwgbXVbNF0pCglfLCBjID0gYml0cy5BZGQ2NChxMCwgdDAsIDApCglxMSwgYyA9IGJpdHMuQWRkNjQocTEsIHQxLCBjKQoJdDEsIHQwID0gYml0cy5NdWw2NCh4MiwgbXVbNF0pCglxMiwgYyA9IGJpdHMuQWRkNjQocTIsIHQwLCBjKQoJcTMsIGMgPSBiaXRzLkFkZDY0KHEzLCB0MSwgYykKCXE1LCB0MCA9IGJpdHMuTXVsNjQoeDQsIG11WzRdKQoJcTQsIGMgPSBiaXRzLkFkZDY0KHE0LCB0MCwgYykKCXE1LCBfID0gYml0cy5BZGQ2NChxNSwgMCwgYykKCgl0MSwgdDAgPSBiaXRzLk11bDY0KHgxLCBtdVs0XSkKCXExLCBjID0gYml0cy5BZGQ2NChxMSwgdDAsIDApCglxMiwgYyA9IGJpdHMuQWRkNjQocTIsIHQxLCBjKQoJdDEsIHQwID0gYml0cy5NdWw2NCh4MywgbXVbNF0pCglxMywgYyA9IGJpdHMuQWRkNjQocTMsIHQwLCBjKQoJcTQsIGMgPSBiaXRzLkFkZDY0KHE0LCB0MSwgYykKCXE1LCBfID0gYml0cy5BZGQ2NChxNSwgMCwgYykKCgkvLyBEcm9wIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgcTMKCglxMCA9IHExCglxMSA9IHEyCglxMiA9IHEzCglxMyA9IHE0CglxNCA9IHE1CgoJLy8gcjEgPSB4IG1vZCAyXjMyMAoKCXgwID0geFswXQoJeDEgPSB4WzFdCgl4MiA9IHhbMl0KCXgzID0geFszXQoJeDQgPSB4WzRdCgoJLy8gcjIgPSBxMyAqIG0gbW9kIDJeMzIwCgoJdmFyIHIwLCByMSwgcjIsIHIzLCByNCB1aW50NjQKCglyNCwgcjMgPSBiaXRzLk11bDY0KHEwLCBtWzNdKQoJXywgdDAgPSBiaXRzLk11bDY0KHExLCBtWzNdKQoJcjQsIF8gPSBiaXRzLkFkZDY0KHI0LCB0MCwgMCkKCgl0MSwgcjIgPSBiaXRzLk11bDY0KHEwLCBtWzJdKQoJcjMsIGMgPSBiaXRzLkFkZDY0KHIzLCB0MSwgMCkKCV8sIHQwID0gYml0cy5NdWw2NChxMiwgbVsyXSkKCXI0LCBfID0gYml0cy5BZGQ2NChyNCwgdDAsIGMpCgoJdDEsIHQwID0gYml0cy5NdWw2NChxMSwgbVsyXSkKCXIzLCBjID0gYml0cy5BZGQ2NChyMywgdDAsIDApCglyNCwgXyA9IGJpdHMuQWRkNjQocjQsIHQxLCBjKQoKCXQxLCByMSA9IGJpdHMuTXVsNjQocTAsIG1bMV0pCglyMiwgYyA9IGJpdHMuQWRkNjQocjIsIHQxLCAwKQoJdDEsIHQwID0gYml0cy5NdWw2NChxMiwgbVsxXSkKCXIzLCBjID0gYml0cy5BZGQ2NChyMywgdDAsIGMpCglyNCwgXyA9IGJpdHMuQWRkNjQocjQsIHQxLCBjKQoKCXQxLCB0MCA9IGJpdHMuTXVsNjQocTEsIG1bMV0pCglyMiwgYyA9IGJpdHMuQWRkNjQocjIsIHQwLCAwKQoJcjMsIGMgPSBiaXRzLkFkZDY0KHIzLCB0MSwgYykKCV8sIHQwID0gYml0cy5NdWw2NChxMywgbVsxXSkKCXI0LCBfID0gYml0cy5BZGQ2NChyNCwgdDAsIGMpCgoJdDEsIHIwID0gYml0cy5NdWw2NChxMCwgbVswXSkKCXIxLCBjID0gYml0cy5BZGQ2NChyMSwgdDEsIDApCgl0MSwgdDAgPSBiaXRzLk11bDY0KHEyLCBtWzBdKQoJcjIsIGMgPSBiaXRzLkFkZDY0KHIyLCB0MCwgYykKCXIzLCBjID0gYml0cy5BZGQ2NChyMywgdDEsIGMpCglfLCB0MCA9IGJpdHMuTXVsNjQocTQsIG1bMF0pCglyNCwgXyA9IGJpdHMuQWRkNjQocjQsIHQwLCBjKQoKCXQxLCB0MCA9IGJpdHMuTXVsNjQocTEsIG1bMF0pCglyMSwgYyA9IGJpdHMuQWRkNjQocjEsIHQwLCAwKQoJcjIsIGMgPSBiaXRzLkFkZDY0KHIyLCB0MSwgYykKCXQxLCB0MCA9IGJpdHMuTXVsNjQocTMsIG1bMF0pCglyMywgYyA9IGJpdHMuQWRkNjQocjMsIHQwLCBjKQoJcjQsIF8gPSBiaXRzLkFkZDY0KHI0LCB0MSwgYykKCgkvLyByID0gcjEgLSByMgoKCXZhciBiIHVpbnQ2NAoKCXIwLCBiID0gYml0cy5TdWI2NCh4MCwgcjAsIDApCglyMSwgYiA9IGJpdHMuU3ViNjQoeDEsIHIxLCBiKQoJcjIsIGIgPSBiaXRzLlN1YjY0KHgyLCByMiwgYikKCXIzLCBiID0gYml0cy5TdWI2NCh4MywgcjMsIGIpCglyNCwgYiA9IGJpdHMuU3ViNjQoeDQsIHI0LCBiKQoKCS8vIGlmIHI8MCB0aGVuIHIrPW0KCglpZiBiICE9IDAgewoJCXIwLCBjID0gYml0cy5BZGQ2NChyMCwgbVswXSwgMCkKCQlyMSwgYyA9IGJpdHMuQWRkNjQocjEsIG1bMV0sIGMpCgkJcjIsIGMgPSBiaXRzLkFkZDY0KHIyLCBtWzJdLCBjKQoJCXIzLCBjID0gYml0cy5BZGQ2NChyMywgbVszXSwgYykKCQlyNCwgXyA9IGJpdHMuQWRkNjQocjQsIDAsIGMpCgl9CgoJLy8gd2hpbGUgKHI+PW0pIHItPW0KCglmb3IgewoJCS8vIHEgPSByIC0gbQoJCXEwLCBiID0gYml0cy5TdWI2NChyMCwgbVswXSwgMCkKCQlxMSwgYiA9IGJpdHMuU3ViNjQocjEsIG1bMV0sIGIpCgkJcTIsIGIgPSBiaXRzLlN1YjY0KHIyLCBtWzJdLCBiKQoJCXEzLCBiID0gYml0cy5TdWI2NChyMywgbVszXSwgYikKCQlxNCwgYiA9IGJpdHMuU3ViNjQocjQsIDAsIGIpCgoJCS8vIGlmIGJvcnJvdyBicmVhawoJCWlmIGIgIT0gMCB7CgkJCWJyZWFrCgkJfQoKCQkvLyByID0gcQoJCXI0LCByMywgcjIsIHIxLCByMCA9IHE0LCBxMywgcTIsIHExLCBxMAoJfQoKCXpbM10sIHpbMl0sIHpbMV0sIHpbMF0gPSByMywgcjIsIHIxLCByMAoKCXJldHVybiB6Cn0KGptBCgt1aW50MjU2LmdubxKLQXBhY2thZ2UgdWludDI1NgoKaW1wb3J0ICgKCSJlcnJvcnMiCgkibWF0aC9iaXRzIgoJInN0cmNvbnYiCikKCmNvbnN0IEVyckJpZzI1NlJhbmdlID0gImRlY2ltYWwgbnVtYmVyID4gMjU2IGJpdHMiCgovLyBVaW50IHJlcHJlc2VudHMgYSAyNTYtYml0IHVuc2lnbmVkIGludGVnZXIuCi8vIEl0IGlzIHN0b3JlZCBhcyBhbiBhcnJheSBvZiA0IHVpbnQ2NCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLAovLyB3aGVyZSBhcnJbMF0gaXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IGFuZCBhcnJbM10gaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQuCnR5cGUgVWludCBbNF11aW50NjQKCi8vIE5ld1VpbnQgcmV0dXJucyBhIG5ldyBVaW50IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHVpbnQ2NCB2YWx1ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHZhbDogdGhlIGluaXRpYWwgdWludDY0IHZhbHVlCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IGEgbmV3IFVpbnQgaW5pdGlhbGl6ZWQgdG8gdmFsCmZ1bmMgTmV3VWludCh2YWwgdWludDY0KSAqVWludCB7CglyZXR1cm4gJlVpbnR7dmFsLCAwLCAwLCAwfQp9CgovLyBOZXdVaW50RnJvbUludDY0IHJldHVybnMgYSBuZXcgVWludCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiBpbnQ2NCB2YWx1ZS4KLy8gUGFuaWNzIGlmIHZhbCBpcyBuZWdhdGl2ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHZhbDogdGhlIGluaXRpYWwgbm9uLW5lZ2F0aXZlIGludDY0IHZhbHVlOyBhIG5lZ2F0aXZlIHZhbHVlIHBhbmljcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiBhIG5ldyBVaW50IGluaXRpYWxpemVkIHRvIHZhbApmdW5jIE5ld1VpbnRGcm9tSW50NjQodmFsIGludDY0KSAqVWludCB7CglpZiB2YWwgPCAwIHsKCQlwYW5pYygidmFsIGlzIG5lZ2F0aXZlIikKCX0KCXJldHVybiAmVWludHt1aW50NjQodmFsKSwgMCwgMCwgMH0KfQoKLy8gWmVybyByZXR1cm5zIGEgbmV3IFVpbnQgd2l0aCB2YWx1ZSAwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiBhIG5ldyB6ZXJvLXZhbHVlZCBVaW50CmZ1bmMgWmVybygpICpVaW50IHsKCXJldHVybiAmVWludHswLCAwLCAwLCAwfQp9CgovLyBPbmUgcmV0dXJucyBhIG5ldyBVaW50IHdpdGggdmFsdWUgMS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogYSBuZXcgVWludCBjb250YWluaW5nIG9uZQpmdW5jIE9uZSgpICpVaW50IHsKCXJldHVybiAmVWludHsxLCAwLCAwLCAwfQp9CgovLyBNYXhVaW50MjU2IHJldHVybnMgdGhlIG1heGltdW0gMjU2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICgyXjI1Ni0xKS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogYSBuZXcgVWludCBjb250YWluaW5nIDJeMjU2LTEKZnVuYyBNYXhVaW50MjU2KCkgKlVpbnQgewoJcmV0dXJuICZVaW50ezE4NDQ2NzQ0MDczNzA5NTUxNjE1LCAxODQ0Njc0NDA3MzcwOTU1MTYxNSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1fQp9CgovLyBTZXRBbGxPbmUgc2V0cyB6IHRvIHRoZSBtYXhpbXVtIDI1Ni1iaXQgdmFsdWUgKGFsbCBiaXRzIHNldCB0byAxKSBhbmQgcmV0dXJucyB6LgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIHNldHRpbmcgZXZlcnkgYml0IHRvIG9uZQpmdW5jICh6ICpVaW50KSBTZXRBbGxPbmUoKSAqVWludCB7Cgl6WzNdLCB6WzJdLCB6WzFdLCB6WzBdID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1LCAxODQ0Njc0NDA3MzcwOTU1MTYxNSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUKCXJldHVybiB6Cn0KCi8vIFNldCBzZXRzIHogdG8geCBhbmQgcmV0dXJucyB6LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0geDogdGhlIFVpbnQgdmFsdWUgY29waWVkIGludG8gegovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGFmdGVyIGNvcHlpbmcgeApmdW5jICh6ICpVaW50KSBTZXQoeCAqVWludCkgKlVpbnQgewoJKnogPSAqeAoJcmV0dXJuIHoKfQoKLy8gU2V0T25lIHNldHMgeiB0byAxIGFuZCByZXR1cm5zIHouCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IHogYWZ0ZXIgc2V0dGluZyBpdCB0byBvbmUKZnVuYyAoeiAqVWludCkgU2V0T25lKCkgKlVpbnQgewoJelszXSwgelsyXSwgelsxXSwgelswXSA9IDAsIDAsIDAsIDEKCXJldHVybiB6Cn0KCi8vIFNldEZyb21EZWNpbWFsIHNldHMgeiBmcm9tIGEgZGVjaW1hbCBzdHJpbmcgYW5kIHJldHVybnMgYW4gZXJyb3IgaWYgaW52YWxpZC4KLy8gQWNjZXB0cyBhbiBvcHRpb25hbCBsZWFkaW5nICIrIiBzaWduIGJ1dCByZWplY3RzIHVuZGVyc2NvcmVzIGFuZCBuZWdhdGl2ZSB2YWx1ZXMuCi8vIFJldHVybnMgRXJyQmlnMjU2UmFuZ2UgaWYgdGhlIG51bWJlciBleGNlZWRzIDI1NiBiaXRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gczogdGhlIGRlY2ltYWwgdGV4dCB0byBwYXJzZTsgYSBsZWFkaW5nICsgaXMgYWNjZXB0ZWQsIHdoaWxlIG5lZ2F0aXZlcyBhbmQgdW5kZXJzY29yZXMgYXJlIHJlamVjdGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCBvbiBzdWNjZXNzOyBvdGhlcndpc2UgdGhlIHBhcnNlIG9yIHJhbmdlIGVycm9yCmZ1bmMgKHogKlVpbnQpIFNldEZyb21EZWNpbWFsKHMgc3RyaW5nKSAoZXJyIGVycm9yKSB7CglzTGVuIDo9IGxlbihzKQoJLy8gUmVtb3ZlIG1heCBvbmUgbGVhZGluZyArCglpZiBzTGVuID4gMCAmJiBzWzBdID09ICcrJyB7CgkJcyA9IHNbMTpdCgkJc0xlbi0tCgl9CgkvLyBSZW1vdmUgYW55IG51bWJlciBvZiBsZWFkaW5nIHplcm9lcwoJaWYgc0xlbiA+IDAgJiYgc1swXSA9PSAnMCcgewoJCXZhciBpIGludAoJCXZhciBjIHJ1bmUKCQlmb3IgaSwgYyA9IHJhbmdlIHMgewoJCQlpZiBjICE9ICcwJyB7CgkJCQlicmVhawoJCQl9CgkJfQoJCXMgPSBzW2k6XQoJCXNMZW4gPSBsZW4ocykKCX0KCgkvLyBtYXhVaW50MjU2U3RyIGlzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1heGltdW0gdWludDI1NiB2YWx1ZS4KCW1heFVpbnQyNTZTdHIgOj0gIjExNTc5MjA4OTIzNzMxNjE5NTQyMzU3MDk4NTAwODY4NzkwNzg1MzI2OTk4NDY2NTY0MDU2NDAzOTQ1NzU4NDAwNzkxMzEyOTYzOTkzNSIKCgltYXhMZW4gOj0gbGVuKG1heFVpbnQyNTZTdHIpCglpZiBzTGVuIDwgbWF4TGVuIHsKCQlyZXR1cm4gei5mcm9tRGVjaW1hbChzKQoJfQoJaWYgc0xlbiA9PSBtYXhMZW4gewoJCWlmIHMgPiBtYXhVaW50MjU2U3RyIHsKCQkJcmV0dXJuIGVycm9ycy5OZXcoRXJyQmlnMjU2UmFuZ2UpCgkJfQoJCXJldHVybiB6LmZyb21EZWNpbWFsKHMpCgl9CglyZXR1cm4gZXJyb3JzLk5ldyhFcnJCaWcyNTZSYW5nZSkKfQoKLy8gRnJvbURlY2ltYWwgY3JlYXRlcyBhIG5ldyBVaW50IGZyb20gYSBkZWNpbWFsIHN0cmluZy4KLy8gUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMjU2IGJpdHMgb3IgaXMgaW52YWxpZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlY2ltYWw6IHRoZSBkZWNpbWFsIHRleHQgcmVwcmVzZW50aW5nIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIHdpdGhpbiAyNTYgYml0cwovLwovLyBSZXR1cm5zOgovLyAgIC0gdmFsdWU6IGEgbmV3IHBhcnNlZCBVaW50LCBvciBuaWwgb24gZXJyb3IKLy8gICAtIGVycjogbmlsIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSBhbiBpbnZhbGlkLWZvcm1hdCBvciAyNTYtYml0LXJhbmdlIGVycm9yCmZ1bmMgRnJvbURlY2ltYWwoZGVjaW1hbCBzdHJpbmcpICgqVWludCwgZXJyb3IpIHsKCXZhciB6IFVpbnQKCWlmIGVyciA6PSB6LlNldEZyb21EZWNpbWFsKGRlY2ltYWwpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCXJldHVybiAmeiwgbmlsCn0KCi8vIE11c3RGcm9tRGVjaW1hbCBjcmVhdGVzIGEgbmV3IFVpbnQgZnJvbSBhIGRlY2ltYWwgc3RyaW5nLgovLyBQYW5pY3MgaWYgdGhlIHN0cmluZyBpcyBpbnZhbGlkIG9yIHRoZSBudW1iZXIgZXhjZWVkcyAyNTYgYml0cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlY2ltYWw6IHRoZSBkZWNpbWFsIHRleHQgcmVwcmVzZW50aW5nIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIHdpdGhpbiAyNTYgYml0cwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiBhIG5ldyBwYXJzZWQgVWludDsgaW52YWxpZCBvciBvdXQtb2YtcmFuZ2UgaW5wdXQgcGFuaWNzCmZ1bmMgTXVzdEZyb21EZWNpbWFsKGRlY2ltYWwgc3RyaW5nKSAqVWludCB7Cgl2YXIgeiBVaW50CglpZiBlcnIgOj0gei5TZXRGcm9tRGVjaW1hbChkZWNpbWFsKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuICZ6Cn0KCi8vIG11bHRpcGxpZXJzIGhvbGRzIHRoZSB2YWx1ZXMgdGhhdCBhcmUgbmVlZGVkIGZvciBmcm9tRGVjaW1hbAp2YXIgbXVsdGlwbGllcnMgPSBbNV1VaW50ewoJezAsIDAsIDAsIDB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgKG5vIG11bHRpcGxpY2F0aW9uIG5lZWRlZCBpbiB0aGUgZmlyc3Qgcm91bmQpCgl7MTAwMDAwMDAwMDAwMDAwMDAwMDAsIDAsIDAsIDB9LCAgICAgICAgICAgICAgICAgLy8gMTAgXiAxOQoJezY4NzM5OTU1MTQwMDY3MzI4MCwgNTQyMTAxMDg2MjQyNzUyMjE3MCwgMCwgMH0sIC8vIDEwIF4gMzgKCXs1MzMyMjYxOTU4ODA2NjY3MjY0LCAxNzAwNDk3MTMzMTkxMTYwNDg2NywgMjkzODczNTg3NzA1NTcxODc2OSwgMH0sIC8vIDEwIF4gNTcKCXswLCA4NjA3OTY4NzE5MTk5ODY2ODgwLCA1MzI3NDkzMDYzNjc5MTIzMTMsIDE1OTMwOTE5MTExMzI0NTIyNzd9LCAgIC8vIDEwIF4gNzYKfQoKLy8gZnJvbURlY2ltYWwgcGFyc2VzIGEgZGVjaW1hbCBzdHJpbmcgYnkgcHJvY2Vzc2luZyBpdCBpbiAxOS1jaGFyYWN0ZXIgY2h1bmtzLgovLyBFYWNoIGNodW5rIGlzIG11bHRpcGxpZWQgYnkgdGhlIGFwcHJvcHJpYXRlIHBvd2VyIG9mIDEwIGFuZCBhY2N1bXVsYXRlZC4KZnVuYyAoeiAqVWludCkgZnJvbURlY2ltYWwoYnMgc3RyaW5nKSBlcnJvciB7CgkvLyBmaXJzdCBjbGVhciB0aGUgaW5wdXQKCXouQ2xlYXIoKQoJLy8gdGhlIG1heGltdW0gdmFsdWUgb2YgdWludDY0IGlzIDE4NDQ2NzQ0MDczNzA5NTUxNjE1LCB3aGljaCBpcyAyMCBjaGFyYWN0ZXJzCgkvLyBvbmUgbGVzcyBtZWFucyB0aGF0IGEgc3RyaW5nIG9mIDE5IDkncyBpcyBhbHdheXMgd2l0aGluIHRoZSB1aW50NjQgbGltaXQKCXZhciAoCgkJbnVtICAgICAgIHVpbnQ2NAoJCWVyciAgICAgICBlcnJvcgoJCXJlbWFpbmluZyA9IGxlbihicykKCSkKCWlmIHJlbWFpbmluZyA9PSAwIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygiRU9GIikKCX0KCgkvLyBXZSBwcm9jZWVkIGluIHN0ZXBzIG9mIDE5IGNoYXJhY3RlcnMgKG5pYmJsZXMpLCBmcm9tIGxlYXN0IHNpZ25pZmljYW50IHRvIG1vc3Qgc2lnbmlmaWNhbnQuCgkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpcnN0ICh1cCB0bykgMTkgY2hhcmFjdGVycyBkbyBub3QgbmVlZCB0byBiZSBtdWx0aXBsaWVkLgoJLy8gSW4gdGhlIHNlY29uZCBpdGVyYXRpb24sIG91ciBzbGljZSBvZiAxOSBjaGFyYWN0ZXJzIG5lZWRzIHRvIGJlIG11bHRpcGxpZWQKCS8vIGJ5IGEgZmFjdG9yIG9mIDEwXjE5LiBFdCBjZXRlcmEuCglmb3IgaSA6PSByYW5nZSBtdWx0aXBsaWVycyB7CgkJaWYgcmVtYWluaW5nIDw9IDAgewoJCQlyZXR1cm4gbmlsIC8vIERvbmUKCQl9CgkJaWYgcmVtYWluaW5nID4gMTkgewoJCQludW0sIGVyciA9IHN0cmNvbnYuUGFyc2VVaW50KGJzW3JlbWFpbmluZy0xOTpyZW1haW5pbmddLCAxMCwgNjQpCgkJfSBlbHNlIHsKCQkJLy8gRmluYWwgcm91bmQKCQkJbnVtLCBlcnIgPSBzdHJjb252LlBhcnNlVWludChicywgMTAsIDY0KQoJCX0KCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCQkvLyBhZGQgdGhhdCBudW1iZXIgdG8gb3VyIHJ1bm5pbmcgdG90YWwKCQlpZiBpID09IDAgewoJCQl6LlNldFVpbnQ2NChudW0pCgkJfSBlbHNlIHsKCQkJYmFzZSA6PSAmVWludHt1aW50NjQobnVtKSwgMCwgMCwgMH0KCQkJLy8gQ2hlY2sgZm9yIG92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uCgkJCWJhc2UsIG92ZXJmbG93IDo9IGJhc2UuTXVsT3ZlcmZsb3coYmFzZSwgJm11bHRpcGxpZXJzW2ldKQoJCQlpZiBvdmVyZmxvdyB7CgkJCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJCaWcyNTZSYW5nZSkKCQkJfQoJCQkvLyBDaGVjayBmb3Igb3ZlcmZsb3cgaW4gYWRkaXRpb24KCQkJYmFzZSwgb3ZlcmZsb3cgPSBiYXNlLkFkZE92ZXJmbG93KGJhc2UsIHopCgkJCWlmIG92ZXJmbG93IHsKCQkJCXJldHVybiBlcnJvcnMuTmV3KEVyckJpZzI1NlJhbmdlKQoJCQl9CgkJCXouU2V0KGJhc2UpCgkJfQoJCS8vIENob3Agb2ZmIGFub3RoZXIgMTkgY2hhcmFjdGVycwoJCWlmIHJlbWFpbmluZyA+IDE5IHsKCQkJYnMgPSBic1swIDogcmVtYWluaW5nLTE5XQoJCX0KCQlyZW1haW5pbmcgLT0gMTkKCX0KCXJldHVybiBuaWwKfQoKLy8gQnl0ZSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYnl0ZSBhdCBwb3NpdGlvbiBuIGFzIGEgVWludC4KLy8gUG9zaXRpb24gbiBpcyBjb3VudGVkIGZyb20gdGhlIGxlZnQgKDAgPSBtb3N0IHNpZ25pZmljYW50IGJ5dGUpLgovLyBSZXR1cm5zIDAgaWYgbiA+PSAzMi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG46IHRoZSB6ZXJvLWJhc2VkIGJ5dGUgcG9zaXRpb24gY291bnRlZCBmcm9tIHRoZSBtb3N0LXNpZ25pZmljYW50IGJ5dGU7IHBvc2l0aW9ucyAzMiBhbmQgYWJvdmUgeWllbGQgemVybwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiB6IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIGJ5dGUgYXMgYSBVaW50LCBvciB6ZXJvIHdoZW4gbiBpcyBvdXRzaWRlIHRoZSAzMi1ieXRlIHZhbHVlCmZ1bmMgKHogKlVpbnQpIEJ5dGUobiAqVWludCkgKlVpbnQgewoJLy8gaW4geiwgelswXSBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKCWlmIG51bWJlciwgb3ZlcmZsb3cgOj0gbi5VaW50NjRXaXRoT3ZlcmZsb3coKTsgIW92ZXJmbG93IHsKCQlpZiBudW1iZXIgPCAzMiB7CgkJCW51bWJlciA6PSB6WzQtMS1udW1iZXIvOF0KCQkJb2Zmc2V0IDo9IChuWzBdICYgMHg3KSA8PCAzIC8vIDgqKG4uZCAlIDgpCgkJCXpbMF0gPSAobnVtYmVyICYgKDB4ZmYwMDAwMDAwMDAwMDAwMCA+PiBvZmZzZXQpKSA+PiAoNTYgLSBvZmZzZXQpCgkJCXpbM10sIHpbMl0sIHpbMV0gPSAwLCAwLCAwCgkJCXJldHVybiB6CgkJfQoJfQoKCXJldHVybiB6LkNsZWFyKCkKfQoKLy8gQml0TGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB6LgovLyBCaXRMZW4oMCkgcmV0dXJucyAwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYml0czogdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIHosIHdpdGggemVybyByZXByZXNlbnRlZCBieSAwCmZ1bmMgKHogKlVpbnQpIEJpdExlbigpIGludCB7Cglzd2l0Y2ggewoJY2FzZSB6WzNdICE9IDA6CgkJcmV0dXJuIDE5MiArIGJpdHMuTGVuNjQoelszXSkKCWNhc2UgelsyXSAhPSAwOgoJCXJldHVybiAxMjggKyBiaXRzLkxlbjY0KHpbMl0pCgljYXNlIHpbMV0gIT0gMDoKCQlyZXR1cm4gNjQgKyBiaXRzLkxlbjY0KHpbMV0pCglkZWZhdWx0OgoJCXJldHVybiBiaXRzLkxlbjY0KHpbMF0pCgl9Cn0KCi8vIEJ5dGVMZW4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB6LgovLyBCeXRlTGVuKDApIHJldHVybnMgMC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJ5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byByZXByZXNlbnQgeiwgd2l0aCB6ZXJvIHJlcHJlc2VudGVkIGJ5IDAKZnVuYyAoeiAqVWludCkgQnl0ZUxlbigpIGludCB7CglyZXR1cm4gKHouQml0TGVuKCkgKyA3KSAvIDgKfQoKLy8gQ2xlYXIgc2V0cyB6IHRvIDAgYW5kIHJldHVybnMgei4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogeiBhZnRlciBzZXR0aW5nIGl0IHRvIHplcm8KZnVuYyAoeiAqVWludCkgQ2xlYXIoKSAqVWludCB7Cgl6WzNdLCB6WzJdLCB6WzFdLCB6WzBdID0gMCwgMCwgMCwgMAoJcmV0dXJuIHoKfQoKLy8gQ2xvbmUgcmV0dXJucyBhIG5ldyBVaW50IHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgei4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogYSBuZXdseSBhbGxvY2F0ZWQgVWludCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHoKZnVuYyAoeiAqVWludCkgQ2xvbmUoKSAqVWludCB7Cgl2YXIgeCBVaW50Cgl4WzBdID0gelswXQoJeFsxXSA9IHpbMV0KCXhbMl0gPSB6WzJdCgl4WzNdID0gelszXQoKCXJldHVybiAmeAp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBISCMrJrnQSCzEyMjAxN3Vnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAwSc1QTD4tI6os8LnebKOB+i6fWXOKGBf9lRpSI1wrrhEkBm6lMrt7YMmJlSH0lpVz5qGgSukeJrwVRZdoo/UIkDH08Ut/7PHeNEy/12KOs5G5/lT8MVOMulmamezc0KqwsvGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data