LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjd4eF9oYWxfc2FpLmMNCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KICAqIEB2ZXJzaW9uIFYxLjAuMA0KICAqIEBkYXRlICAgIDEyLU1heS0yMDE1DQogICogQGJyaWVmICAgU0FJIEhBTCBtb2R1bGUgZHJpdmVyLg0KICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgDQogICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZXJpYWwgQXVkaW8gSW50ZXJmYWNlIChTQUkpIHBlcmlwaGVyYWw6DQogICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQogICogICAgICAgICAgICsgSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMNCiAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIA0KICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQogICogICAgICAgICANCiAgQHZlcmJhdGltDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICANCiAgWy4uXQ0KICAgIFRoZSBTQUkgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOg0KICAgIA0KICAgICgjKSBEZWNsYXJlIGEgU0FJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZS4NCiAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU0FJIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfU0FJX01zcEluaXQoKSBBUEk6DQogICAgICAgICgjIykgRW5hYmxlIHRoZSBTQUkgaW50ZXJmYWNlIGNsb2NrLiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgKCMjKSBTQUkgcGlucyBjb25maWd1cmF0aW9uOg0KICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFNBSSBHUElPcy4NCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBTQUkgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVsbC11cC4NCiAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfU0FJX1RyYW5zbWl0X0lUKCkNCiAgICAgICAgICAgICBhbmQgSEFMX1NBSV9SZWNlaXZlX0lUKCkgQVBJcyk6DQogICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFNBSSBpbnRlcnJ1cHQgcHJpb3JpdHkuDQogICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU0FJIElSUSBoYW5kbGUuDQoNCiAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9TQUlfVHJhbnNtaXRfRE1BKCkNCiAgICAgICAgICAgICBhbmQgSEFMX1NBSV9SZWNlaXZlX0RNQSgpIEFQSXMpOg0KICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggc3RyZWFtLg0KICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4NCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgDQogICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBTdHJlYW0uDQogICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIFNBSSBETUEgVHgvUnggaGFuZGxlLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSANCiAgICAgICAgICAgICAgICBETUEgVHgvUnggU3RyZWFtLg0KICANCiAgICgjKSBQcm9ncmFtIHRoZSBTQUkgTW9kZSwgU3RhbmRhcmQsIERhdGEgRm9ybWF0LCBNQ0xLIE91dHB1dCwgQXVkaW8gZnJlcXVlbmN5IGFuZCBQb2xhcml0eQ0KICAgICAgIHVzaW5nIEhBTF9TQUlfSW5pdCgpIGZ1bmN0aW9uLg0KICAgDQogICAtQC0gVGhlIHNwZWNpZmljIFNBSSBpbnRlcnJ1cHRzIChGSUZPIHJlcXVlc3QgYW5kIE92ZXJydW4gdW5kZXJydW4gaW50ZXJydXB0KQ0KICAgICAgIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fU0FJX0VOQUJMRV9JVCgpIGFuZCBfX1NBSV9ESVNBQkxFX0lUKCkNCiAgICAgICBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuICAgDQoNCiAgWy4uXSAgICAgICAgICAgDQogICAoQCkgU0FJIENsb2NrIFNvdXJjZSwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbWFuYWdlZCB0aHJvdWdoIFJDQ0V4X1BlcmlwaENMS0NvbmZpZygpDQogICAgICAgICAgICBmdW5jdGlvbiBpbiB0aGUgSEFMIFJDQyBkcml2ZXJzICAgICAgICANCiAgWy4uXSAgICAgICAgICAgDQogICAoQCkgTWFrZSBzdXJlIHRoYXQgZWl0aGVyOg0KICAgICAgICgrQCkgSTJTIFBMTCBpcyBjb25maWd1cmVkIG9yIA0KICAgICAgICgrQCkgU0FJIFBMTCBpcyBjb25maWd1cmVkIG9yIA0KICAgICAgICgrQCkgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGlzIGNvbmZpZ3VyZWQgYWZ0ZXIgc2V0dGluZyBjb3JyZWN0bHkgDQogICAgICAgICAgICB0aGUgZGVmaW5lIGNvbnN0YW50IEVYVEVSTkFMX0NMT0NLX1ZBTFVFIGluIHRoZSBzdG0zMmY3eHhfaGFsX2NvbmYuaCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICBbLi5dICAgICAgICAgICANCiAgICAoQCkgSW4gbWFzdGVyIFR4IG1vZGU6IGVuYWJsaW5nIHRoZSBhdWRpbyBibG9jayBpbW1lZGlhdGVseSBnZW5lcmF0ZXMgdGhlIGJpdCBjbG9jayANCiAgICAgICAgZm9yIHRoZSBleHRlcm5hbCBzbGF2ZXMgZXZlbiBpZiB0aGVyZSBpcyBubyBkYXRhIGluIHRoZSBGSUZPLCBIb3dldmVyIEZTIHNpZ25hbCANCiAgICAgICAgZ2VuZXJhdGlvbiBpcyBjb25kaXRpb25lZCBieSB0aGUgcHJlc2VuY2Ugb2YgZGF0YSBpbiB0aGUgRklGTy4NCiAgICAgICAgICAgICAgICAgDQogIFsuLl0gICAgICAgICAgIA0KICAgIChAKSBJbiBtYXN0ZXIgUnggbW9kZTogZW5hYmxpbmcgdGhlIGF1ZGlvIGJsb2NrIGltbWVkaWF0ZWx5IGdlbmVyYXRlcyB0aGUgYml0IGNsb2NrIA0KICAgICAgICBhbmQgRlMgc2lnbmFsIGZvciB0aGUgZXh0ZXJuYWwgc2xhdmVzLiANCiAgICAgICAgICAgICAgICANCiAgWy4uXSAgICAgICAgICAgDQogICAgKEApIEl0IGlzIG1hbmRhdG9yeSB0byByZXNwZWN0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpbiBvcmRlciB0byBhdm9pZCBiYWQgU0FJIGJlaGF2aW9yOiANCiAgICAgICAgKCtAKSAgRmlyc3QgYml0IE9mZnNldCA8PSAoU0xPVCBzaXplIC0gRGF0YSBzaXplKQ0KICAgICAgICAoK0ApICBEYXRhIHNpemUgPD0gU0xPVCBzaXplDQogICAgICAgICgrQCkgIE51bWJlciBvZiBTTE9UIHggU0xPVCBzaXplID0gRnJhbWUgbGVuZ3RoDQogICAgICAgICgrQCkgIFRoZSBudW1iZXIgb2Ygc2xvdHMgc2hvdWxkIGJlIGV2ZW4gd2hlbiBTQUlfRlNfQ0hBTk5FTF9JREVOVElGSUNBVElPTiBpcyBzZWxlY3RlZC4gIA0KDQogIFsuLl0gICAgICAgICANCiAgICAgVGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDogICAgIA0KICANCiAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKg0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICBbLi5dICAgIA0KICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TQUlfVHJhbnNtaXQoKSANCiAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU0FJX1JlY2VpdmUoKQ0KICAgDQogICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKiAgICANCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICBbLi5dICAgIA0KICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU0FJX1RyYW5zbWl0X0lUKCkgDQogICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TQUlfVHhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIA0KICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NBSV9UeENwbHRDYWxsYmFjaw0KICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU0FJX1JlY2VpdmVfSVQoKSANCiAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NBSV9SeENwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gDQogICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9TQUlfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiANCiAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TQUlfRXJyb3JDYWxsYmFjaw0KDQogICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKiAgICANCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgWy4uXSANCiAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcgSEFMX1NBSV9UcmFuc21pdF9ETUEoKSANCiAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NBSV9UeENwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gDQogICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU0FJX1R4Q3BsdENhbGxiYWNrDQogICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbiBibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9TQUlfUmVjZWl2ZV9ETUEoKSANCiAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NBSV9SeENwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gDQogICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX1NBSV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIA0KICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NBSV9FcnJvckNhbGxiYWNrDQogICAgICgrKSBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9TQUlfRE1BUGF1c2UoKSAgICAgIA0KICAgICAoKykgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX1NBSV9ETUFSZXN1bWUoKSAgDQogICAgICgrKSBTdG9wIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX1NBSV9ETUFTdG9wKCkgICAgICANCiAgIA0KICAgKioqIFNBSSBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKg0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IA0KICAgWy4uXQ0KICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIFVTQVJUIEhBTCBkcml2ZXIgOg0KICAgICAgIA0KICAgICAgKCspIF9fSEFMX1NBSV9FTkFCTEU6IEVuYWJsZSB0aGUgU0FJIHBlcmlwaGVyYWwNCiAgICAgICgrKSBfX0hBTF9TQUlfRElTQUJMRTogRGlzYWJsZSB0aGUgU0FJIHBlcmlwaGVyYWwNCiAgICAgICgrKSBfX0hBTF9TQUlfRU5BQkxFX0lUIDogRW5hYmxlIHRoZSBzcGVjaWZpZWQgU0FJIGludGVycnVwdHMNCiAgICAgICgrKSBfX0hBTF9TQUlfRElTQUJMRV9JVCA6IERpc2FibGUgdGhlIHNwZWNpZmllZCBTQUkgaW50ZXJydXB0cw0KICAgICAgKCspIF9fSEFMX1NBSV9HRVRfSVRfU09VUkNFOiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIFNBSSBpbnRlcnJ1cHQgc291cmNlIGlzIA0KICAgICAgICAgIGVuYWJsZWQgb3IgZGlzYWJsZWQNCiAgICAgICgrKSBfX0hBTF9TQUlfR0VUX0ZMQUc6IENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTQUkgZmxhZyBpcyBzZXQgb3Igbm90DQogIA0KICBAZW5kdmVyYmF0aW0NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogQGF0dGVudGlvbg0KICAqDQogICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE1IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQogICoNCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLA0KICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQogICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uDQogICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCiAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlDQogICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAgKg0KICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIg0KICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCiAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCiAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFDQogICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwNCiAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUg0KICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSDQogICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCiAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogICoNCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICovIA0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjd4eF9oYWwuaCINCg0KLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9IQUxfRHJpdmVyDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTQUkgU0FJDQogICogQGJyaWVmIFNBSSBIQUwgbW9kdWxlIGRyaXZlcg0KICAqIEB7DQogICovDQoNCiNpZmRlZiBIQUxfU0FJX01PRFVMRV9FTkFCTEVEDQoNCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiogQGRlZmdyb3VwIFNBSV9Qcml2YXRlX1R5cGVkZWZzICBTQUkgUHJpdmF0ZSBUeXBlZGVmcw0KICAqIEB7DQogICovDQp0eXBlZGVmIGVudW0gew0KICBTQUlfTU9ERV9ETUEsDQogIFNBSV9NT0RFX0lUDQp9U0FJX01vZGVUeXBlZGVmOw0KLyoqDQogICogQH0NCiAgKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiogQGRlZmdyb3VwIFNBSV9Qcml2YXRlX0NvbnN0YW50cyAgU0FJIFByaXZhdGUgQ29uc3RhbnRzDQogICogQHsNCiAgKi8NCiNkZWZpbmUgU0FJX0ZJRk9fU0laRSAgICAgICA4DQojZGVmaW5lIFNBSV9ERUZBVUxUX1RJTUVPVVQgNA0KLyoqDQogICogQH0NCiAgKi8NCg0KLyogU0FJIHJlZ2lzdGVycyBNYXNrcyAqLw0KI2RlZmluZSBDUjFfQ0xFQVJfTUFTSyAgICAgICAgICAgICgodWludDMyX3QpMHhGRjA0QzAxMCkNCiNkZWZpbmUgRlJDUl9DTEVBUl9NQVNLICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGODgwMDApDQojZGVmaW5lIFNMT1RSX0NMRUFSX01BU0sgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDBGMDIwKQ0KDQojZGVmaW5lIFNBSV9USU1FT1VUX1ZBTFVFICAgICAgICAgMTANCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCnN0YXRpYyB2b2lkIFNBSV9GaWxsRmlmbyhTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7DQpzdGF0aWMgdWludDMyX3QgU0FJX0ludGVycnVwdEZsYWcoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIHVpbnQzMl90IG1vZGUpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNBSV9Jbml0STJTKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50MzJfdCBwcm90b2NvbCwgdWludDMyX3QgZGF0YXNpemUsIHVpbnQzMl90IG5ic2xvdCk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0FJX0luaXRQQ00oU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIHVpbnQzMl90IHByb3RvY29sLCB1aW50MzJfdCBkYXRhc2l6ZSwgdWludDMyX3QgbmJzbG90KTsNCg0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNBSV9EaXNhYmxlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsNCnN0YXRpYyB2b2lkIFNBSV9UcmFuc21pdF9JVDhCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOw0Kc3RhdGljIHZvaWQgU0FJX1RyYW5zbWl0X0lUMTZCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOw0Kc3RhdGljIHZvaWQgU0FJX1RyYW5zbWl0X0lUMzJCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOw0Kc3RhdGljIHZvaWQgU0FJX1JlY2VpdmVfSVQ4Qml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsNCnN0YXRpYyB2b2lkIFNBSV9SZWNlaXZlX0lUMTZCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOw0Kc3RhdGljIHZvaWQgU0FJX1JlY2VpdmVfSVQzMkJpdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7DQoNCnN0YXRpYyB2b2lkIFNBSV9ETUFUeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIHZvaWQgU0FJX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIHZvaWQgU0FJX0RNQVJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTQUlfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTQUlfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KDQovKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIEBkZWZncm91cCBTQUlfRXhwb3J0ZWRfRnVuY3Rpb25zICBTQUkgRXhwb3J0ZWQgRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTQUlfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIA0KICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgDQogKg0KQHZlcmJhdGltICAgIA0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kIA0KICAgICAgICAgIGRlLWluaXRpYWxpemUgdGhlIFNBSXggcGVyaXBoZXJhbDoNCg0KICAgICAgKCspIFVzZXIgbXVzdCBpbXBsZW1lbnQgSEFMX1NBSV9Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcyANCiAgICAgICAgICBhbGwgcmVsYXRlZCBwZXJpcGhlcmFscyByZXNvdXJjZXMgKENMT0NLLCBHUElPLCBETUEsIElUIGFuZCBOVklDICkuDQoNCiAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU0FJX0luaXQoKSB0byBjb25maWd1cmUgdGhlIHNlbGVjdGVkIGRldmljZSB3aXRoIA0KICAgICAgICAgIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uOg0KICAgICAgICAoKyspIE1vZGUgKE1hc3Rlci9zbGF2ZSBUWC9SWCkNCiAgICAgICAgKCsrKSBQcm90b2NvbCANCiAgICAgICAgKCsrKSBEYXRhIFNpemUNCiAgICAgICAgKCsrKSBNQ0xLIE91dHB1dA0KICAgICAgICAoKyspIEF1ZGlvIGZyZXF1ZW5jeQ0KICAgICAgICAoKyspIEZJRk8gVGhyZXNob2xkDQogICAgICAgICgrKykgRnJhbWUgQ29uZmlnDQogICAgICAgICgrKykgU2xvdCBDb25maWcNCg0KICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TQUlfRGVJbml0KCkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIA0KICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBTQUkgcGVyaXBoZXJhbC4gICAgIA0KDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBzdHJ1Y3R1cmUgRnJhbWVJbml0LCBTbG90SW5pdCBhbmQgdGhlIGxvdyBwYXJ0IG9mIA0KICAqICAgICAgICAgSW5pdCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBjYWxsIHRoZSBmdW5jdGlvbg0KICAqICAgICAgICAgSEFMX1NBSV9Jbml0IHRvIGluaXRpYWxpemUgdGhlIFNBSSBibG9jay4NCiAgKiBAcGFyYW0gIGhzYWkgOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgDQogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHByb3RvY29sIDogb25lIG9mIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wgQHJlZiBTQUlfUHJvdG9jb2wNCiAgKiBAcGFyYW0gIGRhdGFzaXplIDogb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YXNpemUgQHJlZiBTQUlfUHJvdG9jb2xfRGF0YVNpemUNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIG5ic2xvdCAgIDogTnVtYmVyIG9mIHNsb3QuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0luaXRQcm90b2NvbChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDMyX3QgcHJvdG9jb2wsIHVpbnQzMl90IGRhdGFzaXplLCB1aW50MzJfdCBuYnNsb3QpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TQUlfU1VQUE9SVEVEX1BST1RPQ09MKHByb3RvY29sKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfUFJPVE9DT0xfREFUQVNJWkUoZGF0YXNpemUpKTsNCiAgDQogIHN3aXRjaChwcm90b2NvbCkNCiAgew0KICBjYXNlIFNBSV9JMlNfU1RBTkRBUkQgOg0KICBjYXNlIFNBSV9JMlNfTVNCSlVTVElGSUVEIDoNCiAgY2FzZSBTQUlfSTJTX0xTQkpVU1RJRklFRCA6DQogICAgc3RhdHVzID0gU0FJX0luaXRJMlMoaHNhaSwgcHJvdG9jb2wsIGRhdGFzaXplLCBuYnNsb3QpOw0KICAgIGJyZWFrOyAgDQogIGNhc2UgU0FJX1BDTV9MT05HIDoNCiAgY2FzZSBTQUlfUENNX1NIT1JUIDoNCiAgICBzdGF0dXMgPSBTQUlfSW5pdFBDTShoc2FpLCBwcm90b2NvbCwgZGF0YXNpemUsIG5ic2xvdCk7DQogICAgYnJlYWs7DQogIGRlZmF1bHQgOg0KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgICBicmVhazsNCiAgfQ0KICANCiAgaWYoc3RhdHVzID09IEhBTF9PSykNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9TQUlfSW5pdChoc2FpKTsNCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNBSSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIA0KICAqICAgICAgICAgaW4gdGhlIFNBSV9Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4NCiAgKiBAcGFyYW0gIGhzYWk6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9Jbml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0KeyANCiAgdWludDMyX3QgdG1wY2xvY2sgPSAwOw0KDQogIC8qIFRoaXMgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgU0FJX0NLX3ggKHZhbHVlIGluIEh6KSAqLw0KICB1aW50MzJfdCBmcmVxID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBTQUkgaGFuZGxlIGFsbG9jYXRpb24gKi8NCiAgaWYoaHNhaSA9PSBOVUxMKQ0KICB7DQogICAgcmV0dXJuIEhBTF9FUlJPUjsNCiAgfQ0KICANCiAgLyogQ2hlY2sgdGhlIFNBSSBCbG9jayBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TQUlfQVVESU9fRlJFUVVFTkNZKGhzYWktPkluaXQuQXVkaW9GcmVxdWVuY3kpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX1BST1RPQ09MKGhzYWktPkluaXQuUHJvdG9jb2wpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19NT0RFKGhzYWktPkluaXQuQXVkaW9Nb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfU1lOQ0VYVChoc2FpLT5Jbml0LlN5bmNocm9FeHQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19EQVRBU0laRShoc2FpLT5Jbml0LkRhdGFTaXplKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfRklSU1RfQklUKGhzYWktPkluaXQuRmlyc3RCaXQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19DTE9DS19TVFJPQklORyhoc2FpLT5Jbml0LkNsb2NrU3Ryb2JpbmcpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19TWU5DSFJPKGhzYWktPkluaXQuU3luY2hybykpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX09VVFBVVF9EUklWRShoc2FpLT5Jbml0Lk91dHB1dERyaXZlKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfTk9ESVZJREVSKGhzYWktPkluaXQuTm9EaXZpZGVyKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfRklGT19USFJFU0hPTEQoaHNhaS0+SW5pdC5GSUZPVGhyZXNob2xkKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfTU9OT19TVEVSRU9fTU9ERShoc2FpLT5Jbml0Lk1vbm9TdGVyZW9Nb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfQ09NUEFORElOR19NT0RFKGhzYWktPkluaXQuQ29tcGFuZGluZ01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19UUklTVEFURV9NQU5BR0VNRU5UKGhzYWktPkluaXQuVHJpU3RhdGUpKTsNCiAgDQogIC8qIENoZWNrIHRoZSBTQUkgQmxvY2sgRnJhbWUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX0ZSQU1FX0xFTkdUSChoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19BQ1RJVkVfRlJBTUUoaHNhaS0+RnJhbWVJbml0LkFjdGl2ZUZyYW1lTGVuZ3RoKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfRlNfREVGSU5JVElPTihoc2FpLT5GcmFtZUluaXQuRlNEZWZpbml0aW9uKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfRlNfUE9MQVJJVFkoaHNhaS0+RnJhbWVJbml0LkZTUG9sYXJpdHkpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19GU19PRkZTRVQoaHNhaS0+RnJhbWVJbml0LkZTT2Zmc2V0KSk7DQogIA0KICAvKiBDaGVjayB0aGUgU0FJIEJsb2NrIFNsb3QgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX0ZJUlNUQklUX09GRlNFVChoc2FpLT5TbG90SW5pdC5GaXJzdEJpdE9mZnNldCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX1NMT1RfU0laRShoc2FpLT5TbG90SW5pdC5TbG90U2l6ZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX1NMT1RfTlVNQkVSKGhzYWktPlNsb3RJbml0LlNsb3ROdW1iZXIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9TTE9UX0FDVElWRShoc2FpLT5TbG90SW5pdC5TbG90QWN0aXZlKSk7DQogIA0KICBpZihoc2FpLT5TdGF0ZSA9PSBIQUxfU0FJX1NUQVRFX1JFU0VUKQ0KICB7DQogICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLw0KICAgIGhzYWktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQogICAgDQogICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLw0KICAgIEhBTF9TQUlfTXNwSW5pdChoc2FpKTsNCiAgfQ0KICANCiAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX0JVU1k7DQogIA0KICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTQUkgcGVyaXBoZXJhbCAqLw0KICBTQUlfRGlzYWJsZShoc2FpKTsNCiAgDQogIC8qIFNBSSBCbG9jayBTeW5jaHJvIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBTQUlfQmxvY2tTeW5jaHJvQ29uZmlnKGhzYWkpOw0KICAgIA0KICAvKiBDb25maWd1cmUgTWFzdGVyIENsb2NrIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYSA6DQogICAgIE1DTEtfeCA9IFNBSV9DS194IC8gKE1DS0RJVlszOjBdICogMikgd2l0aCBNQ0xLX3ggPSAyNTYgKiBGUw0KICAgICBGUyA9IFNBSV9DS194IC8gKE1DS0RJVlszOjBdICogMikgKiAyNTYNCiAgICAgTUNLRElWWzM6MF0gPSBTQUlfQ0tfeCAvIEZTICogNTEyICovDQogIGlmKGhzYWktPkluaXQuQXVkaW9GcmVxdWVuY3kgIT0gU0FJX0FVRElPX0ZSRVFVRU5DWV9NQ0tESVYpDQogIHsgDQogIC8qIEdldCBTQUkgY2xvY2sgc291cmNlIGJhc2VkIG9uIFNvdXJjZSBjbG9jayBzZWxlY3Rpb24gZnJvbSBSQ0MgKi8NCiAgZnJlcSA9IFNBSV9HZXRJbnB1dENsb2NrKGhzYWkpOw0KICANCiAgICAvKiAoc2FpY2xvY2tzb3VyY2UgeCAxMCkgdG8ga2VlcCBTaWduaWZpY2FudCBkaWdpdHMgKi8NCiAgICB0bXBjbG9jayA9ICgoKGZyZXEgKiAxMCkgLyAoKGhzYWktPkluaXQuQXVkaW9GcmVxdWVuY3kpICogNTEyKSkpOw0KICAgIA0KICAgIGhzYWktPkluaXQuTWNrZGl2ID0gdG1wY2xvY2sgLyAxMDsNCiAgICANCiAgICAgICAgLyogUm91bmQgcmVzdWx0IHRvIHRoZSBuZWFyZXN0IGludGVnZXIgKi8NCiAgICBpZigodG1wY2xvY2sgJSAxMCkgPiA4KSANCiAgICB7DQogICAgICBoc2FpLT5Jbml0Lk1ja2Rpdis9IDE7DQogICAgfQ0KICB9DQoNCiAgLyogU0FJIEJsb2NrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogU0FJIENSMSBDb25maWd1cmF0aW9uICovDQogIGhzYWktPkluc3RhbmNlLT5DUjEmPX4oU0FJX3hDUjFfTU9ERSB8IFNBSV94Q1IxX1BSVENGRyB8ICBTQUlfeENSMV9EUyB8ICAgICAgXA0KICAgICAgICAgICAgICAgICAgICAgICAgIFNBSV94Q1IxX0xTQkZJUlNUIHwgU0FJX3hDUjFfQ0tTVFIgfCBTQUlfeENSMV9TWU5DRU4gfFwNCiAgICAgICAgICAgICAgICAgICAgICAgICBTQUlfeENSMV9NT05PIHwgU0FJX3hDUjFfT1VURFJJViAgfCBTQUlfeENSMV9ETUFFTiB8ICBcDQogICAgICAgICAgICAgICAgICAgICAgICAgU0FJX3hDUjFfTk9ESVYgfCBTQUlfeENSMV9NQ0tESVYpOw0KICANCiAgaHNhaS0+SW5zdGFuY2UtPkNSMXw9IChoc2FpLT5Jbml0LkF1ZGlvTW9kZSB8IGhzYWktPkluaXQuUHJvdG9jb2wgfCAgICAgICAgICAgXA0KICAgICAgICAgICAgICAgICAgICAgICAgaHNhaS0+SW5pdC5EYXRhU2l6ZSB8IGhzYWktPkluaXQuRmlyc3RCaXQgIHwgICAgICAgICAgIFwNCiAgICAgICAgICAgICAgICAgICAgICAgIGhzYWktPkluaXQuQ2xvY2tTdHJvYmluZyB8IGhzYWktPkluaXQuU3luY2hybyB8ICAgICAgICBcDQogICAgICAgICAgICAgICAgICAgICAgICBoc2FpLT5Jbml0Lk1vbm9TdGVyZW9Nb2RlIHwgaHNhaS0+SW5pdC5PdXRwdXREcml2ZSB8ICAgXA0KICAgICAgICAgICAgICAgICAgICAgICAgaHNhaS0+SW5pdC5Ob0RpdmlkZXIgfCAoaHNhaS0+SW5pdC5NY2tkaXYgPDwgMjApIHwgaHNhaS0+SW5pdC5Db21wYW5kaW5nTW9kZSk7ICANCiAgDQogIC8qIFNBSSBDUjIgQ29uZmlndXJhdGlvbiAqLw0KICBoc2FpLT5JbnN0YW5jZS0+Q1IyJj0gfihTQUlfeENSMl9GVEggfCBTQUlfeENSMl9GRkxVU0ggfCBTQUlfeENSMl9DT01QKTsNCiAgaHNhaS0+SW5zdGFuY2UtPkNSMnw9ICAoaHNhaS0+SW5pdC5GSUZPVGhyZXNob2xkIHwgaHNhaS0+SW5pdC5Db21wYW5kaW5nTW9kZSB8IGhzYWktPkluaXQuVHJpU3RhdGUpOw0KDQoNCiAgLyogU0FJIEZyYW1lIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBoc2FpLT5JbnN0YW5jZS0+RlJDUiY9KH4oU0FJX3hGUkNSX0ZSTCB8IFNBSV94RlJDUl9GU0FMTCB8IFNBSV94RlJDUl9GU0RFRiB8IFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBSV94RlJDUl9GU1BPIHwgU0FJX3hGUkNSX0ZTT0ZGKSk7DQogIGhzYWktPkluc3RhbmNlLT5GUkNSfD0oKGhzYWktPkZyYW1lSW5pdC5GcmFtZUxlbmd0aCAtIDEpICB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzYWktPkZyYW1lSW5pdC5GU09mZnNldCB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzYWktPkZyYW1lSW5pdC5GU0RlZmluaXRpb24gfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc2FpLT5GcmFtZUluaXQuRlNQb2xhcml0eSAgIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChoc2FpLT5GcmFtZUluaXQuQWN0aXZlRnJhbWVMZW5ndGggLSAxKSA8PCA4KSk7ICANCiAgDQogIC8qIFNBSSBCbG9ja194IFNMT1QgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBUaGlzIHJlZ2lzdGVyIGhhcyBubyBtZWFuaW5nIGluIEFDkjk3IGFuZCBTUERJRiBhdWRpbyBwcm90b2NvbCAqLw0KICBoc2FpLT5JbnN0YW5jZS0+U0xPVFImPSAofihTQUlfeFNMT1RSX0ZCT0ZGIHwgU0FJX3hTTE9UUl9TTE9UU1ogfCAgICAgICAgICAgIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FJX3hTTE9UUl9OQlNMT1QgfCBTQUlfeFNMT1RSX1NMT1RFTiApKTsNCiAgDQogIGhzYWktPkluc3RhbmNlLT5TTE9UUnw9ICBoc2FpLT5TbG90SW5pdC5GaXJzdEJpdE9mZnNldCB8ICBoc2FpLT5TbG90SW5pdC5TbG90U2l6ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhzYWktPlNsb3RJbml0LlNsb3RBY3RpdmUgfCAoKGhzYWktPlNsb3RJbml0LlNsb3ROdW1iZXIgLSAxKSA8PCAgOCk7ICAgICAgICAgICANCiAgDQogIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIGNvZGUgKi8NCiAgaHNhaS0+RXJyb3JDb2RlID0gSEFMX1NBSV9FUlJPUl9OT05FOw0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgU0FJIHN0YXRlICovDQogIGhzYWktPlN0YXRlPSBIQUxfU0FJX1NUQVRFX1JFQURZOw0KICANCiAgLyogUmVsZWFzZSBMb2NrICovDQogIF9fSEFMX1VOTE9DSyhoc2FpKTsNCiAgDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgU0FJIHBlcmlwaGVyYWwuIA0KICAqIEBwYXJhbSAgaHNhaTogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0RlSW5pdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkNCnsNCiAgLyogQ2hlY2sgdGhlIFNBSSBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KICBpZihoc2FpID09IE5VTEwpDQogIHsNCiAgICByZXR1cm4gSEFMX0VSUk9SOw0KICB9DQoNCiAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX0JVU1k7DQoNCiAgLyogRGlzYWJsZWQgQWxsIGludGVycnVwdCBhbmQgY2xlYXIgYWxsIHRoZSBmbGFnICovDQogIGhzYWktPkluc3RhbmNlLT5JTVIgPSAwOw0KICBoc2FpLT5JbnN0YW5jZS0+Q0xSRlIgPSAweEZGRkZGRkZGOw0KICANCiAgLyogRGlzYWJsZSB0aGUgU0FJICovDQogIFNBSV9EaXNhYmxlKGhzYWkpOw0KDQogIC8qIEZsdXNoIHRoZSBmaWZvICovDQogIFNFVF9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfRkZMVVNIKTsNCiAgDQogIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovDQogIEhBTF9TQUlfTXNwRGVJbml0KGhzYWkpOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8NCiAgaHNhaS0+RXJyb3JDb2RlID0gSEFMX1NBSV9FUlJPUl9OT05FOw0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgU0FJIHN0YXRlICovDQogIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRVNFVDsNCg0KICAvKiBSZWxlYXNlIExvY2sgKi8NCiAgX19IQUxfVU5MT0NLKGhzYWkpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiBTQUkgTVNQIEluaXQuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TQUlfTXNwSW5pdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkNCnsNCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9TQUlfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLyANCn0NCg0KLyoqDQogICogQGJyaWVmIFNBSSBNU1AgRGVJbml0Lg0KICAqIEBwYXJhbSAgaHNhaTogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU0FJX01zcERlSW5pdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkNCnsNCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9TQUlfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovIA0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNBSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgDQogKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zIA0KICoNCkB2ZXJiYXRpbSAgIA0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIA0KICAgIFsuLl0NCiAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU0FJIGRhdGEgDQogICAgdHJhbnNmZXJzLg0KDQogICAgKCspIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6DQogICAgICAgKCsrKSBCbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHRoZSBwb2xsaW5nIG1vZGUuIA0KICAgICAgICAgICAgVGhlIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uIA0KICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLiAgDQogICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMgDQogICAgICAgICAgICBvciBETUEuIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIgc3RhcnR1cC4NCiAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZSANCiAgICAgICAgICAgIGRlZGljYXRlZCBTQUkgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbiANCiAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLg0KDQogICAgKCspIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIGFyZSA6DQogICAgICAgICgrKykgSEFMX1NBSV9UcmFuc21pdCgpDQogICAgICAgICgrKykgSEFMX1NBSV9SZWNlaXZlKCkNCiAgICAgICAgKCsrKSBIQUxfU0FJX1RyYW5zbWl0UmVjZWl2ZSgpDQogICAgICAgIA0KICAgICgrKSBOb24gQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoNCiAgICAgICAgKCsrKSBIQUxfU0FJX1RyYW5zbWl0X0lUKCkNCiAgICAgICAgKCsrKSBIQUxfU0FJX1JlY2VpdmVfSVQoKQ0KICAgICAgICAoKyspIEhBTF9TQUlfVHJhbnNtaXRSZWNlaXZlX0lUKCkNCg0KICAgICgrKSBOb24gQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBETUEgYXJlIDoNCiAgICAgICAgKCsrKSBIQUxfU0FJX1RyYW5zbWl0X0RNQSgpDQogICAgICAgICgrKykgSEFMX1NBSV9SZWNlaXZlX0RNQSgpDQogICAgICAgICgrKykgSEFMX1NBSV9UcmFuc21pdFJlY2VpdmVfRE1BKCkNCg0KICAgICgrKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbiBCbG9ja2luZyBtb2RlOg0KICAgICAgICAoKyspIEhBTF9TQUlfVHhDcGx0Q2FsbGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TQUlfRXJyb3JDYWxsYmFjaygpDQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgVHJhbnNtaXRzIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplOiBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQogICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX1RyYW5zbWl0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90KiBwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkNCnsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsNCiAgDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpIA0KICB7DQogICAgcmV0dXJuICBIQUxfRVJST1I7DQogIH0NCiAgDQogIGlmKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpDQogIHsgIA0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc2FpKTsNCiAgICANCiAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfQlVTWV9UWDsNCiAgICBoc2FpLT5FcnJvckNvZGUgPSBIQUxfU0FJX0VSUk9SX05PTkU7DQogICAgaHNhaS0+WGZlclNpemUgPSBTaXplOw0KICAgIGhzYWktPlhmZXJDb3VudCA9IFNpemU7DQogICAgaHNhaS0+cEJ1ZmZQdHIgPSBwRGF0YTsNCiAgICANCiAgICAvKiBDaGVjayBpZiB0aGUgU0FJIGlzIGFscmVhZHkgZW5hYmxlZCAqLyANCiAgICBpZigoaHNhaS0+SW5zdGFuY2UtPkNSMSAmIFNBSV94Q1IxX1NBSUVOKSAhPSBTQUlfeENSMV9TQUlFTikNCiAgICB7DQogICAgICAvKiBmaWxsIHRoZSBmaWZvIHdpdGggZGF0YSBiZWZvcmUgdG8gZW5hYmxlZCB0aGUgU0FJICovDQogICAgICBTQUlfRmlsbEZpZm8oaHNhaSk7ICAgICAgDQogICAgICAvKiBFbmFibGUgU0FJIHBlcmlwaGVyYWwgKi8gICAgDQogICAgICBfX0hBTF9TQUlfRU5BQkxFKGhzYWkpOw0KICAgIH0NCiAgICANCiAgICB3aGlsZShoc2FpLT5YZmVyQ291bnQgPiAwKQ0KICAgIHsgDQogICAgICAvKiBXcml0ZSBkYXRhIGlmIHRoZSBGSUZPIGlzIG5vdCBmdWxsICovDQogICAgICBpZigoaHNhaS0+SW5zdGFuY2UtPlNSICYgU0FJX3hTUl9GTFZMKSAhPSBTQUlfRklGT1NUQVRVU19GVUxMKQ0KICAgICAgew0KICAgICAgICBpZigoaHNhaS0+SW5pdC5EYXRhU2l6ZSA9PSBTQUlfREFUQVNJWkVfOCkgJiYgKGhzYWktPkluaXQuQ29tcGFuZGluZ01vZGUgPT0gU0FJX05PQ09NUEFORElORykpDQogICAgICAgIHsgICAgICANCiAgICAgICAgICBoc2FpLT5JbnN0YW5jZS0+RFIgPSAoKmhzYWktPnBCdWZmUHRyKyspOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoaHNhaS0+SW5pdC5EYXRhU2l6ZSA8PSBTQUlfREFUQVNJWkVfMTYpDQogICAgICAgIHsNCiAgICAgICAgICBoc2FpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzYWktPnBCdWZmUHRyKTsNCiAgICAgICAgICBoc2FpLT5wQnVmZlB0cis9IDI7ICAgICAgICANCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBoc2FpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MzJfdCAqKWhzYWktPnBCdWZmUHRyKTsNCiAgICAgICAgICBoc2FpLT5wQnVmZlB0cis9IDQ7DQogICAgICAgIH0gICAgICAgDQogICAgICAgIGhzYWktPlhmZXJDb3VudC0tOyANCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgLyogR2V0IHRpY2sgKi8NCiAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgICAgICANCiAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovDQogICAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkNCiAgICAgICAgew0KICAgICAgICAgIGlmKChUaW1lb3V0ID09IDApfHwoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogICAgICAgICAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9USU1FT1VUOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNhaSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8qIENoYW5nZSB0aGUgU0FJIHN0YXRlICovDQogICAgICAgICAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfVElNRU9VVDsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KICAgICAgICAgIH0NCiAgICAgICAgfSANCiAgICAgIH0NCiAgICB9ICAgICAgDQogICAgDQogICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOyANCiAgICANCiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgX19IQUxfVU5MT0NLKGhzYWkpOw0KICAgIA0KICAgIHJldHVybiBIQUxfT0s7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIEhBTF9CVVNZOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVjZWl2ZXMgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4gDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplOiBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZA0KICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9SZWNlaXZlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkNCnsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsNCiAgDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpIA0KICB7DQogICAgcmV0dXJuICBIQUxfRVJST1I7DQogIH0NCiAgDQogIGlmKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpDQogIHsgDQogICAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgICBfX0hBTF9MT0NLKGhzYWkpOw0KICAgIA0KICAgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9CVVNZX1JYOw0KICAgIGhzYWktPkVycm9yQ29kZSA9IEhBTF9TQUlfRVJST1JfTk9ORTsNCiAgICBoc2FpLT5wQnVmZlB0ciA9IHBEYXRhOw0KICAgIGhzYWktPlhmZXJTaXplID0gU2l6ZTsNCiAgICBoc2FpLT5YZmVyQ291bnQgPSBTaXplOw0KICAgIA0KICAgIC8qIENoZWNrIGlmIHRoZSBTQUkgaXMgYWxyZWFkeSBlbmFibGVkICovIA0KICAgIGlmKChoc2FpLT5JbnN0YW5jZS0+Q1IxICYgU0FJX3hDUjFfU0FJRU4pICE9IFNBSV94Q1IxX1NBSUVOKQ0KICAgIHsNCiAgICAgIC8qIEVuYWJsZSBTQUkgcGVyaXBoZXJhbCAqLyAgICANCiAgICAgIF9fSEFMX1NBSV9FTkFCTEUoaHNhaSk7DQogICAgfQ0KICAgIA0KICAgIC8qIFJlY2VpdmUgZGF0YSAqLw0KICAgIHdoaWxlKGhzYWktPlhmZXJDb3VudCA+IDApDQogICAgew0KICAgICAgDQogICAgICBpZigoaHNhaS0+SW5zdGFuY2UtPlNSICYgU0FJX3hTUl9GTFZMKSAhPSBTQUlfRklGT1NUQVRVU19FTVBUWSkNCiAgICAgIHsNCiAgICAgICAgaWYoKGhzYWktPkluaXQuRGF0YVNpemUgPT0gU0FJX0RBVEFTSVpFXzgpICYmIChoc2FpLT5Jbml0LkNvbXBhbmRpbmdNb2RlID09IFNBSV9OT0NPTVBBTkRJTkcpKQ0KICAgICAgICB7DQogICAgICAgICAgKCpoc2FpLT5wQnVmZlB0cisrKSA9IGhzYWktPkluc3RhbmNlLT5EUjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKGhzYWktPkluaXQuRGF0YVNpemUgPD0gU0FJX0RBVEFTSVpFXzE2KQ0KICAgICAgICB7DQogICAgICAgICAgKigodWludDE2X3QqKWhzYWktPnBCdWZmUHRyKSA9IGhzYWktPkluc3RhbmNlLT5EUjsNCiAgICAgICAgICBoc2FpLT5wQnVmZlB0cis9IDI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgKigodWludDMyX3QqKWhzYWktPnBCdWZmUHRyKSA9IGhzYWktPkluc3RhbmNlLT5EUjsNCiAgICAgICAgICBoc2FpLT5wQnVmZlB0cis9IDQ7DQogICAgICAgIH0gIA0KICAgICAgICBoc2FpLT5YZmVyQ291bnQtLTsgDQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8qIEdldCB0aWNrICovDQogICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQogICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KICAgICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpDQogICAgICAgIHsNCiAgICAgICAgICBpZigoVGltZW91dCA9PSAwKXx8KChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KSkNCiAgICAgICAgICB7DQogICAgICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KICAgICAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfVElNRU9VVDsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhzYWkpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKiBDaGFuZ2UgdGhlIFNBSSBzdGF0ZSAqLw0KICAgICAgICAgICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1RJTUVPVVQ7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9ICAgICAgDQogICAgDQogICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOyANCiAgICANCiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgX19IQUxfVU5MT0NLKGhzYWkpOw0KICAgIA0KICAgIHJldHVybiBIQUxfT0s7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIEhBTF9CVVNZOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgVHJhbnNtaXRzIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplOiBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX1RyYW5zbWl0X0lUKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsgIA0KICBpZihoc2FpLT5TdGF0ZSA9PSBIQUxfU0FJX1NUQVRFX1JFQURZKQ0KICB7DQogICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDApKSANCiAgICB7DQogICAgICByZXR1cm4gIEhBTF9FUlJPUjsNCiAgICB9DQogICAgDQogICAgaHNhaS0+cEJ1ZmZQdHIgPSBwRGF0YTsNCiAgICBoc2FpLT5YZmVyU2l6ZSA9IFNpemU7DQogICAgaHNhaS0+WGZlckNvdW50ID0gU2l6ZTsNCiAgICANCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHNhaSk7DQogICAgDQogICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX0JVU1lfVFg7DQogICAgDQogICAgaWYoKGhzYWktPkluaXQuRGF0YVNpemUgPT0gU0FJX0RBVEFTSVpFXzgpICYmIChoc2FpLT5Jbml0LkNvbXBhbmRpbmdNb2RlID09IFNBSV9OT0NPTVBBTkRJTkcpKQ0KICAgIHsNCiAgICAgIGhzYWktPkludGVycnVwdFNlcnZpY2VSb3V0aW5lID0gU0FJX1RyYW5zbWl0X0lUOEJpdDsNCiAgICB9DQogICAgZWxzZSBpZihoc2FpLT5Jbml0LkRhdGFTaXplIDw9IFNBSV9EQVRBU0laRV8xNikNCiAgICB7DQogICAgICBoc2FpLT5JbnRlcnJ1cHRTZXJ2aWNlUm91dGluZSA9IFNBSV9UcmFuc21pdF9JVDE2Qml0Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUgPSBTQUlfVHJhbnNtaXRfSVQzMkJpdDsNCiAgICB9DQogICAgDQogICAgLyogRW5hYmxlIEZSUSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8NCiAgICBfX0hBTF9TQUlfRU5BQkxFX0lUKGhzYWksIFNBSV9JbnRlcnJ1cHRGbGFnKGhzYWksIFNBSV9NT0RFX0lUKSk7DQogICAgDQogICAgLyogQ2hlY2sgaWYgdGhlIFNBSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8gDQogICAgaWYoKGhzYWktPkluc3RhbmNlLT5DUjEgJiBTQUlfeENSMV9TQUlFTikgIT0gU0FJX3hDUjFfU0FJRU4pDQogICAgew0KICAgICAgLyogRmlsbCB0aGUgZmlmbyBiZWZvcmUgc3RhcnRpbmcgdGhlIGNvbW11bmljYXRpb24gKi8NCiAgICAgIFNBSV9GaWxsRmlmbyhoc2FpKTsNCiAgICAgIA0KICAgICAgLyogRW5hYmxlIFNBSSBwZXJpcGhlcmFsICovICAgIA0KICAgICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsNCiAgICB9DQogICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgIF9fSEFMX1VOTE9DSyhoc2FpKTsNCiAgICANCiAgICByZXR1cm4gSEFMX09LOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBIQUxfQlVTWTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlY2VpdmVzIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplOiBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9SZWNlaXZlX0lUKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsNCiAgDQogIGlmKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpDQogIHsNCiAgICBpZigocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMCkpIA0KICAgIHsNCiAgICAgIHJldHVybiAgSEFMX0VSUk9SOw0KICAgIH0NCiAgICANCiAgICBoc2FpLT5wQnVmZlB0ciA9IHBEYXRhOw0KICAgIGhzYWktPlhmZXJTaXplID0gU2l6ZTsNCiAgICBoc2FpLT5YZmVyQ291bnQgPSBTaXplOw0KICAgIA0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc2FpKTsNCiAgICANCiAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfQlVTWV9SWDsNCiAgICANCiAgICBpZigoaHNhaS0+SW5pdC5EYXRhU2l6ZSA9PSBTQUlfREFUQVNJWkVfOCkgJiYgKGhzYWktPkluaXQuQ29tcGFuZGluZ01vZGUgPT0gU0FJX05PQ09NUEFORElORykpDQogICAgew0KICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUgPSBTQUlfUmVjZWl2ZV9JVDhCaXQ7DQogICAgfQ0KICAgIGVsc2UgaWYoaHNhaS0+SW5pdC5EYXRhU2l6ZSA8PSBTQUlfREFUQVNJWkVfMTYpDQogICAgew0KICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUgPSBTQUlfUmVjZWl2ZV9JVDE2Qml0Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUgPSBTQUlfUmVjZWl2ZV9JVDMyQml0Ow0KICAgIH0gICAgDQogICAgLyogRW5hYmxlIFRYRSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8NCiAgICBfX0hBTF9TQUlfRU5BQkxFX0lUKGhzYWksIFNBSV9JbnRlcnJ1cHRGbGFnKGhzYWksIFNBSV9NT0RFX0lUKSk7DQogICAgDQogICAgLyogQ2hlY2sgaWYgdGhlIFNBSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8gDQogICAgaWYoKGhzYWktPkluc3RhbmNlLT5DUjEgJiBTQUlfeENSMV9TQUlFTikgIT0gU0FJX3hDUjFfU0FJRU4pDQogICAgew0KICAgICAgLyogRW5hYmxlIFNBSSBwZXJpcGhlcmFsICovICAgIA0KICAgICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsNCiAgICB9DQogICAgDQogICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgIF9fSEFMX1VOTE9DSyhoc2FpKTsNCiAgICANCiAgICByZXR1cm4gSEFMX09LOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBIQUxfQlVTWTsgDQogIH0gDQp9DQoNCi8qKg0KICAqIEBicmllZiBQYXVzZXMgdGhlIGF1ZGlvIHN0cmVhbSBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLg0KICAqIEBwYXJhbSAgaHNhaTogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0RNQVBhdXNlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhzYWkpOw0KICANCiAgLyogUGF1c2UgdGhlIGF1ZGlvIGZpbGUgcGxheWluZyBieSBkaXNhYmxpbmcgdGhlIFNBSSBETUEgcmVxdWVzdHMgKi8NCiAgaHNhaS0+SW5zdGFuY2UtPkNSMSAmPSB+U0FJX3hDUjFfRE1BRU47DQogIA0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc2FpKTsNCiAgDQogIHJldHVybiBIQUxfT0s7IA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgUmVzdW1lcyB0aGUgYXVkaW8gc3RyZWFtIHBsYXlpbmcgZnJvbSB0aGUgTWVkaWEuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRE1BUmVzdW1lKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhzYWkpOw0KICANCiAgLyogRW5hYmxlIHRoZSBTQUkgRE1BIHJlcXVlc3RzICovDQogIGhzYWktPkluc3RhbmNlLT5DUjEgfD0gU0FJX3hDUjFfRE1BRU47DQogIA0KICAvKiBJZiB0aGUgU0FJIHBlcmlwaGVyYWwgaXMgc3RpbGwgbm90IGVuYWJsZWQsIGVuYWJsZSBpdCAqLw0KICBpZiAoKGhzYWktPkluc3RhbmNlLT5DUjEgJiBTQUlfeENSMV9TQUlFTikgPT0gUkVTRVQpDQogIHsNCiAgICAvKiBFbmFibGUgU0FJIHBlcmlwaGVyYWwgKi8gICAgDQogICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsNCiAgfQ0KICANCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaHNhaSk7DQogIA0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgU3RvcHMgdGhlIGF1ZGlvIHN0cmVhbSBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLg0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9ETUFTdG9wKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhzYWkpOw0KICANCiAgLyogRGlzYWJsZSB0aGUgU0FJIERNQSByZXF1ZXN0ICovDQogIGhzYWktPkluc3RhbmNlLT5DUjEgJj0gflNBSV94Q1IxX0RNQUVOOw0KICANCiAgLyogQWJvcnQgdGhlIFNBSSBETUEgVHggU3RyZWFtICovDQogIGlmKGhzYWktPmhkbWF0eCAhPSBOVUxMKQ0KICB7DQogICAgSEFMX0RNQV9BYm9ydChoc2FpLT5oZG1hdHgpOw0KICB9DQogIC8qIEFib3J0IHRoZSBTQUkgRE1BIFJ4IFN0cmVhbSAqLw0KICBpZihoc2FpLT5oZG1hcnggIT0gTlVMTCkNCiAgeyAgDQogICAgSEFMX0RNQV9BYm9ydChoc2FpLT5oZG1hcngpOw0KICB9DQoNCiAgLyogRGlzYWJsZSBTQUkgcGVyaXBoZXJhbCAqLw0KICBTQUlfRGlzYWJsZShoc2FpKTsNCiAgDQogIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRUFEWTsNCiAgDQogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhzYWkpOw0KICANCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmIEFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyIGFuZCBkaXNiYWxlZCB0aGUgU0FJLg0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9BYm9ydChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkNCnsNCiAgLyogRGlzYWJsZSB0aGUgU0FJIERNQSByZXF1ZXN0ICovDQogIGhzYWktPkluc3RhbmNlLT5DUjEgJj0gflNBSV94Q1IxX0RNQUVOOw0KICANCiAgLyogQWJvcnQgdGhlIFNBSSBETUEgVHggU3RyZWFtICovDQogIGlmKGhzYWktPmhkbWF0eCAhPSBOVUxMKQ0KICB7DQogICAgSEFMX0RNQV9BYm9ydChoc2FpLT5oZG1hdHgpOw0KICB9DQogIC8qIEFib3J0IHRoZSBTQUkgRE1BIFJ4IFN0cmVhbSAqLw0KICBpZihoc2FpLT5oZG1hcnggIT0gTlVMTCkNCiAgeyAgDQogICAgSEFMX0RNQV9BYm9ydChoc2FpLT5oZG1hcngpOw0KICB9DQoNCiAgLyogRGlzYWJsZWQgQWxsIGludGVycnVwdCBhbmQgY2xlYXIgYWxsIHRoZSBmbGFnICovDQogIGhzYWktPkluc3RhbmNlLT5JTVIgPSAwOw0KICBoc2FpLT5JbnN0YW5jZS0+Q0xSRlIgPSAweEZGRkZGRkZGOw0KICANCiAgLyogRGlzYWJsZSBTQUkgcGVyaXBoZXJhbCAqLw0KICBTQUlfRGlzYWJsZShoc2FpKTsNCiAgDQogIC8qIEZsdXNoIHRoZSBmaWZvICovDQogIFNFVF9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfRkZMVVNIKTsNCiAgDQogIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRUFEWTsNCiAgDQogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhzYWkpOw0KICANCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUcmFuc21pdHMgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm8tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4NCiAgKiBAcGFyYW0gIGhzYWk6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEBwYXJhbSAgcERhdGE6IFBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gIFNpemU6IEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfVHJhbnNtaXRfRE1BKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsNCiAgdWludDMyX3QgKnRtcDsNCiAgDQogIGlmKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwKSkgDQogIHsNCiAgICByZXR1cm4gIEhBTF9FUlJPUjsNCiAgfQ0KICANCiAgaWYoaHNhaS0+U3RhdGUgPT0gSEFMX1NBSV9TVEFURV9SRUFEWSkNCiAgeyAgDQogICAgaHNhaS0+cEJ1ZmZQdHIgPSBwRGF0YTsNCiAgICBoc2FpLT5YZmVyU2l6ZSA9IFNpemU7DQogICAgaHNhaS0+WGZlckNvdW50ID0gU2l6ZTsNCiAgICANCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHNhaSk7DQogICAgDQogICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX0JVU1lfVFg7DQogICAgDQogICAgLyogU2V0IHRoZSBTQUkgVHggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCiAgICBoc2FpLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU0FJX0RNQVR4SGFsZkNwbHQ7DQogICAgDQogICAgLyogU2V0IHRoZSBTQUkgVHhETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCiAgICBoc2FpLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTQUlfRE1BVHhDcGx0Ow0KICAgIA0KICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQogICAgaHNhaS0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNBSV9ETUFFcnJvcjsNCiAgICANCiAgICAvKiBFbmFibGUgdGhlIFR4IERNQSBTdHJlYW0gKi8NCiAgICB0bXAgPSAodWludDMyX3QqKSZwRGF0YTsNCiAgICBIQUxfRE1BX1N0YXJ0X0lUKGhzYWktPmhkbWF0eCwgKih1aW50MzJfdCopdG1wLCAodWludDMyX3QpJmhzYWktPkluc3RhbmNlLT5EUiwgaHNhaS0+WGZlclNpemUpOw0KICAgIA0KICAgIC8qIENoZWNrIGlmIHRoZSBTQUkgaXMgYWxyZWFkeSBlbmFibGVkICovIA0KICAgIGlmKChoc2FpLT5JbnN0YW5jZS0+Q1IxICYgU0FJX3hDUjFfU0FJRU4pICE9IFNBSV94Q1IxX1NBSUVOKQ0KICAgIHsNCiAgICAgIC8qIEVuYWJsZSBTQUkgcGVyaXBoZXJhbCAqLw0KICAgICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsNCiAgICB9DQogICAgDQogICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGZvciBlcnJvciBoYW5kbGluZyAqLw0KICAgIF9fSEFMX1NBSV9FTkFCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfRE1BKSk7DQogICAgDQogICAgLyogRW5hYmxlIFNBSSBUeCBETUEgUmVxdWVzdCAqLyAgDQogICAgaHNhaS0+SW5zdGFuY2UtPkNSMSB8PSBTQUlfeENSMV9ETUFFTjsNCiAgICANCiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgX19IQUxfVU5MT0NLKGhzYWkpOw0KICAgIA0KICAgIHJldHVybiBIQUxfT0s7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIEhBTF9CVVNZOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVjZWl2ZXMgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm8tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4gDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplOiBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9SZWNlaXZlX0RNQShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpDQp7DQogIHVpbnQzMl90ICp0bXA7DQogIA0KICBpZigocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICByZXR1cm4gIEhBTF9FUlJPUjsNCiAgfSANCiAgDQogIGlmKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpDQogIHsgICAgDQogICAgaHNhaS0+cEJ1ZmZQdHIgPSBwRGF0YTsNCiAgICBoc2FpLT5YZmVyU2l6ZSA9IFNpemU7DQogICAgaHNhaS0+WGZlckNvdW50ID0gU2l6ZTsNCiAgICANCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHNhaSk7DQogICAgDQogICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX0JVU1lfUlg7DQogICAgDQogICAgLyogU2V0IHRoZSBTQUkgUnggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCiAgICBoc2FpLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU0FJX0RNQVJ4SGFsZkNwbHQ7DQogICAgDQogICAgLyogU2V0IHRoZSBTQUkgUnggRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQogICAgaHNhaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gU0FJX0RNQVJ4Q3BsdDsNCiAgICANCiAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KICAgIGhzYWktPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTQUlfRE1BRXJyb3I7DQogICAgDQogICAgLyogRW5hYmxlIHRoZSBSeCBETUEgU3RyZWFtICovDQogICAgdG1wID0gKHVpbnQzMl90KikmcERhdGE7DQogICAgSEFMX0RNQV9TdGFydF9JVChoc2FpLT5oZG1hcngsICh1aW50MzJfdCkmaHNhaS0+SW5zdGFuY2UtPkRSLCAqKHVpbnQzMl90Kil0bXAsIGhzYWktPlhmZXJTaXplKTsNCiAgICANCiAgICAvKiBDaGVjayBpZiB0aGUgU0FJIGlzIGFscmVhZHkgZW5hYmxlZCAqLw0KICAgIGlmKChoc2FpLT5JbnN0YW5jZS0+Q1IxICYgU0FJX3hDUjFfU0FJRU4pICE9IFNBSV94Q1IxX1NBSUVOKQ0KICAgIHsNCiAgICAgIC8qIEVuYWJsZSBTQUkgcGVyaXBoZXJhbCAqLw0KICAgICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsNCiAgICB9DQogICAgDQogICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGZvciBlcnJvciBoYW5kbGluZyAqLw0KICAgIF9fSEFMX1NBSV9FTkFCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfRE1BKSk7DQogICAgDQogICAgLyogRW5hYmxlIFNBSSBSeCBETUEgUmVxdWVzdCAqLw0KICAgIGhzYWktPkluc3RhbmNlLT5DUjEgfD0gU0FJX3hDUjFfRE1BRU47DQogICAgDQogICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgIF9fSEFMX1VOTE9DSyhoc2FpKTsNCiAgICANCiAgICByZXR1cm4gSEFMX09LOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBIQUxfQlVTWTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgdHggbXV0ZSBtb2RlLg0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEBwYXJhbSAgdmFsIDogIHZhbHVlIHNlbnQgZHVyaW5nIHRoZSBtdXRlIEByZWYgU0FJX0Jsb2NrX011dGVfVmFsdWUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRW5hYmxlVHhNdXRlTW9kZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDE2X3QgdmFsKQ0Kew0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX01VVEVfVkFMVUUodmFsKSk7DQogIA0KICBpZihoc2FpLT5TdGF0ZSAhPSBIQUxfU0FJX1NUQVRFX1JFU0VUKQ0KICB7DQogICAgQ0xFQVJfQklUKGhzYWktPkluc3RhbmNlLT5DUjIsIFNBSV94Q1IyX01VVEVWQUwgfCBTQUlfeENSMl9NVVRFKTsNCiAgICBTRVRfQklUKGhzYWktPkluc3RhbmNlLT5DUjIsIFNBSV94Q1IyX01VVEUgfCB2YWwpOw0KICAgIHJldHVybiBIQUxfT0s7DQogIH0NCiAgcmV0dXJuIEhBTF9FUlJPUjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBEaXNhYmxlIHRoZSB0eCBtdXRlIG1vZGUuDQogICogQHBhcmFtICBoc2FpIDogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0Rpc2FibGVUeE11dGVNb2RlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICBpZihoc2FpLT5TdGF0ZSAhPSBIQUxfU0FJX1NUQVRFX1JFU0VUKQ0KICB7DQogICAgQ0xFQVJfQklUKGhzYWktPkluc3RhbmNlLT5DUjIsIFNBSV94Q1IyX01VVEVWQUwgfCBTQUlfeENSMl9NVVRFKTsNCiAgICByZXR1cm4gSEFMX09LOw0KICB9DQogIHJldHVybiBIQUxfRVJST1I7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlIHRoZSByeCBtdXRlIGRldGVjdGlvbi4NCiAgKiBAcGFyYW0gIGhzYWkgOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIGNhbGxiYWNrIDogZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIG11dGUgaXMgZGV0ZWN0ZWQNCiAgKiBAcGFyYW0gIGNvdW50ZXIgOiBudW1iZXIgYSBkYXRhIGJlZm9yZSBtdXRlIGRldGVjdGlvbiBtYXggNjMuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0VuYWJsZVJ4TXV0ZU1vZGUoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIFNBSWNhbGxiYWNrIGNhbGxiYWNrLCB1aW50MTZfdCBjb3VudGVyKQ0Kew0KICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX01VVEVfQ09VTlRFUihjb3VudGVyKSk7DQogIA0KICBpZihoc2FpLT5TdGF0ZSAhPSBIQUxfU0FJX1NUQVRFX1JFU0VUKQ0KICB7DQogICAgLyogc2V0IHRoZSBtdXRlIGNvdW50ZXIgKi8NCiAgICBDTEVBUl9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfTVVURUNOVCk7DQogICAgU0VUX0JJVChoc2FpLT5JbnN0YW5jZS0+Q1IyLCAodWludDMyX3QpKCh1aW50MzJfdCljb3VudGVyIDw8IDYpKTsNCiAgICBoc2FpLT5tdXRlY2FsbGJhY2sgPSBjYWxsYmFjazsNCiAgICAvKiBlbmFibGUgdGhlIElUIGludGVycnVwdCAqLw0KICAgIF9fSEFMX1NBSV9FTkFCTEVfSVQoaHNhaSwgU0FJX0lUX01VVEVERVQpOw0KICAgIHJldHVybiBIQUxfT0s7DQogIH0NCiAgcmV0dXJuIEhBTF9FUlJPUjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBEaXNhYmxlIHRoZSByeCBtdXRlIGRldGVjdGlvbi4NCiAgKiBAcGFyYW0gIGhzYWkgOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRGlzYWJsZVJ4TXV0ZU1vZGUoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpDQp7DQogIGlmKGhzYWktPlN0YXRlICE9IEhBTF9TQUlfU1RBVEVfUkVTRVQpDQogIHsNCiAgICAvKiBzZXQgdGhlIG11dGVjYWxsYmFjayB0byBOVUxMICovDQogICAgaHNhaS0+bXV0ZWNhbGxiYWNrID0gKFNBSWNhbGxiYWNrKU5VTEw7DQogICAgLyogZW5hYmxlIHRoZSBJVCBpbnRlcnJ1cHQgKi8NCiAgICBfX0hBTF9TQUlfRElTQUJMRV9JVChoc2FpLCBTQUlfSVRfTVVURURFVCk7DQogICAgcmV0dXJuIEhBTF9PSzsNCiAgfQ0KICByZXR1cm4gSEFMX0VSUk9SOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBTQUkgaW50ZXJydXB0IHJlcXVlc3QuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnZvaWQgSEFMX1NBSV9JUlFIYW5kbGVyKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0KeyANCiAgaWYoaHNhaS0+U3RhdGUgIT0gSEFMX1NBSV9TVEFURV9SRVNFVCkNCiAgew0KICAgIHVpbnQzMl90IHRtcEZsYWcgPSBoc2FpLT5JbnN0YW5jZS0+U1I7DQogICAgdWludDMyX3QgdG1wSXRTb3VyY2UgPSBoc2FpLT5JbnN0YW5jZS0+SU1SOyANCiAgICANCiAgICBpZigoKHRtcEZsYWcgJiBTQUlfeFNSX0ZSRVEpID09IFNBSV94U1JfRlJFUSkgJiYgKCh0bXBJdFNvdXJjZSAmIFNBSV9JVF9GUkVRKSA9PSBTQUlfSVRfRlJFUSkpDQogICAgew0KICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUoaHNhaSk7DQogICAgfQ0KICAgIA0KICAgIC8qIGNoZWNrIHRoZSBmbGFnIG9ubHkgaWYgb25lIG9mIHRoZW0gaXMgc2V0ICovDQogICAgaWYodG1wRmxhZyAhPSAweDAwMDAwMDAwKQ0KICAgIHsNCiAgICAgIC8qIFNBSSBPdmVycnVuIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICAgIGlmKCgodG1wRmxhZyAmIFNBSV9GTEFHX09WUlVEUikgPT0gU0FJX0ZMQUdfT1ZSVURSKSAmJiAoKHRtcEl0U291cmNlICYgU0FJX0lUX09WUlVEUikgPT0gU0FJX0lUX09WUlVEUikpDQogICAgICB7DQogICAgICAgIC8qIENsZWFyIHRoZSBTQUkgT3ZlcnJ1biBmbGFnICovDQogICAgICAgIF9fSEFMX1NBSV9DTEVBUl9GTEFHKGhzYWksIFNBSV9GTEFHX09WUlVEUik7DQogICAgICAgIC8qIENoYW5nZSB0aGUgU0FJIGVycm9yIGNvZGUgKi8NCiAgICAgICAgaHNhaS0+RXJyb3JDb2RlID0gKChoc2FpLT5TdGF0ZSA9PSBIQUxfU0FJX1NUQVRFX0JVU1lfUlgpID8gSEFMX1NBSV9FUlJPUl9PVlIgOiBIQUxfU0FJX0VSUk9SX1VEUik7DQogICAgICAgIC8qIHRoZSB0cmFuc2ZlciBpcyBub3Qgc3RvcHBlZCwgd2Ugd2lsbCBmb3J3YXJkIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciBhbmQgd2UgbGV0IHRoZSB1c2VyIGRlY2lkZSB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgKi8NCiAgICAgICAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOw0KICAgICAgfQ0KICAgICAgDQogICAgICAvKiBTQUkgbXV0ZWRldCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgICBpZigoKHRtcEZsYWcgJiBTQUlfRkxBR19NVVRFREVUKSA9PSBTQUlfRkxBR19NVVRFREVUKSAmJiAoKHRtcEl0U291cmNlICYgU0FJX0lUX01VVEVERVQpID09IFNBSV9JVF9NVVRFREVUKSkNCiAgICAgIHsNCiAgICAgICAgLyogQ2xlYXIgdGhlIFNBSSBtdXRlZGV0IGZsYWcgKi8NCiAgICAgICAgX19IQUxfU0FJX0NMRUFSX0ZMQUcoaHNhaSwgU0FJX0ZMQUdfTVVURURFVCk7DQogICAgICAgIC8qIGNhbGwgdGhlIGNhbGwgYmFjayBmdW5jdGlvbiAqLw0KICAgICAgICBpZihoc2FpLT5tdXRlY2FsbGJhY2sgIT0gKFNBSWNhbGxiYWNrKU5VTEwpDQogICAgICAgIHsNCiAgICAgICAgICAvKiBpbmZvcm0gdGhlIHVzZXIgdGhhdCBhbiBSWCBtdXRlIGV2ZW50IGhhcyBiZWVuIGRldGVjdGVkICovDQogICAgICAgICAgaHNhaS0+bXV0ZWNhbGxiYWNrKCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgICAgLyogU0FJIEFGU0RFVCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgICBpZigoKHRtcEZsYWcgJiBTQUlfRkxBR19BRlNERVQpID09IFNBSV9GTEFHX0FGU0RFVCkgJiYgKCh0bXBJdFNvdXJjZSAmIFNBSV9JVF9BRlNERVQpID09IFNBSV9JVF9BRlNERVQpKQ0KICAgICAgew0KICAgICAgICAvKiBDaGFuZ2UgdGhlIFNBSSBlcnJvciBjb2RlICovDQogICAgICAgIGhzYWktPkVycm9yQ29kZSA9IEhBTF9TQUlfRVJST1JfQUZTREVUOw0KICAgICAgICBIQUxfU0FJX0Fib3J0KGhzYWkpOw0KICAgICAgICBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soaHNhaSk7DQogICAgICB9DQogICAgICANCiAgICAgIC8qIFNBSSBMRlNERVQgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAgICAgaWYoKCh0bXBGbGFnICYgU0FJX0ZMQUdfTEZTREVUKSA9PSBTQUlfRkxBR19MRlNERVQpICYmICgodG1wSXRTb3VyY2UgJiBTQUlfSVRfTEZTREVUKSA9PSBTQUlfSVRfTEZTREVUKSkNCiAgICAgIHsNCiAgICAgICAgLyogQ2hhbmdlIHRoZSBTQUkgZXJyb3IgY29kZSAqLw0KICAgICAgICBoc2FpLT5FcnJvckNvZGUgPSBIQUxfU0FJX0VSUk9SX0xGU0RFVDsNCiAgICAgICAgSEFMX1NBSV9BYm9ydChoc2FpKTsNCiAgICAgICAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOw0KICAgICAgfQ0KDQogICAgICAvKiBTQUkgV0NLQ0ZHIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICAgIGlmKCgodG1wRmxhZyAmIFNBSV9GTEFHX1dDS0NGRykgPT0gU0FJX0ZMQUdfV0NLQ0ZHKSAmJiAoKHRtcEl0U291cmNlICYgU0FJX0lUX1dDS0NGRykgPT0gU0FJX0lUX1dDS0NGRykpDQogICAgICB7DQogICAgICAgIC8qIENoYW5nZSB0aGUgU0FJIGVycm9yIGNvZGUgKi8NCiAgICAgICAgaHNhaS0+RXJyb3JDb2RlID0gSEFMX1NBSV9FUlJPUl9XQ0tDRkc7DQogICAgICAgIEhBTF9TQUlfQWJvcnQoaHNhaSk7DQogICAgICAgIEhBTF9TQUlfRXJyb3JDYWxsYmFjayhoc2FpKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFja3MuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCiBfX3dlYWsgdm9pZCBIQUxfU0FJX1R4Q3BsdENhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX1NBSV9UeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLyANCn0NCg0KLyoqDQogICogQGJyaWVmIFR4IFRyYW5zZmVyIEhhbGYgY29tcGxldGVkIGNhbGxiYWNrcw0KICAqIEBwYXJhbSAgaHNhaTogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBOb25lDQogICovDQogX193ZWFrIHZvaWQgSEFMX1NBSV9UeEhhbGZDcGx0Q2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpDQp7DQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU0FJX1R4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLyANCn0NCg0KLyoqDQogICogQGJyaWVmIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFja3MuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpDQp7DQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiBSeCBUcmFuc2ZlciBoYWxmIGNvbXBsZXRlZCBjYWxsYmFja3MNCiAgKiBAcGFyYW0gIGhzYWk6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NBSV9SeEhhbGZDcGx0Q2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpDQp7DQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiBTQUkgZXJyb3IgY2FsbGJhY2tzLg0KICAqIEBwYXJhbSAgaHNhaTogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpDQp7DQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU0FJX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8gDQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCg0KLyoqIEBkZWZncm91cCBTQUlfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyANCiAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyANCiAqDQpAdmVyYmF0aW0gICANCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIA0KICAgIFsuLl0NCiAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbCANCiAgICBhbmQgdGhlIGRhdGEgZmxvdy4NCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBTQUkgc3RhdGUuDQogICogQHBhcmFtICBoc2FpOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KICAqLw0KSEFMX1NBSV9TdGF0ZVR5cGVEZWYgSEFMX1NBSV9HZXRTdGF0ZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkNCnsNCiAgcmV0dXJuIGhzYWktPlN0YXRlOw0KfQ0KDQovKioNCiogQGJyaWVmICBSZXR1cm4gdGhlIFNBSSBlcnJvciBjb2RlDQoqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTQUkgQmxvY2suDQoqIEByZXR2YWwgU0FJIEVycm9yIENvZGUNCiovDQp1aW50MzJfdCBIQUxfU0FJX0dldEVycm9yKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICByZXR1cm4gaHNhaS0+RXJyb3JDb2RlOw0KfQ0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0FJIEkyUyBwcm90b2NvbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIA0KICAqICAgICAgICAgaW4gdGhlIFNBSV9Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4NCiAgKiBAcGFyYW0gIGhzYWkgOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHByb3RvY29sIDogb25lIG9mIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wNCiAgKiBAcGFyYW0gIGRhdGFzaXplIDogb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YXNpemUgQHJlZiBTQUlfUHJvdG9jb2xfRGF0YVNpemUNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIG5ic2xvdCA6IG51bWJlciBvZiBzbG90IG1pbmltdW0gdmFsdWUgaXMgMiBhbmQgbWF4IGlzIDE2LiANCiAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNBSV9Jbml0STJTKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50MzJfdCBwcm90b2NvbCwgdWludDMyX3QgZGF0YXNpemUsIHVpbnQzMl90IG5ic2xvdCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9TVVBQT1JURURfUFJPVE9DT0wocHJvdG9jb2wpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NBSV9QUk9UT0NPTF9EQVRBU0laRShkYXRhc2l6ZSkpOw0KICANCiAgaHNhaS0+SW5pdC5Qcm90b2NvbCAgICAgICAgICAgID0gU0FJX0ZSRUVfUFJPVE9DT0w7DQogIGhzYWktPkluaXQuRmlyc3RCaXQgICAgICAgICAgICA9IFNBSV9GSVJTVEJJVF9NU0I7DQogIGhzYWktPkluaXQuQ2xvY2tTdHJvYmluZyAgICAgICA9IFNBSV9DTE9DS1NUUk9CSU5HX0ZBTExJTkdFREdFOw0KICBoc2FpLT5GcmFtZUluaXQuRlNEZWZpbml0aW9uICAgPSBTQUlfRlNfQ0hBTk5FTF9JREVOVElGSUNBVElPTjsNCiAgaHNhaS0+U2xvdEluaXQuU2xvdEFjdGl2ZSAgICAgID0gU0FJX1NMT1RBQ1RJVkVfQUxMOw0KICBoc2FpLT5TbG90SW5pdC5GaXJzdEJpdE9mZnNldCAgPSAwOw0KICBoc2FpLT5TbG90SW5pdC5TbG90TnVtYmVyICAgICAgPSBuYnNsb3Q7DQogIA0KICAvKiBpbiBJUzIgdGhlIG51bWJlciBvZiBzbG90IG11c3QgYmUgZXZlbiAqLw0KICBpZigobmJzbG90ICYgMHgxKSAhPSAwICkNCiAgew0KICAgIHJldHVybiBIQUxfRVJST1I7DQogIH0NCiAgICANCiAgc3dpdGNoKHByb3RvY29sKQ0KICB7DQogIGNhc2UgU0FJX0kyU19TVEFOREFSRCA6DQogICAgaHNhaS0+RnJhbWVJbml0LkZTUG9sYXJpdHkgPSBTQUlfRlNfQUNUSVZFX0xPVzsNCiAgICBoc2FpLT5GcmFtZUluaXQuRlNPZmZzZXQgICA9IFNBSV9GU19CRUZPUkVGSVJTVEJJVDsNCiAgICBicmVhazsNCiAgY2FzZSBTQUlfSTJTX01TQkpVU1RJRklFRCA6DQogIGNhc2UgU0FJX0kyU19MU0JKVVNUSUZJRUQgOg0KICAgIGhzYWktPkZyYW1lSW5pdC5GU1BvbGFyaXR5ID0gU0FJX0ZTX0FDVElWRV9ISUdIOw0KICAgIGhzYWktPkZyYW1lSW5pdC5GU09mZnNldCAgID0gU0FJX0ZTX0ZJUlNUQklUOw0KICAgIGJyZWFrOw0KICBkZWZhdWx0IDoNCiAgICByZXR1cm4gSEFMX0VSUk9SOw0KICB9DQogICANCiAgLyogRnJhbWUgZGVmaW5pdGlvbiAqLw0KICBoc2FpLT5Jbml0LkRhdGFTaXplID0gMHhGRkZGRkZGRjsNCiAgc3dpdGNoKGRhdGFzaXplKQ0KICB7DQogIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzE2QklUOg0KICAgIGhzYWktPkluaXQuRGF0YVNpemUgPSBTQUlfREFUQVNJWkVfMTY7DQogICAgaHNhaS0+RnJhbWVJbml0LkZyYW1lTGVuZ3RoID0gMzIqKG5ic2xvdC8yKTsNCiAgICBoc2FpLT5GcmFtZUluaXQuQWN0aXZlRnJhbWVMZW5ndGggPSAxNioobmJzbG90LzIpOw0KICAgIGhzYWktPlNsb3RJbml0LlNsb3RTaXplID0gU0FJX1NMT1RTSVpFXzE2QjsNCiAgICBicmVhazsgDQogIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzE2QklURVhURU5ERUQgOg0KICAgIGlmKGhzYWktPkluaXQuRGF0YVNpemUgPT0gMHhGRkZGRkZGRikNCiAgICB7DQogICAgICBoc2FpLT5Jbml0LkRhdGFTaXplID0gU0FJX0RBVEFTSVpFXzE2Ow0KICAgIH0NCiAgICBicmVhazsgDQogIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzI0QklUOg0KICAgIGlmKGhzYWktPkluaXQuRGF0YVNpemUgPT0gMHhGRkZGRkZGRikNCiAgICB7DQogICAgICBoc2FpLT5Jbml0LkRhdGFTaXplID0gU0FJX0RBVEFTSVpFXzI0Ow0KICAgIH0NCiAgICBicmVhazsNCiAgY2FzZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMzJCSVQ6IA0KICAgIGlmKGhzYWktPkluaXQuRGF0YVNpemUgPT0gMHhGRkZGRkZGRikNCiAgICB7DQogICAgICBoc2FpLT5Jbml0LkRhdGFTaXplID0gU0FJX0RBVEFTSVpFXzMyOw0KICAgIH0NCiAgICBoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGggPSA2NCoobmJzbG90LzIpOw0KICAgIGhzYWktPkZyYW1lSW5pdC5BY3RpdmVGcmFtZUxlbmd0aCA9IDMyKihuYnNsb3QvMik7DQogICAgaHNhaS0+U2xvdEluaXQuU2xvdFNpemUgPSBTQUlfU0xPVFNJWkVfMzJCOw0KICAgIGlmKHByb3RvY29sID09IFNBSV9JMlNfTFNCSlVTVElGSUVEKQ0KICAgIHsNCiAgICAgIGlmIChkYXRhc2l6ZSA9PSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMTZCSVRFWFRFTkRFRCkNCiAgICAgIHsNCiAgICAgICAgaHNhaS0+U2xvdEluaXQuRmlyc3RCaXRPZmZzZXQgPSAxNjsNCiAgICAgIH0NCiAgICAgIGlmIChkYXRhc2l6ZSA9PSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMjRCSVQpDQogICAgICB7DQogICAgICAgIGhzYWktPlNsb3RJbml0LkZpcnN0Qml0T2Zmc2V0ID0gODsNCiAgICAgIH0NCiAgICB9DQogICAgYnJlYWs7DQogIGRlZmF1bHQgOg0KICAgIHJldHVybiBIQUxfRVJST1I7DQogIH0NCiANCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0FJIFBDTSBwcm90b2NvbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIA0KICAqICAgICAgICAgaW4gdGhlIFNBSV9Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4NCiAgKiBAcGFyYW0gIGhzYWkgOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHByb3RvY29sIDogb25lIG9mIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wNCiAgKiBAcGFyYW0gIGRhdGFzaXplIDogb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YXNpemUgQHJlZiBTQUlfUHJvdG9jb2xfRGF0YVNpemUNCiAgKiBAcGFyYW0gIG5ic2xvdCA6IG51bWJlciBvZiBzbG90IG1pbmltdW0gdmFsdWUgaXMgMSBhbmQgdGhlIG1heCBpcyAxNi4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTQUlfSW5pdFBDTShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDMyX3QgcHJvdG9jb2wsIHVpbnQzMl90IGRhdGFzaXplLCB1aW50MzJfdCBuYnNsb3QpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TQUlfU1VQUE9SVEVEX1BST1RPQ09MKHByb3RvY29sKSk7DQogIGFzc2VydF9wYXJhbShJU19TQUlfUFJPVE9DT0xfREFUQVNJWkUoZGF0YXNpemUpKTsNCg0KICBoc2FpLT5Jbml0LlByb3RvY29sICAgICAgICAgICAgPSBTQUlfRlJFRV9QUk9UT0NPTDsNCiAgaHNhaS0+SW5pdC5GaXJzdEJpdCAgICAgICAgICAgID0gU0FJX0ZJUlNUQklUX01TQjsNCiAgaHNhaS0+SW5pdC5DbG9ja1N0cm9iaW5nICAgICAgID0gU0FJX0NMT0NLU1RST0JJTkdfRkFMTElOR0VER0U7DQogIGhzYWktPkZyYW1lSW5pdC5GU0RlZmluaXRpb24gICA9IFNBSV9GU19TVEFSVEZSQU1FOw0KICBoc2FpLT5GcmFtZUluaXQuRlNQb2xhcml0eSAgICAgPSBTQUlfRlNfQUNUSVZFX0hJR0g7DQogIGhzYWktPkZyYW1lSW5pdC5GU09mZnNldCAgICAgICA9IFNBSV9GU19CRUZPUkVGSVJTVEJJVDsNCiAgaHNhaS0+U2xvdEluaXQuRmlyc3RCaXRPZmZzZXQgID0gMDsNCiAgaHNhaS0+U2xvdEluaXQuU2xvdE51bWJlciAgICAgID0gbmJzbG90Ow0KICBoc2FpLT5TbG90SW5pdC5TbG90QWN0aXZlICAgICAgPSBTQUlfU0xPVEFDVElWRV9BTEw7DQogIA0KICBzd2l0Y2gocHJvdG9jb2wpDQogIHsNCiAgY2FzZSBTQUlfUENNX1NIT1JUIDoNCiAgICBoc2FpLT5GcmFtZUluaXQuQWN0aXZlRnJhbWVMZW5ndGggPSAxOw0KICAgIGJyZWFrOw0KICBjYXNlIFNBSV9QQ01fTE9ORyA6DQogICAgaHNhaS0+RnJhbWVJbml0LkFjdGl2ZUZyYW1lTGVuZ3RoID0gMTM7DQogICAgYnJlYWs7DQogIGRlZmF1bHQgOg0KICAgIHJldHVybiBIQUxfRVJST1I7DQogIH0NCiANCiAgc3dpdGNoKGRhdGFzaXplKQ0KICB7DQogIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzE2QklUOg0KICAgIGhzYWktPkluaXQuRGF0YVNpemUgPSBTQUlfREFUQVNJWkVfMTY7DQogICAgaHNhaS0+RnJhbWVJbml0LkZyYW1lTGVuZ3RoID0gMTYgKiBuYnNsb3Q7DQogICAgaHNhaS0+U2xvdEluaXQuU2xvdFNpemUgPSBTQUlfU0xPVFNJWkVfMTZCOw0KICAgIGJyZWFrOyANCiAgY2FzZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMTZCSVRFWFRFTkRFRCA6DQogICAgaHNhaS0+SW5pdC5EYXRhU2l6ZSA9IFNBSV9EQVRBU0laRV8xNjsNCiAgICBoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGggPSAzMiAqIG5ic2xvdDsNCiAgICBoc2FpLT5TbG90SW5pdC5TbG90U2l6ZSA9IFNBSV9TTE9UU0laRV8zMkI7DQogICAgYnJlYWs7DQogICAgDQogIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzMyQklUOiANCiAgICBoc2FpLT5Jbml0LkRhdGFTaXplID0gU0FJX0RBVEFTSVpFXzMyOw0KICAgIGhzYWktPkZyYW1lSW5pdC5GcmFtZUxlbmd0aCA9IDMyICogbmJzbG90Ow0KICAgIGhzYWktPlNsb3RJbml0LlNsb3RTaXplID0gU0FJX1NMT1RTSVpFXzMyQjsNCiAgICBicmVhazsNCiAgZGVmYXVsdCA6DQogICAgcmV0dXJuIEhBTF9FUlJPUjsNCiAgfQ0KIA0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGwgdGhlIGZpZm8gDQogICogQHBhcmFtICBoc2FpIDogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBOb25lLg0KICAqLw0Kc3RhdGljIHZvaWQgU0FJX0ZpbGxGaWZvKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBmaWxsIHRoZSBmaWZvIHdpdGggZGF0YSBiZWZvcmUgdG8gZW5hYmxlZCB0aGUgU0FJICovDQogIHdoaWxlKChoc2FpLT5JbnN0YW5jZS0+U1IgJiBTQUlfeFNSX0ZMVkwpICE9IFNBSV9GSUZPU1RBVFVTX0ZVTEwpDQogIHsNCiAgICBpZigoaHNhaS0+SW5pdC5EYXRhU2l6ZSA9PSBTQUlfREFUQVNJWkVfOCkgJiYgKGhzYWktPkluaXQuQ29tcGFuZGluZ01vZGUgPT0gU0FJX05PQ09NUEFORElORykpDQogICAgew0KICAgICAgaHNhaS0+SW5zdGFuY2UtPkRSID0gKCpoc2FpLT5wQnVmZlB0cisrKTsNCiAgICB9DQogICAgZWxzZSBpZihoc2FpLT5Jbml0LkRhdGFTaXplIDw9IFNBSV9EQVRBU0laRV8xNikNCiAgICB7DQogICAgICBoc2FpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MzJfdCAqKWhzYWktPnBCdWZmUHRyKTsNCiAgICAgIGhzYWktPnBCdWZmUHRyKz0gMjsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIGhzYWktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQzMl90ICopaHNhaS0+cEJ1ZmZQdHIpOw0KICAgICAgaHNhaS0+cEJ1ZmZQdHIrPSA0Ow0KICAgIH0NCiAgICBoc2FpLT5YZmVyQ291bnQtLTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIHJldHVybiB0aGUgaW50ZXJydXB0IGZsYWcgdG8gc2V0IGFjY29yZGluZyB0aGUgU0FJIHNldHVwIA0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEBwYXJhbSAgbW9kZSA6IFNBSV9NT0RFX0RNQSBvciBTQUlfTU9ERV9JVA0KICAqIEByZXR2YWwgdGhlIGxpc3Qgb2YgdGhlIElUIGZsYWcgdG8gZW5hYmxlDQogKi8NCnN0YXRpYyB1aW50MzJfdCBTQUlfSW50ZXJydXB0RmxhZyhTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDMyX3QgbW9kZSkNCnsNCiAgdWludDMyX3QgdG1wSVQgPSBTQUlfSVRfT1ZSVURSOyANCiAgDQogIGlmKG1vZGUgPT0gU0FJX01PREVfSVQpDQogIHsNCiAgICB0bXBJVHw9IFNBSV9JVF9GUkVROw0KICB9DQogIA0KICBpZigoaHNhaS0+SW5pdC5BdWRpb01vZGUgPT0gU0FJX01PREVTTEFWRV9SWCkgfHwgKGhzYWktPkluaXQuQXVkaW9Nb2RlID09IFNBSV9NT0RFU0xBVkVfVFgpKQ0KICB7DQogICAgdG1wSVR8PSBTQUlfSVRfQUZTREVUIHwgU0FJX0lUX0xGU0RFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBoc2FpIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4gbWFzdGVyIG1vZGUgKi8NCiAgICB0bXBJVHw9IFNBSV9JVF9XQ0tDRkc7DQogIH0NCiAgcmV0dXJuIHRtcElUOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIGRpc2FibGUgdGhlIFNBSSBhbmQgd2FpdCB0aGUgZGlzYWJsaW5nDQogICogQHBhcmFtICBoc2FpIDogcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuDQogICogQHJldHZhbCBOb25lLg0KICAqLw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNBSV9EaXNhYmxlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQogIA0KICBfX0hBTF9TQUlfRElTQUJMRShoc2FpKTsNCiAgd2hpbGUoKGhzYWktPkluc3RhbmNlLT5DUjEgJiBTQUlfeENSMV9TQUlFTikgIT0gUkVTRVQpDQogIHsNCiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8NCiAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gU0FJX1RJTUVPVVRfVkFMVUUpDQogICAgeyAgICAgICAgIA0KICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCiAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX1RJTUVPVVQ7DQogICAgICANCiAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOw0KICAgICAgDQogICAgICAvKiBDaGFuZ2UgdGhlIFNBSSBzdGF0ZSAqLw0KICAgICAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFR4IEhhbmRsZXIgZm9yIFRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlIDhCaXQgdHJhbnNmZXINCiAgKiBAcGFyYW0gIGhzYWkgOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQpzdGF0aWMgdm9pZCBTQUlfVHJhbnNtaXRfSVQ4Qml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBXcml0ZSBkYXRhIG9uIERSIHJlZ2lzdGVyICovDQogIGhzYWktPkluc3RhbmNlLT5EUiA9ICgqaHNhaS0+cEJ1ZmZQdHIrKyk7DQogIGhzYWktPlhmZXJDb3VudC0tOw0KICANCiAgLyogSGFuZGxlIHRoZSBlbmQgb2YgdGhlIHRyYW5zbWlzc2lvbiAqLw0KICBpZihoc2FpLT5YZmVyQ291bnQgPT0gMCkNCiAgew0KICAgIC8qIERpc2FibGUgRlJFUSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8NCiAgICBfX0hBTF9TQUlfRElTQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9JVCkpOyANCiAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7DQogICAgSEFMX1NBSV9UeENwbHRDYWxsYmFjayhoc2FpKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFR4IEhhbmRsZXIgZm9yIFRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlIGZvciAxNkJpdCB0cmFuc2Zlcg0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnN0YXRpYyB2b2lkIFNBSV9UcmFuc21pdF9JVDE2Qml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBXcml0ZSBkYXRhIG9uIERSIHJlZ2lzdGVyICovDQogIGhzYWktPkluc3RhbmNlLT5EUiA9ICoodWludDE2X3QgKiloc2FpLT5wQnVmZlB0cjsNCiAgaHNhaS0+cEJ1ZmZQdHIrPTI7DQogIGhzYWktPlhmZXJDb3VudC0tOw0KICANCiAgLyogSGFuZGxlIHRoZSBlbmQgb2YgdGhlIHRyYW5zbWlzc2lvbiAqLw0KICBpZihoc2FpLT5YZmVyQ291bnQgPT0gMCkNCiAgew0KICAgIC8qIERpc2FibGUgRlJFUSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8NCiAgICBfX0hBTF9TQUlfRElTQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9JVCkpOyANCiAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7DQogICAgSEFMX1NBSV9UeENwbHRDYWxsYmFjayhoc2FpKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFR4IEhhbmRsZXIgZm9yIFRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlIGZvciAzMkJpdCB0cmFuc2Zlcg0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnN0YXRpYyB2b2lkIFNBSV9UcmFuc21pdF9JVDMyQml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBXcml0ZSBkYXRhIG9uIERSIHJlZ2lzdGVyICovDQogIGhzYWktPkluc3RhbmNlLT5EUiA9ICoodWludDMyX3QgKiloc2FpLT5wQnVmZlB0cjsNCiAgaHNhaS0+cEJ1ZmZQdHIrPTQ7DQogIGhzYWktPlhmZXJDb3VudC0tOw0KICANCiAgLyogSGFuZGxlIHRoZSBlbmQgb2YgdGhlIHRyYW5zbWlzc2lvbiAqLw0KICBpZihoc2FpLT5YZmVyQ291bnQgPT0gMCkNCiAgew0KICAgIC8qIERpc2FibGUgRlJFUSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8NCiAgICBfX0hBTF9TQUlfRElTQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9JVCkpOyANCiAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7DQogICAgSEFMX1NBSV9UeENwbHRDYWxsYmFjayhoc2FpKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJ4IEhhbmRsZXIgZm9yIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUgOEJpdCB0cmFuc2Zlcg0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnN0YXRpYyB2b2lkIFNBSV9SZWNlaXZlX0lUOEJpdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkNCnsNCiAgLyogUmVjZWl2ZSBkYXRhICovICAgIA0KICAoKmhzYWktPnBCdWZmUHRyKyspID0gaHNhaS0+SW5zdGFuY2UtPkRSOw0KICBoc2FpLT5YZmVyQ291bnQtLTsNCiAgDQogIC8qIENoZWNrIGVuZCBvZiB0aGUgdHJhbnNmZXIgKi8gIA0KICBpZihoc2FpLT5YZmVyQ291bnQgPT0gMCkNCiAgeyAgICANCiAgICAvKiBEaXNhYmxlIFRYRSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8NCiAgICBfX0hBTF9TQUlfRElTQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9JVCkpOw0KICAgIA0KICAgIC8qIENsZWFyIHRoZSBTQUkgT3ZlcnJ1biBmbGFnICovDQogICAgX19IQUxfU0FJX0NMRUFSX0ZMQUcoaHNhaSwgU0FJX0ZMQUdfT1ZSVURSKTsNCiAgICANCiAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7DQogICAgSEFMX1NBSV9SeENwbHRDYWxsYmFjayhoc2FpKTsgDQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBSeCBIYW5kbGVyIGZvciBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlIGZvciAxNkJpdCB0cmFuc2Zlcg0KICAqIEBwYXJhbSAgaHNhaSA6IHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnN0YXRpYyB2b2lkIFNBSV9SZWNlaXZlX0lUMTZCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpDQp7DQogIC8qIFJlY2VpdmUgZGF0YSAqLyAgICANCiAgKih1aW50MTZfdCopaHNhaS0+cEJ1ZmZQdHIgPSBoc2FpLT5JbnN0YW5jZS0+RFI7DQogIGhzYWktPnBCdWZmUHRyKz0yOw0KICBoc2FpLT5YZmVyQ291bnQtLTsNCiAgDQogIC8qIENoZWNrIGVuZCBvZiB0aGUgdHJhbnNmZXIgKi8gIA0KICBpZihoc2FpLT5YZmVyQ291bnQgPT0gMCkNCiAgeyAgICANCiAgICAvKiBEaXNhYmxlIFRYRSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8NCiAgICBfX0hBTF9TQUlfRElTQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9JVCkpOw0KICAgIA0KICAgIC8qIENsZWFyIHRoZSBTQUkgT3ZlcnJ1biBmbGFnICovDQogICAgX19IQUxfU0FJX0NMRUFSX0ZMQUcoaHNhaSwgU0FJX0ZMQUdfT1ZSVURSKTsNCiAgICANCiAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7DQogICAgSEFMX1NBSV9SeENwbHRDYWxsYmFjayhoc2FpKTsgDQogIH0NCn0NCi8qKg0KICAqIEBicmllZiAgUnggSGFuZGxlciBmb3IgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZSBmb3IgMzJCaXQgdHJhbnNmZXINCiAgKiBAcGFyYW0gIGhzYWkgOiBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4NCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQpzdGF0aWMgdm9pZCBTQUlfUmVjZWl2ZV9JVDMyQml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQ0Kew0KICAvKiBSZWNlaXZlIGRhdGEgKi8gICAgDQogICoodWludDMyX3QqKWhzYWktPnBCdWZmUHRyID0gaHNhaS0+SW5zdGFuY2UtPkRSOw0KICBoc2FpLT5wQnVmZlB0cis9NDsNCiAgaHNhaS0+WGZlckNvdW50LS07DQogIA0KICAvKiBDaGVjayBlbmQgb2YgdGhlIHRyYW5zZmVyICovICANCiAgaWYoaHNhaS0+WGZlckNvdW50ID09IDApDQogIHsgICAgDQogICAgLyogRGlzYWJsZSBUWEUgYW5kIE9WUlVEUiBpbnRlcnJ1cHRzICovDQogICAgX19IQUxfU0FJX0RJU0FCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfSVQpKTsNCiAgICANCiAgICAvKiBDbGVhciB0aGUgU0FJIE92ZXJydW4gZmxhZyAqLw0KICAgIF9fSEFMX1NBSV9DTEVBUl9GTEFHKGhzYWksIFNBSV9GTEFHX09WUlVEUik7DQogICAgDQogICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOw0KICAgIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soaHNhaSk7IA0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiBETUEgU0FJIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suDQogICogQHBhcmFtICBoZG1hOiBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgU0FJX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICANCnsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsNCiAgDQogIFNBSV9IYW5kbGVUeXBlRGVmKiBoc2FpID0gKFNBSV9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsNCiAgDQogIGlmKChoZG1hLT5JbnN0YW5jZS0+Q1IgJiBETUFfU3hDUl9DSVJDKSA9PSAwKQ0KICB7IA0KICAgIGhzYWktPlhmZXJDb3VudCA9IDA7DQogICAgDQogICAgLyogRGlzYWJsZSBTQUkgVHggRE1BIFJlcXVlc3QgKi8gIA0KICAgIGhzYWktPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KSh+U0FJX3hDUjFfRE1BRU4pOw0KICAgIA0KICAgIC8qIEdldCB0aWNrICovDQogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCiAgICANCiAgICAvKiBTZXQgdGltZW91dDogMTAgaXMgdGhlIG1heCBkZWxheSB0byBzZW5kIHRoZSByZW1haW5pbmcgZGF0YSBpbiB0aGUgU0FJIEZJRk8gKi8NCiAgICAvKiBXYWl0IHVudGlsIEZJRk8gaXMgZW1wdHkgKi8gICAgDQogICAgd2hpbGUoX19IQUxfU0FJX0dFVF9GTEFHKGhzYWksIFNBSV94U1JfRkxWTCkgIT0gUkVTRVQpDQogICAgew0KICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovDQogICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gU0FJX1RJTUVPVVRfVkFMVUUpDQogICAgICB7ICAgICAgICAgDQogICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogICAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX1RJTUVPVVQ7DQogICAgICAgIA0KICAgICAgICAvKiBDaGFuZ2UgdGhlIFNBSSBzdGF0ZSAqLw0KICAgICAgICBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soaHNhaSk7DQogICAgICB9DQogICAgfSANCiAgICANCiAgICAvKiBTdG9wIHRoZSBpbnRlcnJ1cHRzIGVycm9yIGhhbmRsaW5nICovDQogICAgX19IQUxfU0FJX0RJU0FCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfRE1BKSk7DQogICAgDQogICAgaHNhaS0+U3RhdGU9IEhBTF9TQUlfU1RBVEVfUkVBRFk7DQogIH0NCiAgSEFMX1NBSV9UeENwbHRDYWxsYmFjayhoc2FpKTsNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTQUkgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIA0KICAqIEBwYXJhbSAgaGRtYTogcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFNBSV9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQ0Kew0KICBTQUlfSGFuZGxlVHlwZURlZiogaHNhaSA9IChTQUlfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsNCg0KICBIQUxfU0FJX1R4SGFsZkNwbHRDYWxsYmFjayhoc2FpKTsNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTQUkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLiANCiAgKiBAcGFyYW0gIGhkbWE6IHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTQUlfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIA0Kew0KICBTQUlfSGFuZGxlVHlwZURlZiogaHNhaSA9ICggU0FJX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsNCiAgaWYoKGhkbWEtPkluc3RhbmNlLT5DUiAmIERNQV9TeENSX0NJUkMpID09IDApDQogIHsNCiAgICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovDQogICAgaHNhaS0+SW5zdGFuY2UtPkNSMSAmPSAodWludDMyX3QpKH5TQUlfeENSMV9ETUFFTik7DQogICAgaHNhaS0+WGZlckNvdW50ID0gMDsNCiAgICANCiAgICAvKiBTdG9wIHRoZSBpbnRlcnJ1cHRzIGVycm9yIGhhbmRsaW5nICovDQogICAgX19IQUxfU0FJX0RJU0FCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfRE1BKSk7DQogICAgDQogICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOw0KICB9DQogIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soaHNhaSk7IA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRE1BIFNBSSByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayANCiAgKiBAcGFyYW0gIGhkbWE6IHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTQUlfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU0FJX0hhbmRsZVR5cGVEZWYqIGhzYWkgPSAoU0FJX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7DQoNCiAgSEFMX1NBSV9SeEhhbGZDcGx0Q2FsbGJhY2soaHNhaSk7IA0KfQ0KLyoqDQogICogQGJyaWVmIERNQSBTQUkgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4gDQogICogQHBhcmFtICBoZG1hOiBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgU0FJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIA0Kew0KICBTQUlfSGFuZGxlVHlwZURlZiogaHNhaSA9ICggU0FJX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsNCiAgDQogIC8qIFN0b3AgdGhlIERNQSB0cmFuc2ZlciAqLw0KICBIQUxfU0FJX0RNQVN0b3AoaHNhaSk7DQogIA0KICAvKiBTZXQgdGhlIFNBSSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovDQogIGhzYWktPlN0YXRlPSBIQUxfU0FJX1NUQVRFX1JFQURZOw0KICBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soaHNhaSk7DQogIA0KICBoc2FpLT5YZmVyQ291bnQgPSAwOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQojZW5kaWYgLyogSEFMX1NBSV9NT0RVTEVfRU5BQkxFRCAqLw0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==