LyogRGlyZWN0M0QgVGV4dHVyZQogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVMTUVSCiAqIENvcHlyaWdodCAoYykgMjAwNiBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgRGlyZWN0M0RUZXh0dXJlMi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gaW50ZXJmYWNlcy4gVGhleSBhcmUgdGh1bmtzIHRvIElEaXJlY3REcmF3U3VyZmFjZTcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfQWRkUmVmKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX1JlbGVhc2UoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Cn0KCgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFRleHR1cmUgaW50ZXJmYWNlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlMTo6SW5pdGlhbGl6ZQogKgogKiBUaGUgc2RrIHNheXMgaXQncyBub3QgaW1wbGVtZW50ZWQKICoKICogUGFyYW1zOgogKiAgPwogKgogKiBSZXR1cm5zCiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0luaXRpYWxpemUoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UgKkRpcmVjdDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlICpERFN1cmZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgRGlyZWN0M0REZXZpY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIEREU3VyZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSBOb3QgaW1wbGVtZW50ZWRcbiIsIFRoaXMsIGQzZCwgc3VyZik7CiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIFVuY2hlY2tlZCAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTI6OlBhbGV0dGVDaGFuZ2VkCiAqCiAqIEluZm9ybXMgdGhlIHRleHR1cmUgYWJvdXQgYSBwYWxldHRlIGNoYW5nZQogKgogKiBQYXJhbXM6CiAqICBTdGFydDogU3RhcnQgaW5kZXggb2YgdGhlIGNoYW5nZQogKiAgQ291bnQ6IFRoZSBudW1iZXIgb2YgY2hhbmdlZCBlbnRyaWVzCiAqCiAqIFJldHVybnMKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF9QYWxldHRlQ2hhbmdlZChJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCUwOHgsJTA4eCk6IHN0dWIhXG4iLCBUaGlzLCBTdGFydCwgQ291bnQpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUGFsZXR0ZUNoYW5nZWQoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlMDh4KSB0aHVua2luZyB0byBJRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGFydCwgQ291bnQpOwoKICAgIHJldHVybiBJRGlyZWN0M0RUZXh0dXJlMl9QYWxldHRlQ2hhbmdlZChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTo6VW5sb2FkCiAqCiAqIERYNSBTREs6ICJUaGUgSURpcmVjdDNEVGV4dHVyZTI6OlVubG9hZCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkCiAqCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1VubG9hZChJRGlyZWN0M0RUZXh0dXJlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpOiBub3QgaW1wbGVtZW50ZWQhXG4iLCBUaGlzKTsKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFRleHR1cmUyOjpHZXRIYW5kbGUKICoKICogUmV0dXJucyBoYW5kbGUgZm9yIHRoZSB0ZXh0dXJlLiBBdCB0aGUgbW9tZW50LCB0aGUgaW50ZXJmYWNlCiAqIHRvIHRoZSBJV2luZUQzRFRleHR1cmUgaXMgdXNlZC4KICoKICogUGFyYW1zOgogKiAgRGlyZWN0M0REZXZpY2UyOiBEZXZpY2UgdGhpcyBoYW5kbGUgaXMgYXNzaWduZWQgdG8KICogIEhhbmRsZTogQWRkcmVzcyB0byBzdG9yZSB0aGUgaGFuZGxlIGF0LgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFRleHR1cmVJbXBsX0dldEhhbmRsZShJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTIgKkRpcmVjdDNERGV2aWNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRUhBTkRMRSAqbHBIYW5kbGUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBEaXJlY3QzRERldmljZTIpOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBkM2QsIGxwSGFuZGxlKTsKCiAgICBpZighVGhpcy0+SGFuZGxlKQogICAgewogICAgICAgIFRoaXMtPkhhbmRsZSA9IElEaXJlY3QzRERldmljZUltcGxfQ3JlYXRlSGFuZGxlKGQzZCk7CiAgICAgICAgaWYoVGhpcy0+SGFuZGxlKQogICAgICAgIHsKICAgICAgICAgICAgZDNkLT5IYW5kbGVzW1RoaXMtPkhhbmRsZSAtIDFdLnB0ciA9IFRoaXM7CiAgICAgICAgICAgIGQzZC0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS50eXBlID0gRERyYXdIYW5kbGVfVGV4dHVyZTsKICAgICAgICB9CiAgICB9CiAgICAqbHBIYW5kbGUgPSBUaGlzLT5IYW5kbGU7CgogICAgVFJBQ0UoIiByZXR1cm5pbmcgaGFuZGxlICUwOHguXG4iLCAqbHBIYW5kbGUpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0dldEhhbmRsZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRERFVklDRSBscERpcmVjdDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFRFWFRVUkVIQU5ETEUgbHBIYW5kbGUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgbHBEaXJlY3QzRERldmljZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIFRoaXMsIGQzZCwgbHBIYW5kbGUpOwoKICAgIHJldHVybiBJRGlyZWN0M0RUZXh0dXJlMl9HZXRIYW5kbGUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVGV4dHVyZTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShkM2QsIElEaXJlY3QzRERldmljZTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEhhbmRsZSk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZ2V0X3N1Yl9taW1hcGxldmVsCiAqCiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgbWlwbWFwIGxldmVsCiAqCiAqIHRleF9wdHI6IFN1cmZhY2Ugb2Ygd2hpY2ggdG8gcmV0dXJuIHRoZSBuZXh0IGxldmVsCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKgpnZXRfc3ViX21pbWFwbGV2ZWwoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdGV4X3B0cikKewogICAgLyogTm93IGdvIGRvd24gdGhlIG1pcG1hcCBjaGFpbiB0byB0aGUgbmV4dCBzdXJmYWNlICovCiAgICBzdGF0aWMgRERTQ0FQUzIgbWlwbWFwX2NhcHMgPSB7IEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19URVhUVVJFLCAwLCAwLCAwIH07CiAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBuZXh0X2xldmVsOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZl9wdHI7CiAgICBIUkVTVUxUIGhyOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRBdHRhY2hlZFN1cmZhY2UoSUNPTV9JTlRFUkZBQ0UodGV4X3B0ciwgSURpcmVjdERyYXdTdXJmYWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXBtYXBfY2FwcywgJm5leHRfbGV2ZWwpOwogICAgaWYgKEZBSUxFRChocikpIHJldHVybiBOVUxMOwoKICAgIHN1cmZfcHRyID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgbmV4dF9sZXZlbCk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UobmV4dF9sZXZlbCk7CgogICAgcmV0dXJuIHN1cmZfcHRyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTI6OkxvYWQKICoKICogTG9hZHMgYSB0ZXh0dXJlIGNyZWF0ZWQgd2l0aCB0aGUgRERTQ0FQU19BTExPQ09OTE9BRAogKgogKiBUaGlzIGZ1bmN0aW9uIGlzbid0IHJlbGF5ZWQgdG8gV2luZUQzRCBiZWNhdXNlIHRoZSB3aG9sZSBpbnRlcmZhY2UgaXMKICogaW1wbGVtZW50ZWQgaW4gRERyYXcgb25seS4gRm9yIHNwZWVkIGltcHJvdmVtZW50cyBhIGltcGxlbWVudGF0aW9uIHdoaWNoCiAqIHRha2VzIE9wZW5HTCBtb3JlIGludG8gYWNjb3VudCBjb3VsZCBiZSBwbGFjZWQgaW50byBXaW5lRDNELgogKgogKiBQYXJhbXM6CiAqICBEM0RUZXh0dXJlMjogQWRkcmVzcyBvZiB0aGUgdGV4dHVyZSB0byBsb2FkCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFRleHR1cmVJbXBsX0xvYWQoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFRleHR1cmUyICpEM0RUZXh0dXJlMikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnNyY19wdHIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgRDNEVGV4dHVyZTIpOwogICAgSVdpbmVEM0RQYWxldHRlICp3aW5lX3BhbCwgKndpbmVfcGFsX3NyYzsKICAgIElEaXJlY3REcmF3UGFsZXR0ZSAqcGFsID0gTlVMTCwgKnBhbF9zcmMgPSBOVUxMOwogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqcGFsX2ltcGwsICpwYWxfaW1wbF9zcmM7CiAgICBIUkVTVUxUIHJldF92YWx1ZSA9IEQzRF9PSzsKCiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgc3JjX3B0cik7CgogICAgaWYgKCgoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApICE9IChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkpIHx8CiAgICAgICAgKHNyY19wdHItPnN1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50ICE9IFRoaXMtPnN1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50KSkKICAgIHsKICAgICAgICBFUlIoIlRyeWluZyB0byBsb2FkIHN1cmZhY2VzIHdpdGggZGlmZmVyZW50IG1pcC1tYXAgY291bnRzICFcbiIpOwogICAgfQoKICAgIHdoaWxlKDEpCiAgICB7CiAgICAgICAgRERTVVJGQUNFREVTQyAqc3JjX2QsICpkc3RfZDsKCiAgICAgICAgVFJBQ0UoIiBjb3B5aW5nIHN1cmZhY2UgJXAgdG8gc3VyZmFjZSAlcCAobWlwbWFwIGxldmVsICVkKVxuIiwgc3JjX3B0ciwgVGhpcywgc3JjX3B0ci0+bWlwbWFwX2xldmVsKTsKCiAgICAgICAgaWYgKCBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0FMTE9DT05MT0FEICkKICAgICAgICAgICAgLyogSWYgdGhlIHN1cmZhY2UgaXMgbm90IGFsbG9jYXRlZCBhbmQgaXRzIGxvY2F0aW9uIGlzIG5vdCB5ZXQgc3BlY2lmaWVkLAogICAgICAgICAgICAgIGZvcmNlIGl0IHRvIHZpZGVvIG1lbW9yeSAqLyAKICAgICAgICAgICAgaWYgKCAhKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX1NZU1RFTU1FTU9SWXxERFNDQVBTX1ZJREVPTUVNT1JZKSkgKQogICAgICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfVklERU9NRU1PUlk7CgogICAgICAgIC8qIFN1cHByZXNzIHRoZSBBTExPQ09OTE9BRCBmbGFnICovCiAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICY9IH5ERFNDQVBTX0FMTE9DT05MT0FEOwoKICAgICAgICAvKiBHZXQgdGhlIHBhbGV0dGVzICovCiAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0dldFBhbGV0dGUoVGhpcy0+V2luZUQzRFN1cmZhY2UsICZ3aW5lX3BhbCk7CiAgICAgICAgaWYoIHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgewogICAgICAgICAgICBFUlIoIklXaW5lRDNEU3VyZmFjZTo6R2V0UGFsZXR0ZSBmYWlsZWQhIFRoaXMgaXMgdW5leHBlY3RlZFxuIik7CiAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICB9CiAgICAgICAgaWYod2luZV9wYWwpCiAgICAgICAgewogICAgICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFBhbGV0dGVfR2V0UGFyZW50KHdpbmVfcGFsLCAoSVVua25vd24gKiopICZwYWwpOwogICAgICAgICAgICBpZihyZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIklXaW5lRDNEUGFsZXR0ZTo6R2V0UGFyZW50IGZhaWxlZCEgVGhpcyBpcyB1bmV4cGVjdGVkXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYWxfaW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgcGFsKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIHBhbF9pbXBsID0gTlVMTDsKICAgICAgICB9CgogICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEU3VyZmFjZV9HZXRQYWxldHRlKHNyY19wdHItPldpbmVEM0RTdXJmYWNlLCAmd2luZV9wYWxfc3JjKTsKICAgICAgICBpZiggcmV0X3ZhbHVlICE9IEQzRF9PSykKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiSVdpbmVEM0RTdXJmYWNlOjpHZXRQYWxldHRlIGZhaWxlZCEgVGhpcyBpcyB1bmV4cGVjdGVkXG4iKTsKICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgIH0KICAgICAgICBpZih3aW5lX3BhbF9zcmMpCiAgICAgICAgewogICAgICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFBhbGV0dGVfR2V0UGFyZW50KHdpbmVfcGFsX3NyYywgKElVbmtub3duICoqKSAmcGFsX3NyYyk7CiAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiSVdpbmVEM0RQYWxldHRlOjpHZXRQYXJlbnQgZmFpbGVkISBUaGlzIGlzIHVuZXhwZWN0ZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhbF9pbXBsX3NyYyA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgcGFsX3NyYyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBhbF9pbXBsX3NyYyA9IE5VTEw7CiAgICAgICAgfQoKICAgICAgICAvKiBBZnRlciBzZWVpbmcgc29tZSBsb2dzLCBub3Qgc3VyZSBhdCBhbGwgYWJvdXQgdGhpcy4uLiAqLwogICAgICAgIGlmIChwYWxfaW1wbCA9PSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1NldFBhbGV0dGUoVGhpcy0+V2luZUQzRFN1cmZhY2UsIHdpbmVfcGFsKTsKICAgICAgICAgICAgaWYgKHBhbF9pbXBsX3NyYyAhPSBOVUxMKSBJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKElDT01fSU5URVJGQUNFKHBhbF9pbXBsX3NyYywgSURpcmVjdERyYXdQYWxldHRlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwYWxfaW1wbF9zcmMgIT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUEFMRVRURUVOVFJZIHBhbGVudFsyNTZdOwogICAgICAgICAgICAgICAgSURpcmVjdERyYXdQYWxldHRlX0dldEVudHJpZXMoSUNPTV9JTlRFUkZBQ0UocGFsX2ltcGxfc3JjLCBJRGlyZWN0RHJhd1BhbGV0dGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMjU2LCBwYWxlbnQpOwogICAgICAgICAgICAgICAgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoSUNPTV9JTlRFUkZBQ0UocGFsX2ltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTYsIHBhbGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIENvcHkgb25lIHN1cmZhY2Ugb24gdGhlIG90aGVyICovCiAgICAgICAgZHN0X2QgPSAoRERTVVJGQUNFREVTQyAqKSYoVGhpcy0+c3VyZmFjZV9kZXNjKTsKICAgICAgICBzcmNfZCA9IChERFNVUkZBQ0VERVNDICopJihzcmNfcHRyLT5zdXJmYWNlX2Rlc2MpOwoKICAgICAgICBpZiAoKHNyY19kLT5kd1dpZHRoICE9IGRzdF9kLT5kd1dpZHRoKSB8fCAoc3JjX2QtPmR3SGVpZ2h0ICE9IGRzdF9kLT5kd0hlaWdodCkpCiAgICAgICAgewogICAgICAgICAgICAvKiBTaG91bGQgYWxzbyBjaGVjayBmb3Igc2FtZSBwaXhlbCBmb3JtYXQsIHUxLmxQaXRjaCwgLi4uICovCiAgICAgICAgICAgIEVSUigiRXJyb3IgaW4gc3VyZmFjZSBzaXplc1xuIik7CiAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgV0lORUQzRExPQ0tFRF9SRUNUIHBTcmNSZWN0LCBwRHN0UmVjdDsKCiAgICAgICAgICAgIC8qIExQRElSRUNUM0RERVZJQ0UyIGQzZGQgPSAoTFBESVJFQ1QzRERFVklDRTIpIFRoaXMtPkQzRGRldmljZTsgKi8KICAgICAgICAgICAgLyogSSBzaG91bGQgcHV0IGEgbWFjcm8gZm9yIHRoZSBjYWxjdWx1cyBvZiBicHAgKi8KCiAgICAgICAgICAgIC8qIENvcHkgYWxzbyB0aGUgQ29sb3JLZXlpbmcgc3R1ZmYgKi8KICAgICAgICAgICAgaWYgKHNyY19kLT5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHN0X2QtPmR3RmxhZ3MgfD0gRERTRF9DS1NSQ0JMVDsKICAgICAgICAgICAgICAgIGRzdF9kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUgPSBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlOwogICAgICAgICAgICAgICAgZHN0X2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUgPSBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ29weSB0aGUgbWFpbiBtZW1vcnkgdGV4dHVyZSBpbnRvIHRoZSBzdXJmYWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIE9wZW5HTAogICAgICAgICAgICAgIHRleHR1cmUgb2JqZWN0LiAqLwoKICAgICAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0xvY2tSZWN0KHNyY19wdHItPldpbmVEM0RTdXJmYWNlLCAmcFNyY1JlY3QsIE5VTEwsIDApOwogICAgICAgICAgICBpZihyZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIiAoJXApIExvY2tpbmcgdGhlIHNvdXJjZSBzdXJmYWNlIGZhaWxlZFxuIiwgVGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEU3VyZmFjZV9Mb2NrUmVjdChUaGlzLT5XaW5lRDNEU3VyZmFjZSwgJnBEc3RSZWN0LCBOVUxMLCAwKTsKICAgICAgICAgICAgaWYocmV0X3ZhbHVlICE9IEQzRF9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCIgKCVwKSBMb2NraW5nIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGZhaWxlZFxuIiwgVGhpcyk7CiAgICAgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChzcmNfcHRyLT5XaW5lRDNEU3VyZmFjZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykKICAgICAgICAgICAgICAgIG1lbWNweShwRHN0UmVjdC5wQml0cywgcFNyY1JlY3QucEJpdHMsIHNyY19wdHItPnN1cmZhY2VfZGVzYy51MS5kd0xpbmVhclNpemUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBtZW1jcHkocERzdFJlY3QucEJpdHMsIHBTcmNSZWN0LnBCaXRzLCBwU3JjUmVjdC5QaXRjaCAqIHNyY19kLT5kd0hlaWdodCk7CgogICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChzcmNfcHRyLT5XaW5lRDNEU3VyZmFjZSk7CiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KFRoaXMtPldpbmVEM0RTdXJmYWNlKTsKICAgICAgICB9CgogICAgICAgIGlmIChzcmNfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkKICAgICAgICB7CiAgICAgICAgICAgIHNyY19wdHIgPSBnZXRfc3ViX21pbWFwbGV2ZWwoc3JjX3B0cik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNyY19wdHIgPSBOVUxMOwogICAgICAgIH0KICAgICAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCiAgICAgICAgewogICAgICAgICAgICBUaGlzID0gZ2V0X3N1Yl9taW1hcGxldmVsKFRoaXMpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBUaGlzID0gTlVMTDsKICAgICAgICB9CgogICAgICAgIGlmICgoc3JjX3B0ciA9PSBOVUxMKSB8fCAoVGhpcyA9PSBOVUxMKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzcmNfcHRyICE9IFRoaXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiIExvYWRpbmcgc3VyZmFjZSB3aXRoIGRpZmZlcmVudCBtaXBtYXAgc3RydWN0dXJlICEhIVxuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXRfdmFsdWU7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0xvYWQoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RUZXh0dXJlICpEM0RUZXh0dXJlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUZXh0dXJlID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgRDNEVGV4dHVyZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUZXh0dXJlKTsKCiAgICByZXR1cm4gSURpcmVjdDNEVGV4dHVyZTJfTG9hZChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgRDNEVGV4dHVyZSkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhlIFZUYWJsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpjb25zdCBJRGlyZWN0M0RUZXh0dXJlMlZ0YmwgSURpcmVjdDNEVGV4dHVyZTJfVnRibCA9CnsKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfUXVlcnlJbnRlcmZhY2UsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfUmVsZWFzZSwKICAgIElEaXJlY3QzRFRleHR1cmVJbXBsX0dldEhhbmRsZSwKICAgIElEaXJlY3QzRFRleHR1cmVJbXBsX1BhbGV0dGVDaGFuZ2VkLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfTG9hZCwKfTsKCgpjb25zdCBJRGlyZWN0M0RUZXh0dXJlVnRibCBJRGlyZWN0M0RUZXh0dXJlMV9WdGJsID0KewogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9SZWxlYXNlLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Jbml0aWFsaXplLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9HZXRIYW5kbGUsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1BhbGV0dGVDaGFuZ2VkLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Mb2FkLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfMV9VbmxvYWQsCn07Cg==