Transaction executed successfully

Transaction Details

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

Transaction hash
79835747FD7CF285FD84B8E38A3B189457A7AD740C7F5366BCB4C8F68FE58B19

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
90,427,984
Requested gas limit
GAS USED
75,356,683
Gas consumed
FEE
90428ugnot
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

CobQAwoML3ZtLm1fYWRkcGtnEvTPAwooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLGzwMKB2duc21hdGgSHWduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxGvsjCglSRUFETUUubWQS7SMjIGduc21hdGgKCkNvcmUgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgZm9yIEdub1N3YXAncyBjb25jZW50cmF0ZWQgbGlxdWlkaXR5IEFNTS4KCiMjIE92ZXJ2aWV3CgpUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGZ1bmRhbWVudGFsIGNhbGN1bGF0aW9ucyBmb3IgY29uY2VudHJhdGVkIGxpcXVpZGl0eSwgaW5jbHVkaW5nIHRpY2sgY29udmVyc2lvbiwgbGlxdWlkaXR5IG1hdGggY2FsY3VsYXRpb25zLCBzcXJ0IHByaWNlIG1hdGgsIHN3YXAgY2FsY3VsYXRpb25zLCBhbmQgYml0IG1hbmlwdWxhdGlvbiB1dGlsaXRpZXMuIE9wZXJhdGlvbnMgdXNlIFE2NC45NiwgUTEyOC4xMjgsIGFuZCBRMTYwIGZpeGVkLXBvaW50IHJlcHJlc2VudGF0aW9ucyB3aGVyZSBhcHByb3ByaWF0ZS4KClRoZSBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIFVuaXN3YXAgVjMncyBtYXRoZW1hdGljYWwgbW9kZWwsIGVuc3VyaW5nIGNvbXBhdGliaWxpdHkgYW5kIGNvcnJlY3RuZXNzIGZvciBjcm9zcy1jaGFpbiBsaXF1aWRpdHkgb3BlcmF0aW9ucy4KCiMjIEZlYXR1cmVzCgotICoqQml0IE1hdGgqKjogTVNCL0xTQiBjYWxjdWxhdGlvbnMgZm9yIHRpY2sgYml0bWFwIG9wZXJhdGlvbnMKLSAqKlRpY2sgTWF0aCoqOiBUaWNrIGFuZCBRNjQuOTYgc3FydC1wcmljZSBjb252ZXJzaW9ucwotICoqTGlxdWlkaXR5IE1hdGgqKjogTGlxdWlkaXR5IGFuZCB0b2tlbiBhbW91bnQgY29udmVyc2lvbnMgZm9yIHByaWNlIHJhbmdlcwotICoqU3FydCBQcmljZSBNYXRoKio6IFRva2VuIGFtb3VudCBjb252ZXJzaW9ucyB1c2luZyBRNjQuOTYgZm9ybWF0Ci0gKipTd2FwIE1hdGgqKjogU2luZ2xlLXN0ZXAgc3dhcCBjYWxjdWxhdGlvbnMgd2l0aCBmZWUgaGFuZGxpbmcKLSAqKk92ZXJmbG93IFByb3RlY3Rpb24qKjogQnVpbHQtaW4gaW50MjU2IG92ZXJmbG93IGRldGVjdGlvbgotICoqUm91bmRpbmcgQ29udHJvbCoqOiBDb25maWd1cmFibGUgcm91bmRpbmcgZm9yIEFNTSBzYWZldHkKCiMjIENvcmUgQ29uY2VwdHMKCiMjIyBROTYgRml4ZWQtUG9pbnQgRm9ybWF0CgpTcXVhcmUgcm9vdCBwcmljZXMgdXNlIFE2NC45NiByZXByZXNlbnRhdGlvbjoKLSBgc3FydFByaWNlWDk2ID0gc3FydCh0b2tlbjEvdG9rZW4wKSAqIDJeOTZgCi0gRW5hYmxlcyBwcmVjaXNlIGludGVnZXIgYXJpdGhtZXRpYyB3aXRob3V0IGZsb2F0aW5nLXBvaW50CgojIyMgUm91bmRpbmcgRGlyZWN0aW9ucwoKLSAqKlJvdW5kIFVQKio6IEFtb3VudHMgb3dlZCBUTyBwb29sIChkZXBvc2l0cywgZXhhY3QgaW5wdXQpCi0gKipSb3VuZCBET1dOKio6IEFtb3VudHMgb3dlZCBGUk9NIHBvb2wgKHdpdGhkcmF3YWxzLCBleGFjdCBvdXRwdXQpCgojIyBVc2FnZQoKYGBgZ28KcGFja2FnZSBtYWluCgppbXBvcnQgKAogICAgImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgogICAgaTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL2ludDI1Ni92MSIKICAgIHUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgopCgpmdW5jIG1haW4oKSB7CiAgICAvLyBDYWxjdWxhdGUgdG9rZW4gYW1vdW50cyBmb3IgYSBzaWduZWQgbGlxdWlkaXR5IGNoYW5nZS4KICAgIHNxcnRQcmljZUEgOj0gdTI1Ni5NdXN0RnJvbURlY2ltYWwoIjc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2IikKICAgIHNxcnRQcmljZUIgOj0gdTI1Ni5NdXN0RnJvbURlY2ltYWwoIjc5NjI1Mjc1NDI2NTI0NzQ4Nzk2MzMwNTU2MTI4IikKICAgIGxpcXVpZGl0eURlbHRhIDo9IGkyNTYuTXVzdEZyb21EZWNpbWFsKCIxMDAwMDAwMDAwMDAwMDAwMDAwIikKICAgIGFtb3VudDAgOj0gZ25zbWF0aC5HZXRBbW91bnQwRGVsdGEoc3FydFByaWNlQSwgc3FydFByaWNlQiwgbGlxdWlkaXR5RGVsdGEpCiAgICBhbW91bnQxIDo9IGduc21hdGguR2V0QW1vdW50MURlbHRhKHNxcnRQcmljZUEsIHNxcnRQcmljZUIsIGxpcXVpZGl0eURlbHRhKQogICAgcHJpbnRsbihhbW91bnQwLlRvU3RyaW5nKCksIGFtb3VudDEuVG9TdHJpbmcoKSkKCiAgICAvLyBRNjQuOTYgcHJpY2VzIGFuZCBhIHBvc2l0aXZlIGFtb3VudCByZW1haW5pbmcgc2VsZWN0IGV4YWN0IGlucHV0LgogICAgZmVlUGlwcyA6PSB1aW50NjQoMzAwMCkgLy8gMC4zJQogICAgY3VycmVudFByaWNlIDo9IHUyNTYuTXVzdEZyb21EZWNpbWFsKCI3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNiIpCiAgICB0YXJnZXRQcmljZSA6PSB1MjU2Lk11c3RGcm9tRGVjaW1hbCgiMTU4NDU2MzI1MDI4NTI4Njc1MTg3MDg3OTAwNjcyIikKICAgIGxpcXVpZGl0eSA6PSB1MjU2Lk11c3RGcm9tRGVjaW1hbCgiMTAwMDAwMDAwMDAwMDAwMDAwMCIpCiAgICBhbW91bnRSZW1haW5pbmcgOj0gaTI1Ni5NdXN0RnJvbURlY2ltYWwoIjEwMDAwMDAiKQogICAgc3FydFByaWNlTmV4dCwgYW1vdW50SW4sIGFtb3VudE91dCwgZmVlQW1vdW50IDo9IGduc21hdGguU3dhcE1hdGhDb21wdXRlU3dhcFN0ZXAoCiAgICAgICAgY3VycmVudFByaWNlLCB0YXJnZXRQcmljZSwgbGlxdWlkaXR5LCBhbW91bnRSZW1haW5pbmcsIGZlZVBpcHMsCiAgICApCiAgICBwcmludGxuKHNxcnRQcmljZU5leHQuVG9TdHJpbmcoKSwgYW1vdW50SW4uVG9TdHJpbmcoKSwgYW1vdW50T3V0LlRvU3RyaW5nKCksIGZlZUFtb3VudC5Ub1N0cmluZygpKQoKICAgIHRpY2tCaXRtYXAgOj0gdTI1Ni5OZXdVaW50KDB4RkYwMCkKICAgIHByaW50bG4oZ25zbWF0aC5CaXRNYXRoTW9zdFNpZ25pZmljYW50Qml0KHRpY2tCaXRtYXApKSAvLyAxNQogICAgcHJpbnRsbihnbnNtYXRoLkJpdE1hdGhMZWFzdFNpZ25pZmljYW50Qml0KHRpY2tCaXRtYXApKSAvLyA4Cn0KYGBgCgojIyBBUEkKCiMjIyBCaXQgTWF0aAoKLSBgQml0TWF0aE1vc3RTaWduaWZpY2FudEJpdCh4ICp1MjU2LlVpbnQpIHVpbnQ4YCAtIEZpbmQgTVNCIHBvc2l0aW9uICgwLTI1NSkKLSBgQml0TWF0aExlYXN0U2lnbmlmaWNhbnRCaXQoeCAqdTI1Ni5VaW50KSB1aW50OGAgLSBGaW5kIExTQiBwb3NpdGlvbiAoMC0yNTUpCgojIyMgVGljayBNYXRoCgotIGBUaWNrTWF0aEdldFNxcnRSYXRpb0F0VGljayh0aWNrIGludDMyKSAqdTI1Ni5VaW50YCAtIENvbnZlcnQgdGljayB0byBRNjQuOTYgc3FydCBwcmljZQotIGBUaWNrTWF0aEdldFRpY2tBdFNxcnRSYXRpbyhzcXJ0UHJpY2VYOTYgKnUyNTYuVWludCkgaW50MzJgIC0gQ29udmVydCBhIFE2NC45NiBzcXJ0IHByaWNlIHRvIHRpY2s7IGFjY2VwdHMgYFtNaW5TcXJ0UmF0aW8sIE1heFNxcnRSYXRpbylgCgojIyMgTGlxdWlkaXR5IE1hdGgKCi0gYEdldExpcXVpZGl0eUZvckFtb3VudHMoc3FydFJhdGlvWDk2LCBzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBhbW91bnQwLCBhbW91bnQxICp1MjU2LlVpbnQpICp1MjU2LlVpbnRgCiAgLSBDYWxjdWxhdGUgbWF4IGxpcXVpZGl0eSBmcm9tIHRva2VuIGFtb3VudHMgYW5kIHByaWNlIHJhbmdlCi0gYEdldEFtb3VudHNGb3JMaXF1aWRpdHkoc3FydFJhdGlvWDk2LCBzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBsaXF1aWRpdHkgKnUyNTYuVWludCkgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQpYAogIC0gQ2FsY3VsYXRlIHRva2VuIGFtb3VudHMgcmVwcmVzZW50ZWQgYnkgbGlxdWlkaXR5IGFuZCBwcmljZSByYW5nZQotIGBMaXF1aWRpdHlNYXRoQWRkRGVsdGEoeCAqdTI1Ni5VaW50LCB5ICppMjU2LkludCkgKnUyNTYuVWludGAKICAtIEFwcGx5IHNpZ25lZCBsaXF1aWRpdHkgZGVsdGE7IHRoZSByZXN1bHQgaXMgYm91bmRlZCBieSBgTWF4VWludDEyOGAgYW5kIHBhbmljcyBpZiBpdCBleGNlZWRzIHRoYXQgYm91bmQKCiMjIyBTcXJ0IFByaWNlIE1hdGgKCi0gYEdldEFtb3VudDBEZWx0YShzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2ICp1MjU2LlVpbnQsIGxpcXVpZGl0eSAqaTI1Ni5JbnQpICppMjU2LkludGAKICAtIENhbGN1bGF0ZSB0b2tlbjAgYW1vdW50IGFzIGBsaXF1aWRpdHkgKiAoMS/iiJpQYSAtIDEv4oiaUGIpYCBhZnRlciBvcmRlcmluZyB0aGUgcmF0aW9zOyBRNjQuOTYgc2NhbGluZyBhbmQgcm91bmRpbmcgYXJlIGFwcGxpZWQKLSBgR2V0QW1vdW50MURlbHRhKHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYgKnUyNTYuVWludCwgbGlxdWlkaXR5ICppMjU2LkludCkgKmkyNTYuSW50YAogIC0gQ2FsY3VsYXRlIHRva2VuMSBhbW91bnQgYXMgYGxpcXVpZGl0eSAqICjiiJpQYiAtIOKImlBhKSAvIDJeOTZgIGFmdGVyIG9yZGVyaW5nIHRoZSByYXRpb3M7IHJvdW5kaW5nIGRlcGVuZHMgb24gdGhlIHNpZ24gb2YgbGlxdWlkaXR5CgojIyMgU3dhcCBNYXRoCgotIGBTd2FwTWF0aENvbXB1dGVTd2FwU3RlcChzcXJ0UmF0aW9DdXJyZW50WDk2LCBzcXJ0UmF0aW9UYXJnZXRYOTYsIGxpcXVpZGl0eSAqdTI1Ni5VaW50LCBhbW91bnRSZW1haW5pbmcgKmkyNTYuSW50LCBmZWVQaXBzIHVpbnQ2NCkgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQsICp1MjU2LlVpbnQsICp1MjU2LlVpbnQpYAogIC0gUmV0dXJuczogKG5leHRTcXJ0UHJpY2UsIGFtb3VudEluLCBhbW91bnRPdXQsIGZlZUFtb3VudCkKICAtIEhhbmRsZXMgYm90aCBleGFjdCBpbnB1dCBhbmQgZXhhY3Qgb3V0cHV0IHN3YXBzChrzCgoMYml0X21hdGguZ25vEuIKcGFja2FnZSBnbnNtYXRoCgppbXBvcnQgKAoJIm1hdGgvYml0cyIKCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKLy8gQml0TWF0aE1vc3RTaWduaWZpY2FudEJpdCByZXR1cm5zIHRoZSAwLWJhc2VkIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB4LgovLyBUaGlzIGZ1bmN0aW9uIGlzIGVzc2VudGlhbCBmb3IgQU1NIGNhbGN1bGF0aW9ucyBpbnZvbHZpbmcgcHJpY2UgcmFuZ2VzIGFuZCB0aWNrIGJvdW5kYXJpZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB4OiB0aGUgbm9uLXplcm8gdmFsdWUgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgc2V0IGJpdAovLwovLyBSZXR1cm5zOgovLyAgIC0gYml0SW5kZXg6IHRoZSB6ZXJvLWJhc2VkIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IHNldCBiaXQgKDAtMjU1KQovLwovLyBQYW5pY3MgaWYgeCBpcyB6ZXJvLgpmdW5jIEJpdE1hdGhNb3N0U2lnbmlmaWNhbnRCaXQoeCAqdTI1Ni5VaW50KSB1aW50OCB7CglpZiB4LklzWmVybygpIHsKCQlwYW5pYyhlcnJNU0JaZXJvSW5wdXQpCgl9CgoJcmV0dXJuIHVpbnQ4KHguQml0TGVuKCkgLSAxKQp9CgovLyBCaXRNYXRoTGVhc3RTaWduaWZpY2FudEJpdCByZXR1cm5zIHRoZSAwLWJhc2VkIHBvc2l0aW9uIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaW4geC4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEFNTSBjYWxjdWxhdGlvbnMgZm9yIGVmZmljaWVudCBiaXQgbWFuaXB1bGF0aW9uIGFuZCByYW5nZSBxdWVyaWVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0geDogdGhlIG5vbi16ZXJvIHZhbHVlIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBzZXQgYml0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBiaXRJbmRleDogdGhlIHplcm8tYmFzZWQgcG9zaXRpb24gb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IHNldCBiaXQgKDAtMjU1KQovLwovLyBQYW5pY3MgaWYgeCBpcyB6ZXJvLgpmdW5jIEJpdE1hdGhMZWFzdFNpZ25pZmljYW50Qml0KHggKnUyNTYuVWludCkgdWludDggewoJaWYgeC5Jc1plcm8oKSB7CgkJcGFuaWMoZXJyTFNCWmVyb0lucHV0KQoJfQoKCWlmIHhbMF0gIT0gMCB7CgkJcmV0dXJuIHVpbnQ4KGJpdHMuVHJhaWxpbmdaZXJvczY0KHhbMF0pKQoJfQoJaWYgeFsxXSAhPSAwIHsKCQlyZXR1cm4gdWludDgoNjQgKyBiaXRzLlRyYWlsaW5nWmVyb3M2NCh4WzFdKSkKCX0KCWlmIHhbMl0gIT0gMCB7CgkJcmV0dXJuIHVpbnQ4KDEyOCArIGJpdHMuVHJhaWxpbmdaZXJvczY0KHhbMl0pKQoJfQoJcmV0dXJuIHVpbnQ4KDE5MiArIGJpdHMuVHJhaWxpbmdaZXJvczY0KHhbM10pKQp9Chq5BAoKY29uc3RzLmdubxKqBHBhY2thZ2UgZ25zbWF0aAoKY29uc3QgKAoJLy8gbWluVGljayBpcyB0aGUgbWluaW11bSB2YWxpZCB0aWNrIGluZGV4IGluIHRoZSBjb25jZW50cmF0ZWQgbGlxdWlkaXR5IG1vZGVsLgoJLy8gUmVwcmVzZW50cyB0aGUgbG93ZXN0IHBvc3NpYmxlIHByaWNlOiAxLjAwMDFeKC04ODcyNzIpIOKJiCAwCgltaW5UaWNrID0gLTg4NzI3MgoKCS8vIG1heFRpY2sgaXMgdGhlIG1heGltdW0gdmFsaWQgdGljayBpbmRleCBpbiB0aGUgY29uY2VudHJhdGVkIGxpcXVpZGl0eSBtb2RlbC4KCS8vIFJlcHJlc2VudHMgdGhlIGhpZ2hlc3QgcG9zc2libGUgcHJpY2U6IDEuMDAwMV44ODcyNzIg4omIIGluZmluaXR5CgltYXhUaWNrID0gODg3MjcyCgoJUTk2X1JFU09MVVRJT04gIHVpbnQgPSA5NgoJUTE2MF9SRVNPTFVUSU9OIHVpbnQgPSAxNjAKCglNQVhfVUlOVDEyOCA9ICIzNDAyODIzNjY5MjA5Mzg0NjM0NjMzNzQ2MDc0MzE3NjgyMTE0NTUiIC8vIDJeMTI4IC0gMQoJUTk2ICAgICAgICAgPSAiNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYiICAgICAgICAgICAvLyAyXjk2CikKGs4TCgdkb2MuZ25vEsITLy8gUGFja2FnZSBnbnNtYXRoIHByb3ZpZGVzIGNvcmUgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgZm9yIEdub1N3YXAncyBjb25jZW50cmF0ZWQgbGlxdWlkaXR5IEFNTS4KLy8KLy8gIyMgT3ZlcnZpZXcKLy8KLy8gVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHRoZSBmdW5kYW1lbnRhbCBjYWxjdWxhdGlvbnMgZm9yIGNvbmNlbnRyYXRlZCBsaXF1aWRpdHksCi8vIGluY2x1ZGluZyB0aWNrIGNvbnZlcnNpb24sIGxpcXVpZGl0eSBtYXRoIGNhbGN1bGF0aW9ucywgc3FydCBwcmljZSBtYXRoLCBzd2FwCi8vIGNhbGN1bGF0aW9ucywgYW5kIGJpdCBtYW5pcHVsYXRpb24gdXRpbGl0aWVzLiBBbGwgb3BlcmF0aW9ucyB1c2UgUTY0Ljk2LAovLyBRMTI4LjEyOCwgYW5kIFExNjAgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYyB3aGVyZSBhcHByb3ByaWF0ZS4KLy8KLy8gVGhlIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgVW5pc3dhcCBWMydzIG1hdGhlbWF0aWNhbCBtb2RlbC4KLy8KLy8gIyMgRmVhdHVyZXMKLy8KLy8gICAtIEJpdCBNYXRoOiBNU0IvTFNCIGNhbGN1bGF0aW9ucyBmb3IgdGljayBiaXRtYXAgb3BlcmF0aW9ucwovLyAgIC0gVGljayBNYXRoOiB0aWNrIGFuZCBRNjQuOTYgc3FydC1wcmljZSBjb252ZXJzaW9ucwovLyAgIC0gTGlxdWlkaXR5IE1hdGg6IGxpcXVpZGl0eSBhbmQgdG9rZW4gYW1vdW50IG1hdGggZm9yIHByaWNlIHJhbmdlcwovLyAgIC0gU3FydCBQcmljZSBNYXRoOiB0b2tlbiBhbW91bnQgY29udmVyc2lvbnMgdXNpbmcgUTY0Ljk2IGZvcm1hdAovLyAgIC0gU3dhcCBNYXRoOiBzaW5nbGUtc3RlcCBzd2FwIGNhbGN1bGF0aW9ucyB3aXRoIGZlZSBoYW5kbGluZwovLyAgIC0gT3ZlcmZsb3cgUHJvdGVjdGlvbjogZXhwbGljaXQgaW50MjU2L3VpbnQyNTYgb3ZlcmZsb3cgY2hlY2tzCi8vICAgLSBSb3VuZGluZyBDb250cm9sOiBjb25maWd1cmFibGUgcm91bmRpbmcgZm9yIEFNTSBzYWZldHkKLy8KLy8gIyMgQ29yZSBDb25jZXB0cwovLwovLyAjIyMgUTY0Ljk2IEZpeGVkLVBvaW50IEZvcm1hdAovLwovLyBTcXVhcmUgcm9vdCBwcmljZXMgdXNlIFE2NC45NiByZXByZXNlbnRhdGlvbjoKLy8gICAtIHNxcnRQcmljZVg5NiA9IHNxcnQodG9rZW4xL3Rva2VuMCkgKiAyXjk2Ci8vICAgLSBFbmFibGVzIHByZWNpc2UgaW50ZWdlciBhcml0aG1ldGljIHdpdGhvdXQgZmxvYXRpbmctcG9pbnQKLy8KLy8gIyMjIFJvdW5kaW5nIERpcmVjdGlvbnMKLy8KLy8gICAtIFJvdW5kIFVQOiBhbW91bnRzIG93ZWQgVE8gcG9vbCAoZGVwb3NpdHMsIGV4YWN0IGlucHV0KQovLyAgIC0gUm91bmQgRE9XTjogYW1vdW50cyBvd2VkIEZST00gcG9vbCAod2l0aGRyYXdhbHMsIGV4YWN0IG91dHB1dCkKLy8KLy8gIyMgQVBJCi8vCi8vICMjIyBCaXQgTWF0aAovLwovLyAgIC0gQml0TWF0aE1vc3RTaWduaWZpY2FudEJpdCh4ICp1MjU2LlVpbnQpIHVpbnQ4Ci8vICAgLSBCaXRNYXRoTGVhc3RTaWduaWZpY2FudEJpdCh4ICp1MjU2LlVpbnQpIHVpbnQ4Ci8vCi8vICMjIyBUaWNrIE1hdGgKLy8KLy8gICAtIFRpY2tNYXRoR2V0U3FydFJhdGlvQXRUaWNrKHRpY2sgaW50MzIpICp1MjU2LlVpbnQKLy8gICAtIFRpY2tNYXRoR2V0VGlja0F0U3FydFJhdGlvKHNxcnRQcmljZVg5NiAqdTI1Ni5VaW50KSBpbnQzMjsgYWNjZXB0cwovLyAgICAgYFtNaW5TcXJ0UmF0aW8sIE1heFNxcnRSYXRpbylgICh0aGUgdXBwZXIgYm91bmQgaXMgZXhjbHVzaXZlKQovLwovLyAjIyMgTGlxdWlkaXR5IE1hdGgKLy8KLy8gICAtIEdldExpcXVpZGl0eUZvckFtb3VudHMoc3FydFJhdGlvWDk2LCBzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBhbW91bnQwLCBhbW91bnQxICp1MjU2LlVpbnQpICp1MjU2LlVpbnQKLy8gICAtIEdldEFtb3VudHNGb3JMaXF1aWRpdHkoc3FydFJhdGlvWDk2LCBzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBsaXF1aWRpdHkgKnUyNTYuVWludCkgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQpCi8vICAgLSBMaXF1aWRpdHlNYXRoQWRkRGVsdGEoeCAqdTI1Ni5VaW50LCB5ICppMjU2LkludCkgKnUyNTYuVWludAovLwovLyAjIyMgU3FydCBQcmljZSBNYXRoCi8vCi8vICAgLSBHZXRBbW91bnQwRGVsdGEoc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiAqdTI1Ni5VaW50LCBsaXF1aWRpdHkgKmkyNTYuSW50KSAqaTI1Ni5JbnQKLy8gICAtIEdldEFtb3VudDFEZWx0YShzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2ICp1MjU2LlVpbnQsIGxpcXVpZGl0eSAqaTI1Ni5JbnQpICppMjU2LkludAovLwovLyAjIyMgU3dhcCBNYXRoCi8vCi8vICAgLSBTd2FwTWF0aENvbXB1dGVTd2FwU3RlcChzcXJ0UmF0aW9DdXJyZW50WDk2LCBzcXJ0UmF0aW9UYXJnZXRYOTYsIGxpcXVpZGl0eSAqdTI1Ni5VaW50LCBhbW91bnRSZW1haW5pbmcgKmkyNTYuSW50LCBmZWVQaXBzIHVpbnQ2NCkgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQsICp1MjU2LlVpbnQsICp1MjU2LlVpbnQpCnBhY2thZ2UgZ25zbWF0aAoaoAsKCmVycm9ycy5nbm8SkQtwYWNrYWdlIGduc21hdGgKCmltcG9ydCAoCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0ICgKCWVyckludmFsaWRQb29sU3FydFByaWNlICAgICA9ICJpbnZhbGlkIHBvb2wgc3FydCBwcmljZSBjYWxjdWxhdGlvbjogcHJvZHVjdC9hbW91bnQgIT0gc3FydFBYOTYgb3IgbnVtZXJhdG9yMSA8PSBwcm9kdWN0IgoJZXJyU3FydFByaWNlT3ZlcmZsb3cgICAgICAgID0gInNxcnQgcHJpY2Ugb3ZlcmZsb3ciCgllcnJTcXJ0UHJpY2VFeGNlZWRzUXVvdGllbnQgPSAic3FydCBwcmljZSBleGNlZWRzIGNhbGN1bGF0ZWQgcXVvdGllbnQiCgllcnJTcXJ0UHJpY2VaZXJvICAgICAgICAgICAgPSAic3FydFBYOTYgc2hvdWxkIG5vdCBiZSB6ZXJvIgoJZXJyTGlxdWlkaXR5WmVybyAgICAgICAgICAgID0gImxpcXVpZGl0eSBzaG91bGQgbm90IGJlIHplcm8iCgllcnJTcXJ0UmF0aW9BWDk2WmVybyAgICAgICAgPSAic3FydFJhdGlvQVg5NiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIgoJZXJyQW1vdW50MERlbHRhT3ZlcmZsb3cgICAgID0gIkdldEFtb3VudDBEZWx0YTogb3ZlcmZsb3ciCgllcnJBbW91bnQxRGVsdGFPdmVyZmxvdyAgICAgPSAiR2V0QW1vdW50MURlbHRhOiBvdmVyZmxvdyIKCWVyck1TQlplcm9JbnB1dCAgICAgICAgICAgICA9ICJpbnB1dCBmb3IgTVNCIGNhbGN1bGF0aW9uIHNob3VsZCBub3QgYmUgemVybyIKCWVyckxTQlplcm9JbnB1dCAgICAgICAgICAgICA9ICJpbnB1dCBmb3IgTFNCIGNhbGN1bGF0aW9uIHNob3VsZCBub3QgYmUgemVybyIKCWVyckdldEFtb3VudDBEZWx0YU5pbElucHV0ICA9ICJHZXRBbW91bnQwRGVsdGE6IGlucHV0IHBhcmFtZXRlcnMgY2Fubm90IGJlIG5pbCIKCWVyckdldEFtb3VudDFEZWx0YU5pbElucHV0ICA9ICJHZXRBbW91bnQxRGVsdGE6IGlucHV0IHBhcmFtZXRlcnMgY2Fubm90IGJlIG5pbCIKCWVyclRpY2tNYXRoT3V0T2ZSYW5nZSAgICAgICA9ICJ0aWNrX21hdGg6IHZhbHVlIG91dCBvZiByYW5nZSIKCWVyclRpY2tNYXRoSW52YWxpZElucHV0ICAgICA9ICJ0aWNrX21hdGg6IGludmFsaWQgaW5wdXQgZGF0YSIKCWVyclRpY2tNYXRoT3ZlcmZsb3cgICAgICAgICA9ICJ0aWNrX21hdGg6IG92ZXJmbG93IgoJZXJyTGlxdWlkaXR5SWRlbnRpY2FsVGlja3MgID0gImxpcXVpZGl0eV9tYXRoOiBpZGVudGljYWwgdGlja3MiCgllcnJMaXF1aWRpdHlPdmVyZmxvdyAgICAgICAgPSAibGlxdWlkaXR5X21hdGg6IG92ZXJmbG93IgoJZXJyU2FmZU1hdGhPdmVyZmxvdyAgICAgICAgID0gInNhZmVfbWF0aDogb3ZlcmZsb3ciCikKCmZ1bmMgbmV3RXJyb3JXaXRoRGV0YWlsKGVyck1zZyBzdHJpbmcsIGRldGFpbCBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gdWZtdC5FcnJvcmYoIiVzIHx8ICVzIiwgZXJyTXNnLCBkZXRhaWwpLkVycm9yKCkKfQoaRAoLZ25vbW9kLnRvbWwSNW1vZHVsZSA9ICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKZ25vID0gIjAuOSIKGtJjChJsaXF1aWRpdHlfbWF0aC5nbm8Su2NwYWNrYWdlIGduc21hdGgKCmltcG9ydCAoCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJImduby5sYW5kL3AvZ25vc3dhcC9jb25zdHMvdjEiCglpMjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvaW50MjU2L3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIGNvbXB1dGVMaXF1aWRpdHlGb3JBbW91bnQwIGNhbGN1bGF0ZXMgdGhlIGxpcXVpZGl0eSBmb3IgYSBnaXZlbiBhbW91bnQgb2YgdG9rZW4wLgovLwovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxpcXVpZGl0eSB0aGF0IGNhbiBiZSBwcm92aWRlZCBmb3IgYHRva2VuMGAKLy8gYmFzZWQgb24gdGhlIHByb3ZpZGVkIHByaWNlIGJvdW5kYXJpZXMgKHNxcnRSYXRpb0FYOTYgYW5kIHNxcnRSYXRpb0JYOTYpIGluIFE2NC45NiBmb3JtYXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzcXJ0UmF0aW9BWDk2OiAqdTI1Ni5VaW50IC0gVGhlIHNxdWFyZSByb290IHByaWNlIGF0IHRoZSBsb3dlciB0aWNrIGJvdW5kYXJ5IChRNjQuOTYpLgovLyAgIC0gc3FydFJhdGlvQlg5NjogKnUyNTYuVWludCAtIFRoZSBzcXVhcmUgcm9vdCBwcmljZSBhdCB0aGUgdXBwZXIgdGljayBib3VuZGFyeSAoUTY0Ljk2KS4KLy8gICAtIGFtb3VudDA6ICp1MjU2LlVpbnQgLSBUaGUgYW1vdW50IG9mIHRva2VuMCB0byBiZSBjb252ZXJ0ZWQgdG8gbGlxdWlkaXR5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gKnUyNTYuVWludDogVGhlIGNhbGN1bGF0ZWQgbGlxdWlkaXR5LCByZXByZXNlbnRlZCBhcyBhbiB1bnNpZ25lZCAxMjgtYml0IGludGVnZXIgKHVpbnQxMjgpLgovLwovLyBQYW5pY3M6Ci8vICAgLSBJZiB0aGUgcmVzdWx0aW5nIGxpcXVpZGl0eSBleGNlZWRzIHRoZSB1aW50MTI4IHJhbmdlLCBgU2FmZUNvbnZlcnRUb1VpbnQxMjhgIHdpbGwgdHJpZ2dlciBhIHBhbmljLgpmdW5jIGNvbXB1dGVMaXF1aWRpdHlGb3JBbW91bnQwKHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYsIGFtb3VudDAgKnUyNTYuVWludCkgKnUyNTYuVWludCB7CglzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2ID0gdG9Bc2NlbmRpbmdPcmRlcihzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2KQoJaW50ZXJtZWRpYXRlIDo9IHUyNTYuTXVsRGl2KHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYsIGNvbnN0cy5ROTYoKSkKCglkaWZmIDo9IHUyNTYuWmVybygpLlN1YihzcXJ0UmF0aW9CWDk2LCBzcXJ0UmF0aW9BWDk2KQoJaWYgZGlmZi5Jc1plcm8oKSB7CgkJcGFuaWMobmV3RXJyb3JXaXRoRGV0YWlsKAoJCQllcnJMaXF1aWRpdHlJZGVudGljYWxUaWNrcywKCQkJdWZtdC5TcHJpbnRmKCJzcXJ0UmF0aW9BWDk2ICglcykgYW5kIHNxcnRSYXRpb0JYOTYgKCVzKSBhcmUgaWRlbnRpY2FsIiwgc3FydFJhdGlvQVg5Ni5Ub1N0cmluZygpLCBzcXJ0UmF0aW9CWDk2LlRvU3RyaW5nKCkpLAoJCSkpCgl9CglyZXMgOj0gdTI1Ni5NdWxEaXYoYW1vdW50MCwgaW50ZXJtZWRpYXRlLCBkaWZmKQoJcmV0dXJuIFNhZmVDb252ZXJ0VG9VaW50MTI4KHJlcykKfQoKLy8gY29tcHV0ZUxpcXVpZGl0eUZvckFtb3VudDEgY2FsY3VsYXRlcyBsaXF1aWRpdHkgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRva2VuMSBhbW91bnQgYW5kIHByaWNlIHJhbmdlLgovLwovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBsaXF1aWRpdHkgZm9yIGEgZ2l2ZW4gYW1vdW50IG9mIHRva2VuMSBieSB1c2luZyB0aGUgZGlmZmVyZW5jZQovLyBiZXR3ZWVuIHRoZSB1cHBlciBhbmQgbG93ZXIgc3F1YXJlIHJvb3QgcHJpY2UgcmF0aW9zLiBUaGUgY2FsY3VsYXRpb24gdXNlcyBROTYgZml4ZWQtcG9pbnQKLy8gYXJpdGhtZXRpYyB0byBtYWludGFpbiBwcmVjaXNpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzcXJ0UmF0aW9BWDk2OiAqdTI1Ni5VaW50IC0gVGhlIHNxdWFyZSByb290IHJhdGlvIG9mIHByaWNlIGF0IHRoZSBsb3dlciB0aWNrLCByZXByZXNlbnRlZCBpbiBROTYgZm9ybWF0LgovLyAgIC0gc3FydFJhdGlvQlg5NjogKnUyNTYuVWludCAtIFRoZSBzcXVhcmUgcm9vdCByYXRpbyBvZiBwcmljZSBhdCB0aGUgdXBwZXIgdGljaywgcmVwcmVzZW50ZWQgaW4gUTk2IGZvcm1hdC4KLy8gICAtIGFtb3VudDE6ICp1MjU2LlVpbnQgLSBUaGUgYW1vdW50IG9mIHRva2VuMSB0byBjYWxjdWxhdGUgbGlxdWlkaXR5IGZvci4KLy8KLy8gUmV0dXJuczoKLy8gICAtICp1MjU2LlVpbnQ6IFRoZSBjYWxjdWxhdGVkIGxpcXVpZGl0eSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYW1vdW50IG9mIHRva2VuMSBhbmQgcHJpY2UgcmFuZ2UuCi8vCi8vIE5vdGVzOgovLyAgIC0gVGhlIHJlc3VsdCBpcyBub3QgZGlyZWN0bHkgbGltaXRlZCB0byB1aW50MTI4LCBhcyBsaXF1aWRpdHkgdmFsdWVzIGNhbiBleGNlZWQgdWludDEyOCBib3VuZHMuCi8vICAgLSBJZiBgc3FydFJhdGlvQVg5NiA9PSBzcXJ0UmF0aW9CWDk2YCwgdGhlIGZ1bmN0aW9uIHdpbGwgcGFuaWMgZHVlIHRvIGRpdmlzaW9uIGJ5IHplcm8uCi8vICAgLSBROTYgaXMgYSBjb25zdGFudCByZXByZXNlbnRpbmcgYDJeOTZgLCBlbnN1cmluZyB0aGF0IHByZWNpc2lvbiBpcyBtYWludGFpbmVkIGR1cmluZyBkaXZpc2lvbi4KLy8KLy8gUGFuaWNzOgovLyAgIC0gSWYgdGhlIHJlc3VsdGluZyBsaXF1aWRpdHkgZXhjZWVkcyB0aGUgdWludDEyOCByYW5nZSwgYFNhZmVDb252ZXJ0VG9VaW50MTI4YCB3aWxsIHRyaWdnZXIgYSBwYW5pYy4KZnVuYyBjb21wdXRlTGlxdWlkaXR5Rm9yQW1vdW50MShzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBhbW91bnQxICp1MjU2LlVpbnQpICp1MjU2LlVpbnQgewoJc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiA9IHRvQXNjZW5kaW5nT3JkZXIoc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NikKCglkaWZmIDo9IHUyNTYuWmVybygpLlN1YihzcXJ0UmF0aW9CWDk2LCBzcXJ0UmF0aW9BWDk2KQoJaWYgZGlmZi5Jc1plcm8oKSB7CgkJcGFuaWMobmV3RXJyb3JXaXRoRGV0YWlsKAoJCQllcnJMaXF1aWRpdHlJZGVudGljYWxUaWNrcywKCQkJdWZtdC5TcHJpbnRmKCJzcXJ0UmF0aW9BWDk2ICglcykgYW5kIHNxcnRSYXRpb0JYOTYgKCVzKSBhcmUgaWRlbnRpY2FsIiwgc3FydFJhdGlvQVg5Ni5Ub1N0cmluZygpLCBzcXJ0UmF0aW9CWDk2LlRvU3RyaW5nKCkpLAoJCSkpCgl9CglyZXMgOj0gdTI1Ni5NdWxEaXYoYW1vdW50MSwgY29uc3RzLlE5NigpLCBkaWZmKQoJcmV0dXJuIFNhZmVDb252ZXJ0VG9VaW50MTI4KHJlcykKfQoKLy8gR2V0TGlxdWlkaXR5Rm9yQW1vdW50cyBjYWxjdWxhdGVzIHRoZSBtYXhpbXVtIGxpcXVpZGl0eSBzdXBwb3J0ZWQgYnkgdHdvIHRva2VuIGFtb3VudHMuCi8vCi8vIFRoZSBjdXJyZW50IHNxdWFyZS1yb290IHByaWNlIGRldGVybWluZXMgd2hpY2ggdG9rZW4gYW1vdW50cyBhcmUgYWN0aXZlLiBCZWxvdwovLyB0aGUgcmFuZ2Ugb25seSB0b2tlbjAgaXMgdXNlZCwgYWJvdmUgaXQgb25seSB0b2tlbjEgaXMgdXNlZCwgYW5kIGluc2lkZSBpdCB0aGUKLy8gc21hbGxlciBvZiB0aGUgdG9rZW4wLSBhbmQgdG9rZW4xLWRlcml2ZWQgbGlxdWlkaXRpZXMgaXMgcmV0dXJuZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzcXJ0UmF0aW9YOTY6IEN1cnJlbnQgc3F1YXJlLXJvb3QgcHJpY2UsIGVuY29kZWQgYXMgYSBRNjQuOTYgcmF0aW8uCi8vICAgLSBzcXJ0UmF0aW9BWDk2OiBGaXJzdCBwcmljZS1yYW5nZSBlbmRwb2ludCwgZW5jb2RlZCBhcyBhIFE2NC45NiByYXRpby4KLy8gICAtIHNxcnRSYXRpb0JYOTY6IFNlY29uZCBwcmljZS1yYW5nZSBlbmRwb2ludCwgZW5jb2RlZCBhcyBhIFE2NC45NiByYXRpbzsgdGhlIGVuZHBvaW50cyBhcmUgc29ydGVkLgovLyAgIC0gYW1vdW50MDogQXZhaWxhYmxlIHRva2VuMCBhbW91bnQuCi8vICAgLSBhbW91bnQxOiBBdmFpbGFibGUgdG9rZW4xIGFtb3VudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGxpcXVpZGl0eTogTWF4aW11bSBsaXF1aWRpdHkgc3VwcG9ydGVkIGJ5IHRoZSBhbW91bnRzLCBjb25zdHJhaW5lZCB0byB1aW50MTI4LgovLwovLyBQYW5pY3MgaWYgYSBzZWxlY3RlZCBhbW91bnQvcmFuZ2UgY2FsY3VsYXRpb24gaGFzIGlkZW50aWNhbCBib3VuZHMgb3IgZXhjZWVkcyB1aW50MTI4LgpmdW5jIEdldExpcXVpZGl0eUZvckFtb3VudHMoc3FydFJhdGlvWDk2LCBzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBhbW91bnQwLCBhbW91bnQxICp1MjU2LlVpbnQpIChsaXF1aWRpdHkgKnUyNTYuVWludCkgewoJc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiA9IHRvQXNjZW5kaW5nT3JkZXIoc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NikKCglpZiBzcXJ0UmF0aW9YOTYuTHRlKHNxcnRSYXRpb0FYOTYpIHsKCQlsaXF1aWRpdHkgPSBjb21wdXRlTGlxdWlkaXR5Rm9yQW1vdW50MChzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBhbW91bnQwKQoJfSBlbHNlIGlmIHNxcnRSYXRpb1g5Ni5MdChzcXJ0UmF0aW9CWDk2KSB7CgkJbGlxdWlkaXR5MCA6PSBjb21wdXRlTGlxdWlkaXR5Rm9yQW1vdW50MChzcXJ0UmF0aW9YOTYsIHNxcnRSYXRpb0JYOTYsIGFtb3VudDApCgkJbGlxdWlkaXR5MSA6PSBjb21wdXRlTGlxdWlkaXR5Rm9yQW1vdW50MShzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9YOTYsIGFtb3VudDEpCgoJCWlmIGxpcXVpZGl0eTAuTHQobGlxdWlkaXR5MSkgewoJCQlsaXF1aWRpdHkgPSBsaXF1aWRpdHkwCgkJfSBlbHNlIHsKCQkJbGlxdWlkaXR5ID0gbGlxdWlkaXR5MQoJCX0KCX0gZWxzZSB7CgkJbGlxdWlkaXR5ID0gY29tcHV0ZUxpcXVpZGl0eUZvckFtb3VudDEoc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiwgYW1vdW50MSkKCX0KCXJldHVybiBsaXF1aWRpdHkKfQoKLy8gY29tcHV0ZUFtb3VudDBGb3JMaXF1aWRpdHkgY2FsY3VsYXRlcyB0aGUgcmVxdWlyZWQgYW1vdW50IG9mIHRva2VuMCBmb3IgYSBnaXZlbiBsaXF1aWRpdHkgbGV2ZWwKLy8gd2l0aGluIGEgc3BlY2lmaWVkIHByaWNlIHJhbmdlIChyZXByZXNlbnRlZCBieSBzcXJ0IHJhdGlvcykuCi8vCi8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgYW1vdW50IG9mIHRva2VuMCBuZWVkZWQgdG8gcHJvdmlkZSBhIHNwZWNpZmllZCBhbW91bnQgb2YgbGlxdWlkaXR5Ci8vIHdpdGhpbiBhIHByaWNlIHJhbmdlIGRlZmluZWQgYnkgc3FydFJhdGlvQVg5NiAobG93ZXIgYm91bmQpIGFuZCBzcXJ0UmF0aW9CWDk2ICh1cHBlciBib3VuZCkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vIC0gc3FydFJhdGlvQVg5NjogVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBwcmljZSByYW5nZSBhcyBhIHNxdWFyZSByb290IHJhdGlvIGluIFE2NC45NiBmb3JtYXQgKCp1MjU2LlVpbnQpLgovLyAtIHNxcnRSYXRpb0JYOTY6IFRoZSB1cHBlciBib3VuZCBvZiB0aGUgcHJpY2UgcmFuZ2UgYXMgYSBzcXVhcmUgcm9vdCByYXRpbyBpbiBRNjQuOTYgZm9ybWF0ICgqdTI1Ni5VaW50KS4KLy8gLSBsaXF1aWRpdHk6IFRoZSBsaXF1aWRpdHkgdG8gYmUgcHJvdmlkZWQgKCp1MjU2LlVpbnQpLgovLwovLyBSZXR1cm5zOgovLyAtICp1MjU2LlVpbnQ6IFRoZSBhbW91bnQgb2YgdG9rZW4wIHJlcXVpcmVkIHRvIGFjaGlldmUgdGhlIHNwZWNpZmllZCBsaXF1aWRpdHkgbGV2ZWwuCi8vCi8vIE5vdGVzOgovLyAtIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgcHJpY2UgYm91bmRzIGFyZSBleHByZXNzZWQgaW4gUTY0Ljk2IGZpeGVkLXBvaW50IGZvcm1hdC4KLy8gLSBUaGUgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBsaXF1aWRpdHkgaXMgMCBvciB0aGUgcHJpY2UgYm91bmRzIGFyZSBpbnZhbGlkLgovLyAtIEhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSBzcXJ0UmF0aW9BWDk2IGVxdWFscyBzcXJ0UmF0aW9CWDk2IGJ5IHJldHVybmluZyAwICh0byBwcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8pLgpmdW5jIGNvbXB1dGVBbW91bnQwRm9yTGlxdWlkaXR5KHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYsIGxpcXVpZGl0eSAqdTI1Ni5VaW50KSAqdTI1Ni5VaW50IHsKCXNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYgPSB0b0FzY2VuZGluZ09yZGVyKHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYpCglpZiBzcXJ0UmF0aW9BWDk2LklzWmVybygpIHx8IHNxcnRSYXRpb0JYOTYuSXNaZXJvKCkgfHwgbGlxdWlkaXR5LklzWmVybygpIHx8IHNxcnRSYXRpb0FYOTYuRXEoc3FydFJhdGlvQlg5NikgewoJCXJldHVybiB1MjU2Llplcm8oKQoJfQoKCXZhbDEgOj0gdTI1Ni5aZXJvKCkuTHNoKGxpcXVpZGl0eSwgUTk2X1JFU09MVVRJT04pCgl2YWwyIDo9IHUyNTYuWmVybygpLlN1YihzcXJ0UmF0aW9CWDk2LCBzcXJ0UmF0aW9BWDk2KQoKCXJlcyA6PSB1MjU2Lk11bERpdih2YWwxLCB2YWwyLCBzcXJ0UmF0aW9CWDk2KQoJcmVzID0gcmVzLkRpdihyZXMsIHNxcnRSYXRpb0FYOTYpCgoJcmV0dXJuIHJlcwp9CgovLyBjb21wdXRlQW1vdW50MUZvckxpcXVpZGl0eSBjYWxjdWxhdGVzIHRoZSByZXF1aXJlZCBhbW91bnQgb2YgdG9rZW4xIGZvciBhIGdpdmVuIGxpcXVpZGl0eSBsZXZlbAovLyB3aXRoaW4gYSBzcGVjaWZpZWQgcHJpY2UgcmFuZ2UgKHJlcHJlc2VudGVkIGJ5IHNxcnQgcmF0aW9zKS4KLy8KLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBhbW91bnQgb2YgdG9rZW4xIG5lZWRlZCB0byBwcm92aWRlIGxpcXVpZGl0eSBiZXR3ZWVuIHRoZQovLyBsb3dlciAoc3FydFJhdGlvQVg5NikgYW5kIHVwcGVyIChzcXJ0UmF0aW9CWDk2KSBwcmljZSBib3VuZHMuIFRoZSBjYWxjdWxhdGlvbiBpcyBwZXJmb3JtZWQKLy8gaW4gUTY0Ljk2IGZpeGVkLXBvaW50IGZvcm1hdCwgd2hpY2ggaXMgc3RhbmRhcmQgZm9yIG1hbnkgbGlxdWlkaXR5IGNhbGN1bGF0aW9ucy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gLSBzcXJ0UmF0aW9BWDk2OiBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIHByaWNlIHJhbmdlIGFzIGEgc3F1YXJlIHJvb3QgcmF0aW8gaW4gUTY0Ljk2IGZvcm1hdCAoKnUyNTYuVWludCkuCi8vIC0gc3FydFJhdGlvQlg5NjogVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBwcmljZSByYW5nZSBhcyBhIHNxdWFyZSByb290IHJhdGlvIGluIFE2NC45NiBmb3JtYXQgKCp1MjU2LlVpbnQpLgovLyAtIGxpcXVpZGl0eTogVGhlIGxpcXVpZGl0eSBhbW91bnQgdG8gYmUgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24gKCp1MjU2LlVpbnQpLgovLwovLyBSZXR1cm5zOgovLyAtICp1MjU2LlVpbnQ6IFRoZSBhbW91bnQgb2YgdG9rZW4xIHJlcXVpcmVkIHRvIGFjaGlldmUgdGhlIHNwZWNpZmllZCBsaXF1aWRpdHkgbGV2ZWwuCi8vCi8vIE5vdGVzOgovLyAgIC0gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGVkZ2UgY2FzZXMgd2hlcmUgdGhlIGxpcXVpZGl0eSBpcyB6ZXJvIG9yIHdoZW4gc3FydFJhdGlvQVg5NiBlcXVhbHMgc3FydFJhdGlvQlg5NgovLyAgICAgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvLgovLyAgIC0gVGhlIGNhbGN1bGF0aW9uIGFzc3VtZXMgc3FydFJhdGlvQVg5NiBpcyBhbHdheXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHNxcnRSYXRpb0JYOTYgYWZ0ZXIgdGhlIGluaXRpYWwKLy8gICAgIGFzY2VuZGluZyBvcmRlciBzb3J0aW5nLgpmdW5jIGNvbXB1dGVBbW91bnQxRm9yTGlxdWlkaXR5KHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYsIGxpcXVpZGl0eSAqdTI1Ni5VaW50KSAqdTI1Ni5VaW50IHsKCXNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYgPSB0b0FzY2VuZGluZ09yZGVyKHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYpCglpZiBsaXF1aWRpdHkuSXNaZXJvKCkgfHwgc3FydFJhdGlvQVg5Ni5FcShzcXJ0UmF0aW9CWDk2KSB7CgkJcmV0dXJuIHUyNTYuWmVybygpCgl9CgoJZGlmZiA6PSB1MjU2Llplcm8oKS5TdWIoc3FydFJhdGlvQlg5Niwgc3FydFJhdGlvQVg5NikKCXJlcyA6PSB1MjU2Lk11bERpdihsaXF1aWRpdHksIGRpZmYsIGNvbnN0cy5ROTYoKSkKCglyZXR1cm4gcmVzCn0KCi8vIEdldEFtb3VudHNGb3JMaXF1aWRpdHkgY2FsY3VsYXRlcyB0aGUgYW1vdW50cyBvZiB0b2tlbjAgYW5kIHRva2VuMSByZXByZXNlbnRlZAovLyBieSBhIHNwZWNpZmllZCBsaXF1aWRpdHkgd2l0aGluIGEgcHJpY2UgcmFuZ2UuCi8vCi8vIElmIHRoZSBjdXJyZW50IHByaWNlIGlzIGJlbG93IHRoZSBsb3dlciBib3VuZCwgb25seSB0b2tlbjAgaXMgcmVxdWlyZWQuIElmIHRoZQovLyBjdXJyZW50IHByaWNlIGlzIGFib3ZlIHRoZSB1cHBlciBib3VuZCwgb25seSB0b2tlbjEgaXMgcmVxdWlyZWQuIFdoZW4gdGhlCi8vIHByaWNlIGlzIHdpdGhpbiB0aGUgcmFuZ2UsIGJvdGggdG9rZW4wIGFuZCB0b2tlbjEgYXJlIGNhbGN1bGF0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzcXJ0UmF0aW9YOTY6IEN1cnJlbnQgc3F1YXJlLXJvb3QgcHJpY2UgaW4gUTY0Ljk2IGZvcm1hdC4KLy8gICAtIHNxcnRSYXRpb0FYOTY6IEZpcnN0IHByaWNlLXJhbmdlIGVuZHBvaW50IGluIFE2NC45NiBmb3JtYXQuCi8vICAgLSBzcXJ0UmF0aW9CWDk2OiBTZWNvbmQgcHJpY2UtcmFuZ2UgZW5kcG9pbnQgaW4gUTY0Ljk2IGZvcm1hdDsgdGhlIGVuZHBvaW50cyBhcmUgb3JkZXJlZCBpbnRlcm5hbGx5LgovLyAgIC0gbGlxdWlkaXR5OiBOb24tbmVnYXRpdmUgbGlxdWlkaXR5IGFtb3VudCB0byB2YWx1ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDA6IFRva2VuMCBhbW91bnQgcmVwcmVzZW50ZWQgYnkgbGlxdWlkaXR5OyB6ZXJvIHdoZW4gdGhlIGN1cnJlbnQgcHJpY2UgaXMgYXQgb3IgYWJvdmUgdGhlIHVwcGVyIGVuZHBvaW50LgovLyAgIC0gYW1vdW50MTogVG9rZW4xIGFtb3VudCByZXByZXNlbnRlZCBieSBsaXF1aWRpdHk7IHplcm8gd2hlbiB0aGUgY3VycmVudCBwcmljZSBpcyBhdCBvciBiZWxvdyB0aGUgbG93ZXIgZW5kcG9pbnQuCi8vICAgICBDYWxsIFRvU3RyaW5nKCkgb24gZWl0aGVyIHZhbHVlIGZvciBkZWNpbWFsIGRpc3BsYXkuCi8vCi8vIE5vdGVzOgovLyAgIC0gSWYgbGlxdWlkaXR5IGlzIHplcm8sIHRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8gdmFsdWVzIGZvciBib3RoIHRva2Vucy4KLy8gICAtIEF0IGEgYm91bmRhcnksIHRoZSBjb3JyZXNwb25kaW5nIG91dC1vZi1yYW5nZSB0b2tlbiBhbW91bnQgaXMgemVyby4KLy8KLy8gRXhhbXBsZToKLy8gYGBgCi8vIGFtb3VudDAsIGFtb3VudDEgOj0gR2V0QW1vdW50c0ZvckxpcXVpZGl0eSgKLy8KLy8JdTI1Ni5NdXN0RnJvbURlY2ltYWwoIjc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2IiksICAvLyBzcXJ0UmF0aW9YOTYgKDEuMCBpbiBRNjQuOTYpCi8vCXUyNTYuTXVzdEZyb21EZWNpbWFsKCIzOTYxNDA4MTI1NzEzMjE2ODc5Njc3MTk3NTE2OCIpLCAgLy8gc3FydFJhdGlvQVg5NiAoMC41IGluIFE2NC45NikKLy8JdTI1Ni5NdXN0RnJvbURlY2ltYWwoIjE1ODQ1NjMyNTAyODUyODY3NTE4NzA4NzkwMDY3MiIpLCAvLyBzcXJ0UmF0aW9CWDk2ICgyLjAgaW4gUTY0Ljk2KQovLwl1MjU2Lk11c3RGcm9tRGVjaW1hbCgiMTAwMDAwMCIpLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpcXVpZGl0eQovLwovLyApCi8vCi8vIHByaW50bG4oIlRva2VuMDoiLCBhbW91bnQwLlRvU3RyaW5nKCksICJUb2tlbjE6IiwgYW1vdW50MS5Ub1N0cmluZygpKQovLwovLyAvLyBPdXRwdXQ6Ci8vIFRva2VuMDogNTAwMDAwLCBUb2tlbjE6IDUwMDAwMAovLyBgYGAKZnVuYyBHZXRBbW91bnRzRm9yTGlxdWlkaXR5KHNxcnRSYXRpb1g5Niwgc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiwgbGlxdWlkaXR5ICp1MjU2LlVpbnQpICgqdTI1Ni5VaW50LCAqdTI1Ni5VaW50KSB7CglpZiBsaXF1aWRpdHkuSXNaZXJvKCkgewoJCXJldHVybiB1MjU2Llplcm8oKSwgdTI1Ni5aZXJvKCkKCX0KCglzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2ID0gdG9Bc2NlbmRpbmdPcmRlcihzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2KQoKCWFtb3VudDAgOj0gdTI1Ni5aZXJvKCkKCWFtb3VudDEgOj0gdTI1Ni5aZXJvKCkKCglpZiBzcXJ0UmF0aW9YOTYuTHRlKHNxcnRSYXRpb0FYOTYpIHsKCQlhbW91bnQwID0gY29tcHV0ZUFtb3VudDBGb3JMaXF1aWRpdHkoc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiwgbGlxdWlkaXR5KQoJfSBlbHNlIGlmIHNxcnRSYXRpb1g5Ni5MdChzcXJ0UmF0aW9CWDk2KSB7CgkJYW1vdW50MCA9IGNvbXB1dGVBbW91bnQwRm9yTGlxdWlkaXR5KHNxcnRSYXRpb1g5Niwgc3FydFJhdGlvQlg5NiwgbGlxdWlkaXR5KQoJCWFtb3VudDEgPSBjb21wdXRlQW1vdW50MUZvckxpcXVpZGl0eShzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9YOTYsIGxpcXVpZGl0eSkKCX0gZWxzZSB7CgkJYW1vdW50MSA9IGNvbXB1dGVBbW91bnQxRm9yTGlxdWlkaXR5KHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYsIGxpcXVpZGl0eSkKCX0KCglyZXR1cm4gYW1vdW50MCwgYW1vdW50MQp9CgovLyBMaXF1aWRpdHlNYXRoQWRkRGVsdGEgY2FsY3VsYXRlcyB0aGUgbmV3IGxpcXVpZGl0eSBhZnRlciBhcHBseWluZyBhIHNpZ25lZCBkZWx0YS4KLy8gQSBuZWdhdGl2ZSBkZWx0YSBzdWJ0cmFjdHMgaXRzIG1hZ25pdHVkZTsgYSBub24tbmVnYXRpdmUgZGVsdGEgYWRkcyBpdHMgbWFnbml0dWRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0geDogQ3VycmVudCBub24tbmVnYXRpdmUgbGlxdWlkaXR5IHZhbHVlLgovLyAgIC0geTogU2lnbmVkIGxpcXVpZGl0eSBkZWx0YTsgcG9zaXRpdmUgdmFsdWVzIGFkZCBhbmQgbmVnYXRpdmUgdmFsdWVzIHN1YnRyYWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gbGlxdWlkaXR5OiBVcGRhdGVkIGxpcXVpZGl0eSwgY29uc3RyYWluZWQgdG8gdGhlIHVpbnQxMjggcmFuZ2UuCi8vCi8vIFBhbmljcyBpZiB4IG9yIHkgaXMgbmlsLCBzdWJ0cmFjdGlvbiB1bmRlcmZsb3dzLCBhZGRpdGlvbiBvdmVyZmxvd3MgdWludDI1NiwKLy8gb3IgdGhlIHJlc3VsdGluZyBsaXF1aWRpdHkgZXhjZWVkcyBNYXhVaW50MTI4LgpmdW5jIExpcXVpZGl0eU1hdGhBZGREZWx0YSh4ICp1MjU2LlVpbnQsIHkgKmkyNTYuSW50KSAqdTI1Ni5VaW50IHsKCWlmIHggPT0gbmlsIHx8IHkgPT0gbmlsIHsKCQlwYW5pYygibGlxdWlkaXR5X21hdGg6IHggb3IgeSBpcyBuaWwiKQoJfQoKCXlBYnMgOj0geS5BYnMoKQoKCS8vIFN1YnRyYWN0IG9yIGFkZCBiYXNlZCBvbiB0aGUgc2lnbiBvZiB5CglpZiB5Lkx0KGkyNTYuWmVybygpKSB7CgkJeiA6PSB1MjU2Llplcm8oKS5TdWIoeCwgeUFicykKCQlpZiB6Lkd0ZSh4KSB7CgkJCXBhbmljKHVmbXQuU3ByaW50ZigKCQkJCSJsaXF1aWRpdHlfbWF0aDogdW5kZXJmbG93ICh4OiAlcywgeTogJXMsIHo6JXMpIiwKCQkJCXguVG9TdHJpbmcoKSwgeS5Ub1N0cmluZygpLCB6LlRvU3RyaW5nKCkpKQoJCX0KCQlpZiB6Lkd0KGNvbnN0cy5NYXhVaW50MTI4KCkpIHsKCQkJcGFuaWModWZtdC5TcHJpbnRmKAoJCQkJImxpcXVpZGl0eV9tYXRoOiByZXN1bHQgZXhjZWVkcyB1aW50MTI4IHJhbmdlICh6OiAlcykiLAoJCQkJei5Ub1N0cmluZygpKSkKCQl9CgkJcmV0dXJuIHoKCX0KCgl6IDo9IHUyNTYuWmVybygpLkFkZCh4LCB5QWJzKQoJaWYgei5MdCh4KSB7CgkJcGFuaWModWZtdC5TcHJpbnRmKAoJCQkibGlxdWlkaXR5X21hdGg6IG92ZXJmbG93ICh4OiAlcywgeTogJXMsIHo6JXMpIiwKCQkJeC5Ub1N0cmluZygpLCB5LlRvU3RyaW5nKCksIHouVG9TdHJpbmcoKSkpCgl9CglpZiB6Lkd0KGNvbnN0cy5NYXhVaW50MTI4KCkpIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoCgkJCSJsaXF1aWRpdHlfbWF0aDogcmVzdWx0IGV4Y2VlZHMgdWludDEyOCByYW5nZSAoejogJXMpIiwKCQkJei5Ub1N0cmluZygpKSkKCX0KCXJldHVybiB6Cn0KCi8vIHRvQXNjZW5kaW5nT3JkZXIgcmV0dXJucyB0aGUgdHdvIHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIuCmZ1bmMgdG9Bc2NlbmRpbmdPcmRlcihhLCBiICp1MjU2LlVpbnQpICgqdTI1Ni5VaW50LCAqdTI1Ni5VaW50KSB7CglpZiBhLkd0KGIpIHsKCQlyZXR1cm4gYiwgYQoJfQoKCXJldHVybiBhLCBiCn0KCi8vIFNhZmVDb252ZXJ0VG9VaW50MTI4IHZlcmlmaWVzIHRoYXQgdmFsdWUgZml0cyBpbiB0aGUgdWludDEyOCByYW5nZS4KLy8KLy8gTm8gcmVwcmVzZW50YXRpb24gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQ6IHRoZSBvcmlnaW5hbCBwb2ludGVyIGlzIHJldHVybmVkCi8vIHdoZW4gaXRzIHZhbHVlIGlzIGF0IG1vc3QgMl4xMjggLSAxLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdmFsdWU6IE5vbi1uaWwgdW5zaWduZWQgMjU2LWJpdCB2YWx1ZSB0byB2YWxpZGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvbnZlcnRlZDogVGhlIHNhbWUgKnUyNTYuVWludCBwb2ludGVyIHdoZW4gdmFsdWUgZml0cyBpbiB1aW50MTI4LgovLwovLyBQYW5pY3MgaWYgdmFsdWUgaXMgbmlsIG9yIGV4Y2VlZHMgdGhlIG1heGltdW0gdWludDEyOCB2YWx1ZS4KZnVuYyBTYWZlQ29udmVydFRvVWludDEyOCh2YWx1ZSAqdTI1Ni5VaW50KSAqdTI1Ni5VaW50IHsKCWlmIHZhbHVlLkd0KGNvbnN0cy5NYXhVaW50MTI4KCkpIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoCgkJCSIldjogYW1vdW50KCVzKSBvdmVyZmxvd3MgdWludDEyOCByYW5nZSIsCgkJCWVyckxpcXVpZGl0eU92ZXJmbG93LCB2YWx1ZS5Ub1N0cmluZygpKSkKCX0KCXJldHVybiB2YWx1ZQp9Chq9MwoNc2FmZV9tYXRoLmdubxKrM3BhY2thZ2UgZ25zbWF0aAoKaW1wb3J0ICgKCSJtYXRoIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCglpMjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvaW50MjU2L3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIFJhbmdlIGJvdW5kcyB1c2VkIGJ5IHRoZSBzYWZlIGNvbnZlcnNpb24gaGVscGVycy4KY29uc3QgKAoJbWF4SW50NjREZWNpbWFsICA9ICI5MjIzMzcyMDM2ODU0Nzc1ODA3IiAgICAgICAgICAgICAgICAgICAgIC8vIDJeNjMgLSAxCgltYXhJbnQxMjhEZWNpbWFsID0gIjE3MDE0MTE4MzQ2MDQ2OTIzMTczMTY4NzMwMzcxNTg4NDEwNTcyNyIgLy8gMl4xMjcgLSAxCikKCi8vIE1heEludDEyOCByZXR1cm5zIHRoZSBsYXJnZXN0IHBvc2l0aXZlIHZhbHVlIHJlcHJlc2VudGFibGUgYnkgYSBzaWduZWQgMTI4LWJpdCBpbnRlZ2VyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gbWF4SW50MTI4OiBBIGZyZXNoICppMjU2LkludCBjb250YWluaW5nIDJeMTI3IC0gMSwgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQKLy8gICAgIGZvciBjb252ZXJzaW9ucyB0aGF0IG11c3QgZml0IGluIHRoZSBzaWduZWQgaW50MTI4IHJhbmdlLgpmdW5jIE1heEludDEyOCgpICppMjU2LkludCB7CglyZXR1cm4gaTI1Ni5NdXN0RnJvbURlY2ltYWwobWF4SW50MTI4RGVjaW1hbCkKfQoKLy8gU2FmZUFkZEludDY0IHJldHVybnMgdGhlIGV4YWN0IHN1bSBvZiB0d28gc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGE6IEZpcnN0IHNpZ25lZCBpbnQ2NCBvcGVyYW5kLgovLyAgIC0gYjogU2Vjb25kIHNpZ25lZCBpbnQ2NCBvcGVyYW5kLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3VtOiBhICsgYiB3aGVuIHRoZSBtYXRoZW1hdGljYWwgcmVzdWx0IGlzIHdpdGhpbiBbbWF0aC5NaW5JbnQ2NCwgbWF0aC5NYXhJbnQ2NF0uCi8vCi8vIFBhbmljcyBpZiB0aGUgc2lnbmVkIGludDY0IHN1bSBvdmVyZmxvd3Mgb3IgdW5kZXJmbG93cy4KZnVuYyBTYWZlQWRkSW50NjQoYSwgYiBpbnQ2NCkgaW50NjQgewoJaWYgYSA+IDAgJiYgYiA+IG1hdGguTWF4SW50NjQtYSB7CgkJcGFuaWMoImludDY0IGFkZGl0aW9uIG92ZXJmbG93IikKCX0KCWlmIGEgPCAwICYmIGIgPCBtYXRoLk1pbkludDY0LWEgewoJCXBhbmljKCJpbnQ2NCBhZGRpdGlvbiB1bmRlcmZsb3ciKQoJfQoJcmV0dXJuIGEgKyBiCn0KCi8vIFNhZmVTdWJJbnQ2NCByZXR1cm5zIHRoZSBleGFjdCBkaWZmZXJlbmNlIG9mIHR3byBzaWduZWQgNjQtYml0IGludGVnZXJzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYTogU2lnbmVkIGludDY0IG1pbnVlbmQuCi8vICAgLSBiOiBTaWduZWQgaW50NjQgc3VidHJhaGVuZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGRpZmZlcmVuY2U6IGEgLSBiIHdoZW4gdGhlIG1hdGhlbWF0aWNhbCByZXN1bHQgaXMgd2l0aGluIFttYXRoLk1pbkludDY0LCBtYXRoLk1heEludDY0XS4KLy8KLy8gUGFuaWNzIGlmIHRoZSBzaWduZWQgaW50NjQgZGlmZmVyZW5jZSBvdmVyZmxvd3Mgb3IgdW5kZXJmbG93cy4KZnVuYyBTYWZlU3ViSW50NjQoYSwgYiBpbnQ2NCkgaW50NjQgewoJaWYgYiA+IDAgJiYgYSA8IG1hdGguTWluSW50NjQrYiB7CgkJcGFuaWMoImludDY0IHN1YnRyYWN0aW9uIHVuZGVyZmxvdyIpCgl9CglpZiBiIDwgMCAmJiBhID4gbWF0aC5NYXhJbnQ2NCtiIHsKCQlwYW5pYygiaW50NjQgc3VidHJhY3Rpb24gb3ZlcmZsb3ciKQoJfQoJcmV0dXJuIGEgLSBiCn0KCi8vIFNhZmVNdWxJbnQ2NCByZXR1cm5zIHRoZSBleGFjdCBwcm9kdWN0IG9mIHR3byBzaWduZWQgNjQtYml0IGludGVnZXJzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYTogRmlyc3Qgc2lnbmVkIGludDY0IGZhY3Rvci4KLy8gICAtIGI6IFNlY29uZCBzaWduZWQgaW50NjQgZmFjdG9yLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvZHVjdDogYSAqIGIgd2hlbiB0aGUgbWF0aGVtYXRpY2FsIHJlc3VsdCBpcyB3aXRoaW4gW21hdGguTWluSW50NjQsIG1hdGguTWF4SW50NjRdLgovLwovLyBQYW5pY3MgaWYgdGhlIHNpZ25lZCBpbnQ2NCBwcm9kdWN0IG92ZXJmbG93cyBvciB1bmRlcmZsb3dzLgpmdW5jIFNhZmVNdWxJbnQ2NChhLCBiIGludDY0KSBpbnQ2NCB7CglpZiBhID09IDAgfHwgYiA9PSAwIHsKCQlyZXR1cm4gMAoJfQoKCWlmIGEgPiAwICYmIGIgPiAwIHsKCQlpZiBhID4gbWF0aC5NYXhJbnQ2NC9iIHsKCQkJcGFuaWMoImludDY0IG11bHRpcGxpY2F0aW9uIG92ZXJmbG93IikKCQl9Cgl9IGVsc2UgaWYgYSA8IDAgJiYgYiA8IDAgewoJCWlmIGEgPCBtYXRoLk1heEludDY0L2IgewoJCQlwYW5pYygiaW50NjQgbXVsdGlwbGljYXRpb24gb3ZlcmZsb3ciKQoJCX0KCX0gZWxzZSBpZiBhID4gMCAmJiBiIDwgMCB7CgkJaWYgYiA8IG1hdGguTWluSW50NjQvYSB7CgkJCXBhbmljKCJpbnQ2NCBtdWx0aXBsaWNhdGlvbiB1bmRlcmZsb3ciKQoJCX0KCX0gZWxzZSB7IC8vIGEgPCAwICYmIGIgPiAwCgkJaWYgYSA8IG1hdGguTWluSW50NjQvYiB7CgkJCXBhbmljKCJpbnQ2NCBtdWx0aXBsaWNhdGlvbiB1bmRlcmZsb3ciKQoJCX0KCX0KCglyZXR1cm4gYSAqIGIKfQoKLy8gU2FmZU11bERpdkludDY0IHJldHVybnMgdGhlIHRydW5jYXRlZCBxdW90aWVudCAoYSAqIGIpIC8gYy4KLy8KLy8gVGhlIHByb2R1Y3QgaXMgZm9ybWVkIGluIHNpZ25lZCAyNTYtYml0IGFyaXRobWV0aWMgYmVmb3JlIGRpdmlzaW9uLCBzbyBhbgovLyBpbnRlcm1lZGlhdGUgcHJvZHVjdCBtYXkgZXhjZWVkIGludDY0IHdoaWxlIHRoZSBmaW5hbCBxdW90aWVudCBtdXN0IHN0aWxsIGZpdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGE6IEZpcnN0IHNpZ25lZCBpbnQ2NCBmYWN0b3IuCi8vICAgLSBiOiBTZWNvbmQgc2lnbmVkIGludDY0IGZhY3Rvci4KLy8gICAtIGM6IE5vbi16ZXJvIHNpZ25lZCBpbnQ2NCBkaXZpc29yLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcXVvdGllbnQ6IFRoZSBzaWduZWQgaW50ZWdlciBxdW90aWVudCBhZnRlciBkaXZpZGluZyBhICogYiBieSBjLgovLwovLyBQYW5pY3MgaWYgdGhlIDI1Ni1iaXQgcHJvZHVjdCBvdmVyZmxvd3MsIGMgaXMgemVybywgb3IgdGhlIHF1b3RpZW50IGlzIG91dHNpZGUKLy8gdGhlIHJlcHJlc2VudGFibGUgaW50NjQgcmFuZ2UuCmZ1bmMgU2FmZU11bERpdkludDY0KGEsIGIsIGMgaW50NjQpIGludDY0IHsKCWlmIGEgPT0gMCB8fCBiID09IDAgewoJCXJldHVybiAwCgl9CgoJcmVzdWx0LCBvdmVyZmxvdyA6PSBpMjU2Llplcm8oKS5NdWxPdmVyZmxvdyhpMjU2Lk5ld0ludChhKSwgaTI1Ni5OZXdJbnQoYikpCglpZiBvdmVyZmxvdyB7CgkJcGFuaWMoZXJyU2FmZU1hdGhPdmVyZmxvdykKCX0KCglyZXN1bHQgPSBpMjU2Llplcm8oKS5EaXYocmVzdWx0LCBpMjU2Lk5ld0ludChjKSkKCWlmICFyZXN1bHQuSXNJbnQ2NCgpIHsKCQlwYW5pYyhlcnJTYWZlTWF0aE92ZXJmbG93KQoJfQoKCXJldHVybiByZXN1bHQuSW50NjQoKQp9CgovLyBTYWZlQWJzSW50NjQgcmV0dXJucyB0aGUgbm9uLW5lZ2F0aXZlIGFic29sdXRlIHZhbHVlIG9mIGEuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhOiBTaWduZWQgaW50NjQgdmFsdWUgd2hvc2UgbWFnbml0dWRlIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1hZ25pdHVkZTogfGF8IGFzIGludDY0LgovLwovLyBQYW5pY3Mgd2hlbiBhIGlzIG1hdGguTWluSW50NjQgYmVjYXVzZSBpdHMgcG9zaXRpdmUgbWFnbml0dWRlIGNhbm5vdCBiZQovLyByZXByZXNlbnRlZCBieSBpbnQ2NC4KZnVuYyBTYWZlQWJzSW50NjQoYSBpbnQ2NCkgaW50NjQgewoJaWYgYSA9PSBtYXRoLk1pbkludDY0IHsKCQlwYW5pYyhlcnJTYWZlTWF0aE92ZXJmbG93KQoJfQoJaWYgYSA8IDAgewoJCXJldHVybiAtYQoJfQoJcmV0dXJuIGEKfQoKLy8gU2FmZUFkZFVpbnQ2NCByZXR1cm5zIHRoZSBleGFjdCBzdW0gb2YgdHdvIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGE6IEZpcnN0IHVpbnQ2NCBvcGVyYW5kLgovLyAgIC0gYjogU2Vjb25kIHVpbnQ2NCBvcGVyYW5kLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3VtOiBhICsgYiB3aGVuIHRoZSBtYXRoZW1hdGljYWwgcmVzdWx0IGlzIGF0IG1vc3QgbWF0aC5NYXhVaW50NjQuCi8vCi8vIFBhbmljcyBpZiB0aGUgdWludDY0IHN1bSBvdmVyZmxvd3MuCmZ1bmMgU2FmZUFkZFVpbnQ2NChhLCBiIHVpbnQ2NCkgdWludDY0IHsKCWlmIGEgPiBtYXRoLk1heFVpbnQ2NC1iIHsKCQlwYW5pYygidWludDY0IGFkZGl0aW9uIG92ZXJmbG93IikKCX0KCXJldHVybiBhICsgYgp9CgovLyBTYWZlU3ViVWludDY0IHJldHVybnMgdGhlIGV4YWN0IGRpZmZlcmVuY2Ugb2YgdHdvIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGE6IFVuc2lnbmVkIHVpbnQ2NCBtaW51ZW5kLgovLyAgIC0gYjogVW5zaWduZWQgdWludDY0IHN1YnRyYWhlbmQ7IGl0IG11c3Qgbm90IGV4Y2VlZCBhLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGlmZmVyZW5jZTogYSAtIGIuCi8vCi8vIFBhbmljcyBpZiBiIGlzIGdyZWF0ZXIgdGhhbiBhIGFuZCB0aGUgc3VidHJhY3Rpb24gd291bGQgdW5kZXJmbG93IHVpbnQ2NC4KZnVuYyBTYWZlU3ViVWludDY0KGEsIGIgdWludDY0KSB1aW50NjQgewoJaWYgYSA8IGIgewoJCXBhbmljKCJ1aW50NjQgc3VidHJhY3Rpb24gdW5kZXJmbG93IikKCX0KCXJldHVybiBhIC0gYgp9CgovLyBTYWZlVWludDY0VG9JbnQ2NCBjb252ZXJ0cyBhIHVpbnQ2NCB0byBhIHNpZ25lZCBpbnQ2NCB3aXRob3V0IGNoYW5naW5nIGl0cyB2YWx1ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHZhbHVlOiBVbnNpZ25lZCB2YWx1ZSB0byBjb252ZXJ0OyBpdCBtdXN0IGJlIG5vIGdyZWF0ZXIgdGhhbiAyXjYzIC0gMS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvbnZlcnRlZDogdmFsdWUgcmVwcmVzZW50ZWQgYXMgaW50NjQuCi8vCi8vIFBhbmljcyB3aGVuIHZhbHVlIGV4Y2VlZHMgbWF0aC5NYXhJbnQ2NC4KZnVuYyBTYWZlVWludDY0VG9JbnQ2NCh2YWx1ZSB1aW50NjQpIGludDY0IHsKCWlmIHZhbHVlID4gdWludDY0KG1hdGguTWF4SW50NjQpIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoCgkJCSJhbW91bnQoJWQpIG92ZXJmbG93cyBpbnQ2NCByYW5nZSAobWF4OiAlcykiLAoJCQl2YWx1ZSwgbWF4SW50NjREZWNpbWFsLAoJCSkpCgl9CglyZXR1cm4gaW50NjQodmFsdWUpCn0KCi8vIFNhZmVDb252ZXJ0VG9JbnQ2NCBjb252ZXJ0cyBhIG5vbi1uZWdhdGl2ZSAyNTYtYml0IGludGVnZXIgdG8gaW50NjQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB2YWx1ZTogVW5zaWduZWQgMjU2LWJpdCB2YWx1ZSB0byBjb252ZXJ0OyBuaWwgaXMgaW52YWxpZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvbnZlcnRlZDogdmFsdWUgcmVwcmVzZW50ZWQgYXMgaW50NjQgd2hlbiBpdCBpcyBhdCBtb3N0IG1hdGguTWF4SW50NjQuCi8vCi8vIFBhbmljcyB3aGVuIHZhbHVlIGlzIG5pbCBvciBvdXRzaWRlIHRoZSBpbnQ2NCByYW5nZS4KZnVuYyBTYWZlQ29udmVydFRvSW50NjQodmFsdWUgKnUyNTYuVWludCkgaW50NjQgewoJaWYgdmFsdWUgPT0gbmlsIHsKCQlwYW5pYygiU2FmZUNvbnZlcnRUb0ludDY0OiB2YWx1ZSBpcyBuaWwiKQoJfQoJcmVzLCBvdmVyZmxvdyA6PSB2YWx1ZS5VaW50NjRXaXRoT3ZlcmZsb3coKQoJaWYgb3ZlcmZsb3cgfHwgcmVzID4gdWludDY0KG1hdGguTWF4SW50NjQpIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoCgkJCSJhbW91bnQoJXMpIG92ZXJmbG93cyBpbnQ2NCByYW5nZSAobWF4OiAlcykiLAoJCQl2YWx1ZS5Ub1N0cmluZygpLCBtYXhJbnQ2NERlY2ltYWwsCgkJKSkKCX0KCXJldHVybiBpbnQ2NChyZXMpCn0KCi8vIFNhZmVDb252ZXJ0VG9JbnQxMjggY29udmVydHMgYSBub24tbmVnYXRpdmUgMjU2LWJpdCBpbnRlZ2VyIHRvIHNpZ25lZCBpbnQxMjguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB2YWx1ZTogVW5zaWduZWQgMjU2LWJpdCB2YWx1ZSB0byBjb252ZXJ0OyBuaWwgaXMgaW52YWxpZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvbnZlcnRlZDogQSBuZXcgKmkyNTYuSW50IHJlcHJlc2VudGluZyB2YWx1ZSB3aGVuIGl0IGlzIGF0IG1vc3QgMl4xMjcgLSAxLgovLwovLyBQYW5pY3Mgd2hlbiB2YWx1ZSBpcyBuaWwgb3IgZXhjZWVkcyB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBzaWduZWQgaW50MTI4IHZhbHVlLgpmdW5jIFNhZmVDb252ZXJ0VG9JbnQxMjgodmFsdWUgKnUyNTYuVWludCkgKmkyNTYuSW50IHsKCWlmIHZhbHVlID09IG5pbCB7CgkJcGFuaWMoIlNhZmVDb252ZXJ0VG9JbnQxMjg6IHZhbHVlIGlzIG5pbCIpCgl9Cgljb252ZXJ0ZWQgOj0gaTI1Ni5Gcm9tVWludDI1Nih2YWx1ZSkKCWlmIGNvbnZlcnRlZC5HdChNYXhJbnQxMjgoKSkgewoJCXBhbmljKHVmbXQuU3ByaW50ZigKCQkJImFtb3VudCglcykgb3ZlcmZsb3dzIGludDEyOCByYW5nZSIsCgkJCXZhbHVlLlRvU3RyaW5nKCksCgkJKSkKCX0KCXJldHVybiBjb252ZXJ0ZWQKfQoarl4KE3NxcnRfcHJpY2VfbWF0aC5nbm8Sll5wYWNrYWdlIGduc21hdGgKCmltcG9ydCAoCgkiZ25vLmxhbmQvcC9nbm9zd2FwL2NvbnN0cy92MSIKCWkyNTYgImduby5sYW5kL3AvZ25vc3dhcC9pbnQyNTYvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKLy8gTUlOX1NRUlRfUkFUSU8gcmV0dXJucyB0aGUgbWluaW11bSB2YWxpZCBRNjQuOTYgc3F1YXJlLXJvb3QgcHJpY2UgcmF0aW8uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBtaW5TcXJ0UmF0aW86IEEgZnJlc2ggKnUyNTYuVWludCBjb250YWluaW5nIDQsMjk1LDEyOCw3MzksIHRoZSBsb3dlcgovLyAgICAgYm91bmRhcnkgYWNjZXB0ZWQgYnkgdGhlIHBvb2wncyBzcXVhcmUtcm9vdCBwcmljZSBtYXRoLgpmdW5jIE1JTl9TUVJUX1JBVElPKCkgKnUyNTYuVWludCB7IHJldHVybiBjb25zdHMuTWluU3FydFJhdGlvKCkgfQoKLy8gTUFYX1NRUlRfUkFUSU8gcmV0dXJucyB0aGUgdXBwZXIgYm91bmRhcnkgdXNlZCBieSBRNjQuOTYgc3F1YXJlLXJvb3QgcHJpY2UgbWF0aC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1heFNxcnRSYXRpbzogQSBmcmVzaCAqdTI1Ni5VaW50IGNvbnRhaW5pbmcKLy8gICAgIDE0NjE0NDY3MDM0ODUyMTAxMDMyODcyNzMwNTIyMDM5ODg4MjIzNzg3MjM5NzAzNDIuIEludmVyc2UgdGljayBjb252ZXJzaW9uCi8vICAgICB0cmVhdHMgdGhpcyBib3VuZGFyeSBhcyBleGNsdXNpdmUuCmZ1bmMgTUFYX1NRUlRfUkFUSU8oKSAqdTI1Ni5VaW50IHsgcmV0dXJuIGNvbnN0cy5NYXhTcXJ0UmF0aW8oKSB9CgovLyBnZXROZXh0UHJpY2VBbW91bnQwQWRkIGNhbGN1bGF0ZXMgdGhlIG5leHQgc3FydCBwcmljZSB3aGVuIGFkZGluZyB0b2tlbjAgbGlxdWlkaXR5LAovLyByb3VuZGluZyB1cCB0byBlbnN1cmUgY29uc2VydmF0aXZlIHByaWNpbmcgZm9yIHRoZSBwcm90b2NvbC4KLy8gVGhpcyBpbnRlcm5hbCBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRva2VuMCBpcyBiZWluZyBhZGRlZCB0byB0aGUgcG9vbC4KZnVuYyBnZXROZXh0UHJpY2VBbW91bnQwQWRkKAoJY3VycmVudFNxcnRQcmljZVg5NiwgbGlxdWlkaXR5LCBhbW91bnRUb0FkZCAqdTI1Ni5VaW50LAopICp1MjU2LlVpbnQgewoJLy8gbGlxdWlkaXR5U2hpZnRlZCA9IGxpcXVpZGl0eSA8PCA5NgoJbGlxdWlkaXR5U2hpZnRlZCA6PSB1MjU2Llplcm8oKS5Mc2gobGlxdWlkaXR5LCBROTZfUkVTT0xVVElPTikKCS8vIGFtb3VudFRpbWVzU3FydFByaWNlID0gYW1vdW50ICogc3FydFByaWNlCglhbW91bnRUaW1lc1NxcnRQcmljZSA6PSB1MjU2Llplcm8oKS5NdWwoYW1vdW50VG9BZGQsIGN1cnJlbnRTcXJ0UHJpY2VYOTYpCgoJLy8gT3ZlcmZsb3cgY2hlY2s6IEVuc3VyZSAoYW1vdW50VGltZXNTcXJ0UHJpY2UgLyBhbW91bnRUb0FkZCkgPT0gY3VycmVudFNxcnRQcmljZVg5NgoJcXVvdGllbnRDaGVjayA6PSB1MjU2Llplcm8oKS5EaXYoYW1vdW50VGltZXNTcXJ0UHJpY2UsIGFtb3VudFRvQWRkKQoJaWYgcXVvdGllbnRDaGVjay5FcShjdXJyZW50U3FydFByaWNlWDk2KSB7CgkJLy8gZGVub21pbmF0b3IgPSBsaXF1aWRpdHlTaGlmdGVkICsgYW1vdW50VGltZXNTcXJ0UHJpY2UKCQlkZW5vbWluYXRvciA6PSB1MjU2Llplcm8oKS5BZGQobGlxdWlkaXR5U2hpZnRlZCwgYW1vdW50VGltZXNTcXJ0UHJpY2UpCgkJLy8gb25seSB0YWtlIHRoaXMgcGF0aCB3aGVuIGRlbm9taW5hdG9yID49IGxpcXVpZGl0eVNoaWZ0ZWQKCQlpZiBkZW5vbWluYXRvci5HdGUobGlxdWlkaXR5U2hpZnRlZCkgewoJCQlyZXR1cm4gdTI1Ni5NdWxEaXZSb3VuZGluZ1VwKGxpcXVpZGl0eVNoaWZ0ZWQsIGN1cnJlbnRTcXJ0UHJpY2VYOTYsIGRlbm9taW5hdG9yKQoJCX0KCX0KCgkvLyBmYWxsYmFjazogbGlxdWlkaXR5U2hpZnRlZCAvICgobGlxdWlkaXR5U2hpZnRlZCAvIHNxcnRQcmljZSkgKyBhbW91bnQpCglkaXZWYWx1ZSA6PSB1MjU2Llplcm8oKS5EaXYobGlxdWlkaXR5U2hpZnRlZCwgY3VycmVudFNxcnRQcmljZVg5NikKCWRlbm9taW5hdG9yLCBvdmVyZmxvdyA6PSB1MjU2Llplcm8oKS5BZGRPdmVyZmxvdyhkaXZWYWx1ZSwgYW1vdW50VG9BZGQpCglpZiBvdmVyZmxvdyB7CgkJcGFuaWMoZXJyU2FmZU1hdGhPdmVyZmxvdykKCX0KCXJldHVybiB1MjU2LkRpdlJvdW5kaW5nVXAobGlxdWlkaXR5U2hpZnRlZCwgZGVub21pbmF0b3IpCn0KCi8vIGdldE5leHRQcmljZUFtb3VudDBSZW1vdmUgY2FsY3VsYXRlcyB0aGUgbmV4dCBzcXJ0IHByaWNlIHdoZW4gcmVtb3ZpbmcgdG9rZW4wIGxpcXVpZGl0eSwKLy8gcm91bmRpbmcgdXAgdG8gZW5zdXJlIGNvbnNlcnZhdGl2ZSBwcmljaW5nIGZvciB0aGUgcHJvdG9jb2wuCi8vIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0b2tlbjAgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBwb29sLgovLyBQYW5pY3MgaWYgdmFsaWRhdGlvbiBjaGVja3MgZmFpbCAoaW52YWxpZCBwb29sIHNxcnQgcHJpY2UgY2FsY3VsYXRpb24pLgpmdW5jIGdldE5leHRQcmljZUFtb3VudDBSZW1vdmUoCgljdXJyZW50U3FydFByaWNlWDk2LCBsaXF1aWRpdHksIGFtb3VudFRvUmVtb3ZlICp1MjU2LlVpbnQsCikgKnUyNTYuVWludCB7CgkvLyBsaXF1aWRpdHlTaGlmdGVkID0gbGlxdWlkaXR5IDw8IDk2CglsaXF1aWRpdHlTaGlmdGVkIDo9IHUyNTYuWmVybygpLkxzaChsaXF1aWRpdHksIFE5Nl9SRVNPTFVUSU9OKQoJLy8gYW1vdW50VGltZXNTcXJ0UHJpY2UgPSBhbW91bnRUb1JlbW92ZSAqIGN1cnJlbnRTcXJ0UHJpY2VYOTYKCWFtb3VudFRpbWVzU3FydFByaWNlIDo9IHUyNTYuWmVybygpLk11bChhbW91bnRUb1JlbW92ZSwgY3VycmVudFNxcnRQcmljZVg5NikKCgkvLyBWYWxpZGF0aW9uIGNoZWNrcwoJcXVvdGllbnRDaGVjayA6PSB1MjU2Llplcm8oKS5EaXYoYW1vdW50VGltZXNTcXJ0UHJpY2UsIGFtb3VudFRvUmVtb3ZlKQoJaWYgIXF1b3RpZW50Q2hlY2suRXEoY3VycmVudFNxcnRQcmljZVg5NikgfHwgIWxpcXVpZGl0eVNoaWZ0ZWQuR3QoYW1vdW50VGltZXNTcXJ0UHJpY2UpIHsKCQlwYW5pYyhlcnJJbnZhbGlkUG9vbFNxcnRQcmljZSkKCX0KCglkZW5vbWluYXRvciA6PSB1MjU2Llplcm8oKS5TdWIobGlxdWlkaXR5U2hpZnRlZCwgYW1vdW50VGltZXNTcXJ0UHJpY2UpCglyZXR1cm4gdTI1Ni5NdWxEaXZSb3VuZGluZ1VwKGxpcXVpZGl0eVNoaWZ0ZWQsIGN1cnJlbnRTcXJ0UHJpY2VYOTYsIGRlbm9taW5hdG9yKQp9CgovLyBnZXROZXh0U3FydFByaWNlRnJvbUFtb3VudDBSb3VuZGluZ1VwIGNhbGN1bGF0ZXMgdGhlIG5leHQgc3FydCBwcmljZSBiYXNlZCBvbiB0b2tlbjAgYW1vdW50LAovLyBhbHdheXMgcm91bmRpbmcgdXAgdG8gZW5zdXJlIGNvbnNlcnZhdGl2ZSBwcmljaW5nIGluIGJvdGggZXhhY3Qgb3V0cHV0IGFuZCBleGFjdCBpbnB1dCBjYXNlcy4KLy8gVGhlIGFkZCBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIGxpcXVpZGl0eSBpcyBiZWluZyBhZGRlZCAodHJ1ZSkgb3IgcmVtb3ZlZCAoZmFsc2UpLgpmdW5jIGdldE5leHRTcXJ0UHJpY2VGcm9tQW1vdW50MFJvdW5kaW5nVXAoCglzcXJ0UFg5NiAqdTI1Ni5VaW50LAoJbGlxdWlkaXR5ICp1MjU2LlVpbnQsCglhbW91bnQgKnUyNTYuVWludCwKCWFkZCBib29sLAopICp1MjU2LlVpbnQgewoJLy8gU2hvcnRjdXQ6IGlmIG5vIGFtb3VudCwgcmV0dXJuIG9yaWdpbmFsIHByaWNlCglpZiBhbW91bnQuSXNaZXJvKCkgewoJCXJldHVybiBzcXJ0UFg5NgoJfQoKCWlmIGFkZCB7CgkJcmV0dXJuIGdldE5leHRQcmljZUFtb3VudDBBZGQoc3FydFBYOTYsIGxpcXVpZGl0eSwgYW1vdW50KQoJfQoJcmV0dXJuIGdldE5leHRQcmljZUFtb3VudDBSZW1vdmUoc3FydFBYOTYsIGxpcXVpZGl0eSwgYW1vdW50KQp9CgovLyBnZXROZXh0UHJpY2VBbW91bnQxQWRkIGNhbGN1bGF0ZXMgdGhlIG5leHQgc3FydCBwcmljZSB3aGVuIGFkZGluZyB0b2tlbjEsCi8vIHByZXNlcnZpbmcgcm91bmRpbmctZG93biBsb2dpYyBmb3IgdGhlIGZpbmFsIHJlc3VsdC4KLy8gVGhpcyBpbnRlcm5hbCBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRva2VuMSBpcyBiZWluZyBhZGRlZCB0byB0aGUgcG9vbC4KZnVuYyBnZXROZXh0UHJpY2VBbW91bnQxQWRkKAoJc3FydFBYOTYsIGxpcXVpZGl0eSwgYW1vdW50ICp1MjU2LlVpbnQsCikgKnUyNTYuVWludCB7Cgl2YXIgcXVvdGllbnQgKnUyNTYuVWludAoKCWlmIGFtb3VudC5MdGUoY29uc3RzLk1heDE2MCgpKSB7CgkJLy8gVXNlIGxvY2FsIHZhcmlhYmxlcyB0byBhdm9pZCBhbGxvY2F0aW9uIGNvbmZsaWN0cwoJCXNoaWZ0ZWQgOj0gdTI1Ni5aZXJvKCkuTHNoKGFtb3VudCwgUTk2X1JFU09MVVRJT04pCgkJcXVvdGllbnQgPSB1MjU2Llplcm8oKS5EaXYoc2hpZnRlZCwgbGlxdWlkaXR5KQoJfSBlbHNlIHsKCQlxdW90aWVudCA9IHUyNTYuTXVsRGl2KGFtb3VudCwgY29uc3RzLlE5NigpLCBsaXF1aWRpdHkpCgl9CgoJcmVzdWx0LCBvdmVyZmxvdyA6PSB1MjU2Llplcm8oKS5BZGRPdmVyZmxvdyhzcXJ0UFg5NiwgcXVvdGllbnQpCglpZiBvdmVyZmxvdyB8fCByZXN1bHQuR3QoY29uc3RzLk1heDE2MCgpKSB7CgkJcGFuaWMoZXJyU3FydFByaWNlT3ZlcmZsb3cpCgl9CgoJcmV0dXJuIHJlc3VsdAp9CgovLyBnZXROZXh0UHJpY2VBbW91bnQxUmVtb3ZlIGNhbGN1bGF0ZXMgdGhlIG5leHQgc3FydCBwcmljZSB3aGVuIHJlbW92aW5nIHRva2VuMSwKLy8gcHJlc2VydmluZyByb3VuZGluZy1kb3duIGxvZ2ljIGZvciB0aGUgZmluYWwgcmVzdWx0LgovLyBUaGlzIGludGVybmFsIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdG9rZW4xIGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgcG9vbC4KLy8gUGFuaWNzIGlmIHNxcnQgcHJpY2Ugd291bGQgZXhjZWVkIHF1b3RpZW50LgpmdW5jIGdldE5leHRQcmljZUFtb3VudDFSZW1vdmUoCglzcXJ0UFg5NiwgbGlxdWlkaXR5LCBhbW91bnQgKnUyNTYuVWludCwKKSAqdTI1Ni5VaW50IHsKCXZhciBxdW90aWVudCAqdTI1Ni5VaW50CgoJaWYgYW1vdW50Lkx0ZShjb25zdHMuTWF4MTYwKCkpIHsKCQlzaGlmdGVkIDo9IHUyNTYuWmVybygpLkxzaChhbW91bnQsIFE5Nl9SRVNPTFVUSU9OKQoJCXF1b3RpZW50ID0gdTI1Ni5EaXZSb3VuZGluZ1VwKHNoaWZ0ZWQsIGxpcXVpZGl0eSkKCX0gZWxzZSB7CgkJcXVvdGllbnQgPSB1MjU2Lk11bERpdlJvdW5kaW5nVXAoYW1vdW50LCBjb25zdHMuUTk2KCksIGxpcXVpZGl0eSkKCX0KCglpZiAhc3FydFBYOTYuR3QocXVvdGllbnQpIHsKCQlwYW5pYyhlcnJTcXJ0UHJpY2VFeGNlZWRzUXVvdGllbnQpCgl9CgoJcmV0dXJuIHUyNTYuWmVybygpLlN1YihzcXJ0UFg5NiwgcXVvdGllbnQpCn0KCi8vIGdldE5leHRTcXJ0UHJpY2VGcm9tQW1vdW50MVJvdW5kaW5nRG93biBjYWxjdWxhdGVzIHRoZSBuZXh0IHNxcnQgcHJpY2UgYmFzZWQgb24gdG9rZW4xIGFtb3VudCwKLy8gYWx3YXlzIHJvdW5kaW5nIGRvd24gdG8gZW5zdXJlIGNvbnNlcnZhdGl2ZSBwcmljaW5nIGluIGJvdGggZXhhY3Qgb3V0cHV0IGFuZCBleGFjdCBpbnB1dCBjYXNlcy4KLy8gVGhlIGFkZCBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIGxpcXVpZGl0eSBpcyBiZWluZyBhZGRlZCAodHJ1ZSkgb3IgcmVtb3ZlZCAoZmFsc2UpLgpmdW5jIGdldE5leHRTcXJ0UHJpY2VGcm9tQW1vdW50MVJvdW5kaW5nRG93bigKCXNxcnRQWDk2LAoJbGlxdWlkaXR5LAoJYW1vdW50ICp1MjU2LlVpbnQsCglhZGQgYm9vbCwKKSAqdTI1Ni5VaW50IHsKCS8vIFNob3J0Y3V0OiBpZiBubyBhbW91bnQsIHJldHVybiBvcmlnaW5hbCBwcmljZQoJaWYgYW1vdW50LklzWmVybygpIHsKCQlyZXR1cm4gc3FydFBYOTYKCX0KCglpZiBhZGQgewoJCXJldHVybiBnZXROZXh0UHJpY2VBbW91bnQxQWRkKHNxcnRQWDk2LCBsaXF1aWRpdHksIGFtb3VudCkKCX0KCXJldHVybiBnZXROZXh0UHJpY2VBbW91bnQxUmVtb3ZlKHNxcnRQWDk2LCBsaXF1aWRpdHksIGFtb3VudCkKfQoKLy8gZ2V0TmV4dFNxcnRQcmljZUZyb21JbnB1dCBjYWxjdWxhdGVzIHRoZSBuZXh0IHNxcnQgcHJpY2UgYWZ0ZXIgYWRkaW5nIHRva2VucyB0byB0aGUgcG9vbCwKLy8gcm91bmRpbmcgdXAgZm9yIGNvbnNlcnZhdGl2ZSBwcmljaW5nIGluIGJvdGggc3dhcCBkaXJlY3Rpb25zLgovLyBUaGUgemVyb0Zvck9uZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHN3YXAgZGlyZWN0aW9uICh0b2tlbjAgZm9yIHRva2VuMSB3aGVuIHRydWUpLgovLyBQYW5pY3MgaWYgc3FydFBYOTYgb3IgbGlxdWlkaXR5IGlzIHplcm8uCmZ1bmMgZ2V0TmV4dFNxcnRQcmljZUZyb21JbnB1dCgKCXNxcnRQWDk2LCBsaXF1aWRpdHksIGFtb3VudEluICp1MjU2LlVpbnQsCgl6ZXJvRm9yT25lIGJvb2wsCikgKnUyNTYuVWludCB7CglpZiBzcXJ0UFg5Ni5Jc1plcm8oKSB7CgkJcGFuaWMoZXJyU3FydFByaWNlWmVybykKCX0KCglpZiBsaXF1aWRpdHkuSXNaZXJvKCkgewoJCXBhbmljKGVyckxpcXVpZGl0eVplcm8pCgl9CgoJaWYgemVyb0Zvck9uZSB7CgkJcmV0dXJuIGdldE5leHRTcXJ0UHJpY2VGcm9tQW1vdW50MFJvdW5kaW5nVXAoc3FydFBYOTYsIGxpcXVpZGl0eSwgYW1vdW50SW4sIHRydWUpCgl9CgoJcmV0dXJuIGdldE5leHRTcXJ0UHJpY2VGcm9tQW1vdW50MVJvdW5kaW5nRG93bihzcXJ0UFg5NiwgbGlxdWlkaXR5LCBhbW91bnRJbiwgdHJ1ZSkKfQoKLy8gZ2V0TmV4dFNxcnRQcmljZUZyb21PdXRwdXQgY2FsY3VsYXRlcyB0aGUgbmV4dCBzcXJ0IHByaWNlIGFmdGVyIHJlbW92aW5nIHRva2VucyBmcm9tIHRoZSBwb29sLAovLyB1c2luZyBkaWZmZXJlbnQgcm91bmRpbmcgZGlyZWN0aW9ucyBiYXNlZCBvbiBzd2FwIGRpcmVjdGlvbi4KLy8gVGhlIHplcm9Gb3JPbmUgcGFyYW1ldGVyIGluZGljYXRlcyBzd2FwIGRpcmVjdGlvbiAodG9rZW4wIGZvciB0b2tlbjEgd2hlbiB0cnVlKS4KLy8gUGFuaWNzIGlmIHNxcnRQWDk2IG9yIGxpcXVpZGl0eSBpcyB6ZXJvLgpmdW5jIGdldE5leHRTcXJ0UHJpY2VGcm9tT3V0cHV0KAoJc3FydFBYOTYsIGxpcXVpZGl0eSwgYW1vdW50T3V0ICp1MjU2LlVpbnQsCgl6ZXJvRm9yT25lIGJvb2wsCikgKnUyNTYuVWludCB7CglpZiBzcXJ0UFg5Ni5Jc1plcm8oKSB7CgkJcGFuaWMoZXJyU3FydFByaWNlWmVybykKCX0KCglpZiBsaXF1aWRpdHkuSXNaZXJvKCkgewoJCXBhbmljKGVyckxpcXVpZGl0eVplcm8pCgl9CgoJaWYgemVyb0Zvck9uZSB7CgkJcmV0dXJuIGdldE5leHRTcXJ0UHJpY2VGcm9tQW1vdW50MVJvdW5kaW5nRG93bihzcXJ0UFg5NiwgbGlxdWlkaXR5LCBhbW91bnRPdXQsIGZhbHNlKQoJfQoKCXJldHVybiBnZXROZXh0U3FydFByaWNlRnJvbUFtb3VudDBSb3VuZGluZ1VwKHNxcnRQWDk2LCBsaXF1aWRpdHksIGFtb3VudE91dCwgZmFsc2UpCn0KCi8vIGdldEFtb3VudDBEZWx0YUhlbHBlciBjYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSB0b2tlbjAgYW1vdW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcHJpY2UgcmFuZ2VzLAovLyBhdXRvbWF0aWNhbGx5IHN3YXBwaW5nIGlucHV0cyB0byBlbnN1cmUgY29ycmVjdCBvcmRlcmluZy4gVGhlIHJvdW5kVXAgcGFyYW1ldGVyIGNvbnRyb2xzCi8vIHJvdW5kaW5nIGRpcmVjdGlvbiBmb3IgdGhlIGZpbmFsIHJlc3VsdCB0byBlbnN1cmUgY29uc2VydmF0aXZlIEFNTSBjYWxjdWxhdGlvbnMuCi8vIFBhbmljcyBpZiBzcXJ0UmF0aW9BWDk2IGlzIHplcm8uCmZ1bmMgZ2V0QW1vdW50MERlbHRhSGVscGVyKAoJc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiwgbGlxdWlkaXR5ICp1MjU2LlVpbnQsCglyb3VuZFVwIGJvb2wsCikgKnUyNTYuVWludCB7CglpZiBzcXJ0UmF0aW9BWDk2Lkd0KHNxcnRSYXRpb0JYOTYpIHsKCQlzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2ID0gc3FydFJhdGlvQlg5Niwgc3FydFJhdGlvQVg5NgoJfQoKCS8vIFVzZSBsb2NhbCB2YXJpYWJsZXMgZm9yIHRocmVhZCBzYWZldHkKCW51bWVyYXRvciA6PSB1MjU2Llplcm8oKS5Mc2gobGlxdWlkaXR5LCBROTZfUkVTT0xVVElPTikKCWRpZmZlcmVuY2UgOj0gdTI1Ni5aZXJvKCkuU3ViKHNxcnRSYXRpb0JYOTYsIHNxcnRSYXRpb0FYOTYpCgoJaWYgc3FydFJhdGlvQVg5Ni5Jc1plcm8oKSB7CgkJcGFuaWMoZXJyU3FydFJhdGlvQVg5Nlplcm8pCgl9CgoJaWYgcm91bmRVcCB7CgkJaW50ZXJtZWRpYXRlIDo9IHUyNTYuTXVsRGl2Um91bmRpbmdVcChudW1lcmF0b3IsIGRpZmZlcmVuY2UsIHNxcnRSYXRpb0JYOTYpCgkJcmV0dXJuIHUyNTYuRGl2Um91bmRpbmdVcChpbnRlcm1lZGlhdGUsIHNxcnRSYXRpb0FYOTYpCgl9CgoJaW50ZXJtZWRpYXRlIDo9IHUyNTYuTXVsRGl2KG51bWVyYXRvciwgZGlmZmVyZW5jZSwgc3FydFJhdGlvQlg5NikKCXJldHVybiB1MjU2Llplcm8oKS5EaXYoaW50ZXJtZWRpYXRlLCBzcXJ0UmF0aW9BWDk2KQp9CgovLyBnZXRBbW91bnQxRGVsdGFIZWxwZXIgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgdG9rZW4xIGFtb3VudCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHByaWNlIHJhbmdlcywKLy8gYXV0b21hdGljYWxseSBzd2FwcGluZyBpbnB1dHMgdG8gZW5zdXJlIGNvcnJlY3Qgb3JkZXJpbmcuIFRoZSByb3VuZFVwIHBhcmFtZXRlciBjb250cm9scwovLyByb3VuZGluZyBkaXJlY3Rpb24gZm9yIHRoZSBmaW5hbCByZXN1bHQgdG8gZW5zdXJlIGNvbnNlcnZhdGl2ZSBBTU0gY2FsY3VsYXRpb25zLgpmdW5jIGdldEFtb3VudDFEZWx0YUhlbHBlcigKCXNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYsIGxpcXVpZGl0eSAqdTI1Ni5VaW50LAoJcm91bmRVcCBib29sLAopICp1MjU2LlVpbnQgewoJaWYgc3FydFJhdGlvQVg5Ni5HdChzcXJ0UmF0aW9CWDk2KSB7CgkJc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiA9IHNxcnRSYXRpb0JYOTYsIHNxcnRSYXRpb0FYOTYKCX0KCgkvLyBhbW91bnQxID0gbGlxdWlkaXR5ICogKHNxcnRCIC0gc3FydEEpIC8gMl45NgoJLy8gVXNlIGxvY2FsIHZhcmlhYmxlIGZvciB0aHJlYWQgc2FmZXR5CglkaWZmZXJlbmNlIDo9IHUyNTYuWmVybygpLlN1YihzcXJ0UmF0aW9CWDk2LCBzcXJ0UmF0aW9BWDk2KQoKCWlmIHJvdW5kVXAgewoJCXJldHVybiB1MjU2Lk11bERpdlJvdW5kaW5nVXAobGlxdWlkaXR5LCBkaWZmZXJlbmNlLCBjb25zdHMuUTk2KCkpCgl9CgoJcmV0dXJuIHUyNTYuTXVsRGl2KGxpcXVpZGl0eSwgZGlmZmVyZW5jZSwgY29uc3RzLlE5NigpKQp9CgovLyBHZXRBbW91bnQwRGVsdGEgY29tcHV0ZXMgdGhlIHNpZ25lZCB0b2tlbjAgYW1vdW50IHJlcHJlc2VudGVkIGJldHdlZW4gdHdvIHByaWNlcy4KLy8gUG9zaXRpdmUgbGlxdWlkaXR5IHJvdW5kcyB0aGUgYW1vdW50IHVwOyBuZWdhdGl2ZSBsaXF1aWRpdHkgcmV0dXJucyBhIG5lZ2F0aXZlIGFtb3VudAovLyByb3VuZGVkIGRvd24gYWZ0ZXIgYXBwbHlpbmcgdGhlIG1hZ25pdHVkZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHNxcnRSYXRpb0FYOTY6IEZpcnN0IHByaWNlIGVuZHBvaW50IGluIFE2NC45NiBzcXVhcmUtcm9vdCBmb3JtYXQuCi8vICAgLSBzcXJ0UmF0aW9CWDk2OiBTZWNvbmQgcHJpY2UgZW5kcG9pbnQgaW4gUTY0Ljk2IHNxdWFyZS1yb290IGZvcm1hdC4KLy8gICAtIGxpcXVpZGl0eTogU2lnbmVkIGxpcXVpZGl0eSB2YWx1ZTsgaXRzIHNpZ24gZGV0ZXJtaW5lcyB0aGUgcmVzdWx0IHNpZ24gYW5kIHJvdW5kaW5nLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50MERlbHRhOiBTaWduZWQgaW50MjU2IHRva2VuMCBhbW91bnQgcmVwcmVzZW50ZWQgYnkgdGhlIHJhbmdlLgovLwovLyBQYW5pY3MgaWYgYW4gaW5wdXQgaXMgbmlsIG9yIHRoZSBjb21wdXRlZCBtYWduaXR1ZGUgY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IGludDI1Ni4KZnVuYyBHZXRBbW91bnQwRGVsdGEoCglzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2ICp1MjU2LlVpbnQsCglsaXF1aWRpdHkgKmkyNTYuSW50LAopICppMjU2LkludCB7CglpZiBzcXJ0UmF0aW9BWDk2ID09IG5pbCB8fCBzcXJ0UmF0aW9CWDk2ID09IG5pbCB8fCBsaXF1aWRpdHkgPT0gbmlsIHsKCQlwYW5pYyhlcnJHZXRBbW91bnQwRGVsdGFOaWxJbnB1dCkKCX0KCglpZiBsaXF1aWRpdHkuSXNOZWcoKSB7CgkJdSA6PSBnZXRBbW91bnQwRGVsdGFIZWxwZXIoc3FydFJhdGlvQVg5Niwgc3FydFJhdGlvQlg5NiwgbGlxdWlkaXR5LkFicygpLCBmYWxzZSkKCQlpZiB1Lkd0KGNvbnN0cy5NYXhJbnQyNTYoKSkgewoJCQkvLyBpZiB1ID4gKDIqKjI1NSAtIDEpLCBjYW5ub3QgY2FzdCB0byBpbnQyNTYKCQkJcGFuaWMoZXJyQW1vdW50MERlbHRhT3ZlcmZsb3cpCgkJfQoKCQkvLyBDb252ZXJ0IHRvIGkyNTYgYW5kIG5lZ2F0ZSBwcm9wZXJseQoJCXJldHVybiBpMjU2Llplcm8oKS5OZWcoaTI1Ni5Gcm9tVWludDI1Nih1KSkKCX0KCgl1IDo9IGdldEFtb3VudDBEZWx0YUhlbHBlcihzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBsaXF1aWRpdHkuQWJzKCksIHRydWUpCglpZiB1Lkd0KGNvbnN0cy5NYXhJbnQyNTYoKSkgewoJCS8vIGlmIHUgPiAoMioqMjU1IC0gMSksIGNhbm5vdCBjYXN0IHRvIGludDI1NgoJCXBhbmljKGVyckFtb3VudDBEZWx0YU92ZXJmbG93KQoJfQoKCXJldHVybiBpMjU2LkZyb21VaW50MjU2KHUpCn0KCi8vIEdldEFtb3VudDFEZWx0YSBjb21wdXRlcyB0aGUgc2lnbmVkIHRva2VuMSBhbW91bnQgcmVwcmVzZW50ZWQgYmV0d2VlbiB0d28gcHJpY2VzLgovLyBQb3NpdGl2ZSBsaXF1aWRpdHkgcm91bmRzIHRoZSBhbW91bnQgdXA7IG5lZ2F0aXZlIGxpcXVpZGl0eSByZXR1cm5zIGEgbmVnYXRpdmUgYW1vdW50Ci8vIHJvdW5kZWQgZG93biBhZnRlciBhcHBseWluZyB0aGUgbWFnbml0dWRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc3FydFJhdGlvQVg5NjogRmlyc3QgcHJpY2UgZW5kcG9pbnQgaW4gUTY0Ljk2IHNxdWFyZS1yb290IGZvcm1hdC4KLy8gICAtIHNxcnRSYXRpb0JYOTY6IFNlY29uZCBwcmljZSBlbmRwb2ludCBpbiBRNjQuOTYgc3F1YXJlLXJvb3QgZm9ybWF0LgovLyAgIC0gbGlxdWlkaXR5OiBTaWduZWQgbGlxdWlkaXR5IHZhbHVlOyBpdHMgc2lnbiBkZXRlcm1pbmVzIHRoZSByZXN1bHQgc2lnbiBhbmQgcm91bmRpbmcuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQxRGVsdGE6IFNpZ25lZCBpbnQyNTYgdG9rZW4xIGFtb3VudCByZXByZXNlbnRlZCBieSB0aGUgcmFuZ2UuCi8vCi8vIFBhbmljcyBpZiBhbiBpbnB1dCBpcyBuaWwgb3IgdGhlIGNvbXB1dGVkIG1hZ25pdHVkZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYnkgaW50MjU2LgpmdW5jIEdldEFtb3VudDFEZWx0YSgKCXNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYgKnUyNTYuVWludCwKCWxpcXVpZGl0eSAqaTI1Ni5JbnQsCikgKmkyNTYuSW50IHsKCWlmIHNxcnRSYXRpb0FYOTYgPT0gbmlsIHx8IHNxcnRSYXRpb0JYOTYgPT0gbmlsIHx8IGxpcXVpZGl0eSA9PSBuaWwgewoJCXBhbmljKGVyckdldEFtb3VudDFEZWx0YU5pbElucHV0KQoJfQoKCWlmIGxpcXVpZGl0eS5Jc05lZygpIHsKCQl1IDo9IGdldEFtb3VudDFEZWx0YUhlbHBlcihzcXJ0UmF0aW9BWDk2LCBzcXJ0UmF0aW9CWDk2LCBsaXF1aWRpdHkuQWJzKCksIGZhbHNlKQoJCWlmIHUuR3QoY29uc3RzLk1heEludDI1NigpKSB7CgkJCS8vIGlmIHUgPiAoMioqMjU1IC0gMSksIGNhbm5vdCBjYXN0IHRvIGludDI1NgoJCQlwYW5pYyhlcnJBbW91bnQxRGVsdGFPdmVyZmxvdykKCQl9CgoJCS8vIENvbnZlcnQgdG8gaTI1NiBhbmQgbmVnYXRlIHByb3Blcmx5CgkJcmV0dXJuIGkyNTYuWmVybygpLk5lZyhpMjU2LkZyb21VaW50MjU2KHUpKQoJfQoKCXUgOj0gZ2V0QW1vdW50MURlbHRhSGVscGVyKHNxcnRSYXRpb0FYOTYsIHNxcnRSYXRpb0JYOTYsIGxpcXVpZGl0eS5BYnMoKSwgdHJ1ZSkKCWlmIHUuR3QoY29uc3RzLk1heEludDI1NigpKSB7CgkJLy8gaWYgdSA+ICgyKioyNTUgLSAxKSwgY2Fubm90IGNhc3QgdG8gaW50MjU2CgkJcGFuaWMoZXJyQW1vdW50MURlbHRhT3ZlcmZsb3cpCgl9CgoJcmV0dXJuIGkyNTYuRnJvbVVpbnQyNTYodSkKfQoa3j0KDXN3YXBfbWF0aC5nbm8SzD1wYWNrYWdlIGduc21hdGgKCmltcG9ydCAoCglpMjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvaW50MjU2L3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIGRlbm9taW5hdG9yIHJlcHJlc2VudHMgMTAwJSBpbiB0aGUgZmVlIGNhbGN1bGF0aW9uIGJhc2lzICgxLDAwMCwwMDAgPSAxMDAlKS4KLy8gRmVlIGNhbGN1bGF0aW9ucyB1c2UgdGhpcyB0byBjb252ZXJ0IGZlZVBpcHMgdG8gYWN0dWFsIHBlcmNlbnRhZ2VzLgovLyBGb3IgZXhhbXBsZSwgZmVlUGlwcz0zMDAwIG1lYW5zIDMwMDAvMTAwMDAwMCA9IDAuMyUgZmVlLgpjb25zdCBkZW5vbWluYXRvciA9IHVpbnQ2NCgxXzAwMF8wMDApCgovLyBTd2FwTWF0aENvbXB1dGVTd2FwU3RlcCBjb21wdXRlcyBvbmUgc3dhcCBzdGVwIHdpdGhpbiBhIHNpbmdsZSB0aWNrIHJhbmdlLgovLyBJdCBkZXRlcm1pbmVzIHRoZSBuZXh0IHNxdWFyZS1yb290IHByaWNlLCBpbnB1dCBhbW91bnQsIG91dHB1dCBhbW91bnQsIGFuZCBmZWUsCi8vIHVzaW5nIGV4YWN0LWlucHV0IG9yIGV4YWN0LW91dHB1dCBzZW1hbnRpY3MgZnJvbSBhbW91bnRSZW1haW5pbmcuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzcXJ0UmF0aW9DdXJyZW50WDk2OiBDdXJyZW50IHBvb2wgc3F1YXJlLXJvb3QgcHJpY2UgaW4gUTk2IGZpeGVkLXBvaW50IGZvcm1hdC4KLy8gICAtIHNxcnRSYXRpb1RhcmdldFg5NjogVGljay1ib3VuZGFyeSBzcXVhcmUtcm9vdCBwcmljZSB0aGF0IHRoaXMgc3RlcCBtYXkgcmVhY2guCi8vICAgLSBsaXF1aWRpdHk6IE5vbi1uZWdhdGl2ZSBsaXF1aWRpdHkgYWN0aXZlIGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRhcmdldCBwcmljZXMuCi8vICAgLSBhbW91bnRSZW1haW5pbmc6IFNpZ25lZCBhbW91bnQgcmVtYWluaW5nOyBub24tbmVnYXRpdmUgc2VsZWN0cyBleGFjdCBpbnB1dCwgbmVnYXRpdmUgc2VsZWN0cyBleGFjdCBvdXRwdXQuCi8vICAgLSBmZWVQaXBzOiBGZWUgcmF0ZSBpbiBtaWxsaW9udGhzIG9mIHRoZSBpbnB1dCBhbW91bnQgKDMsMDAwIHJlcHJlc2VudHMgMC4zJSkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzcXJ0UmF0aW9OZXh0WDk2OiBTcXVhcmUtcm9vdCBwcmljZSBhZnRlciBhcHBseWluZyB0aGlzIHN0ZXAsIHdpdGhpbiB0aGUgdmFsaWQgcG9vbCBwcmljZSBib3VuZHMuCi8vICAgLSBhbW91bnRJbjogQW1vdW50IG9mIHRoZSBpbnB1dCB0b2tlbiBjb25zdW1lZCBieSB0aGlzIHN0ZXAsIGV4Y2x1ZGluZyB0aGUgZmVlLgovLyAgIC0gYW1vdW50T3V0OiBBbW91bnQgb2YgdGhlIG91dHB1dCB0b2tlbiBwcm9kdWNlZCBieSB0aGlzIHN0ZXAuCi8vICAgLSBmZWVBbW91bnQ6IElucHV0LXRva2VuIGZlZSBjaGFyZ2VkIGZvciB0aGlzIHN0ZXAuCi8vCi8vIFBhbmljcyBpZiBhbiBpbnB1dCBwb2ludGVyIGlzIG5pbCwgZmVlUGlwcyBpcyBhdCBsZWFzdCAxLDAwMCwwMDAsIGFyaXRobWV0aWMKLy8gb3ZlcmZsb3dzLCBvciB0aGUgcmVzdWx0aW5nIHNxdWFyZS1yb290IHByaWNlIGlzIG91dHNpZGUgdGhlIHZhbGlkIGJvdW5kcy4KZnVuYyBTd2FwTWF0aENvbXB1dGVTd2FwU3RlcCgKCXNxcnRSYXRpb0N1cnJlbnRYOTYgKnUyNTYuVWludCwKCXNxcnRSYXRpb1RhcmdldFg5NiAqdTI1Ni5VaW50LAoJbGlxdWlkaXR5ICp1MjU2LlVpbnQsCglhbW91bnRSZW1haW5pbmcgKmkyNTYuSW50LAoJZmVlUGlwcyB1aW50NjQsCikgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQsICp1MjU2LlVpbnQsICp1MjU2LlVpbnQpIHsKCWlmIHNxcnRSYXRpb0N1cnJlbnRYOTYgPT0gbmlsIHx8IHNxcnRSYXRpb1RhcmdldFg5NiA9PSBuaWwgfHwKCQlsaXF1aWRpdHkgPT0gbmlsIHx8IGFtb3VudFJlbWFpbmluZyA9PSBuaWwgewoJCXBhbmljKCJTd2FwTWF0aENvbXB1dGVTd2FwU3RlcDogaW5wdXQgcGFyYW1ldGVycyBjYW5ub3QgYmUgbmlsIikKCX0KCgkvLyBUaGlzIGZ1bmN0aW9uIGlzIHB1YmxpY2x5IGFjY2Vzc2libGUgYW5kIGNhbiBiZSBjYWxsZWQgYnkgZXh0ZXJuYWwgdXNlcnMgb3IgY29udHJhY3RzLgoJLy8gV2hpbGUgdGhlIHBvb2wgcmVhbG0gb25seSB1c2VzIHByZWRlZmluZWQgZmVlIHZhbHVlcyAoMTAwLCA1MDAsIDMwMDAsIDEwMDAwKSB3aGljaCBhcmUgc2FmZWx5IHdpdGhpbiByYW5nZSwKCS8vIGV4dGVybmFsIGNhbGxlcnMgY291bGQgcG90ZW50aWFsbHkgcGFzcyBhbnkgZmVlUGlwcyB2YWx1ZS4gVGhlIGZlZSBjYWxjdWxhdGlvbiBpbnZvbHZlcyBkaXZpZGluZyBieQoJLy8gKDEwMDAwMDAgLSBmZWVQaXBzKSwgc28gZmVlUGlwcyBtdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiAxMDAwMDAwIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8uCgkvLyBUaGlzIGZvbGxvd3MgVW5pc3dhcCBWMydzIGZhY3RvcnktbGV2ZWwgdmFsaWRhdGlvbjogcmVxdWlyZShmZWUgPCAxMDAwMDAwKS4KCWlmIGZlZVBpcHMgPj0gZGVub21pbmF0b3IgewoJCXBhbmljKCJTd2FwTWF0aENvbXB1dGVTd2FwU3RlcDogZmVlUGlwcyBtdXN0IGJlIGxlc3MgdGhhbiAxMDAwMDAwIikKCX0KCgkvLyB6ZXJvRm9yT25lIGRldGVybWluZXMgc3dhcCBkaXJlY3Rpb24gYmFzZWQgb24gdGhlIHJlbGF0aW9uc2hpcCBvZiBjdXJyZW50IHZzLiB0YXJnZXQKCXplcm9Gb3JPbmUgOj0gc3FydFJhdGlvQ3VycmVudFg5Ni5HdGUoc3FydFJhdGlvVGFyZ2V0WDk2KQoKCS8vIFBPU0lUSVZFID09IEVYQUNUX0lOID0+IEVzdGltYXRlZCBBbW91bnRPdXQKCS8vIE5FR0FUSVZFID09IEVYQUNUX09VVCA9PiBFc3RpbWF0ZWQgQW1vdW50SW4KCWV4YWN0SW4gOj0gIWFtb3VudFJlbWFpbmluZy5Jc05lZygpCgoJYW1vdW50UmVtYWluaW5nQWJzIDo9IGFtb3VudFJlbWFpbmluZy5BYnMoKQoJZmVlUmF0ZUluUGlwcyA6PSB1MjU2Lk5ld1VpbnQoZmVlUGlwcykKCXdpdGhvdXRGZWVSYXRlSW5QaXBzIDo9IHUyNTYuTmV3VWludChkZW5vbWluYXRvciAtIGZlZVBpcHMpCgoJc3FydFJhdGlvTmV4dFg5NiA6PSB1MjU2Llplcm8oKQoJYW1vdW50SW4gOj0gdTI1Ni5aZXJvKCkKCWFtb3VudE91dCA6PSB1MjU2Llplcm8oKQoJZmVlQW1vdW50IDo9IHUyNTYuWmVybygpCgoJaWYgZXhhY3RJbiB7CgkJLy8gSGFuZGxlIEVYQUNUX0lOIHNjZW5hcmlvIGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24KCQlzcXJ0UmF0aW9OZXh0WDk2LCBhbW91bnRJbiA9IGhhbmRsZUV4YWN0SW4oCgkJCXplcm9Gb3JPbmUsCgkJCXNxcnRSYXRpb0N1cnJlbnRYOTYsCgkJCXNxcnRSYXRpb1RhcmdldFg5NiwKCQkJbGlxdWlkaXR5LAoJCQlhbW91bnRSZW1haW5pbmdBYnMsIC8vIHVzZSBhYnNvbHV0ZSB2YWx1ZSBoZXJlCgkJCXdpdGhvdXRGZWVSYXRlSW5QaXBzLAoJCSkKCX0gZWxzZSB7CgkJLy8gSGFuZGxlIEVYQUNUX09VVCBzY2VuYXJpbyBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uCgkJc3FydFJhdGlvTmV4dFg5NiwgYW1vdW50T3V0ID0gaGFuZGxlRXhhY3RPdXQoCgkJCXplcm9Gb3JPbmUsCgkJCXNxcnRSYXRpb0N1cnJlbnRYOTYsCgkJCXNxcnRSYXRpb1RhcmdldFg5NiwKCQkJbGlxdWlkaXR5LAoJCQlhbW91bnRSZW1haW5pbmdBYnMsCgkJKQoJfQoKCS8vIGlzTWF4IGNoZWNrcyBpZiB3ZSd2ZSBoaXQgdGhlIGJvdW5kYXJ5IHByaWNlICh0YXJnZXQpCglpc01heCA6PSBzcXJ0UmF0aW9UYXJnZXRYOTYuRXEoc3FydFJhdGlvTmV4dFg5NikKCgkvLyBDYWxjdWxhdGUgZmluYWwgYW1vdW50SW4sIGFtb3VudE91dCBpZiBuZWVkZWQKCWlmIHplcm9Gb3JPbmUgewoJCS8vIElmIGlzTWF4ICYmIGV4YWN0SW4sIHdlIGFscmVhZHkgaGF2ZSB0aGUgY29ycmVjdCBhbW91bnRJbgoJCWlmICEoaXNNYXggJiYgZXhhY3RJbikgewoJCQlhbW91bnRJbiA9IGdldEFtb3VudDBEZWx0YUhlbHBlcigKCQkJCXNxcnRSYXRpb05leHRYOTYsCgkJCQlzcXJ0UmF0aW9DdXJyZW50WDk2LAoJCQkJbGlxdWlkaXR5LAoJCQkJdHJ1ZSwKCQkJKQoJCX0KCQkvLyBJZiBpc01heCAmJiAhZXhhY3RJbiwgd2UgYWxyZWFkeSBoYXZlIHRoZSBjb3JyZWN0IGFtb3VudE91dAoJCWlmICEoaXNNYXggJiYgIWV4YWN0SW4pIHsKCQkJYW1vdW50T3V0ID0gZ2V0QW1vdW50MURlbHRhSGVscGVyKAoJCQkJc3FydFJhdGlvTmV4dFg5NiwKCQkJCXNxcnRSYXRpb0N1cnJlbnRYOTYsCgkJCQlsaXF1aWRpdHksCgkJCQlmYWxzZSwKCQkJKQoJCX0KCX0gZWxzZSB7CgkJaWYgIShpc01heCAmJiBleGFjdEluKSB7CgkJCWFtb3VudEluID0gZ2V0QW1vdW50MURlbHRhSGVscGVyKAoJCQkJc3FydFJhdGlvQ3VycmVudFg5NiwKCQkJCXNxcnRSYXRpb05leHRYOTYsCgkJCQlsaXF1aWRpdHksCgkJCQl0cnVlLAoJCQkpCgkJfQoJCWlmICEoaXNNYXggJiYgIWV4YWN0SW4pIHsKCQkJYW1vdW50T3V0ID0gZ2V0QW1vdW50MERlbHRhSGVscGVyKAoJCQkJc3FydFJhdGlvQ3VycmVudFg5NiwKCQkJCXNxcnRSYXRpb05leHRYOTYsCgkJCQlsaXF1aWRpdHksCgkJCQlmYWxzZSwKCQkJKQoJCX0KCX0KCgkvLyBJZiB3ZSdyZSBpbiBFWEFDVF9PVVQgbW9kZSBidXQgb3ZlcmNhbGN1bGF0ZWQgJ2Ftb3VudE91dCcKCWlmICFleGFjdEluICYmIGFtb3VudE91dC5HdChhbW91bnRSZW1haW5pbmdBYnMpIHsKCQlhbW91bnRPdXQgPSBhbW91bnRSZW1haW5pbmdBYnMKCX0KCgkvLyBGZWUgbG9naWMKCS8vIElmIGV4YWN0SW4gYW5kIHdlIGhhdmVuJ3QgaGl0IHRoZSB0YXJnZXQsIHRoZSBkaWZmZXJlbmNlIGlzIHRoZSBmZWUKCS8vIEVsc2UsIGNvbXB1dGUgZmVlIGZyb20gZmVlUGlwcwoJaWYgZXhhY3RJbiAmJiAhc3FydFJhdGlvTmV4dFg5Ni5FcShzcXJ0UmF0aW9UYXJnZXRYOTYpIHsKCQlmZWVBbW91bnQgPSB1MjU2Llplcm8oKS5TdWIoYW1vdW50UmVtYWluaW5nQWJzLCBhbW91bnRJbikKCX0gZWxzZSB7CgkJZmVlQW1vdW50ID0gdTI1Ni5NdWxEaXZSb3VuZGluZ1VwKAoJCQlhbW91bnRJbiwKCQkJZmVlUmF0ZUluUGlwcywKCQkJd2l0aG91dEZlZVJhdGVJblBpcHMsCgkJKQoJfQoKCS8vIEZpbmFsIHNhbml0eSBjaGVjayBmb3IgcmVzdWx0aW5nIHByaWNlCglpZiBzcXJ0UmF0aW9OZXh0WDk2Lkx0KE1JTl9TUVJUX1JBVElPKCkpIHx8IHNxcnRSYXRpb05leHRYOTYuR3QoTUFYX1NRUlRfUkFUSU8oKSkgewoJCXBhbmljKGVyckludmFsaWRQb29sU3FydFByaWNlKQoJfQoKCXJldHVybiBzcXJ0UmF0aW9OZXh0WDk2LCBhbW91bnRJbiwgYW1vdW50T3V0LCBmZWVBbW91bnQKfQoKLy8gaGFuZGxlRXhhY3RJbiBoYW5kbGVzIHRoZSBFWEFDVF9JTiBzY2VuYXJpbyBmb3Igc3dhcHMsIHJldHVybmluZyB0aGUgbmV4dCBzcXJ0IHByaWNlIGFuZAovLyBhIHByb3Zpc2lvbmFsIGFtb3VudC4gV2hlbiB0aGUgdGFyZ2V0IHByaWNlIGlzIHJlYWNoZWQsIGl0IHJldHVybnMgdGhlIGV4YWN0IGFtb3VudCBuZWVkZWQuCi8vIFdoZW4gdGhlIHRhcmdldCBpcyBub3QgcmVhY2hlZCwgaXQgcmV0dXJucyB0aGUgYW1vdW50IG5lZWRlZCB0byByZWFjaCB0aGUgdGFyZ2V0ICh3aGljaCB3aWxsCi8vIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY2FsbGVyIHNpbmNlIHdlIG9ubHkgbW92ZWQgcGFydGlhbGx5KS4KLy8gVGhpcyBpbnRlcm5hbCBmdW5jdGlvbiBwcm9jZXNzZXMgc3dhcHMgd2hlcmUgdGhlIGlucHV0IGFtb3VudCBpcyBzcGVjaWZpZWQgZXhhY3RseS4KZnVuYyBoYW5kbGVFeGFjdEluKAoJemVyb0Zvck9uZSBib29sLAoJc3FydFJhdGlvQ3VycmVudFg5NiwKCXNxcnRSYXRpb1RhcmdldFg5NiwKCWxpcXVpZGl0eSwKCWFtb3VudFJlbWFpbmluZ0FicywKCXdpdGhvdXRGZWVSYXRlSW5QaXBzICp1MjU2LlVpbnQsCikgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQpIHsKCWFtb3VudFJlbWFpbmluZ0xlc3NGZWUgOj0gdTI1Ni5NdWxEaXYoCgkJYW1vdW50UmVtYWluaW5nQWJzLAoJCXdpdGhvdXRGZWVSYXRlSW5QaXBzLAoJCXUyNTYuTmV3VWludChkZW5vbWluYXRvciksCgkpCgoJYW1vdW50SW4gOj0gdTI1Ni5aZXJvKCkKCglpZiB6ZXJvRm9yT25lIHsKCQlhbW91bnRJbiA9IGdldEFtb3VudDBEZWx0YUhlbHBlcigKCQkJc3FydFJhdGlvVGFyZ2V0WDk2LAoJCQlzcXJ0UmF0aW9DdXJyZW50WDk2LAoJCQlsaXF1aWRpdHksCgkJCXRydWUsCgkJKQoJfSBlbHNlIHsKCQlhbW91bnRJbiA9IGdldEFtb3VudDFEZWx0YUhlbHBlcigKCQkJc3FydFJhdGlvQ3VycmVudFg5NiwKCQkJc3FydFJhdGlvVGFyZ2V0WDk2LAoJCQlsaXF1aWRpdHksCgkJCXRydWUsCgkJKQoJfQoKCWlmIGFtb3VudFJlbWFpbmluZ0xlc3NGZWUuR3RlKGFtb3VudEluKSB7CgkJcmV0dXJuIHNxcnRSYXRpb1RhcmdldFg5NiwgYW1vdW50SW4KCX0KCgkvLyBXZSBkb24ndCByZWFjaCB0YXJnZXQgcHJpY2U7IHVzZSBwYXJ0aWFsIG1vdmUKCW5leHRTcXJ0IDo9IGdldE5leHRTcXJ0UHJpY2VGcm9tSW5wdXQoCgkJc3FydFJhdGlvQ3VycmVudFg5NiwKCQlsaXF1aWRpdHksCgkJYW1vdW50UmVtYWluaW5nTGVzc0ZlZSwKCQl6ZXJvRm9yT25lLAoJKQoKCS8vIFJldHVybiB0aGUgcGFydGlhbGx5IG1vdmVkIHByaWNlIGFuZCB0aGUgYW1vdW50IHRvIHJlYWNoIHRhcmdldCAod2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgY2FsbGVyKQoJcmV0dXJuIG5leHRTcXJ0LCBhbW91bnRJbgp9CgovLyBoYW5kbGVFeGFjdE91dCBoYW5kbGVzIHRoZSBFWEFDVF9PVVQgc2NlbmFyaW8gZm9yIHN3YXBzLCByZXR1cm5pbmcgdGhlIG5leHQgc3FydCBwcmljZSBhbmQKLy8gYSBwcm92aXNpb25hbCBhbW91bnQuIFdoZW4gdGhlIHRhcmdldCBwcmljZSBpcyByZWFjaGVkLCBpdCByZXR1cm5zIHRoZSBleGFjdCBhbW91bnQgcHJvZHVjZWQuCi8vIFdoZW4gdGhlIHRhcmdldCBpcyBub3QgcmVhY2hlZCBkdWUgdG8gaW5zdWZmaWNpZW50IGxpcXVpZGl0eSwgaXQgcmV0dXJucyB0aGUgYW1vdW50IHRoYXQgd291bGQKLy8gYmUgcHJvZHVjZWQgaWYgd2UgcmVhY2hlZCB0aGUgdGFyZ2V0ICh3aGljaCB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY2FsbGVyKS4KLy8gVGhpcyBpbnRlcm5hbCBmdW5jdGlvbiBwcm9jZXNzZXMgc3dhcHMgd2hlcmUgdGhlIG91dHB1dCBhbW91bnQgaXMgc3BlY2lmaWVkIGV4YWN0bHkuCmZ1bmMgaGFuZGxlRXhhY3RPdXQoCgl6ZXJvRm9yT25lIGJvb2wsCglzcXJ0UmF0aW9DdXJyZW50WDk2LCBzcXJ0UmF0aW9UYXJnZXRYOTYsIGxpcXVpZGl0eSwgYW1vdW50UmVtYWluaW5nQWJzICp1MjU2LlVpbnQsCikgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQpIHsKCWFtb3VudE91dCA6PSB1MjU2Llplcm8oKQoKCWlmIHplcm9Gb3JPbmUgewoJCWFtb3VudE91dCA9IGdldEFtb3VudDFEZWx0YUhlbHBlcihzcXJ0UmF0aW9UYXJnZXRYOTYsIHNxcnRSYXRpb0N1cnJlbnRYOTYsIGxpcXVpZGl0eSwgZmFsc2UpCgl9IGVsc2UgewoJCWFtb3VudE91dCA9IGdldEFtb3VudDBEZWx0YUhlbHBlcihzcXJ0UmF0aW9DdXJyZW50WDk2LCBzcXJ0UmF0aW9UYXJnZXRYOTYsIGxpcXVpZGl0eSwgZmFsc2UpCgl9CgoJLy8gRmFzdCBwYXRoOiBpZiBzdWZmaWNpZW50IGxpcXVpZGl0eSwgdXNlIHRhcmdldCBwcmljZQoJaWYgYW1vdW50UmVtYWluaW5nQWJzLkd0ZShhbW91bnRPdXQpIHsKCQlyZXR1cm4gc3FydFJhdGlvVGFyZ2V0WDk2LCBhbW91bnRPdXQKCX0KCgkvLyBPdGhlcndpc2UsIHBhcnRpYWwgbW92ZTogY29tcHV0ZSBuZXh0IHByaWNlIGZyb20gcmVzaWR1YWwgb3V0cHV0IGFtb3VudAoJLy8gYW5kIHJldHVybiB0aGUgYW1vdW50IHRvIHJlYWNoIHRhcmdldCAod2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgY2FsbGVyKQoJbmV4dFNxcnQgOj0gZ2V0TmV4dFNxcnRQcmljZUZyb21PdXRwdXQoCgkJc3FydFJhdGlvQ3VycmVudFg5NiwKCQlsaXF1aWRpdHksCgkJYW1vdW50UmVtYWluaW5nQWJzLAoJCXplcm9Gb3JPbmUsCgkpCgoJcmV0dXJuIG5leHRTcXJ0LCBhbW91bnRPdXQKfQoa5kgKDXRpY2tfbWF0aC5nbm8S1EhwYWNrYWdlIGduc21hdGgKCmltcG9ydCAoCgkiZXJyb3JzIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL2NvbnN0cy92MSIKCWkyNTYgImduby5sYW5kL3AvZ25vc3dhcC9pbnQyNTYvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKLy8gUHJlLWNhbGN1bGF0ZWQgcmF0aW8gY29uc3RhbnRzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uCi8vCi8vIFRoZXNlIHdlcmUgcHJldmlvdXNseSBwYWNrYWdlLWxldmVsIHZhcnMgKGEgc2xpY2UgcGx1cyAxOSBleHBvc2VkIHBvaW50ZXJzKSwKLy8gdGhlIGV4YWN0ICJnbG9iYWxseSBleHBvc2VkIG11dGFibGUgYXJyYXkiIGFudGktcGF0dGVybi4gVGhleSBhcmUgbm93Ci8vIGNvbnN0cnVjdG9yczogZWFjaCBjYWxsIHJldHVybnMgZnJlc2hseSBhbGxvY2F0ZWQgdmFsdWVzIGJ1aWx0IGZyb20KLy8gbGl0dGxlLWVuZGlhbiBbNF11aW50NjQgbGl0ZXJhbHMsIHNvIG5vIGNhbGxlciBzaGFyZXMgYSBtdXRhYmxlIGluc3RhbmNlIGFuZAovLyBubyBydW50aW1lIGRlY2ltYWwgcGFyc2luZyBoYXBwZW5zLiBWYWx1ZXMgbWF0Y2ggVW5pc3dhcCBWMyBleGFjdGx5LgoKLy8gaW5pdGlhbFJhdGlvIHJldHVybnMgdGhlIExTQi1zZWxlY3RlZCBpbml0aWFsIHJhdGlvLgovLyBhYnNUaWNrJjB4MSAhPSAwIHNlbGVjdHMgcmF0aW8wICgweGZmZmNiOTMzYmQ2ZmFkMzdhYTJkMTYyZDFhNTk0MDAxKSwKLy8gb3RoZXJ3aXNlIHJhdGlvMSAoMl4xMjgpLgpmdW5jIGluaXRpYWxSYXRpbyhvZGQgYm9vbCkgKnUyNTYuVWludCB7CglpZiBvZGQgewoJCXJldHVybiAmdTI1Ni5VaW50ezEyMjYyNDgxNzQzMzcxMTI0NzM3LCAxODQ0NTgyMTgwNTY3NTM5MjMxMSwgMCwgMH0gLy8gMHhmZmZjYjkzM2JkNmZhZDM3YWEyZDE2MmQxYTU5NDAwMQoJfQoJcmV0dXJuICZ1MjU2LlVpbnR7MCwgMCwgMSwgMH0gLy8gMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgKDJeMTI4KQp9CgovLyByYXRpb0NvbnN0YW50cyByZXR1cm5zIHRoZSBiaXQtbWFzayByYXRpbyBjb25zdGFudHMgaW4gb3JkZXIgKGJpdCAxIHRvIGJpdCAxOSkuCmZ1bmMgcmF0aW9Db25zdGFudHMoKSBbXSp1MjU2LlVpbnQgewoJcmV0dXJuIFtdKnUyNTYuVWludHsKCQl7NjQ1OTQwMzgzNDIyOTY2MjAxMCwgMTg0NDQ4OTk1ODM3NTExNzY0OTgsIDAsIDB9LCAgLy8gMHhmZmY5NzI3MjM3M2Q0MTMyNTlhNDY5OTA1ODBlMjEzYSAoYml0IDEpCgkJezE3MjI2ODkwMzM1NDI3NzU1NDY4LCAxODQ0MzA1NTI3ODIyMzM1NDE2MiwgMCwgMH0sIC8vIDB4ZmZmMmU1MGY1ZjY1NjkzMmVmMTIzNTdjZjNjN2ZkY2MgKGJpdCAyKQoJCXsyMDMyODUyODcxOTM5MzY2MDk2LCAxODQzOTM2NzIyMDM4NTYwNDgzOCwgMCwgMH0sICAvLyAweGZmZTVjYWNhN2UxMGU0ZTYxYzM2MjRlYWEwOTQxY2QwIChiaXQgMykKCQl7MTQ1NDUzMTY3NDI3NDAyMDcxNzIsIDE4NDMxOTkzMzE3MDY1NDQ5ODE3LCAwLCAwfSwgLy8gMHhmZmNiOTg0M2Q2MGY2MTU5YzlkYjU4ODM1YzkyNjY0NCAoYml0IDQpCgkJezUxMjkxNTIwMjI4Mjg5NjMwMDgsIDE4NDE3MjU0MzU1NzE4MTYwNTEzLCAwLCAwfSwgIC8vIDB4ZmY5NzNiNDFmYTk4YzA4MTQ3MmU2ODk2ZGZiMjU0YzAgKGJpdCA1KQoJCXs0ODk0NDE5NjA1ODg4NzcyMTkzLCAxODM4NzgxMTc4MTE5MzU5MTM1MiwgMCwgMH0sICAvLyAweGZmMmVhMTY0NjZjOTZhMzg0M2VjNzhiMzI2YjUyODYxIChiaXQgNikKCQl7MTI4MDI1NTg4NDMyMTg5NDQ4MywgMTgzMjkwNjc3NjEyMDM1MjAxNjgsIDAsIDB9LCAgLy8gMHhmZTVkZWUwNDZhOTlhMmE4MTFjNDYxZjE5NjljMzA1MyAoYml0IDcpCgkJezE1OTI0NjY2OTY0MzM1MzA1NjM2LCAxODIxMjE0MjEzNDgwNjA4Nzg1NCwgMCwgMH0sIC8vIDB4ZmNiZTg2Yzc5MDBhODhhZWRjZmZjODNiNDc5YWEzYTQgKGJpdCA4KQoJCXs4MDEwNTA0Mzg5MzU5OTE4Njc2LCAxNzk4MDUyMzgxNTY0MTU1MTYzOSwgMCwgMH0sICAvLyAweGY5ODdhNzI1M2FjNDEzMTc2ZjJiMDc0Y2Y3ODE1ZTU0IChiaXQgOSkKCQl7MTA2NjgwMzYwMDQ5NTI4OTU3MzEsIDE3NTI2MDg2NzM4ODMxMTQ3MDEzLCAwLCAwfSwgLy8gMHhmMzM5MmIwODIyYjcwMDA1OTQwYzdhMzk4ZTRiNzBmMyAoYml0IDEwKQoJCXs0ODc4MTMzNDE4NDcwNzA1NjI1LCAxNjY1MTM3ODQzMDIzNTAyNDI0NCwgMCwgMH0sICAvLyAweGU3MTU5NDc1YTJjMjliNzQ0M2IyOWM3ZmE2ZTg4OWQ5IChiaXQgMTEpCgkJezk1MzcxNzM3MTg3Mzk2MDU1NDEsIDE1MDMwNzUwMjc4NjkzNDI5OTQ0LCAwLCAwfSwgIC8vIDB4ZDA5N2YzYmRmZDIwMjJiODg0NWFkOGY3OTJhYTU4MjUgKGJpdCAxMikKCQl7OTk3MjYxODk3ODAxNDU1MjU0OSwgMTIyNDczMzQ5Nzg4ODI4MzQzOTksIDAsIDB9LCAgLy8gMHhhOWY3NDY0NjJkODcwZmRmOGE2NWRjMWY5MGUwNjFlNSAoYml0IDEzKQoJCXsxMDQyODk5NzQ4OTYxMDY2Njc0MywgODEzMTM2NTI2ODg4NDcyNjIwMCwgMCwgMH0sICAvLyAweDcwZDg2OWExNTZkMmExYjg5MGJiM2RmNjJiYWYzMmY3IChiaXQgMTQpCgkJezkzMDUzMDQzNjc3MDkwMTU5NzQsIDM1ODQzMjM2NTQ3MjMzNDIyOTcsIDAsIDB9LCAgIC8vIDB4MzFiZTEzNWY5N2QwOGZkOTgxMjMxNTA1NTQyZmNmYTYgKGJpdCAxNSkKCQl7MTQzMDExNDM1OTgxODkwOTE3ODUsIDY5NjQ1NzY1MTg0NzU5NTIzMywgMCwgMH0sICAgLy8gMHg5YWE1MDhiNWI3YTg0ZTFjNjc3ZGU1NGYzZTk5YmM5IChiaXQgMTYpCgkJezczOTMxNTQ4NDQ3NDMwOTk5MDgsIDI2Mjk0Nzg5OTU3NDUyMDU3LCAwLCAwfSwgICAgIC8vIDB4NWQ2YWY4ZGVkYjgxMTk2Njk5YzMyOTIyNWVlNjA0IChiaXQgMTcpCgkJezIyMDkzMzg4OTEyOTIyNDU2NTYsIDM3NDgxNzM1MzIxMDgyLCAwLCAwfSwgICAgICAgIC8vIDB4MjIxNmU1ODRmNWZhMWVhOTI2MDQxYmVkZmU5OCAoYml0IDE4KQoJCXsxMDUxODExNzYzMTkxOTAzNDI3NCwgNzYxNTg3MjMsIDAsIDB9LCAgICAgICAgICAgICAvLyAweDQ4YTE3MDM5MWY3ZGM0MjQ0NGU4ZmEyIChiaXQgMTkpCgl9Cn0KCi8vIFByZS1jb21wdXRlZCBjb25zdGFudHMgZm9yIHRpY2sgY2FsY3VsYXRpb24gLSByZXR1cm5lZCBhcyBmcmVzaCBpbnN0YW5jZXMgcGVyIGNhbGwuCmZ1bmMgbG9nMk11bHRpcGxpZXIoKSAqaTI1Ni5JbnQgeyByZXR1cm4gJmkyNTYuSW50ezExNzQ1OTA1NzY4MzEyMjk0NTMzLCAxMzg2MywgMCwgMH0gfSAvLyAyNTU3Mzg5NTg5OTk2MDM4MjYzNDcxNDEKCmZ1bmMgdGlja0xvd09mZnNldCgpICppMjU2LkludCB7IHJldHVybiAmaTI1Ni5JbnR7NjU1Mjc1Nzk0MzE1NzE0NDIzNCwgMTg0NDc2NjE3ODM2MjY2NTg2LCAwLCAwfSB9IC8vIDM0MDI5OTI5NTY4MDkxMzI0MTg1OTYxNDAxMDA2NjAyNDcyMTAKCmZ1bmMgdGlja0hpT2Zmc2V0KCkgKmkyNTYuSW50IHsgcmV0dXJuICZpMjU2LkludHs0OTk4NDc0NDUwNTExODgxMDA3LCAxNTc5MzU0NDAzMTgyNzc2MTc5MywgMCwgMH0gfSAvLyAyOTEzMzk0NjQ3NzE5ODk2MjI5MDcwMjc2MjExNTMzOTgwODg0OTUKCi8vIG9uZUxzaDMyIHJldHVybnMgMSA8PCAzMi4KZnVuYyBvbmVMc2gzMigpICp1MjU2LlVpbnQgeyByZXR1cm4gJnUyNTYuVWludHs0Mjk0OTY3Mjk2LCAwLCAwLCAwfSB9CgovLyBUaWNrTWF0aEdldFNxcnRSYXRpb0F0VGljayBjYWxjdWxhdGVzIHNxcnQgcHJpY2UgcmF0aW8gZm9yIGdpdmVuIHRpY2suCi8vCi8vIENvbnZlcnRzIHRpY2sgaW5kZXggdG8gc3F1YXJlIHJvb3QgcHJpY2UgaW4gUTY0Ljk2IGZpeGVkLXBvaW50IGZvcm1hdC4KLy8gQmFzZWQgb24gVW5pc3dhcCBWMydzIG1hdGhlbWF0aWNhbCBmb3JtdWxhOiBwcmljZSA9IDEuMDAwMV50aWNrLgovLyBVc2VzIGJpdCBtYW5pcHVsYXRpb24gZm9yIGdhcy1lZmZpY2llbnQgY2FsY3VsYXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWNrOiB0aWNrIGluZGV4IGluIHJhbmdlIFstODg3MjcyLCA4ODcyNzJdCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzcXJ0UHJpY2VYOTY6IHRoZSBRNjQuOTYgc3F1YXJlIHJvb3Qgb2YgdGhlIHRva2VuMS90b2tlbjAgcHJpY2UsIHJvdW5kZWQgdXAKLy8KLy8gTWF0aGVtYXRpY2FsIGZvcm11bGE6Ci8vCi8vCXNxcnRQcmljZVg5NiA9IHNxcnQoMS4wMDAxXnRpY2spICogMl45NgovLwovLyBQYW5pY3MgaWYgdGljayBvdXRzaWRlIHZhbGlkIHJhbmdlLgovLyBDcml0aWNhbCBmb3IgYWxsIHByaWNlIGNhbGN1bGF0aW9ucyBpbiBjb25jZW50cmF0ZWQgbGlxdWlkaXR5LgpmdW5jIFRpY2tNYXRoR2V0U3FydFJhdGlvQXRUaWNrKHRpY2sgaW50MzIpICp1MjU2LlVpbnQgewoJYXNzZXJ0VmFsaWRUaWNrUmFuZ2UodGljaykKCWFic1RpY2sgOj0gYWJzKHRpY2spCgoJLy8gSW5pdGlhbGl6ZSByYXRpbyBiYXNlZCBvbiBMU0IgLSBleGFjdGx5IGxpa2UgVW5pc3dhcCBWMwoJcmF0aW8gOj0gaW5pdGlhbFJhdGlvKGFic1RpY2smMHgxICE9IDApCgoJdGVtcCA6PSB1MjU2Llplcm8oKQoJbWFza3MgOj0gcmF0aW9Db25zdGFudHMoKQoKCS8vIEFwcGx5IGJpdCBtYXNrcyB1c2luZyBvcHRpbWl6ZWQgbG9vcCAtIG1haW50YWlucyBleGFjdCBzYW1lIGxvZ2ljCglmb3IgaSA6PSAxOyBpIDwgMjA7IGkrKyB7CgkJaWYgYWJzVGljayYoMTw8dWludChpKSkgIT0gMCB7CgkJCS8vIFVzZSB0ZW1wb3JhcnkgdmFyaWFibGVzIHRvIGF2b2lkIG1lbW9yeSBhbGxvY2F0aW9uIGluIGhvdCBwYXRoCgkJCXIgOj0gbWFza3NbaS0xXQoJCQl0ZW1wLCBvdmVyZmxvdyA6PSB0ZW1wLk11bE92ZXJmbG93KHJhdGlvLCByKQoJCQlpZiBvdmVyZmxvdyB7CgkJCQlwYW5pYyhlcnJvcnMuTmV3KGVyclRpY2tNYXRoT3ZlcmZsb3cpKQoJCQl9CgkJCXJhdGlvID0gcmF0aW8uUnNoKHRlbXAsIDEyOCkKCQl9Cgl9CgoJLy8gSW52ZXJ0IHJhdGlvIGZvciBwb3NpdGl2ZSB0aWNrcwoJaWYgdGljayA+IDAgewoJCXJhdGlvID0gdGVtcC5EaXYoY29uc3RzLk1heFVpbnQyNTYoKSwgcmF0aW8pCgl9CgoJLy8gQ29udmVydCBmcm9tIFExMjguMTI4IHRvIFExMjguOTYgd2l0aCByb3VuZGluZyB1cC4KCS8vIFRoaXMgZGl2aWRlcyBieSAxPDwzMiByb3VuZGluZyB1cCB0byBnbyBmcm9tIGEgUTEyOC4xMjggdG8gYSBRMTI4Ljk2Cgl1cHBlciA6PSB1MjU2Llplcm8oKS5Sc2gocmF0aW8sIDMyKSAgICAgICAgICAgICAvLyByYXRpbyA+PiAzMgoJcmVtYWluZGVyIDo9IHUyNTYuWmVybygpLk1vZChyYXRpbywgb25lTHNoMzIoKSkgLy8gcmF0aW8gJSAoMSA8PCAzMikKCgkvLyBSb3VuZCB1cDogYWRkIDEgaWYgcmVtYWluZGVyICE9IDAKCWlmICFyZW1haW5kZXIuSXNaZXJvKCkgewoJCXVwcGVyID0gdTI1Ni5aZXJvKCkuQWRkKHVwcGVyLCB1MjU2Lk9uZSgpKQoJfQoKCXJldHVybiB1cHBlcgp9CgovLyBUaWNrTWF0aEdldFRpY2tBdFNxcnRSYXRpbyBjYWxjdWxhdGVzIHRoZSB0aWNrIGluZGV4IGZvciBhIGdpdmVuIHNxdWFyZSByb290IHByaWNlIHJhdGlvLgovLwovLyBDb252ZXJ0cyBhIHNxdWFyZSByb290IHByaWNlIHJhdGlvIGluIFE2NC45NiBmb3JtYXQgYmFjayB0byBpdHMgdGljayBpbmRleCwKLy8gcmV0dXJuaW5nIHRoZSBncmVhdGVzdCB0aWNrIHdoZXJlIFRpY2tNYXRoR2V0U3FydFJhdGlvQXRUaWNrKHRpY2spIDw9IHNxcnRQcmljZVg5Ni4KLy8gRm9yIHRoaXMgaW52ZXJzZSBBUEksIHNxcnRQcmljZVg5NiBtdXN0IGJlIGluIGBbTWluU3FydFJhdGlvLCBNYXhTcXJ0UmF0aW8pYDsKLy8gdGhlIHVwcGVyIGJvdW5kIGVxdWFscyB0aGUgbWF4LXRpY2sgb3V0cHV0IGJ1dCBpcyBpdHNlbGYgZXhjbHVkZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzcXJ0UHJpY2VYOTY6IHNxdWFyZSByb290IHByaWNlIHJhdGlvIGluIFE2NC45NiBmb3JtYXQgd2l0aGluIFtNaW5TcXJ0UmF0aW8sIE1heFNxcnRSYXRpbykKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2s6IHRoZSBncmVhdGVzdCB0aWNrIHdob3NlIGNhbGN1bGF0ZWQgcmF0aW8gaXMgYXQgbW9zdCBzcXJ0UHJpY2VYOTYKLy8KLy8gQWxnb3JpdGhtOgovLyAgMS4gU2NhbGVzIHJhdGlvIGZyb20gUTY0Ljk2IHRvIFE5Ni4xMjggYnkgbGVmdC1zaGlmdGluZyAzMiBiaXRzCi8vICAyLiBGaW5kcyBNU0IgKG1vc3Qgc2lnbmlmaWNhbnQgYml0KSB0byBkZXRlcm1pbmUgbWFnbml0dWRlCi8vICAzLiBDYWxjdWxhdGVzIGxvZ18yIHVzaW5nIGZpeGVkLXBvaW50IGFyaXRobWV0aWMKLy8gIDQuIENvbnZlcnRzIGxvZ18yIHRvIGxvZ19zcXJ0KDEuMDAwMSkgdG8gZ2V0IHRpY2sKLy8gIDUuIFJldHVybnMgYXBwcm9wcmlhdGUgdGljayBiYXNlZCBvbiBib3VuZHMgY2hlY2tpbmcKLy8KLy8gUGFuaWNzIGlmIHNxcnRQcmljZVg5NiBpcyBuaWwgb3Igb3V0c2lkZSB2YWxpZCByYW5nZSBbbWluU3FydFJhdGlvLCBtYXhTcXJ0UmF0aW8pLgovLyBDcml0aWNhbCBmb3IgY29udmVydGluZyBwcmljZXMgdG8gdGlja3MgZm9yIHBvc2l0aW9uIG1hbmFnZW1lbnQuCmZ1bmMgVGlja01hdGhHZXRUaWNrQXRTcXJ0UmF0aW8oc3FydFByaWNlWDk2ICp1MjU2LlVpbnQpIGludDMyIHsKCWlmIHNxcnRQcmljZVg5NiA9PSBuaWwgewoJCXBhbmljKG5ld0Vycm9yV2l0aERldGFpbCgKCQkJZXJyVGlja01hdGhJbnZhbGlkSW5wdXQsCgkJCSJzcXJ0UHJpY2VYOTYgY2Fubm90IGJlIG5pbCIsCgkJKSkKCX0KCglpZiBzcXJ0UHJpY2VYOTYuTHQoY29uc3RzLk1pblNxcnRSYXRpbygpKSB8fCBzcXJ0UHJpY2VYOTYuR3RlKGNvbnN0cy5NYXhTcXJ0UmF0aW8oKSkgewoJCXBhbmljKG5ld0Vycm9yV2l0aERldGFpbCgKCQkJZXJyVGlja01hdGhPdXRPZlJhbmdlLAoJCQl1Zm10LlNwcmludGYoInNxcnRQcmljZVg5NiglcykgaXMgb3V0IG9mIHJhbmdlIiwgc3FydFByaWNlWDk2LlRvU3RyaW5nKCkpLAoJCSkpCgl9CgoJLy8gU2NhbGUgcmF0aW8gYnkgMzIgYml0cyB0byBjb252ZXJ0IGZyb20gUTY0Ljk2IHRvIFE5Ni4xMjgKCXJhdGlvIDo9IHUyNTYuWmVybygpLkxzaChzcXJ0UHJpY2VYOTYsIDMyKQoKCS8vIFRoZSB2YWxpZGF0ZWQgcmF0aW8gaXMgbm9uemVybzsgaXRzIGJpdCBsZW5ndGggZ2l2ZXMgdGhlIE1TQiBkaXJlY3RseS4KCW1zYiA6PSB1aW50NjQocmF0aW8uQml0TGVuKCkgLSAxKQoKCS8vIEFkanVzdCByYXRpbyBiYXNlZCBvbiBNU0IKCXZhciByICp1MjU2LlVpbnQKCglpZiBtc2IgPj0gMTI4IHsKCQlyID0gdTI1Ni5aZXJvKCkuUnNoKHJhdGlvLCB1aW50KG1zYi0xMjcpKQoJfSBlbHNlIHsKCQlyID0gdTI1Ni5aZXJvKCkuTHNoKHJhdGlvLCB1aW50KDEyNy1tc2IpKQoJfQoKCS8vIENhbGN1bGF0ZSBsb2dfMiB1c2luZyBmaXhlZC1wb2ludCBhcml0aG1ldGljCglsb2cyIDo9IGkyNTYuTmV3SW50KGludDY0KG1zYikgLSAxMjgpCglsb2cyID0gaTI1Ni5aZXJvKCkuTHNoKGxvZzIsIDY0KQoKCS8vIERlZmluZSB0ZW1wb3JhcnkgdmFyaWFibGVzIGZvciBvcHRpbWl6YXRpb24KCXRlbXBSIDo9IHUyNTYuWmVybygpCgl0ZW1wRiA6PSB1MjU2Llplcm8oKQoJdGVtcEkyNTYgOj0gaTI1Ni5aZXJvKCkKCgkvLyBPcHRpbWl6ZWQgaXRlcmF0aXZlIGNhbGN1bGF0aW9uIHVzaW5nIGxvb3AgLSBtYWludGFpbnMgZXhhY3Qgc2FtZSBsb2dpYwoJZm9yIGkgOj0gMDsgaSA8IDE0OyBpKysgewoJCXRlbXBSLCBvdmVyZmxvdyA6PSB0ZW1wUi5NdWxPdmVyZmxvdyhyLCByKQoJCWlmIG92ZXJmbG93IHsKCQkJcGFuaWMoZXJyb3JzLk5ldyhlcnJUaWNrTWF0aE92ZXJmbG93KSkKCQl9CgkJciA9IHRlbXBSLlJzaCh0ZW1wUiwgMTI3KQoKCQl0ZW1wRiA9IHRlbXBGLlJzaChyLCAxMjgpCgkJdGVtcEkyNTYgPSBpMjU2LkZyb21VaW50MjU2KHRlbXBGKQoJCWYgOj0gdGVtcEYKCgkJdGVtcEkyNTYgPSB0ZW1wSTI1Ni5Mc2godGVtcEkyNTYsIHVpbnQoNjMtaSkpCgkJbG9nMiA9IGxvZzIuT3IobG9nMiwgdGVtcEkyNTYpCgkJciA9IHIuUnNoKHIsIHVpbnQoZi5VaW50NjQoKSkpCgl9CgoJLy8gQ2FsY3VsYXRlIHRpY2sgZnJvbSBsb2dfc3FydDEwMDAxCglsb2dTcXJ0MTAwMDEsIG92ZXJmbG93IDo9IGkyNTYuWmVybygpLk11bE92ZXJmbG93KGxvZzIsIGxvZzJNdWx0aXBsaWVyKCkpCglpZiBvdmVyZmxvdyB7CgkJcGFuaWMoZXJyb3JzLk5ldyhlcnJUaWNrTWF0aE92ZXJmbG93KSkKCX0KCgkvLyBDYWxjdWxhdGUgdGljayBib3VuZHMKCXRpY2tMb3cgOj0gaTI1Ni5aZXJvKCkuU3ViKGxvZ1NxcnQxMDAwMSwgdGlja0xvd09mZnNldCgpKQoJdGlja0xvdyA9IHRpY2tMb3cuUnNoKHRpY2tMb3csIDEyOCkKCXRpY2tMb3dJbnQzMiA6PSBpbnQzMih0aWNrTG93LkludDY0KCkpCgoJdGlja0hpIDo9IGkyNTYuWmVybygpLkFkZChsb2dTcXJ0MTAwMDEsIHRpY2tIaU9mZnNldCgpKQoJdGlja0hpID0gdGlja0hpLlJzaCh0aWNrSGksIDEyOCkKCXRpY2tIaUludDMyIDo9IGludDMyKHRpY2tIaS5JbnQ2NCgpKQoKCS8vIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdGljawoJaWYgdGlja0xvd0ludDMyID09IHRpY2tIaUludDMyIHsKCQlyZXR1cm4gdGlja0xvd0ludDMyCgl9CgoJaWYgVGlja01hdGhHZXRTcXJ0UmF0aW9BdFRpY2sodGlja0hpSW50MzIpLkx0ZShzcXJ0UHJpY2VYOTYpIHsKCQlyZXR1cm4gdGlja0hpSW50MzIKCX0KCglyZXR1cm4gdGlja0xvd0ludDMyCn0KCi8vIGFicyByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlci4KLy8gVXNlZCBpbnRlcm5hbGx5IGZvciB0aWNrIG1hdGggY2FsY3VsYXRpb25zIHRvIGhhbmRsZSBuZWdhdGl2ZSB0aWNrIGluZGljZXMuCmZ1bmMgYWJzKHggaW50MzIpIGludDMyIHsKCWlmIHggPCAwIHsKCQlyZXR1cm4gLXgKCX0KCglyZXR1cm4geAp9CgovLyBhc3NlcnRWYWxpZFRpY2tSYW5nZSBwYW5pY3MgaWYgdGljayBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlIFstODg3MjcyLCA4ODcyNzJdLgpmdW5jIGFzc2VydFZhbGlkVGlja1JhbmdlKHRpY2sgaW50MzIpIHsKCWlmIHRpY2sgPiBtYXhUaWNrIHsKCQlwYW5pYyhuZXdFcnJvcldpdGhEZXRhaWwoCgkJCWVyclRpY2tNYXRoT3V0T2ZSYW5nZSwKCQkJdWZtdC5TcHJpbnRmKCJ0aWNrIGlzIG91dCBvZiByYW5nZSAobGFyZ2VyIHRoYW4gODg3MjcyKSwgdGljazogJWQiLCB0aWNrKSwKCQkpKQoJfQoJaWYgdGljayA8IG1pblRpY2sgewoJCXBhbmljKG5ld0Vycm9yV2l0aERldGFpbCgKCQkJZXJyVGlja01hdGhPdXRPZlJhbmdlLAoJCQl1Zm10LlNwcmludGYoInRpY2sgaXMgb3V0IG9mIHJhbmdlIChzbWFsbGVyIHRoYW4gLTg4NzI3MiksIHRpY2s6ICVkIiwgdGljayksCgkJKSkKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEQigyZ5WEgo5MDQyOHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAwSc1QTD4tI6os8LnebKOB+i6fWXOKGBf9lRpSI1wrrhEkAqky7wCcHMaLiO4o76gDcWltRXX/rHPn2nhJs0bH90wkhYJitRHLDjFrhN7t2TPfKXGtTJqRewqa2YSHPGkaHDGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data