LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgZGVmaW5pdGlvbnMgZm9yIGdlbmVyYXRpbmcgaW5zdGFuY2VzCgogIExpY2Vuc2U6CgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICAgIGFyZSBtZXQ6CgogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgogICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCgogICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCiAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAogICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwogICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgogICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgogICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCiAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgoKICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCiAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CiAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgogICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCiAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgogICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEluc3REZWYuaCx2ICQKCiAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAoKICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKCiAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCgogICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CiAgICAgICAgICAgICAgICAgICAgLi4uCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgci5kLjogZmlyc3QgaW1wbGVtZW50YXRpb24KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIF9FUExJTlNUREVGX0hfCiNkZWZpbmUgX0VQTElOU1RERUZfSF8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gdHlwZXMgYW5kIG1hY3JvcyBmb3IgZ2VuZXJhdGluZyBpbnN0YW5jZXMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKdHlwZWRlZiBlbnVtIHsKCWtTdGF0ZVVudXNlZCA9IDAsCglrU3RhdGVEZWxldGVkID0gMSwKCWtTdGF0ZVVzZWQgPSAweEZGCn0gdEluc3RTdGF0ZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIHZvaWQgKnRFcGxQdHJJbnN0YW5jZTsKdHlwZWRlZiB1OCB0RXBsSW5zdGFuY2VIZGw7CgovLyBkZWZpbmUgY29uc3QgZm9yIGlsbGVnYWxlIHZhbHVlcwojZGVmaW5lIENDTV9JTExJTlNUQU5DRSAgICAgIE5VTEwKI2RlZmluZSBDQ01fSUxMSU5TVEFOQ0VfSERMICAweEZGCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBpZiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHRoZW4gdXNlIHRoaXMgbWFjcm9zCiNpZiAoRVBMX01BWF9JTlNUQU5DRVMgPiAxKQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIG1hY3JvIGRlZmluaXRpb24gZm9yIGluc3RhbmNlIHRhYmxlIGRlZmluaXRpb24KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBtZW1vcnkgYXR0cmlidXRlcyBmb3IgaW5zdGFuY2UgdGFibGUKI2RlZmluZSBTVEFUSUMJCQkvLyBwcmV2ZW50IHdhcm5pbmdzIGZvciB2YXJpYWJsZXMgd2l0aCBzYW1lIG5hbWUKCiNkZWZpbmUgSU5TVEFOQ0VfVFlQRV9CRUdJTiAgICAgdHlwZWRlZiBzdHJ1Y3QgewojZGVmaW5lIElOU1RBTkNFX1RZUEVfRU5EICAgICAgIH0gdEVwbEluc3RhbmNlSW5mbzsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBtYWNybyBkZWZpbml0aW9uIGZvciBBUEkgaW50ZXJmYWNlCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLy8gZGVjbGFyYXRpb246CgogICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiB3aXRoaW4gZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZSBvZiBBUEkgZnVuY3Rpb25zCiNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCBJbnN0YW5jZUhhbmRsZQojZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX0hETF8gICAgICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgSW5zdGFuY2VIYW5kbGUsCgogICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSB3aXRoaW4gZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZSBvZiBBUEkgZnVuY3Rpb25zCiNkZWZpbmUgQ0NNX0RFQ0xfUFRSX0lOU1RBTkNFX0hETCAgICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCAqcEluc3RhbmNlSGFuZGxlCiNkZWZpbmUgQ0NNX0RFQ0xfUFRSX0lOU1RBTkNFX0hETF8gICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCAqcEluc3RhbmNlSGFuZGxlLAoKICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gaW5zdGFuY2UgYXMgbG9rYWNsIHZhcmlhYmxlIHdpdGhpbiBmdW5jdGlvbnMKI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgICAgICAgICAgICAgdENjbUluc3RhbmNlSW5mbyAqcEluc3RhbmNlOwojZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IRExfTE9DQUwgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgICpwSW5zdGFuY2VIYW5kbGU7CgogICAgLy8gcmVmZXJlbmNlOgoKICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIGhhbmRsZSBmb3IgZnVuY3Rpb24gcGFyYW1ldGVycwojZGVmaW5lIENDTV9JTlNUQU5DRV9IREwgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW5jZUhhbmRsZQojZGVmaW5lIENDTV9JTlNUQU5DRV9IRExfICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW5jZUhhbmRsZSwKCiAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBpbnN0YW5jZSBwYXJhbWV0ZXIgZm9yIGZ1bmN0aW9uIHBhcmFtZXRlcnMKI2RlZmluZSBDQ01fSU5TVEFOQ0VfUEFSQU0ocGFyKSAgICAgICAgICAgICAgICAgcGFyCiNkZWZpbmUgQ0NNX0lOU1RBTkNFX1BBUkFNXyhwYXIpICAgICAgICAgICAgICAgIHBhciwKCiAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBpbnN0YW5jZSBwYXJhbWV0ZXIgZm9yIHdyaXRpbmcgb3IgcmVhZGluZyB2YWx1ZXMKI2RlZmluZSBDQ01fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpKQoKICAgIC8vIHByb2Nlc3Npbmc6CgogICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIGluc3RhbmNlIGhhbmRsZQojZGVmaW5lIENDTV9DSEVDS19JTlNUQU5DRV9IREwoKSAgICAgICAgICAgICAgICBpZiAoSW5zdGFuY2VIYW5kbGUgPj0gRVBMX01BWF9JTlNUQU5DRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsSWxsZWdhbEluc3RhbmNlKTt9CgogICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlCiNkZWZpbmUgQ0NNX0NIRUNLX1BUUl9JTlNUQU5DRV9IREwoKSAgICAgICAgICAgIGlmIChwSW5zdGFuY2VIYW5kbGUgPT0gTlVMTCkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gKGtFcGxJbnZhbGlkSW5zdGFuY2VQYXJhbSk7fQoKICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCiNkZWZpbmUgQ0NNX0dFVF9GUkVFX0lOU1RBTkNFX0FORF9IREwoKSAgICAgICAgIHBJbnN0YW5jZSA9IENjbUdldEZyZWVJbnN0YW5jZUFuZEhhbmRsZSAocEluc3RhbmNlSGFuZGxlKTsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUICgqcEluc3RhbmNlSGFuZGxlICE9IENDTV9JTExJTlNUQU5DRV9IREwpOwoKI2RlZmluZSBDQ01fQ0hFQ0tfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZSA9PSBDQ01fSUxMSU5TVEFOQ0UpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsTm9GcmVlSW5zdGFuY2UpO30KCiNkZWZpbmUgQ0NNX0dFVF9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSA9IENjbUdldEluc3RhbmNlUHRyIChJbnN0YW5jZUhhbmRsZSk7CiNkZWZpbmUgQ0NNX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgIHBJbnN0YW5jZSA9IEdldEZyZWVJbnN0YW5jZSAoKTsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUIChwSW5zdGFuY2UgIT0gQ0NNX0lMTElOU1RBTkNFKTsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBtYWNybyBkZWZpbml0aW9uIGZvciBzdGFjayBpbnRlcmZhY2UKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyLCBwcm90b3R5cGUgb3IgbG9jYWwgdmFyIGxpc3QKICAgIC8vIERlY2xhcmF0aW9uIG9mIHBvaW50ZXJzIHdpdGhpbiBmdW5jdGlvbiBwYXJhbWF0ZXIgbGlzdCBtdXN0IGRlZmluZWQgYXMgdm9pZCAqCiAgICAvLyBwb2ludGVyLgojZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIgICAgICAgICAgICAgICAgICAgdm9pZCAqcEluc3RhbmNlCiNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gICAgICAgICAgICAgICAgICB2b2lkICpwSW5zdGFuY2UsCiNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTCAgICAgICAgICAgICB0RXBsUHRySW5zdGFuY2UgIHBJbnN0YW5jZTsKCiAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlCiAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZQojZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLAojZGVmaW5lIEVQTF9NQ09fQUREUl9JTlNUQU5DRV9QVFJfICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZSwKCiAgICAvLyBtYWNybyBmb3IgYWNjZXNzIG9mIHN0cnVjdCBtZW1iZXJzIG9mIG9uZSBpbnN0YW5jZQogICAgLy8gQW4gYWNjZXNzIHRvIGEgbWVtYmVyIG9mIGluc3RhbmNlIHRhYmxlIG11c3QgYmUgY2FzdGVkIGJ5IHRoZSBsb2NhbAogICAgLy8gZGVmaW5lZCB0eXBlIG9mIGluc3RhbmNlIHRhYmxlLgojZGVmaW5lIEVQTF9NQ09fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCoodEVwbFB0ckluc3RhbmNlKXBJbnN0YW5jZSkKI2RlZmluZSBFUExfTUNPX0dMQl9WQVIodmFyKSAgICAgICAgICAgICAgICAgICAgICAgICgoKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpLT52YXIpCgogICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UKI2RlZmluZSBFUExfTUNPX0dFVF9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSA9ICh0RXBsUHRySW5zdGFuY2UpIEdldEluc3RhbmNlUHRyIChJbnN0YW5jZUhhbmRsZSk7CiNkZWZpbmUgRVBMX01DT19HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgICBwSW5zdGFuY2UgPSAodEVwbFB0ckluc3RhbmNlKSBHZXRGcmVlSW5zdGFuY2UgKCk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlICE9IENDTV9JTExJTlNUQU5DRSk7CgogICAgLy8gVGhpcyBtYWNybyBzaG91bGQgYmUgdXNlZCB0byBjaGVjayB0aGUgcGFzc2VkIHBvaW50ZXIgdG8gYW4gcHVibGljIGZ1bmN0aW9uCiNkZWZpbmUgRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpICAgICAgICAgICAgICBBU1NFUlQgKHBJbnN0YW5jZSAhPSBOVUxMKTsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUICgoKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpLT5tX0luc3RTdGF0ZSA9PSBrU3RhdGVVc2VkKTsKCiAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgojZGVmaW5lIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgdm9pZCAqKnBJbnN0YW5jZVB0cgojZGVmaW5lIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgdm9pZCAqKnBJbnN0YW5jZVB0ciwKCiAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKICAgIC8vIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgcGFyYW1ldGVyIHBhc3NpbmcgdG8gY2FsbGVkIGZ1bmN0aW9uLgojZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHRyCiNkZWZpbmUgRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQdHIsCgogICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgojZGVmaW5lIEVQTF9NQ09fQ0hFQ0tfUFRSX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgQVNTRVJUIChwSW5zdGFuY2VQdHIgIT0gTlVMTCk7CiNkZWZpbmUgRVBMX01DT19TRVRfUFRSX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgICAoKnBJbnN0YW5jZVB0ciA9IHBJbnN0YW5jZSk7CgojZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU0oYSkgICAgICAgICAgICAgICAgICAgKGEpCiNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV8oYSkgICAgICAgICAgICAgICAgICAoYSksCiNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkgICAgICAgICAgICAgICBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyAoRVBMX01DT19HTEJfVkFSIChtX2JJbnN0SW5kZXgpKQojZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYKCkgICAgICAgICAgICAgICAgRVBMX01DT19JTlNUQU5DRV9QQVJBTSAoRVBMX01DT19HTEJfVkFSIChtX2JJbnN0SW5kZXgpKQojZGVmaW5lIEVQTF9NQ09fV1JJVEVfSU5TVEFOQ0VfU1RBVEUoYSkgICAgICAgICAgICAgRVBMX01DT19HTEJfVkFSIChtX0luc3RTdGF0ZSkgPSBhOwoKICAgIC8vIHRoaXMgbWFjcm8gZGVsZXRlcyBhbGwgaW5zdGFuY2UgZW50cmllcyBhcyB1bnVzZWQKI2RlZmluZSBFUExfTUNPX0RFTEVURV9JTlNUQU5DRV9UQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdEVwbEluc3RhbmNlSW5mbyAqICAgcEluc3RhbmNlICAgICAgID0gJmFFcGxJbnN0YW5jZVRhYmxlX2dbMF07ICAgIFwKICAgICAgICB0RmFzdEJ5dGUgICAgICAgICAgICBJbnN0TnVtYmVyICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgIGkgICAgICAgICAgICAgICA9IEVQTF9NQVhfSU5TVEFOQ0VTOyAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcEluc3RhbmNlLT5tX0luc3RTdGF0ZSA9ICh1OCkga1N0YXRlVW51c2VkOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcEluc3RhbmNlLT5tX2JJbnN0SW5kZXggPSAodTgpIEluc3ROdW1iZXI7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcEluc3RhbmNlKys7IEluc3ROdW1iZXIrKzsgaS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUgKGkgIT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9CgogICAgLy8gZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgd2hpY2ggaGFzIHRvIGJlIGRlZmluZWQgaW4gZWFjaCBtb2R1bGUgb2YgQ0FOb3BlbiBzdGFjawojZGVmaW5lIEVQTF9NQ09fREVGSU5FX0lOU1RBTkNFX0ZDVCgpIFwKICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEluc3RhbmNlUHRyICh0RXBsSW5zdGFuY2VIZGwgSW5zdEhhbmRsZV9wKTsgIFwKICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEZyZWVJbnN0YW5jZSAodm9pZCk7CiNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3RhdGljIHRFcGxQdHJJbnN0YW5jZSBHZXRJbnN0YW5jZVB0ciAodEVwbEluc3RhbmNlSGRsIEluc3RIYW5kbGVfcCkgeyBcCiAgICAgICAgICAgIHJldHVybiAmYUVwbEluc3RhbmNlVGFibGVfZ1tJbnN0SGFuZGxlX3BdOyB9ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3RhdGljIHRFcGxQdHJJbnN0YW5jZSBHZXRGcmVlSW5zdGFuY2UgKHZvaWQpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHRFcGxJbnN0YW5jZUluZm8gKnBJbnN0YW5jZSAgID0gJmFFcGxJbnN0YW5jZVRhYmxlX2dbMF07ICAgICAgICAgICBcCiAgICAgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgIGkgICAgICAgICAgID0gRVBMX01BWF9JTlNUQU5DRVM7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRvIHsgaWYgKHBJbnN0YW5jZS0+bV9JbnN0U3RhdGUgIT0ga1N0YXRlVXNlZCkgeyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0RXBsUHRySW5zdGFuY2UpIHBJbnN0YW5jZTsgfSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBwSW5zdGFuY2UrKzsgaS0tOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHdoaWxlIChpICE9IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJldHVybiBDQ01fSUxMSU5TVEFOQ0U7IH0KCiAgICAvLyB0aGlzIG1hY3JvIGRlZmluZXMgdGhlIGluc3RhbmNlIHRhYmxlLiBFYWNoIGVudHJ5IGlzIHJlc2VydmVkIGZvciBhbiBpbnN0YW5jZSBvZiBDQU5vcGVuLgojZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9WQVIoKSBcCiAgICAgICAgc3RhdGljIHRFcGxJbnN0YW5jZUluZm8gYUVwbEluc3RhbmNlVGFibGVfZyBbRVBMX01BWF9JTlNUQU5DRVNdOwoKICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyBtZW1iZXIgdmFyaWFibGVzIGluIGluc3RhbmNlIHRhYmxlIHdoaWNoIGFyZSBuZWVkZWQgaW4KICAgIC8vIGFsbCBtb2R1bGVzIG9mIEVwbCBzdGFjawojZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKSBcCiAgICAgICAgU1RBVElDICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0luc3RTdGF0ZTsgXAogICAgICAgIFNUQVRJQyAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSW5zdEluZGV4OwoKI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKSAgICAgICAgICAgRVBMX01DT19JTlNUQU5DRV9QQVJBTV8gKEVQTF9NQ09fR0xCX1ZBUiAobV9iSW5zdEluZGV4KSkKI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWCgpICAgICAgICAgICAgRVBMX01DT19JTlNUQU5DRV9QQVJBTSAoRVBMX01DT19HTEJfVkFSIChtX2JJbnN0SW5kZXgpKQoKI2Vsc2UgLy8gb25seSBvbmUgaW5zdGFuY2UgaXMgdXNlZAoKICAgIC8vIE1lbW9yeSBhdHRyaWJ1dGVzIGZvciBpbnN0YW5jZSB0YWJsZS4KI2RlZmluZSBTVEFUSUMgICAgICBzdGF0aWMJLy8gcHJldmVudCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIHdpdGggc2FtZSBuYW1lCgojZGVmaW5lIElOU1RBTkNFX1RZUEVfQkVHSU4KI2RlZmluZSBJTlNUQU5DRV9UWVBFX0VORAoKLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiwgaW5pdGlhbGl6aW5nIGFuZCBtZW1iZXIgYWNjZXNzIGZvciBpbnN0YW5jZSBoYW5kbGUKLy8gVGhpcyBjbGFzcyBvZiBtYWNyb3MgYXJlIHVzZWQgYnkgQVBJIGZ1bmN0aW9uIHRvIGluZm9ybSBDQ00tbW9kdWwgd2hpY2gKLy8gaW5zdGFuY2UgaXMgdG8gYmUgdXNlZC4KCiAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBpbnN0YW5jZSBoYW5kbGUKICAgIC8vIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgcGFyYW1ldGVyIHBhc3NpbmcgdG8gQ0FOb3BlbiBBUEkgZnVuY3Rpb24uCiNkZWZpbmUgQ0NNX0lOU1RBTkNFX0hETAojZGVmaW5lIENDTV9JTlNUQU5DRV9IRExfCgojZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTAoKICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gd2l0aGluIHRoZSBmdW5jdGlvbiBoZWFkZXIgb3IgcHJvdG90eXBlCiNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgICAgIHZvaWQKI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IRExfCgogICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIGluc3RhbmNlIGhhbmRsZQojZGVmaW5lIENDTV9DSEVDS19JTlNUQU5DRV9IREwoKQoKICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gb2YgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUKI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgdm9pZAojZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IRExfCgogICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlCiNkZWZpbmUgQ0NNX0NIRUNLX1BUUl9JTlNUQU5DRV9IREwoKQoKICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCiNkZWZpbmUgQ0NNX0dFVF9GUkVFX0lOU1RBTkNFX0FORF9IREwoKQoKI2RlZmluZSBDQ01fQ0hFQ0tfSU5TVEFOQ0VfUFRSKCkKCiNkZWZpbmUgQ0NNX0dFVF9JTlNUQU5DRV9QVFIoKQojZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKQoKI2RlZmluZSBDQ01fSU5TVEFOQ0VfUEFSQU0ocGFyKQojZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTV8ocGFyKQoKI2RlZmluZSBDQ01fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgYUNjbUluc3RhbmNlVGFibGVfZ1swXQoKLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiwgaW5pdGlhbGl6aW5nIGFuZCBtZW1iZXIgYWNjZXNzIGZvciBpbnN0YW5jZSBwb2ludGVyCi8vIFRoaXMgY2xhc3Mgb2YgbWFjcm9zIGFyZSB1c2VkIGJ5IENBTm9wZW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gcG9pbnQgdG8gb25lIGluc3RhbmNlLgoKICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gd2l0aGluIHRoZSBmdW5jdGlvbiBoZWFkZXIsIHByb3RvdHlwZSBvciBsb2NhbCB2YXIgbGlzdAojZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIgICAgICAgICAgICAgICAgICAgdm9pZAojZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCiNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTAoKICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UKICAgIC8vIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgcGFyYW1ldGVyIHBhc3NpbmcgdG8gY2FsbGVkIGZ1bmN0aW9uLgojZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSCiNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFJfCiNkZWZpbmUgRVBMX01DT19BRERSX0lOU1RBTkNFX1BUUl8KCiAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZQojZGVmaW5lIEVQTF9NQ09fR0VUX0lOU1RBTkNFX1BUUigpCiNkZWZpbmUgRVBMX01DT19HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKQoKICAgIC8vIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHBhc3NlZCBwb2ludGVyIHRvIGFuIHB1YmxpYyBmdW5jdGlvbgojZGVmaW5lIEVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKQoKICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gb2YgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCiNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIgICAgICAgICAgICAgICB2b2lkCiNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCgogICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCiAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KI2RlZmluZSBFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIKI2RlZmluZSBFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfCgogICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgojZGVmaW5lIEVQTF9NQ09fQ0hFQ0tfUFRSX0lOU1RBTkNFX1BUUigpCiNkZWZpbmUgRVBMX01DT19TRVRfUFRSX0lOU1RBTkNFX1BUUigpCgojZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU0oYSkKI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyhhKQojZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYXygpCiNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFgoKQoKICAgIC8vIG1hY3JvIGZvciBhY2Nlc3Mgb2Ygc3RydWN0IG1lbWJlcnMgb2Ygb25lIGluc3RhbmNlCiNkZWZpbmUgRVBMX01DT19JTlNUX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICBhRXBsSW5zdGFuY2VUYWJsZV9nWzBdCiNkZWZpbmUgRVBMX01DT19HTEJfVkFSKHZhcikgICAgICAgICAgICAgICAgICAgICAgICAodmFyKQojZGVmaW5lIEVQTF9NQ09fV1JJVEVfSU5TVEFOQ0VfU1RBVEUoYSkKCiAgICAvLyB0aGlzIG1hY3JvIGRlbGV0ZXMgYWxsIGluc3RhbmNlIGVudHJpZXMgYXMgdW51c2VkCiNkZWZpbmUgRVBMX01DT19ERUxFVEVfSU5TVEFOQ0VfVEFCTEUoKQoKICAgIC8vIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIHdoaWNoIGhhcyB0byBiZSBkZWZpbmVkIGluIGVhY2ggbW9kdWxlIG9mIENBTm9wZW4gc3RhY2sKI2RlZmluZSBFUExfTUNPX0RFRklORV9JTlNUQU5DRV9GQ1QoKQojZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9GQ1QoKQoKICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyB0aGUgaW5zdGFuY2UgdGFibGUuIEVhY2ggZW50cnkgaXMgcmVzZXJ2ZWQgZm9yIGFuIGluc3RhbmNlIG9mIENBTm9wZW4uCiNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpCgogICAgLy8gdGhpcyBtYWNybyBkZWZpbmVzIG1lbWJlciB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgdGFibGUgd2hpY2ggYXJlIG5lZWRlZCBpbgogICAgLy8gYWxsIG1vZHVsZXMgb2YgQ0FOb3BlbiBzdGFjawojZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQoKI2VuZGlmCgojZW5kaWYgLy8gX0VQTElOU1RERUZfSF8KCi8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCi8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCg==