LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICB1bmljb2RlZGF0YSAtLSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFVuaWNvZGUgNS4yIGRhdGEgYmFzZS4KCiAgIERhdGEgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBVbmljb2RlIDUuMiBVbmljb2RlRGF0YS50eHQgZmlsZS4KCiAgIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgogICBNb2RpZmllZCBmb3IgUHl0aG9uIDIuMCBieSBGcmVkcmlrIEx1bmRoIChmcmVkcmlrQHB5dGhvbndhcmUuY29tKQogICBNb2RpZmllZCBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkKCiAgIENvcHlyaWdodCAoYykgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiUHl0aG9uLmgiCiNpbmNsdWRlICJ1Y25oYXNoLmgiCiNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKCi8qIGNoYXJhY3RlciBwcm9wZXJ0aWVzICovCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OwkvKiBpbmRleCBpbnRvCgkJCQkJICAgX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWNvbWJpbmluZzsgCS8qIGNvbWJpbmluZyBjbGFzcyB2YWx1ZSAwIC0gMjU1ICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWJpZGlyZWN0aW9uYWw7IAkvKiBpbmRleCBpbnRvCgkJCQkJICAgX1B5VW5pY29kZV9CaWRpcmVjdGlvbmFsTmFtZXMgKi8KICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWlycm9yZWQ7CS8qIHRydWUgaWYgbWlycm9yZWQgaW4gYmlkaXIgbW9kZSAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBlYXN0X2FzaWFuX3dpZHRoOwkvKiBpbmRleCBpbnRvCgkJCQkJCSAgIF9QeVVuaWNvZGVfRWFzdEFzaWFuV2lkdGggKi8KICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9ybWFsaXphdGlvbl9xdWlja19jaGVjazsgLyogc2VlIGlzX25vcm1hbGl6ZWQoKSAqLwp9IF9QeVVuaWNvZGVfRGF0YWJhc2VSZWNvcmQ7Cgp0eXBlZGVmIHN0cnVjdCBjaGFuZ2VfcmVjb3JkIHsKICAgIC8qIHNlcXVlbmNlIG9mIGZpZWxkcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gbWVyZ2Vfb2xkX3ZlcnNpb24gKi8KICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmlkaXJfY2hhbmdlZDsKICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnlfY2hhbmdlZDsKICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGVjaW1hbF9jaGFuZ2VkOwogICAgY29uc3QgdW5zaWduZWQgY2hhciBtaXJyb3JlZF9jaGFuZ2VkOwogICAgY29uc3QgZG91YmxlIG51bWVyaWNfY2hhbmdlZDsKfSBjaGFuZ2VfcmVjb3JkOwoKLyogZGF0YSBmaWxlIGdlbmVyYXRlZCBieSBUb29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weSAqLwojaW5jbHVkZSAidW5pY29kZWRhdGFfZGIuaCIKCnN0YXRpYyBjb25zdCBfUHlVbmljb2RlX0RhdGFiYXNlUmVjb3JkKgpfZ2V0cmVjb3JkX2V4KFB5X1VDUzQgY29kZSkKewogICAgaW50IGluZGV4OwogICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApCiAgICAgICAgaW5kZXggPSAwOwogICAgZWxzZSB7CiAgICAgICAgaW5kZXggPSBpbmRleDFbKGNvZGU+PlNISUZUKV07CiAgICAgICAgaW5kZXggPSBpbmRleDJbKGluZGV4PDxTSElGVCkrKGNvZGUmKCgxPDxTSElGVCktMSkpXTsKICAgIH0KCiAgICByZXR1cm4gJl9QeVVuaWNvZGVfRGF0YWJhc2VfUmVjb3Jkc1tpbmRleF07Cn0KCi8qIC0tLS0tLS0tLS0tLS0gUHJldmlvdXMtdmVyc2lvbiBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp0eXBlZGVmIHN0cnVjdCBwcmV2aW91c192ZXJzaW9uIHsKICAgIFB5T2JqZWN0X0hFQUQKICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICBjb25zdCBjaGFuZ2VfcmVjb3JkKiAoKmdldHJlY29yZCkoUHlfVUNTNCk7CiAgICBQeV9VQ1M0ICgqbm9ybWFsaXphdGlvbikoUHlfVUNTNCk7Cn0gUHJldmlvdXNEQlZlcnNpb247CgojZGVmaW5lIGdldF9vbGRfcmVjb3JkKHNlbGYsIHYpICAgICgoKChQcmV2aW91c0RCVmVyc2lvbiopc2VsZiktPmdldHJlY29yZCkodikpCgpzdGF0aWMgUHlNZW1iZXJEZWYgREJfbWVtYmVyc1tdID0gewoJeyJ1bmlkYXRhX3ZlcnNpb24iLCBUX1NUUklORywgb2Zmc2V0b2YoUHJldmlvdXNEQlZlcnNpb24sIG5hbWUpLCBSRUFET05MWX0sCiAgICAgICAge05VTEx9Cn07CgovKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCnN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGU7CgpzdGF0aWMgUHlPYmplY3QqCm5ld19wcmV2aW91c192ZXJzaW9uKGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhbmdlX3JlY29yZCogKCpnZXRyZWNvcmQpKFB5X1VDUzQpLAogICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0ICgqbm9ybWFsaXphdGlvbikoUHlfVUNTNCkpCnsKCVByZXZpb3VzREJWZXJzaW9uICpzZWxmOwoJc2VsZiA9IFB5T2JqZWN0X05ldyhQcmV2aW91c0RCVmVyc2lvbiwgJlVDRF9UeXBlKTsKCWlmIChzZWxmID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CglzZWxmLT5uYW1lID0gbmFtZTsKCXNlbGYtPmdldHJlY29yZCA9IGdldHJlY29yZDsKICAgICAgICBzZWxmLT5ub3JtYWxpemF0aW9uID0gbm9ybWFsaXphdGlvbjsKCXJldHVybiAoUHlPYmplY3QqKXNlbGY7Cn0KCgpzdGF0aWMgUHlfVUNTNCBnZXR1Y2hhcihQeVVuaWNvZGVPYmplY3QgKm9iaikKewogICAgUHlfVU5JQ09ERSAqdiA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7CgogICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRShvYmopID09IDEpCglyZXR1cm4gKnY7CiNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCiAgICBlbHNlIGlmICgoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMikgJiYKICAgICAgICAgICAgICgweEQ4MDAgPD0gdlswXSAmJiB2WzBdIDw9IDB4REJGRikgJiYKICAgICAgICAgICAgICgweERDMDAgPD0gdlsxXSAmJiB2WzFdIDw9IDB4REZGRikpCglyZXR1cm4gKCgodlswXSAmIDB4M0ZGKTw8MTApIHwgKHZbMV0gJiAweDNGRikpICsgMHgxMDAwMDsKI2VuZGlmCiAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICJuZWVkIGEgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVyIGFzIHBhcmFtZXRlciIpOwogICAgcmV0dXJuIChQeV9VQ1M0KS0xOwp9CgovKiAtLS0gTW9kdWxlIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9kZWNpbWFsX19kb2NfXywKImRlY2ltYWwodW5pY2hyWywgZGVmYXVsdF0pXG5cClxuXApSZXR1cm5zIHRoZSBkZWNpbWFsIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlciB1bmljaHJcblwKYXMgaW50ZWdlci4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBkZWZhdWx0IGlzIHJldHVybmVkLCBvciwgaWZcblwKbm90IGdpdmVuLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2RlY2ltYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBQeU9iamVjdCAqZGVmb2JqID0gTlVMTDsKICAgIGludCBoYXZlX29sZCA9IDA7CiAgICBsb25nIHJjOwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpkZWNpbWFsIiwgJlB5VW5pY29kZV9UeXBlLCAmdiwgJmRlZm9iaikpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGMpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkgewogICAgICAgICAgICAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgcmMgPSAtMTsKICAgICAgICB9IAogICAgICAgIGVsc2UgaWYgKG9sZC0+ZGVjaW1hbF9jaGFuZ2VkICE9IDB4RkYpIHsKICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgIHJjID0gUHlfVU5JQ09ERV9UT0RFQ0lNQUwoYyk7CiAgICBpZiAocmMgPCAwKSB7CglpZiAoZGVmb2JqID09IE5VTEwpIHsKCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKCQkJICAgICJub3QgYSBkZWNpbWFsIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoJfQoJZWxzZSB7CgkgICAgUHlfSU5DUkVGKGRlZm9iaik7CgkgICAgcmV0dXJuIGRlZm9iajsKCX0KICAgIH0KICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyYyk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9kaWdpdF9fZG9jX18sCiJkaWdpdCh1bmljaHJbLCBkZWZhdWx0XSlcblwKXG5cClJldHVybnMgdGhlIGRpZ2l0IHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlciB1bmljaHIgYXNcblwKaW50ZWdlci4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBkZWZhdWx0IGlzIHJldHVybmVkLCBvciwgaWZcblwKbm90IGdpdmVuLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2RpZ2l0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgUHlPYmplY3QgKmRlZm9iaiA9IE5VTEw7CiAgICBsb25nIHJjOwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpkaWdpdCIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICByYyA9IFB5X1VOSUNPREVfVE9ESUdJVChjKTsKICAgIGlmIChyYyA8IDApIHsKCWlmIChkZWZvYmogPT0gTlVMTCkgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgZGlnaXQiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cgl9CgllbHNlIHsKCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKCSAgICByZXR1cm4gZGVmb2JqOwoJfQogICAgfQogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJjKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX251bWVyaWNfX2RvY19fLAoibnVtZXJpYyh1bmljaHJbLCBkZWZhdWx0XSlcblwKXG5cClJldHVybnMgdGhlIG51bWVyaWMgdmFsdWUgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHVuaWNoclxuXAphcyBmbG9hdC4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBkZWZhdWx0IGlzIHJldHVybmVkLCBvciwgaWZcblwKbm90IGdpdmVuLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX251bWVyaWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBQeU9iamVjdCAqZGVmb2JqID0gTlVMTDsKICAgIGludCBoYXZlX29sZCA9IDA7CiAgICBkb3VibGUgcmM7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOm51bWVyaWMiLCAmUHlVbmljb2RlX1R5cGUsICZ2LCAmZGVmb2JqKSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IC0xLjA7CiAgICAgICAgfSAKICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgcmMgPSBvbGQtPmRlY2ltYWxfY2hhbmdlZDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFoYXZlX29sZCkKICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9OVU1FUklDKGMpOwogICAgaWYgKHJjID09IC0xLjApIHsKCWlmIChkZWZvYmogPT0gTlVMTCkgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgbnVtZXJpYyBjaGFyYWN0ZXIiKTsKCSAgICByZXR1cm4gTlVMTDsKCX0KCWVsc2UgewoJICAgIFB5X0lOQ1JFRihkZWZvYmopOwoJICAgIHJldHVybiBkZWZvYmo7Cgl9CiAgICB9CiAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJjKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2NhdGVnb3J5X19kb2NfXywKImNhdGVnb3J5KHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIGdlbmVyYWwgY2F0ZWdvcnkgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG5cCnVuaWNociBhcyBzdHJpbmcuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9jYXRlZ29yeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmNhdGVnb3J5IiwKCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKCXJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpbmRleCA9IChpbnQpIF9nZXRyZWNvcmRfZXgoYyktPmNhdGVnb3J5OwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkICE9IDB4RkYpCiAgICAgICAgICAgIGluZGV4ID0gb2xkLT5jYXRlZ29yeV9jaGFuZ2VkOwogICAgfQogICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzW2luZGV4XSk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsX19kb2NfXywKImJpZGlyZWN0aW9uYWwodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCBjYXRlZ29yeSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIHN0cmluZy4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBhbiBlbXB0eSBzdHJpbmcgaXNcblwKcmV0dXJuZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6YmlkaXJlY3Rpb25hbCIsCgkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCglyZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5iaWRpcmVjdGlvbmFsOwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgICAgIGVsc2UgaWYgKG9sZC0+YmlkaXJfY2hhbmdlZCAhPSAweEZGKQogICAgICAgICAgICBpbmRleCA9IG9sZC0+YmlkaXJfY2hhbmdlZDsKICAgIH0KICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKF9QeVVuaWNvZGVfQmlkaXJlY3Rpb25hbE5hbWVzW2luZGV4XSk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9jb21iaW5pbmdfX2RvY19fLAoiY29tYmluaW5nKHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIGNhbm9uaWNhbCBjb21iaW5pbmcgY2xhc3MgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGVcblwKY2hhcmFjdGVyIHVuaWNociBhcyBpbnRlZ2VyLiBSZXR1cm5zIDAgaWYgbm8gY29tYmluaW5nIGNsYXNzIGlzXG5cCmRlZmluZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9jb21iaW5pbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBpbnQgaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpjb21iaW5pbmciLAoJCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQoJcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGluZGV4ID0gKGludCkgX2dldHJlY29yZF9leChjKS0+Y29tYmluaW5nOwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgfQogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGluZGV4KTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX21pcnJvcmVkX19kb2NfXywKIm1pcnJvcmVkKHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIG1pcnJvcmVkIHByb3BlcnR5IGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuXAp1bmljaHIgYXMgaW50ZWdlci4gUmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgaGFzIGJlZW4gaWRlbnRpZmllZCBhc1xuXAphIFwibWlycm9yZWRcIiBjaGFyYWN0ZXIgaW4gYmlkaXJlY3Rpb25hbCB0ZXh0LCAwIG90aGVyd2lzZS4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX21pcnJvcmVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6bWlycm9yZWQiLAoJCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQoJcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGluZGV4ID0gKGludCkgX2dldHJlY29yZF9leChjKS0+bWlycm9yZWQ7CiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGMpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkKICAgICAgICAgICAgaW5kZXggPSAwOyAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgZWxzZSBpZiAob2xkLT5taXJyb3JlZF9jaGFuZ2VkICE9IDB4RkYpCiAgICAgICAgICAgIGluZGV4ID0gb2xkLT5taXJyb3JlZF9jaGFuZ2VkOwogICAgfQogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGluZGV4KTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2Vhc3RfYXNpYW5fd2lkdGhfX2RvY19fLAoiZWFzdF9hc2lhbl93aWR0aCh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBlYXN0IGFzaWFuIHdpZHRoIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuXAp1bmljaHIgYXMgc3RyaW5nLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfZWFzdF9hc2lhbl93aWR0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmVhc3RfYXNpYW5fd2lkdGgiLAoJCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQoJcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGluZGV4ID0gKGludCkgX2dldHJlY29yZF9leChjKS0+ZWFzdF9hc2lhbl93aWR0aDsKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICBpbmRleCA9IDA7IC8qIHVuYXNzaWduZWQgKi8KICAgIH0KICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKF9QeVVuaWNvZGVfRWFzdEFzaWFuV2lkdGhOYW1lc1tpbmRleF0pOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZGVjb21wb3NpdGlvbl9fZG9jX18sCiJkZWNvbXBvc2l0aW9uKHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIGNoYXJhY3RlciBkZWNvbXBvc2l0aW9uIG1hcHBpbmcgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGVcblwKY2hhcmFjdGVyIHVuaWNociBhcyBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbiBjYXNlIG5vXG5cCnN1Y2ggbWFwcGluZyBpcyBkZWZpbmVkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfZGVjb21wb3NpdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGNoYXIgZGVjb21wWzI1Nl07CiAgICBpbnQgY29kZSwgaW5kZXgsIGNvdW50LCBpOwogICAgdW5zaWduZWQgaW50IHByZWZpeF9pbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmRlY29tcG9zaXRpb24iLAoJCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQoJcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBjb2RlID0gKGludCljOwoKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7IC8qIHVuYXNzaWduZWQgKi8KICAgIH0KCiAgICBpZiAoY29kZSA8IDAgfHwgY29kZSA+PSAweDExMDAwMCkKICAgICAgICBpbmRleCA9IDA7CiAgICBlbHNlIHsKICAgICAgICBpbmRleCA9IGRlY29tcF9pbmRleDFbKGNvZGU+PkRFQ09NUF9TSElGVCldOwogICAgICAgIGluZGV4ID0gZGVjb21wX2luZGV4MlsoaW5kZXg8PERFQ09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxERUNPTVBfU0hJRlQpLTEpKV07CiAgICB9CgogICAgLyogaGlnaCBieXRlIGlzIG51bWJlciBvZiBoZXggYnl0ZXMgKHVzdWFsbHkgb25lIG9yIHR3byksIGxvdyBieXRlCiAgICAgICBpcyBwcmVmaXggY29kZSAoZnJvbSovCiAgICBjb3VudCA9IGRlY29tcF9kYXRhW2luZGV4XSA+PiA4OwoKICAgIC8qIFhYWDogY291bGQgYWxsb2NhdGUgdGhlIFB5U3RyaW5nIHVwIGZyb250IGluc3RlYWQKICAgICAgIChzdHJsZW4ocHJlZml4KSArIDUgKiBjb3VudCArIDEgYnl0ZXMpICovCgogICAgLyogQmFzZWQgb24gaG93IGluZGV4IGlzIGNhbGN1bGF0ZWQgYWJvdmUgYW5kIGRlY29tcF9kYXRhIGlzIGdlbmVyYXRlZAogICAgICAgZnJvbSBUb29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weSwgaXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZQogICAgICAgdG8gb3ZlcmZsb3cgZGVjb21wX3ByZWZpeC4gKi8KICAgIHByZWZpeF9pbmRleCA9IGRlY29tcF9kYXRhW2luZGV4XSAmIDI1NTsKICAgIGFzc2VydChwcmVmaXhfaW5kZXggPCAoc2l6ZW9mKGRlY29tcF9wcmVmaXgpL3NpemVvZigqZGVjb21wX3ByZWZpeCkpKTsKCiAgICAvKiBjb3B5IHByZWZpeCAqLwogICAgaSA9IHN0cmxlbihkZWNvbXBfcHJlZml4W3ByZWZpeF9pbmRleF0pOwogICAgbWVtY3B5KGRlY29tcCwgZGVjb21wX3ByZWZpeFtwcmVmaXhfaW5kZXhdLCBpKTsKCiAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKICAgICAgICBpZiAoaSkKICAgICAgICAgICAgZGVjb21wW2krK10gPSAnICc7CiAgICAgICAgYXNzZXJ0KChzaXplX3QpaSA8IHNpemVvZihkZWNvbXApKTsKICAgICAgICBQeU9TX3NucHJpbnRmKGRlY29tcCArIGksIHNpemVvZihkZWNvbXApIC0gaSwgIiUwNFgiLAogICAgICAgICAgICAgICAgICAgICAgZGVjb21wX2RhdGFbKytpbmRleF0pOwogICAgICAgIGkgKz0gc3RybGVuKGRlY29tcCArIGkpOwogICAgfQogICAgCiAgICBkZWNvbXBbaV0gPSAnXDAnOwoKICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlY29tcCk7Cn0KCnN0YXRpYyB2b2lkCmdldF9kZWNvbXBfcmVjb3JkKFB5T2JqZWN0ICpzZWxmLCBQeV9VQ1M0IGNvZGUsIGludCAqaW5kZXgsIGludCAqcHJlZml4LCBpbnQgKmNvdW50KQp7CiAgICBpZiAoY29kZSA+PSAweDExMDAwMCkgewogICAgICAgICppbmRleCA9IDA7CiAgICB9IGVsc2UgaWYgKHNlbGYgJiYgZ2V0X29sZF9yZWNvcmQoc2VsZiwgY29kZSktPmNhdGVnb3J5X2NoYW5nZWQ9PTApIHsKICAgICAgICAvKiB1bmFzc2lnbmVkIGluIG9sZCB2ZXJzaW9uICovCiAgICAgICAgKmluZGV4ID0gMDsKICAgIH0KICAgIGVsc2UgewogICAgICAgICppbmRleCA9IGRlY29tcF9pbmRleDFbKGNvZGU+PkRFQ09NUF9TSElGVCldOwogICAgICAgICppbmRleCA9IGRlY29tcF9pbmRleDJbKCppbmRleDw8REVDT01QX1NISUZUKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlJigoMTw8REVDT01QX1NISUZUKS0xKSldOwogICAgfQoJCiAgICAvKiBoaWdoIGJ5dGUgaXMgbnVtYmVyIG9mIGhleCBieXRlcyAodXN1YWxseSBvbmUgb3IgdHdvKSwgbG93IGJ5dGUKICAgICAgIGlzIHByZWZpeCBjb2RlIChmcm9tKi8KICAgICpjb3VudCA9IGRlY29tcF9kYXRhWyppbmRleF0gPj4gODsKICAgICpwcmVmaXggPSBkZWNvbXBfZGF0YVsqaW5kZXhdICYgMjU1OwoKICAgICgqaW5kZXgpKys7Cn0KCiNkZWZpbmUgU0Jhc2UgICAweEFDMDAKI2RlZmluZSBMQmFzZSAgIDB4MTEwMAojZGVmaW5lIFZCYXNlICAgMHgxMTYxCiNkZWZpbmUgVEJhc2UgICAweDExQTcKI2RlZmluZSBMQ291bnQgIDE5CiNkZWZpbmUgVkNvdW50ICAyMQojZGVmaW5lIFRDb3VudCAgMjgKI2RlZmluZSBOQ291bnQgIChWQ291bnQqVENvdW50KQojZGVmaW5lIFNDb3VudCAgKExDb3VudCpOQ291bnQpCgpzdGF0aWMgUHlPYmplY3QqCm5mZF9uZmtkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXQsIGludCBrKQp7CiAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgUHlfVU5JQ09ERSAqaSwgKmVuZCwgKm87CiAgICAvKiBMb25nZXN0IGRlY29tcG9zaXRpb24gaW4gVW5pY29kZSAzLjI6IFUrRkRGQSAqLwogICAgUHlfVU5JQ09ERSBzdGFja1syMF07IAogICAgUHlfc3NpemVfdCBzcGFjZSwgaXNpemU7CiAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgdW5zaWduZWQgY2hhciBwcmV2LCBjdXI7CgkKICAgIHN0YWNrcHRyID0gMDsKICAgIGlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKGlucHV0KTsKICAgIC8qIE92ZXJhbGxvY2F0ZSBhdG1vc3QgMTAgY2hhcmFjdGVycy4gKi8KICAgIHNwYWNlID0gKGlzaXplID4gMTAgPyAxMCA6IGlzaXplKSArIGlzaXplOwogICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHNwYWNlKTsKICAgIGlmICghcmVzdWx0KQogICAgICAgIHJldHVybiBOVUxMOwogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGlucHV0KTsKICAgIGVuZCA9IGkgKyBpc2l6ZTsKICAgIG8gPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwoKICAgIHdoaWxlIChpIDwgZW5kKSB7CiAgICAgICAgc3RhY2tbc3RhY2twdHIrK10gPSAqaSsrOwogICAgICAgIHdoaWxlKHN0YWNrcHRyKSB7CiAgICAgICAgICAgIFB5X1VOSUNPREUgY29kZSA9IHN0YWNrWy0tc3RhY2twdHJdOwogICAgICAgICAgICAvKiBIYW5ndWwgRGVjb21wb3NpdGlvbiBhZGRzIHRocmVlIGNoYXJhY3RlcnMgaW4KICAgICAgICAgICAgICAgYSBzaW5nbGUgc3RlcCwgc28gd2UgbmVlZCBhdGxlYXN0IHRoYXQgbXVjaCByb29tLiAqLwogICAgICAgICAgICBpZiAoc3BhY2UgPCAzKSB7CiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpICsgMTA7CiAgICAgICAgICAgICAgICBzcGFjZSArPSAxMDsKICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG5ld3NpemUpID09IC0xKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCkgKyBuZXdzaXplIC0gc3BhY2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogSGFuZ3VsIERlY29tcG9zaXRpb24uICovCiAgICAgICAgICAgIGlmIChTQmFzZSA8PSBjb2RlICYmIGNvZGUgPCAoU0Jhc2UrU0NvdW50KSkgewogICAgICAgICAgICAgICAgaW50IFNJbmRleCA9IGNvZGUgLSBTQmFzZTsKICAgICAgICAgICAgICAgIGludCBMID0gTEJhc2UgKyBTSW5kZXggLyBOQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgViA9IFZCYXNlICsgKFNJbmRleCAlIE5Db3VudCkgLyBUQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgVCA9IFRCYXNlICsgU0luZGV4ICUgVENvdW50OwogICAgICAgICAgICAgICAgKm8rKyA9IEw7CiAgICAgICAgICAgICAgICAqbysrID0gVjsKICAgICAgICAgICAgICAgIHNwYWNlIC09IDI7CiAgICAgICAgICAgICAgICBpZiAoVCAhPSBUQmFzZSkgewogICAgICAgICAgICAgICAgICAgICpvKysgPSBUOwogICAgICAgICAgICAgICAgICAgIHNwYWNlIC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogbm9ybWFsaXphdGlvbiBjaGFuZ2VzICovCiAgICAgICAgICAgIGlmIChzZWxmKSB7CiAgICAgICAgICAgICAgICBQeV9VQ1M0IHZhbHVlID0gKChQcmV2aW91c0RCVmVyc2lvbiopc2VsZiktPm5vcm1hbGl6YXRpb24oY29kZSk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIE90aGVyIGRlY29tcG9zaXRpb25zLiAqLwogICAgICAgICAgICBnZXRfZGVjb21wX3JlY29yZChzZWxmLCBjb2RlLCAmaW5kZXgsICZwcmVmaXgsICZjb3VudCk7CgogICAgICAgICAgICAvKiBDb3B5IGNoYXJhY3RlciBpZiBpdCBpcyBub3QgZGVjb21wb3NhYmxlLCBvciBoYXMgYQogICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24sIGJ1dCB3ZSBkbyBORkQuICovCiAgICAgICAgICAgIGlmICghY291bnQgfHwgKHByZWZpeCAmJiAhaykpIHsKICAgICAgICAgICAgICAgICpvKysgPSBjb2RlOwogICAgICAgICAgICAgICAgc3BhY2UtLTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENvcHkgZGVjb21wb3NpdGlvbiBvbnRvIHRoZSBzdGFjaywgaW4gcmV2ZXJzZQogICAgICAgICAgICAgICBvcmRlci4gICovCiAgICAgICAgICAgIHdoaWxlKGNvdW50KSB7CiAgICAgICAgICAgICAgICBjb2RlID0gZGVjb21wX2RhdGFbaW5kZXggKyAoLS1jb3VudCldOwogICAgICAgICAgICAgICAgc3RhY2tbc3RhY2twdHIrK10gPSBjb2RlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIERyb3Agb3ZlcmFsbG9jYXRpb24uIENhbm5vdCBmYWlsLiAqLwogICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KSAtIHNwYWNlKTsKCiAgICAvKiBTb3J0IGNhbm9uaWNhbGx5LiAqLwogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CiAgICBwcmV2ID0gX2dldHJlY29yZF9leCgqaSktPmNvbWJpbmluZzsKICAgIGVuZCA9IGkgKyBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KTsKICAgIGZvciAoaSsrOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBjdXIgPSBfZ2V0cmVjb3JkX2V4KCppKS0+Y29tYmluaW5nOwogICAgICAgIGlmIChwcmV2ID09IDAgfHwgY3VyID09IDAgfHwgcHJldiA8PSBjdXIpIHsKICAgICAgICAgICAgcHJldiA9IGN1cjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8qIE5vbi1jYW5vbmljYWwgb3JkZXIuIE5lZWQgdG8gc3dpdGNoICppIHdpdGggcHJldmlvdXMuICovCiAgICAgICAgbyA9IGkgLSAxOwogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIFB5X1VOSUNPREUgdG1wID0gb1sxXTsKICAgICAgICAgICAgb1sxXSA9IG9bMF07CiAgICAgICAgICAgIG9bMF0gPSB0bXA7CiAgICAgICAgICAgIG8tLTsKICAgICAgICAgICAgaWYgKG8gPCBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIHByZXYgPSBfZ2V0cmVjb3JkX2V4KCpvKS0+Y29tYmluaW5nOwogICAgICAgICAgICBpZiAocHJldiA9PSAwIHx8IHByZXYgPD0gY3VyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHByZXYgPSBfZ2V0cmVjb3JkX2V4KCppKS0+Y29tYmluaW5nOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGludApmaW5kX25mY19pbmRleChQeU9iamVjdCAqc2VsZiwgc3RydWN0IHJlaW5kZXgqIG5mYywgUHlfVU5JQ09ERSBjb2RlKQp7CiAgICBpbnQgaW5kZXg7CiAgICBmb3IgKGluZGV4ID0gMDsgbmZjW2luZGV4XS5zdGFydDsgaW5kZXgrKykgewogICAgICAgIGludCBzdGFydCA9IG5mY1tpbmRleF0uc3RhcnQ7CiAgICAgICAgaWYgKGNvZGUgPCBzdGFydCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmIChjb2RlIDw9IHN0YXJ0ICsgbmZjW2luZGV4XS5jb3VudCkgewogICAgICAgICAgICBpbnQgZGVsdGEgPSBjb2RlIC0gc3RhcnQ7CiAgICAgICAgICAgIHJldHVybiBuZmNbaW5kZXhdLmluZGV4ICsgZGVsdGE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgUHlPYmplY3QqCm5mY19uZmtjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXQsIGludCBrKQp7CiAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgUHlfVU5JQ09ERSAqaSwgKmkxLCAqbywgKmVuZDsKICAgIGludCBmLGwsaW5kZXgsaW5kZXgxLGNvbWI7CiAgICBQeV9VTklDT0RFIGNvZGU7CiAgICBQeV9VTklDT0RFICpza2lwcGVkWzIwXTsKICAgIGludCBjc2tpcHBlZCA9IDA7CgogICAgcmVzdWx0ID0gbmZkX25ma2Qoc2VsZiwgaW5wdXQsIGspOwogICAgaWYgKCFyZXN1bHQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogV2UgYXJlIGdvaW5nIHRvIG1vZGlmeSByZXN1bHQgaW4tcGxhY2UuCiAgICAgICBJZiBuZmRfbmZrZCBpcyBjaGFuZ2VkIHRvIHNvbWV0aW1lcyByZXR1cm4gdGhlIGlucHV0LAogICAgICAgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIHJldmlld2VkLiAqLwogICAgYXNzZXJ0KHJlc3VsdCAhPSBpbnB1dCk7CgogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CiAgICBlbmQgPSBpICsgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7CiAgICBvID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKCQogIGFnYWluOgogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3NraXBwZWQ7IGluZGV4KyspIHsKICAgICAgICAgIGlmIChza2lwcGVkW2luZGV4XSA9PSBpKSB7CiAgICAgICAgICAgICAgLyogKmkgY2hhcmFjdGVyIGlzIHNraXBwZWQuIAogICAgICAgICAgICAgICAgIFJlbW92ZSBmcm9tIGxpc3QuICovCiAgICAgICAgICAgICAgc2tpcHBlZFtpbmRleF0gPSBza2lwcGVkW2Nza2lwcGVkLTFdOwogICAgICAgICAgICAgIGNza2lwcGVkLS07CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGdvdG8gYWdhaW47IC8qIGNvbnRpbnVlIHdoaWxlICovCiAgICAgICAgICB9CiAgICAgIH0KICAgICAgLyogSGFuZ3VsIENvbXBvc2l0aW9uLiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciA8TFYsVD4KICAgICAgICAgcGFpcnMsIHNpbmNlIHdlIGFsd2F5cyBoYXZlIGRlY29tcG9zZWQgZGF0YS4gKi8KICAgICAgaWYgKExCYXNlIDw9ICppICYmICppIDwgKExCYXNlK0xDb3VudCkgJiYKICAgICAgICAgIGkgKyAxIDwgZW5kICYmIAogICAgICAgICAgVkJhc2UgPD0gaVsxXSAmJiBpWzFdIDw9IChWQmFzZStWQ291bnQpKSB7CiAgICAgICAgICBpbnQgTEluZGV4LCBWSW5kZXg7CiAgICAgICAgICBMSW5kZXggPSBpWzBdIC0gTEJhc2U7CiAgICAgICAgICBWSW5kZXggPSBpWzFdIC0gVkJhc2U7CiAgICAgICAgICBjb2RlID0gU0Jhc2UgKyAoTEluZGV4KlZDb3VudCtWSW5kZXgpKlRDb3VudDsKICAgICAgICAgIGkrPTI7CiAgICAgICAgICBpZiAoaSA8IGVuZCAmJgogICAgICAgICAgICAgIFRCYXNlIDw9ICppICYmICppIDw9IChUQmFzZStUQ291bnQpKSB7CiAgICAgICAgICAgICAgY29kZSArPSAqaS1UQmFzZTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICB9CiAgICAgICAgICAqbysrID0gY29kZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBmID0gZmluZF9uZmNfaW5kZXgoc2VsZiwgbmZjX2ZpcnN0LCAqaSk7CiAgICAgIGlmIChmID09IC0xKSB7CiAgICAgICAgICAqbysrID0gKmkrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8qIEZpbmQgbmV4dCB1bmJsb2NrZWQgY2hhcmFjdGVyLiAqLwogICAgICBpMSA9IGkrMTsKICAgICAgY29tYiA9IDA7CiAgICAgIHdoaWxlIChpMSA8IGVuZCkgewogICAgICAgICAgaW50IGNvbWIxID0gX2dldHJlY29yZF9leCgqaTEpLT5jb21iaW5pbmc7CiAgICAgICAgICBpZiAoY29tYiAmJiAoY29tYjEgPT0gMCB8fCBjb21iID09IGNvbWIxKSkgewogICAgICAgICAgICAgIC8qIENoYXJhY3RlciBpcyBibG9ja2VkLiAqLwogICAgICAgICAgICAgIGkxKys7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBsID0gZmluZF9uZmNfaW5kZXgoc2VsZiwgbmZjX2xhc3QsICppMSk7CiAgICAgICAgICAvKiAqaTEgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggKmkuIElmICppMQogICAgICAgICAgICAgaXMgYSBzdGFydGVyLCB3ZSBkb24ndCBuZWVkIHRvIGxvb2sgZnVydGhlci4KICAgICAgICAgICAgIE90aGVyd2lzZSwgcmVjb3JkIHRoZSBjb21iaW5pbmcgY2xhc3MuICovCiAgICAgICAgICBpZiAobCA9PSAtMSkgewogICAgICAgICAgICBub3RfY29tYmluYWJsZToKICAgICAgICAgICAgICBpZiAoY29tYjEgPT0gMCkKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY29tYiA9IGNvbWIxOwogICAgICAgICAgICAgIGkxKys7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRleCA9IGYqVE9UQUxfTEFTVCArIGw7CiAgICAgICAgICBpbmRleDEgPSBjb21wX2luZGV4W2luZGV4ID4+IENPTVBfU0hJRlRdOwogICAgICAgICAgY29kZSA9IGNvbXBfZGF0YVsoaW5kZXgxPDxDT01QX1NISUZUKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4JigoMTw8Q09NUF9TSElGVCktMSkpXTsKICAgICAgICAgIGlmIChjb2RlID09IDApCiAgICAgICAgICAgICAgZ290byBub3RfY29tYmluYWJsZTsKCQkJCiAgICAgICAgICAvKiBSZXBsYWNlIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIuICovCiAgICAgICAgICAqaSA9IGNvZGU7CiAgICAgICAgICAvKiBNYXJrIHRoZSBzZWNvbmQgY2hhcmFjdGVyIHVudXNlZC4gKi8KICAgICAgICAgIHNraXBwZWRbY3NraXBwZWQrK10gPSBpMTsKICAgICAgICAgIGkxKys7CiAgICAgICAgICBmID0gZmluZF9uZmNfaW5kZXgoc2VsZiwgbmZjX2ZpcnN0LCAqaSk7CiAgICAgICAgICBpZiAoZiA9PSAtMSkKICAgICAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICAqbysrID0gKmkrKzsKICAgIH0KICAgIGlmIChvICE9IGVuZCkKICAgICAgICBQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG8gLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpKTsKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qIFJldHVybiAxIGlmIHRoZSBpbnB1dCBpcyBjZXJ0YWlubHkgbm9ybWFsaXplZCwgMCBpZiBpdCBtaWdodCBub3QgYmUuICovCnN0YXRpYyBpbnQKaXNfbm9ybWFsaXplZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmlucHV0LCBpbnQgbmZjLCBpbnQgaykKewogICAgUHlfVU5JQ09ERSAqaSwgKmVuZDsKICAgIHVuc2lnbmVkIGNoYXIgcHJldl9jb21iaW5pbmcgPSAwLCBxdWlja2NoZWNrX21hc2s7CgogICAgLyogQW4gb2xkZXIgdmVyc2lvbiBvZiB0aGUgZGF0YWJhc2UgaXMgcmVxdWVzdGVkLCBxdWlja2NoZWNrcyBtdXN0IGJlCiAgICAgICBkaXNhYmxlZC4gKi8KICAgIGlmIChzZWxmICE9IE5VTEwpCiAgICAgICAgcmV0dXJuIDA7CgogICAgLyogVGhlIHR3byBxdWlja2NoZWNrIGJpdHMgYXQgdGhpcyBzaGlmdCBtZWFuIDA9WWVzLCAxPU1heWJlLCAyPU5vLAogICAgICAgYXMgZGVzY3JpYmVkIGluIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMTUvI0FubmV4OC4gKi8KICAgIHF1aWNrY2hlY2tfbWFzayA9IDMgPDwgKChuZmMgPyA0IDogMCkgKyAoayA/IDIgOiAwKSk7CgogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGlucHV0KTsKICAgIGVuZCA9IGkgKyBQeVVuaWNvZGVfR0VUX1NJWkUoaW5wdXQpOwogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgICBjb25zdCBfUHlVbmljb2RlX0RhdGFiYXNlUmVjb3JkICpyZWNvcmQgPSBfZ2V0cmVjb3JkX2V4KCppKyspOwogICAgICAgIHVuc2lnbmVkIGNoYXIgY29tYmluaW5nID0gcmVjb3JkLT5jb21iaW5pbmc7CiAgICAgICAgdW5zaWduZWQgY2hhciBxdWlja2NoZWNrID0gcmVjb3JkLT5ub3JtYWxpemF0aW9uX3F1aWNrX2NoZWNrOwoKICAgICAgICBpZiAocXVpY2tjaGVjayAmIHF1aWNrY2hlY2tfbWFzaykKICAgICAgICAgICAgcmV0dXJuIDA7IC8qIHRoaXMgc3RyaW5nIG1pZ2h0IG5lZWQgbm9ybWFsaXphdGlvbiAqLwogICAgICAgIGlmIChjb21iaW5pbmcgJiYgcHJldl9jb21iaW5pbmcgPiBjb21iaW5pbmcpCiAgICAgICAgICAgIHJldHVybiAwOyAvKiBub24tY2Fub25pY2FsIHNvcnQgb3JkZXIsIG5vdCBub3JtYWxpemVkICovCiAgICAgICAgcHJldl9jb21iaW5pbmcgPSBjb21iaW5pbmc7CiAgICB9CiAgICByZXR1cm4gMTsgLyogY2VydGFpbmx5IG5vcm1hbGl6ZWQgKi8KfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX25vcm1hbGl6ZV9fZG9jX18sCiJub3JtYWxpemUoZm9ybSwgdW5pc3RyKVxuXApcblwKUmV0dXJuIHRoZSBub3JtYWwgZm9ybSAnZm9ybScgZm9yIHRoZSBVbmljb2RlIHN0cmluZyB1bmlzdHIuICBWYWxpZFxuXAp2YWx1ZXMgZm9yIGZvcm0gYXJlICdORkMnLCAnTkZLQycsICdORkQnLCBhbmQgJ05GS0QnLiIpOwoKc3RhdGljIFB5T2JqZWN0Kgp1bmljb2RlZGF0YV9ub3JtYWxpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBjaGFyICpmb3JtOwogICAgUHlPYmplY3QgKmlucHV0OwoKICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTyE6bm9ybWFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtLCAmUHlVbmljb2RlX1R5cGUsICZpbnB1dCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKFB5VW5pY29kZV9HZXRTaXplKGlucHV0KSA9PSAwKSB7CiAgICAgICAgLyogU3BlY2lhbCBjYXNlIGVtcHR5IGlucHV0IHN0cmluZ3MsIHNpbmNlIHJlc2l6aW5nCiAgICAgICAgICAgdGhlbSAgbGF0ZXIgd291bGQgY2F1c2UgaW50ZXJuYWwgZXJyb3JzLiAqLwogICAgICAgIFB5X0lOQ1JFRihpbnB1dCk7CiAgICAgICAgcmV0dXJuIGlucHV0OwogICAgfQoKICAgIGlmIChzdHJjbXAoZm9ybSwgIk5GQyIpID09IDApIHsKICAgICAgICBpZiAoaXNfbm9ybWFsaXplZChzZWxmLCBpbnB1dCwgMSwgMCkpIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGlucHV0KTsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmZjX25ma2Moc2VsZiwgaW5wdXQsIDApOwogICAgfQogICAgaWYgKHN0cmNtcChmb3JtLCAiTkZLQyIpID09IDApIHsKICAgICAgICBpZiAoaXNfbm9ybWFsaXplZChzZWxmLCBpbnB1dCwgMSwgMSkpIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGlucHV0KTsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmZjX25ma2Moc2VsZiwgaW5wdXQsIDEpOwogICAgfQogICAgaWYgKHN0cmNtcChmb3JtLCAiTkZEIikgPT0gMCkgewogICAgICAgIGlmIChpc19ub3JtYWxpemVkKHNlbGYsIGlucHV0LCAwLCAwKSkgewogICAgICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwogICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZmRfbmZrZChzZWxmLCBpbnB1dCwgMCk7CiAgICB9CiAgICBpZiAoc3RyY21wKGZvcm0sICJORktEIikgPT0gMCkgewogICAgICAgIGlmIChpc19ub3JtYWxpemVkKHNlbGYsIGlucHV0LCAwLCAxKSkgewogICAgICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwogICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZmRfbmZrZChzZWxmLCBpbnB1dCwgMSk7CiAgICB9CiAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgbm9ybWFsaXphdGlvbiBmb3JtIik7CiAgICByZXR1cm4gTlVMTDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogdW5pY29kZSBjaGFyYWN0ZXIgbmFtZSB0YWJsZXMgKi8KCi8qIGRhdGEgZmlsZSBnZW5lcmF0ZWQgYnkgVG9vbHMvdW5pY29kZS9tYWtldW5pY29kZWRhdGEucHkgKi8KI2luY2x1ZGUgInVuaWNvZGVuYW1lX2RiLmgiCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBkYXRhYmFzZSBjb2RlIChjdXQgYW5kIHBhc3RlZCBmcm9tIHRoZSB1bmlkYiBwYWNrYWdlKSAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcKX2dldGhhc2goY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IHNjYWxlKQp7CiAgICBpbnQgaTsKICAgIHVuc2lnbmVkIGxvbmcgaCA9IDA7CiAgICB1bnNpZ25lZCBsb25nIGl4OwogICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgaCA9IChoICogc2NhbGUpICsgKHVuc2lnbmVkIGNoYXIpIHRvdXBwZXIoUHlfQ0hBUk1BU0soc1tpXSkpOwogICAgICAgIGl4ID0gaCAmIDB4ZmYwMDAwMDA7CiAgICAgICAgaWYgKGl4KQogICAgICAgICAgICBoID0gKGggXiAoKGl4Pj4yNCkgJiAweGZmKSkgJiAweDAwZmZmZmZmOwogICAgfQogICAgcmV0dXJuIGg7Cn0KCnN0YXRpYyBjaGFyICpoYW5ndWxfc3lsbGFibGVzW11bM10gPSB7CiAgICB7ICJHIiwgICJBIiwgICAiIiAgIH0sCiAgICB7ICJHRyIsICJBRSIsICAiRyIgIH0sCiAgICB7ICJOIiwgICJZQSIsICAiR0ciIH0sCiAgICB7ICJEIiwgICJZQUUiLCAiR1MiIH0sCiAgICB7ICJERCIsICJFTyIsICAiTiIsIH0sCiAgICB7ICJSIiwgICJFIiwgICAiTkoiIH0sCiAgICB7ICJNIiwgICJZRU8iLCAiTkgiIH0sCiAgICB7ICJCIiwgICJZRSIsICAiRCIgIH0sCiAgICB7ICJCQiIsICJPIiwgICAiTCIgIH0sCiAgICB7ICJTIiwgICJXQSIsICAiTEciIH0sCiAgICB7ICJTUyIsICJXQUUiLCAiTE0iIH0sCiAgICB7ICIiLCAgICJPRSIsICAiTEIiIH0sCiAgICB7ICJKIiwgICJZTyIsICAiTFMiIH0sCiAgICB7ICJKSiIsICJVIiwgICAiTFQiIH0sCiAgICB7ICJDIiwgICJXRU8iLCAiTFAiIH0sCiAgICB7ICJLIiwgICJXRSIsICAiTEgiIH0sCiAgICB7ICJUIiwgICJXSSIsICAiTSIgIH0sCiAgICB7ICJQIiwgICJZVSIsICAiQiIgIH0sCiAgICB7ICJIIiwgICJFVSIsICAiQlMiIH0sCiAgICB7IDAsICAgICJZSSIsICAiUyIgIH0sCiAgICB7IDAsICAgICJJIiwgICAiU1MiIH0sCiAgICB7IDAsICAgIDAsICAgICAiTkciIH0sCiAgICB7IDAsICAgIDAsICAgICAiSiIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiQyIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiSyIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiVCIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiUCIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiSCIgIH0KfTsKCnN0YXRpYyBpbnQKaXNfdW5pZmllZF9pZGVvZ3JhcGgoUHlfVUNTNCBjb2RlKQp7CiAgICByZXR1cm4gKAogICAgICAgICgweDM0MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4NERCNSkgfHwgLyogQ0pLIElkZW9ncmFwaCBFeHRlbnNpb24gQSAqLwogICAgICAgICgweDRFMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4OUZCQikgfHwgLyogQ0pLIElkZW9ncmFwaCAqLwogICAgICAgICgweDIwMDAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDJBNkQ2KSk7LyogQ0pLIElkZW9ncmFwaCBFeHRlbnNpb24gQiAqLwp9CgpzdGF0aWMgaW50Cl9nZXR1Y25hbWUoUHlPYmplY3QgKnNlbGYsIFB5X1VDUzQgY29kZSwgY2hhciogYnVmZmVyLCBpbnQgYnVmbGVuKQp7CiAgICBpbnQgb2Zmc2V0OwogICAgaW50IGk7CiAgICBpbnQgd29yZDsKICAgIHVuc2lnbmVkIGNoYXIqIHc7CgogICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjb2RlKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApIHsKICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IAogICAgfQoKICAgIGlmIChTQmFzZSA8PSBjb2RlICYmIGNvZGUgPCBTQmFzZStTQ291bnQpIHsKCS8qIEhhbmd1bCBzeWxsYWJsZS4gKi8KCWludCBTSW5kZXggPSBjb2RlIC0gU0Jhc2U7CglpbnQgTCA9IFNJbmRleCAvIE5Db3VudDsKCWludCBWID0gKFNJbmRleCAlIE5Db3VudCkgLyBUQ291bnQ7CglpbnQgVCA9IFNJbmRleCAlIFRDb3VudDsKCglpZiAoYnVmbGVuIDwgMjcpCgkgICAgLyogV29yc3QgY2FzZTogSEFOR1VMIFNZTExBQkxFIDwxMGNoYXJzPi4gKi8KCSAgICByZXR1cm4gMDsKCXN0cmNweShidWZmZXIsICJIQU5HVUwgU1lMTEFCTEUgIik7CglidWZmZXIgKz0gMTY7CglzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW0xdWzBdKTsKCWJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CglzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1ZdWzFdKTsKCWJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tWXVsxXSk7CglzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKCWJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tUXVsyXSk7CgkqYnVmZmVyID0gJ1wwJzsKCXJldHVybiAxOwogICAgfQoKICAgIGlmIChpc191bmlmaWVkX2lkZW9ncmFwaChjb2RlKSkgewogICAgICAgIGlmIChidWZsZW4gPCAyOCkKICAgICAgICAgICAgLyogV29yc3QgY2FzZTogQ0pLIFVOSUZJRUQgSURFT0dSQVBILTIwMDAwICovCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHNwcmludGYoYnVmZmVyLCAiQ0pLIFVOSUZJRUQgSURFT0dSQVBILSVYIiwgY29kZSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLyogZ2V0IG9mZnNldCBpbnRvIHBocmFzZWJvb2sgKi8KICAgIG9mZnNldCA9IHBocmFzZWJvb2tfb2Zmc2V0MVsoY29kZT4+cGhyYXNlYm9va19zaGlmdCldOwogICAgb2Zmc2V0ID0gcGhyYXNlYm9va19vZmZzZXQyWyhvZmZzZXQ8PHBocmFzZWJvb2tfc2hpZnQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlJigoMTw8cGhyYXNlYm9va19zaGlmdCktMSkpXTsKICAgIGlmICghb2Zmc2V0KQogICAgICAgIHJldHVybiAwOwoKICAgIGkgPSAwOwoKICAgIGZvciAoOzspIHsKICAgICAgICAvKiBnZXQgd29yZCBpbmRleCAqLwogICAgICAgIHdvcmQgPSBwaHJhc2Vib29rW29mZnNldF0gLSBwaHJhc2Vib29rX3Nob3J0OwogICAgICAgIGlmICh3b3JkID49IDApIHsKICAgICAgICAgICAgd29yZCA9ICh3b3JkIDw8IDgpICsgcGhyYXNlYm9va1tvZmZzZXQrMV07CiAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICB3b3JkID0gcGhyYXNlYm9va1tvZmZzZXQrK107CiAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgaWYgKGkgPiBidWZsZW4pCiAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogYnVmZmVyIG92ZXJmbG93ICovCiAgICAgICAgICAgIGJ1ZmZlcltpKytdID0gJyAnOwogICAgICAgIH0KICAgICAgICAvKiBjb3B5IHdvcmQgc3RyaW5nIGZyb20gbGV4aWNvbi4gIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUKICAgICAgICAgICB3b3JkIGhhcyBiaXQgNyBzZXQuICB0aGUgbGFzdCB3b3JkIGluIGEgc3RyaW5nIGVuZHMgd2l0aAogICAgICAgICAgIDB4ODAgKi8KICAgICAgICB3ID0gbGV4aWNvbiArIGxleGljb25fb2Zmc2V0W3dvcmRdOwogICAgICAgIHdoaWxlICgqdyA8IDEyOCkgewogICAgICAgICAgICBpZiAoaSA+PSBidWZsZW4pCiAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogYnVmZmVyIG92ZXJmbG93ICovCiAgICAgICAgICAgIGJ1ZmZlcltpKytdID0gKncrKzsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPj0gYnVmbGVuKQogICAgICAgICAgICByZXR1cm4gMDsgLyogYnVmZmVyIG92ZXJmbG93ICovCiAgICAgICAgYnVmZmVyW2krK10gPSAqdyAmIDEyNzsKICAgICAgICBpZiAoKncgPT0gMTI4KQogICAgICAgICAgICBicmVhazsgLyogZW5kIG9mIHdvcmQgKi8KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3RhdGljIGludApfY21wbmFtZShQeU9iamVjdCAqc2VsZiwgaW50IGNvZGUsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuKQp7CiAgICAvKiBjaGVjayBpZiBjb2RlIGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBuYW1lICovCiAgICBpbnQgaTsKICAgIGNoYXIgYnVmZmVyW05BTUVfTUFYTEVOXTsKICAgIGlmICghX2dldHVjbmFtZShzZWxmLCBjb2RlLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKICAgICAgICByZXR1cm4gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lbGVuOyBpKyspIHsKICAgICAgICBpZiAodG91cHBlcihQeV9DSEFSTUFTSyhuYW1lW2ldKSkgIT0gYnVmZmVyW2ldKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBidWZmZXJbbmFtZWxlbl0gPT0gJ1wwJzsKfQoKc3RhdGljIHZvaWQgCmZpbmRfc3lsbGFibGUoY29uc3QgY2hhciAqc3RyLCBpbnQgKmxlbiwgaW50ICpwb3MsIGludCBjb3VudCwgaW50IGNvbHVtbikKewogICAgaW50IGksIGxlbjE7CiAgICAqbGVuID0gLTE7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJY2hhciAqcyA9IGhhbmd1bF9zeWxsYWJsZXNbaV1bY29sdW1uXTsKCWxlbjEgPSBzdHJsZW4ocyk7CglpZiAobGVuMSA8PSAqbGVuKQoJICAgIGNvbnRpbnVlOwoJaWYgKHN0cm5jbXAoc3RyLCBzLCBsZW4xKSA9PSAwKSB7CgkgICAgKmxlbiA9IGxlbjE7CgkgICAgKnBvcyA9IGk7Cgl9CiAgICB9CiAgICBpZiAoKmxlbiA9PSAtMSkgewoJKmxlbiA9IDA7CiAgICB9Cn0KCnN0YXRpYyBpbnQKX2dldGNvZGUoUHlPYmplY3QqIHNlbGYsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuLCBQeV9VQ1M0KiBjb2RlKQp7CiAgICB1bnNpZ25lZCBpbnQgaCwgdjsKICAgIHVuc2lnbmVkIGludCBtYXNrID0gY29kZV9zaXplLTE7CiAgICB1bnNpZ25lZCBpbnQgaSwgaW5jcjsKCiAgICAvKiBDaGVjayBmb3IgaGFuZ3VsIHN5bGxhYmxlcy4gKi8KICAgIGlmIChzdHJuY21wKG5hbWUsICJIQU5HVUwgU1lMTEFCTEUgIiwgMTYpID09IDApIHsKCWludCBsZW4sIEwgPSAtMSwgViA9IC0xLCBUID0gLTE7Cgljb25zdCBjaGFyICpwb3MgPSBuYW1lICsgMTY7CglmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJkwsIExDb3VudCwgMCk7Cglwb3MgKz0gbGVuOwoJZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZWLCBWQ291bnQsIDEpOwoJcG9zICs9IGxlbjsKCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmVCwgVENvdW50LCAyKTsKCXBvcyArPSBsZW47CglpZiAoTCAhPSAtMSAmJiBWICE9IC0xICYmIFQgIT0gLTEgJiYgcG9zLW5hbWUgPT0gbmFtZWxlbikgewoJICAgICpjb2RlID0gU0Jhc2UgKyAoTCpWQ291bnQrVikqVENvdW50ICsgVDsKCSAgICByZXR1cm4gMTsKCX0KICAgICAgICAvKiBPdGhlcndpc2UsIGl0J3MgYW4gaWxsZWdhbCBzeWxsYWJsZSBuYW1lLiAqLwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIENoZWNrIGZvciB1bmlmaWVkIGlkZW9ncmFwaHMuICovCiAgICBpZiAoc3RybmNtcChuYW1lLCAiQ0pLIFVOSUZJRUQgSURFT0dSQVBILSIsIDIyKSA9PSAwKSB7CiAgICAgICAgLyogRm91ciBvciBmaXZlIGhleGRpZ2l0cyBtdXN0IGZvbGxvdy4gKi8KICAgICAgICB2ID0gMDsKICAgICAgICBuYW1lICs9IDIyOwogICAgICAgIG5hbWVsZW4gLT0gMjI7CiAgICAgICAgaWYgKG5hbWVsZW4gIT0gNCAmJiBuYW1lbGVuICE9IDUpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHdoaWxlIChuYW1lbGVuLS0pIHsKICAgICAgICAgICAgdiAqPSAxNjsKICAgICAgICAgICAgaWYgKCpuYW1lID49ICcwJyAmJiAqbmFtZSA8PSAnOScpCiAgICAgICAgICAgICAgICB2ICs9ICpuYW1lIC0gJzAnOwogICAgICAgICAgICBlbHNlIGlmICgqbmFtZSA+PSAnQScgJiYgKm5hbWUgPD0gJ0YnKQogICAgICAgICAgICAgICAgdiArPSAqbmFtZSAtICdBJyArIDEwOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgbmFtZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX3VuaWZpZWRfaWRlb2dyYXBoKHYpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAqY29kZSA9IHY7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLyogdGhlIGZvbGxvd2luZyBpcyB0aGUgc2FtZSBhcyBweXRob24ncyBkaWN0aW9uYXJ5IGxvb2t1cCwgd2l0aAogICAgICAgb25seSBtaW5vciBjaGFuZ2VzLiAgc2VlIHRoZSBtYWtldW5pY29kZWRhdGEgc2NyaXB0IGZvciBtb3JlCiAgICAgICBkZXRhaWxzICovCgogICAgaCA9ICh1bnNpZ25lZCBpbnQpIF9nZXRoYXNoKG5hbWUsIG5hbWVsZW4sIGNvZGVfbWFnaWMpOwogICAgaSA9ICh+aCkgJiBtYXNrOwogICAgdiA9IGNvZGVfaGFzaFtpXTsKICAgIGlmICghdikKICAgICAgICByZXR1cm4gMDsKICAgIGlmIChfY21wbmFtZShzZWxmLCB2LCBuYW1lLCBuYW1lbGVuKSkgewogICAgICAgICpjb2RlID0gdjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGluY3IgPSAoaCBeIChoID4+IDMpKSAmIG1hc2s7CiAgICBpZiAoIWluY3IpCiAgICAgICAgaW5jciA9IG1hc2s7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgaSA9IChpICsgaW5jcikgJiBtYXNrOwogICAgICAgIHYgPSBjb2RlX2hhc2hbaV07CiAgICAgICAgaWYgKCF2KQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAoX2NtcG5hbWUoc2VsZiwgdiwgbmFtZSwgbmFtZWxlbikpIHsKICAgICAgICAgICAgKmNvZGUgPSB2OwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaW5jciA9IGluY3IgPDwgMTsKICAgICAgICBpZiAoaW5jciA+IG1hc2spCiAgICAgICAgICAgIGluY3IgPSBpbmNyIF4gY29kZV9wb2x5OwogICAgfQp9CgpzdGF0aWMgY29uc3QgX1B5VW5pY29kZV9OYW1lX0NBUEkgaGFzaEFQSSA9IAp7CiAgICBzaXplb2YoX1B5VW5pY29kZV9OYW1lX0NBUEkpLAogICAgX2dldHVjbmFtZSwKICAgIF9nZXRjb2RlCn07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBQeXRob24gYmluZGluZ3MgKi8KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9uYW1lX19kb2NfXywKIm5hbWUodW5pY2hyWywgZGVmYXVsdF0pXG5cClJldHVybnMgdGhlIG5hbWUgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHVuaWNociBhcyBhXG5cCnN0cmluZy4gSWYgbm8gbmFtZSBpcyBkZWZpbmVkLCBkZWZhdWx0IGlzIHJldHVybmVkLCBvciwgaWYgbm90XG5cCmdpdmVuLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX25hbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBjaGFyIG5hbWVbTkFNRV9NQVhMRU5dOwogICAgUHlfVUNTNCBjOwoKICAgIFB5VW5pY29kZU9iamVjdCogdjsKICAgIFB5T2JqZWN0KiBkZWZvYmogPSBOVUxMOwogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOm5hbWUiLCAmUHlVbmljb2RlX1R5cGUsICZ2LCAmZGVmb2JqKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoIV9nZXR1Y25hbWUoc2VsZiwgYywgbmFtZSwgc2l6ZW9mKG5hbWUpKSkgewoJaWYgKGRlZm9iaiA9PSBOVUxMKSB7CgkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBzdWNoIG5hbWUiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cgl9CgllbHNlIHsKCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKCSAgICByZXR1cm4gZGVmb2JqOwoJfQogICAgfQoKICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgbmFtZSk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9sb29rdXBfX2RvY19fLAoibG9va3VwKG5hbWUpXG5cClxuXApMb29rIHVwIGNoYXJhY3RlciBieSBuYW1lLiAgSWYgYSBjaGFyYWN0ZXIgd2l0aCB0aGVcblwKZ2l2ZW4gbmFtZSBpcyBmb3VuZCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGVcblwKY2hhcmFjdGVyLiAgSWYgbm90IGZvdW5kLCBLZXlFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9sb29rdXAoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeV9VQ1M0IGNvZGU7CiAgICBQeV9VTklDT0RFIHN0clsyXTsKCiAgICBjaGFyKiBuYW1lOwogICAgaW50IG5hbWVsZW47CiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmxvb2t1cCIsICZuYW1lLCAmbmFtZWxlbikpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCFfZ2V0Y29kZShzZWxmLCBuYW1lLCBuYW1lbGVuLCAmY29kZSkpIHsKICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJ1bmRlZmluZWQgY2hhcmFjdGVyIG5hbWUgJyVzJyIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKICAgIGlmIChjb2RlID49IDB4MTAwMDApIHsKICAgICAgICBzdHJbMF0gPSAweGQ4MDAgKyAoKGNvZGUgLSAweDEwMDAwKSA+PiAxMCk7CiAgICAgICAgc3RyWzFdID0gMHhkYzAwICsgKChjb2RlIC0gMHgxMDAwMCkgJiAweDNmZik7CiAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShzdHIsIDIpOwogICAgfQojZW5kaWYKICAgIHN0clswXSA9IChQeV9VTklDT0RFKSBjb2RlOwogICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShzdHIsIDEpOyAgICAKfQoKLyogWFhYIEFkZCBkb2Mgc3RyaW5ncy4gKi8KCnN0YXRpYyBQeU1ldGhvZERlZiB1bmljb2RlZGF0YV9mdW5jdGlvbnNbXSA9IHsKICAgIHsiZGVjaW1hbCIsIHVuaWNvZGVkYXRhX2RlY2ltYWwsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfZGVjaW1hbF9fZG9jX199LAogICAgeyJkaWdpdCIsIHVuaWNvZGVkYXRhX2RpZ2l0LCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX2RpZ2l0X19kb2NfX30sCiAgICB7Im51bWVyaWMiLCB1bmljb2RlZGF0YV9udW1lcmljLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX251bWVyaWNfX2RvY19ffSwKICAgIHsiY2F0ZWdvcnkiLCB1bmljb2RlZGF0YV9jYXRlZ29yeSwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX2NhdGVnb3J5X19kb2NfX30sCiAgICB7ImJpZGlyZWN0aW9uYWwiLCB1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsX19kb2NfX30sCiAgICB7ImNvbWJpbmluZyIsIHVuaWNvZGVkYXRhX2NvbWJpbmluZywgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9jb21iaW5pbmdfX2RvY19ffSwKICAgIHsibWlycm9yZWQiLCB1bmljb2RlZGF0YV9taXJyb3JlZCwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX21pcnJvcmVkX19kb2NfX30sCiAgICB7ImVhc3RfYXNpYW5fd2lkdGgiLCB1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoX19kb2NfX30sCiAgICB7ImRlY29tcG9zaXRpb24iLCB1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uX19kb2NfX30sCiAgICB7Im5hbWUiLCB1bmljb2RlZGF0YV9uYW1lLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX25hbWVfX2RvY19ffSwKICAgIHsibG9va3VwIiwgdW5pY29kZWRhdGFfbG9va3VwLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX2xvb2t1cF9fZG9jX199LAogICAgeyJub3JtYWxpemUiLCB1bmljb2RlZGF0YV9ub3JtYWxpemUsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfbm9ybWFsaXplX19kb2NfX30sCiAgICB7TlVMTCwgTlVMTH0JCS8qIHNlbnRpbmVsICovCn07CgpzdGF0aWMgUHlUeXBlT2JqZWN0IFVDRF9UeXBlID0gewoJLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCglQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKCSJ1bmljb2RlZGF0YS5VQ0QiLAkJLyp0cF9uYW1lKi8KCXNpemVvZihQcmV2aW91c0RCVmVyc2lvbiksCS8qdHBfYmFzaWNzaXplKi8KCTAsCQkJLyp0cF9pdGVtc2l6ZSovCgkvKiBtZXRob2RzICovCgkoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qdHBfZGVhbGxvYyovCgkwLAkJCS8qdHBfcHJpbnQqLwoJMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KCTAsCQkJLyp0cF9zZXRhdHRyKi8KCTAsCQkJLyp0cF9jb21wYXJlKi8KCTAsCQkJLyp0cF9yZXByKi8KCTAsCQkJLyp0cF9hc19udW1iZXIqLwoJMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KCTAsCQkJLyp0cF9oYXNoKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCiAgICAgICAgdW5pY29kZWRhdGFfZnVuY3Rpb25zLCAgLyp0cF9tZXRob2RzKi8KICAgICAgICBEQl9tZW1iZXJzLCAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCn07CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZG9jc3RyaW5nLAoiVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSB3aGljaFxuXApkZWZpbmVzIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGZvciBhbGwgVW5pY29kZSBjaGFyYWN0ZXJzLiBUaGUgZGF0YSBpblxuXAp0aGlzIGRhdGFiYXNlIGlzIGJhc2VkIG9uIHRoZSBVbmljb2RlRGF0YS50eHQgZmlsZSB2ZXJzaW9uXG5cCjUuMi4wIHdoaWNoIGlzIHB1YmxpY2FsbHkgYXZhaWxhYmxlIGZyb20gZnRwOi8vZnRwLnVuaWNvZGUub3JnLy5cblwKXG5cClRoZSBtb2R1bGUgdXNlcyB0aGUgc2FtZSBuYW1lcyBhbmQgc3ltYm9scyBhcyBkZWZpbmVkIGJ5IHRoZVxuXApVbmljb2RlRGF0YSBGaWxlIEZvcm1hdCA1LjIuMCAoc2VlXG5cCmh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjQ0L3RyNDQtNC5odG1sKS4iKTsKClB5TU9ESU5JVF9GVU5DCmluaXR1bmljb2RlZGF0YSh2b2lkKQp7CiAgICBQeU9iamVjdCAqbSwgKnY7CgogICAgUHlfVFlQRSgmVUNEX1R5cGUpID0gJlB5VHlwZV9UeXBlOwoKICAgIG0gPSBQeV9Jbml0TW9kdWxlMygKICAgICAgICAidW5pY29kZWRhdGEiLCB1bmljb2RlZGF0YV9mdW5jdGlvbnMsIHVuaWNvZGVkYXRhX2RvY3N0cmluZyk7CiAgICBpZiAoIW0pCiAgICAgICAgcmV0dXJuOwoKICAgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJ1bmlkYXRhX3ZlcnNpb24iLCBVTklEQVRBX1ZFUlNJT04pOwogICAgUHlfSU5DUkVGKCZVQ0RfVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVDRCIsIChQeU9iamVjdCopJlVDRF9UeXBlKTsKCiAgICAvKiBQcmV2aW91cyB2ZXJzaW9ucyAqLwogICAgdiA9IG5ld19wcmV2aW91c192ZXJzaW9uKCIzLjIuMCIsIGdldF9jaGFuZ2VfM18yXzAsIG5vcm1hbGl6YXRpb25fM18yXzApOwogICAgaWYgKHYgIT0gTlVMTCkKICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVjZF8zXzJfMCIsIHYpOwoKICAgIC8qIEV4cG9ydCBDIEFQSSAqLwogICAgdiA9IFB5Q2Fwc3VsZV9OZXcoKHZvaWQgKikmaGFzaEFQSSwgUHlVbmljb2RlRGF0YV9DQVBTVUxFX05BTUUsIE5VTEwpOwogICAgaWYgKHYgIT0gTlVMTCkKICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVjbmhhc2hfQ0FQSSIsIHYpOwp9CgovKiAKTG9jYWwgdmFyaWFibGVzOgpjLWJhc2ljLW9mZnNldDogNAppbmRlbnQtdGFicy1tb2RlOiBuaWwKRW5kOgoqLwo=