LyoKICogRERFTUwgbGlicmFyeQogKgogKiBDb3B5cmlnaHQgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKICogQ29weXJpZ2h0IDE5OTcgTGVuIFdoaXRlCiAqIENvcHlyaWdodCAxOTk5IEtlaXRoIE1hdHRoZXdzCiAqLwoKLyogT25seSBlbXB0eSBzdHVicyBmb3Igbm93ICovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJkZGVtbC5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgInRjaGFyLmgiCiNpbmNsdWRlICJ3aW5udC5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkZW1sKQoKLyogSGFzIGRlZmluZWQgaW4gYXRvbS5jIGZpbGUuCiAqLwojZGVmaW5lIE1BWF9BVE9NX0xFTiAgICAgICAgICAgICAgMjU1CgovKiBNYXhpbXVtIGJ1ZmZlciBzaXplICggaW5jbHVkaW5nIHRoZSAnXDAnICkuCiAqLwojZGVmaW5lIE1BWF9CVUZGRVJfTEVOICAgICAgICAgICAgKE1BWF9BVE9NX0xFTiArIDEpCgovKiAgdHlwZWRlZiBzdHJ1Y3QgewoJRFdPUkQJCW5MZW5ndGg7CglMUFZPSUQJCWxwU2VjdXJpdHlEZXNjcmlwdG9yOwoJQk9PTAkJYkluaGVyaXRIYW5kbGU7Cn0JU0VDVVJJVFlfQVRUUklCVVRFUzsgKi8KCi8qIFRoaXMgaXMgYSBzaW1wbGUgbGlzdCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzdHJpbmdzIGNyZWF0ZWQKICogYnkgRGRlQ3JlYXRlU3RyaW5nSGFuZGxlLiAgVGhlIGxpc3QgaXMgdXNlZCB0byBmcmVlCiAqIHRoZSBzdHJpbmdzIHdoZW5ldmVyIERkZVVuaW5pdGlhbGl6ZSBpcyBjYWxsZWQuCiAqIFRoaXMgbWVjaGFuaXNtIGlzIG5vdCBjb21wbGV0ZSBhbmQgZG9lcyBub3QgaGFuZGxlIG11bHRpcGxlIGluc3RhbmNlcy4KICogTW9zdCBvZiB0aGUgRERFIEFQSSB1c2UgYSBEV09SRCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB3aGljaCBpbnN0YW5jZQogKiBvZiBhIGdpdmVuIHByb2dyYW0gaXMgY2FsbGluZyB0aGVtLiAgVGhlIEFQSSBhcmUgc3VwcG9zZWQgdG8KICogYXNzb2NpYXRlIHRoZSBkYXRhIHRvIHRoZSBpbnN0YW5jZSB0aGF0IGNyZWF0ZWQgaXQuCiAqLwp0eXBlZGVmIHN0cnVjdCB0YWdIU1pOb2RlIEhTWk5vZGU7CnN0cnVjdCB0YWdIU1pOb2RlCnsKICAgIEhTWk5vZGUqIG5leHQ7CiAgICBIU1ogaHN6Owp9OwoKCnR5cGVkZWYgc3RydWN0IHRhZ1NlcnZpY2VOb2RlIFNlcnZpY2VOb2RlOwpzdHJ1Y3QgdGFnU2VydmljZU5vZGUKewogICAgU2VydmljZU5vZGUqIG5leHQ7CiAgICBIU1ogaHN6OwogICAgQk9PTDE2CQlGaWx0ZXJPbjsKfTsKdHlwZWRlZiBzdHJ1Y3QgRERFX0hBTkRMRV9FTlRSWSB7CiAgICBCT09MMTYgICAgICAgICAgICAgIE1vbml0b3I7ICAgICAgICAvKiBoYXZlIHRoZXNlIHR3byBhcyBmdWxsIEJvb2xlYW5zIGNvcyB0aGV5J2xsIGJlIHRlc3RlZCBmcmVxdWVudGx5ICovCiAgICBCT09MMTYgICAgICAgICAgICAgIENsaWVudF9vbmx5OyAgICAvKiBiaXQgd2FzdGVmdWwgb2Ygc3BhY2UgYnV0IGl0IHdpbGwgYmUgZmFzdGVyICovCiAgICBCT09MMTYgICAgICAgICAgICAgIFVuaWNvZGU7ICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIFdpbjMyIEFQSSB1c2VkIHRvIGluaXRpYWxpc2UgKi8KICAgIEJPT0wxNiAgICAgICAgICAgICAgV2luMTY7ICAgICAgICAgIC8qIGZsYWcgdG8gaW5kaWNhdGUgV2luMTYgQVBJIHVzZWQgdG8gaW5pdGlhbGl6ZSAqLwogICAgRFdPUkQgICAgICAgICAgICAgICBJbnN0YW5jZV9pZDsgIC8qIG5lZWRlZCB0byB0cmFjayBtb25pdG9yIHVzYWdlICovCiAgICBzdHJ1Y3QgRERFX0hBTkRMRV9FTlRSWSAgICAqTmV4dF9FbnRyeTsKICAgIEhTWk5vZGUJKk5vZGVfbGlzdDsKICAgIFBGTkNBTExCQUNLICAgICAgICAgQ2FsbEJhY2s7CiAgICBEV09SRCAgICAgICAgICAgICAgIENCRl9GbGFnczsKICAgIERXT1JEICAgICAgICAgICAgICAgTW9uaXRvcl9mbGFnczsKICAgIFVJTlQgICAgICAgICAgICAgIFR4bl9jb3VudDsgICAgICAvKiBjb3VudCB0cmFuc2FjdGlvbnMgb3BlbiB0byBzaW1wbGlmeSBjbG9zdXJlICovCiAgICBEV09SRCAgICAgICAgICAgICAgIExhc3RfRXJyb3I7IAogICAgU2VydmljZU5vZGUqCQlTZXJ2aWNlTmFtZXM7Cn0gRERFX0hBTkRMRV9FTlRSWTsKCnN0YXRpYyBEREVfSEFORExFX0VOVFJZCSpEREVfSGFuZGxlX1RhYmxlX0Jhc2UgPSBOVUxMOwpzdGF0aWMgRFdPUkQgCQlEREVfTWF4X0Fzc2lnbmVkX0luc3RhbmNlID0gMDsgIC8qIE9LIGZvciBwcmVzZW50LCBtYXkgaGF2ZSB0byB3b3JyeSBhYm91dCB3cmFwLWFyb3VuZCBsYXRlciAqLwpzdGF0aWMgY29uc3QgY2hhcgkqRERFSW5zdGFuY2VBY2Nlc3MgPSAiRERFTWF4SW5zdGFuY2UiOwpzdGF0aWMgY29uc3QgY2hhcgkqRERFSGFuZGxlQWNjZXNzID0gIkRERUhhbmRsZUFjY2VzcyI7CnN0YXRpYyBIQU5ETEUJCWluc3RfY291bnRfbXV0ZXggPSAwOwpzdGF0aWMgSEFORExFCQloYW5kbGVfbXV0ZXggPSAwOwoKI2RlZmluZSBUUlVFCTEKI2RlZmluZSBGQUxTRQkwCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIFJlbW92ZUhTWk5vZGVzICAgIChJTlRFUk5BTCkKICoKICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBsaXN0IG9mIEhTWiBub2Rlcy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBEZWMgMTk5OCAgQ29yZWwvTWFjYWRhbWlhbiAgICBJbml0aWFsIHZlcnNpb24KICogIDEuMSAgICAgIE1hciAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIEFkZGVkIG11bHRpcGxlIGluc3RhbmNlIGhhbmRsaW5nCiAqCiAqLwpzdGF0aWMgdm9pZCBSZW1vdmVIU1pOb2RlKCBIU1ogaHN6LCBEREVfSEFORExFX0VOVFJZICogcmVmZXJlbmNlX2luc3QgKQp7CiAgICBIU1pOb2RlKiBwUHJldiA9IE5VTEw7CiAgICBIU1pOb2RlKiBwQ3VycmVudCA9IE5VTEw7CgogICAgLyogU2V0IHRoZSBjdXJyZW50IG5vZGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgogICAgICovCiAgICBwQ3VycmVudCA9IHJlZmVyZW5jZV9pbnN0LT5Ob2RlX2xpc3Q7CiAgICAvKiBXaGlsZSB3ZSBoYXZlIG1vcmUgbm9kZXMuCiAgICAgKi8KICAgIHdoaWxlKCBwQ3VycmVudCAhPSBOVUxMICkKICAgIHsKICAgICAgICAvKiBJZiB3ZSBmb3VuZCB0aGUgbm9kZSB3ZSB3ZXJlIGxvb2tpbmcgZm9yLgogICAgICAgICAqLwogICAgICAgIGlmKCBwQ3VycmVudC0+aHN6ID09IGhzeiApCiAgICAgICAgewogICAgICAgICAgICAvKiBSZW1vdmUgdGhlIG5vZGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAvKiBJZiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgbGlzdCBpcyB0byB0byBiZSByZW1vdmVkLgogICAgICAgICAgICAgKiBTZXQgdGhlIGdsb2JhbCBsaXN0IHBvaW50ZXIgdG8gdGhlIG5leHQgbm9kZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmKCBwQ3VycmVudCA9PSByZWZlcmVuY2VfaW5zdC0+Tm9kZV9saXN0ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVmZXJlbmNlX2luc3QtPk5vZGVfbGlzdCA9IHBDdXJyZW50LT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEp1c3QgZml4IHRoZSBwb2ludGVycyBoYXMgdG8gc2tpcCB0aGUgY3VycmVudAogICAgICAgICAgICAgKiBub2RlIHNvIHdlIGNhbiBkZWxldGUgaXQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBQcmV2LT5uZXh0ID0gcEN1cnJlbnQtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogRGVzdHJveSB0aGlzIG5vZGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmcmVlKCBwQ3VycmVudCApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogU2F2ZSB0aGUgcHJldmlvdXMgbm9kZSBwb2ludGVyLgogICAgICAgICAqLwogICAgICAgIHBQcmV2ID0gcEN1cnJlbnQ7CiAgICAgICAgLyogTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlLgogICAgICAgICAqLwogICAgICAgIHBDdXJyZW50ID0gcEN1cnJlbnQtPm5leHQ7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBGcmVlQW5kUmVtb3ZlSFNaTm9kZXMgICAgKElOVEVSTkFMKQogKgogKiBGcmVlcyB1cCBhbGwgdGhlIHN0cmluZ3Mgc3RpbGwgYWxsb2NhdGVkIGluIHRoZSBsaXN0IGFuZAogKiByZW1vdmUgYWxsIHRoZSBub2RlcyBmcm9tIHRoZSBsaXN0IG9mIEhTWiBub2Rlcy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBEZWMgMTk5OCAgQ29yZWwvTWFjYWRhbWlhbiAgICBJbml0aWFsIHZlcnNpb24KICogIDEuMSAgICAgIE1hciAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIEFkZGVkIG11bHRpcGxlIGluc3RhbmNlIGhhbmRsaW5nCiAqCiAqLwpzdGF0aWMgdm9pZCBGcmVlQW5kUmVtb3ZlSFNaTm9kZXMoIERXT1JEIGlkSW5zdCwgRERFX0hBTkRMRV9FTlRSWSAqIHJlZmVyZW5jZV9pbnN0ICkKewogICAgLyogRnJlZSBhbnkgc3RyaW5ncyBjcmVhdGVkIGluIHRoaXMgaW5zdGFuY2UuCiAgICAgKi8KICAgIHdoaWxlKCByZWZlcmVuY2VfaW5zdC0+Tm9kZV9saXN0ICE9IE5VTEwgKQogICAgewogICAgICAgIERkZUZyZWVTdHJpbmdIYW5kbGUoIGlkSW5zdCwgcmVmZXJlbmNlX2luc3QtPk5vZGVfbGlzdC0+aHN6ICk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBJbnNlcnRIU1pOb2RlICAgIChJTlRFUk5BTCkKICoKICogSW5zZXJ0IGEgbm9kZSB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBEZWMgMTk5OCAgQ29yZWwvTWFjYWRhbWlhbiAgICBJbml0aWFsIHZlcnNpb24KICogIDEuMQkgICAgIE1hciAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIEFkZGVkIGluc3RhbmNlIGhhbmRsaW5nCiAqICAxLjIJICAgICBKdW4gMTk5OSAgS2VpdGggTWF0dGhld3MJICAgQWRkZWQgVXNhZ2UgY291bnQgaGFuZGxpbmcKICoKICovCnN0YXRpYyB2b2lkIEluc2VydEhTWk5vZGUoIEhTWiBoc3osIERERV9IQU5ETEVfRU5UUlkgKiByZWZlcmVuY2VfaW5zdCApCnsKICAgIGlmKCBoc3ogIT0gMCApCiAgICB7CiAgICAgICAgSFNaTm9kZSogcE5ldyA9IE5VTEw7CiAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZm9yIHRoaXMgSFNaLgogICAgICAgICAqLwogICAgICAgIHBOZXcgPSAoSFNaTm9kZSopIG1hbGxvYyggc2l6ZW9mKCBIU1pOb2RlICkgKTsKICAgICAgICBpZiggcE5ldyAhPSBOVUxMICkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFNldCB0aGUgaGFuZGxlIHZhbHVlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcE5ldy0+aHN6ID0gaHN6OwogICAgICAgICAgICAvKiBBdHRhY2ggdGhlIG5vZGUgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QuIGkuZSBtb3N0IHJlY2VudGx5IGFkZGVkIGlzIGZpcnN0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwTmV3LT5uZXh0ID0gcmVmZXJlbmNlX2luc3QtPk5vZGVfbGlzdDsKCiAgICAgICAgICAgIC8qIFRoZSBuZXcgbm9kZSBpcyBub3cgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QKICAgICAgICAgICAgICogc28gc2V0IHRoZSBnbG9iYWwgbGlzdCBwb2ludGVyIHRvIGl0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVmZXJlbmNlX2luc3QtPk5vZGVfbGlzdCA9IHBOZXc7CgkgICAgVFJBQ0UoIkhTWiBub2RlIGxpc3QgZW50cnkgYWRkZWRcbiIpOwogICAgICAgIH0KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUZpbmRfSW5zdGFuY2VfRW50cnkKICoKICoJZ2VuZXJpYyByb3V0aW5lIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlbGV2YW50IERERV9IQU5ETEVfRU5UUlkKICoJZm9yIGFuIGluc3RhbmNlIElkLCBvciBOVUxMIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdAogKgogKglBU1NVTUVTIHRoZSBtdXRleCBwcm90ZWN0aW5nIHRoZSBoYW5kbGUgZW50cnkgbGlzdCBpcyByZXNlcnZlZCBiZWZvcmUgY2FsbGluZwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUNoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgICAgIEF1dGhvcgkJICAgICAgICBDb21tZW50CiAqCiAqICAxLjAgICAgICBNYXJjaCAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIDFzdCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICAgKi8KIERERV9IQU5ETEVfRU5UUlkgKkZpbmRfSW5zdGFuY2VfRW50cnkgKERXT1JEIEluc3RJZCkKewoJRERFX0hBTkRMRV9FTlRSWSAqIHJlZmVyZW5jZV9pbnN0OwoJcmVmZXJlbmNlX2luc3QgPSAgRERFX0hhbmRsZV9UYWJsZV9CYXNlOwoJd2hpbGUgKCByZWZlcmVuY2VfaW5zdCAhPSBOVUxMICkKCXsKCQlpZiAoIHJlZmVyZW5jZV9pbnN0LT5JbnN0YW5jZV9pZCA9PSBJbnN0SWQgKQoJCXsKCQkJVFJBQ0UoIkluc3RhbmNlIGVudHJ5IGZvdW5kXG4iKTsKCQkJcmV0dXJuIHJlZmVyZW5jZV9pbnN0OwogICAgICAgIH0KCQlyZWZlcmVuY2VfaW5zdCA9IHJlZmVyZW5jZV9pbnN0LT5OZXh0X0VudHJ5OwogICAgfQoJVFJBQ0UoIkluc3RhbmNlIGVudHJ5IG1pc3NpbmdcbiIpOwoJcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglGaW5kX1NlcnZpY2VfTmFtZQogKgogKglnZW5lcmljIHJvdXRpbmUgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVsZXZhbnQgU2VydmljZU5vZGUKICoJZm9yIGEgZ2l2ZW4gc2VydmljZSBuYW1lLCBvciBOVUxMIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdAogKgogKglBU1NVTUVTIHRoZSBtdXRleCBwcm90ZWN0aW5nIHRoZSBoYW5kbGUgZW50cnkgbGlzdCBpcyByZXNlcnZlZCBiZWZvcmUgY2FsbGluZwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUNoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgICAgIEF1dGhvcgkJICAgICAgICBDb21tZW50CiAqCiAqICAxLjAgICAgICBNYXkgMTk5OSAgS2VpdGggTWF0dGhld3MgICAgICAxc3QgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgICovCiBTZXJ2aWNlTm9kZSAqRmluZF9TZXJ2aWNlX05hbWUgKEhTWiBTZXJ2aWNlX05hbWUsIERERV9IQU5ETEVfRU5UUlkqIHRoaXNfaW5zdGFuY2UpCnsKCVNlcnZpY2VOb2RlICogcmVmZXJlbmNlX25hbWU9ICB0aGlzX2luc3RhbmNlLT5TZXJ2aWNlTmFtZXM7Cgl3aGlsZSAoIHJlZmVyZW5jZV9uYW1lICE9IE5VTEwgKQoJewoJCWlmICggcmVmZXJlbmNlX25hbWUtPmhzeiA9PSBTZXJ2aWNlX05hbWUgKQoJCXsKCQkJVFJBQ0UoIlNlcnZpY2UgTmFtZSBmb3VuZFxuIik7CgkJCXJldHVybiByZWZlcmVuY2VfbmFtZTsKICAgICAgICB9CgkJcmVmZXJlbmNlX25hbWUgPSByZWZlcmVuY2VfbmFtZS0+bmV4dDsKICAgIH0KCVRSQUNFKCJTZXJ2aWNlIG5hbWUgbWlzc2luZ1xuIik7CglyZXR1cm4gTlVMTDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUmVsZWFzZV9yZXNlcnZlZF9tdXRleAogKgogKglnZW5lcmljIHJvdXRpbmUgdG8gcmVsZWFzZSBhIHJlc2VydmVkIG11dGV4CiAqCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICoJQ2hhbmdlIEhpc3RvcnkKICoKICogIFZuICAgICAgIERhdGUgICAgCUF1dGhvciAgICAgICAgIAkJQ29tbWVudAogKgogKiAgMS4wICAgICAgSmFuIDE5OTkgIEtlaXRoIE1hdHRoZXdzICAgICAgICBJbml0aWFsIHZlcnNpb24KICogIDEuMQkgICAgIE1hciAxOTk5ICBLZWl0aCBNYXR0aGV3cwkgICAgIENvcnJlY3RlZCBIZWFwIGhhbmRsaW5nLiBDb3JyZWN0ZWQgcmUtaW5pdGlhbGlzYXRpb24gaGFuZGxpbmcKICogIDEuMgkgICAgIEF1ZyAxOTk5ICBK/HJnZW4gU2NobWllZAkgICAgIENvcnJlY3RlZCBlcnJvciBoYW5kbGluZwogKgogKi8Kc3RhdGljIERXT1JEIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXggKEhBTkRMRSBtdXRleCwgTFBTVFIgbXV0ZXhfbmFtZSwgQk9PTCByZWxlYXNlX2hhbmRsZV9tLCBCT09MIHJlbGVhc2VfdGhpc19pICwgCiAgICBEREVfSEFORExFX0VOVFJZICp0aGlzX2luc3RhbmNlKQp7CglpZiAoIVJlbGVhc2VNdXRleChtdXRleCkpCiAgICAgICAgewoJCUVSUigiUmVsZWFzZU11dGV4IGZhaWxlZCAtICVzIG11dGV4ICVsaVxuIixtdXRleF9uYW1lLEdldExhc3RFcnJvcigpKTsKCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aGlzX2luc3RhbmNlKTsKCQlpZiAoIHJlbGVhc2VfaGFuZGxlX20gKQoJCXsKCQkJUmVsZWFzZU11dGV4KGhhbmRsZV9tdXRleCk7CgkJfQogICAgICAgICAgICAgICAgcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7CiAgICAgICAgIH0KCWlmICggcmVsZWFzZV90aGlzX2kgKQoJewogICAgICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGhpc19pbnN0YW5jZSk7Cgl9CglyZXR1cm4gRE1MRVJSX05PX0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVdhaXRGb3JNdXRleAogKgogKglnZW5lcmljIHJvdXRpbmUgdG8gd2FpdCBmb3IgdGhlIG11dGV4CiAqCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICoJQ2hhbmdlIEhpc3RvcnkKICoKICogIFZuICAgICAgIERhdGUgICAgCUF1dGhvciAgICAgICAgIAkJQ29tbWVudAogKgogKiAgMS4wICAgICAgQXVnIDE5OTkgIEp1ZXJnZW4gU2NobWllZCAgICAgICBJbml0aWFsIHZlcnNpb24KICoKICovCnN0YXRpYyBCT09MIFdhaXRGb3JNdXRleCAoSEFORExFIG11dGV4KQp7CglEV09SRCByZXN1bHQ7CgoJcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChtdXRleCwxMDAwKTsKCgkvKiBib3RoIGVycm9ycyBzaG91bGQgbmV2ZXIgb2NjdXIgKi8KCWlmIChXQUlUX1RJTUVPVVQgPT0gcmVzdWx0KQoJewoJCUVSUigiV2FpdEZvclNpbmdsZU9iamVjdCB0aW1lZCBvdXRcbiIpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpZiAoV0FJVF9GQUlMRUQgPT0gcmVzdWx0KQoJewoJCUVSUigiV2FpdEZvclNpbmdsZU9iamVjdCBmYWlsZWQgLSBlcnJvciAlbGlcbiIsIEdldExhc3RFcnJvcigpKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglyZXR1cm4gVFJVRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJbmNyZW1lbnRJbnN0YW5jZUlkCiAqCiAqCWdlbmVyaWMgcm91dGluZSB0byBpbmNyZW1lbnQgdGhlIG1heCBpbnN0YW5jZSBJZCBhbmQgYWxsb2NhdGUgYSBuZXcgYXBwbGljYXRpb24gaW5zdGFuY2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBKYW4gMTk5OSAgS2VpdGggTWF0dGhld3MgICAgICAgIEluaXRpYWwgdmVyc2lvbgogKgogKi8KRFdPUkQgSW5jcmVtZW50SW5zdGFuY2VJZCggRERFX0hBTkRMRV9FTlRSWSAqdGhpc19pbnN0YW5jZSkKewoJU0VDVVJJVFlfQVRUUklCVVRFUyBzX2F0dHJpYjsKCgkvKiAgTmVlZCB0byBzZXQgdXAgTXV0ZXggaW4gY2FzZSBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50ICovCgkvKiBpbmNyZW1lbnQgaGFuZGxlIGNvdW50ICYgZ2V0IHZhbHVlICovCglpZiAoICFpbnN0X2NvdW50X211dGV4ICkKCXsKCQlzX2F0dHJpYi5iSW5oZXJpdEhhbmRsZSA9IFRSVUU7CgkJc19hdHRyaWIubHBTZWN1cml0eURlc2NyaXB0b3IgPSBOVUxMOwoJCXNfYXR0cmliLm5MZW5ndGggPSBzaXplb2Yoc19hdHRyaWIpOwoJCWluc3RfY291bnRfbXV0ZXggPSBDcmVhdGVNdXRleEEoJnNfYXR0cmliLDEsRERFSW5zdGFuY2VBY2Nlc3MpOyAvKiAxc3QgdGltZSB0aHJvdWdoICovCgkJaW5zdF9jb3VudF9tdXRleCA9IENvbnZlcnRUb0dsb2JhbEhhbmRsZShpbnN0X2NvdW50X211dGV4KTsgLyogZml4bWUgd2hlbiBoYXZpbmcgc2VwZXJhdGUgYWRyZXNzcGFjZXMqLwoJfSBlbHNlIHsKICAgICAgICAJaWYgKCAhV2FpdEZvck11dGV4KGluc3RfY291bnRfbXV0ZXgpICkKICAgICAgICAJewogICAgICAgICAgICAgICAgCXJldHVybiBETUxFUlJfU1lTX0VSUk9SOwogICAgICAgIAl9Cgl9CglpZiAoICFpbnN0X2NvdW50X211dGV4ICkKCXsKCQlFUlIoIkNyZWF0ZU11dGV4IGZhaWxlZCAtIGluc3RfY291bnQgJWxpXG4iLEdldExhc3RFcnJvcigpKTsKCQlSZWxlYXNlX3Jlc2VydmVkX211dGV4IChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsMCwxLHRoaXNfaW5zdGFuY2UpOwoJCXJldHVybiBETUxFUlJfU1lTX0VSUk9SOwoJfQoJRERFX01heF9Bc3NpZ25lZF9JbnN0YW5jZSsrOwoJdGhpc19pbnN0YW5jZS0+SW5zdGFuY2VfaWQgPSBEREVfTWF4X0Fzc2lnbmVkX0luc3RhbmNlOwogICAgICAgIFRSQUNFKCJOZXcgaW5zdGFuY2UgaWQgJWxkIGFsbG9jYXRlZFxuIixEREVfTWF4X0Fzc2lnbmVkX0luc3RhbmNlKTsKCWlmIChSZWxlYXNlX3Jlc2VydmVkX211dGV4KGluc3RfY291bnRfbXV0ZXgsImluc3RhbmNlX2NvdW50IiwxLDAsdGhpc19pbnN0YW5jZSkpIHJldHVybiBETUxFUlJfU1lTX0VSUk9SOwoJcmV0dXJuIERNTEVSUl9OT19FUlJPUjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRmluZE5vdGlmeU1vbml0b3JDYWxsYmFja3MKICoKICoJUm91dGluZSB0byBmaW5kIGluc3RhbmNlcyB0aGF0IG5lZWQgdG8gYmUgbm90aWZpZWQgdmlhIHRoZWlyIGNhbGxiYWNrCiAqCW9mIHNvbWUgZXZlbnQgdGhleSBhcmUgbW9uaXRvcmluZwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUNoYW5nZSBIaXN0b3J5CiAqCiAqICBWbgkgICAgIERhdGUJQXV0aG9yCQkJQ29tbWVudAogKgogKiAgMS4wCSAgIE1heSAxOTk5ICAgIEtlaXRoIE1hdHRoZXdzICAgICAgIEluaXRpYWwgVmVyc2lvbgogKgogKi8KCnZvaWQgRmluZE5vdGlmeU1vbml0b3JDYWxsYmFja3MoRFdPUkQgVGhpc0luc3RhbmNlLCBEV09SRCBEZGVFdmVudCApCnsKCURERV9IQU5ETEVfRU5UUlkgKkluc3RhbmNlSGFuZGxlOwoJSW5zdGFuY2VIYW5kbGUgPSBEREVfSGFuZGxlX1RhYmxlX0Jhc2U7Cgl3aGlsZSAoIEluc3RhbmNlSGFuZGxlICE9IE5VTEwgKQoJewoJCWlmICggIChJbnN0YW5jZUhhbmRsZS0+TW9uaXRvciApICYmIEluc3RhbmNlSGFuZGxlLT5JbnN0YW5jZV9pZCA9PSBUaGlzSW5zdGFuY2UgKQoJCXsKCQkJLyogICBGb3VuZCBhbiBpbnN0YW5jZSByZWdpc3RlcmVkIGFzIG1vbml0b3IgYW5kIGlzIG5vdCBvdXJzZWx2ZXMKCQkJICoJdXNlIGNhbGxiYWNrIHRvIG5vdGlmeSB3aGVyZSBhcHByb3ByaWF0ZQoJCQkgKi8KCQl9CgkJSW5zdGFuY2VIYW5kbGUgPSBJbnN0YW5jZUhhbmRsZS0+TmV4dF9FbnRyeTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRGRlUmVzZXJ2ZUF0b20KICoKICogICAgICBSb3V0aW5lIHRvIG1ha2UgYW4gZXh0cmEgQWRkIG9uIGFuIGF0b20gdG8gcmVzZXJ2ZSBpdCBhIGJpdCBsb25nZXIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgIENoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgICAgIEF1dGhvciAgICAgICAgICAgICAgICAgIENvbW1lbnQKICoKICogIDEuMCAgICBKdW4gMTk5OSAgICBLZWl0aCBNYXR0aGV3cyAgICAgICBJbml0aWFsIFZlcnNpb24KICoKICovCgpzdGF0aWMgdm9pZCBEZGVSZXNlcnZlQXRvbSggRERFX0hBTkRMRV9FTlRSWSAqIHJlZmVyZW5jZV9pbnN0LEhTWiBoc3opCnsKICBpZiAoIHJlZmVyZW5jZV9pbnN0LT5Vbmljb2RlKQogIHsKICAgICAgICBXQ0hBUiBTTmFtZUJ1ZmZlcltNQVhfQlVGRkVSX0xFTl07CiAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWVXKGhzeixTTmFtZUJ1ZmZlcixNQVhfQlVGRkVSX0xFTik7CiAgICAgICAgR2xvYmFsQWRkQXRvbVcoU05hbWVCdWZmZXIpOwogIH0gZWxzZSB7CiAgICAgICAgQ0hBUiBTTmFtZUJ1ZmZlcltNQVhfQlVGRkVSX0xFTl07CiAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWVBKGhzeixTTmFtZUJ1ZmZlcixNQVhfQlVGRkVSX0xFTik7CiAgICAgICAgR2xvYmFsQWRkQXRvbUEoU05hbWVCdWZmZXIpOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIERkZVJlbGVhc2VBdG9tCiAqCiAqICAgICAgUm91dGluZSB0byBtYWtlIGEgZGVsZXRlIG9uIGFuIGF0b20gdG8gcmVsZWFzZSBpdCBhIGJpdCBzb29uZXIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgIENoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgICAgIEF1dGhvciAgICAgICAgICAgICAgICAgIENvbW1lbnQKICoKICogIDEuMCAgICBKdW4gMTk5OSAgICBLZWl0aCBNYXR0aGV3cyAgICAgICBJbml0aWFsIFZlcnNpb24KICoKICovCgpzdGF0aWMgdm9pZCBEZGVSZWxlYXNlQXRvbSggRERFX0hBTkRMRV9FTlRSWSAqIHJlZmVyZW5jZV9pbnN0LEhTWiBoc3opCnsKICAgIEdsb2JhbERlbGV0ZUF0b20oIGhzeiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlSW5pdGlhbGl6ZTE2ICAgKERERU1MLjIpCiAqLwpVSU5UMTYgV0lOQVBJIERkZUluaXRpYWxpemUxNiggTFBEV09SRCBwaWRJbnN0LCBQRk5DQUxMQkFDSzE2IHBmbkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgYWZDbWQsIERXT1JEIHVsUmVzKQp7CiAgICBUUkFDRSgiRGRlSW5pdGlhbGl6ZTE2IGNhbGxlZCAtIGNhbGxpbmcgRGRlSW5pdGlhbGl6ZUFcbiIpOwogICAgcmV0dXJuIChVSU5UMTYpRGRlSW5pdGlhbGl6ZUEocGlkSW5zdCwoUEZOQ0FMTEJBQ0spcGZuQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmQ21kLCB1bFJlcyk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlSW5pdGlhbGl6ZUEgICAoVVNFUjMyLjEwNikKICovClVJTlQgV0lOQVBJIERkZUluaXRpYWxpemVBKCBMUERXT1JEIHBpZEluc3QsIFBGTkNBTExCQUNLIHBmbkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGFmQ21kLCBEV09SRCB1bFJlcyApCnsKICAgIFRSQUNFKCJEZGVJbml0aWFsaXplQSBjYWxsZWQgLSBjYWxsaW5nIERkZUluaXRpYWxpemVXXG4iKTsKICAgIHJldHVybiBEZGVJbml0aWFsaXplVyhwaWRJbnN0LHBmbkNhbGxiYWNrLGFmQ21kLHVsUmVzKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGRlSW5pdGlhbGl6ZVcgW1VTRVIzMi4xMDddCiAqIFJlZ2lzdGVycyBhbiBhcHBsaWNhdGlvbiB3aXRoIHRoZSBEREVNTAogKgogKiBQQVJBTVMKICogICAgcGlkSW5zdCAgICAgW0ldIFBvaW50ZXIgdG8gaW5zdGFuY2UgaWRlbnRpZmllcgogKiAgICBwZm5DYWxsYmFjayBbSV0gUG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbgogKiAgICBhZkNtZCAgICAgICBbSV0gU2V0IG9mIGNvbW1hbmQgYW5kIGZpbHRlciBmbGFncwogKiAgICB1bFJlcyAgICAgICBbSV0gUmVzZXJ2ZWQKICoKICogUkVUVVJOUwogKiAgICBTdWNjZXNzOiBETUxFUlJfTk9fRVJST1IKICogICAgRmFpbHVyZTogRE1MRVJSX0RMTF9VU0FHRSwgRE1MRVJSX0lOVkFMSURQQVJBTUVURVIsIERNTEVSUl9TWVNfRVJST1IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBQcmUgMTk5OCAgQWxleGFuZHJlL0xlbgkgICAgIEluaXRpYWwgU3R1YgogKiAgMS4xICAgICAgSmFuIDE5OTkgIEtlaXRoIE1hdHRoZXdzICAgICAgICBJbml0aWFsIChuZWFyLSljb21wbGV0ZSB2ZXJzaW9uCiAqICAxLjIJICAgICBNYXIgMTk5OSAgS2VpdGggTWF0dGhld3MJICAgICBDb3JyZWN0ZWQgSGVhcCBoYW5kbGluZywgQ3JlYXRlTXV0ZXggZmFpbHVyZSBoYW5kbGluZwogKgogKi8KVUlOVCBXSU5BUEkgRGRlSW5pdGlhbGl6ZVcoIExQRFdPUkQgcGlkSW5zdCwgUEZOQ0FMTEJBQ0sgcGZuQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgYWZDbWQsIERXT1JEIHVsUmVzICkKewoKLyogIHByb2JhYmx5IG5vdCByZWFsbHkgY2FwYWJsZSBvZiBoYW5kbGluZyBtdWx0aXBsZSBwcm9jZXNzZXMsIGJ1dCBzaG91bGQgaGFuZGxlCiAqCW11bHRpcGxlIGluc3RhbmNlcyB3aXRoaW4gb25lIHByb2Nlc3MgKi8KCiAgICBTRUNVUklUWV9BVFRSSUJVVEVTICpzX2F0dD0gTlVMTDsKICAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc19hdHRyaWI7CiAgICBEV09SRCAJICAgICAJZXJyX25vID0gMDsKICAgIERERV9IQU5ETEVfRU5UUlkgKnRoaXNfaW5zdGFuY2U7CiAgICBEREVfSEFORExFX0VOVFJZICpyZWZlcmVuY2VfaW5zdDsKICAgIHNfYXR0ID0gJnNfYXR0cmliOwoKICAgIGlmKCB1bFJlcyApCiAgICB7CiAgICAgICAgRVJSKCJSZXNlcnZlZCB2YWx1ZSBub3QgemVybz8gIFdoYXQgZG9lcyB0aGlzIG1lYW4/XG4iKTsKICAgICAgICBGSVhNRSgiKCVwLCVwLDB4JWx4LCVsZCk6IHN0dWJcbiIsIHBpZEluc3QsIHBmbkNhbGxiYWNrLAoJICAgICAgYWZDbWQsdWxSZXMpOwogICAgICAgIC8qIHRyYXAgdGhpcyBhbmQgbm8gbW9yZSB1bnRpbCB3ZSBrbm93IG1vcmUgKi8KICAgICAgICByZXR1cm4gRE1MRVJSX05PX0VSUk9SOwogICAgfQogICAgaWYgKCFwZm5DYWxsYmFjayApIAogICAgewoJLyogIHRoaXMgb25lIG1heSBiZSB3cm9uZyAtIE1TIGRsbCBzZWVtcyB0byBhY2NlcHQgdGhlIGNvbmRpdGlvbiwgCgkgICAgbGVhdmUgdGhpcyB1bnRpbCB3ZSBmaW5kIG91dCBtb3JlICEhICovCgoKICAgICAgICAvKiBjYW4ndCBzZXQgdXAgdGhlIGluc3RhbmNlIHdpdGggbm90aGluZyB0byBhY3QgYXMgYSBjYWxsYmFjayAqLwogICAgICAgIFRSQUNFKCJObyBjYWxsYmFjayBwcm92aWRlZFxuIik7CiAgICAgICAgcmV0dXJuIERNTEVSUl9JTlZBTElEUEFSQU1FVEVSOyAvKiBtaWdodCBiZSBETUxFUlJfRExMX1VTQUdFICovCiAgICAgfQoKICAgICAvKiBncmFiIGVub3VnaCBoZWFwIGZvciBvbmUgY29udHJvbCBzdHJ1Y3QgLSBub3QgcmVhbGx5IG5lY2Vzc2FyeSBmb3IgcmUtaW5pdGlhbGlzZQogICAgICAqCWJ1dCBhbGxvd3MgdXMgdG8gdXNlIHNhbWUgdmFsaWRhdGlvbiByb3V0aW5lcyAqLwogICAgIHRoaXNfaW5zdGFuY2U9IChEREVfSEFORExFX0VOVFJZKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihEREVfSEFORExFX0VOVFJZKSApOwogICAgIGlmICggdGhpc19pbnN0YW5jZSA9PSBOVUxMICkKICAgICB7CgkvKiBjYXRhc3Ryb3BoZSAhISB3YXJuIHVzZXIgJiBhYm9ydCAqLwoJRVJSKCJJbnN0YW5jZSBjcmVhdGUgZmFpbGVkIC0gb3V0IG9mIG1lbW9yeVxuIik7CglyZXR1cm4gRE1MRVJSX1NZU19FUlJPUjsKICAgICB9CiAgICAgdGhpc19pbnN0YW5jZS0+TmV4dF9FbnRyeSA9IE5VTEw7CiAgICAgdGhpc19pbnN0YW5jZS0+TW9uaXRvcj0oYWZDbWR8QVBQQ0xBU1NfTU9OSVRPUik7CgogICAgIC8qIG1lc3N5IGJpdCwgc3BlYyBpbXBsaWVzIHRoYXQgJ0NsaWVudCBPbmx5JyBjYW4gYmUgc2V0IGluIDIgZGlmZmVyZW50IHdheXMsIGNhdGNoIDEgaGVyZSAqLwoKICAgICB0aGlzX2luc3RhbmNlLT5DbGllbnRfb25seT1hZkNtZCZBUFBDTURfQ0xJRU5UT05MWTsKICAgICB0aGlzX2luc3RhbmNlLT5JbnN0YW5jZV9pZCA9ICpwaWRJbnN0OyAvKiBNYXkgbmVlZCB0byBhZGQgY2FsbGluZyBwcm9jIElkICovCiAgICAgdGhpc19pbnN0YW5jZS0+Q2FsbEJhY2s9KnBmbkNhbGxiYWNrOwogICAgIHRoaXNfaW5zdGFuY2UtPlR4bl9jb3VudD0wOwogICAgIHRoaXNfaW5zdGFuY2UtPlVuaWNvZGUgPSBUUlVFOwogICAgIHRoaXNfaW5zdGFuY2UtPldpbjE2ID0gRkFMU0U7CiAgICAgdGhpc19pbnN0YW5jZS0+Tm9kZV9saXN0ID0gTlVMTDsgLyogbm9kZSB3aWxsIGJlIGFkZGVkIGxhdGVyICovCiAgICAgdGhpc19pbnN0YW5jZS0+TW9uaXRvcl9mbGFncyA9IGFmQ21kICYgTUZfTUFTSzsKICAgICB0aGlzX2luc3RhbmNlLT5TZXJ2aWNlTmFtZXMgPSBOVUxMOwoKICAgICAvKiBpc29sYXRlIENCRiBmbGFncyBpbiBvbmUgZ28sIGV4cGVjdCB0aGlzIHdpbGwgZ28gdGhlIHdheSBvZiBhbGwgYXR0ZW1wdHMgdG8gYmUgY2xldmVyICEhICovCgogICAgIHRoaXNfaW5zdGFuY2UtPkNCRl9GbGFncz1hZkNtZF4oKGFmQ21kJk1GX01BU0spfCgoYWZDbWQmQVBQQ01EX01BU0spfChhZkNtZCZBUFBDTEFTU19NQVNLKSkpOwoKICAgICBpZiAoICEgdGhpc19pbnN0YW5jZS0+Q2xpZW50X29ubHkgKQogICAgIHsKCgkvKiBDaGVjayBmb3Igb3RoZXIgd2F5IG9mIHNldHRpbmcgQ2xpZW50LW9ubHkgISEgKi8KCgl0aGlzX2luc3RhbmNlLT5DbGllbnRfb25seT0odGhpc19pbnN0YW5jZS0+Q0JGX0ZsYWdzJkNCRl9GQUlMX0FMTFNWUlhBQ1RJT05TKQoJCQk9PUNCRl9GQUlMX0FMTFNWUlhBQ1RJT05TOwogICAgIH0KCiAgICAgVFJBQ0UoImluc3RhbmNlIGNyZWF0ZWQgLSBjaGVja2luZyB2YWxpZGl0eSBcbiIpOwoKICAgIGlmKCAqcGlkSW5zdCA9PSAwICkgewogICAgICAgIC8qICBJbml0aWFsaXNhdGlvbiBvZiBuZXcgSW5zdGFuY2UgSWRlbnRpZmllciAqLwogICAgICAgIFRSQUNFKCJuZXcgaW5zdGFuY2UsIGNhbGxiYWNrICVwIGZsYWdzICVsWFxuIixwZm5DYWxsYmFjayxhZkNtZCk7CiAgICAgICAgaWYgKCBEREVfTWF4X0Fzc2lnbmVkX0luc3RhbmNlID09IDAgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIC8qICBOb3RoaW5nIGhhcyBiZWVuIGluaXRpYWxpc2VkIC0gZXhpdCBub3cgISBjYW4gcmV0dXJuIFRSVUUgc2luY2UgZWZmZWN0IGlzIHRoZSBzYW1lICovCgkvKiAgTmVlZCB0byBzZXQgdXAgTXV0ZXggaW4gY2FzZSBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50ICovCglzX2F0dC0+YkluaGVyaXRIYW5kbGUgPSBUUlVFOwoJc19hdHQtPmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gTlVMTDsKCXNfYXR0LT5uTGVuZ3RoID0gc2l6ZW9mKHNfYXR0KTsKCWhhbmRsZV9tdXRleCA9IENyZWF0ZU11dGV4QShzX2F0dCwxLERERUhhbmRsZUFjY2Vzcyk7CgloYW5kbGVfbXV0ZXggPSBDb252ZXJ0VG9HbG9iYWxIYW5kbGUoaGFuZGxlX211dGV4KTsgLyogZml4bWUgd2hlbiBoYXZpbmcgc2VwZXJhdGUgYWRyZXNzcGFjZXMqLwoJaWYgKCAhaGFuZGxlX211dGV4ICkgewoJCUVSUigiQ3JlYXRlTXV0ZXggZmFpbGVkIC0gaGFuZGxlIGxpc3QgICVsaVxuIixHZXRMYXN0RXJyb3IoKSk7CgkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGhpc19pbnN0YW5jZSk7CgkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7Cgl9CiAgICB9IGVsc2UgewoJaWYgKCAhV2FpdEZvck11dGV4KGhhbmRsZV9tdXRleCkgKQoJewoJCXJldHVybiBETUxFUlJfU1lTX0VSUk9SOwoJfQogICAgfQoKCVRSQUNFKCJIYW5kbGUgTXV0ZXggY3JlYXRlZC9yZXNlcnZlZFxuIik7CiAgICAgICAgaWYgKERERV9IYW5kbGVfVGFibGVfQmFzZSA9PSBOVUxMICkgCgl7CiAgICAgICAgICAgICAgICAvKiBjYW4ndCBiZSBhbm90aGVyIGluc3RhbmNlIGluIHRoaXMgY2FzZSwgYXNzaWduIHRvIHRoZSBiYXNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgIERERV9IYW5kbGVfVGFibGVfQmFzZT0gdGhpc19pbnN0YW5jZTsKCgkJLyogc2luY2UgZmlyc3QgbXVzdCBmb3JjZSBmaWx0ZXIgb2YgWFRZUF9DT05ORUNUIGFuZCBYVFlQX1dJTERDT05ORUNUIGZvcgoJCSAqCQlwcmVzZW50IAoJCSAqCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICBOT1RFIE5PVEUgTk9URSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJIAkgKgkJCgkgCSAqCXRoZSBtYW51YWwgaXMgbm90IGNsZWFyIGlmIHRoaXMgY29uZGl0aW9uCgkgCSAqCWFwcGxpZXMgdG8gdGhlIGZpcnN0IGNhbGwgdG8gRGRlSW5pdGlhbGl6ZSBmcm9tIGFuIGFwcGxpY2F0aW9uLCBvciB0aGUgCgkgCSAqCWZpcnN0IGNhbGwgZm9yIGEgZ2l2ZW4gY2FsbGJhY2sgISEhCgkJKi8KCgkJdGhpc19pbnN0YW5jZS0+Q0JGX0ZsYWdzPXRoaXNfaW5zdGFuY2UtPkNCRl9GbGFnc3xBUFBDTURfRklMVEVSSU5JVFM7CiAJCVRSQUNFKCJGaXJzdCBhcHBsaWNhdGlvbiBpbnN0YW5jZSBkZXRlY3RlZCBPS1xuIik7CgkJLyoJYWxsb2NhdGUgbmV3IGluc3RhbmNlIElEICovCgkJaWYgKChlcnJfbm8gPSBJbmNyZW1lbnRJbnN0YW5jZUlkKCB0aGlzX2luc3RhbmNlKSkgKSByZXR1cm4gZXJyX25vOwoKICAgCX0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiByZWFsbHkgbmVlZCB0byBjaGFpbiB0aGUgbmV3IG9uZSBpbiB0byB0aGUgbGF0ZXN0IGhlcmUsIGJ1dCBhZnRlciBjaGVja2luZyBjb25kaXRpb25zCiAgICAgICAgICAgICAgICAgKglzdWNoIGFzIHRyeWluZyB0byBzdGFydCBhIGNvbnZlcnNhdGlvbiBmcm9tIGFuIGFwcGxpY2F0aW9uIHRyeWluZyB0byBtb25pdG9yICovCiAgICAgICAgICAgICAgICByZWZlcmVuY2VfaW5zdCA9ICBEREVfSGFuZGxlX1RhYmxlX0Jhc2U7CgkJVFJBQ0UoIlN1YnNlcXVlbnQgYXBwbGljYXRpb24gaW5zdGFuY2UgLSBzdGFydGluZyBjaGVja3NcbiIpOwogICAgICAgICAgICAgICAgd2hpbGUgKCByZWZlcmVuY2VfaW5zdC0+TmV4dF9FbnRyeSAhPSBOVUxMICkgCgkJewoJCQkvKgoJCQkqCVRoaXMgc2V0IG9mIHRlc3RzIHdpbGwgd29yayBpZiBhcHBsaWNhdGlvbiB1c2VzIHNhbWUgaW5zdGFuY2UgSWQKCQkJKglhdCBhcHBsaWNhdGlvbiBsZXZlbCBvbmNlIGFsbG9jYXRlZCAtIHdoaWNoIGlzIHdoYXQgbWFudWFsIGltcGxpZXMKCQkJKglzaG91bGQgaGFwcGVuLiBJZiBzb21lb25lIHRyaWVzIHRvIGJlIAoJCQkqCWNsZXZlciAobGF6eSA/KSBpdCB3aWxsIGZhaWwgdG8gcGljayB1cCB0aGF0IGxhdGVyIGNhbGxzIGFyZSBmb3IKCQkJKgl0aGUgc2FtZSBhcHBsaWNhdGlvbiAtIHNob3VsZCB3ZSB0cnVzdCB0aGVtID8KCQkJKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzX2luc3RhbmNlLT5JbnN0YW5jZV9pZCA9PSByZWZlcmVuY2VfaW5zdC0+SW5zdGFuY2VfaWQpIAoJCQl7CgkJCQkvKiBDaGVjayAxIC0gbXVzdCBiZSBzYW1lIENsaWVudC1vbmx5IHN0YXRlICovCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGhpc19pbnN0YW5jZS0+Q2xpZW50X29ubHkgIT0gcmVmZXJlbmNlX2luc3QtPkNsaWVudF9vbmx5KQoJCQkJewoJCQkJCWlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsMCwxLHRoaXNfaW5zdGFuY2UpKQoJCQkJCQlyZXR1cm4gRE1MRVJSX1NZU19FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBETUxFUlJfRExMX1VTQUdFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCQkvKiBDaGVjayAyIC0gY2Fubm90IHVzZSAnTW9uaXRvcicgd2l0aCBhbnkgbm9uLW1vbml0b3IgbW9kZXMgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzX2luc3RhbmNlLT5Nb25pdG9yICE9IHJlZmVyZW5jZV9pbnN0LT5Nb25pdG9yKSAKCQkJCXsKCQkJCQlpZiAoIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLDAsMSx0aGlzX2luc3RhbmNlKSkKCQkJCQkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRE1MRVJSX0lOVkFMSURQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKCQkJCS8qIENoZWNrIDMgLSBtdXN0IHN1cHBseSBkaWZmZXJlbnQgY2FsbGJhY2sgYWRkcmVzcyAqLwoKCQkJCWlmICggdGhpc19pbnN0YW5jZS0+Q2FsbEJhY2sgPT0gcmVmZXJlbmNlX2luc3QtPkNhbGxCYWNrKQoJCQkJewoJCQkJCWlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsMCwxLHRoaXNfaW5zdGFuY2UpKQoJCQkJCQlyZXR1cm4gRE1MRVJSX1NZU19FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBETUxFUlJfRExMX1VTQUdFOwoJCQkJfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pbnN0ID0gcmVmZXJlbmNlX2luc3QtPk5leHRfRW50cnk7CiAgICAgICAgICAgICAgICB9CgkJLyogIEFsbCBjbGVhcmVkLCBhZGQgdG8gY2hhaW4gKi8KCgkJVFJBQ0UoIkFwcGxpY2F0aW9uIEluc3RhbmNlIGNoZWNrcyBmaW5pc2hlZFxuIik7CgkJaWYgKChlcnJfbm8gPSBJbmNyZW1lbnRJbnN0YW5jZUlkKCB0aGlzX2luc3RhbmNlKSkgKSByZXR1cm4gZXJyX25vOwoJCWlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsMCwwLHRoaXNfaW5zdGFuY2UpKSByZXR1cm4gRE1MRVJSX1NZU19FUlJPUjsKCQlyZWZlcmVuY2VfaW5zdC0+TmV4dF9FbnRyeSA9IHRoaXNfaW5zdGFuY2U7CiAgICAgICAgfQoJKnBpZEluc3QgPSB0aGlzX2luc3RhbmNlLT5JbnN0YW5jZV9pZDsKCVRSQUNFKCJOZXcgYXBwbGljYXRpb24gaW5zdGFuY2UgcHJvY2Vzc2luZyBmaW5pc2hlZCBPS1xuIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAvKiBSZWluaXRpYWxpc2F0aW9uIHNpdHVhdGlvbiAgIC0tLSBGSVggICovCiAgICAgICAgVFJBQ0UoInJlaW5pdGlhbGlzYXRpb24gb2YgKCVwLCVwLDB4JWx4LCVsZCk6IHN0dWJcbiIscGlkSW5zdCxwZm5DYWxsYmFjayxhZkNtZCx1bFJlcyk7CgoJaWYgKCAhV2FpdEZvck11dGV4KGhhbmRsZV9tdXRleCkgICkKCXsKCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aGlzX2luc3RhbmNlKTsKCQlyZXR1cm4gRE1MRVJSX1NZU19FUlJPUjsKICAgICAgICB9CgogICAgICAgIGlmIChEREVfSGFuZGxlX1RhYmxlX0Jhc2UgPT0gTlVMTCApIAoJewoJCWlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsMCwxLHRoaXNfaW5zdGFuY2UpKSByZXR1cm4gRE1MRVJSX1NZU19FUlJPUjsKICAgICAgICAJcmV0dXJuIERNTEVSUl9ETExfVVNBR0U7CiAJfQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHRoaXNfaW5zdGFuY2UpOyAvKiBmaW5pc2hlZCAtIHJlbGVhc2UgaGVhcCBzcGFjZSB1c2VkIGFzIHdvcmsgc3RvcmUgKi8KICAgICAgICAvKiBjYW4ndCByZWluaXRpYWxpc2UgaWYgd2UgaGF2ZSBpbml0aWFsaXNlZCBub3RoaW5nICEhICovCiAgICAgICAgcmVmZXJlbmNlX2luc3QgPSAgRERFX0hhbmRsZV9UYWJsZV9CYXNlOwogICAgICAgIC8qIG11c3QgZmlyc3QgY2hlY2sgaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgdmFsaWQgaW5zdGFuY2UgdG8gcmUtaW5pdGlhbGlzZSAhISAgaG93IGRvIHdlIGRvIHRoYXQgPyAqLwoJLyoKCSoJTVMgYWxsb3dzIGluaXRpYWxpc2F0aW9uIHdpdGhvdXQgc3BlY2lmeWluZyBhIGNhbGxiYWNrLCBzaG91bGQgd2UgYWxsb3cgYWRkaXRpb24gb2YgdGhlCgkqCWNhbGxiYWNrIGJ5IGEgbGF0ZXIgY2FsbCB0byBpbml0aWFsaXNlID8gLSBpZiBzbyB0aGlzIGxvdCB3aWxsIGhhdmUgdG8gY2hhbmdlCgkqLwoJd2hpbGUgKCByZWZlcmVuY2VfaW5zdC0+TmV4dF9FbnRyeSAhPSBOVUxMICkKCXsKCQlpZiAoICpwaWRJbnN0ID09IHJlZmVyZW5jZV9pbnN0LT5JbnN0YW5jZV9pZCAmJiBwZm5DYWxsYmFjayA9PSByZWZlcmVuY2VfaW5zdC0+Q2FsbEJhY2sgKQoJCXsKCQkJLyogQ2hlY2sgMSAtIGNhbm5vdCBjaGFuZ2UgY2xpZW50LW9ubHkgbW9kZSBpZiBzZXQgdmlhIEFQUENNRF9DTElFTlRPTkxZICovCgoJCQlpZiAoICByZWZlcmVuY2VfaW5zdC0+Q2xpZW50X29ubHkgKQoJCQl7CgkJCSAgIGlmICAoKHJlZmVyZW5jZV9pbnN0LT5DQkZfRmxhZ3MgJiBDQkZfRkFJTF9BTExTVlJYQUNUSU9OUykgIT0gQ0JGX0ZBSUxfQUxMU1ZSWEFDVElPTlMpIAoJCQkgICB7CgkJCQkvKiBpLmUuIFdhcyBzZXQgdG8gQ2xpZW50LW9ubHkgYW5kIHRocm91Z2ggQVBQQ01EX0NMSUVOVE9OTFkgKi8KCgkJCQlpZiAoICEgKCBhZkNtZCAmIEFQUENNRF9DTElFTlRPTkxZKSkKCQkJCXsKCQkJCQlpZiAoIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLDAsMSx0aGlzX2luc3RhbmNlKSkKCQkJCQkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiBETUxFUlJfRExMX1VTQUdFOwoJCQkJfQoJCQkgICB9CgkJCX0KCQkJLyogQ2hlY2sgMiAtIGNhbm5vdCBjaGFuZ2UgbW9uaXRvciBtb2RlcyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzX2luc3RhbmNlLT5Nb25pdG9yICE9IHJlZmVyZW5jZV9pbnN0LT5Nb25pdG9yKSAKCQkJewoJCQkJaWYgKCBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IiwwLDEsdGhpc19pbnN0YW5jZSkpCgkJCQkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERNTEVSUl9ETExfVVNBR0U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCS8qIENoZWNrIDMgLSB0cnlpbmcgdG8gc2V0IENsaWVudC1vbmx5IHZpYSBBUFBDTUQgd2hlbiBub3Qgc2V0IHNvIHByZXZpb3VzbHkgKi8KCgkJCWlmICgoIGFmQ21kJkFQUENNRF9DTElFTlRPTkxZKSAmJiAhIHJlZmVyZW5jZV9pbnN0LT5DbGllbnRfb25seSApCgkJCXsKCQkJCWlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsMCwxLHRoaXNfaW5zdGFuY2UpKQoJCQkJCXJldHVybiBETUxFUlJfU1lTX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBETUxFUlJfRExMX1VTQUdFOwoJCQl9CgkJCWJyZWFrOwoJCX0KICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pbnN0ID0gcmVmZXJlbmNlX2luc3QtPk5leHRfRW50cnk7Cgl9CglpZiAoIHJlZmVyZW5jZV9pbnN0LT5OZXh0X0VudHJ5ID09IE5VTEwgKQoJewoJCS8qIENyYXp5IHNpdHVhdGlvbiAtIHRyeWluZyB0byByZS1pbml0aWFsaXplIHNvbWV0aGluZyB0aGF0IGhhcyBub3QgYmVlZW4gaW5pdGlhbGl6ZWQgISEgCgkJKgkKCQkqCU1hbnVhbCBkb2VzIG5vdCBzYXkgd2hhdCB3ZSBkbywgY2Fubm90IHJldHVybiBETUxFUlJfTk9UX0lOSVRJQUxJWkVEIHNvIHdoYXQgPwoJCSovCgkJaWYgKCBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IiwwLDEsdGhpc19pbnN0YW5jZSkpCgkJCXJldHVybiBETUxFUlJfU1lTX0VSUk9SOwoJCXJldHVybiBETUxFUlJfSU5WQUxJRFBBUkFNRVRFUjsKCX0KCS8qCQlBbGwgY2hlY2tlZCAtIGNoYW5nZSByZWxldmFudCBmbGFncyAqLwoKCXJlZmVyZW5jZV9pbnN0LT5DQkZfRmxhZ3MgPSB0aGlzX2luc3RhbmNlLT5DQkZfRmxhZ3M7CglyZWZlcmVuY2VfaW5zdC0+Q2xpZW50X29ubHkgPSB0aGlzX2luc3RhbmNlLT5DbGllbnRfb25seTsKCXJlZmVyZW5jZV9pbnN0LT5Nb25pdG9yX2ZsYWdzID0gdGhpc19pbnN0YW5jZS0+TW9uaXRvcl9mbGFnczsKCWlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsMCwxLHRoaXNfaW5zdGFuY2UpKQoJCXJldHVybiBETUxFUlJfU1lTX0VSUk9SOwogICAgIH0KCiAgICByZXR1cm4gRE1MRVJSX05PX0VSUk9SOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlVW5pbml0aWFsaXplMTYgICAoRERFTUwuMykKICovCkJPT0wxNiBXSU5BUEkgRGRlVW5pbml0aWFsaXplMTYoIERXT1JEIGlkSW5zdCApCnsKICAgIEZJWE1FKCIgc3R1YiBjYWxsaW5nIERkZVVuaW5pdGlhbGl6ZVxuIik7CiAgICByZXR1cm4gKEJPT0wxNilEZGVVbmluaXRpYWxpemUoIGlkSW5zdCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERkZVVuaW5pdGlhbGl6ZSBbVVNFUjMyLjExOV0gIEZyZWVzIERERU1MIHJlc291cmNlcwogKgogKiBQQVJBTVMKICogICAgaWRJbnN0IFtJXSBJbnN0YW5jZSBpZGVudGlmaWVyCiAqCiAqIFJFVFVSTlMKICogICAgU3VjY2VzczogVFJVRQogKiAgICBGYWlsdXJlOiBGQUxTRQogKi8KCkJPT0wgV0lOQVBJIERkZVVuaW5pdGlhbGl6ZSggRFdPUkQgaWRJbnN0ICkKewoJLyogIFN0YWdlIG9uZSAtIGNoZWNrIGlmIHdlIGhhdmUgYSBoYW5kbGUgZm9yIHRoaXMgaW5zdGFuY2UKCQkJCQkJCQkJKi8KICAgICAgICBTRUNVUklUWV9BVFRSSUJVVEVTICpzX2F0dD0gTlVMTDsKICAJU0VDVVJJVFlfQVRUUklCVVRFUyBzX2F0dHJpYjsKICAgICAgICBEREVfSEFORExFX0VOVFJZICp0aGlzX2luc3RhbmNlOwogICAgICAgIERERV9IQU5ETEVfRU5UUlkgKnJlZmVyZW5jZV9pbnN0OwogIAlzX2F0dCA9ICZzX2F0dHJpYjsKCglpZiAoIERERV9NYXhfQXNzaWduZWRfSW5zdGFuY2UgPT0gMCApCgl7CgkJLyogIE5vdGhpbmcgaGFzIGJlZW4gaW5pdGlhbGlzZWQgLSBleGl0IG5vdyAhIGNhbiByZXR1cm4gVFJVRSBzaW5jZSBlZmZlY3QgaXMgdGhlIHNhbWUgKi8KCQlyZXR1cm4gVFJVRTsKCX0KCglpZiAoICFXYWl0Rm9yTXV0ZXgoaGFuZGxlX211dGV4KSApCgl7CgkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7Cgl9CiAgCVRSQUNFKCJIYW5kbGUgTXV0ZXggY3JlYXRlZC9yZXNlcnZlZFxuIik7CiAgCS8qICBGaXJzdCBjaGVjayBpbnN0YW5jZSAKICAJKi8KICAJdGhpc19pbnN0YW5jZSA9IEZpbmRfSW5zdGFuY2VfRW50cnkoaWRJbnN0KTsKICAJaWYgKCB0aGlzX2luc3RhbmNlID09IE5VTEwgKQogIAl7CgkJaWYgKCBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxGQUxTRSx0aGlzX2luc3RhbmNlKSkgcmV0dXJuIEZBTFNFOwoJCS8qCgkJICAqCU5lZWRzIHNvbWV0aGluZyBoZXJlIHRvIHJlY29yZCBOT1RfSU5JVElBTElaRUQgcmVhZHkgZm9yIERkZUdldExhc3RFcnJvcgoJCSovCgkJcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgIAlGSVhNRSgiKCVsZCk6IHBhcnRpYWwgc3R1YlxuIiwgaWRJbnN0KTsKCgkvKiAgIEZJWE1FCSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwoJICoJTmVlZHMgdG8gZGUtcmVnaXN0ZXIgYWxsIHNlcnZpY2UgbmFtZXMKCSAqCQoJICovCiAgICAvKiBGcmVlIHRoZSBub2RlcyB0aGF0IHdlcmUgbm90IGZyZWVkIGJ5IHRoaXMgaW5zdGFuY2UKICAgICAqIGFuZCByZW1vdmUgdGhlIG5vZGVzIGZyb20gdGhlIGxpc3Qgb2YgSFNaIG5vZGVzLgogICAgICovCiAgICAgICAgRnJlZUFuZFJlbW92ZUhTWk5vZGVzKCBpZEluc3QsIHRoaXNfaW5zdGFuY2UgKTsKICAgIAoJLyogT0sgbm93IGRlbGV0ZSB0aGUgaW5zdGFuY2UgaGFuZGxlIGl0c2VsZiAqLwoKCWlmICggRERFX0hhbmRsZV9UYWJsZV9CYXNlID09IHRoaXNfaW5zdGFuY2UgKQoJewoJCS8qIHNwZWNpYWwgY2FzZSAtIHRoZSBmaXJzdC9vbmx5IGVudHJ5CgkJKi8KCQlEREVfSGFuZGxlX1RhYmxlX0Jhc2UgPSB0aGlzX2luc3RhbmNlLT5OZXh0X0VudHJ5OwoJfSBlbHNlCgl7CgkJLyogZ2VuZXJhbCBjYXNlCgkJKi8KCQlyZWZlcmVuY2VfaW5zdCA9IERERV9IYW5kbGVfVGFibGVfQmFzZTsKCQl3aGlsZSAoIHJlZmVyZW5jZV9pbnN0LT5OZXh0X0VudHJ5ICE9IHRoaXNfaW5zdGFuY2UgKQoJCXsKCQkJcmVmZXJlbmNlX2luc3QgPSB0aGlzX2luc3RhbmNlLT5OZXh0X0VudHJ5OwoJCX0KCQlyZWZlcmVuY2VfaW5zdC0+TmV4dF9FbnRyeSA9IHRoaXNfaW5zdGFuY2UtPk5leHRfRW50cnk7CiAgICAJfQoJLyogcmVsZWFzZSB0aGUgbXV0ZXggYW5kIHRoZSBoZWFwIGVudHJ5CgkqLwogICAgICAJaWYgKCBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxUUlVFLHRoaXNfaW5zdGFuY2UpKSAKCXsKCQkvKiBzaG91bGQgcmVjb3JkIHNvbWV0aGluZyBoZXJlLCBidXQgbm90aGluZyBsZWZ0IHRvIGhhbmcgaXQgZnJvbSAhIQoJCSovCgkJcmV0dXJuIEZBTFNFOwoJfQogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGRlQ29ubmVjdExpc3QxNiBbRERFTUwuNF0KICovCgpIQ09OVkxJU1QgV0lOQVBJIERkZUNvbm5lY3RMaXN0MTYoIERXT1JEIGlkSW5zdCwgSFNaIGhzelNlcnZpY2UsIEhTWiBoc3pUb3BpYywKICAgICAgICAgICAgICAgICBIQ09OVkxJU1QgaENvbnZMaXN0LCBMUENPTlZDT05URVhUMTYgcENDICkKewogICAgcmV0dXJuIERkZUNvbm5lY3RMaXN0KGlkSW5zdCwgaHN6U2VydmljZSwgaHN6VG9waWMsIGhDb252TGlzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBDT05WQ09OVEVYVClwQ0MpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEZGVDb25uZWN0TGlzdCBbVVNFUjMyLjkzXSAgRXN0YWJsaXNoZXMgY29udmVyc2F0aW9uIHdpdGggRERFIHNlcnZlcnMKICoKICogUEFSQU1TCiAqICAgIGlkSW5zdCAgICAgW0ldIEluc3RhbmNlIGlkZW50aWZpZXIKICogICAgaHN6U2VydmljZSBbSV0gSGFuZGxlIHRvIHNlcnZpY2UgbmFtZSBzdHJpbmcKICogICAgaHN6VG9waWMgICBbSV0gSGFuZGxlIHRvIHRvcGljIG5hbWUgc3RyaW5nCiAqICAgIGhDb252TGlzdCAgW0ldIEhhbmRsZSB0byBjb252ZXJzYXRpb24gbGlzdAogKiAgICBwQ0MgICAgICAgIFtJXSBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aXRoIGNvbnRleHQgZGF0YQogKgogKiBSRVRVUk5TCiAqICAgIFN1Y2Nlc3M6IEhhbmRsZSB0byBuZXcgY29udmVyc2F0aW9uIGxpc3QKICogICAgRmFpbHVyZTogMAogKi8KSENPTlZMSVNUIFdJTkFQSSBEZGVDb25uZWN0TGlzdCggRFdPUkQgaWRJbnN0LCBIU1ogaHN6U2VydmljZSwgSFNaIGhzelRvcGljLAogICAgICAgICAgICAgICAgIEhDT05WTElTVCBoQ29udkxpc3QsIExQQ09OVkNPTlRFWFQgcENDICkKewogICAgRklYTUUoIiglbGQsJWQsJWQsJWQsJXApOiBzdHViXG4iLCBpZEluc3QsIGhzelNlcnZpY2UsIGhzelRvcGljLAogICAgICAgICAgaENvbnZMaXN0LHBDQyk7CiAgICByZXR1cm4gMTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEZGVRdWVyeU5leHRTZXJ2ZXIxNiBbRERFTUwuNV0KICovCkhDT05WIFdJTkFQSSBEZGVRdWVyeU5leHRTZXJ2ZXIxNiggSENPTlZMSVNUIGhDb252TGlzdCwgSENPTlYgaENvbnZQcmV2ICkKewogICAgcmV0dXJuIERkZVF1ZXJ5TmV4dFNlcnZlcihoQ29udkxpc3QsIGhDb252UHJldik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGRlUXVlcnlOZXh0U2VydmVyIFtVU0VSMzIuMTEyXQogKi8KSENPTlYgV0lOQVBJIERkZVF1ZXJ5TmV4dFNlcnZlciggSENPTlZMSVNUIGhDb252TGlzdCwgSENPTlYgaENvbnZQcmV2ICkKewogICAgRklYTUUoIiglZCwlZCk6IHN0dWJcbiIsaENvbnZMaXN0LGhDb252UHJldik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERkZVF1ZXJ5U3RyaW5nQSBbVVNFUjMyLjExM10KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUNoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgIAlBdXRob3IgICAgICAgICAJCUNvbW1lbnQKICoKICogIDEuMCAgICAgIERlYyAxOTk4ICBDb3JlbC9NYWNhZGFtaWFuICAgIEluaXRpYWwgdmVyc2lvbgogKiAgMS4xICAgICAgTWFyIDE5OTkgIEtlaXRoIE1hdHRoZXdzICAgICAgQWRkZWQgbGlua3MgdG8gaW5zdGFuY2UgdGFibGUgYW5kIHJlbGF0ZWQgcHJvY2Vzc2luZwogKgogKi8KRFdPUkQgV0lOQVBJIERkZVF1ZXJ5U3RyaW5nQShEV09SRCBpZEluc3QsIEhTWiBoc3osIExQU1RSIHBzeiwgRFdPUkQgY2NoTWF4LCBJTlQgaUNvZGVQYWdlKQp7CiAgICBEV09SRCByZXQgPSAwOwogICAgQ0hBUiBwU3RyaW5nW01BWF9CVUZGRVJfTEVOXTsKICAgIERERV9IQU5ETEVfRU5UUlkgKnJlZmVyZW5jZV9pbnN0OwoKICAgIEZJWE1FKAogICAgICAgICAiKCVsZCwgMHgleCwgJXAsICVsZCwgJWQpOiBwYXJ0aWFsIHN0dWJcbiIsCiAgICAgICAgIGlkSW5zdCwKICAgICAgICAgaHN6LAogICAgICAgICBwc3osIAogICAgICAgICBjY2hNYXgsCiAgICAgICAgIGlDb2RlUGFnZSk7CiAgaWYgKCBEREVfTWF4X0Fzc2lnbmVkX0luc3RhbmNlID09IDAgKQogIHsKICAgICAgICAgIC8qICBOb3RoaW5nIGhhcyBiZWVuIGluaXRpYWxpc2VkIC0gZXhpdCBub3cgISAqLwoJICAvKiAgbmVlZHMgc29tZXRoaW5nIGZvciBEZGVHZXRMQXN0RXJyb3IgZXZlbiBpZiB0aGUgbWFudWFsIGRvZXNuJ3Qgc2F5IHNvICovCiAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgfQogIAoJaWYgKCAhV2FpdEZvck11dGV4KGhhbmRsZV9tdXRleCkgKQoJewoJCXJldHVybiBGQUxTRTsKCX0KCiAgVFJBQ0UoIkhhbmRsZSBNdXRleCBjcmVhdGVkL3Jlc2VydmVkXG4iKTsKCiAgLyogIEZpcnN0IGNoZWNrIGluc3RhbmNlIAogICovCiAgcmVmZXJlbmNlX2luc3QgPSBGaW5kX0luc3RhbmNlX0VudHJ5KGlkSW5zdCk7CiAgaWYgKCByZWZlcmVuY2VfaW5zdCA9PSBOVUxMICkKICB7CiAgICAgICAgaWYgKCBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxGQUxTRSxyZWZlcmVuY2VfaW5zdCkpIHJldHVybiBGQUxTRTsKICAgICAgICAvKgogICAgICAgIE5lZWRzIHNvbWV0aGluZyBoZXJlIHRvIHJlY29yZCBOT1RfSU5JVElBTElaRUQgcmVhZHkgZm9yIERkZUdldExhc3RFcnJvcgogICAgICAgICovCiAgICAgICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgICBpZiggaUNvZGVQYWdlID09IENQX1dJTkFOU0kgKQogICAgewogICAgICAgIC8qIElmIHBzeiBpcyBudWxsLCB3ZSBoYXZlIHRvIHJldHVybiBvbmx5IHRoZSBsZW5ndGgKICAgICAgICAgKiBvZiB0aGUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGlmKCBwc3ogPT0gTlVMTCApCiAgICAgICAgewogICAgICAgICAgICBwc3ogPSBwU3RyaW5nOwogICAgICAgICAgICBjY2hNYXggPSBNQVhfQlVGRkVSX0xFTjsKfQoKICAgICAgICByZXQgPSBHbG9iYWxHZXRBdG9tTmFtZUEoIGhzeiwgKExQU1RSKXBzeiwgY2NoTWF4ICk7CiAgfSBlbHNlIHsKICAJUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UscmVmZXJlbmNlX2luc3QpOwogICAgfQogICBUUkFDRSgicmV0dXJuaW5nIHBvaW50ZXJcbiIpOyAKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEZGVRdWVyeVN0cmluZ1cgW1VTRVIzMi4xMTRdCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBEZWMgMTk5OCAgQ29yZWwvTWFjYWRhbWlhbiAgICBJbml0aWFsIHZlcnNpb24KICoKICovCgpEV09SRCBXSU5BUEkgRGRlUXVlcnlTdHJpbmdXKERXT1JEIGlkSW5zdCwgSFNaIGhzeiwgTFBXU1RSIHBzeiwgRFdPUkQgY2NoTWF4LCBJTlQgaUNvZGVQYWdlKQp7CiAgICBEV09SRCByZXQgPSAwOwogICAgV0NIQVIgcFN0cmluZ1tNQVhfQlVGRkVSX0xFTl07CiAgICBpbnQgZmFjdG9yID0gMTsKCiAgICBGSVhNRSgKICAgICAgICAgIiglbGQsIDB4JXgsICVwLCAlbGQsICVkKTogc3R1YlxuIiwKICAgICAgICAgaWRJbnN0LAogICAgICAgICBoc3osCiAgICAgICAgIHBzeiwgCiAgICAgICAgIGNjaE1heCwKICAgICAgICAgaUNvZGVQYWdlKTsKCiAgICBpZiggaUNvZGVQYWdlID09IENQX1dJTlVOSUNPREUgKQogICAgewogICAgICAgIC8qIElmIHBzeiBpcyBudWxsLCB3ZSBoYXZlIHRvIHJldHVybiBvbmx5IHRoZSBsZW5ndGgKICAgICAgICAgKiBvZiB0aGUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGlmKCBwc3ogPT0gTlVMTCApCiAgICAgICAgewogICAgICAgICAgICBwc3ogPSBwU3RyaW5nOwogICAgICAgICAgICBjY2hNYXggPSBNQVhfQlVGRkVSX0xFTjsKICAgICAgICAgICAgLyogTm90ZTogQWNjb3JkaW5nIHRvIGRvY3VtZW50YXRpb24gaWYgdGhlIHBzeiBwYXJhbWV0ZXIKICAgICAgICAgICAgICogd2FzIE5VTEwgdGhpcyBBUEkgbXVzdCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ5dGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmFjdG9yID0gKGludCkgc2l6ZW9mKFdDSEFSKS9zaXplb2YoQllURSk7CiAgICAgICAgfQogICAgICAgIHJldCA9IEdsb2JhbEdldEF0b21OYW1lVyggaHN6LCAoTFBXU1RSKXBzeiwgY2NoTWF4ICkgKiBmYWN0b3I7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqCQlEZGVRdWVyeVN0cmluZzE2IChEREVNTC4yMykKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICoJQ2hhbmdlIEhpc3RvcnkKICoKICogIFZuICAgICAgIERhdGUgICAgCUF1dGhvciAgICAgICAgIAkJQ29tbWVudAogKgogKiAgMS4wICAgICAgTWFyY2ggMTk5OSBLIE1hdHRoZXdzCQlzdHViIG9ubHkKICovCgpEV09SRCBXSU5BUEkgRGRlUXVlcnlTdHJpbmcxNihEV09SRCBpZEluc3QsIEhTWiBoc3osIExQU1RSIGxwc3osIERXT1JEIGNjaE1heCwgSU5UMTYgY29kZXBhZ2UpCnsKCUZJWE1FKCIoJWxkLCAweCV4LCAlcCwgJWxkLCAlZCk6IHN0dWIgXG4iLCAKICAgICAgICAgaWRJbnN0LAogICAgICAgICBoc3osCiAgICAgICAgIGxwc3osIAogICAgICAgICBjY2hNYXgsCiAgICAgICAgIGNvZGVwYWdlKTsKCXJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlRGlzY29ubmVjdExpc3QgKERERU1MLjYpCiAqLwpCT09MMTYgV0lOQVBJIERkZURpc2Nvbm5lY3RMaXN0MTYoIEhDT05WTElTVCBoQ29udkxpc3QgKQp7CiAgICByZXR1cm4gKEJPT0wxNilEZGVEaXNjb25uZWN0TGlzdChoQ29udkxpc3QpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEZGVEaXNjb25uZWN0TGlzdCBbVVNFUjMyLjk4XSAgRGVzdHJveXMgbGlzdCBhbmQgdGVybWluYXRlcyBjb252ZXJzYXRpb25zCiAqCiAqIFJFVFVSTlMKICogICAgU3VjY2VzczogVFJVRQogKiAgICBGYWlsdXJlOiBGQUxTRQogKi8KQk9PTCBXSU5BUEkgRGRlRGlzY29ubmVjdExpc3QoCiAgICBIQ09OVkxJU1QgaENvbnZMaXN0KSAvKiBbaW5dIEhhbmRsZSB0byBjb252ZXJzYXRpb24gbGlzdCAqLwp7CiAgICBGSVhNRSgiKCVkKTogc3R1YlxuIiwgaENvbnZMaXN0KTsKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlQ29ubmVjdDE2ICAgKERERU1MLjcpCiAqLwpIQ09OViBXSU5BUEkgRGRlQ29ubmVjdDE2KCBEV09SRCBpZEluc3QsIEhTWiBoc3pTZXJ2aWNlLCBIU1ogaHN6VG9waWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09OVkNPTlRFWFQxNiBwQ0MgKQp7CiAgICBGSVhNRSgiZW1wdHkgc3R1YlxuIiApOwogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBEZGVDb25uZWN0ICAgKFVTRVIzMi45MikKICovCkhDT05WIFdJTkFQSSBEZGVDb25uZWN0KCBEV09SRCBpZEluc3QsIEhTWiBoc3pTZXJ2aWNlLCBIU1ogaHN6VG9waWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09OVkNPTlRFWFQgcENDICkKewogICAgRklYTUUoIigweCVseCwlZCwlZCwlcCk6IHN0dWJcbiIsaWRJbnN0LGhzelNlcnZpY2UsaHN6VG9waWMsCiAgICAgICAgICBwQ0MpOwogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBEZGVEaXNjb25uZWN0MTYgICAoRERFTUwuOCkKICovCkJPT0wxNiBXSU5BUEkgRGRlRGlzY29ubmVjdDE2KCBIQ09OViBoQ29udiApCnsKICAgIHJldHVybiAoQk9PTDE2KURkZURpc2Nvbm5lY3QoIGhDb252ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZVNldFVzZXJIYW5kbGUxNiAoRERFTUwuMTApCiAqLwpCT09MMTYgV0lOQVBJIERkZVNldFVzZXJIYW5kbGUxNiggSENPTlYgaENvbnYsIERXT1JEIGlkLCBEV09SRCBoVXNlciApCnsKICAgIEZJWE1FKCIoJWQsJWxkLCVsZCk6IHN0dWJcbiIsaENvbnYsaWQsIGhVc2VyICk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlQ3JlYXRlRGF0YUhhbmRsZTE2IChEREVNTC4xNCkKICovCkhEREVEQVRBIFdJTkFQSSBEZGVDcmVhdGVEYXRhSGFuZGxlMTYoIERXT1JEIGlkSW5zdCwgTFBCWVRFIHBTcmMsIERXT1JEIGNiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiT2ZmLCBIU1ogaHN6SXRlbSwgVUlOVDE2IHdGbXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGFmQ21kICkKewogICAgcmV0dXJuIERkZUNyZWF0ZURhdGFIYW5kbGUoaWRJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JPZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHN6SXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Rm10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmQ21kKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlQ3JlYXRlRGF0YUhhbmRsZSAoVVNFUjMyLjk0KQogKi8KSERERURBVEEgV0lOQVBJIERkZUNyZWF0ZURhdGFIYW5kbGUoIERXT1JEIGlkSW5zdCwgTFBCWVRFIHBTcmMsIERXT1JEIGNiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2JPZmYsIEhTWiBoc3pJdGVtLCBVSU5UIHdGbXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFmQ21kICkKewogICAgRklYTUUoCiAgICAgICAgICAiKCVsZCwlcCwlbGQsJWxkLDB4JXgsJWQsJWQpOiBzdHViXG4iLAogICAgICAgICAgaWRJbnN0LAogICAgICAgICAgcFNyYywKICAgICAgICAgIGNiLAogICAgICAgICAgY2JPZmYsCiAgICAgICAgICAgaHN6SXRlbSwKICAgICAgICAgIHdGbXQsIAogICAgICAgICAgYWZDbWQgKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlRGlzY29ubmVjdCAgIChVU0VSMzIuOTcpCiAqLwpCT09MIFdJTkFQSSBEZGVEaXNjb25uZWN0KCBIQ09OViBoQ29udiApCnsKICAgIEZJWE1FKCJlbXB0eSBzdHViXG4iICk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZVJlY29ubmVjdCAgIChEREVNTC4zNykgKFVTRVIzMi4xMTUpCiAqLwpIQ09OViBXSU5BUEkgRGRlUmVjb25uZWN0KCBIQ09OViBoQ29udiApCnsKICAgIEZJWE1FKCJlbXB0eSBzdHViXG4iICk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZUNyZWF0ZVN0cmluZ0hhbmRsZTE2ICAgKERERU1MLjIxKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICBDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAgICBBdXRob3IgICAgICAgICAgICAgICAgICBDb21tZW50CiAqCiAqICAxLjAgICAgICA/CQk/CQkJYmFzaWMgc3R1YgogKiAgMS4xICAgICAgSnVuZSAxOTk5ICBLZWl0aCBNYXR0aGV3cwkJYW1lbmRlZCBvbndhcmQgY2FsbCB0byBzdXBwbHkgZGVmYXVsdAogKgkJCQkJCWNvZGUgcGFnZSBpZiBub25lIHN1cHBsaWVkIGJ5IGNhbGxlcgogKi8KSFNaIFdJTkFQSSBEZGVDcmVhdGVTdHJpbmdIYW5kbGUxNiggRFdPUkQgaWRJbnN0LCBMUENTVFIgc3RyLCBJTlQxNiBjb2RlcGFnZSApCnsKICAgIGlmICAoIGNvZGVwYWdlICkKICAgIHsKICAgIHJldHVybiBEZGVDcmVhdGVTdHJpbmdIYW5kbGVBKCBpZEluc3QsIHN0ciwgY29kZXBhZ2UgKTsKICAgICB9IGVsc2UgewogIAlUUkFDRSgiRGVmYXVsdCBjb2RlcGFnZSBzdXBwbGllZFxuIik7CgkgcmV0dXJuIERkZUNyZWF0ZVN0cmluZ0hhbmRsZUEoIGlkSW5zdCwgc3RyLCBDUF9XSU5BTlNJKTsKICAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGRlQ3JlYXRlU3RyaW5nSGFuZGxlQSBbVVNFUjMyLjk1XQogKgogKiBSRVRVUk5TCiAqICAgIFN1Y2Nlc3M6IFN0cmluZyBoYW5kbGUKICogICAgRmFpbHVyZTogMAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICBDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAgICBBdXRob3IgICAgICAgICAgICAgICAgICBDb21tZW50CiAqCiAqICAxLjAgICAgICBEZWMgMTk5OCAgQ29yZWwvTWFjYWRhbWlhbiAgICBJbml0aWFsIHZlcnNpb24KICogIDEuMSAgICAgIE1hciAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIEFkZGVkIGxpbmtzIHRvIGluc3RhbmNlIHRhYmxlIGFuZCByZWxhdGVkIHByb2Nlc3NpbmcKICoKICovCkhTWiBXSU5BUEkgRGRlQ3JlYXRlU3RyaW5nSGFuZGxlQSggRFdPUkQgaWRJbnN0LCBMUENTVFIgcHN6LCBJTlQgY29kZXBhZ2UgKQp7CiAgSFNaIGhzeiA9IDA7CiAgRERFX0hBTkRMRV9FTlRSWSAqcmVmZXJlbmNlX2luc3Q7CiAgVFJBQ0UoIiglbGQsJXMsJWQpOiBwYXJ0aWFsIHN0dWJcbiIsaWRJbnN0LGRlYnVnc3RyX2EocHN6KSxjb2RlcGFnZSk7CiAgCgogIGlmICggRERFX01heF9Bc3NpZ25lZF9JbnN0YW5jZSA9PSAwICkKICB7CiAgICAgICAgICAvKiAgTm90aGluZyBoYXMgYmVlbiBpbml0aWFsaXNlZCAtIGV4aXQgbm93ICEgY2FuIHJldHVybiBGQUxTRSBzaW5jZSBlZmZlY3QgaXMgdGhlIHNhbWUgKi8KICAgICAgICAgIHJldHVybiBGQUxTRTsKICB9CiAgCglpZiAoICFXYWl0Rm9yTXV0ZXgoaGFuZGxlX211dGV4KSApCgl7CgkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7Cgl9CgogIFRSQUNFKCJIYW5kbGUgTXV0ZXggY3JlYXRlZC9yZXNlcnZlZFxuIik7CgogIC8qICBGaXJzdCBjaGVjayBpbnN0YW5jZSAKICAqLwogIHJlZmVyZW5jZV9pbnN0ID0gRmluZF9JbnN0YW5jZV9FbnRyeShpZEluc3QpOwogIGlmICggcmVmZXJlbmNlX2luc3QgPT0gTlVMTCApCiAgewoJaWYgKCBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxGQUxTRSxyZWZlcmVuY2VfaW5zdCkpIHJldHVybiAwOwoJLyoKCU5lZWRzIHNvbWV0aGluZyBoZXJlIHRvIHJlY29yZCBOT1RfSU5JVElBTElaRUQgcmVhZHkgZm9yIERkZUdldExhc3RFcnJvcgoJKi8KCXJldHVybiAwOwogIH0KICAKICBpZiAoY29kZXBhZ2U9PUNQX1dJTkFOU0kpCiAgewogICAgICBoc3ogPSBHbG9iYWxBZGRBdG9tQSAocHN6KTsKICAgICAgLyogU2F2ZSB0aGUgaGFuZGxlIHNvIHdlIGtub3cgdG8gY2xlYW4gaXQgd2hlbgogICAgICAgKiB1bmluaXRpYWxpemUgaXMgY2FsbGVkLgogICAgICAgKi8KICAgICAgVFJBQ0UoImFkZGVkIGF0b20gJXMgd2l0aCBIU1ogMHgleCwgXG4iLGRlYnVnc3RyX2EocHN6KSxoc3opOwogICAgICBJbnNlcnRIU1pOb2RlKCBoc3osIHJlZmVyZW5jZV9pbnN0ICk7CiAgICAgIGlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UscmVmZXJlbmNlX2luc3QpKSAKCXsKCQlyZWZlcmVuY2VfaW5zdC0+TGFzdF9FcnJvciA9IERNTEVSUl9TWVNfRVJST1I7CgkJcmV0dXJuIDA7Cgl9CiAgICAgIFRSQUNFKCJSZXR1cm5pbmcgcG9pbnRlclxuIik7CiAgICAgIHJldHVybiBoc3o7CiAgfSBlbHNlIHsKICAJUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UscmVmZXJlbmNlX2luc3QpOwogIH0KICAgIFRSQUNFKCJSZXR1cm5pbmcgZXJyb3JcbiIpOwogICAgcmV0dXJuIDA7ICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGRlQ3JlYXRlU3RyaW5nSGFuZGxlVyBbVVNFUjMyLjk2XSAgQ3JlYXRlcyBoYW5kbGUgdG8gaWRlbnRpZnkgc3RyaW5nCiAqCiAqIFJFVFVSTlMKICogICAgU3VjY2VzczogU3RyaW5nIGhhbmRsZQogKiAgICBGYWlsdXJlOiAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBEZWMgMTk5OCAgQ29yZWwvTWFjYWRhbWlhbiAgICBJbml0aWFsIHZlcnNpb24KICogIDEuMQkgICAgIE1hciAxOTk5ICBLZWl0aCBNYXR0aGV3cwkgICBBZGRlZCBsaW5rcyB0byBpbnN0YW5jZSB0YWJsZSBhbmQgcmVsYXRlZCBwcm9jZXNzaW5nCiAqCiAqLwpIU1ogV0lOQVBJIERkZUNyZWF0ZVN0cmluZ0hhbmRsZVcoCiAgICBEV09SRCBpZEluc3QsICAgLyogW2luXSBJbnN0YW5jZSBpZGVudGlmaWVyICovCiAgICBMUENXU1RSIHBzeiwgICAgLyogW2luXSBQb2ludGVyIHRvIHN0cmluZyAqLwogICAgSU5UIGNvZGVwYWdlKSAvKiBbaW5dIENvZGUgcGFnZSBpZGVudGlmaWVyICovCnsKICAgRERFX0hBTkRMRV9FTlRSWSAqcmVmZXJlbmNlX2luc3Q7CiAgIEhTWiBoc3ogPSAwOwoKICAgVFJBQ0UoIiglbGQsJXMsJWQpOiBwYXJ0aWFsIHN0dWJcbiIsaWRJbnN0LGRlYnVnc3RyX3cocHN6KSxjb2RlcGFnZSk7CiAgCgogIGlmICggRERFX01heF9Bc3NpZ25lZF9JbnN0YW5jZSA9PSAwICkKICB7CiAgICAgICAgICAvKiAgTm90aGluZyBoYXMgYmVlbiBpbml0aWFsaXNlZCAtIGV4aXQgbm93ICEgY2FuIHJldHVybiBGQUxTRSBzaW5jZSBlZmZlY3QgaXMgdGhlIHNhbWUgKi8KICAgICAgICAgIHJldHVybiBGQUxTRTsKICB9CiAgCglpZiAoICFXYWl0Rm9yTXV0ZXgoaGFuZGxlX211dGV4KSApCgl7CgkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7Cgl9CgogIFRSQUNFKCJDcmVhdGVTdHJpbmcgLSBIYW5kbGUgTXV0ZXggY3JlYXRlZC9yZXNlcnZlZFxuIik7CiAgCiAgLyogIEZpcnN0IGNoZWNrIGluc3RhbmNlIAogICovCiAgcmVmZXJlbmNlX2luc3QgPSBGaW5kX0luc3RhbmNlX0VudHJ5KGlkSW5zdCk7CiAgaWYgKCByZWZlcmVuY2VfaW5zdCA9PSBOVUxMICkKICB7CglpZiAoIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLEZBTFNFLEZBTFNFLHJlZmVyZW5jZV9pbnN0KSkgcmV0dXJuIDA7CgkvKgoJTmVlZHMgc29tZXRoaW5nIGhlcmUgdG8gcmVjb3JkIE5PVF9JTklUSUFMSVpFRCByZWFkeSBmb3IgRGRlR2V0TGFzdEVycm9yCgkqLwoJcmV0dXJuIDA7CiAgfQoKICAgIEZJWE1FKCIoJWxkLCVzLCVkKTogcGFydGlhbCBzdHViXG4iLGlkSW5zdCxkZWJ1Z3N0cl93KHBzeiksY29kZXBhZ2UpOwoKICBpZiAoY29kZXBhZ2U9PUNQX1dJTlVOSUNPREUpCiAgLyoKICBTaG91bGQgd2UgYmUgY2hlY2tpbmcgdGhpcyBhZ2FpbnN0IHRoZSB1bmljb2RlL2FzY2lpIG5hdHVyZSBvZiB0aGUgY2FsbCB0byBEZGVJbml0aWFsaXplID8KICAqLwogIHsKICAgICAgaHN6ID0gR2xvYmFsQWRkQXRvbVcgKHBzeik7CiAgICAgIC8qIFNhdmUgdGhlIGhhbmRsZSBzbyB3ZSBrbm93IHRvIGNsZWFuIGl0IHdoZW4KICAgICAgICogdW5pbml0aWFsaXplIGlzIGNhbGxlZC4KICAgICAgICovCiAgICAgIEluc2VydEhTWk5vZGUoIGhzeiwgcmVmZXJlbmNlX2luc3QgKTsKICAgICAgaWYgKCBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxGQUxTRSxyZWZlcmVuY2VfaW5zdCkpIAoJewoJCXJlZmVyZW5jZV9pbnN0LT5MYXN0X0Vycm9yID0gRE1MRVJSX1NZU19FUlJPUjsKCQlyZXR1cm4gMDsKCX0KICAgICAgVFJBQ0UoIlJldHVybmluZyBwb2ludGVyXG4iKTsKICAgICAgcmV0dXJuIGhzejsKICAgfSBlbHNlIHsKICAJUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UscmVmZXJlbmNlX2luc3QpOwp9CiAgICBUUkFDRSgiUmV0dXJuaW5nIGVycm9yXG4iKTsKICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZUZyZWVTdHJpbmdIYW5kbGUxNiAgIChEREVNTC4yMikKICovCkJPT0wxNiBXSU5BUEkgRGRlRnJlZVN0cmluZ0hhbmRsZTE2KCBEV09SRCBpZEluc3QsIEhTWiBoc3ogKQp7CglGSVhNRSgiaWRJbnN0ICVsZCBoc3ogMHgleFxuIixpZEluc3QsaHN6KTsKICAgIHJldHVybiAoQk9PTClEZGVGcmVlU3RyaW5nSGFuZGxlKCBpZEluc3QsIGhzeiApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlRnJlZVN0cmluZ0hhbmRsZSAgIChVU0VSMzIuMTAxKQogKiBSRVRVUk5TOiBzdWNjZXNzOiBub256ZXJvCiAqICAgICAgICAgIGZhaWw6ICAgIHplcm8KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgQ2hhbmdlIEhpc3RvcnkKICoKICogIFZuICAgICAgIERhdGUgICAgICAgQXV0aG9yICAgICAgICAgICAgICAgICAgQ29tbWVudAogKgogKiAgMS4wICAgICAgRGVjIDE5OTggIENvcmVsL01hY2FkYW1pYW4gICAgSW5pdGlhbCB2ZXJzaW9uCiAqICAxLjEgICAgICBBcHIgMTk5OSAgS2VpdGggTWF0dGhld3MgICAgICBBZGRlZCBsaW5rcyB0byBpbnN0YW5jZSB0YWJsZSBhbmQgcmVsYXRlZCBwcm9jZXNzaW5nCiAqCiAqLwpCT09MIFdJTkFQSSBEZGVGcmVlU3RyaW5nSGFuZGxlKCBEV09SRCBpZEluc3QsIEhTWiBoc3ogKQp7CiAgICBEREVfSEFORExFX0VOVFJZICpyZWZlcmVuY2VfaW5zdDsKICAgIFRSQUNFKCIoJWxkLCVkKTogXG4iLGlkSW5zdCxoc3opOwogIGlmICggRERFX01heF9Bc3NpZ25lZF9JbnN0YW5jZSA9PSAwICkKewogICAgICAgICAgLyogIE5vdGhpbmcgaGFzIGJlZW4gaW5pdGlhbGlzZWQgLSBleGl0IG5vdyAhIGNhbiByZXR1cm4gVFJVRSBzaW5jZSBlZmZlY3QgaXMgdGhlIHNhbWUgKi8KICAgICAgICAgIHJldHVybiBUUlVFOwogIH0KCglpZiAoICFXYWl0Rm9yTXV0ZXgoaGFuZGxlX211dGV4KSApCgl7CgkJcmV0dXJuIERNTEVSUl9TWVNfRVJST1I7Cgl9CgogIFRSQUNFKCJIYW5kbGUgTXV0ZXggY3JlYXRlZC9yZXNlcnZlZFxuIik7CgogIC8qICBGaXJzdCBjaGVjayBpbnN0YW5jZSAKICAqLwogIHJlZmVyZW5jZV9pbnN0ID0gRmluZF9JbnN0YW5jZV9FbnRyeShpZEluc3QpOwogIGlmICggKHJlZmVyZW5jZV9pbnN0ID09IE5VTEwpIHx8IChyZWZlcmVuY2VfaW5zdC0+Tm9kZV9saXN0ID09IE5VTEwpKQogIHsKICAgICAgICBpZiAoIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLEZBTFNFLEZBTFNFLHJlZmVyZW5jZV9pbnN0KSkgcmV0dXJuIFRSVUU7CiAgICAgICAgICAvKiAgTm90aGluZyBoYXMgYmVlbiBpbml0aWFsaXNlZCAtIGV4aXQgbm93ICEgY2FuIHJldHVybiBUUlVFIHNpbmNlIGVmZmVjdCBpcyB0aGUgc2FtZSAqLwogICAgICAgICAgcmV0dXJuIFRSVUU7CgogIH0KCiAgICAvKiBSZW1vdmUgdGhlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSFNaLgogICAgICovCiAgICBSZW1vdmVIU1pOb2RlKCBoc3ogLCByZWZlcmVuY2VfaW5zdCk7CiAgICAvKiBGcmVlIHRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSFNaLgogICAgICovCiAgUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UscmVmZXJlbmNlX2luc3QpOwogICAgcmV0dXJuIEdsb2JhbERlbGV0ZUF0b20gKGhzeikgPyAwIDogaHN6Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlRnJlZURhdGFIYW5kbGUxNiAgIChEREVNTC4xOSkKICovCkJPT0wxNiBXSU5BUEkgRGRlRnJlZURhdGFIYW5kbGUxNiggSERERURBVEEgaERhdGEgKQp7CiAgICByZXR1cm4gKEJPT0wpRGRlRnJlZURhdGFIYW5kbGUoIGhEYXRhICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBEZGVGcmVlRGF0YUhhbmRsZSAgIChVU0VSMzIuMTAwKQogKi8KQk9PTCBXSU5BUEkgRGRlRnJlZURhdGFIYW5kbGUoIEhEREVEQVRBIGhEYXRhICkKewogICAgRklYTUUoImVtcHR5IHN0dWJcbiIgKTsKICAgIHJldHVybiBUUlVFOwp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBEZGVLZWVwU3RyaW5nSGFuZGxlMTYgICAoRERFTUwuMjQpCiAqLwpCT09MMTYgV0lOQVBJIERkZUtlZXBTdHJpbmdIYW5kbGUxNiggRFdPUkQgaWRJbnN0LCBIU1ogaHN6ICkKewogICAgcmV0dXJuIChCT09MKURkZUtlZXBTdHJpbmdIYW5kbGUoIGlkSW5zdCwgaHN6ICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBEZGVLZWVwU3RyaW5nSGFuZGxlICAoVVNFUjMyLjEwOCkKICoKICogUkVUVVJOUzogc3VjY2Vzczogbm9uemVybwogKiAgICAgICAgICBmYWlsOiAgICB6ZXJvCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgIENoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgICAgIEF1dGhvciAgICAgICAgICAgICAgICAgIENvbW1lbnQKICoKICogIDEuMCAgICAgID8JCSA/CQkgICBTdHViIG9ubHkKICogIDEuMSAgICAgIEp1biAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIEZpcnN0IGN1dCBpbXBsZW1lbnRhdGlvbgogKgogKi8KQk9PTCBXSU5BUEkgRGRlS2VlcFN0cmluZ0hhbmRsZSggRFdPUkQgaWRJbnN0LCBIU1ogaHN6ICkKewoKICBEREVfSEFORExFX0VOVFJZICpyZWZlcmVuY2VfaW5zdDsKICBUUkFDRSgiKCVsZCwlZCk6IFxuIixpZEluc3QsaHN6KTsKICBpZiAoIERERV9NYXhfQXNzaWduZWRfSW5zdGFuY2UgPT0gMCApCiAgewogICAgICAgICAgLyogIE5vdGhpbmcgaGFzIGJlZW4gaW5pdGlhbGlzZWQgLSBleGl0IG5vdyAhIGNhbiByZXR1cm4gRkFMU0Ugc2luY2UgZWZmZWN0IGlzIHRoZSBzYW1lICovCiAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgfQoKCglpZiAoICFXYWl0Rm9yTXV0ZXgoaGFuZGxlX211dGV4KSApCgl7CgkJcmV0dXJuIEZBTFNFOwoJfQoKICBUUkFDRSgiSGFuZGxlIE11dGV4IGNyZWF0ZWQvcmVzZXJ2ZWRcbiIpOwoKICAvKiAgRmlyc3QgY2hlY2sgaW5zdGFuY2UKICAqLwogIHJlZmVyZW5jZV9pbnN0ID0gRmluZF9JbnN0YW5jZV9FbnRyeShpZEluc3QpOwogIGlmICggKHJlZmVyZW5jZV9pbnN0ID09IE5VTEwpIHx8IChyZWZlcmVuY2VfaW5zdC0+Tm9kZV9saXN0ID09IE5VTEwpKQogIHsKICAgICAgICBpZiAoIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLEZBTFNFLEZBTFNFLHJlZmVyZW5jZV9pbnN0KSkgcmV0dXJuIEZBTFNFOwogICAgICAgICAgLyogIE5vdGhpbmcgaGFzIGJlZW4gaW5pdGlhbGlzZWQgLSBleGl0IG5vdyAhIGNhbiByZXR1cm4gRkFMU0Ugc2luY2UgZWZmZWN0IGlzIHRoZSBzYW1lICovCiAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICByZXR1cm4gRkFMU0U7CiAgIH0KICBEZGVSZXNlcnZlQXRvbShyZWZlcmVuY2VfaW5zdCxoc3opOwogIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLEZBTFNFLEZBTFNFLHJlZmVyZW5jZV9pbnN0KTsKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlQ2xpZW50VHJhbnNhY3Rpb24xNiAgKERERU1MLjExKQogKi8KSERERURBVEEgV0lOQVBJIERkZUNsaWVudFRyYW5zYWN0aW9uMTYoIExQVk9JRCBwRGF0YSwgRFdPUkQgY2JEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENPTlYgaENvbnYsIEhTWiBoc3pJdGVtLCBVSU5UMTYgd0ZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB3VHlwZSwgRFdPUkQgZHdUaW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBwZHdSZXN1bHQgKQp7CiAgICByZXR1cm4gRGRlQ2xpZW50VHJhbnNhY3Rpb24oIChMUEJZVEUpcERhdGEsIGNiRGF0YSwgaENvbnYsIGhzekl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0ZtdCwgd1R5cGUsIGR3VGltZW91dCwgcGR3UmVzdWx0ICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICBEZGVDbGllbnRUcmFuc2FjdGlvbiAgKFVTRVIzMi45MCkKICovCkhEREVEQVRBIFdJTkFQSSBEZGVDbGllbnRUcmFuc2FjdGlvbiggTFBCWVRFIHBEYXRhLCBEV09SRCBjYkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ09OViBoQ29udiwgSFNaIGhzekl0ZW0sIFVJTlQgd0ZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgd1R5cGUsIERXT1JEIGR3VGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgcGR3UmVzdWx0ICkKewogICAgRklYTUUoImVtcHR5IHN0dWJcbiIgKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgICBEZGVBYmFuZG9uVHJhbnNhY3Rpb24xNiAoRERFTUwuMTIpCiAqCiAqLwpCT09MMTYgV0lOQVBJIERkZUFiYW5kb25UcmFuc2FjdGlvbjE2KCBEV09SRCBpZEluc3QsIEhDT05WIGhDb252LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGlkVHJhbnNhY3Rpb24gKQp7CiAgICBGSVhNRSgiZW1wdHkgc3R1YlxuIiApOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgICBEZGVBYmFuZG9uVHJhbnNhY3Rpb24gKFVTRVIzMi44NykKICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUNoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgIAlBdXRob3IgICAgICAgICAJCUNvbW1lbnQKICoKICogIDEuMCAgICAgIE1hcmNoIDE5OTkgSyBNYXR0aGV3cwkJc3R1YiBvbmx5CiAqLwpCT09MIFdJTkFQSSBEZGVBYmFuZG9uVHJhbnNhY3Rpb24oIERXT1JEIGlkSW5zdCwgSENPTlYgaENvbnYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgaWRUcmFuc2FjdGlvbiApCnsKICAgIEZJWE1FKCJlbXB0eSBzdHViXG4iICk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERkZVBvc3RBZHZpc2UxNiBbRERFTUwuMTNdCiAqLwpCT09MMTYgV0lOQVBJIERkZVBvc3RBZHZpc2UxNiggRFdPUkQgaWRJbnN0LCBIU1ogaHN6VG9waWMsIEhTWiBoc3pJdGVtICkKewogICAgcmV0dXJuIChCT09MMTYpRGRlUG9zdEFkdmlzZShpZEluc3QsIGhzelRvcGljLCBoc3pJdGVtKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGRlUG9zdEFkdmlzZSBbVVNFUjMyLjExMF0gIFNlbmQgdHJhbnNhY3Rpb24gdG8gRERFIGNhbGxiYWNrIGZ1bmN0aW9uLgogKgogKiBSRVRVUk5TCiAqICAgIFN1Y2Nlc3M6IFRSVUUKICogICAgRmFpbHVyZTogRkFMU0UKICovCkJPT0wgV0lOQVBJIERkZVBvc3RBZHZpc2UoCiAgICBEV09SRCBpZEluc3QsIC8qIFtpbl0gSW5zdGFuY2UgaWRlbnRpZmllciAqLwogICAgSFNaIGhzelRvcGljLCAvKiBbaW5dIEhhbmRsZSB0byB0b3BpYyBuYW1lIHN0cmluZyAqLwogICAgSFNaIGhzekl0ZW0pICAvKiBbaW5dIEhhbmRsZSB0byBpdGVtIG5hbWUgc3RyaW5nICovCnsKICAgIEZJWE1FKCIoJWxkLCVkLCVkKTogc3R1YlxuIixpZEluc3QsaHN6VG9waWMsaHN6SXRlbSk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZUFkZERhdGExNiAoRERFTUwuMTUpCiAqLwpIRERFREFUQSBXSU5BUEkgRGRlQWRkRGF0YTE2KCBIRERFREFUQSBoRGF0YSwgTFBCWVRFIHBTcmMsIERXT1JEIGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2JPZmYgKQp7CiAgICBGSVhNRSgiZW1wdHkgc3R1YlxuIiApOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgICAgICAgIERkZUFkZERhdGEgKFVTRVIzMi44OSkKICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUNoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgIAlBdXRob3IgICAgICAgICAJCUNvbW1lbnQKICoKICogIDEuMCAgICAgIE1hcmNoIDE5OTkgSyBNYXR0aGV3cwkJc3R1YiBvbmx5CiAqLwpIRERFREFUQSBXSU5BUEkgRGRlQWRkRGF0YSggSERERURBVEEgaERhdGEsIExQQllURSBwU3JjLCBEV09SRCBjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiT2ZmICkKewogICAgRklYTUUoImVtcHR5IHN0dWJcbiIgKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICAgICAgRGRlSW1wZXJzb25hdGVDbGllbnQgKFVTRVIzMi4xMDUpCiAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKglDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAJQXV0aG9yICAgICAgICAgCQlDb21tZW50CiAqCiAqICAxLjAgICAgICBNYXJjaCAxOTk5IEsgTWF0dGhld3MJCXN0dWIgb25seQogKi8KCkJPT0wgV0lOQVBJIERkZUltcGVyc29uYXRlQ2xpZW50KCBIQ09OViBoQ29udikKewogICAgRklYTUUoImVtcHR5IHN0dWJcbiIgKTsKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICAgICAgRGRlU2V0UXVhbGl0eU9mU2VydmljZSAoVVNFUjMyLjExNikKICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUNoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgIAlBdXRob3IgICAgICAgICAJCUNvbW1lbnQKICoKICogIDEuMCAgICAgIE1hcmNoIDE5OTkgSyBNYXR0aGV3cwkJc3R1YiBvbmx5CiAqLwoKQk9PTCBXSU5BUEkgRGRlU2V0UXVhbGl0eU9mU2VydmljZSggSFdORCBod25kQ2xpZW50LCBDT05TVCBTRUNVUklUWV9RVUFMSVRZX09GX1NFUlZJQ0UgKnBxb3NOZXcsCgkJCQkJUFNFQ1VSSVRZX1FVQUxJVFlfT0ZfU0VSVklDRSBwcW9zUHJldikKewogICAgRklYTUUoImVtcHR5IHN0dWJcbiIgKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgICBEZGVTZXRVc2VySGFuZGxlIChVU0VSMzIuMTE3KQogKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICoJQ2hhbmdlIEhpc3RvcnkKICoKICogIFZuICAgICAgIERhdGUgICAgCUF1dGhvciAgICAgICAgIAkJQ29tbWVudAogKgogKiAgMS4wICAgICAgTWFyY2ggMTk5OSBLIE1hdHRoZXdzCQlzdHViIG9ubHkKICovCgpCT09MIFdJTkFQSSBEZGVTZXRVc2VySGFuZGxlKCBIQ09OViBoQ29udiwgRFdPUkQgaWQsIERXT1JEIGhVc2VyKQp7CiAgICBGSVhNRSgiZW1wdHkgc3R1YlxuIiApOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGRlR2V0RGF0YSBbVVNFUjMyLjEwMl0gIENvcGllcyBkYXRhIGZyb20gRERFIG9iamVjdCBvdCBsb2NhbCBidWZmZXIKICoKICogUkVUVVJOUwogKiAgICBTaXplIG9mIG1lbW9yeSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGhhbmRsZQogKi8KRFdPUkQgV0lOQVBJIERkZUdldERhdGEoCiAgICBIRERFREFUQSBoRGF0YSwgLyogW2luXSBIYW5kbGUgdG8gRERFIG9iamVjdCAqLwogICAgTFBCWVRFIHBEc3QsICAgIC8qIFtpbl0gUG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIgKi8KICAgIERXT1JEIGNiTWF4LCAgICAvKiBbaW5dIEFtb3VudCBvZiBkYXRhIHRvIGNvcHkgKi8KICAgIERXT1JEIGNiT2ZmKSAgICAvKiBbaW5dIE9mZnNldCB0byBiZWdpbm5pbmcgb2YgZGF0YSAqLwp7CiAgICBGSVhNRSgiKCVkLCVwLCVsZCwlbGQpOiBzdHViXG4iLGhEYXRhLHBEc3QsY2JNYXgsY2JPZmYpOwogICAgcmV0dXJuIGNiTWF4Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERkZUdldERhdGExNiBbRERFTUwuMTZdCiAqLwpEV09SRCBXSU5BUEkgRGRlR2V0RGF0YTE2KAogICAgSERERURBVEEgaERhdGEsCiAgICBMUEJZVEUgcERzdCwKICAgIERXT1JEIGNiTWF4LCAKICAgIERXT1JEIGNiT2ZmKQp7CiAgICByZXR1cm4gRGRlR2V0RGF0YShoRGF0YSwgcERzdCwgY2JNYXgsIGNiT2ZmKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZUFjY2Vzc0RhdGExNiAoRERFTUwuMTcpCiAqLwpMUEJZVEUgV0lOQVBJIERkZUFjY2Vzc0RhdGExNiggSERERURBVEEgaERhdGEsIExQRFdPUkQgcGNiRGF0YVNpemUgKQp7CiAgICAgcmV0dXJuIERkZUFjY2Vzc0RhdGEoaERhdGEsIHBjYkRhdGFTaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlQWNjZXNzRGF0YSAoVVNFUjMyLjg4KQogKi8KTFBCWVRFIFdJTkFQSSBEZGVBY2Nlc3NEYXRhKCBIRERFREFUQSBoRGF0YSwgTFBEV09SRCBwY2JEYXRhU2l6ZSApCnsKICAgICBGSVhNRSgiKCVkLCVwKTogc3R1YlxuIiwgaERhdGEsIHBjYkRhdGFTaXplKTsKICAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlVW5hY2Nlc3NEYXRhMTYgKERERU1MLjE4KQogKi8KQk9PTDE2IFdJTkFQSSBEZGVVbmFjY2Vzc0RhdGExNiggSERERURBVEEgaERhdGEgKQp7CiAgICAgcmV0dXJuIERkZVVuYWNjZXNzRGF0YShoRGF0YSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZVVuYWNjZXNzRGF0YSAoVVNFUjMyLjExOCkKICovCkJPT0wgV0lOQVBJIERkZVVuYWNjZXNzRGF0YSggSERERURBVEEgaERhdGEgKQp7CiAgICAgRklYTUUoIigweCV4KTogc3R1YlxuIiwgaERhdGEpOwoKICAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlRW5hYmxlQ2FsbGJhY2sxNiAoRERFTUwuMjYpCiAqLwpCT09MMTYgV0lOQVBJIERkZUVuYWJsZUNhbGxiYWNrMTYoIERXT1JEIGlkSW5zdCwgSENPTlYgaENvbnYsIFVJTlQxNiB3Q21kICkKewogICAgIHJldHVybiBEZGVFbmFibGVDYWxsYmFjayhpZEluc3QsIGhDb252LCB3Q21kKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgRGRlRW5hYmxlQ2FsbGJhY2sgKFVTRVIzMi45OSkKICovCkJPT0wgV0lOQVBJIERkZUVuYWJsZUNhbGxiYWNrKCBEV09SRCBpZEluc3QsIEhDT05WIGhDb252LCBVSU5UIHdDbWQgKQp7CiAgICAgRklYTUUoIiglbGQsIDB4JXgsICVkKSBzdHViXG4iLCBpZEluc3QsIGhDb252LCB3Q21kKTsKCiAgICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZU5hbWVTZXJ2aWNlMTYgIChEREVNTC4yNykKICovCkhEREVEQVRBIFdJTkFQSSBEZGVOYW1lU2VydmljZTE2KCBEV09SRCBpZEluc3QsIEhTWiBoc3oxLCBIU1ogaHN6MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBhZkNtZCApCnsKICAgIHJldHVybiBEZGVOYW1lU2VydmljZSggaWRJbnN0LCBoc3oxLCBoc3oyLCBhZkNtZCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEZGVOYW1lU2VydmljZSBbVVNFUjMyLjEwOV0gIHtVbn1yZWdpc3RlcnMgc2VydmljZSBuYW1lIG9mIERERSBzZXJ2ZXIKICoKICogUEFSQU1TCiAqICAgIGlkSW5zdCBbSV0gSW5zdGFuY2UgaWRlbnRpZmllcgogKiAgICBoc3oxICAgW0ldIEhhbmRsZSB0byBzZXJ2aWNlIG5hbWUgc3RyaW5nCiAqICAgIGhzejIgICBbSV0gUmVzZXJ2ZWQKICogICAgYWZDbWQgIFtJXSBTZXJ2aWNlIG5hbWUgZmxhZ3MKICoKICogUkVUVVJOUwogKiAgICBTdWNjZXNzOiBOb24temVybwogKiAgICBGYWlsdXJlOiAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgIENoYW5nZSBIaXN0b3J5CiAqCiAqICBWbiAgICAgICBEYXRlICAgICAgIEF1dGhvciAgICAgICAgICAgICAgICAgIENvbW1lbnQKICoKICogIDEuMCAgICAgID8JIAkgID8JCSAgIFN0dWIKICogIDEuMSAgICAgIEFwciAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIEFkZGVkIHRyYXAgZm9yIG5vbi1leGlzdGVudCBpbnN0YW5jZSAodW5pbml0aWFsaXNlZCBpbnN0YW5jZSAwCiAqCQkJCQkJdXNlZCBieSBzb21lIE1TIHByb2dyYW1zIGZvciB1bmZhdGhvbWFibGUgcmVhc29ucykKICogIDEuMgkgICAgIE1heSAxOTk5ICBLZWl0aCBNYXR0aGV3cyAgICAgIEFkZGVkIHBhcmFtZXRlciB2YWxpZGF0aW9uIGFuZCBiYXNpYyBzZXJ2aWNlIG5hbWUgaGFuZGxpbmcuCiAqCQkJCQkgICBTdGlsbCBuZWVkcyBjYWxsYmFjayBwYXJ0cwogKgogKi8KSERERURBVEEgV0lOQVBJIERkZU5hbWVTZXJ2aWNlKCBEV09SRCBpZEluc3QsIEhTWiBoc3oxLCBIU1ogaHN6MiwKICAgICAgICAgICAgICAgIFVJTlQgYWZDbWQgKQp7CiAgU2VydmljZU5vZGUqIHRoaXNfc2VydmljZSwgKnJlZmVyZW5jZV9zZXJ2aWNlIDsKICBEREVfSEFORExFX0VOVFJZICp0aGlzX2luc3RhbmNlOwogIERERV9IQU5ETEVfRU5UUlkgKnJlZmVyZW5jZV9pbnN0OwogIHRoaXNfc2VydmljZSA9IE5VTEw7CgogIEZJWE1FKCIoJWxkLCVkLCVkLCVkKTogc3R1YlxuIixpZEluc3QsaHN6MSxoc3oyLGFmQ21kKTsKCiAgaWYgKCBEREVfTWF4X0Fzc2lnbmVkX0luc3RhbmNlID09IDAgKQogIHsKICAgICAgICAgIC8qICBOb3RoaW5nIGhhcyBiZWVuIGluaXRpYWxpc2VkIC0gZXhpdCBub3cgISAKCSAgICoJbmVlZHMgc29tZXRoaW5nIGZvciBEZGVHZXRMYXN0RXJyb3IgKi8KICAgICAgICAgIHJldHVybiAwTDsKICB9CgoJaWYgKCAhV2FpdEZvck11dGV4KGhhbmRsZV9tdXRleCkgKQoJewoJCXJldHVybiBETUxFUlJfU1lTX0VSUk9SOwoJfQoKICAgVFJBQ0UoIkhhbmRsZSBNdXRleCBjcmVhdGVkL3Jlc2VydmVkXG4iKTsKCiAgIC8qICBGaXJzdCBjaGVjayBpbnN0YW5jZQogICAqLwogICByZWZlcmVuY2VfaW5zdCA9IEZpbmRfSW5zdGFuY2VfRW50cnkoaWRJbnN0KTsKICAgdGhpc19pbnN0YW5jZSA9IHJlZmVyZW5jZV9pbnN0OwogICBpZiAgKHJlZmVyZW5jZV9pbnN0ID09IE5VTEwpCiAgIHsKCVRSQUNFKCJJbnN0YW5jZSBub3QgZm91bmQgYXMgaW5pdGlhbGlzZWRcbiIpOwogICAgICAgIGlmICggUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UsdGhpc19pbnN0YW5jZSkpIHJldHVybiBUUlVFOwogICAgICAgICAgLyogIE5vdGhpbmcgaGFzIGJlZW4gaW5pdGlhbGlzZWQgLSBleGl0IG5vdyAhIGNhbiByZXR1cm4gVFJVRSBzaW5jZSBlZmZlY3QgaXMgdGhlIHNhbWUgKi8KICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgIH0KCiAgaWYgKCBoc3oyICE9IDBMICkKICB7CgkvKglJbGxlZ2FsLCByZXNlcnZlZCBwYXJhbWV0ZXIKCSAqLwoJcmVmZXJlbmNlX2luc3QtPkxhc3RfRXJyb3IgPSBETUxFUlJfSU5WQUxJRFBBUkFNRVRFUjsKICAJUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UsdGhpc19pbnN0YW5jZSk7CglGSVhNRSgiUmVzZXJ2ZWQgcGFyYW1ldGVyIG5vLXplcm8gISFcbiIpOwoJcmV0dXJuIEZBTFNFOwogIH0KICBpZiAoIGhzejEgPT0gMEwgKQogIHsKCS8qCgkgKglHZW5lcmFsIHVucmVnaXN0ZXIgc2l0dWF0aW9uCgkgKi8KICAgICAgICBpZiAoIGFmQ21kICE9IEROU19VTlJFR0lTVEVSICkKCXsKCQkvKglkb24ndCBrbm93IGlmIHdlIHNob3VsZCBjaGVjayB0aGlzIGJ1dCBpdCBtYWtlcyBzZW5zZQoJCSAqCXdoeSBzdXBwbHkgUkVHSVNURVIgb3IgZmlsdGVyIGZsYWdzIGlmIGRlLXJlZ2lzdGVyaW5nIGFsbAoJCSAqLwogICAJCVRSQUNFKCJHZW5lcmFsIHVucmVnaXN0ZXIgdW5leHBlY3RlZCBmbGFnc1xuIik7CgkJcmVmZXJlbmNlX2luc3QtPkxhc3RfRXJyb3IgPSBETUxFUlJfRExMX1VTQUdFOwogIAkJUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UsdGhpc19pbnN0YW5jZSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoJLyoJTG9vcCB0byBmaW5kIGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgYW5kIGRlLXJlZ2lzdGVyIHRoZW0KCSAqLwoJaWYgKCByZWZlcmVuY2VfaW5zdC0+U2VydmljZU5hbWVzID09IE5VTEwgKQoJewoJCS8qICBOb25lIHRvIHVucmVnaXN0ZXIgISEgIAoJCSAqLwoJCVRSQUNFKCJHZW5lcmFsIGRlLXJlZ2lzdGVyIC0gbm90aGluZyByZWdpc3RlcmVkXG4iKTsKCQlyZWZlcmVuY2VfaW5zdC0+TGFzdF9FcnJvciA9IERNTEVSUl9ETExfVVNBR0U7CiAgCQlSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxGQUxTRSx0aGlzX2luc3RhbmNlKTsKCQlyZXR1cm4gRkFMU0U7Cgl9ICBlbHNlCgl7CgkJdGhpc19zZXJ2aWNlID0gcmVmZXJlbmNlX2luc3QtPlNlcnZpY2VOYW1lczsKCQl3aGlsZSAoIHRoaXNfc2VydmljZS0+bmV4dCAhPSBOVUxMKQoJCXsKCQkJVFJBQ0UoImdlbmVyYWwgZGVyZWdpc3RlciAtIGl0ZXJhdGlvblxuIik7CgkJCXJlZmVyZW5jZV9zZXJ2aWNlID0gdGhpc19zZXJ2aWNlOwoJCQl0aGlzX3NlcnZpY2UgPSB0aGlzX3NlcnZpY2UtPm5leHQ7CgkJCURkZVJlbGVhc2VBdG9tKHJlZmVyZW5jZV9pbnN0LHJlZmVyZW5jZV9zZXJ2aWNlLT5oc3opOwogICAgICAgIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcmVmZXJlbmNlX3NlcnZpY2UpOyAvKiBmaW5pc2hlZCAtIHJlbGVhc2UgaGVhcCBzcGFjZSB1c2VkIGFzIHdvcmsgc3RvcmUgKi8KCQl9CgkJRGRlUmVsZWFzZUF0b20ocmVmZXJlbmNlX2luc3QsdGhpc19zZXJ2aWNlLT5oc3opOwogICAgICAgIAlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aGlzX3NlcnZpY2UpOyAvKiBmaW5pc2hlZCAtIHJlbGVhc2UgaGVhcCBzcGFjZSB1c2VkIGFzIHdvcmsgc3RvcmUgKi8KCQlyZWZlcmVuY2VfaW5zdC0+U2VydmljZU5hbWVzID0gTlVMTDsKCQlUUkFDRSgiR2VuZXJhbCBkZS1yZWdpc3RlciAtIGZpbmlzaGVkXG4iKTsKCX0KICAJUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UsdGhpc19pbnN0YW5jZSk7CiAgCXJldHVybiBUUlVFOwogIH0KICBUUkFDRSgiU3BlY2lmaWMgbmFtZSBhY3Rpb24gZGV0ZWN0ZWRcbiIpOwogIGlmICggYWZDbWQgJiBETlNfUkVHSVNURVIgKQogIHsKCS8qIFJlZ2lzdGVyIG5ldyBzZXJ2aWNlIG5hbWUKCSAqLwoKCXRoaXNfc2VydmljZSA9IEZpbmRfU2VydmljZV9OYW1lKCBoc3oxLCByZWZlcmVuY2VfaW5zdCApOwoJaWYgKCB0aGlzX3NlcnZpY2UgKQoJCUVSUigiVHJ5aW5nIHRvIHJlZ2lzdGVyIGFscmVhZHkgcmVnaXN0ZXJlZCBzZXJ2aWNlIVxuIik7CgllbHNlCgl7CgkJVFJBQ0UoIkFkZGluZyBzZXJ2aWNlIG5hbWVcbiIpOwoKCQlEZGVSZXNlcnZlQXRvbShyZWZlcmVuY2VfaW5zdCwgaHN6MSk7CgoJCXRoaXNfc2VydmljZSA9IChTZXJ2aWNlTm9kZSopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoU2VydmljZU5vZGUpICk7CgkJdGhpc19zZXJ2aWNlLT5oc3ogPSBoc3oxOwoJCXRoaXNfc2VydmljZS0+RmlsdGVyT24gPSBUUlVFOwoKCQl0aGlzX3NlcnZpY2UtPm5leHQgPSByZWZlcmVuY2VfaW5zdC0+U2VydmljZU5hbWVzOwoJCXJlZmVyZW5jZV9pbnN0LT5TZXJ2aWNlTmFtZXMgPSB0aGlzX3NlcnZpY2U7Cgl9CiAgfQogIGlmICggYWZDbWQgJiBETlNfVU5SRUdJU1RFUiApCiAgewoJLyoJRGUtcmVnaXN0ZXIgc2VydmljZSBuYW1lCgkgKi8KCglTZXJ2aWNlTm9kZSAqKnBTZXJ2aWNlTm9kZSA9ICZyZWZlcmVuY2VfaW5zdC0+U2VydmljZU5hbWVzOwoJd2hpbGUgKCAqcFNlcnZpY2VOb2RlICYmICgqcFNlcnZpY2VOb2RlKS0+aHN6ICE9IGhzejEgKQoJCXBTZXJ2aWNlTm9kZSA9ICYoKnBTZXJ2aWNlTm9kZSktPm5leHQ7CgoJdGhpc19zZXJ2aWNlID0gKnBTZXJ2aWNlTm9kZTsKCWlmICggIXRoaXNfc2VydmljZSApCgkJRVJSKCJUcnlpbmcgdG8gZGUtcmVnaXN0ZXIgdW5yZWdpc3RlcmVkIHNlcnZpY2UhXG4iKTsKCWVsc2UKCXsKCQkqcFNlcnZpY2VOb2RlID0gdGhpc19zZXJ2aWNlLT5uZXh0OwoJCURkZVJlbGVhc2VBdG9tKHJlZmVyZW5jZV9pbnN0LHRoaXNfc2VydmljZS0+aHN6KTsKICAgICAgICAJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGhpc19zZXJ2aWNlKTsKIAl9CiAgfQogIGlmICggYWZDbWQgJiBETlNfRklMVEVST04gKQogIHsKCS8qCVNldCBmaWx0ZXIgZmxhZ3Mgb24gdG8gaG9sZCBub3RpZmljYXRpb25zIG9mIGNvbm5lY3Rpb24KCSAqCgkgKgl0ZXN0IGNvZGVkIHRoaXMgd2F5IGFzIHRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZwoJICovCgl0aGlzX3NlcnZpY2UgPSBGaW5kX1NlcnZpY2VfTmFtZSggaHN6MSwgcmVmZXJlbmNlX2luc3QgKTsKCWlmICggIXRoaXNfc2VydmljZSApCgl7CgkJLyogIHRyeWluZyB0byBmaWx0ZXIgd2hlcmUgbm8gc2VydmljZSBuYW1lcyAhIQoJCSAqLwoJCXJlZmVyZW5jZV9pbnN0LT5MYXN0X0Vycm9yID0gRE1MRVJSX0RMTF9VU0FHRTsKICAJCVJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLEZBTFNFLEZBTFNFLHRoaXNfaW5zdGFuY2UpOwoJCXJldHVybiBGQUxTRTsKCX0gZWxzZSAKCXsKCQl0aGlzX3NlcnZpY2UtPkZpbHRlck9uID0gVFJVRTsKCX0KICB9CiAgaWYgKCBhZkNtZCAmIEROU19GSUxURVJPRkYgKQogIHsKCS8qCVNldCBmaWx0ZXIgZmxhZ3Mgb24gdG8gaG9sZCBub3RpZmljYXRpb25zIG9mIGNvbm5lY3Rpb24KCSAqLwoJdGhpc19zZXJ2aWNlID0gRmluZF9TZXJ2aWNlX05hbWUoIGhzejEsIHJlZmVyZW5jZV9pbnN0ICk7CglpZiAoICF0aGlzX3NlcnZpY2UgKQoJewoJCS8qICB0cnlpbmcgdG8gZmlsdGVyIHdoZXJlIG5vIHNlcnZpY2UgbmFtZXMgISEKCQkgKi8KCQlyZWZlcmVuY2VfaW5zdC0+TGFzdF9FcnJvciA9IERNTEVSUl9ETExfVVNBR0U7CiAgCQlSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxGQUxTRSx0aGlzX2luc3RhbmNlKTsKCQlyZXR1cm4gRkFMU0U7Cgl9IGVsc2UgCgl7CgkJdGhpc19zZXJ2aWNlLT5GaWx0ZXJPbiA9IEZBTFNFOwoJfQogIH0KICBSZWxlYXNlX3Jlc2VydmVkX211dGV4KGhhbmRsZV9tdXRleCwiaGFuZGxlX211dGV4IixGQUxTRSxGQUxTRSx0aGlzX2luc3RhbmNlKTsKICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZUdldExhc3RFcnJvcjE2ICAoRERFTUwuMjApCiAqLwpVSU5UMTYgV0lOQVBJIERkZUdldExhc3RFcnJvcjE2KCBEV09SRCBpZEluc3QgKQp7CiAgICByZXR1cm4gKFVJTlQxNilEZGVHZXRMYXN0RXJyb3IoIGlkSW5zdCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEZGVHZXRMYXN0RXJyb3IgW1VTRVIzMi4xMDNdICBHZXRzIG1vc3QgcmVjZW50IGVycm9yIGNvZGUKICoKICogUEFSQU1TCiAqICAgIGlkSW5zdCBbSV0gSW5zdGFuY2UgaWRlbnRpZmllcgogKgogKiBSRVRVUk5TCiAqICAgIExhc3QgZXJyb3IgY29kZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICBDaGFuZ2UgSGlzdG9yeQogKgogKiAgVm4gICAgICAgRGF0ZSAgICAgICBBdXRob3IgICAgICAgICAgICAgICAgICBDb21tZW50CiAqCiAqICAxLjAgICAgICA/ICAgICAgICAgICAgPyAgICAgICAgICAgICAgICBTdHViCiAqICAxLjEgICAgICBBcHIgMTk5OSAgS2VpdGggTWF0dGhld3MgICAgICBBZGRlZCByZXNwb25zZSBmb3Igbm9uLWV4aXN0ZW50IGluc3RhbmNlICh1bmluaXRpYWxpc2VkIGluc3RhbmNlIDAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSBzb21lIE1TIHByb2dyYW1zIGZvciB1bmZhdGhvbWFibGUgcmVhc29ucykKICogIDEuMgkgICAgIE1heSAxOTk5ICBLZWl0aCBNYXR0aGV3cwkgICBBZGRlZCBpbnRlcnJvZ2F0aW9uIG9mIExhc3RfRXJyb3IgZm9yIGluc3RhbmNlIGhhbmRsZSB3aGVyZSBmb3VuZC4KICoKICovClVJTlQgV0lOQVBJIERkZUdldExhc3RFcnJvciggRFdPUkQgaWRJbnN0ICkKewogICAgRFdPUkQJZXJyb3JfY29kZTsKICAgIERERV9IQU5ETEVfRU5UUlkgKnJlZmVyZW5jZV9pbnN0OwoKICAgIEZJWE1FKCIoJWxkKTogc3R1YlxuIixpZEluc3QpOwoKICAgIGlmICggRERFX01heF9Bc3NpZ25lZF9JbnN0YW5jZSA9PSAwICkKICAgIHsKICAgICAgICAgIC8qICBOb3RoaW5nIGhhcyBiZWVuIGluaXRpYWxpc2VkIC0gZXhpdCBub3cgISAqLwogICAgICAgICAgcmV0dXJuIERNTEVSUl9ETExfTk9UX0lOSVRJQUxJWkVEOwogICAgfQoKCWlmICggIVdhaXRGb3JNdXRleChoYW5kbGVfbXV0ZXgpICkKCXsKCQlyZXR1cm4gRE1MRVJSX1NZU19FUlJPUjsKCX0KCiAgIFRSQUNFKCJIYW5kbGUgTXV0ZXggY3JlYXRlZC9yZXNlcnZlZFxuIik7CgogICAvKiAgRmlyc3QgY2hlY2sgaW5zdGFuY2UKICAgKi8KICAgcmVmZXJlbmNlX2luc3QgPSBGaW5kX0luc3RhbmNlX0VudHJ5KGlkSW5zdCk7CiAgIGlmICAocmVmZXJlbmNlX2luc3QgPT0gTlVMTCkgCiAgIHsKICAgICAgICBpZiAoIFJlbGVhc2VfcmVzZXJ2ZWRfbXV0ZXgoaGFuZGxlX211dGV4LCJoYW5kbGVfbXV0ZXgiLEZBTFNFLEZBTFNFLHJlZmVyZW5jZV9pbnN0KSkgcmV0dXJuIFRSVUU7CiAgICAgICAgICAvKiAgTm90aGluZyBoYXMgYmVlbiBpbml0aWFsaXNlZCAtIGV4aXQgbm93ICEgY2FuIHJldHVybiBUUlVFIHNpbmNlIGVmZmVjdCBpcyB0aGUgc2FtZSAqLwogICAgICAgICAgcmV0dXJuIERNTEVSUl9ETExfTk9UX0lOSVRJQUxJWkVEOwoKICAgfQogICAgZXJyb3JfY29kZSA9IHJlZmVyZW5jZV9pbnN0LT5MYXN0X0Vycm9yOwogICAgcmVmZXJlbmNlX2luc3QtPkxhc3RfRXJyb3IgPSAwOwogICAgUmVsZWFzZV9yZXNlcnZlZF9tdXRleChoYW5kbGVfbXV0ZXgsImhhbmRsZV9tdXRleCIsRkFMU0UsRkFMU0UscmVmZXJlbmNlX2luc3QpOwogICByZXR1cm4gZXJyb3JfY29kZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZUNtcFN0cmluZ0hhbmRsZXMxNiAoRERFTUwuMzYpCiAqLwpJTlQxNiBXSU5BUEkgRGRlQ21wU3RyaW5nSGFuZGxlczE2KCBIU1ogaHN6MSwgSFNaIGhzejIgKQp7CiAgICAgcmV0dXJuIERkZUNtcFN0cmluZ0hhbmRsZXMoaHN6MSwgaHN6Mik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIERkZUNtcFN0cmluZ0hhbmRsZXMgKFVTRVIzMi45MSkKICoKICogQ29tcGFyZXMgdGhlIHZhbHVlIG9mIHR3byBzdHJpbmcgaGFuZGxlcy4gIFRoaXMgY29tcGFyaXNvbiBpcwogKiBub3QgY2FzZSBzZW5zaXRpdmUuCiAqCiAqIFJldHVybnM6CiAqIC0xIFRoZSB2YWx1ZSBvZiBoc3oxIGlzIHplcm8gb3IgbGVzcyB0aGFuIGhzejIKICogMCAgVGhlIHZhbHVlcyBvZiBoc3ogMSBhbmQgMiBhcmUgdGhlIHNhbWUgb3IgYm90aCB6ZXJvLgogKiAxICBUaGUgdmFsdWUgb2YgaHN6MiBpcyB6ZXJvIG9mIGxlc3MgdGhhbiBoc3oxCiAqLwpJTlQgV0lOQVBJIERkZUNtcFN0cmluZ0hhbmRsZXMoIEhTWiBoc3oxLCBIU1ogaHN6MiApCnsKICAgIENIQVIgcHN6MVtNQVhfQlVGRkVSX0xFTl07CiAgICBDSEFSIHBzejJbTUFYX0JVRkZFUl9MRU5dOwogICAgaW50IHJldCA9IDA7CiAgICBpbnQgcmV0MSwgcmV0MjsKCiAgICBUUkFDRSgiaGFuZGxlIDEsIGhhbmRsZSAyXG4iICk7CgogICAgcmV0MSA9IEdsb2JhbEdldEF0b21OYW1lQSggaHN6MSwgcHN6MSwgTUFYX0JVRkZFUl9MRU4gKTsKICAgIHJldDIgPSBHbG9iYWxHZXRBdG9tTmFtZUEoIGhzejIsIHBzejIsIE1BWF9CVUZGRVJfTEVOICk7CiAgICAvKiBNYWtlIHN1cmUgd2UgZm91bmQgYm90aCBzdHJpbmdzLgogICAgICovCiAgICBpZiggcmV0MSA9PSAwICYmIHJldDIgPT0gMCApCiAgICB7CiAgICAgICAgLyogSWYgYm90aCBhcmUgbm90IGZvdW5kLCByZXR1cm4gYm90aCAgInplcm8gc3RyaW5ncyIuCiAgICAgICAgICovCiAgICAgICAgcmV0ID0gMDsKICAgIH0KICAgIGVsc2UgaWYoIHJldDEgPT0gMCApCiAgICB7CiAgICAgICAgLyogSWYgaHN6MSBpcyBhIG5vdCBmb3VuZCwgcmV0dXJuIGhzejEgaXMgInplcm8gc3RyaW5nIi4KICAgICAgICAgKi8KICAgICAgICByZXQgPSAtMTsKICAgIH0KICAgIGVsc2UgaWYoIHJldDIgPT0gMCApCiAgICB7CiAgICAgICAgLyogSWYgaHN6MiBpcyBhIG5vdCBmb3VuZCwgcmV0dXJuIGhzejIgaXMgInplcm8gc3RyaW5nIi4KICAgICAgICAgKi8KICAgICAgICByZXQgPSAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIENvbXBhcmUgdGhlIHR3byBzdHJpbmdzIHdlIGdvdCAoIGNhc2UgaW5zZW5zaXRpdmUgKS4KICAgICAgICAgKi8KICAgICAgICByZXQgPSBzdHJjYXNlY21wKCBwc3oxLCBwc3oyICk7CiAgICAgICAgLyogU2luY2Ugc3RyY21wIHJldHVybnMgYW55IG51bWJlciBzbWFsbGVyIHRoYW4KICAgICAgICAgKiAwIHdoZW4gdGhlIGZpcnN0IHN0cmluZyBpcyBmb3VuZCB0byBiZSBsZXNzIHRoYW4KICAgICAgICAgKiB0aGUgc2Vjb25kIG9uZSB3ZSBtdXN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmV0dXJuaW5nCiAgICAgICAgICogdGhlIHByb3BlciB2YWx1ZXMuCiAgICAgICAgICovCiAgICAgICAgaWYoIHJldCA8IDAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIHJldCA+IDAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgUGFja0RERWxQYXJhbSAoVVNFUjMyLjQxNCkKICoKICogUkVUVVJOUwogKiAgIHN1Y2Nlc3M6IG5vbnplcm8KICogICBmYWlsdXJlOiB6ZXJvCiAqLwpVSU5UIFdJTkFQSSBQYWNrRERFbFBhcmFtKFVJTlQgbXNnLCBVSU5UIHVpTG8sIFVJTlQgdWlIaSkKewogICAgRklYTUUoInN0dWIuXG4iKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgVW5wYWNrRERFbFBhcmFtIChVU0VSMzIuNTYyKQogKgogKiBSRVRVUk5TCiAqICAgc3VjY2Vzczogbm9uemVybwogKiAgIGZhaWx1cmU6IHplcm8KICovClVJTlQgV0lOQVBJIFVucGFja0RERWxQYXJhbShVSU5UIG1zZywgVUlOVCBsUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnVpTG8sIFVJTlQgKnVpSGkpCnsKICAgIEZJWE1FKCJzdHViLlxuIik7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgIEZyZWVEREVsUGFyYW0gKFVTRVIzMi4yMDQpCiAqCiAqIFJFVFVSTlMKICogICBzdWNjZXNzOiBub256ZXJvCiAqICAgZmFpbHVyZTogemVybwogKi8KVUlOVCBXSU5BUEkgRnJlZURERWxQYXJhbShVSU5UIG1zZywgVUlOVCBsUGFyYW0pCnsKICAgIEZJWE1FKCJzdHViLlxuIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgUmV1c2VEREVsUGFyYW0gKFVTRVIzMi40NDYpCiAqCiAqLwpVSU5UIFdJTkFQSSBSZXVzZURERWxQYXJhbShVSU5UIGxQYXJhbSwgVUlOVCBtc2dJbiwgVUlOVCBtc2dPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1aUxpLCBVSU5UIHVpSGkpCnsKICAgIEZJWE1FKCJzdHViLlxuIik7CiAgICByZXR1cm4gMDsKfSAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCURkZVF1ZXJ5Q29udkluZm8xNiAoRERFTUwuOSkKICoKICovClVJTlQxNiBXSU5BUEkgRGRlUXVlcnlDb252SW5mbzE2KCBIQ09OViBoY29udiwgRFdPUkQgaWRUcmFuc2FjdGlvbiAsIExQQ09OVklORk8xNiBscENvbnZJbmZvKQp7CglGSVhNRSgic3R1Yi5cbiIpOwoJcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlEZGVRdWVyeUNvbnZJbmZvIChVU0VSMzIuMTExKQogKgogKi8KVUlOVCBXSU5BUEkgRGRlUXVlcnlDb252SW5mbyggSENPTlYgaGNvbnYsIERXT1JEIGlkVHJhbnNhY3Rpb24gLCBMUENPTlZJTkZPIGxwQ29udkluZm8pCnsKCUZJWE1FKCJzdHViLlxuIik7CglyZXR1cm4gMDsKfQo=