LyoKICoJQXV0b0NvbXBsZXRlIGludGVyZmFjZXMgaW1wbGVtZW50YXRpb24uCiAqCiAqCUNvcHlyaWdodCAyMDA0CU1heGltZSBCZWxsZW5n6SA8bWF4aW1lLmJlbGxlbmdlQGxhcG9zdGUubmV0PgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgovKgogIEltcGxlbWVudGVkOgogIC0gQUNPX0FVVE9BUFBFTkQgc3R5bGUKICAtIEFDT19BVVRPU1VHR0VTVCBzdHlsZQogIC0gQUNPX1VQRE9XTktFWURST1BTTElTVCBzdHlsZQoKICAtIEhhbmRsZSBwd3pzUmVnS2V5UGF0aCBhbmQgcHdzelF1aWNrQ29tcGxldGUgaW4gSW5pdAoKICBUT0RPOgogIC0gaW1wbGVtZW50IEFDT19TRUFSQ0ggc3R5bGUKICAtIGltcGxlbWVudCBBQ09fRklMVEVSUFJFRklYRVMgc3R5bGUKICAtIGltcGxlbWVudCBBQ09fVVNFVEFCIHN0eWxlCiAgLSBpbXBsZW1lbnQgQUNPX1JUTFJFQURJTkcgc3R5bGUKICAKICovCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIENPQkpNQUNST1MKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAidW5kb2NzaGVsbC5oIgojaW5jbHVkZSAic2hsd2FwaS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIm9iamJhc2UuaCIKCiNpbmNsdWRlICJwaWRsLmgiCiNpbmNsdWRlICJzaGxndWlkLmgiCiNpbmNsdWRlICJzaGxvYmouaCIKI2luY2x1ZGUgInNobGRpc3AuaCIKI2luY2x1ZGUgImRlYnVnaGxwLmgiCgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChzaGVsbCk7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBjb25zdCBJQXV0b0NvbXBsZXRlVnRibCAgKmxwVnRibDsKICAgIGNvbnN0IElBdXRvQ29tcGxldGUyVnRibCAqbHB2dGJsQXV0b0NvbXBsZXRlMjsKICAgIExPTkcgcmVmOwogICAgQk9PTCAgZW5hYmxlZDsKICAgIEhXTkQgaHduZEVkaXQ7CiAgICBIV05EIGh3bmRMaXN0Qm94OwogICAgV05EUFJPQyB3cE9yaWdFZGl0UHJvYzsKICAgIFdORFBST0Mgd3BPcmlnTEJveFByb2M7CiAgICBXQ0hBUiAqdHh0YmFja3VwOwogICAgV0NIQVIgKnF1aWNrQ29tcGxldGU7CiAgICBJRW51bVN0cmluZyAqZW51bXN0cjsKICAgIEFVVE9DT01QTEVURU9QVElPTlMgb3B0aW9uczsKfSBJQXV0b0NvbXBsZXRlSW1wbDsKCnN0YXRpYyBjb25zdCBJQXV0b0NvbXBsZXRlVnRibCBhY3Z0OwpzdGF0aWMgY29uc3QgSUF1dG9Db21wbGV0ZTJWdGJsIGFjMnZ0OwoKI2RlZmluZSBfSUF1dG9Db21wbGV0ZTJfT2Zmc2V0ICgoaW50KSgmKCgoSUF1dG9Db21wbGV0ZUltcGwqKTApLT5scHZ0YmxBdXRvQ29tcGxldGUyKSkpCiNkZWZpbmUgX0lDT01fVEhJU19Gcm9tX0lBdXRvQ29tcGxldGUyKGNsYXNzLCBuYW1lKSBjbGFzcyogVGhpcyA9IChjbGFzcyopKCgoY2hhciopbmFtZSktX0lBdXRvQ29tcGxldGUyX09mZnNldCk7CgovKgogIGNvbnZlcnRzIFRoaXMgdG8gYW4gaW50ZXJmYWNlIHBvaW50ZXIKKi8KI2RlZmluZSBfSVVua25vd25fKFRoaXMpIChJVW5rbm93biopJihUaGlzLT5scFZ0YmwpCiNkZWZpbmUgX0lBdXRvQ29tcGxldGUyXyhUaGlzKSAgKElBdXRvQ29tcGxldGUyKikmKFRoaXMtPmxwdnRibEF1dG9Db21wbGV0ZTIpIAoKc3RhdGljIExSRVNVTFQgQVBJRU5UUlkgQUNFZGl0U3ViY2xhc3NQcm9jKEhXTkQgaHduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKc3RhdGljIExSRVNVTFQgQVBJRU5UUlkgQUNMQm94U3ViY2xhc3NQcm9jKEhXTkQgaHduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgSUF1dG9Db21wbGV0ZV9Db25zdHJ1Y3RvcgogKi8KSFJFU1VMVCBXSU5BUEkgSUF1dG9Db21wbGV0ZV9Db25zdHJ1Y3RvcihJVW5rbm93biAqIHBVbmtPdXRlciwgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdikKewogICAgSUF1dG9Db21wbGV0ZUltcGwgKmxwYWM7CgogICAgaWYgKHBVbmtPdXRlciAmJiAhSXNFcXVhbElJRCAocmlpZCwgJklJRF9JVW5rbm93bikpCglyZXR1cm4gQ0xBU1NfRV9OT0FHR1JFR0FUSU9OOwoKICAgIGxwYWMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElBdXRvQ29tcGxldGVJbXBsKSk7CiAgICBpZiAoIWxwYWMpIAoJcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgogICAgbHBhYy0+cmVmID0gMTsKICAgIGxwYWMtPmxwVnRibCA9ICZhY3Z0OwogICAgbHBhYy0+bHB2dGJsQXV0b0NvbXBsZXRlMiA9ICZhYzJ2dDsKICAgIGxwYWMtPmVuYWJsZWQgPSBUUlVFOwogICAgbHBhYy0+ZW51bXN0ciA9IE5VTEw7CiAgICBscGFjLT5vcHRpb25zID0gQUNPX0FVVE9BUFBFTkQ7CiAgICBscGFjLT53cE9yaWdFZGl0UHJvYyA9IE5VTEw7CiAgICBscGFjLT5od25kTGlzdEJveCA9IE5VTEw7CiAgICBscGFjLT50eHRiYWNrdXAgPSBOVUxMOwogICAgbHBhYy0+cXVpY2tDb21wbGV0ZSA9IE5VTEw7CiAgICAKICAgIGlmICghU1VDQ0VFREVEIChJVW5rbm93bl9RdWVyeUludGVyZmFjZSAoX0lVbmtub3duXyAobHBhYyksIHJpaWQsIHBwdikpKSB7CglJVW5rbm93bl9SZWxlYXNlIChfSVVua25vd25fIChscGFjKSk7CglyZXR1cm4gRV9OT0lOVEVSRkFDRTsKICAgIH0KICAgIAogICAgVFJBQ0UoIi0tICglcCktPlxuIixscGFjKTsKCiAgICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBBdXRvQ29tcGxldGVfUXVlcnlJbnRlcmZhY2UKICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQXV0b0NvbXBsZXRlX2ZuUXVlcnlJbnRlcmZhY2UoCiAgICBJQXV0b0NvbXBsZXRlICogaWZhY2UsCiAgICBSRUZJSUQgcmlpZCwKICAgIExQVk9JRCAqcHB2T2JqKQp7CiAgICBJQXV0b0NvbXBsZXRlSW1wbCAqVGhpcyA9IChJQXV0b0NvbXBsZXRlSW1wbCAqKWlmYWNlOwogICAgCiAgICBUUkFDRSgiKCVwKS0+KFxuXHRJSUQ6XHQlcywlcClcbiIsIFRoaXMsIHNoZGVidWdzdHJfZ3VpZChyaWlkKSwgcHB2T2JqKTsKICAgICpwcHZPYmogPSBOVUxMOwoKICAgIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpIAogICAgewoJKnBwdk9iaiA9IFRoaXM7CiAgICB9IAogICAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSUF1dG9Db21wbGV0ZSkpCiAgICB7CgkqcHB2T2JqID0gKElBdXRvQ29tcGxldGUqKVRoaXM7CiAgICB9CiAgICBlbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JQXV0b0NvbXBsZXRlMikpCiAgICB7CgkqcHB2T2JqID0gX0lBdXRvQ29tcGxldGUyXyAoVGhpcyk7CiAgICB9CgogICAgaWYgKCpwcHZPYmopCiAgICB7CglJQXV0b0NvbXBsZXRlX0FkZFJlZigoSUF1dG9Db21wbGV0ZSopKnBwdk9iaik7CglUUkFDRSgiLS0gSW50ZXJmYWNlOiAoJXApLT4oJXApXG4iLCBwcHZPYmosICpwcHZPYmopOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBUUkFDRSgiLS0gSW50ZXJmYWNlOiBFX05PSU5URVJGQUNFXG4iKTsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwkKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJQXV0b0NvbXBsZXRlX2ZuQWRkUmVmCiAqLwpzdGF0aWMgVUxPTkcgV0lOQVBJIElBdXRvQ29tcGxldGVfZm5BZGRSZWYoCglJQXV0b0NvbXBsZXRlICogaWZhY2UpCnsKICAgIElBdXRvQ29tcGxldGVJbXBsICpUaGlzID0gKElBdXRvQ29tcGxldGVJbXBsICopaWZhY2U7CiAgICBVTE9ORyByZWZDb3VudCA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwogICAgCiAgICBUUkFDRSgiKCVwKS0+KCVsdSlcbiIsIFRoaXMsIHJlZkNvdW50IC0gMSk7CgogICAgcmV0dXJuIHJlZkNvdW50Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElBdXRvQ29tcGxldGVfZm5SZWxlYXNlCiAqLwpzdGF0aWMgVUxPTkcgV0lOQVBJIElBdXRvQ29tcGxldGVfZm5SZWxlYXNlKAoJSUF1dG9Db21wbGV0ZSAqIGlmYWNlKQp7CiAgICBJQXV0b0NvbXBsZXRlSW1wbCAqVGhpcyA9IChJQXV0b0NvbXBsZXRlSW1wbCAqKWlmYWNlOwogICAgVUxPTkcgcmVmQ291bnQgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKICAgIAogICAgVFJBQ0UoIiglcCktPiglbHUpXG4iLCBUaGlzLCByZWZDb3VudCArIDEpOwoKICAgIGlmICghcmVmQ291bnQpIHsKCVRSQUNFKCIgZGVzdHJveWluZyBJQXV0b0NvbXBsZXRlKCVwKVxuIixUaGlzKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5xdWlja0NvbXBsZXRlKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT50eHRiYWNrdXApOwoJaWYgKFRoaXMtPmh3bmRMaXN0Qm94KQoJICAgIERlc3Ryb3lXaW5kb3coVGhpcy0+aHduZExpc3RCb3gpOwoJaWYgKFRoaXMtPmVudW1zdHIpCgkgICAgSUVudW1TdHJpbmdfUmVsZWFzZShUaGlzLT5lbnVtc3RyKTsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwogICAgfQogICAgcmV0dXJuIHJlZkNvdW50Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElBdXRvQ29tcGxldGVfZm5FbmFibGUKICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQXV0b0NvbXBsZXRlX2ZuRW5hYmxlKAogICAgSUF1dG9Db21wbGV0ZSAqIGlmYWNlLAogICAgQk9PTCBmRW5hYmxlKQp7CiAgICBJQXV0b0NvbXBsZXRlSW1wbCAqVGhpcyA9IChJQXV0b0NvbXBsZXRlSW1wbCAqKWlmYWNlOwoKICAgIEhSRVNVTFQgaHIgPSBTX09LOwoKICAgIFRSQUNFKCIoJXApLT4oJXMpXG4iLCBUaGlzLCAoZkVuYWJsZSk/InRydWUiOiJmYWxzZSIpOwoKICAgIFRoaXMtPmVuYWJsZWQgPSBmRW5hYmxlOwoKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJQXV0b0NvbXBsZXRlX2ZuSW5pdAogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElBdXRvQ29tcGxldGVfZm5Jbml0KAogICAgSUF1dG9Db21wbGV0ZSAqIGlmYWNlLAogICAgSFdORCBod25kRWRpdCwKICAgIElVbmtub3duICpwdW5rQUNMLAogICAgTFBDT0xFU1RSIHB3enNSZWdLZXlQYXRoLAogICAgTFBDT0xFU1RSIHB3c3pRdWlja0NvbXBsZXRlKQp7CiAgICBJQXV0b0NvbXBsZXRlSW1wbCAqVGhpcyA9IChJQXV0b0NvbXBsZXRlSW1wbCAqKWlmYWNlOwogICAgc3RhdGljIGNvbnN0IFdDSEFSIGxiTmFtZVtdID0geydMJywnaScsJ3MnLCd0JywnQicsJ28nLCd4JywwfTsKCiAgICBUUkFDRSgiKCVwKS0+KDB4JTA4bHgsICVwLCAlcywgJXMpXG4iLCAKCSAgVGhpcywgKGxvbmcpaHduZEVkaXQsIHB1bmtBQ0wsIGRlYnVnc3RyX3cocHd6c1JlZ0tleVBhdGgpLCBkZWJ1Z3N0cl93KHB3c3pRdWlja0NvbXBsZXRlKSk7CgogICAgaWYgKFRoaXMtPm9wdGlvbnMgJiBBQ09fQVVUT1NVR0dFU1QpIFRSQUNFKCIgQUNPX0FVVE9TVUdHRVNUXG4iKTsKICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX0FVVE9BUFBFTkQpIFRSQUNFKCIgQUNPX0FVVE9BUFBFTkRcbiIpOwogICAgaWYgKFRoaXMtPm9wdGlvbnMgJiBBQ09fU0VBUkNIKSBGSVhNRSgiIEFDT19TRUFSQ0ggbm90IHN1cHBvcnRlZFxuIik7CiAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19GSUxURVJQUkVGSVhFUykgRklYTUUoIiBBQ09fRklMVEVSUFJFRklYRVMgbm90IHN1cHBvcnRlZFxuIik7CiAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19VU0VUQUIpIEZJWE1FKCIgQUNPX1VTRVRBQiBub3Qgc3VwcG9ydGVkXG4iKTsKICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX1VQRE9XTktFWURST1BTTElTVCkgVFJBQ0UoIiBBQ09fVVBET1dOS0VZRFJPUFNMSVNUXG4iKTsKICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX1JUTFJFQURJTkcpIEZJWE1FKCIgQUNPX1JUTFJFQURJTkcgbm90IHN1cHBvcnRlZFxuIik7CgogICAgVGhpcy0+aHduZEVkaXQgPSBod25kRWRpdDsKCiAgICBpZiAoIVNVQ0NFRURFRCAoSVVua25vd25fUXVlcnlJbnRlcmZhY2UgKHB1bmtBQ0wsICZJSURfSUVudW1TdHJpbmcsIChMUFZPSUQqKSZUaGlzLT5lbnVtc3RyKSkpIHsKCVRSQUNFKCJObyBJRW51bVN0cmluZyBpbnRlcmZhY2VcbiIpOwoJcmV0dXJuICBFX05PSU5URVJGQUNFOwogICAgfQoKICAgIFRoaXMtPndwT3JpZ0VkaXRQcm9jID0gKFdORFBST0MpIFNldFdpbmRvd0xvbmdQdHJXKCBod25kRWRpdCwgR1dMUF9XTkRQUk9DLCAoTE9OR19QVFIpIEFDRWRpdFN1YmNsYXNzUHJvYyk7CiAgICBTZXRXaW5kb3dMb25nUHRyVyggaHduZEVkaXQsIEdXTFBfVVNFUkRBVEEsIChMT05HX1BUUilUaGlzKTsKCiAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPU1VHR0VTVCkgewoJSFdORCBod25kUGFyZW50OwoKCWh3bmRQYXJlbnQgPSBHZXRQYXJlbnQoVGhpcy0+aHduZEVkaXQpOwoJCgkvKiBGSVhNRSA6IFRoZSBsaXN0Ym94IHNob3VsZCBiZSByZXNpemFibGUgd2l0aCB0aGUgbW91c2UuIFdTX1RISUNLRlJBTUUgbG9va3MgdWdseSAqLwoJVGhpcy0+aHduZExpc3RCb3ggPSBDcmVhdGVXaW5kb3dFeFcoMCwgbGJOYW1lLCBOVUxMLCAKCQkJCQkgICAgV1NfQk9SREVSIHwgV1NfQ0hJTEQgfCBXU19WU0NST0xMIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9USUZZIHwgTEJTX05PSU5URUdSQUxIRUlHSFQsIAoJCQkJCSAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAoJCQkJCSAgICBod25kUGFyZW50LCBOVUxMLCAKCQkJCQkgICAgKEhJTlNUQU5DRSlHZXRXaW5kb3dMb25nUHRyVyggaHduZFBhcmVudCwgR1dMUF9ISU5TVEFOQ0UgKSwgTlVMTCk7CgkJCQkJICAgIAoJaWYgKFRoaXMtPmh3bmRMaXN0Qm94KSB7CgkgICAgVGhpcy0+d3BPcmlnTEJveFByb2MgPSAoV05EUFJPQykgU2V0V2luZG93TG9uZ1B0clcoIFRoaXMtPmh3bmRMaXN0Qm94LCBHV0xQX1dORFBST0MsIChMT05HX1BUUikgQUNMQm94U3ViY2xhc3NQcm9jKTsKCSAgICBTZXRXaW5kb3dMb25nUHRyVyggVGhpcy0+aHduZExpc3RCb3gsIEdXTFBfVVNFUkRBVEEsIChMT05HX1BUUilUaGlzKTsKCX0KICAgIH0KCiAgICBpZiAocHd6c1JlZ0tleVBhdGgpIHsKCVdDSEFSICprZXk7CglXQ0hBUiByZXN1bHRbTUFYX1BBVEhdOwoJV0NIQVIgKnZhbHVlOwoJSEtFWSBoS2V5ID0gMDsKCUxPTkcgcmVzOwoJTE9ORyBsZW47CgoJLyogcHdzelJlZ0tleVBhdGggY29udGFpbnMgdGhlIGtleSBhcyB3ZWxsIGFzIHRoZSB2YWx1ZSwgc28gd2Ugc3BsaXQgKi8KCWtleSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCAobHN0cmxlblcocHd6c1JlZ0tleVBhdGgpKzEpKnNpemVvZihXQ0hBUikpOwoJc3RyY3B5VyhrZXksIHB3enNSZWdLZXlQYXRoKTsKCXZhbHVlID0gc3RycmNoclcoa2V5LCAnXFwnKTsKCSp2YWx1ZSA9IDA7Cgl2YWx1ZSsrOwoJLyogTm93IHZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZSBhbmQgYnVmZmVyIHRoZSBrZXkgKi8KCXJlcyA9IFJlZ09wZW5LZXlFeFcoSEtFWV9DVVJSRU5UX1VTRVIsIGtleSwgMCwgS0VZX1JFQUQsICZoS2V5KTsKCWlmIChyZXMgIT0gRVJST1JfU1VDQ0VTUykgewoJICAgIC8qIGlmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCBNU0ROIHN0YXRlcyB3ZSBtdXN0IHNlZWsgaW4gSEtFWV9MT0NBTF9NQUNISU5FICovCgkgICAgcmVzID0gUmVnT3BlbktleUV4VyhIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleSwgMCwgS0VZX1JFQUQsICZoS2V5KTsgIAoJfQoJaWYgKHJlcyA9PSBFUlJPUl9TVUNDRVNTKSB7CgkgICAgcmVzID0gUmVnUXVlcnlWYWx1ZVcoaEtleSwgdmFsdWUsIHJlc3VsdCwgJmxlbik7CgkgICAgaWYgKHJlcyA9PSBFUlJPUl9TVUNDRVNTKSB7CgkJVGhpcy0+cXVpY2tDb21wbGV0ZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4qc2l6ZW9mKFdDSEFSKSk7CgkJc3RyY3B5VyhUaGlzLT5xdWlja0NvbXBsZXRlLCByZXN1bHQpOwoJICAgIH0KCSAgICBSZWdDbG9zZUtleShoS2V5KTsKCX0KCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGtleSk7CiAgICB9CgogICAgaWYgKChwd3N6UXVpY2tDb21wbGV0ZSkgJiYgKCFUaGlzLT5xdWlja0NvbXBsZXRlKSkgewoJVGhpcy0+cXVpY2tDb21wbGV0ZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCAobHN0cmxlblcocHdzelF1aWNrQ29tcGxldGUpKzEpKnNpemVvZihXQ0hBUikpOwoJbHN0cmNweVcoVGhpcy0+cXVpY2tDb21wbGV0ZSwgcHdzelF1aWNrQ29tcGxldGUpOwogICAgfQoKICAgIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElBdXRvQ29tcGxldGVfZm5WVGFibGUKICovCnN0YXRpYyBjb25zdCBJQXV0b0NvbXBsZXRlVnRibCBhY3Z0ID0KewogICAgSUF1dG9Db21wbGV0ZV9mblF1ZXJ5SW50ZXJmYWNlLAogICAgSUF1dG9Db21wbGV0ZV9mbkFkZFJlZiwKICAgIElBdXRvQ29tcGxldGVfZm5SZWxlYXNlLAogICAgSUF1dG9Db21wbGV0ZV9mbkluaXQsCiAgICBJQXV0b0NvbXBsZXRlX2ZuRW5hYmxlLAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBBdXRvQ29tcGxldGUyX1F1ZXJ5SW50ZXJmYWNlCiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUF1dG9Db21wbGV0ZTJfZm5RdWVyeUludGVyZmFjZSgKICAgIElBdXRvQ29tcGxldGUyICogaWZhY2UsCiAgICBSRUZJSUQgcmlpZCwKICAgIExQVk9JRCAqcHB2T2JqKQp7CiAgICBfSUNPTV9USElTX0Zyb21fSUF1dG9Db21wbGV0ZTIoSUF1dG9Db21wbGV0ZUltcGwsIGlmYWNlKTsKCiAgICBUUkFDRSAoIiglcCktPiglcywlcClcbiIsIFRoaXMsIHNoZGVidWdzdHJfZ3VpZCAocmlpZCksIHBwdk9iaik7CgogICAgcmV0dXJuIElBdXRvQ29tcGxldGVfUXVlcnlJbnRlcmZhY2UoKElBdXRvQ29tcGxldGUqKVRoaXMsIHJpaWQsIHBwdk9iaik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZTJfZm5BZGRSZWYKICovCnN0YXRpYyBVTE9ORyBXSU5BUEkgSUF1dG9Db21wbGV0ZTJfZm5BZGRSZWYoCglJQXV0b0NvbXBsZXRlMiAqIGlmYWNlKQp7CiAgICBfSUNPTV9USElTX0Zyb21fSUF1dG9Db21wbGV0ZTIoSUF1dG9Db21wbGV0ZUltcGwsaWZhY2UpOwoKICAgIFRSQUNFICgiKCVwKS0+KGNvdW50PSVsdSlcbiIsIFRoaXMsIFRoaXMtPnJlZik7CgogICAgcmV0dXJuIElBdXRvQ29tcGxldGUyX0FkZFJlZigoSUF1dG9Db21wbGV0ZSopVGhpcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZTJfZm5SZWxlYXNlCiAqLwpzdGF0aWMgVUxPTkcgV0lOQVBJIElBdXRvQ29tcGxldGUyX2ZuUmVsZWFzZSgKCUlBdXRvQ29tcGxldGUyICogaWZhY2UpCnsKICAgIF9JQ09NX1RISVNfRnJvbV9JQXV0b0NvbXBsZXRlMihJQXV0b0NvbXBsZXRlSW1wbCxpZmFjZSk7CgogICAgVFJBQ0UgKCIoJXApLT4oY291bnQ9JWx1KVxuIiwgVGhpcywgVGhpcy0+cmVmKTsKCiAgICByZXR1cm4gSUF1dG9Db21wbGV0ZV9SZWxlYXNlKChJQXV0b0NvbXBsZXRlKilUaGlzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJQXV0b0NvbXBsZXRlMl9mbkVuYWJsZQogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElBdXRvQ29tcGxldGUyX2ZuRW5hYmxlKAogICAgSUF1dG9Db21wbGV0ZTIgKiBpZmFjZSwKICAgIEJPT0wgZkVuYWJsZSkKewogICAgX0lDT01fVEhJU19Gcm9tX0lBdXRvQ29tcGxldGUyKElBdXRvQ29tcGxldGVJbXBsLCBpZmFjZSk7CgogICAgVFJBQ0UgKCIoJXApLT4oJXMpXG4iLCBUaGlzLCAoZkVuYWJsZSk/InRydWUiOiJmYWxzZSIpOwoKICAgIHJldHVybiBJQXV0b0NvbXBsZXRlX0VuYWJsZSgoSUF1dG9Db21wbGV0ZSopVGhpcywgZkVuYWJsZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZTJfZm5Jbml0CiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUF1dG9Db21wbGV0ZTJfZm5Jbml0KAogICAgSUF1dG9Db21wbGV0ZTIgKiBpZmFjZSwKICAgIEhXTkQgaHduZEVkaXQsCiAgICBJVW5rbm93biAqcHVua0FDTCwKICAgIExQQ09MRVNUUiBwd3pzUmVnS2V5UGF0aCwKICAgIExQQ09MRVNUUiBwd3N6UXVpY2tDb21wbGV0ZSkKewogICAgX0lDT01fVEhJU19Gcm9tX0lBdXRvQ29tcGxldGUyKElBdXRvQ29tcGxldGVJbXBsLCBpZmFjZSk7CgogICAgVFJBQ0UoIiglcClcbiIsIFRoaXMpOwoKICAgIHJldHVybiBJQXV0b0NvbXBsZXRlX0luaXQoKElBdXRvQ29tcGxldGUqKVRoaXMsIGh3bmRFZGl0LCBwdW5rQUNMLCBwd3pzUmVnS2V5UGF0aCwgcHdzelF1aWNrQ29tcGxldGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElBdXRvQ29tcGxldGVfZm5HZXRPcHRpb25zCiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUF1dG9Db21wbGV0ZTJfZm5HZXRPcHRpb25zKAogICAgSUF1dG9Db21wbGV0ZTIgKiBpZmFjZSwKICAgIERXT1JEICpwZHdGbGFnKQp7CiAgICBIUkVTVUxUIGhyID0gU19PSzsKCiAgICBfSUNPTV9USElTX0Zyb21fSUF1dG9Db21wbGV0ZTIoSUF1dG9Db21wbGV0ZUltcGwsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKSAtPiAoJXApXG4iLCBUaGlzLCBwZHdGbGFnKTsKCiAgICAqcGR3RmxhZyA9IFRoaXMtPm9wdGlvbnM7CgogICAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElBdXRvQ29tcGxldGVfZm5TZXRPcHRpb25zCiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUF1dG9Db21wbGV0ZTJfZm5TZXRPcHRpb25zKAogICAgSUF1dG9Db21wbGV0ZTIgKiBpZmFjZSwKICAgIERXT1JEIGR3RmxhZykKewogICAgSFJFU1VMVCBociA9IFNfT0s7CgogICAgX0lDT01fVEhJU19Gcm9tX0lBdXRvQ29tcGxldGUyKElBdXRvQ29tcGxldGVJbXBsLCBpZmFjZSk7CgogICAgVFJBQ0UoIiglcCkgLT4gKDB4JWx4KVxuIiwgVGhpcywgZHdGbGFnKTsKCiAgICBUaGlzLT5vcHRpb25zID0gZHdGbGFnOwoKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBJQXV0b0NvbXBsZXRlMl9mblZUYWJsZQogKi8Kc3RhdGljIGNvbnN0IElBdXRvQ29tcGxldGUyVnRibCBhYzJ2dCA9CnsKICAgIElBdXRvQ29tcGxldGUyX2ZuUXVlcnlJbnRlcmZhY2UsCiAgICBJQXV0b0NvbXBsZXRlMl9mbkFkZFJlZiwKICAgIElBdXRvQ29tcGxldGUyX2ZuUmVsZWFzZSwKICAgIElBdXRvQ29tcGxldGUyX2ZuSW5pdCwKICAgIElBdXRvQ29tcGxldGUyX2ZuRW5hYmxlLAogICAgLyogSUF1dG9Db21wbGV0ZTIgKi8KICAgIElBdXRvQ29tcGxldGUyX2ZuU2V0T3B0aW9ucywKICAgIElBdXRvQ29tcGxldGUyX2ZuR2V0T3B0aW9ucywKfTsKCi8qCiAgV2luZG93IHByb2NlZHVyZSBmb3IgYXV0b2NvbXBsZXRpb24KICovCnN0YXRpYyBMUkVTVUxUIEFQSUVOVFJZIEFDRWRpdFN1YmNsYXNzUHJvYyhIV05EIGh3bmQsIFVJTlQgdU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKewogICAgSUF1dG9Db21wbGV0ZUltcGwgKlRoaXMgPSAoSUF1dG9Db21wbGV0ZUltcGwgKilHZXRXaW5kb3dMb25nUHRyVyhod25kLCBHV0xQX1VTRVJEQVRBKTsKICAgIExQT0xFU1RSIHN0cnM7CiAgICBIUkVTVUxUIGhyOwogICAgV0NIQVIgaHduZFRleHRbMjU1XTsKICAgIFdDSEFSICpod25kUUNUZXh0OwogICAgUkVDVCByOwogICAgQk9PTCBjb250cm9sLCBmaWxsZWQsIGRpc3BsYXlhbGwgPSBGQUxTRTsKICAgIGludCBjcHQsIGhlaWdodCwgc2VsOwoKICAgIGlmICghVGhpcy0+ZW5hYmxlZCkgcmV0dXJuIENhbGxXaW5kb3dQcm9jVyhUaGlzLT53cE9yaWdFZGl0UHJvYywgaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOwoKICAgIHN3aXRjaCAodU1zZykKICAgIHsKCWNhc2UgQ0JfU0hPV0RST1BET1dOOgoJICAgIFNob3dXaW5kb3coVGhpcy0+aHduZExpc3RCb3gsIFNXX0hJREUpOwoJICAgIGJyZWFrOwoJY2FzZSBXTV9LSUxMRk9DVVM6CgkgICAgaWYgKChUaGlzLT5vcHRpb25zICYmIEFDT19BVVRPU1VHR0VTVCkgJiYgCgkJKChIV05EKXdQYXJhbSAhPSBUaGlzLT5od25kTGlzdEJveCkpCgkgICAgewoJCVNob3dXaW5kb3coVGhpcy0+aHduZExpc3RCb3gsIFNXX0hJREUpOwoJICAgIH0KCSAgICBicmVhazsKCWNhc2UgV01fS0VZVVA6CgkgICAgCgkgICAgR2V0V2luZG93VGV4dFcoIGh3bmQsIChMUFdTVFIpaHduZFRleHQsIDI1NSk7CiAgICAgIAoJICAgIHN3aXRjaCh3UGFyYW0pIHsKCQljYXNlIFZLX1JFVFVSTjoKCQkgICAgLyogSWYgcXVpY2tDb21wbGV0ZSBpcyBzZXQgYW5kIGNvbnRyb2wgaXMgcHJlc3NlZCwgcmVwbGFjZSB0aGUgc3RyaW5nICovCgkJICAgIGNvbnRyb2wgPSBHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ODAwMDsJCSAgICAKCQkgICAgaWYgKGNvbnRyb2wgJiYgVGhpcy0+cXVpY2tDb21wbGV0ZSkgewoJCQlod25kUUNUZXh0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIAoJCQkJCQkgICAgICAgKGxzdHJsZW5XKFRoaXMtPnF1aWNrQ29tcGxldGUpK2xzdHJsZW5XKGh3bmRUZXh0KSkqc2l6ZW9mKFdDSEFSKSk7CgkJCXNlbCA9IHNwcmludGZXKGh3bmRRQ1RleHQsIFRoaXMtPnF1aWNrQ29tcGxldGUsIGh3bmRUZXh0KTsKCQkJU2VuZE1lc3NhZ2VXKGh3bmQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0paHduZFFDVGV4dCk7CgkJCVNlbmRNZXNzYWdlVyhod25kLCBFTV9TRVRTRUwsIDAsIHNlbCk7CgkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGh3bmRRQ1RleHQpOwoJCSAgICB9CgoJCSAgICBTaG93V2luZG93KFRoaXMtPmh3bmRMaXN0Qm94LCBTV19ISURFKTsKCQkgICAgcmV0dXJuIDA7CgkJY2FzZSBWS19MRUZUOgoJCWNhc2UgVktfUklHSFQ6CgkJICAgIHJldHVybiAwOwoJCWNhc2UgVktfVVA6CSAgICAgIAoJCWNhc2UgVktfRE9XTjoKCQkgICAgLyogVHdvIGNhc2VzIGhlcmUgOiAKCQkgICAgICAgLSBpZiB0aGUgbGlzdGJveCBpcyBub3QgdmlzaWJsZSwgZGlzcGxheXMgaXQgCgkJICAgICAgIHdpdGggYWxsIHRoZSBlbnRyaWVzIGlmIHRoZSBzdHlsZSBBQ09fVVBET1dOS0VZRFJPUFNMSVNUCgkJICAgICAgIGlzIHByZXNlbnQgYnV0IGRvZXMgbm90IHNlbGVjdCBhbnl0aGluZy4KCQkgICAgICAgLSBpZiB0aGUgbGlzdGJveCBpcyB2aXNpYmxlLCBjaGFuZ2UgdGhlIHNlbGVjdGlvbgoJCSAgICAqLwoJCSAgICBpZiAoIChUaGlzLT5vcHRpb25zICYgKEFDT19BVVRPU1VHR0VTVCB8IEFDT19VUERPV05LRVlEUk9QU0xJU1QpKSAKCQkJICYmICghSXNXaW5kb3dWaXNpYmxlKFRoaXMtPmh3bmRMaXN0Qm94KSAmJiAoISAqaHduZFRleHQpKSApCgkJICAgIHsKCQkJIC8qIFdlIG11c3QgZGlzcGF5cyBhbGwgdGhlIGVudHJpZXMgKi8KCQkJIGRpc3BsYXlhbGwgPSBUUlVFOwoJCSAgICB9IGVsc2UgewoJCQlpZiAoSXNXaW5kb3dWaXNpYmxlKFRoaXMtPmh3bmRMaXN0Qm94KSkgewoJCQkgICAgaW50IGNvdW50OwoKCQkJICAgIGNvdW50ID0gU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9HRVRDT1VOVCwgMCwgMCk7CgkJCSAgICAvKiBDaGFuZ2UgdGhlIHNlbGVjdGlvbiAqLwoJCQkgICAgc2VsID0gU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9HRVRDVVJTRUwsIDAsIDApOwoJCQkgICAgaWYgKHdQYXJhbSA9PSBWS19VUCkKCQkJCXNlbCA9ICgoc2VsLTEpPDApP2NvdW50LTE6c2VsLTE7CgkJCSAgICBlbHNlCgkJCQlzZWwgPSAoKHNlbCsxKT49IGNvdW50KT8tMTpzZWwrMTsKCQkJICAgIFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfU0VUQ1VSU0VMLCBzZWwsIDApOwoJCQkgICAgaWYgKHNlbCAhPSAtMSkgewoJCQkJV0NIQVIgKm1zZzsKCQkJCWludCBsZW47CgkJCQkKCQkJCWxlbiA9IFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfR0VUVEVYVExFTiwgc2VsLCAoTFBBUkFNKU5VTEwpOwoJCQkJbXNnID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIChsZW4rMSkqc2l6ZW9mKFdDSEFSKSk7CgkJCQlTZW5kTWVzc2FnZVcoVGhpcy0+aHduZExpc3RCb3gsIExCX0dFVFRFWFQsIHNlbCwgKExQQVJBTSltc2cpOwoJCQkJU2VuZE1lc3NhZ2VXKGh3bmQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pbXNnKTsKCQkJCVNlbmRNZXNzYWdlVyhod25kLCBFTV9TRVRTRUwsIGxzdHJsZW5XKG1zZyksIGxzdHJsZW5XKG1zZykpOwoJCQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbXNnKTsKCQkJICAgIH0gZWxzZSB7CgkJCQlTZW5kTWVzc2FnZVcoaHduZCwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSlUaGlzLT50eHRiYWNrdXApOwoJCQkJU2VuZE1lc3NhZ2VXKGh3bmQsIEVNX1NFVFNFTCwgbHN0cmxlblcoVGhpcy0+dHh0YmFja3VwKSwgbHN0cmxlblcoVGhpcy0+dHh0YmFja3VwKSk7CgkJCSAgICB9CQkJCgkJCX0gCQkKCQkJcmV0dXJuIDA7CgkJICAgIH0KCQkgICAgYnJlYWs7CgkJY2FzZSBWS19CQUNLOgoJCWNhc2UgVktfREVMRVRFOgoJCSAgICBpZiAoKCEgKmh3bmRUZXh0KSAmJiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPU1VHR0VTVCkpIHsKCQkJU2hvd1dpbmRvdyhUaGlzLT5od25kTGlzdEJveCwgU1dfSElERSk7CgkJCXJldHVybiBDYWxsV2luZG93UHJvY1coVGhpcy0+d3BPcmlnRWRpdFByb2MsIGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKCQkgICAgfQoJCSAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPQVBQRU5EKSB7CgkJCURXT1JEIGI7CgkJCVNlbmRNZXNzYWdlVyhod25kLCBFTV9HRVRTRUwsIChXUEFSQU0pJmIsIChMUEFSQU0pTlVMTCk7CgkJCWlmIChiPjEpIHsKCQkJICAgIGh3bmRUZXh0W2ItMV0gPSAnXDAnOwoJCQl9IGVsc2UgewoJCQkgICAgaHduZFRleHRbMF0gPSAnXDAnOwoJCQkgICAgU2V0V2luZG93VGV4dFcoaHduZCwgaHduZFRleHQpOyAKCQkJfQkJCQoJCSAgICB9CgkJICAgIGJyZWFrOwoJCWRlZmF1bHQ6CQkgICAgCgkJICAgIDsKCSAgICB9CiAgICAgIAoJICAgIFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfUkVTRVRDT05URU5ULCAwLCAwKTsKCgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dHh0YmFja3VwKTsKCSAgICBUaGlzLT50eHRiYWNrdXAgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwKCQkJCQkJIEhFQVBfWkVST19NRU1PUlksIChsc3RybGVuVyhod25kVGV4dCkrMSkqc2l6ZW9mKFdDSEFSKSk7CQkJCQkJCSAgICAgIAoJICAgIGxzdHJjcHlXKFRoaXMtPnR4dGJhY2t1cCwgaHduZFRleHQpOwoKCSAgICAvKiBSZXR1cm5zIGlmIHRoZXJlIGlzIG5vIHRleHQgdG8gc2VhcmNoIGFuZCB3ZSBkb2Vzbid0IHdhbnQgdG8gZGlzcGxheSBhbGwgdGhlIGVudHJpZXMgKi8KCSAgICBpZiAoKCFkaXNwbGF5YWxsKSAmJiAoISAqaHduZFRleHQpICkKCQlicmVhazsKCSAgICAKCSAgICBJRW51bVN0cmluZ19SZXNldChUaGlzLT5lbnVtc3RyKTsKCSAgICBmaWxsZWQgPSBGQUxTRTsKCSAgICBmb3IoY3B0ID0gMDs7KSB7CgkJaHIgPSBJRW51bVN0cmluZ19OZXh0KFRoaXMtPmVudW1zdHIsIDEsICZzdHJzLCBOVUxMKTsKCQlpZiAoaHIgIT0gU19PSykKCQkgICAgYnJlYWs7CgoJCWlmICgoTFBXU1RSKXN0cnN0clcoc3RycywgaHduZFRleHQpID09IHN0cnMpIHsKCQkgICAgCgkJICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX0FVVE9BUFBFTkQpIHsKCQkJU2V0V2luZG93VGV4dFcoaHduZCwgc3Rycyk7CgkJCVNlbmRNZXNzYWdlVyhod25kLCBFTV9TRVRTRUwsIGxzdHJsZW5XKGh3bmRUZXh0KSwgbHN0cmxlblcoc3RycykpOwoJCQlicmVhazsKCQkgICAgfQkJCgoJCSAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPU1VHR0VTVCkgewoJCQlTZW5kTWVzc2FnZVcoVGhpcy0+aHduZExpc3RCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSlzdHJzKTsKCQkJZmlsbGVkID0gVFJVRTsKCQkJY3B0Kys7CgkJICAgIH0KCQl9CQkKCSAgICB9CgkgICAgCgkgICAgaWYgKFRoaXMtPm9wdGlvbnMgJiBBQ09fQVVUT1NVR0dFU1QpIHsKCQlpZiAoZmlsbGVkKSB7CgkJICAgIGhlaWdodCA9IFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfR0VUSVRFTUhFSUdIVCwgMCwgMCk7CgkJICAgIFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfQ0FSRVRPRkYsIDAsIDApOwoJCSAgICBHZXRXaW5kb3dSZWN0KGh3bmQsICZyKTsKCQkgICAgU2V0UGFyZW50KFRoaXMtPmh3bmRMaXN0Qm94LCBIV05EX0RFU0tUT1ApOwoJCSAgICAvKiBJdCBzZWVtcyB0aGF0IFdpbmRvd3MgWFAgZGlzcGxheXMgNyBsaW5lcyBhdCBtb3N0IAoJCSAgICAgICBhbmQgb3RoZXJ3aXNlIGRpc3BsYXlzIGEgdmVydGljYWwgc2Nyb2xsIGJhciAqLwoJCSAgICBTZXRXaW5kb3dQb3MoVGhpcy0+aHduZExpc3RCb3gsIEhXTkRfVE9QLCAKCQkJCSByLmxlZnQsIHIuYm90dG9tICsgMSwgci5yaWdodCAtIHIubGVmdCwgbWluKGhlaWdodCAqIDcsIGhlaWdodCooY3B0KzEpKSwgCgkJCQkgU1dQX1NIT1dXSU5ET1cgKTsKCQl9IGVsc2UgewoJCSAgICBTaG93V2luZG93KFRoaXMtPmh3bmRMaXN0Qm94LCBTV19ISURFKTsKCQl9CgkgICAgfQoJICAgIAoJICAgIGJyZWFrOyAKCWRlZmF1bHQ6CgkgICAgcmV0dXJuIENhbGxXaW5kb3dQcm9jVyhUaGlzLT53cE9yaWdFZGl0UHJvYywgaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOwoJICAgIAogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgTFJFU1VMVCBBUElFTlRSWSBBQ0xCb3hTdWJjbGFzc1Byb2MoSFdORCBod25kLCBVSU5UIHVNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCnsKICAgIElBdXRvQ29tcGxldGVJbXBsICpUaGlzID0gKElBdXRvQ29tcGxldGVJbXBsICopR2V0V2luZG93TG9uZ1B0clcoaHduZCwgR1dMUF9VU0VSREFUQSk7CiAgICBXQ0hBUiAqbXNnOwogICAgaW50IHNlbCA9IC0xLCBsZW47CgogICAgc3dpdGNoICh1TXNnKSB7CgljYXNlIFdNX01PVVNFTU9WRToKCSAgICBzZWwgPSBTZW5kTWVzc2FnZVcoaHduZCwgTEJfSVRFTUZST01QT0lOVCwgMCwgbFBhcmFtKTsKCSAgICBTZW5kTWVzc2FnZVcoaHduZCwgTEJfU0VUQ1VSU0VMLCAoV1BBUkFNKXNlbCwgKExQQVJBTSkwKTsKCSAgICBicmVhazsKCWNhc2UgV01fTEJVVFRPTkRPV046CgkgICAgbGVuID0gU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9HRVRURVhUTEVOLCBzZWwsIChMUEFSQU0pTlVMTCk7CgkgICAgbXNnID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIChsZW4rMSkqc2l6ZW9mKFdDSEFSKSk7CgkgICAgc2VsID0gKElOVClTZW5kTWVzc2FnZVcoaHduZCwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKCSAgICBTZW5kTWVzc2FnZVcoaHduZCwgTEJfR0VUVEVYVCwgc2VsLCAoTFBBUkFNKW1zZyk7CgkgICAgU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRFZGl0LCBXTV9TRVRURVhULCAwLCAoTFBBUkFNKW1zZyk7CgkgICAgU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRFZGl0LCBFTV9TRVRTRUwsIDAsIGxzdHJsZW5XKG1zZykpOwoJICAgIFNob3dXaW5kb3coaHduZCwgU1dfSElERSk7CgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbXNnKTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgcmV0dXJuIENhbGxXaW5kb3dQcm9jVyhUaGlzLT53cE9yaWdMQm94UHJvYywgaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOwogICAgfQogICAgcmV0dXJuIDA7Cn0K