I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInNtY29tbW9uLmgiCiNpbmNsdWRlICJzbWlsLmgiCgppbnQgICAgICAgICBDaGVja19EX0xvZ0NIUyAgICAgICAgICAgICAgKFdPUkQgKixCWVRFICosQllURSAqKTsKdm9pZCAgICAgICAgSW5pdGlhbGl6ZV9EX01lZGlhICAgICAgICAgICh2b2lkKTsKdm9pZCAgICAgICAgUG93ZXJPZmZfRF9NZWRpYSAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVBvd2VyICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUV4aXN0ICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVdQICAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdCAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkciAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCk7CmludCAgICAgICAgIEluY19EX01lZGlhQWRkciAgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgICAgICAgIENoZWNrX0RfRmlyc3RTZWN0ICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIENoZWNrX0RfTGFzdFNlY3QgICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIE1lZGlhX0RfUmVhZE9uZVNlY3QgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqKTsKaW50ICAgICAgICAgTWVkaWFfRF9Xcml0ZU9uZVNlY3QgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja0hlYWQgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja1RhaWwgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlT25lQmxvY2sgICAgICAgKHZvaWQpOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQWxsQmxvY2sgICAgICAgKHZvaWQpOwoKaW50ICBDb3B5X0RfQmxvY2tBbGwgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIERXT1JEKTsKaW50ICBDb3B5X0RfQmxvY2tIZWFkICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIENvcHlfRF9CbG9ja1RhaWwgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVhc3NpZ25fRF9CbG9ja0hlYWQgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQXNzaWduX0RfV3JpdGVCbG9jayAgICAgICAgICh2b2lkKTsKaW50ICBSZWxlYXNlX0RfUmVhZEJsb2NrICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIFJlbGVhc2VfRF9Xcml0ZUJsb2NrICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVsZWFzZV9EX0NvcHlTZWN0b3IgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQ29weV9EX1BoeU9uZVNlY3QgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBSZWFkX0RfUGh5T25lU2VjdCAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKik7CmludCAgV3JpdGVfRF9QaHlPbmVTZWN0ICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgIEVyYXNlX0RfUGh5T25lQmxvY2sgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgppbnQgIFNldF9EX1BoeUZtdFZhbHVlICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgU2VhcmNoX0RfQ0lTICAgICAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBNYWtlX0RfTG9nVGFibGUgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwp2b2lkIENoZWNrX0RfQmxvY2tJc0Z1bGwgICAgICAgICAodm9pZCk7CgppbnQgIE1hcmtGYWlsX0RfUGh5T25lQmxvY2sgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgpEV09SRCBFcnJYRENvZGU7CkRXT1JEIEVyckNvZGU7Ci8vQllURSAgU2VjdEJ1ZltTRUNUU0laRV07CnN0YXRpYyBCWVRFICBXb3JrQnVmW1NFQ1RTSVpFXTsKc3RhdGljIEJZVEUgIFJlZHVuZGFudFtSRURUU0laRV07CnN0YXRpYyBCWVRFICBXb3JrUmVkdW5kW1JFRFRTSVpFXTsKLy9XT1JEICBMb2cyUGh5W01BWF9aT05FTlVNXVtNQVhfTE9HQkxPQ0tdOwpzdGF0aWMgV09SRCAgKkxvZzJQaHlbTUFYX1pPTkVOVU1dOyAgICAgICAgICAgICAgICAgLy8gMTI4IHggMTAwMCwgICBMb2cyUGh5W01BWF9aT05FTlVNXVtNQVhfTE9HQkxPQ0tdOwpzdGF0aWMgQllURSAgQXNzaWduW01BWF9aT05FTlVNXVtNQVhfQkxPQ0tOVU0vOF07CnN0YXRpYyBXT1JEICBBc3NpZ25TdGFydFtNQVhfWk9ORU5VTV07CldPUkQgIFJlYWRCbG9jazsKV09SRCAgV3JpdGVCbG9jazsKRFdPUkQgTWVkaWFDaGFuZ2U7CnN0YXRpYyBEV09SRCBTZWN0Q29weU1vZGU7CgovL0JJVCBDb250cm9sIE1hY3JvCnN0YXRpYyBCWVRFIEJpdERhdGFbXSA9IHsgMHgwMSwweDAyLDB4MDQsMHgwOCwweDEwLDB4MjAsMHg0MCwweDgwIH0gOwojZGVmaW5lIFNldF9EX0JpdChhLGIpICAgIChhWyhCWVRFKSgoYikvOCldfD0gQml0RGF0YVsoYiklOF0pCiNkZWZpbmUgQ2xyX0RfQml0KGEsYikgICAgKGFbKEJZVEUpKChiKS84KV0mPX5CaXREYXRhWyhiKSU4XSkKI2RlZmluZSBDaGtfRF9CaXQoYSxiKSAgICAoYVsoQllURSkoKGIpLzgpXSAmIEJpdERhdGFbKGIpJThdKQoKLy9leHRlcm4gUEJZVEUgICAgU01Ib3N0QWRkcjsKQllURSAgICAgSXNTU0ZEQ0NvbXBsaWFuY2U7CkJZVEUgICAgIElzWERDb21wbGlhbmNlOwoKCi8vCi8vLy9Qb3dlciBDb250cm9sICYgTWVkaWEgRXhpc3QgQ2hlY2sgRnVuY3Rpb24KLy8vLy0tLS0tIEluaXRfRF9TbWFydE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgSW5pdF9EX1NtYXJ0TWVkaWEodm9pZCkKLy97Ci8vICAgIGludCAgICAgaTsKLy8KLy8gICAgRU1DUl9QcmludCgiSW5pdF9EX1NtYXJ0TWVkaWEgc3RhcnRcbiIpOwovLyAgICBmb3IgKGk9MDsgaTxNQVhfWk9ORU5VTTsgaSsrKQovLyAgICB7Ci8vICAgICAgICBpZiAoTG9nMlBoeVtpXSE9TlVMTCkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBFTUNSX1ByaW50KCJFeEZyZWVQb29sIFpvbmUgPSAleCwgQWRkciA9ICV4XG4iLCBpLCBMb2cyUGh5W2ldKTsKLy8gICAgICAgICAgICBFeEZyZWVQb29sKExvZzJQaHlbaV0pOwovLyAgICAgICAgICAgIExvZzJQaHlbaV0gPSBOVUxMOwovLyAgICAgICAgfQovLyAgICB9Ci8vCi8vICAgIEluaXRpYWxpemVfRF9NZWRpYSgpOwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KCi8vLS0tLS0gU01fRnJlZU1lbSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNNX0ZyZWVNZW0odm9pZCkKewoJaW50CWk7CgoJcHJfaW5mbygiU01fRnJlZU1lbSBzdGFydFxuIik7Cglmb3IgKGk9MDsgaTxNQVhfWk9ORU5VTTsgaSsrKQoJewoJCWlmIChMb2cyUGh5W2ldIT1OVUxMKQoJCXsKCQkJcHJfaW5mbygiRnJlZSBab25lID0gJXgsIEFkZHIgPSAlcFxuIiwgaSwgTG9nMlBoeVtpXSk7CgkJCWtmcmVlKExvZzJQaHlbaV0pOwoJCQlMb2cyUGh5W2ldID0gTlVMTDsKCQl9Cgl9CglyZXR1cm4oTk9fRVJST1IpOwp9CgovLy8vLS0tLS0gUHdvZmZfRF9TbWFydE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBQd29mZl9EX1NtYXJ0TWVkaWEodm9pZCkKLy97Ci8vICAgIFBvd2VyT2ZmX0RfTWVkaWEoKTsKLy8gICAgcmV0dXJuKE5PX0VSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX1NtYXJ0TWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfU21hcnRNZWRpYSh2b2lkKQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFFeGlzdCgpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfUGFyYW1ldGVyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9QYXJhbWV0ZXIoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCxXT1JEICpwY3lsLEJZVEUgKnBoZWFkLEJZVEUgKnBzZWN0KQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9Mb2dDSFMocGN5bCxwaGVhZCxwc2VjdCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIHJldHVybihOT19FUlJPUik7Ci8vfQoKLy9TbWFydE1lZGlhIFJlYWQvV3JpdGUvRXJhc2UgRnVuY3Rpb24KLy8tLS0tLSBNZWRpYV9EX1JlYWRTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX1JlYWRTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBzdGFydCxXT1JEIGNvdW50LEJZVEUgKmJ1ZikKewoJV09SRCBsZW4sIGJuOwoKCS8vaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKSAgICAgICAgOyCmYiA2MjUwIGRvbid0IGNhcmUKCS8vICAgIHJldHVybihFcnJDb2RlKTsKCS8vaWYgKENoZWNrX0RfTWVkaWFGbXQoZmRvRXh0KSkgICAgOwoJLy8gICAgcmV0dXJuKEVyckNvZGUpOwoJaWYgKENvbnZfRF9NZWRpYUFkZHIodXMsIHN0YXJ0KSkKCQlyZXR1cm4oRXJyQ29kZSk7CgoJd2hpbGUoMSkKCXsKCQlsZW4gPSBTc2ZkYy5NYXhTZWN0b3JzIC0gTWVkaWEuU2VjdG9yOwoJCWlmIChjb3VudCA+IGxlbikKCQkJYm4gPSBsZW47CgkJZWxzZQoJCQlibiA9IGNvdW50OwoJCS8vaWYgKE1lZGlhX0RfUmVhZE9uZVNlY3QoZmRvRXh0LCBTZWN0QnVmKSkKCQkvL2lmIChNZWRpYV9EX1JlYWRPbmVTZWN0KGZkb0V4dCwgY291bnQsIGJ1ZikpCgkJaWYgKE1lZGlhX0RfUmVhZE9uZVNlY3QodXMsIGJuLCBidWYpKQoJCXsKCQkJRXJyQ29kZSA9IEVSUl9FY2NSZWFkRXJyOwoJCQlyZXR1cm4oRXJyQ29kZSk7CgkJfQoKCQlNZWRpYS5TZWN0b3IgKz0gYm47CgkJY291bnQgLT0gYm47CgoJCWlmIChjb3VudDw9MCkKCQkJYnJlYWs7CgoJCWJ1ZiArPSBibiAqIFNFQ1RTSVpFOwoKCQlpZiAoSW5jX0RfTWVkaWFBZGRyKHVzKSkKCQkJcmV0dXJuKEVyckNvZGUpOwoJfQoKCXJldHVybihOT19FUlJPUik7Cn0KLy8gaGVyZQovLy0tLS0tIE1lZGlhX0RfQ29weVNlY3RvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgc3RhcnQsV09SRCBjb3VudCxCWVRFICpidWYpCnsKCS8vRFdPUkQgbW9kZTsKCS8vaW50IGk7CglXT1JEIGxlbiwgYm47CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgkvKiBwcl9pbmZvKCJNZWRpYV9EX0NvcHlTZWN0b3IgISEhXG4iKTsgKi8KCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCgkJcmV0dXJuKEVyckNvZGUpOwoKCXdoaWxlKDEpCgl7CgkJaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKCQkJcmV0dXJuKEVSUk9SKTsKCgkJbGVuID0gU3NmZGMuTWF4U2VjdG9ycyAtIE1lZGlhLlNlY3RvcjsKCQlpZiAoY291bnQgPiBsZW4pCgkJCWJuID0gbGVuOwoJCWVsc2UKCQlibiA9IGNvdW50OwoKCQkvL2lmIChTc2ZkY19EX0NvcHlCbG9jayhmZG9FeHQsY291bnQsYnVmLFJlZHVuZGFudCkpCgkJaWYgKFNzZmRjX0RfQ29weUJsb2NrKHVzLGJuLGJ1ZixSZWR1bmRhbnQpKQoJCXsKCQkJRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwoJCQlyZXR1cm4oRXJyQ29kZSk7CgkJfQoKCQlNZWRpYS5TZWN0b3IgPSAweDFGOwoJCS8vaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKCQlpZiAoUmVsZWFzZV9EX0NvcHlTZWN0b3IodXMpKQoJCXsKCQkJaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQoJCQl7CgkJCQlFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CgkJCQlyZXR1cm4oRXJyQ29kZSk7CgkJCX0KCQl9CgkJY291bnQgLT0gYm47CgoJCWlmIChjb3VudDw9MCkKCQkJYnJlYWs7CgoJCWJ1ZiArPSBibiAqIFNFQ1RTSVpFOwoKCQlpZiAoSW5jX0RfTWVkaWFBZGRyKHVzKSkKCQkJcmV0dXJuKEVyckNvZGUpOwoKCX0KCXJldHVybihOT19FUlJPUik7Cn0KCi8vLS0tLS0gUmVsZWFzZV9EX0NvcHlTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFJlbGVhc2VfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICp1cykKewoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja109V3JpdGVCbG9jazsKCU1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKCglpZiAoTWVkaWEuUGh5QmxvY2s9PU5PX0FTU0lHTikKCXsKCQlNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoJCXJldHVybihTTVNVQ0NFU1MpOwoJfQoKCUNscl9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCglyZXR1cm4oU01TVUNDRVNTKTsKfQovKgovLy0tLS0tIE1lZGlhX0RfV3JpdGVTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfV3JpdGVTZWN0b3IoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgRFdPUkQgc3RhcnQsV09SRCBjb3VudCxCWVRFICpidWYpCnsKICAgIGludCBpOwogICAgV09SRCBsZW4sIGJuOwogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICAvL2lmIChDaGVja19EX01lZGlhUG93ZXIoKSkKICAgIC8vICAgIHJldHVybihFcnJDb2RlKTsKICAgIC8vCiAgICAvL2lmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpCiAgICAvLyAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAvLwogICAgLy9pZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCiAgICAvLyAgICByZXR1cm4oRXJyQ29kZSk7CgogICAgaWYgKENvbnZfRF9NZWRpYUFkZHIoZmRvRXh0LCBzdGFydCkpCiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIC8vRU5FX1ByaW50KCJNZWRpYV9EX1dyaXRlU2VjdG9yIC0tLSBTZWN0b3IgPSAleFxuIiwgTWVkaWEuU2VjdG9yKTsKICAgIGlmIChDaGVja19EX0ZpcnN0U2VjdCgpKQogICAgewogICAgICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja0hlYWQoZmRvRXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSgxKQogICAgewogICAgICAgIGlmICghQ2hlY2tfRF9GaXJzdFNlY3QoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCiAgICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAgICAgfQoKICAgICAgICBsZW4gPSBTc2ZkYy5NYXhTZWN0b3JzIC0gTWVkaWEuU2VjdG9yOwogICAgICAgIGlmIChjb3VudCA+IGxlbikKICAgICAgICAgICBibiA9IGxlbjsKICAgICAgICBlbHNlCiAgICAgICAgICAgYm4gPSBjb3VudDsKICAgICAgICAvL2ZvcihpPTA7aTxTRUNUU0laRTtpKyspCiAgICAgICAgLy8gICAgU2VjdEJ1ZltpXT0qYnVmKys7CgogICAgICAgIC8vaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCiAgICAgICAgaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgYm4sIGJ1ZikpCiAgICAgICAgewogICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKICAgICAgICB9CgogICAgICAgIE1lZGlhLlNlY3RvciArPSBibiAtIDE7CgogICAgICAgIGlmICghQ2hlY2tfRF9MYXN0U2VjdCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKCiAgICAgICAgICAgIHsgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvdW50IC09IGJuOwoKICAgICAgICBpZiAoY291bnQ8PTApCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBidWYgKz0gYm4gKiBTRUNUU0laRTsKCiAgICAgICAgLy9pZiAoLS1jb3VudDw9MCkKICAgICAgICAvLyAgICBicmVhazsKCiAgICAgICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQogICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICB9CgogICAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCiAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKCiAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja1RhaWwoZmRvRXh0KSkKICAgIHsKICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KLy8KLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZUJsb2NrKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIERXT1JEIHN0YXJ0LFdPUkQgY291bnQpCi8vewovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhV1AoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKENvbnZfRF9NZWRpYUFkZHIoc3RhcnQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICB3aGlsZShDaGVja19EX0ZpcnN0U2VjdCgpKSB7Ci8vICAgICAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICAgICAgaWYgKC0tY291bnQ8PTApCi8vICAgICAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKLy8gICAgfQovLwovLyAgICB3aGlsZSgxKSB7Ci8vICAgICAgICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKLy8gICAgICAgICAgICBpZiAoTWVkaWFfRF9FcmFzZU9uZUJsb2NrKCkpCi8vICAgICAgICAgICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKLy8gICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwovLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgICAgICAgICAgICAgICB9Ci8vCi8vICAgICAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICAgICAgaWYgKC0tY291bnQ8PTApCi8vICAgICAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKLy8gICAgfQovL30KLy8KLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VBbGwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZUFsbChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsKGZkb0V4dCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhV1AoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKE1lZGlhX0RfRXJhc2VBbGxCbG9jaygpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KCi8vU21hcnRNZWRpYSBXcml0ZSBGdW5jdGlvbiBmb3IgT25lIFNlY3RvciBXcml0ZSBNb2RlCi8vLS0tLS0gTWVkaWFfRF9PbmVTZWN0V3JpdGVTdGFydCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9PbmVTZWN0V3JpdGVTdGFydChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LERXT1JEIHN0YXJ0LEJZVEUgKmJ1ZikKewovLyAgaW50IGk7Ci8vICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgLy9pZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCi8vICAvLyAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAvL2lmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpCi8vICAvLyAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAvL2lmIChDaGVja19EX01lZGlhV1AoKSkKLy8gIC8vICAgIHJldHVybihFcnJDb2RlKTsKLy8gIGlmIChDb252X0RfTWVkaWFBZGRyKGZkb0V4dCwgc3RhcnQpKQovLyAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gIGlmIChDaGVja19EX0ZpcnN0U2VjdCgpKQovLyAgICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja0hlYWQoZmRvRXh0KSkKLy8gICAgICB7Ci8vICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgICAgIH0KLy8KLy8gIGlmICghQ2hlY2tfRF9GaXJzdFNlY3QoKSkKLy8gICAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQovLyAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAvL2ZvcihpPTA7aTxTRUNUU0laRTtpKyspCi8vICAvLyAgICBTZWN0QnVmW2ldPSpidWYrKzsKLy8KLy8gIC8vaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCi8vICBpZiAoTWVkaWFfRF9Xcml0ZU9uZVNlY3QoZmRvRXh0LCBidWYpKQovLyAgewovLyAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICB9Ci8vCi8vICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKLy8gIHsKLy8gICAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQovLyAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgIHsKLy8gICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICAgICAgfQovLyAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KCi8vLS0tLS0gTWVkaWFfRF9PbmVTZWN0V3JpdGVOZXh0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9PbmVTZWN0V3JpdGVOZXh0KFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZikKewovLyAgaW50IGk7Ci8vICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQovLyAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gIGlmICghQ2hlY2tfRF9GaXJzdFNlY3QoKSkKLy8gICAgaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAvL2ZvcihpPTA7aTxTRUNUU0laRTtpKyspCi8vICAvLyAgICBTZWN0QnVmW2ldPSpidWYrKzsKLy8KLy8gIC8vaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCi8vICBpZiAoTWVkaWFfRF9Xcml0ZU9uZVNlY3QoZmRvRXh0LCBidWYpKQovLyAgewovLyAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICB9Ci8vCi8vICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKLy8gIHsKLy8gICAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQovLyAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgIHsKLy8gICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICAgICAgfQovLyAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KCi8vLS0tLS0gTWVkaWFfRF9PbmVTZWN0V3JpdGVGbHVzaCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9PbmVTZWN0V3JpdGVGbHVzaChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQp7CiAgICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKICAgICAgICByZXR1cm4oTk9fRVJST1IpOwoKICAgIGlmIChJbmNfRF9NZWRpYUFkZHIoZmRvRXh0KSkKICAgICAgICByZXR1cm4oRXJyQ29kZSk7CgogICAgaWYgKE1lZGlhX0RfQ29weUJsb2NrVGFpbChmZG9FeHQpKQogICAgewogICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICB9CgogICAgcmV0dXJuKE5PX0VSUk9SKTsKfQovLwovLy8vTEVEIFRlcm4gT24vT2ZmIFN1YnJvdXRpbmUKLy8vLy0tLS0tIFNNX0VuYWJsZUxFRCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBTTV9FbmFibGVMRUQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQk9PTEVBTiBlbmFibGUpCi8vewovLyAgICBpZiAoZmRvRXh0LT5Ecml2ZV9Jc1NXTEVEKQovLyAgICB7Ci8vICAgICAgICBpZiAoZW5hYmxlKQovLyAgICAgICAgICAgTGVkX0RfVGVybk9uKCk7Ci8vICAgICAgICBlbHNlCi8vICAgICAgICAgICBMZWRfRF9UZXJuT2ZmKCk7Ci8vICAgIH0KLy99Ci8vCi8vLy8tLS0tLSBMZWRfRF9UZXJuT24oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBMZWRfRF9UZXJuT24odm9pZCkKLy97Ci8vICAgIGlmIChDaGVja19EX0NhcmRTdHNDaGcoKSkKLy8gICAgICAgIE1lZGlhQ2hhbmdlPUVSUk9SOwovLwovLyAgICBDbnRfRF9MZWRPbigpOwovL30KLy8KLy8vLy0tLS0tIExlZF9EX1Rlcm5PZmYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIExlZF9EX1Rlcm5PZmYodm9pZCkKLy97Ci8vICAgIGlmIChDaGVja19EX0NhcmRTdHNDaGcoKSkKLy8gICAgICAgIE1lZGlhQ2hhbmdlPUVSUk9SOwovLwovLyAgICBDbnRfRF9MZWRPZmYoKTsKLy99Ci8vCi8vLy9TbWFydE1lZGlhIExvZ2ljYWwgRm9ybWF0IFN1YnJvdXRpbmUKLy8vLy0tLS0tIENoZWNrX0RfTG9nQ0hTKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9Mb2dDSFMoV09SRCAqYyxCWVRFICpoLEJZVEUgKnMpCi8vewovLyAgICBzd2l0Y2goU3NmZGMuTW9kZWwpIHsKLy8gICAgICAgIGNhc2UgU1NGREMxTUI6ICAgKmM9MTI1OyAqaD0gNDsgKnM9IDQ7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzJNQjogICAqYz0xMjU7ICpoPSA0OyAqcz0gODsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDNE1COiAgICpjPTI1MDsgKmg9IDQ7ICpzPSA4OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREM4TUI6ICAgKmM9MjUwOyAqaD0gNDsgKnM9MTY7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzE2TUI6ICAqYz01MDA7ICpoPSA0OyAqcz0xNjsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDMzJNQjogICpjPTUwMDsgKmg9IDg7ICpzPTE2OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREM2NE1COiAgKmM9NTAwOyAqaD0gODsgKnM9MzI7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzEyOE1COiAqYz01MDA7ICpoPTE2OyAqcz0zMjsgYnJlYWs7Ci8vICAgICAgICBkZWZhdWx0OiAgICAgICAgICpjPSAwOyAgKmg9IDA7ICpzPSAwOyBFcnJDb2RlID0gRVJSX05vU21hcnRNZWRpYTsgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLy99Ci8vCi8vLy9Qb3dlciBDb250cm9sICYgTWVkaWEgRXhpc3QgQ2hlY2sgU3Vicm91dGluZQovLy8vLS0tLS0gSW5pdGlhbGl6ZV9EX01lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgSW5pdGlhbGl6ZV9EX01lZGlhKHZvaWQpCi8vewovLyAgICBFcnJDb2RlICAgICAgPSBOT19FUlJPUjsKLy8gICAgTWVkaWFDaGFuZ2UgID0gRVJST1I7Ci8vICAgIFNlY3RDb3B5TW9kZSA9IENPTVBMRVRFRDsKLy8gICAgQ250X0RfUmVzZXQoKTsKLy99Ci8vCi8vLy8tLS0tLSBQb3dlck9mZl9EX01lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBQb3dlck9mZl9EX01lZGlhKHZvaWQpCi8vewovLyAgICBDbnRfRF9Qb3dlck9mZigpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfTWVkaWFQb3dlcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9NZWRpYVBvd2VyKHZvaWQpCi8vewovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKENoZWNrX0RfQ2FyZFN0c0NoZygpKQovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIGlmICgoIUNoZWNrX0RfQ250UG93ZXIoKSkmJighTWVkaWFDaGFuZ2UpKSAgLy8gprMgcG93ZXIgJiBNZWRpYSCoU7NRIGNoYW5nZSwgq2ggcmV0dXJuIHN1Y2Nlc3MKLy8gICAgICAgIHJldHVybihTTVNVQ0NFU1MpOwovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8KLy8gICAgaWYgKENoZWNrX0RfQ2FyZEV4aXN0KCkpICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjYXJkIGlzIG5vdCBleGlzdCwgcmV0dXJuIGVycgovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Ob1NtYXJ0TWVkaWE7Ci8vICAgICAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKENudF9EX1Bvd2VyT24oKSkKLy8gICAgewovLyAgICAgICAgRXJyQ29kZSAgICAgICAgPSBFUlJfTm9TbWFydE1lZGlhOwovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIHJldHVybihTTVNVQ0NFU1MpOwovL30KLy8KLy8vLy0tLS0tQ2hlY2tfRF9NZWRpYUV4aXN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9NZWRpYUV4aXN0KHZvaWQpCi8vewovLyAgICBpZiAoQ2hlY2tfRF9DYXJkU3RzQ2hnKCkpCi8vICAgICAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLwovLyAgICBpZiAoIUNoZWNrX0RfQ2FyZEV4aXN0KCkpCi8vICAgIHsKLy8gICAgICAgIGlmICghTWVkaWFDaGFuZ2UpCi8vICAgICAgICAgICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vCi8vICAgICAgICBFcnJDb2RlID0gRVJSX0NoYW5nZWRNZWRpYTsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgRXJyQ29kZSA9IEVSUl9Ob1NtYXJ0TWVkaWE7Ci8vCi8vICAgIHJldHVybihFUlJPUik7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9NZWRpYVdQKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX01lZGlhV1Aodm9pZCkKLy97Ci8vICAgIGlmIChTc2ZkYy5BdHRyaWJ1dGUgJk1XUCkKLy8gICAgewovLyAgICAgICAgRXJyQ29kZSA9IEVSUl9XcnRQcm90ZWN0OwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLy99CiovCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBGb3JtYXQgVGVzdCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9NZWRpYUZtdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9NZWRpYUZtdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCXByX2luZm8oIkNoZWNrX0RfTWVkaWFGbXRcbiIpOwoJLy9VTE9ORyBpLGosIHJlc3VsdD1GQUxTRSwgem9uZSxibG9jazsKCgkvL3VzbGVlcCg1NioxMDI0KTsKCWlmICghTWVkaWFDaGFuZ2UpCgkJcmV0dXJuKFNNU1VDQ0VTUyk7CgoJTWVkaWFDaGFuZ2UgID0gRVJST1I7CglTZWN0Q29weU1vZGUgPSBDT01QTEVURUQ7CgoJLy91c2xlZXAoNTYqMTAyNCk7CglpZiAoU2V0X0RfUGh5Rm10VmFsdWUodXMpKQoJewoJCUVyckNvZGUgPSBFUlJfVW5rbm93bk1lZGlhOwoJCXJldHVybihFUlJPUik7Cgl9CgkKCS8vdXNsZWVwKDU2KjEwMjQpOwoJaWYgKFNlYXJjaF9EX0NJUyh1cykpCgl7CgkJRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwoJCXJldHVybihFUlJPUik7Cgl9CgoKICAgIE1lZGlhQ2hhbmdlID0gU01TVUNDRVNTOwogICAgcmV0dXJuKFNNU1VDQ0VTUyk7Cn0KLyoKLy8vLy0tLS0tIENoZWNrX0RfQmxvY2tJc0Z1bGwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDaGVja19EX0Jsb2NrSXNGdWxsKCkKLy97Ci8vICAgIFVMT05HIGksIGJsb2NrOwovLwovLyAgICBpZiAoSXNYRENvbXBsaWFuY2UgfHwgSXNTU0ZEQ0NvbXBsaWFuY2UpCi8vICAgIHsKLy8gICAgICAgLy8gSWYgdGhlIGJsb2NrcyBhcmUgZnVsbCB0aGVuIHJldHVybiB3cml0ZS1wcm90ZWN0LgovLyAgICAgICBibG9jayA9IFNzZmRjLk1heEJsb2Nrcy84OwovLyAgICAgICBmb3IgKE1lZGlhLlpvbmU9MDsgTWVkaWEuWm9uZTxTc2ZkYy5NYXhab25lczsgTWVkaWEuWm9uZSsrKQovLyAgICAgICB7Ci8vICAgICAgICAgICBpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKLy8gICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICBpZiAoTWFrZV9EX0xvZ1RhYmxlKCkpCi8vICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7Ci8vICAgICAgICAgICAgICAgICAgIHJldHVybjsKLy8gICAgICAgICAgICAgICB9Ci8vICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICBmb3IgKGk9MDsgaTxibG9jazsgaSsrKQovLyAgICAgICAgICAgewovLyAgICAgICAgICAgICAgIGlmIChBc3NpZ25bTWVkaWEuWm9uZV1baV0gIT0gMHhGRikKLy8gICAgICAgICAgICAgICAgICByZXR1cm47Ci8vICAgICAgICAgICB9Ci8vICAgICAgIH0KLy8gICAgICAgU3NmZGMuQXR0cmlidXRlIHw9IFdQOwovLyAgICB9Ci8vfQovLwovLwovLy8vLS0tLS0gQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX01lZGlhRm10Rm9yRXJhc2VBbGwoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKLy97Ci8vICAgIE1lZGlhQ2hhbmdlICA9IEVSUk9SOwovLyAgICBTZWN0Q29weU1vZGUgPSBDT01QTEVURUQ7Ci8vCi8vICAgIGlmIChTZXRfRF9QaHlGbXRWYWx1ZShmZG9FeHQpKQovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlID0gRVJSX1Vua25vd25NZWRpYTsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgaWYgKFNlYXJjaF9EX0NJUyhmZG9FeHQpKQovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7Ci8vICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICB9Ci8vCi8vICAgIHJldHVybihTTVNVQ0NFU1MpOwovL30KKi8KLy9TbWFydE1lZGlhIFBoeXNpY2FsIEFkZHJlc3MgQ29udHJvbCBTdWJyb3V0aW5lCi8vLS0tLS0gQ29udl9EX01lZGlhQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIGFkZHIpCnsKCURXT1JEIHRlbXA7CgkvL1VMT05HICB6ejsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCXRlbXAgICAgICAgICAgID0gYWRkci9Tc2ZkYy5NYXhTZWN0b3JzOwoJTWVkaWEuWm9uZSAgICAgPSAoQllURSkgKHRlbXAvU3NmZGMuTWF4TG9nQmxvY2tzKTsKCglpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKCXsKCQlpZiAoTWFrZV9EX0xvZ1RhYmxlKHVzKSkKCQl7CgkJCUVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKCQkJcmV0dXJuKEVSUk9SKTsKCQl9Cgl9CgoJTWVkaWEuU2VjdG9yICAgPSAoQllURSkgKGFkZHIlU3NmZGMuTWF4U2VjdG9ycyk7CglNZWRpYS5Mb2dCbG9jayA9IChXT1JEKSAodGVtcCVTc2ZkYy5NYXhMb2dCbG9ja3MpOwoKCWlmIChNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzKQoJewoJCUNscl9EX1JlZHVuZGFudERhdGEoUmVkdW5kYW50KTsKCQlTZXRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KTsKCQlNZWRpYS5QaHlCbG9jayA9IExvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdOwoJCXJldHVybihTTVNVQ0NFU1MpOwoJfQoKCUVyckNvZGUgPSBFUlJfT3V0T2ZMQkE7CglyZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIEluY19EX01lZGlhQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IEluY19EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCVdPUkQgICAgICAgIExvZ0Jsb2NrID0gTWVkaWEuTG9nQmxvY2s7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglpZiAoKytNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9ycykKCQlyZXR1cm4oU01TVUNDRVNTKTsKCglpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKCXsKCQlpZiAoTWFrZV9EX0xvZ1RhYmxlKHVzKSkKCQl7CgkJCUVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKCQkJcmV0dXJuKEVSUk9SKTsKCQl9Cgl9CgoJTWVkaWEuU2VjdG9yPTA7CglNZWRpYS5Mb2dCbG9jayA9IExvZ0Jsb2NrOwoKCWlmICgrK01lZGlhLkxvZ0Jsb2NrPFNzZmRjLk1heExvZ0Jsb2NrcykKCXsKCQlDbHJfRF9SZWR1bmRhbnREYXRhKFJlZHVuZGFudCk7CgkJU2V0X0RfTG9nQmxvY2tBZGRyKFJlZHVuZGFudCk7CgkJTWVkaWEuUGh5QmxvY2s9TG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja107CgkJcmV0dXJuKFNNU1VDQ0VTUyk7Cgl9CgoJTWVkaWEuTG9nQmxvY2s9MDsKCglpZiAoKytNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzKQoJewoJCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQoJCXsKCQkJaWYgKE1ha2VfRF9Mb2dUYWJsZSh1cykpCgkJCXsKCQkJCUVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKCQkJCXJldHVybihFUlJPUik7CgkJCX0KCQl9CgoJCU1lZGlhLkxvZ0Jsb2NrID0gMDsKCgkJQ2xyX0RfUmVkdW5kYW50RGF0YShSZWR1bmRhbnQpOwoJCVNldF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpOwoJCU1lZGlhLlBoeUJsb2NrPUxvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdOwoJCXJldHVybihTTVNVQ0NFU1MpOwoJfQoKCU1lZGlhLlpvbmU9MDsKCUVyckNvZGUgPSBFUlJfT3V0T2ZMQkE7CgoJcmV0dXJuKEVSUk9SKTsKfQovKgovLy0tLS0tIENoZWNrX0RfRmlyc3RTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfRmlyc3RTZWN0KHZvaWQpCnsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgaWYgKCFNZWRpYS5TZWN0b3IpCiAgICAgICAgcmV0dXJuKFNNU1VDQ0VTUyk7CgogICAgcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBDaGVja19EX0xhc3RTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX0xhc3RTZWN0KHZvaWQpCnsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgaWYgKE1lZGlhLlNlY3RvcjwoU3NmZGMuTWF4U2VjdG9ycy0xKSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIHJldHVybihTTVNVQ0NFU1MpOwp9CiovCi8vU21hcnRNZWRpYSBSZWFkL1dyaXRlIFN1YnJvdXRpbmUgd2l0aCBSZXRyeQovLy0tLS0tIE1lZGlhX0RfUmVhZE9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfUmVhZE9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYpCnsKCURXT1JEIGVyciwgcmV0cnk7CgoJaWYgKCFSZWFkX0RfUGh5T25lU2VjdCh1cywgY291bnQsIGJ1ZikpCgkJcmV0dXJuKFNNU1VDQ0VTUyk7CglpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCgkJcmV0dXJuKEVSUk9SKTsKCWlmIChFcnJDb2RlPT1FUlJfRGF0YVN0YXR1cykKCQlyZXR1cm4oRVJST1IpOwoKI2lmZGVmIFJERVJSX1JFQVNTSUdOCglpZiAoU3NmZGMuQXR0cmlidXRlICZNV1ApCgl7CgkJaWYgKEVyckNvZGU9PUVSUl9Db3JSZWFkRXJyKQoJCQlyZXR1cm4oU01TVUNDRVNTKTsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCWVycj1FcnJDb2RlOwoJZm9yKHJldHJ5PTA7IHJldHJ5PDI7IHJldHJ5KyspCgl7CgkJaWYgKENvcHlfRF9CbG9ja0FsbCh1cywgKGVycj09RVJSX0VjY1JlYWRFcnIpP1JFUV9GQUlMOlJFUV9FUkFTRSkpCgkJewoJCQlpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCgkJCQlyZXR1cm4oRVJST1IpOwoJCQljb250aW51ZTsKCQl9CgoJCUVyckNvZGUgPSBlcnI7CgkJaWYgKEVyckNvZGU9PUVSUl9Db3JSZWFkRXJyKQoJCQlyZXR1cm4oU01TVUNDRVNTKTsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCU1lZGlhQ2hhbmdlID0gRVJST1I7CiNlbHNlCglpZiAoRXJyQ29kZT09RVJSX0NvclJlYWRFcnIpIHJldHVybihTTVNVQ0NFU1MpOwojZW5kaWYKCglyZXR1cm4oRVJST1IpOwp9Ci8qCi8vLS0tLS0gTWVkaWFfRF9Xcml0ZU9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Xcml0ZU9uZVNlY3QoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgV09SRCBjb3VudCwgQllURSAqYnVmKQp7CiAgICBEV09SRCByZXRyeTsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgaWYgKCFXcml0ZV9EX1BoeU9uZVNlY3QoZmRvRXh0LCBjb3VudCwgYnVmKSkKICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsKICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIGZvcihyZXRyeT0xOyByZXRyeTwyOyByZXRyeSsrKQogICAgewogICAgICAgIGlmIChSZWFzc2lnbl9EX0Jsb2NrSGVhZChmZG9FeHQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIVdyaXRlX0RfUGh5T25lU2VjdChmZG9FeHQsIGNvdW50LCBidWYpKQogICAgICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsKICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICB9CgogICAgaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Xcml0ZUZhdWx0OwogICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKICAgIHJldHVybihFUlJPUik7Cn0KCi8vU21hcnRNZWRpYSBEYXRhIENvcHkgU3Vicm91dGluZSB3aXRoIFJldHJ5Ci8vLS0tLS0gTWVkaWFfRF9Db3B5QmxvY2tIZWFkKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Db3B5QmxvY2tIZWFkKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIERXT1JEIHJldHJ5OwoKICAgIGZvcihyZXRyeT0wOyByZXRyeTwyOyByZXRyeSsrKQogICAgewogICAgICAgIGlmICghQ29weV9EX0Jsb2NrSGVhZChmZG9FeHQpKQogICAgICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsKICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICB9CgogICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKICAgIHJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gTWVkaWFfRF9Db3B5QmxvY2tUYWlsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Db3B5QmxvY2tUYWlsKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIERXT1JEIHJldHJ5OwoKICAgIGlmICghQ29weV9EX0Jsb2NrVGFpbChmZG9FeHQpKQogICAgICAgIHJldHVybihTTVNVQ0NFU1MpOwogICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgZm9yKHJldHJ5PTE7IHJldHJ5PDI7IHJldHJ5KyspCiAgICB7CiAgICAgICAgaWYgKFJlYXNzaWduX0RfQmxvY2tIZWFkKGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICghQ29weV9EX0Jsb2NrVGFpbChmZG9FeHQpKQogICAgICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsKICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICB9CgogICAgaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Xcml0ZUZhdWx0OwogICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKICAgIHJldHVybihFUlJPUik7Cn0KLy8KLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VPbmVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZU9uZUJsb2NrKHZvaWQpCi8vewovLyAgICBXT1JEICAgICAgICBMb2dCbG9jayA9IE1lZGlhLkxvZ0Jsb2NrOwovLyAgICBXT1JEICAgICAgICBQaHlCbG9jayA9IE1lZGlhLlBoeUJsb2NrOwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIGlmIChNZWRpYS5QaHlCbG9jaz09Tk9fQVNTSUdOKQovLyAgICAgICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vCi8vICAgIGlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQovLyAgICB7Ci8vICAgICAgICBpZiAoTWFrZV9EX0xvZ1RhYmxlKCkpCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICB9Ci8vICAgIH0KLy8gICAgTWVkaWEuTG9nQmxvY2sgPSBMb2dCbG9jazsKLy8gICAgTWVkaWEuUGh5QmxvY2sgPSBQaHlCbG9jazsKLy8KLy8gICAgTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja109Tk9fQVNTSUdOOwovLwovLyAgICBpZiAoRXJhc2VfRF9QaHlPbmVCbG9jayhmZG9FeHQpKQovLyAgICB7Ci8vICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgIGlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8KLy8gICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgQ2xyX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7Ci8vICAgIE1lZGlhLlBoeUJsb2NrPU5PX0FTU0lHTjsKLy8gICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vfQovLwovLy8vU21hcnRNZWRpYSBFcmFzZSBTdWJyb3V0aW5lCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQWxsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VBbGxCbG9jayh2b2lkKQovL3sKLy8gICAgV09SRCBjaXM9MDsKLy8KLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLyAgICBNZWRpYS5TZWN0b3IgICA9IDA7Ci8vCi8vICAgIGZvcihNZWRpYS5ab25lPTA7IE1lZGlhLlpvbmU8U3NmZGMuTWF4Wm9uZXM7IE1lZGlhLlpvbmUrKykKLy8gICAgICAgIGZvcihNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazxTc2ZkYy5NYXhCbG9ja3M7IE1lZGlhLlBoeUJsb2NrKyspIHsKLy8gICAgICAgICAgICBpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEoUmVkdW5kYW50KSkKLy8gICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICAgU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLyAgICAgICAgICAgIGlmICghQ2hlY2tfRF9GYWlsQmxvY2soUmVkdW5kYW50KSkKLy8gICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgIGlmIChjaXMpCi8vICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgIGlmIChTc2ZkY19EX0VyYXNlQmxvY2soZmRvRXh0KSkKLy8gICAgICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX0h3RXJyb3I7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgICAgICAgICAgIGlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCi8vICAgICAgICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2soKSkKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAgICAgICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICAgICAgIGlmIChNZWRpYS5QaHlCbG9jayE9Q2lzQXJlYS5QaHlCbG9jaykKLy8gICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwovLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICAgICAgfQovLwovLyAgICAgICAgICAgICAgICBjaXMrKzsKLy8gICAgICAgICAgICB9Ci8vCi8vICAgICAgICB9Ci8vICAgIHJldHVybihTTVNVQ0NFU1MpOwovL30KKi8KLy9TbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBEYXRhIENvcHkgU3Vicm91dGluZQovLy0tLS0tIENvcHlfRF9CbG9ja0FsbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENvcHlfRF9CbG9ja0FsbChzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIG1vZGUpCnsKCUJZVEUgc2VjdDsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCXNlY3Q9TWVkaWEuU2VjdG9yOwoKCWlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCgkJcmV0dXJuKEVSUk9SKTsKCWlmIChtb2RlPT1SRVFfRkFJTCkKCQlTZWN0Q29weU1vZGU9UkVRX0ZBSUw7CgoJZm9yKE1lZGlhLlNlY3Rvcj0wOyBNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9yczsgTWVkaWEuU2VjdG9yKyspCgl7CgkJaWYgKENvcHlfRF9QaHlPbmVTZWN0KHVzKSkKCQl7CgkJCWlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKCQkJCXJldHVybihFUlJPUik7CgkJCWlmIChSZWxlYXNlX0RfV3JpdGVCbG9jayh1cykpCgkJCQlyZXR1cm4oRVJST1IpOwoKCQkJRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwoJCQlNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CgkJCU1lZGlhLlNlY3Rvcj1zZWN0OwoKCQkJcmV0dXJuKEVSUk9SKTsKCQl9Cgl9CgoJaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2sodXMpKQoJCXJldHVybihFUlJPUik7CgoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCU1lZGlhLlNlY3Rvcj1zZWN0OwoJcmV0dXJuKFNNU1VDQ0VTUyk7Cn0KLyoKLy8tLS0tLSBDb3B5X0RfQmxvY2tIZWFkKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDb3B5X0RfQmxvY2tIZWFkKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIEJZVEUgc2VjdDsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgc2VjdD1NZWRpYS5TZWN0b3I7CiAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgZm9yKE1lZGlhLlNlY3Rvcj0wOyBNZWRpYS5TZWN0b3I8c2VjdDsgTWVkaWEuU2VjdG9yKyspCiAgICB7CiAgICAgICAgaWYgKENvcHlfRF9QaHlPbmVTZWN0KGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgICAgICBpZiAoUmVsZWFzZV9EX1dyaXRlQmxvY2soZmRvRXh0KSkKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CgogICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgIE1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKICAgICAgICAgICAgTWVkaWEuU2VjdG9yPXNlY3Q7CgogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgIH0KICAgIH0KCiAgICBNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwogICAgTWVkaWEuU2VjdG9yPXNlY3Q7CiAgICByZXR1cm4oU01TVUNDRVNTKTsKfQoKLy8tLS0tLSBDb3B5X0RfQmxvY2tUYWlsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDb3B5X0RfQmxvY2tUYWlsKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIEJZVEUgc2VjdDsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgZm9yKHNlY3Q9TWVkaWEuU2VjdG9yOyBNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9yczsgTWVkaWEuU2VjdG9yKyspCiAgICB7CiAgICAgICAgaWYgKENvcHlfRF9QaHlPbmVTZWN0KGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgICAgICAgICAgTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKICAgICAgICAgICAgTWVkaWEuU2VjdG9yPXNlY3Q7CgogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKICAgIE1lZGlhLlNlY3Rvcj1zZWN0OwogICAgcmV0dXJuKFNNU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gUmVhc3NpZ25fRF9CbG9ja0hlYWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVhc3NpZ25fRF9CbG9ja0hlYWQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgRFdPUkQgIG1vZGU7CiAgICBXT1JEICAgYmxvY2s7CiAgICBCWVRFICAgc2VjdDsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgbW9kZT1TZWN0Q29weU1vZGU7CiAgICBibG9jaz1SZWFkQmxvY2s7CiAgICBzZWN0PU1lZGlhLlNlY3RvcjsKCiAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgU2VjdENvcHlNb2RlPVJFUV9GQUlMOwoKICAgIGZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPHNlY3Q7IE1lZGlhLlNlY3RvcisrKQogICAgewogICAgICAgIGlmIChDb3B5X0RfUGh5T25lU2VjdChmZG9FeHQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICAgICAgaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKGZkb0V4dCkpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwogICAgICAgICAgICBTZWN0Q29weU1vZGU9bW9kZTsKICAgICAgICAgICAgV3JpdGVCbG9jaz1SZWFkQmxvY2s7CiAgICAgICAgICAgIFJlYWRCbG9jaz1ibG9jazsKICAgICAgICAgICAgTWVkaWEuU2VjdG9yPXNlY3Q7CiAgICAgICAgICAgIE1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgU2VjdENvcHlNb2RlPW1vZGU7CiAgICBSZWFkQmxvY2s9YmxvY2s7CiAgICBNZWRpYS5TZWN0b3I9c2VjdDsKICAgIE1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CiAgICByZXR1cm4oU01TVUNDRVNTKTsKfQoqLwovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgQmxvY2sgQXNzaWduL1JlbGVhc2UgU3Vicm91dGluZQovLy0tLS0tIEFzc2lnbl9EX1dyaXRlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IEFzc2lnbl9EX1dyaXRlQmxvY2sodm9pZCkKewoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CglSZWFkQmxvY2s9TWVkaWEuUGh5QmxvY2s7CgoJZm9yKFdyaXRlQmxvY2s9QXNzaWduU3RhcnRbTWVkaWEuWm9uZV07IFdyaXRlQmxvY2s8U3NmZGMuTWF4QmxvY2tzOyBXcml0ZUJsb2NrKyspCgl7CgkJaWYgKCFDaGtfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLFdyaXRlQmxvY2spKQoJCXsKCQkJU2V0X0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxXcml0ZUJsb2NrKTsKCQkJQXNzaWduU3RhcnRbTWVkaWEuWm9uZV09V3JpdGVCbG9jaysxOwoJCQlNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoJCQlTZWN0Q29weU1vZGU9UkVRX0VSQVNFOwoJCQkvL0VyclhEQ29kZSA9IE5PX0VSUk9SOwoJCQlyZXR1cm4oU01TVUNDRVNTKTsKCQl9Cgl9CgoJZm9yKFdyaXRlQmxvY2s9MDsgV3JpdGVCbG9jazxBc3NpZ25TdGFydFtNZWRpYS5ab25lXTsgV3JpdGVCbG9jaysrKQoJewoJCWlmICghQ2hrX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxXcml0ZUJsb2NrKSkKCQl7CgkJCVNldF9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sV3JpdGVCbG9jayk7CgkJCUFzc2lnblN0YXJ0W01lZGlhLlpvbmVdPVdyaXRlQmxvY2srMTsKCQkJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCQkJU2VjdENvcHlNb2RlPVJFUV9FUkFTRTsKCQkJLy9FcnJYRENvZGUgPSBOT19FUlJPUjsKCQkJcmV0dXJuKFNNU1VDQ0VTUyk7CgkJfQoJfQoKCVdyaXRlQmxvY2s9Tk9fQVNTSUdOOwoJRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwoJLy8gRm9yIHhEIHRlc3QKCS8vU3NmZGMuQXR0cmlidXRlIHw9IFdQOwoJLy9FcnJYRENvZGUgPSBFUlJfV3J0UHJvdGVjdDsKCXJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gUmVsZWFzZV9EX1JlYWRCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVsZWFzZV9EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCURXT1JEIG1vZGU7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgltb2RlPVNlY3RDb3B5TW9kZTsKCVNlY3RDb3B5TW9kZT1DT01QTEVURUQ7CgoJaWYgKG1vZGU9PUNPTVBMRVRFRCkKCQlyZXR1cm4oU01TVUNDRVNTKTsKCglMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1Xcml0ZUJsb2NrOwoJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoKCWlmIChNZWRpYS5QaHlCbG9jaz09Tk9fQVNTSUdOKQoJewoJCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgkJcmV0dXJuKFNNU1VDQ0VTUyk7Cgl9CgoJaWYgKG1vZGU9PVJFUV9FUkFTRSkKCXsKCQlpZiAoRXJhc2VfRF9QaHlPbmVCbG9jayh1cykpCgkJewoJCQlpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpIHJldHVybihFUlJPUik7CgkJCWlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHVzKSkgcmV0dXJuKEVSUk9SKTsKCQl9CgkJZWxzZQoJCQlDbHJfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLE1lZGlhLlBoeUJsb2NrKTsKCX0KCWVsc2UgaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2sodXMpKQoJCXJldHVybihFUlJPUik7CgoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCXJldHVybihTTVNVQ0NFU1MpOwp9CgovLy0tLS0tIFJlbGVhc2VfRF9Xcml0ZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFJlbGVhc2VfRF9Xcml0ZUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKewoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CglTZWN0Q29weU1vZGU9Q09NUExFVEVEOwoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCglpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jayh1cykpCgkJcmV0dXJuKEVSUk9SKTsKCglNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CglyZXR1cm4oU01TVUNDRVNTKTsKfQoKLy9TbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBEYXRhIENvcHkgU3Vicm91dGluZQovLy0tLS0tIENvcHlfRF9QaHlPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENvcHlfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cykKewoJaW50ICAgICAgICAgICBpOwoJRFdPUkQgIGVyciwgcmV0cnk7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgkvKiBwcl9pbmZvKCJDb3B5X0RfUGh5T25lU2VjdCAtLS0gU2Vjb3RyID0gJXhcbiIsIE1lZGlhLlNlY3Rvcik7ICovCglpZiAoUmVhZEJsb2NrIT1OT19BU1NJR04pCgl7CgkJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoJCWZvcihyZXRyeT0wOyByZXRyeTwyOyByZXRyeSsrKQoJCXsKCQkJaWYgKHJldHJ5IT0wKQoJCQl7CgkJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJCWlmIChTc2ZkY19EX1JlYWRDaXNTZWN0KHVzLFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCgkJCQlpZiAoQ2hlY2tfRF9DSVNkYXRhKFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCQkJfQoKCQkJaWYgKFNzZmRjX0RfUmVhZFNlY3QodXMsV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJCWlmIChDaGVja19EX0RhdGFTdGF0dXMoV29ya1JlZHVuZCkpCgkJCXsgZXJyPUVSUk9SOyBicmVhazsgfQoJCQlpZiAoIUNoZWNrX0RfUmVhZEVycm9yKFdvcmtSZWR1bmQpKQoJCQl7IGVycj1TTVNVQ0NFU1M7IGJyZWFrOyB9CgkJCWlmICghQ2hlY2tfRF9Db3JyZWN0KFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCXsgZXJyPVNNU1VDQ0VTUzsgYnJlYWs7IH0KCgkJCWVycj1FUlJPUjsKCQkJU2VjdENvcHlNb2RlPVJFUV9GQUlMOwoJCX0KCX0KCWVsc2UKCXsKCQllcnI9U01TVUNDRVNTOwoJCWZvcihpPTA7IGk8U0VDVFNJWkU7IGkrKykKCQkJV29ya0J1ZltpXT1EVU1NWV9EQVRBOwoJCUNscl9EX1JlZHVuZGFudERhdGEoV29ya1JlZHVuZCk7Cgl9CgoJU2V0X0RfTG9nQmxvY2tBZGRyKFdvcmtSZWR1bmQpOwoJaWYgKGVycj09RVJST1IpCgl7CgkJU2V0X0RfUmlnaHRFQ0MoV29ya1JlZHVuZCk7CgkJU2V0X0RfRGF0YVN0YXVzKFdvcmtSZWR1bmQpOwoJfQoKCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgoJaWYgKFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weSh1cywgV29ya0J1ZiwgV29ya1JlZHVuZCkpCgl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCWlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCgl7IEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsgcmV0dXJuKEVSUk9SKTsgfQoKCU1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKCXJldHVybihTTVNVQ0NFU1MpOwp9CgovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgU2VjdG9yIFJlYWQvV3JpdGUvRXJhc2UgU3Vicm91dGluZQovLy0tLS0tIFJlYWRfRF9QaHlPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFJlYWRfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmKQp7CglpbnQgICAgICAgICAgIGk7CglEV09SRCAgcmV0cnk7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglpZiAoTWVkaWEuUGh5QmxvY2s9PU5PX0FTU0lHTikKCXsKCQlmb3IoaT0wOyBpPFNFQ1RTSVpFOyBpKyspCgkJCSpidWYrKz1EVU1NWV9EQVRBOwoJCXJldHVybihTTVNVQ0NFU1MpOwoJfQoKCWZvcihyZXRyeT0wOyByZXRyeTwyOyByZXRyeSsrKQoJewoJCWlmIChyZXRyeSE9MCkKCQl7CgkJCVNzZmRjX0RfUmVzZXQodXMpOwoKCQkJaWYgKFNzZmRjX0RfUmVhZENpc1NlY3QodXMsV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJCWlmIChDaGVja19EX0NJU2RhdGEoV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJfQoKCQkvL2lmIChTc2ZkY19EX1JlYWRTZWN0KGZkb0V4dCxidWYsUmVkdW5kYW50KSkKCQlpZiAoU3NmZGNfRF9SZWFkQmxvY2sodXMsY291bnQsYnVmLFJlZHVuZGFudCkpCgkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJaWYgKENoZWNrX0RfRGF0YVN0YXR1cyhSZWR1bmRhbnQpKQoJCXsgRXJyQ29kZSA9IEVSUl9EYXRhU3RhdHVzOyByZXR1cm4oRVJST1IpOyB9CgoJCWlmICghQ2hlY2tfRF9SZWFkRXJyb3IoUmVkdW5kYW50KSkKCQkJcmV0dXJuKFNNU1VDQ0VTUyk7CgoJCWlmICghQ2hlY2tfRF9Db3JyZWN0KGJ1ZixSZWR1bmRhbnQpKQoJCXsgRXJyQ29kZSA9IEVSUl9Db3JSZWFkRXJyOyByZXR1cm4oRVJST1IpOyB9Cgl9CgoJRXJyQ29kZSA9IEVSUl9FY2NSZWFkRXJyOwoJcmV0dXJuKEVSUk9SKTsKfQovKgovLy0tLS0tIFdyaXRlX0RfUGh5T25lU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFdyaXRlX0RfUGh5T25lU2VjdChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBXT1JEIGNvdW50LCBCWVRFICpidWYpCnsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgLy9pZiAoU3NmZGNfRF9Xcml0ZVNlY3QoZmRvRXh0LGJ1ZixSZWR1bmRhbnQpKQogICAgaWYgKFNzZmRjX0RfV3JpdGVCbG9jayhmZG9FeHQsY291bnQsYnVmLFJlZHVuZGFudCkpCiAgICB7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KICAgIGlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCiAgICB7IEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsgcmV0dXJuKEVSUk9SKTsgfQoKICAgIHJldHVybihTTVNVQ0NFU1MpOwp9CiovCi8vLS0tLS0gRXJhc2VfRF9QaHlPbmVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgRXJhc2VfRF9QaHlPbmVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCWlmIChTc2ZkY19EX0VyYXNlQmxvY2sodXMpKQoJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CglpZiAoU3NmZGNfRF9DaGVja1N0YXR1cygpKQoJeyBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7IHJldHVybihFUlJPUik7IH0KCglyZXR1cm4oU01TVUNDRVNTKTsKfQoKLy9TbWFydE1lZGlhIFBoeXNpY2FsIEZvcm1hdCBDaGVjayBMb2NhbCBTdWJyb3V0aW5lCi8vLS0tLS0gU2V0X0RfUGh5Rm10VmFsdWUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU2V0X0RfUGh5Rm10VmFsdWUoc3RydWN0IHVzX2RhdGEgKnVzKQp7Ci8vICAgIFBQRE9fREVWSUNFX0VYVEVOU0lPTiAgIHBkb0V4dDsKLy8gICAgQllURSAgICAgIGlkY29kZVs0XTsKLy8gICAgRFdPUkQgICAgIFVzZXJEZWZEYXRhXzEsIFVzZXJEZWZEYXRhXzIsIERhdGEsIG1hc2s7Ci8vCi8vICAgIC8vaWYgKCFmZG9FeHQtPkNoaWxkRGV2aWNlT2JqZWN0KSAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAvL3Bkb0V4dCA9IGZkb0V4dC0+Q2hpbGREZXZpY2VPYmplY3QtPkRldmljZUV4dGVuc2lvbjsKLy8KLy8gICAgU3NmZGNfRF9SZWFkSUQoaWRjb2RlLCBSRUFEX0lEXzEpOwovLwogICAgLy9pZiAoU2V0X0RfU3NmZGNNb2RlbChpZGNvZGVbMV0pKQogICAgaWYgKFNldF9EX1NzZmRjTW9kZWwodXMtPlNNX0RldmljZUlEKSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKLy8gICAgLy9Vc2UgTXVsdGktZnVuY3Rpb24gcGluIHRvIGRpZmZlcmVudGlhdGUgU00gYW5kIHhELgovLyAgICBVc2VyRGVmRGF0YV8xID0gUmVhZFBDSVJlZyhmZG9FeHQtPkJ1c0lELCBmZG9FeHQtPkRldklELCBmZG9FeHQtPkZ1bmNJRCwgUENJX1JFR19VU0VSX0RFRikgJiAweDgwOwovLyAgICBpZiAoVXNlckRlZkRhdGFfMSkKLy8gICAgewovLyAgICAgICBpZiAoIFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4ODAgKSAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9YRDsKLy8gICAgICAgaWYgKCBSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDQwICkgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfU007Ci8vCi8vICAgICAgIGlmICggSXNYRENvbXBsaWFuY2UgJiYgKGZkb0V4dC0+RGlza1R5cGUgPT0gRElTS1RZUEVfWEQpICkKLy8gICAgICAgewovLyAgICAgICAgICBTc2ZkY19EX1JlYWRJRChpZGNvZGUsIFJFQURfSURfMyk7Ci8vICAgICAgICAgIGlmIChpZGNvZGVbMl0gIT0gMHhCNSkKLy8gICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgfQovLyAgICB9Ci8vCi8vICAgIC8vVXNlIEdQSU8gdG8gZGlmZmVyZW50aWF0ZSBTTSBhbmQgeEQuCi8vICAgIFVzZXJEZWZEYXRhXzIgPSBSZWFkUENJUmVnKGZkb0V4dC0+QnVzSUQsIGZkb0V4dC0+RGV2SUQsIGZkb0V4dC0+RnVuY0lELCBQQ0lfUkVHX1VTRVJfREVGKSA+PiA4OwovLyAgICBpZiAoIFVzZXJEZWZEYXRhXzIgKQovLyAgICB7Ci8vICAgICAgIERhdGEgPSBSZWFkUENJUmVnKGZkb0V4dC0+QnVzSUQsIGZkb0V4dC0+RGV2SUQsIDAsIDB4QUMpOwovLwovLyAgICAgICBtYXNrID0gMSA8PCAoVXNlckRlZkRhdGFfMi0xKTsKLy8gICAgICAgLy8gMSA6IHhEICwgMCA6IFNNCi8vICAgICAgIGlmICggRGF0YSAmIG1hc2spCi8vICAgICAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9YRDsKLy8gICAgICAgZWxzZQovLyAgICAgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfU007Ci8vCi8vICAgICAgIGlmICggSXNYRENvbXBsaWFuY2UgJiYgKGZkb0V4dC0+RGlza1R5cGUgPT0gRElTS1RZUEVfWEQpICkKLy8gICAgICAgewovLyAgICAgICAgICBTc2ZkY19EX1JlYWRJRChpZGNvZGUsIFJFQURfSURfMyk7Ci8vICAgICAgICAgIGlmIChpZGNvZGVbMl0gIT0gMHhCNSkKLy8gICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgfQovLyAgICB9Ci8vCi8vICAgIGlmICggIShVc2VyRGVmRGF0YV8xIHwgVXNlckRlZkRhdGFfMikgKQovLyAgICB7Ci8vICAgICAgLy8gVXNlIFVzZXJEZWZpbmUgUmVnaXN0ZXIgdG8gZGlmZmVyZW50aWF0ZSBTTSBhbmQgeEQuCi8vICAgICAgU3NmZGNfRF9SZWFkSUQoaWRjb2RlLCBSRUFEX0lEXzMpOwovLwovLyAgICAgIGlmIChpZGNvZGVbMl0gPT0gMHhCNSkKLy8gICAgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfWEQ7Ci8vICAgICAgZWxzZQovLyAgICAgIHsKLy8gICAgICAgICAgaWYgKCFJc1hEQ29tcGxpYW5jZSkKLy8gICAgICAgICAgICAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1NNOwovLyAgICAgICAgICBlbHNlCi8vICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgfQovLwovLyAgICAgIGlmIChmZG9FeHQtPlVzZXJEZWZfRGlza1R5cGUgPT0gMHgwNCkgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9YRDsKLy8gICAgICBpZiAoZmRvRXh0LT5Vc2VyRGVmX0Rpc2tUeXBlID09IDB4MDgpICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfU007Ci8vICAgIH0KLy8KLy8gICAgaWYgKCFmZG9FeHQtPlVzZXJEZWZfRGlzYWJsZVdQKQovLyAgICB7Ci8vICAgICAgIGlmIChmZG9FeHQtPkRpc2tUeXBlID09IERJU0tUWVBFX1NNKQovLyAgICAgICB7Ci8vICAgICAgICAgICBpZiAoQ2hlY2tfRF9Tc2ZkY1dQKCkpCi8vICAgICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGV8PVdQOwovLyAgICAgICB9Ci8vICAgIH0KCiAgICByZXR1cm4oU01TVUNDRVNTKTsKfQoKLy8tLS0tLSBTZWFyY2hfRF9DSVMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTZWFyY2hfRF9DSVMoc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglNZWRpYS5ab25lPTA7IE1lZGlhLlNlY3Rvcj0wOwoKCWZvciAoTWVkaWEuUGh5QmxvY2s9MDsgTWVkaWEuUGh5QmxvY2s8KFNzZmRjLk1heEJsb2Nrcy1Tc2ZkYy5NYXhMb2dCbG9ja3MtMSk7IE1lZGlhLlBoeUJsb2NrKyspCgl7CgkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCXsKCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCXJldHVybihFUlJPUik7CgkJfQoKCQlpZiAoIUNoZWNrX0RfRmFpbEJsb2NrKFJlZHVuZGFudCkpCgkJCWJyZWFrOwoJfQoKCWlmIChNZWRpYS5QaHlCbG9jaz09KFNzZmRjLk1heEJsb2Nrcy1Tc2ZkYy5NYXhMb2dCbG9ja3MtMSkpCgl7CgkJU3NmZGNfRF9SZXNldCh1cyk7CgkJcmV0dXJuKEVSUk9SKTsKCX0KCgl3aGlsZSAoTWVkaWEuU2VjdG9yPENJU19TRUFSQ0hfU0VDVCkKCXsKCQlpZiAoTWVkaWEuU2VjdG9yKQoJCXsKCQkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCQl7CgkJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJCXJldHVybihFUlJPUik7CgkJCX0KCQl9CgkJaWYgKCFDaGVja19EX0RhdGFTdGF0dXMoUmVkdW5kYW50KSkKCQl7CgkJCWlmIChTc2ZkY19EX1JlYWRTZWN0KHVzLFdvcmtCdWYsUmVkdW5kYW50KSkKCQkJewoJCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCQlyZXR1cm4oRVJST1IpOwoJCQl9CgoJCQlpZiAoQ2hlY2tfRF9DSVNkYXRhKFdvcmtCdWYsUmVkdW5kYW50KSkKCQkJewoJCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCQlyZXR1cm4oRVJST1IpOwoJCQl9CgoJCQlDaXNBcmVhLlBoeUJsb2NrPU1lZGlhLlBoeUJsb2NrOwoJCQlDaXNBcmVhLlNlY3Rvcj1NZWRpYS5TZWN0b3I7CgkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQlyZXR1cm4oU01TVUNDRVNTKTsKCQl9CgoJCU1lZGlhLlNlY3RvcisrOwoJfQoKCVNzZmRjX0RfUmVzZXQodXMpOwoJcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBNYWtlX0RfTG9nVGFibGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNYWtlX0RfTG9nVGFibGUoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglXT1JEICBwaHlibG9jayxsb2dibG9jazsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQoJewoJCUxvZzJQaHlbTWVkaWEuWm9uZV0gPSBrbWFsbG9jKE1BWF9MT0dCTE9DSypzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOwoJCS8qIHByX2luZm8oIkV4QWxsb2NhdGVQb29sIFpvbmUgPSAleCwgQWRkciA9ICV4XG4iLAoJCQkJTWVkaWEuWm9uZSwgTG9nMlBoeVtNZWRpYS5ab25lXSk7ICovCgkJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV09PU5VTEwpCgkJCXJldHVybihFUlJPUik7Cgl9CgoJTWVkaWEuU2VjdG9yPTA7CgoJLy9mb3IoTWVkaWEuWm9uZT0wOyBNZWRpYS5ab25lPE1BWF9aT05FTlVNOyBNZWRpYS5ab25lKyspCgkvL2ZvcihNZWRpYS5ab25lPTA7IE1lZGlhLlpvbmU8U3NmZGMuTWF4Wm9uZXM7IE1lZGlhLlpvbmUrKykKCXsKCQkvKiBwcl9pbmZvKCJNYWtlX0RfTG9nVGFibGUgLS0tIE1lZGlhWm9uZSA9IDB4JXhcbiIsCgkJCQkJCQlNZWRpYS5ab25lKTsgKi8KCQlmb3IoTWVkaWEuTG9nQmxvY2s9MDsgTWVkaWEuTG9nQmxvY2s8U3NmZGMuTWF4TG9nQmxvY2tzOyBNZWRpYS5Mb2dCbG9jaysrKQoJCQlMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1OT19BU1NJR047CgoJCWZvcihNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazwoTUFYX0JMT0NLTlVNLzgpOyBNZWRpYS5QaHlCbG9jaysrKQoJCQlBc3NpZ25bTWVkaWEuWm9uZV1bTWVkaWEuUGh5QmxvY2tdPTB4MDA7CgoJCWZvcihNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazxTc2ZkYy5NYXhCbG9ja3M7IE1lZGlhLlBoeUJsb2NrKyspCgkJewoJCQlpZiAoKCFNZWRpYS5ab25lKSAmJiAoTWVkaWEuUGh5QmxvY2s8PUNpc0FyZWEuUGh5QmxvY2spKQoJCQl7CgkJCQlTZXRfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLE1lZGlhLlBoeUJsb2NrKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpCgkJCXsgU3NmZGNfRF9SZXNldCh1cyk7IHJldHVybihFUlJPUik7IH0KCgkJCWlmICghQ2hlY2tfRF9EYXRhQmxhbmsoUmVkdW5kYW50KSkKCQkJCWNvbnRpbnVlOwoKCQkJU2V0X0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7CgoJCQlpZiAoQ2hlY2tfRF9GYWlsQmxvY2soUmVkdW5kYW50KSkKCQkJCWNvbnRpbnVlOwoKCQkJLy9pZiAoQ2hlY2tfRF9EYXRhU3RhdHVzKFJlZHVuZGFudCkpCgkJCS8vICAgIGNvbnRpbnVlOwoKCQkJaWYgKExvYWRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KSkKCQkJCWNvbnRpbnVlOwoKCQkJaWYgKE1lZGlhLkxvZ0Jsb2NrPj1Tc2ZkYy5NYXhMb2dCbG9ja3MpCgkJCQljb250aW51ZTsKCgkJCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT09Tk9fQVNTSUdOKQoJCQl7CgkJCQlMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1NZWRpYS5QaHlCbG9jazsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlwaHlibG9jayAgICAgPSBNZWRpYS5QaHlCbG9jazsKCQkJbG9nYmxvY2sgICAgID0gTWVkaWEuTG9nQmxvY2s7CgkJCU1lZGlhLlNlY3RvciA9IChCWVRFKShTc2ZkYy5NYXhTZWN0b3JzLTEpOwoKCQkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCQl7IFNzZmRjX0RfUmVzZXQodXMpOyByZXR1cm4oRVJST1IpOyB9CgoJCQlpZiAoIUxvYWRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KSkKCQkJewoJCQkJaWYgKE1lZGlhLkxvZ0Jsb2NrPT1sb2dibG9jaykKCQkJCXsKCQkJCQlNZWRpYS5QaHlCbG9jaz1Mb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXTsKCgkJCQkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCQkJCXsgU3NmZGNfRF9SZXNldCh1cyk7IHJldHVybihFUlJPUik7IH0KCgkJCQkJTWVkaWEuUGh5QmxvY2s9cGh5YmxvY2s7CgoJCQkJCWlmICghTG9hZF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpKQoJCQkJCXsKCQkJCQkJaWYgKE1lZGlhLkxvZ0Jsb2NrIT1sb2dibG9jaykKCQkJCQkJewoJCQkJCQkJTWVkaWEuUGh5QmxvY2s9TG9nMlBoeVtNZWRpYS5ab25lXVtsb2dibG9ja107CgkJCQkJCQlMb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXT1waHlibG9jazsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlNZWRpYS5QaHlCbG9jaz1Mb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXTsKCQkJCQkJTG9nMlBoeVtNZWRpYS5ab25lXVtsb2dibG9ja109cGh5YmxvY2s7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlNZWRpYS5TZWN0b3I9MDsKCi8vIGhlcmUgTm90IHlldAovLyNpZmRlZiBMMlBfRVJSX0VSQVNFCi8vCQkJaWYgKCEoU3NmZGMuQXR0cmlidXRlICZNV1ApKQovLwkJCXsKLy8JCQkJU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLwkJCQlpZiAoU3NmZGNfRF9FcmFzZUJsb2NrKGZkb0V4dCkpCi8vCQkJCQlyZXR1cm4oRVJST1IpOwovLwovLwkJCQlpZiAoU3NmZGNfRF9DaGVja1N0YXR1cygpKQovLwkJCQl7Ci8vCQkJCQlpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jaygpKQovLwkJCQkJCXJldHVybihFUlJPUik7Ci8vCQkJCX0KLy8JCQkJZWxzZQovLwkJCQkJQ2xyX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7Ci8vCQkJfQovLyNlbHNlCi8vCQkJU3NmZGMuQXR0cmlidXRlfD1NV1A7Ci8vI2VuZGlmCgkJCU1lZGlhLlBoeUJsb2NrPXBoeWJsb2NrOwoKCQl9IC8vIEVuZCBmb3IgKE1lZGlhLlBoeUJsb2NrPFNzZmRjLk1heEJsb2NrcykKCgkJQXNzaWduU3RhcnRbTWVkaWEuWm9uZV09MDsKCgl9IC8vIEVuZCBmb3IgKE1lZGlhLlpvbmU8TUFYX1pPTkVOVU0pCgoJU3NmZGNfRF9SZXNldCh1cyk7CglyZXR1cm4oU01TVUNDRVNTKTsKfQoKLy8tLS0tLSBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKewoJQllURSBzZWN0OwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJc2VjdD1NZWRpYS5TZWN0b3I7CglTZXRfRF9GYWlsQmxvY2soV29ya1JlZHVuZCk7CgkvL1NzZmRjX0RfV3JpdGVSZWR0TW9kZSgpOwoKCWZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPFNzZmRjLk1heFNlY3RvcnM7IE1lZGlhLlNlY3RvcisrKQoJewoJCWlmIChTc2ZkY19EX1dyaXRlUmVkdERhdGEodXMsIFdvcmtSZWR1bmQpKQoJCXsKCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCU1lZGlhLlNlY3RvciAgID0gc2VjdDsKCQkJRXJyQ29kZSAgICAgICAgPSBFUlJfSHdFcnJvcjsKCQkJTWVkaWFDaGFuZ2UgPSBFUlJPUjsKCQkJcmV0dXJuKEVSUk9SKTsKCQl9IC8vIE5PIFN0YXR1cyBDaGVjawoJfQoKCVNzZmRjX0RfUmVzZXQodXMpOwoJTWVkaWEuU2VjdG9yPXNlY3Q7CglyZXR1cm4oU01TVUNDRVNTKTsKfQovKgovLwovLy8vLS0tLS0gU01fSW5pdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNNX0luaXQodm9pZCkKLy97Ci8vICAgIF9Id19EX0NsckludENhcmRDaGcoKTsKLy8gICAgX0h3X0RfU2V0SW50TWFzaygpOwovLyAgICAvLyBGb3IgRE1BIEludGVycnVwdAovLyAgICBfSHdfRF9DbHJETUFJbnRDYXJkQ2hnKCk7Ci8vICAgIF9Id19EX1NldERNQUludE1hc2soKTsKLy99Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQWxsUmVkdERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBNZWRpYV9EX0VyYXNlQWxsUmVkdERhdGEoRFdPUkQgSW5kZXgsIEJPT0xFQU4gQ2hlY2tCbG9jaykKLy97Ci8vICAgIEJZVEUgICAgaTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGZvciAoaT0wOyBpPFJFRFRTSVpFOyBpKyspCi8vICAgICAgICBXb3JrUmVkdW5kW2ldID0gMHhGRjsKLy8KLy8gICAgTWVkaWEuWm9uZSA9IChCWVRFKUluZGV4OwovLyAgICBmb3IgKE1lZGlhLlBoeUJsb2NrPTA7IE1lZGlhLlBoeUJsb2NrPFNzZmRjLk1heEJsb2NrczsgTWVkaWEuUGh5QmxvY2srKykKLy8gICAgewovLyAgICAgICAgaWYgKCghTWVkaWEuWm9uZSkgJiYgKE1lZGlhLlBoeUJsb2NrPD1DaXNBcmVhLlBoeUJsb2NrKSkKLy8gICAgICAgICAgICBjb250aW51ZTsKLy8KLy8gICAgICAgIGlmIChTc2ZkY19EX0VyYXNlQmxvY2soZmRvRXh0KSkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBFcnJDb2RlID0gRVJSX0h3RXJyb3I7Ci8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgIH0KLy8KLy8gICAgICAgIGZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPFNzZmRjLk1heFNlY3RvcnM7IE1lZGlhLlNlY3RvcisrKQovLyAgICAgICAgewovLyAgICAgICAgICAgIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSgpOwovLwovLyAgICAgICAgICAgIGlmIChTc2ZkY19EX1dyaXRlUmVkdERhdGEoV29ya1JlZHVuZCkpCi8vICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vICAgICAgICAgICAgICAgIEVyckNvZGUgICAgICAgID0gRVJSX0h3RXJyb3I7Ci8vICAgICAgICAgICAgICAgIE1lZGlhQ2hhbmdlICAgID0gRVJST1I7Ci8vICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICAgICAgfSAvLyBOTyBTdGF0dXMgQ2hlY2sKLy8gICAgICAgIH0KLy8KLy8gICAgICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgfQovLwovLyAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vCi8vICAgIHJldHVybihTTVNVQ0NFU1MpOwovL30KLy8KLy8vLy0tLS0tIE1lZGlhX0RfR2V0TWVkaWFJbmZvKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vRFdPUkQgTWVkaWFfRF9HZXRNZWRpYUluZm8oUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgUElPQ1RMX01FRElBX0lORk9fSU4gcFBhcmFtSW4sIFBJT0NUTF9NRURJQV9JTkZPX09VVCBwUGFyYW1PdXQpCi8vewovLyAgICBwUGFyYW1PdXQtPkVyckNvZGUgPSBTVEFUVVNfQ01EX0ZBSUw7Ci8vCi8vICAgIEluaXRfRF9TbWFydE1lZGlhKCk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhUG93ZXIoKSkKLy8gICAgICAgIHJldHVybiAoRXJyQ29kZT09RVJSX05vU21hcnRNZWRpYSkgPyBTVEFUVVNfQ01EX05PX01FRElBIDogU1RBVFVTX0NNRF9GQUlMOwovLwovLyAgICBpZiAoU2V0X0RfUGh5Rm10VmFsdWUoZmRvRXh0KSkKLy8gICAgICAgIHJldHVybiBTVEFUVVNfQ01EX0ZBSUw7Ci8vCi8vICAgIC8vdXNsZWVwKDU2KjEwMjQpOwovLyAgICBpZiAoU2VhcmNoX0RfQ0lTKGZkb0V4dCkpCi8vICAgICAgICByZXR1cm4gU1RBVFVTX0NNRF9GQUlMOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4gU1RBVFVTX0NNRF9NRURJQV9XUDsKLy8KLy8gICAgcFBhcmFtT3V0LT5QYWdlU2l6ZSAgPSBTc2ZkYy5NYXhTZWN0b3JzOwovLyAgICBwUGFyYW1PdXQtPkJsb2NrU2l6ZSA9IFNzZmRjLk1heEJsb2NrczsKLy8gICAgcFBhcmFtT3V0LT5ab25lU2l6ZSAgPSBTc2ZkYy5NYXhab25lczsKLy8KLy8gICAgcmV0dXJuIFNUQVRVU19DTURfU1VDQ0VTUzsKLy99Ki8K