Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKICAgRGVzY3JpcHRpb246IGluZGl2aWR1YWwgY2hhbm5lbCBzdHJlYW0gaW5mbwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBDSEFOTkVMSU5GT19ICiNkZWZpbmUgQ0hBTk5FTElORk9fSAoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKCiNpbmNsdWRlICJhYWNfcm9tLmgiCiNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgojaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgojaW5jbHVkZSAib3ZlcmxhcGFkZC5oIgoKI2luY2x1ZGUgIm1kY3QuaCIKI2luY2x1ZGUgInN0ZXJlby5oIgojaW5jbHVkZSAicHVsc2VkYXRhLmgiCiNpbmNsdWRlICJhYWNkZWNfdG5zLmgiCgojaW5jbHVkZSAiYWFjZGVjX3Bucy5oIgoKI2luY2x1ZGUgImFhY2RlY19oY3JfdHlwZXMuaCIKI2luY2x1ZGUgInJ2bGNfaW5mby5oIgoKCiNpbmNsdWRlICJjb25jZWFsX3R5cGVzLmgiCgogI2luY2x1ZGUgImFhY2RlY19kcmNfdHlwZXMuaCIKCi8qIE91dHB1dCByZW5kZXJpbmcgbW9kZSAqLwp0eXBlZGVmIGVudW0gewogIEFBQ0RFQ19SRU5ERVJfSU5WQUxJRCA9IDAsCiAgQUFDREVDX1JFTkRFUl9JTURDVCwKICBBQUNERUNfUkVOREVSX0VMREZCLAogIEFBQ0RFQ19SRU5ERVJfTFBELAogIEFBQ0RFQ19SRU5ERVJfSU5USU1EQ1QKfSBBQUNERUNfUkVOREVSX01PREU7CgplbnVtIHsKICBNQVhfUVVBTlRJWkVEX1ZBTFVFID0gODE5MQp9OwoKZW51bQp7CiAgT25seUxvbmdTZXF1ZW5jZSA9IDAsCiAgTG9uZ1N0YXJ0U2VxdWVuY2UsCiAgRWlnaHRTaG9ydFNlcXVlbmNlLAogIExvbmdTdG9wU2VxdWVuY2UKfTsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgY29uc3QgU0hPUlQgKlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKICBjb25zdCBTSE9SVCAqU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKICBVQ0hBUiBOdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKICBVQ0hBUiBOdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CiAgVUlOVCBzYW1wbGluZ1JhdGVJbmRleDsKICBVSU5UIHNhbXBsaW5nUmF0ZTsKfSBTYW1wbGluZ1JhdGVJbmZvOwoKdHlwZWRlZiBzdHJ1Y3QKewogIFVDSEFSIENvbW1vbldpbmRvdzsKICBVQ0hBUiBHbG9iYWxHYWluOwoKfSBDUmF3RGF0YUluZm87Cgp0eXBlZGVmIHN0cnVjdAp7CiAgVUNIQVIgV2luZG93R3JvdXBMZW5ndGhbOF07CiAgVUNIQVIgV2luZG93R3JvdXBzOwogIFVDSEFSIFZhbGlkOwoKICBVQ0hBUiBXaW5kb3dTaGFwZTsgICAgLyogMDogc2luZSB3aW5kb3csIDE6IEtCRCwgMjogbG93IG92ZXJsYXAgKi8KICBVQ0hBUiBXaW5kb3dTZXF1ZW5jZTsgLyogU2VlIGVudW0gYWJvdmUsIDA6IGxvbmcsIDE6IHN0YXJ0LCAyOiBzaG9ydCwgMzogc3RvcCAqLwogIFVDSEFSIE1heFNmQmFuZHM7CiAgVUNIQVIgU2NhbGVGYWN0b3JHcm91cGluZzsKCiAgVUNIQVIgVG90YWxTZkJhbmRzOwoKfSBDSWNzSW5mbzsKCgplbnVtCnsKICBaRVJPX0hDQiA9IDAsCiAgRVNDQk9PSyAgPSAxMSwKICBOU1BFQ0JPT0tTID0gRVNDQk9PSyArIDEsCiAgQk9PS1NDTCAgICA9IE5TUEVDQk9PS1MsCiAgTk9JU0VfSENCICAgICAgPSAxMywKICBJTlRFTlNJVFlfSENCMiA9IDE0LAogIElOVEVOU0lUWV9IQ0IgID0gMTUsCiAgTEFTVF9IQ0IKfTsKCiNkZWZpbmUgVE5TX1NDQUxFICAzCgovKgogKiBUaGlzIHN0cnVjdCBtdXN0IGJlIGFsbG9jYXRlZCBvbmUgZm9yIGV2ZXJ5IGNoYW5uZWwgYW5kIG11c3QgYmUgcGVyc2lzdGVudC4KICovCnR5cGVkZWYgc3RydWN0CnsKICBGSVhQX0RCTCAqcE92ZXJsYXBCdWZmZXI7CiAgbWRjdF90IElNZGN0OwoKCgogIENEcmNDaGFubmVsRGF0YSAgIGRyY0RhdGE7CiAgQ0NvbmNlYWxtZW50SW5mbyBjb25jZWFsbWVudEluZm87Cgp9IENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm87CgoKLyoKICogVGhpcyB1bmlvbiBtdXN0IGJlIGFsbG9jYXRlZCBmb3IgZXZlcnkgZWxlbWVudCAodXAgdG8gMiBjaGFubmVscykuCiAqLwp0eXBlZGVmIHN0cnVjdCB7CgogIC8qIENvbW1vbiBiaXQgc3RyZWFtIGRhdGEgKi8KICBTSE9SVCBhU2NhbGVGYWN0b3JbKDgqMTYpXTsgICAgICAgICAgIC8qIFNwZWN0cmFsIHNjYWxlIGZhY3RvcnMgZm9yIGVhY2ggc2ZiIGluIGVhY2ggd2luZG93LiAqLwogIFNIT1JUIGFTZmJTY2FsZVsoOCoxNildOyAgICAgICAgICAgICAgLyogY291bGQgYmUgZnJlZSBhZnRlciBBcHBseVRvb2xzKCkgKi8KICBVQ0hBUiBhQ29kZUJvb2tbKDgqMTYpXTsgICAgICAgICAgICAgIC8qIHNlY3Rpb24gZGF0YTogY29kZWJvb2sgZm9yIGVhY2ggd2luZG93IGFuZCBzZmIuICovCiAgQ1Ruc0RhdGEgICAgICAgICBUbnNEYXRhOwogIENSYXdEYXRhSW5mbyAgICAgUmF3RGF0YUluZm87CgogIHNob3VsZEJlVW5pb24gewoKICAgIHN0cnVjdCB7CiAgICAgIENQdWxzZURhdGEgUHVsc2VEYXRhOwogICAgICBTSE9SVCBhTnVtTGluZUluU2VjNEhjcltNQVhfU0ZCX0hDUl07ICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgZXhjZXB0IGZvciBEcm0gc3ludGF4ICovCiAgICAgIFVDSEFSIGFDb2RlQm9va3M0SGNyW01BWF9TRkJfSENSXTsgICAgICAgICAgICAgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyBleGNlcHQgZm9yIERybSBzeW50YXguIFNhbWUgYXMgImFDb2RlQm9vayIgPyAqLwogICAgICBTSE9SVCBsZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsKICAgICAgU0NIQVIgbGVuT2ZMb25nZXN0Q29kZXdvcmQ7CiAgICAgIFNDSEFSIG51bWJlclNlY3Rpb247CiAgICAgIFNDSEFSIHJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSzsKICAgICAgU0NIQVIgcnZsY0ludGVuc2l0eVVzZWQ7CiAgICB9IGFhYzsKICB9IHNwZWNpZmljVG87Cgp9IENBYWNEZWNvZGVyRHluYW1pY0RhdGE7Cgp0eXBlZGVmIHNob3VsZEJlVW5pb24gewogIENBYWNEZWNvZGVyRHluYW1pY0RhdGEgcEFhY0RlY29kZXJEeW5hbWljRGF0YVsyXTsKCiAgLyogQ29tbW9uIHNpZ25hbCBkYXRhLCBjYW4gYmUgdXNlZCBvbmNlIHRoZSBiaXQgc3RyZWFtIGRhdGEgZnJvbSBhYm92ZSBpcyBub3QgdXNlZCBhbnltb3JlLiAqLwogIEZJWFBfREJMIG1kY3RPdXRUZW1wWzEwMjRdOwogIEZJWFBfREJMIHNicldvcmtCdWZmZXJbMTAyNCoyXTsKCn0gQ1dvcmtCdWZmZXJDb3JlMTsKCi8qIENvbW1vbiBkYXRhIHJlZmVyZW5jZWQgYnkgYWxsIGNoYW5uZWxzICovCnR5cGVkZWYgc3RydWN0IHsKCiAgQ1dvcmtCdWZmZXJDb3JlMSAqd29ya0J1ZmZlckNvcmUxOwogIEZJWFBfREJMKiB3b3JrQnVmZmVyQ29yZTI7CgogIENQbnNJbnRlckNoYW5uZWxEYXRhIHBuc0ludGVyQ2hhbm5lbERhdGE7CiAgSU5UIHBuc0N1cnJlbnRTZWVkOwogIElOVCBwbnNSYW5kb21TZWVkWyg4KjE2KV07CgogIENKb2ludFN0ZXJlb0RhdGEgam9pbnRTdGVyZW9EYXRhOyAgICAgICAgICAgICAgLyogT25lIGZvciBvbmUgZWxlbWVudCAqLwoKICBzaG91bGRCZVVuaW9uIHsKICAgIHN0cnVjdCB7CiAgICAgIENFckhjckluZm8gZXJIY3JJbmZvOwogICAgICBDRXJSdmxjSW5mbyBlclJ2bGNJbmZvOwogICAgICBTSE9SVCBhUnZsY1NjZkVzY1tSVkxDX01BWF9TRkJdOyAgICAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgKi8KICAgICAgU0hPUlQgYVJ2bGNTY2ZGd2RbUlZMQ19NQVhfU0ZCXTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzICovCiAgICAgIFNIT1JUIGFSdmxjU2NmQndkW1JWTENfTUFYX1NGQl07ICAgICAgICAgICAgICAgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyAqLwogICAgfSBhYWM7CgogIH0gb3ZlcmxheTsKCn0gQ0FhY0RlY29kZXJDb21tb25EYXRhOwoKCi8qCiAqIFRoaXMgc3RydWN0IG11c3QgYmUgYWxsb2NhdGVkIG9uZSBmb3IgZXZlcnkgY2hhbm5lbHMgb2YgZXZlcnkgZWxlbWVudCBhbmQgbXVzdCBiZSBwZXJzaXN0ZW50LgogKiBBbW9uZyBpdHMgbWVtYmVycywgdGhlIGZvbGxvd2luZyBtZW1vcnkgYXJlYXMgY2FuIGJlIG92ZXJ3cml0dGVuIHVuZGVyIHRoZSBnaXZlbiBjb25kaXRpb25zOgogKiAgLSBwU3BlY3RyYWxDb2VmZmljaWVudCBUaGUgbWVtb3J5IHBvaW50ZWQgdG8gY2FuIGJlIG92ZXJ3cml0dGVuIGFmdGVyIHRpbWUgc2lnbmFsIHJlbmRlcmluZy4KICogIC0gZGF0YSBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgdGltZSBzaWduYWwgcmVuZGVyaW5nLgogKiAgLSBwRHluRGF0YSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgZWFjaCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKCkgY2FsbC4KICogIC0gcENvbURhdGEtPm92ZXJsYXkgbWVtb3J5IHBvaW50ZWQgdG8gY2FuIGJlIG92ZXJ3cml0dGVuIGFmdGVyIGVhY2ggQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgpIGNhbGwuLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogIFNQRUNUUkFMX1BUUiBwU3BlY3RyYWxDb2VmZmljaWVudDsgICAgICAgICAgICAgLyogU3BlY3RyYWwgY29lZmZpY2llbnRzIG9mIGVhY2ggd2luZG93ICovCiAgU0hPUlQgc3BlY1NjYWxlWzhdOyAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHNoaWZ0IHZhbHVlcyBvZiBlYWNoIHNwZWN0cnVtIHdpbmRvdyAqLwogIENJY3NJbmZvIGljc0luZm87CiAgSU5UIGdyYW51bGVMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaXplIG9mIHNtYWxsZXN0IHNwZWN0cnVtIHBpZWNlICovCiAgVUNIQVIgRWxlbWVudEluc3RhbmNlVGFnOwoKICBBQUNERUNfUkVOREVSX01PREUgcmVuZGVyTW9kZTsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzaWduYWwgcmVuZGVyaW5nIG1vZGUgKi8KCiAgc2hvdWxkQmVVbmlvbiB7CiAgICBzdHJ1Y3QgewogICAgICBDUG5zRGF0YSBQbnNEYXRhOyAvKiBOb3QgcmVxdWlyZWQgZm9yIFVTQUMgKi8KICAgIH0gYWFjOwoKICAgIHN0cnVjdCB7CiAgICB9IHVzYWM7CiAgfSBkYXRhOwoKICBDQWFjRGVjb2RlckR5bmFtaWNEYXRhICpwRHluRGF0YTsgLyogRGF0YSByZXF1aXJlZCBmb3Igb25lIGVsZW1lbnQgYW5kIGRpc2NhcmRlZCBhZnRlciBkZWNvZGluZyAqLwogIENBYWNEZWNvZGVyQ29tbW9uRGF0YSAgKnBDb21EYXRhOyAvKiBEYXRhIHJlcXVpcmVkIGZvciBvbmUgY2hhbm5lbCBhdCBhIHRpbWUgZHVyaW5nIGRlY29kZSAqLwoKfSBDQWFjRGVjb2RlckNoYW5uZWxJbmZvOwoKLyogY2hhbm5lbGluZm8uY3BwICovCgpBQUNfREVDT0RFUl9FUlJPUiBnZXRTYW1wbGluZ1JhdGVJbmZvKFNhbXBsaW5nUmF0ZUluZm8gKnQsIFVJTlQgc2FtcGxlc1BlckZyYW1lLCBVSU5UIHNhbXBsaW5nUmF0ZUluZGV4LCBVSU5UIHNhbXBsaW5nUmF0ZSk7CgovKioKICogXGJyaWVmIFJlYWQgbWF4IFNGQiBmcm9tIGJpdCBzdHJlYW0gYW5kIGFzc2lnbiBUb3RhbFNmQmFuZHMgYWNjb3JkaW5nCiAqICAgICAgICB0byB0aGUgd2luZG93IHNlcXVlbmNlIGFuZCBzYW1wbGUgcmF0ZS4KICogXHBhcmFtIGhCcyBiaXQgc3RyZWFtIGhhbmRsZSBhcyBkYXRhIHNvdXJjZQogKiBccGFyYW0gcEljc0luZm8gSWNzSW5mbyBzdHJ1Y3R1cmUgdG8gcmVhZCB0aGUgd2luZG93IHNlcXVlbmNlIGFuZCBzdG9yZSBNYXhTZkJhbmRzIGFuZCBUb3RhbFNmQmFuZHMKICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHJlYWQgb25seQogKi8KQUFDX0RFQ09ERVJfRVJST1IgSWNzUmVhZE1heFNmYiAoCiAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAogICAgICAgIENJY3NJbmZvICpwSWNzSW5mbywKICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbwogICAgICAgICk7CgpBQUNfREVDT0RFUl9FUlJPUiBJY3NSZWFkKAogICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAogICAgICAgIENJY3NJbmZvICpwSWNzSW5mbywKICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvKiBTYW1wbGluZ1JhdGVJbmZvVGFibGUsCiAgICAgICAgY29uc3QgVUlOVCBmbGFncwogICAgICAgICk7CgovKiBzdGVyZW8uY3BwLCBvbmx5IGNhbGxlZCBmcm9tIHRoaXMgZmlsZSAqLwoKLyohCiAgXGJyaWVmIEFwcGxpZXMgTVMgc3RlcmVvLiAKICAKICBUaGUgZnVuY3Rpb24gYXBwbGllcyBNUyBzdGVyZW8uCgogIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGFhYyBjaGFubmVsIGluZm8uCiAgXHBhcmFtIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzIHBvaW50ZXIgdG8gc2NhbGVmYWN0b3IgYmFuZCBvZmZzZXRzLgogIFxwYXJhbSBwV2luZG93R3JvdXBMZW5ndGggcG9pbnRlciB0byB3aW5kb3cgZ3JvdXAgbGVuZ3RoIGFycmF5LgogIFxwYXJhbSB3aW5kb3dHcm91cHMgbnVtYmVyIG9mIHdpbmRvdyBncm91cHMuCiAgXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzIGluIGxlZnQgY2hhbm5lbC4KICBccGFyYW0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUiBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgc2NhbGVmYWN0b3IgYmFuZHMgaW4gcmlnaHQgY2hhbm5lbC4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IGRpZmZlciBmcm9tIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgb25seSBmb3IgVVNBQy4KICBccmV0dXJuICBub25lCiovCnZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5TVMoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSKTsKCi8qIQogIFxicmllZiBBcHBsaWVzIGludGVuc2l0eSBzdGVyZW8KCiAgVGhlIGZ1bmN0aW9uIGFwcGxpZXMgaW50ZW5zaXR5IHN0ZXJlby4KCiAgXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gYWFjIGNoYW5uZWwgaW5mby4KICBccGFyYW0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMgcG9pbnRlciB0byBzY2FsZWZhY3RvciBiYW5kIG9mZnNldHMuCiAgXHBhcmFtIHBXaW5kb3dHcm91cExlbmd0aCBwb2ludGVyIHRvIHdpbmRvdyBncm91cCBsZW5ndGggYXJyYXkuCiAgXHBhcmFtIHdpbmRvd0dyb3VwcyBudW1iZXIgb2Ygd2luZG93IGdyb3Vwcy4KICBccGFyYW0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkIG51bWJlciBvZiB0cmFuc21pdHRlZCBzY2FsZWZhY3RvciBiYW5kcy4KICBccGFyYW0gQ29tbW9uV2luZG93IGNvbW1vbiB3aW5kb3cgYml0LgogIFxyZXR1cm4gIG5vbmUKKi8Kdm9pZCBDSm9pbnRTdGVyZW9fQXBwbHlJUyhDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcFdpbmRvd0dyb3VwTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB3aW5kb3dHcm91cHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIENvbW1vbldpbmRvdyk7CgoKLyogYWFjZGVjX3Bucy5jcHAgKi8KaW50IENQbnNfSXNQbnNVc2VkIChjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kKTsKCnZvaWQgQ1Buc19TZXRDb3JyZWxhdGlvbihDUG5zRGF0YSAqcFBuc0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdXRvZnBoYXNlKTsKCi8qKioqKioqKioqKioqKioqKiogaW5saW5lIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKiovCgppbmxpbmUgVUNIQVIgSXNWYWxpZChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCnsKICByZXR1cm4gcEljc0luZm8tPlZhbGlkOwp9CgppbmxpbmUgVUNIQVIgSXNMb25nQmxvY2soY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQp7CiAgcmV0dXJuIChwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgIT0gRWlnaHRTaG9ydFNlcXVlbmNlKTsKfQoKaW5saW5lIFVDSEFSIEdldFdpbmRvd1NoYXBlKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKewogIHJldHVybiBwSWNzSW5mby0+V2luZG93U2hhcGU7Cn0KCmlubGluZSBVQ0hBUiBHZXRXaW5kb3dTZXF1ZW5jZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCnsKICByZXR1cm4gcEljc0luZm8tPldpbmRvd1NlcXVlbmNlOwp9CgppbmxpbmUgY29uc3QgU0hPUlQgKkdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBTYW1wbGluZ1JhdGVJbmZvKiBzYW1wbGluZ1JhdGVJbmZvKQp7CiAgaWYgKElzTG9uZ0Jsb2NrKHBJY3NJbmZvKSkKICB7CiAgICByZXR1cm4gc2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOwogIH0KICBlbHNlCiAgewogICAgcmV0dXJuIHNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CiAgfQp9CgppbmxpbmUgaW50IEdldFdpbmRvd3NQZXJGcmFtZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCnsKICByZXR1cm4gKHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9PSBFaWdodFNob3J0U2VxdWVuY2UpID8gOCA6IDE7Cn0KCmlubGluZSBVQ0hBUiBHZXRXaW5kb3dHcm91cHMoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQp7CiAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dHcm91cHM7Cn0KCmlubGluZSBVQ0hBUiBHZXRXaW5kb3dHcm91cExlbmd0aChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IElOVCBpbmRleCkKewogIHJldHVybiBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGhbaW5kZXhdOwp9CgppbmxpbmUgY29uc3QgVUNIQVIgKkdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQp7CiAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aDsKfQoKaW5saW5lIFVDSEFSIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCnsKICByZXR1cm4gcEljc0luZm8tPk1heFNmQmFuZHM7Cn0KCmlubGluZSBVQ0hBUiBHZXRTY2FsZU1heEZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMCwgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMSkKewogIHJldHVybiBmTWF4KHBJY3NJbmZvMC0+TWF4U2ZCYW5kcywgcEljc0luZm8xLT5NYXhTZkJhbmRzKTsKfQoKaW5saW5lIFVDSEFSIEdldFNjYWxlRmFjdG9yQmFuZHNUb3RhbChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCnsKICByZXR1cm4gcEljc0luZm8tPlRvdGFsU2ZCYW5kczsKfQoKLyogTm90ZTogVGhpcyBmdW5jdGlvbiBhcHBsaWVzIHRvIEFBQy1MQyBvbmx5ICEgKi8KaW5saW5lIFVDSEFSIEdldE1heGltdW1UbnNCYW5kcyhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IGludCBzYW1wbGluZ1JhdGVJbmRleCkKewogIHJldHVybiB0bnNfbWF4X2JhbmRzX3RibFtzYW1wbGluZ1JhdGVJbmRleF1bIUlzTG9uZ0Jsb2NrKHBJY3NJbmZvKV07Cn0KCiNlbmRpZiAvKiAjaWZuZGVmIENIQU5ORUxJTkZPX0ggKi8KCg==