LyogRGlyZWN0M0QgVmlld3BvcnQKICogQ29weXJpZ2h0IChjKSAxOTk4IExpb25lbCBVTE1FUgogKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QzRFZpZXdwb3J0Mi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEhlbHBlciBmdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIHZpZXdwb3J0X2FjdGl2YXRlCiAqCiAqIGFjdGl2YXRlcyB0aGUgdmlld3BvcnQgdXNpbmcgSURpcmVjdDNERGV2aWNlNzo6U2V0Vmlld3BvcnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHZpZXdwb3J0X2FjdGl2YXRlKElEaXJlY3QzRFZpZXdwb3J0SW1wbCogVGhpcywgQk9PTCBpZ25vcmVfbGlnaHRzKSB7CiAgICBJRGlyZWN0M0RMaWdodEltcGwqIGxpZ2h0OwogICAgRDNEVklFV1BPUlQ3IHZwOwoKICAgIGlmICghaWdub3JlX2xpZ2h0cykgewogICAgICAgIC8qIEFjdGl2YXRlIGFsbCB0aGUgbGlnaHRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgKi8KICAgICAgICBsaWdodCA9IFRoaXMtPmxpZ2h0czsKCiAgICAgICAgd2hpbGUgKGxpZ2h0ICE9IE5VTEwpIHsKICAgICAgICAgICAgbGlnaHQtPmFjdGl2YXRlKGxpZ2h0KTsKICAgICAgICAgICAgbGlnaHQgPSBsaWdodC0+bmV4dDsKICAgICAgICB9CiAgICB9CgogICAgLyogQW5kIGNvcHkgdGhlIHZhbHVlcyBpbiB0aGUgc3RydWN0dXJlIHVzZWQgYnkgdGhlIGRldmljZSAqLwogICAgaWYgKFRoaXMtPnVzZV92cDIpIHsKICAgICAgICB2cC5kd1ggPSBUaGlzLT52aWV3cG9ydHMudnAyLmR3WDsKCXZwLmR3WSA9IFRoaXMtPnZpZXdwb3J0cy52cDIuZHdZOwoJdnAuZHdIZWlnaHQgPSBUaGlzLT52aWV3cG9ydHMudnAyLmR3SGVpZ2h0OwoJdnAuZHdXaWR0aCA9IFRoaXMtPnZpZXdwb3J0cy52cDIuZHdXaWR0aDsKCXZwLmR2TWluWiA9IFRoaXMtPnZpZXdwb3J0cy52cDIuZHZNaW5aOwoJdnAuZHZNYXhaID0gVGhpcy0+dmlld3BvcnRzLnZwMi5kdk1heFo7CiAgICB9IGVsc2UgewogICAgICAgIHZwLmR3WCA9IFRoaXMtPnZpZXdwb3J0cy52cDEuZHdYOwoJdnAuZHdZID0gVGhpcy0+dmlld3BvcnRzLnZwMS5kd1k7Cgl2cC5kd0hlaWdodCA9IFRoaXMtPnZpZXdwb3J0cy52cDEuZHdIZWlnaHQ7Cgl2cC5kd1dpZHRoID0gVGhpcy0+dmlld3BvcnRzLnZwMS5kd1dpZHRoOwoJdnAuZHZNaW5aID0gVGhpcy0+dmlld3BvcnRzLnZwMS5kdk1pblo7Cgl2cC5kdk1heFogPSBUaGlzLT52aWV3cG9ydHMudnAxLmR2TWF4WjsKICAgIH0KICAgIAogICAgLyogQW5kIGFsc28gc2V0IHRoZSB2aWV3cG9ydCAqLwogICAgSURpcmVjdDNERGV2aWNlN19TZXRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLT5hY3RpdmVfZGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwgJnZwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIF9kdW1wX0QzRFZJRVdQT1JULCBfZHVtcF9EM0RWSUVXUE9SVDIKICoKICogV3JpdGVzIHZpZXdwb3J0IGluZm9ybWF0aW9uIHRvIFRSQUNFCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgX2R1bXBfRDNEVklFV1BPUlQoY29uc3QgRDNEVklFV1BPUlQgKmxwdnApCnsKICAgIFRSQUNFKCIgICAgLSBkd1NpemUgPSAlZCAgIGR3WCA9ICVkICAgZHdZID0gJWRcbiIsCgkgIGxwdnAtPmR3U2l6ZSwgbHB2cC0+ZHdYLCBscHZwLT5kd1kpOwogICAgVFJBQ0UoIiAgICAtIGR3V2lkdGggPSAlZCAgIGR3SGVpZ2h0ID0gJWRcbiIsCgkgIGxwdnAtPmR3V2lkdGgsIGxwdnAtPmR3SGVpZ2h0KTsKICAgIFRSQUNFKCIgICAgLSBkdlNjYWxlWCA9ICVmICAgZHZTY2FsZVkgPSAlZlxuIiwKCSAgbHB2cC0+ZHZTY2FsZVgsIGxwdnAtPmR2U2NhbGVZKTsKICAgIFRSQUNFKCIgICAgLSBkdk1heFggPSAlZiAgIGR2TWF4WSA9ICVmXG4iLAoJICBscHZwLT5kdk1heFgsIGxwdnAtPmR2TWF4WSk7CiAgICBUUkFDRSgiICAgIC0gZHZNaW5aID0gJWYgICBkdk1heFogPSAlZlxuIiwKCSAgbHB2cC0+ZHZNaW5aLCBscHZwLT5kdk1heFopOwp9CgpzdGF0aWMgdm9pZCBfZHVtcF9EM0RWSUVXUE9SVDIoY29uc3QgRDNEVklFV1BPUlQyICpscHZwKQp7CiAgICBUUkFDRSgiICAgIC0gZHdTaXplID0gJWQgICBkd1ggPSAlZCAgIGR3WSA9ICVkXG4iLAoJICBscHZwLT5kd1NpemUsIGxwdnAtPmR3WCwgbHB2cC0+ZHdZKTsKICAgIFRSQUNFKCIgICAgLSBkd1dpZHRoID0gJWQgICBkd0hlaWdodCA9ICVkXG4iLAoJICBscHZwLT5kd1dpZHRoLCBscHZwLT5kd0hlaWdodCk7CiAgICBUUkFDRSgiICAgIC0gZHZDbGlwWCA9ICVmICAgZHZDbGlwWSA9ICVmXG4iLAoJICBscHZwLT5kdkNsaXBYLCBscHZwLT5kdkNsaXBZKTsKICAgIFRSQUNFKCIgICAgLSBkdkNsaXBXaWR0aCA9ICVmICAgZHZDbGlwSGVpZ2h0ID0gJWZcbiIsCgkgIGxwdnAtPmR2Q2xpcFdpZHRoLCBscHZwLT5kdkNsaXBIZWlnaHQpOwogICAgVFJBQ0UoIiAgICAtIGR2TWluWiA9ICVmICAgZHZNYXhaID0gJWZcbiIsCgkgIGxwdnAtPmR2TWluWiwgbHB2cC0+ZHZNYXhaKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIE1ldGhvZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OlF1ZXJ5SW50ZXJmYWNlCiAqCiAqIEEgbm9ybWFsIFF1ZXJ5SW50ZXJmYWNlLiBDYW4gcXVlcnkgYWxsIGludGVyZmFjZSB2ZXJzaW9ucyBhbmQgdGhlCiAqIElVbmtub3duIGludGVyZmFjZS4gVGhlIFZUYWJsZXMgb2YgdGhlIGRpZmZlcmVudCB2ZXJzaW9ucwogKiBhcmUgZXF1YWwKICoKICogUGFyYW1zOgogKiAgcmVmaWlkOiBJbnRlcmZhY2UgaWQgcXVlcmllZCBmb3IKICogIG9iajogQWRkcmVzcyB0byB3cml0ZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgdG8KICoKICogUmV0dXJuczoKICogIFNfT0sgb24gc3VjY2Vzcy4KICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JwKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CgogICAgKm9icCA9IE5VTEw7CgogICAgaWYgKCBJc0VxdWFsR1VJRCgmSUlEX0lVbmtub3duLCAgcmlpZCkgfHwKCSBJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzRFZpZXdwb3J0LCByaWlkKSB8fAoJIElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNEVmlld3BvcnQyLCByaWlkKSB8fAoJIElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNEVmlld3BvcnQzLCByaWlkKSApIHsKICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDNfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZpZXdwb3J0MykpOwogICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWaWV3cG9ydDMpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNEVmlld3BvcnQxLzIvMyBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBGSVhNRSgiKCVwKTogaW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSk7CiAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6QWRkUmVmCiAqCiAqIEluY3JlYXNlcyB0aGUgcmVmY291bnQuCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfQWRkUmVmKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpSZWxlYXNlCiAqCiAqIFJlZHVjZXMgdGhlIHJlZmNvdW50LiBJZiBpdCBmYWxscyB0byAwLCB0aGUgaW50ZXJmYWNlIGlzIHJlbGVhc2VkCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfUmVsZWFzZShJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmICsgMSk7CgogICAgaWYgKCFyZWYpIHsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0IE1ldGhvZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkluaXRpYWxpemUKICoKICogTm8tb3AgaW5pdGlhbGl6YXRpb24uCiAqCiAqIFBhcmFtczoKICogIERpcmVjdDNEOiBUaGUgZGlyZWN0M0QgZGV2aWNlIHRoaXMgdmlld3BvcnQgaXMgYXNzaWduZWQgdG8KICoKICogUmV0dXJuczoKICogIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfSW5pdGlhbGl6ZShJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0QgKkRpcmVjdDNEKQp7CiAgICBUUkFDRSgiKCVwKS0+KCVwKSBuby1vcC4uLlxuIiwgaWZhY2UsIERpcmVjdDNEKTsKICAgIHJldHVybiBEREVSUl9BTFJFQURZSU5JVElBTElaRUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldFZpZXdwb3J0CiAqCiAqIFJldHVybnMgdGhlIHZpZXdwb3J0IGRhdGEgYXNzaWduZWQgdG8gdGhpcyB2aWV3cG9ydCBpbnRlcmZhY2UKICoKICogUGFyYW1zOgogKiAgRGF0YTogQWRkcmVzcyB0byBzdG9yZSB0aGUgZGF0YQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGF0YSBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRWaWV3cG9ydChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQgKmxwRGF0YSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIERXT1JEIGR3U2l6ZTsKICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBEYXRhKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYgKFRoaXMtPnVzZV92cDIgIT0gMCkgewogICAgICAgIEVSUigiICBSZXF1ZXN0aW5nIHRvIGdldCBhIEQzRFZJRVdQT1JUIHN0cnVjdCB3aGVyZSBhIEQzRFZJRVdQT1JUMiB3YXMgc2V0ICFcbiIpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CiAgICBkd1NpemUgPSBscERhdGEtPmR3U2l6ZTsKICAgIG1lbXNldChscERhdGEsIDAsIGR3U2l6ZSk7CiAgICBtZW1jcHkobHBEYXRhLCAmKFRoaXMtPnZpZXdwb3J0cy52cDEpLCBkd1NpemUpOwoKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIFRSQUNFKCIgIHJldHVybmluZyBEM0RWSUVXUE9SVCA6XG4iKTsKCV9kdW1wX0QzRFZJRVdQT1JUKGxwRGF0YSk7CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6U2V0Vmlld3BvcnQKICoKICogU2V0cyB0aGUgdmlld3BvcnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlCiAqCiAqIFBhcmFtczoKICogIGxwRGF0YTogVmlld3BvcnQgdG8gc2V0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEYXRhIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldFZpZXdwb3J0KElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWSUVXUE9SVCAqbHBEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgTFBESVJFQ1QzRFZJRVdQT1JUMyBjdXJyZW50X3ZpZXdwb3J0OwogICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERhdGEpOwoKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIFRSQUNFKCIgIGdldHRpbmcgRDNEVklFV1BPUlQgOlxuIik7CglfZHVtcF9EM0RWSUVXUE9SVChscERhdGEpOwogICAgfQoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBUaGlzLT51c2VfdnAyID0gMDsKICAgIG1lbXNldCgmKFRoaXMtPnZpZXdwb3J0cy52cDEpLCAwLCBzaXplb2YoVGhpcy0+dmlld3BvcnRzLnZwMSkpOwogICAgbWVtY3B5KCYoVGhpcy0+dmlld3BvcnRzLnZwMSksIGxwRGF0YSwgbHBEYXRhLT5kd1NpemUpOwoKICAgIC8qIFRlc3RzIG9uIHR3byBnYW1lcyBzaG93IHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBuZXZlciB1c2VkIHByb3Blcmx5IHNvIG92ZXJyaWRlCiAgICAgICB0aGVtIHdpdGggcHJvcGVyIG9uZXMgOi0pCiAgICAqLwogICAgVGhpcy0+dmlld3BvcnRzLnZwMS5kdk1pblogPSAwLjA7CiAgICBUaGlzLT52aWV3cG9ydHMudnAxLmR2TWF4WiA9IDEuMDsKCiAgICBpZiAoVGhpcy0+YWN0aXZlX2RldmljZSkgewogICAgICAgIElEaXJlY3QzRERldmljZTNfR2V0Q3VycmVudFZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIElEaXJlY3QzRERldmljZTMpLCAmY3VycmVudF92aWV3cG9ydCk7CiAgICAgICAgaWYgKGN1cnJlbnRfdmlld3BvcnQpIHsKICAgICAgICAgICAgaWYgKElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBjdXJyZW50X3ZpZXdwb3J0KSA9PSBUaGlzKQogICAgICAgICAgICAgICAgVGhpcy0+YWN0aXZhdGUoVGhpcywgRkFMU0UpOwogICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDNfUmVsZWFzZShjdXJyZW50X3ZpZXdwb3J0KTsKICAgICAgICB9CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6VHJhbnNmb3JtVmVydGljZXMKICoKICogVHJhbnNmb3JtcyB2ZXJ0aWNlcyBieSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHByZXR0eSBzaW1pbGFyIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OlByb2Nlc3NWZXJ0aWNlcywKICogc28gaXQncyB0ZW1wdGluZyB0byBmb3J3YXJkIGl0IHRvIHRoZXJlLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZQogKiB0aW55IGRpZmZlcmVuY2VzLiBGaXJzdCwgdGhlIGxwT2Zmc2NyZWVuIGZsYWcgdGhhdCBpcyByZXBvcnRlZCBiYWNrLAogKiB0aGVuIHRoZXJlIGlzIHRoZSBob21vZ2VuZW91cyB2ZXJ0ZXggdGhhdCBpcyBnZW5lcmF0ZWQuIEFsc28gdGhlcmUncyBhIGxhY2sKICogb2YgRlZGcywgYnV0IHN0aWxsIGEgY3VzdG9tIHN0cmlkZS4gTGFzdCwgdGhlIGQzZDEgLSBkM2QzIHZpZXdwb3J0IGhhcyBzb21lCiAqIHNldHRpbmdzIChzY2FsZSkgdGhhdCBkM2Q3IGFuZCB3aW5lZDNkIGRvIG5vdCBoYXZlLiBBbGwgaW4gYWxsIHdyYXBwaW5nIHRvCiAqIFByb2Nlc3NWZXJ0aWNlcyBkb2Vzbid0IHBheSBvZiBpbiB0ZXJtcyBvZiB3cmFwcGVyIGNvZGUgbmVlZGVkIGFuZCBjb2RlCiAqIHJldXNlZC4KICoKICogUGFyYW1zOgogKiAgZHdWZXJ0ZXhDb3VudDogVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyB0byBiZSB0cmFuc2Zvcm1lZAogKiAgbHBEYXRhOiBQb2ludGVyIHRvIHRoZSB2ZXJ0ZXggZGF0YQogKiAgZHdGbGFnczogRDNEVFJBTlNGT1JNX0NMSVBQRUQgb3IgRDNEVFJBTlNGT1JNX1VOQ0xJUFBFRAogKiAgbHBPZmZTY3JlZW46IFNldCB0byB0aGUgY2xpcHBpbmcgcGxhbmUgY2xpcHBpbmcgdGhlIHZlcnRleCwgaWYgb25seSBvbmUKICogICAgICAgICAgICAgICB2ZXJ0ZXggaXMgdHJhbnNmb3JtZWQgYW5kIGNsaXBwaW5nIGlzIG9uLiAwIG90aGVyd2lzZQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIEQzREVSUl9WSUVXUE9SVEhBU05PREVWSUNFIGlmIHRoZSB2aWV3cG9ydCBpcyBub3QgYXNzaWduZWQgdG8gYSBkZXZpY2UKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgbm8gY2xpcHBpbmcgZmxhZyBpcyBzcGVjaWZpZWQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1RyYW5zZm9ybVZlcnRpY2VzKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNREFUQSAqbHBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpscE9mZlNjcmVlbikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIEQzRE1BVFJJWCB2aWV3X21hdCwgd29ybGRfbWF0LCBwcm9qX21hdCwgbWF0OwogICAgZmxvYXQgKmluOwogICAgZmxvYXQgKm91dDsKICAgIGZsb2F0IHgsIHksIHosIHc7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIEQzRFZJRVdQT1JUIHZwID0gVGhpcy0+dmlld3BvcnRzLnZwMTsKICAgIEQzREhWRVJURVggKm91dEg7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXAsJTA4eCwlcClcbiIsIFRoaXMsIGR3VmVydGV4Q291bnQsIGxwRGF0YSwgZHdGbGFncywgbHBPZmZTY3JlZW4pOwoKICAgIC8qIFRlc3RzIG9uIHdpbmRvd3Mgc2hvdyB0aGF0IFdpbmRvd3MgY3Jhc2hlcyB3aGVuIHRoaXMgb2NjdXJzLAogICAgICogc28gZG9uJ3QgcmV0dXJuIHRoZSAoaW50dWl0aXZlKSByZXR1cm4gdmFsdWUKICAgIGlmKCFUaGlzLT5hY3RpdmVfZGV2aWNlKQogICAgewogICAgICAgIFdBUk4oIk5vIGRldmljZSBhY3RpdmUsIHJldHVybmluZyBEM0RFUlJfVklFV1BPUlRIQVNOT0RFVklDRVxuIik7CiAgICAgICAgcmV0dXJuIEQzREVSUl9WSUVXUE9SVEhBU05PREVWSUNFOwogICAgfQogICAgICovCgogICAgaWYoIShkd0ZsYWdzICYgKEQzRFRSQU5TRk9STV9VTkNMSVBQRUQgfCBEM0RUUkFOU0ZPUk1fQ0xJUFBFRCkpKQogICAgewogICAgICAgIFdBUk4oIk5vIGNsaXBwaW5nIGZsYWcgcGFzc2VkLCByZXR1cm5pbmcgRERFUlJfSU5WQUxJRFBBUkFNU1xuIik7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0oVGhpcy0+YWN0aXZlX2RldmljZS0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURV9WSUVXLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFUUklYKikgJnZpZXdfbWF0KTsKCiAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0oVGhpcy0+YWN0aXZlX2RldmljZS0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURV9QUk9KRUNUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFUUklYKikgJnByb2pfbWF0KTsKCiAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0oVGhpcy0+YWN0aXZlX2RldmljZS0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVFNfV09STERNQVRSSVgoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdJTkVEM0RNQVRSSVgqKSAmd29ybGRfbWF0KTsKICAgIG11bHRpcGx5X21hdHJpeCgmbWF0LCZ2aWV3X21hdCwmd29ybGRfbWF0KTsKICAgIG11bHRpcGx5X21hdHJpeCgmbWF0LCZwcm9qX21hdCwmbWF0KTsKCiAgICBpbiA9IChmbG9hdCAqKSBscERhdGEtPmxwSW47CiAgICBvdXQgPSAoZmxvYXQgKikgbHBEYXRhLT5scE91dDsKICAgIG91dEggPSBscERhdGEtPmxwSE91dDsKICAgIGZvcihpID0gMDsgaSA8IGR3VmVydGV4Q291bnQ7IGkrKykKICAgIHsKICAgICAgICB4ID0gKGluWzBdICogbWF0Ll8xMSkgKyAoaW5bMV0gKiBtYXQuXzIxKSArIChpblsyXSAqIG1hdC5fMzEpICsgKDEuMCAqIG1hdC5fNDEpOwogICAgICAgIHkgPSAoaW5bMF0gKiBtYXQuXzEyKSArIChpblsxXSAqIG1hdC5fMjIpICsgKGluWzJdICogbWF0Ll8zMikgKyAoMS4wICogbWF0Ll80Mik7CiAgICAgICAgeiA9IChpblswXSAqIG1hdC5fMTMpICsgKGluWzFdICogbWF0Ll8yMykgKyAoaW5bMl0gKiBtYXQuXzMzKSArICgxLjAgKiBtYXQuXzQzKTsKICAgICAgICB3ID0gKGluWzBdICogbWF0Ll8xNCkgKyAoaW5bMV0gKiBtYXQuXzI0KSArIChpblsyXSAqIG1hdC5fMzQpICsgKDEuMCAqIG1hdC5fNDQpOwoKICAgICAgICBpZihkd0ZsYWdzICYgRDNEVFJBTlNGT1JNX0NMSVBQRUQpCiAgICAgICAgewogICAgICAgICAgICAvKiBJZiBjbGlwcGluZyBpcyBlbmFibGVkLCBXaW5kb3dzIGFzc3VtZXMgdGhhdCBvdXRIIGlzCiAgICAgICAgICAgICAqIGEgdmFsaWQgcG9pbnRlcgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3V0SFtpXS51MS5oeCA9IHg7IG91dEhbaV0udTIuaHkgPSB5OyBvdXRIW2ldLnUzLmh6ID0gejsKCiAgICAgICAgICAgIG91dEhbaV0uZHdGbGFncyA9IDA7CiAgICAgICAgICAgIGlmKHggKiB2cC5kdlNjYWxlWCA+ICgoZmxvYXQpIHZwLmR3V2lkdGggKiAwLjUpKQogICAgICAgICAgICAgICAgb3V0SFtpXS5kd0ZsYWdzIHw9IEQzRENMSVBfUklHSFQ7CiAgICAgICAgICAgIGlmKHggKiB2cC5kdlNjYWxlWCA8PSAtKChmbG9hdCkgdnAuZHdXaWR0aCkgKiAwLjUpCiAgICAgICAgICAgICAgICBvdXRIW2ldLmR3RmxhZ3MgfD0gRDNEQ0xJUF9MRUZUOwogICAgICAgICAgICBpZih5ICogdnAuZHZTY2FsZVkgPiAoKGZsb2F0KSB2cC5kd0hlaWdodCAqIDAuNSkpCiAgICAgICAgICAgICAgICBvdXRIW2ldLmR3RmxhZ3MgfD0gRDNEQ0xJUF9UT1A7CiAgICAgICAgICAgIGlmKHkgKiB2cC5kdlNjYWxlWSA8PSAtKChmbG9hdCkgdnAuZHdIZWlnaHQpICogMC41KQogICAgICAgICAgICAgICAgb3V0SFtpXS5kd0ZsYWdzIHw9IEQzRENMSVBfQk9UVE9NOwogICAgICAgICAgICBpZih6IDwgMC4wKQogICAgICAgICAgICAgICAgb3V0SFtpXS5kd0ZsYWdzIHw9IEQzRENMSVBfRlJPTlQ7CiAgICAgICAgICAgIGlmKHogPiAxLjApCiAgICAgICAgICAgICAgICBvdXRIW2ldLmR3RmxhZ3MgfD0gRDNEQ0xJUF9CQUNLOwoKICAgICAgICAgICAgaWYob3V0SFtpXS5kd0ZsYWdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBMb29rcyBsaWtlIG5hdGl2ZSBqdXN0IGRyb3BzIHRoZSB2ZXJ0ZXgsIGxlYXZlcyB3aGF0ZXZlciBkYXRhCiAgICAgICAgICAgICAgICAgKiBpdCBoYXMgaW4gdGhlIG91dHB1dCBidWZmZXIgYW5kIGdvZXMgb24gd2l0aCB0aGUgbmV4dCB2ZXJ0ZXguCiAgICAgICAgICAgICAgICAgKiBUaGUgZXhhY3Qgc2NoZW1lIGhhc24ndCBiZWVuIGZpZ3VyZWQgb3V0IHlldCwgYnV0IHdpbmRvd3MKICAgICAgICAgICAgICAgICAqIGRlZmluaXRlbHkgd3JpdGVzIHNvbWV0aGluZyB0aGVyZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgb3V0WzBdID0geDsKICAgICAgICAgICAgICAgIG91dFsxXSA9IHk7CiAgICAgICAgICAgICAgICBvdXRbMl0gPSB6OwogICAgICAgICAgICAgICAgb3V0WzNdID0gdzsKICAgICAgICAgICAgICAgIGluID0gKGZsb2F0ICopICgoY2hhciAqKSBpbiArIGxwRGF0YS0+ZHdJblNpemUpOwogICAgICAgICAgICAgICAgb3V0ID0gKGZsb2F0ICopICgoY2hhciAqKSBvdXQgKyBscERhdGEtPmR3T3V0U2l6ZSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdyA9IDEgLyB3OwogICAgICAgIHggKj0gdzsgeSAqPSB3OyB6ICo9IHc7CgogICAgICAgIG91dFswXSA9IHZwLmR3V2lkdGggLyAyICsgdnAuZHdYICsgeCAqIHZwLmR2U2NhbGVYOwogICAgICAgIG91dFsxXSA9IHZwLmR3SGVpZ2h0IC8gMiArIHZwLmR3WSAtIHkgKiB2cC5kdlNjYWxlWTsKICAgICAgICBvdXRbMl0gPSB6OwogICAgICAgIG91dFszXSA9IHc7CiAgICAgICAgaW4gPSAoZmxvYXQgKikgKChjaGFyICopIGluICsgbHBEYXRhLT5kd0luU2l6ZSk7CiAgICAgICAgb3V0ID0gKGZsb2F0ICopICgoY2hhciAqKSBvdXQgKyBscERhdGEtPmR3T3V0U2l6ZSk7CiAgICB9CgogICAgLyogQWNjb3JkaW5nIHRvIHRoZSBkM2QgdGVzdCwgdGhlIG9mZnNjcmVlbiBmbGFnIGlzIHNldCBvbmx5CiAgICAgKiBpZiBleGFjdGx5IG9uZSB2ZXJ0ZXggaXMgdHJhbnNmb3JtZWQuIEl0cyBub3QgZG9jdW1lbnRlZCwKICAgICAqIGJ1dCB0aGUgdGVzdCBzaG93cyB0aGF0IHRoZSBscE9mZnNjcmVlbiBmbGFnIGlzIHNldCB0byB0aGUKICAgICAqIGZsYWcgY29tYmluYXRpb24gb2YgY2xpcHBpbmcgcGxhbmVzIHRoYXQgY2xpcHMgdGhlIHZlcnRleC4KICAgICAqCiAgICAgKiBJZiBjbGlwcGluZyBpcyByZXF1ZXN0ZWQsIFdpbmRvd3MgYXNzdW1lcyB0aGF0IHRoZSBvZmZzY3JlZW4KICAgICAqIHBhcmFtIGlzIGEgdmFsaWQgcG9pbnRlci4KICAgICAqLwogICAgaWYoZHdWZXJ0ZXhDb3VudCA9PSAxICYmIGR3RmxhZ3MgJiBEM0RUUkFOU0ZPUk1fQ0xJUFBFRCkKICAgIHsKICAgICAgICAqbHBPZmZTY3JlZW4gPSBvdXRIWzBdLmR3RmxhZ3M7CiAgICB9CiAgICBlbHNlIGlmKCpscE9mZlNjcmVlbikKICAgIHsKICAgICAgICAqbHBPZmZTY3JlZW4gPSAwOwogICAgfQogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKCiAgICBUUkFDRSgiQWxsIGRvbmVcbiIpOwogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpMaWdodEVsZW1lbnRzCiAqCiAqIFRoZSBEaXJlY3RYIDUuMCBzZGsgc2F5cyB0aGF0IGl0J3Mgbm90IGltcGxlbWVudGVkCiAqCiAqIFBhcmFtczoKICogID8KICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVECiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9MaWdodEVsZW1lbnRzKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RWxlbWVudENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRExJR0hUREFUQSBscERhdGEpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApOiBVbmltcGxlbWVudGVkIVxuIiwgVGhpcywgZHdFbGVtZW50Q291bnQsIGxwRGF0YSk7CiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OlNldEJhY2tncm91bmQKICoKICogU2V0cyB0amUgYmFja2dyb3VuZCBtYXRlcmlhbAogKgogKiBQYXJhbXM6CiAqICBoTWF0OiBIYW5kbGUgZnJvbSBhIElEaXJlY3QzRE1hdGVyaWFsIGludGVyZmFjZQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldEJhY2tncm91bmQoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUxIQU5ETEUgaE1hdCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJWQpXG4iLCBUaGlzLCBoTWF0KTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYoaE1hdCAmJiBoTWF0ID4gVGhpcy0+ZGRyYXctPmQzZGRldmljZS0+bnVtSGFuZGxlcykKICAgIHsKICAgICAgICBXQVJOKCJTcGVjaWZpZWQgSGFuZGxlICVkIG91dCBvZiByYW5nZVxuIiwgaE1hdCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KICAgIGVsc2UgaWYoaE1hdCAmJiBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW2hNYXQgLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX01hdGVyaWFsKQogICAgewogICAgICAgIFdBUk4oIkhhbmRsZSAlZCBpcyBub3QgYSBtYXRlcmlhbCBoYW5kbGVcbiIsIGhNYXQpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgaWYoaE1hdCkKICAgIHsKICAgICAgICBUaGlzLT5iYWNrZ3JvdW5kID0gKElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqKSBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW2hNYXQgLSAxXS5wdHI7CiAgICAgICAgVFJBQ0UoIiBzZXR0aW5nIGJhY2tncm91bmQgY29sb3IgOiAlZiAlZiAlZiAlZlxuIiwKICAgICAgICAgICAgICBUaGlzLT5iYWNrZ3JvdW5kLT5tYXQudS5kaWZmdXNlLnUxLnIsCiAgICAgICAgICAgICAgVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51Mi5nLAogICAgICAgICAgICAgIFRoaXMtPmJhY2tncm91bmQtPm1hdC51LmRpZmZ1c2UudTMuYiwKICAgICAgICAgICAgICBUaGlzLT5iYWNrZ3JvdW5kLT5tYXQudS5kaWZmdXNlLnU0LmEpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFRoaXMtPmJhY2tncm91bmQgPSBOVUxMOwogICAgICAgIFRSQUNFKCJTZXR0aW5nIGJhY2tncm91bmQgdG8gTlVMTFxuIik7CiAgICB9CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldEJhY2tncm91bmQKICoKICogUmV0dXJucyB0aGUgbWF0ZXJpYWwgaGFuZGxlIGFzc2lnbmVkIHRvIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSB2aWV3cG9ydAogKgogKiBQYXJhbXM6CiAqICBscGhNYXQ6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGhhbmRsZQogKiAgbHBWYWxpZDogaXMgc2V0IHRvIEZBTFNFIGlmIG5vIGJhY2tncm91bmQgaXMgc2V0LCBUUlVFIGlmIG9uZSBpcyBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0QmFja2dyb3VuZChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRFUklBTEhBTkRMRSAqbHBoTWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpscFZhbGlkKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIGxwaE1hdCwgbHBWYWxpZCk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGlmKGxwVmFsaWQpCiAgICB7CiAgICAgICAgKmxwVmFsaWQgPSBUaGlzLT5iYWNrZ3JvdW5kICE9IE5VTEw7CiAgICB9CiAgICBpZihscGhNYXQpCiAgICB7CiAgICAgICAgaWYoVGhpcy0+YmFja2dyb3VuZCkKICAgICAgICB7CiAgICAgICAgICAgICpscGhNYXQgPSBUaGlzLT5iYWNrZ3JvdW5kLT5IYW5kbGU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICpscGhNYXQgPSAwOwogICAgICAgIH0KICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6U2V0QmFja2dyb3VuZERlcHRoCiAqCiAqIFNldHMgYSBzdXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgYmFja2dyb3VuZCBkZXB0aC4gSXQncyBjb250ZW50cyBhcmUKICogdXNlZCB0byBzZXQgdGhlIGRlcHRoIGJ1ZmZlciBpbiBJRGlyZWN0M0RWaWV3cG9ydDM6OkNsZWFyCiAqCiAqIFBhcmFtczoKICogIGxwRERTdXJmYWNlOiBTdXJmYWNlIHRvIHNldAogKgogKiBSZXR1cm5zOiBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldEJhY2tncm91bmREZXB0aChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqbHBERFN1cmZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwRERTdXJmYWNlKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldEJhY2tncm91bmREZXB0aAogKgogKiBSZXR1cm5zIHRoZSBzdXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZGVwdGggZmllbGQKICoKICogUGFyYW1zOgogKiAgbHBscEREU3VyZmFjZTogQWRkcmVzcyB0byBzdG9yZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKICogIGxwVmFsaWQ6IFNldCB0byBUUlVFIGlmIGEgZGVwdGggaXMgYXNzaWduZWQsIEZBTFNFIG90aGVyd2lzZQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCiAqICAoRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBERFN1cmZhY2Ugb2YgVmFsaWQgaXMgTlVMTCkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldEJhY2tncm91bmREZXB0aChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqKmxwbHBERFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBCT09MIGxwVmFsaWQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVwLCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwbHBERFN1cmZhY2UsIGxwVmFsaWQpOwogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpDbGVhcgogKgogKiBDbGVhcnMgdGhlIHJlbmRlciB0YXJnZXQgYW5kIC8gb3IgdGhlIHogYnVmZmVyCiAqCiAqIFBhcmFtczoKICogIGR3Q291bnQ6IFRoZSBhbW91bnQgb2YgcmVjdGFuZ2xlcyB0byBjbGVhci4gSWYgMCwgdGhlIHdob2xlIGJ1ZmZlciBpcwogKiAgICAgICAgICAgY2xlYXJlZAogKiAgbHBSZWN0czogUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgcmVjdGFuZ2xlcy4gSWYgTlVMTCwgQ291bnQgbXVzdCBiZSAwCiAqICBkd0ZsYWdzOiBEM0RDTEVBUl9aQlVGRkVSIGFuZCAvIG9yIEQzRENMRUFSX1RBUkdFVAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIEQzREVSUl9WSUVXUE9SVEhBU05PREVWSUNFIGlmIHRoZXJlJ3Mgbm8gYWN0aXZlIGRldmljZQogKiAgVGhlIHJldHVybiB2YWx1ZSBvZiBJRGlyZWN0M0REZXZpY2U3OjpDbGVhcgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfQ2xlYXIoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3Q291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUkVDVCAqbHBSZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBEV09SRCBjb2xvciA9IDB4MDAwMDAwMDA7CiAgICBIUkVTVUxUIGhyOwogICAgTFBESVJFQ1QzRFZJRVdQT1JUMyBjdXJyZW50X3ZpZXdwb3J0OwoKICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4eCwlcCwlMDh4KVxuIiwgVGhpcywgaWZhY2UsIGR3Q291bnQsIGxwUmVjdHMsIGR3RmxhZ3MpOwogICAgaWYgKFRoaXMtPmFjdGl2ZV9kZXZpY2UgPT0gTlVMTCkgewogICAgICAgIEVSUigiIFRyeWluZyB0byBjbGVhciBhIHZpZXdwb3J0IG5vdCBhdHRhY2hlZCB0byBhIGRldmljZSAhXG4iKTsKCXJldHVybiBEM0RFUlJfVklFV1BPUlRIQVNOT0RFVklDRTsKICAgIH0KCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYgKGR3RmxhZ3MgJiBEM0RDTEVBUl9UQVJHRVQpIHsKICAgICAgICBpZiAoVGhpcy0+YmFja2dyb3VuZCA9PSBOVUxMKSB7CgkgICAgRVJSKCIgVHJ5aW5nIHRvIGNsZWFyIHRoZSBjb2xvciBidWZmZXIgd2l0aG91dCBiYWNrZ3JvdW5kIG1hdGVyaWFsICFcbiIpOwoJfSBlbHNlIHsKCSAgICBjb2xvciA9IAoJICAgICAgKChpbnQpICgoVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51MS5yKSAqIDI1NSkgPDwgMTYpIHwKCSAgICAgICgoaW50KSAoKFRoaXMtPmJhY2tncm91bmQtPm1hdC51LmRpZmZ1c2UudTIuZykgKiAyNTUpIDw8ICA4KSB8CgkgICAgICAoKGludCkgKChUaGlzLT5iYWNrZ3JvdW5kLT5tYXQudS5kaWZmdXNlLnUzLmIpICogMjU1KSA8PCAgMCkgfAoJICAgICAgKChpbnQpICgoVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51NC5hKSAqIDI1NSkgPDwgMjQpOwoJfQogICAgfQoKICAgIC8qIE5lZWQgdG8gdGVtcG9yYXJpbHkgYWN0aXZhdGUgdmlld3BvcnQgdG8gY2xlYXIgaXQuIFByZXZpb3VzbHkgYWN0aXZlIG9uZSB3aWxsIGJlIHJlc3RvcmVkCiAgICAgICAgYWZ0ZXJ3YXJkcy4gKi8KICAgIFRoaXMtPmFjdGl2YXRlKFRoaXMsIFRSVUUpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlN19DbGVhcihJQ09NX0lOVEVSRkFDRShUaGlzLT5hY3RpdmVfZGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwUmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyAmIChEM0RDTEVBUl9aQlVGRkVSIHwgRDNEQ0xFQVJfVEFSR0VUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCk7CgogICAgSURpcmVjdDNERGV2aWNlM19HZXRDdXJyZW50Vmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+YWN0aXZlX2RldmljZSwgSURpcmVjdDNERGV2aWNlMyksICZjdXJyZW50X3ZpZXdwb3J0KTsKICAgIGlmKGN1cnJlbnRfdmlld3BvcnQpIHsKICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZwID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGN1cnJlbnRfdmlld3BvcnQpOwogICAgICAgIHZwLT5hY3RpdmF0ZSh2cCwgVFJVRSk7CiAgICAgICAgSURpcmVjdDNEVmlld3BvcnQzX1JlbGVhc2UoY3VycmVudF92aWV3cG9ydCk7CiAgICB9CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6QWRkTGlnaHQKICoKICogQWRkcyBhbiBsaWdodCB0byB0aGUgdmlld3BvcnQKICoKICogUGFyYW1zOgogKiAgbHBEaXJlY3QzRExpZ2h0OiBJbnRlcmZhY2Ugb2YgdGhlIGxpZ2h0IHRvIGFkZAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGlyZWN0M0RMaWdodCBpcyBOVUxMCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZXJlIGFyZSA4IGxpZ2h0cyBvciBtb3JlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRMaWdodChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETGlnaHQgKmxwRGlyZWN0M0RMaWdodCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRExpZ2h0SW1wbCAqbHBEaXJlY3QzRExpZ2h0SW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzRExpZ2h0SW1wbCwgSURpcmVjdDNETGlnaHQsIGxwRGlyZWN0M0RMaWdodCk7CiAgICBEV09SRCBpID0gMDsKICAgIERXT1JEIG1hcCA9IFRoaXMtPm1hcF9saWdodHM7CiAgICAKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscERpcmVjdDNETGlnaHQpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBpZiAoVGhpcy0+bnVtX2xpZ2h0cyA+PSA4KQogICAgewogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgLyogRmluZCBhIGxpZ2h0IG51bWJlciBhbmQgdXBkYXRlIGJvdGggbGlnaHQgYW5kIHZpZXdwb3J0cyBvYmplY3RzIGFjY29yZGluZ2x5ICovCiAgICB3aGlsZShtYXAmMSkgewogICAgICAgIG1hcD4+PTE7CglpKys7CiAgICB9CiAgICBscERpcmVjdDNETGlnaHRJbXBsLT5kd0xpZ2h0SW5kZXggPSBpOwogICAgVGhpcy0+bnVtX2xpZ2h0cysrOwogICAgVGhpcy0+bWFwX2xpZ2h0cyB8PSAxPDxpOwoKICAgIC8qIEFkZCB0aGUgbGlnaHQgaW4gdGhlICdsaW5rZWQnIGNoYWluICovCiAgICBscERpcmVjdDNETGlnaHRJbXBsLT5uZXh0ID0gVGhpcy0+bGlnaHRzOwogICAgVGhpcy0+bGlnaHRzID0gbHBEaXJlY3QzRExpZ2h0SW1wbDsKCiAgICAvKiBBdHRhY2ggdGhlIGxpZ2h0IHRvIHRoZSB2aWV3cG9ydCAqLwogICAgbHBEaXJlY3QzRExpZ2h0SW1wbC0+YWN0aXZlX3ZpZXdwb3J0ID0gVGhpczsKICAgIAogICAgLyogSWYgYWN0aXZlLCBhY3RpdmF0ZSB0aGUgbGlnaHQgKi8KICAgIGlmIChUaGlzLT5hY3RpdmVfZGV2aWNlICE9IE5VTEwpIHsKICAgICAgICBscERpcmVjdDNETGlnaHRJbXBsLT5hY3RpdmF0ZShscERpcmVjdDNETGlnaHRJbXBsKTsKICAgIH0KCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6RGVsZXRlTGlnaHQKICoKICogRGVsZXRlcyBhIGxpZ2h0IGZyb20gdGhlIHZpZXdwb3J0cycgbGlnaHQgbGlzdAogKgogKiBQYXJhbXM6CiAqICBscERpcmVjdDNETGlnaHQ6IExpZ2h0IHRvIGRlbGV0ZQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgdGhlIGxpZ2h0IHdhc24ndCBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfRGVsZXRlTGlnaHQoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICpscERpcmVjdDNETGlnaHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBJRGlyZWN0M0RMaWdodEltcGwgKmxwRGlyZWN0M0RMaWdodEltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBscERpcmVjdDNETGlnaHQpOwogICAgSURpcmVjdDNETGlnaHRJbXBsICpjdXJfbGlnaHQsICpwcmV2X2xpZ2h0ID0gTlVMTDsKICAgIAogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwRGlyZWN0M0RMaWdodCk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGN1cl9saWdodCA9IFRoaXMtPmxpZ2h0czsKICAgIHdoaWxlIChjdXJfbGlnaHQgIT0gTlVMTCkgewogICAgICAgIGlmIChjdXJfbGlnaHQgPT0gbHBEaXJlY3QzRExpZ2h0SW1wbCkgewoJICAgIGxwRGlyZWN0M0RMaWdodEltcGwtPmRlc2FjdGl2YXRlKGxwRGlyZWN0M0RMaWdodEltcGwpOwoJICAgIGlmIChwcmV2X2xpZ2h0ID09IE5VTEwpIFRoaXMtPmxpZ2h0cyA9IGN1cl9saWdodC0+bmV4dDsKCSAgICBlbHNlIHByZXZfbGlnaHQtPm5leHQgPSBjdXJfbGlnaHQtPm5leHQ7CgkgICAgLyogRGV0YWNoIHRoZSBsaWdodCB0byB0aGUgdmlld3BvcnQgKi8KCSAgICBjdXJfbGlnaHQtPmFjdGl2ZV92aWV3cG9ydCA9IE5VTEw7CgkgICAgVGhpcy0+bnVtX2xpZ2h0cy0tOwoJICAgIFRoaXMtPm1hcF9saWdodHMgJj0gfigxPDxscERpcmVjdDNETGlnaHRJbXBsLT5kd0xpZ2h0SW5kZXgpOwogICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgICAgICByZXR1cm4gRDNEX09LOwoJfQoJcHJldl9saWdodCA9IGN1cl9saWdodDsKCWN1cl9saWdodCA9IGN1cl9saWdodC0+bmV4dDsKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDo6TmV4dExpZ2h0CiAqCiAqIEVudW1lcmF0ZXMgdGhlIGxpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXdwb3J0CiAqCiAqIFBhcmFtczoKICogIGxwRGlyZWN0M0RMaWdodDogTGlnaHQgdG8gc3RhcnQgd2l0aAogKiAgbHBscERpcmVjdDNETGlnaHQ6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIHN1Y2Nlc3NvciB0bwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9OZXh0TGlnaHQoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RMaWdodCAqbHBEaXJlY3QzRExpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqbHBscERpcmVjdDNETGlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIEZJWE1FKCIoJXApLT4oJXAsJXAsJTA4eCk6IHN0dWIhXG4iLCBUaGlzLCBscERpcmVjdDNETGlnaHQsIGxwbHBEaXJlY3QzRExpZ2h0LCBkd0ZsYWdzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDIgTWV0aG9kcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6R2V0Vmlld3BvcnQyCiAqCiAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZXQgdmlld3BvcnQgaW4gYSBEM0RWSUVXUE9SVDIgc3RydWN0dXJlLgogKiBTaW1pbGFyIHRvIElEaXJlY3QzRFZpZXdwb3J0Mzo6R2V0Vmlld3BvcnQKICoKICogUGFyYW1zOgogKiAgbHBEYXRhOiBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdG8gZmlsbAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgdGhlIHZpZXdwb3J0IHdhcyBzZXQgd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDM6OlNldFZpZXdwb3J0CiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERhdGEgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0Vmlld3BvcnQyKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQyICpscERhdGEpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBEV09SRCBkd1NpemU7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBEYXRhKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYgKFRoaXMtPnVzZV92cDIgIT0gMSkgewogICAgICAgIEVSUigiICBSZXF1ZXN0aW5nIHRvIGdldCBhIEQzRFZJRVdQT1JUMiBzdHJ1Y3Qgd2hlcmUgYSBEM0RWSUVXUE9SVCB3YXMgc2V0ICFcbiIpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CiAgICBkd1NpemUgPSBscERhdGEtPmR3U2l6ZTsKICAgIG1lbXNldChscERhdGEsIDAsIGR3U2l6ZSk7CiAgICBtZW1jcHkobHBEYXRhLCAmKFRoaXMtPnZpZXdwb3J0cy52cDIpLCBkd1NpemUpOwoKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIFRSQUNFKCIgIHJldHVybmluZyBEM0RWSUVXUE9SVDIgOlxuIik7CglfZHVtcF9EM0RWSUVXUE9SVDIobHBEYXRhKTsKICAgIH0KCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6U2V0Vmlld3BvcnQyCiAqCiAqIFNldHMgdGhlIHZpZXdwb3J0IGZyb20gYSBEM0RWSUVXUE9SVDIgc3RydWN0dXJlCiAqCiAqIFBhcmFtczoKICogIGxwRGF0YTogVmlld3BvcnQgdG8gc2V0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0Vmlld3BvcnQyKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQyICpscERhdGEpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBMUERJUkVDVDNEVklFV1BPUlQzIGN1cnJlbnRfdmlld3BvcnQ7CiAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRGF0YSk7CgogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIiAgZ2V0dGluZyBEM0RWSUVXUE9SVDIgOlxuIik7CglfZHVtcF9EM0RWSUVXUE9SVDIobHBEYXRhKTsKICAgIH0KCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgVGhpcy0+dXNlX3ZwMiA9IDE7CiAgICBtZW1zZXQoJihUaGlzLT52aWV3cG9ydHMudnAyKSwgMCwgc2l6ZW9mKFRoaXMtPnZpZXdwb3J0cy52cDIpKTsKICAgIG1lbWNweSgmKFRoaXMtPnZpZXdwb3J0cy52cDIpLCBscERhdGEsIGxwRGF0YS0+ZHdTaXplKTsKCiAgICBpZiAoVGhpcy0+YWN0aXZlX2RldmljZSkgewogICAgICAgIElEaXJlY3QzRERldmljZTNfR2V0Q3VycmVudFZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIElEaXJlY3QzRERldmljZTMpLCAmY3VycmVudF92aWV3cG9ydCk7CiAgICAgICAgaWYgKGN1cnJlbnRfdmlld3BvcnQpIHsKICAgICAgICAgICAgaWYgKElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBjdXJyZW50X3ZpZXdwb3J0KSA9PSBUaGlzKQogICAgICAgICAgICAgICAgVGhpcy0+YWN0aXZhdGUoVGhpcywgRkFMU0UpOwogICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDNfUmVsZWFzZShjdXJyZW50X3ZpZXdwb3J0KTsKICAgICAgICB9CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDMgTWV0aG9kcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6U2V0QmFja2dyb3VuZERlcHRoMgogKgogKiBTZXRzIGEgSURpcmVjdERyYXdTdXJmYWNlNCBzdXJmYWNlIGFzIHRoZSBiYWNrZ3JvdW5kIGRlcHRoIHN1cmZhY2UKICoKICogUGFyYW1zOgogKiAgbHBERFM6IFN1cmZhY2UgdG8gc2V0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBzdHViCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRCYWNrZ3JvdW5kRGVwdGgyKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTQgKmxwRERTKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgRklYTUUoIiglcCktPiglcCk6IHN0dWIhXG4iLCBUaGlzLCBscEREUyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpHZXRCYWNrZ3JvdW5kRGVwdGgyCiAqCiAqIFJldHVybnMgdGhlIElEaXJlY3QzRFN1cmZhY2U0IGludGVyZmFjZSB0byB0aGUgYmFja2dyb3VuZCBkZXB0aCBzdXJmYWNlCiAqCiAqIFBhcmFtczoKICogIGxwbHBERFM6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CiAqICBscFZhbGlkOiBTZXQgdG8gdHJ1ZSBpZiBhIHN1cmZhY2UgaXMgYXNzaWduZWQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBiZWNhdXNlIGl0J3MgYSBzdHViCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRCYWNrZ3JvdW5kRGVwdGgyKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTQgKipscGxwRERTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpscFZhbGlkKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgRklYTUUoIiglcC8lcCktPiglcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBscEREUywgbHBWYWxpZCk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpDbGVhcjIKICoKICogQW5vdGhlciBjbGVhcmluZyBtZXRob2QKICoKICogUGFyYW1zOgogKiAgQ291bnQ6IE51bWJlciBvZiByZWN0YW5nbGVzIHRvIGNsZWFyCiAqICBSZWN0czogUmVjdGFuZ2xlIGFycmF5IHRvIGNsZWFyCiAqICBGbGFnczogU29tZSBmbGFncyA6KQogKiAgQ29sb3I6IENvbG9yIHRvIGZpbGwgdGhlIHJlbmRlciB0YXJnZXQgd2l0aAogKiAgWjogVmFsdWUgdG8gZmlsbCB0aGUgZGVwdGggYnVmZmVyIHdpdGgKICogIFN0ZW5jaWw6IFZhbHVlIHRvIGZpbGwgdGhlIHN0ZW5jaWwgYml0cyB3aXRoCiAqCiAqIFJldHVybnM6CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9DbGVhcjIoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEUkVDVCBscFJlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSBkdlosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTdGVuY2lsKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIExQRElSRUNUM0RWSUVXUE9SVDMgY3VycmVudF92aWV3cG9ydDsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCwlMDh4LCUwOHgsJWYsJTA4eClcbiIsIFRoaXMsIGR3Q291bnQsIGxwUmVjdHMsIGR3RmxhZ3MsIGR3Q29sb3IsIGR2WiwgZHdTdGVuY2lsKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYgKFRoaXMtPmFjdGl2ZV9kZXZpY2UgPT0gTlVMTCkgewogICAgICAgIEVSUigiIFRyeWluZyB0byBjbGVhciBhIHZpZXdwb3J0IG5vdCBhdHRhY2hlZCB0byBhIGRldmljZSAhXG4iKTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBEM0RFUlJfVklFV1BPUlRIQVNOT0RFVklDRTsKICAgIH0KICAgIC8qIE5lZWQgdG8gdGVtcG9yYXJpbHkgYWN0aXZhdGUgdmlld3BvcnQgdG8gY2xlYXIgaXQuIFByZXZpb3VzbHkgYWN0aXZlIG9uZSB3aWxsIGJlIHJlc3RvcmVkCiAgICAgICAgYWZ0ZXJ3YXJkcy4gKi8KICAgIFRoaXMtPmFjdGl2YXRlKFRoaXMsIFRSVUUpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlN19DbGVhcihJQ09NX0lOVEVSRkFDRShUaGlzLT5hY3RpdmVfZGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwUmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2WiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0ZW5jaWwpOwogICAgSURpcmVjdDNERGV2aWNlM19HZXRDdXJyZW50Vmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+YWN0aXZlX2RldmljZSwgSURpcmVjdDNERGV2aWNlMyksICZjdXJyZW50X3ZpZXdwb3J0KTsKICAgIGlmKGN1cnJlbnRfdmlld3BvcnQpIHsKICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZwID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGN1cnJlbnRfdmlld3BvcnQpOwogICAgICAgIHZwLT5hY3RpdmF0ZSh2cCwgVFJVRSk7CiAgICAgICAgSURpcmVjdDNEVmlld3BvcnQzX1JlbGVhc2UoY3VycmVudF92aWV3cG9ydCk7CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhlIFZUYWJsZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpjb25zdCBJRGlyZWN0M0RWaWV3cG9ydDNWdGJsIElEaXJlY3QzRFZpZXdwb3J0M19WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRSZWYsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNEVmlld3BvcnQgTWV0aG9kcyAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0luaXRpYWxpemUsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0Vmlld3BvcnQsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0Vmlld3BvcnQsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfVHJhbnNmb3JtVmVydGljZXMsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfTGlnaHRFbGVtZW50cywKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRCYWNrZ3JvdW5kLAogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldEJhY2tncm91bmQsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0QmFja2dyb3VuZERlcHRoLAogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldEJhY2tncm91bmREZXB0aCwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9DbGVhciwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRMaWdodCwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9EZWxldGVMaWdodCwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9OZXh0TGlnaHQsCiAgICAvKioqIElEaXJlY3QzRFZpZXdwb3J0MiBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRWaWV3cG9ydDIsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0Vmlld3BvcnQyLAogICAgLyoqKiBJRGlyZWN0M0RWaWV3cG9ydDMgTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0QmFja2dyb3VuZERlcHRoMiwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRCYWNrZ3JvdW5kRGVwdGgyLAogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0NsZWFyMiwKfTsK