LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKICoKICovCgojaW5jbHVkZSAiaWJtYXNtLmgiCiNpbmNsdWRlICJsb3dsZXZlbC5oIgojaW5jbHVkZSAiaTJvLmgiCiNpbmNsdWRlICJkb3RfY29tbWFuZC5oIgojaW5jbHVkZSAicmVtb3RlLmgiCgpzdGF0aWMgc3RydWN0IGkyb19oZWFkZXIgaGVhZGVyID0gSTJPX0hFQURFUl9URU1QTEFURTsKCgppbnQgaWJtYXNtX3NlbmRfaTJvX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKewoJdTMyIG1mYTsKCXVuc2lnbmVkIGludCBjb21tYW5kX3NpemU7CglzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1lc3NhZ2U7CglzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCA9IHNwLT5jdXJyZW50X2NvbW1hbmQ7CgoJbWZhID0gZ2V0X21mYV9pbmJvdW5kKHNwLT5iYXNlX2FkZHJlc3MpOwoJaWYgKCFtZmEpCgkJcmV0dXJuIDE7CgoJY29tbWFuZF9zaXplID0gZ2V0X2RvdF9jb21tYW5kX3NpemUoY29tbWFuZC0+YnVmZmVyKTsKCWhlYWRlci5tZXNzYWdlX3NpemUgPSBvdXRnb2luZ19tZXNzYWdlX3NpemUoY29tbWFuZF9zaXplKTsKCgltZXNzYWdlID0gZ2V0X2kyb19tZXNzYWdlKHNwLT5iYXNlX2FkZHJlc3MsIG1mYSk7CgoJbWVtY3B5X3RvaW8oJm1lc3NhZ2UtPmhlYWRlciwgJmhlYWRlciwgc2l6ZW9mKHN0cnVjdCBpMm9faGVhZGVyKSk7CgltZW1jcHlfdG9pbygmbWVzc2FnZS0+ZGF0YSwgY29tbWFuZC0+YnVmZmVyLCBjb21tYW5kX3NpemUpOwoKCXNldF9tZmFfaW5ib3VuZChzcC0+YmFzZV9hZGRyZXNzLCBtZmEpOwoKCXJldHVybiAwOwp9CgppcnFyZXR1cm5fdCBpYm1hc21faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCnsKCXUzMgltZmE7CglzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwID0gKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqKWRldl9pZDsKCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzID0gc3AtPmJhc2VfYWRkcmVzczsKCWNoYXIgdHNidWZbMzJdOwoKCWlmICghc3BfaW50ZXJydXB0X3BlbmRpbmcoYmFzZV9hZGRyZXNzKSkKCQlyZXR1cm4gSVJRX05PTkU7CgoJZGJnKCJyZXNwb25kIHRvIGludGVycnVwdCBhdCAlc1xuIiwgZ2V0X3RpbWVzdGFtcCh0c2J1ZikpOwoKCWlmIChtb3VzZV9pbnRlcnJ1cHRfcGVuZGluZyhzcCkpIHsKCQlpYm1hc21faGFuZGxlX21vdXNlX2ludGVycnVwdChzcCwgcmVncyk7CgkJY2xlYXJfbW91c2VfaW50ZXJydXB0KHNwKTsKCX0KCgltZmEgPSBnZXRfbWZhX291dGJvdW5kKGJhc2VfYWRkcmVzcyk7CglpZiAodmFsaWRfbWZhKG1mYSkpIHsKCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZyA9IGdldF9pMm9fbWVzc2FnZShiYXNlX2FkZHJlc3MsIG1mYSk7CgkJaWJtYXNtX3JlY2VpdmVfbWVzc2FnZShzcCwgJm1zZy0+ZGF0YSwgaW5jb21pbmdfZGF0YV9zaXplKG1zZykpOwoJfSBlbHNlCgkJZGJnKCJkaWRuJ3QgZ2V0IGEgdmFsaWQgTUZBXG4iKTsKCglzZXRfbWZhX291dGJvdW5kKGJhc2VfYWRkcmVzcywgbWZhKTsKCWRiZygiZmluaXNoZWQgaW50ZXJydXB0IGF0ICAgJXNcbiIsIGdldF90aW1lc3RhbXAodHNidWYpKTsKCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0K