LyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgojaWZuZGVmIF9fQ0hBTk5FTF9IX18KI2RlZmluZSBfX0NIQU5ORUxfSF9fCgovKgoqIFdoZW5ldmVyIHRoaXMgZmlsZSBpcyBjaGFuZ2VkIGEgY29ycmVzcG9uZGluZyBjaGFuZ2UgbXVzdCBiZSBtYWRlIGluCiogdGhlIENvbnNvbGUvU2VydmljZVBhcnQvdmlzb3JkaWFnX2Vhcmx5L3N1cGVydmlzb3JfY2hhbm5lbC5oIGZpbGUKKiB3aGljaCBpcyBuZWVkZWQgZm9yIExpbnV4IGtlcm5lbCBjb21waWxlcy4gVGhlc2UgdHdvIGZpbGVzIG11c3QgYmUKKiBpbiBzeW5jLgoqLwoKLyogZGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gcHJldmVudCBpbmNsdWRlIG5lc3RpbmcgaW4ga2VybmVsIGhlYWRlcgogKiBmaWxlcyBvZiBzaW1pbGFyIGFicmV2aWF0ZWQgY29udGVudAogKi8KI2RlZmluZSBfX1NVUEVSVklTT1JfQ0hBTk5FTF9IX18KCiNpbmNsdWRlICJjb21tb250eXBlcy5oIgoKI2RlZmluZSBTSUdOQVRVUkVfMTYoQSwgQikgKChBKSB8IChCPDw4KSkKI2RlZmluZSBTSUdOQVRVUkVfMzIoQSwgQiwgQywgRCkgXAoJKFNJR05BVFVSRV8xNihBLCBCKSB8IChTSUdOQVRVUkVfMTYoQywgRCkgPDwgMTYpKQojZGVmaW5lIFNJR05BVFVSRV82NChBLCBCLCBDLCBELCBFLCBGLCBHLCBIKSBcCgkoU0lHTkFUVVJFXzMyKEEsIEIsIEMsIEQpIHwgKChVNjQpKFNJR05BVFVSRV8zMihFLCBGLCBHLCBIKSkgPDwgMzIpKQoKI2lmbmRlZiBsZW5ndGhvZgojZGVmaW5lIGxlbmd0aG9mKFRZUEUsIE1FTUJFUikgKHNpemVvZigoKFRZUEUgKikwKS0+TUVNQkVSKSkKI2VuZGlmCiNpZm5kZWYgQ09WRVJRCiNkZWZpbmUgQ09WRVJRKHYsIGQpICAoKCh2KSsoZCktMSkgLyAoZCkpCiNlbmRpZgojaWZuZGVmIENPVkVSCiNkZWZpbmUgQ09WRVIodiwgZCkgICAoKGQpKkNPVkVSUSh2LCBkKSkKI2VuZGlmCgojaWZuZGVmIEdVSUQwCiNkZWZpbmUgR1VJRDAgezAsIDAsIDAsIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSB9CiNlbmRpZgoKLyogIFRoZSBDIGxhbmd1YWdlIGlzIGluY29uc2lzdGVudCB3aXRoIHJlc3BlY3QgdG8gd2hlcmUgaXQgYWxsb3dzIGxpdGVyYWwKICogIGNvbnN0YW50cywgZXNwZWNpYWxseSBsaXRlcmFsIGNvbnN0YW50IHN0cnVjdHMuICBMaXRlcmFsIGNvbnN0YW50IHN0cnVjdHMKICogIGFyZSBhbGxvd2VkIGZvciBpbml0aWFsaXphdGlvbiBvbmx5LCB3aGVyZWFzIG90aGVyIHR5cGVzIG9mIGxpdGVyYWwKICogIGNvbnN0YW50cyBhcmUgYWxsb3dlZCBhbnl3aGVyZS4gIFdlIGdldCBhcm91bmQgdGhpcyBpbmNvbnNpc3RlbmN5IGJ5CiAqICBkZWNsYXJpbmcgYSAic3RhdGljIGNvbnN0IiB2YXJpYWJsZSBmb3IgZWFjaCBHVUlELiAgVGhpcyB2YXJpYWJsZSBjYW4gYmUKICogIHVzZWQgaW4gZXhwcmVzc2lvbnMgd2hlcmUgdGhlIGxpdGVyYWwgY29uc3RhbnQgd291bGQgbm90IGJlIGFsbG93ZWQuCiAqLwpzdGF0aWMgY29uc3QgR1VJRCBHdWlkMCA9IEdVSUQwOwoKI2RlZmluZSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSAgU0lHTkFUVVJFXzMyKCdFJywgJ0MnLCAnTicsICdMJykKCnR5cGVkZWYgZW51bSB7CglDSEFOTkVMU1JWX1VOSU5JVElBTElaRUQgPSAwLAkvKiBjaGFubmVsIGlzIGluIGFuIHVuZGVmaW5lZCBzdGF0ZSAqLwoJQ0hBTk5FTFNSVl9SRUFEWSA9IDEJLyogY2hhbm5lbCBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBzZXJ2ZXIgKi8KfSBDSEFOTkVMX1NFUlZFUlNUQVRFOwoKdHlwZWRlZiBlbnVtIHsKCUNIQU5ORUxDTElfREVUQUNIRUQgPSAwLAoJQ0hBTk5FTENMSV9ESVNBQkxFRCA9IDEsCS8qIGNsaWVudCBjYW4gc2VlIGNoYW5uZWwgYnV0IGlzIE5PVAoJCQkJCSAqIGFsbG93ZWQgdG8gdXNlIGl0IHVubGVzcyBnaXZlbiBUQkQKCQkJCQkgKiBleHBsaWNpdCByZXF1ZXN0IChzaG91bGQgYWN0dWFsbHkgYmUKCQkJCQkgKiA8IERFVEFDSEVEKSAqLwoJQ0hBTk5FTENMSV9BVFRBQ0hJTkcgPSAyLAkvKiBsZWdhY3kgRUZJIGNsaWVudCByZXF1ZXN0CgkJCQkJICogZm9yIEVGSSBzZXJ2ZXIgdG8gYXR0YWNoICovCglDSEFOTkVMQ0xJX0FUVEFDSEVEID0gMywJLyogaWRsZSwgYnV0IGNsaWVudCBtYXkgd2FudAoJCQkJCSAqIHRvIHVzZSBjaGFubmVsIGFueSB0aW1lICovCglDSEFOTkVMQ0xJX0JVU1kgPSA0LAkvKiBjbGllbnQgZWl0aGVyIHdhbnRzIHRvIHVzZSBvciBpcwoJCQkJICogdXNpbmcgY2hhbm5lbCAqLwoJQ0hBTk5FTENMSV9PV05FRCA9IDUJLyogIm5vIHdvcnJpZXMiIHN0YXRlIC0gY2xpZW50IGNhbgoJCQkJICogYWNjZXNzIGNoYW5uZWwgYW55dGltZSAqLwp9IENIQU5ORUxfQ0xJRU5UU1RBVEU7CnN0YXRpYyBpbmxpbmUgY29uc3QgVTggKgpVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhVMzIgdikKewoJc3dpdGNoICh2KSB7CgljYXNlIENIQU5ORUxDTElfREVUQUNIRUQ6CgkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkRFVEFDSEVEIik7CgljYXNlIENIQU5ORUxDTElfRElTQUJMRUQ6CgkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkRJU0FCTEVEIik7CgljYXNlIENIQU5ORUxDTElfQVRUQUNISU5HOgoJCXJldHVybiAoY29uc3QgVTggKikgKCJBVFRBQ0hJTkciKTsKCWNhc2UgQ0hBTk5FTENMSV9BVFRBQ0hFRDoKCQlyZXR1cm4gKGNvbnN0IFU4ICopICgiQVRUQUNIRUQiKTsKCWNhc2UgQ0hBTk5FTENMSV9CVVNZOgoJCXJldHVybiAoY29uc3QgVTggKikgKCJCVVNZIik7CgljYXNlIENIQU5ORUxDTElfT1dORUQ6CgkJcmV0dXJuIChjb25zdCBVOCAqKSAoIk9XTkVEIik7CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoJcmV0dXJuIChjb25zdCBVOCAqKSAoIj8iKTsKfQoKI2RlZmluZSBVTFRSQV9DSEFOTkVMU1JWX0lTX1JFQURZKHgpICAgICAoKHgpID09IENIQU5ORUxTUlZfUkVBRFkpCiNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9TRVJWRVJfUkVBRFkocENoYW5uZWwpIFwKCShVTFRSQV9DSEFOTkVMU1JWX0lTX1JFQURZKHJlYWRsKCYocENoYW5uZWwpLT5TcnZTdGF0ZSkpKQoKI2RlZmluZSBVTFRSQV9WQUxJRF9DSEFOTkVMQ0xJX1RSQU5TSVRJT04obywgbikJCQkJXAoJKCgoKChvKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB8fCBcCgkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSAmJiAoKG4pID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB8fCBcCgkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkpIHx8IFwKCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hJTkcpICYmICgobikgPT0gQ0hBTk5FTENMSV9ERVRBQ0hFRCkpIHx8IFwKCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSkgfHwgXAoJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSkgfHwgXAoJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSElORykgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSkgfHwgXAoJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfQVRUQUNIRUQpKSB8fCBcCgkgICgoKG8pID09IENIQU5ORUxDTElfQlVTWSkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSkgfHwJXAoJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfQlVTWSkpIHx8CVwKCSAgKCgobykgPT0gQ0hBTk5FTENMSV9ERVRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgXAoJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfT1dORUQpKSB8fCBcCgkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSAmJiAoKG4pID09IENIQU5ORUxDTElfT1dORUQpKSB8fCBcCgkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9PV05FRCkpIHx8IFwKCSAgKCgobykgPT0gQ0hBTk5FTENMSV9CVVNZKSAmJiAoKG4pID09IENIQU5ORUxDTElfT1dORUQpKSB8fCAoMCkpIFwKCSA/ICgxKSA6ICgwKSkKCiNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9DTElFTlRfQ0hLX1RSQU5TSVRJT04ob2xkLCBuZXcsIGNoYW5JZCwgbG9nQ3R4LAlcCgkJCQkJICAgIGZpbGUsIGxpbmUpCQkJXAoJZG8gewkJCQkJCQkJXAoJCWlmICghVUxUUkFfVkFMSURfQ0hBTk5FTENMSV9UUkFOU0lUSU9OKG9sZCwgbmV3KSkJXAoJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwJCQkJXAoJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lURVJSLCBcCgkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwgXAoJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLAkJXAoJCQkJICAgICAgX19mdW5jX18sIF9fTElORV9fLAkJXAoJCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhICglcykgJXMoJWQpLS0+JXMoJWQpIEAlczolZFxuIiwgXAoJCQkJICAgICAgY2hhbklkLCAiQ2xpU3RhdGU8eD4iLAkJXAoJCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcob2xkKSwJXAoJCQkJICAgICAgb2xkLAkJCQlcCgkJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhuZXcpLAlcCgkJCQkgICAgICBuZXcsCQkJCVwKCQkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKilmaWxlLCA0KSwgXAoJCQkJICAgICAgbGluZSk7CQkJCVwKCX0gd2hpbGUgKDApCgojZGVmaW5lIFVMVFJBX0NIQU5ORUxfQ0xJRU5UX1RSQU5TSVRJT04ocENoYW4sIGNoYW5JZCwJCQlcCgkJCQkJbmV3c3RhdGUsIGxvZ0N0eCkJCVwKCWRvIHsJCQkJCQkJCVwKCQlVTFRSQV9DSEFOTkVMX0NMSUVOVF9DSEtfVFJBTlNJVElPTigJCQlcCgkJCXJlYWRsKCYoKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIFwKCQkJCSAocENoYW4pKS0+Q2xpU3RhdGVPUykpLAkJXAoJCQluZXdzdGF0ZSwJCQkJCVwKCQkJY2hhbklkLCBsb2dDdHgsIF9fRklMRV9fLCBfX0xJTkVfXyk7CQlcCgkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLCBcCgkJCUNIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLCBcCgkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywJCQlcCgkJCSAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywJCQlcCgkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiAoJXMpICVzKCVkKS0tPiVzKCVkKSBAJXM6JWRcbiIsIFwKCQkJICAgICAgY2hhbklkLCAiQ2xpU3RhdGVPUyIsCQkJXAoJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyggXAoJCQkJICAgICAgcmVhZGwoJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSBcCgkJCQkJICAgICAgKHBDaGFuKSktPkNsaVN0YXRlT1MpKSwJXAoJCQkgICAgICByZWFkbCgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIFwKCQkJCSAgICAgIChwQ2hhbikpLT5DbGlTdGF0ZU9TKSwJCVwKCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcobmV3c3RhdGUpLAlcCgkJCSAgICAgIG5ld3N0YXRlLAkJCQkJXAoJCQkgICAgICBQYXRoTmFtZV9MYXN0X05fTm9kZXMoX19GSUxFX18sIDQpLCBfX0xJTkVfXyk7IFwKCQl3cml0ZWwobmV3c3RhdGUsICYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgXAoJCQkJICAgKHBDaGFuKSktPkNsaVN0YXRlT1MpOwkJXAoJCU1FTU9SWUJBUlJJRVI7CQkJCQkJXAoJfSB3aGlsZSAoMCkKCiNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9DTElFTlRfQUNRVUlSRV9PUyhwQ2hhbiwgY2hhbklkLCBsb2dDdHgpCVwKCVVMVFJBX2NoYW5uZWxfY2xpZW50X2FjcXVpcmVfb3MocENoYW4sIGNoYW5JZCwgbG9nQ3R4LAkJXAoJCQkJCShjaGFyICopX19GSUxFX18sIF9fTElORV9fLAlcCgkJCQkJKGNoYXIgKilfX2Z1bmNfXykKI2RlZmluZSBVTFRSQV9DSEFOTkVMX0NMSUVOVF9SRUxFQVNFX09TKHBDaGFuLCBjaGFuSWQsIGxvZ0N0eCkJXAoJVUxUUkFfY2hhbm5lbF9jbGllbnRfcmVsZWFzZV9vcyhwQ2hhbiwgY2hhbklkLCBsb2dDdHgsCVwKCQkoY2hhciAqKV9fRklMRV9fLCBfX0xJTkVfXywgKGNoYXIgKilfX2Z1bmNfXykKCi8qIFZhbHVlcyBmb3IgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTC5DbGlFcnJvckJvb3Q6ICovCi8qIHRocm90dGxpbmcgaW52YWxpZCBib290IGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0byBjbGllbnQKICogZGlzYWJsZWQgKi8KI2RlZmluZSBVTFRSQV9DTElFUlJPUkJPT1RfVEhST1RUTEVNU0dfRElTQUJMRUQgICAgMHgwMQoKLyogdGhyb3R0bGluZyBpbnZhbGlkIGJvb3QgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvIGNsaWVudAogKiBub3QgYXR0YWNoZWQgKi8KI2RlZmluZSBVTFRSQV9DTElFUlJPUkJPT1RfVEhST1RUTEVNU0dfTk9UQVRUQUNIRUQgMHgwMgoKLyogdGhyb3R0bGluZyBpbnZhbGlkIGJvb3QgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvIGJ1c3kgY2hhbm5lbCAqLwojZGVmaW5lIFVMVFJBX0NMSUVSUk9SQk9PVF9USFJPVFRMRU1TR19CVVNZICAgICAgICAweDA0CgovKiBWYWx1ZXMgZm9yIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wuQ2xpRXJyb3JPUzogKi8KLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bwogKiBjbGllbnQgZGlzYWJsZWQgKi8KI2RlZmluZSBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVEICAgICAgMHgwMQoKLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bwogKiBjbGllbnQgbm90IGF0dGFjaGVkICovCiNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCAgIDB4MDIKCi8qIHRocm90dGxpbmcgaW52YWxpZCBndWVzdCBPUyBjaGFubmVsIHN0YXRldHJhbnNpdGlvbiBlcnJvciBkdWUgdG8KICogYnVzeSBjaGFubmVsICovCiNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZICAgICAgICAgIDB4MDQKCi8qIFZhbHVlcyBmb3IgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTC5GZWF0dXJlczogVGhpcyBkZWZpbmUgZXhpc3RzIHNvCiogdGhhdCB3aW5kb3dzIGd1ZXN0IGNhbiBsb29rIGF0IHRoZSBGZWF0dXJlRmxhZ3MgaW4gdGhlIGlvIGNoYW5uZWwsCiogYW5kIGNvbmZpZ3VyZSB0aGUgd2luZG93cyBkcml2ZXIgdG8gdXNlIGludGVycnVwdHMgb3Igbm90IGJhc2VkIG9uCiogdGhpcyBzZXR0aW5nLiAgVGhpcyBmbGFnIGlzIHNldCBpbiB1aXNsaWIgYWZ0ZXIgdGhlCiogVUxUUkFfVkhCQV9pbml0X2NoYW5uZWwgaXMgY2FsbGVkLiAgQWxsIGZlYXR1cmUgYml0cyBmb3IgYWxsCiogY2hhbm5lbHMgc2hvdWxkIGJlIGRlZmluZWQgaGVyZS4gIFRoZSBpbyBjaGFubmVsIGZlYXR1cmUgYml0cyBhcmUKKiBkZWZpbmVkIHJpZ2h0IGhlcmUgKi8KI2RlZmluZSBVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTICgweDFVTEwgPDwgMSkKI2RlZmluZSBVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkcgKDB4MVVMTCA8PCAzKQojZGVmaW5lIFVMVFJBX0lPX0lPVk1fSVNfT0tfV0lUSF9EUklWRVJfRElTQUJMSU5HX0lOVFMgKDB4MVVMTCA8PCA0KQojZGVmaW5lIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTICgweDFVTEwgPDwgNSkKI2RlZmluZSBVTFRSQV9JT19EUklWRVJfU1VQUE9SVFNfRU5IQU5DRURfUkNWQlVGX0NIRUNLSU5HICgweDFVTEwgPDwgNikKCiNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLwovKiBDb21tb24gQ2hhbm5lbCBIZWFkZXIgKi8KdHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfSEVBREVSIHsKCVU2NCBTaWduYXR1cmU7CQkvKiBTaWduYXR1cmUgKi8KCVUzMiBMZWdhY3lTdGF0ZTsJLyogREVQUkVDQVRFRCAtIGJlaW5nIHJlcGxhY2VkIGJ5ICovCgkvKiAvICAgICAgICAgICAgICBTcnZTdGF0ZSwgQ2xpU3RhdGVCb290LCBhbmQgQ2xpU3RhdGVPUyBiZWxvdyAqLwoJVTMyIEhlYWRlclNpemU7CQkvKiBzaXplb2YoQ0hBTk5FTF9IRUFERVIpICovCglVNjQgU2l6ZTsJCS8qIFRvdGFsIHNpemUgb2YgdGhpcyBjaGFubmVsIGluIGJ5dGVzICovCglVNjQgRmVhdHVyZXM7CQkvKiBGbGFncyB0byBtb2RpZnkgYmVoYXZpb3IgKi8KCUdVSUQgVHlwZTsJCS8qIENoYW5uZWwgdHlwZTogZGF0YSwgYnVzLCBjb250cm9sLCBldGMuICovCglVNjQgUGFydGl0aW9uSGFuZGxlOwkvKiBJRCBvZiBndWVzdCBwYXJ0aXRpb24gKi8KCVU2NCBIYW5kbGU7CQkvKiBEZXZpY2UgbnVtYmVyIG9mIHRoaXMgY2hhbm5lbCBpbiBjbGllbnQgKi8KCVU2NCBvQ2hhbm5lbFNwYWNlOwkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gY2hhbm5lbCBzcGVjaWZpYyBhcmVhICovCglVMzIgVmVyc2lvbklkOwkJLyogQ0hBTk5FTF9IRUFERVIgVmVyc2lvbiBJRCAqLwoJVTMyIFBhcnRpdGlvbkluZGV4OwkvKiBJbmRleCBvZiBndWVzdCBwYXJ0aXRpb24gKi8KCUdVSUQgWm9uZUd1aWQ7CQkvKiBHdWlkIG9mIENoYW5uZWwncyB6b25lICovCglVMzIgb0NsaWVudFN0cmluZzsJLyogb2Zmc2V0IGZyb20gY2hhbm5lbCBoZWFkZXIgdG8KCQkJCSAqIG51bC10ZXJtaW5hdGVkIENsaWVudFN0cmluZyAoMCBpZgoJCQkJICogQ2xpZW50U3RyaW5nIG5vdCBwcmVzZW50KSAqLwoJVTMyIENsaVN0YXRlQm9vdDsJLyogQ0hBTk5FTF9DTElFTlRTVEFURSBvZiBwcmUtYm9vdAoJCQkJICogRUZJIGNsaWVudCBvZiB0aGlzIGNoYW5uZWwgKi8KCVUzMiBDbWRTdGF0ZUNsaTsJLyogQ0hBTk5FTF9DT01NQU5EU1RBVEUgKG92ZXJsb2FkZWQgaW4KCQkJCSAqIFdpbmRvd3MgZHJpdmVycywgc2VlIFNlcnZlclN0YXRlVXAsCgkJCQkgKiBTZXJ2ZXJTdGF0ZURvd24sIGV0YykgKi8KCVUzMiBDbGlTdGF0ZU9TOwkJLyogQ0hBTk5FTF9DTElFTlRTVEFURSBvZiBHdWVzdCBPUwoJCQkJICogY2xpZW50IG9mIHRoaXMgY2hhbm5lbCAqLwoJVTMyIENoYW5uZWxDaGFyYWN0ZXJpc3RpY3M7CS8qIENIQU5ORUxfQ0hBUkFDVEVSSVNUSUNfPHh4eD4gKi8KCVUzMiBDbWRTdGF0ZVNydjsJLyogQ0hBTk5FTF9DT01NQU5EU1RBVEUgKG92ZXJsb2FkZWQgaW4KCQkJCSAqIFdpbmRvd3MgZHJpdmVycywgc2VlIFNlcnZlclN0YXRlVXAsCgkJCQkgKiBTZXJ2ZXJTdGF0ZURvd24sIGV0YykgKi8KCVUzMiBTcnZTdGF0ZTsJCS8qIENIQU5ORUxfU0VSVkVSU1RBVEUgKi8KCVU4IENsaUVycm9yQm9vdDsJLyogYml0cyB0byBpbmRpY2F0ZSBlcnIgc3RhdGVzIGZvcgoJCQkJICogYm9vdCBjbGllbnRzLCBzbyBlcnIgbWVzc2FnZXMgY2FuCgkJCQkgKiBiZSB0aHJvdHRsZWQgKi8KCVU4IENsaUVycm9yT1M7CQkvKiBiaXRzIHRvIGluZGljYXRlIGVyciBzdGF0ZXMgZm9yIE9TCgkJCQkgKiBjbGllbnRzLCBzbyBlcnIgbWVzc2FnZXMgY2FuIGJlCgkJCQkgKiB0aHJvdHRsZWQgKi8KCVU4IEZpbGxlclsxXTsJCS8qIFBhZCBvdXQgdG8gMTI4IGJ5dGUgY2FjaGVsaW5lICovCgkvKiBQbGVhc2UgYWRkIGFsbCBuZXcgc2luZ2xlLWJ5dGUgdmFsdWVzIGJlbG93IGhlcmUgKi8KCVU4IFJlY292ZXJDaGFubmVsOwp9IENIQU5ORUxfSEVBREVSLCAqcENIQU5ORUxfSEVBREVSLCBVTFRSQV9DSEFOTkVMX1BST1RPQ09MOwoKI2RlZmluZSBVTFRSQV9DSEFOTkVMX0VOQUJMRV9JTlRTICgweDFVTEwgPDwgMCkKCi8qIFN1YmhlYWRlciBmb3IgdGhlIFNpZ25hbCBUeXBlIHZhcmlhdGlvbiBvZiB0aGUgQ29tbW9uIENoYW5uZWwgKi8KdHlwZWRlZiBzdHJ1Y3QgX1NJR05BTF9RVUVVRV9IRUFERVIgewoJLyogMXN0IGNhY2hlIGxpbmUgKi8KCVUzMiBWZXJzaW9uSWQ7CQkvKiBTSUdOQUxfUVVFVUVfSEVBREVSIFZlcnNpb24gSUQgKi8KCVUzMiBUeXBlOwkJLyogUXVldWUgdHlwZTogc3RvcmFnZSwgbmV0d29yayAqLwoJVTY0IFNpemU7CQkvKiBUb3RhbCBzaXplIG9mIHRoaXMgcXVldWUgaW4gYnl0ZXMgKi8KCVU2NCBvU2lnbmFsQmFzZTsJLyogT2Zmc2V0IHRvIHNpZ25hbCBxdWV1ZSBhcmVhICovCglVNjQgRmVhdHVyZUZsYWdzOwkvKiBGbGFncyB0byBtb2RpZnkgYmVoYXZpb3IgKi8KCVU2NCBOdW1TaWduYWxzU2VudDsJLyogVG90YWwgIyBvZiBzaWduYWxzIHBsYWNlZCBpbiB0aGlzIHF1ZXVlICovCglVNjQgTnVtT3ZlcmZsb3dzOwkvKiBUb3RhbCAjIG9mIGluc2VydHMgZmFpbGVkIGR1ZSB0bwoJCQkJICogZnVsbCBxdWV1ZSAqLwoJVTMyIFNpZ25hbFNpemU7CQkvKiBUb3RhbCBzaXplIG9mIGEgc2lnbmFsIGZvciB0aGlzIHF1ZXVlICovCglVMzIgTWF4U2lnbmFsU2xvdHM7CS8qIE1heCAjIG9mIHNsb3RzIGluIHF1ZXVlLCAxIHNsb3QgaXMKCQkJCSAqIGFsd2F5cyBlbXB0eSAqLwoJVTMyIE1heFNpZ25hbHM7CQkvKiBNYXggIyBvZiBzaWduYWxzIGluIHF1ZXVlCgkJCQkgKiAoTWF4U2lnbmFsU2xvdHMtMSkgKi8KCVUzMiBIZWFkOwkJLyogUXVldWUgaGVhZCBzaWduYWwgIyAqLwoJLyogMm5kIGNhY2hlIGxpbmUgKi8KCVU2NCBOdW1TaWduYWxzUmVjZWl2ZWQ7CS8qIFRvdGFsICMgb2Ygc2lnbmFscyByZW1vdmVkIGZyb20gdGhpcyBxdWV1ZSAqLwoJVTMyIFRhaWw7CQkvKiBRdWV1ZSB0YWlsIHNpZ25hbCAjIChvbiBzZXBhcmF0ZQoJCQkJICogY2FjaGUgbGluZSkgKi8KCVUzMiBSZXNlcnZlZDE7CQkvKiBSZXNlcnZlZCBmaWVsZCAqLwoJVTY0IFJlc2VydmVkMjsJCS8qIFJlc3J2ZWQgZmllbGQgKi8KCVU2NCBDbGllbnRRdWV1ZTsKCVU2NCBOdW1JbnRlcnJ1cHRzUmVjZWl2ZWQ7CS8qIFRvdGFsICMgb2YgSW50ZXJydXB0cyByZWNlaXZlZC4gIFRoaXMKCQkJCQkgKiBpcyBpbmNyZW1lbnRlZCBieSB0aGUgSVNSIGluIHRoZQoJCQkJCSAqIGd1ZXN0IHdpbmRvd3MgZHJpdmVyICovCglVNjQgTnVtRW1wdHlDbnQ7CS8qIE51bWJlciBvZiB0aW1lcyB0aGF0IHZpc29yX3NpZ25hbF9yZW1vdmUKCQkJCSAqIGlzIGNhbGxlZCBhbmQgcmV0dXJuZWQgRW1wdHkKCQkJCSAqIFN0YXR1cy4gKi8KCVUzMiBFcnJvckZsYWdzOwkJLyogRXJyb3IgYml0cyBzZXQgZHVyaW5nIFNpZ25hbFJlaW5pdAoJCQkJICogdG8gZGVub3RlIHRyb3VibGUgd2l0aCBjbGllbnQncwoJCQkJICogZmllbGRzICovCglVOCBGaWxsZXJbMTJdOwkJLyogUGFkIG91dCB0byA2NCBieXRlIGNhY2hlbGluZSAqLwp9IFNJR05BTF9RVUVVRV9IRUFERVIsICpwU0lHTkFMX1FVRVVFX0hFQURFUjsKCiNwcmFnbWEgcGFjayhwb3ApCgojZGVmaW5lIFNpZ25hbEluaXQoY2hhbiwgUUhEUkZMRCwgUURBVEFGTEQsIFFEQVRBVFlQRSwgdmVyLCB0eXApCVwKCWRvIHsJCQkJCQkJCVwKCQlNRU1TRVQoJmNoYW4tPlFIRFJGTEQsIDAsIHNpemVvZihjaGFuLT5RSERSRkxEKSk7CVwKCQljaGFuLT5RSERSRkxELlZlcnNpb25JZCA9IHZlcjsJCQkJXAoJCWNoYW4tPlFIRFJGTEQuVHlwZSA9IHR5cDsJCQkJXAoJCWNoYW4tPlFIRFJGTEQuU2l6ZSA9IHNpemVvZihjaGFuLT5RREFUQUZMRCk7CQlcCgkJY2hhbi0+UUhEUkZMRC5TaWduYWxTaXplID0gc2l6ZW9mKFFEQVRBVFlQRSk7CQlcCgkJY2hhbi0+UUhEUkZMRC5vU2lnbmFsQmFzZSA9IChVSU5UTikoY2hhbi0+UURBVEFGTEQpLQlcCgkJCShVSU5UTikoJmNoYW4tPlFIRFJGTEQpOwkJCVwKCQljaGFuLT5RSERSRkxELk1heFNpZ25hbFNsb3RzID0JCQkJXAoJCQlzaXplb2YoY2hhbi0+UURBVEFGTEQpL3NpemVvZihRREFUQVRZUEUpOwlcCgkJY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxzID0gY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxTbG90cy0xOyBcCgl9IHdoaWxlICgwKQoKLyogR2VuZXJpYyBmdW5jdGlvbiB1c2VmdWwgZm9yIHZhbGlkYXRpbmcgYW55IHR5cGUgb2YgY2hhbm5lbCB3aGVuIGl0IGlzCiAqIHJlY2VpdmVkIGJ5IHRoZSBjbGllbnQgdGhhdCB3aWxsIGJlIGFjY2Vzc2luZyB0aGUgY2hhbm5lbC4KICogTm90ZSB0aGF0IDxsb2dDdHg+IGlzIG9ubHkgbmVlZGVkIGZvciBjYWxsZXJzIGluIHRoZSBFRkkgZW52aXJvbm1lbnQsIGFuZAogKiBpcyB1c2VkIHRvIHBhc3MgdGhlIEVGSV9ESUFHX0NBUFRVUkVfUFJPVE9DT0wgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4KICovCnN0YXRpYyBpbmxpbmUgaW50ClVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHZvaWQgX19pb21lbSAqcENoYW5uZWwsCgkJCSAgIEdVSUQgZXhwZWN0ZWRUeXBlR3VpZCwKCQkJICAgY2hhciAqY2hhbm5lbE5hbWUsCgkJCSAgIFU2NCBleHBlY3RlZE1pbkJ5dGVzLAoJCQkgICBVMzIgZXhwZWN0ZWRWZXJzaW9uSWQsCgkJCSAgIFU2NCBleHBlY3RlZFNpZ25hdHVyZSwKCQkJICAgY2hhciAqZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCB2b2lkICpsb2dDdHgpCnsKCWlmIChNRU1DTVAoJmV4cGVjdGVkVHlwZUd1aWQsICZHdWlkMCwgc2l6ZW9mKEdVSUQpKSAhPSAwKQoJCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkgdHlwZSBHVUlEICovCgkJaWYgKE1FTUNNUF9JTygmKCgoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSAocENoYW5uZWwpKS0+VHlwZSksCgkJCSAgICZleHBlY3RlZFR5cGVHdWlkLCBzaXplb2YoR1VJRCkpICE9IDApIHsKCQkJQ0hBTk5FTF9HVUlEX01JU01BVENIKGV4cGVjdGVkVHlwZUd1aWQsIGNoYW5uZWxOYW1lLAoJCQkJCSAgICAgICJ0eXBlIiwgZXhwZWN0ZWRUeXBlR3VpZCwKCQkJCQkgICAgICAoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikKCQkJCQkgICAgICAgKHBDaGFubmVsKSktPlR5cGUsIGZpbGVOYW1lLAoJCQkJCSAgICAgIGxpbmVOdW1iZXIsIGxvZ0N0eCk7CgkJCXJldHVybiAwOwoJCX0KCWlmIChleHBlY3RlZE1pbkJ5dGVzID4gMCkJLyogY2FsbGVyIHdhbnRzIHVzIHRvIHZlcmlmeQoJCQkJCSAqIGNoYW5uZWwgc2l6ZSAqLwoJCWlmIChyZWFkcSgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCgkJCSAgIChwQ2hhbm5lbCkpLT5TaXplKSA8IGV4cGVjdGVkTWluQnl0ZXMpIHsKCQkJQ0hBTk5FTF9VNjRfTUlTTUFUQ0goZXhwZWN0ZWRUeXBlR3VpZCwgY2hhbm5lbE5hbWUsCgkJCQkJICAgICAic2l6ZSIsIGV4cGVjdGVkTWluQnl0ZXMsCgkJCQkJICAgICAoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikKCQkJCQkgICAgICAocENoYW5uZWwpKS0+U2l6ZSwgZmlsZU5hbWUsCgkJCQkJICAgICBsaW5lTnVtYmVyLCBsb2dDdHgpOwoJCQlyZXR1cm4gMDsKCQl9CglpZiAoZXhwZWN0ZWRWZXJzaW9uSWQgPiAwKQkvKiBjYWxsZXIgd2FudHMgdXMgdG8gdmVyaWZ5CgkJCQkJICogY2hhbm5lbCB2ZXJzaW9uICovCgkJaWYgKHJlYWRsKCYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgKHBDaGFubmVsKSktPlZlcnNpb25JZCkKCQkgICAgIT0gZXhwZWN0ZWRWZXJzaW9uSWQpIHsKCQkJQ0hBTk5FTF9VMzJfTUlTTUFUQ0goZXhwZWN0ZWRUeXBlR3VpZCwgY2hhbm5lbE5hbWUsCgkJCQkJICAgICAidmVyc2lvbiIsIGV4cGVjdGVkVmVyc2lvbklkLAoJCQkJCSAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCgkJCQkJICAgICAgKHBDaGFubmVsKSktPlZlcnNpb25JZCwgZmlsZU5hbWUsCgkJCQkJICAgICBsaW5lTnVtYmVyLCBsb2dDdHgpOwoJCQlyZXR1cm4gMDsKCQl9CglpZiAoZXhwZWN0ZWRTaWduYXR1cmUgPiAwKQkvKiBjYWxsZXIgd2FudHMgdXMgdG8gdmVyaWZ5CgkJCQkJICogY2hhbm5lbCBzaWduYXR1cmUgKi8KCQlpZiAocmVhZHEoJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSAocENoYW5uZWwpKS0+U2lnbmF0dXJlKQoJCSAgICAhPSBleHBlY3RlZFNpZ25hdHVyZSkgewoJCQlDSEFOTkVMX1U2NF9NSVNNQVRDSChleHBlY3RlZFR5cGVHdWlkLCBjaGFubmVsTmFtZSwKCQkJCQkgICAgICJzaWduYXR1cmUiLCBleHBlY3RlZFNpZ25hdHVyZSwKCQkJCQkgICAgICgoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKQoJCQkJCSAgICAgIChwQ2hhbm5lbCkpLT5TaWduYXR1cmUsIGZpbGVOYW1lLAoJCQkJCSAgICAgbGluZU51bWJlciwgbG9nQ3R4KTsKCQkJcmV0dXJuIDA7CgkJfQoJcmV0dXJuIDE7Cn0KCi8qIEdlbmVyaWMgZnVuY3Rpb24gdXNlZnVsIGZvciB2YWxpZGF0aW5nIGFueSB0eXBlIG9mIGNoYW5uZWwgd2hlbiBpdCBpcyBhYm91dAogKiB0byBiZSBpbml0aWFsaXplZCBieSB0aGUgc2VydmVyIG9mIHRoZSBjaGFubmVsLgogKiBOb3RlIHRoYXQgPGxvZ0N0eD4gaXMgb25seSBuZWVkZWQgZm9yIGNhbGxlcnMgaW4gdGhlIEVGSSBlbnZpcm9ubWVudCwgYW5kCiAqIGlzIHVzZWQgdG8gcGFzcyB0aGUgRUZJX0RJQUdfQ0FQVFVSRV9QUk9UT0NPTCBuZWVkZWQgdG8gbG9nIG1lc3NhZ2VzLgogKi8Kc3RhdGljIGlubGluZSBpbnQKVUxUUkFfY2hlY2tfY2hhbm5lbF9zZXJ2ZXIoR1VJRCB0eXBlR3VpZCwKCQkJICAgY2hhciAqY2hhbm5lbE5hbWUsCgkJCSAgIFU2NCBleHBlY3RlZE1pbkJ5dGVzLAoJCQkgICBVNjQgYWN0dWFsQnl0ZXMsCgkJCSAgIGNoYXIgKmZpbGVOYW1lLCBpbnQgbGluZU51bWJlciwgdm9pZCAqbG9nQ3R4KQp7CglpZiAoZXhwZWN0ZWRNaW5CeXRlcyA+IDApCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkKCQkJCQkgKiBjaGFubmVsIHNpemUgKi8KCQlpZiAoYWN0dWFsQnl0ZXMgPCBleHBlY3RlZE1pbkJ5dGVzKSB7CgkJCUNIQU5ORUxfVTY0X01JU01BVENIKHR5cGVHdWlkLCBjaGFubmVsTmFtZSwgInNpemUiLAoJCQkJCSAgICAgZXhwZWN0ZWRNaW5CeXRlcywgYWN0dWFsQnl0ZXMsCgkJCQkJICAgICBmaWxlTmFtZSwgbGluZU51bWJlciwgbG9nQ3R4KTsKCQkJcmV0dXJuIDA7CgkJfQoJcmV0dXJuIDE7Cn0KCi8qIEdpdmVuIGEgZmlsZSBwYXRobmFtZSA8cz4gKHdpdGggJy8nIG9yICdcJyBzZXBhcmF0aW5nIGRpcmVjdG9yeSBub2RlcyksCiAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBub2RlIHdpdGhpbiB0aGF0IHBhdGhuYW1lIHN1Y2gKICogdGhhdCB0aGUgbnVtYmVyIG9mIG5vZGVzIGZyb20gdGhhdCBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBpcwogKiBOT1QgbW9yZSB0aGFuIDxuPi4gIE5vdGUgdGhhdCBpZiB0aGUgcGF0aG5hbWUgaGFzIGxlc3MgdGhhbiA8bj4gbm9kZXMKICogaW4gaXQsIHRoZSByZXR1cm4gcG9pbnRlciB3aWxsIGJlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KICovCnN0YXRpYyBpbmxpbmUgVTggKgpQYXRoTmFtZV9MYXN0X05fTm9kZXMoVTggKnMsIHVuc2lnbmVkIGludCBuKQp7CglVOCAqcCA9IHM7Cgl1bnNpZ25lZCBpbnQgbm9kZV9jb3VudCA9IDA7Cgl3aGlsZSAoKnAgIT0gJ1wwJykgewoJCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCgkJCW5vZGVfY291bnQrKzsKCQlwKys7Cgl9CglpZiAobm9kZV9jb3VudCA8PSBuKQoJCXJldHVybiBzOwoJd2hpbGUgKG4gPiAwKSB7CgkJcC0tOwoJCWlmIChwID09IHMpCgkJCWJyZWFrOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCB1bmxlc3Mgc29tZW9uZQoJCQkJICogaXMgY2hhbmdpbmcgdGhlIHN0cmluZyB3aGlsZSB3ZSBhcmUKCQkJCSAqIGxvb2tpbmcgYXQgaXQhISAqLwoJCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCgkJCW4tLTsKCX0KCXJldHVybiBwICsgMTsKfQoKc3RhdGljIGlubGluZSBpbnQKVUxUUkFfY2hhbm5lbF9jbGllbnRfYWNxdWlyZV9vcyh2b2lkIF9faW9tZW0gKnBDaGFubmVsLCBVOCAqY2hhbklkLAoJCQkJdm9pZCAqbG9nQ3R4LCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqZnVuYykKewoJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW4gPSBwQ2hhbm5lbDsKCglpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSB7CgkJaWYgKChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpCgkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfRElTQUJMRUQpID09IDApIHsKCQkJLyogd2UgYXJlIE5PVCB0aHJvdHRsaW5nIHRoaXMgbWVzc2FnZSAqLwoJCQl3cml0ZWIocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKSB8CgkJCSAgICAgICBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVELAoJCQkgICAgICAgJnBDaGFuLT5DbGlFcnJvck9TKTsKCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCgoJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEVSUiwKCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAoJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAoJCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gYWNxdWlyZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgRElTQUJMRUQgQCVzOiVkXG4iLAoJCQkJICAgICAgY2hhbklkLCBQYXRoTmFtZV9MYXN0X05fTm9kZXMoCgkJCQkJICAgICAgKFU4ICopIGZpbGUsIDQpLCBsaW5lKTsKCQl9CgkJcmV0dXJuIDA7Cgl9CglpZiAoKHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykgIT0gQ0hBTk5FTENMSV9PV05FRCkKCSAgICAmJiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZUJvb3QpID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB7CgkJLyogT3VyIGNvbXBldGl0b3IgaXMgRElTQUJMRUQsIHNvIHdlIGNhbiB0cmFuc2l0aW9uIHRvIE9XTkVEICovCgkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLAoJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAoJCQkgICAgICAiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gKCVzKSAlcyglZCktLT4lcyglZCkgQCVzOiVkXG4iLAoJCQkgICAgICBjaGFuSWQsICJDbGlTdGF0ZU9TIiwKCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCgkJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpKSwKCQkJICAgICAgcmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSwKCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoQ0hBTk5FTENMSV9PV05FRCksCgkJCSAgICAgIENIQU5ORUxDTElfT1dORUQsCgkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKikgZmlsZSwgNCksIGxpbmUpOwoJCXdyaXRlbChDSEFOTkVMQ0xJX09XTkVELCAmcENoYW4tPkNsaVN0YXRlT1MpOwoJCU1FTU9SWUJBUlJJRVI7Cgl9CglpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSB7CgkJaWYgKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgIT0gMCkgewoJCQkvKiB3ZSBhcmUgaW4gYW4gZXJyb3IgbXNnIHRocm90dGxpbmcgc3RhdGU7CgkJCSAqIGNvbWUgb3V0IG9mIGl0ICovCgkJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LAoJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lUT0ssCgkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKCQkJCSAgICAgICIlcyBDaGFubmVsIE9TIGNsaWVudCBhY3F1aXJlIG5vdyBzdWNjZXNzZnVsIEAlczolZFxuIiwKCQkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLAoJCQkJCQkJCSAgICA0KSwgbGluZSk7CgkJCXdyaXRlYigwLCAmcENoYW4tPkNsaUVycm9yT1MpOwoJCX0KCQlyZXR1cm4gMTsKCX0KCgkvKiBXZSBoYXZlIHRvIGRvIGl0IHRoZSAiaGFyZCB3YXkiLiAgV2UgdHJhbnNpdGlvbiB0byBCVVNZLAoJKiBhbmQgY2FuIHVzZSB0aGUgY2hhbm5lbCBpZmYgb3VyIGNvbXBldGl0b3IgaGFzIG5vdCBhbHNvCgkqIHRyYW5zaXRpb25lZCB0byBCVVNZLiAqLwoJaWYgKHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykgIT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkgewoJCWlmICgocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKQoJCSAgICAgJiBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEKSA9PSAwKSB7CgkJCS8qIHdlIGFyZSBOT1QgdGhyb3R0bGluZyB0aGlzIG1lc3NhZ2UgKi8KCQkJd3JpdGViKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgfAoJCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCwKCQkJICAgICAgICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CgkJCS8qIHRocm90dGxlIHVudGlsIGFjcXVpcmUgc3VjY2Vzc2Z1bCAqLwoJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEVSUiwKCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAoJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAoJCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gYWNxdWlyZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgTk9UIEFUVEFDSEVEIChzdGF0ZT0lcyglZCkpIEAlczolZFxuIiwKCQkJCSAgICAgIGNoYW5JZCwKCQkJCSAgICAgIFVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKAoJCQkJCSAgICAgIHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykpLAoJCQkJICAgICAgcmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSwKCQkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKikgZmlsZSwgNCksCgkJCQkgICAgICBsaW5lKTsKCQl9CgkJcmV0dXJuIDA7Cgl9Cgl3cml0ZWwoQ0hBTk5FTENMSV9CVVNZLCAmcENoYW4tPkNsaVN0YXRlT1MpOwoJTUVNT1JZQkFSUklFUjsKCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlQm9vdCkgPT0gQ0hBTk5FTENMSV9CVVNZKSB7CgkJaWYgKChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpCgkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSkgPT0gMCkgewoJCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCgkJCXdyaXRlYihyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpIHwKCQkJICAgICAgIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSwKCQkJICAgICAgICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CgkJCS8qIHRocm90dGxlIHVudGlsIGFjcXVpcmUgc3VjY2Vzc2Z1bCAqLwoJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEJVU1ksCgkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBmYWlsZWQgLSBob3N0IE9TIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgYm9vdCBCVVNZIEAlczolZFxuIiwKCQkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLAoJCQkJCQkJCSAgICA0KSwgbGluZSk7CgkJfQoJCS8qIHJlc2V0IGJ1c3kgKi8KCQl3cml0ZWwoQ0hBTk5FTENMSV9BVFRBQ0hFRCwgJnBDaGFuLT5DbGlTdGF0ZU9TKTsKCQlNRU1PUllCQVJSSUVSOwoJCXJldHVybiAwOwoJfQoJaWYgKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgIT0gMCkgewoJCS8qIHdlIGFyZSBpbiBhbiBlcnJvciBtc2cgdGhyb3R0bGluZyBzdGF0ZTsgY29tZSBvdXQgb2YgaXQgKi8KCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lUT0ssCgkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAoJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCgkJCSAgICAgICIlcyBDaGFubmVsIE9TIGNsaWVudCBhY3F1aXJlIG5vdyBzdWNjZXNzZnVsIEAlczolZFxuIiwKCQkJICAgICAgY2hhbklkLCBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsIDQpLAoJCQkgICAgICBsaW5lKTsKCQl3cml0ZWIoMCwgJnBDaGFuLT5DbGlFcnJvck9TKTsKCX0KCXJldHVybiAxOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQKVUxUUkFfY2hhbm5lbF9jbGllbnRfcmVsZWFzZV9vcyh2b2lkIF9faW9tZW0gKnBDaGFubmVsLCBVOCAqY2hhbklkLAoJCQkJdm9pZCAqbG9nQ3R4LCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqZnVuYykKewoJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW4gPSBwQ2hhbm5lbDsKCWlmIChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpICE9IDApIHsKCQkvKiB3ZSBhcmUgaW4gYW4gZXJyb3IgbXNnIHRocm90dGxpbmcgc3RhdGU7IGNvbWUgb3V0IG9mIGl0ICovCgkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLAoJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAoJCQkgICAgICAiJXMgQ2hhbm5lbCBPUyBjbGllbnQgZXJyb3Igc3RhdGUgY2xlYXJlZCBAJXM6JWRcbiIsCgkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwKCQkJICAgICAgbGluZSk7CgkJd3JpdGViKDAsICZwQ2hhbi0+Q2xpRXJyb3JPUyk7Cgl9CglpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSA9PSBDSEFOTkVMQ0xJX09XTkVEKQoJCXJldHVybjsKCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpICE9IENIQU5ORUxDTElfQlVTWSkgewoJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LCBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRFUlIsCgkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAoJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCgkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIHJlbGVhc2UgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IE5PVCBCVVNZIChzdGF0ZT0lcyglZCkpIEAlczolZFxuIiwKCQkJICAgICAgY2hhbklkLAoJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORygKCQkJCSAgICAgIHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykpLAoJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpLAoJCQkgICAgICBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsIDQpLCBsaW5lKTsKCQkvKiByZXR1cm47ICovCgl9Cgl3cml0ZWwoQ0hBTk5FTENMSV9BVFRBQ0hFRCwgJnBDaGFuLT5DbGlTdGF0ZU9TKTsgLyogcmVsZWFzZSBidXN5ICovCn0KCi8qCiogUm91dGluZSBEZXNjcmlwdGlvbjoKKiBUcmllcyB0byBpbnNlcnQgdGhlIHByZWJ1aWx0IHNpZ25hbCBwb2ludGVkIHRvIGJ5IHBTaWduYWwgaW50byB0aGUgbnRoCiogUXVldWUgb2YgdGhlIENoYW5uZWwgcG9pbnRlZCB0byBieSBwQ2hhbm5lbAoqCiogUGFyYW1ldGVyczoKKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKiBwU2lnbmFsOiAoSU4pIHBvaW50ZXIgdG8gdGhlIHNpZ25hbAoqCiogQXNzdW1wdGlvbnM6CiogLSBwQ2hhbm5lbCwgUXVldWUgYW5kIHBTaWduYWwgYXJlIHZhbGlkLgoqIC0gSWYgaW5zZXJ0aW9uIGZhaWxzIGR1ZSB0byBhIGZ1bGwgcXVldWUsIHRoZSBjYWxsZXIgd2lsbCBkZXRlcm1pbmUgdGhlCiogcmV0cnkgcG9saWN5IChlLmcuIHdhaXQgJiB0cnkgYWdhaW4sIHJlcG9ydCBhbiBlcnJvciwgZXRjLikuCioKKiBSZXR1cm4gdmFsdWU6IDEgaWYgdGhlIGluc2VydGlvbiBzdWNjZWVkcywgMCBpZiB0aGUgcXVldWUgd2FzCiogZnVsbC4KKi8KCnVuc2lnbmVkIGNoYXIgdmlzb3Jfc2lnbmFsX2luc2VydChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpwQ2hhbm5lbCwgVTMyIFF1ZXVlLAoJCQkJICB2b2lkICpwU2lnbmFsKTsKCi8qCiogUm91dGluZSBEZXNjcmlwdGlvbjoKKiBSZW1vdmVzIG9uZSBzaWduYWwgZnJvbSBDaGFubmVsIHBDaGFubmVsJ3MgbnRoIFF1ZXVlIGF0IHRoZQoqIHRpbWUgb2YgdGhlIGNhbGwgYW5kIGNvcGllcyBpdCBpbnRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQoqIHBTaWduYWwuCioKKiBQYXJhbWV0ZXJzOgoqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAoqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAoqIHBTaWduYWw6IChJTikgcG9pbnRlciB0byB3aGVyZSB0aGUgc2lnbmFscyBhcmUgdG8gYmUgY29waWVkCioKKiBBc3N1bXB0aW9uczoKKiAtIHBDaGFubmVsIGFuZCBRdWV1ZSBhcmUgdmFsaWQuCiogLSBwU2lnbmFsIHBvaW50cyB0byBhIG1lbW9yeSBhcmVhIGxhcmdlIGVub3VnaCB0byBob2xkIHF1ZXVlJ3MgU2lnbmFsU2l6ZQoqCiogUmV0dXJuIHZhbHVlOiAxIGlmIHRoZSByZW1vdmFsIHN1Y2NlZWRzLCAwIGlmIHRoZSBxdWV1ZSB3YXMKKiBlbXB0eS4KKi8KCnVuc2lnbmVkIGNoYXIgdmlzb3Jfc2lnbmFsX3JlbW92ZShDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpwQ2hhbm5lbCwgVTMyIFF1ZXVlLAoJCQkJICB2b2lkICpwU2lnbmFsKTsKCi8qCiogUm91dGluZSBEZXNjcmlwdGlvbjoKKiBSZW1vdmVzIGFsbCBzaWduYWxzIHByZXNlbnQgaW4gQ2hhbm5lbCBwQ2hhbm5lbCdzIG50aCBRdWV1ZSBhdCB0aGUKKiB0aW1lIG9mIHRoZSBjYWxsIGFuZCBjb3BpZXMgdGhlbSBpbnRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQoqIHBTaWduYWwuICBSZXR1cm5zIHRoZSAjIG9mIHNpZ25hbHMgY29waWVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcm91dGluZS4KKgoqIFBhcmFtZXRlcnM6CiogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCiogUXVldWU6IChJTikgbnRoIFF1ZXVlIG9mIHRoZSBJTyBDaGFubmVsCiogcFNpZ25hbDogKElOKSBwb2ludGVyIHRvIHdoZXJlIHRoZSBzaWduYWxzIGFyZSB0byBiZSBjb3BpZWQKKgoqIEFzc3VtcHRpb25zOgoqIC0gcENoYW5uZWwgYW5kIFF1ZXVlIGFyZSB2YWxpZC4KKiAtIHBTaWduYWwgcG9pbnRzIHRvIGEgbWVtb3J5IGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgUXVldWUncyBNYXhTaWduYWxzCiogIyBvZiBzaWduYWxzLCBlYWNoIG9mIHdoaWNoIGlzIFF1ZXVlJ3MgU2lnbmFsU2l6ZS4KKgoqIFJldHVybiB2YWx1ZToKKiAjIG9mIHNpZ25hbHMgY29waWVkLgoqLwp1bnNpZ25lZCBpbnQgU2lnbmFsUmVtb3ZlQWxsKHBDSEFOTkVMX0hFQURFUiBwQ2hhbm5lbCwgVTMyIFF1ZXVlLAoJCQkgICAgIHZvaWQgKnBTaWduYWwpOwoKLyoKKiBSb3V0aW5lIERlc2NyaXB0aW9uOgoqIERldGVybWluZSB3aGV0aGVyIGEgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LgoqCiogUGFyYW1ldGVyczoKKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKgoqIFJldHVybiB2YWx1ZToKKiAxIGlmIHRoZSBzaWduYWwgcXVldWUgaXMgZW1wdHksIDAgb3RoZXJ3aXNlLgoqLwp1bnNpZ25lZCBjaGFyIHZpc29yX3NpZ25hbHF1ZXVlX2VtcHR5KENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLAoJCQkJICAgICAgVTMyIFF1ZXVlKTsKCiNlbmRpZgo=