LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwOSBBY3RlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiANCiAqIFN0dWJzIGZvciBOZXdsaWIgc3lzdGVtIGNhbGxzLg0KICogIA0KICogU1ZOICRSZXZpc2lvbjogMjAyMCAkDQogKiBTVk4gJERhdGU6IDIwMTAtMDEtMjAgMTQ6NTE6NTAgKzAwMDAgKFdlZCwgMjAgSmFuIDIwMTApICQNCiAqLw0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN5cy91bmlzdGQuaD4NCiNpbmNsdWRlIDxzeXMvc3RhdC5oPg0KI2luY2x1ZGUgPHN5cy90aW1lcy5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojdW5kZWYgZXJybm8NCmV4dGVybiBpbnQgZXJybm87DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBSZWRpcmVjdGlvbiBvZiBzdGFuZGFyZCBvdXRwdXQgdG8gYSBTbWFydEZ1c2lvbiBNU1MgVUFSVC4NCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSByZWRpcmVjdGlvbiBvZiB0aGUgb3V0cHV0IG9mIHByaW50ZigpIHRvIGENCiAqIFVBUlQgaXMgcHJvdmlkZWQgYXMgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuIFRoaXMgcmVkaXJlY3Rpb24gaXMgZW5hYmxlZCBieQ0KICogYWRkaW5nIHRoZSBzeW1ib2wvZGVmaW5lIEFDVEVMX1NURElPX1RIUlVfVUFSVCB0byB5b3VyIHByb2plY3QgYW5kDQogKiBzcGVjaWZ5aW5nIHRoZSBiYXVkIHJhdGUgdXNpbmcgdGhlIEFDVEVMX1NURElPX0JBVURfUkFURSBkZWZpbmUuDQogKi8NCiNpZmRlZiBBQ1RFTF9TVERJT19USFJVX1VBUlQNCiNpbmNsdWRlICIuLi8uLi9kcml2ZXJzL21zc191YXJ0L21zc191YXJ0LmgiDQoNCiNpZm5kZWYgQUNURUxfU1RESU9fQkFVRF9SQVRFDQojZGVmaW5lIEFDVEVMX1NURElPX0JBVURfUkFURSAgTVNTX1VBUlRfNTc2MDBfQkFVRA0KI2VuZGlmDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBHbG9iYWwgZmxhZyB1c2VkIHRvIGluZGljYXRlIGlmIHRoZSBVQVJUIGRyaXZlciBuZWVkcyB0byBiZSBpbml0aWFsaXplZC4NCiAqLw0Kc3RhdGljIGludCBnX3N0ZGlvX3VhcnRfaW5pdF9kb25lID0gMDsNCg0KI2VuZGlmCS8qIEFDVEVMX1NURElPX1RIUlVfVUFSVCAqLw0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogRW52aXJvbm1lbnQgdmFyaWFibGVzLg0KICogQSBwb2ludGVyIHRvIGEgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHRoZWlyIHZhbHVlcy4gRm9yIGEgbWluaW1hbA0KICogZW52aXJvbm1lbnQsIHRoaXMgZW1wdHkgbGlzdCBpcyBhZGVxdWF0ZToNCiAqLw0KY2hhciAqX19lbnZbMV0gPSB7IDAgfTsNCmNoYXIgKiplbnZpcm9uID0gX19lbnY7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBDbG9zZSBhIGZpbGUuDQogKi8NCmludCBfY2xvc2UoaW50IGZpbGUpDQp7DQogICAgcmV0dXJuIC0xOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogVHJhbnNmZXIgY29udHJvbCB0byBhIG5ldyBwcm9jZXNzLg0KICovDQppbnQgX2V4ZWN2ZShjaGFyICpuYW1lLCBjaGFyICoqYXJndiwgY2hhciAqKmVudikNCnsNCiAgICBlcnJubyA9IEVOT01FTTsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBFeGl0IGEgcHJvZ3JhbSB3aXRob3V0IGNsZWFuaW5nIHVwIGZpbGVzLg0KICovDQp2b2lkIF9leGl0KCBpbnQgY29kZSApDQp7DQoJLyogU2hvdWxkIHdlIGZvcmNlIGEgc3lzdGVtIHJlc2V0PyAqLw0KCXdoaWxlKCAxICkNCgl7DQoJCTsNCgl9DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBDcmVhdGUgYSBuZXcgcHJvY2Vzcy4NCiAqLw0KaW50IF9mb3JrKHZvaWQpDQp7DQogICAgZXJybm8gPSBFQUdBSU47DQogICAgcmV0dXJuIC0xOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogU3RhdHVzIG9mIGFuIG9wZW4gZmlsZS4NCiAqLw0KaW50IF9mc3RhdChpbnQgZmlsZSwgc3RydWN0IHN0YXQgKnN0KQ0Kew0KICAgIHN0LT5zdF9tb2RlID0gU19JRkNIUjsNCiAgICByZXR1cm4gMDsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIFByb2Nlc3MtSUQNCiAqLw0KaW50IF9nZXRwaWQodm9pZCkNCnsNCiAgICByZXR1cm4gMTsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIFF1ZXJ5IHdoZXRoZXIgb3V0cHV0IHN0cmVhbSBpcyBhIHRlcm1pbmFsLg0KICovDQppbnQgX2lzYXR0eShpbnQgZmlsZSkNCnsNCiAgICByZXR1cm4gMTsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIFNlbmQgYSBzaWduYWwuDQogKi8NCmludCBfa2lsbChpbnQgcGlkLCBpbnQgc2lnKQ0Kew0KICAgIGVycm5vID0gRUlOVkFMOw0KICAgIHJldHVybiAtMTsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIEVzdGFibGlzaCBhIG5ldyBuYW1lIGZvciBhbiBleGlzdGluZyBmaWxlLg0KICovDQppbnQgX2xpbmsoY2hhciAqb2xkLCBjaGFyICpuZXcpDQp7DQogICAgZXJybm8gPSBFTUxJTks7DQogICAgcmV0dXJuIC0xOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogU2V0IHBvc2l0aW9uIGluIGEgZmlsZS4NCiAqLw0KaW50IF9sc2VlayhpbnQgZmlsZSwgaW50IHB0ciwgaW50IGRpcikNCnsNCiAgICByZXR1cm4gMDsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIE9wZW4gYSBmaWxlLg0KICovDQppbnQgX29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkNCnsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBSZWFkIGZyb20gYSBmaWxlLg0KICovDQppbnQgX3JlYWQoaW50IGZpbGUsIGNoYXIgKnB0ciwgaW50IGxlbikNCnsNCiAgICByZXR1cm4gMDsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIEluY3JlYXNlIHByb2dyYW0gZGF0YSBzcGFjZS4gQXMgbWFsbG9jIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBkZXBlbmQgb24gdGhpcywNCiAqIGl0IGlzIHVzZWZ1bCB0byBoYXZlIGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbi4gVGhlIGZvbGxvd2luZyBzdWZmaWNlcyBmb3IgYQ0KICogc3RhbmRhbG9uZSBzeXN0ZW07IGl0IGV4cGxvaXRzIHRoZSBzeW1ib2wgX2VuZCBhdXRvbWF0aWNhbGx5IGRlZmluZWQgYnkgdGhlDQogKiBHTlUgbGlua2VyLiANCiAqLw0KY2FkZHJfdCBfc2JyayhpbnQgaW5jcikNCnsNCiAgICBleHRlcm4gY2hhciBfZW5kOwkJLyogRGVmaW5lZCBieSB0aGUgbGlua2VyICovDQogICAgc3RhdGljIGNoYXIgKmhlYXBfZW5kOw0KICAgIGNoYXIgKnByZXZfaGVhcF9lbmQ7DQogICAgY2hhciAqIHN0YWNrX3B0cjsNCiAgICANCiAgICBpZiAoaGVhcF9lbmQgPT0gMCkNCiAgICB7DQogICAgICBoZWFwX2VuZCA9ICZfZW5kOw0KICAgIH0NCiAgICANCiAgICBwcmV2X2hlYXBfZW5kID0gaGVhcF9lbmQ7DQogICAgYXNtIHZvbGF0aWxlICgiTVJTICUwLCBtc3AiIDogIj1yIiAoc3RhY2tfcHRyKSApOw0KICAgIGlmIChoZWFwX2VuZCArIGluY3IgPiBzdGFja19wdHIpDQogICAgew0KICAgICAgd3JpdGUgKDEsICJIZWFwIGFuZCBzdGFjayBjb2xsaXNpb25cbiIsIDI1KTsNCiAgICAgIGFib3J0ICgpOw0KICAgIH0NCiAgDQogICAgaGVhcF9lbmQgKz0gaW5jcjsNCiAgICByZXR1cm4gKGNhZGRyX3QpIHByZXZfaGVhcF9lbmQ7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBTdGF0dXMgb2YgYSBmaWxlIChieSBuYW1lKS4NCiAqLw0KaW50IF9zdGF0KGNoYXIgKmZpbGUsIHN0cnVjdCBzdGF0ICpzdCkNCnsNCiAgICBzdC0+c3RfbW9kZSA9IFNfSUZDSFI7DQogICAgcmV0dXJuIDA7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBUaW1pbmcgaW5mb3JtYXRpb24gZm9yIGN1cnJlbnQgcHJvY2Vzcy4NCiAqLw0KaW50IF90aW1lcyhzdHJ1Y3QgdG1zICpidWYpDQp7DQogICAgcmV0dXJuIC0xOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogUmVtb3ZlIGEgZmlsZSdzIGRpcmVjdG9yeSBlbnRyeS4NCiAqLw0KaW50IF91bmxpbmsoY2hhciAqbmFtZSkNCnsNCiAgICBlcnJubyA9IEVOT0VOVDsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBXYWl0IGZvciBhIGNoaWxkIHByb2Nlc3MuDQogKi8NCmludCBfd2FpdChpbnQgKnN0YXR1cykNCnsNCiAgICBlcnJubyA9IEVDSElMRDsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBXcml0ZSB0byBhIGZpbGUuIGxpYmMgc3Vicm91dGluZXMgd2lsbCB1c2UgdGhpcyBzeXN0ZW0gcm91dGluZSBmb3Igb3V0cHV0IHRvDQogKiBhbGwgZmlsZXMsIGluY2x1ZGluZyBzdGRvdXSXc28gaWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgYW55IG91dHB1dCwgZm9yDQogKiBleGFtcGxlIHRvIGEgc2VyaWFsIHBvcnQgZm9yIGRlYnVnZ2luZywgeW91IHNob3VsZCBtYWtlIHlvdXIgbWluaW1hbCB3cml0ZQ0KICogY2FwYWJsZSBvZiBkb2luZyB0aGlzLg0KICovDQppbnQgX3dyaXRlX3IoIHZvaWQgKiByZWVudCwgaW50IGZpbGUsIGNoYXIgKiBwdHIsIGludCBsZW4gKQ0Kew0KI2lmZGVmIEFDVEVMX1NURElPX1RIUlVfVUFSVA0KCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkgKiBJbml0aWFsaXplIHRoZSBVQVJUIGRyaXZlciBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzDQoJICogY2FsbGVkLg0KCSAqLw0KCWlmICggIWdfc3RkaW9fdWFydF9pbml0X2RvbmUgKQ0KCXsNCgkJTVNTX1VBUlRfaW5pdCggJmdfbXNzX3VhcnQwLCBBQ1RFTF9TVERJT19CQVVEX1JBVEUsIChNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSkpOw0KCQlnX3N0ZGlvX3VhcnRfaW5pdF9kb25lID0gMTsNCgl9DQoJDQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCSAqIE91dHB1dCB0ZXh0IHRvIHRoZSBVQVJULg0KCSAqLw0KCU1TU19VQVJUX3BvbGxlZF90eCggJmdfbXNzX3VhcnQwLCAodWludDhfdCAqKXB0ciwgbGVuICk7DQoJDQoJcmV0dXJuIGxlbjsNCiNlbHNlCS8qIEFDVEVMX1NURElPX1RIUlVfVUFSVCAqLw0KCXJldHVybiAwOw0KI2VuZGlmCS8qIEFDVEVMX1NURElPX1RIUlVfVUFSVCAqLw0KfQ0KDQoNCg==