LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwOS0yMDEzIE1pY3Jvc2VtaSBTb0MgUHJvZHVjdHMgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogDQogKiBTdHVicyBmb3IgTmV3bGliIHN5c3RlbSBjYWxscy4NCiAqICANCiAqIFNWTiAkUmV2aXNpb246IDUyNjkgJA0KICogU1ZOICREYXRlOiAyMDEzLTAzLTIxIDIwOjUzOjM4ICswMDAwIChUaHUsIDIxIE1hciAyMDEzKSAkDQogKi8NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzeXMvdW5pc3RkLmg+DQojaW5jbHVkZSA8c3lzL3N0YXQuaD4NCiNpbmNsdWRlIDxzeXMvdGltZXMuaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogUmVkaXJlY3Rpb24gb2Ygc3RhbmRhcmQgb3V0cHV0IHRvIGEgU21hcnRGdXNpb24yIE1TUyBVQVJULg0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHJlZGlyZWN0aW9uIG9mIHRoZSBvdXRwdXQgb2YgcHJpbnRmKCkgdG8gYQ0KICogVUFSVCBpcyBwcm92aWRlZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZS4gVGhpcyByZWRpcmVjdGlvbiBpcyBlbmFibGVkIGJ5DQogKiBhZGRpbmcgdGhlIHN5bWJvbC9kZWZpbmUgTUlDUk9TRU1JX1NURElPX1RIUlVfTU1VQVJUMCBvcg0KICogTUlDUk9TRU1JX1NURElPX1RIUlVfTU1VQVJUMCB0byB5b3VyIHByb2plY3Qgc2V0dGluZ3MgYW5kIHNwZWNpZnlpbmcgdGhlIGJhdWQNCiAqIHJhdGUgdXNpbmcgdGhlIE1JQ1JPU0VNSV9TVERJT19CQVVEX1JBVEUgZGVmaW5lLg0KICovDQojaWZkZWYgTUlDUk9TRU1JX1NURElPX1RIUlVfTU1VQVJUMA0KI2lmbmRlZiBNSUNST1NFTUlfU1RESU9fVEhSVV9VQVJUDQojZGVmaW5lIE1JQ1JPU0VNSV9TVERJT19USFJVX1VBUlQNCiNlbmRpZg0KI2VuZGlmICAvKiBNSUNST1NFTUlfU1RESU9fVEhSVV9NTVVBUlQwICovDQoNCiNpZmRlZiBNSUNST1NFTUlfU1RESU9fVEhSVV9NTVVBUlQxDQojaWZuZGVmIE1JQ1JPU0VNSV9TVERJT19USFJVX1VBUlQNCiNkZWZpbmUgTUlDUk9TRU1JX1NURElPX1RIUlVfVUFSVA0KI2VuZGlmDQojZW5kaWYgIC8qIE1JQ1JPU0VNSV9TVERJT19USFJVX01NVUFSVDEgKi8NCg0KLyoNCiAqIFNlbGVjdCB3aGljaCBNTVVBUlQgd2lsbCBiZSB1c2VkIGZvciBzdGRpbyBhbmQgd2hhdCBiYXVkIHJhdGUgd2lsbCBiZSB1c2VkLg0KICogRGVmYXVsdCB0byA1NzYwMCBiYXVkIGlmIG5vIGJhdWQgcmF0ZSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlDQogKiBNSUNST1NFTUlfU1RESU9fQkFVRF9SQVRFICNkZWZpbmUuDQogKi8gDQojaWZkZWYgTUlDUk9TRU1JX1NURElPX1RIUlVfVUFSVA0KI2luY2x1ZGUgIi4uLy4uL2RyaXZlcnMvbXNzX3VhcnQvbXNzX3VhcnQuaCINCg0KI2lmbmRlZiBNSUNST1NFTUlfU1RESU9fQkFVRF9SQVRFDQojZGVmaW5lIE1JQ1JPU0VNSV9TVERJT19CQVVEX1JBVEUgIE1TU19VQVJUXzU3NjAwX0JBVUQNCiNlbmRpZg0KDQojaWZkZWYgTUlDUk9TRU1JX1NURElPX1RIUlVfTU1VQVJUMA0Kc3RhdGljIG1zc191YXJ0X2luc3RhbmNlX3QgKiBjb25zdCBncF9teV91YXJ0ID0gJmdfbXNzX3VhcnQwOw0KI2Vsc2UNCnN0YXRpYyBtc3NfdWFydF9pbnN0YW5jZV90ICogY29uc3QgZ3BfbXlfdWFydCA9ICZnX21zc191YXJ0MTsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogR2xvYmFsIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBpZiB0aGUgVUFSVCBkcml2ZXIgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQuDQogKi8NCnN0YXRpYyBpbnQgZ19zdGRpb191YXJ0X2luaXRfZG9uZSA9IDA7DQoNCiNlbmRpZiAvKiBNSUNST1NFTUlfU1RESU9fVEhSVV9VQVJUICovDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMuDQogKiBBIHBvaW50ZXIgdG8gYSBsaXN0IG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgdGhlaXIgdmFsdWVzLiBGb3IgYSBtaW5pbWFsDQogKiBlbnZpcm9ubWVudCwgdGhpcyBlbXB0eSBsaXN0IGlzIGFkZXF1YXRlOg0KICovDQpjaGFyICpfX2VudlsxXSA9IHsgMCB9Ow0KY2hhciAqKmVudmlyb24gPSBfX2VudjsNCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIENsb3NlIGEgZmlsZS4NCiAqLw0KaW50IF9jbG9zZShpbnQgZmlsZSkNCnsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBUcmFuc2ZlciBjb250cm9sIHRvIGEgbmV3IHByb2Nlc3MuDQogKi8NCmludCBfZXhlY3ZlKGNoYXIgKm5hbWUsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52KQ0Kew0KICAgIGVycm5vID0gRU5PTUVNOw0KICAgIHJldHVybiAtMTsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIEV4aXQgYSBwcm9ncmFtIHdpdGhvdXQgY2xlYW5pbmcgdXAgZmlsZXMuDQogKi8NCnZvaWQgX2V4aXQoIGludCBjb2RlICkNCnsNCiAgICAvKiBTaG91bGQgd2UgZm9yY2UgYSBzeXN0ZW0gcmVzZXQ/ICovDQogICAgd2hpbGUoIDEgKQ0KICAgIHsNCiAgICAgICAgOw0KICAgIH0NCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIENyZWF0ZSBhIG5ldyBwcm9jZXNzLg0KICovDQppbnQgX2Zvcmsodm9pZCkNCnsNCiAgICBlcnJubyA9IEVBR0FJTjsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBTdGF0dXMgb2YgYW4gb3BlbiBmaWxlLg0KICovDQppbnQgX2ZzdGF0KGludCBmaWxlLCBzdHJ1Y3Qgc3RhdCAqc3QpDQp7DQogICAgc3QtPnN0X21vZGUgPSBTX0lGQ0hSOw0KICAgIHJldHVybiAwOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogUHJvY2Vzcy1JRA0KICovDQppbnQgX2dldHBpZCh2b2lkKQ0Kew0KICAgIHJldHVybiAxOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogUXVlcnkgd2hldGhlciBvdXRwdXQgc3RyZWFtIGlzIGEgdGVybWluYWwuDQogKi8NCmludCBfaXNhdHR5KGludCBmaWxlKQ0Kew0KICAgIHJldHVybiAxOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogU2VuZCBhIHNpZ25hbC4NCiAqLw0KaW50IF9raWxsKGludCBwaWQsIGludCBzaWcpDQp7DQogICAgZXJybm8gPSBFSU5WQUw7DQogICAgcmV0dXJuIC0xOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogRXN0YWJsaXNoIGEgbmV3IG5hbWUgZm9yIGFuIGV4aXN0aW5nIGZpbGUuDQogKi8NCmludCBfbGluayhjaGFyICpvbGQsIGNoYXIgKm5ldykNCnsNCiAgICBlcnJubyA9IEVNTElOSzsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBTZXQgcG9zaXRpb24gaW4gYSBmaWxlLg0KICovDQppbnQgX2xzZWVrKGludCBmaWxlLCBpbnQgcHRyLCBpbnQgZGlyKQ0Kew0KICAgIHJldHVybiAwOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogT3BlbiBhIGZpbGUuDQogKi8NCmludCBfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQ0Kew0KICAgIHJldHVybiAtMTsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIFJlYWQgZnJvbSBhIGZpbGUuDQogKi8NCmludCBfcmVhZChpbnQgZmlsZSwgY2hhciAqcHRyLCBpbnQgbGVuKQ0Kew0KICAgIHJldHVybiAwOw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogV3JpdGUgdG8gYSBmaWxlLiBsaWJjIHN1YnJvdXRpbmVzIHdpbGwgdXNlIHRoaXMgc3lzdGVtIHJvdXRpbmUgZm9yIG91dHB1dCB0bw0KICogYWxsIGZpbGVzLCBpbmNsdWRpbmcgc3Rkb3V0l3NvIGlmIHlvdSBuZWVkIHRvIGdlbmVyYXRlIGFueSBvdXRwdXQsIGZvcg0KICogZXhhbXBsZSB0byBhIHNlcmlhbCBwb3J0IGZvciBkZWJ1Z2dpbmcsIHlvdSBzaG91bGQgbWFrZSB5b3VyIG1pbmltYWwgd3JpdGUNCiAqIGNhcGFibGUgb2YgZG9pbmcgdGhpcy4NCiAqLw0KaW50IF93cml0ZV9yKCB2b2lkICogcmVlbnQsIGludCBmaWxlLCBjaGFyICogcHRyLCBpbnQgbGVuICkNCnsNCiNpZmRlZiBNSUNST1NFTUlfU1RESU9fVEhSVV9VQVJUDQogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAqIEluaXRpYWxpemUgdGhlIFVBUlQgZHJpdmVyIGlmIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMNCiAgICAgKiBjYWxsZWQuDQogICAgICovDQogICAgaWYoIWdfc3RkaW9fdWFydF9pbml0X2RvbmUpDQogICAgew0KICAgICAgICBNU1NfVUFSVF9pbml0KGdwX215X3VhcnQsDQogICAgICAgICAgICAgICAgICAgICAgTUlDUk9TRU1JX1NURElPX0JBVURfUkFURSwNCiAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSk7DQogICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGdfc3RkaW9fdWFydF9pbml0X2RvbmUgPSAxOw0KICAgIH0NCiAgICANCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICogT3V0cHV0IHRleHQgdG8gdGhlIFVBUlQuDQogICAgICovDQogICAgTVNTX1VBUlRfcG9sbGVkX3R4KGdwX215X3VhcnQsICh1aW50OF90ICopcHRyLCBsZW4pOw0KICAgIA0KICAgIHJldHVybiBsZW47DQojZWxzZSAgIC8qIE1JQ1JPU0VNSV9TVERJT19USFJVX1VBUlQgKi8NCiAgICByZXR1cm4gMDsNCiNlbmRpZiAgLyogTUlDUk9TRU1JX1NURElPX1RIUlVfVUFSVCAqLw0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogSW5jcmVhc2UgcHJvZ3JhbSBkYXRhIHNwYWNlLiBBcyBtYWxsb2MgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGRlcGVuZCBvbiB0aGlzLA0KICogaXQgaXMgdXNlZnVsIHRvIGhhdmUgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uLiBUaGUgZm9sbG93aW5nIHN1ZmZpY2VzIGZvciBhDQogKiBzdGFuZGFsb25lIHN5c3RlbTsgaXQgZXhwbG9pdHMgdGhlIHN5bWJvbCBfZW5kIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCBieSB0aGUNCiAqIEdOVSBsaW5rZXIuIA0KICovDQpjYWRkcl90IF9zYnJrKGludCBpbmNyKQ0Kew0KICAgIGV4dGVybiBjaGFyIF9lbmQ7ICAgICAgICAvKiBEZWZpbmVkIGJ5IHRoZSBsaW5rZXIgKi8NCiAgICBzdGF0aWMgY2hhciAqaGVhcF9lbmQ7DQogICAgY2hhciAqcHJldl9oZWFwX2VuZDsNCiAgICBjaGFyICogc3RhY2tfcHRyOw0KICAgIA0KICAgIGlmIChoZWFwX2VuZCA9PSAwKQ0KICAgIHsNCiAgICAgIGhlYXBfZW5kID0gJl9lbmQ7DQogICAgfQ0KICAgIA0KICAgIHByZXZfaGVhcF9lbmQgPSBoZWFwX2VuZDsNCiAgICBhc20gdm9sYXRpbGUgKCJNUlMgJTAsIG1zcCIgOiAiPXIiIChzdGFja19wdHIpICk7DQogICAgaWYgKGhlYXBfZW5kICsgaW5jciA+IHN0YWNrX3B0cikNCiAgICB7DQogICAgICBfd3JpdGVfciAoKHZvaWQgKikwLCAxLCAiSGVhcCBhbmQgc3RhY2sgY29sbGlzaW9uXG4iLCAyNSk7DQogICAgICBfZXhpdCAoMSk7DQogICAgfQ0KICANCiAgICBoZWFwX2VuZCArPSBpbmNyOw0KICAgIHJldHVybiAoY2FkZHJfdCkgcHJldl9oZWFwX2VuZDsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIFN0YXR1cyBvZiBhIGZpbGUgKGJ5IG5hbWUpLg0KICovDQppbnQgX3N0YXQoY2hhciAqZmlsZSwgc3RydWN0IHN0YXQgKnN0KQ0Kew0KICAgIHN0LT5zdF9tb2RlID0gU19JRkNIUjsNCiAgICByZXR1cm4gMDsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIFRpbWluZyBpbmZvcm1hdGlvbiBmb3IgY3VycmVudCBwcm9jZXNzLg0KICovDQppbnQgX3RpbWVzKHN0cnVjdCB0bXMgKmJ1ZikNCnsNCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBSZW1vdmUgYSBmaWxlJ3MgZGlyZWN0b3J5IGVudHJ5Lg0KICovDQppbnQgX3VubGluayhjaGFyICpuYW1lKQ0Kew0KICAgIGVycm5vID0gRU5PRU5UOw0KICAgIHJldHVybiAtMTsNCn0NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqIFdhaXQgZm9yIGEgY2hpbGQgcHJvY2Vzcy4NCiAqLw0KaW50IF93YWl0KGludCAqc3RhdHVzKQ0Kew0KICAgIGVycm5vID0gRUNISUxEOw0KICAgIHJldHVybiAtMTsNCn0NCg0KDQoNCg==